From 40cf66a730d4328898951127b2d0cf010577cc0d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Sep 2021 20:35:05 +0100 Subject: [PATCH 0001/1858] Checking in work so far on a 1.13 blockstate deserializer (incomplete, but have at it). --- .../BlockStateDeserializeException.php | 28 + .../blockstate/BlockStateDeserializerR13.php | 1484 +++++++++++++++++ .../bedrock/blockstate/BlockStateNamesR13.php | 131 ++ .../bedrock/blockstate/BlockStateReader.php | 271 +++ .../blockstate/BlockStateStringValuesR13.php | 269 +++ 5 files changed, 2183 insertions(+) create mode 100644 src/data/bedrock/blockstate/BlockStateDeserializeException.php create mode 100644 src/data/bedrock/blockstate/BlockStateDeserializerR13.php create mode 100644 src/data/bedrock/blockstate/BlockStateNamesR13.php create mode 100644 src/data/bedrock/blockstate/BlockStateReader.php create mode 100644 src/data/bedrock/blockstate/BlockStateStringValuesR13.php diff --git a/src/data/bedrock/blockstate/BlockStateDeserializeException.php b/src/data/bedrock/blockstate/BlockStateDeserializeException.php new file mode 100644 index 0000000000..03c3b76502 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateDeserializeException.php @@ -0,0 +1,28 @@ + + */ + private array $deserializeFuncs = []; + + /** @phpstan-param \Closure(BlockStateReader) : Block $c */ + private function mapId(string $id, \Closure $c) : void{ + if(array_key_exists($id, $this->deserializeFuncs)){ + throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); + } + $this->deserializeFuncs[$id] = $c; + } + + /** @phpstan-param \Closure(BlockStateReader) : Block $c */ + private function mapVanilla(string $minecraftId, \Closure $c) : void{ + $this->mapId("minecraft:$minecraftId", $c); + } + /** @throws BlockStateDeserializeException */ + private function decodeButton(Button $block, BlockStateReader $in) : Button{ + return $block + ->setFacing($in->readFacingDirection()) + ->setPressed($in->readBool(BlockStateNamesR13::BUTTON_PRESSED_BIT)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeComparator(RedstoneComparator $block, BlockStateReader $in) : RedstoneComparator{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setPowered($in->readBool(BlockStateNamesR13::OUTPUT_LIT_BIT)) + ->setSubtractMode($in->readBool(BlockStateNamesR13::OUTPUT_SUBTRACT_BIT)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeCrops(Crops $block, BlockStateReader $in) : Crops{ + return $block->setAge($in->readBoundedInt(BlockStateNamesR13::GROWTH, 0, 7)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeDoor(Door $block, BlockStateReader $in) : Door{ + //TODO: check if these need any special treatment to get the appropriate data to both halves of the door + return $block + ->setTop($in->readBool(BlockStateNamesR13::UPPER_BLOCK_BIT)) + ->setFacing(Facing::rotateY($in->readLegacyHorizontalFacing(), false)) + ->setHingeRight($in->readBool(BlockStateNamesR13::DOOR_HINGE_BIT)) + ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeFenceGate(FenceGate $block, BlockStateReader $in) : FenceGate{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setInWall($in->readBool(BlockStateNamesR13::IN_WALL_BIT)) + ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeFloorCoralFan(BlockStateReader $in) : FloorCoralFan{ + return VanillaBlocks::CORAL_FAN() + ->setCoralType($in->readCoralType()) + ->setAxis(match($in->readBoundedInt(BlockStateNamesR13::CORAL_FAN_DIRECTION, 0, 1)){ + 0 => Axis::X, + 1 => Axis::Z, + default => throw new AssumptionFailedError("readBoundedInt() should have prevented this"), + }); + } + + /** @throws BlockStateDeserializeException */ + private function decodeGlazedTerracotta(GlazedTerracotta $block, BlockStateReader $in) : GlazedTerracotta{ + return $block->setFacing($in->readHorizontalFacing()); + } + + /** @throws BlockStateDeserializeException */ + private function decodeLiquid(Liquid $block, BlockStateReader $in, bool $still) : Liquid{ + $fluidHeightState = $in->readBoundedInt(BlockStateNamesR13::LIQUID_DEPTH, 0, 15); + return $block + ->setDecay($fluidHeightState & 0x7) + ->setFalling(($fluidHeightState & 0x1) !== 0) + ->setStill($still); + } + + private function decodeFlowingLiquid(Liquid $block, BlockStateReader $in) : Liquid{ + return $this->decodeLiquid($block, $in, false); + } + + private function decodeStillLiquid(Liquid $block, BlockStateReader $in) : Liquid{ + return $this->decodeLiquid($block, $in, true); + } + + /** @throws BlockStateDeserializeException */ + private function decodeMushroomBlock(RedMushroomBlock $block, BlockStateReader $in) : Block{ + switch($type = $in->readBoundedInt(BlockStateNamesR13::HUGE_MUSHROOM_BITS, 0, 15)){ + case BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM: return VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(); + case BlockLegacyMetadata::MUSHROOM_BLOCK_STEM: return VanillaBlocks::MUSHROOM_STEM(); + default: + //invalid types get left as default + $type = MushroomBlockTypeIdMap::getInstance()->fromId($type); + return $type !== null ? $block->setMushroomBlockType($type) : $block; + } + } + + /** @throws BlockStateDeserializeException */ + private function decodeRepeater(RedstoneRepeater $block, BlockStateReader $in) : RedstoneRepeater{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setDelay($in->readBoundedInt(BlockStateNamesR13::REPEATER_DELAY, 0, 3) + 1); + } + + /** @throws BlockStateDeserializeException */ + private function decodeSimplePressurePlate(SimplePressurePlate $block, BlockStateReader $in) : SimplePressurePlate{ + //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? + //best to keep this separate from weighted plates anyway... + return $block->setPressed($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15) !== 0); + } + + /** @throws BlockStateDeserializeException */ + private function decodeStairs(Stair $block, BlockStateReader $in) : Stair{ + return $block + ->setUpsideDown($in->readBool(BlockStateNamesR13::UPSIDE_DOWN_BIT)) + ->setFacing($in->readWeirdoHorizontalFacing()); + } + + /** @throws BlockStateDeserializeException */ + private function decodeTrapdoor(Trapdoor $block, BlockStateReader $in) : Trapdoor{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setTop($in->readBool(BlockStateNamesR13::UPSIDE_DOWN_BIT)) + ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + private function decodeWall(Wall $block, BlockStateReader $in) : Wall{ + //TODO: our walls don't support the full range of needed states yet + return $block; + } + + /** @throws BlockStateDeserializeException */ + private function mapStoneSlab1Type(BlockStateReader $in) : Slab{ + //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood + return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE)){ + StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), + StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + private function mapStoneSlab2Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone + return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_2)){ + StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_2, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + private function mapStoneSlab3Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone + return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_3)){ + StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_3, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + private function mapStoneSlab4Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone + return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_4)){ + StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_4, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + private function mapWoodenSlabType(BlockStateReader $in) : Slab{ + // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + return match($type = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), + default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $type), + }; + } + + public function __construct(){ + $this->mapVanilla("acacia_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::ACACIA_BUTTON(), $in)); + $this->mapVanilla("acacia_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::ACACIA_DOOR(), $in)); + $this->mapVanilla("acacia_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::ACACIA_FENCE_GATE(), $in)); + $this->mapVanilla("acacia_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::ACACIA_PRESSURE_PLATE(), $in)); + $this->mapVanilla("acacia_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::ACACIA_STAIRS(), $in)); + $this->mapVanilla("acacia_standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACACIA_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("acacia_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::ACACIA_TRAPDOOR(), $in)); + $this->mapVanilla("acacia_wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACACIA_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("activator_rail", function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACTIVATOR_RAIL() + ->setPowered($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); + }); + $this->mapVanilla("air", fn() => VanillaBlocks::AIR()); + $this->mapVanilla("andesite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::ANDESITE_STAIRS(), $in)); + $this->mapVanilla("anvil", function(BlockStateReader $in) : Block{ + return VanillaBlocks::ANVIL() + ->setDamage(match($value = $in->readString(BlockStateNamesR13::DAMAGE)){ + StringValues::DAMAGE_UNDAMAGED => 0, + StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, + StringValues::DAMAGE_VERY_DAMAGED => 2, + StringValues::DAMAGE_BROKEN => 0, + default => throw $in->badValueException(BlockStateNamesR13::DAMAGE, $value), + }) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("bamboo", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BAMBOO() + ->setLeafSize(match($value = $in->readString(BlockStateNamesR13::BAMBOO_LEAF_SIZE)){ + StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, + default => throw $in->badValueException(BlockStateNamesR13::BAMBOO_LEAF_SIZE, $value), + }) + ->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)) + ->setThick(match($value = $in->readString(BlockStateNamesR13::BAMBOO_STALK_THICKNESS)){ + StringValues::BAMBOO_STALK_THICKNESS_THIN => false, + StringValues::BAMBOO_STALK_THICKNESS_THICK => true, + default => throw $in->badValueException(BlockStateNamesR13::BAMBOO_STALK_THICKNESS, $value), + }); + }); + $this->mapVanilla("bamboo_sapling", function(BlockStateReader $in) : Block{ + //TODO: sapling_type intentionally ignored (its presence is a bug) + return VanillaBlocks::BAMBOO_SAPLING()->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)); + }); + $this->mapVanilla("barrel", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BARREL() + ->setFacing($in->readFacingDirection()) + ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); + }); + $this->mapVanilla("barrier", fn() => VanillaBlocks::BARRIER()); + $this->mapVanilla("beacon", fn() => VanillaBlocks::BEACON()); + $this->mapVanilla("bed", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BED() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setHead($in->readBool(BlockStateNamesR13::HEAD_PIECE_BIT)) + ->setOccupied($in->readBool(BlockStateNamesR13::OCCUPIED_BIT)); + }); + $this->mapVanilla("bedrock", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BEDROCK() + ->setBurnsForever($in->readBool(BlockStateNamesR13::INFINIBURN_BIT)); + }); + $this->mapVanilla("beetroot", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::BEETROOTS(), $in)); + $this->mapVanilla("bell", function(BlockStateReader $in) : Block{ + //TODO: ignored toggle_bit (appears to be internally used in MCPE only, useless for us) + return VanillaBlocks::BELL() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setAttachmentType($in->readBellAttachmentType()); + }); + $this->mapVanilla("birch_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::BIRCH_BUTTON(), $in)); + $this->mapVanilla("birch_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::BIRCH_DOOR(), $in)); + $this->mapVanilla("birch_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::BIRCH_FENCE_GATE(), $in)); + $this->mapVanilla("birch_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::BIRCH_PRESSURE_PLATE(), $in)); + $this->mapVanilla("birch_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::BIRCH_STAIRS(), $in)); + $this->mapVanilla("birch_standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BIRCH_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("birch_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::BIRCH_TRAPDOOR(), $in)); + $this->mapVanilla("birch_wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BIRCH_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("black_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("blast_furnace", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BLAST_FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->mapVanilla("blue_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("blue_ice", fn() => VanillaBlocks::BLUE_ICE()); + $this->mapVanilla("bone_block", function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored "deprecated" blockstate (useless) + return VanillaBlocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("bookshelf", fn() => VanillaBlocks::BOOKSHELF()); + $this->mapVanilla("brewing_stand", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BREWING_STAND() + ->setSlot(BrewingStandSlot::EAST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_A_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_C_BIT)); + }); + $this->mapVanilla("brick_block", fn() => VanillaBlocks::BRICKS()); + $this->mapVanilla("brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::BRICK_STAIRS(), $in)); + $this->mapVanilla("brown_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("brown_mushroom", fn() => VanillaBlocks::BROWN_MUSHROOM()); + $this->mapVanilla("brown_mushroom_block", fn(BlockStateReader $in) => $this->decodeMushroomBlock(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), $in)); + $this->mapVanilla("cactus", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CACTUS() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); + }); + $this->mapVanilla("cake", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CAKE() + ->setBites($in->readBoundedInt(BlockStateNamesR13::BITE_COUNTER, 0, 6)); + }); + $this->mapVanilla("carpet", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CARPET() + ->setColor($in->readColor()); + }); + $this->mapVanilla("carrots", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::CARROTS(), $in)); + $this->mapVanilla("carved_pumpkin", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CARVED_PUMPKIN() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("chemical_heat", fn() => VanillaBlocks::CHEMICAL_HEAT()); + $this->mapVanilla("chemistry_table", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::CHEMISTRY_TABLE_TYPE)){ + StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), + StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), + StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), + StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), + default => throw $in->badValueException(BlockStateNamesR13::CHEMISTRY_TABLE_TYPE, $type), + })->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("chest", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("clay", fn() => VanillaBlocks::CLAY()); + $this->mapVanilla("coal_block", fn() => VanillaBlocks::COAL()); + $this->mapVanilla("coal_ore", fn() => VanillaBlocks::COAL_ORE()); + $this->mapVanilla("cobblestone", fn() => VanillaBlocks::COBBLESTONE()); + $this->mapVanilla("cobblestone_wall", fn(BlockStateReader $in) => $this->decodeWall(VanillaBlocks::COBBLESTONE_WALL(), $in)); + $this->mapVanilla("cocoa", function(BlockStateReader $in) : Block{ + return VanillaBlocks::COCOA_POD() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 2)) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("colored_torch_bp", function(BlockStateReader $in) : Block{ + return $in->readBool(BlockStateNamesR13::COLOR_BIT) ? + VanillaBlocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : + VanillaBlocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->mapVanilla("colored_torch_rg", function(BlockStateReader $in) : Block{ + return $in->readBool(BlockStateNamesR13::COLOR_BIT) ? + VanillaBlocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : + VanillaBlocks::RED_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->mapVanilla("concrete", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CONCRETE() + ->setColor($in->readColor()); + }); + $this->mapVanilla("concretePowder", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CONCRETE_POWDER() + ->setColor($in->readColor()); + }); + $this->mapVanilla("coral", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CORAL() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)); + }); + $this->mapVanilla("coral_block", function(BlockStateReader $in) : Block{ + return VanillaBlocks::CORAL_BLOCK() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)); + }); + $this->mapVanilla("coral_fan", fn(BlockStateReader $in) => $this->decodeFloorCoralFan($in)->setDead(false)); + $this->mapVanilla("coral_fan_dead", fn(BlockStateReader $in) => $this->decodeFloorCoralFan($in)->setDead(true)); + $this->mapVanilla("coral_fan_hang", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType($in->readBool(BlockStateNamesR13::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) + ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->mapVanilla("coral_fan_hang2", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType($in->readBool(BlockStateNamesR13::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE()) + ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->mapVanilla("coral_fan_hang3", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType(CoralType::HORN()) + ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->mapVanilla("crafting_table", fn() => VanillaBlocks::CRAFTING_TABLE()); + $this->mapVanilla("cyan_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("dark_oak_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::DARK_OAK_BUTTON(), $in)); + $this->mapVanilla("dark_oak_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::DARK_OAK_DOOR(), $in)); + $this->mapVanilla("dark_oak_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::DARK_OAK_FENCE_GATE(), $in)); + $this->mapVanilla("dark_oak_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), $in)); + $this->mapVanilla("dark_oak_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DARK_OAK_STAIRS(), $in)); + $this->mapVanilla("dark_oak_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::DARK_OAK_TRAPDOOR(), $in)); + $this->mapVanilla("dark_prismarine_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DARK_PRISMARINE_STAIRS(), $in)); + $this->mapVanilla("darkoak_standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DARK_OAK_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("darkoak_wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DARK_OAK_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("daylight_detector", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DAYLIGHT_SENSOR() + ->setInverted(false) + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); + }); + $this->mapVanilla("daylight_detector_inverted", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DAYLIGHT_SENSOR() + ->setInverted(true) + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); + }); + $this->mapVanilla("deadbush", fn() => VanillaBlocks::DEAD_BUSH()); + $this->mapVanilla("detector_rail", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DETECTOR_RAIL() + ->setActivated($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); + }); + $this->mapVanilla("diamond_block", fn() => VanillaBlocks::DIAMOND()); + $this->mapVanilla("diamond_ore", fn() => VanillaBlocks::DIAMOND_ORE()); + $this->mapVanilla("diorite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DIORITE_STAIRS(), $in)); + $this->mapVanilla("dirt", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DIRT() + ->setCoarse(match($value = $in->readString(BlockStateNamesR13::DIRT_TYPE)){ + StringValues::DIRT_TYPE_NORMAL => false, + StringValues::DIRT_TYPE_COARSE => true, + default => throw $in->badValueException(BlockStateNamesR13::DIRT_TYPE, $value), + }); + }); + $this->mapVanilla("double_plant", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::DOUBLE_PLANT_TYPE)){ + StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), + StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), + StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), + StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), + StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), + StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), + default => throw $in->badValueException(BlockStateNamesR13::DOUBLE_PLANT_TYPE, $type), + })->setTop($in->readBool(BlockStateNamesR13::UPPER_BLOCK_BIT)); + }); + $this->mapVanilla("double_stone_slab", function(BlockStateReader $in) : Block{ + return $this->mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapVanilla("double_stone_slab2", function(BlockStateReader $in) : Block{ + return $this->mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapVanilla("double_stone_slab3", function(BlockStateReader $in) : Block{ + return $this->mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapVanilla("double_stone_slab4", function(BlockStateReader $in) : Block{ + return $this->mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapVanilla("double_wooden_slab", function(BlockStateReader $in) : Block{ + return $this->mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapVanilla("dragon_egg", fn() => VanillaBlocks::DRAGON_EGG()); + $this->mapVanilla("dried_kelp_block", fn() => VanillaBlocks::DRIED_KELP()); + $this->mapVanilla("element_0", fn() => VanillaBlocks::ELEMENT_ZERO()); + $this->mapVanilla("element_1", fn() => VanillaBlocks::ELEMENT_HYDROGEN()); + $this->mapVanilla("element_10", fn() => VanillaBlocks::ELEMENT_NEON()); + $this->mapVanilla("element_100", fn() => VanillaBlocks::ELEMENT_FERMIUM()); + $this->mapVanilla("element_101", fn() => VanillaBlocks::ELEMENT_MENDELEVIUM()); + $this->mapVanilla("element_102", fn() => VanillaBlocks::ELEMENT_NOBELIUM()); + $this->mapVanilla("element_103", fn() => VanillaBlocks::ELEMENT_LAWRENCIUM()); + $this->mapVanilla("element_104", fn() => VanillaBlocks::ELEMENT_RUTHERFORDIUM()); + $this->mapVanilla("element_105", fn() => VanillaBlocks::ELEMENT_DUBNIUM()); + $this->mapVanilla("element_106", fn() => VanillaBlocks::ELEMENT_SEABORGIUM()); + $this->mapVanilla("element_107", fn() => VanillaBlocks::ELEMENT_BOHRIUM()); + $this->mapVanilla("element_108", fn() => VanillaBlocks::ELEMENT_HASSIUM()); + $this->mapVanilla("element_109", fn() => VanillaBlocks::ELEMENT_MEITNERIUM()); + $this->mapVanilla("element_11", fn() => VanillaBlocks::ELEMENT_SODIUM()); + $this->mapVanilla("element_110", fn() => VanillaBlocks::ELEMENT_DARMSTADTIUM()); + $this->mapVanilla("element_111", fn() => VanillaBlocks::ELEMENT_ROENTGENIUM()); + $this->mapVanilla("element_112", fn() => VanillaBlocks::ELEMENT_COPERNICIUM()); + $this->mapVanilla("element_113", fn() => VanillaBlocks::ELEMENT_NIHONIUM()); + $this->mapVanilla("element_114", fn() => VanillaBlocks::ELEMENT_FLEROVIUM()); + $this->mapVanilla("element_115", fn() => VanillaBlocks::ELEMENT_MOSCOVIUM()); + $this->mapVanilla("element_116", fn() => VanillaBlocks::ELEMENT_LIVERMORIUM()); + $this->mapVanilla("element_117", fn() => VanillaBlocks::ELEMENT_TENNESSINE()); + $this->mapVanilla("element_118", fn() => VanillaBlocks::ELEMENT_OGANESSON()); + $this->mapVanilla("element_12", fn() => VanillaBlocks::ELEMENT_MAGNESIUM()); + $this->mapVanilla("element_13", fn() => VanillaBlocks::ELEMENT_ALUMINUM()); + $this->mapVanilla("element_14", fn() => VanillaBlocks::ELEMENT_SILICON()); + $this->mapVanilla("element_15", fn() => VanillaBlocks::ELEMENT_PHOSPHORUS()); + $this->mapVanilla("element_16", fn() => VanillaBlocks::ELEMENT_SULFUR()); + $this->mapVanilla("element_17", fn() => VanillaBlocks::ELEMENT_CHLORINE()); + $this->mapVanilla("element_18", fn() => VanillaBlocks::ELEMENT_ARGON()); + $this->mapVanilla("element_19", fn() => VanillaBlocks::ELEMENT_POTASSIUM()); + $this->mapVanilla("element_2", fn() => VanillaBlocks::ELEMENT_HELIUM()); + $this->mapVanilla("element_20", fn() => VanillaBlocks::ELEMENT_CALCIUM()); + $this->mapVanilla("element_21", fn() => VanillaBlocks::ELEMENT_SCANDIUM()); + $this->mapVanilla("element_22", fn() => VanillaBlocks::ELEMENT_TITANIUM()); + $this->mapVanilla("element_23", fn() => VanillaBlocks::ELEMENT_VANADIUM()); + $this->mapVanilla("element_24", fn() => VanillaBlocks::ELEMENT_CHROMIUM()); + $this->mapVanilla("element_25", fn() => VanillaBlocks::ELEMENT_MANGANESE()); + $this->mapVanilla("element_26", fn() => VanillaBlocks::ELEMENT_IRON()); + $this->mapVanilla("element_27", fn() => VanillaBlocks::ELEMENT_COBALT()); + $this->mapVanilla("element_28", fn() => VanillaBlocks::ELEMENT_NICKEL()); + $this->mapVanilla("element_29", fn() => VanillaBlocks::ELEMENT_COPPER()); + $this->mapVanilla("element_3", fn() => VanillaBlocks::ELEMENT_LITHIUM()); + $this->mapVanilla("element_30", fn() => VanillaBlocks::ELEMENT_ZINC()); + $this->mapVanilla("element_31", fn() => VanillaBlocks::ELEMENT_GALLIUM()); + $this->mapVanilla("element_32", fn() => VanillaBlocks::ELEMENT_GERMANIUM()); + $this->mapVanilla("element_33", fn() => VanillaBlocks::ELEMENT_ARSENIC()); + $this->mapVanilla("element_34", fn() => VanillaBlocks::ELEMENT_SELENIUM()); + $this->mapVanilla("element_35", fn() => VanillaBlocks::ELEMENT_BROMINE()); + $this->mapVanilla("element_36", fn() => VanillaBlocks::ELEMENT_KRYPTON()); + $this->mapVanilla("element_37", fn() => VanillaBlocks::ELEMENT_RUBIDIUM()); + $this->mapVanilla("element_38", fn() => VanillaBlocks::ELEMENT_STRONTIUM()); + $this->mapVanilla("element_39", fn() => VanillaBlocks::ELEMENT_YTTRIUM()); + $this->mapVanilla("element_4", fn() => VanillaBlocks::ELEMENT_BERYLLIUM()); + $this->mapVanilla("element_40", fn() => VanillaBlocks::ELEMENT_ZIRCONIUM()); + $this->mapVanilla("element_41", fn() => VanillaBlocks::ELEMENT_NIOBIUM()); + $this->mapVanilla("element_42", fn() => VanillaBlocks::ELEMENT_MOLYBDENUM()); + $this->mapVanilla("element_43", fn() => VanillaBlocks::ELEMENT_TECHNETIUM()); + $this->mapVanilla("element_44", fn() => VanillaBlocks::ELEMENT_RUTHENIUM()); + $this->mapVanilla("element_45", fn() => VanillaBlocks::ELEMENT_RHODIUM()); + $this->mapVanilla("element_46", fn() => VanillaBlocks::ELEMENT_PALLADIUM()); + $this->mapVanilla("element_47", fn() => VanillaBlocks::ELEMENT_SILVER()); + $this->mapVanilla("element_48", fn() => VanillaBlocks::ELEMENT_CADMIUM()); + $this->mapVanilla("element_49", fn() => VanillaBlocks::ELEMENT_INDIUM()); + $this->mapVanilla("element_5", fn() => VanillaBlocks::ELEMENT_BORON()); + $this->mapVanilla("element_50", fn() => VanillaBlocks::ELEMENT_TIN()); + $this->mapVanilla("element_51", fn() => VanillaBlocks::ELEMENT_ANTIMONY()); + $this->mapVanilla("element_52", fn() => VanillaBlocks::ELEMENT_TELLURIUM()); + $this->mapVanilla("element_53", fn() => VanillaBlocks::ELEMENT_IODINE()); + $this->mapVanilla("element_54", fn() => VanillaBlocks::ELEMENT_XENON()); + $this->mapVanilla("element_55", fn() => VanillaBlocks::ELEMENT_CESIUM()); + $this->mapVanilla("element_56", fn() => VanillaBlocks::ELEMENT_BARIUM()); + $this->mapVanilla("element_57", fn() => VanillaBlocks::ELEMENT_LANTHANUM()); + $this->mapVanilla("element_58", fn() => VanillaBlocks::ELEMENT_CERIUM()); + $this->mapVanilla("element_59", fn() => VanillaBlocks::ELEMENT_PRASEODYMIUM()); + $this->mapVanilla("element_6", fn() => VanillaBlocks::ELEMENT_CARBON()); + $this->mapVanilla("element_60", fn() => VanillaBlocks::ELEMENT_NEODYMIUM()); + $this->mapVanilla("element_61", fn() => VanillaBlocks::ELEMENT_PROMETHIUM()); + $this->mapVanilla("element_62", fn() => VanillaBlocks::ELEMENT_SAMARIUM()); + $this->mapVanilla("element_63", fn() => VanillaBlocks::ELEMENT_EUROPIUM()); + $this->mapVanilla("element_64", fn() => VanillaBlocks::ELEMENT_GADOLINIUM()); + $this->mapVanilla("element_65", fn() => VanillaBlocks::ELEMENT_TERBIUM()); + $this->mapVanilla("element_66", fn() => VanillaBlocks::ELEMENT_DYSPROSIUM()); + $this->mapVanilla("element_67", fn() => VanillaBlocks::ELEMENT_HOLMIUM()); + $this->mapVanilla("element_68", fn() => VanillaBlocks::ELEMENT_ERBIUM()); + $this->mapVanilla("element_69", fn() => VanillaBlocks::ELEMENT_THULIUM()); + $this->mapVanilla("element_7", fn() => VanillaBlocks::ELEMENT_NITROGEN()); + $this->mapVanilla("element_70", fn() => VanillaBlocks::ELEMENT_YTTERBIUM()); + $this->mapVanilla("element_71", fn() => VanillaBlocks::ELEMENT_LUTETIUM()); + $this->mapVanilla("element_72", fn() => VanillaBlocks::ELEMENT_HAFNIUM()); + $this->mapVanilla("element_73", fn() => VanillaBlocks::ELEMENT_TANTALUM()); + $this->mapVanilla("element_74", fn() => VanillaBlocks::ELEMENT_TUNGSTEN()); + $this->mapVanilla("element_75", fn() => VanillaBlocks::ELEMENT_RHENIUM()); + $this->mapVanilla("element_76", fn() => VanillaBlocks::ELEMENT_OSMIUM()); + $this->mapVanilla("element_77", fn() => VanillaBlocks::ELEMENT_IRIDIUM()); + $this->mapVanilla("element_78", fn() => VanillaBlocks::ELEMENT_PLATINUM()); + $this->mapVanilla("element_79", fn() => VanillaBlocks::ELEMENT_GOLD()); + $this->mapVanilla("element_8", fn() => VanillaBlocks::ELEMENT_OXYGEN()); + $this->mapVanilla("element_80", fn() => VanillaBlocks::ELEMENT_MERCURY()); + $this->mapVanilla("element_81", fn() => VanillaBlocks::ELEMENT_THALLIUM()); + $this->mapVanilla("element_82", fn() => VanillaBlocks::ELEMENT_LEAD()); + $this->mapVanilla("element_83", fn() => VanillaBlocks::ELEMENT_BISMUTH()); + $this->mapVanilla("element_84", fn() => VanillaBlocks::ELEMENT_POLONIUM()); + $this->mapVanilla("element_85", fn() => VanillaBlocks::ELEMENT_ASTATINE()); + $this->mapVanilla("element_86", fn() => VanillaBlocks::ELEMENT_RADON()); + $this->mapVanilla("element_87", fn() => VanillaBlocks::ELEMENT_FRANCIUM()); + $this->mapVanilla("element_88", fn() => VanillaBlocks::ELEMENT_RADIUM()); + $this->mapVanilla("element_89", fn() => VanillaBlocks::ELEMENT_ACTINIUM()); + $this->mapVanilla("element_9", fn() => VanillaBlocks::ELEMENT_FLUORINE()); + $this->mapVanilla("element_90", fn() => VanillaBlocks::ELEMENT_THORIUM()); + $this->mapVanilla("element_91", fn() => VanillaBlocks::ELEMENT_PROTACTINIUM()); + $this->mapVanilla("element_92", fn() => VanillaBlocks::ELEMENT_URANIUM()); + $this->mapVanilla("element_93", fn() => VanillaBlocks::ELEMENT_NEPTUNIUM()); + $this->mapVanilla("element_94", fn() => VanillaBlocks::ELEMENT_PLUTONIUM()); + $this->mapVanilla("element_95", fn() => VanillaBlocks::ELEMENT_AMERICIUM()); + $this->mapVanilla("element_96", fn() => VanillaBlocks::ELEMENT_CURIUM()); + $this->mapVanilla("element_97", fn() => VanillaBlocks::ELEMENT_BERKELIUM()); + $this->mapVanilla("element_98", fn() => VanillaBlocks::ELEMENT_CALIFORNIUM()); + $this->mapVanilla("element_99", fn() => VanillaBlocks::ELEMENT_EINSTEINIUM()); + $this->mapVanilla("emerald_block", fn() => VanillaBlocks::EMERALD()); + $this->mapVanilla("emerald_ore", fn() => VanillaBlocks::EMERALD_ORE()); + $this->mapVanilla("enchanting_table", fn() => VanillaBlocks::ENCHANTING_TABLE()); + $this->mapVanilla("end_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::END_STONE_BRICK_STAIRS(), $in)); + $this->mapVanilla("end_bricks", fn() => VanillaBlocks::END_STONE_BRICKS()); + $this->mapVanilla("end_portal_frame", function(BlockStateReader $in) : Block{ + return VanillaBlocks::END_PORTAL_FRAME() + ->setEye($in->readBool(BlockStateNamesR13::END_PORTAL_EYE_BIT)) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("end_rod", function(BlockStateReader $in) : Block{ + return VanillaBlocks::END_ROD() + ->setFacing($in->readFacingDirection()); + }); + $this->mapVanilla("end_stone", fn() => VanillaBlocks::END_STONE()); + $this->mapVanilla("ender_chest", function(BlockStateReader $in) : Block{ + return VanillaBlocks::ENDER_CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("farmland", function(BlockStateReader $in) : Block{ + return VanillaBlocks::FARMLAND() + ->setWetness($in->readBoundedInt(BlockStateNamesR13::MOISTURIZED_AMOUNT, 0, 7)); + }); + $this->mapVanilla("fence", function(BlockStateReader $in) : Block{ + return match($woodName = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), + default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodName), + }; + }); + $this->mapVanilla("fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::OAK_FENCE_GATE(), $in)); + $this->mapVanilla("fire", function(BlockStateReader $in) : Block{ + return VanillaBlocks::FIRE() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); + }); + $this->mapVanilla("flower_pot", function() : Block{ + //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) + return VanillaBlocks::FLOWER_POT(); + }); + $this->mapVanilla("flowing_lava", fn(BlockStateReader $in) => $this->decodeFlowingLiquid(VanillaBlocks::LAVA(), $in)); + $this->mapVanilla("flowing_water", fn(BlockStateReader $in) => $this->decodeFlowingLiquid(VanillaBlocks::WATER(), $in)); + $this->mapVanilla("frame", function(BlockStateReader $in) : Block{ + //TODO: in R13 this can be any side, not just horizontal + return VanillaBlocks::ITEM_FRAME() + ->setFacing($in->readHorizontalFacing()) + ->setHasMap($in->readBool(BlockStateNamesR13::ITEM_FRAME_MAP_BIT)); + }); + $this->mapVanilla("frosted_ice", function(BlockStateReader $in) : Block{ + return VanillaBlocks::FROSTED_ICE() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 3)); + }); + $this->mapVanilla("furnace", function(BlockStateReader $in) : Block{ + return VanillaBlocks::FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->mapVanilla("glass", fn() => VanillaBlocks::GLASS()); + $this->mapVanilla("glass_pane", fn() => VanillaBlocks::GLASS_PANE()); + $this->mapVanilla("glowingobsidian", fn() => VanillaBlocks::GLOWING_OBSIDIAN()); + $this->mapVanilla("glowstone", fn() => VanillaBlocks::GLOWSTONE()); + $this->mapVanilla("gold_block", fn() => VanillaBlocks::GOLD()); + $this->mapVanilla("gold_ore", fn() => VanillaBlocks::GOLD_ORE()); + $this->mapVanilla("golden_rail", function(BlockStateReader $in) : Block{ + return VanillaBlocks::POWERED_RAIL() + ->setPowered($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); + }); + $this->mapVanilla("granite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::GRANITE_STAIRS(), $in)); + $this->mapVanilla("grass", fn() => VanillaBlocks::GRASS()); + $this->mapVanilla("grass_path", fn() => VanillaBlocks::GRASS_PATH()); + $this->mapVanilla("gravel", fn() => VanillaBlocks::GRAVEL()); + $this->mapVanilla("gray_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("green_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("hard_glass", fn() => VanillaBlocks::HARDENED_GLASS()); + $this->mapVanilla("hard_glass_pane", fn() => VanillaBlocks::HARDENED_GLASS_PANE()); + $this->mapVanilla("hard_stained_glass", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_HARDENED_GLASS() + ->setColor($in->readColor()); + }); + $this->mapVanilla("hard_stained_glass_pane", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_HARDENED_GLASS_PANE() + ->setColor($in->readColor()); + }); + $this->mapVanilla("hardened_clay", fn() => VanillaBlocks::HARDENED_CLAY()); + $this->mapVanilla("hay_block", function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored "deprecated" blockstate (useless) + return VanillaBlocks::HAY_BALE()->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("heavy_weighted_pressure_plate", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); + }); + $this->mapVanilla("hopper", function(BlockStateReader $in) : Block{ + return VanillaBlocks::HOPPER() + ->setFacing($in->readFacingWithoutUp()) + ->setPowered($in->readBool(BlockStateNamesR13::TOGGLE_BIT)); + }); + $this->mapVanilla("ice", fn() => VanillaBlocks::ICE()); + $this->mapVanilla("info_update", fn() => VanillaBlocks::INFO_UPDATE()); + $this->mapVanilla("info_update2", fn() => VanillaBlocks::INFO_UPDATE2()); + $this->mapVanilla("invisibleBedrock", fn() => VanillaBlocks::INVISIBLE_BEDROCK()); + $this->mapVanilla("iron_bars", fn() => VanillaBlocks::IRON_BARS()); + $this->mapVanilla("iron_block", fn() => VanillaBlocks::IRON()); + $this->mapVanilla("iron_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::IRON_DOOR(), $in)); + $this->mapVanilla("iron_ore", fn() => VanillaBlocks::IRON_ORE()); + $this->mapVanilla("iron_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::IRON_TRAPDOOR(), $in)); + $this->mapVanilla("jukebox", fn() => VanillaBlocks::JUKEBOX()); + $this->mapVanilla("jungle_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::JUNGLE_BUTTON(), $in)); + $this->mapVanilla("jungle_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::JUNGLE_DOOR(), $in)); + $this->mapVanilla("jungle_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::JUNGLE_FENCE_GATE(), $in)); + $this->mapVanilla("jungle_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), $in)); + $this->mapVanilla("jungle_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::JUNGLE_STAIRS(), $in)); + $this->mapVanilla("jungle_standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::JUNGLE_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("jungle_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::JUNGLE_TRAPDOOR(), $in)); + $this->mapVanilla("jungle_wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::JUNGLE_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("ladder", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LADDER() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("lantern", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LANTERN() + ->setHanging($in->readBool(BlockStateNamesR13::HANGING)); + }); + $this->mapVanilla("lapis_block", fn() => VanillaBlocks::LAPIS_LAZULI()); + $this->mapVanilla("lapis_ore", fn() => VanillaBlocks::LAPIS_LAZULI_ORE()); + $this->mapVanilla("lava", fn(BlockStateReader $in) => $this->decodeStillLiquid(VanillaBlocks::LAVA(), $in)); + $this->mapVanilla("leaves", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::OLD_LEAF_TYPE)){ + StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), + StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), + StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), + StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), + default => throw $in->badValueException(BlockStateNamesR13::OLD_LEAF_TYPE, $type), + }) + ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); + }); + $this->mapVanilla("leaves2", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::NEW_LEAF_TYPE)){ + StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), + StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), + default => throw $in->badValueException(BlockStateNamesR13::NEW_LEAF_TYPE, $type), + }) + ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); + }); + $this->mapVanilla("light_blue_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("light_weighted_pressure_plate", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); + }); + $this->mapVanilla("lime_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("lit_blast_furnace", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BLAST_FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->mapVanilla("lit_furnace", function(BlockStateReader $in) : Block{ + return VanillaBlocks::FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->mapVanilla("lit_pumpkin", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LIT_PUMPKIN() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("lit_redstone_lamp", function() : Block{ + return VanillaBlocks::REDSTONE_LAMP() + ->setPowered(true); + }); + $this->mapVanilla("lit_redstone_ore", function() : Block{ + return VanillaBlocks::REDSTONE_ORE() + ->setLit(true); + }); + $this->mapVanilla("lit_smoker", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SMOKER() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->mapVanilla("log", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::OLD_LOG_TYPE)){ + StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), + StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), + StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), + StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), + default => throw $in->badValueException(BlockStateNamesR13::OLD_LOG_TYPE, $type), + }) + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("log2", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::NEW_LOG_TYPE)){ + StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), + StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), + default => throw $in->badValueException(BlockStateNamesR13::NEW_LOG_TYPE, $type), + }) + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("loom", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LOOM() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->mapVanilla("magenta_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("magma", fn() => VanillaBlocks::MAGMA()); + $this->mapVanilla("melon_block", fn() => VanillaBlocks::MELON()); + $this->mapVanilla("melon_stem", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::MELON_STEM(), $in)); + $this->mapVanilla("mob_spawner", fn() => VanillaBlocks::MONSTER_SPAWNER()); + $this->mapVanilla("monster_egg", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::MONSTER_EGG_STONE_TYPE)){ + StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), + StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), + default => throw $in->badValueException(BlockStateNamesR13::MONSTER_EGG_STONE_TYPE, $type), + }; + }); + $this->mapVanilla("mossy_cobblestone", fn() => VanillaBlocks::MOSSY_COBBLESTONE()); + $this->mapVanilla("mossy_cobblestone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), $in)); + $this->mapVanilla("mossy_stone_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), $in)); + $this->mapVanilla("mycelium", fn() => VanillaBlocks::MYCELIUM()); + $this->mapVanilla("nether_brick", fn() => VanillaBlocks::NETHER_BRICKS()); + $this->mapVanilla("nether_brick_fence", fn() => VanillaBlocks::NETHER_BRICK_FENCE()); + $this->mapVanilla("nether_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::NETHER_BRICK_STAIRS(), $in)); + $this->mapVanilla("nether_wart", function(BlockStateReader $in) : Block{ + return VanillaBlocks::NETHER_WART() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 3)); + }); + $this->mapVanilla("nether_wart_block", fn() => VanillaBlocks::NETHER_WART_BLOCK()); + $this->mapVanilla("netherrack", fn() => VanillaBlocks::NETHERRACK()); + $this->mapVanilla("netherreactor", fn() => VanillaBlocks::NETHER_REACTOR_CORE()); + $this->mapVanilla("normal_stone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::STONE_STAIRS(), $in)); + $this->mapVanilla("noteblock", fn() => VanillaBlocks::NOTE_BLOCK()); + $this->mapVanilla("oak_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::OAK_STAIRS(), $in)); + $this->mapVanilla("obsidian", fn() => VanillaBlocks::OBSIDIAN()); + $this->mapVanilla("orange_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("packed_ice", fn() => VanillaBlocks::PACKED_ICE()); + $this->mapVanilla("pink_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("planks", function(BlockStateReader $in) : Block{ + return match($woodName = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), + default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodName), + }; + }); + $this->mapVanilla("podzol", fn() => VanillaBlocks::PODZOL()); + $this->mapVanilla("polished_andesite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), $in)); + $this->mapVanilla("polished_diorite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_DIORITE_STAIRS(), $in)); + $this->mapVanilla("polished_granite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_GRANITE_STAIRS(), $in)); + $this->mapVanilla("portal", function(BlockStateReader $in) : Block{ + return VanillaBlocks::NETHER_PORTAL() + ->setAxis(match($value = $in->readString(BlockStateNamesR13::PORTAL_AXIS)){ + StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, + StringValues::PORTAL_AXIS_X => Axis::X, + StringValues::PORTAL_AXIS_Z => Axis::Z, + default => throw $in->badValueException(BlockStateNamesR13::PORTAL_AXIS, $value), + }); + }); + $this->mapVanilla("potatoes", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::POTATOES(), $in)); + $this->mapVanilla("powered_comparator", fn(BlockStateReader $in) => $this->decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); + $this->mapVanilla("powered_repeater", fn(BlockStateReader $in) => $this->decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + ->setPowered(true)); + $this->mapVanilla("prismarine", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::PRISMARINE_BLOCK_TYPE)){ + StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), + StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), + StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), + default => throw $in->badValueException(BlockStateNamesR13::PRISMARINE_BLOCK_TYPE, $type), + }; + }); + $this->mapVanilla("prismarine_bricks_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), $in)); + $this->mapVanilla("prismarine_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PRISMARINE_STAIRS(), $in)); + $this->mapVanilla("pumpkin", function() : Block{ + //TODO: intentionally ignored "direction" property (obsolete) + return VanillaBlocks::PUMPKIN(); + }); + $this->mapVanilla("pumpkin_stem", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::PUMPKIN_STEM(), $in)); + $this->mapVanilla("purple_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("purpur_block", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::CHISEL_TYPE)){ + StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), + default => throw $in->badValueException(BlockStateNamesR13::CHISEL_TYPE, $type), + }; + }); + $this->mapVanilla("purpur_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); + $this->mapVanilla("quartz_block", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::CHISEL_TYPE)){ + StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) + default => throw $in->badValueException(BlockStateNamesR13::CHISEL_TYPE, $type), + }; + }); + $this->mapVanilla("quartz_ore", fn() => VanillaBlocks::NETHER_QUARTZ_ORE()); + $this->mapVanilla("quartz_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::QUARTZ_STAIRS(), $in)); + $this->mapVanilla("rail", function(BlockStateReader $in) : Block{ + return VanillaBlocks::RAIL() + ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 9)); + }); + $this->mapVanilla("red_flower", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::FLOWER_TYPE)){ + StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), + StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), + StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? + StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), + StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), + StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), + StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), + StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), + StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), + StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), + StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), + default => throw $in->badValueException(BlockStateNamesR13::FLOWER_TYPE, $type), + }; + }); + $this->mapVanilla("red_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::RED_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("red_mushroom", fn() => VanillaBlocks::RED_MUSHROOM()); + $this->mapVanilla("red_mushroom_block", fn(BlockStateReader $in) => $this->decodeMushroomBlock(VanillaBlocks::RED_MUSHROOM_BLOCK(), $in)); + $this->mapVanilla("red_nether_brick", fn() => VanillaBlocks::RED_NETHER_BRICKS()); + $this->mapVanilla("red_nether_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); + $this->mapVanilla("red_sandstone", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), + default => throw $in->badValueException(BlockStateNamesR13::SAND_STONE_TYPE, $type), + }; + }); + $this->mapVanilla("red_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::RED_SANDSTONE_STAIRS(), $in)); + $this->mapVanilla("redstone_block", fn() => VanillaBlocks::REDSTONE()); + $this->mapVanilla("redstone_lamp", function() : Block{ + return VanillaBlocks::REDSTONE_LAMP() + ->setPowered(false); + }); + $this->mapVanilla("redstone_ore", function() : Block{ + return VanillaBlocks::REDSTONE_ORE() + ->setLit(false); + }); + $this->mapVanilla("redstone_torch", function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_TORCH() + ->setFacing($in->readTorchFacing()) + ->setLit(true); + }); + $this->mapVanilla("redstone_wire", function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_WIRE() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); + }); + $this->mapVanilla("reeds", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SUGARCANE() + ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); + }); + $this->mapVanilla("reserved6", fn() => VanillaBlocks::RESERVED6()); + $this->mapVanilla("sand", function(BlockStateReader $in) : Block{ + return match($value = $in->readString(BlockStateNamesR13::SAND_TYPE)){ + StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), + StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), + default => throw $in->badValueException(BlockStateNamesR13::SAND_TYPE, $value), + }; + }); + $this->mapVanilla("sandstone", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), + default => throw $in->badValueException(BlockStateNamesR13::SAND_STONE_TYPE, $type), + }; + }); + $this->mapVanilla("sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); + $this->mapVanilla("sapling", function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNamesR13::SAPLING_TYPE)){ + StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), + StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), + StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), + StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), + StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), + StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), + default => throw $in->badValueException(BlockStateNamesR13::SAPLING_TYPE, $type), + }) + ->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)); + }); + $this->mapVanilla("seaLantern", fn() => VanillaBlocks::SEA_LANTERN()); + $this->mapVanilla("sea_pickle", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SEA_PICKLE() + ->setCount($in->readBoundedInt(BlockStateNamesR13::CLUSTER_COUNT, 0, 3) + 1) + ->setUnderwater(!$in->readBool(BlockStateNamesR13::DEAD_BIT)); + }); + $this->mapVanilla("shulker_box", function(BlockStateReader $in) : Block{ + return VanillaBlocks::DYED_SHULKER_BOX() + ->setColor($in->readColor()); + }); + $this->mapVanilla("silver_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("skull", function(BlockStateReader $in) : Block{ + return VanillaBlocks::MOB_HEAD() + ->setFacing($in->readFacingWithoutDown()) + ->setNoDrops($in->readBool(BlockStateNamesR13::NO_DROP_BIT)); + }); + $this->mapVanilla("slime", fn() => VanillaBlocks::SLIME()); + $this->mapVanilla("smoker", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SMOKER() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->mapVanilla("smooth_quartz_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), $in)); + $this->mapVanilla("smooth_red_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); + $this->mapVanilla("smooth_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), $in)); + $this->mapVanilla("smooth_stone", fn() => VanillaBlocks::SMOOTH_STONE()); + $this->mapVanilla("snow", fn() => VanillaBlocks::SNOW()); + $this->mapVanilla("snow_layer", function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored covered_bit property (appears useless and we don't track it) + return VanillaBlocks::SNOW_LAYER()->setLayers($in->readBoundedInt(BlockStateNamesR13::HEIGHT, 0, 7) + 1); + }); + $this->mapVanilla("soul_sand", fn() => VanillaBlocks::SOUL_SAND()); + $this->mapVanilla("sponge", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNamesR13::SPONGE_TYPE)){ + StringValues::SPONGE_TYPE_DRY => false, + StringValues::SPONGE_TYPE_WET => true, + default => throw $in->badValueException(BlockStateNamesR13::SPONGE_TYPE, $type), + }); + }); + $this->mapVanilla("spruce_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::SPRUCE_BUTTON(), $in)); + $this->mapVanilla("spruce_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::SPRUCE_DOOR(), $in)); + $this->mapVanilla("spruce_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::SPRUCE_FENCE_GATE(), $in)); + $this->mapVanilla("spruce_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), $in)); + $this->mapVanilla("spruce_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SPRUCE_STAIRS(), $in)); + $this->mapVanilla("spruce_standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPRUCE_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("spruce_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::SPRUCE_TRAPDOOR(), $in)); + $this->mapVanilla("spruce_wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPRUCE_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("stained_glass", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_GLASS() + ->setColor($in->readColor()); + }); + $this->mapVanilla("stained_glass_pane", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_GLASS_PANE() + ->setColor($in->readColor()); + }); + $this->mapVanilla("stained_hardened_clay", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_CLAY() + ->setColor($in->readColor()); + }); + $this->mapVanilla("standing_banner", function(BlockStateReader $in) : Block{ + return VanillaBlocks::BANNER() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("standing_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::OAK_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->mapVanilla("stone", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::STONE_TYPE)){ + StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), + StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), + StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), + StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), + StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), + StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), + StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_TYPE, $type), + }; + }); + $this->mapVanilla("stone_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::STONE_BRICK_STAIRS(), $in)); + $this->mapVanilla("stone_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::STONE_BUTTON(), $in)); + $this->mapVanilla("stone_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::STONE_PRESSURE_PLATE(), $in)); + $this->mapVanilla("stone_slab", fn(BlockStateReader $in) => $this->mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); + $this->mapVanilla("stone_slab2", fn(BlockStateReader $in) => $this->mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); + $this->mapVanilla("stone_slab3", fn(BlockStateReader $in) => $this->mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); + $this->mapVanilla("stone_slab4", fn(BlockStateReader $in) => $this->mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); + $this->mapVanilla("stone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); + $this->mapVanilla("stonebrick", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::STONE_BRICK_TYPE)){ + StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla + StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), + default => throw $in->badValueException(BlockStateNamesR13::STONE_BRICK_TYPE, $type), + }; + }); + $this->mapVanilla("stonecutter", fn() => VanillaBlocks::LEGACY_STONECUTTER()); + $this->mapVanilla("stripped_acacia_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_ACACIA_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("stripped_birch_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_BIRCH_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("stripped_dark_oak_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_DARK_OAK_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("stripped_jungle_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_JUNGLE_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("stripped_oak_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_OAK_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("stripped_spruce_log", function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_SPRUCE_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->mapVanilla("sweet_berry_bush", function(BlockStateReader $in) : Block{ + //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 + $growth = $in->readBoundedInt(BlockStateNamesR13::GROWTH, 0, 7); + return VanillaBlocks::SWEET_BERRY_BUSH() + ->setAge(min($growth, SweetBerryBush::STAGE_MATURE)); + }); + $this->mapVanilla("tallgrass", function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNamesR13::TALL_GRASS_TYPE)){ + StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), + StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), + default => throw $in->badValueException(BlockStateNamesR13::TALL_GRASS_TYPE, $type), + }; + }); + $this->mapVanilla("tnt", function(BlockStateReader $in) : Block{ + return VanillaBlocks::TNT() + ->setUnstable($in->readBool(BlockStateNamesR13::EXPLODE_BIT)) + ->setWorksUnderwater($in->readBool(BlockStateNamesR13::ALLOW_UNDERWATER_BIT)); + }); + $this->mapVanilla("torch", function(BlockStateReader $in) : Block{ + return VanillaBlocks::TORCH() + ->setFacing($in->readTorchFacing()); + }); + $this->mapVanilla("trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::OAK_TRAPDOOR(), $in)); + $this->mapVanilla("trapped_chest", function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRAPPED_CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("tripWire", function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRIPWIRE() + ->setConnected($in->readBool(BlockStateNamesR13::ATTACHED_BIT)) + ->setDisarmed($in->readBool(BlockStateNamesR13::DISARMED_BIT)) + ->setSuspended($in->readBool(BlockStateNamesR13::SUSPENDED_BIT)) + ->setTriggered($in->readBool(BlockStateNamesR13::POWERED_BIT)); + }); + $this->mapVanilla("tripwire_hook", function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRIPWIRE_HOOK() + ->setConnected($in->readBool(BlockStateNamesR13::ATTACHED_BIT)) + ->setFacing($in->readLegacyHorizontalFacing()) + ->setPowered($in->readBool(BlockStateNamesR13::POWERED_BIT)); + }); + $this->mapVanilla("underwater_torch", function(BlockStateReader $in) : Block{ + return VanillaBlocks::UNDERWATER_TORCH() + ->setFacing($in->readTorchFacing()); + }); + $this->mapVanilla("undyed_shulker_box", fn() => VanillaBlocks::SHULKER_BOX()); + $this->mapVanilla("unlit_redstone_torch", function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_TORCH() + ->setFacing($in->readTorchFacing()) + ->setLit(false); + }); + $this->mapVanilla("unpowered_comparator", fn(BlockStateReader $in) => $this->decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); + $this->mapVanilla("unpowered_repeater", fn(BlockStateReader $in) => $this->decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + ->setPowered(false)); + $this->mapVanilla("vine", function(BlockStateReader $in) : Block{ + $vineDirectionFlags = $in->readBoundedInt(BlockStateNamesR13::VINE_DIRECTION_BITS, 0, 15); + return VanillaBlocks::VINES() + ->setFace(Facing::NORTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_NORTH) !== 0) + ->setFace(Facing::SOUTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_SOUTH) !== 0) + ->setFace(Facing::WEST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_WEST) !== 0) + ->setFace(Facing::EAST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_EAST) !== 0); + }); + $this->mapVanilla("wall_banner", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_BANNER() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("wall_sign", function(BlockStateReader $in) : Block{ + return VanillaBlocks::OAK_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapVanilla("water", fn(BlockStateReader $in) => $this->decodeStillLiquid(VanillaBlocks::WATER(), $in)); + $this->mapVanilla("waterlily", fn() => VanillaBlocks::LILY_PAD()); + $this->mapVanilla("web", fn() => VanillaBlocks::COBWEB()); + $this->mapVanilla("wheat", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::WHEAT(), $in)); + $this->mapVanilla("white_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), $in)); + $this->mapVanilla("wood", function(BlockStateReader $in) : Block{ + //TODO: our impl doesn't support axis yet + $stripped = $in->readBool(BlockStateNamesR13::STRIPPED_BIT); + return match($woodType = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), + default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodType), + }; + }); + $this->mapVanilla("wooden_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::OAK_BUTTON(), $in)); + $this->mapVanilla("wooden_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::OAK_DOOR(), $in)); + $this->mapVanilla("wooden_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::OAK_PRESSURE_PLATE(), $in)); + $this->mapVanilla("wooden_slab", fn(BlockStateReader $in) => $this->mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); + $this->mapVanilla("wool", function(BlockStateReader $in) : Block{ + return VanillaBlocks::WOOL() + ->setColor($in->readColor()); + }); + $this->mapVanilla("yellow_flower", fn() => VanillaBlocks::DANDELION()); + $this->mapVanilla("yellow_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), $in)); + //$this->mapVanilla("bubble_column", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * drag_down (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("camera", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("campfire", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * direction (IntTag) = 0, 1, 2, 3 + * extinguished (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("cartography_table", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("cauldron", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * cauldron_liquid (StringTag) = lava, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->mapVanilla("chain_command_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("chorus_flower", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * age (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("chorus_plant", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("command_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("composter", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 + */ + //}); + //$this->mapVanilla("conduit", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("dispenser", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("dropper", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("end_gateway", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("end_portal", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("fletching_table", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("grindstone", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * attachment (StringTag) = hanging, multiple, side, standing + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->mapVanilla("jigsaw", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("kelp", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->mapVanilla("lava_cauldron", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * cauldron_liquid (StringTag) = lava, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->mapVanilla("lectern", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * direction (IntTag) = 0, 1, 2, 3 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("lever", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * lever_direction (StringTag) = down_east_west, down_north_south, east, north, south, up_east_west, up_north_south, west + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("light_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->mapVanilla("movingBlock", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("observer", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("piston", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("pistonArmCollision", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("repeating_command_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("scaffolding", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + * stability_check (ByteTag) = 0, 1 + */ + //}); + //$this->mapVanilla("seagrass", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * sea_grass_type (StringTag) = default, double_bot, double_top + */ + //}); + //$this->mapVanilla("smithing_table", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + //$this->mapVanilla("stickyPistonArmCollision", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("sticky_piston", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("stonecutter_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->mapVanilla("structure_block", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * structure_block_type (StringTag) = corner, data, export, invalid, load, save + */ + //}); + //$this->mapVanilla("structure_void", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * structure_void_type (StringTag) = air, void + */ + //}); + //$this->mapVanilla("turtle_egg", function(BlockStateReader $in) : Block{ + /* TODO: parse properties + * cracked_state (StringTag) = cracked, max_cracked, no_cracks + * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg + */ + //}); + //$this->mapVanilla("wither_rose", function(BlockStateReader $in) : Block{ + //TODO: un-implemented block + //}); + } + + /** @throws BlockStateDeserializeException */ + public function deserialize(string $id, CompoundTag $blockState) : Block{ + if(!array_key_exists($id, $this->deserializeFuncs)){ + throw new BlockStateDeserializeException("Unknown block ID \"$id\""); + } + return $this->deserializeFuncs[$id](new BlockStateReader($blockState)); + } +} \ No newline at end of file diff --git a/src/data/bedrock/blockstate/BlockStateNamesR13.php b/src/data/bedrock/blockstate/BlockStateNamesR13.php new file mode 100644 index 0000000000..1e27b17313 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateNamesR13.php @@ -0,0 +1,131 @@ +nbt = $nbt; + } + + public function getNbt() : CompoundTag{ return $this->nbt; } + + public function missingOrWrongTypeException(string $name, ?Tag $tag) : BlockStateDeserializeException{ + return new BlockStateDeserializeException("Property \"$name\" " . ($tag !== null ? "has unexpected type " . get_class($tag) : "is missing")); + } + + public function badValueException(string $name, string $stringifiedValue, ?string $reason = null) : BlockStateDeserializeException{ + return new BlockStateDeserializeException( + "Property \"$name\" has unexpected value \"$stringifiedValue\"" . ( + $reason !== null ? " ($reason)" : "" + )); + } + + /** @throws BlockStateDeserializeException */ + public function readBool(string $name) : bool{ + $tag = $this->nbt->getTag($name); + if($tag instanceof ByteTag){ + switch($tag->getValue()){ + case 0: return false; + case 1: return true; + default: throw $this->badValueException($name, (string) $tag->getValue()); + } + } + throw $this->missingOrWrongTypeException($name, $tag); + } + + /** @throws BlockStateDeserializeException */ + public function readInt(string $name) : int{ + $tag = $this->nbt->getTag($name); + if($tag instanceof IntTag){ + return $tag->getValue(); + } + throw $this->missingOrWrongTypeException($name, $tag); + } + + /** @throws BlockStateDeserializeException */ + public function readBoundedInt(string $name, int $min, int $max) : int{ + $result = $this->readInt($name); + if($result < $min || $result > $max){ + throw $this->badValueException($name, (string) $result, "Must be inside the range $min ... $max"); + } + return $result; + } + + /** @throws BlockStateDeserializeException */ + public function readString(string $name) : string{ + //TODO: only allow a specific set of values (strings are primarily used for enums) + $tag = $this->nbt->getTag($name); + if($tag instanceof StringTag){ + return $tag->getValue(); + } + throw $this->missingOrWrongTypeException($name, $tag); + } + + /** + * @param int[] $mapping + * @phpstan-param array $mapping + * @phpstan-return int + * @throws BlockStateDeserializeException + */ + private function parseFacingValue(int $value, array $mapping) : int{ + $result = $mapping[$value] ?? null; + if($result === null){ + throw new BlockStateDeserializeException("Unmapped facing value " . $value); + } + return $result; + } + + /** @throws BlockStateDeserializeException */ + public function readFacingDirection() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNamesR13::FACING_DIRECTION), [ + 0 => Facing::DOWN, + 1 => Facing::UP, + 2 => Facing::NORTH, + 3 => Facing::SOUTH, + 4 => Facing::WEST, + 5 => Facing::EAST + ]); + } + + /** @throws BlockStateDeserializeException */ + public function readHorizontalFacing() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNamesR13::FACING_DIRECTION), [ + 0 => Facing::NORTH, //should be illegal, but 1.13 allows it + 1 => Facing::NORTH, //also should be illegal + 2 => Facing::NORTH, + 3 => Facing::SOUTH, + 4 => Facing::WEST, + 5 => Facing::EAST + ]); + } + + /** @throws BlockStateDeserializeException */ + public function readWeirdoHorizontalFacing() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNamesR13::WEIRDO_DIRECTION), [ + 0 => Facing::EAST, + 1 => Facing::WEST, + 2 => Facing::SOUTH, + 3 => Facing::NORTH + ]); + } + + /** @throws BlockStateDeserializeException */ + public function readLegacyHorizontalFacing() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNamesR13::DIRECTION), [ + 0 => Facing::SOUTH, + 1 => Facing::WEST, + 2 => Facing::NORTH, + 3 => Facing::EAST + ]); + } + + /** @throws BlockStateDeserializeException */ + public function readColor() : DyeColor{ + // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + return match($color = $this->readString(BlockStateNamesR13::COLOR)){ + StringValues::COLOR_BLACK => DyeColor::BLACK(), + StringValues::COLOR_BLUE => DyeColor::BLUE(), + StringValues::COLOR_BROWN => DyeColor::BROWN(), + StringValues::COLOR_CYAN => DyeColor::CYAN(), + StringValues::COLOR_GRAY => DyeColor::GRAY(), + StringValues::COLOR_GREEN => DyeColor::GREEN(), + StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), + StringValues::COLOR_LIME => DyeColor::LIME(), + StringValues::COLOR_MAGENTA => DyeColor::MAGENTA(), + StringValues::COLOR_ORANGE => DyeColor::ORANGE(), + StringValues::COLOR_PINK => DyeColor::PINK(), + StringValues::COLOR_PURPLE => DyeColor::PURPLE(), + StringValues::COLOR_RED => DyeColor::RED(), + StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY(), + StringValues::COLOR_WHITE => DyeColor::WHITE(), + StringValues::COLOR_YELLOW => DyeColor::YELLOW(), + default => throw $this->badValueException(BlockStateNamesR13::COLOR, $color), + }; + } + + /** @throws BlockStateDeserializeException */ + public function readCoralFacing() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNamesR13::CORAL_DIRECTION), [ + 0 => Facing::WEST, + 1 => Facing::EAST, + 2 => Facing::NORTH, + 3 => Facing::SOUTH + ]); + } + + /** @throws BlockStateDeserializeException */ + public function readFacingWithoutDown() : int{ + $result = $this->readFacingDirection(); + if($result === Facing::DOWN){ //shouldn't be legal, but 1.13 allows it + $result = Facing::UP; + } + return $result; + } + + public function readFacingWithoutUp() : int{ + $result = $this->readFacingDirection(); + if($result === Facing::UP){ + $result = Facing::DOWN; //shouldn't be legal, but 1.13 allows it + } + return $result; + } + + /** + * @phpstan-return Axis::* + * @throws BlockStateDeserializeException + */ + public function readPillarAxis() : int{ + $rawValue = $this->readString(BlockStateNamesR13::PILLAR_AXIS); + $value = [ + StringValues::PILLAR_AXIS_X => Axis::X, + StringValues::PILLAR_AXIS_Y => Axis::Y, + StringValues::PILLAR_AXIS_Z => Axis::Z + ][$rawValue] ?? null; + if($value === null){ + throw $this->badValueException(BlockStateNamesR13::PILLAR_AXIS, $rawValue, "Invalid axis value"); + } + return $value; + } + + /** @throws BlockStateDeserializeException */ + public function readSlabPosition() : SlabType{ + return $this->readBool(BlockStateNamesR13::TOP_SLOT_BIT) ? SlabType::TOP() : SlabType::BOTTOM(); + } + + /** + * @phpstan-return Facing::UP|Facing::NORTH|Facing::SOUTH|Facing::WEST|Facing::EAST + * @throws BlockStateDeserializeException + */ + public function readTorchFacing() : int{ + return match($rawValue = $this->readString(BlockStateNamesR13::TORCH_FACING_DIRECTION)){ + StringValues::TORCH_FACING_DIRECTION_EAST => Facing::EAST, + StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, + StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, + StringValues::TORCH_FACING_DIRECTION_TOP => Facing::UP, + StringValues::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it + StringValues::TORCH_FACING_DIRECTION_WEST => Facing::WEST, + default => throw $this->badValueException(BlockStateNamesR13::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), + }; + } + + /** @throws BlockStateDeserializeException */ + public function readCoralType() : CoralType{ + return match($type = $this->readString(BlockStateNamesR13::CORAL_COLOR)){ + StringValues::CORAL_COLOR_BLUE => CoralType::TUBE(), + StringValues::CORAL_COLOR_PINK => CoralType::BRAIN(), + StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), + StringValues::CORAL_COLOR_RED => CoralType::FIRE(), + StringValues::CORAL_COLOR_YELLOW => CoralType::HORN(), + default => throw $this->badValueException(BlockStateNamesR13::CORAL_COLOR, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + public function readBellAttachmentType() : BellAttachmentType{ + return match($type = $this->readString(BlockStateNamesR13::ATTACHMENT)){ + StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), + StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), + StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), + StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), + default => throw $this->badValueException(BlockStateNamesR13::ATTACHMENT, $type), + }; + } +} diff --git a/src/data/bedrock/blockstate/BlockStateStringValuesR13.php b/src/data/bedrock/blockstate/BlockStateStringValuesR13.php new file mode 100644 index 0000000000..d51c39291e --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateStringValuesR13.php @@ -0,0 +1,269 @@ + Date: Wed, 29 Sep 2021 00:59:53 +0100 Subject: [PATCH 0002/1858] Lever blockstate decoding all implemented blocks are now supported; about 37 remain which are not implemented. --- .../blockstate/BlockStateDeserializerR13.php | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php index 68a66ac04e..b73debd208 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php @@ -44,6 +44,7 @@ use pocketmine\block\SweetBerryBush; use pocketmine\block\Trapdoor; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; @@ -819,6 +820,21 @@ final class BlockStateDeserializerR13{ ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); }); + $this->mapVanilla("lever", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LEVER() + ->setActivated($in->readBool(BlockStateNamesR13::OPEN_BIT)) + ->setFacing(match($value = $in->readString(BlockStateNamesR13::LEVER_DIRECTION)){ + StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), + StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), + StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), + StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), + StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), + StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), + StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), + StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), + default => throw $in->badValueException(BlockStateNamesR13::LEVER_DIRECTION, $value), + }); + }); $this->mapVanilla("light_blue_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); $this->mapVanilla("light_weighted_pressure_plate", function(BlockStateReader $in) : Block{ return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT() @@ -1388,12 +1404,6 @@ final class BlockStateDeserializerR13{ * powered_bit (ByteTag) = 0, 1 */ //}); - //$this->mapVanilla("lever", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * lever_direction (StringTag) = down_east_west, down_north_south, east, north, south, up_east_west, up_north_south, west - * open_bit (ByteTag) = 0, 1 - */ - //}); //$this->mapVanilla("light_block", function(BlockStateReader $in) : Block{ /* TODO: parse properties * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 From d6dfcb11e8dc18d7f845da1088bdb2183ed37c4a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Sep 2021 17:32:06 +0100 Subject: [PATCH 0003/1858] BlockStateDeserializerR13: fixed some formatting issues --- src/data/bedrock/blockstate/BlockStateDeserializerR13.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php index b73debd208..65a487bd0e 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php @@ -36,7 +36,6 @@ use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; use pocketmine\block\RedstoneRepeater; -use pocketmine\block\Sapling; use pocketmine\block\SimplePressurePlate; use pocketmine\block\Slab; use pocketmine\block\Stair; @@ -77,6 +76,7 @@ final class BlockStateDeserializerR13{ private function mapVanilla(string $minecraftId, \Closure $c) : void{ $this->mapId("minecraft:$minecraftId", $c); } + /** @throws BlockStateDeserializeException */ private function decodeButton(Button $block, BlockStateReader $in) : Button{ return $block From 440a48b9739dd224869176ae930962df7ef9e205 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Jan 2022 16:58:32 +0000 Subject: [PATCH 0004/1858] added serializers for newly implemented blocks --- .../blockstate/BlockStateDeserializerR13.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php index 65a487bd0e..450cd0cde4 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php @@ -703,6 +703,7 @@ final class BlockStateDeserializerR13{ return VanillaBlocks::FIRE() ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); }); + $this->mapVanilla("fletching_table", fn() => VanillaBlocks::FLETCHING_TABLE()); $this->mapVanilla("flower_pot", function() : Block{ //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) return VanillaBlocks::FLOWER_POT(); @@ -820,6 +821,11 @@ final class BlockStateDeserializerR13{ ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); }); + $this->mapVanilla("lectern", function(BlockStateReader $in) : Block{ + return VanillaBlocks::LECTERN() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setProducingSignal($in->readBool(BlockStateNamesR13::POWERED_BIT)); + }); $this->mapVanilla("lever", function(BlockStateReader $in) : Block{ return VanillaBlocks::LEVER() ->setActivated($in->readBool(BlockStateNamesR13::OPEN_BIT)) @@ -1373,9 +1379,6 @@ final class BlockStateDeserializerR13{ //$this->mapVanilla("end_portal", function(BlockStateReader $in) : Block{ //TODO: un-implemented block //}); - //$this->mapVanilla("fletching_table", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); //$this->mapVanilla("grindstone", function(BlockStateReader $in) : Block{ /* TODO: parse properties * attachment (StringTag) = hanging, multiple, side, standing @@ -1398,12 +1401,6 @@ final class BlockStateDeserializerR13{ * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 */ //}); - //$this->mapVanilla("lectern", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * direction (IntTag) = 0, 1, 2, 3 - * powered_bit (ByteTag) = 0, 1 - */ - //}); //$this->mapVanilla("light_block", function(BlockStateReader $in) : Block{ /* TODO: parse properties * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 @@ -1491,4 +1488,4 @@ final class BlockStateDeserializerR13{ } return $this->deserializeFuncs[$id](new BlockStateReader($blockState)); } -} \ No newline at end of file +} From ab5a7b0d044614a8f366c2538cfa2725b98db2f9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 01:18:56 +0000 Subject: [PATCH 0005/1858] an absolute motherload of stuff I did today --- .../blockstate/BlockStateDeserializer.php | 2564 +++++++++++++ .../BlockStateDeserializerHelper.php | 257 ++ .../blockstate/BlockStateDeserializerR13.php | 1491 -------- ...kStateNamesR13.php => BlockStateNames.php} | 23 +- .../bedrock/blockstate/BlockStateReader.php | 34 +- .../BlockStateSerializeException.php | 28 + .../blockstate/BlockStateSerializer.php | 3167 +++++++++++++++++ ...luesR13.php => BlockStateStringValues.php} | 30 +- .../bedrock/blockstate/BlockStateWriter.php | 229 ++ .../bedrock/blockstate/BlockTypeNames.php | 739 ++++ 10 files changed, 7052 insertions(+), 1510 deletions(-) create mode 100644 src/data/bedrock/blockstate/BlockStateDeserializer.php create mode 100644 src/data/bedrock/blockstate/BlockStateDeserializerHelper.php delete mode 100644 src/data/bedrock/blockstate/BlockStateDeserializerR13.php rename src/data/bedrock/blockstate/{BlockStateNamesR13.php => BlockStateNames.php} (83%) create mode 100644 src/data/bedrock/blockstate/BlockStateSerializeException.php create mode 100644 src/data/bedrock/blockstate/BlockStateSerializer.php rename src/data/bedrock/blockstate/{BlockStateStringValuesR13.php => BlockStateStringValues.php} (89%) create mode 100644 src/data/bedrock/blockstate/BlockStateWriter.php create mode 100644 src/data/bedrock/blockstate/BlockTypeNames.php diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php new file mode 100644 index 0000000000..878c8ebfb2 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -0,0 +1,2564 @@ + + */ + private array $deserializeFuncs = []; + + /** @phpstan-param \Closure(BlockStateReader) : Block $c */ + private function map(string $id, \Closure $c) : void{ + if(array_key_exists($id, $this->deserializeFuncs)){ + throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); + } + $this->deserializeFuncs[$id] = $c; + } + public function __construct(){ + $this->map(Ids::ACACIA_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::ACACIA_BUTTON(), $in)); + $this->map(Ids::ACACIA_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::ACACIA_DOOR(), $in)); + $this->map(Ids::ACACIA_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::ACACIA_FENCE_GATE(), $in)); + $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::ACACIA_PRESSURE_PLATE(), $in)); + $this->map(Ids::ACACIA_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::ACACIA_STAIRS(), $in)); + $this->map(Ids::ACACIA_STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACACIA_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::ACACIA_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::ACACIA_TRAPDOOR(), $in)); + $this->map(Ids::ACACIA_WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACACIA_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::ACTIVATOR_RAIL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::ACTIVATOR_RAIL() + ->setPowered($in->readBool(BlockStateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + }); + $this->map(Ids::AIR, fn() => VanillaBlocks::AIR()); + $this->map(Ids::ANDESITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::ANDESITE_STAIRS(), $in)); + $this->map(Ids::ANVIL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::ANVIL() + ->setDamage(match($value = $in->readString(BlockStateNames::DAMAGE)){ + StringValues::DAMAGE_UNDAMAGED => 0, + StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, + StringValues::DAMAGE_VERY_DAMAGED => 2, + StringValues::DAMAGE_BROKEN => 0, + default => throw $in->badValueException(BlockStateNames::DAMAGE, $value), + }) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::BAMBOO, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BAMBOO() + ->setLeafSize(match($value = $in->readString(BlockStateNames::BAMBOO_LEAF_SIZE)){ + StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, + default => throw $in->badValueException(BlockStateNames::BAMBOO_LEAF_SIZE, $value), + }) + ->setReady($in->readBool(BlockStateNames::AGE_BIT)) + ->setThick(match($value = $in->readString(BlockStateNames::BAMBOO_STALK_THICKNESS)){ + StringValues::BAMBOO_STALK_THICKNESS_THIN => false, + StringValues::BAMBOO_STALK_THICKNESS_THICK => true, + default => throw $in->badValueException(BlockStateNames::BAMBOO_STALK_THICKNESS, $value), + }); + }); + $this->map(Ids::BAMBOO_SAPLING, function(BlockStateReader $in) : Block{ + //TODO: sapling_type intentionally ignored (its presence is a bug) + return VanillaBlocks::BAMBOO_SAPLING()->setReady($in->readBool(BlockStateNames::AGE_BIT)); + }); + $this->map(Ids::BARREL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BARREL() + ->setFacing($in->readFacingDirection()) + ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); + }); + $this->map(Ids::BARRIER, fn() => VanillaBlocks::BARRIER()); + $this->map(Ids::BEACON, fn() => VanillaBlocks::BEACON()); + $this->map(Ids::BED, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BED() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setHead($in->readBool(BlockStateNames::HEAD_PIECE_BIT)) + ->setOccupied($in->readBool(BlockStateNames::OCCUPIED_BIT)); + }); + $this->map(Ids::BEDROCK, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BEDROCK() + ->setBurnsForever($in->readBool(BlockStateNames::INFINIBURN_BIT)); + }); + $this->map(Ids::BEETROOT, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::BEETROOTS(), $in)); + $this->map(Ids::BELL, function(BlockStateReader $in) : Block{ + //TODO: ignored toggle_bit (appears to be internally used in MCPE only, useless for us) + return VanillaBlocks::BELL() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setAttachmentType($in->readBellAttachmentType()); + }); + $this->map(Ids::BIRCH_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::BIRCH_BUTTON(), $in)); + $this->map(Ids::BIRCH_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::BIRCH_DOOR(), $in)); + $this->map(Ids::BIRCH_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::BIRCH_FENCE_GATE(), $in)); + $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::BIRCH_PRESSURE_PLATE(), $in)); + $this->map(Ids::BIRCH_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BIRCH_STAIRS(), $in)); + $this->map(Ids::BIRCH_STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BIRCH_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::BIRCH_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::BIRCH_TRAPDOOR(), $in)); + $this->map(Ids::BIRCH_WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BIRCH_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLAST_FURNACE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BLAST_FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLUE_ICE, fn() => VanillaBlocks::BLUE_ICE()); + $this->map(Ids::BONE_BLOCK, function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored "deprecated" blockstate (useless) + return VanillaBlocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::BOOKSHELF, fn() => VanillaBlocks::BOOKSHELF()); + $this->map(Ids::BREWING_STAND, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BREWING_STAND() + ->setSlot(BrewingStandSlot::EAST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT)); + }); + $this->map(Ids::BRICK_BLOCK, fn() => VanillaBlocks::BRICKS()); + $this->map(Ids::BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BRICK_STAIRS(), $in)); + $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BROWN_MUSHROOM, fn() => VanillaBlocks::BROWN_MUSHROOM()); + $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(BlockStateReader $in) => Helper::decodeMushroomBlock(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), $in)); + $this->map(Ids::CACTUS, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CACTUS() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + }); + $this->map(Ids::CAKE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CAKE() + ->setBites($in->readBoundedInt(BlockStateNames::BITE_COUNTER, 0, 6)); + }); + $this->map(Ids::CARPET, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CARPET() + ->setColor($in->readColor()); + }); + $this->map(Ids::CARROTS, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::CARROTS(), $in)); + $this->map(Ids::CARVED_PUMPKIN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CARVED_PUMPKIN() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::CHEMICAL_HEAT, fn() => VanillaBlocks::CHEMICAL_HEAT()); + $this->map(Ids::CHEMISTRY_TABLE, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::CHEMISTRY_TABLE_TYPE)){ + StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), + StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), + StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), + StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), + default => throw $in->badValueException(BlockStateNames::CHEMISTRY_TABLE_TYPE, $type), + })->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::CHEST, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::CLAY, fn() => VanillaBlocks::CLAY()); + $this->map(Ids::COAL_BLOCK, fn() => VanillaBlocks::COAL()); + $this->map(Ids::COAL_ORE, fn() => VanillaBlocks::COAL_ORE()); + $this->map(Ids::COBBLESTONE, fn() => VanillaBlocks::COBBLESTONE()); + $this->map(Ids::COBBLESTONE_WALL, fn(BlockStateReader $in) => Helper::decodeWall(VanillaBlocks::COBBLESTONE_WALL(), $in)); + $this->map(Ids::COCOA, function(BlockStateReader $in) : Block{ + return VanillaBlocks::COCOA_POD() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 2)) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::COLORED_TORCH_BP, function(BlockStateReader $in) : Block{ + return $in->readBool(BlockStateNames::COLOR_BIT) ? + VanillaBlocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : + VanillaBlocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::COLORED_TORCH_RG, function(BlockStateReader $in) : Block{ + return $in->readBool(BlockStateNames::COLOR_BIT) ? + VanillaBlocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : + VanillaBlocks::RED_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::CONCRETE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CONCRETE() + ->setColor($in->readColor()); + }); + $this->map(Ids::CONCRETEPOWDER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CONCRETE_POWDER() + ->setColor($in->readColor()); + }); + $this->map(Ids::CORAL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CORAL() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); + }); + $this->map(Ids::CORAL_BLOCK, function(BlockStateReader $in) : Block{ + return VanillaBlocks::CORAL_BLOCK() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); + }); + $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(true)); + $this->map(Ids::CORAL_FAN_HANG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->map(Ids::CORAL_FAN_HANG2, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE()) + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->map(Ids::CORAL_FAN_HANG3, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_CORAL_FAN() + ->setCoralType(CoralType::HORN()) + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + }); + $this->map(Ids::CRAFTING_TABLE, fn() => VanillaBlocks::CRAFTING_TABLE()); + $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::DARK_OAK_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::DARK_OAK_BUTTON(), $in)); + $this->map(Ids::DARK_OAK_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::DARK_OAK_DOOR(), $in)); + $this->map(Ids::DARK_OAK_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::DARK_OAK_FENCE_GATE(), $in)); + $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), $in)); + $this->map(Ids::DARK_OAK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_OAK_STAIRS(), $in)); + $this->map(Ids::DARK_OAK_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::DARK_OAK_TRAPDOOR(), $in)); + $this->map(Ids::DARK_PRISMARINE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_PRISMARINE_STAIRS(), $in)); + $this->map(Ids::DARKOAK_STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DARK_OAK_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::DARKOAK_WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DARK_OAK_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::DAYLIGHT_DETECTOR, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DAYLIGHT_SENSOR() + ->setInverted(false) + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + }); + $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DAYLIGHT_SENSOR() + ->setInverted(true) + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + }); + $this->map(Ids::DEADBUSH, fn() => VanillaBlocks::DEAD_BUSH()); + $this->map(Ids::DETECTOR_RAIL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DETECTOR_RAIL() + ->setActivated($in->readBool(BlockStateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + }); + $this->map(Ids::DIAMOND_BLOCK, fn() => VanillaBlocks::DIAMOND()); + $this->map(Ids::DIAMOND_ORE, fn() => VanillaBlocks::DIAMOND_ORE()); + $this->map(Ids::DIORITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DIORITE_STAIRS(), $in)); + $this->map(Ids::DIRT, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DIRT() + ->setCoarse(match($value = $in->readString(BlockStateNames::DIRT_TYPE)){ + StringValues::DIRT_TYPE_NORMAL => false, + StringValues::DIRT_TYPE_COARSE => true, + default => throw $in->badValueException(BlockStateNames::DIRT_TYPE, $value), + }); + }); + $this->map(Ids::DOUBLE_PLANT, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::DOUBLE_PLANT_TYPE)){ + StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), + StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), + StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), + StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), + StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), + StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), + default => throw $in->badValueException(BlockStateNames::DOUBLE_PLANT_TYPE, $type), + })->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)); + }); + $this->map(Ids::DOUBLE_STONE_SLAB, function(BlockStateReader $in) : Block{ + return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_SLAB2, function(BlockStateReader $in) : Block{ + return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_SLAB3, function(BlockStateReader $in) : Block{ + return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_SLAB4, function(BlockStateReader $in) : Block{ + return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_WOODEN_SLAB, function(BlockStateReader $in) : Block{ + return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DRAGON_EGG, fn() => VanillaBlocks::DRAGON_EGG()); + $this->map(Ids::DRIED_KELP_BLOCK, fn() => VanillaBlocks::DRIED_KELP()); + $this->map(Ids::ELEMENT_0, fn() => VanillaBlocks::ELEMENT_ZERO()); + $this->map(Ids::ELEMENT_1, fn() => VanillaBlocks::ELEMENT_HYDROGEN()); + $this->map(Ids::ELEMENT_10, fn() => VanillaBlocks::ELEMENT_NEON()); + $this->map(Ids::ELEMENT_100, fn() => VanillaBlocks::ELEMENT_FERMIUM()); + $this->map(Ids::ELEMENT_101, fn() => VanillaBlocks::ELEMENT_MENDELEVIUM()); + $this->map(Ids::ELEMENT_102, fn() => VanillaBlocks::ELEMENT_NOBELIUM()); + $this->map(Ids::ELEMENT_103, fn() => VanillaBlocks::ELEMENT_LAWRENCIUM()); + $this->map(Ids::ELEMENT_104, fn() => VanillaBlocks::ELEMENT_RUTHERFORDIUM()); + $this->map(Ids::ELEMENT_105, fn() => VanillaBlocks::ELEMENT_DUBNIUM()); + $this->map(Ids::ELEMENT_106, fn() => VanillaBlocks::ELEMENT_SEABORGIUM()); + $this->map(Ids::ELEMENT_107, fn() => VanillaBlocks::ELEMENT_BOHRIUM()); + $this->map(Ids::ELEMENT_108, fn() => VanillaBlocks::ELEMENT_HASSIUM()); + $this->map(Ids::ELEMENT_109, fn() => VanillaBlocks::ELEMENT_MEITNERIUM()); + $this->map(Ids::ELEMENT_11, fn() => VanillaBlocks::ELEMENT_SODIUM()); + $this->map(Ids::ELEMENT_110, fn() => VanillaBlocks::ELEMENT_DARMSTADTIUM()); + $this->map(Ids::ELEMENT_111, fn() => VanillaBlocks::ELEMENT_ROENTGENIUM()); + $this->map(Ids::ELEMENT_112, fn() => VanillaBlocks::ELEMENT_COPERNICIUM()); + $this->map(Ids::ELEMENT_113, fn() => VanillaBlocks::ELEMENT_NIHONIUM()); + $this->map(Ids::ELEMENT_114, fn() => VanillaBlocks::ELEMENT_FLEROVIUM()); + $this->map(Ids::ELEMENT_115, fn() => VanillaBlocks::ELEMENT_MOSCOVIUM()); + $this->map(Ids::ELEMENT_116, fn() => VanillaBlocks::ELEMENT_LIVERMORIUM()); + $this->map(Ids::ELEMENT_117, fn() => VanillaBlocks::ELEMENT_TENNESSINE()); + $this->map(Ids::ELEMENT_118, fn() => VanillaBlocks::ELEMENT_OGANESSON()); + $this->map(Ids::ELEMENT_12, fn() => VanillaBlocks::ELEMENT_MAGNESIUM()); + $this->map(Ids::ELEMENT_13, fn() => VanillaBlocks::ELEMENT_ALUMINUM()); + $this->map(Ids::ELEMENT_14, fn() => VanillaBlocks::ELEMENT_SILICON()); + $this->map(Ids::ELEMENT_15, fn() => VanillaBlocks::ELEMENT_PHOSPHORUS()); + $this->map(Ids::ELEMENT_16, fn() => VanillaBlocks::ELEMENT_SULFUR()); + $this->map(Ids::ELEMENT_17, fn() => VanillaBlocks::ELEMENT_CHLORINE()); + $this->map(Ids::ELEMENT_18, fn() => VanillaBlocks::ELEMENT_ARGON()); + $this->map(Ids::ELEMENT_19, fn() => VanillaBlocks::ELEMENT_POTASSIUM()); + $this->map(Ids::ELEMENT_2, fn() => VanillaBlocks::ELEMENT_HELIUM()); + $this->map(Ids::ELEMENT_20, fn() => VanillaBlocks::ELEMENT_CALCIUM()); + $this->map(Ids::ELEMENT_21, fn() => VanillaBlocks::ELEMENT_SCANDIUM()); + $this->map(Ids::ELEMENT_22, fn() => VanillaBlocks::ELEMENT_TITANIUM()); + $this->map(Ids::ELEMENT_23, fn() => VanillaBlocks::ELEMENT_VANADIUM()); + $this->map(Ids::ELEMENT_24, fn() => VanillaBlocks::ELEMENT_CHROMIUM()); + $this->map(Ids::ELEMENT_25, fn() => VanillaBlocks::ELEMENT_MANGANESE()); + $this->map(Ids::ELEMENT_26, fn() => VanillaBlocks::ELEMENT_IRON()); + $this->map(Ids::ELEMENT_27, fn() => VanillaBlocks::ELEMENT_COBALT()); + $this->map(Ids::ELEMENT_28, fn() => VanillaBlocks::ELEMENT_NICKEL()); + $this->map(Ids::ELEMENT_29, fn() => VanillaBlocks::ELEMENT_COPPER()); + $this->map(Ids::ELEMENT_3, fn() => VanillaBlocks::ELEMENT_LITHIUM()); + $this->map(Ids::ELEMENT_30, fn() => VanillaBlocks::ELEMENT_ZINC()); + $this->map(Ids::ELEMENT_31, fn() => VanillaBlocks::ELEMENT_GALLIUM()); + $this->map(Ids::ELEMENT_32, fn() => VanillaBlocks::ELEMENT_GERMANIUM()); + $this->map(Ids::ELEMENT_33, fn() => VanillaBlocks::ELEMENT_ARSENIC()); + $this->map(Ids::ELEMENT_34, fn() => VanillaBlocks::ELEMENT_SELENIUM()); + $this->map(Ids::ELEMENT_35, fn() => VanillaBlocks::ELEMENT_BROMINE()); + $this->map(Ids::ELEMENT_36, fn() => VanillaBlocks::ELEMENT_KRYPTON()); + $this->map(Ids::ELEMENT_37, fn() => VanillaBlocks::ELEMENT_RUBIDIUM()); + $this->map(Ids::ELEMENT_38, fn() => VanillaBlocks::ELEMENT_STRONTIUM()); + $this->map(Ids::ELEMENT_39, fn() => VanillaBlocks::ELEMENT_YTTRIUM()); + $this->map(Ids::ELEMENT_4, fn() => VanillaBlocks::ELEMENT_BERYLLIUM()); + $this->map(Ids::ELEMENT_40, fn() => VanillaBlocks::ELEMENT_ZIRCONIUM()); + $this->map(Ids::ELEMENT_41, fn() => VanillaBlocks::ELEMENT_NIOBIUM()); + $this->map(Ids::ELEMENT_42, fn() => VanillaBlocks::ELEMENT_MOLYBDENUM()); + $this->map(Ids::ELEMENT_43, fn() => VanillaBlocks::ELEMENT_TECHNETIUM()); + $this->map(Ids::ELEMENT_44, fn() => VanillaBlocks::ELEMENT_RUTHENIUM()); + $this->map(Ids::ELEMENT_45, fn() => VanillaBlocks::ELEMENT_RHODIUM()); + $this->map(Ids::ELEMENT_46, fn() => VanillaBlocks::ELEMENT_PALLADIUM()); + $this->map(Ids::ELEMENT_47, fn() => VanillaBlocks::ELEMENT_SILVER()); + $this->map(Ids::ELEMENT_48, fn() => VanillaBlocks::ELEMENT_CADMIUM()); + $this->map(Ids::ELEMENT_49, fn() => VanillaBlocks::ELEMENT_INDIUM()); + $this->map(Ids::ELEMENT_5, fn() => VanillaBlocks::ELEMENT_BORON()); + $this->map(Ids::ELEMENT_50, fn() => VanillaBlocks::ELEMENT_TIN()); + $this->map(Ids::ELEMENT_51, fn() => VanillaBlocks::ELEMENT_ANTIMONY()); + $this->map(Ids::ELEMENT_52, fn() => VanillaBlocks::ELEMENT_TELLURIUM()); + $this->map(Ids::ELEMENT_53, fn() => VanillaBlocks::ELEMENT_IODINE()); + $this->map(Ids::ELEMENT_54, fn() => VanillaBlocks::ELEMENT_XENON()); + $this->map(Ids::ELEMENT_55, fn() => VanillaBlocks::ELEMENT_CESIUM()); + $this->map(Ids::ELEMENT_56, fn() => VanillaBlocks::ELEMENT_BARIUM()); + $this->map(Ids::ELEMENT_57, fn() => VanillaBlocks::ELEMENT_LANTHANUM()); + $this->map(Ids::ELEMENT_58, fn() => VanillaBlocks::ELEMENT_CERIUM()); + $this->map(Ids::ELEMENT_59, fn() => VanillaBlocks::ELEMENT_PRASEODYMIUM()); + $this->map(Ids::ELEMENT_6, fn() => VanillaBlocks::ELEMENT_CARBON()); + $this->map(Ids::ELEMENT_60, fn() => VanillaBlocks::ELEMENT_NEODYMIUM()); + $this->map(Ids::ELEMENT_61, fn() => VanillaBlocks::ELEMENT_PROMETHIUM()); + $this->map(Ids::ELEMENT_62, fn() => VanillaBlocks::ELEMENT_SAMARIUM()); + $this->map(Ids::ELEMENT_63, fn() => VanillaBlocks::ELEMENT_EUROPIUM()); + $this->map(Ids::ELEMENT_64, fn() => VanillaBlocks::ELEMENT_GADOLINIUM()); + $this->map(Ids::ELEMENT_65, fn() => VanillaBlocks::ELEMENT_TERBIUM()); + $this->map(Ids::ELEMENT_66, fn() => VanillaBlocks::ELEMENT_DYSPROSIUM()); + $this->map(Ids::ELEMENT_67, fn() => VanillaBlocks::ELEMENT_HOLMIUM()); + $this->map(Ids::ELEMENT_68, fn() => VanillaBlocks::ELEMENT_ERBIUM()); + $this->map(Ids::ELEMENT_69, fn() => VanillaBlocks::ELEMENT_THULIUM()); + $this->map(Ids::ELEMENT_7, fn() => VanillaBlocks::ELEMENT_NITROGEN()); + $this->map(Ids::ELEMENT_70, fn() => VanillaBlocks::ELEMENT_YTTERBIUM()); + $this->map(Ids::ELEMENT_71, fn() => VanillaBlocks::ELEMENT_LUTETIUM()); + $this->map(Ids::ELEMENT_72, fn() => VanillaBlocks::ELEMENT_HAFNIUM()); + $this->map(Ids::ELEMENT_73, fn() => VanillaBlocks::ELEMENT_TANTALUM()); + $this->map(Ids::ELEMENT_74, fn() => VanillaBlocks::ELEMENT_TUNGSTEN()); + $this->map(Ids::ELEMENT_75, fn() => VanillaBlocks::ELEMENT_RHENIUM()); + $this->map(Ids::ELEMENT_76, fn() => VanillaBlocks::ELEMENT_OSMIUM()); + $this->map(Ids::ELEMENT_77, fn() => VanillaBlocks::ELEMENT_IRIDIUM()); + $this->map(Ids::ELEMENT_78, fn() => VanillaBlocks::ELEMENT_PLATINUM()); + $this->map(Ids::ELEMENT_79, fn() => VanillaBlocks::ELEMENT_GOLD()); + $this->map(Ids::ELEMENT_8, fn() => VanillaBlocks::ELEMENT_OXYGEN()); + $this->map(Ids::ELEMENT_80, fn() => VanillaBlocks::ELEMENT_MERCURY()); + $this->map(Ids::ELEMENT_81, fn() => VanillaBlocks::ELEMENT_THALLIUM()); + $this->map(Ids::ELEMENT_82, fn() => VanillaBlocks::ELEMENT_LEAD()); + $this->map(Ids::ELEMENT_83, fn() => VanillaBlocks::ELEMENT_BISMUTH()); + $this->map(Ids::ELEMENT_84, fn() => VanillaBlocks::ELEMENT_POLONIUM()); + $this->map(Ids::ELEMENT_85, fn() => VanillaBlocks::ELEMENT_ASTATINE()); + $this->map(Ids::ELEMENT_86, fn() => VanillaBlocks::ELEMENT_RADON()); + $this->map(Ids::ELEMENT_87, fn() => VanillaBlocks::ELEMENT_FRANCIUM()); + $this->map(Ids::ELEMENT_88, fn() => VanillaBlocks::ELEMENT_RADIUM()); + $this->map(Ids::ELEMENT_89, fn() => VanillaBlocks::ELEMENT_ACTINIUM()); + $this->map(Ids::ELEMENT_9, fn() => VanillaBlocks::ELEMENT_FLUORINE()); + $this->map(Ids::ELEMENT_90, fn() => VanillaBlocks::ELEMENT_THORIUM()); + $this->map(Ids::ELEMENT_91, fn() => VanillaBlocks::ELEMENT_PROTACTINIUM()); + $this->map(Ids::ELEMENT_92, fn() => VanillaBlocks::ELEMENT_URANIUM()); + $this->map(Ids::ELEMENT_93, fn() => VanillaBlocks::ELEMENT_NEPTUNIUM()); + $this->map(Ids::ELEMENT_94, fn() => VanillaBlocks::ELEMENT_PLUTONIUM()); + $this->map(Ids::ELEMENT_95, fn() => VanillaBlocks::ELEMENT_AMERICIUM()); + $this->map(Ids::ELEMENT_96, fn() => VanillaBlocks::ELEMENT_CURIUM()); + $this->map(Ids::ELEMENT_97, fn() => VanillaBlocks::ELEMENT_BERKELIUM()); + $this->map(Ids::ELEMENT_98, fn() => VanillaBlocks::ELEMENT_CALIFORNIUM()); + $this->map(Ids::ELEMENT_99, fn() => VanillaBlocks::ELEMENT_EINSTEINIUM()); + $this->map(Ids::EMERALD_BLOCK, fn() => VanillaBlocks::EMERALD()); + $this->map(Ids::EMERALD_ORE, fn() => VanillaBlocks::EMERALD_ORE()); + $this->map(Ids::ENCHANTING_TABLE, fn() => VanillaBlocks::ENCHANTING_TABLE()); + $this->map(Ids::END_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::END_STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::END_BRICKS, fn() => VanillaBlocks::END_STONE_BRICKS()); + $this->map(Ids::END_PORTAL_FRAME, function(BlockStateReader $in) : Block{ + return VanillaBlocks::END_PORTAL_FRAME() + ->setEye($in->readBool(BlockStateNames::END_PORTAL_EYE_BIT)) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::END_ROD, function(BlockStateReader $in) : Block{ + return VanillaBlocks::END_ROD() + ->setFacing($in->readFacingDirection()); + }); + $this->map(Ids::END_STONE, fn() => VanillaBlocks::END_STONE()); + $this->map(Ids::ENDER_CHEST, function(BlockStateReader $in) : Block{ + return VanillaBlocks::ENDER_CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::FARMLAND, function(BlockStateReader $in) : Block{ + return VanillaBlocks::FARMLAND() + ->setWetness($in->readBoundedInt(BlockStateNames::MOISTURIZED_AMOUNT, 0, 7)); + }); + $this->map(Ids::FENCE, function(BlockStateReader $in) : Block{ + return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), + default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), + }; + }); + $this->map(Ids::FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::OAK_FENCE_GATE(), $in)); + $this->map(Ids::FIRE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::FIRE() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + }); + $this->map(Ids::FLETCHING_TABLE, fn() => VanillaBlocks::FLETCHING_TABLE()); + $this->map(Ids::FLOWER_POT, function() : Block{ + //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) + return VanillaBlocks::FLOWER_POT(); + }); + $this->map(Ids::FLOWING_LAVA, fn(BlockStateReader $in) => Helper::decodeFlowingLiquid(VanillaBlocks::LAVA(), $in)); + $this->map(Ids::FLOWING_WATER, fn(BlockStateReader $in) => Helper::decodeFlowingLiquid(VanillaBlocks::WATER(), $in)); + $this->map(Ids::FRAME, function(BlockStateReader $in) : Block{ + //TODO: in R13 this can be any side, not just horizontal + return VanillaBlocks::ITEM_FRAME() + ->setFacing($in->readHorizontalFacing()) + ->setHasMap($in->readBool(BlockStateNames::ITEM_FRAME_MAP_BIT)); + }); + $this->map(Ids::FROSTED_ICE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::FROSTED_ICE() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 3)); + }); + $this->map(Ids::FURNACE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->map(Ids::GLASS, fn() => VanillaBlocks::GLASS()); + $this->map(Ids::GLASS_PANE, fn() => VanillaBlocks::GLASS_PANE()); + $this->map(Ids::GLOWINGOBSIDIAN, fn() => VanillaBlocks::GLOWING_OBSIDIAN()); + $this->map(Ids::GLOWSTONE, fn() => VanillaBlocks::GLOWSTONE()); + $this->map(Ids::GOLD_BLOCK, fn() => VanillaBlocks::GOLD()); + $this->map(Ids::GOLD_ORE, fn() => VanillaBlocks::GOLD_ORE()); + $this->map(Ids::GOLDEN_RAIL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::POWERED_RAIL() + ->setPowered($in->readBool(BlockStateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + }); + $this->map(Ids::GRANITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::GRANITE_STAIRS(), $in)); + $this->map(Ids::GRASS, fn() => VanillaBlocks::GRASS()); + $this->map(Ids::GRASS_PATH, fn() => VanillaBlocks::GRASS_PATH()); + $this->map(Ids::GRAVEL, fn() => VanillaBlocks::GRAVEL()); + $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::HARD_GLASS, fn() => VanillaBlocks::HARDENED_GLASS()); + $this->map(Ids::HARD_GLASS_PANE, fn() => VanillaBlocks::HARDENED_GLASS_PANE()); + $this->map(Ids::HARD_STAINED_GLASS, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_HARDENED_GLASS() + ->setColor($in->readColor()); + }); + $this->map(Ids::HARD_STAINED_GLASS_PANE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_HARDENED_GLASS_PANE() + ->setColor($in->readColor()); + }); + $this->map(Ids::HARDENED_CLAY, fn() => VanillaBlocks::HARDENED_CLAY()); + $this->map(Ids::HAY_BLOCK, function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored "deprecated" blockstate (useless) + return VanillaBlocks::HAY_BALE()->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + }); + $this->map(Ids::HOPPER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::HOPPER() + ->setFacing($in->readFacingWithoutUp()) + ->setPowered($in->readBool(BlockStateNames::TOGGLE_BIT)); + }); + $this->map(Ids::ICE, fn() => VanillaBlocks::ICE()); + $this->map(Ids::INFO_UPDATE, fn() => VanillaBlocks::INFO_UPDATE()); + $this->map(Ids::INFO_UPDATE2, fn() => VanillaBlocks::INFO_UPDATE2()); + $this->map(Ids::INVISIBLEBEDROCK, fn() => VanillaBlocks::INVISIBLE_BEDROCK()); + $this->map(Ids::IRON_BARS, fn() => VanillaBlocks::IRON_BARS()); + $this->map(Ids::IRON_BLOCK, fn() => VanillaBlocks::IRON()); + $this->map(Ids::IRON_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::IRON_DOOR(), $in)); + $this->map(Ids::IRON_ORE, fn() => VanillaBlocks::IRON_ORE()); + $this->map(Ids::IRON_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::IRON_TRAPDOOR(), $in)); + $this->map(Ids::JUKEBOX, fn() => VanillaBlocks::JUKEBOX()); + $this->map(Ids::JUNGLE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::JUNGLE_BUTTON(), $in)); + $this->map(Ids::JUNGLE_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::JUNGLE_DOOR(), $in)); + $this->map(Ids::JUNGLE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::JUNGLE_FENCE_GATE(), $in)); + $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), $in)); + $this->map(Ids::JUNGLE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::JUNGLE_STAIRS(), $in)); + $this->map(Ids::JUNGLE_STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::JUNGLE_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::JUNGLE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::JUNGLE_TRAPDOOR(), $in)); + $this->map(Ids::JUNGLE_WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::JUNGLE_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::LADDER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LADDER() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::LANTERN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LANTERN() + ->setHanging($in->readBool(BlockStateNames::HANGING)); + }); + $this->map(Ids::LAPIS_BLOCK, fn() => VanillaBlocks::LAPIS_LAZULI()); + $this->map(Ids::LAPIS_ORE, fn() => VanillaBlocks::LAPIS_LAZULI_ORE()); + $this->map(Ids::LAVA, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::LAVA(), $in)); + $this->map(Ids::LEAVES, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::OLD_LEAF_TYPE)){ + StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), + StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), + StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), + StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), + default => throw $in->badValueException(BlockStateNames::OLD_LEAF_TYPE, $type), + }) + ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(BlockStateNames::UPDATE_BIT)); + }); + $this->map(Ids::LEAVES2, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::NEW_LEAF_TYPE)){ + StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), + StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), + default => throw $in->badValueException(BlockStateNames::NEW_LEAF_TYPE, $type), + }) + ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(BlockStateNames::UPDATE_BIT)); + }); + $this->map(Ids::LECTERN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LECTERN() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setProducingSignal($in->readBool(BlockStateNames::POWERED_BIT)); + }); + $this->map(Ids::LEVER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LEVER() + ->setActivated($in->readBool(BlockStateNames::OPEN_BIT)) + ->setFacing(match($value = $in->readString(BlockStateNames::LEVER_DIRECTION)){ + StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), + StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), + StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), + StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), + StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), + StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), + StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), + StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), + default => throw $in->badValueException(BlockStateNames::LEVER_DIRECTION, $value), + }); + }); + $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + }); + $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIT_BLAST_FURNACE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BLAST_FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->map(Ids::LIT_FURNACE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->map(Ids::LIT_PUMPKIN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LIT_PUMPKIN() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::LIT_REDSTONE_LAMP, function() : Block{ + return VanillaBlocks::REDSTONE_LAMP() + ->setPowered(true); + }); + $this->map(Ids::LIT_REDSTONE_ORE, function() : Block{ + return VanillaBlocks::REDSTONE_ORE() + ->setLit(true); + }); + $this->map(Ids::LIT_SMOKER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SMOKER() + ->setFacing($in->readHorizontalFacing()) + ->setLit(true); + }); + $this->map(Ids::LOG, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::OLD_LOG_TYPE)){ + StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), + StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), + StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), + StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), + default => throw $in->badValueException(BlockStateNames::OLD_LOG_TYPE, $type), + }) + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::LOG2, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::NEW_LOG_TYPE)){ + StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), + StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), + default => throw $in->badValueException(BlockStateNames::NEW_LOG_TYPE, $type), + }) + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::LOOM, function(BlockStateReader $in) : Block{ + return VanillaBlocks::LOOM() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::MAGMA, fn() => VanillaBlocks::MAGMA()); + $this->map(Ids::MELON_BLOCK, fn() => VanillaBlocks::MELON()); + $this->map(Ids::MELON_STEM, fn(BlockStateReader $in) => Helper::decodeStem(VanillaBlocks::MELON_STEM(), $in)); + $this->map(Ids::MOB_SPAWNER, fn() => VanillaBlocks::MONSTER_SPAWNER()); + $this->map(Ids::MONSTER_EGG, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::MONSTER_EGG_STONE_TYPE)){ + StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), + StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), + default => throw $in->badValueException(BlockStateNames::MONSTER_EGG_STONE_TYPE, $type), + }; + }); + $this->map(Ids::MOSSY_COBBLESTONE, fn() => VanillaBlocks::MOSSY_COBBLESTONE()); + $this->map(Ids::MOSSY_COBBLESTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), $in)); + $this->map(Ids::MOSSY_STONE_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::MYCELIUM, fn() => VanillaBlocks::MYCELIUM()); + $this->map(Ids::NETHER_BRICK, fn() => VanillaBlocks::NETHER_BRICKS()); + $this->map(Ids::NETHER_BRICK_FENCE, fn() => VanillaBlocks::NETHER_BRICK_FENCE()); + $this->map(Ids::NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::NETHER_BRICK_STAIRS(), $in)); + $this->map(Ids::NETHER_WART, function(BlockStateReader $in) : Block{ + return VanillaBlocks::NETHER_WART() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 3)); + }); + $this->map(Ids::NETHER_WART_BLOCK, fn() => VanillaBlocks::NETHER_WART_BLOCK()); + $this->map(Ids::NETHERRACK, fn() => VanillaBlocks::NETHERRACK()); + $this->map(Ids::NETHERREACTOR, fn() => VanillaBlocks::NETHER_REACTOR_CORE()); + $this->map(Ids::NORMAL_STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::STONE_STAIRS(), $in)); + $this->map(Ids::NOTEBLOCK, fn() => VanillaBlocks::NOTE_BLOCK()); + $this->map(Ids::OAK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::OAK_STAIRS(), $in)); + $this->map(Ids::OBSIDIAN, fn() => VanillaBlocks::OBSIDIAN()); + $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PACKED_ICE, fn() => VanillaBlocks::PACKED_ICE()); + $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PLANKS, function(BlockStateReader $in) : Block{ + return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), + default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), + }; + }); + $this->map(Ids::PODZOL, fn() => VanillaBlocks::PODZOL()); + $this->map(Ids::POLISHED_ANDESITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), $in)); + $this->map(Ids::POLISHED_DIORITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_DIORITE_STAIRS(), $in)); + $this->map(Ids::POLISHED_GRANITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_GRANITE_STAIRS(), $in)); + $this->map(Ids::PORTAL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::NETHER_PORTAL() + ->setAxis(match($value = $in->readString(BlockStateNames::PORTAL_AXIS)){ + StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, + StringValues::PORTAL_AXIS_X => Axis::X, + StringValues::PORTAL_AXIS_Z => Axis::Z, + default => throw $in->badValueException(BlockStateNames::PORTAL_AXIS, $value), + }); + }); + $this->map(Ids::POTATOES, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::POTATOES(), $in)); + $this->map(Ids::POWERED_COMPARATOR, fn(BlockStateReader $in) => Helper::decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); + $this->map(Ids::POWERED_REPEATER, fn(BlockStateReader $in) => Helper::decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + ->setPowered(true)); + $this->map(Ids::PRISMARINE, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::PRISMARINE_BLOCK_TYPE)){ + StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), + StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), + StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), + default => throw $in->badValueException(BlockStateNames::PRISMARINE_BLOCK_TYPE, $type), + }; + }); + $this->map(Ids::PRISMARINE_BRICKS_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), $in)); + $this->map(Ids::PRISMARINE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PRISMARINE_STAIRS(), $in)); + $this->map(Ids::PUMPKIN, function() : Block{ + //TODO: intentionally ignored "direction" property (obsolete) + return VanillaBlocks::PUMPKIN(); + }); + $this->map(Ids::PUMPKIN_STEM, fn(BlockStateReader $in) => Helper::decodeStem(VanillaBlocks::PUMPKIN_STEM(), $in)); + $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PURPUR_BLOCK, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ + StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), + default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), + }; + }); + $this->map(Ids::PURPUR_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); + $this->map(Ids::QUARTZ_BLOCK, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ + StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) + default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), + }; + }); + $this->map(Ids::QUARTZ_ORE, fn() => VanillaBlocks::NETHER_QUARTZ_ORE()); + $this->map(Ids::QUARTZ_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::QUARTZ_STAIRS(), $in)); + $this->map(Ids::RAIL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::RAIL() + ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 9)); + }); + $this->map(Ids::RED_FLOWER, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::FLOWER_TYPE)){ + StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), + StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), + StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? + StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), + StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), + StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), + StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), + StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), + StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), + StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), + StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), + default => throw $in->badValueException(BlockStateNames::FLOWER_TYPE, $type), + }; + }); + $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::RED_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::RED_MUSHROOM, fn() => VanillaBlocks::RED_MUSHROOM()); + $this->map(Ids::RED_MUSHROOM_BLOCK, fn(BlockStateReader $in) => Helper::decodeMushroomBlock(VanillaBlocks::RED_MUSHROOM_BLOCK(), $in)); + $this->map(Ids::RED_NETHER_BRICK, fn() => VanillaBlocks::RED_NETHER_BRICKS()); + $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); + $this->map(Ids::RED_SANDSTONE, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), + default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), + }; + }); + $this->map(Ids::RED_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::REDSTONE_BLOCK, fn() => VanillaBlocks::REDSTONE()); + $this->map(Ids::REDSTONE_LAMP, function() : Block{ + return VanillaBlocks::REDSTONE_LAMP() + ->setPowered(false); + }); + $this->map(Ids::REDSTONE_ORE, function() : Block{ + return VanillaBlocks::REDSTONE_ORE() + ->setLit(false); + }); + $this->map(Ids::REDSTONE_TORCH, function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_TORCH() + ->setFacing($in->readTorchFacing()) + ->setLit(true); + }); + $this->map(Ids::REDSTONE_WIRE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_WIRE() + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + }); + $this->map(Ids::REEDS, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SUGARCANE() + ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + }); + $this->map(Ids::RESERVED6, fn() => VanillaBlocks::RESERVED6()); + $this->map(Ids::SAND, function(BlockStateReader $in) : Block{ + return match($value = $in->readString(BlockStateNames::SAND_TYPE)){ + StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), + StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), + default => throw $in->badValueException(BlockStateNames::SAND_TYPE, $value), + }; + }); + $this->map(Ids::SANDSTONE, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), + default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), + }; + }); + $this->map(Ids::SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SAPLING, function(BlockStateReader $in) : Block{ + return (match($type = $in->readString(BlockStateNames::SAPLING_TYPE)){ + StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), + StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), + StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), + StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), + StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), + StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), + default => throw $in->badValueException(BlockStateNames::SAPLING_TYPE, $type), + }) + ->setReady($in->readBool(BlockStateNames::AGE_BIT)); + }); + $this->map(Ids::SEALANTERN, fn() => VanillaBlocks::SEA_LANTERN()); + $this->map(Ids::SEA_PICKLE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SEA_PICKLE() + ->setCount($in->readBoundedInt(BlockStateNames::CLUSTER_COUNT, 0, 3) + 1) + ->setUnderwater(!$in->readBool(BlockStateNames::DEAD_BIT)); + }); + $this->map(Ids::SHULKER_BOX, function(BlockStateReader $in) : Block{ + return VanillaBlocks::DYED_SHULKER_BOX() + ->setColor($in->readColor()); + }); + $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::SKULL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::MOB_HEAD() + ->setFacing($in->readFacingWithoutDown()) + ->setNoDrops($in->readBool(BlockStateNames::NO_DROP_BIT)); + }); + $this->map(Ids::SLIME, fn() => VanillaBlocks::SLIME()); + $this->map(Ids::SMOKER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SMOKER() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->map(Ids::SMOOTH_QUARTZ_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), $in)); + $this->map(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SMOOTH_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SMOOTH_STONE, fn() => VanillaBlocks::SMOOTH_STONE()); + $this->map(Ids::SNOW, fn() => VanillaBlocks::SNOW()); + $this->map(Ids::SNOW_LAYER, function(BlockStateReader $in) : Block{ + //TODO: intentionally ignored covered_bit property (appears useless and we don't track it) + return VanillaBlocks::SNOW_LAYER()->setLayers($in->readBoundedInt(BlockStateNames::HEIGHT, 0, 7) + 1); + }); + $this->map(Ids::SOUL_SAND, fn() => VanillaBlocks::SOUL_SAND()); + $this->map(Ids::SPONGE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNames::SPONGE_TYPE)){ + StringValues::SPONGE_TYPE_DRY => false, + StringValues::SPONGE_TYPE_WET => true, + default => throw $in->badValueException(BlockStateNames::SPONGE_TYPE, $type), + }); + }); + $this->map(Ids::SPRUCE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::SPRUCE_BUTTON(), $in)); + $this->map(Ids::SPRUCE_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::SPRUCE_DOOR(), $in)); + $this->map(Ids::SPRUCE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::SPRUCE_FENCE_GATE(), $in)); + $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), $in)); + $this->map(Ids::SPRUCE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SPRUCE_STAIRS(), $in)); + $this->map(Ids::SPRUCE_STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPRUCE_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::SPRUCE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::SPRUCE_TRAPDOOR(), $in)); + $this->map(Ids::SPRUCE_WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::SPRUCE_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::STAINED_GLASS, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_GLASS() + ->setColor($in->readColor()); + }); + $this->map(Ids::STAINED_GLASS_PANE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_GLASS_PANE() + ->setColor($in->readColor()); + }); + $this->map(Ids::STAINED_HARDENED_CLAY, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STAINED_CLAY() + ->setColor($in->readColor()); + }); + $this->map(Ids::STANDING_BANNER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::BANNER() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::STANDING_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::OAK_SIGN() + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + }); + $this->map(Ids::STONE, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::STONE_TYPE)){ + StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), + StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), + StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), + StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), + StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), + StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), + StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), + default => throw $in->badValueException(BlockStateNames::STONE_TYPE, $type), + }; + }); + $this->map(Ids::STONE_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::STONE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::STONE_BUTTON(), $in)); + $this->map(Ids::STONE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::STONE_PRESSURE_PLATE(), $in)); + $this->map(Ids::STONE_SLAB, fn(BlockStateReader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB2, fn(BlockStateReader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB3, fn(BlockStateReader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB4, fn(BlockStateReader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); + $this->map(Ids::STONEBRICK, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::STONE_BRICK_TYPE)){ + StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla + StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), + default => throw $in->badValueException(BlockStateNames::STONE_BRICK_TYPE, $type), + }; + }); + $this->map(Ids::STONECUTTER, fn() => VanillaBlocks::LEGACY_STONECUTTER()); + $this->map(Ids::STRIPPED_ACACIA_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_ACACIA_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::STRIPPED_BIRCH_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_BIRCH_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::STRIPPED_DARK_OAK_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_DARK_OAK_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::STRIPPED_JUNGLE_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_JUNGLE_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::STRIPPED_OAK_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_OAK_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::STRIPPED_SPRUCE_LOG, function(BlockStateReader $in) : Block{ + return VanillaBlocks::STRIPPED_SPRUCE_LOG() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::SWEET_BERRY_BUSH, function(BlockStateReader $in) : Block{ + //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 + $growth = $in->readBoundedInt(BlockStateNames::GROWTH, 0, 7); + return VanillaBlocks::SWEET_BERRY_BUSH() + ->setAge(min($growth, SweetBerryBush::STAGE_MATURE)); + }); + $this->map(Ids::TALLGRASS, function(BlockStateReader $in) : Block{ + return match($type = $in->readString(BlockStateNames::TALL_GRASS_TYPE)){ + StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), + StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), + default => throw $in->badValueException(BlockStateNames::TALL_GRASS_TYPE, $type), + }; + }); + $this->map(Ids::TNT, function(BlockStateReader $in) : Block{ + return VanillaBlocks::TNT() + ->setUnstable($in->readBool(BlockStateNames::EXPLODE_BIT)) + ->setWorksUnderwater($in->readBool(BlockStateNames::ALLOW_UNDERWATER_BIT)); + }); + $this->map(Ids::TORCH, function(BlockStateReader $in) : Block{ + return VanillaBlocks::TORCH() + ->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::OAK_TRAPDOOR(), $in)); + $this->map(Ids::TRAPPED_CHEST, function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRAPPED_CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::TRIPWIRE, function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRIPWIRE() + ->setConnected($in->readBool(BlockStateNames::ATTACHED_BIT)) + ->setDisarmed($in->readBool(BlockStateNames::DISARMED_BIT)) + ->setSuspended($in->readBool(BlockStateNames::SUSPENDED_BIT)) + ->setTriggered($in->readBool(BlockStateNames::POWERED_BIT)); + }); + $this->map(Ids::TRIPWIRE_HOOK, function(BlockStateReader $in) : Block{ + return VanillaBlocks::TRIPWIRE_HOOK() + ->setConnected($in->readBool(BlockStateNames::ATTACHED_BIT)) + ->setFacing($in->readLegacyHorizontalFacing()) + ->setPowered($in->readBool(BlockStateNames::POWERED_BIT)); + }); + $this->map(Ids::UNDERWATER_TORCH, function(BlockStateReader $in) : Block{ + return VanillaBlocks::UNDERWATER_TORCH() + ->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::UNDYED_SHULKER_BOX, fn() => VanillaBlocks::SHULKER_BOX()); + $this->map(Ids::UNLIT_REDSTONE_TORCH, function(BlockStateReader $in) : Block{ + return VanillaBlocks::REDSTONE_TORCH() + ->setFacing($in->readTorchFacing()) + ->setLit(false); + }); + $this->map(Ids::UNPOWERED_COMPARATOR, fn(BlockStateReader $in) => Helper::decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); + $this->map(Ids::UNPOWERED_REPEATER, fn(BlockStateReader $in) => Helper::decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + ->setPowered(false)); + $this->map(Ids::VINE, function(BlockStateReader $in) : Block{ + $vineDirectionFlags = $in->readBoundedInt(BlockStateNames::VINE_DIRECTION_BITS, 0, 15); + return VanillaBlocks::VINES() + ->setFace(Facing::NORTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_NORTH) !== 0) + ->setFace(Facing::SOUTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_SOUTH) !== 0) + ->setFace(Facing::WEST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_WEST) !== 0) + ->setFace(Facing::EAST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_EAST) !== 0); + }); + $this->map(Ids::WALL_BANNER, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WALL_BANNER() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::WALL_SIGN, function(BlockStateReader $in) : Block{ + return VanillaBlocks::OAK_WALL_SIGN() + ->setFacing($in->readHorizontalFacing()); + }); + $this->map(Ids::WATER, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::WATER(), $in)); + $this->map(Ids::WATERLILY, fn() => VanillaBlocks::LILY_PAD()); + $this->map(Ids::WEB, fn() => VanillaBlocks::COBWEB()); + $this->map(Ids::WHEAT, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::WHEAT(), $in)); + $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::WOOD, function(BlockStateReader $in) : Block{ + //TODO: our impl doesn't support axis yet + $stripped = $in->readBool(BlockStateNames::STRIPPED_BIT); + return match($woodType = $in->readString(BlockStateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), + default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodType), + }; + }); + $this->map(Ids::WOODEN_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::OAK_BUTTON(), $in)); + $this->map(Ids::WOODEN_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::OAK_DOOR(), $in)); + $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::OAK_PRESSURE_PLATE(), $in)); + $this->map(Ids::WOODEN_SLAB, fn(BlockStateReader $in) => Helper::mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::WOOL, function(BlockStateReader $in) : Block{ + return VanillaBlocks::WOOL() + ->setColor($in->readColor()); + }); + $this->map(Ids::YELLOW_FLOWER, fn() => VanillaBlocks::DANDELION()); + $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), $in)); + //$this->map(Ids::ALLOW, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::AMETHYST_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::AMETHYST_CLUSTER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::ANCIENT_DEBRIS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::AZALEA, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::AZALEA_LEAVES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::AZALEA_LEAVES_FLOWERED, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BASALT, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::BEE_NEST, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::BEEHIVE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::BIG_DRIPLEAF, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * big_dripleaf_head (ByteTag) = 0, 1 + * big_dripleaf_tilt (StringTag) = full_tilt, none, partial_tilt, unstable + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::BLACK_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLACK_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLACKSTONE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::BLACKSTONE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLACKSTONE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLACKSTONE_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::BLACKSTONE_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLUE_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BLUE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BORDER_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BROWN_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BROWN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BUBBLE_COLUMN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * drag_down (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::BUDDING_AMETHYST, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CALCITE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CAMERA, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CAMPFIRE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * extinguished (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CARTOGRAPHY_TABLE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CAULDRON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * cauldron_liquid (StringTag) = lava, powder_snow, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->map(Ids::CAVE_VINES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::CHAIN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::CHAIN_COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::CHISELED_DEEPSLATE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CHISELED_NETHER_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CHISELED_POLISHED_BLACKSTONE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CHORUS_FLOWER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * age (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::CHORUS_PLANT, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CLIENT_REQUEST_PLACEHOLDER_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::COBBLED_DEEPSLATE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::COBBLED_DEEPSLATE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::COBBLED_DEEPSLATE_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::COBBLED_DEEPSLATE_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::COMPOSTER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 + */ + //}); + //$this->map(Ids::CONDUIT, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::COPPER_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::COPPER_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRACKED_DEEPSLATE_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRACKED_DEEPSLATE_TILES, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRACKED_NETHER_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_BUTTON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::CRIMSON_DOOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CRIMSON_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CRIMSON_FENCE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_FENCE_GATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CRIMSON_FUNGUS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_HYPHAE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::CRIMSON_NYLIUM, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_PLANKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::CRIMSON_ROOTS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CRIMSON_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CRIMSON_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::CRIMSON_STANDING_SIGN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::CRIMSON_STEM, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::CRIMSON_TRAPDOOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CRIMSON_WALL_SIGN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::CRYING_OBSIDIAN, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::CYAN_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::CYAN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_BRICK_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_BRICK_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::DEEPSLATE_BRICK_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_COAL_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_COPPER_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_DIAMOND_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_EMERALD_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_GOLD_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_IRON_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_LAPIS_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_REDSTONE_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DEEPSLATE_TILE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_TILE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_TILE_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::DEEPSLATE_TILE_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DEEPSLATE_TILES, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DENY, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DIRT_WITH_ROOTS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DISPENSER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::DRIPSTONE_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::DROPPER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::END_GATEWAY, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::END_PORTAL, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::EXPOSED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::EXPOSED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::EXPOSED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::EXPOSED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::FLOWERING_AZALEA, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::GILDED_BLACKSTONE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::GLOW_FRAME, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * item_frame_map_bit (ByteTag) = 0, 1 + * item_frame_photo_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::GLOW_LICHEN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + */ + //}); + //$this->map(Ids::GRAY_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::GRAY_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::GREEN_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::GREEN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::GRINDSTONE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * attachment (StringTag) = hanging, multiple, side, standing + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::HANGING_ROOTS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::HONEY_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::HONEYCOMB_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::INFESTED_DEEPSLATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::JIGSAW, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * rotation (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::KELP, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * kelp_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::LARGE_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::LAVA_CAULDRON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * cauldron_liquid (StringTag) = lava, powder_snow, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->map(Ids::LIGHT_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::LIGHT_BLUE_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIGHT_GRAY_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIGHTNING_ROD, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::LIME_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIME_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::LODESTONE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MAGENTA_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MAGENTA_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MEDIUM_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::MOSS_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MOSS_CARPET, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MOVINGBLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MYSTERIOUS_FRAME, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MYSTERIOUS_FRAME_SLOT, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::NETHER_GOLD_ORE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::NETHER_SPROUTS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::NETHERITE_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::OBSERVER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::ORANGE_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::ORANGE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::OXIDIZED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::OXIDIZED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::OXIDIZED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::OXIDIZED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::PINK_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::PINK_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::PISTON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::PISTONARMCOLLISION, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::POINTED_DRIPSTONE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * dripstone_thickness (StringTag) = base, frustum, merge, middle, tip + * hanging (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BASALT, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_BUTTON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::POLISHED_BLACKSTONE_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_DEEPSLATE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_DEEPSLATE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POLISHED_DEEPSLATE_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::POLISHED_DEEPSLATE_WALL, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::POWDER_SNOW, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::PURPLE_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::PURPLE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::QUARTZ_BRICKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::RAW_COPPER_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::RAW_GOLD_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::RAW_IRON_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::RED_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::RED_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::REPEATING_COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::RESPAWN_ANCHOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * respawn_anchor_charge (IntTag) = 0, 1, 2, 3, 4 + */ + //}); + //$this->map(Ids::SCAFFOLDING, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + * stability_check (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SCULK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::SCULK_CATALYST, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * bloom (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SCULK_SENSOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SCULK_SHRIEKER, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * active (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SCULK_VEIN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + */ + //}); + //$this->map(Ids::SEAGRASS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * sea_grass_type (StringTag) = default, double_bot, double_top + */ + //}); + //$this->map(Ids::SHROOMLIGHT, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::SMALL_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SMITHING_TABLE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::SMOOTH_BASALT, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::SOUL_CAMPFIRE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * extinguished (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SOUL_FIRE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::SOUL_LANTERN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * hanging (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::SOUL_SOIL, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::SOUL_TORCH, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(Ids::SPORE_BLOSSOM, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::STICKYPISTONARMCOLLISION, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::STICKY_PISTON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::STONECUTTER_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::STRIPPED_CRIMSON_HYPHAE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::STRIPPED_CRIMSON_STEM, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::STRIPPED_WARPED_HYPHAE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::STRIPPED_WARPED_STEM, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::STRUCTURE_BLOCK, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * structure_block_type (StringTag) = corner, data, export, invalid, load, save + */ + //}); + //$this->map(Ids::STRUCTURE_VOID, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * structure_void_type (StringTag) = air, void + */ + //}); + //$this->map(Ids::TARGET, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::TINTED_GLASS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::TUFF, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::TURTLE_EGG, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * cracked_state (StringTag) = cracked, max_cracked, no_cracks + * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg + */ + //}); + //$this->map(Ids::TWISTING_VINES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * twisting_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::UNKNOWN, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_BUTTON, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::WARPED_DOOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WARPED_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WARPED_FENCE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_FENCE_GATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WARPED_FUNGUS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_HYPHAE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::WARPED_NYLIUM, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_PLANKS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::WARPED_ROOTS, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WARPED_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WARPED_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WARPED_STANDING_SIGN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::WARPED_STEM, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::WARPED_TRAPDOOR, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WARPED_WALL_SIGN, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::WARPED_WART_BLOCK, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_EXPOSED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_OXIDIZED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_WEATHERED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WEATHERED_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WEATHERED_CUT_COPPER, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::WEATHERED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WEATHERED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WEEPING_VINES, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * weeping_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(Ids::WHITE_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WHITE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::WITHER_ROSE, function(BlockStateReader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::YELLOW_CANDLE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::YELLOW_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + } + + /** @throws BlockStateDeserializeException */ + public function deserialize(string $id, CompoundTag $blockState) : Block{ + if(!array_key_exists($id, $this->deserializeFuncs)){ + throw new BlockStateDeserializeException("Unknown block ID \"$id\""); + } + return $this->deserializeFuncs[$id](new BlockStateReader($blockState)); + } +} diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php new file mode 100644 index 0000000000..c73b4f7a5b --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -0,0 +1,257 @@ +setFacing($in->readFacingDirection()) + ->setPressed($in->readBool(BlockStateNames::BUTTON_PRESSED_BIT)); + } + + /** + * @phpstan-template TCrops of Crops + * @phpstan-param TCrops $block + * @phpstan-return TCrops + * + * @throws BlockStateDeserializeException + */ + public static function decodeCrops(Crops $block, BlockStateReader $in) : Crops{ + return $block->setAge($in->readBoundedInt(BlockStateNames::GROWTH, 0, 7)); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeComparator(RedstoneComparator $block, BlockStateReader $in) : RedstoneComparator{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setPowered($in->readBool(BlockStateNames::OUTPUT_LIT_BIT)) + ->setSubtractMode($in->readBool(BlockStateNames::OUTPUT_SUBTRACT_BIT)); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeDoor(Door $block, BlockStateReader $in) : Door{ + //TODO: check if these need any special treatment to get the appropriate data to both halves of the door + return $block + ->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)) + ->setFacing(Facing::rotateY($in->readLegacyHorizontalFacing(), false)) + ->setHingeRight($in->readBool(BlockStateNames::DOOR_HINGE_BIT)) + ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeFenceGate(FenceGate $block, BlockStateReader $in) : FenceGate{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setInWall($in->readBool(BlockStateNames::IN_WALL_BIT)) + ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeFloorCoralFan(BlockStateReader $in) : FloorCoralFan{ + return VanillaBlocks::CORAL_FAN() + ->setCoralType($in->readCoralType()) + ->setAxis(match($in->readBoundedInt(BlockStateNames::CORAL_FAN_DIRECTION, 0, 1)){ + 0 => Axis::X, + 1 => Axis::Z, + default => throw new AssumptionFailedError("readBoundedInt() should have prevented this"), + }); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeGlazedTerracotta(GlazedTerracotta $block, BlockStateReader $in) : GlazedTerracotta{ + return $block->setFacing($in->readHorizontalFacing()); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeLiquid(Liquid $block, BlockStateReader $in, bool $still) : Liquid{ + $fluidHeightState = $in->readBoundedInt(BlockStateNames::LIQUID_DEPTH, 0, 15); + return $block + ->setDecay($fluidHeightState & 0x7) + ->setFalling(($fluidHeightState & 0x1) !== 0) + ->setStill($still); + } + + public static function decodeFlowingLiquid(Liquid $block, BlockStateReader $in) : Liquid{ + return self::decodeLiquid($block, $in, false); + } + + public static function decodeStillLiquid(Liquid $block, BlockStateReader $in) : Liquid{ + return self::decodeLiquid($block, $in, true); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeMushroomBlock(RedMushroomBlock $block, BlockStateReader $in) : Block{ + switch($type = $in->readBoundedInt(BlockStateNames::HUGE_MUSHROOM_BITS, 0, 15)){ + case BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM: return VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(); + case BlockLegacyMetadata::MUSHROOM_BLOCK_STEM: return VanillaBlocks::MUSHROOM_STEM(); + default: + //invalid types get left as default + $type = MushroomBlockTypeIdMap::getInstance()->fromId($type); + return $type !== null ? $block->setMushroomBlockType($type) : $block; + } + } + + /** @throws BlockStateDeserializeException */ + public static function decodeRepeater(RedstoneRepeater $block, BlockStateReader $in) : RedstoneRepeater{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setDelay($in->readBoundedInt(BlockStateNames::REPEATER_DELAY, 0, 3) + 1); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeSimplePressurePlate(SimplePressurePlate $block, BlockStateReader $in) : SimplePressurePlate{ + //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? + //best to keep this separate from weighted plates anyway... + return $block->setPressed($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15) !== 0); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeStairs(Stair $block, BlockStateReader $in) : Stair{ + return $block + ->setUpsideDown($in->readBool(BlockStateNames::UPSIDE_DOWN_BIT)) + ->setFacing($in->readWeirdoHorizontalFacing()); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeStem(Stem $block, BlockStateReader $in) : Stem{ + //TODO: our stems don't support facings yet (facing_direction) + return self::decodeCrops($block, $in); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeTrapdoor(Trapdoor $block, BlockStateReader $in) : Trapdoor{ + return $block + ->setFacing($in->readLegacyHorizontalFacing()) + ->setTop($in->readBool(BlockStateNames::UPSIDE_DOWN_BIT)) + ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeWall(Wall $block, BlockStateReader $in) : Wall{ + //TODO: our walls don't support the full range of needed states yet + return $block; + } + + /** @throws BlockStateDeserializeException */ + public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ + //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood + return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE)){ + StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), + StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), + default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + public static function mapStoneSlab2Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone + return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_2)){ + StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), + default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_2, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + public static function mapStoneSlab3Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone + return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_3)){ + StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), + default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_3, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + public static function mapStoneSlab4Type(BlockStateReader $in) : Slab{ + // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone + return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_4)){ + StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), + default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_4, $type), + }; + } + + /** @throws BlockStateDeserializeException */ + public static function mapWoodenSlabType(BlockStateReader $in) : Slab{ + // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + return match($type = $in->readString(BlockStateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), + default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $type), + }; + } +} diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php b/src/data/bedrock/blockstate/BlockStateDeserializerR13.php deleted file mode 100644 index 450cd0cde4..0000000000 --- a/src/data/bedrock/blockstate/BlockStateDeserializerR13.php +++ /dev/null @@ -1,1491 +0,0 @@ - - */ - private array $deserializeFuncs = []; - - /** @phpstan-param \Closure(BlockStateReader) : Block $c */ - private function mapId(string $id, \Closure $c) : void{ - if(array_key_exists($id, $this->deserializeFuncs)){ - throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); - } - $this->deserializeFuncs[$id] = $c; - } - - /** @phpstan-param \Closure(BlockStateReader) : Block $c */ - private function mapVanilla(string $minecraftId, \Closure $c) : void{ - $this->mapId("minecraft:$minecraftId", $c); - } - - /** @throws BlockStateDeserializeException */ - private function decodeButton(Button $block, BlockStateReader $in) : Button{ - return $block - ->setFacing($in->readFacingDirection()) - ->setPressed($in->readBool(BlockStateNamesR13::BUTTON_PRESSED_BIT)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeComparator(RedstoneComparator $block, BlockStateReader $in) : RedstoneComparator{ - return $block - ->setFacing($in->readLegacyHorizontalFacing()) - ->setPowered($in->readBool(BlockStateNamesR13::OUTPUT_LIT_BIT)) - ->setSubtractMode($in->readBool(BlockStateNamesR13::OUTPUT_SUBTRACT_BIT)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeCrops(Crops $block, BlockStateReader $in) : Crops{ - return $block->setAge($in->readBoundedInt(BlockStateNamesR13::GROWTH, 0, 7)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeDoor(Door $block, BlockStateReader $in) : Door{ - //TODO: check if these need any special treatment to get the appropriate data to both halves of the door - return $block - ->setTop($in->readBool(BlockStateNamesR13::UPPER_BLOCK_BIT)) - ->setFacing(Facing::rotateY($in->readLegacyHorizontalFacing(), false)) - ->setHingeRight($in->readBool(BlockStateNamesR13::DOOR_HINGE_BIT)) - ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeFenceGate(FenceGate $block, BlockStateReader $in) : FenceGate{ - return $block - ->setFacing($in->readLegacyHorizontalFacing()) - ->setInWall($in->readBool(BlockStateNamesR13::IN_WALL_BIT)) - ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeFloorCoralFan(BlockStateReader $in) : FloorCoralFan{ - return VanillaBlocks::CORAL_FAN() - ->setCoralType($in->readCoralType()) - ->setAxis(match($in->readBoundedInt(BlockStateNamesR13::CORAL_FAN_DIRECTION, 0, 1)){ - 0 => Axis::X, - 1 => Axis::Z, - default => throw new AssumptionFailedError("readBoundedInt() should have prevented this"), - }); - } - - /** @throws BlockStateDeserializeException */ - private function decodeGlazedTerracotta(GlazedTerracotta $block, BlockStateReader $in) : GlazedTerracotta{ - return $block->setFacing($in->readHorizontalFacing()); - } - - /** @throws BlockStateDeserializeException */ - private function decodeLiquid(Liquid $block, BlockStateReader $in, bool $still) : Liquid{ - $fluidHeightState = $in->readBoundedInt(BlockStateNamesR13::LIQUID_DEPTH, 0, 15); - return $block - ->setDecay($fluidHeightState & 0x7) - ->setFalling(($fluidHeightState & 0x1) !== 0) - ->setStill($still); - } - - private function decodeFlowingLiquid(Liquid $block, BlockStateReader $in) : Liquid{ - return $this->decodeLiquid($block, $in, false); - } - - private function decodeStillLiquid(Liquid $block, BlockStateReader $in) : Liquid{ - return $this->decodeLiquid($block, $in, true); - } - - /** @throws BlockStateDeserializeException */ - private function decodeMushroomBlock(RedMushroomBlock $block, BlockStateReader $in) : Block{ - switch($type = $in->readBoundedInt(BlockStateNamesR13::HUGE_MUSHROOM_BITS, 0, 15)){ - case BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM: return VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(); - case BlockLegacyMetadata::MUSHROOM_BLOCK_STEM: return VanillaBlocks::MUSHROOM_STEM(); - default: - //invalid types get left as default - $type = MushroomBlockTypeIdMap::getInstance()->fromId($type); - return $type !== null ? $block->setMushroomBlockType($type) : $block; - } - } - - /** @throws BlockStateDeserializeException */ - private function decodeRepeater(RedstoneRepeater $block, BlockStateReader $in) : RedstoneRepeater{ - return $block - ->setFacing($in->readLegacyHorizontalFacing()) - ->setDelay($in->readBoundedInt(BlockStateNamesR13::REPEATER_DELAY, 0, 3) + 1); - } - - /** @throws BlockStateDeserializeException */ - private function decodeSimplePressurePlate(SimplePressurePlate $block, BlockStateReader $in) : SimplePressurePlate{ - //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? - //best to keep this separate from weighted plates anyway... - return $block->setPressed($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15) !== 0); - } - - /** @throws BlockStateDeserializeException */ - private function decodeStairs(Stair $block, BlockStateReader $in) : Stair{ - return $block - ->setUpsideDown($in->readBool(BlockStateNamesR13::UPSIDE_DOWN_BIT)) - ->setFacing($in->readWeirdoHorizontalFacing()); - } - - /** @throws BlockStateDeserializeException */ - private function decodeTrapdoor(Trapdoor $block, BlockStateReader $in) : Trapdoor{ - return $block - ->setFacing($in->readLegacyHorizontalFacing()) - ->setTop($in->readBool(BlockStateNamesR13::UPSIDE_DOWN_BIT)) - ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); - } - - /** @throws BlockStateDeserializeException */ - private function decodeWall(Wall $block, BlockStateReader $in) : Wall{ - //TODO: our walls don't support the full range of needed states yet - return $block; - } - - /** @throws BlockStateDeserializeException */ - private function mapStoneSlab1Type(BlockStateReader $in) : Slab{ - //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood - return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE)){ - StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), - StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - private function mapStoneSlab2Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone - return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_2)){ - StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_2, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - private function mapStoneSlab3Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone - return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_3)){ - StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_3, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - private function mapStoneSlab4Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone - return match($type = $in->readString(BlockStateNamesR13::STONE_SLAB_TYPE_4)){ - StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_SLAB_TYPE_4, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - private function mapWoodenSlabType(BlockStateReader $in) : Slab{ - // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - return match($type = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), - default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $type), - }; - } - - public function __construct(){ - $this->mapVanilla("acacia_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::ACACIA_BUTTON(), $in)); - $this->mapVanilla("acacia_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::ACACIA_DOOR(), $in)); - $this->mapVanilla("acacia_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::ACACIA_FENCE_GATE(), $in)); - $this->mapVanilla("acacia_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::ACACIA_PRESSURE_PLATE(), $in)); - $this->mapVanilla("acacia_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::ACACIA_STAIRS(), $in)); - $this->mapVanilla("acacia_standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACACIA_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("acacia_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::ACACIA_TRAPDOOR(), $in)); - $this->mapVanilla("acacia_wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACACIA_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("activator_rail", function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACTIVATOR_RAIL() - ->setPowered($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); - }); - $this->mapVanilla("air", fn() => VanillaBlocks::AIR()); - $this->mapVanilla("andesite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::ANDESITE_STAIRS(), $in)); - $this->mapVanilla("anvil", function(BlockStateReader $in) : Block{ - return VanillaBlocks::ANVIL() - ->setDamage(match($value = $in->readString(BlockStateNamesR13::DAMAGE)){ - StringValues::DAMAGE_UNDAMAGED => 0, - StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, - StringValues::DAMAGE_VERY_DAMAGED => 2, - StringValues::DAMAGE_BROKEN => 0, - default => throw $in->badValueException(BlockStateNamesR13::DAMAGE, $value), - }) - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("bamboo", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BAMBOO() - ->setLeafSize(match($value = $in->readString(BlockStateNamesR13::BAMBOO_LEAF_SIZE)){ - StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, - default => throw $in->badValueException(BlockStateNamesR13::BAMBOO_LEAF_SIZE, $value), - }) - ->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)) - ->setThick(match($value = $in->readString(BlockStateNamesR13::BAMBOO_STALK_THICKNESS)){ - StringValues::BAMBOO_STALK_THICKNESS_THIN => false, - StringValues::BAMBOO_STALK_THICKNESS_THICK => true, - default => throw $in->badValueException(BlockStateNamesR13::BAMBOO_STALK_THICKNESS, $value), - }); - }); - $this->mapVanilla("bamboo_sapling", function(BlockStateReader $in) : Block{ - //TODO: sapling_type intentionally ignored (its presence is a bug) - return VanillaBlocks::BAMBOO_SAPLING()->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)); - }); - $this->mapVanilla("barrel", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BARREL() - ->setFacing($in->readFacingDirection()) - ->setOpen($in->readBool(BlockStateNamesR13::OPEN_BIT)); - }); - $this->mapVanilla("barrier", fn() => VanillaBlocks::BARRIER()); - $this->mapVanilla("beacon", fn() => VanillaBlocks::BEACON()); - $this->mapVanilla("bed", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BED() - ->setFacing($in->readLegacyHorizontalFacing()) - ->setHead($in->readBool(BlockStateNamesR13::HEAD_PIECE_BIT)) - ->setOccupied($in->readBool(BlockStateNamesR13::OCCUPIED_BIT)); - }); - $this->mapVanilla("bedrock", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BEDROCK() - ->setBurnsForever($in->readBool(BlockStateNamesR13::INFINIBURN_BIT)); - }); - $this->mapVanilla("beetroot", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::BEETROOTS(), $in)); - $this->mapVanilla("bell", function(BlockStateReader $in) : Block{ - //TODO: ignored toggle_bit (appears to be internally used in MCPE only, useless for us) - return VanillaBlocks::BELL() - ->setFacing($in->readLegacyHorizontalFacing()) - ->setAttachmentType($in->readBellAttachmentType()); - }); - $this->mapVanilla("birch_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::BIRCH_BUTTON(), $in)); - $this->mapVanilla("birch_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::BIRCH_DOOR(), $in)); - $this->mapVanilla("birch_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::BIRCH_FENCE_GATE(), $in)); - $this->mapVanilla("birch_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::BIRCH_PRESSURE_PLATE(), $in)); - $this->mapVanilla("birch_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::BIRCH_STAIRS(), $in)); - $this->mapVanilla("birch_standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BIRCH_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("birch_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::BIRCH_TRAPDOOR(), $in)); - $this->mapVanilla("birch_wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BIRCH_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("black_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("blast_furnace", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BLAST_FURNACE() - ->setFacing($in->readHorizontalFacing()) - ->setLit(false); - }); - $this->mapVanilla("blue_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("blue_ice", fn() => VanillaBlocks::BLUE_ICE()); - $this->mapVanilla("bone_block", function(BlockStateReader $in) : Block{ - //TODO: intentionally ignored "deprecated" blockstate (useless) - return VanillaBlocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("bookshelf", fn() => VanillaBlocks::BOOKSHELF()); - $this->mapVanilla("brewing_stand", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BREWING_STAND() - ->setSlot(BrewingStandSlot::EAST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_A_BIT)) - ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_B_BIT)) - ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNamesR13::BREWING_STAND_SLOT_C_BIT)); - }); - $this->mapVanilla("brick_block", fn() => VanillaBlocks::BRICKS()); - $this->mapVanilla("brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::BRICK_STAIRS(), $in)); - $this->mapVanilla("brown_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("brown_mushroom", fn() => VanillaBlocks::BROWN_MUSHROOM()); - $this->mapVanilla("brown_mushroom_block", fn(BlockStateReader $in) => $this->decodeMushroomBlock(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), $in)); - $this->mapVanilla("cactus", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CACTUS() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); - }); - $this->mapVanilla("cake", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CAKE() - ->setBites($in->readBoundedInt(BlockStateNamesR13::BITE_COUNTER, 0, 6)); - }); - $this->mapVanilla("carpet", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CARPET() - ->setColor($in->readColor()); - }); - $this->mapVanilla("carrots", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::CARROTS(), $in)); - $this->mapVanilla("carved_pumpkin", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CARVED_PUMPKIN() - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("chemical_heat", fn() => VanillaBlocks::CHEMICAL_HEAT()); - $this->mapVanilla("chemistry_table", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::CHEMISTRY_TABLE_TYPE)){ - StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), - StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), - StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), - StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), - default => throw $in->badValueException(BlockStateNamesR13::CHEMISTRY_TABLE_TYPE, $type), - })->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("chest", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CHEST() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("clay", fn() => VanillaBlocks::CLAY()); - $this->mapVanilla("coal_block", fn() => VanillaBlocks::COAL()); - $this->mapVanilla("coal_ore", fn() => VanillaBlocks::COAL_ORE()); - $this->mapVanilla("cobblestone", fn() => VanillaBlocks::COBBLESTONE()); - $this->mapVanilla("cobblestone_wall", fn(BlockStateReader $in) => $this->decodeWall(VanillaBlocks::COBBLESTONE_WALL(), $in)); - $this->mapVanilla("cocoa", function(BlockStateReader $in) : Block{ - return VanillaBlocks::COCOA_POD() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 2)) - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("colored_torch_bp", function(BlockStateReader $in) : Block{ - return $in->readBool(BlockStateNamesR13::COLOR_BIT) ? - VanillaBlocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : - VanillaBlocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); - }); - $this->mapVanilla("colored_torch_rg", function(BlockStateReader $in) : Block{ - return $in->readBool(BlockStateNamesR13::COLOR_BIT) ? - VanillaBlocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : - VanillaBlocks::RED_TORCH()->setFacing($in->readTorchFacing()); - }); - $this->mapVanilla("concrete", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CONCRETE() - ->setColor($in->readColor()); - }); - $this->mapVanilla("concretePowder", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CONCRETE_POWDER() - ->setColor($in->readColor()); - }); - $this->mapVanilla("coral", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CORAL() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)); - }); - $this->mapVanilla("coral_block", function(BlockStateReader $in) : Block{ - return VanillaBlocks::CORAL_BLOCK() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)); - }); - $this->mapVanilla("coral_fan", fn(BlockStateReader $in) => $this->decodeFloorCoralFan($in)->setDead(false)); - $this->mapVanilla("coral_fan_dead", fn(BlockStateReader $in) => $this->decodeFloorCoralFan($in)->setDead(true)); - $this->mapVanilla("coral_fan_hang", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType($in->readBool(BlockStateNamesR13::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) - ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); - $this->mapVanilla("coral_fan_hang2", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType($in->readBool(BlockStateNamesR13::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE()) - ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); - $this->mapVanilla("coral_fan_hang3", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType(CoralType::HORN()) - ->setDead($in->readBool(BlockStateNamesR13::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); - $this->mapVanilla("crafting_table", fn() => VanillaBlocks::CRAFTING_TABLE()); - $this->mapVanilla("cyan_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("dark_oak_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::DARK_OAK_BUTTON(), $in)); - $this->mapVanilla("dark_oak_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::DARK_OAK_DOOR(), $in)); - $this->mapVanilla("dark_oak_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::DARK_OAK_FENCE_GATE(), $in)); - $this->mapVanilla("dark_oak_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), $in)); - $this->mapVanilla("dark_oak_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DARK_OAK_STAIRS(), $in)); - $this->mapVanilla("dark_oak_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::DARK_OAK_TRAPDOOR(), $in)); - $this->mapVanilla("dark_prismarine_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DARK_PRISMARINE_STAIRS(), $in)); - $this->mapVanilla("darkoak_standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DARK_OAK_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("darkoak_wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DARK_OAK_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("daylight_detector", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DAYLIGHT_SENSOR() - ->setInverted(false) - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); - }); - $this->mapVanilla("daylight_detector_inverted", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DAYLIGHT_SENSOR() - ->setInverted(true) - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); - }); - $this->mapVanilla("deadbush", fn() => VanillaBlocks::DEAD_BUSH()); - $this->mapVanilla("detector_rail", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DETECTOR_RAIL() - ->setActivated($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); - }); - $this->mapVanilla("diamond_block", fn() => VanillaBlocks::DIAMOND()); - $this->mapVanilla("diamond_ore", fn() => VanillaBlocks::DIAMOND_ORE()); - $this->mapVanilla("diorite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::DIORITE_STAIRS(), $in)); - $this->mapVanilla("dirt", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DIRT() - ->setCoarse(match($value = $in->readString(BlockStateNamesR13::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => false, - StringValues::DIRT_TYPE_COARSE => true, - default => throw $in->badValueException(BlockStateNamesR13::DIRT_TYPE, $value), - }); - }); - $this->mapVanilla("double_plant", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::DOUBLE_PLANT_TYPE)){ - StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), - StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), - StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), - StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), - StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), - StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), - default => throw $in->badValueException(BlockStateNamesR13::DOUBLE_PLANT_TYPE, $type), - })->setTop($in->readBool(BlockStateNamesR13::UPPER_BLOCK_BIT)); - }); - $this->mapVanilla("double_stone_slab", function(BlockStateReader $in) : Block{ - return $this->mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->mapVanilla("double_stone_slab2", function(BlockStateReader $in) : Block{ - return $this->mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->mapVanilla("double_stone_slab3", function(BlockStateReader $in) : Block{ - return $this->mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->mapVanilla("double_stone_slab4", function(BlockStateReader $in) : Block{ - return $this->mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->mapVanilla("double_wooden_slab", function(BlockStateReader $in) : Block{ - return $this->mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->mapVanilla("dragon_egg", fn() => VanillaBlocks::DRAGON_EGG()); - $this->mapVanilla("dried_kelp_block", fn() => VanillaBlocks::DRIED_KELP()); - $this->mapVanilla("element_0", fn() => VanillaBlocks::ELEMENT_ZERO()); - $this->mapVanilla("element_1", fn() => VanillaBlocks::ELEMENT_HYDROGEN()); - $this->mapVanilla("element_10", fn() => VanillaBlocks::ELEMENT_NEON()); - $this->mapVanilla("element_100", fn() => VanillaBlocks::ELEMENT_FERMIUM()); - $this->mapVanilla("element_101", fn() => VanillaBlocks::ELEMENT_MENDELEVIUM()); - $this->mapVanilla("element_102", fn() => VanillaBlocks::ELEMENT_NOBELIUM()); - $this->mapVanilla("element_103", fn() => VanillaBlocks::ELEMENT_LAWRENCIUM()); - $this->mapVanilla("element_104", fn() => VanillaBlocks::ELEMENT_RUTHERFORDIUM()); - $this->mapVanilla("element_105", fn() => VanillaBlocks::ELEMENT_DUBNIUM()); - $this->mapVanilla("element_106", fn() => VanillaBlocks::ELEMENT_SEABORGIUM()); - $this->mapVanilla("element_107", fn() => VanillaBlocks::ELEMENT_BOHRIUM()); - $this->mapVanilla("element_108", fn() => VanillaBlocks::ELEMENT_HASSIUM()); - $this->mapVanilla("element_109", fn() => VanillaBlocks::ELEMENT_MEITNERIUM()); - $this->mapVanilla("element_11", fn() => VanillaBlocks::ELEMENT_SODIUM()); - $this->mapVanilla("element_110", fn() => VanillaBlocks::ELEMENT_DARMSTADTIUM()); - $this->mapVanilla("element_111", fn() => VanillaBlocks::ELEMENT_ROENTGENIUM()); - $this->mapVanilla("element_112", fn() => VanillaBlocks::ELEMENT_COPERNICIUM()); - $this->mapVanilla("element_113", fn() => VanillaBlocks::ELEMENT_NIHONIUM()); - $this->mapVanilla("element_114", fn() => VanillaBlocks::ELEMENT_FLEROVIUM()); - $this->mapVanilla("element_115", fn() => VanillaBlocks::ELEMENT_MOSCOVIUM()); - $this->mapVanilla("element_116", fn() => VanillaBlocks::ELEMENT_LIVERMORIUM()); - $this->mapVanilla("element_117", fn() => VanillaBlocks::ELEMENT_TENNESSINE()); - $this->mapVanilla("element_118", fn() => VanillaBlocks::ELEMENT_OGANESSON()); - $this->mapVanilla("element_12", fn() => VanillaBlocks::ELEMENT_MAGNESIUM()); - $this->mapVanilla("element_13", fn() => VanillaBlocks::ELEMENT_ALUMINUM()); - $this->mapVanilla("element_14", fn() => VanillaBlocks::ELEMENT_SILICON()); - $this->mapVanilla("element_15", fn() => VanillaBlocks::ELEMENT_PHOSPHORUS()); - $this->mapVanilla("element_16", fn() => VanillaBlocks::ELEMENT_SULFUR()); - $this->mapVanilla("element_17", fn() => VanillaBlocks::ELEMENT_CHLORINE()); - $this->mapVanilla("element_18", fn() => VanillaBlocks::ELEMENT_ARGON()); - $this->mapVanilla("element_19", fn() => VanillaBlocks::ELEMENT_POTASSIUM()); - $this->mapVanilla("element_2", fn() => VanillaBlocks::ELEMENT_HELIUM()); - $this->mapVanilla("element_20", fn() => VanillaBlocks::ELEMENT_CALCIUM()); - $this->mapVanilla("element_21", fn() => VanillaBlocks::ELEMENT_SCANDIUM()); - $this->mapVanilla("element_22", fn() => VanillaBlocks::ELEMENT_TITANIUM()); - $this->mapVanilla("element_23", fn() => VanillaBlocks::ELEMENT_VANADIUM()); - $this->mapVanilla("element_24", fn() => VanillaBlocks::ELEMENT_CHROMIUM()); - $this->mapVanilla("element_25", fn() => VanillaBlocks::ELEMENT_MANGANESE()); - $this->mapVanilla("element_26", fn() => VanillaBlocks::ELEMENT_IRON()); - $this->mapVanilla("element_27", fn() => VanillaBlocks::ELEMENT_COBALT()); - $this->mapVanilla("element_28", fn() => VanillaBlocks::ELEMENT_NICKEL()); - $this->mapVanilla("element_29", fn() => VanillaBlocks::ELEMENT_COPPER()); - $this->mapVanilla("element_3", fn() => VanillaBlocks::ELEMENT_LITHIUM()); - $this->mapVanilla("element_30", fn() => VanillaBlocks::ELEMENT_ZINC()); - $this->mapVanilla("element_31", fn() => VanillaBlocks::ELEMENT_GALLIUM()); - $this->mapVanilla("element_32", fn() => VanillaBlocks::ELEMENT_GERMANIUM()); - $this->mapVanilla("element_33", fn() => VanillaBlocks::ELEMENT_ARSENIC()); - $this->mapVanilla("element_34", fn() => VanillaBlocks::ELEMENT_SELENIUM()); - $this->mapVanilla("element_35", fn() => VanillaBlocks::ELEMENT_BROMINE()); - $this->mapVanilla("element_36", fn() => VanillaBlocks::ELEMENT_KRYPTON()); - $this->mapVanilla("element_37", fn() => VanillaBlocks::ELEMENT_RUBIDIUM()); - $this->mapVanilla("element_38", fn() => VanillaBlocks::ELEMENT_STRONTIUM()); - $this->mapVanilla("element_39", fn() => VanillaBlocks::ELEMENT_YTTRIUM()); - $this->mapVanilla("element_4", fn() => VanillaBlocks::ELEMENT_BERYLLIUM()); - $this->mapVanilla("element_40", fn() => VanillaBlocks::ELEMENT_ZIRCONIUM()); - $this->mapVanilla("element_41", fn() => VanillaBlocks::ELEMENT_NIOBIUM()); - $this->mapVanilla("element_42", fn() => VanillaBlocks::ELEMENT_MOLYBDENUM()); - $this->mapVanilla("element_43", fn() => VanillaBlocks::ELEMENT_TECHNETIUM()); - $this->mapVanilla("element_44", fn() => VanillaBlocks::ELEMENT_RUTHENIUM()); - $this->mapVanilla("element_45", fn() => VanillaBlocks::ELEMENT_RHODIUM()); - $this->mapVanilla("element_46", fn() => VanillaBlocks::ELEMENT_PALLADIUM()); - $this->mapVanilla("element_47", fn() => VanillaBlocks::ELEMENT_SILVER()); - $this->mapVanilla("element_48", fn() => VanillaBlocks::ELEMENT_CADMIUM()); - $this->mapVanilla("element_49", fn() => VanillaBlocks::ELEMENT_INDIUM()); - $this->mapVanilla("element_5", fn() => VanillaBlocks::ELEMENT_BORON()); - $this->mapVanilla("element_50", fn() => VanillaBlocks::ELEMENT_TIN()); - $this->mapVanilla("element_51", fn() => VanillaBlocks::ELEMENT_ANTIMONY()); - $this->mapVanilla("element_52", fn() => VanillaBlocks::ELEMENT_TELLURIUM()); - $this->mapVanilla("element_53", fn() => VanillaBlocks::ELEMENT_IODINE()); - $this->mapVanilla("element_54", fn() => VanillaBlocks::ELEMENT_XENON()); - $this->mapVanilla("element_55", fn() => VanillaBlocks::ELEMENT_CESIUM()); - $this->mapVanilla("element_56", fn() => VanillaBlocks::ELEMENT_BARIUM()); - $this->mapVanilla("element_57", fn() => VanillaBlocks::ELEMENT_LANTHANUM()); - $this->mapVanilla("element_58", fn() => VanillaBlocks::ELEMENT_CERIUM()); - $this->mapVanilla("element_59", fn() => VanillaBlocks::ELEMENT_PRASEODYMIUM()); - $this->mapVanilla("element_6", fn() => VanillaBlocks::ELEMENT_CARBON()); - $this->mapVanilla("element_60", fn() => VanillaBlocks::ELEMENT_NEODYMIUM()); - $this->mapVanilla("element_61", fn() => VanillaBlocks::ELEMENT_PROMETHIUM()); - $this->mapVanilla("element_62", fn() => VanillaBlocks::ELEMENT_SAMARIUM()); - $this->mapVanilla("element_63", fn() => VanillaBlocks::ELEMENT_EUROPIUM()); - $this->mapVanilla("element_64", fn() => VanillaBlocks::ELEMENT_GADOLINIUM()); - $this->mapVanilla("element_65", fn() => VanillaBlocks::ELEMENT_TERBIUM()); - $this->mapVanilla("element_66", fn() => VanillaBlocks::ELEMENT_DYSPROSIUM()); - $this->mapVanilla("element_67", fn() => VanillaBlocks::ELEMENT_HOLMIUM()); - $this->mapVanilla("element_68", fn() => VanillaBlocks::ELEMENT_ERBIUM()); - $this->mapVanilla("element_69", fn() => VanillaBlocks::ELEMENT_THULIUM()); - $this->mapVanilla("element_7", fn() => VanillaBlocks::ELEMENT_NITROGEN()); - $this->mapVanilla("element_70", fn() => VanillaBlocks::ELEMENT_YTTERBIUM()); - $this->mapVanilla("element_71", fn() => VanillaBlocks::ELEMENT_LUTETIUM()); - $this->mapVanilla("element_72", fn() => VanillaBlocks::ELEMENT_HAFNIUM()); - $this->mapVanilla("element_73", fn() => VanillaBlocks::ELEMENT_TANTALUM()); - $this->mapVanilla("element_74", fn() => VanillaBlocks::ELEMENT_TUNGSTEN()); - $this->mapVanilla("element_75", fn() => VanillaBlocks::ELEMENT_RHENIUM()); - $this->mapVanilla("element_76", fn() => VanillaBlocks::ELEMENT_OSMIUM()); - $this->mapVanilla("element_77", fn() => VanillaBlocks::ELEMENT_IRIDIUM()); - $this->mapVanilla("element_78", fn() => VanillaBlocks::ELEMENT_PLATINUM()); - $this->mapVanilla("element_79", fn() => VanillaBlocks::ELEMENT_GOLD()); - $this->mapVanilla("element_8", fn() => VanillaBlocks::ELEMENT_OXYGEN()); - $this->mapVanilla("element_80", fn() => VanillaBlocks::ELEMENT_MERCURY()); - $this->mapVanilla("element_81", fn() => VanillaBlocks::ELEMENT_THALLIUM()); - $this->mapVanilla("element_82", fn() => VanillaBlocks::ELEMENT_LEAD()); - $this->mapVanilla("element_83", fn() => VanillaBlocks::ELEMENT_BISMUTH()); - $this->mapVanilla("element_84", fn() => VanillaBlocks::ELEMENT_POLONIUM()); - $this->mapVanilla("element_85", fn() => VanillaBlocks::ELEMENT_ASTATINE()); - $this->mapVanilla("element_86", fn() => VanillaBlocks::ELEMENT_RADON()); - $this->mapVanilla("element_87", fn() => VanillaBlocks::ELEMENT_FRANCIUM()); - $this->mapVanilla("element_88", fn() => VanillaBlocks::ELEMENT_RADIUM()); - $this->mapVanilla("element_89", fn() => VanillaBlocks::ELEMENT_ACTINIUM()); - $this->mapVanilla("element_9", fn() => VanillaBlocks::ELEMENT_FLUORINE()); - $this->mapVanilla("element_90", fn() => VanillaBlocks::ELEMENT_THORIUM()); - $this->mapVanilla("element_91", fn() => VanillaBlocks::ELEMENT_PROTACTINIUM()); - $this->mapVanilla("element_92", fn() => VanillaBlocks::ELEMENT_URANIUM()); - $this->mapVanilla("element_93", fn() => VanillaBlocks::ELEMENT_NEPTUNIUM()); - $this->mapVanilla("element_94", fn() => VanillaBlocks::ELEMENT_PLUTONIUM()); - $this->mapVanilla("element_95", fn() => VanillaBlocks::ELEMENT_AMERICIUM()); - $this->mapVanilla("element_96", fn() => VanillaBlocks::ELEMENT_CURIUM()); - $this->mapVanilla("element_97", fn() => VanillaBlocks::ELEMENT_BERKELIUM()); - $this->mapVanilla("element_98", fn() => VanillaBlocks::ELEMENT_CALIFORNIUM()); - $this->mapVanilla("element_99", fn() => VanillaBlocks::ELEMENT_EINSTEINIUM()); - $this->mapVanilla("emerald_block", fn() => VanillaBlocks::EMERALD()); - $this->mapVanilla("emerald_ore", fn() => VanillaBlocks::EMERALD_ORE()); - $this->mapVanilla("enchanting_table", fn() => VanillaBlocks::ENCHANTING_TABLE()); - $this->mapVanilla("end_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::END_STONE_BRICK_STAIRS(), $in)); - $this->mapVanilla("end_bricks", fn() => VanillaBlocks::END_STONE_BRICKS()); - $this->mapVanilla("end_portal_frame", function(BlockStateReader $in) : Block{ - return VanillaBlocks::END_PORTAL_FRAME() - ->setEye($in->readBool(BlockStateNamesR13::END_PORTAL_EYE_BIT)) - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("end_rod", function(BlockStateReader $in) : Block{ - return VanillaBlocks::END_ROD() - ->setFacing($in->readFacingDirection()); - }); - $this->mapVanilla("end_stone", fn() => VanillaBlocks::END_STONE()); - $this->mapVanilla("ender_chest", function(BlockStateReader $in) : Block{ - return VanillaBlocks::ENDER_CHEST() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("farmland", function(BlockStateReader $in) : Block{ - return VanillaBlocks::FARMLAND() - ->setWetness($in->readBoundedInt(BlockStateNamesR13::MOISTURIZED_AMOUNT, 0, 7)); - }); - $this->mapVanilla("fence", function(BlockStateReader $in) : Block{ - return match($woodName = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), - default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodName), - }; - }); - $this->mapVanilla("fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::OAK_FENCE_GATE(), $in)); - $this->mapVanilla("fire", function(BlockStateReader $in) : Block{ - return VanillaBlocks::FIRE() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); - }); - $this->mapVanilla("fletching_table", fn() => VanillaBlocks::FLETCHING_TABLE()); - $this->mapVanilla("flower_pot", function() : Block{ - //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) - return VanillaBlocks::FLOWER_POT(); - }); - $this->mapVanilla("flowing_lava", fn(BlockStateReader $in) => $this->decodeFlowingLiquid(VanillaBlocks::LAVA(), $in)); - $this->mapVanilla("flowing_water", fn(BlockStateReader $in) => $this->decodeFlowingLiquid(VanillaBlocks::WATER(), $in)); - $this->mapVanilla("frame", function(BlockStateReader $in) : Block{ - //TODO: in R13 this can be any side, not just horizontal - return VanillaBlocks::ITEM_FRAME() - ->setFacing($in->readHorizontalFacing()) - ->setHasMap($in->readBool(BlockStateNamesR13::ITEM_FRAME_MAP_BIT)); - }); - $this->mapVanilla("frosted_ice", function(BlockStateReader $in) : Block{ - return VanillaBlocks::FROSTED_ICE() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 3)); - }); - $this->mapVanilla("furnace", function(BlockStateReader $in) : Block{ - return VanillaBlocks::FURNACE() - ->setFacing($in->readHorizontalFacing()) - ->setLit(false); - }); - $this->mapVanilla("glass", fn() => VanillaBlocks::GLASS()); - $this->mapVanilla("glass_pane", fn() => VanillaBlocks::GLASS_PANE()); - $this->mapVanilla("glowingobsidian", fn() => VanillaBlocks::GLOWING_OBSIDIAN()); - $this->mapVanilla("glowstone", fn() => VanillaBlocks::GLOWSTONE()); - $this->mapVanilla("gold_block", fn() => VanillaBlocks::GOLD()); - $this->mapVanilla("gold_ore", fn() => VanillaBlocks::GOLD_ORE()); - $this->mapVanilla("golden_rail", function(BlockStateReader $in) : Block{ - return VanillaBlocks::POWERED_RAIL() - ->setPowered($in->readBool(BlockStateNamesR13::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 5)); - }); - $this->mapVanilla("granite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::GRANITE_STAIRS(), $in)); - $this->mapVanilla("grass", fn() => VanillaBlocks::GRASS()); - $this->mapVanilla("grass_path", fn() => VanillaBlocks::GRASS_PATH()); - $this->mapVanilla("gravel", fn() => VanillaBlocks::GRAVEL()); - $this->mapVanilla("gray_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("green_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("hard_glass", fn() => VanillaBlocks::HARDENED_GLASS()); - $this->mapVanilla("hard_glass_pane", fn() => VanillaBlocks::HARDENED_GLASS_PANE()); - $this->mapVanilla("hard_stained_glass", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_HARDENED_GLASS() - ->setColor($in->readColor()); - }); - $this->mapVanilla("hard_stained_glass_pane", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_HARDENED_GLASS_PANE() - ->setColor($in->readColor()); - }); - $this->mapVanilla("hardened_clay", fn() => VanillaBlocks::HARDENED_CLAY()); - $this->mapVanilla("hay_block", function(BlockStateReader $in) : Block{ - //TODO: intentionally ignored "deprecated" blockstate (useless) - return VanillaBlocks::HAY_BALE()->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("heavy_weighted_pressure_plate", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); - }); - $this->mapVanilla("hopper", function(BlockStateReader $in) : Block{ - return VanillaBlocks::HOPPER() - ->setFacing($in->readFacingWithoutUp()) - ->setPowered($in->readBool(BlockStateNamesR13::TOGGLE_BIT)); - }); - $this->mapVanilla("ice", fn() => VanillaBlocks::ICE()); - $this->mapVanilla("info_update", fn() => VanillaBlocks::INFO_UPDATE()); - $this->mapVanilla("info_update2", fn() => VanillaBlocks::INFO_UPDATE2()); - $this->mapVanilla("invisibleBedrock", fn() => VanillaBlocks::INVISIBLE_BEDROCK()); - $this->mapVanilla("iron_bars", fn() => VanillaBlocks::IRON_BARS()); - $this->mapVanilla("iron_block", fn() => VanillaBlocks::IRON()); - $this->mapVanilla("iron_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::IRON_DOOR(), $in)); - $this->mapVanilla("iron_ore", fn() => VanillaBlocks::IRON_ORE()); - $this->mapVanilla("iron_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::IRON_TRAPDOOR(), $in)); - $this->mapVanilla("jukebox", fn() => VanillaBlocks::JUKEBOX()); - $this->mapVanilla("jungle_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::JUNGLE_BUTTON(), $in)); - $this->mapVanilla("jungle_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::JUNGLE_DOOR(), $in)); - $this->mapVanilla("jungle_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::JUNGLE_FENCE_GATE(), $in)); - $this->mapVanilla("jungle_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), $in)); - $this->mapVanilla("jungle_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::JUNGLE_STAIRS(), $in)); - $this->mapVanilla("jungle_standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::JUNGLE_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("jungle_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::JUNGLE_TRAPDOOR(), $in)); - $this->mapVanilla("jungle_wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::JUNGLE_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("ladder", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LADDER() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("lantern", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LANTERN() - ->setHanging($in->readBool(BlockStateNamesR13::HANGING)); - }); - $this->mapVanilla("lapis_block", fn() => VanillaBlocks::LAPIS_LAZULI()); - $this->mapVanilla("lapis_ore", fn() => VanillaBlocks::LAPIS_LAZULI_ORE()); - $this->mapVanilla("lava", fn(BlockStateReader $in) => $this->decodeStillLiquid(VanillaBlocks::LAVA(), $in)); - $this->mapVanilla("leaves", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::OLD_LEAF_TYPE)){ - StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), - StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), - StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), - StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), - default => throw $in->badValueException(BlockStateNamesR13::OLD_LEAF_TYPE, $type), - }) - ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); - }); - $this->mapVanilla("leaves2", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::NEW_LEAF_TYPE)){ - StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), - StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), - default => throw $in->badValueException(BlockStateNamesR13::NEW_LEAF_TYPE, $type), - }) - ->setNoDecay($in->readBool(BlockStateNamesR13::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(BlockStateNamesR13::UPDATE_BIT)); - }); - $this->mapVanilla("lectern", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LECTERN() - ->setFacing($in->readLegacyHorizontalFacing()) - ->setProducingSignal($in->readBool(BlockStateNamesR13::POWERED_BIT)); - }); - $this->mapVanilla("lever", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LEVER() - ->setActivated($in->readBool(BlockStateNamesR13::OPEN_BIT)) - ->setFacing(match($value = $in->readString(BlockStateNamesR13::LEVER_DIRECTION)){ - StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), - StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), - StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), - StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), - StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), - StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), - StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), - StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), - default => throw $in->badValueException(BlockStateNamesR13::LEVER_DIRECTION, $value), - }); - }); - $this->mapVanilla("light_blue_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("light_weighted_pressure_plate", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); - }); - $this->mapVanilla("lime_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("lit_blast_furnace", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BLAST_FURNACE() - ->setFacing($in->readHorizontalFacing()) - ->setLit(true); - }); - $this->mapVanilla("lit_furnace", function(BlockStateReader $in) : Block{ - return VanillaBlocks::FURNACE() - ->setFacing($in->readHorizontalFacing()) - ->setLit(true); - }); - $this->mapVanilla("lit_pumpkin", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LIT_PUMPKIN() - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("lit_redstone_lamp", function() : Block{ - return VanillaBlocks::REDSTONE_LAMP() - ->setPowered(true); - }); - $this->mapVanilla("lit_redstone_ore", function() : Block{ - return VanillaBlocks::REDSTONE_ORE() - ->setLit(true); - }); - $this->mapVanilla("lit_smoker", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SMOKER() - ->setFacing($in->readHorizontalFacing()) - ->setLit(true); - }); - $this->mapVanilla("log", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::OLD_LOG_TYPE)){ - StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), - StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), - StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), - StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), - default => throw $in->badValueException(BlockStateNamesR13::OLD_LOG_TYPE, $type), - }) - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("log2", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::NEW_LOG_TYPE)){ - StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), - StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), - default => throw $in->badValueException(BlockStateNamesR13::NEW_LOG_TYPE, $type), - }) - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("loom", function(BlockStateReader $in) : Block{ - return VanillaBlocks::LOOM() - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->mapVanilla("magenta_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("magma", fn() => VanillaBlocks::MAGMA()); - $this->mapVanilla("melon_block", fn() => VanillaBlocks::MELON()); - $this->mapVanilla("melon_stem", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::MELON_STEM(), $in)); - $this->mapVanilla("mob_spawner", fn() => VanillaBlocks::MONSTER_SPAWNER()); - $this->mapVanilla("monster_egg", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::MONSTER_EGG_STONE_TYPE)){ - StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), - StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), - default => throw $in->badValueException(BlockStateNamesR13::MONSTER_EGG_STONE_TYPE, $type), - }; - }); - $this->mapVanilla("mossy_cobblestone", fn() => VanillaBlocks::MOSSY_COBBLESTONE()); - $this->mapVanilla("mossy_cobblestone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), $in)); - $this->mapVanilla("mossy_stone_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), $in)); - $this->mapVanilla("mycelium", fn() => VanillaBlocks::MYCELIUM()); - $this->mapVanilla("nether_brick", fn() => VanillaBlocks::NETHER_BRICKS()); - $this->mapVanilla("nether_brick_fence", fn() => VanillaBlocks::NETHER_BRICK_FENCE()); - $this->mapVanilla("nether_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::NETHER_BRICK_STAIRS(), $in)); - $this->mapVanilla("nether_wart", function(BlockStateReader $in) : Block{ - return VanillaBlocks::NETHER_WART() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 3)); - }); - $this->mapVanilla("nether_wart_block", fn() => VanillaBlocks::NETHER_WART_BLOCK()); - $this->mapVanilla("netherrack", fn() => VanillaBlocks::NETHERRACK()); - $this->mapVanilla("netherreactor", fn() => VanillaBlocks::NETHER_REACTOR_CORE()); - $this->mapVanilla("normal_stone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::STONE_STAIRS(), $in)); - $this->mapVanilla("noteblock", fn() => VanillaBlocks::NOTE_BLOCK()); - $this->mapVanilla("oak_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::OAK_STAIRS(), $in)); - $this->mapVanilla("obsidian", fn() => VanillaBlocks::OBSIDIAN()); - $this->mapVanilla("orange_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("packed_ice", fn() => VanillaBlocks::PACKED_ICE()); - $this->mapVanilla("pink_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("planks", function(BlockStateReader $in) : Block{ - return match($woodName = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), - default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodName), - }; - }); - $this->mapVanilla("podzol", fn() => VanillaBlocks::PODZOL()); - $this->mapVanilla("polished_andesite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), $in)); - $this->mapVanilla("polished_diorite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_DIORITE_STAIRS(), $in)); - $this->mapVanilla("polished_granite_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::POLISHED_GRANITE_STAIRS(), $in)); - $this->mapVanilla("portal", function(BlockStateReader $in) : Block{ - return VanillaBlocks::NETHER_PORTAL() - ->setAxis(match($value = $in->readString(BlockStateNamesR13::PORTAL_AXIS)){ - StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, - StringValues::PORTAL_AXIS_X => Axis::X, - StringValues::PORTAL_AXIS_Z => Axis::Z, - default => throw $in->badValueException(BlockStateNamesR13::PORTAL_AXIS, $value), - }); - }); - $this->mapVanilla("potatoes", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::POTATOES(), $in)); - $this->mapVanilla("powered_comparator", fn(BlockStateReader $in) => $this->decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); - $this->mapVanilla("powered_repeater", fn(BlockStateReader $in) => $this->decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) - ->setPowered(true)); - $this->mapVanilla("prismarine", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::PRISMARINE_BLOCK_TYPE)){ - StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), - StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), - StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), - default => throw $in->badValueException(BlockStateNamesR13::PRISMARINE_BLOCK_TYPE, $type), - }; - }); - $this->mapVanilla("prismarine_bricks_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), $in)); - $this->mapVanilla("prismarine_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PRISMARINE_STAIRS(), $in)); - $this->mapVanilla("pumpkin", function() : Block{ - //TODO: intentionally ignored "direction" property (obsolete) - return VanillaBlocks::PUMPKIN(); - }); - $this->mapVanilla("pumpkin_stem", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::PUMPKIN_STEM(), $in)); - $this->mapVanilla("purple_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("purpur_block", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), - default => throw $in->badValueException(BlockStateNamesR13::CHISEL_TYPE, $type), - }; - }); - $this->mapVanilla("purpur_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); - $this->mapVanilla("quartz_block", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) - default => throw $in->badValueException(BlockStateNamesR13::CHISEL_TYPE, $type), - }; - }); - $this->mapVanilla("quartz_ore", fn() => VanillaBlocks::NETHER_QUARTZ_ORE()); - $this->mapVanilla("quartz_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::QUARTZ_STAIRS(), $in)); - $this->mapVanilla("rail", function(BlockStateReader $in) : Block{ - return VanillaBlocks::RAIL() - ->setShape($in->readBoundedInt(BlockStateNamesR13::RAIL_DIRECTION, 0, 9)); - }); - $this->mapVanilla("red_flower", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::FLOWER_TYPE)){ - StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), - StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), - StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? - StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), - StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), - StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), - StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), - StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), - StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), - StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), - StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), - default => throw $in->badValueException(BlockStateNamesR13::FLOWER_TYPE, $type), - }; - }); - $this->mapVanilla("red_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::RED_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("red_mushroom", fn() => VanillaBlocks::RED_MUSHROOM()); - $this->mapVanilla("red_mushroom_block", fn(BlockStateReader $in) => $this->decodeMushroomBlock(VanillaBlocks::RED_MUSHROOM_BLOCK(), $in)); - $this->mapVanilla("red_nether_brick", fn() => VanillaBlocks::RED_NETHER_BRICKS()); - $this->mapVanilla("red_nether_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); - $this->mapVanilla("red_sandstone", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), - default => throw $in->badValueException(BlockStateNamesR13::SAND_STONE_TYPE, $type), - }; - }); - $this->mapVanilla("red_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::RED_SANDSTONE_STAIRS(), $in)); - $this->mapVanilla("redstone_block", fn() => VanillaBlocks::REDSTONE()); - $this->mapVanilla("redstone_lamp", function() : Block{ - return VanillaBlocks::REDSTONE_LAMP() - ->setPowered(false); - }); - $this->mapVanilla("redstone_ore", function() : Block{ - return VanillaBlocks::REDSTONE_ORE() - ->setLit(false); - }); - $this->mapVanilla("redstone_torch", function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_TORCH() - ->setFacing($in->readTorchFacing()) - ->setLit(true); - }); - $this->mapVanilla("redstone_wire", function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_WIRE() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNamesR13::REDSTONE_SIGNAL, 0, 15)); - }); - $this->mapVanilla("reeds", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SUGARCANE() - ->setAge($in->readBoundedInt(BlockStateNamesR13::AGE, 0, 15)); - }); - $this->mapVanilla("reserved6", fn() => VanillaBlocks::RESERVED6()); - $this->mapVanilla("sand", function(BlockStateReader $in) : Block{ - return match($value = $in->readString(BlockStateNamesR13::SAND_TYPE)){ - StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), - StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), - default => throw $in->badValueException(BlockStateNamesR13::SAND_TYPE, $value), - }; - }); - $this->mapVanilla("sandstone", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), - default => throw $in->badValueException(BlockStateNamesR13::SAND_STONE_TYPE, $type), - }; - }); - $this->mapVanilla("sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); - $this->mapVanilla("sapling", function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNamesR13::SAPLING_TYPE)){ - StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), - StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), - StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), - StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), - StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), - StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), - default => throw $in->badValueException(BlockStateNamesR13::SAPLING_TYPE, $type), - }) - ->setReady($in->readBool(BlockStateNamesR13::AGE_BIT)); - }); - $this->mapVanilla("seaLantern", fn() => VanillaBlocks::SEA_LANTERN()); - $this->mapVanilla("sea_pickle", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SEA_PICKLE() - ->setCount($in->readBoundedInt(BlockStateNamesR13::CLUSTER_COUNT, 0, 3) + 1) - ->setUnderwater(!$in->readBool(BlockStateNamesR13::DEAD_BIT)); - }); - $this->mapVanilla("shulker_box", function(BlockStateReader $in) : Block{ - return VanillaBlocks::DYED_SHULKER_BOX() - ->setColor($in->readColor()); - }); - $this->mapVanilla("silver_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("skull", function(BlockStateReader $in) : Block{ - return VanillaBlocks::MOB_HEAD() - ->setFacing($in->readFacingWithoutDown()) - ->setNoDrops($in->readBool(BlockStateNamesR13::NO_DROP_BIT)); - }); - $this->mapVanilla("slime", fn() => VanillaBlocks::SLIME()); - $this->mapVanilla("smoker", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SMOKER() - ->setFacing($in->readHorizontalFacing()) - ->setLit(false); - }); - $this->mapVanilla("smooth_quartz_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), $in)); - $this->mapVanilla("smooth_red_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); - $this->mapVanilla("smooth_sandstone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), $in)); - $this->mapVanilla("smooth_stone", fn() => VanillaBlocks::SMOOTH_STONE()); - $this->mapVanilla("snow", fn() => VanillaBlocks::SNOW()); - $this->mapVanilla("snow_layer", function(BlockStateReader $in) : Block{ - //TODO: intentionally ignored covered_bit property (appears useless and we don't track it) - return VanillaBlocks::SNOW_LAYER()->setLayers($in->readBoundedInt(BlockStateNamesR13::HEIGHT, 0, 7) + 1); - }); - $this->mapVanilla("soul_sand", fn() => VanillaBlocks::SOUL_SAND()); - $this->mapVanilla("sponge", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNamesR13::SPONGE_TYPE)){ - StringValues::SPONGE_TYPE_DRY => false, - StringValues::SPONGE_TYPE_WET => true, - default => throw $in->badValueException(BlockStateNamesR13::SPONGE_TYPE, $type), - }); - }); - $this->mapVanilla("spruce_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::SPRUCE_BUTTON(), $in)); - $this->mapVanilla("spruce_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::SPRUCE_DOOR(), $in)); - $this->mapVanilla("spruce_fence_gate", fn(BlockStateReader $in) => $this->decodeFenceGate(VanillaBlocks::SPRUCE_FENCE_GATE(), $in)); - $this->mapVanilla("spruce_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), $in)); - $this->mapVanilla("spruce_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::SPRUCE_STAIRS(), $in)); - $this->mapVanilla("spruce_standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPRUCE_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("spruce_trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::SPRUCE_TRAPDOOR(), $in)); - $this->mapVanilla("spruce_wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPRUCE_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("stained_glass", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_GLASS() - ->setColor($in->readColor()); - }); - $this->mapVanilla("stained_glass_pane", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_GLASS_PANE() - ->setColor($in->readColor()); - }); - $this->mapVanilla("stained_hardened_clay", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_CLAY() - ->setColor($in->readColor()); - }); - $this->mapVanilla("standing_banner", function(BlockStateReader $in) : Block{ - return VanillaBlocks::BANNER() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("standing_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::OAK_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNamesR13::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->mapVanilla("stone", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::STONE_TYPE)){ - StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), - StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), - StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), - StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), - StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), - StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), - StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_TYPE, $type), - }; - }); - $this->mapVanilla("stone_brick_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::STONE_BRICK_STAIRS(), $in)); - $this->mapVanilla("stone_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::STONE_BUTTON(), $in)); - $this->mapVanilla("stone_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::STONE_PRESSURE_PLATE(), $in)); - $this->mapVanilla("stone_slab", fn(BlockStateReader $in) => $this->mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); - $this->mapVanilla("stone_slab2", fn(BlockStateReader $in) => $this->mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); - $this->mapVanilla("stone_slab3", fn(BlockStateReader $in) => $this->mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); - $this->mapVanilla("stone_slab4", fn(BlockStateReader $in) => $this->mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); - $this->mapVanilla("stone_stairs", fn(BlockStateReader $in) => $this->decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); - $this->mapVanilla("stonebrick", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::STONE_BRICK_TYPE)){ - StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla - StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), - default => throw $in->badValueException(BlockStateNamesR13::STONE_BRICK_TYPE, $type), - }; - }); - $this->mapVanilla("stonecutter", fn() => VanillaBlocks::LEGACY_STONECUTTER()); - $this->mapVanilla("stripped_acacia_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_ACACIA_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("stripped_birch_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_BIRCH_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("stripped_dark_oak_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_DARK_OAK_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("stripped_jungle_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_JUNGLE_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("stripped_oak_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_OAK_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("stripped_spruce_log", function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_SPRUCE_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->mapVanilla("sweet_berry_bush", function(BlockStateReader $in) : Block{ - //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 - $growth = $in->readBoundedInt(BlockStateNamesR13::GROWTH, 0, 7); - return VanillaBlocks::SWEET_BERRY_BUSH() - ->setAge(min($growth, SweetBerryBush::STAGE_MATURE)); - }); - $this->mapVanilla("tallgrass", function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNamesR13::TALL_GRASS_TYPE)){ - StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), - StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), - default => throw $in->badValueException(BlockStateNamesR13::TALL_GRASS_TYPE, $type), - }; - }); - $this->mapVanilla("tnt", function(BlockStateReader $in) : Block{ - return VanillaBlocks::TNT() - ->setUnstable($in->readBool(BlockStateNamesR13::EXPLODE_BIT)) - ->setWorksUnderwater($in->readBool(BlockStateNamesR13::ALLOW_UNDERWATER_BIT)); - }); - $this->mapVanilla("torch", function(BlockStateReader $in) : Block{ - return VanillaBlocks::TORCH() - ->setFacing($in->readTorchFacing()); - }); - $this->mapVanilla("trapdoor", fn(BlockStateReader $in) => $this->decodeTrapdoor(VanillaBlocks::OAK_TRAPDOOR(), $in)); - $this->mapVanilla("trapped_chest", function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRAPPED_CHEST() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("tripWire", function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRIPWIRE() - ->setConnected($in->readBool(BlockStateNamesR13::ATTACHED_BIT)) - ->setDisarmed($in->readBool(BlockStateNamesR13::DISARMED_BIT)) - ->setSuspended($in->readBool(BlockStateNamesR13::SUSPENDED_BIT)) - ->setTriggered($in->readBool(BlockStateNamesR13::POWERED_BIT)); - }); - $this->mapVanilla("tripwire_hook", function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRIPWIRE_HOOK() - ->setConnected($in->readBool(BlockStateNamesR13::ATTACHED_BIT)) - ->setFacing($in->readLegacyHorizontalFacing()) - ->setPowered($in->readBool(BlockStateNamesR13::POWERED_BIT)); - }); - $this->mapVanilla("underwater_torch", function(BlockStateReader $in) : Block{ - return VanillaBlocks::UNDERWATER_TORCH() - ->setFacing($in->readTorchFacing()); - }); - $this->mapVanilla("undyed_shulker_box", fn() => VanillaBlocks::SHULKER_BOX()); - $this->mapVanilla("unlit_redstone_torch", function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_TORCH() - ->setFacing($in->readTorchFacing()) - ->setLit(false); - }); - $this->mapVanilla("unpowered_comparator", fn(BlockStateReader $in) => $this->decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); - $this->mapVanilla("unpowered_repeater", fn(BlockStateReader $in) => $this->decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) - ->setPowered(false)); - $this->mapVanilla("vine", function(BlockStateReader $in) : Block{ - $vineDirectionFlags = $in->readBoundedInt(BlockStateNamesR13::VINE_DIRECTION_BITS, 0, 15); - return VanillaBlocks::VINES() - ->setFace(Facing::NORTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_NORTH) !== 0) - ->setFace(Facing::SOUTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_SOUTH) !== 0) - ->setFace(Facing::WEST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_WEST) !== 0) - ->setFace(Facing::EAST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_EAST) !== 0); - }); - $this->mapVanilla("wall_banner", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_BANNER() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("wall_sign", function(BlockStateReader $in) : Block{ - return VanillaBlocks::OAK_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->mapVanilla("water", fn(BlockStateReader $in) => $this->decodeStillLiquid(VanillaBlocks::WATER(), $in)); - $this->mapVanilla("waterlily", fn() => VanillaBlocks::LILY_PAD()); - $this->mapVanilla("web", fn() => VanillaBlocks::COBWEB()); - $this->mapVanilla("wheat", fn(BlockStateReader $in) => $this->decodeCrops(VanillaBlocks::WHEAT(), $in)); - $this->mapVanilla("white_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), $in)); - $this->mapVanilla("wood", function(BlockStateReader $in) : Block{ - //TODO: our impl doesn't support axis yet - $stripped = $in->readBool(BlockStateNamesR13::STRIPPED_BIT); - return match($woodType = $in->readString(BlockStateNamesR13::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), - default => throw $in->badValueException(BlockStateNamesR13::WOOD_TYPE, $woodType), - }; - }); - $this->mapVanilla("wooden_button", fn(BlockStateReader $in) => $this->decodeButton(VanillaBlocks::OAK_BUTTON(), $in)); - $this->mapVanilla("wooden_door", fn(BlockStateReader $in) => $this->decodeDoor(VanillaBlocks::OAK_DOOR(), $in)); - $this->mapVanilla("wooden_pressure_plate", fn(BlockStateReader $in) => $this->decodeSimplePressurePlate(VanillaBlocks::OAK_PRESSURE_PLATE(), $in)); - $this->mapVanilla("wooden_slab", fn(BlockStateReader $in) => $this->mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); - $this->mapVanilla("wool", function(BlockStateReader $in) : Block{ - return VanillaBlocks::WOOL() - ->setColor($in->readColor()); - }); - $this->mapVanilla("yellow_flower", fn() => VanillaBlocks::DANDELION()); - $this->mapVanilla("yellow_glazed_terracotta", fn(BlockStateReader $in) => $this->decodeGlazedTerracotta(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), $in)); - //$this->mapVanilla("bubble_column", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * drag_down (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("camera", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("campfire", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * direction (IntTag) = 0, 1, 2, 3 - * extinguished (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("cartography_table", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("cauldron", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * cauldron_liquid (StringTag) = lava, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->mapVanilla("chain_command_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("chorus_flower", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * age (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("chorus_plant", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("command_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("composter", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 - */ - //}); - //$this->mapVanilla("conduit", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("dispenser", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("dropper", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("end_gateway", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("end_portal", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("grindstone", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * attachment (StringTag) = hanging, multiple, side, standing - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->mapVanilla("jigsaw", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("kelp", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->mapVanilla("lava_cauldron", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * cauldron_liquid (StringTag) = lava, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->mapVanilla("light_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->mapVanilla("movingBlock", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("observer", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("piston", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("pistonArmCollision", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("repeating_command_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("scaffolding", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - * stability_check (ByteTag) = 0, 1 - */ - //}); - //$this->mapVanilla("seagrass", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * sea_grass_type (StringTag) = default, double_bot, double_top - */ - //}); - //$this->mapVanilla("smithing_table", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - //$this->mapVanilla("stickyPistonArmCollision", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("sticky_piston", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("stonecutter_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->mapVanilla("structure_block", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * structure_block_type (StringTag) = corner, data, export, invalid, load, save - */ - //}); - //$this->mapVanilla("structure_void", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * structure_void_type (StringTag) = air, void - */ - //}); - //$this->mapVanilla("turtle_egg", function(BlockStateReader $in) : Block{ - /* TODO: parse properties - * cracked_state (StringTag) = cracked, max_cracked, no_cracks - * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg - */ - //}); - //$this->mapVanilla("wither_rose", function(BlockStateReader $in) : Block{ - //TODO: un-implemented block - //}); - } - - /** @throws BlockStateDeserializeException */ - public function deserialize(string $id, CompoundTag $blockState) : Block{ - if(!array_key_exists($id, $this->deserializeFuncs)){ - throw new BlockStateDeserializeException("Unknown block ID \"$id\""); - } - return $this->deserializeFuncs[$id](new BlockStateReader($blockState)); - } -} diff --git a/src/data/bedrock/blockstate/BlockStateNamesR13.php b/src/data/bedrock/blockstate/BlockStateNames.php similarity index 83% rename from src/data/bedrock/blockstate/BlockStateNamesR13.php rename to src/data/bedrock/blockstate/BlockStateNames.php index 1e27b17313..08279ded16 100644 --- a/src/data/bedrock/blockstate/BlockStateNamesR13.php +++ b/src/data/bedrock/blockstate/BlockStateNames.php @@ -23,8 +23,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; -final class BlockStateNamesR13{ +final class BlockStateNames{ + public const ACTIVE = "active"; public const AGE = "age"; public const AGE_BIT = "age_bit"; public const ALLOW_UNDERWATER_BIT = "allow_underwater_bit"; @@ -32,12 +33,16 @@ final class BlockStateNamesR13{ public const ATTACHMENT = "attachment"; public const BAMBOO_LEAF_SIZE = "bamboo_leaf_size"; public const BAMBOO_STALK_THICKNESS = "bamboo_stalk_thickness"; + public const BIG_DRIPLEAF_HEAD = "big_dripleaf_head"; + public const BIG_DRIPLEAF_TILT = "big_dripleaf_tilt"; public const BITE_COUNTER = "bite_counter"; public const BLOCK_LIGHT_LEVEL = "block_light_level"; + public const BLOOM = "bloom"; public const BREWING_STAND_SLOT_A_BIT = "brewing_stand_slot_a_bit"; public const BREWING_STAND_SLOT_B_BIT = "brewing_stand_slot_b_bit"; public const BREWING_STAND_SLOT_C_BIT = "brewing_stand_slot_c_bit"; public const BUTTON_PRESSED_BIT = "button_pressed_bit"; + public const CANDLES = "candles"; public const CAULDRON_LIQUID = "cauldron_liquid"; public const CHEMISTRY_TABLE_TYPE = "chemistry_table_type"; public const CHISEL_TYPE = "chisel_type"; @@ -61,6 +66,7 @@ final class BlockStateNamesR13{ public const DOOR_HINGE_BIT = "door_hinge_bit"; public const DOUBLE_PLANT_TYPE = "double_plant_type"; public const DRAG_DOWN = "drag_down"; + public const DRIPSTONE_THICKNESS = "dripstone_thickness"; public const END_PORTAL_EYE_BIT = "end_portal_eye_bit"; public const EXPLODE_BIT = "explode_bit"; public const EXTINGUISHED = "extinguished"; @@ -68,18 +74,24 @@ final class BlockStateNamesR13{ public const FILL_LEVEL = "fill_level"; public const FLOWER_TYPE = "flower_type"; public const GROUND_SIGN_DIRECTION = "ground_sign_direction"; + public const GROWING_PLANT_AGE = "growing_plant_age"; public const GROWTH = "growth"; public const HANGING = "hanging"; public const HEAD_PIECE_BIT = "head_piece_bit"; public const HEIGHT = "height"; + public const HONEY_LEVEL = "honey_level"; public const HUGE_MUSHROOM_BITS = "huge_mushroom_bits"; public const IN_WALL_BIT = "in_wall_bit"; public const INFINIBURN_BIT = "infiniburn_bit"; public const ITEM_FRAME_MAP_BIT = "item_frame_map_bit"; + public const ITEM_FRAME_PHOTO_BIT = "item_frame_photo_bit"; + public const KELP_AGE = "kelp_age"; public const LEVER_DIRECTION = "lever_direction"; public const LIQUID_DEPTH = "liquid_depth"; + public const LIT = "lit"; public const MOISTURIZED_AMOUNT = "moisturized_amount"; public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; + public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; public const NEW_LEAF_TYPE = "new_leaf_type"; public const NEW_LOG_TYPE = "new_log_type"; public const NO_DROP_BIT = "no_drop_bit"; @@ -98,6 +110,8 @@ final class BlockStateNamesR13{ public const RAIL_DIRECTION = "rail_direction"; public const REDSTONE_SIGNAL = "redstone_signal"; public const REPEATER_DELAY = "repeater_delay"; + public const RESPAWN_ANCHOR_CHARGE = "respawn_anchor_charge"; + public const ROTATION = "rotation"; public const SAND_STONE_TYPE = "sand_stone_type"; public const SAND_TYPE = "sand_type"; public const SAPLING_TYPE = "sapling_type"; @@ -121,11 +135,18 @@ final class BlockStateNamesR13{ public const TORCH_FACING_DIRECTION = "torch_facing_direction"; public const TRIGGERED_BIT = "triggered_bit"; public const TURTLE_EGG_COUNT = "turtle_egg_count"; + public const TWISTING_VINES_AGE = "twisting_vines_age"; public const UPDATE_BIT = "update_bit"; public const UPPER_BLOCK_BIT = "upper_block_bit"; public const UPSIDE_DOWN_BIT = "upside_down_bit"; public const VINE_DIRECTION_BITS = "vine_direction_bits"; public const WALL_BLOCK_TYPE = "wall_block_type"; + public const WALL_CONNECTION_TYPE_EAST = "wall_connection_type_east"; + public const WALL_CONNECTION_TYPE_NORTH = "wall_connection_type_north"; + public const WALL_CONNECTION_TYPE_SOUTH = "wall_connection_type_south"; + public const WALL_CONNECTION_TYPE_WEST = "wall_connection_type_west"; + public const WALL_POST_BIT = "wall_post_bit"; + public const WEEPING_VINES_AGE = "weeping_vines_age"; public const WEIRDO_DIRECTION = "weirdo_direction"; public const WOOD_TYPE = "wood_type"; } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index ebbaf0f6c9..21537e452b 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -27,7 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; -use pocketmine\data\bedrock\blockstate\BlockStateStringValuesR13 as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; @@ -115,7 +115,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readFacingDirection() : int{ - return $this->parseFacingValue($this->readInt(BlockStateNamesR13::FACING_DIRECTION), [ + return $this->parseFacingValue($this->readInt(BlockStateNames::FACING_DIRECTION), [ 0 => Facing::DOWN, 1 => Facing::UP, 2 => Facing::NORTH, @@ -127,7 +127,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readHorizontalFacing() : int{ - return $this->parseFacingValue($this->readInt(BlockStateNamesR13::FACING_DIRECTION), [ + return $this->parseFacingValue($this->readInt(BlockStateNames::FACING_DIRECTION), [ 0 => Facing::NORTH, //should be illegal, but 1.13 allows it 1 => Facing::NORTH, //also should be illegal 2 => Facing::NORTH, @@ -139,7 +139,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readWeirdoHorizontalFacing() : int{ - return $this->parseFacingValue($this->readInt(BlockStateNamesR13::WEIRDO_DIRECTION), [ + return $this->parseFacingValue($this->readInt(BlockStateNames::WEIRDO_DIRECTION), [ 0 => Facing::EAST, 1 => Facing::WEST, 2 => Facing::SOUTH, @@ -149,7 +149,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readLegacyHorizontalFacing() : int{ - return $this->parseFacingValue($this->readInt(BlockStateNamesR13::DIRECTION), [ + return $this->parseFacingValue($this->readInt(BlockStateNames::DIRECTION), [ 0 => Facing::SOUTH, 1 => Facing::WEST, 2 => Facing::NORTH, @@ -160,7 +160,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - return match($color = $this->readString(BlockStateNamesR13::COLOR)){ + return match($color = $this->readString(BlockStateNames::COLOR)){ StringValues::COLOR_BLACK => DyeColor::BLACK(), StringValues::COLOR_BLUE => DyeColor::BLUE(), StringValues::COLOR_BROWN => DyeColor::BROWN(), @@ -177,13 +177,13 @@ final class BlockStateReader{ StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY(), StringValues::COLOR_WHITE => DyeColor::WHITE(), StringValues::COLOR_YELLOW => DyeColor::YELLOW(), - default => throw $this->badValueException(BlockStateNamesR13::COLOR, $color), + default => throw $this->badValueException(BlockStateNames::COLOR, $color), }; } /** @throws BlockStateDeserializeException */ public function readCoralFacing() : int{ - return $this->parseFacingValue($this->readInt(BlockStateNamesR13::CORAL_DIRECTION), [ + return $this->parseFacingValue($this->readInt(BlockStateNames::CORAL_DIRECTION), [ 0 => Facing::WEST, 1 => Facing::EAST, 2 => Facing::NORTH, @@ -213,21 +213,21 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function readPillarAxis() : int{ - $rawValue = $this->readString(BlockStateNamesR13::PILLAR_AXIS); + $rawValue = $this->readString(BlockStateNames::PILLAR_AXIS); $value = [ StringValues::PILLAR_AXIS_X => Axis::X, StringValues::PILLAR_AXIS_Y => Axis::Y, StringValues::PILLAR_AXIS_Z => Axis::Z ][$rawValue] ?? null; if($value === null){ - throw $this->badValueException(BlockStateNamesR13::PILLAR_AXIS, $rawValue, "Invalid axis value"); + throw $this->badValueException(BlockStateNames::PILLAR_AXIS, $rawValue, "Invalid axis value"); } return $value; } /** @throws BlockStateDeserializeException */ public function readSlabPosition() : SlabType{ - return $this->readBool(BlockStateNamesR13::TOP_SLOT_BIT) ? SlabType::TOP() : SlabType::BOTTOM(); + return $this->readBool(BlockStateNames::TOP_SLOT_BIT) ? SlabType::TOP() : SlabType::BOTTOM(); } /** @@ -235,37 +235,37 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function readTorchFacing() : int{ - return match($rawValue = $this->readString(BlockStateNamesR13::TORCH_FACING_DIRECTION)){ + return match($rawValue = $this->readString(BlockStateNames::TORCH_FACING_DIRECTION)){ StringValues::TORCH_FACING_DIRECTION_EAST => Facing::EAST, StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, StringValues::TORCH_FACING_DIRECTION_TOP => Facing::UP, StringValues::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it StringValues::TORCH_FACING_DIRECTION_WEST => Facing::WEST, - default => throw $this->badValueException(BlockStateNamesR13::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), + default => throw $this->badValueException(BlockStateNames::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), }; } /** @throws BlockStateDeserializeException */ public function readCoralType() : CoralType{ - return match($type = $this->readString(BlockStateNamesR13::CORAL_COLOR)){ + return match($type = $this->readString(BlockStateNames::CORAL_COLOR)){ StringValues::CORAL_COLOR_BLUE => CoralType::TUBE(), StringValues::CORAL_COLOR_PINK => CoralType::BRAIN(), StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), StringValues::CORAL_COLOR_RED => CoralType::FIRE(), StringValues::CORAL_COLOR_YELLOW => CoralType::HORN(), - default => throw $this->badValueException(BlockStateNamesR13::CORAL_COLOR, $type), + default => throw $this->badValueException(BlockStateNames::CORAL_COLOR, $type), }; } /** @throws BlockStateDeserializeException */ public function readBellAttachmentType() : BellAttachmentType{ - return match($type = $this->readString(BlockStateNamesR13::ATTACHMENT)){ + return match($type = $this->readString(BlockStateNames::ATTACHMENT)){ StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), - default => throw $this->badValueException(BlockStateNamesR13::ATTACHMENT, $type), + default => throw $this->badValueException(BlockStateNames::ATTACHMENT, $type), }; } } diff --git a/src/data/bedrock/blockstate/BlockStateSerializeException.php b/src/data/bedrock/blockstate/BlockStateSerializeException.php new file mode 100644 index 0000000000..96eb1d5396 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateSerializeException.php @@ -0,0 +1,28 @@ +> + */ + private array $serializers = []; + + /** + * @phpstan-template TBlockType of Block + * @phpstan-param TBlockType $block + * @phpstan-param \Closure(TBlockType) : BlockStateWriter $serializer + */ + private function map(Block $block, \Closure $serializer) : void{ + $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; + } + + public function __construct(){ + $this->map(VanillaBlocks::AIR(), fn() => new BlockStateWriter(Ids::AIR)); + $this->map(VanillaBlocks::BARRIER(), fn() => new BlockStateWriter(Ids::BARRIER)); + $this->map(VanillaBlocks::BEACON(), fn() => new BlockStateWriter(Ids::BEACON)); + $this->map(VanillaBlocks::BLUE_ICE(), fn() => new BlockStateWriter(Ids::BLUE_ICE)); + $this->map(VanillaBlocks::BOOKSHELF(), fn() => new BlockStateWriter(Ids::BOOKSHELF)); + $this->map(VanillaBlocks::BRICKS(), fn() => new BlockStateWriter(Ids::BRICK_BLOCK)); + $this->map(VanillaBlocks::BROWN_MUSHROOM(), fn() => new BlockStateWriter(Ids::BROWN_MUSHROOM)); + $this->map(VanillaBlocks::CHEMICAL_HEAT(), fn() => new BlockStateWriter(Ids::CHEMICAL_HEAT)); + $this->map(VanillaBlocks::CLAY(), fn() => new BlockStateWriter(Ids::CLAY)); + $this->map(VanillaBlocks::COAL(), fn() => new BlockStateWriter(Ids::COAL_BLOCK)); + $this->map(VanillaBlocks::COAL_ORE(), fn() => new BlockStateWriter(Ids::COAL_ORE)); + $this->map(VanillaBlocks::COBBLESTONE(), fn() => new BlockStateWriter(Ids::COBBLESTONE)); + $this->map(VanillaBlocks::CRAFTING_TABLE(), fn() => new BlockStateWriter(Ids::CRAFTING_TABLE)); + $this->map(VanillaBlocks::DEAD_BUSH(), fn() => new BlockStateWriter(Ids::DEADBUSH)); + $this->map(VanillaBlocks::DIAMOND(), fn() => new BlockStateWriter(Ids::DIAMOND_BLOCK)); + $this->map(VanillaBlocks::DIAMOND_ORE(), fn() => new BlockStateWriter(Ids::DIAMOND_ORE)); + $this->map(VanillaBlocks::DRAGON_EGG(), fn() => new BlockStateWriter(Ids::DRAGON_EGG)); + $this->map(VanillaBlocks::DRIED_KELP(), fn() => new BlockStateWriter(Ids::DRIED_KELP_BLOCK)); + $this->map(VanillaBlocks::ELEMENT_ZERO(), fn() => new BlockStateWriter(Ids::ELEMENT_0)); + $this->map(VanillaBlocks::ELEMENT_HYDROGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_1)); + $this->map(VanillaBlocks::ELEMENT_NEON(), fn() => new BlockStateWriter(Ids::ELEMENT_10)); + $this->map(VanillaBlocks::ELEMENT_FERMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_100)); + $this->map(VanillaBlocks::ELEMENT_MENDELEVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_101)); + $this->map(VanillaBlocks::ELEMENT_NOBELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_102)); + $this->map(VanillaBlocks::ELEMENT_LAWRENCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_103)); + $this->map(VanillaBlocks::ELEMENT_RUTHERFORDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_104)); + $this->map(VanillaBlocks::ELEMENT_DUBNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_105)); + $this->map(VanillaBlocks::ELEMENT_SEABORGIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_106)); + $this->map(VanillaBlocks::ELEMENT_BOHRIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_107)); + $this->map(VanillaBlocks::ELEMENT_HASSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_108)); + $this->map(VanillaBlocks::ELEMENT_MEITNERIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_109)); + $this->map(VanillaBlocks::ELEMENT_SODIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_11)); + $this->map(VanillaBlocks::ELEMENT_DARMSTADTIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_110)); + $this->map(VanillaBlocks::ELEMENT_ROENTGENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_111)); + $this->map(VanillaBlocks::ELEMENT_COPERNICIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_112)); + $this->map(VanillaBlocks::ELEMENT_NIHONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_113)); + $this->map(VanillaBlocks::ELEMENT_FLEROVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_114)); + $this->map(VanillaBlocks::ELEMENT_MOSCOVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_115)); + $this->map(VanillaBlocks::ELEMENT_LIVERMORIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_116)); + $this->map(VanillaBlocks::ELEMENT_TENNESSINE(), fn() => new BlockStateWriter(Ids::ELEMENT_117)); + $this->map(VanillaBlocks::ELEMENT_OGANESSON(), fn() => new BlockStateWriter(Ids::ELEMENT_118)); + $this->map(VanillaBlocks::ELEMENT_MAGNESIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_12)); + $this->map(VanillaBlocks::ELEMENT_ALUMINUM(), fn() => new BlockStateWriter(Ids::ELEMENT_13)); + $this->map(VanillaBlocks::ELEMENT_SILICON(), fn() => new BlockStateWriter(Ids::ELEMENT_14)); + $this->map(VanillaBlocks::ELEMENT_PHOSPHORUS(), fn() => new BlockStateWriter(Ids::ELEMENT_15)); + $this->map(VanillaBlocks::ELEMENT_SULFUR(), fn() => new BlockStateWriter(Ids::ELEMENT_16)); + $this->map(VanillaBlocks::ELEMENT_CHLORINE(), fn() => new BlockStateWriter(Ids::ELEMENT_17)); + $this->map(VanillaBlocks::ELEMENT_ARGON(), fn() => new BlockStateWriter(Ids::ELEMENT_18)); + $this->map(VanillaBlocks::ELEMENT_POTASSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_19)); + $this->map(VanillaBlocks::ELEMENT_HELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_2)); + $this->map(VanillaBlocks::ELEMENT_CALCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_20)); + $this->map(VanillaBlocks::ELEMENT_SCANDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_21)); + $this->map(VanillaBlocks::ELEMENT_TITANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_22)); + $this->map(VanillaBlocks::ELEMENT_VANADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_23)); + $this->map(VanillaBlocks::ELEMENT_CHROMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_24)); + $this->map(VanillaBlocks::ELEMENT_MANGANESE(), fn() => new BlockStateWriter(Ids::ELEMENT_25)); + $this->map(VanillaBlocks::ELEMENT_IRON(), fn() => new BlockStateWriter(Ids::ELEMENT_26)); + $this->map(VanillaBlocks::ELEMENT_COBALT(), fn() => new BlockStateWriter(Ids::ELEMENT_27)); + $this->map(VanillaBlocks::ELEMENT_NICKEL(), fn() => new BlockStateWriter(Ids::ELEMENT_28)); + $this->map(VanillaBlocks::ELEMENT_COPPER(), fn() => new BlockStateWriter(Ids::ELEMENT_29)); + $this->map(VanillaBlocks::ELEMENT_LITHIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_3)); + $this->map(VanillaBlocks::ELEMENT_ZINC(), fn() => new BlockStateWriter(Ids::ELEMENT_30)); + $this->map(VanillaBlocks::ELEMENT_GALLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_31)); + $this->map(VanillaBlocks::ELEMENT_GERMANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_32)); + $this->map(VanillaBlocks::ELEMENT_ARSENIC(), fn() => new BlockStateWriter(Ids::ELEMENT_33)); + $this->map(VanillaBlocks::ELEMENT_SELENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_34)); + $this->map(VanillaBlocks::ELEMENT_BROMINE(), fn() => new BlockStateWriter(Ids::ELEMENT_35)); + $this->map(VanillaBlocks::ELEMENT_KRYPTON(), fn() => new BlockStateWriter(Ids::ELEMENT_36)); + $this->map(VanillaBlocks::ELEMENT_RUBIDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_37)); + $this->map(VanillaBlocks::ELEMENT_STRONTIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_38)); + $this->map(VanillaBlocks::ELEMENT_YTTRIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_39)); + $this->map(VanillaBlocks::ELEMENT_BERYLLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_4)); + $this->map(VanillaBlocks::ELEMENT_ZIRCONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_40)); + $this->map(VanillaBlocks::ELEMENT_NIOBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_41)); + $this->map(VanillaBlocks::ELEMENT_MOLYBDENUM(), fn() => new BlockStateWriter(Ids::ELEMENT_42)); + $this->map(VanillaBlocks::ELEMENT_TECHNETIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_43)); + $this->map(VanillaBlocks::ELEMENT_RUTHENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_44)); + $this->map(VanillaBlocks::ELEMENT_RHODIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_45)); + $this->map(VanillaBlocks::ELEMENT_PALLADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_46)); + $this->map(VanillaBlocks::ELEMENT_SILVER(), fn() => new BlockStateWriter(Ids::ELEMENT_47)); + $this->map(VanillaBlocks::ELEMENT_CADMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_48)); + $this->map(VanillaBlocks::ELEMENT_INDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_49)); + $this->map(VanillaBlocks::ELEMENT_BORON(), fn() => new BlockStateWriter(Ids::ELEMENT_5)); + $this->map(VanillaBlocks::ELEMENT_TIN(), fn() => new BlockStateWriter(Ids::ELEMENT_50)); + $this->map(VanillaBlocks::ELEMENT_ANTIMONY(), fn() => new BlockStateWriter(Ids::ELEMENT_51)); + $this->map(VanillaBlocks::ELEMENT_TELLURIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_52)); + $this->map(VanillaBlocks::ELEMENT_IODINE(), fn() => new BlockStateWriter(Ids::ELEMENT_53)); + $this->map(VanillaBlocks::ELEMENT_XENON(), fn() => new BlockStateWriter(Ids::ELEMENT_54)); + $this->map(VanillaBlocks::ELEMENT_CESIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_55)); + $this->map(VanillaBlocks::ELEMENT_BARIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_56)); + $this->map(VanillaBlocks::ELEMENT_LANTHANUM(), fn() => new BlockStateWriter(Ids::ELEMENT_57)); + $this->map(VanillaBlocks::ELEMENT_CERIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_58)); + $this->map(VanillaBlocks::ELEMENT_PRASEODYMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_59)); + $this->map(VanillaBlocks::ELEMENT_CARBON(), fn() => new BlockStateWriter(Ids::ELEMENT_6)); + $this->map(VanillaBlocks::ELEMENT_NEODYMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_60)); + $this->map(VanillaBlocks::ELEMENT_PROMETHIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_61)); + $this->map(VanillaBlocks::ELEMENT_SAMARIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_62)); + $this->map(VanillaBlocks::ELEMENT_EUROPIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_63)); + $this->map(VanillaBlocks::ELEMENT_GADOLINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_64)); + $this->map(VanillaBlocks::ELEMENT_TERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_65)); + $this->map(VanillaBlocks::ELEMENT_DYSPROSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_66)); + $this->map(VanillaBlocks::ELEMENT_HOLMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_67)); + $this->map(VanillaBlocks::ELEMENT_ERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_68)); + $this->map(VanillaBlocks::ELEMENT_THULIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_69)); + $this->map(VanillaBlocks::ELEMENT_NITROGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_7)); + $this->map(VanillaBlocks::ELEMENT_YTTERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_70)); + $this->map(VanillaBlocks::ELEMENT_LUTETIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_71)); + $this->map(VanillaBlocks::ELEMENT_HAFNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_72)); + $this->map(VanillaBlocks::ELEMENT_TANTALUM(), fn() => new BlockStateWriter(Ids::ELEMENT_73)); + $this->map(VanillaBlocks::ELEMENT_TUNGSTEN(), fn() => new BlockStateWriter(Ids::ELEMENT_74)); + $this->map(VanillaBlocks::ELEMENT_RHENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_75)); + $this->map(VanillaBlocks::ELEMENT_OSMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_76)); + $this->map(VanillaBlocks::ELEMENT_IRIDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_77)); + $this->map(VanillaBlocks::ELEMENT_PLATINUM(), fn() => new BlockStateWriter(Ids::ELEMENT_78)); + $this->map(VanillaBlocks::ELEMENT_GOLD(), fn() => new BlockStateWriter(Ids::ELEMENT_79)); + $this->map(VanillaBlocks::ELEMENT_OXYGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_8)); + $this->map(VanillaBlocks::ELEMENT_MERCURY(), fn() => new BlockStateWriter(Ids::ELEMENT_80)); + $this->map(VanillaBlocks::ELEMENT_THALLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_81)); + $this->map(VanillaBlocks::ELEMENT_LEAD(), fn() => new BlockStateWriter(Ids::ELEMENT_82)); + $this->map(VanillaBlocks::ELEMENT_BISMUTH(), fn() => new BlockStateWriter(Ids::ELEMENT_83)); + $this->map(VanillaBlocks::ELEMENT_POLONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_84)); + $this->map(VanillaBlocks::ELEMENT_ASTATINE(), fn() => new BlockStateWriter(Ids::ELEMENT_85)); + $this->map(VanillaBlocks::ELEMENT_RADON(), fn() => new BlockStateWriter(Ids::ELEMENT_86)); + $this->map(VanillaBlocks::ELEMENT_FRANCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_87)); + $this->map(VanillaBlocks::ELEMENT_RADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_88)); + $this->map(VanillaBlocks::ELEMENT_ACTINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_89)); + $this->map(VanillaBlocks::ELEMENT_FLUORINE(), fn() => new BlockStateWriter(Ids::ELEMENT_9)); + $this->map(VanillaBlocks::ELEMENT_THORIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_90)); + $this->map(VanillaBlocks::ELEMENT_PROTACTINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_91)); + $this->map(VanillaBlocks::ELEMENT_URANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_92)); + $this->map(VanillaBlocks::ELEMENT_NEPTUNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_93)); + $this->map(VanillaBlocks::ELEMENT_PLUTONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_94)); + $this->map(VanillaBlocks::ELEMENT_AMERICIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_95)); + $this->map(VanillaBlocks::ELEMENT_CURIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_96)); + $this->map(VanillaBlocks::ELEMENT_BERKELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_97)); + $this->map(VanillaBlocks::ELEMENT_CALIFORNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_98)); + $this->map(VanillaBlocks::ELEMENT_EINSTEINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_99)); + $this->map(VanillaBlocks::EMERALD(), fn() => new BlockStateWriter(Ids::EMERALD_BLOCK)); + $this->map(VanillaBlocks::EMERALD_ORE(), fn() => new BlockStateWriter(Ids::EMERALD_ORE)); + $this->map(VanillaBlocks::ENCHANTING_TABLE(), fn() => new BlockStateWriter(Ids::ENCHANTING_TABLE)); + $this->map(VanillaBlocks::END_STONE_BRICKS(), fn() => new BlockStateWriter(Ids::END_BRICKS)); + $this->map(VanillaBlocks::END_STONE(), fn() => new BlockStateWriter(Ids::END_STONE)); + $this->map(VanillaBlocks::FLETCHING_TABLE(), fn() => new BlockStateWriter(Ids::FLETCHING_TABLE)); + $this->map(VanillaBlocks::GLASS(), fn() => new BlockStateWriter(Ids::GLASS)); + $this->map(VanillaBlocks::GLASS_PANE(), fn() => new BlockStateWriter(Ids::GLASS_PANE)); + $this->map(VanillaBlocks::GLOWING_OBSIDIAN(), fn() => new BlockStateWriter(Ids::GLOWINGOBSIDIAN)); + $this->map(VanillaBlocks::GLOWSTONE(), fn() => new BlockStateWriter(Ids::GLOWSTONE)); + $this->map(VanillaBlocks::GOLD(), fn() => new BlockStateWriter(Ids::GOLD_BLOCK)); + $this->map(VanillaBlocks::GOLD_ORE(), fn() => new BlockStateWriter(Ids::GOLD_ORE)); + $this->map(VanillaBlocks::GRASS(), fn() => new BlockStateWriter(Ids::GRASS)); + $this->map(VanillaBlocks::GRASS_PATH(), fn() => new BlockStateWriter(Ids::GRASS_PATH)); + $this->map(VanillaBlocks::GRAVEL(), fn() => new BlockStateWriter(Ids::GRAVEL)); + $this->map(VanillaBlocks::HARDENED_GLASS(), fn() => new BlockStateWriter(Ids::HARD_GLASS)); + $this->map(VanillaBlocks::HARDENED_GLASS_PANE(), fn() => new BlockStateWriter(Ids::HARD_GLASS_PANE)); + $this->map(VanillaBlocks::HARDENED_CLAY(), fn() => new BlockStateWriter(Ids::HARDENED_CLAY)); + $this->map(VanillaBlocks::ICE(), fn() => new BlockStateWriter(Ids::ICE)); + $this->map(VanillaBlocks::INFO_UPDATE(), fn() => new BlockStateWriter(Ids::INFO_UPDATE)); + $this->map(VanillaBlocks::INFO_UPDATE2(), fn() => new BlockStateWriter(Ids::INFO_UPDATE2)); + $this->map(VanillaBlocks::INVISIBLE_BEDROCK(), fn() => new BlockStateWriter(Ids::INVISIBLEBEDROCK)); + $this->map(VanillaBlocks::IRON_BARS(), fn() => new BlockStateWriter(Ids::IRON_BARS)); + $this->map(VanillaBlocks::IRON(), fn() => new BlockStateWriter(Ids::IRON_BLOCK)); + $this->map(VanillaBlocks::IRON_ORE(), fn() => new BlockStateWriter(Ids::IRON_ORE)); + $this->map(VanillaBlocks::JUKEBOX(), fn() => new BlockStateWriter(Ids::JUKEBOX)); + $this->map(VanillaBlocks::LAPIS_LAZULI(), fn() => new BlockStateWriter(Ids::LAPIS_BLOCK)); + $this->map(VanillaBlocks::LAPIS_LAZULI_ORE(), fn() => new BlockStateWriter(Ids::LAPIS_ORE)); + $this->map(VanillaBlocks::REDSTONE_LAMP(), fn() => new BlockStateWriter(Ids::LIT_REDSTONE_LAMP)); + $this->map(VanillaBlocks::REDSTONE_ORE(), fn() => new BlockStateWriter(Ids::LIT_REDSTONE_ORE)); + $this->map(VanillaBlocks::MAGMA(), fn() => new BlockStateWriter(Ids::MAGMA)); + $this->map(VanillaBlocks::MELON(), fn() => new BlockStateWriter(Ids::MELON_BLOCK)); + $this->map(VanillaBlocks::MONSTER_SPAWNER(), fn() => new BlockStateWriter(Ids::MOB_SPAWNER)); + $this->map(VanillaBlocks::MOSSY_COBBLESTONE(), fn() => new BlockStateWriter(Ids::MOSSY_COBBLESTONE)); + $this->map(VanillaBlocks::MYCELIUM(), fn() => new BlockStateWriter(Ids::MYCELIUM)); + $this->map(VanillaBlocks::NETHER_BRICKS(), fn() => new BlockStateWriter(Ids::NETHER_BRICK)); + $this->map(VanillaBlocks::NETHER_BRICK_FENCE(), fn() => new BlockStateWriter(Ids::NETHER_BRICK_FENCE)); + $this->map(VanillaBlocks::NETHER_WART_BLOCK(), fn() => new BlockStateWriter(Ids::NETHER_WART_BLOCK)); + $this->map(VanillaBlocks::NETHERRACK(), fn() => new BlockStateWriter(Ids::NETHERRACK)); + $this->map(VanillaBlocks::NETHER_REACTOR_CORE(), fn() => new BlockStateWriter(Ids::NETHERREACTOR)); + $this->map(VanillaBlocks::NOTE_BLOCK(), fn() => new BlockStateWriter(Ids::NOTEBLOCK)); + $this->map(VanillaBlocks::OBSIDIAN(), fn() => new BlockStateWriter(Ids::OBSIDIAN)); + $this->map(VanillaBlocks::PACKED_ICE(), fn() => new BlockStateWriter(Ids::PACKED_ICE)); + $this->map(VanillaBlocks::PODZOL(), fn() => new BlockStateWriter(Ids::PODZOL)); + $this->map(VanillaBlocks::NETHER_QUARTZ_ORE(), fn() => new BlockStateWriter(Ids::QUARTZ_ORE)); + $this->map(VanillaBlocks::RED_MUSHROOM(), fn() => new BlockStateWriter(Ids::RED_MUSHROOM)); + $this->map(VanillaBlocks::RED_NETHER_BRICKS(), fn() => new BlockStateWriter(Ids::RED_NETHER_BRICK)); + $this->map(VanillaBlocks::REDSTONE(), fn() => new BlockStateWriter(Ids::REDSTONE_BLOCK)); + $this->map(VanillaBlocks::REDSTONE_LAMP(), fn() => new BlockStateWriter(Ids::REDSTONE_LAMP)); + $this->map(VanillaBlocks::REDSTONE_ORE(), fn() => new BlockStateWriter(Ids::REDSTONE_ORE)); + $this->map(VanillaBlocks::RESERVED6(), fn() => new BlockStateWriter(Ids::RESERVED6)); + $this->map(VanillaBlocks::SEA_LANTERN(), fn() => new BlockStateWriter(Ids::SEALANTERN)); + $this->map(VanillaBlocks::SLIME(), fn() => new BlockStateWriter(Ids::SLIME)); + $this->map(VanillaBlocks::SMOOTH_STONE(), fn() => new BlockStateWriter(Ids::SMOOTH_STONE)); + $this->map(VanillaBlocks::SNOW(), fn() => new BlockStateWriter(Ids::SNOW)); + $this->map(VanillaBlocks::SOUL_SAND(), fn() => new BlockStateWriter(Ids::SOUL_SAND)); + $this->map(VanillaBlocks::LEGACY_STONECUTTER(), fn() => new BlockStateWriter(Ids::STONECUTTER)); + $this->map(VanillaBlocks::SHULKER_BOX(), fn() => new BlockStateWriter(Ids::UNDYED_SHULKER_BOX)); + $this->map(VanillaBlocks::LILY_PAD(), fn() => new BlockStateWriter(Ids::WATERLILY)); + $this->map(VanillaBlocks::COBWEB(), fn() => new BlockStateWriter(Ids::WEB)); + $this->map(VanillaBlocks::DANDELION(), fn() => new BlockStateWriter(Ids::YELLOW_FLOWER)); + //$this->map(VanillaBlocks::ACACIA_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ACACIA_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACACIA_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::ACTIVATOR_RAIL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ACTIVATOR_RAIL()) + * TODO: implement (de)serializer + * rail_data_bit (ByteTag) = 0, 1 + * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::AMETHYST_CLUSTER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::ANDESITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ANDESITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::ANVIL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ANVIL()) + * TODO: implement (de)serializer + * damage (StringTag) = broken, slightly_damaged, undamaged, very_damaged + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::AZALEA_LEAVES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::AZALEA_LEAVES_FLOWERED(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BAMBOO(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BAMBOO()) + * TODO: implement (de)serializer + * age_bit (ByteTag) = 0, 1 + * bamboo_leaf_size (StringTag) = large_leaves, no_leaves, small_leaves + * bamboo_stalk_thickness (StringTag) = thick, thin + */ + //}); + //$this->map(VanillaBlocks::BAMBOO_SAPLING(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BAMBOO_SAPLING()) + * TODO: implement (de)serializer + * age_bit (ByteTag) = 0, 1 + * sapling_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::BARREL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BARREL()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BASALT(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::BED(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BED()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * head_piece_bit (ByteTag) = 0, 1 + * occupied_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BEDROCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BEDROCK()) + * TODO: implement (de)serializer + * infiniburn_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BEEHIVE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BEETROOT(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BEETROOTS()) + * TODO: implement (de)serializer + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::BEE_NEST(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BELL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BELL()) + * TODO: implement (de)serializer + * attachment (StringTag) = hanging, multiple, side, standing + * direction (IntTag) = 0, 1, 2, 3 + * toggle_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BIG_DRIPLEAF(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * big_dripleaf_head (ByteTag) = 0, 1 + * big_dripleaf_tilt (StringTag) = full_tilt, none, partial_tilt, unstable + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BIRCH_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BIRCH_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BLACKSTONE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLACKSTONE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLACKSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::BLACKSTONE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLACK_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLACK_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BLACK_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BLAST_FURNACE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BLAST_FURNACE()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BLUE_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLUE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BLUE_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BONE_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BONE_BLOCK()) + * TODO: implement (de)serializer + * deprecated (IntTag) = 0, 1, 2, 3 + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::BORDER_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BREWING_STAND(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BREWING_STAND()) + * TODO: implement (de)serializer + * brewing_stand_slot_a_bit (ByteTag) = 0, 1 + * brewing_stand_slot_b_bit (ByteTag) = 0, 1 + * brewing_stand_slot_c_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::BROWN_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BROWN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BROWN_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BROWN_MUSHROOM_BLOCK()) + * TODO: implement (de)serializer + * huge_mushroom_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::BUBBLE_COLUMN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * drag_down (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CACTUS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CACTUS()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::CAKE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CAKE()) + * TODO: implement (de)serializer + * bite_counter (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->map(VanillaBlocks::CAMPFIRE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * extinguished (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CARPET(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CARPET()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::CARROTS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CARROTS()) + * TODO: implement (de)serializer + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::CARVED_PUMPKIN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CARVED_PUMPKIN()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::CAULDRON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * cauldron_liquid (StringTag) = lava, powder_snow, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->map(VanillaBlocks::CAVE_VINES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::CAVE_VINES_BODY_WITH_BERRIES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::CAVE_VINES_HEAD_WITH_BERRIES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::CHAIN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::CHAIN_COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::CHEMISTRY_TABLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * chemistry_table_type (StringTag) = compound_creator, element_constructor, lab_table, material_reducer + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::CHEST(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CHEST()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::CHORUS_FLOWER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * age (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::COBBLESTONE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::COBBLESTONE_WALL()) + * TODO: implement (de)serializer + * wall_block_type (StringTag) = andesite, brick, cobblestone, diorite, end_brick, granite, mossy_cobblestone, mossy_stone_brick, nether_brick, prismarine, red_nether_brick, red_sandstone, sandstone, stone_brick + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::COCOA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::COCOA_POD()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2 + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::COLORED_TORCH_BP(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * color_bit (ByteTag) = 0, 1 + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::COLORED_TORCH_RG(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * color_bit (ByteTag) = 0, 1 + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::COMPOSTER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 + */ + //}); + //$this->map(VanillaBlocks::CONCRETE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CONCRETE()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::CONCRETEPOWDER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CONCRETE_POWDER()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::CORAL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CORAL()) + * TODO: implement (de)serializer + * coral_color (StringTag) = blue, pink, purple, red, yellow + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CORAL_BLOCK()) + * TODO: implement (de)serializer + * coral_color (StringTag) = blue, pink, purple, red, yellow + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_FAN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CORAL_FAN()) + * TODO: implement (de)serializer + * coral_color (StringTag) = blue, pink, purple, red, yellow + * coral_fan_direction (IntTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_FAN_DEAD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * coral_color (StringTag) = blue, pink, purple, red, yellow + * coral_fan_direction (IntTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_FAN_HANG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) + * TODO: implement (de)serializer + * coral_direction (IntTag) = 0, 1, 2, 3 + * coral_hang_type_bit (ByteTag) = 0, 1 + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_FAN_HANG2(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) + * TODO: implement (de)serializer + * coral_direction (IntTag) = 0, 1, 2, 3 + * coral_hang_type_bit (ByteTag) = 0, 1 + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CORAL_FAN_HANG3(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) + * TODO: implement (de)serializer + * coral_direction (IntTag) = 0, 1, 2, 3 + * coral_hang_type_bit (ByteTag) = 0, 1 + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_HYPHAE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_STEM(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CRIMSON_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::CYAN_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CYAN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::CYAN_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::DARKOAK_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::DARKOAK_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::DARK_OAK_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_OAK_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DARK_PRISMARINE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DARK_PRISMARINE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::DAYLIGHT_DETECTOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DAYLIGHT_SENSOR()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::DAYLIGHT_DETECTOR_INVERTED(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DAYLIGHT_SENSOR()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_BRICK_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_BRICK_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_BRICK_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_TILE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_TILE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_TILE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::DEEPSLATE_TILE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DETECTOR_RAIL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DETECTOR_RAIL()) + * TODO: implement (de)serializer + * rail_data_bit (ByteTag) = 0, 1 + * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::DIORITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DIORITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::DIRT(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DIRT()) + * TODO: implement (de)serializer + * dirt_type (StringTag) = coarse, normal + */ + //}); + //$this->map(VanillaBlocks::DISPENSER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_PLANT(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * double_plant_type (StringTag) = fern, grass, paeonia, rose, sunflower, syringa + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB2(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB3(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB4(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::DOUBLE_WOODEN_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::DROPPER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * triggered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ENDER_CHEST(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ENDER_CHEST()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::END_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::END_STONE_BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::END_PORTAL_FRAME(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::END_PORTAL_FRAME()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * end_portal_eye_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::END_ROD(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::END_ROD()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::EXPOSED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::EXPOSED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::EXPOSED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::FARMLAND(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FARMLAND()) + * TODO: implement (de)serializer + * moisturized_amount (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::FENCE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::FIRE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FIRE()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::FLOWER_POT(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FLOWER_POT()) + * TODO: implement (de)serializer + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::FLOWING_LAVA(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::FLOWING_WATER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::FRAME(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * item_frame_map_bit (ByteTag) = 0, 1 + * item_frame_photo_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::FROSTED_ICE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FROSTED_ICE()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::FURNACE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FURNACE()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::GLOW_FRAME(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * item_frame_map_bit (ByteTag) = 0, 1 + * item_frame_photo_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::GLOW_LICHEN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + */ + //}); + //$this->map(VanillaBlocks::GOLDEN_RAIL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::POWERED_RAIL()) + * TODO: implement (de)serializer + * rail_data_bit (ByteTag) = 0, 1 + * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::GRANITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::GRANITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::GRAY_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::GRAY_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::GRAY_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::GREEN_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::GREEN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::GREEN_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::GRINDSTONE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * attachment (StringTag) = hanging, multiple, side, standing + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::HARD_STAINED_GLASS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STAINED_HARDENED_GLASS()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::HARD_STAINED_GLASS_PANE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STAINED_HARDENED_GLASS_PANE()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::HAY_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::HAY_BALE()) + * TODO: implement (de)serializer + * deprecated (IntTag) = 0, 1, 2, 3 + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::HEAVY_WEIGHTED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::HOPPER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::HOPPER()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * toggle_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::INFESTED_DEEPSLATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::IRON_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::IRON_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::IRON_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::IRON_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::JIGSAW(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * rotation (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::JUNGLE_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::JUNGLE_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::KELP(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * kelp_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::LADDER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LADDER()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LANTERN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LANTERN()) + * TODO: implement (de)serializer + * hanging (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LARGE_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LAVA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LAVA()) + * TODO: implement (de)serializer + * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::LAVA_CAULDRON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * cauldron_liquid (StringTag) = lava, powder_snow, water + * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 + */ + //}); + //$this->map(VanillaBlocks::LEAVES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * old_leaf_type (StringTag) = birch, jungle, oak, spruce + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LEAVES2(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * new_leaf_type (StringTag) = acacia, dark_oak + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LECTERN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LECTERN()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LEVER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LEVER()) + * TODO: implement (de)serializer + * lever_direction (StringTag) = down_east_west, down_north_south, east, north, south, up_east_west, up_north_south, west + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIGHTNING_ROD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_BLUE_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_BLUE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_GRAY_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_GRAY_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIGHT_WEIGHTED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::LIME_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIME_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LIME_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LIT_BLAST_FURNACE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BLAST_FURNACE()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LIT_FURNACE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::FURNACE()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LIT_PUMPKIN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LIT_PUMPKIN()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::LIT_SMOKER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SMOKER()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::LOG(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * old_log_type (StringTag) = birch, jungle, oak, spruce + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::LOG2(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * new_log_type (StringTag) = acacia, dark_oak + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::LOOM(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LOOM()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::MAGENTA_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::MAGENTA_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::MEDIUM_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::MELON_STEM(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::MELON_STEM()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::MONSTER_EGG(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * monster_egg_stone_type (StringTag) = chiseled_stone_brick, cobblestone, cracked_stone_brick, mossy_stone_brick, stone, stone_brick + */ + //}); + //$this->map(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::MOSSY_COBBLESTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::MOSSY_STONE_BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::NETHER_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::NETHER_BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::NETHER_WART(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::NETHER_WART()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::NORMAL_STONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::OAK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::OBSERVER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ORANGE_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ORANGE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::ORANGE_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::OXIDIZED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::OXIDIZED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::OXIDIZED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::PINK_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::PINK_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PINK_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::PISTON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::PISTONARMCOLLISION(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::PLANKS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::POINTED_DRIPSTONE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * dripstone_thickness (StringTag) = base, frustum, merge, middle, tip + * hanging (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::POLISHED_ANDESITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BASALT(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_WALL(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_DIORITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::POLISHED_DIORITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::POLISHED_GRANITE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::POLISHED_GRANITE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::PORTAL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::NETHER_PORTAL()) + * TODO: implement (de)serializer + * portal_axis (StringTag) = unknown, x, z + */ + //}); + //$this->map(VanillaBlocks::POTATOES(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::POTATOES()) + * TODO: implement (de)serializer + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::POWERED_COMPARATOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::REDSTONE_COMPARATOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * output_lit_bit (ByteTag) = 0, 1 + * output_subtract_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::POWERED_REPEATER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * repeater_delay (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::PRISMARINE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PRISMARINE()) + * TODO: implement (de)serializer + * prismarine_block_type (StringTag) = bricks, dark, default + */ + //}); + //$this->map(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PRISMARINE_BRICKS_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::PRISMARINE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PRISMARINE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::PUMPKIN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PUMPKIN()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::PUMPKIN_STEM(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PUMPKIN_STEM()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::PURPLE_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::PURPLE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PURPLE_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::PURPUR_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * chisel_type (StringTag) = chiseled, default, lines, smooth + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::PURPUR_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::PURPUR_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::QUARTZ_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * chisel_type (StringTag) = chiseled, default, lines, smooth + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::QUARTZ_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::QUARTZ_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::RAIL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RAIL()) + * TODO: implement (de)serializer + * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + */ + //}); + //$this->map(VanillaBlocks::REDSTONE_TORCH(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::REDSTONE_TORCH()) + * TODO: implement (de)serializer + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::REDSTONE_WIRE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::REDSTONE_WIRE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::RED_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::RED_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::RED_FLOWER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * flower_type (StringTag) = allium, cornflower, houstonia, lily_of_the_valley, orchid, oxeye, poppy, tulip_orange, tulip_pink, tulip_red, tulip_white + */ + //}); + //$this->map(VanillaBlocks::RED_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RED_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::RED_MUSHROOM_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RED_MUSHROOM_BLOCK()) + * TODO: implement (de)serializer + * huge_mushroom_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RED_NETHER_BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::RED_SANDSTONE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RED_SANDSTONE()) + * TODO: implement (de)serializer + * sand_stone_type (StringTag) = cut, default, heiroglyphs, smooth + */ + //}); + //$this->map(VanillaBlocks::RED_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::RED_SANDSTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::REEDS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SUGARCANE()) + * TODO: implement (de)serializer + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::REPEATING_COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * conditional_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::RESPAWN_ANCHOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * respawn_anchor_charge (IntTag) = 0, 1, 2, 3, 4 + */ + //}); + //$this->map(VanillaBlocks::SAND(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SAND()) + * TODO: implement (de)serializer + * sand_type (StringTag) = normal, red + */ + //}); + //$this->map(VanillaBlocks::SANDSTONE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SANDSTONE()) + * TODO: implement (de)serializer + * sand_stone_type (StringTag) = cut, default, heiroglyphs, smooth + */ + //}); + //$this->map(VanillaBlocks::SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SANDSTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::SAPLING(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * age_bit (ByteTag) = 0, 1 + * sapling_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::SCAFFOLDING(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + * stability_check (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SCULK_CATALYST(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * bloom (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SCULK_SENSOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SCULK_SHRIEKER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * active (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SCULK_VEIN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + */ + //}); + //$this->map(VanillaBlocks::SEAGRASS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * sea_grass_type (StringTag) = default, double_bot, double_top + */ + //}); + //$this->map(VanillaBlocks::SEA_PICKLE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SEA_PICKLE()) + * TODO: implement (de)serializer + * cluster_count (IntTag) = 0, 1, 2, 3 + * dead_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SHULKER_BOX(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::DYED_SHULKER_BOX()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::SILVER_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::SKULL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::MOB_HEAD()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + * no_drop_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SMALL_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::SMALL_DRIPLEAF_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SMOKER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SMOKER()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SMOOTH_QUARTZ_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SMOOTH_SANDSTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::SNOW_LAYER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SNOW_LAYER()) + * TODO: implement (de)serializer + * covered_bit (ByteTag) = 0, 1 + * height (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::SOUL_CAMPFIRE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * extinguished (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SOUL_FIRE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::SOUL_LANTERN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * hanging (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SOUL_TORCH(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::SPONGE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPONGE()) + * TODO: implement (de)serializer + * sponge_type (StringTag) = dry, wet + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_FENCE_GATE()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::SPRUCE_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SPRUCE_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::STAINED_GLASS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STAINED_GLASS()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::STAINED_GLASS_PANE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STAINED_GLASS_PANE()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::STAINED_HARDENED_CLAY(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STAINED_CLAY()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::STANDING_BANNER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::BANNER()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_SIGN()) + * TODO: implement (de)serializer + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::STICKYPISTONARMCOLLISION(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::STICKY_PISTON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::STONE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE()) + * TODO: implement (de)serializer + * stone_type (StringTag) = andesite, andesite_smooth, diorite, diorite_smooth, granite, granite_smooth, stone + */ + //}); + //$this->map(VanillaBlocks::STONEBRICK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_brick_type (StringTag) = chiseled, cracked, default, mossy, smooth + */ + //}); + //$this->map(VanillaBlocks::STONECUTTER_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::STONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE_BRICK_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::STONE_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::STONE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::STONE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STONE_SLAB()) + * TODO: implement (de)serializer + * stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::STONE_SLAB2(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::STONE_SLAB3(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::STONE_SLAB4(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::STONE_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::COBBLESTONE_STAIRS()) + * TODO: implement (de)serializer + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_ACACIA_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_ACACIA_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_BIRCH_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_BIRCH_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_CRIMSON_HYPHAE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_CRIMSON_STEM(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_DARK_OAK_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_DARK_OAK_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_JUNGLE_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_JUNGLE_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_OAK_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_OAK_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_SPRUCE_LOG(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::STRIPPED_SPRUCE_LOG()) + * TODO: implement (de)serializer + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_WARPED_HYPHAE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRIPPED_WARPED_STEM(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::STRUCTURE_BLOCK(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * structure_block_type (StringTag) = corner, data, export, invalid, load, save + */ + //}); + //$this->map(VanillaBlocks::STRUCTURE_VOID(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * structure_void_type (StringTag) = air, void + */ + //}); + //$this->map(VanillaBlocks::SWEET_BERRY_BUSH(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::SWEET_BERRY_BUSH()) + * TODO: implement (de)serializer + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::TALLGRASS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * tall_grass_type (StringTag) = default, fern, snow, tall + */ + //}); + //$this->map(VanillaBlocks::TNT(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::TNT()) + * TODO: implement (de)serializer + * allow_underwater_bit (ByteTag) = 0, 1 + * explode_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::TORCH(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::TORCH()) + * TODO: implement (de)serializer + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_TRAPDOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::TRAPPED_CHEST(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::TRAPPED_CHEST()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::TRIPWIRE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::TRIPWIRE()) + * TODO: implement (de)serializer + * attached_bit (ByteTag) = 0, 1 + * disarmed_bit (ByteTag) = 0, 1 + * powered_bit (ByteTag) = 0, 1 + * suspended_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::TRIPWIRE_HOOK(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::TRIPWIRE_HOOK()) + * TODO: implement (de)serializer + * attached_bit (ByteTag) = 0, 1 + * direction (IntTag) = 0, 1, 2, 3 + * powered_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::TURTLE_EGG(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * cracked_state (StringTag) = cracked, max_cracked, no_cracks + * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg + */ + //}); + //$this->map(VanillaBlocks::TWISTING_VINES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * twisting_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::UNDERWATER_TORCH(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::UNDERWATER_TORCH()) + * TODO: implement (de)serializer + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::UNLIT_REDSTONE_TORCH(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::REDSTONE_TORCH()) + * TODO: implement (de)serializer + * torch_facing_direction (StringTag) = east, north, south, top, unknown, west + */ + //}); + //$this->map(VanillaBlocks::UNPOWERED_COMPARATOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::REDSTONE_COMPARATOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * output_lit_bit (ByteTag) = 0, 1 + * output_subtract_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::UNPOWERED_REPEATER(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * repeater_delay (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::VINE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * vine_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::WALL_BANNER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WALL_BANNER()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_WALL_SIGN()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WARPED_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WARPED_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WARPED_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WARPED_FENCE_GATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WARPED_HYPHAE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::WARPED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::WARPED_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WARPED_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WARPED_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::WARPED_STEM(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(VanillaBlocks::WARPED_TRAPDOOR(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WARPED_WALL_SIGN(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WATER(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WATER()) + * TODO: implement (de)serializer + * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::WAXED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WAXED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_EXPOSED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_EXPOSED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_OXIDIZED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_OXIDIZED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_WEATHERED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WAXED_WEATHERED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WEATHERED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WEATHERED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(VanillaBlocks::WEATHERED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WEEPING_VINES(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * weeping_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + */ + //}); + //$this->map(VanillaBlocks::WHEAT(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WHEAT()) + * TODO: implement (de)serializer + * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 + */ + //}); + //$this->map(VanillaBlocks::WHITE_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WHITE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WHITE_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WOOD(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + * stripped_bit (ByteTag) = 0, 1 + * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::WOODEN_BUTTON(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_BUTTON()) + * TODO: implement (de)serializer + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(VanillaBlocks::WOODEN_DOOR(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_DOOR()) + * TODO: implement (de)serializer + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::WOODEN_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::OAK_PRESSURE_PLATE()) + * TODO: implement (de)serializer + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(VanillaBlocks::WOODEN_SLAB(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce + */ + //}); + //$this->map(VanillaBlocks::WOOL(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::WOOL()) + * TODO: implement (de)serializer + * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow + */ + //}); + //$this->map(VanillaBlocks::YELLOW_CANDLE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * candles (IntTag) = 0, 1, 2, 3 + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::YELLOW_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ + /* + * TODO: Un-implemented block + * lit (ByteTag) = 0, 1 + */ + //}); + //$this->map(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ + /* + * This block is implemented (VanillaBlocks::YELLOW_GLAZED_TERRACOTTA()) + * TODO: implement (de)serializer + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + } +} diff --git a/src/data/bedrock/blockstate/BlockStateStringValuesR13.php b/src/data/bedrock/blockstate/BlockStateStringValues.php similarity index 89% rename from src/data/bedrock/blockstate/BlockStateStringValuesR13.php rename to src/data/bedrock/blockstate/BlockStateStringValues.php index d51c39291e..689f22be43 100644 --- a/src/data/bedrock/blockstate/BlockStateStringValuesR13.php +++ b/src/data/bedrock/blockstate/BlockStateStringValues.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; -final class BlockStateStringValuesR13{ +final class BlockStateStringValues{ public const ATTACHMENT_HANGING = "hanging"; public const ATTACHMENT_MULTIPLE = "multiple"; @@ -37,7 +37,13 @@ final class BlockStateStringValuesR13{ public const BAMBOO_STALK_THICKNESS_THICK = "thick"; public const BAMBOO_STALK_THICKNESS_THIN = "thin"; + public const BIG_DRIPLEAF_TILT_FULL_TILT = "full_tilt"; + public const BIG_DRIPLEAF_TILT_NONE = "none"; + public const BIG_DRIPLEAF_TILT_PARTIAL_TILT = "partial_tilt"; + public const BIG_DRIPLEAF_TILT_UNSTABLE = "unstable"; + public const CAULDRON_LIQUID_LAVA = "lava"; + public const CAULDRON_LIQUID_POWDER_SNOW = "powder_snow"; public const CAULDRON_LIQUID_WATER = "water"; public const CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR = "compound_creator"; @@ -92,6 +98,12 @@ final class BlockStateStringValuesR13{ public const DOUBLE_PLANT_TYPE_SUNFLOWER = "sunflower"; public const DOUBLE_PLANT_TYPE_SYRINGA = "syringa"; + public const DRIPSTONE_THICKNESS_BASE = "base"; + public const DRIPSTONE_THICKNESS_FRUSTUM = "frustum"; + public const DRIPSTONE_THICKNESS_MERGE = "merge"; + public const DRIPSTONE_THICKNESS_MIDDLE = "middle"; + public const DRIPSTONE_THICKNESS_TIP = "tip"; + public const FLOWER_TYPE_ALLIUM = "allium"; public const FLOWER_TYPE_CORNFLOWER = "cornflower"; public const FLOWER_TYPE_HOUSTONIA = "houstonia"; @@ -259,6 +271,22 @@ final class BlockStateStringValuesR13{ public const WALL_BLOCK_TYPE_SANDSTONE = "sandstone"; public const WALL_BLOCK_TYPE_STONE_BRICK = "stone_brick"; + public const WALL_CONNECTION_TYPE_EAST_NONE = "none"; + public const WALL_CONNECTION_TYPE_EAST_SHORT = "short"; + public const WALL_CONNECTION_TYPE_EAST_TALL = "tall"; + + public const WALL_CONNECTION_TYPE_NORTH_NONE = "none"; + public const WALL_CONNECTION_TYPE_NORTH_SHORT = "short"; + public const WALL_CONNECTION_TYPE_NORTH_TALL = "tall"; + + public const WALL_CONNECTION_TYPE_SOUTH_NONE = "none"; + public const WALL_CONNECTION_TYPE_SOUTH_SHORT = "short"; + public const WALL_CONNECTION_TYPE_SOUTH_TALL = "tall"; + + public const WALL_CONNECTION_TYPE_WEST_NONE = "none"; + public const WALL_CONNECTION_TYPE_WEST_SHORT = "short"; + public const WALL_CONNECTION_TYPE_WEST_TALL = "tall"; + public const WOOD_TYPE_ACACIA = "acacia"; public const WOOD_TYPE_BIRCH = "birch"; public const WOOD_TYPE_DARK_OAK = "dark_oak"; diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php new file mode 100644 index 0000000000..b3a477f536 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -0,0 +1,229 @@ +states = CompoundTag::create(); + } + + /** @return $this */ + public function writeBool(string $name, bool $value) : self{ + $this->states->setByte($name, $value ? 1 : 0); + return $this; + } + + /** @return $this */ + public function writeInt(string $name, int $value) : self{ + $this->states->setInt($name, $value); + return $this; + } + + /** @return $this */ + public function writeString(string $name, string $value) : self{ + $this->states->setString($name, $value); + return $this; + } + + /** @return $this */ + public function writeFacingDirection(int $value) : self{ + $this->writeInt(BlockStateNames::FACING_DIRECTION, match($value){ + Facing::DOWN => 0, + Facing::UP => 1, + Facing::NORTH => 2, + Facing::SOUTH => 3, + Facing::WEST => 4, + Facing::EAST => 5, + default => throw new BlockStateSerializeException("Invalid Facing $value") + }); + return $this; + } + + /** @return $this */ + public function writeHorizontalFacing(int $value) : self{ + if($value === Facing::UP || $value === Facing::DOWN){ + throw new BlockStateSerializeException("Y-axis facing is not allowed"); + } + + return $this->writeFacingDirection($value); + } + + /** @return $this */ + public function writeWeirdoHorizontalFacing(int $value) : self{ + $this->writeInt(BlockStateNames::WEIRDO_DIRECTION, match($value){ + Facing::EAST => 0, + Facing::WEST => 1, + Facing::SOUTH => 2, + Facing::NORTH => 3, + default => throw new BlockStateSerializeException("Invalid horizontal facing $value") + }); + return $this; + } + + /** @return $this */ + public function writeLegacyHorizontalFacing(int $value) : self{ + $this->writeInt(BlockStateNames::DIRECTION, match($value){ + Facing::SOUTH => 0, + Facing::WEST => 1, + Facing::NORTH => 2, + Facing::EAST => 3, + default => throw new BlockStateSerializeException("Invalid horizontal facing $value") + }); + return $this; + } + + /** @return $this */ + public function writeColor(DyeColor $color) : self{ + $this->writeString(BlockStateNames::COLOR, match($color->id()){ + DyeColor::BLACK()->id() => StringValues::COLOR_BLACK, + DyeColor::BLUE()->id() => StringValues::COLOR_BLUE, + DyeColor::BROWN()->id() => StringValues::COLOR_BROWN, + DyeColor::CYAN()->id() => StringValues::COLOR_CYAN, + DyeColor::GRAY()->id() => StringValues::COLOR_GRAY, + DyeColor::GREEN()->id() => StringValues::COLOR_GREEN, + DyeColor::LIGHT_BLUE()->id() => StringValues::COLOR_LIGHT_BLUE, + DyeColor::LIGHT_GRAY()->id() => StringValues::COLOR_SILVER, + DyeColor::LIME()->id() => StringValues::COLOR_LIME, + DyeColor::MAGENTA()->id() => StringValues::COLOR_MAGENTA, + DyeColor::ORANGE()->id() => StringValues::COLOR_ORANGE, + DyeColor::PINK()->id() => StringValues::COLOR_PINK, + DyeColor::PURPLE()->id() => StringValues::COLOR_PURPLE, + DyeColor::RED()->id() => StringValues::COLOR_RED, + DyeColor::WHITE()->id() => StringValues::COLOR_WHITE, + DyeColor::YELLOW()->id() => StringValues::COLOR_YELLOW, + default => throw new BlockStateSerializeException("Invalid Color " . $color->name()) + }); + return $this; + } + + /** @return $this */ + public function writeCoralFacing(int $value) : self{ + $this->writeInt(BlockStateNames::CORAL_DIRECTION, match($value){ + Facing::WEST => 0, + Facing::EAST => 1, + Facing::NORTH => 2, + Facing::SOUTH => 3, + default => throw new BlockStateSerializeException("Invalid horizontal facing $value") + }); + return $this; + } + + /** @return $this */ + public function writeFacingWithoutDown(int $value) : self{ + if($value === Facing::DOWN){ + throw new BlockStateSerializeException("Invalid facing DOWN"); + } + $this->writeFacingDirection($value); + return $this; + } + + /** @return $this */ + public function writeFacingWithoutUp(int $value) : self{ + if($value === Facing::UP){ + throw new BlockStateSerializeException("Invalid facing UP"); + } + $this->writeFacingDirection($value); + return $this; + } + + /** @return $this */ + public function writePillarAxis(int $axis) : self{ + $this->writeString(BlockStateNames::PILLAR_AXIS, match($axis){ + Axis::X => StringValues::PILLAR_AXIS_X, + Axis::Y => StringValues::PILLAR_AXIS_Y, + Axis::Z => StringValues::PILLAR_AXIS_Z, + default => throw new BlockStateSerializeException("Invalid axis $axis") + }); + return $this; + } + + /** @return $this */ + public function writeSlabPosition(SlabType $slabType) : self{ + $this->writeBool(BlockStateNames::TOP_SLOT_BIT, match($slabType->id()){ + SlabType::TOP()->id() => true, + SlabType::BOTTOM()->id() => false, + default => throw new BlockStateSerializeException("Invalid slab type " . $slabType->name()) + }); + return $this; + } + + /** @return $this */ + public function writeTorchFacing(int $facing) : self{ + $this->writeString(BlockStateNames::TORCH_FACING_DIRECTION, match($facing){ + Facing::UP => StringValues::TORCH_FACING_DIRECTION_TOP, + Facing::NORTH => StringValues::TORCH_FACING_DIRECTION_NORTH, + Facing::SOUTH => StringValues::TORCH_FACING_DIRECTION_SOUTH, + Facing::WEST => StringValues::TORCH_FACING_DIRECTION_WEST, + Facing::EAST => StringValues::TORCH_FACING_DIRECTION_EAST, + default => throw new BlockStateSerializeException("Invalid Torch facing $facing") + }); + return $this; + } + + /** @return $this */ + public function writeCoralType(CoralType $coralType) : self{ + $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType->id()){ + CoralType::TUBE()->id() => StringValues::CORAL_COLOR_BLUE, + CoralType::BRAIN()->id() => StringValues::CORAL_COLOR_PINK, + CoralType::BUBBLE()->id() => StringValues::CORAL_COLOR_PURPLE, + CoralType::FIRE()->id() => StringValues::CORAL_COLOR_RED, + CoralType::HORN()->id() => StringValues::CORAL_COLOR_YELLOW, + default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()) + }); + return $this; + } + + /** @return $this */ + public function writeBellAttachmentType(BellAttachmentType $attachmentType) : self{ + $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType->id()){ + BellAttachmentType::FLOOR()->id() => StringValues::ATTACHMENT_STANDING, + BellAttachmentType::CEILING()->id() => StringValues::ATTACHMENT_HANGING, + BellAttachmentType::ONE_WALL()->id() => StringValues::ATTACHMENT_SIDE, + BellAttachmentType::TWO_WALLS()->id() => StringValues::ATTACHMENT_MULTIPLE, + default => throw new BlockStateSerializeException("Invalid Bell attachment type " . $attachmentType->name()) + }); + return $this; + } + + public function writeBlockStateNbt() : CompoundTag{ + //TODO: add `version` field + return CompoundTag::create() + ->setString("name", $this->id) + ->setTag("states", $this->states); + } +} diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/blockstate/BlockTypeNames.php new file mode 100644 index 0000000000..54536c0da4 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -0,0 +1,739 @@ + Date: Mon, 31 Jan 2022 01:20:52 +0000 Subject: [PATCH 0006/1858] shut CS --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 1 + src/data/bedrock/blockstate/BlockStateSerializer.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 878c8ebfb2..74c7eb4a4d 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -39,6 +39,7 @@ use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\CompoundTag; use function array_key_exists; +use function min; final class BlockStateDeserializer{ diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 3ac3fad688..3bb3ab866a 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -22,10 +22,11 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; + use pocketmine\block\Block; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; -use pocketmine\nbt\tag\CompoundTag; +use function get_class; final class BlockStateSerializer{ /** From d03f4d76a2b19536a5e287b2031999ca5b4a5b51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 02:30:54 +0000 Subject: [PATCH 0007/1858] ws --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 74c7eb4a4d..89a580e3af 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -56,6 +56,7 @@ final class BlockStateDeserializer{ } $this->deserializeFuncs[$id] = $c; } + public function __construct(){ $this->map(Ids::ACACIA_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::ACACIA_BUTTON(), $in)); $this->map(Ids::ACACIA_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::ACACIA_DOOR(), $in)); From 0626edbcddf16463b4a69566976bc2b47c64660a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 17:49:29 +0000 Subject: [PATCH 0008/1858] BlockStateValues now includes integer values too --- .../blockstate/BlockStateDeserializer.php | 250 ++--- .../BlockStateDeserializerHelper.php | 72 +- .../bedrock/blockstate/BlockStateReader.php | 70 +- .../blockstate/BlockStateStringValues.php | 297 ------ .../bedrock/blockstate/BlockStateValues.php | 863 ++++++++++++++++++ .../bedrock/blockstate/BlockStateWriter.php | 68 +- 6 files changed, 1093 insertions(+), 527 deletions(-) delete mode 100644 src/data/bedrock/blockstate/BlockStateStringValues.php create mode 100644 src/data/bedrock/blockstate/BlockStateValues.php diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 89a580e3af..64ce431163 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -33,7 +33,7 @@ use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\blockstate\BlockStateDeserializerHelper as Helper; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -82,10 +82,10 @@ final class BlockStateDeserializer{ $this->map(Ids::ANVIL, function(BlockStateReader $in) : Block{ return VanillaBlocks::ANVIL() ->setDamage(match($value = $in->readString(BlockStateNames::DAMAGE)){ - StringValues::DAMAGE_UNDAMAGED => 0, - StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, - StringValues::DAMAGE_VERY_DAMAGED => 2, - StringValues::DAMAGE_BROKEN => 0, + Values::DAMAGE_UNDAMAGED => 0, + Values::DAMAGE_SLIGHTLY_DAMAGED => 1, + Values::DAMAGE_VERY_DAMAGED => 2, + Values::DAMAGE_BROKEN => 0, default => throw $in->badValueException(BlockStateNames::DAMAGE, $value), }) ->setFacing($in->readLegacyHorizontalFacing()); @@ -93,15 +93,15 @@ final class BlockStateDeserializer{ $this->map(Ids::BAMBOO, function(BlockStateReader $in) : Block{ return VanillaBlocks::BAMBOO() ->setLeafSize(match($value = $in->readString(BlockStateNames::BAMBOO_LEAF_SIZE)){ - StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, + Values::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, + Values::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, + Values::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, default => throw $in->badValueException(BlockStateNames::BAMBOO_LEAF_SIZE, $value), }) ->setReady($in->readBool(BlockStateNames::AGE_BIT)) ->setThick(match($value = $in->readString(BlockStateNames::BAMBOO_STALK_THICKNESS)){ - StringValues::BAMBOO_STALK_THICKNESS_THIN => false, - StringValues::BAMBOO_STALK_THICKNESS_THICK => true, + Values::BAMBOO_STALK_THICKNESS_THIN => false, + Values::BAMBOO_STALK_THICKNESS_THICK => true, default => throw $in->badValueException(BlockStateNames::BAMBOO_STALK_THICKNESS, $value), }); }); @@ -191,10 +191,10 @@ final class BlockStateDeserializer{ $this->map(Ids::CHEMICAL_HEAT, fn() => VanillaBlocks::CHEMICAL_HEAT()); $this->map(Ids::CHEMISTRY_TABLE, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::CHEMISTRY_TABLE_TYPE)){ - StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), - StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), - StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), - StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), + Values::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), + Values::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), + Values::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), + Values::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), default => throw $in->badValueException(BlockStateNames::CHEMISTRY_TABLE_TYPE, $type), })->setFacing($in->readLegacyHorizontalFacing()); }); @@ -240,8 +240,8 @@ final class BlockStateDeserializer{ ->setCoralType($in->readCoralType()) ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(true)); + $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(true)); $this->map(Ids::CORAL_FAN_HANG, function(BlockStateReader $in) : Block{ return VanillaBlocks::WALL_CORAL_FAN() ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) @@ -299,19 +299,19 @@ final class BlockStateDeserializer{ $this->map(Ids::DIRT, function(BlockStateReader $in) : Block{ return VanillaBlocks::DIRT() ->setCoarse(match($value = $in->readString(BlockStateNames::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => false, - StringValues::DIRT_TYPE_COARSE => true, + Values::DIRT_TYPE_NORMAL => false, + Values::DIRT_TYPE_COARSE => true, default => throw $in->badValueException(BlockStateNames::DIRT_TYPE, $value), }); }); $this->map(Ids::DOUBLE_PLANT, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::DOUBLE_PLANT_TYPE)){ - StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), - StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), - StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), - StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), - StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), - StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), + Values::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), + Values::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), + Values::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), + Values::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), + Values::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), + Values::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), default => throw $in->badValueException(BlockStateNames::DOUBLE_PLANT_TYPE, $type), })->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)); }); @@ -476,12 +476,12 @@ final class BlockStateDeserializer{ }); $this->map(Ids::FENCE, function(BlockStateReader $in) : Block{ return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), + Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), + Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), + Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), + Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), + Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), + Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), }; }); @@ -590,10 +590,10 @@ final class BlockStateDeserializer{ $this->map(Ids::LAVA, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::LAVA(), $in)); $this->map(Ids::LEAVES, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::OLD_LEAF_TYPE)){ - StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), - StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), - StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), - StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), + Values::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), + Values::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), + Values::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), + Values::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), default => throw $in->badValueException(BlockStateNames::OLD_LEAF_TYPE, $type), }) ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) @@ -601,8 +601,8 @@ final class BlockStateDeserializer{ }); $this->map(Ids::LEAVES2, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::NEW_LEAF_TYPE)){ - StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), - StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), + Values::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), + Values::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), default => throw $in->badValueException(BlockStateNames::NEW_LEAF_TYPE, $type), }) ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) @@ -617,14 +617,14 @@ final class BlockStateDeserializer{ return VanillaBlocks::LEVER() ->setActivated($in->readBool(BlockStateNames::OPEN_BIT)) ->setFacing(match($value = $in->readString(BlockStateNames::LEVER_DIRECTION)){ - StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), - StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), - StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), - StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), - StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), - StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), - StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), - StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), + Values::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), + Values::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), + Values::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), + Values::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), + Values::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), + Values::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), + Values::LEVER_DIRECTION_WEST => LeverFacing::WEST(), + Values::LEVER_DIRECTION_EAST => LeverFacing::EAST(), default => throw $in->badValueException(BlockStateNames::LEVER_DIRECTION, $value), }); }); @@ -663,18 +663,18 @@ final class BlockStateDeserializer{ }); $this->map(Ids::LOG, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::OLD_LOG_TYPE)){ - StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), - StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), - StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), - StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), + Values::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), + Values::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), + Values::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), + Values::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), default => throw $in->badValueException(BlockStateNames::OLD_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); }); $this->map(Ids::LOG2, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::NEW_LOG_TYPE)){ - StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), - StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), + Values::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), + Values::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), default => throw $in->badValueException(BlockStateNames::NEW_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); @@ -690,12 +690,12 @@ final class BlockStateDeserializer{ $this->map(Ids::MOB_SPAWNER, fn() => VanillaBlocks::MONSTER_SPAWNER()); $this->map(Ids::MONSTER_EGG, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::MONSTER_EGG_STONE_TYPE)){ - StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), - StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), + Values::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), + Values::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), + Values::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), + Values::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), + Values::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), + Values::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), default => throw $in->badValueException(BlockStateNames::MONSTER_EGG_STONE_TYPE, $type), }; }); @@ -722,12 +722,12 @@ final class BlockStateDeserializer{ $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::PLANKS, function(BlockStateReader $in) : Block{ return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), + Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), + Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), + Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), + Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), + Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), + Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), }; }); @@ -738,9 +738,9 @@ final class BlockStateDeserializer{ $this->map(Ids::PORTAL, function(BlockStateReader $in) : Block{ return VanillaBlocks::NETHER_PORTAL() ->setAxis(match($value = $in->readString(BlockStateNames::PORTAL_AXIS)){ - StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, - StringValues::PORTAL_AXIS_X => Axis::X, - StringValues::PORTAL_AXIS_Z => Axis::Z, + Values::PORTAL_AXIS_UNKNOWN => Axis::X, + Values::PORTAL_AXIS_X => Axis::X, + Values::PORTAL_AXIS_Z => Axis::Z, default => throw $in->badValueException(BlockStateNames::PORTAL_AXIS, $value), }); }); @@ -750,9 +750,9 @@ final class BlockStateDeserializer{ ->setPowered(true)); $this->map(Ids::PRISMARINE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::PRISMARINE_BLOCK_TYPE)){ - StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), - StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), - StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), + Values::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), + Values::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), + Values::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), default => throw $in->badValueException(BlockStateNames::PRISMARINE_BLOCK_TYPE, $type), }; }); @@ -766,20 +766,20 @@ final class BlockStateDeserializer{ $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::PURPUR_BLOCK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), + Values::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE + Values::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE + Values::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) + Values::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), }; }); $this->map(Ids::PURPUR_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); $this->map(Ids::QUARTZ_BLOCK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) + Values::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), + Values::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) + Values::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), + Values::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), }; }); @@ -791,17 +791,17 @@ final class BlockStateDeserializer{ }); $this->map(Ids::RED_FLOWER, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::FLOWER_TYPE)){ - StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), - StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), - StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? - StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), - StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), - StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), - StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), - StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), - StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), - StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), - StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), + Values::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), + Values::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), + Values::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? + Values::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), + Values::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), + Values::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), + Values::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), + Values::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), + Values::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), + Values::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), + Values::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), default => throw $in->badValueException(BlockStateNames::FLOWER_TYPE, $type), }; }); @@ -812,10 +812,10 @@ final class BlockStateDeserializer{ $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); $this->map(Ids::RED_SANDSTONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), + Values::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), + Values::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), + Values::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), + Values::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), }; }); @@ -845,29 +845,29 @@ final class BlockStateDeserializer{ $this->map(Ids::RESERVED6, fn() => VanillaBlocks::RESERVED6()); $this->map(Ids::SAND, function(BlockStateReader $in) : Block{ return match($value = $in->readString(BlockStateNames::SAND_TYPE)){ - StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), - StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), + Values::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), + Values::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), default => throw $in->badValueException(BlockStateNames::SAND_TYPE, $value), }; }); $this->map(Ids::SANDSTONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), + Values::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), + Values::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), + Values::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), + Values::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), }; }); $this->map(Ids::SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); $this->map(Ids::SAPLING, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::SAPLING_TYPE)){ - StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), - StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), - StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), - StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), - StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), - StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), + Values::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), + Values::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), + Values::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), + Values::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), + Values::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), + Values::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), default => throw $in->badValueException(BlockStateNames::SAPLING_TYPE, $type), }) ->setReady($in->readBool(BlockStateNames::AGE_BIT)); @@ -906,8 +906,8 @@ final class BlockStateDeserializer{ $this->map(Ids::SOUL_SAND, fn() => VanillaBlocks::SOUL_SAND()); $this->map(Ids::SPONGE, function(BlockStateReader $in) : Block{ return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNames::SPONGE_TYPE)){ - StringValues::SPONGE_TYPE_DRY => false, - StringValues::SPONGE_TYPE_WET => true, + Values::SPONGE_TYPE_DRY => false, + Values::SPONGE_TYPE_WET => true, default => throw $in->badValueException(BlockStateNames::SPONGE_TYPE, $type), }); }); @@ -947,13 +947,13 @@ final class BlockStateDeserializer{ }); $this->map(Ids::STONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::STONE_TYPE)){ - StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), - StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), - StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), - StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), - StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), - StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), - StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), + Values::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), + Values::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), + Values::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), + Values::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), + Values::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), + Values::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), + Values::STONE_TYPE_STONE => VanillaBlocks::STONE(), default => throw $in->badValueException(BlockStateNames::STONE_TYPE, $type), }; }); @@ -967,11 +967,11 @@ final class BlockStateDeserializer{ $this->map(Ids::STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); $this->map(Ids::STONEBRICK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::STONE_BRICK_TYPE)){ - StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla - StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), + Values::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla + Values::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), + Values::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), + Values::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), + Values::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), default => throw $in->badValueException(BlockStateNames::STONE_BRICK_TYPE, $type), }; }); @@ -1008,8 +1008,8 @@ final class BlockStateDeserializer{ }); $this->map(Ids::TALLGRASS, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::TALL_GRASS_TYPE)){ - StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), - StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), + Values::TALL_GRASS_TYPE_DEFAULT, Values::TALL_GRASS_TYPE_SNOW, Values::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), + Values::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), default => throw $in->badValueException(BlockStateNames::TALL_GRASS_TYPE, $type), }; }); @@ -1078,12 +1078,12 @@ final class BlockStateDeserializer{ //TODO: our impl doesn't support axis yet $stripped = $in->readBool(BlockStateNames::STRIPPED_BIT); return match($woodType = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), + Values::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), + Values::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), + Values::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), + Values::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), + Values::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), + Values::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodType), }; }); diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index c73b4f7a5b..8f28ec7865 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -42,7 +42,7 @@ use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -184,14 +184,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE)){ - StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), - StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), + Values::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), + Values::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), + Values::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), + Values::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), + Values::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), + Values::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), + Values::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE, $type), }; } @@ -200,14 +200,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab2Type(BlockStateReader $in) : Slab{ // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_2)){ - StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), + Values::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), + Values::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), + Values::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), + Values::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), + Values::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), + Values::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_2, $type), }; } @@ -216,14 +216,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab3Type(BlockStateReader $in) : Slab{ // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_3)){ - StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), + Values::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), + Values::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), + Values::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), + Values::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), + Values::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), + Values::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), + Values::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_3, $type), }; } @@ -232,11 +232,11 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab4Type(BlockStateReader $in) : Slab{ // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_4)){ - StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), + Values::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), + Values::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), + Values::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), + Values::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_4, $type), }; } @@ -245,12 +245,12 @@ final class BlockStateDeserializerHelper{ public static function mapWoodenSlabType(BlockStateReader $in) : Slab{ // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce return match($type = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), + Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), + Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), + Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), + Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), + Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), + Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $type), }; } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 21537e452b..d0767daa1a 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -27,7 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; @@ -161,22 +161,22 @@ final class BlockStateReader{ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow return match($color = $this->readString(BlockStateNames::COLOR)){ - StringValues::COLOR_BLACK => DyeColor::BLACK(), - StringValues::COLOR_BLUE => DyeColor::BLUE(), - StringValues::COLOR_BROWN => DyeColor::BROWN(), - StringValues::COLOR_CYAN => DyeColor::CYAN(), - StringValues::COLOR_GRAY => DyeColor::GRAY(), - StringValues::COLOR_GREEN => DyeColor::GREEN(), - StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), - StringValues::COLOR_LIME => DyeColor::LIME(), - StringValues::COLOR_MAGENTA => DyeColor::MAGENTA(), - StringValues::COLOR_ORANGE => DyeColor::ORANGE(), - StringValues::COLOR_PINK => DyeColor::PINK(), - StringValues::COLOR_PURPLE => DyeColor::PURPLE(), - StringValues::COLOR_RED => DyeColor::RED(), - StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY(), - StringValues::COLOR_WHITE => DyeColor::WHITE(), - StringValues::COLOR_YELLOW => DyeColor::YELLOW(), + Values::COLOR_BLACK => DyeColor::BLACK(), + Values::COLOR_BLUE => DyeColor::BLUE(), + Values::COLOR_BROWN => DyeColor::BROWN(), + Values::COLOR_CYAN => DyeColor::CYAN(), + Values::COLOR_GRAY => DyeColor::GRAY(), + Values::COLOR_GREEN => DyeColor::GREEN(), + Values::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), + Values::COLOR_LIME => DyeColor::LIME(), + Values::COLOR_MAGENTA => DyeColor::MAGENTA(), + Values::COLOR_ORANGE => DyeColor::ORANGE(), + Values::COLOR_PINK => DyeColor::PINK(), + Values::COLOR_PURPLE => DyeColor::PURPLE(), + Values::COLOR_RED => DyeColor::RED(), + Values::COLOR_SILVER => DyeColor::LIGHT_GRAY(), + Values::COLOR_WHITE => DyeColor::WHITE(), + Values::COLOR_YELLOW => DyeColor::YELLOW(), default => throw $this->badValueException(BlockStateNames::COLOR, $color), }; } @@ -215,9 +215,9 @@ final class BlockStateReader{ public function readPillarAxis() : int{ $rawValue = $this->readString(BlockStateNames::PILLAR_AXIS); $value = [ - StringValues::PILLAR_AXIS_X => Axis::X, - StringValues::PILLAR_AXIS_Y => Axis::Y, - StringValues::PILLAR_AXIS_Z => Axis::Z + Values::PILLAR_AXIS_X => Axis::X, + Values::PILLAR_AXIS_Y => Axis::Y, + Values::PILLAR_AXIS_Z => Axis::Z ][$rawValue] ?? null; if($value === null){ throw $this->badValueException(BlockStateNames::PILLAR_AXIS, $rawValue, "Invalid axis value"); @@ -236,12 +236,12 @@ final class BlockStateReader{ */ public function readTorchFacing() : int{ return match($rawValue = $this->readString(BlockStateNames::TORCH_FACING_DIRECTION)){ - StringValues::TORCH_FACING_DIRECTION_EAST => Facing::EAST, - StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, - StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, - StringValues::TORCH_FACING_DIRECTION_TOP => Facing::UP, - StringValues::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it - StringValues::TORCH_FACING_DIRECTION_WEST => Facing::WEST, + Values::TORCH_FACING_DIRECTION_EAST => Facing::EAST, + Values::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, + Values::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, + Values::TORCH_FACING_DIRECTION_TOP => Facing::UP, + Values::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it + Values::TORCH_FACING_DIRECTION_WEST => Facing::WEST, default => throw $this->badValueException(BlockStateNames::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), }; } @@ -249,11 +249,11 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readCoralType() : CoralType{ return match($type = $this->readString(BlockStateNames::CORAL_COLOR)){ - StringValues::CORAL_COLOR_BLUE => CoralType::TUBE(), - StringValues::CORAL_COLOR_PINK => CoralType::BRAIN(), - StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), - StringValues::CORAL_COLOR_RED => CoralType::FIRE(), - StringValues::CORAL_COLOR_YELLOW => CoralType::HORN(), + Values::CORAL_COLOR_BLUE => CoralType::TUBE(), + Values::CORAL_COLOR_PINK => CoralType::BRAIN(), + Values::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), + Values::CORAL_COLOR_RED => CoralType::FIRE(), + Values::CORAL_COLOR_YELLOW => CoralType::HORN(), default => throw $this->badValueException(BlockStateNames::CORAL_COLOR, $type), }; } @@ -261,10 +261,10 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBellAttachmentType() : BellAttachmentType{ return match($type = $this->readString(BlockStateNames::ATTACHMENT)){ - StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), - StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), - StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), - StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), + Values::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), + Values::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), + Values::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), + Values::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), default => throw $this->badValueException(BlockStateNames::ATTACHMENT, $type), }; } diff --git a/src/data/bedrock/blockstate/BlockStateStringValues.php b/src/data/bedrock/blockstate/BlockStateStringValues.php deleted file mode 100644 index 689f22be43..0000000000 --- a/src/data/bedrock/blockstate/BlockStateStringValues.php +++ /dev/null @@ -1,297 +0,0 @@ -writeString(BlockStateNames::COLOR, match($color->id()){ - DyeColor::BLACK()->id() => StringValues::COLOR_BLACK, - DyeColor::BLUE()->id() => StringValues::COLOR_BLUE, - DyeColor::BROWN()->id() => StringValues::COLOR_BROWN, - DyeColor::CYAN()->id() => StringValues::COLOR_CYAN, - DyeColor::GRAY()->id() => StringValues::COLOR_GRAY, - DyeColor::GREEN()->id() => StringValues::COLOR_GREEN, - DyeColor::LIGHT_BLUE()->id() => StringValues::COLOR_LIGHT_BLUE, - DyeColor::LIGHT_GRAY()->id() => StringValues::COLOR_SILVER, - DyeColor::LIME()->id() => StringValues::COLOR_LIME, - DyeColor::MAGENTA()->id() => StringValues::COLOR_MAGENTA, - DyeColor::ORANGE()->id() => StringValues::COLOR_ORANGE, - DyeColor::PINK()->id() => StringValues::COLOR_PINK, - DyeColor::PURPLE()->id() => StringValues::COLOR_PURPLE, - DyeColor::RED()->id() => StringValues::COLOR_RED, - DyeColor::WHITE()->id() => StringValues::COLOR_WHITE, - DyeColor::YELLOW()->id() => StringValues::COLOR_YELLOW, + DyeColor::BLACK()->id() => Values::COLOR_BLACK, + DyeColor::BLUE()->id() => Values::COLOR_BLUE, + DyeColor::BROWN()->id() => Values::COLOR_BROWN, + DyeColor::CYAN()->id() => Values::COLOR_CYAN, + DyeColor::GRAY()->id() => Values::COLOR_GRAY, + DyeColor::GREEN()->id() => Values::COLOR_GREEN, + DyeColor::LIGHT_BLUE()->id() => Values::COLOR_LIGHT_BLUE, + DyeColor::LIGHT_GRAY()->id() => Values::COLOR_SILVER, + DyeColor::LIME()->id() => Values::COLOR_LIME, + DyeColor::MAGENTA()->id() => Values::COLOR_MAGENTA, + DyeColor::ORANGE()->id() => Values::COLOR_ORANGE, + DyeColor::PINK()->id() => Values::COLOR_PINK, + DyeColor::PURPLE()->id() => Values::COLOR_PURPLE, + DyeColor::RED()->id() => Values::COLOR_RED, + DyeColor::WHITE()->id() => Values::COLOR_WHITE, + DyeColor::YELLOW()->id() => Values::COLOR_YELLOW, default => throw new BlockStateSerializeException("Invalid Color " . $color->name()) }); return $this; @@ -164,9 +164,9 @@ final class BlockStateWriter{ /** @return $this */ public function writePillarAxis(int $axis) : self{ $this->writeString(BlockStateNames::PILLAR_AXIS, match($axis){ - Axis::X => StringValues::PILLAR_AXIS_X, - Axis::Y => StringValues::PILLAR_AXIS_Y, - Axis::Z => StringValues::PILLAR_AXIS_Z, + Axis::X => Values::PILLAR_AXIS_X, + Axis::Y => Values::PILLAR_AXIS_Y, + Axis::Z => Values::PILLAR_AXIS_Z, default => throw new BlockStateSerializeException("Invalid axis $axis") }); return $this; @@ -185,11 +185,11 @@ final class BlockStateWriter{ /** @return $this */ public function writeTorchFacing(int $facing) : self{ $this->writeString(BlockStateNames::TORCH_FACING_DIRECTION, match($facing){ - Facing::UP => StringValues::TORCH_FACING_DIRECTION_TOP, - Facing::NORTH => StringValues::TORCH_FACING_DIRECTION_NORTH, - Facing::SOUTH => StringValues::TORCH_FACING_DIRECTION_SOUTH, - Facing::WEST => StringValues::TORCH_FACING_DIRECTION_WEST, - Facing::EAST => StringValues::TORCH_FACING_DIRECTION_EAST, + Facing::UP => Values::TORCH_FACING_DIRECTION_TOP, + Facing::NORTH => Values::TORCH_FACING_DIRECTION_NORTH, + Facing::SOUTH => Values::TORCH_FACING_DIRECTION_SOUTH, + Facing::WEST => Values::TORCH_FACING_DIRECTION_WEST, + Facing::EAST => Values::TORCH_FACING_DIRECTION_EAST, default => throw new BlockStateSerializeException("Invalid Torch facing $facing") }); return $this; @@ -198,11 +198,11 @@ final class BlockStateWriter{ /** @return $this */ public function writeCoralType(CoralType $coralType) : self{ $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType->id()){ - CoralType::TUBE()->id() => StringValues::CORAL_COLOR_BLUE, - CoralType::BRAIN()->id() => StringValues::CORAL_COLOR_PINK, - CoralType::BUBBLE()->id() => StringValues::CORAL_COLOR_PURPLE, - CoralType::FIRE()->id() => StringValues::CORAL_COLOR_RED, - CoralType::HORN()->id() => StringValues::CORAL_COLOR_YELLOW, + CoralType::TUBE()->id() => Values::CORAL_COLOR_BLUE, + CoralType::BRAIN()->id() => Values::CORAL_COLOR_PINK, + CoralType::BUBBLE()->id() => Values::CORAL_COLOR_PURPLE, + CoralType::FIRE()->id() => Values::CORAL_COLOR_RED, + CoralType::HORN()->id() => Values::CORAL_COLOR_YELLOW, default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()) }); return $this; @@ -211,10 +211,10 @@ final class BlockStateWriter{ /** @return $this */ public function writeBellAttachmentType(BellAttachmentType $attachmentType) : self{ $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType->id()){ - BellAttachmentType::FLOOR()->id() => StringValues::ATTACHMENT_STANDING, - BellAttachmentType::CEILING()->id() => StringValues::ATTACHMENT_HANGING, - BellAttachmentType::ONE_WALL()->id() => StringValues::ATTACHMENT_SIDE, - BellAttachmentType::TWO_WALLS()->id() => StringValues::ATTACHMENT_MULTIPLE, + BellAttachmentType::FLOOR()->id() => Values::ATTACHMENT_STANDING, + BellAttachmentType::CEILING()->id() => Values::ATTACHMENT_HANGING, + BellAttachmentType::ONE_WALL()->id() => Values::ATTACHMENT_SIDE, + BellAttachmentType::TWO_WALLS()->id() => Values::ATTACHMENT_MULTIPLE, default => throw new BlockStateSerializeException("Invalid Bell attachment type " . $attachmentType->name()) }); return $this; From 03e3ecdbd36df0be98bb8fba53d2f8462b23599e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 17:51:49 +0000 Subject: [PATCH 0009/1858] Revert "BlockStateValues now includes integer values too" This reverts commit 0626edbcddf16463b4a69566976bc2b47c64660a. --- .../blockstate/BlockStateDeserializer.php | 250 ++--- .../BlockStateDeserializerHelper.php | 72 +- .../bedrock/blockstate/BlockStateReader.php | 70 +- .../blockstate/BlockStateStringValues.php | 297 ++++++ .../bedrock/blockstate/BlockStateValues.php | 863 ------------------ .../bedrock/blockstate/BlockStateWriter.php | 68 +- 6 files changed, 527 insertions(+), 1093 deletions(-) create mode 100644 src/data/bedrock/blockstate/BlockStateStringValues.php delete mode 100644 src/data/bedrock/blockstate/BlockStateValues.php diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 64ce431163..89a580e3af 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -33,7 +33,7 @@ use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\blockstate\BlockStateDeserializerHelper as Helper; -use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -82,10 +82,10 @@ final class BlockStateDeserializer{ $this->map(Ids::ANVIL, function(BlockStateReader $in) : Block{ return VanillaBlocks::ANVIL() ->setDamage(match($value = $in->readString(BlockStateNames::DAMAGE)){ - Values::DAMAGE_UNDAMAGED => 0, - Values::DAMAGE_SLIGHTLY_DAMAGED => 1, - Values::DAMAGE_VERY_DAMAGED => 2, - Values::DAMAGE_BROKEN => 0, + StringValues::DAMAGE_UNDAMAGED => 0, + StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, + StringValues::DAMAGE_VERY_DAMAGED => 2, + StringValues::DAMAGE_BROKEN => 0, default => throw $in->badValueException(BlockStateNames::DAMAGE, $value), }) ->setFacing($in->readLegacyHorizontalFacing()); @@ -93,15 +93,15 @@ final class BlockStateDeserializer{ $this->map(Ids::BAMBOO, function(BlockStateReader $in) : Block{ return VanillaBlocks::BAMBOO() ->setLeafSize(match($value = $in->readString(BlockStateNames::BAMBOO_LEAF_SIZE)){ - Values::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, - Values::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, - Values::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, default => throw $in->badValueException(BlockStateNames::BAMBOO_LEAF_SIZE, $value), }) ->setReady($in->readBool(BlockStateNames::AGE_BIT)) ->setThick(match($value = $in->readString(BlockStateNames::BAMBOO_STALK_THICKNESS)){ - Values::BAMBOO_STALK_THICKNESS_THIN => false, - Values::BAMBOO_STALK_THICKNESS_THICK => true, + StringValues::BAMBOO_STALK_THICKNESS_THIN => false, + StringValues::BAMBOO_STALK_THICKNESS_THICK => true, default => throw $in->badValueException(BlockStateNames::BAMBOO_STALK_THICKNESS, $value), }); }); @@ -191,10 +191,10 @@ final class BlockStateDeserializer{ $this->map(Ids::CHEMICAL_HEAT, fn() => VanillaBlocks::CHEMICAL_HEAT()); $this->map(Ids::CHEMISTRY_TABLE, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::CHEMISTRY_TABLE_TYPE)){ - Values::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), - Values::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), - Values::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), - Values::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), + StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), + StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), + StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), + StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), default => throw $in->badValueException(BlockStateNames::CHEMISTRY_TABLE_TYPE, $type), })->setFacing($in->readLegacyHorizontalFacing()); }); @@ -240,8 +240,8 @@ final class BlockStateDeserializer{ ->setCoralType($in->readCoralType()) ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(true)); + $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(true)); $this->map(Ids::CORAL_FAN_HANG, function(BlockStateReader $in) : Block{ return VanillaBlocks::WALL_CORAL_FAN() ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) @@ -299,19 +299,19 @@ final class BlockStateDeserializer{ $this->map(Ids::DIRT, function(BlockStateReader $in) : Block{ return VanillaBlocks::DIRT() ->setCoarse(match($value = $in->readString(BlockStateNames::DIRT_TYPE)){ - Values::DIRT_TYPE_NORMAL => false, - Values::DIRT_TYPE_COARSE => true, + StringValues::DIRT_TYPE_NORMAL => false, + StringValues::DIRT_TYPE_COARSE => true, default => throw $in->badValueException(BlockStateNames::DIRT_TYPE, $value), }); }); $this->map(Ids::DOUBLE_PLANT, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::DOUBLE_PLANT_TYPE)){ - Values::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), - Values::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), - Values::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), - Values::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), - Values::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), - Values::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), + StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), + StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), + StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), + StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), + StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), + StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), default => throw $in->badValueException(BlockStateNames::DOUBLE_PLANT_TYPE, $type), })->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)); }); @@ -476,12 +476,12 @@ final class BlockStateDeserializer{ }); $this->map(Ids::FENCE, function(BlockStateReader $in) : Block{ return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), - Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), - Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), - Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), - Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), - Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), }; }); @@ -590,10 +590,10 @@ final class BlockStateDeserializer{ $this->map(Ids::LAVA, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::LAVA(), $in)); $this->map(Ids::LEAVES, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::OLD_LEAF_TYPE)){ - Values::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), - Values::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), - Values::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), - Values::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), + StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), + StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), + StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), + StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), default => throw $in->badValueException(BlockStateNames::OLD_LEAF_TYPE, $type), }) ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) @@ -601,8 +601,8 @@ final class BlockStateDeserializer{ }); $this->map(Ids::LEAVES2, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::NEW_LEAF_TYPE)){ - Values::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), - Values::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), + StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), + StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), default => throw $in->badValueException(BlockStateNames::NEW_LEAF_TYPE, $type), }) ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) @@ -617,14 +617,14 @@ final class BlockStateDeserializer{ return VanillaBlocks::LEVER() ->setActivated($in->readBool(BlockStateNames::OPEN_BIT)) ->setFacing(match($value = $in->readString(BlockStateNames::LEVER_DIRECTION)){ - Values::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), - Values::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), - Values::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), - Values::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), - Values::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), - Values::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), - Values::LEVER_DIRECTION_WEST => LeverFacing::WEST(), - Values::LEVER_DIRECTION_EAST => LeverFacing::EAST(), + StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), + StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), + StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), + StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), + StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), + StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), + StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), + StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), default => throw $in->badValueException(BlockStateNames::LEVER_DIRECTION, $value), }); }); @@ -663,18 +663,18 @@ final class BlockStateDeserializer{ }); $this->map(Ids::LOG, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::OLD_LOG_TYPE)){ - Values::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), - Values::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), - Values::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), - Values::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), + StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), + StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), + StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), + StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), default => throw $in->badValueException(BlockStateNames::OLD_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); }); $this->map(Ids::LOG2, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::NEW_LOG_TYPE)){ - Values::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), - Values::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), + StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), + StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), default => throw $in->badValueException(BlockStateNames::NEW_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); @@ -690,12 +690,12 @@ final class BlockStateDeserializer{ $this->map(Ids::MOB_SPAWNER, fn() => VanillaBlocks::MONSTER_SPAWNER()); $this->map(Ids::MONSTER_EGG, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::MONSTER_EGG_STONE_TYPE)){ - Values::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), - Values::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), - Values::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), - Values::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), - Values::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), - Values::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), + StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), default => throw $in->badValueException(BlockStateNames::MONSTER_EGG_STONE_TYPE, $type), }; }); @@ -722,12 +722,12 @@ final class BlockStateDeserializer{ $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::PLANKS, function(BlockStateReader $in) : Block{ return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), - Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), - Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), - Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), - Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), - Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), }; }); @@ -738,9 +738,9 @@ final class BlockStateDeserializer{ $this->map(Ids::PORTAL, function(BlockStateReader $in) : Block{ return VanillaBlocks::NETHER_PORTAL() ->setAxis(match($value = $in->readString(BlockStateNames::PORTAL_AXIS)){ - Values::PORTAL_AXIS_UNKNOWN => Axis::X, - Values::PORTAL_AXIS_X => Axis::X, - Values::PORTAL_AXIS_Z => Axis::Z, + StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, + StringValues::PORTAL_AXIS_X => Axis::X, + StringValues::PORTAL_AXIS_Z => Axis::Z, default => throw $in->badValueException(BlockStateNames::PORTAL_AXIS, $value), }); }); @@ -750,9 +750,9 @@ final class BlockStateDeserializer{ ->setPowered(true)); $this->map(Ids::PRISMARINE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::PRISMARINE_BLOCK_TYPE)){ - Values::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), - Values::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), - Values::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), + StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), + StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), + StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), default => throw $in->badValueException(BlockStateNames::PRISMARINE_BLOCK_TYPE, $type), }; }); @@ -766,20 +766,20 @@ final class BlockStateDeserializer{ $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::PURPUR_BLOCK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ - Values::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE - Values::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - Values::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) - Values::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), }; }); $this->map(Ids::PURPUR_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); $this->map(Ids::QUARTZ_BLOCK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ - Values::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), - Values::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) - Values::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), - Values::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), }; }); @@ -791,17 +791,17 @@ final class BlockStateDeserializer{ }); $this->map(Ids::RED_FLOWER, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::FLOWER_TYPE)){ - Values::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), - Values::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), - Values::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? - Values::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), - Values::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), - Values::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), - Values::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), - Values::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), - Values::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), - Values::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), - Values::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), + StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), + StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), + StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? + StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), + StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), + StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), + StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), + StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), + StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), + StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), + StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), default => throw $in->badValueException(BlockStateNames::FLOWER_TYPE, $type), }; }); @@ -812,10 +812,10 @@ final class BlockStateDeserializer{ $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); $this->map(Ids::RED_SANDSTONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - Values::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), - Values::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), - Values::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), - Values::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), }; }); @@ -845,29 +845,29 @@ final class BlockStateDeserializer{ $this->map(Ids::RESERVED6, fn() => VanillaBlocks::RESERVED6()); $this->map(Ids::SAND, function(BlockStateReader $in) : Block{ return match($value = $in->readString(BlockStateNames::SAND_TYPE)){ - Values::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), - Values::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), + StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), + StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), default => throw $in->badValueException(BlockStateNames::SAND_TYPE, $value), }; }); $this->map(Ids::SANDSTONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - Values::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), - Values::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), - Values::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), - Values::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), + StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), }; }); $this->map(Ids::SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); $this->map(Ids::SAPLING, function(BlockStateReader $in) : Block{ return (match($type = $in->readString(BlockStateNames::SAPLING_TYPE)){ - Values::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), - Values::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), - Values::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), - Values::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), - Values::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), - Values::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), + StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), + StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), + StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), + StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), + StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), + StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), default => throw $in->badValueException(BlockStateNames::SAPLING_TYPE, $type), }) ->setReady($in->readBool(BlockStateNames::AGE_BIT)); @@ -906,8 +906,8 @@ final class BlockStateDeserializer{ $this->map(Ids::SOUL_SAND, fn() => VanillaBlocks::SOUL_SAND()); $this->map(Ids::SPONGE, function(BlockStateReader $in) : Block{ return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNames::SPONGE_TYPE)){ - Values::SPONGE_TYPE_DRY => false, - Values::SPONGE_TYPE_WET => true, + StringValues::SPONGE_TYPE_DRY => false, + StringValues::SPONGE_TYPE_WET => true, default => throw $in->badValueException(BlockStateNames::SPONGE_TYPE, $type), }); }); @@ -947,13 +947,13 @@ final class BlockStateDeserializer{ }); $this->map(Ids::STONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::STONE_TYPE)){ - Values::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), - Values::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), - Values::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), - Values::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), - Values::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), - Values::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), - Values::STONE_TYPE_STONE => VanillaBlocks::STONE(), + StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), + StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), + StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), + StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), + StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), + StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), + StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), default => throw $in->badValueException(BlockStateNames::STONE_TYPE, $type), }; }); @@ -967,11 +967,11 @@ final class BlockStateDeserializer{ $this->map(Ids::STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); $this->map(Ids::STONEBRICK, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::STONE_BRICK_TYPE)){ - Values::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla - Values::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), - Values::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), - Values::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), - Values::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla + StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), default => throw $in->badValueException(BlockStateNames::STONE_BRICK_TYPE, $type), }; }); @@ -1008,8 +1008,8 @@ final class BlockStateDeserializer{ }); $this->map(Ids::TALLGRASS, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::TALL_GRASS_TYPE)){ - Values::TALL_GRASS_TYPE_DEFAULT, Values::TALL_GRASS_TYPE_SNOW, Values::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), - Values::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), + StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), + StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), default => throw $in->badValueException(BlockStateNames::TALL_GRASS_TYPE, $type), }; }); @@ -1078,12 +1078,12 @@ final class BlockStateDeserializer{ //TODO: our impl doesn't support axis yet $stripped = $in->readBool(BlockStateNames::STRIPPED_BIT); return match($woodType = $in->readString(BlockStateNames::WOOD_TYPE)){ - Values::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), - Values::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), - Values::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), - Values::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), - Values::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), - Values::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), + StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodType), }; }); diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index 8f28ec7865..c73b4f7a5b 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -42,7 +42,7 @@ use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; -use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -184,14 +184,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE)){ - Values::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), - Values::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), - Values::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), - Values::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), - Values::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), - Values::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), - Values::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), - Values::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), + StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), + StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE, $type), }; } @@ -200,14 +200,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab2Type(BlockStateReader $in) : Slab{ // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_2)){ - Values::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), - Values::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), - Values::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), - Values::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), - Values::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), - Values::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), - Values::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), - Values::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_2, $type), }; } @@ -216,14 +216,14 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab3Type(BlockStateReader $in) : Slab{ // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_3)){ - Values::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), - Values::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), - Values::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), - Values::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), - Values::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), - Values::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), - Values::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), - Values::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), + StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_3, $type), }; } @@ -232,11 +232,11 @@ final class BlockStateDeserializerHelper{ public static function mapStoneSlab4Type(BlockStateReader $in) : Slab{ // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_4)){ - Values::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), - Values::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), - Values::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), - Values::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), - Values::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), + StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), + StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), + StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_4, $type), }; } @@ -245,12 +245,12 @@ final class BlockStateDeserializerHelper{ public static function mapWoodenSlabType(BlockStateReader $in) : Slab{ // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce return match($type = $in->readString(BlockStateNames::WOOD_TYPE)){ - Values::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), - Values::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), - Values::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), - Values::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), - Values::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), - Values::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), + StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), + StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), + StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), + StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), + StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), + StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $type), }; } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index d0767daa1a..21537e452b 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -27,7 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; -use pocketmine\data\bedrock\blockstate\BlockStateValues as Values; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; @@ -161,22 +161,22 @@ final class BlockStateReader{ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow return match($color = $this->readString(BlockStateNames::COLOR)){ - Values::COLOR_BLACK => DyeColor::BLACK(), - Values::COLOR_BLUE => DyeColor::BLUE(), - Values::COLOR_BROWN => DyeColor::BROWN(), - Values::COLOR_CYAN => DyeColor::CYAN(), - Values::COLOR_GRAY => DyeColor::GRAY(), - Values::COLOR_GREEN => DyeColor::GREEN(), - Values::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), - Values::COLOR_LIME => DyeColor::LIME(), - Values::COLOR_MAGENTA => DyeColor::MAGENTA(), - Values::COLOR_ORANGE => DyeColor::ORANGE(), - Values::COLOR_PINK => DyeColor::PINK(), - Values::COLOR_PURPLE => DyeColor::PURPLE(), - Values::COLOR_RED => DyeColor::RED(), - Values::COLOR_SILVER => DyeColor::LIGHT_GRAY(), - Values::COLOR_WHITE => DyeColor::WHITE(), - Values::COLOR_YELLOW => DyeColor::YELLOW(), + StringValues::COLOR_BLACK => DyeColor::BLACK(), + StringValues::COLOR_BLUE => DyeColor::BLUE(), + StringValues::COLOR_BROWN => DyeColor::BROWN(), + StringValues::COLOR_CYAN => DyeColor::CYAN(), + StringValues::COLOR_GRAY => DyeColor::GRAY(), + StringValues::COLOR_GREEN => DyeColor::GREEN(), + StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), + StringValues::COLOR_LIME => DyeColor::LIME(), + StringValues::COLOR_MAGENTA => DyeColor::MAGENTA(), + StringValues::COLOR_ORANGE => DyeColor::ORANGE(), + StringValues::COLOR_PINK => DyeColor::PINK(), + StringValues::COLOR_PURPLE => DyeColor::PURPLE(), + StringValues::COLOR_RED => DyeColor::RED(), + StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY(), + StringValues::COLOR_WHITE => DyeColor::WHITE(), + StringValues::COLOR_YELLOW => DyeColor::YELLOW(), default => throw $this->badValueException(BlockStateNames::COLOR, $color), }; } @@ -215,9 +215,9 @@ final class BlockStateReader{ public function readPillarAxis() : int{ $rawValue = $this->readString(BlockStateNames::PILLAR_AXIS); $value = [ - Values::PILLAR_AXIS_X => Axis::X, - Values::PILLAR_AXIS_Y => Axis::Y, - Values::PILLAR_AXIS_Z => Axis::Z + StringValues::PILLAR_AXIS_X => Axis::X, + StringValues::PILLAR_AXIS_Y => Axis::Y, + StringValues::PILLAR_AXIS_Z => Axis::Z ][$rawValue] ?? null; if($value === null){ throw $this->badValueException(BlockStateNames::PILLAR_AXIS, $rawValue, "Invalid axis value"); @@ -236,12 +236,12 @@ final class BlockStateReader{ */ public function readTorchFacing() : int{ return match($rawValue = $this->readString(BlockStateNames::TORCH_FACING_DIRECTION)){ - Values::TORCH_FACING_DIRECTION_EAST => Facing::EAST, - Values::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, - Values::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, - Values::TORCH_FACING_DIRECTION_TOP => Facing::UP, - Values::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it - Values::TORCH_FACING_DIRECTION_WEST => Facing::WEST, + StringValues::TORCH_FACING_DIRECTION_EAST => Facing::EAST, + StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, + StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, + StringValues::TORCH_FACING_DIRECTION_TOP => Facing::UP, + StringValues::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it + StringValues::TORCH_FACING_DIRECTION_WEST => Facing::WEST, default => throw $this->badValueException(BlockStateNames::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), }; } @@ -249,11 +249,11 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readCoralType() : CoralType{ return match($type = $this->readString(BlockStateNames::CORAL_COLOR)){ - Values::CORAL_COLOR_BLUE => CoralType::TUBE(), - Values::CORAL_COLOR_PINK => CoralType::BRAIN(), - Values::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), - Values::CORAL_COLOR_RED => CoralType::FIRE(), - Values::CORAL_COLOR_YELLOW => CoralType::HORN(), + StringValues::CORAL_COLOR_BLUE => CoralType::TUBE(), + StringValues::CORAL_COLOR_PINK => CoralType::BRAIN(), + StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), + StringValues::CORAL_COLOR_RED => CoralType::FIRE(), + StringValues::CORAL_COLOR_YELLOW => CoralType::HORN(), default => throw $this->badValueException(BlockStateNames::CORAL_COLOR, $type), }; } @@ -261,10 +261,10 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBellAttachmentType() : BellAttachmentType{ return match($type = $this->readString(BlockStateNames::ATTACHMENT)){ - Values::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), - Values::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), - Values::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), - Values::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), + StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), + StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), + StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), + StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), default => throw $this->badValueException(BlockStateNames::ATTACHMENT, $type), }; } diff --git a/src/data/bedrock/blockstate/BlockStateStringValues.php b/src/data/bedrock/blockstate/BlockStateStringValues.php new file mode 100644 index 0000000000..689f22be43 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateStringValues.php @@ -0,0 +1,297 @@ +writeString(BlockStateNames::COLOR, match($color->id()){ - DyeColor::BLACK()->id() => Values::COLOR_BLACK, - DyeColor::BLUE()->id() => Values::COLOR_BLUE, - DyeColor::BROWN()->id() => Values::COLOR_BROWN, - DyeColor::CYAN()->id() => Values::COLOR_CYAN, - DyeColor::GRAY()->id() => Values::COLOR_GRAY, - DyeColor::GREEN()->id() => Values::COLOR_GREEN, - DyeColor::LIGHT_BLUE()->id() => Values::COLOR_LIGHT_BLUE, - DyeColor::LIGHT_GRAY()->id() => Values::COLOR_SILVER, - DyeColor::LIME()->id() => Values::COLOR_LIME, - DyeColor::MAGENTA()->id() => Values::COLOR_MAGENTA, - DyeColor::ORANGE()->id() => Values::COLOR_ORANGE, - DyeColor::PINK()->id() => Values::COLOR_PINK, - DyeColor::PURPLE()->id() => Values::COLOR_PURPLE, - DyeColor::RED()->id() => Values::COLOR_RED, - DyeColor::WHITE()->id() => Values::COLOR_WHITE, - DyeColor::YELLOW()->id() => Values::COLOR_YELLOW, + DyeColor::BLACK()->id() => StringValues::COLOR_BLACK, + DyeColor::BLUE()->id() => StringValues::COLOR_BLUE, + DyeColor::BROWN()->id() => StringValues::COLOR_BROWN, + DyeColor::CYAN()->id() => StringValues::COLOR_CYAN, + DyeColor::GRAY()->id() => StringValues::COLOR_GRAY, + DyeColor::GREEN()->id() => StringValues::COLOR_GREEN, + DyeColor::LIGHT_BLUE()->id() => StringValues::COLOR_LIGHT_BLUE, + DyeColor::LIGHT_GRAY()->id() => StringValues::COLOR_SILVER, + DyeColor::LIME()->id() => StringValues::COLOR_LIME, + DyeColor::MAGENTA()->id() => StringValues::COLOR_MAGENTA, + DyeColor::ORANGE()->id() => StringValues::COLOR_ORANGE, + DyeColor::PINK()->id() => StringValues::COLOR_PINK, + DyeColor::PURPLE()->id() => StringValues::COLOR_PURPLE, + DyeColor::RED()->id() => StringValues::COLOR_RED, + DyeColor::WHITE()->id() => StringValues::COLOR_WHITE, + DyeColor::YELLOW()->id() => StringValues::COLOR_YELLOW, default => throw new BlockStateSerializeException("Invalid Color " . $color->name()) }); return $this; @@ -164,9 +164,9 @@ final class BlockStateWriter{ /** @return $this */ public function writePillarAxis(int $axis) : self{ $this->writeString(BlockStateNames::PILLAR_AXIS, match($axis){ - Axis::X => Values::PILLAR_AXIS_X, - Axis::Y => Values::PILLAR_AXIS_Y, - Axis::Z => Values::PILLAR_AXIS_Z, + Axis::X => StringValues::PILLAR_AXIS_X, + Axis::Y => StringValues::PILLAR_AXIS_Y, + Axis::Z => StringValues::PILLAR_AXIS_Z, default => throw new BlockStateSerializeException("Invalid axis $axis") }); return $this; @@ -185,11 +185,11 @@ final class BlockStateWriter{ /** @return $this */ public function writeTorchFacing(int $facing) : self{ $this->writeString(BlockStateNames::TORCH_FACING_DIRECTION, match($facing){ - Facing::UP => Values::TORCH_FACING_DIRECTION_TOP, - Facing::NORTH => Values::TORCH_FACING_DIRECTION_NORTH, - Facing::SOUTH => Values::TORCH_FACING_DIRECTION_SOUTH, - Facing::WEST => Values::TORCH_FACING_DIRECTION_WEST, - Facing::EAST => Values::TORCH_FACING_DIRECTION_EAST, + Facing::UP => StringValues::TORCH_FACING_DIRECTION_TOP, + Facing::NORTH => StringValues::TORCH_FACING_DIRECTION_NORTH, + Facing::SOUTH => StringValues::TORCH_FACING_DIRECTION_SOUTH, + Facing::WEST => StringValues::TORCH_FACING_DIRECTION_WEST, + Facing::EAST => StringValues::TORCH_FACING_DIRECTION_EAST, default => throw new BlockStateSerializeException("Invalid Torch facing $facing") }); return $this; @@ -198,11 +198,11 @@ final class BlockStateWriter{ /** @return $this */ public function writeCoralType(CoralType $coralType) : self{ $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType->id()){ - CoralType::TUBE()->id() => Values::CORAL_COLOR_BLUE, - CoralType::BRAIN()->id() => Values::CORAL_COLOR_PINK, - CoralType::BUBBLE()->id() => Values::CORAL_COLOR_PURPLE, - CoralType::FIRE()->id() => Values::CORAL_COLOR_RED, - CoralType::HORN()->id() => Values::CORAL_COLOR_YELLOW, + CoralType::TUBE()->id() => StringValues::CORAL_COLOR_BLUE, + CoralType::BRAIN()->id() => StringValues::CORAL_COLOR_PINK, + CoralType::BUBBLE()->id() => StringValues::CORAL_COLOR_PURPLE, + CoralType::FIRE()->id() => StringValues::CORAL_COLOR_RED, + CoralType::HORN()->id() => StringValues::CORAL_COLOR_YELLOW, default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()) }); return $this; @@ -211,10 +211,10 @@ final class BlockStateWriter{ /** @return $this */ public function writeBellAttachmentType(BellAttachmentType $attachmentType) : self{ $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType->id()){ - BellAttachmentType::FLOOR()->id() => Values::ATTACHMENT_STANDING, - BellAttachmentType::CEILING()->id() => Values::ATTACHMENT_HANGING, - BellAttachmentType::ONE_WALL()->id() => Values::ATTACHMENT_SIDE, - BellAttachmentType::TWO_WALLS()->id() => Values::ATTACHMENT_MULTIPLE, + BellAttachmentType::FLOOR()->id() => StringValues::ATTACHMENT_STANDING, + BellAttachmentType::CEILING()->id() => StringValues::ATTACHMENT_HANGING, + BellAttachmentType::ONE_WALL()->id() => StringValues::ATTACHMENT_SIDE, + BellAttachmentType::TWO_WALLS()->id() => StringValues::ATTACHMENT_MULTIPLE, default => throw new BlockStateSerializeException("Invalid Bell attachment type " . $attachmentType->name()) }); return $this; From c4228edf3cd6e05918365ffc8ab39c6279d85a3d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 18:15:02 +0000 Subject: [PATCH 0010/1858] BlockStateDeserializerHelper: fixed mistake in decodeLiquid() --- src/data/bedrock/blockstate/BlockStateDeserializerHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index c73b4f7a5b..2ecc1a7916 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -115,7 +115,7 @@ final class BlockStateDeserializerHelper{ $fluidHeightState = $in->readBoundedInt(BlockStateNames::LIQUID_DEPTH, 0, 15); return $block ->setDecay($fluidHeightState & 0x7) - ->setFalling(($fluidHeightState & 0x1) !== 0) + ->setFalling(($fluidHeightState & 0x8) !== 0) ->setStill($still); } From 69db9f8a30aa677f9b4c49c8f8ad592ee0a18f4e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 20:31:54 +0000 Subject: [PATCH 0011/1858] Reduce duplication of code --- .../blockstate/BlockStateDeserializer.php | 102 +++++------------- .../BlockStateDeserializerHelper.php | 33 +++++- 2 files changed, 55 insertions(+), 80 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 89a580e3af..943718aabd 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -63,15 +63,9 @@ final class BlockStateDeserializer{ $this->map(Ids::ACACIA_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::ACACIA_FENCE_GATE(), $in)); $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::ACACIA_PRESSURE_PLATE(), $in)); $this->map(Ids::ACACIA_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::ACACIA_STAIRS(), $in)); - $this->map(Ids::ACACIA_STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACACIA_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); + $this->map(Ids::ACACIA_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::ACACIA_SIGN(), $in)); $this->map(Ids::ACACIA_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::ACACIA_TRAPDOOR(), $in)); - $this->map(Ids::ACACIA_WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACACIA_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); + $this->map(Ids::ACACIA_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::ACACIA_WALL_SIGN(), $in)); $this->map(Ids::ACTIVATOR_RAIL, function(BlockStateReader $in) : Block{ return VanillaBlocks::ACTIVATOR_RAIL() ->setPowered($in->readBool(BlockStateNames::RAIL_DATA_BIT)) @@ -138,15 +132,9 @@ final class BlockStateDeserializer{ $this->map(Ids::BIRCH_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::BIRCH_FENCE_GATE(), $in)); $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::BIRCH_PRESSURE_PLATE(), $in)); $this->map(Ids::BIRCH_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BIRCH_STAIRS(), $in)); - $this->map(Ids::BIRCH_STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BIRCH_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); + $this->map(Ids::BIRCH_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::BIRCH_SIGN(), $in)); $this->map(Ids::BIRCH_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::BIRCH_TRAPDOOR(), $in)); - $this->map(Ids::BIRCH_WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BIRCH_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); + $this->map(Ids::BIRCH_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::BIRCH_WALL_SIGN(), $in)); $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::BLAST_FURNACE, function(BlockStateReader $in) : Block{ return VanillaBlocks::BLAST_FURNACE() @@ -240,26 +228,14 @@ final class BlockStateDeserializer{ ->setCoralType($in->readCoralType()) ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan($in)->setDead(true)); - $this->map(Ids::CORAL_FAN_HANG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE()) - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); - $this->map(Ids::CORAL_FAN_HANG2, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE()) - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); - $this->map(Ids::CORAL_FAN_HANG3, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_CORAL_FAN() - ->setCoralType(CoralType::HORN()) - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - }); + $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(true)); + $this->map(Ids::CORAL_FAN_HANG, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); + $this->map(Ids::CORAL_FAN_HANG2, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); + $this->map(Ids::CORAL_FAN_HANG3, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) + ->setCoralType(CoralType::HORN())); $this->map(Ids::CRAFTING_TABLE, fn() => VanillaBlocks::CRAFTING_TABLE()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::DARK_OAK_BUTTON(), $in)); @@ -269,24 +245,12 @@ final class BlockStateDeserializer{ $this->map(Ids::DARK_OAK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_OAK_STAIRS(), $in)); $this->map(Ids::DARK_OAK_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::DARK_OAK_TRAPDOOR(), $in)); $this->map(Ids::DARK_PRISMARINE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_PRISMARINE_STAIRS(), $in)); - $this->map(Ids::DARKOAK_STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DARK_OAK_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); - $this->map(Ids::DARKOAK_WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DARK_OAK_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); - $this->map(Ids::DAYLIGHT_DETECTOR, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DAYLIGHT_SENSOR() - ->setInverted(false) - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); - }); - $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DAYLIGHT_SENSOR() - ->setInverted(true) - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); - }); + $this->map(Ids::DARKOAK_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::DARK_OAK_SIGN(), $in)); + $this->map(Ids::DARKOAK_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::DARK_OAK_WALL_SIGN(), $in)); + $this->map(Ids::DAYLIGHT_DETECTOR, fn(BlockStateReader $in) => Helper::decodeDaylightSensor(VanillaBlocks::DAYLIGHT_SENSOR(), $in) + ->setInverted(false)); + $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(BlockStateReader $in) => Helper::decodeDaylightSensor(VanillaBlocks::DAYLIGHT_SENSOR(), $in) + ->setInverted(true)); $this->map(Ids::DEADBUSH, fn() => VanillaBlocks::DEAD_BUSH()); $this->map(Ids::DETECTOR_RAIL, function(BlockStateReader $in) : Block{ return VanillaBlocks::DETECTOR_RAIL() @@ -568,15 +532,9 @@ final class BlockStateDeserializer{ $this->map(Ids::JUNGLE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::JUNGLE_FENCE_GATE(), $in)); $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), $in)); $this->map(Ids::JUNGLE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::JUNGLE_STAIRS(), $in)); - $this->map(Ids::JUNGLE_STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::JUNGLE_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); + $this->map(Ids::JUNGLE_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::JUNGLE_SIGN(), $in)); $this->map(Ids::JUNGLE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::JUNGLE_TRAPDOOR(), $in)); - $this->map(Ids::JUNGLE_WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::JUNGLE_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); + $this->map(Ids::JUNGLE_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::JUNGLE_WALL_SIGN(), $in)); $this->map(Ids::LADDER, function(BlockStateReader $in) : Block{ return VanillaBlocks::LADDER() ->setFacing($in->readHorizontalFacing()); @@ -916,15 +874,9 @@ final class BlockStateDeserializer{ $this->map(Ids::SPRUCE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::SPRUCE_FENCE_GATE(), $in)); $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), $in)); $this->map(Ids::SPRUCE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SPRUCE_STAIRS(), $in)); - $this->map(Ids::SPRUCE_STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPRUCE_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); + $this->map(Ids::SPRUCE_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::SPRUCE_SIGN(), $in)); $this->map(Ids::SPRUCE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::SPRUCE_TRAPDOOR(), $in)); - $this->map(Ids::SPRUCE_WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPRUCE_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); + $this->map(Ids::SPRUCE_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::SPRUCE_WALL_SIGN(), $in)); $this->map(Ids::STAINED_GLASS, function(BlockStateReader $in) : Block{ return VanillaBlocks::STAINED_GLASS() ->setColor($in->readColor()); @@ -941,10 +893,7 @@ final class BlockStateDeserializer{ return VanillaBlocks::BANNER() ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); }); - $this->map(Ids::STANDING_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::OAK_SIGN() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); - }); + $this->map(Ids::STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::OAK_SIGN(), $in)); $this->map(Ids::STONE, function(BlockStateReader $in) : Block{ return match($type = $in->readString(BlockStateNames::STONE_TYPE)){ StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), @@ -1065,10 +1014,7 @@ final class BlockStateDeserializer{ return VanillaBlocks::WALL_BANNER() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::WALL_SIGN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::OAK_WALL_SIGN() - ->setFacing($in->readHorizontalFacing()); - }); + $this->map(Ids::WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::OAK_WALL_SIGN(), $in)); $this->map(Ids::WATER, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::WATER(), $in)); $this->map(Ids::WATERLILY, fn() => VanillaBlocks::LILY_PAD()); $this->map(Ids::WEB, fn() => VanillaBlocks::COBWEB()); diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index 2ecc1a7916..418286a278 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -27,9 +27,11 @@ use pocketmine\block\Block; use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\Button; use pocketmine\block\Crops; +use pocketmine\block\DaylightSensor; use pocketmine\block\Door; use pocketmine\block\FenceGate; use pocketmine\block\FloorCoralFan; +use pocketmine\block\FloorSign; use pocketmine\block\GlazedTerracotta; use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; @@ -42,6 +44,8 @@ use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; +use pocketmine\block\WallCoralFan; +use pocketmine\block\WallSign; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; @@ -76,6 +80,12 @@ final class BlockStateDeserializerHelper{ ->setSubtractMode($in->readBool(BlockStateNames::OUTPUT_SUBTRACT_BIT)); } + /** @throws BlockStateDeserializeException */ + public static function decodeDaylightSensor(DaylightSensor $block, BlockStateReader $in) : DaylightSensor{ + return $block + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + } + /** @throws BlockStateDeserializeException */ public static function decodeDoor(Door $block, BlockStateReader $in) : Door{ //TODO: check if these need any special treatment to get the appropriate data to both halves of the door @@ -95,8 +105,8 @@ final class BlockStateDeserializerHelper{ } /** @throws BlockStateDeserializeException */ - public static function decodeFloorCoralFan(BlockStateReader $in) : FloorCoralFan{ - return VanillaBlocks::CORAL_FAN() + public static function decodeFloorCoralFan(FloorCoralFan $block, BlockStateReader $in) : FloorCoralFan{ + return $block ->setCoralType($in->readCoralType()) ->setAxis(match($in->readBoundedInt(BlockStateNames::CORAL_FAN_DIRECTION, 0, 1)){ 0 => Axis::X, @@ -105,6 +115,12 @@ final class BlockStateDeserializerHelper{ }); } + /** @throws BlockStateDeserializeException */ + public static function decodeFloorSign(FloorSign $block, BlockStateReader $in) : FloorSign{ + return $block + ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + } + /** @throws BlockStateDeserializeException */ public static function decodeGlazedTerracotta(GlazedTerracotta $block, BlockStateReader $in) : GlazedTerracotta{ return $block->setFacing($in->readHorizontalFacing()); @@ -180,6 +196,19 @@ final class BlockStateDeserializerHelper{ return $block; } + /** @throws BlockStateDeserializeException */ + public static function decodeWallCoralFan(WallCoralFan $block, BlockStateReader $in) : WallCoralFan{ + return $block + ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) + ->setFacing($in->readCoralFacing()); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeWallSign(WallSign $block, BlockStateReader $in) : WallSign{ + return $block + ->setFacing($in->readHorizontalFacing()); + } + /** @throws BlockStateDeserializeException */ public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood From cdafb1b0c45f6164856dcb0a264217b3956b085f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 20:45:11 +0000 Subject: [PATCH 0012/1858] standardize codegen for coral fans --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 943718aabd..9d65d3dbee 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -228,8 +228,10 @@ final class BlockStateDeserializer{ ->setCoralType($in->readCoralType()) ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in)->setDead(true)); + $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in) + ->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in) + ->setDead(true)); $this->map(Ids::CORAL_FAN_HANG, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); $this->map(Ids::CORAL_FAN_HANG2, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) From a91e7f72021c5ce680ea5c0ac46a7c2e022b94dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 20:45:33 +0000 Subject: [PATCH 0013/1858] deduplicate weighted pressure plate deserializer code --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 10 ++-------- .../blockstate/BlockStateDeserializerHelper.php | 6 ++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 9d65d3dbee..cc02416e7a 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -510,10 +510,7 @@ final class BlockStateDeserializer{ //TODO: intentionally ignored "deprecated" blockstate (useless) return VanillaBlocks::HAY_BALE()->setAxis($in->readPillarAxis()); }); - $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); - }); + $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeWeightedPressurePlate(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); $this->map(Ids::HOPPER, function(BlockStateReader $in) : Block{ return VanillaBlocks::HOPPER() ->setFacing($in->readFacingWithoutUp()) @@ -589,10 +586,7 @@ final class BlockStateDeserializer{ }); }); $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); - }); + $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeWeightedPressurePlate(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::LIT_BLAST_FURNACE, function(BlockStateReader $in) : Block{ return VanillaBlocks::BLAST_FURNACE() diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index 418286a278..b880645921 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -46,6 +46,7 @@ use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; +use pocketmine\block\WeightedPressurePlate; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; @@ -209,6 +210,11 @@ final class BlockStateDeserializerHelper{ ->setFacing($in->readHorizontalFacing()); } + public static function decodeWeightedPressurePlate(WeightedPressurePlate $block, BlockStateReader $in) : WeightedPressurePlate{ + return $block + ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + } + /** @throws BlockStateDeserializeException */ public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood From 25fdf7e442270058f381d17d894867b7ed36fabf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 04:00:49 +0000 Subject: [PATCH 0014/1858] NetherReactor: Remove dead code the state is not exposed anywhere, and we already remap invalid states to default now anyway. --- src/block/NetherReactor.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/block/NetherReactor.php b/src/block/NetherReactor.php index 96e5f0640f..69e21690bd 100644 --- a/src/block/NetherReactor.php +++ b/src/block/NetherReactor.php @@ -29,20 +29,6 @@ use pocketmine\item\VanillaItems; class NetherReactor extends Opaque{ - protected int $state = BlockLegacyMetadata::NETHER_REACTOR_INACTIVE; - - protected function writeStateToMeta() : int{ - return $this->state; - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->state = BlockDataSerializer::readBoundedInt("state", $stateMeta, 0, 2); - } - - public function getStateBitmask() : int{ - return 0b11; - } - public function getDropsForCompatibleTool(Item $item) : array{ return [ VanillaItems::IRON_INGOT()->setCount(6), From dbe99e5821d19e3f136be8a03d3c5413f78ee7c3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 04:01:16 +0000 Subject: [PATCH 0015/1858] Vine: added hasFace() --- src/block/Vine.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/Vine.php b/src/block/Vine.php index 16f6848463..c73489dd4e 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -64,6 +64,10 @@ class Vine extends Flowable{ /** @return int[] */ public function getFaces() : array{ return $this->faces; } + public function hasFace(int $face) : bool{ + return isset($this->faces[$face]); + } + /** * @param int[] $faces * @phpstan-param list $faces From 7d70865db0a495a50420f489b6f249d69884fafa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 04:01:56 +0000 Subject: [PATCH 0016/1858] Fixed deserializer not handling walls properly --- .../blockstate/BlockStateDeserializer.php | 2 +- .../BlockStateDeserializerHelper.php | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index cc02416e7a..cc7e30193e 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -194,7 +194,7 @@ final class BlockStateDeserializer{ $this->map(Ids::COAL_BLOCK, fn() => VanillaBlocks::COAL()); $this->map(Ids::COAL_ORE, fn() => VanillaBlocks::COAL_ORE()); $this->map(Ids::COBBLESTONE, fn() => VanillaBlocks::COBBLESTONE()); - $this->map(Ids::COBBLESTONE_WALL, fn(BlockStateReader $in) => Helper::decodeWall(VanillaBlocks::COBBLESTONE_WALL(), $in)); + $this->map(Ids::COBBLESTONE_WALL, fn(BlockStateReader $in) => Helper::mapLegacyWallType($in)); $this->map(Ids::COCOA, function(BlockStateReader $in) : Block{ return VanillaBlocks::COCOA_POD() ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 2)) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index b880645921..d026e0773e 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -215,6 +215,27 @@ final class BlockStateDeserializerHelper{ ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); } + /** @throws BlockStateDeserializeException */ + public static function mapLegacyWallType(BlockStateReader $in) : Wall{ + return self::decodeWall(match($type = $in->readString(BlockStateNames::WALL_BLOCK_TYPE)){ + StringValues::WALL_BLOCK_TYPE_ANDESITE => VanillaBlocks::ANDESITE_WALL(), + StringValues::WALL_BLOCK_TYPE_BRICK => VanillaBlocks::BRICK_WALL(), + StringValues::WALL_BLOCK_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_WALL(), + StringValues::WALL_BLOCK_TYPE_DIORITE => VanillaBlocks::DIORITE_WALL(), + StringValues::WALL_BLOCK_TYPE_END_BRICK => VanillaBlocks::END_STONE_BRICK_WALL(), + StringValues::WALL_BLOCK_TYPE_GRANITE => VanillaBlocks::GRANITE_WALL(), + StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_WALL(), + StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_WALL(), + StringValues::WALL_BLOCK_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_WALL(), + StringValues::WALL_BLOCK_TYPE_PRISMARINE => VanillaBlocks::PRISMARINE_WALL(), + StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_WALL(), + StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_WALL(), + StringValues::WALL_BLOCK_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_WALL(), + StringValues::WALL_BLOCK_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_WALL(), + default => throw $in->badValueException(BlockStateNames::WALL_BLOCK_TYPE, $type), + }, $in); + } + /** @throws BlockStateDeserializeException */ public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood From 40e46dbca207c2fc0c59adc650793de8d7e3adf6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 04:08:28 +0000 Subject: [PATCH 0017/1858] Fixed tests --- src/block/NetherReactor.php | 1 - tests/phpunit/block/block_factory_consistency_check.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/block/NetherReactor.php b/src/block/NetherReactor.php index 69e21690bd..355fc0ff75 100644 --- a/src/block/NetherReactor.php +++ b/src/block/NetherReactor.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\item\Item; use pocketmine\item\VanillaItems; diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 25cc92200d..483e210af0 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","1034":"Oak Door","1035":"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","1146":"Iron Door","1147":"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","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","3098":"Spruce Door","3099":"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","3114":"Birch Door","3115":"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","3130":"Jungle Door","3131":"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","3146":"Acacia Door","3147":"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","3162":"Dark Oak Door","3163":"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":"Stonecutter","3936":"Glowing Obsidian","3952":"Nether Reactor Core","3953":"Nether Reactor Core","3954":"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","6712":"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","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,"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,"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,"2313":2306,"2314":2306,"2315":2306,"2316":2306,"2317":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,"3100":3091,"3101":3091,"3102":3091,"3103":3091,"3116":3107,"3117":3107,"3118":3107,"3119":3107,"3132":3123,"3133":3123,"3134":3123,"3135":3123,"3148":3139,"3149":3139,"3150":3139,"3151":3139,"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,"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,"6705":6704,"6706":6704,"6707":6704,"6708":6704,"6709":6704,"6710":6704,"6711":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,"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":{"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","1034":"Oak Door","1035":"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","1146":"Iron Door","1147":"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","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","3098":"Spruce Door","3099":"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","3114":"Birch Door","3115":"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","3130":"Jungle Door","3131":"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","3146":"Acacia Door","3147":"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","3162":"Dark Oak Door","3163":"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":"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","6712":"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","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,"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,"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,"2313":2306,"2314":2306,"2315":2306,"2316":2306,"2317":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,"3100":3091,"3101":3091,"3102":3091,"3103":3091,"3116":3107,"3117":3107,"3118":3107,"3119":3107,"3132":3123,"3133":3123,"3134":3123,"3135":3123,"3148":3139,"3149":3139,"3150":3139,"3151":3139,"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,"6705":6704,"6706":6704,"6707":6704,"6708":6704,"6709":6704,"6710":6704,"6711":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,"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 From f323e3c43ff26d1a13450a1cad4c11be48ff6bcc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 05:21:16 +0000 Subject: [PATCH 0018/1858] BlockStateSerializer can now serialize all currently implemented PM blocks --- .../blockstate/BlockStateDeserializer.php | 16 +- .../bedrock/blockstate/BlockStateReader.php | 1 + .../blockstate/BlockStateSerializer.php | 4163 +++++------------ .../blockstate/BlockStateSerializerHelper.php | 269 ++ .../bedrock/blockstate/BlockStateWriter.php | 19 + 5 files changed, 1346 insertions(+), 3122 deletions(-) create mode 100644 src/data/bedrock/blockstate/BlockStateSerializerHelper.php diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index cc7e30193e..47d95eabf9 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -37,6 +37,7 @@ use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; +use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use function array_key_exists; use function min; @@ -2499,10 +2500,21 @@ final class BlockStateDeserializer{ } /** @throws BlockStateDeserializeException */ - public function deserialize(string $id, CompoundTag $blockState) : Block{ + public function deserialize(CompoundTag $blockState) : Block{ + try{ + $id = $blockState->getString("name"); + $states = $blockState->getCompoundTag("states"); + }catch(NbtException $e){ + throw new BlockStateDeserializeException("Error reading blockstate NBT: " . $e->getMessage(), 0, $e); + } + + if($states === null){ + throw new BlockStateDeserializeException("\"states\" tag must always be present, even if it has no data"); + } + if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); } - return $this->deserializeFuncs[$id](new BlockStateReader($blockState)); + return $this->deserializeFuncs[$id](new BlockStateReader($states)); } } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 21537e452b..f8ecf046ae 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; +use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 3bb3ab866a..3ddfc58f11 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -23,9 +23,129 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; +use pocketmine\block\ActivatorRail; +use pocketmine\block\Anvil; +use pocketmine\block\Bamboo; +use pocketmine\block\BambooSapling; +use pocketmine\block\Barrel; +use pocketmine\block\Bed; +use pocketmine\block\Beetroot; +use pocketmine\block\Bell; use pocketmine\block\Block; +use pocketmine\block\BlockLegacyMetadata; +use pocketmine\block\BoneBlock; +use pocketmine\block\BrewingStand; +use pocketmine\block\BrownMushroomBlock; +use pocketmine\block\Cactus; +use pocketmine\block\Cake; +use pocketmine\block\Carpet; +use pocketmine\block\Carrot; +use pocketmine\block\CarvedPumpkin; +use pocketmine\block\ChemistryTable; +use pocketmine\block\Chest; +use pocketmine\block\CocoaBlock; +use pocketmine\block\Concrete; +use pocketmine\block\ConcretePowder; +use pocketmine\block\Coral; +use pocketmine\block\CoralBlock; +use pocketmine\block\DaylightSensor; +use pocketmine\block\DetectorRail; +use pocketmine\block\Dirt; +use pocketmine\block\Door; +use pocketmine\block\DoublePlant; +use pocketmine\block\DoubleTallGrass; +use pocketmine\block\DyedShulkerBox; +use pocketmine\block\EnderChest; +use pocketmine\block\EndPortalFrame; +use pocketmine\block\EndRod; +use pocketmine\block\Farmland; +use pocketmine\block\FenceGate; +use pocketmine\block\Fire; +use pocketmine\block\FloorBanner; +use pocketmine\block\FloorCoralFan; +use pocketmine\block\FloorSign; +use pocketmine\block\FrostedIce; +use pocketmine\block\Furnace; +use pocketmine\block\GlazedTerracotta; +use pocketmine\block\HayBale; +use pocketmine\block\Hopper; +use pocketmine\block\ItemFrame; +use pocketmine\block\Ladder; +use pocketmine\block\Lantern; +use pocketmine\block\Lava; +use pocketmine\block\Leaves; +use pocketmine\block\Lectern; +use pocketmine\block\Lever; +use pocketmine\block\LitPumpkin; +use pocketmine\block\Log; +use pocketmine\block\Loom; +use pocketmine\block\MelonStem; +use pocketmine\block\NetherPortal; +use pocketmine\block\NetherWartPlant; +use pocketmine\block\Potato; +use pocketmine\block\PoweredRail; +use pocketmine\block\PumpkinStem; +use pocketmine\block\Rail; +use pocketmine\block\RedMushroomBlock; +use pocketmine\block\RedstoneComparator; +use pocketmine\block\RedstoneLamp; +use pocketmine\block\RedstoneOre; +use pocketmine\block\RedstoneRepeater; +use pocketmine\block\RedstoneTorch; +use pocketmine\block\RedstoneWire; +use pocketmine\block\Sapling; +use pocketmine\block\SeaPickle; +use pocketmine\block\SimplePillar; +use pocketmine\block\Skull; +use pocketmine\block\Slab; +use pocketmine\block\SnowLayer; +use pocketmine\block\Sponge; +use pocketmine\block\StainedGlass; +use pocketmine\block\StainedGlassPane; +use pocketmine\block\StainedHardenedClay; +use pocketmine\block\StainedHardenedGlass; +use pocketmine\block\StainedHardenedGlassPane; +use pocketmine\block\Stair; +use pocketmine\block\StoneButton; +use pocketmine\block\StonePressurePlate; +use pocketmine\block\Sugarcane; +use pocketmine\block\SweetBerryBush; +use pocketmine\block\TNT; +use pocketmine\block\Torch; +use pocketmine\block\Trapdoor; +use pocketmine\block\TrappedChest; +use pocketmine\block\Tripwire; +use pocketmine\block\TripwireHook; +use pocketmine\block\UnderwaterTorch; +use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\LeverFacing; use pocketmine\block\VanillaBlocks; +use pocketmine\block\Vine; +use pocketmine\block\Wall; +use pocketmine\block\WallBanner; +use pocketmine\block\WallCoralFan; +use pocketmine\block\WallSign; +use pocketmine\block\Water; +use pocketmine\block\WeightedPressurePlateHeavy; +use pocketmine\block\WeightedPressurePlateLight; +use pocketmine\block\Wheat; +use pocketmine\block\Wood; +use pocketmine\block\WoodenButton; +use pocketmine\block\WoodenDoor; +use pocketmine\block\WoodenPressurePlate; +use pocketmine\block\WoodenStairs; +use pocketmine\block\WoodenTrapdoor; +use pocketmine\block\Wool; +use pocketmine\data\bedrock\blockstate\BlockStateSerializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateWriter as Writer; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; +use pocketmine\math\Axis; +use pocketmine\math\Facing; +use pocketmine\nbt\tag\CompoundTag; +use pocketmine\utils\AssumptionFailedError; +use function class_parents; use function get_class; final class BlockStateSerializer{ @@ -34,3135 +154,938 @@ final class BlockStateSerializer{ * describe the bottom type of a type hierarchy only containing Block. * * @var \Closure[][] - * @phpstan-var array> + * @phpstan-var array> */ private array $serializers = []; /** * @phpstan-template TBlockType of Block - * @phpstan-param TBlockType $block - * @phpstan-param \Closure(TBlockType) : BlockStateWriter $serializer + * @phpstan-param TBlockType $block + * @phpstan-param \Closure(TBlockType) : Writer $serializer */ - private function map(Block $block, \Closure $serializer) : void{ + public function map(Block $block, \Closure $serializer) : void{ + if(isset($this->serializers[$block->getTypeId()])){ + //TODO: REMOVE ME + throw new AssumptionFailedError("Registering the same block twice!"); + } $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; } + /** + * @phpstan-template TBlockType of Block + * @phpstan-param TBlockType $blockState + */ + public function serialize(Block $blockState) : CompoundTag{ + $typeId = $blockState->getTypeId(); + + $locatedSerializer = $this->serializers[$typeId][get_class($blockState)] ?? null; + if($locatedSerializer === null){ + $parents = class_parents($blockState); + if($parents === false){ + throw new AssumptionFailedError("A block class should always have at least one parent"); + } + foreach($parents as $parent){ + if(isset($this->serializers[$typeId][$parent])){ + $locatedSerializer = $this->serializers[$typeId][$parent]; + break; + } + } + } + + if($locatedSerializer === null){ + throw new BlockStateSerializeException("No serializer registered for " . get_class($blockState) . " with type ID $typeId"); + } + + /** + * @var \Closure $serializer + * @phpstan-var \Closure(TBlockType) : Writer $serializer + */ + $serializer = $locatedSerializer; + + /** @var Writer $writer */ + $writer = $serializer($blockState); + return $writer->writeBlockStateNbt(); + } + public function __construct(){ - $this->map(VanillaBlocks::AIR(), fn() => new BlockStateWriter(Ids::AIR)); - $this->map(VanillaBlocks::BARRIER(), fn() => new BlockStateWriter(Ids::BARRIER)); - $this->map(VanillaBlocks::BEACON(), fn() => new BlockStateWriter(Ids::BEACON)); - $this->map(VanillaBlocks::BLUE_ICE(), fn() => new BlockStateWriter(Ids::BLUE_ICE)); - $this->map(VanillaBlocks::BOOKSHELF(), fn() => new BlockStateWriter(Ids::BOOKSHELF)); - $this->map(VanillaBlocks::BRICKS(), fn() => new BlockStateWriter(Ids::BRICK_BLOCK)); - $this->map(VanillaBlocks::BROWN_MUSHROOM(), fn() => new BlockStateWriter(Ids::BROWN_MUSHROOM)); - $this->map(VanillaBlocks::CHEMICAL_HEAT(), fn() => new BlockStateWriter(Ids::CHEMICAL_HEAT)); - $this->map(VanillaBlocks::CLAY(), fn() => new BlockStateWriter(Ids::CLAY)); - $this->map(VanillaBlocks::COAL(), fn() => new BlockStateWriter(Ids::COAL_BLOCK)); - $this->map(VanillaBlocks::COAL_ORE(), fn() => new BlockStateWriter(Ids::COAL_ORE)); - $this->map(VanillaBlocks::COBBLESTONE(), fn() => new BlockStateWriter(Ids::COBBLESTONE)); - $this->map(VanillaBlocks::CRAFTING_TABLE(), fn() => new BlockStateWriter(Ids::CRAFTING_TABLE)); - $this->map(VanillaBlocks::DEAD_BUSH(), fn() => new BlockStateWriter(Ids::DEADBUSH)); - $this->map(VanillaBlocks::DIAMOND(), fn() => new BlockStateWriter(Ids::DIAMOND_BLOCK)); - $this->map(VanillaBlocks::DIAMOND_ORE(), fn() => new BlockStateWriter(Ids::DIAMOND_ORE)); - $this->map(VanillaBlocks::DRAGON_EGG(), fn() => new BlockStateWriter(Ids::DRAGON_EGG)); - $this->map(VanillaBlocks::DRIED_KELP(), fn() => new BlockStateWriter(Ids::DRIED_KELP_BLOCK)); - $this->map(VanillaBlocks::ELEMENT_ZERO(), fn() => new BlockStateWriter(Ids::ELEMENT_0)); - $this->map(VanillaBlocks::ELEMENT_HYDROGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_1)); - $this->map(VanillaBlocks::ELEMENT_NEON(), fn() => new BlockStateWriter(Ids::ELEMENT_10)); - $this->map(VanillaBlocks::ELEMENT_FERMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_100)); - $this->map(VanillaBlocks::ELEMENT_MENDELEVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_101)); - $this->map(VanillaBlocks::ELEMENT_NOBELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_102)); - $this->map(VanillaBlocks::ELEMENT_LAWRENCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_103)); - $this->map(VanillaBlocks::ELEMENT_RUTHERFORDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_104)); - $this->map(VanillaBlocks::ELEMENT_DUBNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_105)); - $this->map(VanillaBlocks::ELEMENT_SEABORGIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_106)); - $this->map(VanillaBlocks::ELEMENT_BOHRIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_107)); - $this->map(VanillaBlocks::ELEMENT_HASSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_108)); - $this->map(VanillaBlocks::ELEMENT_MEITNERIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_109)); - $this->map(VanillaBlocks::ELEMENT_SODIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_11)); - $this->map(VanillaBlocks::ELEMENT_DARMSTADTIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_110)); - $this->map(VanillaBlocks::ELEMENT_ROENTGENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_111)); - $this->map(VanillaBlocks::ELEMENT_COPERNICIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_112)); - $this->map(VanillaBlocks::ELEMENT_NIHONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_113)); - $this->map(VanillaBlocks::ELEMENT_FLEROVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_114)); - $this->map(VanillaBlocks::ELEMENT_MOSCOVIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_115)); - $this->map(VanillaBlocks::ELEMENT_LIVERMORIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_116)); - $this->map(VanillaBlocks::ELEMENT_TENNESSINE(), fn() => new BlockStateWriter(Ids::ELEMENT_117)); - $this->map(VanillaBlocks::ELEMENT_OGANESSON(), fn() => new BlockStateWriter(Ids::ELEMENT_118)); - $this->map(VanillaBlocks::ELEMENT_MAGNESIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_12)); - $this->map(VanillaBlocks::ELEMENT_ALUMINUM(), fn() => new BlockStateWriter(Ids::ELEMENT_13)); - $this->map(VanillaBlocks::ELEMENT_SILICON(), fn() => new BlockStateWriter(Ids::ELEMENT_14)); - $this->map(VanillaBlocks::ELEMENT_PHOSPHORUS(), fn() => new BlockStateWriter(Ids::ELEMENT_15)); - $this->map(VanillaBlocks::ELEMENT_SULFUR(), fn() => new BlockStateWriter(Ids::ELEMENT_16)); - $this->map(VanillaBlocks::ELEMENT_CHLORINE(), fn() => new BlockStateWriter(Ids::ELEMENT_17)); - $this->map(VanillaBlocks::ELEMENT_ARGON(), fn() => new BlockStateWriter(Ids::ELEMENT_18)); - $this->map(VanillaBlocks::ELEMENT_POTASSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_19)); - $this->map(VanillaBlocks::ELEMENT_HELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_2)); - $this->map(VanillaBlocks::ELEMENT_CALCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_20)); - $this->map(VanillaBlocks::ELEMENT_SCANDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_21)); - $this->map(VanillaBlocks::ELEMENT_TITANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_22)); - $this->map(VanillaBlocks::ELEMENT_VANADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_23)); - $this->map(VanillaBlocks::ELEMENT_CHROMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_24)); - $this->map(VanillaBlocks::ELEMENT_MANGANESE(), fn() => new BlockStateWriter(Ids::ELEMENT_25)); - $this->map(VanillaBlocks::ELEMENT_IRON(), fn() => new BlockStateWriter(Ids::ELEMENT_26)); - $this->map(VanillaBlocks::ELEMENT_COBALT(), fn() => new BlockStateWriter(Ids::ELEMENT_27)); - $this->map(VanillaBlocks::ELEMENT_NICKEL(), fn() => new BlockStateWriter(Ids::ELEMENT_28)); - $this->map(VanillaBlocks::ELEMENT_COPPER(), fn() => new BlockStateWriter(Ids::ELEMENT_29)); - $this->map(VanillaBlocks::ELEMENT_LITHIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_3)); - $this->map(VanillaBlocks::ELEMENT_ZINC(), fn() => new BlockStateWriter(Ids::ELEMENT_30)); - $this->map(VanillaBlocks::ELEMENT_GALLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_31)); - $this->map(VanillaBlocks::ELEMENT_GERMANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_32)); - $this->map(VanillaBlocks::ELEMENT_ARSENIC(), fn() => new BlockStateWriter(Ids::ELEMENT_33)); - $this->map(VanillaBlocks::ELEMENT_SELENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_34)); - $this->map(VanillaBlocks::ELEMENT_BROMINE(), fn() => new BlockStateWriter(Ids::ELEMENT_35)); - $this->map(VanillaBlocks::ELEMENT_KRYPTON(), fn() => new BlockStateWriter(Ids::ELEMENT_36)); - $this->map(VanillaBlocks::ELEMENT_RUBIDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_37)); - $this->map(VanillaBlocks::ELEMENT_STRONTIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_38)); - $this->map(VanillaBlocks::ELEMENT_YTTRIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_39)); - $this->map(VanillaBlocks::ELEMENT_BERYLLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_4)); - $this->map(VanillaBlocks::ELEMENT_ZIRCONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_40)); - $this->map(VanillaBlocks::ELEMENT_NIOBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_41)); - $this->map(VanillaBlocks::ELEMENT_MOLYBDENUM(), fn() => new BlockStateWriter(Ids::ELEMENT_42)); - $this->map(VanillaBlocks::ELEMENT_TECHNETIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_43)); - $this->map(VanillaBlocks::ELEMENT_RUTHENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_44)); - $this->map(VanillaBlocks::ELEMENT_RHODIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_45)); - $this->map(VanillaBlocks::ELEMENT_PALLADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_46)); - $this->map(VanillaBlocks::ELEMENT_SILVER(), fn() => new BlockStateWriter(Ids::ELEMENT_47)); - $this->map(VanillaBlocks::ELEMENT_CADMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_48)); - $this->map(VanillaBlocks::ELEMENT_INDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_49)); - $this->map(VanillaBlocks::ELEMENT_BORON(), fn() => new BlockStateWriter(Ids::ELEMENT_5)); - $this->map(VanillaBlocks::ELEMENT_TIN(), fn() => new BlockStateWriter(Ids::ELEMENT_50)); - $this->map(VanillaBlocks::ELEMENT_ANTIMONY(), fn() => new BlockStateWriter(Ids::ELEMENT_51)); - $this->map(VanillaBlocks::ELEMENT_TELLURIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_52)); - $this->map(VanillaBlocks::ELEMENT_IODINE(), fn() => new BlockStateWriter(Ids::ELEMENT_53)); - $this->map(VanillaBlocks::ELEMENT_XENON(), fn() => new BlockStateWriter(Ids::ELEMENT_54)); - $this->map(VanillaBlocks::ELEMENT_CESIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_55)); - $this->map(VanillaBlocks::ELEMENT_BARIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_56)); - $this->map(VanillaBlocks::ELEMENT_LANTHANUM(), fn() => new BlockStateWriter(Ids::ELEMENT_57)); - $this->map(VanillaBlocks::ELEMENT_CERIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_58)); - $this->map(VanillaBlocks::ELEMENT_PRASEODYMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_59)); - $this->map(VanillaBlocks::ELEMENT_CARBON(), fn() => new BlockStateWriter(Ids::ELEMENT_6)); - $this->map(VanillaBlocks::ELEMENT_NEODYMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_60)); - $this->map(VanillaBlocks::ELEMENT_PROMETHIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_61)); - $this->map(VanillaBlocks::ELEMENT_SAMARIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_62)); - $this->map(VanillaBlocks::ELEMENT_EUROPIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_63)); - $this->map(VanillaBlocks::ELEMENT_GADOLINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_64)); - $this->map(VanillaBlocks::ELEMENT_TERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_65)); - $this->map(VanillaBlocks::ELEMENT_DYSPROSIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_66)); - $this->map(VanillaBlocks::ELEMENT_HOLMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_67)); - $this->map(VanillaBlocks::ELEMENT_ERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_68)); - $this->map(VanillaBlocks::ELEMENT_THULIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_69)); - $this->map(VanillaBlocks::ELEMENT_NITROGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_7)); - $this->map(VanillaBlocks::ELEMENT_YTTERBIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_70)); - $this->map(VanillaBlocks::ELEMENT_LUTETIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_71)); - $this->map(VanillaBlocks::ELEMENT_HAFNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_72)); - $this->map(VanillaBlocks::ELEMENT_TANTALUM(), fn() => new BlockStateWriter(Ids::ELEMENT_73)); - $this->map(VanillaBlocks::ELEMENT_TUNGSTEN(), fn() => new BlockStateWriter(Ids::ELEMENT_74)); - $this->map(VanillaBlocks::ELEMENT_RHENIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_75)); - $this->map(VanillaBlocks::ELEMENT_OSMIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_76)); - $this->map(VanillaBlocks::ELEMENT_IRIDIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_77)); - $this->map(VanillaBlocks::ELEMENT_PLATINUM(), fn() => new BlockStateWriter(Ids::ELEMENT_78)); - $this->map(VanillaBlocks::ELEMENT_GOLD(), fn() => new BlockStateWriter(Ids::ELEMENT_79)); - $this->map(VanillaBlocks::ELEMENT_OXYGEN(), fn() => new BlockStateWriter(Ids::ELEMENT_8)); - $this->map(VanillaBlocks::ELEMENT_MERCURY(), fn() => new BlockStateWriter(Ids::ELEMENT_80)); - $this->map(VanillaBlocks::ELEMENT_THALLIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_81)); - $this->map(VanillaBlocks::ELEMENT_LEAD(), fn() => new BlockStateWriter(Ids::ELEMENT_82)); - $this->map(VanillaBlocks::ELEMENT_BISMUTH(), fn() => new BlockStateWriter(Ids::ELEMENT_83)); - $this->map(VanillaBlocks::ELEMENT_POLONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_84)); - $this->map(VanillaBlocks::ELEMENT_ASTATINE(), fn() => new BlockStateWriter(Ids::ELEMENT_85)); - $this->map(VanillaBlocks::ELEMENT_RADON(), fn() => new BlockStateWriter(Ids::ELEMENT_86)); - $this->map(VanillaBlocks::ELEMENT_FRANCIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_87)); - $this->map(VanillaBlocks::ELEMENT_RADIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_88)); - $this->map(VanillaBlocks::ELEMENT_ACTINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_89)); - $this->map(VanillaBlocks::ELEMENT_FLUORINE(), fn() => new BlockStateWriter(Ids::ELEMENT_9)); - $this->map(VanillaBlocks::ELEMENT_THORIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_90)); - $this->map(VanillaBlocks::ELEMENT_PROTACTINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_91)); - $this->map(VanillaBlocks::ELEMENT_URANIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_92)); - $this->map(VanillaBlocks::ELEMENT_NEPTUNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_93)); - $this->map(VanillaBlocks::ELEMENT_PLUTONIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_94)); - $this->map(VanillaBlocks::ELEMENT_AMERICIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_95)); - $this->map(VanillaBlocks::ELEMENT_CURIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_96)); - $this->map(VanillaBlocks::ELEMENT_BERKELIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_97)); - $this->map(VanillaBlocks::ELEMENT_CALIFORNIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_98)); - $this->map(VanillaBlocks::ELEMENT_EINSTEINIUM(), fn() => new BlockStateWriter(Ids::ELEMENT_99)); - $this->map(VanillaBlocks::EMERALD(), fn() => new BlockStateWriter(Ids::EMERALD_BLOCK)); - $this->map(VanillaBlocks::EMERALD_ORE(), fn() => new BlockStateWriter(Ids::EMERALD_ORE)); - $this->map(VanillaBlocks::ENCHANTING_TABLE(), fn() => new BlockStateWriter(Ids::ENCHANTING_TABLE)); - $this->map(VanillaBlocks::END_STONE_BRICKS(), fn() => new BlockStateWriter(Ids::END_BRICKS)); - $this->map(VanillaBlocks::END_STONE(), fn() => new BlockStateWriter(Ids::END_STONE)); - $this->map(VanillaBlocks::FLETCHING_TABLE(), fn() => new BlockStateWriter(Ids::FLETCHING_TABLE)); - $this->map(VanillaBlocks::GLASS(), fn() => new BlockStateWriter(Ids::GLASS)); - $this->map(VanillaBlocks::GLASS_PANE(), fn() => new BlockStateWriter(Ids::GLASS_PANE)); - $this->map(VanillaBlocks::GLOWING_OBSIDIAN(), fn() => new BlockStateWriter(Ids::GLOWINGOBSIDIAN)); - $this->map(VanillaBlocks::GLOWSTONE(), fn() => new BlockStateWriter(Ids::GLOWSTONE)); - $this->map(VanillaBlocks::GOLD(), fn() => new BlockStateWriter(Ids::GOLD_BLOCK)); - $this->map(VanillaBlocks::GOLD_ORE(), fn() => new BlockStateWriter(Ids::GOLD_ORE)); - $this->map(VanillaBlocks::GRASS(), fn() => new BlockStateWriter(Ids::GRASS)); - $this->map(VanillaBlocks::GRASS_PATH(), fn() => new BlockStateWriter(Ids::GRASS_PATH)); - $this->map(VanillaBlocks::GRAVEL(), fn() => new BlockStateWriter(Ids::GRAVEL)); - $this->map(VanillaBlocks::HARDENED_GLASS(), fn() => new BlockStateWriter(Ids::HARD_GLASS)); - $this->map(VanillaBlocks::HARDENED_GLASS_PANE(), fn() => new BlockStateWriter(Ids::HARD_GLASS_PANE)); - $this->map(VanillaBlocks::HARDENED_CLAY(), fn() => new BlockStateWriter(Ids::HARDENED_CLAY)); - $this->map(VanillaBlocks::ICE(), fn() => new BlockStateWriter(Ids::ICE)); - $this->map(VanillaBlocks::INFO_UPDATE(), fn() => new BlockStateWriter(Ids::INFO_UPDATE)); - $this->map(VanillaBlocks::INFO_UPDATE2(), fn() => new BlockStateWriter(Ids::INFO_UPDATE2)); - $this->map(VanillaBlocks::INVISIBLE_BEDROCK(), fn() => new BlockStateWriter(Ids::INVISIBLEBEDROCK)); - $this->map(VanillaBlocks::IRON_BARS(), fn() => new BlockStateWriter(Ids::IRON_BARS)); - $this->map(VanillaBlocks::IRON(), fn() => new BlockStateWriter(Ids::IRON_BLOCK)); - $this->map(VanillaBlocks::IRON_ORE(), fn() => new BlockStateWriter(Ids::IRON_ORE)); - $this->map(VanillaBlocks::JUKEBOX(), fn() => new BlockStateWriter(Ids::JUKEBOX)); - $this->map(VanillaBlocks::LAPIS_LAZULI(), fn() => new BlockStateWriter(Ids::LAPIS_BLOCK)); - $this->map(VanillaBlocks::LAPIS_LAZULI_ORE(), fn() => new BlockStateWriter(Ids::LAPIS_ORE)); - $this->map(VanillaBlocks::REDSTONE_LAMP(), fn() => new BlockStateWriter(Ids::LIT_REDSTONE_LAMP)); - $this->map(VanillaBlocks::REDSTONE_ORE(), fn() => new BlockStateWriter(Ids::LIT_REDSTONE_ORE)); - $this->map(VanillaBlocks::MAGMA(), fn() => new BlockStateWriter(Ids::MAGMA)); - $this->map(VanillaBlocks::MELON(), fn() => new BlockStateWriter(Ids::MELON_BLOCK)); - $this->map(VanillaBlocks::MONSTER_SPAWNER(), fn() => new BlockStateWriter(Ids::MOB_SPAWNER)); - $this->map(VanillaBlocks::MOSSY_COBBLESTONE(), fn() => new BlockStateWriter(Ids::MOSSY_COBBLESTONE)); - $this->map(VanillaBlocks::MYCELIUM(), fn() => new BlockStateWriter(Ids::MYCELIUM)); - $this->map(VanillaBlocks::NETHER_BRICKS(), fn() => new BlockStateWriter(Ids::NETHER_BRICK)); - $this->map(VanillaBlocks::NETHER_BRICK_FENCE(), fn() => new BlockStateWriter(Ids::NETHER_BRICK_FENCE)); - $this->map(VanillaBlocks::NETHER_WART_BLOCK(), fn() => new BlockStateWriter(Ids::NETHER_WART_BLOCK)); - $this->map(VanillaBlocks::NETHERRACK(), fn() => new BlockStateWriter(Ids::NETHERRACK)); - $this->map(VanillaBlocks::NETHER_REACTOR_CORE(), fn() => new BlockStateWriter(Ids::NETHERREACTOR)); - $this->map(VanillaBlocks::NOTE_BLOCK(), fn() => new BlockStateWriter(Ids::NOTEBLOCK)); - $this->map(VanillaBlocks::OBSIDIAN(), fn() => new BlockStateWriter(Ids::OBSIDIAN)); - $this->map(VanillaBlocks::PACKED_ICE(), fn() => new BlockStateWriter(Ids::PACKED_ICE)); - $this->map(VanillaBlocks::PODZOL(), fn() => new BlockStateWriter(Ids::PODZOL)); - $this->map(VanillaBlocks::NETHER_QUARTZ_ORE(), fn() => new BlockStateWriter(Ids::QUARTZ_ORE)); - $this->map(VanillaBlocks::RED_MUSHROOM(), fn() => new BlockStateWriter(Ids::RED_MUSHROOM)); - $this->map(VanillaBlocks::RED_NETHER_BRICKS(), fn() => new BlockStateWriter(Ids::RED_NETHER_BRICK)); - $this->map(VanillaBlocks::REDSTONE(), fn() => new BlockStateWriter(Ids::REDSTONE_BLOCK)); - $this->map(VanillaBlocks::REDSTONE_LAMP(), fn() => new BlockStateWriter(Ids::REDSTONE_LAMP)); - $this->map(VanillaBlocks::REDSTONE_ORE(), fn() => new BlockStateWriter(Ids::REDSTONE_ORE)); - $this->map(VanillaBlocks::RESERVED6(), fn() => new BlockStateWriter(Ids::RESERVED6)); - $this->map(VanillaBlocks::SEA_LANTERN(), fn() => new BlockStateWriter(Ids::SEALANTERN)); - $this->map(VanillaBlocks::SLIME(), fn() => new BlockStateWriter(Ids::SLIME)); - $this->map(VanillaBlocks::SMOOTH_STONE(), fn() => new BlockStateWriter(Ids::SMOOTH_STONE)); - $this->map(VanillaBlocks::SNOW(), fn() => new BlockStateWriter(Ids::SNOW)); - $this->map(VanillaBlocks::SOUL_SAND(), fn() => new BlockStateWriter(Ids::SOUL_SAND)); - $this->map(VanillaBlocks::LEGACY_STONECUTTER(), fn() => new BlockStateWriter(Ids::STONECUTTER)); - $this->map(VanillaBlocks::SHULKER_BOX(), fn() => new BlockStateWriter(Ids::UNDYED_SHULKER_BOX)); - $this->map(VanillaBlocks::LILY_PAD(), fn() => new BlockStateWriter(Ids::WATERLILY)); - $this->map(VanillaBlocks::COBWEB(), fn() => new BlockStateWriter(Ids::WEB)); - $this->map(VanillaBlocks::DANDELION(), fn() => new BlockStateWriter(Ids::YELLOW_FLOWER)); - //$this->map(VanillaBlocks::ACACIA_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ACACIA_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACACIA_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::ACTIVATOR_RAIL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ACTIVATOR_RAIL()) - * TODO: implement (de)serializer - * rail_data_bit (ByteTag) = 0, 1 - * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::AMETHYST_CLUSTER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::ANDESITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ANDESITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::ANVIL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ANVIL()) - * TODO: implement (de)serializer - * damage (StringTag) = broken, slightly_damaged, undamaged, very_damaged - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::AZALEA_LEAVES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::AZALEA_LEAVES_FLOWERED(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BAMBOO(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BAMBOO()) - * TODO: implement (de)serializer - * age_bit (ByteTag) = 0, 1 - * bamboo_leaf_size (StringTag) = large_leaves, no_leaves, small_leaves - * bamboo_stalk_thickness (StringTag) = thick, thin - */ - //}); - //$this->map(VanillaBlocks::BAMBOO_SAPLING(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BAMBOO_SAPLING()) - * TODO: implement (de)serializer - * age_bit (ByteTag) = 0, 1 - * sapling_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::BARREL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BARREL()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BASALT(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::BED(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BED()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * head_piece_bit (ByteTag) = 0, 1 - * occupied_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BEDROCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BEDROCK()) - * TODO: implement (de)serializer - * infiniburn_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BEEHIVE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BEETROOT(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BEETROOTS()) - * TODO: implement (de)serializer - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::BEE_NEST(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BELL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BELL()) - * TODO: implement (de)serializer - * attachment (StringTag) = hanging, multiple, side, standing - * direction (IntTag) = 0, 1, 2, 3 - * toggle_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BIG_DRIPLEAF(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * big_dripleaf_head (ByteTag) = 0, 1 - * big_dripleaf_tilt (StringTag) = full_tilt, none, partial_tilt, unstable - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BIRCH_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BIRCH_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BLACKSTONE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLACKSTONE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLACKSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::BLACKSTONE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLACK_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLACK_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BLACK_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BLAST_FURNACE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BLAST_FURNACE()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BLUE_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLUE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BLUE_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BONE_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BONE_BLOCK()) - * TODO: implement (de)serializer - * deprecated (IntTag) = 0, 1, 2, 3 - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::BORDER_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BREWING_STAND(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BREWING_STAND()) - * TODO: implement (de)serializer - * brewing_stand_slot_a_bit (ByteTag) = 0, 1 - * brewing_stand_slot_b_bit (ByteTag) = 0, 1 - * brewing_stand_slot_c_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::BROWN_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BROWN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BROWN_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BROWN_MUSHROOM_BLOCK()) - * TODO: implement (de)serializer - * huge_mushroom_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::BUBBLE_COLUMN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * drag_down (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CACTUS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CACTUS()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::CAKE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CAKE()) - * TODO: implement (de)serializer - * bite_counter (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->map(VanillaBlocks::CAMPFIRE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * extinguished (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CARPET(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CARPET()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::CARROTS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CARROTS()) - * TODO: implement (de)serializer - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::CARVED_PUMPKIN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CARVED_PUMPKIN()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::CAULDRON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * cauldron_liquid (StringTag) = lava, powder_snow, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->map(VanillaBlocks::CAVE_VINES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::CAVE_VINES_BODY_WITH_BERRIES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::CAVE_VINES_HEAD_WITH_BERRIES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::CHAIN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::CHAIN_COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::CHEMISTRY_TABLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * chemistry_table_type (StringTag) = compound_creator, element_constructor, lab_table, material_reducer - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::CHEST(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CHEST()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::CHORUS_FLOWER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * age (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::COBBLED_DEEPSLATE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::COBBLESTONE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::COBBLESTONE_WALL()) - * TODO: implement (de)serializer - * wall_block_type (StringTag) = andesite, brick, cobblestone, diorite, end_brick, granite, mossy_cobblestone, mossy_stone_brick, nether_brick, prismarine, red_nether_brick, red_sandstone, sandstone, stone_brick - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::COCOA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::COCOA_POD()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2 - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::COLORED_TORCH_BP(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * color_bit (ByteTag) = 0, 1 - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::COLORED_TORCH_RG(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * color_bit (ByteTag) = 0, 1 - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::COMPOSTER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 - */ - //}); - //$this->map(VanillaBlocks::CONCRETE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CONCRETE()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::CONCRETEPOWDER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CONCRETE_POWDER()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::CORAL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CORAL()) - * TODO: implement (de)serializer - * coral_color (StringTag) = blue, pink, purple, red, yellow - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CORAL_BLOCK()) - * TODO: implement (de)serializer - * coral_color (StringTag) = blue, pink, purple, red, yellow - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_FAN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CORAL_FAN()) - * TODO: implement (de)serializer - * coral_color (StringTag) = blue, pink, purple, red, yellow - * coral_fan_direction (IntTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_FAN_DEAD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * coral_color (StringTag) = blue, pink, purple, red, yellow - * coral_fan_direction (IntTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_FAN_HANG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) - * TODO: implement (de)serializer - * coral_direction (IntTag) = 0, 1, 2, 3 - * coral_hang_type_bit (ByteTag) = 0, 1 - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_FAN_HANG2(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) - * TODO: implement (de)serializer - * coral_direction (IntTag) = 0, 1, 2, 3 - * coral_hang_type_bit (ByteTag) = 0, 1 - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CORAL_FAN_HANG3(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WALL_CORAL_FAN()) - * TODO: implement (de)serializer - * coral_direction (IntTag) = 0, 1, 2, 3 - * coral_hang_type_bit (ByteTag) = 0, 1 - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_HYPHAE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_STEM(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CRIMSON_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::CYAN_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CYAN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::CYAN_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::DARKOAK_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::DARKOAK_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::DARK_OAK_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_OAK_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DARK_PRISMARINE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DARK_PRISMARINE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::DAYLIGHT_DETECTOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DAYLIGHT_SENSOR()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::DAYLIGHT_DETECTOR_INVERTED(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DAYLIGHT_SENSOR()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_BRICK_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_BRICK_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_BRICK_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_TILE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_TILE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_TILE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::DEEPSLATE_TILE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DETECTOR_RAIL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DETECTOR_RAIL()) - * TODO: implement (de)serializer - * rail_data_bit (ByteTag) = 0, 1 - * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::DIORITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DIORITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::DIRT(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DIRT()) - * TODO: implement (de)serializer - * dirt_type (StringTag) = coarse, normal - */ - //}); - //$this->map(VanillaBlocks::DISPENSER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_PLANT(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * double_plant_type (StringTag) = fern, grass, paeonia, rose, sunflower, syringa - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB2(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB3(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_STONE_SLAB4(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::DOUBLE_WOODEN_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::DROPPER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ENDER_CHEST(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ENDER_CHEST()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::END_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::END_STONE_BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::END_PORTAL_FRAME(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::END_PORTAL_FRAME()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * end_portal_eye_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::END_ROD(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::END_ROD()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::EXPOSED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::EXPOSED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::EXPOSED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::FARMLAND(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FARMLAND()) - * TODO: implement (de)serializer - * moisturized_amount (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::FENCE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::FIRE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FIRE()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::FLOWER_POT(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FLOWER_POT()) - * TODO: implement (de)serializer - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::FLOWING_LAVA(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::FLOWING_WATER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::FRAME(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * item_frame_map_bit (ByteTag) = 0, 1 - * item_frame_photo_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::FROSTED_ICE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FROSTED_ICE()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::FURNACE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FURNACE()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::GLOW_FRAME(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * item_frame_map_bit (ByteTag) = 0, 1 - * item_frame_photo_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::GLOW_LICHEN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 - */ - //}); - //$this->map(VanillaBlocks::GOLDEN_RAIL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::POWERED_RAIL()) - * TODO: implement (de)serializer - * rail_data_bit (ByteTag) = 0, 1 - * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::GRANITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::GRANITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::GRAY_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::GRAY_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::GRAY_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::GREEN_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::GREEN_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::GREEN_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::GRINDSTONE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * attachment (StringTag) = hanging, multiple, side, standing - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::HARD_STAINED_GLASS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STAINED_HARDENED_GLASS()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::HARD_STAINED_GLASS_PANE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STAINED_HARDENED_GLASS_PANE()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::HAY_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::HAY_BALE()) - * TODO: implement (de)serializer - * deprecated (IntTag) = 0, 1, 2, 3 - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::HEAVY_WEIGHTED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::HOPPER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::HOPPER()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * toggle_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::INFESTED_DEEPSLATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::IRON_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::IRON_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::IRON_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::IRON_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::JIGSAW(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * rotation (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::JUNGLE_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::JUNGLE_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::KELP(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * kelp_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::LADDER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LADDER()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LANTERN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LANTERN()) - * TODO: implement (de)serializer - * hanging (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LARGE_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LAVA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LAVA()) - * TODO: implement (de)serializer - * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::LAVA_CAULDRON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * cauldron_liquid (StringTag) = lava, powder_snow, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->map(VanillaBlocks::LEAVES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * old_leaf_type (StringTag) = birch, jungle, oak, spruce - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LEAVES2(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * new_leaf_type (StringTag) = acacia, dark_oak - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LECTERN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LECTERN()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LEVER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LEVER()) - * TODO: implement (de)serializer - * lever_direction (StringTag) = down_east_west, down_north_south, east, north, south, up_east_west, up_north_south, west - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIGHTNING_ROD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_BLUE_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_BLUE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_GRAY_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_GRAY_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIGHT_WEIGHTED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::LIME_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIME_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LIME_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LIT_BLAST_FURNACE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BLAST_FURNACE()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LIT_FURNACE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::FURNACE()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LIT_PUMPKIN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LIT_PUMPKIN()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::LIT_SMOKER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SMOKER()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::LOG(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * old_log_type (StringTag) = birch, jungle, oak, spruce - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::LOG2(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * new_log_type (StringTag) = acacia, dark_oak - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::LOOM(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LOOM()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::MAGENTA_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::MAGENTA_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::MEDIUM_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::MELON_STEM(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::MELON_STEM()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::MONSTER_EGG(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * monster_egg_stone_type (StringTag) = chiseled_stone_brick, cobblestone, cracked_stone_brick, mossy_stone_brick, stone, stone_brick - */ - //}); - //$this->map(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::MOSSY_COBBLESTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::MOSSY_STONE_BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::NETHER_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::NETHER_BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::NETHER_WART(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::NETHER_WART()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::NORMAL_STONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::OAK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::OBSERVER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ORANGE_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ORANGE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::ORANGE_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::OXIDIZED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::OXIDIZED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::OXIDIZED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::PINK_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::PINK_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PINK_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::PISTON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::PISTONARMCOLLISION(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::PLANKS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::POINTED_DRIPSTONE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * dripstone_thickness (StringTag) = base, frustum, merge, middle, tip - * hanging (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::POLISHED_ANDESITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BASALT(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BRICK_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_BLACKSTONE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_DEEPSLATE_WALL(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_DIORITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::POLISHED_DIORITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::POLISHED_GRANITE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::POLISHED_GRANITE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::PORTAL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::NETHER_PORTAL()) - * TODO: implement (de)serializer - * portal_axis (StringTag) = unknown, x, z - */ - //}); - //$this->map(VanillaBlocks::POTATOES(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::POTATOES()) - * TODO: implement (de)serializer - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::POWERED_COMPARATOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::REDSTONE_COMPARATOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * output_lit_bit (ByteTag) = 0, 1 - * output_subtract_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::POWERED_REPEATER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * repeater_delay (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::PRISMARINE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PRISMARINE()) - * TODO: implement (de)serializer - * prismarine_block_type (StringTag) = bricks, dark, default - */ - //}); - //$this->map(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PRISMARINE_BRICKS_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::PRISMARINE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PRISMARINE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::PUMPKIN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PUMPKIN()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::PUMPKIN_STEM(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PUMPKIN_STEM()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::PURPLE_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::PURPLE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PURPLE_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::PURPUR_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * chisel_type (StringTag) = chiseled, default, lines, smooth - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::PURPUR_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::PURPUR_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::QUARTZ_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * chisel_type (StringTag) = chiseled, default, lines, smooth - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::QUARTZ_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::QUARTZ_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::RAIL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RAIL()) - * TODO: implement (de)serializer - * rail_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - */ - //}); - //$this->map(VanillaBlocks::REDSTONE_TORCH(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::REDSTONE_TORCH()) - * TODO: implement (de)serializer - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::REDSTONE_WIRE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::REDSTONE_WIRE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::RED_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::RED_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::RED_FLOWER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * flower_type (StringTag) = allium, cornflower, houstonia, lily_of_the_valley, orchid, oxeye, poppy, tulip_orange, tulip_pink, tulip_red, tulip_white - */ - //}); - //$this->map(VanillaBlocks::RED_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RED_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::RED_MUSHROOM_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RED_MUSHROOM_BLOCK()) - * TODO: implement (de)serializer - * huge_mushroom_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RED_NETHER_BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::RED_SANDSTONE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RED_SANDSTONE()) - * TODO: implement (de)serializer - * sand_stone_type (StringTag) = cut, default, heiroglyphs, smooth - */ - //}); - //$this->map(VanillaBlocks::RED_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::RED_SANDSTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::REEDS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SUGARCANE()) - * TODO: implement (de)serializer - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::REPEATING_COMMAND_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::RESPAWN_ANCHOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * respawn_anchor_charge (IntTag) = 0, 1, 2, 3, 4 - */ - //}); - //$this->map(VanillaBlocks::SAND(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SAND()) - * TODO: implement (de)serializer - * sand_type (StringTag) = normal, red - */ - //}); - //$this->map(VanillaBlocks::SANDSTONE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SANDSTONE()) - * TODO: implement (de)serializer - * sand_stone_type (StringTag) = cut, default, heiroglyphs, smooth - */ - //}); - //$this->map(VanillaBlocks::SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SANDSTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::SAPLING(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * age_bit (ByteTag) = 0, 1 - * sapling_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::SCAFFOLDING(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - * stability_check (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SCULK_CATALYST(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * bloom (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SCULK_SENSOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SCULK_SHRIEKER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * active (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SCULK_VEIN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 - */ - //}); - //$this->map(VanillaBlocks::SEAGRASS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * sea_grass_type (StringTag) = default, double_bot, double_top - */ - //}); - //$this->map(VanillaBlocks::SEA_PICKLE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SEA_PICKLE()) - * TODO: implement (de)serializer - * cluster_count (IntTag) = 0, 1, 2, 3 - * dead_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SHULKER_BOX(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::DYED_SHULKER_BOX()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::SILVER_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::SKULL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::MOB_HEAD()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * no_drop_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SMALL_AMETHYST_BUD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::SMALL_DRIPLEAF_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SMOKER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SMOKER()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SMOOTH_QUARTZ_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SMOOTH_SANDSTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::SNOW_LAYER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SNOW_LAYER()) - * TODO: implement (de)serializer - * covered_bit (ByteTag) = 0, 1 - * height (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::SOUL_CAMPFIRE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * extinguished (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SOUL_FIRE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::SOUL_LANTERN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * hanging (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SOUL_TORCH(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::SPONGE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPONGE()) - * TODO: implement (de)serializer - * sponge_type (StringTag) = dry, wet - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_FENCE_GATE()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::SPRUCE_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SPRUCE_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::STAINED_GLASS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STAINED_GLASS()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::STAINED_GLASS_PANE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STAINED_GLASS_PANE()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::STAINED_HARDENED_CLAY(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STAINED_CLAY()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::STANDING_BANNER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::BANNER()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_SIGN()) - * TODO: implement (de)serializer - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::STICKYPISTONARMCOLLISION(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::STICKY_PISTON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::STONE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE()) - * TODO: implement (de)serializer - * stone_type (StringTag) = andesite, andesite_smooth, diorite, diorite_smooth, granite, granite_smooth, stone - */ - //}); - //$this->map(VanillaBlocks::STONEBRICK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_brick_type (StringTag) = chiseled, cracked, default, mossy, smooth - */ - //}); - //$this->map(VanillaBlocks::STONECUTTER_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::STONE_BRICK_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE_BRICK_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::STONE_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::STONE_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::STONE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STONE_SLAB()) - * TODO: implement (de)serializer - * stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::STONE_SLAB2(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::STONE_SLAB3(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::STONE_SLAB4(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::STONE_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::COBBLESTONE_STAIRS()) - * TODO: implement (de)serializer - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_ACACIA_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_ACACIA_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_BIRCH_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_BIRCH_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_CRIMSON_HYPHAE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_CRIMSON_STEM(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_DARK_OAK_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_DARK_OAK_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_JUNGLE_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_JUNGLE_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_OAK_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_OAK_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_SPRUCE_LOG(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::STRIPPED_SPRUCE_LOG()) - * TODO: implement (de)serializer - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_WARPED_HYPHAE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRIPPED_WARPED_STEM(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::STRUCTURE_BLOCK(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * structure_block_type (StringTag) = corner, data, export, invalid, load, save - */ - //}); - //$this->map(VanillaBlocks::STRUCTURE_VOID(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * structure_void_type (StringTag) = air, void - */ - //}); - //$this->map(VanillaBlocks::SWEET_BERRY_BUSH(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::SWEET_BERRY_BUSH()) - * TODO: implement (de)serializer - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::TALLGRASS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * tall_grass_type (StringTag) = default, fern, snow, tall - */ - //}); - //$this->map(VanillaBlocks::TNT(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::TNT()) - * TODO: implement (de)serializer - * allow_underwater_bit (ByteTag) = 0, 1 - * explode_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::TORCH(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::TORCH()) - * TODO: implement (de)serializer - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_TRAPDOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::TRAPPED_CHEST(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::TRAPPED_CHEST()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::TRIPWIRE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::TRIPWIRE()) - * TODO: implement (de)serializer - * attached_bit (ByteTag) = 0, 1 - * disarmed_bit (ByteTag) = 0, 1 - * powered_bit (ByteTag) = 0, 1 - * suspended_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::TRIPWIRE_HOOK(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::TRIPWIRE_HOOK()) - * TODO: implement (de)serializer - * attached_bit (ByteTag) = 0, 1 - * direction (IntTag) = 0, 1, 2, 3 - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::TURTLE_EGG(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * cracked_state (StringTag) = cracked, max_cracked, no_cracks - * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg - */ - //}); - //$this->map(VanillaBlocks::TWISTING_VINES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * twisting_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::UNDERWATER_TORCH(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::UNDERWATER_TORCH()) - * TODO: implement (de)serializer - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::UNLIT_REDSTONE_TORCH(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::REDSTONE_TORCH()) - * TODO: implement (de)serializer - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(VanillaBlocks::UNPOWERED_COMPARATOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::REDSTONE_COMPARATOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * output_lit_bit (ByteTag) = 0, 1 - * output_subtract_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::UNPOWERED_REPEATER(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * repeater_delay (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::VINE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * vine_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::WALL_BANNER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WALL_BANNER()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_WALL_SIGN()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WARPED_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WARPED_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WARPED_DOUBLE_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WARPED_FENCE_GATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WARPED_HYPHAE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::WARPED_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::WARPED_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WARPED_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WARPED_STANDING_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::WARPED_STEM(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(VanillaBlocks::WARPED_TRAPDOOR(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WARPED_WALL_SIGN(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WATER(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WATER()) - * TODO: implement (de)serializer - * liquid_depth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::WAXED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WAXED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_EXPOSED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_EXPOSED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_OXIDIZED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_OXIDIZED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_WEATHERED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WAXED_WEATHERED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WEATHERED_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WEATHERED_CUT_COPPER_STAIRS(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(VanillaBlocks::WEATHERED_DOUBLE_CUT_COPPER_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WEEPING_VINES(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * weeping_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(VanillaBlocks::WHEAT(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WHEAT()) - * TODO: implement (de)serializer - * growth (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - */ - //}); - //$this->map(VanillaBlocks::WHITE_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WHITE_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WHITE_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WOOD(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - * stripped_bit (ByteTag) = 0, 1 - * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::WOODEN_BUTTON(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_BUTTON()) - * TODO: implement (de)serializer - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(VanillaBlocks::WOODEN_DOOR(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_DOOR()) - * TODO: implement (de)serializer - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::WOODEN_PRESSURE_PLATE(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::OAK_PRESSURE_PLATE()) - * TODO: implement (de)serializer - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(VanillaBlocks::WOODEN_SLAB(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - */ - //}); - //$this->map(VanillaBlocks::WOOL(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::WOOL()) - * TODO: implement (de)serializer - * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - */ - //}); - //$this->map(VanillaBlocks::YELLOW_CANDLE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::YELLOW_CANDLE_CAKE(), function(Block $block) : BlockStateWriter{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), function(Block $block) : BlockStateWriter{ - /* - * This block is implemented (VanillaBlocks::YELLOW_GLAZED_TERRACOTTA()) - * TODO: implement (de)serializer - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); + $this->map(VanillaBlocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); + $this->map(VanillaBlocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); + $this->map(VanillaBlocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); + $this->map(VanillaBlocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); + $this->map(VanillaBlocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::ACACIA_STANDING_SIGN))); + $this->map(VanillaBlocks::ACACIA_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_ACACIA)); + $this->map(VanillaBlocks::ACACIA_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::ACACIA_STAIRS))); + $this->map(VanillaBlocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); + $this->map(VanillaBlocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); + $this->map(VanillaBlocks::ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ + return Writer::create(Ids::ACTIVATOR_RAIL) + ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isPowered()) + ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(VanillaBlocks::AIR(), fn() => new Writer(Ids::AIR)); + $this->map(VanillaBlocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); + $this->map(VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); + $this->map(VanillaBlocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); + $this->map(VanillaBlocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); + $this->map(VanillaBlocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); + $this->map(VanillaBlocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); + $this->map(VanillaBlocks::ANVIL(), function(Anvil $block) : Writer{ + return Writer::create(Ids::ANVIL) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeString(BlockStateNames::DAMAGE, match($damage = $block->getDamage()){ + 0 => StringValues::DAMAGE_UNDAMAGED, + 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, + 2 => StringValues::DAMAGE_VERY_DAMAGED, + default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), + }); + }); + $this->map(VanillaBlocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); + $this->map(VanillaBlocks::BAMBOO(), function(Bamboo $block) : Writer{ + return Writer::create(Ids::BAMBOO) + ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) + ->writeString(BlockStateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ + Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, + Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, + Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, + default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), + }) + ->writeString(BlockStateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); + }); + $this->map(VanillaBlocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ + return Writer::create(Ids::BAMBOO_SAPLING) + ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) + + //TODO: bug in MCPE + ->writeString(BlockStateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); + }); + $this->map(VanillaBlocks::BANNER(), function(FloorBanner $block) : Writer{ + return Writer::create(Ids::STANDING_BANNER) + ->writeInt(BlockStateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); + }); + $this->map(VanillaBlocks::BARREL(), function(Barrel $block) : Writer{ + return Writer::create(Ids::BARREL) + ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()) + ->writeFacingDirection($block->getFacing()); + }); + $this->map(VanillaBlocks::BARRIER(), fn() => new Writer(Ids::BARRIER)); + $this->map(VanillaBlocks::BEACON(), fn() => new Writer(Ids::BEACON)); + $this->map(VanillaBlocks::BED(), function(Bed $block) : Writer{ + return Writer::create(Ids::BED) + ->writeBool(BlockStateNames::HEAD_PIECE_BIT, $block->isHeadPart()) + ->writeBool(BlockStateNames::OCCUPIED_BIT, $block->isOccupied()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::BEDROCK(), function(Block $block) : Writer{ + return Writer::create(Ids::BEDROCK) + ->writeBool(BlockStateNames::INFINIBURN_BIT, $block->burnsForever()); + }); + $this->map(VanillaBlocks::BEETROOTS(), fn(Beetroot $block) => Helper::encodeCrops($block, new Writer(Ids::BEETROOT))); + $this->map(VanillaBlocks::BELL(), function(Bell $block) : Writer{ + return Writer::create(Ids::BELL) + ->writeBellAttachmentType($block->getAttachmentType()) + ->writeBool(BlockStateNames::TOGGLE_BIT, false) //we don't care about this; it's just to keep MCPE happy + ->writeLegacyHorizontalFacing($block->getFacing()); + + }); + $this->map(VanillaBlocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); + $this->map(VanillaBlocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); + $this->map(VanillaBlocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); + $this->map(VanillaBlocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); + $this->map(VanillaBlocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); + $this->map(VanillaBlocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); + $this->map(VanillaBlocks::BIRCH_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::BIRCH_STAIRS))); + $this->map(VanillaBlocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); + $this->map(VanillaBlocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); + $this->map(VanillaBlocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLACK_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); + $this->map(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLUE_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::BLUE_ICE(), fn() => new Writer(Ids::BLUE_ICE)); + $this->map(VanillaBlocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); + $this->map(VanillaBlocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(VanillaBlocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ + return Writer::create(Ids::BONE_BLOCK) + ->writeInt(BlockStateNames::DEPRECATED, 0) + ->writePillarAxis($block->getAxis()); + }); + $this->map(VanillaBlocks::BOOKSHELF(), fn() => new Writer(Ids::BOOKSHELF)); + $this->map(VanillaBlocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ + return Writer::create(Ids::BREWING_STAND) + ->writeBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) + ->writeBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())) + ->writeBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())); + }); + $this->map(VanillaBlocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); + $this->map(VanillaBlocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); + $this->map(VanillaBlocks::BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::BRICK_STAIRS))); + $this->map(VanillaBlocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); + $this->map(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BROWN_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); + $this->map(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); + $this->map(VanillaBlocks::CACTUS(), function(Cactus $block) : Writer{ + return Writer::create(Ids::CACTUS) + ->writeInt(BlockStateNames::AGE, $block->getAge()); + }); + $this->map(VanillaBlocks::CAKE(), function(Cake $block) : Writer{ + return Writer::create(Ids::CAKE) + ->writeInt(BlockStateNames::BITE_COUNTER, $block->getBites()); + }); + $this->map(VanillaBlocks::CARPET(), function(Carpet $block) : Writer{ + return Writer::create(Ids::CARPET) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); + $this->map(VanillaBlocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ + return Writer::create(Ids::CARVED_PUMPKIN) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::CHEMICAL_HEAT(), fn() => new Writer(Ids::CHEMICAL_HEAT)); + $this->map(VanillaBlocks::CHEST(), function(Chest $block) : Writer{ + return Writer::create(Ids::CHEST) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); + $this->map(VanillaBlocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(VanillaBlocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(VanillaBlocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); + $this->map(VanillaBlocks::CLAY(), fn() => new Writer(Ids::CLAY)); + $this->map(VanillaBlocks::COAL(), fn() => new Writer(Ids::COAL_BLOCK)); + $this->map(VanillaBlocks::COAL_ORE(), fn() => new Writer(Ids::COAL_ORE)); + $this->map(VanillaBlocks::COBBLESTONE(), fn() => new Writer(Ids::COBBLESTONE)); + $this->map(VanillaBlocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); + $this->map(VanillaBlocks::COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_STAIRS))); + $this->map(VanillaBlocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); + $this->map(VanillaBlocks::COBWEB(), fn() => new Writer(Ids::WEB)); + $this->map(VanillaBlocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ + return Writer::create(Ids::COCOA) + ->writeInt(BlockStateNames::AGE, $block->getAge()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(VanillaBlocks::CONCRETE(), function(Concrete $block) : Writer{ + return Writer::create(Ids::CONCRETE) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ + return Writer::create(Ids::CONCRETEPOWDER) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::CORAL(), function(Coral $block) : Writer{ + return Writer::create(Ids::CORAL) + ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeCoralType($block->getCoralType()); + }); + $this->map(VanillaBlocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ + return Writer::create(Ids::CORAL_BLOCK) + ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeCoralType($block->getCoralType()); + }); + $this->map(VanillaBlocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ + return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) + ->writeCoralType($block->getCoralType()) + ->writeInt(BlockStateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ + Axis::X => 0, + Axis::Z => 1, + default => throw new BlockStateSerializeException("Invalid axis {$axis}"), + }); + }); + $this->map(VanillaBlocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); + $this->map(VanillaBlocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); + $this->map(VanillaBlocks::CRAFTING_TABLE(), fn() => new Writer(Ids::CRAFTING_TABLE)); + $this->map(VanillaBlocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); + $this->map(VanillaBlocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(VanillaBlocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); + $this->map(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::CYAN_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::DANDELION(), fn() => new Writer(Ids::YELLOW_FLOWER)); + $this->map(VanillaBlocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); + $this->map(VanillaBlocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); + $this->map(VanillaBlocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); + $this->map(VanillaBlocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); + $this->map(VanillaBlocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); + $this->map(VanillaBlocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(VanillaBlocks::DARK_OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_OAK_STAIRS))); + $this->map(VanillaBlocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); + $this->map(VanillaBlocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); + $this->map(VanillaBlocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); + $this->map(VanillaBlocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); + $this->map(VanillaBlocks::DARK_PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_PRISMARINE_STAIRS))); + $this->map(VanillaBlocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ + return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) + ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + }); + $this->map(VanillaBlocks::DEAD_BUSH(), fn() => new Writer(Ids::DEADBUSH)); + $this->map(VanillaBlocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ + return Writer::create(Ids::DETECTOR_RAIL) + ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isActivated()) + ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(VanillaBlocks::DIAMOND(), fn() => new Writer(Ids::DIAMOND_BLOCK)); + $this->map(VanillaBlocks::DIAMOND_ORE(), fn() => new Writer(Ids::DIAMOND_ORE)); + $this->map(VanillaBlocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); + $this->map(VanillaBlocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); + $this->map(VanillaBlocks::DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DIORITE_STAIRS))); + $this->map(VanillaBlocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); + $this->map(VanillaBlocks::DIRT(), function(Dirt $block) : Writer{ + return Writer::create(Ids::DIRT) + ->writeString(BlockStateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); + }); + $this->map(VanillaBlocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::DRAGON_EGG(), fn() => new Writer(Ids::DRAGON_EGG)); + $this->map(VanillaBlocks::DRIED_KELP(), fn() => new Writer(Ids::DRIED_KELP_BLOCK)); + $this->map(VanillaBlocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ + return Writer::create(Ids::SHULKER_BOX) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::ELEMENT_ACTINIUM(), fn() => new Writer(Ids::ELEMENT_89)); + $this->map(VanillaBlocks::ELEMENT_ALUMINUM(), fn() => new Writer(Ids::ELEMENT_13)); + $this->map(VanillaBlocks::ELEMENT_AMERICIUM(), fn() => new Writer(Ids::ELEMENT_95)); + $this->map(VanillaBlocks::ELEMENT_ANTIMONY(), fn() => new Writer(Ids::ELEMENT_51)); + $this->map(VanillaBlocks::ELEMENT_ARGON(), fn() => new Writer(Ids::ELEMENT_18)); + $this->map(VanillaBlocks::ELEMENT_ARSENIC(), fn() => new Writer(Ids::ELEMENT_33)); + $this->map(VanillaBlocks::ELEMENT_ASTATINE(), fn() => new Writer(Ids::ELEMENT_85)); + $this->map(VanillaBlocks::ELEMENT_BARIUM(), fn() => new Writer(Ids::ELEMENT_56)); + $this->map(VanillaBlocks::ELEMENT_BERKELIUM(), fn() => new Writer(Ids::ELEMENT_97)); + $this->map(VanillaBlocks::ELEMENT_BERYLLIUM(), fn() => new Writer(Ids::ELEMENT_4)); + $this->map(VanillaBlocks::ELEMENT_BISMUTH(), fn() => new Writer(Ids::ELEMENT_83)); + $this->map(VanillaBlocks::ELEMENT_BOHRIUM(), fn() => new Writer(Ids::ELEMENT_107)); + $this->map(VanillaBlocks::ELEMENT_BORON(), fn() => new Writer(Ids::ELEMENT_5)); + $this->map(VanillaBlocks::ELEMENT_BROMINE(), fn() => new Writer(Ids::ELEMENT_35)); + $this->map(VanillaBlocks::ELEMENT_CADMIUM(), fn() => new Writer(Ids::ELEMENT_48)); + $this->map(VanillaBlocks::ELEMENT_CALCIUM(), fn() => new Writer(Ids::ELEMENT_20)); + $this->map(VanillaBlocks::ELEMENT_CALIFORNIUM(), fn() => new Writer(Ids::ELEMENT_98)); + $this->map(VanillaBlocks::ELEMENT_CARBON(), fn() => new Writer(Ids::ELEMENT_6)); + $this->map(VanillaBlocks::ELEMENT_CERIUM(), fn() => new Writer(Ids::ELEMENT_58)); + $this->map(VanillaBlocks::ELEMENT_CESIUM(), fn() => new Writer(Ids::ELEMENT_55)); + $this->map(VanillaBlocks::ELEMENT_CHLORINE(), fn() => new Writer(Ids::ELEMENT_17)); + $this->map(VanillaBlocks::ELEMENT_CHROMIUM(), fn() => new Writer(Ids::ELEMENT_24)); + $this->map(VanillaBlocks::ELEMENT_COBALT(), fn() => new Writer(Ids::ELEMENT_27)); + $this->map(VanillaBlocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(VanillaBlocks::ELEMENT_COPERNICIUM(), fn() => new Writer(Ids::ELEMENT_112)); + $this->map(VanillaBlocks::ELEMENT_COPPER(), fn() => new Writer(Ids::ELEMENT_29)); + $this->map(VanillaBlocks::ELEMENT_CURIUM(), fn() => new Writer(Ids::ELEMENT_96)); + $this->map(VanillaBlocks::ELEMENT_DARMSTADTIUM(), fn() => new Writer(Ids::ELEMENT_110)); + $this->map(VanillaBlocks::ELEMENT_DUBNIUM(), fn() => new Writer(Ids::ELEMENT_105)); + $this->map(VanillaBlocks::ELEMENT_DYSPROSIUM(), fn() => new Writer(Ids::ELEMENT_66)); + $this->map(VanillaBlocks::ELEMENT_EINSTEINIUM(), fn() => new Writer(Ids::ELEMENT_99)); + $this->map(VanillaBlocks::ELEMENT_ERBIUM(), fn() => new Writer(Ids::ELEMENT_68)); + $this->map(VanillaBlocks::ELEMENT_EUROPIUM(), fn() => new Writer(Ids::ELEMENT_63)); + $this->map(VanillaBlocks::ELEMENT_FERMIUM(), fn() => new Writer(Ids::ELEMENT_100)); + $this->map(VanillaBlocks::ELEMENT_FLEROVIUM(), fn() => new Writer(Ids::ELEMENT_114)); + $this->map(VanillaBlocks::ELEMENT_FLUORINE(), fn() => new Writer(Ids::ELEMENT_9)); + $this->map(VanillaBlocks::ELEMENT_FRANCIUM(), fn() => new Writer(Ids::ELEMENT_87)); + $this->map(VanillaBlocks::ELEMENT_GADOLINIUM(), fn() => new Writer(Ids::ELEMENT_64)); + $this->map(VanillaBlocks::ELEMENT_GALLIUM(), fn() => new Writer(Ids::ELEMENT_31)); + $this->map(VanillaBlocks::ELEMENT_GERMANIUM(), fn() => new Writer(Ids::ELEMENT_32)); + $this->map(VanillaBlocks::ELEMENT_GOLD(), fn() => new Writer(Ids::ELEMENT_79)); + $this->map(VanillaBlocks::ELEMENT_HAFNIUM(), fn() => new Writer(Ids::ELEMENT_72)); + $this->map(VanillaBlocks::ELEMENT_HASSIUM(), fn() => new Writer(Ids::ELEMENT_108)); + $this->map(VanillaBlocks::ELEMENT_HELIUM(), fn() => new Writer(Ids::ELEMENT_2)); + $this->map(VanillaBlocks::ELEMENT_HOLMIUM(), fn() => new Writer(Ids::ELEMENT_67)); + $this->map(VanillaBlocks::ELEMENT_HYDROGEN(), fn() => new Writer(Ids::ELEMENT_1)); + $this->map(VanillaBlocks::ELEMENT_INDIUM(), fn() => new Writer(Ids::ELEMENT_49)); + $this->map(VanillaBlocks::ELEMENT_IODINE(), fn() => new Writer(Ids::ELEMENT_53)); + $this->map(VanillaBlocks::ELEMENT_IRIDIUM(), fn() => new Writer(Ids::ELEMENT_77)); + $this->map(VanillaBlocks::ELEMENT_IRON(), fn() => new Writer(Ids::ELEMENT_26)); + $this->map(VanillaBlocks::ELEMENT_KRYPTON(), fn() => new Writer(Ids::ELEMENT_36)); + $this->map(VanillaBlocks::ELEMENT_LANTHANUM(), fn() => new Writer(Ids::ELEMENT_57)); + $this->map(VanillaBlocks::ELEMENT_LAWRENCIUM(), fn() => new Writer(Ids::ELEMENT_103)); + $this->map(VanillaBlocks::ELEMENT_LEAD(), fn() => new Writer(Ids::ELEMENT_82)); + $this->map(VanillaBlocks::ELEMENT_LITHIUM(), fn() => new Writer(Ids::ELEMENT_3)); + $this->map(VanillaBlocks::ELEMENT_LIVERMORIUM(), fn() => new Writer(Ids::ELEMENT_116)); + $this->map(VanillaBlocks::ELEMENT_LUTETIUM(), fn() => new Writer(Ids::ELEMENT_71)); + $this->map(VanillaBlocks::ELEMENT_MAGNESIUM(), fn() => new Writer(Ids::ELEMENT_12)); + $this->map(VanillaBlocks::ELEMENT_MANGANESE(), fn() => new Writer(Ids::ELEMENT_25)); + $this->map(VanillaBlocks::ELEMENT_MEITNERIUM(), fn() => new Writer(Ids::ELEMENT_109)); + $this->map(VanillaBlocks::ELEMENT_MENDELEVIUM(), fn() => new Writer(Ids::ELEMENT_101)); + $this->map(VanillaBlocks::ELEMENT_MERCURY(), fn() => new Writer(Ids::ELEMENT_80)); + $this->map(VanillaBlocks::ELEMENT_MOLYBDENUM(), fn() => new Writer(Ids::ELEMENT_42)); + $this->map(VanillaBlocks::ELEMENT_MOSCOVIUM(), fn() => new Writer(Ids::ELEMENT_115)); + $this->map(VanillaBlocks::ELEMENT_NEODYMIUM(), fn() => new Writer(Ids::ELEMENT_60)); + $this->map(VanillaBlocks::ELEMENT_NEON(), fn() => new Writer(Ids::ELEMENT_10)); + $this->map(VanillaBlocks::ELEMENT_NEPTUNIUM(), fn() => new Writer(Ids::ELEMENT_93)); + $this->map(VanillaBlocks::ELEMENT_NICKEL(), fn() => new Writer(Ids::ELEMENT_28)); + $this->map(VanillaBlocks::ELEMENT_NIHONIUM(), fn() => new Writer(Ids::ELEMENT_113)); + $this->map(VanillaBlocks::ELEMENT_NIOBIUM(), fn() => new Writer(Ids::ELEMENT_41)); + $this->map(VanillaBlocks::ELEMENT_NITROGEN(), fn() => new Writer(Ids::ELEMENT_7)); + $this->map(VanillaBlocks::ELEMENT_NOBELIUM(), fn() => new Writer(Ids::ELEMENT_102)); + $this->map(VanillaBlocks::ELEMENT_OGANESSON(), fn() => new Writer(Ids::ELEMENT_118)); + $this->map(VanillaBlocks::ELEMENT_OSMIUM(), fn() => new Writer(Ids::ELEMENT_76)); + $this->map(VanillaBlocks::ELEMENT_OXYGEN(), fn() => new Writer(Ids::ELEMENT_8)); + $this->map(VanillaBlocks::ELEMENT_PALLADIUM(), fn() => new Writer(Ids::ELEMENT_46)); + $this->map(VanillaBlocks::ELEMENT_PHOSPHORUS(), fn() => new Writer(Ids::ELEMENT_15)); + $this->map(VanillaBlocks::ELEMENT_PLATINUM(), fn() => new Writer(Ids::ELEMENT_78)); + $this->map(VanillaBlocks::ELEMENT_PLUTONIUM(), fn() => new Writer(Ids::ELEMENT_94)); + $this->map(VanillaBlocks::ELEMENT_POLONIUM(), fn() => new Writer(Ids::ELEMENT_84)); + $this->map(VanillaBlocks::ELEMENT_POTASSIUM(), fn() => new Writer(Ids::ELEMENT_19)); + $this->map(VanillaBlocks::ELEMENT_PRASEODYMIUM(), fn() => new Writer(Ids::ELEMENT_59)); + $this->map(VanillaBlocks::ELEMENT_PROMETHIUM(), fn() => new Writer(Ids::ELEMENT_61)); + $this->map(VanillaBlocks::ELEMENT_PROTACTINIUM(), fn() => new Writer(Ids::ELEMENT_91)); + $this->map(VanillaBlocks::ELEMENT_RADIUM(), fn() => new Writer(Ids::ELEMENT_88)); + $this->map(VanillaBlocks::ELEMENT_RADON(), fn() => new Writer(Ids::ELEMENT_86)); + $this->map(VanillaBlocks::ELEMENT_RHENIUM(), fn() => new Writer(Ids::ELEMENT_75)); + $this->map(VanillaBlocks::ELEMENT_RHODIUM(), fn() => new Writer(Ids::ELEMENT_45)); + $this->map(VanillaBlocks::ELEMENT_ROENTGENIUM(), fn() => new Writer(Ids::ELEMENT_111)); + $this->map(VanillaBlocks::ELEMENT_RUBIDIUM(), fn() => new Writer(Ids::ELEMENT_37)); + $this->map(VanillaBlocks::ELEMENT_RUTHENIUM(), fn() => new Writer(Ids::ELEMENT_44)); + $this->map(VanillaBlocks::ELEMENT_RUTHERFORDIUM(), fn() => new Writer(Ids::ELEMENT_104)); + $this->map(VanillaBlocks::ELEMENT_SAMARIUM(), fn() => new Writer(Ids::ELEMENT_62)); + $this->map(VanillaBlocks::ELEMENT_SCANDIUM(), fn() => new Writer(Ids::ELEMENT_21)); + $this->map(VanillaBlocks::ELEMENT_SEABORGIUM(), fn() => new Writer(Ids::ELEMENT_106)); + $this->map(VanillaBlocks::ELEMENT_SELENIUM(), fn() => new Writer(Ids::ELEMENT_34)); + $this->map(VanillaBlocks::ELEMENT_SILICON(), fn() => new Writer(Ids::ELEMENT_14)); + $this->map(VanillaBlocks::ELEMENT_SILVER(), fn() => new Writer(Ids::ELEMENT_47)); + $this->map(VanillaBlocks::ELEMENT_SODIUM(), fn() => new Writer(Ids::ELEMENT_11)); + $this->map(VanillaBlocks::ELEMENT_STRONTIUM(), fn() => new Writer(Ids::ELEMENT_38)); + $this->map(VanillaBlocks::ELEMENT_SULFUR(), fn() => new Writer(Ids::ELEMENT_16)); + $this->map(VanillaBlocks::ELEMENT_TANTALUM(), fn() => new Writer(Ids::ELEMENT_73)); + $this->map(VanillaBlocks::ELEMENT_TECHNETIUM(), fn() => new Writer(Ids::ELEMENT_43)); + $this->map(VanillaBlocks::ELEMENT_TELLURIUM(), fn() => new Writer(Ids::ELEMENT_52)); + $this->map(VanillaBlocks::ELEMENT_TENNESSINE(), fn() => new Writer(Ids::ELEMENT_117)); + $this->map(VanillaBlocks::ELEMENT_TERBIUM(), fn() => new Writer(Ids::ELEMENT_65)); + $this->map(VanillaBlocks::ELEMENT_THALLIUM(), fn() => new Writer(Ids::ELEMENT_81)); + $this->map(VanillaBlocks::ELEMENT_THORIUM(), fn() => new Writer(Ids::ELEMENT_90)); + $this->map(VanillaBlocks::ELEMENT_THULIUM(), fn() => new Writer(Ids::ELEMENT_69)); + $this->map(VanillaBlocks::ELEMENT_TIN(), fn() => new Writer(Ids::ELEMENT_50)); + $this->map(VanillaBlocks::ELEMENT_TITANIUM(), fn() => new Writer(Ids::ELEMENT_22)); + $this->map(VanillaBlocks::ELEMENT_TUNGSTEN(), fn() => new Writer(Ids::ELEMENT_74)); + $this->map(VanillaBlocks::ELEMENT_URANIUM(), fn() => new Writer(Ids::ELEMENT_92)); + $this->map(VanillaBlocks::ELEMENT_VANADIUM(), fn() => new Writer(Ids::ELEMENT_23)); + $this->map(VanillaBlocks::ELEMENT_XENON(), fn() => new Writer(Ids::ELEMENT_54)); + $this->map(VanillaBlocks::ELEMENT_YTTERBIUM(), fn() => new Writer(Ids::ELEMENT_70)); + $this->map(VanillaBlocks::ELEMENT_YTTRIUM(), fn() => new Writer(Ids::ELEMENT_39)); + $this->map(VanillaBlocks::ELEMENT_ZERO(), fn() => new Writer(Ids::ELEMENT_0)); + $this->map(VanillaBlocks::ELEMENT_ZINC(), fn() => new Writer(Ids::ELEMENT_30)); + $this->map(VanillaBlocks::ELEMENT_ZIRCONIUM(), fn() => new Writer(Ids::ELEMENT_40)); + $this->map(VanillaBlocks::EMERALD(), fn() => new Writer(Ids::EMERALD_BLOCK)); + $this->map(VanillaBlocks::EMERALD_ORE(), fn() => new Writer(Ids::EMERALD_ORE)); + $this->map(VanillaBlocks::ENCHANTING_TABLE(), fn() => new Writer(Ids::ENCHANTING_TABLE)); + $this->map(VanillaBlocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ + return Writer::create(Ids::ENDER_CHEST) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::END_PORTAL_FRAME(), function(EndPortalFrame $block) : Writer{ + return Writer::create(Ids::END_PORTAL_FRAME) + ->writeBool(BlockStateNames::END_PORTAL_EYE_BIT, $block->hasEye()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::END_ROD(), function(EndRod $block) : Writer{ + //TODO: not sure if this needs down/up to be flipped like legacy metadata? + return Writer::create(Ids::END_ROD) + ->writeFacingDirection($block->getFacing()); + }); + $this->map(VanillaBlocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); + $this->map(VanillaBlocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); + $this->map(VanillaBlocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); + $this->map(VanillaBlocks::END_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::END_BRICK_STAIRS))); + $this->map(VanillaBlocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); + $this->map(VanillaBlocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_WOOD)); + $this->map(VanillaBlocks::FARMLAND(), function(Farmland $block) : Writer{ + return Writer::create(Ids::FARMLAND) + ->writeInt(BlockStateNames::MOISTURIZED_AMOUNT, $block->getWetness()); + }); + $this->map(VanillaBlocks::FERN(), fn() => Writer::create(Ids::TALLGRASS) + ->writeString(BlockStateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_FERN)); + $this->map(VanillaBlocks::FIRE(), function(Fire $block) : Writer{ + return Writer::create(Ids::FIRE) + ->writeInt(BlockStateNames::AGE, $block->getAge()); + }); + $this->map(VanillaBlocks::FLETCHING_TABLE(), fn() => new Writer(Ids::FLETCHING_TABLE)); + $this->map(VanillaBlocks::FLOWER_POT(), function() : Writer{ + return Writer::create(Ids::FLOWER_POT) + ->writeBool(BlockStateNames::UPDATE_BIT, true); //to keep MCPE happy + }); + $this->map(VanillaBlocks::FROSTED_ICE(), function(FrostedIce $block) : Writer{ + return Writer::create(Ids::FROSTED_ICE) + ->writeInt(BlockStateNames::AGE, $block->getAge()); + }); + $this->map(VanillaBlocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); + $this->map(VanillaBlocks::GLASS(), fn() => new Writer(Ids::GLASS)); + $this->map(VanillaBlocks::GLASS_PANE(), fn() => new Writer(Ids::GLASS_PANE)); + $this->map(VanillaBlocks::GLOWING_OBSIDIAN(), fn() => new Writer(Ids::GLOWINGOBSIDIAN)); + $this->map(VanillaBlocks::GLOWSTONE(), fn() => new Writer(Ids::GLOWSTONE)); + $this->map(VanillaBlocks::GOLD(), fn() => new Writer(Ids::GOLD_BLOCK)); + $this->map(VanillaBlocks::GOLD_ORE(), fn() => new Writer(Ids::GOLD_ORE)); + $this->map(VanillaBlocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); + $this->map(VanillaBlocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); + $this->map(VanillaBlocks::GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::GRANITE_STAIRS))); + $this->map(VanillaBlocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); + $this->map(VanillaBlocks::GRASS(), fn() => new Writer(Ids::GRASS)); + $this->map(VanillaBlocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); + $this->map(VanillaBlocks::GRAVEL(), fn() => new Writer(Ids::GRAVEL)); + $this->map(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GRAY_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GREEN_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(VanillaBlocks::HARDENED_CLAY(), fn() => new Writer(Ids::HARDENED_CLAY)); + $this->map(VanillaBlocks::HARDENED_GLASS(), fn() => new Writer(Ids::HARD_GLASS)); + $this->map(VanillaBlocks::HARDENED_GLASS_PANE(), fn() => new Writer(Ids::HARD_GLASS_PANE)); + $this->map(VanillaBlocks::HAY_BALE(), function(HayBale $block) : Writer{ + return Writer::create(Ids::HAY_BLOCK) + ->writeInt(BlockStateNames::DEPRECATED, 0) + ->writePillarAxis($block->getAxis()); + }); + $this->map(VanillaBlocks::HOPPER(), function(Hopper $block) : Writer{ + return Writer::create(Ids::HOPPER) + ->writeBool(BlockStateNames::TOGGLE_BIT, $block->isPowered()) + ->writeFacingWithoutUp($block->getFacing()); + }); + $this->map(VanillaBlocks::ICE(), fn() => new Writer(Ids::ICE)); + $this->map(VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); + $this->map(VanillaBlocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE)); + $this->map(VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK)); + $this->map(VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK)); + $this->map(VanillaBlocks::INFESTED_STONE(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); + $this->map(VanillaBlocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); + $this->map(VanillaBlocks::INFO_UPDATE(), fn() => new Writer(Ids::INFO_UPDATE)); + $this->map(VanillaBlocks::INFO_UPDATE2(), fn() => new Writer(Ids::INFO_UPDATE2)); + $this->map(VanillaBlocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLEBEDROCK)); + $this->map(VanillaBlocks::IRON(), fn() => new Writer(Ids::IRON_BLOCK)); + $this->map(VanillaBlocks::IRON_BARS(), fn() => new Writer(Ids::IRON_BARS)); + $this->map(VanillaBlocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); + $this->map(VanillaBlocks::IRON_ORE(), fn() => new Writer(Ids::IRON_ORE)); + $this->map(VanillaBlocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); + $this->map(VanillaBlocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ + return Writer::create(Ids::FRAME) + ->writeBool(BlockStateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) + ->writeBool(BlockStateNames::ITEM_FRAME_PHOTO_BIT, false) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::JUKEBOX(), fn() => new Writer(Ids::JUKEBOX)); + $this->map(VanillaBlocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); + $this->map(VanillaBlocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); + $this->map(VanillaBlocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); + $this->map(VanillaBlocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); + $this->map(VanillaBlocks::JUNGLE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::JUNGLE_STANDING_SIGN))); + $this->map(VanillaBlocks::JUNGLE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(VanillaBlocks::JUNGLE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::JUNGLE_STAIRS))); + $this->map(VanillaBlocks::JUNGLE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::JUNGLE_TRAPDOOR))); + $this->map(VanillaBlocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); + $this->map(VanillaBlocks::JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(VanillaBlocks::LADDER(), function(Ladder $block) : Writer{ + return Writer::create(Ids::LADDER) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::LANTERN(), function(Lantern $block) : Writer{ + return Writer::create(Ids::LANTERN) + ->writeBool(BlockStateNames::HANGING, $block->isHanging()); + }); + $this->map(VanillaBlocks::LAPIS_LAZULI(), fn() => new Writer(Ids::LAPIS_BLOCK)); + $this->map(VanillaBlocks::LAPIS_LAZULI_ORE(), fn() => new Writer(Ids::LAPIS_ORE)); + $this->map(VanillaBlocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); + $this->map(VanillaBlocks::LECTERN(), function(Lectern $block) : Writer{ + return Writer::create(Ids::LECTERN) + ->writeBool(BlockStateNames::POWERED_BIT, $block->isProducingSignal()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::LEGACY_STONECUTTER(), fn() => new Writer(Ids::STONECUTTER)); + $this->map(VanillaBlocks::LEVER(), function(Lever $block) : Writer{ + return Writer::create(Ids::LEVER) + ->writeBool(BlockStateNames::OPEN_BIT, $block->isActivated()) + ->writeString(BlockStateNames::LEVER_DIRECTION, match($block->getFacing()->id()){ + LeverFacing::DOWN_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, + LeverFacing::DOWN_AXIS_X()->id() => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, + LeverFacing::UP_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, + LeverFacing::UP_AXIS_X()->id() => StringValues::LEVER_DIRECTION_UP_EAST_WEST, + LeverFacing::NORTH()->id() => StringValues::LEVER_DIRECTION_NORTH, + LeverFacing::SOUTH()->id() => StringValues::LEVER_DIRECTION_SOUTH, + LeverFacing::WEST()->id() => StringValues::LEVER_DIRECTION_WEST, + LeverFacing::EAST()->id() => StringValues::LEVER_DIRECTION_EAST, + default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), + }); + }); + $this->map(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::SILVER_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); + $this->map(VanillaBlocks::LILY_PAD(), fn() => new Writer(Ids::WATERLILY)); + $this->map(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIME_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ + return Writer::create(Ids::LIT_PUMPKIN) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::LOOM(), function(Loom $block) : Writer{ + return Writer::create(Ids::LOOM) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::MAGENTA_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::MAGMA(), fn() => new Writer(Ids::MAGMA)); + $this->map(VanillaBlocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(VanillaBlocks::MELON(), fn() => new Writer(Ids::MELON_BLOCK)); + $this->map(VanillaBlocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); + $this->map(VanillaBlocks::MOB_HEAD(), function(Skull $block) : Writer{ + return Writer::create(Ids::SKULL) + ->writeBool(BlockStateNames::NO_DROP_BIT, $block->isNoDrops()) + ->writeFacingWithoutDown($block->getFacing()); + }); + $this->map(VanillaBlocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); + $this->map(VanillaBlocks::MOSSY_COBBLESTONE(), fn() => new Writer(Ids::MOSSY_COBBLESTONE)); + $this->map(VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); + $this->map(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_COBBLESTONE_STAIRS))); + $this->map(VanillaBlocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); + $this->map(VanillaBlocks::MOSSY_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_MOSSY)); + $this->map(VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); + $this->map(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_STONE_BRICK_STAIRS))); + $this->map(VanillaBlocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); + $this->map(VanillaBlocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); + $this->map(VanillaBlocks::MYCELIUM(), fn() => new Writer(Ids::MYCELIUM)); + $this->map(VanillaBlocks::NETHERRACK(), fn() => new Writer(Ids::NETHERRACK)); + $this->map(VanillaBlocks::NETHER_BRICKS(), fn() => new Writer(Ids::NETHER_BRICK)); + $this->map(VanillaBlocks::NETHER_BRICK_FENCE(), fn() => new Writer(Ids::NETHER_BRICK_FENCE)); + $this->map(VanillaBlocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); + $this->map(VanillaBlocks::NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NETHER_BRICK_STAIRS))); + $this->map(VanillaBlocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); + $this->map(VanillaBlocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ + return Writer::create(Ids::PORTAL) + ->writeString(BlockStateNames::PORTAL_AXIS, match($block->getAxis()){ + Axis::X => StringValues::PORTAL_AXIS_X, + Axis::Z => StringValues::PORTAL_AXIS_Z, + default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), + }); + }); + $this->map(VanillaBlocks::NETHER_QUARTZ_ORE(), fn() => new Writer(Ids::QUARTZ_ORE)); + $this->map(VanillaBlocks::NETHER_REACTOR_CORE(), fn() => new Writer(Ids::NETHERREACTOR)); + $this->map(VanillaBlocks::NETHER_WART(), function(NetherWartPlant $block) : Writer{ + return Writer::create(Ids::NETHER_WART) + ->writeInt(BlockStateNames::AGE, $block->getAge()); + }); + $this->map(VanillaBlocks::NETHER_WART_BLOCK(), fn() => new Writer(Ids::NETHER_WART_BLOCK)); + $this->map(VanillaBlocks::NOTE_BLOCK(), fn() => new Writer(Ids::NOTEBLOCK)); + $this->map(VanillaBlocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); + $this->map(VanillaBlocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); + $this->map(VanillaBlocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); + $this->map(VanillaBlocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); + $this->map(VanillaBlocks::OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::STANDING_SIGN))); + $this->map(VanillaBlocks::OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_OAK)); + $this->map(VanillaBlocks::OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::OAK_STAIRS))); + $this->map(VanillaBlocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); + $this->map(VanillaBlocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); + $this->map(VanillaBlocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::OBSIDIAN(), fn() => new Writer(Ids::OBSIDIAN)); + $this->map(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::ORANGE_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); + $this->map(VanillaBlocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); + $this->map(VanillaBlocks::PACKED_ICE(), fn() => new Writer(Ids::PACKED_ICE)); + $this->map(VanillaBlocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PINK_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); + $this->map(VanillaBlocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); + $this->map(VanillaBlocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); + $this->map(VanillaBlocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); + $this->map(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_ANDESITE_STAIRS))); + $this->map(VanillaBlocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); + $this->map(VanillaBlocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); + $this->map(VanillaBlocks::POLISHED_DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_DIORITE_STAIRS))); + $this->map(VanillaBlocks::POLISHED_GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE_SMOOTH)); + $this->map(VanillaBlocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); + $this->map(VanillaBlocks::POLISHED_GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_GRANITE_STAIRS))); + $this->map(VanillaBlocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); + $this->map(VanillaBlocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); + $this->map(VanillaBlocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ + return Writer::create(Ids::GOLDEN_RAIL) + ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isPowered()) + ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(VanillaBlocks::PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT)); + $this->map(VanillaBlocks::PRISMARINE_BRICKS(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_BRICKS)); + $this->map(VanillaBlocks::PRISMARINE_BRICKS_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK)); + $this->map(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_BRICKS_STAIRS))); + $this->map(VanillaBlocks::PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH)); + $this->map(VanillaBlocks::PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_STAIRS))); + $this->map(VanillaBlocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); + $this->map(VanillaBlocks::PUMPKIN(), function() : Writer{ + return Writer::create(Ids::PUMPKIN) + ->writeLegacyHorizontalFacing(Facing::SOUTH); //no longer used + }); + $this->map(VanillaBlocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); + $this->map(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PURPLE_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(VanillaBlocks::PURPUR(), function() : Writer{ + return Writer::create(Ids::PURPUR_BLOCK) + ->writeString(BlockStateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_DEFAULT) + ->writePillarAxis(Axis::Y); //useless, but MCPE wants it + }); + $this->map(VanillaBlocks::PURPUR_PILLAR(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::PURPUR_BLOCK) + ->writeString(BlockStateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_LINES) + ->writePillarAxis($block->getAxis()); + }); + $this->map(VanillaBlocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); + $this->map(VanillaBlocks::PURPUR_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PURPUR_STAIRS))); + $this->map(VanillaBlocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); + $this->map(VanillaBlocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); + $this->map(VanillaBlocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); + $this->map(VanillaBlocks::QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::QUARTZ_STAIRS))); + $this->map(VanillaBlocks::RAIL(), function(Rail $block) : Writer{ + return Writer::create(Ids::RAIL) + ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(VanillaBlocks::REDSTONE(), fn() => new Writer(Ids::REDSTONE_BLOCK)); + $this->map(VanillaBlocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : BlockStateWriter{ + return BlockStateWriter::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) + ->writeBool(BlockStateNames::OUTPUT_LIT_BIT, $block->isPowered()) + ->writeBool(BlockStateNames::OUTPUT_SUBTRACT_BIT, $block->isSubtractMode()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::REDSTONE_LAMP(), fn(RedstoneLamp $block) => new Writer($block->isPowered() ? Ids::LIT_REDSTONE_LAMP : Ids::REDSTONE_LAMP)); + $this->map(VanillaBlocks::REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_REDSTONE_ORE : Ids::REDSTONE_ORE)); + $this->map(VanillaBlocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : BlockStateWriter{ + return Writer::create($block->isPowered() ? Ids::POWERED_REPEATER : Ids::UNPOWERED_REPEATER) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeInt(BlockStateNames::REPEATER_DELAY, $block->getDelay() - 1); + }); + $this->map(VanillaBlocks::REDSTONE_TORCH(), function(RedstoneTorch $block) : Writer{ + return Writer::create($block->isLit() ? Ids::REDSTONE_TORCH : Ids::UNLIT_REDSTONE_TORCH) + ->writeTorchFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::REDSTONE_WIRE(), function(RedstoneWire $block) : Writer{ + return Writer::create(Ids::REDSTONE_WIRE) + ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + }); + $this->map(VanillaBlocks::RED_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::RED_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::RED_MUSHROOM(), fn() => new Writer(Ids::RED_MUSHROOM)); + $this->map(VanillaBlocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); + $this->map(VanillaBlocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); + $this->map(VanillaBlocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); + $this->map(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_NETHER_BRICK_STAIRS))); + $this->map(VanillaBlocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); + $this->map(VanillaBlocks::RED_SAND(), fn() => Writer::create(Ids::SAND) + ->writeString(BlockStateNames::SAND_TYPE, StringValues::SAND_TYPE_RED)); + $this->map(VanillaBlocks::RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); + $this->map(VanillaBlocks::RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE)); + $this->map(VanillaBlocks::RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_SANDSTONE_STAIRS))); + $this->map(VanillaBlocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); + $this->map(VanillaBlocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(VanillaBlocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); + $this->map(VanillaBlocks::RESERVED6(), fn() => new Writer(Ids::RESERVED6)); + $this->map(VanillaBlocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::SAND(), fn() => Writer::create(Ids::SAND) + ->writeString(BlockStateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); + $this->map(VanillaBlocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); + $this->map(VanillaBlocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); + $this->map(VanillaBlocks::SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SANDSTONE_STAIRS))); + $this->map(VanillaBlocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); + $this->map(VanillaBlocks::SEA_LANTERN(), fn() => new Writer(Ids::SEALANTERN)); + $this->map(VanillaBlocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ + return Writer::create(Ids::SEA_PICKLE) + ->writeBool(BlockStateNames::DEAD_BIT, !$block->isUnderwater()) + ->writeInt(BlockStateNames::CLUSTER_COUNT, $block->getCount() - 1); + }); + $this->map(VanillaBlocks::SHULKER_BOX(), fn() => new Writer(Ids::UNDYED_SHULKER_BOX)); + $this->map(VanillaBlocks::SLIME(), fn() => new Writer(Ids::SLIME)); + $this->map(VanillaBlocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); + $this->map(VanillaBlocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); + $this->map(VanillaBlocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); + $this->map(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_QUARTZ_STAIRS))); + $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); + $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE)); + $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_RED_SANDSTONE_STAIRS))); + $this->map(VanillaBlocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); + $this->map(VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); + $this->map(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_SANDSTONE_STAIRS))); + $this->map(VanillaBlocks::SMOOTH_STONE(), fn() => new Writer(Ids::SMOOTH_STONE)); + $this->map(VanillaBlocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); + $this->map(VanillaBlocks::SNOW(), fn() => new Writer(Ids::SNOW)); + $this->map(VanillaBlocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ + return Writer::create(Ids::SNOW_LAYER) + ->writeBool(BlockStateNames::COVERED_BIT, false) + ->writeInt(BlockStateNames::HEIGHT, $block->getLayers() - 1); + }); + $this->map(VanillaBlocks::SOUL_SAND(), fn() => new Writer(Ids::SOUL_SAND)); + $this->map(VanillaBlocks::SPONGE(), function(Sponge $block) : Writer{ + return Writer::create(Ids::SPONGE) + ->writeString(BlockStateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); + }); + $this->map(VanillaBlocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); + $this->map(VanillaBlocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); + $this->map(VanillaBlocks::SPRUCE_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); + $this->map(VanillaBlocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); + $this->map(VanillaBlocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::SPRUCE_STANDING_SIGN))); + $this->map(VanillaBlocks::SPRUCE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(VanillaBlocks::SPRUCE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::SPRUCE_STAIRS))); + $this->map(VanillaBlocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); + $this->map(VanillaBlocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); + $this->map(VanillaBlocks::SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STAINED_CLAY(), function(StainedHardenedClay $block) : Writer{ + return Writer::create(Ids::STAINED_HARDENED_CLAY) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::STAINED_GLASS(), function(StainedGlass $block) : Writer{ + return Writer::create(Ids::STAINED_GLASS) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::STAINED_GLASS_PANE(), function(StainedGlassPane $block) : Writer{ + return Writer::create(Ids::STAINED_GLASS_PANE) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::STAINED_HARDENED_GLASS(), function(StainedHardenedGlass $block) : Writer{ + return Writer::create(Ids::HARD_STAINED_GLASS) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::STAINED_HARDENED_GLASS_PANE(), function(StainedHardenedGlassPane $block) : Writer{ + return Writer::create(Ids::HARD_STAINED_GLASS_PANE) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); + $this->map(VanillaBlocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); + $this->map(VanillaBlocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); + $this->map(VanillaBlocks::STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_BRICK_STAIRS))); + $this->map(VanillaBlocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); + $this->map(VanillaBlocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); + $this->map(VanillaBlocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); + $this->map(VanillaBlocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); + $this->map(VanillaBlocks::STONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NORMAL_STONE_STAIRS))); + $this->map(VanillaBlocks::STRIPPED_ACACIA_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_ACACIA_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STRIPPED_BIRCH_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_BIRCH_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STRIPPED_DARK_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_DARK_OAK_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STRIPPED_JUNGLE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_JUNGLE_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STRIPPED_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_OAK_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::STRIPPED_SPRUCE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_SPRUCE_LOG) + ->writePillarAxis($block->getAxis())); + $this->map(VanillaBlocks::STRIPPED_SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(VanillaBlocks::SUGARCANE(), function(Sugarcane $block) : Writer{ + return Writer::create(Ids::REEDS) + ->writeInt(BlockStateNames::AGE, $block->getAge()); + }); + $this->map(VanillaBlocks::SUNFLOWER(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(VanillaBlocks::SWEET_BERRY_BUSH(), function(SweetBerryBush $block) : Writer{ + return Writer::create(Ids::SWEET_BERRY_BUSH) + ->writeInt(BlockStateNames::GROWTH, $block->getAge()); + }); + $this->map(VanillaBlocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) + ->writeString(BlockStateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); + $this->map(VanillaBlocks::TNT(), function(TNT $block) : Writer{ + return Writer::create(Ids::TNT) + ->writeBool(BlockStateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) + ->writeBool(BlockStateNames::EXPLODE_BIT, $block->isUnstable()); + }); + $this->map(VanillaBlocks::TORCH(), function(Torch $block) : Writer{ + return Writer::create(Ids::TORCH) + ->writeTorchFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::TRAPPED_CHEST(), function(TrappedChest $block) : Writer{ + return Writer::create(Ids::TRAPPED_CHEST) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::TRIPWIRE(), function(Tripwire $block) : Writer{ + return Writer::create(Ids::TRIPWIRE) + ->writeBool(BlockStateNames::ATTACHED_BIT, $block->isConnected()) + ->writeBool(BlockStateNames::DISARMED_BIT, $block->isDisarmed()) + ->writeBool(BlockStateNames::POWERED_BIT, $block->isTriggered()) + ->writeBool(BlockStateNames::SUSPENDED_BIT, $block->isSuspended()); + }); + $this->map(VanillaBlocks::TRIPWIRE_HOOK(), function(TripwireHook $block) : Writer{ + return Writer::create(Ids::TRIPWIRE_HOOK) + ->writeBool(BlockStateNames::ATTACHED_BIT, $block->isConnected()) + ->writeBool(BlockStateNames::POWERED_BIT, $block->isPowered()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ + return Writer::create(Ids::UNDERWATER_TORCH) + ->writeTorchFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::VINES(), function(Vine $block) : Writer{ + return Writer::create(Ids::VINE) + ->writeInt(BlockStateNames::VINE_DIRECTION_BITS, ($block->hasFace(Facing::NORTH) ? BlockLegacyMetadata::VINE_FLAG_NORTH : 0) | ($block->hasFace(Facing::SOUTH) ? BlockLegacyMetadata::VINE_FLAG_SOUTH : 0) | ($block->hasFace(Facing::WEST) ? BlockLegacyMetadata::VINE_FLAG_WEST : 0) | ($block->hasFace(Facing::EAST) ? BlockLegacyMetadata::VINE_FLAG_EAST : 0)); + }); + $this->map(VanillaBlocks::WALL_BANNER(), function(WallBanner $block) : Writer{ + return Writer::create(Ids::WALL_BANNER) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::WALL_CORAL_FAN(), function(WallCoralFan $block) : Writer{ + $coralType = $block->getCoralType(); + return Writer::create(match($coralType->id()){ + CoralType::TUBE()->id(), CoralType::BRAIN()->id() => Ids::CORAL_FAN_HANG, + CoralType::BUBBLE()->id(), CoralType::FIRE()->id() => Ids::CORAL_FAN_HANG2, + CoralType::HORN()->id() => Ids::CORAL_FAN_HANG3, + default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()), + }) + ->writeBool(BlockStateNames::CORAL_HANG_TYPE_BIT, $coralType->equals(CoralType::BRAIN()) || $coralType->equals(CoralType::FIRE())) + ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeCoralFacing($block->getFacing()); + }); + $this->map(VanillaBlocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); + $this->map(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ + return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) + ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + }); + $this->map(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), function(WeightedPressurePlateLight $block) : Writer{ + return Writer::create(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE) + ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + }); + $this->map(VanillaBlocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); + $this->map(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::WHITE_GLAZED_TERRACOTTA))); + $this->map(VanillaBlocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); + $this->map(VanillaBlocks::WOOL(), function(Wool $block) : Writer{ + return Writer::create(Ids::WOOL) + ->writeColor($block->getColor()); + }); + $this->map(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::YELLOW_GLAZED_TERRACOTTA))); } } diff --git a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php new file mode 100644 index 0000000000..0dbb28af04 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php @@ -0,0 +1,269 @@ +writeBool(BlockStateNames::STRIPPED_BIT, $block->isStripped()) + ->writePillarAxis(Axis::Y) //TODO: our implementation doesn't support this yet + ->writeTreeType($block->getTreeType()); + } + + public static function encodeButton(Button $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeFacingDirection($block->getFacing()) + ->writeBool(BlockStateNames::BUTTON_PRESSED_BIT, $block->isPressed()); + } + + public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeString(BlockStateNames::CHEMISTRY_TABLE_TYPE, $chemistryTableType) + ->writeLegacyHorizontalFacing($block->getFacing()); + } + + public static function encodeCrops(Crops $block, BlockStateWriter $out) : BlockStateWriter{ + return $out->writeInt(BlockStateNames::GROWTH, $block->getAge()); + } + + public static function encodeColoredTorch(Torch $block, bool $highBit, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(BlockStateNames::COLOR_BIT, $highBit) + ->writeTorchFacing($block->getFacing()); + } + + public static function encodeDoor(Door $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) + ->writeLegacyHorizontalFacing(Facing::rotateY($block->getFacing(), true)) + ->writeBool(BlockStateNames::DOOR_HINGE_BIT, $block->isHingeRight()) + ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); + } + + public static function encodeDoublePlant(DoublePlant $block, string $doublePlantType, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) + ->writeString(BlockStateNames::DOUBLE_PLANT_TYPE, $doublePlantType); + } + + public static function encodeFenceGate(FenceGate $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeBool(BlockStateNames::IN_WALL_BIT, $block->isInWall()) + ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); + } + + public static function encodeFloorSign(FloorSign $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeInt(BlockStateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); + } + + public static function encodeFurnace(Furnace $block, string $unlitId, string $litId) : BlockStateWriter{ + return BlockStateWriter::create($block->isLit() ? $litId : $unlitId) + ->writeHorizontalFacing($block->getFacing()); + } + public static function encodeGlazedTerracotta(GlazedTerracotta $block, BlockStateWriter $out) : BlockStateWriter{ + return $out->writeHorizontalFacing($block->getFacing()); + } + + private static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(BlockStateNames::PERSISTENT_BIT, $block->isNoDecay()) + ->writeBool(BlockStateNames::UPDATE_BIT, $block->isCheckDecay()); + } + + public static function encodeLeaves1(Leaves $block, string $type) : BlockStateWriter{ + return self::encodeLeaves($block, BlockStateWriter::create(Ids::LEAVES) + ->writeString(BlockStateNames::OLD_LEAF_TYPE, $type)); + } + + public static function encodeLeaves2(Leaves $block, string $type) : BlockStateWriter{ + return self::encodeLeaves($block, BlockStateWriter::create(Ids::LEAVES2) + ->writeString(BlockStateNames::NEW_LEAF_TYPE, $type)); + } + + public static function encodeLiquid(Liquid $block, string $stillId, string $flowingId) : BlockStateWriter{ + return BlockStateWriter::create($block->isStill() ? $stillId : $flowingId) + ->writeInt(BlockStateNames::LIQUID_DEPTH, $block->getDecay() | ($block->isFalling() ? 0x8 : 0)); + } + + private static function encodeLog(Log $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writePillarAxis($block->getAxis()); + } + + public static function encodeLog1(Log $block, string $type) : BlockStateWriter{ + return self::encodeLog($block, BlockStateWriter::create(Ids::LOG) + ->writeString(BlockStateNames::OLD_LOG_TYPE, $type)); + } + + public static function encodeLog2(Log $block, string $type) : BlockStateWriter{ + return self::encodeLog($block, BlockStateWriter::create(Ids::LOG2) + ->writeString(BlockStateNames::NEW_LOG_TYPE, $type)); + } + + public static function encodeMushroomBlock(RedMushroomBlock $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, MushroomBlockTypeIdMap::getInstance()->toId($block->getMushroomBlockType())); + } + + public static function encodeQuartz(string $type, int $axis) : BlockStateWriter{ + return BlockStateWriter::create(Ids::QUARTZ_BLOCK) + ->writeString(BlockStateNames::CHISEL_TYPE, $type) + ->writePillarAxis($axis); //this isn't needed for all types, but we have to write it anyway + } + + public static function encodeRedFlower(string $type) : BlockStateWriter{ + return BlockStateWriter::create(Ids::RED_FLOWER)->writeString(BlockStateNames::FLOWER_TYPE, $type); + } + + public static function encodeSandstone(string $id, string $type) : BlockStateWriter{ + return BlockStateWriter::create($id)->writeString(BlockStateNames::SAND_STONE_TYPE, $type); + } + + public static function encodeSapling(Sapling $block, string $type) : BlockStateWriter{ + return BlockStateWriter::create(Ids::SAPLING) + ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) + ->writeString(BlockStateNames::SAPLING_TYPE, $type); + } + + public static function encodeSimplePressurePlate(SimplePressurePlate $block, BlockStateWriter $out) : BlockStateWriter{ + //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? + //best to keep this separate from weighted plates anyway... + return $out + ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->isPressed() ? 15 : 0); + } + + private static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ + $slabType = $block->getSlabType(); + return BlockStateWriter::create($slabType->equals(SlabType::DOUBLE()) ? $doubleId : $singleId) + + //this is (intentionally) also written for double slabs (as zero) to maintain bug parity with MCPE + ->writeBool(BlockStateNames::TOP_SLOT_BIT, $slabType->equals(SlabType::TOP())); + } + + public static function encodeStairs(Stair $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(BlockStateNames::UPSIDE_DOWN_BIT, $block->isUpsideDown()) + ->writeWeirdoHorizontalFacing($block->getFacing()); + } + + public static function encodeStem(Stem $block, BlockStateWriter $out) : BlockStateWriter{ + return self::encodeCrops($block, $out) + ->writeHorizontalFacing(Facing::NORTH); //TODO: PM impl doesn't support this yet + } + + public static function encodeStone(string $type) : BlockStateWriter{ + return BlockStateWriter::create(Ids::STONE) + ->writeString(BlockStateNames::STONE_TYPE, $type); + } + + public static function encodeStoneBricks(string $type) : BlockStateWriter{ + return BlockStateWriter::create(Ids::STONEBRICK) + ->writeString(BlockStateNames::STONE_BRICK_TYPE, $type); + } + + private static function encodeStoneSlab(Slab $block, string $singleId, string $doubleId, string $typeKey, string $typeValue) : BlockStateWriter{ + return self::encodeSlab($block, $singleId, $doubleId) + ->writeString($typeKey, $typeValue); + } + + public static function encodeStoneSlab1(Slab $block, string $typeValue) : BlockStateWriter{ + return self::encodeStoneSlab($block, Ids::STONE_SLAB, Ids::DOUBLE_STONE_SLAB, BlockStateNames::STONE_SLAB_TYPE, $typeValue); + } + + public static function encodeStoneSlab2(Slab $block, string $typeValue) : BlockStateWriter{ + return self::encodeStoneSlab($block, Ids::STONE_SLAB2, Ids::DOUBLE_STONE_SLAB2, BlockStateNames::STONE_SLAB_TYPE_2, $typeValue); + } + + public static function encodeStoneSlab3(Slab $block, string $typeValue) : BlockStateWriter{ + return self::encodeStoneSlab($block, Ids::STONE_SLAB3, Ids::DOUBLE_STONE_SLAB3, BlockStateNames::STONE_SLAB_TYPE_3, $typeValue); + } + + public static function encodeStoneSlab4(Slab $block, string $typeValue) : BlockStateWriter{ + return self::encodeStoneSlab($block, Ids::STONE_SLAB4, Ids::DOUBLE_STONE_SLAB4, BlockStateNames::STONE_SLAB_TYPE_4, $typeValue); + } + + public static function encodeTrapdoor(Trapdoor $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeBool(BlockStateNames::UPSIDE_DOWN_BIT, $block->isTop()) + ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); + } + + public static function encodeWall(Wall $block, BlockStateWriter $out) : BlockStateWriter{ + //TODO: our walls don't support the full range of needed states yet + return $out + ->writeBool(BlockStateNames::WALL_POST_BIT, false) + ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_EAST, BlockStateStringValues::WALL_CONNECTION_TYPE_EAST_NONE) + ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_NORTH, BlockStateStringValues::WALL_CONNECTION_TYPE_NORTH_NONE) + ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH, BlockStateStringValues::WALL_CONNECTION_TYPE_SOUTH_NONE) + ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_WEST, BlockStateStringValues::WALL_CONNECTION_TYPE_WEST_NONE); + } + + public static function encodeLegacyWall(Wall $block, string $type) : BlockStateWriter{ + return self::encodeWall($block, BlockStateWriter::create(Ids::COBBLESTONE_WALL)) + ->writeString(BlockStateNames::WALL_BLOCK_TYPE, $type); + } + + public static function encodeWallSign(WallSign $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeHorizontalFacing($block->getFacing()); + } + + public static function encodeWoodenSlab(Slab $block, string $typeValue) : BlockStateWriter{ + return self::encodeSlab($block, Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB) + ->writeString(BlockStateNames::WOOD_TYPE, $typeValue); + } +} diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index b3a477f536..2657b90d14 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -27,6 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; +use pocketmine\block\utils\TreeType; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -42,6 +43,10 @@ final class BlockStateWriter{ $this->states = CompoundTag::create(); } + public static function create(string $id) : self{ + return new self($id); + } + /** @return $this */ public function writeBool(string $name, bool $value) : self{ $this->states->setByte($name, $value ? 1 : 0); @@ -195,6 +200,20 @@ final class BlockStateWriter{ return $this; } + /** @return $this */ + public function writeTreeType(TreeType $treeType) : self{ + $this->writeString(BlockStateNames::WOOD_TYPE, match($treeType->id()){ + TreeType::OAK()->id() => StringValues::WOOD_TYPE_OAK, + TreeType::SPRUCE()->id() => StringValues::WOOD_TYPE_SPRUCE, + TreeType::BIRCH()->id() => StringValues::WOOD_TYPE_BIRCH, + TreeType::JUNGLE()->id() => StringValues::WOOD_TYPE_JUNGLE, + TreeType::ACACIA()->id() => StringValues::WOOD_TYPE_ACACIA, + TreeType::DARK_OAK()->id() => StringValues::WOOD_TYPE_DARK_OAK, + default => throw new BlockStateSerializeException("Invalid Tree type " . $treeType->name()) + }); + return $this; + } + /** @return $this */ public function writeCoralType(CoralType $coralType) : self{ $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType->id()){ From fe7d942500e56ef08139a85610d09d422850ba50 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 05:26:14 +0000 Subject: [PATCH 0019/1858] fix CS --- src/data/bedrock/blockstate/BlockStateReader.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index f8ecf046ae..21537e452b 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate; -use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; From 1a800cf4df99647cf4063d422af278828f29e44e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 05:28:52 +0000 Subject: [PATCH 0020/1858] fixed match indentations --- .../blockstate/BlockStateSerializer.php | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 3ddfc58f11..679c0435c7 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -242,22 +242,22 @@ final class BlockStateSerializer{ return Writer::create(Ids::ANVIL) ->writeLegacyHorizontalFacing($block->getFacing()) ->writeString(BlockStateNames::DAMAGE, match($damage = $block->getDamage()){ - 0 => StringValues::DAMAGE_UNDAMAGED, - 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, - 2 => StringValues::DAMAGE_VERY_DAMAGED, - default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), - }); + 0 => StringValues::DAMAGE_UNDAMAGED, + 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, + 2 => StringValues::DAMAGE_VERY_DAMAGED, + default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), + }); }); $this->map(VanillaBlocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); $this->map(VanillaBlocks::BAMBOO(), function(Bamboo $block) : Writer{ return Writer::create(Ids::BAMBOO) ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) ->writeString(BlockStateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ - Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, - Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, - Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, - default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), - }) + Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, + Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, + Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, + default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), + }) ->writeString(BlockStateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); }); $this->map(VanillaBlocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ @@ -400,10 +400,10 @@ final class BlockStateSerializer{ return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) ->writeCoralType($block->getCoralType()) ->writeInt(BlockStateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ - Axis::X => 0, - Axis::Z => 1, - default => throw new BlockStateSerializeException("Invalid axis {$axis}"), - }); + Axis::X => 0, + Axis::Z => 1, + default => throw new BlockStateSerializeException("Invalid axis {$axis}"), + }); }); $this->map(VanillaBlocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); $this->map(VanillaBlocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); @@ -722,16 +722,16 @@ final class BlockStateSerializer{ return Writer::create(Ids::LEVER) ->writeBool(BlockStateNames::OPEN_BIT, $block->isActivated()) ->writeString(BlockStateNames::LEVER_DIRECTION, match($block->getFacing()->id()){ - LeverFacing::DOWN_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, - LeverFacing::DOWN_AXIS_X()->id() => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, - LeverFacing::UP_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, - LeverFacing::UP_AXIS_X()->id() => StringValues::LEVER_DIRECTION_UP_EAST_WEST, - LeverFacing::NORTH()->id() => StringValues::LEVER_DIRECTION_NORTH, - LeverFacing::SOUTH()->id() => StringValues::LEVER_DIRECTION_SOUTH, - LeverFacing::WEST()->id() => StringValues::LEVER_DIRECTION_WEST, - LeverFacing::EAST()->id() => StringValues::LEVER_DIRECTION_EAST, - default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), - }); + LeverFacing::DOWN_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, + LeverFacing::DOWN_AXIS_X()->id() => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, + LeverFacing::UP_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, + LeverFacing::UP_AXIS_X()->id() => StringValues::LEVER_DIRECTION_UP_EAST_WEST, + LeverFacing::NORTH()->id() => StringValues::LEVER_DIRECTION_NORTH, + LeverFacing::SOUTH()->id() => StringValues::LEVER_DIRECTION_SOUTH, + LeverFacing::WEST()->id() => StringValues::LEVER_DIRECTION_WEST, + LeverFacing::EAST()->id() => StringValues::LEVER_DIRECTION_EAST, + default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), + }); }); $this->map(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA))); $this->map(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::SILVER_GLAZED_TERRACOTTA))); @@ -778,10 +778,10 @@ final class BlockStateSerializer{ $this->map(VanillaBlocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) ->writeString(BlockStateNames::PORTAL_AXIS, match($block->getAxis()){ - Axis::X => StringValues::PORTAL_AXIS_X, - Axis::Z => StringValues::PORTAL_AXIS_Z, - default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), - }); + Axis::X => StringValues::PORTAL_AXIS_X, + Axis::Z => StringValues::PORTAL_AXIS_Z, + default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), + }); }); $this->map(VanillaBlocks::NETHER_QUARTZ_ORE(), fn() => new Writer(Ids::QUARTZ_ORE)); $this->map(VanillaBlocks::NETHER_REACTOR_CORE(), fn() => new Writer(Ids::NETHERREACTOR)); From ccfe485c067a0dbcdf1d61d65ba77713d3565c3c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 13:56:05 +0000 Subject: [PATCH 0021/1858] Fixed end rod up/down state --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 2 +- src/data/bedrock/blockstate/BlockStateReader.php | 6 ++++++ src/data/bedrock/blockstate/BlockStateSerializer.php | 3 +-- src/data/bedrock/blockstate/BlockStateWriter.php | 6 ++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 47d95eabf9..7a6d444634 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -430,7 +430,7 @@ final class BlockStateDeserializer{ }); $this->map(Ids::END_ROD, function(BlockStateReader $in) : Block{ return VanillaBlocks::END_ROD() - ->setFacing($in->readFacingDirection()); + ->setFacing($in->readEndRodFacingDirection()); }); $this->map(Ids::END_STONE, fn() => VanillaBlocks::END_STONE()); $this->map(Ids::ENDER_CHEST, function(BlockStateReader $in) : Block{ diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 21537e452b..4f4fdbcfa7 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -125,6 +125,12 @@ final class BlockStateReader{ ]); } + /** @throws BlockStateDeserializeException */ + public function readEndRodFacingDirection() : int{ + $result = $this->readFacingDirection(); + return Facing::axis($result) === Axis::Y ? Facing::opposite($result) : $result; + } + /** @throws BlockStateDeserializeException */ public function readHorizontalFacing() : int{ return $this->parseFacingValue($this->readInt(BlockStateNames::FACING_DIRECTION), [ diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 679c0435c7..6385bc794c 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -595,9 +595,8 @@ final class BlockStateSerializer{ ->writeLegacyHorizontalFacing($block->getFacing()); }); $this->map(VanillaBlocks::END_ROD(), function(EndRod $block) : Writer{ - //TODO: not sure if this needs down/up to be flipped like legacy metadata? return Writer::create(Ids::END_ROD) - ->writeFacingDirection($block->getFacing()); + ->writeEndRodFacingDirection($block->getFacing()); }); $this->map(VanillaBlocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); $this->map(VanillaBlocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index 2657b90d14..249b316744 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -79,6 +79,12 @@ final class BlockStateWriter{ return $this; } + /** @return $this */ + public function writeEndRodFacingDirection(int $value) : self{ + //end rods are stupid in bedrock and have up/down the wrong way round + return $this->writeFacingDirection(Facing::axis($value) === Axis::Y ? Facing::opposite($value) : $value); + } + /** @return $this */ public function writeHorizontalFacing(int $value) : self{ if($value === Facing::UP || $value === Facing::DOWN){ From 4d935aa8b6d893edd416e85b05ba5a205d1657b9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 17:12:12 +0000 Subject: [PATCH 0022/1858] Torch facings are the wrong way round :( --- src/data/bedrock/blockstate/BlockStateReader.php | 9 +++++---- src/data/bedrock/blockstate/BlockStateWriter.php | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 4f4fdbcfa7..dad5dc62d5 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -241,13 +241,14 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function readTorchFacing() : int{ + //TODO: horizontal directions are flipped (MCPE bug: https://bugs.mojang.com/browse/MCPE-152036) return match($rawValue = $this->readString(BlockStateNames::TORCH_FACING_DIRECTION)){ - StringValues::TORCH_FACING_DIRECTION_EAST => Facing::EAST, - StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::NORTH, - StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::SOUTH, + StringValues::TORCH_FACING_DIRECTION_EAST => Facing::WEST, + StringValues::TORCH_FACING_DIRECTION_NORTH => Facing::SOUTH, + StringValues::TORCH_FACING_DIRECTION_SOUTH => Facing::NORTH, StringValues::TORCH_FACING_DIRECTION_TOP => Facing::UP, StringValues::TORCH_FACING_DIRECTION_UNKNOWN => Facing::UP, //should be illegal, but 1.13 allows it - StringValues::TORCH_FACING_DIRECTION_WEST => Facing::WEST, + StringValues::TORCH_FACING_DIRECTION_WEST => Facing::EAST, default => throw $this->badValueException(BlockStateNames::TORCH_FACING_DIRECTION, $rawValue, "Invalid torch facing"), }; } diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index 249b316744..34fce1001b 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -195,12 +195,13 @@ final class BlockStateWriter{ /** @return $this */ public function writeTorchFacing(int $facing) : self{ + //TODO: horizontal directions are flipped (MCPE bug: https://bugs.mojang.com/browse/MCPE-152036) $this->writeString(BlockStateNames::TORCH_FACING_DIRECTION, match($facing){ Facing::UP => StringValues::TORCH_FACING_DIRECTION_TOP, - Facing::NORTH => StringValues::TORCH_FACING_DIRECTION_NORTH, - Facing::SOUTH => StringValues::TORCH_FACING_DIRECTION_SOUTH, - Facing::WEST => StringValues::TORCH_FACING_DIRECTION_WEST, - Facing::EAST => StringValues::TORCH_FACING_DIRECTION_EAST, + Facing::SOUTH => StringValues::TORCH_FACING_DIRECTION_NORTH, + Facing::NORTH => StringValues::TORCH_FACING_DIRECTION_SOUTH, + Facing::EAST => StringValues::TORCH_FACING_DIRECTION_WEST, + Facing::WEST => StringValues::TORCH_FACING_DIRECTION_EAST, default => throw new BlockStateSerializeException("Invalid Torch facing $facing") }); return $this; From cab9b6c8620a6ea7497c3e545a7691e58f906b8f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 17:29:30 +0000 Subject: [PATCH 0023/1858] Add a wrapper type for blockstate NBT --- .../bedrock/blockstate/BlockStateData.php | 88 +++++++++++++++++++ .../blockstate/BlockStateDeserializer.php | 15 +--- .../bedrock/blockstate/BlockStateReader.php | 17 ++-- .../blockstate/BlockStateSerializer.php | 5 +- .../bedrock/blockstate/BlockStateWriter.php | 7 +- 5 files changed, 101 insertions(+), 31 deletions(-) create mode 100644 src/data/bedrock/blockstate/BlockStateData.php diff --git a/src/data/bedrock/blockstate/BlockStateData.php b/src/data/bedrock/blockstate/BlockStateData.php new file mode 100644 index 0000000000..c6485c748a --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateData.php @@ -0,0 +1,88 @@ +name; } + + public function getStates() : CompoundTag{ return $this->states; } + + public function getVersion() : int{ return $this->version; } + + /** + * @throws BlockStateDeserializeException + */ + public static function fromNbt(CompoundTag $nbt) : self{ + try{ + $name = $nbt->getString(self::TAG_NAME); + $states = $nbt->getCompoundTag(self::TAG_STATES) ?? throw new BlockStateDeserializeException("Missing tag \"" . self::TAG_STATES . "\""); + $version = $nbt->getInt(self::TAG_VERSION, 0); + }catch(NbtException $e){ + throw new BlockStateDeserializeException($e->getMessage(), 0, $e); + } + + $allKeys = $nbt->getValue(); + unset($allKeys[self::TAG_NAME], $allKeys[self::TAG_STATES], $allKeys[self::TAG_VERSION]); + if(count($allKeys) !== 0){ + throw new BlockStateDeserializeException("Unexpected extra keys: " . implode(", ", array_keys($allKeys))); + } + + return new self($name, $states, $version); + } + + public function toNbt() : CompoundTag{ + return CompoundTag::create() + ->setString(self::TAG_NAME, $this->name) + ->setInt(self::TAG_VERSION, $this->version) + ->setTag(self::TAG_STATES, $this->states); + } +} diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 7a6d444634..1d3caef3f7 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -37,7 +37,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use function array_key_exists; use function min; @@ -2501,20 +2500,12 @@ final class BlockStateDeserializer{ /** @throws BlockStateDeserializeException */ public function deserialize(CompoundTag $blockState) : Block{ - try{ - $id = $blockState->getString("name"); - $states = $blockState->getCompoundTag("states"); - }catch(NbtException $e){ - throw new BlockStateDeserializeException("Error reading blockstate NBT: " . $e->getMessage(), 0, $e); - } - - if($states === null){ - throw new BlockStateDeserializeException("\"states\" tag must always be present, even if it has no data"); - } + $blockStateData = BlockStateData::fromNbt($blockState); + $id = $blockStateData->getName(); if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); } - return $this->deserializeFuncs[$id](new BlockStateReader($states)); + return $this->deserializeFuncs[$id](new BlockStateReader($blockStateData)); } } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index dad5dc62d5..043b16ef15 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -31,7 +31,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; @@ -39,13 +38,9 @@ use function get_class; final class BlockStateReader{ - private CompoundTag $nbt; - - public function __construct(CompoundTag $nbt){ - $this->nbt = $nbt; - } - - public function getNbt() : CompoundTag{ return $this->nbt; } + public function __construct( + private BlockStateData $data + ){} public function missingOrWrongTypeException(string $name, ?Tag $tag) : BlockStateDeserializeException{ return new BlockStateDeserializeException("Property \"$name\" " . ($tag !== null ? "has unexpected type " . get_class($tag) : "is missing")); @@ -60,7 +55,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBool(string $name) : bool{ - $tag = $this->nbt->getTag($name); + $tag = $this->data->getStates()->getTag($name); if($tag instanceof ByteTag){ switch($tag->getValue()){ case 0: return false; @@ -73,7 +68,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readInt(string $name) : int{ - $tag = $this->nbt->getTag($name); + $tag = $this->data->getStates()->getTag($name); if($tag instanceof IntTag){ return $tag->getValue(); } @@ -92,7 +87,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readString(string $name) : string{ //TODO: only allow a specific set of values (strings are primarily used for enums) - $tag = $this->nbt->getTag($name); + $tag = $this->data->getStates()->getTag($name); if($tag instanceof StringTag){ return $tag->getValue(); } diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 6385bc794c..8c705ca2fb 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -143,7 +143,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateWriter as Writer; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use function class_parents; use function get_class; @@ -175,7 +174,7 @@ final class BlockStateSerializer{ * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $blockState */ - public function serialize(Block $blockState) : CompoundTag{ + public function serialize(Block $blockState) : BlockStateData{ $typeId = $blockState->getTypeId(); $locatedSerializer = $this->serializers[$typeId][get_class($blockState)] ?? null; @@ -204,7 +203,7 @@ final class BlockStateSerializer{ /** @var Writer $writer */ $writer = $serializer($blockState); - return $writer->writeBlockStateNbt(); + return $writer->getBlockStateData(); } public function __construct(){ diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index 34fce1001b..907db99c29 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -246,10 +246,7 @@ final class BlockStateWriter{ return $this; } - public function writeBlockStateNbt() : CompoundTag{ - //TODO: add `version` field - return CompoundTag::create() - ->setString("name", $this->id) - ->setTag("states", $this->states); + public function getBlockStateData() : BlockStateData{ + return new BlockStateData($this->id, $this->states, BlockStateData::CURRENT_VERSION); } } From 979f6f3d574da2b05022168f83b36f67be1f5c62 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 17:34:32 +0000 Subject: [PATCH 0024/1858] Rewrite RuntimeBlockMapping to use BlockStateSerializer --- .../mcpe/convert/BlockStateDictionary.php | 74 ++++++++++ .../mcpe/convert/BlockStateLookupCache.php | 87 +++++++++++ .../convert/R12ToCurrentBlockMapEntry.php | 58 -------- .../mcpe/convert/RuntimeBlockMapping.php | 139 ++++++------------ .../mcpe/serializer/ChunkSerializer.php | 13 +- 5 files changed, 221 insertions(+), 150 deletions(-) create mode 100644 src/network/mcpe/convert/BlockStateDictionary.php create mode 100644 src/network/mcpe/convert/BlockStateLookupCache.php delete mode 100644 src/network/mcpe/convert/R12ToCurrentBlockMapEntry.php diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php new file mode 100644 index 0000000000..421d2cfff5 --- /dev/null +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -0,0 +1,74 @@ + $states + */ + public function __construct( + private array $states + ){ + $this->lookupCache = new BlockStateLookupCache($this->states); + } + + public function getDataFromStateId(int $networkRuntimeId) : ?BlockStateData{ + return $this->states[$networkRuntimeId] ?? null; + } + + /** + * Searches for the appropriate state ID which matches the given blockstate NBT. + * Returns null if there were no matches. + */ + public function lookupStateIdFromData(BlockStateData $data) : ?int{ + return $this->lookupCache->lookupStateId($data); + } + + /** + * Returns an array mapping runtime ID => blockstate data. + * @return BlockStateData[] + * @phpstan-return array + */ + public function getStates() : array{ return $this->states; } + + public static function loadFromString(string $contents) : self{ + return new self(array_map( + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + (new NetworkNbtSerializer())->readMultiple($contents) + )); + } +} diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php new file mode 100644 index 0000000000..60ac12fc94 --- /dev/null +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -0,0 +1,87 @@ +> + */ + private array $nameToNetworkIdsLookup = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $nameToSingleNetworkIdLookup = []; + + /** + * @param BlockStateData[] $blockStates + * @phpstan-param list $blockStates + */ + public function __construct(array $blockStates){ + foreach($blockStates as $stateId => $stateNbt){ + $this->nameToNetworkIdsLookup[$stateNbt->getName()][$stateId] = $stateNbt; + } + + //setup fast path for stateless blocks + foreach(Utils::stringifyKeys($this->nameToNetworkIdsLookup) as $name => $stateIds){ + if(count($stateIds) === 1){ + $this->nameToSingleNetworkIdLookup[$name] = array_key_first($stateIds); + } + } + } + + /** + * Searches for the appropriate state ID which matches the given blockstate NBT. + * Returns null if there were no matches. + */ + public function lookupStateId(BlockStateData $data) : ?int{ + $name = $data->getName(); + + if(isset($this->nameToSingleNetworkIdLookup[$name])){ + return $this->nameToSingleNetworkIdLookup[$name]; + } + + if(isset($this->nameToNetworkIdsLookup[$name])){ + $states = $data->getStates(); + foreach($this->nameToNetworkIdsLookup[$name] as $stateId => $stateNbt){ + if($stateNbt->getStates()->equals($states)){ + return $stateId; + } + } + } + + return null; + } +} diff --git a/src/network/mcpe/convert/R12ToCurrentBlockMapEntry.php b/src/network/mcpe/convert/R12ToCurrentBlockMapEntry.php deleted file mode 100644 index 1244d27455..0000000000 --- a/src/network/mcpe/convert/R12ToCurrentBlockMapEntry.php +++ /dev/null @@ -1,58 +0,0 @@ -id = $id; - $this->meta = $meta; - $this->blockState = $blockState; - } - - public function getId() : string{ - return $this->id; - } - - public function getMeta() : int{ - return $this->meta; - } - - public function getBlockState() : CompoundTag{ - return $this->blockState; - } - - public function __toString(){ - return "id=$this->id, meta=$this->meta, nbt=$this->blockState"; - } -} diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 75835be0fc..7ea0628760 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -23,13 +23,14 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; -use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\block\BlockFactory; +use pocketmine\block\UnknownBlock; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\blockstate\BlockStateSerializer; +use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; @@ -41,98 +42,54 @@ use function file_get_contents; final class RuntimeBlockMapping{ use SingletonTrait; - /** @var int[] */ - private $legacyToRuntimeMap = []; - /** @var int[] */ - private $runtimeToLegacyMap = []; - /** @var CompoundTag[] */ - private $bedrockKnownStates; + private BlockStateDictionary $blockStateDictionary; + private BlockStateSerializer $blockStateSerializer; + /** + * @var int[] + * @phpstan-var array + */ + private array $networkIdCache = []; + + /** + * Used when a blockstate can't be correctly serialized (e.g. because it's unknown) + */ + private BlockStateData $fallbackStateData; private function __construct(){ - $stream = PacketSerializer::decoder( - Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"), - 0, - new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()) - ); - $list = []; - while(!$stream->feof()){ - $list[] = $stream->getNbtCompoundRoot(); - } - $this->bedrockKnownStates = $list; + $contents = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"); + $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); + $this->blockStateSerializer = new BlockStateSerializer(); - $this->setupLegacyMappings(); - } - - private function setupLegacyMappings() : void{ - $legacyIdMap = LegacyBlockIdToStringIdMap::getInstance(); - /** @var R12ToCurrentBlockMapEntry[] $legacyStateMap */ - $legacyStateMap = []; - $legacyStateMapReader = PacketSerializer::decoder( - Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "r12_to_current_block_map.bin")), "Missing required resource file"), - 0, - new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()) - ); - $nbtReader = new NetworkNbtSerializer(); - while(!$legacyStateMapReader->feof()){ - $id = $legacyStateMapReader->getString(); - $meta = $legacyStateMapReader->getLShort(); - - $offset = $legacyStateMapReader->getOffset(); - $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); - $legacyStateMapReader->setOffset($offset); - $legacyStateMap[] = new R12ToCurrentBlockMapEntry($id, $meta, $state); - } - - /** - * @var int[][] $idToStatesMap string id -> int[] list of candidate state indices - */ - $idToStatesMap = []; - foreach($this->bedrockKnownStates as $k => $state){ - $idToStatesMap[$state->getString("name")][] = $k; - } - foreach($legacyStateMap as $pair){ - $id = $legacyIdMap->stringToLegacy($pair->getId()); - if($id === null){ - throw new \RuntimeException("No legacy ID matches " . $pair->getId()); - } - $data = $pair->getMeta(); - if($data > 15){ - //we can't handle metadata with more than 4 bits - continue; - } - $mappedState = $pair->getBlockState(); - $mappedName = $mappedState->getString("name"); - if(!isset($idToStatesMap[$mappedName])){ - throw new \RuntimeException("Mapped new state does not appear in network table"); - } - foreach($idToStatesMap[$mappedName] as $k){ - $networkState = $this->bedrockKnownStates[$k]; - if($mappedState->equals($networkState)){ - $this->registerMapping($k, $id, $data); - continue 2; - } - } - throw new \RuntimeException("Mapped new state does not appear in network table"); - } + $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } public function toRuntimeId(int $internalStateId) : int{ - return $this->legacyToRuntimeMap[$internalStateId] ?? $this->legacyToRuntimeMap[BlockLegacyIds::INFO_UPDATE << Block::INTERNAL_METADATA_BITS]; + if(isset($this->networkIdCache[$internalStateId])){ + return $this->networkIdCache[$internalStateId]; + } + + //TODO: singleton usage not ideal + $block = BlockFactory::getInstance()->fromFullBlock($internalStateId); + if($block instanceof UnknownBlock){ + $blockStateData = $this->fallbackStateData; + }else{ + try{ + $blockStateData = $this->blockStateSerializer->serialize($block); + }catch(BlockStateSerializeException $e){ + throw new AssumptionFailedError("Invalid serializer for block $block", 0, $e); + } + } + + $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); + + if($networkId === null){ + throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); + } + + return $this->networkIdCache[$internalStateId] = $networkId; } - public function fromRuntimeId(int $runtimeId) : int{ - return $this->runtimeToLegacyMap[$runtimeId]; - } + public function getBlockStateDictionary() : BlockStateDictionary{ return $this->blockStateDictionary; } - private function registerMapping(int $staticRuntimeId, int $legacyId, int $legacyMeta) : void{ - $this->legacyToRuntimeMap[($legacyId << Block::INTERNAL_METADATA_BITS) | $legacyMeta] = $staticRuntimeId; - $this->runtimeToLegacyMap[$staticRuntimeId] = ($legacyId << Block::INTERNAL_METADATA_BITS) | $legacyMeta; - } - - /** - * @return CompoundTag[] - */ - public function getBedrockKnownStates() : array{ - return $this->bedrockKnownStates; - } + public function getFallbackStateData() : BlockStateData{ return $this->fallbackStateData; } } diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index 0fe5d891ae..16d67a75e6 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -25,7 +25,10 @@ namespace pocketmine\network\mcpe\serializer; use pocketmine\block\tile\Spawnable; use pocketmine\data\bedrock\BiomeIds; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\data\bedrock\LegacyBiomeIdToStringIdMap; +use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; @@ -97,6 +100,8 @@ final class ChunkSerializer{ $stream->putByte(count($layers)); + $blockStateDictionary = $blockMapper->getBlockStateDictionary(); + foreach($layers as $blocks){ $bitsPerBlock = $blocks->getBitsPerBlock(); $words = $blocks->getWordArray(); @@ -113,7 +118,13 @@ final class ChunkSerializer{ if($persistentBlockStates){ $nbtSerializer = new NetworkNbtSerializer(); foreach($palette as $p){ - $stream->put($nbtSerializer->write(new TreeRoot($blockMapper->getBedrockKnownStates()[$blockMapper->toRuntimeId($p)]))); + //TODO: introduce a binary cache for this + $state = $blockStateDictionary->getDataFromStateId($blockMapper->toRuntimeId($p)); + if($state === null){ + $state = $blockMapper->getFallbackStateData(); + } + + $stream->put($nbtSerializer->write(new TreeRoot($state->toNbt()))); } }else{ foreach($palette as $p){ From f4f4ea1483d933a329e17bac32b95710cb28d8af Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 17:44:12 +0000 Subject: [PATCH 0025/1858] fix CS --- src/network/mcpe/convert/RuntimeBlockMapping.php | 4 +--- src/network/mcpe/serializer/ChunkSerializer.php | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 7ea0628760..41a2cd5b73 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -50,9 +50,7 @@ final class RuntimeBlockMapping{ */ private array $networkIdCache = []; - /** - * Used when a blockstate can't be correctly serialized (e.g. because it's unknown) - */ + /** Used when a blockstate can't be correctly serialized (e.g. because it's unknown) */ private BlockStateData $fallbackStateData; private function __construct(){ diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index 16d67a75e6..f83e2fa201 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -25,10 +25,7 @@ namespace pocketmine\network\mcpe\serializer; use pocketmine\block\tile\Spawnable; use pocketmine\data\bedrock\BiomeIds; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\data\bedrock\LegacyBiomeIdToStringIdMap; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; From e808b7aac4e82143409ab4237f2f1d7bf7fcb24b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 19:39:39 +0000 Subject: [PATCH 0026/1858] Fixed asymmetric API --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 1d3caef3f7..38f8f50700 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -2499,9 +2499,7 @@ final class BlockStateDeserializer{ } /** @throws BlockStateDeserializeException */ - public function deserialize(CompoundTag $blockState) : Block{ - $blockStateData = BlockStateData::fromNbt($blockState); - + public function deserialize(BlockStateData $blockStateData) : Block{ $id = $blockStateData->getName(); if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); From 101b71ed02a800526701bde257ff250abdfb933c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 19:40:00 +0000 Subject: [PATCH 0027/1858] Fixed trapdoor rotation --- .../blockstate/BlockStateDeserializerHelper.php | 2 +- src/data/bedrock/blockstate/BlockStateReader.php | 13 +++++++++++++ .../blockstate/BlockStateSerializerHelper.php | 2 +- src/data/bedrock/blockstate/BlockStateWriter.php | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php index d026e0773e..225df7c2bf 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php @@ -186,7 +186,7 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeTrapdoor(Trapdoor $block, BlockStateReader $in) : Trapdoor{ return $block - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->read5MinusHorizontalFacing()) ->setTop($in->readBool(BlockStateNames::UPSIDE_DOWN_BIT)) ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); } diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 043b16ef15..6d2eeb9298 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -158,6 +158,19 @@ final class BlockStateReader{ ]); } + /** + * This is for trapdoors, because Mojang botched the conversion in 1.13 + * @throws BlockStateDeserializeException + */ + public function read5MinusHorizontalFacing() : int{ + return $this->parseFacingValue($this->readInt(BlockStateNames::DIRECTION), [ + 0 => Facing::EAST, + 1 => Facing::WEST, + 2 => Facing::SOUTH, + 3 => Facing::NORTH + ]); + } + /** @throws BlockStateDeserializeException */ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow diff --git a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php index 0dbb28af04..e4a1ffaf30 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php @@ -237,7 +237,7 @@ final class BlockStateSerializerHelper{ public static function encodeTrapdoor(Trapdoor $block, BlockStateWriter $out) : BlockStateWriter{ return $out - ->writeLegacyHorizontalFacing($block->getFacing()) + ->write5MinusHorizontalFacing($block->getFacing()) ->writeBool(BlockStateNames::UPSIDE_DOWN_BIT, $block->isTop()) ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); } diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index 907db99c29..ef726c0a5c 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -118,6 +118,20 @@ final class BlockStateWriter{ return $this; } + /** + * This is for trapdoors, because Mojang botched the conversion in 1.13 + * @return $this + */ + public function write5MinusHorizontalFacing(int $value) : self{ + return $this->writeInt(BlockStateNames::DIRECTION, match($value){ + Facing::EAST => 0, + Facing::WEST => 1, + Facing::SOUTH => 2, + Facing::NORTH => 3, + default => throw new BlockStateSerializeException("Invalid horizontal facing $value") + }); + } + /** @return $this */ public function writeColor(DyeColor $color) : self{ $this->writeString(BlockStateNames::COLOR, match($color->id()){ From 6644fd472c649cd0f9c0c4c4cb32eb2b9005b372 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 20:00:50 +0000 Subject: [PATCH 0028/1858] fixed more stupid bullshit --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 8 ++++---- src/data/bedrock/blockstate/BlockStateReader.php | 2 +- src/data/bedrock/blockstate/BlockStateSerializer.php | 6 +++--- .../bedrock/blockstate/BlockStateSerializerHelper.php | 2 +- src/data/bedrock/blockstate/BlockStateWriter.php | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 38f8f50700..e1ce89d795 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -151,8 +151,8 @@ final class BlockStateDeserializer{ $this->map(Ids::BREWING_STAND, function(BlockStateReader $in) : Block{ return VanillaBlocks::BREWING_STAND() ->setSlot(BrewingStandSlot::EAST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT)) - ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT)) - ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT)); + ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT)); }); $this->map(Ids::BRICK_BLOCK, fn() => VanillaBlocks::BRICKS()); $this->map(Ids::BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BRICK_STAIRS(), $in)); @@ -184,7 +184,7 @@ final class BlockStateDeserializer{ StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), default => throw $in->badValueException(BlockStateNames::CHEMISTRY_TABLE_TYPE, $type), - })->setFacing($in->readLegacyHorizontalFacing()); + })->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); }); $this->map(Ids::CHEST, function(BlockStateReader $in) : Block{ return VanillaBlocks::CHEST() @@ -198,7 +198,7 @@ final class BlockStateDeserializer{ $this->map(Ids::COCOA, function(BlockStateReader $in) : Block{ return VanillaBlocks::COCOA_POD() ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 2)) - ->setFacing($in->readLegacyHorizontalFacing()); + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); }); $this->map(Ids::COLORED_TORCH_BP, function(BlockStateReader $in) : Block{ return $in->readBool(BlockStateNames::COLOR_BIT) ? diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/BlockStateReader.php index 6d2eeb9298..992a34b821 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/BlockStateReader.php @@ -123,7 +123,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readEndRodFacingDirection() : int{ $result = $this->readFacingDirection(); - return Facing::axis($result) === Axis::Y ? Facing::opposite($result) : $result; + return Facing::axis($result) !== Axis::Y ? Facing::opposite($result) : $result; } /** @throws BlockStateDeserializeException */ diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index 8c705ca2fb..f4a680460a 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -327,8 +327,8 @@ final class BlockStateSerializer{ $this->map(VanillaBlocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ return Writer::create(Ids::BREWING_STAND) ->writeBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) - ->writeBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())) - ->writeBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())); + ->writeBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) + ->writeBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); }); $this->map(VanillaBlocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); $this->map(VanillaBlocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); @@ -374,7 +374,7 @@ final class BlockStateSerializer{ $this->map(VanillaBlocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ return Writer::create(Ids::COCOA) ->writeInt(BlockStateNames::AGE, $block->getAge()) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); $this->map(VanillaBlocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(VanillaBlocks::CONCRETE(), function(Concrete $block) : Writer{ diff --git a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php index e4a1ffaf30..81d6bedbb3 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/BlockStateSerializerHelper.php @@ -70,7 +70,7 @@ final class BlockStateSerializerHelper{ public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeString(BlockStateNames::CHEMISTRY_TABLE_TYPE, $chemistryTableType) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); } public static function encodeCrops(Crops $block, BlockStateWriter $out) : BlockStateWriter{ diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/BlockStateWriter.php index ef726c0a5c..a3db88c334 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/BlockStateWriter.php @@ -81,8 +81,8 @@ final class BlockStateWriter{ /** @return $this */ public function writeEndRodFacingDirection(int $value) : self{ - //end rods are stupid in bedrock and have up/down the wrong way round - return $this->writeFacingDirection(Facing::axis($value) === Axis::Y ? Facing::opposite($value) : $value); + //end rods are stupid in bedrock and have everything except up/down the wrong way round + return $this->writeFacingDirection(Facing::axis($value) !== Axis::Y ? Facing::opposite($value) : $value); } /** @return $this */ From f85f2cae98f1d37b48ce46ef6f7b5a9c5433eb5a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Feb 2022 20:02:12 +0000 Subject: [PATCH 0029/1858] fix CS --- src/data/bedrock/blockstate/BlockStateDeserializer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index e1ce89d795..068fcbc23a 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -37,7 +37,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\nbt\tag\CompoundTag; use function array_key_exists; use function min; From 0cc997f531c34dc684f73527e3e48930d42cc947 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 00:16:48 +0000 Subject: [PATCH 0030/1858] Checking in BlockStateUpgrader and a bunch of unit tests --- .../bedrock/blockstate/BlockStateData.php | 7 + .../upgrade/BlockStateUpgradeSchema.php | 70 +++++ .../upgrade/BlockStateUpgradeSchemaUtils.php | 221 ++++++++++++++++ .../BlockStateUpgradeSchemaValueRemap.php | 34 +++ .../blockstate/upgrade/BlockStateUpgrader.php | 163 ++++++++++++ .../LegacyIdMetaToBlockStateDataMap.php | 64 +++++ .../upgrade/BlockStateUpgraderTest.php | 240 ++++++++++++++++++ .../mcpe/convert/RuntimeBlockMappingTest.php | 39 +++ 8 files changed, 838 insertions(+) create mode 100644 src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php create mode 100644 src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php create mode 100644 src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php create mode 100644 src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php create mode 100644 src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php create mode 100644 tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php create mode 100644 tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php diff --git a/src/data/bedrock/blockstate/BlockStateData.php b/src/data/bedrock/blockstate/BlockStateData.php index c6485c748a..5d81152cac 100644 --- a/src/data/bedrock/blockstate/BlockStateData.php +++ b/src/data/bedrock/blockstate/BlockStateData.php @@ -85,4 +85,11 @@ final class BlockStateData{ ->setInt(self::TAG_VERSION, $this->version) ->setTag(self::TAG_STATES, $this->states); } + + public function equals(self $that) : bool{ + return + $this->name === $that->name && + $this->states->equals($that->states) && + $this->version === $that->version; + } } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php new file mode 100644 index 0000000000..b47c9f1feb --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -0,0 +1,70 @@ + + */ + public array $renamedIds = []; + + /** + * @var Tag[][] + * @phpstan-var array> + */ + public array $addedProperties = []; + + /** + * @var string[][] + * @phpstan-var array> + */ + public array $removedProperties = []; + + /** + * @var string[][] + * @phpstan-var array> + */ + public array $renamedProperties = []; + + /** + * @var ValueRemap[][][] + * @phpstan-var array>> + */ + public array $remappedPropertyValues = []; + + public function __construct( + public int $maxVersionMajor, + public int $maxVersionMinor, + public int $maxVersionPatch, + public int $maxVersionRevision + ){} + + public function getVersionId() : int{ + return ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; + } +} diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php new file mode 100644 index 0000000000..2430069cf4 --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -0,0 +1,221 @@ +renamedIds as $rename){ + $lines[] = "- $rename"; + } + $lines[] = "Added properties:"; + foreach(Utils::stringifyKeys($schema->addedProperties) as $blockName => $tags){ + foreach(Utils::stringifyKeys($tags) as $k => $v){ + $lines[] = "- $blockName has $k added: $v"; + } + } + + $lines[] = "Removed properties:"; + foreach(Utils::stringifyKeys($schema->removedProperties) as $blockName => $tagNames){ + foreach($tagNames as $tagName){ + $lines[] = "- $blockName has $tagName removed"; + } + } + $lines[] = "Renamed properties:"; + foreach(Utils::stringifyKeys($schema->renamedProperties) as $blockName => $tagNames){ + foreach(Utils::stringifyKeys($tagNames) as $oldTagName => $newTagName){ + $lines[] = "- $blockName has $oldTagName renamed to $newTagName"; + } + } + $lines[] = "Remapped property values:"; + foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $remaps){ + foreach(Utils::stringifyKeys($remaps) as $tagName => $oldNewList){ + foreach($oldNewList as $oldNew){ + $lines[] = "- $blockName has $tagName value changed from $oldNew->old to $oldNew->new"; + } + } + } + return implode("\n", $lines); + } + + private static function tagToJsonModel(Tag $tag) : BlockStateUpgradeSchemaModelTag{ + $type = match(get_class($tag)){ + IntTag::class => "int", + StringTag::class => "string", + ByteTag::class => "byte", + default => throw new \UnexpectedValueException() + }; + + return new BlockStateUpgradeSchemaModelTag($type, $tag->getValue()); + } + + private static function jsonModelToTag(BlockStateUpgradeSchemaModelTag $model) : Tag{ + if($model->type === "int"){ + if(!is_int($model->value)){ + throw new \UnexpectedValueException("Value for type int must be an int"); + } + return new IntTag($model->value); + }elseif($model->type === "byte"){ + if(!is_int($model->value)){ + throw new \UnexpectedValueException("Value for type byte must be an int"); + } + return new ByteTag($model->value); + }elseif($model->type === "string"){ + if(!is_string($model->value)){ + throw new \UnexpectedValueException("Value for type string must be a string"); + } + return new StringTag($model->value); + }else{ + throw new \UnexpectedValueException("Unknown blockstate value type $model->type"); + } + } + + public static function fromJsonModel(BlockStateUpgradeSchemaModel $model) : BlockStateUpgradeSchema{ + $result = new BlockStateUpgradeSchema( + $model->maxVersionMajor, + $model->maxVersionMinor, + $model->maxVersionPatch, + $model->maxVersionRevision + ); + $result->renamedIds = $model->renamedIds ?? []; + $result->renamedProperties = $model->renamedProperties ?? []; + $result->removedProperties = $model->removedProperties ?? []; + + foreach(Utils::stringifyKeys($model->addedProperties ?? []) as $blockName => $properties){ + foreach(Utils::stringifyKeys($properties) as $propertyName => $propertyValue){ + $result->addedProperties[$blockName][$propertyName] = self::jsonModelToTag($propertyValue); + } + } + + foreach(Utils::stringifyKeys($model->remappedPropertyValues ?? []) as $blockName => $properties){ + foreach(Utils::stringifyKeys($properties) as $property => $mappedValuesKey){ + foreach($mappedValuesKey as $oldNew){ + $result->remappedPropertyValues[$blockName][$property][] = new BlockStateUpgradeSchemaValueRemap( + self::jsonModelToTag($oldNew->old), + self::jsonModelToTag($oldNew->new) + ); + } + } + } + + return $result; + } + + public static function toJsonModel(BlockStateUpgradeSchema $schema) : BlockStateUpgradeSchemaModel{ + $result = new BlockStateUpgradeSchemaModel(); + $result->maxVersionMajor = $schema->maxVersionMajor; + $result->maxVersionMinor = $schema->maxVersionMinor; + $result->maxVersionPatch = $schema->maxVersionPatch; + $result->maxVersionRevision = $schema->maxVersionRevision; + $result->renamedIds = $schema->renamedIds; + $result->renamedProperties = $schema->renamedProperties; + $result->removedProperties = $schema->removedProperties; + + foreach(Utils::stringifyKeys($schema->addedProperties) as $blockName => $properties){ + foreach(Utils::stringifyKeys($properties) as $propertyName => $propertyValue){ + $result->addedProperties[$blockName][$propertyName] = self::tagToJsonModel($propertyValue); + } + } + + foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $properties){ + foreach(Utils::stringifyKeys($properties) as $property => $propertyValues){ + foreach($propertyValues as $oldNew){ + $result->remappedPropertyValues[$blockName][$property][] = (array) new BlockStateUpgradeSchemaModelValueRemap( + self::tagToJsonModel($oldNew->old), + self::tagToJsonModel($oldNew->new) + ); + } + } + } + + return $result; + } + + /** + * Returns a list of schemas ordered by priority. Oldest schemas appear first. + * + * @return BlockStateUpgradeSchema[] + */ + public static function loadSchemas(string $path) : array{ + $iterator = new \RegexIterator( + new \FilesystemIterator( + $path, + \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS + ), + '/\/mapping_schema_(\d{4}).*\.json$/', + \RegexIterator::GET_MATCH + ); + + $result = []; + + $jsonMapper = new \JsonMapper(); + /** @var string[] $matches */ + foreach($iterator as $matches){ + $filename = $matches[0]; + $priority = (int) $matches[1]; + + var_dump($filename); + + $fullPath = Path::join($path, $filename); + + //TODO: should we bother handling exceptions in here? + $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); + + $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); + if(!is_object($json)){ + throw new \RuntimeException("Unexpected root type of schema file $fullPath"); + } + $model = $jsonMapper->map($json, new BlockStateUpgradeSchemaModel()); + + $result[$priority] = self::fromJsonModel($model); + } + + ksort($result, SORT_NUMERIC); + return $result; + } +} diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php new file mode 100644 index 0000000000..38f3b1f3f4 --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php @@ -0,0 +1,34 @@ +upgradeSchemas[$schema->getVersionId()][$priority])){ + throw new \InvalidArgumentException("Another schema already has this priority"); + } + $this->upgradeSchemas[$schema->getVersionId()][$priority] = $schema; + ksort($this->upgradeSchemas, SORT_NUMERIC | SORT_ASC); + ksort($this->upgradeSchemas[$schema->getVersionId()], SORT_NUMERIC | SORT_ASC); + } + + public function upgrade(BlockStateData $blockStateData) : BlockStateData{ + $oldName = $blockStateData->getName(); + + $version = $blockStateData->getVersion(); + foreach($this->upgradeSchemas as $resultVersion => $schemas){ + if($version > $resultVersion){ + //even if this is actually the same version, we have to apply it anyway because mojang are dumb and + //didn't always bump the blockstate version when changing it :( + continue; + } + foreach($schemas as $schema){ + $newName = $schema->renamedIds[$oldName] ?? null; + + $stateChanges = 0; + $states = $blockStateData->getStates(); + + $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRenamedOrValueChanged($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyValueChanged($schema, $oldName, $states, $stateChanges); + + if($newName !== null || $stateChanges > 0){ + $blockStateData = new BlockStateData($newName ?? $oldName, $states, $resultVersion); + //don't break out; we may need to further upgrade the state + } + } + } + + return $blockStateData; + } + + private function cloneIfNeeded(CompoundTag $states, int &$stateChanges) : CompoundTag{ + if($stateChanges === 0){ + $states = clone $states; + } + $stateChanges++; + + return $states; + } + + private function applyPropertyAdded(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + $newStates = $states; + if(isset($schema->addedProperties[$oldName])){ + foreach(Utils::stringifyKeys($schema->addedProperties[$oldName]) as $propertyName => $value){ + $oldValue = $states->getTag($propertyName); + if($oldValue === null){ + $newStates = $this->cloneIfNeeded($newStates, $stateChanges); + $newStates->setTag($propertyName, $value); + } + } + } + + return $newStates; + } + + private function applyPropertyRemoved(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + $newStates = $states; + if(isset($schema->removedProperties[$oldName])){ + foreach($schema->removedProperties[$oldName] as $propertyName){ + if($states->getTag($propertyName) !== null){ + $newStates = $this->cloneIfNeeded($newStates, $stateChanges); + $newStates->removeTag($propertyName); + } + } + } + + return $newStates; + } + + private function locateNewPropertyValue(BlockStateUpgradeSchema $schema, string $oldName, string $oldPropertyName, Tag $oldValue) : Tag{ + if(isset($schema->remappedPropertyValues[$oldName][$oldPropertyName])){ + foreach($schema->remappedPropertyValues[$oldName][$oldPropertyName] as $mappedPair){ + if($mappedPair->old->equals($oldValue)){ + return $mappedPair->new; + } + } + } + + return $oldValue; + } + + private function applyPropertyRenamedOrValueChanged(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + if(isset($schema->renamedProperties[$oldName])){ + foreach(Utils::stringifyKeys($schema->renamedProperties[$oldName]) as $oldPropertyName => $newPropertyName){ + $oldValue = $states->getTag($oldPropertyName); + if($oldValue !== null){ + $states = $this->cloneIfNeeded($states, $stateChanges); + $states->removeTag($oldPropertyName); + + //If a value remap is needed, we need to do it here, since we won't be able to locate the property + //after it's been renamed - value remaps are always indexed by old property name for the sake of + //being able to do changes in any order. + $states->setTag($newPropertyName, $this->locateNewPropertyValue($schema, $oldName, $oldPropertyName, $oldValue)); + } + } + } + + return $states; + } + + private function applyPropertyValueChanged(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + if(isset($schema->remappedPropertyValues[$oldName])){ + foreach(Utils::stringifyKeys($schema->remappedPropertyValues[$oldName]) as $oldPropertyName => $remappedValues){ + $oldValue = $states->getTag($oldPropertyName); + if($oldValue !== null){ + $newValue = $this->locateNewPropertyValue($schema, $oldName, $oldPropertyName, $oldValue); + if($newValue !== $oldValue){ + $states = $this->cloneIfNeeded($states, $stateChanges); + $states->setTag($oldPropertyName, $newValue); + } + } + } + } + + return $states; + } +} diff --git a/src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php b/src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php new file mode 100644 index 0000000000..3ecf18a17f --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php @@ -0,0 +1,64 @@ +> $mappingTable + */ + public function __construct( + private array $mappingTable + ){} + + public function getDataFromLegacyIdMeta(string $id, int $meta) : ?BlockStateData{ + return $this->mappingTable[$id][$meta] ?? null; + } + + public static function loadFromString(string $data) : self{ + $mappingTable = []; + + $legacyStateMapReader = new BinaryStream($data); + $nbtReader = new NetworkNbtSerializer(); + while(!$legacyStateMapReader->feof()){ + $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); + $meta = $legacyStateMapReader->getLShort(); + + $offset = $legacyStateMapReader->getOffset(); + $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); + $legacyStateMapReader->setOffset($offset); + $mappingTable[$id][$meta] = BlockStateData::fromNbt($state); + } + + return new self($mappingTable); + } +} diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php new file mode 100644 index 0000000000..caf917ec4b --- /dev/null +++ b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php @@ -0,0 +1,240 @@ +upgrader = new BlockStateUpgrader(); + } + + private function getNewSchema() : BlockStateUpgradeSchema{ + return $this->getNewSchemaVersion(PHP_INT_MAX); + } + + private function getNewSchemaVersion(int $versionId) : BlockStateUpgradeSchema{ + $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff); + $this->upgrader->addSchema($schema, 0); + return $schema; + } + + /** + * @phpstan-param \Closure() : BlockStateData $getStateData + */ + private function upgrade(BlockStateData $stateData, \Closure $getStateData) : BlockStateData{ + $result = $this->upgrader->upgrade($stateData); + self::assertTrue($stateData->equals($getStateData()), "Upgrading states must not alter the original input"); + + return $result; + } + + public function testRenameId() : void{ + $this->getNewSchema()->renamedIds[self::TEST_BLOCK] = self::TEST_BLOCK_2; + + $getStateData = fn() => $this->getEmptyPreimage(); + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertSame($upgradedStateData->getName(), self::TEST_BLOCK_2); + } + + private function prepareAddPropertySchema(BlockStateUpgradeSchema $schema) : void{ + $schema->addedProperties[self::TEST_BLOCK][self::TEST_PROPERTY] = new IntTag(self::TEST_PROPERTY_VALUE_1); + } + + private function getEmptyPreimage() : BlockStateData{ + return new BlockStateData(self::TEST_BLOCK, CompoundTag::create(), self::TEST_VERSION); + } + + private function getPreimageOneProperty(string $propertyName, int $value) : BlockStateData{ + return new BlockStateData( + self::TEST_BLOCK, + CompoundTag::create()->setInt($propertyName, $value), + self::TEST_VERSION + ); + } + + public function testAddNewProperty() : void{ + $this->prepareAddPropertySchema($this->getNewSchema()); + + $getStateData = fn() => $this->getEmptyPreimage(); + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertSame(self::TEST_PROPERTY_VALUE_1, $upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)?->getValue()); + } + + public function testAddPropertyAlreadyExists() : void{ + $this->prepareAddPropertySchema($this->getNewSchema()); + + $getStateData = fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_1 + 1); + $stateData = $getStateData(); + $upgradedStateData = $this->upgrade($stateData, $getStateData); + + self::assertSame($stateData, $upgradedStateData, "Adding a property that already exists with a different value should not alter the state"); + } + + private function prepareRemovePropertySchema(BlockStateUpgradeSchema $schema) : void{ + $schema->removedProperties[self::TEST_BLOCK][] = self::TEST_PROPERTY; + } + + /** + * @phpstan-return \Generator + */ + public function removePropertyProvider() : \Generator{ + yield [fn() => $this->getEmptyPreimage()]; + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_1)]; + } + + /** + * @dataProvider removePropertyProvider + * @phpstan-param \Closure() : BlockStateData $getStateData + */ + public function testRemoveProperty(\Closure $getStateData) : void{ + $this->prepareRemovePropertySchema($this->getNewSchema()); + + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertNull($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)); + } + + private function prepareRenamePropertySchema(BlockStateUpgradeSchema $schema) : void{ + $schema->renamedProperties[self::TEST_BLOCK][self::TEST_PROPERTY] = self::TEST_PROPERTY_2; + } + + /** + * @phpstan-return \Generator + */ + public function renamePropertyProvider() : \Generator{ + yield [fn() => $this->getEmptyPreimage(), null]; + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_1), self::TEST_PROPERTY_VALUE_1]; + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY_2, self::TEST_PROPERTY_VALUE_1), self::TEST_PROPERTY_VALUE_1]; + } + + /** + * @dataProvider renamePropertyProvider + * @phpstan-param \Closure() : BlockStateData $getStateData + */ + public function testRenameProperty(\Closure $getStateData, ?int $valueAfter) : void{ + $this->prepareRenamePropertySchema($this->getNewSchema()); + + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertSame($valueAfter, $upgradedStateData->getStates()->getTag(self::TEST_PROPERTY_2)?->getValue()); + } + + private function prepareRemapPropertyValueSchema(BlockStateUpgradeSchema $schema) : void{ + $schema->remappedPropertyValues[self::TEST_BLOCK][self::TEST_PROPERTY][] = new BlockStateUpgradeSchemaValueRemap( + new IntTag(self::TEST_PROPERTY_VALUE_1), + new IntTag(self::TEST_PROPERTY_VALUE_2) + ); + } + + /** + * @phpstan-return \Generator + */ + public function remapPropertyValueProvider() : \Generator{ + //no property to remap + yield [fn() => $this->getEmptyPreimage(), null]; + + //value that will be remapped + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_1), self::TEST_PROPERTY_VALUE_2]; + + //value that is already at the target value + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_2), self::TEST_PROPERTY_VALUE_2]; + + //value that is not remapped and is different from target value (to detect unconditional overwrite bugs) + yield [fn() => $this->getPreimageOneProperty(self::TEST_PROPERTY, self::TEST_PROPERTY_VALUE_3), self::TEST_PROPERTY_VALUE_3]; + } + + /** + * @dataProvider remapPropertyValueProvider + * @phpstan-param \Closure() : BlockStateData $getStateData + */ + public function testRemapPropertyValue(\Closure $getStateData, ?int $valueAfter) : void{ + $this->prepareRemapPropertyValueSchema($this->getNewSchema()); + + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertSame($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)?->getValue(), $valueAfter); + } + + /** + * @dataProvider remapPropertyValueProvider + * @phpstan-param \Closure() : BlockStateData $getStateData + */ + public function testRemapAndRenameProperty(\Closure $getStateData, ?int $valueAfter) : void{ + $schema = $this->getNewSchema(); + $this->prepareRenamePropertySchema($schema); + $this->prepareRemapPropertyValueSchema($schema); + + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + + self::assertSame($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY_2)?->getValue(), $valueAfter); + } + + /** + * @phpstan-return \Generator + */ + public function upgraderVersionCompatibilityProvider() : \Generator{ + yield [0x1_00_00_00, 0x1_00_00_00, true]; //Same version: must be altered - this may be a backwards-compatible change that Mojang didn't bother to bump for + yield [0x1_00_01_00, 0x1_00_00_00, true]; //Schema newer than block: must be altered + yield [0x1_00_00_00, 0x1_00_01_00, false]; //Block newer than schema: block must NOT be altered + } + + /** + * @dataProvider upgraderVersionCompatibilityProvider + */ + public function testUpgraderVersionCompatibility(int $schemaVersion, int $stateVersion, bool $shouldChange) : void{ + $schema = $this->getNewSchemaVersion($schemaVersion); + $schema->renamedIds[self::TEST_BLOCK] = self::TEST_BLOCK_2; + + $getStateData = fn() => new BlockStateData( + self::TEST_BLOCK, + CompoundTag::create(), + $stateVersion + ); + + $upgradedStateData = $this->upgrade($getStateData(), $getStateData); + $originalStateData = $getStateData(); + + self::assertNotSame($shouldChange, $upgradedStateData->equals($originalStateData)); + } +} diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php new file mode 100644 index 0000000000..cc6b43dd66 --- /dev/null +++ b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php @@ -0,0 +1,39 @@ +getAllKnownStates() as $state){ + RuntimeBlockMapping::getInstance()->toRuntimeId($state->getFullId()); + } + } +} From 324d203f4ecbedf399d6628aa47ad8c4cece0221 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 00:21:26 +0000 Subject: [PATCH 0031/1858] Fuck you git --- .../model/BlockStateUpgradeSchemaModel.php | 83 +++++++++++++++++++ .../model/BlockStateUpgradeSchemaModelTag.php | 40 +++++++++ ...BlockStateUpgradeSchemaModelValueRemap.php | 36 ++++++++ 3 files changed, 159 insertions(+) create mode 100644 src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php create mode 100644 src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php create mode 100644 src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php new file mode 100644 index 0000000000..324cd13f4d --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -0,0 +1,83 @@ + + */ + public array $renamedIds; + + /** + * @var BlockStateUpgradeSchemaModelTag[][] + * @phpstan-var array> + */ + public array $addedProperties; + + /** + * @var string[][] + * @phpstan-var array> + */ + public array $removedProperties; + + /** + * @var string[][] + * @phpstan-var array> + */ + public array $renamedProperties; + + /** + * @var BlockStateUpgradeSchemaModelValueRemap[][][] + * @phpstan-var array>> + */ + public array $remappedPropertyValues; + + public function jsonSerialize() : array{ + $result = (array) $this; + + foreach($result as $k => $v){ + if(is_array($v) && count($v) === 0){ + unset($result[$k]); + } + } + + return $result; + } +} diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php new file mode 100644 index 0000000000..f34c489282 --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php @@ -0,0 +1,40 @@ +type = $type; + $this->value = $value; + } +} diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php new file mode 100644 index 0000000000..84d07dd46c --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php @@ -0,0 +1,36 @@ +old = $old; + $this->new = $new; + } +} From f33633efcbd239433c18cfccffe0ee582d7a76b8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 00:23:01 +0000 Subject: [PATCH 0032/1858] Remove rogue var_dump --- .../blockstate/upgrade/BlockStateUpgradeSchemaUtils.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 2430069cf4..ce8b7534ef 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -41,7 +41,6 @@ use function is_object; use function is_string; use function json_decode; use function ksort; -use function var_dump; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; @@ -199,8 +198,6 @@ final class BlockStateUpgradeSchemaUtils{ $filename = $matches[0]; $priority = (int) $matches[1]; - var_dump($filename); - $fullPath = Path::join($path, $filename); //TODO: should we bother handling exceptions in here? From 4d88f8f7f402a79b74648c1ba4f2eaa8c57fb9bf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 00:24:57 +0000 Subject: [PATCH 0033/1858] shut --- .../blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php index 324cd13f4d..4827082c98 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -69,6 +69,9 @@ final class BlockStateUpgradeSchemaModel implements \JsonSerializable{ */ public array $remappedPropertyValues; + /** + * @return mixed[] + */ public function jsonSerialize() : array{ $result = (array) $this; From 9fbb2ef46aa649d84671d396fde50dc5aee3f89b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 00:27:09 +0000 Subject: [PATCH 0034/1858] remove SORT_ASC --- src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index fcd20dc1cd..537700aa9e 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -28,7 +28,6 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use function ksort; -use const SORT_ASC; use const SORT_NUMERIC; final class BlockStateUpgrader{ @@ -40,8 +39,8 @@ final class BlockStateUpgrader{ throw new \InvalidArgumentException("Another schema already has this priority"); } $this->upgradeSchemas[$schema->getVersionId()][$priority] = $schema; - ksort($this->upgradeSchemas, SORT_NUMERIC | SORT_ASC); - ksort($this->upgradeSchemas[$schema->getVersionId()], SORT_NUMERIC | SORT_ASC); + ksort($this->upgradeSchemas, SORT_NUMERIC); + ksort($this->upgradeSchemas[$schema->getVersionId()], SORT_NUMERIC); } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ From 1155f9157433715572626d0007b7cf57f4f4c2d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 16:41:45 +0000 Subject: [PATCH 0035/1858] BlockStateSerializer: separate serializer registration from constructor --- src/data/bedrock/blockstate/BlockStateSerializer.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index f4a680460a..e6ebf258f4 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -157,6 +157,10 @@ final class BlockStateSerializer{ */ private array $serializers = []; + public function __construct(){ + $this->registerSerializers(); + } + /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $block @@ -206,7 +210,7 @@ final class BlockStateSerializer{ return $writer->getBlockStateData(); } - public function __construct(){ + private function registerSerializers() : void{ $this->map(VanillaBlocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); $this->map(VanillaBlocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); $this->map(VanillaBlocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) From 337aab4f0d950036bd29c8affac4d9a2251eafd4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 16:47:54 +0000 Subject: [PATCH 0036/1858] Use more class aliases to reduce code width --- .../blockstate/BlockStateDeserializer.php | 1996 +++++++++-------- .../blockstate/BlockStateSerializer.php | 1279 +++++------ 2 files changed, 1639 insertions(+), 1636 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 068fcbc23a..69972564ff 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -31,8 +31,10 @@ use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; -use pocketmine\block\VanillaBlocks; +use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\blockstate\BlockStateDeserializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; +use pocketmine\data\bedrock\blockstate\BlockStateReader as Reader; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; @@ -44,11 +46,11 @@ final class BlockStateDeserializer{ /** * @var \Closure[] - * @phpstan-var array + * @phpstan-var array */ private array $deserializeFuncs = []; - /** @phpstan-param \Closure(BlockStateReader) : Block $c */ + /** @phpstan-param \Closure(Reader) : Block $c */ private function map(string $id, \Closure $c) : void{ if(array_key_exists($id, $this->deserializeFuncs)){ throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); @@ -57,522 +59,522 @@ final class BlockStateDeserializer{ } public function __construct(){ - $this->map(Ids::ACACIA_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::ACACIA_BUTTON(), $in)); - $this->map(Ids::ACACIA_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::ACACIA_DOOR(), $in)); - $this->map(Ids::ACACIA_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::ACACIA_FENCE_GATE(), $in)); - $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::ACACIA_PRESSURE_PLATE(), $in)); - $this->map(Ids::ACACIA_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::ACACIA_STAIRS(), $in)); - $this->map(Ids::ACACIA_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::ACACIA_SIGN(), $in)); - $this->map(Ids::ACACIA_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::ACACIA_TRAPDOOR(), $in)); - $this->map(Ids::ACACIA_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::ACACIA_WALL_SIGN(), $in)); - $this->map(Ids::ACTIVATOR_RAIL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::ACTIVATOR_RAIL() - ->setPowered($in->readBool(BlockStateNames::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); + $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); + $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in)); + $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::ACACIA_PRESSURE_PLATE(), $in)); + $this->map(Ids::ACACIA_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::ACACIA_STAIRS(), $in)); + $this->map(Ids::ACACIA_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::ACACIA_SIGN(), $in)); + $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in)); + $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); + $this->map(Ids::ACTIVATOR_RAIL, function(Reader $in) : Block{ + return Blocks::ACTIVATOR_RAIL() + ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); - $this->map(Ids::AIR, fn() => VanillaBlocks::AIR()); - $this->map(Ids::ANDESITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::ANDESITE_STAIRS(), $in)); - $this->map(Ids::ANVIL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::ANVIL() - ->setDamage(match($value = $in->readString(BlockStateNames::DAMAGE)){ + $this->map(Ids::AIR, fn() => Blocks::AIR()); + $this->map(Ids::ANDESITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::ANDESITE_STAIRS(), $in)); + $this->map(Ids::ANVIL, function(Reader $in) : Block{ + return Blocks::ANVIL() + ->setDamage(match($value = $in->readString(StateNames::DAMAGE)){ StringValues::DAMAGE_UNDAMAGED => 0, StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, StringValues::DAMAGE_VERY_DAMAGED => 2, StringValues::DAMAGE_BROKEN => 0, - default => throw $in->badValueException(BlockStateNames::DAMAGE, $value), + default => throw $in->badValueException(StateNames::DAMAGE, $value), }) ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::BAMBOO, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BAMBOO() - ->setLeafSize(match($value = $in->readString(BlockStateNames::BAMBOO_LEAF_SIZE)){ + $this->map(Ids::BAMBOO, function(Reader $in) : Block{ + return Blocks::BAMBOO() + ->setLeafSize(match($value = $in->readString(StateNames::BAMBOO_LEAF_SIZE)){ StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, - default => throw $in->badValueException(BlockStateNames::BAMBOO_LEAF_SIZE, $value), + default => throw $in->badValueException(StateNames::BAMBOO_LEAF_SIZE, $value), }) - ->setReady($in->readBool(BlockStateNames::AGE_BIT)) - ->setThick(match($value = $in->readString(BlockStateNames::BAMBOO_STALK_THICKNESS)){ + ->setReady($in->readBool(StateNames::AGE_BIT)) + ->setThick(match($value = $in->readString(StateNames::BAMBOO_STALK_THICKNESS)){ StringValues::BAMBOO_STALK_THICKNESS_THIN => false, StringValues::BAMBOO_STALK_THICKNESS_THICK => true, - default => throw $in->badValueException(BlockStateNames::BAMBOO_STALK_THICKNESS, $value), + default => throw $in->badValueException(StateNames::BAMBOO_STALK_THICKNESS, $value), }); }); - $this->map(Ids::BAMBOO_SAPLING, function(BlockStateReader $in) : Block{ + $this->map(Ids::BAMBOO_SAPLING, function(Reader $in) : Block{ //TODO: sapling_type intentionally ignored (its presence is a bug) - return VanillaBlocks::BAMBOO_SAPLING()->setReady($in->readBool(BlockStateNames::AGE_BIT)); + return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT)); }); - $this->map(Ids::BARREL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BARREL() + $this->map(Ids::BARREL, function(Reader $in) : Block{ + return Blocks::BARREL() ->setFacing($in->readFacingDirection()) - ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); + ->setOpen($in->readBool(StateNames::OPEN_BIT)); }); - $this->map(Ids::BARRIER, fn() => VanillaBlocks::BARRIER()); - $this->map(Ids::BEACON, fn() => VanillaBlocks::BEACON()); - $this->map(Ids::BED, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BED() + $this->map(Ids::BARRIER, fn() => Blocks::BARRIER()); + $this->map(Ids::BEACON, fn() => Blocks::BEACON()); + $this->map(Ids::BED, function(Reader $in) : Block{ + return Blocks::BED() ->setFacing($in->readLegacyHorizontalFacing()) - ->setHead($in->readBool(BlockStateNames::HEAD_PIECE_BIT)) - ->setOccupied($in->readBool(BlockStateNames::OCCUPIED_BIT)); + ->setHead($in->readBool(StateNames::HEAD_PIECE_BIT)) + ->setOccupied($in->readBool(StateNames::OCCUPIED_BIT)); }); - $this->map(Ids::BEDROCK, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BEDROCK() - ->setBurnsForever($in->readBool(BlockStateNames::INFINIBURN_BIT)); + $this->map(Ids::BEDROCK, function(Reader $in) : Block{ + return Blocks::BEDROCK() + ->setBurnsForever($in->readBool(StateNames::INFINIBURN_BIT)); }); - $this->map(Ids::BEETROOT, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::BEETROOTS(), $in)); - $this->map(Ids::BELL, function(BlockStateReader $in) : Block{ + $this->map(Ids::BEETROOT, fn(Reader $in) => Helper::decodeCrops(Blocks::BEETROOTS(), $in)); + $this->map(Ids::BELL, function(Reader $in) : Block{ //TODO: ignored toggle_bit (appears to be internally used in MCPE only, useless for us) - return VanillaBlocks::BELL() + return Blocks::BELL() ->setFacing($in->readLegacyHorizontalFacing()) ->setAttachmentType($in->readBellAttachmentType()); }); - $this->map(Ids::BIRCH_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::BIRCH_BUTTON(), $in)); - $this->map(Ids::BIRCH_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::BIRCH_DOOR(), $in)); - $this->map(Ids::BIRCH_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::BIRCH_FENCE_GATE(), $in)); - $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::BIRCH_PRESSURE_PLATE(), $in)); - $this->map(Ids::BIRCH_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BIRCH_STAIRS(), $in)); - $this->map(Ids::BIRCH_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::BIRCH_SIGN(), $in)); - $this->map(Ids::BIRCH_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::BIRCH_TRAPDOOR(), $in)); - $this->map(Ids::BIRCH_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::BIRCH_WALL_SIGN(), $in)); - $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::BLAST_FURNACE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BLAST_FURNACE() + $this->map(Ids::BIRCH_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::BIRCH_BUTTON(), $in)); + $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in)); + $this->map(Ids::BIRCH_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::BIRCH_FENCE_GATE(), $in)); + $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::BIRCH_PRESSURE_PLATE(), $in)); + $this->map(Ids::BIRCH_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::BIRCH_STAIRS(), $in)); + $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); + $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); + $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); + $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BLACK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ + return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::BLUE_ICE, fn() => VanillaBlocks::BLUE_ICE()); - $this->map(Ids::BONE_BLOCK, function(BlockStateReader $in) : Block{ + $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); + $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ //TODO: intentionally ignored "deprecated" blockstate (useless) - return VanillaBlocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); + return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); }); - $this->map(Ids::BOOKSHELF, fn() => VanillaBlocks::BOOKSHELF()); - $this->map(Ids::BREWING_STAND, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BREWING_STAND() - ->setSlot(BrewingStandSlot::EAST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT)) - ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT)) - ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT)); + $this->map(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); + $this->map(Ids::BREWING_STAND, function(Reader $in) : Block{ + return Blocks::BREWING_STAND() + ->setSlot(BrewingStandSlot::EAST(), $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT)) + ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); }); - $this->map(Ids::BRICK_BLOCK, fn() => VanillaBlocks::BRICKS()); - $this->map(Ids::BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::BRICK_STAIRS(), $in)); - $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::BROWN_MUSHROOM, fn() => VanillaBlocks::BROWN_MUSHROOM()); - $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(BlockStateReader $in) => Helper::decodeMushroomBlock(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), $in)); - $this->map(Ids::CACTUS, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CACTUS() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + $this->map(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); + $this->map(Ids::BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::BRICK_STAIRS(), $in)); + $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BROWN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); + $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); + $this->map(Ids::CACTUS, function(Reader $in) : Block{ + return Blocks::CACTUS() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::CAKE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CAKE() - ->setBites($in->readBoundedInt(BlockStateNames::BITE_COUNTER, 0, 6)); + $this->map(Ids::CAKE, function(Reader $in) : Block{ + return Blocks::CAKE() + ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); }); - $this->map(Ids::CARPET, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CARPET() + $this->map(Ids::CARPET, function(Reader $in) : Block{ + return Blocks::CARPET() ->setColor($in->readColor()); }); - $this->map(Ids::CARROTS, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::CARROTS(), $in)); - $this->map(Ids::CARVED_PUMPKIN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CARVED_PUMPKIN() + $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); + $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ + return Blocks::CARVED_PUMPKIN() ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::CHEMICAL_HEAT, fn() => VanillaBlocks::CHEMICAL_HEAT()); - $this->map(Ids::CHEMISTRY_TABLE, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::CHEMISTRY_TABLE_TYPE)){ - StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => VanillaBlocks::COMPOUND_CREATOR(), - StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => VanillaBlocks::ELEMENT_CONSTRUCTOR(), - StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => VanillaBlocks::LAB_TABLE(), - StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => VanillaBlocks::MATERIAL_REDUCER(), - default => throw $in->badValueException(BlockStateNames::CHEMISTRY_TABLE_TYPE, $type), + $this->map(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT()); + $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ + StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), + StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => Blocks::ELEMENT_CONSTRUCTOR(), + StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => Blocks::LAB_TABLE(), + StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => Blocks::MATERIAL_REDUCER(), + default => throw $in->badValueException(StateNames::CHEMISTRY_TABLE_TYPE, $type), })->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); }); - $this->map(Ids::CHEST, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CHEST() + $this->map(Ids::CHEST, function(Reader $in) : Block{ + return Blocks::CHEST() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::CLAY, fn() => VanillaBlocks::CLAY()); - $this->map(Ids::COAL_BLOCK, fn() => VanillaBlocks::COAL()); - $this->map(Ids::COAL_ORE, fn() => VanillaBlocks::COAL_ORE()); - $this->map(Ids::COBBLESTONE, fn() => VanillaBlocks::COBBLESTONE()); - $this->map(Ids::COBBLESTONE_WALL, fn(BlockStateReader $in) => Helper::mapLegacyWallType($in)); - $this->map(Ids::COCOA, function(BlockStateReader $in) : Block{ - return VanillaBlocks::COCOA_POD() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 2)) + $this->map(Ids::CLAY, fn() => Blocks::CLAY()); + $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); + $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); + $this->map(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE()); + $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); + $this->map(Ids::COCOA, function(Reader $in) : Block{ + return Blocks::COCOA_POD() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 2)) ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); }); - $this->map(Ids::COLORED_TORCH_BP, function(BlockStateReader $in) : Block{ - return $in->readBool(BlockStateNames::COLOR_BIT) ? - VanillaBlocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : - VanillaBlocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); + $this->map(Ids::COLORED_TORCH_BP, function(Reader $in) : Block{ + return $in->readBool(StateNames::COLOR_BIT) ? + Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : + Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); }); - $this->map(Ids::COLORED_TORCH_RG, function(BlockStateReader $in) : Block{ - return $in->readBool(BlockStateNames::COLOR_BIT) ? - VanillaBlocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : - VanillaBlocks::RED_TORCH()->setFacing($in->readTorchFacing()); + $this->map(Ids::COLORED_TORCH_RG, function(Reader $in) : Block{ + return $in->readBool(StateNames::COLOR_BIT) ? + Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : + Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); }); - $this->map(Ids::CONCRETE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CONCRETE() + $this->map(Ids::CONCRETE, function(Reader $in) : Block{ + return Blocks::CONCRETE() ->setColor($in->readColor()); }); - $this->map(Ids::CONCRETEPOWDER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CONCRETE_POWDER() + $this->map(Ids::CONCRETEPOWDER, function(Reader $in) : Block{ + return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); }); - $this->map(Ids::CORAL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CORAL() + $this->map(Ids::CORAL, function(Reader $in) : Block{ + return Blocks::CORAL() ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); + ->setDead($in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_BLOCK, function(BlockStateReader $in) : Block{ - return VanillaBlocks::CORAL_BLOCK() + $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ + return Blocks::CORAL_BLOCK() ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)); + ->setDead($in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in) + $this->map(Ids::CORAL_FAN, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) ->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(BlockStateReader $in) => Helper::decodeFloorCoralFan(VanillaBlocks::CORAL_FAN(), $in) + $this->map(Ids::CORAL_FAN_DEAD, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) ->setDead(true)); - $this->map(Ids::CORAL_FAN_HANG, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); - $this->map(Ids::CORAL_FAN_HANG2, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(BlockStateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); - $this->map(Ids::CORAL_FAN_HANG3, fn(BlockStateReader $in) => Helper::decodeWallCoralFan(VanillaBlocks::WALL_CORAL_FAN(), $in) + $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); + $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); + $this->map(Ids::CORAL_FAN_HANG3, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType(CoralType::HORN())); - $this->map(Ids::CRAFTING_TABLE, fn() => VanillaBlocks::CRAFTING_TABLE()); - $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::DARK_OAK_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::DARK_OAK_BUTTON(), $in)); - $this->map(Ids::DARK_OAK_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::DARK_OAK_DOOR(), $in)); - $this->map(Ids::DARK_OAK_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::DARK_OAK_FENCE_GATE(), $in)); - $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), $in)); - $this->map(Ids::DARK_OAK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_OAK_STAIRS(), $in)); - $this->map(Ids::DARK_OAK_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::DARK_OAK_TRAPDOOR(), $in)); - $this->map(Ids::DARK_PRISMARINE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DARK_PRISMARINE_STAIRS(), $in)); - $this->map(Ids::DARKOAK_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::DARK_OAK_SIGN(), $in)); - $this->map(Ids::DARKOAK_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::DARK_OAK_WALL_SIGN(), $in)); - $this->map(Ids::DAYLIGHT_DETECTOR, fn(BlockStateReader $in) => Helper::decodeDaylightSensor(VanillaBlocks::DAYLIGHT_SENSOR(), $in) + $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); + $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::CYAN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); + $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); + $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); + $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in)); + $this->map(Ids::DARK_OAK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DARK_OAK_STAIRS(), $in)); + $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); + $this->map(Ids::DARK_PRISMARINE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DARK_PRISMARINE_STAIRS(), $in)); + $this->map(Ids::DARKOAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::DARK_OAK_SIGN(), $in)); + $this->map(Ids::DARKOAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::DARK_OAK_WALL_SIGN(), $in)); + $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) ->setInverted(false)); - $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(BlockStateReader $in) => Helper::decodeDaylightSensor(VanillaBlocks::DAYLIGHT_SENSOR(), $in) + $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) ->setInverted(true)); - $this->map(Ids::DEADBUSH, fn() => VanillaBlocks::DEAD_BUSH()); - $this->map(Ids::DETECTOR_RAIL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DETECTOR_RAIL() - ->setActivated($in->readBool(BlockStateNames::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + $this->map(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); + $this->map(Ids::DETECTOR_RAIL, function(Reader $in) : Block{ + return Blocks::DETECTOR_RAIL() + ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); - $this->map(Ids::DIAMOND_BLOCK, fn() => VanillaBlocks::DIAMOND()); - $this->map(Ids::DIAMOND_ORE, fn() => VanillaBlocks::DIAMOND_ORE()); - $this->map(Ids::DIORITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::DIORITE_STAIRS(), $in)); - $this->map(Ids::DIRT, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DIRT() - ->setCoarse(match($value = $in->readString(BlockStateNames::DIRT_TYPE)){ + $this->map(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); + $this->map(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); + $this->map(Ids::DIORITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DIORITE_STAIRS(), $in)); + $this->map(Ids::DIRT, function(Reader $in) : Block{ + return Blocks::DIRT() + ->setCoarse(match($value = $in->readString(StateNames::DIRT_TYPE)){ StringValues::DIRT_TYPE_NORMAL => false, StringValues::DIRT_TYPE_COARSE => true, - default => throw $in->badValueException(BlockStateNames::DIRT_TYPE, $value), + default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), }); }); - $this->map(Ids::DOUBLE_PLANT, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::DOUBLE_PLANT_TYPE)){ - StringValues::DOUBLE_PLANT_TYPE_FERN => VanillaBlocks::LARGE_FERN(), - StringValues::DOUBLE_PLANT_TYPE_GRASS => VanillaBlocks::DOUBLE_TALLGRASS(), - StringValues::DOUBLE_PLANT_TYPE_PAEONIA => VanillaBlocks::PEONY(), - StringValues::DOUBLE_PLANT_TYPE_ROSE => VanillaBlocks::ROSE_BUSH(), - StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => VanillaBlocks::SUNFLOWER(), - StringValues::DOUBLE_PLANT_TYPE_SYRINGA => VanillaBlocks::LILAC(), - default => throw $in->badValueException(BlockStateNames::DOUBLE_PLANT_TYPE, $type), - })->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)); + $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ + StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), + StringValues::DOUBLE_PLANT_TYPE_GRASS => Blocks::DOUBLE_TALLGRASS(), + StringValues::DOUBLE_PLANT_TYPE_PAEONIA => Blocks::PEONY(), + StringValues::DOUBLE_PLANT_TYPE_ROSE => Blocks::ROSE_BUSH(), + StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => Blocks::SUNFLOWER(), + StringValues::DOUBLE_PLANT_TYPE_SYRINGA => Blocks::LILAC(), + default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), + })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); - $this->map(Ids::DOUBLE_STONE_SLAB, function(BlockStateReader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_SLAB, function(Reader $in) : Block{ return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB2, function(BlockStateReader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_SLAB2, function(Reader $in) : Block{ return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB3, function(BlockStateReader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_SLAB3, function(Reader $in) : Block{ return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB4, function(BlockStateReader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_SLAB4, function(Reader $in) : Block{ return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_WOODEN_SLAB, function(BlockStateReader $in) : Block{ + $this->map(Ids::DOUBLE_WOODEN_SLAB, function(Reader $in) : Block{ return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DRAGON_EGG, fn() => VanillaBlocks::DRAGON_EGG()); - $this->map(Ids::DRIED_KELP_BLOCK, fn() => VanillaBlocks::DRIED_KELP()); - $this->map(Ids::ELEMENT_0, fn() => VanillaBlocks::ELEMENT_ZERO()); - $this->map(Ids::ELEMENT_1, fn() => VanillaBlocks::ELEMENT_HYDROGEN()); - $this->map(Ids::ELEMENT_10, fn() => VanillaBlocks::ELEMENT_NEON()); - $this->map(Ids::ELEMENT_100, fn() => VanillaBlocks::ELEMENT_FERMIUM()); - $this->map(Ids::ELEMENT_101, fn() => VanillaBlocks::ELEMENT_MENDELEVIUM()); - $this->map(Ids::ELEMENT_102, fn() => VanillaBlocks::ELEMENT_NOBELIUM()); - $this->map(Ids::ELEMENT_103, fn() => VanillaBlocks::ELEMENT_LAWRENCIUM()); - $this->map(Ids::ELEMENT_104, fn() => VanillaBlocks::ELEMENT_RUTHERFORDIUM()); - $this->map(Ids::ELEMENT_105, fn() => VanillaBlocks::ELEMENT_DUBNIUM()); - $this->map(Ids::ELEMENT_106, fn() => VanillaBlocks::ELEMENT_SEABORGIUM()); - $this->map(Ids::ELEMENT_107, fn() => VanillaBlocks::ELEMENT_BOHRIUM()); - $this->map(Ids::ELEMENT_108, fn() => VanillaBlocks::ELEMENT_HASSIUM()); - $this->map(Ids::ELEMENT_109, fn() => VanillaBlocks::ELEMENT_MEITNERIUM()); - $this->map(Ids::ELEMENT_11, fn() => VanillaBlocks::ELEMENT_SODIUM()); - $this->map(Ids::ELEMENT_110, fn() => VanillaBlocks::ELEMENT_DARMSTADTIUM()); - $this->map(Ids::ELEMENT_111, fn() => VanillaBlocks::ELEMENT_ROENTGENIUM()); - $this->map(Ids::ELEMENT_112, fn() => VanillaBlocks::ELEMENT_COPERNICIUM()); - $this->map(Ids::ELEMENT_113, fn() => VanillaBlocks::ELEMENT_NIHONIUM()); - $this->map(Ids::ELEMENT_114, fn() => VanillaBlocks::ELEMENT_FLEROVIUM()); - $this->map(Ids::ELEMENT_115, fn() => VanillaBlocks::ELEMENT_MOSCOVIUM()); - $this->map(Ids::ELEMENT_116, fn() => VanillaBlocks::ELEMENT_LIVERMORIUM()); - $this->map(Ids::ELEMENT_117, fn() => VanillaBlocks::ELEMENT_TENNESSINE()); - $this->map(Ids::ELEMENT_118, fn() => VanillaBlocks::ELEMENT_OGANESSON()); - $this->map(Ids::ELEMENT_12, fn() => VanillaBlocks::ELEMENT_MAGNESIUM()); - $this->map(Ids::ELEMENT_13, fn() => VanillaBlocks::ELEMENT_ALUMINUM()); - $this->map(Ids::ELEMENT_14, fn() => VanillaBlocks::ELEMENT_SILICON()); - $this->map(Ids::ELEMENT_15, fn() => VanillaBlocks::ELEMENT_PHOSPHORUS()); - $this->map(Ids::ELEMENT_16, fn() => VanillaBlocks::ELEMENT_SULFUR()); - $this->map(Ids::ELEMENT_17, fn() => VanillaBlocks::ELEMENT_CHLORINE()); - $this->map(Ids::ELEMENT_18, fn() => VanillaBlocks::ELEMENT_ARGON()); - $this->map(Ids::ELEMENT_19, fn() => VanillaBlocks::ELEMENT_POTASSIUM()); - $this->map(Ids::ELEMENT_2, fn() => VanillaBlocks::ELEMENT_HELIUM()); - $this->map(Ids::ELEMENT_20, fn() => VanillaBlocks::ELEMENT_CALCIUM()); - $this->map(Ids::ELEMENT_21, fn() => VanillaBlocks::ELEMENT_SCANDIUM()); - $this->map(Ids::ELEMENT_22, fn() => VanillaBlocks::ELEMENT_TITANIUM()); - $this->map(Ids::ELEMENT_23, fn() => VanillaBlocks::ELEMENT_VANADIUM()); - $this->map(Ids::ELEMENT_24, fn() => VanillaBlocks::ELEMENT_CHROMIUM()); - $this->map(Ids::ELEMENT_25, fn() => VanillaBlocks::ELEMENT_MANGANESE()); - $this->map(Ids::ELEMENT_26, fn() => VanillaBlocks::ELEMENT_IRON()); - $this->map(Ids::ELEMENT_27, fn() => VanillaBlocks::ELEMENT_COBALT()); - $this->map(Ids::ELEMENT_28, fn() => VanillaBlocks::ELEMENT_NICKEL()); - $this->map(Ids::ELEMENT_29, fn() => VanillaBlocks::ELEMENT_COPPER()); - $this->map(Ids::ELEMENT_3, fn() => VanillaBlocks::ELEMENT_LITHIUM()); - $this->map(Ids::ELEMENT_30, fn() => VanillaBlocks::ELEMENT_ZINC()); - $this->map(Ids::ELEMENT_31, fn() => VanillaBlocks::ELEMENT_GALLIUM()); - $this->map(Ids::ELEMENT_32, fn() => VanillaBlocks::ELEMENT_GERMANIUM()); - $this->map(Ids::ELEMENT_33, fn() => VanillaBlocks::ELEMENT_ARSENIC()); - $this->map(Ids::ELEMENT_34, fn() => VanillaBlocks::ELEMENT_SELENIUM()); - $this->map(Ids::ELEMENT_35, fn() => VanillaBlocks::ELEMENT_BROMINE()); - $this->map(Ids::ELEMENT_36, fn() => VanillaBlocks::ELEMENT_KRYPTON()); - $this->map(Ids::ELEMENT_37, fn() => VanillaBlocks::ELEMENT_RUBIDIUM()); - $this->map(Ids::ELEMENT_38, fn() => VanillaBlocks::ELEMENT_STRONTIUM()); - $this->map(Ids::ELEMENT_39, fn() => VanillaBlocks::ELEMENT_YTTRIUM()); - $this->map(Ids::ELEMENT_4, fn() => VanillaBlocks::ELEMENT_BERYLLIUM()); - $this->map(Ids::ELEMENT_40, fn() => VanillaBlocks::ELEMENT_ZIRCONIUM()); - $this->map(Ids::ELEMENT_41, fn() => VanillaBlocks::ELEMENT_NIOBIUM()); - $this->map(Ids::ELEMENT_42, fn() => VanillaBlocks::ELEMENT_MOLYBDENUM()); - $this->map(Ids::ELEMENT_43, fn() => VanillaBlocks::ELEMENT_TECHNETIUM()); - $this->map(Ids::ELEMENT_44, fn() => VanillaBlocks::ELEMENT_RUTHENIUM()); - $this->map(Ids::ELEMENT_45, fn() => VanillaBlocks::ELEMENT_RHODIUM()); - $this->map(Ids::ELEMENT_46, fn() => VanillaBlocks::ELEMENT_PALLADIUM()); - $this->map(Ids::ELEMENT_47, fn() => VanillaBlocks::ELEMENT_SILVER()); - $this->map(Ids::ELEMENT_48, fn() => VanillaBlocks::ELEMENT_CADMIUM()); - $this->map(Ids::ELEMENT_49, fn() => VanillaBlocks::ELEMENT_INDIUM()); - $this->map(Ids::ELEMENT_5, fn() => VanillaBlocks::ELEMENT_BORON()); - $this->map(Ids::ELEMENT_50, fn() => VanillaBlocks::ELEMENT_TIN()); - $this->map(Ids::ELEMENT_51, fn() => VanillaBlocks::ELEMENT_ANTIMONY()); - $this->map(Ids::ELEMENT_52, fn() => VanillaBlocks::ELEMENT_TELLURIUM()); - $this->map(Ids::ELEMENT_53, fn() => VanillaBlocks::ELEMENT_IODINE()); - $this->map(Ids::ELEMENT_54, fn() => VanillaBlocks::ELEMENT_XENON()); - $this->map(Ids::ELEMENT_55, fn() => VanillaBlocks::ELEMENT_CESIUM()); - $this->map(Ids::ELEMENT_56, fn() => VanillaBlocks::ELEMENT_BARIUM()); - $this->map(Ids::ELEMENT_57, fn() => VanillaBlocks::ELEMENT_LANTHANUM()); - $this->map(Ids::ELEMENT_58, fn() => VanillaBlocks::ELEMENT_CERIUM()); - $this->map(Ids::ELEMENT_59, fn() => VanillaBlocks::ELEMENT_PRASEODYMIUM()); - $this->map(Ids::ELEMENT_6, fn() => VanillaBlocks::ELEMENT_CARBON()); - $this->map(Ids::ELEMENT_60, fn() => VanillaBlocks::ELEMENT_NEODYMIUM()); - $this->map(Ids::ELEMENT_61, fn() => VanillaBlocks::ELEMENT_PROMETHIUM()); - $this->map(Ids::ELEMENT_62, fn() => VanillaBlocks::ELEMENT_SAMARIUM()); - $this->map(Ids::ELEMENT_63, fn() => VanillaBlocks::ELEMENT_EUROPIUM()); - $this->map(Ids::ELEMENT_64, fn() => VanillaBlocks::ELEMENT_GADOLINIUM()); - $this->map(Ids::ELEMENT_65, fn() => VanillaBlocks::ELEMENT_TERBIUM()); - $this->map(Ids::ELEMENT_66, fn() => VanillaBlocks::ELEMENT_DYSPROSIUM()); - $this->map(Ids::ELEMENT_67, fn() => VanillaBlocks::ELEMENT_HOLMIUM()); - $this->map(Ids::ELEMENT_68, fn() => VanillaBlocks::ELEMENT_ERBIUM()); - $this->map(Ids::ELEMENT_69, fn() => VanillaBlocks::ELEMENT_THULIUM()); - $this->map(Ids::ELEMENT_7, fn() => VanillaBlocks::ELEMENT_NITROGEN()); - $this->map(Ids::ELEMENT_70, fn() => VanillaBlocks::ELEMENT_YTTERBIUM()); - $this->map(Ids::ELEMENT_71, fn() => VanillaBlocks::ELEMENT_LUTETIUM()); - $this->map(Ids::ELEMENT_72, fn() => VanillaBlocks::ELEMENT_HAFNIUM()); - $this->map(Ids::ELEMENT_73, fn() => VanillaBlocks::ELEMENT_TANTALUM()); - $this->map(Ids::ELEMENT_74, fn() => VanillaBlocks::ELEMENT_TUNGSTEN()); - $this->map(Ids::ELEMENT_75, fn() => VanillaBlocks::ELEMENT_RHENIUM()); - $this->map(Ids::ELEMENT_76, fn() => VanillaBlocks::ELEMENT_OSMIUM()); - $this->map(Ids::ELEMENT_77, fn() => VanillaBlocks::ELEMENT_IRIDIUM()); - $this->map(Ids::ELEMENT_78, fn() => VanillaBlocks::ELEMENT_PLATINUM()); - $this->map(Ids::ELEMENT_79, fn() => VanillaBlocks::ELEMENT_GOLD()); - $this->map(Ids::ELEMENT_8, fn() => VanillaBlocks::ELEMENT_OXYGEN()); - $this->map(Ids::ELEMENT_80, fn() => VanillaBlocks::ELEMENT_MERCURY()); - $this->map(Ids::ELEMENT_81, fn() => VanillaBlocks::ELEMENT_THALLIUM()); - $this->map(Ids::ELEMENT_82, fn() => VanillaBlocks::ELEMENT_LEAD()); - $this->map(Ids::ELEMENT_83, fn() => VanillaBlocks::ELEMENT_BISMUTH()); - $this->map(Ids::ELEMENT_84, fn() => VanillaBlocks::ELEMENT_POLONIUM()); - $this->map(Ids::ELEMENT_85, fn() => VanillaBlocks::ELEMENT_ASTATINE()); - $this->map(Ids::ELEMENT_86, fn() => VanillaBlocks::ELEMENT_RADON()); - $this->map(Ids::ELEMENT_87, fn() => VanillaBlocks::ELEMENT_FRANCIUM()); - $this->map(Ids::ELEMENT_88, fn() => VanillaBlocks::ELEMENT_RADIUM()); - $this->map(Ids::ELEMENT_89, fn() => VanillaBlocks::ELEMENT_ACTINIUM()); - $this->map(Ids::ELEMENT_9, fn() => VanillaBlocks::ELEMENT_FLUORINE()); - $this->map(Ids::ELEMENT_90, fn() => VanillaBlocks::ELEMENT_THORIUM()); - $this->map(Ids::ELEMENT_91, fn() => VanillaBlocks::ELEMENT_PROTACTINIUM()); - $this->map(Ids::ELEMENT_92, fn() => VanillaBlocks::ELEMENT_URANIUM()); - $this->map(Ids::ELEMENT_93, fn() => VanillaBlocks::ELEMENT_NEPTUNIUM()); - $this->map(Ids::ELEMENT_94, fn() => VanillaBlocks::ELEMENT_PLUTONIUM()); - $this->map(Ids::ELEMENT_95, fn() => VanillaBlocks::ELEMENT_AMERICIUM()); - $this->map(Ids::ELEMENT_96, fn() => VanillaBlocks::ELEMENT_CURIUM()); - $this->map(Ids::ELEMENT_97, fn() => VanillaBlocks::ELEMENT_BERKELIUM()); - $this->map(Ids::ELEMENT_98, fn() => VanillaBlocks::ELEMENT_CALIFORNIUM()); - $this->map(Ids::ELEMENT_99, fn() => VanillaBlocks::ELEMENT_EINSTEINIUM()); - $this->map(Ids::EMERALD_BLOCK, fn() => VanillaBlocks::EMERALD()); - $this->map(Ids::EMERALD_ORE, fn() => VanillaBlocks::EMERALD_ORE()); - $this->map(Ids::ENCHANTING_TABLE, fn() => VanillaBlocks::ENCHANTING_TABLE()); - $this->map(Ids::END_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::END_STONE_BRICK_STAIRS(), $in)); - $this->map(Ids::END_BRICKS, fn() => VanillaBlocks::END_STONE_BRICKS()); - $this->map(Ids::END_PORTAL_FRAME, function(BlockStateReader $in) : Block{ - return VanillaBlocks::END_PORTAL_FRAME() - ->setEye($in->readBool(BlockStateNames::END_PORTAL_EYE_BIT)) + $this->map(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); + $this->map(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP()); + $this->map(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO()); + $this->map(Ids::ELEMENT_1, fn() => Blocks::ELEMENT_HYDROGEN()); + $this->map(Ids::ELEMENT_10, fn() => Blocks::ELEMENT_NEON()); + $this->map(Ids::ELEMENT_100, fn() => Blocks::ELEMENT_FERMIUM()); + $this->map(Ids::ELEMENT_101, fn() => Blocks::ELEMENT_MENDELEVIUM()); + $this->map(Ids::ELEMENT_102, fn() => Blocks::ELEMENT_NOBELIUM()); + $this->map(Ids::ELEMENT_103, fn() => Blocks::ELEMENT_LAWRENCIUM()); + $this->map(Ids::ELEMENT_104, fn() => Blocks::ELEMENT_RUTHERFORDIUM()); + $this->map(Ids::ELEMENT_105, fn() => Blocks::ELEMENT_DUBNIUM()); + $this->map(Ids::ELEMENT_106, fn() => Blocks::ELEMENT_SEABORGIUM()); + $this->map(Ids::ELEMENT_107, fn() => Blocks::ELEMENT_BOHRIUM()); + $this->map(Ids::ELEMENT_108, fn() => Blocks::ELEMENT_HASSIUM()); + $this->map(Ids::ELEMENT_109, fn() => Blocks::ELEMENT_MEITNERIUM()); + $this->map(Ids::ELEMENT_11, fn() => Blocks::ELEMENT_SODIUM()); + $this->map(Ids::ELEMENT_110, fn() => Blocks::ELEMENT_DARMSTADTIUM()); + $this->map(Ids::ELEMENT_111, fn() => Blocks::ELEMENT_ROENTGENIUM()); + $this->map(Ids::ELEMENT_112, fn() => Blocks::ELEMENT_COPERNICIUM()); + $this->map(Ids::ELEMENT_113, fn() => Blocks::ELEMENT_NIHONIUM()); + $this->map(Ids::ELEMENT_114, fn() => Blocks::ELEMENT_FLEROVIUM()); + $this->map(Ids::ELEMENT_115, fn() => Blocks::ELEMENT_MOSCOVIUM()); + $this->map(Ids::ELEMENT_116, fn() => Blocks::ELEMENT_LIVERMORIUM()); + $this->map(Ids::ELEMENT_117, fn() => Blocks::ELEMENT_TENNESSINE()); + $this->map(Ids::ELEMENT_118, fn() => Blocks::ELEMENT_OGANESSON()); + $this->map(Ids::ELEMENT_12, fn() => Blocks::ELEMENT_MAGNESIUM()); + $this->map(Ids::ELEMENT_13, fn() => Blocks::ELEMENT_ALUMINUM()); + $this->map(Ids::ELEMENT_14, fn() => Blocks::ELEMENT_SILICON()); + $this->map(Ids::ELEMENT_15, fn() => Blocks::ELEMENT_PHOSPHORUS()); + $this->map(Ids::ELEMENT_16, fn() => Blocks::ELEMENT_SULFUR()); + $this->map(Ids::ELEMENT_17, fn() => Blocks::ELEMENT_CHLORINE()); + $this->map(Ids::ELEMENT_18, fn() => Blocks::ELEMENT_ARGON()); + $this->map(Ids::ELEMENT_19, fn() => Blocks::ELEMENT_POTASSIUM()); + $this->map(Ids::ELEMENT_2, fn() => Blocks::ELEMENT_HELIUM()); + $this->map(Ids::ELEMENT_20, fn() => Blocks::ELEMENT_CALCIUM()); + $this->map(Ids::ELEMENT_21, fn() => Blocks::ELEMENT_SCANDIUM()); + $this->map(Ids::ELEMENT_22, fn() => Blocks::ELEMENT_TITANIUM()); + $this->map(Ids::ELEMENT_23, fn() => Blocks::ELEMENT_VANADIUM()); + $this->map(Ids::ELEMENT_24, fn() => Blocks::ELEMENT_CHROMIUM()); + $this->map(Ids::ELEMENT_25, fn() => Blocks::ELEMENT_MANGANESE()); + $this->map(Ids::ELEMENT_26, fn() => Blocks::ELEMENT_IRON()); + $this->map(Ids::ELEMENT_27, fn() => Blocks::ELEMENT_COBALT()); + $this->map(Ids::ELEMENT_28, fn() => Blocks::ELEMENT_NICKEL()); + $this->map(Ids::ELEMENT_29, fn() => Blocks::ELEMENT_COPPER()); + $this->map(Ids::ELEMENT_3, fn() => Blocks::ELEMENT_LITHIUM()); + $this->map(Ids::ELEMENT_30, fn() => Blocks::ELEMENT_ZINC()); + $this->map(Ids::ELEMENT_31, fn() => Blocks::ELEMENT_GALLIUM()); + $this->map(Ids::ELEMENT_32, fn() => Blocks::ELEMENT_GERMANIUM()); + $this->map(Ids::ELEMENT_33, fn() => Blocks::ELEMENT_ARSENIC()); + $this->map(Ids::ELEMENT_34, fn() => Blocks::ELEMENT_SELENIUM()); + $this->map(Ids::ELEMENT_35, fn() => Blocks::ELEMENT_BROMINE()); + $this->map(Ids::ELEMENT_36, fn() => Blocks::ELEMENT_KRYPTON()); + $this->map(Ids::ELEMENT_37, fn() => Blocks::ELEMENT_RUBIDIUM()); + $this->map(Ids::ELEMENT_38, fn() => Blocks::ELEMENT_STRONTIUM()); + $this->map(Ids::ELEMENT_39, fn() => Blocks::ELEMENT_YTTRIUM()); + $this->map(Ids::ELEMENT_4, fn() => Blocks::ELEMENT_BERYLLIUM()); + $this->map(Ids::ELEMENT_40, fn() => Blocks::ELEMENT_ZIRCONIUM()); + $this->map(Ids::ELEMENT_41, fn() => Blocks::ELEMENT_NIOBIUM()); + $this->map(Ids::ELEMENT_42, fn() => Blocks::ELEMENT_MOLYBDENUM()); + $this->map(Ids::ELEMENT_43, fn() => Blocks::ELEMENT_TECHNETIUM()); + $this->map(Ids::ELEMENT_44, fn() => Blocks::ELEMENT_RUTHENIUM()); + $this->map(Ids::ELEMENT_45, fn() => Blocks::ELEMENT_RHODIUM()); + $this->map(Ids::ELEMENT_46, fn() => Blocks::ELEMENT_PALLADIUM()); + $this->map(Ids::ELEMENT_47, fn() => Blocks::ELEMENT_SILVER()); + $this->map(Ids::ELEMENT_48, fn() => Blocks::ELEMENT_CADMIUM()); + $this->map(Ids::ELEMENT_49, fn() => Blocks::ELEMENT_INDIUM()); + $this->map(Ids::ELEMENT_5, fn() => Blocks::ELEMENT_BORON()); + $this->map(Ids::ELEMENT_50, fn() => Blocks::ELEMENT_TIN()); + $this->map(Ids::ELEMENT_51, fn() => Blocks::ELEMENT_ANTIMONY()); + $this->map(Ids::ELEMENT_52, fn() => Blocks::ELEMENT_TELLURIUM()); + $this->map(Ids::ELEMENT_53, fn() => Blocks::ELEMENT_IODINE()); + $this->map(Ids::ELEMENT_54, fn() => Blocks::ELEMENT_XENON()); + $this->map(Ids::ELEMENT_55, fn() => Blocks::ELEMENT_CESIUM()); + $this->map(Ids::ELEMENT_56, fn() => Blocks::ELEMENT_BARIUM()); + $this->map(Ids::ELEMENT_57, fn() => Blocks::ELEMENT_LANTHANUM()); + $this->map(Ids::ELEMENT_58, fn() => Blocks::ELEMENT_CERIUM()); + $this->map(Ids::ELEMENT_59, fn() => Blocks::ELEMENT_PRASEODYMIUM()); + $this->map(Ids::ELEMENT_6, fn() => Blocks::ELEMENT_CARBON()); + $this->map(Ids::ELEMENT_60, fn() => Blocks::ELEMENT_NEODYMIUM()); + $this->map(Ids::ELEMENT_61, fn() => Blocks::ELEMENT_PROMETHIUM()); + $this->map(Ids::ELEMENT_62, fn() => Blocks::ELEMENT_SAMARIUM()); + $this->map(Ids::ELEMENT_63, fn() => Blocks::ELEMENT_EUROPIUM()); + $this->map(Ids::ELEMENT_64, fn() => Blocks::ELEMENT_GADOLINIUM()); + $this->map(Ids::ELEMENT_65, fn() => Blocks::ELEMENT_TERBIUM()); + $this->map(Ids::ELEMENT_66, fn() => Blocks::ELEMENT_DYSPROSIUM()); + $this->map(Ids::ELEMENT_67, fn() => Blocks::ELEMENT_HOLMIUM()); + $this->map(Ids::ELEMENT_68, fn() => Blocks::ELEMENT_ERBIUM()); + $this->map(Ids::ELEMENT_69, fn() => Blocks::ELEMENT_THULIUM()); + $this->map(Ids::ELEMENT_7, fn() => Blocks::ELEMENT_NITROGEN()); + $this->map(Ids::ELEMENT_70, fn() => Blocks::ELEMENT_YTTERBIUM()); + $this->map(Ids::ELEMENT_71, fn() => Blocks::ELEMENT_LUTETIUM()); + $this->map(Ids::ELEMENT_72, fn() => Blocks::ELEMENT_HAFNIUM()); + $this->map(Ids::ELEMENT_73, fn() => Blocks::ELEMENT_TANTALUM()); + $this->map(Ids::ELEMENT_74, fn() => Blocks::ELEMENT_TUNGSTEN()); + $this->map(Ids::ELEMENT_75, fn() => Blocks::ELEMENT_RHENIUM()); + $this->map(Ids::ELEMENT_76, fn() => Blocks::ELEMENT_OSMIUM()); + $this->map(Ids::ELEMENT_77, fn() => Blocks::ELEMENT_IRIDIUM()); + $this->map(Ids::ELEMENT_78, fn() => Blocks::ELEMENT_PLATINUM()); + $this->map(Ids::ELEMENT_79, fn() => Blocks::ELEMENT_GOLD()); + $this->map(Ids::ELEMENT_8, fn() => Blocks::ELEMENT_OXYGEN()); + $this->map(Ids::ELEMENT_80, fn() => Blocks::ELEMENT_MERCURY()); + $this->map(Ids::ELEMENT_81, fn() => Blocks::ELEMENT_THALLIUM()); + $this->map(Ids::ELEMENT_82, fn() => Blocks::ELEMENT_LEAD()); + $this->map(Ids::ELEMENT_83, fn() => Blocks::ELEMENT_BISMUTH()); + $this->map(Ids::ELEMENT_84, fn() => Blocks::ELEMENT_POLONIUM()); + $this->map(Ids::ELEMENT_85, fn() => Blocks::ELEMENT_ASTATINE()); + $this->map(Ids::ELEMENT_86, fn() => Blocks::ELEMENT_RADON()); + $this->map(Ids::ELEMENT_87, fn() => Blocks::ELEMENT_FRANCIUM()); + $this->map(Ids::ELEMENT_88, fn() => Blocks::ELEMENT_RADIUM()); + $this->map(Ids::ELEMENT_89, fn() => Blocks::ELEMENT_ACTINIUM()); + $this->map(Ids::ELEMENT_9, fn() => Blocks::ELEMENT_FLUORINE()); + $this->map(Ids::ELEMENT_90, fn() => Blocks::ELEMENT_THORIUM()); + $this->map(Ids::ELEMENT_91, fn() => Blocks::ELEMENT_PROTACTINIUM()); + $this->map(Ids::ELEMENT_92, fn() => Blocks::ELEMENT_URANIUM()); + $this->map(Ids::ELEMENT_93, fn() => Blocks::ELEMENT_NEPTUNIUM()); + $this->map(Ids::ELEMENT_94, fn() => Blocks::ELEMENT_PLUTONIUM()); + $this->map(Ids::ELEMENT_95, fn() => Blocks::ELEMENT_AMERICIUM()); + $this->map(Ids::ELEMENT_96, fn() => Blocks::ELEMENT_CURIUM()); + $this->map(Ids::ELEMENT_97, fn() => Blocks::ELEMENT_BERKELIUM()); + $this->map(Ids::ELEMENT_98, fn() => Blocks::ELEMENT_CALIFORNIUM()); + $this->map(Ids::ELEMENT_99, fn() => Blocks::ELEMENT_EINSTEINIUM()); + $this->map(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD()); + $this->map(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE()); + $this->map(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); + $this->map(Ids::END_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::END_STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); + $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ + return Blocks::END_PORTAL_FRAME() + ->setEye($in->readBool(StateNames::END_PORTAL_EYE_BIT)) ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::END_ROD, function(BlockStateReader $in) : Block{ - return VanillaBlocks::END_ROD() + $this->map(Ids::END_ROD, function(Reader $in) : Block{ + return Blocks::END_ROD() ->setFacing($in->readEndRodFacingDirection()); }); - $this->map(Ids::END_STONE, fn() => VanillaBlocks::END_STONE()); - $this->map(Ids::ENDER_CHEST, function(BlockStateReader $in) : Block{ - return VanillaBlocks::ENDER_CHEST() + $this->map(Ids::END_STONE, fn() => Blocks::END_STONE()); + $this->map(Ids::ENDER_CHEST, function(Reader $in) : Block{ + return Blocks::ENDER_CHEST() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::FARMLAND, function(BlockStateReader $in) : Block{ - return VanillaBlocks::FARMLAND() - ->setWetness($in->readBoundedInt(BlockStateNames::MOISTURIZED_AMOUNT, 0, 7)); + $this->map(Ids::FARMLAND, function(Reader $in) : Block{ + return Blocks::FARMLAND() + ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7)); }); - $this->map(Ids::FENCE, function(BlockStateReader $in) : Block{ - return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_FENCE(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_FENCE(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_FENCE(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_FENCE(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_FENCE(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_FENCE(), - default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), + $this->map(Ids::FENCE, function(Reader $in) : Block{ + return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => Blocks::OAK_FENCE(), + StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_FENCE(), + StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_FENCE(), + StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_FENCE(), + StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_FENCE(), + StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_FENCE(), + default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodName), }; }); - $this->map(Ids::FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::OAK_FENCE_GATE(), $in)); - $this->map(Ids::FIRE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::FIRE() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + $this->map(Ids::FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::OAK_FENCE_GATE(), $in)); + $this->map(Ids::FIRE, function(Reader $in) : Block{ + return Blocks::FIRE() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::FLETCHING_TABLE, fn() => VanillaBlocks::FLETCHING_TABLE()); + $this->map(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); $this->map(Ids::FLOWER_POT, function() : Block{ //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) - return VanillaBlocks::FLOWER_POT(); + return Blocks::FLOWER_POT(); }); - $this->map(Ids::FLOWING_LAVA, fn(BlockStateReader $in) => Helper::decodeFlowingLiquid(VanillaBlocks::LAVA(), $in)); - $this->map(Ids::FLOWING_WATER, fn(BlockStateReader $in) => Helper::decodeFlowingLiquid(VanillaBlocks::WATER(), $in)); - $this->map(Ids::FRAME, function(BlockStateReader $in) : Block{ + $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in)); + $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in)); + $this->map(Ids::FRAME, function(Reader $in) : Block{ //TODO: in R13 this can be any side, not just horizontal - return VanillaBlocks::ITEM_FRAME() + return Blocks::ITEM_FRAME() ->setFacing($in->readHorizontalFacing()) - ->setHasMap($in->readBool(BlockStateNames::ITEM_FRAME_MAP_BIT)); + ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); }); - $this->map(Ids::FROSTED_ICE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::FROSTED_ICE() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 3)); + $this->map(Ids::FROSTED_ICE, function(Reader $in) : Block{ + return Blocks::FROSTED_ICE() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); - $this->map(Ids::FURNACE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::FURNACE() + $this->map(Ids::FURNACE, function(Reader $in) : Block{ + return Blocks::FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::GLASS, fn() => VanillaBlocks::GLASS()); - $this->map(Ids::GLASS_PANE, fn() => VanillaBlocks::GLASS_PANE()); - $this->map(Ids::GLOWINGOBSIDIAN, fn() => VanillaBlocks::GLOWING_OBSIDIAN()); - $this->map(Ids::GLOWSTONE, fn() => VanillaBlocks::GLOWSTONE()); - $this->map(Ids::GOLD_BLOCK, fn() => VanillaBlocks::GOLD()); - $this->map(Ids::GOLD_ORE, fn() => VanillaBlocks::GOLD_ORE()); - $this->map(Ids::GOLDEN_RAIL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::POWERED_RAIL() - ->setPowered($in->readBool(BlockStateNames::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 5)); + $this->map(Ids::GLASS, fn() => Blocks::GLASS()); + $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); + $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); + $this->map(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); + $this->map(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); + $this->map(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); + $this->map(Ids::GOLDEN_RAIL, function(Reader $in) : Block{ + return Blocks::POWERED_RAIL() + ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); - $this->map(Ids::GRANITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::GRANITE_STAIRS(), $in)); - $this->map(Ids::GRASS, fn() => VanillaBlocks::GRASS()); - $this->map(Ids::GRASS_PATH, fn() => VanillaBlocks::GRASS_PATH()); - $this->map(Ids::GRAVEL, fn() => VanillaBlocks::GRAVEL()); - $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::HARD_GLASS, fn() => VanillaBlocks::HARDENED_GLASS()); - $this->map(Ids::HARD_GLASS_PANE, fn() => VanillaBlocks::HARDENED_GLASS_PANE()); - $this->map(Ids::HARD_STAINED_GLASS, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_HARDENED_GLASS() + $this->map(Ids::GRANITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::GRANITE_STAIRS(), $in)); + $this->map(Ids::GRASS, fn() => Blocks::GRASS()); + $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); + $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); + $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::GRAY_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::GREEN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); + $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); + $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ + return Blocks::STAINED_HARDENED_GLASS() ->setColor($in->readColor()); }); - $this->map(Ids::HARD_STAINED_GLASS_PANE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_HARDENED_GLASS_PANE() + $this->map(Ids::HARD_STAINED_GLASS_PANE, function(Reader $in) : Block{ + return Blocks::STAINED_HARDENED_GLASS_PANE() ->setColor($in->readColor()); }); - $this->map(Ids::HARDENED_CLAY, fn() => VanillaBlocks::HARDENED_CLAY()); - $this->map(Ids::HAY_BLOCK, function(BlockStateReader $in) : Block{ + $this->map(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); + $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ //TODO: intentionally ignored "deprecated" blockstate (useless) - return VanillaBlocks::HAY_BALE()->setAxis($in->readPillarAxis()); + return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); }); - $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeWeightedPressurePlate(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); - $this->map(Ids::HOPPER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::HOPPER() + $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); + $this->map(Ids::HOPPER, function(Reader $in) : Block{ + return Blocks::HOPPER() ->setFacing($in->readFacingWithoutUp()) - ->setPowered($in->readBool(BlockStateNames::TOGGLE_BIT)); + ->setPowered($in->readBool(StateNames::TOGGLE_BIT)); }); - $this->map(Ids::ICE, fn() => VanillaBlocks::ICE()); - $this->map(Ids::INFO_UPDATE, fn() => VanillaBlocks::INFO_UPDATE()); - $this->map(Ids::INFO_UPDATE2, fn() => VanillaBlocks::INFO_UPDATE2()); - $this->map(Ids::INVISIBLEBEDROCK, fn() => VanillaBlocks::INVISIBLE_BEDROCK()); - $this->map(Ids::IRON_BARS, fn() => VanillaBlocks::IRON_BARS()); - $this->map(Ids::IRON_BLOCK, fn() => VanillaBlocks::IRON()); - $this->map(Ids::IRON_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::IRON_DOOR(), $in)); - $this->map(Ids::IRON_ORE, fn() => VanillaBlocks::IRON_ORE()); - $this->map(Ids::IRON_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::IRON_TRAPDOOR(), $in)); - $this->map(Ids::JUKEBOX, fn() => VanillaBlocks::JUKEBOX()); - $this->map(Ids::JUNGLE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::JUNGLE_BUTTON(), $in)); - $this->map(Ids::JUNGLE_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::JUNGLE_DOOR(), $in)); - $this->map(Ids::JUNGLE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::JUNGLE_FENCE_GATE(), $in)); - $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), $in)); - $this->map(Ids::JUNGLE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::JUNGLE_STAIRS(), $in)); - $this->map(Ids::JUNGLE_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::JUNGLE_SIGN(), $in)); - $this->map(Ids::JUNGLE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::JUNGLE_TRAPDOOR(), $in)); - $this->map(Ids::JUNGLE_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::JUNGLE_WALL_SIGN(), $in)); - $this->map(Ids::LADDER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LADDER() + $this->map(Ids::ICE, fn() => Blocks::ICE()); + $this->map(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); + $this->map(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); + $this->map(Ids::INVISIBLEBEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); + $this->map(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); + $this->map(Ids::IRON_BLOCK, fn() => Blocks::IRON()); + $this->map(Ids::IRON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::IRON_DOOR(), $in)); + $this->map(Ids::IRON_ORE, fn() => Blocks::IRON_ORE()); + $this->map(Ids::IRON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::IRON_TRAPDOOR(), $in)); + $this->map(Ids::JUKEBOX, fn() => Blocks::JUKEBOX()); + $this->map(Ids::JUNGLE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::JUNGLE_BUTTON(), $in)); + $this->map(Ids::JUNGLE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::JUNGLE_DOOR(), $in)); + $this->map(Ids::JUNGLE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::JUNGLE_FENCE_GATE(), $in)); + $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::JUNGLE_PRESSURE_PLATE(), $in)); + $this->map(Ids::JUNGLE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::JUNGLE_STAIRS(), $in)); + $this->map(Ids::JUNGLE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::JUNGLE_SIGN(), $in)); + $this->map(Ids::JUNGLE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::JUNGLE_TRAPDOOR(), $in)); + $this->map(Ids::JUNGLE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::JUNGLE_WALL_SIGN(), $in)); + $this->map(Ids::LADDER, function(Reader $in) : Block{ + return Blocks::LADDER() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::LANTERN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LANTERN() - ->setHanging($in->readBool(BlockStateNames::HANGING)); + $this->map(Ids::LANTERN, function(Reader $in) : Block{ + return Blocks::LANTERN() + ->setHanging($in->readBool(StateNames::HANGING)); }); - $this->map(Ids::LAPIS_BLOCK, fn() => VanillaBlocks::LAPIS_LAZULI()); - $this->map(Ids::LAPIS_ORE, fn() => VanillaBlocks::LAPIS_LAZULI_ORE()); - $this->map(Ids::LAVA, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::LAVA(), $in)); - $this->map(Ids::LEAVES, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::OLD_LEAF_TYPE)){ - StringValues::OLD_LEAF_TYPE_BIRCH => VanillaBlocks::BIRCH_LEAVES(), - StringValues::OLD_LEAF_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LEAVES(), - StringValues::OLD_LEAF_TYPE_OAK => VanillaBlocks::OAK_LEAVES(), - StringValues::OLD_LEAF_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LEAVES(), - default => throw $in->badValueException(BlockStateNames::OLD_LEAF_TYPE, $type), + $this->map(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI()); + $this->map(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE()); + $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in)); + $this->map(Ids::LEAVES, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::OLD_LEAF_TYPE)){ + StringValues::OLD_LEAF_TYPE_BIRCH => Blocks::BIRCH_LEAVES(), + StringValues::OLD_LEAF_TYPE_JUNGLE => Blocks::JUNGLE_LEAVES(), + StringValues::OLD_LEAF_TYPE_OAK => Blocks::OAK_LEAVES(), + StringValues::OLD_LEAF_TYPE_SPRUCE => Blocks::SPRUCE_LEAVES(), + default => throw $in->badValueException(StateNames::OLD_LEAF_TYPE, $type), }) - ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(BlockStateNames::UPDATE_BIT)); + ->setNoDecay($in->readBool(StateNames::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(StateNames::UPDATE_BIT)); }); - $this->map(Ids::LEAVES2, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::NEW_LEAF_TYPE)){ - StringValues::NEW_LEAF_TYPE_ACACIA => VanillaBlocks::ACACIA_LEAVES(), - StringValues::NEW_LEAF_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LEAVES(), - default => throw $in->badValueException(BlockStateNames::NEW_LEAF_TYPE, $type), + $this->map(Ids::LEAVES2, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::NEW_LEAF_TYPE)){ + StringValues::NEW_LEAF_TYPE_ACACIA => Blocks::ACACIA_LEAVES(), + StringValues::NEW_LEAF_TYPE_DARK_OAK => Blocks::DARK_OAK_LEAVES(), + default => throw $in->badValueException(StateNames::NEW_LEAF_TYPE, $type), }) - ->setNoDecay($in->readBool(BlockStateNames::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(BlockStateNames::UPDATE_BIT)); + ->setNoDecay($in->readBool(StateNames::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(StateNames::UPDATE_BIT)); }); - $this->map(Ids::LECTERN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LECTERN() + $this->map(Ids::LECTERN, function(Reader $in) : Block{ + return Blocks::LECTERN() ->setFacing($in->readLegacyHorizontalFacing()) - ->setProducingSignal($in->readBool(BlockStateNames::POWERED_BIT)); + ->setProducingSignal($in->readBool(StateNames::POWERED_BIT)); }); - $this->map(Ids::LEVER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LEVER() - ->setActivated($in->readBool(BlockStateNames::OPEN_BIT)) - ->setFacing(match($value = $in->readString(BlockStateNames::LEVER_DIRECTION)){ + $this->map(Ids::LEVER, function(Reader $in) : Block{ + return Blocks::LEVER() + ->setActivated($in->readBool(StateNames::OPEN_BIT)) + ->setFacing(match($value = $in->readString(StateNames::LEVER_DIRECTION)){ StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), @@ -581,516 +583,516 @@ final class BlockStateDeserializer{ StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), - default => throw $in->badValueException(BlockStateNames::LEVER_DIRECTION, $value), + default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value), }); }); - $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeWeightedPressurePlate(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); - $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::LIT_BLAST_FURNACE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BLAST_FURNACE() + $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); + $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIME_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIT_BLAST_FURNACE, function(Reader $in) : Block{ + return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); - $this->map(Ids::LIT_FURNACE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::FURNACE() + $this->map(Ids::LIT_FURNACE, function(Reader $in) : Block{ + return Blocks::FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); - $this->map(Ids::LIT_PUMPKIN, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LIT_PUMPKIN() + $this->map(Ids::LIT_PUMPKIN, function(Reader $in) : Block{ + return Blocks::LIT_PUMPKIN() ->setFacing($in->readLegacyHorizontalFacing()); }); $this->map(Ids::LIT_REDSTONE_LAMP, function() : Block{ - return VanillaBlocks::REDSTONE_LAMP() + return Blocks::REDSTONE_LAMP() ->setPowered(true); }); $this->map(Ids::LIT_REDSTONE_ORE, function() : Block{ - return VanillaBlocks::REDSTONE_ORE() + return Blocks::REDSTONE_ORE() ->setLit(true); }); - $this->map(Ids::LIT_SMOKER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SMOKER() + $this->map(Ids::LIT_SMOKER, function(Reader $in) : Block{ + return Blocks::SMOKER() ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); - $this->map(Ids::LOG, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::OLD_LOG_TYPE)){ - StringValues::OLD_LOG_TYPE_BIRCH => VanillaBlocks::BIRCH_LOG(), - StringValues::OLD_LOG_TYPE_JUNGLE => VanillaBlocks::JUNGLE_LOG(), - StringValues::OLD_LOG_TYPE_OAK => VanillaBlocks::OAK_LOG(), - StringValues::OLD_LOG_TYPE_SPRUCE => VanillaBlocks::SPRUCE_LOG(), - default => throw $in->badValueException(BlockStateNames::OLD_LOG_TYPE, $type), + $this->map(Ids::LOG, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::OLD_LOG_TYPE)){ + StringValues::OLD_LOG_TYPE_BIRCH => Blocks::BIRCH_LOG(), + StringValues::OLD_LOG_TYPE_JUNGLE => Blocks::JUNGLE_LOG(), + StringValues::OLD_LOG_TYPE_OAK => Blocks::OAK_LOG(), + StringValues::OLD_LOG_TYPE_SPRUCE => Blocks::SPRUCE_LOG(), + default => throw $in->badValueException(StateNames::OLD_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::LOG2, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::NEW_LOG_TYPE)){ - StringValues::NEW_LOG_TYPE_ACACIA => VanillaBlocks::ACACIA_LOG(), - StringValues::NEW_LOG_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_LOG(), - default => throw $in->badValueException(BlockStateNames::NEW_LOG_TYPE, $type), + $this->map(Ids::LOG2, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::NEW_LOG_TYPE)){ + StringValues::NEW_LOG_TYPE_ACACIA => Blocks::ACACIA_LOG(), + StringValues::NEW_LOG_TYPE_DARK_OAK => Blocks::DARK_OAK_LOG(), + default => throw $in->badValueException(StateNames::NEW_LOG_TYPE, $type), }) ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::LOOM, function(BlockStateReader $in) : Block{ - return VanillaBlocks::LOOM() + $this->map(Ids::LOOM, function(Reader $in) : Block{ + return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::MAGMA, fn() => VanillaBlocks::MAGMA()); - $this->map(Ids::MELON_BLOCK, fn() => VanillaBlocks::MELON()); - $this->map(Ids::MELON_STEM, fn(BlockStateReader $in) => Helper::decodeStem(VanillaBlocks::MELON_STEM(), $in)); - $this->map(Ids::MOB_SPAWNER, fn() => VanillaBlocks::MONSTER_SPAWNER()); - $this->map(Ids::MONSTER_EGG, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::MONSTER_EGG_STONE_TYPE)){ - StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => VanillaBlocks::INFESTED_COBBLESTONE(), - StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE => VanillaBlocks::INFESTED_STONE(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => VanillaBlocks::INFESTED_STONE_BRICK(), - default => throw $in->badValueException(BlockStateNames::MONSTER_EGG_STONE_TYPE, $type), + $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); + $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); + $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); + $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); + $this->map(Ids::MONSTER_EGG, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::MONSTER_EGG_STONE_TYPE)){ + StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => Blocks::INFESTED_CHISELED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => Blocks::INFESTED_COBBLESTONE(), + StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => Blocks::INFESTED_CRACKED_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => Blocks::INFESTED_MOSSY_STONE_BRICK(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE => Blocks::INFESTED_STONE(), + StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => Blocks::INFESTED_STONE_BRICK(), + default => throw $in->badValueException(StateNames::MONSTER_EGG_STONE_TYPE, $type), }; }); - $this->map(Ids::MOSSY_COBBLESTONE, fn() => VanillaBlocks::MOSSY_COBBLESTONE()); - $this->map(Ids::MOSSY_COBBLESTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), $in)); - $this->map(Ids::MOSSY_STONE_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), $in)); - $this->map(Ids::MYCELIUM, fn() => VanillaBlocks::MYCELIUM()); - $this->map(Ids::NETHER_BRICK, fn() => VanillaBlocks::NETHER_BRICKS()); - $this->map(Ids::NETHER_BRICK_FENCE, fn() => VanillaBlocks::NETHER_BRICK_FENCE()); - $this->map(Ids::NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::NETHER_BRICK_STAIRS(), $in)); - $this->map(Ids::NETHER_WART, function(BlockStateReader $in) : Block{ - return VanillaBlocks::NETHER_WART() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 3)); + $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); + $this->map(Ids::MOSSY_COBBLESTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), $in)); + $this->map(Ids::MOSSY_STONE_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); + $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); + $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); + $this->map(Ids::NETHER_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::NETHER_BRICK_STAIRS(), $in)); + $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ + return Blocks::NETHER_WART() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); - $this->map(Ids::NETHER_WART_BLOCK, fn() => VanillaBlocks::NETHER_WART_BLOCK()); - $this->map(Ids::NETHERRACK, fn() => VanillaBlocks::NETHERRACK()); - $this->map(Ids::NETHERREACTOR, fn() => VanillaBlocks::NETHER_REACTOR_CORE()); - $this->map(Ids::NORMAL_STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::STONE_STAIRS(), $in)); - $this->map(Ids::NOTEBLOCK, fn() => VanillaBlocks::NOTE_BLOCK()); - $this->map(Ids::OAK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::OAK_STAIRS(), $in)); - $this->map(Ids::OBSIDIAN, fn() => VanillaBlocks::OBSIDIAN()); - $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::PACKED_ICE, fn() => VanillaBlocks::PACKED_ICE()); - $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::PLANKS, function(BlockStateReader $in) : Block{ - return match($woodName = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_PLANKS(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_PLANKS(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_PLANKS(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_PLANKS(), - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_PLANKS(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_PLANKS(), - default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodName), + $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); + $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); + $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); + $this->map(Ids::NORMAL_STONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::STONE_STAIRS(), $in)); + $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); + $this->map(Ids::OAK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::OAK_STAIRS(), $in)); + $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); + $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::ORANGE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); + $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::PINK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PLANKS, function(Reader $in) : Block{ + return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_OAK => Blocks::OAK_PLANKS(), + StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_PLANKS(), + StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_PLANKS(), + StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_PLANKS(), + StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_PLANKS(), + StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_PLANKS(), + default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodName), }; }); - $this->map(Ids::PODZOL, fn() => VanillaBlocks::PODZOL()); - $this->map(Ids::POLISHED_ANDESITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), $in)); - $this->map(Ids::POLISHED_DIORITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_DIORITE_STAIRS(), $in)); - $this->map(Ids::POLISHED_GRANITE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::POLISHED_GRANITE_STAIRS(), $in)); - $this->map(Ids::PORTAL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::NETHER_PORTAL() - ->setAxis(match($value = $in->readString(BlockStateNames::PORTAL_AXIS)){ + $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); + $this->map(Ids::POLISHED_ANDESITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_ANDESITE_STAIRS(), $in)); + $this->map(Ids::POLISHED_DIORITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_DIORITE_STAIRS(), $in)); + $this->map(Ids::POLISHED_GRANITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_GRANITE_STAIRS(), $in)); + $this->map(Ids::PORTAL, function(Reader $in) : Block{ + return Blocks::NETHER_PORTAL() + ->setAxis(match($value = $in->readString(StateNames::PORTAL_AXIS)){ StringValues::PORTAL_AXIS_UNKNOWN => Axis::X, StringValues::PORTAL_AXIS_X => Axis::X, StringValues::PORTAL_AXIS_Z => Axis::Z, - default => throw $in->badValueException(BlockStateNames::PORTAL_AXIS, $value), + default => throw $in->badValueException(StateNames::PORTAL_AXIS, $value), }); }); - $this->map(Ids::POTATOES, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::POTATOES(), $in)); - $this->map(Ids::POWERED_COMPARATOR, fn(BlockStateReader $in) => Helper::decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); - $this->map(Ids::POWERED_REPEATER, fn(BlockStateReader $in) => Helper::decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + $this->map(Ids::POTATOES, fn(Reader $in) => Helper::decodeCrops(Blocks::POTATOES(), $in)); + $this->map(Ids::POWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in)); + $this->map(Ids::POWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in) ->setPowered(true)); - $this->map(Ids::PRISMARINE, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::PRISMARINE_BLOCK_TYPE)){ - StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => VanillaBlocks::PRISMARINE_BRICKS(), - StringValues::PRISMARINE_BLOCK_TYPE_DARK => VanillaBlocks::DARK_PRISMARINE(), - StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => VanillaBlocks::PRISMARINE(), - default => throw $in->badValueException(BlockStateNames::PRISMARINE_BLOCK_TYPE, $type), + $this->map(Ids::PRISMARINE, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::PRISMARINE_BLOCK_TYPE)){ + StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => Blocks::PRISMARINE_BRICKS(), + StringValues::PRISMARINE_BLOCK_TYPE_DARK => Blocks::DARK_PRISMARINE(), + StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => Blocks::PRISMARINE(), + default => throw $in->badValueException(StateNames::PRISMARINE_BLOCK_TYPE, $type), }; }); - $this->map(Ids::PRISMARINE_BRICKS_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), $in)); - $this->map(Ids::PRISMARINE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PRISMARINE_STAIRS(), $in)); + $this->map(Ids::PRISMARINE_BRICKS_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), $in)); + $this->map(Ids::PRISMARINE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_STAIRS(), $in)); $this->map(Ids::PUMPKIN, function() : Block{ //TODO: intentionally ignored "direction" property (obsolete) - return VanillaBlocks::PUMPKIN(); + return Blocks::PUMPKIN(); }); - $this->map(Ids::PUMPKIN_STEM, fn(BlockStateReader $in) => Helper::decodeStem(VanillaBlocks::PUMPKIN_STEM(), $in)); - $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::PURPUR_BLOCK, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ + $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); + $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::PURPLE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PURPUR_BLOCK, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::CHISEL_TYPE)){ StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::PURPUR(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), - default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), + StringValues::CHISEL_TYPE_DEFAULT => Blocks::PURPUR(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), + default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), }; }); - $this->map(Ids::PURPUR_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::PURPUR_STAIRS(), $in)); - $this->map(Ids::QUARTZ_BLOCK, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED => VanillaBlocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_DEFAULT => VanillaBlocks::QUARTZ(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => VanillaBlocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_SMOOTH => VanillaBlocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) - default => throw $in->badValueException(BlockStateNames::CHISEL_TYPE, $type), + $this->map(Ids::PURPUR_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PURPUR_STAIRS(), $in)); + $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::CHISEL_TYPE)){ + StringValues::CHISEL_TYPE_CHISELED => Blocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_DEFAULT => Blocks::QUARTZ(), //TODO: axis intentionally ignored (useless) + StringValues::CHISEL_TYPE_LINES => Blocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), + StringValues::CHISEL_TYPE_SMOOTH => Blocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) + default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), }; }); - $this->map(Ids::QUARTZ_ORE, fn() => VanillaBlocks::NETHER_QUARTZ_ORE()); - $this->map(Ids::QUARTZ_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::QUARTZ_STAIRS(), $in)); - $this->map(Ids::RAIL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::RAIL() - ->setShape($in->readBoundedInt(BlockStateNames::RAIL_DIRECTION, 0, 9)); + $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); + $this->map(Ids::QUARTZ_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::QUARTZ_STAIRS(), $in)); + $this->map(Ids::RAIL, function(Reader $in) : Block{ + return Blocks::RAIL() + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); }); - $this->map(Ids::RED_FLOWER, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::FLOWER_TYPE)){ - StringValues::FLOWER_TYPE_ALLIUM => VanillaBlocks::ALLIUM(), - StringValues::FLOWER_TYPE_CORNFLOWER => VanillaBlocks::CORNFLOWER(), - StringValues::FLOWER_TYPE_HOUSTONIA => VanillaBlocks::AZURE_BLUET(), //wtf ??? - StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => VanillaBlocks::LILY_OF_THE_VALLEY(), - StringValues::FLOWER_TYPE_ORCHID => VanillaBlocks::BLUE_ORCHID(), - StringValues::FLOWER_TYPE_OXEYE => VanillaBlocks::OXEYE_DAISY(), - StringValues::FLOWER_TYPE_POPPY => VanillaBlocks::POPPY(), - StringValues::FLOWER_TYPE_TULIP_ORANGE => VanillaBlocks::ORANGE_TULIP(), - StringValues::FLOWER_TYPE_TULIP_PINK => VanillaBlocks::PINK_TULIP(), - StringValues::FLOWER_TYPE_TULIP_RED => VanillaBlocks::RED_TULIP(), - StringValues::FLOWER_TYPE_TULIP_WHITE => VanillaBlocks::WHITE_TULIP(), - default => throw $in->badValueException(BlockStateNames::FLOWER_TYPE, $type), + $this->map(Ids::RED_FLOWER, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::FLOWER_TYPE)){ + StringValues::FLOWER_TYPE_ALLIUM => Blocks::ALLIUM(), + StringValues::FLOWER_TYPE_CORNFLOWER => Blocks::CORNFLOWER(), + StringValues::FLOWER_TYPE_HOUSTONIA => Blocks::AZURE_BLUET(), //wtf ??? + StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => Blocks::LILY_OF_THE_VALLEY(), + StringValues::FLOWER_TYPE_ORCHID => Blocks::BLUE_ORCHID(), + StringValues::FLOWER_TYPE_OXEYE => Blocks::OXEYE_DAISY(), + StringValues::FLOWER_TYPE_POPPY => Blocks::POPPY(), + StringValues::FLOWER_TYPE_TULIP_ORANGE => Blocks::ORANGE_TULIP(), + StringValues::FLOWER_TYPE_TULIP_PINK => Blocks::PINK_TULIP(), + StringValues::FLOWER_TYPE_TULIP_RED => Blocks::RED_TULIP(), + StringValues::FLOWER_TYPE_TULIP_WHITE => Blocks::WHITE_TULIP(), + default => throw $in->badValueException(StateNames::FLOWER_TYPE, $type), }; }); - $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::RED_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::RED_MUSHROOM, fn() => VanillaBlocks::RED_MUSHROOM()); - $this->map(Ids::RED_MUSHROOM_BLOCK, fn(BlockStateReader $in) => Helper::decodeMushroomBlock(VanillaBlocks::RED_MUSHROOM_BLOCK(), $in)); - $this->map(Ids::RED_NETHER_BRICK, fn() => VanillaBlocks::RED_NETHER_BRICKS()); - $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), $in)); - $this->map(Ids::RED_SANDSTONE, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_RED_SANDSTONE(), - default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), + $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::RED_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); + $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); + $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); + $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::RED_NETHER_BRICK_STAIRS(), $in)); + $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => Blocks::CUT_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => Blocks::RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => Blocks::CHISELED_RED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => Blocks::SMOOTH_RED_SANDSTONE(), + default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), }; }); - $this->map(Ids::RED_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::RED_SANDSTONE_STAIRS(), $in)); - $this->map(Ids::REDSTONE_BLOCK, fn() => VanillaBlocks::REDSTONE()); + $this->map(Ids::RED_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::RED_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); $this->map(Ids::REDSTONE_LAMP, function() : Block{ - return VanillaBlocks::REDSTONE_LAMP() + return Blocks::REDSTONE_LAMP() ->setPowered(false); }); $this->map(Ids::REDSTONE_ORE, function() : Block{ - return VanillaBlocks::REDSTONE_ORE() + return Blocks::REDSTONE_ORE() ->setLit(false); }); - $this->map(Ids::REDSTONE_TORCH, function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_TORCH() + $this->map(Ids::REDSTONE_TORCH, function(Reader $in) : Block{ + return Blocks::REDSTONE_TORCH() ->setFacing($in->readTorchFacing()) ->setLit(true); }); - $this->map(Ids::REDSTONE_WIRE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_WIRE() - ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); + $this->map(Ids::REDSTONE_WIRE, function(Reader $in) : Block{ + return Blocks::REDSTONE_WIRE() + ->setOutputSignalStrength($in->readBoundedInt(StateNames::REDSTONE_SIGNAL, 0, 15)); }); - $this->map(Ids::REEDS, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SUGARCANE() - ->setAge($in->readBoundedInt(BlockStateNames::AGE, 0, 15)); + $this->map(Ids::REEDS, function(Reader $in) : Block{ + return Blocks::SUGARCANE() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::RESERVED6, fn() => VanillaBlocks::RESERVED6()); - $this->map(Ids::SAND, function(BlockStateReader $in) : Block{ - return match($value = $in->readString(BlockStateNames::SAND_TYPE)){ - StringValues::SAND_TYPE_NORMAL => VanillaBlocks::SAND(), - StringValues::SAND_TYPE_RED => VanillaBlocks::RED_SAND(), - default => throw $in->badValueException(BlockStateNames::SAND_TYPE, $value), + $this->map(Ids::RESERVED6, fn() => Blocks::RESERVED6()); + $this->map(Ids::SAND, function(Reader $in) : Block{ + return match($value = $in->readString(StateNames::SAND_TYPE)){ + StringValues::SAND_TYPE_NORMAL => Blocks::SAND(), + StringValues::SAND_TYPE_RED => Blocks::RED_SAND(), + default => throw $in->badValueException(StateNames::SAND_TYPE, $value), }; }); - $this->map(Ids::SANDSTONE, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => VanillaBlocks::CUT_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => VanillaBlocks::SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => VanillaBlocks::CHISELED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => VanillaBlocks::SMOOTH_SANDSTONE(), - default => throw $in->badValueException(BlockStateNames::SAND_STONE_TYPE, $type), + $this->map(Ids::SANDSTONE, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ + StringValues::SAND_STONE_TYPE_CUT => Blocks::CUT_SANDSTONE(), + StringValues::SAND_STONE_TYPE_DEFAULT => Blocks::SANDSTONE(), + StringValues::SAND_STONE_TYPE_HEIROGLYPHS => Blocks::CHISELED_SANDSTONE(), + StringValues::SAND_STONE_TYPE_SMOOTH => Blocks::SMOOTH_SANDSTONE(), + default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), }; }); - $this->map(Ids::SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SANDSTONE_STAIRS(), $in)); - $this->map(Ids::SAPLING, function(BlockStateReader $in) : Block{ - return (match($type = $in->readString(BlockStateNames::SAPLING_TYPE)){ - StringValues::SAPLING_TYPE_ACACIA => VanillaBlocks::ACACIA_SAPLING(), - StringValues::SAPLING_TYPE_BIRCH => VanillaBlocks::BIRCH_SAPLING(), - StringValues::SAPLING_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), - StringValues::SAPLING_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), - StringValues::SAPLING_TYPE_OAK => VanillaBlocks::OAK_SAPLING(), - StringValues::SAPLING_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), - default => throw $in->badValueException(BlockStateNames::SAPLING_TYPE, $type), + $this->map(Ids::SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SAPLING, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::SAPLING_TYPE)){ + StringValues::SAPLING_TYPE_ACACIA => Blocks::ACACIA_SAPLING(), + StringValues::SAPLING_TYPE_BIRCH => Blocks::BIRCH_SAPLING(), + StringValues::SAPLING_TYPE_DARK_OAK => Blocks::DARK_OAK_SAPLING(), + StringValues::SAPLING_TYPE_JUNGLE => Blocks::JUNGLE_SAPLING(), + StringValues::SAPLING_TYPE_OAK => Blocks::OAK_SAPLING(), + StringValues::SAPLING_TYPE_SPRUCE => Blocks::SPRUCE_SAPLING(), + default => throw $in->badValueException(StateNames::SAPLING_TYPE, $type), }) - ->setReady($in->readBool(BlockStateNames::AGE_BIT)); + ->setReady($in->readBool(StateNames::AGE_BIT)); }); - $this->map(Ids::SEALANTERN, fn() => VanillaBlocks::SEA_LANTERN()); - $this->map(Ids::SEA_PICKLE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SEA_PICKLE() - ->setCount($in->readBoundedInt(BlockStateNames::CLUSTER_COUNT, 0, 3) + 1) - ->setUnderwater(!$in->readBool(BlockStateNames::DEAD_BIT)); + $this->map(Ids::SEALANTERN, fn() => Blocks::SEA_LANTERN()); + $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ + return Blocks::SEA_PICKLE() + ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) + ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::SHULKER_BOX, function(BlockStateReader $in) : Block{ - return VanillaBlocks::DYED_SHULKER_BOX() + $this->map(Ids::SHULKER_BOX, function(Reader $in) : Block{ + return Blocks::DYED_SHULKER_BOX() ->setColor($in->readColor()); }); - $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::SKULL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::MOB_HEAD() + $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::SKULL, function(Reader $in) : Block{ + return Blocks::MOB_HEAD() ->setFacing($in->readFacingWithoutDown()) - ->setNoDrops($in->readBool(BlockStateNames::NO_DROP_BIT)); + ->setNoDrops($in->readBool(StateNames::NO_DROP_BIT)); }); - $this->map(Ids::SLIME, fn() => VanillaBlocks::SLIME()); - $this->map(Ids::SMOKER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SMOKER() + $this->map(Ids::SLIME, fn() => Blocks::SLIME()); + $this->map(Ids::SMOKER, function(Reader $in) : Block{ + return Blocks::SMOKER() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::SMOOTH_QUARTZ_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), $in)); - $this->map(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); - $this->map(Ids::SMOOTH_SANDSTONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), $in)); - $this->map(Ids::SMOOTH_STONE, fn() => VanillaBlocks::SMOOTH_STONE()); - $this->map(Ids::SNOW, fn() => VanillaBlocks::SNOW()); - $this->map(Ids::SNOW_LAYER, function(BlockStateReader $in) : Block{ + $this->map(Ids::SMOOTH_QUARTZ_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), $in)); + $this->map(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SMOOTH_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), $in)); + $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); + $this->map(Ids::SNOW, fn() => Blocks::SNOW()); + $this->map(Ids::SNOW_LAYER, function(Reader $in) : Block{ //TODO: intentionally ignored covered_bit property (appears useless and we don't track it) - return VanillaBlocks::SNOW_LAYER()->setLayers($in->readBoundedInt(BlockStateNames::HEIGHT, 0, 7) + 1); + return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); }); - $this->map(Ids::SOUL_SAND, fn() => VanillaBlocks::SOUL_SAND()); - $this->map(Ids::SPONGE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::SPONGE()->setWet(match($type = $in->readString(BlockStateNames::SPONGE_TYPE)){ + $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); + $this->map(Ids::SPONGE, function(Reader $in) : Block{ + return Blocks::SPONGE()->setWet(match($type = $in->readString(StateNames::SPONGE_TYPE)){ StringValues::SPONGE_TYPE_DRY => false, StringValues::SPONGE_TYPE_WET => true, - default => throw $in->badValueException(BlockStateNames::SPONGE_TYPE, $type), + default => throw $in->badValueException(StateNames::SPONGE_TYPE, $type), }); }); - $this->map(Ids::SPRUCE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::SPRUCE_BUTTON(), $in)); - $this->map(Ids::SPRUCE_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::SPRUCE_DOOR(), $in)); - $this->map(Ids::SPRUCE_FENCE_GATE, fn(BlockStateReader $in) => Helper::decodeFenceGate(VanillaBlocks::SPRUCE_FENCE_GATE(), $in)); - $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), $in)); - $this->map(Ids::SPRUCE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::SPRUCE_STAIRS(), $in)); - $this->map(Ids::SPRUCE_STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::SPRUCE_SIGN(), $in)); - $this->map(Ids::SPRUCE_TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::SPRUCE_TRAPDOOR(), $in)); - $this->map(Ids::SPRUCE_WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::SPRUCE_WALL_SIGN(), $in)); - $this->map(Ids::STAINED_GLASS, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_GLASS() + $this->map(Ids::SPRUCE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::SPRUCE_BUTTON(), $in)); + $this->map(Ids::SPRUCE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::SPRUCE_DOOR(), $in)); + $this->map(Ids::SPRUCE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::SPRUCE_FENCE_GATE(), $in)); + $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::SPRUCE_PRESSURE_PLATE(), $in)); + $this->map(Ids::SPRUCE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SPRUCE_STAIRS(), $in)); + $this->map(Ids::SPRUCE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::SPRUCE_SIGN(), $in)); + $this->map(Ids::SPRUCE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::SPRUCE_TRAPDOOR(), $in)); + $this->map(Ids::SPRUCE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::SPRUCE_WALL_SIGN(), $in)); + $this->map(Ids::STAINED_GLASS, function(Reader $in) : Block{ + return Blocks::STAINED_GLASS() ->setColor($in->readColor()); }); - $this->map(Ids::STAINED_GLASS_PANE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_GLASS_PANE() + $this->map(Ids::STAINED_GLASS_PANE, function(Reader $in) : Block{ + return Blocks::STAINED_GLASS_PANE() ->setColor($in->readColor()); }); - $this->map(Ids::STAINED_HARDENED_CLAY, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STAINED_CLAY() + $this->map(Ids::STAINED_HARDENED_CLAY, function(Reader $in) : Block{ + return Blocks::STAINED_CLAY() ->setColor($in->readColor()); }); - $this->map(Ids::STANDING_BANNER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::BANNER() - ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); + $this->map(Ids::STANDING_BANNER, function(Reader $in) : Block{ + return Blocks::BANNER() + ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15)); }); - $this->map(Ids::STANDING_SIGN, fn(BlockStateReader $in) => Helper::decodeFloorSign(VanillaBlocks::OAK_SIGN(), $in)); - $this->map(Ids::STONE, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::STONE_TYPE)){ - StringValues::STONE_TYPE_ANDESITE => VanillaBlocks::ANDESITE(), - StringValues::STONE_TYPE_ANDESITE_SMOOTH => VanillaBlocks::POLISHED_ANDESITE(), - StringValues::STONE_TYPE_DIORITE => VanillaBlocks::DIORITE(), - StringValues::STONE_TYPE_DIORITE_SMOOTH => VanillaBlocks::POLISHED_DIORITE(), - StringValues::STONE_TYPE_GRANITE => VanillaBlocks::GRANITE(), - StringValues::STONE_TYPE_GRANITE_SMOOTH => VanillaBlocks::POLISHED_GRANITE(), - StringValues::STONE_TYPE_STONE => VanillaBlocks::STONE(), - default => throw $in->badValueException(BlockStateNames::STONE_TYPE, $type), + $this->map(Ids::STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::OAK_SIGN(), $in)); + $this->map(Ids::STONE, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::STONE_TYPE)){ + StringValues::STONE_TYPE_ANDESITE => Blocks::ANDESITE(), + StringValues::STONE_TYPE_ANDESITE_SMOOTH => Blocks::POLISHED_ANDESITE(), + StringValues::STONE_TYPE_DIORITE => Blocks::DIORITE(), + StringValues::STONE_TYPE_DIORITE_SMOOTH => Blocks::POLISHED_DIORITE(), + StringValues::STONE_TYPE_GRANITE => Blocks::GRANITE(), + StringValues::STONE_TYPE_GRANITE_SMOOTH => Blocks::POLISHED_GRANITE(), + StringValues::STONE_TYPE_STONE => Blocks::STONE(), + default => throw $in->badValueException(StateNames::STONE_TYPE, $type), }; }); - $this->map(Ids::STONE_BRICK_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::STONE_BRICK_STAIRS(), $in)); - $this->map(Ids::STONE_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::STONE_BUTTON(), $in)); - $this->map(Ids::STONE_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::STONE_PRESSURE_PLATE(), $in)); - $this->map(Ids::STONE_SLAB, fn(BlockStateReader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB2, fn(BlockStateReader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB3, fn(BlockStateReader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB4, fn(BlockStateReader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_STAIRS, fn(BlockStateReader $in) => Helper::decodeStairs(VanillaBlocks::COBBLESTONE_STAIRS(), $in)); - $this->map(Ids::STONEBRICK, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::STONE_BRICK_TYPE)){ + $this->map(Ids::STONE_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::STONE_BRICK_STAIRS(), $in)); + $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); + $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); + $this->map(Ids::STONE_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::COBBLESTONE_STAIRS(), $in)); + $this->map(Ids::STONEBRICK, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::STONE_BRICK_TYPE)){ StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla - StringValues::STONE_BRICK_TYPE_DEFAULT => VanillaBlocks::STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CHISELED => VanillaBlocks::CHISELED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CRACKED => VanillaBlocks::CRACKED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_MOSSY => VanillaBlocks::MOSSY_STONE_BRICKS(), - default => throw $in->badValueException(BlockStateNames::STONE_BRICK_TYPE, $type), + StringValues::STONE_BRICK_TYPE_DEFAULT => Blocks::STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CHISELED => Blocks::CHISELED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_CRACKED => Blocks::CRACKED_STONE_BRICKS(), + StringValues::STONE_BRICK_TYPE_MOSSY => Blocks::MOSSY_STONE_BRICKS(), + default => throw $in->badValueException(StateNames::STONE_BRICK_TYPE, $type), }; }); - $this->map(Ids::STONECUTTER, fn() => VanillaBlocks::LEGACY_STONECUTTER()); - $this->map(Ids::STRIPPED_ACACIA_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_ACACIA_LOG() + $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); + $this->map(Ids::STRIPPED_ACACIA_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_ACACIA_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::STRIPPED_BIRCH_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_BIRCH_LOG() + $this->map(Ids::STRIPPED_BIRCH_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_BIRCH_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::STRIPPED_DARK_OAK_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_DARK_OAK_LOG() + $this->map(Ids::STRIPPED_DARK_OAK_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_DARK_OAK_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::STRIPPED_JUNGLE_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_JUNGLE_LOG() + $this->map(Ids::STRIPPED_JUNGLE_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_JUNGLE_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::STRIPPED_OAK_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_OAK_LOG() + $this->map(Ids::STRIPPED_OAK_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_OAK_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::STRIPPED_SPRUCE_LOG, function(BlockStateReader $in) : Block{ - return VanillaBlocks::STRIPPED_SPRUCE_LOG() + $this->map(Ids::STRIPPED_SPRUCE_LOG, function(Reader $in) : Block{ + return Blocks::STRIPPED_SPRUCE_LOG() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::SWEET_BERRY_BUSH, function(BlockStateReader $in) : Block{ + $this->map(Ids::SWEET_BERRY_BUSH, function(Reader $in) : Block{ //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 - $growth = $in->readBoundedInt(BlockStateNames::GROWTH, 0, 7); - return VanillaBlocks::SWEET_BERRY_BUSH() + $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); + return Blocks::SWEET_BERRY_BUSH() ->setAge(min($growth, SweetBerryBush::STAGE_MATURE)); }); - $this->map(Ids::TALLGRASS, function(BlockStateReader $in) : Block{ - return match($type = $in->readString(BlockStateNames::TALL_GRASS_TYPE)){ - StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => VanillaBlocks::TALL_GRASS(), - StringValues::TALL_GRASS_TYPE_FERN => VanillaBlocks::FERN(), - default => throw $in->badValueException(BlockStateNames::TALL_GRASS_TYPE, $type), + $this->map(Ids::TALLGRASS, function(Reader $in) : Block{ + return match($type = $in->readString(StateNames::TALL_GRASS_TYPE)){ + StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => Blocks::TALL_GRASS(), + StringValues::TALL_GRASS_TYPE_FERN => Blocks::FERN(), + default => throw $in->badValueException(StateNames::TALL_GRASS_TYPE, $type), }; }); - $this->map(Ids::TNT, function(BlockStateReader $in) : Block{ - return VanillaBlocks::TNT() - ->setUnstable($in->readBool(BlockStateNames::EXPLODE_BIT)) - ->setWorksUnderwater($in->readBool(BlockStateNames::ALLOW_UNDERWATER_BIT)); + $this->map(Ids::TNT, function(Reader $in) : Block{ + return Blocks::TNT() + ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) + ->setWorksUnderwater($in->readBool(StateNames::ALLOW_UNDERWATER_BIT)); }); - $this->map(Ids::TORCH, function(BlockStateReader $in) : Block{ - return VanillaBlocks::TORCH() + $this->map(Ids::TORCH, function(Reader $in) : Block{ + return Blocks::TORCH() ->setFacing($in->readTorchFacing()); }); - $this->map(Ids::TRAPDOOR, fn(BlockStateReader $in) => Helper::decodeTrapdoor(VanillaBlocks::OAK_TRAPDOOR(), $in)); - $this->map(Ids::TRAPPED_CHEST, function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRAPPED_CHEST() + $this->map(Ids::TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::OAK_TRAPDOOR(), $in)); + $this->map(Ids::TRAPPED_CHEST, function(Reader $in) : Block{ + return Blocks::TRAPPED_CHEST() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::TRIPWIRE, function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRIPWIRE() - ->setConnected($in->readBool(BlockStateNames::ATTACHED_BIT)) - ->setDisarmed($in->readBool(BlockStateNames::DISARMED_BIT)) - ->setSuspended($in->readBool(BlockStateNames::SUSPENDED_BIT)) - ->setTriggered($in->readBool(BlockStateNames::POWERED_BIT)); + $this->map(Ids::TRIPWIRE, function(Reader $in) : Block{ + return Blocks::TRIPWIRE() + ->setConnected($in->readBool(StateNames::ATTACHED_BIT)) + ->setDisarmed($in->readBool(StateNames::DISARMED_BIT)) + ->setSuspended($in->readBool(StateNames::SUSPENDED_BIT)) + ->setTriggered($in->readBool(StateNames::POWERED_BIT)); }); - $this->map(Ids::TRIPWIRE_HOOK, function(BlockStateReader $in) : Block{ - return VanillaBlocks::TRIPWIRE_HOOK() - ->setConnected($in->readBool(BlockStateNames::ATTACHED_BIT)) + $this->map(Ids::TRIPWIRE_HOOK, function(Reader $in) : Block{ + return Blocks::TRIPWIRE_HOOK() + ->setConnected($in->readBool(StateNames::ATTACHED_BIT)) ->setFacing($in->readLegacyHorizontalFacing()) - ->setPowered($in->readBool(BlockStateNames::POWERED_BIT)); + ->setPowered($in->readBool(StateNames::POWERED_BIT)); }); - $this->map(Ids::UNDERWATER_TORCH, function(BlockStateReader $in) : Block{ - return VanillaBlocks::UNDERWATER_TORCH() + $this->map(Ids::UNDERWATER_TORCH, function(Reader $in) : Block{ + return Blocks::UNDERWATER_TORCH() ->setFacing($in->readTorchFacing()); }); - $this->map(Ids::UNDYED_SHULKER_BOX, fn() => VanillaBlocks::SHULKER_BOX()); - $this->map(Ids::UNLIT_REDSTONE_TORCH, function(BlockStateReader $in) : Block{ - return VanillaBlocks::REDSTONE_TORCH() + $this->map(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); + $this->map(Ids::UNLIT_REDSTONE_TORCH, function(Reader $in) : Block{ + return Blocks::REDSTONE_TORCH() ->setFacing($in->readTorchFacing()) ->setLit(false); }); - $this->map(Ids::UNPOWERED_COMPARATOR, fn(BlockStateReader $in) => Helper::decodeComparator(VanillaBlocks::REDSTONE_COMPARATOR(), $in)); - $this->map(Ids::UNPOWERED_REPEATER, fn(BlockStateReader $in) => Helper::decodeRepeater(VanillaBlocks::REDSTONE_REPEATER(), $in) + $this->map(Ids::UNPOWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in)); + $this->map(Ids::UNPOWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in) ->setPowered(false)); - $this->map(Ids::VINE, function(BlockStateReader $in) : Block{ - $vineDirectionFlags = $in->readBoundedInt(BlockStateNames::VINE_DIRECTION_BITS, 0, 15); - return VanillaBlocks::VINES() + $this->map(Ids::VINE, function(Reader $in) : Block{ + $vineDirectionFlags = $in->readBoundedInt(StateNames::VINE_DIRECTION_BITS, 0, 15); + return Blocks::VINES() ->setFace(Facing::NORTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_NORTH) !== 0) ->setFace(Facing::SOUTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_SOUTH) !== 0) ->setFace(Facing::WEST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_WEST) !== 0) ->setFace(Facing::EAST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_EAST) !== 0); }); - $this->map(Ids::WALL_BANNER, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WALL_BANNER() + $this->map(Ids::WALL_BANNER, function(Reader $in) : Block{ + return Blocks::WALL_BANNER() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::WALL_SIGN, fn(BlockStateReader $in) => Helper::decodeWallSign(VanillaBlocks::OAK_WALL_SIGN(), $in)); - $this->map(Ids::WATER, fn(BlockStateReader $in) => Helper::decodeStillLiquid(VanillaBlocks::WATER(), $in)); - $this->map(Ids::WATERLILY, fn() => VanillaBlocks::LILY_PAD()); - $this->map(Ids::WEB, fn() => VanillaBlocks::COBWEB()); - $this->map(Ids::WHEAT, fn(BlockStateReader $in) => Helper::decodeCrops(VanillaBlocks::WHEAT(), $in)); - $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::WOOD, function(BlockStateReader $in) : Block{ + $this->map(Ids::WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::OAK_WALL_SIGN(), $in)); + $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); + $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); + $this->map(Ids::WEB, fn() => Blocks::COBWEB()); + $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); + $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::WHITE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::WOOD, function(Reader $in) : Block{ //TODO: our impl doesn't support axis yet - $stripped = $in->readBool(BlockStateNames::STRIPPED_BIT); - return match($woodType = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => $stripped ? VanillaBlocks::STRIPPED_ACACIA_WOOD() : VanillaBlocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => $stripped ? VanillaBlocks::STRIPPED_BIRCH_WOOD() : VanillaBlocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => $stripped ? VanillaBlocks::STRIPPED_DARK_OAK_WOOD() : VanillaBlocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => $stripped ? VanillaBlocks::STRIPPED_JUNGLE_WOOD() : VanillaBlocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => $stripped ? VanillaBlocks::STRIPPED_OAK_WOOD() : VanillaBlocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => $stripped ? VanillaBlocks::STRIPPED_SPRUCE_WOOD() : VanillaBlocks::SPRUCE_WOOD(), - default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $woodType), + $stripped = $in->readBool(StateNames::STRIPPED_BIT); + return match($woodType = $in->readString(StateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => $stripped ? Blocks::STRIPPED_ACACIA_WOOD() : Blocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => $stripped ? Blocks::STRIPPED_BIRCH_WOOD() : Blocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => $stripped ? Blocks::STRIPPED_DARK_OAK_WOOD() : Blocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => $stripped ? Blocks::STRIPPED_JUNGLE_WOOD() : Blocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => $stripped ? Blocks::STRIPPED_OAK_WOOD() : Blocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => $stripped ? Blocks::STRIPPED_SPRUCE_WOOD() : Blocks::SPRUCE_WOOD(), + default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodType), }; }); - $this->map(Ids::WOODEN_BUTTON, fn(BlockStateReader $in) => Helper::decodeButton(VanillaBlocks::OAK_BUTTON(), $in)); - $this->map(Ids::WOODEN_DOOR, fn(BlockStateReader $in) => Helper::decodeDoor(VanillaBlocks::OAK_DOOR(), $in)); - $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(BlockStateReader $in) => Helper::decodeSimplePressurePlate(VanillaBlocks::OAK_PRESSURE_PLATE(), $in)); - $this->map(Ids::WOODEN_SLAB, fn(BlockStateReader $in) => Helper::mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::WOOL, function(BlockStateReader $in) : Block{ - return VanillaBlocks::WOOL() + $this->map(Ids::WOODEN_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::OAK_BUTTON(), $in)); + $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in)); + $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::OAK_PRESSURE_PLATE(), $in)); + $this->map(Ids::WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::WOOL, function(Reader $in) : Block{ + return Blocks::WOOL() ->setColor($in->readColor()); }); - $this->map(Ids::YELLOW_FLOWER, fn() => VanillaBlocks::DANDELION()); - $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(BlockStateReader $in) => Helper::decodeGlazedTerracotta(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), $in)); - //$this->map(Ids::ALLOW, function(BlockStateReader $in) : Block{ + $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); + $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::YELLOW_GLAZED_TERRACOTTA(), $in)); + //$this->map(Ids::ALLOW, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::AMETHYST_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::AMETHYST_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::AMETHYST_CLUSTER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::AMETHYST_CLUSTER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::ANCIENT_DEBRIS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::ANCIENT_DEBRIS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::AZALEA, function(BlockStateReader $in) : Block{ + //$this->map(Ids::AZALEA, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::AZALEA_LEAVES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::AZALEA_LEAVES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * persistent_bit (ByteTag) = 0, 1 * update_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::AZALEA_LEAVES_FLOWERED, function(BlockStateReader $in) : Block{ + //$this->map(Ids::AZALEA_LEAVES_FLOWERED, function(Reader $in) : Block{ /* * TODO: Un-implemented block * persistent_bit (ByteTag) = 0, 1 * update_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BASALT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BASALT, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::BEE_NEST, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BEE_NEST, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::BEEHIVE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BEEHIVE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::BIG_DRIPLEAF, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BIG_DRIPLEAF, function(Reader $in) : Block{ /* * TODO: Un-implemented block * big_dripleaf_head (ByteTag) = 0, 1 @@ -1098,42 +1100,42 @@ final class BlockStateDeserializer{ * direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::BLACK_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACK_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLACK_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACK_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLACKSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACKSTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::BLACKSTONE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACKSTONE_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLACKSTONE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACKSTONE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLACKSTONE_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACKSTONE_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::BLACKSTONE_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLACKSTONE_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1143,20 +1145,20 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLUE_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLUE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLUE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BLUE_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BORDER_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BORDER_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1166,139 +1168,139 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BROWN_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BROWN_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BROWN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BROWN_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BUBBLE_COLUMN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BUBBLE_COLUMN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * drag_down (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BUDDING_AMETHYST, function(BlockStateReader $in) : Block{ + //$this->map(Ids::BUDDING_AMETHYST, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CALCITE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CALCITE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CAMERA, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAMERA, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CAMPFIRE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAMPFIRE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 * extinguished (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CARTOGRAPHY_TABLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CARTOGRAPHY_TABLE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CAULDRON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAULDRON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * cauldron_liquid (StringTag) = lava, powder_snow, water * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 */ //}); - //$this->map(Ids::CAVE_VINES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAVE_VINES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::CHAIN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHAIN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::CHAIN_COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHAIN_COMMAND_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * conditional_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::CHISELED_DEEPSLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHISELED_DEEPSLATE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CHISELED_NETHER_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHISELED_NETHER_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CHISELED_POLISHED_BLACKSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHISELED_POLISHED_BLACKSTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CHORUS_FLOWER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHORUS_FLOWER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * age (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::CHORUS_PLANT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CHORUS_PLANT, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CLIENT_REQUEST_PLACEHOLDER_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CLIENT_REQUEST_PLACEHOLDER_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::COBBLED_DEEPSLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COBBLED_DEEPSLATE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::COBBLED_DEEPSLATE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COBBLED_DEEPSLATE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::COBBLED_DEEPSLATE_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COBBLED_DEEPSLATE_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::COBBLED_DEEPSLATE_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COBBLED_DEEPSLATE_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1308,48 +1310,48 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COMMAND_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * conditional_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::COMPOSTER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COMPOSTER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 */ //}); - //$this->map(Ids::CONDUIT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CONDUIT, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::COPPER_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COPPER_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::COPPER_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::COPPER_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRACKED_DEEPSLATE_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRACKED_DEEPSLATE_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRACKED_DEEPSLATE_TILES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRACKED_DEEPSLATE_TILES, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRACKED_NETHER_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRACKED_NETHER_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_BUTTON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_BUTTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * button_pressed_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::CRIMSON_DOOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_DOOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -1358,16 +1360,16 @@ final class BlockStateDeserializer{ * upper_block_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CRIMSON_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CRIMSON_FENCE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_FENCE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_FENCE_GATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_FENCE_GATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -1375,56 +1377,56 @@ final class BlockStateDeserializer{ * open_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CRIMSON_FUNGUS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_FUNGUS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_HYPHAE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::CRIMSON_NYLIUM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_NYLIUM, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_PLANKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_PLANKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_PRESSURE_PLATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::CRIMSON_ROOTS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_ROOTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRIMSON_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CRIMSON_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::CRIMSON_STANDING_SIGN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_STANDING_SIGN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::CRIMSON_STEM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_STEM, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::CRIMSON_TRAPDOOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_TRAPDOOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -1432,70 +1434,70 @@ final class BlockStateDeserializer{ * upside_down_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CRIMSON_WALL_SIGN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRIMSON_WALL_SIGN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::CRYING_OBSIDIAN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CRYING_OBSIDIAN, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::CYAN_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CYAN_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::CYAN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::CYAN_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_BRICK_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_BRICK_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_BRICK_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_BRICK_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::DEEPSLATE_BRICK_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_BRICK_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1505,53 +1507,53 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_COAL_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_COAL_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_COPPER_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_COPPER_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_DIAMOND_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_DIAMOND_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_EMERALD_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_EMERALD_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_GOLD_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_GOLD_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_IRON_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_IRON_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_LAPIS_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_LAPIS_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_REDSTONE_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_REDSTONE_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DEEPSLATE_TILE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_TILE_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_TILE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_TILE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_TILE_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_TILE_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::DEEPSLATE_TILE_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_TILE_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1561,76 +1563,76 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DEEPSLATE_TILES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DEEPSLATE_TILES, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DENY, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DENY, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DIRT_WITH_ROOTS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DIRT_WITH_ROOTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DISPENSER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DISPENSER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 * triggered_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::DRIPSTONE_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DRIPSTONE_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::DROPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::DROPPER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 * triggered_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::END_GATEWAY, function(BlockStateReader $in) : Block{ + //$this->map(Ids::END_GATEWAY, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::END_PORTAL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::END_PORTAL, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::EXPOSED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::EXPOSED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::EXPOSED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::EXPOSED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::EXPOSED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::EXPOSED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::EXPOSED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::EXPOSED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::FLOWERING_AZALEA, function(BlockStateReader $in) : Block{ + //$this->map(Ids::FLOWERING_AZALEA, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::GILDED_BLACKSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GILDED_BLACKSTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::GLOW_FRAME, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GLOW_FRAME, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 @@ -1638,292 +1640,292 @@ final class BlockStateDeserializer{ * item_frame_photo_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::GLOW_LICHEN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GLOW_LICHEN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 */ //}); - //$this->map(Ids::GRAY_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GRAY_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::GRAY_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GRAY_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::GREEN_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GREEN_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::GREEN_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GREEN_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::GRINDSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::GRINDSTONE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * attachment (StringTag) = hanging, multiple, side, standing * direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::HANGING_ROOTS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::HANGING_ROOTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::HONEY_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::HONEY_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::HONEYCOMB_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::HONEYCOMB_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::INFESTED_DEEPSLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::INFESTED_DEEPSLATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::JIGSAW, function(BlockStateReader $in) : Block{ + //$this->map(Ids::JIGSAW, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 * rotation (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::KELP, function(BlockStateReader $in) : Block{ + //$this->map(Ids::KELP, function(Reader $in) : Block{ /* * TODO: Un-implemented block * kelp_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::LARGE_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LARGE_AMETHYST_BUD, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::LAVA_CAULDRON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LAVA_CAULDRON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * cauldron_liquid (StringTag) = lava, powder_snow, water * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 */ //}); - //$this->map(Ids::LIGHT_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHT_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::LIGHT_BLUE_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHT_BLUE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIGHT_GRAY_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHT_GRAY_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIGHTNING_ROD, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIGHTNING_ROD, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::LIME_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIME_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIME_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIME_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::LODESTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::LODESTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MAGENTA_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MAGENTA_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::MAGENTA_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MAGENTA_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::MEDIUM_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MEDIUM_AMETHYST_BUD, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::MOSS_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MOSS_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MOSS_CARPET, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MOSS_CARPET, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MOVINGBLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MOVINGBLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MYSTERIOUS_FRAME, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MYSTERIOUS_FRAME, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MYSTERIOUS_FRAME_SLOT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::MYSTERIOUS_FRAME_SLOT, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::NETHER_GOLD_ORE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::NETHER_GOLD_ORE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::NETHER_SPROUTS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::NETHER_SPROUTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::NETHERITE_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::NETHERITE_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::OBSERVER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OBSERVER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 * powered_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::ORANGE_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::ORANGE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::ORANGE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::ORANGE_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::OXIDIZED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OXIDIZED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OXIDIZED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OXIDIZED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OXIDIZED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::PINK_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PINK_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::PINK_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PINK_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::PISTON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PISTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::PISTONARMCOLLISION, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PISTONARMCOLLISION, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::POINTED_DRIPSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POINTED_DRIPSTONE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * dripstone_thickness (StringTag) = base, frustum, merge, middle, tip * hanging (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BASALT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1933,42 +1935,42 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BUTTON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_BUTTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * button_pressed_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::POLISHED_BLACKSTONE_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_BLACKSTONE_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -1978,29 +1980,29 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_DEEPSLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_DEEPSLATE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_DEEPSLATE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_DEEPSLATE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_DEEPSLATE_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_DEEPSLATE_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::POLISHED_DEEPSLATE_WALL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POLISHED_DEEPSLATE_WALL, function(Reader $in) : Block{ /* * TODO: Un-implemented block * wall_connection_type_east (StringTag) = none, short, tall @@ -2010,240 +2012,240 @@ final class BlockStateDeserializer{ * wall_post_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POWDER_SNOW, function(BlockStateReader $in) : Block{ + //$this->map(Ids::POWDER_SNOW, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::PURPLE_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PURPLE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::PURPLE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::PURPLE_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::QUARTZ_BRICKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::QUARTZ_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::RAW_COPPER_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RAW_COPPER_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::RAW_GOLD_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RAW_GOLD_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::RAW_IRON_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RAW_IRON_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::RED_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RED_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::RED_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RED_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::REPEATING_COMMAND_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::REPEATING_COMMAND_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * conditional_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::RESPAWN_ANCHOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::RESPAWN_ANCHOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * respawn_anchor_charge (IntTag) = 0, 1, 2, 3, 4 */ //}); - //$this->map(Ids::SCAFFOLDING, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCAFFOLDING, function(Reader $in) : Block{ /* * TODO: Un-implemented block * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 * stability_check (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SCULK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCULK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SCULK_CATALYST, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCULK_CATALYST, function(Reader $in) : Block{ /* * TODO: Un-implemented block * bloom (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SCULK_SENSOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCULK_SENSOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * powered_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SCULK_SHRIEKER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCULK_SHRIEKER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * active (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SCULK_VEIN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SCULK_VEIN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 */ //}); - //$this->map(Ids::SEAGRASS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SEAGRASS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * sea_grass_type (StringTag) = default, double_bot, double_top */ //}); - //$this->map(Ids::SHROOMLIGHT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SHROOMLIGHT, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SMALL_AMETHYST_BUD, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SMALL_AMETHYST_BUD, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 * upper_block_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SMITHING_TABLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SMITHING_TABLE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SMOOTH_BASALT, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SMOOTH_BASALT, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SOUL_CAMPFIRE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SOUL_CAMPFIRE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 * extinguished (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SOUL_FIRE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SOUL_FIRE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::SOUL_LANTERN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SOUL_LANTERN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * hanging (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::SOUL_SOIL, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SOUL_SOIL, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SOUL_TORCH, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SOUL_TORCH, function(Reader $in) : Block{ /* * TODO: Un-implemented block * torch_facing_direction (StringTag) = east, north, south, top, unknown, west */ //}); - //$this->map(Ids::SPORE_BLOSSOM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::SPORE_BLOSSOM, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::STICKYPISTONARMCOLLISION, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STICKYPISTONARMCOLLISION, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::STICKY_PISTON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STICKY_PISTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::STONECUTTER_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::STRIPPED_CRIMSON_HYPHAE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRIPPED_CRIMSON_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::STRIPPED_CRIMSON_STEM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRIPPED_CRIMSON_STEM, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::STRIPPED_WARPED_HYPHAE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRIPPED_WARPED_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::STRIPPED_WARPED_STEM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRIPPED_WARPED_STEM, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::STRUCTURE_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRUCTURE_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block * structure_block_type (StringTag) = corner, data, export, invalid, load, save */ //}); - //$this->map(Ids::STRUCTURE_VOID, function(BlockStateReader $in) : Block{ + //$this->map(Ids::STRUCTURE_VOID, function(Reader $in) : Block{ /* * TODO: Un-implemented block * structure_void_type (StringTag) = air, void */ //}); - //$this->map(Ids::TARGET, function(BlockStateReader $in) : Block{ + //$this->map(Ids::TARGET, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::TINTED_GLASS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::TINTED_GLASS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::TUFF, function(BlockStateReader $in) : Block{ + //$this->map(Ids::TUFF, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::TURTLE_EGG, function(BlockStateReader $in) : Block{ + //$this->map(Ids::TURTLE_EGG, function(Reader $in) : Block{ /* * TODO: Un-implemented block * cracked_state (StringTag) = cracked, max_cracked, no_cracks * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg */ //}); - //$this->map(Ids::TWISTING_VINES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::TWISTING_VINES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * twisting_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::UNKNOWN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::UNKNOWN, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_BUTTON, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_BUTTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * button_pressed_bit (ByteTag) = 0, 1 * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::WARPED_DOOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_DOOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -2252,16 +2254,16 @@ final class BlockStateDeserializer{ * upper_block_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WARPED_DOUBLE_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_DOUBLE_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WARPED_FENCE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_FENCE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_FENCE_GATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_FENCE_GATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -2269,56 +2271,56 @@ final class BlockStateDeserializer{ * open_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WARPED_FUNGUS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_FUNGUS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_HYPHAE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::WARPED_NYLIUM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_NYLIUM, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_PLANKS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_PLANKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_PRESSURE_PLATE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_PRESSURE_PLATE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::WARPED_ROOTS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_ROOTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WARPED_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WARPED_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WARPED_STANDING_SIGN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_STANDING_SIGN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ //}); - //$this->map(Ids::WARPED_STEM, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_STEM, function(Reader $in) : Block{ /* * TODO: Un-implemented block * pillar_axis (StringTag) = x, y, z */ //}); - //$this->map(Ids::WARPED_TRAPDOOR, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_TRAPDOOR, function(Reader $in) : Block{ /* * TODO: Un-implemented block * direction (IntTag) = 0, 1, 2, 3 @@ -2326,170 +2328,170 @@ final class BlockStateDeserializer{ * upside_down_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WARPED_WALL_SIGN, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_WALL_SIGN, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::WARPED_WART_BLOCK, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WARPED_WART_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_EXPOSED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_EXPOSED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_OXIDIZED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_OXIDIZED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_WEATHERED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_WEATHERED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WEATHERED_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEATHERED_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WEATHERED_CUT_COPPER, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEATHERED_CUT_COPPER, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::WEATHERED_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEATHERED_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WEATHERED_CUT_COPPER_STAIRS, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEATHERED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ /* * TODO: Un-implemented block * upside_down_bit (ByteTag) = 0, 1 * weirdo_direction (IntTag) = 0, 1, 2, 3 */ //}); - //$this->map(Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ /* * TODO: Un-implemented block * top_slot_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WEEPING_VINES, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WEEPING_VINES, function(Reader $in) : Block{ /* * TODO: Un-implemented block * weeping_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 */ //}); - //$this->map(Ids::WHITE_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WHITE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WHITE_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WHITE_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::WITHER_ROSE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::WITHER_ROSE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::YELLOW_CANDLE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::YELLOW_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * candles (IntTag) = 0, 1, 2, 3 * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::YELLOW_CANDLE_CAKE, function(BlockStateReader $in) : Block{ + //$this->map(Ids::YELLOW_CANDLE_CAKE, function(Reader $in) : Block{ /* * TODO: Un-implemented block * lit (ByteTag) = 0, 1 @@ -2503,6 +2505,6 @@ final class BlockStateDeserializer{ if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); } - return $this->deserializeFuncs[$id](new BlockStateReader($blockStateData)); + return $this->deserializeFuncs[$id](new Reader($blockStateData)); } } diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index e6ebf258f4..2f2037bc95 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -120,7 +120,7 @@ use pocketmine\block\UnderwaterTorch; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\LeverFacing; -use pocketmine\block\VanillaBlocks; +use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Vine; use pocketmine\block\Wall; use pocketmine\block\WallBanner; @@ -137,6 +137,7 @@ use pocketmine\block\WoodenPressurePlate; use pocketmine\block\WoodenStairs; use pocketmine\block\WoodenTrapdoor; use pocketmine\block\Wool; +use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; use pocketmine\data\bedrock\blockstate\BlockStateSerializerHelper as Helper; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockStateWriter as Writer; @@ -211,519 +212,519 @@ final class BlockStateSerializer{ } private function registerSerializers() : void{ - $this->map(VanillaBlocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); - $this->map(VanillaBlocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); - $this->map(VanillaBlocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); - $this->map(VanillaBlocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); - $this->map(VanillaBlocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::ACACIA_STANDING_SIGN))); - $this->map(VanillaBlocks::ACACIA_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_ACACIA)); - $this->map(VanillaBlocks::ACACIA_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::ACACIA_STAIRS))); - $this->map(VanillaBlocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); - $this->map(VanillaBlocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); - $this->map(VanillaBlocks::ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ + $this->map(Blocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); + $this->map(Blocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); + $this->map(Blocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); + $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); + $this->map(Blocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::ACACIA_STANDING_SIGN))); + $this->map(Blocks::ACACIA_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::ACACIA_STAIRS))); + $this->map(Blocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); + $this->map(Blocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); + $this->map(Blocks::ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ return Writer::create(Ids::ACTIVATOR_RAIL) - ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isPowered()) - ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(VanillaBlocks::AIR(), fn() => new Writer(Ids::AIR)); - $this->map(VanillaBlocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); - $this->map(VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) - ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); - $this->map(VanillaBlocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); - $this->map(VanillaBlocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); - $this->map(VanillaBlocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); - $this->map(VanillaBlocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); - $this->map(VanillaBlocks::ANVIL(), function(Anvil $block) : Writer{ + $this->map(Blocks::AIR(), fn() => new Writer(Ids::AIR)); + $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); + $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); + $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); + $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); + $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); + $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); + $this->map(Blocks::ANVIL(), function(Anvil $block) : Writer{ return Writer::create(Ids::ANVIL) ->writeLegacyHorizontalFacing($block->getFacing()) - ->writeString(BlockStateNames::DAMAGE, match($damage = $block->getDamage()){ + ->writeString(StateNames::DAMAGE, match($damage = $block->getDamage()){ 0 => StringValues::DAMAGE_UNDAMAGED, 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, 2 => StringValues::DAMAGE_VERY_DAMAGED, default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), }); }); - $this->map(VanillaBlocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); - $this->map(VanillaBlocks::BAMBOO(), function(Bamboo $block) : Writer{ + $this->map(Blocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); + $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ return Writer::create(Ids::BAMBOO) - ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) - ->writeString(BlockStateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ + ->writeBool(StateNames::AGE_BIT, $block->isReady()) + ->writeString(StateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), }) - ->writeString(BlockStateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); + ->writeString(StateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); }); - $this->map(VanillaBlocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ + $this->map(Blocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ return Writer::create(Ids::BAMBOO_SAPLING) - ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) + ->writeBool(StateNames::AGE_BIT, $block->isReady()) //TODO: bug in MCPE - ->writeString(BlockStateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); + ->writeString(StateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); }); - $this->map(VanillaBlocks::BANNER(), function(FloorBanner $block) : Writer{ + $this->map(Blocks::BANNER(), function(FloorBanner $block) : Writer{ return Writer::create(Ids::STANDING_BANNER) - ->writeInt(BlockStateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); + ->writeInt(StateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); }); - $this->map(VanillaBlocks::BARREL(), function(Barrel $block) : Writer{ + $this->map(Blocks::BARREL(), function(Barrel $block) : Writer{ return Writer::create(Ids::BARREL) - ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()) + ->writeBool(StateNames::OPEN_BIT, $block->isOpen()) ->writeFacingDirection($block->getFacing()); }); - $this->map(VanillaBlocks::BARRIER(), fn() => new Writer(Ids::BARRIER)); - $this->map(VanillaBlocks::BEACON(), fn() => new Writer(Ids::BEACON)); - $this->map(VanillaBlocks::BED(), function(Bed $block) : Writer{ + $this->map(Blocks::BARRIER(), fn() => new Writer(Ids::BARRIER)); + $this->map(Blocks::BEACON(), fn() => new Writer(Ids::BEACON)); + $this->map(Blocks::BED(), function(Bed $block) : Writer{ return Writer::create(Ids::BED) - ->writeBool(BlockStateNames::HEAD_PIECE_BIT, $block->isHeadPart()) - ->writeBool(BlockStateNames::OCCUPIED_BIT, $block->isOccupied()) + ->writeBool(StateNames::HEAD_PIECE_BIT, $block->isHeadPart()) + ->writeBool(StateNames::OCCUPIED_BIT, $block->isOccupied()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::BEDROCK(), function(Block $block) : Writer{ + $this->map(Blocks::BEDROCK(), function(Block $block) : Writer{ return Writer::create(Ids::BEDROCK) - ->writeBool(BlockStateNames::INFINIBURN_BIT, $block->burnsForever()); + ->writeBool(StateNames::INFINIBURN_BIT, $block->burnsForever()); }); - $this->map(VanillaBlocks::BEETROOTS(), fn(Beetroot $block) => Helper::encodeCrops($block, new Writer(Ids::BEETROOT))); - $this->map(VanillaBlocks::BELL(), function(Bell $block) : Writer{ + $this->map(Blocks::BEETROOTS(), fn(Beetroot $block) => Helper::encodeCrops($block, new Writer(Ids::BEETROOT))); + $this->map(Blocks::BELL(), function(Bell $block) : Writer{ return Writer::create(Ids::BELL) ->writeBellAttachmentType($block->getAttachmentType()) - ->writeBool(BlockStateNames::TOGGLE_BIT, false) //we don't care about this; it's just to keep MCPE happy + ->writeBool(StateNames::TOGGLE_BIT, false) //we don't care about this; it's just to keep MCPE happy ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); - $this->map(VanillaBlocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); - $this->map(VanillaBlocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); - $this->map(VanillaBlocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); - $this->map(VanillaBlocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); - $this->map(VanillaBlocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); - $this->map(VanillaBlocks::BIRCH_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::BIRCH_STAIRS))); - $this->map(VanillaBlocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); - $this->map(VanillaBlocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); - $this->map(VanillaBlocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::BLACK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLACK_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); - $this->map(VanillaBlocks::BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLUE_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::BLUE_ICE(), fn() => new Writer(Ids::BLUE_ICE)); - $this->map(VanillaBlocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); - $this->map(VanillaBlocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); - $this->map(VanillaBlocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ + $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); + $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); + $this->map(Blocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); + $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); + $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); + $this->map(Blocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::BIRCH_STAIRS))); + $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); + $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); + $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::BLACK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLACK_GLAZED_TERRACOTTA))); + $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); + $this->map(Blocks::BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLUE_GLAZED_TERRACOTTA))); + $this->map(Blocks::BLUE_ICE(), fn() => new Writer(Ids::BLUE_ICE)); + $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); + $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ return Writer::create(Ids::BONE_BLOCK) - ->writeInt(BlockStateNames::DEPRECATED, 0) + ->writeInt(StateNames::DEPRECATED, 0) ->writePillarAxis($block->getAxis()); }); - $this->map(VanillaBlocks::BOOKSHELF(), fn() => new Writer(Ids::BOOKSHELF)); - $this->map(VanillaBlocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ + $this->map(Blocks::BOOKSHELF(), fn() => new Writer(Ids::BOOKSHELF)); + $this->map(Blocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ return Writer::create(Ids::BREWING_STAND) - ->writeBool(BlockStateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) - ->writeBool(BlockStateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) - ->writeBool(BlockStateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); + ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) + ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) + ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); }); - $this->map(VanillaBlocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); - $this->map(VanillaBlocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); - $this->map(VanillaBlocks::BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::BRICK_STAIRS))); - $this->map(VanillaBlocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); - $this->map(VanillaBlocks::BROWN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BROWN_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); - $this->map(VanillaBlocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); - $this->map(VanillaBlocks::CACTUS(), function(Cactus $block) : Writer{ + $this->map(Blocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); + $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); + $this->map(Blocks::BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::BRICK_STAIRS))); + $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); + $this->map(Blocks::BROWN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BROWN_GLAZED_TERRACOTTA))); + $this->map(Blocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); + $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); + $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ return Writer::create(Ids::CACTUS) - ->writeInt(BlockStateNames::AGE, $block->getAge()); + ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(VanillaBlocks::CAKE(), function(Cake $block) : Writer{ + $this->map(Blocks::CAKE(), function(Cake $block) : Writer{ return Writer::create(Ids::CAKE) - ->writeInt(BlockStateNames::BITE_COUNTER, $block->getBites()); + ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); }); - $this->map(VanillaBlocks::CARPET(), function(Carpet $block) : Writer{ + $this->map(Blocks::CARPET(), function(Carpet $block) : Writer{ return Writer::create(Ids::CARPET) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); - $this->map(VanillaBlocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ + $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); + $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ return Writer::create(Ids::CARVED_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::CHEMICAL_HEAT(), fn() => new Writer(Ids::CHEMICAL_HEAT)); - $this->map(VanillaBlocks::CHEST(), function(Chest $block) : Writer{ + $this->map(Blocks::CHEMICAL_HEAT(), fn() => new Writer(Ids::CHEMICAL_HEAT)); + $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); - $this->map(VanillaBlocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(VanillaBlocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(VanillaBlocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); - $this->map(VanillaBlocks::CLAY(), fn() => new Writer(Ids::CLAY)); - $this->map(VanillaBlocks::COAL(), fn() => new Writer(Ids::COAL_BLOCK)); - $this->map(VanillaBlocks::COAL_ORE(), fn() => new Writer(Ids::COAL_ORE)); - $this->map(VanillaBlocks::COBBLESTONE(), fn() => new Writer(Ids::COBBLESTONE)); - $this->map(VanillaBlocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); - $this->map(VanillaBlocks::COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_STAIRS))); - $this->map(VanillaBlocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); - $this->map(VanillaBlocks::COBWEB(), fn() => new Writer(Ids::WEB)); - $this->map(VanillaBlocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ + $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); + $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); + $this->map(Blocks::CLAY(), fn() => new Writer(Ids::CLAY)); + $this->map(Blocks::COAL(), fn() => new Writer(Ids::COAL_BLOCK)); + $this->map(Blocks::COAL_ORE(), fn() => new Writer(Ids::COAL_ORE)); + $this->map(Blocks::COBBLESTONE(), fn() => new Writer(Ids::COBBLESTONE)); + $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); + $this->map(Blocks::COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_STAIRS))); + $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); + $this->map(Blocks::COBWEB(), fn() => new Writer(Ids::WEB)); + $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ return Writer::create(Ids::COCOA) - ->writeInt(BlockStateNames::AGE, $block->getAge()) + ->writeInt(StateNames::AGE, $block->getAge()) ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); - $this->map(VanillaBlocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(VanillaBlocks::CONCRETE(), function(Concrete $block) : Writer{ + $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::CONCRETE(), function(Concrete $block) : Writer{ return Writer::create(Ids::CONCRETE) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ + $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ return Writer::create(Ids::CONCRETEPOWDER) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::CORAL(), function(Coral $block) : Writer{ + $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ return Writer::create(Ids::CORAL) - ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralType($block->getCoralType()); }); - $this->map(VanillaBlocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ + $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ return Writer::create(Ids::CORAL_BLOCK) - ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralType($block->getCoralType()); }); - $this->map(VanillaBlocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ + $this->map(Blocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) ->writeCoralType($block->getCoralType()) - ->writeInt(BlockStateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ + ->writeInt(StateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ Axis::X => 0, Axis::Z => 1, default => throw new BlockStateSerializeException("Invalid axis {$axis}"), }); }); - $this->map(VanillaBlocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); - $this->map(VanillaBlocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); - $this->map(VanillaBlocks::CRAFTING_TABLE(), fn() => new Writer(Ids::CRAFTING_TABLE)); - $this->map(VanillaBlocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); - $this->map(VanillaBlocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(VanillaBlocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); - $this->map(VanillaBlocks::CYAN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::CYAN_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::DANDELION(), fn() => new Writer(Ids::YELLOW_FLOWER)); - $this->map(VanillaBlocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); - $this->map(VanillaBlocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); - $this->map(VanillaBlocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); - $this->map(VanillaBlocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); - $this->map(VanillaBlocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); - $this->map(VanillaBlocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(VanillaBlocks::DARK_OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_OAK_STAIRS))); - $this->map(VanillaBlocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); - $this->map(VanillaBlocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); - $this->map(VanillaBlocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); - $this->map(VanillaBlocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); - $this->map(VanillaBlocks::DARK_PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_PRISMARINE_STAIRS))); - $this->map(VanillaBlocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ + $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); + $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); + $this->map(Blocks::CRAFTING_TABLE(), fn() => new Writer(Ids::CRAFTING_TABLE)); + $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); + $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); + $this->map(Blocks::CYAN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::CYAN_GLAZED_TERRACOTTA))); + $this->map(Blocks::DANDELION(), fn() => new Writer(Ids::YELLOW_FLOWER)); + $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); + $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); + $this->map(Blocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); + $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); + $this->map(Blocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); + $this->map(Blocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_OAK_STAIRS))); + $this->map(Blocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); + $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); + $this->map(Blocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); + $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); + $this->map(Blocks::DARK_PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_PRISMARINE_STAIRS))); + $this->map(Blocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) - ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(VanillaBlocks::DEAD_BUSH(), fn() => new Writer(Ids::DEADBUSH)); - $this->map(VanillaBlocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ + $this->map(Blocks::DEAD_BUSH(), fn() => new Writer(Ids::DEADBUSH)); + $this->map(Blocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ return Writer::create(Ids::DETECTOR_RAIL) - ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isActivated()) - ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(VanillaBlocks::DIAMOND(), fn() => new Writer(Ids::DIAMOND_BLOCK)); - $this->map(VanillaBlocks::DIAMOND_ORE(), fn() => new Writer(Ids::DIAMOND_ORE)); - $this->map(VanillaBlocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); - $this->map(VanillaBlocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); - $this->map(VanillaBlocks::DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DIORITE_STAIRS))); - $this->map(VanillaBlocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); - $this->map(VanillaBlocks::DIRT(), function(Dirt $block) : Writer{ + $this->map(Blocks::DIAMOND(), fn() => new Writer(Ids::DIAMOND_BLOCK)); + $this->map(Blocks::DIAMOND_ORE(), fn() => new Writer(Ids::DIAMOND_ORE)); + $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); + $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); + $this->map(Blocks::DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DIORITE_STAIRS))); + $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); + $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ return Writer::create(Ids::DIRT) - ->writeString(BlockStateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); + ->writeString(StateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); }); - $this->map(VanillaBlocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::DRAGON_EGG(), fn() => new Writer(Ids::DRAGON_EGG)); - $this->map(VanillaBlocks::DRIED_KELP(), fn() => new Writer(Ids::DRIED_KELP_BLOCK)); - $this->map(VanillaBlocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ + $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::DRAGON_EGG(), fn() => new Writer(Ids::DRAGON_EGG)); + $this->map(Blocks::DRIED_KELP(), fn() => new Writer(Ids::DRIED_KELP_BLOCK)); + $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ return Writer::create(Ids::SHULKER_BOX) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::ELEMENT_ACTINIUM(), fn() => new Writer(Ids::ELEMENT_89)); - $this->map(VanillaBlocks::ELEMENT_ALUMINUM(), fn() => new Writer(Ids::ELEMENT_13)); - $this->map(VanillaBlocks::ELEMENT_AMERICIUM(), fn() => new Writer(Ids::ELEMENT_95)); - $this->map(VanillaBlocks::ELEMENT_ANTIMONY(), fn() => new Writer(Ids::ELEMENT_51)); - $this->map(VanillaBlocks::ELEMENT_ARGON(), fn() => new Writer(Ids::ELEMENT_18)); - $this->map(VanillaBlocks::ELEMENT_ARSENIC(), fn() => new Writer(Ids::ELEMENT_33)); - $this->map(VanillaBlocks::ELEMENT_ASTATINE(), fn() => new Writer(Ids::ELEMENT_85)); - $this->map(VanillaBlocks::ELEMENT_BARIUM(), fn() => new Writer(Ids::ELEMENT_56)); - $this->map(VanillaBlocks::ELEMENT_BERKELIUM(), fn() => new Writer(Ids::ELEMENT_97)); - $this->map(VanillaBlocks::ELEMENT_BERYLLIUM(), fn() => new Writer(Ids::ELEMENT_4)); - $this->map(VanillaBlocks::ELEMENT_BISMUTH(), fn() => new Writer(Ids::ELEMENT_83)); - $this->map(VanillaBlocks::ELEMENT_BOHRIUM(), fn() => new Writer(Ids::ELEMENT_107)); - $this->map(VanillaBlocks::ELEMENT_BORON(), fn() => new Writer(Ids::ELEMENT_5)); - $this->map(VanillaBlocks::ELEMENT_BROMINE(), fn() => new Writer(Ids::ELEMENT_35)); - $this->map(VanillaBlocks::ELEMENT_CADMIUM(), fn() => new Writer(Ids::ELEMENT_48)); - $this->map(VanillaBlocks::ELEMENT_CALCIUM(), fn() => new Writer(Ids::ELEMENT_20)); - $this->map(VanillaBlocks::ELEMENT_CALIFORNIUM(), fn() => new Writer(Ids::ELEMENT_98)); - $this->map(VanillaBlocks::ELEMENT_CARBON(), fn() => new Writer(Ids::ELEMENT_6)); - $this->map(VanillaBlocks::ELEMENT_CERIUM(), fn() => new Writer(Ids::ELEMENT_58)); - $this->map(VanillaBlocks::ELEMENT_CESIUM(), fn() => new Writer(Ids::ELEMENT_55)); - $this->map(VanillaBlocks::ELEMENT_CHLORINE(), fn() => new Writer(Ids::ELEMENT_17)); - $this->map(VanillaBlocks::ELEMENT_CHROMIUM(), fn() => new Writer(Ids::ELEMENT_24)); - $this->map(VanillaBlocks::ELEMENT_COBALT(), fn() => new Writer(Ids::ELEMENT_27)); - $this->map(VanillaBlocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(VanillaBlocks::ELEMENT_COPERNICIUM(), fn() => new Writer(Ids::ELEMENT_112)); - $this->map(VanillaBlocks::ELEMENT_COPPER(), fn() => new Writer(Ids::ELEMENT_29)); - $this->map(VanillaBlocks::ELEMENT_CURIUM(), fn() => new Writer(Ids::ELEMENT_96)); - $this->map(VanillaBlocks::ELEMENT_DARMSTADTIUM(), fn() => new Writer(Ids::ELEMENT_110)); - $this->map(VanillaBlocks::ELEMENT_DUBNIUM(), fn() => new Writer(Ids::ELEMENT_105)); - $this->map(VanillaBlocks::ELEMENT_DYSPROSIUM(), fn() => new Writer(Ids::ELEMENT_66)); - $this->map(VanillaBlocks::ELEMENT_EINSTEINIUM(), fn() => new Writer(Ids::ELEMENT_99)); - $this->map(VanillaBlocks::ELEMENT_ERBIUM(), fn() => new Writer(Ids::ELEMENT_68)); - $this->map(VanillaBlocks::ELEMENT_EUROPIUM(), fn() => new Writer(Ids::ELEMENT_63)); - $this->map(VanillaBlocks::ELEMENT_FERMIUM(), fn() => new Writer(Ids::ELEMENT_100)); - $this->map(VanillaBlocks::ELEMENT_FLEROVIUM(), fn() => new Writer(Ids::ELEMENT_114)); - $this->map(VanillaBlocks::ELEMENT_FLUORINE(), fn() => new Writer(Ids::ELEMENT_9)); - $this->map(VanillaBlocks::ELEMENT_FRANCIUM(), fn() => new Writer(Ids::ELEMENT_87)); - $this->map(VanillaBlocks::ELEMENT_GADOLINIUM(), fn() => new Writer(Ids::ELEMENT_64)); - $this->map(VanillaBlocks::ELEMENT_GALLIUM(), fn() => new Writer(Ids::ELEMENT_31)); - $this->map(VanillaBlocks::ELEMENT_GERMANIUM(), fn() => new Writer(Ids::ELEMENT_32)); - $this->map(VanillaBlocks::ELEMENT_GOLD(), fn() => new Writer(Ids::ELEMENT_79)); - $this->map(VanillaBlocks::ELEMENT_HAFNIUM(), fn() => new Writer(Ids::ELEMENT_72)); - $this->map(VanillaBlocks::ELEMENT_HASSIUM(), fn() => new Writer(Ids::ELEMENT_108)); - $this->map(VanillaBlocks::ELEMENT_HELIUM(), fn() => new Writer(Ids::ELEMENT_2)); - $this->map(VanillaBlocks::ELEMENT_HOLMIUM(), fn() => new Writer(Ids::ELEMENT_67)); - $this->map(VanillaBlocks::ELEMENT_HYDROGEN(), fn() => new Writer(Ids::ELEMENT_1)); - $this->map(VanillaBlocks::ELEMENT_INDIUM(), fn() => new Writer(Ids::ELEMENT_49)); - $this->map(VanillaBlocks::ELEMENT_IODINE(), fn() => new Writer(Ids::ELEMENT_53)); - $this->map(VanillaBlocks::ELEMENT_IRIDIUM(), fn() => new Writer(Ids::ELEMENT_77)); - $this->map(VanillaBlocks::ELEMENT_IRON(), fn() => new Writer(Ids::ELEMENT_26)); - $this->map(VanillaBlocks::ELEMENT_KRYPTON(), fn() => new Writer(Ids::ELEMENT_36)); - $this->map(VanillaBlocks::ELEMENT_LANTHANUM(), fn() => new Writer(Ids::ELEMENT_57)); - $this->map(VanillaBlocks::ELEMENT_LAWRENCIUM(), fn() => new Writer(Ids::ELEMENT_103)); - $this->map(VanillaBlocks::ELEMENT_LEAD(), fn() => new Writer(Ids::ELEMENT_82)); - $this->map(VanillaBlocks::ELEMENT_LITHIUM(), fn() => new Writer(Ids::ELEMENT_3)); - $this->map(VanillaBlocks::ELEMENT_LIVERMORIUM(), fn() => new Writer(Ids::ELEMENT_116)); - $this->map(VanillaBlocks::ELEMENT_LUTETIUM(), fn() => new Writer(Ids::ELEMENT_71)); - $this->map(VanillaBlocks::ELEMENT_MAGNESIUM(), fn() => new Writer(Ids::ELEMENT_12)); - $this->map(VanillaBlocks::ELEMENT_MANGANESE(), fn() => new Writer(Ids::ELEMENT_25)); - $this->map(VanillaBlocks::ELEMENT_MEITNERIUM(), fn() => new Writer(Ids::ELEMENT_109)); - $this->map(VanillaBlocks::ELEMENT_MENDELEVIUM(), fn() => new Writer(Ids::ELEMENT_101)); - $this->map(VanillaBlocks::ELEMENT_MERCURY(), fn() => new Writer(Ids::ELEMENT_80)); - $this->map(VanillaBlocks::ELEMENT_MOLYBDENUM(), fn() => new Writer(Ids::ELEMENT_42)); - $this->map(VanillaBlocks::ELEMENT_MOSCOVIUM(), fn() => new Writer(Ids::ELEMENT_115)); - $this->map(VanillaBlocks::ELEMENT_NEODYMIUM(), fn() => new Writer(Ids::ELEMENT_60)); - $this->map(VanillaBlocks::ELEMENT_NEON(), fn() => new Writer(Ids::ELEMENT_10)); - $this->map(VanillaBlocks::ELEMENT_NEPTUNIUM(), fn() => new Writer(Ids::ELEMENT_93)); - $this->map(VanillaBlocks::ELEMENT_NICKEL(), fn() => new Writer(Ids::ELEMENT_28)); - $this->map(VanillaBlocks::ELEMENT_NIHONIUM(), fn() => new Writer(Ids::ELEMENT_113)); - $this->map(VanillaBlocks::ELEMENT_NIOBIUM(), fn() => new Writer(Ids::ELEMENT_41)); - $this->map(VanillaBlocks::ELEMENT_NITROGEN(), fn() => new Writer(Ids::ELEMENT_7)); - $this->map(VanillaBlocks::ELEMENT_NOBELIUM(), fn() => new Writer(Ids::ELEMENT_102)); - $this->map(VanillaBlocks::ELEMENT_OGANESSON(), fn() => new Writer(Ids::ELEMENT_118)); - $this->map(VanillaBlocks::ELEMENT_OSMIUM(), fn() => new Writer(Ids::ELEMENT_76)); - $this->map(VanillaBlocks::ELEMENT_OXYGEN(), fn() => new Writer(Ids::ELEMENT_8)); - $this->map(VanillaBlocks::ELEMENT_PALLADIUM(), fn() => new Writer(Ids::ELEMENT_46)); - $this->map(VanillaBlocks::ELEMENT_PHOSPHORUS(), fn() => new Writer(Ids::ELEMENT_15)); - $this->map(VanillaBlocks::ELEMENT_PLATINUM(), fn() => new Writer(Ids::ELEMENT_78)); - $this->map(VanillaBlocks::ELEMENT_PLUTONIUM(), fn() => new Writer(Ids::ELEMENT_94)); - $this->map(VanillaBlocks::ELEMENT_POLONIUM(), fn() => new Writer(Ids::ELEMENT_84)); - $this->map(VanillaBlocks::ELEMENT_POTASSIUM(), fn() => new Writer(Ids::ELEMENT_19)); - $this->map(VanillaBlocks::ELEMENT_PRASEODYMIUM(), fn() => new Writer(Ids::ELEMENT_59)); - $this->map(VanillaBlocks::ELEMENT_PROMETHIUM(), fn() => new Writer(Ids::ELEMENT_61)); - $this->map(VanillaBlocks::ELEMENT_PROTACTINIUM(), fn() => new Writer(Ids::ELEMENT_91)); - $this->map(VanillaBlocks::ELEMENT_RADIUM(), fn() => new Writer(Ids::ELEMENT_88)); - $this->map(VanillaBlocks::ELEMENT_RADON(), fn() => new Writer(Ids::ELEMENT_86)); - $this->map(VanillaBlocks::ELEMENT_RHENIUM(), fn() => new Writer(Ids::ELEMENT_75)); - $this->map(VanillaBlocks::ELEMENT_RHODIUM(), fn() => new Writer(Ids::ELEMENT_45)); - $this->map(VanillaBlocks::ELEMENT_ROENTGENIUM(), fn() => new Writer(Ids::ELEMENT_111)); - $this->map(VanillaBlocks::ELEMENT_RUBIDIUM(), fn() => new Writer(Ids::ELEMENT_37)); - $this->map(VanillaBlocks::ELEMENT_RUTHENIUM(), fn() => new Writer(Ids::ELEMENT_44)); - $this->map(VanillaBlocks::ELEMENT_RUTHERFORDIUM(), fn() => new Writer(Ids::ELEMENT_104)); - $this->map(VanillaBlocks::ELEMENT_SAMARIUM(), fn() => new Writer(Ids::ELEMENT_62)); - $this->map(VanillaBlocks::ELEMENT_SCANDIUM(), fn() => new Writer(Ids::ELEMENT_21)); - $this->map(VanillaBlocks::ELEMENT_SEABORGIUM(), fn() => new Writer(Ids::ELEMENT_106)); - $this->map(VanillaBlocks::ELEMENT_SELENIUM(), fn() => new Writer(Ids::ELEMENT_34)); - $this->map(VanillaBlocks::ELEMENT_SILICON(), fn() => new Writer(Ids::ELEMENT_14)); - $this->map(VanillaBlocks::ELEMENT_SILVER(), fn() => new Writer(Ids::ELEMENT_47)); - $this->map(VanillaBlocks::ELEMENT_SODIUM(), fn() => new Writer(Ids::ELEMENT_11)); - $this->map(VanillaBlocks::ELEMENT_STRONTIUM(), fn() => new Writer(Ids::ELEMENT_38)); - $this->map(VanillaBlocks::ELEMENT_SULFUR(), fn() => new Writer(Ids::ELEMENT_16)); - $this->map(VanillaBlocks::ELEMENT_TANTALUM(), fn() => new Writer(Ids::ELEMENT_73)); - $this->map(VanillaBlocks::ELEMENT_TECHNETIUM(), fn() => new Writer(Ids::ELEMENT_43)); - $this->map(VanillaBlocks::ELEMENT_TELLURIUM(), fn() => new Writer(Ids::ELEMENT_52)); - $this->map(VanillaBlocks::ELEMENT_TENNESSINE(), fn() => new Writer(Ids::ELEMENT_117)); - $this->map(VanillaBlocks::ELEMENT_TERBIUM(), fn() => new Writer(Ids::ELEMENT_65)); - $this->map(VanillaBlocks::ELEMENT_THALLIUM(), fn() => new Writer(Ids::ELEMENT_81)); - $this->map(VanillaBlocks::ELEMENT_THORIUM(), fn() => new Writer(Ids::ELEMENT_90)); - $this->map(VanillaBlocks::ELEMENT_THULIUM(), fn() => new Writer(Ids::ELEMENT_69)); - $this->map(VanillaBlocks::ELEMENT_TIN(), fn() => new Writer(Ids::ELEMENT_50)); - $this->map(VanillaBlocks::ELEMENT_TITANIUM(), fn() => new Writer(Ids::ELEMENT_22)); - $this->map(VanillaBlocks::ELEMENT_TUNGSTEN(), fn() => new Writer(Ids::ELEMENT_74)); - $this->map(VanillaBlocks::ELEMENT_URANIUM(), fn() => new Writer(Ids::ELEMENT_92)); - $this->map(VanillaBlocks::ELEMENT_VANADIUM(), fn() => new Writer(Ids::ELEMENT_23)); - $this->map(VanillaBlocks::ELEMENT_XENON(), fn() => new Writer(Ids::ELEMENT_54)); - $this->map(VanillaBlocks::ELEMENT_YTTERBIUM(), fn() => new Writer(Ids::ELEMENT_70)); - $this->map(VanillaBlocks::ELEMENT_YTTRIUM(), fn() => new Writer(Ids::ELEMENT_39)); - $this->map(VanillaBlocks::ELEMENT_ZERO(), fn() => new Writer(Ids::ELEMENT_0)); - $this->map(VanillaBlocks::ELEMENT_ZINC(), fn() => new Writer(Ids::ELEMENT_30)); - $this->map(VanillaBlocks::ELEMENT_ZIRCONIUM(), fn() => new Writer(Ids::ELEMENT_40)); - $this->map(VanillaBlocks::EMERALD(), fn() => new Writer(Ids::EMERALD_BLOCK)); - $this->map(VanillaBlocks::EMERALD_ORE(), fn() => new Writer(Ids::EMERALD_ORE)); - $this->map(VanillaBlocks::ENCHANTING_TABLE(), fn() => new Writer(Ids::ENCHANTING_TABLE)); - $this->map(VanillaBlocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ + $this->map(Blocks::ELEMENT_ACTINIUM(), fn() => new Writer(Ids::ELEMENT_89)); + $this->map(Blocks::ELEMENT_ALUMINUM(), fn() => new Writer(Ids::ELEMENT_13)); + $this->map(Blocks::ELEMENT_AMERICIUM(), fn() => new Writer(Ids::ELEMENT_95)); + $this->map(Blocks::ELEMENT_ANTIMONY(), fn() => new Writer(Ids::ELEMENT_51)); + $this->map(Blocks::ELEMENT_ARGON(), fn() => new Writer(Ids::ELEMENT_18)); + $this->map(Blocks::ELEMENT_ARSENIC(), fn() => new Writer(Ids::ELEMENT_33)); + $this->map(Blocks::ELEMENT_ASTATINE(), fn() => new Writer(Ids::ELEMENT_85)); + $this->map(Blocks::ELEMENT_BARIUM(), fn() => new Writer(Ids::ELEMENT_56)); + $this->map(Blocks::ELEMENT_BERKELIUM(), fn() => new Writer(Ids::ELEMENT_97)); + $this->map(Blocks::ELEMENT_BERYLLIUM(), fn() => new Writer(Ids::ELEMENT_4)); + $this->map(Blocks::ELEMENT_BISMUTH(), fn() => new Writer(Ids::ELEMENT_83)); + $this->map(Blocks::ELEMENT_BOHRIUM(), fn() => new Writer(Ids::ELEMENT_107)); + $this->map(Blocks::ELEMENT_BORON(), fn() => new Writer(Ids::ELEMENT_5)); + $this->map(Blocks::ELEMENT_BROMINE(), fn() => new Writer(Ids::ELEMENT_35)); + $this->map(Blocks::ELEMENT_CADMIUM(), fn() => new Writer(Ids::ELEMENT_48)); + $this->map(Blocks::ELEMENT_CALCIUM(), fn() => new Writer(Ids::ELEMENT_20)); + $this->map(Blocks::ELEMENT_CALIFORNIUM(), fn() => new Writer(Ids::ELEMENT_98)); + $this->map(Blocks::ELEMENT_CARBON(), fn() => new Writer(Ids::ELEMENT_6)); + $this->map(Blocks::ELEMENT_CERIUM(), fn() => new Writer(Ids::ELEMENT_58)); + $this->map(Blocks::ELEMENT_CESIUM(), fn() => new Writer(Ids::ELEMENT_55)); + $this->map(Blocks::ELEMENT_CHLORINE(), fn() => new Writer(Ids::ELEMENT_17)); + $this->map(Blocks::ELEMENT_CHROMIUM(), fn() => new Writer(Ids::ELEMENT_24)); + $this->map(Blocks::ELEMENT_COBALT(), fn() => new Writer(Ids::ELEMENT_27)); + $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::ELEMENT_COPERNICIUM(), fn() => new Writer(Ids::ELEMENT_112)); + $this->map(Blocks::ELEMENT_COPPER(), fn() => new Writer(Ids::ELEMENT_29)); + $this->map(Blocks::ELEMENT_CURIUM(), fn() => new Writer(Ids::ELEMENT_96)); + $this->map(Blocks::ELEMENT_DARMSTADTIUM(), fn() => new Writer(Ids::ELEMENT_110)); + $this->map(Blocks::ELEMENT_DUBNIUM(), fn() => new Writer(Ids::ELEMENT_105)); + $this->map(Blocks::ELEMENT_DYSPROSIUM(), fn() => new Writer(Ids::ELEMENT_66)); + $this->map(Blocks::ELEMENT_EINSTEINIUM(), fn() => new Writer(Ids::ELEMENT_99)); + $this->map(Blocks::ELEMENT_ERBIUM(), fn() => new Writer(Ids::ELEMENT_68)); + $this->map(Blocks::ELEMENT_EUROPIUM(), fn() => new Writer(Ids::ELEMENT_63)); + $this->map(Blocks::ELEMENT_FERMIUM(), fn() => new Writer(Ids::ELEMENT_100)); + $this->map(Blocks::ELEMENT_FLEROVIUM(), fn() => new Writer(Ids::ELEMENT_114)); + $this->map(Blocks::ELEMENT_FLUORINE(), fn() => new Writer(Ids::ELEMENT_9)); + $this->map(Blocks::ELEMENT_FRANCIUM(), fn() => new Writer(Ids::ELEMENT_87)); + $this->map(Blocks::ELEMENT_GADOLINIUM(), fn() => new Writer(Ids::ELEMENT_64)); + $this->map(Blocks::ELEMENT_GALLIUM(), fn() => new Writer(Ids::ELEMENT_31)); + $this->map(Blocks::ELEMENT_GERMANIUM(), fn() => new Writer(Ids::ELEMENT_32)); + $this->map(Blocks::ELEMENT_GOLD(), fn() => new Writer(Ids::ELEMENT_79)); + $this->map(Blocks::ELEMENT_HAFNIUM(), fn() => new Writer(Ids::ELEMENT_72)); + $this->map(Blocks::ELEMENT_HASSIUM(), fn() => new Writer(Ids::ELEMENT_108)); + $this->map(Blocks::ELEMENT_HELIUM(), fn() => new Writer(Ids::ELEMENT_2)); + $this->map(Blocks::ELEMENT_HOLMIUM(), fn() => new Writer(Ids::ELEMENT_67)); + $this->map(Blocks::ELEMENT_HYDROGEN(), fn() => new Writer(Ids::ELEMENT_1)); + $this->map(Blocks::ELEMENT_INDIUM(), fn() => new Writer(Ids::ELEMENT_49)); + $this->map(Blocks::ELEMENT_IODINE(), fn() => new Writer(Ids::ELEMENT_53)); + $this->map(Blocks::ELEMENT_IRIDIUM(), fn() => new Writer(Ids::ELEMENT_77)); + $this->map(Blocks::ELEMENT_IRON(), fn() => new Writer(Ids::ELEMENT_26)); + $this->map(Blocks::ELEMENT_KRYPTON(), fn() => new Writer(Ids::ELEMENT_36)); + $this->map(Blocks::ELEMENT_LANTHANUM(), fn() => new Writer(Ids::ELEMENT_57)); + $this->map(Blocks::ELEMENT_LAWRENCIUM(), fn() => new Writer(Ids::ELEMENT_103)); + $this->map(Blocks::ELEMENT_LEAD(), fn() => new Writer(Ids::ELEMENT_82)); + $this->map(Blocks::ELEMENT_LITHIUM(), fn() => new Writer(Ids::ELEMENT_3)); + $this->map(Blocks::ELEMENT_LIVERMORIUM(), fn() => new Writer(Ids::ELEMENT_116)); + $this->map(Blocks::ELEMENT_LUTETIUM(), fn() => new Writer(Ids::ELEMENT_71)); + $this->map(Blocks::ELEMENT_MAGNESIUM(), fn() => new Writer(Ids::ELEMENT_12)); + $this->map(Blocks::ELEMENT_MANGANESE(), fn() => new Writer(Ids::ELEMENT_25)); + $this->map(Blocks::ELEMENT_MEITNERIUM(), fn() => new Writer(Ids::ELEMENT_109)); + $this->map(Blocks::ELEMENT_MENDELEVIUM(), fn() => new Writer(Ids::ELEMENT_101)); + $this->map(Blocks::ELEMENT_MERCURY(), fn() => new Writer(Ids::ELEMENT_80)); + $this->map(Blocks::ELEMENT_MOLYBDENUM(), fn() => new Writer(Ids::ELEMENT_42)); + $this->map(Blocks::ELEMENT_MOSCOVIUM(), fn() => new Writer(Ids::ELEMENT_115)); + $this->map(Blocks::ELEMENT_NEODYMIUM(), fn() => new Writer(Ids::ELEMENT_60)); + $this->map(Blocks::ELEMENT_NEON(), fn() => new Writer(Ids::ELEMENT_10)); + $this->map(Blocks::ELEMENT_NEPTUNIUM(), fn() => new Writer(Ids::ELEMENT_93)); + $this->map(Blocks::ELEMENT_NICKEL(), fn() => new Writer(Ids::ELEMENT_28)); + $this->map(Blocks::ELEMENT_NIHONIUM(), fn() => new Writer(Ids::ELEMENT_113)); + $this->map(Blocks::ELEMENT_NIOBIUM(), fn() => new Writer(Ids::ELEMENT_41)); + $this->map(Blocks::ELEMENT_NITROGEN(), fn() => new Writer(Ids::ELEMENT_7)); + $this->map(Blocks::ELEMENT_NOBELIUM(), fn() => new Writer(Ids::ELEMENT_102)); + $this->map(Blocks::ELEMENT_OGANESSON(), fn() => new Writer(Ids::ELEMENT_118)); + $this->map(Blocks::ELEMENT_OSMIUM(), fn() => new Writer(Ids::ELEMENT_76)); + $this->map(Blocks::ELEMENT_OXYGEN(), fn() => new Writer(Ids::ELEMENT_8)); + $this->map(Blocks::ELEMENT_PALLADIUM(), fn() => new Writer(Ids::ELEMENT_46)); + $this->map(Blocks::ELEMENT_PHOSPHORUS(), fn() => new Writer(Ids::ELEMENT_15)); + $this->map(Blocks::ELEMENT_PLATINUM(), fn() => new Writer(Ids::ELEMENT_78)); + $this->map(Blocks::ELEMENT_PLUTONIUM(), fn() => new Writer(Ids::ELEMENT_94)); + $this->map(Blocks::ELEMENT_POLONIUM(), fn() => new Writer(Ids::ELEMENT_84)); + $this->map(Blocks::ELEMENT_POTASSIUM(), fn() => new Writer(Ids::ELEMENT_19)); + $this->map(Blocks::ELEMENT_PRASEODYMIUM(), fn() => new Writer(Ids::ELEMENT_59)); + $this->map(Blocks::ELEMENT_PROMETHIUM(), fn() => new Writer(Ids::ELEMENT_61)); + $this->map(Blocks::ELEMENT_PROTACTINIUM(), fn() => new Writer(Ids::ELEMENT_91)); + $this->map(Blocks::ELEMENT_RADIUM(), fn() => new Writer(Ids::ELEMENT_88)); + $this->map(Blocks::ELEMENT_RADON(), fn() => new Writer(Ids::ELEMENT_86)); + $this->map(Blocks::ELEMENT_RHENIUM(), fn() => new Writer(Ids::ELEMENT_75)); + $this->map(Blocks::ELEMENT_RHODIUM(), fn() => new Writer(Ids::ELEMENT_45)); + $this->map(Blocks::ELEMENT_ROENTGENIUM(), fn() => new Writer(Ids::ELEMENT_111)); + $this->map(Blocks::ELEMENT_RUBIDIUM(), fn() => new Writer(Ids::ELEMENT_37)); + $this->map(Blocks::ELEMENT_RUTHENIUM(), fn() => new Writer(Ids::ELEMENT_44)); + $this->map(Blocks::ELEMENT_RUTHERFORDIUM(), fn() => new Writer(Ids::ELEMENT_104)); + $this->map(Blocks::ELEMENT_SAMARIUM(), fn() => new Writer(Ids::ELEMENT_62)); + $this->map(Blocks::ELEMENT_SCANDIUM(), fn() => new Writer(Ids::ELEMENT_21)); + $this->map(Blocks::ELEMENT_SEABORGIUM(), fn() => new Writer(Ids::ELEMENT_106)); + $this->map(Blocks::ELEMENT_SELENIUM(), fn() => new Writer(Ids::ELEMENT_34)); + $this->map(Blocks::ELEMENT_SILICON(), fn() => new Writer(Ids::ELEMENT_14)); + $this->map(Blocks::ELEMENT_SILVER(), fn() => new Writer(Ids::ELEMENT_47)); + $this->map(Blocks::ELEMENT_SODIUM(), fn() => new Writer(Ids::ELEMENT_11)); + $this->map(Blocks::ELEMENT_STRONTIUM(), fn() => new Writer(Ids::ELEMENT_38)); + $this->map(Blocks::ELEMENT_SULFUR(), fn() => new Writer(Ids::ELEMENT_16)); + $this->map(Blocks::ELEMENT_TANTALUM(), fn() => new Writer(Ids::ELEMENT_73)); + $this->map(Blocks::ELEMENT_TECHNETIUM(), fn() => new Writer(Ids::ELEMENT_43)); + $this->map(Blocks::ELEMENT_TELLURIUM(), fn() => new Writer(Ids::ELEMENT_52)); + $this->map(Blocks::ELEMENT_TENNESSINE(), fn() => new Writer(Ids::ELEMENT_117)); + $this->map(Blocks::ELEMENT_TERBIUM(), fn() => new Writer(Ids::ELEMENT_65)); + $this->map(Blocks::ELEMENT_THALLIUM(), fn() => new Writer(Ids::ELEMENT_81)); + $this->map(Blocks::ELEMENT_THORIUM(), fn() => new Writer(Ids::ELEMENT_90)); + $this->map(Blocks::ELEMENT_THULIUM(), fn() => new Writer(Ids::ELEMENT_69)); + $this->map(Blocks::ELEMENT_TIN(), fn() => new Writer(Ids::ELEMENT_50)); + $this->map(Blocks::ELEMENT_TITANIUM(), fn() => new Writer(Ids::ELEMENT_22)); + $this->map(Blocks::ELEMENT_TUNGSTEN(), fn() => new Writer(Ids::ELEMENT_74)); + $this->map(Blocks::ELEMENT_URANIUM(), fn() => new Writer(Ids::ELEMENT_92)); + $this->map(Blocks::ELEMENT_VANADIUM(), fn() => new Writer(Ids::ELEMENT_23)); + $this->map(Blocks::ELEMENT_XENON(), fn() => new Writer(Ids::ELEMENT_54)); + $this->map(Blocks::ELEMENT_YTTERBIUM(), fn() => new Writer(Ids::ELEMENT_70)); + $this->map(Blocks::ELEMENT_YTTRIUM(), fn() => new Writer(Ids::ELEMENT_39)); + $this->map(Blocks::ELEMENT_ZERO(), fn() => new Writer(Ids::ELEMENT_0)); + $this->map(Blocks::ELEMENT_ZINC(), fn() => new Writer(Ids::ELEMENT_30)); + $this->map(Blocks::ELEMENT_ZIRCONIUM(), fn() => new Writer(Ids::ELEMENT_40)); + $this->map(Blocks::EMERALD(), fn() => new Writer(Ids::EMERALD_BLOCK)); + $this->map(Blocks::EMERALD_ORE(), fn() => new Writer(Ids::EMERALD_ORE)); + $this->map(Blocks::ENCHANTING_TABLE(), fn() => new Writer(Ids::ENCHANTING_TABLE)); + $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::END_PORTAL_FRAME(), function(EndPortalFrame $block) : Writer{ + $this->map(Blocks::END_PORTAL_FRAME(), function(EndPortalFrame $block) : Writer{ return Writer::create(Ids::END_PORTAL_FRAME) - ->writeBool(BlockStateNames::END_PORTAL_EYE_BIT, $block->hasEye()) + ->writeBool(StateNames::END_PORTAL_EYE_BIT, $block->hasEye()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::END_ROD(), function(EndRod $block) : Writer{ + $this->map(Blocks::END_ROD(), function(EndRod $block) : Writer{ return Writer::create(Ids::END_ROD) ->writeEndRodFacingDirection($block->getFacing()); }); - $this->map(VanillaBlocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); - $this->map(VanillaBlocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); - $this->map(VanillaBlocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); - $this->map(VanillaBlocks::END_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::END_BRICK_STAIRS))); - $this->map(VanillaBlocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); - $this->map(VanillaBlocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_WOOD)); - $this->map(VanillaBlocks::FARMLAND(), function(Farmland $block) : Writer{ + $this->map(Blocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); + $this->map(Blocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); + $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); + $this->map(Blocks::END_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::END_BRICK_STAIRS))); + $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); + $this->map(Blocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_WOOD)); + $this->map(Blocks::FARMLAND(), function(Farmland $block) : Writer{ return Writer::create(Ids::FARMLAND) - ->writeInt(BlockStateNames::MOISTURIZED_AMOUNT, $block->getWetness()); + ->writeInt(StateNames::MOISTURIZED_AMOUNT, $block->getWetness()); }); - $this->map(VanillaBlocks::FERN(), fn() => Writer::create(Ids::TALLGRASS) - ->writeString(BlockStateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_FERN)); - $this->map(VanillaBlocks::FIRE(), function(Fire $block) : Writer{ + $this->map(Blocks::FERN(), fn() => Writer::create(Ids::TALLGRASS) + ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_FERN)); + $this->map(Blocks::FIRE(), function(Fire $block) : Writer{ return Writer::create(Ids::FIRE) - ->writeInt(BlockStateNames::AGE, $block->getAge()); + ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(VanillaBlocks::FLETCHING_TABLE(), fn() => new Writer(Ids::FLETCHING_TABLE)); - $this->map(VanillaBlocks::FLOWER_POT(), function() : Writer{ + $this->map(Blocks::FLETCHING_TABLE(), fn() => new Writer(Ids::FLETCHING_TABLE)); + $this->map(Blocks::FLOWER_POT(), function() : Writer{ return Writer::create(Ids::FLOWER_POT) - ->writeBool(BlockStateNames::UPDATE_BIT, true); //to keep MCPE happy + ->writeBool(StateNames::UPDATE_BIT, true); //to keep MCPE happy }); - $this->map(VanillaBlocks::FROSTED_ICE(), function(FrostedIce $block) : Writer{ + $this->map(Blocks::FROSTED_ICE(), function(FrostedIce $block) : Writer{ return Writer::create(Ids::FROSTED_ICE) - ->writeInt(BlockStateNames::AGE, $block->getAge()); + ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(VanillaBlocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); - $this->map(VanillaBlocks::GLASS(), fn() => new Writer(Ids::GLASS)); - $this->map(VanillaBlocks::GLASS_PANE(), fn() => new Writer(Ids::GLASS_PANE)); - $this->map(VanillaBlocks::GLOWING_OBSIDIAN(), fn() => new Writer(Ids::GLOWINGOBSIDIAN)); - $this->map(VanillaBlocks::GLOWSTONE(), fn() => new Writer(Ids::GLOWSTONE)); - $this->map(VanillaBlocks::GOLD(), fn() => new Writer(Ids::GOLD_BLOCK)); - $this->map(VanillaBlocks::GOLD_ORE(), fn() => new Writer(Ids::GOLD_ORE)); - $this->map(VanillaBlocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); - $this->map(VanillaBlocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); - $this->map(VanillaBlocks::GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::GRANITE_STAIRS))); - $this->map(VanillaBlocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); - $this->map(VanillaBlocks::GRASS(), fn() => new Writer(Ids::GRASS)); - $this->map(VanillaBlocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); - $this->map(VanillaBlocks::GRAVEL(), fn() => new Writer(Ids::GRAVEL)); - $this->map(VanillaBlocks::GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GRAY_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::GREEN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GREEN_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); - $this->map(VanillaBlocks::HARDENED_CLAY(), fn() => new Writer(Ids::HARDENED_CLAY)); - $this->map(VanillaBlocks::HARDENED_GLASS(), fn() => new Writer(Ids::HARD_GLASS)); - $this->map(VanillaBlocks::HARDENED_GLASS_PANE(), fn() => new Writer(Ids::HARD_GLASS_PANE)); - $this->map(VanillaBlocks::HAY_BALE(), function(HayBale $block) : Writer{ + $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); + $this->map(Blocks::GLASS(), fn() => new Writer(Ids::GLASS)); + $this->map(Blocks::GLASS_PANE(), fn() => new Writer(Ids::GLASS_PANE)); + $this->map(Blocks::GLOWING_OBSIDIAN(), fn() => new Writer(Ids::GLOWINGOBSIDIAN)); + $this->map(Blocks::GLOWSTONE(), fn() => new Writer(Ids::GLOWSTONE)); + $this->map(Blocks::GOLD(), fn() => new Writer(Ids::GOLD_BLOCK)); + $this->map(Blocks::GOLD_ORE(), fn() => new Writer(Ids::GOLD_ORE)); + $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); + $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); + $this->map(Blocks::GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::GRANITE_STAIRS))); + $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); + $this->map(Blocks::GRASS(), fn() => new Writer(Ids::GRASS)); + $this->map(Blocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); + $this->map(Blocks::GRAVEL(), fn() => new Writer(Ids::GRAVEL)); + $this->map(Blocks::GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GRAY_GLAZED_TERRACOTTA))); + $this->map(Blocks::GREEN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GREEN_GLAZED_TERRACOTTA))); + $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(Blocks::HARDENED_CLAY(), fn() => new Writer(Ids::HARDENED_CLAY)); + $this->map(Blocks::HARDENED_GLASS(), fn() => new Writer(Ids::HARD_GLASS)); + $this->map(Blocks::HARDENED_GLASS_PANE(), fn() => new Writer(Ids::HARD_GLASS_PANE)); + $this->map(Blocks::HAY_BALE(), function(HayBale $block) : Writer{ return Writer::create(Ids::HAY_BLOCK) - ->writeInt(BlockStateNames::DEPRECATED, 0) + ->writeInt(StateNames::DEPRECATED, 0) ->writePillarAxis($block->getAxis()); }); - $this->map(VanillaBlocks::HOPPER(), function(Hopper $block) : Writer{ + $this->map(Blocks::HOPPER(), function(Hopper $block) : Writer{ return Writer::create(Ids::HOPPER) - ->writeBool(BlockStateNames::TOGGLE_BIT, $block->isPowered()) + ->writeBool(StateNames::TOGGLE_BIT, $block->isPowered()) ->writeFacingWithoutUp($block->getFacing()); }); - $this->map(VanillaBlocks::ICE(), fn() => new Writer(Ids::ICE)); - $this->map(VanillaBlocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); - $this->map(VanillaBlocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE)); - $this->map(VanillaBlocks::INFESTED_CRACKED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK)); - $this->map(VanillaBlocks::INFESTED_MOSSY_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK)); - $this->map(VanillaBlocks::INFESTED_STONE(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); - $this->map(VanillaBlocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(BlockStateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); - $this->map(VanillaBlocks::INFO_UPDATE(), fn() => new Writer(Ids::INFO_UPDATE)); - $this->map(VanillaBlocks::INFO_UPDATE2(), fn() => new Writer(Ids::INFO_UPDATE2)); - $this->map(VanillaBlocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLEBEDROCK)); - $this->map(VanillaBlocks::IRON(), fn() => new Writer(Ids::IRON_BLOCK)); - $this->map(VanillaBlocks::IRON_BARS(), fn() => new Writer(Ids::IRON_BARS)); - $this->map(VanillaBlocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); - $this->map(VanillaBlocks::IRON_ORE(), fn() => new Writer(Ids::IRON_ORE)); - $this->map(VanillaBlocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); - $this->map(VanillaBlocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ + $this->map(Blocks::ICE(), fn() => new Writer(Ids::ICE)); + $this->map(Blocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); + $this->map(Blocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE)); + $this->map(Blocks::INFESTED_CRACKED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK)); + $this->map(Blocks::INFESTED_MOSSY_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK)); + $this->map(Blocks::INFESTED_STONE(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); + $this->map(Blocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) + ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); + $this->map(Blocks::INFO_UPDATE(), fn() => new Writer(Ids::INFO_UPDATE)); + $this->map(Blocks::INFO_UPDATE2(), fn() => new Writer(Ids::INFO_UPDATE2)); + $this->map(Blocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLEBEDROCK)); + $this->map(Blocks::IRON(), fn() => new Writer(Ids::IRON_BLOCK)); + $this->map(Blocks::IRON_BARS(), fn() => new Writer(Ids::IRON_BARS)); + $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); + $this->map(Blocks::IRON_ORE(), fn() => new Writer(Ids::IRON_ORE)); + $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); + $this->map(Blocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ return Writer::create(Ids::FRAME) - ->writeBool(BlockStateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) - ->writeBool(BlockStateNames::ITEM_FRAME_PHOTO_BIT, false) + ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) + ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::JUKEBOX(), fn() => new Writer(Ids::JUKEBOX)); - $this->map(VanillaBlocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); - $this->map(VanillaBlocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); - $this->map(VanillaBlocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); - $this->map(VanillaBlocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); - $this->map(VanillaBlocks::JUNGLE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::JUNGLE_STANDING_SIGN))); - $this->map(VanillaBlocks::JUNGLE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_JUNGLE)); - $this->map(VanillaBlocks::JUNGLE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::JUNGLE_STAIRS))); - $this->map(VanillaBlocks::JUNGLE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::JUNGLE_TRAPDOOR))); - $this->map(VanillaBlocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); - $this->map(VanillaBlocks::JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(VanillaBlocks::LADDER(), function(Ladder $block) : Writer{ + $this->map(Blocks::JUKEBOX(), fn() => new Writer(Ids::JUKEBOX)); + $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); + $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); + $this->map(Blocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); + $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); + $this->map(Blocks::JUNGLE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::JUNGLE_STANDING_SIGN))); + $this->map(Blocks::JUNGLE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::JUNGLE_STAIRS))); + $this->map(Blocks::JUNGLE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::JUNGLE_TRAPDOOR))); + $this->map(Blocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); + $this->map(Blocks::JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::LADDER(), function(Ladder $block) : Writer{ return Writer::create(Ids::LADDER) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::LANTERN(), function(Lantern $block) : Writer{ + $this->map(Blocks::LANTERN(), function(Lantern $block) : Writer{ return Writer::create(Ids::LANTERN) - ->writeBool(BlockStateNames::HANGING, $block->isHanging()); + ->writeBool(StateNames::HANGING, $block->isHanging()); }); - $this->map(VanillaBlocks::LAPIS_LAZULI(), fn() => new Writer(Ids::LAPIS_BLOCK)); - $this->map(VanillaBlocks::LAPIS_LAZULI_ORE(), fn() => new Writer(Ids::LAPIS_ORE)); - $this->map(VanillaBlocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); - $this->map(VanillaBlocks::LECTERN(), function(Lectern $block) : Writer{ + $this->map(Blocks::LAPIS_LAZULI(), fn() => new Writer(Ids::LAPIS_BLOCK)); + $this->map(Blocks::LAPIS_LAZULI_ORE(), fn() => new Writer(Ids::LAPIS_ORE)); + $this->map(Blocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); + $this->map(Blocks::LECTERN(), function(Lectern $block) : Writer{ return Writer::create(Ids::LECTERN) - ->writeBool(BlockStateNames::POWERED_BIT, $block->isProducingSignal()) + ->writeBool(StateNames::POWERED_BIT, $block->isProducingSignal()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::LEGACY_STONECUTTER(), fn() => new Writer(Ids::STONECUTTER)); - $this->map(VanillaBlocks::LEVER(), function(Lever $block) : Writer{ + $this->map(Blocks::LEGACY_STONECUTTER(), fn() => new Writer(Ids::STONECUTTER)); + $this->map(Blocks::LEVER(), function(Lever $block) : Writer{ return Writer::create(Ids::LEVER) - ->writeBool(BlockStateNames::OPEN_BIT, $block->isActivated()) - ->writeString(BlockStateNames::LEVER_DIRECTION, match($block->getFacing()->id()){ + ->writeBool(StateNames::OPEN_BIT, $block->isActivated()) + ->writeString(StateNames::LEVER_DIRECTION, match($block->getFacing()->id()){ LeverFacing::DOWN_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, LeverFacing::DOWN_AXIS_X()->id() => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, LeverFacing::UP_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, @@ -735,332 +736,332 @@ final class BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), }); }); - $this->map(VanillaBlocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::SILVER_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); - $this->map(VanillaBlocks::LILY_PAD(), fn() => new Writer(Ids::WATERLILY)); - $this->map(VanillaBlocks::LIME_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIME_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ + $this->map(Blocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA))); + $this->map(Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::SILVER_GLAZED_TERRACOTTA))); + $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); + $this->map(Blocks::LILY_PAD(), fn() => new Writer(Ids::WATERLILY)); + $this->map(Blocks::LIME_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIME_GLAZED_TERRACOTTA))); + $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::LOOM(), function(Loom $block) : Writer{ + $this->map(Blocks::LOOM(), function(Loom $block) : Writer{ return Writer::create(Ids::LOOM) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::MAGENTA_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::MAGENTA_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::MAGMA(), fn() => new Writer(Ids::MAGMA)); - $this->map(VanillaBlocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(VanillaBlocks::MELON(), fn() => new Writer(Ids::MELON_BLOCK)); - $this->map(VanillaBlocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); - $this->map(VanillaBlocks::MOB_HEAD(), function(Skull $block) : Writer{ + $this->map(Blocks::MAGENTA_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::MAGENTA_GLAZED_TERRACOTTA))); + $this->map(Blocks::MAGMA(), fn() => new Writer(Ids::MAGMA)); + $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::MELON(), fn() => new Writer(Ids::MELON_BLOCK)); + $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); + $this->map(Blocks::MOB_HEAD(), function(Skull $block) : Writer{ return Writer::create(Ids::SKULL) - ->writeBool(BlockStateNames::NO_DROP_BIT, $block->isNoDrops()) + ->writeBool(StateNames::NO_DROP_BIT, $block->isNoDrops()) ->writeFacingWithoutDown($block->getFacing()); }); - $this->map(VanillaBlocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); - $this->map(VanillaBlocks::MOSSY_COBBLESTONE(), fn() => new Writer(Ids::MOSSY_COBBLESTONE)); - $this->map(VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); - $this->map(VanillaBlocks::MOSSY_COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_COBBLESTONE_STAIRS))); - $this->map(VanillaBlocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); - $this->map(VanillaBlocks::MOSSY_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_MOSSY)); - $this->map(VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); - $this->map(VanillaBlocks::MOSSY_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_STONE_BRICK_STAIRS))); - $this->map(VanillaBlocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); - $this->map(VanillaBlocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) - ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); - $this->map(VanillaBlocks::MYCELIUM(), fn() => new Writer(Ids::MYCELIUM)); - $this->map(VanillaBlocks::NETHERRACK(), fn() => new Writer(Ids::NETHERRACK)); - $this->map(VanillaBlocks::NETHER_BRICKS(), fn() => new Writer(Ids::NETHER_BRICK)); - $this->map(VanillaBlocks::NETHER_BRICK_FENCE(), fn() => new Writer(Ids::NETHER_BRICK_FENCE)); - $this->map(VanillaBlocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); - $this->map(VanillaBlocks::NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NETHER_BRICK_STAIRS))); - $this->map(VanillaBlocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); - $this->map(VanillaBlocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ + $this->map(Blocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); + $this->map(Blocks::MOSSY_COBBLESTONE(), fn() => new Writer(Ids::MOSSY_COBBLESTONE)); + $this->map(Blocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); + $this->map(Blocks::MOSSY_COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_COBBLESTONE_STAIRS))); + $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); + $this->map(Blocks::MOSSY_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_MOSSY)); + $this->map(Blocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); + $this->map(Blocks::MOSSY_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_STONE_BRICK_STAIRS))); + $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); + $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); + $this->map(Blocks::MYCELIUM(), fn() => new Writer(Ids::MYCELIUM)); + $this->map(Blocks::NETHERRACK(), fn() => new Writer(Ids::NETHERRACK)); + $this->map(Blocks::NETHER_BRICKS(), fn() => new Writer(Ids::NETHER_BRICK)); + $this->map(Blocks::NETHER_BRICK_FENCE(), fn() => new Writer(Ids::NETHER_BRICK_FENCE)); + $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); + $this->map(Blocks::NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NETHER_BRICK_STAIRS))); + $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); + $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) - ->writeString(BlockStateNames::PORTAL_AXIS, match($block->getAxis()){ + ->writeString(StateNames::PORTAL_AXIS, match($block->getAxis()){ Axis::X => StringValues::PORTAL_AXIS_X, Axis::Z => StringValues::PORTAL_AXIS_Z, default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), }); }); - $this->map(VanillaBlocks::NETHER_QUARTZ_ORE(), fn() => new Writer(Ids::QUARTZ_ORE)); - $this->map(VanillaBlocks::NETHER_REACTOR_CORE(), fn() => new Writer(Ids::NETHERREACTOR)); - $this->map(VanillaBlocks::NETHER_WART(), function(NetherWartPlant $block) : Writer{ + $this->map(Blocks::NETHER_QUARTZ_ORE(), fn() => new Writer(Ids::QUARTZ_ORE)); + $this->map(Blocks::NETHER_REACTOR_CORE(), fn() => new Writer(Ids::NETHERREACTOR)); + $this->map(Blocks::NETHER_WART(), function(NetherWartPlant $block) : Writer{ return Writer::create(Ids::NETHER_WART) - ->writeInt(BlockStateNames::AGE, $block->getAge()); + ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(VanillaBlocks::NETHER_WART_BLOCK(), fn() => new Writer(Ids::NETHER_WART_BLOCK)); - $this->map(VanillaBlocks::NOTE_BLOCK(), fn() => new Writer(Ids::NOTEBLOCK)); - $this->map(VanillaBlocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); - $this->map(VanillaBlocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); - $this->map(VanillaBlocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); - $this->map(VanillaBlocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); - $this->map(VanillaBlocks::OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::STANDING_SIGN))); - $this->map(VanillaBlocks::OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_OAK)); - $this->map(VanillaBlocks::OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::OAK_STAIRS))); - $this->map(VanillaBlocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); - $this->map(VanillaBlocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); - $this->map(VanillaBlocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::OBSIDIAN(), fn() => new Writer(Ids::OBSIDIAN)); - $this->map(VanillaBlocks::ORANGE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::ORANGE_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); - $this->map(VanillaBlocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); - $this->map(VanillaBlocks::PACKED_ICE(), fn() => new Writer(Ids::PACKED_ICE)); - $this->map(VanillaBlocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::PINK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PINK_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); - $this->map(VanillaBlocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); - $this->map(VanillaBlocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); - $this->map(VanillaBlocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); - $this->map(VanillaBlocks::POLISHED_ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_ANDESITE_STAIRS))); - $this->map(VanillaBlocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); - $this->map(VanillaBlocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); - $this->map(VanillaBlocks::POLISHED_DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_DIORITE_STAIRS))); - $this->map(VanillaBlocks::POLISHED_GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE_SMOOTH)); - $this->map(VanillaBlocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); - $this->map(VanillaBlocks::POLISHED_GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_GRANITE_STAIRS))); - $this->map(VanillaBlocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); - $this->map(VanillaBlocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); - $this->map(VanillaBlocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ + $this->map(Blocks::NETHER_WART_BLOCK(), fn() => new Writer(Ids::NETHER_WART_BLOCK)); + $this->map(Blocks::NOTE_BLOCK(), fn() => new Writer(Ids::NOTEBLOCK)); + $this->map(Blocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); + $this->map(Blocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); + $this->map(Blocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); + $this->map(Blocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); + $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); + $this->map(Blocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK)); + $this->map(Blocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); + $this->map(Blocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); + $this->map(Blocks::OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_OAK)); + $this->map(Blocks::OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::STANDING_SIGN))); + $this->map(Blocks::OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_OAK)); + $this->map(Blocks::OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::OAK_STAIRS))); + $this->map(Blocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); + $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); + $this->map(Blocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::OBSIDIAN(), fn() => new Writer(Ids::OBSIDIAN)); + $this->map(Blocks::ORANGE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::ORANGE_GLAZED_TERRACOTTA))); + $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); + $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); + $this->map(Blocks::PACKED_ICE(), fn() => new Writer(Ids::PACKED_ICE)); + $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::PINK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PINK_GLAZED_TERRACOTTA))); + $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); + $this->map(Blocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); + $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); + $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); + $this->map(Blocks::POLISHED_ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_ANDESITE_STAIRS))); + $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); + $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); + $this->map(Blocks::POLISHED_DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_DIORITE_STAIRS))); + $this->map(Blocks::POLISHED_GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE_SMOOTH)); + $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); + $this->map(Blocks::POLISHED_GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_GRANITE_STAIRS))); + $this->map(Blocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); + $this->map(Blocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); + $this->map(Blocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ return Writer::create(Ids::GOLDEN_RAIL) - ->writeBool(BlockStateNames::RAIL_DATA_BIT, $block->isPowered()) - ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(VanillaBlocks::PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT)); - $this->map(VanillaBlocks::PRISMARINE_BRICKS(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(BlockStateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_BRICKS)); - $this->map(VanillaBlocks::PRISMARINE_BRICKS_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK)); - $this->map(VanillaBlocks::PRISMARINE_BRICKS_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_BRICKS_STAIRS))); - $this->map(VanillaBlocks::PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH)); - $this->map(VanillaBlocks::PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_STAIRS))); - $this->map(VanillaBlocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); - $this->map(VanillaBlocks::PUMPKIN(), function() : Writer{ + $this->map(Blocks::PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT)); + $this->map(Blocks::PRISMARINE_BRICKS(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_BRICKS)); + $this->map(Blocks::PRISMARINE_BRICKS_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK)); + $this->map(Blocks::PRISMARINE_BRICKS_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_BRICKS_STAIRS))); + $this->map(Blocks::PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH)); + $this->map(Blocks::PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_STAIRS))); + $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); + $this->map(Blocks::PUMPKIN(), function() : Writer{ return Writer::create(Ids::PUMPKIN) ->writeLegacyHorizontalFacing(Facing::SOUTH); //no longer used }); - $this->map(VanillaBlocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); - $this->map(VanillaBlocks::PURPLE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PURPLE_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); - $this->map(VanillaBlocks::PURPUR(), function() : Writer{ + $this->map(Blocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); + $this->map(Blocks::PURPLE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PURPLE_GLAZED_TERRACOTTA))); + $this->map(Blocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(Blocks::PURPUR(), function() : Writer{ return Writer::create(Ids::PURPUR_BLOCK) - ->writeString(BlockStateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_DEFAULT) + ->writeString(StateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_DEFAULT) ->writePillarAxis(Axis::Y); //useless, but MCPE wants it }); - $this->map(VanillaBlocks::PURPUR_PILLAR(), function(SimplePillar $block) : Writer{ + $this->map(Blocks::PURPUR_PILLAR(), function(SimplePillar $block) : Writer{ return Writer::create(Ids::PURPUR_BLOCK) - ->writeString(BlockStateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_LINES) + ->writeString(StateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_LINES) ->writePillarAxis($block->getAxis()); }); - $this->map(VanillaBlocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); - $this->map(VanillaBlocks::PURPUR_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PURPUR_STAIRS))); - $this->map(VanillaBlocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); - $this->map(VanillaBlocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); - $this->map(VanillaBlocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); - $this->map(VanillaBlocks::QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::QUARTZ_STAIRS))); - $this->map(VanillaBlocks::RAIL(), function(Rail $block) : Writer{ + $this->map(Blocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); + $this->map(Blocks::PURPUR_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PURPUR_STAIRS))); + $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); + $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); + $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); + $this->map(Blocks::QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::QUARTZ_STAIRS))); + $this->map(Blocks::RAIL(), function(Rail $block) : Writer{ return Writer::create(Ids::RAIL) - ->writeInt(BlockStateNames::RAIL_DIRECTION, $block->getShape()); + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(VanillaBlocks::REDSTONE(), fn() => new Writer(Ids::REDSTONE_BLOCK)); - $this->map(VanillaBlocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : BlockStateWriter{ + $this->map(Blocks::REDSTONE(), fn() => new Writer(Ids::REDSTONE_BLOCK)); + $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : BlockStateWriter{ return BlockStateWriter::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) - ->writeBool(BlockStateNames::OUTPUT_LIT_BIT, $block->isPowered()) - ->writeBool(BlockStateNames::OUTPUT_SUBTRACT_BIT, $block->isSubtractMode()) + ->writeBool(StateNames::OUTPUT_LIT_BIT, $block->isPowered()) + ->writeBool(StateNames::OUTPUT_SUBTRACT_BIT, $block->isSubtractMode()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::REDSTONE_LAMP(), fn(RedstoneLamp $block) => new Writer($block->isPowered() ? Ids::LIT_REDSTONE_LAMP : Ids::REDSTONE_LAMP)); - $this->map(VanillaBlocks::REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_REDSTONE_ORE : Ids::REDSTONE_ORE)); - $this->map(VanillaBlocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : BlockStateWriter{ + $this->map(Blocks::REDSTONE_LAMP(), fn(RedstoneLamp $block) => new Writer($block->isPowered() ? Ids::LIT_REDSTONE_LAMP : Ids::REDSTONE_LAMP)); + $this->map(Blocks::REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_REDSTONE_ORE : Ids::REDSTONE_ORE)); + $this->map(Blocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : BlockStateWriter{ return Writer::create($block->isPowered() ? Ids::POWERED_REPEATER : Ids::UNPOWERED_REPEATER) ->writeLegacyHorizontalFacing($block->getFacing()) - ->writeInt(BlockStateNames::REPEATER_DELAY, $block->getDelay() - 1); + ->writeInt(StateNames::REPEATER_DELAY, $block->getDelay() - 1); }); - $this->map(VanillaBlocks::REDSTONE_TORCH(), function(RedstoneTorch $block) : Writer{ + $this->map(Blocks::REDSTONE_TORCH(), function(RedstoneTorch $block) : Writer{ return Writer::create($block->isLit() ? Ids::REDSTONE_TORCH : Ids::UNLIT_REDSTONE_TORCH) ->writeTorchFacing($block->getFacing()); }); - $this->map(VanillaBlocks::REDSTONE_WIRE(), function(RedstoneWire $block) : Writer{ + $this->map(Blocks::REDSTONE_WIRE(), function(RedstoneWire $block) : Writer{ return Writer::create(Ids::REDSTONE_WIRE) - ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(VanillaBlocks::RED_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::RED_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::RED_MUSHROOM(), fn() => new Writer(Ids::RED_MUSHROOM)); - $this->map(VanillaBlocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); - $this->map(VanillaBlocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); - $this->map(VanillaBlocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); - $this->map(VanillaBlocks::RED_NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_NETHER_BRICK_STAIRS))); - $this->map(VanillaBlocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); - $this->map(VanillaBlocks::RED_SAND(), fn() => Writer::create(Ids::SAND) - ->writeString(BlockStateNames::SAND_TYPE, StringValues::SAND_TYPE_RED)); - $this->map(VanillaBlocks::RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); - $this->map(VanillaBlocks::RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE)); - $this->map(VanillaBlocks::RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_SANDSTONE_STAIRS))); - $this->map(VanillaBlocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); - $this->map(VanillaBlocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); - $this->map(VanillaBlocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); - $this->map(VanillaBlocks::RESERVED6(), fn() => new Writer(Ids::RESERVED6)); - $this->map(VanillaBlocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::SAND(), fn() => Writer::create(Ids::SAND) - ->writeString(BlockStateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); - $this->map(VanillaBlocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); - $this->map(VanillaBlocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); - $this->map(VanillaBlocks::SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SANDSTONE_STAIRS))); - $this->map(VanillaBlocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); - $this->map(VanillaBlocks::SEA_LANTERN(), fn() => new Writer(Ids::SEALANTERN)); - $this->map(VanillaBlocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ + $this->map(Blocks::RED_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::RED_GLAZED_TERRACOTTA))); + $this->map(Blocks::RED_MUSHROOM(), fn() => new Writer(Ids::RED_MUSHROOM)); + $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); + $this->map(Blocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); + $this->map(Blocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); + $this->map(Blocks::RED_NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_NETHER_BRICK_STAIRS))); + $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); + $this->map(Blocks::RED_SAND(), fn() => Writer::create(Ids::SAND) + ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_RED)); + $this->map(Blocks::RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); + $this->map(Blocks::RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE)); + $this->map(Blocks::RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_SANDSTONE_STAIRS))); + $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); + $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(Blocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); + $this->map(Blocks::RESERVED6(), fn() => new Writer(Ids::RESERVED6)); + $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) + ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); + $this->map(Blocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); + $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); + $this->map(Blocks::SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SANDSTONE_STAIRS))); + $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); + $this->map(Blocks::SEA_LANTERN(), fn() => new Writer(Ids::SEALANTERN)); + $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ return Writer::create(Ids::SEA_PICKLE) - ->writeBool(BlockStateNames::DEAD_BIT, !$block->isUnderwater()) - ->writeInt(BlockStateNames::CLUSTER_COUNT, $block->getCount() - 1); + ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) + ->writeInt(StateNames::CLUSTER_COUNT, $block->getCount() - 1); }); - $this->map(VanillaBlocks::SHULKER_BOX(), fn() => new Writer(Ids::UNDYED_SHULKER_BOX)); - $this->map(VanillaBlocks::SLIME(), fn() => new Writer(Ids::SLIME)); - $this->map(VanillaBlocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); - $this->map(VanillaBlocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); - $this->map(VanillaBlocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); - $this->map(VanillaBlocks::SMOOTH_QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_QUARTZ_STAIRS))); - $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); - $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE)); - $this->map(VanillaBlocks::SMOOTH_RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_RED_SANDSTONE_STAIRS))); - $this->map(VanillaBlocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); - $this->map(VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); - $this->map(VanillaBlocks::SMOOTH_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_SANDSTONE_STAIRS))); - $this->map(VanillaBlocks::SMOOTH_STONE(), fn() => new Writer(Ids::SMOOTH_STONE)); - $this->map(VanillaBlocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); - $this->map(VanillaBlocks::SNOW(), fn() => new Writer(Ids::SNOW)); - $this->map(VanillaBlocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ + $this->map(Blocks::SHULKER_BOX(), fn() => new Writer(Ids::UNDYED_SHULKER_BOX)); + $this->map(Blocks::SLIME(), fn() => new Writer(Ids::SLIME)); + $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); + $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); + $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); + $this->map(Blocks::SMOOTH_QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_QUARTZ_STAIRS))); + $this->map(Blocks::SMOOTH_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); + $this->map(Blocks::SMOOTH_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE)); + $this->map(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_RED_SANDSTONE_STAIRS))); + $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); + $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); + $this->map(Blocks::SMOOTH_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_SANDSTONE_STAIRS))); + $this->map(Blocks::SMOOTH_STONE(), fn() => new Writer(Ids::SMOOTH_STONE)); + $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); + $this->map(Blocks::SNOW(), fn() => new Writer(Ids::SNOW)); + $this->map(Blocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ return Writer::create(Ids::SNOW_LAYER) - ->writeBool(BlockStateNames::COVERED_BIT, false) - ->writeInt(BlockStateNames::HEIGHT, $block->getLayers() - 1); + ->writeBool(StateNames::COVERED_BIT, false) + ->writeInt(StateNames::HEIGHT, $block->getLayers() - 1); }); - $this->map(VanillaBlocks::SOUL_SAND(), fn() => new Writer(Ids::SOUL_SAND)); - $this->map(VanillaBlocks::SPONGE(), function(Sponge $block) : Writer{ + $this->map(Blocks::SOUL_SAND(), fn() => new Writer(Ids::SOUL_SAND)); + $this->map(Blocks::SPONGE(), function(Sponge $block) : Writer{ return Writer::create(Ids::SPONGE) - ->writeString(BlockStateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); + ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); }); - $this->map(VanillaBlocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); - $this->map(VanillaBlocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); - $this->map(VanillaBlocks::SPRUCE_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); - $this->map(VanillaBlocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(BlockStateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); - $this->map(VanillaBlocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::SPRUCE_STANDING_SIGN))); - $this->map(VanillaBlocks::SPRUCE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_SPRUCE)); - $this->map(VanillaBlocks::SPRUCE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::SPRUCE_STAIRS))); - $this->map(VanillaBlocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); - $this->map(VanillaBlocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); - $this->map(VanillaBlocks::SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STAINED_CLAY(), function(StainedHardenedClay $block) : Writer{ + $this->map(Blocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); + $this->map(Blocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); + $this->map(Blocks::SPRUCE_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); + $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); + $this->map(Blocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::SPRUCE_STANDING_SIGN))); + $this->map(Blocks::SPRUCE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::SPRUCE_STAIRS))); + $this->map(Blocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); + $this->map(Blocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); + $this->map(Blocks::SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STAINED_CLAY(), function(StainedHardenedClay $block) : Writer{ return Writer::create(Ids::STAINED_HARDENED_CLAY) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::STAINED_GLASS(), function(StainedGlass $block) : Writer{ + $this->map(Blocks::STAINED_GLASS(), function(StainedGlass $block) : Writer{ return Writer::create(Ids::STAINED_GLASS) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::STAINED_GLASS_PANE(), function(StainedGlassPane $block) : Writer{ + $this->map(Blocks::STAINED_GLASS_PANE(), function(StainedGlassPane $block) : Writer{ return Writer::create(Ids::STAINED_GLASS_PANE) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::STAINED_HARDENED_GLASS(), function(StainedHardenedGlass $block) : Writer{ + $this->map(Blocks::STAINED_HARDENED_GLASS(), function(StainedHardenedGlass $block) : Writer{ return Writer::create(Ids::HARD_STAINED_GLASS) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::STAINED_HARDENED_GLASS_PANE(), function(StainedHardenedGlassPane $block) : Writer{ + $this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), function(StainedHardenedGlassPane $block) : Writer{ return Writer::create(Ids::HARD_STAINED_GLASS_PANE) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); - $this->map(VanillaBlocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); - $this->map(VanillaBlocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); - $this->map(VanillaBlocks::STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_BRICK_STAIRS))); - $this->map(VanillaBlocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); - $this->map(VanillaBlocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); - $this->map(VanillaBlocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); - $this->map(VanillaBlocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); - $this->map(VanillaBlocks::STONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NORMAL_STONE_STAIRS))); - $this->map(VanillaBlocks::STRIPPED_ACACIA_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_ACACIA_LOG) + $this->map(Blocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); + $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); + $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); + $this->map(Blocks::STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_BRICK_STAIRS))); + $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); + $this->map(Blocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); + $this->map(Blocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); + $this->map(Blocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); + $this->map(Blocks::STONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NORMAL_STONE_STAIRS))); + $this->map(Blocks::STRIPPED_ACACIA_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_ACACIA_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STRIPPED_BIRCH_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_BIRCH_LOG) + $this->map(Blocks::STRIPPED_ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STRIPPED_BIRCH_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_BIRCH_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STRIPPED_DARK_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_DARK_OAK_LOG) + $this->map(Blocks::STRIPPED_BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STRIPPED_DARK_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_DARK_OAK_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STRIPPED_JUNGLE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_JUNGLE_LOG) + $this->map(Blocks::STRIPPED_DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STRIPPED_JUNGLE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_JUNGLE_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STRIPPED_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_OAK_LOG) + $this->map(Blocks::STRIPPED_JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STRIPPED_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_OAK_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::STRIPPED_SPRUCE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_SPRUCE_LOG) + $this->map(Blocks::STRIPPED_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::STRIPPED_SPRUCE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_SPRUCE_LOG) ->writePillarAxis($block->getAxis())); - $this->map(VanillaBlocks::STRIPPED_SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(VanillaBlocks::SUGARCANE(), function(Sugarcane $block) : Writer{ + $this->map(Blocks::STRIPPED_SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::SUGARCANE(), function(Sugarcane $block) : Writer{ return Writer::create(Ids::REEDS) - ->writeInt(BlockStateNames::AGE, $block->getAge()); + ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(VanillaBlocks::SUNFLOWER(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(VanillaBlocks::SWEET_BERRY_BUSH(), function(SweetBerryBush $block) : Writer{ + $this->map(Blocks::SUNFLOWER(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::SWEET_BERRY_BUSH(), function(SweetBerryBush $block) : Writer{ return Writer::create(Ids::SWEET_BERRY_BUSH) - ->writeInt(BlockStateNames::GROWTH, $block->getAge()); + ->writeInt(StateNames::GROWTH, $block->getAge()); }); - $this->map(VanillaBlocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) - ->writeString(BlockStateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); - $this->map(VanillaBlocks::TNT(), function(TNT $block) : Writer{ + $this->map(Blocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) + ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); + $this->map(Blocks::TNT(), function(TNT $block) : Writer{ return Writer::create(Ids::TNT) - ->writeBool(BlockStateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) - ->writeBool(BlockStateNames::EXPLODE_BIT, $block->isUnstable()); + ->writeBool(StateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) + ->writeBool(StateNames::EXPLODE_BIT, $block->isUnstable()); }); - $this->map(VanillaBlocks::TORCH(), function(Torch $block) : Writer{ + $this->map(Blocks::TORCH(), function(Torch $block) : Writer{ return Writer::create(Ids::TORCH) ->writeTorchFacing($block->getFacing()); }); - $this->map(VanillaBlocks::TRAPPED_CHEST(), function(TrappedChest $block) : Writer{ + $this->map(Blocks::TRAPPED_CHEST(), function(TrappedChest $block) : Writer{ return Writer::create(Ids::TRAPPED_CHEST) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::TRIPWIRE(), function(Tripwire $block) : Writer{ + $this->map(Blocks::TRIPWIRE(), function(Tripwire $block) : Writer{ return Writer::create(Ids::TRIPWIRE) - ->writeBool(BlockStateNames::ATTACHED_BIT, $block->isConnected()) - ->writeBool(BlockStateNames::DISARMED_BIT, $block->isDisarmed()) - ->writeBool(BlockStateNames::POWERED_BIT, $block->isTriggered()) - ->writeBool(BlockStateNames::SUSPENDED_BIT, $block->isSuspended()); + ->writeBool(StateNames::ATTACHED_BIT, $block->isConnected()) + ->writeBool(StateNames::DISARMED_BIT, $block->isDisarmed()) + ->writeBool(StateNames::POWERED_BIT, $block->isTriggered()) + ->writeBool(StateNames::SUSPENDED_BIT, $block->isSuspended()); }); - $this->map(VanillaBlocks::TRIPWIRE_HOOK(), function(TripwireHook $block) : Writer{ + $this->map(Blocks::TRIPWIRE_HOOK(), function(TripwireHook $block) : Writer{ return Writer::create(Ids::TRIPWIRE_HOOK) - ->writeBool(BlockStateNames::ATTACHED_BIT, $block->isConnected()) - ->writeBool(BlockStateNames::POWERED_BIT, $block->isPowered()) + ->writeBool(StateNames::ATTACHED_BIT, $block->isConnected()) + ->writeBool(StateNames::POWERED_BIT, $block->isPowered()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ + $this->map(Blocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ return Writer::create(Ids::UNDERWATER_TORCH) ->writeTorchFacing($block->getFacing()); }); - $this->map(VanillaBlocks::VINES(), function(Vine $block) : Writer{ + $this->map(Blocks::VINES(), function(Vine $block) : Writer{ return Writer::create(Ids::VINE) - ->writeInt(BlockStateNames::VINE_DIRECTION_BITS, ($block->hasFace(Facing::NORTH) ? BlockLegacyMetadata::VINE_FLAG_NORTH : 0) | ($block->hasFace(Facing::SOUTH) ? BlockLegacyMetadata::VINE_FLAG_SOUTH : 0) | ($block->hasFace(Facing::WEST) ? BlockLegacyMetadata::VINE_FLAG_WEST : 0) | ($block->hasFace(Facing::EAST) ? BlockLegacyMetadata::VINE_FLAG_EAST : 0)); + ->writeInt(StateNames::VINE_DIRECTION_BITS, ($block->hasFace(Facing::NORTH) ? BlockLegacyMetadata::VINE_FLAG_NORTH : 0) | ($block->hasFace(Facing::SOUTH) ? BlockLegacyMetadata::VINE_FLAG_SOUTH : 0) | ($block->hasFace(Facing::WEST) ? BlockLegacyMetadata::VINE_FLAG_WEST : 0) | ($block->hasFace(Facing::EAST) ? BlockLegacyMetadata::VINE_FLAG_EAST : 0)); }); - $this->map(VanillaBlocks::WALL_BANNER(), function(WallBanner $block) : Writer{ + $this->map(Blocks::WALL_BANNER(), function(WallBanner $block) : Writer{ return Writer::create(Ids::WALL_BANNER) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(VanillaBlocks::WALL_CORAL_FAN(), function(WallCoralFan $block) : Writer{ + $this->map(Blocks::WALL_CORAL_FAN(), function(WallCoralFan $block) : Writer{ $coralType = $block->getCoralType(); return Writer::create(match($coralType->id()){ CoralType::TUBE()->id(), CoralType::BRAIN()->id() => Ids::CORAL_FAN_HANG, @@ -1068,26 +1069,26 @@ final class BlockStateSerializer{ CoralType::HORN()->id() => Ids::CORAL_FAN_HANG3, default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()), }) - ->writeBool(BlockStateNames::CORAL_HANG_TYPE_BIT, $coralType->equals(CoralType::BRAIN()) || $coralType->equals(CoralType::FIRE())) - ->writeBool(BlockStateNames::DEAD_BIT, $block->isDead()) + ->writeBool(StateNames::CORAL_HANG_TYPE_BIT, $coralType->equals(CoralType::BRAIN()) || $coralType->equals(CoralType::FIRE())) + ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralFacing($block->getFacing()); }); - $this->map(VanillaBlocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); - $this->map(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ + $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); + $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) - ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(VanillaBlocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), function(WeightedPressurePlateLight $block) : Writer{ + $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), function(WeightedPressurePlateLight $block) : Writer{ return Writer::create(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE) - ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(VanillaBlocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); - $this->map(VanillaBlocks::WHITE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::WHITE_GLAZED_TERRACOTTA))); - $this->map(VanillaBlocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); - $this->map(VanillaBlocks::WOOL(), function(Wool $block) : Writer{ + $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); + $this->map(Blocks::WHITE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::WHITE_GLAZED_TERRACOTTA))); + $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); + $this->map(Blocks::WOOL(), function(Wool $block) : Writer{ return Writer::create(Ids::WOOL) ->writeColor($block->getColor()); }); - $this->map(VanillaBlocks::YELLOW_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::YELLOW_GLAZED_TERRACOTTA))); + $this->map(Blocks::YELLOW_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::YELLOW_GLAZED_TERRACOTTA))); } } From 8f5813b003bbf7c1b586231cddcdcaacca17f304 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Feb 2022 17:21:32 +0000 Subject: [PATCH 0037/1858] Move PM core-specific serializer/deserializer stuff to data/bedrock/blockstate/convert --- .../{ => convert}/BlockStateDeserializer.php | 8 +++++--- .../{ => convert}/BlockStateDeserializerHelper.php | 5 ++++- .../blockstate/{ => convert}/BlockStateReader.php | 5 ++++- .../{ => convert}/BlockStateSerializer.php | 14 ++++++++------ .../{ => convert}/BlockStateSerializerHelper.php | 5 ++++- .../blockstate/{ => convert}/BlockStateWriter.php | 5 ++++- 6 files changed, 29 insertions(+), 13 deletions(-) rename src/data/bedrock/blockstate/{ => convert}/BlockStateDeserializer.php (99%) rename src/data/bedrock/blockstate/{ => convert}/BlockStateDeserializerHelper.php (98%) rename src/data/bedrock/blockstate/{ => convert}/BlockStateReader.php (97%) rename src/data/bedrock/blockstate/{ => convert}/BlockStateSerializer.php (99%) rename src/data/bedrock/blockstate/{ => convert}/BlockStateSerializerHelper.php (98%) rename src/data/bedrock/blockstate/{ => convert}/BlockStateWriter.php (97%) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php similarity index 99% rename from src/data/bedrock/blockstate/BlockStateDeserializer.php rename to src/data/bedrock/blockstate/convert/BlockStateDeserializer.php index 69972564ff..48371902ad 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; @@ -32,9 +32,11 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\blockstate\convert\BlockStateDeserializerHelper as Helper; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; -use pocketmine\data\bedrock\blockstate\BlockStateReader as Reader; +use pocketmine\data\bedrock\blockstate\convert\BlockStateReader as Reader; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; diff --git a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php similarity index 98% rename from src/data/bedrock/blockstate/BlockStateDeserializerHelper.php rename to src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php index 225df7c2bf..0453bc396b 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\Block; use pocketmine\block\BlockLegacyMetadata; @@ -47,7 +47,10 @@ use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; +use pocketmine\data\bedrock\blockstate\BlockStateNames; +use pocketmine\data\bedrock\blockstate\convert\BlockStateReader; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/data/bedrock/blockstate/BlockStateReader.php b/src/data/bedrock/blockstate/convert/BlockStateReader.php similarity index 97% rename from src/data/bedrock/blockstate/BlockStateReader.php rename to src/data/bedrock/blockstate/convert/BlockStateReader.php index 992a34b821..10b6765656 100644 --- a/src/data/bedrock/blockstate/BlockStateReader.php +++ b/src/data/bedrock/blockstate/convert/BlockStateReader.php @@ -21,13 +21,16 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateNames; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockStateSerializer.php similarity index 99% rename from src/data/bedrock/blockstate/BlockStateSerializer.php rename to src/data/bedrock/blockstate/convert/BlockStateSerializer.php index 2f2037bc95..c1048803f6 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\ActivatorRail; use pocketmine\block\Anvil; @@ -137,10 +137,12 @@ use pocketmine\block\WoodenPressurePlate; use pocketmine\block\WoodenStairs; use pocketmine\block\WoodenTrapdoor; use pocketmine\block\Wool; +use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; -use pocketmine\data\bedrock\blockstate\BlockStateSerializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializerHelper as Helper; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; -use pocketmine\data\bedrock\blockstate\BlockStateWriter as Writer; +use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter as Writer; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -873,15 +875,15 @@ final class BlockStateSerializer{ ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); $this->map(Blocks::REDSTONE(), fn() => new Writer(Ids::REDSTONE_BLOCK)); - $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : BlockStateWriter{ - return BlockStateWriter::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) + $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : Writer{ + return Writer::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) ->writeBool(StateNames::OUTPUT_LIT_BIT, $block->isPowered()) ->writeBool(StateNames::OUTPUT_SUBTRACT_BIT, $block->isSubtractMode()) ->writeLegacyHorizontalFacing($block->getFacing()); }); $this->map(Blocks::REDSTONE_LAMP(), fn(RedstoneLamp $block) => new Writer($block->isPowered() ? Ids::LIT_REDSTONE_LAMP : Ids::REDSTONE_LAMP)); $this->map(Blocks::REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_REDSTONE_ORE : Ids::REDSTONE_ORE)); - $this->map(Blocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : BlockStateWriter{ + $this->map(Blocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : Writer{ return Writer::create($block->isPowered() ? Ids::POWERED_REPEATER : Ids::UNPOWERED_REPEATER) ->writeLegacyHorizontalFacing($block->getFacing()) ->writeInt(StateNames::REPEATER_DELAY, $block->getDelay() - 1); diff --git a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php similarity index 98% rename from src/data/bedrock/blockstate/BlockStateSerializerHelper.php rename to src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php index 81d6bedbb3..27bd2b3f6d 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\Button; use pocketmine\block\ChemistryTable; @@ -47,6 +47,9 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\Wall; use pocketmine\block\WallSign; use pocketmine\block\Wood; +use pocketmine\data\bedrock\blockstate\BlockStateNames; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues; +use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; diff --git a/src/data/bedrock/blockstate/BlockStateWriter.php b/src/data/bedrock/blockstate/convert/BlockStateWriter.php similarity index 97% rename from src/data/bedrock/blockstate/BlockStateWriter.php rename to src/data/bedrock/blockstate/convert/BlockStateWriter.php index a3db88c334..c949194135 100644 --- a/src/data/bedrock/blockstate/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/convert/BlockStateWriter.php @@ -21,14 +21,17 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\blockstate\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\TreeType; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateNames; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\CompoundTag; From d55eed803df01a6c9e881ead3449357f8de9dec4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 5 Feb 2022 21:12:11 +0000 Subject: [PATCH 0038/1858] make build green --- .../bedrock/blockstate/convert/BlockStateDeserializer.php | 4 ++-- .../blockstate/convert/BlockStateDeserializerHelper.php | 5 ++--- src/data/bedrock/blockstate/convert/BlockStateReader.php | 2 +- src/data/bedrock/blockstate/convert/BlockStateSerializer.php | 4 ++-- .../blockstate/convert/BlockStateSerializerHelper.php | 1 - src/data/bedrock/blockstate/convert/BlockStateWriter.php | 2 +- src/network/mcpe/convert/RuntimeBlockMapping.php | 2 +- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php index 48371902ad..3fb4c476b1 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php @@ -34,11 +34,11 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\convert\BlockStateDeserializerHelper as Helper; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; -use pocketmine\data\bedrock\blockstate\convert\BlockStateReader as Reader; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; +use pocketmine\data\bedrock\blockstate\convert\BlockStateDeserializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\convert\BlockStateReader as Reader; use pocketmine\math\Axis; use pocketmine\math\Facing; use function array_key_exists; diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php index 0453bc396b..52760d47cb 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php @@ -47,10 +47,9 @@ use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; -use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\convert\BlockStateReader; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\blockstate\BlockStateNames; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/data/bedrock/blockstate/convert/BlockStateReader.php b/src/data/bedrock/blockstate/convert/BlockStateReader.php index 10b6765656..5ced88381d 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateReader.php +++ b/src/data/bedrock/blockstate/convert/BlockStateReader.php @@ -28,9 +28,9 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; use pocketmine\data\bedrock\blockstate\BlockStateNames; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockStateSerializer.php index c1048803f6..31c2b232a1 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializer.php @@ -140,10 +140,10 @@ use pocketmine\block\Wool; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; -use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializerHelper as Helper; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; -use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter as Writer; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; +use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializerHelper as Helper; +use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter as Writer; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php index 27bd2b3f6d..91e4cba86b 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php @@ -49,7 +49,6 @@ use pocketmine\block\WallSign; use pocketmine\block\Wood; use pocketmine\data\bedrock\blockstate\BlockStateNames; use pocketmine\data\bedrock\blockstate\BlockStateStringValues; -use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; diff --git a/src/data/bedrock/blockstate/convert/BlockStateWriter.php b/src/data/bedrock/blockstate/convert/BlockStateWriter.php index c949194135..d05c5f6c45 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/convert/BlockStateWriter.php @@ -30,8 +30,8 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\utils\TreeType; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\CompoundTag; diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 41a2cd5b73..49a74e480f 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -27,8 +27,8 @@ use pocketmine\block\BlockFactory; use pocketmine\block\UnknownBlock; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; -use pocketmine\data\bedrock\blockstate\BlockStateSerializer; use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializer; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; From 1b48603d07433065c3852db47755a016d051e98b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 02:41:50 +0000 Subject: [PATCH 0039/1858] another vague commit restructuring stuff --- .../blockstate/BlockStateDeserializer.php | 40 +++++++++++++++ .../blockstate/BlockStateSerializer.php | 40 +++++++++++++++ .../CachingBlockStateDeserializer.php | 49 +++++++++++++++++++ .../CachingBlockStateSerializer.php | 43 ++++++++++++++++ .../UpgradingBlockStateDeserializer.php | 40 +++++++++++++++ ... => BlockObjectToBlockStateSerializer.php} | 11 ++++- ...> BlockStateToBlockObjectDeserializer.php} | 15 ++++-- ...DataMap.php => LegacyBlockStateMapper.php} | 28 ++++++++--- 8 files changed, 254 insertions(+), 12 deletions(-) create mode 100644 src/data/bedrock/blockstate/BlockStateDeserializer.php create mode 100644 src/data/bedrock/blockstate/BlockStateSerializer.php create mode 100644 src/data/bedrock/blockstate/CachingBlockStateDeserializer.php create mode 100644 src/data/bedrock/blockstate/CachingBlockStateSerializer.php create mode 100644 src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php rename src/data/bedrock/blockstate/convert/{BlockStateSerializer.php => BlockObjectToBlockStateSerializer.php} (99%) rename src/data/bedrock/blockstate/convert/{BlockStateDeserializer.php => BlockStateToBlockObjectDeserializer.php} (99%) rename src/data/bedrock/blockstate/upgrade/{LegacyIdMetaToBlockStateDataMap.php => LegacyBlockStateMapper.php} (65%) diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php new file mode 100644 index 0000000000..180480bb16 --- /dev/null +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -0,0 +1,40 @@ + + */ + private array $simpleCache = []; + + public function __construct( + private BlockStateDeserializer $realDeserializer + ){} + + public function deserialize(BlockStateData $stateData) : int{ + if($stateData->getStates()->count() === 0){ + //if a block has zero properties, we can keep a map of string ID -> internal blockstate ID + return $this->simpleCache[$stateData->getName()] ??= $this->realDeserializer->deserialize($stateData); + } + + //we can't cache blocks that have properties - go ahead and deserialize the slow way + return $this->realDeserializer->deserialize($stateData); + } + + public function getRealDeserializer() : BlockStateDeserializer{ return $this->realDeserializer; } +} diff --git a/src/data/bedrock/blockstate/CachingBlockStateSerializer.php b/src/data/bedrock/blockstate/CachingBlockStateSerializer.php new file mode 100644 index 0000000000..eb4cc13de8 --- /dev/null +++ b/src/data/bedrock/blockstate/CachingBlockStateSerializer.php @@ -0,0 +1,43 @@ + + */ + private array $cache = []; + + public function __construct( + private BlockStateSerializer $realSerializer + ){} + + public function serialize(int $stateId) : BlockStateData{ + return $this->cache[$stateId] ??= $this->realSerializer->serialize($stateId); + } + + public function getRealSerializer() : BlockStateSerializer{ return $this->realSerializer; } +} diff --git a/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php b/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php new file mode 100644 index 0000000000..cd1c114df1 --- /dev/null +++ b/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php @@ -0,0 +1,40 @@ +realDeserializer->deserialize($this->blockStateUpgrader->upgrade($stateData)); + } + + public function getRealDeserializer() : BlockStateDeserializer{ return $this->realDeserializer; } +} diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php similarity index 99% rename from src/data/bedrock/blockstate/convert/BlockStateSerializer.php rename to src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index 31c2b232a1..cfd0e3e0fd 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -32,6 +32,7 @@ use pocketmine\block\Bed; use pocketmine\block\Beetroot; use pocketmine\block\Bell; use pocketmine\block\Block; +use pocketmine\block\BlockFactory; use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\BoneBlock; use pocketmine\block\BrewingStand; @@ -140,6 +141,7 @@ use pocketmine\block\Wool; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\blockstate\BlockStateSerializer; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializerHelper as Helper; @@ -150,7 +152,7 @@ use pocketmine\utils\AssumptionFailedError; use function class_parents; use function get_class; -final class BlockStateSerializer{ +final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ /** * These callables actually accept Block, but for the sake of type completeness, it has to be never, since we can't * describe the bottom type of a type hierarchy only containing Block. @@ -164,6 +166,11 @@ final class BlockStateSerializer{ $this->registerSerializers(); } + public function serialize(int $stateId) : BlockStateData{ + //TODO: singleton usage not ideal + return $this->serializeBlock(BlockFactory::getInstance()->fromFullBlock($stateId)); + } + /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $block @@ -181,7 +188,7 @@ final class BlockStateSerializer{ * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $blockState */ - public function serialize(Block $blockState) : BlockStateData{ + public function serializeBlock(Block $blockState) : BlockStateData{ $typeId = $blockState->getTypeId(); $locatedSerializer = $this->serializers[$typeId][get_class($blockState)] ?? null; diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php similarity index 99% rename from src/data/bedrock/blockstate/convert/BlockStateDeserializer.php rename to src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 3fb4c476b1..77323213b5 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -34,6 +34,7 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializer; use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; @@ -44,7 +45,7 @@ use pocketmine\math\Facing; use function array_key_exists; use function min; -final class BlockStateDeserializer{ +final class BlockStateToBlockObjectDeserializer implements BlockStateDeserializer{ /** * @var \Closure[] @@ -52,6 +53,14 @@ final class BlockStateDeserializer{ */ private array $deserializeFuncs = []; + public function __construct(){ + $this->registerDeserializers(); + } + + public function deserialize(BlockStateData $stateData) : int{ + return $this->deserializeBlock($stateData)->getFullId(); + } + /** @phpstan-param \Closure(Reader) : Block $c */ private function map(string $id, \Closure $c) : void{ if(array_key_exists($id, $this->deserializeFuncs)){ @@ -60,7 +69,7 @@ final class BlockStateDeserializer{ $this->deserializeFuncs[$id] = $c; } - public function __construct(){ + private function registerDeserializers() : void{ $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in)); @@ -2502,7 +2511,7 @@ final class BlockStateDeserializer{ } /** @throws BlockStateDeserializeException */ - public function deserialize(BlockStateData $blockStateData) : Block{ + public function deserializeBlock(BlockStateData $blockStateData) : Block{ $id = $blockStateData->getName(); if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); diff --git a/src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php similarity index 65% rename from src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php rename to src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php index 3ecf18a17f..1a8e7186a1 100644 --- a/src/data/bedrock/blockstate/upgrade/LegacyIdMetaToBlockStateDataMap.php +++ b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php @@ -24,27 +24,41 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate\upgrade; use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; +use pocketmine\utils\SingletonTrait; +use Webmozart\PathUtil\Path; +use function file_get_contents; +use const pocketmine\BEDROCK_DATA_PATH; /** - * Interface to an upgrade schema describing how to convert 1.12 id+meta into modern blockstate NBT. + * Handles translating legacy 1.12 block ID/meta into modern blockstates. */ -final class LegacyIdMetaToBlockStateDataMap{ - +final class LegacyBlockStateMapper{ /** * @param BlockStateData[][] $mappingTable * @phpstan-param array> $mappingTable */ public function __construct( - private array $mappingTable + private array $mappingTable, + private LegacyBlockIdToStringIdMap $legacyNumericIdMap ){} - public function getDataFromLegacyIdMeta(string $id, int $meta) : ?BlockStateData{ + public function fromStringIdMeta(string $id, int $meta) : ?BlockStateData{ return $this->mappingTable[$id][$meta] ?? null; } - public static function loadFromString(string $data) : self{ + public function fromIntIdMeta(int $id, int $meta) : ?BlockStateData{ + $stringId = $this->legacyNumericIdMap->legacyToString($id); + if($stringId === null){ + return null; + } + return $this->fromStringIdMeta($stringId, $meta); + } + + public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap) : self{ $mappingTable = []; $legacyStateMapReader = new BinaryStream($data); @@ -59,6 +73,6 @@ final class LegacyIdMetaToBlockStateDataMap{ $mappingTable[$id][$meta] = BlockStateData::fromNbt($state); } - return new self($mappingTable); + return new self($mappingTable, $idMap); } } From 9e0313686140ae5cd4f71184720e21689dbd0d6e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 02:43:57 +0000 Subject: [PATCH 0040/1858] fix CS --- .../bedrock/blockstate/upgrade/LegacyBlockStateMapper.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php index 1a8e7186a1..c2b2517d5f 100644 --- a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php @@ -25,13 +25,8 @@ namespace pocketmine\data\bedrock\blockstate\upgrade; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; -use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; -use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; -use function file_get_contents; -use const pocketmine\BEDROCK_DATA_PATH; /** * Handles translating legacy 1.12 block ID/meta into modern blockstates. From f870568e62e04d16ed24e1a27348104892042a32 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 02:46:50 +0000 Subject: [PATCH 0041/1858] fix RuntimeBlockMapping --- .../mcpe/convert/RuntimeBlockMapping.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 49a74e480f..195d248a0d 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -28,6 +28,8 @@ use pocketmine\block\UnknownBlock; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\data\bedrock\blockstate\CachingBlockStateSerializer; +use pocketmine\data\bedrock\blockstate\convert\BlockObjectToBlockStateSerializer; use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializer; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; @@ -56,7 +58,7 @@ final class RuntimeBlockMapping{ private function __construct(){ $contents = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"); $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); - $this->blockStateSerializer = new BlockStateSerializer(); + $this->blockStateSerializer = new CachingBlockStateSerializer(new BlockObjectToBlockStateSerializer()); $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } @@ -66,16 +68,12 @@ final class RuntimeBlockMapping{ return $this->networkIdCache[$internalStateId]; } - //TODO: singleton usage not ideal - $block = BlockFactory::getInstance()->fromFullBlock($internalStateId); - if($block instanceof UnknownBlock){ - $blockStateData = $this->fallbackStateData; - }else{ - try{ - $blockStateData = $this->blockStateSerializer->serialize($block); - }catch(BlockStateSerializeException $e){ - throw new AssumptionFailedError("Invalid serializer for block $block", 0, $e); - } + try{ + $blockStateData = $this->blockStateSerializer->serialize($internalStateId); + }catch(BlockStateSerializeException){ + //TODO: this will swallow any error caused by invalid block properties; this is not ideal, but it should be + //covered by unit tests, so this is probably a safe assumption. + $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); From 863f9560b0e84f59f3520513c03992536a55adf4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 02:49:19 +0000 Subject: [PATCH 0042/1858] RuntimeBlockMapping: make fallbackStateData not useless --- src/network/mcpe/convert/RuntimeBlockMapping.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 195d248a0d..23c1e8587d 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -73,7 +73,7 @@ final class RuntimeBlockMapping{ }catch(BlockStateSerializeException){ //TODO: this will swallow any error caused by invalid block properties; this is not ideal, but it should be //covered by unit tests, so this is probably a safe assumption. - $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + $blockStateData = $this->fallbackStateData; } $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); From dd3b79b142cbec34237fd0e554914c670c95053c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 02:50:43 +0000 Subject: [PATCH 0043/1858] phpstorm sucks --- src/network/mcpe/convert/RuntimeBlockMapping.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 23c1e8587d..10f8f30b37 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -23,14 +23,12 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\block\BlockFactory; -use pocketmine\block\UnknownBlock; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\blockstate\BlockStateSerializer; use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\data\bedrock\blockstate\CachingBlockStateSerializer; use pocketmine\data\bedrock\blockstate\convert\BlockObjectToBlockStateSerializer; -use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializer; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; From e58b3ba46cc9d03ae0bfb55c621e351f06017d08 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 03:04:29 +0000 Subject: [PATCH 0044/1858] First look at loading 1.13+ worlds --- composer.json | 2 +- composer.lock | 38 ++-- .../upgrade/BlockStateUpgradeSchemaUtils.php | 13 +- .../blockstate/upgrade/BlockStateUpgrader.php | 10 + .../mcpe/convert/RuntimeBlockMapping.php | 5 +- src/world/format/io/BaseWorldProvider.php | 42 ++++ .../format/io/GlobalBlockStateHandlers.php | 79 ++++++++ src/world/format/io/leveldb/LevelDB.php | 189 ++++++++++++++---- src/world/format/io/region/Anvil.php | 3 +- src/world/format/io/region/McRegion.php | 3 +- src/world/format/io/region/PMAnvil.php | 3 +- .../upgrade/BlockStateUpgraderTest.php | 2 +- 12 files changed, 321 insertions(+), 68 deletions(-) create mode 100644 src/world/format/io/GlobalBlockStateHandlers.php diff --git a/composer.json b/composer.json index d36d57b936..bafe720e6d 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-data": "~1.5.0+bedrock-1.18.0", + "pocketmine/bedrock-data": "dev-experimental/upgrade-tables", "pocketmine/bedrock-protocol": "~7.3.0+bedrock-1.18.0", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index eed8893758..42f1857a5f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9aa2f11ba68d00423732973554fafb20", + "content-hash": "6723715c08c1582240f1c219df330f96", "packages": [ { "name": "adhocore/json-comment", @@ -249,16 +249,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "1.5.0+bedrock-1.18.0", + "version": "dev-experimental/upgrade-tables", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "482c679aa5ed0b81c088c2b1ff0b8110a94c8a6c" + "reference": "747359be18b433659556c5adb527e47b0b150fdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/482c679aa5ed0b81c088c2b1ff0b8110a94c8a6c", - "reference": "482c679aa5ed0b81c088c2b1ff0b8110a94c8a6c", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/747359be18b433659556c5adb527e47b0b150fdd", + "reference": "747359be18b433659556c5adb527e47b0b150fdd", "shasum": "" }, "type": "library", @@ -269,9 +269,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.18.0" + "source": "https://github.com/pmmp/BedrockData/tree/experimental/upgrade-tables" }, - "time": "2021-11-30T18:30:46+00:00" + "time": "2022-02-05T16:34:56+00:00" }, { "name": "pocketmine/bedrock-protocol", @@ -1136,12 +1136,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -1219,12 +1219,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -1474,12 +1474,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3507,7 +3507,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "pocketmine/bedrock-data": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index ce8b7534ef..425fe05451 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -180,13 +180,13 @@ final class BlockStateUpgradeSchemaUtils{ * * @return BlockStateUpgradeSchema[] */ - public static function loadSchemas(string $path) : array{ + public static function loadSchemas(string $path, int $currentVersion) : array{ $iterator = new \RegexIterator( new \FilesystemIterator( $path, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS ), - '/\/mapping_schema_(\d{4}).*\.json$/', + '/\/(\d{4}).*\.json$/', \RegexIterator::GET_MATCH ); @@ -209,7 +209,14 @@ final class BlockStateUpgradeSchemaUtils{ } $model = $jsonMapper->map($json, new BlockStateUpgradeSchemaModel()); - $result[$priority] = self::fromJsonModel($model); + $schema = self::fromJsonModel($model); + if($schema->getVersionId() > $currentVersion){ + //this might be a beta schema which shouldn't be applicable + //TODO: why do we load the whole schema just to throw it away if it's too new? ... + continue; + } + + $result[$priority] = $schema; } ksort($result, SORT_NUMERIC); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index 537700aa9e..b24489fcfc 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -34,6 +34,16 @@ final class BlockStateUpgrader{ /** @var BlockStateUpgradeSchema[][] */ private array $upgradeSchemas = []; + /** + * @param BlockStateUpgradeSchema[] $upgradeSchemas + * @phpstan-param array $upgradeSchemas + */ + public function __construct(array $upgradeSchemas){ + foreach($upgradeSchemas as $priority => $schema){ + $this->addSchema($schema, $priority); + } + } + public function addSchema(BlockStateUpgradeSchema $schema, int $priority) : void{ if(isset($this->upgradeSchemas[$schema->getVersionId()][$priority])){ throw new \InvalidArgumentException("Another schema already has this priority"); diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 10f8f30b37..efbfdeb756 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -27,12 +27,11 @@ use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\data\bedrock\blockstate\BlockStateSerializer; use pocketmine\data\bedrock\blockstate\BlockTypeNames; -use pocketmine\data\bedrock\blockstate\CachingBlockStateSerializer; -use pocketmine\data\bedrock\blockstate\convert\BlockObjectToBlockStateSerializer; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; +use pocketmine\world\format\io\GlobalBlockStateHandlers; use Webmozart\PathUtil\Path; use function file_get_contents; @@ -56,7 +55,7 @@ final class RuntimeBlockMapping{ private function __construct(){ $contents = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"); $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); - $this->blockStateSerializer = new CachingBlockStateSerializer(new BlockObjectToBlockStateSerializer()); + $this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index 6404f641b8..269b599edb 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -23,8 +23,12 @@ declare(strict_types=1); namespace pocketmine\world\format\io; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; +use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\WorldException; use function file_exists; @@ -49,6 +53,44 @@ abstract class BaseWorldProvider implements WorldProvider{ */ abstract protected function loadLevelData() : WorldData; + private function translatePalette(PalettedBlockArray $blockArray) : PalettedBlockArray{ + $palette = $blockArray->getPalette(); + + //TODO: this should be dependency-injected so it can be replaced, but that would break BC + //also, we want it to be lazy-loaded ... + $legacyBlockStateMapper = GlobalBlockStateHandlers::getLegacyBlockStateMapper(); + $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); + $newPalette = []; + foreach($palette as $k => $legacyIdMeta){ + $newStateData = $legacyBlockStateMapper->fromIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); + if($newStateData === null){ + //TODO: remember data for unknown states so we can implement them later + $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + } + + $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); + } + + //TODO: this is sub-optimal since it reallocates the offset table multiple times + return PalettedBlockArray::fromData( + $blockArray->getBitsPerBlock(), + $blockArray->getWordArray(), + $newPalette + ); + } + + protected function palettizeLegacySubChunkXZY(string $idArray, string $metaArray) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkXZY($idArray, $metaArray)); + } + + protected function palettizeLegacySubChunkYZX(string $idArray, string $metaArray) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkYZX($idArray, $metaArray)); + } + + protected function palettizeLegacySubChunkFromColumn(string $idArray, string $metaArray, int $yOffset) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkFromLegacyColumn($idArray, $metaArray, $yOffset)); + } + public function getPath() : string{ return $this->path; } diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php new file mode 100644 index 0000000000..c041e08fce --- /dev/null +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -0,0 +1,79 @@ + file_get_contents(Path::join(BEDROCK_DATA_PATH, 'r12_to_current_block_map.bin'))), + LegacyBlockIdToStringIdMap::getInstance() + ); + } +} diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 671acb6d99..26329a0449 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -26,7 +26,9 @@ namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\data\bedrock\BiomeIds; -use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; @@ -44,7 +46,7 @@ use pocketmine\world\format\io\data\BedrockWorldData; use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; -use pocketmine\world\format\io\SubChunkConverter; +use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\format\io\WorldData; use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\format\PalettedBlockArray; @@ -70,32 +72,46 @@ use const LEVELDB_ZLIB_RAW_COMPRESSION; class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ - //According to Tomasso, these aren't supposed to be readable anymore. Thankfully he didn't change the readable ones... + /** @deprecated */ protected const TAG_DATA_2D = ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES; + /** @deprecated */ protected const TAG_DATA_2D_LEGACY = ChunkDataKey::HEIGHTMAP_AND_2D_BIOME_COLORS; + /** @deprecated */ protected const TAG_SUBCHUNK_PREFIX = ChunkDataKey::SUBCHUNK; + /** @deprecated */ protected const TAG_LEGACY_TERRAIN = ChunkDataKey::LEGACY_TERRAIN; + /** @deprecated */ protected const TAG_BLOCK_ENTITY = ChunkDataKey::BLOCK_ENTITIES; + /** @deprecated */ protected const TAG_ENTITY = ChunkDataKey::ENTITIES; + /** @deprecated */ protected const TAG_PENDING_TICK = ChunkDataKey::PENDING_SCHEDULED_TICKS; + /** @deprecated */ protected const TAG_BLOCK_EXTRA_DATA = ChunkDataKey::LEGACY_BLOCK_EXTRA_DATA; + /** @deprecated */ protected const TAG_BIOME_STATE = ChunkDataKey::BIOME_STATES; + /** @deprecated */ protected const TAG_STATE_FINALISATION = ChunkDataKey::FINALIZATION; + /** @deprecated */ protected const TAG_BORDER_BLOCKS = ChunkDataKey::BORDER_BLOCKS; + /** @deprecated */ protected const TAG_HARDCODED_SPAWNERS = ChunkDataKey::HARDCODED_SPAWNERS; protected const FINALISATION_NEEDS_INSTATICKING = 0; protected const FINALISATION_NEEDS_POPULATION = 1; protected const FINALISATION_DONE = 2; - protected const TAG_VERSION = ChunkDataKey::OLD_VERSION; + /** @deprecated */ + protected const TAG_VERSION = ChunkDataKey::NEW_VERSION; protected const ENTRY_FLAT_WORLD_LAYERS = "game_flatworldlayers"; - protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_2_0; //yes, I know this is wrong, but it ensures vanilla auto-fixes stuff we currently don't + protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_18_0_25_beta; protected const CURRENT_LEVEL_SUBCHUNK_VERSION = SubChunkVersion::PALETTED_MULTI; + private const CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET = 4; + /** @var \LevelDB */ protected $db; @@ -171,18 +187,41 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } $nbt = new LittleEndianNbtSerializer(); $palette = []; - $idMap = LegacyBlockIdToStringIdMap::getInstance(); - for($i = 0, $paletteSize = $stream->getLInt(); $i < $paletteSize; ++$i){ + + $paletteSize = $bitsPerBlock === 0 ? 1 : $stream->getLInt(); + + $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); + for($i = 0; $i < $paletteSize; ++$i){ try{ $offset = $stream->getOffset(); $tag = $nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); $stream->setOffset($offset); - $id = $idMap->stringToLegacy($tag->getString("name")) ?? BlockLegacyIds::INFO_UPDATE; - $data = $tag->getShort("val"); - $palette[] = ($id << Block::INTERNAL_METADATA_BITS) | $data; - }catch(NbtException $e){ + if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ + //Legacy (pre-1.13) blockstate - upgrade it to a version we understand + $id = $tag->getString("name"); + $data = $tag->getShort("val"); + + $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromStringIdMeta($id, $data); + if($blockStateData === null){ + //TODO: this might be a slightly-invalid state that isn't in the mapping table + $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + } + }else{ + //Modern (post-1.13) blockstate + $blockStateData = BlockStateData::fromNbt($tag); + } + + try{ + $palette[] = $blockStateDeserializer->deserialize($blockStateData); + }catch(BlockStateDeserializeException){ + //TODO: remember data for unknown states so we can implement them later + //TODO: this is slow; we need to cache this + //TODO: log this + $palette[] = $blockStateDeserializer->deserialize(new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION)); + } + }catch(NbtException | BlockStateDeserializeException $e){ throw new CorruptedChunkException("Invalid blockstate NBT at offset $i in paletted storage: " . $e->getMessage(), 0, $e); } } @@ -215,6 +254,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $extraDataLayers = []; $binaryStream = new BinaryStream($extraRawData); $count = $binaryStream->getLInt(); + + $legacyMapper = GlobalBlockStateHandlers::getLegacyBlockStateMapper(); + $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); for($i = 0; $i < $count; ++$i){ $key = $binaryStream->getLInt(); $value = $binaryStream->getLShort(); @@ -226,23 +268,49 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockId = $value & 0xff; $blockData = ($value >> 8) & 0xf; + $blockStateData = $legacyMapper->fromIntIdMeta($blockId, $blockData); + if($blockStateData === null){ + //TODO: we could preserve this in case it's supported in the future, but this was historically only + //used for grass anyway, so we probably don't need to care + continue; + } + $blockStateId = $blockStateDeserializer->deserialize($blockStateData); + if(!isset($extraDataLayers[$ySub])){ $extraDataLayers[$ySub] = new PalettedBlockArray(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS); } - $extraDataLayers[$ySub]->set($x, $y, $z, ($blockId << Block::INTERNAL_METADATA_BITS) | $blockData); + $extraDataLayers[$ySub]->set($x, $y, $z, $blockStateId); } return $extraDataLayers; } + private function readVersion(int $chunkX, int $chunkZ) : ?int{ + $index = self::chunkIndex($chunkX, $chunkZ); + $chunkVersionRaw = $this->db->get($index . ChunkDataKey::NEW_VERSION); + if($chunkVersionRaw === false){ + $chunkVersionRaw = $this->db->get($index . ChunkDataKey::OLD_VERSION); + if($chunkVersionRaw === false){ + return null; + } + } + + return ord($chunkVersionRaw); + } + + private static function hasOffsetCavesAndCliffsSubChunks(int $chunkVersion) : bool{ + return $chunkVersion >= ChunkVersion::v1_16_220_50_unused && $chunkVersion <= ChunkVersion::v1_16_230_50_unused; + } + /** * @throws CorruptedChunkException */ public function loadChunk(int $chunkX, int $chunkZ) : ?ChunkData{ $index = LevelDB::chunkIndex($chunkX, $chunkZ); - $chunkVersionRaw = $this->db->get($index . ChunkDataKey::OLD_VERSION); - if($chunkVersionRaw === false){ + $chunkVersion = $this->readVersion($chunkX, $chunkZ); + if($chunkVersion === null){ + //TODO: this might be a slightly-corrupted chunk with a missing version field return null; } @@ -252,10 +320,36 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** @var BiomeArray|null $biomeArray */ $biomeArray = null; - $chunkVersion = ord($chunkVersionRaw); $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; + $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; + switch($chunkVersion){ + case ChunkVersion::v1_18_0_25_beta: + case ChunkVersion::v1_18_0_24_unused: + case ChunkVersion::v1_18_0_24_beta: + case ChunkVersion::v1_18_0_22_unused: + case ChunkVersion::v1_18_0_22_beta: + case ChunkVersion::v1_18_0_20_unused: + case ChunkVersion::v1_18_0_20_beta: + case ChunkVersion::v1_17_40_unused: + case ChunkVersion::v1_17_40_20_beta_experimental_caves_cliffs: + case ChunkVersion::v1_17_30_25_unused: + case ChunkVersion::v1_17_30_25_beta_experimental_caves_cliffs: + case ChunkVersion::v1_17_30_23_unused: + case ChunkVersion::v1_17_30_23_beta_experimental_caves_cliffs: + case ChunkVersion::v1_16_230_50_unused: + case ChunkVersion::v1_16_230_50_beta_experimental_caves_cliffs: + case ChunkVersion::v1_16_220_50_unused: + case ChunkVersion::v1_16_220_50_beta_experimental_caves_cliffs: + case ChunkVersion::v1_16_210: + case ChunkVersion::v1_16_100_57_beta: + case ChunkVersion::v1_16_100_52_beta: + case ChunkVersion::v1_16_0: + case ChunkVersion::v1_16_0_51_beta: + //TODO: check walls + case ChunkVersion::v1_12_0_unused2: + case ChunkVersion::v1_12_0_unused1: case ChunkVersion::v1_12_0_4_beta: case ChunkVersion::v1_11_1: case ChunkVersion::v1_11_0_4_beta: @@ -266,13 +360,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ case ChunkVersion::v1_2_13: case ChunkVersion::v1_2_0: case ChunkVersion::v1_2_0_2_beta: + case ChunkVersion::v1_1_0_converted_from_console: case ChunkVersion::v1_1_0: //TODO: check beds case ChunkVersion::v1_0_0: $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ - if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y))) === false){ + if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y + $subChunkKeyOffset))) === false){ continue; } @@ -305,7 +400,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ throw new CorruptedChunkException($e->getMessage(), 0, $e); } - $storages = [SubChunkConverter::convertSubChunkXZY($blocks, $blockData)]; + $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData)]; if(isset($convertedLegacyExtraData[$y])){ $storages[] = $convertedLegacyExtraData[$y]; } @@ -320,8 +415,13 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, $storages); break; case SubChunkVersion::PALETTED_MULTI: + case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: //legacy extradata layers intentionally ignored because they aren't supposed to exist in v8 $storageCount = $binaryStream->getByte(); + if($subChunkVersion >= SubChunkVersion::PALETTED_MULTI_WITH_OFFSET){ + //height ignored; this seems pointless since this is already in the key anyway + $binaryStream->getByte(); + } if($storageCount > 0){ $storages = []; @@ -367,7 +467,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } for($yy = 0; $yy < 8; ++$yy){ - $storages = [SubChunkConverter::convertSubChunkFromLegacyColumn($fullIds, $fullData, $yy)]; + $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy)]; if(isset($convertedLegacyExtraData[$yy])){ $storages[] = $convertedLegacyExtraData[$yy]; } @@ -434,15 +534,40 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void{ - $idMap = LegacyBlockIdToStringIdMap::getInstance(); $index = LevelDB::chunkIndex($chunkX, $chunkZ); $write = new \LevelDBWriteBatch(); - $write->put($index . ChunkDataKey::OLD_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); + + $previousVersion = $this->readVersion($chunkX, $chunkZ); + $write->put($index . ChunkDataKey::NEW_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); $chunk = $chunkData->getChunk(); + + //TODO: This ensures that negative subchunks don't get destroyed in newer worlds for as long as we don't yet + //support negative height. Since we don't save with a shift, if the old save had the subchunks shifted, we need + //to shift them to their correct positions to avoid destroying data. + //This can be removed once we support the full height. + if($previousVersion !== null && self::hasOffsetCavesAndCliffsSubChunks($previousVersion)){ + $subChunks = $chunk->getSubChunks(); + + for($y = -4; $y <= 20; $y++){ + $key = $index . ChunkDataKey::SUBCHUNK . chr($y + self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET); + if( + (!isset($subChunks[$y]) || !$chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)) && + ($subChunkData = $this->db->get($key)) !== false + ){ + $write->delete($key); + $write->put($index . ChunkDataKey::SUBCHUNK . chr($y & 0xff), $subChunkData); + } + } + } + if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)){ $subChunks = $chunk->getSubChunks(); + + //TODO: this should not rely on globals, but in PM4 we have no other option, and it's not worse than what we + //were doing before anyway ... + $blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); foreach($subChunks as $y => $subChunk){ $key = $index . ChunkDataKey::SUBCHUNK . chr($y); if($subChunk->isEmptyAuthoritative()){ @@ -454,24 +579,16 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $layers = $subChunk->getBlockLayers(); $subStream->putByte(count($layers)); foreach($layers as $blocks){ - if($blocks->getBitsPerBlock() !== 0){ - $subStream->putByte($blocks->getBitsPerBlock() << 1); - $subStream->put($blocks->getWordArray()); - }else{ - //TODO: we use these in-memory, but they aren't supported on disk by the game yet - //polyfill them with a zero'd 1-bpb instead - $subStream->putByte(1 << 1); - $subStream->put(str_repeat("\x00", PalettedBlockArray::getExpectedWordArraySize(1))); - } + $subStream->putByte($blocks->getBitsPerBlock() << 1); + $subStream->put($blocks->getWordArray()); $palette = $blocks->getPalette(); - $subStream->putLInt(count($palette)); + if($blocks->getBitsPerBlock() !== 0){ + $subStream->putLInt(count($palette)); + } $tags = []; foreach($palette as $p){ - $tags[] = new TreeRoot(CompoundTag::create() - ->setString("name", $idMap->legacyToString($p >> Block::INTERNAL_METADATA_BITS) ?? "minecraft:info_update") - ->setInt("oldid", $p >> Block::INTERNAL_METADATA_BITS) //PM only (debugging), vanilla doesn't have this - ->setShort("val", $p & Block::INTERNAL_METADATA_MASK)); + $tags[] = new TreeRoot($blockStateSerializer->serialize($p)->toNbt()); } $subStream->put((new LittleEndianNbtSerializer())->writeMultiple($tags)); @@ -528,7 +645,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ public function getAllChunks(bool $skipCorrupted = false, ?\Logger $logger = null) : \Generator{ foreach($this->db->getIterator() as $key => $_){ - if(strlen($key) === 9 && substr($key, -1) === ChunkDataKey::OLD_VERSION){ + if(strlen($key) === 9 && ($key[8] === ChunkDataKey::NEW_VERSION || $key[8] === ChunkDataKey::OLD_VERSION)){ $chunkX = Binary::readLInt(substr($key, 0, 4)); $chunkZ = Binary::readLInt(substr($key, 4, 4)); try{ @@ -550,7 +667,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ public function calculateChunkCount() : int{ $count = 0; foreach($this->db->getIterator() as $key => $_){ - if(strlen($key) === 9 && substr($key, -1) === ChunkDataKey::OLD_VERSION){ + if(strlen($key) === 9 && ($key[8] === ChunkDataKey::NEW_VERSION || $key[8] === ChunkDataKey::OLD_VERSION)){ $count++; } } diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index 12e907d205..df5caedaff 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -26,14 +26,13 @@ namespace pocketmine\world\format\io\region; use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\SubChunk; class Anvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [SubChunkConverter::convertSubChunkYZX( + return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_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 bf15973643..7df146b1cb 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -38,7 +38,6 @@ use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; -use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\SubChunk; use function zlib_decode; @@ -75,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, [SubChunkConverter::convertSubChunkFromLegacyColumn($fullIds, $fullData, $y)]); + $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_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 299d597c94..45c59bee7a 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -26,7 +26,6 @@ namespace pocketmine\world\format\io\region; use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\SubChunk; /** @@ -37,7 +36,7 @@ class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [SubChunkConverter::convertSubChunkXZY( + return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [$this->palettizeLegacySubChunkXZY( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) )]); diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php index caf917ec4b..cd5e44216f 100644 --- a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php @@ -44,7 +44,7 @@ class BlockStateUpgraderTest extends TestCase{ private BlockStateUpgrader $upgrader; public function setUp() : void{ - $this->upgrader = new BlockStateUpgrader(); + $this->upgrader = new BlockStateUpgrader([]); } private function getNewSchema() : BlockStateUpgradeSchema{ From fe2c3d08a0819d768cb15833c13c9a2bad9d2a66 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 17:31:41 +0000 Subject: [PATCH 0045/1858] Reduce memory footprint of state remapping tables this becomes a significant problem when expanding metadata size. --- src/block/BlockFactory.php | 46 ++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 14d37d72d5..91eaff0fa1 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -77,10 +77,16 @@ class BlockFactory{ private $fullList; /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray + * @var int[] + * @phpstan-var array */ - private \SplFixedArray $mappedStateIds; + private array $defaultStateIndexes = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $mappedStateIndexes = []; /** * @var \SplFixedArray|int[] @@ -105,7 +111,6 @@ class BlockFactory{ public function __construct(){ $this->fullList = new \SplFixedArray(1024 << Block::INTERNAL_METADATA_BITS); - $this->mappedStateIds = new \SplFixedArray(1024 << Block::INTERNAL_METADATA_BITS); $this->light = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 0)); $this->lightFilter = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 1)); @@ -944,11 +949,7 @@ class BlockFactory{ } foreach($ids as $id){ - for($meta = 0; $meta < 1 << Block::INTERNAL_METADATA_BITS; ++$meta){ - if(!$this->isRegistered($id, $meta)){ - $this->remap($id, $meta, $default); - } - } + $this->defaultStateIndexes[$id] = $default->getFullId(); } } @@ -1027,8 +1028,12 @@ class BlockFactory{ } private function fillStaticArrays(int $index, Block $block) : void{ - $this->fullList[$index] = $block; - $this->mappedStateIds[$index] = $block->getFullId(); + $fullId = $block->getFullId(); + if($index !== $fullId){ + $this->mappedStateIndexes[$index] = $fullId; + }else{ + $this->fullList[$index] = $block; + } $this->light[$index] = $block->getLightLevel(); $this->lightFilter[$index] = min(15, $block->getLightFilter() + 1); //opacity plus 1 standard light filter $this->blocksDirectSkyLight[$index] = $block->blocksDirectSkyLight(); @@ -1051,8 +1056,10 @@ class BlockFactory{ if($index < 0 || $index >= $this->fullList->getSize()){ throw new \InvalidArgumentException("Block ID $id is out of bounds"); } - if($this->fullList[$index] !== null){ + if($this->fullList[$index] !== null){ //hot $block = clone $this->fullList[$index]; + }elseif(($mappedIndex = $this->getMappedStateId($index)) !== $index && $this->fullList[$mappedIndex] !== null){ //cold + $block = clone $this->fullList[$mappedIndex]; }else{ $block = new UnknownBlock(new BID($id, $meta), BlockBreakInfo::instant()); } @@ -1068,7 +1075,15 @@ class BlockFactory{ * Returns whether a specified block state is already registered in the block factory. */ public function isRegistered(int $id, int $meta = 0) : bool{ - $b = $this->fullList[($id << Block::INTERNAL_METADATA_BITS) | $meta]; + $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; + $b = $this->fullList[$index]; + if($b === null){ + $mappedIndex = $this->mappedStateIndexes[$index] ?? $this->defaultStateIndexes[$id] ?? null; + if($mappedIndex === null){ + return false; + } + $b = $this->fullList[$mappedIndex]; + } return $b !== null && !($b instanceof UnknownBlock); } @@ -1084,6 +1099,9 @@ class BlockFactory{ * Used to correct invalid blockstates found in loaded chunks. */ public function getMappedStateId(int $fullState) : int{ - return $this->mappedStateIds[$fullState] ?? $fullState; + if($this->fullList[$fullState] !== null){ + return $fullState; + } + return $this->mappedStateIndexes[$fullState] ?? $this->defaultStateIndexes[$fullState >> Block::INTERNAL_METADATA_BITS] ?? $fullState; } } From c2d3b23449f0717df7faabed63a59a8d3439f712 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Feb 2022 18:04:02 +0000 Subject: [PATCH 0046/1858] fixed BlockFactory consistency test - remapped states are no longer returned by getAllKnownStates() --- tests/phpunit/block/BlockTest.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 8e101bc0f5..033f191b52 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -151,8 +151,13 @@ class BlockTest extends TestCase{ $knownStates = $list["knownStates"]; $remaps = $list["remaps"]; - $states = $this->blockFactory->getAllKnownStates(); - foreach($states as $k => $state){ + $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"); From 166ffe430ace99d1f2aae40fe1887cf7648e9f7e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Feb 2022 22:56:04 +0000 Subject: [PATCH 0047/1858] Updated for 1.18.10 --- src/data/bedrock/blockstate/BlockStateNames.php | 1 - src/data/bedrock/blockstate/BlockTypeNames.php | 4 ++++ .../blockstate/convert/BlockObjectToBlockStateSerializer.php | 1 - .../convert/BlockStateToBlockObjectDeserializer.php | 3 +-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateNames.php b/src/data/bedrock/blockstate/BlockStateNames.php index 08279ded16..93d827005c 100644 --- a/src/data/bedrock/blockstate/BlockStateNames.php +++ b/src/data/bedrock/blockstate/BlockStateNames.php @@ -94,7 +94,6 @@ final class BlockStateNames{ public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; public const NEW_LEAF_TYPE = "new_leaf_type"; public const NEW_LOG_TYPE = "new_log_type"; - public const NO_DROP_BIT = "no_drop_bit"; public const OCCUPIED_BIT = "occupied_bit"; public const OLD_LEAF_TYPE = "old_leaf_type"; public const OLD_LOG_TYPE = "old_log_type"; diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/blockstate/BlockTypeNames.php index 54536c0da4..01c1161983 100644 --- a/src/data/bedrock/blockstate/BlockTypeNames.php +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -374,6 +374,7 @@ final class BlockTypeNames{ public const FLOWING_LAVA = "minecraft:flowing_lava"; public const FLOWING_WATER = "minecraft:flowing_water"; public const FRAME = "minecraft:frame"; + public const FROG_EGG = "minecraft:frog_egg"; public const FROSTED_ICE = "minecraft:frosted_ice"; public const FURNACE = "minecraft:furnace"; public const GILDED_BLACKSTONE = "minecraft:gilded_blackstone"; @@ -495,6 +496,7 @@ final class BlockTypeNames{ public const OAK_STAIRS = "minecraft:oak_stairs"; public const OBSERVER = "minecraft:observer"; public const OBSIDIAN = "minecraft:obsidian"; + public const OCHRE_FROGLIGHT = "minecraft:ochre_froglight"; public const ORANGE_CANDLE = "minecraft:orange_candle"; public const ORANGE_CANDLE_CAKE = "minecraft:orange_candle_cake"; public const ORANGE_GLAZED_TERRACOTTA = "minecraft:orange_glazed_terracotta"; @@ -504,6 +506,7 @@ final class BlockTypeNames{ public const OXIDIZED_CUT_COPPER_STAIRS = "minecraft:oxidized_cut_copper_stairs"; public const OXIDIZED_DOUBLE_CUT_COPPER_SLAB = "minecraft:oxidized_double_cut_copper_slab"; public const PACKED_ICE = "minecraft:packed_ice"; + public const PEARLESCENT_FROGLIGHT = "minecraft:pearlescent_froglight"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; @@ -670,6 +673,7 @@ final class BlockTypeNames{ public const UNLIT_REDSTONE_TORCH = "minecraft:unlit_redstone_torch"; public const UNPOWERED_COMPARATOR = "minecraft:unpowered_comparator"; public const UNPOWERED_REPEATER = "minecraft:unpowered_repeater"; + public const VERDANT_FROGLIGHT = "minecraft:verdant_froglight"; public const VINE = "minecraft:vine"; public const WALL_BANNER = "minecraft:wall_banner"; public const WALL_SIGN = "minecraft:wall_sign"; diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index cfd0e3e0fd..5e29f1c834 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -766,7 +766,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); $this->map(Blocks::MOB_HEAD(), function(Skull $block) : Writer{ return Writer::create(Ids::SKULL) - ->writeBool(StateNames::NO_DROP_BIT, $block->isNoDrops()) ->writeFacingWithoutDown($block->getFacing()); }); $this->map(Blocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 77323213b5..3da7d1508f 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -851,8 +851,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::SKULL, function(Reader $in) : Block{ return Blocks::MOB_HEAD() - ->setFacing($in->readFacingWithoutDown()) - ->setNoDrops($in->readBool(StateNames::NO_DROP_BIT)); + ->setFacing($in->readFacingWithoutDown()); }); $this->map(Ids::SLIME, fn() => Blocks::SLIME()); $this->map(Ids::SMOKER, function(Reader $in) : Block{ From 0226f5466c3e4d7621dd9632bb6e678aed044147 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 20:05:20 +0000 Subject: [PATCH 0048/1858] Added support for upgrading states via remap (needed for end rods and all-sided-logs) --- .../upgrade/BlockStateUpgradeSchema.php | 6 +++++ .../upgrade/BlockStateUpgradeSchemaUtils.php | 22 +++++++++++++++++++ .../blockstate/upgrade/BlockStateUpgrader.php | 11 ++++++++-- .../model/BlockStateUpgradeSchemaModel.php | 6 +++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index b47c9f1feb..024b0d4b3b 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -57,6 +57,12 @@ final class BlockStateUpgradeSchema{ */ public array $remappedPropertyValues = []; + /** + * @var BlockStateUpgradeSchemaBlockRemap[][] + * @phpstan-var array> + */ + public array $remappedStates = []; + public function __construct( public int $maxVersionMajor, public int $maxVersionMinor, diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 425fe05451..d3f9304e1d 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate\upgrade; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModel; +use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelTag; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; use pocketmine\errorhandler\ErrorToExceptionHandler; @@ -33,6 +34,7 @@ use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; +use function array_map; use function file_get_contents; use function get_class; use function implode; @@ -142,6 +144,16 @@ final class BlockStateUpgradeSchemaUtils{ } } + foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ + foreach($remaps as $remap){ + $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaBlockRemap( + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState), + $remap->newName, + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState), + ); + } + } + return $result; } @@ -172,6 +184,16 @@ final class BlockStateUpgradeSchemaUtils{ } } + foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ + foreach($remaps as $remap){ + $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), + $remap->newName, + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), + ); + } + } + return $result; } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index b24489fcfc..9f3ec33cbd 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -54,8 +54,6 @@ final class BlockStateUpgrader{ } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ - $oldName = $blockStateData->getName(); - $version = $blockStateData->getVersion(); foreach($this->upgradeSchemas as $resultVersion => $schemas){ if($version > $resultVersion){ @@ -64,6 +62,15 @@ final class BlockStateUpgrader{ continue; } foreach($schemas as $schema){ + $oldName = $blockStateData->getName(); + if(isset($schema->remappedStates[$oldName])){ + foreach($schema->remappedStates[$oldName] as $remap){ + if($blockStateData->getStates()->equals($remap->oldState)){ + $blockStateData = new BlockStateData($remap->newName, clone $remap->newState, $resultVersion); + continue 2; + } + } + } $newName = $schema->renamedIds[$oldName] ?? null; $stateChanges = 0; diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php index 4827082c98..54357bd8d9 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -69,6 +69,12 @@ final class BlockStateUpgradeSchemaModel implements \JsonSerializable{ */ public array $remappedPropertyValues; + /** + * @var BlockStateUpgradeSchemaModelBlockRemap[][] + * @phpstan-var array> + */ + public array $remappedStates; + /** * @return mixed[] */ From 0ce3f763db3de38dec778ee42ff347e3efcbd2c7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 20:13:59 +0000 Subject: [PATCH 0049/1858] reEEEEEEEEEEEEEEEEE --- .../BlockStateUpgradeSchemaBlockRemap.php | 55 ++++++++++++++++++ ...BlockStateUpgradeSchemaModelBlockRemap.php | 56 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php create mode 100644 src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php new file mode 100644 index 0000000000..b307137712 --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -0,0 +1,55 @@ + $oldState + * @phpstan-param array $newState + */ + public function __construct( + array $oldState, + public string $newName, + array $newState + ){ + $this->oldState = CompoundTag::create(); + $this->newState = CompoundTag::create(); + foreach(Utils::stringifyKeys($oldState) as $k => $v){ + $this->oldState->setTag($k, $v); + } + foreach(Utils::stringifyKeys($newState) as $k => $v){ + $this->newState->setTag($k, $v); + } + } +} diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php new file mode 100644 index 0000000000..5404c0bdcd --- /dev/null +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -0,0 +1,56 @@ + + * @required + */ + public array $oldState; + + /** @required */ + public string $newName; + + /** + * @var BlockStateUpgradeSchemaModelTag[] + * @phpstan-var array + * @required + */ + public array $newState; + + /** + * @param BlockStateUpgradeSchemaModelTag[] $oldState + * @param BlockStateUpgradeSchemaModelTag[] $newState + * @phpstan-param array $oldState + * @phpstan-param array $newState + */ + public function __construct(array $oldState, string $newName, array $newState){ + $this->oldState = $oldState; + $this->newName = $newName; + $this->newState = $newState; + } +} From 77ba8b81f8dbfe238e9da460a1ffbc5814101cb2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 20:16:54 +0000 Subject: [PATCH 0050/1858] Updated BedrockData --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index d62b16e078..8fa2fa59bc 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "42298c194b0ae5282f6745256e379c01334f82e6" + "reference": "607e4766c95f448b607c05a7e5170b43f9420ab0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/42298c194b0ae5282f6745256e379c01334f82e6", - "reference": "42298c194b0ae5282f6745256e379c01334f82e6", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/607e4766c95f448b607c05a7e5170b43f9420ab0", + "reference": "607e4766c95f448b607c05a7e5170b43f9420ab0", "shasum": "" }, "type": "library", @@ -271,7 +271,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/experimental/upgrade-tables" }, - "time": "2022-02-08T22:24:32+00:00" + "time": "2022-02-09T19:48:12+00:00" }, { "name": "pocketmine/bedrock-protocol", From 03cf635adca89714f3da2f4faa2c3d401cbf777c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 20:17:28 +0000 Subject: [PATCH 0051/1858] Removed pointless array cast --- .../bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index d3f9304e1d..2f7c1c3f17 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -176,7 +176,7 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $properties){ foreach(Utils::stringifyKeys($properties) as $property => $propertyValues){ foreach($propertyValues as $oldNew){ - $result->remappedPropertyValues[$blockName][$property][] = (array) new BlockStateUpgradeSchemaModelValueRemap( + $result->remappedPropertyValues[$blockName][$property][] = new BlockStateUpgradeSchemaModelValueRemap( self::tagToJsonModel($oldNew->old), self::tagToJsonModel($oldNew->new) ); From dc5ddf1c1b855d75c9ed5b22f97eeabdd7d7afb0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 20:18:38 +0000 Subject: [PATCH 0052/1858] make the build pass --- .../blockstate/upgrade/BlockStateUpgradeSchemaUtils.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 2f7c1c3f17..8ea14acadb 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -187,9 +187,9 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ foreach($remaps as $remap){ $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( - array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState->getValue()), $remap->newName, - array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState->getValue()), ); } } From 1b3e50d0a3977449252351932392e4dc8b8c21cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Feb 2022 23:58:56 +0000 Subject: [PATCH 0053/1858] Implement support for remappedPropertyValuesIndex schema format --- composer.lock | 8 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 90 +++++++++++++++---- .../model/BlockStateUpgradeSchemaModel.php | 10 ++- 3 files changed, 87 insertions(+), 21 deletions(-) diff --git a/composer.lock b/composer.lock index 8fa2fa59bc..8df7f6614d 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "607e4766c95f448b607c05a7e5170b43f9420ab0" + "reference": "1d96dd836a77996719ed09dced6e4bba99b0fc1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/607e4766c95f448b607c05a7e5170b43f9420ab0", - "reference": "607e4766c95f448b607c05a7e5170b43f9420ab0", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/1d96dd836a77996719ed09dced6e4bba99b0fc1e", + "reference": "1d96dd836a77996719ed09dced6e4bba99b0fc1e", "shasum": "" }, "type": "library", @@ -271,7 +271,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/experimental/upgrade-tables" }, - "time": "2022-02-09T19:48:12+00:00" + "time": "2022-02-09T21:52:48+00:00" }, { "name": "pocketmine/bedrock-protocol", diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 8ea14acadb..72e262313b 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -35,6 +35,7 @@ use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; use function array_map; +use function count; use function file_get_contents; use function get_class; use function implode; @@ -43,6 +44,8 @@ use function is_object; use function is_string; use function json_decode; use function ksort; +use function str_pad; +use function strval; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; @@ -133,14 +136,22 @@ final class BlockStateUpgradeSchemaUtils{ } } + $convertedRemappedValuesIndex = []; + foreach(Utils::stringifyKeys($model->remappedPropertyValuesIndex ?? []) as $mappingKey => $mappingValues){ + foreach($mappingValues as $k => $oldNew){ + $convertedRemappedValuesIndex[$mappingKey][$k] = new BlockStateUpgradeSchemaValueRemap( + self::jsonModelToTag($oldNew->old), + self::jsonModelToTag($oldNew->new) + ); + } + } + foreach(Utils::stringifyKeys($model->remappedPropertyValues ?? []) as $blockName => $properties){ foreach(Utils::stringifyKeys($properties) as $property => $mappedValuesKey){ - foreach($mappedValuesKey as $oldNew){ - $result->remappedPropertyValues[$blockName][$property][] = new BlockStateUpgradeSchemaValueRemap( - self::jsonModelToTag($oldNew->old), - self::jsonModelToTag($oldNew->new) - ); + if(!isset($convertedRemappedValuesIndex[$mappedValuesKey])){ + throw new \UnexpectedValueException("Missing key from schema values index $mappedValuesKey"); } + $result->remappedPropertyValues[$blockName][$property] = $convertedRemappedValuesIndex[$mappedValuesKey]; } } @@ -157,6 +168,64 @@ final class BlockStateUpgradeSchemaUtils{ return $result; } + private static function buildRemappedValuesIndex(BlockStateUpgradeSchema $schema, BlockStateUpgradeSchemaModel $model) : void{ + if(count($schema->remappedPropertyValues) === 0){ + return; + } + $dedupMapping = []; + $dedupTable = []; + $dedupTableMap = []; + $counter = 0; + + foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $remaps){ + foreach(Utils::stringifyKeys($remaps) as $propertyName => $remappedValues){ + $remappedValuesMap = []; + foreach($remappedValues as $oldNew){ + $remappedValuesMap[$oldNew->old->toString()] = $oldNew; + } + + foreach(Utils::stringifyKeys($dedupTableMap) as $dedupName => $dedupValuesMap){ + if(count($remappedValuesMap) !== count($dedupValuesMap)){ + continue; + } + + foreach(Utils::stringifyKeys($remappedValuesMap) as $oldHash => $remappedOldNew){ + if( + !isset($dedupValuesMap[$oldHash]) || + !$remappedOldNew->old->equals($dedupValuesMap[$oldHash]->old) || + !$remappedOldNew->new->equals($dedupValuesMap[$oldHash]->new) + ){ + continue 2; + } + } + + //we found a match + $dedupMapping[$blockName][$propertyName] = $dedupName; + continue 2; + } + + //no match, add the values to the table + $newDedupName = $propertyName . "_" . str_pad(strval($counter++), 2, "0", STR_PAD_LEFT); + $dedupTableMap[$newDedupName] = $remappedValuesMap; + $dedupTable[$newDedupName] = $remappedValues; + $dedupMapping[$blockName][$propertyName] = $newDedupName; + } + } + + $modelTable = []; + foreach(Utils::stringifyKeys($dedupTable) as $dedupName => $valuePairs){ + foreach($valuePairs as $k => $pair){ + $modelTable[$dedupName][$k] = new BlockStateUpgradeSchemaModelValueRemap( + BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->old), + BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->new), + ); + } + } + + $model->remappedPropertyValuesIndex = $modelTable; + $model->remappedPropertyValues = $dedupMapping; + } + public static function toJsonModel(BlockStateUpgradeSchema $schema) : BlockStateUpgradeSchemaModel{ $result = new BlockStateUpgradeSchemaModel(); $result->maxVersionMajor = $schema->maxVersionMajor; @@ -173,16 +242,7 @@ final class BlockStateUpgradeSchemaUtils{ } } - foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $properties){ - foreach(Utils::stringifyKeys($properties) as $property => $propertyValues){ - foreach($propertyValues as $oldNew){ - $result->remappedPropertyValues[$blockName][$property][] = new BlockStateUpgradeSchemaModelValueRemap( - self::tagToJsonModel($oldNew->old), - self::tagToJsonModel($oldNew->new) - ); - } - } - } + self::buildRemappedValuesIndex($schema, $result); foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ foreach($remaps as $remap){ diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php index 54357bd8d9..824ca7a7a4 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -64,11 +64,17 @@ final class BlockStateUpgradeSchemaModel implements \JsonSerializable{ public array $renamedProperties; /** - * @var BlockStateUpgradeSchemaModelValueRemap[][][] - * @phpstan-var array>> + * @var string[][] + * @phpstan-var array> */ public array $remappedPropertyValues; + /** + * @var BlockStateUpgradeSchemaModelValueRemap[][] + * @phpstan-var array> + */ + public array $remappedPropertyValuesIndex; + /** * @var BlockStateUpgradeSchemaModelBlockRemap[][] * @phpstan-var array> From 0a0383d9bda6e81998f4f0ba7610bd08418935e4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 13:03:29 +0000 Subject: [PATCH 0054/1858] BlockStateUpgradeSchema: added isEmpty() --- .../upgrade/BlockStateUpgradeSchema.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index 024b0d4b3b..fa845acfb9 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -73,4 +73,21 @@ final class BlockStateUpgradeSchema{ public function getVersionId() : int{ return ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; } + + public function isEmpty() : bool{ + foreach([ + $this->renamedIds, + $this->addedProperties, + $this->removedProperties, + $this->renamedProperties, + $this->remappedPropertyValues, + $this->remappedStates, + ] as $list){ + if(count($list) !== 0){ + return false; + } + } + + return true; + } } From 0f07b2499c21c8f03ee0f56a343c380420124349 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 13:45:39 +0000 Subject: [PATCH 0055/1858] Added blockstate upgrade schema generator --- tools/generate-blockstate-upgrade-schema.php | 271 +++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 tools/generate-blockstate-upgrade-schema.php diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php new file mode 100644 index 0000000000..d4713586d2 --- /dev/null +++ b/tools/generate-blockstate-upgrade-schema.php @@ -0,0 +1,271 @@ +> + */ +function loadUpgradeTable(string $file, bool $reverse) : array{ + try{ + $contents = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($file)); + }catch(\ErrorException $e){ + throw new \RuntimeException("Failed loading mapping table file $file: " . $e->getMessage(), 0, $e); + } + $data = (new NetworkNbtSerializer())->readMultiple($contents); + + $result = []; + + for($i = 0; isset($data[$i]); $i += 2){ + $oldTag = $data[$i]->mustGetCompoundTag(); + $newTag = $data[$i + 1]->mustGetCompoundTag(); + $old = BlockStateData::fromNbt($reverse ? $newTag : $oldTag); + $new = BlockStateData::fromNbt($reverse ? $oldTag : $newTag); + + $result[$old->getName()][] = new BlockStateMapping( + $old, + $new + ); + } + + return $result; +} + +/** + * @param true[] $removedPropertiesCache + * @param Tag[][] $remappedPropertyValuesCache + * @phpstan-param array $removedPropertiesCache + * @phpstan-param array> $remappedPropertyValuesCache + */ +function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgradeSchema $result, array &$removedPropertiesCache, array &$remappedPropertyValuesCache) : void{ + + //new and old IDs are the same; compare states + $oldName = $old->getName(); + + $oldStates = $old->getStates(); + $newStates = $new->getStates(); + + $propertyRemoved = []; + $propertyAdded = []; + foreach($oldStates as $propertyName => $oldProperty){ + $newProperty = $newStates->getTag($propertyName); + if($newProperty === null){ + $propertyRemoved[$propertyName] = $oldProperty; + }elseif(!$newProperty->equals($oldProperty)){ + if(!isset($remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()])){ + $result->remappedPropertyValues[$oldName][$propertyName][] = new BlockStateUpgradeSchemaValueRemap( + $oldProperty, + $newProperty + ); + $remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()] = $newProperty; + } + } + } + + foreach($newStates as $propertyName => $value){ + if($oldStates->getTag($propertyName) === null){ + $propertyAdded[$propertyName] = $value; + } + } + + if(count($propertyAdded) === 0 && count($propertyRemoved) === 0){ + return; + } + if(count($propertyAdded) === 1 && count($propertyRemoved) === 1){ + $propertyOldName = array_key_first($propertyRemoved); + $propertyNewName = array_key_first($propertyAdded); + + $propertyOldValue = $propertyRemoved[$propertyOldName]; + $propertyNewValue = $propertyAdded[$propertyNewName]; + + $existingPropertyValueMap = $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] ?? null; + if($propertyOldName !== $propertyNewName){ + if(!$propertyOldValue->equals($propertyNewValue) && $existingPropertyValueMap === null){ + \GlobalLogger::get()->warning("warning: guessing that $oldName has $propertyOldName renamed to $propertyNewName with a value map of $propertyOldValue mapped to $propertyNewValue");; + } + //this is a guess; it might not be reliable if the value changed as well + //this will probably never be an issue, but it might rear its ugly head in the future + $result->renamedProperties[$oldName][$propertyOldName] = $propertyNewName; + } + if(!$propertyOldValue->equals($propertyNewValue)){ + $mapped = true; + if($existingPropertyValueMap !== null && !$existingPropertyValueMap->equals($propertyNewValue)){ + if($existingPropertyValueMap->equals($propertyOldValue)){ + \GlobalLogger::get()->warning("warning: guessing that the value $propertyOldValue of $propertyNewValue did not change");; + $mapped = false; + }else{ + \GlobalLogger::get()->warning("warning: mismatch of new value for $propertyNewName for $oldName: $propertyOldValue seen mapped to $propertyNewValue and $existingPropertyValueMap");; + } + } + if($mapped && !isset($remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()])){ + //value remap + $result->remappedPropertyValues[$oldName][$propertyOldName][] = new BlockStateUpgradeSchemaValueRemap( + $propertyRemoved[$propertyOldName], + $propertyAdded[$propertyNewName] + ); + $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; + } + }elseif($existingPropertyValueMap !== null){ + \GlobalLogger::get()->warning("warning: multiple values found for value $propertyOldValue of $propertyNewName on block $oldName, guessing it did not change");; + $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; + } + }else{ + if(count($propertyAdded) !== 0 && count($propertyRemoved) === 0){ + foreach(Utils::stringifyKeys($propertyAdded) as $propertyAddedName => $propertyAddedValue){ + $existingDefault = $result->addedProperties[$oldName][$propertyAddedName] ?? null; + if($existingDefault !== null && !$existingDefault->equals($propertyAddedValue)){ + throw new \UnexpectedValueException("Ambiguous default value for added property $propertyAddedName on block $oldName"); + } + + $result->addedProperties[$oldName][$propertyAddedName] = $propertyAddedValue; + } + }elseif(count($propertyRemoved) !== 0 && count($propertyAdded) === 0){ + foreach(Utils::stringifyKeys($propertyRemoved) as $propertyRemovedName => $propertyRemovedValue){ + if(!isset($removedPropertiesCache[$propertyRemovedName])){ + //to avoid having useless keys in the output + $result->removedProperties[$oldName][] = $propertyRemovedName; + $removedPropertiesCache[$propertyRemovedName] = $propertyRemovedName; + } + } + }else{ + $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( + $oldStates->getValue(), + $new->getName(), + $newStates->getValue() + ); + \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; + } + } +} + +/** + * @param BlockStateMapping[][] $upgradeTable + * @phpstan-param array> $upgradeTable + */ +function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgradeSchema{ + $foundVersion = -1; + foreach(Utils::stringifyKeys($upgradeTable) as $blockStateMappings){ + foreach($blockStateMappings as $mapping){ + if($foundVersion === -1 || $mapping->new->getVersion() === $foundVersion){ + $foundVersion = $mapping->new->getVersion(); + }else{ + throw new AssumptionFailedError("Mixed versions found"); + } + } + } + + $result = new BlockStateUpgradeSchema( + ($foundVersion >> 24) & 0xff, + ($foundVersion >> 16) & 0xff, + ($foundVersion >> 8) & 0xff, + ($foundVersion & 0xff) + ); + foreach(Utils::stringifyKeys($upgradeTable) as $oldName => $blockStateMappings){ + $newNameFound = []; + + $removedPropertiesCache = []; + $remappedPropertyValuesCache = []; + foreach($blockStateMappings as $mapping){ + $newName = $mapping->new->getName(); + $newNameFound[$newName] = true; + } + if(count($newNameFound) === 1){ + $newName = array_key_first($newNameFound); + if($newName !== $oldName){ + $result->renamedIds[$oldName] = array_key_first($newNameFound); + } + foreach($blockStateMappings as $mapping){ + processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + } + }else{ + //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap + foreach($blockStateMappings as $mapping){ + if($mapping->old->getName() !== $mapping->new->getName() || !$mapping->old->getStates()->equals($mapping->new->getStates())){ + $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $mapping->old->getStates()->getValue(), + $mapping->new->getName(), + $mapping->new->getStates()->getValue() + ); + } + } + } + } + + return $result; +} + +/** + * @param string[] $argv + */ +function main(array $argv) : int{ + if(count($argv) !== 3){ + fwrite(STDERR, "Required arguments: input file path, output file path\n"); + return 1; + } + + $input = $argv[1]; + $output = $argv[2]; + + $table = loadUpgradeTable($input, false); + + ksort($table, SORT_STRING); + + $diff = generateBlockStateUpgradeSchema($table); + if($diff->isEmpty()){ + \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); + return 0; + } + file_put_contents( + $output, + json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" + ); + \GlobalLogger::get()->info("Schema file $output generated successfully."); + + return 0; +} + +exit(main($argv)); From 45150f1a524e99cdadffd88f2b7d5249934288b1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 13:47:20 +0000 Subject: [PATCH 0056/1858] fix CS --- tools/generate-blockstate-upgrade-schema.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index d4713586d2..54e773e222 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -33,8 +33,14 @@ use pocketmine\nbt\tag\Tag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; +use function array_key_first; +use function count; use function dirname; +use function file_get_contents; +use function file_put_contents; use function fwrite; +use function json_encode; +use function ksort; use const STDERR; require_once dirname(__DIR__) . '/vendor/autoload.php'; From db9d769db64e9950d044e4810ea009fb22e8b62e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 13:49:40 +0000 Subject: [PATCH 0057/1858] fix CS #2 --- src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php | 1 + .../bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index fa845acfb9..5621288128 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\blockstate\upgrade; use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaValueRemap as ValueRemap; use pocketmine\nbt\tag\Tag; +use function count; final class BlockStateUpgradeSchema{ /** diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 72e262313b..5db1ba07f8 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -48,6 +48,7 @@ use function str_pad; use function strval; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; +use const STR_PAD_LEFT; final class BlockStateUpgradeSchemaUtils{ From 8a11ed70e3b614c2139655aaf4f77e8961d45982 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 19:38:50 +0000 Subject: [PATCH 0058/1858] improve reusability --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 5db1ba07f8..dfe3b922ab 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -38,6 +38,7 @@ use function array_map; use function count; use function file_get_contents; use function get_class; +use function gettype; use function implode; use function is_int; use function is_object; @@ -275,7 +276,6 @@ final class BlockStateUpgradeSchemaUtils{ $result = []; - $jsonMapper = new \JsonMapper(); /** @var string[] $matches */ foreach($iterator as $matches){ $filename = $matches[0]; @@ -283,16 +283,18 @@ final class BlockStateUpgradeSchemaUtils{ $fullPath = Path::join($path, $filename); - //TODO: should we bother handling exceptions in here? - $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); - - $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); - if(!is_object($json)){ - throw new \RuntimeException("Unexpected root type of schema file $fullPath"); + try{ + $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); + }catch(\ErrorException $e){ + throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); + } + + try{ + $schema = self::loadSchemaFromString($raw); + }catch(\RuntimeException $e){ + throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); } - $model = $jsonMapper->map($json, new BlockStateUpgradeSchemaModel()); - $schema = self::fromJsonModel($model); if($schema->getVersionId() > $currentVersion){ //this might be a beta schema which shouldn't be applicable //TODO: why do we load the whole schema just to throw it away if it's too new? ... @@ -305,4 +307,24 @@ final class BlockStateUpgradeSchemaUtils{ ksort($result, SORT_NUMERIC); return $result; } + + public static function loadSchemaFromString(string $raw) : BlockStateUpgradeSchema{ + try{ + $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); + }catch(\JsonException $e){ + throw new \RuntimeException($e->getMessage(), 0, $e); + } + if(!is_object($json)){ + throw new \RuntimeException("Unexpected root type of schema file " . gettype($json) . ", expected object"); + } + + $jsonMapper = new \JsonMapper(); + try{ + $model = $jsonMapper->map($json, new BlockStateUpgradeSchemaModel()); + }catch(\JsonMapper_Exception $e){ + throw new \RuntimeException($e->getMessage(), 0, $e); + } + + return self::fromJsonModel($model); + } } From 905eee3198b72701db7137d6abec598d12002d2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 20:51:31 +0000 Subject: [PATCH 0059/1858] BlockStateUpgrader: do not apply backwards-incompatible schemas to blockstates already on the correct version this notably led to corruption of glow_lichen and sculk_vein in 1.18.10. --- .../upgrade/BlockStateUpgradeSchema.php | 20 +++++++++++++ .../blockstate/upgrade/BlockStateUpgrader.php | 28 ++++++++++++++----- .../upgrade/BlockStateUpgraderTest.php | 2 +- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index 5621288128..e81d84ef5b 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -64,6 +64,8 @@ final class BlockStateUpgradeSchema{ */ public array $remappedStates = []; + private ?bool $backwardsCompatible = null; + public function __construct( public int $maxVersionMajor, public int $maxVersionMinor, @@ -91,4 +93,22 @@ final class BlockStateUpgradeSchema{ return true; } + + public function isBackwardsCompatible() : bool{ + if($this->backwardsCompatible === null){ + $this->backwardsCompatible = true; + foreach([ + $this->renamedIds, + $this->removedProperties, + $this->remappedPropertyValues, + $this->remappedStates + ] as $bcBreakingRules){ + if(count($bcBreakingRules) !== 0){ + $this->backwardsCompatible = false; + } + } + } + //schemas which only add properties are backwards compatible + return $this->backwardsCompatible; + } } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index 9f3ec33cbd..28845d9dc4 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -27,6 +27,7 @@ use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; +use function array_unshift; use function ksort; use const SORT_NUMERIC; @@ -39,18 +40,26 @@ final class BlockStateUpgrader{ * @phpstan-param array $upgradeSchemas */ public function __construct(array $upgradeSchemas){ - foreach($upgradeSchemas as $priority => $schema){ - $this->addSchema($schema, $priority); + foreach($upgradeSchemas as $schema){ + $this->addSchema($schema); } } - public function addSchema(BlockStateUpgradeSchema $schema, int $priority) : void{ - if(isset($this->upgradeSchemas[$schema->getVersionId()][$priority])){ - throw new \InvalidArgumentException("Another schema already has this priority"); + public function addSchema(BlockStateUpgradeSchema $schema) : void{ + if(!$schema->isBackwardsCompatible()){ + $schemaList = $this->upgradeSchemas[$schema->getVersionId()] ?? []; + foreach($schemaList as $otherSchema){ + if(!$otherSchema->isBackwardsCompatible()){ + throw new \InvalidArgumentException("Cannot add two backwards-incompatible schemas with the same version"); + } + } + array_unshift($schemaList, $schema); + $this->upgradeSchemas[$schema->getVersionId()] = $schemaList; + }else{ + //Backwards-compatible schemas can be added in any order + $this->upgradeSchemas[$schema->getVersionId()][] = $schema; } - $this->upgradeSchemas[$schema->getVersionId()][$priority] = $schema; ksort($this->upgradeSchemas, SORT_NUMERIC); - ksort($this->upgradeSchemas[$schema->getVersionId()], SORT_NUMERIC); } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ @@ -62,6 +71,11 @@ final class BlockStateUpgrader{ continue; } foreach($schemas as $schema){ + if(!$schema->isBackwardsCompatible() && $resultVersion === $version){ + //backwards-compatible updates typically don't bump version and must always be applied because we + //can't tell any different, but backwards-incompatible ones SHOULD always get their own version bump + continue; + } $oldName = $blockStateData->getName(); if(isset($schema->remappedStates[$oldName])){ foreach($schema->remappedStates[$oldName] as $remap){ diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php index cd5e44216f..9decc4d887 100644 --- a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php @@ -53,7 +53,7 @@ class BlockStateUpgraderTest extends TestCase{ private function getNewSchemaVersion(int $versionId) : BlockStateUpgradeSchema{ $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff); - $this->upgrader->addSchema($schema, 0); + $this->upgrader->addSchema($schema); return $schema; } From 169a3217de965b4b7adf4d57b31ccfd52a947e06 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Feb 2022 20:56:53 +0000 Subject: [PATCH 0060/1858] fix build --- tests/phpstan/configs/phpstan-bugs.neon | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 99fcbe5e61..6e8229bd7b 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -15,6 +15,11 @@ parameters: count: 1 path: ../../../src/crafting/CraftingManager.php + - + message: "#^Dead catch \\- JsonException is never thrown in the try block\\.$#" + count: 1 + path: ../../../src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php + - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 From bc46e148dfb5de931f8c56c91b4218d6e845658a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 11 Feb 2022 21:13:28 +0000 Subject: [PATCH 0061/1858] Updated to support new tag storage format --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 45 ++++++++----------- .../model/BlockStateUpgradeSchemaModelTag.php | 16 ++----- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index dfe3b922ab..ea6033aa3d 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -38,6 +38,7 @@ use function array_map; use function count; use function file_get_contents; use function get_class; +use function get_debug_type; use function gettype; use function implode; use function is_int; @@ -89,36 +90,28 @@ final class BlockStateUpgradeSchemaUtils{ return implode("\n", $lines); } - private static function tagToJsonModel(Tag $tag) : BlockStateUpgradeSchemaModelTag{ - $type = match(get_class($tag)){ - IntTag::class => "int", - StringTag::class => "string", - ByteTag::class => "byte", - default => throw new \UnexpectedValueException() - }; + public static function tagToJsonModel(Tag $tag) : BlockStateUpgradeSchemaModelTag{ + $model = new BlockStateUpgradeSchemaModelTag(); + if($tag instanceof IntTag){ + $model->int = $tag->getValue(); + }elseif($tag instanceof StringTag){ + $model->string = $tag->getValue(); + }elseif($tag instanceof ByteTag){ + $model->byte = $tag->getValue(); + }else{ + throw new \UnexpectedValueException("Unexpected value type " . get_debug_type($tag)); + } - return new BlockStateUpgradeSchemaModelTag($type, $tag->getValue()); + return $model; } private static function jsonModelToTag(BlockStateUpgradeSchemaModelTag $model) : Tag{ - if($model->type === "int"){ - if(!is_int($model->value)){ - throw new \UnexpectedValueException("Value for type int must be an int"); - } - return new IntTag($model->value); - }elseif($model->type === "byte"){ - if(!is_int($model->value)){ - throw new \UnexpectedValueException("Value for type byte must be an int"); - } - return new ByteTag($model->value); - }elseif($model->type === "string"){ - if(!is_string($model->value)){ - throw new \UnexpectedValueException("Value for type string must be a string"); - } - return new StringTag($model->value); - }else{ - throw new \UnexpectedValueException("Unknown blockstate value type $model->type"); - } + return match(true){ + isset($model->byte) && !isset($model->int) && !isset($model->string) => new ByteTag($model->byte), + !isset($model->byte) && isset($model->int) && !isset($model->string) => new IntTag($model->int), + !isset($model->byte) && !isset($model->int) && isset($model->string) => new StringTag($model->string), + default => throw new \UnexpectedValueException("Malformed JSON model tag, expected exactly one of 'byte', 'int' or 'string' properties") + }; } public static function fromJsonModel(BlockStateUpgradeSchemaModel $model) : BlockStateUpgradeSchema{ diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php index f34c489282..2e0d24cacf 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php @@ -24,17 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate\upgrade\model; final class BlockStateUpgradeSchemaModelTag{ - - /** @required */ - public string $type; - /** - * @required - * @var mixed JsonMapper doesn't support mixed type :( - */ - public $value; - - public function __construct(string $type, mixed $value){ - $this->type = $type; - $this->value = $value; - } + public int $byte; + public int $int; + public string $string; } From dda2f42e59892a3ee35bc69d3b687fb15fb6496b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 11 Feb 2022 21:13:59 +0000 Subject: [PATCH 0062/1858] updated BedrockData --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 8df7f6614d..7c3c03054d 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "1d96dd836a77996719ed09dced6e4bba99b0fc1e" + "reference": "b6ffd9dc61821358d65618d91f67e2ea21d421d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/1d96dd836a77996719ed09dced6e4bba99b0fc1e", - "reference": "1d96dd836a77996719ed09dced6e4bba99b0fc1e", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/b6ffd9dc61821358d65618d91f67e2ea21d421d0", + "reference": "b6ffd9dc61821358d65618d91f67e2ea21d421d0", "shasum": "" }, "type": "library", @@ -271,7 +271,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/experimental/upgrade-tables" }, - "time": "2022-02-09T21:52:48+00:00" + "time": "2022-02-11T20:20:39+00:00" }, { "name": "pocketmine/bedrock-protocol", From e98cf39b47c6c37619cae32d2d2596b08f4d938f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 11 Feb 2022 21:18:56 +0000 Subject: [PATCH 0063/1858] cs --- .../blockstate/upgrade/BlockStateUpgradeSchemaUtils.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index ea6033aa3d..96135430b4 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -37,13 +37,10 @@ use Webmozart\PathUtil\Path; use function array_map; use function count; use function file_get_contents; -use function get_class; use function get_debug_type; use function gettype; use function implode; -use function is_int; use function is_object; -use function is_string; use function json_decode; use function ksort; use function str_pad; From a95749f96883dadc8c41f52bcdbaeadb590178fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 22 Feb 2022 22:09:47 +0000 Subject: [PATCH 0064/1858] Now using new repository for block upgrade schemas --- composer.json | 3 +- composer.lock | 47 +++++++++++++++---- src/CoreConstants.php | 1 + .../format/io/GlobalBlockStateHandlers.php | 9 ++-- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 7f3d979a94..b7186a75ab 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,8 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-data": "dev-experimental/upgrade-tables", + "pocketmine/bedrock-block-upgrade-schema": "dev-master@dev", + "pocketmine/bedrock-data": "~1.6.0+bedrock-1.18.10", "pocketmine/bedrock-protocol": "~8.0.0+bedrock-1.18.10", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index 7c3c03054d..4336da9117 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7b0434a812ea018e8e5491fcd4e81441", + "content-hash": "98a6d4ddd8c38237bc86945326a856d9", "packages": [ { "name": "adhocore/json-comment", @@ -248,17 +248,44 @@ "time": "2020-12-01T19:48:11+00:00" }, { - "name": "pocketmine/bedrock-data", - "version": "dev-experimental/upgrade-tables", + "name": "pocketmine/bedrock-block-upgrade-schema", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/pmmp/BedrockData.git", - "reference": "b6ffd9dc61821358d65618d91f67e2ea21d421d0" + "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", + "reference": "871e5fa8ea56458c05154697f7bb2be3490441d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/b6ffd9dc61821358d65618d91f67e2ea21d421d0", - "reference": "b6ffd9dc61821358d65618d91f67e2ea21d421d0", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/871e5fa8ea56458c05154697f7bb2be3490441d7", + "reference": "871e5fa8ea56458c05154697f7bb2be3490441d7", + "shasum": "" + }, + "default-branch": true, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC0-1.0" + ], + "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", + "support": { + "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" + }, + "time": "2022-02-22T22:00:27+00:00" + }, + { + "name": "pocketmine/bedrock-data", + "version": "1.6.0+bedrock-1.18.10", + "source": { + "type": "git", + "url": "https://github.com/pmmp/BedrockData.git", + "reference": "e98c511584a7bd58a95986374d2df4b04c6a2ba0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/e98c511584a7bd58a95986374d2df4b04c6a2ba0", + "reference": "e98c511584a7bd58a95986374d2df4b04c6a2ba0", "shasum": "" }, "type": "library", @@ -269,9 +296,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/experimental/upgrade-tables" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.18.10" }, - "time": "2022-02-11T20:20:39+00:00" + "time": "2022-02-08T19:13:47+00:00" }, { "name": "pocketmine/bedrock-protocol", @@ -3508,7 +3535,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "pocketmine/bedrock-data": 20 + "pocketmine/bedrock-block-upgrade-schema": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/src/CoreConstants.php b/src/CoreConstants.php index 46e00a2a32..09d43a9891 100644 --- a/src/CoreConstants.php +++ b/src/CoreConstants.php @@ -37,4 +37,5 @@ define('pocketmine\PATH', dirname(__DIR__) . '/'); define('pocketmine\RESOURCE_PATH', dirname(__DIR__) . '/resources/'); define('pocketmine\BEDROCK_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-data/'); define('pocketmine\LOCALE_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/locale-data/'); +define('pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-block-upgrade-schema/'); define('pocketmine\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__) . '/vendor/autoload.php'); diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index c041e08fce..3ea54b01c5 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -38,7 +38,7 @@ use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; use Webmozart\PathUtil\Path; use function file_get_contents; -use const pocketmine\BEDROCK_DATA_PATH; +use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; /** * Provides global access to blockstate serializers for all world providers. @@ -58,7 +58,7 @@ final class GlobalBlockStateHandlers{ return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer( new UpgradingBlockStateDeserializer( new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( - Path::join(BEDROCK_DATA_PATH, 'upgrade_schema'), + Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), BlockStateData::CURRENT_VERSION )), new BlockStateToBlockObjectDeserializer() @@ -72,7 +72,10 @@ final class GlobalBlockStateHandlers{ public static function getLegacyBlockStateMapper() : LegacyBlockStateMapper{ return self::$legacyBlockStateMapper ??= LegacyBlockStateMapper::loadFromString( - ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join(BEDROCK_DATA_PATH, 'r12_to_current_block_map.bin'))), + 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() ); } From 310104f786b094a738bb0c6b7922443ed1a88c53 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Mar 2022 14:34:15 +0000 Subject: [PATCH 0065/1858] BlockFactory: change fullList to non-fixed array when we expand the metadata range, having a fixed array here will present some problems due to significantly increased memory footprint (2x for every bit added). --- src/block/BlockFactory.php | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 91eaff0fa1..c124f4398e 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -71,10 +71,10 @@ class BlockFactory{ use SingletonTrait; /** - * @var \SplFixedArray|Block[] - * @phpstan-var \SplFixedArray + * @var Block[] + * @phpstan-var array */ - private $fullList; + private array $fullList = []; /** * @var int[] @@ -110,8 +110,6 @@ class BlockFactory{ public $blastResistance; public function __construct(){ - $this->fullList = new \SplFixedArray(1024 << Block::INTERNAL_METADATA_BITS); - $this->light = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 0)); $this->lightFilter = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 1)); $this->blocksDirectSkyLight = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, false)); @@ -1017,7 +1015,7 @@ class BlockFactory{ 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]; + $existing = $this->fullList[$index] ?? null; if($existing !== null && $existing->getFullId() === $index){ throw new \InvalidArgumentException("$id:$meta is already mapped"); }else{ @@ -1053,12 +1051,12 @@ class BlockFactory{ } $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; - if($index < 0 || $index >= $this->fullList->getSize()){ + if($index < 0){ throw new \InvalidArgumentException("Block ID $id is out of bounds"); } - if($this->fullList[$index] !== null){ //hot + if(isset($this->fullList[$index])){ //hot $block = clone $this->fullList[$index]; - }elseif(($mappedIndex = $this->getMappedStateId($index)) !== $index && $this->fullList[$mappedIndex] !== null){ //cold + }elseif(($mappedIndex = $this->getMappedStateId($index)) !== $index && isset($this->fullList[$mappedIndex])){ //cold $block = clone $this->fullList[$mappedIndex]; }else{ $block = new UnknownBlock(new BID($id, $meta), BlockBreakInfo::instant()); @@ -1076,13 +1074,13 @@ class BlockFactory{ */ public function isRegistered(int $id, int $meta = 0) : bool{ $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; - $b = $this->fullList[$index]; + $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]; + $b = $this->fullList[$mappedIndex] ?? null; } return $b !== null && !($b instanceof UnknownBlock); } @@ -1091,7 +1089,7 @@ class BlockFactory{ * @return Block[] */ public function getAllKnownStates() : array{ - return array_filter($this->fullList->toArray(), function(?Block $v) : bool{ return $v !== null; }); + return $this->fullList; } /** @@ -1099,7 +1097,7 @@ class BlockFactory{ * Used to correct invalid blockstates found in loaded chunks. */ public function getMappedStateId(int $fullState) : int{ - if($this->fullList[$fullState] !== null){ + if(isset($this->fullList[$fullState])){ return $fullState; } return $this->mappedStateIndexes[$fullState] ?? $this->defaultStateIndexes[$fullState >> Block::INTERNAL_METADATA_BITS] ?? $fullState; From b52bb5016c437438c2c2e1685b2d4a4df83779b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Mar 2022 14:39:02 +0000 Subject: [PATCH 0066/1858] BlockIdentifier: enforce that ID and variant must be non-negative --- src/block/BlockIdentifier.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/block/BlockIdentifier.php b/src/block/BlockIdentifier.php index b69037ad06..2c3d137333 100644 --- a/src/block/BlockIdentifier.php +++ b/src/block/BlockIdentifier.php @@ -38,6 +38,12 @@ class BlockIdentifier{ * @phpstan-param class-string|null $tileClass */ public function __construct(int $blockId, int $variant, ?int $itemId = null, ?string $tileClass = null){ + if($blockId < 0){ + throw new \InvalidArgumentException("Block ID may not be negative"); + } + if($variant < 0){ + throw new \InvalidArgumentException("Block variant may not be negative"); + } $this->blockId = $blockId; $this->variant = $variant; $this->itemId = $itemId; From 334c9daa6add720433c6509896b3ecc82b120799 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Mar 2022 15:22:57 +0000 Subject: [PATCH 0067/1858] BlockFactory: change property cache arrays to use regular arrays instead of SplFixedArray this does come at a performance cost, but is necessary for metadata expansion. we finally concede that this is not going to happen without BC breaks, however small they might be ... --- src/block/BlockFactory.php | 42 +++++++++++++--------------- src/world/Explosion.php | 2 +- src/world/light/BlockLightUpdate.php | 20 ++++++------- src/world/light/LightUpdate.php | 14 ++++++---- src/world/light/SkyLightUpdate.php | 34 +++++++++++----------- tests/phpunit/block/BlockTest.php | 1 - 6 files changed, 55 insertions(+), 58 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index c124f4398e..20b8d8bd43 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -58,8 +58,7 @@ use pocketmine\item\Item; use pocketmine\item\ItemIds; use pocketmine\item\ToolTier; use pocketmine\utils\SingletonTrait; -use function array_fill; -use function array_filter; +use pocketmine\world\light\LightUpdate; use function get_class; use function min; @@ -89,32 +88,27 @@ class BlockFactory{ private array $mappedStateIndexes = []; /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray + * @var int[] + * @phpstan-var array */ - public $light; + public array $light = []; /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray + * @var int[] + * @phpstan-var array */ - public $lightFilter; + public array $lightFilter = []; /** - * @var \SplFixedArray|bool[] - * @phpstan-var \SplFixedArray + * @var true[] + * @phpstan-var array */ - public $blocksDirectSkyLight; + public array $blocksDirectSkyLight = []; /** - * @var \SplFixedArray|float[] - * @phpstan-var \SplFixedArray + * @var float[] + * @phpstan-var array */ - public $blastResistance; + public array $blastResistance = []; public function __construct(){ - $this->light = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 0)); - $this->lightFilter = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 1)); - $this->blocksDirectSkyLight = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, false)); - $this->blastResistance = \SplFixedArray::fromArray(array_fill(0, 1024 << Block::INTERNAL_METADATA_BITS, 0.0)); - $railBreakInfo = new BlockBreakInfo(0.7); $this->registerAllMeta(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); $this->registerAllMeta(new Air(new BID(Ids::AIR, 0), "Air", BlockBreakInfo::indestructible(-1.0))); @@ -1031,11 +1025,13 @@ class BlockFactory{ $this->mappedStateIndexes[$index] = $fullId; }else{ $this->fullList[$index] = $block; + $this->blastResistance[$index] = $block->getBreakInfo()->getBlastResistance(); + $this->light[$index] = $block->getLightLevel(); + $this->lightFilter[$index] = min(15, $block->getLightFilter() + LightUpdate::BASE_LIGHT_FILTER); + if($block->blocksDirectSkyLight()){ + $this->blocksDirectSkyLight[$index] = true; + } } - $this->light[$index] = $block->getLightLevel(); - $this->lightFilter[$index] = min(15, $block->getLightFilter() + 1); //opacity plus 1 standard light filter - $this->blocksDirectSkyLight[$index] = $block->blocksDirectSkyLight(); - $this->blastResistance[$index] = $block->getBreakInfo()->getBlastResistance(); } /** diff --git a/src/world/Explosion.php b/src/world/Explosion.php index f67d9034f5..05ddd3d59d 100644 --- a/src/world/Explosion.php +++ b/src/world/Explosion.php @@ -129,7 +129,7 @@ class Explosion{ $state = $this->subChunkExplorer->currentSubChunk->getFullBlock($vBlockX & SubChunk::COORD_MASK, $vBlockY & SubChunk::COORD_MASK, $vBlockZ & SubChunk::COORD_MASK); - $blastResistance = $blockFactory->blastResistance[$state]; + $blastResistance = $blockFactory->blastResistance[$state] ?? 0; if($blastResistance >= 0){ $blastForce -= ($blastResistance / 5 + 0.3) * $this->stepLen; if($blastForce > 0){ diff --git a/src/world/light/BlockLightUpdate.php b/src/world/light/BlockLightUpdate.php index 5036400d8f..1b10ac8061 100644 --- a/src/world/light/BlockLightUpdate.php +++ b/src/world/light/BlockLightUpdate.php @@ -32,18 +32,18 @@ use function max; class BlockLightUpdate extends LightUpdate{ /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray + * @var int[] + * @phpstan-var array */ private $lightEmitters; /** - * @param \SplFixedArray|int[] $lightFilters - * @param \SplFixedArray|int[] $lightEmitters - * @phpstan-param \SplFixedArray $lightFilters - * @phpstan-param \SplFixedArray $lightEmitters + * @param int[] $lightFilters + * @param int[] $lightEmitters + * @phpstan-param array $lightFilters + * @phpstan-param array $lightEmitters */ - public function __construct(SubChunkExplorer $subChunkExplorer, \SplFixedArray $lightFilters, \SplFixedArray $lightEmitters){ + public function __construct(SubChunkExplorer $subChunkExplorer, array $lightFilters, array $lightEmitters){ parent::__construct($subChunkExplorer, $lightFilters); $this->lightEmitters = $lightEmitters; } @@ -55,7 +55,7 @@ class BlockLightUpdate extends LightUpdate{ public function recalculateNode(int $x, int $y, int $z) : void{ if($this->subChunkExplorer->moveTo($x, $y, $z) !== SubChunkExplorerStatus::INVALID){ $block = $this->subChunkExplorer->currentSubChunk->getFullBlock($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); - $this->setAndUpdateLight($x, $y, $z, max($this->lightEmitters[$block], $this->getHighestAdjacentLight($x, $y, $z) - $this->lightFilters[$block])); + $this->setAndUpdateLight($x, $y, $z, max($this->lightEmitters[$block] ?? 0, $this->getHighestAdjacentLight($x, $y, $z) - ($this->lightFilters[$block] ?? self::BASE_LIGHT_FILTER))); } } @@ -71,7 +71,7 @@ class BlockLightUpdate extends LightUpdate{ foreach($subChunk->getBlockLayers() as $layer){ foreach($layer->getPalette() as $state){ - if($this->lightEmitters[$state] > 0){ + if(($this->lightEmitters[$state] ?? 0) > 0){ $lightSources += $this->scanForLightEmittingBlocks($subChunk, $chunkX << SubChunk::COORD_BIT_SIZE, $subChunkY << SubChunk::COORD_BIT_SIZE, $chunkZ << SubChunk::COORD_BIT_SIZE); break 2; } @@ -87,7 +87,7 @@ class BlockLightUpdate extends LightUpdate{ for($x = 0; $x < SubChunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < SubChunk::EDGE_LENGTH; ++$z){ for($y = 0; $y < SubChunk::EDGE_LENGTH; ++$y){ - $light = $this->lightEmitters[$subChunk->getFullBlock($x, $y, $z)]; + $light = $this->lightEmitters[$subChunk->getFullBlock($x, $y, $z)] ?? 0; if($light > 0){ $this->setAndUpdateLight( $baseX + $x, diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index 45fa19df3d..89e077cb66 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -41,9 +41,11 @@ abstract class LightUpdate{ [ 0, 0, -1] ]; + public const BASE_LIGHT_FILTER = 1; + /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray + * @var int[] + * @phpstan-var array */ protected $lightFilters; @@ -57,10 +59,10 @@ abstract class LightUpdate{ protected $subChunkExplorer; /** - * @param \SplFixedArray|int[] $lightFilters - * @phpstan-param \SplFixedArray $lightFilters + * @param int[] $lightFilters + * @phpstan-param array $lightFilters */ - public function __construct(SubChunkExplorer $subChunkExplorer, \SplFixedArray $lightFilters){ + public function __construct(SubChunkExplorer $subChunkExplorer, array $lightFilters){ $this->lightFilters = $lightFilters; $this->subChunkExplorer = $subChunkExplorer; @@ -196,7 +198,7 @@ abstract class LightUpdate{ $ly = $y & SubChunk::COORD_MASK; $lz = $z & SubChunk::COORD_MASK; $current = $lightArray->get($lx, $ly, $lz); - $potentialLight = $newAdjacentLevel - $this->lightFilters[$this->subChunkExplorer->currentSubChunk->getFullBlock($lx, $ly, $lz)]; + $potentialLight = $newAdjacentLevel - ($this->lightFilters[$this->subChunkExplorer->currentSubChunk->getFullBlock($lx, $ly, $lz)] ?? self::BASE_LIGHT_FILTER); if($current < $potentialLight){ $lightArray->set($lx, $ly, $lz, $potentialLight); diff --git a/src/world/light/SkyLightUpdate.php b/src/world/light/SkyLightUpdate.php index a505fde025..67e88abeb6 100644 --- a/src/world/light/SkyLightUpdate.php +++ b/src/world/light/SkyLightUpdate.php @@ -35,18 +35,18 @@ use function max; class SkyLightUpdate extends LightUpdate{ /** - * @var \SplFixedArray|bool[] - * @phpstan-var \SplFixedArray + * @var true[] + * @phpstan-var array */ private $directSkyLightBlockers; /** - * @param \SplFixedArray|int[] $lightFilters - * @param \SplFixedArray|bool[] $directSkyLightBlockers - * @phpstan-param \SplFixedArray $lightFilters - * @phpstan-param \SplFixedArray $directSkyLightBlockers + * @param int[] $lightFilters + * @param true[] $directSkyLightBlockers + * @phpstan-param array $lightFilters + * @phpstan-param array $directSkyLightBlockers */ - public function __construct(SubChunkExplorer $subChunkExplorer, \SplFixedArray $lightFilters, \SplFixedArray $directSkyLightBlockers){ + public function __construct(SubChunkExplorer $subChunkExplorer, array $lightFilters, array $directSkyLightBlockers){ parent::__construct($subChunkExplorer, $lightFilters); $this->directSkyLightBlockers = $directSkyLightBlockers; } @@ -78,7 +78,7 @@ class SkyLightUpdate extends LightUpdate{ $newHeightMap = self::recalculateHeightMapColumn($chunk, $x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK, $this->directSkyLightBlockers); $chunk->setHeightMap($x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK, $newHeightMap); }elseif($yPlusOne > $oldHeightMap){ //Block changed above the heightmap. - if($this->directSkyLightBlockers[$source]){ + if(isset($this->directSkyLightBlockers[$source])){ $chunk->setHeightMap($x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK, $yPlusOne); $newHeightMap = $yPlusOne; }else{ //Block changed which has no effect on direct sky light, for example placing or removing glass. @@ -97,7 +97,7 @@ class SkyLightUpdate extends LightUpdate{ $this->setAndUpdateLight($x, $i, $z, 15); } }else{ //No heightmap change, block changed "underground" - $this->setAndUpdateLight($x, $y, $z, max(0, $this->getHighestAdjacentLight($x, $y, $z) - $this->lightFilters[$source])); + $this->setAndUpdateLight($x, $y, $z, max(0, $this->getHighestAdjacentLight($x, $y, $z) - ($this->lightFilters[$source] ?? self::BASE_LIGHT_FILTER))); } } @@ -168,10 +168,10 @@ class SkyLightUpdate extends LightUpdate{ /** * Recalculates the heightmap for the whole chunk. * - * @param \SplFixedArray|bool[] $directSkyLightBlockers - * @phpstan-param \SplFixedArray $directSkyLightBlockers + * @param true[] $directSkyLightBlockers + * @phpstan-param array $directSkyLightBlockers */ - private static function recalculateHeightMap(Chunk $chunk, \SplFixedArray $directSkyLightBlockers) : HeightArray{ + private static function recalculateHeightMap(Chunk $chunk, array $directSkyLightBlockers) : HeightArray{ $maxSubChunkY = Chunk::MAX_SUBCHUNK_INDEX; for(; $maxSubChunkY >= Chunk::MIN_SUBCHUNK_INDEX; $maxSubChunkY--){ if(!$chunk->getSubChunk($maxSubChunkY)->isEmptyFast()){ @@ -198,7 +198,7 @@ class SkyLightUpdate extends LightUpdate{ $result->set($x, $z, World::Y_MIN); }else{ for(; $y >= World::Y_MIN; --$y){ - if($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)]){ + if(isset($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)])){ $result->set($x, $z, $y + 1); break; } @@ -214,18 +214,18 @@ class SkyLightUpdate extends LightUpdate{ * * @param int $x 0-15 * @param int $z 0-15 - * @param \SplFixedArray|bool[] $directSkyLightBlockers - * @phpstan-param \SplFixedArray $directSkyLightBlockers + * @param true[] $directSkyLightBlockers + * @phpstan-param array $directSkyLightBlockers * * @return int New calculated heightmap value (0-256 inclusive) */ - private static function recalculateHeightMapColumn(Chunk $chunk, int $x, int $z, \SplFixedArray $directSkyLightBlockers) : int{ + private static function recalculateHeightMapColumn(Chunk $chunk, int $x, int $z, array $directSkyLightBlockers) : int{ $y = $chunk->getHighestBlockAt($x, $z); if($y === null){ return World::Y_MIN; } for(; $y >= World::Y_MIN; --$y){ - if($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)]){ + if(isset($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)])){ break; } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 033f191b52..77b8dedf07 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -137,7 +137,6 @@ class BlockTest extends TestCase{ */ public function testLightFiltersValid() : void{ foreach($this->blockFactory->lightFilter as $id => $value){ - self::assertNotNull($value, "Light filter value missing for $id"); self::assertLessThanOrEqual(15, $value, "Light filter value for $id is larger than the expected 15"); self::assertGreaterThan(0, $value, "Light filter value for $id must be larger than 0"); } From 3c5300556abab1fbefe9e2d47c01bc8d1e873cb8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Mar 2022 15:27:57 +0000 Subject: [PATCH 0068/1858] Fixed tests --- tests/phpunit/block/BlockTest.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 77b8dedf07..ebcaca8dc4 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -71,19 +71,11 @@ class BlockTest extends TestCase{ throw new \RuntimeException("Can't test registering new blocks because no unused spaces left"); } - /** - * Verifies that blocks with IDs larger than 255 can't be registered - */ - public function testRegisterIdTooLarge() : void{ - self::expectException(\RuntimeException::class); - $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(25555, 0), "Out Of Bounds Block", BlockBreakInfo::instant())); - } - /** * Verifies that blocks with IDs smaller than 0 can't be registered */ public function testRegisterIdTooSmall() : void{ - self::expectException(\RuntimeException::class); + self::expectException(\InvalidArgumentException::class); $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1, 0), "Out Of Bounds Block", BlockBreakInfo::instant())); } From 9f4418e01d74a3bd86b3ab5b3fe986741d5c80f1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Mar 2022 12:52:51 +0000 Subject: [PATCH 0069/1858] Wall: separate connection calculation into its own method we'll need this once wall connections start actually being stored instead of just being recalculated on every read. --- src/block/Wall.php | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/block/Wall.php b/src/block/Wall.php index 6c827d1908..06e7d061a5 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -35,16 +35,31 @@ class Wall extends Transparent{ public function readStateFromWorld() : void{ parent::readStateFromWorld(); + $this->recalculateConnections(); + } + + protected function recalculateConnections() : bool{ + $changed = 0; foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); if($block instanceof static || $block instanceof FenceGate || ($block->isSolid() && !$block->isTransparent())){ - $this->connections[$facing] = $facing; - }else{ + if(!isset($this->connections[$facing])){ + $this->connections[$facing] = $facing; + $changed++; + } + }elseif(isset($this->connections[$facing])){ unset($this->connections[$facing]); + $changed++; } } - $this->up = $this->getSide(Facing::UP)->getId() !== BlockLegacyIds::AIR; + $up = $this->getSide(Facing::UP)->getId() !== BlockLegacyIds::AIR; + if($up !== $this->up){ + $this->up = $up; + $changed++; + } + + return $changed > 0; } protected function recalculateCollisionBoxes() : array{ From 993adc8c82fedca5d6b3ffcff1258459a1bc0991 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Mar 2022 12:59:45 +0000 Subject: [PATCH 0070/1858] LevelDB: remove deprecated constants there's no point pretending we can maintain BC on this now --- src/world/format/io/leveldb/LevelDB.php | 29 ------------------------- 1 file changed, 29 deletions(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 26329a0449..e3b8eeef41 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -72,39 +72,10 @@ use const LEVELDB_ZLIB_RAW_COMPRESSION; class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ - /** @deprecated */ - protected const TAG_DATA_2D = ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES; - /** @deprecated */ - protected const TAG_DATA_2D_LEGACY = ChunkDataKey::HEIGHTMAP_AND_2D_BIOME_COLORS; - /** @deprecated */ - protected const TAG_SUBCHUNK_PREFIX = ChunkDataKey::SUBCHUNK; - /** @deprecated */ - protected const TAG_LEGACY_TERRAIN = ChunkDataKey::LEGACY_TERRAIN; - /** @deprecated */ - protected const TAG_BLOCK_ENTITY = ChunkDataKey::BLOCK_ENTITIES; - /** @deprecated */ - protected const TAG_ENTITY = ChunkDataKey::ENTITIES; - /** @deprecated */ - protected const TAG_PENDING_TICK = ChunkDataKey::PENDING_SCHEDULED_TICKS; - /** @deprecated */ - protected const TAG_BLOCK_EXTRA_DATA = ChunkDataKey::LEGACY_BLOCK_EXTRA_DATA; - /** @deprecated */ - protected const TAG_BIOME_STATE = ChunkDataKey::BIOME_STATES; - /** @deprecated */ - protected const TAG_STATE_FINALISATION = ChunkDataKey::FINALIZATION; - - /** @deprecated */ - protected const TAG_BORDER_BLOCKS = ChunkDataKey::BORDER_BLOCKS; - /** @deprecated */ - protected const TAG_HARDCODED_SPAWNERS = ChunkDataKey::HARDCODED_SPAWNERS; - protected const FINALISATION_NEEDS_INSTATICKING = 0; protected const FINALISATION_NEEDS_POPULATION = 1; protected const FINALISATION_DONE = 2; - /** @deprecated */ - protected const TAG_VERSION = ChunkDataKey::NEW_VERSION; - protected const ENTRY_FLAT_WORLD_LAYERS = "game_flatworldlayers"; protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_18_0_25_beta; From 4c433fd75b47de84c0dd83a14694ab5f4774f6c8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 28 Mar 2022 18:13:14 +0100 Subject: [PATCH 0071/1858] Remap invalid metadata values to zero this is a bit less sophisticated than the way we do it with BlockFactory, but this shouldn't usually have any relevance anyway - it's only used for correcting bogus states. --- src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php index c2b2517d5f..843c0932eb 100644 --- a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php @@ -42,7 +42,7 @@ final class LegacyBlockStateMapper{ ){} public function fromStringIdMeta(string $id, int $meta) : ?BlockStateData{ - return $this->mappingTable[$id][$meta] ?? null; + return $this->mappingTable[$id][$meta] ?? $this->mappingTable[$id][0] ?? null; } public function fromIntIdMeta(int $id, int $meta) : ?BlockStateData{ From ede9e78fbd80904b52d15eec1f98cc76a604e906 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 29 Mar 2022 12:49:49 +0100 Subject: [PATCH 0072/1858] ItemBlock: make final, and document its purpose more clearly --- src/item/ItemBlock.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 0836d86e1c..f5bf7920e3 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -27,9 +27,12 @@ use pocketmine\block\Block; use pocketmine\block\BlockFactory; /** - * Class used for Items that can be Blocks + * Class used for Items that directly represent blocks, such as stone, dirt, wood etc. + * + * This should NOT be used for items which are merely *associated* with blocks (e.g. seeds are not wheat crops; they + * just place wheat crops when used on the ground). */ -class ItemBlock extends Item{ +final class ItemBlock extends Item{ /** @var int */ private $blockFullId; From c1c3475e5ae0ae9378a1484b293f30f13d955380 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Apr 2022 19:06:56 +0100 Subject: [PATCH 0073/1858] RuntimeBlockMapping: reuse the state ID for unknown blocks this doesn't really provide any meaningful benefit, unless there are a very large number of unrecognized states --- src/network/mcpe/convert/RuntimeBlockMapping.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index efbfdeb756..b4c323622d 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -51,6 +51,7 @@ final class RuntimeBlockMapping{ /** Used when a blockstate can't be correctly serialized (e.g. because it's unknown) */ private BlockStateData $fallbackStateData; + private int $fallbackStateId; private function __construct(){ $contents = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"); @@ -58,6 +59,7 @@ final class RuntimeBlockMapping{ $this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData($this->fallbackStateData) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); } public function toRuntimeId(int $internalStateId) : int{ @@ -67,17 +69,17 @@ final class RuntimeBlockMapping{ try{ $blockStateData = $this->blockStateSerializer->serialize($internalStateId); + + $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); + if($networkId === null){ + throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); + } }catch(BlockStateSerializeException){ //TODO: this will swallow any error caused by invalid block properties; this is not ideal, but it should be //covered by unit tests, so this is probably a safe assumption. - $blockStateData = $this->fallbackStateData; + $networkId = $this->fallbackStateId; } - $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); - - if($networkId === null){ - throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); - } return $this->networkIdCache[$internalStateId] = $networkId; } From eafbc3a46860c447aba739ad1d5d8ccc5c97bcec Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Apr 2022 19:10:24 +0100 Subject: [PATCH 0074/1858] Expand height range to include -64 to 320 --- src/network/mcpe/ChunkRequestTask.php | 2 +- .../mcpe/serializer/ChunkSerializer.php | 8 ------- src/world/World.php | 4 ++-- src/world/format/Chunk.php | 4 ++-- src/world/format/io/leveldb/LevelDB.php | 23 ++----------------- 5 files changed, 7 insertions(+), 34 deletions(-) diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 5a8c06fa5e..cc94c95f15 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -69,7 +69,7 @@ class ChunkRequestTask extends AsyncTask{ public function onRun() : void{ $chunk = FastChunkSerializer::deserializeTerrain($this->chunk); - $subCount = ChunkSerializer::getSubChunkCount($chunk) + ChunkSerializer::LOWER_PADDING_SIZE; + $subCount = ChunkSerializer::getSubChunkCount($chunk); $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); $this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create($this->chunkX, $this->chunkZ, $subCount, false, null, $payload))->getBuffer())); diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index f83e2fa201..6246dcc495 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -41,8 +41,6 @@ use function count; use function str_repeat; final class ChunkSerializer{ - public const LOWER_PADDING_SIZE = 4; - private function __construct(){ //NOOP } @@ -65,12 +63,6 @@ final class ChunkSerializer{ public static function serializeFullChunk(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ $stream = PacketSerializer::encoder($encoderContext); - //TODO: HACK! fill in fake subchunks to make up for the new negative space client-side - for($y = 0; $y < self::LOWER_PADDING_SIZE; $y++){ - $stream->putByte(8); //subchunk version 8 - $stream->putByte(0); //0 layers - client will treat this as all-air - } - $subChunkCount = self::getSubChunkCount($chunk); for($y = Chunk::MIN_SUBCHUNK_INDEX, $writtenCount = 0; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream, false); diff --git a/src/world/World.php b/src/world/World.php index 6c2a6a9e58..4aa5ba7dc8 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -134,8 +134,8 @@ class World implements ChunkManager{ /** @var int */ private static $worldIdCounter = 1; - public const Y_MAX = 256; - public const Y_MIN = 0; + public const Y_MAX = 320; + public const Y_MIN = -64; public const TIME_DAY = 1000; public const TIME_NOON = 6000; diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 6a8dad59c8..6e33e0c05c 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -35,8 +35,8 @@ class Chunk{ public const DIRTY_FLAG_BLOCKS = 1 << 0; public const DIRTY_FLAG_BIOMES = 1 << 3; - public const MIN_SUBCHUNK_INDEX = 0; - public const MAX_SUBCHUNK_INDEX = 15; + public const MIN_SUBCHUNK_INDEX = -4; + public const MAX_SUBCHUNK_INDEX = 19; public const MAX_SUBCHUNKS = self::MAX_SUBCHUNK_INDEX - self::MIN_SUBCHUNK_INDEX + 1; public const EDGE_LENGTH = SubChunk::EDGE_LENGTH; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index e3b8eeef41..6bf9552f4f 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -123,11 +123,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } public function getWorldMinY() : int{ - return 0; + return -64; } public function getWorldMaxY() : int{ - return 256; + return 320; } public static function isValid(string $path) : bool{ @@ -514,25 +514,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $chunk = $chunkData->getChunk(); - //TODO: This ensures that negative subchunks don't get destroyed in newer worlds for as long as we don't yet - //support negative height. Since we don't save with a shift, if the old save had the subchunks shifted, we need - //to shift them to their correct positions to avoid destroying data. - //This can be removed once we support the full height. - if($previousVersion !== null && self::hasOffsetCavesAndCliffsSubChunks($previousVersion)){ - $subChunks = $chunk->getSubChunks(); - - for($y = -4; $y <= 20; $y++){ - $key = $index . ChunkDataKey::SUBCHUNK . chr($y + self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET); - if( - (!isset($subChunks[$y]) || !$chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)) && - ($subChunkData = $this->db->get($key)) !== false - ){ - $write->delete($key); - $write->put($index . ChunkDataKey::SUBCHUNK . chr($y & 0xff), $subChunkData); - } - } - } - if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)){ $subChunks = $chunk->getSubChunks(); From 3edb735850ba11c847dc14aa6fea6f7ae72f60b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Apr 2022 19:12:08 +0100 Subject: [PATCH 0075/1858] Regenerate PHPStan baseline --- tests/phpstan/configs/actual-problems.neon | 32 +--------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index d3776de3d2..e1dbcda47d 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -131,7 +131,7 @@ parameters: path: ../../../src/block/DragonEgg.php - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int\\<0, max\\> given\\.$#" + message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int\\<\\-64, max\\> given\\.$#" count: 1 path: ../../../src/block/DragonEgg.php @@ -955,11 +955,6 @@ parameters: count: 1 path: ../../../src/world/Explosion.php - - - message: "#^Only numeric types are allowed in /, float\\|null given on the left side\\.$#" - count: 1 - path: ../../../src/world/Explosion.php - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -1270,16 +1265,6 @@ parameters: count: 1 path: ../../../src/world/light/BlockLightUpdate.php - - - message: "#^Only numeric types are allowed in \\-, int\\|null given on the right side\\.$#" - count: 1 - path: ../../../src/world/light/BlockLightUpdate.php - - - - message: "#^Parameter \\#4 \\$newLevel of method pocketmine\\\\world\\\\light\\\\LightUpdate\\:\\:setAndUpdateLight\\(\\) expects int, int\\|null given\\.$#" - count: 1 - path: ../../../src/world/light/BlockLightUpdate.php - - message: "#^Property pocketmine\\\\world\\\\light\\\\LightPopulationTask\\:\\:\\$resultBlockLightArrays \\(string\\) does not accept string\\|null\\.$#" count: 1 @@ -1300,11 +1285,6 @@ parameters: count: 1 path: ../../../src/world/light/LightUpdate.php - - - message: "#^Only numeric types are allowed in \\-, int\\|null given on the right side\\.$#" - count: 1 - path: ../../../src/world/light/LightUpdate.php - - message: "#^Cannot call method getBlockSkyLightArray\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 @@ -1340,21 +1320,11 @@ parameters: count: 1 path: ../../../src/world/light/SkyLightUpdate.php - - - message: "#^Only booleans are allowed in an if condition, bool\\|null given\\.$#" - count: 3 - path: ../../../src/world/light/SkyLightUpdate.php - - message: "#^Only numeric types are allowed in \\+, int\\|false given on the left side\\.$#" count: 1 path: ../../../src/world/light/SkyLightUpdate.php - - - message: "#^Only numeric types are allowed in \\-, int\\|null given on the right side\\.$#" - count: 1 - path: ../../../src/world/light/SkyLightUpdate.php - - message: "#^Parameter \\#1 \\$chunk of static method pocketmine\\\\world\\\\light\\\\SkyLightUpdate\\:\\:recalculateHeightMap\\(\\) expects pocketmine\\\\world\\\\format\\\\Chunk, pocketmine\\\\world\\\\format\\\\Chunk\\|null given\\.$#" count: 1 From 63b2e7cc4f221a8c156f3704718d4ec7a8ea4edb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Apr 2022 19:25:39 +0100 Subject: [PATCH 0076/1858] fix CS --- src/network/mcpe/convert/RuntimeBlockMapping.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index b4c323622d..e30d1ca2eb 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -80,7 +80,6 @@ final class RuntimeBlockMapping{ $networkId = $this->fallbackStateId; } - return $this->networkIdCache[$internalStateId] = $networkId; } From 42474c14aa98a23f22d70e22a616406f6909db51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Apr 2022 19:47:25 +0100 Subject: [PATCH 0077/1858] World: reduce blockhash padding for Y axis to accommodate new height range --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index 4aa5ba7dc8..48c3d5b479 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -329,7 +329,7 @@ class World implements ChunkManager{ private const MORTON3D_BIT_SIZE = 21; private const BLOCKHASH_Y_BITS = 9; - private const BLOCKHASH_Y_PADDING = 128; //size (in blocks) of padding after both boundaries of the Y axis + private const BLOCKHASH_Y_PADDING = 64; //size (in blocks) of padding after both boundaries of the Y axis private const BLOCKHASH_Y_OFFSET = self::BLOCKHASH_Y_PADDING - self::Y_MIN; private const BLOCKHASH_Y_MASK = (1 << self::BLOCKHASH_Y_BITS) - 1; private const BLOCKHASH_XZ_MASK = (1 << self::MORTON3D_BIT_SIZE) - 1; From 8edf2c4507ccee595637fc06ceb98fb90cf9babb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Apr 2022 15:31:39 +0100 Subject: [PATCH 0078/1858] Update blockstate upgrade schemas --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 29f74a6812..e2e67bbe5c 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "871e5fa8ea56458c05154697f7bb2be3490441d7" + "reference": "90aa2b01ba9c863ecb5818210235ad304b1b13b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/871e5fa8ea56458c05154697f7bb2be3490441d7", - "reference": "871e5fa8ea56458c05154697f7bb2be3490441d7", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/90aa2b01ba9c863ecb5818210235ad304b1b13b3", + "reference": "90aa2b01ba9c863ecb5818210235ad304b1b13b3", "shasum": "" }, "default-branch": true, @@ -272,7 +272,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-02-22T22:00:27+00:00" + "time": "2022-04-15T17:44:42+00:00" }, { "name": "pocketmine/bedrock-data", From cfea0dac76e7f942c688808b8a7f70d292f36c58 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Apr 2022 14:22:31 +0100 Subject: [PATCH 0079/1858] Push back to 4.4.0 --- src/VersionInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c2b9b39748..3da89892c6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,7 +31,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.3.0"; + public const BASE_VERSION = "4.4.0"; public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; From 43e61336cfdb81f43cd8bed9800bbc649f7599eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Apr 2022 14:58:32 +0100 Subject: [PATCH 0080/1858] Support 1.18.30 worlds --- .../bedrock/blockstate/BlockTypeNames.php | 29 ++++++++++++------- .../BlockObjectToBlockStateSerializer.php | 8 ++--- .../BlockStateToBlockObjectDeserializer.php | 8 ++--- src/world/format/io/data/BedrockWorldData.php | 4 +-- src/world/format/io/leveldb/ChunkVersion.php | 1 + src/world/format/io/leveldb/LevelDB.php | 3 +- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/blockstate/BlockTypeNames.php index 01c1161983..93b6370898 100644 --- a/src/data/bedrock/blockstate/BlockTypeNames.php +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -139,7 +139,7 @@ final class BlockTypeNames{ public const COMMAND_BLOCK = "minecraft:command_block"; public const COMPOSTER = "minecraft:composter"; public const CONCRETE = "minecraft:concrete"; - public const CONCRETEPOWDER = "minecraft:concretePowder"; + public const CONCRETE_POWDER = "minecraft:concrete_powder"; public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; public const COPPER_ORE = "minecraft:copper_ore"; @@ -374,7 +374,7 @@ final class BlockTypeNames{ public const FLOWING_LAVA = "minecraft:flowing_lava"; public const FLOWING_WATER = "minecraft:flowing_water"; public const FRAME = "minecraft:frame"; - public const FROG_EGG = "minecraft:frog_egg"; + public const FROG_SPAWN = "minecraft:frog_spawn"; public const FROSTED_ICE = "minecraft:frosted_ice"; public const FURNACE = "minecraft:furnace"; public const GILDED_BLACKSTONE = "minecraft:gilded_blackstone"; @@ -413,7 +413,7 @@ final class BlockTypeNames{ public const INFESTED_DEEPSLATE = "minecraft:infested_deepslate"; public const INFO_UPDATE = "minecraft:info_update"; public const INFO_UPDATE2 = "minecraft:info_update2"; - public const INVISIBLEBEDROCK = "minecraft:invisibleBedrock"; + public const INVISIBLE_BEDROCK = "minecraft:invisible_bedrock"; public const IRON_BARS = "minecraft:iron_bars"; public const IRON_BLOCK = "minecraft:iron_block"; public const IRON_DOOR = "minecraft:iron_door"; @@ -467,6 +467,9 @@ final class BlockTypeNames{ public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; public const MAGMA = "minecraft:magma"; + public const MANGROVE_LEAVES = "minecraft:mangrove_leaves"; + public const MANGROVE_PROPAGULE = "minecraft:mangrove_propagule"; + public const MANGROVE_PROPAGULE_HANGING = "minecraft:mangrove_propagule_hanging"; public const MEDIUM_AMETHYST_BUD = "minecraft:medium_amethyst_bud"; public const MELON_BLOCK = "minecraft:melon_block"; public const MELON_STEM = "minecraft:melon_stem"; @@ -477,10 +480,14 @@ final class BlockTypeNames{ public const MOSSY_COBBLESTONE = "minecraft:mossy_cobblestone"; public const MOSSY_COBBLESTONE_STAIRS = "minecraft:mossy_cobblestone_stairs"; public const MOSSY_STONE_BRICK_STAIRS = "minecraft:mossy_stone_brick_stairs"; - public const MOVINGBLOCK = "minecraft:movingBlock"; + public const MOVING_BLOCK = "minecraft:moving_block"; + public const MUD = "minecraft:mud"; + public const MUD_BRICK_DOUBLE_SLAB = "minecraft:mud_brick_double_slab"; + public const MUD_BRICK_SLAB = "minecraft:mud_brick_slab"; + public const MUD_BRICK_STAIRS = "minecraft:mud_brick_stairs"; + public const MUD_BRICK_WALL = "minecraft:mud_brick_wall"; + public const MUD_BRICKS = "minecraft:mud_bricks"; public const MYCELIUM = "minecraft:mycelium"; - public const MYSTERIOUS_FRAME = "minecraft:mysterious_frame"; - public const MYSTERIOUS_FRAME_SLOT = "minecraft:mysterious_frame_slot"; public const NETHER_BRICK = "minecraft:nether_brick"; public const NETHER_BRICK_FENCE = "minecraft:nether_brick_fence"; public const NETHER_BRICK_STAIRS = "minecraft:nether_brick_stairs"; @@ -506,12 +513,13 @@ final class BlockTypeNames{ public const OXIDIZED_CUT_COPPER_STAIRS = "minecraft:oxidized_cut_copper_stairs"; public const OXIDIZED_DOUBLE_CUT_COPPER_SLAB = "minecraft:oxidized_double_cut_copper_slab"; public const PACKED_ICE = "minecraft:packed_ice"; + public const PACKED_MUD = "minecraft:packed_mud"; public const PEARLESCENT_FROGLIGHT = "minecraft:pearlescent_froglight"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; public const PISTON = "minecraft:piston"; - public const PISTONARMCOLLISION = "minecraft:pistonArmCollision"; + public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; public const PLANKS = "minecraft:planks"; public const PODZOL = "minecraft:podzol"; public const POINTED_DRIPSTONE = "minecraft:pointed_dripstone"; @@ -575,6 +583,7 @@ final class BlockTypeNames{ public const REDSTONE_TORCH = "minecraft:redstone_torch"; public const REDSTONE_WIRE = "minecraft:redstone_wire"; public const REEDS = "minecraft:reeds"; + public const REINFORCED_DEEPSLATE = "minecraft:reinforced_deepslate"; public const REPEATING_COMMAND_BLOCK = "minecraft:repeating_command_block"; public const RESERVED6 = "minecraft:reserved6"; public const RESPAWN_ANCHOR = "minecraft:respawn_anchor"; @@ -588,9 +597,9 @@ final class BlockTypeNames{ public const SCULK_SENSOR = "minecraft:sculk_sensor"; public const SCULK_SHRIEKER = "minecraft:sculk_shrieker"; public const SCULK_VEIN = "minecraft:sculk_vein"; + public const SEA_LANTERN = "minecraft:sea_lantern"; public const SEA_PICKLE = "minecraft:sea_pickle"; public const SEAGRASS = "minecraft:seagrass"; - public const SEALANTERN = "minecraft:seaLantern"; public const SHROOMLIGHT = "minecraft:shroomlight"; public const SHULKER_BOX = "minecraft:shulker_box"; public const SILVER_GLAZED_TERRACOTTA = "minecraft:silver_glazed_terracotta"; @@ -629,7 +638,7 @@ final class BlockTypeNames{ public const STANDING_BANNER = "minecraft:standing_banner"; public const STANDING_SIGN = "minecraft:standing_sign"; public const STICKY_PISTON = "minecraft:sticky_piston"; - public const STICKYPISTONARMCOLLISION = "minecraft:stickyPistonArmCollision"; + public const STICKY_PISTON_ARM_COLLISION = "minecraft:sticky_piston_arm_collision"; public const STONE = "minecraft:stone"; public const STONE_BRICK_STAIRS = "minecraft:stone_brick_stairs"; public const STONE_BUTTON = "minecraft:stone_button"; @@ -662,7 +671,7 @@ final class BlockTypeNames{ public const TORCH = "minecraft:torch"; public const TRAPDOOR = "minecraft:trapdoor"; public const TRAPPED_CHEST = "minecraft:trapped_chest"; - public const TRIPWIRE = "minecraft:tripWire"; + public const TRIP_WIRE = "minecraft:trip_wire"; public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; public const TUFF = "minecraft:tuff"; public const TURTLE_EGG = "minecraft:turtle_egg"; diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index 5e29f1c834..88bce58ef2 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -396,7 +396,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeColor($block->getColor()); }); $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ - return Writer::create(Ids::CONCRETEPOWDER) + return Writer::create(Ids::CONCRETE_POWDER) ->writeColor($block->getColor()); }); $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ @@ -681,7 +681,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); $this->map(Blocks::INFO_UPDATE(), fn() => new Writer(Ids::INFO_UPDATE)); $this->map(Blocks::INFO_UPDATE2(), fn() => new Writer(Ids::INFO_UPDATE2)); - $this->map(Blocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLEBEDROCK)); + $this->map(Blocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLE_BEDROCK)); $this->map(Blocks::IRON(), fn() => new Writer(Ids::IRON_BLOCK)); $this->map(Blocks::IRON_BARS(), fn() => new Writer(Ids::IRON_BARS)); $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); @@ -925,7 +925,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); $this->map(Blocks::SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SANDSTONE_STAIRS))); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); - $this->map(Blocks::SEA_LANTERN(), fn() => new Writer(Ids::SEALANTERN)); + $this->map(Blocks::SEA_LANTERN(), fn() => new Writer(Ids::SEA_LANTERN)); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ return Writer::create(Ids::SEA_PICKLE) ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) @@ -1045,7 +1045,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeHorizontalFacing($block->getFacing()); }); $this->map(Blocks::TRIPWIRE(), function(Tripwire $block) : Writer{ - return Writer::create(Ids::TRIPWIRE) + return Writer::create(Ids::TRIP_WIRE) ->writeBool(StateNames::ATTACHED_BIT, $block->isConnected()) ->writeBool(StateNames::DISARMED_BIT, $block->isDisarmed()) ->writeBool(StateNames::POWERED_BIT, $block->isTriggered()) diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 3da7d1508f..323cdc63d4 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -226,7 +226,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CONCRETE() ->setColor($in->readColor()); }); - $this->map(Ids::CONCRETEPOWDER, function(Reader $in) : Block{ + $this->map(Ids::CONCRETE_POWDER, function(Reader $in) : Block{ return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); }); @@ -531,7 +531,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::ICE, fn() => Blocks::ICE()); $this->map(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); $this->map(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); - $this->map(Ids::INVISIBLEBEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); + $this->map(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); $this->map(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); $this->map(Ids::IRON_BLOCK, fn() => Blocks::IRON()); $this->map(Ids::IRON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::IRON_DOOR(), $in)); @@ -838,7 +838,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }) ->setReady($in->readBool(StateNames::AGE_BIT)); }); - $this->map(Ids::SEALANTERN, fn() => Blocks::SEA_LANTERN()); + $this->map(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ return Blocks::SEA_PICKLE() ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) @@ -983,7 +983,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::TRAPPED_CHEST() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::TRIPWIRE, function(Reader $in) : Block{ + $this->map(Ids::TRIP_WIRE, function(Reader $in) : Block{ return Blocks::TRIPWIRE() ->setConnected($in->readBool(StateNames::ATTACHED_BIT)) ->setDisarmed($in->readBool(StateNames::DISARMED_BIT)) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 80184b9ec1..dae9e8c088 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -47,13 +47,13 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ - public const CURRENT_STORAGE_VERSION = 8; + public const CURRENT_STORAGE_VERSION = 9; /** * WARNING: In the future, this should be only as high as the newest world format currently supported. We don't * actually support worlds from 1.18.10 yet, but due to an old stupid bug, all worlds created by PM will report this * version. */ - public const CURRENT_STORAGE_NETWORK_VERSION = 486; // 1.18.10 + public const CURRENT_STORAGE_NETWORK_VERSION = 503; // 1.18.10 public const GENERATOR_LIMITED = 0; public const GENERATOR_INFINITE = 1; diff --git a/src/world/format/io/leveldb/ChunkVersion.php b/src/world/format/io/leveldb/ChunkVersion.php index e4fb74526f..7a9208dba7 100644 --- a/src/world/format/io/leveldb/ChunkVersion.php +++ b/src/world/format/io/leveldb/ChunkVersion.php @@ -70,4 +70,5 @@ final class ChunkVersion{ public const v1_18_0_24_beta = 37; public const v1_18_0_24_unused = 38; public const v1_18_0_25_beta = 39; + public const v1_18_30 = 40; } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 6bf9552f4f..4c4b9d1b19 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -78,7 +78,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ protected const ENTRY_FLAT_WORLD_LAYERS = "game_flatworldlayers"; - protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_18_0_25_beta; + protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_18_30; protected const CURRENT_LEVEL_SUBCHUNK_VERSION = SubChunkVersion::PALETTED_MULTI; private const CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET = 4; @@ -296,6 +296,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; switch($chunkVersion){ + case ChunkVersion::v1_18_30: case ChunkVersion::v1_18_0_25_beta: case ChunkVersion::v1_18_0_24_unused: case ChunkVersion::v1_18_0_24_beta: From 37f0ccdb7e3d2fb5fd3c1b791f11eed4852a7b2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Apr 2022 14:58:57 +0100 Subject: [PATCH 0081/1858] fix CS --- src/network/mcpe/convert/RuntimeBlockMapping.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 82ef9266fe..2913e63c59 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -28,7 +28,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\data\bedrock\blockstate\BlockStateSerializer; use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\protocol\SimulationTypePacket; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; @@ -57,7 +56,7 @@ final class RuntimeBlockMapping{ private static function make() : self{ return new self(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")); } - + public function __construct(string $canonicalBlockStatesFile){ $contents = Utils::assumeNotFalse(file_get_contents($canonicalBlockStatesFile), "Missing required resource file"); $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); From 6c92e73b4648c85d852ea9a76ee04320e2ef0fe9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 15:30:35 +0100 Subject: [PATCH 0082/1858] Switch to modernized BedrockData --- composer.json | 2 +- composer.lock | 17 +++++++++-------- src/data/bedrock/LegacyBlockIdToStringIdMap.php | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 001acdafdc..1362c107a0 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-block-upgrade-schema": "dev-master@dev", - "pocketmine/bedrock-data": "~1.7.0+bedrock-1.18.30", + "pocketmine/bedrock-data": "dev-modern-world-support@dev", "pocketmine/bedrock-protocol": "~9.0.0+bedrock-1.18.30", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index 95591e8e47..1b627715ea 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0d40189fe566643df70bf3eee5a9b126", + "content-hash": "f9bd717430394f8e47f421ce1aecaf32", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "1.7.0+bedrock-1.18.30", + "version": "dev-modern-world-support", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "c8f323ff0cbdb36a5d95e7e4a23969f562445be0" + "reference": "5f94ed0af2e3f301671b1d10073219133178c9c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/c8f323ff0cbdb36a5d95e7e4a23969f562445be0", - "reference": "c8f323ff0cbdb36a5d95e7e4a23969f562445be0", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/5f94ed0af2e3f301671b1d10073219133178c9c4", + "reference": "5f94ed0af2e3f301671b1d10073219133178c9c4", "shasum": "" }, "type": "library", @@ -296,9 +296,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.18.30" + "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-04-20T12:40:59+00:00" + "time": "2022-05-12T14:21:14+00:00" }, { "name": "pocketmine/bedrock-protocol", @@ -3442,7 +3442,8 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "pocketmine/bedrock-block-upgrade-schema": 20 + "pocketmine/bedrock-block-upgrade-schema": 20, + "pocketmine/bedrock-data": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/src/data/bedrock/LegacyBlockIdToStringIdMap.php b/src/data/bedrock/LegacyBlockIdToStringIdMap.php index 5c52fa9728..1165cf9e05 100644 --- a/src/data/bedrock/LegacyBlockIdToStringIdMap.php +++ b/src/data/bedrock/LegacyBlockIdToStringIdMap.php @@ -30,6 +30,6 @@ final class LegacyBlockIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ use SingletonTrait; public function __construct(){ - parent::__construct(Path::join(\pocketmine\BEDROCK_DATA_PATH, 'block_id_map.json')); + parent::__construct(Path::join(\pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'block_legacy_id_map.json')); } } From cb97f37d131e062b01c0058744a28cefe9878a9f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:26:38 +0100 Subject: [PATCH 0083/1858] First look at modern-spec serializer/deserializer for items this is not yet used by anything --- src/data/bedrock/BlockItemIdMap.php | 63 ++ src/data/bedrock/item/ItemDeserializer.php | 703 ++++++++++++++++++ src/data/bedrock/item/ItemSerializer.php | 567 ++++++++++++++ src/data/bedrock/item/ItemTypeIds.php | 409 ++++++++++ src/data/bedrock/item/SavedItemData.php | 108 +++ src/item/VanillaItems.php | 18 + .../item/ItemSerializerDeserializerTest.php | 66 ++ 7 files changed, 1934 insertions(+) create mode 100644 src/data/bedrock/BlockItemIdMap.php create mode 100644 src/data/bedrock/item/ItemDeserializer.php create mode 100644 src/data/bedrock/item/ItemSerializer.php create mode 100644 src/data/bedrock/item/ItemTypeIds.php create mode 100644 src/data/bedrock/item/SavedItemData.php create mode 100644 tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php diff --git a/src/data/bedrock/BlockItemIdMap.php b/src/data/bedrock/BlockItemIdMap.php new file mode 100644 index 0000000000..dd8fb8bb7a --- /dev/null +++ b/src/data/bedrock/BlockItemIdMap.php @@ -0,0 +1,63 @@ + $blockToItemId + */ + public function __construct(private array $blockToItemId){} + + public function lookupItemId(string $blockId) : ?string{ + return $this->blockToItemId[$blockId] ?? null; + } + + public function lookupBlockId(string $itemId) : ?string{ + //we don't need this for any functionality, so we're not concerned about performance here + //however, it might be nice to have for debugging + $blockId = array_search($itemId, $this->blockToItemId, true); + return $blockId !== false ? $blockId : null; + } +} \ No newline at end of file diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php new file mode 100644 index 0000000000..6ecedd614d --- /dev/null +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -0,0 +1,703 @@ + + */ + private array $deserializers = []; + + public function __construct(){ + $this->registerDeserializers(); + } + + /** + * @phpstan-param \Closure(Data) : Item $deserializer + */ + public function map(string $id, \Closure $deserializer) : void{ + $this->deserializers[$id] = $deserializer; + } + + public function deserialize(Data $data) : Item{ + if(($blockData = $data->getBlock()) !== null){ + //TODO: this is rough duct tape; we need a better way to deal with this + try{ + $block = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockData); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Failed to deserialize item data: " . $e->getMessage(), 0, $e); + } + + //TODO: worth caching this or not? + return BlockFactory::getInstance()->fromFullBlock($block)->asItem(); + } + $id = $data->getName(); + if(!isset($this->deserializers[$id])){ + throw new SavedDataLoadingException("No deserializer found for ID $id"); + } + + return ($this->deserializers[$id])($data); + } + + private function registerDeserializers() : void{ + $this->map(Ids::ACACIA_BOAT, fn() => Items::ACACIA_BOAT()); + $this->map(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()->asItem()); + $this->map(Ids::ACACIA_SIGN, fn() => Blocks::ACACIA_SIGN()->asItem()); + //TODO: minecraft:agent_spawn_egg + //TODO: minecraft:allay_spawn_egg + //TODO: minecraft:amethyst_shard + $this->map(Ids::APPLE, fn() => Items::APPLE()); + //TODO: minecraft:armor_stand + $this->map(Ids::ARROW, function(Data $data) : Item{ + if($data->getMeta() === 0){ + return Items::ARROW(); + } + throw new SavedDataLoadingException("Tipped arrows are not implemented yet"); + }); + //TODO: minecraft:axolotl_bucket + //TODO: minecraft:axolotl_spawn_egg + $this->map(Ids::BAKED_POTATO, fn() => Items::BAKED_POTATO()); + //TODO: minecraft:balloon + $this->map(Ids::BANNER, function(Data $data) : Item{ + $meta = $data->getMeta(); + $color = DyeColorIdMap::getInstance()->fromInvertedId($meta); + if($color === null){ + throw new SavedDataLoadingException("Unknown banner meta $meta"); + } + return Items::BANNER()->setColor($color); + }); + //TODO: minecraft:banner_pattern + //TODO: minecraft:bat_spawn_egg + $this->map(Ids::BED, function(Data $data) : Item{ + $meta = $data->getMeta(); + $color = DyeColorIdMap::getInstance()->fromId($meta); + if($color === null){ + throw new SavedDataLoadingException("Unknown bed meta $meta"); + } + return Blocks::BED()->setColor($color)->asItem(); + }); + //TODO: minecraft:bee_spawn_egg + $this->map(Ids::BEEF, fn() => Items::RAW_BEEF()); + $this->map(Ids::BEETROOT, fn() => Items::BEETROOT()); + $this->map(Ids::BEETROOT_SEEDS, fn() => Items::BEETROOT_SEEDS()); + $this->map(Ids::BEETROOT_SOUP, fn() => Items::BEETROOT_SOUP()); + $this->map(Ids::BIRCH_BOAT, fn() => Items::BIRCH_BOAT()); + $this->map(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()->asItem()); + $this->map(Ids::BIRCH_SIGN, fn() => Blocks::BIRCH_SIGN()->asItem()); + $this->map(Ids::BLACK_DYE, fn() => Items::BLACK_DYE()); + $this->map(Ids::BLAZE_POWDER, fn() => Items::BLAZE_POWDER()); + $this->map(Ids::BLAZE_ROD, fn() => Items::BLAZE_ROD()); + //TODO: minecraft:blaze_spawn_egg + $this->map(Ids::BLEACH, fn() => Items::BLEACH()); + $this->map(Ids::BLUE_DYE, fn() => Items::BLUE_DYE()); + $this->map(Ids::BOAT, function(Data $data) : Item{ + try{ + $treeType = TreeType::fromMagicNumber($data->getMeta()); + }catch(\InvalidArgumentException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + return match($treeType->id()){ + TreeType::OAK()->id() => Items::OAK_BOAT(), + TreeType::SPRUCE()->id() => Items::SPRUCE_BOAT(), + TreeType::BIRCH()->id() => Items::BIRCH_BOAT(), + TreeType::JUNGLE()->id() => Items::JUNGLE_BOAT(), + TreeType::ACACIA()->id() => Items::ACACIA_BOAT(), + TreeType::DARK_OAK()->id() => Items::DARK_OAK_BOAT(), + default => throw new AssumptionFailedError("Unexpected tree type " . $treeType->name()) + }; + }); + $this->map(Ids::BONE, fn() => Items::BONE()); + $this->map(Ids::BONE_MEAL, fn() => Items::BONE_MEAL()); + $this->map(Ids::BOOK, fn() => Items::BOOK()); + //TODO: minecraft:bordure_indented_banner_pattern + $this->map(Ids::BOW, fn() => Items::BOW()); + $this->map(Ids::BOWL, fn() => Items::BOWL()); + $this->map(Ids::BREAD, fn() => Items::BREAD()); + $this->map(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()->asItem()); + $this->map(Ids::BRICK, fn() => Items::BRICK()); + $this->map(Ids::BROWN_DYE, fn() => Items::BROWN_DYE()); + $this->map(Ids::BUCKET, fn() => Items::BUCKET()); + $this->map(Ids::CAKE, fn() => Blocks::CAKE()->asItem()); + //TODO: minecraft:camera + //TODO: minecraft:campfire + $this->map(Ids::CARROT, fn() => Items::CARROT()); + //TODO: minecraft:carrot_on_a_stick + //TODO: minecraft:cat_spawn_egg + //TODO: minecraft:cauldron + //TODO: minecraft:cave_spider_spawn_egg + //TODO: minecraft:chain + $this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS()); + $this->map(Ids::CHAINMAIL_CHESTPLATE, fn() => Items::CHAINMAIL_CHESTPLATE()); + $this->map(Ids::CHAINMAIL_HELMET, fn() => Items::CHAINMAIL_HELMET()); + $this->map(Ids::CHAINMAIL_LEGGINGS, fn() => Items::CHAINMAIL_LEGGINGS()); + $this->map(Ids::CHARCOAL, fn() => Items::CHARCOAL()); + //TODO: minecraft:chest_minecart + $this->map(Ids::CHICKEN, fn() => Items::RAW_CHICKEN()); + //TODO: minecraft:chicken_spawn_egg + $this->map(Ids::CHORUS_FRUIT, fn() => Items::CHORUS_FRUIT()); + $this->map(Ids::CLAY_BALL, fn() => Items::CLAY()); + $this->map(Ids::CLOCK, fn() => Items::CLOCK()); + $this->map(Ids::COAL, fn() => Items::COAL()); + $this->map(Ids::COCOA_BEANS, fn() => Items::COCOA_BEANS()); + $this->map(Ids::COD, fn() => Items::RAW_FISH()); + //TODO: minecraft:cod_bucket + //TODO: minecraft:cod_spawn_egg + //TODO: minecraft:command_block_minecart + $this->map(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()->asItem()); + $this->map(Ids::COMPASS, fn() => Items::COMPASS()); + $this->map(Ids::COMPOUND, fn(Data $data) => match($data->getMeta()){ + CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), + CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(), + CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(), + CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(), + CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(), + CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(), + CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(), + CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(), + CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(), + CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(), + CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(), + CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(), + CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(), + CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(), + CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(), + CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(), + CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(), + CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(), + CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(), + CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(), + CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(), + CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(), + CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(), + CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(), + CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(), + CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(), + CompoundTypeIds::WATER => Items::CHEMICAL_WATER(), + CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(), + CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(), + CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(), + CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(), + CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(), + CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(), + CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(), + CompoundTypeIds::INK => Items::CHEMICAL_INK(), + CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), + CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), + CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), + default => throw new SavedDataLoadingException("Unknown chemical meta " . $data->getMeta()) + }); + $this->map(Ids::COOKED_BEEF, fn() => Items::STEAK()); + $this->map(Ids::COOKED_CHICKEN, fn() => Items::COOKED_CHICKEN()); + $this->map(Ids::COOKED_COD, fn() => Items::COOKED_FISH()); + $this->map(Ids::COOKED_MUTTON, fn() => Items::COOKED_MUTTON()); + $this->map(Ids::COOKED_PORKCHOP, fn() => Items::COOKED_PORKCHOP()); + $this->map(Ids::COOKED_RABBIT, fn() => Items::COOKED_RABBIT()); + $this->map(Ids::COOKED_SALMON, fn() => Items::COOKED_SALMON()); + $this->map(Ids::COOKIE, fn() => Items::COOKIE()); + //TODO: minecraft:copper_ingot + //TODO: minecraft:cow_spawn_egg + //TODO: minecraft:creeper_banner_pattern + //TODO: minecraft:creeper_spawn_egg + //TODO: minecraft:crimson_door + //TODO: minecraft:crimson_sign + //TODO: minecraft:crossbow + $this->map(Ids::CYAN_DYE, fn() => Items::CYAN_DYE()); + $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); + $this->map(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()->asItem()); + $this->map(Ids::DARK_OAK_SIGN, fn() => Blocks::DARK_OAK_SIGN()->asItem()); + $this->map(Ids::DIAMOND, fn() => Items::DIAMOND()); + $this->map(Ids::DIAMOND_AXE, fn() => Items::DIAMOND_AXE()); + $this->map(Ids::DIAMOND_BOOTS, fn() => Items::DIAMOND_BOOTS()); + $this->map(Ids::DIAMOND_CHESTPLATE, fn() => Items::DIAMOND_CHESTPLATE()); + $this->map(Ids::DIAMOND_HELMET, fn() => Items::DIAMOND_HELMET()); + $this->map(Ids::DIAMOND_HOE, fn() => Items::DIAMOND_HOE()); + //TODO: minecraft:diamond_horse_armor + $this->map(Ids::DIAMOND_LEGGINGS, fn() => Items::DIAMOND_LEGGINGS()); + $this->map(Ids::DIAMOND_PICKAXE, fn() => Items::DIAMOND_PICKAXE()); + $this->map(Ids::DIAMOND_SHOVEL, fn() => Items::DIAMOND_SHOVEL()); + $this->map(Ids::DIAMOND_SWORD, fn() => Items::DIAMOND_SWORD()); + //TODO: minecraft:dolphin_spawn_egg + //TODO: minecraft:donkey_spawn_egg + $this->map(Ids::DRAGON_BREATH, fn() => Items::DRAGON_BREATH()); + $this->map(Ids::DRIED_KELP, fn() => Items::DRIED_KELP()); + //TODO: minecraft:drowned_spawn_egg + $this->map(Ids::DYE, function(Data $data) : Item{ + $meta = $data->getMeta(); + $item = match($meta) { + 0 => Items::INK_SAC(), + 3 => Items::COCOA_BEANS(), + 4 => Items::LAPIS_LAZULI(), + 15 => Items::BONE_MEAL(), + 16 => Items::BLACK_DYE(), + 17 => Items::BROWN_DYE(), + 18 => Items::BLUE_DYE(), + 19 => Items::WHITE_DYE(), + default => null + }; + if($item !== null){ + return $item; + } + $dyeColor = DyeColorIdMap::getInstance()->fromInvertedId($meta); + if($dyeColor === null){ + throw new SavedDataLoadingException("Unknown dye meta $meta"); + } + return match($dyeColor->id()){ + DyeColor::CYAN()->id() => Items::CYAN_DYE(), + DyeColor::GRAY()->id() => Items::GRAY_DYE(), + DyeColor::GREEN()->id() => Items::GREEN_DYE(), + DyeColor::LIGHT_BLUE()->id() => Items::LIGHT_BLUE_DYE(), + DyeColor::LIGHT_GRAY()->id() => Items::LIGHT_GRAY_DYE(), + DyeColor::LIME()->id() => Items::LIME_DYE(), + DyeColor::MAGENTA()->id() => Items::MAGENTA_DYE(), + DyeColor::ORANGE()->id() => Items::ORANGE_DYE(), + DyeColor::PINK()->id() => Items::PINK_DYE(), + DyeColor::PURPLE()->id() => Items::PURPLE_DYE(), + DyeColor::RED()->id() => Items::RED_DYE(), + DyeColor::YELLOW()->id() => Items::YELLOW_DYE(), + default => throw new AssumptionFailedError("Unhandled dye color " . $dyeColor->name()) + }; + }); + $this->map(Ids::EGG, fn() => Items::EGG()); + //TODO: minecraft:elder_guardian_spawn_egg + //TODO: minecraft:elytra + $this->map(Ids::EMERALD, fn() => Items::EMERALD()); + //TODO: minecraft:empty_map + //TODO: minecraft:enchanted_book + $this->map(Ids::ENCHANTED_GOLDEN_APPLE, fn() => Items::ENCHANTED_GOLDEN_APPLE()); + //TODO: minecraft:end_crystal + //TODO: minecraft:ender_eye + $this->map(Ids::ENDER_PEARL, fn() => Items::ENDER_PEARL()); + //TODO: minecraft:enderman_spawn_egg + //TODO: minecraft:endermite_spawn_egg + //TODO: minecraft:evoker_spawn_egg + $this->map(Ids::EXPERIENCE_BOTTLE, fn() => Items::EXPERIENCE_BOTTLE()); + $this->map(Ids::FEATHER, fn() => Items::FEATHER()); + $this->map(Ids::FERMENTED_SPIDER_EYE, fn() => Items::FERMENTED_SPIDER_EYE()); + //TODO: minecraft:field_masoned_banner_pattern + //TODO: minecraft:filled_map + //TODO: minecraft:fire_charge + //TODO: minecraft:firefly_spawn_egg + //TODO: minecraft:firework_rocket + //TODO: minecraft:firework_star + $this->map(Ids::FISHING_ROD, fn() => Items::FISHING_ROD()); + $this->map(Ids::FLINT, fn() => Items::FLINT()); + $this->map(Ids::FLINT_AND_STEEL, fn() => Items::FLINT_AND_STEEL()); + //TODO: minecraft:flower_banner_pattern + $this->map(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()->asItem()); + //TODO: minecraft:fox_spawn_egg + $this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->asItem()); + //TODO: minecraft:frog_spawn_egg + //TODO: minecraft:ghast_spawn_egg + $this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR()); + $this->map(Ids::GLASS_BOTTLE, fn() => Items::GLASS_BOTTLE()); + $this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON()); + //TODO: minecraft:globe_banner_pattern + //TODO: minecraft:glow_berries + //TODO: minecraft:glow_frame + //TODO: minecraft:glow_ink_sac + //TODO: minecraft:glow_squid_spawn_egg + //TODO: minecraft:glow_stick + $this->map(Ids::GLOWSTONE_DUST, fn() => Items::GLOWSTONE_DUST()); + //TODO: minecraft:goat_horn + //TODO: minecraft:goat_spawn_egg + $this->map(Ids::GOLD_INGOT, fn() => Items::GOLD_INGOT()); + $this->map(Ids::GOLD_NUGGET, fn() => Items::GOLD_NUGGET()); + $this->map(Ids::GOLDEN_APPLE, fn() => Items::GOLDEN_APPLE()); + $this->map(Ids::GOLDEN_AXE, fn() => Items::GOLDEN_AXE()); + $this->map(Ids::GOLDEN_BOOTS, fn() => Items::GOLDEN_BOOTS()); + $this->map(Ids::GOLDEN_CARROT, fn() => Items::GOLDEN_CARROT()); + $this->map(Ids::GOLDEN_CHESTPLATE, fn() => Items::GOLDEN_CHESTPLATE()); + $this->map(Ids::GOLDEN_HELMET, fn() => Items::GOLDEN_HELMET()); + $this->map(Ids::GOLDEN_HOE, fn() => Items::GOLDEN_HOE()); + //TODO: minecraft:golden_horse_armor + $this->map(Ids::GOLDEN_LEGGINGS, fn() => Items::GOLDEN_LEGGINGS()); + $this->map(Ids::GOLDEN_PICKAXE, fn() => Items::GOLDEN_PICKAXE()); + $this->map(Ids::GOLDEN_SHOVEL, fn() => Items::GOLDEN_SHOVEL()); + $this->map(Ids::GOLDEN_SWORD, fn() => Items::GOLDEN_SWORD()); + $this->map(Ids::GRAY_DYE, fn() => Items::GRAY_DYE()); + $this->map(Ids::GREEN_DYE, fn() => Items::GREEN_DYE()); + //TODO: minecraft:guardian_spawn_egg + $this->map(Ids::GUNPOWDER, fn() => Items::GUNPOWDER()); + $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); + //TODO: minecraft:hoglin_spawn_egg + //TODO: minecraft:honey_bottle + //TODO: minecraft:honeycomb + $this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem()); + //TODO: minecraft:hopper_minecart + //TODO: minecraft:horse_spawn_egg + //TODO: minecraft:husk_spawn_egg + //TODO: minecraft:ice_bomb + $this->map(Ids::INK_SAC, fn() => Items::INK_SAC()); + $this->map(Ids::IRON_AXE, fn() => Items::IRON_AXE()); + $this->map(Ids::IRON_BOOTS, fn() => Items::IRON_BOOTS()); + $this->map(Ids::IRON_CHESTPLATE, fn() => Items::IRON_CHESTPLATE()); + $this->map(Ids::IRON_DOOR, fn() => Blocks::IRON_DOOR()->asItem()); + $this->map(Ids::IRON_HELMET, fn() => Items::IRON_HELMET()); + $this->map(Ids::IRON_HOE, fn() => Items::IRON_HOE()); + //TODO: minecraft:iron_horse_armor + $this->map(Ids::IRON_INGOT, fn() => Items::IRON_INGOT()); + $this->map(Ids::IRON_LEGGINGS, fn() => Items::IRON_LEGGINGS()); + $this->map(Ids::IRON_NUGGET, fn() => Items::IRON_NUGGET()); + $this->map(Ids::IRON_PICKAXE, fn() => Items::IRON_PICKAXE()); + $this->map(Ids::IRON_SHOVEL, fn() => Items::IRON_SHOVEL()); + $this->map(Ids::IRON_SWORD, fn() => Items::IRON_SWORD()); + $this->map(Ids::JUNGLE_BOAT, fn() => Items::JUNGLE_BOAT()); + $this->map(Ids::JUNGLE_DOOR, fn() => Blocks::JUNGLE_DOOR()->asItem()); + $this->map(Ids::JUNGLE_SIGN, fn() => Blocks::JUNGLE_SIGN()->asItem()); + //TODO: minecraft:kelp + $this->map(Ids::LAPIS_LAZULI, fn() => Items::LAPIS_LAZULI()); + $this->map(Ids::LAVA_BUCKET, fn() => Items::LAVA_BUCKET()); + //TODO: minecraft:lead + $this->map(Ids::LEATHER, fn() => Items::LEATHER()); + $this->map(Ids::LEATHER_BOOTS, fn() => Items::LEATHER_BOOTS()); + $this->map(Ids::LEATHER_CHESTPLATE, fn() => Items::LEATHER_TUNIC()); + $this->map(Ids::LEATHER_HELMET, fn() => Items::LEATHER_CAP()); + //TODO: minecraft:leather_horse_armor + $this->map(Ids::LEATHER_LEGGINGS, fn() => Items::LEATHER_PANTS()); + $this->map(Ids::LIGHT_BLUE_DYE, fn() => Items::LIGHT_BLUE_DYE()); + $this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::LIGHT_GRAY_DYE()); + $this->map(Ids::LIME_DYE, fn() => Items::LIME_DYE()); + //TODO: minecraft:lingering_potion + //TODO: minecraft:llama_spawn_egg + //TODO: minecraft:lodestone_compass + $this->map(Ids::MAGENTA_DYE, fn() => Items::MAGENTA_DYE()); + $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); + //TODO: minecraft:magma_cube_spawn_egg + //TODO: minecraft:medicine + $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); + $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); + $this->map(Ids::MILK_BUCKET, fn() => Items::MILK_BUCKET()); + $this->map(Ids::MINECART, fn() => Items::MINECART()); + //TODO: minecraft:mojang_banner_pattern + //TODO: minecraft:mooshroom_spawn_egg + //TODO: minecraft:mule_spawn_egg + $this->map(Ids::MUSHROOM_STEW, fn() => Items::MUSHROOM_STEW()); + $this->map(Ids::MUSIC_DISC_11, fn() => Items::RECORD_11()); + $this->map(Ids::MUSIC_DISC_13, fn() => Items::RECORD_13()); + $this->map(Ids::MUSIC_DISC_BLOCKS, fn() => Items::RECORD_BLOCKS()); + $this->map(Ids::MUSIC_DISC_CAT, fn() => Items::RECORD_CAT()); + $this->map(Ids::MUSIC_DISC_CHIRP, fn() => Items::RECORD_CHIRP()); + $this->map(Ids::MUSIC_DISC_FAR, fn() => Items::RECORD_FAR()); + $this->map(Ids::MUSIC_DISC_MALL, fn() => Items::RECORD_MALL()); + $this->map(Ids::MUSIC_DISC_MELLOHI, fn() => Items::RECORD_MELLOHI()); + //TODO: minecraft:music_disc_otherside + //TODO: minecraft:music_disc_pigstep + $this->map(Ids::MUSIC_DISC_STAL, fn() => Items::RECORD_STAL()); + $this->map(Ids::MUSIC_DISC_STRAD, fn() => Items::RECORD_STRAD()); + $this->map(Ids::MUSIC_DISC_WAIT, fn() => Items::RECORD_WAIT()); + $this->map(Ids::MUSIC_DISC_WARD, fn() => Items::RECORD_WARD()); + $this->map(Ids::MUTTON, fn() => Items::RAW_MUTTON()); + //TODO: minecraft:name_tag + $this->map(Ids::NAUTILUS_SHELL, fn() => Items::NAUTILUS_SHELL()); + //TODO: minecraft:nether_sprouts + $this->map(Ids::NETHER_STAR, fn() => Items::NETHER_STAR()); + $this->map(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()->asItem()); + $this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK()); + //TODO: minecraft:netherite_axe + //TODO: minecraft:netherite_boots + //TODO: minecraft:netherite_chestplate + //TODO: minecraft:netherite_helmet + //TODO: minecraft:netherite_hoe + //TODO: minecraft:netherite_ingot + //TODO: minecraft:netherite_leggings + //TODO: minecraft:netherite_pickaxe + //TODO: minecraft:netherite_scrap + //TODO: minecraft:netherite_shovel + //TODO: minecraft:netherite_sword + //TODO: minecraft:npc_spawn_egg + $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); + $this->map(Ids::OAK_SIGN, fn() => Blocks::OAK_SIGN()->asItem()); + //TODO: minecraft:ocelot_spawn_egg + $this->map(Ids::ORANGE_DYE, fn() => Items::ORANGE_DYE()); + $this->map(Ids::PAINTING, fn() => Items::PAINTING()); + //TODO: minecraft:panda_spawn_egg + $this->map(Ids::PAPER, fn() => Items::PAPER()); + //TODO: minecraft:parrot_spawn_egg + //TODO: minecraft:phantom_membrane + //TODO: minecraft:phantom_spawn_egg + //TODO: minecraft:pig_spawn_egg + //TODO: minecraft:piglin_banner_pattern + //TODO: minecraft:piglin_brute_spawn_egg + //TODO: minecraft:piglin_spawn_egg + //TODO: minecraft:pillager_spawn_egg + $this->map(Ids::PINK_DYE, fn() => Items::PINK_DYE()); + $this->map(Ids::POISONOUS_POTATO, fn() => Items::POISONOUS_POTATO()); + //TODO: minecraft:polar_bear_spawn_egg + $this->map(Ids::POPPED_CHORUS_FRUIT, fn() => Items::POPPED_CHORUS_FRUIT()); + $this->map(Ids::PORKCHOP, fn() => Items::RAW_PORKCHOP()); + $this->map(Ids::POTATO, fn() => Items::POTATO()); + $this->map(Ids::POTION, function(Data $data) : Item{ + $meta = $data->getMeta(); + $potionType = PotionTypeIdMap::getInstance()->fromId($meta); + if($potionType === null){ + throw new SavedDataLoadingException("Unknown potion type ID $meta"); + } + return match($potionType->id()){ + PotionType::WATER()->id() => Items::WATER_POTION(), + PotionType::MUNDANE()->id() => Items::MUNDANE_POTION(), + PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_POTION(), + PotionType::THICK()->id() => Items::THICK_POTION(), + PotionType::AWKWARD()->id() => Items::AWKWARD_POTION(), + PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_POTION(), + PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_POTION(), + PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_POTION(), + PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_POTION(), + PotionType::LEAPING()->id() => Items::LEAPING_POTION(), + PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_POTION(), + PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_POTION(), + PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_POTION(), + PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_POTION(), + PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_POTION(), + PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_POTION(), + PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_POTION(), + PotionType::SLOWNESS()->id() => Items::SLOWNESS_POTION(), + PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_POTION(), + PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_POTION(), + PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_POTION(), + PotionType::HEALING()->id() => Items::HEALING_POTION(), + PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_POTION(), + PotionType::HARMING()->id() => Items::HARMING_POTION(), + PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_POTION(), + PotionType::POISON()->id() => Items::POISON_POTION(), + PotionType::LONG_POISON()->id() => Items::LONG_POISON_POTION(), + PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_POTION(), + PotionType::REGENERATION()->id() => Items::REGENERATION_POTION(), + PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_POTION(), + PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_POTION(), + PotionType::STRENGTH()->id() => Items::STRENGTH_POTION(), + PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_POTION(), + PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_POTION(), + PotionType::WEAKNESS()->id() => Items::WEAKNESS_POTION(), + PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_POTION(), + PotionType::WITHER()->id() => Items::WITHER_POTION(), + PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_POTION(), + PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_POTION(), + PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_POTION(), + PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_POTION(), + PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_POTION(), + default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName()) + }; + }); + //TODO: minecraft:powder_snow_bucket + $this->map(Ids::PRISMARINE_CRYSTALS, fn() => Items::PRISMARINE_CRYSTALS()); + $this->map(Ids::PRISMARINE_SHARD, fn() => Items::PRISMARINE_SHARD()); + $this->map(Ids::PUFFERFISH, fn() => Items::PUFFERFISH()); + //TODO: minecraft:pufferfish_bucket + //TODO: minecraft:pufferfish_spawn_egg + $this->map(Ids::PUMPKIN_PIE, fn() => Items::PUMPKIN_PIE()); + $this->map(Ids::PUMPKIN_SEEDS, fn() => Items::PUMPKIN_SEEDS()); + $this->map(Ids::PURPLE_DYE, fn() => Items::PURPLE_DYE()); + $this->map(Ids::QUARTZ, fn() => Items::NETHER_QUARTZ()); + $this->map(Ids::RABBIT, fn() => Items::RAW_RABBIT()); + $this->map(Ids::RABBIT_FOOT, fn() => Items::RABBIT_FOOT()); + $this->map(Ids::RABBIT_HIDE, fn() => Items::RABBIT_HIDE()); + //TODO: minecraft:rabbit_spawn_egg + $this->map(Ids::RABBIT_STEW, fn() => Items::RABBIT_STEW()); + //TODO: minecraft:rapid_fertilizer + //TODO: minecraft:ravager_spawn_egg + //TODO: minecraft:raw_copper + //TODO: minecraft:raw_gold + //TODO: minecraft:raw_iron + $this->map(Ids::RED_DYE, fn() => Items::RED_DYE()); + $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); + $this->map(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()->asItem()); + $this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH()); + //TODO: minecraft:saddle + $this->map(Ids::SALMON, fn() => Items::RAW_SALMON()); + //TODO: minecraft:salmon_bucket + //TODO: minecraft:salmon_spawn_egg + $this->map(Ids::SCUTE, fn() => Items::SCUTE()); + $this->map(Ids::SHEARS, fn() => Items::SHEARS()); + //TODO: minecraft:sheep_spawn_egg + //TODO: minecraft:shield + $this->map(Ids::SHULKER_SHELL, fn() => Items::SHULKER_SHELL()); + //TODO: minecraft:shulker_spawn_egg + //TODO: minecraft:silverfish_spawn_egg + //TODO: minecraft:skeleton_horse_spawn_egg + //TODO: minecraft:skeleton_spawn_egg + $this->map(Ids::SKULL, function(Data $data) : Item{ + $meta = $data->getMeta(); + try{ + $skullType = SkullType::fromMagicNumber($meta); + }catch(\InvalidArgumentException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + return match($skullType->id()) { + SkullType::SKELETON()->id() => Items::SKELETON_SKULL(), + SkullType::WITHER_SKELETON()->id() => Items::WITHER_SKELETON_SKULL(), + SkullType::ZOMBIE()->id() => Items::ZOMBIE_HEAD(), + SkullType::CREEPER()->id() => Items::CREEPER_HEAD(), + SkullType::PLAYER()->id() => Items::PLAYER_HEAD(), + SkullType::DRAGON()->id() => Items::DRAGON_HEAD(), + default => throw new SavedDataLoadingException("Unexpected skull type " . $skullType->getDisplayName()) + }; + }); + //TODO: minecraft:skull_banner_pattern + $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); + //TODO: minecraft:slime_spawn_egg + $this->map(Ids::SNOWBALL, fn() => Items::SNOWBALL()); + //TODO: minecraft:soul_campfire + //TODO: minecraft:sparkler + $this->map(Ids::SPAWN_EGG, fn(Data $data) => match($data->getMeta()){ + EntityLegacyIds::ZOMBIE => Items::ZOMBIE_SPAWN_EGG(), + EntityLegacyIds::SQUID => Items::SQUID_SPAWN_EGG(), + EntityLegacyIds::VILLAGER => Items::VILLAGER_SPAWN_EGG(), + default => throw new SavedDataLoadingException("Unhandled spawn egg meta " . $data->getMeta()) + }); + $this->map(Ids::SPIDER_EYE, fn() => Items::SPIDER_EYE()); + //TODO: minecraft:spider_spawn_egg + $this->map(Ids::SPLASH_POTION, function(Data $data) : Item{ + $meta = $data->getMeta(); + $potionType = PotionTypeIdMap::getInstance()->fromId($meta); + if($potionType === null){ + throw new SavedDataLoadingException("Unknown potion type ID $meta"); + } + return match($potionType->id()){ + PotionType::WATER()->id() => Items::WATER_SPLASH_POTION(), + PotionType::MUNDANE()->id() => Items::MUNDANE_SPLASH_POTION(), + PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_SPLASH_POTION(), + PotionType::THICK()->id() => Items::THICK_SPLASH_POTION(), + PotionType::AWKWARD()->id() => Items::AWKWARD_SPLASH_POTION(), + PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_SPLASH_POTION(), + PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_SPLASH_POTION(), + PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_SPLASH_POTION(), + PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_SPLASH_POTION(), + PotionType::LEAPING()->id() => Items::LEAPING_SPLASH_POTION(), + PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_SPLASH_POTION(), + PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_SPLASH_POTION(), + PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_SPLASH_POTION(), + PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(), + PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_SPLASH_POTION(), + PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_SPLASH_POTION(), + PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_SPLASH_POTION(), + PotionType::SLOWNESS()->id() => Items::SLOWNESS_SPLASH_POTION(), + PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_SPLASH_POTION(), + PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_SPLASH_POTION(), + PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_SPLASH_POTION(), + PotionType::HEALING()->id() => Items::HEALING_SPLASH_POTION(), + PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_SPLASH_POTION(), + PotionType::HARMING()->id() => Items::HARMING_SPLASH_POTION(), + PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_SPLASH_POTION(), + PotionType::POISON()->id() => Items::POISON_SPLASH_POTION(), + PotionType::LONG_POISON()->id() => Items::LONG_POISON_SPLASH_POTION(), + PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_SPLASH_POTION(), + PotionType::REGENERATION()->id() => Items::REGENERATION_SPLASH_POTION(), + PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_SPLASH_POTION(), + PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_SPLASH_POTION(), + PotionType::STRENGTH()->id() => Items::STRENGTH_SPLASH_POTION(), + PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_SPLASH_POTION(), + PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_SPLASH_POTION(), + PotionType::WEAKNESS()->id() => Items::WEAKNESS_SPLASH_POTION(), + PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_SPLASH_POTION(), + PotionType::WITHER()->id() => Items::WITHER_SPLASH_POTION(), + PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_SPLASH_POTION(), + PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_SPLASH_POTION(), + PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), + PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_SPLASH_POTION(), + PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_SPLASH_POTION(), + default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName()) + }; + }); + $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); + $this->map(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()->asItem()); + $this->map(Ids::SPRUCE_SIGN, fn() => Blocks::SPRUCE_SIGN()->asItem()); + //TODO: minecraft:spyglass + $this->map(Ids::SQUID_SPAWN_EGG, fn() => Items::SQUID_SPAWN_EGG()); + $this->map(Ids::STICK, fn() => Items::STICK()); + $this->map(Ids::STONE_AXE, fn() => Items::STONE_AXE()); + $this->map(Ids::STONE_HOE, fn() => Items::STONE_HOE()); + $this->map(Ids::STONE_PICKAXE, fn() => Items::STONE_PICKAXE()); + $this->map(Ids::STONE_SHOVEL, fn() => Items::STONE_SHOVEL()); + $this->map(Ids::STONE_SWORD, fn() => Items::STONE_SWORD()); + //TODO: minecraft:stray_spawn_egg + //TODO: minecraft:strider_spawn_egg + $this->map(Ids::STRING, fn() => Items::STRING()); + $this->map(Ids::SUGAR, fn() => Items::SUGAR()); + $this->map(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()->asItem()); + //TODO: minecraft:suspicious_stew + $this->map(Ids::SWEET_BERRIES, fn() => Items::SWEET_BERRIES()); + //TODO: minecraft:tadpole_bucket + //TODO: minecraft:tadpole_spawn_egg + //TODO: minecraft:tnt_minecart + $this->map(Ids::TOTEM_OF_UNDYING, fn() => Items::TOTEM()); + //TODO: minecraft:trident + $this->map(Ids::TROPICAL_FISH, fn() => Items::CLOWNFISH()); + //TODO: minecraft:tropical_fish_bucket + //TODO: minecraft:tropical_fish_spawn_egg + //TODO: minecraft:turtle_helmet + //TODO: minecraft:turtle_spawn_egg + //TODO: minecraft:vex_spawn_egg + $this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG()); + //TODO: minecraft:vindicator_spawn_egg + //TODO: minecraft:wandering_trader_spawn_egg + //TODO: minecraft:warped_door + //TODO: minecraft:warped_fungus_on_a_stick + //TODO: minecraft:warped_sign + $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); + $this->map(Ids::WHEAT, fn() => Items::WHEAT()); + $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); + $this->map(Ids::WHITE_DYE, fn() => Items::WHITE_DYE()); + //TODO: minecraft:witch_spawn_egg + //TODO: minecraft:wither_skeleton_spawn_egg + //TODO: minecraft:wolf_spawn_egg + $this->map(Ids::WOODEN_AXE, fn() => Items::WOODEN_AXE()); + $this->map(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()->asItem()); + $this->map(Ids::WOODEN_HOE, fn() => Items::WOODEN_HOE()); + $this->map(Ids::WOODEN_PICKAXE, fn() => Items::WOODEN_PICKAXE()); + $this->map(Ids::WOODEN_SHOVEL, fn() => Items::WOODEN_SHOVEL()); + $this->map(Ids::WOODEN_SWORD, fn() => Items::WOODEN_SWORD()); + $this->map(Ids::WRITABLE_BOOK, fn() => Items::WRITABLE_BOOK()); + $this->map(Ids::WRITTEN_BOOK, fn() => Items::WRITTEN_BOOK()); + $this->map(Ids::YELLOW_DYE, fn() => Items::YELLOW_DYE()); + //TODO: minecraft:zoglin_spawn_egg + //TODO: minecraft:zombie_horse_spawn_egg + //TODO: minecraft:zombie_pigman_spawn_egg + $this->map(Ids::ZOMBIE_SPAWN_EGG, fn() => Items::ZOMBIE_SPAWN_EGG()); + //TODO: minecraft:zombie_villager_spawn_egg + } +} diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php new file mode 100644 index 0000000000..e8031f5d8e --- /dev/null +++ b/src/data/bedrock/item/ItemSerializer.php @@ -0,0 +1,567 @@ +> + */ + private array $serializers = []; + + /** + * @var \Closure[] + * @phpstan-var array> + */ + private array $blockItemSerializers = []; + + public function __construct(){ + $this->registerSerializers(); + } + + /** + * @phpstan-template TItemType of Item + * @phpstan-param TItemType $item + * @phpstan-param \Closure(TItemType) : Data $serializer + */ + public function map(Item $item, \Closure $serializer) : void{ + if($item->hasAnyDamageValue()){ + throw new \InvalidArgumentException("Cannot serialize a recipe wildcard"); + } + $index = ($item->getId() << 16) | $item->getMeta(); + if(isset($this->serializers[$index])){ + //TODO: REMOVE ME + throw new AssumptionFailedError("Registering the same item twice!"); + } + $this->serializers[$index][get_class($item)] = $serializer; + } + + /** + * @phpstan-param \Closure(ItemBlock) : Data $serializer + */ + public function mapBlock(Block $block, \Closure $serializer) : void{ + if(!$block->asItem() instanceof ItemBlock){ + throw new AssumptionFailedError("Mapped item must be an ItemBlock"); + } + $index = $block->getTypeId(); + if(isset($this->blockItemSerializers[$index])){ + throw new AssumptionFailedError("Registering the same item twice!"); + } + $this->blockItemSerializers[$index] = $serializer; + } + + /** + * @phpstan-template TItemType of Item + * @phpstan-param TItemType $item + */ + public function serialize(Item $item) : Data{ + if($item->isNull()){ + throw new \InvalidArgumentException("Cannot serialize a null itemstack"); + } + if($item instanceof ItemBlock){ + $block = $item->getBlock(); + $index = $block->getTypeId(); + $serializer = $this->blockItemSerializers[$index] ?? null; + + if($serializer !== null){ + $data = $serializer($item); + }else{ //assume that this is just a standard itemblock + $data = self::standardBlock($block); + } + }else{ + $index = ($item->getId() << 16) | ($item instanceof Durable ? 0 : $item->getMeta()); + + $locatedSerializer = $this->serializers[$index][get_class($item)] ?? null; + if($locatedSerializer === null){ + $parents = class_parents($item); + if($parents !== false){ + foreach($parents as $parent){ + if(isset($this->serializers[$index][$parent])){ + $locatedSerializer = $this->serializers[$index][$parent]; + break; + } + } + } + } + + if($locatedSerializer === null){ + //TODO: proper exceptions + throw new \LogicException("No serializer registered for " . get_class($item) . " " . $item->getName()); + } + + /** + * @var \Closure $serializer + * @phpstan-var \Closure(TItemType) : Data $serializer + */ + $serializer = $locatedSerializer; + + /** @var Data $data */ + $data = $serializer($item); + } + + return $data; + } + + private static function standardBlock(Block $block) : Data{ + $blockStateData = GlobalBlockStateHandlers::getSerializer()->serialize($block->getFullId()); + + $itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName()); + if($itemNameId === null){ + //TODO: this might end up being a hassle for custom blocks, since it'll force providing an item + //serializer for every custom block + //it would probably be better if we allow adding custom item <-> block ID mappings for this + throw new \LogicException("No blockitem serializer or blockitem ID mapping registered for block " . $blockStateData->getName()); + } + + return new Data($itemNameId, 0, $blockStateData); + } + + /** + * @phpstan-return \Closure(Item) : Data + */ + private static function standardBlockWrapper() : \Closure{ + return fn(Item $item) => self::standardBlock($item->getBlock()); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function id(string $id) : \Closure{ + return fn() => new Data($id); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function bed(DyeColor $color) : \Closure{ + $meta = DyeColorIdMap::getInstance()->toId($color); + return fn() => new Data(Ids::BED, $meta); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function skull(SkullType $skullType) : \Closure{ + $meta = $skullType->getMagicNumber(); + return fn() => new Data(Ids::SKULL, $meta); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function chemical(int $type) : \Closure{ + return fn() => new Data(Ids::COMPOUND, $type); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function potion(PotionType $type) : \Closure{ + $meta = PotionTypeIdMap::getInstance()->toId($type); + return fn() => new Data(Ids::POTION, $meta); + } + + /** + * @phpstan-return \Closure() : Data + */ + private static function splashPotion(PotionType $type) : \Closure{ + $meta = PotionTypeIdMap::getInstance()->toId($type); + return fn() => new Data(Ids::SPLASH_POTION, $meta); + } + + private function registerSerializers() : void{ + //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock + $this->map(Items::BAMBOO(), self::standardBlockWrapper()); + $this->map(Items::CORAL_FAN(), self::standardBlockWrapper()); + + $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); + $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); + $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); + $this->map(Items::APPLE(), self::id(Ids::APPLE)); + $this->map(Items::ARROW(), self::id(Ids::ARROW)); + $this->map(Items::AWKWARD_POTION(), self::potion(PotionType::AWKWARD())); + $this->map(Items::AWKWARD_SPLASH_POTION(), self::splashPotion(PotionType::AWKWARD())); + $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); + $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); + $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); + $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); + $this->map(Items::BIRCH_BOAT(), self::id(Ids::BIRCH_BOAT)); + $this->map(Items::BIRCH_SIGN(), self::id(Ids::BIRCH_SIGN)); + $this->map(Items::BLACK_BED(), self::bed(DyeColor::BLACK())); + $this->map(Items::BLACK_DYE(), self::id(Ids::BLACK_DYE)); + $this->map(Items::BLAZE_POWDER(), self::id(Ids::BLAZE_POWDER)); + $this->map(Items::BLAZE_ROD(), self::id(Ids::BLAZE_ROD)); + $this->map(Items::BLEACH(), self::id(Ids::BLEACH)); + $this->map(Items::BLUE_BED(), self::bed(DyeColor::BLUE())); + $this->map(Items::BLUE_DYE(), self::id(Ids::BLUE_DYE)); + $this->map(Items::BONE(), self::id(Ids::BONE)); + $this->map(Items::BONE_MEAL(), self::id(Ids::BONE_MEAL)); + $this->map(Items::BOOK(), self::id(Ids::BOOK)); + $this->map(Items::BOW(), self::id(Ids::BOW)); + $this->map(Items::BOWL(), self::id(Ids::BOWL)); + $this->map(Items::BREAD(), self::id(Ids::BREAD)); + $this->map(Items::BRICK(), self::id(Ids::BRICK)); + $this->map(Items::BROWN_BED(), self::bed(DyeColor::BROWN())); + $this->map(Items::BROWN_DYE(), self::id(Ids::BROWN_DYE)); + $this->map(Items::BUCKET(), self::id(Ids::BUCKET)); + $this->map(Items::CARROT(), self::id(Ids::CARROT)); + $this->map(Items::CHAINMAIL_BOOTS(), self::id(Ids::CHAINMAIL_BOOTS)); + $this->map(Items::CHAINMAIL_CHESTPLATE(), self::id(Ids::CHAINMAIL_CHESTPLATE)); + $this->map(Items::CHAINMAIL_HELMET(), self::id(Ids::CHAINMAIL_HELMET)); + $this->map(Items::CHAINMAIL_LEGGINGS(), self::id(Ids::CHAINMAIL_LEGGINGS)); + $this->map(Items::CHARCOAL(), self::id(Ids::CHARCOAL)); + $this->map(Items::CHEMICAL_ALUMINIUM_OXIDE(), self::chemical(CompoundTypeIds::ALUMINIUM_OXIDE)); + $this->map(Items::CHEMICAL_AMMONIA(), self::chemical(CompoundTypeIds::AMMONIA)); + $this->map(Items::CHEMICAL_BARIUM_SULPHATE(), self::chemical(CompoundTypeIds::BARIUM_SULPHATE)); + $this->map(Items::CHEMICAL_BENZENE(), self::chemical(CompoundTypeIds::BENZENE)); + $this->map(Items::CHEMICAL_BORON_TRIOXIDE(), self::chemical(CompoundTypeIds::BORON_TRIOXIDE)); + $this->map(Items::CHEMICAL_CALCIUM_BROMIDE(), self::chemical(CompoundTypeIds::CALCIUM_BROMIDE)); + $this->map(Items::CHEMICAL_CALCIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CALCIUM_CHLORIDE)); + $this->map(Items::CHEMICAL_CERIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CERIUM_CHLORIDE)); + $this->map(Items::CHEMICAL_CHARCOAL(), self::chemical(CompoundTypeIds::CHARCOAL)); + $this->map(Items::CHEMICAL_CRUDE_OIL(), self::chemical(CompoundTypeIds::CRUDE_OIL)); + $this->map(Items::CHEMICAL_GLUE(), self::chemical(CompoundTypeIds::GLUE)); + $this->map(Items::CHEMICAL_HYDROGEN_PEROXIDE(), self::chemical(CompoundTypeIds::HYDROGEN_PEROXIDE)); + $this->map(Items::CHEMICAL_HYPOCHLORITE(), self::chemical(CompoundTypeIds::HYPOCHLORITE)); + $this->map(Items::CHEMICAL_INK(), self::chemical(CompoundTypeIds::INK)); + $this->map(Items::CHEMICAL_IRON_SULPHIDE(), self::chemical(CompoundTypeIds::IRON_SULPHIDE)); + $this->map(Items::CHEMICAL_LATEX(), self::chemical(CompoundTypeIds::LATEX)); + $this->map(Items::CHEMICAL_LITHIUM_HYDRIDE(), self::chemical(CompoundTypeIds::LITHIUM_HYDRIDE)); + $this->map(Items::CHEMICAL_LUMINOL(), self::chemical(CompoundTypeIds::LUMINOL)); + $this->map(Items::CHEMICAL_MAGNESIUM_NITRATE(), self::chemical(CompoundTypeIds::MAGNESIUM_NITRATE)); + $this->map(Items::CHEMICAL_MAGNESIUM_OXIDE(), self::chemical(CompoundTypeIds::MAGNESIUM_OXIDE)); + $this->map(Items::CHEMICAL_MAGNESIUM_SALTS(), self::chemical(CompoundTypeIds::MAGNESIUM_SALTS)); + $this->map(Items::CHEMICAL_MERCURIC_CHLORIDE(), self::chemical(CompoundTypeIds::MERCURIC_CHLORIDE)); + $this->map(Items::CHEMICAL_POLYETHYLENE(), self::chemical(CompoundTypeIds::POLYETHYLENE)); + $this->map(Items::CHEMICAL_POTASSIUM_CHLORIDE(), self::chemical(CompoundTypeIds::POTASSIUM_CHLORIDE)); + $this->map(Items::CHEMICAL_POTASSIUM_IODIDE(), self::chemical(CompoundTypeIds::POTASSIUM_IODIDE)); + $this->map(Items::CHEMICAL_RUBBISH(), self::chemical(CompoundTypeIds::RUBBISH)); + $this->map(Items::CHEMICAL_SALT(), self::chemical(CompoundTypeIds::SALT)); + $this->map(Items::CHEMICAL_SOAP(), self::chemical(CompoundTypeIds::SOAP)); + $this->map(Items::CHEMICAL_SODIUM_ACETATE(), self::chemical(CompoundTypeIds::SODIUM_ACETATE)); + $this->map(Items::CHEMICAL_SODIUM_FLUORIDE(), self::chemical(CompoundTypeIds::SODIUM_FLUORIDE)); + $this->map(Items::CHEMICAL_SODIUM_HYDRIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDRIDE)); + $this->map(Items::CHEMICAL_SODIUM_HYDROXIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDROXIDE)); + $this->map(Items::CHEMICAL_SODIUM_HYPOCHLORITE(), self::chemical(CompoundTypeIds::SODIUM_HYPOCHLORITE)); + $this->map(Items::CHEMICAL_SODIUM_OXIDE(), self::chemical(CompoundTypeIds::SODIUM_OXIDE)); + $this->map(Items::CHEMICAL_SUGAR(), self::chemical(CompoundTypeIds::SUGAR)); + $this->map(Items::CHEMICAL_SULPHATE(), self::chemical(CompoundTypeIds::SULPHATE)); + $this->map(Items::CHEMICAL_TUNGSTEN_CHLORIDE(), self::chemical(CompoundTypeIds::TUNGSTEN_CHLORIDE)); + $this->map(Items::CHEMICAL_WATER(), self::chemical(CompoundTypeIds::WATER)); + $this->map(Items::CHORUS_FRUIT(), self::id(Ids::CHORUS_FRUIT)); + $this->map(Items::CLAY(), self::id(Ids::CLAY_BALL)); + $this->map(Items::CLOCK(), self::id(Ids::CLOCK)); + $this->map(Items::CLOWNFISH(), self::id(Ids::TROPICAL_FISH)); + $this->map(Items::COAL(), self::id(Ids::COAL)); + $this->map(Items::COCOA_BEANS(), self::id(Ids::COCOA_BEANS)); + $this->map(Items::COMPASS(), self::id(Ids::COMPASS)); + $this->map(Items::COOKED_CHICKEN(), self::id(Ids::COOKED_CHICKEN)); + $this->map(Items::COOKED_FISH(), self::id(Ids::COOKED_COD)); + $this->map(Items::COOKED_MUTTON(), self::id(Ids::COOKED_MUTTON)); + $this->map(Items::COOKED_PORKCHOP(), self::id(Ids::COOKED_PORKCHOP)); + $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); + $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); + $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); + $this->map(Items::CREEPER_HEAD(), self::skull(SkullType::CREEPER())); + $this->map(Items::CYAN_BED(), self::bed(DyeColor::CYAN())); + $this->map(Items::CYAN_DYE(), self::id(Ids::CYAN_DYE)); + $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); + $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); + $this->map(Items::DIAMOND(), self::id(Ids::DIAMOND)); + $this->map(Items::DIAMOND_AXE(), self::id(Ids::DIAMOND_AXE)); + $this->map(Items::DIAMOND_BOOTS(), self::id(Ids::DIAMOND_BOOTS)); + $this->map(Items::DIAMOND_CHESTPLATE(), self::id(Ids::DIAMOND_CHESTPLATE)); + $this->map(Items::DIAMOND_HELMET(), self::id(Ids::DIAMOND_HELMET)); + $this->map(Items::DIAMOND_HOE(), self::id(Ids::DIAMOND_HOE)); + $this->map(Items::DIAMOND_LEGGINGS(), self::id(Ids::DIAMOND_LEGGINGS)); + $this->map(Items::DIAMOND_PICKAXE(), self::id(Ids::DIAMOND_PICKAXE)); + $this->map(Items::DIAMOND_SHOVEL(), self::id(Ids::DIAMOND_SHOVEL)); + $this->map(Items::DIAMOND_SWORD(), self::id(Ids::DIAMOND_SWORD)); + $this->map(Items::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH)); + $this->map(Items::DRAGON_HEAD(), self::skull(SkullType::DRAGON())); + $this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP)); + $this->map(Items::EGG(), self::id(Ids::EGG)); + $this->map(Items::EMERALD(), self::id(Ids::EMERALD)); + $this->map(Items::ENCHANTED_GOLDEN_APPLE(), self::id(Ids::ENCHANTED_GOLDEN_APPLE)); + $this->map(Items::ENDER_PEARL(), self::id(Ids::ENDER_PEARL)); + $this->map(Items::EXPERIENCE_BOTTLE(), self::id(Ids::EXPERIENCE_BOTTLE)); + $this->map(Items::FEATHER(), self::id(Ids::FEATHER)); + $this->map(Items::FERMENTED_SPIDER_EYE(), self::id(Ids::FERMENTED_SPIDER_EYE)); + $this->map(Items::FIRE_RESISTANCE_POTION(), self::potion(PotionType::FIRE_RESISTANCE())); + $this->map(Items::FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::FIRE_RESISTANCE())); + $this->map(Items::FISHING_ROD(), self::id(Ids::FISHING_ROD)); + $this->map(Items::FLINT(), self::id(Ids::FLINT)); + $this->map(Items::FLINT_AND_STEEL(), self::id(Ids::FLINT_AND_STEEL)); + $this->map(Items::GHAST_TEAR(), self::id(Ids::GHAST_TEAR)); + $this->map(Items::GLASS_BOTTLE(), self::id(Ids::GLASS_BOTTLE)); + $this->map(Items::GLISTERING_MELON(), self::id(Ids::GLISTERING_MELON_SLICE)); + $this->map(Items::GLOWSTONE_DUST(), self::id(Ids::GLOWSTONE_DUST)); + $this->map(Items::GOLDEN_APPLE(), self::id(Ids::GOLDEN_APPLE)); + $this->map(Items::GOLDEN_AXE(), self::id(Ids::GOLDEN_AXE)); + $this->map(Items::GOLDEN_BOOTS(), self::id(Ids::GOLDEN_BOOTS)); + $this->map(Items::GOLDEN_CARROT(), self::id(Ids::GOLDEN_CARROT)); + $this->map(Items::GOLDEN_CHESTPLATE(), self::id(Ids::GOLDEN_CHESTPLATE)); + $this->map(Items::GOLDEN_HELMET(), self::id(Ids::GOLDEN_HELMET)); + $this->map(Items::GOLDEN_HOE(), self::id(Ids::GOLDEN_HOE)); + $this->map(Items::GOLDEN_LEGGINGS(), self::id(Ids::GOLDEN_LEGGINGS)); + $this->map(Items::GOLDEN_PICKAXE(), self::id(Ids::GOLDEN_PICKAXE)); + $this->map(Items::GOLDEN_SHOVEL(), self::id(Ids::GOLDEN_SHOVEL)); + $this->map(Items::GOLDEN_SWORD(), self::id(Ids::GOLDEN_SWORD)); + $this->map(Items::GOLD_INGOT(), self::id(Ids::GOLD_INGOT)); + $this->map(Items::GOLD_NUGGET(), self::id(Ids::GOLD_NUGGET)); + $this->map(Items::GRAY_BED(), self::bed(DyeColor::GRAY())); + $this->map(Items::GRAY_DYE(), self::id(Ids::GRAY_DYE)); + $this->map(Items::GREEN_BED(), self::bed(DyeColor::GREEN())); + $this->map(Items::GREEN_DYE(), self::id(Ids::GREEN_DYE)); + $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); + $this->map(Items::HARMING_POTION(), self::potion(PotionType::HARMING())); + $this->map(Items::HARMING_SPLASH_POTION(), self::splashPotion(PotionType::HARMING())); + $this->map(Items::HEALING_POTION(), self::potion(PotionType::HEALING())); + $this->map(Items::HEALING_SPLASH_POTION(), self::splashPotion(PotionType::HEALING())); + $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); + $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); + $this->map(Items::INVISIBILITY_POTION(), self::potion(PotionType::INVISIBILITY())); + $this->map(Items::INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::INVISIBILITY())); + $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); + $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); + $this->map(Items::IRON_CHESTPLATE(), self::id(Ids::IRON_CHESTPLATE)); + $this->map(Items::IRON_HELMET(), self::id(Ids::IRON_HELMET)); + $this->map(Items::IRON_HOE(), self::id(Ids::IRON_HOE)); + $this->map(Items::IRON_INGOT(), self::id(Ids::IRON_INGOT)); + $this->map(Items::IRON_LEGGINGS(), self::id(Ids::IRON_LEGGINGS)); + $this->map(Items::IRON_NUGGET(), self::id(Ids::IRON_NUGGET)); + $this->map(Items::IRON_PICKAXE(), self::id(Ids::IRON_PICKAXE)); + $this->map(Items::IRON_SHOVEL(), self::id(Ids::IRON_SHOVEL)); + $this->map(Items::IRON_SWORD(), self::id(Ids::IRON_SWORD)); + $this->map(Items::JUNGLE_BOAT(), self::id(Ids::JUNGLE_BOAT)); + $this->map(Items::JUNGLE_SIGN(), self::id(Ids::JUNGLE_SIGN)); + $this->map(Items::LAPIS_LAZULI(), self::id(Ids::LAPIS_LAZULI)); + $this->map(Items::LAVA_BUCKET(), self::id(Ids::LAVA_BUCKET)); + $this->map(Items::LEAPING_POTION(), self::potion(PotionType::LEAPING())); + $this->map(Items::LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LEAPING())); + $this->map(Items::LEATHER(), self::id(Ids::LEATHER)); + $this->map(Items::LEATHER_BOOTS(), self::id(Ids::LEATHER_BOOTS)); + $this->map(Items::LEATHER_CAP(), self::id(Ids::LEATHER_HELMET)); + $this->map(Items::LEATHER_PANTS(), self::id(Ids::LEATHER_LEGGINGS)); + $this->map(Items::LEATHER_TUNIC(), self::id(Ids::LEATHER_CHESTPLATE)); + $this->map(Items::LIGHT_BLUE_BED(), self::bed(DyeColor::LIGHT_BLUE())); + $this->map(Items::LIGHT_BLUE_DYE(), self::id(Ids::LIGHT_BLUE_DYE)); + $this->map(Items::LIGHT_GRAY_BED(), self::bed(DyeColor::LIGHT_GRAY())); + $this->map(Items::LIGHT_GRAY_DYE(), self::id(Ids::LIGHT_GRAY_DYE)); + $this->map(Items::LIME_BED(), self::bed(DyeColor::LIME())); + $this->map(Items::LIME_DYE(), self::id(Ids::LIME_DYE)); + $this->map(Items::LONG_FIRE_RESISTANCE_POTION(), self::potion(PotionType::LONG_FIRE_RESISTANCE())); + $this->map(Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_FIRE_RESISTANCE())); + $this->map(Items::LONG_INVISIBILITY_POTION(), self::potion(PotionType::LONG_INVISIBILITY())); + $this->map(Items::LONG_INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::LONG_INVISIBILITY())); + $this->map(Items::LONG_LEAPING_POTION(), self::potion(PotionType::LONG_LEAPING())); + $this->map(Items::LONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_LEAPING())); + $this->map(Items::LONG_MUNDANE_POTION(), self::potion(PotionType::LONG_MUNDANE())); + $this->map(Items::LONG_MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_MUNDANE())); + $this->map(Items::LONG_NIGHT_VISION_POTION(), self::potion(PotionType::LONG_NIGHT_VISION())); + $this->map(Items::LONG_NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_NIGHT_VISION())); + $this->map(Items::LONG_POISON_POTION(), self::potion(PotionType::LONG_POISON())); + $this->map(Items::LONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::LONG_POISON())); + $this->map(Items::LONG_REGENERATION_POTION(), self::potion(PotionType::LONG_REGENERATION())); + $this->map(Items::LONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_REGENERATION())); + $this->map(Items::LONG_SLOWNESS_POTION(), self::potion(PotionType::LONG_SLOWNESS())); + $this->map(Items::LONG_SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOWNESS())); + $this->map(Items::LONG_SLOW_FALLING_POTION(), self::potion(PotionType::LONG_SLOW_FALLING())); + $this->map(Items::LONG_SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOW_FALLING())); + $this->map(Items::LONG_STRENGTH_POTION(), self::potion(PotionType::LONG_STRENGTH())); + $this->map(Items::LONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::LONG_STRENGTH())); + $this->map(Items::LONG_SWIFTNESS_POTION(), self::potion(PotionType::LONG_SWIFTNESS())); + $this->map(Items::LONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SWIFTNESS())); + $this->map(Items::LONG_TURTLE_MASTER_POTION(), self::potion(PotionType::LONG_TURTLE_MASTER())); + $this->map(Items::LONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::LONG_TURTLE_MASTER())); + $this->map(Items::LONG_WATER_BREATHING_POTION(), self::potion(PotionType::LONG_WATER_BREATHING())); + $this->map(Items::LONG_WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WATER_BREATHING())); + $this->map(Items::LONG_WEAKNESS_POTION(), self::potion(PotionType::LONG_WEAKNESS())); + $this->map(Items::LONG_WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WEAKNESS())); + $this->map(Items::MAGENTA_BED(), self::bed(DyeColor::MAGENTA())); + $this->map(Items::MAGENTA_DYE(), self::id(Ids::MAGENTA_DYE)); + $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); + $this->map(Items::MELON(), self::id(Ids::MELON_SLICE)); + $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); + $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); + $this->map(Items::MINECART(), self::id(Ids::MINECART)); + $this->map(Items::MUNDANE_POTION(), self::potion(PotionType::MUNDANE())); + $this->map(Items::MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::MUNDANE())); + $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); + $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); + $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); + $this->map(Items::NETHER_QUARTZ(), self::id(Ids::QUARTZ)); + $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); + $this->map(Items::NIGHT_VISION_POTION(), self::potion(PotionType::NIGHT_VISION())); + $this->map(Items::NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::NIGHT_VISION())); + $this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT)); + $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); + $this->map(Items::ORANGE_BED(), self::bed(DyeColor::ORANGE())); + $this->map(Items::ORANGE_DYE(), self::id(Ids::ORANGE_DYE)); + $this->map(Items::PAINTING(), self::id(Ids::PAINTING)); + $this->map(Items::PAPER(), self::id(Ids::PAPER)); + $this->map(Items::PINK_BED(), self::bed(DyeColor::PINK())); + $this->map(Items::PINK_DYE(), self::id(Ids::PINK_DYE)); + $this->map(Items::PLAYER_HEAD(), self::skull(SkullType::PLAYER())); + $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); + $this->map(Items::POISON_POTION(), self::potion(PotionType::POISON())); + $this->map(Items::POISON_SPLASH_POTION(), self::splashPotion(PotionType::POISON())); + $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); + $this->map(Items::POTATO(), self::id(Ids::POTATO)); + $this->map(Items::PRISMARINE_CRYSTALS(), self::id(Ids::PRISMARINE_CRYSTALS)); + $this->map(Items::PRISMARINE_SHARD(), self::id(Ids::PRISMARINE_SHARD)); + $this->map(Items::PUFFERFISH(), self::id(Ids::PUFFERFISH)); + $this->map(Items::PUMPKIN_PIE(), self::id(Ids::PUMPKIN_PIE)); + $this->map(Items::PUMPKIN_SEEDS(), self::id(Ids::PUMPKIN_SEEDS)); + $this->map(Items::PURPLE_BED(), self::bed(DyeColor::PURPLE())); + $this->map(Items::PURPLE_DYE(), self::id(Ids::PURPLE_DYE)); + $this->map(Items::RABBIT_FOOT(), self::id(Ids::RABBIT_FOOT)); + $this->map(Items::RABBIT_HIDE(), self::id(Ids::RABBIT_HIDE)); + $this->map(Items::RABBIT_STEW(), self::id(Ids::RABBIT_STEW)); + $this->map(Items::RAW_BEEF(), self::id(Ids::BEEF)); + $this->map(Items::RAW_CHICKEN(), self::id(Ids::CHICKEN)); + $this->map(Items::RAW_FISH(), self::id(Ids::COD)); + $this->map(Items::RAW_MUTTON(), self::id(Ids::MUTTON)); + $this->map(Items::RAW_PORKCHOP(), self::id(Ids::PORKCHOP)); + $this->map(Items::RAW_RABBIT(), self::id(Ids::RABBIT)); + $this->map(Items::RAW_SALMON(), self::id(Ids::SALMON)); + $this->map(Items::RECORD_11(), self::id(Ids::MUSIC_DISC_11)); + $this->map(Items::RECORD_13(), self::id(Ids::MUSIC_DISC_13)); + $this->map(Items::RECORD_BLOCKS(), self::id(Ids::MUSIC_DISC_BLOCKS)); + $this->map(Items::RECORD_CAT(), self::id(Ids::MUSIC_DISC_CAT)); + $this->map(Items::RECORD_CHIRP(), self::id(Ids::MUSIC_DISC_CHIRP)); + $this->map(Items::RECORD_FAR(), self::id(Ids::MUSIC_DISC_FAR)); + $this->map(Items::RECORD_MALL(), self::id(Ids::MUSIC_DISC_MALL)); + $this->map(Items::RECORD_MELLOHI(), self::id(Ids::MUSIC_DISC_MELLOHI)); + $this->map(Items::RECORD_STAL(), self::id(Ids::MUSIC_DISC_STAL)); + $this->map(Items::RECORD_STRAD(), self::id(Ids::MUSIC_DISC_STRAD)); + $this->map(Items::RECORD_WAIT(), self::id(Ids::MUSIC_DISC_WAIT)); + $this->map(Items::RECORD_WARD(), self::id(Ids::MUSIC_DISC_WARD)); + $this->map(Items::REDSTONE_DUST(), self::id(Ids::REDSTONE)); + $this->map(Items::RED_BED(), self::bed(DyeColor::RED())); + $this->map(Items::RED_DYE(), self::id(Ids::RED_DYE)); + $this->map(Items::REGENERATION_POTION(), self::potion(PotionType::REGENERATION())); + $this->map(Items::REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::REGENERATION())); + $this->map(Items::ROTTEN_FLESH(), self::id(Ids::ROTTEN_FLESH)); + $this->map(Items::SCUTE(), self::id(Ids::SCUTE)); + $this->map(Items::SHEARS(), self::id(Ids::SHEARS)); + $this->map(Items::SHULKER_SHELL(), self::id(Ids::SHULKER_SHELL)); + $this->map(Items::SKELETON_SKULL(), self::skull(SkullType::SKELETON())); + $this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL)); + $this->map(Items::SLOWNESS_POTION(), self::potion(PotionType::SLOWNESS())); + $this->map(Items::SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::SLOWNESS())); + $this->map(Items::SLOW_FALLING_POTION(), self::potion(PotionType::SLOW_FALLING())); + $this->map(Items::SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::SLOW_FALLING())); + $this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL)); + $this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE)); + $this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT)); + $this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN)); + $this->map(Items::SQUID_SPAWN_EGG(), self::id(Ids::SQUID_SPAWN_EGG)); + $this->map(Items::STEAK(), self::id(Ids::COOKED_BEEF)); + $this->map(Items::STICK(), self::id(Ids::STICK)); + $this->map(Items::STONE_AXE(), self::id(Ids::STONE_AXE)); + $this->map(Items::STONE_HOE(), self::id(Ids::STONE_HOE)); + $this->map(Items::STONE_PICKAXE(), self::id(Ids::STONE_PICKAXE)); + $this->map(Items::STONE_SHOVEL(), self::id(Ids::STONE_SHOVEL)); + $this->map(Items::STONE_SWORD(), self::id(Ids::STONE_SWORD)); + $this->map(Items::STRENGTH_POTION(), self::potion(PotionType::STRENGTH())); + $this->map(Items::STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRENGTH())); + $this->map(Items::STRING(), self::id(Ids::STRING)); + $this->map(Items::STRONG_HARMING_POTION(), self::potion(PotionType::STRONG_HARMING())); + $this->map(Items::STRONG_HARMING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HARMING())); + $this->map(Items::STRONG_HEALING_POTION(), self::potion(PotionType::STRONG_HEALING())); + $this->map(Items::STRONG_HEALING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HEALING())); + $this->map(Items::STRONG_LEAPING_POTION(), self::potion(PotionType::STRONG_LEAPING())); + $this->map(Items::STRONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_LEAPING())); + $this->map(Items::STRONG_POISON_POTION(), self::potion(PotionType::STRONG_POISON())); + $this->map(Items::STRONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_POISON())); + $this->map(Items::STRONG_REGENERATION_POTION(), self::potion(PotionType::STRONG_REGENERATION())); + $this->map(Items::STRONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_REGENERATION())); + $this->map(Items::STRONG_STRENGTH_POTION(), self::potion(PotionType::STRONG_STRENGTH())); + $this->map(Items::STRONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_STRENGTH())); + $this->map(Items::STRONG_SWIFTNESS_POTION(), self::potion(PotionType::STRONG_SWIFTNESS())); + $this->map(Items::STRONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_SWIFTNESS())); + $this->map(Items::STRONG_TURTLE_MASTER_POTION(), self::potion(PotionType::STRONG_TURTLE_MASTER())); + $this->map(Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_TURTLE_MASTER())); + $this->map(Items::SUGAR(), self::id(Ids::SUGAR)); + $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); + $this->map(Items::SWIFTNESS_POTION(), self::potion(PotionType::SWIFTNESS())); + $this->map(Items::SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::SWIFTNESS())); + $this->map(Items::THICK_POTION(), self::potion(PotionType::THICK())); + $this->map(Items::THICK_SPLASH_POTION(), self::splashPotion(PotionType::THICK())); + $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); + $this->map(Items::TURTLE_MASTER_POTION(), self::potion(PotionType::TURTLE_MASTER())); + $this->map(Items::TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::TURTLE_MASTER())); + $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); + $this->map(Items::WATER_BREATHING_POTION(), self::potion(PotionType::WATER_BREATHING())); + $this->map(Items::WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::WATER_BREATHING())); + $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); + $this->map(Items::WATER_POTION(), self::potion(PotionType::WATER())); + $this->map(Items::WATER_SPLASH_POTION(), self::splashPotion(PotionType::WATER())); + $this->map(Items::WEAKNESS_POTION(), self::potion(PotionType::WEAKNESS())); + $this->map(Items::WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::WEAKNESS())); + $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); + $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); + $this->map(Items::WHITE_BED(), self::bed(DyeColor::WHITE())); + $this->map(Items::WHITE_DYE(), self::id(Ids::WHITE_DYE)); + $this->map(Items::WITHER_POTION(), self::potion(PotionType::WITHER())); + $this->map(Items::WITHER_SKELETON_SKULL(), self::skull(SkullType::WITHER_SKELETON())); + $this->map(Items::WITHER_SPLASH_POTION(), self::splashPotion(PotionType::WITHER())); + $this->map(Items::WOODEN_AXE(), self::id(Ids::WOODEN_AXE)); + $this->map(Items::WOODEN_HOE(), self::id(Ids::WOODEN_HOE)); + $this->map(Items::WOODEN_PICKAXE(), self::id(Ids::WOODEN_PICKAXE)); + $this->map(Items::WOODEN_SHOVEL(), self::id(Ids::WOODEN_SHOVEL)); + $this->map(Items::WOODEN_SWORD(), self::id(Ids::WOODEN_SWORD)); + $this->map(Items::WRITABLE_BOOK(), self::id(Ids::WRITABLE_BOOK)); + $this->map(Items::WRITTEN_BOOK(), self::id(Ids::WRITTEN_BOOK)); + $this->map(Items::YELLOW_BED(), self::bed(DyeColor::YELLOW())); + $this->map(Items::YELLOW_DYE(), self::id(Ids::YELLOW_DYE)); + $this->map(Items::ZOMBIE_HEAD(), self::skull(SkullType::ZOMBIE())); + $this->map(Items::ZOMBIE_SPAWN_EGG(), self::id(Ids::ZOMBIE_SPAWN_EGG)); + } +} diff --git a/src/data/bedrock/item/ItemTypeIds.php b/src/data/bedrock/item/ItemTypeIds.php new file mode 100644 index 0000000000..f51504136f --- /dev/null +++ b/src/data/bedrock/item/ItemTypeIds.php @@ -0,0 +1,409 @@ +name; } + + public function getMeta() : int{ return $this->meta; } + + public function getBlock() : ?BlockStateData{ return $this->block; } + + public function getTag() : ?CompoundTag{ return $this->tag; } + + public static function fromNbt(CompoundTag $tag) : self{ + try{ + //required + $name = $tag->getString(self::TAG_NAME); + $damage = $tag->getShort(self::TAG_DAMAGE); + + //optional + $blockStateNbt = $tag->getCompoundTag(self::TAG_BLOCK); + $extraData = $tag->getCompoundTag(self::TAG_TAG); + }catch(NbtException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + + //TODO: this hack probably doesn't belong here; it's necessary to deal with spawn eggs from before 1.16.100 + if( + $name === ItemTypeIds::SPAWN_EGG && + ($itemIdentifierTag = $tag->getTag(self::TAG_ITEM_IDENTIFIER)) instanceof StringTag && + str_starts_with($itemIdentifierTag->getValue(), "minecraft:") + ){ + \GlobalLogger::get()->debug("Handling legacy spawn egg for " . $itemIdentifierTag->getValue()); + $name = $itemIdentifierTag->getValue() . "_spawn_egg"; + } + + try{ + $blockStateData = $blockStateNbt !== null ? BlockStateData::fromNbt($blockStateNbt) : null; + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Failed to load item saved data: " . $e->getMessage(), 0, $e); + } + + return new self( + $name, + $damage, + $blockStateData, + $extraData + ); + } + + public function toNbt() : CompoundTag{ + $result = CompoundTag::create(); + $result->setString(self::TAG_NAME, $this->name); + $result->setShort(self::TAG_DAMAGE, $this->meta); + + if($this->block !== null){ + $result->setTag(self::TAG_BLOCK, $this->block->toNbt()); + } + if($this->tag !== null){ + $result->setTag(self::TAG_TAG, $this->tag); + } + + return $result; + } +} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 77a77c28a8..60694e8b5f 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -33,16 +33,20 @@ use pocketmine\utils\CloningRegistryTrait; * @generate-registry-docblock * * @method static Boat ACACIA_BOAT() + * @method static ItemBlockWallOrFloor ACACIA_SIGN() * @method static ItemBlock AIR() * @method static Apple APPLE() * @method static Arrow ARROW() * @method static Potion AWKWARD_POTION() * @method static SplashPotion AWKWARD_SPLASH_POTION() * @method static BakedPotato BAKED_POTATO() + * @method static Bamboo BAMBOO() + * @method static Banner BANNER() * @method static Beetroot BEETROOT() * @method static BeetrootSeeds BEETROOT_SEEDS() * @method static BeetrootSoup BEETROOT_SOUP() * @method static Boat BIRCH_BOAT() + * @method static ItemBlockWallOrFloor BIRCH_SIGN() * @method static Bed BLACK_BED() * @method static Dye BLACK_DYE() * @method static Item BLAZE_POWDER() @@ -118,10 +122,12 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CookedRabbit COOKED_RABBIT() * @method static CookedSalmon COOKED_SALMON() * @method static Cookie COOKIE() + * @method static ItemBlockWallOrFloor CORAL_FAN() * @method static Skull CREEPER_HEAD() * @method static Bed CYAN_BED() * @method static Dye CYAN_DYE() * @method static Boat DARK_OAK_BOAT() + * @method static ItemBlockWallOrFloor DARK_OAK_SIGN() * @method static Item DIAMOND() * @method static Axe DIAMOND_AXE() * @method static Armor DIAMOND_BOOTS() @@ -189,6 +195,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Shovel IRON_SHOVEL() * @method static Sword IRON_SWORD() * @method static Boat JUNGLE_BOAT() + * @method static ItemBlockWallOrFloor JUNGLE_SIGN() * @method static Item LAPIS_LAZULI() * @method static LiquidBucket LAVA_BUCKET() * @method static Potion LEAPING_POTION() @@ -249,6 +256,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Potion NIGHT_VISION_POTION() * @method static SplashPotion NIGHT_VISION_SPLASH_POTION() * @method static Boat OAK_BOAT() + * @method static ItemBlockWallOrFloor OAK_SIGN() * @method static Bed ORANGE_BED() * @method static Dye ORANGE_DYE() * @method static PaintingItem PAINTING() @@ -308,6 +316,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Snowball SNOWBALL() * @method static SpiderEye SPIDER_EYE() * @method static Boat SPRUCE_BOAT() + * @method static ItemBlockWallOrFloor SPRUCE_SIGN() * @method static SpawnEgg SQUID_SPAWN_EGG() * @method static Steak STEAK() * @method static Stick STICK() @@ -395,16 +404,20 @@ final class VanillaItems{ protected static function setup() : void{ $factory = ItemFactory::getInstance(); self::register("acacia_boat", $factory->get(Ids::BOAT, 4)); + self::register("acacia_sign", $factory->get(Ids::ACACIA_SIGN)); self::register("air", $factory->get(Ids::AIR, 0, 0)); self::register("apple", $factory->get(Ids::APPLE)); self::register("arrow", $factory->get(Ids::ARROW)); self::register("awkward_potion", $factory->get(Ids::POTION, 4)); self::register("awkward_splash_potion", $factory->get(Ids::SPLASH_POTION, 4)); self::register("baked_potato", $factory->get(Ids::BAKED_POTATO)); + self::register("bamboo", $factory->get(Ids::BAMBOO)); + self::register("banner", $factory->get(Ids::BANNER)); self::register("beetroot", $factory->get(Ids::BEETROOT)); self::register("beetroot_seeds", $factory->get(Ids::BEETROOT_SEEDS)); self::register("beetroot_soup", $factory->get(Ids::BEETROOT_SOUP)); self::register("birch_boat", $factory->get(Ids::BOAT, 2)); + self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN)); self::register("black_bed", $factory->get(Ids::BED, 15)); self::register("black_dye", $factory->get(Ids::DYE, 16)); self::register("blaze_powder", $factory->get(Ids::BLAZE_POWDER)); @@ -480,10 +493,12 @@ final class VanillaItems{ self::register("cooked_rabbit", $factory->get(Ids::COOKED_RABBIT)); self::register("cooked_salmon", $factory->get(Ids::COOKED_SALMON)); self::register("cookie", $factory->get(Ids::COOKIE)); + self::register("coral_fan", $factory->get(Ids::CORAL_FAN)); self::register("creeper_head", $factory->get(Ids::MOB_HEAD, 4)); self::register("cyan_bed", $factory->get(Ids::BED, 9)); self::register("cyan_dye", $factory->get(Ids::DYE, 6)); self::register("dark_oak_boat", $factory->get(Ids::BOAT, 5)); + self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_SIGN)); self::register("diamond", $factory->get(Ids::DIAMOND)); self::register("diamond_axe", $factory->get(Ids::DIAMOND_AXE)); self::register("diamond_boots", $factory->get(Ids::DIAMOND_BOOTS)); @@ -551,6 +566,7 @@ final class VanillaItems{ self::register("iron_shovel", $factory->get(Ids::IRON_SHOVEL)); self::register("iron_sword", $factory->get(Ids::IRON_SWORD)); self::register("jungle_boat", $factory->get(Ids::BOAT, 3)); + self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN)); self::register("lapis_lazuli", $factory->get(Ids::DYE, 4)); self::register("lava_bucket", $factory->get(Ids::BUCKET, 10)); self::register("leaping_potion", $factory->get(Ids::POTION, 9)); @@ -611,6 +627,7 @@ final class VanillaItems{ self::register("night_vision_potion", $factory->get(Ids::POTION, 5)); self::register("night_vision_splash_potion", $factory->get(Ids::SPLASH_POTION, 5)); self::register("oak_boat", $factory->get(Ids::BOAT)); + self::register("oak_sign", $factory->get(Ids::SIGN)); self::register("orange_bed", $factory->get(Ids::BED, 1)); self::register("orange_dye", $factory->get(Ids::DYE, 14)); self::register("painting", $factory->get(Ids::PAINTING)); @@ -670,6 +687,7 @@ final class VanillaItems{ self::register("snowball", $factory->get(Ids::SNOWBALL)); self::register("spider_eye", $factory->get(Ids::SPIDER_EYE)); self::register("spruce_boat", $factory->get(Ids::BOAT, 1)); + self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN)); self::register("squid_spawn_egg", $factory->get(Ids::SPAWN_EGG, 17)); self::register("steak", $factory->get(Ids::COOKED_BEEF)); self::register("stick", $factory->get(Ids::STICK)); diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php new file mode 100644 index 0000000000..c841d72bb5 --- /dev/null +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -0,0 +1,66 @@ +deserializer = new ItemDeserializer(); + $this->serializer = new ItemSerializer(); + } + + public function testAllVanillaItemsSerializableAndDeserializable() : void{ + foreach(VanillaItems::getAll() as $item){ + if($item->isNull()){ + continue; + } + + $itemData = $this->serializer->serialize($item); + $newItem = $this->deserializer->deserialize($itemData); + + self::assertTrue($item->equalsExact($newItem)); + } + } + + public function testAllVanillaBlocksSerializableAndDeserializable() : void{ + foreach(VanillaBlocks::getAll() as $block){ + $item = $block->asItem(); + if($item->isNull()){ + continue; + } + + $itemData = $this->serializer->serialize($item); + $newItem = $this->deserializer->deserialize($itemData); + + self::assertTrue($item->equalsExact($newItem)); + } + } +} From 7769857f6a63b63d812a3651339041ca1523aaba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:34:24 +0100 Subject: [PATCH 0084/1858] Added unit test to verify all VanillaBlocks serialize and deserialize correctly --- .../BlockSerializerDeserializerTest.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php new file mode 100644 index 0000000000..d5a99328fd --- /dev/null +++ b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php @@ -0,0 +1,27 @@ +deserializer = new BlockStateToBlockObjectDeserializer(); + $this->serializer = new BlockObjectToBlockStateSerializer(); + } + + public function testAllVanillaBlocksSerializableAndDeserializable() : void{ + foreach(VanillaBlocks::getAll() as $block){ + $blockStateData = $this->serializer->serializeBlock($block); + $newBlock = $this->deserializer->deserializeBlock($blockStateData); + + self::assertSame($block->getFullId(), $newBlock->getFullId()); + } + } +} From 107b0e1728d26fed02276385792343f9c998c45c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:35:12 +0100 Subject: [PATCH 0085/1858] CS again, kill me --- src/data/bedrock/BlockItemIdMap.php | 7 +++++-- src/data/bedrock/item/ItemSerializer.php | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/BlockItemIdMap.php b/src/data/bedrock/BlockItemIdMap.php index dd8fb8bb7a..2cc9f7e6c1 100644 --- a/src/data/bedrock/BlockItemIdMap.php +++ b/src/data/bedrock/BlockItemIdMap.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; -use pocketmine\entity\effect\StringToEffectParser; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; +use function array_search; +use function file_get_contents; +use function is_array; +use function json_decode; use const pocketmine\BEDROCK_DATA_PATH; /** @@ -60,4 +63,4 @@ final class BlockItemIdMap{ $blockId = array_search($itemId, $this->blockToItemId, true); return $blockId !== false ? $blockId : null; } -} \ No newline at end of file +} diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index e8031f5d8e..4f4a4e6858 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -219,7 +219,7 @@ final class ItemSerializer{ $this->map(Items::BAMBOO(), self::standardBlockWrapper()); $this->map(Items::CORAL_FAN(), self::standardBlockWrapper()); - $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); + $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); $this->map(Items::APPLE(), self::id(Ids::APPLE)); From d10d660a4ddfb0becf68a88b59864dd6c616448c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:37:50 +0100 Subject: [PATCH 0086/1858] fix PHPStan --- src/data/bedrock/BlockItemIdMap.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/BlockItemIdMap.php b/src/data/bedrock/BlockItemIdMap.php index 2cc9f7e6c1..a345a0a320 100644 --- a/src/data/bedrock/BlockItemIdMap.php +++ b/src/data/bedrock/BlockItemIdMap.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; +use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; use function array_search; use function file_get_contents; @@ -39,7 +40,11 @@ final class BlockItemIdMap{ use SingletonTrait; private static function make() : self{ - $map = json_decode(file_get_contents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), true, flags: JSON_THROW_ON_ERROR); + $map = json_decode( + Utils::assumeNotFalse(file_get_contents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), "Missing required resource file"), + associative: true, + flags: JSON_THROW_ON_ERROR + ); if(!is_array($map)){ throw new AssumptionFailedError("Invalid blockitem ID mapping table, expected array as root type"); } From 3ae9341c527bf92694ae1ba7c5480e6b6b432743 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:43:44 +0100 Subject: [PATCH 0087/1858] [BC break] doors don't have a powered flag in Bedrock --- src/block/BlockLegacyMetadata.php | 1 - src/block/Door.php | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/block/BlockLegacyMetadata.php b/src/block/BlockLegacyMetadata.php index 22085c4276..93408bdaa1 100644 --- a/src/block/BlockLegacyMetadata.php +++ b/src/block/BlockLegacyMetadata.php @@ -98,7 +98,6 @@ final class BlockLegacyMetadata{ public const DOOR_FLAG_TOP = 0x08; public const DOOR_BOTTOM_FLAG_OPEN = 0x04; public const DOOR_TOP_FLAG_RIGHT = 0x01; - public const DOOR_TOP_FLAG_POWERED = 0x02; public const DOUBLE_PLANT_SUNFLOWER = 0; public const DOUBLE_PLANT_LILAC = 1; diff --git a/src/block/Door.php b/src/block/Door.php index a52e51d9d2..8460a94f33 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -36,7 +36,6 @@ use pocketmine\world\sound\DoorSound; class Door extends Transparent{ use HorizontalFacingTrait; - use PoweredByRedstoneTrait; protected bool $top = false; protected bool $hingeRight = false; @@ -45,8 +44,7 @@ class Door extends Transparent{ protected function writeStateToMeta() : int{ if($this->top){ return BlockLegacyMetadata::DOOR_FLAG_TOP | - ($this->hingeRight ? BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT : 0) | - ($this->powered ? BlockLegacyMetadata::DOOR_TOP_FLAG_POWERED : 0); + ($this->hingeRight ? BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT : 0); } return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::rotateY($this->facing, true)) | ($this->open ? BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN : 0); @@ -56,7 +54,6 @@ class Door extends Transparent{ $this->top = ($stateMeta & BlockLegacyMetadata::DOOR_FLAG_TOP) !== 0; if($this->top){ $this->hingeRight = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT) !== 0; - $this->powered = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_POWERED) !== 0; }else{ $this->facing = Facing::rotateY(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03), false); $this->open = ($stateMeta & BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN) !== 0; @@ -78,7 +75,6 @@ class Door extends Transparent{ $this->open = $other->open; }else{ $this->hingeRight = $other->hingeRight; - $this->powered = $other->powered; } } } From 4c03aabe0f4af2f600e2ff170224833a1f0c6d22 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:44:21 +0100 Subject: [PATCH 0088/1858] I'm going to kill myself... --- src/block/Door.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/Door.php b/src/block/Door.php index 8460a94f33..210f2dceb2 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\BlockDataSerializer; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; From d17032dd8c8418d755c9f608cdd53a5c0788b2c6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 16:45:44 +0100 Subject: [PATCH 0089/1858] Test all known blockstates, not just the ones found in VanillaBlocks VanillaBlocks isn't guaranteed to be a complete record. For example, I've considered moving chemistry blocks to a separate EducationBlocks registry. In such a case, the blocks are still expected to serialize correctly, but they won't be in VanillaBlocks. --- .../convert/BlockSerializerDeserializerTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php index d5a99328fd..5bec77cc18 100644 --- a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate\convert; use PHPUnit\Framework\TestCase; -use pocketmine\block\VanillaBlocks; +use pocketmine\block\BlockFactory; final class BlockSerializerDeserializerTest extends TestCase{ private BlockStateToBlockObjectDeserializer $deserializer; @@ -16,12 +16,12 @@ final class BlockSerializerDeserializerTest extends TestCase{ $this->serializer = new BlockObjectToBlockStateSerializer(); } - public function testAllVanillaBlocksSerializableAndDeserializable() : void{ - foreach(VanillaBlocks::getAll() as $block){ + public function testAllKnownBlockStatesSerializableAndDeserializable() : void{ + foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){ $blockStateData = $this->serializer->serializeBlock($block); $newBlock = $this->deserializer->deserializeBlock($blockStateData); - self::assertSame($block->getFullId(), $newBlock->getFullId()); + self::assertSame($block->getFullId(), $newBlock->getFullId(), "Mismatch of blockstate for " . $block->getName()); } } } From d922f003f640b6bcdb72f8a2d77dba5d4a8f8d2b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 20:39:03 +0100 Subject: [PATCH 0090/1858] Fixed consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- tests/phpunit/block/regenerate_consistency_check.php | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 7f68160835..e6631df72e 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","1034":"Oak Door","1035":"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","1146":"Iron Door","1147":"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","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","3098":"Spruce Door","3099":"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","3114":"Birch Door","3115":"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","3130":"Jungle Door","3131":"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","3146":"Acacia Door","3147":"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","3162":"Dark Oak Door","3163":"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":"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","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,"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,"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,"2313":2306,"2314":2306,"2315":2306,"2316":2306,"2317":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,"3100":3091,"3101":3091,"3102":3091,"3103":3091,"3116":3107,"3117":3107,"3118":3107,"3119":3107,"3132":3123,"3133":3123,"3134":3123,"3135":3123,"3148":3139,"3149":3139,"3150":3139,"3151":3139,"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,"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":{"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","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":"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","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,"2313":2306,"2314":2306,"2315":2306,"2316":2306,"2317":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,"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 diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index c18b945329..c50c1bd6a8 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -21,6 +21,9 @@ declare(strict_types=1); +use pocketmine\block\Block; +use pocketmine\block\UnknownBlock; + require dirname(__DIR__, 3) . '/vendor/autoload.php'; /* This script needs to be re-run after any intentional blockfactory change (adding or removing a block state). */ @@ -28,7 +31,11 @@ require dirname(__DIR__, 3) . '/vendor/autoload.php'; $factory = new \pocketmine\block\BlockFactory(); $remaps = []; $new = []; -foreach($factory->getAllKnownStates() as $index => $block){ +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{ From e27f80fd859ca498a2bb29f77bd4889b724eb1c0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 21:06:33 +0100 Subject: [PATCH 0091/1858] Remove unused code --- src/data/bedrock/item/ItemSerializer.php | 30 +----------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 4f4a4e6858..0e9835ef8f 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -54,12 +54,6 @@ final class ItemSerializer{ */ private array $serializers = []; - /** - * @var \Closure[] - * @phpstan-var array> - */ - private array $blockItemSerializers = []; - public function __construct(){ $this->registerSerializers(); } @@ -81,20 +75,6 @@ final class ItemSerializer{ $this->serializers[$index][get_class($item)] = $serializer; } - /** - * @phpstan-param \Closure(ItemBlock) : Data $serializer - */ - public function mapBlock(Block $block, \Closure $serializer) : void{ - if(!$block->asItem() instanceof ItemBlock){ - throw new AssumptionFailedError("Mapped item must be an ItemBlock"); - } - $index = $block->getTypeId(); - if(isset($this->blockItemSerializers[$index])){ - throw new AssumptionFailedError("Registering the same item twice!"); - } - $this->blockItemSerializers[$index] = $serializer; - } - /** * @phpstan-template TItemType of Item * @phpstan-param TItemType $item @@ -104,15 +84,7 @@ final class ItemSerializer{ throw new \InvalidArgumentException("Cannot serialize a null itemstack"); } if($item instanceof ItemBlock){ - $block = $item->getBlock(); - $index = $block->getTypeId(); - $serializer = $this->blockItemSerializers[$index] ?? null; - - if($serializer !== null){ - $data = $serializer($item); - }else{ //assume that this is just a standard itemblock - $data = self::standardBlock($block); - } + $data = self::standardBlock($item->getBlock()); }else{ $index = ($item->getId() << 16) | ($item instanceof Durable ? 0 : $item->getMeta()); From 1a598bdfd82e38a13ed8f41444acaeaa37f4fcbc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 May 2022 21:20:28 +0100 Subject: [PATCH 0092/1858] RuntimeBlockMapping: make constructor more useful this allows providing more customisable data sources. --- .../mcpe/convert/RuntimeBlockMapping.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 2913e63c59..3fe5cea623 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -41,8 +41,6 @@ use function file_get_contents; final class RuntimeBlockMapping{ use SingletonTrait; - private BlockStateDictionary $blockStateDictionary; - private BlockStateSerializer $blockStateSerializer; /** * @var int[] * @phpstan-var array @@ -54,14 +52,18 @@ final class RuntimeBlockMapping{ private int $fallbackStateId; private static function make() : self{ - return new self(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")); + $canonicalBlockStatesFile = Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt"); + $contents = Utils::assumeNotFalse(file_get_contents($canonicalBlockStatesFile), "Missing required resource file"); + return new self( + BlockStateDictionary::loadFromString($contents), + GlobalBlockStateHandlers::getSerializer() + ); } - public function __construct(string $canonicalBlockStatesFile){ - $contents = Utils::assumeNotFalse(file_get_contents($canonicalBlockStatesFile), "Missing required resource file"); - $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); - $this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); - + public function __construct( + private BlockStateDictionary $blockStateDictionary, + private BlockStateSerializer $blockStateSerializer + ){ $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData($this->fallbackStateData) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); } From 643556a3663dec34b006e992f280f7bbd4d682f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 May 2022 13:35:58 +0100 Subject: [PATCH 0093/1858] Broaden scope of testing for item serializer/deserializer this change will cause failing tests; it has found a problem with coral fans of which I was previously unaware --- .../data/bedrock/item/ItemSerializerDeserializerTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index c841d72bb5..c50c723150 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; use PHPUnit\Framework\TestCase; -use pocketmine\block\VanillaBlocks; -use pocketmine\item\VanillaItems; +use pocketmine\block\BlockFactory; +use pocketmine\item\ItemFactory; final class ItemSerializerDeserializerTest extends TestCase{ @@ -38,7 +38,7 @@ final class ItemSerializerDeserializerTest extends TestCase{ } public function testAllVanillaItemsSerializableAndDeserializable() : void{ - foreach(VanillaItems::getAll() as $item){ + foreach(ItemFactory::getInstance()->getAllRegistered() as $item){ if($item->isNull()){ continue; } @@ -51,7 +51,7 @@ final class ItemSerializerDeserializerTest extends TestCase{ } public function testAllVanillaBlocksSerializableAndDeserializable() : void{ - foreach(VanillaBlocks::getAll() as $block){ + foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){ $item = $block->asItem(); if($item->isNull()){ continue; From a75bc5d537b73fd572d433fc4dd6ab50973c368d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 May 2022 20:50:38 +0100 Subject: [PATCH 0094/1858] Mojang cannot be relied on ... --- .../bedrock/blockstate/BlockStateData.php | 6 ++--- .../upgrade/BlockStateUpgradeSchema.php | 23 +++------------- .../upgrade/BlockStateUpgradeSchemaUtils.php | 11 ++++---- .../blockstate/upgrade/BlockStateUpgrader.php | 27 +++++++------------ 4 files changed, 22 insertions(+), 45 deletions(-) diff --git a/src/data/bedrock/blockstate/BlockStateData.php b/src/data/bedrock/blockstate/BlockStateData.php index 5d81152cac..355c87cd4c 100644 --- a/src/data/bedrock/blockstate/BlockStateData.php +++ b/src/data/bedrock/blockstate/BlockStateData.php @@ -38,9 +38,9 @@ final class BlockStateData{ */ public const CURRENT_VERSION = (1 << 24) | //major - (16 << 16) | //minor - (210 << 8) | //patch - (3); //revision + (18 << 16) | //minor + (10 << 8) | //patch + (1); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index e81d84ef5b..7f7fac1ecb 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -70,13 +70,16 @@ final class BlockStateUpgradeSchema{ public int $maxVersionMajor, public int $maxVersionMinor, public int $maxVersionPatch, - public int $maxVersionRevision + public int $maxVersionRevision, + private int $priority ){} public function getVersionId() : int{ return ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; } + public function getPriority() : int{ return $this->priority; } + public function isEmpty() : bool{ foreach([ $this->renamedIds, @@ -93,22 +96,4 @@ final class BlockStateUpgradeSchema{ return true; } - - public function isBackwardsCompatible() : bool{ - if($this->backwardsCompatible === null){ - $this->backwardsCompatible = true; - foreach([ - $this->renamedIds, - $this->removedProperties, - $this->remappedPropertyValues, - $this->remappedStates - ] as $bcBreakingRules){ - if(count($bcBreakingRules) !== 0){ - $this->backwardsCompatible = false; - } - } - } - //schemas which only add properties are backwards compatible - return $this->backwardsCompatible; - } } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 96135430b4..ae5753c767 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -111,12 +111,13 @@ final class BlockStateUpgradeSchemaUtils{ }; } - public static function fromJsonModel(BlockStateUpgradeSchemaModel $model) : BlockStateUpgradeSchema{ + public static function fromJsonModel(BlockStateUpgradeSchemaModel $model, int $priority) : BlockStateUpgradeSchema{ $result = new BlockStateUpgradeSchema( $model->maxVersionMajor, $model->maxVersionMinor, $model->maxVersionPatch, - $model->maxVersionRevision + $model->maxVersionRevision, + $priority ); $result->renamedIds = $model->renamedIds ?? []; $result->renamedProperties = $model->renamedProperties ?? []; @@ -280,7 +281,7 @@ final class BlockStateUpgradeSchemaUtils{ } try{ - $schema = self::loadSchemaFromString($raw); + $schema = self::loadSchemaFromString($raw, $priority); }catch(\RuntimeException $e){ throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); } @@ -298,7 +299,7 @@ final class BlockStateUpgradeSchemaUtils{ return $result; } - public static function loadSchemaFromString(string $raw) : BlockStateUpgradeSchema{ + public static function loadSchemaFromString(string $raw, int $priority) : BlockStateUpgradeSchema{ try{ $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); }catch(\JsonException $e){ @@ -315,6 +316,6 @@ final class BlockStateUpgradeSchemaUtils{ throw new \RuntimeException($e->getMessage(), 0, $e); } - return self::fromJsonModel($model); + return self::fromJsonModel($model, $priority); } } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index 28845d9dc4..f732401c40 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -27,7 +27,6 @@ use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; -use function array_unshift; use function ksort; use const SORT_NUMERIC; @@ -46,19 +45,16 @@ final class BlockStateUpgrader{ } public function addSchema(BlockStateUpgradeSchema $schema) : void{ - if(!$schema->isBackwardsCompatible()){ - $schemaList = $this->upgradeSchemas[$schema->getVersionId()] ?? []; - foreach($schemaList as $otherSchema){ - if(!$otherSchema->isBackwardsCompatible()){ - throw new \InvalidArgumentException("Cannot add two backwards-incompatible schemas with the same version"); - } - } - array_unshift($schemaList, $schema); - $this->upgradeSchemas[$schema->getVersionId()] = $schemaList; - }else{ - //Backwards-compatible schemas can be added in any order - $this->upgradeSchemas[$schema->getVersionId()][] = $schema; + $schemaList = $this->upgradeSchemas[$schema->getVersionId()] ?? []; + + $priority = $schema->getPriority(); + if(isset($schemaList[$priority])){ + throw new \InvalidArgumentException("Cannot add two schemas to the same version with the same priority"); } + $schemaList[$priority] = $schema; + ksort($schemaList, SORT_NUMERIC); + $this->upgradeSchemas[$schema->getVersionId()] = $schemaList; + ksort($this->upgradeSchemas, SORT_NUMERIC); } @@ -71,11 +67,6 @@ final class BlockStateUpgrader{ continue; } foreach($schemas as $schema){ - if(!$schema->isBackwardsCompatible() && $resultVersion === $version){ - //backwards-compatible updates typically don't bump version and must always be applied because we - //can't tell any different, but backwards-incompatible ones SHOULD always get their own version bump - continue; - } $oldName = $blockStateData->getName(); if(isset($schema->remappedStates[$oldName])){ foreach($schema->remappedStates[$oldName] as $remap){ From 4430f6c5fd445b39e1341cf61cf99bd737dc30cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 May 2022 20:51:23 +0100 Subject: [PATCH 0095/1858] Updated upgrade schemas --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 1b627715ea..4157e5a860 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "90aa2b01ba9c863ecb5818210235ad304b1b13b3" + "reference": "826fb285c7e8e6fd8e0f0184b9ce37813d5102f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/90aa2b01ba9c863ecb5818210235ad304b1b13b3", - "reference": "90aa2b01ba9c863ecb5818210235ad304b1b13b3", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/826fb285c7e8e6fd8e0f0184b9ce37813d5102f4", + "reference": "826fb285c7e8e6fd8e0f0184b9ce37813d5102f4", "shasum": "" }, "default-branch": true, @@ -272,7 +272,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-04-15T17:44:42+00:00" + "time": "2022-05-13T19:44:35+00:00" }, { "name": "pocketmine/bedrock-data", From 2f2ffe0aa4a8e2fbb5cf86e32110a1f83d4fd3af Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 May 2022 21:03:49 +0100 Subject: [PATCH 0096/1858] fix phpstan --- .../bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php | 2 -- .../data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php | 2 +- tools/generate-blockstate-upgrade-schema.php | 3 ++- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index 7f7fac1ecb..75e50a52e0 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -64,8 +64,6 @@ final class BlockStateUpgradeSchema{ */ public array $remappedStates = []; - private ?bool $backwardsCompatible = null; - public function __construct( public int $maxVersionMajor, public int $maxVersionMinor, diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php index 9decc4d887..bddda744f3 100644 --- a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php @@ -52,7 +52,7 @@ class BlockStateUpgraderTest extends TestCase{ } private function getNewSchemaVersion(int $versionId) : BlockStateUpgradeSchema{ - $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff); + $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff, 0); $this->upgrader->addSchema($schema); return $schema; } diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 54e773e222..e8e0a7988f 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -208,7 +208,8 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad ($foundVersion >> 24) & 0xff, ($foundVersion >> 16) & 0xff, ($foundVersion >> 8) & 0xff, - ($foundVersion & 0xff) + ($foundVersion & 0xff), + 0 ); foreach(Utils::stringifyKeys($upgradeTable) as $oldName => $blockStateMappings){ $newNameFound = []; From 901a51a9dd0f7ca41de592a4e56029c50167f1a5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 14:31:40 +0100 Subject: [PATCH 0097/1858] Added serialize/deserialize support for stonecutter --- .../convert/BlockObjectToBlockStateSerializer.php | 3 +++ .../convert/BlockStateToBlockObjectDeserializer.php | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index 88bce58ef2..e2a4ba8a78 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -108,6 +108,7 @@ use pocketmine\block\StainedHardenedGlass; use pocketmine\block\StainedHardenedGlassPane; use pocketmine\block\Stair; use pocketmine\block\StoneButton; +use pocketmine\block\Stonecutter; use pocketmine\block\StonePressurePlate; use pocketmine\block\Sugarcane; use pocketmine\block\SweetBerryBush; @@ -994,6 +995,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeColor($block->getColor()); }); $this->map(Blocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); + $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) + ->writeHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); $this->map(Blocks::STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_BRICK_STAIRS))); diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 323cdc63d4..0ad56d3003 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -932,6 +932,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; }); $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); + $this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ + return Blocks::STONECUTTER() + ->setFacing($in->readHorizontalFacing()); + }); $this->map(Ids::STRIPPED_ACACIA_LOG, function(Reader $in) : Block{ return Blocks::STRIPPED_ACACIA_LOG() ->setAxis($in->readPillarAxis()); @@ -2181,12 +2185,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); //$this->map(Ids::STRIPPED_CRIMSON_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block From 5ce5e1d2b020e40c18499abba96ae78e4f675d61 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 14:46:18 +0100 Subject: [PATCH 0098/1858] Throw proper exceptions for serialize/deserialize failures this allows them to be caught and properly reported in tests. --- .../BlockObjectToBlockStateSerializer.php | 2 ++ src/data/bedrock/item/ItemDeserializer.php | 34 ++++++++++--------- src/data/bedrock/item/ItemSerializer.php | 17 +++++++--- .../item/ItemTypeDeserializeException.php | 28 +++++++++++++++ .../item/ItemTypeSerializeException.php | 28 +++++++++++++++ 5 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 src/data/bedrock/item/ItemTypeDeserializeException.php create mode 100644 src/data/bedrock/item/ItemTypeSerializeException.php diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index e2a4ba8a78..322c812210 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -188,6 +188,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $blockState + * + * @throws BlockStateSerializeException */ public function serializeBlock(Block $blockState) : BlockStateData{ $typeId = $blockState->getTypeId(); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 6ecedd614d..5c91743b31 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -35,7 +35,6 @@ use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; -use pocketmine\data\SavedDataLoadingException; use pocketmine\item\Item; use pocketmine\item\PotionType; use pocketmine\item\VanillaItems as Items; @@ -64,13 +63,16 @@ final class ItemDeserializer{ $this->deserializers[$id] = $deserializer; } + /** + * @throws ItemTypeDeserializeException + */ public function deserialize(Data $data) : Item{ if(($blockData = $data->getBlock()) !== null){ //TODO: this is rough duct tape; we need a better way to deal with this try{ $block = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockData); }catch(BlockStateDeserializeException $e){ - throw new SavedDataLoadingException("Failed to deserialize item data: " . $e->getMessage(), 0, $e); + throw new ItemTypeDeserializeException("Failed to deserialize item data: " . $e->getMessage(), 0, $e); } //TODO: worth caching this or not? @@ -78,7 +80,7 @@ final class ItemDeserializer{ } $id = $data->getName(); if(!isset($this->deserializers[$id])){ - throw new SavedDataLoadingException("No deserializer found for ID $id"); + throw new ItemTypeDeserializeException("No deserializer found for ID $id"); } return ($this->deserializers[$id])($data); @@ -97,7 +99,7 @@ final class ItemDeserializer{ if($data->getMeta() === 0){ return Items::ARROW(); } - throw new SavedDataLoadingException("Tipped arrows are not implemented yet"); + throw new ItemTypeDeserializeException("Tipped arrows are not implemented yet"); }); //TODO: minecraft:axolotl_bucket //TODO: minecraft:axolotl_spawn_egg @@ -107,7 +109,7 @@ final class ItemDeserializer{ $meta = $data->getMeta(); $color = DyeColorIdMap::getInstance()->fromInvertedId($meta); if($color === null){ - throw new SavedDataLoadingException("Unknown banner meta $meta"); + throw new ItemTypeDeserializeException("Unknown banner meta $meta"); } return Items::BANNER()->setColor($color); }); @@ -117,7 +119,7 @@ final class ItemDeserializer{ $meta = $data->getMeta(); $color = DyeColorIdMap::getInstance()->fromId($meta); if($color === null){ - throw new SavedDataLoadingException("Unknown bed meta $meta"); + throw new ItemTypeDeserializeException("Unknown bed meta $meta"); } return Blocks::BED()->setColor($color)->asItem(); }); @@ -139,7 +141,7 @@ final class ItemDeserializer{ try{ $treeType = TreeType::fromMagicNumber($data->getMeta()); }catch(\InvalidArgumentException $e){ - throw new SavedDataLoadingException($e->getMessage(), 0, $e); + throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); } return match($treeType->id()){ TreeType::OAK()->id() => Items::OAK_BOAT(), @@ -229,7 +231,7 @@ final class ItemDeserializer{ CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), - default => throw new SavedDataLoadingException("Unknown chemical meta " . $data->getMeta()) + default => throw new ItemTypeDeserializeException("Unknown chemical meta " . $data->getMeta()) }); $this->map(Ids::COOKED_BEEF, fn() => Items::STEAK()); $this->map(Ids::COOKED_CHICKEN, fn() => Items::COOKED_CHICKEN()); @@ -284,7 +286,7 @@ final class ItemDeserializer{ } $dyeColor = DyeColorIdMap::getInstance()->fromInvertedId($meta); if($dyeColor === null){ - throw new SavedDataLoadingException("Unknown dye meta $meta"); + throw new ItemTypeDeserializeException("Unknown dye meta $meta"); } return match($dyeColor->id()){ DyeColor::CYAN()->id() => Items::CYAN_DYE(), @@ -475,7 +477,7 @@ final class ItemDeserializer{ $meta = $data->getMeta(); $potionType = PotionTypeIdMap::getInstance()->fromId($meta); if($potionType === null){ - throw new SavedDataLoadingException("Unknown potion type ID $meta"); + throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); } return match($potionType->id()){ PotionType::WATER()->id() => Items::WATER_POTION(), @@ -520,7 +522,7 @@ final class ItemDeserializer{ PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_POTION(), PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_POTION(), PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_POTION(), - default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName()) + default => throw new ItemTypeDeserializeException("Unhandled potion type " . $potionType->getDisplayName()) }; }); //TODO: minecraft:powder_snow_bucket @@ -565,7 +567,7 @@ final class ItemDeserializer{ try{ $skullType = SkullType::fromMagicNumber($meta); }catch(\InvalidArgumentException $e){ - throw new SavedDataLoadingException($e->getMessage(), 0, $e); + throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); } return match($skullType->id()) { SkullType::SKELETON()->id() => Items::SKELETON_SKULL(), @@ -574,7 +576,7 @@ final class ItemDeserializer{ SkullType::CREEPER()->id() => Items::CREEPER_HEAD(), SkullType::PLAYER()->id() => Items::PLAYER_HEAD(), SkullType::DRAGON()->id() => Items::DRAGON_HEAD(), - default => throw new SavedDataLoadingException("Unexpected skull type " . $skullType->getDisplayName()) + default => throw new ItemTypeDeserializeException("Unexpected skull type " . $skullType->getDisplayName()) }; }); //TODO: minecraft:skull_banner_pattern @@ -587,7 +589,7 @@ final class ItemDeserializer{ EntityLegacyIds::ZOMBIE => Items::ZOMBIE_SPAWN_EGG(), EntityLegacyIds::SQUID => Items::SQUID_SPAWN_EGG(), EntityLegacyIds::VILLAGER => Items::VILLAGER_SPAWN_EGG(), - default => throw new SavedDataLoadingException("Unhandled spawn egg meta " . $data->getMeta()) + default => throw new ItemTypeDeserializeException("Unhandled spawn egg meta " . $data->getMeta()) }); $this->map(Ids::SPIDER_EYE, fn() => Items::SPIDER_EYE()); //TODO: minecraft:spider_spawn_egg @@ -595,7 +597,7 @@ final class ItemDeserializer{ $meta = $data->getMeta(); $potionType = PotionTypeIdMap::getInstance()->fromId($meta); if($potionType === null){ - throw new SavedDataLoadingException("Unknown potion type ID $meta"); + throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); } return match($potionType->id()){ PotionType::WATER()->id() => Items::WATER_SPLASH_POTION(), @@ -640,7 +642,7 @@ final class ItemDeserializer{ PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_SPLASH_POTION(), PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_SPLASH_POTION(), - default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName()) + default => throw new ItemTypeDeserializeException("Unhandled potion type " . $potionType->getDisplayName()) }; }); $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 0e9835ef8f..d5bbcb1497 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\data\bedrock\BlockItemIdMap; +use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeIds as Ids; @@ -78,6 +79,8 @@ final class ItemSerializer{ /** * @phpstan-template TItemType of Item * @phpstan-param TItemType $item + * + * @throws ItemTypeSerializeException */ public function serialize(Item $item) : Data{ if($item->isNull()){ @@ -102,8 +105,7 @@ final class ItemSerializer{ } if($locatedSerializer === null){ - //TODO: proper exceptions - throw new \LogicException("No serializer registered for " . get_class($item) . " " . $item->getName()); + throw new ItemTypeSerializeException("No serializer registered for " . get_class($item) . " " . $item->getName()); } /** @@ -119,15 +121,22 @@ final class ItemSerializer{ return $data; } + /** + * @throws ItemTypeSerializeException + */ private static function standardBlock(Block $block) : Data{ - $blockStateData = GlobalBlockStateHandlers::getSerializer()->serialize($block->getFullId()); + try{ + $blockStateData = GlobalBlockStateHandlers::getSerializer()->serialize($block->getFullId()); + }catch(BlockStateSerializeException $e){ + throw new ItemTypeSerializeException($e->getMessage(), 0, $e); + } $itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName()); if($itemNameId === null){ //TODO: this might end up being a hassle for custom blocks, since it'll force providing an item //serializer for every custom block //it would probably be better if we allow adding custom item <-> block ID mappings for this - throw new \LogicException("No blockitem serializer or blockitem ID mapping registered for block " . $blockStateData->getName()); + throw new ItemTypeSerializeException("No blockitem serializer or blockitem ID mapping registered for block " . $blockStateData->getName()); } return new Data($itemNameId, 0, $blockStateData); diff --git a/src/data/bedrock/item/ItemTypeDeserializeException.php b/src/data/bedrock/item/ItemTypeDeserializeException.php new file mode 100644 index 0000000000..a55b9ab14d --- /dev/null +++ b/src/data/bedrock/item/ItemTypeDeserializeException.php @@ -0,0 +1,28 @@ + Date: Tue, 24 May 2022 14:47:46 +0100 Subject: [PATCH 0099/1858] Update unit tests --- .../BlockSerializerDeserializerTest.php | 14 +++++++++-- .../item/ItemSerializerDeserializerTest.php | 24 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php index 5bec77cc18..98a9e0b512 100644 --- a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php @@ -6,6 +6,8 @@ namespace pocketmine\data\bedrock\blockstate\convert; use PHPUnit\Framework\TestCase; use pocketmine\block\BlockFactory; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; final class BlockSerializerDeserializerTest extends TestCase{ private BlockStateToBlockObjectDeserializer $deserializer; @@ -18,8 +20,16 @@ final class BlockSerializerDeserializerTest extends TestCase{ public function testAllKnownBlockStatesSerializableAndDeserializable() : void{ foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){ - $blockStateData = $this->serializer->serializeBlock($block); - $newBlock = $this->deserializer->deserializeBlock($blockStateData); + try{ + $blockStateData = $this->serializer->serializeBlock($block); + }catch(BlockStateSerializeException $e){ + self::fail($e->getMessage()); + } + try{ + $newBlock = $this->deserializer->deserializeBlock($blockStateData); + }catch(BlockStateDeserializeException $e){ + self::fail($e->getMessage()); + } self::assertSame($block->getFullId(), $newBlock->getFullId(), "Mismatch of blockstate for " . $block->getName()); } diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index c50c723150..d3d92744bc 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -43,8 +43,16 @@ final class ItemSerializerDeserializerTest extends TestCase{ continue; } - $itemData = $this->serializer->serialize($item); - $newItem = $this->deserializer->deserialize($itemData); + try{ + $itemData = $this->serializer->serialize($item); + }catch(ItemTypeSerializeException $e){ + self::fail($e->getMessage()); + } + try{ + $newItem = $this->deserializer->deserialize($itemData); + }catch(ItemTypeDeserializeException $e){ + self::fail($e->getMessage()); + } self::assertTrue($item->equalsExact($newItem)); } @@ -57,8 +65,16 @@ final class ItemSerializerDeserializerTest extends TestCase{ continue; } - $itemData = $this->serializer->serialize($item); - $newItem = $this->deserializer->deserialize($itemData); + try{ + $itemData = $this->serializer->serialize($item); + }catch(ItemTypeSerializeException $e){ + self::fail($e->getMessage()); + } + try{ + $newItem = $this->deserializer->deserialize($itemData); + }catch(ItemTypeDeserializeException $e){ + self::fail($e->getMessage()); + } self::assertTrue($item->equalsExact($newItem)); } From 81eafde0744455e5ad7b717207d7a7a8bf3c598f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 15:07:38 +0100 Subject: [PATCH 0100/1858] Hacks for banners and coral fans --- src/data/bedrock/item/ItemSerializer.php | 4 +- src/item/CoralFan.php | 61 ++++++++++++++++++++++++ src/item/Item.php | 7 ++- src/item/ItemFactory.php | 21 ++------ src/item/ItemIdentifier.php | 2 +- src/item/ItemIdentifierFlattened.php | 41 ++++++++++++++++ 6 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 src/item/CoralFan.php create mode 100644 src/item/ItemIdentifierFlattened.php diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index d5bbcb1497..e8d73e60f7 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -68,7 +68,7 @@ final class ItemSerializer{ if($item->hasAnyDamageValue()){ throw new \InvalidArgumentException("Cannot serialize a recipe wildcard"); } - $index = ($item->getId() << 16) | $item->getMeta(); + $index = $item->getTypeId(); if(isset($this->serializers[$index])){ //TODO: REMOVE ME throw new AssumptionFailedError("Registering the same item twice!"); @@ -89,7 +89,7 @@ final class ItemSerializer{ if($item instanceof ItemBlock){ $data = self::standardBlock($item->getBlock()); }else{ - $index = ($item->getId() << 16) | ($item instanceof Durable ? 0 : $item->getMeta()); + $index = $item->getTypeId(); $locatedSerializer = $this->serializers[$index][get_class($item)] ?? null; if($locatedSerializer === null){ diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php new file mode 100644 index 0000000000..7cf055823e --- /dev/null +++ b/src/item/CoralFan.php @@ -0,0 +1,61 @@ +identifierFlattened, VanillaBlocks::CORAL_FAN()->getName()); + } + + public function getId() : int{ + return $this->dead ? $this->identifierFlattened->getAdditionalIds()[0] : $this->identifierFlattened->getId(); + } + + public function getMeta() : int{ + return CoralTypeIdMap::getInstance()->toId($this->coralType); + } + + public function getBlock(?int $clickedFace = null) : Block{ + $block = $clickedFace !== null && Facing::axis($clickedFace) !== Axis::Y ? VanillaBlocks::WALL_CORAL_FAN() : VanillaBlocks::CORAL_FAN(); + + return $block->setCoralType($this->coralType)->setDead($this->dead); + } + + public function getFuelTime() : int{ + return $this->getBlock()->getFuelTime(); + } + + public function getMaxStackSize() : int{ + return $this->getBlock()->getMaxStackSize(); + } +} \ No newline at end of file diff --git a/src/item/Item.php b/src/item/Item.php index eed7b0e206..a84d2b4e66 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -439,7 +439,12 @@ class Item implements \JsonSerializable{ return VanillaBlocks::AIR(); } - final public function getId() : int{ + final public function getTypeId() : int{ + //don't use Item::getMeta(), since it might be overridden for non-type information (e.g. durability) + return ($this->identifier->getId() << 16) | $this->identifier->getMeta(); + } + + public function getId() : int{ return $this->identifier->getId(); } diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index c3e6a1cfcf..3cc27ca88a 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -82,23 +82,10 @@ class ItemFactory{ $this->register(new Clownfish(new ItemIdentifier(ItemIds::CLOWNFISH, 0), "Clownfish")); $this->register(new Coal(new ItemIdentifier(ItemIds::COAL, 0), "Coal")); - foreach([ - 0 => CoralType::TUBE(), - 1 => CoralType::BRAIN(), - 2 => CoralType::BUBBLE(), - 3 => CoralType::FIRE(), - 4 => CoralType::HORN() - ] as $meta => $coralType){ - $this->register(new ItemBlockWallOrFloor( - new ItemIdentifier(ItemIds::CORAL_FAN, $meta), - VanillaBlocks::CORAL_FAN()->setCoralType($coralType)->setDead(false), - VanillaBlocks::WALL_CORAL_FAN()->setCoralType($coralType)->setDead(false) - ), true); - $this->register(new ItemBlockWallOrFloor( - new ItemIdentifier(ItemIds::CORAL_FAN_DEAD, $meta), - VanillaBlocks::CORAL_FAN()->setCoralType($coralType)->setDead(true), - VanillaBlocks::WALL_CORAL_FAN()->setCoralType($coralType)->setDead(true) - ), true); + $identifier = new ItemIdentifierFlattened(ItemIds::CORAL_FAN, 0, [ItemIds::CORAL_FAN_DEAD]); + foreach(CoralType::getAll() as $coralType){ + $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(false), true); + $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(true), true); } $this->register(new Coal(new ItemIdentifier(ItemIds::COAL, 1), "Charcoal")); diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index b24c586a9a..e7f440c0bf 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -final class ItemIdentifier{ +class ItemIdentifier{ private int $id; private int $meta; diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php new file mode 100644 index 0000000000..0690ece141 --- /dev/null +++ b/src/item/ItemIdentifierFlattened.php @@ -0,0 +1,41 @@ +additionalIds; } + + public function getAllIds() : array{ + return [$this->getId(), ...$this->additionalIds]; + } +} \ No newline at end of file From 24bd403e23e45f4cb5dc529052443d20b59d17d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 15:19:22 +0100 Subject: [PATCH 0101/1858] Updated VanillaItems --- src/item/VanillaItems.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 60694e8b5f..97feea180a 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -122,7 +122,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CookedRabbit COOKED_RABBIT() * @method static CookedSalmon COOKED_SALMON() * @method static Cookie COOKIE() - * @method static ItemBlockWallOrFloor CORAL_FAN() + * @method static CoralFan CORAL_FAN() * @method static Skull CREEPER_HEAD() * @method static Bed CYAN_BED() * @method static Dye CYAN_DYE() From 0fc24c94cd5a000524a49a8ce05cd48a4cd089f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 15:20:07 +0100 Subject: [PATCH 0102/1858] Fix PHPStan --- src/item/ItemIdentifierFlattened.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php index 0690ece141..fd732e9db9 100644 --- a/src/item/ItemIdentifierFlattened.php +++ b/src/item/ItemIdentifierFlattened.php @@ -35,6 +35,7 @@ final class ItemIdentifierFlattened extends ItemIdentifier{ /** @return int[] */ public function getAdditionalIds() : array{ return $this->additionalIds; } + /** @return int[] */ public function getAllIds() : array{ return [$this->getId(), ...$this->additionalIds]; } From d8dc32ec4b40bf2a992539a497ed74998562f149 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 15:22:23 +0100 Subject: [PATCH 0103/1858] PhpStorm sucks I'm very sure I enabled 'Ensure every file ends with a line break' ... --- src/data/bedrock/item/ItemSerializer.php | 1 - src/data/bedrock/item/ItemTypeDeserializeException.php | 2 +- src/data/bedrock/item/ItemTypeSerializeException.php | 2 +- src/item/CoralFan.php | 2 +- src/item/ItemIdentifierFlattened.php | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index e8d73e60f7..c55f4174e4 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -34,7 +34,6 @@ use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\item\Banner; -use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\PotionType; diff --git a/src/data/bedrock/item/ItemTypeDeserializeException.php b/src/data/bedrock/item/ItemTypeDeserializeException.php index a55b9ab14d..bbcb3f37a2 100644 --- a/src/data/bedrock/item/ItemTypeDeserializeException.php +++ b/src/data/bedrock/item/ItemTypeDeserializeException.php @@ -25,4 +25,4 @@ namespace pocketmine\data\bedrock\item; final class ItemTypeDeserializeException extends \RuntimeException{ -} \ No newline at end of file +} diff --git a/src/data/bedrock/item/ItemTypeSerializeException.php b/src/data/bedrock/item/ItemTypeSerializeException.php index 6174dc513f..f2d12c46f4 100644 --- a/src/data/bedrock/item/ItemTypeSerializeException.php +++ b/src/data/bedrock/item/ItemTypeSerializeException.php @@ -25,4 +25,4 @@ namespace pocketmine\data\bedrock\item; final class ItemTypeSerializeException extends \LogicException{ -} \ No newline at end of file +} diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index 7cf055823e..e276a0e411 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -58,4 +58,4 @@ final class CoralFan extends Item{ public function getMaxStackSize() : int{ return $this->getBlock()->getMaxStackSize(); } -} \ No newline at end of file +} diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php index fd732e9db9..974ff38b8a 100644 --- a/src/item/ItemIdentifierFlattened.php +++ b/src/item/ItemIdentifierFlattened.php @@ -39,4 +39,4 @@ final class ItemIdentifierFlattened extends ItemIdentifier{ public function getAllIds() : array{ return [$this->getId(), ...$this->additionalIds]; } -} \ No newline at end of file +} From 81b51c07919a6801c5bb6e7e3482a7cbc588eb16 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 21:29:20 +0100 Subject: [PATCH 0104/1858] fixing special block serialization --- src/data/bedrock/item/ItemSerializer.php | 116 +++++++++++++++++------ 1 file changed, 89 insertions(+), 27 deletions(-) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index c55f4174e4..492a967b39 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -26,6 +26,7 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; +use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\BlockItemIdMap; use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; use pocketmine\data\bedrock\CompoundTypeIds; @@ -34,6 +35,7 @@ use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\item\Banner; +use pocketmine\item\CoralFan; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\PotionType; @@ -44,7 +46,6 @@ use function class_parents; use function get_class; final class ItemSerializer{ - /** * These callables actually accept Item, but for the sake of type completeness, it has to be never, since we can't * describe the bottom type of a type hierarchy only containing Item. @@ -52,7 +53,13 @@ final class ItemSerializer{ * @var \Closure[][] * @phpstan-var array> */ - private array $serializers = []; + private array $itemSerializers = []; + + /** + * @var \Closure[][] + * @phpstan-var array> + */ + private array $blockItemSerializers = []; public function __construct(){ $this->registerSerializers(); @@ -68,11 +75,24 @@ final class ItemSerializer{ throw new \InvalidArgumentException("Cannot serialize a recipe wildcard"); } $index = $item->getTypeId(); - if(isset($this->serializers[$index])){ + if(isset($this->itemSerializers[$index])){ //TODO: REMOVE ME throw new AssumptionFailedError("Registering the same item twice!"); } - $this->serializers[$index][get_class($item)] = $serializer; + $this->itemSerializers[$index][get_class($item)] = $serializer; + } + + /** + * @phpstan-template TBlockType of Block + * @phpstan-param TBlockType $block + * @phpstan-param \Closure(TBlockType) : Data $serializer + */ + public function mapBlock(Block $block, \Closure $serializer) : void{ + $index = $block->getTypeId(); + if(isset($this->blockItemSerializers[$index])){ + throw new AssumptionFailedError("Registering the same blockitem twice!"); + } + $this->blockItemSerializers[$index][get_class($block)] = $serializer; } /** @@ -86,17 +106,17 @@ final class ItemSerializer{ throw new \InvalidArgumentException("Cannot serialize a null itemstack"); } if($item instanceof ItemBlock){ - $data = self::standardBlock($item->getBlock()); + $data = $this->serializeBlockItem($item->getBlock()); }else{ $index = $item->getTypeId(); - $locatedSerializer = $this->serializers[$index][get_class($item)] ?? null; + $locatedSerializer = $this->itemSerializers[$index][get_class($item)] ?? null; if($locatedSerializer === null){ $parents = class_parents($item); if($parents !== false){ foreach($parents as $parent){ - if(isset($this->serializers[$index][$parent])){ - $locatedSerializer = $this->serializers[$index][$parent]; + if(isset($this->itemSerializers[$index][$parent])){ + $locatedSerializer = $this->itemSerializers[$index][$parent]; break; } } @@ -120,6 +140,39 @@ final class ItemSerializer{ return $data; } + /** + * @phpstan-template TBlockType of Block + * @phpstan-param TBlockType $block + * + * @throws ItemTypeSerializeException + */ + private function serializeBlockItem(Block $block) : Data{ + $index = $block->getTypeId(); + + $locatedSerializer = $this->blockItemSerializers[$index][get_class($block)] ?? null; + if($locatedSerializer === null){ + $parents = class_parents($block); + if($parents !== false){ + foreach($parents as $parent){ + if(isset($this->blockItemSerializers[$index][$parent])){ + $locatedSerializer = $this->blockItemSerializers[$index][$parent]; + break; + } + } + } + } + + if($locatedSerializer !== null){ + /** @phpstan-var \Closure(TBlockType) : Data $serializer */ + $serializer = $locatedSerializer; + $data = $serializer($block); + }else{ + $data = self::standardBlock($block); + } + + return $data; + } + /** * @throws ItemTypeSerializeException */ @@ -130,24 +183,11 @@ final class ItemSerializer{ throw new ItemTypeSerializeException($e->getMessage(), 0, $e); } - $itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName()); - if($itemNameId === null){ - //TODO: this might end up being a hassle for custom blocks, since it'll force providing an item - //serializer for every custom block - //it would probably be better if we allow adding custom item <-> block ID mappings for this - throw new ItemTypeSerializeException("No blockitem serializer or blockitem ID mapping registered for block " . $blockStateData->getName()); - } + $itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName()) ?? $blockStateData->getName(); return new Data($itemNameId, 0, $blockStateData); } - /** - * @phpstan-return \Closure(Item) : Data - */ - private static function standardBlockWrapper() : \Closure{ - return fn(Item $item) => self::standardBlock($item->getBlock()); - } - /** * @phpstan-return \Closure() : Data */ @@ -194,12 +234,33 @@ final class ItemSerializer{ return fn() => new Data(Ids::SPLASH_POTION, $meta); } - private function registerSerializers() : void{ - //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock - $this->map(Items::BAMBOO(), self::standardBlockWrapper()); - $this->map(Items::CORAL_FAN(), self::standardBlockWrapper()); + private function registerSpecialBlockSerializers() : void{ + $this->mapBlock(Blocks::ACACIA_DOOR(), self::id(Ids::ACACIA_DOOR)); + $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); + $this->mapBlock(Blocks::BREWING_STAND(), self::id(Ids::BREWING_STAND)); + $this->mapBlock(Blocks::CAKE(), self::id(Ids::CAKE)); + $this->mapBlock(Blocks::DARK_OAK_DOOR(), self::id(Ids::DARK_OAK_DOOR)); + $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); + $this->mapBlock(Blocks::HOPPER(), self::id(Ids::HOPPER)); + $this->mapBlock(Blocks::IRON_DOOR(), self::id(Ids::IRON_DOOR)); + $this->mapBlock(Blocks::ITEM_FRAME(), self::id(Ids::FRAME)); + $this->mapBlock(Blocks::JUNGLE_DOOR(), self::id(Ids::JUNGLE_DOOR)); + $this->mapBlock(Blocks::NETHER_WART(), self::id(Ids::NETHER_WART)); + $this->mapBlock(Blocks::OAK_DOOR(), self::id(Ids::WOODEN_DOOR)); + $this->mapBlock(Blocks::REDSTONE_COMPARATOR(), self::id(Ids::COMPARATOR)); + $this->mapBlock(Blocks::REDSTONE_REPEATER(), self::id(Ids::REPEATER)); + $this->mapBlock(Blocks::SPRUCE_DOOR(), self::id(Ids::SPRUCE_DOOR)); + $this->mapBlock(Blocks::SUGARCANE(), self::id(Ids::SUGAR_CANE)); + } + + private function registerSerializers() : void{ + $this->registerSpecialBlockSerializers(); + + //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock + //Bamboo->getBlock() returns BambooSapling :( + $this->map(Items::BAMBOO(), fn() => self::standardBlock(Blocks::BAMBOO())); + $this->map(Items::CORAL_FAN(), fn(CoralFan $item) => self::standardBlock($item->getBlock())); - $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); $this->map(Items::APPLE(), self::id(Ids::APPLE)); @@ -207,6 +268,7 @@ final class ItemSerializer{ $this->map(Items::AWKWARD_POTION(), self::potion(PotionType::AWKWARD())); $this->map(Items::AWKWARD_SPLASH_POTION(), self::splashPotion(PotionType::AWKWARD())); $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); + $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); From 383be5426e46ca73a4efe5b09dde1aba65040add Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 21:44:57 +0100 Subject: [PATCH 0105/1858] Rewrite network item serialization to use ItemSerializer --- src/network/mcpe/convert/ItemTranslator.php | 180 ++++++-------------- src/network/mcpe/convert/TypeConverter.php | 50 ++---- 2 files changed, 64 insertions(+), 166 deletions(-) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 5dac8334a3..6bd8903331 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -23,145 +23,66 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\LegacyItemIdToStringIdMap; +use pocketmine\data\bedrock\item\ItemDeserializer; +use pocketmine\data\bedrock\item\ItemSerializer; +use pocketmine\data\bedrock\item\ItemTypeSerializeException; +use pocketmine\data\bedrock\item\SavedItemData; +use pocketmine\item\ItemFactory; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; -use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; -use function array_key_exists; -use function file_get_contents; -use function is_array; -use function is_numeric; -use function is_string; -use function json_decode; /** * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. */ final class ItemTranslator{ + public const NO_BLOCK_RUNTIME_ID = 0; + use SingletonTrait; - /** - * @var int[] - * @phpstan-var array - */ - private array $simpleCoreToNetMapping = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $simpleNetToCoreMapping = []; - - /** - * runtimeId = array[internalId][metadata] - * @var int[][] - * @phpstan-var array> - */ - private array $complexCoreToNetMapping = []; - /** - * [internalId, metadata] = array[runtimeId] - * @var int[][] - * @phpstan-var array - */ - private array $complexNetToCoreMapping = []; - private static function make() : self{ - $data = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, 'r16_to_current_item_map.json')), "Missing required resource file"); - $json = json_decode($data, true); - if(!is_array($json) || !isset($json["simple"], $json["complex"]) || !is_array($json["simple"]) || !is_array($json["complex"])){ - throw new AssumptionFailedError("Invalid item table format"); - } - - $legacyStringToIntMap = LegacyItemIdToStringIdMap::getInstance(); - - /** @phpstan-var array $simpleMappings */ - $simpleMappings = []; - foreach($json["simple"] as $oldId => $newId){ - if(!is_string($oldId) || !is_string($newId)){ - throw new AssumptionFailedError("Invalid item table format"); - } - $intId = $legacyStringToIntMap->stringToLegacy($oldId); - if($intId === null){ - //new item without a fixed legacy ID - we can't handle this right now - continue; - } - $simpleMappings[$newId] = $intId; - } - foreach(Utils::stringifyKeys($legacyStringToIntMap->getStringToLegacyMap()) as $stringId => $intId){ - if(isset($simpleMappings[$stringId])){ - throw new \UnexpectedValueException("Old ID $stringId collides with new ID"); - } - $simpleMappings[$stringId] = $intId; - } - - /** @phpstan-var array $complexMappings */ - $complexMappings = []; - foreach($json["complex"] as $oldId => $map){ - if(!is_string($oldId) || !is_array($map)){ - throw new AssumptionFailedError("Invalid item table format"); - } - foreach($map as $meta => $newId){ - if(!is_numeric($meta) || !is_string($newId)){ - throw new AssumptionFailedError("Invalid item table format"); - } - $intId = $legacyStringToIntMap->stringToLegacy($oldId); - if($intId === null){ - //new item without a fixed legacy ID - we can't handle this right now - continue; - } - $complexMappings[$newId] = [$intId, (int) $meta]; - } - } - - return new self(GlobalItemTypeDictionary::getInstance()->getDictionary(), $simpleMappings, $complexMappings); + return new self(GlobalItemTypeDictionary::getInstance()->getDictionary(), new ItemSerializer(), new ItemDeserializer()); } - /** - * @param int[] $simpleMappings - * @param int[][] $complexMappings - * @phpstan-param array $simpleMappings - * @phpstan-param array> $complexMappings - */ - public function __construct(ItemTypeDictionary $dictionary, array $simpleMappings, array $complexMappings){ - foreach($dictionary->getEntries() as $entry){ - $stringId = $entry->getStringId(); - $netId = $entry->getNumericId(); - if(isset($complexMappings[$stringId])){ - [$id, $meta] = $complexMappings[$stringId]; - $this->complexCoreToNetMapping[$id][$meta] = $netId; - $this->complexNetToCoreMapping[$netId] = [$id, $meta]; - }elseif(isset($simpleMappings[$stringId])){ - $this->simpleCoreToNetMapping[$simpleMappings[$stringId]] = $netId; - $this->simpleNetToCoreMapping[$netId] = $simpleMappings[$stringId]; - }else{ - //not all items have a legacy mapping - for now, we only support the ones that do - continue; - } - } - } + public function __construct( + private ItemTypeDictionary $dictionary, + private ItemSerializer $itemSerializer, + private ItemDeserializer $itemDeserializer + ){} /** * @return int[]|null - * @phpstan-return array{int, int}|null + * @phpstan-return array{int, int, int}|null */ public function toNetworkIdQuiet(int $internalId, int $internalMeta) : ?array{ - if($internalMeta === -1){ - $internalMeta = 0x7fff; - } - if(isset($this->complexCoreToNetMapping[$internalId][$internalMeta])){ - return [$this->complexCoreToNetMapping[$internalId][$internalMeta], 0]; - } - if(array_key_exists($internalId, $this->simpleCoreToNetMapping)){ - return [$this->simpleCoreToNetMapping[$internalId], $internalMeta]; + //TODO: we should probably come up with a cache for this + + try{ + $itemData = $this->itemSerializer->serialize(ItemFactory::getInstance()->get($internalId, $internalMeta)); + }catch(ItemTypeSerializeException){ + //TODO: this will swallow any serializer error; this is not ideal, but it should be OK since unit tests + //should cover this + return null; } - return null; + $numericId = $this->dictionary->fromStringId($itemData->getName()); + $blockStateData = $itemData->getBlock(); + + if($blockStateData !== null){ + $blockRuntimeId = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->lookupStateIdFromData($blockStateData); + if($blockRuntimeId === null){ + throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); + } + }else{ + $blockRuntimeId = self::NO_BLOCK_RUNTIME_ID; //this is technically a valid block runtime ID, but is used to represent "no block" (derp mojang) + } + + return [$numericId, $itemData->getMeta(), $blockRuntimeId]; } /** * @return int[] - * @phpstan-return array{int, int} + * @phpstan-return array{int, int, int} */ public function toNetworkId(int $internalId, int $internalMeta) : array{ return $this->toNetworkIdQuiet($internalId, $internalMeta) ?? @@ -173,19 +94,15 @@ final class ItemTranslator{ * @phpstan-return array{int, int} * @throws TypeConversionException */ - public function fromNetworkId(int $networkId, int $networkMeta, ?bool &$isComplexMapping = null) : array{ - if(isset($this->complexNetToCoreMapping[$networkId])){ - if($networkMeta !== 0){ - throw new TypeConversionException("Unexpected non-zero network meta on complex item mapping"); - } - $isComplexMapping = true; - return $this->complexNetToCoreMapping[$networkId]; - } - $isComplexMapping = false; - if(isset($this->simpleNetToCoreMapping[$networkId])){ - return [$this->simpleNetToCoreMapping[$networkId], $networkMeta]; - } - throw new TypeConversionException("Unmapped network ID/metadata combination $networkId:$networkMeta"); + public function fromNetworkId(int $networkId, int $networkMeta, int $networkBlockRuntimeId) : array{ + $stringId = $this->dictionary->fromIntId($networkId); + + $blockStateData = $networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID ? + RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getDataFromStateId($networkBlockRuntimeId) : + null; + + $item = $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); + return [$item->getId(), $item->getMeta()]; } /** @@ -194,11 +111,10 @@ final class ItemTranslator{ * @throws TypeConversionException */ public function fromNetworkIdWithWildcardHandling(int $networkId, int $networkMeta) : array{ - $isComplexMapping = false; if($networkMeta !== 0x7fff){ - return $this->fromNetworkId($networkId, $networkMeta); + return $this->fromNetworkId($networkId, $networkMeta, 0); } - [$id, $meta] = $this->fromNetworkId($networkId, 0, $isComplexMapping); - return [$id, $isComplexMapping ? $meta : -1]; + [$id, ] = $this->fromNetworkId($networkId, 0, 0); + return [$id, -1]; } } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index e010a27e93..e590ae5d8a 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -22,7 +22,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\block\BlockLegacyIds; use pocketmine\block\inventory\AnvilInventory; use pocketmine\block\inventory\CraftingTableInventory; use pocketmine\block\inventory\EnchantInventory; @@ -37,6 +36,7 @@ use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\item\ItemIds; +use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; @@ -141,20 +141,18 @@ class TypeConverter{ $nbt = clone $itemStack->getNamedTag(); } - $isBlockItem = $itemStack->getId() < 256; - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack->getId(), $itemStack->getMeta()); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with //other unmapped items. - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId(ItemIds::INFO_UPDATE, 0); + [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId(ItemIds::INFO_UPDATE, 0); if($nbt === null){ $nbt = new CompoundTag(); } $nbt->setInt(self::PM_ID_TAG, $itemStack->getId()); $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); }else{ - [$id, $meta] = $idMeta; + [$id, $meta, $blockRuntimeId] = $idMeta; if($itemStack instanceof Durable && $itemStack->getDamage() > 0){ if($nbt !== null){ @@ -166,22 +164,6 @@ class TypeConverter{ $nbt = new CompoundTag(); } $nbt->setInt(self::DAMAGE_TAG, $itemStack->getDamage()); - }elseif($isBlockItem && $itemStack->getMeta() !== 0){ - //TODO HACK: This foul-smelling code ensures that we can correctly deserialize an item when the - //client sends it back to us, because as of 1.16.220, blockitems quietly discard their metadata - //client-side. Aside from being very annoying, this also breaks various server-side behaviours. - if($nbt === null){ - $nbt = new CompoundTag(); - } - $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); - } - } - - $blockRuntimeId = 0; - if($isBlockItem){ - $block = $itemStack->getBlock(); - if($block->getId() !== BlockLegacyIds::AIR){ - $blockRuntimeId = RuntimeBlockMapping::getInstance()->toRuntimeId($block->getFullId()); } } @@ -202,17 +184,24 @@ class TypeConverter{ */ public function netItemStackToCore(ItemStack $itemStack) : Item{ if($itemStack->getId() === 0){ - return ItemFactory::getInstance()->get(ItemIds::AIR, 0, 0); + return VanillaItems::AIR(); } $compound = $itemStack->getNbt(); - [$id, $meta] = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta()); + [$id, $meta] = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); if($compound !== null){ $compound = clone $compound; - if(($idTag = $compound->getTag(self::PM_ID_TAG)) instanceof IntTag){ - $id = $idTag->getValue(); - $compound->removeTag(self::PM_ID_TAG); + + if($id === ItemIds::INFO_UPDATE && $meta === 0){ + if(($idTag = $compound->getTag(self::PM_ID_TAG)) instanceof IntTag){ + $id = $idTag->getValue(); + $compound->removeTag(self::PM_ID_TAG); + } + if(($metaTag = $compound->getTag(self::PM_META_TAG)) instanceof IntTag){ + $meta = $metaTag->getValue(); + $compound->removeTag(self::PM_META_TAG); + } } if(($damageTag = $compound->getTag(self::DAMAGE_TAG)) instanceof IntTag){ $meta = $damageTag->getValue(); @@ -221,14 +210,7 @@ class TypeConverter{ $compound->removeTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION); $compound->setTag(self::DAMAGE_TAG, $conflicted); } - }elseif(($metaTag = $compound->getTag(self::PM_META_TAG)) instanceof IntTag){ - //TODO HACK: This foul-smelling code ensures that we can correctly deserialize an item when the - //client sends it back to us, because as of 1.16.220, blockitems quietly discard their metadata - //client-side. Aside from being very annoying, this also breaks various server-side behaviours. - $meta = $metaTag->getValue(); - $compound->removeTag(self::PM_META_TAG); - } - if($compound->count() === 0){ + }elseif($compound->count() === 0){ $compound = null; } } From 2b27b8a2308bf87fd626d20f27e427943340579f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 May 2022 21:52:10 +0100 Subject: [PATCH 0106/1858] fixed fucky wucky --- src/network/mcpe/convert/TypeConverter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index e590ae5d8a..c62f95d16d 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -210,7 +210,8 @@ class TypeConverter{ $compound->removeTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION); $compound->setTag(self::DAMAGE_TAG, $conflicted); } - }elseif($compound->count() === 0){ + } + if($compound->count() === 0){ $compound = null; } } From 776b8d2f95a9466c522cb223ec337a3d4a038a42 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 25 May 2022 21:56:17 +0100 Subject: [PATCH 0107/1858] Harden BlockStateDeserializer further against bugs --- .../convert/BlockStateDeserializerHelper.php | 7 ++ .../blockstate/convert/BlockStateReader.php | 38 +++++++++ .../BlockStateToBlockObjectDeserializer.php | 80 ++++++++++++------- 3 files changed, 98 insertions(+), 27 deletions(-) diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php index 52760d47cb..7b7fcb9a58 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php @@ -182,6 +182,7 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeStem(Stem $block, BlockStateReader $in) : Stem{ //TODO: our stems don't support facings yet (facing_direction) + $in->todo(BlockStateNames::FACING_DIRECTION); return self::decodeCrops($block, $in); } @@ -196,6 +197,12 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeWall(Wall $block, BlockStateReader $in) : Wall{ //TODO: our walls don't support the full range of needed states yet + $in->todo(BlockStateNames::WALL_POST_BIT); //TODO + $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_EAST); + $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_NORTH); + $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH); + $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_WEST); + return $block; } diff --git a/src/data/bedrock/blockstate/convert/BlockStateReader.php b/src/data/bedrock/blockstate/convert/BlockStateReader.php index 5ced88381d..c85fc9e574 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateReader.php +++ b/src/data/bedrock/blockstate/convert/BlockStateReader.php @@ -41,6 +41,12 @@ use function get_class; final class BlockStateReader{ + /** + * @var true[] + * @phpstan-var array + */ + private array $usedStates = []; + public function __construct( private BlockStateData $data ){} @@ -58,6 +64,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBool(string $name) : bool{ + $this->usedStates[$name] = true; $tag = $this->data->getStates()->getTag($name); if($tag instanceof ByteTag){ switch($tag->getValue()){ @@ -71,6 +78,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readInt(string $name) : int{ + $this->usedStates[$name] = true; $tag = $this->data->getStates()->getTag($name); if($tag instanceof IntTag){ return $tag->getValue(); @@ -89,6 +97,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readString(string $name) : string{ + $this->usedStates[$name] = true; //TODO: only allow a specific set of values (strings are primarily used for enums) $tag = $this->data->getStates()->getTag($name); if($tag instanceof StringTag){ @@ -286,4 +295,33 @@ final class BlockStateReader{ default => throw $this->badValueException(BlockStateNames::ATTACHMENT, $type), }; } + + /** + * Explicitly mark a property as unused, so it doesn't get flagged as an error when debug mode is enabled + */ + public function ignored(string $name) : void{ + if($this->data->getStates()->getTag($name) !== null){ + $this->usedStates[$name] = true; + }else{ + throw $this->missingOrWrongTypeException($name, null); + } + } + + /** + * Used to mark unused properties that haven't been implemented yet + */ + public function todo(string $name) : void{ + $this->ignored($name); + } + + /** + * @throws BlockStateDeserializeException + */ + public function checkUnreadProperties() : void{ + foreach($this->data->getStates() as $name => $tag){ + if(!isset($this->usedStates[$name])){ + throw new BlockStateDeserializeException("Unread property \"$name\""); + } + } + } } diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 0ad56d3003..753cee806f 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -112,7 +112,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); }); $this->map(Ids::BAMBOO_SAPLING, function(Reader $in) : Block{ - //TODO: sapling_type intentionally ignored (its presence is a bug) + $in->ignored(StateNames::SAPLING_TYPE); //bug in MCPE return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT)); }); $this->map(Ids::BARREL, function(Reader $in) : Block{ @@ -134,7 +134,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::BEETROOT, fn(Reader $in) => Helper::decodeCrops(Blocks::BEETROOTS(), $in)); $this->map(Ids::BELL, function(Reader $in) : Block{ - //TODO: ignored toggle_bit (appears to be internally used in MCPE only, useless for us) + $in->ignored(StateNames::TOGGLE_BIT); //only useful at runtime return Blocks::BELL() ->setFacing($in->readLegacyHorizontalFacing()) ->setAttachmentType($in->readBellAttachmentType()); @@ -156,7 +156,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BLUE_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ - //TODO: intentionally ignored "deprecated" blockstate (useless) + $in->ignored(StateNames::DEPRECATED); return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); }); $this->map(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); @@ -248,8 +248,13 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); - $this->map(Ids::CORAL_FAN_HANG3, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType(CoralType::HORN())); + $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ + if($in->readBool(StateNames::CORAL_HANG_TYPE_BIT)){ + throw $in->badValueException(StateNames::CORAL_HANG_TYPE_BIT, "1", "This should always be zero for hang3"); + } + return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType(CoralType::HORN()); + }); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::CYAN_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); @@ -294,18 +299,23 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); $this->map(Ids::DOUBLE_STONE_SLAB, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); }); $this->map(Ids::DOUBLE_STONE_SLAB2, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); }); $this->map(Ids::DOUBLE_STONE_SLAB3, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); }); $this->map(Ids::DOUBLE_STONE_SLAB4, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); }); $this->map(Ids::DOUBLE_WOODEN_SLAB, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); }); $this->map(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); @@ -469,14 +479,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); $this->map(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); - $this->map(Ids::FLOWER_POT, function() : Block{ - //TODO: ignored update_bit (only useful on network to make the client actually render contents, not needed on disk) + $this->map(Ids::FLOWER_POT, function(Reader $in) : Block{ + $in->ignored(StateNames::UPDATE_BIT); return Blocks::FLOWER_POT(); }); $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in)); $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in)); $this->map(Ids::FRAME, function(Reader $in) : Block{ //TODO: in R13 this can be any side, not just horizontal + $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is return Blocks::ITEM_FRAME() ->setFacing($in->readHorizontalFacing()) ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); @@ -519,7 +530,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ - //TODO: intentionally ignored "deprecated" blockstate (useless) + $in->ignored(StateNames::DEPRECATED); return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); }); $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); @@ -724,30 +735,42 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::PRISMARINE_BRICKS_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), $in)); $this->map(Ids::PRISMARINE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_STAIRS(), $in)); - $this->map(Ids::PUMPKIN, function() : Block{ - //TODO: intentionally ignored "direction" property (obsolete) + $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ + $in->ignored(StateNames::DIRECTION); //obsolete return Blocks::PUMPKIN(); }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::PURPLE_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::PURPUR_BLOCK, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_DEFAULT => Blocks::PURPUR(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()), - default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), - }; + $type = $in->readString(StateNames::CHISEL_TYPE); + if($type === StringValues::CHISEL_TYPE_LINES){ + return Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()); + }else{ + $in->ignored(StateNames::PILLAR_AXIS); //axis only applies to pillars + return match($type){ + StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE + StringValues::CHISEL_TYPE_DEFAULT => Blocks::PURPUR(), + default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), + }; + } }); $this->map(Ids::PURPUR_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PURPUR_STAIRS(), $in)); $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::CHISEL_TYPE)){ - StringValues::CHISEL_TYPE_CHISELED => Blocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_DEFAULT => Blocks::QUARTZ(), //TODO: axis intentionally ignored (useless) - StringValues::CHISEL_TYPE_LINES => Blocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()), - StringValues::CHISEL_TYPE_SMOOTH => Blocks::SMOOTH_QUARTZ(), //TODO: axis intentionally ignored (useless) - default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), - }; + switch($type = $in->readString(StateNames::CHISEL_TYPE)){ + case StringValues::CHISEL_TYPE_CHISELED: + return Blocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()); + case StringValues::CHISEL_TYPE_DEFAULT: + $in->ignored(StateNames::PILLAR_AXIS); + return Blocks::QUARTZ(); + case StringValues::CHISEL_TYPE_LINES: + return Blocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()); + case StringValues::CHISEL_TYPE_SMOOTH: + $in->ignored(StateNames::PILLAR_AXIS); + return Blocks::SMOOTH_QUARTZ(); + default: + return throw $in->badValueException(StateNames::CHISEL_TYPE, $type); + } }); $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->map(Ids::QUARTZ_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::QUARTZ_STAIRS(), $in)); @@ -865,7 +888,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); $this->map(Ids::SNOW, fn() => Blocks::SNOW()); $this->map(Ids::SNOW_LAYER, function(Reader $in) : Block{ - //TODO: intentionally ignored covered_bit property (appears useless and we don't track it) + $in->ignored(StateNames::COVERED_BIT); //seems to be useless return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); }); $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); @@ -1032,7 +1055,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::WHITE_GLAZED_TERRACOTTA(), $in)); $this->map(Ids::WOOD, function(Reader $in) : Block{ - //TODO: our impl doesn't support axis yet + $in->todo(StateNames::PILLAR_AXIS); //TODO: our impl doesn't support axis yet $stripped = $in->readBool(StateNames::STRIPPED_BIT); return match($woodType = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_ACACIA => $stripped ? Blocks::STRIPPED_ACACIA_WOOD() : Blocks::ACACIA_WOOD(), @@ -2513,6 +2536,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize if(!array_key_exists($id, $this->deserializeFuncs)){ throw new BlockStateDeserializeException("Unknown block ID \"$id\""); } - return $this->deserializeFuncs[$id](new Reader($blockStateData)); + $reader = new Reader($blockStateData); + $block = $this->deserializeFuncs[$id]($reader); + $reader->checkUnreadProperties(); + return $block; } } From bd8dd48deebc28346e18e51da715fd79d8b6a532 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 27 May 2022 16:51:35 +0100 Subject: [PATCH 0108/1858] Assign new IDs to every block --- src/block/Block.php | 20 +- src/block/BlockFactory.php | 897 ++++++++++++------------- src/block/BlockIdentifier.php | 46 +- src/block/BlockIdentifierFlattened.php | 29 +- src/block/BlockLegacyIdHelper.php | 254 ++++--- src/block/BlockTypeIds.php | 581 ++++++++++++++++ src/block/FlowerPot.php | 2 +- src/block/WallCoralFan.php | 4 +- tests/phpunit/block/BlockTest.php | 10 +- 9 files changed, 1276 insertions(+), 567 deletions(-) create mode 100644 src/block/BlockTypeIds.php diff --git a/src/block/Block.php b/src/block/Block.php index c388dd58a4..0e221b2a11 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -65,8 +65,8 @@ 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->getVariant() & $this->getStateBitmask()) !== 0){ - throw new \InvalidArgumentException("Variant 0x" . dechex($idInfo->getVariant()) . " collides with state bitmask 0x" . dechex($this->getStateBitmask())); + 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; @@ -86,8 +86,11 @@ class Block{ return $this->fallbackName; } + /** + * @deprecated + */ public function getId() : int{ - return $this->idInfo->getBlockId(); + return $this->idInfo->getLegacyBlockId(); } /** @@ -99,15 +102,18 @@ class Block{ public function asItem() : Item{ return ItemFactory::getInstance()->get( - $this->idInfo->getItemId(), - $this->idInfo->getVariant() | $this->writeStateToItemMeta() + $this->idInfo->getLegacyItemId(), + $this->idInfo->getLegacyVariant() | $this->writeStateToItemMeta() ); } + /** + * @deprecated + */ public function getMeta() : int{ $stateMeta = $this->writeStateToMeta(); assert(($stateMeta & ~$this->getStateBitmask()) === 0); - return $this->idInfo->getVariant() | $stateMeta; + return $this->idInfo->getLegacyVariant() | $stateMeta; } protected function writeStateToItemMeta() : int{ @@ -171,7 +177,7 @@ class Block{ * powered/unpowered, etc. */ public function getTypeId() : int{ - return ($this->idInfo->getBlockId() << Block::INTERNAL_METADATA_BITS) | $this->idInfo->getVariant(); + return $this->idInfo->getBlockTypeId(); } /** diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index eca2992af1..879b512173 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -26,9 +26,10 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockIdentifierFlattened as BIDFlattened; -use pocketmine\block\BlockLegacyIds as Ids; +use pocketmine\block\BlockLegacyIds as LegacyIds; use pocketmine\block\BlockLegacyMetadata as Meta; use pocketmine\block\BlockToolType as ToolType; +use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\tile\Beacon as TileBeacon; @@ -112,10 +113,10 @@ class BlockFactory{ public function __construct(){ $railBreakInfo = new BlockBreakInfo(0.7); - $this->registerAllMeta(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); - $this->registerAllMeta(new Air(new BID(Ids::AIR, 0), "Air", BreakInfo::indestructible(-1.0))); - $this->registerAllMeta(new Anvil(new BID(Ids::ANVIL, 0), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); - $this->registerAllMeta(new Bamboo(new BID(Ids::BAMBOO, 0), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ + $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{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SWORD){ return 0.0; @@ -123,235 +124,235 @@ class BlockFactory{ return parent::getBreakTime($item); } })); - $this->registerAllMeta(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); + $this->registerAllMeta(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::STANDING_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); - $this->registerAllMeta(new WallBanner(new BID(Ids::WALL_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - $this->registerAllMeta(new Barrel(new BID(Ids::BARREL, 0, null, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new Transparent(new BID(Ids::BARRIER, 0), "Barrier", BreakInfo::indestructible())); - $this->registerAllMeta(new Beacon(new BID(Ids::BEACON, 0, null, TileBeacon::class), "Beacon", new BreakInfo(3.0))); - $this->registerAllMeta(new Bed(new BID(Ids::BED_BLOCK, 0, ItemIds::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); - $this->registerAllMeta(new Bedrock(new BID(Ids::BEDROCK, 0), "Bedrock", BreakInfo::indestructible())); + $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->registerAllMeta(new Beetroot(new BID(Ids::BEETROOT_BLOCK, 0), "Beetroot Block", BreakInfo::instant())); - $this->registerAllMeta(new Bell(new BID(Ids::BELL, 0, null, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new BlueIce(new BID(Ids::BLUE_ICE, 0), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - $this->registerAllMeta(new BoneBlock(new BID(Ids::BONE_BLOCK, 0), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Bookshelf(new BID(Ids::BOOKSHELF, 0), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - $this->registerAllMeta(new BrewingStand(new BID(Ids::BREWING_STAND_BLOCK, 0, ItemIds::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $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()))); $bricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Stair(new BID(Ids::BRICK_STAIRS, 0), "Brick Stairs", $bricksBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::BRICK_BLOCK, 0), "Bricks", $bricksBreakInfo)); + $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->registerAllMeta(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM, 0), "Brown Mushroom", BreakInfo::instant())); - $this->registerAllMeta(new Cactus(new BID(Ids::CACTUS, 0), "Cactus", new BreakInfo(0.4))); - $this->registerAllMeta(new Cake(new BID(Ids::CAKE_BLOCK, 0, ItemIds::CAKE), "Cake", new BreakInfo(0.5))); - $this->registerAllMeta(new Carrot(new BID(Ids::CARROTS, 0), "Carrot Block", BreakInfo::instant())); + $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())); $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); - $this->registerAllMeta(new Chest(new BID(Ids::CHEST, 0, null, TileChest::class), "Chest", $chestBreakInfo)); - $this->registerAllMeta(new Clay(new BID(Ids::CLAY_BLOCK, 0), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->registerAllMeta(new Coal(new BID(Ids::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, 0), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $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()))); $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta($cobblestone = new Opaque(new BID(Ids::COBBLESTONE, 0), "Cobblestone", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::MOSSY_COBBLESTONE, 0), "Mossy Cobblestone", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::COBBLESTONE_STAIRS, 0), "Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS, 0), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); + $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->registerAllMeta(new Cobweb(new BID(Ids::COBWEB, 0), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - $this->registerAllMeta(new CocoaBlock(new BID(Ids::COCOA, 0), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - $this->registerAllMeta(new CoralBlock(new BID(Ids::CORAL_BLOCK, 0), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new CraftingTable(new BID(Ids::CRAFTING_TABLE, 0), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new DaylightSensor(new BIDFlattened(Ids::DAYLIGHT_DETECTOR, [Ids::DAYLIGHT_DETECTOR_INVERTED], 0, null, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); - $this->registerAllMeta(new DeadBush(new BID(Ids::DEADBUSH, 0), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->registerAllMeta(new DetectorRail(new BID(Ids::DETECTOR_RAIL, 0), "Detector Rail", $railBreakInfo)); + $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->registerAllMeta(new Opaque(new BID(Ids::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, 0), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new Dirt(new BID(Ids::DIRT, 0), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + $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::DOUBLE_PLANT, Meta::DOUBLE_PLANT_SUNFLOWER), "Sunflower", BreakInfo::instant()), - new DoublePlant(new BID(Ids::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LILAC), "Lilac", BreakInfo::instant()), - new DoublePlant(new BID(Ids::DOUBLE_PLANT, Meta::DOUBLE_PLANT_ROSE_BUSH), "Rose Bush", BreakInfo::instant()), - new DoublePlant(new BID(Ids::DOUBLE_PLANT, Meta::DOUBLE_PLANT_PEONY), "Peony", BreakInfo::instant()), - new DoubleTallGrass(new BID(Ids::DOUBLE_PLANT, Meta::DOUBLE_PLANT_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1)), - new DoubleTallGrass(new BID(Ids::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1)), + 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, 0), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new DriedKelp(new BID(Ids::DRIED_KELP_BLOCK, 0), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - $this->registerAllMeta(new Opaque(new BID(Ids::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, 0), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new EnchantingTable(new BID(Ids::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, 0), "End Portal Frame", BreakInfo::indestructible())); - $this->registerAllMeta(new EndRod(new BID(Ids::END_ROD, 0), "End Rod", BreakInfo::instant())); - $this->registerAllMeta(new Opaque(new BID(Ids::END_STONE, 0), "End Stone", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 45.0))); + $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))); $endBrickBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 4.0); - $this->registerAllMeta(new Opaque(new BID(Ids::END_BRICKS, 0), "End Stone Bricks", $endBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::END_BRICK_STAIRS, 0), "End Stone Brick Stairs", $endBrickBreakInfo)); + $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->registerAllMeta(new EnderChest(new BID(Ids::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, 0), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->registerAllMeta(new Fire(new BID(Ids::FIRE, 0), "Fire Block", BreakInfo::instant())); - $this->registerAllMeta(new FletchingTable(new BID(Ids::FLETCHING_TABLE, 0), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); - $this->registerAllMeta(new Flower(new BID(Ids::DANDELION, 0), "Dandelion", BreakInfo::instant())); + $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::RED_FLOWER, Meta::FLOWER_POPPY), "Poppy", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_ALLIUM), "Allium", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_AZURE_BLUET), "Azure Bluet", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_BLUE_ORCHID), "Blue Orchid", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_CORNFLOWER), "Cornflower", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_ORANGE_TULIP), "Orange Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_PINK_TULIP), "Pink Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_RED_TULIP), "Red Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::RED_FLOWER, Meta::FLOWER_WHITE_TULIP), "White Tulip", BreakInfo::instant()), + 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_BLOCK, 0, ItemIds::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - $this->registerAllMeta(new FrostedIce(new BID(Ids::FROSTED_ICE, 0), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Furnace(new BIDFlattened(Ids::FURNACE, [Ids::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, [Ids::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, [Ids::LIT_SMOKER], 0, null, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $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()))); $glassBreakInfo = new BreakInfo(0.3); - $this->registerAllMeta(new Glass(new BID(Ids::GLASS, 0), "Glass", $glassBreakInfo)); - $this->registerAllMeta(new GlassPane(new BID(Ids::GLASS_PANE, 0), "Glass Pane", $glassBreakInfo)); - $this->registerAllMeta(new GlowingObsidian(new BID(Ids::GLOWINGOBSIDIAN, 0), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); - $this->registerAllMeta(new Glowstone(new BID(Ids::GLOWSTONE, 0), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - $this->registerAllMeta(new Opaque(new BID(Ids::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, 0), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $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()))); $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); - $this->registerAllMeta(new Grass(new BID(Ids::GRASS, 0), "Grass", $grassBreakInfo)); - $this->registerAllMeta(new GrassPath(new BID(Ids::GRASS_PATH, 0), "Grass Path", $grassBreakInfo)); - $this->registerAllMeta(new Gravel(new BID(Ids::GRAVEL, 0), "Gravel", 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))); $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->registerAllMeta(new HardenedClay(new BID(Ids::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); + $this->registerAllMeta(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::HARD_GLASS, 0), "Hardened Glass", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new HardenedGlassPane(new BID(Ids::HARD_GLASS_PANE, 0), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new HayBale(new BID(Ids::HAY_BALE, 0), "Hay Bale", new BreakInfo(0.5))); - $this->registerAllMeta(new Hopper(new BID(Ids::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, 0), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $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))); $updateBlockBreakInfo = new BreakInfo(1.0); - $this->registerAllMeta(new Opaque(new BID(Ids::INFO_UPDATE, 0), "update!", $updateBlockBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::INFO_UPDATE2, 0), "ate!upd", $updateBlockBreakInfo)); - $this->registerAllMeta(new Transparent(new BID(Ids::INVISIBLEBEDROCK, 0), "Invisible Bedrock", BreakInfo::indestructible())); + $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())); $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Opaque(new BID(Ids::IRON_BLOCK, 0), "Iron Block", $ironBreakInfo)); - $this->registerAllMeta(new Thin(new BID(Ids::IRON_BARS, 0), "Iron Bars", $ironBreakInfo)); + $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)); $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); - $this->registerAllMeta(new Door(new BID(Ids::IRON_DOOR_BLOCK, 0, ItemIds::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); - $this->registerAllMeta(new Trapdoor(new BID(Ids::IRON_TRAPDOOR, 0), "Iron Trapdoor", $ironDoorBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::IRON_ORE, 0), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new ItemFrame(new BID(Ids::FRAME_BLOCK, 0, ItemIds::FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - $this->registerAllMeta(new Jukebox(new BID(Ids::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, 0), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - $this->registerAllMeta(new Lantern(new BID(Ids::LANTERN, 0), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Opaque(new BID(Ids::LAPIS_BLOCK, 0), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new LapisOre(new BID(Ids::LAPIS_ORE, 0), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new Lava(new BIDFlattened(Ids::FLOWING_LAVA, [Ids::STILL_LAVA], 0), "Lava", BreakInfo::indestructible(500.0))); - $this->registerAllMeta(new Lectern(new BID(Ids::LECTERN, 0, ItemIds::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); - $this->registerAllMeta(new Lever(new BID(Ids::LEVER, 0), "Lever", new BreakInfo(0.5))); - $this->registerAllMeta(new Loom(new BID(Ids::LOOM, 0), "Loom", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new Magma(new BID(Ids::MAGMA, 0), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Melon(new BID(Ids::MELON_BLOCK, 0), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); - $this->registerAllMeta(new MelonStem(new BID(Ids::MELON_STEM, 0, ItemIds::MELON_SEEDS), "Melon Stem", BreakInfo::instant())); - $this->registerAllMeta(new MonsterSpawner(new BID(Ids::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, 0), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); + $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))); $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Opaque(new BID(Ids::NETHER_BRICK_BLOCK, 0), "Nether Bricks", $netherBrickBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::RED_NETHER_BRICK, 0), "Red Nether Bricks", $netherBrickBreakInfo)); - $this->registerAllMeta(new Fence(new BID(Ids::NETHER_BRICK_FENCE, 0), "Nether Brick Fence", $netherBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::NETHER_BRICK_STAIRS, 0), "Nether Brick Stairs", $netherBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS, 0), "Red Nether Brick Stairs", $netherBrickBreakInfo)); - $this->registerAllMeta(new NetherPortal(new BID(Ids::PORTAL, 0), "Nether Portal", BreakInfo::indestructible(0.0))); - $this->registerAllMeta(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE, 0), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new NetherReactor(new BID(Ids::NETHERREACTOR, 0), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Opaque(new BID(Ids::NETHER_WART_BLOCK, 0), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); - $this->registerAllMeta(new NetherWartPlant(new BID(Ids::NETHER_WART_PLANT, 0, ItemIds::NETHER_WART), "Nether Wart", BreakInfo::instant())); - $this->registerAllMeta(new Netherrack(new BID(Ids::NETHERRACK, 0), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Note(new BID(Ids::NOTEBLOCK, 0, null, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); - $this->registerAllMeta(new Opaque(new BID(Ids::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, 0), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Podzol(new BID(Ids::PODZOL, 0), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Potato(new BID(Ids::POTATOES, 0), "Potato Block", BreakInfo::instant())); - $this->registerAllMeta(new PoweredRail(new BID(Ids::GOLDEN_RAIL, 0), "Powered Rail", $railBreakInfo)); + $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)); $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); $this->registerAllMeta( - new Opaque(new BID(Ids::PRISMARINE, Meta::PRISMARINE_NORMAL), "Prismarine", $prismarineBreakInfo), - new Opaque(new BID(Ids::PRISMARINE, Meta::PRISMARINE_DARK), "Dark Prismarine", $prismarineBreakInfo), - new Opaque(new BID(Ids::PRISMARINE, Meta::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo) + 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, 0), "Prismarine Bricks Stairs", $prismarineBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS, 0), "Dark Prismarine Stairs", $prismarineBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::PRISMARINE_STAIRS, 0), "Prismarine Stairs", $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)); $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->registerAllMeta(new Pumpkin(new BID(Ids::PUMPKIN, 0), "Pumpkin", $pumpkinBreakInfo)); - $this->registerAllMeta(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN, 0), "Carved Pumpkin", $pumpkinBreakInfo)); - $this->registerAllMeta(new LitPumpkin(new BID(Ids::JACK_O_LANTERN, 0), "Jack o'Lantern", $pumpkinBreakInfo)); + $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->registerAllMeta(new PumpkinStem(new BID(Ids::PUMPKIN_STEM, 0, ItemIds::PUMPKIN_SEEDS), "Pumpkin Stem", BreakInfo::instant())); + $this->registerAllMeta(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_BLOCK, Meta::PURPUR_NORMAL), "Purpur Block", $purpurBreakInfo), - new SimplePillar(new BID(Ids::PURPUR_BLOCK, Meta::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo) + 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, 0), "Purpur Stairs", $purpurBreakInfo)); + $this->registerAllMeta(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_BLOCK, Meta::QUARTZ_NORMAL), "Quartz Block", $quartzBreakInfo), - new SimplePillar(new BID(Ids::QUARTZ_BLOCK, Meta::QUARTZ_CHISELED), "Chiseled Quartz Block", $quartzBreakInfo), - new SimplePillar(new BID(Ids::QUARTZ_BLOCK, Meta::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo), - new Opaque(new BID(Ids::QUARTZ_BLOCK, Meta::QUARTZ_SMOOTH), "Smooth Quartz Block", $quartzBreakInfo) //TODO: we may need to account for the fact this previously incorrectly had axis + 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, 0), "Quartz Stairs", $quartzBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS, 0), "Smooth Quartz Stairs", $quartzBreakInfo)); + $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->registerAllMeta(new Rail(new BID(Ids::RAIL, 0), "Rail", $railBreakInfo)); - $this->registerAllMeta(new RedMushroom(new BID(Ids::RED_MUSHROOM, 0), "Red Mushroom", BreakInfo::instant())); - $this->registerAllMeta(new Redstone(new BID(Ids::REDSTONE_BLOCK, 0), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new RedstoneComparator(new BIDFlattened(Ids::UNPOWERED_COMPARATOR, [Ids::POWERED_COMPARATOR], 0, ItemIds::COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneLamp(new BIDFlattened(Ids::REDSTONE_LAMP, [Ids::LIT_REDSTONE_LAMP], 0), "Redstone Lamp", new BreakInfo(0.3))); - $this->registerAllMeta(new RedstoneOre(new BIDFlattened(Ids::REDSTONE_ORE, [Ids::LIT_REDSTONE_ORE], 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new RedstoneRepeater(new BIDFlattened(Ids::UNPOWERED_REPEATER, [Ids::POWERED_REPEATER], 0, ItemIds::REPEATER), "Redstone Repeater", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneTorch(new BIDFlattened(Ids::REDSTONE_TORCH, [Ids::UNLIT_REDSTONE_TORCH], 0), "Redstone Torch", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneWire(new BID(Ids::REDSTONE_WIRE, 0, ItemIds::REDSTONE), "Redstone", BreakInfo::instant())); - $this->registerAllMeta(new Reserved6(new BID(Ids::RESERVED6, 0), "reserved6", BreakInfo::instant())); + $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())); $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); $this->registerAllMeta( - new Sand(new BID(Ids::SAND, 0), "Sand", $sandBreakInfo), - new Sand(new BID(Ids::SAND, 1), "Red Sand", $sandBreakInfo) + 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::SEALANTERN, 0), "Sea Lantern", new BreakInfo(0.3))); - $this->registerAllMeta(new SeaPickle(new BID(Ids::SEA_PICKLE, 0), "Sea Pickle", BreakInfo::instant())); - $this->registerAllMeta(new Skull(new BID(Ids::MOB_HEAD_BLOCK, 0, ItemIds::SKULL, TileSkull::class), "Mob Head", new BreakInfo(1.0))); - $this->registerAllMeta(new Slime(new BID(Ids::SLIME, 0), "Slime Block", BreakInfo::instant())); - $this->registerAllMeta(new Snow(new BID(Ids::SNOW, 0), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new SnowLayer(new BID(Ids::SNOW_LAYER, 0), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new SoulSand(new BID(Ids::SOUL_SAND, 0), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Sponge(new BID(Ids::SPONGE, 0), "Sponge", new BreakInfo(0.6, ToolType::HOE))); + $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))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - $this->registerAllMeta(new ShulkerBox(new BID(Ids::UNDYED_SHULKER_BOX, 0, null, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + $this->registerAllMeta(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( - $stone = new class(new BID(Ids::STONE, Meta::STONE_NORMAL), "Stone", $stoneBreakInfo) extends Opaque{ + $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,109 +361,109 @@ class BlockFactory{ return true; } }, - new Opaque(new BID(Ids::STONE, Meta::STONE_ANDESITE), "Andesite", $stoneBreakInfo), - new Opaque(new BID(Ids::STONE, Meta::STONE_DIORITE), "Diorite", $stoneBreakInfo), - new Opaque(new BID(Ids::STONE, Meta::STONE_GRANITE), "Granite", $stoneBreakInfo), - new Opaque(new BID(Ids::STONE, Meta::STONE_POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo), - new Opaque(new BID(Ids::STONE, Meta::STONE_POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo), - new Opaque(new BID(Ids::STONE, Meta::STONE_POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo) + 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::STONEBRICK, Meta::STONE_BRICK_NORMAL), "Stone Bricks", $stoneBreakInfo), - $mossyStoneBrick = new Opaque(new BID(Ids::STONEBRICK, Meta::STONE_BRICK_MOSSY), "Mossy Stone Bricks", $stoneBreakInfo), - $crackedStoneBrick = new Opaque(new BID(Ids::STONEBRICK, Meta::STONE_BRICK_CRACKED), "Cracked Stone Bricks", $stoneBreakInfo), - $chiseledStoneBrick = new Opaque(new BID(Ids::STONEBRICK, Meta::STONE_BRICK_CHISELED), "Chiseled Stone Bricks", $stoneBreakInfo) + $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) ); $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); $this->registerAllMeta( - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone), - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick), - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone), - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_MOSSY), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick), - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CRACKED), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick), - new InfestedStone(new BID(Ids::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CHISELED), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick) + 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::NORMAL_STONE_STAIRS, 0), "Stone Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::SMOOTH_STONE, 0), "Smooth Stone", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::ANDESITE_STAIRS, 0), "Andesite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::DIORITE_STAIRS, 0), "Diorite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::GRANITE_STAIRS, 0), "Granite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS, 0), "Polished Andesite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS, 0), "Polished Diorite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS, 0), "Polished Granite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::STONE_BRICK_STAIRS, 0), "Stone Brick Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS, 0), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new StoneButton(new BID(Ids::STONE_BUTTON, 0), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Stonecutter(new BID(Ids::STONECUTTER_BLOCK, 0, ItemIds::STONECUTTER_BLOCK), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - $this->registerAllMeta(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE, 0), "Stone Pressure Plate", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $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()))); //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); - $getStoneSlabId = static fn(int $stoneSlabId, int $meta) => BlockLegacyIdHelper::getStoneSlabIdentifier($stoneSlabId, $meta); + $getStoneSlabId = static fn(int $blockTypeId, int $stoneSlabId, int $meta) => BlockLegacyIdHelper::getStoneSlabIdentifier($blockTypeId, $stoneSlabId, $meta); foreach([ - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_BRICK), "Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_COBBLESTONE), "Cobblestone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_FAKE_WOODEN), "Fake Wooden", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_NETHER_BRICK), "Nether Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_QUARTZ), "Quartz", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_SANDSTONE), "Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_SMOOTH_STONE), "Smooth Stone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(1, Meta::STONE_SLAB_STONE_BRICK), "Stone Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_DARK_PRISMARINE), "Dark Prismarine", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_MOSSY_COBBLESTONE), "Mossy Cobblestone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_PRISMARINE), "Prismarine", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_PRISMARINE_BRICKS), "Prismarine Bricks", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_PURPUR), "Purpur", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_RED_NETHER_BRICK), "Red Nether Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_RED_SANDSTONE), "Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(2, Meta::STONE_SLAB2_SMOOTH_SANDSTONE), "Smooth Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_ANDESITE), "Andesite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_DIORITE), "Diorite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_END_STONE_BRICK), "End Stone Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_GRANITE), "Granite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_POLISHED_ANDESITE), "Polished Andesite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_POLISHED_DIORITE), "Polished Diorite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_POLISHED_GRANITE), "Polished Granite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(3, Meta::STONE_SLAB3_SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(4, Meta::STONE_SLAB4_CUT_RED_SANDSTONE), "Cut Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(4, Meta::STONE_SLAB4_CUT_SANDSTONE), "Cut Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(4, Meta::STONE_SLAB4_MOSSY_STONE_BRICK), "Mossy Stone Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(4, Meta::STONE_SLAB4_SMOOTH_QUARTZ), "Smooth Quartz", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(4, Meta::STONE_SLAB4_STONE), "Stone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::BRICK_SLAB, 1, Meta::STONE_SLAB_BRICK), "Brick", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::COBBLESTONE_SLAB, 1, Meta::STONE_SLAB_COBBLESTONE), "Cobblestone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::FAKE_WOODEN_SLAB, 1, Meta::STONE_SLAB_FAKE_WOODEN), "Fake Wooden", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::NETHER_BRICK_SLAB, 1, Meta::STONE_SLAB_NETHER_BRICK), "Nether Brick", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::QUARTZ_SLAB, 1, Meta::STONE_SLAB_QUARTZ), "Quartz", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::SANDSTONE_SLAB, 1, Meta::STONE_SLAB_SANDSTONE), "Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::SMOOTH_STONE_SLAB, 1, Meta::STONE_SLAB_SMOOTH_STONE), "Smooth Stone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::STONE_BRICK_SLAB, 1, Meta::STONE_SLAB_STONE_BRICK), "Stone Brick", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::DARK_PRISMARINE_SLAB, 2, Meta::STONE_SLAB2_DARK_PRISMARINE), "Dark Prismarine", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::MOSSY_COBBLESTONE_SLAB, 2, Meta::STONE_SLAB2_MOSSY_COBBLESTONE), "Mossy Cobblestone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::PRISMARINE_SLAB, 2, Meta::STONE_SLAB2_PRISMARINE), "Prismarine", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::PRISMARINE_BRICKS_SLAB, 2, Meta::STONE_SLAB2_PRISMARINE_BRICKS), "Prismarine Bricks", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::PURPUR_SLAB, 2, Meta::STONE_SLAB2_PURPUR), "Purpur", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::RED_NETHER_BRICK_SLAB, 2, Meta::STONE_SLAB2_RED_NETHER_BRICK), "Red Nether Brick", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::RED_SANDSTONE_SLAB, 2, Meta::STONE_SLAB2_RED_SANDSTONE), "Red Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::SMOOTH_SANDSTONE_SLAB, 2, Meta::STONE_SLAB2_SMOOTH_SANDSTONE), "Smooth Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::ANDESITE_SLAB, 3, Meta::STONE_SLAB3_ANDESITE), "Andesite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::DIORITE_SLAB, 3, Meta::STONE_SLAB3_DIORITE), "Diorite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::END_STONE_BRICK_SLAB, 3, Meta::STONE_SLAB3_END_STONE_BRICK), "End Stone Brick", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::GRANITE_SLAB, 3, Meta::STONE_SLAB3_GRANITE), "Granite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::POLISHED_ANDESITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_ANDESITE), "Polished Andesite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::POLISHED_DIORITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_DIORITE), "Polished Diorite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::POLISHED_GRANITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_GRANITE), "Polished Granite", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::SMOOTH_RED_SANDSTONE_SLAB, 3, Meta::STONE_SLAB3_SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::CUT_RED_SANDSTONE_SLAB, 4, Meta::STONE_SLAB4_CUT_RED_SANDSTONE), "Cut Red Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::CUT_SANDSTONE_SLAB, 4, Meta::STONE_SLAB4_CUT_SANDSTONE), "Cut Sandstone", $stoneSlabBreakInfo), + new Slab($getStoneSlabId(Ids::MOSSY_STONE_BRICK_SLAB, 4, Meta::STONE_SLAB4_MOSSY_STONE_BRICK), "Mossy Stone Brick", $stoneSlabBreakInfo), + 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->registerAllMeta(new Opaque(new BID(Ids::STONECUTTER, 0), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Sugarcane(new BID(Ids::REEDS_BLOCK, 0, ItemIds::REEDS), "Sugarcane", BreakInfo::instant())); - $this->registerAllMeta(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH, 0, ItemIds::SWEET_BERRIES), "Sweet Berry Bush", BreakInfo::instant())); - $this->registerAllMeta(new TNT(new BID(Ids::TNT, 0), "TNT", BreakInfo::instant())); + $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::TALLGRASS, Meta::TALLGRASS_FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1)), - new TallGrass(new BID(Ids::TALLGRASS, Meta::TALLGRASS_NORMAL), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1)) + 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::COLORED_TORCH_BP, 0), "Blue Torch", BreakInfo::instant()), - new Torch(new BID(Ids::COLORED_TORCH_BP, 8), "Purple Torch", BreakInfo::instant()) + 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::COLORED_TORCH_RG, 0), "Red Torch", BreakInfo::instant()), - new Torch(new BID(Ids::COLORED_TORCH_RG, 8), "Green Torch", BreakInfo::instant()) + 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, 0), "Torch", BreakInfo::instant())); - $this->registerAllMeta(new TrappedChest(new BID(Ids::TRAPPED_CHEST, 0, null, TileChest::class), "Trapped Chest", $chestBreakInfo)); - $this->registerAllMeta(new Tripwire(new BID(Ids::TRIPWIRE, 0, ItemIds::STRING), "Tripwire", BreakInfo::instant())); - $this->registerAllMeta(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK, 0), "Tripwire Hook", BreakInfo::instant())); - $this->registerAllMeta(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH, 0), "Underwater Torch", BreakInfo::instant())); - $this->registerAllMeta(new Vine(new BID(Ids::VINE, 0), "Vines", new BreakInfo(0.2, ToolType::AXE))); - $this->registerAllMeta(new Water(new BIDFlattened(Ids::FLOWING_WATER, [Ids::STILL_WATER], 0), "Water", BreakInfo::indestructible(500.0))); - $this->registerAllMeta(new WaterLily(new BID(Ids::LILY_PAD, 0), "Lily Pad", 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())); $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta(new WeightedPressurePlateHeavy(new BID(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); - $this->registerAllMeta(new WeightedPressurePlateLight(new BID(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); - $this->registerAllMeta(new Wheat(new BID(Ids::WHEAT_BLOCK, 0), "Wheat Block", BreakInfo::instant())); + $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())); $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ @@ -487,23 +488,23 @@ class BlockFactory{ foreach(TreeType::getAll() as $treeType){ $magicNumber = $treeType->getMagicNumber(); $name = $treeType->getDisplayName(); - $planks[] = new Planks(new BID(Ids::PLANKS, $magicNumber), $name . " Planks", $planksBreakInfo); - $saplings[] = new Sapling(new BID(Ids::SAPLING, $magicNumber), $name . " Sapling", BreakInfo::instant(), $treeType); - $fences[] = new WoodenFence(new BID(Ids::FENCE, $magicNumber), $name . " Fence", $planksBreakInfo); - $this->registerSlabWithDoubleHighBitsRemapping(new WoodenSlab(new BIDFlattened(Ids::WOODEN_SLAB, [Ids::DOUBLE_WOODEN_SLAB], $magicNumber), $name, $planksBreakInfo)); + $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)); //TODO: find a better way to deal with this split - $leaves[] = new Leaves(new BID($magicNumber >= 4 ? Ids::LEAVES2 : Ids::LEAVES, $magicNumber & 0x03), $name . " Leaves", $leavesBreakInfo, $treeType); + $leaves[] = new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType); - $this->register(new Log(new BID($magicNumber >= 4 ? Ids::LOG2 : Ids::LOG, $magicNumber & 0x03), $name . " Log", $logBreakInfo, $treeType, false)); - $wood = new Wood(new BID(Ids::WOOD, $magicNumber), $name . " Wood", $logBreakInfo, $treeType, false); - $this->remap($magicNumber >= 4 ? Ids::LOG2 : Ids::LOG, ($magicNumber & 0x03) | 0b1100, $wood); + $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); $allSidedLogs[] = $wood; - $allSidedLogs[] = new Wood(new BID(Ids::WOOD, $magicNumber | BlockLegacyMetadata::WOOD_FLAG_STRIPPED), "Stripped $name Wood", $logBreakInfo, $treeType, true); + $allSidedLogs[] = 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::getWoodenFenceIdentifier($treeType), $name . " Fence Gate", $planksBreakInfo)); + $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)); @@ -520,25 +521,23 @@ class BlockFactory{ $this->registerAllMeta(...$leaves); $this->registerAllMeta(...$allSidedLogs); - static $sandstoneTypes = [ - Meta::SANDSTONE_NORMAL => "", - Meta::SANDSTONE_CHISELED => "Chiseled ", - Meta::SANDSTONE_CUT => "Cut ", - Meta::SANDSTONE_SMOOTH => "Smooth " - ]; $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS, 0), "Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 0), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SANDSTONE_STAIRS, 0), "Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS, 0), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); - $sandstones = []; - $redSandstones = []; - foreach($sandstoneTypes as $variant => $prefix){ - $sandstones[] = new Opaque(new BID(Ids::SANDSTONE, $variant), $prefix . "Sandstone", $sandstoneBreakInfo); - $redSandstones[] = new Opaque(new BID(Ids::RED_SANDSTONE, $variant), $prefix . "Red Sandstone", $sandstoneBreakInfo); - } - $this->registerAllMeta(...$sandstones); - $this->registerAllMeta(...$redSandstones); + $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), + ); $glazedTerracottaBreakInfo = new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); foreach(DyeColor::getAll() as $color){ @@ -547,16 +546,16 @@ class BlockFactory{ }; $this->registerAllMeta(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); } - $this->registerAllMeta(new DyedShulkerBox(new BID(Ids::SHULKER_BOX, 0, null, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); - $this->registerAllMeta(new StainedGlass(new BID(Ids::STAINED_GLASS, 0), "Stained Glass", $glassBreakInfo)); - $this->registerAllMeta(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE, 0), "Stained Glass Pane", $glassBreakInfo)); - $this->registerAllMeta(new StainedHardenedClay(new BID(Ids::STAINED_CLAY, 0), "Stained Clay", $hardenedClayBreakInfo)); - $this->registerAllMeta(new StainedHardenedGlass(new BID(Ids::HARD_STAINED_GLASS, 0), "Stained Hardened Glass", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new StainedHardenedGlassPane(new BID(Ids::HARD_STAINED_GLASS_PANE, 0), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new Carpet(new BID(Ids::CARPET, 0), "Carpet", new BreakInfo(0.1))); - $this->registerAllMeta(new Concrete(new BID(Ids::CONCRETE, 0), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new ConcretePowder(new BID(Ids::CONCRETE_POWDER, 0), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Wool(new BID(Ids::WOOL, 0), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ + $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{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); if($item->getBlockToolType() === ToolType::SHEARS){ @@ -570,48 +569,48 @@ 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, Meta::WALL_COBBLESTONE), "Cobblestone Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_ANDESITE), "Andesite Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_BRICK), "Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_DIORITE), "Diorite Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_END_STONE_BRICK), "End Stone Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_GRANITE), "Granite Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_MOSSY_STONE_BRICK), "Mossy Stone Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_MOSSY_COBBLESTONE), "Mossy Cobblestone Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_NETHER_BRICK), "Nether Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_PRISMARINE), "Prismarine Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_RED_NETHER_BRICK), "Red Nether Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_RED_SANDSTONE), "Red Sandstone Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_SANDSTONE), "Sandstone Wall", $wallBreakInfo), - new Wall(new BID(Ids::COBBLESTONE_WALL, Meta::WALL_STONE_BRICK), "Stone Brick Wall", $wallBreakInfo), + 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->registerElements(); $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); $this->registerAllMeta( - new ChemistryTable(new BID(Ids::CHEMISTRY_TABLE, Meta::CHEMISTRY_COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::CHEMISTRY_TABLE, Meta::CHEMISTRY_ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::CHEMISTRY_TABLE, Meta::CHEMISTRY_LAB_TABLE), "Lab Table", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::CHEMISTRY_TABLE, Meta::CHEMISTRY_MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo) + 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->registerAllMeta(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); + $this->registerAllMeta(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, LegacyIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); $this->registerMushroomBlocks(); $this->registerAllMeta(new Coral( - new BID(Ids::CORAL, 0), + new BID(Ids::CORAL, LegacyIds::CORAL, 0), "Coral", BreakInfo::instant(), )); $this->registerAllMeta(new FloorCoralFan( - new BlockIdentifierFlattened(Ids::CORAL_FAN, [Ids::CORAL_FAN_DEAD], 0, ItemIds::CORAL_FAN), + new BlockIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, [LegacyIds::CORAL_FAN_DEAD], 0, ItemIds::CORAL_FAN), "Coral Fan", BreakInfo::instant(), )); $this->registerAllMeta(new WallCoralFan( - new BlockIdentifierFlattened(Ids::CORAL_FAN_HANG, [Ids::CORAL_FAN_HANG2, Ids::CORAL_FAN_HANG3], 0, ItemIds::CORAL_FAN), + 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(), )); @@ -758,8 +757,8 @@ class BlockFactory{ $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); $mushroomBlocks = [ - new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK, 0), "Brown Mushroom Block", $mushroomBlockBreakInfo), - new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK, 0), "Red Mushroom Block", $mushroomBlockBreakInfo) + 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 @@ -790,136 +789,136 @@ class BlockFactory{ } //finally, the stems - $mushroomStem = new MushroomStem(new BID(Ids::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM), "Mushroom Stem", $mushroomBlockBreakInfo); - $this->remap(Ids::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM, $mushroomStem); - $this->remap(Ids::RED_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM, $mushroomStem); - $allSidedMushroomStem = new MushroomStem(new BID(Ids::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo); - $this->remap(Ids::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM, $allSidedMushroomStem); - $this->remap(Ids::RED_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM, $allSidedMushroomStem); + $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); } private function registerElements() : void{ $instaBreak = BreakInfo::instant(); - $this->registerAllMeta(new Opaque(new BID(Ids::ELEMENT_0, 0), "???", $instaBreak)); + $this->registerAllMeta(new Opaque(new BID(Ids::ELEMENT_ZERO, LegacyIds::ELEMENT_0, 0), "???", $instaBreak)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_1, 0), "Hydrogen", $instaBreak, "h", 1, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_2, 0), "Helium", $instaBreak, "he", 2, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_3, 0), "Lithium", $instaBreak, "li", 3, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_4, 0), "Beryllium", $instaBreak, "be", 4, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_5, 0), "Boron", $instaBreak, "b", 5, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_6, 0), "Carbon", $instaBreak, "c", 6, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_7, 0), "Nitrogen", $instaBreak, "n", 7, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_8, 0), "Oxygen", $instaBreak, "o", 8, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_9, 0), "Fluorine", $instaBreak, "f", 9, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_10, 0), "Neon", $instaBreak, "ne", 10, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_11, 0), "Sodium", $instaBreak, "na", 11, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_12, 0), "Magnesium", $instaBreak, "mg", 12, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_13, 0), "Aluminum", $instaBreak, "al", 13, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_14, 0), "Silicon", $instaBreak, "si", 14, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_15, 0), "Phosphorus", $instaBreak, "p", 15, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_16, 0), "Sulfur", $instaBreak, "s", 16, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_17, 0), "Chlorine", $instaBreak, "cl", 17, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_18, 0), "Argon", $instaBreak, "ar", 18, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_19, 0), "Potassium", $instaBreak, "k", 19, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_20, 0), "Calcium", $instaBreak, "ca", 20, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_21, 0), "Scandium", $instaBreak, "sc", 21, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_22, 0), "Titanium", $instaBreak, "ti", 22, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_23, 0), "Vanadium", $instaBreak, "v", 23, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_24, 0), "Chromium", $instaBreak, "cr", 24, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_25, 0), "Manganese", $instaBreak, "mn", 25, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_26, 0), "Iron", $instaBreak, "fe", 26, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_27, 0), "Cobalt", $instaBreak, "co", 27, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_28, 0), "Nickel", $instaBreak, "ni", 28, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_29, 0), "Copper", $instaBreak, "cu", 29, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_30, 0), "Zinc", $instaBreak, "zn", 30, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_31, 0), "Gallium", $instaBreak, "ga", 31, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_32, 0), "Germanium", $instaBreak, "ge", 32, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_33, 0), "Arsenic", $instaBreak, "as", 33, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_34, 0), "Selenium", $instaBreak, "se", 34, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_35, 0), "Bromine", $instaBreak, "br", 35, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_36, 0), "Krypton", $instaBreak, "kr", 36, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_37, 0), "Rubidium", $instaBreak, "rb", 37, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_38, 0), "Strontium", $instaBreak, "sr", 38, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_39, 0), "Yttrium", $instaBreak, "y", 39, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_40, 0), "Zirconium", $instaBreak, "zr", 40, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_41, 0), "Niobium", $instaBreak, "nb", 41, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_42, 0), "Molybdenum", $instaBreak, "mo", 42, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_43, 0), "Technetium", $instaBreak, "tc", 43, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_44, 0), "Ruthenium", $instaBreak, "ru", 44, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_45, 0), "Rhodium", $instaBreak, "rh", 45, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_46, 0), "Palladium", $instaBreak, "pd", 46, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_47, 0), "Silver", $instaBreak, "ag", 47, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_48, 0), "Cadmium", $instaBreak, "cd", 48, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_49, 0), "Indium", $instaBreak, "in", 49, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_50, 0), "Tin", $instaBreak, "sn", 50, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_51, 0), "Antimony", $instaBreak, "sb", 51, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_52, 0), "Tellurium", $instaBreak, "te", 52, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_53, 0), "Iodine", $instaBreak, "i", 53, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_54, 0), "Xenon", $instaBreak, "xe", 54, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_55, 0), "Cesium", $instaBreak, "cs", 55, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_56, 0), "Barium", $instaBreak, "ba", 56, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_57, 0), "Lanthanum", $instaBreak, "la", 57, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_58, 0), "Cerium", $instaBreak, "ce", 58, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_59, 0), "Praseodymium", $instaBreak, "pr", 59, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_60, 0), "Neodymium", $instaBreak, "nd", 60, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_61, 0), "Promethium", $instaBreak, "pm", 61, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_62, 0), "Samarium", $instaBreak, "sm", 62, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_63, 0), "Europium", $instaBreak, "eu", 63, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_64, 0), "Gadolinium", $instaBreak, "gd", 64, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_65, 0), "Terbium", $instaBreak, "tb", 65, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_66, 0), "Dysprosium", $instaBreak, "dy", 66, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_67, 0), "Holmium", $instaBreak, "ho", 67, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_68, 0), "Erbium", $instaBreak, "er", 68, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_69, 0), "Thulium", $instaBreak, "tm", 69, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_70, 0), "Ytterbium", $instaBreak, "yb", 70, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_71, 0), "Lutetium", $instaBreak, "lu", 71, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_72, 0), "Hafnium", $instaBreak, "hf", 72, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_73, 0), "Tantalum", $instaBreak, "ta", 73, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_74, 0), "Tungsten", $instaBreak, "w", 74, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_75, 0), "Rhenium", $instaBreak, "re", 75, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_76, 0), "Osmium", $instaBreak, "os", 76, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_77, 0), "Iridium", $instaBreak, "ir", 77, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_78, 0), "Platinum", $instaBreak, "pt", 78, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_79, 0), "Gold", $instaBreak, "au", 79, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_80, 0), "Mercury", $instaBreak, "hg", 80, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_81, 0), "Thallium", $instaBreak, "tl", 81, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_82, 0), "Lead", $instaBreak, "pb", 82, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_83, 0), "Bismuth", $instaBreak, "bi", 83, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_84, 0), "Polonium", $instaBreak, "po", 84, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_85, 0), "Astatine", $instaBreak, "at", 85, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_86, 0), "Radon", $instaBreak, "rn", 86, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_87, 0), "Francium", $instaBreak, "fr", 87, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_88, 0), "Radium", $instaBreak, "ra", 88, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_89, 0), "Actinium", $instaBreak, "ac", 89, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_90, 0), "Thorium", $instaBreak, "th", 90, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_91, 0), "Protactinium", $instaBreak, "pa", 91, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_92, 0), "Uranium", $instaBreak, "u", 92, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_93, 0), "Neptunium", $instaBreak, "np", 93, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_94, 0), "Plutonium", $instaBreak, "pu", 94, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_95, 0), "Americium", $instaBreak, "am", 95, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_96, 0), "Curium", $instaBreak, "cm", 96, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_97, 0), "Berkelium", $instaBreak, "bk", 97, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_98, 0), "Californium", $instaBreak, "cf", 98, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_99, 0), "Einsteinium", $instaBreak, "es", 99, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_100, 0), "Fermium", $instaBreak, "fm", 100, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_101, 0), "Mendelevium", $instaBreak, "md", 101, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_102, 0), "Nobelium", $instaBreak, "no", 102, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_103, 0), "Lawrencium", $instaBreak, "lr", 103, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_104, 0), "Rutherfordium", $instaBreak, "rf", 104, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_105, 0), "Dubnium", $instaBreak, "db", 105, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_106, 0), "Seaborgium", $instaBreak, "sg", 106, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_107, 0), "Bohrium", $instaBreak, "bh", 107, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_108, 0), "Hassium", $instaBreak, "hs", 108, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_109, 0), "Meitnerium", $instaBreak, "mt", 109, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_110, 0), "Darmstadtium", $instaBreak, "ds", 110, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_111, 0), "Roentgenium", $instaBreak, "rg", 111, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_112, 0), "Copernicium", $instaBreak, "cn", 112, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_113, 0), "Nihonium", $instaBreak, "nh", 113, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_114, 0), "Flerovium", $instaBreak, "fl", 114, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_115, 0), "Moscovium", $instaBreak, "mc", 115, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_116, 0), "Livermorium", $instaBreak, "lv", 116, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_117, 0), "Tennessine", $instaBreak, "ts", 117, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_118, 0), "Oganesson", $instaBreak, "og", 118, 7)); + $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)); } /** @@ -932,12 +931,12 @@ class BlockFactory{ private function registerAllMeta(Block $default, Block ...$additional) : void{ $ids = []; $this->register($default); - foreach($default->getIdInfo()->getAllBlockIds() as $id){ + foreach($default->getIdInfo()->getAllLegacyBlockIds() as $id){ $ids[$id] = $id; } foreach($additional as $block){ $this->register($block); - foreach($block->getIdInfo()->getAllBlockIds() as $id){ + foreach($block->getIdInfo()->getAllLegacyBlockIds() as $id){ $ids[$id] = $id; } } @@ -951,7 +950,7 @@ class BlockFactory{ $this->register($block); $identifierFlattened = $block->getIdInfo(); if($identifierFlattened instanceof BlockIdentifierFlattened){ - $this->remap($identifierFlattened->getSecondId(), $identifierFlattened->getVariant() | 0x8, $block->setSlabType(SlabType::DOUBLE())); + $this->remap($identifierFlattened->getSecondId(), $identifierFlattened->getLegacyVariant() | 0x8, $block->setSlabType(SlabType::DOUBLE())); } } @@ -968,14 +967,14 @@ class BlockFactory{ * $override parameter. */ public function register(Block $block, bool $override = false) : void{ - $variant = $block->getIdInfo()->getVariant(); + $variant = $block->getIdInfo()->getLegacyVariant(); $stateMask = $block->getStateBitmask(); if(($variant & $stateMask) !== 0){ throw new \InvalidArgumentException("Block variant collides with state bitmask"); } - foreach($block->getIdInfo()->getAllBlockIds() as $id){ + foreach($block->getIdInfo()->getAllLegacyBlockIds() as $id){ if(!$override && $this->isRegistered($id, $variant)){ throw new \InvalidArgumentException("Block registration $id:$variant conflicts with an existing block"); } @@ -1057,7 +1056,7 @@ class BlockFactory{ }elseif(($mappedIndex = $this->getMappedStateId($index)) !== $index && isset($this->fullList[$mappedIndex])){ //cold $block = clone $this->fullList[$mappedIndex]; }else{ - $block = new UnknownBlock(new BID($id, $meta), BreakInfo::instant()); + $block = new UnknownBlock(new BID($id, $id, $meta), BreakInfo::instant()); } return $block; diff --git a/src/block/BlockIdentifier.php b/src/block/BlockIdentifier.php index b99517397d..f0e5fd6835 100644 --- a/src/block/BlockIdentifier.php +++ b/src/block/BlockIdentifier.php @@ -31,16 +31,20 @@ class BlockIdentifier{ * @phpstan-param class-string|null $tileClass */ public function __construct( - private int $blockId, - private int $variant, - private ?int $itemId = null, + private int $blockTypeId, + private int $legacyBlockId, + private int $legacyVariant, + private ?int $legacyItemId = null, private ?string $tileClass = null ){ - if($blockId < 0){ - throw new \InvalidArgumentException("Block ID may not be negative"); + if($blockTypeId < 0){ + throw new \InvalidArgumentException("Block type ID may not be negative"); } - if($variant < 0){ - throw new \InvalidArgumentException("Block variant may not be negative"); + if($legacyBlockId < 0){ + throw new \InvalidArgumentException("Legacy block ID may not be negative"); + } + if($legacyVariant < 0){ + throw new \InvalidArgumentException("Legacy block variant may not be negative"); } if($tileClass !== null){ @@ -48,23 +52,35 @@ class BlockIdentifier{ } } - public function getBlockId() : int{ - return $this->blockId; + public function getBlockTypeId() : int{ return $this->blockTypeId; } + + /** + * @deprecated + */ + public function getLegacyBlockId() : int{ + return $this->legacyBlockId; } /** + * @deprecated * @return int[] */ - public function getAllBlockIds() : array{ - return [$this->blockId]; + public function getAllLegacyBlockIds() : array{ + return [$this->legacyBlockId]; } - public function getVariant() : int{ - return $this->variant; + /** + * @deprecated + */ + public function getLegacyVariant() : int{ + return $this->legacyVariant; } - public function getItemId() : int{ - return $this->itemId ?? ($this->blockId > 255 ? 255 - $this->blockId : $this->blockId); + /** + * @deprecated + */ + public function getLegacyItemId() : int{ + return $this->legacyItemId ?? ($this->legacyBlockId > 255 ? 255 - $this->legacyBlockId : $this->legacyBlockId); } /** diff --git a/src/block/BlockIdentifierFlattened.php b/src/block/BlockIdentifierFlattened.php index 1eca84d528..5e9b579c69 100644 --- a/src/block/BlockIdentifierFlattened.php +++ b/src/block/BlockIdentifierFlattened.php @@ -28,32 +28,41 @@ use function count; class BlockIdentifierFlattened extends BlockIdentifier{ /** @var int[] */ - private array $additionalIds; + private array $legacyAdditionalIds; /** - * @param int[] $additionalIds + * @param int[] $legacyAdditionalIds */ - public function __construct(int $blockId, array $additionalIds, int $variant, ?int $itemId = null, ?string $tileClass = null){ - if(count($additionalIds) === 0){ + public function __construct(int $blockTypeId, int $legacyBlockId, array $legacyAdditionalIds, int $legacyVariant, ?int $legacyItemId = null, ?string $tileClass = null){ + if(count($legacyAdditionalIds) === 0){ throw new \InvalidArgumentException("Expected at least 1 additional ID"); } - parent::__construct($blockId, $variant, $itemId, $tileClass); + parent::__construct($blockTypeId, $legacyBlockId, $legacyVariant, $legacyItemId, $tileClass); - $this->additionalIds = $additionalIds; + $this->legacyAdditionalIds = $legacyAdditionalIds; } + /** + * @deprecated + */ public function getAdditionalId(int $index) : int{ - if(!isset($this->additionalIds[$index])){ + if(!isset($this->legacyAdditionalIds[$index])){ throw new \InvalidArgumentException("No such ID at index $index"); } - return $this->additionalIds[$index]; + return $this->legacyAdditionalIds[$index]; } + /** + * @deprecated + */ public function getSecondId() : int{ return $this->getAdditionalId(0); } - public function getAllBlockIds() : array{ - return [$this->getBlockId(), ...$this->additionalIds]; + /** + * @deprecated + */ + public function getAllLegacyBlockIds() : array{ + return [$this->getLegacyBlockId(), ...$this->legacyAdditionalIds]; } } diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 945053824e..2576d11a85 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -24,7 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockLegacyIds as Ids; +use pocketmine\block\BlockIdentifierFlattened as BIDFlattened; +use pocketmine\block\BlockLegacyIds as LegacyIds; +use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\TreeType; @@ -33,20 +35,116 @@ use pocketmine\utils\AssumptionFailedError; final class BlockLegacyIdHelper{ + public static function getWoodenPlanksIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_PLANKS, + TreeType::SPRUCE()->id() => Ids::SPRUCE_PLANKS, + TreeType::BIRCH()->id() => Ids::BIRCH_PLANKS, + TreeType::JUNGLE()->id() => Ids::JUNGLE_PLANKS, + TreeType::ACACIA()->id() => Ids::ACACIA_PLANKS, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::PLANKS, $treeType->getMagicNumber()); + } + + public static function getWoodenFenceIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_FENCE, + TreeType::SPRUCE()->id() => Ids::SPRUCE_FENCE, + TreeType::BIRCH()->id() => Ids::BIRCH_FENCE, + TreeType::JUNGLE()->id() => Ids::JUNGLE_FENCE, + TreeType::ACACIA()->id() => Ids::ACACIA_FENCE, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::FENCE, $treeType->getMagicNumber()); + } + + public static function getWoodenSlabIdentifier(TreeType $treeType) : BIDFlattened{ + return new BIDFlattened(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_SLAB, + TreeType::SPRUCE()->id() => Ids::SPRUCE_SLAB, + TreeType::BIRCH()->id() => Ids::BIRCH_SLAB, + TreeType::JUNGLE()->id() => Ids::JUNGLE_SLAB, + TreeType::ACACIA()->id() => Ids::ACACIA_SLAB, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::WOODEN_SLAB, [LegacyIds::DOUBLE_WOODEN_SLAB], $treeType->getMagicNumber()); + } + + public static function getLogIdentifier(TreeType $treeType) : BID{ + return match($treeType->id()){ + TreeType::OAK()->id() => new BID(Ids::OAK_LOG, LegacyIds::LOG, 0), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG, LegacyIds::LOG, 1), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG, LegacyIds::LOG, 2), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG, LegacyIds::LOG, 3), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG, LegacyIds::LOG2, 0), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG, LegacyIds::LOG2, 1), + default => throw new AssumptionFailedError("All tree types should be covered") + }; + } + + public static function getAllSidedLogIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_WOOD, + TreeType::SPRUCE()->id() => Ids::SPRUCE_WOOD, + TreeType::BIRCH()->id() => Ids::BIRCH_WOOD, + TreeType::JUNGLE()->id() => Ids::JUNGLE_WOOD, + TreeType::ACACIA()->id() => Ids::ACACIA_WOOD, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::WOOD, $treeType->getMagicNumber()); + } + + public static function getAllSidedStrippedLogIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::STRIPPED_OAK_WOOD, + TreeType::SPRUCE()->id() => Ids::STRIPPED_SPRUCE_WOOD, + TreeType::BIRCH()->id() => Ids::STRIPPED_BIRCH_WOOD, + TreeType::JUNGLE()->id() => Ids::STRIPPED_JUNGLE_WOOD, + TreeType::ACACIA()->id() => Ids::STRIPPED_ACACIA_WOOD, + TreeType::DARK_OAK()->id() => Ids::STRIPPED_DARK_OAK_WOOD, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::WOOD, $treeType->getMagicNumber() | BlockLegacyMetadata::WOOD_FLAG_STRIPPED); + } + + public static function getLeavesIdentifier(TreeType $treeType) : BID{ + return match($treeType->id()){ + TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES, LegacyIds::LEAVES, 0), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES, LegacyIds::LEAVES, 1), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES, LegacyIds::LEAVES, 2), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES, LegacyIds::LEAVES, 3), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES, LegacyIds::LEAVES2, 0), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES, LegacyIds::LEAVES2, 1), + default => throw new AssumptionFailedError("All tree types should be covered") + }; + } + + public static function getSaplingIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_SAPLING, + TreeType::SPRUCE()->id() => Ids::SPRUCE_SAPLING, + TreeType::BIRCH()->id() => Ids::BIRCH_SAPLING, + TreeType::JUNGLE()->id() => Ids::JUNGLE_SAPLING, + TreeType::ACACIA()->id() => Ids::ACACIA_SAPLING, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, + default => throw new AssumptionFailedError("All tree types should be covered") + }, LegacyIds::SAPLING, $treeType->getMagicNumber()); + } + public static function getWoodenFloorSignIdentifier(TreeType $treeType) : BID{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::SIGN_POST, 0, ItemIds::SIGN, TileSign::class); + return new BID(Ids::OAK_SIGN, LegacyIds::SIGN_POST, 0, ItemIds::SIGN, TileSign::class); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_STANDING_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); + return new BID(Ids::SPRUCE_SIGN, LegacyIds::SPRUCE_STANDING_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_STANDING_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); + return new BID(Ids::BIRCH_SIGN, LegacyIds::BIRCH_STANDING_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_STANDING_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); + return new BID(Ids::JUNGLE_SIGN, LegacyIds::JUNGLE_STANDING_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_STANDING_SIGN,0, ItemIds::ACACIA_SIGN, TileSign::class); + return new BID(Ids::ACACIA_SIGN, LegacyIds::ACACIA_STANDING_SIGN, 0, ItemIds::ACACIA_SIGN, TileSign::class); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARKOAK_STANDING_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); + return new BID(Ids::DARK_OAK_SIGN, LegacyIds::DARKOAK_STANDING_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -54,17 +152,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenWallSignIdentifier(TreeType $treeType) : BID{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::WALL_SIGN, 0, ItemIds::SIGN, TileSign::class); + return new BID(Ids::OAK_WALL_SIGN, LegacyIds::WALL_SIGN, 0, ItemIds::SIGN, TileSign::class); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_WALL_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); + return new BID(Ids::SPRUCE_WALL_SIGN, LegacyIds::SPRUCE_WALL_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_WALL_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); + return new BID(Ids::BIRCH_WALL_SIGN, LegacyIds::BIRCH_WALL_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_WALL_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); + return new BID(Ids::JUNGLE_WALL_SIGN, LegacyIds::JUNGLE_WALL_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_WALL_SIGN, 0, ItemIds::ACACIA_SIGN, TileSign::class); + return new BID(Ids::ACACIA_WALL_SIGN, LegacyIds::ACACIA_WALL_SIGN, 0, ItemIds::ACACIA_SIGN, TileSign::class); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARKOAK_WALL_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); + return new BID(Ids::DARK_OAK_WALL_SIGN, LegacyIds::DARKOAK_WALL_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -72,17 +170,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenTrapdoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::WOODEN_TRAPDOOR, 0); + return new BID(Ids::OAK_TRAPDOOR, LegacyIds::WOODEN_TRAPDOOR, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::SPRUCE_TRAPDOOR, 0); + return new BID(Ids::SPRUCE_TRAPDOOR, LegacyIds::SPRUCE_TRAPDOOR, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::BIRCH_TRAPDOOR, 0); + return new BID(Ids::BIRCH_TRAPDOOR, LegacyIds::BIRCH_TRAPDOOR, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::JUNGLE_TRAPDOOR, 0); + return new BID(Ids::JUNGLE_TRAPDOOR, LegacyIds::JUNGLE_TRAPDOOR, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::ACACIA_TRAPDOOR, 0); + return new BID(Ids::ACACIA_TRAPDOOR, LegacyIds::ACACIA_TRAPDOOR, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::DARK_OAK_TRAPDOOR, 0); + return new BID(Ids::DARK_OAK_TRAPDOOR, LegacyIds::DARK_OAK_TRAPDOOR, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -90,17 +188,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenButtonIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::WOODEN_BUTTON, 0); + return new BID(Ids::OAK_BUTTON, LegacyIds::WOODEN_BUTTON, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::SPRUCE_BUTTON, 0); + return new BID(Ids::SPRUCE_BUTTON, LegacyIds::SPRUCE_BUTTON, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::BIRCH_BUTTON, 0); + return new BID(Ids::BIRCH_BUTTON, LegacyIds::BIRCH_BUTTON, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::JUNGLE_BUTTON, 0); + return new BID(Ids::JUNGLE_BUTTON, LegacyIds::JUNGLE_BUTTON, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::ACACIA_BUTTON, 0); + return new BID(Ids::ACACIA_BUTTON, LegacyIds::ACACIA_BUTTON, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::DARK_OAK_BUTTON, 0); + return new BID(Ids::DARK_OAK_BUTTON, LegacyIds::DARK_OAK_BUTTON, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -108,17 +206,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenPressurePlateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::WOODEN_PRESSURE_PLATE, 0); + return new BID(Ids::OAK_PRESSURE_PLATE, LegacyIds::WOODEN_PRESSURE_PLATE, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::SPRUCE_PRESSURE_PLATE, 0); + return new BID(Ids::SPRUCE_PRESSURE_PLATE, LegacyIds::SPRUCE_PRESSURE_PLATE, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::BIRCH_PRESSURE_PLATE, 0); + return new BID(Ids::BIRCH_PRESSURE_PLATE, LegacyIds::BIRCH_PRESSURE_PLATE, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::JUNGLE_PRESSURE_PLATE, 0); + return new BID(Ids::JUNGLE_PRESSURE_PLATE, LegacyIds::JUNGLE_PRESSURE_PLATE, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::ACACIA_PRESSURE_PLATE, 0); + return new BID(Ids::ACACIA_PRESSURE_PLATE, LegacyIds::ACACIA_PRESSURE_PLATE, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::DARK_OAK_PRESSURE_PLATE, 0); + return new BID(Ids::DARK_OAK_PRESSURE_PLATE, LegacyIds::DARK_OAK_PRESSURE_PLATE, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -126,35 +224,35 @@ final class BlockLegacyIdHelper{ public static function getWoodenDoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_DOOR_BLOCK, 0, ItemIds::OAK_DOOR); + return new BID(Ids::OAK_DOOR, LegacyIds::OAK_DOOR_BLOCK, 0, ItemIds::OAK_DOOR); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_DOOR_BLOCK, 0, ItemIds::SPRUCE_DOOR); + return new BID(Ids::SPRUCE_DOOR, LegacyIds::SPRUCE_DOOR_BLOCK, 0, ItemIds::SPRUCE_DOOR); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_DOOR_BLOCK, 0, ItemIds::BIRCH_DOOR); + return new BID(Ids::BIRCH_DOOR, LegacyIds::BIRCH_DOOR_BLOCK, 0, ItemIds::BIRCH_DOOR); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_DOOR_BLOCK, 0, ItemIds::JUNGLE_DOOR); + return new BID(Ids::JUNGLE_DOOR, LegacyIds::JUNGLE_DOOR_BLOCK, 0, ItemIds::JUNGLE_DOOR); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_DOOR_BLOCK, 0, ItemIds::ACACIA_DOOR); + return new BID(Ids::ACACIA_DOOR, LegacyIds::ACACIA_DOOR_BLOCK, 0, ItemIds::ACACIA_DOOR); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_DOOR_BLOCK, 0, ItemIds::DARK_OAK_DOOR); + return new BID(Ids::DARK_OAK_DOOR, LegacyIds::DARK_OAK_DOOR_BLOCK, 0, ItemIds::DARK_OAK_DOOR); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenFenceIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenFenceGateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::OAK_FENCE_GATE, 0); + return new BID(Ids::OAK_FENCE_GATE, LegacyIds::OAK_FENCE_GATE, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::SPRUCE_FENCE_GATE, 0); + return new BID(Ids::SPRUCE_FENCE_GATE, LegacyIds::SPRUCE_FENCE_GATE, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::BIRCH_FENCE_GATE, 0); + return new BID(Ids::BIRCH_FENCE_GATE, LegacyIds::BIRCH_FENCE_GATE, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::JUNGLE_FENCE_GATE, 0); + return new BID(Ids::JUNGLE_FENCE_GATE, LegacyIds::JUNGLE_FENCE_GATE, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::ACACIA_FENCE_GATE, 0); + return new BID(Ids::ACACIA_FENCE_GATE, LegacyIds::ACACIA_FENCE_GATE, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::DARK_OAK_FENCE_GATE, 0); + return new BID(Ids::DARK_OAK_FENCE_GATE, LegacyIds::DARK_OAK_FENCE_GATE, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -162,17 +260,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenStairsIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::OAK_STAIRS, 0); + return new BID(Ids::OAK_STAIRS, LegacyIds::OAK_STAIRS, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::SPRUCE_STAIRS, 0); + return new BID(Ids::SPRUCE_STAIRS, LegacyIds::SPRUCE_STAIRS, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::BIRCH_STAIRS, 0); + return new BID(Ids::BIRCH_STAIRS, LegacyIds::BIRCH_STAIRS, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::JUNGLE_STAIRS, 0); + return new BID(Ids::JUNGLE_STAIRS, LegacyIds::JUNGLE_STAIRS, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::ACACIA_STAIRS, 0); + return new BID(Ids::ACACIA_STAIRS, LegacyIds::ACACIA_STAIRS, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::DARK_OAK_STAIRS, 0); + return new BID(Ids::DARK_OAK_STAIRS, LegacyIds::DARK_OAK_STAIRS, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -180,17 +278,17 @@ final class BlockLegacyIdHelper{ public static function getStrippedLogIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BlockIdentifier(Ids::STRIPPED_OAK_LOG, 0); + return new BID(Ids::STRIPPED_OAK_LOG, LegacyIds::STRIPPED_OAK_LOG, 0); case TreeType::SPRUCE()->id(): - return new BlockIdentifier(Ids::STRIPPED_SPRUCE_LOG, 0); + return new BID(Ids::STRIPPED_SPRUCE_LOG, LegacyIds::STRIPPED_SPRUCE_LOG, 0); case TreeType::BIRCH()->id(): - return new BlockIdentifier(Ids::STRIPPED_BIRCH_LOG, 0); + return new BID(Ids::STRIPPED_BIRCH_LOG, LegacyIds::STRIPPED_BIRCH_LOG, 0); case TreeType::JUNGLE()->id(): - return new BlockIdentifier(Ids::STRIPPED_JUNGLE_LOG, 0); + return new BID(Ids::STRIPPED_JUNGLE_LOG, LegacyIds::STRIPPED_JUNGLE_LOG, 0); case TreeType::ACACIA()->id(): - return new BlockIdentifier(Ids::STRIPPED_ACACIA_LOG, 0); + return new BID(Ids::STRIPPED_ACACIA_LOG, LegacyIds::STRIPPED_ACACIA_LOG, 0); case TreeType::DARK_OAK()->id(): - return new BlockIdentifier(Ids::STRIPPED_DARK_OAK_LOG, 0); + return new BID(Ids::STRIPPED_DARK_OAK_LOG, LegacyIds::STRIPPED_DARK_OAK_LOG, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -198,51 +296,51 @@ final class BlockLegacyIdHelper{ public static function getGlazedTerracottaIdentifier(DyeColor $color) : BlockIdentifier{ switch($color->id()){ case DyeColor::WHITE()->id(): - return new BlockIdentifier(Ids::WHITE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::WHITE_GLAZED_TERRACOTTA, LegacyIds::WHITE_GLAZED_TERRACOTTA, 0); case DyeColor::ORANGE()->id(): - return new BlockIdentifier(Ids::ORANGE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::ORANGE_GLAZED_TERRACOTTA, LegacyIds::ORANGE_GLAZED_TERRACOTTA, 0); case DyeColor::MAGENTA()->id(): - return new BlockIdentifier(Ids::MAGENTA_GLAZED_TERRACOTTA, 0); + return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA, LegacyIds::MAGENTA_GLAZED_TERRACOTTA, 0); case DyeColor::LIGHT_BLUE()->id(): - return new BlockIdentifier(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, LegacyIds::LIGHT_BLUE_GLAZED_TERRACOTTA, 0); case DyeColor::YELLOW()->id(): - return new BlockIdentifier(Ids::YELLOW_GLAZED_TERRACOTTA, 0); + return new BID(Ids::YELLOW_GLAZED_TERRACOTTA, LegacyIds::YELLOW_GLAZED_TERRACOTTA, 0); case DyeColor::LIME()->id(): - return new BlockIdentifier(Ids::LIME_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIME_GLAZED_TERRACOTTA, LegacyIds::LIME_GLAZED_TERRACOTTA, 0); case DyeColor::PINK()->id(): - return new BlockIdentifier(Ids::PINK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PINK_GLAZED_TERRACOTTA, LegacyIds::PINK_GLAZED_TERRACOTTA, 0); case DyeColor::GRAY()->id(): - return new BlockIdentifier(Ids::GRAY_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GRAY_GLAZED_TERRACOTTA, LegacyIds::GRAY_GLAZED_TERRACOTTA, 0); case DyeColor::LIGHT_GRAY()->id(): - return new BlockIdentifier(Ids::SILVER_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, LegacyIds::SILVER_GLAZED_TERRACOTTA, 0); case DyeColor::CYAN()->id(): - return new BlockIdentifier(Ids::CYAN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::CYAN_GLAZED_TERRACOTTA, LegacyIds::CYAN_GLAZED_TERRACOTTA, 0); case DyeColor::PURPLE()->id(): - return new BlockIdentifier(Ids::PURPLE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PURPLE_GLAZED_TERRACOTTA, LegacyIds::PURPLE_GLAZED_TERRACOTTA, 0); case DyeColor::BLUE()->id(): - return new BlockIdentifier(Ids::BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLUE_GLAZED_TERRACOTTA, LegacyIds::BLUE_GLAZED_TERRACOTTA, 0); case DyeColor::BROWN()->id(): - return new BlockIdentifier(Ids::BROWN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BROWN_GLAZED_TERRACOTTA, LegacyIds::BROWN_GLAZED_TERRACOTTA, 0); case DyeColor::GREEN()->id(): - return new BlockIdentifier(Ids::GREEN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GREEN_GLAZED_TERRACOTTA, LegacyIds::GREEN_GLAZED_TERRACOTTA, 0); case DyeColor::RED()->id(): - return new BlockIdentifier(Ids::RED_GLAZED_TERRACOTTA, 0); + return new BID(Ids::RED_GLAZED_TERRACOTTA, LegacyIds::RED_GLAZED_TERRACOTTA, 0); case DyeColor::BLACK()->id(): - return new BlockIdentifier(Ids::BLACK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLACK_GLAZED_TERRACOTTA, LegacyIds::BLACK_GLAZED_TERRACOTTA, 0); } throw new AssumptionFailedError("Switch should cover all colours"); } - public static function getStoneSlabIdentifier(int $stoneSlabId, int $meta) : BlockIdentifierFlattened{ + public static function getStoneSlabIdentifier(int $blockTypeId, int $stoneSlabId, int $meta) : BlockIdentifierFlattened{ $id = [ - 1 => [Ids::STONE_SLAB, Ids::DOUBLE_STONE_SLAB], - 2 => [Ids::STONE_SLAB2, Ids::DOUBLE_STONE_SLAB2], - 3 => [Ids::STONE_SLAB3, Ids::DOUBLE_STONE_SLAB3], - 4 => [Ids::STONE_SLAB4, Ids::DOUBLE_STONE_SLAB4] + 1 => [LegacyIds::STONE_SLAB, LegacyIds::DOUBLE_STONE_SLAB], + 2 => [LegacyIds::STONE_SLAB2, LegacyIds::DOUBLE_STONE_SLAB2], + 3 => [LegacyIds::STONE_SLAB3, LegacyIds::DOUBLE_STONE_SLAB3], + 4 => [LegacyIds::STONE_SLAB4, LegacyIds::DOUBLE_STONE_SLAB4] ][$stoneSlabId] ?? null; if($id === null){ throw new \InvalidArgumentException("Stone slab type should be 1, 2, 3 or 4"); } - return new BlockIdentifierFlattened($id[0], [$id[1]], $meta); + return new BlockIdentifierFlattened($blockTypeId, $id[0], [$id[1]], $meta); } } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php new file mode 100644 index 0000000000..a4dc79718b --- /dev/null +++ b/src/block/BlockTypeIds.php @@ -0,0 +1,581 @@ +getIdInfo()->getVariant() === BlockLegacyMetadata::TALLGRASS_FERN); //TODO: clean up + ($block instanceof TallGrass && $block->getIdInfo()->getLegacyVariant() === BlockLegacyMetadata::TALLGRASS_FERN); //TODO: clean up //TODO: bamboo } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index ac158453f5..88e2ef0bad 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -54,7 +54,7 @@ final class WallCoralFan extends BaseCoral{ $coralTypeFlag = $stateMeta & BlockLegacyMetadata::CORAL_FAN_HANG_TYPE_MASK; switch($id){ - case $this->idInfoFlattened->getBlockId(): + case $this->idInfoFlattened->getLegacyBlockId(): $this->coralType = $coralTypeFlag === BlockLegacyMetadata::CORAL_FAN_HANG_TUBE ? CoralType::TUBE() : CoralType::BRAIN(); break; case $this->idInfoFlattened->getAdditionalId(0): @@ -73,7 +73,7 @@ final class WallCoralFan extends BaseCoral{ public function getId() : int{ if($this->coralType->equals(CoralType::TUBE()) || $this->coralType->equals(CoralType::BRAIN())){ - return $this->idInfoFlattened->getBlockId(); + 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())){ diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index ebcaca8dc4..fad39d31b8 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -41,7 +41,7 @@ class BlockTest extends TestCase{ * Test registering a block which would overwrite another block, without forcing it */ public function testAccidentalOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockLegacyIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, BlockLegacyIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); $this->expectException(\InvalidArgumentException::class); $this->blockFactory->register($block); } @@ -50,7 +50,7 @@ class BlockTest extends TestCase{ * Test registering a block deliberately overwriting another block works as expected */ public function testDeliberateOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockLegacyIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); + $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)); } @@ -61,7 +61,7 @@ class BlockTest extends TestCase{ public function testRegisterNewBlock() : void{ for($i = 0; $i < 256; ++$i){ if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i, 0), "Strange New Block", BlockBreakInfo::instant()); + $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)); return; @@ -76,7 +76,7 @@ class BlockTest extends TestCase{ */ public function testRegisterIdTooSmall() : void{ self::expectException(\InvalidArgumentException::class); - $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1, 0), "Out Of Bounds Block", BlockBreakInfo::instant())); + $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1, -1, 0), "Out Of Bounds Block", BlockBreakInfo::instant())); } /** @@ -119,7 +119,7 @@ class BlockTest extends TestCase{ public function testBlockIds() : void{ for($i = 0; $i < 256; ++$i){ $b = $this->blockFactory->get($i, 0); - self::assertContains($i, $b->getIdInfo()->getAllBlockIds()); + self::assertContains($i, $b->getIdInfo()->getAllLegacyBlockIds()); } } From bf199d3a740a9b8c657a741e528aa73d0ad4270e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 27 May 2022 20:40:32 +0100 Subject: [PATCH 0109/1858] duct tape for recipes --- src/network/mcpe/convert/ItemTranslator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 6bd8903331..94615da459 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -28,6 +28,7 @@ use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\item\ItemFactory; +use pocketmine\item\ItemIds; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -86,6 +87,7 @@ final class ItemTranslator{ */ public function toNetworkId(int $internalId, int $internalMeta) : array{ return $this->toNetworkIdQuiet($internalId, $internalMeta) ?? + $this->toNetworkIdQuiet(ItemIds::INFO_UPDATE, 0) ?? //TODO: bad duct tape throw new \InvalidArgumentException("Unmapped ID/metadata combination $internalId:$internalMeta"); } From f3c9b59856b8dedc2a843c45bdc7cdfffb1008ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 19:54:32 +0100 Subject: [PATCH 0110/1858] Bump version for PM5 --- src/VersionInfo.php | 4 ++-- tests/plugins/DevTools | 2 +- tests/plugins/TesterPlugin/plugin.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index f9a55d173e..2ebffeca0a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.6.0"; + public const BASE_VERSION = "5.0.0"; public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "beta"; + public const BUILD_CHANNEL = "alpha"; private function __construct(){ //NOOP diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index e884a4c234..1b264da3d2 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit e884a4c234629126203e769df7c4dbbbc0dc2d49 +Subproject commit 1b264da3d244cd9b0030cbc3d584d2f685648bfe diff --git a/tests/plugins/TesterPlugin/plugin.yml b/tests/plugins/TesterPlugin/plugin.yml index dc00d97c79..5d18dff760 100644 --- a/tests/plugins/TesterPlugin/plugin.yml +++ b/tests/plugins/TesterPlugin/plugin.yml @@ -2,7 +2,7 @@ name: TesterPlugin main: pmmp\TesterPlugin\Main src-namespace-prefix: pmmp\TesterPlugin version: 0.1.0 -api: [3.2.0, 4.0.0] +api: [5.0.0] load: POSTWORLD author: pmmp description: Plugin used to run tests on PocketMine-MP From b7e2b3e94a6767d6873b6c2e76503dc688522f67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 20:51:18 +0100 Subject: [PATCH 0111/1858] Entity: Require declaration of gravity and drag via abstract methods this guarantees that subclasses will actually declare them. [bc break] --- src/entity/Entity.php | 17 +++++++++++++++++ src/entity/Living.php | 7 ++++--- src/entity/object/ExperienceOrb.php | 7 ++++--- src/entity/object/FallingBlock.php | 7 ++++--- src/entity/object/ItemEntity.php | 7 ++++--- src/entity/object/Painting.php | 9 ++++----- src/entity/object/PrimedTNT.php | 7 ++++--- src/entity/projectile/Arrow.php | 7 ++++--- src/entity/projectile/ExperienceBottle.php | 2 +- src/entity/projectile/SplashPotion.php | 5 ++--- src/entity/projectile/Throwable.php | 7 ++++--- 11 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 7085a8827d..9608556618 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -222,6 +222,8 @@ abstract class Entity{ $this->timings = Timings::getEntityTimings($this); $this->size = $this->getInitialSizeInfo(); + $this->drag = $this->getInitialDragMultiplier(); + $this->gravity = $this->getInitialGravity(); $this->id = self::nextRuntimeId(); $this->server = $location->getWorld()->getServer(); @@ -257,6 +259,21 @@ abstract class Entity{ abstract protected function getInitialSizeInfo() : EntitySizeInfo; + /** + * Returns the percentage by which the entity's velocity is reduced per tick when moving through air. + * The entity's velocity is multiplied by 1 minus this value. + * + * @return float 0-1 + */ + abstract protected function getInitialDragMultiplier() : float; + + /** + * Returns the downwards acceleration of the entity when falling, in blocks/tick². + * + * @return float minimum 0 + */ + abstract protected function getInitialGravity() : float; + public function getNameTag() : string{ return $this->nameTag; } diff --git a/src/entity/Living.php b/src/entity/Living.php index 74d38ef415..82cef8eb17 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -76,9 +76,6 @@ use const M_PI; abstract class Living extends Entity{ protected const DEFAULT_BREATH_TICKS = 300; - protected $gravity = 0.08; - protected $drag = 0.02; - /** @var int */ protected $attackTime = 0; @@ -121,6 +118,10 @@ abstract class Living extends Entity{ /** @var bool */ protected $swimming = false; + protected function getInitialDragMultiplier() : float{ return 0.02; } + + protected function getInitialGravity() : float{ return 0.08; } + abstract public function getName() : string; protected function initEntity(CompoundTag $nbt) : void{ diff --git a/src/entity/object/ExperienceOrb.php b/src/entity/object/ExperienceOrb.php index 274abf379b..fc16c50f22 100644 --- a/src/entity/object/ExperienceOrb.php +++ b/src/entity/object/ExperienceOrb.php @@ -78,9 +78,6 @@ class ExperienceOrb extends Entity{ return $result; } - public $gravity = 0.04; - public $drag = 0.02; - /** @var int */ protected $age = 0; @@ -106,6 +103,10 @@ class ExperienceOrb extends Entity{ protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.25, 0.25); } + protected function getInitialDragMultiplier() : float{ return 0.02; } + + protected function getInitialGravity() : float{ return 0.04; } + protected function initEntity(CompoundTag $nbt) : void{ parent::initEntity($nbt); diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index cb2551349a..72aca10e0e 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -46,9 +46,6 @@ class FallingBlock extends Entity{ public static function getNetworkTypeId() : string{ return EntityIds::FALLING_BLOCK; } - protected $gravity = 0.04; - protected $drag = 0.02; - /** @var Block */ protected $block; @@ -61,6 +58,10 @@ class FallingBlock extends Entity{ protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.98, 0.98); } + protected function getInitialDragMultiplier() : float{ return 0.02; } + + protected function getInitialGravity() : float{ return 0.04; } + public static function parseBlockNBT(BlockFactory $factory, CompoundTag $nbt) : Block{ $blockId = 0; diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 73d67a1928..df5fe4daba 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -59,9 +59,6 @@ class ItemEntity extends Entity{ /** @var Item */ protected $item; - protected $gravity = 0.04; - protected $drag = 0.02; - public $canCollide = false; /** @var int */ @@ -77,6 +74,10 @@ class ItemEntity extends Entity{ protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.25, 0.25); } + protected function getInitialDragMultiplier() : float{ return 0.02; } + + protected function getInitialGravity() : float{ return 0.04; } + protected function initEntity(CompoundTag $nbt) : void{ parent::initEntity($nbt); diff --git a/src/entity/object/Painting.php b/src/entity/object/Painting.php index ff59de0430..16392dc743 100644 --- a/src/entity/object/Painting.php +++ b/src/entity/object/Painting.php @@ -56,11 +56,6 @@ class Painting extends Entity{ Facing::EAST => 3 ]; - /** @var float */ - protected $gravity = 0.0; - /** @var float */ - protected $drag = 1.0; - /** @var Vector3 */ protected $blockIn; /** @var int */ @@ -80,6 +75,10 @@ class Painting extends Entity{ return new EntitySizeInfo(0.5, 0.5); } + protected function getInitialDragMultiplier() : float{ return 1.0; } + + protected function getInitialGravity() : float{ return 0.0; } + protected function initEntity(CompoundTag $nbt) : void{ $this->setMaxHealth(1); $this->setHealth(1); diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index 70d58dafa8..3303a45dbd 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -41,9 +41,6 @@ class PrimedTNT extends Entity implements Explosive{ public static function getNetworkTypeId() : string{ return EntityIds::TNT; } - protected $gravity = 0.04; - protected $drag = 0.02; - /** @var int */ protected $fuse; @@ -53,6 +50,10 @@ class PrimedTNT extends Entity implements Explosive{ protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.98, 0.98); } + protected function getInitialDragMultiplier() : float{ return 0.02; } + + protected function getInitialGravity() : float{ return 0.04; } + public function getFuse() : int{ return $this->fuse; } diff --git a/src/entity/projectile/Arrow.php b/src/entity/projectile/Arrow.php index 47924c8cb3..73ee9599c1 100644 --- a/src/entity/projectile/Arrow.php +++ b/src/entity/projectile/Arrow.php @@ -52,9 +52,6 @@ class Arrow extends Projectile{ private const TAG_PICKUP = "pickup"; //TAG_Byte public const TAG_CRIT = "crit"; //TAG_Byte - protected $gravity = 0.05; - protected $drag = 0.01; - /** @var float */ protected $damage = 2.0; @@ -77,6 +74,10 @@ class Arrow extends Projectile{ protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.25, 0.25); } + protected function getInitialDragMultiplier() : float{ return 0.01; } + + protected function getInitialGravity() : float{ return 0.05; } + protected function initEntity(CompoundTag $nbt) : void{ parent::initEntity($nbt); diff --git a/src/entity/projectile/ExperienceBottle.php b/src/entity/projectile/ExperienceBottle.php index eb69b0edfa..5db238259b 100644 --- a/src/entity/projectile/ExperienceBottle.php +++ b/src/entity/projectile/ExperienceBottle.php @@ -32,7 +32,7 @@ use function mt_rand; class ExperienceBottle extends Throwable{ public static function getNetworkTypeId() : string{ return EntityIds::XP_BOTTLE; } - protected $gravity = 0.07; + protected function getInitialGravity() : float{ return 0.07; } public function getResultDamage() : int{ return -1; diff --git a/src/entity/projectile/SplashPotion.php b/src/entity/projectile/SplashPotion.php index 364ded7c27..d35360f54c 100644 --- a/src/entity/projectile/SplashPotion.php +++ b/src/entity/projectile/SplashPotion.php @@ -52,9 +52,6 @@ class SplashPotion extends Throwable{ public static function getNetworkTypeId() : string{ return EntityIds::SPLASH_POTION; } - protected $gravity = 0.05; - protected $drag = 0.01; - /** @var bool */ protected $linger = false; protected PotionType $potionType; @@ -64,6 +61,8 @@ class SplashPotion extends Throwable{ parent::__construct($location, $shootingEntity, $nbt); } + protected function getInitialGravity() : float{ return 0.05; } + public function saveNBT() : CompoundTag{ $nbt = parent::saveNBT(); $nbt->setShort("PotionId", PotionTypeIdMap::getInstance()->toId($this->getPotionType())); diff --git a/src/entity/projectile/Throwable.php b/src/entity/projectile/Throwable.php index 20bf86912a..01bc1aff64 100644 --- a/src/entity/projectile/Throwable.php +++ b/src/entity/projectile/Throwable.php @@ -29,11 +29,12 @@ use pocketmine\math\RayTraceResult; abstract class Throwable extends Projectile{ - protected $gravity = 0.03; - protected $drag = 0.01; - protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.25, 0.25); } + protected function getInitialDragMultiplier() : float{ return 0.01; } + + protected function getInitialGravity() : float{ return 0.03; } + protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ parent::onHitBlock($blockHit, $hitResult); $this->flagForDespawn(); From 6ee551c5e1ff5e33dd02a97fbc2709ce15636af0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 21:00:54 +0100 Subject: [PATCH 0112/1858] Remove premature optimisation from World::getCollidingEntities() this is already covered in more fine-grained detail by canCollideWith(). [bc break] --- src/entity/Entity.php | 2 -- src/entity/object/FallingBlock.php | 2 -- src/entity/object/ItemEntity.php | 2 -- src/entity/object/PrimedTNT.php | 2 -- src/world/World.php | 8 +++----- 5 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 9608556618..22c89934db 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -140,8 +140,6 @@ abstract class Entity{ public $lastUpdate; /** @var int */ protected $fireTicks = 0; - /** @var bool */ - public $canCollide = true; /** @var bool */ protected $isStatic = false; diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 72aca10e0e..0dd8daebb7 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -49,8 +49,6 @@ class FallingBlock extends Entity{ /** @var Block */ protected $block; - public $canCollide = false; - public function __construct(Location $location, Block $block, ?CompoundTag $nbt = null){ $this->block = $block; parent::__construct($location, $nbt); diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index df5fe4daba..14b66c7d2f 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -59,8 +59,6 @@ class ItemEntity extends Entity{ /** @var Item */ protected $item; - public $canCollide = false; - /** @var int */ protected $despawnDelay = self::DEFAULT_DESPAWN_DELAY; diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index 3303a45dbd..06dbf4e16f 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -46,8 +46,6 @@ class PrimedTNT extends Entity implements Explosive{ protected bool $worksUnderwater = false; - public $canCollide = false; - protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.98, 0.98); } protected function getInitialDragMultiplier() : float{ return 0.02; } diff --git a/src/world/World.php b/src/world/World.php index cd430bba4c..196c2729c1 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1904,11 +1904,9 @@ class World implements ChunkManager{ public function getCollidingEntities(AxisAlignedBB $bb, ?Entity $entity = null) : array{ $nearby = []; - if($entity === null || $entity->canCollide){ - foreach($this->getNearbyEntities($bb, $entity) as $ent){ - if($ent->canBeCollidedWith() && ($entity === null || $entity->canCollideWith($ent))){ - $nearby[] = $ent; - } + foreach($this->getNearbyEntities($bb, $entity) as $ent){ + if($ent->canBeCollidedWith() && ($entity === null || $entity->canCollideWith($ent))){ + $nearby[] = $ent; } } From 2029e3be20f2974322c28929359d9a158555f7d0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 21:01:56 +0100 Subject: [PATCH 0113/1858] Entity: remove dead code [bc break] --- src/entity/Entity.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 22c89934db..57669c18ea 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -141,9 +141,6 @@ abstract class Entity{ /** @var int */ protected $fireTicks = 0; - /** @var bool */ - protected $isStatic = false; - private bool $savedWithChunk = true; /** @var bool */ @@ -999,9 +996,7 @@ abstract class Entity{ $this->timings->stopTiming(); - //if($this->isStatic()) return ($hasUpdate || $this->hasMovementUpdate()); - //return !($this instanceof Player); } final public function scheduleUpdate() : void{ From 7b8eeb42f638743ccdfb06a1b7e4bf8565fb9c51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 21:19:02 +0100 Subject: [PATCH 0114/1858] Use typed properties in src/entity package [bc break] --- src/entity/Entity.php | 127 +++++++++---------------- src/entity/Human.php | 114 ++++++++++------------ src/entity/Living.php | 57 ++++------- src/entity/Squid.php | 6 +- src/entity/WaterAnimal.php | 3 +- src/entity/effect/EffectManager.php | 13 +-- src/entity/object/ExperienceOrb.php | 20 ++-- src/entity/object/FallingBlock.php | 3 +- src/entity/object/ItemEntity.php | 24 ++--- src/entity/object/Painting.php | 9 +- src/entity/object/PaintingMotive.php | 17 +--- src/entity/object/PrimedTNT.php | 4 +- src/entity/projectile/Arrow.php | 19 +--- src/entity/projectile/Projectile.php | 7 +- src/entity/projectile/SplashPotion.php | 3 +- src/player/Player.php | 18 ++-- 16 files changed, 160 insertions(+), 284 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 57669c18ea..14a0ed7308 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -90,120 +90,79 @@ abstract class Entity{ } /** @var Player[] */ - protected $hasSpawned = []; + protected array $hasSpawned = []; - /** @var int */ - protected $id; + protected int $id; private EntityMetadataCollection $networkProperties; - /** @var EntityDamageEvent|null */ - protected $lastDamageCause = null; + protected ?EntityDamageEvent $lastDamageCause = null; /** @var Block[]|null */ - protected $blocksAround; + protected ?array $blocksAround = null; - /** @var Location */ - protected $location; - /** @var Location */ - protected $lastLocation; - /** @var Vector3 */ - protected $motion; - /** @var Vector3 */ - protected $lastMotion; - /** @var bool */ - protected $forceMovementUpdate = false; + protected Location $location; + protected Location $lastLocation; + protected Vector3 $motion; + protected Vector3 $lastMotion; + protected bool $forceMovementUpdate = false; - /** @var AxisAlignedBB */ - public $boundingBox; - /** @var bool */ - public $onGround = false; + public AxisAlignedBB $boundingBox; + public bool $onGround = false; - /** @var EntitySizeInfo */ - public $size; + public EntitySizeInfo $size; private float $health = 20.0; private int $maxHealth = 20; - /** @var float */ - protected $ySize = 0.0; - /** @var float */ - protected $stepHeight = 0.0; - /** @var bool */ - public $keepMovement = false; + protected float $ySize = 0.0; + protected float $stepHeight = 0.0; + public bool $keepMovement = false; - /** @var float */ - public $fallDistance = 0.0; - /** @var int */ - public $ticksLived = 0; - /** @var int */ - public $lastUpdate; - /** @var int */ - protected $fireTicks = 0; + public float $fallDistance = 0.0; + public int $ticksLived = 0; + public int $lastUpdate; + protected int $fireTicks = 0; private bool $savedWithChunk = true; - /** @var bool */ - public $isCollided = false; - /** @var bool */ - public $isCollidedHorizontally = false; - /** @var bool */ - public $isCollidedVertically = false; + public bool $isCollided = false; + public bool $isCollidedHorizontally = false; + public bool $isCollidedVertically = false; - /** @var int */ - public $noDamageTicks = 0; - /** @var bool */ - protected $justCreated = true; + public int $noDamageTicks = 0; + protected bool $justCreated = true; - /** @var AttributeMap */ - protected $attributeMap; + protected AttributeMap $attributeMap; - /** @var float */ - protected $gravity; - /** @var float */ - protected $drag; - /** @var bool */ - protected $gravityEnabled = true; + protected float $gravity; + protected float $drag; + protected bool $gravityEnabled = true; - /** @var Server */ - protected $server; + protected Server $server; - /** @var bool */ - protected $closed = false; + protected bool $closed = false; private bool $closeInFlight = false; private bool $needsDespawn = false; - /** @var TimingsHandler */ - protected $timings; + protected TimingsHandler $timings; protected bool $networkPropertiesDirty = false; - /** @var string */ - protected $nameTag = ""; - /** @var bool */ - protected $nameTagVisible = true; - /** @var bool */ - protected $alwaysShowNameTag = false; - /** @var string */ - protected $scoreTag = ""; - /** @var float */ - protected $scale = 1.0; + protected string $nameTag = ""; + protected bool $nameTagVisible = true; + protected bool $alwaysShowNameTag = false; + protected string $scoreTag = ""; + protected float $scale = 1.0; - /** @var bool */ - protected $canClimb = false; - /** @var bool */ - protected $canClimbWalls = false; - /** @var bool */ - protected $immobile = false; - /** @var bool */ - protected $invisible = false; - /** @var bool */ - protected $silent = false; + protected bool $canClimb = false; + protected bool $canClimbWalls = false; + protected bool $immobile = false; + protected bool $invisible = false; + protected bool $silent = false; - /** @var int|null */ - protected $ownerId = null; - /** @var int|null */ - protected $targetId = null; + protected ?int $ownerId = null; + protected ?int $targetId = null; private bool $constructorCalled = false; diff --git a/src/entity/Human.php b/src/entity/Human.php index ac105df308..a486c9d998 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -74,28 +74,18 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ public static function getNetworkTypeId() : string{ return EntityIds::PLAYER; } - /** @var PlayerInventory */ - protected $inventory; + protected PlayerInventory $inventory; + protected PlayerOffHandInventory $offHandInventory; + protected PlayerEnderInventory $enderInventory; - /** @var PlayerOffHandInventory */ - protected $offHandInventory; + protected UuidInterface $uuid; - /** @var PlayerEnderInventory */ - protected $enderInventory; + protected Skin $skin; - /** @var UuidInterface */ - protected $uuid; + protected HungerManager $hungerManager; + protected ExperienceManager $xpManager; - /** @var Skin */ - protected $skin; - - /** @var HungerManager */ - protected $hungerManager; - /** @var ExperienceManager */ - protected $xpManager; - - /** @var int */ - protected $xpSeed; + protected int $xpSeed; public function __construct(Location $location, Skin $skin, ?CompoundTag $nbt = null){ $this->skin = $skin; @@ -383,9 +373,9 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ public function getDrops() : array{ return array_filter(array_merge( - $this->inventory !== null ? array_values($this->inventory->getContents()) : [], - $this->armorInventory !== null ? array_values($this->armorInventory->getContents()) : [], - $this->offHandInventory !== null ? array_values($this->offHandInventory->getContents()) : [], + array_values($this->inventory->getContents()), + array_values($this->armorInventory->getContents()), + array_values($this->offHandInventory->getContents()), ), function(Item $item) : bool{ return !$item->hasEnchantment(VanillaEnchantments::VANISHING()); }); } @@ -404,55 +394,51 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ $inventoryTag = new ListTag([], NBT::TAG_Compound); $nbt->setTag("Inventory", $inventoryTag); - if($this->inventory !== null){ - //Normal inventory - $slotCount = $this->inventory->getSize() + $this->inventory->getHotbarSize(); - for($slot = $this->inventory->getHotbarSize(); $slot < $slotCount; ++$slot){ - $item = $this->inventory->getItem($slot - 9); - if(!$item->isNull()){ - $inventoryTag->push($item->nbtSerialize($slot)); - } - } - //Armor - for($slot = 100; $slot < 104; ++$slot){ - $item = $this->armorInventory->getItem($slot - 100); - if(!$item->isNull()){ - $inventoryTag->push($item->nbtSerialize($slot)); - } + //Normal inventory + $slotCount = $this->inventory->getSize() + $this->inventory->getHotbarSize(); + for($slot = $this->inventory->getHotbarSize(); $slot < $slotCount; ++$slot){ + $item = $this->inventory->getItem($slot - 9); + if(!$item->isNull()){ + $inventoryTag->push($item->nbtSerialize($slot)); } - - $nbt->setInt("SelectedInventorySlot", $this->inventory->getHeldItemIndex()); } + + //Armor + for($slot = 100; $slot < 104; ++$slot){ + $item = $this->armorInventory->getItem($slot - 100); + if(!$item->isNull()){ + $inventoryTag->push($item->nbtSerialize($slot)); + } + } + + $nbt->setInt("SelectedInventorySlot", $this->inventory->getHeldItemIndex()); + $offHandItem = $this->offHandInventory->getItem(0); if(!$offHandItem->isNull()){ $nbt->setTag("OffHandItem", $offHandItem->nbtSerialize()); } - if($this->enderInventory !== null){ - /** @var CompoundTag[] $items */ - $items = []; + /** @var CompoundTag[] $items */ + $items = []; - $slotCount = $this->enderInventory->getSize(); - for($slot = 0; $slot < $slotCount; ++$slot){ - $item = $this->enderInventory->getItem($slot); - if(!$item->isNull()){ - $items[] = $item->nbtSerialize($slot); - } + $slotCount = $this->enderInventory->getSize(); + for($slot = 0; $slot < $slotCount; ++$slot){ + $item = $this->enderInventory->getItem($slot); + if(!$item->isNull()){ + $items[] = $item->nbtSerialize($slot); } - - $nbt->setTag("EnderChestInventory", new ListTag($items, NBT::TAG_Compound)); } - if($this->skin !== null){ - $nbt->setTag("Skin", CompoundTag::create() - ->setString("Name", $this->skin->getSkinId()) - ->setByteArray("Data", $this->skin->getSkinData()) - ->setByteArray("CapeData", $this->skin->getCapeData()) - ->setString("GeometryName", $this->skin->getGeometryName()) - ->setByteArray("GeometryData", $this->skin->getGeometryData()) - ); - } + $nbt->setTag("EnderChestInventory", new ListTag($items, NBT::TAG_Compound)); + + $nbt->setTag("Skin", CompoundTag::create() + ->setString("Name", $this->skin->getSkinId()) + ->setByteArray("Data", $this->skin->getSkinData()) + ->setByteArray("CapeData", $this->skin->getCapeData()) + ->setString("GeometryName", $this->skin->getGeometryName()) + ->setByteArray("GeometryData", $this->skin->getGeometryData()) + ); return $nbt; } @@ -512,11 +498,13 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } protected function destroyCycles() : void{ - $this->inventory = null; - $this->offHandInventory = null; - $this->enderInventory = null; - $this->hungerManager = null; - $this->xpManager = null; + unset( + $this->inventory, + $this->offHandInventory, + $this->enderInventory, + $this->hungerManager, + $this->xpManager + ); parent::destroyCycles(); } } diff --git a/src/entity/Living.php b/src/entity/Living.php index 82cef8eb17..52dc02dbc3 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -76,47 +76,30 @@ use const M_PI; abstract class Living extends Entity{ protected const DEFAULT_BREATH_TICKS = 300; - /** @var int */ - protected $attackTime = 0; + protected int $attackTime = 0; - /** @var int */ - public $deadTicks = 0; - /** @var int */ - protected $maxDeadTicks = 25; + public int $deadTicks = 0; + protected int $maxDeadTicks = 25; - /** @var float */ - protected $jumpVelocity = 0.42; + protected float $jumpVelocity = 0.42; - /** @var EffectManager */ - protected $effectManager; + protected EffectManager $effectManager; - /** @var ArmorInventory */ - protected $armorInventory; + protected ArmorInventory $armorInventory; - /** @var bool */ - protected $breathing = true; - /** @var int */ - protected $breathTicks = self::DEFAULT_BREATH_TICKS; - /** @var int */ - protected $maxBreathTicks = self::DEFAULT_BREATH_TICKS; + protected bool $breathing = true; + protected int $breathTicks = self::DEFAULT_BREATH_TICKS; + protected int $maxBreathTicks = self::DEFAULT_BREATH_TICKS; - /** @var Attribute */ - protected $healthAttr; - /** @var Attribute */ - protected $absorptionAttr; - /** @var Attribute */ - protected $knockbackResistanceAttr; - /** @var Attribute */ - protected $moveSpeedAttr; + protected Attribute $healthAttr; + protected Attribute $absorptionAttr; + protected Attribute $knockbackResistanceAttr; + protected Attribute $moveSpeedAttr; - /** @var bool */ - protected $sprinting = false; - /** @var bool */ - protected $sneaking = false; - /** @var bool */ - protected $gliding = false; - /** @var bool */ - protected $swimming = false; + protected bool $sprinting = false; + protected bool $sneaking = false; + protected bool $gliding = false; + protected bool $swimming = false; protected function getInitialDragMultiplier() : float{ return 0.02; } @@ -851,8 +834,10 @@ abstract class Living extends Entity{ } protected function destroyCycles() : void{ - $this->armorInventory = null; - $this->effectManager = null; + unset( + $this->armorInventory, + $this->effectManager + ); parent::destroyCycles(); } } diff --git a/src/entity/Squid.php b/src/entity/Squid.php index 5962ba1bbc..697b4d8ee7 100644 --- a/src/entity/Squid.php +++ b/src/entity/Squid.php @@ -39,10 +39,8 @@ class Squid extends WaterAnimal{ public static function getNetworkTypeId() : string{ return EntityIds::SQUID; } - /** @var Vector3|null */ - public $swimDirection = null; - /** @var float */ - public $swimSpeed = 0.1; + public ?Vector3 $swimDirection = null; + public float $swimSpeed = 0.1; private int $switchDirectionTicker = 0; diff --git a/src/entity/WaterAnimal.php b/src/entity/WaterAnimal.php index 5edae8ffd4..9911e432b5 100644 --- a/src/entity/WaterAnimal.php +++ b/src/entity/WaterAnimal.php @@ -28,8 +28,7 @@ use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataFlags; abstract class WaterAnimal extends Living implements Ageable{ - /** @var bool */ - protected $baby = false; + protected bool $baby = false; public function isBaby() : bool{ return $this->baby; diff --git a/src/entity/effect/EffectManager.php b/src/entity/effect/EffectManager.php index 910a889216..9eb8fc7c04 100644 --- a/src/entity/effect/EffectManager.php +++ b/src/entity/effect/EffectManager.php @@ -33,25 +33,22 @@ use function count; use function spl_object_id; class EffectManager{ - /** @var EffectInstance[] */ - protected $effects = []; + protected array $effects = []; - /** @var Color */ - protected $bubbleColor; - /** @var bool */ - protected $onlyAmbientEffects = false; + protected Color $bubbleColor; + protected bool $onlyAmbientEffects = false; /** * @var \Closure[]|ObjectSet * @phpstan-var ObjectSet<\Closure(EffectInstance, bool $replacesOldEffect) : void> */ - protected $effectAddHooks; + protected ObjectSet $effectAddHooks; /** * @var \Closure[]|ObjectSet * @phpstan-var ObjectSet<\Closure(EffectInstance) : void> */ - protected $effectRemoveHooks; + protected ObjectSet $effectRemoveHooks; public function __construct( private Living $entity diff --git a/src/entity/object/ExperienceOrb.php b/src/entity/object/ExperienceOrb.php index fc16c50f22..1c63b0ef3c 100644 --- a/src/entity/object/ExperienceOrb.php +++ b/src/entity/object/ExperienceOrb.php @@ -78,23 +78,15 @@ class ExperienceOrb extends Entity{ return $result; } - /** @var int */ - protected $age = 0; + protected int $age = 0; - /** - * @var int - * Ticker used for determining interval in which to look for new target players. - */ - protected $lookForTargetTime = 0; + /** Ticker used for determining interval in which to look for new target players. */ + protected int $lookForTargetTime = 0; - /** - * @var int|null - * Runtime entity ID of the player this XP orb is targeting. - */ - protected $targetPlayerRuntimeId = null; + /** Runtime entity ID of the player this XP orb is targeting. */ + protected ?int $targetPlayerRuntimeId = null; - /** @var int */ - protected $xpValue; + protected int $xpValue; public function __construct(Location $location, int $xpValue, ?CompoundTag $nbt = null){ $this->xpValue = $xpValue; diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 0dd8daebb7..1a61a2fba1 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -46,8 +46,7 @@ class FallingBlock extends Entity{ public static function getNetworkTypeId() : string{ return EntityIds::FALLING_BLOCK; } - /** @var Block */ - protected $block; + protected Block $block; public function __construct(Location $location, Block $block, ?CompoundTag $nbt = null){ $this->block = $block; diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 14b66c7d2f..53b0b3383a 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -50,17 +50,11 @@ class ItemEntity extends Entity{ public const NEVER_DESPAWN = -1; public const MAX_DESPAWN_DELAY = 32767 + self::DEFAULT_DESPAWN_DELAY; //max value storable by mojang NBT :( - /** @var string */ - protected $owner = ""; - /** @var string */ - protected $thrower = ""; - /** @var int */ - protected $pickupDelay = 0; - /** @var Item */ - protected $item; - - /** @var int */ - protected $despawnDelay = self::DEFAULT_DESPAWN_DELAY; + protected string $owner = ""; + protected string $thrower = ""; + protected int $pickupDelay = 0; + protected int $despawnDelay = self::DEFAULT_DESPAWN_DELAY; + protected Item $item; public function __construct(Location $location, Item $item, ?CompoundTag $nbt = null){ if($item->isNull()){ @@ -196,12 +190,8 @@ class ItemEntity extends Entity{ } $nbt->setShort("Age", $age); $nbt->setShort("PickupDelay", $this->pickupDelay); - if($this->owner !== null){ - $nbt->setString("Owner", $this->owner); - } - if($this->thrower !== null){ - $nbt->setString("Thrower", $this->thrower); - } + $nbt->setString("Owner", $this->owner); + $nbt->setString("Thrower", $this->thrower); return $nbt; } diff --git a/src/entity/object/Painting.php b/src/entity/object/Painting.php index 16392dc743..4613af96ce 100644 --- a/src/entity/object/Painting.php +++ b/src/entity/object/Painting.php @@ -56,12 +56,9 @@ class Painting extends Entity{ Facing::EAST => 3 ]; - /** @var Vector3 */ - protected $blockIn; - /** @var int */ - protected $facing = Facing::NORTH; - /** @var PaintingMotive */ - protected $motive; + protected Vector3 $blockIn; + protected int $facing; + protected PaintingMotive $motive; public function __construct(Location $location, Vector3 $blockIn, int $facing, PaintingMotive $motive, ?CompoundTag $nbt = null){ $this->motive = $motive; diff --git a/src/entity/object/PaintingMotive.php b/src/entity/object/PaintingMotive.php index 28b52efe3b..a2c6f221af 100644 --- a/src/entity/object/PaintingMotive.php +++ b/src/entity/object/PaintingMotive.php @@ -84,18 +84,11 @@ class PaintingMotive{ return self::$motives; } - /** @var string */ - protected $name; - /** @var int */ - protected $width; - /** @var int */ - protected $height; - - public function __construct(int $width, int $height, string $name){ - $this->name = $name; - $this->width = $width; - $this->height = $height; - } + public function __construct( + protected int $width, + protected int $height, + protected string $name + ){} public function getName() : string{ return $this->name; diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index 06dbf4e16f..97f68e8dea 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -41,9 +41,7 @@ class PrimedTNT extends Entity implements Explosive{ public static function getNetworkTypeId() : string{ return EntityIds::TNT; } - /** @var int */ - protected $fuse; - + protected int $fuse; protected bool $worksUnderwater = false; protected function getInitialSizeInfo() : EntitySizeInfo{ return new EntitySizeInfo(0.98, 0.98); } diff --git a/src/entity/projectile/Arrow.php b/src/entity/projectile/Arrow.php index 73ee9599c1..023ea55841 100644 --- a/src/entity/projectile/Arrow.php +++ b/src/entity/projectile/Arrow.php @@ -52,20 +52,11 @@ class Arrow extends Projectile{ private const TAG_PICKUP = "pickup"; //TAG_Byte public const TAG_CRIT = "crit"; //TAG_Byte - /** @var float */ - protected $damage = 2.0; - - /** @var int */ - protected $pickupMode = self::PICKUP_ANY; - - /** @var float */ - protected $punchKnockback = 0.0; - - /** @var int */ - protected $collideTicks = 0; - - /** @var bool */ - protected $critical = false; + protected float $damage = 2.0; + protected int $pickupMode = self::PICKUP_ANY; + protected float $punchKnockback = 0.0; + protected int $collideTicks = 0; + protected bool $critical = false; public function __construct(Location $location, ?Entity $shootingEntity, bool $critical, ?CompoundTag $nbt = null){ parent::__construct($location, $shootingEntity, $nbt); diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 1f652bda48..40e7cb45d5 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -51,11 +51,8 @@ use const PHP_INT_MAX; abstract class Projectile extends Entity{ - /** @var float */ - protected $damage = 0.0; - - /** @var Block|null */ - protected $blockHit; + protected float $damage = 0.0; + protected ?Block $blockHit = null; public function __construct(Location $location, ?Entity $shootingEntity, ?CompoundTag $nbt = null){ parent::__construct($location, $nbt); diff --git a/src/entity/projectile/SplashPotion.php b/src/entity/projectile/SplashPotion.php index d35360f54c..555a8d7557 100644 --- a/src/entity/projectile/SplashPotion.php +++ b/src/entity/projectile/SplashPotion.php @@ -52,8 +52,7 @@ class SplashPotion extends Throwable{ public static function getNetworkTypeId() : string{ return EntityIds::SPLASH_POTION; } - /** @var bool */ - protected $linger = false; + protected bool $linger = false; protected PotionType $potionType; public function __construct(Location $location, ?Entity $shootingEntity, PotionType $potionType, ?CompoundTag $nbt = null){ diff --git a/src/player/Player.php b/src/player/Player.php index e5d87793b0..a120231e1a 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -241,8 +241,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected ?float $lastMovementProcess = null; protected int $inAirTicks = 0; - /** @var float */ - protected $stepHeight = 0.6; + + protected float $stepHeight = 0.6; protected ?Vector3 $sleeping = null; private ?Position $spawnPosition = null; @@ -2217,16 +2217,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->getWorld()->dropItem($this->location, $item); } - if($this->inventory !== null){ - $this->inventory->setHeldItemIndex(0); - $this->inventory->clearAll(); - } - if($this->armorInventory !== null){ - $this->armorInventory->clearAll(); - } - if($this->offHandInventory !== null){ - $this->offHandInventory->clearAll(); - } + $this->inventory->setHeldItemIndex(0); + $this->inventory->clearAll(); + $this->armorInventory->clearAll(); + $this->offHandInventory->clearAll(); } if(!$ev->getKeepXp()){ From 2bb99fa6771b255b7f49d00c43d840c7370203e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Jun 2022 21:21:31 +0100 Subject: [PATCH 0115/1858] Modernize Position and Location [bc break] --- src/entity/Location.php | 6 ++---- src/world/Position.php | 11 ++--------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/entity/Location.php b/src/entity/Location.php index 2ebbb26619..53ccf91f2b 100644 --- a/src/entity/Location.php +++ b/src/entity/Location.php @@ -29,10 +29,8 @@ use pocketmine\world\World; class Location extends Position{ - /** @var float */ - public $yaw; - /** @var float */ - public $pitch; + public float $yaw; + public float $pitch; public function __construct(float $x, float $y, float $z, ?World $world, float $yaw, float $pitch){ $this->yaw = $yaw; diff --git a/src/world/Position.php b/src/world/Position.php index 5339adbec9..b7775e53d3 100644 --- a/src/world/Position.php +++ b/src/world/Position.php @@ -28,16 +28,9 @@ use pocketmine\utils\AssumptionFailedError; use function assert; class Position extends Vector3{ + public ?World $world = null; - /** @var World|null */ - public $world = null; - - /** - * @param float|int $x - * @param float|int $y - * @param float|int $z - */ - public function __construct($x, $y, $z, ?World $world){ + public function __construct(float|int $x, float|int $y, float|int $z, ?World $world){ parent::__construct($x, $y, $z); if($world !== null && !$world->isLoaded()){ throw new \InvalidArgumentException("Specified world has been unloaded and cannot be used"); From 23695fb900297dc0bda76e2839bfe85065864bb0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Jun 2022 16:55:22 +0100 Subject: [PATCH 0116/1858] RegionLoader: remove dead static property [bc break] --- src/world/format/io/region/RegionLoader.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/world/format/io/region/RegionLoader.php b/src/world/format/io/region/RegionLoader.php index 4490524541..bdd31b8dc1 100644 --- a/src/world/format/io/region/RegionLoader.php +++ b/src/world/format/io/region/RegionLoader.php @@ -64,9 +64,6 @@ class RegionLoader{ public const FIRST_SECTOR = 2; //location table occupies 0 and 1 - /** @var int */ - public static $COMPRESSION_LEVEL = 7; - /** @var string */ protected $filePath; /** @var resource */ From 083a35f97023a2b844feee56c1d84864f5235e1d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Jun 2022 18:16:32 +0100 Subject: [PATCH 0117/1858] Modernize property type declarations --- src/block/tile/Barrel.php | 3 +- src/block/tile/Chest.php | 6 +- src/block/tile/Comparator.php | 3 +- src/block/tile/Furnace.php | 3 +- src/block/tile/ShulkerBox.php | 6 +- src/block/tile/Sign.php | 7 +- src/block/tile/Tile.php | 9 +- src/block/utils/AnyFacingTrait.php | 3 +- src/block/utils/HorizontalFacingTrait.php | 3 +- src/block/utils/PillarRotationTrait.php | 4 +- src/command/Command.php | 9 +- src/command/SimpleCommandMap.php | 2 +- src/console/ConsoleCommandSender.php | 7 +- src/crafting/CraftingManager.php | 10 +- src/crafting/FurnaceRecipeManager.php | 2 +- src/entity/Attribute.php | 31 ++--- src/entity/object/PaintingMotive.php | 2 +- src/event/Event.php | 3 +- src/event/block/BlockBreakEvent.php | 26 ++-- src/event/block/BlockEvent.php | 9 +- src/event/block/BlockPlaceEvent.php | 23 +--- .../entity/EntityCombustByBlockEvent.php | 3 +- .../entity/EntityCombustByEntityEvent.php | 3 +- src/event/entity/EntityCombustEvent.php | 3 +- src/event/entity/EntityEvent.php | 7 +- src/event/entity/EntityExplodeEvent.php | 19 +-- src/event/entity/ExplosionPrimeEvent.php | 8 +- src/event/inventory/InventoryEvent.php | 9 +- src/event/player/PlayerChatEvent.php | 21 +-- .../player/PlayerCommandPreprocessEvent.php | 9 +- src/event/player/PlayerDataSaveEvent.php | 14 +- src/event/player/PlayerDeathEvent.php | 3 +- src/event/player/PlayerEvent.php | 3 +- src/event/player/PlayerExhaustEvent.php | 8 +- .../player/PlayerExperienceChangeEvent.php | 3 - .../player/PlayerGameModeChangeEvent.php | 11 +- src/event/player/PlayerInteractEvent.php | 28 ++-- src/event/player/PlayerJoinEvent.php | 9 +- src/event/player/PlayerKickEvent.php | 14 +- src/event/player/PlayerLoginEvent.php | 9 +- src/event/player/PlayerPreLoginEvent.php | 11 +- src/event/player/PlayerQuitEvent.php | 14 +- src/event/player/PlayerRespawnEvent.php | 9 +- src/event/player/PlayerToggleFlightEvent.php | 9 +- src/event/player/PlayerToggleSneakEvent.php | 9 +- src/event/player/PlayerToggleSprintEvent.php | 9 +- src/event/player/PlayerTransferEvent.php | 17 +-- src/event/server/CommandEvent.php | 14 +- src/event/server/NetworkInterfaceEvent.php | 9 +- src/inventory/ArmorInventory.php | 8 +- src/inventory/BaseInventory.php | 7 +- src/inventory/PlayerCursorInventory.php | 13 +- src/inventory/PlayerInventory.php | 14 +- .../transaction/CraftingTransaction.php | 10 +- .../transaction/InventoryTransaction.php | 15 +-- .../transaction/action/InventoryAction.php | 13 +- .../transaction/action/SlotChangeAction.php | 14 +- src/item/Armor.php | 3 +- src/item/Durable.php | 4 +- src/item/Item.php | 32 ++--- src/item/ItemEnchantmentHandlingTrait.php | 2 +- src/item/TieredTool.php | 4 +- .../enchantment/ProtectionEnchantment.php | 5 +- src/lang/Language.php | 8 +- src/lang/Translatable.php | 12 +- src/network/mcpe/ChunkRequestTask.php | 14 +- .../mcpe/encryption/EncryptionContext.php | 3 +- .../mcpe/handler/InGamePacketHandler.php | 12 +- src/network/mcpe/raklib/RakLibServer.php | 64 ++-------- src/permission/BanEntry.php | 3 +- src/permission/PermissionManager.php | 4 +- src/player/GameMode.php | 2 +- src/plugin/PluginLoadTriage.php | 6 +- src/plugin/PluginManager.php | 6 +- src/promise/PromiseSharedData.php | 7 +- src/resourcepacks/ZippedResourcePack.php | 12 +- src/scheduler/AsyncPool.php | 9 +- src/scheduler/AsyncTask.php | 3 +- src/scheduler/TaskHandler.php | 26 ++-- src/scheduler/TaskScheduler.php | 12 +- src/stats/SendUsageTask.php | 6 +- src/thread/CommonThreadPartsTrait.php | 6 +- src/timings/Timings.php | 120 ++++++------------ src/updater/UpdateChecker.php | 10 +- src/utils/Config.php | 2 +- src/utils/Internet.php | 6 +- src/utils/MainLogger.php | 3 +- src/utils/Random.php | 3 +- src/utils/ServerKiller.php | 13 +- src/world/Explosion.php | 28 ++-- src/world/SimpleChunkManager.php | 2 +- src/world/World.php | 11 +- src/world/biome/Biome.php | 6 +- src/world/format/Chunk.php | 16 +-- src/world/format/io/BaseWorldProvider.php | 10 +- src/world/format/io/WorldProviderManager.php | 2 +- src/world/format/io/data/BaseNbtWorldData.php | 13 +- src/world/format/io/leveldb/LevelDB.php | 3 +- src/world/format/io/region/RegionLoader.php | 18 +-- .../format/io/region/RegionWorldProvider.php | 2 +- src/world/generator/Generator.php | 15 +-- src/world/generator/GeneratorRegisterTask.php | 30 ++--- .../generator/GeneratorUnregisterTask.php | 4 +- src/world/generator/noise/Noise.php | 17 +-- src/world/generator/noise/Simplex.php | 11 +- src/world/generator/object/BirchTree.php | 8 +- src/world/generator/object/Ore.php | 12 +- src/world/generator/object/Tree.php | 19 +-- src/world/light/LightPopulationTask.php | 3 +- src/world/light/LightPropagationContext.php | 18 +-- src/world/light/LightUpdate.php | 20 +-- src/world/particle/FloatingTextParticle.php | 18 +-- src/world/particle/MobSpawnParticle.php | 12 +- src/world/utils/SubChunkExplorer.php | 24 ++-- 114 files changed, 431 insertions(+), 863 deletions(-) diff --git a/src/block/tile/Barrel.php b/src/block/tile/Barrel.php index 68491cd089..e6978fca99 100644 --- a/src/block/tile/Barrel.php +++ b/src/block/tile/Barrel.php @@ -32,8 +32,7 @@ class Barrel extends Spawnable implements Container, Nameable{ use NameableTrait; use ContainerTrait; - /** @var BarrelInventory */ - protected $inventory; + protected BarrelInventory $inventory; public function __construct(World $world, Vector3 $pos){ parent::__construct($world, $pos); diff --git a/src/block/tile/Chest.php b/src/block/tile/Chest.php index 1f49a2ddb2..6f68d4e71c 100644 --- a/src/block/tile/Chest.php +++ b/src/block/tile/Chest.php @@ -44,10 +44,8 @@ class Chest extends Spawnable implements Container, Nameable{ public const TAG_PAIRZ = "pairz"; public const TAG_PAIR_LEAD = "pairlead"; - /** @var ChestInventory */ - protected $inventory; - /** @var DoubleChestInventory|null */ - protected $doubleInventory = null; + protected ChestInventory $inventory; + protected ?DoubleChestInventory $doubleInventory = null; private ?int $pairX = null; private ?int $pairZ = null; diff --git a/src/block/tile/Comparator.php b/src/block/tile/Comparator.php index 317a682f48..acc918b2cb 100644 --- a/src/block/tile/Comparator.php +++ b/src/block/tile/Comparator.php @@ -33,8 +33,7 @@ use pocketmine\nbt\tag\CompoundTag; class Comparator extends Tile{ private const TAG_OUTPUT_SIGNAL = "OutputSignal"; //int - /** @var int */ - protected $signalStrength = 0; + protected int $signalStrength = 0; public function getSignalStrength() : int{ return $this->signalStrength; diff --git a/src/block/tile/Furnace.php b/src/block/tile/Furnace.php index 806c53a07b..389e367b84 100644 --- a/src/block/tile/Furnace.php +++ b/src/block/tile/Furnace.php @@ -48,8 +48,7 @@ abstract class Furnace extends Spawnable implements Container, Nameable{ public const TAG_COOK_TIME = "CookTime"; public const TAG_MAX_TIME = "MaxTime"; - /** @var FurnaceInventory */ - protected $inventory; + protected FurnaceInventory $inventory; private int $remainingFuelTime = 0; private int $cookTime = 0; private int $maxFuelTime = 0; diff --git a/src/block/tile/ShulkerBox.php b/src/block/tile/ShulkerBox.php index fb740c5663..a649875a97 100644 --- a/src/block/tile/ShulkerBox.php +++ b/src/block/tile/ShulkerBox.php @@ -38,11 +38,9 @@ class ShulkerBox extends Spawnable implements Container, Nameable{ public const TAG_FACING = "facing"; - /** @var int */ - protected $facing = Facing::NORTH; + protected int $facing = Facing::NORTH; - /** @var ShulkerBoxInventory */ - protected $inventory; + protected ShulkerBoxInventory $inventory; public function __construct(World $world, Vector3 $pos){ parent::__construct($world, $pos); diff --git a/src/block/tile/Sign.php b/src/block/tile/Sign.php index 38cad085ff..34c288922c 100644 --- a/src/block/tile/Sign.php +++ b/src/block/tile/Sign.php @@ -50,11 +50,8 @@ class Sign extends Spawnable{ return array_slice(array_pad(explode("\n", $blob), 4, ""), 0, 4); } - /** @var SignText */ - protected $text; - - /** @var int|null */ - protected $editorEntityRuntimeId = null; + protected SignText $text; + protected ?int $editorEntityRuntimeId = null; public function __construct(World $world, Vector3 $pos){ $this->text = new SignText(); diff --git a/src/block/tile/Tile.php b/src/block/tile/Tile.php index 00ff1bed64..cc019277de 100644 --- a/src/block/tile/Tile.php +++ b/src/block/tile/Tile.php @@ -45,12 +45,9 @@ abstract class Tile{ public const TAG_Y = "y"; public const TAG_Z = "z"; - /** @var Position */ - protected $position; - /** @var bool */ - public $closed = false; - /** @var TimingsHandler */ - protected $timings; + protected Position $position; + public bool $closed = false; + protected TimingsHandler $timings; public function __construct(World $world, Vector3 $pos){ $this->position = Position::fromObject($pos, $world); diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 751e673781..b8c5d8ec58 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -26,8 +26,7 @@ namespace pocketmine\block\utils; use pocketmine\math\Facing; trait AnyFacingTrait{ - /** @var int */ - protected $facing = Facing::DOWN; + protected int $facing = Facing::DOWN; public function getFacing() : int{ return $this->facing; } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 54cac0cda3..380d1fa50f 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -27,8 +27,7 @@ use pocketmine\math\Axis; use pocketmine\math\Facing; trait HorizontalFacingTrait{ - /** @var int */ - protected $facing = Facing::NORTH; + protected int $facing = Facing::NORTH; public function getFacing() : int{ return $this->facing; } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 806782db8f..ec81a4a245 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -32,9 +32,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ - - /** @var int */ - protected $axis = Axis::Y; + protected int $axis = Axis::Y; /** @see Axis */ public function getAxis() : int{ return $this->axis; } diff --git a/src/command/Command.php b/src/command/Command.php index 51e3ef51c1..d6395b651c 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -53,17 +53,14 @@ abstract class Command{ private ?CommandMap $commandMap = null; - /** @var Translatable|string */ - protected $description = ""; + protected Translatable|string $description = ""; - /** @var Translatable|string */ - protected $usageMessage; + protected Translatable|string $usageMessage; private ?string $permission = null; private ?string $permissionMessage = null; - /** @var TimingsHandler|null */ - public $timings = null; + public ?TimingsHandler $timings = null; /** * @param string[] $aliases diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 548f16c39d..bce6bc7405 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -80,7 +80,7 @@ use function trim; class SimpleCommandMap implements CommandMap{ /** @var Command[] */ - protected $knownCommands = []; + protected array $knownCommands = []; public function __construct(private Server $server){ $this->setDefaultCommands(); diff --git a/src/console/ConsoleCommandSender.php b/src/console/ConsoleCommandSender.php index e08a657062..b59930da63 100644 --- a/src/console/ConsoleCommandSender.php +++ b/src/console/ConsoleCommandSender.php @@ -37,11 +37,8 @@ use const PHP_INT_MAX; class ConsoleCommandSender implements CommandSender{ use PermissibleDelegateTrait; - /** - * @var int|null - * @phpstan-var positive-int|null - */ - protected $lineHeight = null; + /** @phpstan-var positive-int|null */ + protected ?int $lineHeight = null; public function __construct( private Server $server, diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index f9d28bf287..5ff70bf64e 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -35,27 +35,27 @@ class CraftingManager{ use DestructorCallbackTrait; /** @var ShapedRecipe[][] */ - protected $shapedRecipes = []; + protected array $shapedRecipes = []; /** @var ShapelessRecipe[][] */ - protected $shapelessRecipes = []; + protected array $shapelessRecipes = []; /** * @var FurnaceRecipeManager[] * @phpstan-var array */ - protected $furnaceRecipeManagers; + protected array $furnaceRecipeManagers; /** * @var PotionTypeRecipe[][] * @phpstan-var array> */ - protected $potionTypeRecipes = []; + protected array $potionTypeRecipes = []; /** * @var PotionContainerChangeRecipe[][] * @phpstan-var array> */ - protected $potionContainerChangeRecipes = []; + protected array $potionContainerChangeRecipes = []; /** @phpstan-var ObjectSet<\Closure() : void> */ private ObjectSet $recipeRegisteredCallbacks; diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index 1f16f47070..1660d0c42b 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -28,7 +28,7 @@ use pocketmine\utils\ObjectSet; final class FurnaceRecipeManager{ /** @var FurnaceRecipe[] */ - protected $furnaceRecipes = []; + protected array $furnaceRecipes = []; /** @phpstan-var ObjectSet<\Closure(FurnaceRecipe) : void> */ private ObjectSet $recipeRegisteredCallbacks; diff --git a/src/entity/Attribute.php b/src/entity/Attribute.php index 3f9bc7faf0..3072fc7619 100644 --- a/src/entity/Attribute.php +++ b/src/entity/Attribute.php @@ -48,32 +48,19 @@ class Attribute{ public const ZOMBIE_SPAWN_REINFORCEMENTS = self::MC_PREFIX . "zombie.spawn_reinforcements"; public const LAVA_MOVEMENT = self::MC_PREFIX . "lava_movement"; - /** @var string */ - protected $id; - /** @var float */ - protected $minValue; - /** @var float */ - protected $maxValue; - /** @var float */ - protected $defaultValue; - /** @var float */ - protected $currentValue; - /** @var bool */ - protected $shouldSend; + protected float $currentValue; + protected bool $desynchronized = true; - /** @var bool */ - protected $desynchronized = true; - - public function __construct(string $id, float $minValue, float $maxValue, float $defaultValue, bool $shouldSend = true){ + public function __construct( + protected string $id, + protected float $minValue, + protected float $maxValue, + protected float $defaultValue, + protected bool $shouldSend = true + ){ if($minValue > $maxValue || $defaultValue > $maxValue || $defaultValue < $minValue){ throw new \InvalidArgumentException("Invalid ranges: min value: $minValue, max value: $maxValue, $defaultValue: $defaultValue"); } - $this->id = $id; - $this->minValue = $minValue; - $this->maxValue = $maxValue; - $this->defaultValue = $defaultValue; - $this->shouldSend = $shouldSend; - $this->currentValue = $this->defaultValue; } diff --git a/src/entity/object/PaintingMotive.php b/src/entity/object/PaintingMotive.php index a2c6f221af..dd61cf3c67 100644 --- a/src/entity/object/PaintingMotive.php +++ b/src/entity/object/PaintingMotive.php @@ -27,7 +27,7 @@ class PaintingMotive{ private static bool $initialized = false; /** @var PaintingMotive[] */ - protected static $motives = []; + protected static array $motives = []; public static function init() : void{ foreach([ diff --git a/src/event/Event.php b/src/event/Event.php index 17f0417c5d..f77b54ced4 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -33,8 +33,7 @@ abstract class Event{ private static int $eventCallDepth = 1; - /** @var string|null */ - protected $eventName = null; + protected ?string $eventName = null; final public function getEventName() : string{ return $this->eventName ?? get_class($this); diff --git a/src/event/block/BlockBreakEvent.php b/src/event/block/BlockBreakEvent.php index e11a71ebc9..369dca2054 100644 --- a/src/event/block/BlockBreakEvent.php +++ b/src/event/block/BlockBreakEvent.php @@ -35,30 +35,22 @@ use pocketmine\player\Player; class BlockBreakEvent extends BlockEvent implements Cancellable{ use CancellableTrait; - /** @var Player */ - protected $player; - - /** @var Item */ - protected $item; - - /** @var bool */ - protected $instaBreak = false; /** @var Item[] */ - protected $blockDrops = []; - /** @var int */ - protected $xpDrops; + protected array $blockDrops = []; /** * @param Item[] $drops */ - public function __construct(Player $player, Block $block, Item $item, bool $instaBreak = false, array $drops = [], int $xpDrops = 0){ + public function __construct( + protected Player $player, + Block $block, + protected Item $item, + protected bool $instaBreak = false, + array $drops = [], + protected int $xpDrops = 0 + ){ parent::__construct($block); - $this->item = $item; - $this->player = $player; - - $this->instaBreak = $instaBreak; $this->setDrops($drops); - $this->xpDrops = $xpDrops; } /** diff --git a/src/event/block/BlockEvent.php b/src/event/block/BlockEvent.php index d506529ba7..16e5a81e9c 100644 --- a/src/event/block/BlockEvent.php +++ b/src/event/block/BlockEvent.php @@ -30,12 +30,9 @@ use pocketmine\block\Block; use pocketmine\event\Event; abstract class BlockEvent extends Event{ - /** @var Block */ - protected $block; - - public function __construct(Block $block){ - $this->block = $block; - } + public function __construct( + protected Block $block + ){} public function getBlock() : Block{ return $this->block; diff --git a/src/event/block/BlockPlaceEvent.php b/src/event/block/BlockPlaceEvent.php index 955b901346..f5e9c218d9 100644 --- a/src/event/block/BlockPlaceEvent.php +++ b/src/event/block/BlockPlaceEvent.php @@ -35,23 +35,14 @@ use pocketmine\player\Player; class BlockPlaceEvent extends BlockEvent implements Cancellable{ use CancellableTrait; - /** @var Player */ - protected $player; - - /** @var Item */ - protected $item; - - /** @var Block */ - protected $blockReplace; - /** @var Block */ - protected $blockAgainst; - - public function __construct(Player $player, Block $blockPlace, Block $blockReplace, Block $blockAgainst, Item $item){ + public function __construct( + protected Player $player, + Block $blockPlace, + protected Block $blockReplace, + protected Block $blockAgainst, + protected Item $item + ){ parent::__construct($blockPlace); - $this->blockReplace = $blockReplace; - $this->blockAgainst = $blockAgainst; - $this->item = $item; - $this->player = $player; } /** diff --git a/src/event/entity/EntityCombustByBlockEvent.php b/src/event/entity/EntityCombustByBlockEvent.php index 9b1d56f5a6..84fc963a7d 100644 --- a/src/event/entity/EntityCombustByBlockEvent.php +++ b/src/event/entity/EntityCombustByBlockEvent.php @@ -27,8 +27,7 @@ use pocketmine\block\Block; use pocketmine\entity\Entity; class EntityCombustByBlockEvent extends EntityCombustEvent{ - /** @var Block */ - protected $combuster; + protected Block $combuster; public function __construct(Block $combuster, Entity $combustee, int $duration){ parent::__construct($combustee, $duration); diff --git a/src/event/entity/EntityCombustByEntityEvent.php b/src/event/entity/EntityCombustByEntityEvent.php index 435ab670a9..5abb723a20 100644 --- a/src/event/entity/EntityCombustByEntityEvent.php +++ b/src/event/entity/EntityCombustByEntityEvent.php @@ -26,8 +26,7 @@ namespace pocketmine\event\entity; use pocketmine\entity\Entity; class EntityCombustByEntityEvent extends EntityCombustEvent{ - /** @var Entity */ - protected $combuster; + protected Entity $combuster; public function __construct(Entity $combuster, Entity $combustee, int $duration){ parent::__construct($combustee, $duration); diff --git a/src/event/entity/EntityCombustEvent.php b/src/event/entity/EntityCombustEvent.php index 442c25f9b9..a38d82b182 100644 --- a/src/event/entity/EntityCombustEvent.php +++ b/src/event/entity/EntityCombustEvent.php @@ -33,8 +33,7 @@ use pocketmine\event\CancellableTrait; class EntityCombustEvent extends EntityEvent implements Cancellable{ use CancellableTrait; - /** @var int */ - protected $duration; + protected int $duration; public function __construct(Entity $combustee, int $duration){ $this->entity = $combustee; diff --git a/src/event/entity/EntityEvent.php b/src/event/entity/EntityEvent.php index 0a13ff0ebe..ecb234e32d 100644 --- a/src/event/entity/EntityEvent.php +++ b/src/event/entity/EntityEvent.php @@ -33,11 +33,8 @@ use pocketmine\event\Event; * @phpstan-template TEntity of Entity */ abstract class EntityEvent extends Event{ - /** - * @var Entity - * @phpstan-var TEntity - */ - protected $entity; + /** @phpstan-var TEntity */ + protected Entity $entity; /** * @return Entity diff --git a/src/event/entity/EntityExplodeEvent.php b/src/event/entity/EntityExplodeEvent.php index fa69d2fbff..333f320f4c 100644 --- a/src/event/entity/EntityExplodeEvent.php +++ b/src/event/entity/EntityExplodeEvent.php @@ -41,27 +41,20 @@ use pocketmine\world\Position; class EntityExplodeEvent extends EntityEvent implements Cancellable{ use CancellableTrait; - /** @var Position */ - protected $position; - - /** @var Block[] */ - protected $blocks; - - /** @var float */ - protected $yield; - /** * @param Block[] $blocks * @param float $yield 0-100 */ - public function __construct(Entity $entity, Position $position, array $blocks, float $yield){ + public function __construct( + Entity $entity, + protected Position $position, + protected array $blocks, + protected float $yield + ){ $this->entity = $entity; - $this->position = $position; - $this->blocks = $blocks; if($yield < 0.0 || $yield > 100.0){ throw new \InvalidArgumentException("Yield must be in range 0.0 - 100.0"); } - $this->yield = $yield; } public function getPosition() : Position{ diff --git a/src/event/entity/ExplosionPrimeEvent.php b/src/event/entity/ExplosionPrimeEvent.php index 50146a6dd9..dbbc29c6f4 100644 --- a/src/event/entity/ExplosionPrimeEvent.php +++ b/src/event/entity/ExplosionPrimeEvent.php @@ -38,16 +38,16 @@ use pocketmine\event\CancellableTrait; class ExplosionPrimeEvent extends EntityEvent implements Cancellable{ use CancellableTrait; - /** @var float */ - protected $force; private bool $blockBreaking = true; - public function __construct(Entity $entity, float $force){ + public function __construct( + Entity $entity, + protected float $force + ){ if($force <= 0){ throw new \InvalidArgumentException("Explosion radius must be positive"); } $this->entity = $entity; - $this->force = $force; } public function getForce() : float{ diff --git a/src/event/inventory/InventoryEvent.php b/src/event/inventory/InventoryEvent.php index ac19d37055..966f058003 100644 --- a/src/event/inventory/InventoryEvent.php +++ b/src/event/inventory/InventoryEvent.php @@ -31,12 +31,9 @@ use pocketmine\inventory\Inventory; use pocketmine\player\Player; abstract class InventoryEvent extends Event{ - /** @var Inventory */ - protected $inventory; - - public function __construct(Inventory $inventory){ - $this->inventory = $inventory; - } + public function __construct( + protected Inventory $inventory + ){} public function getInventory() : Inventory{ return $this->inventory; diff --git a/src/event/player/PlayerChatEvent.php b/src/event/player/PlayerChatEvent.php index 138410357e..dc8259dff7 100644 --- a/src/event/player/PlayerChatEvent.php +++ b/src/event/player/PlayerChatEvent.php @@ -35,25 +35,16 @@ use pocketmine\utils\Utils; class PlayerChatEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var string */ - protected $message; - - /** @var string */ - protected $format; - - /** @var CommandSender[] */ - protected $recipients = []; - /** * @param CommandSender[] $recipients */ - public function __construct(Player $player, string $message, array $recipients, string $format = "chat.type.text"){ + public function __construct( + Player $player, + protected string $message, + protected array $recipients, + protected string $format = "chat.type.text" + ){ $this->player = $player; - $this->message = $message; - - $this->format = $format; - - $this->recipients = $recipients; } public function getMessage() : string{ diff --git a/src/event/player/PlayerCommandPreprocessEvent.php b/src/event/player/PlayerCommandPreprocessEvent.php index afa45ddd05..4dcdb1e34b 100644 --- a/src/event/player/PlayerCommandPreprocessEvent.php +++ b/src/event/player/PlayerCommandPreprocessEvent.php @@ -41,12 +41,11 @@ use pocketmine\player\Player; class PlayerCommandPreprocessEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var string */ - protected $message; - - public function __construct(Player $player, string $message){ + public function __construct( + Player $player, + protected string $message + ){ $this->player = $player; - $this->message = $message; } public function getMessage() : string{ diff --git a/src/event/player/PlayerDataSaveEvent.php b/src/event/player/PlayerDataSaveEvent.php index a848f52562..5e840d334a 100644 --- a/src/event/player/PlayerDataSaveEvent.php +++ b/src/event/player/PlayerDataSaveEvent.php @@ -35,19 +35,11 @@ use pocketmine\player\Player; class PlayerDataSaveEvent extends Event implements Cancellable{ use CancellableTrait; - /** @var CompoundTag */ - protected $data; - /** @var string */ - protected $playerName; - public function __construct( - CompoundTag $nbt, - string $playerName, + protected CompoundTag $data, + protected string $playerName, private ?Player $player - ){ - $this->data = $nbt; - $this->playerName = $playerName; - } + ){} /** * Returns the data to be written to disk as a CompoundTag diff --git a/src/event/player/PlayerDeathEvent.php b/src/event/player/PlayerDeathEvent.php index 3c8e7ec59b..01358dd876 100644 --- a/src/event/player/PlayerDeathEvent.php +++ b/src/event/player/PlayerDeathEvent.php @@ -35,8 +35,7 @@ use pocketmine\lang\Translatable; use pocketmine\player\Player; class PlayerDeathEvent extends EntityDeathEvent{ - /** @var Player */ - protected $player; + protected Player $player; private Translatable|string $deathMessage; private bool $keepInventory = false; diff --git a/src/event/player/PlayerEvent.php b/src/event/player/PlayerEvent.php index 8be23d3509..2206363b0b 100644 --- a/src/event/player/PlayerEvent.php +++ b/src/event/player/PlayerEvent.php @@ -30,8 +30,7 @@ use pocketmine\event\Event; use pocketmine\player\Player; abstract class PlayerEvent extends Event{ - /** @var Player */ - protected $player; + protected Player $player; public function getPlayer() : Player{ return $this->player; diff --git a/src/event/player/PlayerExhaustEvent.php b/src/event/player/PlayerExhaustEvent.php index 95e3312329..ec5b1d2e9b 100644 --- a/src/event/player/PlayerExhaustEvent.php +++ b/src/event/player/PlayerExhaustEvent.php @@ -46,23 +46,19 @@ class PlayerExhaustEvent extends EntityEvent implements Cancellable{ public const CAUSE_SPRINT_JUMPING = 10; public const CAUSE_CUSTOM = 11; - /** @var Human */ - protected $player; - public function __construct( - Human $human, + protected Human $human, private float $amount, private int $cause ){ $this->entity = $human; - $this->player = $human; } /** * @return Human */ public function getPlayer(){ - return $this->player; + return $this->human; } public function getAmount() : float{ diff --git a/src/event/player/PlayerExperienceChangeEvent.php b/src/event/player/PlayerExperienceChangeEvent.php index b62f828995..908686c7f1 100644 --- a/src/event/player/PlayerExperienceChangeEvent.php +++ b/src/event/player/PlayerExperienceChangeEvent.php @@ -35,9 +35,6 @@ use pocketmine\event\entity\EntityEvent; class PlayerExperienceChangeEvent extends EntityEvent implements Cancellable{ use CancellableTrait; - /** @var Human */ - protected $entity; - public function __construct( Human $player, private int $oldLevel, diff --git a/src/event/player/PlayerGameModeChangeEvent.php b/src/event/player/PlayerGameModeChangeEvent.php index 926d17d2bc..f1c7f7e3f8 100644 --- a/src/event/player/PlayerGameModeChangeEvent.php +++ b/src/event/player/PlayerGameModeChangeEvent.php @@ -34,15 +34,14 @@ use pocketmine\player\Player; class PlayerGameModeChangeEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var GameMode */ - protected $gamemode; - - public function __construct(Player $player, GameMode $newGamemode){ + public function __construct( + Player $player, + protected GameMode $newGamemode + ){ $this->player = $player; - $this->gamemode = $newGamemode; } public function getNewGamemode() : GameMode{ - return $this->gamemode; + return $this->newGamemode; } } diff --git a/src/event/player/PlayerInteractEvent.php b/src/event/player/PlayerInteractEvent.php index b76a8226cc..a466949726 100644 --- a/src/event/player/PlayerInteractEvent.php +++ b/src/event/player/PlayerInteractEvent.php @@ -40,28 +40,18 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{ public const LEFT_CLICK_BLOCK = 0; public const RIGHT_CLICK_BLOCK = 1; - /** @var Block */ - protected $blockTouched; + protected Vector3 $touchVector; - /** @var Vector3 */ - protected $touchVector; - - /** @var int */ - protected $blockFace; - - /** @var Item */ - protected $item; - - /** @var int */ - protected $action; - - public function __construct(Player $player, Item $item, Block $block, ?Vector3 $touchVector, int $face, int $action = PlayerInteractEvent::RIGHT_CLICK_BLOCK){ + public function __construct( + Player $player, + protected Item $item, + protected Block $blockTouched, + ?Vector3 $touchVector, + protected int $blockFace, + protected int $action = PlayerInteractEvent::RIGHT_CLICK_BLOCK + ){ $this->player = $player; - $this->item = $item; - $this->blockTouched = $block; $this->touchVector = $touchVector ?? new Vector3(0, 0, 0); - $this->blockFace = $face; - $this->action = $action; } public function getAction() : int{ diff --git a/src/event/player/PlayerJoinEvent.php b/src/event/player/PlayerJoinEvent.php index e46e3fd7d5..1e5e06e768 100644 --- a/src/event/player/PlayerJoinEvent.php +++ b/src/event/player/PlayerJoinEvent.php @@ -34,12 +34,11 @@ use pocketmine\player\Player; * @see PlayerLoginEvent */ class PlayerJoinEvent extends PlayerEvent{ - /** @var string|Translatable */ - protected $joinMessage; - - public function __construct(Player $player, Translatable|string $joinMessage){ + public function __construct( + Player $player, + protected Translatable|string $joinMessage + ){ $this->player = $player; - $this->joinMessage = $joinMessage; } public function setJoinMessage(Translatable|string $joinMessage) : void{ diff --git a/src/event/player/PlayerKickEvent.php b/src/event/player/PlayerKickEvent.php index 92f7c071b3..e8a11acd2c 100644 --- a/src/event/player/PlayerKickEvent.php +++ b/src/event/player/PlayerKickEvent.php @@ -34,16 +34,12 @@ use pocketmine\player\Player; class PlayerKickEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var Translatable|string */ - protected $quitMessage; - - /** @var string */ - protected $reason; - - public function __construct(Player $player, string $reason, Translatable|string $quitMessage){ + public function __construct( + Player $player, + protected string $reason, + protected Translatable|string $quitMessage + ){ $this->player = $player; - $this->quitMessage = $quitMessage; - $this->reason = $reason; } /** diff --git a/src/event/player/PlayerLoginEvent.php b/src/event/player/PlayerLoginEvent.php index 8c418f7037..4603902c42 100644 --- a/src/event/player/PlayerLoginEvent.php +++ b/src/event/player/PlayerLoginEvent.php @@ -35,12 +35,11 @@ use pocketmine\player\Player; class PlayerLoginEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var string */ - protected $kickMessage; - - public function __construct(Player $player, string $kickMessage){ + public function __construct( + Player $player, + protected string $kickMessage + ){ $this->player = $player; - $this->kickMessage = $kickMessage; } public function setKickMessage(string $kickMessage) : void{ diff --git a/src/event/player/PlayerPreLoginEvent.php b/src/event/player/PlayerPreLoginEvent.php index b4a2867796..1f13ec372b 100644 --- a/src/event/player/PlayerPreLoginEvent.php +++ b/src/event/player/PlayerPreLoginEvent.php @@ -52,20 +52,15 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ self::KICK_REASON_BANNED ]; - /** @var bool */ - protected $authRequired; - /** @var string[] reason const => associated message */ - protected $kickReasons = []; + protected array $kickReasons = []; public function __construct( private PlayerInfo $playerInfo, private string $ip, private int $port, - bool $authRequired - ){ - $this->authRequired = $authRequired; - } + protected bool $authRequired + ){} /** * Returns an object containing self-proclaimed information about the connecting player. diff --git a/src/event/player/PlayerQuitEvent.php b/src/event/player/PlayerQuitEvent.php index 3e08cb315e..f05434c24d 100644 --- a/src/event/player/PlayerQuitEvent.php +++ b/src/event/player/PlayerQuitEvent.php @@ -37,16 +37,12 @@ use pocketmine\player\Player; * @see PlayerKickEvent */ class PlayerQuitEvent extends PlayerEvent{ - - /** @var Translatable|string */ - protected $quitMessage; - /** @var string */ - protected $quitReason; - - public function __construct(Player $player, Translatable|string $quitMessage, string $quitReason){ + public function __construct( + Player $player, + protected Translatable|string $quitMessage, + protected string $quitReason + ){ $this->player = $player; - $this->quitMessage = $quitMessage; - $this->quitReason = $quitReason; } /** diff --git a/src/event/player/PlayerRespawnEvent.php b/src/event/player/PlayerRespawnEvent.php index 1bdc2446cf..4aa12e129a 100644 --- a/src/event/player/PlayerRespawnEvent.php +++ b/src/event/player/PlayerRespawnEvent.php @@ -31,12 +31,11 @@ use pocketmine\world\Position; * Called when a player is respawned */ class PlayerRespawnEvent extends PlayerEvent{ - /** @var Position */ - protected $position; - - public function __construct(Player $player, Position $position){ + public function __construct( + Player $player, + protected Position $position + ){ $this->player = $player; - $this->position = $position; } public function getRespawnPosition() : Position{ diff --git a/src/event/player/PlayerToggleFlightEvent.php b/src/event/player/PlayerToggleFlightEvent.php index b8c0f93d9e..fc94f101d8 100644 --- a/src/event/player/PlayerToggleFlightEvent.php +++ b/src/event/player/PlayerToggleFlightEvent.php @@ -30,12 +30,11 @@ use pocketmine\player\Player; class PlayerToggleFlightEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var bool */ - protected $isFlying; - - public function __construct(Player $player, bool $isFlying){ + public function __construct( + Player $player, + protected bool $isFlying + ){ $this->player = $player; - $this->isFlying = $isFlying; } public function isFlying() : bool{ diff --git a/src/event/player/PlayerToggleSneakEvent.php b/src/event/player/PlayerToggleSneakEvent.php index 0b7538975a..a8fb576efa 100644 --- a/src/event/player/PlayerToggleSneakEvent.php +++ b/src/event/player/PlayerToggleSneakEvent.php @@ -30,12 +30,11 @@ use pocketmine\player\Player; class PlayerToggleSneakEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var bool */ - protected $isSneaking; - - public function __construct(Player $player, bool $isSneaking){ + public function __construct( + Player $player, + protected bool $isSneaking + ){ $this->player = $player; - $this->isSneaking = $isSneaking; } public function isSneaking() : bool{ diff --git a/src/event/player/PlayerToggleSprintEvent.php b/src/event/player/PlayerToggleSprintEvent.php index 2da14d7b7a..ae66c94bc8 100644 --- a/src/event/player/PlayerToggleSprintEvent.php +++ b/src/event/player/PlayerToggleSprintEvent.php @@ -30,12 +30,11 @@ use pocketmine\player\Player; class PlayerToggleSprintEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var bool */ - protected $isSprinting; - - public function __construct(Player $player, bool $isSprinting){ + public function __construct( + Player $player, + protected bool $isSprinting + ){ $this->player = $player; - $this->isSprinting = $isSprinting; } public function isSprinting() : bool{ diff --git a/src/event/player/PlayerTransferEvent.php b/src/event/player/PlayerTransferEvent.php index adaa0ca5d6..3b9f88f3f5 100644 --- a/src/event/player/PlayerTransferEvent.php +++ b/src/event/player/PlayerTransferEvent.php @@ -33,18 +33,13 @@ use pocketmine\player\Player; class PlayerTransferEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; - /** @var string */ - protected $address; - /** @var int */ - protected $port = 19132; - /** @var string */ - protected $message; - - public function __construct(Player $player, string $address, int $port, string $message){ + public function __construct( + Player $player, + protected string $address, + protected int $port, + protected string $message + ){ $this->player = $player; - $this->address = $address; - $this->port = $port; - $this->message = $message; } /** diff --git a/src/event/server/CommandEvent.php b/src/event/server/CommandEvent.php index 9a982d230c..9b7bce53d7 100644 --- a/src/event/server/CommandEvent.php +++ b/src/event/server/CommandEvent.php @@ -44,16 +44,10 @@ use pocketmine\event\CancellableTrait; class CommandEvent extends ServerEvent implements Cancellable{ use CancellableTrait; - /** @var string */ - protected $command; - - /** @var CommandSender */ - protected $sender; - - public function __construct(CommandSender $sender, string $command){ - $this->sender = $sender; - $this->command = $command; - } + public function __construct( + protected CommandSender $sender, + protected string $command + ){} public function getSender() : CommandSender{ return $this->sender; diff --git a/src/event/server/NetworkInterfaceEvent.php b/src/event/server/NetworkInterfaceEvent.php index 98f48f07db..5c44c909e8 100644 --- a/src/event/server/NetworkInterfaceEvent.php +++ b/src/event/server/NetworkInterfaceEvent.php @@ -26,12 +26,9 @@ namespace pocketmine\event\server; use pocketmine\network\NetworkInterface; class NetworkInterfaceEvent extends ServerEvent{ - /** @var NetworkInterface */ - protected $interface; - - public function __construct(NetworkInterface $interface){ - $this->interface = $interface; - } + public function __construct( + protected NetworkInterface $interface + ){} public function getInterface() : NetworkInterface{ return $this->interface; diff --git a/src/inventory/ArmorInventory.php b/src/inventory/ArmorInventory.php index 4754e3aff0..cbc741b535 100644 --- a/src/inventory/ArmorInventory.php +++ b/src/inventory/ArmorInventory.php @@ -32,11 +32,9 @@ class ArmorInventory extends SimpleInventory{ public const SLOT_LEGS = 2; public const SLOT_FEET = 3; - /** @var Living */ - protected $holder; - - public function __construct(Living $holder){ - $this->holder = $holder; + public function __construct( + protected Living $holder + ){ parent::__construct(4); } diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index e593893cea..8343b7bbf0 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -37,15 +37,14 @@ use function spl_object_id; * This class provides everything needed to implement an inventory, minus the underlying storage system. */ abstract class BaseInventory implements Inventory{ - /** @var int */ - protected $maxStackSize = Inventory::MAX_STACK; + protected int $maxStackSize = Inventory::MAX_STACK; /** @var Player[] */ - protected $viewers = []; + protected array $viewers = []; /** * @var InventoryListener[]|ObjectSet * @phpstan-var ObjectSet */ - protected $listeners; + protected ObjectSet $listeners; public function __construct(){ $this->listeners = new ObjectSet(); diff --git a/src/inventory/PlayerCursorInventory.php b/src/inventory/PlayerCursorInventory.php index 7c219fd007..9c83f1e8e0 100644 --- a/src/inventory/PlayerCursorInventory.php +++ b/src/inventory/PlayerCursorInventory.php @@ -26,18 +26,13 @@ namespace pocketmine\inventory; use pocketmine\player\Player; class PlayerCursorInventory extends SimpleInventory implements TemporaryInventory{ - /** @var Player */ - protected $holder; - - public function __construct(Player $holder){ - $this->holder = $holder; + public function __construct( + protected Player $holder + ){ parent::__construct(1); } - /** - * @return Player - */ - public function getHolder(){ + public function getHolder() : Player{ return $this->holder; } } diff --git a/src/inventory/PlayerInventory.php b/src/inventory/PlayerInventory.php index baeecb5af5..9272db8324 100644 --- a/src/inventory/PlayerInventory.php +++ b/src/inventory/PlayerInventory.php @@ -30,17 +30,14 @@ use pocketmine\utils\ObjectSet; class PlayerInventory extends SimpleInventory{ - /** @var Human */ - protected $holder; - - /** @var int */ - protected $itemInHandIndex = 0; + protected Human $holder; + protected int $itemInHandIndex = 0; /** * @var \Closure[]|ObjectSet * @phpstan-var ObjectSet<\Closure(int $oldIndex) : void> */ - protected $heldItemIndexChangeListeners; + protected ObjectSet $heldItemIndexChangeListeners; public function __construct(Human $player){ $this->holder = $player; @@ -123,10 +120,7 @@ class PlayerInventory extends SimpleInventory{ return 9; } - /** - * @return Human|Player - */ - public function getHolder(){ + public function getHolder() : Human{ return $this->holder; } } diff --git a/src/inventory/transaction/CraftingTransaction.php b/src/inventory/transaction/CraftingTransaction.php index 90ee1b05d0..c7f71723f2 100644 --- a/src/inventory/transaction/CraftingTransaction.php +++ b/src/inventory/transaction/CraftingTransaction.php @@ -48,15 +48,13 @@ use function intdiv; * results, with no remainder. Any leftovers are expected to be emitted back to the crafting grid. */ class CraftingTransaction extends InventoryTransaction{ - /** @var CraftingRecipe|null */ - protected $recipe; - /** @var int|null */ - protected $repetitions; + protected ?CraftingRecipe $recipe; + protected ?int $repetitions; /** @var Item[] */ - protected $inputs = []; + protected array $inputs = []; /** @var Item[] */ - protected $outputs = []; + protected array $outputs = []; private CraftingManager $craftingManager; diff --git a/src/inventory/transaction/InventoryTransaction.php b/src/inventory/transaction/InventoryTransaction.php index 82e2065501..c264425185 100644 --- a/src/inventory/transaction/InventoryTransaction.php +++ b/src/inventory/transaction/InventoryTransaction.php @@ -55,22 +55,21 @@ use function spl_object_id; * @see InventoryAction */ class InventoryTransaction{ - /** @var bool */ - protected $hasExecuted = false; - /** @var Player */ - protected $source; + protected bool $hasExecuted = false; /** @var Inventory[] */ - protected $inventories = []; + protected array $inventories = []; /** @var InventoryAction[] */ - protected $actions = []; + protected array $actions = []; /** * @param InventoryAction[] $actions */ - public function __construct(Player $source, array $actions = []){ - $this->source = $source; + public function __construct( + protected Player $source, + array $actions = [] + ){ foreach($actions as $action){ $this->addAction($action); } diff --git a/src/inventory/transaction/action/InventoryAction.php b/src/inventory/transaction/action/InventoryAction.php index 4fa3ac15e5..b0741920b5 100644 --- a/src/inventory/transaction/action/InventoryAction.php +++ b/src/inventory/transaction/action/InventoryAction.php @@ -32,15 +32,10 @@ use pocketmine\player\Player; * Represents an action involving a change that applies in some way to an inventory or other item-source. */ abstract class InventoryAction{ - /** @var Item */ - protected $sourceItem; - /** @var Item */ - protected $targetItem; - - public function __construct(Item $sourceItem, Item $targetItem){ - $this->sourceItem = $sourceItem; - $this->targetItem = $targetItem; - } + public function __construct( + protected Item $sourceItem, + protected Item $targetItem + ){} /** * Returns the item that was present before the action took place. diff --git a/src/inventory/transaction/action/SlotChangeAction.php b/src/inventory/transaction/action/SlotChangeAction.php index dd91adfb7f..18eb7acbda 100644 --- a/src/inventory/transaction/action/SlotChangeAction.php +++ b/src/inventory/transaction/action/SlotChangeAction.php @@ -33,15 +33,13 @@ use pocketmine\player\Player; * Represents an action causing a change in an inventory slot. */ class SlotChangeAction extends InventoryAction{ - - /** @var Inventory */ - protected $inventory; - private int $inventorySlot; - - public function __construct(Inventory $inventory, int $inventorySlot, Item $sourceItem, Item $targetItem){ + public function __construct( + protected Inventory $inventory, + private int $inventorySlot, + Item $sourceItem, + Item $targetItem + ){ parent::__construct($sourceItem, $targetItem); - $this->inventory = $inventory; - $this->inventorySlot = $inventorySlot; } /** diff --git a/src/item/Armor.php b/src/item/Armor.php index 7cf8e646db..9c6c8cbe0e 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -42,8 +42,7 @@ class Armor extends Durable{ private ArmorTypeInfo $armorInfo; - /** @var Color|null */ - protected $customColor = null; + protected ?Color $customColor = null; public function __construct(ItemIdentifier $identifier, string $name, ArmorTypeInfo $info){ parent::__construct($identifier, $name); diff --git a/src/item/Durable.php b/src/item/Durable.php index 33678be8c1..f867324b29 100644 --- a/src/item/Durable.php +++ b/src/item/Durable.php @@ -29,9 +29,7 @@ use function lcg_value; use function min; abstract class Durable extends Item{ - - /** @var int */ - protected $damage = 0; + protected int $damage = 0; private bool $unbreakable = false; public function getMeta() : int{ diff --git a/src/item/Item.php b/src/item/Item.php index e4b56c8959..d14e274ae8 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -65,36 +65,28 @@ class Item implements \JsonSerializable{ public const TAG_DISPLAY_NAME = "Name"; public const TAG_DISPLAY_LORE = "Lore"; - private ItemIdentifier $identifier; private CompoundTag $nbt; - /** @var int */ - protected $count = 1; - /** @var string */ - protected $name; + protected int $count = 1; //TODO: this stuff should be moved to itemstack properties, not mushed in with type properties - /** @var string */ - protected $customName = ""; + protected string $customName = ""; /** @var string[] */ - protected $lore = []; - /** - * TODO: this needs to die in a fire - * @var CompoundTag|null - */ - protected $blockEntityTag = null; + protected array $lore = []; + /** TODO: this needs to die in a fire */ + protected ?CompoundTag $blockEntityTag = null; /** * @var string[] * @phpstan-var array */ - protected $canPlaceOn = []; + protected array $canPlaceOn = []; /** * @var string[] * @phpstan-var array */ - protected $canDestroy; + protected array $canDestroy = []; /** * Constructs a new Item type. This constructor should ONLY be used when constructing a new item TYPE to register @@ -103,12 +95,10 @@ class Item implements \JsonSerializable{ * NOTE: This should NOT BE USED for creating items to set into an inventory. Use {@link ItemFactory#get} for that * purpose. */ - public function __construct(ItemIdentifier $identifier, string $name = "Unknown"){ - $this->identifier = $identifier; - $this->name = $name; - - $this->canPlaceOn = []; - $this->canDestroy = []; + public function __construct( + private ItemIdentifier $identifier, + protected string $name = "Unknown" + ){ $this->nbt = new CompoundTag(); } diff --git a/src/item/ItemEnchantmentHandlingTrait.php b/src/item/ItemEnchantmentHandlingTrait.php index 9ba344139b..67156ed70f 100644 --- a/src/item/ItemEnchantmentHandlingTrait.php +++ b/src/item/ItemEnchantmentHandlingTrait.php @@ -34,7 +34,7 @@ use function spl_object_id; */ trait ItemEnchantmentHandlingTrait{ /** @var EnchantmentInstance[] */ - protected $enchantments = []; + protected array $enchantments = []; public function hasEnchantments() : bool{ return count($this->enchantments) > 0; diff --git a/src/item/TieredTool.php b/src/item/TieredTool.php index cf4647481f..98af920ad3 100644 --- a/src/item/TieredTool.php +++ b/src/item/TieredTool.php @@ -24,9 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; abstract class TieredTool extends Tool{ - - /** @var ToolTier */ - protected $tier; + protected ToolTier $tier; public function __construct(ItemIdentifier $identifier, string $name, ToolTier $tier){ parent::__construct($identifier, $name); diff --git a/src/item/enchantment/ProtectionEnchantment.php b/src/item/enchantment/ProtectionEnchantment.php index b6f6a91be0..84659d22f6 100644 --- a/src/item/enchantment/ProtectionEnchantment.php +++ b/src/item/enchantment/ProtectionEnchantment.php @@ -29,10 +29,9 @@ use function array_flip; use function floor; class ProtectionEnchantment extends Enchantment{ - /** @var float */ - protected $typeModifier; + protected float $typeModifier; /** @var int[]|null */ - protected $applicableDamageTypes = null; + protected ?array $applicableDamageTypes = null; /** * ProtectionEnchantment constructor. diff --git a/src/lang/Language.php b/src/lang/Language.php index bce7c5c695..adbb41eb9f 100644 --- a/src/lang/Language.php +++ b/src/lang/Language.php @@ -81,19 +81,17 @@ class Language{ throw new LanguageNotFoundException("Language directory $path does not exist or is not a directory"); } - /** @var string */ - protected $langName; - + protected string $langName; /** * @var string[] * @phpstan-var array */ - protected $lang = []; + protected array $lang = []; /** * @var string[] * @phpstan-var array */ - protected $fallbackLang = []; + protected array $fallbackLang = []; /** * @throws LanguageNotFoundException diff --git a/src/lang/Translatable.php b/src/lang/Translatable.php index 43905a1b1c..5cccd9bff8 100644 --- a/src/lang/Translatable.php +++ b/src/lang/Translatable.php @@ -24,18 +24,16 @@ declare(strict_types=1); namespace pocketmine\lang; final class Translatable{ - - /** @var string $text */ - protected $text; /** @var string[]|Translatable[] $params */ - protected $params = []; + protected array $params = []; /** * @param (float|int|string|Translatable)[] $params */ - public function __construct(string $text, array $params = []){ - $this->text = $text; - + public function __construct( + protected string $text, + array $params = [] + ){ foreach($params as $k => $param){ if(!($param instanceof Translatable)){ $this->params[$k] = (string) $param; diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 712283c3f1..c16d916e0d 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -39,16 +39,10 @@ class ChunkRequestTask extends AsyncTask{ private const TLS_KEY_PROMISE = "promise"; private const TLS_KEY_ERROR_HOOK = "errorHook"; - /** @var string */ - protected $chunk; - /** @var int */ - protected $chunkX; - /** @var int */ - protected $chunkZ; - - /** @var Compressor */ - protected $compressor; - + protected string $chunk; + protected int $chunkX; + protected int $chunkZ; + protected Compressor $compressor; private string $tiles; /** diff --git a/src/network/mcpe/encryption/EncryptionContext.php b/src/network/mcpe/encryption/EncryptionContext.php index ff11b976da..82f780a92b 100644 --- a/src/network/mcpe/encryption/EncryptionContext.php +++ b/src/network/mcpe/encryption/EncryptionContext.php @@ -34,8 +34,7 @@ use function substr; class EncryptionContext{ private const CHECKSUM_ALGO = "sha256"; - /** @var bool */ - public static $ENABLED = true; + public static bool $ENABLED = true; private string $key; diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index ba81634518..446f5e2f06 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -135,16 +135,12 @@ use const JSON_THROW_ON_ERROR; class InGamePacketHandler extends PacketHandler{ private const MAX_FORM_RESPONSE_DEPTH = 2; //modal/simple will be 1, custom forms 2 - they will never contain anything other than string|int|float|bool|null - /** @var CraftingTransaction|null */ - protected $craftingTransaction = null; + protected ?CraftingTransaction $craftingTransaction = null; - /** @var float */ - protected $lastRightClickTime = 0.0; - /** @var UseItemTransactionData|null */ - protected $lastRightClickData = null; + protected float $lastRightClickTime = 0.0; + protected ?UseItemTransactionData $lastRightClickData = null; - /** @var bool */ - public $forceMoveSync = false; + public bool $forceMoveSync = false; public function __construct( private Player $player, diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index 674ca9e569..6bc8a65f2d 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -40,62 +40,22 @@ use function register_shutdown_function; use const PTHREADS_INHERIT_NONE; class RakLibServer extends Thread{ - private InternetAddress $address; - - /** @var \ThreadedLogger */ - protected $logger; - - /** @var bool */ - protected $cleanShutdown = false; - /** @var bool */ - protected $ready = false; - - /** @var \Threaded */ - protected $mainToThreadBuffer; - /** @var \Threaded */ - protected $threadToMainBuffer; - - /** @var string */ - protected $mainPath; - - /** @var int */ - protected $serverId; - /** @var int */ - protected $maxMtuSize; - - private int $protocolVersion; - - /** @var SleeperNotifier */ - protected $mainThreadNotifier; - - /** @var RakLibThreadCrashInfo|null */ - public $crashInfo = null; + protected bool $cleanShutdown = false; + protected bool $ready = false; + protected string $mainPath; + public ?RakLibThreadCrashInfo $crashInfo = null; public function __construct( - \ThreadedLogger $logger, - \Threaded $mainToThreadBuffer, - \Threaded $threadToMainBuffer, - InternetAddress $address, - int $serverId, - int $maxMtuSize, - int $protocolVersion, - SleeperNotifier $sleeper + protected \ThreadedLogger $logger, + protected \Threaded $mainToThreadBuffer, + protected \Threaded $threadToMainBuffer, + protected InternetAddress $address, + protected int $serverId, + protected int $maxMtuSize, + protected int $protocolVersion, + protected SleeperNotifier $mainThreadNotifier ){ - $this->address = $address; - - $this->serverId = $serverId; - $this->maxMtuSize = $maxMtuSize; - - $this->logger = $logger; - - $this->mainToThreadBuffer = $mainToThreadBuffer; - $this->threadToMainBuffer = $threadToMainBuffer; - $this->mainPath = \pocketmine\PATH; - - $this->protocolVersion = $protocolVersion; - - $this->mainThreadNotifier = $sleeper; } /** diff --git a/src/permission/BanEntry.php b/src/permission/BanEntry.php index d289cee875..e735a9e319 100644 --- a/src/permission/BanEntry.php +++ b/src/permission/BanEntry.php @@ -33,8 +33,7 @@ use function strtolower; use function trim; class BanEntry{ - /** @var string */ - public static $format = "Y-m-d H:i:s O"; + public static string $format = "Y-m-d H:i:s O"; private string $name; private \DateTime $creationDate; diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index 4123fb63d7..1297315332 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -38,9 +38,9 @@ class PermissionManager{ } /** @var Permission[] */ - protected $permissions = []; + protected array $permissions = []; /** @var PermissibleInternal[][] */ - protected $permSubs = []; + protected array $permSubs = []; public function getPermission(string $name) : ?Permission{ return $this->permissions[$name] ?? null; diff --git a/src/player/GameMode.php b/src/player/GameMode.php index 3ed7b42dc0..184ef119fb 100644 --- a/src/player/GameMode.php +++ b/src/player/GameMode.php @@ -46,7 +46,7 @@ final class GameMode{ } /** @var self[] */ - protected static $aliasMap = []; + protected static array $aliasMap = []; protected static function setup() : void{ self::registerAll( diff --git a/src/plugin/PluginLoadTriage.php b/src/plugin/PluginLoadTriage.php index c9c4fff773..d4f8891171 100644 --- a/src/plugin/PluginLoadTriage.php +++ b/src/plugin/PluginLoadTriage.php @@ -28,15 +28,15 @@ final class PluginLoadTriage{ * @var PluginLoadTriageEntry[] * @phpstan-var array */ - public $plugins = []; + public array $plugins = []; /** * @var string[][] * @phpstan-var array> */ - public $dependencies = []; + public array $dependencies = []; /** * @var string[][] * @phpstan-var array> */ - public $softDependencies = []; + public array $softDependencies = []; } diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 36dcd91956..6770c99da4 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -70,10 +70,10 @@ use function strtolower; */ class PluginManager{ /** @var Plugin[] */ - protected $plugins = []; + protected array $plugins = []; /** @var Plugin[] */ - protected $enabledPlugins = []; + protected array $enabledPlugins = []; private bool $loadPluginsGuard = false; @@ -81,7 +81,7 @@ class PluginManager{ * @var PluginLoader[] * @phpstan-var array, PluginLoader> */ - protected $fileAssociations = []; + protected array $fileAssociations = []; public function __construct( private Server $server, diff --git a/src/promise/PromiseSharedData.php b/src/promise/PromiseSharedData.php index bccf56cc29..40fe699022 100644 --- a/src/promise/PromiseSharedData.php +++ b/src/promise/PromiseSharedData.php @@ -43,9 +43,6 @@ final class PromiseSharedData{ public bool $resolved = false; - /** - * @var mixed - * @phpstan-var TValue|null - */ - public $result = null; + /** @phpstan-var TValue|null */ + public mixed $result = null; } diff --git a/src/resourcepacks/ZippedResourcePack.php b/src/resourcepacks/ZippedResourcePack.php index 2ec39445b0..f46f0fd627 100644 --- a/src/resourcepacks/ZippedResourcePack.php +++ b/src/resourcepacks/ZippedResourcePack.php @@ -41,15 +41,9 @@ use function preg_match; use function strlen; class ZippedResourcePack implements ResourcePack{ - - /** @var string */ - protected $path; - - /** @var Manifest */ - protected $manifest; - - /** @var string|null */ - protected $sha256 = null; + protected string $path; + protected Manifest $manifest; + protected ?string $sha256 = null; /** @var resource */ protected $fileResource; diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 184d82c8ad..46c6c61dbd 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -42,9 +42,6 @@ use const PTHREADS_INHERIT_INI; class AsyncPool{ private const WORKER_START_OPTIONS = PTHREADS_INHERIT_INI; - /** @var int */ - protected $size; - /** * @var \SplQueue[]|AsyncTask[][] * @phpstan-var array> @@ -69,14 +66,12 @@ class AsyncPool{ private array $workerStartHooks = []; public function __construct( - int $size, + protected int $size, private int $workerMemoryLimit, private \ClassLoader $classLoader, private \ThreadedLogger $logger, private SleeperHandler $eventLoop - ){ - $this->size = $size; - } + ){} /** * Returns the maximum size of the pool. Note that there may be less active workers than this number. diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index f3f506924a..1f8ea4b7f9 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -59,8 +59,7 @@ abstract class AsyncTask extends \Threaded{ /** @var AsyncWorker|null $worker */ public $worker = null; - /** @var \Threaded */ - public $progressUpdates; + public \Threaded $progressUpdates; private string|int|bool|null|float $result = null; private bool $serialized = false; diff --git a/src/scheduler/TaskHandler.php b/src/scheduler/TaskHandler.php index 2d2af86246..7fbf8e1b7a 100644 --- a/src/scheduler/TaskHandler.php +++ b/src/scheduler/TaskHandler.php @@ -27,34 +27,24 @@ use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; class TaskHandler{ + protected int $nextRun; - /** @var Task */ - protected $task; - - /** @var int */ - protected $delay; - - /** @var int */ - protected $period; - - /** @var int */ - protected $nextRun; - - /** @var bool */ - protected $cancelled = false; + protected bool $cancelled = false; private TimingsHandler $timings; private string $taskName; private string $ownerName; - public function __construct(Task $task, int $delay = -1, int $period = -1, ?string $ownerName = null){ + public function __construct( + protected Task $task, + protected int $delay = -1, + protected int $period = -1, + ?string $ownerName = null + ){ if($task->getHandler() !== null){ throw new \InvalidArgumentException("Cannot assign multiple handlers to the same task"); } - $this->task = $task; - $this->delay = $delay; - $this->period = $period; $this->taskName = $task->getName(); $this->ownerName = $ownerName ?? "Unknown"; $this->timings = Timings::getScheduledTaskTimings($this, $period); diff --git a/src/scheduler/TaskScheduler.php b/src/scheduler/TaskScheduler.php index 86e0bb3319..e9743f375a 100644 --- a/src/scheduler/TaskScheduler.php +++ b/src/scheduler/TaskScheduler.php @@ -33,20 +33,16 @@ use pocketmine\utils\ReversePriorityQueue; class TaskScheduler{ private bool $enabled = true; - /** - * @var ReversePriorityQueue - * @phpstan-var ReversePriorityQueue - */ - protected $queue; + /** @phpstan-var ReversePriorityQueue */ + protected ReversePriorityQueue $queue; /** * @var ObjectSet|TaskHandler[] * @phpstan-var ObjectSet */ - protected $tasks; + protected ObjectSet $tasks; - /** @var int */ - protected $currentTick = 0; + protected int $currentTick = 0; public function __construct( private ?string $owner = null diff --git a/src/stats/SendUsageTask.php b/src/stats/SendUsageTask.php index 2064caf08c..59c56b2325 100644 --- a/src/stats/SendUsageTask.php +++ b/src/stats/SendUsageTask.php @@ -49,10 +49,8 @@ class SendUsageTask extends AsyncTask{ public const TYPE_STATUS = 2; public const TYPE_CLOSE = 3; - /** @var string */ - public $endpoint; - /** @var string */ - public $data; + public string $endpoint; + public string $data; /** * @param string[] $playerList diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 3f609d8330..8085cf8d62 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -30,11 +30,9 @@ use function error_reporting; trait CommonThreadPartsTrait{ /** @var \Threaded|\ClassLoader[]|null */ private ?\Threaded $classLoaders = null; - /** @var string|null */ - protected $composerAutoloaderPath; + protected ?string $composerAutoloaderPath; - /** @var bool */ - protected $isKilled = false; + protected bool $isKilled = false; /** * @return \ClassLoader[] diff --git a/src/timings/Timings.php b/src/timings/Timings.php index d3dd855789..0fc7c52bbd 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -36,96 +36,58 @@ abstract class Timings{ private static bool $initialized = false; - /** @var TimingsHandler */ - public static $fullTick; - /** @var TimingsHandler */ - public static $serverTick; - /** @var TimingsHandler */ - public static $memoryManager; - /** @var TimingsHandler */ - public static $garbageCollector; - /** @var TimingsHandler */ - public static $titleTick; - /** @var TimingsHandler */ - public static $playerNetworkSend; - /** @var TimingsHandler */ - public static $playerNetworkSendCompress; - /** @var TimingsHandler */ - public static $playerNetworkSendEncrypt; - /** @var TimingsHandler */ - public static $playerNetworkReceive; - /** @var TimingsHandler */ - public static $playerNetworkReceiveDecompress; - /** @var TimingsHandler */ - public static $playerNetworkReceiveDecrypt; - /** @var TimingsHandler */ - public static $playerChunkOrder; - /** @var TimingsHandler */ - public static $playerChunkSend; - /** @var TimingsHandler */ - public static $connection; - /** @var TimingsHandler */ - public static $scheduler; - /** @var TimingsHandler */ - public static $serverCommand; - /** @var TimingsHandler */ - public static $worldLoad; - /** @var TimingsHandler */ - public static $worldSave; - /** @var TimingsHandler */ - public static $population; - /** @var TimingsHandler */ - public static $generationCallback; - /** @var TimingsHandler */ - public static $permissibleCalculation; - /** @var TimingsHandler */ - public static $permissibleCalculationDiff; - /** @var TimingsHandler */ - public static $permissibleCalculationCallback; + public static TimingsHandler $fullTick; + public static TimingsHandler $serverTick; + public static TimingsHandler $memoryManager; + public static TimingsHandler $garbageCollector; + public static TimingsHandler $titleTick; + public static TimingsHandler $playerNetworkSend; + public static TimingsHandler $playerNetworkSendCompress; + public static TimingsHandler $playerNetworkSendEncrypt; + public static TimingsHandler $playerNetworkReceive; + public static TimingsHandler $playerNetworkReceiveDecompress; + public static TimingsHandler $playerNetworkReceiveDecrypt; + public static TimingsHandler $playerChunkOrder; + public static TimingsHandler $playerChunkSend; + public static TimingsHandler $connection; + public static TimingsHandler $scheduler; + public static TimingsHandler $serverCommand; + public static TimingsHandler $worldLoad; + public static TimingsHandler $worldSave; + public static TimingsHandler $population; + public static TimingsHandler $generationCallback; + public static TimingsHandler $permissibleCalculation; + public static TimingsHandler $permissibleCalculationDiff; + public static TimingsHandler $permissibleCalculationCallback; + public static TimingsHandler $entityMove; + public static TimingsHandler $playerCheckNearEntities; + public static TimingsHandler $tickEntity; + public static TimingsHandler $tickTileEntity; + public static TimingsHandler $entityBaseTick; + public static TimingsHandler $livingEntityBaseTick; - /** @var TimingsHandler */ - public static $entityMove; - /** @var TimingsHandler */ - public static $playerCheckNearEntities; - /** @var TimingsHandler */ - public static $tickEntity; - /** @var TimingsHandler */ - public static $tickTileEntity; + public static TimingsHandler $schedulerSync; + public static TimingsHandler $schedulerAsync; - /** @var TimingsHandler */ - public static $entityBaseTick; - /** @var TimingsHandler */ - public static $livingEntityBaseTick; + public static TimingsHandler $playerCommand; - /** @var TimingsHandler */ - public static $schedulerSync; - /** @var TimingsHandler */ - public static $schedulerAsync; + public static TimingsHandler $craftingDataCacheRebuild; - /** @var TimingsHandler */ - public static $playerCommand; - - /** @var TimingsHandler */ - public static $craftingDataCacheRebuild; - - /** @var TimingsHandler */ - public static $syncPlayerDataLoad; - /** @var TimingsHandler */ - public static $syncPlayerDataSave; + public static TimingsHandler $syncPlayerDataLoad; + public static TimingsHandler $syncPlayerDataSave; /** @var TimingsHandler[] */ - public static $entityTypeTimingMap = []; + public static array $entityTypeTimingMap = []; /** @var TimingsHandler[] */ - public static $tileEntityTypeTimingMap = []; + public static array $tileEntityTypeTimingMap = []; /** @var TimingsHandler[] */ - public static $packetReceiveTimingMap = []; + public static array $packetReceiveTimingMap = []; /** @var TimingsHandler[] */ - public static $packetSendTimingMap = []; + public static array $packetSendTimingMap = []; /** @var TimingsHandler[] */ - public static $pluginTaskTimingMap = []; + public static array $pluginTaskTimingMap = []; - /** @var TimingsHandler */ - public static $broadcastPackets; + public static TimingsHandler $broadcastPackets; public static function init() : void{ if(self::$initialized){ diff --git a/src/updater/UpdateChecker.php b/src/updater/UpdateChecker.php index 298704a5a8..6eb5e7d297 100644 --- a/src/updater/UpdateChecker.php +++ b/src/updater/UpdateChecker.php @@ -33,13 +33,9 @@ use function ucfirst; class UpdateChecker{ - /** @var Server */ - protected $server; - /** @var string */ - protected $endpoint; - /** @var UpdateInfo|null */ - protected $updateInfo = null; - + protected Server $server; + protected string $endpoint; + protected ?UpdateInfo $updateInfo = null; private \Logger $logger; public function __construct(Server $server, string $endpoint){ diff --git a/src/utils/Config.php b/src/utils/Config.php index 3fa78df807..d365b11925 100644 --- a/src/utils/Config.php +++ b/src/utils/Config.php @@ -89,7 +89,7 @@ class Config{ private bool $changed = false; /** @var int[] */ - public static $formats = [ + public static array $formats = [ "properties" => Config::PROPERTIES, "cnf" => Config::CNF, "conf" => Config::CNF, diff --git a/src/utils/Internet.php b/src/utils/Internet.php index 7facf73b58..3b43f87dd9 100644 --- a/src/utils/Internet.php +++ b/src/utils/Internet.php @@ -64,10 +64,8 @@ use const SOCK_DGRAM; use const SOL_UDP; class Internet{ - /** @var string|false */ - public static $ip = false; - /** @var bool */ - public static $online = true; + public static string|false $ip = false; + public static bool $online = true; /** * Gets the External IP using an external service, it is cached diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index 1e0c430d8b..88d47c55b7 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -32,8 +32,7 @@ use const PHP_EOL; use const PTHREADS_INHERIT_NONE; class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ - /** @var bool */ - protected $logDebug; + protected bool $logDebug; private string $format = TextFormat::AQUA . "[%s] " . TextFormat::RESET . "%s[%s/%s]: %s" . TextFormat::RESET; private bool $useFormattingCodes = false; diff --git a/src/utils/Random.php b/src/utils/Random.php index 6e932a0798..e95f8c7829 100644 --- a/src/utils/Random.php +++ b/src/utils/Random.php @@ -40,8 +40,7 @@ class Random{ private int $z; private int $w; - /** @var int */ - protected $seed; + protected int $seed; /** * @param int $seed Integer to be used as seed. diff --git a/src/utils/ServerKiller.php b/src/utils/ServerKiller.php index 67168fe877..05ad20034c 100644 --- a/src/utils/ServerKiller.php +++ b/src/utils/ServerKiller.php @@ -27,18 +27,11 @@ use pocketmine\thread\Thread; use function time; class ServerKiller extends Thread{ - - /** @var int */ - public $time; - private bool $stopped = false; - /** - * @param int $time - */ - public function __construct($time = 15){ - $this->time = $time; - } + public function __construct( + public int $time = 15 + ){} protected function onRun() : void{ $start = time(); diff --git a/src/world/Explosion.php b/src/world/Explosion.php index 209fd3e30a..48b689e56e 100644 --- a/src/world/Explosion.php +++ b/src/world/Explosion.php @@ -48,35 +48,27 @@ use function sqrt; class Explosion{ private int $rays = 16; - /** @var World */ - public $world; - /** @var Position */ - public $source; - /** @var float */ - public $size; + public World $world; /** @var Block[] */ - public $affectedBlocks = []; - /** @var float */ - public $stepLen = 0.3; - - private Entity|Block|null $what; + public array $affectedBlocks = []; + public float $stepLen = 0.3; private SubChunkExplorer $subChunkExplorer; - public function __construct(Position $center, float $size, Entity|Block|null $what = null){ - if(!$center->isValid()){ + public function __construct( + public Position $source, + public float $size, + private Entity|Block|null $what = null + ){ + if(!$this->source->isValid()){ throw new \InvalidArgumentException("Position does not have a valid world"); } - $this->source = $center; - $this->world = $center->getWorld(); + $this->world = $this->source->getWorld(); if($size <= 0){ throw new \InvalidArgumentException("Explosion radius must be greater than 0, got $size"); } - $this->size = $size; - - $this->what = $what; $this->subChunkExplorer = new SubChunkExplorer($this->world); } diff --git a/src/world/SimpleChunkManager.php b/src/world/SimpleChunkManager.php index a56095a17b..45c6e1b03a 100644 --- a/src/world/SimpleChunkManager.php +++ b/src/world/SimpleChunkManager.php @@ -32,7 +32,7 @@ use pocketmine\world\format\Chunk; class SimpleChunkManager implements ChunkManager{ /** @var Chunk[] */ - protected $chunks = []; + protected array $chunks = []; public function __construct( private int $minY, diff --git a/src/world/World.php b/src/world/World.php index 196c2729c1..65300005bc 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -170,7 +170,7 @@ class World implements ChunkManager{ private array $entitiesByChunk = []; /** @var Entity[] */ - public $updateEntities = []; + public array $updateEntities = []; /** @var Block[][] */ private array $blockCache = []; @@ -202,8 +202,7 @@ class World implements ChunkManager{ private array $unloadQueue = []; private int $time; - /** @var bool */ - public $stopTime = false; + public bool $stopTime = false; private float $sunAnglePercentage = 0.0; private int $skyLightReduction = 0; @@ -261,11 +260,9 @@ class World implements ChunkManager{ /** @var bool[] */ private array $randomTickBlocks = []; - /** @var WorldTimings */ - public $timings; + public WorldTimings $timings; - /** @var float */ - public $tickRateTime = 0; + public float $tickRateTime = 0; private bool $doingTick = false; diff --git a/src/world/biome/Biome.php b/src/world/biome/Biome.php index 6115beabe1..dd85f912f5 100644 --- a/src/world/biome/Biome.php +++ b/src/world/biome/Biome.php @@ -44,10 +44,8 @@ abstract class Biome{ /** @var Block[] */ private array $groundCover = []; - /** @var float */ - protected $rainfall = 0.5; - /** @var float */ - protected $temperature = 0.5; + protected float $rainfall = 0.5; + protected float $temperature = 0.5; public function clearPopulators() : void{ $this->populators = []; diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index b3265cbdba..825d9b7569 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -45,25 +45,21 @@ class Chunk{ private int $terrainDirtyFlags = 0; - /** @var bool|null */ - protected $lightPopulated = false; - /** @var bool */ - protected $terrainPopulated = false; + protected ?bool $lightPopulated = false; + protected bool $terrainPopulated = false; /** * @var \SplFixedArray|SubChunk[] * @phpstan-var \SplFixedArray */ - protected $subChunks; + protected \SplFixedArray $subChunks; /** @var Tile[] */ - protected $tiles = []; + protected array $tiles = []; - /** @var HeightArray */ - protected $heightMap; + protected HeightArray $heightMap; - /** @var BiomeArray */ - protected $biomeIds; + protected BiomeArray $biomeIds; /** * @param SubChunk[] $subChunks diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index 6404f641b8..8be5a11435 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -29,17 +29,15 @@ use pocketmine\world\WorldException; use function file_exists; abstract class BaseWorldProvider implements WorldProvider{ - /** @var string */ - protected $path; - /** @var WorldData */ - protected $worldData; + protected WorldData $worldData; - public function __construct(string $path){ + public function __construct( + protected string $path + ){ if(!file_exists($path)){ throw new WorldException("World does not exist"); } - $this->path = $path; $this->worldData = $this->loadLevelData(); } diff --git a/src/world/format/io/WorldProviderManager.php b/src/world/format/io/WorldProviderManager.php index db67c62216..9f741fcb01 100644 --- a/src/world/format/io/WorldProviderManager.php +++ b/src/world/format/io/WorldProviderManager.php @@ -36,7 +36,7 @@ final class WorldProviderManager{ * @var WorldProviderManagerEntry[] * @phpstan-var array */ - protected $providers = []; + protected array $providers = []; private WritableWorldProviderManagerEntry $default; diff --git a/src/world/format/io/data/BaseNbtWorldData.php b/src/world/format/io/data/BaseNbtWorldData.php index 43016af0a2..d0f8eb5903 100644 --- a/src/world/format/io/data/BaseNbtWorldData.php +++ b/src/world/format/io/data/BaseNbtWorldData.php @@ -32,20 +32,15 @@ use pocketmine\world\format\io\WorldData; use function file_exists; abstract class BaseNbtWorldData implements WorldData{ - - /** @var string */ - protected $dataPath; - - /** @var CompoundTag */ - protected $compoundTag; + protected CompoundTag $compoundTag; /** * @throws CorruptedWorldException * @throws UnsupportedWorldFormatException */ - public function __construct(string $dataPath){ - $this->dataPath = $dataPath; - + public function __construct( + protected string $dataPath + ){ if(!file_exists($this->dataPath)){ throw new CorruptedWorldException("World data not found at $dataPath"); } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 671acb6d99..f8fd42f10e 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -96,8 +96,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_2_0; //yes, I know this is wrong, but it ensures vanilla auto-fixes stuff we currently don't protected const CURRENT_LEVEL_SUBCHUNK_VERSION = SubChunkVersion::PALETTED_MULTI; - /** @var \LevelDB */ - protected $db; + protected \LevelDB $db; private static function checkForLevelDBExtension() : void{ if(!extension_loaded('leveldb')){ diff --git a/src/world/format/io/region/RegionLoader.php b/src/world/format/io/region/RegionLoader.php index bdd31b8dc1..71e92d477f 100644 --- a/src/world/format/io/region/RegionLoader.php +++ b/src/world/format/io/region/RegionLoader.php @@ -64,24 +64,20 @@ class RegionLoader{ public const FIRST_SECTOR = 2; //location table occupies 0 and 1 - /** @var string */ - protected $filePath; /** @var resource */ protected $filePointer; - /** @var int */ - protected $nextSector = self::FIRST_SECTOR; + protected int $nextSector = self::FIRST_SECTOR; /** @var RegionLocationTableEntry[]|null[] */ - protected $locationTable = []; - /** @var RegionGarbageMap */ - protected $garbageTable; - /** @var int */ - public $lastUsed = 0; + protected array $locationTable = []; + protected RegionGarbageMap $garbageTable; + public int $lastUsed; /** * @throws CorruptedRegionException */ - private function __construct(string $filePath){ - $this->filePath = $filePath; + private function __construct( + protected string $filePath + ){ $this->garbageTable = new RegionGarbageMap([]); $this->lastUsed = time(); diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index 25fcf65b37..23bfeb31a8 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -73,7 +73,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ } /** @var RegionLoader[] */ - protected $regions = []; + protected array $regions = []; protected function loadLevelData() : WorldData{ return new JavaWorldData(Path::join($this->getPath(), "level.dat")); diff --git a/src/world/generator/Generator.php b/src/world/generator/Generator.php index acc8cc88fc..db58e0639c 100644 --- a/src/world/generator/Generator.php +++ b/src/world/generator/Generator.php @@ -48,17 +48,12 @@ abstract class Generator{ return $convertedSeed; } - /** @var int */ - protected $seed; + protected Random $random; - protected string $preset; - - /** @var Random */ - protected $random; - - public function __construct(int $seed, string $preset){ - $this->seed = $seed; - $this->preset = $preset; + public function __construct( + protected int $seed, + protected string $preset + ){ $this->random = new Random($seed); } diff --git a/src/world/generator/GeneratorRegisterTask.php b/src/world/generator/GeneratorRegisterTask.php index b8b2ea67d0..50e765c9c7 100644 --- a/src/world/generator/GeneratorRegisterTask.php +++ b/src/world/generator/GeneratorRegisterTask.php @@ -27,29 +27,19 @@ use pocketmine\scheduler\AsyncTask; use pocketmine\world\World; class GeneratorRegisterTask extends AsyncTask{ - - /** - * @var string - * @phpstan-var class-string - */ - public $generatorClass; - /** @var string */ - public $settings; - /** @var int */ - public $seed; - /** @var int */ - public $worldId; - /** @var int */ - public $worldMinY; - /** @var int */ - public $worldMaxY; + public int $seed; + public int $worldId; + public int $worldMinY; + public int $worldMaxY; /** * @phpstan-param class-string $generatorClass */ - public function __construct(World $world, string $generatorClass, string $generatorSettings){ - $this->generatorClass = $generatorClass; - $this->settings = $generatorSettings; + public function __construct( + World $world, + public string $generatorClass, + public string $generatorSettings + ){ $this->seed = $world->getSeed(); $this->worldId = $world->getId(); $this->worldMinY = $world->getMinY(); @@ -61,7 +51,7 @@ class GeneratorRegisterTask extends AsyncTask{ * @var Generator $generator * @see Generator::__construct() */ - $generator = new $this->generatorClass($this->seed, $this->settings); + $generator = new $this->generatorClass($this->seed, $this->generatorSettings); ThreadLocalGeneratorContext::register(new ThreadLocalGeneratorContext($generator, $this->worldMinY, $this->worldMaxY), $this->worldId); } } diff --git a/src/world/generator/GeneratorUnregisterTask.php b/src/world/generator/GeneratorUnregisterTask.php index c9022e9e2b..29ab9dc499 100644 --- a/src/world/generator/GeneratorUnregisterTask.php +++ b/src/world/generator/GeneratorUnregisterTask.php @@ -27,9 +27,7 @@ use pocketmine\scheduler\AsyncTask; use pocketmine\world\World; class GeneratorUnregisterTask extends AsyncTask{ - - /** @var int */ - public $worldId; + public int $worldId; public function __construct(World $world){ $this->worldId = $world->getId(); diff --git a/src/world/generator/noise/Noise.php b/src/world/generator/noise/Noise.php index 1d0b7b3b10..a001c1bea4 100644 --- a/src/world/generator/noise/Noise.php +++ b/src/world/generator/noise/Noise.php @@ -111,18 +111,11 @@ abstract class Noise{ ); } - /** @var float */ - protected $persistence; - /** @var float */ - protected $expansion; - /** @var int */ - protected $octaves; - - public function __construct(int $octaves, float $persistence, float $expansion){ - $this->octaves = $octaves; - $this->persistence = $persistence; - $this->expansion = $expansion; - } + public function __construct( + protected int $octaves, + protected float $persistence, + protected float $expansion + ){} /** * @param float $x diff --git a/src/world/generator/noise/Simplex.php b/src/world/generator/noise/Simplex.php index 71ef32cffc..7d92a08bb5 100644 --- a/src/world/generator/noise/Simplex.php +++ b/src/world/generator/noise/Simplex.php @@ -46,14 +46,11 @@ class Simplex extends Noise{ protected const F3 = 1.0 / 3.0; protected const G3 = 1.0 / 6.0; - /** @var float */ - protected $offsetX; - /** @var float */ - protected $offsetZ; - /** @var float */ - protected $offsetY; + protected float $offsetX; + protected float $offsetZ; + protected float $offsetY; /** @var int[] */ - protected $perm = []; + protected array $perm = []; public function __construct(Random $random, int $octaves, float $persistence, float $expansion){ parent::__construct($octaves, $persistence, $expansion); diff --git a/src/world/generator/object/BirchTree.php b/src/world/generator/object/BirchTree.php index 5bd0b98ffe..2a20ceb0da 100644 --- a/src/world/generator/object/BirchTree.php +++ b/src/world/generator/object/BirchTree.php @@ -29,12 +29,10 @@ use pocketmine\world\BlockTransaction; use pocketmine\world\ChunkManager; class BirchTree extends Tree{ - /** @var bool */ - protected $superBirch = false; - - public function __construct(bool $superBirch = false){ + public function __construct( + protected bool $superBirch = false + ){ parent::__construct(VanillaBlocks::BIRCH_LOG(), VanillaBlocks::BIRCH_LEAVES()); - $this->superBirch = $superBirch; } public function getBlockTransaction(ChunkManager $world, int $x, int $y, int $z, Random $random) : ?BlockTransaction{ diff --git a/src/world/generator/object/Ore.php b/src/world/generator/object/Ore.php index e534545c08..ce1ec3be49 100644 --- a/src/world/generator/object/Ore.php +++ b/src/world/generator/object/Ore.php @@ -30,14 +30,10 @@ use function sin; use const M_PI; class Ore{ - private Random $random; - /** @var OreType */ - public $type; - - public function __construct(Random $random, OreType $type){ - $this->type = $type; - $this->random = $random; - } + public function __construct( + private Random $random, + public OreType $type + ){} public function getType() : OreType{ return $this->type; diff --git a/src/world/generator/object/Tree.php b/src/world/generator/object/Tree.php index 9b032ad957..0a9d1e196a 100644 --- a/src/world/generator/object/Tree.php +++ b/src/world/generator/object/Tree.php @@ -33,20 +33,11 @@ use pocketmine\world\ChunkManager; use function abs; abstract class Tree{ - /** @var Block */ - protected $trunkBlock; - /** @var Block */ - protected $leafBlock; - - /** @var int */ - protected $treeHeight; - - public function __construct(Block $trunkBlock, Block $leafBlock, int $treeHeight = 7){ - $this->trunkBlock = $trunkBlock; - $this->leafBlock = $leafBlock; - - $this->treeHeight = $treeHeight; - } + public function __construct( + protected Block $trunkBlock, + protected Block $leafBlock, + protected int $treeHeight = 7 + ){} public function canPlaceObject(ChunkManager $world, int $x, int $y, int $z, Random $random) : bool{ $radiusToCheck = 0; diff --git a/src/world/light/LightPopulationTask.php b/src/world/light/LightPopulationTask.php index 94c66e6867..041f249b0c 100644 --- a/src/world/light/LightPopulationTask.php +++ b/src/world/light/LightPopulationTask.php @@ -37,8 +37,7 @@ use function igbinary_unserialize; class LightPopulationTask extends AsyncTask{ private const TLS_KEY_COMPLETION_CALLBACK = "onCompletion"; - /** @var string */ - public $chunk; + public string $chunk; private string $resultHeightMap; private string $resultSkyLightArrays; diff --git a/src/world/light/LightPropagationContext.php b/src/world/light/LightPropagationContext.php index a13e5ae200..6a7afb1cdc 100644 --- a/src/world/light/LightPropagationContext.php +++ b/src/world/light/LightPropagationContext.php @@ -25,27 +25,21 @@ namespace pocketmine\world\light; final class LightPropagationContext{ - /** - * @var \SplQueue - * @phpstan-var \SplQueue - */ - public $spreadQueue; + /** @phpstan-var \SplQueue */ + public \SplQueue $spreadQueue; /** * @var true[] * @phpstan-var array */ - public $spreadVisited = []; + public array $spreadVisited = []; - /** - * @var \SplQueue - * @phpstan-var \SplQueue - */ - public $removalQueue; + /** @phpstan-var \SplQueue */ + public \SplQueue $removalQueue; /** * @var true[] * @phpstan-var array */ - public $removalVisited = []; + public array $removalVisited = []; public function __construct(){ $this->removalQueue = new \SplQueue(); diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index 9570b8e037..a89fb29a80 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -41,30 +41,20 @@ abstract class LightUpdate{ [ 0, 0, -1] ]; - /** - * @var \SplFixedArray|int[] - * @phpstan-var \SplFixedArray - */ - protected $lightFilters; - /** * @var int[][] blockhash => [x, y, z, new light level] * @phpstan-var array */ - protected $updateNodes = []; - - /** @var SubChunkExplorer */ - protected $subChunkExplorer; + protected array $updateNodes = []; /** * @param \SplFixedArray|int[] $lightFilters * @phpstan-param \SplFixedArray $lightFilters */ - public function __construct(SubChunkExplorer $subChunkExplorer, \SplFixedArray $lightFilters){ - $this->lightFilters = $lightFilters; - - $this->subChunkExplorer = $subChunkExplorer; - } + public function __construct( + protected SubChunkExplorer $subChunkExplorer, + protected \SplFixedArray $lightFilters + ){} abstract protected function getCurrentLightArray() : LightArray; diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index a8358ce817..a3f1eafc4a 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -46,19 +46,13 @@ use function str_repeat; class FloatingTextParticle implements Particle{ //TODO: HACK! - /** @var string */ - protected $text; - /** @var string */ - protected $title; - /** @var int|null */ - protected $entityId = null; - /** @var bool */ - protected $invisible = false; + protected ?int $entityId = null; + protected bool $invisible = false; - public function __construct(string $text, string $title = ""){ - $this->text = $text; - $this->title = $title; - } + public function __construct( + protected string $text, + protected string $title = "" + ){} public function getText() : string{ return $this->text; diff --git a/src/world/particle/MobSpawnParticle.php b/src/world/particle/MobSpawnParticle.php index 07706888e8..6ccb4cf245 100644 --- a/src/world/particle/MobSpawnParticle.php +++ b/src/world/particle/MobSpawnParticle.php @@ -28,15 +28,11 @@ use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\LevelEvent; class MobSpawnParticle implements Particle{ - /** @var int */ - protected $width; - /** @var int */ - protected $height; - - public function __construct(int $width = 0, int $height = 0){ + public function __construct( + protected int $width = 0, + protected int $height = 0 + ){ //TODO: bounds checks - $this->width = $width; - $this->height = $height; } public function encode(Vector3 $pos) : array{ diff --git a/src/world/utils/SubChunkExplorer.php b/src/world/utils/SubChunkExplorer.php index 1a52dd9cbb..d4275e951f 100644 --- a/src/world/utils/SubChunkExplorer.php +++ b/src/world/utils/SubChunkExplorer.php @@ -28,24 +28,16 @@ use pocketmine\world\format\Chunk; use pocketmine\world\format\SubChunk; class SubChunkExplorer{ - /** @var ChunkManager */ - protected $world; + public ?Chunk $currentChunk; + public ?SubChunk $currentSubChunk; - /** @var Chunk|null */ - public $currentChunk; - /** @var SubChunk|null */ - public $currentSubChunk; + protected int $currentX; + protected int $currentY; + protected int $currentZ; - /** @var int */ - protected $currentX; - /** @var int */ - protected $currentY; - /** @var int */ - protected $currentZ; - - public function __construct(ChunkManager $world){ - $this->world = $world; - } + public function __construct( + protected ChunkManager $world + ){} /** * @phpstan-return SubChunkExplorerStatus::* From 38cf9fc6e6531ce885d8c1e43a6c32f4f6b3a2ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Jun 2022 18:27:22 +0100 Subject: [PATCH 0118/1858] Fixed some timings not being initialized in unit tests previously this error was unnoticed, since uninitialized typeless properties are populated by NULL, but now it causes an error to be thrown. --- src/timings/Timings.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 0fc7c52bbd..dbad30faf7 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -144,6 +144,7 @@ abstract class Timings{ } public static function getScheduledTaskTimings(TaskHandler $task, int $period) : TimingsHandler{ + self::init(); $name = "Task: " . $task->getOwnerName() . " Runnable: " . $task->getTaskName(); if($period > 0){ @@ -160,6 +161,7 @@ abstract class Timings{ } public static function getEntityTimings(Entity $entity) : TimingsHandler{ + self::init(); $entityType = (new \ReflectionClass($entity))->getShortName(); if(!isset(self::$entityTypeTimingMap[$entityType])){ if($entity instanceof Player){ @@ -173,6 +175,7 @@ abstract class Timings{ } public static function getTileEntityTimings(Tile $tile) : TimingsHandler{ + self::init(); $tileType = (new \ReflectionClass($tile))->getShortName(); if(!isset(self::$tileEntityTypeTimingMap[$tileType])){ self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickTileEntity - " . $tileType, self::$tickTileEntity); @@ -182,6 +185,7 @@ abstract class Timings{ } public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ + self::init(); $pid = $pk->pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ $pkName = (new \ReflectionClass($pk))->getShortName(); @@ -192,6 +196,7 @@ abstract class Timings{ } public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ + self::init(); $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ $pkName = (new \ReflectionClass($pk))->getShortName(); From 5a43db1c6d8129b4658ed8335a5c21a3e915cf55 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Jun 2022 18:47:29 +0100 Subject: [PATCH 0119/1858] LevelDB: remove stale TODO comment this has been addressed by folding to state 0 in the legacy blockstate mapper. --- src/world/format/io/leveldb/LevelDB.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index a97fd4e199..5be9306603 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -175,7 +175,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromStringIdMeta($id, $data); if($blockStateData === null){ - //TODO: this might be a slightly-invalid state that isn't in the mapping table $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } }else{ From f2dc9187f08a2bc12431e219eccf3823957ccb8d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 5 Jun 2022 18:49:48 +0100 Subject: [PATCH 0120/1858] Use covariant types for InventoryHolder and Container implementors --- src/block/inventory/DoubleChestInventory.php | 2 +- src/block/tile/Barrel.php | 10 ++-------- src/block/tile/BrewingStand.php | 10 ++-------- src/block/tile/Chest.php | 10 ++-------- src/block/tile/Container.php | 5 +---- src/block/tile/ContainerTrait.php | 5 +---- src/block/tile/Furnace.php | 10 ++-------- src/block/tile/Hopper.php | 10 ++-------- src/block/tile/ShulkerBox.php | 10 ++-------- src/entity/Human.php | 5 +---- src/inventory/InventoryHolder.php | 7 +------ 11 files changed, 17 insertions(+), 67 deletions(-) diff --git a/src/block/inventory/DoubleChestInventory.php b/src/block/inventory/DoubleChestInventory.php index b26425eab6..033a065486 100644 --- a/src/block/inventory/DoubleChestInventory.php +++ b/src/block/inventory/DoubleChestInventory.php @@ -41,7 +41,7 @@ class DoubleChestInventory extends BaseInventory implements BlockInventory, Inve parent::__construct(); } - public function getInventory(){ + public function getInventory() : self{ return $this; } diff --git a/src/block/tile/Barrel.php b/src/block/tile/Barrel.php index e6978fca99..8035947edf 100644 --- a/src/block/tile/Barrel.php +++ b/src/block/tile/Barrel.php @@ -56,17 +56,11 @@ class Barrel extends Spawnable implements Container, Nameable{ } } - /** - * @return BarrelInventory - */ - public function getInventory(){ + public function getInventory() : BarrelInventory{ return $this->inventory; } - /** - * @return BarrelInventory - */ - public function getRealInventory(){ + public function getRealInventory() : BarrelInventory{ return $this->inventory; } diff --git a/src/block/tile/BrewingStand.php b/src/block/tile/BrewingStand.php index a75b4d9f1b..f5248b6119 100644 --- a/src/block/tile/BrewingStand.php +++ b/src/block/tile/BrewingStand.php @@ -112,17 +112,11 @@ class BrewingStand extends Spawnable implements Container, Nameable{ } } - /** - * @return BrewingStandInventory - */ - public function getInventory(){ + public function getInventory() : BrewingStandInventory{ return $this->inventory; } - /** - * @return BrewingStandInventory - */ - public function getRealInventory(){ + public function getRealInventory() : BrewingStandInventory{ return $this->inventory; } diff --git a/src/block/tile/Chest.php b/src/block/tile/Chest.php index 6f68d4e71c..d264e107d5 100644 --- a/src/block/tile/Chest.php +++ b/src/block/tile/Chest.php @@ -114,20 +114,14 @@ class Chest extends Spawnable implements Container, Nameable{ $this->containerTraitBlockDestroyedHook(); } - /** - * @return ChestInventory|DoubleChestInventory - */ - public function getInventory(){ + public function getInventory() : ChestInventory|DoubleChestInventory{ if($this->isPaired() && $this->doubleInventory === null){ $this->checkPairing(); } return $this->doubleInventory instanceof DoubleChestInventory ? $this->doubleInventory : $this->inventory; } - /** - * @return ChestInventory - */ - public function getRealInventory(){ + public function getRealInventory() : ChestInventory{ return $this->inventory; } diff --git a/src/block/tile/Container.php b/src/block/tile/Container.php index b549ad137f..267b92a8d5 100644 --- a/src/block/tile/Container.php +++ b/src/block/tile/Container.php @@ -30,10 +30,7 @@ interface Container extends InventoryHolder{ public const TAG_ITEMS = "Items"; public const TAG_LOCK = "Lock"; - /** - * @return Inventory - */ - public function getRealInventory(); + public function getRealInventory() : Inventory; /** * Returns whether this container can be opened by an item with the given custom name. diff --git a/src/block/tile/ContainerTrait.php b/src/block/tile/ContainerTrait.php index ba8ab084a4..49130d053a 100644 --- a/src/block/tile/ContainerTrait.php +++ b/src/block/tile/ContainerTrait.php @@ -38,10 +38,7 @@ trait ContainerTrait{ /** @var string|null */ private $lock = null; - /** - * @return Inventory - */ - abstract public function getRealInventory(); + abstract public function getRealInventory() : Inventory; protected function loadItems(CompoundTag $tag) : void{ if(($inventoryTag = $tag->getTag(Container::TAG_ITEMS)) instanceof ListTag && $inventoryTag->getTagType() === NBT::TAG_Compound){ diff --git a/src/block/tile/Furnace.php b/src/block/tile/Furnace.php index 389e367b84..7252fa45ea 100644 --- a/src/block/tile/Furnace.php +++ b/src/block/tile/Furnace.php @@ -104,17 +104,11 @@ abstract class Furnace extends Spawnable implements Container, Nameable{ } } - /** - * @return FurnaceInventory - */ - public function getInventory(){ + public function getInventory() : FurnaceInventory{ return $this->inventory; } - /** - * @return FurnaceInventory - */ - public function getRealInventory(){ + public function getRealInventory() : FurnaceInventory{ return $this->getInventory(); } diff --git a/src/block/tile/Hopper.php b/src/block/tile/Hopper.php index c5fe6f167e..89fb3cc4dc 100644 --- a/src/block/tile/Hopper.php +++ b/src/block/tile/Hopper.php @@ -69,17 +69,11 @@ class Hopper extends Spawnable implements Container, Nameable{ return "Hopper"; } - /** - * @return HopperInventory - */ - public function getInventory(){ + public function getInventory() : HopperInventory{ return $this->inventory; } - /** - * @return HopperInventory - */ - public function getRealInventory(){ + public function getRealInventory() : HopperInventory{ return $this->inventory; } } diff --git a/src/block/tile/ShulkerBox.php b/src/block/tile/ShulkerBox.php index a649875a97..845963c607 100644 --- a/src/block/tile/ShulkerBox.php +++ b/src/block/tile/ShulkerBox.php @@ -93,17 +93,11 @@ class ShulkerBox extends Spawnable implements Container, Nameable{ $this->facing = $facing; } - /** - * @return ShulkerBoxInventory - */ - public function getInventory(){ + public function getInventory() : ShulkerBoxInventory{ return $this->inventory; } - /** - * @return ShulkerBoxInventory - */ - public function getRealInventory(){ + public function getRealInventory() : ShulkerBoxInventory{ return $this->inventory; } diff --git a/src/entity/Human.php b/src/entity/Human.php index a486c9d998..3d9cdf77f4 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -189,10 +189,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ return min(100, 7 * $this->xpManager->getXpLevel()); } - /** - * @return PlayerInventory - */ - public function getInventory(){ + public function getInventory() : PlayerInventory{ return $this->inventory; } diff --git a/src/inventory/InventoryHolder.php b/src/inventory/InventoryHolder.php index ef8f0ee3ef..f1c381f1b5 100644 --- a/src/inventory/InventoryHolder.php +++ b/src/inventory/InventoryHolder.php @@ -25,10 +25,5 @@ namespace pocketmine\inventory; interface InventoryHolder{ - /** - * Get the object related inventory - * - * @return Inventory - */ - public function getInventory(); + public function getInventory() : Inventory; } From 2a24982bc4e5b4fbe3c85a4a44c67427ada4ec2c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 5 Jun 2022 20:47:54 +0100 Subject: [PATCH 0121/1858] ParticleCommand: standardise usage, don't use legacy block/item IDs --- src/command/defaults/ParticleCommand.php | 73 ++++++++++++++---------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/src/command/defaults/ParticleCommand.php b/src/command/defaults/ParticleCommand.php index 072ca9dc84..9abe965ff1 100644 --- a/src/command/defaults/ParticleCommand.php +++ b/src/command/defaults/ParticleCommand.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\command\defaults; -use pocketmine\block\BlockFactory; +use pocketmine\block\BlockLegacyIds; use pocketmine\color\Color; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; -use pocketmine\item\ItemFactory; +use pocketmine\item\StringToItemParser; use pocketmine\item\VanillaItems; use pocketmine\lang\KnownTranslationFactory; use pocketmine\math\Vector3; @@ -70,7 +70,6 @@ use function explode; use function max; use function microtime; use function mt_rand; -use function strpos; use function strtolower; class ParticleCommand extends VanillaCommand{ @@ -114,7 +113,7 @@ class ParticleCommand extends VanillaCommand{ $count = isset($args[7]) ? max(1, (int) $args[7]) : 1; - $data = isset($args[8]) ? (int) $args[8] : null; + $data = $args[8] ?? null; $particle = $this->getParticle($name, $data); @@ -138,7 +137,7 @@ class ParticleCommand extends VanillaCommand{ return true; } - private function getParticle(string $name, ?int $data = null) : ?Particle{ + private function getParticle(string $name, ?string $data = null) : ?Particle{ switch($name){ case "explode": return new ExplodeParticle(); @@ -156,7 +155,7 @@ class ParticleCommand extends VanillaCommand{ case "crit": return new CriticalParticle(); case "smoke": - return new SmokeParticle($data ?? 0); + return new SmokeParticle((int) ($data ?? 0)); case "spell": return new EnchantParticle(new Color(0, 0, 0, 255)); //TODO: colour support case "instantspell": @@ -175,25 +174,31 @@ class ParticleCommand extends VanillaCommand{ case "lava": return new LavaParticle(); case "reddust": - return new RedstoneParticle($data ?? 1); + return new RedstoneParticle((int) ($data ?? 1)); case "snowballpoof": return new ItemBreakParticle(VanillaItems::SNOWBALL()); case "slime": return new ItemBreakParticle(VanillaItems::SLIMEBALL()); case "itembreak": - if($data !== null && $data !== 0){ - return new ItemBreakParticle(ItemFactory::getInstance()->get($data)); + if($data !== null){ + $item = StringToItemParser::getInstance()->parse($data); + if($item !== null && !$item->isNull()){ + return new ItemBreakParticle($item); + } } break; case "terrain": - if($data !== null && $data !== 0){ - return new TerrainParticle(BlockFactory::getInstance()->get($data, 0)); + if($data !== null){ + $block = StringToItemParser::getInstance()->parse($data)?->getBlock(); + if($block !== null && $block->getId() !== BlockLegacyIds::AIR){ + return new TerrainParticle($block); + } } break; case "heart": - return new HeartParticle($data ?? 0); + return new HeartParticle((int) ($data ?? 0)); case "ink": - return new InkParticle($data ?? 0); + return new InkParticle((int) ($data ?? 0)); case "droplet": return new RainSplashParticle(); case "enchantmenttable": @@ -203,26 +208,32 @@ class ParticleCommand extends VanillaCommand{ case "angryvillager": return new AngryVillagerParticle(); case "forcefield": - return new BlockForceFieldParticle($data ?? 0); + return new BlockForceFieldParticle((int) ($data ?? 0)); case "mobflame": return new EntityFlameParticle(); - } - - if(strpos($name, "iconcrack_") === 0){ - $d = explode("_", $name); - if(count($d) === 3){ - return new ItemBreakParticle(ItemFactory::getInstance()->get((int) $d[1], (int) $d[2])); - } - }elseif(strpos($name, "blockcrack_") === 0){ - $d = explode("_", $name); - if(count($d) === 2){ - return new TerrainParticle(BlockFactory::getInstance()->get(((int) $d[1]) & 0xff, ((int) $d[1]) >> 12)); - } - }elseif(strpos($name, "blockdust_") === 0){ - $d = explode("_", $name); - if(count($d) >= 4){ - return new DustParticle(new Color(((int) $d[1]) & 0xff, ((int) $d[2]) & 0xff, ((int) $d[3]) & 0xff, isset($d[4]) ? ((int) $d[4]) & 0xff : 255)); - } + case "iconcrack": + if($data !== null && ($item = StringToItemParser::getInstance()->parse($data)) !== null && !$item->isNull()){ + return new ItemBreakParticle($item); + } + break; + case "blockcrack": + if($data !== null && ($block = StringToItemParser::getInstance()->parse($data)?->getBlock()) !== null && $block->getId() !== BlockLegacyIds::AIR){ + return new TerrainParticle($block); + } + break; + case "blockdust": + if($data !== null){ + $d = explode("_", $data); + if(count($d) >= 3){ + return new DustParticle(new Color( + ((int) $d[0]) & 0xff, + ((int) $d[1]) & 0xff, + ((int) $d[2]) & 0xff, + ((int) ($d[3] ?? 255)) & 0xff + )); + } + } + break; } return null; From d2613039ed1226779282c6c12dfae19521014958 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 5 Jun 2022 21:17:10 +0100 Subject: [PATCH 0122/1858] Replace BlockLegacyIds usages with BlockTypeIds where possible --- src/block/BaseBanner.php | 2 +- src/block/BaseSign.php | 2 +- src/block/Cactus.php | 6 +++--- src/block/Cake.php | 4 ++-- src/block/Carpet.php | 4 ++-- src/block/Crops.php | 4 ++-- src/block/DoublePlant.php | 4 ++-- src/block/Fire.php | 2 +- src/block/Flower.php | 2 +- src/block/Grass.php | 2 +- src/block/Leaves.php | 2 +- src/block/Liquid.php | 2 +- src/block/NetherWartPlant.php | 4 ++-- src/block/Sapling.php | 2 +- src/block/Stem.php | 2 +- src/block/Sugarcane.php | 4 ++-- src/block/SweetBerryBush.php | 4 ++-- src/block/TallGrass.php | 4 ++-- src/block/Wall.php | 2 +- src/block/utils/FallableTrait.php | 4 ++-- src/command/defaults/ParticleCommand.php | 6 +++--- src/entity/Living.php | 8 ++++---- src/entity/projectile/SplashPotion.php | 6 +++--- src/event/player/PlayerDeathEvent.php | 4 ++-- src/item/FlintSteel.php | 4 ++-- src/player/Player.php | 4 ++-- src/world/World.php | 8 ++++---- src/world/generator/object/TallGrass.php | 4 ++-- src/world/generator/populator/GroundCover.php | 4 ++-- src/world/generator/populator/TallGrass.php | 11 ++++++----- src/world/generator/populator/Tree.php | 8 ++++---- 31 files changed, 65 insertions(+), 64 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 708254afdd..f318c16df9 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -124,7 +124,7 @@ abstract class BaseBanner extends Transparent{ abstract protected function getSupportingFace() : int; public function onNearbyBlockChange() : void{ - if($this->getSide($this->getSupportingFace())->getId() === BlockLegacyIds::AIR){ + if($this->getSide($this->getSupportingFace())->getTypeId() === BlockTypeIds::AIR){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index e201a2d724..7fcdc0e9aa 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -85,7 +85,7 @@ abstract class BaseSign extends Transparent{ abstract protected function getSupportingFace() : int; public function onNearbyBlockChange() : void{ - if($this->getSide($this->getSupportingFace())->getId() === BlockLegacyIds::AIR){ + if($this->getSide($this->getSupportingFace())->getTypeId() === BlockTypeIds::AIR){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 5ed929db65..5e7cc7cbf2 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -88,7 +88,7 @@ class Cactus extends Transparent{ public function onNearbyBlockChange() : void{ $down = $this->getSide(Facing::DOWN); - if($down->getId() !== BlockLegacyIds::SAND && !$down->isSameType($this)){ + if($down->getTypeId() !== BlockTypeIds::SAND && $down->getTypeId() !== BlockTypeIds::RED_SAND && !$down->isSameType($this)){ $this->position->getWorld()->useBreakOn($this->position); }else{ foreach(Facing::HORIZONTAL as $side){ @@ -113,7 +113,7 @@ class Cactus extends Transparent{ break; } $b = $this->position->getWorld()->getBlockAt($this->position->x, $this->position->y + $y, $this->position->z); - if($b->getId() === BlockLegacyIds::AIR){ + if($b->getTypeId() === BlockTypeIds::AIR){ $ev = new BlockGrowEvent($b, VanillaBlocks::CACTUS()); $ev->call(); if($ev->isCancelled()){ @@ -135,7 +135,7 @@ class Cactus extends Transparent{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() === BlockLegacyIds::SAND || $down->isSameType($this)){ + if($down->getTypeId() === BlockTypeIds::SAND || $down->getTypeId() === BlockTypeIds::RED_SAND || $down->isSameType($this)){ foreach(Facing::HORIZONTAL as $side){ if($this->getSide($side)->isSolid()){ return false; diff --git a/src/block/Cake.php b/src/block/Cake.php index ebde230120..fe341cf400 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -81,7 +81,7 @@ class Cake extends Transparent implements FoodSource{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() !== BlockLegacyIds::AIR){ + if($down->getTypeId() !== BlockTypeIds::AIR){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -89,7 +89,7 @@ class Cake extends Transparent implements FoodSource{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getId() === BlockLegacyIds::AIR){ //Replace with common break method + if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ //Replace with common break method $this->position->getWorld()->setBlock($this->position, VanillaBlocks::AIR()); } } diff --git a/src/block/Carpet.php b/src/block/Carpet.php index 54a1b4abe2..a4e1855c0a 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -53,7 +53,7 @@ class Carpet extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() !== BlockLegacyIds::AIR){ + if($down->getTypeId() !== BlockTypeIds::AIR){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -61,7 +61,7 @@ class Carpet extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getId() === BlockLegacyIds::AIR){ + if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Crops.php b/src/block/Crops.php index 1979ce31fe..425711ce82 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -62,7 +62,7 @@ abstract class Crops extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace->getSide(Facing::DOWN)->getId() === BlockLegacyIds::FARMLAND){ + if($blockReplace->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -91,7 +91,7 @@ abstract class Crops extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getId() !== BlockLegacyIds::FARMLAND){ + if($this->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::FARMLAND){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 155a8e59d9..9b5160fa07 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -54,8 +54,8 @@ class DoublePlant extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $id = $blockReplace->getSide(Facing::DOWN)->getId(); - if(($id === BlockLegacyIds::GRASS || $id === BlockLegacyIds::DIRT) && $blockReplace->getSide(Facing::UP)->canBeReplaced()){ + $id = $blockReplace->getSide(Facing::DOWN)->getTypeId(); + if(($id === BlockTypeIds::GRASS || $id === BlockTypeIds::DIRT) && $blockReplace->getSide(Facing::UP)->canBeReplaced()){ $top = clone $this; $top->top = true; $tx->addBlock($blockReplace->position, $this)->addBlock($blockReplace->position->getSide(Facing::UP), $top); diff --git a/src/block/Fire.php b/src/block/Fire.php index b31151c37b..114379d8a5 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -224,7 +224,7 @@ class Fire extends Flowable{ continue; } $block = $world->getBlockAt($targetX, $targetY, $targetZ); - if($block->getId() !== BlockLegacyIds::AIR){ + if($block->getTypeId() !== BlockTypeIds::AIR){ continue; } diff --git a/src/block/Flower.php b/src/block/Flower.php index ff2d0344b2..e2a3188631 100644 --- a/src/block/Flower.php +++ b/src/block/Flower.php @@ -33,7 +33,7 @@ class Flower extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() === BlockLegacyIds::GRASS || $down->getId() === BlockLegacyIds::DIRT || $down->getId() === BlockLegacyIds::FARMLAND){ + if($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::FARMLAND){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/Grass.php b/src/block/Grass.php index 82d42c55f9..478a0755ea 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -103,7 +103,7 @@ class Grass extends Opaque{ $this->position->getWorld()->setBlock($this->position, $newBlock); return true; - }elseif($item instanceof Shovel && $this->getSide(Facing::UP)->getId() === BlockLegacyIds::AIR){ + }elseif($item instanceof Shovel && $this->getSide(Facing::UP)->getTypeId() === BlockTypeIds::AIR){ $item->applyDamage(1); $newBlock = VanillaBlocks::GRASS_PATH(); $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 8d00611c7e..b8468d0d8d 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -97,7 +97,7 @@ class Leaves extends Transparent{ return true; } - if($block->getId() === $this->getId() && $distance <= 4){ + if($block instanceof Leaves && $distance <= 4){ foreach(Facing::ALL as $side){ if($this->findLog($pos->getSide($side), $visited, $distance + 1)){ return true; diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 8aed66253a..eb553ff2a0 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -348,7 +348,7 @@ abstract class Liquid extends Transparent{ $ev = new BlockSpreadEvent($block, $this, $new); $ev->call(); if(!$ev->isCancelled()){ - if($block->getId() !== BlockLegacyIds::AIR){ + if($block->getTypeId() !== BlockTypeIds::AIR){ $this->position->getWorld()->useBreakOn($block->position); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 0a809c9502..f7d2f992db 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -62,7 +62,7 @@ class NetherWartPlant extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() === BlockLegacyIds::SOUL_SAND){ + if($down->getTypeId() === BlockTypeIds::SOUL_SAND){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -70,7 +70,7 @@ class NetherWartPlant extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getId() !== BlockLegacyIds::SOUL_SAND){ + if($this->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::SOUL_SAND){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 9709032c50..83dc41d194 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -68,7 +68,7 @@ class Sapling extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getId() === BlockLegacyIds::GRASS || $down->getId() === BlockLegacyIds::DIRT || $down->getId() === BlockLegacyIds::FARMLAND){ + if($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::FARMLAND){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/Stem.php b/src/block/Stem.php index c7fd444af2..6ffb396045 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -53,7 +53,7 @@ abstract class Stem extends Crops{ $side = $this->getSide(Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]); $d = $side->getSide(Facing::DOWN); - if($side->getId() === BlockLegacyIds::AIR && ($d->getId() === BlockLegacyIds::FARMLAND || $d->getId() === BlockLegacyIds::GRASS || $d->getId() === BlockLegacyIds::DIRT)){ + if($side->getTypeId() === BlockTypeIds::AIR && ($d->getTypeId() === BlockTypeIds::FARMLAND || $d->getTypeId() === BlockTypeIds::GRASS || $d->getTypeId() === BlockTypeIds::DIRT)){ $ev = new BlockGrowEvent($side, $grow); $ev->call(); if(!$ev->isCancelled()){ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index b90efa77e3..f6d42d61cf 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -56,7 +56,7 @@ class Sugarcane extends Flowable{ break; } $b = $this->position->getWorld()->getBlockAt($this->position->x, $this->position->y + $y, $this->position->z); - if($b->getId() === BlockLegacyIds::AIR){ + if($b->getTypeId() === BlockTypeIds::AIR){ $ev = new BlockGrowEvent($b, VanillaBlocks::SUGARCANE()); $ev->call(); if($ev->isCancelled()){ @@ -122,7 +122,7 @@ class Sugarcane extends Flowable{ $down = $this->getSide(Facing::DOWN); if($down->isSameType($this)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - }elseif($down->getId() === BlockLegacyIds::GRASS || $down->getId() === BlockLegacyIds::DIRT || $down->getId() === BlockLegacyIds::SAND || $down->getId() === BlockLegacyIds::PODZOL){ + }elseif($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::SAND || $down->getTypeId() === BlockTypeIds::RED_SAND || $down->getTypeId() === BlockTypeIds::PODZOL){ foreach(Facing::HORIZONTAL as $side){ if($down->getSide($side) instanceof Water){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 2de41cd11d..22f510e7fa 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -78,8 +78,8 @@ class SweetBerryBush extends Flowable{ } protected function canBeSupportedBy(Block $block) : bool{ - $id = $block->getId(); - return $id === BlockLegacyIds::GRASS || $id === BlockLegacyIds::DIRT || $id === BlockLegacyIds::PODZOL; + $id = $block->getTypeId(); + return $id === BlockTypeIds::GRASS || $id === BlockTypeIds::DIRT || $id === BlockTypeIds::PODZOL; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index b77a828fec..2fed7ca7f0 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -38,8 +38,8 @@ class TallGrass extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN)->getId(); - if($down === BlockLegacyIds::GRASS || $down === BlockLegacyIds::DIRT){ + $down = $this->getSide(Facing::DOWN)->getTypeId(); + if($down === BlockTypeIds::GRASS || $down === BlockTypeIds::DIRT){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 17af1f137d..90ff17d84a 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -55,7 +55,7 @@ class Wall extends Transparent{ } } - $up = $this->getSide(Facing::UP)->getId() !== BlockLegacyIds::AIR; + $up = $this->getSide(Facing::UP)->getTypeId() !== BlockTypeIds::AIR; if($up !== $this->up){ $this->up = $up; $changed++; diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index 6afcc52bf1..0aa1971d27 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\Fire; use pocketmine\block\Liquid; use pocketmine\block\VanillaBlocks; @@ -50,7 +50,7 @@ trait FallableTrait{ public function onNearbyBlockChange() : void{ $pos = $this->getPosition(); $down = $pos->getWorld()->getBlock($pos->getSide(Facing::DOWN)); - if($down->getId() === BlockLegacyIds::AIR || $down instanceof Liquid || $down instanceof Fire){ + if($down->getTypeId() === BlockTypeIds::AIR || $down instanceof Liquid || $down instanceof Fire){ $pos->getWorld()->setBlock($pos, VanillaBlocks::AIR()); $block = $this; diff --git a/src/command/defaults/ParticleCommand.php b/src/command/defaults/ParticleCommand.php index 9abe965ff1..a898e19390 100644 --- a/src/command/defaults/ParticleCommand.php +++ b/src/command/defaults/ParticleCommand.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\command\defaults; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\color\Color; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; @@ -190,7 +190,7 @@ class ParticleCommand extends VanillaCommand{ case "terrain": if($data !== null){ $block = StringToItemParser::getInstance()->parse($data)?->getBlock(); - if($block !== null && $block->getId() !== BlockLegacyIds::AIR){ + if($block !== null && $block->getTypeId() !== BlockTypeIds::AIR){ return new TerrainParticle($block); } } @@ -217,7 +217,7 @@ class ParticleCommand extends VanillaCommand{ } break; case "blockcrack": - if($data !== null && ($block = StringToItemParser::getInstance()->parse($data)?->getBlock()) !== null && $block->getId() !== BlockLegacyIds::AIR){ + if($data !== null && ($block = StringToItemParser::getInstance()->parse($data)?->getBlock()) !== null && $block->getTypeId() !== BlockTypeIds::AIR){ return new TerrainParticle($block); } break; diff --git a/src/entity/Living.php b/src/entity/Living.php index 52dc02dbc3..c8010ab0f7 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\entity; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\EffectIdMap; use pocketmine\entity\animation\DeathAnimation; use pocketmine\entity\animation\HurtAnimation; @@ -346,7 +346,7 @@ abstract class Living extends Entity{ new EntityLongFallSound($this) : new EntityShortFallSound($this) ); - }elseif($fallBlock->getId() !== BlockLegacyIds::AIR){ + }elseif($fallBlock->getTypeId() !== BlockTypeIds::AIR){ $this->broadcastSound(new EntityLandSound($this, $fallBlock)); } return $newVerticalVelocity; @@ -756,10 +756,10 @@ abstract class Living extends Entity{ --$nextIndex; } - $id = $block->getId(); + $id = $block->getTypeId(); if($transparent === null){ - if($id !== BlockLegacyIds::AIR){ + if($id !== BlockTypeIds::AIR){ break; } }else{ diff --git a/src/entity/projectile/SplashPotion.php b/src/entity/projectile/SplashPotion.php index 555a8d7557..952f0d1f6a 100644 --- a/src/entity/projectile/SplashPotion.php +++ b/src/entity/projectile/SplashPotion.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\entity\projectile; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\VanillaBlocks; use pocketmine\color\Color; use pocketmine\data\bedrock\PotionTypeIdMap; @@ -130,11 +130,11 @@ class SplashPotion extends Throwable{ }elseif($event instanceof ProjectileHitBlockEvent && $this->getPotionType()->equals(PotionType::WATER())){ $blockIn = $event->getBlockHit()->getSide($event->getRayTraceResult()->getHitFace()); - if($blockIn->getId() === BlockLegacyIds::FIRE){ + if($blockIn->getTypeId() === BlockTypeIds::FIRE){ $this->getWorld()->setBlock($blockIn->getPosition(), VanillaBlocks::AIR()); } foreach($blockIn->getHorizontalSides() as $horizontalSide){ - if($horizontalSide->getId() === BlockLegacyIds::FIRE){ + if($horizontalSide->getTypeId() === BlockTypeIds::FIRE){ $this->getWorld()->setBlock($horizontalSide->getPosition(), VanillaBlocks::AIR()); } } diff --git a/src/event/player/PlayerDeathEvent.php b/src/event/player/PlayerDeathEvent.php index 01358dd876..487be1f30f 100644 --- a/src/event/player/PlayerDeathEvent.php +++ b/src/event/player/PlayerDeathEvent.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\event\player; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\entity\Living; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; @@ -138,7 +138,7 @@ class PlayerDeathEvent extends EntityDeathEvent{ case EntityDamageEvent::CAUSE_CONTACT: if($deathCause instanceof EntityDamageByBlockEvent){ - if($deathCause->getDamager()->getId() === BlockLegacyIds::CACTUS){ + if($deathCause->getDamager()->getTypeId() === BlockTypeIds::CACTUS){ return KnownTranslationFactory::death_attack_cactus($name); } } diff --git a/src/item/FlintSteel.php b/src/item/FlintSteel.php index ee387f4e68..e55e48e95c 100644 --- a/src/item/FlintSteel.php +++ b/src/item/FlintSteel.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\VanillaBlocks; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -33,7 +33,7 @@ use pocketmine\world\sound\FlintSteelSound; class FlintSteel extends Tool{ public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ - if($blockReplace->getId() === BlockLegacyIds::AIR){ + if($blockReplace->getTypeId() === BlockTypeIds::AIR){ $world = $player->getWorld(); $world->setBlock($blockReplace->getPosition(), VanillaBlocks::FIRE()); $world->addSound($blockReplace->getPosition()->add(0.5, 0.5, 0.5), new FlintSteelSound()); diff --git a/src/player/Player.php b/src/player/Player.php index a120231e1a..da3467592e 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\player; use pocketmine\block\Bed; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\UnknownBlock; use pocketmine\block\VanillaBlocks; use pocketmine\command\CommandSender; @@ -1613,7 +1613,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } $block = $target->getSide($face); - if($block->getId() === BlockLegacyIds::FIRE){ + if($block->getTypeId() === BlockTypeIds::FIRE){ $this->getWorld()->setBlock($block->getPosition(), VanillaBlocks::AIR()); $this->getWorld()->addSound($block->getPosition()->add(0.5, 0.5, 0.5), new FireExtinguishSound()); return true; diff --git a/src/world/World.php b/src/world/World.php index 004a4fd38b..4efe550f38 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -29,7 +29,7 @@ namespace pocketmine\world; use pocketmine\block\Air; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; use pocketmine\block\tile\TileFactory; @@ -444,7 +444,7 @@ class World implements ChunkManager{ continue; } - if($block->getId() !== BlockLegacyIds::AIR){ + if($block->getTypeId() !== BlockTypeIds::AIR){ $dontTickBlocks[$block->getTypeId()] = $name; } } @@ -1776,7 +1776,7 @@ class World implements ChunkManager{ return false; } - if($blockClicked->getId() === BlockLegacyIds::AIR){ + if($blockClicked->getTypeId() === BlockTypeIds::AIR){ return false; } @@ -2651,7 +2651,7 @@ class World implements ChunkManager{ $x = (int) $v->x; $z = (int) $v->z; $y = (int) min($max - 2, $v->y); - $wasAir = $this->getBlockAt($x, $y - 1, $z)->getId() === BlockLegacyIds::AIR; //TODO: bad hack, clean up + $wasAir = $this->getBlockAt($x, $y - 1, $z)->getTypeId() === BlockTypeIds::AIR; //TODO: bad hack, clean up for(; $y > $this->minY; --$y){ if($this->getBlockAt($x, $y, $z)->isFullCube()){ if($wasAir){ diff --git a/src/world/generator/object/TallGrass.php b/src/world/generator/object/TallGrass.php index 8fe70e0c80..0790f0bd84 100644 --- a/src/world/generator/object/TallGrass.php +++ b/src/world/generator/object/TallGrass.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\generator\object; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\VanillaBlocks; use pocketmine\math\Vector3; use pocketmine\utils\Random; @@ -47,7 +47,7 @@ class TallGrass{ for($c = 0; $c < $count; ++$c){ $x = $random->nextRange($pos->x - $radius, $pos->x + $radius); $z = $random->nextRange($pos->z - $radius, $pos->z + $radius); - if($world->getBlockAt($x, $pos->y + 1, $z)->getId() === BlockLegacyIds::AIR && $world->getBlockAt($x, $pos->y, $z)->getId() === BlockLegacyIds::GRASS){ + if($world->getBlockAt($x, $pos->y + 1, $z)->getTypeId() === BlockTypeIds::AIR && $world->getBlockAt($x, $pos->y, $z)->getTypeId() === BlockTypeIds::GRASS){ $world->setBlockAt($x, $pos->y + 1, $z, $arr[$random->nextRange(0, $arrC)]); } } diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 7a72e021c6..d2e553bc06 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\generator\populator; use pocketmine\block\BlockFactory; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\Liquid; use pocketmine\utils\Random; use pocketmine\world\biome\BiomeRegistry; @@ -60,7 +60,7 @@ class GroundCover implements Populator{ for($y = $startY; $y > $endY && $y >= 0; --$y){ $b = $cover[$startY - $y]; $id = $factory->fromFullBlock($chunk->getFullBlock($x, $y, $z)); - if($id->getId() === BlockLegacyIds::AIR && $b->isSolid()){ + if($id->getTypeId() === BlockTypeIds::AIR && $b->isSolid()){ break; } if($b->canBeFlowedInto() && $id instanceof Liquid){ diff --git a/src/world/generator/populator/TallGrass.php b/src/world/generator/populator/TallGrass.php index de8d0b6758..a441f3e5cf 100644 --- a/src/world/generator/populator/TallGrass.php +++ b/src/world/generator/populator/TallGrass.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\world\generator\populator; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; +use pocketmine\block\Leaves; use pocketmine\block\VanillaBlocks; use pocketmine\utils\Random; use pocketmine\world\ChunkManager; @@ -57,14 +58,14 @@ class TallGrass implements Populator{ } private function canTallGrassStay(ChunkManager $world, int $x, int $y, int $z) : bool{ - $b = $world->getBlockAt($x, $y, $z)->getId(); - return ($b === BlockLegacyIds::AIR || $b === BlockLegacyIds::SNOW_LAYER) && $world->getBlockAt($x, $y - 1, $z)->getId() === BlockLegacyIds::GRASS; + $b = $world->getBlockAt($x, $y, $z)->getTypeId(); + return ($b === BlockTypeIds::AIR || $b === BlockTypeIds::SNOW_LAYER) && $world->getBlockAt($x, $y - 1, $z)->getTypeId() === BlockTypeIds::GRASS; } private function getHighestWorkableBlock(ChunkManager $world, int $x, int $z) : int{ for($y = 127; $y >= 0; --$y){ - $b = $world->getBlockAt($x, $y, $z)->getId(); - if($b !== BlockLegacyIds::AIR && $b !== BlockLegacyIds::LEAVES && $b !== BlockLegacyIds::LEAVES2 && $b !== BlockLegacyIds::SNOW_LAYER){ + $b = $world->getBlockAt($x, $y, $z); + if($b->getTypeId() !== BlockTypeIds::AIR && !($b instanceof Leaves) && $b->getTypeId() !== BlockTypeIds::SNOW_LAYER){ return $y + 1; } } diff --git a/src/world/generator/populator/Tree.php b/src/world/generator/populator/Tree.php index b0a2214b85..99b1171f00 100644 --- a/src/world/generator/populator/Tree.php +++ b/src/world/generator/populator/Tree.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\generator\populator; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\utils\TreeType; use pocketmine\utils\Random; use pocketmine\world\ChunkManager; @@ -67,10 +67,10 @@ class Tree implements Populator{ private function getHighestWorkableBlock(ChunkManager $world, int $x, int $z) : int{ for($y = 127; $y >= 0; --$y){ - $b = $world->getBlockAt($x, $y, $z)->getId(); - if($b === BlockLegacyIds::DIRT || $b === BlockLegacyIds::GRASS){ + $b = $world->getBlockAt($x, $y, $z)->getTypeId(); + if($b === BlockTypeIds::DIRT || $b === BlockTypeIds::GRASS){ return $y + 1; - }elseif($b !== BlockLegacyIds::AIR && $b !== BlockLegacyIds::SNOW_LAYER){ + }elseif($b !== BlockTypeIds::AIR && $b !== BlockTypeIds::SNOW_LAYER){ return -1; } } From 02568bb04947f0eee8a4ef43975e694371e5124a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 5 Jun 2022 21:19:38 +0100 Subject: [PATCH 0123/1858] Remove ItemFactory usage from Bucket --- src/item/Bucket.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/item/Bucket.php b/src/item/Bucket.php index 3d6c818a10..749dd8a0bf 100644 --- a/src/item/Bucket.php +++ b/src/item/Bucket.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; +use pocketmine\block\BlockTypeIds; use pocketmine\block\Liquid; use pocketmine\block\VanillaBlocks; use pocketmine\event\player\PlayerBucketFillEvent; @@ -42,7 +43,15 @@ class Bucket extends Item{ $stack = clone $this; $stack->pop(); - $resultItem = ItemFactory::getInstance()->get(ItemIds::BUCKET, $blockClicked->getFlowingForm()->getId()); + $resultItem = match($blockClicked->getTypeId()){ + BlockTypeIds::LAVA => VanillaItems::LAVA_BUCKET(), + BlockTypeIds::WATER => VanillaItems::WATER_BUCKET(), + default => null + }; + if($resultItem === null){ + return ItemUseResult::FAIL(); + } + $ev = new PlayerBucketFillEvent($player, $blockReplace, $face, $this, $resultItem); $ev->call(); if(!$ev->isCancelled()){ From 5c85aa6e58ecb3f5a56adf7dcb350e81818d1564 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 5 Jun 2022 21:49:51 +0100 Subject: [PATCH 0124/1858] Eliminate remaining usages of legacy block ID+meta on disk flower pots loaded from vanilla worlds should now correctly display the plant inside --- src/block/tile/FlowerPot.php | 30 +++++++--- src/entity/object/FallingBlock.php | 41 +++++++++---- src/entity/projectile/Projectile.php | 59 ++++++++----------- .../format/io/GlobalBlockStateHandlers.php | 21 +++++++ src/world/format/io/leveldb/LevelDB.php | 16 +---- 5 files changed, 98 insertions(+), 69 deletions(-) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 294e4fe41f..3534bedf50 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -26,9 +26,12 @@ namespace pocketmine\block\tile; use pocketmine\block\Air; use pocketmine\block\Block; use pocketmine\block\BlockFactory; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\SavedDataLoadingException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ShortTag; +use pocketmine\world\format\io\GlobalBlockStateHandlers; /** * @deprecated @@ -37,25 +40,35 @@ use pocketmine\nbt\tag\ShortTag; class FlowerPot extends Spawnable{ private const TAG_ITEM = "item"; private const TAG_ITEM_DATA = "mData"; + private const TAG_PLANT_BLOCK = "PlantBlock"; private ?Block $plant = null; public function readSaveData(CompoundTag $nbt) : void{ + $blockStateData = null; if(($itemIdTag = $nbt->getTag(self::TAG_ITEM)) instanceof ShortTag && ($itemMetaTag = $nbt->getTag(self::TAG_ITEM_DATA)) instanceof IntTag){ + $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue()); + }elseif(($plantBlockTag = $nbt->getCompoundTag(self::TAG_PLANT_BLOCK)) !== null){ try{ - $this->setPlant(BlockFactory::getInstance()->get($itemIdTag->getValue(), $itemMetaTag->getValue())); - }catch(\InvalidArgumentException $e){ - //noop + $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($plantBlockTag); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Error loading " . self::TAG_PLANT_BLOCK . " tag for flower pot: " . $e->getMessage(), 0, $e); } - }else{ - //TODO: new PlantBlock tag + } + + if($blockStateData !== null){ + try{ + $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Error deserializing plant for flower pot: " . $e->getMessage(), 0, $e); + } + $this->setPlant(BlockFactory::getInstance()->fromFullBlock($blockStateId)); } } protected function writeSaveData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setShort(self::TAG_ITEM, $this->plant->getId()); - $nbt->setInt(self::TAG_ITEM_DATA, $this->plant->getMeta()); + $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt()); } } @@ -73,8 +86,7 @@ class FlowerPot extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setShort(self::TAG_ITEM, $this->plant->getId()); - $nbt->setInt(self::TAG_ITEM_DATA, $this->plant->getMeta()); + $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt()); } } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 1a61a2fba1..02c0249f88 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -26,6 +26,7 @@ namespace pocketmine\entity\object; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\utils\Fallable; +use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; @@ -40,9 +41,11 @@ use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; +use pocketmine\world\format\io\GlobalBlockStateHandlers; use function abs; class FallingBlock extends Entity{ + private const TAG_FALLING_BLOCK = "FallingBlock"; //TAG_Compound public static function getNetworkTypeId() : string{ return EntityIds::FALLING_BLOCK; } @@ -60,22 +63,37 @@ class FallingBlock extends Entity{ protected function getInitialGravity() : float{ return 0.04; } public static function parseBlockNBT(BlockFactory $factory, CompoundTag $nbt) : Block{ - $blockId = 0; //TODO: 1.8+ save format - if(($tileIdTag = $nbt->getTag("TileID")) instanceof IntTag){ - $blockId = $tileIdTag->getValue(); - }elseif(($tileTag = $nbt->getTag("Tile")) instanceof ByteTag){ - $blockId = $tileTag->getValue(); + if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){ + try{ + $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($fallingBlockTag); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + }else{ + if(($tileIdTag = $nbt->getTag("TileID")) instanceof IntTag){ + $blockId = $tileIdTag->getValue(); + }elseif(($tileTag = $nbt->getTag("Tile")) instanceof ByteTag){ + $blockId = $tileTag->getValue(); + }else{ + throw new SavedDataLoadingException("Missing legacy falling block info"); + } + $damage = $nbt->getByte("Data", 0); + + $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromIntIdMeta($blockId, $damage); + if($blockStateData === null){ + throw new SavedDataLoadingException("Invalid legacy falling block"); + } } - if($blockId === 0){ - throw new SavedDataLoadingException("Missing block info from NBT"); + try{ + $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); } - $damage = $nbt->getByte("Data", 0); - - return $factory->get($blockId, $damage); + return $factory->fromFullBlock($blockStateId); } public function canCollideWith(Entity $entity) : bool{ @@ -137,8 +155,7 @@ class FallingBlock extends Entity{ public function saveNBT() : CompoundTag{ $nbt = parent::saveNBT(); - $nbt->setInt("TileID", $this->block->getId()); - $nbt->setByte("Data", $this->block->getMeta()); + $nbt->setTag(self::TAG_FALLING_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->block->getFullId())->toNbt()); return $nbt; } diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 40e7cb45d5..dd0b50c752 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\entity\projectile; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\entity\Location; @@ -38,21 +38,24 @@ use pocketmine\event\entity\ProjectileHitEvent; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\math\VoxelRayTrace; -use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\ListTag; use pocketmine\timings\Timings; use function assert; use function atan2; use function ceil; +use function count; use function sqrt; use const M_PI; use const PHP_INT_MAX; abstract class Projectile extends Entity{ + private const TAG_STUCK_ON_BLOCK_POS = "StuckToBlockPos"; protected float $damage = 0.0; - protected ?Block $blockHit = null; + protected ?Vector3 $blockHit = null; public function __construct(Location $location, ?Entity $shootingEntity, ?CompoundTag $nbt = null){ parent::__construct($location, $nbt); @@ -74,28 +77,18 @@ abstract class Projectile extends Entity{ $this->setHealth(1); $this->damage = $nbt->getDouble("damage", $this->damage); - (function() use ($nbt) : void{ - if(($tileXTag = $nbt->getTag("tileX")) instanceof IntTag && ($tileYTag = $nbt->getTag("tileY")) instanceof IntTag && ($tileZTag = $nbt->getTag("tileZ")) instanceof IntTag){ - $blockPos = new Vector3($tileXTag->getValue(), $tileYTag->getValue(), $tileZTag->getValue()); - }else{ - return; + if(($stuckOnBlockPosTag = $nbt->getListTag(self::TAG_STUCK_ON_BLOCK_POS)) !== null){ + if($stuckOnBlockPosTag->getTagType() !== NBT::TAG_Int || count($stuckOnBlockPosTag) !== 3){ + throw new SavedDataLoadingException(self::TAG_STUCK_ON_BLOCK_POS . " tag should be a list of 3 TAG_Int"); } - if(($blockIdTag = $nbt->getTag("blockId")) instanceof IntTag){ - $blockId = $blockIdTag->getValue(); - }else{ - return; - } + /** @var IntTag[] $values */ + $values = $stuckOnBlockPosTag->getValue(); - if(($blockDataTag = $nbt->getTag("blockData")) instanceof ByteTag){ - $blockData = $blockDataTag->getValue(); - }else{ - return; - } - - $this->blockHit = BlockFactory::getInstance()->get($blockId, $blockData); - $this->blockHit->position($this->getWorld(), $blockPos->getFloorX(), $blockPos->getFloorY(), $blockPos->getFloorZ()); - })(); + $this->blockHit = new Vector3($values[0]->getValue(), $values[1]->getValue(), $values[2]->getValue()); + }elseif(($tileXTag = $nbt->getTag("tileX")) instanceof IntTag && ($tileYTag = $nbt->getTag("tileY")) instanceof IntTag && ($tileZTag = $nbt->getTag("tileZ")) instanceof IntTag){ + $this->blockHit = new Vector3($tileXTag->getValue(), $tileYTag->getValue(), $tileZTag->getValue()); + } } public function canCollideWith(Entity $entity) : bool{ @@ -134,14 +127,11 @@ abstract class Projectile extends Entity{ $nbt->setDouble("damage", $this->damage); if($this->blockHit !== null){ - $pos = $this->blockHit->getPosition(); - $nbt->setInt("tileX", $pos->x); - $nbt->setInt("tileY", $pos->y); - $nbt->setInt("tileZ", $pos->z); - - //we intentionally use different ones to PC because we don't have stringy IDs - $nbt->setInt("blockId", $this->blockHit->getId()); - $nbt->setByte("blockData", $this->blockHit->getMeta()); + $nbt->setTag(self::TAG_STUCK_ON_BLOCK_POS, new ListTag([ + new IntTag($this->blockHit->getFloorX()), + new IntTag($this->blockHit->getFloorY()), + new IntTag($this->blockHit->getFloorZ()) + ])); } return $nbt; @@ -152,8 +142,11 @@ abstract class Projectile extends Entity{ } public function onNearbyBlockChange() : void{ - if($this->blockHit !== null && $this->getWorld()->isInLoadedTerrain($this->blockHit->getPosition()) && !$this->blockHit->isSameState($this->getWorld()->getBlock($this->blockHit->getPosition()))){ - $this->blockHit = null; + if($this->blockHit !== null && $this->getWorld()->isInLoadedTerrain($this->blockHit)){ + $blockHit = $this->getWorld()->getBlock($this->blockHit); + if(!$blockHit->collidesWithBB($this->getBoundingBox()->expandedCopy(0.001, 0.001, 0.001))){ + $this->blockHit = null; + } } parent::onNearbyBlockChange(); @@ -312,6 +305,6 @@ abstract class Projectile extends Entity{ * Called when the projectile collides with a Block. */ protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ - $this->blockHit = clone $blockHit; + $this->blockHit = $blockHit->getPosition()->asVector3(); } } diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 3ea54b01c5..096f116f52 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\blockstate\BlockStateData; use pocketmine\data\bedrock\blockstate\BlockStateDeserializer; use pocketmine\data\bedrock\blockstate\BlockStateSerializer; +use pocketmine\data\bedrock\blockstate\BlockTypeNames; use pocketmine\data\bedrock\blockstate\CachingBlockStateDeserializer; use pocketmine\data\bedrock\blockstate\CachingBlockStateSerializer; use pocketmine\data\bedrock\blockstate\convert\BlockObjectToBlockStateSerializer; @@ -36,6 +37,7 @@ use pocketmine\data\bedrock\blockstate\upgrade\LegacyBlockStateMapper; use pocketmine\data\bedrock\blockstate\UpgradingBlockStateDeserializer; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; +use pocketmine\nbt\tag\CompoundTag; use Webmozart\PathUtil\Path; use function file_get_contents; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; @@ -79,4 +81,23 @@ final class GlobalBlockStateHandlers{ LegacyBlockIdToStringIdMap::getInstance() ); } + + public static function nbtToBlockStateData(CompoundTag $tag) : BlockStateData{ + if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ + //Legacy (pre-1.13) blockstate - upgrade it to a version we understand + $id = $tag->getString("name"); + $data = $tag->getShort("val"); + + $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromStringIdMeta($id, $data); + if($blockStateData === null){ + //unknown block, invalid ID + $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + } + }else{ + //Modern (post-1.13) blockstate + $blockStateData = BlockStateData::fromNbt($tag); + } + + return $blockStateData; + } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 5be9306603..1a25be18a4 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -165,23 +165,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ try{ $offset = $stream->getOffset(); - $tag = $nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); + $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag()); $stream->setOffset($offset); - if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ - //Legacy (pre-1.13) blockstate - upgrade it to a version we understand - $id = $tag->getString("name"); - $data = $tag->getShort("val"); - - $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromStringIdMeta($id, $data); - if($blockStateData === null){ - $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); - } - }else{ - //Modern (post-1.13) blockstate - $blockStateData = BlockStateData::fromNbt($tag); - } - try{ $palette[] = $blockStateDeserializer->deserialize($blockStateData); }catch(BlockStateDeserializeException){ From b57f0a2b7e0d15474d2c0cb489c8ecc636b7ed68 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 17:23:10 +0100 Subject: [PATCH 0125/1858] Fixed uninitialized typed properties --- src/inventory/transaction/CraftingTransaction.php | 4 ++-- src/thread/CommonThreadPartsTrait.php | 2 +- src/world/utils/SubChunkExplorer.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/inventory/transaction/CraftingTransaction.php b/src/inventory/transaction/CraftingTransaction.php index c7f71723f2..5a36061f7b 100644 --- a/src/inventory/transaction/CraftingTransaction.php +++ b/src/inventory/transaction/CraftingTransaction.php @@ -48,8 +48,8 @@ use function intdiv; * results, with no remainder. Any leftovers are expected to be emitted back to the crafting grid. */ class CraftingTransaction extends InventoryTransaction{ - protected ?CraftingRecipe $recipe; - protected ?int $repetitions; + protected ?CraftingRecipe $recipe = null; + protected ?int $repetitions = null; /** @var Item[] */ protected array $inputs = []; diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 8085cf8d62..283d4ea391 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -30,7 +30,7 @@ use function error_reporting; trait CommonThreadPartsTrait{ /** @var \Threaded|\ClassLoader[]|null */ private ?\Threaded $classLoaders = null; - protected ?string $composerAutoloaderPath; + protected ?string $composerAutoloaderPath = null; protected bool $isKilled = false; diff --git a/src/world/utils/SubChunkExplorer.php b/src/world/utils/SubChunkExplorer.php index d4275e951f..97ba3cff5c 100644 --- a/src/world/utils/SubChunkExplorer.php +++ b/src/world/utils/SubChunkExplorer.php @@ -28,8 +28,8 @@ use pocketmine\world\format\Chunk; use pocketmine\world\format\SubChunk; class SubChunkExplorer{ - public ?Chunk $currentChunk; - public ?SubChunk $currentSubChunk; + public ?Chunk $currentChunk = null; + public ?SubChunk $currentSubChunk = null; protected int $currentX; protected int $currentY; From 08fbf92d8de917ed0044c5f1953bfe1a01195bb9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 18:25:14 +0100 Subject: [PATCH 0126/1858] Filter out recipes containing unknown items --- .../CraftingManagerFromDataHelper.php | 75 +++++++++++++++---- src/network/mcpe/convert/ItemTranslator.php | 2 - 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index f38709ab5d..8de00ff62a 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\crafting; +use pocketmine\item\Durable; use pocketmine\item\Item; +use pocketmine\item\ItemFactory; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use function array_map; @@ -33,6 +35,24 @@ use function json_decode; final class CraftingManagerFromDataHelper{ + /** + * @param Item[] $items + */ + private static function containsUnknownItems(array $items) : bool{ + $factory = ItemFactory::getInstance(); + foreach($items as $item){ + if( + //TODO: this check is imperfect and might cause problems if meta 0 isn't used for some reason + (($item instanceof Durable || $item->hasAnyDamageValue()) && !$factory->isRegistered($item->getId())) || + !$factory->isRegistered($item->getId(), $item->getMeta()) + ){ + return true; + } + } + + return false; + } + public static function make(string $filePath) : CraftingManager{ $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file"), true); if(!is_array($recipes)){ @@ -52,9 +72,14 @@ final class CraftingManagerFromDataHelper{ if($recipeType === null){ continue; } + $inputs = array_map($itemDeserializerFunc, $recipe["input"]); + $outputs = array_map($itemDeserializerFunc, $recipe["output"]); + if(self::containsUnknownItems($inputs) || self::containsUnknownItems($outputs)){ + continue; + } $result->registerShapelessRecipe(new ShapelessRecipe( - array_map($itemDeserializerFunc, $recipe["input"]), - array_map($itemDeserializerFunc, $recipe["output"]), + $inputs, + $outputs, $recipeType )); } @@ -62,10 +87,15 @@ final class CraftingManagerFromDataHelper{ if($recipe["block"] !== "crafting_table"){ //TODO: filter others out for now to avoid breaking economics continue; } + $inputs = array_map($itemDeserializerFunc, $recipe["input"]); + $outputs = array_map($itemDeserializerFunc, $recipe["output"]); + if(self::containsUnknownItems($inputs) || self::containsUnknownItems($outputs)){ + continue; + } $result->registerShapedRecipe(new ShapedRecipe( $recipe["shape"], - array_map($itemDeserializerFunc, $recipe["input"]), - array_map($itemDeserializerFunc, $recipe["output"]) + $inputs, + $outputs )); } foreach($recipes["smelting"] as $recipe){ @@ -79,23 +109,42 @@ final class CraftingManagerFromDataHelper{ if($furnaceType === null){ continue; } + $output = Item::jsonDeserialize($recipe["output"]); + $input = Item::jsonDeserialize($recipe["input"]); + if(self::containsUnknownItems([$output, $input])){ + continue; + } $result->getFurnaceRecipeManager($furnaceType)->register(new FurnaceRecipe( - Item::jsonDeserialize($recipe["output"]), - Item::jsonDeserialize($recipe["input"])) - ); + $output, + $input + )); } foreach($recipes["potion_type"] as $recipe){ + $input = Item::jsonDeserialize($recipe["input"]); + $ingredient = Item::jsonDeserialize($recipe["ingredient"]); + $output = Item::jsonDeserialize($recipe["output"]); + + if(self::containsUnknownItems([$input, $ingredient, $output])){ + continue; + } $result->registerPotionTypeRecipe(new PotionTypeRecipe( - Item::jsonDeserialize($recipe["input"]), - Item::jsonDeserialize($recipe["ingredient"]), - Item::jsonDeserialize($recipe["output"]) + $input, + $ingredient, + $output )); } foreach($recipes["potion_container_change"] as $recipe){ + $input = ItemFactory::getInstance()->get($recipe["input_item_id"], -1); + $ingredient = Item::jsonDeserialize($recipe["ingredient"]); + $output = ItemFactory::getInstance()->get($recipe["output_item_id"], -1); + + if(self::containsUnknownItems([$input, $ingredient, $output])){ + continue; + } $result->registerPotionContainerChangeRecipe(new PotionContainerChangeRecipe( - $recipe["input_item_id"], - Item::jsonDeserialize($recipe["ingredient"]), - $recipe["output_item_id"] + $input->getId(), + $ingredient, + $output->getId() )); } diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 94615da459..6bd8903331 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -28,7 +28,6 @@ use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\item\ItemFactory; -use pocketmine\item\ItemIds; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -87,7 +86,6 @@ final class ItemTranslator{ */ public function toNetworkId(int $internalId, int $internalMeta) : array{ return $this->toNetworkIdQuiet($internalId, $internalMeta) ?? - $this->toNetworkIdQuiet(ItemIds::INFO_UPDATE, 0) ?? //TODO: bad duct tape throw new \InvalidArgumentException("Unmapped ID/metadata combination $internalId:$internalMeta"); } From 93124c79eae6f6f7960da6d5a35cbf0401885383 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 18:50:40 +0100 Subject: [PATCH 0127/1858] Fixed incorrect unknown item filtering logic this caused recipes with wildcard inputs to not show up at all. --- src/crafting/CraftingManagerFromDataHelper.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 8de00ff62a..30b327f1eb 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -41,11 +41,12 @@ final class CraftingManagerFromDataHelper{ private static function containsUnknownItems(array $items) : bool{ $factory = ItemFactory::getInstance(); foreach($items as $item){ - if( + if($item instanceof Durable || $item->hasAnyDamageValue()){ //TODO: this check is imperfect and might cause problems if meta 0 isn't used for some reason - (($item instanceof Durable || $item->hasAnyDamageValue()) && !$factory->isRegistered($item->getId())) || - !$factory->isRegistered($item->getId(), $item->getMeta()) - ){ + if(!$factory->isRegistered($item->getId())){ + return true; + } + }elseif(!$factory->isRegistered($item->getId(), $item->getMeta())){ return true; } } From 86e7ae341ffa19e27164304d2e64e8d6ae547398 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 20:48:44 +0100 Subject: [PATCH 0128/1858] ItemSerializer: Prohibit serializing recipe input wildcards --- src/data/bedrock/item/ItemSerializer.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 492a967b39..0870ece624 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -105,6 +105,9 @@ final class ItemSerializer{ if($item->isNull()){ throw new \InvalidArgumentException("Cannot serialize a null itemstack"); } + if($item->hasAnyDamageValue()){ + throw new \InvalidArgumentException("Cannot serialize a recipe input as a saved itemstack"); + } if($item instanceof ItemBlock){ $data = $this->serializeBlockItem($item->getBlock()); }else{ From 13bb1c26fb8bc496d13f092393137c221ff3048f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 20:51:26 +0100 Subject: [PATCH 0129/1858] ItemTranslator now operates directly using Item, rather than using item ID/meta + ItemFactory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in almost all cases where ItemTranslator is used, an Item already exists, so it doesn't make any sense to make ItemTranslator go and create another item instance just to pass to ‰ItemSerializer. --- .../animation/ConsumingItemAnimation.php | 2 +- src/network/mcpe/cache/CraftingDataCache.php | 9 +-- src/network/mcpe/convert/ItemTranslator.php | 51 ++++++---------- src/network/mcpe/convert/TypeConverter.php | 58 ++++++++++++------- 4 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/entity/animation/ConsumingItemAnimation.php b/src/entity/animation/ConsumingItemAnimation.php index 83ff1d5e71..60639ea6bd 100644 --- a/src/entity/animation/ConsumingItemAnimation.php +++ b/src/entity/animation/ConsumingItemAnimation.php @@ -37,7 +37,7 @@ final class ConsumingItemAnimation implements Animation{ ){} public function encode() : array{ - [$netId, $netData] = ItemTranslator::getInstance()->toNetworkId($this->item->getId(), $this->item->getMeta()); + [$netId, $netData] = ItemTranslator::getInstance()->toNetworkId($this->item); return [ //TODO: need to check the data values ActorEventPacket::create($this->human->getId(), ActorEvent::EATING_ITEM, ($netId << 16) | $netData) diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 1f09525d88..a8a881cff9 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -27,6 +27,7 @@ use pocketmine\crafting\CraftingManager; use pocketmine\crafting\FurnaceType; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; +use pocketmine\item\ItemFactory; use pocketmine\network\mcpe\convert\ItemTranslator; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\CraftingDataPacket; @@ -135,7 +136,7 @@ final class CraftingDataCache{ default => throw new AssumptionFailedError("Unreachable"), }; foreach($manager->getFurnaceRecipeManager($furnaceType)->getAll() as $recipe){ - $input = $converter->coreItemStackToNet($recipe->getInput()); + $input = $converter->coreItemStackToRecipeIngredient($recipe->getInput()); $recipesWithTypeIds[] = new ProtocolFurnaceRecipe( CraftingDataPacket::ENTRY_FURNACE_DATA, $input->getId(), @@ -167,9 +168,9 @@ final class CraftingDataCache{ $itemTranslator = ItemTranslator::getInstance(); foreach($manager->getPotionContainerChangeRecipes() as $recipes){ foreach($recipes as $recipe){ - $input = $itemTranslator->toNetworkId($recipe->getInputItemId(), 0); - $ingredient = $itemTranslator->toNetworkId($recipe->getIngredient()->getId(), 0); - $output = $itemTranslator->toNetworkId($recipe->getOutputItemId(), 0); + $input = $itemTranslator->toNetworkId(ItemFactory::getInstance()->get($recipe->getInputItemId(), 0)); + $ingredient = $itemTranslator->toNetworkId($recipe->getIngredient()); + $output = $itemTranslator->toNetworkId(ItemFactory::getInstance()->get($recipe->getOutputItemId(), 0)); $potionContainerChangeRecipes[] = new ProtocolPotionContainerChangeRecipe( $input[0], $ingredient[0], diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 6bd8903331..09cbac1065 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -27,7 +27,7 @@ use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; -use pocketmine\item\ItemFactory; +use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -54,16 +54,24 @@ final class ItemTranslator{ * @return int[]|null * @phpstan-return array{int, int, int}|null */ - public function toNetworkIdQuiet(int $internalId, int $internalMeta) : ?array{ - //TODO: we should probably come up with a cache for this - + public function toNetworkIdQuiet(Item $item) : ?array{ try{ - $itemData = $this->itemSerializer->serialize(ItemFactory::getInstance()->get($internalId, $internalMeta)); + return $this->toNetworkId($item); }catch(ItemTypeSerializeException){ - //TODO: this will swallow any serializer error; this is not ideal, but it should be OK since unit tests - //should cover this return null; } + } + + /** + * @return int[] + * @phpstan-return array{int, int, int} + * + * @throws ItemTypeSerializeException + */ + public function toNetworkId(Item $item) : array{ + //TODO: we should probably come up with a cache for this + + $itemData = $this->itemSerializer->serialize($item); $numericId = $this->dictionary->fromStringId($itemData->getName()); $blockStateData = $itemData->getBlock(); @@ -81,40 +89,15 @@ final class ItemTranslator{ } /** - * @return int[] - * @phpstan-return array{int, int, int} - */ - public function toNetworkId(int $internalId, int $internalMeta) : array{ - return $this->toNetworkIdQuiet($internalId, $internalMeta) ?? - throw new \InvalidArgumentException("Unmapped ID/metadata combination $internalId:$internalMeta"); - } - - /** - * @return int[] - * @phpstan-return array{int, int} * @throws TypeConversionException */ - public function fromNetworkId(int $networkId, int $networkMeta, int $networkBlockRuntimeId) : array{ + public function fromNetworkId(int $networkId, int $networkMeta, int $networkBlockRuntimeId) : Item{ $stringId = $this->dictionary->fromIntId($networkId); $blockStateData = $networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID ? RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getDataFromStateId($networkBlockRuntimeId) : null; - $item = $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); - return [$item->getId(), $item->getMeta()]; - } - - /** - * @return int[] - * @phpstan-return array{int, int} - * @throws TypeConversionException - */ - public function fromNetworkIdWithWildcardHandling(int $networkId, int $networkMeta) : array{ - if($networkMeta !== 0x7fff){ - return $this->fromNetworkId($networkId, $networkMeta, 0); - } - [$id, ] = $this->fromNetworkId($networkId, 0, 0); - return [$id, -1]; + return $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); } } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 8d4fd63bd4..6272ff4df5 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -27,6 +27,7 @@ use pocketmine\block\inventory\CraftingTableInventory; use pocketmine\block\inventory\EnchantInventory; use pocketmine\block\inventory\LoomInventory; use pocketmine\block\inventory\StonecutterInventory; +use pocketmine\block\VanillaBlocks; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; @@ -60,6 +61,8 @@ class TypeConverter{ private const PM_ID_TAG = "___Id___"; private const PM_META_TAG = "___Meta___"; + private const RECIPE_INPUT_WILDCARD_META = 0x7fff; + private int $shieldRuntimeId; public function __construct(){ @@ -116,10 +119,10 @@ class TypeConverter{ return new RecipeIngredient(0, 0, 0); } if($itemStack->hasAnyDamageValue()){ - [$id, ] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), 0); - $meta = 0x7fff; + [$id, ] = ItemTranslator::getInstance()->toNetworkId(ItemFactory::getInstance()->get($itemStack->getId())); + $meta = self::RECIPE_INPUT_WILDCARD_META; }else{ - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), $itemStack->getMeta()); + [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack); } return new RecipeIngredient($id, $meta, $itemStack->getCount()); } @@ -128,8 +131,17 @@ class TypeConverter{ if($ingredient->getId() === 0){ return VanillaItems::AIR(); } - [$id, $meta] = ItemTranslator::getInstance()->fromNetworkIdWithWildcardHandling($ingredient->getId(), $ingredient->getMeta()); - return ItemFactory::getInstance()->get($id, $meta, $ingredient->getCount()); + + //TODO: this won't be handled properly for blockitems because a block runtimeID is expected rather than a meta value + + if($ingredient->getMeta() === self::RECIPE_INPUT_WILDCARD_META){ + $idItem = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), 0, 0); + $result = ItemFactory::getInstance()->get($idItem->getId(), -1); + }else{ + $result = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), $ingredient->getMeta(), 0); + } + $result->setCount($ingredient->getCount()); + return $result; } public function coreItemStackToNet(Item $itemStack) : ItemStack{ @@ -141,11 +153,11 @@ class TypeConverter{ $nbt = clone $itemStack->getNamedTag(); } - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack->getId(), $itemStack->getMeta()); + $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with //other unmapped items. - [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId(ItemIds::INFO_UPDATE, 0); + [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId(VanillaBlocks::INFO_UPDATE()->asItem()); if($nbt === null){ $nbt = new CompoundTag(); } @@ -188,12 +200,13 @@ class TypeConverter{ } $compound = $itemStack->getNbt(); - [$id, $meta] = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); + $itemResult = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); if($compound !== null){ $compound = clone $compound; - if($id === ItemIds::INFO_UPDATE && $meta === 0){ + $id = $meta = null; + if($itemResult->getId() === ItemIds::INFO_UPDATE && $itemResult->getMeta() === 0){ if(($idTag = $compound->getTag(self::PM_ID_TAG)) instanceof IntTag){ $id = $idTag->getValue(); $compound->removeTag(self::PM_ID_TAG); @@ -214,21 +227,24 @@ class TypeConverter{ if($compound->count() === 0){ $compound = null; } - } - if($meta < 0 || $meta >= 0x7fff){ //this meta value may have been restored from the NBT - throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7fff . " (received $meta)"); + if($meta !== null){ + if($meta < 0 || $meta >= 0x7fff){ //this meta value may have been restored from the NBT + throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7fff . " (received $meta)"); + } + $itemResult = ItemFactory::getInstance()->get($id ?? $itemResult->getId(), $meta); + } } - try{ - return ItemFactory::getInstance()->get( - $id, - $meta, - $itemStack->getCount(), - $compound - ); - }catch(NbtException $e){ - throw TypeConversionException::wrap($e, "Bad itemstack NBT data"); + $itemResult->setCount($itemStack->getCount()); + if($compound !== null){ + try{ + $itemResult->setNamedTag($compound); + }catch(NbtException $e){ + throw TypeConversionException::wrap($e, "Bad itemstack NBT data"); + } } + + return $itemResult; } /** From c89f7f8e5e4944b6740adeae676895c478f74b93 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 21:47:04 +0100 Subject: [PATCH 0130/1858] TypeConverter: duct tape for crafting recipe block inputs --- src/network/mcpe/convert/TypeConverter.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 6272ff4df5..55c4deb1fa 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -123,6 +123,11 @@ class TypeConverter{ $meta = self::RECIPE_INPUT_WILDCARD_META; }else{ [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack); + if($id < 256){ + //TODO: this is needed for block crafting recipes to work - we need to replace this with some kind of + //blockstate <-> meta mapping table so that we can remove the legacy code from the core + $meta = $itemStack->getMeta(); + } } return new RecipeIngredient($id, $meta, $itemStack->getCount()); } From 860fa719b258cee679f59e025b161a92be0850b9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 21:50:43 +0100 Subject: [PATCH 0131/1858] ItemTranslator: Accept dynamic BlockStateDictionary instead of using singleton this will be needed for handling protocol updates in the future --- src/network/mcpe/convert/ItemTranslator.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 09cbac1065..c161e25830 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -41,11 +41,17 @@ final class ItemTranslator{ use SingletonTrait; private static function make() : self{ - return new self(GlobalItemTypeDictionary::getInstance()->getDictionary(), new ItemSerializer(), new ItemDeserializer()); + return new self( + GlobalItemTypeDictionary::getInstance()->getDictionary(), + RuntimeBlockMapping::getInstance()->getBlockStateDictionary(), + new ItemSerializer(), + new ItemDeserializer() + ); } public function __construct( - private ItemTypeDictionary $dictionary, + private ItemTypeDictionary $itemTypeDictionary, + private BlockStateDictionary $blockStateDictionary, private ItemSerializer $itemSerializer, private ItemDeserializer $itemDeserializer ){} @@ -73,11 +79,11 @@ final class ItemTranslator{ $itemData = $this->itemSerializer->serialize($item); - $numericId = $this->dictionary->fromStringId($itemData->getName()); + $numericId = $this->itemTypeDictionary->fromStringId($itemData->getName()); $blockStateData = $itemData->getBlock(); if($blockStateData !== null){ - $blockRuntimeId = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->lookupStateIdFromData($blockStateData); + $blockRuntimeId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); if($blockRuntimeId === null){ throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); } @@ -92,10 +98,10 @@ final class ItemTranslator{ * @throws TypeConversionException */ public function fromNetworkId(int $networkId, int $networkMeta, int $networkBlockRuntimeId) : Item{ - $stringId = $this->dictionary->fromIntId($networkId); + $stringId = $this->itemTypeDictionary->fromIntId($networkId); $blockStateData = $networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID ? - RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getDataFromStateId($networkBlockRuntimeId) : + $this->blockStateDictionary->getDataFromStateId($networkBlockRuntimeId) : null; return $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); From 57132204ec5340b52213ae088bb5f05ae82feb79 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 22:09:32 +0100 Subject: [PATCH 0132/1858] ItemTranslator: throw only the expected exception types --- src/network/mcpe/convert/ItemTranslator.php | 24 ++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index c161e25830..669339e30b 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; +use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\item\Item; @@ -98,12 +99,25 @@ final class ItemTranslator{ * @throws TypeConversionException */ public function fromNetworkId(int $networkId, int $networkMeta, int $networkBlockRuntimeId) : Item{ - $stringId = $this->itemTypeDictionary->fromIntId($networkId); + try{ + $stringId = $this->itemTypeDictionary->fromIntId($networkId); + }catch(\InvalidArgumentException $e){ + //TODO: a quiet version of fromIntId() would be better than catching InvalidArgumentException + throw TypeConversionException::wrap($e, "Invalid network itemstack ID $networkId"); + } - $blockStateData = $networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID ? - $this->blockStateDictionary->getDataFromStateId($networkBlockRuntimeId) : - null; + $blockStateData = null; + if($networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID){ + $blockStateData = $this->blockStateDictionary->getDataFromStateId($networkBlockRuntimeId); + if($blockStateData === null){ + throw new TypeConversionException("Blockstate runtimeID $networkBlockRuntimeId does not correspond to any known blockstate"); + } + } - return $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); + try{ + return $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); + }catch(ItemTypeDeserializeException $e){ + throw TypeConversionException::wrap($e, "Invalid network itemstack data"); + } } } From c29e23b2f15480661fd7b26b4a520e95484642d4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Jun 2022 22:13:26 +0100 Subject: [PATCH 0133/1858] TypeConverter: port 5fd685e07d61ef670584ed11a52fd5f4b99a81a7 to modern-world-support --- src/network/mcpe/convert/TypeConverter.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 55c4deb1fa..cef12f9196 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -233,6 +233,9 @@ class TypeConverter{ $compound = null; } if($meta !== null){ + if($id !== null && ($id < -0x8000 || $id >= 0x7fff)){ + throw new TypeConversionException("Item ID must be in range " . -0x8000 . " ... " . 0x7fff . " (received $id)"); + } if($meta < 0 || $meta >= 0x7fff){ //this meta value may have been restored from the NBT throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7fff . " (received $meta)"); } From fe4ff3325b91121531eded2a8d4c7a066db50bb5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Jun 2022 19:05:49 +0100 Subject: [PATCH 0134/1858] Add tool to dump JSON specification for block palettes this makes for easier reading to determine available properties. --- tools/generate-block-palette-spec.php | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 tools/generate-block-palette-spec.php diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php new file mode 100644 index 0000000000..f8365f86a1 --- /dev/null +++ b/tools/generate-block-palette-spec.php @@ -0,0 +1,70 @@ +getStates() as $state){ + $name = $state->getName(); + foreach($state->getStates() as $propertyName => $value){ + if($value instanceof IntTag || $value instanceof StringTag){ + $rawValue = $value->getValue(); + }elseif($value instanceof ByteTag){ + $rawValue = match($value->getValue()){ + 0 => false, + 1 => true, + default => throw new AssumptionFailedError("Unexpected ByteTag value for $name -> $propertyName ($value)") + }; + }else{ + throw new AssumptionFailedError("Unexpected tag type for $name -> $propertyName ($value)"); + } + $reportMap[$name][$propertyName][get_class($value) . ":" . $value->getValue()] = $rawValue; + } +} + +foreach($reportMap as $blockName => $propertyList){ + foreach($propertyList as $propertyName => $propertyValues){ + ksort($reportMap[$blockName][$propertyName]); + $reportMap[$blockName][$propertyName] = array_values($propertyValues); + } +} +ksort($reportMap, SORT_STRING); + +file_put_contents($argv[2], json_encode($reportMap, JSON_PRETTY_PRINT)); + + From 3ce1be2a23c27b79f1c7825ce4fab0ab52dbccaf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Jun 2022 19:39:06 +0100 Subject: [PATCH 0135/1858] Added script to generate incremental item upgrade schemas --- tools/generate-item-upgrade-schema.php | 100 +++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tools/generate-item-upgrade-schema.php diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php new file mode 100644 index 0000000000..5e8c9f008e --- /dev/null +++ b/tools/generate-item-upgrade-schema.php @@ -0,0 +1,100 @@ +error("Required arguments: path to mapping table, path to current schemas, path to output file"); + exit(1); +} + +[, $mappingTableFile, $upgradeSchemasDir, $outputFile] = $argv; + +$target = json_decode(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($mappingTableFile)), true, JSON_THROW_ON_ERROR); +if(!is_array($target)){ + \GlobalLogger::get()->error("Invalid mapping table file"); + exit(1); +} + +$files = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => scandir($upgradeSchemasDir, SCANDIR_SORT_ASCENDING)); + +$merged = []; +foreach($files as $file){ + if($file === "." || $file === ".."){ + continue; + } + \GlobalLogger::get()->info("Processing schema file $file"); + $data = json_decode(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join($upgradeSchemasDir, $file))), associative: true, flags: JSON_THROW_ON_ERROR); + if(!is_array($data)){ + \GlobalLogger::get()->error("Invalid schema file $file"); + exit(1); + } + foreach(($data["renamedIds"] ?? []) as $oldId => $newId){ + if(isset($merged["simple"][$oldId])){ + \GlobalLogger::get()->warning("Duplicate rename for $oldId in file $file (was " . $merged["simple"][$oldId] . ", now $newId)"); + } + $merged["simple"][$oldId] = $newId; + } + + foreach(($data["remappedMetas"] ?? []) as $oldId => $mappings){ + foreach($mappings as $meta => $newId){ + if(isset($merged["complex"][$oldId][$meta])){ + \GlobalLogger::get()->warning("Duplicate meta remap for $oldId meta $meta in file $file (was " . $merged["complex"][$oldId][$meta] . ", now $newId)"); + } + $merged["complex"][$oldId][$meta] = $newId; + } + } +} + +$newDiff = []; + +foreach($target["simple"] as $oldId => $newId){ + if(($merged["simple"][$oldId] ?? null) !== $newId){ + $newDiff["renamedIds"][$oldId] = $newId; + } +} +if(isset($newDiff["renamedIds"])){ + ksort($newDiff["renamedIds"], SORT_STRING); +} + +foreach($target["complex"] as $oldId => $mappings){ + foreach($mappings as $meta => $newId){ + if(($merged["complex"][$oldId][$meta] ?? null) !== $newId){ + if($oldId === "minecraft:spawn_egg" && $meta === 130 && ($newId === "minecraft:axolotl_bucket" || $newId === "minecraft:axolotl_spawn_egg")){ + //TODO: hack for vanilla bug workaround + continue; + } + $newDiff["remappedMetas"][$oldId][$meta] = $newId; + } + } + if(isset($newDiff["remappedMetas"][$oldId])){ + ksort($newDiff["remappedMetas"][$oldId], SORT_STRING); + } +} +if(isset($newDiff["remappedMetas"])){ + ksort($newDiff["remappedMetas"], SORT_STRING); +} +ksort($newDiff, SORT_STRING); + +\GlobalLogger::get()->info("Writing output file to $outputFile"); +file_put_contents($outputFile, json_encode($newDiff, JSON_PRETTY_PRINT | JSON_FORCE_OBJECT)); From 3a9e4bc357a27993dec66ef28d26a61926b1614b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Jun 2022 19:40:00 +0100 Subject: [PATCH 0136/1858] Fix CS --- tools/generate-block-palette-spec.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index f8365f86a1..9f5510a02d 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -28,6 +28,15 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; +use function array_values; +use function count; +use function dirname; +use function file_get_contents; +use function file_put_contents; +use function fwrite; +use function get_class; +use function json_encode; +use function ksort; require dirname(__DIR__) . '/vendor/autoload.php'; @@ -66,5 +75,3 @@ foreach($reportMap as $blockName => $propertyList){ ksort($reportMap, SORT_STRING); file_put_contents($argv[2], json_encode($reportMap, JSON_PRETTY_PRINT)); - - From 1f8009954c50b000e264ab379ff613541bd3d414 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Jun 2022 19:52:16 +0100 Subject: [PATCH 0137/1858] Fix PHPStan errors --- tools/generate-block-palette-spec.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index 9f5510a02d..a7b290ffcb 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -23,11 +23,14 @@ declare(strict_types=1); namespace pocketmine\tools\generate_block_palette_spec; +use pocketmine\errorhandler\ErrorToExceptionHandler; +use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Utils; use function array_values; use function count; use function dirname; @@ -44,7 +47,15 @@ if(count($argv) !== 3){ fwrite(STDERR, "Required arguments: input palette file path, output JSON file path\n"); exit(1); } -$palette = BlockStateDictionary::loadFromString(file_get_contents($argv[1])); + +[, $inputFile, $outputFile] = $argv; + +try{ + $palette = BlockStateDictionary::loadFromString(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))); +}catch(NbtException){ + fwrite(STDERR, "Invalid block palette file $argv[1]\n"); + exit(1); +} $reportMap = []; @@ -66,12 +77,12 @@ foreach($palette->getStates() as $state){ } } -foreach($reportMap as $blockName => $propertyList){ - foreach($propertyList as $propertyName => $propertyValues){ +foreach(Utils::stringifyKeys($reportMap) as $blockName => $propertyList){ + foreach(Utils::stringifyKeys($propertyList) as $propertyName => $propertyValues){ ksort($reportMap[$blockName][$propertyName]); $reportMap[$blockName][$propertyName] = array_values($propertyValues); } } ksort($reportMap, SORT_STRING); -file_put_contents($argv[2], json_encode($reportMap, JSON_PRETTY_PRINT)); +file_put_contents($outputFile, json_encode($reportMap, JSON_PRETTY_PRINT)); From cf7d42b3ea40ff2e6fc74a9940b8544fdc054fa2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Jun 2022 20:02:24 +0100 Subject: [PATCH 0138/1858] Fix CS according to new rules --- src/VersionInfo.php | 2 +- src/block/BlockTypeIds.php | 2 +- src/data/bedrock/BlockItemIdMap.php | 2 +- .../bedrock/blockstate/BlockStateData.php | 2 +- .../BlockStateDeserializeException.php | 2 +- .../blockstate/BlockStateDeserializer.php | 2 +- .../bedrock/blockstate/BlockStateNames.php | 2 +- .../BlockStateSerializeException.php | 2 +- .../blockstate/BlockStateSerializer.php | 2 +- .../blockstate/BlockStateStringValues.php | 2 +- .../bedrock/blockstate/BlockTypeNames.php | 2 +- .../CachingBlockStateDeserializer.php | 2 +- .../CachingBlockStateSerializer.php | 2 +- .../UpgradingBlockStateDeserializer.php | 2 +- .../BlockObjectToBlockStateSerializer.php | 2 +- .../convert/BlockStateDeserializerHelper.php | 2 +- .../blockstate/convert/BlockStateReader.php | 2 +- .../convert/BlockStateSerializerHelper.php | 2 +- .../BlockStateToBlockObjectDeserializer.php | 2 +- .../blockstate/convert/BlockStateWriter.php | 2 +- .../upgrade/BlockStateUpgradeSchema.php | 2 +- .../BlockStateUpgradeSchemaBlockRemap.php | 2 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 2 +- .../BlockStateUpgradeSchemaValueRemap.php | 2 +- .../blockstate/upgrade/BlockStateUpgrader.php | 2 +- .../upgrade/LegacyBlockStateMapper.php | 2 +- .../model/BlockStateUpgradeSchemaModel.php | 2 +- ...BlockStateUpgradeSchemaModelBlockRemap.php | 2 +- .../model/BlockStateUpgradeSchemaModelTag.php | 2 +- ...BlockStateUpgradeSchemaModelValueRemap.php | 2 +- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 2 +- .../item/ItemTypeDeserializeException.php | 2 +- src/data/bedrock/item/ItemTypeIds.php | 2 +- .../item/ItemTypeSerializeException.php | 2 +- src/data/bedrock/item/SavedItemData.php | 2 +- src/item/CoralFan.php | 2 +- src/item/ItemIdentifierFlattened.php | 2 +- .../mcpe/convert/BlockStateDictionary.php | 2 +- .../mcpe/convert/BlockStateLookupCache.php | 2 +- .../format/io/GlobalBlockStateHandlers.php | 2 +- .../BlockSerializerDeserializerTest.php | 19 +++++++++++++++++++ .../upgrade/BlockStateUpgraderTest.php | 2 +- .../item/ItemSerializerDeserializerTest.php | 2 +- tools/generate-block-palette-spec.php | 2 +- tools/generate-blockstate-upgrade-schema.php | 2 +- tools/generate-item-upgrade-schema.php | 19 +++++++++++++++++++ 47 files changed, 83 insertions(+), 45 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2ebffeca0a..6c2f8f660f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index a4dc79718b..ba211f59ed 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/BlockItemIdMap.php b/src/data/bedrock/BlockItemIdMap.php index a345a0a320..4109ec43d8 100644 --- a/src/data/bedrock/BlockItemIdMap.php +++ b/src/data/bedrock/BlockItemIdMap.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateData.php b/src/data/bedrock/blockstate/BlockStateData.php index 355c87cd4c..0315a7f419 100644 --- a/src/data/bedrock/blockstate/BlockStateData.php +++ b/src/data/bedrock/blockstate/BlockStateData.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateDeserializeException.php b/src/data/bedrock/blockstate/BlockStateDeserializeException.php index 03c3b76502..2f0701b92d 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializeException.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializeException.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/blockstate/BlockStateDeserializer.php index 180480bb16..a9af9c0789 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/BlockStateDeserializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateNames.php b/src/data/bedrock/blockstate/BlockStateNames.php index 93d827005c..2d4645ac02 100644 --- a/src/data/bedrock/blockstate/BlockStateNames.php +++ b/src/data/bedrock/blockstate/BlockStateNames.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateSerializeException.php b/src/data/bedrock/blockstate/BlockStateSerializeException.php index 96eb1d5396..818b3cf6e3 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializeException.php +++ b/src/data/bedrock/blockstate/BlockStateSerializeException.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/blockstate/BlockStateSerializer.php index faa5b12a1c..8f979c0691 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/blockstate/BlockStateSerializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockStateStringValues.php b/src/data/bedrock/blockstate/BlockStateStringValues.php index 689f22be43..334f315d0d 100644 --- a/src/data/bedrock/blockstate/BlockStateStringValues.php +++ b/src/data/bedrock/blockstate/BlockStateStringValues.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/blockstate/BlockTypeNames.php index 93b6370898..6bd912fbd7 100644 --- a/src/data/bedrock/blockstate/BlockTypeNames.php +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php b/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php index c0205eaebe..977b093208 100644 --- a/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/CachingBlockStateSerializer.php b/src/data/bedrock/blockstate/CachingBlockStateSerializer.php index eb4cc13de8..b310c7bb25 100644 --- a/src/data/bedrock/blockstate/CachingBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/CachingBlockStateSerializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php b/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php index cd1c114df1..50dd21d73c 100644 --- a/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php +++ b/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php index 322c812210..42de62dcaf 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php index 7b7fcb9a58..4503edffb8 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockStateReader.php b/src/data/bedrock/blockstate/convert/BlockStateReader.php index c85fc9e574..a93c1c1bd8 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateReader.php +++ b/src/data/bedrock/blockstate/convert/BlockStateReader.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php index 91e4cba86b..4fe10ee90a 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index 753cee806f..d81b7d2d62 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/convert/BlockStateWriter.php b/src/data/bedrock/blockstate/convert/BlockStateWriter.php index d05c5f6c45..527a7040e7 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateWriter.php +++ b/src/data/bedrock/blockstate/convert/BlockStateWriter.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index 75e50a52e0..59c342ca2b 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php index b307137712..90415bbdab 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index ae5753c767..09c215e0ed 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php index 38f3b1f3f4..832cff212b 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index f732401c40..85dd3cecf1 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php index 843c0932eb..8e5d7849f5 100644 --- a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php index 824ca7a7a4..d5338ba19b 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index 5404c0bdcd..6f5ea8d01c 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php index 2e0d24cacf..95a9aae9b5 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php index 84d07dd46c..e163655d43 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 5c91743b31..8e09cbd2ec 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 0870ece624..4b6b701ffe 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/ItemTypeDeserializeException.php b/src/data/bedrock/item/ItemTypeDeserializeException.php index bbcb3f37a2..21ee91f136 100644 --- a/src/data/bedrock/item/ItemTypeDeserializeException.php +++ b/src/data/bedrock/item/ItemTypeDeserializeException.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/ItemTypeIds.php b/src/data/bedrock/item/ItemTypeIds.php index f51504136f..8658507e1a 100644 --- a/src/data/bedrock/item/ItemTypeIds.php +++ b/src/data/bedrock/item/ItemTypeIds.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/ItemTypeSerializeException.php b/src/data/bedrock/item/ItemTypeSerializeException.php index f2d12c46f4..152ba0e824 100644 --- a/src/data/bedrock/item/ItemTypeSerializeException.php +++ b/src/data/bedrock/item/ItemTypeSerializeException.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/data/bedrock/item/SavedItemData.php b/src/data/bedrock/item/SavedItemData.php index 7ca1955f88..22ae550a09 100644 --- a/src/data/bedrock/item/SavedItemData.php +++ b/src/data/bedrock/item/SavedItemData.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index e276a0e411..c9937cf0d5 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php index 974ff38b8a..d09a7d76d0 100644 --- a/src/item/ItemIdentifierFlattened.php +++ b/src/item/ItemIdentifierFlattened.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 421d2cfff5..bfb18e9331 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index 60ac12fc94..37d58fad69 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 096f116f52..bbf4d7bfd8 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php index 98a9e0b512..2fafb8d942 100644 --- a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php @@ -1,5 +1,24 @@ Date: Tue, 7 Jun 2022 20:14:00 +0100 Subject: [PATCH 0139/1858] Branch-specific 1.19.0 stuff --- composer.lock | 8 ++--- .../bedrock/blockstate/BlockStateNames.php | 2 ++ .../bedrock/blockstate/BlockTypeNames.php | 35 ++++++++++++++----- .../convert/BlockStateSerializerHelper.php | 8 ++--- .../BlockStateToBlockObjectDeserializer.php | 16 ++++----- src/world/format/io/data/BedrockWorldData.php | 7 +--- 6 files changed, 45 insertions(+), 31 deletions(-) diff --git a/composer.lock b/composer.lock index b419066c8e..16160f851a 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "826fb285c7e8e6fd8e0f0184b9ce37813d5102f4" + "reference": "68a411921c52260248f18716a129f85126b871fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/826fb285c7e8e6fd8e0f0184b9ce37813d5102f4", - "reference": "826fb285c7e8e6fd8e0f0184b9ce37813d5102f4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/68a411921c52260248f18716a129f85126b871fb", + "reference": "68a411921c52260248f18716a129f85126b871fb", "shasum": "" }, "default-branch": true, @@ -272,7 +272,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-05-13T19:44:35+00:00" + "time": "2022-06-07T17:46:29+00:00" }, { "name": "pocketmine/bedrock-data", diff --git a/src/data/bedrock/blockstate/BlockStateNames.php b/src/data/bedrock/blockstate/BlockStateNames.php index 2d4645ac02..e902df92db 100644 --- a/src/data/bedrock/blockstate/BlockStateNames.php +++ b/src/data/bedrock/blockstate/BlockStateNames.php @@ -42,6 +42,7 @@ final class BlockStateNames{ public const BREWING_STAND_SLOT_B_BIT = "brewing_stand_slot_b_bit"; public const BREWING_STAND_SLOT_C_BIT = "brewing_stand_slot_c_bit"; public const BUTTON_PRESSED_BIT = "button_pressed_bit"; + public const CAN_SUMMON = "can_summon"; public const CANDLES = "candles"; public const CAULDRON_LIQUID = "cauldron_liquid"; public const CHEMISTRY_TABLE_TYPE = "chemistry_table_type"; @@ -105,6 +106,7 @@ final class BlockStateNames{ public const PORTAL_AXIS = "portal_axis"; public const POWERED_BIT = "powered_bit"; public const PRISMARINE_BLOCK_TYPE = "prismarine_block_type"; + public const PROPAGULE_STAGE = "propagule_stage"; public const RAIL_DATA_BIT = "rail_data_bit"; public const RAIL_DIRECTION = "rail_direction"; public const REDSTONE_SIGNAL = "redstone_signal"; diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/blockstate/BlockTypeNames.php index 6bd912fbd7..dcfb2e71f3 100644 --- a/src/data/bedrock/blockstate/BlockTypeNames.php +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -220,10 +220,10 @@ final class BlockTypeNames{ public const DISPENSER = "minecraft:dispenser"; public const DOUBLE_CUT_COPPER_SLAB = "minecraft:double_cut_copper_slab"; public const DOUBLE_PLANT = "minecraft:double_plant"; - public const DOUBLE_STONE_SLAB = "minecraft:double_stone_slab"; - public const DOUBLE_STONE_SLAB2 = "minecraft:double_stone_slab2"; - public const DOUBLE_STONE_SLAB3 = "minecraft:double_stone_slab3"; - public const DOUBLE_STONE_SLAB4 = "minecraft:double_stone_slab4"; + public const DOUBLE_STONE_BLOCK_SLAB = "minecraft:double_stone_block_slab"; + public const DOUBLE_STONE_BLOCK_SLAB2 = "minecraft:double_stone_block_slab2"; + public const DOUBLE_STONE_BLOCK_SLAB3 = "minecraft:double_stone_block_slab3"; + public const DOUBLE_STONE_BLOCK_SLAB4 = "minecraft:double_stone_block_slab4"; public const DOUBLE_WOODEN_SLAB = "minecraft:double_wooden_slab"; public const DRAGON_EGG = "minecraft:dragon_egg"; public const DRIED_KELP_BLOCK = "minecraft:dried_kelp_block"; @@ -467,9 +467,23 @@ final class BlockTypeNames{ public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; public const MAGMA = "minecraft:magma"; + public const MANGROVE_BUTTON = "minecraft:mangrove_button"; + public const MANGROVE_DOOR = "minecraft:mangrove_door"; + public const MANGROVE_DOUBLE_SLAB = "minecraft:mangrove_double_slab"; + public const MANGROVE_FENCE = "minecraft:mangrove_fence"; + public const MANGROVE_FENCE_GATE = "minecraft:mangrove_fence_gate"; public const MANGROVE_LEAVES = "minecraft:mangrove_leaves"; + public const MANGROVE_LOG = "minecraft:mangrove_log"; + public const MANGROVE_PLANKS = "minecraft:mangrove_planks"; + public const MANGROVE_PRESSURE_PLATE = "minecraft:mangrove_pressure_plate"; public const MANGROVE_PROPAGULE = "minecraft:mangrove_propagule"; - public const MANGROVE_PROPAGULE_HANGING = "minecraft:mangrove_propagule_hanging"; + public const MANGROVE_ROOTS = "minecraft:mangrove_roots"; + public const MANGROVE_SLAB = "minecraft:mangrove_slab"; + public const MANGROVE_STAIRS = "minecraft:mangrove_stairs"; + public const MANGROVE_STANDING_SIGN = "minecraft:mangrove_standing_sign"; + public const MANGROVE_TRAPDOOR = "minecraft:mangrove_trapdoor"; + public const MANGROVE_WALL_SIGN = "minecraft:mangrove_wall_sign"; + public const MANGROVE_WOOD = "minecraft:mangrove_wood"; public const MEDIUM_AMETHYST_BUD = "minecraft:medium_amethyst_bud"; public const MELON_BLOCK = "minecraft:melon_block"; public const MELON_STEM = "minecraft:melon_stem"; @@ -487,6 +501,7 @@ final class BlockTypeNames{ public const MUD_BRICK_STAIRS = "minecraft:mud_brick_stairs"; public const MUD_BRICK_WALL = "minecraft:mud_brick_wall"; public const MUD_BRICKS = "minecraft:mud_bricks"; + public const MUDDY_MANGROVE_ROOTS = "minecraft:muddy_mangrove_roots"; public const MYCELIUM = "minecraft:mycelium"; public const NETHER_BRICK = "minecraft:nether_brick"; public const NETHER_BRICK_FENCE = "minecraft:nether_brick_fence"; @@ -640,13 +655,13 @@ final class BlockTypeNames{ public const STICKY_PISTON = "minecraft:sticky_piston"; public const STICKY_PISTON_ARM_COLLISION = "minecraft:sticky_piston_arm_collision"; public const STONE = "minecraft:stone"; + public const STONE_BLOCK_SLAB = "minecraft:stone_block_slab"; + public const STONE_BLOCK_SLAB2 = "minecraft:stone_block_slab2"; + public const STONE_BLOCK_SLAB3 = "minecraft:stone_block_slab3"; + public const STONE_BLOCK_SLAB4 = "minecraft:stone_block_slab4"; public const STONE_BRICK_STAIRS = "minecraft:stone_brick_stairs"; public const STONE_BUTTON = "minecraft:stone_button"; public const STONE_PRESSURE_PLATE = "minecraft:stone_pressure_plate"; - public const STONE_SLAB = "minecraft:stone_slab"; - public const STONE_SLAB2 = "minecraft:stone_slab2"; - public const STONE_SLAB3 = "minecraft:stone_slab3"; - public const STONE_SLAB4 = "minecraft:stone_slab4"; public const STONE_STAIRS = "minecraft:stone_stairs"; public const STONEBRICK = "minecraft:stonebrick"; public const STONECUTTER = "minecraft:stonecutter"; @@ -657,6 +672,8 @@ final class BlockTypeNames{ public const STRIPPED_CRIMSON_STEM = "minecraft:stripped_crimson_stem"; public const STRIPPED_DARK_OAK_LOG = "minecraft:stripped_dark_oak_log"; public const STRIPPED_JUNGLE_LOG = "minecraft:stripped_jungle_log"; + public const STRIPPED_MANGROVE_LOG = "minecraft:stripped_mangrove_log"; + public const STRIPPED_MANGROVE_WOOD = "minecraft:stripped_mangrove_wood"; public const STRIPPED_OAK_LOG = "minecraft:stripped_oak_log"; public const STRIPPED_SPRUCE_LOG = "minecraft:stripped_spruce_log"; public const STRIPPED_WARPED_HYPHAE = "minecraft:stripped_warped_hyphae"; diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php index 4fe10ee90a..9fc53c20e2 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php @@ -222,19 +222,19 @@ final class BlockStateSerializerHelper{ } public static function encodeStoneSlab1(Slab $block, string $typeValue) : BlockStateWriter{ - return self::encodeStoneSlab($block, Ids::STONE_SLAB, Ids::DOUBLE_STONE_SLAB, BlockStateNames::STONE_SLAB_TYPE, $typeValue); + return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB, Ids::DOUBLE_STONE_BLOCK_SLAB, BlockStateNames::STONE_SLAB_TYPE, $typeValue); } public static function encodeStoneSlab2(Slab $block, string $typeValue) : BlockStateWriter{ - return self::encodeStoneSlab($block, Ids::STONE_SLAB2, Ids::DOUBLE_STONE_SLAB2, BlockStateNames::STONE_SLAB_TYPE_2, $typeValue); + return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, BlockStateNames::STONE_SLAB_TYPE_2, $typeValue); } public static function encodeStoneSlab3(Slab $block, string $typeValue) : BlockStateWriter{ - return self::encodeStoneSlab($block, Ids::STONE_SLAB3, Ids::DOUBLE_STONE_SLAB3, BlockStateNames::STONE_SLAB_TYPE_3, $typeValue); + return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, BlockStateNames::STONE_SLAB_TYPE_3, $typeValue); } public static function encodeStoneSlab4(Slab $block, string $typeValue) : BlockStateWriter{ - return self::encodeStoneSlab($block, Ids::STONE_SLAB4, Ids::DOUBLE_STONE_SLAB4, BlockStateNames::STONE_SLAB_TYPE_4, $typeValue); + return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, BlockStateNames::STONE_SLAB_TYPE_4, $typeValue); } public static function encodeTrapdoor(Trapdoor $block, BlockStateWriter $out) : BlockStateWriter{ diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php index d81b7d2d62..95f755e81b 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php @@ -298,19 +298,19 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); - $this->map(Ids::DOUBLE_STONE_SLAB, function(Reader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, function(Reader $in) : Block{ $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB2, function(Reader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB2, function(Reader $in) : Block{ $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB3, function(Reader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB3, function(Reader $in) : Block{ $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); }); - $this->map(Ids::DOUBLE_STONE_SLAB4, function(Reader $in) : Block{ + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB4, function(Reader $in) : Block{ $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); }); @@ -939,10 +939,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::STONE_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::STONE_BRICK_STAIRS(), $in)); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); - $this->map(Ids::STONE_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_BLOCK_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); + $this->map(Ids::STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); $this->map(Ids::STONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::COBBLESTONE_STAIRS(), $in)); $this->map(Ids::STONEBRICK, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::STONE_BRICK_TYPE)){ diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index dbe05f4e4b..5378be7f20 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -48,12 +48,7 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 9; - /** - * WARNING: In the future, this should be only as high as the newest world format currently supported. We don't - * actually support worlds from 1.18.10 yet, but due to an old stupid bug, all worlds created by PM will report this - * version. - */ - public const CURRENT_STORAGE_NETWORK_VERSION = 503; // 1.18.10 + public const CURRENT_STORAGE_NETWORK_VERSION = 527; // 1.19.0 public const GENERATOR_LIMITED = 0; public const GENERATOR_INFINITE = 1; From 0a22e4606d4501558606c4d6fc711b903ea601bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 13:51:15 +0100 Subject: [PATCH 0140/1858] Wow, I'm really getting sloppy... --- tools/generate-item-upgrade-schema.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php index 261ca5454b..aff4470207 100644 --- a/tools/generate-item-upgrade-schema.php +++ b/tools/generate-item-upgrade-schema.php @@ -40,7 +40,7 @@ use function json_encode; use function ksort; use function scandir; -require __DIR__ . '/vendor/autoload.php'; +require dirname(__DIR__) . '/vendor/autoload.php'; if(count($argv) !== 4){ \GlobalLogger::get()->error("Required arguments: path to mapping table, path to current schemas, path to output file"); From e78f20391e4ae08c2bccb49ab9a488ebb3418072 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 14:21:57 +0100 Subject: [PATCH 0141/1858] seriously? ... --- tools/generate-item-upgrade-schema.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php index aff4470207..59fab8026c 100644 --- a/tools/generate-item-upgrade-schema.php +++ b/tools/generate-item-upgrade-schema.php @@ -32,6 +32,7 @@ namespace pocketmine\tools\generate_item_upgrade_schema; use pocketmine\errorhandler\ErrorToExceptionHandler; use Webmozart\PathUtil\Path; use function count; +use function dirname; use function file_get_contents; use function file_put_contents; use function is_array; From 831738b29cfebe57d0251de1e9f7004b92834d84 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 14:53:58 +0100 Subject: [PATCH 0142/1858] Added BedrockItemUpgradeSchema dependency --- composer.json | 1 + composer.lock | 32 +++++++++++++++++-- src/CoreConstants.php | 1 + .../bedrock/LegacyItemIdToStringIdMap.php | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index e19f5f1cd1..bbe11059af 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-block-upgrade-schema": "dev-master@dev", "pocketmine/bedrock-data": "dev-modern-world-support@dev", + "pocketmine/bedrock-item-upgrade-schema": "dev-master", "pocketmine/bedrock-protocol": "~10.0.0+bedrock-1.19.0", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index 16160f851a..88dde6bd00 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1d35edfe78183512ce45be7a8a4940e7", + "content-hash": "4e3266e01983490663a0cdac7609bde0", "packages": [ { "name": "adhocore/json-comment", @@ -300,6 +300,33 @@ }, "time": "2022-06-07T16:24:29+00:00" }, + { + "name": "pocketmine/bedrock-item-upgrade-schema", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", + "reference": "d984d2ee7283bc52e8733e7c7da1d0f6b6dc501f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/d984d2ee7283bc52e8733e7c7da1d0f6b6dc501f", + "reference": "d984d2ee7283bc52e8733e7c7da1d0f6b6dc501f", + "shasum": "" + }, + "default-branch": true, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC0-1.0" + ], + "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", + "support": { + "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/master" + }, + "time": "2022-06-08T13:47:48+00:00" + }, { "name": "pocketmine/bedrock-protocol", "version": "10.0.0+bedrock-1.19.0", @@ -3361,7 +3388,8 @@ "minimum-stability": "stable", "stability-flags": { "pocketmine/bedrock-block-upgrade-schema": 20, - "pocketmine/bedrock-data": 20 + "pocketmine/bedrock-data": 20, + "pocketmine/bedrock-item-upgrade-schema": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/src/CoreConstants.php b/src/CoreConstants.php index 384f5d0a7a..c184862377 100644 --- a/src/CoreConstants.php +++ b/src/CoreConstants.php @@ -38,4 +38,5 @@ define('pocketmine\RESOURCE_PATH', dirname(__DIR__) . '/resources/'); define('pocketmine\BEDROCK_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-data/'); define('pocketmine\LOCALE_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/locale-data/'); define('pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-block-upgrade-schema/'); +define('pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-item-upgrade-schema/'); define('pocketmine\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__) . '/vendor/autoload.php'); diff --git a/src/data/bedrock/LegacyItemIdToStringIdMap.php b/src/data/bedrock/LegacyItemIdToStringIdMap.php index 85b6ff1bfc..587a09fe06 100644 --- a/src/data/bedrock/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/LegacyItemIdToStringIdMap.php @@ -30,6 +30,6 @@ final class LegacyItemIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ use SingletonTrait; public function __construct(){ - parent::__construct(Path::join(\pocketmine\BEDROCK_DATA_PATH, 'item_id_map.json')); + parent::__construct(Path::join(\pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'item_legacy_id_map.json')); } } From 1da6202e6e035cf52991040490050c7d9fdd1b8c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 15:28:29 +0100 Subject: [PATCH 0143/1858] Update composer dependencies --- composer.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/composer.lock b/composer.lock index 88dde6bd00..69e7bcf69f 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "68a411921c52260248f18716a129f85126b871fb" + "reference": "c7aa3e04ae36dbb9a97905a2595f4453d914aa5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/68a411921c52260248f18716a129f85126b871fb", - "reference": "68a411921c52260248f18716a129f85126b871fb", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/c7aa3e04ae36dbb9a97905a2595f4453d914aa5c", + "reference": "c7aa3e04ae36dbb9a97905a2595f4453d914aa5c", "shasum": "" }, "default-branch": true, @@ -272,7 +272,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-06-07T17:46:29+00:00" + "time": "2022-06-08T13:20:45+00:00" }, { "name": "pocketmine/bedrock-data", @@ -280,12 +280,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "3c65a3197d8a46c424358ac983b6fc287874e649" + "reference": "6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/3c65a3197d8a46c424358ac983b6fc287874e649", - "reference": "3c65a3197d8a46c424358ac983b6fc287874e649", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75", + "reference": "6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75", "shasum": "" }, "type": "library", @@ -298,7 +298,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-06-07T16:24:29+00:00" + "time": "2022-06-08T14:00:34+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -329,16 +329,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "10.0.0+bedrock-1.19.0", + "version": "10.0.1+bedrock-1.19.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "7c17498541bb9a375b945cb131e951674067c00e" + "reference": "331fb0eb45c26daadf8cf01a3b6f20e909d7684b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/7c17498541bb9a375b945cb131e951674067c00e", - "reference": "7c17498541bb9a375b945cb131e951674067c00e", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/331fb0eb45c26daadf8cf01a3b6f20e909d7684b", + "reference": "331fb0eb45c26daadf8cf01a3b6f20e909d7684b", "shasum": "" }, "require": { @@ -370,9 +370,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/10.0.0+bedrock-1.19.0" + "source": "https://github.com/pmmp/BedrockProtocol/tree/10.0.1+bedrock-1.19.0" }, - "time": "2022-06-07T16:31:30+00:00" + "time": "2022-06-08T01:11:15+00:00" }, { "name": "pocketmine/binaryutils", From 680615eed8440b5259d86edbf4dfc9d2b6a78919 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 15:54:45 +0100 Subject: [PATCH 0144/1858] Namespace rename --- src/block/tile/FlowerPot.php | 2 +- .../{blockstate => block}/BlockStateData.php | 2 +- .../BlockStateDeserializeException.php | 2 +- .../BlockStateDeserializer.php | 2 +- .../{blockstate => block}/BlockStateNames.php | 2 +- .../BlockStateSerializeException.php | 2 +- .../BlockStateSerializer.php | 2 +- .../BlockStateStringValues.php | 2 +- .../{blockstate => block}/BlockTypeNames.php | 2 +- .../CachingBlockStateDeserializer.php | 2 +- .../CachingBlockStateSerializer.php | 2 +- .../UpgradingBlockStateDeserializer.php | 4 ++-- .../BlockObjectToBlockStateSerializer.php | 18 +++++++------- .../convert/BlockStateDeserializerHelper.php | 8 +++---- .../convert/BlockStateReader.php | 10 ++++---- .../convert/BlockStateSerializerHelper.php | 8 +++---- .../BlockStateToBlockObjectDeserializer.php | 18 +++++++------- .../convert/BlockStateWriter.php | 10 ++++---- .../upgrade/BlockStateUpgradeSchema.php | 4 ++-- .../BlockStateUpgradeSchemaBlockRemap.php | 2 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 10 ++++---- .../BlockStateUpgradeSchemaValueRemap.php | 2 +- .../upgrade/BlockStateUpgrader.php | 4 ++-- .../upgrade/LegacyBlockStateMapper.php | 4 ++-- .../model/BlockStateUpgradeSchemaModel.php | 2 +- ...BlockStateUpgradeSchemaModelBlockRemap.php | 2 +- .../model/BlockStateUpgradeSchemaModelTag.php | 2 +- ...BlockStateUpgradeSchemaModelValueRemap.php | 2 +- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 2 +- src/data/bedrock/item/SavedItemData.php | 4 ++-- src/entity/object/FallingBlock.php | 2 +- .../mcpe/convert/BlockStateDictionary.php | 2 +- .../mcpe/convert/BlockStateLookupCache.php | 2 +- .../mcpe/convert/RuntimeBlockMapping.php | 8 +++---- src/world/format/io/BaseWorldProvider.php | 4 ++-- .../format/io/GlobalBlockStateHandlers.php | 24 +++++++++---------- src/world/format/io/leveldb/LevelDB.php | 6 ++--- .../BlockSerializerDeserializerTest.php | 6 ++--- .../upgrade/BlockStateUpgraderTest.php | 4 ++-- tools/generate-blockstate-upgrade-schema.php | 10 ++++---- 41 files changed, 104 insertions(+), 104 deletions(-) rename src/data/bedrock/{blockstate => block}/BlockStateData.php (98%) rename src/data/bedrock/{blockstate => block}/BlockStateDeserializeException.php (94%) rename src/data/bedrock/{blockstate => block}/BlockStateDeserializer.php (96%) rename src/data/bedrock/{blockstate => block}/BlockStateNames.php (99%) rename src/data/bedrock/{blockstate => block}/BlockStateSerializeException.php (94%) rename src/data/bedrock/{blockstate => block}/BlockStateSerializer.php (96%) rename src/data/bedrock/{blockstate => block}/BlockStateStringValues.php (99%) rename src/data/bedrock/{blockstate => block}/BlockTypeNames.php (99%) rename src/data/bedrock/{blockstate => block}/CachingBlockStateDeserializer.php (97%) rename src/data/bedrock/{blockstate => block}/CachingBlockStateSerializer.php (96%) rename src/data/bedrock/{blockstate => block}/UpgradingBlockStateDeserializer.php (91%) rename src/data/bedrock/{blockstate => block}/convert/BlockObjectToBlockStateSerializer.php (99%) rename src/data/bedrock/{blockstate => block}/convert/BlockStateDeserializerHelper.php (98%) rename src/data/bedrock/{blockstate => block}/convert/BlockStateReader.php (97%) rename src/data/bedrock/{blockstate => block}/convert/BlockStateSerializerHelper.php (98%) rename src/data/bedrock/{blockstate => block}/convert/BlockStateToBlockObjectDeserializer.php (99%) rename src/data/bedrock/{blockstate => block}/convert/BlockStateWriter.php (96%) rename src/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgradeSchema.php (93%) rename src/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgradeSchemaBlockRemap.php (96%) rename src/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgradeSchemaUtils.php (96%) rename src/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgradeSchemaValueRemap.php (94%) rename src/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgrader.php (98%) rename src/data/bedrock/{blockstate => block}/upgrade/LegacyBlockStateMapper.php (95%) rename src/data/bedrock/{blockstate => block}/upgrade/model/BlockStateUpgradeSchemaModel.php (97%) rename src/data/bedrock/{blockstate => block}/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php (96%) rename src/data/bedrock/{blockstate => block}/upgrade/model/BlockStateUpgradeSchemaModelTag.php (93%) rename src/data/bedrock/{blockstate => block}/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php (94%) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 4a8920ade6..499101bb1b 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -26,7 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\block\Air; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; diff --git a/src/data/bedrock/blockstate/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php similarity index 98% rename from src/data/bedrock/blockstate/BlockStateData.php rename to src/data/bedrock/block/BlockStateData.php index 0315a7f419..a5d0662982 100644 --- a/src/data/bedrock/blockstate/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; diff --git a/src/data/bedrock/blockstate/BlockStateDeserializeException.php b/src/data/bedrock/block/BlockStateDeserializeException.php similarity index 94% rename from src/data/bedrock/blockstate/BlockStateDeserializeException.php rename to src/data/bedrock/block/BlockStateDeserializeException.php index 2f0701b92d..fbe0186ef5 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializeException.php +++ b/src/data/bedrock/block/BlockStateDeserializeException.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class BlockStateDeserializeException extends \RuntimeException{ diff --git a/src/data/bedrock/blockstate/BlockStateDeserializer.php b/src/data/bedrock/block/BlockStateDeserializer.php similarity index 96% rename from src/data/bedrock/blockstate/BlockStateDeserializer.php rename to src/data/bedrock/block/BlockStateDeserializer.php index a9af9c0789..48bc5ce9f2 100644 --- a/src/data/bedrock/blockstate/BlockStateDeserializer.php +++ b/src/data/bedrock/block/BlockStateDeserializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; /** * Implementors of this interface decide how a block should be deserialized and represented at runtime. This is used by diff --git a/src/data/bedrock/blockstate/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php similarity index 99% rename from src/data/bedrock/blockstate/BlockStateNames.php rename to src/data/bedrock/block/BlockStateNames.php index e902df92db..cfd90f1c32 100644 --- a/src/data/bedrock/blockstate/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class BlockStateNames{ diff --git a/src/data/bedrock/blockstate/BlockStateSerializeException.php b/src/data/bedrock/block/BlockStateSerializeException.php similarity index 94% rename from src/data/bedrock/blockstate/BlockStateSerializeException.php rename to src/data/bedrock/block/BlockStateSerializeException.php index 818b3cf6e3..8ae1385acc 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializeException.php +++ b/src/data/bedrock/block/BlockStateSerializeException.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class BlockStateSerializeException extends \LogicException{ diff --git a/src/data/bedrock/blockstate/BlockStateSerializer.php b/src/data/bedrock/block/BlockStateSerializer.php similarity index 96% rename from src/data/bedrock/blockstate/BlockStateSerializer.php rename to src/data/bedrock/block/BlockStateSerializer.php index 8f979c0691..226c117945 100644 --- a/src/data/bedrock/blockstate/BlockStateSerializer.php +++ b/src/data/bedrock/block/BlockStateSerializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; /** * Implementors of this interface decide how blockstate IDs will be represented as NBT. diff --git a/src/data/bedrock/blockstate/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php similarity index 99% rename from src/data/bedrock/blockstate/BlockStateStringValues.php rename to src/data/bedrock/block/BlockStateStringValues.php index 334f315d0d..711bd58fab 100644 --- a/src/data/bedrock/blockstate/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class BlockStateStringValues{ diff --git a/src/data/bedrock/blockstate/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php similarity index 99% rename from src/data/bedrock/blockstate/BlockTypeNames.php rename to src/data/bedrock/block/BlockTypeNames.php index dcfb2e71f3..9eee5d1346 100644 --- a/src/data/bedrock/blockstate/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; /** * This class is generated automatically from the block palette for the current version. Do not edit it manually. diff --git a/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php b/src/data/bedrock/block/CachingBlockStateDeserializer.php similarity index 97% rename from src/data/bedrock/blockstate/CachingBlockStateDeserializer.php rename to src/data/bedrock/block/CachingBlockStateDeserializer.php index 977b093208..84edcff2fe 100644 --- a/src/data/bedrock/blockstate/CachingBlockStateDeserializer.php +++ b/src/data/bedrock/block/CachingBlockStateDeserializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class CachingBlockStateDeserializer implements BlockStateDeserializer{ diff --git a/src/data/bedrock/blockstate/CachingBlockStateSerializer.php b/src/data/bedrock/block/CachingBlockStateSerializer.php similarity index 96% rename from src/data/bedrock/blockstate/CachingBlockStateSerializer.php rename to src/data/bedrock/block/CachingBlockStateSerializer.php index b310c7bb25..18003b086e 100644 --- a/src/data/bedrock/blockstate/CachingBlockStateSerializer.php +++ b/src/data/bedrock/block/CachingBlockStateSerializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; final class CachingBlockStateSerializer implements BlockStateSerializer{ diff --git a/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php b/src/data/bedrock/block/UpgradingBlockStateDeserializer.php similarity index 91% rename from src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php rename to src/data/bedrock/block/UpgradingBlockStateDeserializer.php index 50dd21d73c..273669b461 100644 --- a/src/data/bedrock/blockstate/UpgradingBlockStateDeserializer.php +++ b/src/data/bedrock/block/UpgradingBlockStateDeserializer.php @@ -21,9 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate; +namespace pocketmine\data\bedrock\block; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgrader; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; final class UpgradingBlockStateDeserializer implements BlockStateDeserializer{ diff --git a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php similarity index 99% rename from src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php rename to src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 42de62dcaf..c70b61d59e 100644 --- a/src/data/bedrock/blockstate/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\ActivatorRail; use pocketmine\block\Anvil; @@ -139,14 +139,14 @@ use pocketmine\block\WoodenPressurePlate; use pocketmine\block\WoodenStairs; use pocketmine\block\WoodenTrapdoor; use pocketmine\block\Wool; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; -use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; -use pocketmine\data\bedrock\blockstate\BlockStateSerializer; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; -use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; -use pocketmine\data\bedrock\blockstate\convert\BlockStateSerializerHelper as Helper; -use pocketmine\data\bedrock\blockstate\convert\BlockStateWriter as Writer; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateNames as StateNames; +use pocketmine\data\bedrock\block\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateSerializer; +use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\block\BlockTypeNames as Ids; +use pocketmine\data\bedrock\block\convert\BlockStateSerializerHelper as Helper; +use pocketmine\data\bedrock\block\convert\BlockStateWriter as Writer; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; diff --git a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php similarity index 98% rename from src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php rename to src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 4503edffb8..b5a76394d1 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Block; use pocketmine\block\BlockLegacyMetadata; @@ -47,9 +47,9 @@ use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/data/bedrock/blockstate/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php similarity index 97% rename from src/data/bedrock/blockstate/convert/BlockStateReader.php rename to src/data/bedrock/block/convert/BlockStateReader.php index a93c1c1bd8..3380721f5a 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -21,16 +21,16 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\ByteTag; diff --git a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php similarity index 98% rename from src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php rename to src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 9fc53c20e2..1abe7059a3 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Button; use pocketmine\block\ChemistryTable; @@ -47,9 +47,9 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\Wall; use pocketmine\block\WallSign; use pocketmine\block\Wood; -use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues; -use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; +use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateStringValues; +use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php similarity index 99% rename from src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php rename to src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 95f755e81b..967a71412c 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; @@ -32,14 +32,14 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializer; -use pocketmine\data\bedrock\blockstate\BlockStateNames as StateNames; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; -use pocketmine\data\bedrock\blockstate\BlockTypeNames as Ids; -use pocketmine\data\bedrock\blockstate\convert\BlockStateDeserializerHelper as Helper; -use pocketmine\data\bedrock\blockstate\convert\BlockStateReader as Reader; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializer; +use pocketmine\data\bedrock\block\BlockStateNames as StateNames; +use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\block\BlockTypeNames as Ids; +use pocketmine\data\bedrock\block\convert\BlockStateDeserializerHelper as Helper; +use pocketmine\data\bedrock\block\convert\BlockStateReader as Reader; use pocketmine\math\Axis; use pocketmine\math\Facing; use function array_key_exists; diff --git a/src/data/bedrock/blockstate/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php similarity index 96% rename from src/data/bedrock/blockstate/convert/BlockStateWriter.php rename to src/data/bedrock/block/convert/BlockStateWriter.php index 527a7040e7..294c0c0153 100644 --- a/src/data/bedrock/blockstate/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -21,17 +21,17 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\TreeType; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateNames; -use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; -use pocketmine\data\bedrock\blockstate\BlockStateStringValues as StringValues; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\nbt\tag\CompoundTag; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php similarity index 93% rename from src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php rename to src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php index 59c342ca2b..44c56e6cae 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php @@ -21,9 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaValueRemap as ValueRemap; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap as ValueRemap; use pocketmine\nbt\tag\Tag; use function count; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php similarity index 96% rename from src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php rename to src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php index 90415bbdab..f3ef4ec928 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php similarity index 96% rename from src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php rename to src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 09c215e0ed..525c1c3bf1 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -21,12 +21,12 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModel; -use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; -use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelTag; -use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModel; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelTag; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaValueRemap.php similarity index 94% rename from src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php rename to src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaValueRemap.php index 832cff212b..80e451de9c 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaValueRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaValueRemap.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\nbt\tag\Tag; diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php similarity index 98% rename from src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php rename to src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 85dd3cecf1..89a6d7b855 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -21,9 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; diff --git a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php similarity index 95% rename from src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php rename to src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index 8e5d7849f5..f13bd14260 100644 --- a/src/data/bedrock/blockstate/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -21,9 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php similarity index 97% rename from src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php rename to src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php index d5338ba19b..1a4a14c87c 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade\model; +namespace pocketmine\data\bedrock\block\upgrade\model; use function count; use function is_array; diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php similarity index 96% rename from src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php rename to src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index 6f5ea8d01c..be601d51b3 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade\model; +namespace pocketmine\data\bedrock\block\upgrade\model; final class BlockStateUpgradeSchemaModelBlockRemap{ diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelTag.php similarity index 93% rename from src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php rename to src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelTag.php index 95a9aae9b5..f7eaa9d8ad 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelTag.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelTag.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade\model; +namespace pocketmine\data\bedrock\block\upgrade\model; final class BlockStateUpgradeSchemaModelTag{ public int $byte; diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php similarity index 94% rename from src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php rename to src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php index e163655d43..eeda335097 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelValueRemap.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade\model; +namespace pocketmine\data\bedrock\block\upgrade\model; final class BlockStateUpgradeSchemaModelValueRemap{ /** @required */ diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 8e09cbd2ec..6bbef3246a 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -28,7 +28,7 @@ use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 4b6b701ffe..e90b8849ed 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -28,7 +28,7 @@ use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\BlockItemIdMap; -use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeIds as Ids; diff --git a/src/data/bedrock/item/SavedItemData.php b/src/data/bedrock/item/SavedItemData.php index 22ae550a09..031c5e2421 100644 --- a/src/data/bedrock/item/SavedItemData.php +++ b/src/data/bedrock/item/SavedItemData.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index ccd293121e..5642889b94 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -26,7 +26,7 @@ namespace pocketmine\entity\object; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\utils\Fallable; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index bfb18e9331..48b31e67f5 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index 37d58fad69..2bc5744fb3 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\utils\Utils; use function array_key_first; use function count; diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index e30499968a..c0373de112 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; -use pocketmine\data\bedrock\blockstate\BlockStateSerializer; -use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateSerializer; +use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index af0fe0e54c..17c6a6ac7b 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\world\format\io; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index bbf4d7bfd8..c1bd76d56f 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -23,18 +23,18 @@ declare(strict_types=1); namespace pocketmine\world\format\io; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializer; -use pocketmine\data\bedrock\blockstate\BlockStateSerializer; -use pocketmine\data\bedrock\blockstate\BlockTypeNames; -use pocketmine\data\bedrock\blockstate\CachingBlockStateDeserializer; -use pocketmine\data\bedrock\blockstate\CachingBlockStateSerializer; -use pocketmine\data\bedrock\blockstate\convert\BlockObjectToBlockStateSerializer; -use pocketmine\data\bedrock\blockstate\convert\BlockStateToBlockObjectDeserializer; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgrader; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaUtils; -use pocketmine\data\bedrock\blockstate\upgrade\LegacyBlockStateMapper; -use pocketmine\data\bedrock\blockstate\UpgradingBlockStateDeserializer; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializer; +use pocketmine\data\bedrock\block\BlockStateSerializer; +use pocketmine\data\bedrock\block\BlockTypeNames; +use pocketmine\data\bedrock\block\CachingBlockStateDeserializer; +use pocketmine\data\bedrock\block\CachingBlockStateSerializer; +use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; +use pocketmine\data\bedrock\block\convert\BlockStateToBlockObjectDeserializer; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; +use pocketmine\data\bedrock\block\upgrade\LegacyBlockStateMapper; +use pocketmine\data\bedrock\block\UpgradingBlockStateDeserializer; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\CompoundTag; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 3e30955187..0814655fb9 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -26,9 +26,9 @@ namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\data\bedrock\BiomeIds; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\BlockTypeNames; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php index 2fafb8d942..3d171bd04c 100644 --- a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php @@ -21,12 +21,12 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\convert; +namespace pocketmine\data\bedrock\block\convert; use PHPUnit\Framework\TestCase; use pocketmine\block\BlockFactory; -use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException; -use pocketmine\data\bedrock\blockstate\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateSerializeException; final class BlockSerializerDeserializerTest extends TestCase{ private BlockStateToBlockObjectDeserializer $deserializer; diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php index 79b08895de..14d3994e33 100644 --- a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php @@ -21,10 +21,10 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock\blockstate\upgrade; +namespace pocketmine\data\bedrock\block\upgrade; use PHPUnit\Framework\TestCase; -use pocketmine\data\bedrock\blockstate\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use const PHP_INT_MAX; diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index b6075abfd5..03b768323a 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\tools\generate_blockstate_upgrade_schema; -use pocketmine\data\bedrock\blockstate\BlockStateData; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchema; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaBlockRemap; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaUtils; -use pocketmine\data\bedrock\blockstate\upgrade\BlockStateUpgradeSchemaValueRemap; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\Tag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; From 4aa1a3da8b887ad04b07abb0304a52f562b1996d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 15:57:02 +0100 Subject: [PATCH 0145/1858] Moving more stuff around --- .../bedrock/{ => block/upgrade}/LegacyBlockIdToStringIdMap.php | 3 ++- src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php | 2 +- src/data/bedrock/{ => item}/BlockItemIdMap.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 2 +- src/world/format/io/GlobalBlockStateHandlers.php | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) rename src/data/bedrock/{ => block/upgrade}/LegacyBlockIdToStringIdMap.php (90%) rename src/data/bedrock/{ => item}/BlockItemIdMap.php (98%) diff --git a/src/data/bedrock/LegacyBlockIdToStringIdMap.php b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php similarity index 90% rename from src/data/bedrock/LegacyBlockIdToStringIdMap.php rename to src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php index 1c7bba7c59..0ced6361fc 100644 --- a/src/data/bedrock/LegacyBlockIdToStringIdMap.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php @@ -21,8 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock; +namespace pocketmine\data\bedrock\block\upgrade; +use pocketmine\data\bedrock\LegacyToStringBidirectionalIdMap; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index f13bd14260..28b77c563e 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; diff --git a/src/data/bedrock/BlockItemIdMap.php b/src/data/bedrock/item/BlockItemIdMap.php similarity index 98% rename from src/data/bedrock/BlockItemIdMap.php rename to src/data/bedrock/item/BlockItemIdMap.php index 4109ec43d8..5d1376aef6 100644 --- a/src/data/bedrock/BlockItemIdMap.php +++ b/src/data/bedrock/item/BlockItemIdMap.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock; +namespace pocketmine\data\bedrock\item; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index e90b8849ed..d5b87e110f 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -27,7 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\BlockItemIdMap; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index c1bd76d56f..3f49336fd1 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -35,7 +35,7 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\LegacyBlockStateMapper; use pocketmine\data\bedrock\block\UpgradingBlockStateDeserializer; -use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\CompoundTag; use Webmozart\PathUtil\Path; From c8e318df8c8421114b42600b7a869d74c374f541 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 16:21:32 +0100 Subject: [PATCH 0146/1858] phpstorm stoobid --- .../convert/BlockSerializerDeserializerTest.php | 0 .../{blockstate => block}/upgrade/BlockStateUpgraderTest.php | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/phpunit/data/bedrock/{blockstate => block}/convert/BlockSerializerDeserializerTest.php (100%) rename tests/phpunit/data/bedrock/{blockstate => block}/upgrade/BlockStateUpgraderTest.php (100%) diff --git a/tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php similarity index 100% rename from tests/phpunit/data/bedrock/blockstate/convert/BlockSerializerDeserializerTest.php rename to tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php diff --git a/tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php similarity index 100% rename from tests/phpunit/data/bedrock/blockstate/upgrade/BlockStateUpgraderTest.php rename to tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php From 301b0aba825e4e7979b2582b3c967db43abdd50c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Jun 2022 16:22:35 +0100 Subject: [PATCH 0147/1858] Allow Item (de)serializer to accept dynamic BlockState(De)Serializer --- src/data/bedrock/item/ItemDeserializer.php | 10 +++++----- src/data/bedrock/item/ItemSerializer.php | 15 +++++++++------ src/network/mcpe/convert/ItemTranslator.php | 5 +++-- .../item/ItemSerializerDeserializerTest.php | 5 +++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 6bbef3246a..42a42ce949 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -29,6 +29,7 @@ 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\block\BlockStateDeserializer; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; @@ -43,16 +44,15 @@ use pocketmine\utils\SingletonTrait; use pocketmine\world\format\io\GlobalBlockStateHandlers; final class ItemDeserializer{ - - use SingletonTrait; - /** * @var \Closure[] * @phpstan-var array */ private array $deserializers = []; - public function __construct(){ + public function __construct( + private BlockStateDeserializer $blockStateDeserializer + ){ $this->registerDeserializers(); } @@ -70,7 +70,7 @@ final class ItemDeserializer{ if(($blockData = $data->getBlock()) !== null){ //TODO: this is rough duct tape; we need a better way to deal with this try{ - $block = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockData); + $block = $this->blockStateDeserializer->deserialize($blockData); }catch(BlockStateDeserializeException $e){ throw new ItemTypeDeserializeException("Failed to deserialize item data: " . $e->getMessage(), 0, $e); } diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index d5b87e110f..49cf012fcb 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\VanillaBlocks as Blocks; +use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\CompoundTypeIds; @@ -61,7 +62,9 @@ final class ItemSerializer{ */ private array $blockItemSerializers = []; - public function __construct(){ + public function __construct( + private BlockStateSerializer $blockStateSerializer + ){ $this->registerSerializers(); } @@ -170,7 +173,7 @@ final class ItemSerializer{ $serializer = $locatedSerializer; $data = $serializer($block); }else{ - $data = self::standardBlock($block); + $data = $this->standardBlock($block); } return $data; @@ -179,9 +182,9 @@ final class ItemSerializer{ /** * @throws ItemTypeSerializeException */ - private static function standardBlock(Block $block) : Data{ + private function standardBlock(Block $block) : Data{ try{ - $blockStateData = GlobalBlockStateHandlers::getSerializer()->serialize($block->getFullId()); + $blockStateData = $this->blockStateSerializer->serialize($block->getFullId()); }catch(BlockStateSerializeException $e){ throw new ItemTypeSerializeException($e->getMessage(), 0, $e); } @@ -261,8 +264,8 @@ final class ItemSerializer{ //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock //Bamboo->getBlock() returns BambooSapling :( - $this->map(Items::BAMBOO(), fn() => self::standardBlock(Blocks::BAMBOO())); - $this->map(Items::CORAL_FAN(), fn(CoralFan $item) => self::standardBlock($item->getBlock())); + $this->map(Items::BAMBOO(), fn() => $this->standardBlock(Blocks::BAMBOO())); + $this->map(Items::CORAL_FAN(), fn(CoralFan $item) => $this->standardBlock($item->getBlock())); $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 4243971c89..6ada7f3726 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -32,6 +32,7 @@ use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; +use pocketmine\world\format\io\GlobalBlockStateHandlers; /** * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. @@ -45,8 +46,8 @@ final class ItemTranslator{ return new self( GlobalItemTypeDictionary::getInstance()->getDictionary(), RuntimeBlockMapping::getInstance()->getBlockStateDictionary(), - new ItemSerializer(), - new ItemDeserializer() + new ItemSerializer(GlobalBlockStateHandlers::getSerializer()), + new ItemDeserializer(GlobalBlockStateHandlers::getDeserializer()) ); } diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index cc73321e7a..ebc7dafc85 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -26,6 +26,7 @@ namespace pocketmine\data\bedrock\item; use PHPUnit\Framework\TestCase; use pocketmine\block\BlockFactory; use pocketmine\item\ItemFactory; +use pocketmine\world\format\io\GlobalBlockStateHandlers; final class ItemSerializerDeserializerTest extends TestCase{ @@ -33,8 +34,8 @@ final class ItemSerializerDeserializerTest extends TestCase{ private ItemSerializer $serializer; public function setUp() : void{ - $this->deserializer = new ItemDeserializer(); - $this->serializer = new ItemSerializer(); + $this->deserializer = new ItemDeserializer(GlobalBlockStateHandlers::getDeserializer()); + $this->serializer = new ItemSerializer(GlobalBlockStateHandlers::getSerializer()); } public function testAllVanillaItemsSerializableAndDeserializable() : void{ From 1533fcf8f6dc6b8d84796b52c80d1b32a89cf7e6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 16:45:02 +0100 Subject: [PATCH 0148/1858] Separate block legacy data upgrading from block deserialization this commit provides a central place where all block data can go to be upgraded to the latest version (currently 1.19), irrespective of how old it is. Previously I had issues during debugging, because it wasn't possible to just upgrade a block without deserializing it into a Block object, which isn't currently supported for many blocks. This commit solves that problem by separating the upgrading from the deserialization. --- src/block/tile/FlowerPot.php | 6 +- .../block/UpgradingBlockStateDeserializer.php | 40 ------------- src/entity/object/FallingBlock.php | 15 ++--- src/world/format/io/BaseWorldProvider.php | 4 +- .../format/io/GlobalBlockStateHandlers.php | 57 ++++++------------- src/world/format/io/leveldb/LevelDB.php | 12 +++- 6 files changed, 38 insertions(+), 96 deletions(-) delete mode 100644 src/data/bedrock/block/UpgradingBlockStateDeserializer.php diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 499101bb1b..2b39731ed1 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -46,11 +46,13 @@ class FlowerPot extends Spawnable{ public function readSaveData(CompoundTag $nbt) : void{ $blockStateData = null; + + $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); if(($itemIdTag = $nbt->getTag(self::TAG_ITEM)) instanceof ShortTag && ($itemMetaTag = $nbt->getTag(self::TAG_ITEM_DATA)) instanceof IntTag){ - $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue()); + $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue()); }elseif(($plantBlockTag = $nbt->getCompoundTag(self::TAG_PLANT_BLOCK)) !== null){ try{ - $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($plantBlockTag); + $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($plantBlockTag); }catch(BlockStateDeserializeException $e){ throw new SavedDataLoadingException("Error loading " . self::TAG_PLANT_BLOCK . " tag for flower pot: " . $e->getMessage(), 0, $e); } diff --git a/src/data/bedrock/block/UpgradingBlockStateDeserializer.php b/src/data/bedrock/block/UpgradingBlockStateDeserializer.php deleted file mode 100644 index 273669b461..0000000000 --- a/src/data/bedrock/block/UpgradingBlockStateDeserializer.php +++ /dev/null @@ -1,40 +0,0 @@ -realDeserializer->deserialize($this->blockStateUpgrader->upgrade($stateData)); - } - - public function getRealDeserializer() : BlockStateDeserializer{ return $this->realDeserializer; } -} diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 5642889b94..22f1981678 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -65,12 +65,9 @@ class FallingBlock extends Entity{ public static function parseBlockNBT(BlockFactory $factory, CompoundTag $nbt) : Block{ //TODO: 1.8+ save format + $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){ - try{ - $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($fallingBlockTag); - }catch(BlockStateDeserializeException $e){ - throw new SavedDataLoadingException($e->getMessage(), 0, $e); - } + $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag); }else{ if(($tileIdTag = $nbt->getTag("TileID")) instanceof IntTag){ $blockId = $tileIdTag->getValue(); @@ -81,10 +78,10 @@ class FallingBlock extends Entity{ } $damage = $nbt->getByte("Data", 0); - $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromIntIdMeta($blockId, $damage); - if($blockStateData === null){ - throw new SavedDataLoadingException("Invalid legacy falling block"); - } + $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage); + } + if($blockStateData === null){ + throw new SavedDataLoadingException("Invalid legacy falling block"); } try{ diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index 17c6a6ac7b..23d1ba2691 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -56,11 +56,11 @@ abstract class BaseWorldProvider implements WorldProvider{ //TODO: this should be dependency-injected so it can be replaced, but that would break BC //also, we want it to be lazy-loaded ... - $legacyBlockStateMapper = GlobalBlockStateHandlers::getLegacyBlockStateMapper(); + $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); $newPalette = []; foreach($palette as $k => $legacyIdMeta){ - $newStateData = $legacyBlockStateMapper->fromIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); + $newStateData = $blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); if($newStateData === null){ //TODO: remember data for unknown states so we can implement them later $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 3f49336fd1..42e4b9c26d 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -26,18 +26,16 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\BlockStateSerializer; -use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\data\bedrock\block\CachingBlockStateDeserializer; use pocketmine\data\bedrock\block\CachingBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockStateToBlockObjectDeserializer; +use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; -use pocketmine\data\bedrock\block\upgrade\LegacyBlockStateMapper; -use pocketmine\data\bedrock\block\UpgradingBlockStateDeserializer; use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; +use pocketmine\data\bedrock\block\upgrade\LegacyBlockStateMapper; use pocketmine\errorhandler\ErrorToExceptionHandler; -use pocketmine\nbt\tag\CompoundTag; use Webmozart\PathUtil\Path; use function file_get_contents; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; @@ -54,50 +52,29 @@ final class GlobalBlockStateHandlers{ private static ?BlockStateDeserializer $blockStateDeserializer; - private static ?LegacyBlockStateMapper $legacyBlockStateMapper; + private static ?BlockDataUpgrader $blockDataUpgrader; public static function getDeserializer() : BlockStateDeserializer{ - return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer( - new UpgradingBlockStateDeserializer( - new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( - Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), - BlockStateData::CURRENT_VERSION - )), - new BlockStateToBlockObjectDeserializer() - ) - ); + return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer(new BlockStateToBlockObjectDeserializer()); } public static function getSerializer() : BlockStateSerializer{ return self::$blockStateSerializer ??= new CachingBlockStateSerializer(new BlockObjectToBlockStateSerializer()); } - public static function getLegacyBlockStateMapper() : LegacyBlockStateMapper{ - return self::$legacyBlockStateMapper ??= 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() + 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( + Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), + BlockStateData::CURRENT_VERSION + )) ); } - - public static function nbtToBlockStateData(CompoundTag $tag) : BlockStateData{ - if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ - //Legacy (pre-1.13) blockstate - upgrade it to a version we understand - $id = $tag->getString("name"); - $data = $tag->getShort("val"); - - $blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromStringIdMeta($id, $data); - if($blockStateData === null){ - //unknown block, invalid ID - $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); - } - }else{ - //Modern (post-1.13) blockstate - $blockStateData = BlockStateData::fromNbt($tag); - } - - return $blockStateData; - } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 0814655fb9..2633114138 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -160,12 +160,18 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $paletteSize = $bitsPerBlock === 0 ? 1 : $stream->getLInt(); + $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); for($i = 0; $i < $paletteSize; ++$i){ try{ $offset = $stream->getOffset(); - $blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag()); + $blockStateNbt = $nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); + $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + if($blockStateData === null){ + //upgrading blockstates should always succeed, regardless of whether they've been implemented or not + throw new BlockStateDeserializeException("Invalid or improperly mapped legacy blockstate: " . $blockStateNbt->toString()); + } $stream->setOffset($offset); try{ @@ -210,7 +216,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $binaryStream = new BinaryStream($extraRawData); $count = $binaryStream->getLInt(); - $legacyMapper = GlobalBlockStateHandlers::getLegacyBlockStateMapper(); + $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); for($i = 0; $i < $count; ++$i){ $key = $binaryStream->getLInt(); @@ -223,7 +229,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockId = $value & 0xff; $blockData = ($value >> 8) & 0xf; - $blockStateData = $legacyMapper->fromIntIdMeta($blockId, $blockData); + $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $blockData); if($blockStateData === null){ //TODO: we could preserve this in case it's supported in the future, but this was historically only //used for grass anyway, so we probably don't need to care From 0da174842e87501968a4f45500634f0412f2141f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 16:46:09 +0100 Subject: [PATCH 0149/1858] Fix build --- src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php | 1 - src/data/bedrock/item/ItemDeserializer.php | 2 -- src/data/bedrock/item/ItemSerializer.php | 4 +--- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index 28b77c563e..fc015b358a 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 42a42ce949..8abfb24dc1 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -40,8 +40,6 @@ use pocketmine\item\Item; use pocketmine\item\PotionType; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalBlockStateHandlers; final class ItemDeserializer{ /** diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 49cf012fcb..97910abc04 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -27,9 +27,8 @@ use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\block\BlockStateSerializer; -use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\block\BlockStateSerializeException; +use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeIds as Ids; @@ -42,7 +41,6 @@ use pocketmine\item\ItemBlock; use pocketmine\item\PotionType; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; -use pocketmine\world\format\io\GlobalBlockStateHandlers; use function class_parents; use function get_class; From d8bba6ed3decc7388c0fad650164716368511259 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 16:55:50 +0100 Subject: [PATCH 0150/1858] git add -p bites again --- .../block/upgrade/BlockDataUpgrader.php | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/data/bedrock/block/upgrade/BlockDataUpgrader.php diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php new file mode 100644 index 0000000000..63faa35329 --- /dev/null +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -0,0 +1,63 @@ +legacyBlockStateMapper->fromIntIdMeta($id, $meta); + } + + public function upgradeStringIdMeta(string $id, int $meta) : ?BlockStateData{ + return $this->legacyBlockStateMapper->fromStringIdMeta($id, $meta); + } + + public function upgradeBlockStateNbt(CompoundTag $tag) : ?BlockStateData{ + if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ + //Legacy (pre-1.13) blockstate - upgrade it to a version we understand + $id = $tag->getString("name"); + $data = $tag->getShort("val"); + + $blockStateData = $this->upgradeStringIdMeta($id, $data); + if($blockStateData === null){ + //unknown block, invalid ID + $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + } + }else{ + //Modern (post-1.13) blockstate + $blockStateData = BlockStateData::fromNbt($tag); + } + + return $this->blockStateUpgrader->upgrade($blockStateData); + } +} From 5ed75731f2c28c5c119ffd7b31b85d46f9656908 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 19:02:16 +0100 Subject: [PATCH 0151/1858] First (untested) look at hooking all the itemstack serializer/deserializer stuff together this should address #5063 and related issues, if it works correctly. --- src/data/bedrock/item/SavedItemData.php | 47 +---- src/data/bedrock/item/SavedItemStackData.php | 87 +++++++++ .../bedrock/item/upgrade/ItemDataUpgrader.php | 174 ++++++++++++++++++ .../item/upgrade/ItemIdMetaUpgradeSchema.php | 49 +++++ .../upgrade/ItemIdMetaUpgradeSchemaUtils.php | 98 ++++++++++ .../upgrade}/LegacyItemIdToStringIdMap.php | 3 +- .../item/upgrade/R12ItemIdToBlockIdMap.php | 87 +++++++++ .../model/ItemIdMetaUpgradeSchemaModel.php | 39 ++++ src/item/Item.php | 56 ++---- .../format/io/GlobalItemDataHandlers.php | 59 ++++++ 10 files changed, 613 insertions(+), 86 deletions(-) create mode 100644 src/data/bedrock/item/SavedItemStackData.php create mode 100644 src/data/bedrock/item/upgrade/ItemDataUpgrader.php create mode 100644 src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php create mode 100644 src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php rename src/data/bedrock/{ => item/upgrade}/LegacyItemIdToStringIdMap.php (90%) create mode 100644 src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php create mode 100644 src/data/bedrock/item/upgrade/model/ItemIdMetaUpgradeSchemaModel.php create mode 100644 src/world/format/io/GlobalItemDataHandlers.php diff --git a/src/data/bedrock/item/SavedItemData.php b/src/data/bedrock/item/SavedItemData.php index 031c5e2421..fa631e4e7a 100644 --- a/src/data/bedrock/item/SavedItemData.php +++ b/src/data/bedrock/item/SavedItemData.php @@ -24,20 +24,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\BlockStateDeserializeException; -use pocketmine\data\SavedDataLoadingException; -use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\nbt\tag\StringTag; -use function str_starts_with; final class SavedItemData{ public const TAG_NAME = "Name"; - private const TAG_DAMAGE = "Damage"; + public const TAG_DAMAGE = "Damage"; public const TAG_BLOCK = "Block"; - private const TAG_TAG = "tag"; - private const TAG_ITEM_IDENTIFIER = "ItemIdentifier"; + public const TAG_TAG = "tag"; public function __construct( private string $name, @@ -54,43 +48,6 @@ final class SavedItemData{ public function getTag() : ?CompoundTag{ return $this->tag; } - public static function fromNbt(CompoundTag $tag) : self{ - try{ - //required - $name = $tag->getString(self::TAG_NAME); - $damage = $tag->getShort(self::TAG_DAMAGE); - - //optional - $blockStateNbt = $tag->getCompoundTag(self::TAG_BLOCK); - $extraData = $tag->getCompoundTag(self::TAG_TAG); - }catch(NbtException $e){ - throw new SavedDataLoadingException($e->getMessage(), 0, $e); - } - - //TODO: this hack probably doesn't belong here; it's necessary to deal with spawn eggs from before 1.16.100 - if( - $name === ItemTypeIds::SPAWN_EGG && - ($itemIdentifierTag = $tag->getTag(self::TAG_ITEM_IDENTIFIER)) instanceof StringTag && - str_starts_with($itemIdentifierTag->getValue(), "minecraft:") - ){ - \GlobalLogger::get()->debug("Handling legacy spawn egg for " . $itemIdentifierTag->getValue()); - $name = $itemIdentifierTag->getValue() . "_spawn_egg"; - } - - try{ - $blockStateData = $blockStateNbt !== null ? BlockStateData::fromNbt($blockStateNbt) : null; - }catch(BlockStateDeserializeException $e){ - throw new SavedDataLoadingException("Failed to load item saved data: " . $e->getMessage(), 0, $e); - } - - return new self( - $name, - $damage, - $blockStateData, - $extraData - ); - } - public function toNbt() : CompoundTag{ $result = CompoundTag::create(); $result->setString(self::TAG_NAME, $this->name); diff --git a/src/data/bedrock/item/SavedItemStackData.php b/src/data/bedrock/item/SavedItemStackData.php new file mode 100644 index 0000000000..b8ad648f07 --- /dev/null +++ b/src/data/bedrock/item/SavedItemStackData.php @@ -0,0 +1,87 @@ +typeData; } + + public function getCount() : int{ return $this->count; } + + public function getSlot() : ?int{ return $this->slot; } + + public function getWasPickedUp() : ?bool{ return $this->wasPickedUp; } + + /** @return string[] */ + public function getCanPlaceOn() : array{ return $this->canPlaceOn; } + + /** @return string[] */ + public function getCanDestroy() : array{ return $this->canDestroy; } + + public function toNbt() : CompoundTag{ + $result = CompoundTag::create(); + $result->setByte(self::TAG_COUNT, Binary::signByte($this->count)); + + if($this->slot !== null){ + $result->setByte(self::TAG_SLOT, Binary::signByte($this->slot)); + } + if($this->wasPickedUp !== null){ + $result->setByte(self::TAG_WAS_PICKED_UP, $this->wasPickedUp ? 1 : 0); + } + if(count($this->canPlaceOn) !== 0){ + $result->setTag(self::TAG_CAN_PLACE_ON, new ListTag(array_map(fn(string $s) => new StringTag($s), $this->canPlaceOn))); + } + if(count($this->canDestroy) !== 0){ + $result->setTag(self::TAG_CAN_DESTROY, new ListTag(array_map(fn(string $s) => new StringTag($s), $this->canDestroy))); + } + + return $result->merge($this->typeData->toNbt()); + } +} diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php new file mode 100644 index 0000000000..e55513c9a8 --- /dev/null +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -0,0 +1,174 @@ + + */ + private array $idMetaUpgradeSchemas = []; + + /** + * @param ItemIdMetaUpgradeSchema[] $idMetaUpgradeSchemas + * @phpstan-param array $idMetaUpgradeSchemas + */ + public function __construct( + private LegacyItemIdToStringIdMap $legacyIntToStringIdMap, + private R12ItemIdToBlockIdMap $r12ItemIdToBlockIdMap, + private BlockDataUpgrader $blockDataUpgrader, + array $idMetaUpgradeSchemas + ){ + foreach($idMetaUpgradeSchemas as $schema){ + $this->addIdMetaUpgradeSchema($schema); + } + } + + public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ + if(isset($this->idMetaUpgradeSchemas[$schema->getPriority()])){ + throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getPriority()); + } + $this->idMetaUpgradeSchemas[$schema->getPriority()] = $schema; + ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); + } + + private function upgradeItemTypeNbt(CompoundTag $tag) : SavedItemData{ + if(($nameIdTag = $tag->getTag(SavedItemData::TAG_NAME)) instanceof StringTag){ + //Bedrock 1.6+ + + $rawNameId = $nameIdTag->getValue(); + }elseif(($idTag = $tag->getTag(self::TAG_LEGACY_ID)) instanceof ShortTag){ + //Bedrock <= 1.5, PM <= 1.12 + + $rawNameId = $this->legacyIntToStringIdMap->legacyToString($idTag->getValue()); + if($rawNameId === null){ + throw new SavedDataLoadingException("Legacy item ID " . $idTag->getValue() . " doesn't map to any modern string ID"); + } + }elseif($idTag instanceof StringTag){ + //PC item save format - best we can do here is hope the string IDs match + + $rawNameId = $idTag->getValue(); + }else{ + throw new SavedDataLoadingException("Item stack data should have either a name ID or a legacy ID"); + } + + $meta = $tag->getShort(SavedItemData::TAG_DAMAGE, 0); + + $blockStateNbt = $tag->getCompoundTag(SavedItemData::TAG_BLOCK); + if($blockStateNbt !== null){ + $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + }elseif(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){ + //this is a legacy blockitem represented by ID + meta + $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + }else{ + //probably a standard item + $blockStateData = null; + } + + [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + + //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? + + return new SavedItemData($newNameId, $newMeta, $blockStateData, $tag->getCompoundTag(SavedItemData::TAG_TAG)); + } + + /** + * @return string[] + */ + private static function deserializeListOfStrings(?ListTag $list, string $tagName) : array{ + if($list === null){ + return []; + } + if($list->getTagType() !== NBT::TAG_String){ + throw new SavedDataLoadingException("Unexpected type of list for tag '$tagName', expected TAG_String"); + } + $result = []; + foreach($list as $item){ + assert($item instanceof StringTag); + $result[] = $item->getValue(); + } + + return $result; + } + + public function upgradeItemStackNbt(CompoundTag $tag) : SavedItemStackData{ + $savedItemData = $this->upgradeItemTypeNbt($tag); + try{ + //required + $count = Binary::unsignByte($tag->getByte(SavedItemStackData::TAG_COUNT)); + + //optional + $slot = ($slotTag = $tag->getTag(SavedItemStackData::TAG_SLOT)) instanceof ByteTag ? Binary::unsignByte($slotTag->getValue()) : null; + $wasPickedUp = ($wasPickedUpTag = $tag->getTag(SavedItemStackData::TAG_WAS_PICKED_UP)) instanceof ByteTag ? $wasPickedUpTag->getValue() : null; + $canPlaceOnList = $tag->getListTag(SavedItemStackData::TAG_CAN_PLACE_ON); + $canDestroyList = $tag->getListTag(SavedItemStackData::TAG_CAN_DESTROY); + }catch(NbtException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + + return new SavedItemStackData( + $savedItemData, + $count, + $slot, + $wasPickedUp !== 0, + self::deserializeListOfStrings($canPlaceOnList, SavedItemStackData::TAG_CAN_PLACE_ON), + self::deserializeListOfStrings($canDestroyList, SavedItemStackData::TAG_CAN_DESTROY) + ); + } + + /** + * @phpstan-return array{string, int} + */ + public function upgradeItemStringIdMeta(string $id, int $meta) : array{ + $newId = $id; + $newMeta = $meta; + foreach($this->idMetaUpgradeSchemas as $schema){ + if(($remappedMetaId = $schema->remapMeta($newId, $newMeta)) !== null){ + $newId = $remappedMetaId; + $newMeta = 0; + }elseif(($renamedId = $schema->renameId($newId)) !== null){ + $newId = $renamedId; + } + } + + return [$id, $meta]; + } +} diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php new file mode 100644 index 0000000000..f0b398acbe --- /dev/null +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php @@ -0,0 +1,49 @@ + $renamedIds + * @phpstan-param array> $remappedMetas + */ + public function __construct( + private array $renamedIds, + private array $remappedMetas, + private int $priority + ){} + + public function getPriority() : int{ return $this->priority; } + + public function renameId(string $id) : ?string{ + return $this->renamedIds[$id] ?? null; + } + + public function remapMeta(string $id, int $meta) : ?string{ + return $this->remappedMetas[$id][$meta] ?? null; + } +} diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php new file mode 100644 index 0000000000..9e95bf4a2b --- /dev/null +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -0,0 +1,98 @@ + + */ + public static function loadSchemas(string $path) : array{ + $iterator = new \RegexIterator( + new \FilesystemIterator( + $path, + \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS + ), + '/\/(\d{4}).*\.json$/', + \RegexIterator::GET_MATCH + ); + + $result = []; + + /** @var string[] $matches */ + foreach($iterator as $matches){ + $filename = $matches[0]; + $priority = (int) $matches[1]; + + $fullPath = Path::join($path, $filename); + + try{ + $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); + }catch(\ErrorException $e){ + throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); + } + + try{ + $schema = self::loadSchemaFromString($raw, $priority); + }catch(\RuntimeException $e){ + throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); + } + + $result[$priority] = $schema; + } + + ksort($result, SORT_NUMERIC); + return $result; + } + + public static function loadSchemaFromString(string $raw, int $priority) : ItemIdMetaUpgradeSchema{ + try{ + $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); + }catch(\JsonException $e){ + throw new \RuntimeException($e->getMessage(), 0, $e); + } + if(!is_object($json)){ + throw new \RuntimeException("Unexpected root type of schema file " . gettype($json) . ", expected object"); + } + + $jsonMapper = new \JsonMapper(); + try{ + $model = $jsonMapper->map($json, new ItemIdMetaUpgradeSchemaModel()); + }catch(\JsonMapper_Exception $e){ + throw new \RuntimeException($e->getMessage(), 0, $e); + } + + return new ItemIdMetaUpgradeSchema($model->renamedIds, $model->remappedMetas, $priority); + } +} diff --git a/src/data/bedrock/LegacyItemIdToStringIdMap.php b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php similarity index 90% rename from src/data/bedrock/LegacyItemIdToStringIdMap.php rename to src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php index 587a09fe06..49b1a22718 100644 --- a/src/data/bedrock/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php @@ -21,8 +21,9 @@ declare(strict_types=1); -namespace pocketmine\data\bedrock; +namespace pocketmine\data\bedrock\item\upgrade; +use pocketmine\data\bedrock\LegacyToStringBidirectionalIdMap; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php new file mode 100644 index 0000000000..723e8d9932 --- /dev/null +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -0,0 +1,87 @@ + $blockId){ + if(!is_string($itemId)){ + throw new AssumptionFailedError("Invalid blockitem ID mapping table, expected string as key"); + } + if(!is_string($blockId)){ + throw new AssumptionFailedError("Invalid blockitem ID mapping table, expected string as value"); + } + $builtMap[$itemId] = $blockId; + } + + return new self($builtMap); + } + + /** + * @param string[] $itemToBlock + * @phpstan-param array $itemToBlock + */ + public function __construct(private array $itemToBlock){} + + public function itemIdToBlockId(string $itemId) : ?string{ + return $this->itemToBlock[$itemId] ?? null; + } + + public function blockIdToItemId(string $blockId) : ?string{ + //we don't need this for any functionality, so we're not concerned about performance here + //however, it might be nice to have for debugging + $itemId = array_search($blockId, $this->itemToBlock, true); + return $itemId !== false ? $itemId : null; + } +} diff --git a/src/data/bedrock/item/upgrade/model/ItemIdMetaUpgradeSchemaModel.php b/src/data/bedrock/item/upgrade/model/ItemIdMetaUpgradeSchemaModel.php new file mode 100644 index 0000000000..5765c5acf1 --- /dev/null +++ b/src/data/bedrock/item/upgrade/model/ItemIdMetaUpgradeSchemaModel.php @@ -0,0 +1,39 @@ + + */ + public array $renamedIds = []; + + /** + * @var string[][] + * @phpstan-var array> + */ + public array $remappedMetas = []; +} diff --git a/src/item/Item.php b/src/item/Item.php index 775ae3eb08..dd5e088fb8 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -31,6 +31,7 @@ use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; +use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\item\enchantment\EnchantmentInstance; @@ -41,16 +42,14 @@ use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; -use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\player\Player; -use pocketmine\utils\Binary; use pocketmine\utils\Utils; +use pocketmine\world\format\io\GlobalItemDataHandlers; use function base64_decode; use function base64_encode; use function count; -use function get_class; use function gettype; use function hex2bin; use function is_string; @@ -648,21 +647,16 @@ class Item implements \JsonSerializable{ * @param int $slot optional, the inventory slot of the item */ public function nbtSerialize(int $slot = -1) : CompoundTag{ - $result = CompoundTag::create() - ->setShort("id", $this->getId()) - ->setByte("Count", Binary::signByte($this->count)) - ->setShort("Damage", $this->getMeta()); + $typeData = GlobalItemDataHandlers::getSerializer()->serialize($this); - $tag = $this->getNamedTag(); - if($tag->count() > 0){ - $result->setTag("tag", $tag); - } - - if($slot !== -1){ - $result->setByte("Slot", $slot); - } - - return $result; + return (new SavedItemStackData( + $typeData, + $this->count, + $slot !== -1 ? $slot : null, + null, + [], //we currently represent canDestroy and canPlaceOn via NBT, like PC + [] + ))->toNbt(); } /** @@ -671,31 +665,13 @@ class Item implements \JsonSerializable{ * @throws SavedDataLoadingException */ public static function nbtDeserialize(CompoundTag $tag) : Item{ - if($tag->getTag("id") === null || $tag->getTag("Count") === null){ - return VanillaItems::AIR(); - } + $itemData = GlobalItemDataHandlers::getUpgrader()->upgradeItemStackNbt($tag); - $count = Binary::unsignByte($tag->getByte("Count")); - $meta = $tag->getShort("Damage", 0); + $item = GlobalItemDataHandlers::getDeserializer()->deserialize($itemData->getTypeData()); - $idTag = $tag->getTag("id"); - if($idTag instanceof ShortTag){ - $item = ItemFactory::getInstance()->get($idTag->getValue(), $meta, $count); - }elseif($idTag instanceof StringTag){ //PC item save format - try{ - $item = LegacyStringToItemParser::getInstance()->parse($idTag->getValue() . ":$meta"); - }catch(LegacyStringToItemParserException $e){ - //TODO: improve error handling - return VanillaItems::AIR(); - } - $item->setCount($count); - }else{ - throw new SavedDataLoadingException("Item CompoundTag ID must be an instance of StringTag or ShortTag, " . get_class($idTag) . " given"); - } - - $itemNBT = $tag->getCompoundTag("tag"); - if($itemNBT !== null){ - $item->setNamedTag(clone $itemNBT); + $item->setCount($itemData->getCount()); + if(($tagTag = $itemData->getTypeData()->getTag()) !== null){ + $item->setNamedTag(clone $tagTag); } return $item; diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php new file mode 100644 index 0000000000..850a679a1c --- /dev/null +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -0,0 +1,59 @@ + Date: Thu, 23 Jun 2022 19:34:08 +0100 Subject: [PATCH 0152/1858] fix a bunch of bugs --- src/block/tile/ContainerTrait.php | 9 ++++++- .../block/upgrade/BlockDataUpgrader.php | 2 ++ .../bedrock/item/upgrade/ItemDataUpgrader.php | 14 +++++++++- .../item/upgrade/ItemIdMetaUpgradeSchema.php | 4 +-- .../item/upgrade/R12ItemIdToBlockIdMap.php | 26 ++++++++++++++----- src/item/Item.php | 8 ++++-- 6 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/block/tile/ContainerTrait.php b/src/block/tile/ContainerTrait.php index 1274614d00..cbbc988433 100644 --- a/src/block/tile/ContainerTrait.php +++ b/src/block/tile/ContainerTrait.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\tile; +use pocketmine\data\SavedDataLoadingException; use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\nbt\NBT; @@ -49,7 +50,13 @@ trait ContainerTrait{ $newContents = []; /** @var CompoundTag $itemNBT */ foreach($inventoryTag as $itemNBT){ - $newContents[$itemNBT->getByte("Slot")] = Item::nbtDeserialize($itemNBT); + try{ + $newContents[$itemNBT->getByte("Slot")] = Item::nbtDeserialize($itemNBT); + }catch(SavedDataLoadingException $e){ + //TODO: not the best solution + \GlobalLogger::get()->logException($e); + continue; + } } $inventory->setContents($newContents); diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index 63faa35329..a10c30d7e1 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -60,4 +60,6 @@ final class BlockDataUpgrader{ return $this->blockStateUpgrader->upgrade($blockStateData); } + + public function getBlockStateUpgrader() : BlockStateUpgrader{ return $this->blockStateUpgrader; } } diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index e55513c9a8..ba42e40398 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -70,6 +70,9 @@ final class ItemDataUpgrader{ ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); } + /** + * @throws SavedDataLoadingException + */ private function upgradeItemTypeNbt(CompoundTag $tag) : SavedItemData{ if(($nameIdTag = $tag->getTag(SavedItemData::TAG_NAME)) instanceof StringTag){ //Bedrock 1.6+ @@ -98,6 +101,11 @@ final class ItemDataUpgrader{ }elseif(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){ //this is a legacy blockitem represented by ID + meta $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + 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; @@ -112,6 +120,7 @@ final class ItemDataUpgrader{ /** * @return string[] + * @throws SavedDataLoadingException */ private static function deserializeListOfStrings(?ListTag $list, string $tagName) : array{ if($list === null){ @@ -129,6 +138,9 @@ final class ItemDataUpgrader{ return $result; } + /** + * @throws SavedDataLoadingException + */ public function upgradeItemStackNbt(CompoundTag $tag) : SavedItemStackData{ $savedItemData = $this->upgradeItemTypeNbt($tag); try{ @@ -169,6 +181,6 @@ final class ItemDataUpgrader{ } } - return [$id, $meta]; + return [$newId, $newMeta]; } } diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php index f0b398acbe..74175c560b 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php @@ -40,10 +40,10 @@ final class ItemIdMetaUpgradeSchema{ public function getPriority() : int{ return $this->priority; } public function renameId(string $id) : ?string{ - return $this->renamedIds[$id] ?? null; + return $this->renamedIds[mb_strtolower($id, 'US-ASCII')] ?? null; } public function remapMeta(string $id, int $meta) : ?string{ - return $this->remappedMetas[$id][$meta] ?? null; + return $this->remappedMetas[mb_strtolower($id, 'US-ASCII')][$meta] ?? null; } } diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index 723e8d9932..bd4866f97f 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -68,20 +68,34 @@ final class R12ItemIdToBlockIdMap{ return new self($builtMap); } + /** + * @var string[] + * @phpstan-var array + */ + private array $itemToBlock = []; + /** + * @var string[] + * @phpstan-var array + */ + private array $blockToItem = []; + /** * @param string[] $itemToBlock * @phpstan-param array $itemToBlock */ - public function __construct(private array $itemToBlock){} + public function __construct(array $itemToBlock){ + foreach($itemToBlock as $itemId => $blockId){ + $this->itemToBlock[mb_strtolower($itemId, 'US-ASCII')] = $blockId; + $this->blockToItem[mb_strtolower($blockId, 'US-ASCII')] = $itemId; + } + } public function itemIdToBlockId(string $itemId) : ?string{ - return $this->itemToBlock[$itemId] ?? null; + return $this->itemToBlock[mb_strtolower($itemId, 'US-ASCII')] ?? null; } public function blockIdToItemId(string $blockId) : ?string{ - //we don't need this for any functionality, so we're not concerned about performance here - //however, it might be nice to have for debugging - $itemId = array_search($blockId, $this->itemToBlock, true); - return $itemId !== false ? $itemId : null; + //we don't need this for any functionality, but it might be nice to have for debugging + return $this->blockToItem[mb_strtolower($blockId, 'US-ASCII')] ?? null; } } diff --git a/src/item/Item.php b/src/item/Item.php index dd5e088fb8..6aabbf3130 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -31,6 +31,7 @@ use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; +use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; @@ -661,13 +662,16 @@ class Item implements \JsonSerializable{ /** * Deserializes an Item from an NBT CompoundTag - * @throws NbtException * @throws SavedDataLoadingException */ public static function nbtDeserialize(CompoundTag $tag) : Item{ $itemData = GlobalItemDataHandlers::getUpgrader()->upgradeItemStackNbt($tag); - $item = GlobalItemDataHandlers::getDeserializer()->deserialize($itemData->getTypeData()); + try{ + $item = GlobalItemDataHandlers::getDeserializer()->deserialize($itemData->getTypeData()); + }catch(ItemTypeDeserializeException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } $item->setCount($itemData->getCount()); if(($tagTag = $itemData->getTypeData()->getTag()) !== null){ From adf8a61814e1cb93b7e843ce3eb8ee366b01f95d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 19:40:11 +0100 Subject: [PATCH 0153/1858] BlockStateToBlockObjectDeserializer: make map() public this allows plugins to implement their own blocks using this deserializer. --- .../block/convert/BlockStateToBlockObjectDeserializer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 967a71412c..8c31103557 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -62,7 +62,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize } /** @phpstan-param \Closure(Reader) : Block $c */ - private function map(string $id, \Closure $c) : void{ + public function map(string $id, \Closure $c) : void{ if(array_key_exists($id, $this->deserializeFuncs)){ throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); } From 21cf3813bef9fa0aa975e00072c2210cf38af547 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 20:01:19 +0100 Subject: [PATCH 0154/1858] Add extra interfaces to make it easier to get at the actual blockstate serializer/deserializer this still is a pain the ass, but it's much less so than before. --- .../block/CachingBlockStateDeserializer.php | 2 +- .../block/CachingBlockStateSerializer.php | 2 +- .../DelegatingBlockStateDeserializer.php | 29 +++++++++++++++++++ .../block/DelegatingBlockStateSerializer.php | 29 +++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/data/bedrock/block/DelegatingBlockStateDeserializer.php create mode 100644 src/data/bedrock/block/DelegatingBlockStateSerializer.php diff --git a/src/data/bedrock/block/CachingBlockStateDeserializer.php b/src/data/bedrock/block/CachingBlockStateDeserializer.php index 84edcff2fe..3071a9eb1d 100644 --- a/src/data/bedrock/block/CachingBlockStateDeserializer.php +++ b/src/data/bedrock/block/CachingBlockStateDeserializer.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; -final class CachingBlockStateDeserializer implements BlockStateDeserializer{ +final class CachingBlockStateDeserializer implements DelegatingBlockStateDeserializer{ /** * @var int[] diff --git a/src/data/bedrock/block/CachingBlockStateSerializer.php b/src/data/bedrock/block/CachingBlockStateSerializer.php index 18003b086e..f6129622de 100644 --- a/src/data/bedrock/block/CachingBlockStateSerializer.php +++ b/src/data/bedrock/block/CachingBlockStateSerializer.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; -final class CachingBlockStateSerializer implements BlockStateSerializer{ +final class CachingBlockStateSerializer implements DelegatingBlockStateSerializer{ /** * @var BlockStateData[] diff --git a/src/data/bedrock/block/DelegatingBlockStateDeserializer.php b/src/data/bedrock/block/DelegatingBlockStateDeserializer.php new file mode 100644 index 0000000000..2c89ec03bb --- /dev/null +++ b/src/data/bedrock/block/DelegatingBlockStateDeserializer.php @@ -0,0 +1,29 @@ + Date: Thu, 23 Jun 2022 21:22:52 +0100 Subject: [PATCH 0155/1858] Fix CS --- src/data/bedrock/block/DelegatingBlockStateDeserializer.php | 2 +- src/data/bedrock/block/DelegatingBlockStateSerializer.php | 2 +- src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php | 2 ++ src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/block/DelegatingBlockStateDeserializer.php b/src/data/bedrock/block/DelegatingBlockStateDeserializer.php index 2c89ec03bb..1844d44fc0 100644 --- a/src/data/bedrock/block/DelegatingBlockStateDeserializer.php +++ b/src/data/bedrock/block/DelegatingBlockStateDeserializer.php @@ -26,4 +26,4 @@ namespace pocketmine\data\bedrock\block; interface DelegatingBlockStateDeserializer extends BlockStateDeserializer{ public function getRealDeserializer() : BlockStateDeserializer; -} \ No newline at end of file +} diff --git a/src/data/bedrock/block/DelegatingBlockStateSerializer.php b/src/data/bedrock/block/DelegatingBlockStateSerializer.php index fc0788d546..8c53336068 100644 --- a/src/data/bedrock/block/DelegatingBlockStateSerializer.php +++ b/src/data/bedrock/block/DelegatingBlockStateSerializer.php @@ -26,4 +26,4 @@ namespace pocketmine\data\bedrock\block; interface DelegatingBlockStateSerializer extends BlockStateSerializer{ public function getRealSerializer() : BlockStateSerializer; -} \ No newline at end of file +} diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php index 74175c560b..a977f4ad29 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item\upgrade; +use function mb_strtolower; + final class ItemIdMetaUpgradeSchema{ /** diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index bd4866f97f..e3476c9c4a 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -27,11 +27,11 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; -use function array_search; use function file_get_contents; use function is_array; use function is_string; use function json_decode; +use function mb_strtolower; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; /** From 82f9a25d88f1c4ad1e25e09d7a19409c668d1263 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 21:24:09 +0100 Subject: [PATCH 0156/1858] Fix PHPStan --- src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index e3476c9c4a..6c0cf5cd37 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -84,7 +84,7 @@ final class R12ItemIdToBlockIdMap{ * @phpstan-param array $itemToBlock */ public function __construct(array $itemToBlock){ - foreach($itemToBlock as $itemId => $blockId){ + foreach(Utils::stringifyKeys($itemToBlock) as $itemId => $blockId){ $this->itemToBlock[mb_strtolower($itemId, 'US-ASCII')] = $blockId; $this->blockToItem[mb_strtolower($blockId, 'US-ASCII')] = $itemId; } From 1c689b10b9c8230640ba5b20eae5d17ce649878d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Jun 2022 21:29:48 +0100 Subject: [PATCH 0157/1858] ItemSerializer: fixed item NBT being discarded I'm still not sure on the wisdom of allowing NBT usage in here ... --- src/data/bedrock/item/ItemSerializer.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 97910abc04..5613f85ec8 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -141,6 +141,15 @@ final class ItemSerializer{ $data = $serializer($item); } + if($item->hasNamedTag()){ + $resultTag = $item->getNamedTag(); + $extraTag = $data->getTag(); + if($extraTag !== null){ + $resultTag = $resultTag->merge($extraTag); + } + $data = new Data($data->getName(), $data->getMeta(), $data->getBlock(), $resultTag); + } + return $data; } From be2fe160b330af23d60763118470f0158bbd31ff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 22:52:28 +0100 Subject: [PATCH 0158/1858] Throw a more specific exception on unknown block IDs --- .../block/BlockStateDeserializeException.php | 2 +- .../BlockStateToBlockObjectDeserializer.php | 2 +- .../UnsupportedBlockStateException.php | 30 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/data/bedrock/block/convert/UnsupportedBlockStateException.php diff --git a/src/data/bedrock/block/BlockStateDeserializeException.php b/src/data/bedrock/block/BlockStateDeserializeException.php index fbe0186ef5..fe6b42a7fd 100644 --- a/src/data/bedrock/block/BlockStateDeserializeException.php +++ b/src/data/bedrock/block/BlockStateDeserializeException.php @@ -23,6 +23,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; -final class BlockStateDeserializeException extends \RuntimeException{ +class BlockStateDeserializeException extends \RuntimeException{ } diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8c31103557..1cece64033 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -2534,7 +2534,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize public function deserializeBlock(BlockStateData $blockStateData) : Block{ $id = $blockStateData->getName(); if(!array_key_exists($id, $this->deserializeFuncs)){ - throw new BlockStateDeserializeException("Unknown block ID \"$id\""); + throw new UnsupportedBlockStateException("Unknown block ID \"$id\""); } $reader = new Reader($blockStateData); $block = $this->deserializeFuncs[$id]($reader); diff --git a/src/data/bedrock/block/convert/UnsupportedBlockStateException.php b/src/data/bedrock/block/convert/UnsupportedBlockStateException.php new file mode 100644 index 0000000000..5350f45cf7 --- /dev/null +++ b/src/data/bedrock/block/convert/UnsupportedBlockStateException.php @@ -0,0 +1,30 @@ + Date: Fri, 24 Jun 2022 23:19:37 +0100 Subject: [PATCH 0159/1858] 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 785d59afdd..25e48ac60b 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 427b0b8e71..a5b2e35e8d 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 a003614166..5d476ff8f5 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 bcd8621ad2..8979622ba7 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 3cc59ae780..d785bca1c5 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 7ce2fa70ba..80851c1310 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 3bb42560f3..ed77833bb2 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 c75d7d785c..9a9fad9d98 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 89aa0221d2..5bf58b47c2 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 ec45b6ab70..f71d4bbb17 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 4c69e535f1..247bdb7486 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 c1840502ee..20b1d802e9 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 967e0d4f05..6e45df5593 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 ad79d35ca1..56b9129a3f 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 f35684c1ba..770b8fcfe3 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 a0dde73c86..75b9220b91 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 7c99c1531b..5fc73d0889 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 fb2310dcdf..d1e008d0e9 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 59c21e1b6b..55a0591ca1 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 8c01c29cc9..b21af5e635 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 7e16ee4f6d..7f07be3085 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 340c610b11..b70532c3ff 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 6bbd50b731..7cb301b2cf 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 e29591b3d5..2075af358b 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 c2f01c92c3..f7823a8eb5 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 c13df4b6ab..01c7040a4c 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 e3eb0a4862..ad4d95810e 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 8197f1415b..d926000aa9 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 0c4afdb659..6f3654ca5d 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 517e77e58e..14d363794f 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 1e950c7914..ffe5e5f16a 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 4f957da723..e9c69b1fc4 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 d980b63af8..f0b28c26de 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 cf1ec00393..e71206b567 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 6e1ad13f0e..8dfb3f6f76 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 fefd49b6c9..0cec6374ec 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 ba8f314630..b9da2f33a5 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 d2ac152afe..5e0074477c 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 8572adf73c..d1515eef93 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 13e4a6c9de..5615d15d89 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 69764b9004..fd25284cd5 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 065caf589f..e6addea5cd 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 f5a81c5245..1bb6191aa8 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 1787e51ae2..b782d5dbb1 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 e47598ac5a..6fdd2cb635 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 618862b9b6..320fd1ce7d 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 93e0aa3d63..6fbda8eea3 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 3e7a7378a7..1f77323a00 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 fcf2be061e..ad70405ad1 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 0c2fb31efc..ec54070f33 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 58a0f7304e..4a753db521 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 e94c5c706e..7f8e731053 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 c9dfe76bb3..bf006d30e6 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 7087df5d44..e3aca2a520 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 b96a0d3800..88314eaf01 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 9c5f830f74..e75594ece9 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 398b4c4681..0d94449e08 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 0a30d35f40..b07644fa51 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 ea3feba480..4b5ae94d67 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 820a0e5f89..f2a22a7441 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 c7396d1196..8abb70a217 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 5507881f5f..de84d7445b 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 1557634a84..29946ee474 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 2fbd0b2598..ed6fe01a6b 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 b5de4898ba..78d5d282c5 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 e744c1849b..aff8ec32eb 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 9b5c8671dd..1c4e87b59d 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 39917aded5..b2e3047653 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 de8cefeb80..b602555acc 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 72750e000d..98c89f89cc 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 4ad9c5ce40..205583b41b 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 b96a29850f..3495027afc 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 f3b21a5b8b..c39e0de84c 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 4e65b5eeb8..193d177998 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 eb69c64c05..f5ee824bb3 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 422d38dde5..ad9ed24af1 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 4514991db9..38c43f79b5 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 8d07bc0a37..e805e91cfe 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 5913841827..e3915807df 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 ea9f213d3b..8054730872 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 6ffc68be0d..ab188c53a7 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 e16b00236b..f31e95d2ce 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 37c88012f9..8d9642987e 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 18c840b52c..51726bcff4 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 308f354a33..3fdfc9a4d4 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 561e36e37d..18dea8793a 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 ded081bccf..d9e3ed95da 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 054737d749..61d4d58c9a 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 504ae68eb8..bb045c782c 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 87490d7322..b0fc4876ff 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 ec3c5a4942..f5edfd9051 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 921f96e22b..4505bb3666 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 c8c2182567..f3e3b251da 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 67dd947143..5e95803e7a 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 014ad4db0f..07826eae73 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 3fce83b1c0..bdfae50824 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 993f0a0389..b3a563a2e3 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 64707c02da..7a1e784e37 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 2b39731ed1..ec5987346b 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 5fb4a3da1d..0089e5a023 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 0358d26834..0394d60a41 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 0000000000..e1e7bb6895 --- /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 0000000000..c0dba20ef2 --- /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 1d7ae28fae..0000000000 --- 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 0000000000..9b37a8153e --- /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 0000000000..f8f00060db --- /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 232db837f0..0000000000 --- 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 3ed323ca34..908f1bf6ac 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 afeac309c0..7f7f5be8f0 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 2e5941f9c4..4461577390 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 eefc3f427f..13a3d913cb 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 f41efd98a7..0000000000 --- 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 229ed9d0b8..0000000000 --- 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 b38c0ffe5e..3da41373c7 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 044dd7a49d..c65f0c8b92 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 d9b1568958..e35bf35745 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 1cece64033..f210726c4a 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 fc015b358a..0822fe8173 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 5613f85ec8..0c704fe009 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 ba42e40398..905abb208c 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 22f1981678..a7e495a241 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 9df23067a7..7bb358fec9 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 4151d1d2f9..cb706965a7 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 678067c037..ed992133ae 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 d883a7cf33..e2ed3138e5 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 9b1143c953..2dfb004977 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 f3367c8856..423fe0bef9 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 42e4b9c26d..4cbf645d63 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 2633114138..421f657b3a 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 5bf1cb4875..8012facd93 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 5a46cf5894..98e9f703e9 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 813550d4af..29b47b3524 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 b5b39a4b7c..3cda876cd9 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 8e75b0d3bf..61c8624a0f 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 2a89d1e611..f48f8f4faf 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 8fe9c099f9..193905ccec 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 8801686e28..98b2eb9c87 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 d9ddad2090..fe754dc560 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 863b844018..27de04b140 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 2075518e09..4f919a396f 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 000dadd678..8440dbd470 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 28ab73c941..d3898b7347 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 6412e6ab0e..5457533670 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 3e090a9054..d3483d36b7 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 0286788c24..d9bbbfae2e 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 f94081f22a..a2dda48222 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 5e0e84ef6c..edff9f7927 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 3d171bd04c..33232f5533 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 f191670c0a..5817355031 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()); } } } From 5f7521027e4d57fff612c8564dbeb352ae27f5fc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:24:03 +0100 Subject: [PATCH 0160/1858] FlowerPot: remove usage of legacy variant --- src/block/FlowerPot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index fd25284cd5..e4dc03fb2c 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -83,7 +83,7 @@ class FlowerPot extends Flowable{ $block instanceof Flower || $block instanceof RedMushroom || $block instanceof Sapling || - ($block instanceof TallGrass && $block->getIdInfo()->getLegacyVariant() === BlockLegacyMetadata::TALLGRASS_FERN); //TODO: clean up + ($block instanceof TallGrass && $block->getTypeId() === BlockTypeIds::LARGE_FERN); //TODO: bamboo } From 1bce583cf3e8ae397a48e49698e93edd29b87822 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:31:05 +0100 Subject: [PATCH 0161/1858] Removed BlockIdentifierFlattened this was necessary to inform BlockFactory of how to map blocks with multiple IDs; this is no longer necessary under the revamped system --- src/block/BlockFactory.php | 27 +++++----- src/block/BlockIdentifier.php | 8 --- src/block/BlockIdentifierFlattened.php | 68 -------------------------- src/block/BlockLegacyIdHelper.php | 19 ++++--- 4 files changed, 22 insertions(+), 100 deletions(-) delete mode 100644 src/block/BlockIdentifierFlattened.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index f71d4bbb17..ee545e4c02 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockIdentifierFlattened as BIDFlattened; use pocketmine\block\BlockLegacyIds as LegacyIds; use pocketmine\block\BlockLegacyMetadata as Meta; use pocketmine\block\BlockToolType as ToolType; @@ -161,7 +160,7 @@ class BlockFactory{ $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 DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, LegacyIds::DAYLIGHT_DETECTOR, 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)); @@ -205,9 +204,9 @@ class BlockFactory{ $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()))); + $this->register(new Furnace(new BID(Ids::FURNACE, LegacyIds::FURNACE, 0, null, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, LegacyIds::BLAST_FURNACE, 0, null, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::SMOKER, LegacyIds::SMOKER, 0, null, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $glassBreakInfo = new BreakInfo(0.3); $this->register(new Glass(new BID(Ids::GLASS, LegacyIds::GLASS, 0), "Glass", $glassBreakInfo)); @@ -250,7 +249,7 @@ class BlockFactory{ $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 Lava(new BID(Ids::LAVA, LegacyIds::FLOWING_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))); @@ -311,11 +310,11 @@ class BlockFactory{ $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 RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, LegacyIds::UNPOWERED_COMPARATOR, 0, ItemIds::COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP, LegacyIds::REDSTONE_LAMP, 0), "Redstone Lamp", new BreakInfo(0.3))); + $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE, LegacyIds::REDSTONE_ORE, 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER, LegacyIds::UNPOWERED_REPEATER, 0, ItemIds::REPEATER), "Redstone Repeater", BreakInfo::instant())); + $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH, LegacyIds::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())); @@ -436,7 +435,7 @@ class BlockFactory{ $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 Water(new BID(Ids::WATER, LegacyIds::FLOWING_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()); @@ -563,12 +562,12 @@ class BlockFactory{ BreakInfo::instant(), )); $this->register(new FloorCoralFan( - new BlockIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, [LegacyIds::CORAL_FAN_DEAD], 0, ItemIds::CORAL_FAN), + new BID(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, ItemIds::CORAL_FAN), "Coral Fan", BreakInfo::instant(), )); $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), + new BID(Ids::WALL_CORAL_FAN, LegacyIds::CORAL_FAN_HANG, 0, ItemIds::CORAL_FAN), "Wall Coral Fan", BreakInfo::instant(), )); diff --git a/src/block/BlockIdentifier.php b/src/block/BlockIdentifier.php index 38f41ab634..c4a809dc97 100644 --- a/src/block/BlockIdentifier.php +++ b/src/block/BlockIdentifier.php @@ -61,14 +61,6 @@ class BlockIdentifier{ return $this->legacyBlockId; } - /** - * @deprecated - * @return int[] - */ - public function getAllLegacyBlockIds() : array{ - return [$this->legacyBlockId]; - } - /** * @deprecated */ diff --git a/src/block/BlockIdentifierFlattened.php b/src/block/BlockIdentifierFlattened.php deleted file mode 100644 index f3dfb919e7..0000000000 --- a/src/block/BlockIdentifierFlattened.php +++ /dev/null @@ -1,68 +0,0 @@ -legacyAdditionalIds = $legacyAdditionalIds; - } - - /** - * @deprecated - */ - public function getAdditionalId(int $index) : int{ - if(!isset($this->legacyAdditionalIds[$index])){ - throw new \InvalidArgumentException("No such ID at index $index"); - } - return $this->legacyAdditionalIds[$index]; - } - - /** - * @deprecated - */ - public function getSecondId() : int{ - return $this->getAdditionalId(0); - } - - /** - * @deprecated - */ - public function getAllLegacyBlockIds() : array{ - return [$this->getLegacyBlockId(), ...$this->legacyAdditionalIds]; - } -} diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index d507158252..c50cb9df90 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockIdentifierFlattened as BIDFlattened; use pocketmine\block\BlockLegacyIds as LegacyIds; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; @@ -59,8 +58,8 @@ final class BlockLegacyIdHelper{ }, LegacyIds::FENCE, $treeType->getMagicNumber()); } - public static function getWoodenSlabIdentifier(TreeType $treeType) : BIDFlattened{ - return new BIDFlattened(match($treeType->id()){ + public static function getWoodenSlabIdentifier(TreeType $treeType) : BID{ + return new BID(match($treeType->id()){ TreeType::OAK()->id() => Ids::OAK_SLAB, TreeType::SPRUCE()->id() => Ids::SPRUCE_SLAB, TreeType::BIRCH()->id() => Ids::BIRCH_SLAB, @@ -68,7 +67,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_SLAB, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::WOODEN_SLAB, [LegacyIds::DOUBLE_WOODEN_SLAB], $treeType->getMagicNumber()); + }, LegacyIds::WOODEN_SLAB, $treeType->getMagicNumber()); } public static function getLogIdentifier(TreeType $treeType) : BID{ @@ -331,16 +330,16 @@ final class BlockLegacyIdHelper{ throw new AssumptionFailedError("Switch should cover all colours"); } - public static function getStoneSlabIdentifier(int $blockTypeId, int $stoneSlabId, int $meta) : BlockIdentifierFlattened{ + public static function getStoneSlabIdentifier(int $blockTypeId, int $stoneSlabId, int $meta) : BID{ $id = [ - 1 => [LegacyIds::STONE_SLAB, LegacyIds::DOUBLE_STONE_SLAB], - 2 => [LegacyIds::STONE_SLAB2, LegacyIds::DOUBLE_STONE_SLAB2], - 3 => [LegacyIds::STONE_SLAB3, LegacyIds::DOUBLE_STONE_SLAB3], - 4 => [LegacyIds::STONE_SLAB4, LegacyIds::DOUBLE_STONE_SLAB4] + 1 => LegacyIds::STONE_SLAB, + 2 => LegacyIds::STONE_SLAB2, + 3 => LegacyIds::STONE_SLAB3, + 4 => LegacyIds::STONE_SLAB4 ][$stoneSlabId] ?? null; if($id === null){ throw new \InvalidArgumentException("Stone slab type should be 1, 2, 3 or 4"); } - return new BlockIdentifierFlattened($blockTypeId, $id[0], [$id[1]], $meta); + return new BID($blockTypeId, $id, $meta); } } From 61da920db015da2df8721f5562b59a9cb8ba6ec4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:33:18 +0100 Subject: [PATCH 0162/1858] Fixed consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index a2dda48222..c4bd93b4d3 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"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 +{"knownStates":{"641024":"Activator Rail","641025":"Activator Rail","641026":"Activator Rail","641027":"Activator Rail","641028":"Activator Rail","641029":"Activator Rail","641032":"Activator Rail","641033":"Activator Rail","641034":"Activator Rail","641035":"Activator Rail","641036":"Activator Rail","641037":"Activator Rail","640000":"Air","641472":"Anvil","641473":"Anvil","641474":"Anvil","641476":"Anvil","641477":"Anvil","641478":"Anvil","641480":"Anvil","641481":"Anvil","641482":"Anvil","641484":"Anvil","641485":"Anvil","641486":"Anvil","641600":"Bamboo","641601":"Bamboo","641602":"Bamboo","641604":"Bamboo","641605":"Bamboo","641606":"Bamboo","641608":"Bamboo","641609":"Bamboo","641610":"Bamboo","641612":"Bamboo","641613":"Bamboo","641614":"Bamboo","641664":"Bamboo Sapling","641665":"Bamboo Sapling","641728":"Banner","641729":"Banner","641730":"Banner","641731":"Banner","641732":"Banner","641733":"Banner","641734":"Banner","641735":"Banner","641736":"Banner","641737":"Banner","641738":"Banner","641739":"Banner","641740":"Banner","641741":"Banner","641742":"Banner","641743":"Banner","673856":"Wall Banner","673857":"Wall Banner","673858":"Wall Banner","673859":"Wall Banner","641792":"Barrel","641793":"Barrel","641794":"Barrel","641795":"Barrel","641796":"Barrel","641797":"Barrel","641800":"Barrel","641801":"Barrel","641802":"Barrel","641803":"Barrel","641804":"Barrel","641805":"Barrel","641856":"Barrier","641920":"Beacon","641984":"Bed Block","641985":"Bed Block","641986":"Bed Block","641987":"Bed Block","641988":"Bed Block","641989":"Bed Block","641990":"Bed Block","641991":"Bed Block","641992":"Bed Block","641993":"Bed Block","641994":"Bed Block","641995":"Bed Block","641996":"Bed Block","641997":"Bed Block","641998":"Bed Block","641999":"Bed Block","642048":"Bedrock","642049":"Bedrock","642112":"Beetroot Block","642113":"Beetroot Block","642114":"Beetroot Block","642115":"Beetroot Block","642116":"Beetroot Block","642117":"Beetroot Block","642118":"Beetroot Block","642119":"Beetroot Block","642176":"Bell","642177":"Bell","642178":"Bell","642179":"Bell","642180":"Bell","642181":"Bell","642182":"Bell","642183":"Bell","642184":"Bell","642185":"Bell","642186":"Bell","642187":"Bell","642188":"Bell","642189":"Bell","642190":"Bell","642191":"Bell","643392":"Blue Ice","643584":"Bone Block","643585":"Bone Block","643586":"Bone Block","643648":"Bookshelf","643712":"Brewing Stand","643713":"Brewing Stand","643714":"Brewing Stand","643715":"Brewing Stand","643716":"Brewing Stand","643717":"Brewing Stand","643718":"Brewing Stand","643719":"Brewing Stand","643840":"Brick Stairs","643841":"Brick Stairs","643842":"Brick Stairs","643843":"Brick Stairs","643844":"Brick Stairs","643845":"Brick Stairs","643846":"Brick Stairs","643847":"Brick Stairs","643968":"Bricks","644096":"Brown Mushroom","644224":"Cactus","644225":"Cactus","644226":"Cactus","644227":"Cactus","644228":"Cactus","644229":"Cactus","644230":"Cactus","644231":"Cactus","644232":"Cactus","644233":"Cactus","644234":"Cactus","644235":"Cactus","644236":"Cactus","644237":"Cactus","644238":"Cactus","644239":"Cactus","644288":"Cake","644289":"Cake","644290":"Cake","644291":"Cake","644292":"Cake","644293":"Cake","644294":"Cake","644416":"Carrot Block","644417":"Carrot Block","644418":"Carrot Block","644419":"Carrot Block","644420":"Carrot Block","644421":"Carrot Block","644422":"Carrot Block","644423":"Carrot Block","644608":"Chest","644609":"Chest","644610":"Chest","644611":"Chest","644928":"Clay Block","644992":"Coal Block","645056":"Coal Ore","645120":"Cobblestone","662400":"Mossy Cobblestone","645248":"Cobblestone Stairs","645249":"Cobblestone Stairs","645250":"Cobblestone Stairs","645251":"Cobblestone Stairs","645252":"Cobblestone Stairs","645253":"Cobblestone Stairs","645254":"Cobblestone Stairs","645255":"Cobblestone Stairs","662528":"Mossy Cobblestone Stairs","662529":"Mossy Cobblestone Stairs","662530":"Mossy Cobblestone Stairs","662531":"Mossy Cobblestone Stairs","662532":"Mossy Cobblestone Stairs","662533":"Mossy Cobblestone Stairs","662534":"Mossy Cobblestone Stairs","662535":"Mossy Cobblestone Stairs","645376":"Cobweb","645440":"Cocoa Block","645441":"Cocoa Block","645442":"Cocoa Block","645443":"Cocoa Block","645444":"Cocoa Block","645445":"Cocoa Block","645446":"Cocoa Block","645447":"Cocoa Block","645448":"Cocoa Block","645449":"Cocoa Block","645450":"Cocoa Block","645451":"Cocoa Block","645760":"Coral Block","645761":"Coral Block","645762":"Coral Block","645763":"Coral Block","645764":"Coral Block","645768":"Coral Block","645769":"Coral Block","645770":"Coral Block","645771":"Coral Block","645772":"Coral Block","646016":"Crafting Table","647616":"Daylight Sensor","647617":"Daylight Sensor","647618":"Daylight Sensor","647619":"Daylight Sensor","647620":"Daylight Sensor","647621":"Daylight Sensor","647622":"Daylight Sensor","647623":"Daylight Sensor","647624":"Daylight Sensor","647625":"Daylight Sensor","647626":"Daylight Sensor","647627":"Daylight Sensor","647628":"Daylight Sensor","647629":"Daylight Sensor","647630":"Daylight Sensor","647631":"Daylight Sensor","647632":"Daylight Sensor","647633":"Daylight Sensor","647634":"Daylight Sensor","647635":"Daylight Sensor","647636":"Daylight Sensor","647637":"Daylight Sensor","647638":"Daylight Sensor","647639":"Daylight Sensor","647640":"Daylight Sensor","647641":"Daylight Sensor","647642":"Daylight Sensor","647643":"Daylight Sensor","647644":"Daylight Sensor","647645":"Daylight Sensor","647646":"Daylight Sensor","647647":"Daylight Sensor","647680":"Dead Bush","647744":"Detector Rail","647745":"Detector Rail","647746":"Detector Rail","647747":"Detector Rail","647748":"Detector Rail","647749":"Detector Rail","647752":"Detector Rail","647753":"Detector Rail","647754":"Detector Rail","647755":"Detector Rail","647756":"Detector Rail","647757":"Detector Rail","647808":"Diamond Block","647872":"Diamond Ore","648192":"Dirt","648193":"Dirt","673216":"Sunflower","673217":"Sunflower","661568":"Lilac","661569":"Lilac","668800":"Rose Bush","668801":"Rose Bush","665088":"Peony","665089":"Peony","648256":"Double Tallgrass","648257":"Double Tallgrass","661120":"Large Fern","661121":"Large Fern","648320":"Dragon Egg","648384":"Dried Kelp Block","656192":"Emerald Block","656256":"Emerald Ore","656320":"Enchanting Table","656384":"End Portal Frame","656385":"End Portal Frame","656386":"End Portal Frame","656387":"End Portal Frame","656388":"End Portal Frame","656389":"End Portal Frame","656390":"End Portal Frame","656391":"End Portal Frame","656448":"End Rod","656449":"End Rod","656450":"End Rod","656451":"End Rod","656452":"End Rod","656453":"End Rod","656512":"End Stone","656768":"End Stone Bricks","656640":"End Stone Brick Stairs","656641":"End Stone Brick Stairs","656642":"End Stone Brick Stairs","656643":"End Stone Brick Stairs","656644":"End Stone Brick Stairs","656645":"End Stone Brick Stairs","656646":"End Stone Brick Stairs","656647":"End Stone Brick Stairs","656832":"Ender Chest","656833":"Ender Chest","656834":"Ender Chest","656835":"Ender Chest","656960":"Farmland","656961":"Farmland","656962":"Farmland","656963":"Farmland","656964":"Farmland","656965":"Farmland","656966":"Farmland","656967":"Farmland","657088":"Fire Block","657089":"Fire Block","657090":"Fire Block","657091":"Fire Block","657092":"Fire Block","657093":"Fire Block","657094":"Fire Block","657095":"Fire Block","657096":"Fire Block","657097":"Fire Block","657098":"Fire Block","657099":"Fire Block","657100":"Fire Block","657101":"Fire Block","657102":"Fire Block","657103":"Fire Block","657152":"Fletching Table","646400":"Dandelion","665920":"Poppy","641152":"Allium","641536":"Azure Bluet","643456":"Blue Orchid","645888":"Cornflower","661632":"Lily of the Valley","664896":"Orange Tulip","664960":"Oxeye Daisy","665216":"Pink Tulip","668224":"Red Tulip","674304":"White Tulip","657216":"Flower Pot","657280":"Frosted Ice","657281":"Frosted Ice","657282":"Frosted Ice","657283":"Frosted Ice","657344":"Furnace","657345":"Furnace","657346":"Furnace","657347":"Furnace","657348":"Furnace","657349":"Furnace","657350":"Furnace","657351":"Furnace","643264":"Blast Furnace","643265":"Blast Furnace","643266":"Blast Furnace","643267":"Blast Furnace","643268":"Blast Furnace","643269":"Blast Furnace","643270":"Blast Furnace","643271":"Blast Furnace","669440":"Smoker","669441":"Smoker","669442":"Smoker","669443":"Smoker","669444":"Smoker","669445":"Smoker","669446":"Smoker","669447":"Smoker","657408":"Glass","657472":"Glass Pane","657536":"Glowing Obsidian","657600":"Glowstone","657664":"Gold Block","657728":"Gold Ore","658048":"Grass","658112":"Grass Path","658176":"Gravel","658432":"Hardened Clay","658496":"Hardened Glass","658560":"Hardened Glass Pane","658624":"Hay Bale","658625":"Hay Bale","658626":"Hay Bale","658688":"Hopper","658690":"Hopper","658691":"Hopper","658692":"Hopper","658693":"Hopper","658696":"Hopper","658698":"Hopper","658699":"Hopper","658700":"Hopper","658701":"Hopper","658752":"Ice","659200":"update!","659264":"ate!upd","659328":"Invisible Bedrock","659392":"Iron Block","659456":"Iron Bars","659520":"Iron Door","659521":"Iron Door","659522":"Iron Door","659523":"Iron Door","659524":"Iron Door","659525":"Iron Door","659526":"Iron Door","659527":"Iron Door","659528":"Iron Door","659529":"Iron Door","659530":"Iron Door","659531":"Iron Door","659532":"Iron Door","659533":"Iron Door","659534":"Iron Door","659535":"Iron Door","659536":"Iron Door","659537":"Iron Door","659538":"Iron Door","659539":"Iron Door","659540":"Iron Door","659541":"Iron Door","659542":"Iron Door","659543":"Iron Door","659544":"Iron Door","659545":"Iron Door","659546":"Iron Door","659547":"Iron Door","659548":"Iron Door","659549":"Iron Door","659550":"Iron Door","659551":"Iron Door","659648":"Iron Trapdoor","659649":"Iron Trapdoor","659650":"Iron Trapdoor","659651":"Iron Trapdoor","659652":"Iron Trapdoor","659653":"Iron Trapdoor","659654":"Iron Trapdoor","659655":"Iron Trapdoor","659656":"Iron Trapdoor","659657":"Iron Trapdoor","659658":"Iron Trapdoor","659659":"Iron Trapdoor","659660":"Iron Trapdoor","659661":"Iron Trapdoor","659662":"Iron Trapdoor","659663":"Iron Trapdoor","659584":"Iron Ore","659712":"Item Frame","659713":"Item Frame","659714":"Item Frame","659715":"Item Frame","659716":"Item Frame","659717":"Item Frame","659718":"Item Frame","659719":"Item Frame","659776":"Jukebox","660864":"Ladder","660865":"Ladder","660866":"Ladder","660867":"Ladder","660928":"Lantern","660929":"Lantern","660992":"Lapis Lazuli Block","661056":"Lapis Lazuli Ore","661184":"Lava","661185":"Lava","661186":"Lava","661187":"Lava","661188":"Lava","661189":"Lava","661190":"Lava","661191":"Lava","661192":"Lava","661193":"Lava","661194":"Lava","661195":"Lava","661196":"Lava","661197":"Lava","661198":"Lava","661199":"Lava","661200":"Lava","661201":"Lava","661202":"Lava","661203":"Lava","661204":"Lava","661205":"Lava","661206":"Lava","661207":"Lava","661208":"Lava","661209":"Lava","661210":"Lava","661211":"Lava","661212":"Lava","661213":"Lava","661214":"Lava","661215":"Lava","661248":"Lectern","661249":"Lectern","661250":"Lectern","661251":"Lectern","661252":"Lectern","661253":"Lectern","661254":"Lectern","661255":"Lectern","661376":"Lever","661377":"Lever","661378":"Lever","661379":"Lever","661380":"Lever","661381":"Lever","661382":"Lever","661383":"Lever","661384":"Lever","661385":"Lever","661386":"Lever","661387":"Lever","661388":"Lever","661389":"Lever","661390":"Lever","661391":"Lever","661888":"Loom","661889":"Loom","661890":"Loom","661891":"Loom","662016":"Magma Block","662144":"Melon Block","662208":"Melon Stem","662209":"Melon Stem","662210":"Melon Stem","662211":"Melon Stem","662212":"Melon Stem","662213":"Melon Stem","662214":"Melon Stem","662215":"Melon Stem","662336":"Monster Spawner","662976":"Mycelium","663296":"Nether Bricks","667776":"Red Nether Bricks","663040":"Nether Brick Fence","663168":"Nether Brick Stairs","663169":"Nether Brick Stairs","663170":"Nether Brick Stairs","663171":"Nether Brick Stairs","663172":"Nether Brick Stairs","663173":"Nether Brick Stairs","663174":"Nether Brick Stairs","663175":"Nether Brick Stairs","667648":"Red Nether Brick Stairs","667649":"Red Nether Brick Stairs","667650":"Red Nether Brick Stairs","667651":"Red Nether Brick Stairs","667652":"Red Nether Brick Stairs","667653":"Red Nether Brick Stairs","667654":"Red Nether Brick Stairs","667655":"Red Nether Brick Stairs","663360":"Nether Portal","663361":"Nether Portal","663424":"Nether Quartz Ore","663488":"Nether Reactor Core","663616":"Nether Wart Block","663552":"Nether Wart","663553":"Nether Wart","663554":"Nether Wart","663555":"Nether Wart","663680":"Netherrack","663744":"Note Block","664768":"Obsidian","665024":"Packed Ice","665280":"Podzol","665984":"Potato Block","665985":"Potato Block","665986":"Potato Block","665987":"Potato Block","665988":"Potato Block","665989":"Potato Block","665990":"Potato Block","665991":"Potato Block","666048":"Powered Rail","666049":"Powered Rail","666050":"Powered Rail","666051":"Powered Rail","666052":"Powered Rail","666053":"Powered Rail","666056":"Powered Rail","666057":"Powered Rail","666058":"Powered Rail","666059":"Powered Rail","666060":"Powered Rail","666061":"Powered Rail","666112":"Prismarine","647424":"Dark Prismarine","666176":"Prismarine Bricks","666304":"Prismarine Bricks Stairs","666305":"Prismarine Bricks Stairs","666306":"Prismarine Bricks Stairs","666307":"Prismarine Bricks Stairs","666308":"Prismarine Bricks Stairs","666309":"Prismarine Bricks Stairs","666310":"Prismarine Bricks Stairs","666311":"Prismarine Bricks Stairs","647552":"Dark Prismarine Stairs","647553":"Dark Prismarine Stairs","647554":"Dark Prismarine Stairs","647555":"Dark Prismarine Stairs","647556":"Dark Prismarine Stairs","647557":"Dark Prismarine Stairs","647558":"Dark Prismarine Stairs","647559":"Dark Prismarine Stairs","666432":"Prismarine Stairs","666433":"Prismarine Stairs","666434":"Prismarine Stairs","666435":"Prismarine Stairs","666436":"Prismarine Stairs","666437":"Prismarine Stairs","666438":"Prismarine Stairs","666439":"Prismarine Stairs","666560":"Pumpkin","644480":"Carved Pumpkin","644481":"Carved Pumpkin","644482":"Carved Pumpkin","644483":"Carved Pumpkin","661824":"Jack o'Lantern","661825":"Jack o'Lantern","661826":"Jack o'Lantern","661827":"Jack o'Lantern","666624":"Pumpkin Stem","666625":"Pumpkin Stem","666626":"Pumpkin Stem","666627":"Pumpkin Stem","666628":"Pumpkin Stem","666629":"Pumpkin Stem","666630":"Pumpkin Stem","666631":"Pumpkin Stem","666816":"Purpur Block","666880":"Purpur Pillar","666881":"Purpur Pillar","666882":"Purpur Pillar","667008":"Purpur Stairs","667009":"Purpur Stairs","667010":"Purpur Stairs","667011":"Purpur Stairs","667012":"Purpur Stairs","667013":"Purpur Stairs","667014":"Purpur Stairs","667015":"Purpur Stairs","667072":"Quartz Block","644672":"Chiseled Quartz Block","644673":"Chiseled Quartz Block","644674":"Chiseled Quartz Block","667136":"Quartz Pillar","667137":"Quartz Pillar","667138":"Quartz Pillar","669504":"Smooth Quartz Block","667264":"Quartz Stairs","667265":"Quartz Stairs","667266":"Quartz Stairs","667267":"Quartz Stairs","667268":"Quartz Stairs","667269":"Quartz Stairs","667270":"Quartz Stairs","667271":"Quartz Stairs","669632":"Smooth Quartz Stairs","669633":"Smooth Quartz Stairs","669634":"Smooth Quartz Stairs","669635":"Smooth Quartz Stairs","669636":"Smooth Quartz Stairs","669637":"Smooth Quartz Stairs","669638":"Smooth Quartz Stairs","669639":"Smooth Quartz Stairs","667328":"Rail","667329":"Rail","667330":"Rail","667331":"Rail","667332":"Rail","667333":"Rail","667334":"Rail","667335":"Rail","667336":"Rail","667337":"Rail","667456":"Red Mushroom","668288":"Redstone Block","668352":"Redstone Comparator","668353":"Redstone Comparator","668354":"Redstone Comparator","668355":"Redstone Comparator","668356":"Redstone Comparator","668357":"Redstone Comparator","668358":"Redstone Comparator","668359":"Redstone Comparator","668360":"Redstone Comparator","668361":"Redstone Comparator","668362":"Redstone Comparator","668363":"Redstone Comparator","668364":"Redstone Comparator","668365":"Redstone Comparator","668366":"Redstone Comparator","668367":"Redstone Comparator","668416":"Redstone Lamp","668417":"Redstone Lamp","668480":"Redstone Ore","668481":"Redstone Ore","668544":"Redstone Repeater","668545":"Redstone Repeater","668546":"Redstone Repeater","668547":"Redstone Repeater","668548":"Redstone Repeater","668549":"Redstone Repeater","668550":"Redstone Repeater","668551":"Redstone Repeater","668552":"Redstone Repeater","668553":"Redstone Repeater","668554":"Redstone Repeater","668555":"Redstone Repeater","668556":"Redstone Repeater","668557":"Redstone Repeater","668558":"Redstone Repeater","668559":"Redstone Repeater","668560":"Redstone Repeater","668561":"Redstone Repeater","668562":"Redstone Repeater","668563":"Redstone Repeater","668564":"Redstone Repeater","668565":"Redstone Repeater","668566":"Redstone Repeater","668567":"Redstone Repeater","668568":"Redstone Repeater","668569":"Redstone Repeater","668570":"Redstone Repeater","668571":"Redstone Repeater","668572":"Redstone Repeater","668573":"Redstone Repeater","668574":"Redstone Repeater","668575":"Redstone Repeater","668609":"Redstone Torch","668610":"Redstone Torch","668611":"Redstone Torch","668612":"Redstone Torch","668613":"Redstone Torch","668617":"Redstone Torch","668618":"Redstone Torch","668619":"Redstone Torch","668620":"Redstone Torch","668621":"Redstone Torch","668672":"Redstone","668673":"Redstone","668674":"Redstone","668675":"Redstone","668676":"Redstone","668677":"Redstone","668678":"Redstone","668679":"Redstone","668680":"Redstone","668681":"Redstone","668682":"Redstone","668683":"Redstone","668684":"Redstone","668685":"Redstone","668686":"Redstone","668687":"Redstone","668736":"reserved6","668864":"Sand","667840":"Red Sand","669184":"Sea Lantern","669248":"Sea Pickle","669249":"Sea Pickle","669250":"Sea Pickle","669251":"Sea Pickle","669252":"Sea Pickle","669253":"Sea Pickle","669254":"Sea Pickle","669255":"Sea Pickle","662273":"Mob Head","662274":"Mob Head","662275":"Mob Head","662276":"Mob Head","662277":"Mob Head","669376":"Slime Block","670208":"Snow Block","670272":"Snow Layer","670273":"Snow Layer","670274":"Snow Layer","670275":"Snow Layer","670276":"Snow Layer","670277":"Snow Layer","670278":"Snow Layer","670279":"Snow Layer","670336":"Soul Sand","670400":"Sponge","670401":"Sponge","669312":"Shulker Box","671744":"Stone","641216":"Andesite","647936":"Diorite","657792":"Granite","665344":"Polished Andesite","665536":"Polished Diorite","665728":"Polished Granite","672000":"Stone Bricks","662848":"Mossy Stone Bricks","645952":"Cracked Stone Bricks","644864":"Chiseled Stone Bricks","659072":"Infested Stone","659136":"Infested Stone Brick","658880":"Infested Cobblestone","659008":"Infested Mossy Stone Brick","658944":"Infested Cracked Stone Brick","658816":"Infested Chiseled Stone Brick","672256":"Stone Stairs","672257":"Stone Stairs","672258":"Stone Stairs","672259":"Stone Stairs","672260":"Stone Stairs","672261":"Stone Stairs","672262":"Stone Stairs","672263":"Stone Stairs","670080":"Smooth Stone","641344":"Andesite Stairs","641345":"Andesite Stairs","641346":"Andesite Stairs","641347":"Andesite Stairs","641348":"Andesite Stairs","641349":"Andesite Stairs","641350":"Andesite Stairs","641351":"Andesite Stairs","648064":"Diorite Stairs","648065":"Diorite Stairs","648066":"Diorite Stairs","648067":"Diorite Stairs","648068":"Diorite Stairs","648069":"Diorite Stairs","648070":"Diorite Stairs","648071":"Diorite Stairs","657920":"Granite Stairs","657921":"Granite Stairs","657922":"Granite Stairs","657923":"Granite Stairs","657924":"Granite Stairs","657925":"Granite Stairs","657926":"Granite Stairs","657927":"Granite Stairs","665472":"Polished Andesite Stairs","665473":"Polished Andesite Stairs","665474":"Polished Andesite Stairs","665475":"Polished Andesite Stairs","665476":"Polished Andesite Stairs","665477":"Polished Andesite Stairs","665478":"Polished Andesite Stairs","665479":"Polished Andesite Stairs","665664":"Polished Diorite Stairs","665665":"Polished Diorite Stairs","665666":"Polished Diorite Stairs","665667":"Polished Diorite Stairs","665668":"Polished Diorite Stairs","665669":"Polished Diorite Stairs","665670":"Polished Diorite Stairs","665671":"Polished Diorite Stairs","665856":"Polished Granite Stairs","665857":"Polished Granite Stairs","665858":"Polished Granite Stairs","665859":"Polished Granite Stairs","665860":"Polished Granite Stairs","665861":"Polished Granite Stairs","665862":"Polished Granite Stairs","665863":"Polished Granite Stairs","671872":"Stone Brick Stairs","671873":"Stone Brick Stairs","671874":"Stone Brick Stairs","671875":"Stone Brick Stairs","671876":"Stone Brick Stairs","671877":"Stone Brick Stairs","671878":"Stone Brick Stairs","671879":"Stone Brick Stairs","662720":"Mossy Stone Brick Stairs","662721":"Mossy Stone Brick Stairs","662722":"Mossy Stone Brick Stairs","662723":"Mossy Stone Brick Stairs","662724":"Mossy Stone Brick Stairs","662725":"Mossy Stone Brick Stairs","662726":"Mossy Stone Brick Stairs","662727":"Mossy Stone Brick Stairs","672064":"Stone Button","672065":"Stone Button","672066":"Stone Button","672067":"Stone Button","672068":"Stone Button","672069":"Stone Button","672072":"Stone Button","672073":"Stone Button","672074":"Stone Button","672075":"Stone Button","672076":"Stone Button","672077":"Stone Button","672320":"Stonecutter","672321":"Stonecutter","672322":"Stonecutter","672323":"Stonecutter","672128":"Stone Pressure Plate","672129":"Stone Pressure Plate","643776":"Brick Slab","643777":"Brick Slab","643778":"Brick Slab","645184":"Cobblestone Slab","645185":"Cobblestone Slab","645186":"Cobblestone Slab","656896":"Fake Wooden Slab","656897":"Fake Wooden Slab","656898":"Fake Wooden Slab","663104":"Nether Brick Slab","663105":"Nether Brick Slab","663106":"Nether Brick Slab","667200":"Quartz Slab","667201":"Quartz Slab","667202":"Quartz Slab","668992":"Sandstone Slab","668993":"Sandstone Slab","668994":"Sandstone Slab","670144":"Smooth Stone Slab","670145":"Smooth Stone Slab","670146":"Smooth Stone Slab","671808":"Stone Brick Slab","671809":"Stone Brick Slab","671810":"Stone Brick Slab","647488":"Dark Prismarine Slab","647489":"Dark Prismarine Slab","647490":"Dark Prismarine Slab","662464":"Mossy Cobblestone Slab","662465":"Mossy Cobblestone Slab","662466":"Mossy Cobblestone Slab","666368":"Prismarine Slab","666369":"Prismarine Slab","666370":"Prismarine Slab","666240":"Prismarine Bricks Slab","666241":"Prismarine Bricks Slab","666242":"Prismarine Bricks Slab","666944":"Purpur Slab","666945":"Purpur Slab","666946":"Purpur Slab","667584":"Red Nether Brick Slab","667585":"Red Nether Brick Slab","667586":"Red Nether Brick Slab","667968":"Red Sandstone Slab","667969":"Red Sandstone Slab","667970":"Red Sandstone Slab","669952":"Smooth Sandstone Slab","669953":"Smooth Sandstone Slab","669954":"Smooth Sandstone Slab","641280":"Andesite Slab","641281":"Andesite Slab","641282":"Andesite Slab","648000":"Diorite Slab","648001":"Diorite Slab","648002":"Diorite Slab","656576":"End Stone Brick Slab","656577":"End Stone Brick Slab","656578":"End Stone Brick Slab","657856":"Granite Slab","657857":"Granite Slab","657858":"Granite Slab","665408":"Polished Andesite Slab","665409":"Polished Andesite Slab","665410":"Polished Andesite Slab","665600":"Polished Diorite Slab","665601":"Polished Diorite Slab","665602":"Polished Diorite Slab","665792":"Polished Granite Slab","665793":"Polished Granite Slab","665794":"Polished Granite Slab","669760":"Smooth Red Sandstone Slab","669761":"Smooth Red Sandstone Slab","669762":"Smooth Red Sandstone Slab","646144":"Cut Red Sandstone Slab","646145":"Cut Red Sandstone Slab","646146":"Cut Red Sandstone Slab","646272":"Cut Sandstone Slab","646273":"Cut Sandstone Slab","646274":"Cut Sandstone Slab","662656":"Mossy Stone Brick Slab","662657":"Mossy Stone Brick Slab","662658":"Mossy Stone Brick Slab","669568":"Smooth Quartz Slab","669569":"Smooth Quartz Slab","669570":"Smooth Quartz Slab","672192":"Stone Slab","672193":"Stone Slab","672194":"Stone Slab","661312":"Legacy Stonecutter","673152":"Sugarcane","673153":"Sugarcane","673154":"Sugarcane","673155":"Sugarcane","673156":"Sugarcane","673157":"Sugarcane","673158":"Sugarcane","673159":"Sugarcane","673160":"Sugarcane","673161":"Sugarcane","673162":"Sugarcane","673163":"Sugarcane","673164":"Sugarcane","673165":"Sugarcane","673166":"Sugarcane","673167":"Sugarcane","673280":"Sweet Berry Bush","673281":"Sweet Berry Bush","673282":"Sweet Berry Bush","673283":"Sweet Berry Bush","673408":"TNT","673409":"TNT","673410":"TNT","673411":"TNT","657024":"Fern","673344":"Tall Grass","643521":"Blue Torch","643522":"Blue Torch","643523":"Blue Torch","643524":"Blue Torch","643525":"Blue Torch","666753":"Purple Torch","666754":"Purple Torch","666755":"Purple Torch","666756":"Purple Torch","666757":"Purple Torch","668161":"Red Torch","668162":"Red Torch","668163":"Red Torch","668164":"Red Torch","668165":"Red Torch","658369":"Green Torch","658370":"Green Torch","658371":"Green Torch","658372":"Green Torch","658373":"Green Torch","673473":"Torch","673474":"Torch","673475":"Torch","673476":"Torch","673477":"Torch","673536":"Trapped Chest","673537":"Trapped Chest","673538":"Trapped Chest","673539":"Trapped Chest","673600":"Tripwire","673601":"Tripwire","673602":"Tripwire","673603":"Tripwire","673604":"Tripwire","673605":"Tripwire","673606":"Tripwire","673607":"Tripwire","673608":"Tripwire","673609":"Tripwire","673610":"Tripwire","673611":"Tripwire","673612":"Tripwire","673613":"Tripwire","673614":"Tripwire","673615":"Tripwire","673664":"Tripwire Hook","673665":"Tripwire Hook","673666":"Tripwire Hook","673667":"Tripwire Hook","673668":"Tripwire Hook","673669":"Tripwire Hook","673670":"Tripwire Hook","673671":"Tripwire Hook","673672":"Tripwire Hook","673673":"Tripwire Hook","673674":"Tripwire Hook","673675":"Tripwire Hook","673676":"Tripwire Hook","673677":"Tripwire Hook","673678":"Tripwire Hook","673679":"Tripwire Hook","673729":"Underwater Torch","673730":"Underwater Torch","673731":"Underwater Torch","673732":"Underwater Torch","673733":"Underwater Torch","673792":"Vines","673793":"Vines","673794":"Vines","673795":"Vines","673796":"Vines","673797":"Vines","673798":"Vines","673799":"Vines","673800":"Vines","673801":"Vines","673802":"Vines","673803":"Vines","673804":"Vines","673805":"Vines","673806":"Vines","673807":"Vines","673984":"Water","673985":"Water","673986":"Water","673987":"Water","673988":"Water","673989":"Water","673990":"Water","673991":"Water","673992":"Water","673993":"Water","673994":"Water","673995":"Water","673996":"Water","673997":"Water","673998":"Water","673999":"Water","674000":"Water","674001":"Water","674002":"Water","674003":"Water","674004":"Water","674005":"Water","674006":"Water","674007":"Water","674008":"Water","674009":"Water","674010":"Water","674011":"Water","674012":"Water","674013":"Water","674014":"Water","674015":"Water","661696":"Lily Pad","674048":"Weighted Pressure Plate Heavy","674049":"Weighted Pressure Plate Heavy","674050":"Weighted Pressure Plate Heavy","674051":"Weighted Pressure Plate Heavy","674052":"Weighted Pressure Plate Heavy","674053":"Weighted Pressure Plate Heavy","674054":"Weighted Pressure Plate Heavy","674055":"Weighted Pressure Plate Heavy","674056":"Weighted Pressure Plate Heavy","674057":"Weighted Pressure Plate Heavy","674058":"Weighted Pressure Plate Heavy","674059":"Weighted Pressure Plate Heavy","674060":"Weighted Pressure Plate Heavy","674061":"Weighted Pressure Plate Heavy","674062":"Weighted Pressure Plate Heavy","674063":"Weighted Pressure Plate Heavy","674112":"Weighted Pressure Plate Light","674113":"Weighted Pressure Plate Light","674114":"Weighted Pressure Plate Light","674115":"Weighted Pressure Plate Light","674116":"Weighted Pressure Plate Light","674117":"Weighted Pressure Plate Light","674118":"Weighted Pressure Plate Light","674119":"Weighted Pressure Plate Light","674120":"Weighted Pressure Plate Light","674121":"Weighted Pressure Plate Light","674122":"Weighted Pressure Plate Light","674123":"Weighted Pressure Plate Light","674124":"Weighted Pressure Plate Light","674125":"Weighted Pressure Plate Light","674126":"Weighted Pressure Plate Light","674127":"Weighted Pressure Plate Light","674176":"Wheat Block","674177":"Wheat Block","674178":"Wheat Block","674179":"Wheat Block","674180":"Wheat Block","674181":"Wheat Block","674182":"Wheat Block","674183":"Wheat Block","664192":"Oak Planks","664320":"Oak Sapling","664321":"Oak Sapling","663936":"Oak Fence","664448":"Oak Slab","664449":"Oak Slab","664450":"Oak Slab","664064":"Oak Leaves","664065":"Oak Leaves","664066":"Oak Leaves","664067":"Oak Leaves","664128":"Oak Log","664129":"Oak Log","664130":"Oak Log","672896":"Stripped Oak Log","672897":"Stripped Oak Log","672898":"Stripped Oak Log","664704":"Oak Wood","672960":"Stripped Oak Wood","664000":"Oak Fence Gate","664001":"Oak Fence Gate","664002":"Oak Fence Gate","664003":"Oak Fence Gate","664004":"Oak Fence Gate","664005":"Oak Fence Gate","664006":"Oak Fence Gate","664007":"Oak Fence Gate","664008":"Oak Fence Gate","664009":"Oak Fence Gate","664010":"Oak Fence Gate","664011":"Oak Fence Gate","664012":"Oak Fence Gate","664013":"Oak Fence Gate","664014":"Oak Fence Gate","664015":"Oak Fence Gate","664512":"Oak Stairs","664513":"Oak Stairs","664514":"Oak Stairs","664515":"Oak Stairs","664516":"Oak Stairs","664517":"Oak Stairs","664518":"Oak Stairs","664519":"Oak Stairs","663872":"Oak Door","663873":"Oak Door","663874":"Oak Door","663875":"Oak Door","663876":"Oak Door","663877":"Oak Door","663878":"Oak Door","663879":"Oak Door","663880":"Oak Door","663881":"Oak Door","663882":"Oak Door","663883":"Oak Door","663884":"Oak Door","663885":"Oak Door","663886":"Oak Door","663887":"Oak Door","663888":"Oak Door","663889":"Oak Door","663890":"Oak Door","663891":"Oak Door","663892":"Oak Door","663893":"Oak Door","663894":"Oak Door","663895":"Oak Door","663896":"Oak Door","663897":"Oak Door","663898":"Oak Door","663899":"Oak Door","663900":"Oak Door","663901":"Oak Door","663902":"Oak Door","663903":"Oak Door","663808":"Oak Button","663809":"Oak Button","663810":"Oak Button","663811":"Oak Button","663812":"Oak Button","663813":"Oak Button","663816":"Oak Button","663817":"Oak Button","663818":"Oak Button","663819":"Oak Button","663820":"Oak Button","663821":"Oak Button","664256":"Oak Pressure Plate","664257":"Oak Pressure Plate","664576":"Oak Trapdoor","664577":"Oak Trapdoor","664578":"Oak Trapdoor","664579":"Oak Trapdoor","664580":"Oak Trapdoor","664581":"Oak Trapdoor","664582":"Oak Trapdoor","664583":"Oak Trapdoor","664584":"Oak Trapdoor","664585":"Oak Trapdoor","664586":"Oak Trapdoor","664587":"Oak Trapdoor","664588":"Oak Trapdoor","664589":"Oak Trapdoor","664590":"Oak Trapdoor","664591":"Oak Trapdoor","664384":"Oak Sign","664385":"Oak Sign","664386":"Oak Sign","664387":"Oak Sign","664388":"Oak Sign","664389":"Oak Sign","664390":"Oak Sign","664391":"Oak Sign","664392":"Oak Sign","664393":"Oak Sign","664394":"Oak Sign","664395":"Oak Sign","664396":"Oak Sign","664397":"Oak Sign","664398":"Oak Sign","664399":"Oak Sign","664640":"Oak Wall Sign","664641":"Oak Wall Sign","664642":"Oak Wall Sign","664643":"Oak Wall Sign","670848":"Spruce Planks","670976":"Spruce Sapling","670977":"Spruce Sapling","670592":"Spruce Fence","671104":"Spruce Slab","671105":"Spruce Slab","671106":"Spruce Slab","670720":"Spruce Leaves","670721":"Spruce Leaves","670722":"Spruce Leaves","670723":"Spruce Leaves","670784":"Spruce Log","670785":"Spruce Log","670786":"Spruce Log","673024":"Stripped Spruce Log","673025":"Stripped Spruce Log","673026":"Stripped Spruce Log","671360":"Spruce Wood","673088":"Stripped Spruce Wood","670656":"Spruce Fence Gate","670657":"Spruce Fence Gate","670658":"Spruce Fence Gate","670659":"Spruce Fence Gate","670660":"Spruce Fence Gate","670661":"Spruce Fence Gate","670662":"Spruce Fence Gate","670663":"Spruce Fence Gate","670664":"Spruce Fence Gate","670665":"Spruce Fence Gate","670666":"Spruce Fence Gate","670667":"Spruce Fence Gate","670668":"Spruce Fence Gate","670669":"Spruce Fence Gate","670670":"Spruce Fence Gate","670671":"Spruce Fence Gate","671168":"Spruce Stairs","671169":"Spruce Stairs","671170":"Spruce Stairs","671171":"Spruce Stairs","671172":"Spruce Stairs","671173":"Spruce Stairs","671174":"Spruce Stairs","671175":"Spruce Stairs","670528":"Spruce Door","670529":"Spruce Door","670530":"Spruce Door","670531":"Spruce Door","670532":"Spruce Door","670533":"Spruce Door","670534":"Spruce Door","670535":"Spruce Door","670536":"Spruce Door","670537":"Spruce Door","670538":"Spruce Door","670539":"Spruce Door","670540":"Spruce Door","670541":"Spruce Door","670542":"Spruce Door","670543":"Spruce Door","670544":"Spruce Door","670545":"Spruce Door","670546":"Spruce Door","670547":"Spruce Door","670548":"Spruce Door","670549":"Spruce Door","670550":"Spruce Door","670551":"Spruce Door","670552":"Spruce Door","670553":"Spruce Door","670554":"Spruce Door","670555":"Spruce Door","670556":"Spruce Door","670557":"Spruce Door","670558":"Spruce Door","670559":"Spruce Door","670464":"Spruce Button","670465":"Spruce Button","670466":"Spruce Button","670467":"Spruce Button","670468":"Spruce Button","670469":"Spruce Button","670472":"Spruce Button","670473":"Spruce Button","670474":"Spruce Button","670475":"Spruce Button","670476":"Spruce Button","670477":"Spruce Button","670912":"Spruce Pressure Plate","670913":"Spruce Pressure Plate","671232":"Spruce Trapdoor","671233":"Spruce Trapdoor","671234":"Spruce Trapdoor","671235":"Spruce Trapdoor","671236":"Spruce Trapdoor","671237":"Spruce Trapdoor","671238":"Spruce Trapdoor","671239":"Spruce Trapdoor","671240":"Spruce Trapdoor","671241":"Spruce Trapdoor","671242":"Spruce Trapdoor","671243":"Spruce Trapdoor","671244":"Spruce Trapdoor","671245":"Spruce Trapdoor","671246":"Spruce Trapdoor","671247":"Spruce Trapdoor","671040":"Spruce Sign","671041":"Spruce Sign","671042":"Spruce Sign","671043":"Spruce Sign","671044":"Spruce Sign","671045":"Spruce Sign","671046":"Spruce Sign","671047":"Spruce Sign","671048":"Spruce Sign","671049":"Spruce Sign","671050":"Spruce Sign","671051":"Spruce Sign","671052":"Spruce Sign","671053":"Spruce Sign","671054":"Spruce Sign","671055":"Spruce Sign","671296":"Spruce Wall Sign","671297":"Spruce Wall Sign","671298":"Spruce Wall Sign","671299":"Spruce Wall Sign","642624":"Birch Planks","642752":"Birch Sapling","642753":"Birch Sapling","642368":"Birch Fence","642880":"Birch Slab","642881":"Birch Slab","642882":"Birch Slab","642496":"Birch Leaves","642497":"Birch Leaves","642498":"Birch Leaves","642499":"Birch Leaves","642560":"Birch Log","642561":"Birch Log","642562":"Birch Log","672512":"Stripped Birch Log","672513":"Stripped Birch Log","672514":"Stripped Birch Log","643136":"Birch Wood","672576":"Stripped Birch Wood","642432":"Birch Fence Gate","642433":"Birch Fence Gate","642434":"Birch Fence Gate","642435":"Birch Fence Gate","642436":"Birch Fence Gate","642437":"Birch Fence Gate","642438":"Birch Fence Gate","642439":"Birch Fence Gate","642440":"Birch Fence Gate","642441":"Birch Fence Gate","642442":"Birch Fence Gate","642443":"Birch Fence Gate","642444":"Birch Fence Gate","642445":"Birch Fence Gate","642446":"Birch Fence Gate","642447":"Birch Fence Gate","642944":"Birch Stairs","642945":"Birch Stairs","642946":"Birch Stairs","642947":"Birch Stairs","642948":"Birch Stairs","642949":"Birch Stairs","642950":"Birch Stairs","642951":"Birch Stairs","642304":"Birch Door","642305":"Birch Door","642306":"Birch Door","642307":"Birch Door","642308":"Birch Door","642309":"Birch Door","642310":"Birch Door","642311":"Birch Door","642312":"Birch Door","642313":"Birch Door","642314":"Birch Door","642315":"Birch Door","642316":"Birch Door","642317":"Birch Door","642318":"Birch Door","642319":"Birch Door","642320":"Birch Door","642321":"Birch Door","642322":"Birch Door","642323":"Birch Door","642324":"Birch Door","642325":"Birch Door","642326":"Birch Door","642327":"Birch Door","642328":"Birch Door","642329":"Birch Door","642330":"Birch Door","642331":"Birch Door","642332":"Birch Door","642333":"Birch Door","642334":"Birch Door","642335":"Birch Door","642240":"Birch Button","642241":"Birch Button","642242":"Birch Button","642243":"Birch Button","642244":"Birch Button","642245":"Birch Button","642248":"Birch Button","642249":"Birch Button","642250":"Birch Button","642251":"Birch Button","642252":"Birch Button","642253":"Birch Button","642688":"Birch Pressure Plate","642689":"Birch Pressure Plate","643008":"Birch Trapdoor","643009":"Birch Trapdoor","643010":"Birch Trapdoor","643011":"Birch Trapdoor","643012":"Birch Trapdoor","643013":"Birch Trapdoor","643014":"Birch Trapdoor","643015":"Birch Trapdoor","643016":"Birch Trapdoor","643017":"Birch Trapdoor","643018":"Birch Trapdoor","643019":"Birch Trapdoor","643020":"Birch Trapdoor","643021":"Birch Trapdoor","643022":"Birch Trapdoor","643023":"Birch Trapdoor","642816":"Birch Sign","642817":"Birch Sign","642818":"Birch Sign","642819":"Birch Sign","642820":"Birch Sign","642821":"Birch Sign","642822":"Birch Sign","642823":"Birch Sign","642824":"Birch Sign","642825":"Birch Sign","642826":"Birch Sign","642827":"Birch Sign","642828":"Birch Sign","642829":"Birch Sign","642830":"Birch Sign","642831":"Birch Sign","643072":"Birch Wall Sign","643073":"Birch Wall Sign","643074":"Birch Wall Sign","643075":"Birch Wall Sign","660224":"Jungle Planks","660352":"Jungle Sapling","660353":"Jungle Sapling","659968":"Jungle Fence","660480":"Jungle Slab","660481":"Jungle Slab","660482":"Jungle Slab","660096":"Jungle Leaves","660097":"Jungle Leaves","660098":"Jungle Leaves","660099":"Jungle Leaves","660160":"Jungle Log","660161":"Jungle Log","660162":"Jungle Log","672768":"Stripped Jungle Log","672769":"Stripped Jungle Log","672770":"Stripped Jungle Log","660736":"Jungle Wood","672832":"Stripped Jungle Wood","660032":"Jungle Fence Gate","660033":"Jungle Fence Gate","660034":"Jungle Fence Gate","660035":"Jungle Fence Gate","660036":"Jungle Fence Gate","660037":"Jungle Fence Gate","660038":"Jungle Fence Gate","660039":"Jungle Fence Gate","660040":"Jungle Fence Gate","660041":"Jungle Fence Gate","660042":"Jungle Fence Gate","660043":"Jungle Fence Gate","660044":"Jungle Fence Gate","660045":"Jungle Fence Gate","660046":"Jungle Fence Gate","660047":"Jungle Fence Gate","660544":"Jungle Stairs","660545":"Jungle Stairs","660546":"Jungle Stairs","660547":"Jungle Stairs","660548":"Jungle Stairs","660549":"Jungle Stairs","660550":"Jungle Stairs","660551":"Jungle Stairs","659904":"Jungle Door","659905":"Jungle Door","659906":"Jungle Door","659907":"Jungle Door","659908":"Jungle Door","659909":"Jungle Door","659910":"Jungle Door","659911":"Jungle Door","659912":"Jungle Door","659913":"Jungle Door","659914":"Jungle Door","659915":"Jungle Door","659916":"Jungle Door","659917":"Jungle Door","659918":"Jungle Door","659919":"Jungle Door","659920":"Jungle Door","659921":"Jungle Door","659922":"Jungle Door","659923":"Jungle Door","659924":"Jungle Door","659925":"Jungle Door","659926":"Jungle Door","659927":"Jungle Door","659928":"Jungle Door","659929":"Jungle Door","659930":"Jungle Door","659931":"Jungle Door","659932":"Jungle Door","659933":"Jungle Door","659934":"Jungle Door","659935":"Jungle Door","659840":"Jungle Button","659841":"Jungle Button","659842":"Jungle Button","659843":"Jungle Button","659844":"Jungle Button","659845":"Jungle Button","659848":"Jungle Button","659849":"Jungle Button","659850":"Jungle Button","659851":"Jungle Button","659852":"Jungle Button","659853":"Jungle Button","660288":"Jungle Pressure Plate","660289":"Jungle Pressure Plate","660608":"Jungle Trapdoor","660609":"Jungle Trapdoor","660610":"Jungle Trapdoor","660611":"Jungle Trapdoor","660612":"Jungle Trapdoor","660613":"Jungle Trapdoor","660614":"Jungle Trapdoor","660615":"Jungle Trapdoor","660616":"Jungle Trapdoor","660617":"Jungle Trapdoor","660618":"Jungle Trapdoor","660619":"Jungle Trapdoor","660620":"Jungle Trapdoor","660621":"Jungle Trapdoor","660622":"Jungle Trapdoor","660623":"Jungle Trapdoor","660416":"Jungle Sign","660417":"Jungle Sign","660418":"Jungle Sign","660419":"Jungle Sign","660420":"Jungle Sign","660421":"Jungle Sign","660422":"Jungle Sign","660423":"Jungle Sign","660424":"Jungle Sign","660425":"Jungle Sign","660426":"Jungle Sign","660427":"Jungle Sign","660428":"Jungle Sign","660429":"Jungle Sign","660430":"Jungle Sign","660431":"Jungle Sign","660672":"Jungle Wall Sign","660673":"Jungle Wall Sign","660674":"Jungle Wall Sign","660675":"Jungle Wall Sign","640448":"Acacia Planks","640576":"Acacia Sapling","640577":"Acacia Sapling","640192":"Acacia Fence","640704":"Acacia Slab","640705":"Acacia Slab","640706":"Acacia Slab","640320":"Acacia Leaves","640321":"Acacia Leaves","640322":"Acacia Leaves","640323":"Acacia Leaves","640384":"Acacia Log","640385":"Acacia Log","640386":"Acacia Log","672384":"Stripped Acacia Log","672385":"Stripped Acacia Log","672386":"Stripped Acacia Log","640960":"Acacia Wood","672448":"Stripped Acacia Wood","640256":"Acacia Fence Gate","640257":"Acacia Fence Gate","640258":"Acacia Fence Gate","640259":"Acacia Fence Gate","640260":"Acacia Fence Gate","640261":"Acacia Fence Gate","640262":"Acacia Fence Gate","640263":"Acacia Fence Gate","640264":"Acacia Fence Gate","640265":"Acacia Fence Gate","640266":"Acacia Fence Gate","640267":"Acacia Fence Gate","640268":"Acacia Fence Gate","640269":"Acacia Fence Gate","640270":"Acacia Fence Gate","640271":"Acacia Fence Gate","640768":"Acacia Stairs","640769":"Acacia Stairs","640770":"Acacia Stairs","640771":"Acacia Stairs","640772":"Acacia Stairs","640773":"Acacia Stairs","640774":"Acacia Stairs","640775":"Acacia Stairs","640128":"Acacia Door","640129":"Acacia Door","640130":"Acacia Door","640131":"Acacia Door","640132":"Acacia Door","640133":"Acacia Door","640134":"Acacia Door","640135":"Acacia Door","640136":"Acacia Door","640137":"Acacia Door","640138":"Acacia Door","640139":"Acacia Door","640140":"Acacia Door","640141":"Acacia Door","640142":"Acacia Door","640143":"Acacia Door","640144":"Acacia Door","640145":"Acacia Door","640146":"Acacia Door","640147":"Acacia Door","640148":"Acacia Door","640149":"Acacia Door","640150":"Acacia Door","640151":"Acacia Door","640152":"Acacia Door","640153":"Acacia Door","640154":"Acacia Door","640155":"Acacia Door","640156":"Acacia Door","640157":"Acacia Door","640158":"Acacia Door","640159":"Acacia Door","640064":"Acacia Button","640065":"Acacia Button","640066":"Acacia Button","640067":"Acacia Button","640068":"Acacia Button","640069":"Acacia Button","640072":"Acacia Button","640073":"Acacia Button","640074":"Acacia Button","640075":"Acacia Button","640076":"Acacia Button","640077":"Acacia Button","640512":"Acacia Pressure Plate","640513":"Acacia Pressure Plate","640832":"Acacia Trapdoor","640833":"Acacia Trapdoor","640834":"Acacia Trapdoor","640835":"Acacia Trapdoor","640836":"Acacia Trapdoor","640837":"Acacia Trapdoor","640838":"Acacia Trapdoor","640839":"Acacia Trapdoor","640840":"Acacia Trapdoor","640841":"Acacia Trapdoor","640842":"Acacia Trapdoor","640843":"Acacia Trapdoor","640844":"Acacia Trapdoor","640845":"Acacia Trapdoor","640846":"Acacia Trapdoor","640847":"Acacia Trapdoor","640640":"Acacia Sign","640641":"Acacia Sign","640642":"Acacia Sign","640643":"Acacia Sign","640644":"Acacia Sign","640645":"Acacia Sign","640646":"Acacia Sign","640647":"Acacia Sign","640648":"Acacia Sign","640649":"Acacia Sign","640650":"Acacia Sign","640651":"Acacia Sign","640652":"Acacia Sign","640653":"Acacia Sign","640654":"Acacia Sign","640655":"Acacia Sign","640896":"Acacia Wall Sign","640897":"Acacia Wall Sign","640898":"Acacia Wall Sign","640899":"Acacia Wall Sign","646848":"Dark Oak Planks","646976":"Dark Oak Sapling","646977":"Dark Oak Sapling","646592":"Dark Oak Fence","647104":"Dark Oak Slab","647105":"Dark Oak Slab","647106":"Dark Oak Slab","646720":"Dark Oak Leaves","646721":"Dark Oak Leaves","646722":"Dark Oak Leaves","646723":"Dark Oak Leaves","646784":"Dark Oak Log","646785":"Dark Oak Log","646786":"Dark Oak Log","672640":"Stripped Dark Oak Log","672641":"Stripped Dark Oak Log","672642":"Stripped Dark Oak Log","647360":"Dark Oak Wood","672704":"Stripped Dark Oak Wood","646656":"Dark Oak Fence Gate","646657":"Dark Oak Fence Gate","646658":"Dark Oak Fence Gate","646659":"Dark Oak Fence Gate","646660":"Dark Oak Fence Gate","646661":"Dark Oak Fence Gate","646662":"Dark Oak Fence Gate","646663":"Dark Oak Fence Gate","646664":"Dark Oak Fence Gate","646665":"Dark Oak Fence Gate","646666":"Dark Oak Fence Gate","646667":"Dark Oak Fence Gate","646668":"Dark Oak Fence Gate","646669":"Dark Oak Fence Gate","646670":"Dark Oak Fence Gate","646671":"Dark Oak Fence Gate","647168":"Dark Oak Stairs","647169":"Dark Oak Stairs","647170":"Dark Oak Stairs","647171":"Dark Oak Stairs","647172":"Dark Oak Stairs","647173":"Dark Oak Stairs","647174":"Dark Oak Stairs","647175":"Dark Oak Stairs","646528":"Dark Oak Door","646529":"Dark Oak Door","646530":"Dark Oak Door","646531":"Dark Oak Door","646532":"Dark Oak Door","646533":"Dark Oak Door","646534":"Dark Oak Door","646535":"Dark Oak Door","646536":"Dark Oak Door","646537":"Dark Oak Door","646538":"Dark Oak Door","646539":"Dark Oak Door","646540":"Dark Oak Door","646541":"Dark Oak Door","646542":"Dark Oak Door","646543":"Dark Oak Door","646544":"Dark Oak Door","646545":"Dark Oak Door","646546":"Dark Oak Door","646547":"Dark Oak Door","646548":"Dark Oak Door","646549":"Dark Oak Door","646550":"Dark Oak Door","646551":"Dark Oak Door","646552":"Dark Oak Door","646553":"Dark Oak Door","646554":"Dark Oak Door","646555":"Dark Oak Door","646556":"Dark Oak Door","646557":"Dark Oak Door","646558":"Dark Oak Door","646559":"Dark Oak Door","646464":"Dark Oak Button","646465":"Dark Oak Button","646466":"Dark Oak Button","646467":"Dark Oak Button","646468":"Dark Oak Button","646469":"Dark Oak Button","646472":"Dark Oak Button","646473":"Dark Oak Button","646474":"Dark Oak Button","646475":"Dark Oak Button","646476":"Dark Oak Button","646477":"Dark Oak Button","646912":"Dark Oak Pressure Plate","646913":"Dark Oak Pressure Plate","647232":"Dark Oak Trapdoor","647233":"Dark Oak Trapdoor","647234":"Dark Oak Trapdoor","647235":"Dark Oak Trapdoor","647236":"Dark Oak Trapdoor","647237":"Dark Oak Trapdoor","647238":"Dark Oak Trapdoor","647239":"Dark Oak Trapdoor","647240":"Dark Oak Trapdoor","647241":"Dark Oak Trapdoor","647242":"Dark Oak Trapdoor","647243":"Dark Oak Trapdoor","647244":"Dark Oak Trapdoor","647245":"Dark Oak Trapdoor","647246":"Dark Oak Trapdoor","647247":"Dark Oak Trapdoor","647040":"Dark Oak Sign","647041":"Dark Oak Sign","647042":"Dark Oak Sign","647043":"Dark Oak Sign","647044":"Dark Oak Sign","647045":"Dark Oak Sign","647046":"Dark Oak Sign","647047":"Dark Oak Sign","647048":"Dark Oak Sign","647049":"Dark Oak Sign","647050":"Dark Oak Sign","647051":"Dark Oak Sign","647052":"Dark Oak Sign","647053":"Dark Oak Sign","647054":"Dark Oak Sign","647055":"Dark Oak Sign","647296":"Dark Oak Wall Sign","647297":"Dark Oak Wall Sign","647298":"Dark Oak Wall Sign","647299":"Dark Oak Wall Sign","668032":"Red Sandstone Stairs","668033":"Red Sandstone Stairs","668034":"Red Sandstone Stairs","668035":"Red Sandstone Stairs","668036":"Red Sandstone Stairs","668037":"Red Sandstone Stairs","668038":"Red Sandstone Stairs","668039":"Red Sandstone Stairs","669824":"Smooth Red Sandstone Stairs","669825":"Smooth Red Sandstone Stairs","669826":"Smooth Red Sandstone Stairs","669827":"Smooth Red Sandstone Stairs","669828":"Smooth Red Sandstone Stairs","669829":"Smooth Red Sandstone Stairs","669830":"Smooth Red Sandstone Stairs","669831":"Smooth Red Sandstone Stairs","667904":"Red Sandstone","644736":"Chiseled Red Sandstone","646080":"Cut Red Sandstone","669696":"Smooth Red Sandstone","669056":"Sandstone Stairs","669057":"Sandstone Stairs","669058":"Sandstone Stairs","669059":"Sandstone Stairs","669060":"Sandstone Stairs","669061":"Sandstone Stairs","669062":"Sandstone Stairs","669063":"Sandstone Stairs","670016":"Smooth Sandstone Stairs","670017":"Smooth Sandstone Stairs","670018":"Smooth Sandstone Stairs","670019":"Smooth Sandstone Stairs","670020":"Smooth Sandstone Stairs","670021":"Smooth Sandstone Stairs","670022":"Smooth Sandstone Stairs","670023":"Smooth Sandstone Stairs","668928":"Sandstone","644800":"Chiseled Sandstone","646208":"Cut Sandstone","669888":"Smooth Sandstone","674240":"White Glazed Terracotta","674241":"White Glazed Terracotta","674242":"White Glazed Terracotta","674243":"White Glazed Terracotta","664832":"Orange Glazed Terracotta","664833":"Orange Glazed Terracotta","664834":"Orange Glazed Terracotta","664835":"Orange Glazed Terracotta","661952":"Magenta Glazed Terracotta","661953":"Magenta Glazed Terracotta","661954":"Magenta Glazed Terracotta","661955":"Magenta Glazed Terracotta","661440":"Light Blue Glazed Terracotta","661441":"Light Blue Glazed Terracotta","661442":"Light Blue Glazed Terracotta","661443":"Light Blue Glazed Terracotta","674432":"Yellow Glazed Terracotta","674433":"Yellow Glazed Terracotta","674434":"Yellow Glazed Terracotta","674435":"Yellow Glazed Terracotta","661760":"Lime Glazed Terracotta","661761":"Lime Glazed Terracotta","661762":"Lime Glazed Terracotta","661763":"Lime Glazed Terracotta","665152":"Pink Glazed Terracotta","665153":"Pink Glazed Terracotta","665154":"Pink Glazed Terracotta","665155":"Pink Glazed Terracotta","658240":"Gray Glazed Terracotta","658241":"Gray Glazed Terracotta","658242":"Gray Glazed Terracotta","658243":"Gray Glazed Terracotta","661504":"Light Gray Glazed Terracotta","661505":"Light Gray Glazed Terracotta","661506":"Light Gray Glazed Terracotta","661507":"Light Gray Glazed Terracotta","646336":"Cyan Glazed Terracotta","646337":"Cyan Glazed Terracotta","646338":"Cyan Glazed Terracotta","646339":"Cyan Glazed Terracotta","666688":"Purple Glazed Terracotta","666689":"Purple Glazed Terracotta","666690":"Purple Glazed Terracotta","666691":"Purple Glazed Terracotta","643328":"Blue Glazed Terracotta","643329":"Blue Glazed Terracotta","643330":"Blue Glazed Terracotta","643331":"Blue Glazed Terracotta","644032":"Brown Glazed Terracotta","644033":"Brown Glazed Terracotta","644034":"Brown Glazed Terracotta","644035":"Brown Glazed Terracotta","658304":"Green Glazed Terracotta","658305":"Green Glazed Terracotta","658306":"Green Glazed Terracotta","658307":"Green Glazed Terracotta","667392":"Red Glazed Terracotta","667393":"Red Glazed Terracotta","667394":"Red Glazed Terracotta","667395":"Red Glazed Terracotta","643200":"Black Glazed Terracotta","643201":"Black Glazed Terracotta","643202":"Black Glazed Terracotta","643203":"Black Glazed Terracotta","648448":"Dyed Shulker Box","648449":"Dyed Shulker Box","648450":"Dyed Shulker Box","648451":"Dyed Shulker Box","648452":"Dyed Shulker Box","648453":"Dyed Shulker Box","648454":"Dyed Shulker Box","648455":"Dyed Shulker Box","648456":"Dyed Shulker Box","648457":"Dyed Shulker Box","648458":"Dyed Shulker Box","648459":"Dyed Shulker Box","648460":"Dyed Shulker Box","648461":"Dyed Shulker Box","648462":"Dyed Shulker Box","648463":"Dyed Shulker Box","671488":"Stained Glass","671489":"Stained Glass","671490":"Stained Glass","671491":"Stained Glass","671492":"Stained Glass","671493":"Stained Glass","671494":"Stained Glass","671495":"Stained Glass","671496":"Stained Glass","671497":"Stained Glass","671498":"Stained Glass","671499":"Stained Glass","671500":"Stained Glass","671501":"Stained Glass","671502":"Stained Glass","671503":"Stained Glass","671552":"Stained Glass Pane","671553":"Stained Glass Pane","671554":"Stained Glass Pane","671555":"Stained Glass Pane","671556":"Stained Glass Pane","671557":"Stained Glass Pane","671558":"Stained Glass Pane","671559":"Stained Glass Pane","671560":"Stained Glass Pane","671561":"Stained Glass Pane","671562":"Stained Glass Pane","671563":"Stained Glass Pane","671564":"Stained Glass Pane","671565":"Stained Glass Pane","671566":"Stained Glass Pane","671567":"Stained Glass Pane","671424":"Stained Clay","671425":"Stained Clay","671426":"Stained Clay","671427":"Stained Clay","671428":"Stained Clay","671429":"Stained Clay","671430":"Stained Clay","671431":"Stained Clay","671432":"Stained Clay","671433":"Stained Clay","671434":"Stained Clay","671435":"Stained Clay","671436":"Stained Clay","671437":"Stained Clay","671438":"Stained Clay","671439":"Stained Clay","671616":"Stained Hardened Glass","671617":"Stained Hardened Glass","671618":"Stained Hardened Glass","671619":"Stained Hardened Glass","671620":"Stained Hardened Glass","671621":"Stained Hardened Glass","671622":"Stained Hardened Glass","671623":"Stained Hardened Glass","671624":"Stained Hardened Glass","671625":"Stained Hardened Glass","671626":"Stained Hardened Glass","671627":"Stained Hardened Glass","671628":"Stained Hardened Glass","671629":"Stained Hardened Glass","671630":"Stained Hardened Glass","671631":"Stained Hardened Glass","671680":"Stained Hardened Glass Pane","671681":"Stained Hardened Glass Pane","671682":"Stained Hardened Glass Pane","671683":"Stained Hardened Glass Pane","671684":"Stained Hardened Glass Pane","671685":"Stained Hardened Glass Pane","671686":"Stained Hardened Glass Pane","671687":"Stained Hardened Glass Pane","671688":"Stained Hardened Glass Pane","671689":"Stained Hardened Glass Pane","671690":"Stained Hardened Glass Pane","671691":"Stained Hardened Glass Pane","671692":"Stained Hardened Glass Pane","671693":"Stained Hardened Glass Pane","671694":"Stained Hardened Glass Pane","671695":"Stained Hardened Glass Pane","644352":"Carpet","644353":"Carpet","644354":"Carpet","644355":"Carpet","644356":"Carpet","644357":"Carpet","644358":"Carpet","644359":"Carpet","644360":"Carpet","644361":"Carpet","644362":"Carpet","644363":"Carpet","644364":"Carpet","644365":"Carpet","644366":"Carpet","644367":"Carpet","645568":"Concrete","645569":"Concrete","645570":"Concrete","645571":"Concrete","645572":"Concrete","645573":"Concrete","645574":"Concrete","645575":"Concrete","645576":"Concrete","645577":"Concrete","645578":"Concrete","645579":"Concrete","645580":"Concrete","645581":"Concrete","645582":"Concrete","645583":"Concrete","645632":"Concrete Powder","645633":"Concrete Powder","645634":"Concrete Powder","645635":"Concrete Powder","645636":"Concrete Powder","645637":"Concrete Powder","645638":"Concrete Powder","645639":"Concrete Powder","645640":"Concrete Powder","645641":"Concrete Powder","645642":"Concrete Powder","645643":"Concrete Powder","645644":"Concrete Powder","645645":"Concrete Powder","645646":"Concrete Powder","645647":"Concrete Powder","674368":"Wool","674369":"Wool","674370":"Wool","674371":"Wool","674372":"Wool","674373":"Wool","674374":"Wool","674375":"Wool","674376":"Wool","674377":"Wool","674378":"Wool","674379":"Wool","674380":"Wool","674381":"Wool","674382":"Wool","674383":"Wool","645312":"Cobblestone Wall","641408":"Andesite Wall","643904":"Brick Wall","648128":"Diorite Wall","656704":"End Stone Brick Wall","657984":"Granite Wall","662784":"Mossy Stone Brick Wall","662592":"Mossy Cobblestone Wall","663232":"Nether Brick Wall","666496":"Prismarine Wall","667712":"Red Nether Brick Wall","668096":"Red Sandstone Wall","669120":"Sandstone Wall","671936":"Stone Brick Wall","656000":"???","651392":"Hydrogen","651264":"Helium","651968":"Lithium","649088":"Beryllium","649280":"Boron","649600":"Carbon","652992":"Nitrogen","653248":"Oxygen","650752":"Fluorine","652672":"Neon","654784":"Sodium","652160":"Magnesium","648576":"Aluminum","654656":"Silicon","653376":"Phosphorus","654912":"Sulfur","649792":"Chlorine","648768":"Argon","653632":"Potassium","649472":"Calcium","654464":"Scandium","655552":"Titanium","655744":"Vanadium","649856":"Chromium","652224":"Manganese","651648":"Iron","649920":"Cobalt","652800":"Nickel","650112":"Copper","656064":"Zinc","650944":"Gallium","651008":"Germanium","648832":"Arsenic","654592":"Selenium","649344":"Bromine","651712":"Krypton","654208":"Rubidium","654848":"Strontium","655936":"Yttrium","656128":"Zirconium","652928":"Niobium","652480":"Molybdenum","655040":"Technetium","654272":"Ruthenium","654080":"Rhodium","653312":"Palladium","654720":"Silver","649408":"Cadmium","651456":"Indium","655488":"Tin","648704":"Antimony","655104":"Tellurium","651520":"Iodine","655808":"Xenon","649728":"Cesium","648960":"Barium","651776":"Lanthanum","649664":"Cerium","653696":"Praseodymium","652608":"Neodymium","653760":"Promethium","654400":"Samarium","650560":"Europium","650880":"Gadolinium","655232":"Terbium","650368":"Dysprosium","651328":"Holmium","650496":"Erbium","655424":"Thulium","655872":"Ytterbium","652096":"Lutetium","651136":"Hafnium","654976":"Tantalum","655616":"Tungsten","654016":"Rhenium","653184":"Osmium","651584":"Iridium","653440":"Platinum","651072":"Gold","652416":"Mercury","655296":"Thallium","651904":"Lead","649152":"Bismuth","653568":"Polonium","648896":"Astatine","653952":"Radon","650816":"Francium","653888":"Radium","648512":"Actinium","655360":"Thorium","653824":"Protactinium","655680":"Uranium","652736":"Neptunium","653504":"Plutonium","648640":"Americium","650176":"Curium","649024":"Berkelium","649536":"Californium","650432":"Einsteinium","650624":"Fermium","652352":"Mendelevium","653056":"Nobelium","651840":"Lawrencium","654336":"Rutherfordium","650304":"Dubnium","654528":"Seaborgium","649216":"Bohrium","651200":"Hassium","652288":"Meitnerium","650240":"Darmstadtium","654144":"Roentgenium","650048":"Copernicium","652864":"Nihonium","650688":"Flerovium","652544":"Moscovium","652032":"Livermorium","655168":"Tennessine","653120":"Oganesson","645504":"Compound Creator","645505":"Compound Creator","645506":"Compound Creator","645507":"Compound Creator","649984":"Element Constructor","649985":"Element Constructor","649986":"Element Constructor","649987":"Element Constructor","660800":"Lab Table","660801":"Lab Table","660802":"Lab Table","660803":"Lab Table","662080":"Material Reducer","662081":"Material Reducer","662082":"Material Reducer","662083":"Material Reducer","644544":"Heat Block","644160":"Brown Mushroom Block","644161":"Brown Mushroom Block","644162":"Brown Mushroom Block","644163":"Brown Mushroom Block","644164":"Brown Mushroom Block","644165":"Brown Mushroom Block","644166":"Brown Mushroom Block","644167":"Brown Mushroom Block","644168":"Brown Mushroom Block","644169":"Brown Mushroom Block","644170":"Brown Mushroom Block","667520":"Red Mushroom Block","667521":"Red Mushroom Block","667522":"Red Mushroom Block","667523":"Red Mushroom Block","667524":"Red Mushroom Block","667525":"Red Mushroom Block","667526":"Red Mushroom Block","667527":"Red Mushroom Block","667528":"Red Mushroom Block","667529":"Red Mushroom Block","667530":"Red Mushroom Block","662912":"Mushroom Stem","641088":"All Sided Mushroom Stem","645696":"Coral","645697":"Coral","645698":"Coral","645699":"Coral","645700":"Coral","645704":"Coral","645705":"Coral","645706":"Coral","645707":"Coral","645708":"Coral","645824":"Coral Fan","645825":"Coral Fan","645826":"Coral Fan","645827":"Coral Fan","645828":"Coral Fan","645832":"Coral Fan","645833":"Coral Fan","645834":"Coral Fan","645835":"Coral Fan","645836":"Coral Fan","645840":"Coral Fan","645841":"Coral Fan","645842":"Coral Fan","645843":"Coral Fan","645844":"Coral Fan","645848":"Coral Fan","645849":"Coral Fan","645850":"Coral Fan","645851":"Coral Fan","645852":"Coral Fan","673920":"Wall Coral Fan","673921":"Wall Coral Fan","673922":"Wall Coral Fan","673923":"Wall Coral Fan","673924":"Wall Coral Fan","673928":"Wall Coral Fan","673929":"Wall Coral Fan","673930":"Wall Coral Fan","673931":"Wall Coral Fan","673932":"Wall Coral Fan","673936":"Wall Coral Fan","673937":"Wall Coral Fan","673938":"Wall Coral Fan","673939":"Wall Coral Fan","673940":"Wall Coral Fan","673944":"Wall Coral Fan","673945":"Wall Coral Fan","673946":"Wall Coral Fan","673947":"Wall Coral Fan","673948":"Wall Coral Fan","673952":"Wall Coral Fan","673953":"Wall Coral Fan","673954":"Wall Coral Fan","673955":"Wall Coral Fan","673956":"Wall Coral Fan","673960":"Wall Coral Fan","673961":"Wall Coral Fan","673962":"Wall Coral Fan","673963":"Wall Coral Fan","673964":"Wall Coral Fan","673968":"Wall Coral Fan","673969":"Wall Coral Fan","673970":"Wall Coral Fan","673971":"Wall Coral Fan","673972":"Wall Coral Fan","673976":"Wall Coral Fan","673977":"Wall Coral Fan","673978":"Wall Coral Fan","673979":"Wall Coral Fan","673980":"Wall Coral Fan"},"stateDataBits":6} \ No newline at end of file From 8e002fc1cac5f019df09fd13b9f5e88d7092ab6c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:41:13 +0100 Subject: [PATCH 0163/1858] BlockTest: fixed unintentional use of global BlockFactory --- tests/phpunit/block/BlockTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index d9bbbfae2e..5a8c6b5386 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -114,8 +114,8 @@ class BlockTest extends TestCase{ $oldStateDataSize = $list["stateDataBits"]; self::assertSame($oldStateDataSize, Block::INTERNAL_STATE_DATA_BITS, "Changed number of state data bits - consistency check probably need regenerating"); - $states = BlockFactory::getInstance()->getAllKnownStates(); - foreach(BlockFactory::getInstance()->getAllKnownStates() as $stateId => $state){ + $states = $this->blockFactory->getAllKnownStates(); + foreach($states 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()); } From e3a9324e8d830ce235d9b273cd72afb9192aa69c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:44:55 +0100 Subject: [PATCH 0164/1858] Updated BlockFactory tests to avoid BlockFactory::get() (which is getting ready to die) --- tests/phpunit/block/BlockTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 5a8c6b5386..afc3c78e63 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -54,18 +54,18 @@ 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->getTypeId(), 0)); + self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromFullBlock($block->getStateId())); } /** * Test registering a new block which does not yet exist */ public function testRegisterNewBlock() : void{ - for($i = 0; $i < 256; ++$i){ + for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier(BlockTypeIds::FIRST_UNUSED_BLOCK_ID, $i, 0), "Strange New Block", BlockBreakInfo::instant()); + $b = new StrangeNewBlock(new BlockIdentifier($i, $i, 0), "Strange New Block", BlockBreakInfo::instant()); $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->get($b->getTypeId(), 0)); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromFullBlock($b->getStateId())); return; } } @@ -87,9 +87,9 @@ class BlockTest extends TestCase{ * instances which would hold position data and other things, so it's necessary to clone them to avoid astonishing behaviour. */ public function testBlockFactoryClone() : void{ - for($i = 0; $i < 256; ++$i){ - $b1 = $this->blockFactory->get($i, 0); - $b2 = $this->blockFactory->get($i, 0); + foreach($this->blockFactory->getAllKnownStates() as $k => $state){ + $b1 = $this->blockFactory->fromFullBlock($k); + $b2 = $this->blockFactory->fromFullBlock($k); self::assertNotSame($b1, $b2); } } From b268818eda0d2fe5660c3870e69506258ef343fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 14:02:55 +0100 Subject: [PATCH 0165/1858] ItemFactory: fixed bogus usage of BlockFactory::isRegistered() ItemFactory IDs don't necessarily correspond to BlockFactory ones anymore. --- src/item/ItemFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index ed992133ae..2f6c8e2d21 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -507,7 +507,7 @@ class ItemFactory{ */ public function isRegistered(int $id, int $variant = 0) : bool{ if($id < 256){ - return BlockFactory::getInstance()->isRegistered(self::itemToBlockId($id)); + return GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $variant & 0xf) !== null; } return isset($this->list[self::getListOffset($id, $variant)]); From cac72d73fb1df0a5236a0a83ac66682b5ce58b59 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 14:34:19 +0100 Subject: [PATCH 0166/1858] ItemFactoryTest: remove bogus test case --- tests/phpunit/item/ItemFactoryTest.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/phpunit/item/ItemFactoryTest.php b/tests/phpunit/item/ItemFactoryTest.php index e9f45169ed..a0163f5fe8 100644 --- a/tests/phpunit/item/ItemFactoryTest.php +++ b/tests/phpunit/item/ItemFactoryTest.php @@ -28,15 +28,6 @@ use pocketmine\block\BlockFactory; class ItemFactoryTest extends TestCase{ - /** - * Tests that blocks are considered to be valid registered items - */ - public function testItemBlockRegistered() : void{ - for($id = 0; $id < 256; ++$id){ - self::assertEquals(BlockFactory::getInstance()->isRegistered($id), ItemFactory::getInstance()->isRegistered($id)); - } - } - /** * Test that durable items are correctly created by the item factory */ From 00b4e4016c0238b3b0e499ca07859cef91076aab Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 14:42:32 +0100 Subject: [PATCH 0167/1858] Obliterate BlockLegacyIds --- src/block/BlockFactory.php | 787 +++++++++++++++--------------- src/block/BlockIdentifier.php | 23 +- src/block/BlockLegacyIdHelper.php | 191 ++++---- src/block/BlockLegacyIds.php | 501 ------------------- tests/phpunit/block/BlockTest.php | 7 +- 5 files changed, 498 insertions(+), 1011 deletions(-) delete mode 100644 src/block/BlockLegacyIds.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index ee545e4c02..7af1685228 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockLegacyIds as LegacyIds; use pocketmine\block\BlockLegacyMetadata as Meta; use pocketmine\block\BlockToolType as ToolType; use pocketmine\block\BlockTypeIds as Ids; @@ -106,10 +105,10 @@ class BlockFactory{ public function __construct(){ $railBreakInfo = new BlockBreakInfo(0.7); - $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{ + $this->register(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, ItemIds::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); + $this->register(new Air(new BID(Ids::AIR, ItemIds::AIR, 0), "Air", BreakInfo::indestructible(-1.0))); + $this->register(new Anvil(new BID(Ids::ANVIL, ItemIds::ANVIL, 0), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + $this->register(new Bamboo(new BID(Ids::BAMBOO, ItemIds::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; @@ -117,225 +116,225 @@ class BlockFactory{ return parent::getBreakTime($item); } })); - $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, LegacyIds::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); + $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, ItemIds::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $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->register(new FloorBanner(new BID(Ids::BANNER, ItemIds::BANNER, 0, TileBanner::class), "Banner", $bannerBreakInfo)); + $this->register(new WallBanner(new BID(Ids::WALL_BANNER, ItemIds::BANNER, 0, TileBanner::class), "Wall Banner", $bannerBreakInfo)); + $this->register(new Barrel(new BID(Ids::BARREL, ItemIds::BARREL, 0, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Transparent(new BID(Ids::BARRIER, ItemIds::BARRIER, 0), "Barrier", BreakInfo::indestructible())); + $this->register(new Beacon(new BID(Ids::BEACON, ItemIds::BEACON, 0, TileBeacon::class), "Beacon", new BreakInfo(3.0))); + $this->register(new Bed(new BID(Ids::BED, ItemIds::BED, 0, TileBed::class), "Bed Block", new BreakInfo(0.2))); + $this->register(new Bedrock(new BID(Ids::BEDROCK, ItemIds::BEDROCK, 0), "Bedrock", BreakInfo::indestructible())); - $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()))); + $this->register(new Beetroot(new BID(Ids::BEETROOTS, ItemIds::BEETROOT_BLOCK, 0), "Beetroot Block", BreakInfo::instant())); + $this->register(new Bell(new BID(Ids::BELL, ItemIds::BELL, 0, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new BlueIce(new BID(Ids::BLUE_ICE, ItemIds::BLUE_ICE, 0), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); + $this->register(new BoneBlock(new BID(Ids::BONE_BLOCK, ItemIds::BONE_BLOCK, 0), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Bookshelf(new BID(Ids::BOOKSHELF, ItemIds::BOOKSHELF, 0), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); + $this->register(new BrewingStand(new BID(Ids::BREWING_STAND, ItemIds::BREWING_STAND, 0, 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->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->register(new Stair(new BID(Ids::BRICK_STAIRS, ItemIds::BRICK_STAIRS, 0), "Brick Stairs", $bricksBreakInfo)); + $this->register(new Opaque(new BID(Ids::BRICKS, ItemIds::BRICK_BLOCK, 0), "Bricks", $bricksBreakInfo)); - $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())); + $this->register(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM, ItemIds::BROWN_MUSHROOM, 0), "Brown Mushroom", BreakInfo::instant())); + $this->register(new Cactus(new BID(Ids::CACTUS, ItemIds::CACTUS, 0), "Cactus", new BreakInfo(0.4))); + $this->register(new Cake(new BID(Ids::CAKE, ItemIds::CAKE, 0), "Cake", new BreakInfo(0.5))); + $this->register(new Carrot(new BID(Ids::CARROTS, ItemIds::CARROTS, 0), "Carrot Block", BreakInfo::instant())); $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); - $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()))); + $this->register(new Chest(new BID(Ids::CHEST, ItemIds::CHEST, 0, TileChest::class), "Chest", $chestBreakInfo)); + $this->register(new Clay(new BID(Ids::CLAY, ItemIds::CLAY_BLOCK, 0), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Coal(new BID(Ids::COAL, ItemIds::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, ItemIds::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->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->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE, ItemIds::COBBLESTONE, 0), "Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::MOSSY_COBBLESTONE, ItemIds::MOSSY_COBBLESTONE, 0), "Mossy Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::COBBLESTONE_STAIRS, ItemIds::COBBLESTONE_STAIRS, 0), "Cobblestone Stairs", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS, ItemIds::MOSSY_COBBLESTONE_STAIRS, 0), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - $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 BID(Ids::DAYLIGHT_SENSOR, LegacyIds::DAYLIGHT_DETECTOR, 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->register(new Cobweb(new BID(Ids::COBWEB, ItemIds::COBWEB, 0), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); + $this->register(new CocoaBlock(new BID(Ids::COCOA_POD, ItemIds::COCOA, 0), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); + $this->register(new CoralBlock(new BID(Ids::CORAL_BLOCK, ItemIds::CORAL_BLOCK, 0), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new CraftingTable(new BID(Ids::CRAFTING_TABLE, ItemIds::CRAFTING_TABLE, 0), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, ItemIds::DAYLIGHT_DETECTOR, 0, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new DeadBush(new BID(Ids::DEAD_BUSH, ItemIds::DEADBUSH, 0), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL, ItemIds::DETECTOR_RAIL, 0), "Detector Rail", $railBreakInfo)); - $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))); + $this->register(new Opaque(new BID(Ids::DIAMOND, ItemIds::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, ItemIds::DIAMOND_ORE, 0), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Dirt(new BID(Ids::DIRT, ItemIds::DIRT, 0), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new DoublePlant(new BID(Ids::SUNFLOWER, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_SUNFLOWER), "Sunflower", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::LILAC, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LILAC), "Lilac", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::ROSE_BUSH, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_ROSE_BUSH), "Rose Bush", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::PEONY, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_PEONY), "Peony", BreakInfo::instant())); + $this->register(new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DoubleTallGrass(new BID(Ids::LARGE_FERN, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG, ItemIds::DRAGON_EGG, 0), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new DriedKelp(new BID(Ids::DRIED_KELP, ItemIds::DRIED_KELP_BLOCK, 0), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); + $this->register(new Opaque(new BID(Ids::EMERALD, ItemIds::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, ItemIds::EMERALD_ORE, 0), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, ItemIds::ENCHANTING_TABLE, 0, 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, ItemIds::END_PORTAL_FRAME, 0), "End Portal Frame", BreakInfo::indestructible())); + $this->register(new EndRod(new BID(Ids::END_ROD, ItemIds::END_ROD, 0), "End Rod", BreakInfo::instant())); + $this->register(new Opaque(new BID(Ids::END_STONE, ItemIds::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->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->register(new Opaque(new BID(Ids::END_STONE_BRICKS, ItemIds::END_BRICKS, 0), "End Stone Bricks", $endBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS, ItemIds::END_BRICK_STAIRS, 0), "End Stone Brick Stairs", $endBrickBreakInfo)); - $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 BID(Ids::FURNACE, LegacyIds::FURNACE, 0, null, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, LegacyIds::BLAST_FURNACE, 0, null, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::SMOKER, LegacyIds::SMOKER, 0, null, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new EnderChest(new BID(Ids::ENDER_CHEST, ItemIds::ENDER_CHEST, 0, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); + $this->register(new Farmland(new BID(Ids::FARMLAND, ItemIds::FARMLAND, 0), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Fire(new BID(Ids::FIRE, ItemIds::FIRE, 0), "Fire Block", BreakInfo::instant())); + $this->register(new FletchingTable(new BID(Ids::FLETCHING_TABLE, ItemIds::FLETCHING_TABLE, 0), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); + $this->register(new Flower(new BID(Ids::DANDELION, ItemIds::DANDELION, 0), "Dandelion", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::POPPY, ItemIds::RED_FLOWER, Meta::FLOWER_POPPY), "Poppy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ALLIUM, ItemIds::RED_FLOWER, Meta::FLOWER_ALLIUM), "Allium", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::AZURE_BLUET, ItemIds::RED_FLOWER, Meta::FLOWER_AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::BLUE_ORCHID, ItemIds::RED_FLOWER, Meta::FLOWER_BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::CORNFLOWER, ItemIds::RED_FLOWER, Meta::FLOWER_CORNFLOWER), "Cornflower", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::LILY_OF_THE_VALLEY, ItemIds::RED_FLOWER, Meta::FLOWER_LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ORANGE_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::OXEYE_DAISY, ItemIds::RED_FLOWER, Meta::FLOWER_OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::PINK_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_PINK_TULIP), "Pink Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::RED_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_RED_TULIP), "Red Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::WHITE_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_WHITE_TULIP), "White Tulip", BreakInfo::instant())); + $this->register(new FlowerPot(new BID(Ids::FLOWER_POT, ItemIds::FLOWER_POT, 0, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); + $this->register(new FrostedIce(new BID(Ids::FROSTED_ICE, ItemIds::FROSTED_ICE, 0), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); + $this->register(new Furnace(new BID(Ids::FURNACE, ItemIds::FURNACE, 0, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, ItemIds::BLAST_FURNACE, 0, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::SMOKER, ItemIds::SMOKER, 0, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $glassBreakInfo = new BreakInfo(0.3); - $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()))); + $this->register(new Glass(new BID(Ids::GLASS, ItemIds::GLASS, 0), "Glass", $glassBreakInfo)); + $this->register(new GlassPane(new BID(Ids::GLASS_PANE, ItemIds::GLASS_PANE, 0), "Glass Pane", $glassBreakInfo)); + $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN, ItemIds::GLOWINGOBSIDIAN, 0), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); + $this->register(new Glowstone(new BID(Ids::GLOWSTONE, ItemIds::GLOWSTONE, 0), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); + $this->register(new Opaque(new BID(Ids::GOLD, ItemIds::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, ItemIds::GOLD_ORE, 0), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $grassBreakInfo = 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))); + $this->register(new Grass(new BID(Ids::GRASS, ItemIds::GRASS, 0), "Grass", $grassBreakInfo)); + $this->register(new GrassPath(new BID(Ids::GRASS_PATH, ItemIds::GRASS_PATH, 0), "Grass Path", $grassBreakInfo)); + $this->register(new Gravel(new BID(Ids::GRAVEL, ItemIds::GRAVEL, 0), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY, LegacyIds::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); + $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY, ItemIds::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new BreakInfo(10.0); - $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))); + $this->register(new HardenedGlass(new BID(Ids::HARDENED_GLASS, ItemIds::HARD_GLASS, 0), "Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE, ItemIds::HARD_GLASS_PANE, 0), "Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new HayBale(new BID(Ids::HAY_BALE, ItemIds::HAY_BALE, 0), "Hay Bale", new BreakInfo(0.5))); + $this->register(new Hopper(new BID(Ids::HOPPER, ItemIds::HOPPER, 0, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + $this->register(new Ice(new BID(Ids::ICE, ItemIds::ICE, 0), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); $updateBlockBreakInfo = new BreakInfo(1.0); - $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())); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE, ItemIds::INFO_UPDATE, 0), "update!", $updateBlockBreakInfo)); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE2, ItemIds::INFO_UPDATE2, 0), "ate!upd", $updateBlockBreakInfo)); + $this->register(new Transparent(new BID(Ids::INVISIBLE_BEDROCK, ItemIds::INVISIBLEBEDROCK, 0), "Invisible Bedrock", BreakInfo::indestructible())); $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); - $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)); + $this->register(new Opaque(new BID(Ids::IRON, ItemIds::IRON_BLOCK, 0), "Iron Block", $ironBreakInfo)); + $this->register(new Thin(new BID(Ids::IRON_BARS, ItemIds::IRON_BARS, 0), "Iron Bars", $ironBreakInfo)); $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); - $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 BID(Ids::LAVA, LegacyIds::FLOWING_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))); + $this->register(new Door(new BID(Ids::IRON_DOOR, ItemIds::IRON_DOOR, 0), "Iron Door", $ironDoorBreakInfo)); + $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR, ItemIds::IRON_TRAPDOOR, 0), "Iron Trapdoor", $ironDoorBreakInfo)); + $this->register(new Opaque(new BID(Ids::IRON_ORE, ItemIds::IRON_ORE, 0), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, ItemIds::FRAME, 0, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); + $this->register(new Jukebox(new BID(Ids::JUKEBOX, ItemIds::JUKEBOX, 0, 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, ItemIds::LADDER, 0), "Ladder", new BreakInfo(0.4, ToolType::AXE))); + $this->register(new Lantern(new BID(Ids::LANTERN, ItemIds::LANTERN, 0), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI, ItemIds::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, ItemIds::LAPIS_ORE, 0), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new Lava(new BID(Ids::LAVA, ItemIds::FLOWING_LAVA, 0), "Lava", BreakInfo::indestructible(500.0))); + $this->register(new Lectern(new BID(Ids::LECTERN, ItemIds::LECTERN, 0, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + $this->register(new Lever(new BID(Ids::LEVER, ItemIds::LEVER, 0), "Lever", new BreakInfo(0.5))); + $this->register(new Loom(new BID(Ids::LOOM, ItemIds::LOOM, 0), "Loom", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Magma(new BID(Ids::MAGMA, ItemIds::MAGMA, 0), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Melon(new BID(Ids::MELON, ItemIds::MELON_BLOCK, 0), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); + $this->register(new MelonStem(new BID(Ids::MELON_STEM, ItemIds::MELON_SEEDS, 0), "Melon Stem", BreakInfo::instant())); + $this->register(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, ItemIds::MOB_SPAWNER, 0, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Mycelium(new BID(Ids::MYCELIUM, ItemIds::MYCELIUM, 0), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $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)); + $this->register(new Opaque(new BID(Ids::NETHER_BRICKS, ItemIds::NETHER_BRICK_BLOCK, 0), "Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_NETHER_BRICKS, ItemIds::RED_NETHER_BRICK, 0), "Red Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE, ItemIds::NETHER_BRICK_FENCE, 0), "Nether Brick Fence", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS, ItemIds::NETHER_BRICK_STAIRS, 0), "Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS, ItemIds::RED_NETHER_BRICK_STAIRS, 0), "Red Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL, ItemIds::PORTAL, 0), "Nether Portal", BreakInfo::indestructible(0.0))); + $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE, ItemIds::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, ItemIds::NETHERREACTOR, 0), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK, ItemIds::NETHER_WART_BLOCK, 0), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); + $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART, ItemIds::NETHER_WART, 0), "Nether Wart", BreakInfo::instant())); + $this->register(new Netherrack(new BID(Ids::NETHERRACK, ItemIds::NETHERRACK, 0), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Note(new BID(Ids::NOTE_BLOCK, ItemIds::NOTEBLOCK, 0, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); + $this->register(new Opaque(new BID(Ids::OBSIDIAN, ItemIds::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, ItemIds::PACKED_ICE, 0), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Podzol(new BID(Ids::PODZOL, ItemIds::PODZOL, 0), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Potato(new BID(Ids::POTATOES, ItemIds::POTATOES, 0), "Potato Block", BreakInfo::instant())); + $this->register(new PoweredRail(new BID(Ids::POWERED_RAIL, ItemIds::GOLDEN_RAIL, 0), "Powered Rail", $railBreakInfo)); $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $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)); + $this->register(new Opaque(new BID(Ids::PRISMARINE, ItemIds::PRISMARINE, Meta::PRISMARINE_NORMAL), "Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::DARK_PRISMARINE, ItemIds::PRISMARINE, Meta::PRISMARINE_DARK), "Dark Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::PRISMARINE_BRICKS, ItemIds::PRISMARINE, Meta::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS, ItemIds::PRISMARINE_BRICKS_STAIRS, 0), "Prismarine Bricks Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS, ItemIds::DARK_PRISMARINE_STAIRS, 0), "Dark Prismarine Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_STAIRS, ItemIds::PRISMARINE_STAIRS, 0), "Prismarine Stairs", $prismarineBreakInfo)); $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $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->register(new Pumpkin(new BID(Ids::PUMPKIN, ItemIds::PUMPKIN, 0), "Pumpkin", $pumpkinBreakInfo)); + $this->register(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN, ItemIds::CARVED_PUMPKIN, 0), "Carved Pumpkin", $pumpkinBreakInfo)); + $this->register(new LitPumpkin(new BID(Ids::LIT_PUMPKIN, ItemIds::JACK_O_LANTERN, 0), "Jack o'Lantern", $pumpkinBreakInfo)); - $this->register(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, ItemIds::PUMPKIN_SEEDS, 0), "Pumpkin Stem", BreakInfo::instant())); $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $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)); + $this->register(new Opaque(new BID(Ids::PURPUR, ItemIds::PURPUR_BLOCK, Meta::PURPUR_NORMAL), "Purpur Block", $purpurBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::PURPUR_PILLAR, ItemIds::PURPUR_BLOCK, Meta::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); + $this->register(new Stair(new BID(Ids::PURPUR_STAIRS, ItemIds::PURPUR_STAIRS, 0), "Purpur Stairs", $purpurBreakInfo)); $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $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->register(new Opaque(new BID(Ids::QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_NORMAL), "Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_CHISELED), "Chiseled Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_SMOOTH), "Smooth Quartz Block", $quartzBreakInfo)); - $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 Stair(new BID(Ids::QUARTZ_STAIRS, ItemIds::QUARTZ_STAIRS, 0), "Quartz Stairs", $quartzBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS, ItemIds::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 BID(Ids::REDSTONE_COMPARATOR, LegacyIds::UNPOWERED_COMPARATOR, 0, ItemIds::COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP, LegacyIds::REDSTONE_LAMP, 0), "Redstone Lamp", new BreakInfo(0.3))); - $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE, LegacyIds::REDSTONE_ORE, 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER, LegacyIds::UNPOWERED_REPEATER, 0, ItemIds::REPEATER), "Redstone Repeater", BreakInfo::instant())); - $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH, LegacyIds::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())); + $this->register(new Rail(new BID(Ids::RAIL, ItemIds::RAIL, 0), "Rail", $railBreakInfo)); + $this->register(new RedMushroom(new BID(Ids::RED_MUSHROOM, ItemIds::RED_MUSHROOM, 0), "Red Mushroom", BreakInfo::instant())); + $this->register(new Redstone(new BID(Ids::REDSTONE, ItemIds::REDSTONE_BLOCK, 0), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + $this->register(new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, ItemIds::COMPARATOR, 0, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP, ItemIds::REDSTONE_LAMP, 0), "Redstone Lamp", new BreakInfo(0.3))); + $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE, ItemIds::REDSTONE_ORE, 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER, ItemIds::REPEATER, 0), "Redstone Repeater", BreakInfo::instant())); + $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH, ItemIds::REDSTONE_TORCH, 0), "Redstone Torch", BreakInfo::instant())); + $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE, ItemIds::REDSTONE, 0), "Redstone", BreakInfo::instant())); + $this->register(new Reserved6(new BID(Ids::RESERVED6, ItemIds::RESERVED6, 0), "reserved6", BreakInfo::instant())); $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); - $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 Sand(new BID(Ids::SAND, ItemIds::SAND, 0), "Sand", $sandBreakInfo)); + $this->register(new Sand(new BID(Ids::RED_SAND, ItemIds::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))); + $this->register(new SeaLantern(new BID(Ids::SEA_LANTERN, ItemIds::SEALANTERN, 0), "Sea Lantern", new BreakInfo(0.3))); + $this->register(new SeaPickle(new BID(Ids::SEA_PICKLE, ItemIds::SEA_PICKLE, 0), "Sea Pickle", BreakInfo::instant())); + $this->register(new Skull(new BID(Ids::MOB_HEAD, ItemIds::SKULL, 0, TileSkull::class), "Mob Head", new BreakInfo(1.0))); + $this->register(new Slime(new BID(Ids::SLIME, ItemIds::SLIME, 0), "Slime Block", BreakInfo::instant())); + $this->register(new Snow(new BID(Ids::SNOW, ItemIds::SNOW, 0), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SnowLayer(new BID(Ids::SNOW_LAYER, ItemIds::SNOW_LAYER, 0), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SoulSand(new BID(Ids::SOUL_SAND, ItemIds::SOUL_SAND, 0), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Sponge(new BID(Ids::SPONGE, ItemIds::SPONGE, 0), "Sponge", new BreakInfo(0.6, ToolType::HOE))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - $this->register(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, ItemIds::UNDYED_SHULKER_BOX, 0, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); $this->register( - $stone = new class(new BID(Ids::STONE, LegacyIds::STONE, Meta::STONE_NORMAL), "Stone", $stoneBreakInfo) extends Opaque{ + $stone = new class(new BID(Ids::STONE, ItemIds::STONE, Meta::STONE_NORMAL), "Stone", $stoneBreakInfo) extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLESTONE()->asItem()]; } @@ -345,39 +344,39 @@ class BlockFactory{ } } ); - $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(new Opaque(new BID(Ids::ANDESITE, ItemIds::STONE, Meta::STONE_ANDESITE), "Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::DIORITE, ItemIds::STONE, Meta::STONE_DIORITE), "Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::GRANITE, ItemIds::STONE, Meta::STONE_GRANITE), "Granite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_ANDESITE, ItemIds::STONE, Meta::STONE_POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_DIORITE, ItemIds::STONE, Meta::STONE_POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_GRANITE, ItemIds::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)); + $this->register($stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_NORMAL), "Stone Bricks", $stoneBreakInfo)); + $this->register($mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_MOSSY), "Mossy Stone Bricks", $stoneBreakInfo)); + $this->register($crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_CRACKED), "Cracked Stone Bricks", $stoneBreakInfo)); + $this->register($chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_CHISELED), "Chiseled Stone Bricks", $stoneBreakInfo)); $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); - $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 InfestedStone(new BID(Ids::INFESTED_STONE, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE, ItemIds::MONSTER_EGG, Meta::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_MOSSY), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CRACKED), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK, ItemIds::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()))); + $this->register(new Stair(new BID(Ids::STONE_STAIRS, ItemIds::NORMAL_STONE_STAIRS, 0), "Stone Stairs", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_STONE, ItemIds::SMOOTH_STONE, 0), "Smooth Stone", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::ANDESITE_STAIRS, ItemIds::ANDESITE_STAIRS, 0), "Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::DIORITE_STAIRS, ItemIds::DIORITE_STAIRS, 0), "Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::GRANITE_STAIRS, ItemIds::GRANITE_STAIRS, 0), "Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS, ItemIds::POLISHED_ANDESITE_STAIRS, 0), "Polished Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS, ItemIds::POLISHED_DIORITE_STAIRS, 0), "Polished Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS, ItemIds::POLISHED_GRANITE_STAIRS, 0), "Polished Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::STONE_BRICK_STAIRS, ItemIds::STONE_BRICK_STAIRS, 0), "Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS, ItemIds::MOSSY_STONE_BRICK_STAIRS, 0), "Mossy Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new StoneButton(new BID(Ids::STONE_BUTTON, ItemIds::STONE_BUTTON, 0), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Stonecutter(new BID(Ids::STONECUTTER, ItemIds::STONECUTTER_BLOCK, 0), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); + $this->register(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE, ItemIds::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); @@ -417,31 +416,31 @@ class BlockFactory{ $this->register($slabType); } - $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 Opaque(new BID(Ids::LEGACY_STONECUTTER, ItemIds::STONECUTTER, 0), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Sugarcane(new BID(Ids::SUGARCANE, ItemIds::REEDS, 0), "Sugarcane", BreakInfo::instant())); + $this->register(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH, ItemIds::SWEET_BERRIES, 0), "Sweet Berry Bush", BreakInfo::instant())); + $this->register(new TNT(new BID(Ids::TNT, ItemIds::TNT, 0), "TNT", BreakInfo::instant())); + $this->register(new TallGrass(new BID(Ids::FERN, ItemIds::TALLGRASS, Meta::TALLGRASS_FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new TallGrass(new BID(Ids::TALL_GRASS, ItemIds::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 Torch(new BID(Ids::BLUE_TORCH, ItemIds::COLORED_TORCH_BP, 0), "Blue Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::PURPLE_TORCH, ItemIds::COLORED_TORCH_BP, 8), "Purple Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::RED_TORCH, ItemIds::COLORED_TORCH_RG, 0), "Red Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::GREEN_TORCH, ItemIds::COLORED_TORCH_RG, 8), "Green Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::TORCH, ItemIds::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 BID(Ids::WATER, LegacyIds::FLOWING_WATER, 0), "Water", BreakInfo::indestructible(500.0))); - $this->register(new WaterLily(new BID(Ids::LILY_PAD, LegacyIds::LILY_PAD, 0), "Lily Pad", BreakInfo::instant())); + $this->register(new TrappedChest(new BID(Ids::TRAPPED_CHEST, ItemIds::TRAPPED_CHEST, 0, TileChest::class), "Trapped Chest", $chestBreakInfo)); + $this->register(new Tripwire(new BID(Ids::TRIPWIRE, ItemIds::STRING, 0), "Tripwire", BreakInfo::instant())); + $this->register(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK, ItemIds::TRIPWIRE_HOOK, 0), "Tripwire Hook", BreakInfo::instant())); + $this->register(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH, ItemIds::UNDERWATER_TORCH, 0), "Underwater Torch", BreakInfo::instant())); + $this->register(new Vine(new BID(Ids::VINES, ItemIds::VINE, 0), "Vines", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new Water(new BID(Ids::WATER, ItemIds::FLOWING_WATER, 0), "Water", BreakInfo::indestructible(500.0))); + $this->register(new WaterLily(new BID(Ids::LILY_PAD, ItemIds::LILY_PAD, 0), "Lily Pad", BreakInfo::instant())); $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $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())); + $this->register(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, ItemIds::HEAVY_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); + $this->register(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, ItemIds::LIGHT_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); + $this->register(new Wheat(new BID(Ids::WHEAT, ItemIds::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{ @@ -486,19 +485,19 @@ class BlockFactory{ } $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $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::RED_SANDSTONE_STAIRS, ItemIds::RED_SANDSTONE_STAIRS, 0), "Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS, ItemIds::SMOOTH_RED_SANDSTONE_STAIRS, 0), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_NORMAL), "Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_CUT), "Cut Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE, ItemIds::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)); + $this->register(new Stair(new BID(Ids::SANDSTONE_STAIRS, ItemIds::SANDSTONE_STAIRS, 0), "Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS, ItemIds::SMOOTH_SANDSTONE_STAIRS, 0), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_NORMAL), "Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_CUT), "Cut Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Sandstone", $sandstoneBreakInfo)); $glazedTerracottaBreakInfo = new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); foreach(DyeColor::getAll() as $color){ @@ -507,16 +506,16 @@ class BlockFactory{ }; $this->register(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); } - $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{ + $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, ItemIds::SHULKER_BOX, 0, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); + $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS, ItemIds::STAINED_GLASS, 0), "Stained Glass", $glassBreakInfo)); + $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE, ItemIds::STAINED_GLASS_PANE, 0), "Stained Glass Pane", $glassBreakInfo)); + $this->register(new StainedHardenedClay(new BID(Ids::STAINED_CLAY, ItemIds::STAINED_CLAY, 0), "Stained Clay", $hardenedClayBreakInfo)); + $this->register(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS, ItemIds::HARD_STAINED_GLASS, 0), "Stained Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE, ItemIds::HARD_STAINED_GLASS_PANE, 0), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new Carpet(new BID(Ids::CARPET, ItemIds::CARPET, 0), "Carpet", new BreakInfo(0.1))); + $this->register(new Concrete(new BID(Ids::CONCRETE, ItemIds::CONCRETE, 0), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new ConcretePowder(new BID(Ids::CONCRETE_POWDER, ItemIds::CONCRETE_POWDER, 0), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Wool(new BID(Ids::WOOL, ItemIds::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){ @@ -529,45 +528,45 @@ 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->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->register(new Wall(new BID(Ids::COBBLESTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_COBBLESTONE), "Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::ANDESITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_ANDESITE), "Andesite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_BRICK), "Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::DIORITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_DIORITE), "Diorite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::END_STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_END_STONE_BRICK), "End Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::GRANITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_GRANITE), "Granite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_STONE_BRICK), "Mossy Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_COBBLESTONE), "Mossy Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::NETHER_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_NETHER_BRICK), "Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::PRISMARINE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_PRISMARINE), "Prismarine Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_NETHER_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_RED_NETHER_BRICK), "Red Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_SANDSTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_RED_SANDSTONE), "Red Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::SANDSTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_SANDSTONE), "Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_STONE_BRICK), "Stone Brick Wall", $wallBreakInfo)); $this->registerElements(); $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $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->register(new ChemistryTable(new BID(Ids::COMPOUND_CREATOR, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::LAB_TABLE, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::MATERIAL_REDUCER, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); - $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, LegacyIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); + $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, ItemIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); $this->registerMushroomBlocks(); $this->register(new Coral( - new BID(Ids::CORAL, LegacyIds::CORAL, 0), + new BID(Ids::CORAL, ItemIds::CORAL, 0), "Coral", BreakInfo::instant(), )); $this->register(new FloorCoralFan( - new BID(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, ItemIds::CORAL_FAN), + new BID(Ids::CORAL_FAN, ItemIds::CORAL_FAN, 0), "Coral Fan", BreakInfo::instant(), )); $this->register(new WallCoralFan( - new BID(Ids::WALL_CORAL_FAN, LegacyIds::CORAL_FAN_HANG, 0, ItemIds::CORAL_FAN), + new BID(Ids::WALL_CORAL_FAN, ItemIds::CORAL_FAN, 0), "Wall Coral Fan", BreakInfo::instant(), )); @@ -710,136 +709,136 @@ class BlockFactory{ private function registerMushroomBlocks() : void{ $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); - $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)); + $this->register(new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK, ItemIds::BROWN_MUSHROOM_BLOCK, 0), "Brown Mushroom Block", $mushroomBlockBreakInfo)); + $this->register(new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK, ItemIds::RED_MUSHROOM_BLOCK, 0), "Red Mushroom Block", $mushroomBlockBreakInfo)); //finally, the stems - $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)); + $this->register(new MushroomStem(new BID(Ids::MUSHROOM_STEM, ItemIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); + $this->register(new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM, ItemIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); } private function registerElements() : void{ $instaBreak = BreakInfo::instant(); - $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO, LegacyIds::ELEMENT_0, 0), "???", $instaBreak)); + $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO, ItemIds::ELEMENT_0, 0), "???", $instaBreak)); - $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)); + $this->register(new Element(new BID(Ids::ELEMENT_HYDROGEN, ItemIds::ELEMENT_1, 0), "Hydrogen", $instaBreak, "h", 1, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_HELIUM, ItemIds::ELEMENT_2, 0), "Helium", $instaBreak, "he", 2, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_LITHIUM, ItemIds::ELEMENT_3, 0), "Lithium", $instaBreak, "li", 3, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BERYLLIUM, ItemIds::ELEMENT_4, 0), "Beryllium", $instaBreak, "be", 4, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_BORON, ItemIds::ELEMENT_5, 0), "Boron", $instaBreak, "b", 5, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_CARBON, ItemIds::ELEMENT_6, 0), "Carbon", $instaBreak, "c", 6, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_NITROGEN, ItemIds::ELEMENT_7, 0), "Nitrogen", $instaBreak, "n", 7, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_OXYGEN, ItemIds::ELEMENT_8, 0), "Oxygen", $instaBreak, "o", 8, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_FLUORINE, ItemIds::ELEMENT_9, 0), "Fluorine", $instaBreak, "f", 9, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_NEON, ItemIds::ELEMENT_10, 0), "Neon", $instaBreak, "ne", 10, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_SODIUM, ItemIds::ELEMENT_11, 0), "Sodium", $instaBreak, "na", 11, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_MAGNESIUM, ItemIds::ELEMENT_12, 0), "Magnesium", $instaBreak, "mg", 12, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ALUMINUM, ItemIds::ELEMENT_13, 0), "Aluminum", $instaBreak, "al", 13, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_SILICON, ItemIds::ELEMENT_14, 0), "Silicon", $instaBreak, "si", 14, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_PHOSPHORUS, ItemIds::ELEMENT_15, 0), "Phosphorus", $instaBreak, "p", 15, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_SULFUR, ItemIds::ELEMENT_16, 0), "Sulfur", $instaBreak, "s", 16, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_CHLORINE, ItemIds::ELEMENT_17, 0), "Chlorine", $instaBreak, "cl", 17, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_ARGON, ItemIds::ELEMENT_18, 0), "Argon", $instaBreak, "ar", 18, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_POTASSIUM, ItemIds::ELEMENT_19, 0), "Potassium", $instaBreak, "k", 19, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_CALCIUM, ItemIds::ELEMENT_20, 0), "Calcium", $instaBreak, "ca", 20, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_SCANDIUM, ItemIds::ELEMENT_21, 0), "Scandium", $instaBreak, "sc", 21, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TITANIUM, ItemIds::ELEMENT_22, 0), "Titanium", $instaBreak, "ti", 22, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_VANADIUM, ItemIds::ELEMENT_23, 0), "Vanadium", $instaBreak, "v", 23, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CHROMIUM, ItemIds::ELEMENT_24, 0), "Chromium", $instaBreak, "cr", 24, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MANGANESE, ItemIds::ELEMENT_25, 0), "Manganese", $instaBreak, "mn", 25, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRON, ItemIds::ELEMENT_26, 0), "Iron", $instaBreak, "fe", 26, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COBALT, ItemIds::ELEMENT_27, 0), "Cobalt", $instaBreak, "co", 27, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NICKEL, ItemIds::ELEMENT_28, 0), "Nickel", $instaBreak, "ni", 28, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPPER, ItemIds::ELEMENT_29, 0), "Copper", $instaBreak, "cu", 29, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZINC, ItemIds::ELEMENT_30, 0), "Zinc", $instaBreak, "zn", 30, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GALLIUM, ItemIds::ELEMENT_31, 0), "Gallium", $instaBreak, "ga", 31, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_GERMANIUM, ItemIds::ELEMENT_32, 0), "Germanium", $instaBreak, "ge", 32, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ARSENIC, ItemIds::ELEMENT_33, 0), "Arsenic", $instaBreak, "as", 33, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_SELENIUM, ItemIds::ELEMENT_34, 0), "Selenium", $instaBreak, "se", 34, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_BROMINE, ItemIds::ELEMENT_35, 0), "Bromine", $instaBreak, "br", 35, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_KRYPTON, ItemIds::ELEMENT_36, 0), "Krypton", $instaBreak, "kr", 36, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_RUBIDIUM, ItemIds::ELEMENT_37, 0), "Rubidium", $instaBreak, "rb", 37, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_STRONTIUM, ItemIds::ELEMENT_38, 0), "Strontium", $instaBreak, "sr", 38, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTRIUM, ItemIds::ELEMENT_39, 0), "Yttrium", $instaBreak, "y", 39, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZIRCONIUM, ItemIds::ELEMENT_40, 0), "Zirconium", $instaBreak, "zr", 40, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIOBIUM, ItemIds::ELEMENT_41, 0), "Niobium", $instaBreak, "nb", 41, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MOLYBDENUM, ItemIds::ELEMENT_42, 0), "Molybdenum", $instaBreak, "mo", 42, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TECHNETIUM, ItemIds::ELEMENT_43, 0), "Technetium", $instaBreak, "tc", 43, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHENIUM, ItemIds::ELEMENT_44, 0), "Ruthenium", $instaBreak, "ru", 44, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHODIUM, ItemIds::ELEMENT_45, 0), "Rhodium", $instaBreak, "rh", 45, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PALLADIUM, ItemIds::ELEMENT_46, 0), "Palladium", $instaBreak, "pd", 46, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SILVER, ItemIds::ELEMENT_47, 0), "Silver", $instaBreak, "ag", 47, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CADMIUM, ItemIds::ELEMENT_48, 0), "Cadmium", $instaBreak, "cd", 48, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_INDIUM, ItemIds::ELEMENT_49, 0), "Indium", $instaBreak, "in", 49, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TIN, ItemIds::ELEMENT_50, 0), "Tin", $instaBreak, "sn", 50, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_ANTIMONY, ItemIds::ELEMENT_51, 0), "Antimony", $instaBreak, "sb", 51, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_TELLURIUM, ItemIds::ELEMENT_52, 0), "Tellurium", $instaBreak, "te", 52, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_IODINE, ItemIds::ELEMENT_53, 0), "Iodine", $instaBreak, "i", 53, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_XENON, ItemIds::ELEMENT_54, 0), "Xenon", $instaBreak, "xe", 54, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_CESIUM, ItemIds::ELEMENT_55, 0), "Cesium", $instaBreak, "cs", 55, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BARIUM, ItemIds::ELEMENT_56, 0), "Barium", $instaBreak, "ba", 56, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_LANTHANUM, ItemIds::ELEMENT_57, 0), "Lanthanum", $instaBreak, "la", 57, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_CERIUM, ItemIds::ELEMENT_58, 0), "Cerium", $instaBreak, "ce", 58, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM, ItemIds::ELEMENT_59, 0), "Praseodymium", $instaBreak, "pr", 59, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_NEODYMIUM, ItemIds::ELEMENT_60, 0), "Neodymium", $instaBreak, "nd", 60, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PROMETHIUM, ItemIds::ELEMENT_61, 0), "Promethium", $instaBreak, "pm", 61, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_SAMARIUM, ItemIds::ELEMENT_62, 0), "Samarium", $instaBreak, "sm", 62, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_EUROPIUM, ItemIds::ELEMENT_63, 0), "Europium", $instaBreak, "eu", 63, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_GADOLINIUM, ItemIds::ELEMENT_64, 0), "Gadolinium", $instaBreak, "gd", 64, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_TERBIUM, ItemIds::ELEMENT_65, 0), "Terbium", $instaBreak, "tb", 65, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_DYSPROSIUM, ItemIds::ELEMENT_66, 0), "Dysprosium", $instaBreak, "dy", 66, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HOLMIUM, ItemIds::ELEMENT_67, 0), "Holmium", $instaBreak, "ho", 67, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_ERBIUM, ItemIds::ELEMENT_68, 0), "Erbium", $instaBreak, "er", 68, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_THULIUM, ItemIds::ELEMENT_69, 0), "Thulium", $instaBreak, "tm", 69, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTERBIUM, ItemIds::ELEMENT_70, 0), "Ytterbium", $instaBreak, "yb", 70, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_LUTETIUM, ItemIds::ELEMENT_71, 0), "Lutetium", $instaBreak, "lu", 71, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HAFNIUM, ItemIds::ELEMENT_72, 0), "Hafnium", $instaBreak, "hf", 72, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TANTALUM, ItemIds::ELEMENT_73, 0), "Tantalum", $instaBreak, "ta", 73, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TUNGSTEN, ItemIds::ELEMENT_74, 0), "Tungsten", $instaBreak, "w", 74, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHENIUM, ItemIds::ELEMENT_75, 0), "Rhenium", $instaBreak, "re", 75, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_OSMIUM, ItemIds::ELEMENT_76, 0), "Osmium", $instaBreak, "os", 76, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRIDIUM, ItemIds::ELEMENT_77, 0), "Iridium", $instaBreak, "ir", 77, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PLATINUM, ItemIds::ELEMENT_78, 0), "Platinum", $instaBreak, "pt", 78, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GOLD, ItemIds::ELEMENT_79, 0), "Gold", $instaBreak, "au", 79, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MERCURY, ItemIds::ELEMENT_80, 0), "Mercury", $instaBreak, "hg", 80, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_THALLIUM, ItemIds::ELEMENT_81, 0), "Thallium", $instaBreak, "tl", 81, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LEAD, ItemIds::ELEMENT_82, 0), "Lead", $instaBreak, "pb", 82, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_BISMUTH, ItemIds::ELEMENT_83, 0), "Bismuth", $instaBreak, "bi", 83, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_POLONIUM, ItemIds::ELEMENT_84, 0), "Polonium", $instaBreak, "po", 84, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ASTATINE, ItemIds::ELEMENT_85, 0), "Astatine", $instaBreak, "at", 85, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_RADON, ItemIds::ELEMENT_86, 0), "Radon", $instaBreak, "rn", 86, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_FRANCIUM, ItemIds::ELEMENT_87, 0), "Francium", $instaBreak, "fr", 87, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_RADIUM, ItemIds::ELEMENT_88, 0), "Radium", $instaBreak, "ra", 88, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ACTINIUM, ItemIds::ELEMENT_89, 0), "Actinium", $instaBreak, "ac", 89, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_THORIUM, ItemIds::ELEMENT_90, 0), "Thorium", $instaBreak, "th", 90, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PROTACTINIUM, ItemIds::ELEMENT_91, 0), "Protactinium", $instaBreak, "pa", 91, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_URANIUM, ItemIds::ELEMENT_92, 0), "Uranium", $instaBreak, "u", 92, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NEPTUNIUM, ItemIds::ELEMENT_93, 0), "Neptunium", $instaBreak, "np", 93, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PLUTONIUM, ItemIds::ELEMENT_94, 0), "Plutonium", $instaBreak, "pu", 94, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_AMERICIUM, ItemIds::ELEMENT_95, 0), "Americium", $instaBreak, "am", 95, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CURIUM, ItemIds::ELEMENT_96, 0), "Curium", $instaBreak, "cm", 96, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_BERKELIUM, ItemIds::ELEMENT_97, 0), "Berkelium", $instaBreak, "bk", 97, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CALIFORNIUM, ItemIds::ELEMENT_98, 0), "Californium", $instaBreak, "cf", 98, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_EINSTEINIUM, ItemIds::ELEMENT_99, 0), "Einsteinium", $instaBreak, "es", 99, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_FERMIUM, ItemIds::ELEMENT_100, 0), "Fermium", $instaBreak, "fm", 100, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_MENDELEVIUM, ItemIds::ELEMENT_101, 0), "Mendelevium", $instaBreak, "md", 101, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NOBELIUM, ItemIds::ELEMENT_102, 0), "Nobelium", $instaBreak, "no", 102, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_LAWRENCIUM, ItemIds::ELEMENT_103, 0), "Lawrencium", $instaBreak, "lr", 103, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM, ItemIds::ELEMENT_104, 0), "Rutherfordium", $instaBreak, "rf", 104, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DUBNIUM, ItemIds::ELEMENT_105, 0), "Dubnium", $instaBreak, "db", 105, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SEABORGIUM, ItemIds::ELEMENT_106, 0), "Seaborgium", $instaBreak, "sg", 106, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_BOHRIUM, ItemIds::ELEMENT_107, 0), "Bohrium", $instaBreak, "bh", 107, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_HASSIUM, ItemIds::ELEMENT_108, 0), "Hassium", $instaBreak, "hs", 108, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MEITNERIUM, ItemIds::ELEMENT_109, 0), "Meitnerium", $instaBreak, "mt", 109, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM, ItemIds::ELEMENT_110, 0), "Darmstadtium", $instaBreak, "ds", 110, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ROENTGENIUM, ItemIds::ELEMENT_111, 0), "Roentgenium", $instaBreak, "rg", 111, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPERNICIUM, ItemIds::ELEMENT_112, 0), "Copernicium", $instaBreak, "cn", 112, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIHONIUM, ItemIds::ELEMENT_113, 0), "Nihonium", $instaBreak, "nh", 113, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_FLEROVIUM, ItemIds::ELEMENT_114, 0), "Flerovium", $instaBreak, "fl", 114, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_MOSCOVIUM, ItemIds::ELEMENT_115, 0), "Moscovium", $instaBreak, "mc", 115, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LIVERMORIUM, ItemIds::ELEMENT_116, 0), "Livermorium", $instaBreak, "lv", 116, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TENNESSINE, ItemIds::ELEMENT_117, 0), "Tennessine", $instaBreak, "ts", 117, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON, ItemIds::ELEMENT_118, 0), "Oganesson", $instaBreak, "og", 118, 7)); } /** @@ -914,7 +913,7 @@ class BlockFactory{ if(isset($this->fullList[$index])) { //hot $block = clone $this->fullList[$index]; }else{ - $block = new UnknownBlock(new BID($typeId, $typeId, $stateData), BreakInfo::instant()); + $block = new UnknownBlock(new BID($typeId, $stateData, $stateData), BreakInfo::instant()); } return $block; diff --git a/src/block/BlockIdentifier.php b/src/block/BlockIdentifier.php index c4a809dc97..f2c7fd2c9e 100644 --- a/src/block/BlockIdentifier.php +++ b/src/block/BlockIdentifier.php @@ -32,19 +32,15 @@ class BlockIdentifier{ */ public function __construct( private int $blockTypeId, - private int $legacyBlockId, - private int $legacyVariant, - private ?int $legacyItemId = null, + private int $legacyItemId, + private int $legacyItemVariant, private ?string $tileClass = null ){ if($blockTypeId < 0){ throw new \InvalidArgumentException("Block type ID may not be negative"); } - if($legacyBlockId < 0){ - throw new \InvalidArgumentException("Legacy block ID may not be negative"); - } - if($legacyVariant < 0){ - throw new \InvalidArgumentException("Legacy block variant may not be negative"); + if($legacyItemVariant < 0){ + throw new \InvalidArgumentException("Legacy item variant may not be negative"); } if($tileClass !== null){ @@ -54,25 +50,18 @@ class BlockIdentifier{ public function getBlockTypeId() : int{ return $this->blockTypeId; } - /** - * @deprecated - */ - public function getLegacyBlockId() : int{ - return $this->legacyBlockId; - } - /** * @deprecated */ public function getLegacyVariant() : int{ - return $this->legacyVariant; + return $this->legacyItemVariant; } /** * @deprecated */ public function getLegacyItemId() : int{ - return $this->legacyItemId ?? ($this->legacyBlockId > 255 ? 255 - $this->legacyBlockId : $this->legacyBlockId); + return $this->legacyItemId; } /** diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index c50cb9df90..5b83825b1c 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockLegacyIds as LegacyIds; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\DyeColor; @@ -43,7 +42,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_PLANKS, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::PLANKS, $treeType->getMagicNumber()); + }, ItemIds::PLANKS, $treeType->getMagicNumber()); } public static function getWoodenFenceIdentifier(TreeType $treeType) : BID{ @@ -55,7 +54,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_FENCE, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::FENCE, $treeType->getMagicNumber()); + }, ItemIds::FENCE, $treeType->getMagicNumber()); } public static function getWoodenSlabIdentifier(TreeType $treeType) : BID{ @@ -67,17 +66,17 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_SLAB, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::WOODEN_SLAB, $treeType->getMagicNumber()); + }, ItemIds::WOODEN_SLAB, $treeType->getMagicNumber()); } public static function getLogIdentifier(TreeType $treeType) : BID{ return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LOG, LegacyIds::LOG, 0), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG, LegacyIds::LOG, 1), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG, LegacyIds::LOG, 2), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG, LegacyIds::LOG, 3), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG, LegacyIds::LOG2, 0), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG, LegacyIds::LOG2, 1), + TreeType::OAK()->id() => new BID(Ids::OAK_LOG, ItemIds::LOG, 0), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG, ItemIds::LOG, 1), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG, ItemIds::LOG, 2), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG, ItemIds::LOG, 3), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG, ItemIds::LOG2, 0), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG, ItemIds::LOG2, 1), default => throw new AssumptionFailedError("All tree types should be covered") }; } @@ -91,7 +90,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_WOOD, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::WOOD, $treeType->getMagicNumber()); + }, ItemIds::WOOD, $treeType->getMagicNumber()); } public static function getAllSidedStrippedLogIdentifier(TreeType $treeType) : BID{ @@ -103,17 +102,17 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::STRIPPED_ACACIA_WOOD, TreeType::DARK_OAK()->id() => Ids::STRIPPED_DARK_OAK_WOOD, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::WOOD, $treeType->getMagicNumber() | BlockLegacyMetadata::WOOD_FLAG_STRIPPED); + }, ItemIds::WOOD, $treeType->getMagicNumber() | BlockLegacyMetadata::WOOD_FLAG_STRIPPED); } public static function getLeavesIdentifier(TreeType $treeType) : BID{ return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES, LegacyIds::LEAVES, 0), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES, LegacyIds::LEAVES, 1), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES, LegacyIds::LEAVES, 2), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES, LegacyIds::LEAVES, 3), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES, LegacyIds::LEAVES2, 0), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES, LegacyIds::LEAVES2, 1), + TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES, ItemIds::LEAVES, 0), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES, ItemIds::LEAVES, 1), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES, ItemIds::LEAVES, 2), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES, ItemIds::LEAVES, 3), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES, ItemIds::LEAVES2, 0), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES, ItemIds::LEAVES2, 1), default => throw new AssumptionFailedError("All tree types should be covered") }; } @@ -127,23 +126,23 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_SAPLING, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, default => throw new AssumptionFailedError("All tree types should be covered") - }, LegacyIds::SAPLING, $treeType->getMagicNumber()); + }, ItemIds::SAPLING, $treeType->getMagicNumber()); } public static function getWoodenFloorSignIdentifier(TreeType $treeType) : BID{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_SIGN, LegacyIds::SIGN_POST, 0, ItemIds::SIGN, TileSign::class); + return new BID(Ids::OAK_SIGN, ItemIds::SIGN, 0, TileSign::class); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_SIGN, LegacyIds::SPRUCE_STANDING_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); + return new BID(Ids::SPRUCE_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_SIGN, LegacyIds::BIRCH_STANDING_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); + return new BID(Ids::BIRCH_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_SIGN, LegacyIds::JUNGLE_STANDING_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); + return new BID(Ids::JUNGLE_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_SIGN, LegacyIds::ACACIA_STANDING_SIGN, 0, ItemIds::ACACIA_SIGN, TileSign::class); + return new BID(Ids::ACACIA_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_SIGN, LegacyIds::DARKOAK_STANDING_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); + return new BID(Ids::DARK_OAK_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -151,17 +150,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenWallSignIdentifier(TreeType $treeType) : BID{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_WALL_SIGN, LegacyIds::WALL_SIGN, 0, ItemIds::SIGN, TileSign::class); + return new BID(Ids::OAK_WALL_SIGN, ItemIds::SIGN, 0, TileSign::class); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_WALL_SIGN, LegacyIds::SPRUCE_WALL_SIGN, 0, ItemIds::SPRUCE_SIGN, TileSign::class); + return new BID(Ids::SPRUCE_WALL_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_WALL_SIGN, LegacyIds::BIRCH_WALL_SIGN, 0, ItemIds::BIRCH_SIGN, TileSign::class); + return new BID(Ids::BIRCH_WALL_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_WALL_SIGN, LegacyIds::JUNGLE_WALL_SIGN, 0, ItemIds::JUNGLE_SIGN, TileSign::class); + return new BID(Ids::JUNGLE_WALL_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_WALL_SIGN, LegacyIds::ACACIA_WALL_SIGN, 0, ItemIds::ACACIA_SIGN, TileSign::class); + return new BID(Ids::ACACIA_WALL_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_WALL_SIGN, LegacyIds::DARKOAK_WALL_SIGN, 0, ItemIds::DARKOAK_SIGN, TileSign::class); + return new BID(Ids::DARK_OAK_WALL_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -169,17 +168,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenTrapdoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_TRAPDOOR, LegacyIds::WOODEN_TRAPDOOR, 0); + return new BID(Ids::OAK_TRAPDOOR, ItemIds::WOODEN_TRAPDOOR, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_TRAPDOOR, LegacyIds::SPRUCE_TRAPDOOR, 0); + return new BID(Ids::SPRUCE_TRAPDOOR, ItemIds::SPRUCE_TRAPDOOR, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_TRAPDOOR, LegacyIds::BIRCH_TRAPDOOR, 0); + return new BID(Ids::BIRCH_TRAPDOOR, ItemIds::BIRCH_TRAPDOOR, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_TRAPDOOR, LegacyIds::JUNGLE_TRAPDOOR, 0); + return new BID(Ids::JUNGLE_TRAPDOOR, ItemIds::JUNGLE_TRAPDOOR, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_TRAPDOOR, LegacyIds::ACACIA_TRAPDOOR, 0); + return new BID(Ids::ACACIA_TRAPDOOR, ItemIds::ACACIA_TRAPDOOR, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_TRAPDOOR, LegacyIds::DARK_OAK_TRAPDOOR, 0); + return new BID(Ids::DARK_OAK_TRAPDOOR, ItemIds::DARK_OAK_TRAPDOOR, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -187,17 +186,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenButtonIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_BUTTON, LegacyIds::WOODEN_BUTTON, 0); + return new BID(Ids::OAK_BUTTON, ItemIds::WOODEN_BUTTON, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_BUTTON, LegacyIds::SPRUCE_BUTTON, 0); + return new BID(Ids::SPRUCE_BUTTON, ItemIds::SPRUCE_BUTTON, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_BUTTON, LegacyIds::BIRCH_BUTTON, 0); + return new BID(Ids::BIRCH_BUTTON, ItemIds::BIRCH_BUTTON, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_BUTTON, LegacyIds::JUNGLE_BUTTON, 0); + return new BID(Ids::JUNGLE_BUTTON, ItemIds::JUNGLE_BUTTON, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_BUTTON, LegacyIds::ACACIA_BUTTON, 0); + return new BID(Ids::ACACIA_BUTTON, ItemIds::ACACIA_BUTTON, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_BUTTON, LegacyIds::DARK_OAK_BUTTON, 0); + return new BID(Ids::DARK_OAK_BUTTON, ItemIds::DARK_OAK_BUTTON, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -205,17 +204,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenPressurePlateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_PRESSURE_PLATE, LegacyIds::WOODEN_PRESSURE_PLATE, 0); + return new BID(Ids::OAK_PRESSURE_PLATE, ItemIds::WOODEN_PRESSURE_PLATE, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_PRESSURE_PLATE, LegacyIds::SPRUCE_PRESSURE_PLATE, 0); + return new BID(Ids::SPRUCE_PRESSURE_PLATE, ItemIds::SPRUCE_PRESSURE_PLATE, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_PRESSURE_PLATE, LegacyIds::BIRCH_PRESSURE_PLATE, 0); + return new BID(Ids::BIRCH_PRESSURE_PLATE, ItemIds::BIRCH_PRESSURE_PLATE, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_PRESSURE_PLATE, LegacyIds::JUNGLE_PRESSURE_PLATE, 0); + return new BID(Ids::JUNGLE_PRESSURE_PLATE, ItemIds::JUNGLE_PRESSURE_PLATE, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_PRESSURE_PLATE, LegacyIds::ACACIA_PRESSURE_PLATE, 0); + return new BID(Ids::ACACIA_PRESSURE_PLATE, ItemIds::ACACIA_PRESSURE_PLATE, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_PRESSURE_PLATE, LegacyIds::DARK_OAK_PRESSURE_PLATE, 0); + return new BID(Ids::DARK_OAK_PRESSURE_PLATE, ItemIds::DARK_OAK_PRESSURE_PLATE, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -223,17 +222,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenDoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_DOOR, LegacyIds::OAK_DOOR_BLOCK, 0, ItemIds::OAK_DOOR); + return new BID(Ids::OAK_DOOR, ItemIds::OAK_DOOR, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_DOOR, LegacyIds::SPRUCE_DOOR_BLOCK, 0, ItemIds::SPRUCE_DOOR); + return new BID(Ids::SPRUCE_DOOR, ItemIds::SPRUCE_DOOR, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_DOOR, LegacyIds::BIRCH_DOOR_BLOCK, 0, ItemIds::BIRCH_DOOR); + return new BID(Ids::BIRCH_DOOR, ItemIds::BIRCH_DOOR, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_DOOR, LegacyIds::JUNGLE_DOOR_BLOCK, 0, ItemIds::JUNGLE_DOOR); + return new BID(Ids::JUNGLE_DOOR, ItemIds::JUNGLE_DOOR, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_DOOR, LegacyIds::ACACIA_DOOR_BLOCK, 0, ItemIds::ACACIA_DOOR); + return new BID(Ids::ACACIA_DOOR, ItemIds::ACACIA_DOOR, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_DOOR, LegacyIds::DARK_OAK_DOOR_BLOCK, 0, ItemIds::DARK_OAK_DOOR); + return new BID(Ids::DARK_OAK_DOOR, ItemIds::DARK_OAK_DOOR, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -241,17 +240,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenFenceGateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_FENCE_GATE, LegacyIds::OAK_FENCE_GATE, 0); + return new BID(Ids::OAK_FENCE_GATE, ItemIds::OAK_FENCE_GATE, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_FENCE_GATE, LegacyIds::SPRUCE_FENCE_GATE, 0); + return new BID(Ids::SPRUCE_FENCE_GATE, ItemIds::SPRUCE_FENCE_GATE, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_FENCE_GATE, LegacyIds::BIRCH_FENCE_GATE, 0); + return new BID(Ids::BIRCH_FENCE_GATE, ItemIds::BIRCH_FENCE_GATE, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_FENCE_GATE, LegacyIds::JUNGLE_FENCE_GATE, 0); + return new BID(Ids::JUNGLE_FENCE_GATE, ItemIds::JUNGLE_FENCE_GATE, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_FENCE_GATE, LegacyIds::ACACIA_FENCE_GATE, 0); + return new BID(Ids::ACACIA_FENCE_GATE, ItemIds::ACACIA_FENCE_GATE, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_FENCE_GATE, LegacyIds::DARK_OAK_FENCE_GATE, 0); + return new BID(Ids::DARK_OAK_FENCE_GATE, ItemIds::DARK_OAK_FENCE_GATE, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -259,17 +258,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenStairsIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_STAIRS, LegacyIds::OAK_STAIRS, 0); + return new BID(Ids::OAK_STAIRS, ItemIds::OAK_STAIRS, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_STAIRS, LegacyIds::SPRUCE_STAIRS, 0); + return new BID(Ids::SPRUCE_STAIRS, ItemIds::SPRUCE_STAIRS, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_STAIRS, LegacyIds::BIRCH_STAIRS, 0); + return new BID(Ids::BIRCH_STAIRS, ItemIds::BIRCH_STAIRS, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_STAIRS, LegacyIds::JUNGLE_STAIRS, 0); + return new BID(Ids::JUNGLE_STAIRS, ItemIds::JUNGLE_STAIRS, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_STAIRS, LegacyIds::ACACIA_STAIRS, 0); + return new BID(Ids::ACACIA_STAIRS, ItemIds::ACACIA_STAIRS, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_STAIRS, LegacyIds::DARK_OAK_STAIRS, 0); + return new BID(Ids::DARK_OAK_STAIRS, ItemIds::DARK_OAK_STAIRS, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -277,17 +276,17 @@ final class BlockLegacyIdHelper{ public static function getStrippedLogIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::STRIPPED_OAK_LOG, LegacyIds::STRIPPED_OAK_LOG, 0); + return new BID(Ids::STRIPPED_OAK_LOG, ItemIds::STRIPPED_OAK_LOG, 0); case TreeType::SPRUCE()->id(): - return new BID(Ids::STRIPPED_SPRUCE_LOG, LegacyIds::STRIPPED_SPRUCE_LOG, 0); + return new BID(Ids::STRIPPED_SPRUCE_LOG, ItemIds::STRIPPED_SPRUCE_LOG, 0); case TreeType::BIRCH()->id(): - return new BID(Ids::STRIPPED_BIRCH_LOG, LegacyIds::STRIPPED_BIRCH_LOG, 0); + return new BID(Ids::STRIPPED_BIRCH_LOG, ItemIds::STRIPPED_BIRCH_LOG, 0); case TreeType::JUNGLE()->id(): - return new BID(Ids::STRIPPED_JUNGLE_LOG, LegacyIds::STRIPPED_JUNGLE_LOG, 0); + return new BID(Ids::STRIPPED_JUNGLE_LOG, ItemIds::STRIPPED_JUNGLE_LOG, 0); case TreeType::ACACIA()->id(): - return new BID(Ids::STRIPPED_ACACIA_LOG, LegacyIds::STRIPPED_ACACIA_LOG, 0); + return new BID(Ids::STRIPPED_ACACIA_LOG, ItemIds::STRIPPED_ACACIA_LOG, 0); case TreeType::DARK_OAK()->id(): - return new BID(Ids::STRIPPED_DARK_OAK_LOG, LegacyIds::STRIPPED_DARK_OAK_LOG, 0); + return new BID(Ids::STRIPPED_DARK_OAK_LOG, ItemIds::STRIPPED_DARK_OAK_LOG, 0); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -295,51 +294,51 @@ final class BlockLegacyIdHelper{ public static function getGlazedTerracottaIdentifier(DyeColor $color) : BlockIdentifier{ switch($color->id()){ case DyeColor::WHITE()->id(): - return new BID(Ids::WHITE_GLAZED_TERRACOTTA, LegacyIds::WHITE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::WHITE_GLAZED_TERRACOTTA, ItemIds::WHITE_GLAZED_TERRACOTTA, 0); case DyeColor::ORANGE()->id(): - return new BID(Ids::ORANGE_GLAZED_TERRACOTTA, LegacyIds::ORANGE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::ORANGE_GLAZED_TERRACOTTA, ItemIds::ORANGE_GLAZED_TERRACOTTA, 0); case DyeColor::MAGENTA()->id(): - return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA, LegacyIds::MAGENTA_GLAZED_TERRACOTTA, 0); + return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA, ItemIds::MAGENTA_GLAZED_TERRACOTTA, 0); case DyeColor::LIGHT_BLUE()->id(): - return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, LegacyIds::LIGHT_BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, ItemIds::LIGHT_BLUE_GLAZED_TERRACOTTA, 0); case DyeColor::YELLOW()->id(): - return new BID(Ids::YELLOW_GLAZED_TERRACOTTA, LegacyIds::YELLOW_GLAZED_TERRACOTTA, 0); + return new BID(Ids::YELLOW_GLAZED_TERRACOTTA, ItemIds::YELLOW_GLAZED_TERRACOTTA, 0); case DyeColor::LIME()->id(): - return new BID(Ids::LIME_GLAZED_TERRACOTTA, LegacyIds::LIME_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIME_GLAZED_TERRACOTTA, ItemIds::LIME_GLAZED_TERRACOTTA, 0); case DyeColor::PINK()->id(): - return new BID(Ids::PINK_GLAZED_TERRACOTTA, LegacyIds::PINK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PINK_GLAZED_TERRACOTTA, ItemIds::PINK_GLAZED_TERRACOTTA, 0); case DyeColor::GRAY()->id(): - return new BID(Ids::GRAY_GLAZED_TERRACOTTA, LegacyIds::GRAY_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GRAY_GLAZED_TERRACOTTA, ItemIds::GRAY_GLAZED_TERRACOTTA, 0); case DyeColor::LIGHT_GRAY()->id(): - return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, LegacyIds::SILVER_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, ItemIds::SILVER_GLAZED_TERRACOTTA, 0); case DyeColor::CYAN()->id(): - return new BID(Ids::CYAN_GLAZED_TERRACOTTA, LegacyIds::CYAN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::CYAN_GLAZED_TERRACOTTA, ItemIds::CYAN_GLAZED_TERRACOTTA, 0); case DyeColor::PURPLE()->id(): - return new BID(Ids::PURPLE_GLAZED_TERRACOTTA, LegacyIds::PURPLE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PURPLE_GLAZED_TERRACOTTA, ItemIds::PURPLE_GLAZED_TERRACOTTA, 0); case DyeColor::BLUE()->id(): - return new BID(Ids::BLUE_GLAZED_TERRACOTTA, LegacyIds::BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLUE_GLAZED_TERRACOTTA, ItemIds::BLUE_GLAZED_TERRACOTTA, 0); case DyeColor::BROWN()->id(): - return new BID(Ids::BROWN_GLAZED_TERRACOTTA, LegacyIds::BROWN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BROWN_GLAZED_TERRACOTTA, ItemIds::BROWN_GLAZED_TERRACOTTA, 0); case DyeColor::GREEN()->id(): - return new BID(Ids::GREEN_GLAZED_TERRACOTTA, LegacyIds::GREEN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GREEN_GLAZED_TERRACOTTA, ItemIds::GREEN_GLAZED_TERRACOTTA, 0); case DyeColor::RED()->id(): - return new BID(Ids::RED_GLAZED_TERRACOTTA, LegacyIds::RED_GLAZED_TERRACOTTA, 0); + return new BID(Ids::RED_GLAZED_TERRACOTTA, ItemIds::RED_GLAZED_TERRACOTTA, 0); case DyeColor::BLACK()->id(): - return new BID(Ids::BLACK_GLAZED_TERRACOTTA, LegacyIds::BLACK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLACK_GLAZED_TERRACOTTA, ItemIds::BLACK_GLAZED_TERRACOTTA, 0); } throw new AssumptionFailedError("Switch should cover all colours"); } public static function getStoneSlabIdentifier(int $blockTypeId, int $stoneSlabId, int $meta) : BID{ - $id = [ - 1 => LegacyIds::STONE_SLAB, - 2 => LegacyIds::STONE_SLAB2, - 3 => LegacyIds::STONE_SLAB3, - 4 => LegacyIds::STONE_SLAB4 + $itemId = [ + 1 => ItemIds::STONE_SLAB, + 2 => ItemIds::STONE_SLAB2, + 3 => ItemIds::STONE_SLAB3, + 4 => ItemIds::STONE_SLAB4 ][$stoneSlabId] ?? null; - if($id === null){ + if($itemId === null){ throw new \InvalidArgumentException("Stone slab type should be 1, 2, 3 or 4"); } - return new BID($blockTypeId, $id, $meta); + return new BID($blockTypeId, $itemId, $meta); } } diff --git a/src/block/BlockLegacyIds.php b/src/block/BlockLegacyIds.php deleted file mode 100644 index f4757e357c..0000000000 --- a/src/block/BlockLegacyIds.php +++ /dev/null @@ -1,501 +0,0 @@ -expectException(\InvalidArgumentException::class); $this->blockFactory->register($block); } @@ -52,7 +53,7 @@ class BlockTest extends TestCase{ * Test registering a block deliberately overwriting another block works as expected */ public function testDeliberateOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, BlockLegacyIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, ItemIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); $this->blockFactory->register($block, true); self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromFullBlock($block->getStateId())); } @@ -63,7 +64,7 @@ class BlockTest extends TestCase{ public function testRegisterNewBlock() : void{ for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i, $i, 0), "Strange New Block", BlockBreakInfo::instant()); + $b = new StrangeNewBlock(new BlockIdentifier($i, $i + 10000, 0), "Strange New Block", BlockBreakInfo::instant()); $this->blockFactory->register($b); self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromFullBlock($b->getStateId())); return; From b9542b49084cc57b7f5a63bf9717430d07abc5d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 15:52:43 +0100 Subject: [PATCH 0168/1858] ItemFactory: fix isRegistered() again we really need to get rid of the ItemFactory legacy nasties so we can burn this code --- src/block/utils/WallConnectionType.php | 48 ++++++++++++++++++++++++++ src/item/ItemFactory.php | 11 +++++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/block/utils/WallConnectionType.php diff --git a/src/block/utils/WallConnectionType.php b/src/block/utils/WallConnectionType.php new file mode 100644 index 0000000000..60f2d01afa --- /dev/null +++ b/src/block/utils/WallConnectionType.php @@ -0,0 +1,48 @@ +upgradeIntIdMeta(self::itemToBlockId($id), $variant & 0xf) !== null; + $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $variant & 0xf); + if($blockStateData === null){ + return false; + } + try{ + GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); + return true; + }catch(BlockStateDeserializeException){ + return false; + } } return isset($this->list[self::getListOffset($id, $variant)]); From 1da4c459794ba0af8e04bd6e56e6ac8173de72b2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 15:59:38 +0100 Subject: [PATCH 0169/1858] Add runtime support for wall connections this doesn't match the 1.16+ behaviour yet, but it at least recognizes walls that are already in the post-1.16 way and doesn't break them if not interacted with. --- src/block/Block.php | 2 +- src/block/Wall.php | 81 ++++++++++++++++--- src/block/utils/BlockDataReader.php | 21 +++++ src/block/utils/BlockDataWriter.php | 19 +++++ src/block/utils/WallConnectionType.php | 2 - .../convert/BlockStateDeserializerHelper.php | 11 ++- .../block/convert/BlockStateReader.php | 14 ++++ .../convert/BlockStateSerializerHelper.php | 12 ++- .../block/convert/BlockStateWriter.php | 12 +++ 9 files changed, 149 insertions(+), 25 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 5bf58b47c2..4bdc776f2d 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -49,7 +49,7 @@ use function count; use const PHP_INT_MAX; class Block{ - public const INTERNAL_STATE_DATA_BITS = 6; + public const INTERNAL_STATE_DATA_BITS = 9; public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS); protected BlockIdentifier $idInfo; diff --git a/src/block/Wall.php b/src/block/Wall.php index e9a6cb9e01..ed3325a34e 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -23,30 +23,93 @@ 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\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; +/** + * @phpstan-type WallConnectionSet array + */ class Wall extends Transparent{ - /** @var int[] facing => facing */ + /** + * @var WallConnectionType[] + * @phpstan-var WallConnectionSet + */ protected array $connections = []; - protected bool $up = false; + protected bool $post = false; - public function readStateFromWorld() : void{ - parent::readStateFromWorld(); + protected function decodeState(BlockDataReader $r) : void{ + $this->connections = $r->readWallConnections(); + $this->post = $r->readBool(); + } - $this->recalculateConnections(); + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeWallConnections($this->connections); + $w->writeBool($this->post); + } + + public function onNearbyBlockChange() : void{ + if($this->recalculateConnections()){ + $this->position->getWorld()->setBlock($this->position, $this); + } + } + + /** + * @return WallConnectionType[] + * @phpstan-return WallConnectionSet + */ + public function getConnections() : array{ return $this->connections; } + + public function getConnection(int $face) : ?WallConnectionType{ + return $this->connections[$face] ?? null; + } + + /** + * @param WallConnectionType[] $connections + * @phpstan-param WallConnectionSet $connections + * @return $this + */ + public function setConnections(array $connections) : self{ + $this->connections = $connections; + return $this; + } + + /** @return $this */ + public function setConnection(int $face, ?WallConnectionType $type) : self{ + if($face !== Facing::NORTH && $face !== Facing::SOUTH && $face !== Facing::WEST && $face !== Facing::EAST){ + throw new \InvalidArgumentException("Facing can only be north, east, south or west"); + } + if($type !== null){ + $this->connections[$face] = $type; + }else{ + unset($this->connections[$face]); + } + return $this; + } + + public function isPost() : bool{ return $this->post; } + + /** @return $this */ + public function setPost(bool $post) : self{ + $this->post = $post; + return $this; } protected function recalculateConnections() : bool{ $changed = 0; + + //TODO: implement tall/short connections - right now we only support short as per pre-1.16 + foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); if($block instanceof static || $block instanceof FenceGate || ($block->isSolid() && !$block->isTransparent())){ if(!isset($this->connections[$facing])){ - $this->connections[$facing] = $facing; + $this->connections[$facing] = WallConnectionType::SHORT(); $changed++; } }elseif(isset($this->connections[$facing])){ @@ -56,8 +119,8 @@ class Wall extends Transparent{ } $up = $this->getSide(Facing::UP)->getTypeId() !== BlockTypeIds::AIR; - if($up !== $this->up){ - $this->up = $up; + if($up !== $this->post){ + $this->post = $up; $changed++; } @@ -74,7 +137,7 @@ class Wall extends Transparent{ $inset = 0.25; if( - !$this->up && //if there is a block on top, it stays as a post + !$this->post && //if there is a block on top, it stays as a post ( ($north && $south && !$west && !$east) || (!$north && !$south && $west && $east) diff --git a/src/block/utils/BlockDataReader.php b/src/block/utils/BlockDataReader.php index e1e7bb6895..22d55dbc86 100644 --- a/src/block/utils/BlockDataReader.php +++ b/src/block/utils/BlockDataReader.php @@ -97,4 +97,25 @@ final class BlockDataReader{ default => throw new AssumptionFailedError("Unreachable") }; } + + /** + * @return WallConnectionType[] + * @phpstan-return array + */ + public function readWallConnections() : array{ + $connections = []; + //TODO: we can pack this into 7 bits instead of 8 + foreach(Facing::HORIZONTAL as $facing){ + $type = $this->readBoundedInt(2, 0, 2); + if($type !== 0){ + $connections[$facing] = match($type){ + 1 => WallConnectionType::SHORT(), + 2 => WallConnectionType::TALL(), + default => throw new AssumptionFailedError("Unreachable") + }; + } + } + + return $connections; + } } diff --git a/src/block/utils/BlockDataWriter.php b/src/block/utils/BlockDataWriter.php index 9b37a8153e..774a584841 100644 --- a/src/block/utils/BlockDataWriter.php +++ b/src/block/utils/BlockDataWriter.php @@ -25,6 +25,7 @@ namespace pocketmine\block\utils; use pocketmine\math\Axis; use pocketmine\math\Facing; +use pocketmine\utils\AssumptionFailedError; final class BlockDataWriter{ @@ -95,6 +96,24 @@ final class BlockDataWriter{ }); } + /** + * @param WallConnectionType[] $connections + * @phpstan-param array $connections + */ + public function writeWallConnections(array $connections) : self{ + //TODO: we can pack this into 7 bits instead of 8 + foreach(Facing::HORIZONTAL as $facing){ + $this->writeInt(2, match($connections[$facing] ?? null){ + null => 0, + WallConnectionType::SHORT() => 1, + WallConnectionType::TALL() => 2, + default => throw new AssumptionFailedError("Unreachable") + }); + } + + return $this; + } + public function getValue() : int{ return $this->value; } public function getOffset() : int{ return $this->offset; } diff --git a/src/block/utils/WallConnectionType.php b/src/block/utils/WallConnectionType.php index 60f2d01afa..11765ab33c 100644 --- a/src/block/utils/WallConnectionType.php +++ b/src/block/utils/WallConnectionType.php @@ -31,7 +31,6 @@ use pocketmine\utils\EnumTrait; * @see build/generate-registry-annotations.php * @generate-registry-docblock * - * @method static WallConnectionType NONE() * @method static WallConnectionType SHORT() * @method static WallConnectionType TALL() */ @@ -40,7 +39,6 @@ final class WallConnectionType{ protected static function setup() : void{ self::registerAll( - new self("none"), new self("short"), new self("tall") ); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index b5a76394d1..a1c2719fce 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -196,12 +196,11 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeWall(Wall $block, BlockStateReader $in) : Wall{ - //TODO: our walls don't support the full range of needed states yet - $in->todo(BlockStateNames::WALL_POST_BIT); //TODO - $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_EAST); - $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_NORTH); - $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH); - $in->todo(BlockStateNames::WALL_CONNECTION_TYPE_WEST); + $block->setPost($in->readBool(BlockStateNames::WALL_POST_BIT)); + $block->setConnection(Facing::NORTH, $in->readWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_NORTH)); + $block->setConnection(Facing::SOUTH, $in->readWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH)); + $block->setConnection(Facing::WEST, $in->readWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_WEST)); + $block->setConnection(Facing::EAST, $in->readWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_EAST)); return $block; } diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 3380721f5a..0d1a0000f1 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -27,6 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; +use pocketmine\block\utils\WallConnectionType; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; @@ -296,6 +297,19 @@ final class BlockStateReader{ }; } + /** @throws BlockStateDeserializeException */ + public function readWallConnectionType(string $name) : ?WallConnectionType{ + return match($type = $this->readString($name)){ + //TODO: this looks a bit confusing due to use of EAST, but the values are the same for all connections + //we need to find a better way to auto-generate the constant names when they are reused + //for now, using these constants is better than nothing since it still gives static analysability + StringValues::WALL_CONNECTION_TYPE_EAST_NONE => null, + StringValues::WALL_CONNECTION_TYPE_EAST_SHORT => WallConnectionType::SHORT(), + StringValues::WALL_CONNECTION_TYPE_EAST_TALL => WallConnectionType::TALL(), + default => throw $this->badValueException($name, $type), + }; + } + /** * Explicitly mark a property as unused, so it doesn't get flagged as an error when debug mode is enabled */ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 1abe7059a3..b65abbaae9 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -48,7 +48,6 @@ use pocketmine\block\Wall; use pocketmine\block\WallSign; use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockStateNames; -use pocketmine\data\bedrock\block\BlockStateStringValues; use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; @@ -245,13 +244,12 @@ final class BlockStateSerializerHelper{ } public static function encodeWall(Wall $block, BlockStateWriter $out) : BlockStateWriter{ - //TODO: our walls don't support the full range of needed states yet return $out - ->writeBool(BlockStateNames::WALL_POST_BIT, false) - ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_EAST, BlockStateStringValues::WALL_CONNECTION_TYPE_EAST_NONE) - ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_NORTH, BlockStateStringValues::WALL_CONNECTION_TYPE_NORTH_NONE) - ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH, BlockStateStringValues::WALL_CONNECTION_TYPE_SOUTH_NONE) - ->writeString(BlockStateNames::WALL_CONNECTION_TYPE_WEST, BlockStateStringValues::WALL_CONNECTION_TYPE_WEST_NONE); + ->writeBool(BlockStateNames::WALL_POST_BIT, $block->isPost()) + ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_EAST, $block->getConnection(Facing::EAST)) + ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_NORTH, $block->getConnection(Facing::NORTH)) + ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_SOUTH, $block->getConnection(Facing::SOUTH)) + ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_WEST, $block->getConnection(Facing::WEST)); } public static function encodeLegacyWall(Wall $block, string $type) : BlockStateWriter{ diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 294c0c0153..4186972dd7 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -28,6 +28,7 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WallConnectionType; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateSerializeException; @@ -263,6 +264,17 @@ final class BlockStateWriter{ return $this; } + /** @return $this */ + public function writeWallConnectionType(string $name, ?WallConnectionType $wallConnectionType) : self{ + $this->writeString($name, match($wallConnectionType){ + null => StringValues::WALL_CONNECTION_TYPE_EAST_NONE, + WallConnectionType::SHORT() => StringValues::WALL_CONNECTION_TYPE_EAST_SHORT, + WallConnectionType::TALL() => StringValues::WALL_CONNECTION_TYPE_EAST_TALL, + default => throw new BlockStateSerializeException("Invalid Wall connection type " . $wallConnectionType->name()) + }); + return $this; + } + public function getBlockStateData() : BlockStateData{ return new BlockStateData($this->id, $this->states, BlockStateData::CURRENT_VERSION); } From 03fdbd9f7b8123e9240cf8890d2843a6adf10d5b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 15:59:52 +0100 Subject: [PATCH 0170/1858] fix CS --- tests/phpunit/item/ItemFactoryTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/phpunit/item/ItemFactoryTest.php b/tests/phpunit/item/ItemFactoryTest.php index a0163f5fe8..205a871071 100644 --- a/tests/phpunit/item/ItemFactoryTest.php +++ b/tests/phpunit/item/ItemFactoryTest.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use PHPUnit\Framework\TestCase; -use pocketmine\block\BlockFactory; class ItemFactoryTest extends TestCase{ From f57e02849a54670f1ec80d1319310a89de2370f4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 16:01:11 +0100 Subject: [PATCH 0171/1858] Wall: move function for consistency --- src/block/Wall.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/block/Wall.php b/src/block/Wall.php index ed3325a34e..a97aba751b 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -53,12 +53,6 @@ class Wall extends Transparent{ $w->writeBool($this->post); } - public function onNearbyBlockChange() : void{ - if($this->recalculateConnections()){ - $this->position->getWorld()->setBlock($this->position, $this); - } - } - /** * @return WallConnectionType[] * @phpstan-return WallConnectionSet @@ -100,6 +94,12 @@ class Wall extends Transparent{ return $this; } + public function onNearbyBlockChange() : void{ + if($this->recalculateConnections()){ + $this->position->getWorld()->setBlock($this->position, $this); + } + } + protected function recalculateConnections() : bool{ $changed = 0; From db8bf672f0933a5bc908825f973be4b845e54573 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 16:10:06 +0100 Subject: [PATCH 0172/1858] fix item frames --- src/block/tile/ItemFrame.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/block/tile/ItemFrame.php b/src/block/tile/ItemFrame.php index d05c8fedca..92db02d5f6 100644 --- a/src/block/tile/ItemFrame.php +++ b/src/block/tile/ItemFrame.php @@ -58,7 +58,9 @@ class ItemFrame extends Spawnable{ protected function writeSaveData(CompoundTag $nbt) : void{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); - $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); + if(!$this->item->isNull()){ + $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); + } } public function hasItem() : bool{ @@ -96,6 +98,8 @@ class ItemFrame extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); - $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); + if(!$this->item->isNull()){ + $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); + } } } From 27d767227351cbd21a925e1db0f577b42203cdcc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 16:10:39 +0100 Subject: [PATCH 0173/1858] Item frames can now be placed on the up or down faces of blocks --- src/block/ItemFrame.php | 10 +++++----- .../convert/BlockObjectToBlockStateSerializer.php | 2 +- .../convert/BlockStateToBlockObjectDeserializer.php | 3 +-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 1f77323a00..31f802f1dc 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -24,9 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; +use pocketmine\block\utils\AnyFacingTrait; use pocketmine\block\utils\BlockDataReader; use pocketmine\block\utils\BlockDataWriter; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -37,7 +37,7 @@ use function is_nan; use function lcg_value; class ItemFrame extends Flowable{ - use HorizontalFacingTrait; + use AnyFacingTrait; public const ROTATIONS = 8; @@ -48,12 +48,12 @@ class ItemFrame extends Flowable{ protected float $itemDropChance = 1.0; protected function decodeState(BlockDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); + $this->facing = $r->readFacing(); $this->hasMap = $r->readBool(); } protected function encodeState(BlockDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); + $w->writeFacing($this->facing); $w->writeBool($this->hasMap); } @@ -164,7 +164,7 @@ class ItemFrame extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($face === Facing::DOWN || $face === Facing::UP || !$blockClicked->isSolid()){ + if(!$blockClicked->isSolid()){ return false; } diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index c70b61d59e..ec3f51236b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -694,7 +694,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::FRAME) ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) - ->writeHorizontalFacing($block->getFacing()); + ->writeFacingDirection($block->getFacing()); }); $this->map(Blocks::JUKEBOX(), fn() => new Writer(Ids::JUKEBOX)); $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index f210726c4a..ad0801c11e 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -486,10 +486,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in)); $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in)); $this->map(Ids::FRAME, function(Reader $in) : Block{ - //TODO: in R13 this can be any side, not just horizontal $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is return Blocks::ITEM_FRAME() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readFacingDirection()) ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); }); $this->map(Ids::FROSTED_ICE, function(Reader $in) : Block{ From b56d0491033bd0fa4f1c3efbea5a547a9ae46592 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 16:12:15 +0100 Subject: [PATCH 0174/1858] Updated BlockFactory consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index c4bd93b4d3..30e17a9768 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"641024":"Activator Rail","641025":"Activator Rail","641026":"Activator Rail","641027":"Activator Rail","641028":"Activator Rail","641029":"Activator Rail","641032":"Activator Rail","641033":"Activator Rail","641034":"Activator Rail","641035":"Activator Rail","641036":"Activator Rail","641037":"Activator Rail","640000":"Air","641472":"Anvil","641473":"Anvil","641474":"Anvil","641476":"Anvil","641477":"Anvil","641478":"Anvil","641480":"Anvil","641481":"Anvil","641482":"Anvil","641484":"Anvil","641485":"Anvil","641486":"Anvil","641600":"Bamboo","641601":"Bamboo","641602":"Bamboo","641604":"Bamboo","641605":"Bamboo","641606":"Bamboo","641608":"Bamboo","641609":"Bamboo","641610":"Bamboo","641612":"Bamboo","641613":"Bamboo","641614":"Bamboo","641664":"Bamboo Sapling","641665":"Bamboo Sapling","641728":"Banner","641729":"Banner","641730":"Banner","641731":"Banner","641732":"Banner","641733":"Banner","641734":"Banner","641735":"Banner","641736":"Banner","641737":"Banner","641738":"Banner","641739":"Banner","641740":"Banner","641741":"Banner","641742":"Banner","641743":"Banner","673856":"Wall Banner","673857":"Wall Banner","673858":"Wall Banner","673859":"Wall Banner","641792":"Barrel","641793":"Barrel","641794":"Barrel","641795":"Barrel","641796":"Barrel","641797":"Barrel","641800":"Barrel","641801":"Barrel","641802":"Barrel","641803":"Barrel","641804":"Barrel","641805":"Barrel","641856":"Barrier","641920":"Beacon","641984":"Bed Block","641985":"Bed Block","641986":"Bed Block","641987":"Bed Block","641988":"Bed Block","641989":"Bed Block","641990":"Bed Block","641991":"Bed Block","641992":"Bed Block","641993":"Bed Block","641994":"Bed Block","641995":"Bed Block","641996":"Bed Block","641997":"Bed Block","641998":"Bed Block","641999":"Bed Block","642048":"Bedrock","642049":"Bedrock","642112":"Beetroot Block","642113":"Beetroot Block","642114":"Beetroot Block","642115":"Beetroot Block","642116":"Beetroot Block","642117":"Beetroot Block","642118":"Beetroot Block","642119":"Beetroot Block","642176":"Bell","642177":"Bell","642178":"Bell","642179":"Bell","642180":"Bell","642181":"Bell","642182":"Bell","642183":"Bell","642184":"Bell","642185":"Bell","642186":"Bell","642187":"Bell","642188":"Bell","642189":"Bell","642190":"Bell","642191":"Bell","643392":"Blue Ice","643584":"Bone Block","643585":"Bone Block","643586":"Bone Block","643648":"Bookshelf","643712":"Brewing Stand","643713":"Brewing Stand","643714":"Brewing Stand","643715":"Brewing Stand","643716":"Brewing Stand","643717":"Brewing Stand","643718":"Brewing Stand","643719":"Brewing Stand","643840":"Brick Stairs","643841":"Brick Stairs","643842":"Brick Stairs","643843":"Brick Stairs","643844":"Brick Stairs","643845":"Brick Stairs","643846":"Brick Stairs","643847":"Brick Stairs","643968":"Bricks","644096":"Brown Mushroom","644224":"Cactus","644225":"Cactus","644226":"Cactus","644227":"Cactus","644228":"Cactus","644229":"Cactus","644230":"Cactus","644231":"Cactus","644232":"Cactus","644233":"Cactus","644234":"Cactus","644235":"Cactus","644236":"Cactus","644237":"Cactus","644238":"Cactus","644239":"Cactus","644288":"Cake","644289":"Cake","644290":"Cake","644291":"Cake","644292":"Cake","644293":"Cake","644294":"Cake","644416":"Carrot Block","644417":"Carrot Block","644418":"Carrot Block","644419":"Carrot Block","644420":"Carrot Block","644421":"Carrot Block","644422":"Carrot Block","644423":"Carrot Block","644608":"Chest","644609":"Chest","644610":"Chest","644611":"Chest","644928":"Clay Block","644992":"Coal Block","645056":"Coal Ore","645120":"Cobblestone","662400":"Mossy Cobblestone","645248":"Cobblestone Stairs","645249":"Cobblestone Stairs","645250":"Cobblestone Stairs","645251":"Cobblestone Stairs","645252":"Cobblestone Stairs","645253":"Cobblestone Stairs","645254":"Cobblestone Stairs","645255":"Cobblestone Stairs","662528":"Mossy Cobblestone Stairs","662529":"Mossy Cobblestone Stairs","662530":"Mossy Cobblestone Stairs","662531":"Mossy Cobblestone Stairs","662532":"Mossy Cobblestone Stairs","662533":"Mossy Cobblestone Stairs","662534":"Mossy Cobblestone Stairs","662535":"Mossy Cobblestone Stairs","645376":"Cobweb","645440":"Cocoa Block","645441":"Cocoa Block","645442":"Cocoa Block","645443":"Cocoa Block","645444":"Cocoa Block","645445":"Cocoa Block","645446":"Cocoa Block","645447":"Cocoa Block","645448":"Cocoa Block","645449":"Cocoa Block","645450":"Cocoa Block","645451":"Cocoa Block","645760":"Coral Block","645761":"Coral Block","645762":"Coral Block","645763":"Coral Block","645764":"Coral Block","645768":"Coral Block","645769":"Coral Block","645770":"Coral Block","645771":"Coral Block","645772":"Coral Block","646016":"Crafting Table","647616":"Daylight Sensor","647617":"Daylight Sensor","647618":"Daylight Sensor","647619":"Daylight Sensor","647620":"Daylight Sensor","647621":"Daylight Sensor","647622":"Daylight Sensor","647623":"Daylight Sensor","647624":"Daylight Sensor","647625":"Daylight Sensor","647626":"Daylight Sensor","647627":"Daylight Sensor","647628":"Daylight Sensor","647629":"Daylight Sensor","647630":"Daylight Sensor","647631":"Daylight Sensor","647632":"Daylight Sensor","647633":"Daylight Sensor","647634":"Daylight Sensor","647635":"Daylight Sensor","647636":"Daylight Sensor","647637":"Daylight Sensor","647638":"Daylight Sensor","647639":"Daylight Sensor","647640":"Daylight Sensor","647641":"Daylight Sensor","647642":"Daylight Sensor","647643":"Daylight Sensor","647644":"Daylight Sensor","647645":"Daylight Sensor","647646":"Daylight Sensor","647647":"Daylight Sensor","647680":"Dead Bush","647744":"Detector Rail","647745":"Detector Rail","647746":"Detector Rail","647747":"Detector Rail","647748":"Detector Rail","647749":"Detector Rail","647752":"Detector Rail","647753":"Detector Rail","647754":"Detector Rail","647755":"Detector Rail","647756":"Detector Rail","647757":"Detector Rail","647808":"Diamond Block","647872":"Diamond Ore","648192":"Dirt","648193":"Dirt","673216":"Sunflower","673217":"Sunflower","661568":"Lilac","661569":"Lilac","668800":"Rose Bush","668801":"Rose Bush","665088":"Peony","665089":"Peony","648256":"Double Tallgrass","648257":"Double Tallgrass","661120":"Large Fern","661121":"Large Fern","648320":"Dragon Egg","648384":"Dried Kelp Block","656192":"Emerald Block","656256":"Emerald Ore","656320":"Enchanting Table","656384":"End Portal Frame","656385":"End Portal Frame","656386":"End Portal Frame","656387":"End Portal Frame","656388":"End Portal Frame","656389":"End Portal Frame","656390":"End Portal Frame","656391":"End Portal Frame","656448":"End Rod","656449":"End Rod","656450":"End Rod","656451":"End Rod","656452":"End Rod","656453":"End Rod","656512":"End Stone","656768":"End Stone Bricks","656640":"End Stone Brick Stairs","656641":"End Stone Brick Stairs","656642":"End Stone Brick Stairs","656643":"End Stone Brick Stairs","656644":"End Stone Brick Stairs","656645":"End Stone Brick Stairs","656646":"End Stone Brick Stairs","656647":"End Stone Brick Stairs","656832":"Ender Chest","656833":"Ender Chest","656834":"Ender Chest","656835":"Ender Chest","656960":"Farmland","656961":"Farmland","656962":"Farmland","656963":"Farmland","656964":"Farmland","656965":"Farmland","656966":"Farmland","656967":"Farmland","657088":"Fire Block","657089":"Fire Block","657090":"Fire Block","657091":"Fire Block","657092":"Fire Block","657093":"Fire Block","657094":"Fire Block","657095":"Fire Block","657096":"Fire Block","657097":"Fire Block","657098":"Fire Block","657099":"Fire Block","657100":"Fire Block","657101":"Fire Block","657102":"Fire Block","657103":"Fire Block","657152":"Fletching Table","646400":"Dandelion","665920":"Poppy","641152":"Allium","641536":"Azure Bluet","643456":"Blue Orchid","645888":"Cornflower","661632":"Lily of the Valley","664896":"Orange Tulip","664960":"Oxeye Daisy","665216":"Pink Tulip","668224":"Red Tulip","674304":"White Tulip","657216":"Flower Pot","657280":"Frosted Ice","657281":"Frosted Ice","657282":"Frosted Ice","657283":"Frosted Ice","657344":"Furnace","657345":"Furnace","657346":"Furnace","657347":"Furnace","657348":"Furnace","657349":"Furnace","657350":"Furnace","657351":"Furnace","643264":"Blast Furnace","643265":"Blast Furnace","643266":"Blast Furnace","643267":"Blast Furnace","643268":"Blast Furnace","643269":"Blast Furnace","643270":"Blast Furnace","643271":"Blast Furnace","669440":"Smoker","669441":"Smoker","669442":"Smoker","669443":"Smoker","669444":"Smoker","669445":"Smoker","669446":"Smoker","669447":"Smoker","657408":"Glass","657472":"Glass Pane","657536":"Glowing Obsidian","657600":"Glowstone","657664":"Gold Block","657728":"Gold Ore","658048":"Grass","658112":"Grass Path","658176":"Gravel","658432":"Hardened Clay","658496":"Hardened Glass","658560":"Hardened Glass Pane","658624":"Hay Bale","658625":"Hay Bale","658626":"Hay Bale","658688":"Hopper","658690":"Hopper","658691":"Hopper","658692":"Hopper","658693":"Hopper","658696":"Hopper","658698":"Hopper","658699":"Hopper","658700":"Hopper","658701":"Hopper","658752":"Ice","659200":"update!","659264":"ate!upd","659328":"Invisible Bedrock","659392":"Iron Block","659456":"Iron Bars","659520":"Iron Door","659521":"Iron Door","659522":"Iron Door","659523":"Iron Door","659524":"Iron Door","659525":"Iron Door","659526":"Iron Door","659527":"Iron Door","659528":"Iron Door","659529":"Iron Door","659530":"Iron Door","659531":"Iron Door","659532":"Iron Door","659533":"Iron Door","659534":"Iron Door","659535":"Iron Door","659536":"Iron Door","659537":"Iron Door","659538":"Iron Door","659539":"Iron Door","659540":"Iron Door","659541":"Iron Door","659542":"Iron Door","659543":"Iron Door","659544":"Iron Door","659545":"Iron Door","659546":"Iron Door","659547":"Iron Door","659548":"Iron Door","659549":"Iron Door","659550":"Iron Door","659551":"Iron Door","659648":"Iron Trapdoor","659649":"Iron Trapdoor","659650":"Iron Trapdoor","659651":"Iron Trapdoor","659652":"Iron Trapdoor","659653":"Iron Trapdoor","659654":"Iron Trapdoor","659655":"Iron Trapdoor","659656":"Iron Trapdoor","659657":"Iron Trapdoor","659658":"Iron Trapdoor","659659":"Iron Trapdoor","659660":"Iron Trapdoor","659661":"Iron Trapdoor","659662":"Iron Trapdoor","659663":"Iron Trapdoor","659584":"Iron Ore","659712":"Item Frame","659713":"Item Frame","659714":"Item Frame","659715":"Item Frame","659716":"Item Frame","659717":"Item Frame","659718":"Item Frame","659719":"Item Frame","659776":"Jukebox","660864":"Ladder","660865":"Ladder","660866":"Ladder","660867":"Ladder","660928":"Lantern","660929":"Lantern","660992":"Lapis Lazuli Block","661056":"Lapis Lazuli Ore","661184":"Lava","661185":"Lava","661186":"Lava","661187":"Lava","661188":"Lava","661189":"Lava","661190":"Lava","661191":"Lava","661192":"Lava","661193":"Lava","661194":"Lava","661195":"Lava","661196":"Lava","661197":"Lava","661198":"Lava","661199":"Lava","661200":"Lava","661201":"Lava","661202":"Lava","661203":"Lava","661204":"Lava","661205":"Lava","661206":"Lava","661207":"Lava","661208":"Lava","661209":"Lava","661210":"Lava","661211":"Lava","661212":"Lava","661213":"Lava","661214":"Lava","661215":"Lava","661248":"Lectern","661249":"Lectern","661250":"Lectern","661251":"Lectern","661252":"Lectern","661253":"Lectern","661254":"Lectern","661255":"Lectern","661376":"Lever","661377":"Lever","661378":"Lever","661379":"Lever","661380":"Lever","661381":"Lever","661382":"Lever","661383":"Lever","661384":"Lever","661385":"Lever","661386":"Lever","661387":"Lever","661388":"Lever","661389":"Lever","661390":"Lever","661391":"Lever","661888":"Loom","661889":"Loom","661890":"Loom","661891":"Loom","662016":"Magma Block","662144":"Melon Block","662208":"Melon Stem","662209":"Melon Stem","662210":"Melon Stem","662211":"Melon Stem","662212":"Melon Stem","662213":"Melon Stem","662214":"Melon Stem","662215":"Melon Stem","662336":"Monster Spawner","662976":"Mycelium","663296":"Nether Bricks","667776":"Red Nether Bricks","663040":"Nether Brick Fence","663168":"Nether Brick Stairs","663169":"Nether Brick Stairs","663170":"Nether Brick Stairs","663171":"Nether Brick Stairs","663172":"Nether Brick Stairs","663173":"Nether Brick Stairs","663174":"Nether Brick Stairs","663175":"Nether Brick Stairs","667648":"Red Nether Brick Stairs","667649":"Red Nether Brick Stairs","667650":"Red Nether Brick Stairs","667651":"Red Nether Brick Stairs","667652":"Red Nether Brick Stairs","667653":"Red Nether Brick Stairs","667654":"Red Nether Brick Stairs","667655":"Red Nether Brick Stairs","663360":"Nether Portal","663361":"Nether Portal","663424":"Nether Quartz Ore","663488":"Nether Reactor Core","663616":"Nether Wart Block","663552":"Nether Wart","663553":"Nether Wart","663554":"Nether Wart","663555":"Nether Wart","663680":"Netherrack","663744":"Note Block","664768":"Obsidian","665024":"Packed Ice","665280":"Podzol","665984":"Potato Block","665985":"Potato Block","665986":"Potato Block","665987":"Potato Block","665988":"Potato Block","665989":"Potato Block","665990":"Potato Block","665991":"Potato Block","666048":"Powered Rail","666049":"Powered Rail","666050":"Powered Rail","666051":"Powered Rail","666052":"Powered Rail","666053":"Powered Rail","666056":"Powered Rail","666057":"Powered Rail","666058":"Powered Rail","666059":"Powered Rail","666060":"Powered Rail","666061":"Powered Rail","666112":"Prismarine","647424":"Dark Prismarine","666176":"Prismarine Bricks","666304":"Prismarine Bricks Stairs","666305":"Prismarine Bricks Stairs","666306":"Prismarine Bricks Stairs","666307":"Prismarine Bricks Stairs","666308":"Prismarine Bricks Stairs","666309":"Prismarine Bricks Stairs","666310":"Prismarine Bricks Stairs","666311":"Prismarine Bricks Stairs","647552":"Dark Prismarine Stairs","647553":"Dark Prismarine Stairs","647554":"Dark Prismarine Stairs","647555":"Dark Prismarine Stairs","647556":"Dark Prismarine Stairs","647557":"Dark Prismarine Stairs","647558":"Dark Prismarine Stairs","647559":"Dark Prismarine Stairs","666432":"Prismarine Stairs","666433":"Prismarine Stairs","666434":"Prismarine Stairs","666435":"Prismarine Stairs","666436":"Prismarine Stairs","666437":"Prismarine Stairs","666438":"Prismarine Stairs","666439":"Prismarine Stairs","666560":"Pumpkin","644480":"Carved Pumpkin","644481":"Carved Pumpkin","644482":"Carved Pumpkin","644483":"Carved Pumpkin","661824":"Jack o'Lantern","661825":"Jack o'Lantern","661826":"Jack o'Lantern","661827":"Jack o'Lantern","666624":"Pumpkin Stem","666625":"Pumpkin Stem","666626":"Pumpkin Stem","666627":"Pumpkin Stem","666628":"Pumpkin Stem","666629":"Pumpkin Stem","666630":"Pumpkin Stem","666631":"Pumpkin Stem","666816":"Purpur Block","666880":"Purpur Pillar","666881":"Purpur Pillar","666882":"Purpur Pillar","667008":"Purpur Stairs","667009":"Purpur Stairs","667010":"Purpur Stairs","667011":"Purpur Stairs","667012":"Purpur Stairs","667013":"Purpur Stairs","667014":"Purpur Stairs","667015":"Purpur Stairs","667072":"Quartz Block","644672":"Chiseled Quartz Block","644673":"Chiseled Quartz Block","644674":"Chiseled Quartz Block","667136":"Quartz Pillar","667137":"Quartz Pillar","667138":"Quartz Pillar","669504":"Smooth Quartz Block","667264":"Quartz Stairs","667265":"Quartz Stairs","667266":"Quartz Stairs","667267":"Quartz Stairs","667268":"Quartz Stairs","667269":"Quartz Stairs","667270":"Quartz Stairs","667271":"Quartz Stairs","669632":"Smooth Quartz Stairs","669633":"Smooth Quartz Stairs","669634":"Smooth Quartz Stairs","669635":"Smooth Quartz Stairs","669636":"Smooth Quartz Stairs","669637":"Smooth Quartz Stairs","669638":"Smooth Quartz Stairs","669639":"Smooth Quartz Stairs","667328":"Rail","667329":"Rail","667330":"Rail","667331":"Rail","667332":"Rail","667333":"Rail","667334":"Rail","667335":"Rail","667336":"Rail","667337":"Rail","667456":"Red Mushroom","668288":"Redstone Block","668352":"Redstone Comparator","668353":"Redstone Comparator","668354":"Redstone Comparator","668355":"Redstone Comparator","668356":"Redstone Comparator","668357":"Redstone Comparator","668358":"Redstone Comparator","668359":"Redstone Comparator","668360":"Redstone Comparator","668361":"Redstone Comparator","668362":"Redstone Comparator","668363":"Redstone Comparator","668364":"Redstone Comparator","668365":"Redstone Comparator","668366":"Redstone Comparator","668367":"Redstone Comparator","668416":"Redstone Lamp","668417":"Redstone Lamp","668480":"Redstone Ore","668481":"Redstone Ore","668544":"Redstone Repeater","668545":"Redstone Repeater","668546":"Redstone Repeater","668547":"Redstone Repeater","668548":"Redstone Repeater","668549":"Redstone Repeater","668550":"Redstone Repeater","668551":"Redstone Repeater","668552":"Redstone Repeater","668553":"Redstone Repeater","668554":"Redstone Repeater","668555":"Redstone Repeater","668556":"Redstone Repeater","668557":"Redstone Repeater","668558":"Redstone Repeater","668559":"Redstone Repeater","668560":"Redstone Repeater","668561":"Redstone Repeater","668562":"Redstone Repeater","668563":"Redstone Repeater","668564":"Redstone Repeater","668565":"Redstone Repeater","668566":"Redstone Repeater","668567":"Redstone Repeater","668568":"Redstone Repeater","668569":"Redstone Repeater","668570":"Redstone Repeater","668571":"Redstone Repeater","668572":"Redstone Repeater","668573":"Redstone Repeater","668574":"Redstone Repeater","668575":"Redstone Repeater","668609":"Redstone Torch","668610":"Redstone Torch","668611":"Redstone Torch","668612":"Redstone Torch","668613":"Redstone Torch","668617":"Redstone Torch","668618":"Redstone Torch","668619":"Redstone Torch","668620":"Redstone Torch","668621":"Redstone Torch","668672":"Redstone","668673":"Redstone","668674":"Redstone","668675":"Redstone","668676":"Redstone","668677":"Redstone","668678":"Redstone","668679":"Redstone","668680":"Redstone","668681":"Redstone","668682":"Redstone","668683":"Redstone","668684":"Redstone","668685":"Redstone","668686":"Redstone","668687":"Redstone","668736":"reserved6","668864":"Sand","667840":"Red Sand","669184":"Sea Lantern","669248":"Sea Pickle","669249":"Sea Pickle","669250":"Sea Pickle","669251":"Sea Pickle","669252":"Sea Pickle","669253":"Sea Pickle","669254":"Sea Pickle","669255":"Sea Pickle","662273":"Mob Head","662274":"Mob Head","662275":"Mob Head","662276":"Mob Head","662277":"Mob Head","669376":"Slime Block","670208":"Snow Block","670272":"Snow Layer","670273":"Snow Layer","670274":"Snow Layer","670275":"Snow Layer","670276":"Snow Layer","670277":"Snow Layer","670278":"Snow Layer","670279":"Snow Layer","670336":"Soul Sand","670400":"Sponge","670401":"Sponge","669312":"Shulker Box","671744":"Stone","641216":"Andesite","647936":"Diorite","657792":"Granite","665344":"Polished Andesite","665536":"Polished Diorite","665728":"Polished Granite","672000":"Stone Bricks","662848":"Mossy Stone Bricks","645952":"Cracked Stone Bricks","644864":"Chiseled Stone Bricks","659072":"Infested Stone","659136":"Infested Stone Brick","658880":"Infested Cobblestone","659008":"Infested Mossy Stone Brick","658944":"Infested Cracked Stone Brick","658816":"Infested Chiseled Stone Brick","672256":"Stone Stairs","672257":"Stone Stairs","672258":"Stone Stairs","672259":"Stone Stairs","672260":"Stone Stairs","672261":"Stone Stairs","672262":"Stone Stairs","672263":"Stone Stairs","670080":"Smooth Stone","641344":"Andesite Stairs","641345":"Andesite Stairs","641346":"Andesite Stairs","641347":"Andesite Stairs","641348":"Andesite Stairs","641349":"Andesite Stairs","641350":"Andesite Stairs","641351":"Andesite Stairs","648064":"Diorite Stairs","648065":"Diorite Stairs","648066":"Diorite Stairs","648067":"Diorite Stairs","648068":"Diorite Stairs","648069":"Diorite Stairs","648070":"Diorite Stairs","648071":"Diorite Stairs","657920":"Granite Stairs","657921":"Granite Stairs","657922":"Granite Stairs","657923":"Granite Stairs","657924":"Granite Stairs","657925":"Granite Stairs","657926":"Granite Stairs","657927":"Granite Stairs","665472":"Polished Andesite Stairs","665473":"Polished Andesite Stairs","665474":"Polished Andesite Stairs","665475":"Polished Andesite Stairs","665476":"Polished Andesite Stairs","665477":"Polished Andesite Stairs","665478":"Polished Andesite Stairs","665479":"Polished Andesite Stairs","665664":"Polished Diorite Stairs","665665":"Polished Diorite Stairs","665666":"Polished Diorite Stairs","665667":"Polished Diorite Stairs","665668":"Polished Diorite Stairs","665669":"Polished Diorite Stairs","665670":"Polished Diorite Stairs","665671":"Polished Diorite Stairs","665856":"Polished Granite Stairs","665857":"Polished Granite Stairs","665858":"Polished Granite Stairs","665859":"Polished Granite Stairs","665860":"Polished Granite Stairs","665861":"Polished Granite Stairs","665862":"Polished Granite Stairs","665863":"Polished Granite Stairs","671872":"Stone Brick Stairs","671873":"Stone Brick Stairs","671874":"Stone Brick Stairs","671875":"Stone Brick Stairs","671876":"Stone Brick Stairs","671877":"Stone Brick Stairs","671878":"Stone Brick Stairs","671879":"Stone Brick Stairs","662720":"Mossy Stone Brick Stairs","662721":"Mossy Stone Brick Stairs","662722":"Mossy Stone Brick Stairs","662723":"Mossy Stone Brick Stairs","662724":"Mossy Stone Brick Stairs","662725":"Mossy Stone Brick Stairs","662726":"Mossy Stone Brick Stairs","662727":"Mossy Stone Brick Stairs","672064":"Stone Button","672065":"Stone Button","672066":"Stone Button","672067":"Stone Button","672068":"Stone Button","672069":"Stone Button","672072":"Stone Button","672073":"Stone Button","672074":"Stone Button","672075":"Stone Button","672076":"Stone Button","672077":"Stone Button","672320":"Stonecutter","672321":"Stonecutter","672322":"Stonecutter","672323":"Stonecutter","672128":"Stone Pressure Plate","672129":"Stone Pressure Plate","643776":"Brick Slab","643777":"Brick Slab","643778":"Brick Slab","645184":"Cobblestone Slab","645185":"Cobblestone Slab","645186":"Cobblestone Slab","656896":"Fake Wooden Slab","656897":"Fake Wooden Slab","656898":"Fake Wooden Slab","663104":"Nether Brick Slab","663105":"Nether Brick Slab","663106":"Nether Brick Slab","667200":"Quartz Slab","667201":"Quartz Slab","667202":"Quartz Slab","668992":"Sandstone Slab","668993":"Sandstone Slab","668994":"Sandstone Slab","670144":"Smooth Stone Slab","670145":"Smooth Stone Slab","670146":"Smooth Stone Slab","671808":"Stone Brick Slab","671809":"Stone Brick Slab","671810":"Stone Brick Slab","647488":"Dark Prismarine Slab","647489":"Dark Prismarine Slab","647490":"Dark Prismarine Slab","662464":"Mossy Cobblestone Slab","662465":"Mossy Cobblestone Slab","662466":"Mossy Cobblestone Slab","666368":"Prismarine Slab","666369":"Prismarine Slab","666370":"Prismarine Slab","666240":"Prismarine Bricks Slab","666241":"Prismarine Bricks Slab","666242":"Prismarine Bricks Slab","666944":"Purpur Slab","666945":"Purpur Slab","666946":"Purpur Slab","667584":"Red Nether Brick Slab","667585":"Red Nether Brick Slab","667586":"Red Nether Brick Slab","667968":"Red Sandstone Slab","667969":"Red Sandstone Slab","667970":"Red Sandstone Slab","669952":"Smooth Sandstone Slab","669953":"Smooth Sandstone Slab","669954":"Smooth Sandstone Slab","641280":"Andesite Slab","641281":"Andesite Slab","641282":"Andesite Slab","648000":"Diorite Slab","648001":"Diorite Slab","648002":"Diorite Slab","656576":"End Stone Brick Slab","656577":"End Stone Brick Slab","656578":"End Stone Brick Slab","657856":"Granite Slab","657857":"Granite Slab","657858":"Granite Slab","665408":"Polished Andesite Slab","665409":"Polished Andesite Slab","665410":"Polished Andesite Slab","665600":"Polished Diorite Slab","665601":"Polished Diorite Slab","665602":"Polished Diorite Slab","665792":"Polished Granite Slab","665793":"Polished Granite Slab","665794":"Polished Granite Slab","669760":"Smooth Red Sandstone Slab","669761":"Smooth Red Sandstone Slab","669762":"Smooth Red Sandstone Slab","646144":"Cut Red Sandstone Slab","646145":"Cut Red Sandstone Slab","646146":"Cut Red Sandstone Slab","646272":"Cut Sandstone Slab","646273":"Cut Sandstone Slab","646274":"Cut Sandstone Slab","662656":"Mossy Stone Brick Slab","662657":"Mossy Stone Brick Slab","662658":"Mossy Stone Brick Slab","669568":"Smooth Quartz Slab","669569":"Smooth Quartz Slab","669570":"Smooth Quartz Slab","672192":"Stone Slab","672193":"Stone Slab","672194":"Stone Slab","661312":"Legacy Stonecutter","673152":"Sugarcane","673153":"Sugarcane","673154":"Sugarcane","673155":"Sugarcane","673156":"Sugarcane","673157":"Sugarcane","673158":"Sugarcane","673159":"Sugarcane","673160":"Sugarcane","673161":"Sugarcane","673162":"Sugarcane","673163":"Sugarcane","673164":"Sugarcane","673165":"Sugarcane","673166":"Sugarcane","673167":"Sugarcane","673280":"Sweet Berry Bush","673281":"Sweet Berry Bush","673282":"Sweet Berry Bush","673283":"Sweet Berry Bush","673408":"TNT","673409":"TNT","673410":"TNT","673411":"TNT","657024":"Fern","673344":"Tall Grass","643521":"Blue Torch","643522":"Blue Torch","643523":"Blue Torch","643524":"Blue Torch","643525":"Blue Torch","666753":"Purple Torch","666754":"Purple Torch","666755":"Purple Torch","666756":"Purple Torch","666757":"Purple Torch","668161":"Red Torch","668162":"Red Torch","668163":"Red Torch","668164":"Red Torch","668165":"Red Torch","658369":"Green Torch","658370":"Green Torch","658371":"Green Torch","658372":"Green Torch","658373":"Green Torch","673473":"Torch","673474":"Torch","673475":"Torch","673476":"Torch","673477":"Torch","673536":"Trapped Chest","673537":"Trapped Chest","673538":"Trapped Chest","673539":"Trapped Chest","673600":"Tripwire","673601":"Tripwire","673602":"Tripwire","673603":"Tripwire","673604":"Tripwire","673605":"Tripwire","673606":"Tripwire","673607":"Tripwire","673608":"Tripwire","673609":"Tripwire","673610":"Tripwire","673611":"Tripwire","673612":"Tripwire","673613":"Tripwire","673614":"Tripwire","673615":"Tripwire","673664":"Tripwire Hook","673665":"Tripwire Hook","673666":"Tripwire Hook","673667":"Tripwire Hook","673668":"Tripwire Hook","673669":"Tripwire Hook","673670":"Tripwire Hook","673671":"Tripwire Hook","673672":"Tripwire Hook","673673":"Tripwire Hook","673674":"Tripwire Hook","673675":"Tripwire Hook","673676":"Tripwire Hook","673677":"Tripwire Hook","673678":"Tripwire Hook","673679":"Tripwire Hook","673729":"Underwater Torch","673730":"Underwater Torch","673731":"Underwater Torch","673732":"Underwater Torch","673733":"Underwater Torch","673792":"Vines","673793":"Vines","673794":"Vines","673795":"Vines","673796":"Vines","673797":"Vines","673798":"Vines","673799":"Vines","673800":"Vines","673801":"Vines","673802":"Vines","673803":"Vines","673804":"Vines","673805":"Vines","673806":"Vines","673807":"Vines","673984":"Water","673985":"Water","673986":"Water","673987":"Water","673988":"Water","673989":"Water","673990":"Water","673991":"Water","673992":"Water","673993":"Water","673994":"Water","673995":"Water","673996":"Water","673997":"Water","673998":"Water","673999":"Water","674000":"Water","674001":"Water","674002":"Water","674003":"Water","674004":"Water","674005":"Water","674006":"Water","674007":"Water","674008":"Water","674009":"Water","674010":"Water","674011":"Water","674012":"Water","674013":"Water","674014":"Water","674015":"Water","661696":"Lily Pad","674048":"Weighted Pressure Plate Heavy","674049":"Weighted Pressure Plate Heavy","674050":"Weighted Pressure Plate Heavy","674051":"Weighted Pressure Plate Heavy","674052":"Weighted Pressure Plate Heavy","674053":"Weighted Pressure Plate Heavy","674054":"Weighted Pressure Plate Heavy","674055":"Weighted Pressure Plate Heavy","674056":"Weighted Pressure Plate Heavy","674057":"Weighted Pressure Plate Heavy","674058":"Weighted Pressure Plate Heavy","674059":"Weighted Pressure Plate Heavy","674060":"Weighted Pressure Plate Heavy","674061":"Weighted Pressure Plate Heavy","674062":"Weighted Pressure Plate Heavy","674063":"Weighted Pressure Plate Heavy","674112":"Weighted Pressure Plate Light","674113":"Weighted Pressure Plate Light","674114":"Weighted Pressure Plate Light","674115":"Weighted Pressure Plate Light","674116":"Weighted Pressure Plate Light","674117":"Weighted Pressure Plate Light","674118":"Weighted Pressure Plate Light","674119":"Weighted Pressure Plate Light","674120":"Weighted Pressure Plate Light","674121":"Weighted Pressure Plate Light","674122":"Weighted Pressure Plate Light","674123":"Weighted Pressure Plate Light","674124":"Weighted Pressure Plate Light","674125":"Weighted Pressure Plate Light","674126":"Weighted Pressure Plate Light","674127":"Weighted Pressure Plate Light","674176":"Wheat Block","674177":"Wheat Block","674178":"Wheat Block","674179":"Wheat Block","674180":"Wheat Block","674181":"Wheat Block","674182":"Wheat Block","674183":"Wheat Block","664192":"Oak Planks","664320":"Oak Sapling","664321":"Oak Sapling","663936":"Oak Fence","664448":"Oak Slab","664449":"Oak Slab","664450":"Oak Slab","664064":"Oak Leaves","664065":"Oak Leaves","664066":"Oak Leaves","664067":"Oak Leaves","664128":"Oak Log","664129":"Oak Log","664130":"Oak Log","672896":"Stripped Oak Log","672897":"Stripped Oak Log","672898":"Stripped Oak Log","664704":"Oak Wood","672960":"Stripped Oak Wood","664000":"Oak Fence Gate","664001":"Oak Fence Gate","664002":"Oak Fence Gate","664003":"Oak Fence Gate","664004":"Oak Fence Gate","664005":"Oak Fence Gate","664006":"Oak Fence Gate","664007":"Oak Fence Gate","664008":"Oak Fence Gate","664009":"Oak Fence Gate","664010":"Oak Fence Gate","664011":"Oak Fence Gate","664012":"Oak Fence Gate","664013":"Oak Fence Gate","664014":"Oak Fence Gate","664015":"Oak Fence Gate","664512":"Oak Stairs","664513":"Oak Stairs","664514":"Oak Stairs","664515":"Oak Stairs","664516":"Oak Stairs","664517":"Oak Stairs","664518":"Oak Stairs","664519":"Oak Stairs","663872":"Oak Door","663873":"Oak Door","663874":"Oak Door","663875":"Oak Door","663876":"Oak Door","663877":"Oak Door","663878":"Oak Door","663879":"Oak Door","663880":"Oak Door","663881":"Oak Door","663882":"Oak Door","663883":"Oak Door","663884":"Oak Door","663885":"Oak Door","663886":"Oak Door","663887":"Oak Door","663888":"Oak Door","663889":"Oak Door","663890":"Oak Door","663891":"Oak Door","663892":"Oak Door","663893":"Oak Door","663894":"Oak Door","663895":"Oak Door","663896":"Oak Door","663897":"Oak Door","663898":"Oak Door","663899":"Oak Door","663900":"Oak Door","663901":"Oak Door","663902":"Oak Door","663903":"Oak Door","663808":"Oak Button","663809":"Oak Button","663810":"Oak Button","663811":"Oak Button","663812":"Oak Button","663813":"Oak Button","663816":"Oak Button","663817":"Oak Button","663818":"Oak Button","663819":"Oak Button","663820":"Oak Button","663821":"Oak Button","664256":"Oak Pressure Plate","664257":"Oak Pressure Plate","664576":"Oak Trapdoor","664577":"Oak Trapdoor","664578":"Oak Trapdoor","664579":"Oak Trapdoor","664580":"Oak Trapdoor","664581":"Oak Trapdoor","664582":"Oak Trapdoor","664583":"Oak Trapdoor","664584":"Oak Trapdoor","664585":"Oak Trapdoor","664586":"Oak Trapdoor","664587":"Oak Trapdoor","664588":"Oak Trapdoor","664589":"Oak Trapdoor","664590":"Oak Trapdoor","664591":"Oak Trapdoor","664384":"Oak Sign","664385":"Oak Sign","664386":"Oak Sign","664387":"Oak Sign","664388":"Oak Sign","664389":"Oak Sign","664390":"Oak Sign","664391":"Oak Sign","664392":"Oak Sign","664393":"Oak Sign","664394":"Oak Sign","664395":"Oak Sign","664396":"Oak Sign","664397":"Oak Sign","664398":"Oak Sign","664399":"Oak Sign","664640":"Oak Wall Sign","664641":"Oak Wall Sign","664642":"Oak Wall Sign","664643":"Oak Wall Sign","670848":"Spruce Planks","670976":"Spruce Sapling","670977":"Spruce Sapling","670592":"Spruce Fence","671104":"Spruce Slab","671105":"Spruce Slab","671106":"Spruce Slab","670720":"Spruce Leaves","670721":"Spruce Leaves","670722":"Spruce Leaves","670723":"Spruce Leaves","670784":"Spruce Log","670785":"Spruce Log","670786":"Spruce Log","673024":"Stripped Spruce Log","673025":"Stripped Spruce Log","673026":"Stripped Spruce Log","671360":"Spruce Wood","673088":"Stripped Spruce Wood","670656":"Spruce Fence Gate","670657":"Spruce Fence Gate","670658":"Spruce Fence Gate","670659":"Spruce Fence Gate","670660":"Spruce Fence Gate","670661":"Spruce Fence Gate","670662":"Spruce Fence Gate","670663":"Spruce Fence Gate","670664":"Spruce Fence Gate","670665":"Spruce Fence Gate","670666":"Spruce Fence Gate","670667":"Spruce Fence Gate","670668":"Spruce Fence Gate","670669":"Spruce Fence Gate","670670":"Spruce Fence Gate","670671":"Spruce Fence Gate","671168":"Spruce Stairs","671169":"Spruce Stairs","671170":"Spruce Stairs","671171":"Spruce Stairs","671172":"Spruce Stairs","671173":"Spruce Stairs","671174":"Spruce Stairs","671175":"Spruce Stairs","670528":"Spruce Door","670529":"Spruce Door","670530":"Spruce Door","670531":"Spruce Door","670532":"Spruce Door","670533":"Spruce Door","670534":"Spruce Door","670535":"Spruce Door","670536":"Spruce Door","670537":"Spruce Door","670538":"Spruce Door","670539":"Spruce Door","670540":"Spruce Door","670541":"Spruce Door","670542":"Spruce Door","670543":"Spruce Door","670544":"Spruce Door","670545":"Spruce Door","670546":"Spruce Door","670547":"Spruce Door","670548":"Spruce Door","670549":"Spruce Door","670550":"Spruce Door","670551":"Spruce Door","670552":"Spruce Door","670553":"Spruce Door","670554":"Spruce Door","670555":"Spruce Door","670556":"Spruce Door","670557":"Spruce Door","670558":"Spruce Door","670559":"Spruce Door","670464":"Spruce Button","670465":"Spruce Button","670466":"Spruce Button","670467":"Spruce Button","670468":"Spruce Button","670469":"Spruce Button","670472":"Spruce Button","670473":"Spruce Button","670474":"Spruce Button","670475":"Spruce Button","670476":"Spruce Button","670477":"Spruce Button","670912":"Spruce Pressure Plate","670913":"Spruce Pressure Plate","671232":"Spruce Trapdoor","671233":"Spruce Trapdoor","671234":"Spruce Trapdoor","671235":"Spruce Trapdoor","671236":"Spruce Trapdoor","671237":"Spruce Trapdoor","671238":"Spruce Trapdoor","671239":"Spruce Trapdoor","671240":"Spruce Trapdoor","671241":"Spruce Trapdoor","671242":"Spruce Trapdoor","671243":"Spruce Trapdoor","671244":"Spruce Trapdoor","671245":"Spruce Trapdoor","671246":"Spruce Trapdoor","671247":"Spruce Trapdoor","671040":"Spruce Sign","671041":"Spruce Sign","671042":"Spruce Sign","671043":"Spruce Sign","671044":"Spruce Sign","671045":"Spruce Sign","671046":"Spruce Sign","671047":"Spruce Sign","671048":"Spruce Sign","671049":"Spruce Sign","671050":"Spruce Sign","671051":"Spruce Sign","671052":"Spruce Sign","671053":"Spruce Sign","671054":"Spruce Sign","671055":"Spruce Sign","671296":"Spruce Wall Sign","671297":"Spruce Wall Sign","671298":"Spruce Wall Sign","671299":"Spruce Wall Sign","642624":"Birch Planks","642752":"Birch Sapling","642753":"Birch Sapling","642368":"Birch Fence","642880":"Birch Slab","642881":"Birch Slab","642882":"Birch Slab","642496":"Birch Leaves","642497":"Birch Leaves","642498":"Birch Leaves","642499":"Birch Leaves","642560":"Birch Log","642561":"Birch Log","642562":"Birch Log","672512":"Stripped Birch Log","672513":"Stripped Birch Log","672514":"Stripped Birch Log","643136":"Birch Wood","672576":"Stripped Birch Wood","642432":"Birch Fence Gate","642433":"Birch Fence Gate","642434":"Birch Fence Gate","642435":"Birch Fence Gate","642436":"Birch Fence Gate","642437":"Birch Fence Gate","642438":"Birch Fence Gate","642439":"Birch Fence Gate","642440":"Birch Fence Gate","642441":"Birch Fence Gate","642442":"Birch Fence Gate","642443":"Birch Fence Gate","642444":"Birch Fence Gate","642445":"Birch Fence Gate","642446":"Birch Fence Gate","642447":"Birch Fence Gate","642944":"Birch Stairs","642945":"Birch Stairs","642946":"Birch Stairs","642947":"Birch Stairs","642948":"Birch Stairs","642949":"Birch Stairs","642950":"Birch Stairs","642951":"Birch Stairs","642304":"Birch Door","642305":"Birch Door","642306":"Birch Door","642307":"Birch Door","642308":"Birch Door","642309":"Birch Door","642310":"Birch Door","642311":"Birch Door","642312":"Birch Door","642313":"Birch Door","642314":"Birch Door","642315":"Birch Door","642316":"Birch Door","642317":"Birch Door","642318":"Birch Door","642319":"Birch Door","642320":"Birch Door","642321":"Birch Door","642322":"Birch Door","642323":"Birch Door","642324":"Birch Door","642325":"Birch Door","642326":"Birch Door","642327":"Birch Door","642328":"Birch Door","642329":"Birch Door","642330":"Birch Door","642331":"Birch Door","642332":"Birch Door","642333":"Birch Door","642334":"Birch Door","642335":"Birch Door","642240":"Birch Button","642241":"Birch Button","642242":"Birch Button","642243":"Birch Button","642244":"Birch Button","642245":"Birch Button","642248":"Birch Button","642249":"Birch Button","642250":"Birch Button","642251":"Birch Button","642252":"Birch Button","642253":"Birch Button","642688":"Birch Pressure Plate","642689":"Birch Pressure Plate","643008":"Birch Trapdoor","643009":"Birch Trapdoor","643010":"Birch Trapdoor","643011":"Birch Trapdoor","643012":"Birch Trapdoor","643013":"Birch Trapdoor","643014":"Birch Trapdoor","643015":"Birch Trapdoor","643016":"Birch Trapdoor","643017":"Birch Trapdoor","643018":"Birch Trapdoor","643019":"Birch Trapdoor","643020":"Birch Trapdoor","643021":"Birch Trapdoor","643022":"Birch Trapdoor","643023":"Birch Trapdoor","642816":"Birch Sign","642817":"Birch Sign","642818":"Birch Sign","642819":"Birch Sign","642820":"Birch Sign","642821":"Birch Sign","642822":"Birch Sign","642823":"Birch Sign","642824":"Birch Sign","642825":"Birch Sign","642826":"Birch Sign","642827":"Birch Sign","642828":"Birch Sign","642829":"Birch Sign","642830":"Birch Sign","642831":"Birch Sign","643072":"Birch Wall Sign","643073":"Birch Wall Sign","643074":"Birch Wall Sign","643075":"Birch Wall Sign","660224":"Jungle Planks","660352":"Jungle Sapling","660353":"Jungle Sapling","659968":"Jungle Fence","660480":"Jungle Slab","660481":"Jungle Slab","660482":"Jungle Slab","660096":"Jungle Leaves","660097":"Jungle Leaves","660098":"Jungle Leaves","660099":"Jungle Leaves","660160":"Jungle Log","660161":"Jungle Log","660162":"Jungle Log","672768":"Stripped Jungle Log","672769":"Stripped Jungle Log","672770":"Stripped Jungle Log","660736":"Jungle Wood","672832":"Stripped Jungle Wood","660032":"Jungle Fence Gate","660033":"Jungle Fence Gate","660034":"Jungle Fence Gate","660035":"Jungle Fence Gate","660036":"Jungle Fence Gate","660037":"Jungle Fence Gate","660038":"Jungle Fence Gate","660039":"Jungle Fence Gate","660040":"Jungle Fence Gate","660041":"Jungle Fence Gate","660042":"Jungle Fence Gate","660043":"Jungle Fence Gate","660044":"Jungle Fence Gate","660045":"Jungle Fence Gate","660046":"Jungle Fence Gate","660047":"Jungle Fence Gate","660544":"Jungle Stairs","660545":"Jungle Stairs","660546":"Jungle Stairs","660547":"Jungle Stairs","660548":"Jungle Stairs","660549":"Jungle Stairs","660550":"Jungle Stairs","660551":"Jungle Stairs","659904":"Jungle Door","659905":"Jungle Door","659906":"Jungle Door","659907":"Jungle Door","659908":"Jungle Door","659909":"Jungle Door","659910":"Jungle Door","659911":"Jungle Door","659912":"Jungle Door","659913":"Jungle Door","659914":"Jungle Door","659915":"Jungle Door","659916":"Jungle Door","659917":"Jungle Door","659918":"Jungle Door","659919":"Jungle Door","659920":"Jungle Door","659921":"Jungle Door","659922":"Jungle Door","659923":"Jungle Door","659924":"Jungle Door","659925":"Jungle Door","659926":"Jungle Door","659927":"Jungle Door","659928":"Jungle Door","659929":"Jungle Door","659930":"Jungle Door","659931":"Jungle Door","659932":"Jungle Door","659933":"Jungle Door","659934":"Jungle Door","659935":"Jungle Door","659840":"Jungle Button","659841":"Jungle Button","659842":"Jungle Button","659843":"Jungle Button","659844":"Jungle Button","659845":"Jungle Button","659848":"Jungle Button","659849":"Jungle Button","659850":"Jungle Button","659851":"Jungle Button","659852":"Jungle Button","659853":"Jungle Button","660288":"Jungle Pressure Plate","660289":"Jungle Pressure Plate","660608":"Jungle Trapdoor","660609":"Jungle Trapdoor","660610":"Jungle Trapdoor","660611":"Jungle Trapdoor","660612":"Jungle Trapdoor","660613":"Jungle Trapdoor","660614":"Jungle Trapdoor","660615":"Jungle Trapdoor","660616":"Jungle Trapdoor","660617":"Jungle Trapdoor","660618":"Jungle Trapdoor","660619":"Jungle Trapdoor","660620":"Jungle Trapdoor","660621":"Jungle Trapdoor","660622":"Jungle Trapdoor","660623":"Jungle Trapdoor","660416":"Jungle Sign","660417":"Jungle Sign","660418":"Jungle Sign","660419":"Jungle Sign","660420":"Jungle Sign","660421":"Jungle Sign","660422":"Jungle Sign","660423":"Jungle Sign","660424":"Jungle Sign","660425":"Jungle Sign","660426":"Jungle Sign","660427":"Jungle Sign","660428":"Jungle Sign","660429":"Jungle Sign","660430":"Jungle Sign","660431":"Jungle Sign","660672":"Jungle Wall Sign","660673":"Jungle Wall Sign","660674":"Jungle Wall Sign","660675":"Jungle Wall Sign","640448":"Acacia Planks","640576":"Acacia Sapling","640577":"Acacia Sapling","640192":"Acacia Fence","640704":"Acacia Slab","640705":"Acacia Slab","640706":"Acacia Slab","640320":"Acacia Leaves","640321":"Acacia Leaves","640322":"Acacia Leaves","640323":"Acacia Leaves","640384":"Acacia Log","640385":"Acacia Log","640386":"Acacia Log","672384":"Stripped Acacia Log","672385":"Stripped Acacia Log","672386":"Stripped Acacia Log","640960":"Acacia Wood","672448":"Stripped Acacia Wood","640256":"Acacia Fence Gate","640257":"Acacia Fence Gate","640258":"Acacia Fence Gate","640259":"Acacia Fence Gate","640260":"Acacia Fence Gate","640261":"Acacia Fence Gate","640262":"Acacia Fence Gate","640263":"Acacia Fence Gate","640264":"Acacia Fence Gate","640265":"Acacia Fence Gate","640266":"Acacia Fence Gate","640267":"Acacia Fence Gate","640268":"Acacia Fence Gate","640269":"Acacia Fence Gate","640270":"Acacia Fence Gate","640271":"Acacia Fence Gate","640768":"Acacia Stairs","640769":"Acacia Stairs","640770":"Acacia Stairs","640771":"Acacia Stairs","640772":"Acacia Stairs","640773":"Acacia Stairs","640774":"Acacia Stairs","640775":"Acacia Stairs","640128":"Acacia Door","640129":"Acacia Door","640130":"Acacia Door","640131":"Acacia Door","640132":"Acacia Door","640133":"Acacia Door","640134":"Acacia Door","640135":"Acacia Door","640136":"Acacia Door","640137":"Acacia Door","640138":"Acacia Door","640139":"Acacia Door","640140":"Acacia Door","640141":"Acacia Door","640142":"Acacia Door","640143":"Acacia Door","640144":"Acacia Door","640145":"Acacia Door","640146":"Acacia Door","640147":"Acacia Door","640148":"Acacia Door","640149":"Acacia Door","640150":"Acacia Door","640151":"Acacia Door","640152":"Acacia Door","640153":"Acacia Door","640154":"Acacia Door","640155":"Acacia Door","640156":"Acacia Door","640157":"Acacia Door","640158":"Acacia Door","640159":"Acacia Door","640064":"Acacia Button","640065":"Acacia Button","640066":"Acacia Button","640067":"Acacia Button","640068":"Acacia Button","640069":"Acacia Button","640072":"Acacia Button","640073":"Acacia Button","640074":"Acacia Button","640075":"Acacia Button","640076":"Acacia Button","640077":"Acacia Button","640512":"Acacia Pressure Plate","640513":"Acacia Pressure Plate","640832":"Acacia Trapdoor","640833":"Acacia Trapdoor","640834":"Acacia Trapdoor","640835":"Acacia Trapdoor","640836":"Acacia Trapdoor","640837":"Acacia Trapdoor","640838":"Acacia Trapdoor","640839":"Acacia Trapdoor","640840":"Acacia Trapdoor","640841":"Acacia Trapdoor","640842":"Acacia Trapdoor","640843":"Acacia Trapdoor","640844":"Acacia Trapdoor","640845":"Acacia Trapdoor","640846":"Acacia Trapdoor","640847":"Acacia Trapdoor","640640":"Acacia Sign","640641":"Acacia Sign","640642":"Acacia Sign","640643":"Acacia Sign","640644":"Acacia Sign","640645":"Acacia Sign","640646":"Acacia Sign","640647":"Acacia Sign","640648":"Acacia Sign","640649":"Acacia Sign","640650":"Acacia Sign","640651":"Acacia Sign","640652":"Acacia Sign","640653":"Acacia Sign","640654":"Acacia Sign","640655":"Acacia Sign","640896":"Acacia Wall Sign","640897":"Acacia Wall Sign","640898":"Acacia Wall Sign","640899":"Acacia Wall Sign","646848":"Dark Oak Planks","646976":"Dark Oak Sapling","646977":"Dark Oak Sapling","646592":"Dark Oak Fence","647104":"Dark Oak Slab","647105":"Dark Oak Slab","647106":"Dark Oak Slab","646720":"Dark Oak Leaves","646721":"Dark Oak Leaves","646722":"Dark Oak Leaves","646723":"Dark Oak Leaves","646784":"Dark Oak Log","646785":"Dark Oak Log","646786":"Dark Oak Log","672640":"Stripped Dark Oak Log","672641":"Stripped Dark Oak Log","672642":"Stripped Dark Oak Log","647360":"Dark Oak Wood","672704":"Stripped Dark Oak Wood","646656":"Dark Oak Fence Gate","646657":"Dark Oak Fence Gate","646658":"Dark Oak Fence Gate","646659":"Dark Oak Fence Gate","646660":"Dark Oak Fence Gate","646661":"Dark Oak Fence Gate","646662":"Dark Oak Fence Gate","646663":"Dark Oak Fence Gate","646664":"Dark Oak Fence Gate","646665":"Dark Oak Fence Gate","646666":"Dark Oak Fence Gate","646667":"Dark Oak Fence Gate","646668":"Dark Oak Fence Gate","646669":"Dark Oak Fence Gate","646670":"Dark Oak Fence Gate","646671":"Dark Oak Fence Gate","647168":"Dark Oak Stairs","647169":"Dark Oak Stairs","647170":"Dark Oak Stairs","647171":"Dark Oak Stairs","647172":"Dark Oak Stairs","647173":"Dark Oak Stairs","647174":"Dark Oak Stairs","647175":"Dark Oak Stairs","646528":"Dark Oak Door","646529":"Dark Oak Door","646530":"Dark Oak Door","646531":"Dark Oak Door","646532":"Dark Oak Door","646533":"Dark Oak Door","646534":"Dark Oak Door","646535":"Dark Oak Door","646536":"Dark Oak Door","646537":"Dark Oak Door","646538":"Dark Oak Door","646539":"Dark Oak Door","646540":"Dark Oak Door","646541":"Dark Oak Door","646542":"Dark Oak Door","646543":"Dark Oak Door","646544":"Dark Oak Door","646545":"Dark Oak Door","646546":"Dark Oak Door","646547":"Dark Oak Door","646548":"Dark Oak Door","646549":"Dark Oak Door","646550":"Dark Oak Door","646551":"Dark Oak Door","646552":"Dark Oak Door","646553":"Dark Oak Door","646554":"Dark Oak Door","646555":"Dark Oak Door","646556":"Dark Oak Door","646557":"Dark Oak Door","646558":"Dark Oak Door","646559":"Dark Oak Door","646464":"Dark Oak Button","646465":"Dark Oak Button","646466":"Dark Oak Button","646467":"Dark Oak Button","646468":"Dark Oak Button","646469":"Dark Oak Button","646472":"Dark Oak Button","646473":"Dark Oak Button","646474":"Dark Oak Button","646475":"Dark Oak Button","646476":"Dark Oak Button","646477":"Dark Oak Button","646912":"Dark Oak Pressure Plate","646913":"Dark Oak Pressure Plate","647232":"Dark Oak Trapdoor","647233":"Dark Oak Trapdoor","647234":"Dark Oak Trapdoor","647235":"Dark Oak Trapdoor","647236":"Dark Oak Trapdoor","647237":"Dark Oak Trapdoor","647238":"Dark Oak Trapdoor","647239":"Dark Oak Trapdoor","647240":"Dark Oak Trapdoor","647241":"Dark Oak Trapdoor","647242":"Dark Oak Trapdoor","647243":"Dark Oak Trapdoor","647244":"Dark Oak Trapdoor","647245":"Dark Oak Trapdoor","647246":"Dark Oak Trapdoor","647247":"Dark Oak Trapdoor","647040":"Dark Oak Sign","647041":"Dark Oak Sign","647042":"Dark Oak Sign","647043":"Dark Oak Sign","647044":"Dark Oak Sign","647045":"Dark Oak Sign","647046":"Dark Oak Sign","647047":"Dark Oak Sign","647048":"Dark Oak Sign","647049":"Dark Oak Sign","647050":"Dark Oak Sign","647051":"Dark Oak Sign","647052":"Dark Oak Sign","647053":"Dark Oak Sign","647054":"Dark Oak Sign","647055":"Dark Oak Sign","647296":"Dark Oak Wall Sign","647297":"Dark Oak Wall Sign","647298":"Dark Oak Wall Sign","647299":"Dark Oak Wall Sign","668032":"Red Sandstone Stairs","668033":"Red Sandstone Stairs","668034":"Red Sandstone Stairs","668035":"Red Sandstone Stairs","668036":"Red Sandstone Stairs","668037":"Red Sandstone Stairs","668038":"Red Sandstone Stairs","668039":"Red Sandstone Stairs","669824":"Smooth Red Sandstone Stairs","669825":"Smooth Red Sandstone Stairs","669826":"Smooth Red Sandstone Stairs","669827":"Smooth Red Sandstone Stairs","669828":"Smooth Red Sandstone Stairs","669829":"Smooth Red Sandstone Stairs","669830":"Smooth Red Sandstone Stairs","669831":"Smooth Red Sandstone Stairs","667904":"Red Sandstone","644736":"Chiseled Red Sandstone","646080":"Cut Red Sandstone","669696":"Smooth Red Sandstone","669056":"Sandstone Stairs","669057":"Sandstone Stairs","669058":"Sandstone Stairs","669059":"Sandstone Stairs","669060":"Sandstone Stairs","669061":"Sandstone Stairs","669062":"Sandstone Stairs","669063":"Sandstone Stairs","670016":"Smooth Sandstone Stairs","670017":"Smooth Sandstone Stairs","670018":"Smooth Sandstone Stairs","670019":"Smooth Sandstone Stairs","670020":"Smooth Sandstone Stairs","670021":"Smooth Sandstone Stairs","670022":"Smooth Sandstone Stairs","670023":"Smooth Sandstone Stairs","668928":"Sandstone","644800":"Chiseled Sandstone","646208":"Cut Sandstone","669888":"Smooth Sandstone","674240":"White Glazed Terracotta","674241":"White Glazed Terracotta","674242":"White Glazed Terracotta","674243":"White Glazed Terracotta","664832":"Orange Glazed Terracotta","664833":"Orange Glazed Terracotta","664834":"Orange Glazed Terracotta","664835":"Orange Glazed Terracotta","661952":"Magenta Glazed Terracotta","661953":"Magenta Glazed Terracotta","661954":"Magenta Glazed Terracotta","661955":"Magenta Glazed Terracotta","661440":"Light Blue Glazed Terracotta","661441":"Light Blue Glazed Terracotta","661442":"Light Blue Glazed Terracotta","661443":"Light Blue Glazed Terracotta","674432":"Yellow Glazed Terracotta","674433":"Yellow Glazed Terracotta","674434":"Yellow Glazed Terracotta","674435":"Yellow Glazed Terracotta","661760":"Lime Glazed Terracotta","661761":"Lime Glazed Terracotta","661762":"Lime Glazed Terracotta","661763":"Lime Glazed Terracotta","665152":"Pink Glazed Terracotta","665153":"Pink Glazed Terracotta","665154":"Pink Glazed Terracotta","665155":"Pink Glazed Terracotta","658240":"Gray Glazed Terracotta","658241":"Gray Glazed Terracotta","658242":"Gray Glazed Terracotta","658243":"Gray Glazed Terracotta","661504":"Light Gray Glazed Terracotta","661505":"Light Gray Glazed Terracotta","661506":"Light Gray Glazed Terracotta","661507":"Light Gray Glazed Terracotta","646336":"Cyan Glazed Terracotta","646337":"Cyan Glazed Terracotta","646338":"Cyan Glazed Terracotta","646339":"Cyan Glazed Terracotta","666688":"Purple Glazed Terracotta","666689":"Purple Glazed Terracotta","666690":"Purple Glazed Terracotta","666691":"Purple Glazed Terracotta","643328":"Blue Glazed Terracotta","643329":"Blue Glazed Terracotta","643330":"Blue Glazed Terracotta","643331":"Blue Glazed Terracotta","644032":"Brown Glazed Terracotta","644033":"Brown Glazed Terracotta","644034":"Brown Glazed Terracotta","644035":"Brown Glazed Terracotta","658304":"Green Glazed Terracotta","658305":"Green Glazed Terracotta","658306":"Green Glazed Terracotta","658307":"Green Glazed Terracotta","667392":"Red Glazed Terracotta","667393":"Red Glazed Terracotta","667394":"Red Glazed Terracotta","667395":"Red Glazed Terracotta","643200":"Black Glazed Terracotta","643201":"Black Glazed Terracotta","643202":"Black Glazed Terracotta","643203":"Black Glazed Terracotta","648448":"Dyed Shulker Box","648449":"Dyed Shulker Box","648450":"Dyed Shulker Box","648451":"Dyed Shulker Box","648452":"Dyed Shulker Box","648453":"Dyed Shulker Box","648454":"Dyed Shulker Box","648455":"Dyed Shulker Box","648456":"Dyed Shulker Box","648457":"Dyed Shulker Box","648458":"Dyed Shulker Box","648459":"Dyed Shulker Box","648460":"Dyed Shulker Box","648461":"Dyed Shulker Box","648462":"Dyed Shulker Box","648463":"Dyed Shulker Box","671488":"Stained Glass","671489":"Stained Glass","671490":"Stained Glass","671491":"Stained Glass","671492":"Stained Glass","671493":"Stained Glass","671494":"Stained Glass","671495":"Stained Glass","671496":"Stained Glass","671497":"Stained Glass","671498":"Stained Glass","671499":"Stained Glass","671500":"Stained Glass","671501":"Stained Glass","671502":"Stained Glass","671503":"Stained Glass","671552":"Stained Glass Pane","671553":"Stained Glass Pane","671554":"Stained Glass Pane","671555":"Stained Glass Pane","671556":"Stained Glass Pane","671557":"Stained Glass Pane","671558":"Stained Glass Pane","671559":"Stained Glass Pane","671560":"Stained Glass Pane","671561":"Stained Glass Pane","671562":"Stained Glass Pane","671563":"Stained Glass Pane","671564":"Stained Glass Pane","671565":"Stained Glass Pane","671566":"Stained Glass Pane","671567":"Stained Glass Pane","671424":"Stained Clay","671425":"Stained Clay","671426":"Stained Clay","671427":"Stained Clay","671428":"Stained Clay","671429":"Stained Clay","671430":"Stained Clay","671431":"Stained Clay","671432":"Stained Clay","671433":"Stained Clay","671434":"Stained Clay","671435":"Stained Clay","671436":"Stained Clay","671437":"Stained Clay","671438":"Stained Clay","671439":"Stained Clay","671616":"Stained Hardened Glass","671617":"Stained Hardened Glass","671618":"Stained Hardened Glass","671619":"Stained Hardened Glass","671620":"Stained Hardened Glass","671621":"Stained Hardened Glass","671622":"Stained Hardened Glass","671623":"Stained Hardened Glass","671624":"Stained Hardened Glass","671625":"Stained Hardened Glass","671626":"Stained Hardened Glass","671627":"Stained Hardened Glass","671628":"Stained Hardened Glass","671629":"Stained Hardened Glass","671630":"Stained Hardened Glass","671631":"Stained Hardened Glass","671680":"Stained Hardened Glass Pane","671681":"Stained Hardened Glass Pane","671682":"Stained Hardened Glass Pane","671683":"Stained Hardened Glass Pane","671684":"Stained Hardened Glass Pane","671685":"Stained Hardened Glass Pane","671686":"Stained Hardened Glass Pane","671687":"Stained Hardened Glass Pane","671688":"Stained Hardened Glass Pane","671689":"Stained Hardened Glass Pane","671690":"Stained Hardened Glass Pane","671691":"Stained Hardened Glass Pane","671692":"Stained Hardened Glass Pane","671693":"Stained Hardened Glass Pane","671694":"Stained Hardened Glass Pane","671695":"Stained Hardened Glass Pane","644352":"Carpet","644353":"Carpet","644354":"Carpet","644355":"Carpet","644356":"Carpet","644357":"Carpet","644358":"Carpet","644359":"Carpet","644360":"Carpet","644361":"Carpet","644362":"Carpet","644363":"Carpet","644364":"Carpet","644365":"Carpet","644366":"Carpet","644367":"Carpet","645568":"Concrete","645569":"Concrete","645570":"Concrete","645571":"Concrete","645572":"Concrete","645573":"Concrete","645574":"Concrete","645575":"Concrete","645576":"Concrete","645577":"Concrete","645578":"Concrete","645579":"Concrete","645580":"Concrete","645581":"Concrete","645582":"Concrete","645583":"Concrete","645632":"Concrete Powder","645633":"Concrete Powder","645634":"Concrete Powder","645635":"Concrete Powder","645636":"Concrete Powder","645637":"Concrete Powder","645638":"Concrete Powder","645639":"Concrete Powder","645640":"Concrete Powder","645641":"Concrete Powder","645642":"Concrete Powder","645643":"Concrete Powder","645644":"Concrete Powder","645645":"Concrete Powder","645646":"Concrete Powder","645647":"Concrete Powder","674368":"Wool","674369":"Wool","674370":"Wool","674371":"Wool","674372":"Wool","674373":"Wool","674374":"Wool","674375":"Wool","674376":"Wool","674377":"Wool","674378":"Wool","674379":"Wool","674380":"Wool","674381":"Wool","674382":"Wool","674383":"Wool","645312":"Cobblestone Wall","641408":"Andesite Wall","643904":"Brick Wall","648128":"Diorite Wall","656704":"End Stone Brick Wall","657984":"Granite Wall","662784":"Mossy Stone Brick Wall","662592":"Mossy Cobblestone Wall","663232":"Nether Brick Wall","666496":"Prismarine Wall","667712":"Red Nether Brick Wall","668096":"Red Sandstone Wall","669120":"Sandstone Wall","671936":"Stone Brick Wall","656000":"???","651392":"Hydrogen","651264":"Helium","651968":"Lithium","649088":"Beryllium","649280":"Boron","649600":"Carbon","652992":"Nitrogen","653248":"Oxygen","650752":"Fluorine","652672":"Neon","654784":"Sodium","652160":"Magnesium","648576":"Aluminum","654656":"Silicon","653376":"Phosphorus","654912":"Sulfur","649792":"Chlorine","648768":"Argon","653632":"Potassium","649472":"Calcium","654464":"Scandium","655552":"Titanium","655744":"Vanadium","649856":"Chromium","652224":"Manganese","651648":"Iron","649920":"Cobalt","652800":"Nickel","650112":"Copper","656064":"Zinc","650944":"Gallium","651008":"Germanium","648832":"Arsenic","654592":"Selenium","649344":"Bromine","651712":"Krypton","654208":"Rubidium","654848":"Strontium","655936":"Yttrium","656128":"Zirconium","652928":"Niobium","652480":"Molybdenum","655040":"Technetium","654272":"Ruthenium","654080":"Rhodium","653312":"Palladium","654720":"Silver","649408":"Cadmium","651456":"Indium","655488":"Tin","648704":"Antimony","655104":"Tellurium","651520":"Iodine","655808":"Xenon","649728":"Cesium","648960":"Barium","651776":"Lanthanum","649664":"Cerium","653696":"Praseodymium","652608":"Neodymium","653760":"Promethium","654400":"Samarium","650560":"Europium","650880":"Gadolinium","655232":"Terbium","650368":"Dysprosium","651328":"Holmium","650496":"Erbium","655424":"Thulium","655872":"Ytterbium","652096":"Lutetium","651136":"Hafnium","654976":"Tantalum","655616":"Tungsten","654016":"Rhenium","653184":"Osmium","651584":"Iridium","653440":"Platinum","651072":"Gold","652416":"Mercury","655296":"Thallium","651904":"Lead","649152":"Bismuth","653568":"Polonium","648896":"Astatine","653952":"Radon","650816":"Francium","653888":"Radium","648512":"Actinium","655360":"Thorium","653824":"Protactinium","655680":"Uranium","652736":"Neptunium","653504":"Plutonium","648640":"Americium","650176":"Curium","649024":"Berkelium","649536":"Californium","650432":"Einsteinium","650624":"Fermium","652352":"Mendelevium","653056":"Nobelium","651840":"Lawrencium","654336":"Rutherfordium","650304":"Dubnium","654528":"Seaborgium","649216":"Bohrium","651200":"Hassium","652288":"Meitnerium","650240":"Darmstadtium","654144":"Roentgenium","650048":"Copernicium","652864":"Nihonium","650688":"Flerovium","652544":"Moscovium","652032":"Livermorium","655168":"Tennessine","653120":"Oganesson","645504":"Compound Creator","645505":"Compound Creator","645506":"Compound Creator","645507":"Compound Creator","649984":"Element Constructor","649985":"Element Constructor","649986":"Element Constructor","649987":"Element Constructor","660800":"Lab Table","660801":"Lab Table","660802":"Lab Table","660803":"Lab Table","662080":"Material Reducer","662081":"Material Reducer","662082":"Material Reducer","662083":"Material Reducer","644544":"Heat Block","644160":"Brown Mushroom Block","644161":"Brown Mushroom Block","644162":"Brown Mushroom Block","644163":"Brown Mushroom Block","644164":"Brown Mushroom Block","644165":"Brown Mushroom Block","644166":"Brown Mushroom Block","644167":"Brown Mushroom Block","644168":"Brown Mushroom Block","644169":"Brown Mushroom Block","644170":"Brown Mushroom Block","667520":"Red Mushroom Block","667521":"Red Mushroom Block","667522":"Red Mushroom Block","667523":"Red Mushroom Block","667524":"Red Mushroom Block","667525":"Red Mushroom Block","667526":"Red Mushroom Block","667527":"Red Mushroom Block","667528":"Red Mushroom Block","667529":"Red Mushroom Block","667530":"Red Mushroom Block","662912":"Mushroom Stem","641088":"All Sided Mushroom Stem","645696":"Coral","645697":"Coral","645698":"Coral","645699":"Coral","645700":"Coral","645704":"Coral","645705":"Coral","645706":"Coral","645707":"Coral","645708":"Coral","645824":"Coral Fan","645825":"Coral Fan","645826":"Coral Fan","645827":"Coral Fan","645828":"Coral Fan","645832":"Coral Fan","645833":"Coral Fan","645834":"Coral Fan","645835":"Coral Fan","645836":"Coral Fan","645840":"Coral Fan","645841":"Coral Fan","645842":"Coral Fan","645843":"Coral Fan","645844":"Coral Fan","645848":"Coral Fan","645849":"Coral Fan","645850":"Coral Fan","645851":"Coral Fan","645852":"Coral Fan","673920":"Wall Coral Fan","673921":"Wall Coral Fan","673922":"Wall Coral Fan","673923":"Wall Coral Fan","673924":"Wall Coral Fan","673928":"Wall Coral Fan","673929":"Wall Coral Fan","673930":"Wall Coral Fan","673931":"Wall Coral Fan","673932":"Wall Coral Fan","673936":"Wall Coral Fan","673937":"Wall Coral Fan","673938":"Wall Coral Fan","673939":"Wall Coral Fan","673940":"Wall Coral Fan","673944":"Wall Coral Fan","673945":"Wall Coral Fan","673946":"Wall Coral Fan","673947":"Wall Coral Fan","673948":"Wall Coral Fan","673952":"Wall Coral Fan","673953":"Wall Coral Fan","673954":"Wall Coral Fan","673955":"Wall Coral Fan","673956":"Wall Coral Fan","673960":"Wall Coral Fan","673961":"Wall Coral Fan","673962":"Wall Coral Fan","673963":"Wall Coral Fan","673964":"Wall Coral Fan","673968":"Wall Coral Fan","673969":"Wall Coral Fan","673970":"Wall Coral Fan","673971":"Wall Coral Fan","673972":"Wall Coral Fan","673976":"Wall Coral Fan","673977":"Wall Coral Fan","673978":"Wall Coral Fan","673979":"Wall Coral Fan","673980":"Wall Coral Fan"},"stateDataBits":6} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298177":"Mob Head","5298178":"Mob Head","5298179":"Mob Head","5298180":"Mob Head","5298181":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5393920":"White Glazed Terracotta","5393921":"White Glazed Terracotta","5393922":"White Glazed Terracotta","5393923":"White Glazed Terracotta","5318656":"Orange Glazed Terracotta","5318657":"Orange Glazed Terracotta","5318658":"Orange Glazed Terracotta","5318659":"Orange Glazed Terracotta","5295616":"Magenta Glazed Terracotta","5295617":"Magenta Glazed Terracotta","5295618":"Magenta Glazed Terracotta","5295619":"Magenta Glazed Terracotta","5291520":"Light Blue Glazed Terracotta","5291521":"Light Blue Glazed Terracotta","5291522":"Light Blue Glazed Terracotta","5291523":"Light Blue Glazed Terracotta","5395456":"Yellow Glazed Terracotta","5395457":"Yellow Glazed Terracotta","5395458":"Yellow Glazed Terracotta","5395459":"Yellow Glazed Terracotta","5294080":"Lime Glazed Terracotta","5294081":"Lime Glazed Terracotta","5294082":"Lime Glazed Terracotta","5294083":"Lime Glazed Terracotta","5321216":"Pink Glazed Terracotta","5321217":"Pink Glazed Terracotta","5321218":"Pink Glazed Terracotta","5321219":"Pink Glazed Terracotta","5265920":"Gray Glazed Terracotta","5265921":"Gray Glazed Terracotta","5265922":"Gray Glazed Terracotta","5265923":"Gray Glazed Terracotta","5292032":"Light Gray Glazed Terracotta","5292033":"Light Gray Glazed Terracotta","5292034":"Light Gray Glazed Terracotta","5292035":"Light Gray Glazed Terracotta","5170688":"Cyan Glazed Terracotta","5170689":"Cyan Glazed Terracotta","5170690":"Cyan Glazed Terracotta","5170691":"Cyan Glazed Terracotta","5333504":"Purple Glazed Terracotta","5333505":"Purple Glazed Terracotta","5333506":"Purple Glazed Terracotta","5333507":"Purple Glazed Terracotta","5146624":"Blue Glazed Terracotta","5146625":"Blue Glazed Terracotta","5146626":"Blue Glazed Terracotta","5146627":"Blue Glazed Terracotta","5152256":"Brown Glazed Terracotta","5152257":"Brown Glazed Terracotta","5152258":"Brown Glazed Terracotta","5152259":"Brown Glazed Terracotta","5266432":"Green Glazed Terracotta","5266433":"Green Glazed Terracotta","5266434":"Green Glazed Terracotta","5266435":"Green Glazed Terracotta","5339136":"Red Glazed Terracotta","5339137":"Red Glazed Terracotta","5339138":"Red Glazed Terracotta","5339139":"Red Glazed Terracotta","5145600":"Black Glazed Terracotta","5145601":"Black Glazed Terracotta","5145602":"Black Glazed Terracotta","5145603":"Black Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file From 3d613455432fca148b1b822147979aea2772f0fd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Jun 2022 16:18:35 +0100 Subject: [PATCH 0175/1858] Remove ItemFactory::air() --- src/item/ItemFactory.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index e8c0d7f1a2..6cb668993c 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -494,14 +494,6 @@ class ItemFactory{ return $item; } - /** - * @deprecated - * @see VanillaItems::AIR() - */ - public static function air() : Item{ - return self::getInstance()->get(Ids::AIR, 0, 0); - } - /** * Returns whether the specified item ID is already registered in the item factory. */ From bc5a600d59069571662139f808c6c647cd8324bf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 26 Jun 2022 17:02:55 +0100 Subject: [PATCH 0176/1858] Added item stack serialize/deserialize methods --- src/data/bedrock/item/ItemDeserializer.php | 18 +++++++++++++++- src/data/bedrock/item/ItemSerializer.php | 15 +++++++++++-- src/item/Item.php | 21 ++----------------- src/network/mcpe/convert/ItemTranslator.php | 4 ++-- .../item/ItemSerializerDeserializerTest.php | 8 +++---- 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 8abfb24dc1..1fc93a77ba 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -64,7 +64,7 @@ final class ItemDeserializer{ /** * @throws ItemTypeDeserializeException */ - public function deserialize(Data $data) : Item{ + public function deserializeType(Data $data) : Item{ if(($blockData = $data->getBlock()) !== null){ //TODO: this is rough duct tape; we need a better way to deal with this try{ @@ -84,6 +84,22 @@ final class ItemDeserializer{ return ($this->deserializers[$id])($data); } + /** + * @throws ItemTypeDeserializeException + */ + public function deserializeStack(SavedItemStackData $data) : Item{ + $itemStack = $this->deserializeType($data->getTypeData()); + + $itemStack->setCount($data->getCount()); + if(($tagTag = $data->getTypeData()->getTag()) !== null){ + $itemStack->setNamedTag(clone $tagTag); + } + + //TODO: canDestroy, canPlaceOn, wasPickedUp are currently unused + + return $itemStack; + } + private function registerDeserializers() : void{ $this->map(Ids::ACACIA_BOAT, fn() => Items::ACACIA_BOAT()); $this->map(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()->asItem()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 0c704fe009..5c6ed2b445 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -102,7 +102,7 @@ final class ItemSerializer{ * * @throws ItemTypeSerializeException */ - public function serialize(Item $item) : Data{ + public function serializeType(Item $item) : Data{ if($item->isNull()){ throw new \InvalidArgumentException("Cannot serialize a null itemstack"); } @@ -128,7 +128,7 @@ final class ItemSerializer{ } if($locatedSerializer === null){ - throw new ItemTypeSerializeException("No serializer registered for " . get_class($item) . " " . $item->getName()); + throw new ItemTypeSerializeException("No serializer registered for " . get_class($item) . " ($index) " . $item->getName()); } /** @@ -153,6 +153,17 @@ final class ItemSerializer{ return $data; } + public function serializeStack(Item $item, ?int $slot = null) : SavedItemStackData{ + return new SavedItemStackData( + $this->serializeType($item), + $item->getCount(), + $slot, + null, + [], //we currently represent canDestroy and canPlaceOn via NBT, like PC + [] + ); + } + /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $block diff --git a/src/item/Item.php b/src/item/Item.php index 6aabbf3130..abafc6e6cb 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -32,7 +32,6 @@ use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; -use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\item\enchantment\EnchantmentInstance; @@ -648,16 +647,7 @@ class Item implements \JsonSerializable{ * @param int $slot optional, the inventory slot of the item */ public function nbtSerialize(int $slot = -1) : CompoundTag{ - $typeData = GlobalItemDataHandlers::getSerializer()->serialize($this); - - return (new SavedItemStackData( - $typeData, - $this->count, - $slot !== -1 ? $slot : null, - null, - [], //we currently represent canDestroy and canPlaceOn via NBT, like PC - [] - ))->toNbt(); + return GlobalItemDataHandlers::getSerializer()->serializeStack($this, $slot !== -1 ? $slot : null); } /** @@ -668,17 +658,10 @@ class Item implements \JsonSerializable{ $itemData = GlobalItemDataHandlers::getUpgrader()->upgradeItemStackNbt($tag); try{ - $item = GlobalItemDataHandlers::getDeserializer()->deserialize($itemData->getTypeData()); + return GlobalItemDataHandlers::getDeserializer()->deserializeStack($itemData); }catch(ItemTypeDeserializeException $e){ throw new SavedDataLoadingException($e->getMessage(), 0, $e); } - - $item->setCount($itemData->getCount()); - if(($tagTag = $itemData->getTypeData()->getTag()) !== null){ - $item->setNamedTag(clone $tagTag); - } - - return $item; } public function __clone(){ diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 6ada7f3726..b04e9f624e 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -79,7 +79,7 @@ final class ItemTranslator{ public function toNetworkId(Item $item) : array{ //TODO: we should probably come up with a cache for this - $itemData = $this->itemSerializer->serialize($item); + $itemData = $this->itemSerializer->serializeType($item); $numericId = $this->itemTypeDictionary->fromStringId($itemData->getName()); $blockStateData = $itemData->getBlock(); @@ -116,7 +116,7 @@ final class ItemTranslator{ } try{ - return $this->itemDeserializer->deserialize(new SavedItemData($stringId, $networkMeta, $blockStateData)); + return $this->itemDeserializer->deserializeType(new SavedItemData($stringId, $networkMeta, $blockStateData)); }catch(ItemTypeDeserializeException $e){ throw TypeConversionException::wrap($e, "Invalid network itemstack data"); } diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index ebc7dafc85..32e8f41398 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -45,12 +45,12 @@ final class ItemSerializerDeserializerTest extends TestCase{ } try{ - $itemData = $this->serializer->serialize($item); + $itemData = $this->serializer->serializeType($item); }catch(ItemTypeSerializeException $e){ self::fail($e->getMessage()); } try{ - $newItem = $this->deserializer->deserialize($itemData); + $newItem = $this->deserializer->deserializeType($itemData); }catch(ItemTypeDeserializeException $e){ self::fail($e->getMessage()); } @@ -67,12 +67,12 @@ final class ItemSerializerDeserializerTest extends TestCase{ } try{ - $itemData = $this->serializer->serialize($item); + $itemData = $this->serializer->serializeType($item); }catch(ItemTypeSerializeException $e){ self::fail($e->getMessage()); } try{ - $newItem = $this->deserializer->deserialize($itemData); + $newItem = $this->deserializer->deserializeType($itemData); }catch(ItemTypeDeserializeException $e){ self::fail($e->getMessage()); } From 55cb68e5b5b1783b3ce227b3981fe0627e80d2e4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 13:33:26 +0100 Subject: [PATCH 0177/1858] Burn meta wildcards from Item, allow more dynamic recipe inputs this was an obstacle for getting rid of legacy item IDs. --- src/crafting/CraftingManager.php | 8 +- .../CraftingManagerFromDataHelper.php | 60 +++++++-- src/crafting/CraftingRecipe.php | 2 +- src/crafting/ExactRecipeIngredient.php | 56 +++++++++ src/crafting/FurnaceRecipe.php | 7 +- src/crafting/FurnaceRecipeManager.php | 26 +++- src/crafting/MetaWildcardRecipeIngredient.php | 57 +++++++++ src/crafting/RecipeIngredient.php | 31 +++++ src/crafting/ShapedRecipe.php | 27 +++-- src/crafting/ShapelessRecipe.php | 31 ++--- src/data/bedrock/item/ItemSerializer.php | 6 - .../bedrock/item/upgrade/ItemDataUpgrader.php | 41 +++++++ src/inventory/BaseInventory.php | 15 +-- .../transaction/CraftingTransaction.php | 114 +++++++++++++++++- src/item/Item.php | 4 +- src/item/ItemFactory.php | 45 +++---- src/item/ItemIdentifier.php | 5 +- src/item/LegacyStringToItemParser.php | 3 + src/network/mcpe/cache/CraftingDataCache.php | 11 +- src/network/mcpe/convert/TypeConverter.php | 51 ++++---- 20 files changed, 473 insertions(+), 127 deletions(-) create mode 100644 src/crafting/ExactRecipeIngredient.php create mode 100644 src/crafting/MetaWildcardRecipeIngredient.php create mode 100644 src/crafting/RecipeIngredient.php diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index f473a739d6..f23ba53acf 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -184,7 +184,7 @@ class CraftingManager{ public function registerPotionTypeRecipe(PotionTypeRecipe $recipe) : void{ $input = $recipe->getInput(); $ingredient = $recipe->getIngredient(); - $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":" . ($ingredient->hasAnyDamageValue() ? "?" : $ingredient->getMeta())] = $recipe; + $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":" . $ingredient->getMeta()] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); @@ -193,7 +193,7 @@ class CraftingManager{ public function registerPotionContainerChangeRecipe(PotionContainerChangeRecipe $recipe) : void{ $ingredient = $recipe->getIngredient(); - $this->potionContainerChangeRecipes[$recipe->getInputItemId()][$ingredient->getId() . ":" . ($ingredient->hasAnyDamageValue() ? "?" : $ingredient->getMeta())] = $recipe; + $this->potionContainerChangeRecipes[$recipe->getInputItemId()][$ingredient->getId() . ":" . $ingredient->getMeta()] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); @@ -253,8 +253,6 @@ class CraftingManager{ public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ return $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":" . $ingredient->getMeta()] ?? - $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":?"] ?? - $this->potionContainerChangeRecipes[$input->getId()][$ingredient->getId() . ":" . $ingredient->getMeta()] ?? - $this->potionContainerChangeRecipes[$input->getId()][$ingredient->getId() . ":?"] ?? null; + $this->potionContainerChangeRecipes[$input->getId()][$ingredient->getId() . ":" . $ingredient->getMeta()] ?? null; } } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index b09607d544..d6d7608dad 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -23,14 +23,17 @@ declare(strict_types=1); namespace pocketmine\crafting; +use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; +use pocketmine\world\format\io\GlobalItemDataHandlers; use function array_map; use function file_get_contents; use function is_array; +use function is_int; use function json_decode; final class CraftingManagerFromDataHelper{ @@ -41,7 +44,7 @@ final class CraftingManagerFromDataHelper{ private static function containsUnknownItems(array $items) : bool{ $factory = ItemFactory::getInstance(); foreach($items as $item){ - if($item instanceof Durable || $item->hasAnyDamageValue()){ + if($item instanceof Durable){ //TODO: this check is imperfect and might cause problems if meta 0 isn't used for some reason if(!$factory->isRegistered($item->getId())){ return true; @@ -54,6 +57,30 @@ final class CraftingManagerFromDataHelper{ return false; } + /** + * @param mixed[] $data + */ + private static function deserializeIngredient(array $data) : ?RecipeIngredient{ + if(!isset($data["id"]) || !is_int($data["id"])){ + throw new \InvalidArgumentException("Invalid input data, expected int ID"); + } + if(isset($data["damage"]) && $data["damage"] === -1){ + try{ + $typeData = GlobalItemDataHandlers::getUpgrader()->upgradeItemTypeDataInt($data["id"], 0, 1, null); + }catch(ItemTypeDeserializeException){ + //probably unknown item + return null; + } + + return new MetaWildcardRecipeIngredient($typeData->getTypeData()->getName()); + } + + //TODO: we need to stop using jsonDeserialize for this + $item = Item::jsonDeserialize($data); + + return self::containsUnknownItems([$item]) ? null : new ExactRecipeIngredient($item); + } + public static function make(string $filePath) : CraftingManager{ $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file"), true); if(!is_array($recipes)){ @@ -61,6 +88,7 @@ final class CraftingManagerFromDataHelper{ } $result = new CraftingManager(); + $ingredientDeserializerFunc = \Closure::fromCallable([self::class, "deserializeIngredient"]); $itemDeserializerFunc = \Closure::fromCallable([Item::class, 'jsonDeserialize']); foreach($recipes["shapeless"] as $recipe){ @@ -73,9 +101,16 @@ final class CraftingManagerFromDataHelper{ if($recipeType === null){ continue; } - $inputs = array_map($itemDeserializerFunc, $recipe["input"]); + $inputs = []; + foreach($recipe["input"] as $inputData){ + $input = $ingredientDeserializerFunc($inputData); + if($input === null){ //unknown input item + continue; + } + $inputs[] = $input; + } $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - if(self::containsUnknownItems($inputs) || self::containsUnknownItems($outputs)){ + if(self::containsUnknownItems($outputs)){ continue; } $result->registerShapelessRecipe(new ShapelessRecipe( @@ -88,9 +123,16 @@ final class CraftingManagerFromDataHelper{ if($recipe["block"] !== "crafting_table"){ //TODO: filter others out for now to avoid breaking economics continue; } - $inputs = array_map($itemDeserializerFunc, $recipe["input"]); + $inputs = []; + foreach($recipe["input"] as $symbol => $inputData){ + $input = $ingredientDeserializerFunc($inputData); + if($input === null){ //unknown input item + continue; + } + $inputs[$symbol] = $input; + } $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - if(self::containsUnknownItems($inputs) || self::containsUnknownItems($outputs)){ + if(self::containsUnknownItems($outputs)){ continue; } $result->registerShapedRecipe(new ShapedRecipe( @@ -111,8 +153,8 @@ final class CraftingManagerFromDataHelper{ continue; } $output = Item::jsonDeserialize($recipe["output"]); - $input = Item::jsonDeserialize($recipe["input"]); - if(self::containsUnknownItems([$output, $input])){ + $input = self::deserializeIngredient($recipe["input"]); + if($input === null || self::containsUnknownItems([$output])){ continue; } $result->getFurnaceRecipeManager($furnaceType)->register(new FurnaceRecipe( @@ -135,9 +177,9 @@ final class CraftingManagerFromDataHelper{ )); } foreach($recipes["potion_container_change"] as $recipe){ - $input = ItemFactory::getInstance()->get($recipe["input_item_id"], -1); + $input = ItemFactory::getInstance()->get($recipe["input_item_id"]); $ingredient = Item::jsonDeserialize($recipe["ingredient"]); - $output = ItemFactory::getInstance()->get($recipe["output_item_id"], -1); + $output = ItemFactory::getInstance()->get($recipe["output_item_id"]); if(self::containsUnknownItems([$input, $ingredient, $output])){ continue; diff --git a/src/crafting/CraftingRecipe.php b/src/crafting/CraftingRecipe.php index 8666235a88..02e6fce040 100644 --- a/src/crafting/CraftingRecipe.php +++ b/src/crafting/CraftingRecipe.php @@ -29,7 +29,7 @@ interface CraftingRecipe{ /** * Returns a list of items needed to craft this recipe. This MUST NOT include Air items or items with a zero count. * - * @return Item[] + * @return RecipeIngredient[] */ public function getIngredientList() : array; diff --git a/src/crafting/ExactRecipeIngredient.php b/src/crafting/ExactRecipeIngredient.php new file mode 100644 index 0000000000..76543b0acf --- /dev/null +++ b/src/crafting/ExactRecipeIngredient.php @@ -0,0 +1,56 @@ +isNull()){ + throw new \InvalidArgumentException("Recipe ingredients must not be air items"); + } + if($item->getCount() !== 1){ + throw new \InvalidArgumentException("Recipe ingredients cannot require count"); + } + $this->item = clone $item; + } + + public function getItem() : Item{ return clone $this->item; } + + public function accepts(Item $item) : bool{ + //client-side, recipe inputs can't actually require NBT + //but on the PM side, we currently check for it if the input requires it, so we have to continue to do so for + //the sake of consistency + return $item->getCount() >= 1 && $this->item->equals($item, true, $this->item->hasNamedTag()); + } + + public function __toString() : string{ + return "ExactRecipeIngredient(" . $this->item . ")"; + } +} diff --git a/src/crafting/FurnaceRecipe.php b/src/crafting/FurnaceRecipe.php index e719aa07b3..f54dd23341 100644 --- a/src/crafting/FurnaceRecipe.php +++ b/src/crafting/FurnaceRecipe.php @@ -29,14 +29,13 @@ class FurnaceRecipe{ public function __construct( private Item $result, - private Item $ingredient + private RecipeIngredient $ingredient ){ $this->result = clone $result; - $this->ingredient = clone $ingredient; } - public function getInput() : Item{ - return clone $this->ingredient; + public function getInput() : RecipeIngredient{ + return $this->ingredient; } public function getResult() : Item{ diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index f715468dd9..5d46f0e19d 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -25,11 +25,18 @@ namespace pocketmine\crafting; use pocketmine\item\Item; use pocketmine\utils\ObjectSet; +use function morton2d_encode; final class FurnaceRecipeManager{ /** @var FurnaceRecipe[] */ protected array $furnaceRecipes = []; + /** + * @var FurnaceRecipe[] + * @phpstan-var array + */ + private array $lookupCache = []; + /** @phpstan-var ObjectSet<\Closure(FurnaceRecipe) : void> */ private ObjectSet $recipeRegisteredCallbacks; @@ -52,14 +59,27 @@ final class FurnaceRecipeManager{ } public function register(FurnaceRecipe $recipe) : void{ - $input = $recipe->getInput(); - $this->furnaceRecipes[$input->getId() . ":" . ($input->hasAnyDamageValue() ? "?" : $input->getMeta())] = $recipe; + $this->furnaceRecipes[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback($recipe); } } public function match(Item $input) : ?FurnaceRecipe{ - return $this->furnaceRecipes[$input->getId() . ":" . $input->getMeta()] ?? $this->furnaceRecipes[$input->getId() . ":?"] ?? null; + $index = morton2d_encode($input->getId(), $input->getMeta()); + $simpleRecipe = $this->lookupCache[$index] ?? null; + if($simpleRecipe !== null){ + return $simpleRecipe; + } + + foreach($this->furnaceRecipes as $recipe){ + if($recipe->getInput()->accepts($input)){ + //remember that this item is accepted by this recipe, so we don't need to bruteforce it again + $this->lookupCache[$index] = $recipe; + return $recipe; + } + } + + return null; } } diff --git a/src/crafting/MetaWildcardRecipeIngredient.php b/src/crafting/MetaWildcardRecipeIngredient.php new file mode 100644 index 0000000000..8aa6a1f177 --- /dev/null +++ b/src/crafting/MetaWildcardRecipeIngredient.php @@ -0,0 +1,57 @@ +itemId; } + + public function accepts(Item $item) : bool{ + if($item->getCount() < 1){ + return false; + } + + return GlobalItemDataHandlers::getSerializer()->serializeType($item)->getName() === $this->itemId; + } + + public function __toString() : string{ + return "MetaWildcardRecipeIngredient($this->itemId)"; + } +} diff --git a/src/crafting/RecipeIngredient.php b/src/crafting/RecipeIngredient.php new file mode 100644 index 0000000000..19a7b6085f --- /dev/null +++ b/src/crafting/RecipeIngredient.php @@ -0,0 +1,31 @@ + Item map */ + /** @var RecipeIngredient[] char => RecipeIngredient map */ private array $ingredientList = []; /** @var Item[] */ private array $results = []; @@ -46,15 +45,15 @@ class ShapedRecipe implements CraftingRecipe{ /** * Constructs a ShapedRecipe instance. * - * @param string[] $shape
+ * @param string[] $shape
* Array of 1, 2, or 3 strings representing the rows of the recipe. * This accepts an array of 1, 2 or 3 strings. Each string should be of the same length and must be at most 3 * characters long. Each character represents a unique type of ingredient. Spaces are interpreted as air. - * @param Item[] $ingredients
+ * @param RecipeIngredient[] $ingredients
* Char => Item map of items to be set into the shape. * This accepts an array of Items, indexed by character. Every unique character (except space) in the shape * array MUST have a corresponding item in this list. Space character is automatically treated as air. - * @param Item[] $results List of items that this recipe produces when crafted. + * @param Item[] $results List of items that this recipe produces when crafted. * * Note: Recipes **do not** need to be square. Do NOT add padding for empty rows/columns. */ @@ -119,7 +118,7 @@ class ShapedRecipe implements CraftingRecipe{ } /** - * @return Item[][] + * @return (RecipeIngredient|null)[][] */ public function getIngredientMap() : array{ $ingredients = []; @@ -134,7 +133,7 @@ class ShapedRecipe implements CraftingRecipe{ } /** - * @return Item[] + * @return RecipeIngredient[] */ public function getIngredientList() : array{ $ingredients = []; @@ -142,7 +141,7 @@ class ShapedRecipe implements CraftingRecipe{ for($y = 0; $y < $this->height; ++$y){ for($x = 0; $x < $this->width; ++$x){ $ingredient = $this->getIngredient($x, $y); - if(!$ingredient->isNull()){ + if($ingredient !== null){ $ingredients[] = $ingredient; } } @@ -151,9 +150,8 @@ class ShapedRecipe implements CraftingRecipe{ return $ingredients; } - public function getIngredient(int $x, int $y) : Item{ - $exists = $this->ingredientList[$this->shape[$y][$x]] ?? null; - return $exists !== null ? clone $exists : VanillaItems::AIR(); + public function getIngredient(int $x, int $y) : ?RecipeIngredient{ + return $this->ingredientList[$this->shape[$y][$x]] ?? null; } /** @@ -170,7 +168,12 @@ class ShapedRecipe implements CraftingRecipe{ $given = $grid->getIngredient($reverse ? $this->width - $x - 1 : $x, $y); $required = $this->getIngredient($x, $y); - if(!$required->equals($given, !$required->hasAnyDamageValue(), $required->hasNamedTag()) || $required->getCount() > $given->getCount()){ + + if($required === null){ + if(!$given->isNull()){ + return false; //hole, such as that in the center of a chest recipe, should not be filled + } + }elseif(!$required->accepts($given)){ return false; } } diff --git a/src/crafting/ShapelessRecipe.php b/src/crafting/ShapelessRecipe.php index 2c399fe04c..5c78bc21ea 100644 --- a/src/crafting/ShapelessRecipe.php +++ b/src/crafting/ShapelessRecipe.php @@ -28,30 +28,24 @@ use pocketmine\utils\Utils; use function count; class ShapelessRecipe implements CraftingRecipe{ - /** @var Item[] */ + /** @var RecipeIngredient[] */ private array $ingredients = []; /** @var Item[] */ private array $results; private ShapelessRecipeType $type; /** - * @param Item[] $ingredients No more than 9 total. This applies to sum of item stack counts, not count of array. + * @param RecipeIngredient[] $ingredients No more than 9 total. This applies to sum of item stack counts, not count of array. * @param Item[] $results List of result items created by this recipe. * TODO: we'll want to make the type parameter mandatory in PM5 */ public function __construct(array $ingredients, array $results, ?ShapelessRecipeType $type = null){ $this->type = $type ?? ShapelessRecipeType::CRAFTING(); - foreach($ingredients as $item){ - //Ensure they get split up properly - if(count($this->ingredients) + $item->getCount() > 9){ - throw new \InvalidArgumentException("Shapeless recipes cannot have more than 9 ingredients"); - } - while($item->getCount() > 0){ - $this->ingredients[] = $item->pop(); - } + if(count($ingredients) > 9){ + throw new \InvalidArgumentException("Shapeless recipes cannot have more than 9 ingredients"); } - + $this->ingredients = $ingredients; $this->results = Utils::cloneObjectArray($results); } @@ -71,28 +65,23 @@ class ShapelessRecipe implements CraftingRecipe{ } /** - * @return Item[] + * @return RecipeIngredient[] */ public function getIngredientList() : array{ - return Utils::cloneObjectArray($this->ingredients); + return $this->ingredients; } public function getIngredientCount() : int{ - $count = 0; - foreach($this->ingredients as $ingredient){ - $count += $ingredient->getCount(); - } - - return $count; + return count($this->ingredients); } public function matchesCraftingGrid(CraftingGrid $grid) : bool{ //don't pack the ingredients - shapeless recipes require that each ingredient be in a separate slot $input = $grid->getContents(); - foreach($this->ingredients as $needItem){ + foreach($this->ingredients as $ingredient){ foreach($input as $j => $haveItem){ - if($haveItem->equals($needItem, !$needItem->hasAnyDamageValue(), $needItem->hasNamedTag()) && $haveItem->getCount() >= $needItem->getCount()){ + if($ingredient->accepts($haveItem)){ unset($input[$j]); continue 2; } diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 5c6ed2b445..ed84177346 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -72,9 +72,6 @@ final class ItemSerializer{ * @phpstan-param \Closure(TItemType) : Data $serializer */ public function map(Item $item, \Closure $serializer) : void{ - if($item->hasAnyDamageValue()){ - throw new \InvalidArgumentException("Cannot serialize a recipe wildcard"); - } $index = $item->getTypeId(); if(isset($this->itemSerializers[$index])){ //TODO: REMOVE ME @@ -106,9 +103,6 @@ final class ItemSerializer{ if($item->isNull()){ throw new \InvalidArgumentException("Cannot serialize a null itemstack"); } - if($item->hasAnyDamageValue()){ - throw new \InvalidArgumentException("Cannot serialize a recipe input as a saved itemstack"); - } if($item instanceof ItemBlock){ $data = $this->serializeBlockItem($item->getBlock()); }else{ diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 905abb208c..6e73c02b9f 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -70,6 +70,47 @@ final class ItemDataUpgrader{ ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); } + /** + * This function replaces the legacy ItemFactory::get(). + * + * Unlike ItemFactory::get(), it returns a SavedItemStackData which you can do with as you please. + * If you want to deserialize it into a PocketMine-MP itemstack, pass it to the ItemDeserializer. + * + * @see ItemDataUpgrader::upgradeItemTypeDataInt() + */ + public function upgradeItemTypeDataString(string $rawNameId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ + if(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){ + $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + }else{ + //probably a standard item + $blockStateData = null; + } + + [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + + //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? + + return new SavedItemStackData( + new SavedItemData($newNameId, $newMeta, $blockStateData, $nbt), + $count, + null, + null, + [], + [] + ); + } + + /** + * This function replaces the legacy ItemFactory::get(). + */ + public function upgradeItemTypeDataInt(int $legacyNumericId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ + $rawNameId = $this->legacyIntToStringIdMap->legacyToString($legacyNumericId); + if($rawNameId === null){ + throw new SavedDataLoadingException("Unmapped legacy item ID $legacyNumericId"); + } + return $this->upgradeItemTypeDataString($rawNameId, $meta, $count, $nbt); + } + /** * @throws SavedDataLoadingException */ diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 8d7d5491c1..a37064e83c 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -105,10 +105,9 @@ abstract class BaseInventory implements Inventory{ public function contains(Item $item) : bool{ $count = max(1, $item->getCount()); - $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); foreach($this->getContents() as $i){ - if($item->equals($i, $checkDamage, $checkTags)){ + if($item->equals($i, true, $checkTags)){ $count -= $i->getCount(); if($count <= 0){ return true; @@ -121,23 +120,22 @@ abstract class BaseInventory implements Inventory{ public function all(Item $item) : array{ $slots = []; - $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags)){ + if($item->equals($i, true, $checkTags)){ $slots[$index] = $i; } } return $slots; } + public function first(Item $item, bool $exact = false) : int{ $count = $exact ? $item->getCount() : max(1, $item->getCount()); - $checkDamage = $exact || !$item->hasAnyDamageValue(); $checkTags = $exact || $item->hasNamedTag(); foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags) && ($i->getCount() === $count || (!$exact && $i->getCount() > $count))){ + if($item->equals($i, true, $checkTags) && ($i->getCount() === $count || (!$exact && $i->getCount() > $count))){ return $index; } } @@ -245,11 +243,10 @@ abstract class BaseInventory implements Inventory{ } public function remove(Item $item) : void{ - $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags)){ + if($item->equals($i, true, $checkTags)){ $this->clear($index); } } @@ -272,7 +269,7 @@ abstract class BaseInventory implements Inventory{ } foreach($itemSlots as $index => $slot){ - if($slot->equals($item, !$slot->hasAnyDamageValue(), $slot->hasNamedTag())){ + if($slot->equals($item, true, $slot->hasNamedTag())){ $amount = min($item->getCount(), $slot->getCount()); $slot->setCount($slot->getCount() - $amount); $item->setCount($item->getCount() - $amount); diff --git a/src/inventory/transaction/CraftingTransaction.php b/src/inventory/transaction/CraftingTransaction.php index bea88b1871..a5b60a12fc 100644 --- a/src/inventory/transaction/CraftingTransaction.php +++ b/src/inventory/transaction/CraftingTransaction.php @@ -25,12 +25,18 @@ namespace pocketmine\inventory\transaction; use pocketmine\crafting\CraftingManager; use pocketmine\crafting\CraftingRecipe; +use pocketmine\crafting\RecipeIngredient; use pocketmine\event\inventory\CraftItemEvent; use pocketmine\item\Item; use pocketmine\player\Player; +use pocketmine\utils\Utils; +use function array_fill_keys; +use function array_keys; use function array_pop; use function count; use function intdiv; +use function min; +use function uasort; /** * This transaction type is specialized for crafting validation. It shares most of the same semantics of the base @@ -63,13 +69,110 @@ class CraftingTransaction extends InventoryTransaction{ $this->craftingManager = $craftingManager; } + /** + * @param Item[] $providedItems + * @return Item[] + */ + private static function packItems(array $providedItems) : array{ + $packedProvidedItems = []; + while(count($providedItems) > 0){ + $item = array_pop($providedItems); + foreach($providedItems as $k => $otherItem){ + if($item->canStackWith($otherItem)){ + $item->setCount($item->getCount() + $otherItem->getCount()); + unset($providedItems[$k]); + } + } + $packedProvidedItems[] = $item; + } + + return $packedProvidedItems; + } + + /** + * @param Item[] $providedItems + * @param RecipeIngredient[] $recipeIngredients + */ + public static function matchIngredients(array $providedItems, array $recipeIngredients, int $expectedIterations) : void{ + if(count($recipeIngredients) === 0){ + throw new TransactionValidationException("No recipe ingredients given"); + } + if(count($providedItems) === 0){ + throw new TransactionValidationException("No transaction items given"); + } + + $packedProvidedItems = self::packItems(Utils::cloneObjectArray($providedItems)); + $packedProvidedItemMatches = array_fill_keys(array_keys($packedProvidedItems), 0); + + $recipeIngredientMatches = []; + + foreach($recipeIngredients as $ingredientIndex => $recipeIngredient){ + $acceptedItems = []; + foreach($packedProvidedItems as $itemIndex => $packedItem){ + if($recipeIngredient->accepts($packedItem)){ + $packedProvidedItemMatches[$itemIndex]++; + $acceptedItems[$itemIndex] = $itemIndex; + } + } + + if(count($acceptedItems) === 0){ + throw new TransactionValidationException("No provided items satisfy ingredient requirement $recipeIngredient"); + } + + $recipeIngredientMatches[$ingredientIndex] = $acceptedItems; + } + + foreach($packedProvidedItemMatches as $itemIndex => $itemMatchCount){ + if($itemMatchCount === 0){ + $item = $packedProvidedItems[$itemIndex]; + throw new TransactionValidationException("Provided item $item is not accepted by any recipe ingredient"); + } + } + + //Most picky ingredients first - avoid picky ingredient getting their items stolen by wildcard ingredients + //TODO: this is still insufficient when multiple wildcard ingredients have overlaps, but we don't (yet) have to + //worry about those. + uasort($recipeIngredientMatches, fn(array $a, array $b) => count($a) <=> count($b)); + + foreach($recipeIngredientMatches as $ingredientIndex => $acceptedItems){ + $needed = $expectedIterations; + + foreach($packedProvidedItems as $itemIndex => $item){ + if(!isset($acceptedItems[$itemIndex])){ + continue; + } + + $taken = min($needed, $item->getCount()); + $needed -= $taken; + $item->setCount($item->getCount() - $taken); + + if($item->getCount() === 0){ + unset($packedProvidedItems[$itemIndex]); + } + + if($needed === 0){ + //validation passed! + continue 2; + } + } + + $recipeIngredient = $recipeIngredients[$ingredientIndex]; + $actualIterations = $expectedIterations - $needed; + throw new TransactionValidationException("Not enough items to satisfy recipe ingredient $recipeIngredient for $expectedIterations (only have enough items for $actualIterations iterations)"); + } + + if(count($packedProvidedItems) > 0){ + throw new TransactionValidationException("Not all provided items were used"); + } + } + /** * @param Item[] $txItems * @param Item[] $recipeItems * * @throws TransactionValidationException */ - protected function matchRecipeItems(array $txItems, array $recipeItems, bool $wildcards, int $iterations = 0) : int{ + protected function matchOutputs(array $txItems, array $recipeItems) : int{ if(count($recipeItems) === 0){ throw new TransactionValidationException("No recipe items given"); } @@ -77,6 +180,7 @@ class CraftingTransaction extends InventoryTransaction{ throw new TransactionValidationException("No transaction items given"); } + $iterations = 0; while(count($recipeItems) > 0){ /** @var Item $recipeItem */ $recipeItem = array_pop($recipeItems); @@ -90,7 +194,7 @@ class CraftingTransaction extends InventoryTransaction{ $haveCount = 0; foreach($txItems as $j => $txItem){ - if($txItem->equals($recipeItem, !$wildcards || !$recipeItem->hasAnyDamageValue(), !$wildcards || $recipeItem->hasNamedTag())){ + if($txItem->canStackWith($recipeItem)){ $haveCount += $txItem->getCount(); unset($txItems[$j]); } @@ -115,7 +219,7 @@ class CraftingTransaction extends InventoryTransaction{ if(count($txItems) > 0){ //all items should be destroyed in this process - throw new TransactionValidationException("Expected 0 ingredients left over, have " . count($txItems)); + throw new TransactionValidationException("Expected 0 items left over, have " . count($txItems)); } return $iterations; @@ -133,9 +237,9 @@ class CraftingTransaction extends InventoryTransaction{ foreach($this->craftingManager->matchRecipeByOutputs($this->outputs) as $recipe){ try{ //compute number of times recipe was crafted - $this->repetitions = $this->matchRecipeItems($this->outputs, $recipe->getResultsFor($this->source->getCraftingGrid()), false); + $this->repetitions = $this->matchOutputs($this->outputs, $recipe->getResultsFor($this->source->getCraftingGrid())); //assert that $repetitions x recipe ingredients should be consumed - $this->matchRecipeItems($this->inputs, $recipe->getIngredientList(), true, $this->repetitions); + self::matchIngredients($this->inputs, $recipe->getIngredientList(), $this->repetitions); //Success! $this->recipe = $recipe; diff --git a/src/item/Item.php b/src/item/Item.php index abafc6e6cb..3819b1f1e1 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -581,7 +581,7 @@ class Item implements \JsonSerializable{ } final public function __toString() : string{ - return "Item " . $this->name . " (" . $this->getId() . ":" . ($this->hasAnyDamageValue() ? "?" : $this->getMeta()) . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); + return "Item " . $this->name . " (" . $this->getId() . ":" . $this->getMeta() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); } /** @@ -647,7 +647,7 @@ class Item implements \JsonSerializable{ * @param int $slot optional, the inventory slot of the item */ public function nbtSerialize(int $slot = -1) : CompoundTag{ - return GlobalItemDataHandlers::getSerializer()->serializeStack($this, $slot !== -1 ? $slot : null); + return GlobalItemDataHandlers::getSerializer()->serializeStack($this, $slot !== -1 ? $slot : null)->toNbt(); } /** diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 6cb668993c..4329133353 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -457,27 +457,30 @@ class ItemFactory{ public function get(int $id, int $meta = 0, int $count = 1, ?CompoundTag $tags = null) : Item{ /** @var Item|null $item */ $item = null; - if($meta !== -1){ - if(isset($this->list[$offset = self::getListOffset($id, $meta)])){ - $item = clone $this->list[$offset]; - }elseif(isset($this->list[$zero = self::getListOffset($id, 0)]) && $this->list[$zero] instanceof Durable){ - if($meta <= $this->list[$zero]->getMaxDurability()){ - $item = clone $this->list[$zero]; - $item->setDamage($meta); - }else{ - $item = new Item(new IID($id, $meta)); - } - }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 - $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 - } + + if($meta < 0 || $meta > 0x7ffe){ //0x7fff would cause problems with recipe wildcards + throw new \InvalidArgumentException("Meta cannot be negative or larger than " . 0x7ffe); + } + + if(isset($this->list[$offset = self::getListOffset($id, $meta)])){ + $item = clone $this->list[$offset]; + }elseif(isset($this->list[$zero = self::getListOffset($id, 0)]) && $this->list[$zero] instanceof Durable){ + if($meta <= $this->list[$zero]->getMaxDurability()){ + $item = clone $this->list[$zero]; + $item->setDamage($meta); + }else{ + $item = new Item(new IID($id, $meta)); + } + }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 + $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/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index 44cb77420c..9681a4b0df 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -31,8 +31,11 @@ class ItemIdentifier{ if($id < -0x8000 || $id > 0x7fff){ //signed short range throw new \InvalidArgumentException("ID must be in range " . -0x8000 . " - " . 0x7fff); } + if($meta < 0 || $meta > 0x7ffe){ + throw new \InvalidArgumentException("Meta must be in range 0 - " . 0x7ffe); + } $this->id = $id; - $this->meta = $meta !== -1 ? $meta & 0x7FFF : -1; + $this->meta = $meta; } public function getId() : int{ diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index e05f4d0316..6fe1f60630 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -104,6 +104,9 @@ final class LegacyStringToItemParser{ $meta = 0; }elseif(is_numeric($b[1])){ $meta = (int) $b[1]; + if($meta < 0 || $meta > 0x7ffe){ + throw new LegacyStringToItemParserException("Meta value $meta is outside the range 0 - " . 0x7ffe); + } }else{ throw new LegacyStringToItemParserException("Unable to parse \"" . $b[1] . "\" from \"" . $input . "\" as a valid meta value"); } diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index a84a6b81c9..8c1cd532d6 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\cache; use pocketmine\crafting\CraftingManager; use pocketmine\crafting\FurnaceType; +use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -37,7 +38,7 @@ use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipe as ProtocolFurna use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipeBlockName; use pocketmine\network\mcpe\protocol\types\recipe\PotionContainerChangeRecipe as ProtocolPotionContainerChangeRecipe; use pocketmine\network\mcpe\protocol\types\recipe\PotionTypeRecipe as ProtocolPotionTypeRecipe; -use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient; +use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient as ProtocolRecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\ShapedRecipe as ProtocolShapedRecipe; use pocketmine\network\mcpe\protocol\types\recipe\ShapelessRecipe as ProtocolShapelessRecipe; use pocketmine\timings\Timings; @@ -91,8 +92,8 @@ final class CraftingDataCache{ $recipesWithTypeIds[] = new ProtocolShapelessRecipe( CraftingDataPacket::ENTRY_SHAPELESS, Binary::writeInt(++$counter), - array_map(function(Item $item) use ($converter) : RecipeIngredient{ - return $converter->coreItemStackToRecipeIngredient($item); + array_map(function(RecipeIngredient $item) use ($converter) : ProtocolRecipeIngredient{ + return $converter->coreRecipeIngredientToNet($item); }, $recipe->getIngredientList()), array_map(function(Item $item) use ($converter) : ItemStack{ return $converter->coreItemStackToNet($item); @@ -110,7 +111,7 @@ final class CraftingDataCache{ for($row = 0, $height = $recipe->getHeight(); $row < $height; ++$row){ for($column = 0, $width = $recipe->getWidth(); $column < $width; ++$column){ - $inputs[$row][$column] = $converter->coreItemStackToRecipeIngredient($recipe->getIngredient($column, $row)); + $inputs[$row][$column] = $converter->coreRecipeIngredientToNet($recipe->getIngredient($column, $row)); } } $recipesWithTypeIds[] = $r = new ProtocolShapedRecipe( @@ -136,7 +137,7 @@ final class CraftingDataCache{ default => throw new AssumptionFailedError("Unreachable"), }; foreach($manager->getFurnaceRecipeManager($furnaceType)->getAll() as $recipe){ - $input = $converter->coreItemStackToRecipeIngredient($recipe->getInput()); + $input = $converter->coreRecipeIngredientToNet($recipe->getInput()); $recipesWithTypeIds[] = new ProtocolFurnaceRecipe( CraftingDataPacket::ENTRY_FURNACE_DATA, $input->getId(), diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 44a75c20b5..8300fa794f 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -29,6 +29,9 @@ use pocketmine\block\inventory\EnchantInventory; use pocketmine\block\inventory\LoomInventory; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\block\VanillaBlocks; +use pocketmine\crafting\ExactRecipeIngredient; +use pocketmine\crafting\MetaWildcardRecipeIngredient; +use pocketmine\crafting\RecipeIngredient; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; @@ -48,11 +51,12 @@ use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; -use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient; +use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient as ProtocolRecipeIngredient; use pocketmine\player\GameMode; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; +use function get_class; class TypeConverter{ use SingletonTrait; @@ -115,39 +119,40 @@ class TypeConverter{ } } - public function coreItemStackToRecipeIngredient(Item $itemStack) : RecipeIngredient{ - if($itemStack->isNull()){ - return new RecipeIngredient(0, 0, 0); + public function coreRecipeIngredientToNet(?RecipeIngredient $ingredient) : ProtocolRecipeIngredient{ + if($ingredient === null){ + return new ProtocolRecipeIngredient(0, 0, 0); } - if($itemStack->hasAnyDamageValue()){ - [$id, ] = ItemTranslator::getInstance()->toNetworkId(ItemFactory::getInstance()->get($itemStack->getId())); + if($ingredient instanceof MetaWildcardRecipeIngredient){ + $id = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($ingredient->getItemId()); $meta = self::RECIPE_INPUT_WILDCARD_META; - }else{ - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack); + }elseif($ingredient instanceof ExactRecipeIngredient){ + $item = $ingredient->getItem(); + [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($item); if($id < 256){ //TODO: this is needed for block crafting recipes to work - we need to replace this with some kind of //blockstate <-> meta mapping table so that we can remove the legacy code from the core - $meta = $itemStack->getMeta(); + $meta = $item->getMeta(); } + }else{ + throw new \LogicException("Unsupported recipe ingredient type " . get_class($ingredient) . ", only " . ExactRecipeIngredient::class . " and " . MetaWildcardRecipeIngredient::class . " are supported"); } - return new RecipeIngredient($id, $meta, $itemStack->getCount()); + return new ProtocolRecipeIngredient($id, $meta, 1); } - public function recipeIngredientToCoreItemStack(RecipeIngredient $ingredient) : Item{ + public function netRecipeIngredientToCore(ProtocolRecipeIngredient $ingredient) : ?RecipeIngredient{ if($ingredient->getId() === 0){ - return VanillaItems::AIR(); + return null; + } + + if($ingredient->getMeta() === self::RECIPE_INPUT_WILDCARD_META){ + $itemId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($ingredient->getId()); + return new MetaWildcardRecipeIngredient($itemId); } //TODO: this won't be handled properly for blockitems because a block runtimeID is expected rather than a meta value - - if($ingredient->getMeta() === self::RECIPE_INPUT_WILDCARD_META){ - $idItem = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), 0, 0); - $result = ItemFactory::getInstance()->get($idItem->getId(), -1); - }else{ - $result = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), $ingredient->getMeta(), 0); - } - $result->setCount($ingredient->getCount()); - return $result; + $result = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), $ingredient->getMeta(), 0); + return new ExactRecipeIngredient($result); } public function coreItemStackToNet(Item $itemStack) : ItemStack{ @@ -237,8 +242,8 @@ class TypeConverter{ if($id !== null && ($id < -0x8000 || $id >= 0x7fff)){ throw new TypeConversionException("Item ID must be in range " . -0x8000 . " ... " . 0x7fff . " (received $id)"); } - if($meta < 0 || $meta >= 0x7fff){ //this meta value may have been restored from the NBT - throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7fff . " (received $meta)"); + if($meta < 0 || $meta >= 0x7ffe){ //this meta value may have been restored from the NBT + throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7ffe . " (received $meta)"); } $itemResult = ItemFactory::getInstance()->get($id ?? $itemResult->getId(), $meta); } From 65ed7d77940f68f294d6ca4f186bebd9f8e20a36 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 13:35:43 +0100 Subject: [PATCH 0178/1858] Remove Item::hasAnyDamageValue() --- src/item/Item.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/item/Item.php b/src/item/Item.php index 3819b1f1e1..52c525ecd2 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -441,14 +441,6 @@ class Item implements \JsonSerializable{ return $this->identifier->getMeta(); } - /** - * Returns whether this item can match any item with an equivalent ID with any meta value. - * Used in crafting recipes which accept multiple variants of the same item, for example crafting tables recipes. - */ - public function hasAnyDamageValue() : bool{ - return $this->identifier->getMeta() === -1; - } - /** * Returns the highest amount of this item which will fit into one inventory slot. */ From b61a934c9f6c42861cb21a3a67d30573afd4b7ad Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 14:23:14 +0100 Subject: [PATCH 0179/1858] CraftingManagerFromDataHelper: fixed recipes with unknown items being registered without said items --- src/crafting/CraftingManagerFromDataHelper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index d6d7608dad..bcc8297903 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -105,7 +105,7 @@ final class CraftingManagerFromDataHelper{ foreach($recipe["input"] as $inputData){ $input = $ingredientDeserializerFunc($inputData); if($input === null){ //unknown input item - continue; + continue 2; } $inputs[] = $input; } @@ -127,7 +127,7 @@ final class CraftingManagerFromDataHelper{ foreach($recipe["input"] as $symbol => $inputData){ $input = $ingredientDeserializerFunc($inputData); if($input === null){ //unknown input item - continue; + continue 2; } $inputs[$symbol] = $input; } From bedc9cf518848fe46f1703b8321051992c5ff037 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 14:30:12 +0100 Subject: [PATCH 0180/1858] Item::jsonDeserialize(): remove bogus phpdoc (we don't actually know if this is even valid) --- src/item/Item.php | 8 -------- tests/phpstan/configs/actual-problems.neon | 19 +++++++++++++++++-- .../phpstan/configs/runtime-type-checks.neon | 5 ----- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/item/Item.php b/src/item/Item.php index 52c525ecd2..f618a687ff 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -605,14 +605,6 @@ class Item implements \JsonSerializable{ /** * Returns an Item from properties created in an array by {@link Item#jsonSerialize} * @param mixed[] $data - * @phpstan-param array{ - * id: int, - * damage?: int, - * count?: int, - * nbt?: string, - * nbt_hex?: string, - * nbt_b64?: string - * } $data * * @throws NbtDataException * @throws \InvalidArgumentException diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 77e40efb03..2ec7031d0d 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -581,7 +581,7 @@ parameters: path: ../../../src/inventory/CreativeInventory.php - - message: "#^Parameter \\#1 \\$data of static method pocketmine\\\\item\\\\Item\\:\\:jsonDeserialize\\(\\) expects array\\{id\\: int, damage\\?\\: int, count\\?\\: int, nbt\\?\\: string, nbt_hex\\?\\: string, nbt_b64\\?\\: string\\}, mixed given\\.$#" + message: "#^Parameter \\#1 \\$data of static method pocketmine\\\\item\\\\Item\\:\\:jsonDeserialize\\(\\) expects array, mixed given\\.$#" count: 1 path: ../../../src/inventory/CreativeInventory.php @@ -601,7 +601,22 @@ parameters: path: ../../../src/inventory/transaction/CraftingTransaction.php - - message: "#^Parameter \\#1 \\$buffer of method pocketmine\\\\nbt\\\\BaseNbtSerializer\\:\\:read\\(\\) expects string, string\\|false given\\.$#" + message: "#^Cannot cast mixed to int\\.$#" + count: 3 + path: ../../../src/item/Item.php + + - + message: "#^Parameter \\#1 \\$buffer of method pocketmine\\\\nbt\\\\BaseNbtSerializer\\:\\:read\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../../src/item/Item.php + + - + message: "#^Parameter \\#1 \\$string of function base64_decode expects string, mixed given\\.$#" + count: 1 + path: ../../../src/item/Item.php + + - + message: "#^Parameter \\#1 \\$string of function hex2bin expects string, mixed given\\.$#" count: 1 path: ../../../src/item/Item.php diff --git a/tests/phpstan/configs/runtime-type-checks.neon b/tests/phpstan/configs/runtime-type-checks.neon index fb1e456b78..04da39f642 100644 --- a/tests/phpstan/configs/runtime-type-checks.neon +++ b/tests/phpstan/configs/runtime-type-checks.neon @@ -1,10 +1,5 @@ parameters: ignoreErrors: - - - message: "#^Casting to int something that's already int\\.$#" - count: 2 - path: ../../../src/item/Item.php - - message: "#^Instanceof between pocketmine\\\\nbt\\\\tag\\\\CompoundTag and pocketmine\\\\nbt\\\\tag\\\\CompoundTag will always evaluate to true\\.$#" count: 1 From 0afb67be7df18777f3c385c6056dd7a62126aed6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 15:37:05 +0100 Subject: [PATCH 0181/1858] Improve BlockFactory initialization performance as expected, expanding data range unconditionally resulted in some performance issues ... --- src/block/Anvil.php | 2 ++ src/block/Bamboo.php | 2 ++ src/block/BambooSapling.php | 2 ++ src/block/Barrel.php | 2 ++ src/block/BaseBanner.php | 3 +++ src/block/Bed.php | 2 ++ src/block/Bedrock.php | 2 ++ src/block/Bell.php | 2 ++ src/block/Block.php | 17 +++++++++++++++-- src/block/BlockFactory.php | 6 +++++- src/block/BrewingStand.php | 2 ++ src/block/Button.php | 2 ++ src/block/Cactus.php | 2 ++ src/block/Cake.php | 2 ++ src/block/CocoaBlock.php | 2 ++ src/block/Crops.php | 2 ++ src/block/DaylightSensor.php | 2 ++ src/block/DetectorRail.php | 2 ++ src/block/Dirt.php | 2 ++ src/block/Door.php | 3 +++ src/block/DoublePlant.php | 2 ++ src/block/EndPortalFrame.php | 2 ++ src/block/Farmland.php | 2 ++ src/block/FenceGate.php | 2 ++ src/block/Fire.php | 2 ++ src/block/FloorBanner.php | 2 ++ src/block/FloorCoralFan.php | 2 ++ src/block/FrostedIce.php | 2 ++ src/block/Furnace.php | 2 ++ src/block/Hopper.php | 2 ++ src/block/ItemFrame.php | 2 ++ src/block/Lantern.php | 2 ++ src/block/Leaves.php | 2 ++ src/block/Lectern.php | 2 ++ src/block/Lever.php | 2 ++ src/block/Liquid.php | 2 ++ src/block/NetherPortal.php | 2 ++ src/block/NetherWartPlant.php | 2 ++ src/block/Rail.php | 2 ++ src/block/RedMushroomBlock.php | 2 ++ src/block/RedstoneComparator.php | 2 ++ src/block/RedstoneLamp.php | 2 ++ src/block/RedstoneOre.php | 2 ++ src/block/RedstoneRepeater.php | 2 ++ src/block/RedstoneTorch.php | 2 ++ src/block/Sapling.php | 2 ++ src/block/SeaPickle.php | 2 ++ src/block/ShulkerBox.php | 2 ++ src/block/SimplePressurePlate.php | 2 ++ src/block/Skull.php | 2 ++ src/block/Slab.php | 2 ++ src/block/SnowLayer.php | 2 ++ src/block/Sponge.php | 2 ++ src/block/Stair.php | 2 ++ src/block/StraightOnlyRail.php | 2 ++ src/block/Sugarcane.php | 2 ++ src/block/SweetBerryBush.php | 2 ++ src/block/TNT.php | 2 ++ src/block/Torch.php | 2 ++ src/block/Trapdoor.php | 2 ++ src/block/Tripwire.php | 2 ++ src/block/TripwireHook.php | 2 ++ src/block/Vine.php | 2 ++ src/block/Wall.php | 2 ++ src/block/WallBanner.php | 2 ++ src/block/WallCoralFan.php | 2 ++ .../utils/AnalogRedstoneSignalEmitterTrait.php | 2 ++ src/block/utils/AnyFacingTrait.php | 3 +++ src/block/utils/BlockDataReader.php | 2 ++ src/block/utils/ColoredTrait.php | 2 ++ src/block/utils/CoralTypeTrait.php | 2 ++ src/block/utils/HorizontalFacingTrait.php | 2 ++ src/block/utils/PillarRotationTrait.php | 2 ++ src/block/utils/RailPoweredByRedstoneTrait.php | 2 ++ src/block/utils/SignLikeRotationTrait.php | 2 ++ 75 files changed, 169 insertions(+), 3 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 25e48ac60b..71fd046257 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,6 +51,8 @@ class Anvil extends Transparent implements Fallable{ return $this->damage << 2; } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED)); $this->setFacing($r->readHorizontalFacing()); diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index a5b2e35e8d..ccd63ced96 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -55,6 +55,8 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->setLeafSize($r->readBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES)); $this->setThick($r->readBool()); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 5d476ff8f5..66b8162417 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -36,6 +36,8 @@ use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ private bool $ready = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->setReady($r->readBool()); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 8979622ba7..748bfd3357 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -39,6 +39,8 @@ class Barrel extends Opaque{ protected bool $open = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->setFacing($r->readFacing()); $this->setOpen($r->readBool()); diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index d785bca1c5..ea33521275 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -55,6 +55,9 @@ abstract class BaseBanner extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } + + public function getRequiredStateDataBits() : int{ return 0; } + protected function decodeState(BlockDataReader $r) : void{ //TODO: we currently purposely don't read or write colour (it's stored on the tile) } diff --git a/src/block/Bed.php b/src/block/Bed.php index 80851c1310..bf9aa730aa 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -54,6 +54,8 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->occupied = $r->readBool(); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index ed77833bb2..3528e8d421 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BlockDataWriter; class Bedrock extends Opaque{ private bool $burnsForever = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->burnsForever = $r->readBool(); } diff --git a/src/block/Bell.php b/src/block/Bell.php index 9a9fad9d98..3388bb5169 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -49,6 +49,8 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->attachmentType = BlockDataReaderHelper::readBellAttachmentType($r); $this->facing = $r->readHorizontalFacing(); diff --git a/src/block/Block.php b/src/block/Block.php index 4bdc776f2d..80da4dea6d 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -100,9 +100,16 @@ class Block{ return 0; } + public function getRequiredStateDataBits() : int{ return 0; } + public function decodeStateData(int $data) : void{ - $reader = new BlockDataReader(self::INTERNAL_STATE_DATA_BITS, $data); + $givenBits = $this->getRequiredStateDataBits(); + $reader = new BlockDataReader($givenBits, $data); $this->decodeState($reader); + $readBits = $reader->getOffset(); + if($givenBits !== $readBits){ + throw new \LogicException("Exactly $givenBits bits of state data were provided, but only $readBits were read"); + } } protected function decodeState(BlockDataReader $r) : void{ @@ -113,8 +120,14 @@ class Block{ * @internal */ public function computeStateData() : int{ - $writer = new BlockDataWriter(self::INTERNAL_STATE_DATA_BITS); + $requiredBits = $this->getRequiredStateDataBits(); + $writer = new BlockDataWriter($requiredBits); $this->encodeState($writer); + + $writtenBits = $writer->getOffset(); + if($requiredBits !== $writtenBits){ + throw new \LogicException("Exactly $requiredBits bits of state data were expected, but only $writtenBits were written"); + } return $writer->getValue(); } diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 7af1685228..1e3c48a1b7 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -864,7 +864,11 @@ class BlockFactory{ //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){ + $bits = $block->getRequiredStateDataBits(); + if($bits > Block::INTERNAL_STATE_DATA_BITS){ + throw new \InvalidArgumentException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); + } + for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ $v = clone $block; try{ $v->decodeStateData($stateData); diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 20b1d802e9..5c732689ea 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -46,6 +46,8 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->setSlots(BlockDataReaderHelper::readBrewingStandSlotKeySet($r)); } diff --git a/src/block/Button.php b/src/block/Button.php index 6e45df5593..82db565efd 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -39,6 +39,8 @@ abstract class Button extends Flowable{ protected bool $pressed = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readFacing(); $this->pressed = $r->readBool(); diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 56b9129a3f..3b69e0f436 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -42,6 +42,8 @@ class Cactus extends Transparent{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 770b8fcfe3..40b100f0b3 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -41,6 +41,8 @@ class Cake extends Transparent implements FoodSource{ protected int $bites = 0; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->bites = $r->readBoundedInt(3, 0, self::MAX_BITES); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index b21af5e635..89f8bccf60 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -47,6 +47,8 @@ class CocoaBlock extends Transparent{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); diff --git a/src/block/Crops.php b/src/block/Crops.php index f7823a8eb5..a4976f0442 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -39,6 +39,8 @@ abstract class Crops extends Flowable{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(3, 0, self::MAX_AGE); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 01c7040a4c..da4c034a87 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -42,6 +42,8 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; + public function getRequiredStateDataBits() : int{ return 5; } + protected function decodeState(BlockDataReader $r) : void{ $this->signalStrength = $r->readBoundedInt(4, 0, 15); $this->inverted = $r->readBool(); diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index ad4d95810e..ecf7ee50d3 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BlockDataWriter; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->activated = $r->readBool(); diff --git a/src/block/Dirt.php b/src/block/Dirt.php index d926000aa9..f163beebe9 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -39,6 +39,8 @@ class Dirt extends Opaque{ return $this->coarse ? BlockLegacyMetadata::DIRT_FLAG_COARSE : 0; } + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->coarse = $r->readBool(); } diff --git a/src/block/Door.php b/src/block/Door.php index 6f3654ca5d..f6ad3a16c8 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -42,6 +42,9 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; + + public function getRequiredStateDataBits() : int{ return 5; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->top = $r->readBool(); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 14d363794f..add4fce8ee 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -34,6 +34,8 @@ use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ protected bool $top = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->top = $r->readBool(); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index e9c69b1fc4..aace740a63 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -36,6 +36,8 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->eye = $r->readBool(); diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 8dfb3f6f76..97a24fa72b 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -38,6 +38,8 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 0cec6374ec..1541322bb5 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -41,6 +41,8 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->open = $r->readBool(); diff --git a/src/block/Fire.php b/src/block/Fire.php index b9da2f33a5..d13ca247ab 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -46,6 +46,8 @@ class Fire extends Flowable{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } diff --git a/src/block/FloorBanner.php b/src/block/FloorBanner.php index 5e0074477c..8da061e9b6 100644 --- a/src/block/FloorBanner.php +++ b/src/block/FloorBanner.php @@ -38,6 +38,8 @@ final class FloorBanner extends BaseBanner{ encodeState as encodeRotation; } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->decodeRotation($r); diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index d1515eef93..8e5377f231 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -52,6 +52,8 @@ final class FloorCoralFan extends BaseCoral{ return CoralTypeIdMap::getInstance()->toId($this->coralType); } + public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->axis = $r->readHorizontalAxis(); diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index e6addea5cd..be19be5b48 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -33,6 +33,8 @@ class FrostedIce extends Ice{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 1bb6191aa8..0dc1e0d1c2 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -39,6 +39,8 @@ class Furnace extends Opaque{ protected bool $lit = false; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->lit = $r->readBool(); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 320fd1ce7d..f8ce02fd7e 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -41,6 +41,8 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::UP){ diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 31f802f1dc..762b5d6b0f 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -47,6 +47,8 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readFacing(); $this->hasMap = $r->readBool(); diff --git a/src/block/Lantern.php b/src/block/Lantern.php index ec54070f33..54a7e1b8cd 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -37,6 +37,8 @@ use pocketmine\world\BlockTransaction; class Lantern extends Transparent{ protected bool $hanging = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->hanging = $r->readBool(); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 4a753db521..77d557f599 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -49,6 +49,8 @@ class Leaves extends Transparent{ $this->treeType = $treeType; } + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->noDecay = $r->readBool(); $this->checkDecay = $r->readBool(); diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 7f8e731053..708dcd47db 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -47,6 +47,8 @@ class Lectern extends Transparent{ protected bool $producingSignal = false; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->producingSignal = $r->readBool(); diff --git a/src/block/Lever.php b/src/block/Lever.php index bf006d30e6..652dd72862 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -47,6 +47,8 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = BlockDataReaderHelper::readLeverFacing($r); $this->activated = $r->readBool(); diff --git a/src/block/Liquid.php b/src/block/Liquid.php index e3aca2a520..dca825ad80 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -49,6 +49,8 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; + public function getRequiredStateDataBits() : int{ return 5; } + protected function decodeState(BlockDataReader $r) : void{ $this->decay = $r->readBoundedInt(3, 0, self::MAX_DECAY); $this->falling = $r->readBool(); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 0d94449e08..5317de232f 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -35,6 +35,8 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->axis = $r->readHorizontalAxis(); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index b07644fa51..9cd1516576 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -38,6 +38,8 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 4b5ae94d67..dc93f15d66 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -35,6 +35,8 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $railShape = $r->readInt(4); if(!isset(RailConnectionInfo::CONNECTIONS[$railShape]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$railShape])){ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index f2a22a7441..22a141d2a2 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -39,6 +39,8 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->mushroomBlockType = BlockDataReaderHelper::readMushroomBlockType($r); } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 8abb70a217..cc2dbaa89a 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -45,6 +45,8 @@ class RedstoneComparator extends Flowable{ protected bool $isSubtractMode = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->isSubtractMode = $r->readBool(); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index de84d7445b..6a6919edc1 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -30,6 +30,8 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->powered = $r->readBool(); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 29946ee474..7695218574 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -34,6 +34,8 @@ use function mt_rand; class RedstoneOre extends Opaque{ protected bool $lit = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->lit = $r->readBool(); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index ed6fe01a6b..c56869f9a1 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -44,6 +44,8 @@ class RedstoneRepeater extends Flowable{ protected int $delay = self::MIN_DELAY; + public function getRequiredStateDataBits() : int{ return 5; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->delay = $r->readBoundedInt(2, self::MIN_DELAY - 1, self::MAX_DELAY - 1) + 1; diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index 78d5d282c5..ada02e26c6 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BlockDataWriter; class RedstoneTorch extends Torch{ protected bool $lit = true; + public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->lit = $r->readBool(); diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 1c4e87b59d..f2bfd2af44 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -47,6 +47,8 @@ class Sapling extends Flowable{ $this->treeType = $treeType; } + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->ready = $r->readBool(); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index b2e3047653..c85d700a91 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -39,6 +39,8 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->count = $r->readBoundedInt(2, self::MIN_COUNT - 1, self::MAX_COUNT - 1) + 1; $this->underwater = $r->readBool(); diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index b602555acc..bec196838a 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -35,6 +35,8 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; + public function getRequiredStateDataBits() : int{ return 0; } + protected function decodeState(BlockDataReader $r) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index 205583b41b..7bdfc71186 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BlockDataWriter; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->pressed = $r->readBool(); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 3495027afc..50b56f3d03 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -51,6 +51,8 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::DOWN){ diff --git a/src/block/Slab.php b/src/block/Slab.php index c39e0de84c..6abab61f6c 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -44,6 +44,8 @@ class Slab extends Transparent{ $this->slabType = SlabType::BOTTOM(); } + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->slabType = BlockDataReaderHelper::readSlabType($r); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 193d177998..9894dd43a6 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -47,6 +47,8 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS - 1, self::MAX_LAYERS - 1) + 1; } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index f5ee824bb3..8f90242684 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -33,6 +33,8 @@ class Sponge extends Opaque{ return $this->wet ? BlockLegacyMetadata::SPONGE_FLAG_WET : 0; } + public function getRequiredStateDataBits() : int{ return 1; } + protected function decodeState(BlockDataReader $r) : void{ $this->wet = $r->readBool(); } diff --git a/src/block/Stair.php b/src/block/Stair.php index ab188c53a7..9242b36ab7 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -47,6 +47,8 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->upsideDown = $r->readBool(); diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 8d9642987e..c2c171642e 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -37,6 +37,8 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $railShape = $r->readInt(3); if(!isset(RailConnectionInfo::CONNECTIONS[$railShape])){ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 51726bcff4..320a484f8b 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -38,6 +38,8 @@ class Sugarcane extends Flowable{ protected int $age = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 3fdfc9a4d4..a8c302d611 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -46,6 +46,8 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->age = $r->readBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE); } diff --git a/src/block/TNT.php b/src/block/TNT.php index 18dea8793a..80f83e0151 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -49,6 +49,8 @@ class TNT extends Opaque{ return $this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0; } + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->unstable = $r->readBool(); $this->worksUnderwater = $r->readBool(); diff --git a/src/block/Torch.php b/src/block/Torch.php index d9e3ed95da..02cbec2d29 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -38,6 +38,8 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::DOWN){ diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 61d4d58c9a..42f973a4b3 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -41,6 +41,8 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->top = $r->readBool(); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index bb045c782c..954fa888aa 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -32,6 +32,8 @@ class Tripwire extends Flowable{ protected bool $connected = false; protected bool $disarmed = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->triggered = $r->readBool(); $this->suspended = $r->readBool(); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index b0fc4876ff..2f76f184fb 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -39,6 +39,8 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->connected = $r->readBool(); diff --git a/src/block/Vine.php b/src/block/Vine.php index 4505bb3666..1ac2157efd 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -40,6 +40,8 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ foreach(Facing::HORIZONTAL as $facing){ $this->setFace($facing, $r->readBool()); diff --git a/src/block/Wall.php b/src/block/Wall.php index a97aba751b..ae781b32d0 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -43,6 +43,8 @@ class Wall extends Transparent{ protected array $connections = []; protected bool $post = false; + public function getRequiredStateDataBits() : int{ return 9; } + protected function decodeState(BlockDataReader $r) : void{ $this->connections = $r->readWallConnections(); $this->post = $r->readBool(); diff --git a/src/block/WallBanner.php b/src/block/WallBanner.php index f3e3b251da..8eee17959d 100644 --- a/src/block/WallBanner.php +++ b/src/block/WallBanner.php @@ -39,6 +39,8 @@ final class WallBanner extends BaseBanner{ encodeState as encodeFacing; } + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->decodeFacing($r); diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 5e95803e7a..125fda9074 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -43,6 +43,8 @@ final class WallCoralFan extends BaseCoral{ return CoralTypeIdMap::getInstance()->toId($this->coralType); } + public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->facing = $r->readHorizontalFacing(); diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 0089e5a023..aa037f1ca7 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -26,6 +26,8 @@ namespace pocketmine\block\utils; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->signalStrength = $r->readBoundedInt(4, 0, 15); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 0394d60a41..6c9e35e6b4 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -28,6 +28,9 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; + + public function getRequiredStateDataBits() : int{ return 3; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readFacing(); } diff --git a/src/block/utils/BlockDataReader.php b/src/block/utils/BlockDataReader.php index 22d55dbc86..dbb3f93860 100644 --- a/src/block/utils/BlockDataReader.php +++ b/src/block/utils/BlockDataReader.php @@ -118,4 +118,6 @@ final class BlockDataReader{ return $connections; } + + public function getOffset() : int{ return $this->offset; } } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 908f1bf6ac..a8efd46ae2 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -37,6 +37,8 @@ trait ColoredTrait{ return DyeColorIdMap::getInstance()->toId($this->color); } + public function getRequiredStateDataBits() : int{ return 4; } + /** @see Block::decodeState() */ protected function decodeState(BlockDataReader $r) : void{ $this->color = BlockDataReaderHelper::readDyeColor($r); diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 7f7f5be8f0..c91213a13a 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -27,6 +27,8 @@ trait CoralTypeTrait{ protected CoralType $coralType; protected bool $dead = false; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->coralType = BlockDataReaderHelper::readCoralType($r); $this->dead = $r->readBool(); diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 13a3d913cb..0da0a9ca12 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -29,6 +29,8 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 3da41373c7..1d4503ff76 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -34,6 +34,8 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; + public function getRequiredStateDataBits() : int{ return 2; } + protected function decodeState(BlockDataReader $r) : void{ $this->axis = $r->readAxis(); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index c65f0c8b92..9bc98303a9 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -26,6 +26,8 @@ namespace pocketmine\block\utils; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; + public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } + protected function decodeState(BlockDataReader $r) : void{ parent::decodeState($r); $this->powered = $r->readBool(); diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index e35bf35745..e4ee5f8689 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -29,6 +29,8 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; + public function getRequiredStateDataBits() : int{ return 4; } + protected function decodeState(BlockDataReader $r) : void{ $this->rotation = $r->readBoundedInt(4, 0, 15); } From 7deee3150283660aa55d86147c4a931d5e642451 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 15:40:39 +0100 Subject: [PATCH 0182/1858] Block: make decodeStateData() and computeStateData() final --- src/block/Block.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 80da4dea6d..363ddd6c1f 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -102,7 +102,7 @@ class Block{ public function getRequiredStateDataBits() : int{ return 0; } - public function decodeStateData(int $data) : void{ + final public function decodeStateData(int $data) : void{ $givenBits = $this->getRequiredStateDataBits(); $reader = new BlockDataReader($givenBits, $data); $this->decodeState($reader); @@ -119,7 +119,7 @@ class Block{ /** * @internal */ - public function computeStateData() : int{ + final public function computeStateData() : int{ $requiredBits = $this->getRequiredStateDataBits(); $writer = new BlockDataWriter($requiredBits); $this->encodeState($writer); From 2fd9b751b6d950fcc592fc413473f44ed0184a45 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 16:26:53 +0100 Subject: [PATCH 0183/1858] Log: remove dead code --- src/block/Log.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/block/Log.php b/src/block/Log.php index 88314eaf01..09b0648553 100644 --- a/src/block/Log.php +++ b/src/block/Log.php @@ -27,8 +27,4 @@ use pocketmine\block\utils\PillarRotationTrait; class Log extends Wood{ use PillarRotationTrait; - - protected function getAxisMetaShift() : int{ - return $this->isStripped() ? 0 : 2; - } } From 541a624d483cb5cc621b8708f22d208ab2bebd0e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 17:14:43 +0100 Subject: [PATCH 0184/1858] ItemFactory::get() now consistently throws SavedDataLoadingException on any error, including unknown items --- .../CraftingManagerFromDataHelper.php | 73 +++++++++---------- .../bedrock/item/upgrade/ItemDataUpgrader.php | 2 + src/inventory/CreativeInventory.php | 7 +- src/item/Item.php | 4 +- src/item/ItemFactory.php | 30 ++++---- src/item/LegacyStringToItemParser.php | 10 ++- src/network/mcpe/convert/TypeConverter.php | 11 ++- 7 files changed, 69 insertions(+), 68 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index bcc8297903..d4bb14b3d1 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\crafting; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; -use pocketmine\item\Durable; +use pocketmine\data\SavedDataLoadingException; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\utils\AssumptionFailedError; @@ -37,26 +37,6 @@ use function is_int; use function json_decode; final class CraftingManagerFromDataHelper{ - - /** - * @param Item[] $items - */ - private static function containsUnknownItems(array $items) : bool{ - $factory = ItemFactory::getInstance(); - foreach($items as $item){ - if($item instanceof Durable){ - //TODO: this check is imperfect and might cause problems if meta 0 isn't used for some reason - if(!$factory->isRegistered($item->getId())){ - return true; - } - }elseif(!$factory->isRegistered($item->getId(), $item->getMeta())){ - return true; - } - } - - return false; - } - /** * @param mixed[] $data */ @@ -76,9 +56,14 @@ final class CraftingManagerFromDataHelper{ } //TODO: we need to stop using jsonDeserialize for this - $item = Item::jsonDeserialize($data); + try{ + $item = Item::jsonDeserialize($data); + }catch(SavedDataLoadingException){ + //unknown item + return null; + } - return self::containsUnknownItems([$item]) ? null : new ExactRecipeIngredient($item); + return new ExactRecipeIngredient($item); } public static function make(string $filePath) : CraftingManager{ @@ -109,8 +94,10 @@ final class CraftingManagerFromDataHelper{ } $inputs[] = $input; } - $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - if(self::containsUnknownItems($outputs)){ + try{ + $outputs = array_map($itemDeserializerFunc, $recipe["output"]); + }catch(SavedDataLoadingException){ + //unknown output item continue; } $result->registerShapelessRecipe(new ShapelessRecipe( @@ -131,8 +118,10 @@ final class CraftingManagerFromDataHelper{ } $inputs[$symbol] = $input; } - $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - if(self::containsUnknownItems($outputs)){ + try{ + $outputs = array_map($itemDeserializerFunc, $recipe["output"]); + }catch(SavedDataLoadingException){ + //unknown output item continue; } $result->registerShapedRecipe(new ShapedRecipe( @@ -152,9 +141,13 @@ final class CraftingManagerFromDataHelper{ if($furnaceType === null){ continue; } - $output = Item::jsonDeserialize($recipe["output"]); + try{ + $output = Item::jsonDeserialize($recipe["output"]); + }catch(SavedDataLoadingException){ + continue; + } $input = self::deserializeIngredient($recipe["input"]); - if($input === null || self::containsUnknownItems([$output])){ + if($input === null){ continue; } $result->getFurnaceRecipeManager($furnaceType)->register(new FurnaceRecipe( @@ -163,11 +156,12 @@ final class CraftingManagerFromDataHelper{ )); } foreach($recipes["potion_type"] as $recipe){ - $input = Item::jsonDeserialize($recipe["input"]); - $ingredient = Item::jsonDeserialize($recipe["ingredient"]); - $output = Item::jsonDeserialize($recipe["output"]); - - if(self::containsUnknownItems([$input, $ingredient, $output])){ + try{ + $input = Item::jsonDeserialize($recipe["input"]); + $ingredient = Item::jsonDeserialize($recipe["ingredient"]); + $output = Item::jsonDeserialize($recipe["output"]); + }catch(SavedDataLoadingException){ + //unknown item continue; } $result->registerPotionTypeRecipe(new PotionTypeRecipe( @@ -177,11 +171,12 @@ final class CraftingManagerFromDataHelper{ )); } foreach($recipes["potion_container_change"] as $recipe){ - $input = ItemFactory::getInstance()->get($recipe["input_item_id"]); - $ingredient = Item::jsonDeserialize($recipe["ingredient"]); - $output = ItemFactory::getInstance()->get($recipe["output_item_id"]); - - if(self::containsUnknownItems([$input, $ingredient, $output])){ + try{ + $input = ItemFactory::getInstance()->get($recipe["input_item_id"]); + $ingredient = Item::jsonDeserialize($recipe["ingredient"]); + $output = ItemFactory::getInstance()->get($recipe["output_item_id"]); + }catch(SavedDataLoadingException){ + //unknown item continue; } $result->registerPotionContainerChangeRecipe(new PotionContainerChangeRecipe( diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 6e73c02b9f..e01aeb7916 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -102,6 +102,8 @@ final class ItemDataUpgrader{ /** * This function replaces the legacy ItemFactory::get(). + * + * @throws SavedDataLoadingException if the legacy numeric ID doesn't map to a string ID */ public function upgradeItemTypeDataInt(int $legacyNumericId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ $rawNameId = $this->legacyIntToStringIdMap->legacyToString($legacyNumericId); diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 40b3075d27..f3943907c9 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\inventory; +use pocketmine\data\SavedDataLoadingException; use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; @@ -40,8 +41,10 @@ final class CreativeInventory{ $creativeItems = json_decode(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json")), true); foreach($creativeItems as $data){ - $item = Item::jsonDeserialize($data); - if($item->getName() === "Unknown"){ + try{ + $item = Item::jsonDeserialize($data); + }catch(SavedDataLoadingException){ + //unknown item continue; } $this->add($item); diff --git a/src/item/Item.php b/src/item/Item.php index f618a687ff..60605d7a82 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -38,7 +38,6 @@ use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\math\Vector3; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NBT; -use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; @@ -606,8 +605,7 @@ class Item implements \JsonSerializable{ * Returns an Item from properties created in an array by {@link Item#jsonSerialize} * @param mixed[] $data * - * @throws NbtDataException - * @throws \InvalidArgumentException + * @throws SavedDataLoadingException */ final public static function jsonDeserialize(array $data) : Item{ $nbt = ""; diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 4329133353..c9c45003be 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -36,6 +36,7 @@ use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\data\bedrock\PotionTypeIdMap; +use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\Squid; @@ -50,6 +51,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\SingletonTrait; use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\World; +use function min; /** * Manages deserializing item types from their legacy ID/metadata. @@ -451,26 +453,24 @@ class ItemFactory{ * * Deserializes an item from the provided legacy ID, legacy meta, count and NBT. * - * @throws \InvalidArgumentException - * @throws NbtException + * @throws SavedDataLoadingException */ public function get(int $id, int $meta = 0, int $count = 1, ?CompoundTag $tags = null) : Item{ /** @var Item|null $item */ $item = null; + if($id < -0x8000 || $id > 0x7fff){ + throw new SavedDataLoadingException("Legacy ID must be in the range " . -0x8000 . " ... " . 0x7fff); + } if($meta < 0 || $meta > 0x7ffe){ //0x7fff would cause problems with recipe wildcards - throw new \InvalidArgumentException("Meta cannot be negative or larger than " . 0x7ffe); + throw new SavedDataLoadingException("Meta cannot be negative or larger than " . 0x7ffe); } if(isset($this->list[$offset = self::getListOffset($id, $meta)])){ $item = clone $this->list[$offset]; }elseif(isset($this->list[$zero = self::getListOffset($id, 0)]) && $this->list[$zero] instanceof Durable){ - if($meta <= $this->list[$zero]->getMaxDurability()){ - $item = clone $this->list[$zero]; - $item->setDamage($meta); - }else{ - $item = new Item(new IID($id, $meta)); - } + $item = clone $this->list[$zero]; + $item->setDamage(min($meta, $this->list[$zero]->getMaxDurability())); }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 $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $meta & 0xf); @@ -479,20 +479,22 @@ class ItemFactory{ $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); $item = new ItemBlock(new IID($id, $meta), BlockFactory::getInstance()->fromFullBlock($blockStateId)); }catch(BlockStateDeserializeException $e){ - \GlobalLogger::get()->logException($e); - //fallthru + throw new SavedDataLoadingException("Failed to deserialize itemblock: " . $e->getMessage(), 0, $e); } } } if($item === null){ - //negative damage values will fallthru to here, to avoid crazy shit with crafting wildcard hacks - $item = new Item(new IID($id, $meta)); + throw new SavedDataLoadingException("No registered item is associated with this ID and meta"); } $item->setCount($count); if($tags !== null){ - $item->setNamedTag($tags); + try{ + $item->setNamedTag($tags); + }catch(NbtException $e){ + throw new SavedDataLoadingException("Invalid item NBT: " . $e->getMessage(), 0, $e); + } } return $item; } diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index 6fe1f60630..5450e0bb03 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\SavedDataLoadingException; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; @@ -104,15 +105,16 @@ final class LegacyStringToItemParser{ $meta = 0; }elseif(is_numeric($b[1])){ $meta = (int) $b[1]; - if($meta < 0 || $meta > 0x7ffe){ - throw new LegacyStringToItemParserException("Meta value $meta is outside the range 0 - " . 0x7ffe); - } }else{ throw new LegacyStringToItemParserException("Unable to parse \"" . $b[1] . "\" from \"" . $input . "\" as a valid meta value"); } if(isset($this->map[strtolower($b[0])])){ - $item = $this->itemFactory->get($this->map[strtolower($b[0])], $meta); + try{ + $item = $this->itemFactory->get($this->map[strtolower($b[0])], $meta); + }catch(SavedDataLoadingException $e){ + throw new LegacyStringToItemParserException($e->getMessage(), 0, $e); + } }else{ throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 8300fa794f..ec699e62ae 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -32,6 +32,7 @@ use pocketmine\block\VanillaBlocks; use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; +use pocketmine\data\SavedDataLoadingException; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; @@ -239,13 +240,11 @@ class TypeConverter{ $compound = null; } if($meta !== null){ - if($id !== null && ($id < -0x8000 || $id >= 0x7fff)){ - throw new TypeConversionException("Item ID must be in range " . -0x8000 . " ... " . 0x7fff . " (received $id)"); + try{ + $itemResult = ItemFactory::getInstance()->get($id ?? $itemResult->getId(), $meta); + }catch(SavedDataLoadingException $e){ + throw new TypeConversionException("Failed loading network item: " . $e->getMessage(), 0, $e); } - if($meta < 0 || $meta >= 0x7ffe){ //this meta value may have been restored from the NBT - throw new TypeConversionException("Item meta must be in range 0 ... " . 0x7ffe . " (received $meta)"); - } - $itemResult = ItemFactory::getInstance()->get($id ?? $itemResult->getId(), $meta); } } From c0e178c19cb4db05c7072dfd44e2557868dfadad Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jun 2022 17:15:16 +0100 Subject: [PATCH 0185/1858] fix CS --- src/block/BaseBanner.php | 1 - src/block/Door.php | 1 - src/block/utils/AnyFacingTrait.php | 1 - 3 files changed, 3 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index ea33521275..75e551eefa 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -55,7 +55,6 @@ abstract class BaseBanner extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - public function getRequiredStateDataBits() : int{ return 0; } protected function decodeState(BlockDataReader $r) : void{ diff --git a/src/block/Door.php b/src/block/Door.php index f6ad3a16c8..7843a9377c 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -42,7 +42,6 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - public function getRequiredStateDataBits() : int{ return 5; } protected function decodeState(BlockDataReader $r) : void{ diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 6c9e35e6b4..982d5623c0 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -28,7 +28,6 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; - public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(BlockDataReader $r) : void{ From 60580328078f6ee9eb83082f198508da4e2b13e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Jun 2022 23:33:25 +0100 Subject: [PATCH 0186/1858] Make potion types dynamic It became obvious this was needed when I wanted to make new IDs for existing items - there's no way I'm unrolling those registrations... --- src/data/bedrock/item/ItemDeserializer.php | 93 +---------- src/data/bedrock/item/ItemSerializer.php | 105 +------------ src/item/ItemFactory.php | 6 +- src/item/Potion.php | 17 +- src/item/SplashPotion.php | 17 +- src/item/StringToItemParser.php | 172 ++++++++++----------- src/item/VanillaItems.php | 172 +-------------------- 7 files changed, 128 insertions(+), 454 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 1fc93a77ba..37fbdad7b1 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -37,7 +37,6 @@ use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\item\Item; -use pocketmine\item\PotionType; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; @@ -493,51 +492,7 @@ final class ItemDeserializer{ if($potionType === null){ throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); } - return match($potionType->id()){ - PotionType::WATER()->id() => Items::WATER_POTION(), - PotionType::MUNDANE()->id() => Items::MUNDANE_POTION(), - PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_POTION(), - PotionType::THICK()->id() => Items::THICK_POTION(), - PotionType::AWKWARD()->id() => Items::AWKWARD_POTION(), - PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_POTION(), - PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_POTION(), - PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_POTION(), - PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_POTION(), - PotionType::LEAPING()->id() => Items::LEAPING_POTION(), - PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_POTION(), - PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_POTION(), - PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_POTION(), - PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_POTION(), - PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_POTION(), - PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_POTION(), - PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_POTION(), - PotionType::SLOWNESS()->id() => Items::SLOWNESS_POTION(), - PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_POTION(), - PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_POTION(), - PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_POTION(), - PotionType::HEALING()->id() => Items::HEALING_POTION(), - PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_POTION(), - PotionType::HARMING()->id() => Items::HARMING_POTION(), - PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_POTION(), - PotionType::POISON()->id() => Items::POISON_POTION(), - PotionType::LONG_POISON()->id() => Items::LONG_POISON_POTION(), - PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_POTION(), - PotionType::REGENERATION()->id() => Items::REGENERATION_POTION(), - PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_POTION(), - PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_POTION(), - PotionType::STRENGTH()->id() => Items::STRENGTH_POTION(), - PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_POTION(), - PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_POTION(), - PotionType::WEAKNESS()->id() => Items::WEAKNESS_POTION(), - PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_POTION(), - PotionType::WITHER()->id() => Items::WITHER_POTION(), - PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_POTION(), - PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_POTION(), - PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_POTION(), - PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_POTION(), - PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_POTION(), - default => throw new ItemTypeDeserializeException("Unhandled potion type " . $potionType->getDisplayName()) - }; + return Items::POTION()->setType($potionType); }); //TODO: minecraft:powder_snow_bucket $this->map(Ids::PRISMARINE_CRYSTALS, fn() => Items::PRISMARINE_CRYSTALS()); @@ -613,51 +568,7 @@ final class ItemDeserializer{ if($potionType === null){ throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); } - return match($potionType->id()){ - PotionType::WATER()->id() => Items::WATER_SPLASH_POTION(), - PotionType::MUNDANE()->id() => Items::MUNDANE_SPLASH_POTION(), - PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_SPLASH_POTION(), - PotionType::THICK()->id() => Items::THICK_SPLASH_POTION(), - PotionType::AWKWARD()->id() => Items::AWKWARD_SPLASH_POTION(), - PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_SPLASH_POTION(), - PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_SPLASH_POTION(), - PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_SPLASH_POTION(), - PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_SPLASH_POTION(), - PotionType::LEAPING()->id() => Items::LEAPING_SPLASH_POTION(), - PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_SPLASH_POTION(), - PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_SPLASH_POTION(), - PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_SPLASH_POTION(), - PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(), - PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_SPLASH_POTION(), - PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_SPLASH_POTION(), - PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_SPLASH_POTION(), - PotionType::SLOWNESS()->id() => Items::SLOWNESS_SPLASH_POTION(), - PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_SPLASH_POTION(), - PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_SPLASH_POTION(), - PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_SPLASH_POTION(), - PotionType::HEALING()->id() => Items::HEALING_SPLASH_POTION(), - PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_SPLASH_POTION(), - PotionType::HARMING()->id() => Items::HARMING_SPLASH_POTION(), - PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_SPLASH_POTION(), - PotionType::POISON()->id() => Items::POISON_SPLASH_POTION(), - PotionType::LONG_POISON()->id() => Items::LONG_POISON_SPLASH_POTION(), - PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_SPLASH_POTION(), - PotionType::REGENERATION()->id() => Items::REGENERATION_SPLASH_POTION(), - PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_SPLASH_POTION(), - PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_SPLASH_POTION(), - PotionType::STRENGTH()->id() => Items::STRENGTH_SPLASH_POTION(), - PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_SPLASH_POTION(), - PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_SPLASH_POTION(), - PotionType::WEAKNESS()->id() => Items::WEAKNESS_SPLASH_POTION(), - PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_SPLASH_POTION(), - PotionType::WITHER()->id() => Items::WITHER_SPLASH_POTION(), - PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_SPLASH_POTION(), - PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_SPLASH_POTION(), - PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), - PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_SPLASH_POTION(), - PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_SPLASH_POTION(), - default => throw new ItemTypeDeserializeException("Unhandled potion type " . $potionType->getDisplayName()) - }; + return Items::SPLASH_POTION()->setType($potionType); }); $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); $this->map(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()->asItem()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index ed84177346..e7f1601abe 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -38,7 +38,8 @@ use pocketmine\item\Banner; use pocketmine\item\CoralFan; use pocketmine\item\Item; use pocketmine\item\ItemBlock; -use pocketmine\item\PotionType; +use pocketmine\item\Potion; +use pocketmine\item\SplashPotion; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; use function class_parents; @@ -236,22 +237,6 @@ final class ItemSerializer{ return fn() => new Data(Ids::COMPOUND, $type); } - /** - * @phpstan-return \Closure() : Data - */ - private static function potion(PotionType $type) : \Closure{ - $meta = PotionTypeIdMap::getInstance()->toId($type); - return fn() => new Data(Ids::POTION, $meta); - } - - /** - * @phpstan-return \Closure() : Data - */ - private static function splashPotion(PotionType $type) : \Closure{ - $meta = PotionTypeIdMap::getInstance()->toId($type); - return fn() => new Data(Ids::SPLASH_POTION, $meta); - } - private function registerSpecialBlockSerializers() : void{ $this->mapBlock(Blocks::ACACIA_DOOR(), self::id(Ids::ACACIA_DOOR)); $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); @@ -283,8 +268,6 @@ final class ItemSerializer{ $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); $this->map(Items::APPLE(), self::id(Ids::APPLE)); $this->map(Items::ARROW(), self::id(Ids::ARROW)); - $this->map(Items::AWKWARD_POTION(), self::potion(PotionType::AWKWARD())); - $this->map(Items::AWKWARD_SPLASH_POTION(), self::splashPotion(PotionType::AWKWARD())); $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); @@ -392,8 +375,6 @@ final class ItemSerializer{ $this->map(Items::EXPERIENCE_BOTTLE(), self::id(Ids::EXPERIENCE_BOTTLE)); $this->map(Items::FEATHER(), self::id(Ids::FEATHER)); $this->map(Items::FERMENTED_SPIDER_EYE(), self::id(Ids::FERMENTED_SPIDER_EYE)); - $this->map(Items::FIRE_RESISTANCE_POTION(), self::potion(PotionType::FIRE_RESISTANCE())); - $this->map(Items::FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::FIRE_RESISTANCE())); $this->map(Items::FISHING_ROD(), self::id(Ids::FISHING_ROD)); $this->map(Items::FLINT(), self::id(Ids::FLINT)); $this->map(Items::FLINT_AND_STEEL(), self::id(Ids::FLINT_AND_STEEL)); @@ -419,14 +400,8 @@ final class ItemSerializer{ $this->map(Items::GREEN_BED(), self::bed(DyeColor::GREEN())); $this->map(Items::GREEN_DYE(), self::id(Ids::GREEN_DYE)); $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); - $this->map(Items::HARMING_POTION(), self::potion(PotionType::HARMING())); - $this->map(Items::HARMING_SPLASH_POTION(), self::splashPotion(PotionType::HARMING())); - $this->map(Items::HEALING_POTION(), self::potion(PotionType::HEALING())); - $this->map(Items::HEALING_SPLASH_POTION(), self::splashPotion(PotionType::HEALING())); $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); - $this->map(Items::INVISIBILITY_POTION(), self::potion(PotionType::INVISIBILITY())); - $this->map(Items::INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::INVISIBILITY())); $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); $this->map(Items::IRON_CHESTPLATE(), self::id(Ids::IRON_CHESTPLATE)); @@ -442,8 +417,6 @@ final class ItemSerializer{ $this->map(Items::JUNGLE_SIGN(), self::id(Ids::JUNGLE_SIGN)); $this->map(Items::LAPIS_LAZULI(), self::id(Ids::LAPIS_LAZULI)); $this->map(Items::LAVA_BUCKET(), self::id(Ids::LAVA_BUCKET)); - $this->map(Items::LEAPING_POTION(), self::potion(PotionType::LEAPING())); - $this->map(Items::LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LEAPING())); $this->map(Items::LEATHER(), self::id(Ids::LEATHER)); $this->map(Items::LEATHER_BOOTS(), self::id(Ids::LEATHER_BOOTS)); $this->map(Items::LEATHER_CAP(), self::id(Ids::LEATHER_HELMET)); @@ -455,34 +428,6 @@ final class ItemSerializer{ $this->map(Items::LIGHT_GRAY_DYE(), self::id(Ids::LIGHT_GRAY_DYE)); $this->map(Items::LIME_BED(), self::bed(DyeColor::LIME())); $this->map(Items::LIME_DYE(), self::id(Ids::LIME_DYE)); - $this->map(Items::LONG_FIRE_RESISTANCE_POTION(), self::potion(PotionType::LONG_FIRE_RESISTANCE())); - $this->map(Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_FIRE_RESISTANCE())); - $this->map(Items::LONG_INVISIBILITY_POTION(), self::potion(PotionType::LONG_INVISIBILITY())); - $this->map(Items::LONG_INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::LONG_INVISIBILITY())); - $this->map(Items::LONG_LEAPING_POTION(), self::potion(PotionType::LONG_LEAPING())); - $this->map(Items::LONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_LEAPING())); - $this->map(Items::LONG_MUNDANE_POTION(), self::potion(PotionType::LONG_MUNDANE())); - $this->map(Items::LONG_MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_MUNDANE())); - $this->map(Items::LONG_NIGHT_VISION_POTION(), self::potion(PotionType::LONG_NIGHT_VISION())); - $this->map(Items::LONG_NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_NIGHT_VISION())); - $this->map(Items::LONG_POISON_POTION(), self::potion(PotionType::LONG_POISON())); - $this->map(Items::LONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::LONG_POISON())); - $this->map(Items::LONG_REGENERATION_POTION(), self::potion(PotionType::LONG_REGENERATION())); - $this->map(Items::LONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_REGENERATION())); - $this->map(Items::LONG_SLOWNESS_POTION(), self::potion(PotionType::LONG_SLOWNESS())); - $this->map(Items::LONG_SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOWNESS())); - $this->map(Items::LONG_SLOW_FALLING_POTION(), self::potion(PotionType::LONG_SLOW_FALLING())); - $this->map(Items::LONG_SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOW_FALLING())); - $this->map(Items::LONG_STRENGTH_POTION(), self::potion(PotionType::LONG_STRENGTH())); - $this->map(Items::LONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::LONG_STRENGTH())); - $this->map(Items::LONG_SWIFTNESS_POTION(), self::potion(PotionType::LONG_SWIFTNESS())); - $this->map(Items::LONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SWIFTNESS())); - $this->map(Items::LONG_TURTLE_MASTER_POTION(), self::potion(PotionType::LONG_TURTLE_MASTER())); - $this->map(Items::LONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::LONG_TURTLE_MASTER())); - $this->map(Items::LONG_WATER_BREATHING_POTION(), self::potion(PotionType::LONG_WATER_BREATHING())); - $this->map(Items::LONG_WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WATER_BREATHING())); - $this->map(Items::LONG_WEAKNESS_POTION(), self::potion(PotionType::LONG_WEAKNESS())); - $this->map(Items::LONG_WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WEAKNESS())); $this->map(Items::MAGENTA_BED(), self::bed(DyeColor::MAGENTA())); $this->map(Items::MAGENTA_DYE(), self::id(Ids::MAGENTA_DYE)); $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); @@ -490,15 +435,11 @@ final class ItemSerializer{ $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); $this->map(Items::MINECART(), self::id(Ids::MINECART)); - $this->map(Items::MUNDANE_POTION(), self::potion(PotionType::MUNDANE())); - $this->map(Items::MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::MUNDANE())); $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); $this->map(Items::NETHER_QUARTZ(), self::id(Ids::QUARTZ)); $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); - $this->map(Items::NIGHT_VISION_POTION(), self::potion(PotionType::NIGHT_VISION())); - $this->map(Items::NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::NIGHT_VISION())); $this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT)); $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); $this->map(Items::ORANGE_BED(), self::bed(DyeColor::ORANGE())); @@ -509,10 +450,9 @@ final class ItemSerializer{ $this->map(Items::PINK_DYE(), self::id(Ids::PINK_DYE)); $this->map(Items::PLAYER_HEAD(), self::skull(SkullType::PLAYER())); $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); - $this->map(Items::POISON_POTION(), self::potion(PotionType::POISON())); - $this->map(Items::POISON_SPLASH_POTION(), self::splashPotion(PotionType::POISON())); $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); $this->map(Items::POTATO(), self::id(Ids::POTATO)); + $this->map(Items::POTION(), fn(Potion $item) => new Data(Ids::POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); $this->map(Items::PRISMARINE_CRYSTALS(), self::id(Ids::PRISMARINE_CRYSTALS)); $this->map(Items::PRISMARINE_SHARD(), self::id(Ids::PRISMARINE_SHARD)); $this->map(Items::PUFFERFISH(), self::id(Ids::PUFFERFISH)); @@ -545,20 +485,15 @@ final class ItemSerializer{ $this->map(Items::REDSTONE_DUST(), self::id(Ids::REDSTONE)); $this->map(Items::RED_BED(), self::bed(DyeColor::RED())); $this->map(Items::RED_DYE(), self::id(Ids::RED_DYE)); - $this->map(Items::REGENERATION_POTION(), self::potion(PotionType::REGENERATION())); - $this->map(Items::REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::REGENERATION())); $this->map(Items::ROTTEN_FLESH(), self::id(Ids::ROTTEN_FLESH)); $this->map(Items::SCUTE(), self::id(Ids::SCUTE)); $this->map(Items::SHEARS(), self::id(Ids::SHEARS)); $this->map(Items::SHULKER_SHELL(), self::id(Ids::SHULKER_SHELL)); $this->map(Items::SKELETON_SKULL(), self::skull(SkullType::SKELETON())); $this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL)); - $this->map(Items::SLOWNESS_POTION(), self::potion(PotionType::SLOWNESS())); - $this->map(Items::SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::SLOWNESS())); - $this->map(Items::SLOW_FALLING_POTION(), self::potion(PotionType::SLOW_FALLING())); - $this->map(Items::SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::SLOW_FALLING())); $this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL)); $this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE)); + $this->map(Items::SPLASH_POTION(), fn(SplashPotion $item) => new Data(Ids::SPLASH_POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); $this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT)); $this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN)); $this->map(Items::SQUID_SPAWN_EGG(), self::id(Ids::SQUID_SPAWN_EGG)); @@ -569,49 +504,17 @@ final class ItemSerializer{ $this->map(Items::STONE_PICKAXE(), self::id(Ids::STONE_PICKAXE)); $this->map(Items::STONE_SHOVEL(), self::id(Ids::STONE_SHOVEL)); $this->map(Items::STONE_SWORD(), self::id(Ids::STONE_SWORD)); - $this->map(Items::STRENGTH_POTION(), self::potion(PotionType::STRENGTH())); - $this->map(Items::STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRENGTH())); $this->map(Items::STRING(), self::id(Ids::STRING)); - $this->map(Items::STRONG_HARMING_POTION(), self::potion(PotionType::STRONG_HARMING())); - $this->map(Items::STRONG_HARMING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HARMING())); - $this->map(Items::STRONG_HEALING_POTION(), self::potion(PotionType::STRONG_HEALING())); - $this->map(Items::STRONG_HEALING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HEALING())); - $this->map(Items::STRONG_LEAPING_POTION(), self::potion(PotionType::STRONG_LEAPING())); - $this->map(Items::STRONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_LEAPING())); - $this->map(Items::STRONG_POISON_POTION(), self::potion(PotionType::STRONG_POISON())); - $this->map(Items::STRONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_POISON())); - $this->map(Items::STRONG_REGENERATION_POTION(), self::potion(PotionType::STRONG_REGENERATION())); - $this->map(Items::STRONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_REGENERATION())); - $this->map(Items::STRONG_STRENGTH_POTION(), self::potion(PotionType::STRONG_STRENGTH())); - $this->map(Items::STRONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_STRENGTH())); - $this->map(Items::STRONG_SWIFTNESS_POTION(), self::potion(PotionType::STRONG_SWIFTNESS())); - $this->map(Items::STRONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_SWIFTNESS())); - $this->map(Items::STRONG_TURTLE_MASTER_POTION(), self::potion(PotionType::STRONG_TURTLE_MASTER())); - $this->map(Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_TURTLE_MASTER())); $this->map(Items::SUGAR(), self::id(Ids::SUGAR)); $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); - $this->map(Items::SWIFTNESS_POTION(), self::potion(PotionType::SWIFTNESS())); - $this->map(Items::SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::SWIFTNESS())); - $this->map(Items::THICK_POTION(), self::potion(PotionType::THICK())); - $this->map(Items::THICK_SPLASH_POTION(), self::splashPotion(PotionType::THICK())); $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); - $this->map(Items::TURTLE_MASTER_POTION(), self::potion(PotionType::TURTLE_MASTER())); - $this->map(Items::TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::TURTLE_MASTER())); $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); - $this->map(Items::WATER_BREATHING_POTION(), self::potion(PotionType::WATER_BREATHING())); - $this->map(Items::WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::WATER_BREATHING())); $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); - $this->map(Items::WATER_POTION(), self::potion(PotionType::WATER())); - $this->map(Items::WATER_SPLASH_POTION(), self::splashPotion(PotionType::WATER())); - $this->map(Items::WEAKNESS_POTION(), self::potion(PotionType::WEAKNESS())); - $this->map(Items::WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::WEAKNESS())); $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); $this->map(Items::WHITE_BED(), self::bed(DyeColor::WHITE())); $this->map(Items::WHITE_DYE(), self::id(Ids::WHITE_DYE)); - $this->map(Items::WITHER_POTION(), self::potion(PotionType::WITHER())); $this->map(Items::WITHER_SKELETON_SKULL(), self::skull(SkullType::WITHER_SKELETON())); - $this->map(Items::WITHER_SPLASH_POTION(), self::splashPotion(PotionType::WITHER())); $this->map(Items::WOODEN_AXE(), self::id(Ids::WOODEN_AXE)); $this->map(Items::WOODEN_HOE(), self::id(Ids::WOODEN_HOE)); $this->map(Items::WOODEN_PICKAXE(), self::id(Ids::WOODEN_PICKAXE)); diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index c9c45003be..e4eb558ac9 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -35,7 +35,6 @@ use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; -use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\Location; @@ -291,9 +290,8 @@ class ItemFactory{ } foreach(PotionType::getAll() as $type){ - $typeId = PotionTypeIdMap::getInstance()->toId($type); - $this->register(new Potion(new IID(Ids::POTION, $typeId), $type->getDisplayName() . " Potion", $type)); - $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION, $typeId), $type->getDisplayName() . " Splash Potion", $type)); + $this->register((new Potion(new IID(Ids::POTION, 0), "Potion"))->setType($type)); + $this->register((new SplashPotion(new IID(Ids::SPLASH_POTION, 0), "Splash Potion"))->setType($type)); } foreach(TreeType::getAll() as $type){ diff --git a/src/item/Potion.php b/src/item/Potion.php index 1255a5396d..3607e56193 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\entity\Living; use pocketmine\player\Player; @@ -30,13 +31,25 @@ class Potion extends Item implements ConsumableItem{ private PotionType $potionType; - public function __construct(ItemIdentifier $identifier, string $name, PotionType $potionType){ + public function __construct(ItemIdentifier $identifier, string $name){ + $this->potionType = PotionType::WATER(); parent::__construct($identifier, $name); - $this->potionType = $potionType; + } + + public function getMeta() : int{ + return PotionTypeIdMap::getInstance()->toId($this->potionType); } public function getType() : PotionType{ return $this->potionType; } + /** + * @return $this + */ + public function setType(PotionType $type) : self{ + $this->potionType = $type; + return $this; + } + public function getMaxStackSize() : int{ return 1; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index be59523067..39db4d6d7a 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; use pocketmine\entity\projectile\Throwable; @@ -32,13 +33,25 @@ class SplashPotion extends ProjectileItem{ private PotionType $potionType; - public function __construct(ItemIdentifier $identifier, string $name, PotionType $potionType){ + public function __construct(ItemIdentifier $identifier, string $name){ + $this->potionType = PotionType::WATER(); parent::__construct($identifier, $name); - $this->potionType = $potionType; + } + + public function getMeta() : int{ + return PotionTypeIdMap::getInstance()->toId($this->potionType); } public function getType() : PotionType{ return $this->potionType; } + /** + * @return $this + */ + public function setType(PotionType $type) : self{ + $this->potionType = $type; + return $this; + } + public function getMaxStackSize() : int{ return 1; } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 2e33d48533..a6824ccd7f 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -950,8 +950,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("arrow", fn() => Items::ARROW()); - $result->register("awkward_potion", fn() => Items::AWKWARD_POTION()); - $result->register("awkward_splash_potion", fn() => Items::AWKWARD_SPLASH_POTION()); + $result->register("awkward_potion", fn() => Items::POTION()->setType(PotionType::AWKWARD())); + $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD())); $result->register("baked_potato", fn() => Items::BAKED_POTATO()); $result->register("baked_potatoes", fn() => Items::BAKED_POTATO()); $result->register("bed", fn() => Items::WHITE_BED()); @@ -1072,8 +1072,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); - $result->register("fire_resistance_potion", fn() => Items::FIRE_RESISTANCE_POTION()); - $result->register("fire_resistance_splash_potion", fn() => Items::FIRE_RESISTANCE_SPLASH_POTION()); + $result->register("fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::FIRE_RESISTANCE())); + $result->register("fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::FIRE_RESISTANCE())); $result->register("fish", fn() => Items::RAW_FISH()); $result->register("fishing_rod", fn() => Items::FISHING_ROD()); $result->register("flint", fn() => Items::FLINT()); @@ -1109,14 +1109,14 @@ final class StringToItemParser extends StringToTParser{ $result->register("gray_dye", fn() => Items::GRAY_DYE()); $result->register("green_dye", fn() => Items::GREEN_DYE()); $result->register("gunpowder", fn() => Items::GUNPOWDER()); - $result->register("harming_potion", fn() => Items::HARMING_POTION()); - $result->register("harming_splash_potion", fn() => Items::HARMING_SPLASH_POTION()); - $result->register("healing_potion", fn() => Items::HEALING_POTION()); - $result->register("healing_splash_potion", fn() => Items::HEALING_SPLASH_POTION()); + $result->register("harming_potion", fn() => Items::POTION()->setType(PotionType::HARMING())); + $result->register("harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HARMING())); + $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING())); + $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING())); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); $result->register("ink_sac", fn() => Items::INK_SAC()); - $result->register("invisibility_potion", fn() => Items::INVISIBILITY_POTION()); - $result->register("invisibility_splash_potion", fn() => Items::INVISIBILITY_SPLASH_POTION()); + $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY())); + $result->register("invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::INVISIBILITY())); $result->register("iron_axe", fn() => Items::IRON_AXE()); $result->register("iron_boots", fn() => Items::IRON_BOOTS()); $result->register("iron_chestplate", fn() => Items::IRON_CHESTPLATE()); @@ -1131,8 +1131,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("jungle_boat", fn() => Items::JUNGLE_BOAT()); $result->register("lapis_lazuli", fn() => Items::LAPIS_LAZULI()); $result->register("lava_bucket", fn() => Items::LAVA_BUCKET()); - $result->register("leaping_potion", fn() => Items::LEAPING_POTION()); - $result->register("leaping_splash_potion", fn() => Items::LEAPING_SPLASH_POTION()); + $result->register("leaping_potion", fn() => Items::POTION()->setType(PotionType::LEAPING())); + $result->register("leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LEAPING())); $result->register("leather", fn() => Items::LEATHER()); $result->register("leather_boots", fn() => Items::LEATHER_BOOTS()); $result->register("leather_cap", fn() => Items::LEATHER_CAP()); @@ -1144,34 +1144,34 @@ final class StringToItemParser extends StringToTParser{ $result->register("light_blue_dye", fn() => Items::LIGHT_BLUE_DYE()); $result->register("light_gray_dye", fn() => Items::LIGHT_GRAY_DYE()); $result->register("lime_dye", fn() => Items::LIME_DYE()); - $result->register("long_fire_resistance_potion", fn() => Items::LONG_FIRE_RESISTANCE_POTION()); - $result->register("long_fire_resistance_splash_potion", fn() => Items::LONG_FIRE_RESISTANCE_SPLASH_POTION()); - $result->register("long_invisibility_potion", fn() => Items::LONG_INVISIBILITY_POTION()); - $result->register("long_invisibility_splash_potion", fn() => Items::LONG_INVISIBILITY_SPLASH_POTION()); - $result->register("long_leaping_potion", fn() => Items::LONG_LEAPING_POTION()); - $result->register("long_leaping_splash_potion", fn() => Items::LONG_LEAPING_SPLASH_POTION()); - $result->register("long_mundane_potion", fn() => Items::LONG_MUNDANE_POTION()); - $result->register("long_mundane_splash_potion", fn() => Items::LONG_MUNDANE_SPLASH_POTION()); - $result->register("long_night_vision_potion", fn() => Items::LONG_NIGHT_VISION_POTION()); - $result->register("long_night_vision_splash_potion", fn() => Items::LONG_NIGHT_VISION_SPLASH_POTION()); - $result->register("long_poison_potion", fn() => Items::LONG_POISON_POTION()); - $result->register("long_poison_splash_potion", fn() => Items::LONG_POISON_SPLASH_POTION()); - $result->register("long_regeneration_potion", fn() => Items::LONG_REGENERATION_POTION()); - $result->register("long_regeneration_splash_potion", fn() => Items::LONG_REGENERATION_SPLASH_POTION()); - $result->register("long_slow_falling_potion", fn() => Items::LONG_SLOW_FALLING_POTION()); - $result->register("long_slow_falling_splash_potion", fn() => Items::LONG_SLOW_FALLING_SPLASH_POTION()); - $result->register("long_slowness_potion", fn() => Items::LONG_SLOWNESS_POTION()); - $result->register("long_slowness_splash_potion", fn() => Items::LONG_SLOWNESS_SPLASH_POTION()); - $result->register("long_strength_potion", fn() => Items::LONG_STRENGTH_POTION()); - $result->register("long_strength_splash_potion", fn() => Items::LONG_STRENGTH_SPLASH_POTION()); - $result->register("long_swiftness_potion", fn() => Items::LONG_SWIFTNESS_POTION()); - $result->register("long_swiftness_splash_potion", fn() => Items::LONG_SWIFTNESS_SPLASH_POTION()); - $result->register("long_turtle_master_potion", fn() => Items::LONG_TURTLE_MASTER_POTION()); - $result->register("long_turtle_master_splash_potion", fn() => Items::LONG_TURTLE_MASTER_SPLASH_POTION()); - $result->register("long_water_breathing_potion", fn() => Items::LONG_WATER_BREATHING_POTION()); - $result->register("long_water_breathing_splash_potion", fn() => Items::LONG_WATER_BREATHING_SPLASH_POTION()); - $result->register("long_weakness_potion", fn() => Items::LONG_WEAKNESS_POTION()); - $result->register("long_weakness_splash_potion", fn() => Items::LONG_WEAKNESS_SPLASH_POTION()); + $result->register("long_fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); + $result->register("long_fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); + $result->register("long_invisibility_potion", fn() => Items::POTION()->setType(PotionType::LONG_INVISIBILITY())); + $result->register("long_invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_INVISIBILITY())); + $result->register("long_leaping_potion", fn() => Items::POTION()->setType(PotionType::LONG_LEAPING())); + $result->register("long_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_LEAPING())); + $result->register("long_mundane_potion", fn() => Items::POTION()->setType(PotionType::LONG_MUNDANE())); + $result->register("long_mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_MUNDANE())); + $result->register("long_night_vision_potion", fn() => Items::POTION()->setType(PotionType::LONG_NIGHT_VISION())); + $result->register("long_night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_NIGHT_VISION())); + $result->register("long_poison_potion", fn() => Items::POTION()->setType(PotionType::LONG_POISON())); + $result->register("long_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_POISON())); + $result->register("long_regeneration_potion", fn() => Items::POTION()->setType(PotionType::LONG_REGENERATION())); + $result->register("long_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_REGENERATION())); + $result->register("long_slow_falling_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOW_FALLING())); + $result->register("long_slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOW_FALLING())); + $result->register("long_slowness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOWNESS())); + $result->register("long_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOWNESS())); + $result->register("long_strength_potion", fn() => Items::POTION()->setType(PotionType::LONG_STRENGTH())); + $result->register("long_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_STRENGTH())); + $result->register("long_swiftness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SWIFTNESS())); + $result->register("long_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SWIFTNESS())); + $result->register("long_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::LONG_TURTLE_MASTER())); + $result->register("long_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_TURTLE_MASTER())); + $result->register("long_water_breathing_potion", fn() => Items::POTION()->setType(PotionType::LONG_WATER_BREATHING())); + $result->register("long_water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WATER_BREATHING())); + $result->register("long_weakness_potion", fn() => Items::POTION()->setType(PotionType::LONG_WEAKNESS())); + $result->register("long_weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WEAKNESS())); $result->register("magenta_dye", fn() => Items::MAGENTA_DYE()); $result->register("magma_cream", fn() => Items::MAGMA_CREAM()); $result->register("melon", fn() => Items::MELON()); @@ -1180,8 +1180,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("milk_bucket", fn() => Items::MILK_BUCKET()); $result->register("minecart", fn() => Items::MINECART()); $result->register("mob_head", fn() => Items::SKELETON_SKULL()); - $result->register("mundane_potion", fn() => Items::MUNDANE_POTION()); - $result->register("mundane_splash_potion", fn() => Items::MUNDANE_SPLASH_POTION()); + $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE())); + $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE())); $result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW()); $result->register("mutton", fn() => Items::RAW_MUTTON()); $result->register("mutton_cooked", fn() => Items::COOKED_MUTTON()); @@ -1194,21 +1194,21 @@ final class StringToItemParser extends StringToTParser{ $result->register("nether_star", fn() => Items::NETHER_STAR()); $result->register("netherbrick", fn() => Items::NETHER_BRICK()); $result->register("netherstar", fn() => Items::NETHER_STAR()); - $result->register("night_vision_potion", fn() => Items::NIGHT_VISION_POTION()); - $result->register("night_vision_splash_potion", fn() => Items::NIGHT_VISION_SPLASH_POTION()); + $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION())); + $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION())); $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("orange_dye", fn() => Items::ORANGE_DYE()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); $result->register("pink_dye", fn() => Items::PINK_DYE()); $result->register("player_head", fn() => Items::PLAYER_HEAD()); - $result->register("poison_potion", fn() => Items::POISON_POTION()); - $result->register("poison_splash_potion", fn() => Items::POISON_SPLASH_POTION()); + $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON())); + $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON())); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); $result->register("popped_chorus_fruit", fn() => Items::POPPED_CHORUS_FRUIT()); $result->register("porkchop", fn() => Items::RAW_PORKCHOP()); $result->register("potato", fn() => Items::POTATO()); - $result->register("potion", fn() => Items::WATER_POTION()); + $result->register("potion", fn() => Items::POTION()); $result->register("prismarine_crystals", fn() => Items::PRISMARINE_CRYSTALS()); $result->register("prismarine_shard", fn() => Items::PRISMARINE_SHARD()); $result->register("puffer_fish", fn() => Items::PUFFERFISH()); @@ -1244,8 +1244,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("red_dye", fn() => Items::RED_DYE()); $result->register("redstone", fn() => Items::REDSTONE_DUST()); $result->register("redstone_dust", fn() => Items::REDSTONE_DUST()); - $result->register("regeneration_potion", fn() => Items::REGENERATION_POTION()); - $result->register("regeneration_splash_potion", fn() => Items::REGENERATION_SPLASH_POTION()); + $result->register("regeneration_potion", fn() => Items::POTION()->setType(PotionType::REGENERATION())); + $result->register("regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::REGENERATION())); $result->register("rotten_flesh", fn() => Items::ROTTEN_FLESH()); $result->register("salmon", fn() => Items::RAW_SALMON()); $result->register("scute", fn() => Items::SCUTE()); @@ -1256,14 +1256,14 @@ final class StringToItemParser extends StringToTParser{ $result->register("skull", fn() => Items::SKELETON_SKULL()); $result->register("slime_ball", fn() => Items::SLIMEBALL()); $result->register("slimeball", fn() => Items::SLIMEBALL()); - $result->register("slow_falling_potion", fn() => Items::SLOW_FALLING_POTION()); - $result->register("slow_falling_splash_potion", fn() => Items::SLOW_FALLING_SPLASH_POTION()); - $result->register("slowness_potion", fn() => Items::SLOWNESS_POTION()); - $result->register("slowness_splash_potion", fn() => Items::SLOWNESS_SPLASH_POTION()); + $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING())); + $result->register("slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOW_FALLING())); + $result->register("slowness_potion", fn() => Items::POTION()->setType(PotionType::SLOWNESS())); + $result->register("slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOWNESS())); $result->register("snowball", fn() => Items::SNOWBALL()); $result->register("speckled_melon", fn() => Items::GLISTERING_MELON()); $result->register("spider_eye", fn() => Items::SPIDER_EYE()); - $result->register("splash_potion", fn() => Items::WATER_SPLASH_POTION()); + $result->register("splash_potion", fn() => Items::SPLASH_POTION()); $result->register("spruce_boat", fn() => Items::SPRUCE_BOAT()); $result->register("squid_spawn_egg", fn() => Items::SQUID_SPAWN_EGG()); $result->register("steak", fn() => Items::STEAK()); @@ -1274,49 +1274,49 @@ final class StringToItemParser extends StringToTParser{ $result->register("stone_pickaxe", fn() => Items::STONE_PICKAXE()); $result->register("stone_shovel", fn() => Items::STONE_SHOVEL()); $result->register("stone_sword", fn() => Items::STONE_SWORD()); - $result->register("strength_potion", fn() => Items::STRENGTH_POTION()); - $result->register("strength_splash_potion", fn() => Items::STRENGTH_SPLASH_POTION()); + $result->register("strength_potion", fn() => Items::POTION()->setType(PotionType::STRENGTH())); + $result->register("strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRENGTH())); $result->register("string", fn() => Items::STRING()); - $result->register("strong_harming_potion", fn() => Items::STRONG_HARMING_POTION()); - $result->register("strong_harming_splash_potion", fn() => Items::STRONG_HARMING_SPLASH_POTION()); - $result->register("strong_healing_potion", fn() => Items::STRONG_HEALING_POTION()); - $result->register("strong_healing_splash_potion", fn() => Items::STRONG_HEALING_SPLASH_POTION()); - $result->register("strong_leaping_potion", fn() => Items::STRONG_LEAPING_POTION()); - $result->register("strong_leaping_splash_potion", fn() => Items::STRONG_LEAPING_SPLASH_POTION()); - $result->register("strong_poison_potion", fn() => Items::STRONG_POISON_POTION()); - $result->register("strong_poison_splash_potion", fn() => Items::STRONG_POISON_SPLASH_POTION()); - $result->register("strong_regeneration_potion", fn() => Items::STRONG_REGENERATION_POTION()); - $result->register("strong_regeneration_splash_potion", fn() => Items::STRONG_REGENERATION_SPLASH_POTION()); - $result->register("strong_strength_potion", fn() => Items::STRONG_STRENGTH_POTION()); - $result->register("strong_strength_splash_potion", fn() => Items::STRONG_STRENGTH_SPLASH_POTION()); - $result->register("strong_swiftness_potion", fn() => Items::STRONG_SWIFTNESS_POTION()); - $result->register("strong_swiftness_splash_potion", fn() => Items::STRONG_SWIFTNESS_SPLASH_POTION()); - $result->register("strong_turtle_master_potion", fn() => Items::STRONG_TURTLE_MASTER_POTION()); - $result->register("strong_turtle_master_splash_potion", fn() => Items::STRONG_TURTLE_MASTER_SPLASH_POTION()); + $result->register("strong_harming_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HARMING())); + $result->register("strong_harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HARMING())); + $result->register("strong_healing_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HEALING())); + $result->register("strong_healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HEALING())); + $result->register("strong_leaping_potion", fn() => Items::POTION()->setType(PotionType::STRONG_LEAPING())); + $result->register("strong_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_LEAPING())); + $result->register("strong_poison_potion", fn() => Items::POTION()->setType(PotionType::STRONG_POISON())); + $result->register("strong_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_POISON())); + $result->register("strong_regeneration_potion", fn() => Items::POTION()->setType(PotionType::STRONG_REGENERATION())); + $result->register("strong_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_REGENERATION())); + $result->register("strong_strength_potion", fn() => Items::POTION()->setType(PotionType::STRONG_STRENGTH())); + $result->register("strong_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_STRENGTH())); + $result->register("strong_swiftness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SWIFTNESS())); + $result->register("strong_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SWIFTNESS())); + $result->register("strong_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); + $result->register("strong_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); $result->register("sugar", fn() => Items::SUGAR()); $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); - $result->register("swiftness_potion", fn() => Items::SWIFTNESS_POTION()); - $result->register("swiftness_splash_potion", fn() => Items::SWIFTNESS_SPLASH_POTION()); - $result->register("thick_potion", fn() => Items::THICK_POTION()); - $result->register("thick_splash_potion", fn() => Items::THICK_SPLASH_POTION()); + $result->register("swiftness_potion", fn() => Items::POTION()->setType(PotionType::SWIFTNESS())); + $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS())); + $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK())); + $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK())); $result->register("totem", fn() => Items::TOTEM()); - $result->register("turtle_master_potion", fn() => Items::TURTLE_MASTER_POTION()); - $result->register("turtle_master_splash_potion", fn() => Items::TURTLE_MASTER_SPLASH_POTION()); + $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER())); + $result->register("turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::TURTLE_MASTER())); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); $result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG()); - $result->register("water_breathing_potion", fn() => Items::WATER_BREATHING_POTION()); - $result->register("water_breathing_splash_potion", fn() => Items::WATER_BREATHING_SPLASH_POTION()); + $result->register("water_breathing_potion", fn() => Items::POTION()->setType(PotionType::WATER_BREATHING())); + $result->register("water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER_BREATHING())); $result->register("water_bucket", fn() => Items::WATER_BUCKET()); - $result->register("water_potion", fn() => Items::WATER_POTION()); - $result->register("water_splash_potion", fn() => Items::WATER_SPLASH_POTION()); - $result->register("weakness_potion", fn() => Items::WEAKNESS_POTION()); - $result->register("weakness_splash_potion", fn() => Items::WEAKNESS_SPLASH_POTION()); + $result->register("water_potion", fn() => Items::POTION()->setType(PotionType::WATER())); + $result->register("water_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER())); + $result->register("weakness_potion", fn() => Items::POTION()->setType(PotionType::WEAKNESS())); + $result->register("weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WEAKNESS())); $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); $result->register("white_dye", fn() => Items::WHITE_DYE()); - $result->register("wither_potion", fn() => Items::WITHER_POTION()); + $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER())); $result->register("wither_skeleton_skull", fn() => Items::WITHER_SKELETON_SKULL()); - $result->register("wither_splash_potion", fn() => Items::WITHER_SPLASH_POTION()); + $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER())); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); $result->register("wooden_pickaxe", fn() => Items::WOODEN_PICKAXE()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 1a569ca9ec..f220e512bd 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -37,8 +37,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ItemBlock AIR() * @method static Apple APPLE() * @method static Arrow ARROW() - * @method static Potion AWKWARD_POTION() - * @method static SplashPotion AWKWARD_SPLASH_POTION() * @method static BakedPotato BAKED_POTATO() * @method static Bamboo BAMBOO() * @method static Banner BANNER() @@ -148,8 +146,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ExperienceBottle EXPERIENCE_BOTTLE() * @method static Item FEATHER() * @method static Item FERMENTED_SPIDER_EYE() - * @method static Potion FIRE_RESISTANCE_POTION() - * @method static SplashPotion FIRE_RESISTANCE_SPLASH_POTION() * @method static FishingRod FISHING_ROD() * @method static Item FLINT() * @method static FlintSteel FLINT_AND_STEEL() @@ -175,14 +171,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Bed GREEN_BED() * @method static Dye GREEN_DYE() * @method static Item GUNPOWDER() - * @method static Potion HARMING_POTION() - * @method static SplashPotion HARMING_SPLASH_POTION() - * @method static Potion HEALING_POTION() - * @method static SplashPotion HEALING_SPLASH_POTION() * @method static Item HEART_OF_THE_SEA() * @method static Item INK_SAC() - * @method static Potion INVISIBILITY_POTION() - * @method static SplashPotion INVISIBILITY_SPLASH_POTION() * @method static Axe IRON_AXE() * @method static Armor IRON_BOOTS() * @method static Armor IRON_CHESTPLATE() @@ -198,8 +188,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ItemBlockWallOrFloor JUNGLE_SIGN() * @method static Item LAPIS_LAZULI() * @method static LiquidBucket LAVA_BUCKET() - * @method static Potion LEAPING_POTION() - * @method static SplashPotion LEAPING_SPLASH_POTION() * @method static Item LEATHER() * @method static Armor LEATHER_BOOTS() * @method static Armor LEATHER_CAP() @@ -211,34 +199,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Dye LIGHT_GRAY_DYE() * @method static Bed LIME_BED() * @method static Dye LIME_DYE() - * @method static Potion LONG_FIRE_RESISTANCE_POTION() - * @method static SplashPotion LONG_FIRE_RESISTANCE_SPLASH_POTION() - * @method static Potion LONG_INVISIBILITY_POTION() - * @method static SplashPotion LONG_INVISIBILITY_SPLASH_POTION() - * @method static Potion LONG_LEAPING_POTION() - * @method static SplashPotion LONG_LEAPING_SPLASH_POTION() - * @method static Potion LONG_MUNDANE_POTION() - * @method static SplashPotion LONG_MUNDANE_SPLASH_POTION() - * @method static Potion LONG_NIGHT_VISION_POTION() - * @method static SplashPotion LONG_NIGHT_VISION_SPLASH_POTION() - * @method static Potion LONG_POISON_POTION() - * @method static SplashPotion LONG_POISON_SPLASH_POTION() - * @method static Potion LONG_REGENERATION_POTION() - * @method static SplashPotion LONG_REGENERATION_SPLASH_POTION() - * @method static Potion LONG_SLOWNESS_POTION() - * @method static SplashPotion LONG_SLOWNESS_SPLASH_POTION() - * @method static Potion LONG_SLOW_FALLING_POTION() - * @method static SplashPotion LONG_SLOW_FALLING_SPLASH_POTION() - * @method static Potion LONG_STRENGTH_POTION() - * @method static SplashPotion LONG_STRENGTH_SPLASH_POTION() - * @method static Potion LONG_SWIFTNESS_POTION() - * @method static SplashPotion LONG_SWIFTNESS_SPLASH_POTION() - * @method static Potion LONG_TURTLE_MASTER_POTION() - * @method static SplashPotion LONG_TURTLE_MASTER_SPLASH_POTION() - * @method static Potion LONG_WATER_BREATHING_POTION() - * @method static SplashPotion LONG_WATER_BREATHING_SPLASH_POTION() - * @method static Potion LONG_WEAKNESS_POTION() - * @method static SplashPotion LONG_WEAKNESS_SPLASH_POTION() * @method static Bed MAGENTA_BED() * @method static Dye MAGENTA_DYE() * @method static Item MAGMA_CREAM() @@ -246,15 +206,11 @@ use pocketmine\utils\CloningRegistryTrait; * @method static MelonSeeds MELON_SEEDS() * @method static MilkBucket MILK_BUCKET() * @method static Minecart MINECART() - * @method static Potion MUNDANE_POTION() - * @method static SplashPotion MUNDANE_SPLASH_POTION() * @method static MushroomStew MUSHROOM_STEW() * @method static Item NAUTILUS_SHELL() * @method static Item NETHER_BRICK() * @method static Item NETHER_QUARTZ() * @method static Item NETHER_STAR() - * @method static Potion NIGHT_VISION_POTION() - * @method static SplashPotion NIGHT_VISION_SPLASH_POTION() * @method static Boat OAK_BOAT() * @method static ItemBlockWallOrFloor OAK_SIGN() * @method static Bed ORANGE_BED() @@ -265,10 +221,9 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Dye PINK_DYE() * @method static Skull PLAYER_HEAD() * @method static PoisonousPotato POISONOUS_POTATO() - * @method static Potion POISON_POTION() - * @method static SplashPotion POISON_SPLASH_POTION() * @method static Item POPPED_CHORUS_FRUIT() * @method static Potato POTATO() + * @method static Potion POTION() * @method static Item PRISMARINE_CRYSTALS() * @method static Item PRISMARINE_SHARD() * @method static Pufferfish PUFFERFISH() @@ -301,20 +256,15 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Redstone REDSTONE_DUST() * @method static Bed RED_BED() * @method static Dye RED_DYE() - * @method static Potion REGENERATION_POTION() - * @method static SplashPotion REGENERATION_SPLASH_POTION() * @method static RottenFlesh ROTTEN_FLESH() * @method static Item SCUTE() * @method static Shears SHEARS() * @method static Item SHULKER_SHELL() * @method static Skull SKELETON_SKULL() * @method static Item SLIMEBALL() - * @method static Potion SLOWNESS_POTION() - * @method static SplashPotion SLOWNESS_SPLASH_POTION() - * @method static Potion SLOW_FALLING_POTION() - * @method static SplashPotion SLOW_FALLING_SPLASH_POTION() * @method static Snowball SNOWBALL() * @method static SpiderEye SPIDER_EYE() + * @method static SplashPotion SPLASH_POTION() * @method static Boat SPRUCE_BOAT() * @method static ItemBlockWallOrFloor SPRUCE_SIGN() * @method static SpawnEgg SQUID_SPAWN_EGG() @@ -325,49 +275,17 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Pickaxe STONE_PICKAXE() * @method static Shovel STONE_SHOVEL() * @method static Sword STONE_SWORD() - * @method static Potion STRENGTH_POTION() - * @method static SplashPotion STRENGTH_SPLASH_POTION() * @method static StringItem STRING() - * @method static Potion STRONG_HARMING_POTION() - * @method static SplashPotion STRONG_HARMING_SPLASH_POTION() - * @method static Potion STRONG_HEALING_POTION() - * @method static SplashPotion STRONG_HEALING_SPLASH_POTION() - * @method static Potion STRONG_LEAPING_POTION() - * @method static SplashPotion STRONG_LEAPING_SPLASH_POTION() - * @method static Potion STRONG_POISON_POTION() - * @method static SplashPotion STRONG_POISON_SPLASH_POTION() - * @method static Potion STRONG_REGENERATION_POTION() - * @method static SplashPotion STRONG_REGENERATION_SPLASH_POTION() - * @method static Potion STRONG_STRENGTH_POTION() - * @method static SplashPotion STRONG_STRENGTH_SPLASH_POTION() - * @method static Potion STRONG_SWIFTNESS_POTION() - * @method static SplashPotion STRONG_SWIFTNESS_SPLASH_POTION() - * @method static Potion STRONG_TURTLE_MASTER_POTION() - * @method static SplashPotion STRONG_TURTLE_MASTER_SPLASH_POTION() * @method static Item SUGAR() * @method static SweetBerries SWEET_BERRIES() - * @method static Potion SWIFTNESS_POTION() - * @method static SplashPotion SWIFTNESS_SPLASH_POTION() - * @method static Potion THICK_POTION() - * @method static SplashPotion THICK_SPLASH_POTION() * @method static Totem TOTEM() - * @method static Potion TURTLE_MASTER_POTION() - * @method static SplashPotion TURTLE_MASTER_SPLASH_POTION() * @method static SpawnEgg VILLAGER_SPAWN_EGG() - * @method static Potion WATER_BREATHING_POTION() - * @method static SplashPotion WATER_BREATHING_SPLASH_POTION() * @method static LiquidBucket WATER_BUCKET() - * @method static Potion WATER_POTION() - * @method static SplashPotion WATER_SPLASH_POTION() - * @method static Potion WEAKNESS_POTION() - * @method static SplashPotion WEAKNESS_SPLASH_POTION() * @method static Item WHEAT() * @method static WheatSeeds WHEAT_SEEDS() * @method static Bed WHITE_BED() * @method static Dye WHITE_DYE() - * @method static Potion WITHER_POTION() * @method static Skull WITHER_SKELETON_SKULL() - * @method static SplashPotion WITHER_SPLASH_POTION() * @method static Axe WOODEN_AXE() * @method static Hoe WOODEN_HOE() * @method static Pickaxe WOODEN_PICKAXE() @@ -408,8 +326,6 @@ final class VanillaItems{ self::register("air", $factory->get(Ids::AIR, 0, 0)); self::register("apple", $factory->get(Ids::APPLE)); self::register("arrow", $factory->get(Ids::ARROW)); - self::register("awkward_potion", $factory->get(Ids::POTION, 4)); - self::register("awkward_splash_potion", $factory->get(Ids::SPLASH_POTION, 4)); self::register("baked_potato", $factory->get(Ids::BAKED_POTATO)); self::register("bamboo", $factory->get(Ids::BAMBOO)); self::register("banner", $factory->get(Ids::BANNER)); @@ -519,8 +435,6 @@ final class VanillaItems{ self::register("experience_bottle", $factory->get(Ids::BOTTLE_O_ENCHANTING)); self::register("feather", $factory->get(Ids::FEATHER)); self::register("fermented_spider_eye", $factory->get(Ids::FERMENTED_SPIDER_EYE)); - self::register("fire_resistance_potion", $factory->get(Ids::POTION, 12)); - self::register("fire_resistance_splash_potion", $factory->get(Ids::SPLASH_POTION, 12)); self::register("fishing_rod", $factory->get(Ids::FISHING_ROD)); self::register("flint", $factory->get(Ids::FLINT)); self::register("flint_and_steel", $factory->get(Ids::FLINT_AND_STEEL)); @@ -546,14 +460,8 @@ final class VanillaItems{ self::register("green_bed", $factory->get(Ids::BED, 13)); self::register("green_dye", $factory->get(Ids::DYE, 2)); self::register("gunpowder", $factory->get(Ids::GUNPOWDER)); - self::register("harming_potion", $factory->get(Ids::POTION, 23)); - self::register("harming_splash_potion", $factory->get(Ids::SPLASH_POTION, 23)); - self::register("healing_potion", $factory->get(Ids::POTION, 21)); - self::register("healing_splash_potion", $factory->get(Ids::SPLASH_POTION, 21)); self::register("heart_of_the_sea", $factory->get(Ids::HEART_OF_THE_SEA)); self::register("ink_sac", $factory->get(Ids::DYE)); - self::register("invisibility_potion", $factory->get(Ids::POTION, 7)); - self::register("invisibility_splash_potion", $factory->get(Ids::SPLASH_POTION, 7)); self::register("iron_axe", $factory->get(Ids::IRON_AXE)); self::register("iron_boots", $factory->get(Ids::IRON_BOOTS)); self::register("iron_chestplate", $factory->get(Ids::IRON_CHESTPLATE)); @@ -569,8 +477,6 @@ final class VanillaItems{ self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN)); self::register("lapis_lazuli", $factory->get(Ids::DYE, 4)); self::register("lava_bucket", $factory->get(Ids::BUCKET, 10)); - self::register("leaping_potion", $factory->get(Ids::POTION, 9)); - self::register("leaping_splash_potion", $factory->get(Ids::SPLASH_POTION, 9)); self::register("leather", $factory->get(Ids::LEATHER)); self::register("leather_boots", $factory->get(Ids::LEATHER_BOOTS)); self::register("leather_cap", $factory->get(Ids::LEATHER_CAP)); @@ -582,34 +488,6 @@ final class VanillaItems{ self::register("light_gray_dye", $factory->get(Ids::DYE, 7)); self::register("lime_bed", $factory->get(Ids::BED, 5)); self::register("lime_dye", $factory->get(Ids::DYE, 10)); - self::register("long_fire_resistance_potion", $factory->get(Ids::POTION, 13)); - self::register("long_fire_resistance_splash_potion", $factory->get(Ids::SPLASH_POTION, 13)); - self::register("long_invisibility_potion", $factory->get(Ids::POTION, 8)); - self::register("long_invisibility_splash_potion", $factory->get(Ids::SPLASH_POTION, 8)); - self::register("long_leaping_potion", $factory->get(Ids::POTION, 10)); - self::register("long_leaping_splash_potion", $factory->get(Ids::SPLASH_POTION, 10)); - self::register("long_mundane_potion", $factory->get(Ids::POTION, 2)); - self::register("long_mundane_splash_potion", $factory->get(Ids::SPLASH_POTION, 2)); - self::register("long_night_vision_potion", $factory->get(Ids::POTION, 6)); - self::register("long_night_vision_splash_potion", $factory->get(Ids::SPLASH_POTION, 6)); - self::register("long_poison_potion", $factory->get(Ids::POTION, 26)); - self::register("long_poison_splash_potion", $factory->get(Ids::SPLASH_POTION, 26)); - self::register("long_regeneration_potion", $factory->get(Ids::POTION, 29)); - self::register("long_regeneration_splash_potion", $factory->get(Ids::SPLASH_POTION, 29)); - self::register("long_slow_falling_potion", $factory->get(Ids::POTION, 41)); - self::register("long_slow_falling_splash_potion", $factory->get(Ids::SPLASH_POTION, 41)); - self::register("long_slowness_potion", $factory->get(Ids::POTION, 18)); - self::register("long_slowness_splash_potion", $factory->get(Ids::SPLASH_POTION, 18)); - self::register("long_strength_potion", $factory->get(Ids::POTION, 32)); - self::register("long_strength_splash_potion", $factory->get(Ids::SPLASH_POTION, 32)); - self::register("long_swiftness_potion", $factory->get(Ids::POTION, 15)); - self::register("long_swiftness_splash_potion", $factory->get(Ids::SPLASH_POTION, 15)); - self::register("long_turtle_master_potion", $factory->get(Ids::POTION, 38)); - self::register("long_turtle_master_splash_potion", $factory->get(Ids::SPLASH_POTION, 38)); - self::register("long_water_breathing_potion", $factory->get(Ids::POTION, 20)); - self::register("long_water_breathing_splash_potion", $factory->get(Ids::SPLASH_POTION, 20)); - self::register("long_weakness_potion", $factory->get(Ids::POTION, 35)); - self::register("long_weakness_splash_potion", $factory->get(Ids::SPLASH_POTION, 35)); self::register("magenta_bed", $factory->get(Ids::BED, 2)); self::register("magenta_dye", $factory->get(Ids::DYE, 13)); self::register("magma_cream", $factory->get(Ids::MAGMA_CREAM)); @@ -617,15 +495,11 @@ final class VanillaItems{ self::register("melon_seeds", $factory->get(Ids::MELON_SEEDS)); self::register("milk_bucket", $factory->get(Ids::BUCKET, 1)); self::register("minecart", $factory->get(Ids::MINECART)); - self::register("mundane_potion", $factory->get(Ids::POTION, 1)); - self::register("mundane_splash_potion", $factory->get(Ids::SPLASH_POTION, 1)); self::register("mushroom_stew", $factory->get(Ids::MUSHROOM_STEW)); self::register("nautilus_shell", $factory->get(Ids::NAUTILUS_SHELL)); self::register("nether_brick", $factory->get(Ids::NETHERBRICK)); self::register("nether_quartz", $factory->get(Ids::NETHER_QUARTZ)); self::register("nether_star", $factory->get(Ids::NETHERSTAR)); - self::register("night_vision_potion", $factory->get(Ids::POTION, 5)); - self::register("night_vision_splash_potion", $factory->get(Ids::SPLASH_POTION, 5)); self::register("oak_boat", $factory->get(Ids::BOAT)); self::register("oak_sign", $factory->get(Ids::SIGN)); self::register("orange_bed", $factory->get(Ids::BED, 1)); @@ -635,11 +509,10 @@ final class VanillaItems{ self::register("pink_bed", $factory->get(Ids::BED, 6)); self::register("pink_dye", $factory->get(Ids::DYE, 9)); self::register("player_head", $factory->get(Ids::MOB_HEAD, 3)); - self::register("poison_potion", $factory->get(Ids::POTION, 25)); - self::register("poison_splash_potion", $factory->get(Ids::SPLASH_POTION, 25)); self::register("poisonous_potato", $factory->get(Ids::POISONOUS_POTATO)); self::register("popped_chorus_fruit", $factory->get(Ids::CHORUS_FRUIT_POPPED)); self::register("potato", $factory->get(Ids::POTATO)); + self::register("potion", $factory->get(Ids::POTION)); self::register("prismarine_crystals", $factory->get(Ids::PRISMARINE_CRYSTALS)); self::register("prismarine_shard", $factory->get(Ids::PRISMARINE_SHARD)); self::register("pufferfish", $factory->get(Ids::PUFFERFISH)); @@ -672,20 +545,15 @@ final class VanillaItems{ self::register("red_bed", $factory->get(Ids::BED, 14)); self::register("red_dye", $factory->get(Ids::DYE, 1)); self::register("redstone_dust", $factory->get(Ids::REDSTONE)); - self::register("regeneration_potion", $factory->get(Ids::POTION, 28)); - self::register("regeneration_splash_potion", $factory->get(Ids::SPLASH_POTION, 28)); self::register("rotten_flesh", $factory->get(Ids::ROTTEN_FLESH)); self::register("scute", $factory->get(Ids::TURTLE_SHELL_PIECE)); self::register("shears", $factory->get(Ids::SHEARS)); self::register("shulker_shell", $factory->get(Ids::SHULKER_SHELL)); self::register("skeleton_skull", $factory->get(Ids::MOB_HEAD)); self::register("slimeball", $factory->get(Ids::SLIMEBALL)); - self::register("slow_falling_potion", $factory->get(Ids::POTION, 40)); - self::register("slow_falling_splash_potion", $factory->get(Ids::SPLASH_POTION, 40)); - self::register("slowness_potion", $factory->get(Ids::POTION, 17)); - self::register("slowness_splash_potion", $factory->get(Ids::SPLASH_POTION, 17)); self::register("snowball", $factory->get(Ids::SNOWBALL)); self::register("spider_eye", $factory->get(Ids::SPIDER_EYE)); + self::register("splash_potion", $factory->get(Ids::SPLASH_POTION)); self::register("spruce_boat", $factory->get(Ids::BOAT, 1)); self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN)); self::register("squid_spawn_egg", $factory->get(Ids::SPAWN_EGG, 17)); @@ -696,49 +564,17 @@ final class VanillaItems{ self::register("stone_pickaxe", $factory->get(Ids::STONE_PICKAXE)); self::register("stone_shovel", $factory->get(Ids::STONE_SHOVEL)); self::register("stone_sword", $factory->get(Ids::STONE_SWORD)); - self::register("strength_potion", $factory->get(Ids::POTION, 31)); - self::register("strength_splash_potion", $factory->get(Ids::SPLASH_POTION, 31)); self::register("string", $factory->get(Ids::STRING)); - self::register("strong_harming_potion", $factory->get(Ids::POTION, 24)); - self::register("strong_harming_splash_potion", $factory->get(Ids::SPLASH_POTION, 24)); - self::register("strong_healing_potion", $factory->get(Ids::POTION, 22)); - self::register("strong_healing_splash_potion", $factory->get(Ids::SPLASH_POTION, 22)); - self::register("strong_leaping_potion", $factory->get(Ids::POTION, 11)); - self::register("strong_leaping_splash_potion", $factory->get(Ids::SPLASH_POTION, 11)); - self::register("strong_poison_potion", $factory->get(Ids::POTION, 27)); - self::register("strong_poison_splash_potion", $factory->get(Ids::SPLASH_POTION, 27)); - self::register("strong_regeneration_potion", $factory->get(Ids::POTION, 30)); - self::register("strong_regeneration_splash_potion", $factory->get(Ids::SPLASH_POTION, 30)); - self::register("strong_strength_potion", $factory->get(Ids::POTION, 33)); - self::register("strong_strength_splash_potion", $factory->get(Ids::SPLASH_POTION, 33)); - self::register("strong_swiftness_potion", $factory->get(Ids::POTION, 16)); - self::register("strong_swiftness_splash_potion", $factory->get(Ids::SPLASH_POTION, 16)); - self::register("strong_turtle_master_potion", $factory->get(Ids::POTION, 39)); - self::register("strong_turtle_master_splash_potion", $factory->get(Ids::SPLASH_POTION, 39)); self::register("sugar", $factory->get(Ids::SUGAR)); self::register("sweet_berries", $factory->get(Ids::SWEET_BERRIES)); - self::register("swiftness_potion", $factory->get(Ids::POTION, 14)); - self::register("swiftness_splash_potion", $factory->get(Ids::SPLASH_POTION, 14)); - self::register("thick_potion", $factory->get(Ids::POTION, 3)); - self::register("thick_splash_potion", $factory->get(Ids::SPLASH_POTION, 3)); self::register("totem", $factory->get(Ids::TOTEM)); - self::register("turtle_master_potion", $factory->get(Ids::POTION, 37)); - self::register("turtle_master_splash_potion", $factory->get(Ids::SPLASH_POTION, 37)); self::register("villager_spawn_egg", $factory->get(Ids::SPAWN_EGG, 15)); - self::register("water_breathing_potion", $factory->get(Ids::POTION, 19)); - self::register("water_breathing_splash_potion", $factory->get(Ids::SPLASH_POTION, 19)); self::register("water_bucket", $factory->get(Ids::BUCKET, 8)); - self::register("water_potion", $factory->get(Ids::POTION)); - self::register("water_splash_potion", $factory->get(Ids::SPLASH_POTION)); - self::register("weakness_potion", $factory->get(Ids::POTION, 34)); - self::register("weakness_splash_potion", $factory->get(Ids::SPLASH_POTION, 34)); self::register("wheat", $factory->get(Ids::WHEAT)); self::register("wheat_seeds", $factory->get(Ids::SEEDS)); self::register("white_bed", $factory->get(Ids::BED)); self::register("white_dye", $factory->get(Ids::DYE, 19)); - self::register("wither_potion", $factory->get(Ids::POTION, 36)); self::register("wither_skeleton_skull", $factory->get(Ids::MOB_HEAD, 1)); - self::register("wither_splash_potion", $factory->get(Ids::SPLASH_POTION, 36)); self::register("wooden_axe", $factory->get(Ids::WOODEN_AXE)); self::register("wooden_hoe", $factory->get(Ids::WOODEN_HOE)); self::register("wooden_pickaxe", $factory->get(Ids::WOODEN_PICKAXE)); From 56428e8a4e663ee1c412c9ac066cf85b394b90e1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 00:26:16 +0100 Subject: [PATCH 0187/1858] Make more item stuff dynamic --- src/data/bedrock/item/ItemDeserializer.php | 66 ++++++----------- src/data/bedrock/item/ItemSerializer.php | 79 +++++++-------------- src/item/Bed.php | 17 ++++- src/item/Dye.php | 23 +++++- src/item/ItemFactory.php | 15 ++-- src/item/Skull.php | 14 +++- src/item/StringToItemParser.php | 37 ++++------ src/item/VanillaItems.php | 82 ++-------------------- 8 files changed, 116 insertions(+), 217 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 37fbdad7b1..95db05d911 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -144,12 +144,12 @@ final class ItemDeserializer{ $this->map(Ids::BIRCH_BOAT, fn() => Items::BIRCH_BOAT()); $this->map(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()->asItem()); $this->map(Ids::BIRCH_SIGN, fn() => Blocks::BIRCH_SIGN()->asItem()); - $this->map(Ids::BLACK_DYE, fn() => Items::BLACK_DYE()); + $this->map(Ids::BLACK_DYE, fn() => Items::DYE()->setColor(DyeColor::BLACK())); $this->map(Ids::BLAZE_POWDER, fn() => Items::BLAZE_POWDER()); $this->map(Ids::BLAZE_ROD, fn() => Items::BLAZE_ROD()); //TODO: minecraft:blaze_spawn_egg $this->map(Ids::BLEACH, fn() => Items::BLEACH()); - $this->map(Ids::BLUE_DYE, fn() => Items::BLUE_DYE()); + $this->map(Ids::BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::BLUE())); $this->map(Ids::BOAT, function(Data $data) : Item{ try{ $treeType = TreeType::fromMagicNumber($data->getMeta()); @@ -175,7 +175,7 @@ final class ItemDeserializer{ $this->map(Ids::BREAD, fn() => Items::BREAD()); $this->map(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()->asItem()); $this->map(Ids::BRICK, fn() => Items::BRICK()); - $this->map(Ids::BROWN_DYE, fn() => Items::BROWN_DYE()); + $this->map(Ids::BROWN_DYE, fn() => Items::DYE()->setColor(DyeColor::BROWN())); $this->map(Ids::BUCKET, fn() => Items::BUCKET()); $this->map(Ids::CAKE, fn() => Blocks::CAKE()->asItem()); //TODO: minecraft:camera @@ -261,7 +261,7 @@ final class ItemDeserializer{ //TODO: minecraft:crimson_door //TODO: minecraft:crimson_sign //TODO: minecraft:crossbow - $this->map(Ids::CYAN_DYE, fn() => Items::CYAN_DYE()); + $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); $this->map(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()->asItem()); $this->map(Ids::DARK_OAK_SIGN, fn() => Blocks::DARK_OAK_SIGN()->asItem()); @@ -288,10 +288,10 @@ final class ItemDeserializer{ 3 => Items::COCOA_BEANS(), 4 => Items::LAPIS_LAZULI(), 15 => Items::BONE_MEAL(), - 16 => Items::BLACK_DYE(), - 17 => Items::BROWN_DYE(), - 18 => Items::BLUE_DYE(), - 19 => Items::WHITE_DYE(), + 16 => Items::DYE()->setColor(DyeColor::BLACK()), + 17 => Items::DYE()->setColor(DyeColor::BROWN()), + 18 => Items::DYE()->setColor(DyeColor::BLUE()), + 19 => Items::DYE()->setColor(DyeColor::WHITE()), default => null }; if($item !== null){ @@ -301,21 +301,7 @@ final class ItemDeserializer{ if($dyeColor === null){ throw new ItemTypeDeserializeException("Unknown dye meta $meta"); } - return match($dyeColor->id()){ - DyeColor::CYAN()->id() => Items::CYAN_DYE(), - DyeColor::GRAY()->id() => Items::GRAY_DYE(), - DyeColor::GREEN()->id() => Items::GREEN_DYE(), - DyeColor::LIGHT_BLUE()->id() => Items::LIGHT_BLUE_DYE(), - DyeColor::LIGHT_GRAY()->id() => Items::LIGHT_GRAY_DYE(), - DyeColor::LIME()->id() => Items::LIME_DYE(), - DyeColor::MAGENTA()->id() => Items::MAGENTA_DYE(), - DyeColor::ORANGE()->id() => Items::ORANGE_DYE(), - DyeColor::PINK()->id() => Items::PINK_DYE(), - DyeColor::PURPLE()->id() => Items::PURPLE_DYE(), - DyeColor::RED()->id() => Items::RED_DYE(), - DyeColor::YELLOW()->id() => Items::YELLOW_DYE(), - default => throw new AssumptionFailedError("Unhandled dye color " . $dyeColor->name()) - }; + return Items::DYE()->setColor($dyeColor); }); $this->map(Ids::EGG, fn() => Items::EGG()); //TODO: minecraft:elder_guardian_spawn_egg @@ -374,8 +360,8 @@ final class ItemDeserializer{ $this->map(Ids::GOLDEN_PICKAXE, fn() => Items::GOLDEN_PICKAXE()); $this->map(Ids::GOLDEN_SHOVEL, fn() => Items::GOLDEN_SHOVEL()); $this->map(Ids::GOLDEN_SWORD, fn() => Items::GOLDEN_SWORD()); - $this->map(Ids::GRAY_DYE, fn() => Items::GRAY_DYE()); - $this->map(Ids::GREEN_DYE, fn() => Items::GREEN_DYE()); + $this->map(Ids::GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::GRAY())); + $this->map(Ids::GREEN_DYE, fn() => Items::DYE()->setColor(DyeColor::GREEN())); //TODO: minecraft:guardian_spawn_egg $this->map(Ids::GUNPOWDER, fn() => Items::GUNPOWDER()); $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); @@ -414,13 +400,13 @@ final class ItemDeserializer{ $this->map(Ids::LEATHER_HELMET, fn() => Items::LEATHER_CAP()); //TODO: minecraft:leather_horse_armor $this->map(Ids::LEATHER_LEGGINGS, fn() => Items::LEATHER_PANTS()); - $this->map(Ids::LIGHT_BLUE_DYE, fn() => Items::LIGHT_BLUE_DYE()); - $this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::LIGHT_GRAY_DYE()); - $this->map(Ids::LIME_DYE, fn() => Items::LIME_DYE()); + $this->map(Ids::LIGHT_BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_BLUE())); + $this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_GRAY())); + $this->map(Ids::LIME_DYE, fn() => Items::DYE()->setColor(DyeColor::LIME())); //TODO: minecraft:lingering_potion //TODO: minecraft:llama_spawn_egg //TODO: minecraft:lodestone_compass - $this->map(Ids::MAGENTA_DYE, fn() => Items::MAGENTA_DYE()); + $this->map(Ids::MAGENTA_DYE, fn() => Items::DYE()->setColor(DyeColor::MAGENTA())); $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); //TODO: minecraft:magma_cube_spawn_egg //TODO: minecraft:medicine @@ -468,7 +454,7 @@ final class ItemDeserializer{ $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); $this->map(Ids::OAK_SIGN, fn() => Blocks::OAK_SIGN()->asItem()); //TODO: minecraft:ocelot_spawn_egg - $this->map(Ids::ORANGE_DYE, fn() => Items::ORANGE_DYE()); + $this->map(Ids::ORANGE_DYE, fn() => Items::DYE()->setColor(DyeColor::ORANGE())); $this->map(Ids::PAINTING, fn() => Items::PAINTING()); //TODO: minecraft:panda_spawn_egg $this->map(Ids::PAPER, fn() => Items::PAPER()); @@ -480,7 +466,7 @@ final class ItemDeserializer{ //TODO: minecraft:piglin_brute_spawn_egg //TODO: minecraft:piglin_spawn_egg //TODO: minecraft:pillager_spawn_egg - $this->map(Ids::PINK_DYE, fn() => Items::PINK_DYE()); + $this->map(Ids::PINK_DYE, fn() => Items::DYE()->setColor(DyeColor::PINK())); $this->map(Ids::POISONOUS_POTATO, fn() => Items::POISONOUS_POTATO()); //TODO: minecraft:polar_bear_spawn_egg $this->map(Ids::POPPED_CHORUS_FRUIT, fn() => Items::POPPED_CHORUS_FRUIT()); @@ -502,7 +488,7 @@ final class ItemDeserializer{ //TODO: minecraft:pufferfish_spawn_egg $this->map(Ids::PUMPKIN_PIE, fn() => Items::PUMPKIN_PIE()); $this->map(Ids::PUMPKIN_SEEDS, fn() => Items::PUMPKIN_SEEDS()); - $this->map(Ids::PURPLE_DYE, fn() => Items::PURPLE_DYE()); + $this->map(Ids::PURPLE_DYE, fn() => Items::DYE()->setColor(DyeColor::PURPLE())); $this->map(Ids::QUARTZ, fn() => Items::NETHER_QUARTZ()); $this->map(Ids::RABBIT, fn() => Items::RAW_RABBIT()); $this->map(Ids::RABBIT_FOOT, fn() => Items::RABBIT_FOOT()); @@ -514,7 +500,7 @@ final class ItemDeserializer{ //TODO: minecraft:raw_copper //TODO: minecraft:raw_gold //TODO: minecraft:raw_iron - $this->map(Ids::RED_DYE, fn() => Items::RED_DYE()); + $this->map(Ids::RED_DYE, fn() => Items::DYE()->setColor(DyeColor::RED())); $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); $this->map(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()->asItem()); $this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH()); @@ -538,15 +524,7 @@ final class ItemDeserializer{ }catch(\InvalidArgumentException $e){ throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); } - return match($skullType->id()) { - SkullType::SKELETON()->id() => Items::SKELETON_SKULL(), - SkullType::WITHER_SKELETON()->id() => Items::WITHER_SKELETON_SKULL(), - SkullType::ZOMBIE()->id() => Items::ZOMBIE_HEAD(), - SkullType::CREEPER()->id() => Items::CREEPER_HEAD(), - SkullType::PLAYER()->id() => Items::PLAYER_HEAD(), - SkullType::DRAGON()->id() => Items::DRAGON_HEAD(), - default => throw new ItemTypeDeserializeException("Unexpected skull type " . $skullType->getDisplayName()) - }; + return Items::MOB_HEAD()->setSkullType($skullType); }); //TODO: minecraft:skull_banner_pattern $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); @@ -608,7 +586,7 @@ final class ItemDeserializer{ $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); $this->map(Ids::WHEAT, fn() => Items::WHEAT()); $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); - $this->map(Ids::WHITE_DYE, fn() => Items::WHITE_DYE()); + $this->map(Ids::WHITE_DYE, fn() => Items::DYE()->setColor(DyeColor::WHITE())); //TODO: minecraft:witch_spawn_egg //TODO: minecraft:wither_skeleton_spawn_egg //TODO: minecraft:wolf_spawn_egg @@ -620,7 +598,7 @@ final class ItemDeserializer{ $this->map(Ids::WOODEN_SWORD, fn() => Items::WOODEN_SWORD()); $this->map(Ids::WRITABLE_BOOK, fn() => Items::WRITABLE_BOOK()); $this->map(Ids::WRITTEN_BOOK, fn() => Items::WRITTEN_BOOK()); - $this->map(Ids::YELLOW_DYE, fn() => Items::YELLOW_DYE()); + $this->map(Ids::YELLOW_DYE, fn() => Items::DYE()->setColor(DyeColor::YELLOW())); //TODO: minecraft:zoglin_spawn_egg //TODO: minecraft:zombie_horse_spawn_egg //TODO: minecraft:zombie_pigman_spawn_egg diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index e7f1601abe..eec454f5ae 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; -use pocketmine\block\utils\SkullType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; @@ -35,10 +34,13 @@ use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\item\Banner; +use pocketmine\item\Bed; use pocketmine\item\CoralFan; +use pocketmine\item\Dye; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\Potion; +use pocketmine\item\Skull; use pocketmine\item\SplashPotion; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; @@ -214,22 +216,6 @@ final class ItemSerializer{ return fn() => new Data($id); } - /** - * @phpstan-return \Closure() : Data - */ - private static function bed(DyeColor $color) : \Closure{ - $meta = DyeColorIdMap::getInstance()->toId($color); - return fn() => new Data(Ids::BED, $meta); - } - - /** - * @phpstan-return \Closure() : Data - */ - private static function skull(SkullType $skullType) : \Closure{ - $meta = $skullType->getMagicNumber(); - return fn() => new Data(Ids::SKULL, $meta); - } - /** * @phpstan-return \Closure() : Data */ @@ -270,18 +256,15 @@ final class ItemSerializer{ $this->map(Items::ARROW(), self::id(Ids::ARROW)); $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); + $this->map(Items::BED(), fn(Bed $item) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($item->getColor()))); $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); $this->map(Items::BIRCH_BOAT(), self::id(Ids::BIRCH_BOAT)); $this->map(Items::BIRCH_SIGN(), self::id(Ids::BIRCH_SIGN)); - $this->map(Items::BLACK_BED(), self::bed(DyeColor::BLACK())); - $this->map(Items::BLACK_DYE(), self::id(Ids::BLACK_DYE)); $this->map(Items::BLAZE_POWDER(), self::id(Ids::BLAZE_POWDER)); $this->map(Items::BLAZE_ROD(), self::id(Ids::BLAZE_ROD)); $this->map(Items::BLEACH(), self::id(Ids::BLEACH)); - $this->map(Items::BLUE_BED(), self::bed(DyeColor::BLUE())); - $this->map(Items::BLUE_DYE(), self::id(Ids::BLUE_DYE)); $this->map(Items::BONE(), self::id(Ids::BONE)); $this->map(Items::BONE_MEAL(), self::id(Ids::BONE_MEAL)); $this->map(Items::BOOK(), self::id(Ids::BOOK)); @@ -289,8 +272,6 @@ final class ItemSerializer{ $this->map(Items::BOWL(), self::id(Ids::BOWL)); $this->map(Items::BREAD(), self::id(Ids::BREAD)); $this->map(Items::BRICK(), self::id(Ids::BRICK)); - $this->map(Items::BROWN_BED(), self::bed(DyeColor::BROWN())); - $this->map(Items::BROWN_DYE(), self::id(Ids::BROWN_DYE)); $this->map(Items::BUCKET(), self::id(Ids::BUCKET)); $this->map(Items::CARROT(), self::id(Ids::CARROT)); $this->map(Items::CHAINMAIL_BOOTS(), self::id(Ids::CHAINMAIL_BOOTS)); @@ -350,9 +331,6 @@ final class ItemSerializer{ $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); - $this->map(Items::CREEPER_HEAD(), self::skull(SkullType::CREEPER())); - $this->map(Items::CYAN_BED(), self::bed(DyeColor::CYAN())); - $this->map(Items::CYAN_DYE(), self::id(Ids::CYAN_DYE)); $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); $this->map(Items::DIAMOND(), self::id(Ids::DIAMOND)); @@ -366,8 +344,26 @@ final class ItemSerializer{ $this->map(Items::DIAMOND_SHOVEL(), self::id(Ids::DIAMOND_SHOVEL)); $this->map(Items::DIAMOND_SWORD(), self::id(Ids::DIAMOND_SWORD)); $this->map(Items::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH)); - $this->map(Items::DRAGON_HEAD(), self::skull(SkullType::DRAGON())); $this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP)); + $this->map(Items::DYE(), fn(Dye $item) => new Data(match($item->getColor()){ + DyeColor::BLACK() => Ids::BLACK_DYE, + DyeColor::BLUE() => Ids::BLUE_DYE, + DyeColor::BROWN() => Ids::BROWN_DYE, + DyeColor::CYAN() => Ids::CYAN_DYE, + DyeColor::GRAY() => Ids::GRAY_DYE, + DyeColor::GREEN() => Ids::GREEN_DYE, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_DYE, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_DYE, + DyeColor::LIME() => Ids::LIME_DYE, + DyeColor::MAGENTA() => Ids::MAGENTA_DYE, + DyeColor::ORANGE() => Ids::ORANGE_DYE, + DyeColor::PINK() => Ids::PINK_DYE, + DyeColor::PURPLE() => Ids::PURPLE_DYE, + DyeColor::RED() => Ids::RED_DYE, + DyeColor::WHITE() => Ids::WHITE_DYE, + DyeColor::YELLOW() => Ids::YELLOW_DYE, + default => throw new AssumptionFailedError("Unhandled dye color " . $item->getColor()->name()), + })); $this->map(Items::EGG(), self::id(Ids::EGG)); $this->map(Items::EMERALD(), self::id(Ids::EMERALD)); $this->map(Items::ENCHANTED_GOLDEN_APPLE(), self::id(Ids::ENCHANTED_GOLDEN_APPLE)); @@ -395,10 +391,6 @@ final class ItemSerializer{ $this->map(Items::GOLDEN_SWORD(), self::id(Ids::GOLDEN_SWORD)); $this->map(Items::GOLD_INGOT(), self::id(Ids::GOLD_INGOT)); $this->map(Items::GOLD_NUGGET(), self::id(Ids::GOLD_NUGGET)); - $this->map(Items::GRAY_BED(), self::bed(DyeColor::GRAY())); - $this->map(Items::GRAY_DYE(), self::id(Ids::GRAY_DYE)); - $this->map(Items::GREEN_BED(), self::bed(DyeColor::GREEN())); - $this->map(Items::GREEN_DYE(), self::id(Ids::GREEN_DYE)); $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); @@ -422,19 +414,12 @@ final class ItemSerializer{ $this->map(Items::LEATHER_CAP(), self::id(Ids::LEATHER_HELMET)); $this->map(Items::LEATHER_PANTS(), self::id(Ids::LEATHER_LEGGINGS)); $this->map(Items::LEATHER_TUNIC(), self::id(Ids::LEATHER_CHESTPLATE)); - $this->map(Items::LIGHT_BLUE_BED(), self::bed(DyeColor::LIGHT_BLUE())); - $this->map(Items::LIGHT_BLUE_DYE(), self::id(Ids::LIGHT_BLUE_DYE)); - $this->map(Items::LIGHT_GRAY_BED(), self::bed(DyeColor::LIGHT_GRAY())); - $this->map(Items::LIGHT_GRAY_DYE(), self::id(Ids::LIGHT_GRAY_DYE)); - $this->map(Items::LIME_BED(), self::bed(DyeColor::LIME())); - $this->map(Items::LIME_DYE(), self::id(Ids::LIME_DYE)); - $this->map(Items::MAGENTA_BED(), self::bed(DyeColor::MAGENTA())); - $this->map(Items::MAGENTA_DYE(), self::id(Ids::MAGENTA_DYE)); $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); $this->map(Items::MELON(), self::id(Ids::MELON_SLICE)); $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); $this->map(Items::MINECART(), self::id(Ids::MINECART)); + $this->map(Items::MOB_HEAD(), fn(Skull $item) => new Data(Ids::SKULL, $item->getSkullType()->getMagicNumber())); $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); @@ -442,13 +427,8 @@ final class ItemSerializer{ $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); $this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT)); $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); - $this->map(Items::ORANGE_BED(), self::bed(DyeColor::ORANGE())); - $this->map(Items::ORANGE_DYE(), self::id(Ids::ORANGE_DYE)); $this->map(Items::PAINTING(), self::id(Ids::PAINTING)); $this->map(Items::PAPER(), self::id(Ids::PAPER)); - $this->map(Items::PINK_BED(), self::bed(DyeColor::PINK())); - $this->map(Items::PINK_DYE(), self::id(Ids::PINK_DYE)); - $this->map(Items::PLAYER_HEAD(), self::skull(SkullType::PLAYER())); $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); $this->map(Items::POTATO(), self::id(Ids::POTATO)); @@ -458,8 +438,6 @@ final class ItemSerializer{ $this->map(Items::PUFFERFISH(), self::id(Ids::PUFFERFISH)); $this->map(Items::PUMPKIN_PIE(), self::id(Ids::PUMPKIN_PIE)); $this->map(Items::PUMPKIN_SEEDS(), self::id(Ids::PUMPKIN_SEEDS)); - $this->map(Items::PURPLE_BED(), self::bed(DyeColor::PURPLE())); - $this->map(Items::PURPLE_DYE(), self::id(Ids::PURPLE_DYE)); $this->map(Items::RABBIT_FOOT(), self::id(Ids::RABBIT_FOOT)); $this->map(Items::RABBIT_HIDE(), self::id(Ids::RABBIT_HIDE)); $this->map(Items::RABBIT_STEW(), self::id(Ids::RABBIT_STEW)); @@ -483,13 +461,10 @@ final class ItemSerializer{ $this->map(Items::RECORD_WAIT(), self::id(Ids::MUSIC_DISC_WAIT)); $this->map(Items::RECORD_WARD(), self::id(Ids::MUSIC_DISC_WARD)); $this->map(Items::REDSTONE_DUST(), self::id(Ids::REDSTONE)); - $this->map(Items::RED_BED(), self::bed(DyeColor::RED())); - $this->map(Items::RED_DYE(), self::id(Ids::RED_DYE)); $this->map(Items::ROTTEN_FLESH(), self::id(Ids::ROTTEN_FLESH)); $this->map(Items::SCUTE(), self::id(Ids::SCUTE)); $this->map(Items::SHEARS(), self::id(Ids::SHEARS)); $this->map(Items::SHULKER_SHELL(), self::id(Ids::SHULKER_SHELL)); - $this->map(Items::SKELETON_SKULL(), self::skull(SkullType::SKELETON())); $this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL)); $this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL)); $this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE)); @@ -512,9 +487,6 @@ final class ItemSerializer{ $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); - $this->map(Items::WHITE_BED(), self::bed(DyeColor::WHITE())); - $this->map(Items::WHITE_DYE(), self::id(Ids::WHITE_DYE)); - $this->map(Items::WITHER_SKELETON_SKULL(), self::skull(SkullType::WITHER_SKELETON())); $this->map(Items::WOODEN_AXE(), self::id(Ids::WOODEN_AXE)); $this->map(Items::WOODEN_HOE(), self::id(Ids::WOODEN_HOE)); $this->map(Items::WOODEN_PICKAXE(), self::id(Ids::WOODEN_PICKAXE)); @@ -522,9 +494,6 @@ final class ItemSerializer{ $this->map(Items::WOODEN_SWORD(), self::id(Ids::WOODEN_SWORD)); $this->map(Items::WRITABLE_BOOK(), self::id(Ids::WRITABLE_BOOK)); $this->map(Items::WRITTEN_BOOK(), self::id(Ids::WRITTEN_BOOK)); - $this->map(Items::YELLOW_BED(), self::bed(DyeColor::YELLOW())); - $this->map(Items::YELLOW_DYE(), self::id(Ids::YELLOW_DYE)); - $this->map(Items::ZOMBIE_HEAD(), self::skull(SkullType::ZOMBIE())); $this->map(Items::ZOMBIE_SPAWN_EGG(), self::id(Ids::ZOMBIE_SPAWN_EGG)); } } diff --git a/src/item/Bed.php b/src/item/Bed.php index b0a14d366e..d2dca80cf1 100644 --- a/src/item/Bed.php +++ b/src/item/Bed.php @@ -26,19 +26,32 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; +use pocketmine\data\bedrock\DyeColorIdMap; class Bed extends Item{ private DyeColor $color; - public function __construct(ItemIdentifier $identifier, string $name, DyeColor $color){ + public function __construct(ItemIdentifier $identifier, string $name){ + $this->color = DyeColor::WHITE(); parent::__construct($identifier, $name); - $this->color = $color; + } + + public function getMeta() : int{ + return DyeColorIdMap::getInstance()->toId($this->color); } public function getColor() : DyeColor{ return $this->color; } + /** + * @return $this + */ + public function setColor(DyeColor $color) : self{ + $this->color = $color; + return $this; + } + public function getBlock(?int $clickedFace = null) : Block{ return VanillaBlocks::BED()->setColor($this->color); } diff --git a/src/item/Dye.php b/src/item/Dye.php index 5ef8667161..9c831b13af 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -24,16 +24,35 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\DyeColor; +use pocketmine\data\bedrock\DyeColorIdMap; class Dye extends Item{ private DyeColor $color; - public function __construct(ItemIdentifier $identifier, string $name, DyeColor $color){ + public function __construct(ItemIdentifier $identifier, string $name){ + $this->color = DyeColor::BLACK(); parent::__construct($identifier, $name); - $this->color = $color; + } + + public function getMeta() : int{ + return match($this->color->id()){ + DyeColor::BLACK()->id() => 16, + DyeColor::BROWN()->id() => 17, + DyeColor::BLUE()->id() => 18, + DyeColor::WHITE()->id() => 19, + default => DyeColorIdMap::getInstance()->toInvertedId($this->color) + }; } public function getColor() : DyeColor{ return $this->color; } + + /** + * @return $this + */ + public function setColor(DyeColor $color) : self{ + $this->color = $color; + return $this; + } } diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index e4eb558ac9..fc4a7291ec 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -33,7 +33,6 @@ 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; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; @@ -267,21 +266,15 @@ class ItemFactory{ $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, 0), "Written Book")); foreach(SkullType::getAll() as $skullType){ - $this->register(new Skull(new IID(Ids::SKULL, $skullType->getMagicNumber()), $skullType->getDisplayName(), $skullType)); + $this->register((new Skull(new IID(Ids::SKULL, 0), "Mob Head"))->setSkullType($skullType)); } - $dyeMap = [ - DyeColor::BLACK()->id() => 16, - DyeColor::BROWN()->id() => 17, - DyeColor::BLUE()->id() => 18, - DyeColor::WHITE()->id() => 19 - ]; - $colorIdMap = DyeColorIdMap::getInstance(); foreach(DyeColor::getAll() as $color){ //TODO: use colour object directly //TODO: add interface to dye-colour objects - $this->register(new Dye(new IID(Ids::DYE, $dyeMap[$color->id()] ?? $colorIdMap->toInvertedId($color)), $color->getDisplayName() . " Dye", $color)); - $this->register(new Bed(new IID(Ids::BED, $colorIdMap->toId($color)), $color->getDisplayName() . " Bed", $color)); + //1000 isn't the real variant for dye, but it needs to not conflict with INK_SAC + $this->register((new Dye(new IID(Ids::DYE, 1000), "Dye"))->setColor($color)); + $this->register((new Bed(new IID(Ids::BED, 0), "Bed"))->setColor($color)); $this->register((new Banner( new IID(Ids::BANNER, 0), Blocks::BANNER(), diff --git a/src/item/Skull.php b/src/item/Skull.php index 92205e228d..c95746515a 100644 --- a/src/item/Skull.php +++ b/src/item/Skull.php @@ -30,9 +30,13 @@ use pocketmine\block\VanillaBlocks; class Skull extends Item{ private SkullType $skullType; - public function __construct(ItemIdentifier $identifier, string $name, SkullType $skullType){ + public function __construct(ItemIdentifier $identifier, string $name){ + $this->skullType = SkullType::SKELETON(); parent::__construct($identifier, $name); - $this->skullType = $skullType; + } + + public function getMeta() : int{ + return $this->skullType->getMagicNumber(); } public function getBlock(?int $clickedFace = null) : Block{ @@ -44,4 +48,10 @@ class Skull extends Item{ public function getSkullType() : SkullType{ return $this->skullType; } + + /** @return $this */ + public function setSkullType(SkullType $skullType) : self{ + $this->skullType = $skullType; + return $this; + } } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a6824ccd7f..7e69ebe390 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -26,6 +26,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\item\VanillaItems as Items; @@ -58,6 +59,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock($prefix("stained_hardened_glass_pane"), fn() => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)); $result->registerBlock($prefix("wool"), fn() => Blocks::WOOL()->setColor($color)); $result->registerBlock($prefix("shulker_box"), fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); + + $result->register($prefix("dye"), fn() => Items::DYE()->setColor($color)); } foreach(CoralType::getAll() as $coralType){ $prefix = fn(string $name) => $coralType->name() . "_" . $name; @@ -954,18 +957,16 @@ final class StringToItemParser extends StringToTParser{ $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD())); $result->register("baked_potato", fn() => Items::BAKED_POTATO()); $result->register("baked_potatoes", fn() => Items::BAKED_POTATO()); - $result->register("bed", fn() => Items::WHITE_BED()); + $result->register("bed", fn() => Items::BED()); $result->register("beef", fn() => Items::RAW_BEEF()); $result->register("beetroot", fn() => Items::BEETROOT()); $result->register("beetroot_seed", fn() => Items::BEETROOT_SEEDS()); $result->register("beetroot_seeds", fn() => Items::BEETROOT_SEEDS()); $result->register("beetroot_soup", fn() => Items::BEETROOT_SOUP()); $result->register("birch_boat", fn() => Items::BIRCH_BOAT()); - $result->register("black_dye", fn() => Items::BLACK_DYE()); $result->register("blaze_powder", fn() => Items::BLAZE_POWDER()); $result->register("blaze_rod", fn() => Items::BLAZE_ROD()); $result->register("bleach", fn() => Items::BLEACH()); - $result->register("blue_dye", fn() => Items::BLUE_DYE()); $result->register("boat", fn() => Items::OAK_BOAT()); $result->register("bone", fn() => Items::BONE()); $result->register("bone_meal", fn() => Items::BONE_MEAL()); @@ -975,7 +976,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("bowl", fn() => Items::BOWL()); $result->register("bread", fn() => Items::BREAD()); $result->register("brick", fn() => Items::BRICK()); - $result->register("brown_dye", fn() => Items::BROWN_DYE()); $result->register("bucket", fn() => Items::BUCKET()); $result->register("carrot", fn() => Items::CARROT()); $result->register("chain_boots", fn() => Items::CHAINMAIL_BOOTS()); @@ -1047,8 +1047,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("cooked_rabbit", fn() => Items::COOKED_RABBIT()); $result->register("cooked_salmon", fn() => Items::COOKED_SALMON()); $result->register("cookie", fn() => Items::COOKIE()); - $result->register("creeper_head", fn() => Items::CREEPER_HEAD()); - $result->register("cyan_dye", fn() => Items::CYAN_DYE()); + $result->register("creeper_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::CREEPER())); $result->register("dark_oak_boat", fn() => Items::DARK_OAK_BOAT()); $result->register("diamond", fn() => Items::DIAMOND()); $result->register("diamond_axe", fn() => Items::DIAMOND_AXE()); @@ -1061,7 +1060,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("diamond_shovel", fn() => Items::DIAMOND_SHOVEL()); $result->register("diamond_sword", fn() => Items::DIAMOND_SWORD()); $result->register("dragon_breath", fn() => Items::DRAGON_BREATH()); - $result->register("dragon_head", fn() => Items::DRAGON_HEAD()); + $result->register("dragon_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::DRAGON())); $result->register("dried_kelp", fn() => Items::DRIED_KELP()); $result->register("dye", fn() => Items::INK_SAC()); $result->register("egg", fn() => Items::EGG()); @@ -1106,8 +1105,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("golden_pickaxe", fn() => Items::GOLDEN_PICKAXE()); $result->register("golden_shovel", fn() => Items::GOLDEN_SHOVEL()); $result->register("golden_sword", fn() => Items::GOLDEN_SWORD()); - $result->register("gray_dye", fn() => Items::GRAY_DYE()); - $result->register("green_dye", fn() => Items::GREEN_DYE()); $result->register("gunpowder", fn() => Items::GUNPOWDER()); $result->register("harming_potion", fn() => Items::POTION()->setType(PotionType::HARMING())); $result->register("harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HARMING())); @@ -1141,9 +1138,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("leather_leggings", fn() => Items::LEATHER_PANTS()); $result->register("leather_pants", fn() => Items::LEATHER_PANTS()); $result->register("leather_tunic", fn() => Items::LEATHER_TUNIC()); - $result->register("light_blue_dye", fn() => Items::LIGHT_BLUE_DYE()); - $result->register("light_gray_dye", fn() => Items::LIGHT_GRAY_DYE()); - $result->register("lime_dye", fn() => Items::LIME_DYE()); $result->register("long_fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); $result->register("long_fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); $result->register("long_invisibility_potion", fn() => Items::POTION()->setType(PotionType::LONG_INVISIBILITY())); @@ -1172,14 +1166,13 @@ final class StringToItemParser extends StringToTParser{ $result->register("long_water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WATER_BREATHING())); $result->register("long_weakness_potion", fn() => Items::POTION()->setType(PotionType::LONG_WEAKNESS())); $result->register("long_weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WEAKNESS())); - $result->register("magenta_dye", fn() => Items::MAGENTA_DYE()); $result->register("magma_cream", fn() => Items::MAGMA_CREAM()); $result->register("melon", fn() => Items::MELON()); $result->register("melon_seeds", fn() => Items::MELON_SEEDS()); $result->register("melon_slice", fn() => Items::MELON()); $result->register("milk_bucket", fn() => Items::MILK_BUCKET()); $result->register("minecart", fn() => Items::MINECART()); - $result->register("mob_head", fn() => Items::SKELETON_SKULL()); + $result->register("mob_head", fn() => Items::MOB_HEAD()); $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE())); $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE())); $result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW()); @@ -1197,11 +1190,9 @@ final class StringToItemParser extends StringToTParser{ $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION())); $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION())); $result->register("oak_boat", fn() => Items::OAK_BOAT()); - $result->register("orange_dye", fn() => Items::ORANGE_DYE()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); - $result->register("pink_dye", fn() => Items::PINK_DYE()); - $result->register("player_head", fn() => Items::PLAYER_HEAD()); + $result->register("player_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::PLAYER())); $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON())); $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON())); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); @@ -1215,7 +1206,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("pufferfish", fn() => Items::PUFFERFISH()); $result->register("pumpkin_pie", fn() => Items::PUMPKIN_PIE()); $result->register("pumpkin_seeds", fn() => Items::PUMPKIN_SEEDS()); - $result->register("purple_dye", fn() => Items::PURPLE_DYE()); $result->register("quartz", fn() => Items::NETHER_QUARTZ()); $result->register("rabbit", fn() => Items::RAW_RABBIT()); $result->register("rabbit_foot", fn() => Items::RABBIT_FOOT()); @@ -1241,7 +1231,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("record_strad", fn() => Items::RECORD_STRAD()); $result->register("record_wait", fn() => Items::RECORD_WAIT()); $result->register("record_ward", fn() => Items::RECORD_WARD()); - $result->register("red_dye", fn() => Items::RED_DYE()); $result->register("redstone", fn() => Items::REDSTONE_DUST()); $result->register("redstone_dust", fn() => Items::REDSTONE_DUST()); $result->register("regeneration_potion", fn() => Items::POTION()->setType(PotionType::REGENERATION())); @@ -1252,8 +1241,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("seeds", fn() => Items::WHEAT_SEEDS()); $result->register("shears", fn() => Items::SHEARS()); $result->register("shulker_shell", fn() => Items::SHULKER_SHELL()); - $result->register("skeleton_skull", fn() => Items::SKELETON_SKULL()); - $result->register("skull", fn() => Items::SKELETON_SKULL()); + $result->register("skeleton_skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::SKELETON())); + $result->register("skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::SKELETON())); $result->register("slime_ball", fn() => Items::SLIMEBALL()); $result->register("slimeball", fn() => Items::SLIMEBALL()); $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING())); @@ -1313,9 +1302,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WEAKNESS())); $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); - $result->register("white_dye", fn() => Items::WHITE_DYE()); $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER())); - $result->register("wither_skeleton_skull", fn() => Items::WITHER_SKELETON_SKULL()); + $result->register("wither_skeleton_skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::WITHER_SKELETON())); $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER())); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); @@ -1324,8 +1312,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("wooden_sword", fn() => Items::WOODEN_SWORD()); $result->register("writable_book", fn() => Items::WRITABLE_BOOK()); $result->register("written_book", fn() => Items::WRITTEN_BOOK()); - $result->register("yellow_dye", fn() => Items::YELLOW_DYE()); - $result->register("zombie_head", fn() => Items::ZOMBIE_HEAD()); + $result->register("zombie_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); $result->register("zombie_spawn_egg", fn() => Items::ZOMBIE_SPAWN_EGG()); return $result; diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index f220e512bd..955de8a619 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -40,18 +40,15 @@ use pocketmine\utils\CloningRegistryTrait; * @method static BakedPotato BAKED_POTATO() * @method static Bamboo BAMBOO() * @method static Banner BANNER() + * @method static Bed BED() * @method static Beetroot BEETROOT() * @method static BeetrootSeeds BEETROOT_SEEDS() * @method static BeetrootSoup BEETROOT_SOUP() * @method static Boat BIRCH_BOAT() * @method static ItemBlockWallOrFloor BIRCH_SIGN() - * @method static Bed BLACK_BED() - * @method static Dye BLACK_DYE() * @method static Item BLAZE_POWDER() * @method static BlazeRod BLAZE_ROD() * @method static Item BLEACH() - * @method static Bed BLUE_BED() - * @method static Dye BLUE_DYE() * @method static Item BONE() * @method static Fertilizer BONE_MEAL() * @method static Book BOOK() @@ -59,8 +56,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Bowl BOWL() * @method static Bread BREAD() * @method static Item BRICK() - * @method static Bed BROWN_BED() - * @method static Dye BROWN_DYE() * @method static Bucket BUCKET() * @method static Carrot CARROT() * @method static Armor CHAINMAIL_BOOTS() @@ -121,9 +116,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CookedSalmon COOKED_SALMON() * @method static Cookie COOKIE() * @method static CoralFan CORAL_FAN() - * @method static Skull CREEPER_HEAD() - * @method static Bed CYAN_BED() - * @method static Dye CYAN_DYE() * @method static Boat DARK_OAK_BOAT() * @method static ItemBlockWallOrFloor DARK_OAK_SIGN() * @method static Item DIAMOND() @@ -137,8 +129,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Shovel DIAMOND_SHOVEL() * @method static Sword DIAMOND_SWORD() * @method static Item DRAGON_BREATH() - * @method static Skull DRAGON_HEAD() * @method static DriedKelp DRIED_KELP() + * @method static Dye DYE() * @method static Egg EGG() * @method static Item EMERALD() * @method static GoldenAppleEnchanted ENCHANTED_GOLDEN_APPLE() @@ -166,10 +158,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Sword GOLDEN_SWORD() * @method static Item GOLD_INGOT() * @method static Item GOLD_NUGGET() - * @method static Bed GRAY_BED() - * @method static Dye GRAY_DYE() - * @method static Bed GREEN_BED() - * @method static Dye GREEN_DYE() * @method static Item GUNPOWDER() * @method static Item HEART_OF_THE_SEA() * @method static Item INK_SAC() @@ -193,19 +181,12 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Armor LEATHER_CAP() * @method static Armor LEATHER_PANTS() * @method static Armor LEATHER_TUNIC() - * @method static Bed LIGHT_BLUE_BED() - * @method static Dye LIGHT_BLUE_DYE() - * @method static Bed LIGHT_GRAY_BED() - * @method static Dye LIGHT_GRAY_DYE() - * @method static Bed LIME_BED() - * @method static Dye LIME_DYE() - * @method static Bed MAGENTA_BED() - * @method static Dye MAGENTA_DYE() * @method static Item MAGMA_CREAM() * @method static Melon MELON() * @method static MelonSeeds MELON_SEEDS() * @method static MilkBucket MILK_BUCKET() * @method static Minecart MINECART() + * @method static Skull MOB_HEAD() * @method static MushroomStew MUSHROOM_STEW() * @method static Item NAUTILUS_SHELL() * @method static Item NETHER_BRICK() @@ -213,13 +194,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Item NETHER_STAR() * @method static Boat OAK_BOAT() * @method static ItemBlockWallOrFloor OAK_SIGN() - * @method static Bed ORANGE_BED() - * @method static Dye ORANGE_DYE() * @method static PaintingItem PAINTING() * @method static Item PAPER() - * @method static Bed PINK_BED() - * @method static Dye PINK_DYE() - * @method static Skull PLAYER_HEAD() * @method static PoisonousPotato POISONOUS_POTATO() * @method static Item POPPED_CHORUS_FRUIT() * @method static Potato POTATO() @@ -229,8 +205,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Pufferfish PUFFERFISH() * @method static PumpkinPie PUMPKIN_PIE() * @method static PumpkinSeeds PUMPKIN_SEEDS() - * @method static Bed PURPLE_BED() - * @method static Dye PURPLE_DYE() * @method static Item RABBIT_FOOT() * @method static Item RABBIT_HIDE() * @method static RabbitStew RABBIT_STEW() @@ -254,13 +228,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Record RECORD_WAIT() * @method static Record RECORD_WARD() * @method static Redstone REDSTONE_DUST() - * @method static Bed RED_BED() - * @method static Dye RED_DYE() * @method static RottenFlesh ROTTEN_FLESH() * @method static Item SCUTE() * @method static Shears SHEARS() * @method static Item SHULKER_SHELL() - * @method static Skull SKELETON_SKULL() * @method static Item SLIMEBALL() * @method static Snowball SNOWBALL() * @method static SpiderEye SPIDER_EYE() @@ -283,9 +254,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static LiquidBucket WATER_BUCKET() * @method static Item WHEAT() * @method static WheatSeeds WHEAT_SEEDS() - * @method static Bed WHITE_BED() - * @method static Dye WHITE_DYE() - * @method static Skull WITHER_SKELETON_SKULL() * @method static Axe WOODEN_AXE() * @method static Hoe WOODEN_HOE() * @method static Pickaxe WOODEN_PICKAXE() @@ -293,9 +261,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Sword WOODEN_SWORD() * @method static WritableBook WRITABLE_BOOK() * @method static WrittenBook WRITTEN_BOOK() - * @method static Bed YELLOW_BED() - * @method static Dye YELLOW_DYE() - * @method static Skull ZOMBIE_HEAD() * @method static SpawnEgg ZOMBIE_SPAWN_EGG() */ final class VanillaItems{ @@ -329,18 +294,15 @@ final class VanillaItems{ self::register("baked_potato", $factory->get(Ids::BAKED_POTATO)); self::register("bamboo", $factory->get(Ids::BAMBOO)); self::register("banner", $factory->get(Ids::BANNER)); + self::register("bed", $factory->get(Ids::BED)); self::register("beetroot", $factory->get(Ids::BEETROOT)); self::register("beetroot_seeds", $factory->get(Ids::BEETROOT_SEEDS)); self::register("beetroot_soup", $factory->get(Ids::BEETROOT_SOUP)); self::register("birch_boat", $factory->get(Ids::BOAT, 2)); self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN)); - self::register("black_bed", $factory->get(Ids::BED, 15)); - self::register("black_dye", $factory->get(Ids::DYE, 16)); self::register("blaze_powder", $factory->get(Ids::BLAZE_POWDER)); self::register("blaze_rod", $factory->get(Ids::BLAZE_ROD)); self::register("bleach", $factory->get(Ids::BLEACH)); - self::register("blue_bed", $factory->get(Ids::BED, 11)); - self::register("blue_dye", $factory->get(Ids::DYE, 18)); self::register("bone", $factory->get(Ids::BONE)); self::register("bone_meal", $factory->get(Ids::DYE, 15)); self::register("book", $factory->get(Ids::BOOK)); @@ -348,8 +310,6 @@ final class VanillaItems{ self::register("bowl", $factory->get(Ids::BOWL)); self::register("bread", $factory->get(Ids::BREAD)); self::register("brick", $factory->get(Ids::BRICK)); - self::register("brown_bed", $factory->get(Ids::BED, 12)); - self::register("brown_dye", $factory->get(Ids::DYE, 17)); self::register("bucket", $factory->get(Ids::BUCKET)); self::register("carrot", $factory->get(Ids::CARROT)); self::register("chainmail_boots", $factory->get(Ids::CHAINMAIL_BOOTS)); @@ -410,9 +370,6 @@ final class VanillaItems{ self::register("cooked_salmon", $factory->get(Ids::COOKED_SALMON)); self::register("cookie", $factory->get(Ids::COOKIE)); self::register("coral_fan", $factory->get(Ids::CORAL_FAN)); - self::register("creeper_head", $factory->get(Ids::MOB_HEAD, 4)); - self::register("cyan_bed", $factory->get(Ids::BED, 9)); - self::register("cyan_dye", $factory->get(Ids::DYE, 6)); self::register("dark_oak_boat", $factory->get(Ids::BOAT, 5)); self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_SIGN)); self::register("diamond", $factory->get(Ids::DIAMOND)); @@ -426,8 +383,8 @@ final class VanillaItems{ self::register("diamond_shovel", $factory->get(Ids::DIAMOND_SHOVEL)); self::register("diamond_sword", $factory->get(Ids::DIAMOND_SWORD)); self::register("dragon_breath", $factory->get(Ids::DRAGON_BREATH)); - self::register("dragon_head", $factory->get(Ids::MOB_HEAD, 5)); self::register("dried_kelp", $factory->get(Ids::DRIED_KELP)); + self::register("dye", $factory->get(Ids::DYE, 1)); self::register("egg", $factory->get(Ids::EGG)); self::register("emerald", $factory->get(Ids::EMERALD)); self::register("enchanted_golden_apple", $factory->get(Ids::APPLEENCHANTED)); @@ -455,10 +412,6 @@ final class VanillaItems{ self::register("golden_pickaxe", $factory->get(Ids::GOLDEN_PICKAXE)); self::register("golden_shovel", $factory->get(Ids::GOLDEN_SHOVEL)); self::register("golden_sword", $factory->get(Ids::GOLDEN_SWORD)); - self::register("gray_bed", $factory->get(Ids::BED, 7)); - self::register("gray_dye", $factory->get(Ids::DYE, 8)); - self::register("green_bed", $factory->get(Ids::BED, 13)); - self::register("green_dye", $factory->get(Ids::DYE, 2)); self::register("gunpowder", $factory->get(Ids::GUNPOWDER)); self::register("heart_of_the_sea", $factory->get(Ids::HEART_OF_THE_SEA)); self::register("ink_sac", $factory->get(Ids::DYE)); @@ -482,19 +435,12 @@ final class VanillaItems{ self::register("leather_cap", $factory->get(Ids::LEATHER_CAP)); self::register("leather_pants", $factory->get(Ids::LEATHER_LEGGINGS)); self::register("leather_tunic", $factory->get(Ids::LEATHER_CHESTPLATE)); - self::register("light_blue_bed", $factory->get(Ids::BED, 3)); - self::register("light_blue_dye", $factory->get(Ids::DYE, 12)); - self::register("light_gray_bed", $factory->get(Ids::BED, 8)); - self::register("light_gray_dye", $factory->get(Ids::DYE, 7)); - self::register("lime_bed", $factory->get(Ids::BED, 5)); - self::register("lime_dye", $factory->get(Ids::DYE, 10)); - self::register("magenta_bed", $factory->get(Ids::BED, 2)); - self::register("magenta_dye", $factory->get(Ids::DYE, 13)); self::register("magma_cream", $factory->get(Ids::MAGMA_CREAM)); self::register("melon", $factory->get(Ids::MELON)); self::register("melon_seeds", $factory->get(Ids::MELON_SEEDS)); self::register("milk_bucket", $factory->get(Ids::BUCKET, 1)); self::register("minecart", $factory->get(Ids::MINECART)); + self::register("mob_head", $factory->get(Ids::MOB_HEAD)); self::register("mushroom_stew", $factory->get(Ids::MUSHROOM_STEW)); self::register("nautilus_shell", $factory->get(Ids::NAUTILUS_SHELL)); self::register("nether_brick", $factory->get(Ids::NETHERBRICK)); @@ -502,13 +448,8 @@ final class VanillaItems{ self::register("nether_star", $factory->get(Ids::NETHERSTAR)); self::register("oak_boat", $factory->get(Ids::BOAT)); self::register("oak_sign", $factory->get(Ids::SIGN)); - self::register("orange_bed", $factory->get(Ids::BED, 1)); - self::register("orange_dye", $factory->get(Ids::DYE, 14)); self::register("painting", $factory->get(Ids::PAINTING)); self::register("paper", $factory->get(Ids::PAPER)); - self::register("pink_bed", $factory->get(Ids::BED, 6)); - self::register("pink_dye", $factory->get(Ids::DYE, 9)); - self::register("player_head", $factory->get(Ids::MOB_HEAD, 3)); self::register("poisonous_potato", $factory->get(Ids::POISONOUS_POTATO)); self::register("popped_chorus_fruit", $factory->get(Ids::CHORUS_FRUIT_POPPED)); self::register("potato", $factory->get(Ids::POTATO)); @@ -518,8 +459,6 @@ final class VanillaItems{ self::register("pufferfish", $factory->get(Ids::PUFFERFISH)); self::register("pumpkin_pie", $factory->get(Ids::PUMPKIN_PIE)); self::register("pumpkin_seeds", $factory->get(Ids::PUMPKIN_SEEDS)); - self::register("purple_bed", $factory->get(Ids::BED, 10)); - self::register("purple_dye", $factory->get(Ids::DYE, 5)); self::register("rabbit_foot", $factory->get(Ids::RABBIT_FOOT)); self::register("rabbit_hide", $factory->get(Ids::RABBIT_HIDE)); self::register("rabbit_stew", $factory->get(Ids::RABBIT_STEW)); @@ -542,14 +481,11 @@ final class VanillaItems{ self::register("record_strad", $factory->get(Ids::RECORD_STRAD)); self::register("record_wait", $factory->get(Ids::RECORD_WAIT)); self::register("record_ward", $factory->get(Ids::RECORD_WARD)); - self::register("red_bed", $factory->get(Ids::BED, 14)); - self::register("red_dye", $factory->get(Ids::DYE, 1)); self::register("redstone_dust", $factory->get(Ids::REDSTONE)); self::register("rotten_flesh", $factory->get(Ids::ROTTEN_FLESH)); self::register("scute", $factory->get(Ids::TURTLE_SHELL_PIECE)); self::register("shears", $factory->get(Ids::SHEARS)); self::register("shulker_shell", $factory->get(Ids::SHULKER_SHELL)); - self::register("skeleton_skull", $factory->get(Ids::MOB_HEAD)); self::register("slimeball", $factory->get(Ids::SLIMEBALL)); self::register("snowball", $factory->get(Ids::SNOWBALL)); self::register("spider_eye", $factory->get(Ids::SPIDER_EYE)); @@ -572,9 +508,6 @@ final class VanillaItems{ self::register("water_bucket", $factory->get(Ids::BUCKET, 8)); self::register("wheat", $factory->get(Ids::WHEAT)); self::register("wheat_seeds", $factory->get(Ids::SEEDS)); - self::register("white_bed", $factory->get(Ids::BED)); - self::register("white_dye", $factory->get(Ids::DYE, 19)); - self::register("wither_skeleton_skull", $factory->get(Ids::MOB_HEAD, 1)); self::register("wooden_axe", $factory->get(Ids::WOODEN_AXE)); self::register("wooden_hoe", $factory->get(Ids::WOODEN_HOE)); self::register("wooden_pickaxe", $factory->get(Ids::WOODEN_PICKAXE)); @@ -582,9 +515,6 @@ final class VanillaItems{ self::register("wooden_sword", $factory->get(Ids::WOODEN_SWORD)); self::register("writable_book", $factory->get(Ids::WRITABLE_BOOK)); self::register("written_book", $factory->get(Ids::WRITTEN_BOOK)); - self::register("yellow_bed", $factory->get(Ids::BED, 4)); - self::register("yellow_dye", $factory->get(Ids::DYE, 11)); - self::register("zombie_head", $factory->get(Ids::MOB_HEAD, 2)); self::register("zombie_spawn_egg", $factory->get(Ids::SPAWN_EGG, 32)); } } From dd63681f9454e985395905562df5dc297dd39300 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 13:50:58 +0100 Subject: [PATCH 0188/1858] Assign auto-generated runtime type IDs to all items --- src/block/Block.php | 12 +- src/block/FloorCoralFan.php | 10 +- src/block/WallCoralFan.php | 12 +- src/item/CoralFan.php | 2 +- src/item/Item.php | 7 +- src/item/ItemBlock.php | 4 +- src/item/ItemFactory.php | 509 ++++++++++++++------------- src/item/ItemIdentifier.php | 38 +- src/item/ItemIdentifierFlattened.php | 13 +- src/item/ItemTypeIds.php | 270 ++++++++++++++ 10 files changed, 584 insertions(+), 293 deletions(-) create mode 100644 src/item/ItemTypeIds.php diff --git a/src/block/Block.php b/src/block/Block.php index 363ddd6c1f..a927842e4e 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -91,11 +91,19 @@ class Block{ public function asItem() : Item{ return ItemFactory::getInstance()->get( - $this->idInfo->getLegacyItemId(), - $this->idInfo->getLegacyVariant() | $this->writeStateToItemMeta() + $this->getLegacyItemId(), + $this->getLegacyItemMeta() ); } + public function getLegacyItemId() : int{ + return $this->idInfo->getLegacyItemId(); + } + + public function getLegacyItemMeta() : int{ + return $this->idInfo->getLegacyVariant() | $this->writeStateToItemMeta(); + } + protected function writeStateToItemMeta() : int{ return 0; } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 8e5377f231..c88f9575a5 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -27,7 +27,6 @@ use pocketmine\block\utils\BlockDataReader; use pocketmine\block\utils\BlockDataWriter; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; use pocketmine\item\ItemIds; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -40,12 +39,8 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - public function asItem() : Item{ - //TODO: HACK! workaround dead flag being lost when broken / blockpicked (original impl only uses first ID) - return ItemFactory::getInstance()->get( - $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN, - $this->writeStateToItemMeta() - ); + public function getLegacyItemId() : int{ + return $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN; } protected function writeStateToItemMeta() : int{ @@ -105,5 +100,4 @@ final class FloorCoralFan extends BaseCoral{ private function canBeSupportedBy(Block $block) : bool{ return $block->getSupportType(Facing::UP)->hasCenterSupport(); } - } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 125fda9074..c4043ed04d 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -28,7 +28,6 @@ use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; use pocketmine\item\ItemIds; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -39,6 +38,10 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; + public function getLegacyItemId() : int{ + return $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN; + } + protected function writeStateToItemMeta() : int{ return CoralTypeIdMap::getInstance()->toId($this->coralType); } @@ -55,13 +58,6 @@ final class WallCoralFan extends BaseCoral{ $w->writeHorizontalFacing($this->facing); } - public function asItem() : Item{ - return ItemFactory::getInstance()->get( - $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN, - $this->writeStateToItemMeta() - ); - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $axis = Facing::axis($face); if(($axis !== Axis::X && $axis !== Axis::Z) || !$this->canBeSupportedBy($blockClicked, $face)){ diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index c9937cf0d5..8beceee140 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -38,7 +38,7 @@ final class CoralFan extends Item{ } public function getId() : int{ - return $this->dead ? $this->identifierFlattened->getAdditionalIds()[0] : $this->identifierFlattened->getId(); + return $this->dead ? $this->identifierFlattened->getAdditionalLegacyIds()[0] : $this->identifierFlattened->getLegacyId(); } public function getMeta() : int{ diff --git a/src/item/Item.php b/src/item/Item.php index 60605d7a82..48a3509c7a 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -428,16 +428,15 @@ class Item implements \JsonSerializable{ } final public function getTypeId() : int{ - //don't use Item::getMeta(), since it might be overridden for non-type information (e.g. durability) - return ($this->identifier->getId() << 16) | $this->identifier->getMeta(); + return $this->identifier->getTypeId(); } public function getId() : int{ - return $this->identifier->getId(); + return $this->identifier->getLegacyId(); } public function getMeta() : int{ - return $this->identifier->getMeta(); + return $this->identifier->getLegacyMeta(); } /** diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 7bb358fec9..6f7914098a 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -35,8 +35,8 @@ use pocketmine\block\BlockFactory; final class ItemBlock extends Item{ private int $blockFullId; - public function __construct(ItemIdentifier $identifier, Block $block){ - parent::__construct($identifier, $block->getName()); + public function __construct(Block $block){ + parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); $this->blockFullId = $block->getStateId(); } diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index fc4a7291ec..c297d9c53f 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; @@ -42,10 +41,12 @@ use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\inventory\ArmorInventory; use pocketmine\item\ItemIdentifier as IID; -use pocketmine\item\ItemIds as Ids; +use pocketmine\item\ItemIds as LegacyIds; +use pocketmine\item\ItemTypeIds as Ids; use pocketmine\math\Vector3; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\World; @@ -66,229 +67,239 @@ class ItemFactory{ $this->registerSpawnEggs(); $this->registerTierToolItems(); - $this->register(new Apple(new IID(Ids::APPLE, 0), "Apple")); - $this->register(new Arrow(new IID(Ids::ARROW, 0), "Arrow")); + $this->register(new Apple(new IID(Ids::APPLE, LegacyIds::APPLE, 0), "Apple")); + $this->register(new Arrow(new IID(Ids::ARROW, LegacyIds::ARROW, 0), "Arrow")); - $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO, 0), "Baked Potato")); - $this->register(new Bamboo(new IID(Ids::BAMBOO, 0), "Bamboo"), true); - $this->register(new Beetroot(new IID(Ids::BEETROOT, 0), "Beetroot")); - $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS, 0), "Beetroot Seeds")); - $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP, 0), "Beetroot Soup")); - $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD, 0), "Blaze Rod")); - $this->register(new Book(new IID(Ids::BOOK, 0), "Book")); - $this->register(new Bow(new IID(Ids::BOW, 0), "Bow")); - $this->register(new Bowl(new IID(Ids::BOWL, 0), "Bowl")); - $this->register(new Bread(new IID(Ids::BREAD, 0), "Bread")); - $this->register(new Bucket(new IID(Ids::BUCKET, 0), "Bucket")); - $this->register(new Carrot(new IID(Ids::CARROT, 0), "Carrot")); - $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT, 0), "Chorus Fruit")); - $this->register(new Clock(new IID(Ids::CLOCK, 0), "Clock")); - $this->register(new Clownfish(new IID(Ids::CLOWNFISH, 0), "Clownfish")); - $this->register(new Coal(new IID(Ids::COAL, 0), "Coal")); + $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO, LegacyIds::BAKED_POTATO, 0), "Baked Potato")); + $this->register(new Bamboo(new IID(Ids::BAMBOO, LegacyIds::BAMBOO, 0), "Bamboo"), true); + $this->register(new Beetroot(new IID(Ids::BEETROOT, LegacyIds::BEETROOT, 0), "Beetroot")); + $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS, LegacyIds::BEETROOT_SEEDS, 0), "Beetroot Seeds")); + $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP, LegacyIds::BEETROOT_SOUP, 0), "Beetroot Soup")); + $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD, LegacyIds::BLAZE_ROD, 0), "Blaze Rod")); + $this->register(new Book(new IID(Ids::BOOK, LegacyIds::BOOK, 0), "Book")); + $this->register(new Bow(new IID(Ids::BOW, LegacyIds::BOW, 0), "Bow")); + $this->register(new Bowl(new IID(Ids::BOWL, LegacyIds::BOWL, 0), "Bowl")); + $this->register(new Bread(new IID(Ids::BREAD, LegacyIds::BREAD, 0), "Bread")); + $this->register(new Bucket(new IID(Ids::BUCKET, LegacyIds::BUCKET, 0), "Bucket")); + $this->register(new Carrot(new IID(Ids::CARROT, LegacyIds::CARROT, 0), "Carrot")); + $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT, 0), "Chorus Fruit")); + $this->register(new Clock(new IID(Ids::CLOCK, LegacyIds::CLOCK, 0), "Clock")); + $this->register(new Clownfish(new IID(Ids::CLOWNFISH, LegacyIds::CLOWNFISH, 0), "Clownfish")); + $this->register(new Coal(new IID(Ids::COAL, LegacyIds::COAL, 0), "Coal")); - $identifier = new ItemIdentifierFlattened(Ids::CORAL_FAN, 0, [Ids::CORAL_FAN_DEAD]); + $identifier = new ItemIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, [LegacyIds::CORAL_FAN_DEAD]); foreach(CoralType::getAll() as $coralType){ $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(false), true); $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(true), true); } - $this->register(new Coal(new IID(Ids::COAL, 1), "Charcoal")); - $this->register(new CocoaBeans(new IID(Ids::DYE, 3), "Cocoa Beans")); - $this->register(new Compass(new IID(Ids::COMPASS, 0), "Compass")); - $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN, 0), "Cooked Chicken")); - $this->register(new CookedFish(new IID(Ids::COOKED_FISH, 0), "Cooked Fish")); - $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON, 0), "Cooked Mutton")); - $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP, 0), "Cooked Porkchop")); - $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT, 0), "Cooked Rabbit")); - $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON, 0), "Cooked Salmon")); - $this->register(new Cookie(new IID(Ids::COOKIE, 0), "Cookie")); - $this->register(new DriedKelp(new IID(Ids::DRIED_KELP, 0), "Dried Kelp")); - $this->register(new Egg(new IID(Ids::EGG, 0), "Egg")); - $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL, 0), "Ender Pearl")); - $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE, 0), "Bottle o' Enchanting")); - $this->register(new Fertilizer(new IID(Ids::DYE, 15), "Bone Meal")); - $this->register(new FishingRod(new IID(Ids::FISHING_ROD, 0), "Fishing Rod")); - $this->register(new FlintSteel(new IID(Ids::FLINT_STEEL, 0), "Flint and Steel")); - $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE, 0), "Glass Bottle")); - $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE, 0), "Golden Apple")); - $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE, 0), "Enchanted Golden Apple")); - $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT, 0), "Golden Carrot")); - $this->register(new Item(new IID(Ids::BLAZE_POWDER, 0), "Blaze Powder")); - $this->register(new Item(new IID(Ids::BLEACH, 0), "Bleach")); //EDU - $this->register(new Item(new IID(Ids::BONE, 0), "Bone")); - $this->register(new Item(new IID(Ids::BRICK, 0), "Brick")); - $this->register(new Item(new IID(Ids::CHORUS_FRUIT_POPPED, 0), "Popped Chorus Fruit")); - $this->register(new Item(new IID(Ids::CLAY_BALL, 0), "Clay")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SALT), "Salt")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_OXIDE), "Sodium Oxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_HYDROXIDE), "Sodium Hydroxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::MAGNESIUM_NITRATE), "Magnesium Nitrate")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::IRON_SULPHIDE), "Iron Sulphide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::LITHIUM_HYDRIDE), "Lithium Hydride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_HYDRIDE), "Sodium Hydride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::CALCIUM_BROMIDE), "Calcium Bromide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::MAGNESIUM_OXIDE), "Magnesium Oxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_ACETATE), "Sodium Acetate")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::LUMINOL), "Luminol")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::CHARCOAL), "Charcoal")); //??? maybe bug - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SUGAR), "Sugar")); //??? maybe bug - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::ALUMINIUM_OXIDE), "Aluminium Oxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::BORON_TRIOXIDE), "Boron Trioxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SOAP), "Soap")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::POLYETHYLENE), "Polyethylene")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::RUBBISH), "Rubbish")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::MAGNESIUM_SALTS), "Magnesium Salts")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SULPHATE), "Sulphate")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::BARIUM_SULPHATE), "Barium Sulphate")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::POTASSIUM_CHLORIDE), "Potassium Chloride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::MERCURIC_CHLORIDE), "Mercuric Chloride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::CERIUM_CHLORIDE), "Cerium Chloride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::CALCIUM_CHLORIDE), "Calcium Chloride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::WATER), "Water")); //??? - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::GLUE), "Glue")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::HYPOCHLORITE), "Hypochlorite")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::CRUDE_OIL), "Crude Oil")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::LATEX), "Latex")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::POTASSIUM_IODIDE), "Potassium Iodide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_FLUORIDE), "Sodium Fluoride")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::BENZENE), "Benzene")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::INK), "Ink")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::AMMONIA), "Ammonia")); - $this->register(new Item(new IID(Ids::COMPOUND, CompoundTypeIds::SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); - $this->register(new Item(new IID(Ids::DIAMOND, 0), "Diamond")); - $this->register(new Item(new IID(Ids::DRAGON_BREATH, 0), "Dragon's Breath")); - $this->register(new Item(new IID(Ids::DYE, 0), "Ink Sac")); - $this->register(new Item(new IID(Ids::DYE, 4), "Lapis Lazuli")); - $this->register(new Item(new IID(Ids::EMERALD, 0), "Emerald")); - $this->register(new Item(new IID(Ids::FEATHER, 0), "Feather")); - $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE, 0), "Fermented Spider Eye")); - $this->register(new Item(new IID(Ids::FLINT, 0), "Flint")); - $this->register(new Item(new IID(Ids::GHAST_TEAR, 0), "Ghast Tear")); - $this->register(new Item(new IID(Ids::GLISTERING_MELON, 0), "Glistering Melon")); - $this->register(new Item(new IID(Ids::GLOWSTONE_DUST, 0), "Glowstone Dust")); - $this->register(new Item(new IID(Ids::GOLD_INGOT, 0), "Gold Ingot")); - $this->register(new Item(new IID(Ids::GOLD_NUGGET, 0), "Gold Nugget")); - $this->register(new Item(new IID(Ids::GUNPOWDER, 0), "Gunpowder")); - $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA, 0), "Heart of the Sea")); - $this->register(new Item(new IID(Ids::IRON_INGOT, 0), "Iron Ingot")); - $this->register(new Item(new IID(Ids::IRON_NUGGET, 0), "Iron Nugget")); - $this->register(new Item(new IID(Ids::LEATHER, 0), "Leather")); - $this->register(new Item(new IID(Ids::MAGMA_CREAM, 0), "Magma Cream")); - $this->register(new Item(new IID(Ids::NAUTILUS_SHELL, 0), "Nautilus Shell")); - $this->register(new Item(new IID(Ids::NETHER_BRICK, 0), "Nether Brick")); - $this->register(new Item(new IID(Ids::NETHER_QUARTZ, 0), "Nether Quartz")); - $this->register(new Item(new IID(Ids::NETHER_STAR, 0), "Nether Star")); - $this->register(new Item(new IID(Ids::PAPER, 0), "Paper")); - $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS, 0), "Prismarine Crystals")); - $this->register(new Item(new IID(Ids::PRISMARINE_SHARD, 0), "Prismarine Shard")); - $this->register(new Item(new IID(Ids::RABBIT_FOOT, 0), "Rabbit's Foot")); - $this->register(new Item(new IID(Ids::RABBIT_HIDE, 0), "Rabbit Hide")); - $this->register(new Item(new IID(Ids::SHULKER_SHELL, 0), "Shulker Shell")); - $this->register(new Item(new IID(Ids::SLIME_BALL, 0), "Slimeball")); - $this->register(new Item(new IID(Ids::SUGAR, 0), "Sugar")); - $this->register(new Item(new IID(Ids::TURTLE_SHELL_PIECE, 0), "Scute")); - $this->register(new Item(new IID(Ids::WHEAT, 0), "Wheat")); - $this->register(new ItemBlock(new IID(Ids::ACACIA_DOOR, 0), Blocks::ACACIA_DOOR())); - $this->register(new ItemBlock(new IID(Ids::BIRCH_DOOR, 0), Blocks::BIRCH_DOOR())); - $this->register(new ItemBlock(new IID(Ids::BREWING_STAND, 0), Blocks::BREWING_STAND())); - $this->register(new ItemBlock(new IID(Ids::CAKE, 0), Blocks::CAKE())); - $this->register(new ItemBlock(new IID(Ids::COMPARATOR, 0), Blocks::REDSTONE_COMPARATOR())); - $this->register(new ItemBlock(new IID(Ids::DARK_OAK_DOOR, 0), Blocks::DARK_OAK_DOOR())); - $this->register(new ItemBlock(new IID(Ids::FLOWER_POT, 0), Blocks::FLOWER_POT())); - $this->register(new ItemBlock(new IID(Ids::HOPPER, 0), Blocks::HOPPER())); - $this->register(new ItemBlock(new IID(Ids::IRON_DOOR, 0), Blocks::IRON_DOOR())); - $this->register(new ItemBlock(new IID(Ids::ITEM_FRAME, 0), Blocks::ITEM_FRAME())); - $this->register(new ItemBlock(new IID(Ids::JUNGLE_DOOR, 0), Blocks::JUNGLE_DOOR())); - $this->register(new ItemBlock(new IID(Ids::NETHER_WART, 0), Blocks::NETHER_WART())); - $this->register(new ItemBlock(new IID(Ids::OAK_DOOR, 0), Blocks::OAK_DOOR())); - $this->register(new ItemBlock(new IID(Ids::REPEATER, 0), Blocks::REDSTONE_REPEATER())); - $this->register(new ItemBlock(new IID(Ids::SPRUCE_DOOR, 0), Blocks::SPRUCE_DOOR())); - $this->register(new ItemBlock(new IID(Ids::SUGARCANE, 0), Blocks::SUGARCANE())); + $this->register(new Coal(new IID(Ids::CHARCOAL, LegacyIds::COAL, 1), "Charcoal")); + $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS, LegacyIds::DYE, 3), "Cocoa Beans")); + $this->register(new Compass(new IID(Ids::COMPASS, LegacyIds::COMPASS, 0), "Compass")); + $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN, LegacyIds::COOKED_CHICKEN, 0), "Cooked Chicken")); + $this->register(new CookedFish(new IID(Ids::COOKED_FISH, LegacyIds::COOKED_FISH, 0), "Cooked Fish")); + $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON, LegacyIds::COOKED_MUTTON, 0), "Cooked Mutton")); + $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP, LegacyIds::COOKED_PORKCHOP, 0), "Cooked Porkchop")); + $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT, LegacyIds::COOKED_RABBIT, 0), "Cooked Rabbit")); + $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON, LegacyIds::COOKED_SALMON, 0), "Cooked Salmon")); + $this->register(new Cookie(new IID(Ids::COOKIE, LegacyIds::COOKIE, 0), "Cookie")); + $this->register(new DriedKelp(new IID(Ids::DRIED_KELP, LegacyIds::DRIED_KELP, 0), "Dried Kelp")); + $this->register(new Egg(new IID(Ids::EGG, LegacyIds::EGG, 0), "Egg")); + $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL, LegacyIds::ENDER_PEARL, 0), "Ender Pearl")); + $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE, LegacyIds::EXPERIENCE_BOTTLE, 0), "Bottle o' Enchanting")); + $this->register(new Fertilizer(new IID(Ids::BONE_MEAL, LegacyIds::DYE, 15), "Bone Meal")); + $this->register(new FishingRod(new IID(Ids::FISHING_ROD, LegacyIds::FISHING_ROD, 0), "Fishing Rod")); + $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL, LegacyIds::FLINT_STEEL, 0), "Flint and Steel")); + $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE, LegacyIds::GLASS_BOTTLE, 0), "Glass Bottle")); + $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE, LegacyIds::GOLDEN_APPLE, 0), "Golden Apple")); + $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE, LegacyIds::ENCHANTED_GOLDEN_APPLE, 0), "Enchanted Golden Apple")); + $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT, LegacyIds::GOLDEN_CARROT, 0), "Golden Carrot")); + $this->register(new Item(new IID(Ids::BLAZE_POWDER, LegacyIds::BLAZE_POWDER, 0), "Blaze Powder")); + $this->register(new Item(new IID(Ids::BLEACH, LegacyIds::BLEACH, 0), "Bleach")); //EDU + $this->register(new Item(new IID(Ids::BONE, LegacyIds::BONE, 0), "Bone")); + $this->register(new Item(new IID(Ids::BRICK, LegacyIds::BRICK, 0), "Brick")); + $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT_POPPED, 0), "Popped Chorus Fruit")); + $this->register(new Item(new IID(Ids::CLAY, LegacyIds::CLAY_BALL, 0), "Clay")); + $this->register(new Item(new IID(Ids::CHEMICAL_SALT, LegacyIds::COMPOUND, CompoundTypeIds::SALT), "Salt")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_OXIDE), "Sodium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDROXIDE), "Sodium Hydroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_NITRATE), "Magnesium Nitrate")); + $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE, LegacyIds::COMPOUND, CompoundTypeIds::IRON_SULPHIDE), "Iron Sulphide")); + $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::LITHIUM_HYDRIDE), "Lithium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDRIDE), "Sodium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_BROMIDE), "Calcium Bromide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_OXIDE), "Magnesium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_ACETATE), "Sodium Acetate")); + $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL, LegacyIds::COMPOUND, CompoundTypeIds::LUMINOL), "Luminol")); + $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL, LegacyIds::COMPOUND, CompoundTypeIds::CHARCOAL), "Charcoal")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR, LegacyIds::COMPOUND, CompoundTypeIds::SUGAR), "Sugar")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::ALUMINIUM_OXIDE), "Aluminium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE, LegacyIds::COMPOUND, CompoundTypeIds::BORON_TRIOXIDE), "Boron Trioxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SOAP, LegacyIds::COMPOUND, CompoundTypeIds::SOAP), "Soap")); + $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE, LegacyIds::COMPOUND, CompoundTypeIds::POLYETHYLENE), "Polyethylene")); + $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH, LegacyIds::COMPOUND, CompoundTypeIds::RUBBISH), "Rubbish")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_SALTS), "Magnesium Salts")); + $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::SULPHATE), "Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::BARIUM_SULPHATE), "Barium Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_CHLORIDE), "Potassium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::MERCURIC_CHLORIDE), "Mercuric Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CERIUM_CHLORIDE), "Cerium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::TUNGSTEN_CHLORIDE), "Tungsten Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_CHLORIDE), "Calcium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_WATER, LegacyIds::COMPOUND, CompoundTypeIds::WATER), "Water")); //??? + $this->register(new Item(new IID(Ids::CHEMICAL_GLUE, LegacyIds::COMPOUND, CompoundTypeIds::GLUE), "Glue")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::HYPOCHLORITE), "Hypochlorite")); + $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL, LegacyIds::COMPOUND, CompoundTypeIds::CRUDE_OIL), "Crude Oil")); + $this->register(new Item(new IID(Ids::CHEMICAL_LATEX, LegacyIds::COMPOUND, CompoundTypeIds::LATEX), "Latex")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_IODIDE), "Potassium Iodide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_FLUORIDE), "Sodium Fluoride")); + $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE, LegacyIds::COMPOUND, CompoundTypeIds::BENZENE), "Benzene")); + $this->register(new Item(new IID(Ids::CHEMICAL_INK, LegacyIds::COMPOUND, CompoundTypeIds::INK), "Ink")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA, LegacyIds::COMPOUND, CompoundTypeIds::AMMONIA), "Ammonia")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + $this->register(new Item(new IID(Ids::DIAMOND, LegacyIds::DIAMOND, 0), "Diamond")); + $this->register(new Item(new IID(Ids::DRAGON_BREATH, LegacyIds::DRAGON_BREATH, 0), "Dragon's Breath")); + $this->register(new Item(new IID(Ids::INK_SAC, LegacyIds::DYE, 0), "Ink Sac")); + $this->register(new Item(new IID(Ids::LAPIS_LAZULI, LegacyIds::DYE, 4), "Lapis Lazuli")); + $this->register(new Item(new IID(Ids::EMERALD, LegacyIds::EMERALD, 0), "Emerald")); + $this->register(new Item(new IID(Ids::FEATHER, LegacyIds::FEATHER, 0), "Feather")); + $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE, LegacyIds::FERMENTED_SPIDER_EYE, 0), "Fermented Spider Eye")); + $this->register(new Item(new IID(Ids::FLINT, LegacyIds::FLINT, 0), "Flint")); + $this->register(new Item(new IID(Ids::GHAST_TEAR, LegacyIds::GHAST_TEAR, 0), "Ghast Tear")); + $this->register(new Item(new IID(Ids::GLISTERING_MELON, LegacyIds::GLISTERING_MELON, 0), "Glistering Melon")); + $this->register(new Item(new IID(Ids::GLOWSTONE_DUST, LegacyIds::GLOWSTONE_DUST, 0), "Glowstone Dust")); + $this->register(new Item(new IID(Ids::GOLD_INGOT, LegacyIds::GOLD_INGOT, 0), "Gold Ingot")); + $this->register(new Item(new IID(Ids::GOLD_NUGGET, LegacyIds::GOLD_NUGGET, 0), "Gold Nugget")); + $this->register(new Item(new IID(Ids::GUNPOWDER, LegacyIds::GUNPOWDER, 0), "Gunpowder")); + $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA, LegacyIds::HEART_OF_THE_SEA, 0), "Heart of the Sea")); + $this->register(new Item(new IID(Ids::IRON_INGOT, LegacyIds::IRON_INGOT, 0), "Iron Ingot")); + $this->register(new Item(new IID(Ids::IRON_NUGGET, LegacyIds::IRON_NUGGET, 0), "Iron Nugget")); + $this->register(new Item(new IID(Ids::LEATHER, LegacyIds::LEATHER, 0), "Leather")); + $this->register(new Item(new IID(Ids::MAGMA_CREAM, LegacyIds::MAGMA_CREAM, 0), "Magma Cream")); + $this->register(new Item(new IID(Ids::NAUTILUS_SHELL, LegacyIds::NAUTILUS_SHELL, 0), "Nautilus Shell")); + $this->register(new Item(new IID(Ids::NETHER_BRICK, LegacyIds::NETHER_BRICK, 0), "Nether Brick")); + $this->register(new Item(new IID(Ids::NETHER_QUARTZ, LegacyIds::NETHER_QUARTZ, 0), "Nether Quartz")); + $this->register(new Item(new IID(Ids::NETHER_STAR, LegacyIds::NETHER_STAR, 0), "Nether Star")); + $this->register(new Item(new IID(Ids::PAPER, LegacyIds::PAPER, 0), "Paper")); + $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS, LegacyIds::PRISMARINE_CRYSTALS, 0), "Prismarine Crystals")); + $this->register(new Item(new IID(Ids::PRISMARINE_SHARD, LegacyIds::PRISMARINE_SHARD, 0), "Prismarine Shard")); + $this->register(new Item(new IID(Ids::RABBIT_FOOT, LegacyIds::RABBIT_FOOT, 0), "Rabbit's Foot")); + $this->register(new Item(new IID(Ids::RABBIT_HIDE, LegacyIds::RABBIT_HIDE, 0), "Rabbit Hide")); + $this->register(new Item(new IID(Ids::SHULKER_SHELL, LegacyIds::SHULKER_SHELL, 0), "Shulker Shell")); + $this->register(new Item(new IID(Ids::SLIMEBALL, LegacyIds::SLIME_BALL, 0), "Slimeball")); + $this->register(new Item(new IID(Ids::SUGAR, LegacyIds::SUGAR, 0), "Sugar")); + $this->register(new Item(new IID(Ids::SCUTE, LegacyIds::TURTLE_SHELL_PIECE, 0), "Scute")); + $this->register(new Item(new IID(Ids::WHEAT, LegacyIds::WHEAT, 0), "Wheat")); + + //these blocks have special legacy item IDs, so they need to be registered explicitly + $this->register(new ItemBlock(Blocks::ACACIA_DOOR())); + $this->register(new ItemBlock(Blocks::BIRCH_DOOR())); + $this->register(new ItemBlock(Blocks::BREWING_STAND())); + $this->register(new ItemBlock(Blocks::CAKE())); + $this->register(new ItemBlock(Blocks::REDSTONE_COMPARATOR())); + $this->register(new ItemBlock(Blocks::DARK_OAK_DOOR())); + $this->register(new ItemBlock(Blocks::FLOWER_POT())); + $this->register(new ItemBlock(Blocks::HOPPER())); + $this->register(new ItemBlock(Blocks::IRON_DOOR())); + $this->register(new ItemBlock(Blocks::ITEM_FRAME())); + $this->register(new ItemBlock(Blocks::JUNGLE_DOOR())); + $this->register(new ItemBlock(Blocks::NETHER_WART())); + $this->register(new ItemBlock(Blocks::OAK_DOOR())); + $this->register(new ItemBlock(Blocks::REDSTONE_REPEATER())); + $this->register(new ItemBlock(Blocks::SPRUCE_DOOR())); + $this->register(new ItemBlock(Blocks::SUGARCANE())); //the meta values for buckets are intentionally hardcoded because block IDs will change in the future - $waterBucket = new LiquidBucket(new IID(Ids::BUCKET, 8), "Water Bucket", Blocks::WATER()); + $waterBucket = new LiquidBucket(new IID(Ids::WATER_BUCKET, LegacyIds::BUCKET, 8), "Water Bucket", Blocks::WATER()); $this->register($waterBucket); - $this->remap(new IID(Ids::BUCKET, 9), $waterBucket); - $lavaBucket = new LiquidBucket(new IID(Ids::BUCKET, 10), "Lava Bucket", Blocks::LAVA()); + $this->remap(LegacyIds::BUCKET, 9, $waterBucket); + $lavaBucket = new LiquidBucket(new IID(Ids::LAVA_BUCKET, LegacyIds::BUCKET, 10), "Lava Bucket", Blocks::LAVA()); $this->register($lavaBucket); - $this->remap(new IID(Ids::BUCKET, 11), $lavaBucket); - $this->register(new Melon(new IID(Ids::MELON, 0), "Melon")); - $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS, 0), "Melon Seeds")); - $this->register(new MilkBucket(new IID(Ids::BUCKET, 1), "Milk Bucket")); - $this->register(new Minecart(new IID(Ids::MINECART, 0), "Minecart")); - $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW, 0), "Mushroom Stew")); - $this->register(new PaintingItem(new IID(Ids::PAINTING, 0), "Painting")); - $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO, 0), "Poisonous Potato")); - $this->register(new Potato(new IID(Ids::POTATO, 0), "Potato")); - $this->register(new Pufferfish(new IID(Ids::PUFFERFISH, 0), "Pufferfish")); - $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE, 0), "Pumpkin Pie")); - $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS, 0), "Pumpkin Seeds")); - $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW, 0), "Rabbit Stew")); - $this->register(new RawBeef(new IID(Ids::RAW_BEEF, 0), "Raw Beef")); - $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN, 0), "Raw Chicken")); - $this->register(new RawFish(new IID(Ids::RAW_FISH, 0), "Raw Fish")); - $this->register(new RawMutton(new IID(Ids::RAW_MUTTON, 0), "Raw Mutton")); - $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP, 0), "Raw Porkchop")); - $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT, 0), "Raw Rabbit")); - $this->register(new RawSalmon(new IID(Ids::RAW_SALMON, 0), "Raw Salmon")); - $this->register(new Record(new IID(Ids::RECORD_13, 0), RecordType::DISK_13(), "Record 13")); - $this->register(new Record(new IID(Ids::RECORD_CAT, 0), RecordType::DISK_CAT(), "Record Cat")); - $this->register(new Record(new IID(Ids::RECORD_BLOCKS, 0), RecordType::DISK_BLOCKS(), "Record Blocks")); - $this->register(new Record(new IID(Ids::RECORD_CHIRP, 0), RecordType::DISK_CHIRP(), "Record Chirp")); - $this->register(new Record(new IID(Ids::RECORD_FAR, 0), RecordType::DISK_FAR(), "Record Far")); - $this->register(new Record(new IID(Ids::RECORD_MALL, 0), RecordType::DISK_MALL(), "Record Mall")); - $this->register(new Record(new IID(Ids::RECORD_MELLOHI, 0), RecordType::DISK_MELLOHI(), "Record Mellohi")); - $this->register(new Record(new IID(Ids::RECORD_STAL, 0), RecordType::DISK_STAL(), "Record Stal")); - $this->register(new Record(new IID(Ids::RECORD_STRAD, 0), RecordType::DISK_STRAD(), "Record Strad")); - $this->register(new Record(new IID(Ids::RECORD_WARD, 0), RecordType::DISK_WARD(), "Record Ward")); - $this->register(new Record(new IID(Ids::RECORD_11, 0), RecordType::DISK_11(), "Record 11")); - $this->register(new Record(new IID(Ids::RECORD_WAIT, 0), RecordType::DISK_WAIT(), "Record Wait")); - $this->register(new Redstone(new IID(Ids::REDSTONE, 0), "Redstone")); - $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH, 0), "Rotten Flesh")); - $this->register(new Shears(new IID(Ids::SHEARS, 0), "Shears")); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::SIGN, 0), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN, 0), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN, 0), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN, 0), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN, 0), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARKOAK_SIGN, 0), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - $this->register(new Snowball(new IID(Ids::SNOWBALL, 0), "Snowball")); - $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE, 0), "Spider Eye")); - $this->register(new Steak(new IID(Ids::STEAK, 0), "Steak")); - $this->register(new Stick(new IID(Ids::STICK, 0), "Stick")); - $this->register(new StringItem(new IID(Ids::STRING, 0), "String")); - $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES, 0), "Sweet Berries")); - $this->register(new Totem(new IID(Ids::TOTEM, 0), "Totem of Undying")); - $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS, 0), "Wheat Seeds")); - $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, 0), "Book & Quill")); - $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, 0), "Written Book")); + $this->remap(LegacyIds::BUCKET, 11, $lavaBucket); + $this->register(new Melon(new IID(Ids::MELON, LegacyIds::MELON, 0), "Melon")); + $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS, LegacyIds::MELON_SEEDS, 0), "Melon Seeds")); + $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET, LegacyIds::BUCKET, 1), "Milk Bucket")); + $this->register(new Minecart(new IID(Ids::MINECART, LegacyIds::MINECART, 0), "Minecart")); + $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW, LegacyIds::MUSHROOM_STEW, 0), "Mushroom Stew")); + $this->register(new PaintingItem(new IID(Ids::PAINTING, LegacyIds::PAINTING, 0), "Painting")); + $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO, LegacyIds::POISONOUS_POTATO, 0), "Poisonous Potato")); + $this->register(new Potato(new IID(Ids::POTATO, LegacyIds::POTATO, 0), "Potato")); + $this->register(new Pufferfish(new IID(Ids::PUFFERFISH, LegacyIds::PUFFERFISH, 0), "Pufferfish")); + $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE, LegacyIds::PUMPKIN_PIE, 0), "Pumpkin Pie")); + $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS, LegacyIds::PUMPKIN_SEEDS, 0), "Pumpkin Seeds")); + $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW, LegacyIds::RABBIT_STEW, 0), "Rabbit Stew")); + $this->register(new RawBeef(new IID(Ids::RAW_BEEF, LegacyIds::RAW_BEEF, 0), "Raw Beef")); + $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN, LegacyIds::RAW_CHICKEN, 0), "Raw Chicken")); + $this->register(new RawFish(new IID(Ids::RAW_FISH, LegacyIds::RAW_FISH, 0), "Raw Fish")); + $this->register(new RawMutton(new IID(Ids::RAW_MUTTON, LegacyIds::RAW_MUTTON, 0), "Raw Mutton")); + $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP, LegacyIds::RAW_PORKCHOP, 0), "Raw Porkchop")); + $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT, LegacyIds::RAW_RABBIT, 0), "Raw Rabbit")); + $this->register(new RawSalmon(new IID(Ids::RAW_SALMON, LegacyIds::RAW_SALMON, 0), "Raw Salmon")); + $this->register(new Record(new IID(Ids::RECORD_13, LegacyIds::RECORD_13, 0), RecordType::DISK_13(), "Record 13")); + $this->register(new Record(new IID(Ids::RECORD_CAT, LegacyIds::RECORD_CAT, 0), RecordType::DISK_CAT(), "Record Cat")); + $this->register(new Record(new IID(Ids::RECORD_BLOCKS, LegacyIds::RECORD_BLOCKS, 0), RecordType::DISK_BLOCKS(), "Record Blocks")); + $this->register(new Record(new IID(Ids::RECORD_CHIRP, LegacyIds::RECORD_CHIRP, 0), RecordType::DISK_CHIRP(), "Record Chirp")); + $this->register(new Record(new IID(Ids::RECORD_FAR, LegacyIds::RECORD_FAR, 0), RecordType::DISK_FAR(), "Record Far")); + $this->register(new Record(new IID(Ids::RECORD_MALL, LegacyIds::RECORD_MALL, 0), RecordType::DISK_MALL(), "Record Mall")); + $this->register(new Record(new IID(Ids::RECORD_MELLOHI, LegacyIds::RECORD_MELLOHI, 0), RecordType::DISK_MELLOHI(), "Record Mellohi")); + $this->register(new Record(new IID(Ids::RECORD_STAL, LegacyIds::RECORD_STAL, 0), RecordType::DISK_STAL(), "Record Stal")); + $this->register(new Record(new IID(Ids::RECORD_STRAD, LegacyIds::RECORD_STRAD, 0), RecordType::DISK_STRAD(), "Record Strad")); + $this->register(new Record(new IID(Ids::RECORD_WARD, LegacyIds::RECORD_WARD, 0), RecordType::DISK_WARD(), "Record Ward")); + $this->register(new Record(new IID(Ids::RECORD_11, LegacyIds::RECORD_11, 0), RecordType::DISK_11(), "Record 11")); + $this->register(new Record(new IID(Ids::RECORD_WAIT, LegacyIds::RECORD_WAIT, 0), RecordType::DISK_WAIT(), "Record Wait")); + $this->register(new Redstone(new IID(Ids::REDSTONE_DUST, LegacyIds::REDSTONE, 0), "Redstone")); + $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH, LegacyIds::ROTTEN_FLESH, 0), "Rotten Flesh")); + $this->register(new Shears(new IID(Ids::SHEARS, LegacyIds::SHEARS, 0), "Shears")); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN, LegacyIds::SIGN, 0), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN, LegacyIds::SPRUCE_SIGN, 0), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN, LegacyIds::BIRCH_SIGN, 0), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN, LegacyIds::JUNGLE_SIGN, 0), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN, LegacyIds::ACACIA_SIGN, 0), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN, LegacyIds::DARKOAK_SIGN, 0), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + $this->register(new Snowball(new IID(Ids::SNOWBALL, LegacyIds::SNOWBALL, 0), "Snowball")); + $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE, LegacyIds::SPIDER_EYE, 0), "Spider Eye")); + $this->register(new Steak(new IID(Ids::STEAK, LegacyIds::STEAK, 0), "Steak")); + $this->register(new Stick(new IID(Ids::STICK, LegacyIds::STICK, 0), "Stick")); + $this->register(new StringItem(new IID(Ids::STRING, LegacyIds::STRING, 0), "String")); + $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES, LegacyIds::SWEET_BERRIES, 0), "Sweet Berries")); + $this->register(new Totem(new IID(Ids::TOTEM, LegacyIds::TOTEM, 0), "Totem of Undying")); + $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS, LegacyIds::WHEAT_SEEDS, 0), "Wheat Seeds")); + $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, LegacyIds::WRITABLE_BOOK, 0), "Book & Quill")); + $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, LegacyIds::WRITTEN_BOOK, 0), "Written Book")); foreach(SkullType::getAll() as $skullType){ - $this->register((new Skull(new IID(Ids::SKULL, 0), "Mob Head"))->setSkullType($skullType)); + $this->register((new Skull(new IID(Ids::MOB_HEAD, LegacyIds::SKULL, 0), "Mob Head"))->setSkullType($skullType)); } foreach(DyeColor::getAll() as $color){ //TODO: use colour object directly //TODO: add interface to dye-colour objects - //1000 isn't the real variant for dye, but it needs to not conflict with INK_SAC - $this->register((new Dye(new IID(Ids::DYE, 1000), "Dye"))->setColor($color)); - $this->register((new Bed(new IID(Ids::BED, 0), "Bed"))->setColor($color)); + $this->register((new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye"))->setColor($color)); + $this->register((new Bed(new IID(Ids::BED, LegacyIds::BED, 0), "Bed"))->setColor($color)); $this->register((new Banner( - new IID(Ids::BANNER, 0), + new IID(Ids::BANNER, LegacyIds::BANNER, 0), Blocks::BANNER(), Blocks::WALL_BANNER() ))->setColor($color)); } foreach(PotionType::getAll() as $type){ - $this->register((new Potion(new IID(Ids::POTION, 0), "Potion"))->setType($type)); - $this->register((new SplashPotion(new IID(Ids::SPLASH_POTION, 0), "Splash Potion"))->setType($type)); + $this->register((new Potion(new IID(Ids::POTION, LegacyIds::POTION, 0), "Potion"))->setType($type)); + $this->register((new SplashPotion(new IID(Ids::SPLASH_POTION, LegacyIds::SPLASH_POTION, 0), "Splash Potion"))->setType($type)); } foreach(TreeType::getAll() as $type){ - $this->register(new Boat(new IID(Ids::BOAT, $type->getMagicNumber()), $type->getDisplayName() . " Boat", $type)); + //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency + $this->register(new Boat(new IID(match($type){ + TreeType::OAK() => Ids::OAK_BOAT, + TreeType::SPRUCE() => Ids::SPRUCE_BOAT, + TreeType::BIRCH() => Ids::BIRCH_BOAT, + TreeType::JUNGLE() => Ids::JUNGLE_BOAT, + TreeType::ACACIA() => Ids::ACACIA_BOAT, + TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, + default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) + }, LegacyIds::BOAT, $type->getMagicNumber()), $type->getDisplayName() . " Boat", $type)); } //region --- auto-generated TODOs --- @@ -336,17 +347,17 @@ class ItemFactory{ private function registerSpawnEggs() : void{ //TODO: the meta values should probably be hardcoded; they won't change, but the EntityLegacyIds might - $this->register(new class(new IID(Ids::SPAWN_EGG, EntityLegacyIds::ZOMBIE), "Zombie Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::ZOMBIE), "Zombie Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::SPAWN_EGG, EntityLegacyIds::SQUID), "Squid Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::SQUID), "Squid Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::SPAWN_EGG, EntityLegacyIds::VILLAGER), "Villager Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::VILLAGER), "Villager Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); } @@ -354,54 +365,54 @@ class ItemFactory{ } private function registerTierToolItems() : void{ - $this->register(new Axe(new IID(Ids::DIAMOND_AXE, 0), "Diamond Axe", ToolTier::DIAMOND())); - $this->register(new Axe(new IID(Ids::GOLDEN_AXE, 0), "Golden Axe", ToolTier::GOLD())); - $this->register(new Axe(new IID(Ids::IRON_AXE, 0), "Iron Axe", ToolTier::IRON())); - $this->register(new Axe(new IID(Ids::STONE_AXE, 0), "Stone Axe", ToolTier::STONE())); - $this->register(new Axe(new IID(Ids::WOODEN_AXE, 0), "Wooden Axe", ToolTier::WOOD())); - $this->register(new Hoe(new IID(Ids::DIAMOND_HOE, 0), "Diamond Hoe", ToolTier::DIAMOND())); - $this->register(new Hoe(new IID(Ids::GOLDEN_HOE, 0), "Golden Hoe", ToolTier::GOLD())); - $this->register(new Hoe(new IID(Ids::IRON_HOE, 0), "Iron Hoe", ToolTier::IRON())); - $this->register(new Hoe(new IID(Ids::STONE_HOE, 0), "Stone Hoe", ToolTier::STONE())); - $this->register(new Hoe(new IID(Ids::WOODEN_HOE, 0), "Wooden Hoe", ToolTier::WOOD())); - $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE, 0), "Diamond Pickaxe", ToolTier::DIAMOND())); - $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE, 0), "Golden Pickaxe", ToolTier::GOLD())); - $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE, 0), "Iron Pickaxe", ToolTier::IRON())); - $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE, 0), "Stone Pickaxe", ToolTier::STONE())); - $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE, 0), "Wooden Pickaxe", ToolTier::WOOD())); - $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL, 0), "Diamond Shovel", ToolTier::DIAMOND())); - $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL, 0), "Golden Shovel", ToolTier::GOLD())); - $this->register(new Shovel(new IID(Ids::IRON_SHOVEL, 0), "Iron Shovel", ToolTier::IRON())); - $this->register(new Shovel(new IID(Ids::STONE_SHOVEL, 0), "Stone Shovel", ToolTier::STONE())); - $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL, 0), "Wooden Shovel", ToolTier::WOOD())); - $this->register(new Sword(new IID(Ids::DIAMOND_SWORD, 0), "Diamond Sword", ToolTier::DIAMOND())); - $this->register(new Sword(new IID(Ids::GOLDEN_SWORD, 0), "Golden Sword", ToolTier::GOLD())); - $this->register(new Sword(new IID(Ids::IRON_SWORD, 0), "Iron Sword", ToolTier::IRON())); - $this->register(new Sword(new IID(Ids::STONE_SWORD, 0), "Stone Sword", ToolTier::STONE())); - $this->register(new Sword(new IID(Ids::WOODEN_SWORD, 0), "Wooden Sword", ToolTier::WOOD())); + $this->register(new Axe(new IID(Ids::DIAMOND_AXE, LegacyIds::DIAMOND_AXE, 0), "Diamond Axe", ToolTier::DIAMOND())); + $this->register(new Axe(new IID(Ids::GOLDEN_AXE, LegacyIds::GOLDEN_AXE, 0), "Golden Axe", ToolTier::GOLD())); + $this->register(new Axe(new IID(Ids::IRON_AXE, LegacyIds::IRON_AXE, 0), "Iron Axe", ToolTier::IRON())); + $this->register(new Axe(new IID(Ids::STONE_AXE, LegacyIds::STONE_AXE, 0), "Stone Axe", ToolTier::STONE())); + $this->register(new Axe(new IID(Ids::WOODEN_AXE, LegacyIds::WOODEN_AXE, 0), "Wooden Axe", ToolTier::WOOD())); + $this->register(new Hoe(new IID(Ids::DIAMOND_HOE, LegacyIds::DIAMOND_HOE, 0), "Diamond Hoe", ToolTier::DIAMOND())); + $this->register(new Hoe(new IID(Ids::GOLDEN_HOE, LegacyIds::GOLDEN_HOE, 0), "Golden Hoe", ToolTier::GOLD())); + $this->register(new Hoe(new IID(Ids::IRON_HOE, LegacyIds::IRON_HOE, 0), "Iron Hoe", ToolTier::IRON())); + $this->register(new Hoe(new IID(Ids::STONE_HOE, LegacyIds::STONE_HOE, 0), "Stone Hoe", ToolTier::STONE())); + $this->register(new Hoe(new IID(Ids::WOODEN_HOE, LegacyIds::WOODEN_HOE, 0), "Wooden Hoe", ToolTier::WOOD())); + $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE, LegacyIds::DIAMOND_PICKAXE, 0), "Diamond Pickaxe", ToolTier::DIAMOND())); + $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE, LegacyIds::GOLDEN_PICKAXE, 0), "Golden Pickaxe", ToolTier::GOLD())); + $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE, LegacyIds::IRON_PICKAXE, 0), "Iron Pickaxe", ToolTier::IRON())); + $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE, LegacyIds::STONE_PICKAXE, 0), "Stone Pickaxe", ToolTier::STONE())); + $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE, LegacyIds::WOODEN_PICKAXE, 0), "Wooden Pickaxe", ToolTier::WOOD())); + $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL, LegacyIds::DIAMOND_SHOVEL, 0), "Diamond Shovel", ToolTier::DIAMOND())); + $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL, LegacyIds::GOLDEN_SHOVEL, 0), "Golden Shovel", ToolTier::GOLD())); + $this->register(new Shovel(new IID(Ids::IRON_SHOVEL, LegacyIds::IRON_SHOVEL, 0), "Iron Shovel", ToolTier::IRON())); + $this->register(new Shovel(new IID(Ids::STONE_SHOVEL, LegacyIds::STONE_SHOVEL, 0), "Stone Shovel", ToolTier::STONE())); + $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL, LegacyIds::WOODEN_SHOVEL, 0), "Wooden Shovel", ToolTier::WOOD())); + $this->register(new Sword(new IID(Ids::DIAMOND_SWORD, LegacyIds::DIAMOND_SWORD, 0), "Diamond Sword", ToolTier::DIAMOND())); + $this->register(new Sword(new IID(Ids::GOLDEN_SWORD, LegacyIds::GOLDEN_SWORD, 0), "Golden Sword", ToolTier::GOLD())); + $this->register(new Sword(new IID(Ids::IRON_SWORD, LegacyIds::IRON_SWORD, 0), "Iron Sword", ToolTier::IRON())); + $this->register(new Sword(new IID(Ids::STONE_SWORD, LegacyIds::STONE_SWORD, 0), "Stone Sword", ToolTier::STONE())); + $this->register(new Sword(new IID(Ids::WOODEN_SWORD, LegacyIds::WOODEN_SWORD, 0), "Wooden Sword", ToolTier::WOOD())); } private function registerArmorItems() : void{ - $this->register(new Armor(new IID(Ids::CHAIN_BOOTS, 0), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS, 0), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS, 0), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::IRON_BOOTS, 0), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::LEATHER_BOOTS, 0), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::CHAIN_CHESTPLATE, 0), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE, 0), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE, 0), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE, 0), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::LEATHER_CHESTPLATE, 0), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::CHAIN_HELMET, 0), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::DIAMOND_HELMET, 0), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::GOLDEN_HELMET, 0), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::IRON_HELMET, 0), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::LEATHER_HELMET, 0), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::CHAIN_LEGGINGS, 0), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS, 0), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS, 0), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::IRON_LEGGINGS, 0), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::LEATHER_LEGGINGS, 0), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS, LegacyIds::CHAIN_BOOTS, 0), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS, LegacyIds::DIAMOND_BOOTS, 0), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS, LegacyIds::GOLDEN_BOOTS, 0), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::IRON_BOOTS, LegacyIds::IRON_BOOTS, 0), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::LEATHER_BOOTS, LegacyIds::LEATHER_BOOTS, 0), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE, LegacyIds::CHAIN_CHESTPLATE, 0), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE, LegacyIds::DIAMOND_CHESTPLATE, 0), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE, LegacyIds::GOLDEN_CHESTPLATE, 0), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE, LegacyIds::IRON_CHESTPLATE, 0), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::LEATHER_TUNIC, LegacyIds::LEATHER_CHESTPLATE, 0), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET, LegacyIds::CHAIN_HELMET, 0), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::DIAMOND_HELMET, LegacyIds::DIAMOND_HELMET, 0), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::GOLDEN_HELMET, LegacyIds::GOLDEN_HELMET, 0), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::IRON_HELMET, LegacyIds::IRON_HELMET, 0), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::LEATHER_CAP, LegacyIds::LEATHER_HELMET, 0), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS, LegacyIds::CHAIN_LEGGINGS, 0), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS, LegacyIds::DIAMOND_LEGGINGS, 0), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS, LegacyIds::GOLDEN_LEGGINGS, 0), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::IRON_LEGGINGS, LegacyIds::IRON_LEGGINGS, 0), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::LEATHER_PANTS, LegacyIds::LEATHER_LEGGINGS, 0), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); } /** @@ -425,12 +436,12 @@ class ItemFactory{ $this->list[self::getListOffset($id, $variant)] = clone $item; } - public function remap(ItemIdentifier $identifier, Item $item, bool $override = false) : void{ - if(!$override && $this->isRegistered($identifier->getId(), $identifier->getMeta())){ + public function remap(int $legacyId, int $legacyMeta, Item $item, bool $override = false) : void{ + if(!$override && $this->isRegistered($legacyId, $legacyMeta)){ throw new \RuntimeException("Trying to overwrite an already registered item"); } - $this->list[self::getListOffset($identifier->getId(), $identifier->getMeta())] = clone $item; + $this->list[self::getListOffset($legacyId, $legacyMeta)] = clone $item; } private static function itemToBlockId(int $id) : int{ @@ -468,7 +479,7 @@ class ItemFactory{ if($blockStateData !== null){ try{ $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); - $item = new ItemBlock(new IID($id, $meta), BlockFactory::getInstance()->fromFullBlock($blockStateId)); + $item = new ItemBlock(BlockFactory::getInstance()->fromFullBlock($blockStateId)); }catch(BlockStateDeserializeException $e){ throw new SavedDataLoadingException("Failed to deserialize itemblock: " . $e->getMessage(), 0, $e); } diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index 9681a4b0df..e69aa1efc5 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -23,26 +23,40 @@ declare(strict_types=1); namespace pocketmine\item; -class ItemIdentifier{ - private int $id; - private int $meta; +use pocketmine\block\Block; - public function __construct(int $id, int $meta){ - if($id < -0x8000 || $id > 0x7fff){ //signed short range +class ItemIdentifier{ + private int $legacyId; + private int $legacyMeta; + + public function __construct( + private int $typeId, + int $legacyId, + int $legacyMeta + ){ + if($legacyId < -0x8000 || $legacyId > 0x7fff){ //signed short range throw new \InvalidArgumentException("ID must be in range " . -0x8000 . " - " . 0x7fff); } - if($meta < 0 || $meta > 0x7ffe){ + if($legacyMeta < 0 || $legacyMeta > 0x7ffe){ throw new \InvalidArgumentException("Meta must be in range 0 - " . 0x7ffe); } - $this->id = $id; - $this->meta = $meta; + $this->legacyId = $legacyId; + $this->legacyMeta = $legacyMeta; } - public function getId() : int{ - return $this->id; + public static function fromBlock(Block $block) : self{ + //negative item type IDs are treated as block IDs + //TODO: maybe an ItemBlockIdentifier is in order? + return new self(-$block->getTypeId(), $block->getLegacyItemId(), $block->getLegacyItemMeta()); } - public function getMeta() : int{ - return $this->meta; + public function getTypeId() : int{ return $this->typeId; } + + public function getLegacyId() : int{ + return $this->legacyId; + } + + public function getLegacyMeta() : int{ + return $this->legacyMeta; } } diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php index d09a7d76d0..d137ee9940 100644 --- a/src/item/ItemIdentifierFlattened.php +++ b/src/item/ItemIdentifierFlattened.php @@ -24,19 +24,18 @@ declare(strict_types=1); namespace pocketmine\item; final class ItemIdentifierFlattened extends ItemIdentifier{ - /** - * @param int[] $additionalIds + * @param int[] $additionalLegacyIds */ - public function __construct(int $id, int $meta, private array $additionalIds){ - parent::__construct($id, $meta); + public function __construct(int $typeId, int $legacyId, int $legacyMeta, private array $additionalLegacyIds){ + parent::__construct($typeId, $legacyId, $legacyMeta); } /** @return int[] */ - public function getAdditionalIds() : array{ return $this->additionalIds; } + public function getAdditionalLegacyIds() : array{ return $this->additionalLegacyIds; } /** @return int[] */ - public function getAllIds() : array{ - return [$this->getId(), ...$this->additionalIds]; + public function getAllLegacyIds() : array{ + return [$this->getLegacyId(), ...$this->additionalLegacyIds]; } } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php new file mode 100644 index 0000000000..043414fd99 --- /dev/null +++ b/src/item/ItemTypeIds.php @@ -0,0 +1,270 @@ + Date: Wed, 29 Jun 2022 15:17:16 +0100 Subject: [PATCH 0189/1858] Fixed durability handling (ish) --- src/data/bedrock/item/ItemDeserializer.php | 14 ++++++++++++- src/item/Durable.php | 11 +++++++---- src/network/mcpe/convert/TypeConverter.php | 23 ---------------------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 95db05d911..b48da118d7 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -36,9 +36,12 @@ use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; +use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\VanillaItems as Items; +use pocketmine\nbt\NbtException; use pocketmine\utils\AssumptionFailedError; +use function min; final class ItemDeserializer{ /** @@ -91,7 +94,16 @@ final class ItemDeserializer{ $itemStack->setCount($data->getCount()); if(($tagTag = $data->getTypeData()->getTag()) !== null){ - $itemStack->setNamedTag(clone $tagTag); + try{ + $itemStack->setNamedTag(clone $tagTag); + }catch(NbtException $e){ + throw new ItemTypeDeserializeException("Invalid item saved NBT: " . $e->getMessage(), 0, $e); + } + } + + //TODO: this hack is necessary to get legacy tools working - we need a better way to handle this kind of stuff + if($itemStack instanceof Durable && $itemStack->getDamage() === 0 && ($damage = $data->getTypeData()->getMeta()) > 0){ + $itemStack->setDamage(min($damage, $itemStack->getMaxDurability())); } //TODO: canDestroy, canPlaceOn, wasPickedUp are currently unused diff --git a/src/item/Durable.php b/src/item/Durable.php index 0e1f202dcd..a2300576bc 100644 --- a/src/item/Durable.php +++ b/src/item/Durable.php @@ -32,10 +32,6 @@ abstract class Durable extends Item{ protected int $damage = 0; private bool $unbreakable = false; - public function getMeta() : int{ - return $this->damage; - } - /** * Returns whether this item will take damage when used. */ @@ -124,10 +120,17 @@ abstract class Durable extends Item{ protected function deserializeCompoundTag(CompoundTag $tag) : void{ parent::deserializeCompoundTag($tag); $this->unbreakable = $tag->getByte("Unbreakable", 0) !== 0; + + $damage = $tag->getInt("Damage", $this->damage); + if($damage !== $this->damage && $damage >= 0 && $damage <= $this->getMaxDurability()){ + //TODO: out-of-bounds damage should be an error + $this->setDamage($damage); + } } protected function serializeCompoundTag(CompoundTag $tag) : void{ parent::serializeCompoundTag($tag); $this->unbreakable ? $tag->setByte("Unbreakable", 1) : $tag->removeTag("Unbreakable"); + $tag->setInt("Damage", $this->damage); } } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index ec699e62ae..653ffed75e 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -38,7 +38,6 @@ use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\action\InventoryAction; use pocketmine\inventory\transaction\action\SlotChangeAction; -use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\item\ItemIds; @@ -62,8 +61,6 @@ use function get_class; class TypeConverter{ use SingletonTrait; - private const DAMAGE_TAG = "Damage"; //TAG_Int - private const DAMAGE_TAG_CONFLICT_RESOLUTION = "___Damage_ProtocolCollisionResolution___"; private const PM_ID_TAG = "___Id___"; private const PM_META_TAG = "___Meta___"; @@ -177,18 +174,6 @@ class TypeConverter{ $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; - - if($itemStack instanceof Durable && $itemStack->getDamage() > 0){ - if($nbt !== null){ - if(($existing = $nbt->getTag(self::DAMAGE_TAG)) !== null){ - $nbt->removeTag(self::DAMAGE_TAG); - $nbt->setTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION, $existing); - } - }else{ - $nbt = new CompoundTag(); - } - $nbt->setInt(self::DAMAGE_TAG, $itemStack->getDamage()); - } } return new ItemStack( @@ -228,14 +213,6 @@ class TypeConverter{ $compound->removeTag(self::PM_META_TAG); } } - if(($damageTag = $compound->getTag(self::DAMAGE_TAG)) instanceof IntTag){ - $meta = $damageTag->getValue(); - $compound->removeTag(self::DAMAGE_TAG); - if(($conflicted = $compound->getTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION)) !== null){ - $compound->removeTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION); - $compound->setTag(self::DAMAGE_TAG, $conflicted); - } - } if($compound->count() === 0){ $compound = null; } From ce6b09291a85f5a07c666b849476ba2129af237c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 15:18:11 +0100 Subject: [PATCH 0190/1858] LegacyStringToItemParser: bypass ItemFactory, use GlobalItemDataHandlers directly --- src/item/LegacyStringToItemParser.php | 34 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index 5450e0bb03..c9ea226fdd 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -23,10 +23,14 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\bedrock\item\ItemDeserializer; +use pocketmine\data\bedrock\item\ItemTypeDeserializeException; +use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; use pocketmine\data\SavedDataLoadingException; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; +use pocketmine\world\format\io\GlobalItemDataHandlers; use Webmozart\PathUtil\Path; use function explode; use function file_get_contents; @@ -52,7 +56,10 @@ final class LegacyStringToItemParser{ use SingletonTrait; private static function make() : self{ - $result = new self(ItemFactory::getInstance()); + $result = new self( + GlobalItemDataHandlers::getUpgrader(), + GlobalItemDataHandlers::getDeserializer() + ); $mappingsRaw = Utils::assumeNotFalse(@file_get_contents(Path::join(\pocketmine\RESOURCE_PATH, 'item_from_string_bc_map.json')), "Missing required resource file"); @@ -73,7 +80,10 @@ final class LegacyStringToItemParser{ */ private array $map = []; - public function __construct(private ItemFactory $itemFactory){} + public function __construct( + private ItemDataUpgrader $itemDataUpgrader, + private ItemDeserializer $itemDeserializer + ){} public function addMapping(string $alias, int $id) : void{ $this->map[$alias] = $id; @@ -109,17 +119,21 @@ final class LegacyStringToItemParser{ throw new LegacyStringToItemParserException("Unable to parse \"" . $b[1] . "\" from \"" . $input . "\" as a valid meta value"); } - if(isset($this->map[strtolower($b[0])])){ - try{ - $item = $this->itemFactory->get($this->map[strtolower($b[0])], $meta); - }catch(SavedDataLoadingException $e){ - throw new LegacyStringToItemParserException($e->getMessage(), 0, $e); - } - }else{ + $legacyId = $this->map[strtolower($b[0])] ?? null; + if($legacyId === null){ + throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); + } + try{ + $itemData = $this->itemDataUpgrader->upgradeItemTypeDataInt($legacyId, $meta, 1, null); + }catch(SavedDataLoadingException){ throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); } - return $item; + try{ + return $this->itemDeserializer->deserializeStack($itemData); + }catch(ItemTypeDeserializeException $e){ + throw new LegacyStringToItemParserException($e->getMessage(), 0, $e); + } } protected function reprocess(string $input) : string{ From ea3d5ac5630f57b9cec46771001ab83bb0ddec25 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 15:25:50 +0100 Subject: [PATCH 0191/1858] LegacyStringToItemParser: use string IDs directly this allows plugins to add their own mappings (though they should really be using StringToItemParser) without needing any legacy numeric ID bullshit in the mix. --- resources/item_from_string_bc_map.json | 3144 ++++++++++++------------ src/item/LegacyStringToItemParser.php | 18 +- 2 files changed, 1578 insertions(+), 1584 deletions(-) diff --git a/resources/item_from_string_bc_map.json b/resources/item_from_string_bc_map.json index c5c502e9a2..98699ee5be 100644 --- a/resources/item_from_string_bc_map.json +++ b/resources/item_from_string_bc_map.json @@ -1,1575 +1,1573 @@ { - "-2": -2, - "-3": -3, - "-4": -4, - "-5": -5, - "-6": -6, - "-7": -7, - "-8": -8, - "-9": -9, - "-10": -10, - "-11": -11, - "-12": -12, - "-13": -13, - "-14": -14, - "-15": -15, - "-16": -16, - "-17": -17, - "-18": -18, - "-19": -19, - "-20": -20, - "-21": -21, - "-22": -22, - "-23": -23, - "-24": -24, - "-25": -25, - "-26": -26, - "-27": -27, - "-28": -28, - "-29": -29, - "-30": -30, - "-31": -31, - "-32": -32, - "-33": -33, - "-34": -34, - "-35": -35, - "-36": -36, - "-37": -37, - "-38": -38, - "-39": -39, - "-40": -40, - "-41": -41, - "-42": -42, - "-43": -43, - "-44": -44, - "-45": -45, - "-46": -46, - "-47": -47, - "-48": -48, - "-49": -49, - "-50": -50, - "-51": -51, - "-52": -52, - "-53": -53, - "-54": -54, - "-55": -55, - "-56": -56, - "-57": -57, - "-58": -58, - "-59": -59, - "-60": -60, - "-61": -61, - "-62": -62, - "-63": -63, - "-64": -64, - "-65": -65, - "-66": -66, - "-67": -67, - "-68": -68, - "-69": -69, - "-70": -70, - "-71": -71, - "-72": -72, - "-73": -73, - "-74": -74, - "-75": -75, - "-76": -76, - "-77": -77, - "-78": -78, - "-79": -79, - "-80": -80, - "-81": -81, - "-82": -82, - "-83": -83, - "-84": -84, - "-85": -85, - "-86": -86, - "-87": -87, - "-88": -88, - "-89": -89, - "-90": -90, - "-91": -91, - "-92": -92, - "-93": -93, - "-94": -94, - "-95": -95, - "-96": -96, - "-97": -97, - "-98": -98, - "-99": -99, - "-100": -100, - "-101": -101, - "-102": -102, - "-103": -103, - "-104": -104, - "-105": -105, - "-106": -106, - "-107": -107, - "-108": -108, - "-109": -109, - "-110": -110, - "-111": -111, - "-112": -112, - "-113": -113, - "-114": -114, - "-115": -115, - "-116": -116, - "-117": -117, - "-118": -118, - "-119": -119, - "-120": -120, - "-121": -121, - "-122": -122, - "-123": -123, - "-124": -124, - "-125": -125, - "-126": -126, - "-127": -127, - "-128": -128, - "-129": -129, - "-130": -130, - "-131": -131, - "-132": -132, - "-133": -133, - "-134": -134, - "-135": -135, - "-136": -136, - "-137": -137, - "-138": -138, - "-139": -139, - "-140": -140, - "-141": -141, - "-142": -142, - "-143": -143, - "-144": -144, - "-145": -145, - "-146": -146, - "-147": -147, - "-148": -148, - "-149": -149, - "-150": -150, - "-151": -151, - "-152": -152, - "-153": -153, - "-154": -154, - "-155": -155, - "-156": -156, - "-157": -157, - "-159": -159, - "-160": -160, - "-161": -161, - "-162": -162, - "-163": -163, - "-164": -164, - "-165": -165, - "-166": -166, - "-167": -167, - "-168": -168, - "-169": -169, - "-170": -170, - "-171": -171, - "-172": -172, - "-173": -173, - "-174": -174, - "-175": -175, - "-176": -176, - "-177": -177, - "-178": -178, - "-179": -179, - "-180": -180, - "-181": -181, - "-182": -182, - "-183": -183, - "-184": -184, - "-185": -185, - "-186": -186, - "-187": -187, - "-188": -188, - "-189": -189, - "-190": -190, - "-191": -191, - "-192": -192, - "-193": -193, - "-194": -194, - "-195": -195, - "-196": -196, - "-197": -197, - "-198": -198, - "-199": -199, - "-200": -200, - "-201": -201, - "-202": -202, - "-203": -203, - "-204": -204, - "-206": -206, - "-207": -207, - "-208": -208, - "-209": -209, - "-210": -210, - "-211": -211, - "-213": -213, - "-214": -214, - "0": 0, - "1": 1, - "2": 2, - "3": 3, - "4": 4, - "5": 5, - "6": 6, - "7": 7, - "8": 8, - "9": 9, - "10": 10, - "11": 11, - "12": 12, - "13": 13, - "14": 14, - "15": 15, - "16": 16, - "17": 17, - "18": 18, - "19": 19, - "20": 20, - "21": 21, - "22": 22, - "23": 23, - "24": 24, - "25": 25, - "26": 26, - "27": 27, - "28": 28, - "29": 29, - "30": 30, - "31": 31, - "32": 32, - "33": 33, - "34": 34, - "35": 35, - "36": 36, - "37": 37, - "38": 38, - "39": 39, - "40": 40, - "41": 41, - "42": 42, - "43": 43, - "44": 44, - "45": 45, - "46": 46, - "47": 47, - "48": 48, - "49": 49, - "50": 50, - "51": 51, - "52": 52, - "53": 53, - "54": 54, - "55": 55, - "56": 56, - "57": 57, - "58": 58, - "59": 59, - "60": 60, - "61": 61, - "62": 62, - "63": 63, - "64": 64, - "65": 65, - "66": 66, - "67": 67, - "68": 68, - "69": 69, - "70": 70, - "71": 71, - "72": 72, - "73": 73, - "74": 74, - "75": 75, - "76": 76, - "77": 77, - "78": 78, - "79": 79, - "80": 80, - "81": 81, - "82": 82, - "83": 83, - "84": 84, - "85": 85, - "86": 86, - "87": 87, - "88": 88, - "89": 89, - "90": 90, - "91": 91, - "92": 92, - "93": 93, - "94": 94, - "95": 95, - "96": 96, - "97": 97, - "98": 98, - "99": 99, - "100": 100, - "101": 101, - "102": 102, - "103": 103, - "104": 104, - "105": 105, - "106": 106, - "107": 107, - "108": 108, - "109": 109, - "110": 110, - "111": 111, - "112": 112, - "113": 113, - "114": 114, - "115": 115, - "116": 116, - "117": 117, - "118": 118, - "119": 119, - "120": 120, - "121": 121, - "122": 122, - "123": 123, - "124": 124, - "125": 125, - "126": 126, - "127": 127, - "128": 128, - "129": 129, - "130": 130, - "131": 131, - "132": 132, - "133": 133, - "134": 134, - "135": 135, - "136": 136, - "137": 137, - "138": 138, - "139": 139, - "140": 140, - "141": 141, - "142": 142, - "143": 143, - "144": 144, - "145": 145, - "146": 146, - "147": 147, - "148": 148, - "149": 149, - "150": 150, - "151": 151, - "152": 152, - "153": 153, - "154": 154, - "155": 155, - "156": 156, - "157": 157, - "158": 158, - "159": 159, - "160": 160, - "161": 161, - "162": 162, - "163": 163, - "164": 164, - "165": 165, - "166": 166, - "167": 167, - "168": 168, - "169": 169, - "170": 170, - "171": 171, - "172": 172, - "173": 173, - "174": 174, - "175": 175, - "176": 176, - "177": 177, - "178": 178, - "179": 179, - "180": 180, - "181": 181, - "182": 182, - "183": 183, - "184": 184, - "185": 185, - "186": 186, - "187": 187, - "188": 188, - "189": 189, - "190": 190, - "191": 191, - "192": 192, - "193": 193, - "194": 194, - "195": 195, - "196": 196, - "197": 197, - "198": 198, - "199": 199, - "200": 200, - "201": 201, - "202": 202, - "203": 203, - "204": 204, - "205": 205, - "206": 206, - "207": 207, - "208": 208, - "209": 209, - "213": 213, - "214": 214, - "215": 215, - "216": 216, - "218": 218, - "219": 219, - "220": 220, - "221": 221, - "222": 222, - "223": 223, - "224": 224, - "225": 225, - "226": 226, - "227": 227, - "228": 228, - "229": 229, - "231": 231, - "232": 232, - "233": 233, - "234": 234, - "235": 235, - "236": 236, - "237": 237, - "238": 238, - "239": 239, - "240": 240, - "241": 241, - "243": 243, - "244": 244, - "245": 245, - "246": 246, - "247": 247, - "248": 248, - "249": 249, - "250": 250, - "251": 251, - "252": 252, - "253": 253, - "254": 254, - "255": 255, - "256": 256, - "257": 257, - "258": 258, - "259": 259, - "260": 260, - "261": 261, - "262": 262, - "263": 263, - "264": 264, - "265": 265, - "266": 266, - "267": 267, - "268": 268, - "269": 269, - "270": 270, - "271": 271, - "272": 272, - "273": 273, - "274": 274, - "275": 275, - "276": 276, - "277": 277, - "278": 278, - "279": 279, - "280": 280, - "281": 281, - "282": 282, - "283": 283, - "284": 284, - "285": 285, - "286": 286, - "287": 287, - "288": 288, - "289": 289, - "290": 290, - "291": 291, - "292": 292, - "293": 293, - "294": 294, - "295": 295, - "296": 296, - "297": 297, - "298": 298, - "299": 299, - "300": 300, - "301": 301, - "302": 302, - "303": 303, - "304": 304, - "305": 305, - "306": 306, - "307": 307, - "308": 308, - "309": 309, - "310": 310, - "311": 311, - "312": 312, - "313": 313, - "314": 314, - "315": 315, - "316": 316, - "317": 317, - "318": 318, - "319": 319, - "320": 320, - "321": 321, - "322": 322, - "323": 323, - "324": 324, - "325": 325, - "328": 328, - "329": 329, - "330": 330, - "331": 331, - "332": 332, - "333": 333, - "334": 334, - "335": 335, - "336": 336, - "337": 337, - "338": 338, - "339": 339, - "340": 340, - "341": 341, - "342": 342, - "344": 344, - "345": 345, - "346": 346, - "347": 347, - "348": 348, - "349": 349, - "350": 350, - "351": 351, - "352": 352, - "353": 353, - "354": 354, - "355": 355, - "356": 356, - "357": 357, - "358": 358, - "359": 359, - "360": 360, - "361": 361, - "362": 362, - "363": 363, - "364": 364, - "365": 365, - "366": 366, - "367": 367, - "368": 368, - "369": 369, - "370": 370, - "371": 371, - "372": 372, - "373": 373, - "374": 374, - "375": 375, - "376": 376, - "377": 377, - "378": 378, - "379": 379, - "380": 380, - "381": 381, - "382": 382, - "383": 383, - "384": 384, - "385": 385, - "386": 386, - "387": 387, - "388": 388, - "389": 389, - "390": 390, - "391": 391, - "392": 392, - "393": 393, - "394": 394, - "395": 395, - "396": 396, - "397": 397, - "398": 398, - "399": 399, - "400": 400, - "401": 401, - "402": 402, - "403": 403, - "404": 404, - "405": 405, - "406": 406, - "407": 407, - "408": 408, - "409": 409, - "410": 410, - "411": 411, - "412": 412, - "413": 413, - "414": 414, - "415": 415, - "416": 416, - "417": 417, - "418": 418, - "419": 419, - "420": 420, - "421": 421, - "422": 422, - "423": 423, - "424": 424, - "425": 425, - "426": 426, - "427": 427, - "428": 428, - "429": 429, - "430": 430, - "431": 431, - "432": 432, - "433": 433, - "434": 434, - "437": 437, - "438": 438, - "441": 441, - "442": 442, - "443": 443, - "444": 444, - "445": 445, - "446": 446, - "447": 447, - "448": 448, - "449": 449, - "450": 450, - "451": 451, - "452": 452, - "453": 453, - "455": 455, - "457": 457, - "458": 458, - "459": 459, - "460": 460, - "461": 461, - "462": 462, - "463": 463, - "464": 464, - "465": 465, - "466": 466, - "467": 467, - "468": 468, - "469": 469, - "470": 470, - "471": 471, - "472": 472, - "473": 473, - "474": 474, - "475": 475, - "476": 476, - "477": 477, - "499": 499, - "500": 500, - "501": 501, - "502": 502, - "503": 503, - "504": 504, - "505": 505, - "506": 506, - "507": 507, - "508": 508, - "509": 509, - "510": 510, - "511": 511, - "513": 513, - "acacia_button": -140, - "acacia_door": 430, - "acacia_door_block": 196, - "acacia_fence_gate": 187, - "acacia_pressure_plate": -150, - "acacia_sign": 475, - "acacia_stairs": 163, - "acacia_standing_sign": -190, - "acacia_trapdoor": -145, - "acacia_wall_sign": -191, - "acacia_wood_stairs": 163, - "acacia_wooden_stairs": 163, - "activator_rail": 126, - "active_redstone_lamp": 124, - "air": 0, - "andesite_stairs": -171, - "anvil": 145, - "apple": 260, - "apple_enchanted": 466, - "appleenchanted": 466, - "armor_stand": 425, - "arrow": 262, - "ateupd_block": 249, - "baked_potato": 393, - "baked_potatoes": 393, - "balloon": 448, - "bamboo": -163, - "bamboo_sapling": -164, - "banner": 446, - "banner_pattern": 434, - "barrel": -203, - "barrier": -161, - "beacon": 138, - "bed": 355, - "bed_block": 26, - "bedrock": 7, - "beef": 363, - "beetroot": 457, - "beetroot_block": 244, - "beetroot_seed": 458, - "beetroot_seeds": 458, - "beetroot_soup": 459, - "bell": -206, - "birch_button": -141, - "birch_door": 428, - "birch_door_block": 194, - "birch_fence_gate": 184, - "birch_pressure_plate": -151, - "birch_sign": 473, - "birch_stairs": 135, - "birch_standing_sign": -186, - "birch_trapdoor": -146, - "birch_wall_sign": -187, - "birch_wood_stairs": 135, - "birch_wooden_stairs": 135, - "black_glazed_terracotta": 235, - "blast_furnace": -196, - "blaze_powder": 377, - "blaze_rod": 369, - "bleach": 451, - "block_moved_by_piston": 250, - "blue_glazed_terracotta": 231, - "blue_ice": -11, - "boat": 333, - "bone": 352, - "bone_block": 216, - "book": 340, - "bookshelf": 47, - "bottle_o_enchanting": 384, - "bow": 261, - "bowl": 281, - "bread": 297, - "brewing_stand": 379, - "brewing_stand_block": 117, - "brick": 336, - "brick_block": 45, - "brick_stairs": 108, - "bricks": 45, - "bricks_block": 45, - "brown_glazed_terracotta": 232, - "brown_mushroom": 39, - "brown_mushroom_block": 99, - "bubble_column": -160, - "bucket": 325, - "burning_furnace": 62, - "bush": 32, - "cactus": 81, - "cake": 354, - "cake_block": 92, - "campfire": -209, - "carpet": 171, - "carrot": 391, - "carrot_block": 141, - "carrot_on_a_stick": 398, - "carrotonastick": 398, - "carrots": 141, - "cartography_table": -200, - "carved_pumpkin": -155, - "cauldron": 380, - "cauldron_block": 118, - "chain_boots": 305, - "chain_chestplate": 303, - "chain_command_block": 189, - "chain_helmet": 302, - "chain_leggings": 304, - "chainmail_boots": 305, - "chainmail_chestplate": 303, - "chainmail_helmet": 302, - "chainmail_leggings": 304, - "chemical_heat": 192, - "chemistry_table": 238, - "chest": 54, - "chest_minecart": 342, - "chicken": 365, - "chorus_flower": 200, - "chorus_fruit": 432, - "chorus_fruit_popped": 433, - "chorus_plant": 240, - "clay": 337, - "clay_ball": 337, - "clay_block": 82, - "clock": 347, - "clown_fish": 461, - "clownfish": 461, - "coal": 263, - "coal_block": 173, - "coal_ore": 16, - "cobble": 4, - "cobble_stairs": 67, - "cobble_wall": 139, - "cobblestone": 4, - "cobblestone_stairs": 67, - "cobblestone_wall": 139, - "cobweb": 30, - "cocoa": 127, - "cocoa_block": 127, - "cocoa_pods": 127, - "colored_torch_bp": 204, - "colored_torch_rg": 202, - "command_block": 137, - "command_block_minecart": 443, - "comparator": 404, - "comparator_block": 149, - "compass": 345, - "composter": -213, - "compound": 499, - "concrete": 236, - "concrete_powder": 237, - "concretepowder": 237, - "conduit": -157, - "cooked_beef": 364, - "cooked_chicken": 366, - "cooked_fish": 350, - "cooked_mutton": 424, - "cooked_porkchop": 320, - "cooked_rabbit": 412, - "cooked_salmon": 463, - "cookie": 357, - "coral": -131, - "coral_block": -132, - "coral_fan": -133, - "coral_fan_dead": -134, - "coral_fan_hang": -135, - "coral_fan_hang2": -136, - "coral_fan_hang3": -137, - "crafting_table": 58, - "crossbow": 471, - "cyan_glazed_terracotta": 229, - "dandelion": 37, - "dark_oak_button": -142, - "dark_oak_door": 431, - "dark_oak_door_block": 197, - "dark_oak_fence_gate": 186, - "dark_oak_pressure_plate": -152, - "dark_oak_stairs": 164, - "dark_oak_trapdoor": -147, - "dark_oak_wood_stairs": 164, - "dark_oak_wooden_stairs": 164, - "dark_prismarine_stairs": -3, - "darkoak_sign": 476, - "darkoak_standing_sign": -192, - "darkoak_wall_sign": -193, - "daylight_detector": 151, - "daylight_detector_inverted": 178, - "daylight_sensor": 151, - "daylight_sensor_inverted": 178, - "dead_bush": 32, - "deadbush": 32, - "detector_rail": 28, - "diamond": 264, - "diamond_axe": 279, - "diamond_block": 57, - "diamond_boots": 313, - "diamond_chestplate": 311, - "diamond_helmet": 310, - "diamond_hoe": 293, - "diamond_horse_armor": 419, - "diamond_leggings": 312, - "diamond_ore": 56, - "diamond_pickaxe": 278, - "diamond_shovel": 277, - "diamond_sword": 276, - "diorite_stairs": -170, - "dirt": 3, - "dispenser": 23, - "door_block": 64, - "double_plant": 175, - "double_red_sandstone_slab": 181, - "double_slab": 43, - "double_slabs": 43, - "double_stone_slab": 43, - "double_stone_slab2": 181, - "double_stone_slab3": -167, - "double_stone_slab4": -168, - "double_wood_slab": 157, - "double_wood_slabs": 157, - "double_wooden_slab": 157, - "double_wooden_slabs": 157, - "dragon_breath": 437, - "dragon_egg": 122, - "dried_kelp": 464, - "dried_kelp_block": -139, - "dropper": 125, - "dye": 351, - "egg": 344, - "element_0": 36, - "element_1": -12, - "element_2": -13, - "element_3": -14, - "element_4": -15, - "element_5": -16, - "element_6": -17, - "element_7": -18, - "element_8": -19, - "element_9": -20, - "element_10": -21, - "element_11": -22, - "element_12": -23, - "element_13": -24, - "element_14": -25, - "element_15": -26, - "element_16": -27, - "element_17": -28, - "element_18": -29, - "element_19": -30, - "element_20": -31, - "element_21": -32, - "element_22": -33, - "element_23": -34, - "element_24": -35, - "element_25": -36, - "element_26": -37, - "element_27": -38, - "element_28": -39, - "element_29": -40, - "element_30": -41, - "element_31": -42, - "element_32": -43, - "element_33": -44, - "element_34": -45, - "element_35": -46, - "element_36": -47, - "element_37": -48, - "element_38": -49, - "element_39": -50, - "element_40": -51, - "element_41": -52, - "element_42": -53, - "element_43": -54, - "element_44": -55, - "element_45": -56, - "element_46": -57, - "element_47": -58, - "element_48": -59, - "element_49": -60, - "element_50": -61, - "element_51": -62, - "element_52": -63, - "element_53": -64, - "element_54": -65, - "element_55": -66, - "element_56": -67, - "element_57": -68, - "element_58": -69, - "element_59": -70, - "element_60": -71, - "element_61": -72, - "element_62": -73, - "element_63": -74, - "element_64": -75, - "element_65": -76, - "element_66": -77, - "element_67": -78, - "element_68": -79, - "element_69": -80, - "element_70": -81, - "element_71": -82, - "element_72": -83, - "element_73": -84, - "element_74": -85, - "element_75": -86, - "element_76": -87, - "element_77": -88, - "element_78": -89, - "element_79": -90, - "element_80": -91, - "element_81": -92, - "element_82": -93, - "element_83": -94, - "element_84": -95, - "element_85": -96, - "element_86": -97, - "element_87": -98, - "element_88": -99, - "element_89": -100, - "element_90": -101, - "element_91": -102, - "element_92": -103, - "element_93": -104, - "element_94": -105, - "element_95": -106, - "element_96": -107, - "element_97": -108, - "element_98": -109, - "element_99": -110, - "element_100": -111, - "element_101": -112, - "element_102": -113, - "element_103": -114, - "element_104": -115, - "element_105": -116, - "element_106": -117, - "element_107": -118, - "element_108": -119, - "element_109": -120, - "element_110": -121, - "element_111": -122, - "element_112": -123, - "element_113": -124, - "element_114": -125, - "element_115": -126, - "element_116": -127, - "element_117": -128, - "element_118": -129, - "elytra": 444, - "emerald": 388, - "emerald_block": 133, - "emerald_ore": 129, - "empty_map": 395, - "emptymap": 395, - "enchant_table": 116, - "enchanted_book": 403, - "enchanted_golden_apple": 466, - "enchanting_bottle": 384, - "enchanting_table": 116, - "enchantment_table": 116, - "end_brick_stairs": -178, - "end_bricks": 206, - "end_crystal": 426, - "end_gateway": 209, - "end_portal": 119, - "end_portal_frame": 120, - "end_rod": 208, - "end_stone": 121, - "ender_chest": 130, - "ender_eye": 381, - "ender_pearl": 368, - "experience_bottle": 384, - "farmland": 60, - "feather": 288, - "fence": 85, - "fence_gate": 107, - "fence_gate_acacia": 187, - "fence_gate_birch": 184, - "fence_gate_dark_oak": 186, - "fence_gate_jungle": 185, - "fence_gate_spruce": 183, - "fermented_spider_eye": 376, - "filled_map": 358, - "fire": 51, - "fire_charge": 385, - "fireball": 385, - "fireworks": 401, - "fireworks_charge": 402, - "fireworkscharge": 402, - "fish": 349, - "fishing_rod": 346, - "fletching_table": -201, - "flint": 318, - "flint_and_steel": 259, - "flint_steel": 259, - "flower_pot": 390, - "flower_pot_block": 140, - "flowing_lava": 10, - "flowing_water": 8, - "frame": 389, - "frame_block": 199, - "frosted_ice": 207, - "furnace": 61, - "ghast_tear": 370, - "glass": 20, - "glass_bottle": 374, - "glass_pane": 102, - "glass_panel": 102, - "glistering_melon": 382, - "glow_stick": 166, - "glowing_obsidian": 246, - "glowing_redstone_ore": 74, - "glowingobsidian": 246, - "glowstone": 89, - "glowstone_block": 89, - "glowstone_dust": 348, - "gold_axe": 286, - "gold_block": 41, - "gold_boots": 317, - "gold_chestplate": 315, - "gold_helmet": 314, - "gold_hoe": 294, - "gold_horse_armor": 418, - "gold_ingot": 266, - "gold_leggings": 316, - "gold_nugget": 371, - "gold_ore": 14, - "gold_pickaxe": 285, - "gold_pressure_plate": 147, - "gold_shovel": 284, - "gold_sword": 283, - "golden_apple": 322, - "golden_axe": 286, - "golden_boots": 317, - "golden_carrot": 396, - "golden_chestplate": 315, - "golden_helmet": 314, - "golden_hoe": 294, - "golden_horse_armor": 418, - "golden_leggings": 316, - "golden_nugget": 371, - "golden_pickaxe": 285, - "golden_rail": 27, - "golden_shovel": 284, - "golden_sword": 283, - "granite_stairs": -169, - "grass": 2, - "grass_path": 198, - "gravel": 13, - "gray_glazed_terracotta": 227, - "green_glazed_terracotta": 233, - "grindstone": -195, - "gunpowder": 289, - "hard_glass": 253, - "hard_glass_pane": 190, - "hard_stained_glass": 254, - "hard_stained_glass_pane": 191, - "hardened_clay": 172, - "hay_bale": 170, - "hay_block": 170, - "heart_of_the_sea": 467, - "heavy_weighted_pressure_plate": 148, - "hopper": 410, - "hopper_block": 154, - "hopper_minecart": 408, - "horse_armor_diamond": 419, - "horse_armor_gold": 418, - "horse_armor_iron": 417, - "horse_armor_leather": 416, - "horsearmordiamond": 419, - "horsearmorgold": 418, - "horsearmoriron": 417, - "horsearmorleather": 416, - "ice": 79, - "ice_bomb": 453, - "inactive_redstone_lamp": 123, - "info_reserved6": 255, - "info_update": 248, - "info_update2": 249, - "inverted_daylight_sensor": 178, - "invisible_bedrock": 95, - "invisiblebedrock": 95, - "iron_axe": 258, - "iron_bar": 101, - "iron_bars": 101, - "iron_block": 42, - "iron_boots": 309, - "iron_chestplate": 307, - "iron_door": 330, - "iron_door_block": 71, - "iron_helmet": 306, - "iron_hoe": 292, - "iron_horse_armor": 417, - "iron_ingot": 265, - "iron_leggings": 308, - "iron_nugget": 452, - "iron_ore": 15, - "iron_pickaxe": 257, - "iron_pressure_plate": 148, - "iron_shovel": 256, - "iron_sword": 267, - "iron_trapdoor": 167, - "item_frame": 389, - "item_frame_block": 199, - "jack_o_lantern": 91, - "jigsaw": -211, - "jukebox": 84, - "jungle_button": -143, - "jungle_door": 429, - "jungle_door_block": 195, - "jungle_fence_gate": 185, - "jungle_pressure_plate": -153, - "jungle_sign": 474, - "jungle_stairs": 136, - "jungle_standing_sign": -188, - "jungle_trapdoor": -148, - "jungle_wall_sign": -189, - "kelp": 335, - "kelp_block": -138, - "ladder": 65, - "lantern": -208, - "lapis_block": 22, - "lapis_ore": 21, - "lava": 11, - "lava_cauldron": -210, - "lead": 420, - "leash": 420, - "leather": 334, - "leather_boots": 301, - "leather_cap": 298, - "leather_chestplate": 299, - "leather_helmet": 298, - "leather_horse_armor": 416, - "leather_leggings": 300, - "leather_pants": 300, - "leather_tunic": 299, - "leave": 18, - "leave2": 161, - "leaves": 18, - "leaves2": 161, - "lectern": -194, - "lever": 69, - "light_blue_glazed_terracotta": 223, - "light_weighted_pressure_plate": 147, - "lily_pad": 111, - "lime_glazed_terracotta": 225, - "lingering_potion": 441, - "lit_blast_furnace": -214, - "lit_furnace": 62, - "lit_pumpkin": 91, - "lit_redstone_lamp": 124, - "lit_redstone_ore": 74, - "lit_redstone_torch": 76, - "lit_smoker": -199, - "log": 17, - "log2": 162, - "loom": -204, - "magenta_glazed_terracotta": 222, - "magma": 213, - "magma_cream": 378, - "map": 395, - "medicine": 447, - "melon": 360, - "melon_block": 103, - "melon_seeds": 362, - "melon_slice": 360, - "melon_stem": 105, - "minecart": 328, - "minecart_with_chest": 342, - "minecart_with_command_block": 443, - "minecart_with_hopper": 408, - "minecart_with_tnt": 407, - "mob_head": 397, - "mob_head_block": 144, - "mob_spawner": 52, - "monster_egg": 97, - "monster_egg_block": 97, - "monster_spawner": 52, - "moss_stone": 48, - "mossy_cobblestone": 48, - "mossy_cobblestone_stairs": -179, - "mossy_stone": 48, - "mossy_stone_brick_stairs": -175, - "moving_block": 250, - "movingblock": 250, - "mushroom_stew": 282, - "mutton": 423, - "mutton_cooked": 424, - "mutton_raw": 423, - "muttoncooked": 424, - "muttonraw": 423, - "mycelium": 110, - "name_tag": 421, - "nametag": 421, - "nautilus_shell": 465, - "nether_brick": 405, - "nether_brick_block": 112, - "nether_brick_fence": 113, - "nether_brick_stairs": 114, - "nether_bricks": 112, - "nether_bricks_stairs": 114, - "nether_quartz": 406, - "nether_quartz_ore": 153, - "nether_reactor": 247, - "nether_star": 399, - "nether_wart": 372, - "nether_wart_block": 214, - "nether_wart_plant": 115, - "netherbrick": 405, - "netherrack": 87, - "netherreactor": 247, - "netherstar": 399, - "normal_stone_stairs": -180, - "note_block": 25, - "noteblock": 25, - "oak_door": 324, - "oak_door_block": 64, - "oak_fence_gate": 107, - "oak_stairs": 53, - "oak_wood_stairs": 53, - "oak_wooden_stairs": 53, - "observer": 251, - "obsidian": 49, - "orange_glazed_terracotta": 221, - "packed_ice": 174, - "painting": 321, - "paper": 339, - "phantom_membrane": 470, - "pink_glazed_terracotta": 226, - "piston": 33, - "piston_arm_collision": 34, - "piston_head": 34, - "pistonarmcollision": 34, - "plank": 5, - "planks": 5, - "podzol": 243, - "poisonous_potato": 394, - "polished_andesite_stairs": -174, - "polished_diorite_stairs": -173, - "polished_granite_stairs": -172, - "poppy": 38, - "porkchop": 319, - "portal": 90, - "portal_block": 90, - "potato": 392, - "potato_block": 142, - "potatoes": 142, - "potion": 373, - "powered_comparator": 150, - "powered_comparator_block": 150, - "powered_rail": 27, - "powered_repeater": 94, - "powered_repeater_block": 94, - "prismarine": 168, - "prismarine_bricks_stairs": -4, - "prismarine_crystals": 422, - "prismarine_shard": 409, - "prismarine_stairs": -2, - "puffer_fish": 462, - "pufferfish": 462, - "pumpkin": 86, - "pumpkin_pie": 400, - "pumpkin_seeds": 361, - "pumpkin_stem": 104, - "purple_glazed_terracotta": 219, - "purpur_block": 201, - "purpur_stairs": 203, - "quartz": 406, - "quartz_block": 155, - "quartz_ore": 153, - "quartz_stairs": 156, - "rabbit": 411, - "rabbit_foot": 414, - "rabbit_hide": 415, - "rabbit_stew": 413, - "rail": 66, - "rapid_fertilizer": 449, - "raw_beef": 363, - "raw_chicken": 365, - "raw_fish": 349, - "raw_mutton": 423, - "raw_porkchop": 319, - "raw_rabbit": 411, - "raw_salmon": 460, - "record_11": 510, - "record_13": 500, - "record_blocks": 502, - "record_cat": 501, - "record_chirp": 503, - "record_far": 504, - "record_mall": 505, - "record_mellohi": 506, - "record_stal": 507, - "record_strad": 508, - "record_wait": 511, - "record_ward": 509, - "red_flower": 38, - "red_glazed_terracotta": 234, - "red_mushroom": 40, - "red_mushroom_block": 100, - "red_nether_brick": 215, - "red_nether_brick_stairs": -184, - "red_sandstone": 179, - "red_sandstone_slab": 182, - "red_sandstone_stairs": 180, - "redstone": 331, - "redstone_block": 152, - "redstone_dust": 331, - "redstone_lamp": 123, - "redstone_ore": 73, - "redstone_torch": 76, - "redstone_wire": 55, - "reeds": 338, - "reeds_block": 83, - "repeater": 356, - "repeater_block": 93, - "repeating_command_block": 188, - "reserved6": 255, - "rose": 38, - "rotten_flesh": 367, - "saddle": 329, - "salmon": 460, - "sand": 12, - "sandstone": 24, - "sandstone_stairs": 128, - "sapling": 6, - "scaffolding": -165, - "sea_lantern": 169, - "sea_pickle": -156, - "seagrass": -130, - "sealantern": 169, - "seeds": 295, - "shears": 359, - "shield": 513, - "shulker_box": 218, - "shulker_shell": 445, - "sign": 323, - "sign_post": 63, - "silver_glazed_terracotta": 228, - "skull": 397, - "skull_block": 144, - "slab": 44, - "slabs": 44, - "slime": 165, - "slime_ball": 341, - "slime_block": 165, - "slimeball": 341, - "smithing_table": -202, - "smoker": -198, - "smooth_quartz_stairs": -185, - "smooth_red_sandstone_stairs": -176, - "smooth_sandstone_stairs": -177, - "smooth_stone": -183, - "snow": 80, - "snow_block": 80, - "snow_layer": 78, - "snowball": 332, - "soul_sand": 88, - "sparkler": 442, - "spawn_egg": 383, - "speckled_melon": 382, - "spider_eye": 375, - "splash_potion": 438, - "sponge": 19, - "spruce_button": -144, - "spruce_door": 427, - "spruce_door_block": 193, - "spruce_fence_gate": 183, - "spruce_pressure_plate": -154, - "spruce_sign": 472, - "spruce_stairs": 134, - "spruce_standing_sign": -181, - "spruce_trapdoor": -149, - "spruce_wall_sign": -182, - "spruce_wood_stairs": 134, - "spruce_wooden_stairs": 134, - "stained_clay": 159, - "stained_glass": 241, - "stained_glass_pane": 160, - "stained_hardened_clay": 159, - "standing_banner": 176, - "standing_sign": 63, - "steak": 364, - "stick": 280, - "sticks": 280, - "sticky_piston": 29, - "still_lava": 11, - "still_water": 9, - "stone": 1, - "stone_axe": 275, - "stone_brick": 98, - "stone_brick_stairs": 109, - "stone_bricks": 98, - "stone_button": 77, - "stone_hoe": 291, - "stone_pickaxe": 274, - "stone_pressure_plate": 70, - "stone_shovel": 273, - "stone_slab": 44, - "stone_slab2": 182, - "stone_slab3": -162, - "stone_slab4": -166, - "stone_stairs": 67, - "stone_sword": 272, - "stone_wall": 139, - "stonebrick": 98, - "stonecutter": 245, - "stonecutter_block": -197, - "string": 287, - "stripped_acacia_log": -8, - "stripped_birch_log": -6, - "stripped_dark_oak_log": -9, - "stripped_jungle_log": -7, - "stripped_oak_log": -10, - "stripped_spruce_log": -5, - "structure_block": 252, - "sugar": 353, - "sugar_cane": 338, - "sugar_canes": 338, - "sugarcane": 338, - "sugarcane_block": 83, - "sweet_berries": 477, - "sweet_berry_bush": -207, - "tall_grass": 31, - "tallgrass": 31, - "terracotta": 159, - "tnt": 46, - "tnt_minecart": 407, - "torch": 50, - "totem": 450, - "trapdoor": 96, - "trapped_chest": 146, - "trident": 455, - "trip_wire": 132, - "tripwire": 132, - "tripwire_hook": 131, - "trunk": 5, - "trunk2": 162, - "turtle_egg": -159, - "turtle_helmet": 469, - "turtle_shell_piece": 468, - "underwater_torch": 239, - "undyed_shulker_box": 205, - "unlit_redstone_torch": 75, - "unpowered_comparator": 149, - "unpowered_comparator_block": 149, - "unpowered_repeater": 93, - "unpowered_repeater_block": 93, - "update_block": 248, - "vine": 106, - "vines": 106, - "wall_banner": 177, - "wall_sign": 68, - "water": 9, - "water_lily": 111, - "waterlily": 111, - "web": 30, - "weighted_pressure_plate_heavy": 148, - "weighted_pressure_plate_light": 147, - "wheat": 296, - "wheat_block": 59, - "wheat_seeds": 295, - "white_glazed_terracotta": 220, - "wood": 17, - "wood2": 162, - "wood_door_block": 64, - "wood_slab": 158, - "wood_slabs": 158, - "wood_stairs": 53, - "wooden_axe": 271, - "wooden_button": 143, - "wooden_door": 324, - "wooden_door_block": 64, - "wooden_hoe": 290, - "wooden_pickaxe": 270, - "wooden_plank": 5, - "wooden_planks": 5, - "wooden_pressure_plate": 72, - "wooden_shovel": 269, - "wooden_slab": 158, - "wooden_slabs": 158, - "wooden_stairs": 53, - "wooden_sword": 268, - "wooden_trapdoor": 96, - "wool": 35, - "workbench": 58, - "writable_book": 386, - "written_book": 387, - "yellow_flower": 37, - "yellow_glazed_terracotta": 224 + "-2": "minecraft:prismarine_stairs", + "-3": "minecraft:dark_prismarine_stairs", + "-4": "minecraft:prismarine_bricks_stairs", + "-5": "minecraft:stripped_spruce_log", + "-6": "minecraft:stripped_birch_log", + "-7": "minecraft:stripped_jungle_log", + "-8": "minecraft:stripped_acacia_log", + "-9": "minecraft:stripped_dark_oak_log", + "-10": "minecraft:stripped_oak_log", + "-11": "minecraft:blue_ice", + "-12": "minecraft:element_1", + "-13": "minecraft:element_2", + "-14": "minecraft:element_3", + "-15": "minecraft:element_4", + "-16": "minecraft:element_5", + "-17": "minecraft:element_6", + "-18": "minecraft:element_7", + "-19": "minecraft:element_8", + "-20": "minecraft:element_9", + "-21": "minecraft:element_10", + "-22": "minecraft:element_11", + "-23": "minecraft:element_12", + "-24": "minecraft:element_13", + "-25": "minecraft:element_14", + "-26": "minecraft:element_15", + "-27": "minecraft:element_16", + "-28": "minecraft:element_17", + "-29": "minecraft:element_18", + "-30": "minecraft:element_19", + "-31": "minecraft:element_20", + "-32": "minecraft:element_21", + "-33": "minecraft:element_22", + "-34": "minecraft:element_23", + "-35": "minecraft:element_24", + "-36": "minecraft:element_25", + "-37": "minecraft:element_26", + "-38": "minecraft:element_27", + "-39": "minecraft:element_28", + "-40": "minecraft:element_29", + "-41": "minecraft:element_30", + "-42": "minecraft:element_31", + "-43": "minecraft:element_32", + "-44": "minecraft:element_33", + "-45": "minecraft:element_34", + "-46": "minecraft:element_35", + "-47": "minecraft:element_36", + "-48": "minecraft:element_37", + "-49": "minecraft:element_38", + "-50": "minecraft:element_39", + "-51": "minecraft:element_40", + "-52": "minecraft:element_41", + "-53": "minecraft:element_42", + "-54": "minecraft:element_43", + "-55": "minecraft:element_44", + "-56": "minecraft:element_45", + "-57": "minecraft:element_46", + "-58": "minecraft:element_47", + "-59": "minecraft:element_48", + "-60": "minecraft:element_49", + "-61": "minecraft:element_50", + "-62": "minecraft:element_51", + "-63": "minecraft:element_52", + "-64": "minecraft:element_53", + "-65": "minecraft:element_54", + "-66": "minecraft:element_55", + "-67": "minecraft:element_56", + "-68": "minecraft:element_57", + "-69": "minecraft:element_58", + "-70": "minecraft:element_59", + "-71": "minecraft:element_60", + "-72": "minecraft:element_61", + "-73": "minecraft:element_62", + "-74": "minecraft:element_63", + "-75": "minecraft:element_64", + "-76": "minecraft:element_65", + "-77": "minecraft:element_66", + "-78": "minecraft:element_67", + "-79": "minecraft:element_68", + "-80": "minecraft:element_69", + "-81": "minecraft:element_70", + "-82": "minecraft:element_71", + "-83": "minecraft:element_72", + "-84": "minecraft:element_73", + "-85": "minecraft:element_74", + "-86": "minecraft:element_75", + "-87": "minecraft:element_76", + "-88": "minecraft:element_77", + "-89": "minecraft:element_78", + "-90": "minecraft:element_79", + "-91": "minecraft:element_80", + "-92": "minecraft:element_81", + "-93": "minecraft:element_82", + "-94": "minecraft:element_83", + "-95": "minecraft:element_84", + "-96": "minecraft:element_85", + "-97": "minecraft:element_86", + "-98": "minecraft:element_87", + "-99": "minecraft:element_88", + "-100": "minecraft:element_89", + "-101": "minecraft:element_90", + "-102": "minecraft:element_91", + "-103": "minecraft:element_92", + "-104": "minecraft:element_93", + "-105": "minecraft:element_94", + "-106": "minecraft:element_95", + "-107": "minecraft:element_96", + "-108": "minecraft:element_97", + "-109": "minecraft:element_98", + "-110": "minecraft:element_99", + "-111": "minecraft:element_100", + "-112": "minecraft:element_101", + "-113": "minecraft:element_102", + "-114": "minecraft:element_103", + "-115": "minecraft:element_104", + "-116": "minecraft:element_105", + "-117": "minecraft:element_106", + "-118": "minecraft:element_107", + "-119": "minecraft:element_108", + "-120": "minecraft:element_109", + "-121": "minecraft:element_110", + "-122": "minecraft:element_111", + "-123": "minecraft:element_112", + "-124": "minecraft:element_113", + "-125": "minecraft:element_114", + "-126": "minecraft:element_115", + "-127": "minecraft:element_116", + "-128": "minecraft:element_117", + "-129": "minecraft:element_118", + "-130": "minecraft:seagrass", + "-131": "minecraft:coral", + "-132": "minecraft:coral_block", + "-133": "minecraft:coral_fan", + "-134": "minecraft:coral_fan_dead", + "-135": "minecraft:coral_fan_hang", + "-136": "minecraft:coral_fan_hang2", + "-137": "minecraft:coral_fan_hang3", + "-138": "minecraft:item.kelp", + "-139": "minecraft:dried_kelp_block", + "-140": "minecraft:acacia_button", + "-141": "minecraft:birch_button", + "-142": "minecraft:dark_oak_button", + "-143": "minecraft:jungle_button", + "-144": "minecraft:spruce_button", + "-145": "minecraft:acacia_trapdoor", + "-146": "minecraft:birch_trapdoor", + "-147": "minecraft:dark_oak_trapdoor", + "-148": "minecraft:jungle_trapdoor", + "-149": "minecraft:spruce_trapdoor", + "-150": "minecraft:acacia_pressure_plate", + "-151": "minecraft:birch_pressure_plate", + "-152": "minecraft:dark_oak_pressure_plate", + "-153": "minecraft:jungle_pressure_plate", + "-154": "minecraft:spruce_pressure_plate", + "-155": "minecraft:carved_pumpkin", + "-156": "minecraft:sea_pickle", + "-157": "minecraft:conduit", + "-159": "minecraft:turtle_egg", + "-160": "minecraft:bubble_column", + "-161": "minecraft:barrier", + "-162": "minecraft:double_stone_slab3", + "-163": "minecraft:bamboo", + "-164": "minecraft:bamboo_sapling", + "-165": "minecraft:scaffolding", + "-166": "minecraft:double_stone_slab4", + "-167": "minecraft:real_double_stone_slab3", + "-168": "minecraft:real_double_stone_slab4", + "-169": "minecraft:granite_stairs", + "-170": "minecraft:diorite_stairs", + "-171": "minecraft:andesite_stairs", + "-172": "minecraft:polished_granite_stairs", + "-173": "minecraft:polished_diorite_stairs", + "-174": "minecraft:polished_andesite_stairs", + "-175": "minecraft:mossy_stone_brick_stairs", + "-176": "minecraft:smooth_red_sandstone_stairs", + "-177": "minecraft:smooth_sandstone_stairs", + "-178": "minecraft:end_brick_stairs", + "-179": "minecraft:mossy_cobblestone_stairs", + "-180": "minecraft:normal_stone_stairs", + "-181": "minecraft:spruce_standing_sign", + "-182": "minecraft:spruce_wall_sign", + "-183": "minecraft:smooth_stone", + "-184": "minecraft:red_nether_brick_stairs", + "-185": "minecraft:smooth_quartz_stairs", + "-186": "minecraft:birch_standing_sign", + "-187": "minecraft:birch_wall_sign", + "-188": "minecraft:jungle_standing_sign", + "-189": "minecraft:jungle_wall_sign", + "-190": "minecraft:acacia_standing_sign", + "-191": "minecraft:acacia_wall_sign", + "-192": "minecraft:darkoak_standing_sign", + "-193": "minecraft:darkoak_wall_sign", + "-194": "minecraft:lectern", + "-195": "minecraft:grindstone", + "-196": "minecraft:blast_furnace", + "-197": "minecraft:stonecutter_block", + "-198": "minecraft:smoker", + "-199": "minecraft:lit_smoker", + "-200": "minecraft:cartography_table", + "-201": "minecraft:fletching_table", + "-202": "minecraft:smithing_table", + "-203": "minecraft:barrel", + "-204": "minecraft:loom", + "-206": "minecraft:bell", + "-207": "minecraft:sweet_berry_bush", + "-208": "minecraft:lantern", + "-209": "minecraft:item.campfire", + "-210": "minecraft:lava_cauldron", + "-211": "minecraft:jigsaw", + "-213": "minecraft:composter", + "-214": "minecraft:lit_blast_furnace", + "1": "minecraft:stone", + "2": "minecraft:grass", + "3": "minecraft:dirt", + "4": "minecraft:cobblestone", + "5": "minecraft:planks", + "6": "minecraft:sapling", + "7": "minecraft:bedrock", + "8": "minecraft:flowing_water", + "9": "minecraft:water", + "10": "minecraft:flowing_lava", + "11": "minecraft:lava", + "12": "minecraft:sand", + "13": "minecraft:gravel", + "14": "minecraft:gold_ore", + "15": "minecraft:iron_ore", + "16": "minecraft:coal_ore", + "17": "minecraft:log", + "18": "minecraft:leaves", + "19": "minecraft:sponge", + "20": "minecraft:glass", + "21": "minecraft:lapis_ore", + "22": "minecraft:lapis_block", + "23": "minecraft:dispenser", + "24": "minecraft:sandstone", + "25": "minecraft:noteblock", + "26": "minecraft:item.bed", + "27": "minecraft:golden_rail", + "28": "minecraft:detector_rail", + "29": "minecraft:sticky_piston", + "30": "minecraft:web", + "31": "minecraft:tallgrass", + "32": "minecraft:deadbush", + "33": "minecraft:piston", + "34": "minecraft:pistonarmcollision", + "35": "minecraft:wool", + "36": "minecraft:element_0", + "37": "minecraft:yellow_flower", + "38": "minecraft:red_flower", + "39": "minecraft:brown_mushroom", + "40": "minecraft:red_mushroom", + "41": "minecraft:gold_block", + "42": "minecraft:iron_block", + "43": "minecraft:real_double_stone_slab", + "44": "minecraft:double_stone_slab", + "45": "minecraft:brick_block", + "46": "minecraft:tnt", + "47": "minecraft:bookshelf", + "48": "minecraft:mossy_cobblestone", + "49": "minecraft:obsidian", + "50": "minecraft:torch", + "51": "minecraft:fire", + "52": "minecraft:mob_spawner", + "53": "minecraft:oak_stairs", + "54": "minecraft:chest", + "55": "minecraft:redstone_wire", + "56": "minecraft:diamond_ore", + "57": "minecraft:diamond_block", + "58": "minecraft:crafting_table", + "59": "minecraft:item.wheat", + "60": "minecraft:farmland", + "61": "minecraft:furnace", + "62": "minecraft:lit_furnace", + "63": "minecraft:standing_sign", + "64": "minecraft:item.wooden_door", + "65": "minecraft:ladder", + "66": "minecraft:rail", + "67": "minecraft:stone_stairs", + "68": "minecraft:wall_sign", + "69": "minecraft:lever", + "70": "minecraft:stone_pressure_plate", + "71": "minecraft:item.iron_door", + "72": "minecraft:wooden_pressure_plate", + "73": "minecraft:redstone_ore", + "74": "minecraft:lit_redstone_ore", + "75": "minecraft:unlit_redstone_torch", + "76": "minecraft:redstone_torch", + "77": "minecraft:stone_button", + "78": "minecraft:snow_layer", + "79": "minecraft:ice", + "80": "minecraft:snow", + "81": "minecraft:cactus", + "82": "minecraft:clay", + "83": "minecraft:item.reeds", + "84": "minecraft:jukebox", + "85": "minecraft:fence", + "86": "minecraft:pumpkin", + "87": "minecraft:netherrack", + "88": "minecraft:soul_sand", + "89": "minecraft:glowstone", + "90": "minecraft:portal", + "91": "minecraft:lit_pumpkin", + "92": "minecraft:item.cake", + "93": "minecraft:unpowered_repeater", + "94": "minecraft:powered_repeater", + "95": "minecraft:invisiblebedrock", + "96": "minecraft:trapdoor", + "97": "minecraft:monster_egg", + "98": "minecraft:stonebrick", + "99": "minecraft:brown_mushroom_block", + "100": "minecraft:red_mushroom_block", + "101": "minecraft:iron_bars", + "102": "minecraft:glass_pane", + "103": "minecraft:melon_block", + "104": "minecraft:pumpkin_stem", + "105": "minecraft:melon_stem", + "106": "minecraft:vine", + "107": "minecraft:fence_gate", + "108": "minecraft:brick_stairs", + "109": "minecraft:stone_brick_stairs", + "110": "minecraft:mycelium", + "111": "minecraft:waterlily", + "112": "minecraft:nether_brick", + "113": "minecraft:nether_brick_fence", + "114": "minecraft:nether_brick_stairs", + "115": "minecraft:item.nether_wart", + "116": "minecraft:enchanting_table", + "117": "minecraft:brewingstandblock", + "118": "minecraft:item.cauldron", + "119": "minecraft:end_portal", + "120": "minecraft:end_portal_frame", + "121": "minecraft:end_stone", + "122": "minecraft:dragon_egg", + "123": "minecraft:redstone_lamp", + "124": "minecraft:lit_redstone_lamp", + "125": "minecraft:dropper", + "126": "minecraft:activator_rail", + "127": "minecraft:cocoa", + "128": "minecraft:sandstone_stairs", + "129": "minecraft:emerald_ore", + "130": "minecraft:ender_chest", + "131": "minecraft:tripwire_hook", + "132": "minecraft:tripwire", + "133": "minecraft:emerald_block", + "134": "minecraft:spruce_stairs", + "135": "minecraft:birch_stairs", + "136": "minecraft:jungle_stairs", + "137": "minecraft:command_block", + "138": "minecraft:beacon", + "139": "minecraft:cobblestone_wall", + "140": "minecraft:item.flower_pot", + "141": "minecraft:carrots", + "142": "minecraft:potatoes", + "143": "minecraft:wooden_button", + "144": "minecraft:item.skull", + "145": "minecraft:anvil", + "146": "minecraft:trapped_chest", + "147": "minecraft:light_weighted_pressure_plate", + "148": "minecraft:heavy_weighted_pressure_plate", + "149": "minecraft:unpowered_comparator", + "150": "minecraft:powered_comparator", + "151": "minecraft:daylight_detector", + "152": "minecraft:redstone_block", + "153": "minecraft:quartz_ore", + "154": "minecraft:item.hopper", + "155": "minecraft:quartz_block", + "156": "minecraft:quartz_stairs", + "157": "minecraft:double_wooden_slab", + "158": "minecraft:wooden_slab", + "159": "minecraft:stained_hardened_clay", + "160": "minecraft:stained_glass_pane", + "161": "minecraft:leaves2", + "162": "minecraft:log2", + "163": "minecraft:acacia_stairs", + "164": "minecraft:dark_oak_stairs", + "165": "minecraft:slime", + "166": "minecraft:glow_stick", + "167": "minecraft:iron_trapdoor", + "168": "minecraft:prismarine", + "169": "minecraft:sealantern", + "170": "minecraft:hay_block", + "171": "minecraft:carpet", + "172": "minecraft:hardened_clay", + "173": "minecraft:coal_block", + "174": "minecraft:packed_ice", + "175": "minecraft:double_plant", + "176": "minecraft:standing_banner", + "177": "minecraft:wall_banner", + "178": "minecraft:daylight_detector_inverted", + "179": "minecraft:red_sandstone", + "180": "minecraft:red_sandstone_stairs", + "181": "minecraft:real_double_stone_slab2", + "182": "minecraft:double_stone_slab2", + "183": "minecraft:spruce_fence_gate", + "184": "minecraft:birch_fence_gate", + "185": "minecraft:jungle_fence_gate", + "186": "minecraft:dark_oak_fence_gate", + "187": "minecraft:acacia_fence_gate", + "188": "minecraft:repeating_command_block", + "189": "minecraft:chain_command_block", + "190": "minecraft:hard_glass_pane", + "191": "minecraft:hard_stained_glass_pane", + "192": "minecraft:chemical_heat", + "193": "minecraft:item.spruce_door", + "194": "minecraft:item.birch_door", + "195": "minecraft:item.jungle_door", + "196": "minecraft:item.acacia_door", + "197": "minecraft:item.dark_oak_door", + "198": "minecraft:grass_path", + "199": "minecraft:item.frame", + "200": "minecraft:chorus_flower", + "201": "minecraft:purpur_block", + "202": "minecraft:colored_torch_rg", + "203": "minecraft:purpur_stairs", + "204": "minecraft:colored_torch_bp", + "205": "minecraft:undyed_shulker_box", + "206": "minecraft:end_bricks", + "207": "minecraft:frosted_ice", + "208": "minecraft:end_rod", + "209": "minecraft:end_gateway", + "213": "minecraft:magma", + "214": "minecraft:nether_wart_block", + "215": "minecraft:red_nether_brick", + "216": "minecraft:bone_block", + "218": "minecraft:shulker_box", + "219": "minecraft:purple_glazed_terracotta", + "220": "minecraft:white_glazed_terracotta", + "221": "minecraft:orange_glazed_terracotta", + "222": "minecraft:magenta_glazed_terracotta", + "223": "minecraft:light_blue_glazed_terracotta", + "224": "minecraft:yellow_glazed_terracotta", + "225": "minecraft:lime_glazed_terracotta", + "226": "minecraft:pink_glazed_terracotta", + "227": "minecraft:gray_glazed_terracotta", + "228": "minecraft:silver_glazed_terracotta", + "229": "minecraft:cyan_glazed_terracotta", + "231": "minecraft:blue_glazed_terracotta", + "232": "minecraft:brown_glazed_terracotta", + "233": "minecraft:green_glazed_terracotta", + "234": "minecraft:red_glazed_terracotta", + "235": "minecraft:black_glazed_terracotta", + "236": "minecraft:concrete", + "237": "minecraft:concrete_powder", + "238": "minecraft:chemistry_table", + "239": "minecraft:underwater_torch", + "240": "minecraft:chorus_plant", + "241": "minecraft:stained_glass", + "243": "minecraft:podzol", + "244": "minecraft:item.beetroot", + "245": "minecraft:stonecutter", + "246": "minecraft:glowingobsidian", + "247": "minecraft:netherreactor", + "248": "minecraft:info_update", + "249": "minecraft:info_update2", + "250": "minecraft:movingblock", + "251": "minecraft:observer", + "252": "minecraft:structure_block", + "253": "minecraft:hard_glass", + "254": "minecraft:hard_stained_glass", + "255": "minecraft:reserved6", + "256": "minecraft:iron_shovel", + "257": "minecraft:iron_pickaxe", + "258": "minecraft:iron_axe", + "259": "minecraft:flint_and_steel", + "260": "minecraft:apple", + "261": "minecraft:bow", + "262": "minecraft:arrow", + "263": "minecraft:coal", + "264": "minecraft:diamond", + "265": "minecraft:iron_ingot", + "266": "minecraft:gold_ingot", + "267": "minecraft:iron_sword", + "268": "minecraft:wooden_sword", + "269": "minecraft:wooden_shovel", + "270": "minecraft:wooden_pickaxe", + "271": "minecraft:wooden_axe", + "272": "minecraft:stone_sword", + "273": "minecraft:stone_shovel", + "274": "minecraft:stone_pickaxe", + "275": "minecraft:stone_axe", + "276": "minecraft:diamond_sword", + "277": "minecraft:diamond_shovel", + "278": "minecraft:diamond_pickaxe", + "279": "minecraft:diamond_axe", + "280": "minecraft:stick", + "281": "minecraft:bowl", + "282": "minecraft:mushroom_stew", + "283": "minecraft:golden_sword", + "284": "minecraft:golden_shovel", + "285": "minecraft:golden_pickaxe", + "286": "minecraft:golden_axe", + "287": "minecraft:string", + "288": "minecraft:feather", + "289": "minecraft:gunpowder", + "290": "minecraft:wooden_hoe", + "291": "minecraft:stone_hoe", + "292": "minecraft:iron_hoe", + "293": "minecraft:diamond_hoe", + "294": "minecraft:golden_hoe", + "295": "minecraft:wheat_seeds", + "296": "minecraft:wheat", + "297": "minecraft:bread", + "298": "minecraft:leather_helmet", + "299": "minecraft:leather_chestplate", + "300": "minecraft:leather_leggings", + "301": "minecraft:leather_boots", + "302": "minecraft:chainmail_helmet", + "303": "minecraft:chainmail_chestplate", + "304": "minecraft:chainmail_leggings", + "305": "minecraft:chainmail_boots", + "306": "minecraft:iron_helmet", + "307": "minecraft:iron_chestplate", + "308": "minecraft:iron_leggings", + "309": "minecraft:iron_boots", + "310": "minecraft:diamond_helmet", + "311": "minecraft:diamond_chestplate", + "312": "minecraft:diamond_leggings", + "313": "minecraft:diamond_boots", + "314": "minecraft:golden_helmet", + "315": "minecraft:golden_chestplate", + "316": "minecraft:golden_leggings", + "317": "minecraft:golden_boots", + "318": "minecraft:flint", + "319": "minecraft:porkchop", + "320": "minecraft:cooked_porkchop", + "321": "minecraft:painting", + "322": "minecraft:golden_apple", + "323": "minecraft:sign", + "324": "minecraft:wooden_door", + "325": "minecraft:bucket", + "328": "minecraft:minecart", + "329": "minecraft:saddle", + "330": "minecraft:iron_door", + "331": "minecraft:redstone", + "332": "minecraft:snowball", + "333": "minecraft:boat", + "334": "minecraft:leather", + "335": "minecraft:kelp", + "336": "minecraft:brick", + "337": "minecraft:clay_ball", + "338": "minecraft:reeds", + "339": "minecraft:paper", + "340": "minecraft:book", + "341": "minecraft:slime_ball", + "342": "minecraft:chest_minecart", + "344": "minecraft:egg", + "345": "minecraft:compass", + "346": "minecraft:fishing_rod", + "347": "minecraft:clock", + "348": "minecraft:glowstone_dust", + "349": "minecraft:fish", + "350": "minecraft:cooked_fish", + "351": "minecraft:dye", + "352": "minecraft:bone", + "353": "minecraft:sugar", + "354": "minecraft:cake", + "355": "minecraft:bed", + "356": "minecraft:repeater", + "357": "minecraft:cookie", + "358": "minecraft:map", + "359": "minecraft:shears", + "360": "minecraft:melon", + "361": "minecraft:pumpkin_seeds", + "362": "minecraft:melon_seeds", + "363": "minecraft:beef", + "364": "minecraft:cooked_beef", + "365": "minecraft:chicken", + "366": "minecraft:cooked_chicken", + "367": "minecraft:rotten_flesh", + "368": "minecraft:ender_pearl", + "369": "minecraft:blaze_rod", + "370": "minecraft:ghast_tear", + "371": "minecraft:gold_nugget", + "372": "minecraft:nether_wart", + "373": "minecraft:potion", + "374": "minecraft:glass_bottle", + "375": "minecraft:spider_eye", + "376": "minecraft:fermented_spider_eye", + "377": "minecraft:blaze_powder", + "378": "minecraft:magma_cream", + "379": "minecraft:brewing_stand", + "380": "minecraft:cauldron", + "381": "minecraft:ender_eye", + "382": "minecraft:speckled_melon", + "383": "minecraft:spawn_egg", + "384": "minecraft:experience_bottle", + "385": "minecraft:fireball", + "386": "minecraft:writable_book", + "387": "minecraft:written_book", + "388": "minecraft:emerald", + "389": "minecraft:frame", + "390": "minecraft:flower_pot", + "391": "minecraft:carrot", + "392": "minecraft:potato", + "393": "minecraft:baked_potato", + "394": "minecraft:poisonous_potato", + "395": "minecraft:emptymap", + "396": "minecraft:golden_carrot", + "397": "minecraft:skull", + "398": "minecraft:carrotonastick", + "399": "minecraft:netherstar", + "400": "minecraft:pumpkin_pie", + "401": "minecraft:fireworks", + "402": "minecraft:fireworkscharge", + "403": "minecraft:enchanted_book", + "404": "minecraft:comparator", + "405": "minecraft:netherbrick", + "406": "minecraft:quartz", + "407": "minecraft:tnt_minecart", + "408": "minecraft:hopper_minecart", + "409": "minecraft:prismarine_shard", + "410": "minecraft:hopper", + "411": "minecraft:rabbit", + "412": "minecraft:cooked_rabbit", + "413": "minecraft:rabbit_stew", + "414": "minecraft:rabbit_foot", + "415": "minecraft:rabbit_hide", + "416": "minecraft:horsearmorleather", + "417": "minecraft:horsearmoriron", + "418": "minecraft:horsearmorgold", + "419": "minecraft:horsearmordiamond", + "420": "minecraft:lead", + "421": "minecraft:name_tag", + "422": "minecraft:prismarine_crystals", + "423": "minecraft:muttonraw", + "424": "minecraft:muttoncooked", + "425": "minecraft:armor_stand", + "426": "minecraft:end_crystal", + "427": "minecraft:spruce_door", + "428": "minecraft:birch_door", + "429": "minecraft:jungle_door", + "430": "minecraft:acacia_door", + "431": "minecraft:dark_oak_door", + "432": "minecraft:chorus_fruit", + "433": "minecraft:chorus_fruit_popped", + "434": "minecraft:banner_pattern", + "437": "minecraft:dragon_breath", + "438": "minecraft:splash_potion", + "441": "minecraft:lingering_potion", + "442": "minecraft:sparkler", + "443": "minecraft:command_block_minecart", + "444": "minecraft:elytra", + "445": "minecraft:shulker_shell", + "446": "minecraft:banner", + "447": "minecraft:medicine", + "448": "minecraft:balloon", + "449": "minecraft:rapid_fertilizer", + "450": "minecraft:totem", + "451": "minecraft:bleach", + "452": "minecraft:iron_nugget", + "453": "minecraft:ice_bomb", + "455": "minecraft:trident", + "457": "minecraft:beetroot", + "458": "minecraft:beetroot_seeds", + "459": "minecraft:beetroot_soup", + "460": "minecraft:salmon", + "461": "minecraft:clownfish", + "462": "minecraft:pufferfish", + "463": "minecraft:cooked_salmon", + "464": "minecraft:dried_kelp", + "465": "minecraft:nautilus_shell", + "466": "minecraft:appleenchanted", + "467": "minecraft:heart_of_the_sea", + "468": "minecraft:turtle_shell_piece", + "469": "minecraft:turtle_helmet", + "470": "minecraft:phantom_membrane", + "471": "minecraft:crossbow", + "472": "minecraft:spruce_sign", + "473": "minecraft:birch_sign", + "474": "minecraft:jungle_sign", + "475": "minecraft:acacia_sign", + "476": "minecraft:darkoak_sign", + "477": "minecraft:sweet_berries", + "499": "minecraft:compound", + "500": "minecraft:record_13", + "501": "minecraft:record_cat", + "502": "minecraft:record_blocks", + "503": "minecraft:record_chirp", + "504": "minecraft:record_far", + "505": "minecraft:record_mall", + "506": "minecraft:record_mellohi", + "507": "minecraft:record_stal", + "508": "minecraft:record_strad", + "509": "minecraft:record_ward", + "510": "minecraft:record_11", + "511": "minecraft:record_wait", + "513": "minecraft:shield", + "acacia_button": "minecraft:acacia_button", + "acacia_door": "minecraft:acacia_door", + "acacia_door_block": "minecraft:item.acacia_door", + "acacia_fence_gate": "minecraft:acacia_fence_gate", + "acacia_pressure_plate": "minecraft:acacia_pressure_plate", + "acacia_sign": "minecraft:acacia_sign", + "acacia_stairs": "minecraft:acacia_stairs", + "acacia_standing_sign": "minecraft:acacia_standing_sign", + "acacia_trapdoor": "minecraft:acacia_trapdoor", + "acacia_wall_sign": "minecraft:acacia_wall_sign", + "acacia_wood_stairs": "minecraft:acacia_stairs", + "acacia_wooden_stairs": "minecraft:acacia_stairs", + "activator_rail": "minecraft:activator_rail", + "active_redstone_lamp": "minecraft:lit_redstone_lamp", + "andesite_stairs": "minecraft:andesite_stairs", + "anvil": "minecraft:anvil", + "apple": "minecraft:apple", + "apple_enchanted": "minecraft:appleenchanted", + "appleenchanted": "minecraft:appleenchanted", + "armor_stand": "minecraft:armor_stand", + "arrow": "minecraft:arrow", + "ateupd_block": "minecraft:info_update2", + "baked_potato": "minecraft:baked_potato", + "baked_potatoes": "minecraft:baked_potato", + "balloon": "minecraft:balloon", + "bamboo": "minecraft:bamboo", + "bamboo_sapling": "minecraft:bamboo_sapling", + "banner": "minecraft:banner", + "banner_pattern": "minecraft:banner_pattern", + "barrel": "minecraft:barrel", + "barrier": "minecraft:barrier", + "beacon": "minecraft:beacon", + "bed": "minecraft:bed", + "bed_block": "minecraft:item.bed", + "bedrock": "minecraft:bedrock", + "beef": "minecraft:beef", + "beetroot": "minecraft:beetroot", + "beetroot_block": "minecraft:item.beetroot", + "beetroot_seed": "minecraft:beetroot_seeds", + "beetroot_seeds": "minecraft:beetroot_seeds", + "beetroot_soup": "minecraft:beetroot_soup", + "bell": "minecraft:bell", + "birch_button": "minecraft:birch_button", + "birch_door": "minecraft:birch_door", + "birch_door_block": "minecraft:item.birch_door", + "birch_fence_gate": "minecraft:birch_fence_gate", + "birch_pressure_plate": "minecraft:birch_pressure_plate", + "birch_sign": "minecraft:birch_sign", + "birch_stairs": "minecraft:birch_stairs", + "birch_standing_sign": "minecraft:birch_standing_sign", + "birch_trapdoor": "minecraft:birch_trapdoor", + "birch_wall_sign": "minecraft:birch_wall_sign", + "birch_wood_stairs": "minecraft:birch_stairs", + "birch_wooden_stairs": "minecraft:birch_stairs", + "black_glazed_terracotta": "minecraft:black_glazed_terracotta", + "blast_furnace": "minecraft:blast_furnace", + "blaze_powder": "minecraft:blaze_powder", + "blaze_rod": "minecraft:blaze_rod", + "bleach": "minecraft:bleach", + "block_moved_by_piston": "minecraft:movingblock", + "blue_glazed_terracotta": "minecraft:blue_glazed_terracotta", + "blue_ice": "minecraft:blue_ice", + "boat": "minecraft:boat", + "bone": "minecraft:bone", + "bone_block": "minecraft:bone_block", + "book": "minecraft:book", + "bookshelf": "minecraft:bookshelf", + "bottle_o_enchanting": "minecraft:experience_bottle", + "bow": "minecraft:bow", + "bowl": "minecraft:bowl", + "bread": "minecraft:bread", + "brewing_stand": "minecraft:brewing_stand", + "brewing_stand_block": "minecraft:brewingstandblock", + "brick": "minecraft:brick", + "brick_block": "minecraft:brick_block", + "brick_stairs": "minecraft:brick_stairs", + "bricks": "minecraft:brick_block", + "bricks_block": "minecraft:brick_block", + "brown_glazed_terracotta": "minecraft:brown_glazed_terracotta", + "brown_mushroom": "minecraft:brown_mushroom", + "brown_mushroom_block": "minecraft:brown_mushroom_block", + "bubble_column": "minecraft:bubble_column", + "bucket": "minecraft:bucket", + "burning_furnace": "minecraft:lit_furnace", + "bush": "minecraft:deadbush", + "cactus": "minecraft:cactus", + "cake": "minecraft:cake", + "cake_block": "minecraft:item.cake", + "campfire": "minecraft:item.campfire", + "carpet": "minecraft:carpet", + "carrot": "minecraft:carrot", + "carrot_block": "minecraft:carrots", + "carrot_on_a_stick": "minecraft:carrotonastick", + "carrotonastick": "minecraft:carrotonastick", + "carrots": "minecraft:carrots", + "cartography_table": "minecraft:cartography_table", + "carved_pumpkin": "minecraft:carved_pumpkin", + "cauldron": "minecraft:cauldron", + "cauldron_block": "minecraft:item.cauldron", + "chain_boots": "minecraft:chainmail_boots", + "chain_chestplate": "minecraft:chainmail_chestplate", + "chain_command_block": "minecraft:chain_command_block", + "chain_helmet": "minecraft:chainmail_helmet", + "chain_leggings": "minecraft:chainmail_leggings", + "chainmail_boots": "minecraft:chainmail_boots", + "chainmail_chestplate": "minecraft:chainmail_chestplate", + "chainmail_helmet": "minecraft:chainmail_helmet", + "chainmail_leggings": "minecraft:chainmail_leggings", + "chemical_heat": "minecraft:chemical_heat", + "chemistry_table": "minecraft:chemistry_table", + "chest": "minecraft:chest", + "chest_minecart": "minecraft:chest_minecart", + "chicken": "minecraft:chicken", + "chorus_flower": "minecraft:chorus_flower", + "chorus_fruit": "minecraft:chorus_fruit", + "chorus_fruit_popped": "minecraft:chorus_fruit_popped", + "chorus_plant": "minecraft:chorus_plant", + "clay": "minecraft:clay_ball", + "clay_ball": "minecraft:clay_ball", + "clay_block": "minecraft:clay", + "clock": "minecraft:clock", + "clown_fish": "minecraft:clownfish", + "clownfish": "minecraft:clownfish", + "coal": "minecraft:coal", + "coal_block": "minecraft:coal_block", + "coal_ore": "minecraft:coal_ore", + "cobble": "minecraft:cobblestone", + "cobble_stairs": "minecraft:stone_stairs", + "cobble_wall": "minecraft:cobblestone_wall", + "cobblestone": "minecraft:cobblestone", + "cobblestone_stairs": "minecraft:stone_stairs", + "cobblestone_wall": "minecraft:cobblestone_wall", + "cobweb": "minecraft:web", + "cocoa": "minecraft:cocoa", + "cocoa_block": "minecraft:cocoa", + "cocoa_pods": "minecraft:cocoa", + "colored_torch_bp": "minecraft:colored_torch_bp", + "colored_torch_rg": "minecraft:colored_torch_rg", + "command_block": "minecraft:command_block", + "command_block_minecart": "minecraft:command_block_minecart", + "comparator": "minecraft:comparator", + "comparator_block": "minecraft:unpowered_comparator", + "compass": "minecraft:compass", + "composter": "minecraft:composter", + "compound": "minecraft:compound", + "concrete": "minecraft:concrete", + "concrete_powder": "minecraft:concrete_powder", + "concretepowder": "minecraft:concrete_powder", + "conduit": "minecraft:conduit", + "cooked_beef": "minecraft:cooked_beef", + "cooked_chicken": "minecraft:cooked_chicken", + "cooked_fish": "minecraft:cooked_fish", + "cooked_mutton": "minecraft:muttoncooked", + "cooked_porkchop": "minecraft:cooked_porkchop", + "cooked_rabbit": "minecraft:cooked_rabbit", + "cooked_salmon": "minecraft:cooked_salmon", + "cookie": "minecraft:cookie", + "coral": "minecraft:coral", + "coral_block": "minecraft:coral_block", + "coral_fan": "minecraft:coral_fan", + "coral_fan_dead": "minecraft:coral_fan_dead", + "coral_fan_hang": "minecraft:coral_fan_hang", + "coral_fan_hang2": "minecraft:coral_fan_hang2", + "coral_fan_hang3": "minecraft:coral_fan_hang3", + "crafting_table": "minecraft:crafting_table", + "crossbow": "minecraft:crossbow", + "cyan_glazed_terracotta": "minecraft:cyan_glazed_terracotta", + "dandelion": "minecraft:yellow_flower", + "dark_oak_button": "minecraft:dark_oak_button", + "dark_oak_door": "minecraft:dark_oak_door", + "dark_oak_door_block": "minecraft:item.dark_oak_door", + "dark_oak_fence_gate": "minecraft:dark_oak_fence_gate", + "dark_oak_pressure_plate": "minecraft:dark_oak_pressure_plate", + "dark_oak_stairs": "minecraft:dark_oak_stairs", + "dark_oak_trapdoor": "minecraft:dark_oak_trapdoor", + "dark_oak_wood_stairs": "minecraft:dark_oak_stairs", + "dark_oak_wooden_stairs": "minecraft:dark_oak_stairs", + "dark_prismarine_stairs": "minecraft:dark_prismarine_stairs", + "darkoak_sign": "minecraft:darkoak_sign", + "darkoak_standing_sign": "minecraft:darkoak_standing_sign", + "darkoak_wall_sign": "minecraft:darkoak_wall_sign", + "daylight_detector": "minecraft:daylight_detector", + "daylight_detector_inverted": "minecraft:daylight_detector_inverted", + "daylight_sensor": "minecraft:daylight_detector", + "daylight_sensor_inverted": "minecraft:daylight_detector_inverted", + "dead_bush": "minecraft:deadbush", + "deadbush": "minecraft:deadbush", + "detector_rail": "minecraft:detector_rail", + "diamond": "minecraft:diamond", + "diamond_axe": "minecraft:diamond_axe", + "diamond_block": "minecraft:diamond_block", + "diamond_boots": "minecraft:diamond_boots", + "diamond_chestplate": "minecraft:diamond_chestplate", + "diamond_helmet": "minecraft:diamond_helmet", + "diamond_hoe": "minecraft:diamond_hoe", + "diamond_horse_armor": "minecraft:horsearmordiamond", + "diamond_leggings": "minecraft:diamond_leggings", + "diamond_ore": "minecraft:diamond_ore", + "diamond_pickaxe": "minecraft:diamond_pickaxe", + "diamond_shovel": "minecraft:diamond_shovel", + "diamond_sword": "minecraft:diamond_sword", + "diorite_stairs": "minecraft:diorite_stairs", + "dirt": "minecraft:dirt", + "dispenser": "minecraft:dispenser", + "door_block": "minecraft:item.wooden_door", + "double_plant": "minecraft:double_plant", + "double_red_sandstone_slab": "minecraft:real_double_stone_slab2", + "double_slab": "minecraft:real_double_stone_slab", + "double_slabs": "minecraft:real_double_stone_slab", + "double_stone_slab": "minecraft:real_double_stone_slab", + "double_stone_slab2": "minecraft:real_double_stone_slab2", + "double_stone_slab3": "minecraft:real_double_stone_slab3", + "double_stone_slab4": "minecraft:real_double_stone_slab4", + "double_wood_slab": "minecraft:double_wooden_slab", + "double_wood_slabs": "minecraft:double_wooden_slab", + "double_wooden_slab": "minecraft:double_wooden_slab", + "double_wooden_slabs": "minecraft:double_wooden_slab", + "dragon_breath": "minecraft:dragon_breath", + "dragon_egg": "minecraft:dragon_egg", + "dried_kelp": "minecraft:dried_kelp", + "dried_kelp_block": "minecraft:dried_kelp_block", + "dropper": "minecraft:dropper", + "dye": "minecraft:dye", + "egg": "minecraft:egg", + "element_0": "minecraft:element_0", + "element_1": "minecraft:element_1", + "element_2": "minecraft:element_2", + "element_3": "minecraft:element_3", + "element_4": "minecraft:element_4", + "element_5": "minecraft:element_5", + "element_6": "minecraft:element_6", + "element_7": "minecraft:element_7", + "element_8": "minecraft:element_8", + "element_9": "minecraft:element_9", + "element_10": "minecraft:element_10", + "element_11": "minecraft:element_11", + "element_12": "minecraft:element_12", + "element_13": "minecraft:element_13", + "element_14": "minecraft:element_14", + "element_15": "minecraft:element_15", + "element_16": "minecraft:element_16", + "element_17": "minecraft:element_17", + "element_18": "minecraft:element_18", + "element_19": "minecraft:element_19", + "element_20": "minecraft:element_20", + "element_21": "minecraft:element_21", + "element_22": "minecraft:element_22", + "element_23": "minecraft:element_23", + "element_24": "minecraft:element_24", + "element_25": "minecraft:element_25", + "element_26": "minecraft:element_26", + "element_27": "minecraft:element_27", + "element_28": "minecraft:element_28", + "element_29": "minecraft:element_29", + "element_30": "minecraft:element_30", + "element_31": "minecraft:element_31", + "element_32": "minecraft:element_32", + "element_33": "minecraft:element_33", + "element_34": "minecraft:element_34", + "element_35": "minecraft:element_35", + "element_36": "minecraft:element_36", + "element_37": "minecraft:element_37", + "element_38": "minecraft:element_38", + "element_39": "minecraft:element_39", + "element_40": "minecraft:element_40", + "element_41": "minecraft:element_41", + "element_42": "minecraft:element_42", + "element_43": "minecraft:element_43", + "element_44": "minecraft:element_44", + "element_45": "minecraft:element_45", + "element_46": "minecraft:element_46", + "element_47": "minecraft:element_47", + "element_48": "minecraft:element_48", + "element_49": "minecraft:element_49", + "element_50": "minecraft:element_50", + "element_51": "minecraft:element_51", + "element_52": "minecraft:element_52", + "element_53": "minecraft:element_53", + "element_54": "minecraft:element_54", + "element_55": "minecraft:element_55", + "element_56": "minecraft:element_56", + "element_57": "minecraft:element_57", + "element_58": "minecraft:element_58", + "element_59": "minecraft:element_59", + "element_60": "minecraft:element_60", + "element_61": "minecraft:element_61", + "element_62": "minecraft:element_62", + "element_63": "minecraft:element_63", + "element_64": "minecraft:element_64", + "element_65": "minecraft:element_65", + "element_66": "minecraft:element_66", + "element_67": "minecraft:element_67", + "element_68": "minecraft:element_68", + "element_69": "minecraft:element_69", + "element_70": "minecraft:element_70", + "element_71": "minecraft:element_71", + "element_72": "minecraft:element_72", + "element_73": "minecraft:element_73", + "element_74": "minecraft:element_74", + "element_75": "minecraft:element_75", + "element_76": "minecraft:element_76", + "element_77": "minecraft:element_77", + "element_78": "minecraft:element_78", + "element_79": "minecraft:element_79", + "element_80": "minecraft:element_80", + "element_81": "minecraft:element_81", + "element_82": "minecraft:element_82", + "element_83": "minecraft:element_83", + "element_84": "minecraft:element_84", + "element_85": "minecraft:element_85", + "element_86": "minecraft:element_86", + "element_87": "minecraft:element_87", + "element_88": "minecraft:element_88", + "element_89": "minecraft:element_89", + "element_90": "minecraft:element_90", + "element_91": "minecraft:element_91", + "element_92": "minecraft:element_92", + "element_93": "minecraft:element_93", + "element_94": "minecraft:element_94", + "element_95": "minecraft:element_95", + "element_96": "minecraft:element_96", + "element_97": "minecraft:element_97", + "element_98": "minecraft:element_98", + "element_99": "minecraft:element_99", + "element_100": "minecraft:element_100", + "element_101": "minecraft:element_101", + "element_102": "minecraft:element_102", + "element_103": "minecraft:element_103", + "element_104": "minecraft:element_104", + "element_105": "minecraft:element_105", + "element_106": "minecraft:element_106", + "element_107": "minecraft:element_107", + "element_108": "minecraft:element_108", + "element_109": "minecraft:element_109", + "element_110": "minecraft:element_110", + "element_111": "minecraft:element_111", + "element_112": "minecraft:element_112", + "element_113": "minecraft:element_113", + "element_114": "minecraft:element_114", + "element_115": "minecraft:element_115", + "element_116": "minecraft:element_116", + "element_117": "minecraft:element_117", + "element_118": "minecraft:element_118", + "elytra": "minecraft:elytra", + "emerald": "minecraft:emerald", + "emerald_block": "minecraft:emerald_block", + "emerald_ore": "minecraft:emerald_ore", + "empty_map": "minecraft:emptymap", + "emptymap": "minecraft:emptymap", + "enchant_table": "minecraft:enchanting_table", + "enchanted_book": "minecraft:enchanted_book", + "enchanted_golden_apple": "minecraft:appleenchanted", + "enchanting_bottle": "minecraft:experience_bottle", + "enchanting_table": "minecraft:enchanting_table", + "enchantment_table": "minecraft:enchanting_table", + "end_brick_stairs": "minecraft:end_brick_stairs", + "end_bricks": "minecraft:end_bricks", + "end_crystal": "minecraft:end_crystal", + "end_gateway": "minecraft:end_gateway", + "end_portal": "minecraft:end_portal", + "end_portal_frame": "minecraft:end_portal_frame", + "end_rod": "minecraft:end_rod", + "end_stone": "minecraft:end_stone", + "ender_chest": "minecraft:ender_chest", + "ender_eye": "minecraft:ender_eye", + "ender_pearl": "minecraft:ender_pearl", + "experience_bottle": "minecraft:experience_bottle", + "farmland": "minecraft:farmland", + "feather": "minecraft:feather", + "fence": "minecraft:fence", + "fence_gate": "minecraft:fence_gate", + "fence_gate_acacia": "minecraft:acacia_fence_gate", + "fence_gate_birch": "minecraft:birch_fence_gate", + "fence_gate_dark_oak": "minecraft:dark_oak_fence_gate", + "fence_gate_jungle": "minecraft:jungle_fence_gate", + "fence_gate_spruce": "minecraft:spruce_fence_gate", + "fermented_spider_eye": "minecraft:fermented_spider_eye", + "filled_map": "minecraft:map", + "fire": "minecraft:fire", + "fire_charge": "minecraft:fireball", + "fireball": "minecraft:fireball", + "fireworks": "minecraft:fireworks", + "fireworks_charge": "minecraft:fireworkscharge", + "fireworkscharge": "minecraft:fireworkscharge", + "fish": "minecraft:fish", + "fishing_rod": "minecraft:fishing_rod", + "fletching_table": "minecraft:fletching_table", + "flint": "minecraft:flint", + "flint_and_steel": "minecraft:flint_and_steel", + "flint_steel": "minecraft:flint_and_steel", + "flower_pot": "minecraft:flower_pot", + "flower_pot_block": "minecraft:item.flower_pot", + "flowing_lava": "minecraft:flowing_lava", + "flowing_water": "minecraft:flowing_water", + "frame": "minecraft:frame", + "frame_block": "minecraft:item.frame", + "frosted_ice": "minecraft:frosted_ice", + "furnace": "minecraft:furnace", + "ghast_tear": "minecraft:ghast_tear", + "glass": "minecraft:glass", + "glass_bottle": "minecraft:glass_bottle", + "glass_pane": "minecraft:glass_pane", + "glass_panel": "minecraft:glass_pane", + "glistering_melon": "minecraft:speckled_melon", + "glow_stick": "minecraft:glow_stick", + "glowing_obsidian": "minecraft:glowingobsidian", + "glowing_redstone_ore": "minecraft:lit_redstone_ore", + "glowingobsidian": "minecraft:glowingobsidian", + "glowstone": "minecraft:glowstone", + "glowstone_block": "minecraft:glowstone", + "glowstone_dust": "minecraft:glowstone_dust", + "gold_axe": "minecraft:golden_axe", + "gold_block": "minecraft:gold_block", + "gold_boots": "minecraft:golden_boots", + "gold_chestplate": "minecraft:golden_chestplate", + "gold_helmet": "minecraft:golden_helmet", + "gold_hoe": "minecraft:golden_hoe", + "gold_horse_armor": "minecraft:horsearmorgold", + "gold_ingot": "minecraft:gold_ingot", + "gold_leggings": "minecraft:golden_leggings", + "gold_nugget": "minecraft:gold_nugget", + "gold_ore": "minecraft:gold_ore", + "gold_pickaxe": "minecraft:golden_pickaxe", + "gold_pressure_plate": "minecraft:light_weighted_pressure_plate", + "gold_shovel": "minecraft:golden_shovel", + "gold_sword": "minecraft:golden_sword", + "golden_apple": "minecraft:golden_apple", + "golden_axe": "minecraft:golden_axe", + "golden_boots": "minecraft:golden_boots", + "golden_carrot": "minecraft:golden_carrot", + "golden_chestplate": "minecraft:golden_chestplate", + "golden_helmet": "minecraft:golden_helmet", + "golden_hoe": "minecraft:golden_hoe", + "golden_horse_armor": "minecraft:horsearmorgold", + "golden_leggings": "minecraft:golden_leggings", + "golden_nugget": "minecraft:gold_nugget", + "golden_pickaxe": "minecraft:golden_pickaxe", + "golden_rail": "minecraft:golden_rail", + "golden_shovel": "minecraft:golden_shovel", + "golden_sword": "minecraft:golden_sword", + "granite_stairs": "minecraft:granite_stairs", + "grass": "minecraft:grass", + "grass_path": "minecraft:grass_path", + "gravel": "minecraft:gravel", + "gray_glazed_terracotta": "minecraft:gray_glazed_terracotta", + "green_glazed_terracotta": "minecraft:green_glazed_terracotta", + "grindstone": "minecraft:grindstone", + "gunpowder": "minecraft:gunpowder", + "hard_glass": "minecraft:hard_glass", + "hard_glass_pane": "minecraft:hard_glass_pane", + "hard_stained_glass": "minecraft:hard_stained_glass", + "hard_stained_glass_pane": "minecraft:hard_stained_glass_pane", + "hardened_clay": "minecraft:hardened_clay", + "hay_bale": "minecraft:hay_block", + "hay_block": "minecraft:hay_block", + "heart_of_the_sea": "minecraft:heart_of_the_sea", + "heavy_weighted_pressure_plate": "minecraft:heavy_weighted_pressure_plate", + "hopper": "minecraft:hopper", + "hopper_block": "minecraft:item.hopper", + "hopper_minecart": "minecraft:hopper_minecart", + "horse_armor_diamond": "minecraft:horsearmordiamond", + "horse_armor_gold": "minecraft:horsearmorgold", + "horse_armor_iron": "minecraft:horsearmoriron", + "horse_armor_leather": "minecraft:horsearmorleather", + "horsearmordiamond": "minecraft:horsearmordiamond", + "horsearmorgold": "minecraft:horsearmorgold", + "horsearmoriron": "minecraft:horsearmoriron", + "horsearmorleather": "minecraft:horsearmorleather", + "ice": "minecraft:ice", + "ice_bomb": "minecraft:ice_bomb", + "inactive_redstone_lamp": "minecraft:redstone_lamp", + "info_reserved6": "minecraft:reserved6", + "info_update": "minecraft:info_update", + "info_update2": "minecraft:info_update2", + "inverted_daylight_sensor": "minecraft:daylight_detector_inverted", + "invisible_bedrock": "minecraft:invisiblebedrock", + "invisiblebedrock": "minecraft:invisiblebedrock", + "iron_axe": "minecraft:iron_axe", + "iron_bar": "minecraft:iron_bars", + "iron_bars": "minecraft:iron_bars", + "iron_block": "minecraft:iron_block", + "iron_boots": "minecraft:iron_boots", + "iron_chestplate": "minecraft:iron_chestplate", + "iron_door": "minecraft:iron_door", + "iron_door_block": "minecraft:item.iron_door", + "iron_helmet": "minecraft:iron_helmet", + "iron_hoe": "minecraft:iron_hoe", + "iron_horse_armor": "minecraft:horsearmoriron", + "iron_ingot": "minecraft:iron_ingot", + "iron_leggings": "minecraft:iron_leggings", + "iron_nugget": "minecraft:iron_nugget", + "iron_ore": "minecraft:iron_ore", + "iron_pickaxe": "minecraft:iron_pickaxe", + "iron_pressure_plate": "minecraft:heavy_weighted_pressure_plate", + "iron_shovel": "minecraft:iron_shovel", + "iron_sword": "minecraft:iron_sword", + "iron_trapdoor": "minecraft:iron_trapdoor", + "item_frame": "minecraft:frame", + "item_frame_block": "minecraft:item.frame", + "jack_o_lantern": "minecraft:lit_pumpkin", + "jigsaw": "minecraft:jigsaw", + "jukebox": "minecraft:jukebox", + "jungle_button": "minecraft:jungle_button", + "jungle_door": "minecraft:jungle_door", + "jungle_door_block": "minecraft:item.jungle_door", + "jungle_fence_gate": "minecraft:jungle_fence_gate", + "jungle_pressure_plate": "minecraft:jungle_pressure_plate", + "jungle_sign": "minecraft:jungle_sign", + "jungle_stairs": "minecraft:jungle_stairs", + "jungle_standing_sign": "minecraft:jungle_standing_sign", + "jungle_trapdoor": "minecraft:jungle_trapdoor", + "jungle_wall_sign": "minecraft:jungle_wall_sign", + "kelp": "minecraft:kelp", + "kelp_block": "minecraft:item.kelp", + "ladder": "minecraft:ladder", + "lantern": "minecraft:lantern", + "lapis_block": "minecraft:lapis_block", + "lapis_ore": "minecraft:lapis_ore", + "lava": "minecraft:lava", + "lava_cauldron": "minecraft:lava_cauldron", + "lead": "minecraft:lead", + "leash": "minecraft:lead", + "leather": "minecraft:leather", + "leather_boots": "minecraft:leather_boots", + "leather_cap": "minecraft:leather_helmet", + "leather_chestplate": "minecraft:leather_chestplate", + "leather_helmet": "minecraft:leather_helmet", + "leather_horse_armor": "minecraft:horsearmorleather", + "leather_leggings": "minecraft:leather_leggings", + "leather_pants": "minecraft:leather_leggings", + "leather_tunic": "minecraft:leather_chestplate", + "leave": "minecraft:leaves", + "leave2": "minecraft:leaves2", + "leaves": "minecraft:leaves", + "leaves2": "minecraft:leaves2", + "lectern": "minecraft:lectern", + "lever": "minecraft:lever", + "light_blue_glazed_terracotta": "minecraft:light_blue_glazed_terracotta", + "light_weighted_pressure_plate": "minecraft:light_weighted_pressure_plate", + "lily_pad": "minecraft:waterlily", + "lime_glazed_terracotta": "minecraft:lime_glazed_terracotta", + "lingering_potion": "minecraft:lingering_potion", + "lit_blast_furnace": "minecraft:lit_blast_furnace", + "lit_furnace": "minecraft:lit_furnace", + "lit_pumpkin": "minecraft:lit_pumpkin", + "lit_redstone_lamp": "minecraft:lit_redstone_lamp", + "lit_redstone_ore": "minecraft:lit_redstone_ore", + "lit_redstone_torch": "minecraft:redstone_torch", + "lit_smoker": "minecraft:lit_smoker", + "log": "minecraft:log", + "log2": "minecraft:log2", + "loom": "minecraft:loom", + "magenta_glazed_terracotta": "minecraft:magenta_glazed_terracotta", + "magma": "minecraft:magma", + "magma_cream": "minecraft:magma_cream", + "map": "minecraft:emptymap", + "medicine": "minecraft:medicine", + "melon": "minecraft:melon", + "melon_block": "minecraft:melon_block", + "melon_seeds": "minecraft:melon_seeds", + "melon_slice": "minecraft:melon", + "melon_stem": "minecraft:melon_stem", + "minecart": "minecraft:minecart", + "minecart_with_chest": "minecraft:chest_minecart", + "minecart_with_command_block": "minecraft:command_block_minecart", + "minecart_with_hopper": "minecraft:hopper_minecart", + "minecart_with_tnt": "minecraft:tnt_minecart", + "mob_head": "minecraft:skull", + "mob_head_block": "minecraft:item.skull", + "mob_spawner": "minecraft:mob_spawner", + "monster_egg": "minecraft:monster_egg", + "monster_egg_block": "minecraft:monster_egg", + "monster_spawner": "minecraft:mob_spawner", + "moss_stone": "minecraft:mossy_cobblestone", + "mossy_cobblestone": "minecraft:mossy_cobblestone", + "mossy_cobblestone_stairs": "minecraft:mossy_cobblestone_stairs", + "mossy_stone": "minecraft:mossy_cobblestone", + "mossy_stone_brick_stairs": "minecraft:mossy_stone_brick_stairs", + "moving_block": "minecraft:movingblock", + "movingblock": "minecraft:movingblock", + "mushroom_stew": "minecraft:mushroom_stew", + "mutton": "minecraft:muttonraw", + "mutton_cooked": "minecraft:muttoncooked", + "mutton_raw": "minecraft:muttonraw", + "muttoncooked": "minecraft:muttoncooked", + "muttonraw": "minecraft:muttonraw", + "mycelium": "minecraft:mycelium", + "name_tag": "minecraft:name_tag", + "nametag": "minecraft:name_tag", + "nautilus_shell": "minecraft:nautilus_shell", + "nether_brick": "minecraft:netherbrick", + "nether_brick_block": "minecraft:nether_brick", + "nether_brick_fence": "minecraft:nether_brick_fence", + "nether_brick_stairs": "minecraft:nether_brick_stairs", + "nether_bricks": "minecraft:nether_brick", + "nether_bricks_stairs": "minecraft:nether_brick_stairs", + "nether_quartz": "minecraft:quartz", + "nether_quartz_ore": "minecraft:quartz_ore", + "nether_reactor": "minecraft:netherreactor", + "nether_star": "minecraft:netherstar", + "nether_wart": "minecraft:nether_wart", + "nether_wart_block": "minecraft:nether_wart_block", + "nether_wart_plant": "minecraft:item.nether_wart", + "netherbrick": "minecraft:netherbrick", + "netherrack": "minecraft:netherrack", + "netherreactor": "minecraft:netherreactor", + "netherstar": "minecraft:netherstar", + "normal_stone_stairs": "minecraft:normal_stone_stairs", + "note_block": "minecraft:noteblock", + "noteblock": "minecraft:noteblock", + "oak_door": "minecraft:wooden_door", + "oak_door_block": "minecraft:item.wooden_door", + "oak_fence_gate": "minecraft:fence_gate", + "oak_stairs": "minecraft:oak_stairs", + "oak_wood_stairs": "minecraft:oak_stairs", + "oak_wooden_stairs": "minecraft:oak_stairs", + "observer": "minecraft:observer", + "obsidian": "minecraft:obsidian", + "orange_glazed_terracotta": "minecraft:orange_glazed_terracotta", + "packed_ice": "minecraft:packed_ice", + "painting": "minecraft:painting", + "paper": "minecraft:paper", + "phantom_membrane": "minecraft:phantom_membrane", + "pink_glazed_terracotta": "minecraft:pink_glazed_terracotta", + "piston": "minecraft:piston", + "piston_arm_collision": "minecraft:pistonarmcollision", + "piston_head": "minecraft:pistonarmcollision", + "pistonarmcollision": "minecraft:pistonarmcollision", + "plank": "minecraft:planks", + "planks": "minecraft:planks", + "podzol": "minecraft:podzol", + "poisonous_potato": "minecraft:poisonous_potato", + "polished_andesite_stairs": "minecraft:polished_andesite_stairs", + "polished_diorite_stairs": "minecraft:polished_diorite_stairs", + "polished_granite_stairs": "minecraft:polished_granite_stairs", + "poppy": "minecraft:red_flower", + "porkchop": "minecraft:porkchop", + "portal": "minecraft:portal", + "portal_block": "minecraft:portal", + "potato": "minecraft:potato", + "potato_block": "minecraft:potatoes", + "potatoes": "minecraft:potatoes", + "potion": "minecraft:potion", + "powered_comparator": "minecraft:powered_comparator", + "powered_comparator_block": "minecraft:powered_comparator", + "powered_rail": "minecraft:golden_rail", + "powered_repeater": "minecraft:powered_repeater", + "powered_repeater_block": "minecraft:powered_repeater", + "prismarine": "minecraft:prismarine", + "prismarine_bricks_stairs": "minecraft:prismarine_bricks_stairs", + "prismarine_crystals": "minecraft:prismarine_crystals", + "prismarine_shard": "minecraft:prismarine_shard", + "prismarine_stairs": "minecraft:prismarine_stairs", + "puffer_fish": "minecraft:pufferfish", + "pufferfish": "minecraft:pufferfish", + "pumpkin": "minecraft:pumpkin", + "pumpkin_pie": "minecraft:pumpkin_pie", + "pumpkin_seeds": "minecraft:pumpkin_seeds", + "pumpkin_stem": "minecraft:pumpkin_stem", + "purple_glazed_terracotta": "minecraft:purple_glazed_terracotta", + "purpur_block": "minecraft:purpur_block", + "purpur_stairs": "minecraft:purpur_stairs", + "quartz": "minecraft:quartz", + "quartz_block": "minecraft:quartz_block", + "quartz_ore": "minecraft:quartz_ore", + "quartz_stairs": "minecraft:quartz_stairs", + "rabbit": "minecraft:rabbit", + "rabbit_foot": "minecraft:rabbit_foot", + "rabbit_hide": "minecraft:rabbit_hide", + "rabbit_stew": "minecraft:rabbit_stew", + "rail": "minecraft:rail", + "rapid_fertilizer": "minecraft:rapid_fertilizer", + "raw_beef": "minecraft:beef", + "raw_chicken": "minecraft:chicken", + "raw_fish": "minecraft:fish", + "raw_mutton": "minecraft:muttonraw", + "raw_porkchop": "minecraft:porkchop", + "raw_rabbit": "minecraft:rabbit", + "raw_salmon": "minecraft:salmon", + "record_11": "minecraft:record_11", + "record_13": "minecraft:record_13", + "record_blocks": "minecraft:record_blocks", + "record_cat": "minecraft:record_cat", + "record_chirp": "minecraft:record_chirp", + "record_far": "minecraft:record_far", + "record_mall": "minecraft:record_mall", + "record_mellohi": "minecraft:record_mellohi", + "record_stal": "minecraft:record_stal", + "record_strad": "minecraft:record_strad", + "record_wait": "minecraft:record_wait", + "record_ward": "minecraft:record_ward", + "red_flower": "minecraft:red_flower", + "red_glazed_terracotta": "minecraft:red_glazed_terracotta", + "red_mushroom": "minecraft:red_mushroom", + "red_mushroom_block": "minecraft:red_mushroom_block", + "red_nether_brick": "minecraft:red_nether_brick", + "red_nether_brick_stairs": "minecraft:red_nether_brick_stairs", + "red_sandstone": "minecraft:red_sandstone", + "red_sandstone_slab": "minecraft:double_stone_slab2", + "red_sandstone_stairs": "minecraft:red_sandstone_stairs", + "redstone": "minecraft:redstone", + "redstone_block": "minecraft:redstone_block", + "redstone_dust": "minecraft:redstone", + "redstone_lamp": "minecraft:redstone_lamp", + "redstone_ore": "minecraft:redstone_ore", + "redstone_torch": "minecraft:redstone_torch", + "redstone_wire": "minecraft:redstone_wire", + "reeds": "minecraft:reeds", + "reeds_block": "minecraft:item.reeds", + "repeater": "minecraft:repeater", + "repeater_block": "minecraft:unpowered_repeater", + "repeating_command_block": "minecraft:repeating_command_block", + "reserved6": "minecraft:reserved6", + "rose": "minecraft:red_flower", + "rotten_flesh": "minecraft:rotten_flesh", + "saddle": "minecraft:saddle", + "salmon": "minecraft:salmon", + "sand": "minecraft:sand", + "sandstone": "minecraft:sandstone", + "sandstone_stairs": "minecraft:sandstone_stairs", + "sapling": "minecraft:sapling", + "scaffolding": "minecraft:scaffolding", + "sea_lantern": "minecraft:sealantern", + "sea_pickle": "minecraft:sea_pickle", + "seagrass": "minecraft:seagrass", + "sealantern": "minecraft:sealantern", + "seeds": "minecraft:wheat_seeds", + "shears": "minecraft:shears", + "shield": "minecraft:shield", + "shulker_box": "minecraft:shulker_box", + "shulker_shell": "minecraft:shulker_shell", + "sign": "minecraft:sign", + "sign_post": "minecraft:standing_sign", + "silver_glazed_terracotta": "minecraft:silver_glazed_terracotta", + "skull": "minecraft:skull", + "skull_block": "minecraft:item.skull", + "slab": "minecraft:double_stone_slab", + "slabs": "minecraft:double_stone_slab", + "slime": "minecraft:slime", + "slime_ball": "minecraft:slime_ball", + "slime_block": "minecraft:slime", + "slimeball": "minecraft:slime_ball", + "smithing_table": "minecraft:smithing_table", + "smoker": "minecraft:smoker", + "smooth_quartz_stairs": "minecraft:smooth_quartz_stairs", + "smooth_red_sandstone_stairs": "minecraft:smooth_red_sandstone_stairs", + "smooth_sandstone_stairs": "minecraft:smooth_sandstone_stairs", + "smooth_stone": "minecraft:smooth_stone", + "snow": "minecraft:snow", + "snow_block": "minecraft:snow", + "snow_layer": "minecraft:snow_layer", + "snowball": "minecraft:snowball", + "soul_sand": "minecraft:soul_sand", + "sparkler": "minecraft:sparkler", + "spawn_egg": "minecraft:spawn_egg", + "speckled_melon": "minecraft:speckled_melon", + "spider_eye": "minecraft:spider_eye", + "splash_potion": "minecraft:splash_potion", + "sponge": "minecraft:sponge", + "spruce_button": "minecraft:spruce_button", + "spruce_door": "minecraft:spruce_door", + "spruce_door_block": "minecraft:item.spruce_door", + "spruce_fence_gate": "minecraft:spruce_fence_gate", + "spruce_pressure_plate": "minecraft:spruce_pressure_plate", + "spruce_sign": "minecraft:spruce_sign", + "spruce_stairs": "minecraft:spruce_stairs", + "spruce_standing_sign": "minecraft:spruce_standing_sign", + "spruce_trapdoor": "minecraft:spruce_trapdoor", + "spruce_wall_sign": "minecraft:spruce_wall_sign", + "spruce_wood_stairs": "minecraft:spruce_stairs", + "spruce_wooden_stairs": "minecraft:spruce_stairs", + "stained_clay": "minecraft:stained_hardened_clay", + "stained_glass": "minecraft:stained_glass", + "stained_glass_pane": "minecraft:stained_glass_pane", + "stained_hardened_clay": "minecraft:stained_hardened_clay", + "standing_banner": "minecraft:standing_banner", + "standing_sign": "minecraft:standing_sign", + "steak": "minecraft:cooked_beef", + "stick": "minecraft:stick", + "sticks": "minecraft:stick", + "sticky_piston": "minecraft:sticky_piston", + "still_lava": "minecraft:lava", + "still_water": "minecraft:water", + "stone": "minecraft:stone", + "stone_axe": "minecraft:stone_axe", + "stone_brick": "minecraft:stonebrick", + "stone_brick_stairs": "minecraft:stone_brick_stairs", + "stone_bricks": "minecraft:stonebrick", + "stone_button": "minecraft:stone_button", + "stone_hoe": "minecraft:stone_hoe", + "stone_pickaxe": "minecraft:stone_pickaxe", + "stone_pressure_plate": "minecraft:stone_pressure_plate", + "stone_shovel": "minecraft:stone_shovel", + "stone_slab": "minecraft:double_stone_slab", + "stone_slab2": "minecraft:double_stone_slab2", + "stone_slab3": "minecraft:double_stone_slab3", + "stone_slab4": "minecraft:double_stone_slab4", + "stone_stairs": "minecraft:stone_stairs", + "stone_sword": "minecraft:stone_sword", + "stone_wall": "minecraft:cobblestone_wall", + "stonebrick": "minecraft:stonebrick", + "stonecutter": "minecraft:stonecutter", + "stonecutter_block": "minecraft:stonecutter_block", + "string": "minecraft:string", + "stripped_acacia_log": "minecraft:stripped_acacia_log", + "stripped_birch_log": "minecraft:stripped_birch_log", + "stripped_dark_oak_log": "minecraft:stripped_dark_oak_log", + "stripped_jungle_log": "minecraft:stripped_jungle_log", + "stripped_oak_log": "minecraft:stripped_oak_log", + "stripped_spruce_log": "minecraft:stripped_spruce_log", + "structure_block": "minecraft:structure_block", + "sugar": "minecraft:sugar", + "sugar_cane": "minecraft:reeds", + "sugar_canes": "minecraft:reeds", + "sugarcane": "minecraft:reeds", + "sugarcane_block": "minecraft:item.reeds", + "sweet_berries": "minecraft:sweet_berries", + "sweet_berry_bush": "minecraft:sweet_berry_bush", + "tall_grass": "minecraft:tallgrass", + "tallgrass": "minecraft:tallgrass", + "terracotta": "minecraft:stained_hardened_clay", + "tnt": "minecraft:tnt", + "tnt_minecart": "minecraft:tnt_minecart", + "torch": "minecraft:torch", + "totem": "minecraft:totem", + "trapdoor": "minecraft:trapdoor", + "trapped_chest": "minecraft:trapped_chest", + "trident": "minecraft:trident", + "trip_wire": "minecraft:tripwire", + "tripwire": "minecraft:tripwire", + "tripwire_hook": "minecraft:tripwire_hook", + "trunk": "minecraft:planks", + "trunk2": "minecraft:log2", + "turtle_egg": "minecraft:turtle_egg", + "turtle_helmet": "minecraft:turtle_helmet", + "turtle_shell_piece": "minecraft:turtle_shell_piece", + "underwater_torch": "minecraft:underwater_torch", + "undyed_shulker_box": "minecraft:undyed_shulker_box", + "unlit_redstone_torch": "minecraft:unlit_redstone_torch", + "unpowered_comparator": "minecraft:unpowered_comparator", + "unpowered_comparator_block": "minecraft:unpowered_comparator", + "unpowered_repeater": "minecraft:unpowered_repeater", + "unpowered_repeater_block": "minecraft:unpowered_repeater", + "update_block": "minecraft:info_update", + "vine": "minecraft:vine", + "vines": "minecraft:vine", + "wall_banner": "minecraft:wall_banner", + "wall_sign": "minecraft:wall_sign", + "water": "minecraft:water", + "water_lily": "minecraft:waterlily", + "waterlily": "minecraft:waterlily", + "web": "minecraft:web", + "weighted_pressure_plate_heavy": "minecraft:heavy_weighted_pressure_plate", + "weighted_pressure_plate_light": "minecraft:light_weighted_pressure_plate", + "wheat": "minecraft:wheat", + "wheat_block": "minecraft:item.wheat", + "wheat_seeds": "minecraft:wheat_seeds", + "white_glazed_terracotta": "minecraft:white_glazed_terracotta", + "wood": "minecraft:log", + "wood2": "minecraft:log2", + "wood_door_block": "minecraft:item.wooden_door", + "wood_slab": "minecraft:wooden_slab", + "wood_slabs": "minecraft:wooden_slab", + "wood_stairs": "minecraft:oak_stairs", + "wooden_axe": "minecraft:wooden_axe", + "wooden_button": "minecraft:wooden_button", + "wooden_door": "minecraft:wooden_door", + "wooden_door_block": "minecraft:item.wooden_door", + "wooden_hoe": "minecraft:wooden_hoe", + "wooden_pickaxe": "minecraft:wooden_pickaxe", + "wooden_plank": "minecraft:planks", + "wooden_planks": "minecraft:planks", + "wooden_pressure_plate": "minecraft:wooden_pressure_plate", + "wooden_shovel": "minecraft:wooden_shovel", + "wooden_slab": "minecraft:wooden_slab", + "wooden_slabs": "minecraft:wooden_slab", + "wooden_stairs": "minecraft:oak_stairs", + "wooden_sword": "minecraft:wooden_sword", + "wooden_trapdoor": "minecraft:trapdoor", + "wool": "minecraft:wool", + "workbench": "minecraft:crafting_table", + "writable_book": "minecraft:writable_book", + "written_book": "minecraft:written_book", + "yellow_flower": "minecraft:yellow_flower", + "yellow_glazed_terracotta": "minecraft:yellow_glazed_terracotta" } diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index c9ea226fdd..a06edad10e 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -67,7 +67,7 @@ final class LegacyStringToItemParser{ if(!is_array($mappings)) throw new AssumptionFailedError("Invalid mappings format, expected array"); foreach($mappings as $name => $id){ - if(!is_int($id)) throw new AssumptionFailedError("Invalid mappings format, expected int values"); + if(!is_string($id)) throw new AssumptionFailedError("Invalid mappings format, expected string values"); $result->addMapping((string) $name, $id); } @@ -75,8 +75,8 @@ final class LegacyStringToItemParser{ } /** - * @var int[] - * @phpstan-var array + * @var string[] + * @phpstan-var array */ private array $map = []; @@ -85,13 +85,13 @@ final class LegacyStringToItemParser{ private ItemDeserializer $itemDeserializer ){} - public function addMapping(string $alias, int $id) : void{ + public function addMapping(string $alias, string $id) : void{ $this->map[$alias] = $id; } /** - * @return int[] - * @phpstan-return array + * @return string[] + * @phpstan-return array */ public function getMappings() : array{ return $this->map; @@ -123,11 +123,7 @@ final class LegacyStringToItemParser{ if($legacyId === null){ throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); } - try{ - $itemData = $this->itemDataUpgrader->upgradeItemTypeDataInt($legacyId, $meta, 1, null); - }catch(SavedDataLoadingException){ - throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); - } + $itemData = $this->itemDataUpgrader->upgradeItemTypeDataString($legacyId, $meta, 1, null); try{ return $this->itemDeserializer->deserializeStack($itemData); From 83c46a4b5413e8f055138ac5d3a4710c608ad8da Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 15:26:56 +0100 Subject: [PATCH 0192/1858] LegacyStringToItemParser: remove bogus test this test is obsolete since ea3d5ac5630f57b9cec46771001ab83bb0ddec25, since durable items no longer use meta to represent damage. --- tests/phpunit/item/LegacyStringToItemParserTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/phpunit/item/LegacyStringToItemParserTest.php b/tests/phpunit/item/LegacyStringToItemParserTest.php index ef5127fec8..50d73a4389 100644 --- a/tests/phpunit/item/LegacyStringToItemParserTest.php +++ b/tests/phpunit/item/LegacyStringToItemParserTest.php @@ -38,8 +38,7 @@ class LegacyStringToItemParserTest extends TestCase{ ["351:4", ItemIds::DYE, 4], ["stone:3", ItemIds::STONE, 3], ["minecraft:string", ItemIds::STRING, 0], - ["diamond_pickaxe", ItemIds::DIAMOND_PICKAXE, 0], - ["diamond_pickaxe:5", ItemIds::DIAMOND_PICKAXE, 5] + ["diamond_pickaxe", ItemIds::DIAMOND_PICKAXE, 0] ]; } From 8831dff61b883d3cc242f16a349da39fe9da9421 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 16:09:55 +0100 Subject: [PATCH 0193/1858] Leaves: remove ItemFactory dependency this is ugly, but it should only be temporary while we liberate the core from legacy nastiness. Once the liberation is complete, we'll be able to do a lot of cool stuff like making wood types dynamic. --- src/block/Leaves.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 77d557f599..e55ddcdc44 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -29,12 +29,11 @@ use pocketmine\block\utils\SupportType; use pocketmine\block\utils\TreeType; use pocketmine\event\block\LeavesDecayEvent; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; -use pocketmine\item\ItemIds; use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\World; use function mt_rand; @@ -144,7 +143,15 @@ class Leaves extends Transparent{ $drops = []; if(mt_rand(1, 20) === 1){ //Saplings - $drops[] = ItemFactory::getInstance()->get(ItemIds::SAPLING, $this->treeType->getMagicNumber()); + $drops[] = match($this->treeType){ + TreeType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), + TreeType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), + TreeType::DARK_OAK() => VanillaBlocks::DARK_OAK_SAPLING(), + TreeType::JUNGLE() => VanillaBlocks::JUNGLE_SAPLING(), + TreeType::OAK() => VanillaBlocks::OAK_SAPLING(), + TreeType::SPRUCE() => VanillaBlocks::SPRUCE_SAPLING(), + default => throw new AssumptionFailedError("Unreachable") + }; } if(($this->treeType->equals(TreeType::OAK()) || $this->treeType->equals(TreeType::DARK_OAK())) && mt_rand(1, 200) === 1){ //Apples $drops[] = VanillaItems::APPLE(); From 5e4e5147d90a249317be0355b5bd09c9efddc6bb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 16:11:15 +0100 Subject: [PATCH 0194/1858] Remove ItemFactory involvement from brewing this involves a very nasty hack for potion container change, but for the time being it can't be helped. --- src/crafting/CraftingManager.php | 50 +++++++++++++----- .../CraftingManagerFromDataHelper.php | 16 ++++-- src/crafting/PotionContainerChangeRecipe.php | 22 +++++--- src/network/mcpe/cache/CraftingDataCache.php | 51 +++++++++---------- 4 files changed, 86 insertions(+), 53 deletions(-) diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index f23ba53acf..516cf385ba 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -29,6 +29,7 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\BinaryStream; use pocketmine\utils\DestructorCallbackTrait; use pocketmine\utils\ObjectSet; +use function morton2d_encode; use function usort; class CraftingManager{ @@ -47,16 +48,22 @@ class CraftingManager{ /** * @var PotionTypeRecipe[][] - * @phpstan-var array> + * @phpstan-var list */ protected array $potionTypeRecipes = []; /** - * @var PotionContainerChangeRecipe[][] - * @phpstan-var array> + * @var PotionContainerChangeRecipe[] + * @phpstan-var list */ protected array $potionContainerChangeRecipes = []; + /** + * @var BrewingRecipe[][] + * @phpstan-var array> + */ + private array $brewingRecipeCache = []; + /** @phpstan-var ObjectSet<\Closure() : void> */ private ObjectSet $recipeRegisteredCallbacks; @@ -150,16 +157,16 @@ class CraftingManager{ } /** - * @return PotionTypeRecipe[][] - * @phpstan-return array> + * @return PotionTypeRecipe[] + * @phpstan-return list */ public function getPotionTypeRecipes() : array{ return $this->potionTypeRecipes; } /** - * @return PotionContainerChangeRecipe[][] - * @phpstan-return array> + * @return PotionContainerChangeRecipe[] + * @phpstan-return list */ public function getPotionContainerChangeRecipes() : array{ return $this->potionContainerChangeRecipes; @@ -182,9 +189,7 @@ class CraftingManager{ } public function registerPotionTypeRecipe(PotionTypeRecipe $recipe) : void{ - $input = $recipe->getInput(); - $ingredient = $recipe->getIngredient(); - $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":" . $ingredient->getMeta()] = $recipe; + $this->potionTypeRecipes[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); @@ -192,8 +197,7 @@ class CraftingManager{ } public function registerPotionContainerChangeRecipe(PotionContainerChangeRecipe $recipe) : void{ - $ingredient = $recipe->getIngredient(); - $this->potionContainerChangeRecipes[$recipe->getInputItemId()][$ingredient->getId() . ":" . $ingredient->getMeta()] = $recipe; + $this->potionContainerChangeRecipes[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); @@ -252,7 +256,25 @@ class CraftingManager{ } public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ - return $this->potionTypeRecipes[$input->getId() . ":" . $input->getMeta()][$ingredient->getId() . ":" . $ingredient->getMeta()] ?? - $this->potionContainerChangeRecipes[$input->getId()][$ingredient->getId() . ":" . $ingredient->getMeta()] ?? null; + $inputHash = morton2d_encode($input->getId(), $input->getMeta()); + $ingredientHash = morton2d_encode($ingredient->getId(), $ingredient->getMeta()); + $recipe = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; + if($recipe !== null){ + return $recipe; + } + + foreach($this->potionContainerChangeRecipes as $recipe){ + if($recipe->getIngredient()->equals($ingredient) && $recipe->getResultFor($input) !== null){ + return $this->brewingRecipeCache[$inputHash][$ingredientHash] = $recipe; + } + } + + foreach($this->potionTypeRecipes as $recipe){ + if($recipe->getIngredient()->equals($ingredient) && $recipe->getResultFor($input) !== null){ + return $this->brewingRecipeCache[$inputHash][$ingredientHash] = $recipe; + } + } + + return null; } } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index d4bb14b3d1..455e0315e4 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -24,9 +24,9 @@ declare(strict_types=1); namespace pocketmine\crafting; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; +use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\SavedDataLoadingException; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; @@ -172,17 +172,23 @@ final class CraftingManagerFromDataHelper{ } foreach($recipes["potion_container_change"] as $recipe){ try{ - $input = ItemFactory::getInstance()->get($recipe["input_item_id"]); $ingredient = Item::jsonDeserialize($recipe["ingredient"]); - $output = ItemFactory::getInstance()->get($recipe["output_item_id"]); }catch(SavedDataLoadingException){ //unknown item continue; } + + //TODO: we'll be able to get rid of these conversions once the crafting data is updated + $inputId = LegacyItemIdToStringIdMap::getInstance()->legacyToString($recipe["input_item_id"]); + $outputId = LegacyItemIdToStringIdMap::getInstance()->legacyToString($recipe["output_item_id"]); + if($inputId === null || $outputId === null){ + //unknown item + continue; + } $result->registerPotionContainerChangeRecipe(new PotionContainerChangeRecipe( - $input->getId(), + $inputId, $ingredient, - $output->getId() + $outputId )); } diff --git a/src/crafting/PotionContainerChangeRecipe.php b/src/crafting/PotionContainerChangeRecipe.php index da24050cb8..d358c28e23 100644 --- a/src/crafting/PotionContainerChangeRecipe.php +++ b/src/crafting/PotionContainerChangeRecipe.php @@ -23,20 +23,21 @@ declare(strict_types=1); namespace pocketmine\crafting; +use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; +use pocketmine\world\format\io\GlobalItemDataHandlers; class PotionContainerChangeRecipe implements BrewingRecipe{ public function __construct( - private int $inputItemId, + private string $inputItemId, private Item $ingredient, - private int $outputItemId + private string $outputItemId ){ $this->ingredient = clone $ingredient; } - public function getInputItemId() : int{ + public function getInputItemId() : string{ return $this->inputItemId; } @@ -44,11 +45,20 @@ class PotionContainerChangeRecipe implements BrewingRecipe{ return clone $this->ingredient; } - public function getOutputItemId() : int{ + public function getOutputItemId() : string{ return $this->outputItemId; } public function getResultFor(Item $input) : ?Item{ - return $input->getId() === $this->getInputItemId() ? ItemFactory::getInstance()->get($this->getOutputItemId(), $input->getMeta()) : null; + //TODO: this is a really awful hack, but there isn't another way for now + //this relies on transforming the serialized item's ID, relying on the target item type's data being the same as the input. + //This is the same assumption previously made using ItemFactory::get(), except it was less obvious how bad it was. + //The other way is to bake the actual Potion class types into here, which isn't great for data-driving stuff. + //We need a better solution for this. + + $data = GlobalItemDataHandlers::getSerializer()->serializeType($input); + return $data->getName() === $this->getInputItemId() ? + GlobalItemDataHandlers::getDeserializer()->deserializeType(new SavedItemData($this->getOutputItemId(), $data->getMeta(), $data->getBlock(), $data->getTag())) : + null; } } diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 8c1cd532d6..6d86b85556 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -28,8 +28,7 @@ use pocketmine\crafting\FurnaceType; use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\CraftingDataPacket; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; @@ -149,35 +148,31 @@ final class CraftingDataCache{ } $potionTypeRecipes = []; - foreach($manager->getPotionTypeRecipes() as $recipes){ - foreach($recipes as $recipe){ - $input = $converter->coreItemStackToNet($recipe->getInput()); - $ingredient = $converter->coreItemStackToNet($recipe->getIngredient()); - $output = $converter->coreItemStackToNet($recipe->getOutput()); - $potionTypeRecipes[] = new ProtocolPotionTypeRecipe( - $input->getId(), - $input->getMeta(), - $ingredient->getId(), - $ingredient->getMeta(), - $output->getId(), - $output->getMeta() - ); - } + foreach($manager->getPotionTypeRecipes() as $recipe){ + $input = $converter->coreItemStackToNet($recipe->getInput()); + $ingredient = $converter->coreItemStackToNet($recipe->getIngredient()); + $output = $converter->coreItemStackToNet($recipe->getOutput()); + $potionTypeRecipes[] = new ProtocolPotionTypeRecipe( + $input->getId(), + $input->getMeta(), + $ingredient->getId(), + $ingredient->getMeta(), + $output->getId(), + $output->getMeta() + ); } $potionContainerChangeRecipes = []; - $itemTranslator = ItemTranslator::getInstance(); - foreach($manager->getPotionContainerChangeRecipes() as $recipes){ - foreach($recipes as $recipe){ - $input = $itemTranslator->toNetworkId(ItemFactory::getInstance()->get($recipe->getInputItemId(), 0)); - $ingredient = $itemTranslator->toNetworkId($recipe->getIngredient()); - $output = $itemTranslator->toNetworkId(ItemFactory::getInstance()->get($recipe->getOutputItemId(), 0)); - $potionContainerChangeRecipes[] = new ProtocolPotionContainerChangeRecipe( - $input[0], - $ingredient[0], - $output[0] - ); - } + $itemTypeDictionary = GlobalItemTypeDictionary::getInstance()->getDictionary(); + foreach($manager->getPotionContainerChangeRecipes() as $recipe){ + $input = $itemTypeDictionary->fromStringId($recipe->getInputItemId()); + $ingredient = $converter->coreItemStackToNet($recipe->getIngredient()); + $output = $itemTypeDictionary->fromStringId($recipe->getOutputItemId()); + $potionContainerChangeRecipes[] = new ProtocolPotionContainerChangeRecipe( + $input, + $ingredient->getId(), + $output + ); } Timings::$craftingDataCacheRebuild->stopTiming(); From de917afc6f8eee14103721e9b355b1a66064a484 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 16:11:46 +0100 Subject: [PATCH 0195/1858] Fix CS --- src/item/LegacyStringToItemParser.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index a06edad10e..12c10f874d 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -26,7 +26,6 @@ namespace pocketmine\item; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; -use pocketmine\data\SavedDataLoadingException; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; @@ -35,8 +34,8 @@ use Webmozart\PathUtil\Path; use function explode; use function file_get_contents; use function is_array; -use function is_int; use function is_numeric; +use function is_string; use function json_decode; use function str_replace; use function strtolower; From 09c1e161e03ecbddb5f3c18d1a0e1119959adc09 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 16:54:57 +0100 Subject: [PATCH 0196/1858] Fix merge error --- src/world/particle/ItemBreakParticle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/particle/ItemBreakParticle.php b/src/world/particle/ItemBreakParticle.php index bc0e2d7579..ac0c5ac4ba 100644 --- a/src/world/particle/ItemBreakParticle.php +++ b/src/world/particle/ItemBreakParticle.php @@ -33,7 +33,7 @@ class ItemBreakParticle implements Particle{ public function __construct(private Item $item){} public function encode(Vector3 $pos) : array{ - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($this->item->getId(), $this->item->getMeta()); + [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($this->item); return [LevelEventPacket::standardParticle(ParticleIds::ITEM_BREAK, ($id << 16) | $meta, $pos)]; } } From ff96f1b93cf9f81a0e9548211743a6281d96971e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 16:58:52 +0100 Subject: [PATCH 0197/1858] CreativeInventory: do not disable meta comparison for durable items this check no longer applies, and it's usually undesirable to avoid comparing meta in every other case. --- src/inventory/CreativeInventory.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index f3943907c9..43a8b9a0e2 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\inventory; use pocketmine\data\SavedDataLoadingException; -use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; @@ -72,7 +71,7 @@ final class CreativeInventory{ public function getItemIndex(Item $item) : int{ foreach($this->creative as $i => $d){ - if($item->equals($d, !($item instanceof Durable))){ + if($item->equals($d, true, false)){ return $i; } } From cab56b0479b1959173985bfc9a9a57033610d5ca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jun 2022 17:18:44 +0100 Subject: [PATCH 0198/1858] fix PHPStan --- src/block/Leaves.php | 4 ++-- src/crafting/CraftingManager.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/block/Leaves.php b/src/block/Leaves.php index e55ddcdc44..1283f912ac 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -143,7 +143,7 @@ class Leaves extends Transparent{ $drops = []; if(mt_rand(1, 20) === 1){ //Saplings - $drops[] = match($this->treeType){ + $drops[] = (match($this->treeType){ TreeType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), TreeType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), TreeType::DARK_OAK() => VanillaBlocks::DARK_OAK_SAPLING(), @@ -151,7 +151,7 @@ class Leaves extends Transparent{ TreeType::OAK() => VanillaBlocks::OAK_SAPLING(), TreeType::SPRUCE() => VanillaBlocks::SPRUCE_SAPLING(), default => throw new AssumptionFailedError("Unreachable") - }; + })->asItem(); } if(($this->treeType->equals(TreeType::OAK()) || $this->treeType->equals(TreeType::DARK_OAK())) && mt_rand(1, 200) === 1){ //Apples $drops[] = VanillaItems::APPLE(); diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 516cf385ba..777776f1fe 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -258,9 +258,9 @@ class CraftingManager{ public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ $inputHash = morton2d_encode($input->getId(), $input->getMeta()); $ingredientHash = morton2d_encode($ingredient->getId(), $ingredient->getMeta()); - $recipe = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; - if($recipe !== null){ - return $recipe; + $cached = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; + if($cached !== null){ + return $cached; } foreach($this->potionContainerChangeRecipes as $recipe){ From f8547ad57c8040081a0dac56f00214ba622bec57 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 16:39:50 +0100 Subject: [PATCH 0199/1858] LegacyStringToItemParserTest: do not rely on the presence of legacy ID and meta in the API --- .../item/LegacyStringToItemParserTest.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/phpunit/item/LegacyStringToItemParserTest.php b/tests/phpunit/item/LegacyStringToItemParserTest.php index 50d73a4389..04930ff81b 100644 --- a/tests/phpunit/item/LegacyStringToItemParserTest.php +++ b/tests/phpunit/item/LegacyStringToItemParserTest.php @@ -24,31 +24,31 @@ declare(strict_types=1); namespace pocketmine\item; use PHPUnit\Framework\TestCase; +use pocketmine\block\VanillaBlocks; class LegacyStringToItemParserTest extends TestCase{ /** * @return mixed[][] - * @phpstan-return list + * @phpstan-return list */ public function itemFromStringProvider() : array{ return [ - ["dye:4", ItemIds::DYE, 4], - ["351", ItemIds::DYE, 0], - ["351:4", ItemIds::DYE, 4], - ["stone:3", ItemIds::STONE, 3], - ["minecraft:string", ItemIds::STRING, 0], - ["diamond_pickaxe", ItemIds::DIAMOND_PICKAXE, 0] + ["dye:4", VanillaItems::LAPIS_LAZULI()], + ["351", VanillaItems::INK_SAC()], + ["351:4", VanillaItems::LAPIS_LAZULI()], + ["stone:3", VanillaBlocks::DIORITE()->asItem()], + ["minecraft:string", VanillaItems::STRING()], + ["diamond_pickaxe", VanillaItems::DIAMOND_PICKAXE()] ]; } /** * @dataProvider itemFromStringProvider */ - public function testFromStringSingle(string $string, int $id, int $meta) : void{ + public function testFromStringSingle(string $string, Item $expected) : void{ $item = LegacyStringToItemParser::getInstance()->parse($string); - self::assertEquals($id, $item->getId()); - self::assertEquals($meta, $item->getMeta()); + self::assertTrue($item->equals($expected)); } } From c22a840d27e632b7eae65060022b05f86e95f0bf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 17:52:07 +0100 Subject: [PATCH 0200/1858] Update VanillaBlocks: for some reason some stuff was returned using non-default states --- src/block/VanillaBlocks.php | 186 ++++++++++++++++++------------------ 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index f5edfd9051..0acd3385ec 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -600,15 +600,15 @@ final class VanillaBlocks{ 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::ACACIA_LEAVES, 0)); - self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 0)); + self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 2)); 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::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_stairs", $factory->get(Ids::ACACIA_STAIRS, 0)); + self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 0)); + self::register("acacia_wall_sign", $factory->get(Ids::ACACIA_WALL_SIGN, 0)); 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)); @@ -616,7 +616,7 @@ final class VanillaBlocks{ 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_stairs", $factory->get(Ids::ANDESITE_STAIRS, 0)); 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::AZURE_BLUET, 0)); @@ -635,40 +635,40 @@ final class VanillaBlocks{ 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::BIRCH_LEAVES, 0)); - self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 0)); + self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 2)); 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::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_stairs", $factory->get(Ids::BIRCH_STAIRS, 0)); + self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); + self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 0)); self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0)); - self::register("black_glazed_terracotta", $factory->get(Ids::BLACK_GLAZED_TERRACOTTA, 2)); + self::register("black_glazed_terracotta", $factory->get(Ids::BLACK_GLAZED_TERRACOTTA, 0)); 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_glazed_terracotta", $factory->get(Ids::BLUE_GLAZED_TERRACOTTA, 0)); self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0)); 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("bone_block", $factory->get(Ids::BONE_BLOCK, 2)); self::register("bookshelf", $factory->get(Ids::BOOKSHELF, 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_stairs", $factory->get(Ids::BRICK_STAIRS, 0)); 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_glazed_terracotta", $factory->get(Ids::BROWN_GLAZED_TERRACOTTA, 0)); self::register("brown_mushroom", $factory->get(Ids::BROWN_MUSHROOM, 0)); - self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 0)); + self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10)); self::register("cactus", $factory->get(Ids::CACTUS, 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::CHISELED_QUARTZ, 0)); + self::register("chest", $factory->get(Ids::CHEST, 0)); + self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 2)); 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)); @@ -677,7 +677,7 @@ final class VanillaBlocks{ 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::COBBLESTONE_SLAB, 0)); - self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 3)); + self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 0)); 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_POD, 0)); @@ -694,26 +694,26 @@ final class VanillaBlocks{ 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("cyan_glazed_terracotta", $factory->get(Ids::CYAN_GLAZED_TERRACOTTA, 0)); 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, 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::DARK_OAK_LEAVES, 0)); - self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 0)); + self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 2)); 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::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_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::DARK_OAK_WALL_SIGN, 0)); 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("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 0)); 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)); @@ -721,7 +721,7 @@ final class VanillaBlocks{ self::register("diamond_ore", $factory->get(Ids::DIAMOND_ORE, 0)); 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_stairs", $factory->get(Ids::DIORITE_STAIRS, 0)); 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_TALLGRASS, 0)); @@ -855,10 +855,10 @@ final class VanillaBlocks{ 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::END_STONE_BRICK_SLAB, 0)); - self::register("end_stone_brick_stairs", $factory->get(Ids::END_STONE_BRICK_STAIRS, 3)); + self::register("end_stone_brick_stairs", $factory->get(Ids::END_STONE_BRICK_STAIRS, 0)); 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("ender_chest", $factory->get(Ids::ENDER_CHEST, 0)); 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::FERN, 0)); @@ -875,18 +875,18 @@ final class VanillaBlocks{ self::register("gold_ore", $factory->get(Ids::GOLD_ORE, 0)); 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_stairs", $factory->get(Ids::GRANITE_STAIRS, 0)); 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("gray_glazed_terracotta", $factory->get(Ids::GRAY_GLAZED_TERRACOTTA, 0)); + self::register("green_glazed_terracotta", $factory->get(Ids::GREEN_GLAZED_TERRACOTTA, 0)); 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::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("hay_bale", $factory->get(Ids::HAY_BALE, 2)); 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::INFESTED_CHISELED_STONE_BRICK, 0)); @@ -902,43 +902,43 @@ final class VanillaBlocks{ self::register("iron_bars", $factory->get(Ids::IRON_BARS, 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, 3)); - self::register("item_frame", $factory->get(Ids::ITEM_FRAME, 3)); + self::register("iron_trapdoor", $factory->get(Ids::IRON_TRAPDOOR, 0)); + self::register("item_frame", $factory->get(Ids::ITEM_FRAME, 0)); 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, 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::JUNGLE_LEAVES, 0)); - self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 0)); + self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 2)); 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::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_stairs", $factory->get(Ids::JUNGLE_STAIRS, 0)); + self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 0)); + self::register("jungle_wall_sign", $factory->get(Ids::JUNGLE_WALL_SIGN, 0)); 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("ladder", $factory->get(Ids::LADDER, 0)); self::register("lantern", $factory->get(Ids::LANTERN, 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("lectern", $factory->get(Ids::LECTERN, 0)); 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::LIGHT_GRAY_GLAZED_TERRACOTTA, 2)); + self::register("lever", $factory->get(Ids::LEVER, 5)); + self::register("light_blue_glazed_terracotta", $factory->get(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, 0)); + self::register("light_gray_glazed_terracotta", $factory->get(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, 0)); 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("lime_glazed_terracotta", $factory->get(Ids::LIME_GLAZED_TERRACOTTA, 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("loom", $factory->get(Ids::LOOM, 0)); + self::register("magenta_glazed_terracotta", $factory->get(Ids::MAGENTA_GLAZED_TERRACOTTA, 0)); self::register("magma", $factory->get(Ids::MAGMA, 0)); self::register("material_reducer", $factory->get(Ids::MATERIAL_REDUCER, 0)); self::register("melon", $factory->get(Ids::MELON, 0)); @@ -947,20 +947,20 @@ final class VanillaBlocks{ 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::MOSSY_COBBLESTONE_SLAB, 0)); - self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 3)); + self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 0)); 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_stairs", $factory->get(Ids::MOSSY_STONE_BRICK_STAIRS, 0)); 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::NETHER_BRICK_SLAB, 0)); - self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 3)); + self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 0)); 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_portal", $factory->get(Ids::NETHER_PORTAL, 0)); self::register("nether_quartz_ore", $factory->get(Ids::NETHER_QUARTZ_ORE, 0)); self::register("nether_reactor_core", $factory->get(Ids::NETHER_REACTOR_CORE, 0)); self::register("nether_wart", $factory->get(Ids::NETHER_WART, 0)); @@ -972,73 +972,73 @@ final class VanillaBlocks{ 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_log", $factory->get(Ids::OAK_LOG, 2)); 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_stairs", $factory->get(Ids::OAK_STAIRS, 0)); + self::register("oak_trapdoor", $factory->get(Ids::OAK_TRAPDOOR, 0)); + self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 0)); 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_glazed_terracotta", $factory->get(Ids::ORANGE_GLAZED_TERRACOTTA, 0)); 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::PEONY, 0)); - self::register("pink_glazed_terracotta", $factory->get(Ids::PINK_GLAZED_TERRACOTTA, 2)); + self::register("pink_glazed_terracotta", $factory->get(Ids::PINK_GLAZED_TERRACOTTA, 0)); 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::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_andesite_stairs", $factory->get(Ids::POLISHED_ANDESITE_STAIRS, 0)); 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_diorite_stairs", $factory->get(Ids::POLISHED_DIORITE_STAIRS, 0)); 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("polished_granite_stairs", $factory->get(Ids::POLISHED_GRANITE_STAIRS, 0)); self::register("poppy", $factory->get(Ids::POPPY, 0)); self::register("potatoes", $factory->get(Ids::POTATOES, 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_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_bricks_stairs", $factory->get(Ids::PRISMARINE_BRICKS_STAIRS, 0)); self::register("prismarine_slab", $factory->get(Ids::PRISMARINE_SLAB, 0)); - self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 3)); + self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 0)); 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_glazed_terracotta", $factory->get(Ids::PURPLE_GLAZED_TERRACOTTA, 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_pillar", $factory->get(Ids::PURPUR_PILLAR, 2)); self::register("purpur_slab", $factory->get(Ids::PURPUR_SLAB, 0)); - self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 3)); + self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 0)); self::register("quartz", $factory->get(Ids::QUARTZ, 0)); - self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 0)); + self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 2)); self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); - self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 3)); + self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); self::register("rail", $factory->get(Ids::RAIL, 0)); - self::register("red_glazed_terracotta", $factory->get(Ids::RED_GLAZED_TERRACOTTA, 2)); + self::register("red_glazed_terracotta", $factory->get(Ids::RED_GLAZED_TERRACOTTA, 0)); 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_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 10)); 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_stairs", $factory->get(Ids::RED_NETHER_BRICK_STAIRS, 0)); 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::RED_SANDSTONE_SLAB, 0)); - self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 3)); + self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 0)); 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_comparator", $factory->get(Ids::REDSTONE_COMPARATOR, 0)); 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::REDSTONE_REPEATER, 0)); @@ -1049,22 +1049,22 @@ final class VanillaBlocks{ self::register("sand", $factory->get(Ids::SAND, 0)); self::register("sandstone", $factory->get(Ids::SANDSTONE, 0)); self::register("sandstone_slab", $factory->get(Ids::SANDSTONE_SLAB, 0)); - self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 3)); + self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 0)); 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("sea_pickle", $factory->get(Ids::SEA_PICKLE, 0)); 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, 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_quartz_stairs", $factory->get(Ids::SMOOTH_QUARTZ_STAIRS, 0)); 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_red_sandstone_stairs", $factory->get(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 0)); 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_sandstone_stairs", $factory->get(Ids::SMOOTH_SANDSTONE_STAIRS, 0)); self::register("smooth_stone", $factory->get(Ids::SMOOTH_STONE, 0)); self::register("smooth_stone_slab", $factory->get(Ids::SMOOTH_STONE_SLAB, 0)); self::register("snow", $factory->get(Ids::SNOW, 0)); @@ -1076,15 +1076,15 @@ final class VanillaBlocks{ 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::SPRUCE_LEAVES, 0)); - self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 0)); + self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 2)); 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::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_stairs", $factory->get(Ids::SPRUCE_STAIRS, 0)); + self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 0)); + self::register("spruce_wall_sign", $factory->get(Ids::SPRUCE_WALL_SIGN, 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)); @@ -1093,25 +1093,25 @@ final class VanillaBlocks{ 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_BRICK_SLAB, 0)); - self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 3)); + self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 0)); 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_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("stone_stairs", $factory->get(Ids::STONE_STAIRS, 0)); + self::register("stonecutter", $factory->get(Ids::STONECUTTER, 0)); + self::register("stripped_acacia_log", $factory->get(Ids::STRIPPED_ACACIA_LOG, 2)); 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_log", $factory->get(Ids::STRIPPED_BIRCH_LOG, 2)); 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_log", $factory->get(Ids::STRIPPED_DARK_OAK_LOG, 2)); 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_log", $factory->get(Ids::STRIPPED_JUNGLE_LOG, 2)); 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_log", $factory->get(Ids::STRIPPED_OAK_LOG, 2)); 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_log", $factory->get(Ids::STRIPPED_SPRUCE_LOG, 2)); 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)); @@ -1119,20 +1119,20 @@ final class VanillaBlocks{ 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, 1)); - self::register("trapped_chest", $factory->get(Ids::TRAPPED_CHEST, 2)); + self::register("trapped_chest", $factory->get(Ids::TRAPPED_CHEST, 0)); self::register("tripwire", $factory->get(Ids::TRIPWIRE, 0)); - self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 2)); + self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 0)); 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_banner", $factory->get(Ids::WALL_BANNER, 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_glazed_terracotta", $factory->get(Ids::WHITE_GLAZED_TERRACOTTA, 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)); + self::register("yellow_glazed_terracotta", $factory->get(Ids::YELLOW_GLAZED_TERRACOTTA, 0)); } } From 2a0b500010ff34cb44d8ccb1883996c071ca7ea9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 18:08:34 +0100 Subject: [PATCH 0201/1858] Block: Separate encoding of type and state data the terminology of this needs improvement, but... the basic concept here is that 'type' data will persist on an itemstack, while 'state' data will not. Type data consists of things like: - Colour - Coral type - Wet/dry (sponges) - Live/dead (coral) - Wood type State data consists of things like: - Facing - Axis - Powered/unpowered - Open/closed In the past, with the old system, this information was separated by way of getStateBitmask(). This solution was fraught with problems, but achieved the basic goal: removing unwanted block properties from items. --- src/block/Anvil.php | 14 ++++-- src/block/BaseBanner.php | 10 ----- src/block/Bed.php | 2 - src/block/Block.php | 44 +++++++++++++++---- src/block/BlockFactory.php | 2 +- src/block/Dirt.php | 6 +-- src/block/FloorBanner.php | 17 +------ src/block/FloorCoralFan.php | 2 - src/block/Skull.php | 12 +++++ src/block/Sponge.php | 6 +-- src/block/TNT.php | 14 ++++-- src/block/VanillaBlocks.php | 4 +- src/block/WallBanner.php | 17 +------ src/block/WallCoralFan.php | 2 - src/block/utils/ColoredTrait.php | 10 ++--- src/block/utils/CoralTypeTrait.php | 10 +++-- .../block_factory_consistency_check.json | 2 +- .../BlockSerializerDeserializerTest.php | 18 ++++++++ 18 files changed, 112 insertions(+), 80 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 71fd046257..a2aef21611 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,15 +51,23 @@ class Anvil extends Transparent implements Fallable{ return $this->damage << 2; } - public function getRequiredStateDataBits() : int{ return 4; } + public function getRequiredTypeDataBits() : int{ return 2; } + + protected function decodeType(BlockDataReader $r) : void{ + $this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED)); + } + + protected function encodeType(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->getDamage()); + } + + public function getRequiredStateDataBits() : int{ return 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()); } diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 75e551eefa..2e9b07141c 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -55,16 +55,6 @@ abstract class BaseBanner extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - public function getRequiredStateDataBits() : int{ return 0; } - - 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 bf9aa730aa..025c8c652b 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -60,14 +60,12 @@ class Bed extends Transparent{ $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) } 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{ diff --git a/src/block/Block.php b/src/block/Block.php index a927842e4e..6d9b2bd72b 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -108,16 +108,31 @@ class Block{ return 0; } + public function getRequiredTypeDataBits() : int{ return 0; } + public function getRequiredStateDataBits() : int{ return 0; } final public function decodeStateData(int $data) : void{ - $givenBits = $this->getRequiredStateDataBits(); + $typeBits = $this->getRequiredTypeDataBits(); + $stateBits = $this->getRequiredStateDataBits(); + $givenBits = $typeBits + $stateBits; $reader = new BlockDataReader($givenBits, $data); - $this->decodeState($reader); + + $this->decodeType($reader); $readBits = $reader->getOffset(); - if($givenBits !== $readBits){ - throw new \LogicException("Exactly $givenBits bits of state data were provided, but only $readBits were read"); + if($typeBits !== $readBits){ + throw new \LogicException("Exactly $typeBits bits of type data were provided, but $readBits were read"); } + + $this->decodeState($reader); + $readBits = $reader->getOffset() - $typeBits; + if($stateBits !== $readBits){ + throw new \LogicException("Exactly $stateBits bits of state data were provided, but $readBits were read"); + } + } + + protected function decodeType(BlockDataReader $r) : void{ + //NOOP } protected function decodeState(BlockDataReader $r) : void{ @@ -128,17 +143,30 @@ class Block{ * @internal */ final public function computeStateData() : int{ - $requiredBits = $this->getRequiredStateDataBits(); + $typeBits = $this->getRequiredTypeDataBits(); + $stateBits = $this->getRequiredStateDataBits(); + $requiredBits = $typeBits + $stateBits; $writer = new BlockDataWriter($requiredBits); - $this->encodeState($writer); + $this->encodeType($writer); $writtenBits = $writer->getOffset(); - if($requiredBits !== $writtenBits){ - throw new \LogicException("Exactly $requiredBits bits of state data were expected, but only $writtenBits were written"); + if($typeBits !== $writtenBits){ + throw new \LogicException("Exactly $typeBits bits of type data were expected, but $writtenBits were written"); } + + $this->encodeState($writer); + $writtenBits = $writer->getOffset() - $typeBits; + if($stateBits !== $writtenBits){ + throw new \LogicException("Exactly $stateBits bits of state data were expected, but $writtenBits were written"); + } + return $writer->getValue(); } + protected function encodeType(BlockDataWriter $w) : void{ + //NOOP + } + protected function encodeState(BlockDataWriter $w) : void{ //NOOP } diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 1e3c48a1b7..41396b5f13 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -864,7 +864,7 @@ class BlockFactory{ //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 - $bits = $block->getRequiredStateDataBits(); + $bits = $block->getRequiredTypeDataBits() + $block->getRequiredStateDataBits(); if($bits > Block::INTERNAL_STATE_DATA_BITS){ throw new \InvalidArgumentException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index f163beebe9..735e665275 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -39,13 +39,13 @@ class Dirt extends Opaque{ return $this->coarse ? BlockLegacyMetadata::DIRT_FLAG_COARSE : 0; } - public function getRequiredStateDataBits() : int{ return 1; } + public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeType(BlockDataReader $r) : void{ $this->coarse = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeType(BlockDataWriter $w) : void{ $w->writeBool($this->coarse); } diff --git a/src/block/FloorBanner.php b/src/block/FloorBanner.php index 8da061e9b6..da1fddd6c3 100644 --- a/src/block/FloorBanner.php +++ b/src/block/FloorBanner.php @@ -33,22 +33,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class FloorBanner extends BaseBanner{ - use SignLikeRotationTrait { - decodeState as decodeRotation; - encodeState as encodeRotation; - } - - public function getRequiredStateDataBits() : int{ return 4; } - - protected function decodeState(BlockDataReader $r) : void{ - parent::decodeState($r); - $this->decodeRotation($r); - } - - protected function encodeState(BlockDataWriter $w) : void{ - parent::encodeState($w); - $this->encodeRotation($w); - } + use SignLikeRotationTrait; protected function getSupportingFace() : int{ return Facing::DOWN; diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index c88f9575a5..cf9d5ece00 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -50,12 +50,10 @@ final class FloorCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } 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); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 50b56f3d03..461446cbed 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -25,7 +25,9 @@ namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SkullType; use pocketmine\item\Item; @@ -51,6 +53,16 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $breakInfo); } + public function getRequiredTypeDataBits() : int{ return 3; } + + protected function decodeType(BlockDataReader $r) : void{ + $this->skullType = BlockDataReaderHelper::readSkullType($r); + } + + protected function encodeType(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeSkullType($w, $this->skullType); + } + public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(BlockDataReader $r) : void{ diff --git a/src/block/Sponge.php b/src/block/Sponge.php index 8f90242684..9fca8e9dc6 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -33,13 +33,13 @@ class Sponge extends Opaque{ return $this->wet ? BlockLegacyMetadata::SPONGE_FLAG_WET : 0; } - public function getRequiredStateDataBits() : int{ return 1; } + public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeType(BlockDataReader $r) : void{ $this->wet = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeType(BlockDataWriter $w) : void{ $w->writeBool($this->wet); } diff --git a/src/block/TNT.php b/src/block/TNT.php index 80f83e0151..bd7d13b433 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -49,16 +49,24 @@ class TNT extends Opaque{ return $this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0; } - public function getRequiredStateDataBits() : int{ return 2; } + public function getRequiredTypeDataBits() : int{ return 1; } + + protected function decodeType(BlockDataReader $r) : void{ + $this->worksUnderwater = $r->readBool(); + } + + protected function encodeType(BlockDataWriter $w) : void{ + $w->writeBool($this->worksUnderwater); + } + + public function getRequiredStateDataBits() : int{ return 1; } 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/VanillaBlocks.php b/src/block/VanillaBlocks.php index 0acd3385ec..070068ea10 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -626,7 +626,7 @@ final class VanillaBlocks{ 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, 0)); + self::register("bed", $factory->get(Ids::BED, 13)); self::register("bedrock", $factory->get(Ids::BEDROCK, 0)); self::register("beetroots", $factory->get(Ids::BEETROOTS, 0)); self::register("bell", $factory->get(Ids::BELL, 1)); @@ -943,7 +943,7 @@ final class VanillaBlocks{ 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, 2)); + self::register("mob_head", $factory->get(Ids::MOB_HEAD, 19)); 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::MOSSY_COBBLESTONE_SLAB, 0)); diff --git a/src/block/WallBanner.php b/src/block/WallBanner.php index 8eee17959d..53c1e179a1 100644 --- a/src/block/WallBanner.php +++ b/src/block/WallBanner.php @@ -34,22 +34,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class WallBanner extends BaseBanner{ - use HorizontalFacingTrait { - decodeState as decodeFacing; - encodeState as encodeFacing; - } - - public function getRequiredStateDataBits() : int{ return 2; } - - protected function decodeState(BlockDataReader $r) : void{ - parent::decodeState($r); - $this->decodeFacing($r); - } - - protected function encodeState(BlockDataWriter $w) : void{ - parent::encodeState($w); - $this->encodeFacing($w); - } + use HorizontalFacingTrait; protected function getSupportingFace() : int{ return Facing::opposite($this->facing); diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index c4043ed04d..d713c4164c 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -49,12 +49,10 @@ final class WallCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } 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); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index a8efd46ae2..afd060229a 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -37,15 +37,15 @@ trait ColoredTrait{ return DyeColorIdMap::getInstance()->toId($this->color); } - public function getRequiredStateDataBits() : int{ return 4; } + public function getRequiredTypeDataBits() : int{ return 4; } - /** @see Block::decodeState() */ - protected function decodeState(BlockDataReader $r) : void{ + /** @see Block::decodeType() */ + protected function decodeType(BlockDataReader $r) : void{ $this->color = BlockDataReaderHelper::readDyeColor($r); } - /** @see Block::encodeState() */ - protected function encodeState(BlockDataWriter $w) : void{ + /** @see Block::encodeType() */ + protected function encodeType(BlockDataWriter $w) : void{ BlockDataWriterHelper::writeDyeColor($w, $this->color); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index c91213a13a..5cc3f08755 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -23,18 +23,22 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\block\Block; + trait CoralTypeTrait{ protected CoralType $coralType; protected bool $dead = false; - public function getRequiredStateDataBits() : int{ return 4; } + public function getRequiredTypeDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + /** @see Block::decodeType() */ + protected function decodeType(BlockDataReader $r) : void{ $this->coralType = BlockDataReaderHelper::readCoralType($r); $this->dead = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + /** @see Block::encodeType() */ + protected function encodeType(BlockDataWriter $w) : void{ BlockDataWriterHelper::writeCoralType($w, $this->coralType); $w->writeBool($this->dead); } diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 30e17a9768..44867a72f6 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298177":"Mob Head","5298178":"Mob Head","5298179":"Mob Head","5298180":"Mob Head","5298181":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5393920":"White Glazed Terracotta","5393921":"White Glazed Terracotta","5393922":"White Glazed Terracotta","5393923":"White Glazed Terracotta","5318656":"Orange Glazed Terracotta","5318657":"Orange Glazed Terracotta","5318658":"Orange Glazed Terracotta","5318659":"Orange Glazed Terracotta","5295616":"Magenta Glazed Terracotta","5295617":"Magenta Glazed Terracotta","5295618":"Magenta Glazed Terracotta","5295619":"Magenta Glazed Terracotta","5291520":"Light Blue Glazed Terracotta","5291521":"Light Blue Glazed Terracotta","5291522":"Light Blue Glazed Terracotta","5291523":"Light Blue Glazed Terracotta","5395456":"Yellow Glazed Terracotta","5395457":"Yellow Glazed Terracotta","5395458":"Yellow Glazed Terracotta","5395459":"Yellow Glazed Terracotta","5294080":"Lime Glazed Terracotta","5294081":"Lime Glazed Terracotta","5294082":"Lime Glazed Terracotta","5294083":"Lime Glazed Terracotta","5321216":"Pink Glazed Terracotta","5321217":"Pink Glazed Terracotta","5321218":"Pink Glazed Terracotta","5321219":"Pink Glazed Terracotta","5265920":"Gray Glazed Terracotta","5265921":"Gray Glazed Terracotta","5265922":"Gray Glazed Terracotta","5265923":"Gray Glazed Terracotta","5292032":"Light Gray Glazed Terracotta","5292033":"Light Gray Glazed Terracotta","5292034":"Light Gray Glazed Terracotta","5292035":"Light Gray Glazed Terracotta","5170688":"Cyan Glazed Terracotta","5170689":"Cyan Glazed Terracotta","5170690":"Cyan Glazed Terracotta","5170691":"Cyan Glazed Terracotta","5333504":"Purple Glazed Terracotta","5333505":"Purple Glazed Terracotta","5333506":"Purple Glazed Terracotta","5333507":"Purple Glazed Terracotta","5146624":"Blue Glazed Terracotta","5146625":"Blue Glazed Terracotta","5146626":"Blue Glazed Terracotta","5146627":"Blue Glazed Terracotta","5152256":"Brown Glazed Terracotta","5152257":"Brown Glazed Terracotta","5152258":"Brown Glazed Terracotta","5152259":"Brown Glazed Terracotta","5266432":"Green Glazed Terracotta","5266433":"Green Glazed Terracotta","5266434":"Green Glazed Terracotta","5266435":"Green Glazed Terracotta","5339136":"Red Glazed Terracotta","5339137":"Red Glazed Terracotta","5339138":"Red Glazed Terracotta","5339139":"Red Glazed Terracotta","5145600":"Black Glazed Terracotta","5145601":"Black Glazed Terracotta","5145602":"Black Glazed Terracotta","5145603":"Black Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5393920":"White Glazed Terracotta","5393921":"White Glazed Terracotta","5393922":"White Glazed Terracotta","5393923":"White Glazed Terracotta","5318656":"Orange Glazed Terracotta","5318657":"Orange Glazed Terracotta","5318658":"Orange Glazed Terracotta","5318659":"Orange Glazed Terracotta","5295616":"Magenta Glazed Terracotta","5295617":"Magenta Glazed Terracotta","5295618":"Magenta Glazed Terracotta","5295619":"Magenta Glazed Terracotta","5291520":"Light Blue Glazed Terracotta","5291521":"Light Blue Glazed Terracotta","5291522":"Light Blue Glazed Terracotta","5291523":"Light Blue Glazed Terracotta","5395456":"Yellow Glazed Terracotta","5395457":"Yellow Glazed Terracotta","5395458":"Yellow Glazed Terracotta","5395459":"Yellow Glazed Terracotta","5294080":"Lime Glazed Terracotta","5294081":"Lime Glazed Terracotta","5294082":"Lime Glazed Terracotta","5294083":"Lime Glazed Terracotta","5321216":"Pink Glazed Terracotta","5321217":"Pink Glazed Terracotta","5321218":"Pink Glazed Terracotta","5321219":"Pink Glazed Terracotta","5265920":"Gray Glazed Terracotta","5265921":"Gray Glazed Terracotta","5265922":"Gray Glazed Terracotta","5265923":"Gray Glazed Terracotta","5292032":"Light Gray Glazed Terracotta","5292033":"Light Gray Glazed Terracotta","5292034":"Light Gray Glazed Terracotta","5292035":"Light Gray Glazed Terracotta","5170688":"Cyan Glazed Terracotta","5170689":"Cyan Glazed Terracotta","5170690":"Cyan Glazed Terracotta","5170691":"Cyan Glazed Terracotta","5333504":"Purple Glazed Terracotta","5333505":"Purple Glazed Terracotta","5333506":"Purple Glazed Terracotta","5333507":"Purple Glazed Terracotta","5146624":"Blue Glazed Terracotta","5146625":"Blue Glazed Terracotta","5146626":"Blue Glazed Terracotta","5146627":"Blue Glazed Terracotta","5152256":"Brown Glazed Terracotta","5152257":"Brown Glazed Terracotta","5152258":"Brown Glazed Terracotta","5152259":"Brown Glazed Terracotta","5266432":"Green Glazed Terracotta","5266433":"Green Glazed Terracotta","5266434":"Green Glazed Terracotta","5266435":"Green Glazed Terracotta","5339136":"Red Glazed Terracotta","5339137":"Red Glazed Terracotta","5339138":"Red Glazed Terracotta","5339139":"Red Glazed Terracotta","5145600":"Black Glazed Terracotta","5145601":"Black Glazed Terracotta","5145602":"Black Glazed Terracotta","5145603":"Black Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index 33232f5533..a9566aa6d5 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -24,9 +24,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use PHPUnit\Framework\TestCase; +use pocketmine\block\Bed; use pocketmine\block\BlockFactory; +use pocketmine\block\BlockTypeIds; +use pocketmine\block\Skull; +use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateSerializeException; +use pocketmine\block\BaseBanner; use function print_r; final class BlockSerializerDeserializerTest extends TestCase{ @@ -51,6 +56,19 @@ final class BlockSerializerDeserializerTest extends TestCase{ self::fail($e->getMessage()); } + //The following are workarounds for differences in blockstate representation in Bedrock vs PM + //In these cases, some properties are not stored in the blockstate (but rather in the block entity NBT), but + //they do form part of the internal blockstate hash in PM. This leads to inconsistencies when serializing + //and deserializing blockstates. + if( + ($block instanceof BaseBanner && $newBlock instanceof BaseBanner) || + ($block instanceof Bed && $newBlock instanceof Bed) + ){ + $newBlock->setColor($block->getColor()); + }elseif($block instanceof Skull && $newBlock instanceof Skull){ + $newBlock->setSkullType($block->getSkullType()); + } + self::assertSame($block->getStateId(), $newBlock->getStateId(), "Mismatch of blockstate for " . $block->getName() . ", " . print_r($block, true) . " vs " . print_r($newBlock, true)); } } From af8f2c47f392d38622e2d5828b3023f5f36f17ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 19:03:07 +0100 Subject: [PATCH 0202/1858] ShulkerBoxInventory: avoid usage of legacy ItemIds --- src/block/inventory/ShulkerBoxInventory.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/block/inventory/ShulkerBoxInventory.php b/src/block/inventory/ShulkerBoxInventory.php index a61e371987..102e0b648c 100644 --- a/src/block/inventory/ShulkerBoxInventory.php +++ b/src/block/inventory/ShulkerBoxInventory.php @@ -23,9 +23,10 @@ declare(strict_types=1); namespace pocketmine\block\inventory; +use pocketmine\block\BlockTypeIds; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; -use pocketmine\item\ItemIds; +use pocketmine\item\ItemBlock; use pocketmine\network\mcpe\protocol\BlockEventPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\world\Position; @@ -50,8 +51,11 @@ class ShulkerBoxInventory extends SimpleInventory implements BlockInventory{ } public function canAddItem(Item $item) : bool{ - if($item->getId() === ItemIds::UNDYED_SHULKER_BOX || $item->getId() === ItemIds::SHULKER_BOX){ - return false; + if($item instanceof ItemBlock){ + $blockTypeId = $item->getBlock()->getTypeId(); + if($blockTypeId === BlockTypeIds::SHULKER_BOX || $blockTypeId === BlockTypeIds::DYED_SHULKER_BOX){ + return false; + } } return parent::canAddItem($item); } From 4bd087fc83450d67f83720cbd5f27ac950d04041 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 19:09:49 +0100 Subject: [PATCH 0203/1858] Fix CS --- src/block/BaseBanner.php | 2 -- src/block/FloorBanner.php | 2 -- src/block/WallBanner.php | 2 -- .../bedrock/block/convert/BlockSerializerDeserializerTest.php | 4 +--- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 2e9b07141c..3cc59ae780 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -25,8 +25,6 @@ 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; diff --git a/src/block/FloorBanner.php b/src/block/FloorBanner.php index da1fddd6c3..73bc457878 100644 --- a/src/block/FloorBanner.php +++ b/src/block/FloorBanner.php @@ -23,8 +23,6 @@ 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; diff --git a/src/block/WallBanner.php b/src/block/WallBanner.php index 53c1e179a1..5182fe9f8f 100644 --- a/src/block/WallBanner.php +++ b/src/block/WallBanner.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Axis; diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index a9566aa6d5..24f6bc7502 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -24,14 +24,12 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use PHPUnit\Framework\TestCase; +use pocketmine\block\BaseBanner; use pocketmine\block\Bed; use pocketmine\block\BlockFactory; -use pocketmine\block\BlockTypeIds; use pocketmine\block\Skull; -use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateSerializeException; -use pocketmine\block\BaseBanner; use function print_r; final class BlockSerializerDeserializerTest extends TestCase{ From db2b523762e9664564cdce93248634b1c4bd3022 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 19:16:20 +0100 Subject: [PATCH 0204/1858] Item is no longer JsonSerializable before anyone starts screaming: 1) it's easy to create your own wrapper that converts items to arrays 2) there is no longer a single standard way to encode items. 3) the way that item serialization now works requires an ItemSerializer, which, barring singleton use, must be dependency-injected. Since there's no way to inject dependencies into jsonSerialize(), this means that its behaviour cannot be customized. --- .../CraftingManagerFromDataHelper.php | 14 +++--- src/inventory/CreativeInventory.php | 2 +- src/item/Item.php | 43 ++++++++----------- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 455e0315e4..cb639209a0 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -57,7 +57,7 @@ final class CraftingManagerFromDataHelper{ //TODO: we need to stop using jsonDeserialize for this try{ - $item = Item::jsonDeserialize($data); + $item = Item::legacyJsonDeserialize($data); }catch(SavedDataLoadingException){ //unknown item return null; @@ -74,7 +74,7 @@ final class CraftingManagerFromDataHelper{ $result = new CraftingManager(); $ingredientDeserializerFunc = \Closure::fromCallable([self::class, "deserializeIngredient"]); - $itemDeserializerFunc = \Closure::fromCallable([Item::class, 'jsonDeserialize']); + $itemDeserializerFunc = \Closure::fromCallable([Item::class, 'legacyJsonDeserialize']); foreach($recipes["shapeless"] as $recipe){ $recipeType = match($recipe["block"]){ @@ -142,7 +142,7 @@ final class CraftingManagerFromDataHelper{ continue; } try{ - $output = Item::jsonDeserialize($recipe["output"]); + $output = Item::legacyJsonDeserialize($recipe["output"]); }catch(SavedDataLoadingException){ continue; } @@ -157,9 +157,9 @@ final class CraftingManagerFromDataHelper{ } foreach($recipes["potion_type"] as $recipe){ try{ - $input = Item::jsonDeserialize($recipe["input"]); - $ingredient = Item::jsonDeserialize($recipe["ingredient"]); - $output = Item::jsonDeserialize($recipe["output"]); + $input = Item::legacyJsonDeserialize($recipe["input"]); + $ingredient = Item::legacyJsonDeserialize($recipe["ingredient"]); + $output = Item::legacyJsonDeserialize($recipe["output"]); }catch(SavedDataLoadingException){ //unknown item continue; @@ -172,7 +172,7 @@ final class CraftingManagerFromDataHelper{ } foreach($recipes["potion_container_change"] as $recipe){ try{ - $ingredient = Item::jsonDeserialize($recipe["ingredient"]); + $ingredient = Item::legacyJsonDeserialize($recipe["ingredient"]); }catch(SavedDataLoadingException){ //unknown item continue; diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 43a8b9a0e2..c9eced6136 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -41,7 +41,7 @@ final class CreativeInventory{ foreach($creativeItems as $data){ try{ - $item = Item::jsonDeserialize($data); + $item = Item::legacyJsonDeserialize($data); }catch(SavedDataLoadingException){ //unknown item continue; diff --git a/src/item/Item.php b/src/item/Item.php index 48a3509c7a..13d5ce80cb 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -575,38 +575,21 @@ class Item implements \JsonSerializable{ } /** - * Returns an array of item stack properties that can be serialized to json. - * - * @return mixed[] - * @phpstan-return array{id: int, damage?: int, count?: int, nbt_b64?: string} + * @phpstan-return never */ - final public function jsonSerialize() : array{ - $data = [ - "id" => $this->getId() - ]; - - if($this->getMeta() !== 0){ - $data["damage"] = $this->getMeta(); - } - - if($this->getCount() !== 1){ - $data["count"] = $this->getCount(); - } - - if($this->hasNamedTag()){ - $data["nbt_b64"] = base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))); - } - - return $data; + public function jsonSerialize() : array{ + throw new \LogicException("json_encode()ing Item instances is no longer supported. Make your own method to convert the item to an array or stdClass."); } /** + * @deprecated This is intended for deserializing legacy data from the old crafting JSON and creative JSON data. + * * Returns an Item from properties created in an array by {@link Item#jsonSerialize} * @param mixed[] $data * * @throws SavedDataLoadingException */ - final public static function jsonDeserialize(array $data) : Item{ + final public static function legacyJsonDeserialize(array $data) : Item{ $nbt = ""; //Backwards compatibility @@ -617,9 +600,19 @@ class Item implements \JsonSerializable{ }elseif(isset($data["nbt_b64"])){ $nbt = base64_decode($data["nbt_b64"], true); } - return ItemFactory::getInstance()->get( - (int) $data["id"], (int) ($data["damage"] ?? 0), (int) ($data["count"] ?? 1), $nbt !== "" ? (new LittleEndianNbtSerializer())->read($nbt)->mustGetCompoundTag() : null + + $itemStackData = GlobalItemDataHandlers::getUpgrader()->upgradeItemTypeDataInt( + (int) $data["id"], + (int) ($data["damage"] ?? 0), + (int) ($data["count"] ?? 1), + $nbt !== "" ? (new LittleEndianNbtSerializer())->read($nbt)->mustGetCompoundTag() : null ); + + try{ + return GlobalItemDataHandlers::getDeserializer()->deserializeStack($itemStackData); + }catch(ItemTypeDeserializeException $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } } /** From ba079bd9aa090b211bc58d3028122364808e63c2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 20:00:41 +0100 Subject: [PATCH 0205/1858] Avoid implicit ItemFactory reliance for blocks with special items this hasn't yet been addressed for signs, since they are a bit of a pain in the ass. --- src/block/Bamboo.php | 5 +++++ src/block/BambooSapling.php | 3 ++- src/block/BaseBanner.php | 10 +++++----- src/block/Bed.php | 6 ++++++ src/block/Beetroot.php | 2 +- src/block/Carrot.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/FloorCoralFan.php | 15 +++++---------- src/block/MelonStem.php | 7 +++++++ src/block/Potato.php | 2 +- src/block/PumpkinStem.php | 7 +++++++ src/block/RedstoneWire.php | 5 +++++ src/block/Skull.php | 6 ++++-- src/block/WallCoralFan.php | 15 +++++---------- src/block/Wheat.php | 2 +- 15 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index ccd63ced96..61284cfdd4 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -30,6 +30,7 @@ use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -243,4 +244,8 @@ class Bamboo extends Transparent{ $world->setBlock($this->position, $this); } } + + public function asItem() : Item{ + return VanillaItems::BAMBOO(); + } } diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 66b8162417..6171657c4d 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -29,6 +29,7 @@ use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; @@ -126,6 +127,6 @@ final class BambooSapling extends Flowable{ } public function asItem() : Item{ - return VanillaBlocks::BAMBOO()->asItem(); + return VanillaItems::BAMBOO(); } } diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 3cc59ae780..fd2b225bf9 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -28,9 +28,9 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SupportType; -use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\item\Banner as ItemBanner; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -129,10 +129,6 @@ abstract class BaseBanner extends Transparent{ } } - protected function writeStateToItemMeta() : int{ - return DyeColorIdMap::getInstance()->toInvertedId($this->color); - } - public function getDropsForCompatibleTool(Item $item) : array{ $drop = $this->asItem(); if($drop instanceof ItemBanner && count($this->patterns) > 0){ @@ -149,4 +145,8 @@ abstract class BaseBanner extends Transparent{ } return $result; } + + public function asItem() : Item{ + return VanillaItems::BANNER()->setColor($this->color); + } } diff --git a/src/block/Bed.php b/src/block/Bed.php index 025c8c652b..46d21a23a7 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -33,6 +33,7 @@ use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\lang\KnownTranslationFactory; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -218,4 +219,9 @@ class Bed extends Transparent{ private function canBeSupportedBy(Block $block) : bool{ return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); } + + public function asItem() : Item{ + //TODO: we might be able to get rid of this + return VanillaItems::BED()->setColor($this->color); + } } diff --git a/src/block/Beetroot.php b/src/block/Beetroot.php index 5afbe44125..b87a841ea2 100644 --- a/src/block/Beetroot.php +++ b/src/block/Beetroot.php @@ -42,7 +42,7 @@ class Beetroot extends Crops{ ]; } - public function getPickedItem(bool $addUserData = false) : Item{ + public function asItem() : Item{ return VanillaItems::BEETROOT_SEEDS(); } } diff --git a/src/block/Carrot.php b/src/block/Carrot.php index c03d107378..895b0a37db 100644 --- a/src/block/Carrot.php +++ b/src/block/Carrot.php @@ -35,7 +35,7 @@ class Carrot extends Crops{ ]; } - public function getPickedItem(bool $addUserData = false) : Item{ + public function asItem() : Item{ return VanillaItems::CARROT(); } } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 89f8bccf60..572a098ee9 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -147,7 +147,7 @@ class CocoaBlock extends Transparent{ ]; } - public function getPickedItem(bool $addUserData = false) : Item{ + public function asItem() : Item{ return VanillaItems::COCOA_BEANS(); } } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index cf9d5ece00..6dcd5420ad 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -25,9 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\BlockDataReader; use pocketmine\block\utils\BlockDataWriter; -use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; -use pocketmine\item\ItemIds; +use pocketmine\item\VanillaItems; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -39,14 +38,6 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - public function getLegacyItemId() : int{ - return $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN; - } - - protected function writeStateToItemMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); - } - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } protected function decodeState(BlockDataReader $r) : void{ @@ -98,4 +89,8 @@ final class FloorCoralFan extends BaseCoral{ private function canBeSupportedBy(Block $block) : bool{ return $block->getSupportType(Facing::UP)->hasCenterSupport(); } + + public function asItem() : Item{ + return VanillaItems::CORAL_FAN()->setCoralType($this->coralType)->setDead($this->dead); + } } diff --git a/src/block/MelonStem.php b/src/block/MelonStem.php index d0282a546d..8ead526afa 100644 --- a/src/block/MelonStem.php +++ b/src/block/MelonStem.php @@ -23,9 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\item\Item; +use pocketmine\item\VanillaItems; + class MelonStem extends Stem{ protected function getPlant() : Block{ return VanillaBlocks::MELON(); } + + public function asItem() : Item{ + return VanillaItems::MELON_SEEDS(); + } } diff --git a/src/block/Potato.php b/src/block/Potato.php index 209107156d..47d39f6126 100644 --- a/src/block/Potato.php +++ b/src/block/Potato.php @@ -39,7 +39,7 @@ class Potato extends Crops{ return $result; } - public function getPickedItem(bool $addUserData = false) : Item{ + public function asItem() : Item{ return VanillaItems::POTATO(); } } diff --git a/src/block/PumpkinStem.php b/src/block/PumpkinStem.php index d7b8e2588d..9151ce2dcc 100644 --- a/src/block/PumpkinStem.php +++ b/src/block/PumpkinStem.php @@ -23,9 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\item\Item; +use pocketmine\item\VanillaItems; + class PumpkinStem extends Stem{ protected function getPlant() : Block{ return VanillaBlocks::PUMPKIN(); } + + public function asItem() : Item{ + return VanillaItems::PUMPKIN_SEEDS(); + } } diff --git a/src/block/RedstoneWire.php b/src/block/RedstoneWire.php index aff8ec32eb..7c770e9c42 100644 --- a/src/block/RedstoneWire.php +++ b/src/block/RedstoneWire.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -54,4 +55,8 @@ class RedstoneWire extends Flowable{ private function canBeSupportedBy(Block $block) : bool{ return $block->getSupportType(Facing::UP)->hasCenterSupport(); } + + public function asItem() : Item{ + return VanillaItems::REDSTONE_DUST(); + } } diff --git a/src/block/Skull.php b/src/block/Skull.php index 461446cbed..5eb2749e77 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -31,6 +31,7 @@ use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SkullType; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -153,7 +154,8 @@ class Skull extends Flowable{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - protected function writeStateToItemMeta() : int{ - return $this->skullType->getMagicNumber(); + public function asItem() : Item{ + //TODO: we might be able to get rid of this + return VanillaItems::MOB_HEAD()->setSkullType($this->skullType); } } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index d713c4164c..4ab9251c07 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -26,9 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\BlockDataReader; use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; -use pocketmine\item\ItemIds; +use pocketmine\item\VanillaItems; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -38,14 +37,6 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - public function getLegacyItemId() : int{ - return $this->dead ? ItemIds::CORAL_FAN_DEAD : ItemIds::CORAL_FAN; - } - - protected function writeStateToItemMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); - } - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } protected function decodeState(BlockDataReader $r) : void{ @@ -77,4 +68,8 @@ final class WallCoralFan extends BaseCoral{ private function canBeSupportedBy(Block $block, int $face) : bool{ return $block->getSupportType($face)->hasCenterSupport(); } + + public function asItem() : Item{ + return VanillaItems::CORAL_FAN()->setCoralType($this->coralType)->setDead($this->dead); + } } diff --git a/src/block/Wheat.php b/src/block/Wheat.php index ccccd015a7..15701c9760 100644 --- a/src/block/Wheat.php +++ b/src/block/Wheat.php @@ -42,7 +42,7 @@ class Wheat extends Crops{ } } - public function getPickedItem(bool $addUserData = false) : Item{ + public function asItem() : Item{ return VanillaItems::WHEAT_SEEDS(); } } From a64adbfffe4d02a00918b14e7b4e272d2392bb77 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 20:16:55 +0100 Subject: [PATCH 0206/1858] Fix PHPStan errors --- src/inventory/CreativeInventory.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index c9eced6136..136f2da920 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -38,8 +38,14 @@ final class CreativeInventory{ private function __construct(){ $creativeItems = json_decode(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json")), true); + if(!is_array($creativeItems)){ + throw new SavedDataLoadingException("Invalid creative items file, expected array as root type"); + } foreach($creativeItems as $data){ + if(!is_array($data)){ + throw new SavedDataLoadingException("Invalid creative items file, expected array as item type"); + } try{ $item = Item::legacyJsonDeserialize($data); }catch(SavedDataLoadingException){ From 8858b16a25239d216a1d63c4a047d7cb31be3b81 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Jun 2022 20:18:25 +0100 Subject: [PATCH 0207/1858] Fucking CS again --- src/inventory/CreativeInventory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 136f2da920..9c405b92cd 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -28,6 +28,7 @@ use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; use function file_get_contents; +use function is_array; use function json_decode; final class CreativeInventory{ From 7994da07becbe476910418437c539a73cecae011 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 16:37:39 +0100 Subject: [PATCH 0208/1858] Crafting recipe network serialization no longer depends on PM's internal legacy metadata WOOOOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!!!! --- composer.lock | 8 +- .../mcpe/convert/BlockStateDictionary.php | 85 ++++++++++++++++--- .../convert/BlockStateDictionaryEntry.php | 38 +++++++++ .../mcpe/convert/RuntimeBlockMapping.php | 7 +- src/network/mcpe/convert/TypeConverter.php | 26 ++++-- tools/generate-block-palette-spec.php | 20 ++++- 6 files changed, 156 insertions(+), 28 deletions(-) create mode 100644 src/network/mcpe/convert/BlockStateDictionaryEntry.php diff --git a/composer.lock b/composer.lock index 50a4050fd2..8b5a59aabf 100644 --- a/composer.lock +++ b/composer.lock @@ -280,12 +280,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75" + "reference": "a546e15f6a8d7498fb25d5a02ce16184a429bb78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75", - "reference": "6a28ede3e9cdf1c548e85ce24382fee5f1bd9d75", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/a546e15f6a8d7498fb25d5a02ce16184a429bb78", + "reference": "a546e15f6a8d7498fb25d5a02ce16184a429bb78", "shasum": "" }, "type": "library", @@ -298,7 +298,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-06-08T14:00:34+00:00" + "time": "2022-07-02T15:28:28+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 48b31e67f5..584b7db62f 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -27,27 +27,53 @@ use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; +use function get_debug_type; +use function is_array; +use function is_int; +use function json_decode; /** * Handles translation of network block runtime IDs into blockstate data, and vice versa */ final class BlockStateDictionary{ - private BlockStateLookupCache $lookupCache; + private BlockStateLookupCache $stateDataToStateIdLookupCache; + /** + * @var int[][]|null + * @phpstan-var array>|null + */ + private ?array $idMetaToStateIdLookupCache = null; /** - * @param BlockStateData[] $states + * @param BlockStateDictionaryEntry[] $states * - * @phpstan-param list $states + * @phpstan-param list $states */ public function __construct( private array $states ){ - $this->lookupCache = new BlockStateLookupCache($this->states); + $this->stateDataToStateIdLookupCache = new BlockStateLookupCache(array_map(fn(BlockStateDictionaryEntry $entry) => $entry->getStateData(), $this->states)); + } + + /** + * @return int[][] + * @phpstan-return array> + */ + private function getIdMetaToStateIdLookup() : array{ + if($this->idMetaToStateIdLookupCache === null){ + //TODO: if we ever allow mutating the dictionary, this would need to be rebuilt on modification + $this->idMetaToStateIdLookupCache = []; + + foreach($this->states as $i => $state){ + $this->idMetaToStateIdLookupCache[$state->getMeta()][$state->getStateData()->getName()] = $i; + } + } + + return $this->idMetaToStateIdLookupCache; } public function getDataFromStateId(int $networkRuntimeId) : ?BlockStateData{ - return $this->states[$networkRuntimeId] ?? null; + return ($this->states[$networkRuntimeId] ?? null)?->getStateData(); } /** @@ -55,20 +81,55 @@ final class BlockStateDictionary{ * Returns null if there were no matches. */ public function lookupStateIdFromData(BlockStateData $data) : ?int{ - return $this->lookupCache->lookupStateId($data); + return $this->stateDataToStateIdLookupCache->lookupStateId($data); + } + + /** + * Returns the blockstate meta value associated with the given blockstate runtime ID. + * This is used for serializing crafting recipe inputs. + */ + public function getMetaFromStateId(int $networkRuntimeId) : ?int{ + return ($this->states[$networkRuntimeId] ?? null)?->getMeta(); + } + + /** + * Returns the blockstate data associated with the given block ID and meta value. + * This is used for deserializing crafting recipe inputs. + */ + public function lookupStateIdFromIdMeta(string $id, int $meta) : ?int{ + return $this->getIdMetaToStateIdLookup()[$meta][$id] ?? null; } /** * Returns an array mapping runtime ID => blockstate data. - * @return BlockStateData[] - * @phpstan-return array + * @return BlockStateDictionaryEntry[] + * @phpstan-return array */ public function getStates() : array{ return $this->states; } - public static function loadFromString(string $contents) : self{ - return new self(array_map( + public static function loadFromString(string $blockPaletteContents, string $metaMapContents) : self{ + $metaMap = json_decode($metaMapContents, flags: JSON_THROW_ON_ERROR); + if(!is_array($metaMap)){ + throw new \InvalidArgumentException("Invalid metaMap, expected array for root type, got " . get_debug_type($metaMap)); + } + + $entries = []; + $states = array_map( fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple($contents) - )); + (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) + ); + + foreach($states as $i => $state){ + $meta = $metaMap[$i] ?? null; + if($meta === null){ + throw new \InvalidArgumentException("Missing associated meta value for state $i (" . $state->toNbt() . ")"); + } + if(!is_int($meta)){ + throw new \InvalidArgumentException("Invalid metaMap offset $i, expected int, got " . get_debug_type($meta)); + } + $entries[$i] = new BlockStateDictionaryEntry($state, $meta); + } + + return new self($entries); } } diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php new file mode 100644 index 0000000000..53229963bb --- /dev/null +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -0,0 +1,38 @@ +stateData; } + + public function getMeta() : int{ return $this->meta; } +} diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index c0373de112..9c9402d319 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -53,9 +53,12 @@ final class RuntimeBlockMapping{ private static function make() : self{ $canonicalBlockStatesFile = Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt"); - $contents = Utils::assumeNotFalse(file_get_contents($canonicalBlockStatesFile), "Missing required resource file"); + $canonicalBlockStatesRaw = Utils::assumeNotFalse(file_get_contents($canonicalBlockStatesFile), "Missing required resource file"); + + $metaMappingFile = Path::join(\pocketmine\BEDROCK_DATA_PATH, 'block_state_meta_map.json'); + $metaMappingRaw = Utils::assumeNotFalse(file_get_contents($metaMappingFile), "Missing required resource file"); return new self( - BlockStateDictionary::loadFromString($contents), + BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), GlobalBlockStateHandlers::getSerializer() ); } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 653ffed75e..4f58a28355 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -32,6 +32,7 @@ use pocketmine\block\VanillaBlocks; use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\SavedDataLoadingException; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; @@ -126,11 +127,12 @@ class TypeConverter{ $meta = self::RECIPE_INPUT_WILDCARD_META; }elseif($ingredient instanceof ExactRecipeIngredient){ $item = $ingredient->getItem(); - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($item); - if($id < 256){ - //TODO: this is needed for block crafting recipes to work - we need to replace this with some kind of - //blockstate <-> meta mapping table so that we can remove the legacy code from the core - $meta = $item->getMeta(); + [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId($item); + if($blockRuntimeId !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ + $meta = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); + if($meta === null){ + throw new AssumptionFailedError("Every block state should have an associated meta value"); + } } }else{ throw new \LogicException("Unsupported recipe ingredient type " . get_class($ingredient) . ", only " . ExactRecipeIngredient::class . " and " . MetaWildcardRecipeIngredient::class . " are supported"); @@ -143,13 +145,21 @@ class TypeConverter{ return null; } + $itemId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($ingredient->getId()); + if($ingredient->getMeta() === self::RECIPE_INPUT_WILDCARD_META){ - $itemId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($ingredient->getId()); return new MetaWildcardRecipeIngredient($itemId); } - //TODO: this won't be handled properly for blockitems because a block runtimeID is expected rather than a meta value - $result = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), $ingredient->getMeta(), 0); + $meta = $ingredient->getMeta(); + $blockRuntimeId = null; + if(($blockId = BlockItemIdMap::getInstance()->lookupBlockId($itemId)) !== null){ + $blockRuntimeId = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->lookupStateIdFromIdMeta($blockId, $meta); + if($blockRuntimeId !== null){ + $meta = 0; + } + } + $result = ItemTranslator::getInstance()->fromNetworkId($ingredient->getId(), $meta, $blockRuntimeId ?? ItemTranslator::NO_BLOCK_RUNTIME_ID); return new ExactRecipeIngredient($result); } diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index 330e531239..a9992ec1aa 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -23,14 +23,19 @@ declare(strict_types=1); namespace pocketmine\tools\generate_block_palette_spec; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; +use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\BlockStateDictionary; +use pocketmine\network\mcpe\convert\BlockStateDictionaryEntry; +use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; +use function array_map; use function array_values; use function count; use function dirname; @@ -51,15 +56,26 @@ if(count($argv) !== 3){ [, $inputFile, $outputFile] = $argv; try{ - $palette = BlockStateDictionary::loadFromString(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))); + $states = array_map( + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + (new NetworkNbtSerializer())->readMultiple(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))) + ); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); } +$entries = []; +$fakeMeta = []; +foreach($states as $state){ + $fakeMeta[$state->getName()] ??= 0; + $entries[] = new BlockStateDictionaryEntry($state, $fakeMeta[$state->getName()]++); +} +$palette = new BlockStateDictionary($entries); $reportMap = []; -foreach($palette->getStates() as $state){ +foreach($palette->getStates() as $entry){ + $state = $entry->getStateData(); $name = $state->getName(); foreach($state->getStates() as $propertyName => $value){ if($value instanceof IntTag || $value instanceof StringTag){ From 3792ef5a50c3b9b8cdd16ecb72222b2e387a8c53 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 16:48:41 +0100 Subject: [PATCH 0209/1858] Move blockstate data runtime serialization to a more appropriate package --- src/block/Anvil.php | 4 ++-- src/block/Bamboo.php | 4 ++-- src/block/BambooSapling.php | 4 ++-- src/block/Barrel.php | 4 ++-- src/block/Bed.php | 4 ++-- src/block/Bedrock.php | 4 ++-- src/block/Bell.php | 8 ++++---- src/block/Block.php | 4 ++-- src/block/BrewingStand.php | 8 ++++---- src/block/Button.php | 4 ++-- src/block/Cactus.php | 4 ++-- src/block/Cake.php | 4 ++-- src/block/CocoaBlock.php | 4 ++-- src/block/Crops.php | 4 ++-- src/block/DaylightSensor.php | 4 ++-- src/block/DetectorRail.php | 4 ++-- src/block/Dirt.php | 4 ++-- src/block/Door.php | 4 ++-- src/block/DoublePlant.php | 4 ++-- src/block/EndPortalFrame.php | 4 ++-- src/block/Farmland.php | 4 ++-- src/block/FenceGate.php | 4 ++-- src/block/Fire.php | 4 ++-- src/block/FloorCoralFan.php | 4 ++-- src/block/FrostedIce.php | 4 ++-- src/block/Furnace.php | 4 ++-- src/block/Hopper.php | 4 ++-- src/block/ItemFrame.php | 4 ++-- src/block/Lantern.php | 4 ++-- src/block/Leaves.php | 4 ++-- src/block/Lectern.php | 4 ++-- src/block/Lever.php | 8 ++++---- src/block/Liquid.php | 4 ++-- src/block/NetherPortal.php | 4 ++-- src/block/NetherWartPlant.php | 4 ++-- src/block/Rail.php | 4 ++-- src/block/RedMushroomBlock.php | 8 ++++---- src/block/RedstoneComparator.php | 4 ++-- src/block/RedstoneLamp.php | 4 ++-- src/block/RedstoneOre.php | 4 ++-- src/block/RedstoneRepeater.php | 4 ++-- src/block/RedstoneTorch.php | 4 ++-- src/block/Sapling.php | 4 ++-- src/block/SeaPickle.php | 4 ++-- src/block/ShulkerBox.php | 4 ++-- src/block/SimplePressurePlate.php | 4 ++-- src/block/Skull.php | 8 ++++---- src/block/Slab.php | 8 ++++---- src/block/SnowLayer.php | 4 ++-- src/block/Sponge.php | 4 ++-- src/block/Stair.php | 4 ++-- src/block/StraightOnlyRail.php | 4 ++-- src/block/Sugarcane.php | 4 ++-- src/block/SweetBerryBush.php | 4 ++-- src/block/TNT.php | 4 ++-- src/block/Torch.php | 4 ++-- src/block/Trapdoor.php | 4 ++-- src/block/Tripwire.php | 4 ++-- src/block/TripwireHook.php | 4 ++-- src/block/Vine.php | 4 ++-- src/block/Wall.php | 4 ++-- src/block/WallCoralFan.php | 4 ++-- src/block/utils/AnalogRedstoneSignalEmitterTrait.php | 3 +++ src/block/utils/AnyFacingTrait.php | 2 ++ src/block/utils/ColoredTrait.php | 4 ++++ src/block/utils/CoralTypeTrait.php | 4 ++++ src/block/utils/HorizontalFacingTrait.php | 2 ++ src/block/utils/PillarRotationTrait.php | 2 ++ src/block/utils/RailPoweredByRedstoneTrait.php | 3 +++ src/block/utils/SignLikeRotationTrait.php | 2 ++ .../utils => data/runtime/block}/BlockDataReader.php | 3 ++- .../runtime/block}/BlockDataReaderHelper.php | 12 +++++++++++- .../utils => data/runtime/block}/BlockDataWriter.php | 3 ++- .../runtime/block}/BlockDataWriterHelper.php | 12 +++++++++++- 74 files changed, 184 insertions(+), 140 deletions(-) rename src/{block/utils => data/runtime/block}/BlockDataReader.php (97%) rename src/{block/utils => data/runtime/block}/BlockDataReaderHelper.php (94%) rename src/{block/utils => data/runtime/block}/BlockDataWriter.php (97%) rename src/{block/utils => data/runtime/block}/BlockDataWriterHelper.php (94%) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index a2aef21611..06a782ae81 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -24,12 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\inventory\AnvilInventory; -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; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 61284cfdd4..6011b88a16 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 6171657c4d..05addc0579 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 748bfd3357..e26b4aa8e6 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; diff --git a/src/block/Bed.php b/src/block/Bed.php index 46d21a23a7..e58163c05a 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\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\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 3528e8d421..8a187b7412 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class Bedrock extends Opaque{ private bool $burnsForever = false; diff --git a/src/block/Bell.php b/src/block/Bell.php index 3388bb5169..175be9d47b 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -25,12 +25,12 @@ namespace pocketmine\block; use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\utils\BellAttachmentType; -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\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Block.php b/src/block/Block.php index 6d9b2bd72b..2c1ae51997 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -28,9 +28,9 @@ namespace pocketmine\block; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 5c732689ea..cee9d0cc3a 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -24,12 +24,12 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/Button.php b/src/block/Button.php index 82db565efd..7e813af267 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 3b69e0f436..83b8dcca44 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\event\block\BlockGrowEvent; use pocketmine\event\entity\EntityDamageByBlockEvent; diff --git a/src/block/Cake.php b/src/block/Cake.php index 40b100f0b3..1bd28aa57f 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\FoodSource; use pocketmine\entity\Living; diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 572a098ee9..1e06517fc5 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; diff --git a/src/block/Crops.php b/src/block/Crops.php index a4976f0442..15fc757522 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index da4c034a87..f2f2fd6c81 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -24,9 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index ecf7ee50d3..61667e9b81 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 735e665275..f77baafc2b 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Hoe; use pocketmine\item\Item; use pocketmine\math\Facing; diff --git a/src/block/Door.php b/src/block/Door.php index 7843a9377c..c00b6d1711 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index add4fce8ee..29f567d12a 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index aace740a63..f69262c976 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 97a24fa72b..fbd2212d08 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityTrampleFarmlandEvent; diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 1541322bb5..6f5f1c9a41 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Fire.php b/src/block/Fire.php index d13ca247ab..8805c5653a 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\projectile\Arrow; use pocketmine\event\block\BlockBurnEvent; diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 6dcd5420ad..3a37af7490 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index be19be5b48..184f2ba871 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockMeltEvent; use function mt_rand; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 0dc1e0d1c2..46bd76081b 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -24,10 +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\HorizontalFacingTrait; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index f8ce02fd7e..bba31f3145 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,11 +24,11 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 762b5d6b0f..38ac5fc441 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 54a7e1b8cd..db560584cb 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 1283f912ac..550afa3225 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -23,10 +23,10 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\LeavesDecayEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 708dcd47db..e17d299613 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -24,11 +24,11 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Lectern as TileLectern; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/Lever.php b/src/block/Lever.php index 652dd72862..d65b478496 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -23,11 +23,11 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/block/Liquid.php b/src/block/Liquid.php index dca825ad80..1ad1c112a9 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\MinimumCostFlowCalculator; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\event\block\BlockFormEvent; use pocketmine\event\block\BlockSpreadEvent; diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 5317de232f..883eb28996 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 9cd1516576..5d6bc8a31a 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; diff --git a/src/block/Rail.php b/src/block/Rail.php index dc93f15d66..74f3886472 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -23,10 +23,10 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\Facing; use function array_keys; use function implode; diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 22a141d2a2..2a4b9906bf 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -23,11 +23,11 @@ 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\MushroomBlockType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use function mt_rand; diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index cc2dbaa89a..a531889d15 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -25,11 +25,11 @@ namespace pocketmine\block; use pocketmine\block\tile\Comparator; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 6a6919edc1..e81f8e805e 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\PoweredByRedstoneTrait; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 7695218574..e0a183860c 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index c56869f9a1..5e3ff6ba25 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index ada02e26c6..de6f1c92f0 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class RedstoneTorch extends Torch{ protected bool $lit = true; diff --git a/src/block/Sapling.php b/src/block/Sapling.php index f2bfd2af44..39aaba3ba5 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\TreeType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index c85d700a91..3dd1f74ad4 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index bec196838a..49aa3ae85c 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,8 +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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index 7bdfc71186..ad60f6ba5f 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; diff --git a/src/block/Skull.php b/src/block/Skull.php index 5eb2749e77..140c715741 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -24,12 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataReaderHelper; -use pocketmine\block\utils\BlockDataWriter; -use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SkullType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/Slab.php b/src/block/Slab.php index 6abab61f6c..e562c7adbb 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -23,12 +23,12 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 9894dd43a6..6642faaa8c 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockMeltEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; diff --git a/src/block/Sponge.php b/src/block/Sponge.php index 9fca8e9dc6..c9624cde3a 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class Sponge extends Opaque{ protected bool $wet = false; diff --git a/src/block/Stair.php b/src/block/Stair.php index 9242b36ab7..6ccfb13127 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -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; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index c2c171642e..93af1c4cc5 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -23,10 +23,10 @@ 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\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use function array_keys; use function implode; diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 320a484f8b..9643b7c4f7 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index a8c302d611..0220125c42 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\block\BlockGrowEvent; diff --git a/src/block/TNT.php b/src/block/TNT.php index bd7d13b433..b5f663a725 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; diff --git a/src/block/Torch.php b/src/block/Torch.php index 02cbec2d29..6d887f2c46 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -23,10 +23,10 @@ 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\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 42f973a4b3..4291e4ba4b 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 954fa888aa..025f218ce3 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; class Tripwire extends Flowable{ protected bool $triggered = false; diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 2f76f184fb..76cfa931c1 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/block/Vine.php b/src/block/Vine.php index 1ac2157efd..e0bb154dc6 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; diff --git a/src/block/Wall.php b/src/block/Wall.php index ae781b32d0..15b6b64863 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -23,10 +23,10 @@ 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\WallConnectionType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 4ab9251c07..a0d710d706 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataReader; -use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index aa037f1ca7..513ca47768 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; + trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 982d5623c0..580dbbd661 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\Facing; trait AnyFacingTrait{ diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index afd060229a..04d8996fd1 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -25,6 +25,10 @@ namespace pocketmine\block\utils; use pocketmine\block\Block; use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; trait ColoredTrait{ /** @var DyeColor */ diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 5cc3f08755..ab6fd66f1e 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -24,6 +24,10 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataReaderHelper; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\block\BlockDataWriterHelper; trait CoralTypeTrait{ protected CoralType $coralType; diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 0da0a9ca12..cadcf2ede3 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 1d4503ff76..03176ed921 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 9bc98303a9..7a402d8e27 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; + trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index e4ee5f8689..b678294927 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use function floor; trait SignLikeRotationTrait{ diff --git a/src/block/utils/BlockDataReader.php b/src/data/runtime/block/BlockDataReader.php similarity index 97% rename from src/block/utils/BlockDataReader.php rename to src/data/runtime/block/BlockDataReader.php index dbb3f93860..5434c05b47 100644 --- a/src/block/utils/BlockDataReader.php +++ b/src/data/runtime/block/BlockDataReader.php @@ -21,8 +21,9 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\data\runtime\block; +use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; diff --git a/src/block/utils/BlockDataReaderHelper.php b/src/data/runtime/block/BlockDataReaderHelper.php similarity index 94% rename from src/block/utils/BlockDataReaderHelper.php rename to src/data/runtime/block/BlockDataReaderHelper.php index c0dba20ef2..b8a3f7703d 100644 --- a/src/block/utils/BlockDataReaderHelper.php +++ b/src/data/runtime/block/BlockDataReaderHelper.php @@ -21,7 +21,17 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\data\runtime\block; + +use pocketmine\block\utils\BellAttachmentType; +use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\LeverFacing; +use pocketmine\block\utils\MushroomBlockType; +use pocketmine\block\utils\SkullType; +use pocketmine\block\utils\SlabType; +use pocketmine\block\utils\StairShape; +use pocketmine\block\utils\TreeType; final class BlockDataReaderHelper{ diff --git a/src/block/utils/BlockDataWriter.php b/src/data/runtime/block/BlockDataWriter.php similarity index 97% rename from src/block/utils/BlockDataWriter.php rename to src/data/runtime/block/BlockDataWriter.php index 774a584841..a4d87a5dfc 100644 --- a/src/block/utils/BlockDataWriter.php +++ b/src/data/runtime/block/BlockDataWriter.php @@ -21,8 +21,9 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\data\runtime\block; +use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; diff --git a/src/block/utils/BlockDataWriterHelper.php b/src/data/runtime/block/BlockDataWriterHelper.php similarity index 94% rename from src/block/utils/BlockDataWriterHelper.php rename to src/data/runtime/block/BlockDataWriterHelper.php index f8f00060db..1a49fac722 100644 --- a/src/block/utils/BlockDataWriterHelper.php +++ b/src/data/runtime/block/BlockDataWriterHelper.php @@ -21,7 +21,17 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\data\runtime\block; + +use pocketmine\block\utils\BellAttachmentType; +use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\LeverFacing; +use pocketmine\block\utils\MushroomBlockType; +use pocketmine\block\utils\SkullType; +use pocketmine\block\utils\SlabType; +use pocketmine\block\utils\StairShape; +use pocketmine\block\utils\TreeType; final class BlockDataWriterHelper{ From b5914f4587240a346011df633f487196af011d58 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 16:58:28 +0100 Subject: [PATCH 0210/1858] phpstorm ... --- src/data/runtime/block/BlockDataReader.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/runtime/block/BlockDataReader.php b/src/data/runtime/block/BlockDataReader.php index 5434c05b47..5164ff53e2 100644 --- a/src/data/runtime/block/BlockDataReader.php +++ b/src/data/runtime/block/BlockDataReader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime\block; +use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; From 9740891a2fdebce9275adc0139f8f1caa4a4056f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 17:01:10 +0100 Subject: [PATCH 0211/1858] Move BlockLegacyMetadata to pocketmine\data package --- src/block/BlockFactory.php | 2 +- src/block/BlockLegacyIdHelper.php | 1 + src/block/CoralBlock.php | 1 + src/block/Dirt.php | 1 + src/block/Rail.php | 1 + src/block/Sponge.php | 1 + src/block/StraightOnlyRail.php | 1 + src/block/TNT.php | 1 + src/block/utils/RailConnectionInfo.php | 2 +- src/data/bedrock/CoralTypeIdMap.php | 2 +- src/data/bedrock/MushroomBlockTypeIdMap.php | 2 +- src/{ => data/bedrock}/block/BlockLegacyMetadata.php | 2 +- .../bedrock/block/convert/BlockObjectToBlockStateSerializer.php | 2 +- src/data/bedrock/block/convert/BlockStateDeserializerHelper.php | 2 +- .../block/convert/BlockStateToBlockObjectDeserializer.php | 2 +- 15 files changed, 15 insertions(+), 8 deletions(-) rename src/{ => data/bedrock}/block/BlockLegacyMetadata.php (99%) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 41396b5f13..871008c7df 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockLegacyMetadata as Meta; use pocketmine\block\BlockToolType as ToolType; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Banner as TileBanner; @@ -54,6 +53,7 @@ use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\TreeType; +use pocketmine\data\bedrock\block\BlockLegacyMetadata as Meta; use pocketmine\item\Item; use pocketmine\item\ItemIds; use pocketmine\item\ToolTier; diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 5b83825b1c..de98d2316b 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -28,6 +28,7 @@ use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\TreeType; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\item\ItemIds; use pocketmine\utils\AssumptionFailedError; diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index 2075af358b..336b171a9a 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use function mt_rand; diff --git a/src/block/Dirt.php b/src/block/Dirt.php index f77baafc2b..1a0fcaaeb7 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Hoe; diff --git a/src/block/Rail.php b/src/block/Rail.php index 74f3886472..a98b51416b 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\math\Facing; diff --git a/src/block/Sponge.php b/src/block/Sponge.php index c9624cde3a..dc5f21d0ac 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 93af1c4cc5..0d125baa7c 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use function array_keys; diff --git a/src/block/TNT.php b/src/block/TNT.php index b5f663a725..50803bbc9b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; diff --git a/src/block/utils/RailConnectionInfo.php b/src/block/utils/RailConnectionInfo.php index c12c53b31c..f343bb7266 100644 --- a/src/block/utils/RailConnectionInfo.php +++ b/src/block/utils/RailConnectionInfo.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\block\BlockLegacyMetadata; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\math\Facing; final class RailConnectionInfo{ diff --git a/src/data/bedrock/CoralTypeIdMap.php b/src/data/bedrock/CoralTypeIdMap.php index 134c0053b8..fd1651206f 100644 --- a/src/data/bedrock/CoralTypeIdMap.php +++ b/src/data/bedrock/CoralTypeIdMap.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; -use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\utils\CoralType; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\utils\SingletonTrait; use function array_key_exists; diff --git a/src/data/bedrock/MushroomBlockTypeIdMap.php b/src/data/bedrock/MushroomBlockTypeIdMap.php index 1e288cb840..2eec175499 100644 --- a/src/data/bedrock/MushroomBlockTypeIdMap.php +++ b/src/data/bedrock/MushroomBlockTypeIdMap.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; -use pocketmine\block\BlockLegacyMetadata as LegacyMeta; use pocketmine\block\utils\MushroomBlockType; +use pocketmine\data\bedrock\block\BlockLegacyMetadata as LegacyMeta; use pocketmine\utils\SingletonTrait; use function array_key_exists; diff --git a/src/block/BlockLegacyMetadata.php b/src/data/bedrock/block/BlockLegacyMetadata.php similarity index 99% rename from src/block/BlockLegacyMetadata.php rename to src/data/bedrock/block/BlockLegacyMetadata.php index aa46934e16..a465f12744 100644 --- a/src/block/BlockLegacyMetadata.php +++ b/src/data/bedrock/block/BlockLegacyMetadata.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\block; +namespace pocketmine\data\bedrock\block; /** * Constants for legacy metadata for various blocks. diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index ec3f51236b..1ed913d2e9 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -33,7 +33,6 @@ use pocketmine\block\Beetroot; use pocketmine\block\Bell; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\BoneBlock; use pocketmine\block\BrewingStand; use pocketmine\block\BrownMushroomBlock; @@ -139,6 +138,7 @@ use pocketmine\block\WoodenPressurePlate; use pocketmine\block\WoodenStairs; use pocketmine\block\WoodenTrapdoor; use pocketmine\block\Wool; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateNames as StateNames; use pocketmine\data\bedrock\block\BlockStateSerializeException; diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index a1c2719fce..cad6bfad89 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\Button; use pocketmine\block\Crops; use pocketmine\block\DaylightSensor; @@ -47,6 +46,7 @@ use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index ad0801c11e..8002cd31ef 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -25,13 +25,13 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyMetadata; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; +use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateDeserializer; From 323c56368427156bdf24d3f66dc7a12e1d29f600 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 17:29:28 +0100 Subject: [PATCH 0212/1858] Break Block's dependence on ItemFactory, and item legacy IDs let's GOOOOOOOOOOOOOOOOOOOOOOOOOOOOO --- src/block/BaseSign.php | 13 ++++- src/block/Block.php | 41 ++++++++++----- src/block/BlockFactory.php | 17 +++++- src/block/BlockLegacyIdHelper.php | 61 +++++++++++++--------- src/block/Tripwire.php | 6 +++ src/item/Item.php | 2 +- src/item/ItemBlock.php | 15 ++++-- src/item/ItemIdentifier.php | 5 +- src/network/mcpe/convert/TypeConverter.php | 26 --------- 9 files changed, 113 insertions(+), 73 deletions(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 6db874a252..415e45977b 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -41,9 +41,16 @@ abstract class BaseSign extends Transparent{ protected SignText $text; protected ?int $editorEntityRuntimeId = null; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + /** @var \Closure() : Item */ + private \Closure $asItemCallback; + + /** + * @param \Closure() : Item $asItemCallback + */ + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, \Closure $asItemCallback){ parent::__construct($idInfo, $name, $breakInfo); $this->text = new SignText(); + $this->asItemCallback = $asItemCallback; } public function readStateFromWorld() : void{ @@ -139,4 +146,8 @@ abstract class BaseSign extends Transparent{ return false; } + + public function asItem() : Item{ + return ($this->asItemCallback)(); + } } diff --git a/src/block/Block.php b/src/block/Block.php index 2c1ae51997..358c665e81 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -34,7 +34,7 @@ use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; +use pocketmine\item\ItemBlock; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\RayTraceResult; @@ -90,10 +90,7 @@ class Block{ } public function asItem() : Item{ - return ItemFactory::getInstance()->get( - $this->getLegacyItemId(), - $this->getLegacyItemMeta() - ); + return new ItemBlock($this); } public function getLegacyItemId() : int{ @@ -112,10 +109,9 @@ class Block{ public function getRequiredStateDataBits() : int{ return 0; } - final public function decodeStateData(int $data) : void{ + final public function decodeTypeData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); - $stateBits = $this->getRequiredStateDataBits(); - $givenBits = $typeBits + $stateBits; + $givenBits = $typeBits; $reader = new BlockDataReader($givenBits, $data); $this->decodeType($reader); @@ -123,6 +119,14 @@ class Block{ if($typeBits !== $readBits){ throw new \LogicException("Exactly $typeBits bits of type data were provided, but $readBits were read"); } + } + + final public function decodeStateData(int $data) : void{ + $typeBits = $this->getRequiredTypeDataBits(); + $stateBits = $this->getRequiredStateDataBits(); + $givenBits = $typeBits + $stateBits; + $reader = new BlockDataReader($givenBits, $data); + $this->decodeTypeData($reader->readInt($typeBits)); $this->decodeState($reader); $readBits = $reader->getOffset() - $typeBits; @@ -139,6 +143,20 @@ class Block{ //NOOP } + final public function computeTypeData() : int{ + $typeBits = $this->getRequiredTypeDataBits(); + $requiredBits = $typeBits; + $writer = new BlockDataWriter($requiredBits); + + $this->encodeType($writer); + $writtenBits = $writer->getOffset(); + if($typeBits !== $writtenBits){ + throw new \LogicException("Exactly $typeBits bits of type data were expected, but $writtenBits were written"); + } + + return $writer->getValue(); + } + /** * @internal */ @@ -147,12 +165,7 @@ class Block{ $stateBits = $this->getRequiredStateDataBits(); $requiredBits = $typeBits + $stateBits; $writer = new BlockDataWriter($requiredBits); - - $this->encodeType($writer); - $writtenBits = $writer->getOffset(); - if($typeBits !== $writtenBits){ - throw new \LogicException("Exactly $typeBits bits of type data were expected, but $writtenBits were written"); - } + $writer->writeInt($typeBits, $this->computeTypeData()); $this->encodeState($writer); $writtenBits = $writer->getOffset() - $typeBits; diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 871008c7df..f887e17a16 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -480,8 +480,9 @@ class BlockFactory{ $this->register(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($treeType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo)); $this->register(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($treeType), $name . " Trapdoor", $woodenDoorBreakInfo)); - $this->register(new FloorSign(BlockLegacyIdHelper::getWoodenFloorSignIdentifier($treeType), $name . " Sign", $signBreakInfo)); - $this->register(new WallSign(BlockLegacyIdHelper::getWoodenWallSignIdentifier($treeType), $name . " Wall Sign", $signBreakInfo)); + [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($treeType); + $this->register(new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $signAsItem)); + $this->register(new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $signAsItem)); } $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); @@ -923,6 +924,18 @@ class BlockFactory{ return $block; } + /** + * @internal + * Returns the default state of the block type associated with the given type ID. + */ + public function fromTypeId(int $typeId) : ?Block{ + if(isset($this->typeIndex[$typeId])){ + return clone $this->typeIndex[$typeId]; + } + + return null; + } + public function fromFullBlock(int $fullState) : Block{ return $this->get($fullState >> Block::INTERNAL_STATE_DATA_BITS, $fullState & Block::INTERNAL_STATE_DATA_MASK); } diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index de98d2316b..0574e754a3 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -30,6 +30,7 @@ use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\TreeType; use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\item\ItemIds; +use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; final class BlockLegacyIdHelper{ @@ -130,38 +131,48 @@ final class BlockLegacyIdHelper{ }, ItemIds::SAPLING, $treeType->getMagicNumber()); } - public static function getWoodenFloorSignIdentifier(TreeType $treeType) : BID{ + /** + * @return BID[]|\Closure[] + * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} + */ + public static function getWoodenSignInfo(TreeType $treeType) : array{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_SIGN, ItemIds::SIGN, 0, TileSign::class); + return [ + new BID(Ids::OAK_SIGN, ItemIds::SIGN, 0, TileSign::class), + new BID(Ids::OAK_WALL_SIGN, ItemIds::SIGN, 0, TileSign::class), + fn() => VanillaItems::OAK_SIGN() + ]; case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class); + return [ + new BID(Ids::SPRUCE_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class), + new BID(Ids::SPRUCE_WALL_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class), + fn() => VanillaItems::SPRUCE_SIGN() + ]; case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class); + return [ + new BID(Ids::BIRCH_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class), + new BID(Ids::BIRCH_WALL_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class), + fn() => VanillaItems::BIRCH_SIGN() + ]; case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class); + return [ + new BID(Ids::JUNGLE_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class), + new BID(Ids::JUNGLE_WALL_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class), + fn() => VanillaItems::JUNGLE_SIGN() + ]; case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class); + return [ + new BID(Ids::ACACIA_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class), + new BID(Ids::ACACIA_WALL_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class), + fn() => VanillaItems::ACACIA_SIGN() + ]; case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class); - } - throw new AssumptionFailedError("Switch should cover all wood types"); - } - - public static function getWoodenWallSignIdentifier(TreeType $treeType) : BID{ - switch($treeType->id()){ - case TreeType::OAK()->id(): - return new BID(Ids::OAK_WALL_SIGN, ItemIds::SIGN, 0, TileSign::class); - case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_WALL_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class); - case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_WALL_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class); - case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_WALL_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class); - case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_WALL_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class); - case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_WALL_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class); + return [ + new BID(Ids::DARK_OAK_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class), + new BID(Ids::DARK_OAK_WALL_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class), + fn() => VanillaItems::DARK_OAK_SIGN() + ]; } throw new AssumptionFailedError("Switch should cover all wood types"); } diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 025f218ce3..53722d996f 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -25,6 +25,8 @@ namespace pocketmine\block; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\item\Item; +use pocketmine\item\VanillaItems; class Tripwire extends Flowable{ protected bool $triggered = false; @@ -79,4 +81,8 @@ class Tripwire extends Flowable{ $this->disarmed = $disarmed; return $this; } + + public function asItem() : Item{ + return VanillaItems::STRING(); + } } diff --git a/src/item/Item.php b/src/item/Item.php index 13d5ce80cb..a22232b745 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -399,7 +399,7 @@ class Item implements \JsonSerializable{ } public function isNull() : bool{ - return $this->count <= 0 || $this->getId() === ItemIds::AIR; + return $this->count <= 0; } /** diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 6f7914098a..ad4311a387 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -25,6 +25,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; +use pocketmine\block\VanillaBlocks; /** * Class used for Items that directly represent blocks, such as stone, dirt, wood etc. @@ -33,15 +34,23 @@ use pocketmine\block\BlockFactory; * just place wheat crops when used on the ground). */ final class ItemBlock extends Item{ - private int $blockFullId; + private int $blockTypeId; + private int $blockTypeData; public function __construct(Block $block){ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); - $this->blockFullId = $block->getStateId(); + $this->blockTypeId = $block->getTypeId(); + $this->blockTypeData = $block->computeTypeData(); } public function getBlock(?int $clickedFace = null) : Block{ - return BlockFactory::getInstance()->fromFullBlock($this->blockFullId); + //TODO: HACKY MESS, CLEAN IT UP + $blockType = BlockFactory::getInstance()->fromTypeId($this->blockTypeId); + if($blockType === null){ + return VanillaBlocks::AIR(); + } + $blockType->decodeTypeData($this->blockTypeData); + return $blockType; } public function getFuelTime() : int{ diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index e69aa1efc5..cf97293799 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -47,7 +47,10 @@ class ItemIdentifier{ public static function fromBlock(Block $block) : self{ //negative item type IDs are treated as block IDs //TODO: maybe an ItemBlockIdentifier is in order? - return new self(-$block->getTypeId(), $block->getLegacyItemId(), $block->getLegacyItemMeta()); + //TODO: this isn't vanilla-compliant, but it'll do for now - we only use the "legacy" item ID/meta for full type + //indexing right now, because item type IDs aren't granular enough + //this should be removed once that's addressed + return new self(-$block->getTypeId(), -$block->getTypeId(), $block->computeTypeData()); } public function getTypeId() : int{ return $this->typeId; } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 4f58a28355..72b8831045 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -33,19 +33,15 @@ use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; use pocketmine\data\bedrock\item\BlockItemIdMap; -use pocketmine\data\SavedDataLoadingException; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\action\InventoryAction; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\item\Item; -use pocketmine\item\ItemFactory; -use pocketmine\item\ItemIds; use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\nbt\tag\IntTag; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\protocol\types\GameMode as ProtocolGameMode; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; @@ -211,28 +207,6 @@ class TypeConverter{ if($compound !== null){ $compound = clone $compound; - - $id = $meta = null; - if($itemResult->getId() === ItemIds::INFO_UPDATE && $itemResult->getMeta() === 0){ - if(($idTag = $compound->getTag(self::PM_ID_TAG)) instanceof IntTag){ - $id = $idTag->getValue(); - $compound->removeTag(self::PM_ID_TAG); - } - if(($metaTag = $compound->getTag(self::PM_META_TAG)) instanceof IntTag){ - $meta = $metaTag->getValue(); - $compound->removeTag(self::PM_META_TAG); - } - } - if($compound->count() === 0){ - $compound = null; - } - if($meta !== null){ - try{ - $itemResult = ItemFactory::getInstance()->get($id ?? $itemResult->getId(), $meta); - }catch(SavedDataLoadingException $e){ - throw new TypeConversionException("Failed loading network item: " . $e->getMessage(), 0, $e); - } - } } $itemResult->setCount($itemStack->getCount()); From b125d4d25f21b2b077ef0d1f9bbb43e7a8bcb628 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 17:48:04 +0100 Subject: [PATCH 0213/1858] Strip all remaining legacy item ID/meta stuff from blocks the doors are now finally open, we can: - make all the wood types dynamic - fix glazed terracotta - add all the new blocks LET'S GOOOOOOOOOOOO --- src/block/Anvil.php | 4 - src/block/Block.php | 12 - src/block/BlockFactory.php | 848 +++++++++++++++--------------- src/block/BlockIdentifier.php | 20 - src/block/BlockLegacyIdHelper.php | 191 ++++--- src/block/Coral.php | 5 - src/block/CoralBlock.php | 6 - src/block/Dirt.php | 5 - src/block/Sponge.php | 5 - src/block/TNT.php | 5 - src/block/UnknownBlock.php | 17 +- src/block/utils/ColoredTrait.php | 8 - tests/phpunit/block/BlockTest.php | 9 +- 13 files changed, 530 insertions(+), 605 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 06a782ae81..660554ac02 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -47,10 +47,6 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - protected function writeStateToItemMeta() : int{ - return $this->damage << 2; - } - public function getRequiredTypeDataBits() : int{ return 2; } protected function decodeType(BlockDataReader $r) : void{ diff --git a/src/block/Block.php b/src/block/Block.php index 358c665e81..0044fb5a7d 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -93,18 +93,6 @@ class Block{ return new ItemBlock($this); } - public function getLegacyItemId() : int{ - return $this->idInfo->getLegacyItemId(); - } - - public function getLegacyItemMeta() : int{ - return $this->idInfo->getLegacyVariant() | $this->writeStateToItemMeta(); - } - - protected function writeStateToItemMeta() : int{ - return 0; - } - public function getRequiredTypeDataBits() : int{ return 0; } public function getRequiredStateDataBits() : int{ return 0; } diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index f887e17a16..44072f5ded 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -53,9 +53,7 @@ use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\TreeType; -use pocketmine\data\bedrock\block\BlockLegacyMetadata as Meta; use pocketmine\item\Item; -use pocketmine\item\ItemIds; use pocketmine\item\ToolTier; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -105,10 +103,10 @@ class BlockFactory{ public function __construct(){ $railBreakInfo = new BlockBreakInfo(0.7); - $this->register(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, ItemIds::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); - $this->register(new Air(new BID(Ids::AIR, ItemIds::AIR, 0), "Air", BreakInfo::indestructible(-1.0))); - $this->register(new Anvil(new BID(Ids::ANVIL, ItemIds::ANVIL, 0), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); - $this->register(new Bamboo(new BID(Ids::BAMBOO, ItemIds::BAMBOO, 0), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ + $this->register(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); + $this->register(new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); + $this->register(new Anvil(new BID(Ids::ANVIL), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + $this->register(new Bamboo(new BID(Ids::BAMBOO), "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; @@ -116,225 +114,225 @@ class BlockFactory{ return parent::getBreakTime($item); } })); - $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, ItemIds::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); + $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", BreakInfo::instant())); $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->register(new FloorBanner(new BID(Ids::BANNER, ItemIds::BANNER, 0, TileBanner::class), "Banner", $bannerBreakInfo)); - $this->register(new WallBanner(new BID(Ids::WALL_BANNER, ItemIds::BANNER, 0, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - $this->register(new Barrel(new BID(Ids::BARREL, ItemIds::BARREL, 0, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new Transparent(new BID(Ids::BARRIER, ItemIds::BARRIER, 0), "Barrier", BreakInfo::indestructible())); - $this->register(new Beacon(new BID(Ids::BEACON, ItemIds::BEACON, 0, TileBeacon::class), "Beacon", new BreakInfo(3.0))); - $this->register(new Bed(new BID(Ids::BED, ItemIds::BED, 0, TileBed::class), "Bed Block", new BreakInfo(0.2))); - $this->register(new Bedrock(new BID(Ids::BEDROCK, ItemIds::BEDROCK, 0), "Bedrock", BreakInfo::indestructible())); + $this->register(new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); + $this->register(new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); + $this->register(new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Transparent(new BID(Ids::BARRIER), "Barrier", BreakInfo::indestructible())); + $this->register(new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new BreakInfo(3.0))); + $this->register(new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); + $this->register(new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); - $this->register(new Beetroot(new BID(Ids::BEETROOTS, ItemIds::BEETROOT_BLOCK, 0), "Beetroot Block", BreakInfo::instant())); - $this->register(new Bell(new BID(Ids::BELL, ItemIds::BELL, 0, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new BlueIce(new BID(Ids::BLUE_ICE, ItemIds::BLUE_ICE, 0), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - $this->register(new BoneBlock(new BID(Ids::BONE_BLOCK, ItemIds::BONE_BLOCK, 0), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Bookshelf(new BID(Ids::BOOKSHELF, ItemIds::BOOKSHELF, 0), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - $this->register(new BrewingStand(new BID(Ids::BREWING_STAND, ItemIds::BREWING_STAND, 0, TileBrewingStand::class), "Brewing Stand", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); + $this->register(new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); + $this->register(new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); + $this->register(new BrewingStand(new BID(Ids::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->register(new Stair(new BID(Ids::BRICK_STAIRS, ItemIds::BRICK_STAIRS, 0), "Brick Stairs", $bricksBreakInfo)); - $this->register(new Opaque(new BID(Ids::BRICKS, ItemIds::BRICK_BLOCK, 0), "Bricks", $bricksBreakInfo)); + $this->register(new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); + $this->register(new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); - $this->register(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM, ItemIds::BROWN_MUSHROOM, 0), "Brown Mushroom", BreakInfo::instant())); - $this->register(new Cactus(new BID(Ids::CACTUS, ItemIds::CACTUS, 0), "Cactus", new BreakInfo(0.4))); - $this->register(new Cake(new BID(Ids::CAKE, ItemIds::CAKE, 0), "Cake", new BreakInfo(0.5))); - $this->register(new Carrot(new BID(Ids::CARROTS, ItemIds::CARROTS, 0), "Carrot Block", BreakInfo::instant())); + $this->register(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", BreakInfo::instant())); + $this->register(new Cactus(new BID(Ids::CACTUS), "Cactus", new BreakInfo(0.4))); + $this->register(new Cake(new BID(Ids::CAKE), "Cake", new BreakInfo(0.5))); + $this->register(new Carrot(new BID(Ids::CARROTS), "Carrot Block", BreakInfo::instant())); $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); - $this->register(new Chest(new BID(Ids::CHEST, ItemIds::CHEST, 0, TileChest::class), "Chest", $chestBreakInfo)); - $this->register(new Clay(new BID(Ids::CLAY, ItemIds::CLAY_BLOCK, 0), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->register(new Coal(new BID(Ids::COAL, ItemIds::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, ItemIds::COAL_ORE, 0), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); + $this->register(new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Coal(new BID(Ids::COAL), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + $this->register(new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE, ItemIds::COBBLESTONE, 0), "Cobblestone", $cobblestoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::MOSSY_COBBLESTONE, ItemIds::MOSSY_COBBLESTONE, 0), "Mossy Cobblestone", $cobblestoneBreakInfo)); - $this->register(new Stair(new BID(Ids::COBBLESTONE_STAIRS, ItemIds::COBBLESTONE_STAIRS, 0), "Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->register(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS, ItemIds::MOSSY_COBBLESTONE_STAIRS, 0), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); + $this->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->register(new Cobweb(new BID(Ids::COBWEB, ItemIds::COBWEB, 0), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - $this->register(new CocoaBlock(new BID(Ids::COCOA_POD, ItemIds::COCOA, 0), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - $this->register(new CoralBlock(new BID(Ids::CORAL_BLOCK, ItemIds::CORAL_BLOCK, 0), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new CraftingTable(new BID(Ids::CRAFTING_TABLE, ItemIds::CRAFTING_TABLE, 0), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, ItemIds::DAYLIGHT_DETECTOR, 0, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); - $this->register(new DeadBush(new BID(Ids::DEAD_BUSH, ItemIds::DEADBUSH, 0), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL, ItemIds::DETECTOR_RAIL, 0), "Detector Rail", $railBreakInfo)); + $this->register(new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); + $this->register(new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); + $this->register(new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - $this->register(new Opaque(new BID(Ids::DIAMOND, ItemIds::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, ItemIds::DIAMOND_ORE, 0), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->register(new Dirt(new BID(Ids::DIRT, ItemIds::DIRT, 0), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new DoublePlant(new BID(Ids::SUNFLOWER, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_SUNFLOWER), "Sunflower", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::LILAC, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LILAC), "Lilac", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::ROSE_BUSH, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_ROSE_BUSH), "Rose Bush", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::PEONY, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_PEONY), "Peony", BreakInfo::instant())); - $this->register(new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DoubleTallGrass(new BID(Ids::LARGE_FERN, ItemIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG, ItemIds::DRAGON_EGG, 0), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new DriedKelp(new BID(Ids::DRIED_KELP, ItemIds::DRIED_KELP_BLOCK, 0), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - $this->register(new Opaque(new BID(Ids::EMERALD, ItemIds::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, ItemIds::EMERALD_ORE, 0), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, ItemIds::ENCHANTING_TABLE, 0, 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, ItemIds::END_PORTAL_FRAME, 0), "End Portal Frame", BreakInfo::indestructible())); - $this->register(new EndRod(new BID(Ids::END_ROD, ItemIds::END_ROD, 0), "End Rod", BreakInfo::instant())); - $this->register(new Opaque(new BID(Ids::END_STONE, ItemIds::END_STONE, 0), "End Stone", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 45.0))); + $this->register(new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); + $this->register(new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); + $this->register(new Opaque(new BID(Ids::EMERALD), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, 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), "End Portal Frame", BreakInfo::indestructible())); + $this->register(new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); + $this->register(new Opaque(new BID(Ids::END_STONE), "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->register(new Opaque(new BID(Ids::END_STONE_BRICKS, ItemIds::END_BRICKS, 0), "End Stone Bricks", $endBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS, ItemIds::END_BRICK_STAIRS, 0), "End Stone Brick Stairs", $endBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - $this->register(new EnderChest(new BID(Ids::ENDER_CHEST, ItemIds::ENDER_CHEST, 0, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); - $this->register(new Farmland(new BID(Ids::FARMLAND, ItemIds::FARMLAND, 0), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->register(new Fire(new BID(Ids::FIRE, ItemIds::FIRE, 0), "Fire Block", BreakInfo::instant())); - $this->register(new FletchingTable(new BID(Ids::FLETCHING_TABLE, ItemIds::FLETCHING_TABLE, 0), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); - $this->register(new Flower(new BID(Ids::DANDELION, ItemIds::DANDELION, 0), "Dandelion", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::POPPY, ItemIds::RED_FLOWER, Meta::FLOWER_POPPY), "Poppy", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::ALLIUM, ItemIds::RED_FLOWER, Meta::FLOWER_ALLIUM), "Allium", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::AZURE_BLUET, ItemIds::RED_FLOWER, Meta::FLOWER_AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::BLUE_ORCHID, ItemIds::RED_FLOWER, Meta::FLOWER_BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::CORNFLOWER, ItemIds::RED_FLOWER, Meta::FLOWER_CORNFLOWER), "Cornflower", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::LILY_OF_THE_VALLEY, ItemIds::RED_FLOWER, Meta::FLOWER_LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::ORANGE_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::OXEYE_DAISY, ItemIds::RED_FLOWER, Meta::FLOWER_OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::PINK_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_PINK_TULIP), "Pink Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::RED_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_RED_TULIP), "Red Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::WHITE_TULIP, ItemIds::RED_FLOWER, Meta::FLOWER_WHITE_TULIP), "White Tulip", BreakInfo::instant())); - $this->register(new FlowerPot(new BID(Ids::FLOWER_POT, ItemIds::FLOWER_POT, 0, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - $this->register(new FrostedIce(new BID(Ids::FROSTED_ICE, ItemIds::FROSTED_ICE, 0), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - $this->register(new Furnace(new BID(Ids::FURNACE, ItemIds::FURNACE, 0, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, ItemIds::BLAST_FURNACE, 0, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::SMOKER, ItemIds::SMOKER, 0, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); + $this->register(new Farmland(new BID(Ids::FARMLAND), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); + $this->register(new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); + $this->register(new Flower(new BID(Ids::DANDELION), "Dandelion", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::POPPY), "Poppy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ALLIUM), "Allium", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::CORNFLOWER), "Cornflower", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); + $this->register(new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); + $this->register(new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); + $this->register(new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $glassBreakInfo = new BreakInfo(0.3); - $this->register(new Glass(new BID(Ids::GLASS, ItemIds::GLASS, 0), "Glass", $glassBreakInfo)); - $this->register(new GlassPane(new BID(Ids::GLASS_PANE, ItemIds::GLASS_PANE, 0), "Glass Pane", $glassBreakInfo)); - $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN, ItemIds::GLOWINGOBSIDIAN, 0), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); - $this->register(new Glowstone(new BID(Ids::GLOWSTONE, ItemIds::GLOWSTONE, 0), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - $this->register(new Opaque(new BID(Ids::GOLD, ItemIds::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, ItemIds::GOLD_ORE, 0), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); + $this->register(new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); + $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); + $this->register(new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); + $this->register(new Opaque(new BID(Ids::GOLD), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new Opaque(new BID(Ids::GOLD_ORE), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); - $this->register(new Grass(new BID(Ids::GRASS, ItemIds::GRASS, 0), "Grass", $grassBreakInfo)); - $this->register(new GrassPath(new BID(Ids::GRASS_PATH, ItemIds::GRASS_PATH, 0), "Grass Path", $grassBreakInfo)); - $this->register(new Gravel(new BID(Ids::GRAVEL, ItemIds::GRAVEL, 0), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); + $this->register(new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); + $this->register(new Gravel(new BID(Ids::GRAVEL), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY, ItemIds::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); + $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new BreakInfo(10.0); - $this->register(new HardenedGlass(new BID(Ids::HARDENED_GLASS, ItemIds::HARD_GLASS, 0), "Hardened Glass", $hardenedGlassBreakInfo)); - $this->register(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE, ItemIds::HARD_GLASS_PANE, 0), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->register(new HayBale(new BID(Ids::HAY_BALE, ItemIds::HAY_BALE, 0), "Hay Bale", new BreakInfo(0.5))); - $this->register(new Hopper(new BID(Ids::HOPPER, ItemIds::HOPPER, 0, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); - $this->register(new Ice(new BID(Ids::ICE, ItemIds::ICE, 0), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); + $this->register(new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + $this->register(new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); $updateBlockBreakInfo = new BreakInfo(1.0); - $this->register(new Opaque(new BID(Ids::INFO_UPDATE, ItemIds::INFO_UPDATE, 0), "update!", $updateBlockBreakInfo)); - $this->register(new Opaque(new BID(Ids::INFO_UPDATE2, ItemIds::INFO_UPDATE2, 0), "ate!upd", $updateBlockBreakInfo)); - $this->register(new Transparent(new BID(Ids::INVISIBLE_BEDROCK, ItemIds::INVISIBLEBEDROCK, 0), "Invisible Bedrock", BreakInfo::indestructible())); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); + $this->register(new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::IRON, ItemIds::IRON_BLOCK, 0), "Iron Block", $ironBreakInfo)); - $this->register(new Thin(new BID(Ids::IRON_BARS, ItemIds::IRON_BARS, 0), "Iron Bars", $ironBreakInfo)); + $this->register(new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); + $this->register(new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); - $this->register(new Door(new BID(Ids::IRON_DOOR, ItemIds::IRON_DOOR, 0), "Iron Door", $ironDoorBreakInfo)); - $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR, ItemIds::IRON_TRAPDOOR, 0), "Iron Trapdoor", $ironDoorBreakInfo)); - $this->register(new Opaque(new BID(Ids::IRON_ORE, ItemIds::IRON_ORE, 0), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, ItemIds::FRAME, 0, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - $this->register(new Jukebox(new BID(Ids::JUKEBOX, ItemIds::JUKEBOX, 0, 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, ItemIds::LADDER, 0), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - $this->register(new Lantern(new BID(Ids::LANTERN, ItemIds::LANTERN, 0), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI, ItemIds::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, ItemIds::LAPIS_ORE, 0), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->register(new Lava(new BID(Ids::LAVA, ItemIds::FLOWING_LAVA, 0), "Lava", BreakInfo::indestructible(500.0))); - $this->register(new Lectern(new BID(Ids::LECTERN, ItemIds::LECTERN, 0, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); - $this->register(new Lever(new BID(Ids::LEVER, ItemIds::LEVER, 0), "Lever", new BreakInfo(0.5))); - $this->register(new Loom(new BID(Ids::LOOM, ItemIds::LOOM, 0), "Loom", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new Magma(new BID(Ids::MAGMA, ItemIds::MAGMA, 0), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Melon(new BID(Ids::MELON, ItemIds::MELON_BLOCK, 0), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); - $this->register(new MelonStem(new BID(Ids::MELON_STEM, ItemIds::MELON_SEEDS, 0), "Melon Stem", BreakInfo::instant())); - $this->register(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, ItemIds::MOB_SPAWNER, 0, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Mycelium(new BID(Ids::MYCELIUM, ItemIds::MYCELIUM, 0), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); + $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); + $this->register(new Opaque(new BID(Ids::IRON_ORE), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); + $this->register(new Jukebox(new BID(Ids::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), "Ladder", new BreakInfo(0.4, ToolType::AXE))); + $this->register(new Lantern(new BID(Ids::LANTERN), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); + $this->register(new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + $this->register(new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); + $this->register(new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Magma(new BID(Ids::MAGMA), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); + $this->register(new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); + $this->register(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::NETHER_BRICKS, ItemIds::NETHER_BRICK_BLOCK, 0), "Nether Bricks", $netherBrickBreakInfo)); - $this->register(new Opaque(new BID(Ids::RED_NETHER_BRICKS, ItemIds::RED_NETHER_BRICK, 0), "Red Nether Bricks", $netherBrickBreakInfo)); - $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE, ItemIds::NETHER_BRICK_FENCE, 0), "Nether Brick Fence", $netherBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS, ItemIds::NETHER_BRICK_STAIRS, 0), "Nether Brick Stairs", $netherBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS, ItemIds::RED_NETHER_BRICK_STAIRS, 0), "Red Nether Brick Stairs", $netherBrickBreakInfo)); - $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL, ItemIds::PORTAL, 0), "Nether Portal", BreakInfo::indestructible(0.0))); - $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE, ItemIds::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, ItemIds::NETHERREACTOR, 0), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK, ItemIds::NETHER_WART_BLOCK, 0), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); - $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART, ItemIds::NETHER_WART, 0), "Nether Wart", BreakInfo::instant())); - $this->register(new Netherrack(new BID(Ids::NETHERRACK, ItemIds::NETHERRACK, 0), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Note(new BID(Ids::NOTE_BLOCK, ItemIds::NOTEBLOCK, 0, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); - $this->register(new Opaque(new BID(Ids::OBSIDIAN, ItemIds::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, ItemIds::PACKED_ICE, 0), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->register(new Podzol(new BID(Ids::PODZOL, ItemIds::PODZOL, 0), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Potato(new BID(Ids::POTATOES, ItemIds::POTATOES, 0), "Potato Block", BreakInfo::instant())); - $this->register(new PoweredRail(new BID(Ids::POWERED_RAIL, ItemIds::GOLDEN_RAIL, 0), "Powered Rail", $railBreakInfo)); + $this->register(new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS), "Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS), "Red Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); + $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); + $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); + $this->register(new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); + $this->register(new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); + $this->register(new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Podzol(new BID(Ids::PODZOL), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); + $this->register(new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::PRISMARINE, ItemIds::PRISMARINE, Meta::PRISMARINE_NORMAL), "Prismarine", $prismarineBreakInfo)); - $this->register(new Opaque(new BID(Ids::DARK_PRISMARINE, ItemIds::PRISMARINE, Meta::PRISMARINE_DARK), "Dark Prismarine", $prismarineBreakInfo)); - $this->register(new Opaque(new BID(Ids::PRISMARINE_BRICKS, ItemIds::PRISMARINE, Meta::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS, ItemIds::PRISMARINE_BRICKS_STAIRS, 0), "Prismarine Bricks Stairs", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS, ItemIds::DARK_PRISMARINE_STAIRS, 0), "Dark Prismarine Stairs", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::PRISMARINE_STAIRS, ItemIds::PRISMARINE_STAIRS, 0), "Prismarine Stairs", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS), "Prismarine Bricks Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->register(new Pumpkin(new BID(Ids::PUMPKIN, ItemIds::PUMPKIN, 0), "Pumpkin", $pumpkinBreakInfo)); - $this->register(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN, ItemIds::CARVED_PUMPKIN, 0), "Carved Pumpkin", $pumpkinBreakInfo)); - $this->register(new LitPumpkin(new BID(Ids::LIT_PUMPKIN, ItemIds::JACK_O_LANTERN, 0), "Jack o'Lantern", $pumpkinBreakInfo)); + $this->register(new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); + $this->register(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); + $this->register(new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); - $this->register(new PumpkinStem(new BID(Ids::PUMPKIN_STEM, ItemIds::PUMPKIN_SEEDS, 0), "Pumpkin Stem", BreakInfo::instant())); + $this->register(new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::PURPUR, ItemIds::PURPUR_BLOCK, Meta::PURPUR_NORMAL), "Purpur Block", $purpurBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::PURPUR_PILLAR, ItemIds::PURPUR_BLOCK, Meta::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); - $this->register(new Stair(new BID(Ids::PURPUR_STAIRS, ItemIds::PURPUR_STAIRS, 0), "Purpur Stairs", $purpurBreakInfo)); + $this->register(new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); + $this->register(new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new Opaque(new BID(Ids::QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_NORMAL), "Quartz Block", $quartzBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_CHISELED), "Chiseled Quartz Block", $quartzBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ, ItemIds::QUARTZ_BLOCK, Meta::QUARTZ_SMOOTH), "Smooth Quartz Block", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ), "Smooth Quartz Block", $quartzBreakInfo)); - $this->register(new Stair(new BID(Ids::QUARTZ_STAIRS, ItemIds::QUARTZ_STAIRS, 0), "Quartz Stairs", $quartzBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS, ItemIds::SMOOTH_QUARTZ_STAIRS, 0), "Smooth Quartz Stairs", $quartzBreakInfo)); + $this->register(new Stair(new BID(Ids::QUARTZ_STAIRS), "Quartz Stairs", $quartzBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); - $this->register(new Rail(new BID(Ids::RAIL, ItemIds::RAIL, 0), "Rail", $railBreakInfo)); - $this->register(new RedMushroom(new BID(Ids::RED_MUSHROOM, ItemIds::RED_MUSHROOM, 0), "Red Mushroom", BreakInfo::instant())); - $this->register(new Redstone(new BID(Ids::REDSTONE, ItemIds::REDSTONE_BLOCK, 0), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->register(new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, ItemIds::COMPARATOR, 0, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP, ItemIds::REDSTONE_LAMP, 0), "Redstone Lamp", new BreakInfo(0.3))); - $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE, ItemIds::REDSTONE_ORE, 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER, ItemIds::REPEATER, 0), "Redstone Repeater", BreakInfo::instant())); - $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH, ItemIds::REDSTONE_TORCH, 0), "Redstone Torch", BreakInfo::instant())); - $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE, ItemIds::REDSTONE, 0), "Redstone", BreakInfo::instant())); - $this->register(new Reserved6(new BID(Ids::RESERVED6, ItemIds::RESERVED6, 0), "reserved6", BreakInfo::instant())); + $this->register(new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); + $this->register(new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); + $this->register(new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + $this->register(new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); + $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); + $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); + $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); + $this->register(new Reserved6(new BID(Ids::RESERVED6), "reserved6", BreakInfo::instant())); $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); - $this->register(new Sand(new BID(Ids::SAND, ItemIds::SAND, 0), "Sand", $sandBreakInfo)); - $this->register(new Sand(new BID(Ids::RED_SAND, ItemIds::SAND, 1), "Red Sand", $sandBreakInfo)); + $this->register(new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); + $this->register(new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); - $this->register(new SeaLantern(new BID(Ids::SEA_LANTERN, ItemIds::SEALANTERN, 0), "Sea Lantern", new BreakInfo(0.3))); - $this->register(new SeaPickle(new BID(Ids::SEA_PICKLE, ItemIds::SEA_PICKLE, 0), "Sea Pickle", BreakInfo::instant())); - $this->register(new Skull(new BID(Ids::MOB_HEAD, ItemIds::SKULL, 0, TileSkull::class), "Mob Head", new BreakInfo(1.0))); - $this->register(new Slime(new BID(Ids::SLIME, ItemIds::SLIME, 0), "Slime Block", BreakInfo::instant())); - $this->register(new Snow(new BID(Ids::SNOW, ItemIds::SNOW, 0), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new SnowLayer(new BID(Ids::SNOW_LAYER, ItemIds::SNOW_LAYER, 0), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new SoulSand(new BID(Ids::SOUL_SAND, ItemIds::SOUL_SAND, 0), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Sponge(new BID(Ids::SPONGE, ItemIds::SPONGE, 0), "Sponge", new BreakInfo(0.6, ToolType::HOE))); + $this->register(new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new BreakInfo(0.3))); + $this->register(new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); + $this->register(new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); + $this->register(new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); + $this->register(new Snow(new BID(Ids::SNOW), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - $this->register(new ShulkerBox(new BID(Ids::SHULKER_BOX, ItemIds::UNDYED_SHULKER_BOX, 0, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + $this->register(new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); $this->register( - $stone = new class(new BID(Ids::STONE, ItemIds::STONE, Meta::STONE_NORMAL), "Stone", $stoneBreakInfo) extends Opaque{ + $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLESTONE()->asItem()]; } @@ -344,103 +342,101 @@ class BlockFactory{ } } ); - $this->register(new Opaque(new BID(Ids::ANDESITE, ItemIds::STONE, Meta::STONE_ANDESITE), "Andesite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::DIORITE, ItemIds::STONE, Meta::STONE_DIORITE), "Diorite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::GRANITE, ItemIds::STONE, Meta::STONE_GRANITE), "Granite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_ANDESITE, ItemIds::STONE, Meta::STONE_POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_DIORITE, ItemIds::STONE, Meta::STONE_POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_GRANITE, ItemIds::STONE, Meta::STONE_POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::ANDESITE), "Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::DIORITE), "Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::GRANITE), "Granite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); - $this->register($stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_NORMAL), "Stone Bricks", $stoneBreakInfo)); - $this->register($mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_MOSSY), "Mossy Stone Bricks", $stoneBreakInfo)); - $this->register($crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_CRACKED), "Cracked Stone Bricks", $stoneBreakInfo)); - $this->register($chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS, ItemIds::STONEBRICK, Meta::STONE_BRICK_CHISELED), "Chiseled Stone Bricks", $stoneBreakInfo)); + $this->register($stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS), "Stone Bricks", $stoneBreakInfo)); + $this->register($mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS), "Mossy Stone Bricks", $stoneBreakInfo)); + $this->register($crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); + $this->register($chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); - $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE, ItemIds::MONSTER_EGG, Meta::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_MOSSY), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CRACKED), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK, ItemIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CHISELED), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); - $this->register(new Stair(new BID(Ids::STONE_STAIRS, ItemIds::NORMAL_STONE_STAIRS, 0), "Stone Stairs", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_STONE, ItemIds::SMOOTH_STONE, 0), "Smooth Stone", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::ANDESITE_STAIRS, ItemIds::ANDESITE_STAIRS, 0), "Andesite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::DIORITE_STAIRS, ItemIds::DIORITE_STAIRS, 0), "Diorite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::GRANITE_STAIRS, ItemIds::GRANITE_STAIRS, 0), "Granite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS, ItemIds::POLISHED_ANDESITE_STAIRS, 0), "Polished Andesite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS, ItemIds::POLISHED_DIORITE_STAIRS, 0), "Polished Diorite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS, ItemIds::POLISHED_GRANITE_STAIRS, 0), "Polished Granite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::STONE_BRICK_STAIRS, ItemIds::STONE_BRICK_STAIRS, 0), "Stone Brick Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS, ItemIds::MOSSY_STONE_BRICK_STAIRS, 0), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - $this->register(new StoneButton(new BID(Ids::STONE_BUTTON, ItemIds::STONE_BUTTON, 0), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->register(new Stonecutter(new BID(Ids::STONECUTTER, ItemIds::STONECUTTER_BLOCK, 0), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - $this->register(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE, ItemIds::STONE_PRESSURE_PLATE, 0), "Stone Pressure Plate", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Stair(new BID(Ids::STONE_STAIRS), "Stone Stairs", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_STONE), "Smooth Stone", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::ANDESITE_STAIRS), "Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::DIORITE_STAIRS), "Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::GRANITE_STAIRS), "Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS), "Polished Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS), "Polished Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); + $this->register(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "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); - - $getStoneSlabId = static fn(int $blockTypeId, int $stoneSlabId, int $meta) => BlockLegacyIdHelper::getStoneSlabIdentifier($blockTypeId, $stoneSlabId, $meta); foreach([ - new Slab($getStoneSlabId(Ids::BRICK_SLAB, 1, Meta::STONE_SLAB_BRICK), "Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::COBBLESTONE_SLAB, 1, Meta::STONE_SLAB_COBBLESTONE), "Cobblestone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::FAKE_WOODEN_SLAB, 1, Meta::STONE_SLAB_FAKE_WOODEN), "Fake Wooden", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::NETHER_BRICK_SLAB, 1, Meta::STONE_SLAB_NETHER_BRICK), "Nether Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::QUARTZ_SLAB, 1, Meta::STONE_SLAB_QUARTZ), "Quartz", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::SANDSTONE_SLAB, 1, Meta::STONE_SLAB_SANDSTONE), "Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::SMOOTH_STONE_SLAB, 1, Meta::STONE_SLAB_SMOOTH_STONE), "Smooth Stone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::STONE_BRICK_SLAB, 1, Meta::STONE_SLAB_STONE_BRICK), "Stone Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::DARK_PRISMARINE_SLAB, 2, Meta::STONE_SLAB2_DARK_PRISMARINE), "Dark Prismarine", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::MOSSY_COBBLESTONE_SLAB, 2, Meta::STONE_SLAB2_MOSSY_COBBLESTONE), "Mossy Cobblestone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::PRISMARINE_SLAB, 2, Meta::STONE_SLAB2_PRISMARINE), "Prismarine", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::PRISMARINE_BRICKS_SLAB, 2, Meta::STONE_SLAB2_PRISMARINE_BRICKS), "Prismarine Bricks", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::PURPUR_SLAB, 2, Meta::STONE_SLAB2_PURPUR), "Purpur", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::RED_NETHER_BRICK_SLAB, 2, Meta::STONE_SLAB2_RED_NETHER_BRICK), "Red Nether Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::RED_SANDSTONE_SLAB, 2, Meta::STONE_SLAB2_RED_SANDSTONE), "Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::SMOOTH_SANDSTONE_SLAB, 2, Meta::STONE_SLAB2_SMOOTH_SANDSTONE), "Smooth Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::ANDESITE_SLAB, 3, Meta::STONE_SLAB3_ANDESITE), "Andesite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::DIORITE_SLAB, 3, Meta::STONE_SLAB3_DIORITE), "Diorite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::END_STONE_BRICK_SLAB, 3, Meta::STONE_SLAB3_END_STONE_BRICK), "End Stone Brick", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::GRANITE_SLAB, 3, Meta::STONE_SLAB3_GRANITE), "Granite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::POLISHED_ANDESITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_ANDESITE), "Polished Andesite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::POLISHED_DIORITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_DIORITE), "Polished Diorite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::POLISHED_GRANITE_SLAB, 3, Meta::STONE_SLAB3_POLISHED_GRANITE), "Polished Granite", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::SMOOTH_RED_SANDSTONE_SLAB, 3, Meta::STONE_SLAB3_SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::CUT_RED_SANDSTONE_SLAB, 4, Meta::STONE_SLAB4_CUT_RED_SANDSTONE), "Cut Red Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::CUT_SANDSTONE_SLAB, 4, Meta::STONE_SLAB4_CUT_SANDSTONE), "Cut Sandstone", $stoneSlabBreakInfo), - new Slab($getStoneSlabId(Ids::MOSSY_STONE_BRICK_SLAB, 4, Meta::STONE_SLAB4_MOSSY_STONE_BRICK), "Mossy Stone Brick", $stoneSlabBreakInfo), - 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), + new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo), + new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo), + new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo), + new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo), + new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo), + new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo), + new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo), + new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo), + new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo), + new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo), + new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo), ] as $slabType){ $this->register($slabType); } - $this->register(new Opaque(new BID(Ids::LEGACY_STONECUTTER, ItemIds::STONECUTTER, 0), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Sugarcane(new BID(Ids::SUGARCANE, ItemIds::REEDS, 0), "Sugarcane", BreakInfo::instant())); - $this->register(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH, ItemIds::SWEET_BERRIES, 0), "Sweet Berry Bush", BreakInfo::instant())); - $this->register(new TNT(new BID(Ids::TNT, ItemIds::TNT, 0), "TNT", BreakInfo::instant())); - $this->register(new TallGrass(new BID(Ids::FERN, ItemIds::TALLGRASS, Meta::TALLGRASS_FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new TallGrass(new BID(Ids::TALL_GRASS, ItemIds::TALLGRASS, Meta::TALLGRASS_NORMAL), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); + $this->register(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); + $this->register(new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); + $this->register(new TallGrass(new BID(Ids::FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new Torch(new BID(Ids::BLUE_TORCH, ItemIds::COLORED_TORCH_BP, 0), "Blue Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::PURPLE_TORCH, ItemIds::COLORED_TORCH_BP, 8), "Purple Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::RED_TORCH, ItemIds::COLORED_TORCH_RG, 0), "Red Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::GREEN_TORCH, ItemIds::COLORED_TORCH_RG, 8), "Green Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::TORCH, ItemIds::TORCH, 0), "Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::RED_TORCH), "Red Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::TORCH), "Torch", BreakInfo::instant())); - $this->register(new TrappedChest(new BID(Ids::TRAPPED_CHEST, ItemIds::TRAPPED_CHEST, 0, TileChest::class), "Trapped Chest", $chestBreakInfo)); - $this->register(new Tripwire(new BID(Ids::TRIPWIRE, ItemIds::STRING, 0), "Tripwire", BreakInfo::instant())); - $this->register(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK, ItemIds::TRIPWIRE_HOOK, 0), "Tripwire Hook", BreakInfo::instant())); - $this->register(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH, ItemIds::UNDERWATER_TORCH, 0), "Underwater Torch", BreakInfo::instant())); - $this->register(new Vine(new BID(Ids::VINES, ItemIds::VINE, 0), "Vines", new BreakInfo(0.2, ToolType::AXE))); - $this->register(new Water(new BID(Ids::WATER, ItemIds::FLOWING_WATER, 0), "Water", BreakInfo::indestructible(500.0))); - $this->register(new WaterLily(new BID(Ids::LILY_PAD, ItemIds::LILY_PAD, 0), "Lily Pad", BreakInfo::instant())); + $this->register(new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); + $this->register(new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); + $this->register(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); + $this->register(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); + $this->register(new Vine(new BID(Ids::VINES), "Vines", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); + $this->register(new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, ItemIds::HEAVY_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); - $this->register(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, ItemIds::LIGHT_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); - $this->register(new Wheat(new BID(Ids::WHEAT, ItemIds::WHEAT_BLOCK, 0), "Wheat Block", BreakInfo::instant())); + $this->register(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); + $this->register(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); + $this->register(new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ @@ -486,19 +482,19 @@ class BlockFactory{ } $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS, ItemIds::RED_SANDSTONE_STAIRS, 0), "Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS, ItemIds::SMOOTH_RED_SANDSTONE_STAIRS, 0), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_NORMAL), "Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CUT_RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_CUT), "Cut Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE, ItemIds::RED_SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE), "Chiseled Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_RED_SANDSTONE), "Cut Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Stair(new BID(Ids::SANDSTONE_STAIRS, ItemIds::SANDSTONE_STAIRS, 0), "Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS, ItemIds::SMOOTH_SANDSTONE_STAIRS, 0), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_NORMAL), "Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_CUT), "Cut Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE, ItemIds::SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Sandstone", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SANDSTONE_STAIRS), "Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SANDSTONE), "Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_SANDSTONE), "Chiseled Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); $glazedTerracottaBreakInfo = new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); foreach(DyeColor::getAll() as $color){ @@ -507,16 +503,16 @@ class BlockFactory{ }; $this->register(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); } - $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, ItemIds::SHULKER_BOX, 0, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); - $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS, ItemIds::STAINED_GLASS, 0), "Stained Glass", $glassBreakInfo)); - $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE, ItemIds::STAINED_GLASS_PANE, 0), "Stained Glass Pane", $glassBreakInfo)); - $this->register(new StainedHardenedClay(new BID(Ids::STAINED_CLAY, ItemIds::STAINED_CLAY, 0), "Stained Clay", $hardenedClayBreakInfo)); - $this->register(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS, ItemIds::HARD_STAINED_GLASS, 0), "Stained Hardened Glass", $hardenedGlassBreakInfo)); - $this->register(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE, ItemIds::HARD_STAINED_GLASS_PANE, 0), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->register(new Carpet(new BID(Ids::CARPET, ItemIds::CARPET, 0), "Carpet", new BreakInfo(0.1))); - $this->register(new Concrete(new BID(Ids::CONCRETE, ItemIds::CONCRETE, 0), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new ConcretePowder(new BID(Ids::CONCRETE_POWDER, ItemIds::CONCRETE_POWDER, 0), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Wool(new BID(Ids::WOOL, ItemIds::WOOL, 0), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ + $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); + $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); + $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); + $this->register(new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); + $this->register(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); + $this->register(new Concrete(new BID(Ids::CONCRETE), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); if($item->getBlockToolType() === ToolType::SHEARS){ @@ -529,45 +525,45 @@ 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->register(new Wall(new BID(Ids::COBBLESTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_COBBLESTONE), "Cobblestone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::ANDESITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_ANDESITE), "Andesite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_BRICK), "Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::DIORITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_DIORITE), "Diorite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::END_STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_END_STONE_BRICK), "End Stone Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::GRANITE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_GRANITE), "Granite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_STONE_BRICK), "Mossy Stone Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_COBBLESTONE), "Mossy Cobblestone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::NETHER_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_NETHER_BRICK), "Nether Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::PRISMARINE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_PRISMARINE), "Prismarine Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::RED_NETHER_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_RED_NETHER_BRICK), "Red Nether Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::RED_SANDSTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_RED_SANDSTONE), "Red Sandstone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::SANDSTONE_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_SANDSTONE), "Sandstone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::STONE_BRICK_WALL, ItemIds::COBBLESTONE_WALL, Meta::WALL_STONE_BRICK), "Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::DIORITE_WALL), "Diorite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::END_STONE_BRICK_WALL), "End Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::GRANITE_WALL), "Granite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL), "Mossy Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL), "Mossy Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::NETHER_BRICK_WALL), "Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::PRISMARINE_WALL), "Prismarine Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_NETHER_BRICK_WALL), "Red Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_SANDSTONE_WALL), "Red Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::SANDSTONE_WALL), "Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::STONE_BRICK_WALL), "Stone Brick Wall", $wallBreakInfo)); $this->registerElements(); $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new ChemistryTable(new BID(Ids::COMPOUND_CREATOR, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::LAB_TABLE, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::MATERIAL_REDUCER, ItemIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); - $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, ItemIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); + $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT), "Heat Block", $chemistryTableBreakInfo)); $this->registerMushroomBlocks(); $this->register(new Coral( - new BID(Ids::CORAL, ItemIds::CORAL, 0), + new BID(Ids::CORAL), "Coral", BreakInfo::instant(), )); $this->register(new FloorCoralFan( - new BID(Ids::CORAL_FAN, ItemIds::CORAL_FAN, 0), + new BID(Ids::CORAL_FAN), "Coral Fan", BreakInfo::instant(), )); $this->register(new WallCoralFan( - new BID(Ids::WALL_CORAL_FAN, ItemIds::CORAL_FAN, 0), + new BID(Ids::WALL_CORAL_FAN), "Wall Coral Fan", BreakInfo::instant(), )); @@ -710,136 +706,136 @@ class BlockFactory{ private function registerMushroomBlocks() : void{ $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); - $this->register(new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK, ItemIds::BROWN_MUSHROOM_BLOCK, 0), "Brown Mushroom Block", $mushroomBlockBreakInfo)); - $this->register(new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK, ItemIds::RED_MUSHROOM_BLOCK, 0), "Red Mushroom Block", $mushroomBlockBreakInfo)); + $this->register(new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); + $this->register(new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); //finally, the stems - $this->register(new MushroomStem(new BID(Ids::MUSHROOM_STEM, ItemIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); - $this->register(new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM, ItemIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); + $this->register(new MushroomStem(new BID(Ids::MUSHROOM_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); + $this->register(new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); } private function registerElements() : void{ $instaBreak = BreakInfo::instant(); - $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO, ItemIds::ELEMENT_0, 0), "???", $instaBreak)); + $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); - $this->register(new Element(new BID(Ids::ELEMENT_HYDROGEN, ItemIds::ELEMENT_1, 0), "Hydrogen", $instaBreak, "h", 1, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_HELIUM, ItemIds::ELEMENT_2, 0), "Helium", $instaBreak, "he", 2, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_LITHIUM, ItemIds::ELEMENT_3, 0), "Lithium", $instaBreak, "li", 3, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_BERYLLIUM, ItemIds::ELEMENT_4, 0), "Beryllium", $instaBreak, "be", 4, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_BORON, ItemIds::ELEMENT_5, 0), "Boron", $instaBreak, "b", 5, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_CARBON, ItemIds::ELEMENT_6, 0), "Carbon", $instaBreak, "c", 6, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_NITROGEN, ItemIds::ELEMENT_7, 0), "Nitrogen", $instaBreak, "n", 7, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_OXYGEN, ItemIds::ELEMENT_8, 0), "Oxygen", $instaBreak, "o", 8, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_FLUORINE, ItemIds::ELEMENT_9, 0), "Fluorine", $instaBreak, "f", 9, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_NEON, ItemIds::ELEMENT_10, 0), "Neon", $instaBreak, "ne", 10, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_SODIUM, ItemIds::ELEMENT_11, 0), "Sodium", $instaBreak, "na", 11, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_MAGNESIUM, ItemIds::ELEMENT_12, 0), "Magnesium", $instaBreak, "mg", 12, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_ALUMINUM, ItemIds::ELEMENT_13, 0), "Aluminum", $instaBreak, "al", 13, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_SILICON, ItemIds::ELEMENT_14, 0), "Silicon", $instaBreak, "si", 14, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_PHOSPHORUS, ItemIds::ELEMENT_15, 0), "Phosphorus", $instaBreak, "p", 15, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_SULFUR, ItemIds::ELEMENT_16, 0), "Sulfur", $instaBreak, "s", 16, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_CHLORINE, ItemIds::ELEMENT_17, 0), "Chlorine", $instaBreak, "cl", 17, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_ARGON, ItemIds::ELEMENT_18, 0), "Argon", $instaBreak, "ar", 18, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_POTASSIUM, ItemIds::ELEMENT_19, 0), "Potassium", $instaBreak, "k", 19, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_CALCIUM, ItemIds::ELEMENT_20, 0), "Calcium", $instaBreak, "ca", 20, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_SCANDIUM, ItemIds::ELEMENT_21, 0), "Scandium", $instaBreak, "sc", 21, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TITANIUM, ItemIds::ELEMENT_22, 0), "Titanium", $instaBreak, "ti", 22, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_VANADIUM, ItemIds::ELEMENT_23, 0), "Vanadium", $instaBreak, "v", 23, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_CHROMIUM, ItemIds::ELEMENT_24, 0), "Chromium", $instaBreak, "cr", 24, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MANGANESE, ItemIds::ELEMENT_25, 0), "Manganese", $instaBreak, "mn", 25, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_IRON, ItemIds::ELEMENT_26, 0), "Iron", $instaBreak, "fe", 26, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COBALT, ItemIds::ELEMENT_27, 0), "Cobalt", $instaBreak, "co", 27, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NICKEL, ItemIds::ELEMENT_28, 0), "Nickel", $instaBreak, "ni", 28, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COPPER, ItemIds::ELEMENT_29, 0), "Copper", $instaBreak, "cu", 29, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ZINC, ItemIds::ELEMENT_30, 0), "Zinc", $instaBreak, "zn", 30, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_GALLIUM, ItemIds::ELEMENT_31, 0), "Gallium", $instaBreak, "ga", 31, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_GERMANIUM, ItemIds::ELEMENT_32, 0), "Germanium", $instaBreak, "ge", 32, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_ARSENIC, ItemIds::ELEMENT_33, 0), "Arsenic", $instaBreak, "as", 33, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_SELENIUM, ItemIds::ELEMENT_34, 0), "Selenium", $instaBreak, "se", 34, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_BROMINE, ItemIds::ELEMENT_35, 0), "Bromine", $instaBreak, "br", 35, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_KRYPTON, ItemIds::ELEMENT_36, 0), "Krypton", $instaBreak, "kr", 36, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_RUBIDIUM, ItemIds::ELEMENT_37, 0), "Rubidium", $instaBreak, "rb", 37, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_STRONTIUM, ItemIds::ELEMENT_38, 0), "Strontium", $instaBreak, "sr", 38, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_YTTRIUM, ItemIds::ELEMENT_39, 0), "Yttrium", $instaBreak, "y", 39, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ZIRCONIUM, ItemIds::ELEMENT_40, 0), "Zirconium", $instaBreak, "zr", 40, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NIOBIUM, ItemIds::ELEMENT_41, 0), "Niobium", $instaBreak, "nb", 41, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MOLYBDENUM, ItemIds::ELEMENT_42, 0), "Molybdenum", $instaBreak, "mo", 42, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TECHNETIUM, ItemIds::ELEMENT_43, 0), "Technetium", $instaBreak, "tc", 43, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RUTHENIUM, ItemIds::ELEMENT_44, 0), "Ruthenium", $instaBreak, "ru", 44, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RHODIUM, ItemIds::ELEMENT_45, 0), "Rhodium", $instaBreak, "rh", 45, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_PALLADIUM, ItemIds::ELEMENT_46, 0), "Palladium", $instaBreak, "pd", 46, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_SILVER, ItemIds::ELEMENT_47, 0), "Silver", $instaBreak, "ag", 47, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_CADMIUM, ItemIds::ELEMENT_48, 0), "Cadmium", $instaBreak, "cd", 48, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_INDIUM, ItemIds::ELEMENT_49, 0), "Indium", $instaBreak, "in", 49, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_TIN, ItemIds::ELEMENT_50, 0), "Tin", $instaBreak, "sn", 50, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_ANTIMONY, ItemIds::ELEMENT_51, 0), "Antimony", $instaBreak, "sb", 51, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_TELLURIUM, ItemIds::ELEMENT_52, 0), "Tellurium", $instaBreak, "te", 52, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_IODINE, ItemIds::ELEMENT_53, 0), "Iodine", $instaBreak, "i", 53, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_XENON, ItemIds::ELEMENT_54, 0), "Xenon", $instaBreak, "xe", 54, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_CESIUM, ItemIds::ELEMENT_55, 0), "Cesium", $instaBreak, "cs", 55, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_BARIUM, ItemIds::ELEMENT_56, 0), "Barium", $instaBreak, "ba", 56, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_LANTHANUM, ItemIds::ELEMENT_57, 0), "Lanthanum", $instaBreak, "la", 57, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_CERIUM, ItemIds::ELEMENT_58, 0), "Cerium", $instaBreak, "ce", 58, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM, ItemIds::ELEMENT_59, 0), "Praseodymium", $instaBreak, "pr", 59, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_NEODYMIUM, ItemIds::ELEMENT_60, 0), "Neodymium", $instaBreak, "nd", 60, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_PROMETHIUM, ItemIds::ELEMENT_61, 0), "Promethium", $instaBreak, "pm", 61, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_SAMARIUM, ItemIds::ELEMENT_62, 0), "Samarium", $instaBreak, "sm", 62, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_EUROPIUM, ItemIds::ELEMENT_63, 0), "Europium", $instaBreak, "eu", 63, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_GADOLINIUM, ItemIds::ELEMENT_64, 0), "Gadolinium", $instaBreak, "gd", 64, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_TERBIUM, ItemIds::ELEMENT_65, 0), "Terbium", $instaBreak, "tb", 65, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_DYSPROSIUM, ItemIds::ELEMENT_66, 0), "Dysprosium", $instaBreak, "dy", 66, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_HOLMIUM, ItemIds::ELEMENT_67, 0), "Holmium", $instaBreak, "ho", 67, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_ERBIUM, ItemIds::ELEMENT_68, 0), "Erbium", $instaBreak, "er", 68, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_THULIUM, ItemIds::ELEMENT_69, 0), "Thulium", $instaBreak, "tm", 69, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_YTTERBIUM, ItemIds::ELEMENT_70, 0), "Ytterbium", $instaBreak, "yb", 70, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_LUTETIUM, ItemIds::ELEMENT_71, 0), "Lutetium", $instaBreak, "lu", 71, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_HAFNIUM, ItemIds::ELEMENT_72, 0), "Hafnium", $instaBreak, "hf", 72, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TANTALUM, ItemIds::ELEMENT_73, 0), "Tantalum", $instaBreak, "ta", 73, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TUNGSTEN, ItemIds::ELEMENT_74, 0), "Tungsten", $instaBreak, "w", 74, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RHENIUM, ItemIds::ELEMENT_75, 0), "Rhenium", $instaBreak, "re", 75, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_OSMIUM, ItemIds::ELEMENT_76, 0), "Osmium", $instaBreak, "os", 76, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_IRIDIUM, ItemIds::ELEMENT_77, 0), "Iridium", $instaBreak, "ir", 77, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_PLATINUM, ItemIds::ELEMENT_78, 0), "Platinum", $instaBreak, "pt", 78, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_GOLD, ItemIds::ELEMENT_79, 0), "Gold", $instaBreak, "au", 79, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MERCURY, ItemIds::ELEMENT_80, 0), "Mercury", $instaBreak, "hg", 80, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_THALLIUM, ItemIds::ELEMENT_81, 0), "Thallium", $instaBreak, "tl", 81, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_LEAD, ItemIds::ELEMENT_82, 0), "Lead", $instaBreak, "pb", 82, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_BISMUTH, ItemIds::ELEMENT_83, 0), "Bismuth", $instaBreak, "bi", 83, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_POLONIUM, ItemIds::ELEMENT_84, 0), "Polonium", $instaBreak, "po", 84, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_ASTATINE, ItemIds::ELEMENT_85, 0), "Astatine", $instaBreak, "at", 85, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_RADON, ItemIds::ELEMENT_86, 0), "Radon", $instaBreak, "rn", 86, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_FRANCIUM, ItemIds::ELEMENT_87, 0), "Francium", $instaBreak, "fr", 87, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_RADIUM, ItemIds::ELEMENT_88, 0), "Radium", $instaBreak, "ra", 88, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_ACTINIUM, ItemIds::ELEMENT_89, 0), "Actinium", $instaBreak, "ac", 89, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_THORIUM, ItemIds::ELEMENT_90, 0), "Thorium", $instaBreak, "th", 90, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_PROTACTINIUM, ItemIds::ELEMENT_91, 0), "Protactinium", $instaBreak, "pa", 91, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_URANIUM, ItemIds::ELEMENT_92, 0), "Uranium", $instaBreak, "u", 92, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_NEPTUNIUM, ItemIds::ELEMENT_93, 0), "Neptunium", $instaBreak, "np", 93, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_PLUTONIUM, ItemIds::ELEMENT_94, 0), "Plutonium", $instaBreak, "pu", 94, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_AMERICIUM, ItemIds::ELEMENT_95, 0), "Americium", $instaBreak, "am", 95, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_CURIUM, ItemIds::ELEMENT_96, 0), "Curium", $instaBreak, "cm", 96, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_BERKELIUM, ItemIds::ELEMENT_97, 0), "Berkelium", $instaBreak, "bk", 97, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_CALIFORNIUM, ItemIds::ELEMENT_98, 0), "Californium", $instaBreak, "cf", 98, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_EINSTEINIUM, ItemIds::ELEMENT_99, 0), "Einsteinium", $instaBreak, "es", 99, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_FERMIUM, ItemIds::ELEMENT_100, 0), "Fermium", $instaBreak, "fm", 100, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_MENDELEVIUM, ItemIds::ELEMENT_101, 0), "Mendelevium", $instaBreak, "md", 101, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_NOBELIUM, ItemIds::ELEMENT_102, 0), "Nobelium", $instaBreak, "no", 102, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_LAWRENCIUM, ItemIds::ELEMENT_103, 0), "Lawrencium", $instaBreak, "lr", 103, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM, ItemIds::ELEMENT_104, 0), "Rutherfordium", $instaBreak, "rf", 104, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_DUBNIUM, ItemIds::ELEMENT_105, 0), "Dubnium", $instaBreak, "db", 105, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_SEABORGIUM, ItemIds::ELEMENT_106, 0), "Seaborgium", $instaBreak, "sg", 106, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_BOHRIUM, ItemIds::ELEMENT_107, 0), "Bohrium", $instaBreak, "bh", 107, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_HASSIUM, ItemIds::ELEMENT_108, 0), "Hassium", $instaBreak, "hs", 108, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MEITNERIUM, ItemIds::ELEMENT_109, 0), "Meitnerium", $instaBreak, "mt", 109, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM, ItemIds::ELEMENT_110, 0), "Darmstadtium", $instaBreak, "ds", 110, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ROENTGENIUM, ItemIds::ELEMENT_111, 0), "Roentgenium", $instaBreak, "rg", 111, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COPERNICIUM, ItemIds::ELEMENT_112, 0), "Copernicium", $instaBreak, "cn", 112, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NIHONIUM, ItemIds::ELEMENT_113, 0), "Nihonium", $instaBreak, "nh", 113, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_FLEROVIUM, ItemIds::ELEMENT_114, 0), "Flerovium", $instaBreak, "fl", 114, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_MOSCOVIUM, ItemIds::ELEMENT_115, 0), "Moscovium", $instaBreak, "mc", 115, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_LIVERMORIUM, ItemIds::ELEMENT_116, 0), "Livermorium", $instaBreak, "lv", 116, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_TENNESSINE, ItemIds::ELEMENT_117, 0), "Tennessine", $instaBreak, "ts", 117, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON, ItemIds::ELEMENT_118, 0), "Oganesson", $instaBreak, "og", 118, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_HYDROGEN), "Hydrogen", $instaBreak, "h", 1, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_HELIUM), "Helium", $instaBreak, "he", 2, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_LITHIUM), "Lithium", $instaBreak, "li", 3, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BERYLLIUM), "Beryllium", $instaBreak, "be", 4, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_BORON), "Boron", $instaBreak, "b", 5, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_CARBON), "Carbon", $instaBreak, "c", 6, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_NITROGEN), "Nitrogen", $instaBreak, "n", 7, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_OXYGEN), "Oxygen", $instaBreak, "o", 8, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_FLUORINE), "Fluorine", $instaBreak, "f", 9, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_NEON), "Neon", $instaBreak, "ne", 10, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_SODIUM), "Sodium", $instaBreak, "na", 11, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_MAGNESIUM), "Magnesium", $instaBreak, "mg", 12, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ALUMINUM), "Aluminum", $instaBreak, "al", 13, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_SILICON), "Silicon", $instaBreak, "si", 14, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_PHOSPHORUS), "Phosphorus", $instaBreak, "p", 15, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_SULFUR), "Sulfur", $instaBreak, "s", 16, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_CHLORINE), "Chlorine", $instaBreak, "cl", 17, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_ARGON), "Argon", $instaBreak, "ar", 18, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_POTASSIUM), "Potassium", $instaBreak, "k", 19, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_CALCIUM), "Calcium", $instaBreak, "ca", 20, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_SCANDIUM), "Scandium", $instaBreak, "sc", 21, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TITANIUM), "Titanium", $instaBreak, "ti", 22, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_VANADIUM), "Vanadium", $instaBreak, "v", 23, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CHROMIUM), "Chromium", $instaBreak, "cr", 24, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MANGANESE), "Manganese", $instaBreak, "mn", 25, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRON), "Iron", $instaBreak, "fe", 26, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COBALT), "Cobalt", $instaBreak, "co", 27, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NICKEL), "Nickel", $instaBreak, "ni", 28, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPPER), "Copper", $instaBreak, "cu", 29, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZINC), "Zinc", $instaBreak, "zn", 30, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GALLIUM), "Gallium", $instaBreak, "ga", 31, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_GERMANIUM), "Germanium", $instaBreak, "ge", 32, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ARSENIC), "Arsenic", $instaBreak, "as", 33, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_SELENIUM), "Selenium", $instaBreak, "se", 34, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_BROMINE), "Bromine", $instaBreak, "br", 35, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_KRYPTON), "Krypton", $instaBreak, "kr", 36, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_RUBIDIUM), "Rubidium", $instaBreak, "rb", 37, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_STRONTIUM), "Strontium", $instaBreak, "sr", 38, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTRIUM), "Yttrium", $instaBreak, "y", 39, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZIRCONIUM), "Zirconium", $instaBreak, "zr", 40, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIOBIUM), "Niobium", $instaBreak, "nb", 41, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MOLYBDENUM), "Molybdenum", $instaBreak, "mo", 42, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TECHNETIUM), "Technetium", $instaBreak, "tc", 43, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHENIUM), "Ruthenium", $instaBreak, "ru", 44, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHODIUM), "Rhodium", $instaBreak, "rh", 45, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PALLADIUM), "Palladium", $instaBreak, "pd", 46, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SILVER), "Silver", $instaBreak, "ag", 47, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CADMIUM), "Cadmium", $instaBreak, "cd", 48, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_INDIUM), "Indium", $instaBreak, "in", 49, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TIN), "Tin", $instaBreak, "sn", 50, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_ANTIMONY), "Antimony", $instaBreak, "sb", 51, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_TELLURIUM), "Tellurium", $instaBreak, "te", 52, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_IODINE), "Iodine", $instaBreak, "i", 53, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_XENON), "Xenon", $instaBreak, "xe", 54, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_CESIUM), "Cesium", $instaBreak, "cs", 55, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BARIUM), "Barium", $instaBreak, "ba", 56, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_LANTHANUM), "Lanthanum", $instaBreak, "la", 57, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_CERIUM), "Cerium", $instaBreak, "ce", 58, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM), "Praseodymium", $instaBreak, "pr", 59, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_NEODYMIUM), "Neodymium", $instaBreak, "nd", 60, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PROMETHIUM), "Promethium", $instaBreak, "pm", 61, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_SAMARIUM), "Samarium", $instaBreak, "sm", 62, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_EUROPIUM), "Europium", $instaBreak, "eu", 63, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_GADOLINIUM), "Gadolinium", $instaBreak, "gd", 64, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_TERBIUM), "Terbium", $instaBreak, "tb", 65, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_DYSPROSIUM), "Dysprosium", $instaBreak, "dy", 66, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HOLMIUM), "Holmium", $instaBreak, "ho", 67, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_ERBIUM), "Erbium", $instaBreak, "er", 68, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_THULIUM), "Thulium", $instaBreak, "tm", 69, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTERBIUM), "Ytterbium", $instaBreak, "yb", 70, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_LUTETIUM), "Lutetium", $instaBreak, "lu", 71, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HAFNIUM), "Hafnium", $instaBreak, "hf", 72, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TANTALUM), "Tantalum", $instaBreak, "ta", 73, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TUNGSTEN), "Tungsten", $instaBreak, "w", 74, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHENIUM), "Rhenium", $instaBreak, "re", 75, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_OSMIUM), "Osmium", $instaBreak, "os", 76, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRIDIUM), "Iridium", $instaBreak, "ir", 77, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PLATINUM), "Platinum", $instaBreak, "pt", 78, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GOLD), "Gold", $instaBreak, "au", 79, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MERCURY), "Mercury", $instaBreak, "hg", 80, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_THALLIUM), "Thallium", $instaBreak, "tl", 81, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LEAD), "Lead", $instaBreak, "pb", 82, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_BISMUTH), "Bismuth", $instaBreak, "bi", 83, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_POLONIUM), "Polonium", $instaBreak, "po", 84, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ASTATINE), "Astatine", $instaBreak, "at", 85, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_RADON), "Radon", $instaBreak, "rn", 86, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_FRANCIUM), "Francium", $instaBreak, "fr", 87, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_RADIUM), "Radium", $instaBreak, "ra", 88, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ACTINIUM), "Actinium", $instaBreak, "ac", 89, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_THORIUM), "Thorium", $instaBreak, "th", 90, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PROTACTINIUM), "Protactinium", $instaBreak, "pa", 91, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_URANIUM), "Uranium", $instaBreak, "u", 92, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NEPTUNIUM), "Neptunium", $instaBreak, "np", 93, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PLUTONIUM), "Plutonium", $instaBreak, "pu", 94, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_AMERICIUM), "Americium", $instaBreak, "am", 95, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CURIUM), "Curium", $instaBreak, "cm", 96, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_BERKELIUM), "Berkelium", $instaBreak, "bk", 97, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CALIFORNIUM), "Californium", $instaBreak, "cf", 98, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_EINSTEINIUM), "Einsteinium", $instaBreak, "es", 99, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_FERMIUM), "Fermium", $instaBreak, "fm", 100, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_MENDELEVIUM), "Mendelevium", $instaBreak, "md", 101, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NOBELIUM), "Nobelium", $instaBreak, "no", 102, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_LAWRENCIUM), "Lawrencium", $instaBreak, "lr", 103, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM), "Rutherfordium", $instaBreak, "rf", 104, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DUBNIUM), "Dubnium", $instaBreak, "db", 105, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SEABORGIUM), "Seaborgium", $instaBreak, "sg", 106, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_BOHRIUM), "Bohrium", $instaBreak, "bh", 107, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_HASSIUM), "Hassium", $instaBreak, "hs", 108, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MEITNERIUM), "Meitnerium", $instaBreak, "mt", 109, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM), "Darmstadtium", $instaBreak, "ds", 110, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ROENTGENIUM), "Roentgenium", $instaBreak, "rg", 111, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPERNICIUM), "Copernicium", $instaBreak, "cn", 112, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIHONIUM), "Nihonium", $instaBreak, "nh", 113, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_FLEROVIUM), "Flerovium", $instaBreak, "fl", 114, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_MOSCOVIUM), "Moscovium", $instaBreak, "mc", 115, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LIVERMORIUM), "Livermorium", $instaBreak, "lv", 116, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TENNESSINE), "Tennessine", $instaBreak, "ts", 117, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); } /** @@ -918,7 +914,7 @@ class BlockFactory{ if(isset($this->fullList[$index])) { //hot $block = clone $this->fullList[$index]; }else{ - $block = new UnknownBlock(new BID($typeId, $stateData, $stateData), BreakInfo::instant()); + $block = new UnknownBlock(new BID($typeId), BreakInfo::instant(), $stateData); } return $block; diff --git a/src/block/BlockIdentifier.php b/src/block/BlockIdentifier.php index f2c7fd2c9e..847231682f 100644 --- a/src/block/BlockIdentifier.php +++ b/src/block/BlockIdentifier.php @@ -32,17 +32,11 @@ class BlockIdentifier{ */ public function __construct( private int $blockTypeId, - private int $legacyItemId, - private int $legacyItemVariant, private ?string $tileClass = null ){ if($blockTypeId < 0){ throw new \InvalidArgumentException("Block type ID may not be negative"); } - if($legacyItemVariant < 0){ - throw new \InvalidArgumentException("Legacy item variant may not be negative"); - } - if($tileClass !== null){ Utils::testValidInstance($tileClass, Tile::class); } @@ -50,20 +44,6 @@ class BlockIdentifier{ public function getBlockTypeId() : int{ return $this->blockTypeId; } - /** - * @deprecated - */ - public function getLegacyVariant() : int{ - return $this->legacyItemVariant; - } - - /** - * @deprecated - */ - public function getLegacyItemId() : int{ - return $this->legacyItemId; - } - /** * @phpstan-return class-string|null */ diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 0574e754a3..2d93b20d58 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -28,8 +28,6 @@ use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\TreeType; -use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\item\ItemIds; use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; @@ -44,7 +42,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_PLANKS, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::PLANKS, $treeType->getMagicNumber()); + }); } public static function getWoodenFenceIdentifier(TreeType $treeType) : BID{ @@ -56,7 +54,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_FENCE, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::FENCE, $treeType->getMagicNumber()); + }); } public static function getWoodenSlabIdentifier(TreeType $treeType) : BID{ @@ -68,17 +66,17 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_SLAB, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::WOODEN_SLAB, $treeType->getMagicNumber()); + }); } public static function getLogIdentifier(TreeType $treeType) : BID{ return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LOG, ItemIds::LOG, 0), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG, ItemIds::LOG, 1), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG, ItemIds::LOG, 2), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG, ItemIds::LOG, 3), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG, ItemIds::LOG2, 0), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG, ItemIds::LOG2, 1), + TreeType::OAK()->id() => new BID(Ids::OAK_LOG), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG), default => throw new AssumptionFailedError("All tree types should be covered") }; } @@ -92,7 +90,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_WOOD, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::WOOD, $treeType->getMagicNumber()); + }); } public static function getAllSidedStrippedLogIdentifier(TreeType $treeType) : BID{ @@ -104,17 +102,17 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::STRIPPED_ACACIA_WOOD, TreeType::DARK_OAK()->id() => Ids::STRIPPED_DARK_OAK_WOOD, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::WOOD, $treeType->getMagicNumber() | BlockLegacyMetadata::WOOD_FLAG_STRIPPED); + }); } public static function getLeavesIdentifier(TreeType $treeType) : BID{ return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES, ItemIds::LEAVES, 0), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES, ItemIds::LEAVES, 1), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES, ItemIds::LEAVES, 2), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES, ItemIds::LEAVES, 3), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES, ItemIds::LEAVES2, 0), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES, ItemIds::LEAVES2, 1), + TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES), + TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES), + TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES), + TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES), + TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES), + TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES), default => throw new AssumptionFailedError("All tree types should be covered") }; } @@ -128,7 +126,7 @@ final class BlockLegacyIdHelper{ TreeType::ACACIA()->id() => Ids::ACACIA_SAPLING, TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, default => throw new AssumptionFailedError("All tree types should be covered") - }, ItemIds::SAPLING, $treeType->getMagicNumber()); + }); } /** @@ -139,38 +137,38 @@ final class BlockLegacyIdHelper{ switch($treeType->id()){ case TreeType::OAK()->id(): return [ - new BID(Ids::OAK_SIGN, ItemIds::SIGN, 0, TileSign::class), - new BID(Ids::OAK_WALL_SIGN, ItemIds::SIGN, 0, TileSign::class), + new BID(Ids::OAK_SIGN, TileSign::class), + new BID(Ids::OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::OAK_SIGN() ]; case TreeType::SPRUCE()->id(): return [ - new BID(Ids::SPRUCE_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class), - new BID(Ids::SPRUCE_WALL_SIGN, ItemIds::SPRUCE_SIGN, 0, TileSign::class), + new BID(Ids::SPRUCE_SIGN, TileSign::class), + new BID(Ids::SPRUCE_WALL_SIGN, TileSign::class), fn() => VanillaItems::SPRUCE_SIGN() ]; case TreeType::BIRCH()->id(): return [ - new BID(Ids::BIRCH_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class), - new BID(Ids::BIRCH_WALL_SIGN, ItemIds::BIRCH_SIGN, 0, TileSign::class), + new BID(Ids::BIRCH_SIGN, TileSign::class), + new BID(Ids::BIRCH_WALL_SIGN, TileSign::class), fn() => VanillaItems::BIRCH_SIGN() ]; case TreeType::JUNGLE()->id(): return [ - new BID(Ids::JUNGLE_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class), - new BID(Ids::JUNGLE_WALL_SIGN, ItemIds::JUNGLE_SIGN, 0, TileSign::class), + new BID(Ids::JUNGLE_SIGN, TileSign::class), + new BID(Ids::JUNGLE_WALL_SIGN, TileSign::class), fn() => VanillaItems::JUNGLE_SIGN() ]; case TreeType::ACACIA()->id(): return [ - new BID(Ids::ACACIA_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class), - new BID(Ids::ACACIA_WALL_SIGN, ItemIds::ACACIA_SIGN, 0, TileSign::class), + new BID(Ids::ACACIA_SIGN, TileSign::class), + new BID(Ids::ACACIA_WALL_SIGN, TileSign::class), fn() => VanillaItems::ACACIA_SIGN() ]; case TreeType::DARK_OAK()->id(): return [ - new BID(Ids::DARK_OAK_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class), - new BID(Ids::DARK_OAK_WALL_SIGN, ItemIds::DARKOAK_SIGN, 0, TileSign::class), + new BID(Ids::DARK_OAK_SIGN, TileSign::class), + new BID(Ids::DARK_OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::DARK_OAK_SIGN() ]; } @@ -180,17 +178,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenTrapdoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_TRAPDOOR, ItemIds::WOODEN_TRAPDOOR, 0); + return new BID(Ids::OAK_TRAPDOOR); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_TRAPDOOR, ItemIds::SPRUCE_TRAPDOOR, 0); + return new BID(Ids::SPRUCE_TRAPDOOR); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_TRAPDOOR, ItemIds::BIRCH_TRAPDOOR, 0); + return new BID(Ids::BIRCH_TRAPDOOR); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_TRAPDOOR, ItemIds::JUNGLE_TRAPDOOR, 0); + return new BID(Ids::JUNGLE_TRAPDOOR); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_TRAPDOOR, ItemIds::ACACIA_TRAPDOOR, 0); + return new BID(Ids::ACACIA_TRAPDOOR); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_TRAPDOOR, ItemIds::DARK_OAK_TRAPDOOR, 0); + return new BID(Ids::DARK_OAK_TRAPDOOR); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -198,17 +196,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenButtonIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_BUTTON, ItemIds::WOODEN_BUTTON, 0); + return new BID(Ids::OAK_BUTTON); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_BUTTON, ItemIds::SPRUCE_BUTTON, 0); + return new BID(Ids::SPRUCE_BUTTON); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_BUTTON, ItemIds::BIRCH_BUTTON, 0); + return new BID(Ids::BIRCH_BUTTON); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_BUTTON, ItemIds::JUNGLE_BUTTON, 0); + return new BID(Ids::JUNGLE_BUTTON); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_BUTTON, ItemIds::ACACIA_BUTTON, 0); + return new BID(Ids::ACACIA_BUTTON); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_BUTTON, ItemIds::DARK_OAK_BUTTON, 0); + return new BID(Ids::DARK_OAK_BUTTON); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -216,17 +214,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenPressurePlateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_PRESSURE_PLATE, ItemIds::WOODEN_PRESSURE_PLATE, 0); + return new BID(Ids::OAK_PRESSURE_PLATE); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_PRESSURE_PLATE, ItemIds::SPRUCE_PRESSURE_PLATE, 0); + return new BID(Ids::SPRUCE_PRESSURE_PLATE); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_PRESSURE_PLATE, ItemIds::BIRCH_PRESSURE_PLATE, 0); + return new BID(Ids::BIRCH_PRESSURE_PLATE); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_PRESSURE_PLATE, ItemIds::JUNGLE_PRESSURE_PLATE, 0); + return new BID(Ids::JUNGLE_PRESSURE_PLATE); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_PRESSURE_PLATE, ItemIds::ACACIA_PRESSURE_PLATE, 0); + return new BID(Ids::ACACIA_PRESSURE_PLATE); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_PRESSURE_PLATE, ItemIds::DARK_OAK_PRESSURE_PLATE, 0); + return new BID(Ids::DARK_OAK_PRESSURE_PLATE); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -234,17 +232,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenDoorIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_DOOR, ItemIds::OAK_DOOR, 0); + return new BID(Ids::OAK_DOOR); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_DOOR, ItemIds::SPRUCE_DOOR, 0); + return new BID(Ids::SPRUCE_DOOR); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_DOOR, ItemIds::BIRCH_DOOR, 0); + return new BID(Ids::BIRCH_DOOR); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_DOOR, ItemIds::JUNGLE_DOOR, 0); + return new BID(Ids::JUNGLE_DOOR); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_DOOR, ItemIds::ACACIA_DOOR, 0); + return new BID(Ids::ACACIA_DOOR); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_DOOR, ItemIds::DARK_OAK_DOOR, 0); + return new BID(Ids::DARK_OAK_DOOR); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -252,17 +250,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenFenceGateIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_FENCE_GATE, ItemIds::OAK_FENCE_GATE, 0); + return new BID(Ids::OAK_FENCE_GATE); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_FENCE_GATE, ItemIds::SPRUCE_FENCE_GATE, 0); + return new BID(Ids::SPRUCE_FENCE_GATE); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_FENCE_GATE, ItemIds::BIRCH_FENCE_GATE, 0); + return new BID(Ids::BIRCH_FENCE_GATE); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_FENCE_GATE, ItemIds::JUNGLE_FENCE_GATE, 0); + return new BID(Ids::JUNGLE_FENCE_GATE); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_FENCE_GATE, ItemIds::ACACIA_FENCE_GATE, 0); + return new BID(Ids::ACACIA_FENCE_GATE); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_FENCE_GATE, ItemIds::DARK_OAK_FENCE_GATE, 0); + return new BID(Ids::DARK_OAK_FENCE_GATE); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -270,17 +268,17 @@ final class BlockLegacyIdHelper{ public static function getWoodenStairsIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::OAK_STAIRS, ItemIds::OAK_STAIRS, 0); + return new BID(Ids::OAK_STAIRS); case TreeType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_STAIRS, ItemIds::SPRUCE_STAIRS, 0); + return new BID(Ids::SPRUCE_STAIRS); case TreeType::BIRCH()->id(): - return new BID(Ids::BIRCH_STAIRS, ItemIds::BIRCH_STAIRS, 0); + return new BID(Ids::BIRCH_STAIRS); case TreeType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_STAIRS, ItemIds::JUNGLE_STAIRS, 0); + return new BID(Ids::JUNGLE_STAIRS); case TreeType::ACACIA()->id(): - return new BID(Ids::ACACIA_STAIRS, ItemIds::ACACIA_STAIRS, 0); + return new BID(Ids::ACACIA_STAIRS); case TreeType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_STAIRS, ItemIds::DARK_OAK_STAIRS, 0); + return new BID(Ids::DARK_OAK_STAIRS); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -288,17 +286,17 @@ final class BlockLegacyIdHelper{ public static function getStrippedLogIdentifier(TreeType $treeType) : BlockIdentifier{ switch($treeType->id()){ case TreeType::OAK()->id(): - return new BID(Ids::STRIPPED_OAK_LOG, ItemIds::STRIPPED_OAK_LOG, 0); + return new BID(Ids::STRIPPED_OAK_LOG); case TreeType::SPRUCE()->id(): - return new BID(Ids::STRIPPED_SPRUCE_LOG, ItemIds::STRIPPED_SPRUCE_LOG, 0); + return new BID(Ids::STRIPPED_SPRUCE_LOG); case TreeType::BIRCH()->id(): - return new BID(Ids::STRIPPED_BIRCH_LOG, ItemIds::STRIPPED_BIRCH_LOG, 0); + return new BID(Ids::STRIPPED_BIRCH_LOG); case TreeType::JUNGLE()->id(): - return new BID(Ids::STRIPPED_JUNGLE_LOG, ItemIds::STRIPPED_JUNGLE_LOG, 0); + return new BID(Ids::STRIPPED_JUNGLE_LOG); case TreeType::ACACIA()->id(): - return new BID(Ids::STRIPPED_ACACIA_LOG, ItemIds::STRIPPED_ACACIA_LOG, 0); + return new BID(Ids::STRIPPED_ACACIA_LOG); case TreeType::DARK_OAK()->id(): - return new BID(Ids::STRIPPED_DARK_OAK_LOG, ItemIds::STRIPPED_DARK_OAK_LOG, 0); + return new BID(Ids::STRIPPED_DARK_OAK_LOG); } throw new AssumptionFailedError("Switch should cover all wood types"); } @@ -306,51 +304,38 @@ final class BlockLegacyIdHelper{ public static function getGlazedTerracottaIdentifier(DyeColor $color) : BlockIdentifier{ switch($color->id()){ case DyeColor::WHITE()->id(): - return new BID(Ids::WHITE_GLAZED_TERRACOTTA, ItemIds::WHITE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::WHITE_GLAZED_TERRACOTTA); case DyeColor::ORANGE()->id(): - return new BID(Ids::ORANGE_GLAZED_TERRACOTTA, ItemIds::ORANGE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::ORANGE_GLAZED_TERRACOTTA); case DyeColor::MAGENTA()->id(): - return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA, ItemIds::MAGENTA_GLAZED_TERRACOTTA, 0); + return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA); case DyeColor::LIGHT_BLUE()->id(): - return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, ItemIds::LIGHT_BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA); case DyeColor::YELLOW()->id(): - return new BID(Ids::YELLOW_GLAZED_TERRACOTTA, ItemIds::YELLOW_GLAZED_TERRACOTTA, 0); + return new BID(Ids::YELLOW_GLAZED_TERRACOTTA); case DyeColor::LIME()->id(): - return new BID(Ids::LIME_GLAZED_TERRACOTTA, ItemIds::LIME_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIME_GLAZED_TERRACOTTA); case DyeColor::PINK()->id(): - return new BID(Ids::PINK_GLAZED_TERRACOTTA, ItemIds::PINK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PINK_GLAZED_TERRACOTTA); case DyeColor::GRAY()->id(): - return new BID(Ids::GRAY_GLAZED_TERRACOTTA, ItemIds::GRAY_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GRAY_GLAZED_TERRACOTTA); case DyeColor::LIGHT_GRAY()->id(): - return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, ItemIds::SILVER_GLAZED_TERRACOTTA, 0); + return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA); case DyeColor::CYAN()->id(): - return new BID(Ids::CYAN_GLAZED_TERRACOTTA, ItemIds::CYAN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::CYAN_GLAZED_TERRACOTTA); case DyeColor::PURPLE()->id(): - return new BID(Ids::PURPLE_GLAZED_TERRACOTTA, ItemIds::PURPLE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::PURPLE_GLAZED_TERRACOTTA); case DyeColor::BLUE()->id(): - return new BID(Ids::BLUE_GLAZED_TERRACOTTA, ItemIds::BLUE_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLUE_GLAZED_TERRACOTTA); case DyeColor::BROWN()->id(): - return new BID(Ids::BROWN_GLAZED_TERRACOTTA, ItemIds::BROWN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BROWN_GLAZED_TERRACOTTA); case DyeColor::GREEN()->id(): - return new BID(Ids::GREEN_GLAZED_TERRACOTTA, ItemIds::GREEN_GLAZED_TERRACOTTA, 0); + return new BID(Ids::GREEN_GLAZED_TERRACOTTA); case DyeColor::RED()->id(): - return new BID(Ids::RED_GLAZED_TERRACOTTA, ItemIds::RED_GLAZED_TERRACOTTA, 0); + return new BID(Ids::RED_GLAZED_TERRACOTTA); case DyeColor::BLACK()->id(): - return new BID(Ids::BLACK_GLAZED_TERRACOTTA, ItemIds::BLACK_GLAZED_TERRACOTTA, 0); + return new BID(Ids::BLACK_GLAZED_TERRACOTTA); } throw new AssumptionFailedError("Switch should cover all colours"); } - - public static function getStoneSlabIdentifier(int $blockTypeId, int $stoneSlabId, int $meta) : BID{ - $itemId = [ - 1 => ItemIds::STONE_SLAB, - 2 => ItemIds::STONE_SLAB2, - 3 => ItemIds::STONE_SLAB3, - 4 => ItemIds::STONE_SLAB4 - ][$stoneSlabId] ?? null; - if($itemId === null){ - throw new \InvalidArgumentException("Stone slab type should be 1, 2, 3 or 4"); - } - return new BID($blockTypeId, $itemId, $meta); - } } diff --git a/src/block/Coral.php b/src/block/Coral.php index 7cb301b2cf..cde1433840 100644 --- a/src/block/Coral.php +++ b/src/block/Coral.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -32,10 +31,6 @@ use pocketmine\world\BlockTransaction; final class Coral extends BaseCoral{ - protected function writeStateToItemMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); - } - public function readStateFromWorld() : void{ //TODO: this hack ensures correct state of coral plants, because they don't retain their dead flag in metadata $world = $this->position->getWorld(); diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index 336b171a9a..0ab8317808 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -25,8 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; -use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use function mt_rand; @@ -38,10 +36,6 @@ final class CoralBlock extends Opaque{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToItemMeta() : int{ - return ($this->dead ? BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD : 0) | CoralTypeIdMap::getInstance()->toId($this->coralType); - } - public function onNearbyBlockChange() : void{ if(!$this->dead){ $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(40, 200)); diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 1a0fcaaeb7..e8ae438512 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Hoe; @@ -36,10 +35,6 @@ use pocketmine\world\sound\ItemUseOnBlockSound; class Dirt extends Opaque{ protected bool $coarse = false; - protected function writeStateToItemMeta() : int{ - return $this->coarse ? BlockLegacyMetadata::DIRT_FLAG_COARSE : 0; - } - public function getRequiredTypeDataBits() : int{ return 1; } protected function decodeType(BlockDataReader $r) : void{ diff --git a/src/block/Sponge.php b/src/block/Sponge.php index dc5f21d0ac..ed25d8fb60 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,17 +23,12 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; class Sponge extends Opaque{ protected bool $wet = false; - protected function writeStateToItemMeta() : int{ - return $this->wet ? BlockLegacyMetadata::SPONGE_FLAG_WET : 0; - } - public function getRequiredTypeDataBits() : int{ return 1; } protected function decodeType(BlockDataReader $r) : void{ diff --git a/src/block/TNT.php b/src/block/TNT.php index 50803bbc9b..a62f59e3c9 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; @@ -46,10 +45,6 @@ class TNT extends Opaque{ protected bool $unstable = false; //TODO: Usage unclear, seems to be a weird hack in vanilla protected bool $worksUnderwater = false; - protected function writeStateToItemMeta() : int{ - return $this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0; - } - public function getRequiredTypeDataBits() : int{ return 1; } protected function decodeType(BlockDataReader $r) : void{ diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 81a2af2596..0bf1477782 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -23,12 +23,27 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; class UnknownBlock extends Transparent{ - public function __construct(BlockIdentifier $idInfo, BlockBreakInfo $breakInfo){ + private int $stateData; + + public function __construct(BlockIdentifier $idInfo, BlockBreakInfo $breakInfo, int $stateData){ parent::__construct($idInfo, "Unknown", $breakInfo); + $this->stateData = $stateData; + } + + protected function decodeType(BlockDataReader $r) : void{ + //use type instead of state, so we don't lose any information like colour + //this might be an improperly registered plugin block + $this->stateData = $r->readInt(Block::INTERNAL_STATE_DATA_BITS); + } + + protected function encodeType(BlockDataWriter $w) : void{ + $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); } public function canBePlaced() : bool{ diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 04d8996fd1..0b4cb1d6b4 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataReaderHelper; use pocketmine\data\runtime\block\BlockDataWriter; @@ -34,13 +33,6 @@ trait ColoredTrait{ /** @var DyeColor */ private $color; - /** - * @see Block::writeStateToItemMeta() - */ - protected function writeStateToItemMeta() : int{ - return DyeColorIdMap::getInstance()->toId($this->color); - } - public function getRequiredTypeDataBits() : int{ return 4; } /** @see Block::decodeType() */ diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 45e9641a06..1e420beff3 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use PHPUnit\Framework\TestCase; -use pocketmine\item\ItemIds; use function asort; use function file_get_contents; use function is_array; @@ -44,7 +43,7 @@ class BlockTest extends TestCase{ * Test registering a block which would overwrite another block, without forcing it */ public function testAccidentalOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, ItemIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", BlockBreakInfo::instant()); $this->expectException(\InvalidArgumentException::class); $this->blockFactory->register($block); } @@ -53,7 +52,7 @@ class BlockTest extends TestCase{ * Test registering a block deliberately overwriting another block works as expected */ public function testDeliberateOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, ItemIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", BlockBreakInfo::instant()); $this->blockFactory->register($block, true); self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromFullBlock($block->getStateId())); } @@ -64,7 +63,7 @@ class BlockTest extends TestCase{ public function testRegisterNewBlock() : void{ for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i, $i + 10000, 0), "Strange New Block", BlockBreakInfo::instant()); + $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", BlockBreakInfo::instant()); $this->blockFactory->register($b); self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromFullBlock($b->getStateId())); return; @@ -79,7 +78,7 @@ class BlockTest extends TestCase{ */ public function testRegisterIdTooSmall() : void{ self::expectException(\InvalidArgumentException::class); - $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1, -1, 0), "Out Of Bounds Block", BlockBreakInfo::instant())); + $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1), "Out Of Bounds Block", BlockBreakInfo::instant())); } /** From 7430e1fbc0fc6ca2b04d0799cf408ff0a7a70973 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 17:51:48 +0100 Subject: [PATCH 0214/1858] Coral: remove obsolete workaround --- src/block/Coral.php | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/block/Coral.php b/src/block/Coral.php index cde1433840..b621a3ab0d 100644 --- a/src/block/Coral.php +++ b/src/block/Coral.php @@ -31,18 +31,6 @@ use pocketmine\world\BlockTransaction; final class Coral extends BaseCoral{ - public function readStateFromWorld() : void{ - //TODO: this hack ensures correct state of coral plants, because they don't retain their dead flag in metadata - $world = $this->position->getWorld(); - $this->dead = true; - foreach($this->position->sides() as $vector3){ - if($world->getBlock($vector3) instanceof Water){ - $this->dead = false; - break; - } - } - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if(!$this->canBeSupportedBy($tx->fetchBlock($blockReplace->getPosition()->down()))){ return false; From 248eacd042606fb5572886621717b3e72a6906a2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 18:30:23 +0100 Subject: [PATCH 0215/1858] GlazedTerracotta: make colour dynamic, like all other coloured blocks made possible by stripping out legacy mess --- src/block/BlockFactory.php | 9 +---- src/block/BlockLegacyIdHelper.php | 39 ------------------- src/block/BlockTypeIds.php | 33 ++++++++-------- src/block/GlazedTerracotta.php | 8 ++++ src/block/VanillaBlocks.php | 34 +--------------- .../BlockObjectToBlockStateSerializer.php | 39 +++++++++++-------- .../convert/BlockStateDeserializerHelper.php | 7 +++- .../convert/BlockStateSerializerHelper.php | 4 -- .../BlockStateToBlockObjectDeserializer.php | 33 ++++++++-------- src/item/StringToItemParser.php | 18 +-------- .../block_factory_consistency_check.json | 2 +- 11 files changed, 74 insertions(+), 152 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 44072f5ded..7f3f406ee2 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -50,7 +50,6 @@ use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; 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\TreeType; use pocketmine\item\Item; @@ -496,13 +495,7 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "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->register(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); - } + $this->register(new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 2d93b20d58..661e849942 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\TreeType; use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; @@ -300,42 +299,4 @@ final class BlockLegacyIdHelper{ } throw new AssumptionFailedError("Switch should cover all wood types"); } - - public static function getGlazedTerracottaIdentifier(DyeColor $color) : BlockIdentifier{ - switch($color->id()){ - case DyeColor::WHITE()->id(): - return new BID(Ids::WHITE_GLAZED_TERRACOTTA); - case DyeColor::ORANGE()->id(): - return new BID(Ids::ORANGE_GLAZED_TERRACOTTA); - case DyeColor::MAGENTA()->id(): - return new BID(Ids::MAGENTA_GLAZED_TERRACOTTA); - case DyeColor::LIGHT_BLUE()->id(): - return new BID(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA); - case DyeColor::YELLOW()->id(): - return new BID(Ids::YELLOW_GLAZED_TERRACOTTA); - case DyeColor::LIME()->id(): - return new BID(Ids::LIME_GLAZED_TERRACOTTA); - case DyeColor::PINK()->id(): - return new BID(Ids::PINK_GLAZED_TERRACOTTA); - case DyeColor::GRAY()->id(): - return new BID(Ids::GRAY_GLAZED_TERRACOTTA); - case DyeColor::LIGHT_GRAY()->id(): - return new BID(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA); - case DyeColor::CYAN()->id(): - return new BID(Ids::CYAN_GLAZED_TERRACOTTA); - case DyeColor::PURPLE()->id(): - return new BID(Ids::PURPLE_GLAZED_TERRACOTTA); - case DyeColor::BLUE()->id(): - return new BID(Ids::BLUE_GLAZED_TERRACOTTA); - case DyeColor::BROWN()->id(): - return new BID(Ids::BROWN_GLAZED_TERRACOTTA); - case DyeColor::GREEN()->id(): - return new BID(Ids::GREEN_GLAZED_TERRACOTTA); - case DyeColor::RED()->id(): - return new BID(Ids::RED_GLAZED_TERRACOTTA); - case DyeColor::BLACK()->id(): - return new BID(Ids::BLACK_GLAZED_TERRACOTTA); - } - throw new AssumptionFailedError("Switch should cover all colours"); - } } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index ba211f59ed..2fcfdb91ff 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -87,9 +87,9 @@ final class BlockTypeIds{ public const BIRCH_TRAPDOOR = 10047; public const BIRCH_WALL_SIGN = 10048; public const BIRCH_WOOD = 10049; - public const BLACK_GLAZED_TERRACOTTA = 10050; + public const BLAST_FURNACE = 10051; - public const BLUE_GLAZED_TERRACOTTA = 10052; + public const BLUE_ICE = 10053; public const BLUE_ORCHID = 10054; public const BLUE_TORCH = 10055; @@ -100,7 +100,7 @@ final class BlockTypeIds{ public const BRICK_STAIRS = 10060; public const BRICK_WALL = 10061; public const BRICKS = 10062; - public const BROWN_GLAZED_TERRACOTTA = 10063; + public const BROWN_MUSHROOM = 10064; public const BROWN_MUSHROOM_BLOCK = 10065; public const CACTUS = 10066; @@ -136,7 +136,7 @@ final class BlockTypeIds{ public const CUT_RED_SANDSTONE_SLAB = 10096; public const CUT_SANDSTONE = 10097; public const CUT_SANDSTONE_SLAB = 10098; - public const CYAN_GLAZED_TERRACOTTA = 10099; + public const DANDELION = 10100; public const DARK_OAK_BUTTON = 10101; public const DARK_OAK_DOOR = 10102; @@ -322,8 +322,7 @@ final class BlockTypeIds{ public const GRASS = 10282; public const GRASS_PATH = 10283; public const GRAVEL = 10284; - public const GRAY_GLAZED_TERRACOTTA = 10285; - public const GREEN_GLAZED_TERRACOTTA = 10286; + public const GREEN_TORCH = 10287; public const HARDENED_CLAY = 10288; public const HARDENED_GLASS = 10289; @@ -372,15 +371,14 @@ final class BlockTypeIds{ public const LECTERN = 10332; public const LEGACY_STONECUTTER = 10333; public const LEVER = 10334; - public const LIGHT_BLUE_GLAZED_TERRACOTTA = 10335; - public const LIGHT_GRAY_GLAZED_TERRACOTTA = 10336; + public const LILAC = 10337; public const LILY_OF_THE_VALLEY = 10338; public const LILY_PAD = 10339; - public const LIME_GLAZED_TERRACOTTA = 10340; + public const LIT_PUMPKIN = 10341; public const LOOM = 10342; - public const MAGENTA_GLAZED_TERRACOTTA = 10343; + public const MAGMA = 10344; public const MATERIAL_REDUCER = 10345; public const MELON = 10346; @@ -425,12 +423,12 @@ final class BlockTypeIds{ public const OAK_WALL_SIGN = 10385; public const OAK_WOOD = 10386; public const OBSIDIAN = 10387; - public const ORANGE_GLAZED_TERRACOTTA = 10388; + public const ORANGE_TULIP = 10389; public const OXEYE_DAISY = 10390; public const PACKED_ICE = 10391; public const PEONY = 10392; - public const PINK_GLAZED_TERRACOTTA = 10393; + public const PINK_TULIP = 10394; public const PODZOL = 10395; public const POLISHED_ANDESITE = 10396; @@ -454,7 +452,7 @@ final class BlockTypeIds{ public const PRISMARINE_WALL = 10414; public const PUMPKIN = 10415; public const PUMPKIN_STEM = 10416; - public const PURPLE_GLAZED_TERRACOTTA = 10417; + public const PURPLE_TORCH = 10418; public const PURPUR = 10419; public const PURPUR_PILLAR = 10420; @@ -465,7 +463,7 @@ final class BlockTypeIds{ public const QUARTZ_SLAB = 10425; public const QUARTZ_STAIRS = 10426; public const RAIL = 10427; - public const RED_GLAZED_TERRACOTTA = 10428; + public const RED_MUSHROOM = 10429; public const RED_MUSHROOM_BLOCK = 10430; public const RED_NETHER_BRICK_SLAB = 10431; @@ -572,10 +570,11 @@ final class BlockTypeIds{ public const WEIGHTED_PRESSURE_PLATE_HEAVY = 10532; public const WEIGHTED_PRESSURE_PLATE_LIGHT = 10533; public const WHEAT = 10534; - public const WHITE_GLAZED_TERRACOTTA = 10535; + public const WHITE_TULIP = 10536; public const WOOL = 10537; - public const YELLOW_GLAZED_TERRACOTTA = 10538; - public const FIRST_UNUSED_BLOCK_ID = 10539; + public const GLAZED_TERRACOTTA = 10539; + + public const FIRST_UNUSED_BLOCK_ID = 10540; } diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index b782d5dbb1..687c19a16c 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -23,10 +23,18 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\ColoredTrait; +use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; class GlazedTerracotta extends Opaque{ + use ColoredTrait; use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; + + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + $this->color = DyeColor::BLACK(); + parent::__construct($idInfo, $name, $breakInfo); + } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 070068ea10..11654965a7 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -82,9 +82,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static WoodenTrapdoor BIRCH_TRAPDOOR() * @method static WallSign BIRCH_WALL_SIGN() * @method static Wood BIRCH_WOOD() - * @method static GlazedTerracotta BLACK_GLAZED_TERRACOTTA() * @method static Furnace BLAST_FURNACE() - * @method static GlazedTerracotta BLUE_GLAZED_TERRACOTTA() * @method static BlueIce BLUE_ICE() * @method static Flower BLUE_ORCHID() * @method static Torch BLUE_TORCH() @@ -95,7 +93,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab BRICK_SLAB() * @method static Stair BRICK_STAIRS() * @method static Wall BRICK_WALL() - * @method static GlazedTerracotta BROWN_GLAZED_TERRACOTTA() * @method static BrownMushroom BROWN_MUSHROOM() * @method static BrownMushroomBlock BROWN_MUSHROOM_BLOCK() * @method static Cactus CACTUS() @@ -131,7 +128,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab CUT_RED_SANDSTONE_SLAB() * @method static Opaque CUT_SANDSTONE() * @method static Slab CUT_SANDSTONE_SLAB() - * @method static GlazedTerracotta CYAN_GLAZED_TERRACOTTA() * @method static Flower DANDELION() * @method static WoodenButton DARK_OAK_BUTTON() * @method static WoodenDoor DARK_OAK_DOOR() @@ -306,6 +302,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Furnace FURNACE() * @method static Glass GLASS() * @method static GlassPane GLASS_PANE() + * @method static GlazedTerracotta GLAZED_TERRACOTTA() * @method static GlowingObsidian GLOWING_OBSIDIAN() * @method static Glowstone GLOWSTONE() * @method static Opaque GOLD() @@ -317,8 +314,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Grass GRASS() * @method static GrassPath GRASS_PATH() * @method static Gravel GRAVEL() - * @method static GlazedTerracotta GRAY_GLAZED_TERRACOTTA() - * @method static GlazedTerracotta GREEN_GLAZED_TERRACOTTA() * @method static Torch GREEN_TORCH() * @method static HardenedClay HARDENED_CLAY() * @method static HardenedGlass HARDENED_GLASS() @@ -367,15 +362,11 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Lectern LECTERN() * @method static Opaque LEGACY_STONECUTTER() * @method static Lever LEVER() - * @method static GlazedTerracotta LIGHT_BLUE_GLAZED_TERRACOTTA() - * @method static GlazedTerracotta LIGHT_GRAY_GLAZED_TERRACOTTA() * @method static DoublePlant LILAC() * @method static Flower LILY_OF_THE_VALLEY() * @method static WaterLily LILY_PAD() - * @method static GlazedTerracotta LIME_GLAZED_TERRACOTTA() * @method static LitPumpkin LIT_PUMPKIN() * @method static Loom LOOM() - * @method static GlazedTerracotta MAGENTA_GLAZED_TERRACOTTA() * @method static Magma MAGMA() * @method static ChemistryTable MATERIAL_REDUCER() * @method static Melon MELON() @@ -420,12 +411,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static WallSign OAK_WALL_SIGN() * @method static Wood OAK_WOOD() * @method static Opaque OBSIDIAN() - * @method static GlazedTerracotta ORANGE_GLAZED_TERRACOTTA() * @method static Flower ORANGE_TULIP() * @method static Flower OXEYE_DAISY() * @method static PackedIce PACKED_ICE() * @method static DoublePlant PEONY() - * @method static GlazedTerracotta PINK_GLAZED_TERRACOTTA() * @method static Flower PINK_TULIP() * @method static Podzol PODZOL() * @method static Opaque POLISHED_ANDESITE() @@ -449,7 +438,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Wall PRISMARINE_WALL() * @method static Pumpkin PUMPKIN() * @method static PumpkinStem PUMPKIN_STEM() - * @method static GlazedTerracotta PURPLE_GLAZED_TERRACOTTA() * @method static Torch PURPLE_TORCH() * @method static Opaque PURPUR() * @method static SimplePillar PURPUR_PILLAR() @@ -467,7 +455,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static RedstoneRepeater REDSTONE_REPEATER() * @method static RedstoneTorch REDSTONE_TORCH() * @method static RedstoneWire REDSTONE_WIRE() - * @method static GlazedTerracotta RED_GLAZED_TERRACOTTA() * @method static RedMushroom RED_MUSHROOM() * @method static RedMushroomBlock RED_MUSHROOM_BLOCK() * @method static Opaque RED_NETHER_BRICKS() @@ -567,10 +554,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() * @method static Wheat WHEAT() - * @method static GlazedTerracotta WHITE_GLAZED_TERRACOTTA() * @method static Flower WHITE_TULIP() * @method static Wool WOOL() - * @method static GlazedTerracotta YELLOW_GLAZED_TERRACOTTA() */ final class VanillaBlocks{ use CloningRegistryTrait; @@ -645,9 +630,7 @@ final class VanillaBlocks{ self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 0)); self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0)); - self::register("black_glazed_terracotta", $factory->get(Ids::BLACK_GLAZED_TERRACOTTA, 0)); self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 0)); - self::register("blue_glazed_terracotta", $factory->get(Ids::BLUE_GLAZED_TERRACOTTA, 0)); self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0)); self::register("blue_orchid", $factory->get(Ids::BLUE_ORCHID, 0)); self::register("blue_torch", $factory->get(Ids::BLUE_TORCH, 1)); @@ -658,7 +641,6 @@ final class VanillaBlocks{ self::register("brick_stairs", $factory->get(Ids::BRICK_STAIRS, 0)); 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, 0)); self::register("brown_mushroom", $factory->get(Ids::BROWN_MUSHROOM, 0)); self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10)); self::register("cactus", $factory->get(Ids::CACTUS, 0)); @@ -694,7 +676,6 @@ final class VanillaBlocks{ 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, 0)); 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, 0)); @@ -869,6 +850,7 @@ final class VanillaBlocks{ 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("glazed_terracotta", $factory->get(Ids::GLAZED_TERRACOTTA, 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, 0)); @@ -880,8 +862,6 @@ final class VanillaBlocks{ 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, 0)); - self::register("green_glazed_terracotta", $factory->get(Ids::GREEN_GLAZED_TERRACOTTA, 0)); 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::HARDENED_GLASS, 0)); @@ -930,15 +910,11 @@ final class VanillaBlocks{ self::register("lectern", $factory->get(Ids::LECTERN, 0)); self::register("legacy_stonecutter", $factory->get(Ids::LEGACY_STONECUTTER, 0)); self::register("lever", $factory->get(Ids::LEVER, 5)); - self::register("light_blue_glazed_terracotta", $factory->get(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, 0)); - self::register("light_gray_glazed_terracotta", $factory->get(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, 0)); 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, 0)); self::register("lit_pumpkin", $factory->get(Ids::LIT_PUMPKIN, 0)); self::register("loom", $factory->get(Ids::LOOM, 0)); - self::register("magenta_glazed_terracotta", $factory->get(Ids::MAGENTA_GLAZED_TERRACOTTA, 0)); self::register("magma", $factory->get(Ids::MAGMA, 0)); self::register("material_reducer", $factory->get(Ids::MATERIAL_REDUCER, 0)); self::register("melon", $factory->get(Ids::MELON, 0)); @@ -983,12 +959,10 @@ final class VanillaBlocks{ self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 0)); 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, 0)); 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::PEONY, 0)); - self::register("pink_glazed_terracotta", $factory->get(Ids::PINK_GLAZED_TERRACOTTA, 0)); 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::POLISHED_ANDESITE, 0)); @@ -1012,7 +986,6 @@ final class VanillaBlocks{ 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, 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, 2)); @@ -1023,7 +996,6 @@ final class VanillaBlocks{ self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); self::register("rail", $factory->get(Ids::RAIL, 0)); - self::register("red_glazed_terracotta", $factory->get(Ids::RED_GLAZED_TERRACOTTA, 0)); self::register("red_mushroom", $factory->get(Ids::RED_MUSHROOM, 0)); self::register("red_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 10)); self::register("red_nether_brick_slab", $factory->get(Ids::RED_NETHER_BRICK_SLAB, 0)); @@ -1130,9 +1102,7 @@ final class VanillaBlocks{ 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, 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, 0)); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 1ed913d2e9..04907a553f 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -120,6 +120,7 @@ use pocketmine\block\TripwireHook; use pocketmine\block\UnderwaterTorch; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Vine; @@ -329,9 +330,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::BLACK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLACK_GLAZED_TERRACOTTA))); $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); - $this->map(Blocks::BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BLUE_GLAZED_TERRACOTTA))); $this->map(Blocks::BLUE_ICE(), fn() => new Writer(Ids::BLUE_ICE)); $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); @@ -351,7 +350,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); $this->map(Blocks::BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::BRICK_STAIRS))); $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); - $this->map(Blocks::BROWN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::BROWN_GLAZED_TERRACOTTA))); $this->map(Blocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ @@ -428,7 +426,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); - $this->map(Blocks::CYAN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::CYAN_GLAZED_TERRACOTTA))); $this->map(Blocks::DANDELION(), fn() => new Writer(Ids::YELLOW_FLOWER)); $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); @@ -642,6 +639,28 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); $this->map(Blocks::GLASS(), fn() => new Writer(Ids::GLASS)); $this->map(Blocks::GLASS_PANE(), fn() => new Writer(Ids::GLASS_PANE)); + $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ + return Writer::create(match ($color = $block->getColor()) { + DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, + DyeColor::BLUE() => Ids::BLUE_GLAZED_TERRACOTTA, + DyeColor::BROWN() => Ids::BROWN_GLAZED_TERRACOTTA, + DyeColor::CYAN() => Ids::CYAN_GLAZED_TERRACOTTA, + DyeColor::GRAY() => Ids::GRAY_GLAZED_TERRACOTTA, + DyeColor::GREEN() => Ids::GREEN_GLAZED_TERRACOTTA, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, + DyeColor::LIGHT_GRAY() => Ids::SILVER_GLAZED_TERRACOTTA, + DyeColor::LIME() => Ids::LIME_GLAZED_TERRACOTTA, + DyeColor::MAGENTA() => Ids::MAGENTA_GLAZED_TERRACOTTA, + DyeColor::ORANGE() => Ids::ORANGE_GLAZED_TERRACOTTA, + DyeColor::PINK() => Ids::PINK_GLAZED_TERRACOTTA, + DyeColor::PURPLE() => Ids::PURPLE_GLAZED_TERRACOTTA, + DyeColor::RED() => Ids::RED_GLAZED_TERRACOTTA, + DyeColor::WHITE() => Ids::WHITE_GLAZED_TERRACOTTA, + DyeColor::YELLOW() => Ids::YELLOW_GLAZED_TERRACOTTA, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + }) + ->writeHorizontalFacing($block->getFacing()); + }); $this->map(Blocks::GLOWING_OBSIDIAN(), fn() => new Writer(Ids::GLOWINGOBSIDIAN)); $this->map(Blocks::GLOWSTONE(), fn() => new Writer(Ids::GLOWSTONE)); $this->map(Blocks::GOLD(), fn() => new Writer(Ids::GOLD_BLOCK)); @@ -653,8 +672,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::GRASS(), fn() => new Writer(Ids::GRASS)); $this->map(Blocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); $this->map(Blocks::GRAVEL(), fn() => new Writer(Ids::GRAVEL)); - $this->map(Blocks::GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GRAY_GLAZED_TERRACOTTA))); - $this->map(Blocks::GREEN_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::GREEN_GLAZED_TERRACOTTA))); $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); $this->map(Blocks::HARDENED_CLAY(), fn() => new Writer(Ids::HARDENED_CLAY)); $this->map(Blocks::HARDENED_GLASS(), fn() => new Writer(Ids::HARD_GLASS)); @@ -748,12 +765,9 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), }); }); - $this->map(Blocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA))); - $this->map(Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::SILVER_GLAZED_TERRACOTTA))); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); $this->map(Blocks::LILY_PAD(), fn() => new Writer(Ids::WATERLILY)); - $this->map(Blocks::LIME_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::LIME_GLAZED_TERRACOTTA))); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); @@ -762,7 +776,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LOOM) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::MAGENTA_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::MAGENTA_GLAZED_TERRACOTTA))); $this->map(Blocks::MAGMA(), fn() => new Writer(Ids::MAGMA)); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::MELON(), fn() => new Writer(Ids::MELON_BLOCK)); @@ -823,12 +836,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->map(Blocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); $this->map(Blocks::OBSIDIAN(), fn() => new Writer(Ids::OBSIDIAN)); - $this->map(Blocks::ORANGE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::ORANGE_GLAZED_TERRACOTTA))); $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); $this->map(Blocks::PACKED_ICE(), fn() => new Writer(Ids::PACKED_ICE)); $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(Blocks::PINK_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PINK_GLAZED_TERRACOTTA))); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); $this->map(Blocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); @@ -861,7 +872,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing(Facing::SOUTH); //no longer used }); $this->map(Blocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); - $this->map(Blocks::PURPLE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::PURPLE_GLAZED_TERRACOTTA))); $this->map(Blocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); $this->map(Blocks::PURPUR(), function() : Writer{ return Writer::create(Ids::PURPUR_BLOCK) @@ -905,7 +915,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::REDSTONE_WIRE) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(Blocks::RED_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::RED_GLAZED_TERRACOTTA))); $this->map(Blocks::RED_MUSHROOM(), fn() => new Writer(Ids::RED_MUSHROOM)); $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); $this->map(Blocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); @@ -1096,12 +1105,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); - $this->map(Blocks::WHITE_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::WHITE_GLAZED_TERRACOTTA))); $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); $this->map(Blocks::WOOL(), function(Wool $block) : Writer{ return Writer::create(Ids::WOOL) ->writeColor($block->getColor()); }); - $this->map(Blocks::YELLOW_GLAZED_TERRACOTTA(), fn(GlazedTerracotta $block) => Helper::encodeGlazedTerracotta($block, new Writer(Ids::YELLOW_GLAZED_TERRACOTTA))); } } diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index cad6bfad89..b662e847cf 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -41,6 +41,7 @@ use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Trapdoor; +use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; @@ -125,8 +126,10 @@ final class BlockStateDeserializerHelper{ } /** @throws BlockStateDeserializeException */ - public static function decodeGlazedTerracotta(GlazedTerracotta $block, BlockStateReader $in) : GlazedTerracotta{ - return $block->setFacing($in->readHorizontalFacing()); + public static function decodeGlazedTerracotta(DyeColor $color, BlockStateReader $in) : GlazedTerracotta{ + return VanillaBlocks::GLAZED_TERRACOTTA() + ->setColor($color) + ->setFacing($in->readHorizontalFacing()); } /** @throws BlockStateDeserializeException */ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index b65abbaae9..5bc021940d 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -31,7 +31,6 @@ use pocketmine\block\DoublePlant; use pocketmine\block\FenceGate; use pocketmine\block\FloorSign; use pocketmine\block\Furnace; -use pocketmine\block\GlazedTerracotta; use pocketmine\block\Leaves; use pocketmine\block\Liquid; use pocketmine\block\Log; @@ -114,9 +113,6 @@ final class BlockStateSerializerHelper{ return BlockStateWriter::create($block->isLit() ? $litId : $unlitId) ->writeHorizontalFacing($block->getFacing()); } - public static function encodeGlazedTerracotta(GlazedTerracotta $block, BlockStateWriter $out) : BlockStateWriter{ - return $out->writeHorizontalFacing($block->getFacing()); - } private static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ return $out diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8002cd31ef..e371e82437 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -28,6 +28,7 @@ use pocketmine\block\Block; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; @@ -147,13 +148,13 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); - $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BLACK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); $this->map(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); @@ -168,7 +169,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); $this->map(Ids::BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::BRICK_STAIRS(), $in)); - $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::BROWN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); $this->map(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); $this->map(Ids::CACTUS, function(Reader $in) : Block{ @@ -256,7 +257,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setCoralType(CoralType::HORN()); }); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); - $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::CYAN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); @@ -515,8 +516,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::GRASS, fn() => Blocks::GRASS()); $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); - $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::GRAY_GLAZED_TERRACOTTA(), $in)); - $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::GREEN_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); + $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ @@ -607,9 +608,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value), }); }); - $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIGHT_BLUE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); - $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIME_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); $this->map(Ids::LIT_BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) @@ -659,7 +660,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::MAGENTA_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); @@ -693,9 +694,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); $this->map(Ids::OAK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::OAK_STAIRS(), $in)); $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); - $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::ORANGE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); - $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::PINK_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); $this->map(Ids::PLANKS, function(Reader $in) : Block{ return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_OAK => Blocks::OAK_PLANKS(), @@ -739,7 +740,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::PUMPKIN(); }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); - $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::PURPLE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PURPLE(), $in)); $this->map(Ids::PURPUR_BLOCK, function(Reader $in) : Block{ $type = $in->readString(StateNames::CHISEL_TYPE); if($type === StringValues::CHISEL_TYPE_LINES){ @@ -793,7 +794,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::FLOWER_TYPE, $type), }; }); - $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::RED_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::RED(), $in)); $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); @@ -870,7 +871,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::DYED_SHULKER_BOX() ->setColor($in->readColor()); }); - $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_GRAY(), $in)); $this->map(Ids::SKULL, function(Reader $in) : Block{ return Blocks::MOB_HEAD() ->setFacing($in->readFacingWithoutDown()); @@ -1052,7 +1053,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->map(Ids::WEB, fn() => Blocks::COBWEB()); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); - $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::WHITE_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); $this->map(Ids::WOOD, function(Reader $in) : Block{ $in->todo(StateNames::PILLAR_AXIS); //TODO: our impl doesn't support axis yet $stripped = $in->readBool(StateNames::STRIPPED_BIT); @@ -1075,7 +1076,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setColor($in->readColor()); }); $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); - $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(Blocks::YELLOW_GLAZED_TERRACOTTA(), $in)); + $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); //$this->map(Ids::ALLOW, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 7e69ebe390..8be5208bd6 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -52,6 +52,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock($prefix("carpet"), fn() => Blocks::CARPET()->setColor($color)); $result->registerBlock($prefix("concrete"), fn() => Blocks::CONCRETE()->setColor($color)); $result->registerBlock($prefix("concrete_powder"), fn() => Blocks::CONCRETE_POWDER()->setColor($color)); + $result->registerBlock($prefix("glazed_terracotta"), fn() => Blocks::GLAZED_TERRACOTTA()->setColor($color)); $result->registerBlock($prefix("stained_clay"), fn() => Blocks::STAINED_CLAY()->setColor($color)); $result->registerBlock($prefix("stained_glass"), fn() => Blocks::STAINED_GLASS()->setColor($color)); $result->registerBlock($prefix("stained_glass_pane"), fn() => Blocks::STAINED_GLASS_PANE()->setColor($color)); @@ -131,9 +132,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("birch_wood", fn() => Blocks::BIRCH_WOOD()); $result->registerBlock("birch_wood_stairs", fn() => Blocks::BIRCH_STAIRS()); $result->registerBlock("birch_wooden_stairs", fn() => Blocks::BIRCH_STAIRS()); - $result->registerBlock("black_glazed_terracotta", fn() => Blocks::BLACK_GLAZED_TERRACOTTA()); $result->registerBlock("blast_furnace", fn() => Blocks::BLAST_FURNACE()); - $result->registerBlock("blue_glazed_terracotta", fn() => Blocks::BLUE_GLAZED_TERRACOTTA()); $result->registerBlock("blue_ice", fn() => Blocks::BLUE_ICE()); $result->registerBlock("blue_orchid", fn() => Blocks::BLUE_ORCHID()); $result->registerBlock("blue_torch", fn() => Blocks::BLUE_TORCH()); @@ -147,7 +146,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("brick_wall", fn() => Blocks::BRICK_WALL()); $result->registerBlock("bricks", fn() => Blocks::BRICKS()); $result->registerBlock("bricks_block", fn() => Blocks::BRICKS()); - $result->registerBlock("brown_glazed_terracotta", fn() => Blocks::BROWN_GLAZED_TERRACOTTA()); $result->registerBlock("brown_mushroom", fn() => Blocks::BROWN_MUSHROOM()); $result->registerBlock("brown_mushroom_block", fn() => Blocks::BROWN_MUSHROOM_BLOCK()); $result->registerBlock("burning_furnace", fn() => Blocks::FURNACE()); @@ -205,7 +203,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cut_red_sandstone_slab", fn() => Blocks::CUT_RED_SANDSTONE_SLAB()); $result->registerBlock("cut_sandstone", fn() => Blocks::CUT_SANDSTONE()); $result->registerBlock("cut_sandstone_slab", fn() => Blocks::CUT_SANDSTONE_SLAB()); - $result->registerBlock("cyan_glazed_terracotta", fn() => Blocks::CYAN_GLAZED_TERRACOTTA()); $result->registerBlock("damaged_anvil", fn() => Blocks::ANVIL()->setDamage(2)); $result->registerBlock("dandelion", fn() => Blocks::DANDELION()); $result->registerBlock("dark_oak_button", fn() => Blocks::DARK_OAK_BUTTON()); @@ -558,8 +555,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("grass", fn() => Blocks::GRASS()); $result->registerBlock("grass_path", fn() => Blocks::GRASS_PATH()); $result->registerBlock("gravel", fn() => Blocks::GRAVEL()); - $result->registerBlock("gray_glazed_terracotta", fn() => Blocks::GRAY_GLAZED_TERRACOTTA()); - $result->registerBlock("green_glazed_terracotta", fn() => Blocks::GREEN_GLAZED_TERRACOTTA()); $result->registerBlock("green_torch", fn() => Blocks::GREEN_TORCH()); $result->registerBlock("hard_glass", fn() => Blocks::HARDENED_GLASS()); $result->registerBlock("hard_glass_pane", fn() => Blocks::HARDENED_GLASS_PANE()); @@ -635,13 +630,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("lectern", fn() => Blocks::LECTERN()); $result->registerBlock("legacy_stonecutter", fn() => Blocks::LEGACY_STONECUTTER()); $result->registerBlock("lever", fn() => Blocks::LEVER()); - $result->registerBlock("light_blue_glazed_terracotta", fn() => Blocks::LIGHT_BLUE_GLAZED_TERRACOTTA()); - $result->registerBlock("light_gray_glazed_terracotta", fn() => Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA()); $result->registerBlock("light_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("lilac", fn() => Blocks::LILAC()); $result->registerBlock("lily_of_the_valley", fn() => Blocks::LILY_OF_THE_VALLEY()); $result->registerBlock("lily_pad", fn() => Blocks::LILY_PAD()); - $result->registerBlock("lime_glazed_terracotta", fn() => Blocks::LIME_GLAZED_TERRACOTTA()); $result->registerBlock("lit_blast_furnace", fn() => Blocks::BLAST_FURNACE()); $result->registerBlock("lit_furnace", fn() => Blocks::FURNACE()); $result->registerBlock("lit_pumpkin", fn() => Blocks::LIT_PUMPKIN()); @@ -652,7 +644,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("log", fn() => Blocks::OAK_LOG()); $result->registerBlock("log2", fn() => Blocks::ACACIA_LOG()); $result->registerBlock("loom", fn() => Blocks::LOOM()); - $result->registerBlock("magenta_glazed_terracotta", fn() => Blocks::MAGENTA_GLAZED_TERRACOTTA()); $result->registerBlock("magma", fn() => Blocks::MAGMA()); $result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER()); $result->registerBlock("melon_block", fn() => Blocks::MELON()); @@ -713,12 +704,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("oak_wood_stairs", fn() => Blocks::OAK_STAIRS()); $result->registerBlock("oak_wooden_stairs", fn() => Blocks::OAK_STAIRS()); $result->registerBlock("obsidian", fn() => Blocks::OBSIDIAN()); - $result->registerBlock("orange_glazed_terracotta", fn() => Blocks::ORANGE_GLAZED_TERRACOTTA()); $result->registerBlock("orange_tulip", fn() => Blocks::ORANGE_TULIP()); $result->registerBlock("oxeye_daisy", fn() => Blocks::OXEYE_DAISY()); $result->registerBlock("packed_ice", fn() => Blocks::PACKED_ICE()); $result->registerBlock("peony", fn() => Blocks::PEONY()); - $result->registerBlock("pink_glazed_terracotta", fn() => Blocks::PINK_GLAZED_TERRACOTTA()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); @@ -751,7 +740,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("prismarine_wall", fn() => Blocks::PRISMARINE_WALL()); $result->registerBlock("pumpkin", fn() => Blocks::PUMPKIN()); $result->registerBlock("pumpkin_stem", fn() => Blocks::PUMPKIN_STEM()); - $result->registerBlock("purple_glazed_terracotta", fn() => Blocks::PURPLE_GLAZED_TERRACOTTA()); $result->registerBlock("purple_torch", fn() => Blocks::PURPLE_TORCH()); $result->registerBlock("purpur", fn() => Blocks::PURPUR()); $result->registerBlock("purpur_block", fn() => Blocks::PURPUR()); @@ -765,7 +753,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("quartz_stairs", fn() => Blocks::QUARTZ_STAIRS()); $result->registerBlock("rail", fn() => Blocks::RAIL()); $result->registerBlock("red_flower", fn() => Blocks::POPPY()); - $result->registerBlock("red_glazed_terracotta", fn() => Blocks::RED_GLAZED_TERRACOTTA()); $result->registerBlock("red_mushroom", fn() => Blocks::RED_MUSHROOM()); $result->registerBlock("red_mushroom_block", fn() => Blocks::RED_MUSHROOM_BLOCK()); $result->registerBlock("red_nether_brick", fn() => Blocks::RED_NETHER_BRICKS()); @@ -806,7 +793,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN()); - $result->registerBlock("silver_glazed_terracotta", fn() => Blocks::LIGHT_GRAY_GLAZED_TERRACOTTA()); $result->registerBlock("skull_block", fn() => Blocks::MOB_HEAD()); $result->registerBlock("slab", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); @@ -925,7 +911,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("weighted_pressure_plate_heavy", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY()); $result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); - $result->registerBlock("white_glazed_terracotta", fn() => Blocks::WHITE_GLAZED_TERRACOTTA()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); $result->registerBlock("wood", fn() => Blocks::OAK_LOG()); $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()); @@ -946,7 +931,6 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wool", fn() => Blocks::WOOL()); $result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("yellow_flower", fn() => Blocks::DANDELION()); - $result->registerBlock("yellow_glazed_terracotta", fn() => Blocks::YELLOW_GLAZED_TERRACOTTA()); $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); $result->register("apple", fn() => Items::APPLE()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 44867a72f6..ff7936de5a 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5393920":"White Glazed Terracotta","5393921":"White Glazed Terracotta","5393922":"White Glazed Terracotta","5393923":"White Glazed Terracotta","5318656":"Orange Glazed Terracotta","5318657":"Orange Glazed Terracotta","5318658":"Orange Glazed Terracotta","5318659":"Orange Glazed Terracotta","5295616":"Magenta Glazed Terracotta","5295617":"Magenta Glazed Terracotta","5295618":"Magenta Glazed Terracotta","5295619":"Magenta Glazed Terracotta","5291520":"Light Blue Glazed Terracotta","5291521":"Light Blue Glazed Terracotta","5291522":"Light Blue Glazed Terracotta","5291523":"Light Blue Glazed Terracotta","5395456":"Yellow Glazed Terracotta","5395457":"Yellow Glazed Terracotta","5395458":"Yellow Glazed Terracotta","5395459":"Yellow Glazed Terracotta","5294080":"Lime Glazed Terracotta","5294081":"Lime Glazed Terracotta","5294082":"Lime Glazed Terracotta","5294083":"Lime Glazed Terracotta","5321216":"Pink Glazed Terracotta","5321217":"Pink Glazed Terracotta","5321218":"Pink Glazed Terracotta","5321219":"Pink Glazed Terracotta","5265920":"Gray Glazed Terracotta","5265921":"Gray Glazed Terracotta","5265922":"Gray Glazed Terracotta","5265923":"Gray Glazed Terracotta","5292032":"Light Gray Glazed Terracotta","5292033":"Light Gray Glazed Terracotta","5292034":"Light Gray Glazed Terracotta","5292035":"Light Gray Glazed Terracotta","5170688":"Cyan Glazed Terracotta","5170689":"Cyan Glazed Terracotta","5170690":"Cyan Glazed Terracotta","5170691":"Cyan Glazed Terracotta","5333504":"Purple Glazed Terracotta","5333505":"Purple Glazed Terracotta","5333506":"Purple Glazed Terracotta","5333507":"Purple Glazed Terracotta","5146624":"Blue Glazed Terracotta","5146625":"Blue Glazed Terracotta","5146626":"Blue Glazed Terracotta","5146627":"Blue Glazed Terracotta","5152256":"Brown Glazed Terracotta","5152257":"Brown Glazed Terracotta","5152258":"Brown Glazed Terracotta","5152259":"Brown Glazed Terracotta","5266432":"Green Glazed Terracotta","5266433":"Green Glazed Terracotta","5266434":"Green Glazed Terracotta","5266435":"Green Glazed Terracotta","5339136":"Red Glazed Terracotta","5339137":"Red Glazed Terracotta","5339138":"Red Glazed Terracotta","5339139":"Red Glazed Terracotta","5145600":"Black Glazed Terracotta","5145601":"Black Glazed Terracotta","5145602":"Black Glazed Terracotta","5145603":"Black Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file From ff90c83d66fb80f222f7ffe9e157d26d85d4e8ba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 19:16:15 +0100 Subject: [PATCH 0216/1858] Implemented log stripping via axe right-click --- src/block/BlockFactory.php | 7 +- src/block/BlockLegacyIdHelper.php | 30 -------- src/block/BlockTypeIds.php | 13 +--- src/block/VanillaBlocks.php | 36 ++------- src/block/Wood.php | 30 ++++++-- .../BlockObjectToBlockStateSerializer.php | 30 ++------ .../convert/BlockStateDeserializerHelper.php | 8 ++ .../convert/BlockStateSerializerHelper.php | 15 ++-- .../BlockStateToBlockObjectDeserializer.php | 76 +++++++------------ src/item/StringToItemParser.php | 58 +++++++------- 10 files changed, 112 insertions(+), 191 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 7f3f406ee2..00befb60e6 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -461,11 +461,8 @@ class BlockFactory{ $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); - $this->register(new Log(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType, false)); - $this->register(new Log(BlockLegacyIdHelper::getStrippedLogIdentifier($treeType), "Stripped " . $name . " Log", $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->register(new Log(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType)); + $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($treeType), $name . " Wood", $logBreakInfo, $treeType)); $this->register(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($treeType), $name . " Fence Gate", $planksBreakInfo)); $this->register(new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($treeType), $name . " Stairs", $planksBreakInfo)); diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 661e849942..7f16cb4b1e 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -92,18 +92,6 @@ final class BlockLegacyIdHelper{ }); } - public static function getAllSidedStrippedLogIdentifier(TreeType $treeType) : BID{ - return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::STRIPPED_OAK_WOOD, - TreeType::SPRUCE()->id() => Ids::STRIPPED_SPRUCE_WOOD, - TreeType::BIRCH()->id() => Ids::STRIPPED_BIRCH_WOOD, - TreeType::JUNGLE()->id() => Ids::STRIPPED_JUNGLE_WOOD, - TreeType::ACACIA()->id() => Ids::STRIPPED_ACACIA_WOOD, - TreeType::DARK_OAK()->id() => Ids::STRIPPED_DARK_OAK_WOOD, - default => throw new AssumptionFailedError("All tree types should be covered") - }); - } - public static function getLeavesIdentifier(TreeType $treeType) : BID{ return match($treeType->id()){ TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES), @@ -281,22 +269,4 @@ final class BlockLegacyIdHelper{ } throw new AssumptionFailedError("Switch should cover all wood types"); } - - public static function getStrippedLogIdentifier(TreeType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case TreeType::OAK()->id(): - return new BID(Ids::STRIPPED_OAK_LOG); - case TreeType::SPRUCE()->id(): - return new BID(Ids::STRIPPED_SPRUCE_LOG); - case TreeType::BIRCH()->id(): - return new BID(Ids::STRIPPED_BIRCH_LOG); - case TreeType::JUNGLE()->id(): - return new BID(Ids::STRIPPED_JUNGLE_LOG); - case TreeType::ACACIA()->id(): - return new BID(Ids::STRIPPED_ACACIA_LOG); - case TreeType::DARK_OAK()->id(): - return new BID(Ids::STRIPPED_DARK_OAK_LOG); - } - throw new AssumptionFailedError("Switch should cover all wood types"); - } } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 2fcfdb91ff..93132dee0d 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -541,18 +541,7 @@ final class BlockTypeIds{ public const STONE_SLAB = 10503; public const STONE_STAIRS = 10504; public const STONECUTTER = 10505; - public const STRIPPED_ACACIA_LOG = 10506; - public const STRIPPED_ACACIA_WOOD = 10507; - public const STRIPPED_BIRCH_LOG = 10508; - public const STRIPPED_BIRCH_WOOD = 10509; - public const STRIPPED_DARK_OAK_LOG = 10510; - public const STRIPPED_DARK_OAK_WOOD = 10511; - public const STRIPPED_JUNGLE_LOG = 10512; - public const STRIPPED_JUNGLE_WOOD = 10513; - public const STRIPPED_OAK_LOG = 10514; - public const STRIPPED_OAK_WOOD = 10515; - public const STRIPPED_SPRUCE_LOG = 10516; - public const STRIPPED_SPRUCE_WOOD = 10517; + public const SUGARCANE = 10518; public const SUNFLOWER = 10519; public const SWEET_BERRY_BUSH = 10520; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 11654965a7..4ae0f759b7 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -525,18 +525,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static StonePressurePlate STONE_PRESSURE_PLATE() * @method static Slab STONE_SLAB() * @method static Stair STONE_STAIRS() - * @method static Log STRIPPED_ACACIA_LOG() - * @method static Wood STRIPPED_ACACIA_WOOD() - * @method static Log STRIPPED_BIRCH_LOG() - * @method static Wood STRIPPED_BIRCH_WOOD() - * @method static Log STRIPPED_DARK_OAK_LOG() - * @method static Wood STRIPPED_DARK_OAK_WOOD() - * @method static Log STRIPPED_JUNGLE_LOG() - * @method static Wood STRIPPED_JUNGLE_WOOD() - * @method static Log STRIPPED_OAK_LOG() - * @method static Wood STRIPPED_OAK_WOOD() - * @method static Log STRIPPED_SPRUCE_LOG() - * @method static Wood STRIPPED_SPRUCE_WOOD() * @method static Sugarcane SUGARCANE() * @method static DoublePlant SUNFLOWER() * @method static SweetBerryBush SWEET_BERRY_BUSH() @@ -585,7 +573,7 @@ final class VanillaBlocks{ 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::ACACIA_LEAVES, 0)); - self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 2)); + self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 4)); 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::ACACIA_SAPLING, 0)); @@ -620,7 +608,7 @@ final class VanillaBlocks{ 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::BIRCH_LEAVES, 0)); - self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 2)); + self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 4)); 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::BIRCH_SAPLING, 0)); @@ -682,7 +670,7 @@ final class VanillaBlocks{ 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::DARK_OAK_LEAVES, 0)); - self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 2)); + self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 4)); 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::DARK_OAK_SAPLING, 0)); @@ -890,7 +878,7 @@ final class VanillaBlocks{ 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::JUNGLE_LEAVES, 0)); - self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 2)); + self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 4)); 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::JUNGLE_SAPLING, 0)); @@ -948,7 +936,7 @@ final class VanillaBlocks{ 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, 2)); + self::register("oak_log", $factory->get(Ids::OAK_LOG, 4)); 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)); @@ -1048,7 +1036,7 @@ final class VanillaBlocks{ 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::SPRUCE_LEAVES, 0)); - self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 2)); + self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 4)); 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::SPRUCE_SAPLING, 0)); @@ -1073,18 +1061,6 @@ final class VanillaBlocks{ self::register("stone_slab", $factory->get(Ids::STONE_SLAB, 0)); self::register("stone_stairs", $factory->get(Ids::STONE_STAIRS, 0)); self::register("stonecutter", $factory->get(Ids::STONECUTTER, 0)); - self::register("stripped_acacia_log", $factory->get(Ids::STRIPPED_ACACIA_LOG, 2)); - self::register("stripped_acacia_wood", $factory->get(Ids::STRIPPED_ACACIA_WOOD, 0)); - self::register("stripped_birch_log", $factory->get(Ids::STRIPPED_BIRCH_LOG, 2)); - 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, 2)); - 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, 2)); - self::register("stripped_jungle_wood", $factory->get(Ids::STRIPPED_JUNGLE_WOOD, 0)); - self::register("stripped_oak_log", $factory->get(Ids::STRIPPED_OAK_LOG, 2)); - self::register("stripped_oak_wood", $factory->get(Ids::STRIPPED_OAK_WOOD, 0)); - self::register("stripped_spruce_log", $factory->get(Ids::STRIPPED_SPRUCE_LOG, 2)); - 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)); diff --git a/src/block/Wood.php b/src/block/Wood.php index a71f490fa1..a31699db5d 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -24,6 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\TreeType; +use pocketmine\data\runtime\block\BlockDataReader; +use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -32,14 +35,23 @@ class Wood extends Opaque{ private TreeType $treeType; - private bool $stripped; + private bool $stripped = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, TreeType $treeType, bool $stripped){ - $this->stripped = $stripped; //TODO: this should be dynamic, but right now legacy shit gets in the way + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, TreeType $treeType){ parent::__construct($idInfo, $name, $breakInfo); $this->treeType = $treeType; } + public function getRequiredTypeDataBits() : int{ return 1; } + + protected function decodeType(BlockDataReader $r) : void{ + $this->stripped = $r->readBool(); + } + + protected function encodeType(BlockDataWriter $w) : void{ + $w->writeBool($this->stripped); + } + /** * TODO: this is ad hoc, but add an interface for this to all tree-related blocks */ @@ -49,6 +61,12 @@ class Wood extends Opaque{ public function isStripped() : bool{ return $this->stripped; } + /** @return $this */ + public function setStripped(bool $stripped) : self{ + $this->stripped = $stripped; + return $this; + } + public function getFuelTime() : int{ return 300; } @@ -62,8 +80,10 @@ class Wood extends Opaque{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->stripped && ($item->getBlockToolType() & BlockToolType::AXE) !== 0){ - //TODO: strip logs; can't implement this yet because of legacy limitations :( + if(!$this->stripped && $item instanceof Axe){ + $item->applyDamage(1); + $this->stripped = true; + $this->position->getWorld()->setBlock($this->position, $this); return true; } return false; diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 04907a553f..854367f43c 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -231,7 +231,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); @@ -319,7 +319,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); @@ -433,7 +433,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); @@ -720,7 +720,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); - $this->map(Blocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE)); + $this->map(Blocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE, Ids::STRIPPED_JUNGLE_LOG)); $this->map(Blocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); @@ -824,7 +824,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); - $this->map(Blocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK)); + $this->map(Blocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK, Ids::STRIPPED_OAK_LOG)); $this->map(Blocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); @@ -974,7 +974,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); - $this->map(Blocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE)); + $this->map(Blocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE, Ids::STRIPPED_SPRUCE_LOG)); $this->map(Blocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); @@ -1016,24 +1016,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); $this->map(Blocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); $this->map(Blocks::STONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NORMAL_STONE_STAIRS))); - $this->map(Blocks::STRIPPED_ACACIA_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_ACACIA_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::STRIPPED_BIRCH_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_BIRCH_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::STRIPPED_DARK_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_DARK_OAK_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::STRIPPED_JUNGLE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_JUNGLE_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::STRIPPED_OAK_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_OAK_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::STRIPPED_SPRUCE_LOG(), fn(Log $block) => Writer::create(Ids::STRIPPED_SPRUCE_LOG) - ->writePillarAxis($block->getAxis())); - $this->map(Blocks::STRIPPED_SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); $this->map(Blocks::SUGARCANE(), function(Sugarcane $block) : Writer{ return Writer::create(Ids::REEDS) ->writeInt(StateNames::AGE, $block->getAge()); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index b662e847cf..8c7d73fb9e 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -33,6 +33,7 @@ use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; use pocketmine\block\GlazedTerracotta; use pocketmine\block\Liquid; +use pocketmine\block\Log; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; use pocketmine\block\RedstoneRepeater; @@ -149,6 +150,13 @@ final class BlockStateDeserializerHelper{ return self::decodeLiquid($block, $in, true); } + /** @throws BlockStateDeserializeException */ + public static function decodeLog(Log $block, bool $stripped, BlockStateReader $in) : Log{ + return $block + ->setAxis($in->readPillarAxis()) + ->setStripped($stripped); + } + /** @throws BlockStateDeserializeException */ public static function decodeMushroomBlock(RedMushroomBlock $block, BlockStateReader $in) : Block{ switch($type = $in->readBoundedInt(BlockStateNames::HUGE_MUSHROOM_BITS, 0, 15)){ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 5bc021940d..d7fc9a28f8 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -140,14 +140,17 @@ final class BlockStateSerializerHelper{ ->writePillarAxis($block->getAxis()); } - public static function encodeLog1(Log $block, string $type) : BlockStateWriter{ - return self::encodeLog($block, BlockStateWriter::create(Ids::LOG) - ->writeString(BlockStateNames::OLD_LOG_TYPE, $type)); + public static function encodeLog1(Log $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ + return self::encodeLog($block, $block->isStripped() ? + BlockStateWriter::create($strippedId) : + BlockStateWriter::create(Ids::LOG)->writeString(BlockStateNames::OLD_LOG_TYPE, $unstrippedType)); } - public static function encodeLog2(Log $block, string $type) : BlockStateWriter{ - return self::encodeLog($block, BlockStateWriter::create(Ids::LOG2) - ->writeString(BlockStateNames::NEW_LOG_TYPE, $type)); + public static function encodeLog2(Log $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ + return self::encodeLog($block, $block->isStripped() ? + BlockStateWriter::create($strippedId) : + BlockStateWriter::create(Ids::LOG2)->writeString(BlockStateNames::NEW_LOG_TYPE, $unstrippedType) + ); } public static function encodeMushroomBlock(RedMushroomBlock $block, BlockStateWriter $out) : BlockStateWriter{ diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index e371e82437..8f8b13f8fd 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -638,24 +638,18 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); - $this->map(Ids::LOG, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::OLD_LOG_TYPE)){ - StringValues::OLD_LOG_TYPE_BIRCH => Blocks::BIRCH_LOG(), - StringValues::OLD_LOG_TYPE_JUNGLE => Blocks::JUNGLE_LOG(), - StringValues::OLD_LOG_TYPE_OAK => Blocks::OAK_LOG(), - StringValues::OLD_LOG_TYPE_SPRUCE => Blocks::SPRUCE_LOG(), - default => throw $in->badValueException(StateNames::OLD_LOG_TYPE, $type), - }) - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::LOG2, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::NEW_LOG_TYPE)){ - StringValues::NEW_LOG_TYPE_ACACIA => Blocks::ACACIA_LOG(), - StringValues::NEW_LOG_TYPE_DARK_OAK => Blocks::DARK_OAK_LOG(), - default => throw $in->badValueException(StateNames::NEW_LOG_TYPE, $type), - }) - ->setAxis($in->readPillarAxis()); - }); + $this->map(Ids::LOG, fn(Reader $in) => Helper::decodeLog(match($type = $in->readString(StateNames::OLD_LOG_TYPE)){ + StringValues::OLD_LOG_TYPE_BIRCH => Blocks::BIRCH_LOG(), + StringValues::OLD_LOG_TYPE_JUNGLE => Blocks::JUNGLE_LOG(), + StringValues::OLD_LOG_TYPE_OAK => Blocks::OAK_LOG(), + StringValues::OLD_LOG_TYPE_SPRUCE => Blocks::SPRUCE_LOG(), + default => throw $in->badValueException(StateNames::OLD_LOG_TYPE, $type), + }, false, $in)); + $this->map(Ids::LOG2, fn(Reader $in) => Helper::decodeLog(match($type = $in->readString(StateNames::NEW_LOG_TYPE)){ + StringValues::NEW_LOG_TYPE_ACACIA => Blocks::ACACIA_LOG(), + StringValues::NEW_LOG_TYPE_DARK_OAK => Blocks::DARK_OAK_LOG(), + default => throw $in->badValueException(StateNames::NEW_LOG_TYPE, $type), + }, false, $in)); $this->map(Ids::LOOM, function(Reader $in) : Block{ return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); @@ -959,30 +953,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::STONECUTTER() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::STRIPPED_ACACIA_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_ACACIA_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::STRIPPED_BIRCH_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_BIRCH_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::STRIPPED_DARK_OAK_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_DARK_OAK_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::STRIPPED_JUNGLE_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_JUNGLE_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::STRIPPED_OAK_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_OAK_LOG() - ->setAxis($in->readPillarAxis()); - }); - $this->map(Ids::STRIPPED_SPRUCE_LOG, function(Reader $in) : Block{ - return Blocks::STRIPPED_SPRUCE_LOG() - ->setAxis($in->readPillarAxis()); - }); + $this->map(Ids::STRIPPED_ACACIA_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::ACACIA_LOG(), true, $in)); + $this->map(Ids::STRIPPED_BIRCH_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::BIRCH_LOG(), true, $in)); + $this->map(Ids::STRIPPED_DARK_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::DARK_OAK_LOG(), true, $in)); + $this->map(Ids::STRIPPED_JUNGLE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::JUNGLE_LOG(), true, $in)); + $this->map(Ids::STRIPPED_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::OAK_LOG(), true, $in)); + $this->map(Ids::STRIPPED_SPRUCE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::SPRUCE_LOG(), true, $in)); $this->map(Ids::SWEET_BERRY_BUSH, function(Reader $in) : Block{ //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); @@ -1057,15 +1033,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WOOD, function(Reader $in) : Block{ $in->todo(StateNames::PILLAR_AXIS); //TODO: our impl doesn't support axis yet $stripped = $in->readBool(StateNames::STRIPPED_BIT); - return match($woodType = $in->readString(StateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => $stripped ? Blocks::STRIPPED_ACACIA_WOOD() : Blocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => $stripped ? Blocks::STRIPPED_BIRCH_WOOD() : Blocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => $stripped ? Blocks::STRIPPED_DARK_OAK_WOOD() : Blocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => $stripped ? Blocks::STRIPPED_JUNGLE_WOOD() : Blocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => $stripped ? Blocks::STRIPPED_OAK_WOOD() : Blocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => $stripped ? Blocks::STRIPPED_SPRUCE_WOOD() : Blocks::SPRUCE_WOOD(), + return (match($woodType = $in->readString(StateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => Blocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_WOOD(), default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodType), - }; + })->setStripped($stripped); }); $this->map(Ids::WOODEN_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::OAK_BUTTON(), $in)); $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 8be5208bd6..440734556e 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -77,7 +77,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("acacia_fence", fn() => Blocks::ACACIA_FENCE()); $result->registerBlock("acacia_fence_gate", fn() => Blocks::ACACIA_FENCE_GATE()); $result->registerBlock("acacia_leaves", fn() => Blocks::ACACIA_LEAVES()); - $result->registerBlock("acacia_log", fn() => Blocks::ACACIA_LOG()); + $result->registerBlock("acacia_log", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("acacia_planks", fn() => Blocks::ACACIA_PLANKS()); $result->registerBlock("acacia_pressure_plate", fn() => Blocks::ACACIA_PRESSURE_PLATE()); $result->registerBlock("acacia_sapling", fn() => Blocks::ACACIA_SAPLING()); @@ -87,7 +87,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("acacia_standing_sign", fn() => Blocks::ACACIA_SIGN()); $result->registerBlock("acacia_trapdoor", fn() => Blocks::ACACIA_TRAPDOOR()); $result->registerBlock("acacia_wall_sign", fn() => Blocks::ACACIA_WALL_SIGN()); - $result->registerBlock("acacia_wood", fn() => Blocks::ACACIA_WOOD()); + $result->registerBlock("acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(false)); $result->registerBlock("acacia_wood_stairs", fn() => Blocks::ACACIA_STAIRS()); $result->registerBlock("acacia_wooden_stairs", fn() => Blocks::ACACIA_STAIRS()); $result->registerBlock("activator_rail", fn() => Blocks::ACTIVATOR_RAIL()); @@ -119,7 +119,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("birch_fence", fn() => Blocks::BIRCH_FENCE()); $result->registerBlock("birch_fence_gate", fn() => Blocks::BIRCH_FENCE_GATE()); $result->registerBlock("birch_leaves", fn() => Blocks::BIRCH_LEAVES()); - $result->registerBlock("birch_log", fn() => Blocks::BIRCH_LOG()); + $result->registerBlock("birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(false)); $result->registerBlock("birch_planks", fn() => Blocks::BIRCH_PLANKS()); $result->registerBlock("birch_pressure_plate", fn() => Blocks::BIRCH_PRESSURE_PLATE()); $result->registerBlock("birch_sapling", fn() => Blocks::BIRCH_SAPLING()); @@ -129,7 +129,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("birch_standing_sign", fn() => Blocks::BIRCH_SIGN()); $result->registerBlock("birch_trapdoor", fn() => Blocks::BIRCH_TRAPDOOR()); $result->registerBlock("birch_wall_sign", fn() => Blocks::BIRCH_WALL_SIGN()); - $result->registerBlock("birch_wood", fn() => Blocks::BIRCH_WOOD()); + $result->registerBlock("birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(false)); $result->registerBlock("birch_wood_stairs", fn() => Blocks::BIRCH_STAIRS()); $result->registerBlock("birch_wooden_stairs", fn() => Blocks::BIRCH_STAIRS()); $result->registerBlock("blast_furnace", fn() => Blocks::BLAST_FURNACE()); @@ -211,7 +211,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("dark_oak_fence", fn() => Blocks::DARK_OAK_FENCE()); $result->registerBlock("dark_oak_fence_gate", fn() => Blocks::DARK_OAK_FENCE_GATE()); $result->registerBlock("dark_oak_leaves", fn() => Blocks::DARK_OAK_LEAVES()); - $result->registerBlock("dark_oak_log", fn() => Blocks::DARK_OAK_LOG()); + $result->registerBlock("dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(false)); $result->registerBlock("dark_oak_planks", fn() => Blocks::DARK_OAK_PLANKS()); $result->registerBlock("dark_oak_pressure_plate", fn() => Blocks::DARK_OAK_PRESSURE_PLATE()); $result->registerBlock("dark_oak_sapling", fn() => Blocks::DARK_OAK_SAPLING()); @@ -221,7 +221,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("dark_oak_standing_sign", fn() => Blocks::DARK_OAK_SIGN()); $result->registerBlock("dark_oak_trapdoor", fn() => Blocks::DARK_OAK_TRAPDOOR()); $result->registerBlock("dark_oak_wall_sign", fn() => Blocks::DARK_OAK_WALL_SIGN()); - $result->registerBlock("dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()); + $result->registerBlock("dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()->setStripped(false)); $result->registerBlock("dark_oak_wood_stairs", fn() => Blocks::DARK_OAK_STAIRS()); $result->registerBlock("dark_oak_wooden_stairs", fn() => Blocks::DARK_OAK_STAIRS()); $result->registerBlock("dark_prismarine", fn() => Blocks::DARK_PRISMARINE()); @@ -601,7 +601,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("jungle_fence", fn() => Blocks::JUNGLE_FENCE()); $result->registerBlock("jungle_fence_gate", fn() => Blocks::JUNGLE_FENCE_GATE()); $result->registerBlock("jungle_leaves", fn() => Blocks::JUNGLE_LEAVES()); - $result->registerBlock("jungle_log", fn() => Blocks::JUNGLE_LOG()); + $result->registerBlock("jungle_log", fn() => Blocks::JUNGLE_LOG()->setStripped(false)); $result->registerBlock("jungle_planks", fn() => Blocks::JUNGLE_PLANKS()); $result->registerBlock("jungle_pressure_plate", fn() => Blocks::JUNGLE_PRESSURE_PLATE()); $result->registerBlock("jungle_sapling", fn() => Blocks::JUNGLE_SAPLING()); @@ -611,7 +611,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("jungle_standing_sign", fn() => Blocks::JUNGLE_SIGN()); $result->registerBlock("jungle_trapdoor", fn() => Blocks::JUNGLE_TRAPDOOR()); $result->registerBlock("jungle_wall_sign", fn() => Blocks::JUNGLE_WALL_SIGN()); - $result->registerBlock("jungle_wood", fn() => Blocks::JUNGLE_WOOD()); + $result->registerBlock("jungle_wood", fn() => Blocks::JUNGLE_WOOD()->setStripped(false)); $result->registerBlock("jungle_wood_stairs", fn() => Blocks::JUNGLE_STAIRS()); $result->registerBlock("jungle_wooden_stairs", fn() => Blocks::JUNGLE_STAIRS()); $result->registerBlock("lab_table", fn() => Blocks::LAB_TABLE()); @@ -641,8 +641,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("lit_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true)); $result->registerBlock("lit_redstone_torch", fn() => Blocks::REDSTONE_TORCH()); $result->registerBlock("lit_smoker", fn() => Blocks::SMOKER()); - $result->registerBlock("log", fn() => Blocks::OAK_LOG()); - $result->registerBlock("log2", fn() => Blocks::ACACIA_LOG()); + $result->registerBlock("log", fn() => Blocks::OAK_LOG()->setStripped(false)); + $result->registerBlock("log2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("loom", fn() => Blocks::LOOM()); $result->registerBlock("magma", fn() => Blocks::MAGMA()); $result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER()); @@ -690,7 +690,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("oak_fence", fn() => Blocks::OAK_FENCE()); $result->registerBlock("oak_fence_gate", fn() => Blocks::OAK_FENCE_GATE()); $result->registerBlock("oak_leaves", fn() => Blocks::OAK_LEAVES()); - $result->registerBlock("oak_log", fn() => Blocks::OAK_LOG()); + $result->registerBlock("oak_log", fn() => Blocks::OAK_LOG()->setStripped(false)); $result->registerBlock("oak_planks", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("oak_pressure_plate", fn() => Blocks::OAK_PRESSURE_PLATE()); $result->registerBlock("oak_sapling", fn() => Blocks::OAK_SAPLING()); @@ -700,7 +700,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("oak_standing_sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("oak_trapdoor", fn() => Blocks::OAK_TRAPDOOR()); $result->registerBlock("oak_wall_sign", fn() => Blocks::OAK_WALL_SIGN()); - $result->registerBlock("oak_wood", fn() => Blocks::OAK_WOOD()); + $result->registerBlock("oak_wood", fn() => Blocks::OAK_WOOD()->setStripped(false)); $result->registerBlock("oak_wood_stairs", fn() => Blocks::OAK_STAIRS()); $result->registerBlock("oak_wooden_stairs", fn() => Blocks::OAK_STAIRS()); $result->registerBlock("obsidian", fn() => Blocks::OBSIDIAN()); @@ -821,7 +821,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("spruce_fence", fn() => Blocks::SPRUCE_FENCE()); $result->registerBlock("spruce_fence_gate", fn() => Blocks::SPRUCE_FENCE_GATE()); $result->registerBlock("spruce_leaves", fn() => Blocks::SPRUCE_LEAVES()); - $result->registerBlock("spruce_log", fn() => Blocks::SPRUCE_LOG()); + $result->registerBlock("spruce_log", fn() => Blocks::SPRUCE_LOG()->setStripped(false)); $result->registerBlock("spruce_planks", fn() => Blocks::SPRUCE_PLANKS()); $result->registerBlock("spruce_pressure_plate", fn() => Blocks::SPRUCE_PRESSURE_PLATE()); $result->registerBlock("spruce_sapling", fn() => Blocks::SPRUCE_SAPLING()); @@ -831,7 +831,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("spruce_standing_sign", fn() => Blocks::SPRUCE_SIGN()); $result->registerBlock("spruce_trapdoor", fn() => Blocks::SPRUCE_TRAPDOOR()); $result->registerBlock("spruce_wall_sign", fn() => Blocks::SPRUCE_WALL_SIGN()); - $result->registerBlock("spruce_wood", fn() => Blocks::SPRUCE_WOOD()); + $result->registerBlock("spruce_wood", fn() => Blocks::SPRUCE_WOOD()->setStripped(false)); $result->registerBlock("spruce_wood_stairs", fn() => Blocks::SPRUCE_STAIRS()); $result->registerBlock("spruce_wooden_stairs", fn() => Blocks::SPRUCE_STAIRS()); $result->registerBlock("stained_clay", fn() => Blocks::STAINED_CLAY()); @@ -861,18 +861,18 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("stonebrick", fn() => Blocks::STONE_BRICKS()); $result->registerBlock("stonecutter", fn() => Blocks::STONECUTTER()); $result->registerBlock("stonecutter_block", fn() => Blocks::STONECUTTER()); - $result->registerBlock("stripped_acacia_log", fn() => Blocks::STRIPPED_ACACIA_LOG()); - $result->registerBlock("stripped_acacia_wood", fn() => Blocks::STRIPPED_ACACIA_WOOD()); - $result->registerBlock("stripped_birch_log", fn() => Blocks::STRIPPED_BIRCH_LOG()); - $result->registerBlock("stripped_birch_wood", fn() => Blocks::STRIPPED_BIRCH_WOOD()); - $result->registerBlock("stripped_dark_oak_log", fn() => Blocks::STRIPPED_DARK_OAK_LOG()); - $result->registerBlock("stripped_dark_oak_wood", fn() => Blocks::STRIPPED_DARK_OAK_WOOD()); - $result->registerBlock("stripped_jungle_log", fn() => Blocks::STRIPPED_JUNGLE_LOG()); - $result->registerBlock("stripped_jungle_wood", fn() => Blocks::STRIPPED_JUNGLE_WOOD()); - $result->registerBlock("stripped_oak_log", fn() => Blocks::STRIPPED_OAK_LOG()); - $result->registerBlock("stripped_oak_wood", fn() => Blocks::STRIPPED_OAK_WOOD()); - $result->registerBlock("stripped_spruce_log", fn() => Blocks::STRIPPED_SPRUCE_LOG()); - $result->registerBlock("stripped_spruce_wood", fn() => Blocks::STRIPPED_SPRUCE_WOOD()); + $result->registerBlock("stripped_acacia_log", fn() => Blocks::ACACIA_LOG()->setStripped(true)); + $result->registerBlock("stripped_acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(true)); + $result->registerBlock("stripped_birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(true)); + $result->registerBlock("stripped_birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(true)); + $result->registerBlock("stripped_dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(true)); + $result->registerBlock("stripped_dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()->setStripped(true)); + $result->registerBlock("stripped_jungle_log", fn() => Blocks::JUNGLE_LOG()->setStripped(true)); + $result->registerBlock("stripped_jungle_wood", fn() => Blocks::JUNGLE_WOOD()->setStripped(true)); + $result->registerBlock("stripped_oak_log", fn() => Blocks::OAK_LOG()->setStripped(true)); + $result->registerBlock("stripped_oak_wood", fn() => Blocks::OAK_WOOD()->setStripped(true)); + $result->registerBlock("stripped_spruce_log", fn() => Blocks::SPRUCE_LOG()->setStripped(true)); + $result->registerBlock("stripped_spruce_wood", fn() => Blocks::SPRUCE_WOOD()->setStripped(true)); $result->registerBlock("sugar_cane", fn() => Blocks::SUGARCANE()); $result->registerBlock("sugar_canes", fn() => Blocks::SUGARCANE()); $result->registerBlock("sugarcane", fn() => Blocks::SUGARCANE()); @@ -890,7 +890,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("tripwire", fn() => Blocks::TRIPWIRE()); $result->registerBlock("tripwire_hook", fn() => Blocks::TRIPWIRE_HOOK()); $result->registerBlock("trunk", fn() => Blocks::OAK_PLANKS()); - $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()); + $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH()); $result->registerBlock("undyed_shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("unlit_redstone_torch", fn() => Blocks::REDSTONE_TORCH()); @@ -912,8 +912,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); - $result->registerBlock("wood", fn() => Blocks::OAK_LOG()); - $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()); + $result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false)); + $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("wood_door_block", fn() => Blocks::OAK_DOOR()); $result->registerBlock("wood_slab", fn() => Blocks::OAK_SLAB()); $result->registerBlock("wood_slabs", fn() => Blocks::OAK_SLAB()); From bcdbb09c2cf6b9e28271522fca4c147ccbe14219 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 20:19:58 +0100 Subject: [PATCH 0217/1858] Updated BlockFactory consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index ff7936de5a..c4cff8e6eb 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5383168":"Stripped Oak Log","5383169":"Stripped Oak Log","5383170":"Stripped Oak Log","5317632":"Oak Wood","5383680":"Stripped Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5384192":"Stripped Spruce Log","5384193":"Stripped Spruce Log","5384194":"Stripped Spruce Log","5370880":"Spruce Wood","5384704":"Stripped Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5380096":"Stripped Birch Log","5380097":"Stripped Birch Log","5380098":"Stripped Birch Log","5145088":"Birch Wood","5380608":"Stripped Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5382144":"Stripped Jungle Log","5382145":"Stripped Jungle Log","5382146":"Stripped Jungle Log","5285888":"Jungle Wood","5382656":"Stripped Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5379072":"Stripped Acacia Log","5379073":"Stripped Acacia Log","5379074":"Stripped Acacia Log","5127680":"Acacia Wood","5379584":"Stripped Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5381120":"Stripped Dark Oak Log","5381121":"Stripped Dark Oak Log","5381122":"Stripped Dark Oak Log","5178880":"Dark Oak Wood","5381632":"Stripped Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file From d49597fe5f0c03c0c71bb0855f41a77d8152d722 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 20:50:26 +0100 Subject: [PATCH 0218/1858] BlockStateToBlockObjectDeserializer: make stairs less annoying to implement --- .../BlockStateToBlockObjectDeserializer.php | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8f8b13f8fd..602802deb3 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; +use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; @@ -70,12 +71,19 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->deserializeFuncs[$id] = $c; } + /** + * @phpstan-param \Closure() : Stair $getBlock + */ + public function mapStairs(string $id, \Closure $getBlock) : void{ + $this->map($id, fn(Reader $in) : Stair => Helper::decodeStairs($getBlock(), $in)); + } + private function registerDeserializers() : void{ $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in)); $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::ACACIA_PRESSURE_PLATE(), $in)); - $this->map(Ids::ACACIA_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::ACACIA_STAIRS(), $in)); + $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS()); $this->map(Ids::ACACIA_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::ACACIA_SIGN(), $in)); $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in)); $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); @@ -85,7 +93,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); $this->map(Ids::AIR, fn() => Blocks::AIR()); - $this->map(Ids::ANDESITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::ANDESITE_STAIRS(), $in)); + $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); $this->map(Ids::ANVIL, function(Reader $in) : Block{ return Blocks::ANVIL() ->setDamage(match($value = $in->readString(StateNames::DAMAGE)){ @@ -144,7 +152,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in)); $this->map(Ids::BIRCH_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::BIRCH_FENCE_GATE(), $in)); $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::BIRCH_PRESSURE_PLATE(), $in)); - $this->map(Ids::BIRCH_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::BIRCH_STAIRS(), $in)); + $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS()); $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); @@ -168,7 +176,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); }); $this->map(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); - $this->map(Ids::BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); $this->map(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); @@ -262,9 +270,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in)); - $this->map(Ids::DARK_OAK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DARK_OAK_STAIRS(), $in)); + $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS()); $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); - $this->map(Ids::DARK_PRISMARINE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DARK_PRISMARINE_STAIRS(), $in)); + $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS()); $this->map(Ids::DARKOAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::DARK_OAK_SIGN(), $in)); $this->map(Ids::DARKOAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::DARK_OAK_WALL_SIGN(), $in)); $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) @@ -279,7 +287,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); $this->map(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); - $this->map(Ids::DIORITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::DIORITE_STAIRS(), $in)); + $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); $this->map(Ids::DIRT, function(Reader $in) : Block{ return Blocks::DIRT() ->setCoarse(match($value = $in->readString(StateNames::DIRT_TYPE)){ @@ -443,7 +451,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD()); $this->map(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE()); $this->map(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); - $this->map(Ids::END_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::END_STONE_BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); $this->map(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() @@ -512,7 +520,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); - $this->map(Ids::GRANITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::GRANITE_STAIRS(), $in)); + $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); $this->map(Ids::GRASS, fn() => Blocks::GRASS()); $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); @@ -553,7 +561,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::JUNGLE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::JUNGLE_DOOR(), $in)); $this->map(Ids::JUNGLE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::JUNGLE_FENCE_GATE(), $in)); $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::JUNGLE_PRESSURE_PLATE(), $in)); - $this->map(Ids::JUNGLE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::JUNGLE_STAIRS(), $in)); + $this->mapStairs(Ids::JUNGLE_STAIRS, fn() => Blocks::JUNGLE_STAIRS()); $this->map(Ids::JUNGLE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::JUNGLE_SIGN(), $in)); $this->map(Ids::JUNGLE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::JUNGLE_TRAPDOOR(), $in)); $this->map(Ids::JUNGLE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::JUNGLE_WALL_SIGN(), $in)); @@ -671,12 +679,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; }); $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); - $this->map(Ids::MOSSY_COBBLESTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), $in)); - $this->map(Ids::MOSSY_STONE_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS()); + $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); - $this->map(Ids::NETHER_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::NETHER_BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ return Blocks::NETHER_WART() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); @@ -684,9 +692,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); - $this->map(Ids::NORMAL_STONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::STONE_STAIRS(), $in)); + $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); - $this->map(Ids::OAK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::OAK_STAIRS(), $in)); + $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); @@ -703,9 +711,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; }); $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); - $this->map(Ids::POLISHED_ANDESITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_ANDESITE_STAIRS(), $in)); - $this->map(Ids::POLISHED_DIORITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_DIORITE_STAIRS(), $in)); - $this->map(Ids::POLISHED_GRANITE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::POLISHED_GRANITE_STAIRS(), $in)); + $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); + $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS()); + $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS()); $this->map(Ids::PORTAL, function(Reader $in) : Block{ return Blocks::NETHER_PORTAL() ->setAxis(match($value = $in->readString(StateNames::PORTAL_AXIS)){ @@ -727,8 +735,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::PRISMARINE_BLOCK_TYPE, $type), }; }); - $this->map(Ids::PRISMARINE_BRICKS_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), $in)); - $this->map(Ids::PRISMARINE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PRISMARINE_STAIRS(), $in)); + $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS()); + $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS()); $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ $in->ignored(StateNames::DIRECTION); //obsolete return Blocks::PUMPKIN(); @@ -749,7 +757,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; } }); - $this->map(Ids::PURPUR_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::PURPUR_STAIRS(), $in)); + $this->mapStairs(Ids::PURPUR_STAIRS, fn() => Blocks::PURPUR_STAIRS()); $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Block{ switch($type = $in->readString(StateNames::CHISEL_TYPE)){ case StringValues::CHISEL_TYPE_CHISELED: @@ -767,7 +775,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize } }); $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); - $this->map(Ids::QUARTZ_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::QUARTZ_STAIRS(), $in)); + $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS()); $this->map(Ids::RAIL, function(Reader $in) : Block{ return Blocks::RAIL() ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); @@ -792,7 +800,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); - $this->map(Ids::RED_NETHER_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::RED_NETHER_BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ StringValues::SAND_STONE_TYPE_CUT => Blocks::CUT_RED_SANDSTONE(), @@ -802,7 +810,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), }; }); - $this->map(Ids::RED_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::RED_SANDSTONE_STAIRS(), $in)); + $this->mapStairs(Ids::RED_SANDSTONE_STAIRS, fn() => Blocks::RED_SANDSTONE_STAIRS()); $this->map(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); $this->map(Ids::REDSTONE_LAMP, function() : Block{ return Blocks::REDSTONE_LAMP() @@ -842,7 +850,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), }; }); - $this->map(Ids::SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SANDSTONE_STAIRS(), $in)); + $this->mapStairs(Ids::SANDSTONE_STAIRS, fn() => Blocks::SANDSTONE_STAIRS()); $this->map(Ids::SAPLING, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::SAPLING_TYPE)){ StringValues::SAPLING_TYPE_ACACIA => Blocks::ACACIA_SAPLING(), @@ -876,9 +884,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::SMOOTH_QUARTZ_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), $in)); - $this->map(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), $in)); - $this->map(Ids::SMOOTH_SANDSTONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), $in)); + $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); + $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS()); + $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS()); $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); $this->map(Ids::SNOW, fn() => Blocks::SNOW()); $this->map(Ids::SNOW_LAYER, function(Reader $in) : Block{ @@ -897,7 +905,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::SPRUCE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::SPRUCE_DOOR(), $in)); $this->map(Ids::SPRUCE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::SPRUCE_FENCE_GATE(), $in)); $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::SPRUCE_PRESSURE_PLATE(), $in)); - $this->map(Ids::SPRUCE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::SPRUCE_STAIRS(), $in)); + $this->mapStairs(Ids::SPRUCE_STAIRS, fn() => Blocks::SPRUCE_STAIRS()); $this->map(Ids::SPRUCE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::SPRUCE_SIGN(), $in)); $this->map(Ids::SPRUCE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::SPRUCE_TRAPDOOR(), $in)); $this->map(Ids::SPRUCE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::SPRUCE_WALL_SIGN(), $in)); @@ -930,14 +938,14 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::STONE_TYPE, $type), }; }); - $this->map(Ids::STONE_BRICK_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::STONE_BRICK_STAIRS(), $in)); + $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); $this->map(Ids::STONE_BLOCK_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); $this->map(Ids::STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); $this->map(Ids::STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); $this->map(Ids::STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_STAIRS, fn(Reader $in) => Helper::decodeStairs(Blocks::COBBLESTONE_STAIRS(), $in)); + $this->mapStairs(Ids::STONE_STAIRS, fn() => Blocks::COBBLESTONE_STAIRS()); $this->map(Ids::STONEBRICK, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::STONE_BRICK_TYPE)){ StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla From 451971b866d253d50215dd8fe9cce78cbdac96c7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 20:57:18 +0100 Subject: [PATCH 0219/1858] BlockObjectToBlockStateSerializer: make stairs less annoying to implement --- .../BlockObjectToBlockStateSerializer.php | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 854367f43c..59f38aa4a0 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -186,6 +186,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; } + public function mapStairs(Stair $block, string $id) : void{ + $this->map($block, fn(Stair $block) => Helper::encodeStairs($block, Writer::create($id))); + } + /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $blockState @@ -326,7 +330,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); $this->map(Blocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); $this->map(Blocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::BIRCH_STAIRS))); + $this->mapStairs(Blocks::BIRCH_STAIRS(), Ids::BIRCH_STAIRS); $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); @@ -348,7 +352,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); - $this->map(Blocks::BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::BRICK_STAIRS))); + $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); $this->map(Blocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); @@ -383,7 +387,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::COAL_ORE(), fn() => new Writer(Ids::COAL_ORE)); $this->map(Blocks::COBBLESTONE(), fn() => new Writer(Ids::COBBLESTONE)); $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); - $this->map(Blocks::COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_STAIRS))); + $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); $this->map(Blocks::COBWEB(), fn() => new Writer(Ids::WEB)); $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ @@ -440,14 +444,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); $this->map(Blocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_OAK_STAIRS))); + $this->mapStairs(Blocks::DARK_OAK_STAIRS(), Ids::DARK_OAK_STAIRS); $this->map(Blocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); $this->map(Blocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); - $this->map(Blocks::DARK_PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DARK_PRISMARINE_STAIRS))); + $this->mapStairs(Blocks::DARK_PRISMARINE_STAIRS(), Ids::DARK_PRISMARINE_STAIRS); $this->map(Blocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); @@ -462,7 +466,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::DIAMOND_ORE(), fn() => new Writer(Ids::DIAMOND_ORE)); $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); - $this->map(Blocks::DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::DIORITE_STAIRS))); + $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ return Writer::create(Ids::DIRT) @@ -614,7 +618,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); $this->map(Blocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); - $this->map(Blocks::END_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::END_BRICK_STAIRS))); + $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); $this->map(Blocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_WOOD)); $this->map(Blocks::FARMLAND(), function(Farmland $block) : Writer{ @@ -667,7 +671,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::GOLD_ORE(), fn() => new Writer(Ids::GOLD_ORE)); $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); - $this->map(Blocks::GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::GRANITE_STAIRS))); + $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); $this->map(Blocks::GRASS(), fn() => new Writer(Ids::GRASS)); $this->map(Blocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); @@ -727,7 +731,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::JUNGLE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::JUNGLE_STANDING_SIGN))); $this->map(Blocks::JUNGLE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_JUNGLE)); - $this->map(Blocks::JUNGLE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::JUNGLE_STAIRS))); + $this->mapStairs(Blocks::JUNGLE_STAIRS(), Ids::JUNGLE_STAIRS); $this->map(Blocks::JUNGLE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::JUNGLE_TRAPDOOR))); $this->map(Blocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); $this->map(Blocks::JUNGLE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); @@ -787,11 +791,11 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); $this->map(Blocks::MOSSY_COBBLESTONE(), fn() => new Writer(Ids::MOSSY_COBBLESTONE)); $this->map(Blocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); - $this->map(Blocks::MOSSY_COBBLESTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_COBBLESTONE_STAIRS))); + $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); $this->map(Blocks::MOSSY_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_MOSSY)); $this->map(Blocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); - $this->map(Blocks::MOSSY_STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::MOSSY_STONE_BRICK_STAIRS))); + $this->mapStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), Ids::MOSSY_STONE_BRICK_STAIRS); $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); @@ -800,7 +804,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::NETHER_BRICKS(), fn() => new Writer(Ids::NETHER_BRICK)); $this->map(Blocks::NETHER_BRICK_FENCE(), fn() => new Writer(Ids::NETHER_BRICK_FENCE)); $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); - $this->map(Blocks::NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NETHER_BRICK_STAIRS))); + $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) @@ -831,7 +835,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_OAK)); $this->map(Blocks::OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::STANDING_SIGN))); $this->map(Blocks::OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_OAK)); - $this->map(Blocks::OAK_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::OAK_STAIRS))); + $this->mapStairs(Blocks::OAK_STAIRS(), Ids::OAK_STAIRS); $this->map(Blocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->map(Blocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); @@ -844,13 +848,13 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); - $this->map(Blocks::POLISHED_ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_ANDESITE_STAIRS))); + $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); - $this->map(Blocks::POLISHED_DIORITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_DIORITE_STAIRS))); + $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); $this->map(Blocks::POLISHED_GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE_SMOOTH)); $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); - $this->map(Blocks::POLISHED_GRANITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::POLISHED_GRANITE_STAIRS))); + $this->mapStairs(Blocks::POLISHED_GRANITE_STAIRS(), Ids::POLISHED_GRANITE_STAIRS); $this->map(Blocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); $this->map(Blocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); $this->map(Blocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ @@ -863,9 +867,9 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PRISMARINE_BRICKS(), fn() => Writer::create(Ids::PRISMARINE) ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_BRICKS)); $this->map(Blocks::PRISMARINE_BRICKS_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK)); - $this->map(Blocks::PRISMARINE_BRICKS_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_BRICKS_STAIRS))); + $this->mapStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), Ids::PRISMARINE_BRICKS_STAIRS); $this->map(Blocks::PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH)); - $this->map(Blocks::PRISMARINE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PRISMARINE_STAIRS))); + $this->mapStairs(Blocks::PRISMARINE_STAIRS(), Ids::PRISMARINE_STAIRS); $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); $this->map(Blocks::PUMPKIN(), function() : Writer{ return Writer::create(Ids::PUMPKIN) @@ -884,11 +888,11 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writePillarAxis($block->getAxis()); }); $this->map(Blocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); - $this->map(Blocks::PURPUR_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::PURPUR_STAIRS))); + $this->mapStairs(Blocks::PURPUR_STAIRS(), Ids::PURPUR_STAIRS); $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); - $this->map(Blocks::QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::QUARTZ_STAIRS))); + $this->mapStairs(Blocks::QUARTZ_STAIRS(), Ids::QUARTZ_STAIRS); $this->map(Blocks::RAIL(), function(Rail $block) : Writer{ return Writer::create(Ids::RAIL) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); @@ -919,13 +923,13 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); $this->map(Blocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); $this->map(Blocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); - $this->map(Blocks::RED_NETHER_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_NETHER_BRICK_STAIRS))); + $this->mapStairs(Blocks::RED_NETHER_BRICK_STAIRS(), Ids::RED_NETHER_BRICK_STAIRS); $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); $this->map(Blocks::RED_SAND(), fn() => Writer::create(Ids::SAND) ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_RED)); $this->map(Blocks::RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); $this->map(Blocks::RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE)); - $this->map(Blocks::RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::RED_SANDSTONE_STAIRS))); + $this->mapStairs(Blocks::RED_SANDSTONE_STAIRS(), Ids::RED_SANDSTONE_STAIRS); $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); $this->map(Blocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); @@ -935,7 +939,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); $this->map(Blocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); - $this->map(Blocks::SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SANDSTONE_STAIRS))); + $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); $this->map(Blocks::SEA_LANTERN(), fn() => new Writer(Ids::SEA_LANTERN)); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ @@ -948,13 +952,13 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); - $this->map(Blocks::SMOOTH_QUARTZ_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_QUARTZ_STAIRS))); + $this->mapStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), Ids::SMOOTH_QUARTZ_STAIRS); $this->map(Blocks::SMOOTH_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); $this->map(Blocks::SMOOTH_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE)); - $this->map(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_RED_SANDSTONE_STAIRS))); + $this->mapStairs(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), Ids::SMOOTH_RED_SANDSTONE_STAIRS); $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); - $this->map(Blocks::SMOOTH_SANDSTONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::SMOOTH_SANDSTONE_STAIRS))); + $this->mapStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), Ids::SMOOTH_SANDSTONE_STAIRS); $this->map(Blocks::SMOOTH_STONE(), fn() => new Writer(Ids::SMOOTH_STONE)); $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); $this->map(Blocks::SNOW(), fn() => new Writer(Ids::SNOW)); @@ -981,7 +985,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::SPRUCE_STANDING_SIGN))); $this->map(Blocks::SPRUCE_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_SPRUCE)); - $this->map(Blocks::SPRUCE_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::SPRUCE_STAIRS))); + $this->mapStairs(Blocks::SPRUCE_STAIRS(), Ids::SPRUCE_STAIRS); $this->map(Blocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); $this->map(Blocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); $this->map(Blocks::SPRUCE_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); @@ -1010,12 +1014,12 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); - $this->map(Blocks::STONE_BRICK_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::STONE_BRICK_STAIRS))); + $this->mapStairs(Blocks::STONE_BRICK_STAIRS(), Ids::STONE_BRICK_STAIRS); $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); $this->map(Blocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); $this->map(Blocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); $this->map(Blocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); - $this->map(Blocks::STONE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::NORMAL_STONE_STAIRS))); + $this->mapStairs(Blocks::STONE_STAIRS(), Ids::NORMAL_STONE_STAIRS); $this->map(Blocks::SUGARCANE(), function(Sugarcane $block) : Writer{ return Writer::create(Ids::REEDS) ->writeInt(StateNames::AGE, $block->getAge()); From 7750f9581ae8740aeae146c315580e80092334cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 21:03:25 +0100 Subject: [PATCH 0220/1858] BlockObjectToBlockStateSerializer: make adding stateless blocks less annoying --- .../BlockObjectToBlockStateSerializer.php | 392 +++++++++--------- 1 file changed, 198 insertions(+), 194 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 59f38aa4a0..dc2f772381 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -186,6 +186,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; } + public function mapSimple(Block $block, string $id) : void{ + $this->map($block, fn() => Writer::create($id)); + } + public function mapStairs(Stair $block, string $id) : void{ $this->map($block, fn(Stair $block) => Helper::encodeStairs($block, Writer::create($id))); } @@ -251,7 +255,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::AIR(), fn() => new Writer(Ids::AIR)); + $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); @@ -297,8 +301,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::OPEN_BIT, $block->isOpen()) ->writeFacingDirection($block->getFacing()); }); - $this->map(Blocks::BARRIER(), fn() => new Writer(Ids::BARRIER)); - $this->map(Blocks::BEACON(), fn() => new Writer(Ids::BEACON)); + $this->mapSimple(Blocks::BARRIER(), Ids::BARRIER); + $this->mapSimple(Blocks::BEACON(), Ids::BEACON); $this->map(Blocks::BED(), function(Bed $block) : Writer{ return Writer::create(Ids::BED) ->writeBool(StateNames::HEAD_PIECE_BIT, $block->isHeadPart()) @@ -335,7 +339,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); - $this->map(Blocks::BLUE_ICE(), fn() => new Writer(Ids::BLUE_ICE)); + $this->mapSimple(Blocks::BLUE_ICE(), Ids::BLUE_ICE); $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ @@ -343,18 +347,18 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::DEPRECATED, 0) ->writePillarAxis($block->getAxis()); }); - $this->map(Blocks::BOOKSHELF(), fn() => new Writer(Ids::BOOKSHELF)); + $this->mapSimple(Blocks::BOOKSHELF(), Ids::BOOKSHELF); $this->map(Blocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ return Writer::create(Ids::BREWING_STAND) ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); }); - $this->map(Blocks::BRICKS(), fn() => new Writer(Ids::BRICK_BLOCK)); + $this->mapSimple(Blocks::BRICKS(), Ids::BRICK_BLOCK); $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); - $this->map(Blocks::BROWN_MUSHROOM(), fn() => new Writer(Ids::BROWN_MUSHROOM)); + $this->mapSimple(Blocks::BROWN_MUSHROOM(), Ids::BROWN_MUSHROOM); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ return Writer::create(Ids::CACTUS) @@ -373,7 +377,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CARVED_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::CHEMICAL_HEAT(), fn() => new Writer(Ids::CHEMICAL_HEAT)); + $this->mapSimple(Blocks::CHEMICAL_HEAT(), Ids::CHEMICAL_HEAT); $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); @@ -382,14 +386,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); - $this->map(Blocks::CLAY(), fn() => new Writer(Ids::CLAY)); - $this->map(Blocks::COAL(), fn() => new Writer(Ids::COAL_BLOCK)); - $this->map(Blocks::COAL_ORE(), fn() => new Writer(Ids::COAL_ORE)); - $this->map(Blocks::COBBLESTONE(), fn() => new Writer(Ids::COBBLESTONE)); + $this->mapSimple(Blocks::CLAY(), Ids::CLAY); + $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); + $this->mapSimple(Blocks::COAL_ORE(), Ids::COAL_ORE); + $this->mapSimple(Blocks::COBBLESTONE(), Ids::COBBLESTONE); $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); - $this->map(Blocks::COBWEB(), fn() => new Writer(Ids::WEB)); + $this->mapSimple(Blocks::COBWEB(), Ids::WEB); $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ return Writer::create(Ids::COCOA) ->writeInt(StateNames::AGE, $block->getAge()) @@ -425,12 +429,12 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); - $this->map(Blocks::CRAFTING_TABLE(), fn() => new Writer(Ids::CRAFTING_TABLE)); + $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); - $this->map(Blocks::DANDELION(), fn() => new Writer(Ids::YELLOW_FLOWER)); + $this->mapSimple(Blocks::DANDELION(), Ids::YELLOW_FLOWER); $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); $this->map(Blocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) @@ -456,14 +460,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(Blocks::DEAD_BUSH(), fn() => new Writer(Ids::DEADBUSH)); + $this->mapSimple(Blocks::DEAD_BUSH(), Ids::DEADBUSH); $this->map(Blocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ return Writer::create(Ids::DETECTOR_RAIL) ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::DIAMOND(), fn() => new Writer(Ids::DIAMOND_BLOCK)); - $this->map(Blocks::DIAMOND_ORE(), fn() => new Writer(Ids::DIAMOND_ORE)); + $this->mapSimple(Blocks::DIAMOND(), Ids::DIAMOND_BLOCK); + $this->mapSimple(Blocks::DIAMOND_ORE(), Ids::DIAMOND_ORE); $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); @@ -473,135 +477,135 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(Blocks::DRAGON_EGG(), fn() => new Writer(Ids::DRAGON_EGG)); - $this->map(Blocks::DRIED_KELP(), fn() => new Writer(Ids::DRIED_KELP_BLOCK)); + $this->mapSimple(Blocks::DRAGON_EGG(), Ids::DRAGON_EGG); + $this->mapSimple(Blocks::DRIED_KELP(), Ids::DRIED_KELP_BLOCK); $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ return Writer::create(Ids::SHULKER_BOX) ->writeColor($block->getColor()); }); - $this->map(Blocks::ELEMENT_ACTINIUM(), fn() => new Writer(Ids::ELEMENT_89)); - $this->map(Blocks::ELEMENT_ALUMINUM(), fn() => new Writer(Ids::ELEMENT_13)); - $this->map(Blocks::ELEMENT_AMERICIUM(), fn() => new Writer(Ids::ELEMENT_95)); - $this->map(Blocks::ELEMENT_ANTIMONY(), fn() => new Writer(Ids::ELEMENT_51)); - $this->map(Blocks::ELEMENT_ARGON(), fn() => new Writer(Ids::ELEMENT_18)); - $this->map(Blocks::ELEMENT_ARSENIC(), fn() => new Writer(Ids::ELEMENT_33)); - $this->map(Blocks::ELEMENT_ASTATINE(), fn() => new Writer(Ids::ELEMENT_85)); - $this->map(Blocks::ELEMENT_BARIUM(), fn() => new Writer(Ids::ELEMENT_56)); - $this->map(Blocks::ELEMENT_BERKELIUM(), fn() => new Writer(Ids::ELEMENT_97)); - $this->map(Blocks::ELEMENT_BERYLLIUM(), fn() => new Writer(Ids::ELEMENT_4)); - $this->map(Blocks::ELEMENT_BISMUTH(), fn() => new Writer(Ids::ELEMENT_83)); - $this->map(Blocks::ELEMENT_BOHRIUM(), fn() => new Writer(Ids::ELEMENT_107)); - $this->map(Blocks::ELEMENT_BORON(), fn() => new Writer(Ids::ELEMENT_5)); - $this->map(Blocks::ELEMENT_BROMINE(), fn() => new Writer(Ids::ELEMENT_35)); - $this->map(Blocks::ELEMENT_CADMIUM(), fn() => new Writer(Ids::ELEMENT_48)); - $this->map(Blocks::ELEMENT_CALCIUM(), fn() => new Writer(Ids::ELEMENT_20)); - $this->map(Blocks::ELEMENT_CALIFORNIUM(), fn() => new Writer(Ids::ELEMENT_98)); - $this->map(Blocks::ELEMENT_CARBON(), fn() => new Writer(Ids::ELEMENT_6)); - $this->map(Blocks::ELEMENT_CERIUM(), fn() => new Writer(Ids::ELEMENT_58)); - $this->map(Blocks::ELEMENT_CESIUM(), fn() => new Writer(Ids::ELEMENT_55)); - $this->map(Blocks::ELEMENT_CHLORINE(), fn() => new Writer(Ids::ELEMENT_17)); - $this->map(Blocks::ELEMENT_CHROMIUM(), fn() => new Writer(Ids::ELEMENT_24)); - $this->map(Blocks::ELEMENT_COBALT(), fn() => new Writer(Ids::ELEMENT_27)); + $this->mapSimple(Blocks::ELEMENT_ACTINIUM(), Ids::ELEMENT_89); + $this->mapSimple(Blocks::ELEMENT_ALUMINUM(), Ids::ELEMENT_13); + $this->mapSimple(Blocks::ELEMENT_AMERICIUM(), Ids::ELEMENT_95); + $this->mapSimple(Blocks::ELEMENT_ANTIMONY(), Ids::ELEMENT_51); + $this->mapSimple(Blocks::ELEMENT_ARGON(), Ids::ELEMENT_18); + $this->mapSimple(Blocks::ELEMENT_ARSENIC(), Ids::ELEMENT_33); + $this->mapSimple(Blocks::ELEMENT_ASTATINE(), Ids::ELEMENT_85); + $this->mapSimple(Blocks::ELEMENT_BARIUM(), Ids::ELEMENT_56); + $this->mapSimple(Blocks::ELEMENT_BERKELIUM(), Ids::ELEMENT_97); + $this->mapSimple(Blocks::ELEMENT_BERYLLIUM(), Ids::ELEMENT_4); + $this->mapSimple(Blocks::ELEMENT_BISMUTH(), Ids::ELEMENT_83); + $this->mapSimple(Blocks::ELEMENT_BOHRIUM(), Ids::ELEMENT_107); + $this->mapSimple(Blocks::ELEMENT_BORON(), Ids::ELEMENT_5); + $this->mapSimple(Blocks::ELEMENT_BROMINE(), Ids::ELEMENT_35); + $this->mapSimple(Blocks::ELEMENT_CADMIUM(), Ids::ELEMENT_48); + $this->mapSimple(Blocks::ELEMENT_CALCIUM(), Ids::ELEMENT_20); + $this->mapSimple(Blocks::ELEMENT_CALIFORNIUM(), Ids::ELEMENT_98); + $this->mapSimple(Blocks::ELEMENT_CARBON(), Ids::ELEMENT_6); + $this->mapSimple(Blocks::ELEMENT_CERIUM(), Ids::ELEMENT_58); + $this->mapSimple(Blocks::ELEMENT_CESIUM(), Ids::ELEMENT_55); + $this->mapSimple(Blocks::ELEMENT_CHLORINE(), Ids::ELEMENT_17); + $this->mapSimple(Blocks::ELEMENT_CHROMIUM(), Ids::ELEMENT_24); + $this->mapSimple(Blocks::ELEMENT_COBALT(), Ids::ELEMENT_27); $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::ELEMENT_COPERNICIUM(), fn() => new Writer(Ids::ELEMENT_112)); - $this->map(Blocks::ELEMENT_COPPER(), fn() => new Writer(Ids::ELEMENT_29)); - $this->map(Blocks::ELEMENT_CURIUM(), fn() => new Writer(Ids::ELEMENT_96)); - $this->map(Blocks::ELEMENT_DARMSTADTIUM(), fn() => new Writer(Ids::ELEMENT_110)); - $this->map(Blocks::ELEMENT_DUBNIUM(), fn() => new Writer(Ids::ELEMENT_105)); - $this->map(Blocks::ELEMENT_DYSPROSIUM(), fn() => new Writer(Ids::ELEMENT_66)); - $this->map(Blocks::ELEMENT_EINSTEINIUM(), fn() => new Writer(Ids::ELEMENT_99)); - $this->map(Blocks::ELEMENT_ERBIUM(), fn() => new Writer(Ids::ELEMENT_68)); - $this->map(Blocks::ELEMENT_EUROPIUM(), fn() => new Writer(Ids::ELEMENT_63)); - $this->map(Blocks::ELEMENT_FERMIUM(), fn() => new Writer(Ids::ELEMENT_100)); - $this->map(Blocks::ELEMENT_FLEROVIUM(), fn() => new Writer(Ids::ELEMENT_114)); - $this->map(Blocks::ELEMENT_FLUORINE(), fn() => new Writer(Ids::ELEMENT_9)); - $this->map(Blocks::ELEMENT_FRANCIUM(), fn() => new Writer(Ids::ELEMENT_87)); - $this->map(Blocks::ELEMENT_GADOLINIUM(), fn() => new Writer(Ids::ELEMENT_64)); - $this->map(Blocks::ELEMENT_GALLIUM(), fn() => new Writer(Ids::ELEMENT_31)); - $this->map(Blocks::ELEMENT_GERMANIUM(), fn() => new Writer(Ids::ELEMENT_32)); - $this->map(Blocks::ELEMENT_GOLD(), fn() => new Writer(Ids::ELEMENT_79)); - $this->map(Blocks::ELEMENT_HAFNIUM(), fn() => new Writer(Ids::ELEMENT_72)); - $this->map(Blocks::ELEMENT_HASSIUM(), fn() => new Writer(Ids::ELEMENT_108)); - $this->map(Blocks::ELEMENT_HELIUM(), fn() => new Writer(Ids::ELEMENT_2)); - $this->map(Blocks::ELEMENT_HOLMIUM(), fn() => new Writer(Ids::ELEMENT_67)); - $this->map(Blocks::ELEMENT_HYDROGEN(), fn() => new Writer(Ids::ELEMENT_1)); - $this->map(Blocks::ELEMENT_INDIUM(), fn() => new Writer(Ids::ELEMENT_49)); - $this->map(Blocks::ELEMENT_IODINE(), fn() => new Writer(Ids::ELEMENT_53)); - $this->map(Blocks::ELEMENT_IRIDIUM(), fn() => new Writer(Ids::ELEMENT_77)); - $this->map(Blocks::ELEMENT_IRON(), fn() => new Writer(Ids::ELEMENT_26)); - $this->map(Blocks::ELEMENT_KRYPTON(), fn() => new Writer(Ids::ELEMENT_36)); - $this->map(Blocks::ELEMENT_LANTHANUM(), fn() => new Writer(Ids::ELEMENT_57)); - $this->map(Blocks::ELEMENT_LAWRENCIUM(), fn() => new Writer(Ids::ELEMENT_103)); - $this->map(Blocks::ELEMENT_LEAD(), fn() => new Writer(Ids::ELEMENT_82)); - $this->map(Blocks::ELEMENT_LITHIUM(), fn() => new Writer(Ids::ELEMENT_3)); - $this->map(Blocks::ELEMENT_LIVERMORIUM(), fn() => new Writer(Ids::ELEMENT_116)); - $this->map(Blocks::ELEMENT_LUTETIUM(), fn() => new Writer(Ids::ELEMENT_71)); - $this->map(Blocks::ELEMENT_MAGNESIUM(), fn() => new Writer(Ids::ELEMENT_12)); - $this->map(Blocks::ELEMENT_MANGANESE(), fn() => new Writer(Ids::ELEMENT_25)); - $this->map(Blocks::ELEMENT_MEITNERIUM(), fn() => new Writer(Ids::ELEMENT_109)); - $this->map(Blocks::ELEMENT_MENDELEVIUM(), fn() => new Writer(Ids::ELEMENT_101)); - $this->map(Blocks::ELEMENT_MERCURY(), fn() => new Writer(Ids::ELEMENT_80)); - $this->map(Blocks::ELEMENT_MOLYBDENUM(), fn() => new Writer(Ids::ELEMENT_42)); - $this->map(Blocks::ELEMENT_MOSCOVIUM(), fn() => new Writer(Ids::ELEMENT_115)); - $this->map(Blocks::ELEMENT_NEODYMIUM(), fn() => new Writer(Ids::ELEMENT_60)); - $this->map(Blocks::ELEMENT_NEON(), fn() => new Writer(Ids::ELEMENT_10)); - $this->map(Blocks::ELEMENT_NEPTUNIUM(), fn() => new Writer(Ids::ELEMENT_93)); - $this->map(Blocks::ELEMENT_NICKEL(), fn() => new Writer(Ids::ELEMENT_28)); - $this->map(Blocks::ELEMENT_NIHONIUM(), fn() => new Writer(Ids::ELEMENT_113)); - $this->map(Blocks::ELEMENT_NIOBIUM(), fn() => new Writer(Ids::ELEMENT_41)); - $this->map(Blocks::ELEMENT_NITROGEN(), fn() => new Writer(Ids::ELEMENT_7)); - $this->map(Blocks::ELEMENT_NOBELIUM(), fn() => new Writer(Ids::ELEMENT_102)); - $this->map(Blocks::ELEMENT_OGANESSON(), fn() => new Writer(Ids::ELEMENT_118)); - $this->map(Blocks::ELEMENT_OSMIUM(), fn() => new Writer(Ids::ELEMENT_76)); - $this->map(Blocks::ELEMENT_OXYGEN(), fn() => new Writer(Ids::ELEMENT_8)); - $this->map(Blocks::ELEMENT_PALLADIUM(), fn() => new Writer(Ids::ELEMENT_46)); - $this->map(Blocks::ELEMENT_PHOSPHORUS(), fn() => new Writer(Ids::ELEMENT_15)); - $this->map(Blocks::ELEMENT_PLATINUM(), fn() => new Writer(Ids::ELEMENT_78)); - $this->map(Blocks::ELEMENT_PLUTONIUM(), fn() => new Writer(Ids::ELEMENT_94)); - $this->map(Blocks::ELEMENT_POLONIUM(), fn() => new Writer(Ids::ELEMENT_84)); - $this->map(Blocks::ELEMENT_POTASSIUM(), fn() => new Writer(Ids::ELEMENT_19)); - $this->map(Blocks::ELEMENT_PRASEODYMIUM(), fn() => new Writer(Ids::ELEMENT_59)); - $this->map(Blocks::ELEMENT_PROMETHIUM(), fn() => new Writer(Ids::ELEMENT_61)); - $this->map(Blocks::ELEMENT_PROTACTINIUM(), fn() => new Writer(Ids::ELEMENT_91)); - $this->map(Blocks::ELEMENT_RADIUM(), fn() => new Writer(Ids::ELEMENT_88)); - $this->map(Blocks::ELEMENT_RADON(), fn() => new Writer(Ids::ELEMENT_86)); - $this->map(Blocks::ELEMENT_RHENIUM(), fn() => new Writer(Ids::ELEMENT_75)); - $this->map(Blocks::ELEMENT_RHODIUM(), fn() => new Writer(Ids::ELEMENT_45)); - $this->map(Blocks::ELEMENT_ROENTGENIUM(), fn() => new Writer(Ids::ELEMENT_111)); - $this->map(Blocks::ELEMENT_RUBIDIUM(), fn() => new Writer(Ids::ELEMENT_37)); - $this->map(Blocks::ELEMENT_RUTHENIUM(), fn() => new Writer(Ids::ELEMENT_44)); - $this->map(Blocks::ELEMENT_RUTHERFORDIUM(), fn() => new Writer(Ids::ELEMENT_104)); - $this->map(Blocks::ELEMENT_SAMARIUM(), fn() => new Writer(Ids::ELEMENT_62)); - $this->map(Blocks::ELEMENT_SCANDIUM(), fn() => new Writer(Ids::ELEMENT_21)); - $this->map(Blocks::ELEMENT_SEABORGIUM(), fn() => new Writer(Ids::ELEMENT_106)); - $this->map(Blocks::ELEMENT_SELENIUM(), fn() => new Writer(Ids::ELEMENT_34)); - $this->map(Blocks::ELEMENT_SILICON(), fn() => new Writer(Ids::ELEMENT_14)); - $this->map(Blocks::ELEMENT_SILVER(), fn() => new Writer(Ids::ELEMENT_47)); - $this->map(Blocks::ELEMENT_SODIUM(), fn() => new Writer(Ids::ELEMENT_11)); - $this->map(Blocks::ELEMENT_STRONTIUM(), fn() => new Writer(Ids::ELEMENT_38)); - $this->map(Blocks::ELEMENT_SULFUR(), fn() => new Writer(Ids::ELEMENT_16)); - $this->map(Blocks::ELEMENT_TANTALUM(), fn() => new Writer(Ids::ELEMENT_73)); - $this->map(Blocks::ELEMENT_TECHNETIUM(), fn() => new Writer(Ids::ELEMENT_43)); - $this->map(Blocks::ELEMENT_TELLURIUM(), fn() => new Writer(Ids::ELEMENT_52)); - $this->map(Blocks::ELEMENT_TENNESSINE(), fn() => new Writer(Ids::ELEMENT_117)); - $this->map(Blocks::ELEMENT_TERBIUM(), fn() => new Writer(Ids::ELEMENT_65)); - $this->map(Blocks::ELEMENT_THALLIUM(), fn() => new Writer(Ids::ELEMENT_81)); - $this->map(Blocks::ELEMENT_THORIUM(), fn() => new Writer(Ids::ELEMENT_90)); - $this->map(Blocks::ELEMENT_THULIUM(), fn() => new Writer(Ids::ELEMENT_69)); - $this->map(Blocks::ELEMENT_TIN(), fn() => new Writer(Ids::ELEMENT_50)); - $this->map(Blocks::ELEMENT_TITANIUM(), fn() => new Writer(Ids::ELEMENT_22)); - $this->map(Blocks::ELEMENT_TUNGSTEN(), fn() => new Writer(Ids::ELEMENT_74)); - $this->map(Blocks::ELEMENT_URANIUM(), fn() => new Writer(Ids::ELEMENT_92)); - $this->map(Blocks::ELEMENT_VANADIUM(), fn() => new Writer(Ids::ELEMENT_23)); - $this->map(Blocks::ELEMENT_XENON(), fn() => new Writer(Ids::ELEMENT_54)); - $this->map(Blocks::ELEMENT_YTTERBIUM(), fn() => new Writer(Ids::ELEMENT_70)); - $this->map(Blocks::ELEMENT_YTTRIUM(), fn() => new Writer(Ids::ELEMENT_39)); - $this->map(Blocks::ELEMENT_ZERO(), fn() => new Writer(Ids::ELEMENT_0)); - $this->map(Blocks::ELEMENT_ZINC(), fn() => new Writer(Ids::ELEMENT_30)); - $this->map(Blocks::ELEMENT_ZIRCONIUM(), fn() => new Writer(Ids::ELEMENT_40)); - $this->map(Blocks::EMERALD(), fn() => new Writer(Ids::EMERALD_BLOCK)); - $this->map(Blocks::EMERALD_ORE(), fn() => new Writer(Ids::EMERALD_ORE)); - $this->map(Blocks::ENCHANTING_TABLE(), fn() => new Writer(Ids::ENCHANTING_TABLE)); + $this->mapSimple(Blocks::ELEMENT_COPERNICIUM(), Ids::ELEMENT_112); + $this->mapSimple(Blocks::ELEMENT_COPPER(), Ids::ELEMENT_29); + $this->mapSimple(Blocks::ELEMENT_CURIUM(), Ids::ELEMENT_96); + $this->mapSimple(Blocks::ELEMENT_DARMSTADTIUM(), Ids::ELEMENT_110); + $this->mapSimple(Blocks::ELEMENT_DUBNIUM(), Ids::ELEMENT_105); + $this->mapSimple(Blocks::ELEMENT_DYSPROSIUM(), Ids::ELEMENT_66); + $this->mapSimple(Blocks::ELEMENT_EINSTEINIUM(), Ids::ELEMENT_99); + $this->mapSimple(Blocks::ELEMENT_ERBIUM(), Ids::ELEMENT_68); + $this->mapSimple(Blocks::ELEMENT_EUROPIUM(), Ids::ELEMENT_63); + $this->mapSimple(Blocks::ELEMENT_FERMIUM(), Ids::ELEMENT_100); + $this->mapSimple(Blocks::ELEMENT_FLEROVIUM(), Ids::ELEMENT_114); + $this->mapSimple(Blocks::ELEMENT_FLUORINE(), Ids::ELEMENT_9); + $this->mapSimple(Blocks::ELEMENT_FRANCIUM(), Ids::ELEMENT_87); + $this->mapSimple(Blocks::ELEMENT_GADOLINIUM(), Ids::ELEMENT_64); + $this->mapSimple(Blocks::ELEMENT_GALLIUM(), Ids::ELEMENT_31); + $this->mapSimple(Blocks::ELEMENT_GERMANIUM(), Ids::ELEMENT_32); + $this->mapSimple(Blocks::ELEMENT_GOLD(), Ids::ELEMENT_79); + $this->mapSimple(Blocks::ELEMENT_HAFNIUM(), Ids::ELEMENT_72); + $this->mapSimple(Blocks::ELEMENT_HASSIUM(), Ids::ELEMENT_108); + $this->mapSimple(Blocks::ELEMENT_HELIUM(), Ids::ELEMENT_2); + $this->mapSimple(Blocks::ELEMENT_HOLMIUM(), Ids::ELEMENT_67); + $this->mapSimple(Blocks::ELEMENT_HYDROGEN(), Ids::ELEMENT_1); + $this->mapSimple(Blocks::ELEMENT_INDIUM(), Ids::ELEMENT_49); + $this->mapSimple(Blocks::ELEMENT_IODINE(), Ids::ELEMENT_53); + $this->mapSimple(Blocks::ELEMENT_IRIDIUM(), Ids::ELEMENT_77); + $this->mapSimple(Blocks::ELEMENT_IRON(), Ids::ELEMENT_26); + $this->mapSimple(Blocks::ELEMENT_KRYPTON(), Ids::ELEMENT_36); + $this->mapSimple(Blocks::ELEMENT_LANTHANUM(), Ids::ELEMENT_57); + $this->mapSimple(Blocks::ELEMENT_LAWRENCIUM(), Ids::ELEMENT_103); + $this->mapSimple(Blocks::ELEMENT_LEAD(), Ids::ELEMENT_82); + $this->mapSimple(Blocks::ELEMENT_LITHIUM(), Ids::ELEMENT_3); + $this->mapSimple(Blocks::ELEMENT_LIVERMORIUM(), Ids::ELEMENT_116); + $this->mapSimple(Blocks::ELEMENT_LUTETIUM(), Ids::ELEMENT_71); + $this->mapSimple(Blocks::ELEMENT_MAGNESIUM(), Ids::ELEMENT_12); + $this->mapSimple(Blocks::ELEMENT_MANGANESE(), Ids::ELEMENT_25); + $this->mapSimple(Blocks::ELEMENT_MEITNERIUM(), Ids::ELEMENT_109); + $this->mapSimple(Blocks::ELEMENT_MENDELEVIUM(), Ids::ELEMENT_101); + $this->mapSimple(Blocks::ELEMENT_MERCURY(), Ids::ELEMENT_80); + $this->mapSimple(Blocks::ELEMENT_MOLYBDENUM(), Ids::ELEMENT_42); + $this->mapSimple(Blocks::ELEMENT_MOSCOVIUM(), Ids::ELEMENT_115); + $this->mapSimple(Blocks::ELEMENT_NEODYMIUM(), Ids::ELEMENT_60); + $this->mapSimple(Blocks::ELEMENT_NEON(), Ids::ELEMENT_10); + $this->mapSimple(Blocks::ELEMENT_NEPTUNIUM(), Ids::ELEMENT_93); + $this->mapSimple(Blocks::ELEMENT_NICKEL(), Ids::ELEMENT_28); + $this->mapSimple(Blocks::ELEMENT_NIHONIUM(), Ids::ELEMENT_113); + $this->mapSimple(Blocks::ELEMENT_NIOBIUM(), Ids::ELEMENT_41); + $this->mapSimple(Blocks::ELEMENT_NITROGEN(), Ids::ELEMENT_7); + $this->mapSimple(Blocks::ELEMENT_NOBELIUM(), Ids::ELEMENT_102); + $this->mapSimple(Blocks::ELEMENT_OGANESSON(), Ids::ELEMENT_118); + $this->mapSimple(Blocks::ELEMENT_OSMIUM(), Ids::ELEMENT_76); + $this->mapSimple(Blocks::ELEMENT_OXYGEN(), Ids::ELEMENT_8); + $this->mapSimple(Blocks::ELEMENT_PALLADIUM(), Ids::ELEMENT_46); + $this->mapSimple(Blocks::ELEMENT_PHOSPHORUS(), Ids::ELEMENT_15); + $this->mapSimple(Blocks::ELEMENT_PLATINUM(), Ids::ELEMENT_78); + $this->mapSimple(Blocks::ELEMENT_PLUTONIUM(), Ids::ELEMENT_94); + $this->mapSimple(Blocks::ELEMENT_POLONIUM(), Ids::ELEMENT_84); + $this->mapSimple(Blocks::ELEMENT_POTASSIUM(), Ids::ELEMENT_19); + $this->mapSimple(Blocks::ELEMENT_PRASEODYMIUM(), Ids::ELEMENT_59); + $this->mapSimple(Blocks::ELEMENT_PROMETHIUM(), Ids::ELEMENT_61); + $this->mapSimple(Blocks::ELEMENT_PROTACTINIUM(), Ids::ELEMENT_91); + $this->mapSimple(Blocks::ELEMENT_RADIUM(), Ids::ELEMENT_88); + $this->mapSimple(Blocks::ELEMENT_RADON(), Ids::ELEMENT_86); + $this->mapSimple(Blocks::ELEMENT_RHENIUM(), Ids::ELEMENT_75); + $this->mapSimple(Blocks::ELEMENT_RHODIUM(), Ids::ELEMENT_45); + $this->mapSimple(Blocks::ELEMENT_ROENTGENIUM(), Ids::ELEMENT_111); + $this->mapSimple(Blocks::ELEMENT_RUBIDIUM(), Ids::ELEMENT_37); + $this->mapSimple(Blocks::ELEMENT_RUTHENIUM(), Ids::ELEMENT_44); + $this->mapSimple(Blocks::ELEMENT_RUTHERFORDIUM(), Ids::ELEMENT_104); + $this->mapSimple(Blocks::ELEMENT_SAMARIUM(), Ids::ELEMENT_62); + $this->mapSimple(Blocks::ELEMENT_SCANDIUM(), Ids::ELEMENT_21); + $this->mapSimple(Blocks::ELEMENT_SEABORGIUM(), Ids::ELEMENT_106); + $this->mapSimple(Blocks::ELEMENT_SELENIUM(), Ids::ELEMENT_34); + $this->mapSimple(Blocks::ELEMENT_SILICON(), Ids::ELEMENT_14); + $this->mapSimple(Blocks::ELEMENT_SILVER(), Ids::ELEMENT_47); + $this->mapSimple(Blocks::ELEMENT_SODIUM(), Ids::ELEMENT_11); + $this->mapSimple(Blocks::ELEMENT_STRONTIUM(), Ids::ELEMENT_38); + $this->mapSimple(Blocks::ELEMENT_SULFUR(), Ids::ELEMENT_16); + $this->mapSimple(Blocks::ELEMENT_TANTALUM(), Ids::ELEMENT_73); + $this->mapSimple(Blocks::ELEMENT_TECHNETIUM(), Ids::ELEMENT_43); + $this->mapSimple(Blocks::ELEMENT_TELLURIUM(), Ids::ELEMENT_52); + $this->mapSimple(Blocks::ELEMENT_TENNESSINE(), Ids::ELEMENT_117); + $this->mapSimple(Blocks::ELEMENT_TERBIUM(), Ids::ELEMENT_65); + $this->mapSimple(Blocks::ELEMENT_THALLIUM(), Ids::ELEMENT_81); + $this->mapSimple(Blocks::ELEMENT_THORIUM(), Ids::ELEMENT_90); + $this->mapSimple(Blocks::ELEMENT_THULIUM(), Ids::ELEMENT_69); + $this->mapSimple(Blocks::ELEMENT_TIN(), Ids::ELEMENT_50); + $this->mapSimple(Blocks::ELEMENT_TITANIUM(), Ids::ELEMENT_22); + $this->mapSimple(Blocks::ELEMENT_TUNGSTEN(), Ids::ELEMENT_74); + $this->mapSimple(Blocks::ELEMENT_URANIUM(), Ids::ELEMENT_92); + $this->mapSimple(Blocks::ELEMENT_VANADIUM(), Ids::ELEMENT_23); + $this->mapSimple(Blocks::ELEMENT_XENON(), Ids::ELEMENT_54); + $this->mapSimple(Blocks::ELEMENT_YTTERBIUM(), Ids::ELEMENT_70); + $this->mapSimple(Blocks::ELEMENT_YTTRIUM(), Ids::ELEMENT_39); + $this->mapSimple(Blocks::ELEMENT_ZERO(), Ids::ELEMENT_0); + $this->mapSimple(Blocks::ELEMENT_ZINC(), Ids::ELEMENT_30); + $this->mapSimple(Blocks::ELEMENT_ZIRCONIUM(), Ids::ELEMENT_40); + $this->mapSimple(Blocks::EMERALD(), Ids::EMERALD_BLOCK); + $this->mapSimple(Blocks::EMERALD_ORE(), Ids::EMERALD_ORE); + $this->mapSimple(Blocks::ENCHANTING_TABLE(), Ids::ENCHANTING_TABLE); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) ->writeHorizontalFacing($block->getFacing()); @@ -615,8 +619,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::END_ROD) ->writeEndRodFacingDirection($block->getFacing()); }); - $this->map(Blocks::END_STONE(), fn() => new Writer(Ids::END_STONE)); - $this->map(Blocks::END_STONE_BRICKS(), fn() => new Writer(Ids::END_BRICKS)); + $this->mapSimple(Blocks::END_STONE(), Ids::END_STONE); + $this->mapSimple(Blocks::END_STONE_BRICKS(), Ids::END_BRICKS); $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); @@ -631,7 +635,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::FIRE) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(Blocks::FLETCHING_TABLE(), fn() => new Writer(Ids::FLETCHING_TABLE)); + $this->mapSimple(Blocks::FLETCHING_TABLE(), Ids::FLETCHING_TABLE); $this->map(Blocks::FLOWER_POT(), function() : Writer{ return Writer::create(Ids::FLOWER_POT) ->writeBool(StateNames::UPDATE_BIT, true); //to keep MCPE happy @@ -641,8 +645,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::AGE, $block->getAge()); }); $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); - $this->map(Blocks::GLASS(), fn() => new Writer(Ids::GLASS)); - $this->map(Blocks::GLASS_PANE(), fn() => new Writer(Ids::GLASS_PANE)); + $this->mapSimple(Blocks::GLASS(), Ids::GLASS); + $this->mapSimple(Blocks::GLASS_PANE(), Ids::GLASS_PANE); $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ return Writer::create(match ($color = $block->getColor()) { DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, @@ -665,21 +669,21 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::GLOWING_OBSIDIAN(), fn() => new Writer(Ids::GLOWINGOBSIDIAN)); - $this->map(Blocks::GLOWSTONE(), fn() => new Writer(Ids::GLOWSTONE)); - $this->map(Blocks::GOLD(), fn() => new Writer(Ids::GOLD_BLOCK)); - $this->map(Blocks::GOLD_ORE(), fn() => new Writer(Ids::GOLD_ORE)); + $this->mapSimple(Blocks::GLOWING_OBSIDIAN(), Ids::GLOWINGOBSIDIAN); + $this->mapSimple(Blocks::GLOWSTONE(), Ids::GLOWSTONE); + $this->mapSimple(Blocks::GOLD(), Ids::GOLD_BLOCK); + $this->mapSimple(Blocks::GOLD_ORE(), Ids::GOLD_ORE); $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); - $this->map(Blocks::GRASS(), fn() => new Writer(Ids::GRASS)); - $this->map(Blocks::GRASS_PATH(), fn() => new Writer(Ids::GRASS_PATH)); - $this->map(Blocks::GRAVEL(), fn() => new Writer(Ids::GRAVEL)); + $this->mapSimple(Blocks::GRASS(), Ids::GRASS); + $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); + $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); - $this->map(Blocks::HARDENED_CLAY(), fn() => new Writer(Ids::HARDENED_CLAY)); - $this->map(Blocks::HARDENED_GLASS(), fn() => new Writer(Ids::HARD_GLASS)); - $this->map(Blocks::HARDENED_GLASS_PANE(), fn() => new Writer(Ids::HARD_GLASS_PANE)); + $this->mapSimple(Blocks::HARDENED_CLAY(), Ids::HARDENED_CLAY); + $this->mapSimple(Blocks::HARDENED_GLASS(), Ids::HARD_GLASS); + $this->mapSimple(Blocks::HARDENED_GLASS_PANE(), Ids::HARD_GLASS_PANE); $this->map(Blocks::HAY_BALE(), function(HayBale $block) : Writer{ return Writer::create(Ids::HAY_BLOCK) ->writeInt(StateNames::DEPRECATED, 0) @@ -690,7 +694,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::TOGGLE_BIT, $block->isPowered()) ->writeFacingWithoutUp($block->getFacing()); }); - $this->map(Blocks::ICE(), fn() => new Writer(Ids::ICE)); + $this->mapSimple(Blocks::ICE(), Ids::ICE); $this->map(Blocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); $this->map(Blocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) @@ -703,13 +707,13 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); $this->map(Blocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); - $this->map(Blocks::INFO_UPDATE(), fn() => new Writer(Ids::INFO_UPDATE)); - $this->map(Blocks::INFO_UPDATE2(), fn() => new Writer(Ids::INFO_UPDATE2)); - $this->map(Blocks::INVISIBLE_BEDROCK(), fn() => new Writer(Ids::INVISIBLE_BEDROCK)); - $this->map(Blocks::IRON(), fn() => new Writer(Ids::IRON_BLOCK)); - $this->map(Blocks::IRON_BARS(), fn() => new Writer(Ids::IRON_BARS)); + $this->mapSimple(Blocks::INFO_UPDATE(), Ids::INFO_UPDATE); + $this->mapSimple(Blocks::INFO_UPDATE2(), Ids::INFO_UPDATE2); + $this->mapSimple(Blocks::INVISIBLE_BEDROCK(), Ids::INVISIBLE_BEDROCK); + $this->mapSimple(Blocks::IRON(), Ids::IRON_BLOCK); + $this->mapSimple(Blocks::IRON_BARS(), Ids::IRON_BARS); $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); - $this->map(Blocks::IRON_ORE(), fn() => new Writer(Ids::IRON_ORE)); + $this->mapSimple(Blocks::IRON_ORE(), Ids::IRON_ORE); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ return Writer::create(Ids::FRAME) @@ -717,7 +721,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) ->writeFacingDirection($block->getFacing()); }); - $this->map(Blocks::JUKEBOX(), fn() => new Writer(Ids::JUKEBOX)); + $this->mapSimple(Blocks::JUKEBOX(), Ids::JUKEBOX); $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); $this->map(Blocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) @@ -744,8 +748,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LANTERN) ->writeBool(StateNames::HANGING, $block->isHanging()); }); - $this->map(Blocks::LAPIS_LAZULI(), fn() => new Writer(Ids::LAPIS_BLOCK)); - $this->map(Blocks::LAPIS_LAZULI_ORE(), fn() => new Writer(Ids::LAPIS_ORE)); + $this->mapSimple(Blocks::LAPIS_LAZULI(), Ids::LAPIS_BLOCK); + $this->mapSimple(Blocks::LAPIS_LAZULI_ORE(), Ids::LAPIS_ORE); $this->map(Blocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); $this->map(Blocks::LECTERN(), function(Lectern $block) : Writer{ @@ -753,7 +757,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isProducingSignal()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::LEGACY_STONECUTTER(), fn() => new Writer(Ids::STONECUTTER)); + $this->mapSimple(Blocks::LEGACY_STONECUTTER(), Ids::STONECUTTER); $this->map(Blocks::LEVER(), function(Lever $block) : Writer{ return Writer::create(Ids::LEVER) ->writeBool(StateNames::OPEN_BIT, $block->isActivated()) @@ -771,7 +775,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); - $this->map(Blocks::LILY_PAD(), fn() => new Writer(Ids::WATERLILY)); + $this->mapSimple(Blocks::LILY_PAD(), Ids::WATERLILY); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); @@ -780,16 +784,16 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LOOM) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::MAGMA(), fn() => new Writer(Ids::MAGMA)); + $this->mapSimple(Blocks::MAGMA(), Ids::MAGMA); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::MELON(), fn() => new Writer(Ids::MELON_BLOCK)); + $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); $this->map(Blocks::MOB_HEAD(), function(Skull $block) : Writer{ return Writer::create(Ids::SKULL) ->writeFacingWithoutDown($block->getFacing()); }); - $this->map(Blocks::MONSTER_SPAWNER(), fn() => new Writer(Ids::MOB_SPAWNER)); - $this->map(Blocks::MOSSY_COBBLESTONE(), fn() => new Writer(Ids::MOSSY_COBBLESTONE)); + $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); + $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); $this->map(Blocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); @@ -799,10 +803,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); - $this->map(Blocks::MYCELIUM(), fn() => new Writer(Ids::MYCELIUM)); - $this->map(Blocks::NETHERRACK(), fn() => new Writer(Ids::NETHERRACK)); - $this->map(Blocks::NETHER_BRICKS(), fn() => new Writer(Ids::NETHER_BRICK)); - $this->map(Blocks::NETHER_BRICK_FENCE(), fn() => new Writer(Ids::NETHER_BRICK_FENCE)); + $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); + $this->mapSimple(Blocks::NETHERRACK(), Ids::NETHERRACK); + $this->mapSimple(Blocks::NETHER_BRICKS(), Ids::NETHER_BRICK); + $this->mapSimple(Blocks::NETHER_BRICK_FENCE(), Ids::NETHER_BRICK_FENCE); $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); @@ -814,14 +818,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), }); }); - $this->map(Blocks::NETHER_QUARTZ_ORE(), fn() => new Writer(Ids::QUARTZ_ORE)); - $this->map(Blocks::NETHER_REACTOR_CORE(), fn() => new Writer(Ids::NETHERREACTOR)); + $this->mapSimple(Blocks::NETHER_QUARTZ_ORE(), Ids::QUARTZ_ORE); + $this->mapSimple(Blocks::NETHER_REACTOR_CORE(), Ids::NETHERREACTOR); $this->map(Blocks::NETHER_WART(), function(NetherWartPlant $block) : Writer{ return Writer::create(Ids::NETHER_WART) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(Blocks::NETHER_WART_BLOCK(), fn() => new Writer(Ids::NETHER_WART_BLOCK)); - $this->map(Blocks::NOTE_BLOCK(), fn() => new Writer(Ids::NOTEBLOCK)); + $this->mapSimple(Blocks::NETHER_WART_BLOCK(), Ids::NETHER_WART_BLOCK); + $this->mapSimple(Blocks::NOTE_BLOCK(), Ids::NOTEBLOCK); $this->map(Blocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); $this->map(Blocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); $this->map(Blocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) @@ -839,13 +843,13 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->map(Blocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::OBSIDIAN(), fn() => new Writer(Ids::OBSIDIAN)); + $this->mapSimple(Blocks::OBSIDIAN(), Ids::OBSIDIAN); $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); - $this->map(Blocks::PACKED_ICE(), fn() => new Writer(Ids::PACKED_ICE)); + $this->mapSimple(Blocks::PACKED_ICE(), Ids::PACKED_ICE); $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); - $this->map(Blocks::PODZOL(), fn() => new Writer(Ids::PODZOL)); + $this->mapSimple(Blocks::PODZOL(), Ids::PODZOL); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); @@ -897,7 +901,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::RAIL) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::REDSTONE(), fn() => new Writer(Ids::REDSTONE_BLOCK)); + $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : Writer{ return Writer::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) ->writeBool(StateNames::OUTPUT_LIT_BIT, $block->isPowered()) @@ -919,9 +923,9 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::REDSTONE_WIRE) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->map(Blocks::RED_MUSHROOM(), fn() => new Writer(Ids::RED_MUSHROOM)); + $this->mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); - $this->map(Blocks::RED_NETHER_BRICKS(), fn() => new Writer(Ids::RED_NETHER_BRICK)); + $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); $this->map(Blocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); $this->mapStairs(Blocks::RED_NETHER_BRICK_STAIRS(), Ids::RED_NETHER_BRICK_STAIRS); $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); @@ -933,7 +937,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); $this->map(Blocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); - $this->map(Blocks::RESERVED6(), fn() => new Writer(Ids::RESERVED6)); + $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); @@ -941,14 +945,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); - $this->map(Blocks::SEA_LANTERN(), fn() => new Writer(Ids::SEA_LANTERN)); + $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ return Writer::create(Ids::SEA_PICKLE) ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) ->writeInt(StateNames::CLUSTER_COUNT, $block->getCount() - 1); }); - $this->map(Blocks::SHULKER_BOX(), fn() => new Writer(Ids::UNDYED_SHULKER_BOX)); - $this->map(Blocks::SLIME(), fn() => new Writer(Ids::SLIME)); + $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); + $this->mapSimple(Blocks::SLIME(), Ids::SLIME); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); @@ -959,15 +963,15 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); $this->mapStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), Ids::SMOOTH_SANDSTONE_STAIRS); - $this->map(Blocks::SMOOTH_STONE(), fn() => new Writer(Ids::SMOOTH_STONE)); + $this->mapSimple(Blocks::SMOOTH_STONE(), Ids::SMOOTH_STONE); $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); - $this->map(Blocks::SNOW(), fn() => new Writer(Ids::SNOW)); + $this->mapSimple(Blocks::SNOW(), Ids::SNOW); $this->map(Blocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ return Writer::create(Ids::SNOW_LAYER) ->writeBool(StateNames::COVERED_BIT, false) ->writeInt(StateNames::HEIGHT, $block->getLayers() - 1); }); - $this->map(Blocks::SOUL_SAND(), fn() => new Writer(Ids::SOUL_SAND)); + $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); $this->map(Blocks::SPONGE(), function(Sponge $block) : Writer{ return Writer::create(Ids::SPONGE) ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); From b661c9491521d526e0a2d0c194c7abb0ad67e85d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 21:34:20 +0100 Subject: [PATCH 0221/1858] StringToItemParser: added glazed_terracotta alias --- src/item/StringToItemParser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 440734556e..58e57a7c07 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -538,6 +538,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("glass", fn() => Blocks::GLASS()); $result->registerBlock("glass_pane", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glass_panel", fn() => Blocks::GLASS_PANE()); + $result->registerBlock("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA()); $result->registerBlock("glowing_obsidian", fn() => Blocks::GLOWING_OBSIDIAN()); $result->registerBlock("glowing_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true)); $result->registerBlock("glowingobsidian", fn() => Blocks::GLOWING_OBSIDIAN()); From 172214386a7754885cf3e51db23ce57bcd4a567a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 21:53:59 +0100 Subject: [PATCH 0222/1858] Added a batch of simple blocks from 1.16 and 1.17 --- src/block/BlockFactory.php | 43 ++++++ src/block/BlockTypeIds.php | 24 ++- src/block/VanillaBlocks.php | 42 +++++ .../BlockObjectToBlockStateSerializer.php | 34 +++++ .../convert/BlockStateSerializerHelper.php | 2 +- .../BlockStateToBlockObjectDeserializer.php | 144 +++++------------- src/item/StringToItemParser.php | 21 +++ 7 files changed, 203 insertions(+), 107 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 00befb60e6..22fbb8dc30 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -558,6 +558,9 @@ class BlockFactory{ BreakInfo::instant(), )); + $this->registerBlocksR16(); + $this->registerBlocksR17(); + //region --- auto-generated TODOs for bedrock-1.11.0 --- //TODO: minecraft:bubble_column //TODO: minecraft:campfire @@ -828,6 +831,46 @@ class BlockFactory{ $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); } + private function registerBlocksR16() : void{ + //for some reason, slabs have weird hardness like the legacy ones + $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + + $this->register(new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel()))); + + $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); + + $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); ++$this->register(new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); + $this->register(new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); + $this->register(new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); + + //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) + $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); + $this->register(new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); + $this->register(new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new BreakInfo(0.5, ToolType::PICKAXE))); //same as regular stone button + $this->register(new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); //same as regular stone pressure plate + $this->register(new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); + $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_POLISHED_BLACKSTONE), "Chiseled Polished Blackstone", $blackstoneBreakInfo)); + + $prefix = fn(string $thing) => "Polished Blackstone Brick" . ($thing !== "" ? " $thing" : ""); + $this->register(new Opaque(new BID(Ids::POLISHED_BLACKSTONE_BRICKS), "Polished Blackstone Bricks", $blackstoneBreakInfo)); + $this->register(new Slab(new BID(Ids::POLISHED_BLACKSTONE_BRICK_SLAB), "Polished Blackstone Brick", $slabBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); + $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); + } + + private function registerBlocksR17() : void{ + //in java this can be acquired using any tool - seems to be a parity issue in bedrock + $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + } + /** * 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. diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 93132dee0d..d45af897e9 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -564,6 +564,26 @@ final class BlockTypeIds{ public const WOOL = 10537; public const GLAZED_TERRACOTTA = 10539; - - public const FIRST_UNUSED_BLOCK_ID = 10540; + public const AMETHYST = 10540; + public const ANCIENT_DEBRIS = 10541; + public const BASALT = 10542; + public const POLISHED_BASALT = 10543; + public const SMOOTH_BASALT = 10544; + public const BLACKSTONE = 10545; + public const BLACKSTONE_SLAB = 10546; + public const BLACKSTONE_STAIRS = 10547; + public const BLACKSTONE_WALL = 10548; + public const POLISHED_BLACKSTONE = 10549; + public const POLISHED_BLACKSTONE_BUTTON = 10550; + public const POLISHED_BLACKSTONE_PRESSURE_PLATE = 10551; + public const POLISHED_BLACKSTONE_SLAB = 10552; + public const POLISHED_BLACKSTONE_STAIRS = 10553; + public const POLISHED_BLACKSTONE_WALL = 10554; + public const CHISELED_POLISHED_BLACKSTONE = 10555; + public const POLISHED_BLACKSTONE_BRICKS = 10556; + public const POLISHED_BLACKSTONE_BRICK_SLAB = 10557; + public const POLISHED_BLACKSTONE_BRICK_STAIRS = 10558; + public const POLISHED_BLACKSTONE_BRICK_WALL = 10559; + public const CRACKED_POLISHED_BLACKSTONE_BRICKS = 10560; + public const FIRST_UNUSED_BLOCK_ID = 10561; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 4ae0f759b7..1524063c4b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -51,6 +51,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Air AIR() * @method static Flower ALLIUM() * @method static MushroomStem ALL_SIDED_MUSHROOM_STEM() + * @method static Opaque AMETHYST() + * @method static Opaque ANCIENT_DEBRIS() * @method static Opaque ANDESITE() * @method static Slab ANDESITE_SLAB() * @method static Stair ANDESITE_STAIRS() @@ -62,6 +64,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static FloorBanner BANNER() * @method static Barrel BARREL() * @method static Transparent BARRIER() + * @method static SimplePillar BASALT() * @method static Beacon BEACON() * @method static Bed BED() * @method static Bedrock BEDROCK() @@ -82,6 +85,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static WoodenTrapdoor BIRCH_TRAPDOOR() * @method static WallSign BIRCH_WALL_SIGN() * @method static Wood BIRCH_WOOD() + * @method static Opaque BLACKSTONE() + * @method static Slab BLACKSTONE_SLAB() + * @method static Stair BLACKSTONE_STAIRS() + * @method static Wall BLACKSTONE_WALL() * @method static Furnace BLAST_FURNACE() * @method static BlueIce BLUE_ICE() * @method static Flower BLUE_ORCHID() @@ -102,6 +109,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CarvedPumpkin CARVED_PUMPKIN() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() + * @method static Opaque CHISELED_POLISHED_BLACKSTONE() * @method static SimplePillar CHISELED_QUARTZ() * @method static Opaque CHISELED_RED_SANDSTONE() * @method static Opaque CHISELED_SANDSTONE() @@ -122,6 +130,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CoralBlock CORAL_BLOCK() * @method static FloorCoralFan CORAL_FAN() * @method static Flower CORNFLOWER() + * @method static Opaque CRACKED_POLISHED_BLACKSTONE_BRICKS() * @method static Opaque CRACKED_STONE_BRICKS() * @method static CraftingTable CRAFTING_TABLE() * @method static Opaque CUT_RED_SANDSTONE() @@ -420,6 +429,17 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Opaque POLISHED_ANDESITE() * @method static Slab POLISHED_ANDESITE_SLAB() * @method static Stair POLISHED_ANDESITE_STAIRS() + * @method static SimplePillar POLISHED_BASALT() + * @method static Opaque POLISHED_BLACKSTONE() + * @method static Opaque POLISHED_BLACKSTONE_BRICKS() + * @method static Slab POLISHED_BLACKSTONE_BRICK_SLAB() + * @method static Stair POLISHED_BLACKSTONE_BRICK_STAIRS() + * @method static Wall POLISHED_BLACKSTONE_BRICK_WALL() + * @method static StoneButton POLISHED_BLACKSTONE_BUTTON() + * @method static StonePressurePlate POLISHED_BLACKSTONE_PRESSURE_PLATE() + * @method static Slab POLISHED_BLACKSTONE_SLAB() + * @method static Stair POLISHED_BLACKSTONE_STAIRS() + * @method static Wall POLISHED_BLACKSTONE_WALL() * @method static Opaque POLISHED_DIORITE() * @method static Slab POLISHED_DIORITE_SLAB() * @method static Stair POLISHED_DIORITE_STAIRS() @@ -480,6 +500,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ShulkerBox SHULKER_BOX() * @method static Slime SLIME() * @method static Furnace SMOKER() + * @method static Opaque SMOOTH_BASALT() * @method static Opaque SMOOTH_QUARTZ() * @method static Slab SMOOTH_QUARTZ_SLAB() * @method static Stair SMOOTH_QUARTZ_STAIRS() @@ -587,6 +608,8 @@ final class VanillaBlocks{ self::register("air", $factory->get(Ids::AIR, 0)); self::register("all_sided_mushroom_stem", $factory->get(Ids::ALL_SIDED_MUSHROOM_STEM, 0)); self::register("allium", $factory->get(Ids::ALLIUM, 0)); + self::register("amethyst", $factory->get(Ids::AMETHYST, 0)); + self::register("ancient_debris", $factory->get(Ids::ANCIENT_DEBRIS, 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, 0)); @@ -598,6 +621,7 @@ final class VanillaBlocks{ 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("basalt", $factory->get(Ids::BASALT, 2)); self::register("beacon", $factory->get(Ids::BEACON, 0)); self::register("bed", $factory->get(Ids::BED, 13)); self::register("bedrock", $factory->get(Ids::BEDROCK, 0)); @@ -618,6 +642,10 @@ final class VanillaBlocks{ self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 0)); self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0)); + self::register("blackstone", $factory->get(Ids::BLACKSTONE, 0)); + self::register("blackstone_slab", $factory->get(Ids::BLACKSTONE_SLAB, 0)); + self::register("blackstone_stairs", $factory->get(Ids::BLACKSTONE_STAIRS, 0)); + self::register("blackstone_wall", $factory->get(Ids::BLACKSTONE_WALL, 0)); self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 0)); self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0)); self::register("blue_orchid", $factory->get(Ids::BLUE_ORCHID, 0)); @@ -638,6 +666,7 @@ final class VanillaBlocks{ 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, 0)); + self::register("chiseled_polished_blackstone", $factory->get(Ids::CHISELED_POLISHED_BLACKSTONE, 0)); self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 2)); self::register("chiseled_red_sandstone", $factory->get(Ids::CHISELED_RED_SANDSTONE, 0)); self::register("chiseled_sandstone", $factory->get(Ids::CHISELED_SANDSTONE, 0)); @@ -658,6 +687,7 @@ final class VanillaBlocks{ 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_polished_blackstone_bricks", $factory->get(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, 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::CUT_RED_SANDSTONE, 0)); @@ -956,6 +986,17 @@ final class VanillaBlocks{ 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, 0)); + self::register("polished_basalt", $factory->get(Ids::POLISHED_BASALT, 2)); + self::register("polished_blackstone", $factory->get(Ids::POLISHED_BLACKSTONE, 0)); + self::register("polished_blackstone_brick_slab", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, 0)); + self::register("polished_blackstone_brick_stairs", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, 0)); + self::register("polished_blackstone_brick_wall", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_WALL, 0)); + self::register("polished_blackstone_bricks", $factory->get(Ids::POLISHED_BLACKSTONE_BRICKS, 0)); + self::register("polished_blackstone_button", $factory->get(Ids::POLISHED_BLACKSTONE_BUTTON, 0)); + self::register("polished_blackstone_pressure_plate", $factory->get(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, 0)); + self::register("polished_blackstone_slab", $factory->get(Ids::POLISHED_BLACKSTONE_SLAB, 0)); + self::register("polished_blackstone_stairs", $factory->get(Ids::POLISHED_BLACKSTONE_STAIRS, 0)); + self::register("polished_blackstone_wall", $factory->get(Ids::POLISHED_BLACKSTONE_WALL, 0)); 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, 0)); @@ -1016,6 +1057,7 @@ final class VanillaBlocks{ 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, 0)); + self::register("smooth_basalt", $factory->get(Ids::SMOOTH_BASALT, 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, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index dc2f772381..c9322c825a 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -36,6 +36,7 @@ use pocketmine\block\BlockFactory; use pocketmine\block\BoneBlock; use pocketmine\block\BrewingStand; use pocketmine\block\BrownMushroomBlock; +use pocketmine\block\Button; use pocketmine\block\Cactus; use pocketmine\block\Cake; use pocketmine\block\Carpet; @@ -96,6 +97,7 @@ use pocketmine\block\RedstoneWire; use pocketmine\block\Sapling; use pocketmine\block\SeaPickle; use pocketmine\block\SimplePillar; +use pocketmine\block\SimplePressurePlate; use pocketmine\block\Skull; use pocketmine\block\Slab; use pocketmine\block\SnowLayer; @@ -190,6 +192,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map($block, fn() => Writer::create($id)); } + public function mapSlab(Slab $block, string $singleId, string $doubleId) : void{ + $this->map($block, fn(Slab $block) => Helper::encodeSlab($block, $singleId, $doubleId)); + } + public function mapStairs(Stair $block, string $id) : void{ $this->map($block, fn(Stair $block) => Helper::encodeStairs($block, Writer::create($id))); } @@ -259,6 +265,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); + $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); + $this->mapSimple(Blocks::ANCIENT_DEBRIS(), Ids::ANCIENT_DEBRIS); $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); @@ -302,6 +310,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeFacingDirection($block->getFacing()); }); $this->mapSimple(Blocks::BARRIER(), Ids::BARRIER); + $this->map(Blocks::BASALT(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::BASALT) + ->writePillarAxis($block->getAxis()); + }); $this->mapSimple(Blocks::BEACON(), Ids::BEACON); $this->map(Blocks::BED(), function(Bed $block) : Writer{ return Writer::create(Ids::BED) @@ -338,6 +350,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->mapSimple(Blocks::BLACKSTONE(), Ids::BLACKSTONE); + $this->mapSlab(Blocks::BLACKSTONE_SLAB(), Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB); + $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); + $this->map(Blocks::BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::BLACKSTONE_WALL))); $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); $this->mapSimple(Blocks::BLUE_ICE(), Ids::BLUE_ICE); $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); @@ -382,6 +398,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); }); + $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); @@ -428,6 +445,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); }); $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); + $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); @@ -853,6 +871,21 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); + $this->map(Blocks::POLISHED_BASALT(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::POLISHED_BASALT) + ->writePillarAxis($block->getAxis()); + }); + $this->mapSimple(Blocks::POLISHED_BLACKSTONE(), Ids::POLISHED_BLACKSTONE); + $this->mapSimple(Blocks::POLISHED_BLACKSTONE_BRICKS(), Ids::POLISHED_BLACKSTONE_BRICKS); + $this->mapSlab(Blocks::POLISHED_BLACKSTONE_BRICK_SLAB(), Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB); + $this->mapStairs(Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS(), Ids::POLISHED_BLACKSTONE_BRICK_STAIRS); + $this->map(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_BRICK_WALL))); + $this->map(Blocks::POLISHED_BLACKSTONE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::POLISHED_BLACKSTONE_BUTTON))); + $this->map(Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE))); + $this->mapSlab(Blocks::POLISHED_BLACKSTONE_SLAB(), Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB); + $this->mapStairs(Blocks::POLISHED_BLACKSTONE_STAIRS(), Ids::POLISHED_BLACKSTONE_STAIRS); + $this->map(Blocks::POLISHED_BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_WALL))); + $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); @@ -954,6 +987,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); $this->mapSimple(Blocks::SLIME(), Ids::SLIME); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); + $this->mapSimple(Blocks::SMOOTH_BASALT(), Ids::SMOOTH_BASALT); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); $this->mapStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), Ids::SMOOTH_QUARTZ_STAIRS); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index d7fc9a28f8..b072da122e 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -185,7 +185,7 @@ final class BlockStateSerializerHelper{ ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->isPressed() ? 15 : 0); } - private static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ + public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ $slabType = $block->getSlabType(); return BlockStateWriter::create($slabType->equals(SlabType::DOUBLE()) ? $doubleId : $singleId) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 602802deb3..8c9f26ddaf 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; +use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; @@ -71,6 +72,17 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->deserializeFuncs[$id] = $c; } + /** + * @phpstan-param \Closure() : Slab $getBlock + */ + public function mapSlab(string $singleId, string $doubleId, \Closure $getBlock) : void{ + $this->map($singleId, fn(Reader $in) : Slab => $getBlock()->setSlabType($in->readSlabPosition())); + $this->map($doubleId, function(Reader $in) use ($getBlock) : Slab{ + $in->ignored(StateNames::TOP_SLOT_BIT); + return $getBlock()->setSlabType(SlabType::DOUBLE()); + }); + } + /** * @phpstan-param \Closure() : Stair $getBlock */ @@ -93,6 +105,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); $this->map(Ids::AIR, fn() => Blocks::AIR()); + $this->map(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); + $this->map(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS()); $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); $this->map(Ids::ANVIL, function(Reader $in) : Block{ return Blocks::ANVIL() @@ -130,6 +144,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setOpen($in->readBool(StateNames::OPEN_BIT)); }); $this->map(Ids::BARRIER, fn() => Blocks::BARRIER()); + $this->map(Ids::BASALT, function(Reader $in){ + return Blocks::BASALT() + ->setAxis($in->readPillarAxis()); + }); $this->map(Ids::BEACON, fn() => Blocks::BEACON()); $this->map(Ids::BED, function(Reader $in) : Block{ return Blocks::BED() @@ -156,6 +174,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); + $this->map(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE()); + $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); + $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS()); + $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() @@ -211,6 +233,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CHEST() ->setFacing($in->readHorizontalFacing()); }); + $this->map(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); $this->map(Ids::CLAY, fn() => Blocks::CLAY()); $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); @@ -264,6 +287,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType(CoralType::HORN()); }); + $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); @@ -712,6 +736,21 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); + $this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ + return Blocks::POLISHED_BASALT() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); + $this->map(Ids::POLISHED_BLACKSTONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::POLISHED_BLACKSTONE_BUTTON(), $in)); + $this->mapSlab(Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_SLAB()); + $this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::POLISHED_BLACKSTONE_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_STAIRS()); + $this->map(Ids::POLISHED_BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_WALL(), $in)); + $this->map(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); + $this->mapSlab(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB()); + $this->mapStairs(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS()); + $this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), $in)); + $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS()); $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS()); $this->map(Ids::PORTAL, function(Reader $in) : Block{ @@ -884,6 +923,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); + $this->map(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS()); $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS()); @@ -1064,18 +1104,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::ALLOW, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::AMETHYST_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::AMETHYST_CLUSTER, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::ANCIENT_DEBRIS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::AZALEA, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); @@ -1093,12 +1127,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * update_bit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BASALT, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); //$this->map(Ids::BEE_NEST, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1284,9 +1312,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::CHISELED_NETHER_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CHISELED_POLISHED_BLACKSTONE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::CHORUS_FLOWER, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1362,9 +1387,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::CRACKED_NETHER_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::CRIMSON_BUTTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1918,89 +1940,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * hanging (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_BUTTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::POLISHED_BLACKSTONE_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); //$this->map(Ids::POLISHED_DEEPSLATE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); @@ -2146,9 +2085,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::SMITHING_TABLE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::SMOOTH_BASALT, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::SOUL_CAMPFIRE, function(Reader $in) : Block{ /* * TODO: Un-implemented block diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 58e57a7c07..dd4ceb4f5c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -95,6 +95,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("air", fn() => Blocks::AIR()); $result->registerBlock("all_sided_mushroom_stem", fn() => Blocks::ALL_SIDED_MUSHROOM_STEM()); $result->registerBlock("allium", fn() => Blocks::ALLIUM()); + $result->registerBlock("amethyst_block", fn() => Blocks::AMETHYST()); + $result->registerBlock("ancient_debris", fn() => Blocks::ANCIENT_DEBRIS()); $result->registerBlock("andesite", fn() => Blocks::ANDESITE()); $result->registerBlock("andesite_slab", fn() => Blocks::ANDESITE_SLAB()); $result->registerBlock("andesite_stairs", fn() => Blocks::ANDESITE_STAIRS()); @@ -107,6 +109,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("banner", fn() => Blocks::BANNER()); $result->registerBlock("barrel", fn() => Blocks::BARREL()); $result->registerBlock("barrier", fn() => Blocks::BARRIER()); + $result->registerBlock("basalt", fn() => Blocks::BASALT()); $result->registerBlock("beacon", fn() => Blocks::BEACON()); $result->registerBlock("bed_block", fn() => Blocks::BED()); $result->registerBlock("bedrock", fn() => Blocks::BEDROCK()); @@ -132,6 +135,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(false)); $result->registerBlock("birch_wood_stairs", fn() => Blocks::BIRCH_STAIRS()); $result->registerBlock("birch_wooden_stairs", fn() => Blocks::BIRCH_STAIRS()); + $result->registerBlock("blackstone", fn() => Blocks::BLACKSTONE()); + $result->registerBlock("blackstone_slab", fn() => Blocks::BLACKSTONE_SLAB()); + $result->registerBlock("blackstone_stairs", fn() => Blocks::BLACKSTONE_STAIRS()); + $result->registerBlock("blackstone_wall", fn() => Blocks::BLACKSTONE_WALL()); $result->registerBlock("blast_furnace", fn() => Blocks::BLAST_FURNACE()); $result->registerBlock("blue_ice", fn() => Blocks::BLUE_ICE()); $result->registerBlock("blue_orchid", fn() => Blocks::BLUE_ORCHID()); @@ -161,6 +168,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); $result->registerBlock("chipped_anvil", fn() => Blocks::ANVIL()->setDamage(1)); + $result->registerBlock("chiseled_polished_blackstone", fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); $result->registerBlock("chiseled_quartz", fn() => Blocks::CHISELED_QUARTZ()); $result->registerBlock("chiseled_red_sandstone", fn() => Blocks::CHISELED_RED_SANDSTONE()); $result->registerBlock("chiseled_sandstone", fn() => Blocks::CHISELED_SANDSTONE()); @@ -197,6 +205,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("coral_fan_hang2", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::BUBBLE())); $result->registerBlock("coral_fan_hang3", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::HORN())); $result->registerBlock("cornflower", fn() => Blocks::CORNFLOWER()); + $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("cut_red_sandstone", fn() => Blocks::CUT_RED_SANDSTONE()); @@ -716,6 +725,17 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("polished_andesite", fn() => Blocks::POLISHED_ANDESITE()); $result->registerBlock("polished_andesite_slab", fn() => Blocks::POLISHED_ANDESITE_SLAB()); $result->registerBlock("polished_andesite_stairs", fn() => Blocks::POLISHED_ANDESITE_STAIRS()); + $result->registerBlock("polished_basalt", fn() => Blocks::POLISHED_BASALT()); + $result->registerBlock("polished_blackstone", fn() => Blocks::POLISHED_BLACKSTONE()); + $result->registerBlock("polished_blackstone_brick_slab", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB()); + $result->registerBlock("polished_blackstone_brick_stairs", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS()); + $result->registerBlock("polished_blackstone_brick_wall", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_WALL()); + $result->registerBlock("polished_blackstone_bricks", fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); + $result->registerBlock("polished_blackstone_button", fn() => Blocks::POLISHED_BLACKSTONE_BUTTON()); + $result->registerBlock("polished_blackstone_pressure_plate", fn() => Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE()); + $result->registerBlock("polished_blackstone_slab", fn() => Blocks::POLISHED_BLACKSTONE_SLAB()); + $result->registerBlock("polished_blackstone_stairs", fn() => Blocks::POLISHED_BLACKSTONE_STAIRS()); + $result->registerBlock("polished_blackstone_wall", fn() => Blocks::POLISHED_BLACKSTONE_WALL()); $result->registerBlock("polished_diorite", fn() => Blocks::POLISHED_DIORITE()); $result->registerBlock("polished_diorite_slab", fn() => Blocks::POLISHED_DIORITE_SLAB()); $result->registerBlock("polished_diorite_stairs", fn() => Blocks::POLISHED_DIORITE_STAIRS()); @@ -800,6 +820,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("slime", fn() => Blocks::SLIME()); $result->registerBlock("slime_block", fn() => Blocks::SLIME()); $result->registerBlock("smoker", fn() => Blocks::SMOKER()); + $result->registerBlock("smooth_basalt", fn() => Blocks::SMOOTH_BASALT()); $result->registerBlock("smooth_quartz", fn() => Blocks::SMOOTH_QUARTZ()); $result->registerBlock("smooth_quartz_slab", fn() => Blocks::SMOOTH_QUARTZ_SLAB()); $result->registerBlock("smooth_quartz_stairs", fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); From c4fc352db12e5b52e3efb7ba61488e89e387499f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 21:54:36 +0100 Subject: [PATCH 0223/1858] Remove empty line --- .../bedrock/block/convert/BlockObjectToBlockStateSerializer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index c9322c825a..de8f40d6d1 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -885,7 +885,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::POLISHED_BLACKSTONE_SLAB(), Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_BLACKSTONE_STAIRS(), Ids::POLISHED_BLACKSTONE_STAIRS); $this->map(Blocks::POLISHED_BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_WALL))); - $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); From c84033213fee438e9c2270dcfc74f347259b2693 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 21:55:35 +0100 Subject: [PATCH 0224/1858] Updated BlockFactory consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index c4cff8e6eb..28cc75775f 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst"},"stateDataBits":9} \ No newline at end of file From 30149c6ed4aed9f017e8c12d21c22055946a1cf5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 22:06:47 +0100 Subject: [PATCH 0225/1858] wtf happened here ... --- src/block/BlockFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 22fbb8dc30..9f10ebdfb9 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -844,7 +844,7 @@ class BlockFactory{ $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); $this->register(new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); -+$this->register(new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); + $this->register(new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); $this->register(new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); $this->register(new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); From 2a0fade893d200ea523823f866e4ff1869557bfc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 22:39:11 +0100 Subject: [PATCH 0226/1858] Implemented Light blocks --- src/block/BlockFactory.php | 5 ++ src/block/BlockTypeIds.php | 4 +- src/block/Light.php | 57 +++++++++++++++++++ src/block/VanillaBlocks.php | 2 + .../BlockObjectToBlockStateSerializer.php | 5 ++ .../BlockStateToBlockObjectDeserializer.php | 5 ++ src/item/StringToItemParser.php | 8 +++ .../block_factory_consistency_check.json | 2 +- 8 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/block/Light.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 9f10ebdfb9..452de0bce7 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -558,6 +558,7 @@ class BlockFactory{ BreakInfo::instant(), )); + $this->registerBlocksR13(); $this->registerBlocksR16(); $this->registerBlocksR17(); @@ -831,6 +832,10 @@ class BlockFactory{ $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); } + private function registerBlocksR13() : void{ + $this->register(new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); + } + private function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index d45af897e9..ee232f860f 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -585,5 +585,7 @@ final class BlockTypeIds{ public const POLISHED_BLACKSTONE_BRICK_STAIRS = 10558; public const POLISHED_BLACKSTONE_BRICK_WALL = 10559; public const CRACKED_POLISHED_BLACKSTONE_BRICKS = 10560; - public const FIRST_UNUSED_BLOCK_ID = 10561; + public const LIGHT = 10561; + + public const FIRST_UNUSED_BLOCK_ID = 10562; } diff --git a/src/block/Light.php b/src/block/Light.php new file mode 100644 index 0000000000..21937a80f4 --- /dev/null +++ b/src/block/Light.php @@ -0,0 +1,57 @@ +level = $r->readBoundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL); + } + + protected function encodeType(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->level); + } + + public function getLightLevel() : int{ return $this->level; } + + /** @return $this */ + public function setLightLevel(int $level) : self{ + if($level < self::MIN_LIGHT_LEVEL || $level > self::MAX_LIGHT_LEVEL){ + throw new \InvalidArgumentException("Light level must be in the range " . self::MIN_LIGHT_LEVEL . " ... " . self::MAX_LIGHT_LEVEL); + } + $this->level = $level; + return $this; + } + + public function canBeReplaced() : bool{ return true; } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 1524063c4b..576999020f 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -371,6 +371,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Lectern LECTERN() * @method static Opaque LEGACY_STONECUTTER() * @method static Lever LEVER() + * @method static Light LIGHT() * @method static DoublePlant LILAC() * @method static Flower LILY_OF_THE_VALLEY() * @method static WaterLily LILY_PAD() @@ -928,6 +929,7 @@ final class VanillaBlocks{ self::register("lectern", $factory->get(Ids::LECTERN, 0)); self::register("legacy_stonecutter", $factory->get(Ids::LEGACY_STONECUTTER, 0)); self::register("lever", $factory->get(Ids::LEVER, 5)); + self::register("light", $factory->get(Ids::LIGHT, 15)); 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)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index de8f40d6d1..7ac6b3dbde 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -77,6 +77,7 @@ use pocketmine\block\Lava; use pocketmine\block\Leaves; use pocketmine\block\Lectern; use pocketmine\block\Lever; +use pocketmine\block\Light; use pocketmine\block\LitPumpkin; use pocketmine\block\Log; use pocketmine\block\Loom; @@ -791,6 +792,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), }); }); + $this->map(Blocks::LIGHT(), function(Light $block) : Writer{ + return Writer::create(Ids::LIGHT_BLOCK) + ->writeInt(StateNames::BLOCK_LIGHT_LEVEL, $block->getLightLevel()); + }); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); $this->mapSimple(Blocks::LILY_PAD(), Ids::WATERLILY); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8c9f26ddaf..94568e17cb 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; +use pocketmine\block\Light; use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; @@ -640,6 +641,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value), }); }); + $this->map(Ids::LIGHT_BLOCK, function(Reader $in) : Block{ + return Blocks::LIGHT() + ->setLightLevel($in->readBoundedInt(StateNames::BLOCK_LIGHT_LEVEL, Light::MIN_LIGHT_LEVEL, Light::MAX_LIGHT_LEVEL)); + }); $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index dd4ceb4f5c..7df60292f5 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; +use pocketmine\block\Light; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; @@ -70,6 +71,11 @@ final class StringToItemParser extends StringToTParser{ //wall and floor coral fans are the same item $result->registerBlock($prefix("coral_fan"), fn() => Blocks::CORAL_FAN()->setCoralType($coralType)); } + for($i = Light::MIN_LIGHT_LEVEL; $i < Light::MAX_LIGHT_LEVEL; $i++){ + //helper aliases, since we don't support passing data values in /give + $result->registerBlock("light_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); + $result->registerBlock("light_block_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); + } $result->registerBlock("acacia_button", fn() => Blocks::ACACIA_BUTTON()); $result->registerBlock("acacia_door", fn() => Blocks::ACACIA_DOOR()); @@ -640,6 +646,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("lectern", fn() => Blocks::LECTERN()); $result->registerBlock("legacy_stonecutter", fn() => Blocks::LEGACY_STONECUTTER()); $result->registerBlock("lever", fn() => Blocks::LEVER()); + $result->registerBlock("light", fn() => Blocks::LIGHT()); + $result->registerBlock("light_block", fn() => Blocks::LIGHT()); $result->registerBlock("light_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("lilac", fn() => Blocks::LILAC()); $result->registerBlock("lily_of_the_valley", fn() => Blocks::LILY_OF_THE_VALLEY()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 28cc75775f..47a442eede 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst"},"stateDataBits":9} \ No newline at end of file From 0d0296d5357e5a31e21859bfd5f47fc8fc90d418 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 22:48:10 +0100 Subject: [PATCH 0227/1858] Light block brightness can be changed by right-clicking on it --- src/block/Light.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/block/Light.php b/src/block/Light.php index 21937a80f4..6f2ccbf577 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -25,6 +25,9 @@ namespace pocketmine\block; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\item\Item; +use pocketmine\math\Vector3; +use pocketmine\player\Player; final class Light extends Flowable{ public const MIN_LIGHT_LEVEL = 0; @@ -54,4 +57,14 @@ final class Light extends Flowable{ } public function canBeReplaced() : bool{ return true; } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + $this->level = $this->level === self::MAX_LIGHT_LEVEL ? + self::MIN_LIGHT_LEVEL : + $this->level + 1; + + $this->position->getWorld()->setBlock($this->position, $this); + + return true; + } } From 0e0b858b696df4d9a4113e9ae121e73e63a4f285 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 23:17:10 +0100 Subject: [PATCH 0228/1858] Added raw copper, gold and iron blocks --- src/block/BlockFactory.php | 4 ++++ src/block/BlockTypeIds.php | 5 ++++- src/block/VanillaBlocks.php | 6 ++++++ .../block/convert/BlockObjectToBlockStateSerializer.php | 3 +++ .../block/convert/BlockStateToBlockObjectDeserializer.php | 3 +++ src/item/StringToItemParser.php | 3 +++ 6 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 452de0bce7..1e022136df 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -874,6 +874,10 @@ class BlockFactory{ private function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + + $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); } /** diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index ee232f860f..589d6634bb 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -586,6 +586,9 @@ final class BlockTypeIds{ public const POLISHED_BLACKSTONE_BRICK_WALL = 10559; public const CRACKED_POLISHED_BLACKSTONE_BRICKS = 10560; public const LIGHT = 10561; + public const RAW_COPPER = 10562; + public const RAW_GOLD = 10563; + public const RAW_IRON = 10564; - public const FIRST_UNUSED_BLOCK_ID = 10562; + public const FIRST_UNUSED_BLOCK_ID = 10565; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 576999020f..2b45c1d7d4 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -469,6 +469,9 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab QUARTZ_SLAB() * @method static Stair QUARTZ_STAIRS() * @method static Rail RAIL() + * @method static Opaque RAW_COPPER() + * @method static Opaque RAW_GOLD() + * @method static Opaque RAW_IRON() * @method static Redstone REDSTONE() * @method static RedstoneComparator REDSTONE_COMPARATOR() * @method static RedstoneLamp REDSTONE_LAMP() @@ -1027,6 +1030,9 @@ final class VanillaBlocks{ self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); self::register("rail", $factory->get(Ids::RAIL, 0)); + self::register("raw_copper", $factory->get(Ids::RAW_COPPER, 0)); + self::register("raw_gold", $factory->get(Ids::RAW_GOLD, 0)); + self::register("raw_iron", $factory->get(Ids::RAW_IRON, 0)); self::register("red_mushroom", $factory->get(Ids::RED_MUSHROOM, 0)); self::register("red_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 10)); self::register("red_nether_brick_slab", $factory->get(Ids::RED_NETHER_BRICK_SLAB, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 7ac6b3dbde..6eb2a5d904 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -938,6 +938,9 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::RAIL) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); + $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); + $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); + $this->mapSimple(Blocks::RAW_IRON(), Ids::RAW_IRON_BLOCK); $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : Writer{ return Writer::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 94568e17cb..4cd0e6967e 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -824,6 +824,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::RAIL() ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); }); + $this->map(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); + $this->map(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD()); + $this->map(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); $this->map(Ids::RED_FLOWER, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::FLOWER_TYPE)){ StringValues::FLOWER_TYPE_ALLIUM => Blocks::ALLIUM(), diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 7df60292f5..5f1d7b2b4a 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -781,6 +781,9 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("quartz_slab", fn() => Blocks::QUARTZ_SLAB()); $result->registerBlock("quartz_stairs", fn() => Blocks::QUARTZ_STAIRS()); $result->registerBlock("rail", fn() => Blocks::RAIL()); + $result->registerBlock("raw_copper_block", fn() => Blocks::RAW_COPPER()); + $result->registerBlock("raw_gold_block", fn() => Blocks::RAW_GOLD()); + $result->registerBlock("raw_iron_block", fn() => Blocks::RAW_IRON()); $result->registerBlock("red_flower", fn() => Blocks::POPPY()); $result->registerBlock("red_mushroom", fn() => Blocks::RED_MUSHROOM()); $result->registerBlock("red_mushroom_block", fn() => Blocks::RED_MUSHROOM_BLOCK()); From b818ed0d08586550ccbc9a0626346dde495ec630 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 23:17:46 +0100 Subject: [PATCH 0229/1858] Regenerated TODO list --- .../BlockStateToBlockObjectDeserializer.php | 236 ++++++++++++++---- 1 file changed, 183 insertions(+), 53 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 4cd0e6967e..04717200c0 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -1170,38 +1170,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * lit (ByteTag) = 0, 1 */ //}); - //$this->map(Ids::BLACKSTONE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::BLACKSTONE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BLACKSTONE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BLACKSTONE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::BLACKSTONE_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); //$this->map(Ids::BLUE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1680,6 +1648,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::FLOWERING_AZALEA, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); + //$this->map(Ids::FROG_SPAWN, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); //$this->map(Ids::GILDED_BLACKSTONE, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); @@ -1771,12 +1742,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 */ //}); - //$this->map(Ids::LIGHT_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * block_light_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); //$this->map(Ids::LIGHT_BLUE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1841,6 +1806,111 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * lit (ByteTag) = 0, 1 */ //}); + //$this->map(Ids::MANGROVE_BUTTON, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * button_pressed_bit (ByteTag) = 0, 1 + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::MANGROVE_DOOR, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * door_hinge_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + * upper_block_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_DOUBLE_SLAB, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_FENCE, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MANGROVE_FENCE_GATE, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * in_wall_bit (ByteTag) = 0, 1 + * open_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_LEAVES, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * persistent_bit (ByteTag) = 0, 1 + * update_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_LOG, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::MANGROVE_PLANKS, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MANGROVE_PRESSURE_PLATE, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::MANGROVE_PROPAGULE, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * hanging (ByteTag) = 0, 1 + * propagule_stage (IntTag) = 0, 1, 2, 3, 4 + */ + //}); + //$this->map(Ids::MANGROVE_ROOTS, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MANGROVE_SLAB, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_STAIRS, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::MANGROVE_STANDING_SIGN, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + */ + //}); + //$this->map(Ids::MANGROVE_TRAPDOOR, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * direction (IntTag) = 0, 1, 2, 3 + * open_bit (ByteTag) = 0, 1 + * upside_down_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MANGROVE_WALL_SIGN, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 + */ + //}); + //$this->map(Ids::MANGROVE_WOOD, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + * stripped_bit (ByteTag) = 0, 1 + */ + //}); //$this->map(Ids::MEDIUM_AMETHYST_BUD, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1853,13 +1923,45 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::MOSS_CARPET, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MOVINGBLOCK, function(Reader $in) : Block{ + //$this->map(Ids::MOVING_BLOCK, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MYSTERIOUS_FRAME, function(Reader $in) : Block{ + //$this->map(Ids::MUD, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::MYSTERIOUS_FRAME_SLOT, function(Reader $in) : Block{ + //$this->map(Ids::MUD_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MUD_BRICK_SLAB, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * top_slot_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MUD_BRICK_STAIRS, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * upside_down_bit (ByteTag) = 0, 1 + * weirdo_direction (IntTag) = 0, 1, 2, 3 + */ + //}); + //$this->map(Ids::MUD_BRICK_WALL, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * wall_connection_type_east (StringTag) = none, short, tall + * wall_connection_type_north (StringTag) = none, short, tall + * wall_connection_type_south (StringTag) = none, short, tall + * wall_connection_type_west (StringTag) = none, short, tall + * wall_post_bit (ByteTag) = 0, 1 + */ + //}); + //$this->map(Ids::MUD_BRICKS, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::MUDDY_MANGROVE_ROOTS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); //$this->map(Ids::NETHER_GOLD_ORE, function(Reader $in) : Block{ @@ -1878,6 +1980,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * powered_bit (ByteTag) = 0, 1 */ //}); + //$this->map(Ids::OCHRE_FROGLIGHT, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); //$this->map(Ids::ORANGE_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1916,6 +2024,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * top_slot_bit (ByteTag) = 0, 1 */ //}); + //$this->map(Ids::PACKED_MUD, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); + //$this->map(Ids::PEARLESCENT_FROGLIGHT, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); //$this->map(Ids::PINK_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -1935,7 +2052,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::PISTONARMCOLLISION, function(Reader $in) : Block{ + //$this->map(Ids::PISTON_ARM_COLLISION, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 @@ -1999,15 +2116,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::QUARTZ_BRICKS, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::RAW_COPPER_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::RAW_GOLD_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::RAW_IRON_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); //$this->map(Ids::RED_CANDLE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -2021,6 +2129,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * lit (ByteTag) = 0, 1 */ //}); + //$this->map(Ids::REINFORCED_DEEPSLATE, function(Reader $in) : Block{ + /* TODO: Un-implemented block */ + //}); //$this->map(Ids::REPEATING_COMMAND_BLOCK, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -2060,6 +2171,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize /* * TODO: Un-implemented block * active (ByteTag) = 0, 1 + * can_summon (ByteTag) = 0, 1 */ //}); //$this->map(Ids::SCULK_VEIN, function(Reader $in) : Block{ @@ -2124,13 +2236,13 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::SPORE_BLOSSOM, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); - //$this->map(Ids::STICKYPISTONARMCOLLISION, function(Reader $in) : Block{ + //$this->map(Ids::STICKY_PISTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 */ //}); - //$this->map(Ids::STICKY_PISTON, function(Reader $in) : Block{ + //$this->map(Ids::STICKY_PISTON_ARM_COLLISION, function(Reader $in) : Block{ /* * TODO: Un-implemented block * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 @@ -2148,6 +2260,18 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize * pillar_axis (StringTag) = x, y, z */ //}); + //$this->map(Ids::STRIPPED_MANGROVE_LOG, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); + //$this->map(Ids::STRIPPED_MANGROVE_WOOD, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); //$this->map(Ids::STRIPPED_WARPED_HYPHAE, function(Reader $in) : Block{ /* * TODO: Un-implemented block @@ -2197,6 +2321,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize //$this->map(Ids::UNKNOWN, function(Reader $in) : Block{ /* TODO: Un-implemented block */ //}); + //$this->map(Ids::VERDANT_FROGLIGHT, function(Reader $in) : Block{ + /* + * TODO: Un-implemented block + * pillar_axis (StringTag) = x, y, z + */ + //}); //$this->map(Ids::WARPED_BUTTON, function(Reader $in) : Block{ /* * TODO: Un-implemented block From 3f937605ac89ca45fae04b90bcb0a14f0b296c91 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Jul 2022 23:54:51 +0100 Subject: [PATCH 0230/1858] Added calcite --- src/block/BlockFactory.php | 2 ++ src/block/BlockTypeIds.php | 3 ++- src/block/VanillaBlocks.php | 2 ++ .../block/convert/BlockObjectToBlockStateSerializer.php | 1 + .../block/convert/BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + 6 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 1e022136df..1a88083b2e 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -875,6 +875,8 @@ class BlockFactory{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 589d6634bb..eddb34a552 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -589,6 +589,7 @@ final class BlockTypeIds{ public const RAW_COPPER = 10562; public const RAW_GOLD = 10563; public const RAW_IRON = 10564; + public const CALCITE = 10565; - public const FIRST_UNUSED_BLOCK_ID = 10565; + public const FIRST_UNUSED_BLOCK_ID = 10566; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 2b45c1d7d4..509c2a5eb6 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -104,6 +104,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static BrownMushroomBlock BROWN_MUSHROOM_BLOCK() * @method static Cactus CACTUS() * @method static Cake CAKE() + * @method static Opaque CALCITE() * @method static Carpet CARPET() * @method static Carrot CARROTS() * @method static CarvedPumpkin CARVED_PUMPKIN() @@ -665,6 +666,7 @@ final class VanillaBlocks{ self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10)); self::register("cactus", $factory->get(Ids::CACTUS, 0)); self::register("cake", $factory->get(Ids::CAKE, 0)); + self::register("calcite", $factory->get(Ids::CALCITE, 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)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 6eb2a5d904..eb78550ef6 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -385,6 +385,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CAKE) ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); }); + $this->mapSimple(Blocks::CALCITE(), Ids::CALCITE); $this->map(Blocks::CARPET(), function(Carpet $block) : Writer{ return Writer::create(Ids::CARPET) ->writeColor($block->getColor()); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 04717200c0..dc20af369c 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -211,6 +211,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CAKE() ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); }); + $this->map(Ids::CALCITE, fn() => Blocks::CALCITE()); $this->map(Ids::CARPET, function(Reader $in) : Block{ return Blocks::CARPET() ->setColor($in->readColor()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 5f1d7b2b4a..d2c1385e51 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -166,6 +166,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cactus", fn() => Blocks::CACTUS()); $result->registerBlock("cake", fn() => Blocks::CAKE()); $result->registerBlock("cake_block", fn() => Blocks::CAKE()); + $result->registerBlock("calcite", fn() => Blocks::CALCITE()); $result->registerBlock("carpet", fn() => Blocks::CARPET()); $result->registerBlock("carrot_block", fn() => Blocks::CARROTS()); $result->registerBlock("carrots", fn() => Blocks::CARROTS()); From 017ebb9b47a343449d082e07c0562e2b2b7bfd39 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 00:02:03 +0100 Subject: [PATCH 0231/1858] Updated consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 47a442eede..ec2e587d67 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block"},"stateDataBits":9} \ No newline at end of file From db9c7de35c4f87ab6800407834bb19f0a3ef9b7a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 00:47:42 +0100 Subject: [PATCH 0232/1858] Remove obsolete shim items for Bed and Skull now that the colour and skull type are included in the block type data, it's no longer necessary to maintain shim items to retain this information in the item data. --- src/block/Bed.php | 6 +-- src/block/Skull.php | 6 --- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 9 ++-- src/item/Bed.php | 62 ---------------------- src/item/ItemFactory.php | 6 --- src/item/ItemTypeIds.php | 4 +- src/item/Skull.php | 57 -------------------- src/item/StringToItemParser.php | 18 +++---- src/item/VanillaItems.php | 4 -- 10 files changed, 18 insertions(+), 156 deletions(-) delete mode 100644 src/item/Bed.php delete mode 100644 src/item/Skull.php diff --git a/src/block/Bed.php b/src/block/Bed.php index e58163c05a..81cbd73cc7 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -33,7 +33,6 @@ use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use pocketmine\lang\KnownTranslationFactory; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -220,8 +219,5 @@ class Bed extends Transparent{ return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); } - public function asItem() : Item{ - //TODO: we might be able to get rid of this - return VanillaItems::BED()->setColor($this->color); - } + public function getMaxStackSize() : int{ return 1; } } diff --git a/src/block/Skull.php b/src/block/Skull.php index 140c715741..26354c8cdb 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -31,7 +31,6 @@ use pocketmine\data\runtime\block\BlockDataReaderHelper; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\data\runtime\block\BlockDataWriterHelper; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -153,9 +152,4 @@ class Skull extends Flowable{ } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - - public function asItem() : Item{ - //TODO: we might be able to get rid of this - return VanillaItems::MOB_HEAD()->setSkullType($this->skullType); - } } diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index b48da118d7..5008b33459 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -536,7 +536,7 @@ final class ItemDeserializer{ }catch(\InvalidArgumentException $e){ throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); } - return Items::MOB_HEAD()->setSkullType($skullType); + return Blocks::MOB_HEAD()->setSkullType($skullType)->asItem(); }); //TODO: minecraft:skull_banner_pattern $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index eec454f5ae..47c84f6e7f 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; +use pocketmine\block\Bed; use pocketmine\block\Block; +use pocketmine\block\Skull; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateSerializeException; @@ -34,13 +36,11 @@ use pocketmine\data\bedrock\item\ItemTypeIds as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\item\Banner; -use pocketmine\item\Bed; use pocketmine\item\CoralFan; use pocketmine\item\Dye; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\Potion; -use pocketmine\item\Skull; use pocketmine\item\SplashPotion; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; @@ -240,6 +240,9 @@ final class ItemSerializer{ $this->mapBlock(Blocks::REDSTONE_REPEATER(), self::id(Ids::REPEATER)); $this->mapBlock(Blocks::SPRUCE_DOOR(), self::id(Ids::SPRUCE_DOOR)); $this->mapBlock(Blocks::SUGARCANE(), self::id(Ids::SUGAR_CANE)); + + $this->mapBlock(Blocks::BED(), fn(Bed $block) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($block->getColor()))); + $this->mapBlock(Blocks::MOB_HEAD(), fn(Skull $block) => new Data(Ids::SKULL, $block->getSkullType()->getMagicNumber())); } private function registerSerializers() : void{ @@ -256,7 +259,6 @@ final class ItemSerializer{ $this->map(Items::ARROW(), self::id(Ids::ARROW)); $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); - $this->map(Items::BED(), fn(Bed $item) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($item->getColor()))); $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); @@ -419,7 +421,6 @@ final class ItemSerializer{ $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); $this->map(Items::MINECART(), self::id(Ids::MINECART)); - $this->map(Items::MOB_HEAD(), fn(Skull $item) => new Data(Ids::SKULL, $item->getSkullType()->getMagicNumber())); $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); diff --git a/src/item/Bed.php b/src/item/Bed.php deleted file mode 100644 index d2dca80cf1..0000000000 --- a/src/item/Bed.php +++ /dev/null @@ -1,62 +0,0 @@ -color = DyeColor::WHITE(); - parent::__construct($identifier, $name); - } - - public function getMeta() : int{ - return DyeColorIdMap::getInstance()->toId($this->color); - } - - public function getColor() : DyeColor{ - return $this->color; - } - - /** - * @return $this - */ - public function setColor(DyeColor $color) : self{ - $this->color = $color; - return $this; - } - - public function getBlock(?int $clickedFace = null) : Block{ - return VanillaBlocks::BED()->setColor($this->color); - } - - public function getMaxStackSize() : int{ - return 1; - } -} diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index c297d9c53f..6804356ae8 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -27,7 +27,6 @@ use pocketmine\block\BlockFactory; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; 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; @@ -268,15 +267,10 @@ class ItemFactory{ $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, LegacyIds::WRITABLE_BOOK, 0), "Book & Quill")); $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, LegacyIds::WRITTEN_BOOK, 0), "Written Book")); - foreach(SkullType::getAll() as $skullType){ - $this->register((new Skull(new IID(Ids::MOB_HEAD, LegacyIds::SKULL, 0), "Mob Head"))->setSkullType($skullType)); - } - foreach(DyeColor::getAll() as $color){ //TODO: use colour object directly //TODO: add interface to dye-colour objects $this->register((new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye"))->setColor($color)); - $this->register((new Bed(new IID(Ids::BED, LegacyIds::BED, 0), "Bed"))->setColor($color)); $this->register((new Banner( new IID(Ids::BANNER, LegacyIds::BANNER, 0), Blocks::BANNER(), diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 043414fd99..d60371ec50 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -43,7 +43,7 @@ final class ItemTypeIds{ public const BAKED_POTATO = 20004; public const BAMBOO = 20005; public const BANNER = 20006; - public const BED = 20007; + public const BEETROOT = 20008; public const BEETROOT_SEEDS = 20009; public const BEETROOT_SOUP = 20010; @@ -189,7 +189,7 @@ final class ItemTypeIds{ public const MELON_SEEDS = 20150; public const MILK_BUCKET = 20151; public const MINECART = 20152; - public const MOB_HEAD = 20153; + public const MUSHROOM_STEW = 20154; public const NAUTILUS_SHELL = 20155; public const NETHER_BRICK = 20156; diff --git a/src/item/Skull.php b/src/item/Skull.php deleted file mode 100644 index c95746515a..0000000000 --- a/src/item/Skull.php +++ /dev/null @@ -1,57 +0,0 @@ -skullType = SkullType::SKELETON(); - parent::__construct($identifier, $name); - } - - public function getMeta() : int{ - return $this->skullType->getMagicNumber(); - } - - public function getBlock(?int $clickedFace = null) : Block{ - //TODO: we ought to be able to represent this as a regular ItemBlock - //but that's not currently possible because the skulltype isn't part of the internal block runtimeID - return VanillaBlocks::MOB_HEAD()->setSkullType($this->skullType); - } - - public function getSkullType() : SkullType{ - return $this->skullType; - } - - /** @return $this */ - public function setSkullType(SkullType $skullType) : self{ - $this->skullType = $skullType; - return $this; - } -} diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d2c1385e51..a6a1d33bf7 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -117,6 +117,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("barrier", fn() => Blocks::BARRIER()); $result->registerBlock("basalt", fn() => Blocks::BASALT()); $result->registerBlock("beacon", fn() => Blocks::BEACON()); + $result->registerBlock("bed", fn() => Blocks::BED()); $result->registerBlock("bed_block", fn() => Blocks::BED()); $result->registerBlock("bedrock", fn() => Blocks::BEDROCK()); $result->registerBlock("beetroot_block", fn() => Blocks::BEETROOTS()); @@ -215,6 +216,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); + $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::CREEPER())); $result->registerBlock("cut_red_sandstone", fn() => Blocks::CUT_RED_SANDSTONE()); $result->registerBlock("cut_red_sandstone_slab", fn() => Blocks::CUT_RED_SANDSTONE_SLAB()); $result->registerBlock("cut_sandstone", fn() => Blocks::CUT_SANDSTONE()); @@ -275,6 +277,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("double_wooden_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); $result->registerBlock("double_wooden_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); $result->registerBlock("dragon_egg", fn() => Blocks::DRAGON_EGG()); + $result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::DRAGON())); $result->registerBlock("dried_kelp_block", fn() => Blocks::DRIED_KELP()); $result->registerBlock("dyed_shulker_box", fn() => Blocks::DYED_SHULKER_BOX()); $result->registerBlock("element_0", fn() => Blocks::ELEMENT_ZERO()); @@ -667,6 +670,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER()); $result->registerBlock("melon_block", fn() => Blocks::MELON()); $result->registerBlock("melon_stem", fn() => Blocks::MELON_STEM()); + $result->registerBlock("mob_head", fn() => Blocks::MOB_HEAD()); $result->registerBlock("mob_head_block", fn() => Blocks::MOB_HEAD()); $result->registerBlock("mob_spawner", fn() => Blocks::MONSTER_SPAWNER()); $result->registerBlock("monster_egg", fn() => Blocks::INFESTED_STONE()); @@ -730,6 +734,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); + $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::PLAYER())); $result->registerBlock("podzol", fn() => Blocks::PODZOL()); $result->registerBlock("polished_andesite", fn() => Blocks::POLISHED_ANDESITE()); $result->registerBlock("polished_andesite_slab", fn() => Blocks::POLISHED_ANDESITE_SLAB()); @@ -826,6 +831,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN()); + $result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::SKELETON())); + $result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::SKELETON())); $result->registerBlock("skull_block", fn() => Blocks::MOB_HEAD()); $result->registerBlock("slab", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); @@ -946,6 +953,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); + $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::WITHER_SKELETON())); $result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false)); $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("wood_door_block", fn() => Blocks::OAK_DOOR()); @@ -965,6 +973,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wool", fn() => Blocks::WOOL()); $result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("yellow_flower", fn() => Blocks::DANDELION()); + $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); $result->register("apple", fn() => Items::APPLE()); @@ -975,7 +984,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD())); $result->register("baked_potato", fn() => Items::BAKED_POTATO()); $result->register("baked_potatoes", fn() => Items::BAKED_POTATO()); - $result->register("bed", fn() => Items::BED()); $result->register("beef", fn() => Items::RAW_BEEF()); $result->register("beetroot", fn() => Items::BEETROOT()); $result->register("beetroot_seed", fn() => Items::BEETROOT_SEEDS()); @@ -1065,7 +1073,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("cooked_rabbit", fn() => Items::COOKED_RABBIT()); $result->register("cooked_salmon", fn() => Items::COOKED_SALMON()); $result->register("cookie", fn() => Items::COOKIE()); - $result->register("creeper_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::CREEPER())); $result->register("dark_oak_boat", fn() => Items::DARK_OAK_BOAT()); $result->register("diamond", fn() => Items::DIAMOND()); $result->register("diamond_axe", fn() => Items::DIAMOND_AXE()); @@ -1078,7 +1085,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("diamond_shovel", fn() => Items::DIAMOND_SHOVEL()); $result->register("diamond_sword", fn() => Items::DIAMOND_SWORD()); $result->register("dragon_breath", fn() => Items::DRAGON_BREATH()); - $result->register("dragon_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::DRAGON())); $result->register("dried_kelp", fn() => Items::DRIED_KELP()); $result->register("dye", fn() => Items::INK_SAC()); $result->register("egg", fn() => Items::EGG()); @@ -1190,7 +1196,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("melon_slice", fn() => Items::MELON()); $result->register("milk_bucket", fn() => Items::MILK_BUCKET()); $result->register("minecart", fn() => Items::MINECART()); - $result->register("mob_head", fn() => Items::MOB_HEAD()); $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE())); $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE())); $result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW()); @@ -1210,7 +1215,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); - $result->register("player_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::PLAYER())); $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON())); $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON())); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); @@ -1259,8 +1263,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("seeds", fn() => Items::WHEAT_SEEDS()); $result->register("shears", fn() => Items::SHEARS()); $result->register("shulker_shell", fn() => Items::SHULKER_SHELL()); - $result->register("skeleton_skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::SKELETON())); - $result->register("skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::SKELETON())); $result->register("slime_ball", fn() => Items::SLIMEBALL()); $result->register("slimeball", fn() => Items::SLIMEBALL()); $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING())); @@ -1321,7 +1323,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER())); - $result->register("wither_skeleton_skull", fn() => Items::MOB_HEAD()->setSkullType(SkullType::WITHER_SKELETON())); $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER())); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); @@ -1330,7 +1331,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("wooden_sword", fn() => Items::WOODEN_SWORD()); $result->register("writable_book", fn() => Items::WRITABLE_BOOK()); $result->register("written_book", fn() => Items::WRITTEN_BOOK()); - $result->register("zombie_head", fn() => Items::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); $result->register("zombie_spawn_egg", fn() => Items::ZOMBIE_SPAWN_EGG()); return $result; diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 955de8a619..6daf64ff86 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -40,7 +40,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static BakedPotato BAKED_POTATO() * @method static Bamboo BAMBOO() * @method static Banner BANNER() - * @method static Bed BED() * @method static Beetroot BEETROOT() * @method static BeetrootSeeds BEETROOT_SEEDS() * @method static BeetrootSoup BEETROOT_SOUP() @@ -186,7 +185,6 @@ use pocketmine\utils\CloningRegistryTrait; * @method static MelonSeeds MELON_SEEDS() * @method static MilkBucket MILK_BUCKET() * @method static Minecart MINECART() - * @method static Skull MOB_HEAD() * @method static MushroomStew MUSHROOM_STEW() * @method static Item NAUTILUS_SHELL() * @method static Item NETHER_BRICK() @@ -294,7 +292,6 @@ final class VanillaItems{ self::register("baked_potato", $factory->get(Ids::BAKED_POTATO)); self::register("bamboo", $factory->get(Ids::BAMBOO)); self::register("banner", $factory->get(Ids::BANNER)); - self::register("bed", $factory->get(Ids::BED)); self::register("beetroot", $factory->get(Ids::BEETROOT)); self::register("beetroot_seeds", $factory->get(Ids::BEETROOT_SEEDS)); self::register("beetroot_soup", $factory->get(Ids::BEETROOT_SOUP)); @@ -440,7 +437,6 @@ final class VanillaItems{ self::register("melon_seeds", $factory->get(Ids::MELON_SEEDS)); self::register("milk_bucket", $factory->get(Ids::BUCKET, 1)); self::register("minecart", $factory->get(Ids::MINECART)); - self::register("mob_head", $factory->get(Ids::MOB_HEAD)); self::register("mushroom_stew", $factory->get(Ids::MUSHROOM_STEW)); self::register("nautilus_shell", $factory->get(Ids::NAUTILUS_SHELL)); self::register("nether_brick", $factory->get(Ids::NETHERBRICK)); From c7ba791ff89d479f839ea06e269ff2654c94cfd2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 00:49:57 +0100 Subject: [PATCH 0233/1858] Block: remove obsolete note from Block::isSameType() --- src/block/Block.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 0044fb5a7d..baad10b8f2 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -216,9 +216,6 @@ class Block{ /** * Returns whether the given block has an equivalent type to this one. This compares the type IDs. - * - * Note: This ignores additional IDs used to represent additional states. This means that, for example, a lit - * furnace and unlit furnace are considered the same type. */ public function isSameType(Block $other) : bool{ return $this->getTypeId() === $other->getTypeId(); From 89632f35149229d050919048de703454d44256c3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 01:43:27 +0100 Subject: [PATCH 0234/1858] Added deepslate, cobbled/tiles/bricks walls/slabs/stairs/cubes --- src/block/BlockFactory.php | 27 +++++++++++++++++ src/block/BlockTypeIds.php | 17 ++++++++++- src/block/VanillaBlocks.php | 30 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 18 +++++++++++ .../BlockStateToBlockObjectDeserializer.php | 18 +++++++++++ src/item/StringToItemParser.php | 15 ++++++++++ .../block_factory_consistency_check.json | 2 +- 7 files changed, 125 insertions(+), 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 1a88083b2e..ec5c0f4ce9 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -880,6 +880,33 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + + //TODO: check blast resistance + $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); + + //TODO: check blast resistance + $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); + $this->register(new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); + $this->register(new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); + + //TODO: check blast resistance + $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); + $this->register(new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); + $this->register(new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); + $this->register(new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); + $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); + + //TODO: check blast resistance + $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + $this->register(new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + $this->register(new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); + $this->register(new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); } /** diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index eddb34a552..4eb4c07b8b 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -590,6 +590,21 @@ final class BlockTypeIds{ public const RAW_GOLD = 10563; public const RAW_IRON = 10564; public const CALCITE = 10565; + public const DEEPSLATE = 10566; + public const DEEPSLATE_BRICKS = 10567; + public const DEEPSLATE_BRICK_SLAB = 10568; + public const DEEPSLATE_BRICK_STAIRS = 10569; + public const DEEPSLATE_BRICK_WALL = 10570; + public const CRACKED_DEEPSLATE_BRICKS = 10571; + public const DEEPSLATE_TILES = 10572; + public const DEEPSLATE_TILE_SLAB = 10573; + public const DEEPSLATE_TILE_STAIRS = 10574; + public const DEEPSLATE_TILE_WALL = 10575; + public const CRACKED_DEEPSLATE_TILES = 10576; + public const COBBLED_DEEPSLATE = 10577; + public const COBBLED_DEEPSLATE_SLAB = 10578; + public const COBBLED_DEEPSLATE_STAIRS = 10579; + public const COBBLED_DEEPSLATE_WALL = 10580; - public const FIRST_UNUSED_BLOCK_ID = 10566; + public const FIRST_UNUSED_BLOCK_ID = 10581; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 509c2a5eb6..fa748d393a 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -118,6 +118,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Clay CLAY() * @method static Coal COAL() * @method static CoalOre COAL_ORE() + * @method static Opaque COBBLED_DEEPSLATE() + * @method static Slab COBBLED_DEEPSLATE_SLAB() + * @method static Stair COBBLED_DEEPSLATE_STAIRS() + * @method static Wall COBBLED_DEEPSLATE_WALL() * @method static Opaque COBBLESTONE() * @method static Slab COBBLESTONE_SLAB() * @method static Stair COBBLESTONE_STAIRS() @@ -131,6 +135,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CoralBlock CORAL_BLOCK() * @method static FloorCoralFan CORAL_FAN() * @method static Flower CORNFLOWER() + * @method static Opaque CRACKED_DEEPSLATE_BRICKS() + * @method static Opaque CRACKED_DEEPSLATE_TILES() * @method static Opaque CRACKED_POLISHED_BLACKSTONE_BRICKS() * @method static Opaque CRACKED_STONE_BRICKS() * @method static CraftingTable CRAFTING_TABLE() @@ -159,6 +165,15 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Stair DARK_PRISMARINE_STAIRS() * @method static DaylightSensor DAYLIGHT_SENSOR() * @method static DeadBush DEAD_BUSH() + * @method static SimplePillar DEEPSLATE() + * @method static Opaque DEEPSLATE_BRICKS() + * @method static Slab DEEPSLATE_BRICK_SLAB() + * @method static Stair DEEPSLATE_BRICK_STAIRS() + * @method static Wall DEEPSLATE_BRICK_WALL() + * @method static Opaque DEEPSLATE_TILES() + * @method static Slab DEEPSLATE_TILE_SLAB() + * @method static Stair DEEPSLATE_TILE_STAIRS() + * @method static Wall DEEPSLATE_TILE_WALL() * @method static DetectorRail DETECTOR_RAIL() * @method static Opaque DIAMOND() * @method static DiamondOre DIAMOND_ORE() @@ -680,6 +695,10 @@ final class VanillaBlocks{ 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("cobbled_deepslate", $factory->get(Ids::COBBLED_DEEPSLATE, 0)); + self::register("cobbled_deepslate_slab", $factory->get(Ids::COBBLED_DEEPSLATE_SLAB, 0)); + self::register("cobbled_deepslate_stairs", $factory->get(Ids::COBBLED_DEEPSLATE_STAIRS, 0)); + self::register("cobbled_deepslate_wall", $factory->get(Ids::COBBLED_DEEPSLATE_WALL, 0)); self::register("cobblestone", $factory->get(Ids::COBBLESTONE, 0)); self::register("cobblestone_slab", $factory->get(Ids::COBBLESTONE_SLAB, 0)); self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 0)); @@ -693,6 +712,8 @@ final class VanillaBlocks{ 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_deepslate_bricks", $factory->get(Ids::CRACKED_DEEPSLATE_BRICKS, 0)); + self::register("cracked_deepslate_tiles", $factory->get(Ids::CRACKED_DEEPSLATE_TILES, 0)); self::register("cracked_polished_blackstone_bricks", $factory->get(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, 0)); self::register("cracked_stone_bricks", $factory->get(Ids::CRACKED_STONE_BRICKS, 0)); self::register("crafting_table", $factory->get(Ids::CRAFTING_TABLE, 0)); @@ -721,6 +742,15 @@ final class VanillaBlocks{ self::register("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 0)); self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_SENSOR, 0)); self::register("dead_bush", $factory->get(Ids::DEAD_BUSH, 0)); + self::register("deepslate", $factory->get(Ids::DEEPSLATE, 2)); + self::register("deepslate_brick_slab", $factory->get(Ids::DEEPSLATE_BRICK_SLAB, 0)); + self::register("deepslate_brick_stairs", $factory->get(Ids::DEEPSLATE_BRICK_STAIRS, 0)); + self::register("deepslate_brick_wall", $factory->get(Ids::DEEPSLATE_BRICK_WALL, 0)); + self::register("deepslate_bricks", $factory->get(Ids::DEEPSLATE_BRICKS, 0)); + self::register("deepslate_tile_slab", $factory->get(Ids::DEEPSLATE_TILE_SLAB, 0)); + self::register("deepslate_tile_stairs", $factory->get(Ids::DEEPSLATE_TILE_STAIRS, 0)); + self::register("deepslate_tile_wall", $factory->get(Ids::DEEPSLATE_TILE_WALL, 0)); + self::register("deepslate_tiles", $factory->get(Ids::DEEPSLATE_TILES, 0)); self::register("detector_rail", $factory->get(Ids::DETECTOR_RAIL, 0)); self::register("diamond", $factory->get(Ids::DIAMOND, 0)); self::register("diamond_ore", $factory->get(Ids::DIAMOND_ORE, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index eb78550ef6..1ad041277b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -408,6 +408,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CLAY(), Ids::CLAY); $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); $this->mapSimple(Blocks::COAL_ORE(), Ids::COAL_ORE); + $this->mapSimple(Blocks::COBBLED_DEEPSLATE(), Ids::COBBLED_DEEPSLATE); + $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); + $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); + $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); $this->mapSimple(Blocks::COBBLESTONE(), Ids::COBBLESTONE); $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); @@ -447,6 +451,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); }); $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); + $this->mapSimple(Blocks::CRACKED_DEEPSLATE_BRICKS(), Ids::CRACKED_DEEPSLATE_BRICKS); + $this->mapSimple(Blocks::CRACKED_DEEPSLATE_TILES(), Ids::CRACKED_DEEPSLATE_TILES); $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); @@ -481,6 +487,18 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); $this->mapSimple(Blocks::DEAD_BUSH(), Ids::DEADBUSH); + $this->map(Blocks::DEEPSLATE(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::DEEPSLATE) + ->writePillarAxis($block->getAxis()); + }); + $this->mapSimple(Blocks::DEEPSLATE_BRICKS(), Ids::DEEPSLATE_BRICKS); + $this->mapSlab(Blocks::DEEPSLATE_BRICK_SLAB(), Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB); + $this->mapStairs(Blocks::DEEPSLATE_BRICK_STAIRS(), Ids::DEEPSLATE_BRICK_STAIRS); + $this->map(Blocks::DEEPSLATE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_BRICK_WALL))); + $this->mapSimple(Blocks::DEEPSLATE_TILES(), Ids::DEEPSLATE_TILES); + $this->mapSlab(Blocks::DEEPSLATE_TILE_SLAB(), Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB); + $this->mapStairs(Blocks::DEEPSLATE_TILE_STAIRS(), Ids::DEEPSLATE_TILE_STAIRS); + $this->map(Blocks::DEEPSLATE_TILE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_TILE_WALL))); $this->map(Blocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ return Writer::create(Ids::DETECTOR_RAIL) ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index dc20af369c..a61433cc56 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -239,6 +239,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CLAY, fn() => Blocks::CLAY()); $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); + $this->map(Ids::COBBLED_DEEPSLATE, fn() => Blocks::COBBLED_DEEPSLATE()); + $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); + $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); + $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); $this->map(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE()); $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); $this->map(Ids::COCOA, function(Reader $in) : Block{ @@ -289,6 +293,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType(CoralType::HORN()); }); + $this->map(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); + $this->map(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); @@ -306,6 +312,18 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) ->setInverted(true)); $this->map(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); + $this->map(Ids::DEEPSLATE, function(Reader $in) : Block{ + return Blocks::DEEPSLATE() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); + $this->mapSlab(Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_BRICK_SLAB()); + $this->mapStairs(Ids::DEEPSLATE_BRICK_STAIRS, fn() => Blocks::DEEPSLATE_BRICK_STAIRS()); + $this->map(Ids::DEEPSLATE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_BRICK_WALL(), $in)); + $this->map(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); + $this->mapSlab(Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_TILE_SLAB()); + $this->mapStairs(Ids::DEEPSLATE_TILE_STAIRS, fn() => Blocks::DEEPSLATE_TILE_STAIRS()); + $this->map(Ids::DEEPSLATE_TILE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_TILE_WALL(), $in)); $this->map(Ids::DETECTOR_RAIL, function(Reader $in) : Block{ return Blocks::DETECTOR_RAIL() ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT)) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a6a1d33bf7..1e8b00dc25 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -188,6 +188,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cobble", fn() => Blocks::COBBLESTONE()); $result->registerBlock("cobble_stairs", fn() => Blocks::COBBLESTONE_STAIRS()); $result->registerBlock("cobble_wall", fn() => Blocks::COBBLESTONE_WALL()); + $result->registerBlock("cobbled_deepslate", fn() => Blocks::COBBLED_DEEPSLATE()); + $result->registerBlock("cobbled_deepslate_slab", fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); + $result->registerBlock("cobbled_deepslate_stairs", fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); + $result->registerBlock("cobbled_deepslate_wall", fn() => Blocks::COBBLED_DEEPSLATE_WALL()); $result->registerBlock("cobblestone", fn() => Blocks::COBBLESTONE()); $result->registerBlock("cobblestone_slab", fn() => Blocks::COBBLESTONE_SLAB()); $result->registerBlock("cobblestone_stairs", fn() => Blocks::COBBLESTONE_STAIRS()); @@ -213,6 +217,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("coral_fan_hang2", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::BUBBLE())); $result->registerBlock("coral_fan_hang3", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::HORN())); $result->registerBlock("cornflower", fn() => Blocks::CORNFLOWER()); + $result->registerBlock("cracked_deepslate_bricks", fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); + $result->registerBlock("cracked_deepslate_tiles", fn() => Blocks::CRACKED_DEEPSLATE_TILES()); $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); @@ -254,6 +260,15 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("daylight_sensor_inverted", fn() => Blocks::DAYLIGHT_SENSOR()->setInverted(true)); $result->registerBlock("dead_bush", fn() => Blocks::DEAD_BUSH()); $result->registerBlock("deadbush", fn() => Blocks::DEAD_BUSH()); + $result->registerBlock("deepslate", fn() => Blocks::DEEPSLATE()); + $result->registerBlock("deepslate_bricks", fn() => Blocks::DEEPSLATE_BRICKS()); + $result->registerBlock("deepslate_brick_slab", fn() => Blocks::DEEPSLATE_BRICK_SLAB()); + $result->registerBlock("deepslate_brick_stairs", fn() => Blocks::DEEPSLATE_BRICK_STAIRS()); + $result->registerBlock("deepslate_brick_wall", fn() => Blocks::DEEPSLATE_BRICK_WALL()); + $result->registerBlock("deepslate_tiles", fn() => Blocks::DEEPSLATE_TILES()); + $result->registerBlock("deepslate_tile_slab", fn() => Blocks::DEEPSLATE_TILE_SLAB()); + $result->registerBlock("deepslate_tile_stairs", fn() => Blocks::DEEPSLATE_TILE_STAIRS()); + $result->registerBlock("deepslate_tile_wall", fn() => Blocks::DEEPSLATE_TILE_WALL()); $result->registerBlock("detector_rail", fn() => Blocks::DETECTOR_RAIL()); $result->registerBlock("diamond_block", fn() => Blocks::DIAMOND()); $result->registerBlock("diamond_ore", fn() => Blocks::DIAMOND_ORE()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index ec2e587d67..32606ee1de 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From a3016abf538758ecd87a44e22359b35b962ff0ea Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 02:00:43 +0100 Subject: [PATCH 0235/1858] Added polished deepslate block/slab/stair/wall --- src/block/BlockFactory.php | 7 +++++++ src/block/BlockTypeIds.php | 6 +++++- src/block/VanillaBlocks.php | 8 ++++++++ .../block/convert/BlockObjectToBlockStateSerializer.php | 4 ++++ .../block/convert/BlockStateToBlockObjectDeserializer.php | 5 ++++- src/item/StringToItemParser.php | 4 ++++ tests/phpunit/block/block_factory_consistency_check.json | 2 +- 7 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index ec5c0f4ce9..299c30c14c 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -907,6 +907,13 @@ class BlockFactory{ $this->register(new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); $this->register(new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); $this->register(new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); + + //TODO: check blast resistance + $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); + $this->register(new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); + $this->register(new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); } /** diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 4eb4c07b8b..744e1c67b6 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -605,6 +605,10 @@ final class BlockTypeIds{ public const COBBLED_DEEPSLATE_SLAB = 10578; public const COBBLED_DEEPSLATE_STAIRS = 10579; public const COBBLED_DEEPSLATE_WALL = 10580; + public const POLISHED_DEEPSLATE = 10581; + public const POLISHED_DEEPSLATE_SLAB = 10582; + public const POLISHED_DEEPSLATE_STAIRS = 10583; + public const POLISHED_DEEPSLATE_WALL = 10584; - public const FIRST_UNUSED_BLOCK_ID = 10581; + public const FIRST_UNUSED_BLOCK_ID = 10585; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index fa748d393a..55c8873cc5 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -457,6 +457,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab POLISHED_BLACKSTONE_SLAB() * @method static Stair POLISHED_BLACKSTONE_STAIRS() * @method static Wall POLISHED_BLACKSTONE_WALL() + * @method static Opaque POLISHED_DEEPSLATE() + * @method static Slab POLISHED_DEEPSLATE_SLAB() + * @method static Stair POLISHED_DEEPSLATE_STAIRS() + * @method static Wall POLISHED_DEEPSLATE_WALL() * @method static Opaque POLISHED_DIORITE() * @method static Slab POLISHED_DIORITE_SLAB() * @method static Stair POLISHED_DIORITE_STAIRS() @@ -1034,6 +1038,10 @@ final class VanillaBlocks{ self::register("polished_blackstone_slab", $factory->get(Ids::POLISHED_BLACKSTONE_SLAB, 0)); self::register("polished_blackstone_stairs", $factory->get(Ids::POLISHED_BLACKSTONE_STAIRS, 0)); self::register("polished_blackstone_wall", $factory->get(Ids::POLISHED_BLACKSTONE_WALL, 0)); + self::register("polished_deepslate", $factory->get(Ids::POLISHED_DEEPSLATE, 0)); + self::register("polished_deepslate_slab", $factory->get(Ids::POLISHED_DEEPSLATE_SLAB, 0)); + self::register("polished_deepslate_stairs", $factory->get(Ids::POLISHED_DEEPSLATE_STAIRS, 0)); + self::register("polished_deepslate_wall", $factory->get(Ids::POLISHED_DEEPSLATE_WALL, 0)); 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, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 1ad041277b..723c6cd4a3 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -909,6 +909,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::POLISHED_BLACKSTONE_SLAB(), Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_BLACKSTONE_STAIRS(), Ids::POLISHED_BLACKSTONE_STAIRS); $this->map(Blocks::POLISHED_BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_WALL))); + $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); + $this->mapSlab(Blocks::POLISHED_DEEPSLATE_SLAB(), Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB); + $this->mapStairs(Blocks::POLISHED_DEEPSLATE_STAIRS(), Ids::POLISHED_DEEPSLATE_STAIRS); + $this->map(Blocks::POLISHED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_DEEPSLATE_WALL))); $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index a61433cc56..dbaab7c397 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -774,7 +774,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->mapSlab(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB()); $this->mapStairs(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS()); $this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), $in)); - + $this->map(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); + $this->mapSlab(Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DEEPSLATE_SLAB()); + $this->mapStairs(Ids::POLISHED_DEEPSLATE_STAIRS, fn() => Blocks::POLISHED_DEEPSLATE_STAIRS()); + $this->map(Ids::POLISHED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_DEEPSLATE_WALL(), $in)); $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS()); $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS()); $this->map(Ids::PORTAL, function(Reader $in) : Block{ diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 1e8b00dc25..fdcf2aa558 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -765,6 +765,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("polished_blackstone_slab", fn() => Blocks::POLISHED_BLACKSTONE_SLAB()); $result->registerBlock("polished_blackstone_stairs", fn() => Blocks::POLISHED_BLACKSTONE_STAIRS()); $result->registerBlock("polished_blackstone_wall", fn() => Blocks::POLISHED_BLACKSTONE_WALL()); + $result->registerBlock("polished_deepslate", fn() => Blocks::POLISHED_DEEPSLATE()); + $result->registerBlock("polished_deepslate_slab", fn() => Blocks::POLISHED_DEEPSLATE_SLAB()); + $result->registerBlock("polished_deepslate_stairs", fn() => Blocks::POLISHED_DEEPSLATE_STAIRS()); + $result->registerBlock("polished_deepslate_wall", fn() => Blocks::POLISHED_DEEPSLATE_WALL()); $result->registerBlock("polished_diorite", fn() => Blocks::POLISHED_DIORITE()); $result->registerBlock("polished_diorite_slab", fn() => Blocks::POLISHED_DIORITE_SLAB()); $result->registerBlock("polished_diorite_stairs", fn() => Blocks::POLISHED_DIORITE_STAIRS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 32606ee1de..a57a32f2e9 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From 227a48147392262ca207e5f50a4c55c30481dfe3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 02:01:28 +0100 Subject: [PATCH 0236/1858] generate-block-palette-spec: include blocks with no properties --- tools/generate-block-palette-spec.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index a9992ec1aa..c3b04b0e52 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -77,6 +77,7 @@ $reportMap = []; foreach($palette->getStates() as $entry){ $state = $entry->getStateData(); $name = $state->getName(); + $reportMap[$name] ??= []; foreach($state->getStates() as $propertyName => $value){ if($value instanceof IntTag || $value instanceof StringTag){ $rawValue = $value->getValue(); From 4acf7aadbd0c50da0a4178ddab471718f298f1ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 02:11:28 +0100 Subject: [PATCH 0237/1858] Added quartz bricks --- src/block/BlockFactory.php | 1 + src/block/BlockTypeIds.php | 3 ++- src/block/VanillaBlocks.php | 2 ++ .../block/convert/BlockObjectToBlockStateSerializer.php | 1 + .../block/convert/BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + tests/phpunit/block/block_factory_consistency_check.json | 2 +- 7 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 299c30c14c..01f22655ee 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -299,6 +299,7 @@ class BlockFactory{ $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ), "Smooth Quartz Block", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::QUARTZ_BRICKS), "Quartz Bricks", $quartzBreakInfo)); $this->register(new Stair(new BID(Ids::QUARTZ_STAIRS), "Quartz Stairs", $quartzBreakInfo)); $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 744e1c67b6..8a832de7dc 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -609,6 +609,7 @@ final class BlockTypeIds{ public const POLISHED_DEEPSLATE_SLAB = 10582; public const POLISHED_DEEPSLATE_STAIRS = 10583; public const POLISHED_DEEPSLATE_WALL = 10584; + public const QUARTZ_BRICKS = 10585; - public const FIRST_UNUSED_BLOCK_ID = 10585; + public const FIRST_UNUSED_BLOCK_ID = 10586; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 55c8873cc5..c65d7e1161 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -485,6 +485,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab PURPUR_SLAB() * @method static Stair PURPUR_STAIRS() * @method static Opaque QUARTZ() + * @method static Opaque QUARTZ_BRICKS() * @method static SimplePillar QUARTZ_PILLAR() * @method static Slab QUARTZ_SLAB() * @method static Stair QUARTZ_STAIRS() @@ -1066,6 +1067,7 @@ final class VanillaBlocks{ self::register("purpur_slab", $factory->get(Ids::PURPUR_SLAB, 0)); self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 0)); self::register("quartz", $factory->get(Ids::QUARTZ, 0)); + self::register("quartz_bricks", $factory->get(Ids::QUARTZ_BRICKS, 0)); self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 2)); self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 723c6cd4a3..9e578ec6ba 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -954,6 +954,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); $this->mapStairs(Blocks::PURPUR_STAIRS(), Ids::PURPUR_STAIRS); $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); + $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); $this->mapStairs(Blocks::QUARTZ_STAIRS(), Ids::QUARTZ_STAIRS); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index dbaab7c397..33a3fbf786 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -840,6 +840,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return throw $in->badValueException(StateNames::CHISEL_TYPE, $type); } }); + $this->map(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS()); $this->map(Ids::RAIL, function(Reader $in) : Block{ diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index fdcf2aa558..4a3dd78326 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -801,6 +801,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("purpur_slab", fn() => Blocks::PURPUR_SLAB()); $result->registerBlock("purpur_stairs", fn() => Blocks::PURPUR_STAIRS()); $result->registerBlock("quartz_block", fn() => Blocks::QUARTZ()); + $result->registerBlock("quartz_bricks", fn() => Blocks::QUARTZ_BRICKS()); $result->registerBlock("quartz_ore", fn() => Blocks::NETHER_QUARTZ_ORE()); $result->registerBlock("quartz_pillar", fn() => Blocks::QUARTZ_PILLAR()); $result->registerBlock("quartz_slab", fn() => Blocks::QUARTZ_SLAB()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index a57a32f2e9..8797f8b863 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From e302e5a85f73fe90fedcb5750b6804b343bbff6a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 03:04:06 +0100 Subject: [PATCH 0238/1858] Implemented chiseled deepslate, chiseled nether brick and cracked nether brick --- src/block/BlockFactory.php | 6 ++++++ src/block/BlockTypeIds.php | 5 ++++- src/block/VanillaBlocks.php | 6 ++++++ .../block/convert/BlockObjectToBlockStateSerializer.php | 3 +++ .../block/convert/BlockStateToBlockObjectDeserializer.php | 3 +++ src/item/StringToItemParser.php | 3 +++ tests/phpunit/block/block_factory_consistency_check.json | 2 +- 7 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 01f22655ee..4376ce978f 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -261,6 +261,9 @@ class BlockFactory{ $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS), "Nether Brick Stairs", $netherBrickBreakInfo)); $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS), "Red Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_NETHER_BRICKS), "Chiseled Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); + $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); @@ -886,6 +889,9 @@ class BlockFactory{ $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); $this->register(new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); + //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 + $this->register(new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + //TODO: check blast resistance $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); $this->register(new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 8a832de7dc..e8dfc65aac 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -610,6 +610,9 @@ final class BlockTypeIds{ public const POLISHED_DEEPSLATE_STAIRS = 10583; public const POLISHED_DEEPSLATE_WALL = 10584; public const QUARTZ_BRICKS = 10585; + public const CHISELED_DEEPSLATE = 10586; + public const CHISELED_NETHER_BRICKS = 10587; + public const CRACKED_NETHER_BRICKS = 10588; - public const FIRST_UNUSED_BLOCK_ID = 10586; + public const FIRST_UNUSED_BLOCK_ID = 10589; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index c65d7e1161..44880e53af 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -110,6 +110,8 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CarvedPumpkin CARVED_PUMPKIN() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() + * @method static Opaque CHISELED_DEEPSLATE() + * @method static Opaque CHISELED_NETHER_BRICKS() * @method static Opaque CHISELED_POLISHED_BLACKSTONE() * @method static SimplePillar CHISELED_QUARTZ() * @method static Opaque CHISELED_RED_SANDSTONE() @@ -137,6 +139,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Flower CORNFLOWER() * @method static Opaque CRACKED_DEEPSLATE_BRICKS() * @method static Opaque CRACKED_DEEPSLATE_TILES() + * @method static Opaque CRACKED_NETHER_BRICKS() * @method static Opaque CRACKED_POLISHED_BLACKSTONE_BRICKS() * @method static Opaque CRACKED_STONE_BRICKS() * @method static CraftingTable CRAFTING_TABLE() @@ -692,6 +695,8 @@ final class VanillaBlocks{ 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, 0)); + self::register("chiseled_deepslate", $factory->get(Ids::CHISELED_DEEPSLATE, 0)); + self::register("chiseled_nether_bricks", $factory->get(Ids::CHISELED_NETHER_BRICKS, 0)); self::register("chiseled_polished_blackstone", $factory->get(Ids::CHISELED_POLISHED_BLACKSTONE, 0)); self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 2)); self::register("chiseled_red_sandstone", $factory->get(Ids::CHISELED_RED_SANDSTONE, 0)); @@ -719,6 +724,7 @@ final class VanillaBlocks{ self::register("cornflower", $factory->get(Ids::CORNFLOWER, 0)); self::register("cracked_deepslate_bricks", $factory->get(Ids::CRACKED_DEEPSLATE_BRICKS, 0)); self::register("cracked_deepslate_tiles", $factory->get(Ids::CRACKED_DEEPSLATE_TILES, 0)); + self::register("cracked_nether_bricks", $factory->get(Ids::CRACKED_NETHER_BRICKS, 0)); self::register("cracked_polished_blackstone_bricks", $factory->get(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, 0)); self::register("cracked_stone_bricks", $factory->get(Ids::CRACKED_STONE_BRICKS, 0)); self::register("crafting_table", $factory->get(Ids::CRAFTING_TABLE, 0)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 9e578ec6ba..f3ca59ac4e 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -400,6 +400,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); }); + $this->mapSimple(Blocks::CHISELED_DEEPSLATE(), Ids::CHISELED_DEEPSLATE); + $this->mapSimple(Blocks::CHISELED_NETHER_BRICKS(), Ids::CHISELED_NETHER_BRICKS); $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); @@ -453,6 +455,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); $this->mapSimple(Blocks::CRACKED_DEEPSLATE_BRICKS(), Ids::CRACKED_DEEPSLATE_BRICKS); $this->mapSimple(Blocks::CRACKED_DEEPSLATE_TILES(), Ids::CRACKED_DEEPSLATE_TILES); + $this->mapSimple(Blocks::CRACKED_NETHER_BRICKS(), Ids::CRACKED_NETHER_BRICKS); $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 33a3fbf786..d2ea5ff99f 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -235,6 +235,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CHEST() ->setFacing($in->readHorizontalFacing()); }); + $this->map(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); + $this->map(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); $this->map(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); $this->map(Ids::CLAY, fn() => Blocks::CLAY()); $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); @@ -295,6 +297,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); $this->map(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); + $this->map(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 4a3dd78326..d8d54924ee 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -176,6 +176,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); $result->registerBlock("chipped_anvil", fn() => Blocks::ANVIL()->setDamage(1)); + $result->registerBlock("chiseled_deepslate", fn() => Blocks::CHISELED_DEEPSLATE()); + $result->registerBlock("chiseled_nether_bricks", fn() => Blocks::CHISELED_NETHER_BRICKS()); $result->registerBlock("chiseled_polished_blackstone", fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); $result->registerBlock("chiseled_quartz", fn() => Blocks::CHISELED_QUARTZ()); $result->registerBlock("chiseled_red_sandstone", fn() => Blocks::CHISELED_RED_SANDSTONE()); @@ -219,6 +221,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cornflower", fn() => Blocks::CORNFLOWER()); $result->registerBlock("cracked_deepslate_bricks", fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); $result->registerBlock("cracked_deepslate_tiles", fn() => Blocks::CRACKED_DEEPSLATE_TILES()); + $result->registerBlock("cracked_nether_bricks", fn() => Blocks::CRACKED_NETHER_BRICKS()); $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 8797f8b863..ac0dcf19c7 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From 3e7d34c8adf47fd79a38184d42705d70c3804668 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 14:33:42 +0100 Subject: [PATCH 0239/1858] BlockFactory: remove TODO list we're tracking this somewhere else now --- src/block/BlockFactory.php | 134 ------------------------------------- 1 file changed, 134 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 4376ce978f..cb65adad32 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -565,140 +565,6 @@ class BlockFactory{ $this->registerBlocksR13(); $this->registerBlocksR16(); $this->registerBlocksR17(); - - //region --- auto-generated TODOs for bedrock-1.11.0 --- - //TODO: minecraft:bubble_column - //TODO: minecraft:campfire - //TODO: minecraft:cartography_table - //TODO: minecraft:cauldron - //TODO: minecraft:chain_command_block - //TODO: minecraft:chorus_flower - //TODO: minecraft:chorus_plant - //TODO: minecraft:command_block - //TODO: minecraft:composter - //TODO: minecraft:conduit - //TODO: minecraft:dispenser - //TODO: minecraft:dropper - //TODO: minecraft:end_gateway - //TODO: minecraft:end_portal - //TODO: minecraft:grindstone - //TODO: minecraft:jigsaw - //TODO: minecraft:kelp - //TODO: minecraft:lava_cauldron - //TODO: minecraft:movingBlock - //TODO: minecraft:observer - //TODO: minecraft:piston - //TODO: minecraft:pistonArmCollision - //TODO: minecraft:repeating_command_block - //TODO: minecraft:scaffolding - //TODO: minecraft:seagrass - //TODO: minecraft:smithing_table - //TODO: minecraft:sticky_piston - //TODO: minecraft:structure_block - //TODO: minecraft:turtle_egg - //endregion - - //region --- auto-generated TODOs for bedrock-1.13.0 --- - //TODO: minecraft:camera - //TODO: minecraft:light_block - //TODO: minecraft:stickyPistonArmCollision - //TODO: minecraft:structure_void - //TODO: minecraft:wither_rose - //endregion - - //region --- auto-generated TODOs for bedrock-1.14.0 --- - //TODO: minecraft:bee_nest - //TODO: minecraft:beehive - //TODO: minecraft:honey_block - //TODO: minecraft:honeycomb_block - //endregion - - //region --- auto-generated TODOs for bedrock-1.16.0 --- - //TODO: minecraft:allow - //TODO: minecraft:ancient_debris - //TODO: minecraft:basalt - //TODO: minecraft:blackstone - //TODO: minecraft:blackstone_double_slab - //TODO: minecraft:blackstone_slab - //TODO: minecraft:blackstone_stairs - //TODO: minecraft:blackstone_wall - //TODO: minecraft:border_block - //TODO: minecraft:chain - //TODO: minecraft:chiseled_nether_bricks - //TODO: minecraft:chiseled_polished_blackstone - //TODO: minecraft:cracked_nether_bricks - //TODO: minecraft:cracked_polished_blackstone_bricks - //TODO: minecraft:crimson_button - //TODO: minecraft:crimson_door - //TODO: minecraft:crimson_double_slab - //TODO: minecraft:crimson_fence - //TODO: minecraft:crimson_fence_gate - //TODO: minecraft:crimson_fungus - //TODO: minecraft:crimson_hyphae - //TODO: minecraft:crimson_nylium - //TODO: minecraft:crimson_planks - //TODO: minecraft:crimson_pressure_plate - //TODO: minecraft:crimson_roots - //TODO: minecraft:crimson_slab - //TODO: minecraft:crimson_stairs - //TODO: minecraft:crimson_standing_sign - //TODO: minecraft:crimson_stem - //TODO: minecraft:crimson_trapdoor - //TODO: minecraft:crimson_wall_sign - //TODO: minecraft:crying_obsidian - //TODO: minecraft:deny - //TODO: minecraft:gilded_blackstone - //TODO: minecraft:lodestone - //TODO: minecraft:nether_gold_ore - //TODO: minecraft:nether_sprouts - //TODO: minecraft:netherite_block - //TODO: minecraft:polished_basalt - //TODO: minecraft:polished_blackstone - //TODO: minecraft:polished_blackstone_brick_double_slab - //TODO: minecraft:polished_blackstone_brick_slab - //TODO: minecraft:polished_blackstone_brick_stairs - //TODO: minecraft:polished_blackstone_brick_wall - //TODO: minecraft:polished_blackstone_bricks - //TODO: minecraft:polished_blackstone_button - //TODO: minecraft:polished_blackstone_double_slab - //TODO: minecraft:polished_blackstone_pressure_plate - //TODO: minecraft:polished_blackstone_slab - //TODO: minecraft:polished_blackstone_stairs - //TODO: minecraft:polished_blackstone_wall - //TODO: minecraft:quartz_bricks - //TODO: minecraft:respawn_anchor - //TODO: minecraft:shroomlight - //TODO: minecraft:soul_campfire - //TODO: minecraft:soul_fire - //TODO: minecraft:soul_lantern - //TODO: minecraft:soul_soil - //TODO: minecraft:soul_torch - //TODO: minecraft:stripped_crimson_hyphae - //TODO: minecraft:stripped_crimson_stem - //TODO: minecraft:stripped_warped_hyphae - //TODO: minecraft:stripped_warped_stem - //TODO: minecraft:target - //TODO: minecraft:twisting_vines - //TODO: minecraft:warped_button - //TODO: minecraft:warped_door - //TODO: minecraft:warped_double_slab - //TODO: minecraft:warped_fence - //TODO: minecraft:warped_fence_gate - //TODO: minecraft:warped_fungus - //TODO: minecraft:warped_hyphae - //TODO: minecraft:warped_nylium - //TODO: minecraft:warped_planks - //TODO: minecraft:warped_pressure_plate - //TODO: minecraft:warped_roots - //TODO: minecraft:warped_slab - //TODO: minecraft:warped_stairs - //TODO: minecraft:warped_standing_sign - //TODO: minecraft:warped_stem - //TODO: minecraft:warped_trapdoor - //TODO: minecraft:warped_wall_sign - //TODO: minecraft:warped_wart_block - //TODO: minecraft:weeping_vines - //endregion } private function registerMushroomBlocks() : void{ From 33eef99d1fdbe1f5276cf46ebf0affa45698adbc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 17:27:25 +0100 Subject: [PATCH 0240/1858] Added axis support for all-sided logs --- src/block/BlockFactory.php | 2 +- src/block/Log.php | 30 ------------------- src/block/VanillaBlocks.php | 24 +++++++-------- src/block/Wood.php | 2 ++ .../BlockObjectToBlockStateSerializer.php | 13 ++++---- .../convert/BlockStateDeserializerHelper.php | 4 +-- .../convert/BlockStateSerializerHelper.php | 10 +++---- .../BlockStateToBlockObjectDeserializer.php | 22 ++++++-------- .../block_factory_consistency_check.json | 2 +- 9 files changed, 37 insertions(+), 72 deletions(-) delete mode 100644 src/block/Log.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index cb65adad32..22aede663f 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -465,7 +465,7 @@ class BlockFactory{ $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); - $this->register(new Log(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType)); + $this->register(new Wood(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType)); $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($treeType), $name . " Wood", $logBreakInfo, $treeType)); $this->register(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($treeType), $name . " Fence Gate", $planksBreakInfo)); diff --git a/src/block/Log.php b/src/block/Log.php deleted file mode 100644 index 09b0648553..0000000000 --- a/src/block/Log.php +++ /dev/null @@ -1,30 +0,0 @@ -get(Ids::ACACIA_STAIRS, 0)); self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 0)); self::register("acacia_wall_sign", $factory->get(Ids::ACACIA_WALL_SIGN, 0)); - self::register("acacia_wood", $factory->get(Ids::ACACIA_WOOD, 0)); + self::register("acacia_wood", $factory->get(Ids::ACACIA_WOOD, 4)); 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::ALL_SIDED_MUSHROOM_STEM, 0)); @@ -669,7 +669,7 @@ final class VanillaBlocks{ self::register("birch_stairs", $factory->get(Ids::BIRCH_STAIRS, 0)); self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 0)); - self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0)); + self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 4)); self::register("blackstone", $factory->get(Ids::BLACKSTONE, 0)); self::register("blackstone_slab", $factory->get(Ids::BLACKSTONE_SLAB, 0)); self::register("blackstone_stairs", $factory->get(Ids::BLACKSTONE_STAIRS, 0)); @@ -747,7 +747,7 @@ final class VanillaBlocks{ 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::DARK_OAK_WALL_SIGN, 0)); - self::register("dark_oak_wood", $factory->get(Ids::DARK_OAK_WOOD, 0)); + self::register("dark_oak_wood", $factory->get(Ids::DARK_OAK_WOOD, 4)); 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, 0)); @@ -964,7 +964,7 @@ final class VanillaBlocks{ self::register("jungle_stairs", $factory->get(Ids::JUNGLE_STAIRS, 0)); self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 0)); self::register("jungle_wall_sign", $factory->get(Ids::JUNGLE_WALL_SIGN, 0)); - self::register("jungle_wood", $factory->get(Ids::JUNGLE_WOOD, 0)); + self::register("jungle_wood", $factory->get(Ids::JUNGLE_WOOD, 4)); self::register("lab_table", $factory->get(Ids::LAB_TABLE, 0)); self::register("ladder", $factory->get(Ids::LADDER, 0)); self::register("lantern", $factory->get(Ids::LANTERN, 0)); @@ -1023,7 +1023,7 @@ final class VanillaBlocks{ self::register("oak_stairs", $factory->get(Ids::OAK_STAIRS, 0)); self::register("oak_trapdoor", $factory->get(Ids::OAK_TRAPDOOR, 0)); self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 0)); - self::register("oak_wood", $factory->get(Ids::OAK_WOOD, 0)); + self::register("oak_wood", $factory->get(Ids::OAK_WOOD, 4)); self::register("obsidian", $factory->get(Ids::OBSIDIAN, 0)); self::register("orange_tulip", $factory->get(Ids::ORANGE_TULIP, 0)); self::register("oxeye_daisy", $factory->get(Ids::OXEYE_DAISY, 0)); @@ -1143,7 +1143,7 @@ final class VanillaBlocks{ self::register("spruce_stairs", $factory->get(Ids::SPRUCE_STAIRS, 0)); self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 0)); self::register("spruce_wall_sign", $factory->get(Ids::SPRUCE_WALL_SIGN, 0)); - self::register("spruce_wood", $factory->get(Ids::SPRUCE_WOOD, 0)); + self::register("spruce_wood", $factory->get(Ids::SPRUCE_WOOD, 4)); 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)); diff --git a/src/block/Wood.php b/src/block/Wood.php index a31699db5d..3202dfa0d6 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\PillarRotationTrait; use pocketmine\block\utils\TreeType; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; @@ -32,6 +33,7 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; class Wood extends Opaque{ + use PillarRotationTrait; private TreeType $treeType; diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index f3ca59ac4e..b7329f9890 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -79,7 +79,6 @@ use pocketmine\block\Lectern; use pocketmine\block\Lever; use pocketmine\block\Light; use pocketmine\block\LitPumpkin; -use pocketmine\block\Log; use pocketmine\block\Loom; use pocketmine\block\MelonStem; use pocketmine\block\NetherPortal; @@ -246,7 +245,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); + $this->map(Blocks::ACACIA_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); @@ -340,7 +339,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); + $this->map(Blocks::BIRCH_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); @@ -470,7 +469,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_LOG(), fn(Log $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); + $this->map(Blocks::DARK_OAK_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); @@ -769,7 +768,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); - $this->map(Blocks::JUNGLE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE, Ids::STRIPPED_JUNGLE_LOG)); + $this->map(Blocks::JUNGLE_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE, Ids::STRIPPED_JUNGLE_LOG)); $this->map(Blocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); @@ -877,7 +876,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); - $this->map(Blocks::OAK_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK, Ids::STRIPPED_OAK_LOG)); + $this->map(Blocks::OAK_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK, Ids::STRIPPED_OAK_LOG)); $this->map(Blocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); @@ -1050,7 +1049,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); - $this->map(Blocks::SPRUCE_LOG(), fn(Log $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE, Ids::STRIPPED_SPRUCE_LOG)); + $this->map(Blocks::SPRUCE_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE, Ids::STRIPPED_SPRUCE_LOG)); $this->map(Blocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 8c7d73fb9e..e7ebc51851 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -33,7 +33,6 @@ use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; use pocketmine\block\GlazedTerracotta; use pocketmine\block\Liquid; -use pocketmine\block\Log; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; use pocketmine\block\RedstoneRepeater; @@ -48,6 +47,7 @@ use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; +use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; @@ -151,7 +151,7 @@ final class BlockStateDeserializerHelper{ } /** @throws BlockStateDeserializeException */ - public static function decodeLog(Log $block, bool $stripped, BlockStateReader $in) : Log{ + public static function decodeLog(Wood $block, bool $stripped, BlockStateReader $in) : Wood{ return $block ->setAxis($in->readPillarAxis()) ->setStripped($stripped); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index b072da122e..56fe6ab08e 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -33,7 +33,6 @@ use pocketmine\block\FloorSign; use pocketmine\block\Furnace; use pocketmine\block\Leaves; use pocketmine\block\Liquid; -use pocketmine\block\Log; use pocketmine\block\RedMushroomBlock; use pocketmine\block\Sapling; use pocketmine\block\SimplePressurePlate; @@ -49,7 +48,6 @@ use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; -use pocketmine\math\Axis; use pocketmine\math\Facing; final class BlockStateSerializerHelper{ @@ -57,7 +55,7 @@ final class BlockStateSerializerHelper{ public static function encodeAllSidedLog(Wood $block) : BlockStateWriter{ return BlockStateWriter::create(Ids::WOOD) ->writeBool(BlockStateNames::STRIPPED_BIT, $block->isStripped()) - ->writePillarAxis(Axis::Y) //TODO: our implementation doesn't support this yet + ->writePillarAxis($block->getAxis()) ->writeTreeType($block->getTreeType()); } @@ -135,18 +133,18 @@ final class BlockStateSerializerHelper{ ->writeInt(BlockStateNames::LIQUID_DEPTH, $block->getDecay() | ($block->isFalling() ? 0x8 : 0)); } - private static function encodeLog(Log $block, BlockStateWriter $out) : BlockStateWriter{ + private static function encodeLog(Wood $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writePillarAxis($block->getAxis()); } - public static function encodeLog1(Log $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ + public static function encodeLog1(Wood $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ return self::encodeLog($block, $block->isStripped() ? BlockStateWriter::create($strippedId) : BlockStateWriter::create(Ids::LOG)->writeString(BlockStateNames::OLD_LOG_TYPE, $unstrippedType)); } - public static function encodeLog2(Log $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ + public static function encodeLog2(Wood $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ return self::encodeLog($block, $block->isStripped() ? BlockStateWriter::create($strippedId) : BlockStateWriter::create(Ids::LOG2)->writeString(BlockStateNames::NEW_LOG_TYPE, $unstrippedType) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index d2ea5ff99f..f2309ee475 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -1112,19 +1112,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WEB, fn() => Blocks::COBWEB()); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); - $this->map(Ids::WOOD, function(Reader $in) : Block{ - $in->todo(StateNames::PILLAR_AXIS); //TODO: our impl doesn't support axis yet - $stripped = $in->readBool(StateNames::STRIPPED_BIT); - return (match($woodType = $in->readString(StateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => Blocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_WOOD(), - default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodType), - })->setStripped($stripped); - }); + $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ + StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), + StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), + StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_WOOD(), + StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_WOOD(), + StringValues::WOOD_TYPE_OAK => Blocks::OAK_WOOD(), + StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_WOOD(), + default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodType), + }, $in->readBool(StateNames::STRIPPED_BIT), $in)); $this->map(Ids::WOODEN_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::OAK_BUTTON(), $in)); $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in)); $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::OAK_PRESSURE_PLATE(), $in)); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index ac0dcf19c7..7911379d29 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From 6176f0d9dfb62bc46f2b4a1d1b3618670354280c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 18:43:29 +0100 Subject: [PATCH 0241/1858] Regenerate ItemTypeIds --- src/data/bedrock/item/ItemTypeIds.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/item/ItemTypeIds.php b/src/data/bedrock/item/ItemTypeIds.php index 8658507e1a..67429e9d05 100644 --- a/src/data/bedrock/item/ItemTypeIds.php +++ b/src/data/bedrock/item/ItemTypeIds.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\item; final class ItemTypeIds{ public const ACACIA_BOAT = "minecraft:acacia_boat"; + public const ACACIA_CHEST_BOAT = "minecraft:acacia_chest_boat"; public const ACACIA_DOOR = "minecraft:acacia_door"; public const ACACIA_SIGN = "minecraft:acacia_sign"; public const AGENT_SPAWN_EGG = "minecraft:agent_spawn_egg"; @@ -47,6 +48,7 @@ final class ItemTypeIds{ public const BEETROOT_SEEDS = "minecraft:beetroot_seeds"; public const BEETROOT_SOUP = "minecraft:beetroot_soup"; public const BIRCH_BOAT = "minecraft:birch_boat"; + public const BIRCH_CHEST_BOAT = "minecraft:birch_chest_boat"; public const BIRCH_DOOR = "minecraft:birch_door"; public const BIRCH_SIGN = "minecraft:birch_sign"; public const BLACK_DYE = "minecraft:black_dye"; @@ -81,6 +83,7 @@ final class ItemTypeIds{ public const CHAINMAIL_HELMET = "minecraft:chainmail_helmet"; public const CHAINMAIL_LEGGINGS = "minecraft:chainmail_leggings"; public const CHARCOAL = "minecraft:charcoal"; + public const CHEST_BOAT = "minecraft:chest_boat"; public const CHEST_MINECART = "minecraft:chest_minecart"; public const CHICKEN = "minecraft:chicken"; public const CHICKEN_SPAWN_EGG = "minecraft:chicken_spawn_egg"; @@ -113,6 +116,7 @@ final class ItemTypeIds{ public const CROSSBOW = "minecraft:crossbow"; public const CYAN_DYE = "minecraft:cyan_dye"; public const DARK_OAK_BOAT = "minecraft:dark_oak_boat"; + public const DARK_OAK_CHEST_BOAT = "minecraft:dark_oak_chest_boat"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; public const DIAMOND = "minecraft:diamond"; @@ -126,12 +130,14 @@ final class ItemTypeIds{ public const DIAMOND_PICKAXE = "minecraft:diamond_pickaxe"; public const DIAMOND_SHOVEL = "minecraft:diamond_shovel"; public const DIAMOND_SWORD = "minecraft:diamond_sword"; + public const DISC_FRAGMENT_5 = "minecraft:disc_fragment_5"; public const DOLPHIN_SPAWN_EGG = "minecraft:dolphin_spawn_egg"; public const DONKEY_SPAWN_EGG = "minecraft:donkey_spawn_egg"; public const DRAGON_BREATH = "minecraft:dragon_breath"; public const DRIED_KELP = "minecraft:dried_kelp"; public const DROWNED_SPAWN_EGG = "minecraft:drowned_spawn_egg"; public const DYE = "minecraft:dye"; + public const ECHO_SHARD = "minecraft:echo_shard"; public const EGG = "minecraft:egg"; public const ELDER_GUARDIAN_SPAWN_EGG = "minecraft:elder_guardian_spawn_egg"; public const ELYTRA = "minecraft:elytra"; @@ -151,7 +157,6 @@ final class ItemTypeIds{ public const FIELD_MASONED_BANNER_PATTERN = "minecraft:field_masoned_banner_pattern"; public const FILLED_MAP = "minecraft:filled_map"; public const FIRE_CHARGE = "minecraft:fire_charge"; - public const FIREFLY_SPAWN_EGG = "minecraft:firefly_spawn_egg"; public const FIREWORK_ROCKET = "minecraft:firework_rocket"; public const FIREWORK_STAR = "minecraft:firework_star"; public const FISHING_ROD = "minecraft:fishing_rod"; @@ -217,6 +222,7 @@ final class ItemTypeIds{ public const IRON_SHOVEL = "minecraft:iron_shovel"; public const IRON_SWORD = "minecraft:iron_sword"; public const JUNGLE_BOAT = "minecraft:jungle_boat"; + public const JUNGLE_CHEST_BOAT = "minecraft:jungle_chest_boat"; public const JUNGLE_DOOR = "minecraft:jungle_door"; public const JUNGLE_SIGN = "minecraft:jungle_sign"; public const KELP = "minecraft:kelp"; @@ -238,6 +244,10 @@ final class ItemTypeIds{ public const MAGENTA_DYE = "minecraft:magenta_dye"; public const MAGMA_CREAM = "minecraft:magma_cream"; public const MAGMA_CUBE_SPAWN_EGG = "minecraft:magma_cube_spawn_egg"; + public const MANGROVE_BOAT = "minecraft:mangrove_boat"; + public const MANGROVE_CHEST_BOAT = "minecraft:mangrove_chest_boat"; + public const MANGROVE_DOOR = "minecraft:mangrove_door"; + public const MANGROVE_SIGN = "minecraft:mangrove_sign"; public const MEDICINE = "minecraft:medicine"; public const MELON_SEEDS = "minecraft:melon_seeds"; public const MELON_SLICE = "minecraft:melon_slice"; @@ -249,6 +259,7 @@ final class ItemTypeIds{ public const MUSHROOM_STEW = "minecraft:mushroom_stew"; public const MUSIC_DISC_11 = "minecraft:music_disc_11"; public const MUSIC_DISC_13 = "minecraft:music_disc_13"; + public const MUSIC_DISC_5 = "minecraft:music_disc_5"; public const MUSIC_DISC_BLOCKS = "minecraft:music_disc_blocks"; public const MUSIC_DISC_CAT = "minecraft:music_disc_cat"; public const MUSIC_DISC_CHIRP = "minecraft:music_disc_chirp"; @@ -281,6 +292,7 @@ final class ItemTypeIds{ public const NETHERITE_SWORD = "minecraft:netherite_sword"; public const NPC_SPAWN_EGG = "minecraft:npc_spawn_egg"; public const OAK_BOAT = "minecraft:oak_boat"; + public const OAK_CHEST_BOAT = "minecraft:oak_chest_boat"; public const OAK_SIGN = "minecraft:oak_sign"; public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg"; public const ORANGE_DYE = "minecraft:orange_dye"; @@ -322,6 +334,7 @@ final class ItemTypeIds{ public const RAW_COPPER = "minecraft:raw_copper"; public const RAW_GOLD = "minecraft:raw_gold"; public const RAW_IRON = "minecraft:raw_iron"; + public const RECOVERY_COMPASS = "minecraft:recovery_compass"; public const RED_DYE = "minecraft:red_dye"; public const REDSTONE = "minecraft:redstone"; public const REPEATER = "minecraft:repeater"; @@ -351,6 +364,7 @@ final class ItemTypeIds{ public const SPIDER_SPAWN_EGG = "minecraft:spider_spawn_egg"; public const SPLASH_POTION = "minecraft:splash_potion"; public const SPRUCE_BOAT = "minecraft:spruce_boat"; + public const SPRUCE_CHEST_BOAT = "minecraft:spruce_chest_boat"; public const SPRUCE_DOOR = "minecraft:spruce_door"; public const SPRUCE_SIGN = "minecraft:spruce_sign"; public const SPYGLASS = "minecraft:spyglass"; @@ -382,6 +396,7 @@ final class ItemTypeIds{ public const VILLAGER_SPAWN_EGG = "minecraft:villager_spawn_egg"; public const VINDICATOR_SPAWN_EGG = "minecraft:vindicator_spawn_egg"; public const WANDERING_TRADER_SPAWN_EGG = "minecraft:wandering_trader_spawn_egg"; + public const WARDEN_SPAWN_EGG = "minecraft:warden_spawn_egg"; public const WARPED_DOOR = "minecraft:warped_door"; public const WARPED_FUNGUS_ON_A_STICK = "minecraft:warped_fungus_on_a_stick"; public const WARPED_SIGN = "minecraft:warped_sign"; From dd615c775d33e4af6850dafe75d99ec44d3bd085 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 19:01:34 +0100 Subject: [PATCH 0242/1858] Added various blocks made from mangrove, crimson and warped wood --- src/block/BlockFactory.php | 35 +-- src/block/BlockLegacyIdHelper.php | 212 +++++++++++------- src/block/BlockTypeIds.php | 36 ++- src/block/CocoaBlock.php | 4 +- src/block/FenceGate.php | 6 +- src/block/Planks.php | 13 +- src/block/VanillaBlocks.php | 66 ++++++ src/block/Wood.php | 21 +- src/block/WoodenButton.php | 3 + src/block/WoodenDoor.php | 4 +- src/block/WoodenFence.php | 7 +- src/block/WoodenPressurePlate.php | 3 + src/block/WoodenSlab.php | 7 +- src/block/WoodenStairs.php | 3 + src/block/WoodenTrapdoor.php | 3 + src/block/utils/WoodType.php | 82 +++++++ src/block/utils/WoodTypeTrait.php | 40 ++++ .../BlockObjectToBlockStateSerializer.php | 43 ++++ .../convert/BlockStateSerializerHelper.php | 9 +- .../BlockStateToBlockObjectDeserializer.php | 42 ++++ .../block/convert/BlockStateWriter.php | 18 +- src/data/bedrock/item/ItemDeserializer.php | 5 +- src/data/bedrock/item/ItemSerializer.php | 3 + src/item/StringToItemParser.php | 39 ++++ 24 files changed, 568 insertions(+), 136 deletions(-) create mode 100644 src/block/utils/WoodType.php create mode 100644 src/block/utils/WoodTypeTrait.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 22aede663f..5ee4c0be85 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -52,6 +52,7 @@ use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WoodType; use pocketmine\item\Item; use pocketmine\item\ToolTier; use pocketmine\utils\AssumptionFailedError; @@ -458,29 +459,33 @@ class BlockFactory{ foreach(TreeType::getAll() as $treeType){ $name = $treeType->getDisplayName(); - $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)); - $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); - $this->register(new Wood(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType)); - $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($treeType), $name . " Wood", $logBreakInfo, $treeType)); - - $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->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)); - [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($treeType); $this->register(new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $signAsItem)); $this->register(new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $signAsItem)); } + foreach(WoodType::getAll() as $woodType){ + $name = $woodType->getDisplayName(); + + $this->register(new Wood(BlockLegacyIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); + $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); + + $this->register(new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); + $this->register(new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); + $this->register(new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); + + $this->register(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); + $this->register(new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); + $this->register(new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); + + $this->register(new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); + $this->register(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); + $this->register(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); + } + $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); $this->register(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 7f16cb4b1e..4622572524 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -27,67 +27,83 @@ use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WoodType; use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; final class BlockLegacyIdHelper{ - public static function getWoodenPlanksIdentifier(TreeType $treeType) : BID{ - return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_PLANKS, - TreeType::SPRUCE()->id() => Ids::SPRUCE_PLANKS, - TreeType::BIRCH()->id() => Ids::BIRCH_PLANKS, - TreeType::JUNGLE()->id() => Ids::JUNGLE_PLANKS, - TreeType::ACACIA()->id() => Ids::ACACIA_PLANKS, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, + public static function getWoodenPlanksIdentifier(WoodType $type) : BID{ + return new BID(match($type->id()){ + WoodType::OAK()->id() => Ids::OAK_PLANKS, + WoodType::SPRUCE()->id() => Ids::SPRUCE_PLANKS, + WoodType::BIRCH()->id() => Ids::BIRCH_PLANKS, + WoodType::JUNGLE()->id() => Ids::JUNGLE_PLANKS, + WoodType::ACACIA()->id() => Ids::ACACIA_PLANKS, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, + WoodType::MANGROVE()->id() => Ids::MANGROVE_PLANKS, + WoodType::CRIMSON()->id() => Ids::CRIMSON_PLANKS, + WoodType::WARPED()->id() => Ids::WARPED_PLANKS, default => throw new AssumptionFailedError("All tree types should be covered") }); } - public static function getWoodenFenceIdentifier(TreeType $treeType) : BID{ - return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_FENCE, - TreeType::SPRUCE()->id() => Ids::SPRUCE_FENCE, - TreeType::BIRCH()->id() => Ids::BIRCH_FENCE, - TreeType::JUNGLE()->id() => Ids::JUNGLE_FENCE, - TreeType::ACACIA()->id() => Ids::ACACIA_FENCE, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, + public static function getWoodenFenceIdentifier(WoodType $type) : BID{ + return new BID(match($type->id()){ + WoodType::OAK()->id() => Ids::OAK_FENCE, + WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE, + WoodType::BIRCH()->id() => Ids::BIRCH_FENCE, + WoodType::JUNGLE()->id() => Ids::JUNGLE_FENCE, + WoodType::ACACIA()->id() => Ids::ACACIA_FENCE, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, + WoodType::MANGROVE()->id() => Ids::MANGROVE_FENCE, + WoodType::CRIMSON()->id() => Ids::CRIMSON_FENCE, + WoodType::WARPED()->id() => Ids::WARPED_FENCE, default => throw new AssumptionFailedError("All tree types should be covered") }); } - public static function getWoodenSlabIdentifier(TreeType $treeType) : BID{ - return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_SLAB, - TreeType::SPRUCE()->id() => Ids::SPRUCE_SLAB, - TreeType::BIRCH()->id() => Ids::BIRCH_SLAB, - TreeType::JUNGLE()->id() => Ids::JUNGLE_SLAB, - TreeType::ACACIA()->id() => Ids::ACACIA_SLAB, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, + public static function getWoodenSlabIdentifier(WoodType $type) : BID{ + return new BID(match($type->id()){ + WoodType::OAK()->id() => Ids::OAK_SLAB, + WoodType::SPRUCE()->id() => Ids::SPRUCE_SLAB, + WoodType::BIRCH()->id() => Ids::BIRCH_SLAB, + WoodType::JUNGLE()->id() => Ids::JUNGLE_SLAB, + WoodType::ACACIA()->id() => Ids::ACACIA_SLAB, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, + WoodType::MANGROVE()->id() => Ids::MANGROVE_SLAB, + WoodType::CRIMSON()->id() => Ids::CRIMSON_SLAB, + WoodType::WARPED()->id() => Ids::WARPED_SLAB, default => throw new AssumptionFailedError("All tree types should be covered") }); } - public static function getLogIdentifier(TreeType $treeType) : BID{ + public static function getLogIdentifier(WoodType $treeType) : BID{ return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LOG), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LOG), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LOG), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG), + WoodType::OAK()->id() => new BID(Ids::OAK_LOG), + WoodType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG), + WoodType::BIRCH()->id() => new BID(Ids::BIRCH_LOG), + WoodType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG), + WoodType::ACACIA()->id() => new BID(Ids::ACACIA_LOG), + WoodType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG), + WoodType::MANGROVE()->id() => new BID(Ids::MANGROVE_LOG), + WoodType::CRIMSON()->id() => new BID(Ids::CRIMSON_STEM), + WoodType::WARPED()->id() => new BID(Ids::WARPED_STEM), default => throw new AssumptionFailedError("All tree types should be covered") }; } - public static function getAllSidedLogIdentifier(TreeType $treeType) : BID{ + public static function getAllSidedLogIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_WOOD, - TreeType::SPRUCE()->id() => Ids::SPRUCE_WOOD, - TreeType::BIRCH()->id() => Ids::BIRCH_WOOD, - TreeType::JUNGLE()->id() => Ids::JUNGLE_WOOD, - TreeType::ACACIA()->id() => Ids::ACACIA_WOOD, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, + WoodType::OAK()->id() => Ids::OAK_WOOD, + WoodType::SPRUCE()->id() => Ids::SPRUCE_WOOD, + WoodType::BIRCH()->id() => Ids::BIRCH_WOOD, + WoodType::JUNGLE()->id() => Ids::JUNGLE_WOOD, + WoodType::ACACIA()->id() => Ids::ACACIA_WOOD, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, + WoodType::MANGROVE()->id() => Ids::MANGROVE_WOOD, + WoodType::CRIMSON()->id() => Ids::CRIMSON_HYPHAE, + WoodType::WARPED()->id() => Ids::WARPED_HYPHAE, default => throw new AssumptionFailedError("All tree types should be covered") }); } @@ -162,110 +178,146 @@ final class BlockLegacyIdHelper{ throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenTrapdoorIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_TRAPDOOR); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_TRAPDOOR); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_TRAPDOOR); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_TRAPDOOR); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_TRAPDOOR); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_TRAPDOOR); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_TRAPDOOR); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_TRAPDOOR); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_TRAPDOOR); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenButtonIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenButtonIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_BUTTON); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_BUTTON); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_BUTTON); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_BUTTON); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_BUTTON); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_BUTTON); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_BUTTON); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_BUTTON); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_BUTTON); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenPressurePlateIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_PRESSURE_PLATE); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_PRESSURE_PLATE); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_PRESSURE_PLATE); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_PRESSURE_PLATE); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_PRESSURE_PLATE); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_PRESSURE_PLATE); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_PRESSURE_PLATE); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_PRESSURE_PLATE); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_PRESSURE_PLATE); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenDoorIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenDoorIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_DOOR); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_DOOR); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_DOOR); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_DOOR); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_DOOR); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_DOOR); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_DOOR); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_DOOR); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_DOOR); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenFenceGateIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_FENCE_GATE); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_FENCE_GATE); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_FENCE_GATE); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_FENCE_GATE); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_FENCE_GATE); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_FENCE_GATE); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_FENCE_GATE); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_FENCE_GATE); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_FENCE_GATE); } throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenStairsIdentifier(TreeType $treeType) : BlockIdentifier{ + public static function getWoodenStairsIdentifier(WoodType $treeType) : BlockIdentifier{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return new BID(Ids::OAK_STAIRS); - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return new BID(Ids::SPRUCE_STAIRS); - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return new BID(Ids::BIRCH_STAIRS); - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return new BID(Ids::JUNGLE_STAIRS); - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return new BID(Ids::ACACIA_STAIRS); - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return new BID(Ids::DARK_OAK_STAIRS); + case WoodType::MANGROVE()->id(): + return new BID(Ids::MANGROVE_STAIRS); + case WoodType::CRIMSON()->id(): + return new BID(Ids::CRIMSON_STAIRS); + case WoodType::WARPED()->id(): + return new BID(Ids::WARPED_STAIRS); } throw new AssumptionFailedError("Switch should cover all wood types"); } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index e8dfc65aac..deca05b424 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -614,5 +614,39 @@ final class BlockTypeIds{ public const CHISELED_NETHER_BRICKS = 10587; public const CRACKED_NETHER_BRICKS = 10588; - public const FIRST_UNUSED_BLOCK_ID = 10589; + public const MANGROVE_PLANKS = 10595; + public const CRIMSON_PLANKS = 10596; + public const WARPED_PLANKS = 10597; + public const MANGROVE_FENCE = 10598; + public const CRIMSON_FENCE = 10599; + public const WARPED_FENCE = 10600; + public const MANGROVE_SLAB = 10601; + public const CRIMSON_SLAB = 10602; + public const WARPED_SLAB = 10603; + public const MANGROVE_LOG = 10604; + public const CRIMSON_STEM = 10605; + public const WARPED_STEM = 10606; + public const MANGROVE_WOOD = 10607; + public const CRIMSON_HYPHAE = 10608; + public const WARPED_HYPHAE = 10609; + public const MANGROVE_TRAPDOOR = 10610; + public const CRIMSON_TRAPDOOR = 10611; + public const WARPED_TRAPDOOR = 10612; + public const MANGROVE_BUTTON = 10613; + public const CRIMSON_BUTTON = 10614; + public const WARPED_BUTTON = 10615; + public const MANGROVE_PRESSURE_PLATE = 10616; + public const CRIMSON_PRESSURE_PLATE = 10617; + public const WARPED_PRESSURE_PLATE = 10618; + public const MANGROVE_DOOR = 10619; + public const CRIMSON_DOOR = 10620; + public const WARPED_DOOR = 10621; + public const MANGROVE_FENCE_GATE = 10622; + public const CRIMSON_FENCE_GATE = 10623; + public const WARPED_FENCE_GATE = 10624; + public const MANGROVE_STAIRS = 10625; + public const CRIMSON_STAIRS = 10626; + public const WARPED_STAIRS = 10627; + + public const FIRST_UNUSED_BLOCK_ID = 10628; } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 1e06517fc5..f0f9b24640 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -25,7 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WoodType; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; @@ -89,7 +89,7 @@ class CocoaBlock extends Transparent{ } private function canAttachTo(Block $block) : bool{ - return $block instanceof Wood && $block->getTreeType()->equals(TreeType::JUNGLE()); + return $block instanceof Wood && $block->getWoodType()->equals(WoodType::JUNGLE()); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 6f5f1c9a41..b9bc95e183 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; +use pocketmine\block\utils\WoodTypeTrait; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Item; @@ -36,6 +37,7 @@ use pocketmine\world\BlockTransaction; use pocketmine\world\sound\DoorSound; class FenceGate extends Transparent{ + use WoodTypeTrait; use HorizontalFacingTrait; protected bool $open = false; @@ -126,10 +128,10 @@ class FenceGate extends Transparent{ } public function getFlameEncouragement() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function getFlammability() : int{ - return 20; + return $this->woodType->isFlammable() ? 20 : 0; } } diff --git a/src/block/Planks.php b/src/block/Planks.php index 9f780694a6..23c9fe4a8a 100644 --- a/src/block/Planks.php +++ b/src/block/Planks.php @@ -23,17 +23,26 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodType; +use pocketmine\block\utils\WoodTypeTrait; + class Planks extends Opaque{ + use WoodTypeTrait; + + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, WoodType $woodType){ + $this->woodType = $woodType; + parent::__construct($idInfo, $name, $breakInfo); + } public function getFuelTime() : int{ return 300; } public function getFlameEncouragement() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function getFlammability() : int{ - return 20; + return $this->woodType->isFlammable() ? 20 : 0; } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 3bbce12cea..ae1852c0d9 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -143,6 +143,17 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Opaque CRACKED_POLISHED_BLACKSTONE_BRICKS() * @method static Opaque CRACKED_STONE_BRICKS() * @method static CraftingTable CRAFTING_TABLE() + * @method static WoodenButton CRIMSON_BUTTON() + * @method static WoodenDoor CRIMSON_DOOR() + * @method static WoodenFence CRIMSON_FENCE() + * @method static FenceGate CRIMSON_FENCE_GATE() + * @method static Wood CRIMSON_HYPHAE() + * @method static Planks CRIMSON_PLANKS() + * @method static WoodenPressurePlate CRIMSON_PRESSURE_PLATE() + * @method static WoodenSlab CRIMSON_SLAB() + * @method static WoodenStairs CRIMSON_STAIRS() + * @method static Wood CRIMSON_STEM() + * @method static WoodenTrapdoor CRIMSON_TRAPDOOR() * @method static Opaque CUT_RED_SANDSTONE() * @method static Slab CUT_RED_SANDSTONE_SLAB() * @method static Opaque CUT_SANDSTONE() @@ -397,6 +408,17 @@ use pocketmine\utils\CloningRegistryTrait; * @method static LitPumpkin LIT_PUMPKIN() * @method static Loom LOOM() * @method static Magma MAGMA() + * @method static WoodenButton MANGROVE_BUTTON() + * @method static WoodenDoor MANGROVE_DOOR() + * @method static WoodenFence MANGROVE_FENCE() + * @method static FenceGate MANGROVE_FENCE_GATE() + * @method static Wood MANGROVE_LOG() + * @method static Planks MANGROVE_PLANKS() + * @method static WoodenPressurePlate MANGROVE_PRESSURE_PLATE() + * @method static WoodenSlab MANGROVE_SLAB() + * @method static WoodenStairs MANGROVE_STAIRS() + * @method static WoodenTrapdoor MANGROVE_TRAPDOOR() + * @method static Wood MANGROVE_WOOD() * @method static ChemistryTable MATERIAL_REDUCER() * @method static Melon MELON() * @method static MelonStem MELON_STEM() @@ -587,6 +609,17 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Vine VINES() * @method static WallBanner WALL_BANNER() * @method static WallCoralFan WALL_CORAL_FAN() + * @method static WoodenButton WARPED_BUTTON() + * @method static WoodenDoor WARPED_DOOR() + * @method static WoodenFence WARPED_FENCE() + * @method static FenceGate WARPED_FENCE_GATE() + * @method static Wood WARPED_HYPHAE() + * @method static Planks WARPED_PLANKS() + * @method static WoodenPressurePlate WARPED_PRESSURE_PLATE() + * @method static WoodenSlab WARPED_SLAB() + * @method static WoodenStairs WARPED_STAIRS() + * @method static Wood WARPED_STEM() + * @method static WoodenTrapdoor WARPED_TRAPDOOR() * @method static Water WATER() * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() @@ -728,6 +761,17 @@ final class VanillaBlocks{ self::register("cracked_polished_blackstone_bricks", $factory->get(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, 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("crimson_button", $factory->get(Ids::CRIMSON_BUTTON, 0)); + self::register("crimson_door", $factory->get(Ids::CRIMSON_DOOR, 0)); + self::register("crimson_fence", $factory->get(Ids::CRIMSON_FENCE, 0)); + self::register("crimson_fence_gate", $factory->get(Ids::CRIMSON_FENCE_GATE, 0)); + self::register("crimson_hyphae", $factory->get(Ids::CRIMSON_HYPHAE, 4)); + self::register("crimson_planks", $factory->get(Ids::CRIMSON_PLANKS, 0)); + self::register("crimson_pressure_plate", $factory->get(Ids::CRIMSON_PRESSURE_PLATE, 0)); + self::register("crimson_slab", $factory->get(Ids::CRIMSON_SLAB, 0)); + self::register("crimson_stairs", $factory->get(Ids::CRIMSON_STAIRS, 0)); + self::register("crimson_stem", $factory->get(Ids::CRIMSON_STEM, 4)); + self::register("crimson_trapdoor", $factory->get(Ids::CRIMSON_TRAPDOOR, 0)); 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)); @@ -982,6 +1026,17 @@ final class VanillaBlocks{ self::register("lit_pumpkin", $factory->get(Ids::LIT_PUMPKIN, 0)); self::register("loom", $factory->get(Ids::LOOM, 0)); self::register("magma", $factory->get(Ids::MAGMA, 0)); + self::register("mangrove_button", $factory->get(Ids::MANGROVE_BUTTON, 0)); + self::register("mangrove_door", $factory->get(Ids::MANGROVE_DOOR, 0)); + self::register("mangrove_fence", $factory->get(Ids::MANGROVE_FENCE, 0)); + self::register("mangrove_fence_gate", $factory->get(Ids::MANGROVE_FENCE_GATE, 0)); + self::register("mangrove_log", $factory->get(Ids::MANGROVE_LOG, 4)); + self::register("mangrove_planks", $factory->get(Ids::MANGROVE_PLANKS, 0)); + self::register("mangrove_pressure_plate", $factory->get(Ids::MANGROVE_PRESSURE_PLATE, 0)); + self::register("mangrove_slab", $factory->get(Ids::MANGROVE_SLAB, 0)); + self::register("mangrove_stairs", $factory->get(Ids::MANGROVE_STAIRS, 0)); + self::register("mangrove_trapdoor", $factory->get(Ids::MANGROVE_TRAPDOOR, 0)); + self::register("mangrove_wood", $factory->get(Ids::MANGROVE_WOOD, 4)); 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)); @@ -1172,6 +1227,17 @@ final class VanillaBlocks{ self::register("vines", $factory->get(Ids::VINES, 0)); self::register("wall_banner", $factory->get(Ids::WALL_BANNER, 0)); self::register("wall_coral_fan", $factory->get(Ids::WALL_CORAL_FAN, 4)); + self::register("warped_button", $factory->get(Ids::WARPED_BUTTON, 0)); + self::register("warped_door", $factory->get(Ids::WARPED_DOOR, 0)); + self::register("warped_fence", $factory->get(Ids::WARPED_FENCE, 0)); + self::register("warped_fence_gate", $factory->get(Ids::WARPED_FENCE_GATE, 0)); + self::register("warped_hyphae", $factory->get(Ids::WARPED_HYPHAE, 4)); + self::register("warped_planks", $factory->get(Ids::WARPED_PLANKS, 0)); + self::register("warped_pressure_plate", $factory->get(Ids::WARPED_PRESSURE_PLATE, 0)); + self::register("warped_slab", $factory->get(Ids::WARPED_SLAB, 0)); + self::register("warped_stairs", $factory->get(Ids::WARPED_STAIRS, 0)); + self::register("warped_stem", $factory->get(Ids::WARPED_STEM, 4)); + self::register("warped_trapdoor", $factory->get(Ids::WARPED_TRAPDOOR, 0)); 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)); diff --git a/src/block/Wood.php b/src/block/Wood.php index 3202dfa0d6..46bb4afa69 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\PillarRotationTrait; -use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WoodTypeTrait; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; use pocketmine\item\Axe; @@ -34,16 +34,10 @@ use pocketmine\player\Player; class Wood extends Opaque{ use PillarRotationTrait; - - private TreeType $treeType; + use WoodTypeTrait; private bool $stripped = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, TreeType $treeType){ - parent::__construct($idInfo, $name, $breakInfo); - $this->treeType = $treeType; - } - public function getRequiredTypeDataBits() : int{ return 1; } protected function decodeType(BlockDataReader $r) : void{ @@ -54,13 +48,6 @@ class Wood extends Opaque{ $w->writeBool($this->stripped); } - /** - * TODO: this is ad hoc, but add an interface for this to all tree-related blocks - */ - public function getTreeType() : TreeType{ - return $this->treeType; - } - public function isStripped() : bool{ return $this->stripped; } /** @return $this */ @@ -74,11 +61,11 @@ class Wood extends Opaque{ } public function getFlameEncouragement() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function getFlammability() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/WoodenButton.php b/src/block/WoodenButton.php index 3116840b24..d1123ec2d6 100644 --- a/src/block/WoodenButton.php +++ b/src/block/WoodenButton.php @@ -23,7 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenButton extends Button{ + use WoodTypeTrait; protected function getActivationTime() : int{ return 30; diff --git a/src/block/WoodenDoor.php b/src/block/WoodenDoor.php index c77253e699..e398812cd0 100644 --- a/src/block/WoodenDoor.php +++ b/src/block/WoodenDoor.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -class WoodenDoor extends Door{ +use pocketmine\block\utils\WoodTypeTrait; +class WoodenDoor extends Door{ + use WoodTypeTrait; } diff --git a/src/block/WoodenFence.php b/src/block/WoodenFence.php index a84abef5fd..88d444f516 100644 --- a/src/block/WoodenFence.php +++ b/src/block/WoodenFence.php @@ -23,17 +23,20 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenFence extends Fence{ + use WoodTypeTrait; public function getFuelTime() : int{ return 300; } public function getFlameEncouragement() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function getFlammability() : int{ - return 20; + return $this->woodType->isFlammable() ? 20 : 0; } } diff --git a/src/block/WoodenPressurePlate.php b/src/block/WoodenPressurePlate.php index 163789b2f9..baaf44c2c9 100644 --- a/src/block/WoodenPressurePlate.php +++ b/src/block/WoodenPressurePlate.php @@ -23,7 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenPressurePlate extends SimplePressurePlate{ + use WoodTypeTrait; public function getFuelTime() : int{ return 300; diff --git a/src/block/WoodenSlab.php b/src/block/WoodenSlab.php index f1fc42b66c..b6f6647dae 100644 --- a/src/block/WoodenSlab.php +++ b/src/block/WoodenSlab.php @@ -23,17 +23,20 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenSlab extends Slab{ + use WoodTypeTrait; public function getFuelTime() : int{ return 300; } public function getFlameEncouragement() : int{ - return 5; + return $this->woodType->isFlammable() ? 5 : 0; } public function getFlammability() : int{ - return 20; + return $this->woodType->isFlammable() ? 20 : 0; } } diff --git a/src/block/WoodenStairs.php b/src/block/WoodenStairs.php index 9c2f16a159..30fa7e6026 100644 --- a/src/block/WoodenStairs.php +++ b/src/block/WoodenStairs.php @@ -23,7 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenStairs extends Stair{ + use WoodTypeTrait; public function getFlameEncouragement() : int{ return 5; diff --git a/src/block/WoodenTrapdoor.php b/src/block/WoodenTrapdoor.php index 83b3fb6c86..c0a6623a17 100644 --- a/src/block/WoodenTrapdoor.php +++ b/src/block/WoodenTrapdoor.php @@ -23,7 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodTypeTrait; + class WoodenTrapdoor extends Trapdoor{ + use WoodTypeTrait; public function getFuelTime() : int{ return 300; diff --git a/src/block/utils/WoodType.php b/src/block/utils/WoodType.php new file mode 100644 index 0000000000..e31f3a6dae --- /dev/null +++ b/src/block/utils/WoodType.php @@ -0,0 +1,82 @@ +Enum___construct($enumName); + } + + public function getDisplayName() : string{ return $this->displayName; } + + public function isFlammable() : bool{ return $this->flammable; } + + /** @return string|null */ + public function getStandardLogSuffix() : ?string{ return $this->standardLogSuffix; } + + /** @return string|null */ + public function getAllSidedLogSuffix() : ?string{ return $this->allSidedLogSuffix; } +} diff --git a/src/block/utils/WoodTypeTrait.php b/src/block/utils/WoodTypeTrait.php new file mode 100644 index 0000000000..0ecd4e6f1c --- /dev/null +++ b/src/block/utils/WoodTypeTrait.php @@ -0,0 +1,40 @@ +woodType = $woodType; + parent::__construct($idInfo, $name, $breakInfo); + } + + public function getWoodType() : WoodType{ + return $this->woodType; + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index b7329f9890..ec5942cda6 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -458,6 +458,17 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); + $this->map(Blocks::CRIMSON_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CRIMSON_BUTTON))); + $this->map(Blocks::CRIMSON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CRIMSON_DOOR))); + $this->mapSimple(Blocks::CRIMSON_FENCE(), Ids::CRIMSON_FENCE); + $this->map(Blocks::CRIMSON_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::CRIMSON_FENCE_GATE))); + $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); + $this->mapSimple(Blocks::CRIMSON_PLANKS(), Ids::CRIMSON_PLANKS); + $this->map(Blocks::CRIMSON_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::CRIMSON_PRESSURE_PLATE))); + $this->mapSlab(Blocks::CRIMSON_SLAB(), Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB); + $this->mapStairs(Blocks::CRIMSON_STAIRS(), Ids::CRIMSON_STAIRS); + $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); + $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); @@ -829,6 +840,27 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing($block->getFacing()); }); $this->mapSimple(Blocks::MAGMA(), Ids::MAGMA); + $this->map(Blocks::MANGROVE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::MANGROVE_BUTTON))); + $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); + $this->mapSimple(Blocks::MANGROVE_FENCE(), Ids::MANGROVE_FENCE); + $this->map(Blocks::MANGROVE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::MANGROVE_FENCE_GATE))); + $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); + $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); + $this->map(Blocks::MANGROVE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::MANGROVE_PRESSURE_PLATE))); + $this->mapSlab(Blocks::MANGROVE_SLAB(), Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB); + $this->mapStairs(Blocks::MANGROVE_STAIRS(), Ids::MANGROVE_STAIRS); + $this->map(Blocks::MANGROVE_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::MANGROVE_TRAPDOOR))); + $this->map(Blocks::MANGROVE_WOOD(), function(Wood $block) : Writer{ + //we can't use the standard method for this because mangrove_wood has a useless property attached to it + if(!$block->isStripped()){ + return Writer::create(Ids::MANGROVE_WOOD) + ->writePillarAxis($block->getAxis()) + ->writeBool(StateNames::STRIPPED_BIT, false); //this is useless, but it has to be written + }else{ + return Writer::create(Ids::STRIPPED_MANGROVE_WOOD) + ->writePillarAxis($block->getAxis()); + } + }); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); @@ -1152,6 +1184,17 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralFacing($block->getFacing()); }); + $this->map(Blocks::WARPED_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::WARPED_BUTTON))); + $this->map(Blocks::WARPED_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::WARPED_DOOR))); + $this->mapSimple(Blocks::WARPED_FENCE(), Ids::WARPED_FENCE); + $this->map(Blocks::WARPED_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::WARPED_FENCE_GATE))); + $this->map(Blocks::WARPED_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE)); + $this->mapSimple(Blocks::WARPED_PLANKS(), Ids::WARPED_PLANKS); + $this->map(Blocks::WARPED_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WARPED_PRESSURE_PLATE))); + $this->mapSlab(Blocks::WARPED_SLAB(), Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB); + $this->mapStairs(Blocks::WARPED_STAIRS(), Ids::WARPED_STAIRS); + $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); + $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 56fe6ab08e..9ef70b3616 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -56,7 +56,7 @@ final class BlockStateSerializerHelper{ return BlockStateWriter::create(Ids::WOOD) ->writeBool(BlockStateNames::STRIPPED_BIT, $block->isStripped()) ->writePillarAxis($block->getAxis()) - ->writeTreeType($block->getTreeType()); + ->writeLegacyWoodType($block->getWoodType()); } public static function encodeButton(Button $block, BlockStateWriter $out) : BlockStateWriter{ @@ -151,6 +151,13 @@ final class BlockStateSerializerHelper{ ); } + public static function encodeNewLog(Wood $block, string $unstrippedId, string $strippedId) : BlockStateWriter{ + return self::encodeLog($block, $block->isStripped() ? + BlockStateWriter::create($strippedId) : + BlockStateWriter::create($unstrippedId) + ); + } + public static function encodeMushroomBlock(RedMushroomBlock $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, MushroomBlockTypeIdMap::getInstance()->toId($block->getMushroomBlockType())); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index f2309ee475..1dbdf8a32d 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -300,6 +300,17 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); + $this->map(Ids::CRIMSON_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CRIMSON_BUTTON(), $in)); + $this->map(Ids::CRIMSON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CRIMSON_DOOR(), $in)); + $this->mapSlab(Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB, fn() => Blocks::CRIMSON_SLAB()); + $this->map(Ids::CRIMSON_FENCE, fn() => Blocks::CRIMSON_FENCE()); + $this->map(Ids::CRIMSON_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::CRIMSON_FENCE_GATE(), $in)); + $this->map(Ids::CRIMSON_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_HYPHAE(), false, $in)); + $this->map(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS()); + $this->map(Ids::CRIMSON_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CRIMSON_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::CRIMSON_STAIRS, fn() => Blocks::CRIMSON_STAIRS()); + $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); + $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); @@ -715,6 +726,20 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); + $this->map(Ids::MANGROVE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::MANGROVE_BUTTON(), $in)); + $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in)); + $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB()); + $this->map(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); + $this->map(Ids::MANGROVE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::MANGROVE_FENCE_GATE(), $in)); + $this->map(Ids::MANGROVE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_LOG(), false, $in)); + $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); + $this->map(Ids::MANGROVE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::MANGROVE_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS()); + $this->map(Ids::MANGROVE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::MANGROVE_TRAPDOOR(), $in)); + $this->map(Ids::MANGROVE_WOOD, function(Reader $in){ + $in->ignored(StateNames::STRIPPED_BIT); //this is also ignored by vanilla + return Helper::decodeLog(Blocks::MANGROVE_WOOD(), false, $in); + }); $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); @@ -1037,10 +1062,16 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::STRIPPED_ACACIA_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::ACACIA_LOG(), true, $in)); $this->map(Ids::STRIPPED_BIRCH_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::BIRCH_LOG(), true, $in)); + $this->map(Ids::STRIPPED_CRIMSON_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_HYPHAE(), true, $in)); + $this->map(Ids::STRIPPED_CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), true, $in)); $this->map(Ids::STRIPPED_DARK_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::DARK_OAK_LOG(), true, $in)); $this->map(Ids::STRIPPED_JUNGLE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::JUNGLE_LOG(), true, $in)); + $this->map(Ids::STRIPPED_MANGROVE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_LOG(), true, $in)); + $this->map(Ids::STRIPPED_MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(), true, $in)); $this->map(Ids::STRIPPED_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::OAK_LOG(), true, $in)); $this->map(Ids::STRIPPED_SPRUCE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::SPRUCE_LOG(), true, $in)); + $this->map(Ids::STRIPPED_WARPED_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_HYPHAE(), true, $in)); + $this->map(Ids::STRIPPED_WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), true, $in)); $this->map(Ids::SWEET_BERRY_BUSH, function(Reader $in) : Block{ //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); @@ -1107,6 +1138,17 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()); }); $this->map(Ids::WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::OAK_WALL_SIGN(), $in)); + $this->map(Ids::WARPED_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::WARPED_BUTTON(), $in)); + $this->map(Ids::WARPED_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::WARPED_DOOR(), $in)); + $this->mapSlab(Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB, fn() => Blocks::WARPED_SLAB()); + $this->map(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE()); + $this->map(Ids::WARPED_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::WARPED_FENCE_GATE(), $in)); + $this->map(Ids::WARPED_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_HYPHAE(), false, $in)); + $this->map(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); + $this->map(Ids::WARPED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::WARPED_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::WARPED_STAIRS, fn() => Blocks::WARPED_STAIRS()); + $this->map(Ids::WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), false, $in)); + $this->map(Ids::WARPED_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::WARPED_TRAPDOOR(), $in)); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->map(Ids::WEB, fn() => Blocks::COBWEB()); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 4186972dd7..285a52aa17 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -27,8 +27,8 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; -use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WallConnectionType; +use pocketmine\block\utils\WoodType; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateSerializeException; @@ -226,15 +226,15 @@ final class BlockStateWriter{ } /** @return $this */ - public function writeTreeType(TreeType $treeType) : self{ + public function writeLegacyWoodType(WoodType $treeType) : self{ $this->writeString(BlockStateNames::WOOD_TYPE, match($treeType->id()){ - TreeType::OAK()->id() => StringValues::WOOD_TYPE_OAK, - TreeType::SPRUCE()->id() => StringValues::WOOD_TYPE_SPRUCE, - TreeType::BIRCH()->id() => StringValues::WOOD_TYPE_BIRCH, - TreeType::JUNGLE()->id() => StringValues::WOOD_TYPE_JUNGLE, - TreeType::ACACIA()->id() => StringValues::WOOD_TYPE_ACACIA, - TreeType::DARK_OAK()->id() => StringValues::WOOD_TYPE_DARK_OAK, - default => throw new BlockStateSerializeException("Invalid Tree type " . $treeType->name()) + WoodType::OAK()->id() => StringValues::WOOD_TYPE_OAK, + WoodType::SPRUCE()->id() => StringValues::WOOD_TYPE_SPRUCE, + WoodType::BIRCH()->id() => StringValues::WOOD_TYPE_BIRCH, + WoodType::JUNGLE()->id() => StringValues::WOOD_TYPE_JUNGLE, + WoodType::ACACIA()->id() => StringValues::WOOD_TYPE_ACACIA, + WoodType::DARK_OAK()->id() => StringValues::WOOD_TYPE_DARK_OAK, + default => throw new BlockStateSerializeException("Invalid Wood type " . $treeType->name()) }); return $this; } diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 5008b33459..1fff315893 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -270,7 +270,7 @@ final class ItemDeserializer{ //TODO: minecraft:cow_spawn_egg //TODO: minecraft:creeper_banner_pattern //TODO: minecraft:creeper_spawn_egg - //TODO: minecraft:crimson_door + $this->map(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()->asItem()); //TODO: minecraft:crimson_sign //TODO: minecraft:crossbow $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); @@ -421,6 +421,7 @@ final class ItemDeserializer{ $this->map(Ids::MAGENTA_DYE, fn() => Items::DYE()->setColor(DyeColor::MAGENTA())); $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); //TODO: minecraft:magma_cube_spawn_egg + $this->map(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()->asItem()); //TODO: minecraft:medicine $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); @@ -592,7 +593,7 @@ final class ItemDeserializer{ $this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG()); //TODO: minecraft:vindicator_spawn_egg //TODO: minecraft:wandering_trader_spawn_egg - //TODO: minecraft:warped_door + $this->map(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()->asItem()); //TODO: minecraft:warped_fungus_on_a_stick //TODO: minecraft:warped_sign $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 47c84f6e7f..e45c98f3f7 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -228,18 +228,21 @@ final class ItemSerializer{ $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); $this->mapBlock(Blocks::BREWING_STAND(), self::id(Ids::BREWING_STAND)); $this->mapBlock(Blocks::CAKE(), self::id(Ids::CAKE)); + $this->mapBlock(Blocks::CRIMSON_DOOR(), self::id(Ids::CRIMSON_DOOR)); $this->mapBlock(Blocks::DARK_OAK_DOOR(), self::id(Ids::DARK_OAK_DOOR)); $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); $this->mapBlock(Blocks::HOPPER(), self::id(Ids::HOPPER)); $this->mapBlock(Blocks::IRON_DOOR(), self::id(Ids::IRON_DOOR)); $this->mapBlock(Blocks::ITEM_FRAME(), self::id(Ids::FRAME)); $this->mapBlock(Blocks::JUNGLE_DOOR(), self::id(Ids::JUNGLE_DOOR)); + $this->mapBlock(Blocks::MANGROVE_DOOR(), self::id(Ids::MANGROVE_DOOR)); $this->mapBlock(Blocks::NETHER_WART(), self::id(Ids::NETHER_WART)); $this->mapBlock(Blocks::OAK_DOOR(), self::id(Ids::WOODEN_DOOR)); $this->mapBlock(Blocks::REDSTONE_COMPARATOR(), self::id(Ids::COMPARATOR)); $this->mapBlock(Blocks::REDSTONE_REPEATER(), self::id(Ids::REPEATER)); $this->mapBlock(Blocks::SPRUCE_DOOR(), self::id(Ids::SPRUCE_DOOR)); $this->mapBlock(Blocks::SUGARCANE(), self::id(Ids::SUGAR_CANE)); + $this->mapBlock(Blocks::WARPED_DOOR(), self::id(Ids::WARPED_DOOR)); $this->mapBlock(Blocks::BED(), fn(Bed $block) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($block->getColor()))); $this->mapBlock(Blocks::MOB_HEAD(), fn(Skull $block) => new Data(Ids::SKULL, $block->getSkullType()->getMagicNumber())); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d8d54924ee..97c9bbdb8f 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -226,6 +226,17 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::CREEPER())); + $result->registerBlock("crimson_button", fn() => Blocks::CRIMSON_BUTTON()); + $result->registerBlock("crimson_door", fn() => Blocks::CRIMSON_DOOR()); + $result->registerBlock("crimson_fence", fn() => Blocks::CRIMSON_FENCE()); + $result->registerBlock("crimson_fence_gate", fn() => Blocks::CRIMSON_FENCE_GATE()); + $result->registerBlock("crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(false)); + $result->registerBlock("crimson_planks", fn() => Blocks::CRIMSON_PLANKS()); + $result->registerBlock("crimson_pressure_plate", fn() => Blocks::CRIMSON_PRESSURE_PLATE()); + $result->registerBlock("crimson_slab", fn() => Blocks::CRIMSON_SLAB()); + $result->registerBlock("crimson_stairs", fn() => Blocks::CRIMSON_STAIRS()); + $result->registerBlock("crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(false)); + $result->registerBlock("crimson_trapdoor", fn() => Blocks::CRIMSON_TRAPDOOR()); $result->registerBlock("cut_red_sandstone", fn() => Blocks::CUT_RED_SANDSTONE()); $result->registerBlock("cut_red_sandstone_slab", fn() => Blocks::CUT_RED_SANDSTONE_SLAB()); $result->registerBlock("cut_sandstone", fn() => Blocks::CUT_SANDSTONE()); @@ -685,6 +696,17 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("log2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("loom", fn() => Blocks::LOOM()); $result->registerBlock("magma", fn() => Blocks::MAGMA()); + $result->registerBlock("mangrove_button", fn() => Blocks::MANGROVE_BUTTON()); + $result->registerBlock("mangrove_door", fn() => Blocks::MANGROVE_DOOR()); + $result->registerBlock("mangrove_fence", fn() => Blocks::MANGROVE_FENCE()); + $result->registerBlock("mangrove_fence_gate", fn() => Blocks::MANGROVE_FENCE_GATE()); + $result->registerBlock("mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(false)); + $result->registerBlock("mangrove_planks", fn() => Blocks::MANGROVE_PLANKS()); + $result->registerBlock("mangrove_pressure_plate", fn() => Blocks::MANGROVE_PRESSURE_PLATE()); + $result->registerBlock("mangrove_slab", fn() => Blocks::MANGROVE_SLAB()); + $result->registerBlock("mangrove_stairs", fn() => Blocks::MANGROVE_STAIRS()); + $result->registerBlock("mangrove_trapdoor", fn() => Blocks::MANGROVE_TRAPDOOR()); + $result->registerBlock("mangrove_wood", fn() => Blocks::MANGROVE_WOOD()->setStripped(false)); $result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER()); $result->registerBlock("melon_block", fn() => Blocks::MELON()); $result->registerBlock("melon_stem", fn() => Blocks::MELON_STEM()); @@ -929,14 +951,20 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("stripped_acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(true)); $result->registerBlock("stripped_birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(true)); $result->registerBlock("stripped_birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(true)); + $result->registerBlock("stripped_crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(true)); + $result->registerBlock("stripped_crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(true)); $result->registerBlock("stripped_dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(true)); $result->registerBlock("stripped_dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()->setStripped(true)); $result->registerBlock("stripped_jungle_log", fn() => Blocks::JUNGLE_LOG()->setStripped(true)); $result->registerBlock("stripped_jungle_wood", fn() => Blocks::JUNGLE_WOOD()->setStripped(true)); + $result->registerBlock("stripped_mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(true)); + $result->registerBlock("stripped_mangrove_wood", fn() => Blocks::MANGROVE_WOOD()->setStripped(true)); $result->registerBlock("stripped_oak_log", fn() => Blocks::OAK_LOG()->setStripped(true)); $result->registerBlock("stripped_oak_wood", fn() => Blocks::OAK_WOOD()->setStripped(true)); $result->registerBlock("stripped_spruce_log", fn() => Blocks::SPRUCE_LOG()->setStripped(true)); $result->registerBlock("stripped_spruce_wood", fn() => Blocks::SPRUCE_WOOD()->setStripped(true)); + $result->registerBlock("stripped_warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(true)); + $result->registerBlock("stripped_warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(true)); $result->registerBlock("sugar_cane", fn() => Blocks::SUGARCANE()); $result->registerBlock("sugar_canes", fn() => Blocks::SUGARCANE()); $result->registerBlock("sugarcane", fn() => Blocks::SUGARCANE()); @@ -968,6 +996,17 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wall_banner", fn() => Blocks::WALL_BANNER()); $result->registerBlock("wall_coral_fan", fn() => Blocks::WALL_CORAL_FAN()); $result->registerBlock("wall_sign", fn() => Blocks::OAK_WALL_SIGN()); + $result->registerBlock("warped_button", fn() => Blocks::WARPED_BUTTON()); + $result->registerBlock("warped_door", fn() => Blocks::WARPED_DOOR()); + $result->registerBlock("warped_fence", fn() => Blocks::WARPED_FENCE()); + $result->registerBlock("warped_fence_gate", fn() => Blocks::WARPED_FENCE_GATE()); + $result->registerBlock("warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(false)); + $result->registerBlock("warped_planks", fn() => Blocks::WARPED_PLANKS()); + $result->registerBlock("warped_pressure_plate", fn() => Blocks::WARPED_PRESSURE_PLATE()); + $result->registerBlock("warped_slab", fn() => Blocks::WARPED_SLAB()); + $result->registerBlock("warped_stairs", fn() => Blocks::WARPED_STAIRS()); + $result->registerBlock("warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(false)); + $result->registerBlock("warped_trapdoor", fn() => Blocks::WARPED_TRAPDOOR()); $result->registerBlock("water", fn() => Blocks::WATER()); $result->registerBlock("water_lily", fn() => Blocks::LILY_PAD()); $result->registerBlock("waterlily", fn() => Blocks::LILY_PAD()); From 386c385a0807ad2998a80144f585a57e5f12424a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 19:07:45 +0100 Subject: [PATCH 0243/1858] Updated BlockFactory consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 7911379d29..c906ca37ed 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5313536":"Oak Planks","5314560":"Oak Sapling","5314561":"Oak Sapling","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366784":"Spruce Planks","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140992":"Birch Planks","5142016":"Birch Sapling","5142017":"Birch Sapling","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281792":"Jungle Planks","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123584":"Acacia Planks","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174784":"Dark Oak Planks","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From ce59228688da87133d32bc59b6483552523ce1f6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 19:45:13 +0100 Subject: [PATCH 0244/1858] BlockLegacyMetadata: remove unused constants --- .../bedrock/block/BlockLegacyMetadata.php | 231 ------------------ 1 file changed, 231 deletions(-) diff --git a/src/data/bedrock/block/BlockLegacyMetadata.php b/src/data/bedrock/block/BlockLegacyMetadata.php index a465f12744..a8b39201a6 100644 --- a/src/data/bedrock/block/BlockLegacyMetadata.php +++ b/src/data/bedrock/block/BlockLegacyMetadata.php @@ -32,123 +32,12 @@ final class BlockLegacyMetadata{ //NOOP } - public const ANVIL_NORMAL = 0; - public const ANVIL_SLIGHTLY_DAMAGED = 4; - public const ANVIL_VERY_DAMAGED = 8; - - public const BAMBOO_FLAG_THICK = 0x01; - public const BAMBOO_FLAG_READY = 0x08; - - public const BAMBOO_LEAF_SIZE_SHIFT = 1; - public const BAMBOO_LEAF_SIZE_MASK = 0x03; - - public const BAMBOO_SAPLING_FLAG_READY = 0x01; - - public const BARREL_FLAG_OPEN = 0x08; - - public const BED_FLAG_HEAD = 0x08; - public const BED_FLAG_OCCUPIED = 0x04; - - public const BEDROCK_FLAG_INFINIBURN = 0x01; - - public const BELL_ATTACHMENT_FLOOR = 0; - public const BELL_ATTACHMENT_CEILING = 1; - public const BELL_ATTACHMENT_ONE_WALL = 2; - public const BELL_ATTACHMENT_TWO_WALLS = 3; - - public const BREWING_STAND_FLAG_EAST = 0x01; - public const BREWING_STAND_FLAG_SOUTHWEST = 0x02; - public const BREWING_STAND_FLAG_NORTHWEST = 0x04; - - public const BUTTON_FLAG_POWERED = 0x08; - - public const CHEMISTRY_COMPOUND_CREATOR = 0; - public const CHEMISTRY_MATERIAL_REDUCER = 4; - public const CHEMISTRY_ELEMENT_CONSTRUCTOR = 8; - public const CHEMISTRY_LAB_TABLE = 12; - - public const COLORED_TORCH_BP_BLUE = 0; - public const COLORED_TORCH_BP_PURPLE = 8; - public const COLORED_TORCH_RG_RED = 0; - public const COLORED_TORCH_RG_GREEN = 8; - - public const CORAL_BLOCK_FLAG_DEAD = 0x8; - - public const CORAL_FAN_EAST_WEST = 0; - public const CORAL_FAN_NORTH_SOUTH = 1; - public const CORAL_FAN_TYPE_MASK = 0x7; - - public const CORAL_FAN_HANG_FLAG_DEAD = 0x2; - - public const CORAL_FAN_HANG_TUBE = 0; - public const CORAL_FAN_HANG_BRAIN = 1; - public const CORAL_FAN_HANG2_BUBBLE = 0; - public const CORAL_FAN_HANG2_FIRE = 1; - public const CORAL_FAN_HANG3_HORN = 0; - public const CORAL_FAN_HANG_TYPE_MASK = 0x1; - public const CORAL_VARIANT_TUBE = 0; public const CORAL_VARIANT_BRAIN = 1; public const CORAL_VARIANT_BUBBLE = 2; public const CORAL_VARIANT_FIRE = 3; public const CORAL_VARIANT_HORN = 4; - public const DIRT_FLAG_COARSE = 0x1; - - public const DOOR_FLAG_TOP = 0x08; - public const DOOR_BOTTOM_FLAG_OPEN = 0x04; - public const DOOR_TOP_FLAG_RIGHT = 0x01; - - public const DOUBLE_PLANT_SUNFLOWER = 0; - public const DOUBLE_PLANT_LILAC = 1; - public const DOUBLE_PLANT_TALLGRASS = 2; - public const DOUBLE_PLANT_LARGE_FERN = 3; - public const DOUBLE_PLANT_ROSE_BUSH = 4; - public const DOUBLE_PLANT_PEONY = 5; - - public const DOUBLE_PLANT_FLAG_TOP = 0x08; - - public const END_PORTAL_FRAME_FLAG_EYE = 0x04; - - public const FENCE_GATE_FLAG_OPEN = 0x04; - public const FENCE_GATE_FLAG_IN_WALL = 0x08; - - public const FLOWER_POPPY = 0; - public const FLOWER_BLUE_ORCHID = 1; - public const FLOWER_ALLIUM = 2; - public const FLOWER_AZURE_BLUET = 3; - public const FLOWER_RED_TULIP = 4; - public const FLOWER_ORANGE_TULIP = 5; - public const FLOWER_WHITE_TULIP = 6; - public const FLOWER_PINK_TULIP = 7; - public const FLOWER_OXEYE_DAISY = 8; - public const FLOWER_CORNFLOWER = 9; - public const FLOWER_LILY_OF_THE_VALLEY = 10; - - public const FLOWER_POT_FLAG_OCCUPIED = 0x01; - - public const HOPPER_FLAG_POWERED = 0x08; - - public const INFESTED_STONE = 0; - public const INFESTED_COBBLESTONE = 1; - public const INFESTED_STONE_BRICK = 2; - public const INFESTED_STONE_BRICK_MOSSY = 3; - public const INFESTED_STONE_BRICK_CRACKED = 4; - public const INFESTED_STONE_BRICK_CHISELED = 5; - - public const ITEM_FRAME_FLAG_HAS_MAP = 0x04; - - public const LANTERN_FLAG_HANGING = 0x01; - - public const LEAVES_FLAG_NO_DECAY = 0x04; - public const LEAVES_FLAG_CHECK_DECAY = 0x08; - - public const LECTERN_FLAG_POWERED = 0x04; - - public const LEVER_FLAG_POWERED = 0x08; - - public const LIQUID_FLAG_FALLING = 0x08; - public const MUSHROOM_BLOCK_ALL_PORES = 0; public const MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER = 1; public const MUSHROOM_BLOCK_CAP_NORTH_SIDE = 2; @@ -164,27 +53,6 @@ final class BlockLegacyMetadata{ public const MUSHROOM_BLOCK_ALL_CAP = 14; public const MUSHROOM_BLOCK_ALL_STEM = 15; - public const NETHER_PORTAL_AXIS_X = 1; - public const NETHER_PORTAL_AXIS_Z = 2; - - public const NETHER_REACTOR_INACTIVE = 0; - public const NETHER_REACTOR_ACTIVE = 1; - public const NETHER_REACTOR_USED = 2; - - public const PRESSURE_PLATE_FLAG_POWERED = 0x01; - - public const PRISMARINE_NORMAL = 0; - public const PRISMARINE_DARK = 1; - public const PRISMARINE_BRICKS = 2; - - public const PURPUR_NORMAL = 0; - public const PURPUR_PILLAR = 2; - - public const QUARTZ_NORMAL = 0; - public const QUARTZ_CHISELED = 1; - public const QUARTZ_PILLAR = 2; - public const QUARTZ_SMOOTH = 3; - public const RAIL_STRAIGHT_NORTH_SOUTH = 0; public const RAIL_STRAIGHT_EAST_WEST = 1; public const RAIL_ASCENDING_EAST = 2; @@ -196,107 +64,8 @@ final class BlockLegacyMetadata{ public const RAIL_CURVE_NORTHWEST = 8; public const RAIL_CURVE_NORTHEAST = 9; - public const REDSTONE_COMPARATOR_FLAG_SUBTRACT = 0x04; - public const REDSTONE_COMPARATOR_FLAG_POWERED = 0x08; - - public const REDSTONE_RAIL_FLAG_POWERED = 0x08; - - public const SANDSTONE_NORMAL = 0; - public const SANDSTONE_CHISELED = 1; - public const SANDSTONE_CUT = 2; - public const SANDSTONE_SMOOTH = 3; - - public const SAPLING_FLAG_READY = 0x08; - - public const SEA_PICKLE_FLAG_NOT_UNDERWATER = 0x04; - - public const SKULL_FLAG_NO_DROPS = 0x08; - - public const SLAB_FLAG_UPPER = 0x08; - - public const SPONGE_FLAG_WET = 0x01; - - public const STAIR_FLAG_UPSIDE_DOWN = 0x04; - - public const STONE_NORMAL = 0; - public const STONE_GRANITE = 1; - public const STONE_POLISHED_GRANITE = 2; - public const STONE_DIORITE = 3; - public const STONE_POLISHED_DIORITE = 4; - public const STONE_ANDESITE = 5; - public const STONE_POLISHED_ANDESITE = 6; - - public const STONE_BRICK_NORMAL = 0; - public const STONE_BRICK_MOSSY = 1; - public const STONE_BRICK_CRACKED = 2; - public const STONE_BRICK_CHISELED = 3; - - public const STONE_SLAB_SMOOTH_STONE = 0; - public const STONE_SLAB_SANDSTONE = 1; - public const STONE_SLAB_FAKE_WOODEN = 2; - public const STONE_SLAB_COBBLESTONE = 3; - public const STONE_SLAB_BRICK = 4; - public const STONE_SLAB_STONE_BRICK = 5; - public const STONE_SLAB_QUARTZ = 6; - public const STONE_SLAB_NETHER_BRICK = 7; - public const STONE_SLAB2_RED_SANDSTONE = 0; - public const STONE_SLAB2_PURPUR = 1; - public const STONE_SLAB2_PRISMARINE = 2; - public const STONE_SLAB2_DARK_PRISMARINE = 3; - public const STONE_SLAB2_PRISMARINE_BRICKS = 4; - public const STONE_SLAB2_MOSSY_COBBLESTONE = 5; - public const STONE_SLAB2_SMOOTH_SANDSTONE = 6; - public const STONE_SLAB2_RED_NETHER_BRICK = 7; - public const STONE_SLAB3_END_STONE_BRICK = 0; - public const STONE_SLAB3_SMOOTH_RED_SANDSTONE = 1; - public const STONE_SLAB3_POLISHED_ANDESITE = 2; - public const STONE_SLAB3_ANDESITE = 3; - public const STONE_SLAB3_DIORITE = 4; - public const STONE_SLAB3_POLISHED_DIORITE = 5; - public const STONE_SLAB3_GRANITE = 6; - public const STONE_SLAB3_POLISHED_GRANITE = 7; - public const STONE_SLAB4_MOSSY_STONE_BRICK = 0; - public const STONE_SLAB4_SMOOTH_QUARTZ = 1; - public const STONE_SLAB4_STONE = 2; - public const STONE_SLAB4_CUT_SANDSTONE = 3; - public const STONE_SLAB4_CUT_RED_SANDSTONE = 4; - - public const TALLGRASS_NORMAL = 1; - public const TALLGRASS_FERN = 2; - - public const TNT_FLAG_UNSTABLE = 0x01; - public const TNT_FLAG_UNDERWATER = 0x02; - - public const TRAPDOOR_FLAG_UPPER = 0x04; - public const TRAPDOOR_FLAG_OPEN = 0x08; - - public const TRIPWIRE_FLAG_TRIGGERED = 0x01; - public const TRIPWIRE_FLAG_SUSPENDED = 0x02; - public const TRIPWIRE_FLAG_CONNECTED = 0x04; - public const TRIPWIRE_FLAG_DISARMED = 0x08; - - public const TRIPWIRE_HOOK_FLAG_CONNECTED = 0x04; - public const TRIPWIRE_HOOK_FLAG_POWERED = 0x08; - public const VINE_FLAG_SOUTH = 0x01; public const VINE_FLAG_WEST = 0x02; public const VINE_FLAG_NORTH = 0x04; public const VINE_FLAG_EAST = 0x08; - - public const WALL_COBBLESTONE = 0; - public const WALL_MOSSY_COBBLESTONE = 1; - public const WALL_GRANITE = 2; - public const WALL_DIORITE = 3; - public const WALL_ANDESITE = 4; - public const WALL_SANDSTONE = 5; - public const WALL_BRICK = 6; - public const WALL_STONE_BRICK = 7; - public const WALL_MOSSY_STONE_BRICK = 8; - public const WALL_NETHER_BRICK = 9; - public const WALL_END_STONE_BRICK = 10; - public const WALL_PRISMARINE = 11; - public const WALL_RED_SANDSTONE = 12; - public const WALL_RED_NETHER_BRICK = 13; - - public const WOOD_FLAG_STRIPPED = 0x8; } From 6604d22cebe55f2b0d1a28b9b7b56c883eb33028 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 19:53:34 +0100 Subject: [PATCH 0245/1858] BlockLegacyIdHelper: clean up code --- src/block/BlockLegacyIdHelper.php | 236 ++++++++++++------------------ 1 file changed, 91 insertions(+), 145 deletions(-) diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 4622572524..57386510f6 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -79,18 +79,18 @@ final class BlockLegacyIdHelper{ } public static function getLogIdentifier(WoodType $treeType) : BID{ - return match($treeType->id()){ - WoodType::OAK()->id() => new BID(Ids::OAK_LOG), - WoodType::SPRUCE()->id() => new BID(Ids::SPRUCE_LOG), - WoodType::BIRCH()->id() => new BID(Ids::BIRCH_LOG), - WoodType::JUNGLE()->id() => new BID(Ids::JUNGLE_LOG), - WoodType::ACACIA()->id() => new BID(Ids::ACACIA_LOG), - WoodType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LOG), - WoodType::MANGROVE()->id() => new BID(Ids::MANGROVE_LOG), - WoodType::CRIMSON()->id() => new BID(Ids::CRIMSON_STEM), - WoodType::WARPED()->id() => new BID(Ids::WARPED_STEM), + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_LOG, + WoodType::SPRUCE()->id() => Ids::SPRUCE_LOG, + WoodType::BIRCH()->id() => Ids::BIRCH_LOG, + WoodType::JUNGLE()->id() => Ids::JUNGLE_LOG, + WoodType::ACACIA()->id() => Ids::ACACIA_LOG, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_LOG, + WoodType::MANGROVE()->id() => Ids::MANGROVE_LOG, + WoodType::CRIMSON()->id() => Ids::CRIMSON_STEM, + WoodType::WARPED()->id() => Ids::WARPED_STEM, default => throw new AssumptionFailedError("All tree types should be covered") - }; + }); } public static function getAllSidedLogIdentifier(WoodType $treeType) : BID{ @@ -109,15 +109,15 @@ final class BlockLegacyIdHelper{ } public static function getLeavesIdentifier(TreeType $treeType) : BID{ - return match($treeType->id()){ - TreeType::OAK()->id() => new BID(Ids::OAK_LEAVES), - TreeType::SPRUCE()->id() => new BID(Ids::SPRUCE_LEAVES), - TreeType::BIRCH()->id() => new BID(Ids::BIRCH_LEAVES), - TreeType::JUNGLE()->id() => new BID(Ids::JUNGLE_LEAVES), - TreeType::ACACIA()->id() => new BID(Ids::ACACIA_LEAVES), - TreeType::DARK_OAK()->id() => new BID(Ids::DARK_OAK_LEAVES), + return new BID(match($treeType->id()){ + TreeType::OAK()->id() => Ids::OAK_LEAVES, + TreeType::SPRUCE()->id() => Ids::SPRUCE_LEAVES, + TreeType::BIRCH()->id() => Ids::BIRCH_LEAVES, + TreeType::JUNGLE()->id() => Ids::JUNGLE_LEAVES, + TreeType::ACACIA()->id() => Ids::ACACIA_LEAVES, + TreeType::DARK_OAK()->id() => Ids::DARK_OAK_LEAVES, default => throw new AssumptionFailedError("All tree types should be covered") - }; + }); } public static function getSaplingIdentifier(TreeType $treeType) : BID{ @@ -179,146 +179,92 @@ final class BlockLegacyIdHelper{ } public static function getWoodenTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_TRAPDOOR); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_TRAPDOOR); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_TRAPDOOR); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_TRAPDOOR); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_TRAPDOOR); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_TRAPDOOR); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_TRAPDOOR); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_TRAPDOOR); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_TRAPDOOR); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_TRAPDOOR, + WoodType::SPRUCE()->id() => Ids::SPRUCE_TRAPDOOR, + WoodType::BIRCH()->id() => Ids::BIRCH_TRAPDOOR, + WoodType::JUNGLE()->id() => Ids::JUNGLE_TRAPDOOR, + WoodType::ACACIA()->id() => Ids::ACACIA_TRAPDOOR, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_TRAPDOOR, + WoodType::MANGROVE()->id() => Ids::MANGROVE_TRAPDOOR, + WoodType::CRIMSON()->id() => Ids::CRIMSON_TRAPDOOR, + WoodType::WARPED()->id() => Ids::WARPED_TRAPDOOR, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } public static function getWoodenButtonIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_BUTTON); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_BUTTON); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_BUTTON); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_BUTTON); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_BUTTON); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_BUTTON); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_BUTTON); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_BUTTON); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_BUTTON); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_BUTTON, + WoodType::SPRUCE()->id() => Ids::SPRUCE_BUTTON, + WoodType::BIRCH()->id() => Ids::BIRCH_BUTTON, + WoodType::JUNGLE()->id() => Ids::JUNGLE_BUTTON, + WoodType::ACACIA()->id() => Ids::ACACIA_BUTTON, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_BUTTON, + WoodType::MANGROVE()->id() => Ids::MANGROVE_BUTTON, + WoodType::CRIMSON()->id() => Ids::CRIMSON_BUTTON, + WoodType::WARPED()->id() => Ids::WARPED_BUTTON, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } public static function getWoodenPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_PRESSURE_PLATE); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_PRESSURE_PLATE); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_PRESSURE_PLATE); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_PRESSURE_PLATE); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_PRESSURE_PLATE); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_PRESSURE_PLATE); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_PRESSURE_PLATE); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_PRESSURE_PLATE); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_PRESSURE_PLATE); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_PRESSURE_PLATE, + WoodType::SPRUCE()->id() => Ids::SPRUCE_PRESSURE_PLATE, + WoodType::BIRCH()->id() => Ids::BIRCH_PRESSURE_PLATE, + WoodType::JUNGLE()->id() => Ids::JUNGLE_PRESSURE_PLATE, + WoodType::ACACIA()->id() => Ids::ACACIA_PRESSURE_PLATE, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_PRESSURE_PLATE, + WoodType::MANGROVE()->id() => Ids::MANGROVE_PRESSURE_PLATE, + WoodType::CRIMSON()->id() => Ids::CRIMSON_PRESSURE_PLATE, + WoodType::WARPED()->id() => Ids::WARPED_PRESSURE_PLATE, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } public static function getWoodenDoorIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_DOOR); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_DOOR); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_DOOR); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_DOOR); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_DOOR); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_DOOR); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_DOOR); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_DOOR); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_DOOR); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_DOOR, + WoodType::SPRUCE()->id() => Ids::SPRUCE_DOOR, + WoodType::BIRCH()->id() => Ids::BIRCH_DOOR, + WoodType::JUNGLE()->id() => Ids::JUNGLE_DOOR, + WoodType::ACACIA()->id() => Ids::ACACIA_DOOR, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_DOOR, + WoodType::MANGROVE()->id() => Ids::MANGROVE_DOOR, + WoodType::CRIMSON()->id() => Ids::CRIMSON_DOOR, + WoodType::WARPED()->id() => Ids::WARPED_DOOR, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } public static function getWoodenFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_FENCE_GATE); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_FENCE_GATE); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_FENCE_GATE); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_FENCE_GATE); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_FENCE_GATE); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_FENCE_GATE); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_FENCE_GATE); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_FENCE_GATE); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_FENCE_GATE); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_FENCE_GATE, + WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE_GATE, + WoodType::BIRCH()->id() => Ids::BIRCH_FENCE_GATE, + WoodType::JUNGLE()->id() => Ids::JUNGLE_FENCE_GATE, + WoodType::ACACIA()->id() => Ids::ACACIA_FENCE_GATE, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE_GATE, + WoodType::MANGROVE()->id() => Ids::MANGROVE_FENCE_GATE, + WoodType::CRIMSON()->id() => Ids::CRIMSON_FENCE_GATE, + WoodType::WARPED()->id() => Ids::WARPED_FENCE_GATE, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } public static function getWoodenStairsIdentifier(WoodType $treeType) : BlockIdentifier{ - switch($treeType->id()){ - case WoodType::OAK()->id(): - return new BID(Ids::OAK_STAIRS); - case WoodType::SPRUCE()->id(): - return new BID(Ids::SPRUCE_STAIRS); - case WoodType::BIRCH()->id(): - return new BID(Ids::BIRCH_STAIRS); - case WoodType::JUNGLE()->id(): - return new BID(Ids::JUNGLE_STAIRS); - case WoodType::ACACIA()->id(): - return new BID(Ids::ACACIA_STAIRS); - case WoodType::DARK_OAK()->id(): - return new BID(Ids::DARK_OAK_STAIRS); - case WoodType::MANGROVE()->id(): - return new BID(Ids::MANGROVE_STAIRS); - case WoodType::CRIMSON()->id(): - return new BID(Ids::CRIMSON_STAIRS); - case WoodType::WARPED()->id(): - return new BID(Ids::WARPED_STAIRS); - } - throw new AssumptionFailedError("Switch should cover all wood types"); + return new BID(match($treeType->id()){ + WoodType::OAK()->id() => Ids::OAK_STAIRS, + WoodType::SPRUCE()->id() => Ids::SPRUCE_STAIRS, + WoodType::BIRCH()->id() => Ids::BIRCH_STAIRS, + WoodType::JUNGLE()->id() => Ids::JUNGLE_STAIRS, + WoodType::ACACIA()->id() => Ids::ACACIA_STAIRS, + WoodType::DARK_OAK()->id() => Ids::DARK_OAK_STAIRS, + WoodType::MANGROVE()->id() => Ids::MANGROVE_STAIRS, + WoodType::CRIMSON()->id() => Ids::CRIMSON_STAIRS, + WoodType::WARPED()->id() => Ids::WARPED_STAIRS, + default => throw new AssumptionFailedError("All wood types should be covered") + }); } } From cbebb70af6814227ec89317837a5f808190769b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 19:58:04 +0100 Subject: [PATCH 0246/1858] Planks: remove useless constructor --- src/block/Planks.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/block/Planks.php b/src/block/Planks.php index 23c9fe4a8a..0eca22c24c 100644 --- a/src/block/Planks.php +++ b/src/block/Planks.php @@ -23,17 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\WoodType; use pocketmine\block\utils\WoodTypeTrait; class Planks extends Opaque{ use WoodTypeTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, WoodType $woodType){ - $this->woodType = $woodType; - parent::__construct($idInfo, $name, $breakInfo); - } - public function getFuelTime() : int{ return 300; } From 2c33d8429e3cdf0c44d44e99e73d1bb97e4942f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Jul 2022 20:08:56 +0100 Subject: [PATCH 0247/1858] tests: remove unnecessary Block::getName() override --- tests/phpunit/block/OutOfBoundsBlock.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/phpunit/block/OutOfBoundsBlock.php b/tests/phpunit/block/OutOfBoundsBlock.php index 21cbf9a9f6..6a4a2edcb3 100644 --- a/tests/phpunit/block/OutOfBoundsBlock.php +++ b/tests/phpunit/block/OutOfBoundsBlock.php @@ -25,7 +25,4 @@ namespace pocketmine\block; class OutOfBoundsBlock extends Block{ - public function getName() : string{ - return "Out of Bounds Block"; - } } From 17abd50f69d5c2cc379aabf8920e0fe38bd636ae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 14:56:50 +0100 Subject: [PATCH 0248/1858] Publish script used to generate BlockTypeNames, BlockStateNames and BlockStateStringValues --- build/generate-block-serializer-consts.php | 181 ++++++++++++++++++ src/data/bedrock/block/BlockStateNames.php | 6 + .../bedrock/block/BlockStateStringValues.php | 6 + src/data/bedrock/block/BlockTypeNames.php | 1 - 4 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 build/generate-block-serializer-consts.php diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php new file mode 100644 index 0000000000..b1dd98c65d --- /dev/null +++ b/build/generate-block-serializer-consts.php @@ -0,0 +1,181 @@ + + */ + public array $seenTypes = []; + /** + * @var string[][] + * @phpstan-var array> + */ + public array $seenStateValues = []; +} + +function generateBlockPaletteReport(BlockStateDictionary $dictionary) : BlockPaletteReport{ + $result = new BlockPaletteReport(); + + foreach($dictionary->getStates() as $state){ + $stateData = $state->getStateData(); + $name = $stateData->getName(); + $result->seenTypes[$name] = $name; + foreach($stateData->getStates() as $k => $v){ + $result->seenStateValues[$k][$v->getValue()] = $v->getValue(); + asort($result->seenStateValues[$k]); + } + } + + ksort($result->seenTypes, SORT_STRING); + ksort($result->seenStateValues, SORT_STRING); + return $result; +} + +function constifyMcId(string $id) : string{ + return strtoupper(explode(":", $id, 2)[1]); +} + +function generateClassHeader(string $className) : string{ + $namespace = substr($className, 0, strrpos($className, "\\")); + $shortName = substr($className, strrpos($className, "\\") + 1); + return <<
$seenIds + */ +function generateBlockIds(array $seenIds) : void{ + $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockTypeNames.php', 'wb')); + + fwrite($output, generateClassHeader(BlockTypeNames::class)); + + foreach($seenIds as $id){ + fwrite($output, "\tpublic const " . constifyMcId($id) . " = \"" . $id . "\";\n"); + } + + fwrite($output, "}\n"); + fclose($output); +} + +function generateBlockStateNames(BlockPaletteReport $data) : void{ + $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockStateNames.php', 'wb')); + + fwrite($output, generateClassHeader(BlockStateNames::class)); + foreach(Utils::stringifyKeys($data->seenStateValues) as $state => $values){ + $constName = mb_strtoupper($state, 'US-ASCII'); + fwrite($output, "\tpublic const $constName = \"$state\";\n"); + } + + fwrite($output, "}\n"); + fclose($output); +} + +function generateBlockStringValues(BlockPaletteReport $data) : void{ + $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockStateStringValues.php', 'wb')); + + fwrite($output, generateClassHeader(BlockStateStringValues::class)); + foreach(Utils::stringifyKeys($data->seenStateValues) as $stateName => $values){ + $anyWritten = false; + sort($values, SORT_STRING); + foreach($values as $value){ + if(!is_string($value)){ + continue; + } + $anyWritten = true; + $constName = mb_strtoupper($stateName . "_" . $value, 'US-ASCII'); + fwrite($output, "\tpublic const $constName = \"$value\";\n"); + } + if($anyWritten){ + fwrite($output, "\n"); + } + } + fwrite($output, "}\n"); + fclose($output); +} + +if(count($argv) !== 2){ + fwrite(STDERR, "This script regenerates BlockTypeNames, BlockStateNames and BlockStateStringValues from a given palette file\n"); + fwrite(STDERR, "Required arguments: path to block palette file\n"); + exit(1); +} + +$palettePath = $argv[1]; +$paletteRaw = file_get_contents($palettePath); +if($paletteRaw === false){ + fwrite(STDERR, "Failed to read block palette file\n"); + exit(1); +} + +try{ + $states = array_map( + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + (new NetworkNbtSerializer())->readMultiple($paletteRaw) + ); +}catch(NbtException){ + fwrite(STDERR, "Invalid block palette file $argv[1]\n"); + exit(1); +} +$entries = []; +$fakeMeta = []; +foreach($states as $state){ + $fakeMeta[$state->getName()] ??= 0; + $entries[] = new BlockStateDictionaryEntry($state, $fakeMeta[$state->getName()]++); +} +$dictionary = new BlockStateDictionary($entries); +$report = generateBlockPaletteReport($dictionary); +generateBlockIds($report->seenTypes); +generateBlockStateNames($report); +generateBlockStringValues($report); + +echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index cfd90f1c32..31973c01ec 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -23,7 +23,13 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; +/** + * This class is generated automatically from the block palette for the current version. Do not edit it manually. + */ final class BlockStateNames{ + private function __construct(){ + //NOOP + } public const ACTIVE = "active"; public const AGE = "age"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 711bd58fab..128e04d388 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -23,7 +23,13 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; +/** + * This class is generated automatically from the block palette for the current version. Do not edit it manually. + */ final class BlockStateStringValues{ + private function __construct(){ + //NOOP + } public const ATTACHMENT_HANGING = "hanging"; public const ATTACHMENT_MULTIPLE = "multiple"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 9eee5d1346..9df7637734 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -765,5 +765,4 @@ final class BlockTypeNames{ public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; - } From 03b80770541fd3e9084fc8998d0170f77a3ed677 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 14:58:21 +0100 Subject: [PATCH 0249/1858] generate-block-serializer-consts: don't pollute the global namespace --- build/generate-block-serializer-consts.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index b1dd98c65d..0f9b472515 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -21,6 +21,8 @@ declare(strict_types=1); +namespace pocketmine\build\generate_block_serializer_consts; + use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateStringValues; From afd37ca892a2714571050f74db8f52620ed5b68b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 15:13:48 +0100 Subject: [PATCH 0250/1858] Fix PHPStan errors --- build/generate-block-serializer-consts.php | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 0f9b472515..d2ea78481e 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -33,7 +33,25 @@ use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\network\mcpe\convert\BlockStateDictionaryEntry; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; +use function array_map; +use function array_values; +use function asort; +use function count; +use function dirname; +use function explode; +use function fclose; +use function file_get_contents; +use function fopen; +use function fwrite; +use function is_string; +use function ksort; +use function mb_strtoupper; +use function sort; +use function strrpos; +use function strtoupper; +use function substr; require dirname(__DIR__) . '/vendor/autoload.php'; @@ -45,7 +63,7 @@ class BlockPaletteReport{ public array $seenTypes = []; /** * @var string[][] - * @phpstan-var array> + * @phpstan-var array> */ public array $seenStateValues = []; } @@ -73,8 +91,12 @@ function constifyMcId(string $id) : string{ } function generateClassHeader(string $className) : string{ - $namespace = substr($className, 0, strrpos($className, "\\")); - $shortName = substr($className, strrpos($className, "\\") + 1); + $backslashPos = strrpos($className, "\\"); + if($backslashPos === false){ + throw new AssumptionFailedError("Expected a namespaced class FQN"); + } + $namespace = substr($className, 0, $backslashPos); + $shortName = substr($className, $backslashPos + 1); return <<
seenTypes); +generateBlockIds(array_values($report->seenTypes)); generateBlockStateNames($report); generateBlockStringValues($report); From d9c61f0492c2d9f66f34e65fa22232708db2db23 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 15:43:13 +0100 Subject: [PATCH 0251/1858] Publish script used to generate ItemTypeIds --- build/generate-item-ids.php | 95 +++++++++++++++++++ src/data/bedrock/item/ItemTypeIds.php | 3 + .../mcpe/convert/GlobalItemTypeDictionary.php | 22 +---- .../ItemTypeDictionaryFromDataHelper.php | 52 ++++++++++ 4 files changed, 152 insertions(+), 20 deletions(-) create mode 100644 build/generate-item-ids.php create mode 100644 src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php diff --git a/build/generate-item-ids.php b/build/generate-item-ids.php new file mode 100644 index 0000000000..c0aa111800 --- /dev/null +++ b/build/generate-item-ids.php @@ -0,0 +1,95 @@ +getEntries() as $entry){ + if($entry->getNumericId() < 256){ //blockitems are serialized via BlockStateSerializer + continue; + } + $ids[$entry->getStringId()] = $entry->getStringId(); + } + asort($ids, SORT_STRING); + + $file = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/item/ItemTypeIds.php', 'wb')); + + fwrite($file, <<<'HEADER' + $entry){ - if(!is_array($entry) || !is_string($name) || !isset($entry["component_based"], $entry["runtime_id"]) || !is_bool($entry["component_based"]) || !is_int($entry["runtime_id"])){ - throw new AssumptionFailedError("Invalid item list format"); - } - $params[] = new ItemTypeEntry($name, $entry["runtime_id"], $entry["component_based"]); - } - return new self(new ItemTypeDictionary($params)); + $dictionary = ItemTypeDictionaryFromDataHelper::loadFromString($data); + return new self($dictionary); } public function __construct( diff --git a/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php b/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php new file mode 100644 index 0000000000..5d06758ef5 --- /dev/null +++ b/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php @@ -0,0 +1,52 @@ + $entry){ + if(!is_array($entry) || !is_string($name) || !isset($entry["component_based"], $entry["runtime_id"]) || !is_bool($entry["component_based"]) || !is_int($entry["runtime_id"])){ + throw new AssumptionFailedError("Invalid item list format"); + } + $params[] = new ItemTypeEntry($name, $entry["runtime_id"], $entry["component_based"]); + } + return new ItemTypeDictionary($params); + } +} From e44a291697b7e3633be6ae2e01eb7f650590b502 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 15:46:24 +0100 Subject: [PATCH 0252/1858] Rename ItemTypeIds -> ItemTypeNames for consistency's sake --- .../{generate-item-ids.php => generate-item-type-names.php} | 6 +++--- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 2 +- .../bedrock/item/{ItemTypeIds.php => ItemTypeNames.php} | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename build/{generate-item-ids.php => generate-item-type-names.php} (92%) rename src/data/bedrock/item/{ItemTypeIds.php => ItemTypeNames.php} (99%) diff --git a/build/generate-item-ids.php b/build/generate-item-type-names.php similarity index 92% rename from build/generate-item-ids.php rename to build/generate-item-type-names.php index c0aa111800..2da9b263e5 100644 --- a/build/generate-item-ids.php +++ b/build/generate-item-type-names.php @@ -53,7 +53,7 @@ function generateItemIds(ItemTypeDictionary $dictionary) : void{ } asort($ids, SORT_STRING); - $file = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/item/ItemTypeIds.php', 'wb')); + $file = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/item/ItemTypeNames.php', 'wb')); fwrite($file, <<<'HEADER' Date: Mon, 4 Jul 2022 15:47:28 +0100 Subject: [PATCH 0253/1858] ItemTranslator: use GlobalItemDataHandlers this ensures that plugin serializers will actually be used on the network. --- src/network/mcpe/convert/ItemTranslator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index b04e9f624e..eb36ecdd26 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -32,7 +32,7 @@ use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalBlockStateHandlers; +use pocketmine\world\format\io\GlobalItemDataHandlers; /** * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. @@ -46,8 +46,8 @@ final class ItemTranslator{ return new self( GlobalItemTypeDictionary::getInstance()->getDictionary(), RuntimeBlockMapping::getInstance()->getBlockStateDictionary(), - new ItemSerializer(GlobalBlockStateHandlers::getSerializer()), - new ItemDeserializer(GlobalBlockStateHandlers::getDeserializer()) + GlobalItemDataHandlers::getSerializer(), + GlobalItemDataHandlers::getDeserializer() ); } From 45be6e19f31af63494d5e3d02b7e7aa2cb08fc7a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 16:17:27 +0100 Subject: [PATCH 0254/1858] Update BedrockBlockUpgradeSchema --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 8b5a59aabf..fb0e297d24 100644 --- a/composer.lock +++ b/composer.lock @@ -253,12 +253,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "c7aa3e04ae36dbb9a97905a2595f4453d914aa5c" + "reference": "680ed5e351b92959c365b36bebc2698228b59834" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/c7aa3e04ae36dbb9a97905a2595f4453d914aa5c", - "reference": "c7aa3e04ae36dbb9a97905a2595f4453d914aa5c", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/680ed5e351b92959c365b36bebc2698228b59834", + "reference": "680ed5e351b92959c365b36bebc2698228b59834", "shasum": "" }, "default-branch": true, @@ -272,7 +272,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-06-08T13:20:45+00:00" + "time": "2022-07-03T19:17:51+00:00" }, { "name": "pocketmine/bedrock-data", From 59c5770cf269ba66f2f08cecef6f8b9b1d3dbbb3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 20:11:39 +0100 Subject: [PATCH 0255/1858] Durable: do not write Damage tag if damage is zero fixes creative inventory getting borked to hell --- src/item/Durable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/Durable.php b/src/item/Durable.php index a2300576bc..5d5bc90927 100644 --- a/src/item/Durable.php +++ b/src/item/Durable.php @@ -131,6 +131,6 @@ abstract class Durable extends Item{ protected function serializeCompoundTag(CompoundTag $tag) : void{ parent::serializeCompoundTag($tag); $this->unbreakable ? $tag->setByte("Unbreakable", 1) : $tag->removeTag("Unbreakable"); - $tag->setInt("Damage", $this->damage); + $this->damage !== 0 ? $tag->setInt("Damage", $this->damage) : $tag->removeTag("Damage"); } } From 9f0b32e748e4052a4f81d841817d15adca5a05bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 20:28:07 +0100 Subject: [PATCH 0256/1858] Updated creative and crafting data to 1.19 --- composer.lock | 8 +- src/Server.php | 2 +- src/crafting/CraftingManager.php | 4 +- .../CraftingManagerFromDataHelper.php | 280 +++++++++++++----- src/crafting/PotionContainerChangeRecipe.php | 10 +- src/crafting/PotionTypeRecipe.php | 16 +- src/crafting/json/FurnaceRecipeData.php | 42 +++ src/crafting/json/ItemStackData.php | 43 +++ .../json/PotionContainerChangeRecipeData.php | 41 +++ src/crafting/json/PotionTypeRecipeData.php | 41 +++ src/crafting/json/RecipeIngredientData.php | 40 +++ src/crafting/json/ShapedRecipeData.php | 72 +++++ src/crafting/json/ShapelessRecipeData.php | 61 ++++ src/data/bedrock/item/BlockItemIdMap.php | 17 +- src/inventory/CreativeInventory.php | 23 +- src/network/mcpe/cache/CraftingDataCache.php | 6 +- tests/phpstan/configs/actual-problems.neon | 15 - 17 files changed, 592 insertions(+), 129 deletions(-) create mode 100644 src/crafting/json/FurnaceRecipeData.php create mode 100644 src/crafting/json/ItemStackData.php create mode 100644 src/crafting/json/PotionContainerChangeRecipeData.php create mode 100644 src/crafting/json/PotionTypeRecipeData.php create mode 100644 src/crafting/json/RecipeIngredientData.php create mode 100644 src/crafting/json/ShapedRecipeData.php create mode 100644 src/crafting/json/ShapelessRecipeData.php diff --git a/composer.lock b/composer.lock index fb0e297d24..d946ebef06 100644 --- a/composer.lock +++ b/composer.lock @@ -280,12 +280,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "a546e15f6a8d7498fb25d5a02ce16184a429bb78" + "reference": "01948a627448395d9946c2e6a5e8332a8456eaa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/a546e15f6a8d7498fb25d5a02ce16184a429bb78", - "reference": "a546e15f6a8d7498fb25d5a02ce16184a429bb78", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/01948a627448395d9946c2e6a5e8332a8456eaa0", + "reference": "01948a627448395d9946c2e6a5e8332a8456eaa0", "shasum": "" }, "type": "library", @@ -298,7 +298,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-07-02T15:28:28+00:00" + "time": "2022-07-04T16:59:39+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", diff --git a/src/Server.php b/src/Server.php index 3128a7c396..66bcc1c663 100644 --- a/src/Server.php +++ b/src/Server.php @@ -963,7 +963,7 @@ class Server{ $this->commandMap = new SimpleCommandMap($this); - $this->craftingManager = CraftingManagerFromDataHelper::make(Path::join(\pocketmine\BEDROCK_DATA_PATH, "recipes.json")); + $this->craftingManager = CraftingManagerFromDataHelper::make(Path::join(\pocketmine\BEDROCK_DATA_PATH, "recipes")); $this->resourceManager = new ResourcePackManager(Path::join($this->getDataPath(), "resource_packs"), $this->logger); diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 777776f1fe..42e0db705f 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -264,13 +264,13 @@ class CraftingManager{ } foreach($this->potionContainerChangeRecipes as $recipe){ - if($recipe->getIngredient()->equals($ingredient) && $recipe->getResultFor($input) !== null){ + if($recipe->getIngredient()->accepts($ingredient) && $recipe->getResultFor($input) !== null){ return $this->brewingRecipeCache[$inputHash][$ingredientHash] = $recipe; } } foreach($this->potionTypeRecipes as $recipe){ - if($recipe->getIngredient()->equals($ingredient) && $recipe->getResultFor($input) !== null){ + if($recipe->getIngredient()->accepts($ingredient) && $recipe->getResultFor($input) !== null){ return $this->brewingRecipeCache[$inputHash][$ingredientHash] = $recipe; } } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index cb639209a0..9767bb5ff0 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -23,61 +23,205 @@ declare(strict_types=1); namespace pocketmine\crafting; +use pocketmine\crafting\json\FurnaceRecipeData; +use pocketmine\crafting\json\ItemStackData; +use pocketmine\crafting\json\PotionContainerChangeRecipeData; +use pocketmine\crafting\json\PotionTypeRecipeData; +use pocketmine\crafting\json\RecipeIngredientData; +use pocketmine\crafting\json\ShapedRecipeData; +use pocketmine\crafting\json\ShapelessRecipeData; +use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; -use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; +use pocketmine\data\bedrock\item\SavedItemData; +use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; +use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\item\Item; +use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; -use function array_map; +use Webmozart\PathUtil\Path; +use function base64_decode; use function file_get_contents; +use function get_debug_type; use function is_array; -use function is_int; +use function is_object; use function json_decode; final class CraftingManagerFromDataHelper{ - /** - * @param mixed[] $data - */ - private static function deserializeIngredient(array $data) : ?RecipeIngredient{ - if(!isset($data["id"]) || !is_int($data["id"])){ - throw new \InvalidArgumentException("Invalid input data, expected int ID"); - } - if(isset($data["damage"]) && $data["damage"] === -1){ - try{ - $typeData = GlobalItemDataHandlers::getUpgrader()->upgradeItemTypeDataInt($data["id"], 0, 1, null); - }catch(ItemTypeDeserializeException){ - //probably unknown item - return null; + + private static function deserializeItemStackFromNameMeta(string $name, int $meta) : ?Item{ + $blockName = BlockItemIdMap::getInstance()->lookupBlockId($name); + if($blockName !== null){ + $blockStateDictionary = RuntimeBlockMapping::getInstance()->getBlockStateDictionary(); + $blockRuntimeId = $blockStateDictionary->lookupStateIdFromIdMeta($name, $meta === RecipeIngredientData::WILDCARD_META_VALUE ? 0 : $meta); + if($blockRuntimeId === null){ + throw new \InvalidArgumentException("$blockName with meta $meta doesn't map to any known blockstate"); } - - return new MetaWildcardRecipeIngredient($typeData->getTypeData()->getName()); + $blockStateData = $blockStateDictionary->getDataFromStateId($blockRuntimeId); + if($blockStateData === null){ + throw new AssumptionFailedError("We just looked up the runtime ID for this state, so it can't possibly be null"); + } + }else{ + $blockStateData = null; } - //TODO: we need to stop using jsonDeserialize for this + //TODO: for wildcards, we only need a way to check if the item serializer recognizes the ID; we don't need to + //deserialize the whole itemstack, which might give bogus results anyway if meta 0 isn't recognized + $itemTypeData = new SavedItemData( + $name, + $meta === RecipeIngredientData::WILDCARD_META_VALUE ? 0 : $meta, + $blockStateData, + null + ); + try{ - $item = Item::legacyJsonDeserialize($data); - }catch(SavedDataLoadingException){ - //unknown item + return GlobalItemDataHandlers::getDeserializer()->deserializeType($itemTypeData); + }catch(ItemTypeDeserializeException){ + //probably unknown item return null; } - - return new ExactRecipeIngredient($item); } - public static function make(string $filePath) : CraftingManager{ - $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file"), true); - if(!is_array($recipes)){ - throw new AssumptionFailedError("recipes.json root should contain a map of recipe types"); + private static function deserializeIngredient(RecipeIngredientData $data) : ?RecipeIngredient{ + if(isset($data->count) && $data->count !== 1){ + //every case we've seen so far where this isn't the case, it's been a bug and the count was ignored anyway + //e.g. gold blocks crafted from 9 ingots, but each input item individually had a count of 9 + throw new SavedDataLoadingException("Recipe inputs should have a count of exactly 1"); } + + $itemStack = self::deserializeItemStackFromNameMeta($data->name, $data->meta); + if($itemStack === null){ + //probably unknown item + return null; + } + return $data->meta === RecipeIngredientData::WILDCARD_META_VALUE ? + new MetaWildcardRecipeIngredient($data->name) : + new ExactRecipeIngredient($itemStack); + } + + public static function deserializeItemStack(ItemStackData $data) : ?Item{ + //count, name, block_name, block_states, meta, nbt, can_place_on, can_destroy + $name = $data->name; + $meta = $data->meta ?? 0; + $count = $data->count ?? 1; + + $blockStatesRaw = $data->block_states ?? null; + $nbtRaw = $data->nbt ?? null; + $canPlaceOn = $data->can_place_on ?? []; + $canDestroy = $data->can_destroy ?? []; + + $blockName = BlockItemIdMap::getInstance()->lookupBlockId($name); + if($blockName !== null){ + if($meta !== 0){ + throw new \InvalidArgumentException("Meta should not be specified for blockitems"); + } + $blockStatesTag = $blockStatesRaw === null ? + CompoundTag::create() : + (new LittleEndianNbtSerializer()) + ->read(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => base64_decode($blockStatesRaw, true))) + ->mustGetCompoundTag(); + $blockStateData = new BlockStateData($blockName, $blockStatesTag, BlockStateData::CURRENT_VERSION); + }else{ + $blockStateData = null; + } + + $nbt = $nbtRaw === null ? null : (new LittleEndianNbtSerializer()) + ->read(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => base64_decode($nbtRaw, true))) + ->mustGetCompoundTag(); + + $itemStackData = new SavedItemStackData( + new SavedItemData( + $name, + $meta, + $blockStateData, + $nbt + ), + $count, + null, + null, + $canPlaceOn, + $canDestroy, + ); + + try{ + return GlobalItemDataHandlers::getDeserializer()->deserializeStack($itemStackData); + }catch(ItemTypeDeserializeException){ + //probably unknown item + return null; + } + } + + /** + * @return mixed[] + * + * @phpstan-template TData of object + * @phpstan-param class-string $modelCLass + * @phpstan-return list + */ + public static function loadJsonArrayOfObjectsFile(string $filePath, string $modelCLass) : array{ + $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file")); + if(!is_array($recipes)){ + throw new AssumptionFailedError("$filePath root should be an array, got " . get_debug_type($recipes)); + } + + $mapper = new \JsonMapper(); + $mapper->bStrictObjectTypeChecking = true; + $mapper->bExceptionOnUndefinedProperty = true; + $mapper->bExceptionOnMissingData = true; + + return self::loadJsonObjectListIntoModel($mapper, $modelCLass, $recipes); + } + + /** + * @phpstan-template TRecipeData of object + * @phpstan-param class-string $modelClass + * @phpstan-return TRecipeData + */ + private static function loadJsonObjectIntoModel(\JsonMapper $mapper, string $modelClass, object $data) : object{ + //JsonMapper does this for subtypes, but not for the base type :( + try{ + return $mapper->map($data, (new \ReflectionClass($modelClass))->newInstanceWithoutConstructor()); + }catch(\JsonMapper_Exception $e){ + throw new SavedDataLoadingException($e->getMessage(), 0, $e); + } + } + + /** + * @param mixed[] $data + * @return object[] + * + * @phpstan-template TRecipeData of object + * @phpstan-param class-string $modelClass + * @phpstan-return list + */ + private static function loadJsonObjectListIntoModel(\JsonMapper $mapper, string $modelClass, array $data) : array{ + $result = []; + foreach($data as $i => $item){ + if(!is_object($item)){ + throw new SavedDataLoadingException("Invalid entry at index $i: expected object, got " . get_debug_type($item)); + } + try{ + $result[] = self::loadJsonObjectIntoModel($mapper, $modelClass, $item); + }catch(SavedDataLoadingException $e){ + throw new SavedDataLoadingException("Invalid entry at index $i: " . $e->getMessage(), 0, $e); + } + } + return $result; + } + + public static function make(string $directoryPath) : CraftingManager{ $result = new CraftingManager(); $ingredientDeserializerFunc = \Closure::fromCallable([self::class, "deserializeIngredient"]); - $itemDeserializerFunc = \Closure::fromCallable([Item::class, 'legacyJsonDeserialize']); + $itemDeserializerFunc = \Closure::fromCallable([self::class, 'deserializeItemStack']); - foreach($recipes["shapeless"] as $recipe){ - $recipeType = match($recipe["block"]){ + foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'shapeless_crafting.json'), ShapelessRecipeData::class) as $recipe){ + $recipeType = match($recipe->block){ "crafting_table" => ShapelessRecipeType::CRAFTING(), "stonecutter" => ShapelessRecipeType::STONECUTTER(), //TODO: Cartography Table @@ -87,18 +231,20 @@ final class CraftingManagerFromDataHelper{ continue; } $inputs = []; - foreach($recipe["input"] as $inputData){ + foreach($recipe->input as $inputData){ $input = $ingredientDeserializerFunc($inputData); if($input === null){ //unknown input item continue 2; } $inputs[] = $input; } - try{ - $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - }catch(SavedDataLoadingException){ - //unknown output item - continue; + $outputs = []; + foreach($recipe->output as $outputData){ + $output = $itemDeserializerFunc($outputData); + if($output === null){ //unknown output item + continue 2; + } + $outputs[] = $output; } $result->registerShapelessRecipe(new ShapelessRecipe( $inputs, @@ -106,32 +252,34 @@ final class CraftingManagerFromDataHelper{ $recipeType )); } - foreach($recipes["shaped"] as $recipe){ - if($recipe["block"] !== "crafting_table"){ //TODO: filter others out for now to avoid breaking economics + foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'shaped_crafting.json'), ShapedRecipeData::class) as $recipe){ + if($recipe->block !== "crafting_table"){ //TODO: filter others out for now to avoid breaking economics continue; } $inputs = []; - foreach($recipe["input"] as $symbol => $inputData){ + foreach(Utils::stringifyKeys($recipe->input) as $symbol => $inputData){ $input = $ingredientDeserializerFunc($inputData); if($input === null){ //unknown input item continue 2; } $inputs[$symbol] = $input; } - try{ - $outputs = array_map($itemDeserializerFunc, $recipe["output"]); - }catch(SavedDataLoadingException){ - //unknown output item - continue; + $outputs = []; + foreach($recipe->output as $outputData){ + $output = $itemDeserializerFunc($outputData); + if($output === null){ //unknown output item + continue 2; + } + $outputs[] = $output; } $result->registerShapedRecipe(new ShapedRecipe( - $recipe["shape"], + $recipe->shape, $inputs, $outputs )); } - foreach($recipes["smelting"] as $recipe){ - $furnaceType = match ($recipe["block"]){ + foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'smelting.json'), FurnaceRecipeData::class) as $recipe){ + $furnaceType = match ($recipe->block){ "furnace" => FurnaceType::FURNACE(), "blast_furnace" => FurnaceType::BLAST_FURNACE(), "smoker" => FurnaceType::SMOKER(), @@ -141,12 +289,11 @@ final class CraftingManagerFromDataHelper{ if($furnaceType === null){ continue; } - try{ - $output = Item::legacyJsonDeserialize($recipe["output"]); - }catch(SavedDataLoadingException){ + $output = self::deserializeItemStack($recipe->output); + if($output === null){ continue; } - $input = self::deserializeIngredient($recipe["input"]); + $input = self::deserializeIngredient($recipe->input); if($input === null){ continue; } @@ -155,13 +302,12 @@ final class CraftingManagerFromDataHelper{ $input )); } - foreach($recipes["potion_type"] as $recipe){ - try{ - $input = Item::legacyJsonDeserialize($recipe["input"]); - $ingredient = Item::legacyJsonDeserialize($recipe["ingredient"]); - $output = Item::legacyJsonDeserialize($recipe["output"]); - }catch(SavedDataLoadingException){ - //unknown item + + foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'potion_type.json'), PotionTypeRecipeData::class) as $recipe){ + $input = self::deserializeIngredient($recipe->input); + $ingredient = self::deserializeIngredient($recipe->ingredient); + $output = self::deserializeItemStack($recipe->output); + if($input === null || $ingredient === null || $output === null){ continue; } $result->registerPotionTypeRecipe(new PotionTypeRecipe( @@ -170,18 +316,16 @@ final class CraftingManagerFromDataHelper{ $output )); } - foreach($recipes["potion_container_change"] as $recipe){ - try{ - $ingredient = Item::legacyJsonDeserialize($recipe["ingredient"]); - }catch(SavedDataLoadingException){ - //unknown item + foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'potion_container_change.json'), PotionContainerChangeRecipeData::class) as $recipe){ + $ingredient = self::deserializeIngredient($recipe->ingredient); + if($ingredient === null){ continue; } - //TODO: we'll be able to get rid of these conversions once the crafting data is updated - $inputId = LegacyItemIdToStringIdMap::getInstance()->legacyToString($recipe["input_item_id"]); - $outputId = LegacyItemIdToStringIdMap::getInstance()->legacyToString($recipe["output_item_id"]); - if($inputId === null || $outputId === null){ + $inputId = $recipe->input_item_name; + $outputId = $recipe->output_item_name; + + if(self::deserializeItemStackFromNameMeta($inputId, 0) === null || self::deserializeItemStackFromNameMeta($outputId, 0) === null){ //unknown item continue; } diff --git a/src/crafting/PotionContainerChangeRecipe.php b/src/crafting/PotionContainerChangeRecipe.php index d358c28e23..3530aee68a 100644 --- a/src/crafting/PotionContainerChangeRecipe.php +++ b/src/crafting/PotionContainerChangeRecipe.php @@ -31,18 +31,16 @@ class PotionContainerChangeRecipe implements BrewingRecipe{ public function __construct( private string $inputItemId, - private Item $ingredient, + private RecipeIngredient $ingredient, private string $outputItemId - ){ - $this->ingredient = clone $ingredient; - } + ){} public function getInputItemId() : string{ return $this->inputItemId; } - public function getIngredient() : Item{ - return clone $this->ingredient; + public function getIngredient() : RecipeIngredient{ + return $this->ingredient; } public function getOutputItemId() : string{ diff --git a/src/crafting/PotionTypeRecipe.php b/src/crafting/PotionTypeRecipe.php index 4d450450ef..1d0b1b580f 100644 --- a/src/crafting/PotionTypeRecipe.php +++ b/src/crafting/PotionTypeRecipe.php @@ -28,21 +28,19 @@ use pocketmine\item\Item; class PotionTypeRecipe implements BrewingRecipe{ public function __construct( - private Item $input, - private Item $ingredient, + private RecipeIngredient $input, + private RecipeIngredient $ingredient, private Item $output ){ - $this->input = clone $input; - $this->ingredient = clone $ingredient; $this->output = clone $output; } - public function getInput() : Item{ - return clone $this->input; + public function getInput() : RecipeIngredient{ + return $this->input; } - public function getIngredient() : Item{ - return clone $this->ingredient; + public function getIngredient() : RecipeIngredient{ + return $this->ingredient; } public function getOutput() : Item{ @@ -50,6 +48,6 @@ class PotionTypeRecipe implements BrewingRecipe{ } public function getResultFor(Item $input) : ?Item{ - return $input->equals($this->input, true, false) ? $this->getOutput() : null; + return $this->input->accepts($input) ? $this->getOutput() : null; } } diff --git a/src/crafting/json/FurnaceRecipeData.php b/src/crafting/json/FurnaceRecipeData.php new file mode 100644 index 0000000000..c5513030bc --- /dev/null +++ b/src/crafting/json/FurnaceRecipeData.php @@ -0,0 +1,42 @@ +input = $input; + $this->output = $output; + $this->block = $block; + } +} diff --git a/src/crafting/json/ItemStackData.php b/src/crafting/json/ItemStackData.php new file mode 100644 index 0000000000..032c7da7d2 --- /dev/null +++ b/src/crafting/json/ItemStackData.php @@ -0,0 +1,43 @@ +name = $name; + } +} diff --git a/src/crafting/json/PotionContainerChangeRecipeData.php b/src/crafting/json/PotionContainerChangeRecipeData.php new file mode 100644 index 0000000000..4664a0ae9a --- /dev/null +++ b/src/crafting/json/PotionContainerChangeRecipeData.php @@ -0,0 +1,41 @@ +input_item_name = $input_item_name; + $this->ingredient = $ingredient; + $this->output_item_name = $output_item_name; + } +} diff --git a/src/crafting/json/PotionTypeRecipeData.php b/src/crafting/json/PotionTypeRecipeData.php new file mode 100644 index 0000000000..d500058936 --- /dev/null +++ b/src/crafting/json/PotionTypeRecipeData.php @@ -0,0 +1,41 @@ +input = $input; + $this->ingredient = $ingredient; + $this->output = $output; + } +} diff --git a/src/crafting/json/RecipeIngredientData.php b/src/crafting/json/RecipeIngredientData.php new file mode 100644 index 0000000000..ece2a6f627 --- /dev/null +++ b/src/crafting/json/RecipeIngredientData.php @@ -0,0 +1,40 @@ +name = $name; + $this->meta = $meta; + } +} diff --git a/src/crafting/json/ShapedRecipeData.php b/src/crafting/json/ShapedRecipeData.php new file mode 100644 index 0000000000..abf37098e2 --- /dev/null +++ b/src/crafting/json/ShapedRecipeData.php @@ -0,0 +1,72 @@ + + */ + public array $shape; + + /** + * @required + * @var RecipeIngredientData[] + * @phpstan-var array + */ + public array $input; + + /** + * @required + * @var ItemStackData[] + * @phpstan-var list + */ + public array $output; + + /** @required */ + public string $block; + + /** @required */ + public int $priority; + + /** + * TODO: convert this to use promoted properties - avoiding them for now since it would break JsonMapper + * + * @param string[] $shape + * @param RecipeIngredientData[] $input + * @param ItemStackData[] $output + * + * @phpstan-param list $shape + * @phpstan-param array $input + * @phpstan-param list $output + */ + public function __construct(array $shape, array $input, array $output, string $block, int $priority){ + $this->block = $block; + $this->priority = $priority; + $this->shape = $shape; + $this->input = $input; + $this->output = $output; + } +} diff --git a/src/crafting/json/ShapelessRecipeData.php b/src/crafting/json/ShapelessRecipeData.php new file mode 100644 index 0000000000..453b349dd9 --- /dev/null +++ b/src/crafting/json/ShapelessRecipeData.php @@ -0,0 +1,61 @@ + + */ + public array $input; + + /** + * @required + * @var ItemStackData[] + * @phpstan-var list + */ + public array $output; + + /** @required */ + public string $block; + + /** @required */ + public int $priority; + + /** + * @param RecipeIngredientData[] $input + * @param ItemStackData[] $output + * + * @phpstan-param list $input + * @phpstan-param list $output + */ + public function __construct(array $input, array $output, string $block, int $priority){ + $this->block = $block; + $this->priority = $priority; + $this->input = $input; + $this->output = $output; + } +} diff --git a/src/data/bedrock/item/BlockItemIdMap.php b/src/data/bedrock/item/BlockItemIdMap.php index 5d1376aef6..89ae14f786 100644 --- a/src/data/bedrock/item/BlockItemIdMap.php +++ b/src/data/bedrock/item/BlockItemIdMap.php @@ -27,7 +27,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; -use function array_search; +use function array_flip; use function file_get_contents; use function is_array; use function json_decode; @@ -52,20 +52,25 @@ final class BlockItemIdMap{ return new self($map); } + /** + * @var string[] + * @phpstan-var array + */ + private array $itemToBlockId; + /** * @param string[] $blockToItemId * @phpstan-param array $blockToItemId */ - public function __construct(private array $blockToItemId){} + public function __construct(private array $blockToItemId){ + $this->itemToBlockId = array_flip($this->blockToItemId); + } public function lookupItemId(string $blockId) : ?string{ return $this->blockToItemId[$blockId] ?? null; } public function lookupBlockId(string $itemId) : ?string{ - //we don't need this for any functionality, so we're not concerned about performance here - //however, it might be nice to have for debugging - $blockId = array_search($itemId, $this->blockToItemId, true); - return $blockId !== false ? $blockId : null; + return $this->itemToBlockId[$itemId] ?? null; } } diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 9c405b92cd..5dd293b4cd 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\inventory; -use pocketmine\data\SavedDataLoadingException; +use pocketmine\crafting\CraftingManagerFromDataHelper; +use pocketmine\crafting\json\ItemStackData; use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; -use function file_get_contents; -use function is_array; -use function json_decode; final class CreativeInventory{ use SingletonTrait; @@ -38,18 +36,13 @@ final class CreativeInventory{ private array $creative = []; private function __construct(){ - $creativeItems = json_decode(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json")), true); - if(!is_array($creativeItems)){ - throw new SavedDataLoadingException("Invalid creative items file, expected array as root type"); - } - + $creativeItems = CraftingManagerFromDataHelper::loadJsonArrayOfObjectsFile( + Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json"), + ItemStackData::class + ); foreach($creativeItems as $data){ - if(!is_array($data)){ - throw new SavedDataLoadingException("Invalid creative items file, expected array as item type"); - } - try{ - $item = Item::legacyJsonDeserialize($data); - }catch(SavedDataLoadingException){ + $item = CraftingManagerFromDataHelper::deserializeItemStack($data); + if($item === null){ //unknown item continue; } diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 6d86b85556..84ff5e7399 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -149,8 +149,8 @@ final class CraftingDataCache{ $potionTypeRecipes = []; foreach($manager->getPotionTypeRecipes() as $recipe){ - $input = $converter->coreItemStackToNet($recipe->getInput()); - $ingredient = $converter->coreItemStackToNet($recipe->getIngredient()); + $input = $converter->coreRecipeIngredientToNet($recipe->getInput()); + $ingredient = $converter->coreRecipeIngredientToNet($recipe->getIngredient()); $output = $converter->coreItemStackToNet($recipe->getOutput()); $potionTypeRecipes[] = new ProtocolPotionTypeRecipe( $input->getId(), @@ -166,7 +166,7 @@ final class CraftingDataCache{ $itemTypeDictionary = GlobalItemTypeDictionary::getInstance()->getDictionary(); foreach($manager->getPotionContainerChangeRecipes() as $recipe){ $input = $itemTypeDictionary->fromStringId($recipe->getInputItemId()); - $ingredient = $converter->coreItemStackToNet($recipe->getIngredient()); + $ingredient = $converter->coreRecipeIngredientToNet($recipe->getIngredient()); $output = $itemTypeDictionary->fromStringId($recipe->getOutputItemId()); $potionContainerChangeRecipes[] = new ProtocolPotionContainerChangeRecipe( $input, diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 2ec7031d0d..8a98fd4a04 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -575,21 +575,6 @@ parameters: count: 1 path: ../../../src/entity/projectile/Projectile.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: ../../../src/inventory/CreativeInventory.php - - - - message: "#^Parameter \\#1 \\$data of static method pocketmine\\\\item\\\\Item\\:\\:jsonDeserialize\\(\\) expects array, mixed given\\.$#" - count: 1 - path: ../../../src/inventory/CreativeInventory.php - - - - message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" - count: 1 - path: ../../../src/inventory/CreativeInventory.php - - message: "#^Parameter \\#2 \\$recipe of class pocketmine\\\\event\\\\inventory\\\\CraftItemEvent constructor expects pocketmine\\\\crafting\\\\CraftingRecipe, pocketmine\\\\crafting\\\\CraftingRecipe\\|null given\\.$#" count: 1 From 56cf59355f5a296be598a966b343473f25c2cce5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 21:38:18 +0100 Subject: [PATCH 0257/1858] Use more consistent exceptions --- src/crafting/CraftingManagerFromDataHelper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 9767bb5ff0..db7afe52ed 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -60,7 +60,7 @@ final class CraftingManagerFromDataHelper{ $blockStateDictionary = RuntimeBlockMapping::getInstance()->getBlockStateDictionary(); $blockRuntimeId = $blockStateDictionary->lookupStateIdFromIdMeta($name, $meta === RecipeIngredientData::WILDCARD_META_VALUE ? 0 : $meta); if($blockRuntimeId === null){ - throw new \InvalidArgumentException("$blockName with meta $meta doesn't map to any known blockstate"); + throw new SavedDataLoadingException("$blockName with meta $meta doesn't map to any known blockstate"); } $blockStateData = $blockStateDictionary->getDataFromStateId($blockRuntimeId); if($blockStateData === null){ @@ -118,7 +118,7 @@ final class CraftingManagerFromDataHelper{ $blockName = BlockItemIdMap::getInstance()->lookupBlockId($name); if($blockName !== null){ if($meta !== 0){ - throw new \InvalidArgumentException("Meta should not be specified for blockitems"); + throw new SavedDataLoadingException("Meta should not be specified for blockitems"); } $blockStatesTag = $blockStatesRaw === null ? CompoundTag::create() : @@ -166,7 +166,7 @@ final class CraftingManagerFromDataHelper{ public static function loadJsonArrayOfObjectsFile(string $filePath, string $modelCLass) : array{ $recipes = json_decode(Utils::assumeNotFalse(file_get_contents($filePath), "Missing required resource file")); if(!is_array($recipes)){ - throw new AssumptionFailedError("$filePath root should be an array, got " . get_debug_type($recipes)); + throw new SavedDataLoadingException("$filePath root should be an array, got " . get_debug_type($recipes)); } $mapper = new \JsonMapper(); From 4909c0f2574753e020e393617dd9345f22bc5bc6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 22:15:50 +0100 Subject: [PATCH 0258/1858] Fixed schema loading when the file path contains at least 4 numbers in a row this spectactularly stupid bug could also have been addressed using a [^\/] in place of the . in the pattern, but I thought it made sense to make it impossible for this to happen again by making sure the regex only sees the file name. fixes #5129 --- .../bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php | 7 ++++--- .../bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 525c1c3bf1..e6fe5c8dca 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -259,10 +259,11 @@ final class BlockStateUpgradeSchemaUtils{ $iterator = new \RegexIterator( new \FilesystemIterator( $path, - \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS + \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::SKIP_DOTS ), - '/\/(\d{4}).*\.json$/', - \RegexIterator::GET_MATCH + '/^(\d{4}).*\.json$/', + \RegexIterator::GET_MATCH, + \RegexIterator::USE_KEY ); $result = []; diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php index 9e95bf4a2b..441ca02eed 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -42,10 +42,11 @@ final class ItemIdMetaUpgradeSchemaUtils{ $iterator = new \RegexIterator( new \FilesystemIterator( $path, - \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS + \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::SKIP_DOTS ), - '/\/(\d{4}).*\.json$/', - \RegexIterator::GET_MATCH + '/^(\d{4}).*\.json$/', + \RegexIterator::GET_MATCH, + \RegexIterator::USE_KEY ); $result = []; From d9544b5d0e958b019864f6b51f577aa9c499b409 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Jul 2022 22:31:59 +0100 Subject: [PATCH 0259/1858] Added soul fire --- src/block/BaseFire.php | 61 +++++++++++++++++++ src/block/BlockFactory.php | 2 + src/block/BlockTypeIds.php | 3 + src/block/Fire.php | 44 ++----------- src/block/SoulFire.php | 45 ++++++++++++++ src/block/VanillaBlocks.php | 2 + .../BlockObjectToBlockStateSerializer.php | 4 ++ .../BlockStateToBlockObjectDeserializer.php | 4 ++ src/player/Player.php | 2 +- .../block_factory_consistency_check.json | 2 +- 10 files changed, 128 insertions(+), 41 deletions(-) create mode 100644 src/block/BaseFire.php create mode 100644 src/block/SoulFire.php diff --git a/src/block/BaseFire.php b/src/block/BaseFire.php new file mode 100644 index 0000000000..f60b7677d0 --- /dev/null +++ b/src/block/BaseFire.php @@ -0,0 +1,61 @@ +attack($ev); + + $ev = new EntityCombustByBlockEvent($this, $entity, 8); + if($entity instanceof Arrow){ + $ev->cancel(); + } + $ev->call(); + if(!$ev->isCancelled()){ + $entity->setOnFire($ev->getDuration()); + } + return true; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } +} diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 5ee4c0be85..7dd853c219 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -744,6 +744,8 @@ class BlockFactory{ $this->register(new Stair(new BID(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); $this->register(new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); + + $this->register(new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); } private function registerBlocksR17() : void{ diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index deca05b424..4a18229443 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -614,6 +614,9 @@ final class BlockTypeIds{ public const CHISELED_NETHER_BRICKS = 10587; public const CRACKED_NETHER_BRICKS = 10588; + public const SOUL_SOIL = 10592; + public const SOUL_FIRE = 10593; + public const MANGROVE_PLANKS = 10595; public const CRIMSON_PLANKS = 10596; public const WARPED_PLANKS = 10597; diff --git a/src/block/Fire.php b/src/block/Fire.php index 8805c5653a..c04926cc80 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -25,14 +25,8 @@ namespace pocketmine\block; use pocketmine\data\runtime\block\BlockDataReader; use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\entity\Entity; -use pocketmine\entity\projectile\Arrow; use pocketmine\event\block\BlockBurnEvent; use pocketmine\event\block\BlockSpreadEvent; -use pocketmine\event\entity\EntityCombustByBlockEvent; -use pocketmine\event\entity\EntityDamageByBlockEvent; -use pocketmine\event\entity\EntityDamageEvent; -use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\world\format\Chunk; use pocketmine\world\World; @@ -41,7 +35,7 @@ use function max; use function min; use function mt_rand; -class Fire extends Flowable{ +class Fire extends BaseFire{ public const MAX_AGE = 15; protected int $age = 0; @@ -67,39 +61,11 @@ class Fire extends Flowable{ return $this; } - public function hasEntityCollision() : bool{ - return true; - } - - public function getLightLevel() : int{ - return 15; - } - - public function canBeReplaced() : bool{ - return true; - } - - public function onEntityInside(Entity $entity) : bool{ - $ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_FIRE, 1); - $entity->attack($ev); - - $ev = new EntityCombustByBlockEvent($this, $entity, 8); - if($entity instanceof Arrow){ - $ev->cancel(); - } - $ev->call(); - if(!$ev->isCancelled()){ - $entity->setOnFire($ev->getDuration()); - } - return true; - } - - public function getDropsForCompatibleTool(Item $item) : array{ - return []; - } - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->isTransparent() && !$this->hasAdjacentFlammableBlocks()){ + $down = $this->getSide(Facing::DOWN); + if(SoulFire::canBeSupportedBy($down)){ + $this->position->getWorld()->setBlock($this->position, VanillaBlocks::SOUL_FIRE()); + }elseif($down->isTransparent() && !$this->hasAdjacentFlammableBlocks()){ $this->position->getWorld()->setBlock($this->position, VanillaBlocks::AIR()); }else{ $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(30, 40)); diff --git a/src/block/SoulFire.php b/src/block/SoulFire.php new file mode 100644 index 0000000000..61d7b37ed9 --- /dev/null +++ b/src/block/SoulFire.php @@ -0,0 +1,45 @@ +getTypeId(); + return $id === BlockTypeIds::SOUL_SAND || $id === BlockTypeIds::SOUL_SOIL; + } + + public function onNearbyBlockChange() : void{ + if(!self::canBeSupportedBy($this->getSide(Facing::DOWN))){ + $this->position->getWorld()->setBlock($this->position, VanillaBlocks::AIR()); + } + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index ae1852c0d9..d99d702b13 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -564,6 +564,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab SMOOTH_STONE_SLAB() * @method static Snow SNOW() * @method static SnowLayer SNOW_LAYER() + * @method static SoulFire SOUL_FIRE() * @method static SoulSand SOUL_SAND() * @method static Sponge SPONGE() * @method static WoodenButton SPRUCE_BUTTON() @@ -1182,6 +1183,7 @@ final class VanillaBlocks{ 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_fire", $factory->get(Ids::SOUL_FIRE, 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)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index ec5942cda6..93daadec27 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1070,6 +1070,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::COVERED_BIT, false) ->writeInt(StateNames::HEIGHT, $block->getLayers() - 1); }); + $this->map(Blocks::SOUL_FIRE(), function() : Writer{ + return Writer::create(Ids::SOUL_FIRE) + ->writeInt(StateNames::AGE, 0); //useless for soul fire, we don't track it + }); $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); $this->map(Blocks::SPONGE(), function(Sponge $block) : Writer{ return Writer::create(Ids::SPONGE) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 1dbdf8a32d..74e483fb7b 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -992,6 +992,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $in->ignored(StateNames::COVERED_BIT); //seems to be useless return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); }); + $this->map(Ids::SOUL_FIRE, function(Reader $in) : Block{ + $in->ignored(StateNames::AGE); //this is useless for soul fire, since it doesn't have the logic associated + return Blocks::SOUL_FIRE(); + }); $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); $this->map(Ids::SPONGE, function(Reader $in) : Block{ return Blocks::SPONGE()->setWet(match($type = $in->readString(StateNames::SPONGE_TYPE)){ diff --git a/src/player/Player.php b/src/player/Player.php index 2cf6a7db8a..f2b8f14868 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1613,7 +1613,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } $block = $target->getSide($face); - if($block->getTypeId() === BlockTypeIds::FIRE){ + if($block->getTypeId() === BlockTypeIds::FIRE || $block->getTypeId() === BlockTypeIds::SOUL_FIRE){ $this->getWorld()->setBlock($block->getPosition(), VanillaBlocks::AIR()); $this->getWorld()->addSound($block->getPosition()->add(0.5, 0.5, 0.5), new FireExtinguishSound()); return true; diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index c906ca37ed..ed0a668cbd 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5423616":"Soul Fire","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From bd773c2f84770c5bd6f2569798dcad98bc900785 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 13:40:07 +0100 Subject: [PATCH 0260/1858] VanillaBlocks: use BlockFactory::fromTypeId() --- src/block/BlockFactory.php | 9 +- src/block/VanillaBlocks.php | 1190 +++++++++++++++++------------------ src/item/ItemBlock.php | 5 +- 3 files changed, 602 insertions(+), 602 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 7dd853c219..5c6928920d 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -882,12 +882,12 @@ class BlockFactory{ * @internal * Returns the default state of the block type associated with the given type ID. */ - public function fromTypeId(int $typeId) : ?Block{ + public function fromTypeId(int $typeId) : Block{ if(isset($this->typeIndex[$typeId])){ return clone $this->typeIndex[$typeId]; } - return null; + throw new \InvalidArgumentException("Block ID $typeId is not registered"); } public function fromFullBlock(int $fullState) : Block{ @@ -897,9 +897,8 @@ class BlockFactory{ /** * Returns whether a specified block state is already registered in the block factory. */ - public function isRegistered(int $typeId, int $stateData = 0) : bool{ - $index = ($typeId << Block::INTERNAL_STATE_DATA_BITS) | $stateData; - $b = $this->fullList[$index] ?? null; + public function isRegistered(int $typeId) : bool{ + $b = $this->typeIndex[$typeId] ?? null; return $b !== null && !($b instanceof UnknownBlock); } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index d99d702b13..a851ccc397 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -651,600 +651,600 @@ 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, 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::ACACIA_LEAVES, 0)); - self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 4)); - 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::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, 0)); - self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 0)); - self::register("acacia_wall_sign", $factory->get(Ids::ACACIA_WALL_SIGN, 0)); - self::register("acacia_wood", $factory->get(Ids::ACACIA_WOOD, 4)); - 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::ALL_SIDED_MUSHROOM_STEM, 0)); - self::register("allium", $factory->get(Ids::ALLIUM, 0)); - self::register("amethyst", $factory->get(Ids::AMETHYST, 0)); - self::register("ancient_debris", $factory->get(Ids::ANCIENT_DEBRIS, 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, 0)); - 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::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::BANNER, 0)); - self::register("barrel", $factory->get(Ids::BARREL, 0)); - self::register("barrier", $factory->get(Ids::BARRIER, 0)); - self::register("basalt", $factory->get(Ids::BASALT, 2)); - self::register("beacon", $factory->get(Ids::BEACON, 0)); - self::register("bed", $factory->get(Ids::BED, 13)); - self::register("bedrock", $factory->get(Ids::BEDROCK, 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, 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::BIRCH_LEAVES, 0)); - self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 4)); - 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::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, 0)); - self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); - self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 0)); - self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 4)); - self::register("blackstone", $factory->get(Ids::BLACKSTONE, 0)); - self::register("blackstone_slab", $factory->get(Ids::BLACKSTONE_SLAB, 0)); - self::register("blackstone_stairs", $factory->get(Ids::BLACKSTONE_STAIRS, 0)); - self::register("blackstone_wall", $factory->get(Ids::BLACKSTONE_WALL, 0)); - self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 0)); - self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0)); - 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, 2)); - self::register("bookshelf", $factory->get(Ids::BOOKSHELF, 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, 0)); - self::register("brick_wall", $factory->get(Ids::BRICK_WALL, 0)); - self::register("bricks", $factory->get(Ids::BRICKS, 0)); - self::register("brown_mushroom", $factory->get(Ids::BROWN_MUSHROOM, 0)); - self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10)); - self::register("cactus", $factory->get(Ids::CACTUS, 0)); - self::register("cake", $factory->get(Ids::CAKE, 0)); - self::register("calcite", $factory->get(Ids::CALCITE, 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, 0)); - self::register("chiseled_deepslate", $factory->get(Ids::CHISELED_DEEPSLATE, 0)); - self::register("chiseled_nether_bricks", $factory->get(Ids::CHISELED_NETHER_BRICKS, 0)); - self::register("chiseled_polished_blackstone", $factory->get(Ids::CHISELED_POLISHED_BLACKSTONE, 0)); - self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 2)); - 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("cobbled_deepslate", $factory->get(Ids::COBBLED_DEEPSLATE, 0)); - self::register("cobbled_deepslate_slab", $factory->get(Ids::COBBLED_DEEPSLATE_SLAB, 0)); - self::register("cobbled_deepslate_stairs", $factory->get(Ids::COBBLED_DEEPSLATE_STAIRS, 0)); - self::register("cobbled_deepslate_wall", $factory->get(Ids::COBBLED_DEEPSLATE_WALL, 0)); - self::register("cobblestone", $factory->get(Ids::COBBLESTONE, 0)); - self::register("cobblestone_slab", $factory->get(Ids::COBBLESTONE_SLAB, 0)); - self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 0)); - 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_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_deepslate_bricks", $factory->get(Ids::CRACKED_DEEPSLATE_BRICKS, 0)); - self::register("cracked_deepslate_tiles", $factory->get(Ids::CRACKED_DEEPSLATE_TILES, 0)); - self::register("cracked_nether_bricks", $factory->get(Ids::CRACKED_NETHER_BRICKS, 0)); - self::register("cracked_polished_blackstone_bricks", $factory->get(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, 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("crimson_button", $factory->get(Ids::CRIMSON_BUTTON, 0)); - self::register("crimson_door", $factory->get(Ids::CRIMSON_DOOR, 0)); - self::register("crimson_fence", $factory->get(Ids::CRIMSON_FENCE, 0)); - self::register("crimson_fence_gate", $factory->get(Ids::CRIMSON_FENCE_GATE, 0)); - self::register("crimson_hyphae", $factory->get(Ids::CRIMSON_HYPHAE, 4)); - self::register("crimson_planks", $factory->get(Ids::CRIMSON_PLANKS, 0)); - self::register("crimson_pressure_plate", $factory->get(Ids::CRIMSON_PRESSURE_PLATE, 0)); - self::register("crimson_slab", $factory->get(Ids::CRIMSON_SLAB, 0)); - self::register("crimson_stairs", $factory->get(Ids::CRIMSON_STAIRS, 0)); - self::register("crimson_stem", $factory->get(Ids::CRIMSON_STEM, 4)); - self::register("crimson_trapdoor", $factory->get(Ids::CRIMSON_TRAPDOOR, 0)); - 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("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, 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::DARK_OAK_LEAVES, 0)); - self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 4)); - 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::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, 0)); - self::register("dark_oak_trapdoor", $factory->get(Ids::DARK_OAK_TRAPDOOR, 0)); - self::register("dark_oak_wall_sign", $factory->get(Ids::DARK_OAK_WALL_SIGN, 0)); - self::register("dark_oak_wood", $factory->get(Ids::DARK_OAK_WOOD, 4)); - 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, 0)); - self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_SENSOR, 0)); - self::register("dead_bush", $factory->get(Ids::DEAD_BUSH, 0)); - self::register("deepslate", $factory->get(Ids::DEEPSLATE, 2)); - self::register("deepslate_brick_slab", $factory->get(Ids::DEEPSLATE_BRICK_SLAB, 0)); - self::register("deepslate_brick_stairs", $factory->get(Ids::DEEPSLATE_BRICK_STAIRS, 0)); - self::register("deepslate_brick_wall", $factory->get(Ids::DEEPSLATE_BRICK_WALL, 0)); - self::register("deepslate_bricks", $factory->get(Ids::DEEPSLATE_BRICKS, 0)); - self::register("deepslate_tile_slab", $factory->get(Ids::DEEPSLATE_TILE_SLAB, 0)); - self::register("deepslate_tile_stairs", $factory->get(Ids::DEEPSLATE_TILE_STAIRS, 0)); - self::register("deepslate_tile_wall", $factory->get(Ids::DEEPSLATE_TILE_WALL, 0)); - self::register("deepslate_tiles", $factory->get(Ids::DEEPSLATE_TILES, 0)); - self::register("detector_rail", $factory->get(Ids::DETECTOR_RAIL, 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::DIORITE, 0)); - self::register("diorite_slab", $factory->get(Ids::DIORITE_SLAB, 0)); - self::register("diorite_stairs", $factory->get(Ids::DIORITE_STAIRS, 0)); - 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_TALLGRASS, 0)); - self::register("dragon_egg", $factory->get(Ids::DRAGON_EGG, 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::END_STONE_BRICK_SLAB, 0)); - self::register("end_stone_brick_stairs", $factory->get(Ids::END_STONE_BRICK_STAIRS, 0)); - 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, 0)); - 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::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, 0)); - self::register("frosted_ice", $factory->get(Ids::FROSTED_ICE, 0)); - 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("glazed_terracotta", $factory->get(Ids::GLAZED_TERRACOTTA, 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, 0)); - self::register("gold_ore", $factory->get(Ids::GOLD_ORE, 0)); - 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, 0)); - 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("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::HARDENED_GLASS, 0)); - self::register("hardened_glass_pane", $factory->get(Ids::HARDENED_GLASS_PANE, 0)); - self::register("hay_bale", $factory->get(Ids::HAY_BALE, 2)); - 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::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::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, 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::ITEM_FRAME, 0)); - 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, 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::JUNGLE_LEAVES, 0)); - self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 4)); - 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::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, 0)); - self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 0)); - self::register("jungle_wall_sign", $factory->get(Ids::JUNGLE_WALL_SIGN, 0)); - self::register("jungle_wood", $factory->get(Ids::JUNGLE_WOOD, 4)); - self::register("lab_table", $factory->get(Ids::LAB_TABLE, 0)); - self::register("ladder", $factory->get(Ids::LADDER, 0)); - self::register("lantern", $factory->get(Ids::LANTERN, 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, 0)); - self::register("legacy_stonecutter", $factory->get(Ids::LEGACY_STONECUTTER, 0)); - self::register("lever", $factory->get(Ids::LEVER, 5)); - self::register("light", $factory->get(Ids::LIGHT, 15)); - 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("lit_pumpkin", $factory->get(Ids::LIT_PUMPKIN, 0)); - self::register("loom", $factory->get(Ids::LOOM, 0)); - self::register("magma", $factory->get(Ids::MAGMA, 0)); - self::register("mangrove_button", $factory->get(Ids::MANGROVE_BUTTON, 0)); - self::register("mangrove_door", $factory->get(Ids::MANGROVE_DOOR, 0)); - self::register("mangrove_fence", $factory->get(Ids::MANGROVE_FENCE, 0)); - self::register("mangrove_fence_gate", $factory->get(Ids::MANGROVE_FENCE_GATE, 0)); - self::register("mangrove_log", $factory->get(Ids::MANGROVE_LOG, 4)); - self::register("mangrove_planks", $factory->get(Ids::MANGROVE_PLANKS, 0)); - self::register("mangrove_pressure_plate", $factory->get(Ids::MANGROVE_PRESSURE_PLATE, 0)); - self::register("mangrove_slab", $factory->get(Ids::MANGROVE_SLAB, 0)); - self::register("mangrove_stairs", $factory->get(Ids::MANGROVE_STAIRS, 0)); - self::register("mangrove_trapdoor", $factory->get(Ids::MANGROVE_TRAPDOOR, 0)); - self::register("mangrove_wood", $factory->get(Ids::MANGROVE_WOOD, 4)); - 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, 19)); - 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::MOSSY_COBBLESTONE_SLAB, 0)); - self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 0)); - 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, 0)); - 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::NETHER_BRICK_SLAB, 0)); - self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 0)); - 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, 0)); - self::register("nether_quartz_ore", $factory->get(Ids::NETHER_QUARTZ_ORE, 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::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, 4)); - 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, 0)); - self::register("oak_trapdoor", $factory->get(Ids::OAK_TRAPDOOR, 0)); - self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 0)); - self::register("oak_wood", $factory->get(Ids::OAK_WOOD, 4)); - self::register("obsidian", $factory->get(Ids::OBSIDIAN, 0)); - 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::PEONY, 0)); - 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::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, 0)); - self::register("polished_basalt", $factory->get(Ids::POLISHED_BASALT, 2)); - self::register("polished_blackstone", $factory->get(Ids::POLISHED_BLACKSTONE, 0)); - self::register("polished_blackstone_brick_slab", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, 0)); - self::register("polished_blackstone_brick_stairs", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, 0)); - self::register("polished_blackstone_brick_wall", $factory->get(Ids::POLISHED_BLACKSTONE_BRICK_WALL, 0)); - self::register("polished_blackstone_bricks", $factory->get(Ids::POLISHED_BLACKSTONE_BRICKS, 0)); - self::register("polished_blackstone_button", $factory->get(Ids::POLISHED_BLACKSTONE_BUTTON, 0)); - self::register("polished_blackstone_pressure_plate", $factory->get(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, 0)); - self::register("polished_blackstone_slab", $factory->get(Ids::POLISHED_BLACKSTONE_SLAB, 0)); - self::register("polished_blackstone_stairs", $factory->get(Ids::POLISHED_BLACKSTONE_STAIRS, 0)); - self::register("polished_blackstone_wall", $factory->get(Ids::POLISHED_BLACKSTONE_WALL, 0)); - self::register("polished_deepslate", $factory->get(Ids::POLISHED_DEEPSLATE, 0)); - self::register("polished_deepslate_slab", $factory->get(Ids::POLISHED_DEEPSLATE_SLAB, 0)); - self::register("polished_deepslate_stairs", $factory->get(Ids::POLISHED_DEEPSLATE_STAIRS, 0)); - self::register("polished_deepslate_wall", $factory->get(Ids::POLISHED_DEEPSLATE_WALL, 0)); - 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, 0)); - 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, 0)); - self::register("poppy", $factory->get(Ids::POPPY, 0)); - self::register("potatoes", $factory->get(Ids::POTATOES, 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_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, 0)); - self::register("prismarine_slab", $factory->get(Ids::PRISMARINE_SLAB, 0)); - self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 0)); - 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_torch", $factory->get(Ids::PURPLE_TORCH, 1)); - self::register("purpur", $factory->get(Ids::PURPUR, 0)); - self::register("purpur_pillar", $factory->get(Ids::PURPUR_PILLAR, 2)); - self::register("purpur_slab", $factory->get(Ids::PURPUR_SLAB, 0)); - self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 0)); - self::register("quartz", $factory->get(Ids::QUARTZ, 0)); - self::register("quartz_bricks", $factory->get(Ids::QUARTZ_BRICKS, 0)); - self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 2)); - self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); - self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); - self::register("rail", $factory->get(Ids::RAIL, 0)); - self::register("raw_copper", $factory->get(Ids::RAW_COPPER, 0)); - self::register("raw_gold", $factory->get(Ids::RAW_GOLD, 0)); - self::register("raw_iron", $factory->get(Ids::RAW_IRON, 0)); - self::register("red_mushroom", $factory->get(Ids::RED_MUSHROOM, 0)); - self::register("red_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 10)); - 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, 0)); - 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::RED_SANDSTONE_SLAB, 0)); - self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 0)); - 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, 0)); - 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::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::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::SANDSTONE_SLAB, 0)); - self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 0)); - 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, 0)); - 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, 0)); - self::register("smooth_basalt", $factory->get(Ids::SMOOTH_BASALT, 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, 0)); - 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, 0)); - 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, 0)); - self::register("smooth_stone", $factory->get(Ids::SMOOTH_STONE, 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_fire", $factory->get(Ids::SOUL_FIRE, 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, 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::SPRUCE_LEAVES, 0)); - self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 4)); - 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::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, 0)); - self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 0)); - self::register("spruce_wall_sign", $factory->get(Ids::SPRUCE_WALL_SIGN, 0)); - self::register("spruce_wood", $factory->get(Ids::SPRUCE_WOOD, 4)); - 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_BRICK_SLAB, 0)); - self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 0)); - 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_SLAB, 0)); - self::register("stone_stairs", $factory->get(Ids::STONE_STAIRS, 0)); - self::register("stonecutter", $factory->get(Ids::STONECUTTER, 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::TALL_GRASS, 0)); - self::register("tnt", $factory->get(Ids::TNT, 0)); - self::register("torch", $factory->get(Ids::TORCH, 1)); - self::register("trapped_chest", $factory->get(Ids::TRAPPED_CHEST, 0)); - 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, 1)); - self::register("vines", $factory->get(Ids::VINES, 0)); - self::register("wall_banner", $factory->get(Ids::WALL_BANNER, 0)); - self::register("wall_coral_fan", $factory->get(Ids::WALL_CORAL_FAN, 4)); - self::register("warped_button", $factory->get(Ids::WARPED_BUTTON, 0)); - self::register("warped_door", $factory->get(Ids::WARPED_DOOR, 0)); - self::register("warped_fence", $factory->get(Ids::WARPED_FENCE, 0)); - self::register("warped_fence_gate", $factory->get(Ids::WARPED_FENCE_GATE, 0)); - self::register("warped_hyphae", $factory->get(Ids::WARPED_HYPHAE, 4)); - self::register("warped_planks", $factory->get(Ids::WARPED_PLANKS, 0)); - self::register("warped_pressure_plate", $factory->get(Ids::WARPED_PRESSURE_PLATE, 0)); - self::register("warped_slab", $factory->get(Ids::WARPED_SLAB, 0)); - self::register("warped_stairs", $factory->get(Ids::WARPED_STAIRS, 0)); - self::register("warped_stem", $factory->get(Ids::WARPED_STEM, 4)); - self::register("warped_trapdoor", $factory->get(Ids::WARPED_TRAPDOOR, 0)); - 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_tulip", $factory->get(Ids::WHITE_TULIP, 0)); - self::register("wool", $factory->get(Ids::WOOL, 14)); + self::register("acacia_button", $factory->fromTypeId(Ids::ACACIA_BUTTON)); + self::register("acacia_door", $factory->fromTypeId(Ids::ACACIA_DOOR)); + self::register("acacia_fence", $factory->fromTypeId(Ids::ACACIA_FENCE)); + self::register("acacia_fence_gate", $factory->fromTypeId(Ids::ACACIA_FENCE_GATE)); + self::register("acacia_leaves", $factory->fromTypeId(Ids::ACACIA_LEAVES)); + self::register("acacia_log", $factory->fromTypeId(Ids::ACACIA_LOG)); + self::register("acacia_planks", $factory->fromTypeId(Ids::ACACIA_PLANKS)); + self::register("acacia_pressure_plate", $factory->fromTypeId(Ids::ACACIA_PRESSURE_PLATE)); + self::register("acacia_sapling", $factory->fromTypeId(Ids::ACACIA_SAPLING)); + self::register("acacia_sign", $factory->fromTypeId(Ids::ACACIA_SIGN)); + self::register("acacia_slab", $factory->fromTypeId(Ids::ACACIA_SLAB)); + self::register("acacia_stairs", $factory->fromTypeId(Ids::ACACIA_STAIRS)); + self::register("acacia_trapdoor", $factory->fromTypeId(Ids::ACACIA_TRAPDOOR)); + self::register("acacia_wall_sign", $factory->fromTypeId(Ids::ACACIA_WALL_SIGN)); + self::register("acacia_wood", $factory->fromTypeId(Ids::ACACIA_WOOD)); + self::register("activator_rail", $factory->fromTypeId(Ids::ACTIVATOR_RAIL)); + self::register("air", $factory->fromTypeId(Ids::AIR)); + self::register("all_sided_mushroom_stem", $factory->fromTypeId(Ids::ALL_SIDED_MUSHROOM_STEM)); + self::register("allium", $factory->fromTypeId(Ids::ALLIUM)); + self::register("amethyst", $factory->fromTypeId(Ids::AMETHYST)); + self::register("ancient_debris", $factory->fromTypeId(Ids::ANCIENT_DEBRIS)); + self::register("andesite", $factory->fromTypeId(Ids::ANDESITE)); + self::register("andesite_slab", $factory->fromTypeId(Ids::ANDESITE_SLAB)); + self::register("andesite_stairs", $factory->fromTypeId(Ids::ANDESITE_STAIRS)); + self::register("andesite_wall", $factory->fromTypeId(Ids::ANDESITE_WALL)); + self::register("anvil", $factory->fromTypeId(Ids::ANVIL)); + self::register("azure_bluet", $factory->fromTypeId(Ids::AZURE_BLUET)); + self::register("bamboo", $factory->fromTypeId(Ids::BAMBOO)); + self::register("bamboo_sapling", $factory->fromTypeId(Ids::BAMBOO_SAPLING)); + self::register("banner", $factory->fromTypeId(Ids::BANNER)); + self::register("barrel", $factory->fromTypeId(Ids::BARREL)); + self::register("barrier", $factory->fromTypeId(Ids::BARRIER)); + self::register("basalt", $factory->fromTypeId(Ids::BASALT)); + self::register("beacon", $factory->fromTypeId(Ids::BEACON)); + self::register("bed", $factory->fromTypeId(Ids::BED)); + self::register("bedrock", $factory->fromTypeId(Ids::BEDROCK)); + self::register("beetroots", $factory->fromTypeId(Ids::BEETROOTS)); + self::register("bell", $factory->fromTypeId(Ids::BELL)); + self::register("birch_button", $factory->fromTypeId(Ids::BIRCH_BUTTON)); + self::register("birch_door", $factory->fromTypeId(Ids::BIRCH_DOOR)); + self::register("birch_fence", $factory->fromTypeId(Ids::BIRCH_FENCE)); + self::register("birch_fence_gate", $factory->fromTypeId(Ids::BIRCH_FENCE_GATE)); + self::register("birch_leaves", $factory->fromTypeId(Ids::BIRCH_LEAVES)); + self::register("birch_log", $factory->fromTypeId(Ids::BIRCH_LOG)); + self::register("birch_planks", $factory->fromTypeId(Ids::BIRCH_PLANKS)); + self::register("birch_pressure_plate", $factory->fromTypeId(Ids::BIRCH_PRESSURE_PLATE)); + self::register("birch_sapling", $factory->fromTypeId(Ids::BIRCH_SAPLING)); + self::register("birch_sign", $factory->fromTypeId(Ids::BIRCH_SIGN)); + self::register("birch_slab", $factory->fromTypeId(Ids::BIRCH_SLAB)); + self::register("birch_stairs", $factory->fromTypeId(Ids::BIRCH_STAIRS)); + self::register("birch_trapdoor", $factory->fromTypeId(Ids::BIRCH_TRAPDOOR)); + self::register("birch_wall_sign", $factory->fromTypeId(Ids::BIRCH_WALL_SIGN)); + self::register("birch_wood", $factory->fromTypeId(Ids::BIRCH_WOOD)); + self::register("blackstone", $factory->fromTypeId(Ids::BLACKSTONE)); + self::register("blackstone_slab", $factory->fromTypeId(Ids::BLACKSTONE_SLAB)); + self::register("blackstone_stairs", $factory->fromTypeId(Ids::BLACKSTONE_STAIRS)); + self::register("blackstone_wall", $factory->fromTypeId(Ids::BLACKSTONE_WALL)); + self::register("blast_furnace", $factory->fromTypeId(Ids::BLAST_FURNACE)); + self::register("blue_ice", $factory->fromTypeId(Ids::BLUE_ICE)); + self::register("blue_orchid", $factory->fromTypeId(Ids::BLUE_ORCHID)); + self::register("blue_torch", $factory->fromTypeId(Ids::BLUE_TORCH)); + self::register("bone_block", $factory->fromTypeId(Ids::BONE_BLOCK)); + self::register("bookshelf", $factory->fromTypeId(Ids::BOOKSHELF)); + self::register("brewing_stand", $factory->fromTypeId(Ids::BREWING_STAND)); + self::register("brick_slab", $factory->fromTypeId(Ids::BRICK_SLAB)); + self::register("brick_stairs", $factory->fromTypeId(Ids::BRICK_STAIRS)); + self::register("brick_wall", $factory->fromTypeId(Ids::BRICK_WALL)); + self::register("bricks", $factory->fromTypeId(Ids::BRICKS)); + self::register("brown_mushroom", $factory->fromTypeId(Ids::BROWN_MUSHROOM)); + self::register("brown_mushroom_block", $factory->fromTypeId(Ids::BROWN_MUSHROOM_BLOCK)); + self::register("cactus", $factory->fromTypeId(Ids::CACTUS)); + self::register("cake", $factory->fromTypeId(Ids::CAKE)); + self::register("calcite", $factory->fromTypeId(Ids::CALCITE)); + self::register("carpet", $factory->fromTypeId(Ids::CARPET)); + self::register("carrots", $factory->fromTypeId(Ids::CARROTS)); + self::register("carved_pumpkin", $factory->fromTypeId(Ids::CARVED_PUMPKIN)); + self::register("chemical_heat", $factory->fromTypeId(Ids::CHEMICAL_HEAT)); + self::register("chest", $factory->fromTypeId(Ids::CHEST)); + self::register("chiseled_deepslate", $factory->fromTypeId(Ids::CHISELED_DEEPSLATE)); + self::register("chiseled_nether_bricks", $factory->fromTypeId(Ids::CHISELED_NETHER_BRICKS)); + self::register("chiseled_polished_blackstone", $factory->fromTypeId(Ids::CHISELED_POLISHED_BLACKSTONE)); + self::register("chiseled_quartz", $factory->fromTypeId(Ids::CHISELED_QUARTZ)); + self::register("chiseled_red_sandstone", $factory->fromTypeId(Ids::CHISELED_RED_SANDSTONE)); + self::register("chiseled_sandstone", $factory->fromTypeId(Ids::CHISELED_SANDSTONE)); + self::register("chiseled_stone_bricks", $factory->fromTypeId(Ids::CHISELED_STONE_BRICKS)); + self::register("clay", $factory->fromTypeId(Ids::CLAY)); + self::register("coal", $factory->fromTypeId(Ids::COAL)); + self::register("coal_ore", $factory->fromTypeId(Ids::COAL_ORE)); + self::register("cobbled_deepslate", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE)); + self::register("cobbled_deepslate_slab", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_SLAB)); + self::register("cobbled_deepslate_stairs", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_STAIRS)); + self::register("cobbled_deepslate_wall", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_WALL)); + self::register("cobblestone", $factory->fromTypeId(Ids::COBBLESTONE)); + self::register("cobblestone_slab", $factory->fromTypeId(Ids::COBBLESTONE_SLAB)); + self::register("cobblestone_stairs", $factory->fromTypeId(Ids::COBBLESTONE_STAIRS)); + self::register("cobblestone_wall", $factory->fromTypeId(Ids::COBBLESTONE_WALL)); + self::register("cobweb", $factory->fromTypeId(Ids::COBWEB)); + self::register("cocoa_pod", $factory->fromTypeId(Ids::COCOA_POD)); + self::register("compound_creator", $factory->fromTypeId(Ids::COMPOUND_CREATOR)); + self::register("concrete", $factory->fromTypeId(Ids::CONCRETE)); + self::register("concrete_powder", $factory->fromTypeId(Ids::CONCRETE_POWDER)); + self::register("coral", $factory->fromTypeId(Ids::CORAL)); + self::register("coral_block", $factory->fromTypeId(Ids::CORAL_BLOCK)); + self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); + self::register("cornflower", $factory->fromTypeId(Ids::CORNFLOWER)); + self::register("cracked_deepslate_bricks", $factory->fromTypeId(Ids::CRACKED_DEEPSLATE_BRICKS)); + self::register("cracked_deepslate_tiles", $factory->fromTypeId(Ids::CRACKED_DEEPSLATE_TILES)); + self::register("cracked_nether_bricks", $factory->fromTypeId(Ids::CRACKED_NETHER_BRICKS)); + self::register("cracked_polished_blackstone_bricks", $factory->fromTypeId(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS)); + self::register("cracked_stone_bricks", $factory->fromTypeId(Ids::CRACKED_STONE_BRICKS)); + self::register("crafting_table", $factory->fromTypeId(Ids::CRAFTING_TABLE)); + self::register("crimson_button", $factory->fromTypeId(Ids::CRIMSON_BUTTON)); + self::register("crimson_door", $factory->fromTypeId(Ids::CRIMSON_DOOR)); + self::register("crimson_fence", $factory->fromTypeId(Ids::CRIMSON_FENCE)); + self::register("crimson_fence_gate", $factory->fromTypeId(Ids::CRIMSON_FENCE_GATE)); + self::register("crimson_hyphae", $factory->fromTypeId(Ids::CRIMSON_HYPHAE)); + self::register("crimson_planks", $factory->fromTypeId(Ids::CRIMSON_PLANKS)); + self::register("crimson_pressure_plate", $factory->fromTypeId(Ids::CRIMSON_PRESSURE_PLATE)); + self::register("crimson_slab", $factory->fromTypeId(Ids::CRIMSON_SLAB)); + self::register("crimson_stairs", $factory->fromTypeId(Ids::CRIMSON_STAIRS)); + self::register("crimson_stem", $factory->fromTypeId(Ids::CRIMSON_STEM)); + self::register("crimson_trapdoor", $factory->fromTypeId(Ids::CRIMSON_TRAPDOOR)); + self::register("cut_red_sandstone", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE)); + self::register("cut_red_sandstone_slab", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE_SLAB)); + self::register("cut_sandstone", $factory->fromTypeId(Ids::CUT_SANDSTONE)); + self::register("cut_sandstone_slab", $factory->fromTypeId(Ids::CUT_SANDSTONE_SLAB)); + self::register("dandelion", $factory->fromTypeId(Ids::DANDELION)); + self::register("dark_oak_button", $factory->fromTypeId(Ids::DARK_OAK_BUTTON)); + self::register("dark_oak_door", $factory->fromTypeId(Ids::DARK_OAK_DOOR)); + self::register("dark_oak_fence", $factory->fromTypeId(Ids::DARK_OAK_FENCE)); + self::register("dark_oak_fence_gate", $factory->fromTypeId(Ids::DARK_OAK_FENCE_GATE)); + self::register("dark_oak_leaves", $factory->fromTypeId(Ids::DARK_OAK_LEAVES)); + self::register("dark_oak_log", $factory->fromTypeId(Ids::DARK_OAK_LOG)); + self::register("dark_oak_planks", $factory->fromTypeId(Ids::DARK_OAK_PLANKS)); + self::register("dark_oak_pressure_plate", $factory->fromTypeId(Ids::DARK_OAK_PRESSURE_PLATE)); + self::register("dark_oak_sapling", $factory->fromTypeId(Ids::DARK_OAK_SAPLING)); + self::register("dark_oak_sign", $factory->fromTypeId(Ids::DARK_OAK_SIGN)); + self::register("dark_oak_slab", $factory->fromTypeId(Ids::DARK_OAK_SLAB)); + self::register("dark_oak_stairs", $factory->fromTypeId(Ids::DARK_OAK_STAIRS)); + self::register("dark_oak_trapdoor", $factory->fromTypeId(Ids::DARK_OAK_TRAPDOOR)); + self::register("dark_oak_wall_sign", $factory->fromTypeId(Ids::DARK_OAK_WALL_SIGN)); + self::register("dark_oak_wood", $factory->fromTypeId(Ids::DARK_OAK_WOOD)); + self::register("dark_prismarine", $factory->fromTypeId(Ids::DARK_PRISMARINE)); + self::register("dark_prismarine_slab", $factory->fromTypeId(Ids::DARK_PRISMARINE_SLAB)); + self::register("dark_prismarine_stairs", $factory->fromTypeId(Ids::DARK_PRISMARINE_STAIRS)); + self::register("daylight_sensor", $factory->fromTypeId(Ids::DAYLIGHT_SENSOR)); + self::register("dead_bush", $factory->fromTypeId(Ids::DEAD_BUSH)); + self::register("deepslate", $factory->fromTypeId(Ids::DEEPSLATE)); + self::register("deepslate_brick_slab", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_SLAB)); + self::register("deepslate_brick_stairs", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_STAIRS)); + self::register("deepslate_brick_wall", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_WALL)); + self::register("deepslate_bricks", $factory->fromTypeId(Ids::DEEPSLATE_BRICKS)); + self::register("deepslate_tile_slab", $factory->fromTypeId(Ids::DEEPSLATE_TILE_SLAB)); + self::register("deepslate_tile_stairs", $factory->fromTypeId(Ids::DEEPSLATE_TILE_STAIRS)); + self::register("deepslate_tile_wall", $factory->fromTypeId(Ids::DEEPSLATE_TILE_WALL)); + self::register("deepslate_tiles", $factory->fromTypeId(Ids::DEEPSLATE_TILES)); + self::register("detector_rail", $factory->fromTypeId(Ids::DETECTOR_RAIL)); + self::register("diamond", $factory->fromTypeId(Ids::DIAMOND)); + self::register("diamond_ore", $factory->fromTypeId(Ids::DIAMOND_ORE)); + self::register("diorite", $factory->fromTypeId(Ids::DIORITE)); + self::register("diorite_slab", $factory->fromTypeId(Ids::DIORITE_SLAB)); + self::register("diorite_stairs", $factory->fromTypeId(Ids::DIORITE_STAIRS)); + self::register("diorite_wall", $factory->fromTypeId(Ids::DIORITE_WALL)); + self::register("dirt", $factory->fromTypeId(Ids::DIRT)); + self::register("double_tallgrass", $factory->fromTypeId(Ids::DOUBLE_TALLGRASS)); + self::register("dragon_egg", $factory->fromTypeId(Ids::DRAGON_EGG)); + self::register("dried_kelp", $factory->fromTypeId(Ids::DRIED_KELP)); + self::register("dyed_shulker_box", $factory->fromTypeId(Ids::DYED_SHULKER_BOX)); + self::register("element_actinium", $factory->fromTypeId(Ids::ELEMENT_ACTINIUM)); + self::register("element_aluminum", $factory->fromTypeId(Ids::ELEMENT_ALUMINUM)); + self::register("element_americium", $factory->fromTypeId(Ids::ELEMENT_AMERICIUM)); + self::register("element_antimony", $factory->fromTypeId(Ids::ELEMENT_ANTIMONY)); + self::register("element_argon", $factory->fromTypeId(Ids::ELEMENT_ARGON)); + self::register("element_arsenic", $factory->fromTypeId(Ids::ELEMENT_ARSENIC)); + self::register("element_astatine", $factory->fromTypeId(Ids::ELEMENT_ASTATINE)); + self::register("element_barium", $factory->fromTypeId(Ids::ELEMENT_BARIUM)); + self::register("element_berkelium", $factory->fromTypeId(Ids::ELEMENT_BERKELIUM)); + self::register("element_beryllium", $factory->fromTypeId(Ids::ELEMENT_BERYLLIUM)); + self::register("element_bismuth", $factory->fromTypeId(Ids::ELEMENT_BISMUTH)); + self::register("element_bohrium", $factory->fromTypeId(Ids::ELEMENT_BOHRIUM)); + self::register("element_boron", $factory->fromTypeId(Ids::ELEMENT_BORON)); + self::register("element_bromine", $factory->fromTypeId(Ids::ELEMENT_BROMINE)); + self::register("element_cadmium", $factory->fromTypeId(Ids::ELEMENT_CADMIUM)); + self::register("element_calcium", $factory->fromTypeId(Ids::ELEMENT_CALCIUM)); + self::register("element_californium", $factory->fromTypeId(Ids::ELEMENT_CALIFORNIUM)); + self::register("element_carbon", $factory->fromTypeId(Ids::ELEMENT_CARBON)); + self::register("element_cerium", $factory->fromTypeId(Ids::ELEMENT_CERIUM)); + self::register("element_cesium", $factory->fromTypeId(Ids::ELEMENT_CESIUM)); + self::register("element_chlorine", $factory->fromTypeId(Ids::ELEMENT_CHLORINE)); + self::register("element_chromium", $factory->fromTypeId(Ids::ELEMENT_CHROMIUM)); + self::register("element_cobalt", $factory->fromTypeId(Ids::ELEMENT_COBALT)); + self::register("element_constructor", $factory->fromTypeId(Ids::ELEMENT_CONSTRUCTOR)); + self::register("element_copernicium", $factory->fromTypeId(Ids::ELEMENT_COPERNICIUM)); + self::register("element_copper", $factory->fromTypeId(Ids::ELEMENT_COPPER)); + self::register("element_curium", $factory->fromTypeId(Ids::ELEMENT_CURIUM)); + self::register("element_darmstadtium", $factory->fromTypeId(Ids::ELEMENT_DARMSTADTIUM)); + self::register("element_dubnium", $factory->fromTypeId(Ids::ELEMENT_DUBNIUM)); + self::register("element_dysprosium", $factory->fromTypeId(Ids::ELEMENT_DYSPROSIUM)); + self::register("element_einsteinium", $factory->fromTypeId(Ids::ELEMENT_EINSTEINIUM)); + self::register("element_erbium", $factory->fromTypeId(Ids::ELEMENT_ERBIUM)); + self::register("element_europium", $factory->fromTypeId(Ids::ELEMENT_EUROPIUM)); + self::register("element_fermium", $factory->fromTypeId(Ids::ELEMENT_FERMIUM)); + self::register("element_flerovium", $factory->fromTypeId(Ids::ELEMENT_FLEROVIUM)); + self::register("element_fluorine", $factory->fromTypeId(Ids::ELEMENT_FLUORINE)); + self::register("element_francium", $factory->fromTypeId(Ids::ELEMENT_FRANCIUM)); + self::register("element_gadolinium", $factory->fromTypeId(Ids::ELEMENT_GADOLINIUM)); + self::register("element_gallium", $factory->fromTypeId(Ids::ELEMENT_GALLIUM)); + self::register("element_germanium", $factory->fromTypeId(Ids::ELEMENT_GERMANIUM)); + self::register("element_gold", $factory->fromTypeId(Ids::ELEMENT_GOLD)); + self::register("element_hafnium", $factory->fromTypeId(Ids::ELEMENT_HAFNIUM)); + self::register("element_hassium", $factory->fromTypeId(Ids::ELEMENT_HASSIUM)); + self::register("element_helium", $factory->fromTypeId(Ids::ELEMENT_HELIUM)); + self::register("element_holmium", $factory->fromTypeId(Ids::ELEMENT_HOLMIUM)); + self::register("element_hydrogen", $factory->fromTypeId(Ids::ELEMENT_HYDROGEN)); + self::register("element_indium", $factory->fromTypeId(Ids::ELEMENT_INDIUM)); + self::register("element_iodine", $factory->fromTypeId(Ids::ELEMENT_IODINE)); + self::register("element_iridium", $factory->fromTypeId(Ids::ELEMENT_IRIDIUM)); + self::register("element_iron", $factory->fromTypeId(Ids::ELEMENT_IRON)); + self::register("element_krypton", $factory->fromTypeId(Ids::ELEMENT_KRYPTON)); + self::register("element_lanthanum", $factory->fromTypeId(Ids::ELEMENT_LANTHANUM)); + self::register("element_lawrencium", $factory->fromTypeId(Ids::ELEMENT_LAWRENCIUM)); + self::register("element_lead", $factory->fromTypeId(Ids::ELEMENT_LEAD)); + self::register("element_lithium", $factory->fromTypeId(Ids::ELEMENT_LITHIUM)); + self::register("element_livermorium", $factory->fromTypeId(Ids::ELEMENT_LIVERMORIUM)); + self::register("element_lutetium", $factory->fromTypeId(Ids::ELEMENT_LUTETIUM)); + self::register("element_magnesium", $factory->fromTypeId(Ids::ELEMENT_MAGNESIUM)); + self::register("element_manganese", $factory->fromTypeId(Ids::ELEMENT_MANGANESE)); + self::register("element_meitnerium", $factory->fromTypeId(Ids::ELEMENT_MEITNERIUM)); + self::register("element_mendelevium", $factory->fromTypeId(Ids::ELEMENT_MENDELEVIUM)); + self::register("element_mercury", $factory->fromTypeId(Ids::ELEMENT_MERCURY)); + self::register("element_molybdenum", $factory->fromTypeId(Ids::ELEMENT_MOLYBDENUM)); + self::register("element_moscovium", $factory->fromTypeId(Ids::ELEMENT_MOSCOVIUM)); + self::register("element_neodymium", $factory->fromTypeId(Ids::ELEMENT_NEODYMIUM)); + self::register("element_neon", $factory->fromTypeId(Ids::ELEMENT_NEON)); + self::register("element_neptunium", $factory->fromTypeId(Ids::ELEMENT_NEPTUNIUM)); + self::register("element_nickel", $factory->fromTypeId(Ids::ELEMENT_NICKEL)); + self::register("element_nihonium", $factory->fromTypeId(Ids::ELEMENT_NIHONIUM)); + self::register("element_niobium", $factory->fromTypeId(Ids::ELEMENT_NIOBIUM)); + self::register("element_nitrogen", $factory->fromTypeId(Ids::ELEMENT_NITROGEN)); + self::register("element_nobelium", $factory->fromTypeId(Ids::ELEMENT_NOBELIUM)); + self::register("element_oganesson", $factory->fromTypeId(Ids::ELEMENT_OGANESSON)); + self::register("element_osmium", $factory->fromTypeId(Ids::ELEMENT_OSMIUM)); + self::register("element_oxygen", $factory->fromTypeId(Ids::ELEMENT_OXYGEN)); + self::register("element_palladium", $factory->fromTypeId(Ids::ELEMENT_PALLADIUM)); + self::register("element_phosphorus", $factory->fromTypeId(Ids::ELEMENT_PHOSPHORUS)); + self::register("element_platinum", $factory->fromTypeId(Ids::ELEMENT_PLATINUM)); + self::register("element_plutonium", $factory->fromTypeId(Ids::ELEMENT_PLUTONIUM)); + self::register("element_polonium", $factory->fromTypeId(Ids::ELEMENT_POLONIUM)); + self::register("element_potassium", $factory->fromTypeId(Ids::ELEMENT_POTASSIUM)); + self::register("element_praseodymium", $factory->fromTypeId(Ids::ELEMENT_PRASEODYMIUM)); + self::register("element_promethium", $factory->fromTypeId(Ids::ELEMENT_PROMETHIUM)); + self::register("element_protactinium", $factory->fromTypeId(Ids::ELEMENT_PROTACTINIUM)); + self::register("element_radium", $factory->fromTypeId(Ids::ELEMENT_RADIUM)); + self::register("element_radon", $factory->fromTypeId(Ids::ELEMENT_RADON)); + self::register("element_rhenium", $factory->fromTypeId(Ids::ELEMENT_RHENIUM)); + self::register("element_rhodium", $factory->fromTypeId(Ids::ELEMENT_RHODIUM)); + self::register("element_roentgenium", $factory->fromTypeId(Ids::ELEMENT_ROENTGENIUM)); + self::register("element_rubidium", $factory->fromTypeId(Ids::ELEMENT_RUBIDIUM)); + self::register("element_ruthenium", $factory->fromTypeId(Ids::ELEMENT_RUTHENIUM)); + self::register("element_rutherfordium", $factory->fromTypeId(Ids::ELEMENT_RUTHERFORDIUM)); + self::register("element_samarium", $factory->fromTypeId(Ids::ELEMENT_SAMARIUM)); + self::register("element_scandium", $factory->fromTypeId(Ids::ELEMENT_SCANDIUM)); + self::register("element_seaborgium", $factory->fromTypeId(Ids::ELEMENT_SEABORGIUM)); + self::register("element_selenium", $factory->fromTypeId(Ids::ELEMENT_SELENIUM)); + self::register("element_silicon", $factory->fromTypeId(Ids::ELEMENT_SILICON)); + self::register("element_silver", $factory->fromTypeId(Ids::ELEMENT_SILVER)); + self::register("element_sodium", $factory->fromTypeId(Ids::ELEMENT_SODIUM)); + self::register("element_strontium", $factory->fromTypeId(Ids::ELEMENT_STRONTIUM)); + self::register("element_sulfur", $factory->fromTypeId(Ids::ELEMENT_SULFUR)); + self::register("element_tantalum", $factory->fromTypeId(Ids::ELEMENT_TANTALUM)); + self::register("element_technetium", $factory->fromTypeId(Ids::ELEMENT_TECHNETIUM)); + self::register("element_tellurium", $factory->fromTypeId(Ids::ELEMENT_TELLURIUM)); + self::register("element_tennessine", $factory->fromTypeId(Ids::ELEMENT_TENNESSINE)); + self::register("element_terbium", $factory->fromTypeId(Ids::ELEMENT_TERBIUM)); + self::register("element_thallium", $factory->fromTypeId(Ids::ELEMENT_THALLIUM)); + self::register("element_thorium", $factory->fromTypeId(Ids::ELEMENT_THORIUM)); + self::register("element_thulium", $factory->fromTypeId(Ids::ELEMENT_THULIUM)); + self::register("element_tin", $factory->fromTypeId(Ids::ELEMENT_TIN)); + self::register("element_titanium", $factory->fromTypeId(Ids::ELEMENT_TITANIUM)); + self::register("element_tungsten", $factory->fromTypeId(Ids::ELEMENT_TUNGSTEN)); + self::register("element_uranium", $factory->fromTypeId(Ids::ELEMENT_URANIUM)); + self::register("element_vanadium", $factory->fromTypeId(Ids::ELEMENT_VANADIUM)); + self::register("element_xenon", $factory->fromTypeId(Ids::ELEMENT_XENON)); + self::register("element_ytterbium", $factory->fromTypeId(Ids::ELEMENT_YTTERBIUM)); + self::register("element_yttrium", $factory->fromTypeId(Ids::ELEMENT_YTTRIUM)); + self::register("element_zero", $factory->fromTypeId(Ids::ELEMENT_ZERO)); + self::register("element_zinc", $factory->fromTypeId(Ids::ELEMENT_ZINC)); + self::register("element_zirconium", $factory->fromTypeId(Ids::ELEMENT_ZIRCONIUM)); + self::register("emerald", $factory->fromTypeId(Ids::EMERALD)); + self::register("emerald_ore", $factory->fromTypeId(Ids::EMERALD_ORE)); + self::register("enchanting_table", $factory->fromTypeId(Ids::ENCHANTING_TABLE)); + self::register("end_portal_frame", $factory->fromTypeId(Ids::END_PORTAL_FRAME)); + self::register("end_rod", $factory->fromTypeId(Ids::END_ROD)); + self::register("end_stone", $factory->fromTypeId(Ids::END_STONE)); + self::register("end_stone_brick_slab", $factory->fromTypeId(Ids::END_STONE_BRICK_SLAB)); + self::register("end_stone_brick_stairs", $factory->fromTypeId(Ids::END_STONE_BRICK_STAIRS)); + self::register("end_stone_brick_wall", $factory->fromTypeId(Ids::END_STONE_BRICK_WALL)); + self::register("end_stone_bricks", $factory->fromTypeId(Ids::END_STONE_BRICKS)); + self::register("ender_chest", $factory->fromTypeId(Ids::ENDER_CHEST)); + self::register("fake_wooden_slab", $factory->fromTypeId(Ids::FAKE_WOODEN_SLAB)); + self::register("farmland", $factory->fromTypeId(Ids::FARMLAND)); + self::register("fern", $factory->fromTypeId(Ids::FERN)); + self::register("fire", $factory->fromTypeId(Ids::FIRE)); + self::register("fletching_table", $factory->fromTypeId(Ids::FLETCHING_TABLE)); + self::register("flower_pot", $factory->fromTypeId(Ids::FLOWER_POT)); + self::register("frosted_ice", $factory->fromTypeId(Ids::FROSTED_ICE)); + self::register("furnace", $factory->fromTypeId(Ids::FURNACE)); + self::register("glass", $factory->fromTypeId(Ids::GLASS)); + self::register("glass_pane", $factory->fromTypeId(Ids::GLASS_PANE)); + self::register("glazed_terracotta", $factory->fromTypeId(Ids::GLAZED_TERRACOTTA)); + self::register("glowing_obsidian", $factory->fromTypeId(Ids::GLOWING_OBSIDIAN)); + self::register("glowstone", $factory->fromTypeId(Ids::GLOWSTONE)); + self::register("gold", $factory->fromTypeId(Ids::GOLD)); + self::register("gold_ore", $factory->fromTypeId(Ids::GOLD_ORE)); + self::register("granite", $factory->fromTypeId(Ids::GRANITE)); + self::register("granite_slab", $factory->fromTypeId(Ids::GRANITE_SLAB)); + self::register("granite_stairs", $factory->fromTypeId(Ids::GRANITE_STAIRS)); + self::register("granite_wall", $factory->fromTypeId(Ids::GRANITE_WALL)); + self::register("grass", $factory->fromTypeId(Ids::GRASS)); + self::register("grass_path", $factory->fromTypeId(Ids::GRASS_PATH)); + self::register("gravel", $factory->fromTypeId(Ids::GRAVEL)); + self::register("green_torch", $factory->fromTypeId(Ids::GREEN_TORCH)); + self::register("hardened_clay", $factory->fromTypeId(Ids::HARDENED_CLAY)); + self::register("hardened_glass", $factory->fromTypeId(Ids::HARDENED_GLASS)); + self::register("hardened_glass_pane", $factory->fromTypeId(Ids::HARDENED_GLASS_PANE)); + self::register("hay_bale", $factory->fromTypeId(Ids::HAY_BALE)); + self::register("hopper", $factory->fromTypeId(Ids::HOPPER)); + self::register("ice", $factory->fromTypeId(Ids::ICE)); + self::register("infested_chiseled_stone_brick", $factory->fromTypeId(Ids::INFESTED_CHISELED_STONE_BRICK)); + self::register("infested_cobblestone", $factory->fromTypeId(Ids::INFESTED_COBBLESTONE)); + self::register("infested_cracked_stone_brick", $factory->fromTypeId(Ids::INFESTED_CRACKED_STONE_BRICK)); + self::register("infested_mossy_stone_brick", $factory->fromTypeId(Ids::INFESTED_MOSSY_STONE_BRICK)); + self::register("infested_stone", $factory->fromTypeId(Ids::INFESTED_STONE)); + self::register("infested_stone_brick", $factory->fromTypeId(Ids::INFESTED_STONE_BRICK)); + self::register("info_update", $factory->fromTypeId(Ids::INFO_UPDATE)); + self::register("info_update2", $factory->fromTypeId(Ids::INFO_UPDATE2)); + self::register("invisible_bedrock", $factory->fromTypeId(Ids::INVISIBLE_BEDROCK)); + self::register("iron", $factory->fromTypeId(Ids::IRON)); + self::register("iron_bars", $factory->fromTypeId(Ids::IRON_BARS)); + self::register("iron_door", $factory->fromTypeId(Ids::IRON_DOOR)); + self::register("iron_ore", $factory->fromTypeId(Ids::IRON_ORE)); + self::register("iron_trapdoor", $factory->fromTypeId(Ids::IRON_TRAPDOOR)); + self::register("item_frame", $factory->fromTypeId(Ids::ITEM_FRAME)); + self::register("jukebox", $factory->fromTypeId(Ids::JUKEBOX)); + self::register("jungle_button", $factory->fromTypeId(Ids::JUNGLE_BUTTON)); + self::register("jungle_door", $factory->fromTypeId(Ids::JUNGLE_DOOR)); + self::register("jungle_fence", $factory->fromTypeId(Ids::JUNGLE_FENCE)); + self::register("jungle_fence_gate", $factory->fromTypeId(Ids::JUNGLE_FENCE_GATE)); + self::register("jungle_leaves", $factory->fromTypeId(Ids::JUNGLE_LEAVES)); + self::register("jungle_log", $factory->fromTypeId(Ids::JUNGLE_LOG)); + self::register("jungle_planks", $factory->fromTypeId(Ids::JUNGLE_PLANKS)); + self::register("jungle_pressure_plate", $factory->fromTypeId(Ids::JUNGLE_PRESSURE_PLATE)); + self::register("jungle_sapling", $factory->fromTypeId(Ids::JUNGLE_SAPLING)); + self::register("jungle_sign", $factory->fromTypeId(Ids::JUNGLE_SIGN)); + self::register("jungle_slab", $factory->fromTypeId(Ids::JUNGLE_SLAB)); + self::register("jungle_stairs", $factory->fromTypeId(Ids::JUNGLE_STAIRS)); + self::register("jungle_trapdoor", $factory->fromTypeId(Ids::JUNGLE_TRAPDOOR)); + self::register("jungle_wall_sign", $factory->fromTypeId(Ids::JUNGLE_WALL_SIGN)); + self::register("jungle_wood", $factory->fromTypeId(Ids::JUNGLE_WOOD)); + self::register("lab_table", $factory->fromTypeId(Ids::LAB_TABLE)); + self::register("ladder", $factory->fromTypeId(Ids::LADDER)); + self::register("lantern", $factory->fromTypeId(Ids::LANTERN)); + self::register("lapis_lazuli", $factory->fromTypeId(Ids::LAPIS_LAZULI)); + self::register("lapis_lazuli_ore", $factory->fromTypeId(Ids::LAPIS_LAZULI_ORE)); + self::register("large_fern", $factory->fromTypeId(Ids::LARGE_FERN)); + self::register("lava", $factory->fromTypeId(Ids::LAVA)); + self::register("lectern", $factory->fromTypeId(Ids::LECTERN)); + self::register("legacy_stonecutter", $factory->fromTypeId(Ids::LEGACY_STONECUTTER)); + self::register("lever", $factory->fromTypeId(Ids::LEVER)); + self::register("light", $factory->fromTypeId(Ids::LIGHT)); + self::register("lilac", $factory->fromTypeId(Ids::LILAC)); + self::register("lily_of_the_valley", $factory->fromTypeId(Ids::LILY_OF_THE_VALLEY)); + self::register("lily_pad", $factory->fromTypeId(Ids::LILY_PAD)); + self::register("lit_pumpkin", $factory->fromTypeId(Ids::LIT_PUMPKIN)); + self::register("loom", $factory->fromTypeId(Ids::LOOM)); + self::register("magma", $factory->fromTypeId(Ids::MAGMA)); + self::register("mangrove_button", $factory->fromTypeId(Ids::MANGROVE_BUTTON)); + self::register("mangrove_door", $factory->fromTypeId(Ids::MANGROVE_DOOR)); + self::register("mangrove_fence", $factory->fromTypeId(Ids::MANGROVE_FENCE)); + self::register("mangrove_fence_gate", $factory->fromTypeId(Ids::MANGROVE_FENCE_GATE)); + self::register("mangrove_log", $factory->fromTypeId(Ids::MANGROVE_LOG)); + self::register("mangrove_planks", $factory->fromTypeId(Ids::MANGROVE_PLANKS)); + self::register("mangrove_pressure_plate", $factory->fromTypeId(Ids::MANGROVE_PRESSURE_PLATE)); + self::register("mangrove_slab", $factory->fromTypeId(Ids::MANGROVE_SLAB)); + self::register("mangrove_stairs", $factory->fromTypeId(Ids::MANGROVE_STAIRS)); + self::register("mangrove_trapdoor", $factory->fromTypeId(Ids::MANGROVE_TRAPDOOR)); + self::register("mangrove_wood", $factory->fromTypeId(Ids::MANGROVE_WOOD)); + self::register("material_reducer", $factory->fromTypeId(Ids::MATERIAL_REDUCER)); + self::register("melon", $factory->fromTypeId(Ids::MELON)); + self::register("melon_stem", $factory->fromTypeId(Ids::MELON_STEM)); + self::register("mob_head", $factory->fromTypeId(Ids::MOB_HEAD)); + self::register("monster_spawner", $factory->fromTypeId(Ids::MONSTER_SPAWNER)); + self::register("mossy_cobblestone", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE)); + self::register("mossy_cobblestone_slab", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_SLAB)); + self::register("mossy_cobblestone_stairs", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_STAIRS)); + self::register("mossy_cobblestone_wall", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_WALL)); + self::register("mossy_stone_brick_slab", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_SLAB)); + self::register("mossy_stone_brick_stairs", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_STAIRS)); + self::register("mossy_stone_brick_wall", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_WALL)); + self::register("mossy_stone_bricks", $factory->fromTypeId(Ids::MOSSY_STONE_BRICKS)); + self::register("mushroom_stem", $factory->fromTypeId(Ids::MUSHROOM_STEM)); + self::register("mycelium", $factory->fromTypeId(Ids::MYCELIUM)); + self::register("nether_brick_fence", $factory->fromTypeId(Ids::NETHER_BRICK_FENCE)); + self::register("nether_brick_slab", $factory->fromTypeId(Ids::NETHER_BRICK_SLAB)); + self::register("nether_brick_stairs", $factory->fromTypeId(Ids::NETHER_BRICK_STAIRS)); + self::register("nether_brick_wall", $factory->fromTypeId(Ids::NETHER_BRICK_WALL)); + self::register("nether_bricks", $factory->fromTypeId(Ids::NETHER_BRICKS)); + self::register("nether_portal", $factory->fromTypeId(Ids::NETHER_PORTAL)); + self::register("nether_quartz_ore", $factory->fromTypeId(Ids::NETHER_QUARTZ_ORE)); + self::register("nether_reactor_core", $factory->fromTypeId(Ids::NETHER_REACTOR_CORE)); + self::register("nether_wart", $factory->fromTypeId(Ids::NETHER_WART)); + self::register("nether_wart_block", $factory->fromTypeId(Ids::NETHER_WART_BLOCK)); + self::register("netherrack", $factory->fromTypeId(Ids::NETHERRACK)); + self::register("note_block", $factory->fromTypeId(Ids::NOTE_BLOCK)); + self::register("oak_button", $factory->fromTypeId(Ids::OAK_BUTTON)); + self::register("oak_door", $factory->fromTypeId(Ids::OAK_DOOR)); + self::register("oak_fence", $factory->fromTypeId(Ids::OAK_FENCE)); + self::register("oak_fence_gate", $factory->fromTypeId(Ids::OAK_FENCE_GATE)); + self::register("oak_leaves", $factory->fromTypeId(Ids::OAK_LEAVES)); + self::register("oak_log", $factory->fromTypeId(Ids::OAK_LOG)); + self::register("oak_planks", $factory->fromTypeId(Ids::OAK_PLANKS)); + self::register("oak_pressure_plate", $factory->fromTypeId(Ids::OAK_PRESSURE_PLATE)); + self::register("oak_sapling", $factory->fromTypeId(Ids::OAK_SAPLING)); + self::register("oak_sign", $factory->fromTypeId(Ids::OAK_SIGN)); + self::register("oak_slab", $factory->fromTypeId(Ids::OAK_SLAB)); + self::register("oak_stairs", $factory->fromTypeId(Ids::OAK_STAIRS)); + self::register("oak_trapdoor", $factory->fromTypeId(Ids::OAK_TRAPDOOR)); + self::register("oak_wall_sign", $factory->fromTypeId(Ids::OAK_WALL_SIGN)); + self::register("oak_wood", $factory->fromTypeId(Ids::OAK_WOOD)); + self::register("obsidian", $factory->fromTypeId(Ids::OBSIDIAN)); + self::register("orange_tulip", $factory->fromTypeId(Ids::ORANGE_TULIP)); + self::register("oxeye_daisy", $factory->fromTypeId(Ids::OXEYE_DAISY)); + self::register("packed_ice", $factory->fromTypeId(Ids::PACKED_ICE)); + self::register("peony", $factory->fromTypeId(Ids::PEONY)); + self::register("pink_tulip", $factory->fromTypeId(Ids::PINK_TULIP)); + self::register("podzol", $factory->fromTypeId(Ids::PODZOL)); + self::register("polished_andesite", $factory->fromTypeId(Ids::POLISHED_ANDESITE)); + self::register("polished_andesite_slab", $factory->fromTypeId(Ids::POLISHED_ANDESITE_SLAB)); + self::register("polished_andesite_stairs", $factory->fromTypeId(Ids::POLISHED_ANDESITE_STAIRS)); + self::register("polished_basalt", $factory->fromTypeId(Ids::POLISHED_BASALT)); + self::register("polished_blackstone", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE)); + self::register("polished_blackstone_brick_slab", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_SLAB)); + self::register("polished_blackstone_brick_stairs", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS)); + self::register("polished_blackstone_brick_wall", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_WALL)); + self::register("polished_blackstone_bricks", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICKS)); + self::register("polished_blackstone_button", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BUTTON)); + self::register("polished_blackstone_pressure_plate", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE)); + self::register("polished_blackstone_slab", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_SLAB)); + self::register("polished_blackstone_stairs", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_STAIRS)); + self::register("polished_blackstone_wall", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_WALL)); + self::register("polished_deepslate", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE)); + self::register("polished_deepslate_slab", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_SLAB)); + self::register("polished_deepslate_stairs", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_STAIRS)); + self::register("polished_deepslate_wall", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_WALL)); + self::register("polished_diorite", $factory->fromTypeId(Ids::POLISHED_DIORITE)); + self::register("polished_diorite_slab", $factory->fromTypeId(Ids::POLISHED_DIORITE_SLAB)); + self::register("polished_diorite_stairs", $factory->fromTypeId(Ids::POLISHED_DIORITE_STAIRS)); + self::register("polished_granite", $factory->fromTypeId(Ids::POLISHED_GRANITE)); + self::register("polished_granite_slab", $factory->fromTypeId(Ids::POLISHED_GRANITE_SLAB)); + self::register("polished_granite_stairs", $factory->fromTypeId(Ids::POLISHED_GRANITE_STAIRS)); + self::register("poppy", $factory->fromTypeId(Ids::POPPY)); + self::register("potatoes", $factory->fromTypeId(Ids::POTATOES)); + self::register("powered_rail", $factory->fromTypeId(Ids::POWERED_RAIL)); + self::register("prismarine", $factory->fromTypeId(Ids::PRISMARINE)); + self::register("prismarine_bricks", $factory->fromTypeId(Ids::PRISMARINE_BRICKS)); + self::register("prismarine_bricks_slab", $factory->fromTypeId(Ids::PRISMARINE_BRICKS_SLAB)); + self::register("prismarine_bricks_stairs", $factory->fromTypeId(Ids::PRISMARINE_BRICKS_STAIRS)); + self::register("prismarine_slab", $factory->fromTypeId(Ids::PRISMARINE_SLAB)); + self::register("prismarine_stairs", $factory->fromTypeId(Ids::PRISMARINE_STAIRS)); + self::register("prismarine_wall", $factory->fromTypeId(Ids::PRISMARINE_WALL)); + self::register("pumpkin", $factory->fromTypeId(Ids::PUMPKIN)); + self::register("pumpkin_stem", $factory->fromTypeId(Ids::PUMPKIN_STEM)); + self::register("purple_torch", $factory->fromTypeId(Ids::PURPLE_TORCH)); + self::register("purpur", $factory->fromTypeId(Ids::PURPUR)); + self::register("purpur_pillar", $factory->fromTypeId(Ids::PURPUR_PILLAR)); + self::register("purpur_slab", $factory->fromTypeId(Ids::PURPUR_SLAB)); + self::register("purpur_stairs", $factory->fromTypeId(Ids::PURPUR_STAIRS)); + self::register("quartz", $factory->fromTypeId(Ids::QUARTZ)); + self::register("quartz_bricks", $factory->fromTypeId(Ids::QUARTZ_BRICKS)); + self::register("quartz_pillar", $factory->fromTypeId(Ids::QUARTZ_PILLAR)); + self::register("quartz_slab", $factory->fromTypeId(Ids::QUARTZ_SLAB)); + self::register("quartz_stairs", $factory->fromTypeId(Ids::QUARTZ_STAIRS)); + self::register("rail", $factory->fromTypeId(Ids::RAIL)); + self::register("raw_copper", $factory->fromTypeId(Ids::RAW_COPPER)); + self::register("raw_gold", $factory->fromTypeId(Ids::RAW_GOLD)); + self::register("raw_iron", $factory->fromTypeId(Ids::RAW_IRON)); + self::register("red_mushroom", $factory->fromTypeId(Ids::RED_MUSHROOM)); + self::register("red_mushroom_block", $factory->fromTypeId(Ids::RED_MUSHROOM_BLOCK)); + self::register("red_nether_brick_slab", $factory->fromTypeId(Ids::RED_NETHER_BRICK_SLAB)); + self::register("red_nether_brick_stairs", $factory->fromTypeId(Ids::RED_NETHER_BRICK_STAIRS)); + self::register("red_nether_brick_wall", $factory->fromTypeId(Ids::RED_NETHER_BRICK_WALL)); + self::register("red_nether_bricks", $factory->fromTypeId(Ids::RED_NETHER_BRICKS)); + self::register("red_sand", $factory->fromTypeId(Ids::RED_SAND)); + self::register("red_sandstone", $factory->fromTypeId(Ids::RED_SANDSTONE)); + self::register("red_sandstone_slab", $factory->fromTypeId(Ids::RED_SANDSTONE_SLAB)); + self::register("red_sandstone_stairs", $factory->fromTypeId(Ids::RED_SANDSTONE_STAIRS)); + self::register("red_sandstone_wall", $factory->fromTypeId(Ids::RED_SANDSTONE_WALL)); + self::register("red_torch", $factory->fromTypeId(Ids::RED_TORCH)); + self::register("red_tulip", $factory->fromTypeId(Ids::RED_TULIP)); + self::register("redstone", $factory->fromTypeId(Ids::REDSTONE)); + self::register("redstone_comparator", $factory->fromTypeId(Ids::REDSTONE_COMPARATOR)); + self::register("redstone_lamp", $factory->fromTypeId(Ids::REDSTONE_LAMP)); + self::register("redstone_ore", $factory->fromTypeId(Ids::REDSTONE_ORE)); + self::register("redstone_repeater", $factory->fromTypeId(Ids::REDSTONE_REPEATER)); + self::register("redstone_torch", $factory->fromTypeId(Ids::REDSTONE_TORCH)); + self::register("redstone_wire", $factory->fromTypeId(Ids::REDSTONE_WIRE)); + self::register("reserved6", $factory->fromTypeId(Ids::RESERVED6)); + self::register("rose_bush", $factory->fromTypeId(Ids::ROSE_BUSH)); + self::register("sand", $factory->fromTypeId(Ids::SAND)); + self::register("sandstone", $factory->fromTypeId(Ids::SANDSTONE)); + self::register("sandstone_slab", $factory->fromTypeId(Ids::SANDSTONE_SLAB)); + self::register("sandstone_stairs", $factory->fromTypeId(Ids::SANDSTONE_STAIRS)); + self::register("sandstone_wall", $factory->fromTypeId(Ids::SANDSTONE_WALL)); + self::register("sea_lantern", $factory->fromTypeId(Ids::SEA_LANTERN)); + self::register("sea_pickle", $factory->fromTypeId(Ids::SEA_PICKLE)); + self::register("shulker_box", $factory->fromTypeId(Ids::SHULKER_BOX)); + self::register("slime", $factory->fromTypeId(Ids::SLIME)); + self::register("smoker", $factory->fromTypeId(Ids::SMOKER)); + self::register("smooth_basalt", $factory->fromTypeId(Ids::SMOOTH_BASALT)); + self::register("smooth_quartz", $factory->fromTypeId(Ids::SMOOTH_QUARTZ)); + self::register("smooth_quartz_slab", $factory->fromTypeId(Ids::SMOOTH_QUARTZ_SLAB)); + self::register("smooth_quartz_stairs", $factory->fromTypeId(Ids::SMOOTH_QUARTZ_STAIRS)); + self::register("smooth_red_sandstone", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE)); + self::register("smooth_red_sandstone_slab", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE_SLAB)); + self::register("smooth_red_sandstone_stairs", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE_STAIRS)); + self::register("smooth_sandstone", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE)); + self::register("smooth_sandstone_slab", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE_SLAB)); + self::register("smooth_sandstone_stairs", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE_STAIRS)); + self::register("smooth_stone", $factory->fromTypeId(Ids::SMOOTH_STONE)); + self::register("smooth_stone_slab", $factory->fromTypeId(Ids::SMOOTH_STONE_SLAB)); + self::register("snow", $factory->fromTypeId(Ids::SNOW)); + self::register("snow_layer", $factory->fromTypeId(Ids::SNOW_LAYER)); + self::register("soul_fire", $factory->fromTypeId(Ids::SOUL_FIRE)); + self::register("soul_sand", $factory->fromTypeId(Ids::SOUL_SAND)); + self::register("sponge", $factory->fromTypeId(Ids::SPONGE)); + self::register("spruce_button", $factory->fromTypeId(Ids::SPRUCE_BUTTON)); + self::register("spruce_door", $factory->fromTypeId(Ids::SPRUCE_DOOR)); + self::register("spruce_fence", $factory->fromTypeId(Ids::SPRUCE_FENCE)); + self::register("spruce_fence_gate", $factory->fromTypeId(Ids::SPRUCE_FENCE_GATE)); + self::register("spruce_leaves", $factory->fromTypeId(Ids::SPRUCE_LEAVES)); + self::register("spruce_log", $factory->fromTypeId(Ids::SPRUCE_LOG)); + self::register("spruce_planks", $factory->fromTypeId(Ids::SPRUCE_PLANKS)); + self::register("spruce_pressure_plate", $factory->fromTypeId(Ids::SPRUCE_PRESSURE_PLATE)); + self::register("spruce_sapling", $factory->fromTypeId(Ids::SPRUCE_SAPLING)); + self::register("spruce_sign", $factory->fromTypeId(Ids::SPRUCE_SIGN)); + self::register("spruce_slab", $factory->fromTypeId(Ids::SPRUCE_SLAB)); + self::register("spruce_stairs", $factory->fromTypeId(Ids::SPRUCE_STAIRS)); + self::register("spruce_trapdoor", $factory->fromTypeId(Ids::SPRUCE_TRAPDOOR)); + self::register("spruce_wall_sign", $factory->fromTypeId(Ids::SPRUCE_WALL_SIGN)); + self::register("spruce_wood", $factory->fromTypeId(Ids::SPRUCE_WOOD)); + self::register("stained_clay", $factory->fromTypeId(Ids::STAINED_CLAY)); + self::register("stained_glass", $factory->fromTypeId(Ids::STAINED_GLASS)); + self::register("stained_glass_pane", $factory->fromTypeId(Ids::STAINED_GLASS_PANE)); + self::register("stained_hardened_glass", $factory->fromTypeId(Ids::STAINED_HARDENED_GLASS)); + self::register("stained_hardened_glass_pane", $factory->fromTypeId(Ids::STAINED_HARDENED_GLASS_PANE)); + self::register("stone", $factory->fromTypeId(Ids::STONE)); + self::register("stone_brick_slab", $factory->fromTypeId(Ids::STONE_BRICK_SLAB)); + self::register("stone_brick_stairs", $factory->fromTypeId(Ids::STONE_BRICK_STAIRS)); + self::register("stone_brick_wall", $factory->fromTypeId(Ids::STONE_BRICK_WALL)); + self::register("stone_bricks", $factory->fromTypeId(Ids::STONE_BRICKS)); + self::register("stone_button", $factory->fromTypeId(Ids::STONE_BUTTON)); + self::register("stone_pressure_plate", $factory->fromTypeId(Ids::STONE_PRESSURE_PLATE)); + self::register("stone_slab", $factory->fromTypeId(Ids::STONE_SLAB)); + self::register("stone_stairs", $factory->fromTypeId(Ids::STONE_STAIRS)); + self::register("stonecutter", $factory->fromTypeId(Ids::STONECUTTER)); + self::register("sugarcane", $factory->fromTypeId(Ids::SUGARCANE)); + self::register("sunflower", $factory->fromTypeId(Ids::SUNFLOWER)); + self::register("sweet_berry_bush", $factory->fromTypeId(Ids::SWEET_BERRY_BUSH)); + self::register("tall_grass", $factory->fromTypeId(Ids::TALL_GRASS)); + self::register("tnt", $factory->fromTypeId(Ids::TNT)); + self::register("torch", $factory->fromTypeId(Ids::TORCH)); + self::register("trapped_chest", $factory->fromTypeId(Ids::TRAPPED_CHEST)); + self::register("tripwire", $factory->fromTypeId(Ids::TRIPWIRE)); + self::register("tripwire_hook", $factory->fromTypeId(Ids::TRIPWIRE_HOOK)); + self::register("underwater_torch", $factory->fromTypeId(Ids::UNDERWATER_TORCH)); + self::register("vines", $factory->fromTypeId(Ids::VINES)); + self::register("wall_banner", $factory->fromTypeId(Ids::WALL_BANNER)); + self::register("wall_coral_fan", $factory->fromTypeId(Ids::WALL_CORAL_FAN)); + self::register("warped_button", $factory->fromTypeId(Ids::WARPED_BUTTON)); + self::register("warped_door", $factory->fromTypeId(Ids::WARPED_DOOR)); + self::register("warped_fence", $factory->fromTypeId(Ids::WARPED_FENCE)); + self::register("warped_fence_gate", $factory->fromTypeId(Ids::WARPED_FENCE_GATE)); + self::register("warped_hyphae", $factory->fromTypeId(Ids::WARPED_HYPHAE)); + self::register("warped_planks", $factory->fromTypeId(Ids::WARPED_PLANKS)); + self::register("warped_pressure_plate", $factory->fromTypeId(Ids::WARPED_PRESSURE_PLATE)); + self::register("warped_slab", $factory->fromTypeId(Ids::WARPED_SLAB)); + self::register("warped_stairs", $factory->fromTypeId(Ids::WARPED_STAIRS)); + self::register("warped_stem", $factory->fromTypeId(Ids::WARPED_STEM)); + self::register("warped_trapdoor", $factory->fromTypeId(Ids::WARPED_TRAPDOOR)); + self::register("water", $factory->fromTypeId(Ids::WATER)); + self::register("weighted_pressure_plate_heavy", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY)); + self::register("weighted_pressure_plate_light", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT)); + self::register("wheat", $factory->fromTypeId(Ids::WHEAT)); + self::register("white_tulip", $factory->fromTypeId(Ids::WHITE_TULIP)); + self::register("wool", $factory->fromTypeId(Ids::WOOL)); } } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index ad4311a387..c36b78608f 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -45,10 +45,11 @@ final class ItemBlock extends Item{ public function getBlock(?int $clickedFace = null) : Block{ //TODO: HACKY MESS, CLEAN IT UP - $blockType = BlockFactory::getInstance()->fromTypeId($this->blockTypeId); - if($blockType === null){ + $factory = BlockFactory::getInstance(); + if(!$factory->isRegistered($this->blockTypeId)){ return VanillaBlocks::AIR(); } + $blockType = BlockFactory::getInstance()->fromTypeId($this->blockTypeId); $blockType->decodeTypeData($this->blockTypeData); return $blockType; } From a059d03b37bda3482fa24413ba09651e41ab83eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 13:43:26 +0100 Subject: [PATCH 0261/1858] Remove BlockFactory::get(), optimise fromFullBlock() pathway --- src/block/BlockFactory.php | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 5c6928920d..c5ad465b1d 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -854,30 +854,6 @@ class BlockFactory{ } } - /** - * @internal - * @see VanillaBlocks - * - * Deserializes a block from the provided type ID and internal state data. - */ - 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 = ($typeId << Block::INTERNAL_STATE_DATA_BITS) | $stateData; - if($index < 0){ - throw new \InvalidArgumentException("Block ID $typeId is out of bounds"); - } - if(isset($this->fullList[$index])) { //hot - $block = clone $this->fullList[$index]; - }else{ - $block = new UnknownBlock(new BID($typeId), BreakInfo::instant(), $stateData); - } - - return $block; - } - /** * @internal * Returns the default state of the block type associated with the given type ID. @@ -891,7 +867,18 @@ class BlockFactory{ } public function fromFullBlock(int $fullState) : Block{ - return $this->get($fullState >> Block::INTERNAL_STATE_DATA_BITS, $fullState & Block::INTERNAL_STATE_DATA_MASK); + if($fullState < 0){ + throw new \InvalidArgumentException("Block state ID cannot be negative"); + } + if(isset($this->fullList[$fullState])) { //hot + $block = clone $this->fullList[$fullState]; + }else{ + $typeId = $fullState >> Block::INTERNAL_STATE_DATA_BITS; + $stateData = $fullState & Block::INTERNAL_STATE_DATA_MASK; + $block = new UnknownBlock(new BID($typeId), BreakInfo::instant(), $stateData); + } + + return $block; } /** From 0a23e91329a8358d2c8f6dede25bd0f6b28d25ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 13:46:19 +0100 Subject: [PATCH 0262/1858] Rename BlockFactory::fromFullBlock() -> BlockFactory::fromStateId() --- src/block/BlockFactory.php | 12 ++++++------ src/block/InfestedStone.php | 2 +- src/block/tile/FlowerPot.php | 2 +- .../convert/BlockObjectToBlockStateSerializer.php | 2 +- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/entity/object/FallingBlock.php | 2 +- src/item/ItemBlockWallOrFloor.php | 4 ++-- src/item/ItemFactory.php | 2 +- src/world/SimpleChunkManager.php | 2 +- src/world/World.php | 8 ++++---- src/world/generator/populator/GroundCover.php | 4 ++-- tests/phpunit/block/BlockTest.php | 8 ++++---- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index c5ad465b1d..4efc04cb6d 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -866,15 +866,15 @@ class BlockFactory{ throw new \InvalidArgumentException("Block ID $typeId is not registered"); } - public function fromFullBlock(int $fullState) : Block{ - if($fullState < 0){ + public function fromStateId(int $stateId) : Block{ + if($stateId < 0){ throw new \InvalidArgumentException("Block state ID cannot be negative"); } - if(isset($this->fullList[$fullState])) { //hot - $block = clone $this->fullList[$fullState]; + if(isset($this->fullList[$stateId])) { //hot + $block = clone $this->fullList[$stateId]; }else{ - $typeId = $fullState >> Block::INTERNAL_STATE_DATA_BITS; - $stateData = $fullState & Block::INTERNAL_STATE_DATA_MASK; + $typeId = $stateId >> Block::INTERNAL_STATE_DATA_BITS; + $stateData = $stateId & Block::INTERNAL_STATE_DATA_MASK; $block = new UnknownBlock(new BID($typeId), BreakInfo::instant(), $stateData); } diff --git a/src/block/InfestedStone.php b/src/block/InfestedStone.php index 6fbda8eea3..7700b572cc 100644 --- a/src/block/InfestedStone.php +++ b/src/block/InfestedStone.php @@ -35,7 +35,7 @@ final class InfestedStone extends Opaque{ } public function getImitatedBlock() : Block{ - return BlockFactory::getInstance()->fromFullBlock($this->imitated); + return BlockFactory::getInstance()->fromStateId($this->imitated); } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index ec5987346b..3544cd5fba 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -64,7 +64,7 @@ class FlowerPot extends Spawnable{ }catch(BlockStateDeserializeException $e){ throw new SavedDataLoadingException("Error deserializing plant for flower pot: " . $e->getMessage(), 0, $e); } - $this->setPlant(BlockFactory::getInstance()->fromFullBlock($blockStateId)); + $this->setPlant(BlockFactory::getInstance()->fromStateId($blockStateId)); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 93daadec27..f114ed97d4 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -172,7 +172,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ public function serialize(int $stateId) : BlockStateData{ //TODO: singleton usage not ideal - return $this->serializeBlock(BlockFactory::getInstance()->fromFullBlock($stateId)); + return $this->serializeBlock(BlockFactory::getInstance()->fromStateId($stateId)); } /** diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 287e633986..2d8570b5b7 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -76,7 +76,7 @@ final class ItemDeserializer{ } //TODO: worth caching this or not? - return BlockFactory::getInstance()->fromFullBlock($block)->asItem(); + return BlockFactory::getInstance()->fromStateId($block)->asItem(); } $id = $data->getName(); if(!isset($this->deserializers[$id])){ diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index a7e495a241..39fc2320a8 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -90,7 +90,7 @@ class FallingBlock extends Entity{ throw new SavedDataLoadingException($e->getMessage(), 0, $e); } - return $factory->fromFullBlock($blockStateId); + return $factory->fromStateId($blockStateId); } public function canCollideWith(Entity $entity) : bool{ diff --git a/src/item/ItemBlockWallOrFloor.php b/src/item/ItemBlockWallOrFloor.php index cb706965a7..bd1213b349 100644 --- a/src/item/ItemBlockWallOrFloor.php +++ b/src/item/ItemBlockWallOrFloor.php @@ -40,9 +40,9 @@ class ItemBlockWallOrFloor extends Item{ public function getBlock(?int $clickedFace = null) : Block{ if($clickedFace !== null && Facing::axis($clickedFace) !== Axis::Y){ - return BlockFactory::getInstance()->fromFullBlock($this->wallVariant); + return BlockFactory::getInstance()->fromStateId($this->wallVariant); } - return BlockFactory::getInstance()->fromFullBlock($this->floorVariant); + return BlockFactory::getInstance()->fromStateId($this->floorVariant); } public function getFuelTime() : int{ diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 6804356ae8..0de8cfcd8a 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -473,7 +473,7 @@ class ItemFactory{ if($blockStateData !== null){ try{ $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); - $item = new ItemBlock(BlockFactory::getInstance()->fromFullBlock($blockStateId)); + $item = new ItemBlock(BlockFactory::getInstance()->fromStateId($blockStateId)); }catch(BlockStateDeserializeException $e){ throw new SavedDataLoadingException("Failed to deserialize itemblock: " . $e->getMessage(), 0, $e); } diff --git a/src/world/SimpleChunkManager.php b/src/world/SimpleChunkManager.php index e2ed3138e5..85849c450f 100644 --- a/src/world/SimpleChunkManager.php +++ b/src/world/SimpleChunkManager.php @@ -41,7 +41,7 @@ class SimpleChunkManager implements ChunkManager{ public function getBlockAt(int $x, int $y, int $z) : Block{ if($this->isInWorld($x, $y, $z) && ($chunk = $this->getChunk($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE)) !== null){ - return BlockFactory::getInstance()->fromFullBlock($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); + return BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); } return VanillaBlocks::AIR(); } diff --git a/src/world/World.php b/src/world/World.php index 2dfb004977..fab04e87d0 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -444,7 +444,7 @@ class World implements ChunkManager{ if($blockStateData === null){ continue; } - $block = BlockFactory::getInstance()->fromFullBlock(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); + $block = BlockFactory::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); }else{ //TODO: we probably ought to log an error here continue; @@ -1112,7 +1112,7 @@ class World implements ChunkManager{ $state = $subChunk->getFullBlock($x, $y, $z); if(isset($this->randomTickBlocks[$state])){ - $block = $blockFactory->fromFullBlock($state); + $block = $blockFactory->fromStateId($state); $block->position($this, $chunkX * Chunk::EDGE_LENGTH + $x, ($Y << SubChunk::COORD_BIT_SIZE) + $y, $chunkZ * Chunk::EDGE_LENGTH + $z); $block->onRandomTick(); } @@ -1528,7 +1528,7 @@ class World implements ChunkManager{ $chunk = $this->chunks[$chunkHash] ?? null; if($chunk !== null){ - $block = BlockFactory::getInstance()->fromFullBlock($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); + $block = BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); }else{ $addToCache = false; $block = VanillaBlocks::AIR(); @@ -2146,7 +2146,7 @@ class World implements ChunkManager{ $localY = $tilePosition->getFloorY(); $localZ = $tilePosition->getFloorZ() & Chunk::COORD_MASK; - $newBlock = BlockFactory::getInstance()->fromFullBlock($chunk->getFullBlock($localX, $localY, $localZ)); + $newBlock = BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($localX, $localY, $localZ)); $expectedTileClass = $newBlock->getIdInfo()->getTileClass(); if( $expectedTileClass === null || //new block doesn't expect a tile diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 193905ccec..2aa6cca9b9 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -51,7 +51,7 @@ class GroundCover implements Populator{ $startY = 127; for(; $startY > 0; --$startY){ - if(!$factory->fromFullBlock($chunk->getFullBlock($x, $startY, $z))->isTransparent()){ + if(!$factory->fromStateId($chunk->getFullBlock($x, $startY, $z))->isTransparent()){ break; } } @@ -59,7 +59,7 @@ class GroundCover implements Populator{ $endY = $startY - count($cover); for($y = $startY; $y > $endY && $y >= 0; --$y){ $b = $cover[$startY - $y]; - $id = $factory->fromFullBlock($chunk->getFullBlock($x, $y, $z)); + $id = $factory->fromStateId($chunk->getFullBlock($x, $y, $z)); if($id->getTypeId() === BlockTypeIds::AIR && $b->isSolid()){ break; } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 1e420beff3..3b8d704d97 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -54,7 +54,7 @@ class BlockTest extends TestCase{ public function testDeliberateOverrideBlock() : void{ $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", BlockBreakInfo::instant()); $this->blockFactory->register($block, true); - self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromFullBlock($block->getStateId())); + self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromStateId($block->getStateId())); } /** @@ -65,7 +65,7 @@ class BlockTest extends TestCase{ if(!$this->blockFactory->isRegistered($i)){ $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", BlockBreakInfo::instant()); $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromFullBlock($b->getStateId())); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); return; } } @@ -88,8 +88,8 @@ class BlockTest extends TestCase{ */ public function testBlockFactoryClone() : void{ foreach($this->blockFactory->getAllKnownStates() as $k => $state){ - $b1 = $this->blockFactory->fromFullBlock($k); - $b2 = $this->blockFactory->fromFullBlock($k); + $b1 = $this->blockFactory->fromStateId($k); + $b2 = $this->blockFactory->fromStateId($k); self::assertNotSame($b1, $b2); } } From 1714e2fd351a1c38523ef719a8fed88aae22ffc1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 14:07:34 +0100 Subject: [PATCH 0263/1858] CoralFan: fixed coralType not being initialized --- src/item/CoralFan.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index 8beceee140..d6aae4f8ca 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; +use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\CoralTypeIdMap; @@ -34,6 +35,7 @@ final class CoralFan extends Item{ use CoralTypeTrait; public function __construct(private ItemIdentifierFlattened $identifierFlattened){ + $this->coralType = CoralType::TUBE(); parent::__construct($this->identifierFlattened, VanillaBlocks::CORAL_FAN()->getName()); } From 325f1cf82e21fc3ba6cc9f0dd87c36723bb21ec4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 14:13:37 +0100 Subject: [PATCH 0264/1858] Generalize runtime block data serialization we want to reuse this code for item type data --- src/block/Anvil.php | 12 +- src/block/Bamboo.php | 8 +- src/block/BambooSapling.php | 8 +- src/block/Barrel.php | 8 +- src/block/Bed.php | 8 +- src/block/Bedrock.php | 8 +- src/block/Bell.php | 16 +- src/block/Block.php | 20 +- src/block/BlockFactory.php | 6 +- src/block/BrewingStand.php | 31 +++- src/block/Button.php | 8 +- src/block/Cactus.php | 8 +- src/block/Cake.php | 8 +- src/block/CocoaBlock.php | 8 +- src/block/Crops.php | 8 +- src/block/DaylightSensor.php | 8 +- src/block/DetectorRail.php | 8 +- src/block/Dirt.php | 8 +- src/block/Door.php | 8 +- src/block/DoublePlant.php | 8 +- src/block/EndPortalFrame.php | 8 +- src/block/Farmland.php | 8 +- src/block/FenceGate.php | 8 +- src/block/Fire.php | 8 +- src/block/FloorCoralFan.php | 8 +- src/block/FrostedIce.php | 8 +- src/block/Furnace.php | 8 +- src/block/Hopper.php | 12 +- src/block/ItemFrame.php | 8 +- src/block/Lantern.php | 8 +- src/block/Leaves.php | 8 +- src/block/Lectern.php | 8 +- src/block/Lever.php | 16 +- src/block/Light.php | 8 +- src/block/Liquid.php | 8 +- src/block/NetherPortal.php | 8 +- src/block/NetherWartPlant.php | 8 +- src/block/Rail.php | 12 +- src/block/RedMushroomBlock.php | 16 +- src/block/RedstoneComparator.php | 8 +- src/block/RedstoneLamp.php | 8 +- src/block/RedstoneOre.php | 8 +- src/block/RedstoneRepeater.php | 8 +- src/block/RedstoneTorch.php | 8 +- src/block/Sapling.php | 8 +- src/block/SeaPickle.php | 8 +- src/block/ShulkerBox.php | 8 +- src/block/SimplePressurePlate.php | 8 +- src/block/Skull.php | 24 +-- src/block/Slab.php | 16 +- src/block/SnowLayer.php | 8 +- src/block/Sponge.php | 8 +- src/block/Stair.php | 8 +- src/block/StraightOnlyRail.php | 12 +- src/block/Sugarcane.php | 8 +- src/block/SweetBerryBush.php | 8 +- src/block/TNT.php | 12 +- src/block/Torch.php | 12 +- src/block/Trapdoor.php | 8 +- src/block/Tripwire.php | 8 +- src/block/TripwireHook.php | 8 +- src/block/UnknownBlock.php | 8 +- src/block/Vine.php | 8 +- src/block/Wall.php | 8 +- src/block/WallCoralFan.php | 8 +- src/block/Wood.php | 8 +- .../AnalogRedstoneSignalEmitterTrait.php | 8 +- src/block/utils/AnyFacingTrait.php | 8 +- src/block/utils/ColoredTrait.php | 16 +- src/block/utils/CoralTypeTrait.php | 16 +- src/block/utils/HorizontalFacingTrait.php | 8 +- src/block/utils/PillarRotationTrait.php | 8 +- .../utils/RailPoweredByRedstoneTrait.php | 8 +- src/block/utils/SignLikeRotationTrait.php | 8 +- ...InvalidSerializedRuntimeDataException.php} | 4 +- ...ckDataReader.php => RuntimeDataReader.php} | 11 +- ...ckDataWriter.php => RuntimeDataWriter.php} | 4 +- src/data/runtime/RuntimeEnumDeserializer.php | 108 +++++++++++ ...erHelper.php => RuntimeEnumSerializer.php} | 88 ++------- .../runtime/block/BlockDataReaderHelper.php | 174 ------------------ 80 files changed, 494 insertions(+), 608 deletions(-) rename src/{block/utils/InvalidBlockStateException.php => data/runtime/InvalidSerializedRuntimeDataException.php} (86%) rename src/data/runtime/{block/BlockDataReader.php => RuntimeDataReader.php} (89%) rename src/data/runtime/{block/BlockDataWriter.php => RuntimeDataWriter.php} (97%) create mode 100644 src/data/runtime/RuntimeEnumDeserializer.php rename src/data/runtime/{block/BlockDataWriterHelper.php => RuntimeEnumSerializer.php} (55%) delete mode 100644 src/data/runtime/block/BlockDataReaderHelper.php diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 660554ac02..a859210fd4 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -28,8 +28,8 @@ use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -49,21 +49,21 @@ class Anvil extends Transparent implements Fallable{ public function getRequiredTypeDataBits() : int{ return 2; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED)); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeInt(2, $this->getDamage()); } public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->setFacing($r->readHorizontalFacing()); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->getFacing()); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 6011b88a16..eaf6c26db6 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; @@ -58,13 +58,13 @@ class Bamboo extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->setLeafSize($r->readBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES)); $this->setThick($r->readBool()); $this->setReady($r->readBool()); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(2, $this->getLeafSize()); $w->writeBool($this->isThick()); $w->writeBool($this->isReady()); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 05addc0579..e1f23c5657 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; @@ -39,11 +39,11 @@ final class BambooSapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->setReady($r->readBool()); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->isReady()); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index e26b4aa8e6..2efef6bbcf 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -41,12 +41,12 @@ class Barrel extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->setFacing($r->readFacing()); $this->setOpen($r->readBool()); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->getFacing()); $w->writeBool($this->isOpen()); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 81cbd73cc7..4fd65e9090 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -28,8 +28,8 @@ use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; @@ -56,13 +56,13 @@ class Bed extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->occupied = $r->readBool(); $this->head = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->occupied); $w->writeBool($this->head); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 8a187b7412..ac8e95037b 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -23,19 +23,19 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; class Bedrock extends Opaque{ private bool $burnsForever = false; public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->burnsForever = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index 175be9d47b..bc13a33247 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -27,10 +27,10 @@ use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -51,13 +51,13 @@ final class Bell extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ - $this->attachmentType = BlockDataReaderHelper::readBellAttachmentType($r); + protected function decodeState(RuntimeDataReader $r) : void{ + $this->attachmentType = RuntimeEnumDeserializer::readBellAttachmentType($r); $this->facing = $r->readHorizontalFacing(); } - protected function encodeState(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeBellAttachmentType($w, $this->attachmentType); + protected function encodeState(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeBellAttachmentType($w, $this->attachmentType); $w->writeHorizontalFacing($this->facing); } diff --git a/src/block/Block.php b/src/block/Block.php index baad10b8f2..2d55a38795 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -29,8 +29,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; @@ -100,7 +100,7 @@ class Block{ final public function decodeTypeData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); $givenBits = $typeBits; - $reader = new BlockDataReader($givenBits, $data); + $reader = new RuntimeDataReader($givenBits, $data); $this->decodeType($reader); $readBits = $reader->getOffset(); @@ -113,7 +113,7 @@ class Block{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); $givenBits = $typeBits + $stateBits; - $reader = new BlockDataReader($givenBits, $data); + $reader = new RuntimeDataReader($givenBits, $data); $this->decodeTypeData($reader->readInt($typeBits)); $this->decodeState($reader); @@ -123,18 +123,18 @@ class Block{ } } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ //NOOP } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ //NOOP } final public function computeTypeData() : int{ $typeBits = $this->getRequiredTypeDataBits(); $requiredBits = $typeBits; - $writer = new BlockDataWriter($requiredBits); + $writer = new RuntimeDataWriter($requiredBits); $this->encodeType($writer); $writtenBits = $writer->getOffset(); @@ -152,7 +152,7 @@ class Block{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); $requiredBits = $typeBits + $stateBits; - $writer = new BlockDataWriter($requiredBits); + $writer = new RuntimeDataWriter($requiredBits); $writer->writeInt($typeBits, $this->computeTypeData()); $this->encodeState($writer); @@ -164,11 +164,11 @@ class Block{ return $writer->getValue(); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ //NOOP } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ //NOOP } diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 4efc04cb6d..1bc685686c 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -50,9 +50,9 @@ use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WoodType; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\item\Item; use pocketmine\item\ToolTier; use pocketmine\utils\AssumptionFailedError; @@ -829,9 +829,9 @@ class BlockFactory{ $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"); + throw new InvalidSerializedRuntimeDataException("Corrupted state"); } - }catch(InvalidBlockStateException $e){ //invalid property combination, leave it + }catch(InvalidSerializedRuntimeDataException $e){ //invalid property combination, leave it continue; } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index cee9d0cc3a..463ef5adb2 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -26,10 +26,8 @@ namespace pocketmine\block; use pocketmine\block\tile\BrewingStand as TileBrewingStand; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -48,12 +46,29 @@ class BrewingStand extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ - $this->setSlots(BlockDataReaderHelper::readBrewingStandSlotKeySet($r)); + protected function decodeState(RuntimeDataReader $r) : void{ + $result = []; + foreach([ + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), + ] as $member){ + if($r->readBool()){ + $result[$member->id()] = $member; + } + } + + $this->setSlots($result); } - protected function encodeState(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeBrewingStandSlotKeySet($w, $this->slots); + protected function encodeState(RuntimeDataWriter $w) : void{ + foreach([ + \pocketmine\block\utils\BrewingStandSlot::EAST(), + \pocketmine\block\utils\BrewingStandSlot::NORTHWEST(), + \pocketmine\block\utils\BrewingStandSlot::SOUTHWEST(), + ] as $member){ + $w->writeBool(isset($this->slots[$member->id()])); + } } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Button.php b/src/block/Button.php index 7e813af267..6cdcae3514 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -41,12 +41,12 @@ abstract class Button extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readFacing(); $this->pressed = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); $w->writeBool($this->pressed); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 83b8dcca44..cc8c602bf2 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\event\block\BlockGrowEvent; use pocketmine\event\entity\EntityDamageByBlockEvent; @@ -44,11 +44,11 @@ class Cactus extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 1bd28aa57f..cbb8f93891 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\FoodSource; use pocketmine\entity\Living; @@ -43,11 +43,11 @@ class Cake extends Transparent implements FoodSource{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->bites = $r->readBoundedInt(3, 0, self::MAX_BITES); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->bites); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index f0f9b24640..5056598c31 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -49,12 +49,12 @@ class CocoaBlock extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeInt(2, $this->age); } diff --git a/src/block/Crops.php b/src/block/Crops.php index 15fc757522..f916dfb7df 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -41,11 +41,11 @@ abstract class Crops extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(3, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index f2f2fd6c81..8718b89c2f 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -44,12 +44,12 @@ class DaylightSensor extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->signalStrength = $r->readBoundedInt(4, 0, 15); $this->inverted = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->signalStrength); $w->writeBool($this->inverted); } diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 61667e9b81..7165972147 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -23,20 +23,20 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ parent::decodeState($r); $this->activated = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ parent::encodeState($w); $w->writeBool($this->activated); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index e8ae438512..a3c6da660a 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Hoe; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -37,11 +37,11 @@ class Dirt extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->coarse = $r->readBool(); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeBool($this->coarse); } diff --git a/src/block/Door.php b/src/block/Door.php index c00b6d1711..6657a18f04 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -44,14 +44,14 @@ class Door extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->top = $r->readBool(); $this->hingeRight = $r->readBool(); $this->open = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->top); $w->writeBool($this->hingeRight); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 29f567d12a..f291298f48 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -36,11 +36,11 @@ class DoublePlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->top = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index f69262c976..5cc4294c89 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -38,12 +38,12 @@ class EndPortalFrame extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->eye = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->eye); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index fbd2212d08..989254bc93 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityTrampleFarmlandEvent; @@ -40,11 +40,11 @@ class Farmland extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index b9bc95e183..4fa5313637 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodTypeTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -45,13 +45,13 @@ class FenceGate extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->open = $r->readBool(); $this->inWall = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->open); $w->writeBool($this->inWall); diff --git a/src/block/Fire.php b/src/block/Fire.php index c04926cc80..a176941cd2 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockBurnEvent; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\math\Facing; @@ -42,11 +42,11 @@ class Fire extends BaseFire{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 3a37af7490..24769ae5bb 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; @@ -40,11 +40,11 @@ final class FloorCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->axis = $r->readHorizontalAxis(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalAxis($this->axis); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 184f2ba871..60a42a4a52 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockMeltEvent; use function mt_rand; @@ -35,11 +35,11 @@ class FrostedIce extends Ice{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(2, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 46bd76081b..c1b29c9863 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -41,12 +41,12 @@ class Furnace extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->lit = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->lit); } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index bba31f3145..c1d01654c1 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,11 +24,11 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -43,16 +43,16 @@ class Hopper extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::UP){ - throw new InvalidBlockStateException("Hopper may not face upward"); + throw new InvalidSerializedRuntimeDataException("Hopper may not face upward"); } $this->facing = $facing; $this->powered = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); $w->writeBool($this->powered); } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 38ac5fc441..cbaed26ec5 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -49,12 +49,12 @@ class ItemFrame extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readFacing(); $this->hasMap = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); $w->writeBool($this->hasMap); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index db560584cb..bd620a58d3 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -39,11 +39,11 @@ class Lantern extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->hanging = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 550afa3225..93c423e06a 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\TreeType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\LeavesDecayEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -50,12 +50,12 @@ class Leaves extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->noDecay = $r->readBool(); $this->checkDecay = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->noDecay); $w->writeBool($this->checkDecay); } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index e17d299613..6e7026ff80 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -27,8 +27,8 @@ use pocketmine\block\tile\Lectern as TileLectern; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\math\AxisAlignedBB; @@ -49,12 +49,12 @@ class Lectern extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->producingSignal = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->producingSignal); } diff --git a/src/block/Lever.php b/src/block/Lever.php index d65b478496..d25ce1c44d 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -24,10 +24,10 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\LeverFacing; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -49,13 +49,13 @@ class Lever extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ - $this->facing = BlockDataReaderHelper::readLeverFacing($r); + protected function decodeState(RuntimeDataReader $r) : void{ + $this->facing = RuntimeEnumDeserializer::readLeverFacing($r); $this->activated = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeLeverFacing($w, $this->facing); + protected function encodeState(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeLeverFacing($w, $this->facing); $w->writeBool($this->activated); } diff --git a/src/block/Light.php b/src/block/Light.php index 6f2ccbf577..f21fc35f93 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -37,11 +37,11 @@ final class Light extends Flowable{ public function getRequiredTypeDataBits() : int{ return 4; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->level = $r->readBoundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 1ad1c112a9..93c8219f5c 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\MinimumCostFlowCalculator; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\event\block\BlockFormEvent; use pocketmine\event\block\BlockSpreadEvent; @@ -51,13 +51,13 @@ abstract class Liquid extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->decay = $r->readBoundedInt(3, 0, self::MAX_DECAY); $this->falling = $r->readBool(); $this->still = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->decay); $w->writeBool($this->falling); $w->writeBool($this->still); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 883eb28996..0c957a6173 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -37,11 +37,11 @@ class NetherPortal extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->axis = $r->readHorizontalAxis(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalAxis($this->axis); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 5d6bc8a31a..d6c2287b13 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -40,11 +40,11 @@ class NetherWartPlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(2, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index a98b51416b..5cce509499 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Facing; use function array_keys; use function implode; @@ -38,15 +38,15 @@ class Rail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $railShape = $r->readInt(4); if(!isset(RailConnectionInfo::CONNECTIONS[$railShape]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$railShape])){ - throw new InvalidBlockStateException("Invalid rail shape $railShape"); + throw new InvalidSerializedRuntimeDataException("Invalid rail shape $railShape"); } $this->railShape = $railShape; } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 2a4b9906bf..17f9d44907 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -24,10 +24,10 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\MushroomBlockType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use function mt_rand; @@ -41,12 +41,12 @@ class RedMushroomBlock extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ - $this->mushroomBlockType = BlockDataReaderHelper::readMushroomBlockType($r); + protected function decodeState(RuntimeDataReader $r) : void{ + $this->mushroomBlockType = RuntimeEnumDeserializer::readMushroomBlockType($r); } - protected function encodeState(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeMushroomBlockType($w, $this->mushroomBlockType); + protected function encodeState(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeMushroomBlockType($w, $this->mushroomBlockType); } public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index a531889d15..769c7ef96a 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -28,8 +28,8 @@ use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -47,14 +47,14 @@ class RedstoneComparator extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->isSubtractMode = $r->readBool(); $this->powered = $r->readBool(); //TODO: this doesn't call the decoder from AnalogRedstoneSignalEmitter } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->isSubtractMode); $w->writeBool($this->powered); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index e81f8e805e..4b10797a4d 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -24,19 +24,19 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\PoweredByRedstoneTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->powered = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index e0a183860c..1a7ed5e3b1 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; @@ -36,11 +36,11 @@ class RedstoneOre extends Opaque{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->lit = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 5e3ff6ba25..3b77bb262c 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -46,13 +46,13 @@ class RedstoneRepeater extends Flowable{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->delay = $r->readBoundedInt(2, self::MIN_DELAY - 1, self::MAX_DELAY - 1) + 1; $this->powered = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeInt(2, $this->delay - 1); $w->writeBool($this->powered); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index de6f1c92f0..420a070983 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -23,20 +23,20 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; class RedstoneTorch extends Torch{ protected bool $lit = true; public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ parent::decodeState($r); $this->lit = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ parent::encodeState($w); $w->writeBool($this->lit); } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 39aaba3ba5..82afb3334c 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\TreeType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -49,11 +49,11 @@ class Sapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->ready = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 3dd1f74ad4..4be3b89d7b 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; @@ -41,12 +41,12 @@ class SeaPickle extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->count = $r->readBoundedInt(2, self::MIN_COUNT - 1, self::MAX_COUNT - 1) + 1; $this->underwater = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(2, $this->count - 1); $w->writeBool($this->underwater); } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 49aa3ae85c..f37a8a73fb 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -37,11 +37,11 @@ class ShulkerBox extends Opaque{ public function getRequiredStateDataBits() : int{ return 0; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ //NOOP - we don't read or write facing here, because the tile persists it } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index ad60f6ba5f..cf203e35fa 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -23,19 +23,19 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->pressed = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 26354c8cdb..4dbdfb823e 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -24,12 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SkullType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -55,25 +55,25 @@ class Skull extends Flowable{ public function getRequiredTypeDataBits() : int{ return 3; } - protected function decodeType(BlockDataReader $r) : void{ - $this->skullType = BlockDataReaderHelper::readSkullType($r); + protected function decodeType(RuntimeDataReader $r) : void{ + $this->skullType = RuntimeEnumDeserializer::readSkullType($r); } - protected function encodeType(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeSkullType($w, $this->skullType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeSkullType($w, $this->skullType); } public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::DOWN){ - throw new InvalidBlockStateException("Skull may not face down"); + throw new InvalidSerializedRuntimeDataException("Skull may not face down"); } $this->facing = $facing; } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); } diff --git a/src/block/Slab.php b/src/block/Slab.php index e562c7adbb..a1604d79c3 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -25,10 +25,10 @@ namespace pocketmine\block; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -46,12 +46,12 @@ class Slab extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ - $this->slabType = BlockDataReaderHelper::readSlabType($r); + protected function decodeState(RuntimeDataReader $r) : void{ + $this->slabType = RuntimeEnumDeserializer::readSlabType($r); } - protected function encodeState(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeSlabType($w, $this->slabType); + protected function encodeState(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeSlabType($w, $this->slabType); } public function isTransparent() : bool{ diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 6642faaa8c..d629d4d049 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockMeltEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -49,11 +49,11 @@ class SnowLayer extends Flowable implements Fallable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS - 1, self::MAX_LAYERS - 1) + 1; } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->layers - 1); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index ed25d8fb60..d2752a18f1 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,19 +23,19 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; class Sponge extends Opaque{ protected bool $wet = false; public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->wet = $r->readBool(); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeBool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index 6ccfb13127..67a3d7b40e 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -26,8 +26,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\StairShape; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -49,12 +49,12 @@ class Stair extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->upsideDown = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->upsideDown); } diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 0d125baa7c..1c09c3caeb 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use function array_keys; use function implode; @@ -40,15 +40,15 @@ class StraightOnlyRail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $railShape = $r->readInt(3); if(!isset(RailConnectionInfo::CONNECTIONS[$railShape])){ - throw new InvalidBlockStateException("No rail shape matches meta $railShape"); + throw new InvalidSerializedRuntimeDataException("No rail shape matches meta $railShape"); } $this->railShape = $railShape; } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 9643b7c4f7..f91f13a5e7 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -40,11 +40,11 @@ class Sugarcane extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 0220125c42..54e785664e 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\block\BlockGrowEvent; @@ -48,11 +48,11 @@ class SweetBerryBush extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->age = $r->readBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(3, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index a62f59e3c9..30ebb42f64 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; @@ -47,21 +47,21 @@ class TNT extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->worksUnderwater = $r->readBool(); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeBool($this->worksUnderwater); } public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->unstable = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index 6d887f2c46..dbb9014a80 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -40,15 +40,15 @@ class Torch extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $facing = $r->readFacing(); if($facing === Facing::DOWN){ - throw new InvalidBlockStateException("Torch cannot have a DOWN facing"); + throw new InvalidSerializedRuntimeDataException("Torch cannot have a DOWN facing"); } $this->facing = $facing; } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 4291e4ba4b..74306d35ea 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -43,13 +43,13 @@ class Trapdoor extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->top = $r->readBool(); $this->open = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->top); $w->writeBool($this->open); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 53722d996f..1971b391c0 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -36,14 +36,14 @@ class Tripwire extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->triggered = $r->readBool(); $this->suspended = $r->readBool(); $this->connected = $r->readBool(); $this->disarmed = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeBool($this->triggered); $w->writeBool($this->suspended); $w->writeBool($this->connected); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 76cfa931c1..bd240d20ed 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -41,13 +41,13 @@ class TripwireHook extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); $this->connected = $r->readBool(); $this->powered = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); $w->writeBool($this->connected); $w->writeBool($this->powered); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 0bf1477782..753aee99d1 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; class UnknownBlock extends Transparent{ @@ -36,13 +36,13 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $this->stateData = $r->readInt(Block::INTERNAL_STATE_DATA_BITS); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); } diff --git a/src/block/Vine.php b/src/block/Vine.php index e0bb154dc6..d716b5eb81 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -42,13 +42,13 @@ class Vine extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ foreach(Facing::HORIZONTAL as $facing){ $this->setFace($facing, $r->readBool()); } } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ foreach(Facing::HORIZONTAL as $facing){ $w->writeBool($this->hasFace($facing)); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 15b6b64863..e3ceff6ce2 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WallConnectionType; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -45,12 +45,12 @@ class Wall extends Transparent{ public function getRequiredStateDataBits() : int{ return 9; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->connections = $r->readWallConnections(); $this->post = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeWallConnections($this->connections); $w->writeBool($this->post); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index a0d710d706..9164c2cf11 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; @@ -39,11 +39,11 @@ final class WallCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index 46bb4afa69..d31d65f0e3 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -25,8 +25,8 @@ namespace pocketmine\block; use pocketmine\block\utils\PillarRotationTrait; use pocketmine\block\utils\WoodTypeTrait; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\math\Vector3; @@ -40,11 +40,11 @@ class Wood extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(BlockDataReader $r) : void{ + protected function decodeType(RuntimeDataReader $r) : void{ $this->stripped = $r->readBool(); } - protected function encodeType(BlockDataWriter $w) : void{ + protected function encodeType(RuntimeDataWriter $w) : void{ $w->writeBool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 513ca47768..22d266aa71 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -23,19 +23,19 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->signalStrength = $r->readBoundedInt(4, 0, 15); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 580dbbd661..c6ccd56459 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Facing; trait AnyFacingTrait{ @@ -32,11 +32,11 @@ trait AnyFacingTrait{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readFacing(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeFacing($this->facing); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 0b4cb1d6b4..3529f45afa 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -24,10 +24,10 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; trait ColoredTrait{ /** @var DyeColor */ @@ -36,13 +36,13 @@ trait ColoredTrait{ public function getRequiredTypeDataBits() : int{ return 4; } /** @see Block::decodeType() */ - protected function decodeType(BlockDataReader $r) : void{ - $this->color = BlockDataReaderHelper::readDyeColor($r); + protected function decodeType(RuntimeDataReader $r) : void{ + $this->color = RuntimeEnumDeserializer::readDyeColor($r); } /** @see Block::encodeType() */ - protected function encodeType(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeDyeColor($w, $this->color); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeDyeColor($w, $this->color); } public function getColor() : DyeColor{ return $this->color; } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index ab6fd66f1e..2e301f302d 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -24,10 +24,10 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataReaderHelper; -use pocketmine\data\runtime\block\BlockDataWriter; -use pocketmine\data\runtime\block\BlockDataWriterHelper; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumDeserializer; +use pocketmine\data\runtime\RuntimeEnumSerializer; trait CoralTypeTrait{ protected CoralType $coralType; @@ -36,14 +36,14 @@ trait CoralTypeTrait{ public function getRequiredTypeDataBits() : int{ return 4; } /** @see Block::decodeType() */ - protected function decodeType(BlockDataReader $r) : void{ - $this->coralType = BlockDataReaderHelper::readCoralType($r); + protected function decodeType(RuntimeDataReader $r) : void{ + $this->coralType = RuntimeEnumDeserializer::readCoralType($r); $this->dead = $r->readBool(); } /** @see Block::encodeType() */ - protected function encodeType(BlockDataWriter $w) : void{ - BlockDataWriterHelper::writeCoralType($w, $this->coralType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeCoralType($w, $this->coralType); $w->writeBool($this->dead); } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index cadcf2ede3..c20bab71ee 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -33,11 +33,11 @@ trait HorizontalFacingTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 03176ed921..c8fe6216b4 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -38,11 +38,11 @@ trait PillarRotationTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->axis = $r->readAxis(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeAxis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 7a402d8e27..361129518b 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -23,20 +23,20 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ parent::decodeState($r); $this->powered = $r->readBool(); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ parent::encodeState($w); $w->writeBool($this->powered); } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index b678294927..e5773dbbd3 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\block\BlockDataReader; -use pocketmine\data\runtime\block\BlockDataWriter; +use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataWriter; use function floor; trait SignLikeRotationTrait{ @@ -33,11 +33,11 @@ trait SignLikeRotationTrait{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(BlockDataReader $r) : void{ + protected function decodeState(RuntimeDataReader $r) : void{ $this->rotation = $r->readBoundedInt(4, 0, 15); } - protected function encodeState(BlockDataWriter $w) : void{ + protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeInt(4, $this->rotation); } diff --git a/src/block/utils/InvalidBlockStateException.php b/src/data/runtime/InvalidSerializedRuntimeDataException.php similarity index 86% rename from src/block/utils/InvalidBlockStateException.php rename to src/data/runtime/InvalidSerializedRuntimeDataException.php index f425813401..899a206f67 100644 --- a/src/block/utils/InvalidBlockStateException.php +++ b/src/data/runtime/InvalidSerializedRuntimeDataException.php @@ -21,8 +21,8 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\data\runtime; -class InvalidBlockStateException extends \UnexpectedValueException{ +final class InvalidSerializedRuntimeDataException extends \UnexpectedValueException{ } diff --git a/src/data/runtime/block/BlockDataReader.php b/src/data/runtime/RuntimeDataReader.php similarity index 89% rename from src/data/runtime/block/BlockDataReader.php rename to src/data/runtime/RuntimeDataReader.php index 5164ff53e2..46c59cb276 100644 --- a/src/data/runtime/block/BlockDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -21,15 +21,14 @@ declare(strict_types=1); -namespace pocketmine\data\runtime\block; +namespace pocketmine\data\runtime; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; -final class BlockDataReader{ +final class RuntimeDataReader{ private int $offset = 0; @@ -52,7 +51,7 @@ final class BlockDataReader{ 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"); + throw new InvalidSerializedRuntimeDataException("Value is outside the range $min - $max"); } return $result; } @@ -79,7 +78,7 @@ final class BlockDataReader{ 3 => Facing::SOUTH, 4 => Facing::WEST, 5 => Facing::EAST, - default => throw new InvalidBlockStateException("Invalid facing value") + default => throw new InvalidSerializedRuntimeDataException("Invalid facing value") }; } @@ -88,7 +87,7 @@ final class BlockDataReader{ 0 => Axis::X, 1 => Axis::Z, 2 => Axis::Y, - default => throw new InvalidBlockStateException("Invalid axis value") + default => throw new InvalidSerializedRuntimeDataException("Invalid axis value") }; } diff --git a/src/data/runtime/block/BlockDataWriter.php b/src/data/runtime/RuntimeDataWriter.php similarity index 97% rename from src/data/runtime/block/BlockDataWriter.php rename to src/data/runtime/RuntimeDataWriter.php index a4d87a5dfc..c007592370 100644 --- a/src/data/runtime/block/BlockDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -21,14 +21,14 @@ declare(strict_types=1); -namespace pocketmine\data\runtime\block; +namespace pocketmine\data\runtime; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; -final class BlockDataWriter{ +final class RuntimeDataWriter{ private int $value = 0; private int $offset = 0; diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializer.php new file mode 100644 index 0000000000..80739026c1 --- /dev/null +++ b/src/data/runtime/RuntimeEnumDeserializer.php @@ -0,0 +1,108 @@ +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 InvalidSerializedRuntimeDataException("Invalid serialized value for BellAttachmentType") + }; + } + + public static function readCoralType(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for CoralType") + }; + } + + public static function readDyeColor(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for DyeColor") + }; + } + + public static function readLeverFacing(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for LeverFacing") + }; + } + + public static function readMushroomBlockType(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for MushroomBlockType") + }; + } + + public static function readSkullType(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for SkullType") + }; + } + + public static function readSlabType(RuntimeDataReader $r) : \pocketmine\block\utils\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 InvalidSerializedRuntimeDataException("Invalid serialized value for SlabType") + }; + } + +} diff --git a/src/data/runtime/block/BlockDataWriterHelper.php b/src/data/runtime/RuntimeEnumSerializer.php similarity index 55% rename from src/data/runtime/block/BlockDataWriterHelper.php rename to src/data/runtime/RuntimeEnumSerializer.php index 1a49fac722..728fdf827a 100644 --- a/src/data/runtime/block/BlockDataWriterHelper.php +++ b/src/data/runtime/RuntimeEnumSerializer.php @@ -1,41 +1,16 @@ writeInt(2, match($value){ \pocketmine\block\utils\BellAttachmentType::CEILING() => 0, \pocketmine\block\utils\BellAttachmentType::FLOOR() => 1, @@ -45,21 +20,7 @@ final class BlockDataWriterHelper{ }); } - /** - * @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{ + public static function writeCoralType(RuntimeDataWriter $w, \pocketmine\block\utils\CoralType $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\CoralType::BRAIN() => 0, \pocketmine\block\utils\CoralType::BUBBLE() => 1, @@ -70,7 +31,7 @@ final class BlockDataWriterHelper{ }); } - public static function writeDyeColor(BlockDataWriter $w, DyeColor $value) : void{ + public static function writeDyeColor(RuntimeDataWriter $w, \pocketmine\block\utils\DyeColor $value) : void{ $w->writeInt(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, \pocketmine\block\utils\DyeColor::BLUE() => 1, @@ -92,7 +53,7 @@ final class BlockDataWriterHelper{ }); } - public static function writeLeverFacing(BlockDataWriter $w, LeverFacing $value) : void{ + public static function writeLeverFacing(RuntimeDataWriter $w, \pocketmine\block\utils\LeverFacing $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X() => 0, \pocketmine\block\utils\LeverFacing::DOWN_AXIS_Z() => 1, @@ -106,7 +67,7 @@ final class BlockDataWriterHelper{ }); } - public static function writeMushroomBlockType(BlockDataWriter $w, MushroomBlockType $value) : void{ + public static function writeMushroomBlockType(RuntimeDataWriter $w, \pocketmine\block\utils\MushroomBlockType $value) : void{ $w->writeInt(4, match($value){ \pocketmine\block\utils\MushroomBlockType::ALL_CAP() => 0, \pocketmine\block\utils\MushroomBlockType::CAP_EAST() => 1, @@ -123,7 +84,7 @@ final class BlockDataWriterHelper{ }); } - public static function writeSkullType(BlockDataWriter $w, SkullType $value) : void{ + public static function writeSkullType(RuntimeDataWriter $w, \pocketmine\block\utils\SkullType $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, \pocketmine\block\utils\SkullType::DRAGON() => 1, @@ -135,7 +96,7 @@ final class BlockDataWriterHelper{ }); } - public static function writeSlabType(BlockDataWriter $w, SlabType $value) : void{ + public static function writeSlabType(RuntimeDataWriter $w, \pocketmine\block\utils\SlabType $value) : void{ $w->writeInt(2, match($value){ \pocketmine\block\utils\SlabType::BOTTOM() => 0, \pocketmine\block\utils\SlabType::DOUBLE() => 1, @@ -144,27 +105,4 @@ final class BlockDataWriterHelper{ }); } - 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/data/runtime/block/BlockDataReaderHelper.php b/src/data/runtime/block/BlockDataReaderHelper.php deleted file mode 100644 index b8a3f7703d..0000000000 --- a/src/data/runtime/block/BlockDataReaderHelper.php +++ /dev/null @@ -1,174 +0,0 @@ -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") - }; - } - -} From 6be92ea6f76753cdcdfe192a3954d8357bd3de3a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 14:14:27 +0100 Subject: [PATCH 0265/1858] fix CS --- src/block/BrewingStand.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 463ef5adb2..ee39b0ea3b 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -63,9 +63,9 @@ class BrewingStand extends Transparent{ protected function encodeState(RuntimeDataWriter $w) : void{ foreach([ - \pocketmine\block\utils\BrewingStandSlot::EAST(), - \pocketmine\block\utils\BrewingStandSlot::NORTHWEST(), - \pocketmine\block\utils\BrewingStandSlot::SOUTHWEST(), + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), ] as $member){ $w->writeBool(isset($this->slots[$member->id()])); } From 4e71cc7d79f003af126379acc81751bcb16df0d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 14:26:02 +0100 Subject: [PATCH 0266/1858] Remove ItemFactory::get(), use ItemFactory::fromTypeId() for VanillaItems soon we'll invert the dependency and set up all this stuff in VanillaItems directly, rendering ItemFactory (mostly) unnecessary. --- src/item/ItemFactory.php | 162 ++---- src/item/VanillaItems.php | 460 +++++++++--------- .../item/ItemSerializerDeserializerTest.php | 2 +- tests/phpunit/item/ItemFactoryTest.php | 46 -- 4 files changed, 263 insertions(+), 407 deletions(-) delete mode 100644 tests/phpunit/item/ItemFactoryTest.php diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 0de8cfcd8a..2b3fdd3fe7 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -24,15 +24,11 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\BlockFactory; -use pocketmine\block\utils\CoralType; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\RecordType; 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\EntityLegacyIds; -use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\Squid; @@ -43,13 +39,9 @@ use pocketmine\item\ItemIdentifier as IID; use pocketmine\item\ItemIds as LegacyIds; use pocketmine\item\ItemTypeIds as Ids; use pocketmine\math\Vector3; -use pocketmine\nbt\NbtException; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\World; -use function min; /** * Manages deserializing item types from their legacy ID/metadata. @@ -86,11 +78,7 @@ class ItemFactory{ $this->register(new Clownfish(new IID(Ids::CLOWNFISH, LegacyIds::CLOWNFISH, 0), "Clownfish")); $this->register(new Coal(new IID(Ids::COAL, LegacyIds::COAL, 0), "Coal")); - $identifier = new ItemIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, [LegacyIds::CORAL_FAN_DEAD]); - foreach(CoralType::getAll() as $coralType){ - $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(false), true); - $this->register((new CoralFan($identifier))->setCoralType($coralType)->setDead(true), true); - } + $this->register(new CoralFan(new ItemIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, [LegacyIds::CORAL_FAN_DEAD]))); $this->register(new Coal(new IID(Ids::CHARCOAL, LegacyIds::COAL, 1), "Charcoal")); $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS, LegacyIds::DYE, 3), "Cocoa Beans")); @@ -191,31 +179,9 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::SCUTE, LegacyIds::TURTLE_SHELL_PIECE, 0), "Scute")); $this->register(new Item(new IID(Ids::WHEAT, LegacyIds::WHEAT, 0), "Wheat")); - //these blocks have special legacy item IDs, so they need to be registered explicitly - $this->register(new ItemBlock(Blocks::ACACIA_DOOR())); - $this->register(new ItemBlock(Blocks::BIRCH_DOOR())); - $this->register(new ItemBlock(Blocks::BREWING_STAND())); - $this->register(new ItemBlock(Blocks::CAKE())); - $this->register(new ItemBlock(Blocks::REDSTONE_COMPARATOR())); - $this->register(new ItemBlock(Blocks::DARK_OAK_DOOR())); - $this->register(new ItemBlock(Blocks::FLOWER_POT())); - $this->register(new ItemBlock(Blocks::HOPPER())); - $this->register(new ItemBlock(Blocks::IRON_DOOR())); - $this->register(new ItemBlock(Blocks::ITEM_FRAME())); - $this->register(new ItemBlock(Blocks::JUNGLE_DOOR())); - $this->register(new ItemBlock(Blocks::NETHER_WART())); - $this->register(new ItemBlock(Blocks::OAK_DOOR())); - $this->register(new ItemBlock(Blocks::REDSTONE_REPEATER())); - $this->register(new ItemBlock(Blocks::SPRUCE_DOOR())); - $this->register(new ItemBlock(Blocks::SUGARCANE())); - //the meta values for buckets are intentionally hardcoded because block IDs will change in the future - $waterBucket = new LiquidBucket(new IID(Ids::WATER_BUCKET, LegacyIds::BUCKET, 8), "Water Bucket", Blocks::WATER()); - $this->register($waterBucket); - $this->remap(LegacyIds::BUCKET, 9, $waterBucket); - $lavaBucket = new LiquidBucket(new IID(Ids::LAVA_BUCKET, LegacyIds::BUCKET, 10), "Lava Bucket", Blocks::LAVA()); - $this->register($lavaBucket); - $this->remap(LegacyIds::BUCKET, 11, $lavaBucket); + $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET, LegacyIds::BUCKET, 8), "Water Bucket", Blocks::WATER())); + $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET, LegacyIds::BUCKET, 10), "Lava Bucket", Blocks::LAVA())); $this->register(new Melon(new IID(Ids::MELON, LegacyIds::MELON, 0), "Melon")); $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS, LegacyIds::MELON_SEEDS, 0), "Melon Seeds")); $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET, LegacyIds::BUCKET, 1), "Milk Bucket")); @@ -267,21 +233,16 @@ class ItemFactory{ $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, LegacyIds::WRITABLE_BOOK, 0), "Book & Quill")); $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, LegacyIds::WRITTEN_BOOK, 0), "Written Book")); - foreach(DyeColor::getAll() as $color){ - //TODO: use colour object directly - //TODO: add interface to dye-colour objects - $this->register((new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye"))->setColor($color)); - $this->register((new Banner( - new IID(Ids::BANNER, LegacyIds::BANNER, 0), - Blocks::BANNER(), - Blocks::WALL_BANNER() - ))->setColor($color)); - } + //TODO: add interface to dye-colour objects + $this->register(new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye")); + $this->register(new Banner( + new IID(Ids::BANNER, LegacyIds::BANNER, 0), + Blocks::BANNER(), + Blocks::WALL_BANNER() + )); - foreach(PotionType::getAll() as $type){ - $this->register((new Potion(new IID(Ids::POTION, LegacyIds::POTION, 0), "Potion"))->setType($type)); - $this->register((new SplashPotion(new IID(Ids::SPLASH_POTION, LegacyIds::SPLASH_POTION, 0), "Splash Potion"))->setType($type)); - } + $this->register(new Potion(new IID(Ids::POTION, LegacyIds::POTION, 0), "Potion")); + $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION, LegacyIds::SPLASH_POTION, 0), "Splash Potion")); foreach(TreeType::getAll() as $type){ //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency @@ -420,112 +381,51 @@ class ItemFactory{ * $override parameter. */ public function register(Item $item, bool $override = false) : void{ - $id = $item->getId(); - $variant = $item->getMeta(); + $id = $item->getTypeId(); - if(!$override && $this->isRegistered($id, $variant)){ + if(!$override && $this->isRegistered($id)){ throw new \RuntimeException("Trying to overwrite an already registered item"); } - $this->list[self::getListOffset($id, $variant)] = clone $item; - } - - public function remap(int $legacyId, int $legacyMeta, Item $item, bool $override = false) : void{ - if(!$override && $this->isRegistered($legacyId, $legacyMeta)){ - throw new \RuntimeException("Trying to overwrite an already registered item"); - } - - $this->list[self::getListOffset($legacyId, $legacyMeta)] = clone $item; + $this->list[$id] = clone $item; } private static function itemToBlockId(int $id) : int{ - return $id < 0 ? 255 - $id : $id; + if($id > 0){ + throw new \InvalidArgumentException("ID $id is not a block ID"); + } + return -$id; } /** - * @deprecated This method should ONLY be used for deserializing data, e.g. from a config or database. For all other - * purposes, use VanillaItems. - * @see VanillaItems - * - * Deserializes an item from the provided legacy ID, legacy meta, count and NBT. - * - * @throws SavedDataLoadingException + * @internal */ - public function get(int $id, int $meta = 0, int $count = 1, ?CompoundTag $tags = null) : Item{ - /** @var Item|null $item */ - $item = null; - - if($id < -0x8000 || $id > 0x7fff){ - throw new SavedDataLoadingException("Legacy ID must be in the range " . -0x8000 . " ... " . 0x7fff); + public function fromTypeId(int $typeId) : Item{ + if(isset($this->list[$typeId])){ + return clone $this->list[$typeId]; } - if($meta < 0 || $meta > 0x7ffe){ //0x7fff would cause problems with recipe wildcards - throw new SavedDataLoadingException("Meta cannot be negative or larger than " . 0x7ffe); + if($typeId <= 0){ + return BlockFactory::getInstance()->fromTypeId(self::itemToBlockId($typeId))->asItem(); } - if(isset($this->list[$offset = self::getListOffset($id, $meta)])){ - $item = clone $this->list[$offset]; - }elseif(isset($this->list[$zero = self::getListOffset($id, 0)]) && $this->list[$zero] instanceof Durable){ - $item = clone $this->list[$zero]; - $item->setDamage(min($meta, $this->list[$zero]->getMaxDurability())); - }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 - $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $meta & 0xf); - if($blockStateData !== null){ - try{ - $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); - $item = new ItemBlock(BlockFactory::getInstance()->fromStateId($blockStateId)); - }catch(BlockStateDeserializeException $e){ - throw new SavedDataLoadingException("Failed to deserialize itemblock: " . $e->getMessage(), 0, $e); - } - } - } - - if($item === null){ - throw new SavedDataLoadingException("No registered item is associated with this ID and meta"); - } - - $item->setCount($count); - if($tags !== null){ - try{ - $item->setNamedTag($tags); - }catch(NbtException $e){ - throw new SavedDataLoadingException("Invalid item NBT: " . $e->getMessage(), 0, $e); - } - } - return $item; + throw new \InvalidArgumentException("No item with type ID $typeId is registered"); } /** * Returns whether the specified item ID is already registered in the item factory. */ - public function isRegistered(int $id, int $variant = 0) : bool{ - if($id < 256){ - $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $variant & 0xf); - if($blockStateData === null){ - return false; - } - try{ - GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); - return true; - }catch(BlockStateDeserializeException){ - return false; - } + public function isRegistered(int $id) : bool{ + if($id <= 0){ + return BlockFactory::getInstance()->isRegistered(self::itemToBlockId($id)); } - return isset($this->list[self::getListOffset($id, $variant)]); - } - - private static function getListOffset(int $id, int $variant) : int{ - if($id < -0x8000 || $id > 0x7fff){ - throw new \InvalidArgumentException("ID must be in range " . -0x8000 . " - " . 0x7fff); - } - return (($id & 0xffff) << 16) | ($variant & 0xffff); + return isset($this->list[$id]); } /** * @return Item[] */ - public function getAllRegistered() : array{ + public function getAllKnownTypes() : array{ return $this->list; } } diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 6daf64ff86..481e16d7e3 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\item\ItemIds as Ids; +use pocketmine\block\VanillaBlocks; +use pocketmine\item\ItemTypeIds as Ids; use pocketmine\utils\CloningRegistryTrait; /** @@ -284,233 +285,234 @@ final class VanillaItems{ protected static function setup() : void{ $factory = ItemFactory::getInstance(); - self::register("acacia_boat", $factory->get(Ids::BOAT, 4)); - self::register("acacia_sign", $factory->get(Ids::ACACIA_SIGN)); - self::register("air", $factory->get(Ids::AIR, 0, 0)); - self::register("apple", $factory->get(Ids::APPLE)); - self::register("arrow", $factory->get(Ids::ARROW)); - self::register("baked_potato", $factory->get(Ids::BAKED_POTATO)); - self::register("bamboo", $factory->get(Ids::BAMBOO)); - self::register("banner", $factory->get(Ids::BANNER)); - self::register("beetroot", $factory->get(Ids::BEETROOT)); - self::register("beetroot_seeds", $factory->get(Ids::BEETROOT_SEEDS)); - self::register("beetroot_soup", $factory->get(Ids::BEETROOT_SOUP)); - self::register("birch_boat", $factory->get(Ids::BOAT, 2)); - self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN)); - self::register("blaze_powder", $factory->get(Ids::BLAZE_POWDER)); - self::register("blaze_rod", $factory->get(Ids::BLAZE_ROD)); - self::register("bleach", $factory->get(Ids::BLEACH)); - self::register("bone", $factory->get(Ids::BONE)); - self::register("bone_meal", $factory->get(Ids::DYE, 15)); - self::register("book", $factory->get(Ids::BOOK)); - self::register("bow", $factory->get(Ids::BOW)); - self::register("bowl", $factory->get(Ids::BOWL)); - self::register("bread", $factory->get(Ids::BREAD)); - self::register("brick", $factory->get(Ids::BRICK)); - self::register("bucket", $factory->get(Ids::BUCKET)); - self::register("carrot", $factory->get(Ids::CARROT)); - self::register("chainmail_boots", $factory->get(Ids::CHAINMAIL_BOOTS)); - self::register("chainmail_chestplate", $factory->get(Ids::CHAINMAIL_CHESTPLATE)); - self::register("chainmail_helmet", $factory->get(Ids::CHAINMAIL_HELMET)); - self::register("chainmail_leggings", $factory->get(Ids::CHAINMAIL_LEGGINGS)); - self::register("charcoal", $factory->get(Ids::COAL, 1)); - self::register("chemical_aluminium_oxide", $factory->get(Ids::COMPOUND, 13)); - self::register("chemical_ammonia", $factory->get(Ids::COMPOUND, 36)); - self::register("chemical_barium_sulphate", $factory->get(Ids::COMPOUND, 20)); - self::register("chemical_benzene", $factory->get(Ids::COMPOUND, 33)); - self::register("chemical_boron_trioxide", $factory->get(Ids::COMPOUND, 14)); - self::register("chemical_calcium_bromide", $factory->get(Ids::COMPOUND, 7)); - self::register("chemical_calcium_chloride", $factory->get(Ids::COMPOUND, 25)); - self::register("chemical_cerium_chloride", $factory->get(Ids::COMPOUND, 23)); - self::register("chemical_charcoal", $factory->get(Ids::COMPOUND, 11)); - self::register("chemical_crude_oil", $factory->get(Ids::COMPOUND, 29)); - self::register("chemical_glue", $factory->get(Ids::COMPOUND, 27)); - self::register("chemical_hydrogen_peroxide", $factory->get(Ids::COMPOUND, 35)); - self::register("chemical_hypochlorite", $factory->get(Ids::COMPOUND, 28)); - self::register("chemical_ink", $factory->get(Ids::COMPOUND, 34)); - self::register("chemical_iron_sulphide", $factory->get(Ids::COMPOUND, 4)); - self::register("chemical_latex", $factory->get(Ids::COMPOUND, 30)); - self::register("chemical_lithium_hydride", $factory->get(Ids::COMPOUND, 5)); - self::register("chemical_luminol", $factory->get(Ids::COMPOUND, 10)); - self::register("chemical_magnesium_nitrate", $factory->get(Ids::COMPOUND, 3)); - self::register("chemical_magnesium_oxide", $factory->get(Ids::COMPOUND, 8)); - self::register("chemical_magnesium_salts", $factory->get(Ids::COMPOUND, 18)); - self::register("chemical_mercuric_chloride", $factory->get(Ids::COMPOUND, 22)); - self::register("chemical_polyethylene", $factory->get(Ids::COMPOUND, 16)); - self::register("chemical_potassium_chloride", $factory->get(Ids::COMPOUND, 21)); - self::register("chemical_potassium_iodide", $factory->get(Ids::COMPOUND, 31)); - self::register("chemical_rubbish", $factory->get(Ids::COMPOUND, 17)); - self::register("chemical_salt", $factory->get(Ids::COMPOUND)); - self::register("chemical_soap", $factory->get(Ids::COMPOUND, 15)); - self::register("chemical_sodium_acetate", $factory->get(Ids::COMPOUND, 9)); - self::register("chemical_sodium_fluoride", $factory->get(Ids::COMPOUND, 32)); - self::register("chemical_sodium_hydride", $factory->get(Ids::COMPOUND, 6)); - self::register("chemical_sodium_hydroxide", $factory->get(Ids::COMPOUND, 2)); - self::register("chemical_sodium_hypochlorite", $factory->get(Ids::COMPOUND, 37)); - self::register("chemical_sodium_oxide", $factory->get(Ids::COMPOUND, 1)); - self::register("chemical_sugar", $factory->get(Ids::COMPOUND, 12)); - self::register("chemical_sulphate", $factory->get(Ids::COMPOUND, 19)); - self::register("chemical_tungsten_chloride", $factory->get(Ids::COMPOUND, 24)); - self::register("chemical_water", $factory->get(Ids::COMPOUND, 26)); - self::register("chorus_fruit", $factory->get(Ids::CHORUS_FRUIT)); - self::register("clay", $factory->get(Ids::CLAY)); - self::register("clock", $factory->get(Ids::CLOCK)); - self::register("clownfish", $factory->get(Ids::CLOWNFISH)); - self::register("coal", $factory->get(Ids::COAL)); - self::register("cocoa_beans", $factory->get(Ids::DYE, 3)); - self::register("compass", $factory->get(Ids::COMPASS)); - self::register("cooked_chicken", $factory->get(Ids::COOKED_CHICKEN)); - self::register("cooked_fish", $factory->get(Ids::COOKED_FISH)); - self::register("cooked_mutton", $factory->get(Ids::COOKED_MUTTON)); - self::register("cooked_porkchop", $factory->get(Ids::COOKED_PORKCHOP)); - self::register("cooked_rabbit", $factory->get(Ids::COOKED_RABBIT)); - self::register("cooked_salmon", $factory->get(Ids::COOKED_SALMON)); - self::register("cookie", $factory->get(Ids::COOKIE)); - self::register("coral_fan", $factory->get(Ids::CORAL_FAN)); - self::register("dark_oak_boat", $factory->get(Ids::BOAT, 5)); - self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_SIGN)); - self::register("diamond", $factory->get(Ids::DIAMOND)); - self::register("diamond_axe", $factory->get(Ids::DIAMOND_AXE)); - self::register("diamond_boots", $factory->get(Ids::DIAMOND_BOOTS)); - self::register("diamond_chestplate", $factory->get(Ids::DIAMOND_CHESTPLATE)); - self::register("diamond_helmet", $factory->get(Ids::DIAMOND_HELMET)); - self::register("diamond_hoe", $factory->get(Ids::DIAMOND_HOE)); - self::register("diamond_leggings", $factory->get(Ids::DIAMOND_LEGGINGS)); - self::register("diamond_pickaxe", $factory->get(Ids::DIAMOND_PICKAXE)); - self::register("diamond_shovel", $factory->get(Ids::DIAMOND_SHOVEL)); - self::register("diamond_sword", $factory->get(Ids::DIAMOND_SWORD)); - self::register("dragon_breath", $factory->get(Ids::DRAGON_BREATH)); - self::register("dried_kelp", $factory->get(Ids::DRIED_KELP)); - self::register("dye", $factory->get(Ids::DYE, 1)); - self::register("egg", $factory->get(Ids::EGG)); - self::register("emerald", $factory->get(Ids::EMERALD)); - self::register("enchanted_golden_apple", $factory->get(Ids::APPLEENCHANTED)); - self::register("ender_pearl", $factory->get(Ids::ENDER_PEARL)); - self::register("experience_bottle", $factory->get(Ids::BOTTLE_O_ENCHANTING)); - self::register("feather", $factory->get(Ids::FEATHER)); - self::register("fermented_spider_eye", $factory->get(Ids::FERMENTED_SPIDER_EYE)); - self::register("fishing_rod", $factory->get(Ids::FISHING_ROD)); - self::register("flint", $factory->get(Ids::FLINT)); - self::register("flint_and_steel", $factory->get(Ids::FLINT_AND_STEEL)); - self::register("ghast_tear", $factory->get(Ids::GHAST_TEAR)); - self::register("glass_bottle", $factory->get(Ids::GLASS_BOTTLE)); - self::register("glistering_melon", $factory->get(Ids::GLISTERING_MELON)); - self::register("glowstone_dust", $factory->get(Ids::GLOWSTONE_DUST)); - self::register("gold_ingot", $factory->get(Ids::GOLD_INGOT)); - self::register("gold_nugget", $factory->get(Ids::GOLDEN_NUGGET)); - self::register("golden_apple", $factory->get(Ids::GOLDEN_APPLE)); - self::register("golden_axe", $factory->get(Ids::GOLDEN_AXE)); - self::register("golden_boots", $factory->get(Ids::GOLDEN_BOOTS)); - self::register("golden_carrot", $factory->get(Ids::GOLDEN_CARROT)); - self::register("golden_chestplate", $factory->get(Ids::GOLDEN_CHESTPLATE)); - self::register("golden_helmet", $factory->get(Ids::GOLDEN_HELMET)); - self::register("golden_hoe", $factory->get(Ids::GOLDEN_HOE)); - self::register("golden_leggings", $factory->get(Ids::GOLDEN_LEGGINGS)); - self::register("golden_pickaxe", $factory->get(Ids::GOLDEN_PICKAXE)); - self::register("golden_shovel", $factory->get(Ids::GOLDEN_SHOVEL)); - self::register("golden_sword", $factory->get(Ids::GOLDEN_SWORD)); - self::register("gunpowder", $factory->get(Ids::GUNPOWDER)); - self::register("heart_of_the_sea", $factory->get(Ids::HEART_OF_THE_SEA)); - self::register("ink_sac", $factory->get(Ids::DYE)); - self::register("iron_axe", $factory->get(Ids::IRON_AXE)); - self::register("iron_boots", $factory->get(Ids::IRON_BOOTS)); - self::register("iron_chestplate", $factory->get(Ids::IRON_CHESTPLATE)); - self::register("iron_helmet", $factory->get(Ids::IRON_HELMET)); - self::register("iron_hoe", $factory->get(Ids::IRON_HOE)); - self::register("iron_ingot", $factory->get(Ids::IRON_INGOT)); - self::register("iron_leggings", $factory->get(Ids::IRON_LEGGINGS)); - self::register("iron_nugget", $factory->get(Ids::IRON_NUGGET)); - self::register("iron_pickaxe", $factory->get(Ids::IRON_PICKAXE)); - self::register("iron_shovel", $factory->get(Ids::IRON_SHOVEL)); - self::register("iron_sword", $factory->get(Ids::IRON_SWORD)); - self::register("jungle_boat", $factory->get(Ids::BOAT, 3)); - self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN)); - self::register("lapis_lazuli", $factory->get(Ids::DYE, 4)); - self::register("lava_bucket", $factory->get(Ids::BUCKET, 10)); - self::register("leather", $factory->get(Ids::LEATHER)); - self::register("leather_boots", $factory->get(Ids::LEATHER_BOOTS)); - self::register("leather_cap", $factory->get(Ids::LEATHER_CAP)); - self::register("leather_pants", $factory->get(Ids::LEATHER_LEGGINGS)); - self::register("leather_tunic", $factory->get(Ids::LEATHER_CHESTPLATE)); - self::register("magma_cream", $factory->get(Ids::MAGMA_CREAM)); - self::register("melon", $factory->get(Ids::MELON)); - self::register("melon_seeds", $factory->get(Ids::MELON_SEEDS)); - self::register("milk_bucket", $factory->get(Ids::BUCKET, 1)); - self::register("minecart", $factory->get(Ids::MINECART)); - self::register("mushroom_stew", $factory->get(Ids::MUSHROOM_STEW)); - self::register("nautilus_shell", $factory->get(Ids::NAUTILUS_SHELL)); - self::register("nether_brick", $factory->get(Ids::NETHERBRICK)); - self::register("nether_quartz", $factory->get(Ids::NETHER_QUARTZ)); - self::register("nether_star", $factory->get(Ids::NETHERSTAR)); - self::register("oak_boat", $factory->get(Ids::BOAT)); - self::register("oak_sign", $factory->get(Ids::SIGN)); - self::register("painting", $factory->get(Ids::PAINTING)); - self::register("paper", $factory->get(Ids::PAPER)); - self::register("poisonous_potato", $factory->get(Ids::POISONOUS_POTATO)); - self::register("popped_chorus_fruit", $factory->get(Ids::CHORUS_FRUIT_POPPED)); - self::register("potato", $factory->get(Ids::POTATO)); - self::register("potion", $factory->get(Ids::POTION)); - self::register("prismarine_crystals", $factory->get(Ids::PRISMARINE_CRYSTALS)); - self::register("prismarine_shard", $factory->get(Ids::PRISMARINE_SHARD)); - self::register("pufferfish", $factory->get(Ids::PUFFERFISH)); - self::register("pumpkin_pie", $factory->get(Ids::PUMPKIN_PIE)); - self::register("pumpkin_seeds", $factory->get(Ids::PUMPKIN_SEEDS)); - self::register("rabbit_foot", $factory->get(Ids::RABBIT_FOOT)); - self::register("rabbit_hide", $factory->get(Ids::RABBIT_HIDE)); - self::register("rabbit_stew", $factory->get(Ids::RABBIT_STEW)); - self::register("raw_beef", $factory->get(Ids::BEEF)); - self::register("raw_chicken", $factory->get(Ids::CHICKEN)); - self::register("raw_fish", $factory->get(Ids::FISH)); - self::register("raw_mutton", $factory->get(Ids::MUTTON)); - self::register("raw_porkchop", $factory->get(Ids::PORKCHOP)); - self::register("raw_rabbit", $factory->get(Ids::RABBIT)); - self::register("raw_salmon", $factory->get(Ids::RAW_SALMON)); - self::register("record_11", $factory->get(Ids::RECORD_11)); - self::register("record_13", $factory->get(Ids::RECORD_13)); - self::register("record_blocks", $factory->get(Ids::RECORD_BLOCKS)); - self::register("record_cat", $factory->get(Ids::RECORD_CAT)); - self::register("record_chirp", $factory->get(Ids::RECORD_CHIRP)); - self::register("record_far", $factory->get(Ids::RECORD_FAR)); - self::register("record_mall", $factory->get(Ids::RECORD_MALL)); - self::register("record_mellohi", $factory->get(Ids::RECORD_MELLOHI)); - self::register("record_stal", $factory->get(Ids::RECORD_STAL)); - self::register("record_strad", $factory->get(Ids::RECORD_STRAD)); - self::register("record_wait", $factory->get(Ids::RECORD_WAIT)); - self::register("record_ward", $factory->get(Ids::RECORD_WARD)); - self::register("redstone_dust", $factory->get(Ids::REDSTONE)); - self::register("rotten_flesh", $factory->get(Ids::ROTTEN_FLESH)); - self::register("scute", $factory->get(Ids::TURTLE_SHELL_PIECE)); - self::register("shears", $factory->get(Ids::SHEARS)); - self::register("shulker_shell", $factory->get(Ids::SHULKER_SHELL)); - self::register("slimeball", $factory->get(Ids::SLIMEBALL)); - self::register("snowball", $factory->get(Ids::SNOWBALL)); - self::register("spider_eye", $factory->get(Ids::SPIDER_EYE)); - self::register("splash_potion", $factory->get(Ids::SPLASH_POTION)); - self::register("spruce_boat", $factory->get(Ids::BOAT, 1)); - self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN)); - self::register("squid_spawn_egg", $factory->get(Ids::SPAWN_EGG, 17)); - self::register("steak", $factory->get(Ids::COOKED_BEEF)); - self::register("stick", $factory->get(Ids::STICK)); - self::register("stone_axe", $factory->get(Ids::STONE_AXE)); - self::register("stone_hoe", $factory->get(Ids::STONE_HOE)); - self::register("stone_pickaxe", $factory->get(Ids::STONE_PICKAXE)); - self::register("stone_shovel", $factory->get(Ids::STONE_SHOVEL)); - self::register("stone_sword", $factory->get(Ids::STONE_SWORD)); - self::register("string", $factory->get(Ids::STRING)); - self::register("sugar", $factory->get(Ids::SUGAR)); - self::register("sweet_berries", $factory->get(Ids::SWEET_BERRIES)); - self::register("totem", $factory->get(Ids::TOTEM)); - self::register("villager_spawn_egg", $factory->get(Ids::SPAWN_EGG, 15)); - self::register("water_bucket", $factory->get(Ids::BUCKET, 8)); - self::register("wheat", $factory->get(Ids::WHEAT)); - self::register("wheat_seeds", $factory->get(Ids::SEEDS)); - self::register("wooden_axe", $factory->get(Ids::WOODEN_AXE)); - self::register("wooden_hoe", $factory->get(Ids::WOODEN_HOE)); - self::register("wooden_pickaxe", $factory->get(Ids::WOODEN_PICKAXE)); - self::register("wooden_shovel", $factory->get(Ids::WOODEN_SHOVEL)); - self::register("wooden_sword", $factory->get(Ids::WOODEN_SWORD)); - self::register("writable_book", $factory->get(Ids::WRITABLE_BOOK)); - self::register("written_book", $factory->get(Ids::WRITTEN_BOOK)); - self::register("zombie_spawn_egg", $factory->get(Ids::SPAWN_EGG, 32)); + self::register("air", VanillaBlocks::AIR()->asItem()->setCount(0)); + + self::register("acacia_boat", $factory->fromTypeId(Ids::ACACIA_BOAT)); + self::register("acacia_sign", $factory->fromTypeId(Ids::ACACIA_SIGN)); + self::register("apple", $factory->fromTypeId(Ids::APPLE)); + self::register("arrow", $factory->fromTypeId(Ids::ARROW)); + self::register("baked_potato", $factory->fromTypeId(Ids::BAKED_POTATO)); + self::register("bamboo", $factory->fromTypeId(Ids::BAMBOO)); + self::register("banner", $factory->fromTypeId(Ids::BANNER)); + self::register("beetroot", $factory->fromTypeId(Ids::BEETROOT)); + self::register("beetroot_seeds", $factory->fromTypeId(Ids::BEETROOT_SEEDS)); + self::register("beetroot_soup", $factory->fromTypeId(Ids::BEETROOT_SOUP)); + self::register("birch_boat", $factory->fromTypeId(Ids::BIRCH_BOAT)); + self::register("birch_sign", $factory->fromTypeId(Ids::BIRCH_SIGN)); + self::register("blaze_powder", $factory->fromTypeId(Ids::BLAZE_POWDER)); + self::register("blaze_rod", $factory->fromTypeId(Ids::BLAZE_ROD)); + self::register("bleach", $factory->fromTypeId(Ids::BLEACH)); + self::register("bone", $factory->fromTypeId(Ids::BONE)); + self::register("bone_meal", $factory->fromTypeId(Ids::BONE_MEAL)); + self::register("book", $factory->fromTypeId(Ids::BOOK)); + self::register("bow", $factory->fromTypeId(Ids::BOW)); + self::register("bowl", $factory->fromTypeId(Ids::BOWL)); + self::register("bread", $factory->fromTypeId(Ids::BREAD)); + self::register("brick", $factory->fromTypeId(Ids::BRICK)); + self::register("bucket", $factory->fromTypeId(Ids::BUCKET)); + self::register("carrot", $factory->fromTypeId(Ids::CARROT)); + self::register("chainmail_boots", $factory->fromTypeId(Ids::CHAINMAIL_BOOTS)); + self::register("chainmail_chestplate", $factory->fromTypeId(Ids::CHAINMAIL_CHESTPLATE)); + self::register("chainmail_helmet", $factory->fromTypeId(Ids::CHAINMAIL_HELMET)); + self::register("chainmail_leggings", $factory->fromTypeId(Ids::CHAINMAIL_LEGGINGS)); + self::register("charcoal", $factory->fromTypeId(Ids::CHARCOAL)); + self::register("chemical_aluminium_oxide", $factory->fromTypeId(Ids::CHEMICAL_ALUMINIUM_OXIDE)); + self::register("chemical_ammonia", $factory->fromTypeId(Ids::CHEMICAL_AMMONIA)); + self::register("chemical_barium_sulphate", $factory->fromTypeId(Ids::CHEMICAL_BARIUM_SULPHATE)); + self::register("chemical_benzene", $factory->fromTypeId(Ids::CHEMICAL_BENZENE)); + self::register("chemical_boron_trioxide", $factory->fromTypeId(Ids::CHEMICAL_BORON_TRIOXIDE)); + self::register("chemical_calcium_bromide", $factory->fromTypeId(Ids::CHEMICAL_CALCIUM_BROMIDE)); + self::register("chemical_calcium_chloride", $factory->fromTypeId(Ids::CHEMICAL_CALCIUM_CHLORIDE)); + self::register("chemical_cerium_chloride", $factory->fromTypeId(Ids::CHEMICAL_CERIUM_CHLORIDE)); + self::register("chemical_charcoal", $factory->fromTypeId(Ids::CHEMICAL_CHARCOAL)); + self::register("chemical_crude_oil", $factory->fromTypeId(Ids::CHEMICAL_CRUDE_OIL)); + self::register("chemical_glue", $factory->fromTypeId(Ids::CHEMICAL_GLUE)); + self::register("chemical_hydrogen_peroxide", $factory->fromTypeId(Ids::CHEMICAL_HYDROGEN_PEROXIDE)); + self::register("chemical_hypochlorite", $factory->fromTypeId(Ids::CHEMICAL_HYPOCHLORITE)); + self::register("chemical_ink", $factory->fromTypeId(Ids::CHEMICAL_INK)); + self::register("chemical_iron_sulphide", $factory->fromTypeId(Ids::CHEMICAL_IRON_SULPHIDE)); + self::register("chemical_latex", $factory->fromTypeId(Ids::CHEMICAL_LATEX)); + self::register("chemical_lithium_hydride", $factory->fromTypeId(Ids::CHEMICAL_LITHIUM_HYDRIDE)); + self::register("chemical_luminol", $factory->fromTypeId(Ids::CHEMICAL_LUMINOL)); + self::register("chemical_magnesium_nitrate", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_NITRATE)); + self::register("chemical_magnesium_oxide", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_OXIDE)); + self::register("chemical_magnesium_salts", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_SALTS)); + self::register("chemical_mercuric_chloride", $factory->fromTypeId(Ids::CHEMICAL_MERCURIC_CHLORIDE)); + self::register("chemical_polyethylene", $factory->fromTypeId(Ids::CHEMICAL_POLYETHYLENE)); + self::register("chemical_potassium_chloride", $factory->fromTypeId(Ids::CHEMICAL_POTASSIUM_CHLORIDE)); + self::register("chemical_potassium_iodide", $factory->fromTypeId(Ids::CHEMICAL_POTASSIUM_IODIDE)); + self::register("chemical_rubbish", $factory->fromTypeId(Ids::CHEMICAL_RUBBISH)); + self::register("chemical_salt", $factory->fromTypeId(Ids::CHEMICAL_SALT)); + self::register("chemical_soap", $factory->fromTypeId(Ids::CHEMICAL_SOAP)); + self::register("chemical_sodium_acetate", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_ACETATE)); + self::register("chemical_sodium_fluoride", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_FLUORIDE)); + self::register("chemical_sodium_hydride", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYDRIDE)); + self::register("chemical_sodium_hydroxide", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYDROXIDE)); + self::register("chemical_sodium_hypochlorite", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYPOCHLORITE)); + self::register("chemical_sodium_oxide", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_OXIDE)); + self::register("chemical_sugar", $factory->fromTypeId(Ids::CHEMICAL_SUGAR)); + self::register("chemical_sulphate", $factory->fromTypeId(Ids::CHEMICAL_SULPHATE)); + self::register("chemical_tungsten_chloride", $factory->fromTypeId(Ids::CHEMICAL_TUNGSTEN_CHLORIDE)); + self::register("chemical_water", $factory->fromTypeId(Ids::CHEMICAL_WATER)); + self::register("chorus_fruit", $factory->fromTypeId(Ids::CHORUS_FRUIT)); + self::register("clay", $factory->fromTypeId(Ids::CLAY)); + self::register("clock", $factory->fromTypeId(Ids::CLOCK)); + self::register("clownfish", $factory->fromTypeId(Ids::CLOWNFISH)); + self::register("coal", $factory->fromTypeId(Ids::COAL)); + self::register("cocoa_beans", $factory->fromTypeId(Ids::COCOA_BEANS)); + self::register("compass", $factory->fromTypeId(Ids::COMPASS)); + self::register("cooked_chicken", $factory->fromTypeId(Ids::COOKED_CHICKEN)); + self::register("cooked_fish", $factory->fromTypeId(Ids::COOKED_FISH)); + self::register("cooked_mutton", $factory->fromTypeId(Ids::COOKED_MUTTON)); + self::register("cooked_porkchop", $factory->fromTypeId(Ids::COOKED_PORKCHOP)); + self::register("cooked_rabbit", $factory->fromTypeId(Ids::COOKED_RABBIT)); + self::register("cooked_salmon", $factory->fromTypeId(Ids::COOKED_SALMON)); + self::register("cookie", $factory->fromTypeId(Ids::COOKIE)); + self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); + self::register("dark_oak_boat", $factory->fromTypeId(Ids::DARK_OAK_BOAT)); + self::register("dark_oak_sign", $factory->fromTypeId(Ids::DARK_OAK_SIGN)); + self::register("diamond", $factory->fromTypeId(Ids::DIAMOND)); + self::register("diamond_axe", $factory->fromTypeId(Ids::DIAMOND_AXE)); + self::register("diamond_boots", $factory->fromTypeId(Ids::DIAMOND_BOOTS)); + self::register("diamond_chestplate", $factory->fromTypeId(Ids::DIAMOND_CHESTPLATE)); + self::register("diamond_helmet", $factory->fromTypeId(Ids::DIAMOND_HELMET)); + self::register("diamond_hoe", $factory->fromTypeId(Ids::DIAMOND_HOE)); + self::register("diamond_leggings", $factory->fromTypeId(Ids::DIAMOND_LEGGINGS)); + self::register("diamond_pickaxe", $factory->fromTypeId(Ids::DIAMOND_PICKAXE)); + self::register("diamond_shovel", $factory->fromTypeId(Ids::DIAMOND_SHOVEL)); + self::register("diamond_sword", $factory->fromTypeId(Ids::DIAMOND_SWORD)); + self::register("dragon_breath", $factory->fromTypeId(Ids::DRAGON_BREATH)); + self::register("dried_kelp", $factory->fromTypeId(Ids::DRIED_KELP)); + self::register("dye", $factory->fromTypeId(Ids::DYE)); + self::register("egg", $factory->fromTypeId(Ids::EGG)); + self::register("emerald", $factory->fromTypeId(Ids::EMERALD)); + self::register("enchanted_golden_apple", $factory->fromTypeId(Ids::ENCHANTED_GOLDEN_APPLE)); + self::register("ender_pearl", $factory->fromTypeId(Ids::ENDER_PEARL)); + self::register("experience_bottle", $factory->fromTypeId(Ids::EXPERIENCE_BOTTLE)); + self::register("feather", $factory->fromTypeId(Ids::FEATHER)); + self::register("fermented_spider_eye", $factory->fromTypeId(Ids::FERMENTED_SPIDER_EYE)); + self::register("fishing_rod", $factory->fromTypeId(Ids::FISHING_ROD)); + self::register("flint", $factory->fromTypeId(Ids::FLINT)); + self::register("flint_and_steel", $factory->fromTypeId(Ids::FLINT_AND_STEEL)); + self::register("ghast_tear", $factory->fromTypeId(Ids::GHAST_TEAR)); + self::register("glass_bottle", $factory->fromTypeId(Ids::GLASS_BOTTLE)); + self::register("glistering_melon", $factory->fromTypeId(Ids::GLISTERING_MELON)); + self::register("glowstone_dust", $factory->fromTypeId(Ids::GLOWSTONE_DUST)); + self::register("gold_ingot", $factory->fromTypeId(Ids::GOLD_INGOT)); + self::register("gold_nugget", $factory->fromTypeId(Ids::GOLD_NUGGET)); + self::register("golden_apple", $factory->fromTypeId(Ids::GOLDEN_APPLE)); + self::register("golden_axe", $factory->fromTypeId(Ids::GOLDEN_AXE)); + self::register("golden_boots", $factory->fromTypeId(Ids::GOLDEN_BOOTS)); + self::register("golden_carrot", $factory->fromTypeId(Ids::GOLDEN_CARROT)); + self::register("golden_chestplate", $factory->fromTypeId(Ids::GOLDEN_CHESTPLATE)); + self::register("golden_helmet", $factory->fromTypeId(Ids::GOLDEN_HELMET)); + self::register("golden_hoe", $factory->fromTypeId(Ids::GOLDEN_HOE)); + self::register("golden_leggings", $factory->fromTypeId(Ids::GOLDEN_LEGGINGS)); + self::register("golden_pickaxe", $factory->fromTypeId(Ids::GOLDEN_PICKAXE)); + self::register("golden_shovel", $factory->fromTypeId(Ids::GOLDEN_SHOVEL)); + self::register("golden_sword", $factory->fromTypeId(Ids::GOLDEN_SWORD)); + self::register("gunpowder", $factory->fromTypeId(Ids::GUNPOWDER)); + self::register("heart_of_the_sea", $factory->fromTypeId(Ids::HEART_OF_THE_SEA)); + self::register("ink_sac", $factory->fromTypeId(Ids::INK_SAC)); + self::register("iron_axe", $factory->fromTypeId(Ids::IRON_AXE)); + self::register("iron_boots", $factory->fromTypeId(Ids::IRON_BOOTS)); + self::register("iron_chestplate", $factory->fromTypeId(Ids::IRON_CHESTPLATE)); + self::register("iron_helmet", $factory->fromTypeId(Ids::IRON_HELMET)); + self::register("iron_hoe", $factory->fromTypeId(Ids::IRON_HOE)); + self::register("iron_ingot", $factory->fromTypeId(Ids::IRON_INGOT)); + self::register("iron_leggings", $factory->fromTypeId(Ids::IRON_LEGGINGS)); + self::register("iron_nugget", $factory->fromTypeId(Ids::IRON_NUGGET)); + self::register("iron_pickaxe", $factory->fromTypeId(Ids::IRON_PICKAXE)); + self::register("iron_shovel", $factory->fromTypeId(Ids::IRON_SHOVEL)); + self::register("iron_sword", $factory->fromTypeId(Ids::IRON_SWORD)); + self::register("jungle_boat", $factory->fromTypeId(Ids::JUNGLE_BOAT)); + self::register("jungle_sign", $factory->fromTypeId(Ids::JUNGLE_SIGN)); + self::register("lapis_lazuli", $factory->fromTypeId(Ids::LAPIS_LAZULI)); + self::register("lava_bucket", $factory->fromTypeId(Ids::LAVA_BUCKET)); + self::register("leather", $factory->fromTypeId(Ids::LEATHER)); + self::register("leather_boots", $factory->fromTypeId(Ids::LEATHER_BOOTS)); + self::register("leather_cap", $factory->fromTypeId(Ids::LEATHER_CAP)); + self::register("leather_pants", $factory->fromTypeId(Ids::LEATHER_PANTS)); + self::register("leather_tunic", $factory->fromTypeId(Ids::LEATHER_TUNIC)); + self::register("magma_cream", $factory->fromTypeId(Ids::MAGMA_CREAM)); + self::register("melon", $factory->fromTypeId(Ids::MELON)); + self::register("melon_seeds", $factory->fromTypeId(Ids::MELON_SEEDS)); + self::register("milk_bucket", $factory->fromTypeId(Ids::MILK_BUCKET)); + self::register("minecart", $factory->fromTypeId(Ids::MINECART)); + self::register("mushroom_stew", $factory->fromTypeId(Ids::MUSHROOM_STEW)); + self::register("nautilus_shell", $factory->fromTypeId(Ids::NAUTILUS_SHELL)); + self::register("nether_brick", $factory->fromTypeId(Ids::NETHER_BRICK)); + self::register("nether_quartz", $factory->fromTypeId(Ids::NETHER_QUARTZ)); + self::register("nether_star", $factory->fromTypeId(Ids::NETHER_STAR)); + self::register("oak_boat", $factory->fromTypeId(Ids::OAK_BOAT)); + self::register("oak_sign", $factory->fromTypeId(Ids::OAK_SIGN)); + self::register("painting", $factory->fromTypeId(Ids::PAINTING)); + self::register("paper", $factory->fromTypeId(Ids::PAPER)); + self::register("poisonous_potato", $factory->fromTypeId(Ids::POISONOUS_POTATO)); + self::register("popped_chorus_fruit", $factory->fromTypeId(Ids::POPPED_CHORUS_FRUIT)); + self::register("potato", $factory->fromTypeId(Ids::POTATO)); + self::register("potion", $factory->fromTypeId(Ids::POTION)); + self::register("prismarine_crystals", $factory->fromTypeId(Ids::PRISMARINE_CRYSTALS)); + self::register("prismarine_shard", $factory->fromTypeId(Ids::PRISMARINE_SHARD)); + self::register("pufferfish", $factory->fromTypeId(Ids::PUFFERFISH)); + self::register("pumpkin_pie", $factory->fromTypeId(Ids::PUMPKIN_PIE)); + self::register("pumpkin_seeds", $factory->fromTypeId(Ids::PUMPKIN_SEEDS)); + self::register("rabbit_foot", $factory->fromTypeId(Ids::RABBIT_FOOT)); + self::register("rabbit_hide", $factory->fromTypeId(Ids::RABBIT_HIDE)); + self::register("rabbit_stew", $factory->fromTypeId(Ids::RABBIT_STEW)); + self::register("raw_beef", $factory->fromTypeId(Ids::RAW_BEEF)); + self::register("raw_chicken", $factory->fromTypeId(Ids::RAW_CHICKEN)); + self::register("raw_fish", $factory->fromTypeId(Ids::RAW_FISH)); + self::register("raw_mutton", $factory->fromTypeId(Ids::RAW_MUTTON)); + self::register("raw_porkchop", $factory->fromTypeId(Ids::RAW_PORKCHOP)); + self::register("raw_rabbit", $factory->fromTypeId(Ids::RAW_RABBIT)); + self::register("raw_salmon", $factory->fromTypeId(Ids::RAW_SALMON)); + self::register("record_11", $factory->fromTypeId(Ids::RECORD_11)); + self::register("record_13", $factory->fromTypeId(Ids::RECORD_13)); + self::register("record_blocks", $factory->fromTypeId(Ids::RECORD_BLOCKS)); + self::register("record_cat", $factory->fromTypeId(Ids::RECORD_CAT)); + self::register("record_chirp", $factory->fromTypeId(Ids::RECORD_CHIRP)); + self::register("record_far", $factory->fromTypeId(Ids::RECORD_FAR)); + self::register("record_mall", $factory->fromTypeId(Ids::RECORD_MALL)); + self::register("record_mellohi", $factory->fromTypeId(Ids::RECORD_MELLOHI)); + self::register("record_stal", $factory->fromTypeId(Ids::RECORD_STAL)); + self::register("record_strad", $factory->fromTypeId(Ids::RECORD_STRAD)); + self::register("record_wait", $factory->fromTypeId(Ids::RECORD_WAIT)); + self::register("record_ward", $factory->fromTypeId(Ids::RECORD_WARD)); + self::register("redstone_dust", $factory->fromTypeId(Ids::REDSTONE_DUST)); + self::register("rotten_flesh", $factory->fromTypeId(Ids::ROTTEN_FLESH)); + self::register("scute", $factory->fromTypeId(Ids::SCUTE)); + self::register("shears", $factory->fromTypeId(Ids::SHEARS)); + self::register("shulker_shell", $factory->fromTypeId(Ids::SHULKER_SHELL)); + self::register("slimeball", $factory->fromTypeId(Ids::SLIMEBALL)); + self::register("snowball", $factory->fromTypeId(Ids::SNOWBALL)); + self::register("spider_eye", $factory->fromTypeId(Ids::SPIDER_EYE)); + self::register("splash_potion", $factory->fromTypeId(Ids::SPLASH_POTION)); + self::register("spruce_boat", $factory->fromTypeId(Ids::SPRUCE_BOAT)); + self::register("spruce_sign", $factory->fromTypeId(Ids::SPRUCE_SIGN)); + self::register("squid_spawn_egg", $factory->fromTypeId(Ids::SQUID_SPAWN_EGG)); + self::register("steak", $factory->fromTypeId(Ids::STEAK)); + self::register("stick", $factory->fromTypeId(Ids::STICK)); + self::register("stone_axe", $factory->fromTypeId(Ids::STONE_AXE)); + self::register("stone_hoe", $factory->fromTypeId(Ids::STONE_HOE)); + self::register("stone_pickaxe", $factory->fromTypeId(Ids::STONE_PICKAXE)); + self::register("stone_shovel", $factory->fromTypeId(Ids::STONE_SHOVEL)); + self::register("stone_sword", $factory->fromTypeId(Ids::STONE_SWORD)); + self::register("string", $factory->fromTypeId(Ids::STRING)); + self::register("sugar", $factory->fromTypeId(Ids::SUGAR)); + self::register("sweet_berries", $factory->fromTypeId(Ids::SWEET_BERRIES)); + self::register("totem", $factory->fromTypeId(Ids::TOTEM)); + self::register("villager_spawn_egg", $factory->fromTypeId(Ids::VILLAGER_SPAWN_EGG)); + self::register("water_bucket", $factory->fromTypeId(Ids::WATER_BUCKET)); + self::register("wheat", $factory->fromTypeId(Ids::WHEAT)); + self::register("wheat_seeds", $factory->fromTypeId(Ids::WHEAT_SEEDS)); + self::register("wooden_axe", $factory->fromTypeId(Ids::WOODEN_AXE)); + self::register("wooden_hoe", $factory->fromTypeId(Ids::WOODEN_HOE)); + self::register("wooden_pickaxe", $factory->fromTypeId(Ids::WOODEN_PICKAXE)); + self::register("wooden_shovel", $factory->fromTypeId(Ids::WOODEN_SHOVEL)); + self::register("wooden_sword", $factory->fromTypeId(Ids::WOODEN_SWORD)); + self::register("writable_book", $factory->fromTypeId(Ids::WRITABLE_BOOK)); + self::register("written_book", $factory->fromTypeId(Ids::WRITTEN_BOOK)); + self::register("zombie_spawn_egg", $factory->fromTypeId(Ids::ZOMBIE_SPAWN_EGG)); } } diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index 32e8f41398..80ff0c4a4c 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -39,7 +39,7 @@ final class ItemSerializerDeserializerTest extends TestCase{ } public function testAllVanillaItemsSerializableAndDeserializable() : void{ - foreach(ItemFactory::getInstance()->getAllRegistered() as $item){ + foreach(ItemFactory::getInstance()->getAllKnownTypes() as $item){ if($item->isNull()){ continue; } diff --git a/tests/phpunit/item/ItemFactoryTest.php b/tests/phpunit/item/ItemFactoryTest.php deleted file mode 100644 index 205a871071..0000000000 --- a/tests/phpunit/item/ItemFactoryTest.php +++ /dev/null @@ -1,46 +0,0 @@ -get(ItemIds::WOODEN_SWORD)); - /** @var Sword $i1 */ - self::assertSame(0, $i1->getDamage()); - self::assertInstanceOf(Sword::class, $i2 = ItemFactory::getInstance()->get(ItemIds::WOODEN_SWORD, 1)); - /** @var Sword $i2 */ - self::assertSame(1, $i2->getDamage()); - } - - public function testGetDurableItemWithTooLargeDurability() : void{ - self::assertInstanceOf(Sword::class, ItemFactory::getInstance()->get(ItemIds::WOODEN_SWORD, ToolTier::WOOD()->getMaxDurability())); - ItemFactory::getInstance()->get(ItemIds::WOODEN_SWORD, ToolTier::WOOD()->getMaxDurability() + 1); - } -} From c5282b059b2f694af445123394244c9ad855336a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 14:26:59 +0100 Subject: [PATCH 0267/1858] ... --- src/data/runtime/RuntimeEnumDeserializer.php | 19 +++++++++++++++++++ src/data/runtime/RuntimeEnumSerializer.php | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializer.php index 80739026c1..3c7eb5ad8a 100644 --- a/src/data/runtime/RuntimeEnumDeserializer.php +++ b/src/data/runtime/RuntimeEnumDeserializer.php @@ -1,5 +1,24 @@ Date: Tue, 5 Jul 2022 15:12:55 +0100 Subject: [PATCH 0268/1858] Exterminate legacy item IDs --- src/crafting/CraftingManager.php | 9 +- src/crafting/FurnaceRecipeManager.php | 2 +- src/data/bedrock/CoralTypeIdMap.php | 68 -- src/data/runtime/RuntimeEnumDeserializer.php | 48 ++ src/data/runtime/RuntimeEnumSerializer.php | 48 ++ src/item/Banner.php | 6 +- src/item/CoralFan.php | 21 +- src/item/Dye.php | 13 +- src/item/Item.php | 19 +- src/item/ItemBlock.php | 5 + src/item/ItemFactory.php | 447 ++++++----- src/item/ItemIdentifier.php | 28 +- src/item/ItemIdentifierFlattened.php | 41 - src/item/ItemIds.php | 736 ------------------ src/item/Potion.php | 7 +- src/item/SplashPotion.php | 7 +- src/network/mcpe/convert/TypeConverter.php | 5 +- src/player/Player.php | 7 +- .../data/bedrock/CoralTypeIdMapTest.php | 38 - 19 files changed, 375 insertions(+), 1180 deletions(-) delete mode 100644 src/data/bedrock/CoralTypeIdMap.php delete mode 100644 src/item/ItemIdentifierFlattened.php delete mode 100644 src/item/ItemIds.php delete mode 100644 tests/phpunit/data/bedrock/CoralTypeIdMapTest.php diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 42e0db705f..f83901d33c 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -91,7 +91,7 @@ class CraftingManager{ */ public static function sort(Item $i1, Item $i2) : int{ //Use spaceship operator to compare each property, then try the next one if they are equivalent. - ($retval = $i1->getId() <=> $i2->getId()) === 0 && ($retval = $i1->getMeta() <=> $i2->getMeta()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; + ($retval = $i1->getTypeId() <=> $i2->getTypeId()) === 0 && ($retval = $i1->computeTypeData() <=> $i2->computeTypeData()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; return $retval; } @@ -130,8 +130,7 @@ class CraftingManager{ foreach($outputs as $o){ //count is not written because the outputs might be from multiple repetitions of a single recipe //this reduces the accuracy of the hash, but it won't matter in most cases. - $result->putVarInt($o->getId()); - $result->putVarInt($o->getMeta()); + $result->putVarInt(morton2d_encode($o->getTypeId(), $o->computeTypeData())); $result->put((new LittleEndianNbtSerializer())->write(new TreeRoot($o->getNamedTag()))); } @@ -256,8 +255,8 @@ class CraftingManager{ } public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ - $inputHash = morton2d_encode($input->getId(), $input->getMeta()); - $ingredientHash = morton2d_encode($ingredient->getId(), $ingredient->getMeta()); + $inputHash = morton2d_encode($input->getTypeId(), $input->computeTypeData()); + $ingredientHash = morton2d_encode($ingredient->getTypeId(), $ingredient->computeTypeData()); $cached = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; if($cached !== null){ return $cached; diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index 5d46f0e19d..74e2817b66 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -66,7 +66,7 @@ final class FurnaceRecipeManager{ } public function match(Item $input) : ?FurnaceRecipe{ - $index = morton2d_encode($input->getId(), $input->getMeta()); + $index = morton2d_encode($input->getTypeId(), $input->computeTypeData()); $simpleRecipe = $this->lookupCache[$index] ?? null; if($simpleRecipe !== null){ return $simpleRecipe; diff --git a/src/data/bedrock/CoralTypeIdMap.php b/src/data/bedrock/CoralTypeIdMap.php deleted file mode 100644 index fd1651206f..0000000000 --- a/src/data/bedrock/CoralTypeIdMap.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - private array $idToEnum = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; - - public function __construct(){ - $this->register(BlockLegacyMetadata::CORAL_VARIANT_TUBE, CoralType::TUBE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_BRAIN, CoralType::BRAIN()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_BUBBLE, CoralType::BUBBLE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_FIRE, CoralType::FIRE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_HORN, CoralType::HORN()); - } - - public function register(int $id, CoralType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?CoralType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(CoralType $type) : int{ - if(!array_key_exists($type->id(), $this->enumToId)){ - throw new \InvalidArgumentException("Coral type does not have a mapped ID"); //this should never happen - } - return $this->enumToId[$type->id()]; - } -} diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializer.php index 3c7eb5ad8a..f5835f962f 100644 --- a/src/data/runtime/RuntimeEnumDeserializer.php +++ b/src/data/runtime/RuntimeEnumDeserializer.php @@ -103,6 +103,54 @@ final class RuntimeEnumDeserializer{ }; } + public static function readPotionType(RuntimeDataReader $r) : \pocketmine\item\PotionType{ + return match($r->readInt(6)){ + 0 => \pocketmine\item\PotionType::AWKWARD(), + 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE(), + 2 => \pocketmine\item\PotionType::HARMING(), + 3 => \pocketmine\item\PotionType::HEALING(), + 4 => \pocketmine\item\PotionType::INVISIBILITY(), + 5 => \pocketmine\item\PotionType::LEAPING(), + 6 => \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE(), + 7 => \pocketmine\item\PotionType::LONG_INVISIBILITY(), + 8 => \pocketmine\item\PotionType::LONG_LEAPING(), + 9 => \pocketmine\item\PotionType::LONG_MUNDANE(), + 10 => \pocketmine\item\PotionType::LONG_NIGHT_VISION(), + 11 => \pocketmine\item\PotionType::LONG_POISON(), + 12 => \pocketmine\item\PotionType::LONG_REGENERATION(), + 13 => \pocketmine\item\PotionType::LONG_SLOWNESS(), + 14 => \pocketmine\item\PotionType::LONG_SLOW_FALLING(), + 15 => \pocketmine\item\PotionType::LONG_STRENGTH(), + 16 => \pocketmine\item\PotionType::LONG_SWIFTNESS(), + 17 => \pocketmine\item\PotionType::LONG_TURTLE_MASTER(), + 18 => \pocketmine\item\PotionType::LONG_WATER_BREATHING(), + 19 => \pocketmine\item\PotionType::LONG_WEAKNESS(), + 20 => \pocketmine\item\PotionType::MUNDANE(), + 21 => \pocketmine\item\PotionType::NIGHT_VISION(), + 22 => \pocketmine\item\PotionType::POISON(), + 23 => \pocketmine\item\PotionType::REGENERATION(), + 24 => \pocketmine\item\PotionType::SLOWNESS(), + 25 => \pocketmine\item\PotionType::SLOW_FALLING(), + 26 => \pocketmine\item\PotionType::STRENGTH(), + 27 => \pocketmine\item\PotionType::STRONG_HARMING(), + 28 => \pocketmine\item\PotionType::STRONG_HEALING(), + 29 => \pocketmine\item\PotionType::STRONG_LEAPING(), + 30 => \pocketmine\item\PotionType::STRONG_POISON(), + 31 => \pocketmine\item\PotionType::STRONG_REGENERATION(), + 32 => \pocketmine\item\PotionType::STRONG_STRENGTH(), + 33 => \pocketmine\item\PotionType::STRONG_SWIFTNESS(), + 34 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER(), + 35 => \pocketmine\item\PotionType::SWIFTNESS(), + 36 => \pocketmine\item\PotionType::THICK(), + 37 => \pocketmine\item\PotionType::TURTLE_MASTER(), + 38 => \pocketmine\item\PotionType::WATER(), + 39 => \pocketmine\item\PotionType::WATER_BREATHING(), + 40 => \pocketmine\item\PotionType::WEAKNESS(), + 41 => \pocketmine\item\PotionType::WITHER(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for PotionType") + }; + } + public static function readSkullType(RuntimeDataReader $r) : \pocketmine\block\utils\SkullType{ return match($r->readInt(3)){ 0 => \pocketmine\block\utils\SkullType::CREEPER(), diff --git a/src/data/runtime/RuntimeEnumSerializer.php b/src/data/runtime/RuntimeEnumSerializer.php index 409f942c83..1b942d0a1b 100644 --- a/src/data/runtime/RuntimeEnumSerializer.php +++ b/src/data/runtime/RuntimeEnumSerializer.php @@ -103,6 +103,54 @@ final class RuntimeEnumSerializer{ }); } + public static function writePotionType(RuntimeDataWriter $w, \pocketmine\item\PotionType $value) : void{ + $w->writeInt(6, match($value){ + \pocketmine\item\PotionType::AWKWARD() => 0, + \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, + \pocketmine\item\PotionType::HARMING() => 2, + \pocketmine\item\PotionType::HEALING() => 3, + \pocketmine\item\PotionType::INVISIBILITY() => 4, + \pocketmine\item\PotionType::LEAPING() => 5, + \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE() => 6, + \pocketmine\item\PotionType::LONG_INVISIBILITY() => 7, + \pocketmine\item\PotionType::LONG_LEAPING() => 8, + \pocketmine\item\PotionType::LONG_MUNDANE() => 9, + \pocketmine\item\PotionType::LONG_NIGHT_VISION() => 10, + \pocketmine\item\PotionType::LONG_POISON() => 11, + \pocketmine\item\PotionType::LONG_REGENERATION() => 12, + \pocketmine\item\PotionType::LONG_SLOWNESS() => 13, + \pocketmine\item\PotionType::LONG_SLOW_FALLING() => 14, + \pocketmine\item\PotionType::LONG_STRENGTH() => 15, + \pocketmine\item\PotionType::LONG_SWIFTNESS() => 16, + \pocketmine\item\PotionType::LONG_TURTLE_MASTER() => 17, + \pocketmine\item\PotionType::LONG_WATER_BREATHING() => 18, + \pocketmine\item\PotionType::LONG_WEAKNESS() => 19, + \pocketmine\item\PotionType::MUNDANE() => 20, + \pocketmine\item\PotionType::NIGHT_VISION() => 21, + \pocketmine\item\PotionType::POISON() => 22, + \pocketmine\item\PotionType::REGENERATION() => 23, + \pocketmine\item\PotionType::SLOWNESS() => 24, + \pocketmine\item\PotionType::SLOW_FALLING() => 25, + \pocketmine\item\PotionType::STRENGTH() => 26, + \pocketmine\item\PotionType::STRONG_HARMING() => 27, + \pocketmine\item\PotionType::STRONG_HEALING() => 28, + \pocketmine\item\PotionType::STRONG_LEAPING() => 29, + \pocketmine\item\PotionType::STRONG_POISON() => 30, + \pocketmine\item\PotionType::STRONG_REGENERATION() => 31, + \pocketmine\item\PotionType::STRONG_STRENGTH() => 32, + \pocketmine\item\PotionType::STRONG_SWIFTNESS() => 33, + \pocketmine\item\PotionType::STRONG_TURTLE_MASTER() => 34, + \pocketmine\item\PotionType::SWIFTNESS() => 35, + \pocketmine\item\PotionType::THICK() => 36, + \pocketmine\item\PotionType::TURTLE_MASTER() => 37, + \pocketmine\item\PotionType::WATER() => 38, + \pocketmine\item\PotionType::WATER_BREATHING() => 39, + \pocketmine\item\PotionType::WEAKNESS() => 40, + \pocketmine\item\PotionType::WITHER() => 41, + default => throw new \pocketmine\utils\AssumptionFailedError("All PotionType cases should be covered") + }); + } + public static function writeSkullType(RuntimeDataWriter $w, \pocketmine\block\utils\SkullType $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, diff --git a/src/item/Banner.php b/src/item/Banner.php index 343fe8e245..57202d388c 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; @@ -62,8 +64,8 @@ class Banner extends ItemBlockWallOrFloor{ return $this; } - public function getMeta() : int{ - return DyeColorIdMap::getInstance()->toInvertedId($this->color); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeDyeColor($w, $this->color); } /** diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index d6aae4f8ca..9644205035 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -27,24 +27,25 @@ use pocketmine\block\Block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; -use pocketmine\data\bedrock\CoralTypeIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Axis; use pocketmine\math\Facing; final class CoralFan extends Item{ - use CoralTypeTrait; + use CoralTypeTrait { + encodeType as encodeCoralType; + } - public function __construct(private ItemIdentifierFlattened $identifierFlattened){ + public function __construct(ItemIdentifier $identifier){ $this->coralType = CoralType::TUBE(); - parent::__construct($this->identifierFlattened, VanillaBlocks::CORAL_FAN()->getName()); + parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } - public function getId() : int{ - return $this->dead ? $this->identifierFlattened->getAdditionalLegacyIds()[0] : $this->identifierFlattened->getLegacyId(); - } - - public function getMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); + protected function encodeType(RuntimeDataWriter $w) : void{ + //this is aliased to ensure a compile error in case the functions in Item or Block start to differ in future + //right now we can directly reuse encodeType from CoralTypeTrait, but that might silently stop working if Item + //were to be altered. CoralTypeTrait was originally intended for blocks, so it's better not to assume anything. + $this->encodeCoralType($w); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/Dye.php b/src/item/Dye.php index 9c831b13af..fa93a1471f 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\DyeColor; -use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; class Dye extends Item{ private DyeColor $color; @@ -34,14 +35,8 @@ class Dye extends Item{ parent::__construct($identifier, $name); } - public function getMeta() : int{ - return match($this->color->id()){ - DyeColor::BLACK()->id() => 16, - DyeColor::BROWN()->id() => 17, - DyeColor::BLUE()->id() => 18, - DyeColor::WHITE()->id() => 19, - default => DyeColorIdMap::getInstance()->toInvertedId($this->color) - }; + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeDyeColor($w, $this->color); } public function getColor() : DyeColor{ diff --git a/src/item/Item.php b/src/item/Item.php index a22232b745..b12bb080df 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -32,6 +32,7 @@ use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\item\enchantment\EnchantmentInstance; @@ -431,12 +432,14 @@ class Item implements \JsonSerializable{ return $this->identifier->getTypeId(); } - public function getId() : int{ - return $this->identifier->getLegacyId(); + final public function computeTypeData() : int{ + $writer = new RuntimeDataWriter(16); //TODO: max bits should be a constant instead of being hardcoded all over the place + $this->encodeType($writer); + return $writer->getValue(); } - public function getMeta() : int{ - return $this->identifier->getLegacyMeta(); + protected function encodeType(RuntimeDataWriter $w) : void{ + //NOOP } /** @@ -547,12 +550,12 @@ class Item implements \JsonSerializable{ /** * Compares an Item to this Item and check if they match. * - * @param bool $checkDamage Whether to verify that the damage values match. + * @param bool $checkDamage @deprecated * @param bool $checkCompound Whether to verify that the items' NBT match. */ final public function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{ - return $this->getId() === $item->getId() && - (!$checkDamage || $this->getMeta() === $item->getMeta()) && + return $this->getTypeId() === $item->getTypeId() && + $this->computeTypeData() === $item->computeTypeData() && (!$checkCompound || $this->getNamedTag()->equals($item->getNamedTag())); } @@ -571,7 +574,7 @@ class Item implements \JsonSerializable{ } final public function __toString() : string{ - return "Item " . $this->name . " (" . $this->getId() . ":" . $this->getMeta() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); + return "Item " . $this->name . " (" . $this->getTypeId() . ":" . $this->computeTypeData() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); } /** diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index c36b78608f..8eb46cbdd3 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -26,6 +26,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\VanillaBlocks; +use pocketmine\data\runtime\RuntimeDataWriter; /** * Class used for Items that directly represent blocks, such as stone, dirt, wood etc. @@ -43,6 +44,10 @@ final class ItemBlock extends Item{ $this->blockTypeData = $block->computeTypeData(); } + protected function encodeType(RuntimeDataWriter $w) : void{ + $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); + } + public function getBlock(?int $clickedFace = null) : Block{ //TODO: HACKY MESS, CLEAN IT UP $factory = BlockFactory::getInstance(); diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 2b3fdd3fe7..cfcc05dd14 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -27,8 +27,6 @@ use pocketmine\block\BlockFactory; use pocketmine\block\utils\RecordType; use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\Squid; @@ -36,7 +34,6 @@ use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\inventory\ArmorInventory; use pocketmine\item\ItemIdentifier as IID; -use pocketmine\item\ItemIds as LegacyIds; use pocketmine\item\ItemTypeIds as Ids; use pocketmine\math\Vector3; use pocketmine\utils\AssumptionFailedError; @@ -58,191 +55,191 @@ class ItemFactory{ $this->registerSpawnEggs(); $this->registerTierToolItems(); - $this->register(new Apple(new IID(Ids::APPLE, LegacyIds::APPLE, 0), "Apple")); - $this->register(new Arrow(new IID(Ids::ARROW, LegacyIds::ARROW, 0), "Arrow")); + $this->register(new Apple(new IID(Ids::APPLE), "Apple")); + $this->register(new Arrow(new IID(Ids::ARROW), "Arrow")); - $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO, LegacyIds::BAKED_POTATO, 0), "Baked Potato")); - $this->register(new Bamboo(new IID(Ids::BAMBOO, LegacyIds::BAMBOO, 0), "Bamboo"), true); - $this->register(new Beetroot(new IID(Ids::BEETROOT, LegacyIds::BEETROOT, 0), "Beetroot")); - $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS, LegacyIds::BEETROOT_SEEDS, 0), "Beetroot Seeds")); - $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP, LegacyIds::BEETROOT_SOUP, 0), "Beetroot Soup")); - $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD, LegacyIds::BLAZE_ROD, 0), "Blaze Rod")); - $this->register(new Book(new IID(Ids::BOOK, LegacyIds::BOOK, 0), "Book")); - $this->register(new Bow(new IID(Ids::BOW, LegacyIds::BOW, 0), "Bow")); - $this->register(new Bowl(new IID(Ids::BOWL, LegacyIds::BOWL, 0), "Bowl")); - $this->register(new Bread(new IID(Ids::BREAD, LegacyIds::BREAD, 0), "Bread")); - $this->register(new Bucket(new IID(Ids::BUCKET, LegacyIds::BUCKET, 0), "Bucket")); - $this->register(new Carrot(new IID(Ids::CARROT, LegacyIds::CARROT, 0), "Carrot")); - $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT, 0), "Chorus Fruit")); - $this->register(new Clock(new IID(Ids::CLOCK, LegacyIds::CLOCK, 0), "Clock")); - $this->register(new Clownfish(new IID(Ids::CLOWNFISH, LegacyIds::CLOWNFISH, 0), "Clownfish")); - $this->register(new Coal(new IID(Ids::COAL, LegacyIds::COAL, 0), "Coal")); + $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); + $this->register(new Bamboo(new IID(Ids::BAMBOO), "Bamboo"), true); + $this->register(new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); + $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); + $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); + $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); + $this->register(new Book(new IID(Ids::BOOK), "Book")); + $this->register(new Bow(new IID(Ids::BOW), "Bow")); + $this->register(new Bowl(new IID(Ids::BOWL), "Bowl")); + $this->register(new Bread(new IID(Ids::BREAD), "Bread")); + $this->register(new Bucket(new IID(Ids::BUCKET), "Bucket")); + $this->register(new Carrot(new IID(Ids::CARROT), "Carrot")); + $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); + $this->register(new Clock(new IID(Ids::CLOCK), "Clock")); + $this->register(new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); + $this->register(new Coal(new IID(Ids::COAL), "Coal")); - $this->register(new CoralFan(new ItemIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, [LegacyIds::CORAL_FAN_DEAD]))); + $this->register(new CoralFan(new IID(Ids::CORAL_FAN))); - $this->register(new Coal(new IID(Ids::CHARCOAL, LegacyIds::COAL, 1), "Charcoal")); - $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS, LegacyIds::DYE, 3), "Cocoa Beans")); - $this->register(new Compass(new IID(Ids::COMPASS, LegacyIds::COMPASS, 0), "Compass")); - $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN, LegacyIds::COOKED_CHICKEN, 0), "Cooked Chicken")); - $this->register(new CookedFish(new IID(Ids::COOKED_FISH, LegacyIds::COOKED_FISH, 0), "Cooked Fish")); - $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON, LegacyIds::COOKED_MUTTON, 0), "Cooked Mutton")); - $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP, LegacyIds::COOKED_PORKCHOP, 0), "Cooked Porkchop")); - $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT, LegacyIds::COOKED_RABBIT, 0), "Cooked Rabbit")); - $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON, LegacyIds::COOKED_SALMON, 0), "Cooked Salmon")); - $this->register(new Cookie(new IID(Ids::COOKIE, LegacyIds::COOKIE, 0), "Cookie")); - $this->register(new DriedKelp(new IID(Ids::DRIED_KELP, LegacyIds::DRIED_KELP, 0), "Dried Kelp")); - $this->register(new Egg(new IID(Ids::EGG, LegacyIds::EGG, 0), "Egg")); - $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL, LegacyIds::ENDER_PEARL, 0), "Ender Pearl")); - $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE, LegacyIds::EXPERIENCE_BOTTLE, 0), "Bottle o' Enchanting")); - $this->register(new Fertilizer(new IID(Ids::BONE_MEAL, LegacyIds::DYE, 15), "Bone Meal")); - $this->register(new FishingRod(new IID(Ids::FISHING_ROD, LegacyIds::FISHING_ROD, 0), "Fishing Rod")); - $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL, LegacyIds::FLINT_STEEL, 0), "Flint and Steel")); - $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE, LegacyIds::GLASS_BOTTLE, 0), "Glass Bottle")); - $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE, LegacyIds::GOLDEN_APPLE, 0), "Golden Apple")); - $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE, LegacyIds::ENCHANTED_GOLDEN_APPLE, 0), "Enchanted Golden Apple")); - $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT, LegacyIds::GOLDEN_CARROT, 0), "Golden Carrot")); - $this->register(new Item(new IID(Ids::BLAZE_POWDER, LegacyIds::BLAZE_POWDER, 0), "Blaze Powder")); - $this->register(new Item(new IID(Ids::BLEACH, LegacyIds::BLEACH, 0), "Bleach")); //EDU - $this->register(new Item(new IID(Ids::BONE, LegacyIds::BONE, 0), "Bone")); - $this->register(new Item(new IID(Ids::BRICK, LegacyIds::BRICK, 0), "Brick")); - $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT_POPPED, 0), "Popped Chorus Fruit")); - $this->register(new Item(new IID(Ids::CLAY, LegacyIds::CLAY_BALL, 0), "Clay")); - $this->register(new Item(new IID(Ids::CHEMICAL_SALT, LegacyIds::COMPOUND, CompoundTypeIds::SALT), "Salt")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_OXIDE), "Sodium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDROXIDE), "Sodium Hydroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_NITRATE), "Magnesium Nitrate")); - $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE, LegacyIds::COMPOUND, CompoundTypeIds::IRON_SULPHIDE), "Iron Sulphide")); - $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::LITHIUM_HYDRIDE), "Lithium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDRIDE), "Sodium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_BROMIDE), "Calcium Bromide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_OXIDE), "Magnesium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_ACETATE), "Sodium Acetate")); - $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL, LegacyIds::COMPOUND, CompoundTypeIds::LUMINOL), "Luminol")); - $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL, LegacyIds::COMPOUND, CompoundTypeIds::CHARCOAL), "Charcoal")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR, LegacyIds::COMPOUND, CompoundTypeIds::SUGAR), "Sugar")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::ALUMINIUM_OXIDE), "Aluminium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE, LegacyIds::COMPOUND, CompoundTypeIds::BORON_TRIOXIDE), "Boron Trioxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SOAP, LegacyIds::COMPOUND, CompoundTypeIds::SOAP), "Soap")); - $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE, LegacyIds::COMPOUND, CompoundTypeIds::POLYETHYLENE), "Polyethylene")); - $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH, LegacyIds::COMPOUND, CompoundTypeIds::RUBBISH), "Rubbish")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_SALTS), "Magnesium Salts")); - $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::SULPHATE), "Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::BARIUM_SULPHATE), "Barium Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_CHLORIDE), "Potassium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::MERCURIC_CHLORIDE), "Mercuric Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CERIUM_CHLORIDE), "Cerium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_CHLORIDE), "Calcium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_WATER, LegacyIds::COMPOUND, CompoundTypeIds::WATER), "Water")); //??? - $this->register(new Item(new IID(Ids::CHEMICAL_GLUE, LegacyIds::COMPOUND, CompoundTypeIds::GLUE), "Glue")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::HYPOCHLORITE), "Hypochlorite")); - $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL, LegacyIds::COMPOUND, CompoundTypeIds::CRUDE_OIL), "Crude Oil")); - $this->register(new Item(new IID(Ids::CHEMICAL_LATEX, LegacyIds::COMPOUND, CompoundTypeIds::LATEX), "Latex")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_IODIDE), "Potassium Iodide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_FLUORIDE), "Sodium Fluoride")); - $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE, LegacyIds::COMPOUND, CompoundTypeIds::BENZENE), "Benzene")); - $this->register(new Item(new IID(Ids::CHEMICAL_INK, LegacyIds::COMPOUND, CompoundTypeIds::INK), "Ink")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA, LegacyIds::COMPOUND, CompoundTypeIds::AMMONIA), "Ammonia")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); - $this->register(new Item(new IID(Ids::DIAMOND, LegacyIds::DIAMOND, 0), "Diamond")); - $this->register(new Item(new IID(Ids::DRAGON_BREATH, LegacyIds::DRAGON_BREATH, 0), "Dragon's Breath")); - $this->register(new Item(new IID(Ids::INK_SAC, LegacyIds::DYE, 0), "Ink Sac")); - $this->register(new Item(new IID(Ids::LAPIS_LAZULI, LegacyIds::DYE, 4), "Lapis Lazuli")); - $this->register(new Item(new IID(Ids::EMERALD, LegacyIds::EMERALD, 0), "Emerald")); - $this->register(new Item(new IID(Ids::FEATHER, LegacyIds::FEATHER, 0), "Feather")); - $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE, LegacyIds::FERMENTED_SPIDER_EYE, 0), "Fermented Spider Eye")); - $this->register(new Item(new IID(Ids::FLINT, LegacyIds::FLINT, 0), "Flint")); - $this->register(new Item(new IID(Ids::GHAST_TEAR, LegacyIds::GHAST_TEAR, 0), "Ghast Tear")); - $this->register(new Item(new IID(Ids::GLISTERING_MELON, LegacyIds::GLISTERING_MELON, 0), "Glistering Melon")); - $this->register(new Item(new IID(Ids::GLOWSTONE_DUST, LegacyIds::GLOWSTONE_DUST, 0), "Glowstone Dust")); - $this->register(new Item(new IID(Ids::GOLD_INGOT, LegacyIds::GOLD_INGOT, 0), "Gold Ingot")); - $this->register(new Item(new IID(Ids::GOLD_NUGGET, LegacyIds::GOLD_NUGGET, 0), "Gold Nugget")); - $this->register(new Item(new IID(Ids::GUNPOWDER, LegacyIds::GUNPOWDER, 0), "Gunpowder")); - $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA, LegacyIds::HEART_OF_THE_SEA, 0), "Heart of the Sea")); - $this->register(new Item(new IID(Ids::IRON_INGOT, LegacyIds::IRON_INGOT, 0), "Iron Ingot")); - $this->register(new Item(new IID(Ids::IRON_NUGGET, LegacyIds::IRON_NUGGET, 0), "Iron Nugget")); - $this->register(new Item(new IID(Ids::LEATHER, LegacyIds::LEATHER, 0), "Leather")); - $this->register(new Item(new IID(Ids::MAGMA_CREAM, LegacyIds::MAGMA_CREAM, 0), "Magma Cream")); - $this->register(new Item(new IID(Ids::NAUTILUS_SHELL, LegacyIds::NAUTILUS_SHELL, 0), "Nautilus Shell")); - $this->register(new Item(new IID(Ids::NETHER_BRICK, LegacyIds::NETHER_BRICK, 0), "Nether Brick")); - $this->register(new Item(new IID(Ids::NETHER_QUARTZ, LegacyIds::NETHER_QUARTZ, 0), "Nether Quartz")); - $this->register(new Item(new IID(Ids::NETHER_STAR, LegacyIds::NETHER_STAR, 0), "Nether Star")); - $this->register(new Item(new IID(Ids::PAPER, LegacyIds::PAPER, 0), "Paper")); - $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS, LegacyIds::PRISMARINE_CRYSTALS, 0), "Prismarine Crystals")); - $this->register(new Item(new IID(Ids::PRISMARINE_SHARD, LegacyIds::PRISMARINE_SHARD, 0), "Prismarine Shard")); - $this->register(new Item(new IID(Ids::RABBIT_FOOT, LegacyIds::RABBIT_FOOT, 0), "Rabbit's Foot")); - $this->register(new Item(new IID(Ids::RABBIT_HIDE, LegacyIds::RABBIT_HIDE, 0), "Rabbit Hide")); - $this->register(new Item(new IID(Ids::SHULKER_SHELL, LegacyIds::SHULKER_SHELL, 0), "Shulker Shell")); - $this->register(new Item(new IID(Ids::SLIMEBALL, LegacyIds::SLIME_BALL, 0), "Slimeball")); - $this->register(new Item(new IID(Ids::SUGAR, LegacyIds::SUGAR, 0), "Sugar")); - $this->register(new Item(new IID(Ids::SCUTE, LegacyIds::TURTLE_SHELL_PIECE, 0), "Scute")); - $this->register(new Item(new IID(Ids::WHEAT, LegacyIds::WHEAT, 0), "Wheat")); + $this->register(new Coal(new IID(Ids::CHARCOAL), "Charcoal")); + $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); + $this->register(new Compass(new IID(Ids::COMPASS), "Compass")); + $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); + $this->register(new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); + $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); + $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP), "Cooked Porkchop")); + $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); + $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); + $this->register(new Cookie(new IID(Ids::COOKIE), "Cookie")); + $this->register(new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); + $this->register(new Egg(new IID(Ids::EGG), "Egg")); + $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); + $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); + $this->register(new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); + $this->register(new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); + $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); + $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); + $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); + $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); + $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); + $this->register(new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); + $this->register(new Item(new IID(Ids::BLEACH), "Bleach")); //EDU + $this->register(new Item(new IID(Ids::BONE), "Bone")); + $this->register(new Item(new IID(Ids::BRICK), "Brick")); + $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); + $this->register(new Item(new IID(Ids::CLAY), "Clay")); + $this->register(new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); + $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); + $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); + $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); + $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); + $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); + $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); + $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_WATER), "Water")); //??? + $this->register(new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); + $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); + $this->register(new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); + $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); + $this->register(new Item(new IID(Ids::CHEMICAL_INK), "Ink")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + $this->register(new Item(new IID(Ids::DIAMOND), "Diamond")); + $this->register(new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); + $this->register(new Item(new IID(Ids::INK_SAC), "Ink Sac")); + $this->register(new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + $this->register(new Item(new IID(Ids::EMERALD), "Emerald")); + $this->register(new Item(new IID(Ids::FEATHER), "Feather")); + $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); + $this->register(new Item(new IID(Ids::FLINT), "Flint")); + $this->register(new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); + $this->register(new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); + $this->register(new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); + $this->register(new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); + $this->register(new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); + $this->register(new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); + $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); + $this->register(new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); + $this->register(new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); + $this->register(new Item(new IID(Ids::LEATHER), "Leather")); + $this->register(new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); + $this->register(new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); + $this->register(new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); + $this->register(new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); + $this->register(new Item(new IID(Ids::NETHER_STAR), "Nether Star")); + $this->register(new Item(new IID(Ids::PAPER), "Paper")); + $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); + $this->register(new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); + $this->register(new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); + $this->register(new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); + $this->register(new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); + $this->register(new Item(new IID(Ids::SLIMEBALL), "Slimeball")); + $this->register(new Item(new IID(Ids::SUGAR), "Sugar")); + $this->register(new Item(new IID(Ids::SCUTE), "Scute")); + $this->register(new Item(new IID(Ids::WHEAT), "Wheat")); //the meta values for buckets are intentionally hardcoded because block IDs will change in the future - $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET, LegacyIds::BUCKET, 8), "Water Bucket", Blocks::WATER())); - $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET, LegacyIds::BUCKET, 10), "Lava Bucket", Blocks::LAVA())); - $this->register(new Melon(new IID(Ids::MELON, LegacyIds::MELON, 0), "Melon")); - $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS, LegacyIds::MELON_SEEDS, 0), "Melon Seeds")); - $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET, LegacyIds::BUCKET, 1), "Milk Bucket")); - $this->register(new Minecart(new IID(Ids::MINECART, LegacyIds::MINECART, 0), "Minecart")); - $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW, LegacyIds::MUSHROOM_STEW, 0), "Mushroom Stew")); - $this->register(new PaintingItem(new IID(Ids::PAINTING, LegacyIds::PAINTING, 0), "Painting")); - $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO, LegacyIds::POISONOUS_POTATO, 0), "Poisonous Potato")); - $this->register(new Potato(new IID(Ids::POTATO, LegacyIds::POTATO, 0), "Potato")); - $this->register(new Pufferfish(new IID(Ids::PUFFERFISH, LegacyIds::PUFFERFISH, 0), "Pufferfish")); - $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE, LegacyIds::PUMPKIN_PIE, 0), "Pumpkin Pie")); - $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS, LegacyIds::PUMPKIN_SEEDS, 0), "Pumpkin Seeds")); - $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW, LegacyIds::RABBIT_STEW, 0), "Rabbit Stew")); - $this->register(new RawBeef(new IID(Ids::RAW_BEEF, LegacyIds::RAW_BEEF, 0), "Raw Beef")); - $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN, LegacyIds::RAW_CHICKEN, 0), "Raw Chicken")); - $this->register(new RawFish(new IID(Ids::RAW_FISH, LegacyIds::RAW_FISH, 0), "Raw Fish")); - $this->register(new RawMutton(new IID(Ids::RAW_MUTTON, LegacyIds::RAW_MUTTON, 0), "Raw Mutton")); - $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP, LegacyIds::RAW_PORKCHOP, 0), "Raw Porkchop")); - $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT, LegacyIds::RAW_RABBIT, 0), "Raw Rabbit")); - $this->register(new RawSalmon(new IID(Ids::RAW_SALMON, LegacyIds::RAW_SALMON, 0), "Raw Salmon")); - $this->register(new Record(new IID(Ids::RECORD_13, LegacyIds::RECORD_13, 0), RecordType::DISK_13(), "Record 13")); - $this->register(new Record(new IID(Ids::RECORD_CAT, LegacyIds::RECORD_CAT, 0), RecordType::DISK_CAT(), "Record Cat")); - $this->register(new Record(new IID(Ids::RECORD_BLOCKS, LegacyIds::RECORD_BLOCKS, 0), RecordType::DISK_BLOCKS(), "Record Blocks")); - $this->register(new Record(new IID(Ids::RECORD_CHIRP, LegacyIds::RECORD_CHIRP, 0), RecordType::DISK_CHIRP(), "Record Chirp")); - $this->register(new Record(new IID(Ids::RECORD_FAR, LegacyIds::RECORD_FAR, 0), RecordType::DISK_FAR(), "Record Far")); - $this->register(new Record(new IID(Ids::RECORD_MALL, LegacyIds::RECORD_MALL, 0), RecordType::DISK_MALL(), "Record Mall")); - $this->register(new Record(new IID(Ids::RECORD_MELLOHI, LegacyIds::RECORD_MELLOHI, 0), RecordType::DISK_MELLOHI(), "Record Mellohi")); - $this->register(new Record(new IID(Ids::RECORD_STAL, LegacyIds::RECORD_STAL, 0), RecordType::DISK_STAL(), "Record Stal")); - $this->register(new Record(new IID(Ids::RECORD_STRAD, LegacyIds::RECORD_STRAD, 0), RecordType::DISK_STRAD(), "Record Strad")); - $this->register(new Record(new IID(Ids::RECORD_WARD, LegacyIds::RECORD_WARD, 0), RecordType::DISK_WARD(), "Record Ward")); - $this->register(new Record(new IID(Ids::RECORD_11, LegacyIds::RECORD_11, 0), RecordType::DISK_11(), "Record 11")); - $this->register(new Record(new IID(Ids::RECORD_WAIT, LegacyIds::RECORD_WAIT, 0), RecordType::DISK_WAIT(), "Record Wait")); - $this->register(new Redstone(new IID(Ids::REDSTONE_DUST, LegacyIds::REDSTONE, 0), "Redstone")); - $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH, LegacyIds::ROTTEN_FLESH, 0), "Rotten Flesh")); - $this->register(new Shears(new IID(Ids::SHEARS, LegacyIds::SHEARS, 0), "Shears")); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN, LegacyIds::SIGN, 0), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN, LegacyIds::SPRUCE_SIGN, 0), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN, LegacyIds::BIRCH_SIGN, 0), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN, LegacyIds::JUNGLE_SIGN, 0), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN, LegacyIds::ACACIA_SIGN, 0), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN, LegacyIds::DARKOAK_SIGN, 0), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - $this->register(new Snowball(new IID(Ids::SNOWBALL, LegacyIds::SNOWBALL, 0), "Snowball")); - $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE, LegacyIds::SPIDER_EYE, 0), "Spider Eye")); - $this->register(new Steak(new IID(Ids::STEAK, LegacyIds::STEAK, 0), "Steak")); - $this->register(new Stick(new IID(Ids::STICK, LegacyIds::STICK, 0), "Stick")); - $this->register(new StringItem(new IID(Ids::STRING, LegacyIds::STRING, 0), "String")); - $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES, LegacyIds::SWEET_BERRIES, 0), "Sweet Berries")); - $this->register(new Totem(new IID(Ids::TOTEM, LegacyIds::TOTEM, 0), "Totem of Undying")); - $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS, LegacyIds::WHEAT_SEEDS, 0), "Wheat Seeds")); - $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, LegacyIds::WRITABLE_BOOK, 0), "Book & Quill")); - $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, LegacyIds::WRITTEN_BOOK, 0), "Written Book")); + $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); + $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); + $this->register(new Melon(new IID(Ids::MELON), "Melon")); + $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); + $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); + $this->register(new Minecart(new IID(Ids::MINECART), "Minecart")); + $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); + $this->register(new PaintingItem(new IID(Ids::PAINTING), "Painting")); + $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); + $this->register(new Potato(new IID(Ids::POTATO), "Potato")); + $this->register(new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); + $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); + $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); + $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); + $this->register(new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); + $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); + $this->register(new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); + $this->register(new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); + $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); + $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); + $this->register(new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); + $this->register(new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); + $this->register(new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); + $this->register(new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); + $this->register(new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); + $this->register(new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); + $this->register(new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); + $this->register(new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); + $this->register(new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); + $this->register(new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); + $this->register(new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); + $this->register(new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); + $this->register(new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); + $this->register(new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); + $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); + $this->register(new Shears(new IID(Ids::SHEARS), "Shears")); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + $this->register(new Snowball(new IID(Ids::SNOWBALL), "Snowball")); + $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); + $this->register(new Steak(new IID(Ids::STEAK), "Steak")); + $this->register(new Stick(new IID(Ids::STICK), "Stick")); + $this->register(new StringItem(new IID(Ids::STRING), "String")); + $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); + $this->register(new Totem(new IID(Ids::TOTEM), "Totem of Undying")); + $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); + $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); + $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); //TODO: add interface to dye-colour objects - $this->register(new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye")); + $this->register(new Dye(new IID(Ids::DYE), "Dye")); $this->register(new Banner( - new IID(Ids::BANNER, LegacyIds::BANNER, 0), + new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER() )); - $this->register(new Potion(new IID(Ids::POTION, LegacyIds::POTION, 0), "Potion")); - $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION, LegacyIds::SPLASH_POTION, 0), "Splash Potion")); + $this->register(new Potion(new IID(Ids::POTION), "Potion")); + $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); foreach(TreeType::getAll() as $type){ //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency @@ -254,7 +251,7 @@ class ItemFactory{ TreeType::ACACIA() => Ids::ACACIA_BOAT, TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) - }, LegacyIds::BOAT, $type->getMagicNumber()), $type->getDisplayName() . " Boat", $type)); + }), $type->getDisplayName() . " Boat", $type)); } //region --- auto-generated TODOs --- @@ -302,17 +299,17 @@ class ItemFactory{ private function registerSpawnEggs() : void{ //TODO: the meta values should probably be hardcoded; they won't change, but the EntityLegacyIds might - $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::ZOMBIE), "Zombie Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG), "Zombie Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::SQUID), "Squid Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::VILLAGER), "Villager Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); } @@ -320,54 +317,54 @@ class ItemFactory{ } private function registerTierToolItems() : void{ - $this->register(new Axe(new IID(Ids::DIAMOND_AXE, LegacyIds::DIAMOND_AXE, 0), "Diamond Axe", ToolTier::DIAMOND())); - $this->register(new Axe(new IID(Ids::GOLDEN_AXE, LegacyIds::GOLDEN_AXE, 0), "Golden Axe", ToolTier::GOLD())); - $this->register(new Axe(new IID(Ids::IRON_AXE, LegacyIds::IRON_AXE, 0), "Iron Axe", ToolTier::IRON())); - $this->register(new Axe(new IID(Ids::STONE_AXE, LegacyIds::STONE_AXE, 0), "Stone Axe", ToolTier::STONE())); - $this->register(new Axe(new IID(Ids::WOODEN_AXE, LegacyIds::WOODEN_AXE, 0), "Wooden Axe", ToolTier::WOOD())); - $this->register(new Hoe(new IID(Ids::DIAMOND_HOE, LegacyIds::DIAMOND_HOE, 0), "Diamond Hoe", ToolTier::DIAMOND())); - $this->register(new Hoe(new IID(Ids::GOLDEN_HOE, LegacyIds::GOLDEN_HOE, 0), "Golden Hoe", ToolTier::GOLD())); - $this->register(new Hoe(new IID(Ids::IRON_HOE, LegacyIds::IRON_HOE, 0), "Iron Hoe", ToolTier::IRON())); - $this->register(new Hoe(new IID(Ids::STONE_HOE, LegacyIds::STONE_HOE, 0), "Stone Hoe", ToolTier::STONE())); - $this->register(new Hoe(new IID(Ids::WOODEN_HOE, LegacyIds::WOODEN_HOE, 0), "Wooden Hoe", ToolTier::WOOD())); - $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE, LegacyIds::DIAMOND_PICKAXE, 0), "Diamond Pickaxe", ToolTier::DIAMOND())); - $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE, LegacyIds::GOLDEN_PICKAXE, 0), "Golden Pickaxe", ToolTier::GOLD())); - $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE, LegacyIds::IRON_PICKAXE, 0), "Iron Pickaxe", ToolTier::IRON())); - $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE, LegacyIds::STONE_PICKAXE, 0), "Stone Pickaxe", ToolTier::STONE())); - $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE, LegacyIds::WOODEN_PICKAXE, 0), "Wooden Pickaxe", ToolTier::WOOD())); - $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL, LegacyIds::DIAMOND_SHOVEL, 0), "Diamond Shovel", ToolTier::DIAMOND())); - $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL, LegacyIds::GOLDEN_SHOVEL, 0), "Golden Shovel", ToolTier::GOLD())); - $this->register(new Shovel(new IID(Ids::IRON_SHOVEL, LegacyIds::IRON_SHOVEL, 0), "Iron Shovel", ToolTier::IRON())); - $this->register(new Shovel(new IID(Ids::STONE_SHOVEL, LegacyIds::STONE_SHOVEL, 0), "Stone Shovel", ToolTier::STONE())); - $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL, LegacyIds::WOODEN_SHOVEL, 0), "Wooden Shovel", ToolTier::WOOD())); - $this->register(new Sword(new IID(Ids::DIAMOND_SWORD, LegacyIds::DIAMOND_SWORD, 0), "Diamond Sword", ToolTier::DIAMOND())); - $this->register(new Sword(new IID(Ids::GOLDEN_SWORD, LegacyIds::GOLDEN_SWORD, 0), "Golden Sword", ToolTier::GOLD())); - $this->register(new Sword(new IID(Ids::IRON_SWORD, LegacyIds::IRON_SWORD, 0), "Iron Sword", ToolTier::IRON())); - $this->register(new Sword(new IID(Ids::STONE_SWORD, LegacyIds::STONE_SWORD, 0), "Stone Sword", ToolTier::STONE())); - $this->register(new Sword(new IID(Ids::WOODEN_SWORD, LegacyIds::WOODEN_SWORD, 0), "Wooden Sword", ToolTier::WOOD())); + $this->register(new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); + $this->register(new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); + $this->register(new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); + $this->register(new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); + $this->register(new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); + $this->register(new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); + $this->register(new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); + $this->register(new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); + $this->register(new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); + $this->register(new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); + $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); + $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); + $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); + $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); + $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); + $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); + $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); + $this->register(new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); + $this->register(new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); + $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); + $this->register(new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); + $this->register(new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); + $this->register(new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); + $this->register(new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); + $this->register(new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); } private function registerArmorItems() : void{ - $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS, LegacyIds::CHAIN_BOOTS, 0), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS, LegacyIds::DIAMOND_BOOTS, 0), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS, LegacyIds::GOLDEN_BOOTS, 0), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::IRON_BOOTS, LegacyIds::IRON_BOOTS, 0), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::LEATHER_BOOTS, LegacyIds::LEATHER_BOOTS, 0), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE, LegacyIds::CHAIN_CHESTPLATE, 0), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE, LegacyIds::DIAMOND_CHESTPLATE, 0), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE, LegacyIds::GOLDEN_CHESTPLATE, 0), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE, LegacyIds::IRON_CHESTPLATE, 0), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::LEATHER_TUNIC, LegacyIds::LEATHER_CHESTPLATE, 0), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET, LegacyIds::CHAIN_HELMET, 0), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::DIAMOND_HELMET, LegacyIds::DIAMOND_HELMET, 0), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::GOLDEN_HELMET, LegacyIds::GOLDEN_HELMET, 0), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::IRON_HELMET, LegacyIds::IRON_HELMET, 0), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::LEATHER_CAP, LegacyIds::LEATHER_HELMET, 0), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS, LegacyIds::CHAIN_LEGGINGS, 0), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS, LegacyIds::DIAMOND_LEGGINGS, 0), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS, LegacyIds::GOLDEN_LEGGINGS, 0), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::IRON_LEGGINGS, LegacyIds::IRON_LEGGINGS, 0), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::LEATHER_PANTS, LegacyIds::LEATHER_LEGGINGS, 0), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); } /** diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index cf97293799..5ddf652bd2 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -26,23 +26,9 @@ namespace pocketmine\item; use pocketmine\block\Block; class ItemIdentifier{ - private int $legacyId; - private int $legacyMeta; - public function __construct( - private int $typeId, - int $legacyId, - int $legacyMeta - ){ - if($legacyId < -0x8000 || $legacyId > 0x7fff){ //signed short range - throw new \InvalidArgumentException("ID must be in range " . -0x8000 . " - " . 0x7fff); - } - if($legacyMeta < 0 || $legacyMeta > 0x7ffe){ - throw new \InvalidArgumentException("Meta must be in range 0 - " . 0x7ffe); - } - $this->legacyId = $legacyId; - $this->legacyMeta = $legacyMeta; - } + private int $typeId + ){} public static function fromBlock(Block $block) : self{ //negative item type IDs are treated as block IDs @@ -50,16 +36,8 @@ class ItemIdentifier{ //TODO: this isn't vanilla-compliant, but it'll do for now - we only use the "legacy" item ID/meta for full type //indexing right now, because item type IDs aren't granular enough //this should be removed once that's addressed - return new self(-$block->getTypeId(), -$block->getTypeId(), $block->computeTypeData()); + return new self(-$block->getTypeId()); } public function getTypeId() : int{ return $this->typeId; } - - public function getLegacyId() : int{ - return $this->legacyId; - } - - public function getLegacyMeta() : int{ - return $this->legacyMeta; - } } diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php deleted file mode 100644 index d137ee9940..0000000000 --- a/src/item/ItemIdentifierFlattened.php +++ /dev/null @@ -1,41 +0,0 @@ -additionalLegacyIds; } - - /** @return int[] */ - public function getAllLegacyIds() : array{ - return [$this->getLegacyId(), ...$this->additionalLegacyIds]; - } -} diff --git a/src/item/ItemIds.php b/src/item/ItemIds.php deleted file mode 100644 index 7790a1d7af..0000000000 --- a/src/item/ItemIds.php +++ /dev/null @@ -1,736 +0,0 @@ -toId($this->potionType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writePotionType($w, $this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index 39db4d6d7a..ab1bab4d3c 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\bedrock\PotionTypeIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; use pocketmine\entity\projectile\Throwable; @@ -38,8 +39,8 @@ class SplashPotion extends ProjectileItem{ parent::__construct($identifier, $name); } - public function getMeta() : int{ - return PotionTypeIdMap::getInstance()->toId($this->potionType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writePotionType($w, $this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 72b8831045..179fd8e8e0 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -54,12 +54,12 @@ use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use function get_class; +use function morton2d_encode; class TypeConverter{ use SingletonTrait; private const PM_ID_TAG = "___Id___"; - private const PM_META_TAG = "___Meta___"; private const RECIPE_INPUT_WILDCARD_META = 0x7fff; @@ -176,8 +176,7 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setInt(self::PM_ID_TAG, $itemStack->getId()); - $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); + $nbt->setInt(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeTypeData())); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; } diff --git a/src/player/Player.php b/src/player/Player.php index f2b8f14868..7c189ae577 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -142,6 +142,7 @@ use function max; use function mb_strlen; use function microtime; use function min; +use function morton2d_encode; use function preg_match; use function spl_object_id; use function sqrt; @@ -641,7 +642,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function getItemCooldownExpiry(Item $item) : int{ $this->checkItemCooldowns(); - return $this->usedItemsCooldown[$item->getId()] ?? 0; + return $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] ?? 0; } /** @@ -649,7 +650,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasItemCooldown(Item $item) : bool{ $this->checkItemCooldowns(); - return isset($this->usedItemsCooldown[$item->getId()]); + return isset($this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())]); } /** @@ -658,7 +659,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function resetItemCooldown(Item $item, ?int $ticks = null) : void{ $ticks = $ticks ?? $item->getCooldownTicks(); if($ticks > 0){ - $this->usedItemsCooldown[$item->getId()] = $this->server->getTick() + $ticks; + $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] = $this->server->getTick() + $ticks; } } diff --git a/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php b/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php deleted file mode 100644 index edd686cd0e..0000000000 --- a/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php +++ /dev/null @@ -1,38 +0,0 @@ -toId($type); - $type2 = CoralTypeIdMap::getInstance()->fromId($id); - self::assertTrue($type2 !== null && $type->equals($type2)); - } - } -} From 86d2ecfaff267b963bce4d37376c061257da3f1e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 15:13:38 +0100 Subject: [PATCH 0269/1858] Added runtime enum serializer generation script --- build/generate-runtime-enum-serializers.php | 212 ++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 build/generate-runtime-enum-serializers.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php new file mode 100644 index 0000000000..32429bad20 --- /dev/null +++ b/build/generate-runtime-enum-serializers.php @@ -0,0 +1,212 @@ + $memberNames + * + * @return string[] + * @phpstan-return list + */ +function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string &$functionName) : array{ + $bits = getBitsRequired($memberNames); + $lines = []; + + $functionName = "write$virtualTypeName"; + $lines[] = "public static function $functionName(RuntimeDataWriter \$w, \\$nativeTypeName \$value) : void{"; + $lines[] = "\t\$w->writeInt($bits, match(\$value){"; + + foreach($memberNames as $key => $memberName){ + $lines[] = "\t\t$memberName => $key,"; + } + $lines[] = "\t\tdefault => throw new \pocketmine\utils\AssumptionFailedError(\"All $virtualTypeName cases should be covered\")"; + $lines[] = "\t});"; + $lines[] = "}"; + + return $lines; +} + +/** + * @param string[] $memberNames + * @phpstan-param list $memberNames + * + * @return string[] + * @phpstan-return list + */ +function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string &$functionName) : array{ + $bits = getBitsRequired($memberNames); + $lines = []; + + $functionName = "read$virtualTypeName"; + $lines[] = "public static function $functionName(RuntimeDataReader \$r) : \\$nativeTypeName{"; + $lines[] = "\treturn match(\$r->readInt($bits)){"; + + foreach($memberNames as $key => $memberName){ + $lines[] = "\t\t$key => $memberName,"; + } + $lines[] = "\t\tdefault => throw new InvalidSerializedRuntimeDataException(\"Invalid serialized value for $virtualTypeName\")"; + $lines[] = "\t};"; + $lines[] = "}"; + + return $lines; +} + +/** + * @param mixed[] $members + */ +function getBitsRequired(array $members) : int{ + return (int) ceil(log(count($members), 2)); +} + +/** + * @param object[] $members + * @phpstan-param array $members + * + * @return string[] + * @phpstan-return list + */ +function stringifyEnumMembers(array $members, string $enumClass) : array{ + ksort($members, SORT_STRING); + return array_map(fn(string $enumCaseName) => "\\$enumClass::$enumCaseName()", array_keys($members)); +} + +/** + * @param object[] $enumMembers + * @phpstan-param array $enumMembers + * + * @return string[] + * @phpstan-return list + */ +function buildEnumWriterFunc(array $enumMembers, string &$functionName) : array{ + $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); + return buildWriterFunc( + $reflect->getShortName(), + $reflect->getName(), + stringifyEnumMembers($enumMembers, $reflect->getName()), + $functionName + ); +} + +/** + * @param object[] $enumMembers + * @phpstan-param array $enumMembers + * + * @return string[] + * @phpstan-return list + */ +function buildEnumReaderFunc(array $enumMembers, string &$functionName) : array{ + if(count($enumMembers) === 0){ + throw new \InvalidArgumentException("Enum members cannot be empty"); + } + $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); + return buildReaderFunc( + $reflect->getShortName(), + $reflect->getName(), + stringifyEnumMembers($enumMembers, $reflect->getName()), + $functionName + ); +} + +$enumsUsed = [ + BellAttachmentType::getAll(), + CoralType::getAll(), + DyeColor::getAll(), + LeverFacing::getAll(), + MushroomBlockType::getAll(), + SkullType::getAll(), + SlabType::getAll(), + PotionType::getAll() +]; + +$readerFuncs = []; +$writerFuncs = []; +$functionName = ""; + +foreach($enumsUsed as $enumMembers){ + $writerF = buildEnumWriterFunc($enumMembers, $functionName); + /** @var string $functionName */ + $writerFuncs[$functionName] = $writerF; + $readerF = buildEnumReaderFunc($enumMembers, $functionName); + /** @var string $functionName */ + $readerFuncs[$functionName] = $readerF; +} + +/** + * @param string[][] $functions + * @phpstan-param array> $functions + */ +function printFunctions(array $functions, string $className) : void{ + ksort($functions, SORT_STRING); + + ob_start(); + + echo <<<'HEADER' + "\t" . implode("\n\t", $functionLines), $functions)); + echo "\n\n}\n"; + + file_put_contents(dirname(__DIR__) . '/src/data/runtime/' . $className . '.php', ob_get_clean()); +} + +printFunctions($writerFuncs, "RuntimeEnumSerializer"); +printFunctions($readerFuncs, "RuntimeEnumDeserializer"); + +echo "Done. Don't forget to run CS fixup after generating code.\n"; From d09c45e362f5304b9412de9ab1dcc91b5dd1436f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 15:15:02 +0100 Subject: [PATCH 0270/1858] Verify up-to-dateness of RuntimeEnum serializers on Actions --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 63c52921ae..308e22fa40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -180,6 +180,9 @@ jobs: - name: Regenerate KnownTranslation APIs run: php build/generate-known-translation-apis.php + - name: Regenerate RuntimeEnum(De)serializer + run: php build/generate-runtime-enum-serializers.php + - name: Verify code is unchanged run: | git diff From 51ce358734e2d2d7ca2cbf1415ae3d4f568cc614 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 15:40:24 +0100 Subject: [PATCH 0271/1858] Add header to generator for now --- build/generate-runtime-enum-serializers.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 32429bad20..f3bd39abed 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -188,6 +188,25 @@ function printFunctions(array $functions, string $className) : void{ echo <<<'HEADER' Date: Tue, 5 Jul 2022 16:18:54 +0100 Subject: [PATCH 0272/1858] Implemented crimson, warped and mangrove signs --- src/block/BaseSign.php | 7 +++- src/block/BlockFactory.php | 8 ++--- src/block/BlockLegacyIdHelper.php | 33 +++++++++++++++---- src/block/BlockTypeIds.php | 8 ++++- src/block/VanillaBlocks.php | 12 +++++++ .../BlockObjectToBlockStateSerializer.php | 6 ++++ .../BlockStateToBlockObjectDeserializer.php | 6 ++++ src/data/bedrock/item/ItemDeserializer.php | 5 +-- src/data/bedrock/item/ItemSerializer.php | 3 ++ src/item/ItemFactory.php | 3 ++ src/item/ItemTypeIds.php | 5 ++- src/item/StringToItemParser.php | 3 ++ src/item/VanillaItems.php | 6 ++++ 13 files changed, 89 insertions(+), 16 deletions(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 415e45977b..3061030a8f 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -26,6 +26,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\SignText; use pocketmine\block\utils\SupportType; +use pocketmine\block\utils\WoodType; +use pocketmine\block\utils\WoodTypeTrait; use pocketmine\event\block\SignChangeEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -38,6 +40,8 @@ use function assert; use function strlen; abstract class BaseSign extends Transparent{ + use WoodTypeTrait; + protected SignText $text; protected ?int $editorEntityRuntimeId = null; @@ -47,7 +51,8 @@ abstract class BaseSign extends Transparent{ /** * @param \Closure() : Item $asItemCallback */ - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, \Closure $asItemCallback){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, WoodType $woodType, \Closure $asItemCallback){ + $this->woodType = $woodType; parent::__construct($idInfo, $name, $breakInfo); $this->text = new SignText(); $this->asItemCallback = $asItemCallback; diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 1bc685686c..d3a5817bfe 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -461,10 +461,6 @@ class BlockFactory{ $name = $treeType->getDisplayName(); $this->register(new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType)); $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); - - [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($treeType); - $this->register(new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $signAsItem)); - $this->register(new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $signAsItem)); } foreach(WoodType::getAll() as $woodType){ @@ -484,6 +480,10 @@ class BlockFactory{ $this->register(new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); $this->register(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); $this->register(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); + + [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($woodType); + $this->register(new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); + $this->register(new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); } $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 57386510f6..0a1b74538a 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -136,44 +136,63 @@ final class BlockLegacyIdHelper{ * @return BID[]|\Closure[] * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} */ - public static function getWoodenSignInfo(TreeType $treeType) : array{ + public static function getWoodenSignInfo(WoodType $treeType) : array{ switch($treeType->id()){ - case TreeType::OAK()->id(): + case WoodType::OAK()->id(): return [ new BID(Ids::OAK_SIGN, TileSign::class), new BID(Ids::OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::OAK_SIGN() ]; - case TreeType::SPRUCE()->id(): + case WoodType::SPRUCE()->id(): return [ new BID(Ids::SPRUCE_SIGN, TileSign::class), new BID(Ids::SPRUCE_WALL_SIGN, TileSign::class), fn() => VanillaItems::SPRUCE_SIGN() ]; - case TreeType::BIRCH()->id(): + case WoodType::BIRCH()->id(): return [ new BID(Ids::BIRCH_SIGN, TileSign::class), new BID(Ids::BIRCH_WALL_SIGN, TileSign::class), fn() => VanillaItems::BIRCH_SIGN() ]; - case TreeType::JUNGLE()->id(): + case WoodType::JUNGLE()->id(): return [ new BID(Ids::JUNGLE_SIGN, TileSign::class), new BID(Ids::JUNGLE_WALL_SIGN, TileSign::class), fn() => VanillaItems::JUNGLE_SIGN() ]; - case TreeType::ACACIA()->id(): + case WoodType::ACACIA()->id(): return [ new BID(Ids::ACACIA_SIGN, TileSign::class), new BID(Ids::ACACIA_WALL_SIGN, TileSign::class), fn() => VanillaItems::ACACIA_SIGN() ]; - case TreeType::DARK_OAK()->id(): + case WoodType::DARK_OAK()->id(): return [ new BID(Ids::DARK_OAK_SIGN, TileSign::class), new BID(Ids::DARK_OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::DARK_OAK_SIGN() ]; + case WoodType::MANGROVE()->id(): + return [ + new BID(Ids::MANGROVE_SIGN, TileSign::class), + new BID(Ids::MANGROVE_WALL_SIGN, TileSign::class), + fn() => VanillaItems::MANGROVE_SIGN() + ]; + case WoodType::CRIMSON()->id(): + return [ + new BID(Ids::CRIMSON_SIGN, TileSign::class), + new BID(Ids::CRIMSON_WALL_SIGN, TileSign::class), + fn() => VanillaItems::CRIMSON_SIGN() + ]; + case WoodType::WARPED()->id(): + return [ + new BID(Ids::WARPED_SIGN, TileSign::class), + new BID(Ids::WARPED_WALL_SIGN, TileSign::class), + fn() => VanillaItems::WARPED_SIGN() + ]; + } throw new AssumptionFailedError("Switch should cover all wood types"); } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 4a18229443..2f6735d66e 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -650,6 +650,12 @@ final class BlockTypeIds{ public const MANGROVE_STAIRS = 10625; public const CRIMSON_STAIRS = 10626; public const WARPED_STAIRS = 10627; + public const MANGROVE_SIGN = 10628; + public const CRIMSON_SIGN = 10629; + public const WARPED_SIGN = 10630; + public const MANGROVE_WALL_SIGN = 10631; + public const CRIMSON_WALL_SIGN = 10632; + public const WARPED_WALL_SIGN = 10633; - public const FIRST_UNUSED_BLOCK_ID = 10628; + public const FIRST_UNUSED_BLOCK_ID = 10634; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a851ccc397..2f5c52ccaa 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -150,10 +150,12 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Wood CRIMSON_HYPHAE() * @method static Planks CRIMSON_PLANKS() * @method static WoodenPressurePlate CRIMSON_PRESSURE_PLATE() + * @method static FloorSign CRIMSON_SIGN() * @method static WoodenSlab CRIMSON_SLAB() * @method static WoodenStairs CRIMSON_STAIRS() * @method static Wood CRIMSON_STEM() * @method static WoodenTrapdoor CRIMSON_TRAPDOOR() + * @method static WallSign CRIMSON_WALL_SIGN() * @method static Opaque CUT_RED_SANDSTONE() * @method static Slab CUT_RED_SANDSTONE_SLAB() * @method static Opaque CUT_SANDSTONE() @@ -415,9 +417,11 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Wood MANGROVE_LOG() * @method static Planks MANGROVE_PLANKS() * @method static WoodenPressurePlate MANGROVE_PRESSURE_PLATE() + * @method static FloorSign MANGROVE_SIGN() * @method static WoodenSlab MANGROVE_SLAB() * @method static WoodenStairs MANGROVE_STAIRS() * @method static WoodenTrapdoor MANGROVE_TRAPDOOR() + * @method static WallSign MANGROVE_WALL_SIGN() * @method static Wood MANGROVE_WOOD() * @method static ChemistryTable MATERIAL_REDUCER() * @method static Melon MELON() @@ -617,10 +621,12 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Wood WARPED_HYPHAE() * @method static Planks WARPED_PLANKS() * @method static WoodenPressurePlate WARPED_PRESSURE_PLATE() + * @method static FloorSign WARPED_SIGN() * @method static WoodenSlab WARPED_SLAB() * @method static WoodenStairs WARPED_STAIRS() * @method static Wood WARPED_STEM() * @method static WoodenTrapdoor WARPED_TRAPDOOR() + * @method static WallSign WARPED_WALL_SIGN() * @method static Water WATER() * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() @@ -769,10 +775,12 @@ final class VanillaBlocks{ self::register("crimson_hyphae", $factory->fromTypeId(Ids::CRIMSON_HYPHAE)); self::register("crimson_planks", $factory->fromTypeId(Ids::CRIMSON_PLANKS)); self::register("crimson_pressure_plate", $factory->fromTypeId(Ids::CRIMSON_PRESSURE_PLATE)); + self::register("crimson_sign", $factory->fromTypeId(Ids::CRIMSON_SIGN)); self::register("crimson_slab", $factory->fromTypeId(Ids::CRIMSON_SLAB)); self::register("crimson_stairs", $factory->fromTypeId(Ids::CRIMSON_STAIRS)); self::register("crimson_stem", $factory->fromTypeId(Ids::CRIMSON_STEM)); self::register("crimson_trapdoor", $factory->fromTypeId(Ids::CRIMSON_TRAPDOOR)); + self::register("crimson_wall_sign", $factory->fromTypeId(Ids::CRIMSON_WALL_SIGN)); self::register("cut_red_sandstone", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE)); self::register("cut_red_sandstone_slab", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE_SLAB)); self::register("cut_sandstone", $factory->fromTypeId(Ids::CUT_SANDSTONE)); @@ -1034,9 +1042,11 @@ final class VanillaBlocks{ self::register("mangrove_log", $factory->fromTypeId(Ids::MANGROVE_LOG)); self::register("mangrove_planks", $factory->fromTypeId(Ids::MANGROVE_PLANKS)); self::register("mangrove_pressure_plate", $factory->fromTypeId(Ids::MANGROVE_PRESSURE_PLATE)); + self::register("mangrove_sign", $factory->fromTypeId(Ids::MANGROVE_SIGN)); self::register("mangrove_slab", $factory->fromTypeId(Ids::MANGROVE_SLAB)); self::register("mangrove_stairs", $factory->fromTypeId(Ids::MANGROVE_STAIRS)); self::register("mangrove_trapdoor", $factory->fromTypeId(Ids::MANGROVE_TRAPDOOR)); + self::register("mangrove_wall_sign", $factory->fromTypeId(Ids::MANGROVE_WALL_SIGN)); self::register("mangrove_wood", $factory->fromTypeId(Ids::MANGROVE_WOOD)); self::register("material_reducer", $factory->fromTypeId(Ids::MATERIAL_REDUCER)); self::register("melon", $factory->fromTypeId(Ids::MELON)); @@ -1236,10 +1246,12 @@ final class VanillaBlocks{ self::register("warped_hyphae", $factory->fromTypeId(Ids::WARPED_HYPHAE)); self::register("warped_planks", $factory->fromTypeId(Ids::WARPED_PLANKS)); self::register("warped_pressure_plate", $factory->fromTypeId(Ids::WARPED_PRESSURE_PLATE)); + self::register("warped_sign", $factory->fromTypeId(Ids::WARPED_SIGN)); self::register("warped_slab", $factory->fromTypeId(Ids::WARPED_SLAB)); self::register("warped_stairs", $factory->fromTypeId(Ids::WARPED_STAIRS)); self::register("warped_stem", $factory->fromTypeId(Ids::WARPED_STEM)); self::register("warped_trapdoor", $factory->fromTypeId(Ids::WARPED_TRAPDOOR)); + self::register("warped_wall_sign", $factory->fromTypeId(Ids::WARPED_WALL_SIGN)); self::register("water", $factory->fromTypeId(Ids::WATER)); self::register("weighted_pressure_plate_heavy", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY)); self::register("weighted_pressure_plate_light", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index f114ed97d4..49e0d08865 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -465,10 +465,12 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); $this->mapSimple(Blocks::CRIMSON_PLANKS(), Ids::CRIMSON_PLANKS); $this->map(Blocks::CRIMSON_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::CRIMSON_PRESSURE_PLATE))); + $this->map(Blocks::CRIMSON_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::CRIMSON_STANDING_SIGN))); $this->mapSlab(Blocks::CRIMSON_SLAB(), Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB); $this->mapStairs(Blocks::CRIMSON_STAIRS(), Ids::CRIMSON_STAIRS); $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); + $this->map(Blocks::CRIMSON_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::CRIMSON_WALL_SIGN))); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); @@ -847,9 +849,11 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); $this->map(Blocks::MANGROVE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::MANGROVE_PRESSURE_PLATE))); + $this->map(Blocks::MANGROVE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::MANGROVE_STANDING_SIGN))); $this->mapSlab(Blocks::MANGROVE_SLAB(), Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB); $this->mapStairs(Blocks::MANGROVE_STAIRS(), Ids::MANGROVE_STAIRS); $this->map(Blocks::MANGROVE_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::MANGROVE_TRAPDOOR))); + $this->map(Blocks::MANGROVE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::MANGROVE_WALL_SIGN))); $this->map(Blocks::MANGROVE_WOOD(), function(Wood $block) : Writer{ //we can't use the standard method for this because mangrove_wood has a useless property attached to it if(!$block->isStripped()){ @@ -1195,10 +1199,12 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WARPED_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE)); $this->mapSimple(Blocks::WARPED_PLANKS(), Ids::WARPED_PLANKS); $this->map(Blocks::WARPED_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WARPED_PRESSURE_PLATE))); + $this->map(Blocks::WARPED_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::WARPED_STANDING_SIGN))); $this->mapSlab(Blocks::WARPED_SLAB(), Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB); $this->mapStairs(Blocks::WARPED_STAIRS(), Ids::WARPED_STAIRS); $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); + $this->map(Blocks::WARPED_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WARPED_WALL_SIGN))); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 74e483fb7b..0a7e1a60b3 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -309,8 +309,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS()); $this->map(Ids::CRIMSON_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CRIMSON_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::CRIMSON_STAIRS, fn() => Blocks::CRIMSON_STAIRS()); + $this->map(Ids::CRIMSON_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::CRIMSON_SIGN(), $in)); $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); + $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in)); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); @@ -735,7 +737,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); $this->map(Ids::MANGROVE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::MANGROVE_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS()); + $this->map(Ids::MANGROVE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::MANGROVE_SIGN(), $in)); $this->map(Ids::MANGROVE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::MANGROVE_TRAPDOOR(), $in)); + $this->map(Ids::MANGROVE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::MANGROVE_WALL_SIGN(), $in)); $this->map(Ids::MANGROVE_WOOD, function(Reader $in){ $in->ignored(StateNames::STRIPPED_BIT); //this is also ignored by vanilla return Helper::decodeLog(Blocks::MANGROVE_WOOD(), false, $in); @@ -1151,8 +1155,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); $this->map(Ids::WARPED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::WARPED_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::WARPED_STAIRS, fn() => Blocks::WARPED_STAIRS()); + $this->map(Ids::WARPED_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::WARPED_SIGN(), $in)); $this->map(Ids::WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), false, $in)); $this->map(Ids::WARPED_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::WARPED_TRAPDOOR(), $in)); + $this->map(Ids::WARPED_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::WARPED_WALL_SIGN(), $in)); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->map(Ids::WEB, fn() => Blocks::COBWEB()); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 2d8570b5b7..41cedace87 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -271,7 +271,7 @@ final class ItemDeserializer{ //TODO: minecraft:creeper_banner_pattern //TODO: minecraft:creeper_spawn_egg $this->map(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()->asItem()); - //TODO: minecraft:crimson_sign + $this->map(Ids::CRIMSON_SIGN, fn() => Blocks::CRIMSON_SIGN()->asItem()); //TODO: minecraft:crossbow $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); @@ -422,6 +422,7 @@ final class ItemDeserializer{ $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); //TODO: minecraft:magma_cube_spawn_egg $this->map(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()->asItem()); + $this->map(Ids::MANGROVE_SIGN, fn() => Blocks::MANGROVE_SIGN()->asItem()); //TODO: minecraft:medicine $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); @@ -595,7 +596,7 @@ final class ItemDeserializer{ //TODO: minecraft:wandering_trader_spawn_egg $this->map(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()->asItem()); //TODO: minecraft:warped_fungus_on_a_stick - //TODO: minecraft:warped_sign + $this->map(Ids::WARPED_SIGN, fn() => Blocks::WARPED_SIGN()->asItem()); $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); $this->map(Ids::WHEAT, fn() => Items::WHEAT()); $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 3f886ee505..99086c7b4d 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -336,6 +336,7 @@ final class ItemSerializer{ $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); + $this->map(Items::CRIMSON_SIGN(), self::id(Ids::CRIMSON_SIGN)); $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); $this->map(Items::DIAMOND(), self::id(Ids::DIAMOND)); @@ -420,6 +421,7 @@ final class ItemSerializer{ $this->map(Items::LEATHER_PANTS(), self::id(Ids::LEATHER_LEGGINGS)); $this->map(Items::LEATHER_TUNIC(), self::id(Ids::LEATHER_CHESTPLATE)); $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); + $this->map(Items::MANGROVE_SIGN(), self::id(Ids::MANGROVE_SIGN)); $this->map(Items::MELON(), self::id(Ids::MELON_SLICE)); $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); @@ -488,6 +490,7 @@ final class ItemSerializer{ $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); + $this->map(Items::WARPED_SIGN(), self::id(Ids::WARPED_SIGN)); $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index cfcc05dd14..7f4c889c86 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -219,6 +219,9 @@ class ItemFactory{ $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); $this->register(new Snowball(new IID(Ids::SNOWBALL), "Snowball")); $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); $this->register(new Steak(new IID(Ids::STEAK), "Steak")); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index d60371ec50..ebc7432984 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -265,6 +265,9 @@ final class ItemTypeIds{ public const WRITABLE_BOOK = 20226; public const WRITTEN_BOOK = 20227; public const ZOMBIE_SPAWN_EGG = 20228; + public const CRIMSON_SIGN = 20229; + public const MANGROVE_SIGN = 20230; + public const WARPED_SIGN = 20231; - public const FIRST_UNUSED_ITEM_ID = 20229; + public const FIRST_UNUSED_ITEM_ID = 20232; } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 97c9bbdb8f..c5f5cc1baf 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -233,6 +233,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(false)); $result->registerBlock("crimson_planks", fn() => Blocks::CRIMSON_PLANKS()); $result->registerBlock("crimson_pressure_plate", fn() => Blocks::CRIMSON_PRESSURE_PLATE()); + $result->registerBlock("crimson_sign", fn() => Blocks::CRIMSON_SIGN()); $result->registerBlock("crimson_slab", fn() => Blocks::CRIMSON_SLAB()); $result->registerBlock("crimson_stairs", fn() => Blocks::CRIMSON_STAIRS()); $result->registerBlock("crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(false)); @@ -703,6 +704,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(false)); $result->registerBlock("mangrove_planks", fn() => Blocks::MANGROVE_PLANKS()); $result->registerBlock("mangrove_pressure_plate", fn() => Blocks::MANGROVE_PRESSURE_PLATE()); + $result->registerBlock("mangrove_sign", fn() => Blocks::MANGROVE_SIGN()); $result->registerBlock("mangrove_slab", fn() => Blocks::MANGROVE_SLAB()); $result->registerBlock("mangrove_stairs", fn() => Blocks::MANGROVE_STAIRS()); $result->registerBlock("mangrove_trapdoor", fn() => Blocks::MANGROVE_TRAPDOOR()); @@ -1003,6 +1005,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(false)); $result->registerBlock("warped_planks", fn() => Blocks::WARPED_PLANKS()); $result->registerBlock("warped_pressure_plate", fn() => Blocks::WARPED_PRESSURE_PLATE()); + $result->registerBlock("warped_sign", fn() => Blocks::WARPED_SIGN()); $result->registerBlock("warped_slab", fn() => Blocks::WARPED_SLAB()); $result->registerBlock("warped_stairs", fn() => Blocks::WARPED_STAIRS()); $result->registerBlock("warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(false)); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 481e16d7e3..a2c035fe7f 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -116,6 +116,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CookedSalmon COOKED_SALMON() * @method static Cookie COOKIE() * @method static CoralFan CORAL_FAN() + * @method static ItemBlockWallOrFloor CRIMSON_SIGN() * @method static Boat DARK_OAK_BOAT() * @method static ItemBlockWallOrFloor DARK_OAK_SIGN() * @method static Item DIAMOND() @@ -182,6 +183,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Armor LEATHER_PANTS() * @method static Armor LEATHER_TUNIC() * @method static Item MAGMA_CREAM() + * @method static ItemBlockWallOrFloor MANGROVE_SIGN() * @method static Melon MELON() * @method static MelonSeeds MELON_SEEDS() * @method static MilkBucket MILK_BUCKET() @@ -250,6 +252,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static SweetBerries SWEET_BERRIES() * @method static Totem TOTEM() * @method static SpawnEgg VILLAGER_SPAWN_EGG() + * @method static ItemBlockWallOrFloor WARPED_SIGN() * @method static LiquidBucket WATER_BUCKET() * @method static Item WHEAT() * @method static WheatSeeds WHEAT_SEEDS() @@ -369,6 +372,7 @@ final class VanillaItems{ self::register("cooked_salmon", $factory->fromTypeId(Ids::COOKED_SALMON)); self::register("cookie", $factory->fromTypeId(Ids::COOKIE)); self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); + self::register("crimson_sign", $factory->fromTypeId(Ids::CRIMSON_SIGN)); self::register("dark_oak_boat", $factory->fromTypeId(Ids::DARK_OAK_BOAT)); self::register("dark_oak_sign", $factory->fromTypeId(Ids::DARK_OAK_SIGN)); self::register("diamond", $factory->fromTypeId(Ids::DIAMOND)); @@ -435,6 +439,7 @@ final class VanillaItems{ self::register("leather_pants", $factory->fromTypeId(Ids::LEATHER_PANTS)); self::register("leather_tunic", $factory->fromTypeId(Ids::LEATHER_TUNIC)); self::register("magma_cream", $factory->fromTypeId(Ids::MAGMA_CREAM)); + self::register("mangrove_sign", $factory->fromTypeId(Ids::MANGROVE_SIGN)); self::register("melon", $factory->fromTypeId(Ids::MELON)); self::register("melon_seeds", $factory->fromTypeId(Ids::MELON_SEEDS)); self::register("milk_bucket", $factory->fromTypeId(Ids::MILK_BUCKET)); @@ -503,6 +508,7 @@ final class VanillaItems{ self::register("sweet_berries", $factory->fromTypeId(Ids::SWEET_BERRIES)); self::register("totem", $factory->fromTypeId(Ids::TOTEM)); self::register("villager_spawn_egg", $factory->fromTypeId(Ids::VILLAGER_SPAWN_EGG)); + self::register("warped_sign", $factory->fromTypeId(Ids::WARPED_SIGN)); self::register("water_bucket", $factory->fromTypeId(Ids::WATER_BUCKET)); self::register("wheat", $factory->fromTypeId(Ids::WHEAT)); self::register("wheat_seeds", $factory->fromTypeId(Ids::WHEAT_SEEDS)); From 3c017af6a0d8e03cb5a8cc9241900255a727e7fd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 16:46:57 +0100 Subject: [PATCH 0273/1858] Added a handful of new easy items --- src/data/bedrock/item/ItemDeserializer.php | 20 ++++++++-------- src/data/bedrock/item/ItemSerializer.php | 11 +++++++++ src/item/ItemFactory.php | 11 +++++++++ src/item/ItemTypeIds.php | 27 +++++++++++++++++++++- src/item/StringToItemParser.php | 11 +++++++++ src/item/VanillaItems.php | 22 ++++++++++++++++++ 6 files changed, 92 insertions(+), 10 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 41cedace87..7ac959b4de 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -117,7 +117,7 @@ final class ItemDeserializer{ $this->map(Ids::ACACIA_SIGN, fn() => Blocks::ACACIA_SIGN()->asItem()); //TODO: minecraft:agent_spawn_egg //TODO: minecraft:allay_spawn_egg - //TODO: minecraft:amethyst_shard + $this->map(Ids::AMETHYST_SHARD, fn() => Items::AMETHYST_SHARD()); $this->map(Ids::APPLE, fn() => Items::APPLE()); //TODO: minecraft:armor_stand $this->map(Ids::ARROW, function(Data $data) : Item{ @@ -266,7 +266,7 @@ final class ItemDeserializer{ $this->map(Ids::COOKED_RABBIT, fn() => Items::COOKED_RABBIT()); $this->map(Ids::COOKED_SALMON, fn() => Items::COOKED_SALMON()); $this->map(Ids::COOKIE, fn() => Items::COOKIE()); - //TODO: minecraft:copper_ingot + $this->map(Ids::COPPER_INGOT, fn() => Items::COPPER_INGOT()); //TODO: minecraft:cow_spawn_egg //TODO: minecraft:creeper_banner_pattern //TODO: minecraft:creeper_spawn_egg @@ -288,6 +288,7 @@ final class ItemDeserializer{ $this->map(Ids::DIAMOND_PICKAXE, fn() => Items::DIAMOND_PICKAXE()); $this->map(Ids::DIAMOND_SHOVEL, fn() => Items::DIAMOND_SHOVEL()); $this->map(Ids::DIAMOND_SWORD, fn() => Items::DIAMOND_SWORD()); + $this->map(Ids::DISC_FRAGMENT_5, fn() => Items::DISC_FRAGMENT_5()); //TODO: minecraft:dolphin_spawn_egg //TODO: minecraft:donkey_spawn_egg $this->map(Ids::DRAGON_BREATH, fn() => Items::DRAGON_BREATH()); @@ -315,6 +316,7 @@ final class ItemDeserializer{ } return Items::DYE()->setColor($dyeColor); }); + $this->map(Ids::ECHO_SHARD, fn() => Items::ECHO_SHARD()); $this->map(Ids::EGG, fn() => Items::EGG()); //TODO: minecraft:elder_guardian_spawn_egg //TODO: minecraft:elytra @@ -352,7 +354,7 @@ final class ItemDeserializer{ //TODO: minecraft:globe_banner_pattern //TODO: minecraft:glow_berries //TODO: minecraft:glow_frame - //TODO: minecraft:glow_ink_sac + $this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC()); //TODO: minecraft:glow_squid_spawn_egg //TODO: minecraft:glow_stick $this->map(Ids::GLOWSTONE_DUST, fn() => Items::GLOWSTONE_DUST()); @@ -379,7 +381,7 @@ final class ItemDeserializer{ $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); //TODO: minecraft:hoglin_spawn_egg //TODO: minecraft:honey_bottle - //TODO: minecraft:honeycomb + $this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB()); $this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem()); //TODO: minecraft:hopper_minecart //TODO: minecraft:horse_spawn_egg @@ -473,7 +475,7 @@ final class ItemDeserializer{ //TODO: minecraft:panda_spawn_egg $this->map(Ids::PAPER, fn() => Items::PAPER()); //TODO: minecraft:parrot_spawn_egg - //TODO: minecraft:phantom_membrane + $this->map(Ids::PHANTOM_MEMBRANE, fn() => Items::PHANTOM_MEMBRANE()); //TODO: minecraft:phantom_spawn_egg //TODO: minecraft:pig_spawn_egg //TODO: minecraft:piglin_banner_pattern @@ -511,9 +513,9 @@ final class ItemDeserializer{ $this->map(Ids::RABBIT_STEW, fn() => Items::RABBIT_STEW()); //TODO: minecraft:rapid_fertilizer //TODO: minecraft:ravager_spawn_egg - //TODO: minecraft:raw_copper - //TODO: minecraft:raw_gold - //TODO: minecraft:raw_iron + $this->map(Ids::RAW_COPPER, fn() => Items::RAW_COPPER()); + $this->map(Ids::RAW_GOLD, fn() => Items::RAW_GOLD()); + $this->map(Ids::RAW_IRON, fn() => Items::RAW_IRON()); $this->map(Ids::RED_DYE, fn() => Items::DYE()->setColor(DyeColor::RED())); $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); $this->map(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()->asItem()); @@ -565,7 +567,7 @@ final class ItemDeserializer{ $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); $this->map(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()->asItem()); $this->map(Ids::SPRUCE_SIGN, fn() => Blocks::SPRUCE_SIGN()->asItem()); - //TODO: minecraft:spyglass + $this->map(Ids::SPYGLASS, fn() => Items::SPYGLASS()); $this->map(Ids::SQUID_SPAWN_EGG, fn() => Items::SQUID_SPAWN_EGG()); $this->map(Ids::STICK, fn() => Items::STICK()); $this->map(Ids::STONE_AXE, fn() => Items::STONE_AXE()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 99086c7b4d..4d57071c9a 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -258,6 +258,7 @@ final class ItemSerializer{ $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); + $this->map(Items::AMETHYST_SHARD(), self::id(Ids::AMETHYST_SHARD)); $this->map(Items::APPLE(), self::id(Ids::APPLE)); $this->map(Items::ARROW(), self::id(Ids::ARROW)); $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); @@ -336,6 +337,7 @@ final class ItemSerializer{ $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); + $this->map(Items::COPPER_INGOT(), self::id(Ids::COPPER_INGOT)); $this->map(Items::CRIMSON_SIGN(), self::id(Ids::CRIMSON_SIGN)); $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); @@ -349,6 +351,7 @@ final class ItemSerializer{ $this->map(Items::DIAMOND_PICKAXE(), self::id(Ids::DIAMOND_PICKAXE)); $this->map(Items::DIAMOND_SHOVEL(), self::id(Ids::DIAMOND_SHOVEL)); $this->map(Items::DIAMOND_SWORD(), self::id(Ids::DIAMOND_SWORD)); + $this->map(Items::DISC_FRAGMENT_5(), self::id(Ids::DISC_FRAGMENT_5)); $this->map(Items::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH)); $this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP)); $this->map(Items::DYE(), fn(Dye $item) => new Data(match($item->getColor()){ @@ -370,6 +373,7 @@ final class ItemSerializer{ DyeColor::YELLOW() => Ids::YELLOW_DYE, default => throw new AssumptionFailedError("Unhandled dye color " . $item->getColor()->name()), })); + $this->map(Items::ECHO_SHARD(), self::id(Ids::ECHO_SHARD)); $this->map(Items::EGG(), self::id(Ids::EGG)); $this->map(Items::EMERALD(), self::id(Ids::EMERALD)); $this->map(Items::ENCHANTED_GOLDEN_APPLE(), self::id(Ids::ENCHANTED_GOLDEN_APPLE)); @@ -384,6 +388,7 @@ final class ItemSerializer{ $this->map(Items::GLASS_BOTTLE(), self::id(Ids::GLASS_BOTTLE)); $this->map(Items::GLISTERING_MELON(), self::id(Ids::GLISTERING_MELON_SLICE)); $this->map(Items::GLOWSTONE_DUST(), self::id(Ids::GLOWSTONE_DUST)); + $this->map(Items::GLOW_INK_SAC(), self::id(Ids::GLOW_INK_SAC)); $this->map(Items::GOLDEN_APPLE(), self::id(Ids::GOLDEN_APPLE)); $this->map(Items::GOLDEN_AXE(), self::id(Ids::GOLDEN_AXE)); $this->map(Items::GOLDEN_BOOTS(), self::id(Ids::GOLDEN_BOOTS)); @@ -399,6 +404,7 @@ final class ItemSerializer{ $this->map(Items::GOLD_NUGGET(), self::id(Ids::GOLD_NUGGET)); $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); + $this->map(Items::HONEYCOMB(), self::id(Ids::HONEYCOMB)); $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); @@ -435,6 +441,7 @@ final class ItemSerializer{ $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); $this->map(Items::PAINTING(), self::id(Ids::PAINTING)); $this->map(Items::PAPER(), self::id(Ids::PAPER)); + $this->map(Items::PHANTOM_MEMBRANE(), self::id(Ids::PHANTOM_MEMBRANE)); $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); $this->map(Items::POTATO(), self::id(Ids::POTATO)); @@ -449,7 +456,10 @@ final class ItemSerializer{ $this->map(Items::RABBIT_STEW(), self::id(Ids::RABBIT_STEW)); $this->map(Items::RAW_BEEF(), self::id(Ids::BEEF)); $this->map(Items::RAW_CHICKEN(), self::id(Ids::CHICKEN)); + $this->map(Items::RAW_COPPER(), self::id(Ids::RAW_COPPER)); $this->map(Items::RAW_FISH(), self::id(Ids::COD)); + $this->map(Items::RAW_GOLD(), self::id(Ids::RAW_GOLD)); + $this->map(Items::RAW_IRON(), self::id(Ids::RAW_IRON)); $this->map(Items::RAW_MUTTON(), self::id(Ids::MUTTON)); $this->map(Items::RAW_PORKCHOP(), self::id(Ids::PORKCHOP)); $this->map(Items::RAW_RABBIT(), self::id(Ids::RABBIT)); @@ -477,6 +487,7 @@ final class ItemSerializer{ $this->map(Items::SPLASH_POTION(), fn(SplashPotion $item) => new Data(Ids::SPLASH_POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); $this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT)); $this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN)); + $this->map(Items::SPYGLASS(), self::id(Ids::SPYGLASS)); $this->map(Items::SQUID_SPAWN_EGG(), self::id(Ids::SQUID_SPAWN_EGG)); $this->map(Items::STEAK(), self::id(Ids::COOKED_BEEF)); $this->map(Items::STICK(), self::id(Ids::STICK)); diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 7f4c889c86..1a4ecc0687 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -98,6 +98,7 @@ class ItemFactory{ $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); + $this->register(new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); $this->register(new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); $this->register(new Item(new IID(Ids::BLEACH), "Bleach")); //EDU $this->register(new Item(new IID(Ids::BONE), "Bone")); @@ -143,9 +144,12 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); $this->register(new Item(new IID(Ids::DIAMOND), "Diamond")); + $this->register(new Item(new IID(Ids::DISC_FRAGMENT_5), "Disc Fragment (5)")); $this->register(new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); + $this->register(new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); $this->register(new Item(new IID(Ids::INK_SAC), "Ink Sac")); $this->register(new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + $this->register(new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); $this->register(new Item(new IID(Ids::EMERALD), "Emerald")); $this->register(new Item(new IID(Ids::FEATHER), "Feather")); $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); @@ -157,6 +161,7 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); $this->register(new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); + $this->register(new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); $this->register(new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); $this->register(new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); $this->register(new Item(new IID(Ids::LEATHER), "Leather")); @@ -175,6 +180,12 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::SUGAR), "Sugar")); $this->register(new Item(new IID(Ids::SCUTE), "Scute")); $this->register(new Item(new IID(Ids::WHEAT), "Wheat")); + $this->register(new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); + $this->register(new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); + $this->register(new Item(new IID(Ids::RAW_IRON), "Raw Iron")); + $this->register(new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); + $this->register(new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); + $this->register(new Item(new IID(Ids::SPYGLASS), "Spyglass")); //the meta values for buckets are intentionally hardcoded because block IDs will change in the future $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index ebc7432984..cc6a678bbc 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -268,6 +268,31 @@ final class ItemTypeIds{ public const CRIMSON_SIGN = 20229; public const MANGROVE_SIGN = 20230; public const WARPED_SIGN = 20231; + public const AMETHYST_SHARD = 20232; + public const COPPER_INGOT = 20233; + public const DISC_FRAGMENT_5 = 20234; + public const ECHO_SHARD = 20235; + public const GLOW_INK_SAC = 20236; + public const HONEY_BOTTLE = 20237; + public const HONEYCOMB = 20238; + public const RECORD_5 = 20239; + public const RECORD_OTHERSIDE = 20240; + public const RECORD_PIGSTEP = 20241; + public const NETHERITE_INGOT = 20242; + public const NETHERITE_AXE = 20243; + public const NETHERITE_HOE = 20244; + public const NETHERITE_PICKAXE = 20245; + public const NETHERITE_SHOVEL = 20246; + public const NETHERITE_SWORD = 20247; + public const NETHERITE_BOOTS = 20248; + public const NETHERITE_CHESTPLATE = 20249; + public const NETHERITE_HELMET = 20250; + public const NETHERITE_LEGGINGS = 20251; + public const PHANTOM_MEMBRANE = 20252; + public const RAW_COPPER = 20253; + public const RAW_IRON = 20254; + public const RAW_GOLD = 20255; + public const SPYGLASS = 20256; - public const FIRST_UNUSED_ITEM_ID = 20232; + public const FIRST_UNUSED_ITEM_ID = 20239; } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c5f5cc1baf..6becb7e91d 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1041,6 +1041,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); + $result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD()); $result->register("apple", fn() => Items::APPLE()); $result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); @@ -1138,6 +1139,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("cooked_rabbit", fn() => Items::COOKED_RABBIT()); $result->register("cooked_salmon", fn() => Items::COOKED_SALMON()); $result->register("cookie", fn() => Items::COOKIE()); + $result->register("copper_ingot", fn() => Items::COPPER_INGOT()); $result->register("dark_oak_boat", fn() => Items::DARK_OAK_BOAT()); $result->register("diamond", fn() => Items::DIAMOND()); $result->register("diamond_axe", fn() => Items::DIAMOND_AXE()); @@ -1149,9 +1151,11 @@ final class StringToItemParser extends StringToTParser{ $result->register("diamond_pickaxe", fn() => Items::DIAMOND_PICKAXE()); $result->register("diamond_shovel", fn() => Items::DIAMOND_SHOVEL()); $result->register("diamond_sword", fn() => Items::DIAMOND_SWORD()); + $result->register("disc_fragment_5", fn() => Items::DISC_FRAGMENT_5()); $result->register("dragon_breath", fn() => Items::DRAGON_BREATH()); $result->register("dried_kelp", fn() => Items::DRIED_KELP()); $result->register("dye", fn() => Items::INK_SAC()); + $result->register("echo_shard", fn() => Items::ECHO_SHARD()); $result->register("egg", fn() => Items::EGG()); $result->register("emerald", fn() => Items::EMERALD()); $result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE()); @@ -1170,6 +1174,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("ghast_tear", fn() => Items::GHAST_TEAR()); $result->register("glass_bottle", fn() => Items::GLASS_BOTTLE()); $result->register("glistering_melon", fn() => Items::GLISTERING_MELON()); + $result->register("glow_ink_sac", fn() => Items::GLOW_INK_SAC()); $result->register("glowstone_dust", fn() => Items::GLOWSTONE_DUST()); $result->register("gold_axe", fn() => Items::GOLDEN_AXE()); $result->register("gold_boots", fn() => Items::GOLDEN_BOOTS()); @@ -1200,6 +1205,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING())); $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING())); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); + $result->register("honeycomb", fn() => Items::HONEYCOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY())); $result->register("invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::INVISIBILITY())); @@ -1280,6 +1286,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); + $result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE()); $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON())); $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON())); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); @@ -1300,8 +1307,11 @@ final class StringToItemParser extends StringToTParser{ $result->register("rabbit_stew", fn() => Items::RABBIT_STEW()); $result->register("raw_beef", fn() => Items::RAW_BEEF()); $result->register("raw_cod", fn() => Items::RAW_FISH()); + $result->register("raw_copper", fn() => Items::RAW_COPPER()); $result->register("raw_chicken", fn() => Items::RAW_CHICKEN()); $result->register("raw_fish", fn() => Items::RAW_FISH()); + $result->register("raw_gold", fn() => Items::RAW_GOLD()); + $result->register("raw_iron", fn() => Items::RAW_IRON()); $result->register("raw_mutton", fn() => Items::RAW_MUTTON()); $result->register("raw_porkchop", fn() => Items::RAW_PORKCHOP()); $result->register("raw_rabbit", fn() => Items::RAW_RABBIT()); @@ -1339,6 +1349,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("spider_eye", fn() => Items::SPIDER_EYE()); $result->register("splash_potion", fn() => Items::SPLASH_POTION()); $result->register("spruce_boat", fn() => Items::SPRUCE_BOAT()); + $result->register("spyglass", fn() => Items::SPYGLASS()); $result->register("squid_spawn_egg", fn() => Items::SQUID_SPAWN_EGG()); $result->register("steak", fn() => Items::STEAK()); $result->register("stick", fn() => Items::STICK()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index a2c035fe7f..9bd9ee4e96 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -36,6 +36,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Boat ACACIA_BOAT() * @method static ItemBlockWallOrFloor ACACIA_SIGN() * @method static ItemBlock AIR() + * @method static Item AMETHYST_SHARD() * @method static Apple APPLE() * @method static Arrow ARROW() * @method static BakedPotato BAKED_POTATO() @@ -115,6 +116,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static CookedRabbit COOKED_RABBIT() * @method static CookedSalmon COOKED_SALMON() * @method static Cookie COOKIE() + * @method static Item COPPER_INGOT() * @method static CoralFan CORAL_FAN() * @method static ItemBlockWallOrFloor CRIMSON_SIGN() * @method static Boat DARK_OAK_BOAT() @@ -129,9 +131,11 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Pickaxe DIAMOND_PICKAXE() * @method static Shovel DIAMOND_SHOVEL() * @method static Sword DIAMOND_SWORD() + * @method static Item DISC_FRAGMENT_5() * @method static Item DRAGON_BREATH() * @method static DriedKelp DRIED_KELP() * @method static Dye DYE() + * @method static Item ECHO_SHARD() * @method static Egg EGG() * @method static Item EMERALD() * @method static GoldenAppleEnchanted ENCHANTED_GOLDEN_APPLE() @@ -146,6 +150,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static GlassBottle GLASS_BOTTLE() * @method static Item GLISTERING_MELON() * @method static Item GLOWSTONE_DUST() + * @method static Item GLOW_INK_SAC() * @method static GoldenApple GOLDEN_APPLE() * @method static Axe GOLDEN_AXE() * @method static Armor GOLDEN_BOOTS() @@ -161,6 +166,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Item GOLD_NUGGET() * @method static Item GUNPOWDER() * @method static Item HEART_OF_THE_SEA() + * @method static Item HONEYCOMB() * @method static Item INK_SAC() * @method static Axe IRON_AXE() * @method static Armor IRON_BOOTS() @@ -197,6 +203,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ItemBlockWallOrFloor OAK_SIGN() * @method static PaintingItem PAINTING() * @method static Item PAPER() + * @method static Item PHANTOM_MEMBRANE() * @method static PoisonousPotato POISONOUS_POTATO() * @method static Item POPPED_CHORUS_FRUIT() * @method static Potato POTATO() @@ -211,7 +218,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static RabbitStew RABBIT_STEW() * @method static RawBeef RAW_BEEF() * @method static RawChicken RAW_CHICKEN() + * @method static Item RAW_COPPER() * @method static RawFish RAW_FISH() + * @method static Item RAW_GOLD() + * @method static Item RAW_IRON() * @method static RawMutton RAW_MUTTON() * @method static RawPorkchop RAW_PORKCHOP() * @method static RawRabbit RAW_RABBIT() @@ -239,6 +249,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static SplashPotion SPLASH_POTION() * @method static Boat SPRUCE_BOAT() * @method static ItemBlockWallOrFloor SPRUCE_SIGN() + * @method static Item SPYGLASS() * @method static SpawnEgg SQUID_SPAWN_EGG() * @method static Steak STEAK() * @method static Stick STICK() @@ -292,6 +303,7 @@ final class VanillaItems{ self::register("acacia_boat", $factory->fromTypeId(Ids::ACACIA_BOAT)); self::register("acacia_sign", $factory->fromTypeId(Ids::ACACIA_SIGN)); + self::register("amethyst_shard", $factory->fromTypeId(Ids::AMETHYST_SHARD)); self::register("apple", $factory->fromTypeId(Ids::APPLE)); self::register("arrow", $factory->fromTypeId(Ids::ARROW)); self::register("baked_potato", $factory->fromTypeId(Ids::BAKED_POTATO)); @@ -371,6 +383,7 @@ final class VanillaItems{ self::register("cooked_rabbit", $factory->fromTypeId(Ids::COOKED_RABBIT)); self::register("cooked_salmon", $factory->fromTypeId(Ids::COOKED_SALMON)); self::register("cookie", $factory->fromTypeId(Ids::COOKIE)); + self::register("copper_ingot", $factory->fromTypeId(Ids::COPPER_INGOT)); self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); self::register("crimson_sign", $factory->fromTypeId(Ids::CRIMSON_SIGN)); self::register("dark_oak_boat", $factory->fromTypeId(Ids::DARK_OAK_BOAT)); @@ -385,9 +398,11 @@ final class VanillaItems{ self::register("diamond_pickaxe", $factory->fromTypeId(Ids::DIAMOND_PICKAXE)); self::register("diamond_shovel", $factory->fromTypeId(Ids::DIAMOND_SHOVEL)); self::register("diamond_sword", $factory->fromTypeId(Ids::DIAMOND_SWORD)); + self::register("disc_fragment_5", $factory->fromTypeId(Ids::DISC_FRAGMENT_5)); self::register("dragon_breath", $factory->fromTypeId(Ids::DRAGON_BREATH)); self::register("dried_kelp", $factory->fromTypeId(Ids::DRIED_KELP)); self::register("dye", $factory->fromTypeId(Ids::DYE)); + self::register("echo_shard", $factory->fromTypeId(Ids::ECHO_SHARD)); self::register("egg", $factory->fromTypeId(Ids::EGG)); self::register("emerald", $factory->fromTypeId(Ids::EMERALD)); self::register("enchanted_golden_apple", $factory->fromTypeId(Ids::ENCHANTED_GOLDEN_APPLE)); @@ -401,6 +416,7 @@ final class VanillaItems{ self::register("ghast_tear", $factory->fromTypeId(Ids::GHAST_TEAR)); self::register("glass_bottle", $factory->fromTypeId(Ids::GLASS_BOTTLE)); self::register("glistering_melon", $factory->fromTypeId(Ids::GLISTERING_MELON)); + self::register("glow_ink_sac", $factory->fromTypeId(Ids::GLOW_INK_SAC)); self::register("glowstone_dust", $factory->fromTypeId(Ids::GLOWSTONE_DUST)); self::register("gold_ingot", $factory->fromTypeId(Ids::GOLD_INGOT)); self::register("gold_nugget", $factory->fromTypeId(Ids::GOLD_NUGGET)); @@ -417,6 +433,7 @@ final class VanillaItems{ self::register("golden_sword", $factory->fromTypeId(Ids::GOLDEN_SWORD)); self::register("gunpowder", $factory->fromTypeId(Ids::GUNPOWDER)); self::register("heart_of_the_sea", $factory->fromTypeId(Ids::HEART_OF_THE_SEA)); + self::register("honeycomb", $factory->fromTypeId(Ids::HONEYCOMB)); self::register("ink_sac", $factory->fromTypeId(Ids::INK_SAC)); self::register("iron_axe", $factory->fromTypeId(Ids::IRON_AXE)); self::register("iron_boots", $factory->fromTypeId(Ids::IRON_BOOTS)); @@ -453,6 +470,7 @@ final class VanillaItems{ self::register("oak_sign", $factory->fromTypeId(Ids::OAK_SIGN)); self::register("painting", $factory->fromTypeId(Ids::PAINTING)); self::register("paper", $factory->fromTypeId(Ids::PAPER)); + self::register("phantom_membrane", $factory->fromTypeId(Ids::PHANTOM_MEMBRANE)); self::register("poisonous_potato", $factory->fromTypeId(Ids::POISONOUS_POTATO)); self::register("popped_chorus_fruit", $factory->fromTypeId(Ids::POPPED_CHORUS_FRUIT)); self::register("potato", $factory->fromTypeId(Ids::POTATO)); @@ -467,7 +485,10 @@ final class VanillaItems{ self::register("rabbit_stew", $factory->fromTypeId(Ids::RABBIT_STEW)); self::register("raw_beef", $factory->fromTypeId(Ids::RAW_BEEF)); self::register("raw_chicken", $factory->fromTypeId(Ids::RAW_CHICKEN)); + self::register("raw_copper", $factory->fromTypeId(Ids::RAW_COPPER)); self::register("raw_fish", $factory->fromTypeId(Ids::RAW_FISH)); + self::register("raw_gold", $factory->fromTypeId(Ids::RAW_GOLD)); + self::register("raw_iron", $factory->fromTypeId(Ids::RAW_IRON)); self::register("raw_mutton", $factory->fromTypeId(Ids::RAW_MUTTON)); self::register("raw_porkchop", $factory->fromTypeId(Ids::RAW_PORKCHOP)); self::register("raw_rabbit", $factory->fromTypeId(Ids::RAW_RABBIT)); @@ -495,6 +516,7 @@ final class VanillaItems{ self::register("splash_potion", $factory->fromTypeId(Ids::SPLASH_POTION)); self::register("spruce_boat", $factory->fromTypeId(Ids::SPRUCE_BOAT)); self::register("spruce_sign", $factory->fromTypeId(Ids::SPRUCE_SIGN)); + self::register("spyglass", $factory->fromTypeId(Ids::SPYGLASS)); self::register("squid_spawn_egg", $factory->fromTypeId(Ids::SQUID_SPAWN_EGG)); self::register("steak", $factory->fromTypeId(Ids::STEAK)); self::register("stick", $factory->fromTypeId(Ids::STICK)); From a42bb9626d3882336dac2b5c6f5b6c7f77a018a3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 20:42:22 +0100 Subject: [PATCH 0274/1858] Added another handful of blocks clearing out my workspace... --- src/block/BlockFactory.php | 20 ++++++++++++++++++- src/block/BlockTypeIds.php | 10 +++++++--- src/block/Lantern.php | 9 ++++++++- src/block/VanillaBlocks.php | 12 +++++++++++ .../BlockObjectToBlockStateSerializer.php | 11 ++++++++++ .../BlockStateToBlockObjectDeserializer.php | 11 ++++++++++ src/item/StringToItemParser.php | 5 +++++ 7 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index d3a5817bfe..cb865f26e9 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -243,7 +243,11 @@ class BlockFactory{ $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); $this->register(new Jukebox(new BID(Ids::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), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - $this->register(new Lantern(new BID(Ids::LANTERN), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + + $lanternBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); + $this->register(new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); + $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); @@ -568,6 +572,7 @@ class BlockFactory{ )); $this->registerBlocksR13(); + $this->registerBlocksR14(); $this->registerBlocksR16(); $this->registerBlocksR17(); } @@ -711,6 +716,10 @@ class BlockFactory{ $this->register(new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); } + private function registerBlocksR14() : void{ + $this->register(new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new BreakInfo(0.6))); + } + private function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); @@ -745,7 +754,15 @@ class BlockFactory{ $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); $this->register(new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); + $this->register(new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", BreakInfo::instant())); $this->register(new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); + + //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) + $this->register(new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new BreakInfo(1.0, ToolType::SHOVEL))); + + $this->register(new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ + public function getLightLevel() : int{ return 15; } + }); } private function registerBlocksR17() : void{ @@ -753,6 +770,7 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 2f6735d66e..e2201fc29d 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -613,10 +613,12 @@ final class BlockTypeIds{ public const CHISELED_DEEPSLATE = 10586; public const CHISELED_NETHER_BRICKS = 10587; public const CRACKED_NETHER_BRICKS = 10588; - + public const TUFF = 10589; + public const SOUL_TORCH = 10590; + public const SOUL_LANTERN = 10591; public const SOUL_SOIL = 10592; public const SOUL_FIRE = 10593; - + public const SHROOMLIGHT = 10594; public const MANGROVE_PLANKS = 10595; public const CRIMSON_PLANKS = 10596; public const WARPED_PLANKS = 10597; @@ -657,5 +659,7 @@ final class BlockTypeIds{ public const CRIMSON_WALL_SIGN = 10632; public const WARPED_WALL_SIGN = 10633; - public const FIRST_UNUSED_BLOCK_ID = 10634; + public const HONEYCOMB = 10635; + + public const FIRST_UNUSED_BLOCK_ID = 10636; } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index bd620a58d3..825a545607 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -35,8 +35,15 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Lantern extends Transparent{ + private int $lightLevel; //readonly + protected bool $hanging = false; + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, int $lightLevel){ + $this->lightLevel = $lightLevel; + parent::__construct($idInfo, $name, $breakInfo); + } + public function getRequiredStateDataBits() : int{ return 1; } protected function decodeState(RuntimeDataReader $r) : void{ @@ -56,7 +63,7 @@ class Lantern extends Transparent{ } public function getLightLevel() : int{ - return 15; + return $this->lightLevel; } /** diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 2f5c52ccaa..6f40bdd07b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -360,6 +360,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static HardenedGlass HARDENED_GLASS() * @method static HardenedGlassPane HARDENED_GLASS_PANE() * @method static HayBale HAY_BALE() + * @method static Opaque HONEYCOMB() * @method static Hopper HOPPER() * @method static Ice ICE() * @method static InfestedStone INFESTED_CHISELED_STONE_BRICK() @@ -551,6 +552,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Wall SANDSTONE_WALL() * @method static SeaLantern SEA_LANTERN() * @method static SeaPickle SEA_PICKLE() + * @method static Opaque SHROOMLIGHT() * @method static ShulkerBox SHULKER_BOX() * @method static Slime SLIME() * @method static Furnace SMOKER() @@ -569,7 +571,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Snow SNOW() * @method static SnowLayer SNOW_LAYER() * @method static SoulFire SOUL_FIRE() + * @method static Lantern SOUL_LANTERN() * @method static SoulSand SOUL_SAND() + * @method static Opaque SOUL_SOIL() + * @method static Torch SOUL_TORCH() * @method static Sponge SPONGE() * @method static WoodenButton SPRUCE_BUTTON() * @method static WoodenDoor SPRUCE_DOOR() @@ -610,6 +615,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static TrappedChest TRAPPED_CHEST() * @method static Tripwire TRIPWIRE() * @method static TripwireHook TRIPWIRE_HOOK() + * @method static Opaque TUFF() * @method static UnderwaterTorch UNDERWATER_TORCH() * @method static Vine VINES() * @method static WallBanner WALL_BANNER() @@ -985,6 +991,7 @@ final class VanillaBlocks{ self::register("hardened_glass", $factory->fromTypeId(Ids::HARDENED_GLASS)); self::register("hardened_glass_pane", $factory->fromTypeId(Ids::HARDENED_GLASS_PANE)); self::register("hay_bale", $factory->fromTypeId(Ids::HAY_BALE)); + self::register("honeycomb", $factory->fromTypeId(Ids::HONEYCOMB)); self::register("hopper", $factory->fromTypeId(Ids::HOPPER)); self::register("ice", $factory->fromTypeId(Ids::ICE)); self::register("infested_chiseled_stone_brick", $factory->fromTypeId(Ids::INFESTED_CHISELED_STONE_BRICK)); @@ -1176,6 +1183,7 @@ final class VanillaBlocks{ self::register("sandstone_wall", $factory->fromTypeId(Ids::SANDSTONE_WALL)); self::register("sea_lantern", $factory->fromTypeId(Ids::SEA_LANTERN)); self::register("sea_pickle", $factory->fromTypeId(Ids::SEA_PICKLE)); + self::register("shroomlight", $factory->fromTypeId(Ids::SHROOMLIGHT)); self::register("shulker_box", $factory->fromTypeId(Ids::SHULKER_BOX)); self::register("slime", $factory->fromTypeId(Ids::SLIME)); self::register("smoker", $factory->fromTypeId(Ids::SMOKER)); @@ -1194,7 +1202,10 @@ final class VanillaBlocks{ self::register("snow", $factory->fromTypeId(Ids::SNOW)); self::register("snow_layer", $factory->fromTypeId(Ids::SNOW_LAYER)); self::register("soul_fire", $factory->fromTypeId(Ids::SOUL_FIRE)); + self::register("soul_lantern", $factory->fromTypeId(Ids::SOUL_LANTERN)); self::register("soul_sand", $factory->fromTypeId(Ids::SOUL_SAND)); + self::register("soul_soil", $factory->fromTypeId(Ids::SOUL_SOIL)); + self::register("soul_torch", $factory->fromTypeId(Ids::SOUL_TORCH)); self::register("sponge", $factory->fromTypeId(Ids::SPONGE)); self::register("spruce_button", $factory->fromTypeId(Ids::SPRUCE_BUTTON)); self::register("spruce_door", $factory->fromTypeId(Ids::SPRUCE_DOOR)); @@ -1235,6 +1246,7 @@ final class VanillaBlocks{ self::register("trapped_chest", $factory->fromTypeId(Ids::TRAPPED_CHEST)); self::register("tripwire", $factory->fromTypeId(Ids::TRIPWIRE)); self::register("tripwire_hook", $factory->fromTypeId(Ids::TRIPWIRE_HOOK)); + self::register("tuff", $factory->fromTypeId(Ids::TUFF)); self::register("underwater_torch", $factory->fromTypeId(Ids::UNDERWATER_TORCH)); self::register("vines", $factory->fromTypeId(Ids::VINES)); self::register("wall_banner", $factory->fromTypeId(Ids::WALL_BANNER)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 49e0d08865..c871574276 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1053,6 +1053,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) ->writeInt(StateNames::CLUSTER_COUNT, $block->getCount() - 1); }); + $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); $this->mapSimple(Blocks::SLIME(), Ids::SLIME); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); @@ -1078,7 +1079,16 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SOUL_FIRE) ->writeInt(StateNames::AGE, 0); //useless for soul fire, we don't track it }); + $this->map(Blocks::SOUL_LANTERN(), function(Lantern $block) : Writer{ + return Writer::create(Ids::SOUL_LANTERN) + ->writeBool(StateNames::HANGING, $block->isHanging()); + }); $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); + $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); + $this->map(Blocks::SOUL_TORCH(), function(Torch $block) : Writer{ + return Writer::create(Ids::SOUL_TORCH) + ->writeTorchFacing($block->getFacing()); + }); $this->map(Blocks::SPONGE(), function(Sponge $block) : Writer{ return Writer::create(Ids::SPONGE) ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); @@ -1168,6 +1178,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isPowered()) ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->mapSimple(Blocks::TUFF(), Ids::TUFF); $this->map(Blocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ return Writer::create(Ids::UNDERWATER_TORCH) ->writeTorchFacing($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 0a7e1a60b3..72edc85a5b 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -971,6 +971,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT)); }); + $this->map(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); $this->map(Ids::SHULKER_BOX, function(Reader $in) : Block{ return Blocks::DYED_SHULKER_BOX() ->setColor($in->readColor()); @@ -1000,7 +1001,16 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $in->ignored(StateNames::AGE); //this is useless for soul fire, since it doesn't have the logic associated return Blocks::SOUL_FIRE(); }); + $this->map(Ids::SOUL_LANTERN, function(Reader $in) : Block{ + return Blocks::SOUL_LANTERN() + ->setHanging($in->readBool(StateNames::HANGING)); + }); $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); + $this->map(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); + $this->map(Ids::SOUL_TORCH, function(Reader $in) : Block{ + return Blocks::SOUL_TORCH() + ->setFacing($in->readTorchFacing()); + }); $this->map(Ids::SPONGE, function(Reader $in) : Block{ return Blocks::SPONGE()->setWet(match($type = $in->readString(StateNames::SPONGE_TYPE)){ StringValues::SPONGE_TYPE_DRY => false, @@ -1120,6 +1130,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readLegacyHorizontalFacing()) ->setPowered($in->readBool(StateNames::POWERED_BIT)); }); + $this->map(Ids::TUFF, fn() => Blocks::TUFF()); $this->map(Ids::UNDERWATER_TORCH, function(Reader $in) : Block{ return Blocks::UNDERWATER_TORCH() ->setFacing($in->readTorchFacing()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 6becb7e91d..a95301baf3 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -875,6 +875,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("sea_lantern", fn() => Blocks::SEA_LANTERN()); $result->registerBlock("sea_pickle", fn() => Blocks::SEA_PICKLE()); $result->registerBlock("sealantern", fn() => Blocks::SEA_LANTERN()); + $result->registerBlock("shroomlight", fn() => Blocks::SHROOMLIGHT()); $result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN()); @@ -901,7 +902,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("snow", fn() => Blocks::SNOW()); $result->registerBlock("snow_block", fn() => Blocks::SNOW()); $result->registerBlock("snow_layer", fn() => Blocks::SNOW_LAYER()); + $result->registerBlock("soul_lantern", fn() => Blocks::SOUL_LANTERN()); $result->registerBlock("soul_sand", fn() => Blocks::SOUL_SAND()); + $result->registerBlock("soul_soil", fn() => Blocks::SOUL_SOIL()); + $result->registerBlock("soul_torch", fn() => Blocks::SOUL_TORCH()); $result->registerBlock("sponge", fn() => Blocks::SPONGE()); $result->registerBlock("spruce_button", fn() => Blocks::SPRUCE_BUTTON()); $result->registerBlock("spruce_door", fn() => Blocks::SPRUCE_DOOR()); @@ -985,6 +989,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("tripwire_hook", fn() => Blocks::TRIPWIRE_HOOK()); $result->registerBlock("trunk", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); + $result->registerBlock("tuff", fn() => Blocks::TUFF()); $result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH()); $result->registerBlock("undyed_shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("unlit_redstone_torch", fn() => Blocks::REDSTONE_TORCH()); From 5536672e4b1bcaa1a4a5c5f3851d6a14109237e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 20:42:53 +0100 Subject: [PATCH 0275/1858] Updated consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index ed0a668cbd..c702e217b8 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5423616":"Soul Fire","5396480":"Amethyst","5409280":"Calcite","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file From a005cd6e3368f520a71dda737288019433f9ff5c Mon Sep 17 00:00:00 2001 From: Alexey <45711510+Gaprix@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:43:46 +0300 Subject: [PATCH 0276/1858] Set the correct max stack size for spyglass (#5133) --- src/item/ItemFactory.php | 2 +- src/item/Spyglass.php | 31 +++++++++++++++++++++++++++++++ src/item/VanillaItems.php | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/item/Spyglass.php diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 1a4ecc0687..5f124df549 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -185,7 +185,6 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::RAW_IRON), "Raw Iron")); $this->register(new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); $this->register(new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); - $this->register(new Item(new IID(Ids::SPYGLASS), "Spyglass")); //the meta values for buckets are intentionally hardcoded because block IDs will change in the future $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); @@ -235,6 +234,7 @@ class ItemFactory{ $this->register(new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); $this->register(new Snowball(new IID(Ids::SNOWBALL), "Snowball")); $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); + $this->register(new Spyglass(new IID(Ids::SPYGLASS), "Spyglass")); $this->register(new Steak(new IID(Ids::STEAK), "Steak")); $this->register(new Stick(new IID(Ids::STICK), "Stick")); $this->register(new StringItem(new IID(Ids::STRING), "String")); diff --git a/src/item/Spyglass.php b/src/item/Spyglass.php new file mode 100644 index 0000000000..1427a71f52 --- /dev/null +++ b/src/item/Spyglass.php @@ -0,0 +1,31 @@ + Date: Tue, 5 Jul 2022 20:49:53 +0100 Subject: [PATCH 0277/1858] Lava: implement basalt generators --- src/block/Lava.php | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/block/Lava.php b/src/block/Lava.php index 05e98e50b9..de546c7986 100644 --- a/src/block/Lava.php +++ b/src/block/Lava.php @@ -54,31 +54,43 @@ class Lava extends Liquid{ return 2; //TODO: this is 1 in the nether } - protected function checkForHarden() : bool{ - if($this->falling){ - return false; - } - $colliding = null; + /** + * @phpstan-return \Generator + */ + private function getAdjacentBlocksExceptDown() : \Generator{ foreach(Facing::ALL as $side){ if($side === Facing::DOWN){ continue; } - $blockSide = $this->getSide($side); - if($blockSide instanceof Water){ - $colliding = $blockSide; - break; + yield $this->getSide($side); + } + } + + protected function checkForHarden() : bool{ + if($this->falling){ + return false; + } + foreach($this->getAdjacentBlocksExceptDown() as $colliding){ + if($colliding instanceof Water){ + if($this->decay === 0){ + $this->liquidCollide($colliding, VanillaBlocks::OBSIDIAN()); + return true; + }elseif($this->decay <= 4){ + $this->liquidCollide($colliding, VanillaBlocks::COBBLESTONE()); + return true; + } } } - if($colliding !== null){ - if($this->decay === 0){ - $this->liquidCollide($colliding, VanillaBlocks::OBSIDIAN()); - return true; - }elseif($this->decay <= 4){ - $this->liquidCollide($colliding, VanillaBlocks::COBBLESTONE()); - return true; + if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::SOUL_SOIL){ + foreach($this->getAdjacentBlocksExceptDown() as $colliding){ + if($colliding->getTypeId() === BlockTypeIds::BLUE_ICE){ + $this->liquidCollide($colliding, VanillaBlocks::BASALT()); + return true; + } } } + return false; } From a8dae96bb0dd342574055632189532a6dbe805ec Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 21:03:27 +0100 Subject: [PATCH 0278/1858] register honeycomb blocks properly --- .../bedrock/block/convert/BlockObjectToBlockStateSerializer.php | 1 + .../block/convert/BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + 3 files changed, 3 insertions(+) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index c871574276..54b0dd4492 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -742,6 +742,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::DEPRECATED, 0) ->writePillarAxis($block->getAxis()); }); + $this->mapSimple(Blocks::HONEYCOMB(), Ids::HONEYCOMB_BLOCK); $this->map(Blocks::HOPPER(), function(Hopper $block) : Writer{ return Writer::create(Ids::HOPPER) ->writeBool(StateNames::TOGGLE_BIT, $block->isPowered()) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 72edc85a5b..ab17013b8a 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -602,6 +602,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); }); $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); + $this->map(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); $this->map(Ids::HOPPER, function(Reader $in) : Block{ return Blocks::HOPPER() ->setFacing($in->readFacingWithoutUp()) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a95301baf3..88a2fb9cfe 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -616,6 +616,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("hay_bale", fn() => Blocks::HAY_BALE()); $result->registerBlock("hay_block", fn() => Blocks::HAY_BALE()); $result->registerBlock("heavy_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY()); + $result->registerBlock("honeycomb_block", fn() => Blocks::HONEYCOMB()); $result->registerBlock("hopper", fn() => Blocks::HOPPER()); $result->registerBlock("hopper_block", fn() => Blocks::HOPPER()); $result->registerBlock("ice", fn() => Blocks::ICE()); From d725ded7b65870b0ef3dd1a535fc45863968ba98 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 21:43:47 +0100 Subject: [PATCH 0279/1858] Added new ores --- src/block/BlockFactory.php | 36 ++++++++++++++---- src/block/BlockTypeIds.php | 12 +++++- src/block/CopperOre.php | 36 ++++++++++++++++++ src/block/GoldOre.php | 36 ++++++++++++++++++ src/block/IronOre.php | 36 ++++++++++++++++++ src/block/NetherGoldOre.php | 37 +++++++++++++++++++ src/block/VanillaBlocks.php | 24 +++++++++++- .../BlockObjectToBlockStateSerializer.php | 10 +++++ .../BlockStateToBlockObjectDeserializer.php | 11 ++++++ src/item/StringToItemParser.php | 10 +++++ 10 files changed, 237 insertions(+), 11 deletions(-) create mode 100644 src/block/CopperOre.php create mode 100644 src/block/GoldOre.php create mode 100644 src/block/IronOre.php create mode 100644 src/block/NetherGoldOre.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index cb865f26e9..ab069c5e61 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -145,7 +145,6 @@ class BlockFactory{ $this->register(new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); $this->register(new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); $this->register(new Coal(new BID(Ids::COAL), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->register(new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); $this->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); @@ -162,7 +161,6 @@ class BlockFactory{ $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); $this->register(new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $this->register(new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); $this->register(new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); $this->register(new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); @@ -173,7 +171,6 @@ class BlockFactory{ $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); $this->register(new Opaque(new BID(Ids::EMERALD), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, 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), "End Portal Frame", BreakInfo::indestructible())); $this->register(new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); @@ -211,7 +208,6 @@ class BlockFactory{ $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); $this->register(new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); $this->register(new Opaque(new BID(Ids::GOLD), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new Opaque(new BID(Ids::GOLD_ORE), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); $this->register(new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); @@ -239,7 +235,6 @@ class BlockFactory{ $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); $this->register(new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); - $this->register(new Opaque(new BID(Ids::IRON_ORE), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); $this->register(new Jukebox(new BID(Ids::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), "Ladder", new BreakInfo(0.4, ToolType::AXE))); @@ -249,7 +244,6 @@ class BlockFactory{ $this->register(new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); $this->register(new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); $this->register(new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); $this->register(new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); @@ -270,7 +264,6 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); - $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); @@ -317,7 +310,6 @@ class BlockFactory{ $this->register(new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); $this->register(new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); - $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); @@ -575,6 +567,8 @@ class BlockFactory{ $this->registerBlocksR14(); $this->registerBlocksR16(); $this->registerBlocksR17(); + + $this->registerOres(); } private function registerMushroomBlocks() : void{ @@ -712,6 +706,32 @@ class BlockFactory{ $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); } + private function registerOres() : void{ + $stoneOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(3.0, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + $this->register(new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); + $this->register(new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + $this->register(new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + $this->register(new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + $this->register(new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + $this->register(new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + + $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(4.5, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + $this->register(new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); + $this->register(new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + $this->register(new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + $this->register(new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + $this->register(new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + $this->register(new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + $this->register(new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + $this->register(new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + + $netherrackOreBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); + $this->register(new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); + } + private function registerBlocksR13() : void{ $this->register(new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index e2201fc29d..3d23ec17e6 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -660,6 +660,16 @@ final class BlockTypeIds{ public const WARPED_WALL_SIGN = 10633; public const HONEYCOMB = 10635; + public const DEEPSLATE_COAL_ORE = 10636; + public const DEEPSLATE_DIAMOND_ORE = 10637; + public const DEEPSLATE_EMERALD_ORE = 10638; + public const DEEPSLATE_LAPIS_LAZULI_ORE = 10639; + public const DEEPSLATE_REDSTONE_ORE = 10640; + public const DEEPSLATE_IRON_ORE = 10641; + public const DEEPSLATE_GOLD_ORE = 10642; + public const DEEPSLATE_COPPER_ORE = 10643; + public const COPPER_ORE = 10644; + public const NETHER_GOLD_ORE = 10645; - public const FIRST_UNUSED_BLOCK_ID = 10636; + public const FIRST_UNUSED_BLOCK_ID = 10646; } diff --git a/src/block/CopperOre.php b/src/block/CopperOre.php new file mode 100644 index 0000000000..ad02cc50f9 --- /dev/null +++ b/src/block/CopperOre.php @@ -0,0 +1,36 @@ +setCount(mt_rand(2, 6))]; + } + + public function isAffectedBySilkTouch() : bool{ return true; } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 6f40bdd07b..3955f6db78 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -133,6 +133,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static ChemistryTable COMPOUND_CREATOR() * @method static Concrete CONCRETE() * @method static ConcretePowder CONCRETE_POWDER() + * @method static CopperOre COPPER_ORE() * @method static Coral CORAL() * @method static CoralBlock CORAL_BLOCK() * @method static FloorCoralFan CORAL_FAN() @@ -186,6 +187,14 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab DEEPSLATE_BRICK_SLAB() * @method static Stair DEEPSLATE_BRICK_STAIRS() * @method static Wall DEEPSLATE_BRICK_WALL() + * @method static CoalOre DEEPSLATE_COAL_ORE() + * @method static CopperOre DEEPSLATE_COPPER_ORE() + * @method static DiamondOre DEEPSLATE_DIAMOND_ORE() + * @method static EmeraldOre DEEPSLATE_EMERALD_ORE() + * @method static GoldOre DEEPSLATE_GOLD_ORE() + * @method static IronOre DEEPSLATE_IRON_ORE() + * @method static LapisOre DEEPSLATE_LAPIS_LAZULI_ORE() + * @method static RedstoneOre DEEPSLATE_REDSTONE_ORE() * @method static Opaque DEEPSLATE_TILES() * @method static Slab DEEPSLATE_TILE_SLAB() * @method static Stair DEEPSLATE_TILE_STAIRS() @@ -347,7 +356,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static GlowingObsidian GLOWING_OBSIDIAN() * @method static Glowstone GLOWSTONE() * @method static Opaque GOLD() - * @method static Opaque GOLD_ORE() + * @method static GoldOre GOLD_ORE() * @method static Opaque GRANITE() * @method static Slab GRANITE_SLAB() * @method static Stair GRANITE_STAIRS() @@ -375,7 +384,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Opaque IRON() * @method static Thin IRON_BARS() * @method static Door IRON_DOOR() - * @method static Opaque IRON_ORE() + * @method static IronOre IRON_ORE() * @method static Trapdoor IRON_TRAPDOOR() * @method static ItemFrame ITEM_FRAME() * @method static Jukebox JUKEBOX() @@ -445,6 +454,7 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab NETHER_BRICK_SLAB() * @method static Stair NETHER_BRICK_STAIRS() * @method static Wall NETHER_BRICK_WALL() + * @method static NetherGoldOre NETHER_GOLD_ORE() * @method static NetherPortal NETHER_PORTAL() * @method static NetherQuartzOre NETHER_QUARTZ_ORE() * @method static NetherReactor NETHER_REACTOR_CORE() @@ -764,6 +774,7 @@ final class VanillaBlocks{ self::register("compound_creator", $factory->fromTypeId(Ids::COMPOUND_CREATOR)); self::register("concrete", $factory->fromTypeId(Ids::CONCRETE)); self::register("concrete_powder", $factory->fromTypeId(Ids::CONCRETE_POWDER)); + self::register("copper_ore", $factory->fromTypeId(Ids::COPPER_ORE)); self::register("coral", $factory->fromTypeId(Ids::CORAL)); self::register("coral_block", $factory->fromTypeId(Ids::CORAL_BLOCK)); self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); @@ -817,6 +828,14 @@ final class VanillaBlocks{ self::register("deepslate_brick_stairs", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_STAIRS)); self::register("deepslate_brick_wall", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_WALL)); self::register("deepslate_bricks", $factory->fromTypeId(Ids::DEEPSLATE_BRICKS)); + self::register("deepslate_coal_ore", $factory->fromTypeId(Ids::DEEPSLATE_COAL_ORE)); + self::register("deepslate_copper_ore", $factory->fromTypeId(Ids::DEEPSLATE_COPPER_ORE)); + self::register("deepslate_diamond_ore", $factory->fromTypeId(Ids::DEEPSLATE_DIAMOND_ORE)); + self::register("deepslate_emerald_ore", $factory->fromTypeId(Ids::DEEPSLATE_EMERALD_ORE)); + self::register("deepslate_gold_ore", $factory->fromTypeId(Ids::DEEPSLATE_GOLD_ORE)); + self::register("deepslate_iron_ore", $factory->fromTypeId(Ids::DEEPSLATE_IRON_ORE)); + self::register("deepslate_lapis_lazuli_ore", $factory->fromTypeId(Ids::DEEPSLATE_LAPIS_LAZULI_ORE)); + self::register("deepslate_redstone_ore", $factory->fromTypeId(Ids::DEEPSLATE_REDSTONE_ORE)); self::register("deepslate_tile_slab", $factory->fromTypeId(Ids::DEEPSLATE_TILE_SLAB)); self::register("deepslate_tile_stairs", $factory->fromTypeId(Ids::DEEPSLATE_TILE_STAIRS)); self::register("deepslate_tile_wall", $factory->fromTypeId(Ids::DEEPSLATE_TILE_WALL)); @@ -1075,6 +1094,7 @@ final class VanillaBlocks{ self::register("nether_brick_stairs", $factory->fromTypeId(Ids::NETHER_BRICK_STAIRS)); self::register("nether_brick_wall", $factory->fromTypeId(Ids::NETHER_BRICK_WALL)); self::register("nether_bricks", $factory->fromTypeId(Ids::NETHER_BRICKS)); + self::register("nether_gold_ore", $factory->fromTypeId(Ids::NETHER_GOLD_ORE)); self::register("nether_portal", $factory->fromTypeId(Ids::NETHER_PORTAL)); self::register("nether_quartz_ore", $factory->fromTypeId(Ids::NETHER_QUARTZ_ORE)); self::register("nether_reactor_core", $factory->fromTypeId(Ids::NETHER_REACTOR_CORE)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 54b0dd4492..85795b2a98 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -432,6 +432,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CONCRETE_POWDER) ->writeColor($block->getColor()); }); + $this->mapSimple(Blocks::COPPER_ORE(), Ids::COPPER_ORE); $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ return Writer::create(Ids::CORAL) ->writeBool(StateNames::DEAD_BIT, $block->isDead()) @@ -510,6 +511,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::DEEPSLATE_BRICK_SLAB(), Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::DEEPSLATE_BRICK_STAIRS(), Ids::DEEPSLATE_BRICK_STAIRS); $this->map(Blocks::DEEPSLATE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_BRICK_WALL))); + $this->mapSimple(Blocks::DEEPSLATE_COAL_ORE(), Ids::DEEPSLATE_COAL_ORE); + $this->mapSimple(Blocks::DEEPSLATE_COPPER_ORE(), Ids::DEEPSLATE_COPPER_ORE); + $this->mapSimple(Blocks::DEEPSLATE_DIAMOND_ORE(), Ids::DEEPSLATE_DIAMOND_ORE); + $this->mapSimple(Blocks::DEEPSLATE_EMERALD_ORE(), Ids::DEEPSLATE_EMERALD_ORE); + $this->mapSimple(Blocks::DEEPSLATE_GOLD_ORE(), Ids::DEEPSLATE_GOLD_ORE); + $this->mapSimple(Blocks::DEEPSLATE_IRON_ORE(), Ids::DEEPSLATE_IRON_ORE); + $this->mapSimple(Blocks::DEEPSLATE_LAPIS_LAZULI_ORE(), Ids::DEEPSLATE_LAPIS_ORE); + $this->map(Blocks::DEEPSLATE_REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_DEEPSLATE_REDSTONE_ORE : Ids::DEEPSLATE_REDSTONE_ORE)); $this->mapSimple(Blocks::DEEPSLATE_TILES(), Ids::DEEPSLATE_TILES); $this->mapSlab(Blocks::DEEPSLATE_TILE_SLAB(), Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB); $this->mapStairs(Blocks::DEEPSLATE_TILE_STAIRS(), Ids::DEEPSLATE_TILE_STAIRS); @@ -891,6 +900,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); + $this->mapSimple(Blocks::NETHER_GOLD_ORE(), Ids::NETHER_GOLD_ORE); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) ->writeString(StateNames::PORTAL_AXIS, match($block->getAxis()){ diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index ab17013b8a..38c719b46d 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -270,6 +270,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); }); + $this->map(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE()); $this->map(Ids::CORAL, function(Reader $in) : Block{ return Blocks::CORAL() ->setCoralType($in->readCoralType()) @@ -336,6 +337,14 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->mapSlab(Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_BRICK_SLAB()); $this->mapStairs(Ids::DEEPSLATE_BRICK_STAIRS, fn() => Blocks::DEEPSLATE_BRICK_STAIRS()); $this->map(Ids::DEEPSLATE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_BRICK_WALL(), $in)); + $this->map(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE()); + $this->map(Ids::DEEPSLATE_COPPER_ORE, fn() => Blocks::DEEPSLATE_COPPER_ORE()); + $this->map(Ids::DEEPSLATE_DIAMOND_ORE, fn() => Blocks::DEEPSLATE_DIAMOND_ORE()); + $this->map(Ids::DEEPSLATE_EMERALD_ORE, fn() => Blocks::DEEPSLATE_EMERALD_ORE()); + $this->map(Ids::DEEPSLATE_GOLD_ORE, fn() => Blocks::DEEPSLATE_GOLD_ORE()); + $this->map(Ids::DEEPSLATE_IRON_ORE, fn() => Blocks::DEEPSLATE_IRON_ORE()); + $this->map(Ids::DEEPSLATE_LAPIS_ORE, fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE()); + $this->map(Ids::DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(false)); $this->map(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); $this->mapSlab(Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_TILE_SLAB()); $this->mapStairs(Ids::DEEPSLATE_TILE_STAIRS, fn() => Blocks::DEEPSLATE_TILE_STAIRS()); @@ -689,6 +698,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); + $this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(true)); $this->map(Ids::LIT_FURNACE, function(Reader $in) : Block{ return Blocks::FURNACE() ->setFacing($in->readHorizontalFacing()) @@ -766,6 +776,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); + $this->map(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE()); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ return Blocks::NETHER_WART() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 88a2fb9cfe..3c2717a3e0 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -211,6 +211,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("concrete", fn() => Blocks::CONCRETE()); $result->registerBlock("concrete_powder", fn() => Blocks::CONCRETE_POWDER()); $result->registerBlock("concretepowder", fn() => Blocks::CONCRETE_POWDER()); + $result->registerBlock("copper_ore", fn() => Blocks::COPPER_ORE()); $result->registerBlock("coral", fn() => Blocks::CORAL()); $result->registerBlock("coral_block", fn() => Blocks::CORAL_BLOCK()); $result->registerBlock("coral_fan", fn() => Blocks::CORAL_FAN()); @@ -284,6 +285,14 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("deepslate_tile_slab", fn() => Blocks::DEEPSLATE_TILE_SLAB()); $result->registerBlock("deepslate_tile_stairs", fn() => Blocks::DEEPSLATE_TILE_STAIRS()); $result->registerBlock("deepslate_tile_wall", fn() => Blocks::DEEPSLATE_TILE_WALL()); + $result->registerBlock("deepslate_coal_ore", fn() => Blocks::DEEPSLATE_COAL_ORE()); + $result->registerBlock("deepslate_copper_ore", fn() => Blocks::DEEPSLATE_COPPER_ORE()); + $result->registerBlock("deepslate_diamond_ore", fn() => Blocks::DEEPSLATE_DIAMOND_ORE()); + $result->registerBlock("deepslate_emerald_ore", fn() => Blocks::DEEPSLATE_EMERALD_ORE()); + $result->registerBlock("deepslate_gold_ore", fn() => Blocks::DEEPSLATE_GOLD_ORE()); + $result->registerBlock("deepslate_iron_ore", fn() => Blocks::DEEPSLATE_IRON_ORE()); + $result->registerBlock("deepslate_lapis_lazuli_ore", fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE()); + $result->registerBlock("deepslate_redstone_ore", fn() => Blocks::DEEPSLATE_REDSTONE_ORE()); $result->registerBlock("detector_rail", fn() => Blocks::DETECTOR_RAIL()); $result->registerBlock("diamond_block", fn() => Blocks::DIAMOND()); $result->registerBlock("diamond_ore", fn() => Blocks::DIAMOND_ORE()); @@ -738,6 +747,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("nether_brick_wall", fn() => Blocks::NETHER_BRICK_WALL()); $result->registerBlock("nether_bricks", fn() => Blocks::NETHER_BRICKS()); $result->registerBlock("nether_bricks_stairs", fn() => Blocks::NETHER_BRICK_STAIRS()); + $result->registerBlock("nether_gold_ore", fn() => Blocks::NETHER_GOLD_ORE()); $result->registerBlock("nether_portal", fn() => Blocks::NETHER_PORTAL()); $result->registerBlock("nether_quartz_ore", fn() => Blocks::NETHER_QUARTZ_ORE()); $result->registerBlock("nether_reactor", fn() => Blocks::NETHER_REACTOR_CORE()); From f57cd95ad58e8121698dcedfe4cc620d844cb364 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 23:02:04 +0100 Subject: [PATCH 0280/1858] Added blast resistances to some blocks following values extracted from BDS --- src/block/BlockFactory.php | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index ab069c5e61..6fb7d0f1ef 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -742,16 +742,16 @@ class BlockFactory{ private function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0))); - $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); $this->register(new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); $this->register(new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); $this->register(new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); $this->register(new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); $this->register(new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); $this->register(new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); @@ -790,29 +790,26 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $this->register(new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); + $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); - //TODO: check blast resistance - $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - $this->register(new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0))); - //TODO: check blast resistance - $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); $this->register(new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); $this->register(new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); $this->register(new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - //TODO: check blast resistance - $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); $this->register(new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); $this->register(new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); From 638d03846cfeff410d9ba70673a6ea58c7a18126 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 23:11:12 +0100 Subject: [PATCH 0281/1858] Added blast resistance for cobbled and polished deepslate --- src/block/BlockFactory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 6fb7d0f1ef..b716d5c537 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -817,14 +817,14 @@ class BlockFactory{ $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); //TODO: check blast resistance - $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); $this->register(new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); $this->register(new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); $this->register(new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); //TODO: check blast resistance - $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); $this->register(new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); $this->register(new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); From ebe67822955b1b17c8d98017850a16031c433147 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 23:37:55 +0100 Subject: [PATCH 0282/1858] Remove TODO comment --- src/block/BlockFactory.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index b716d5c537..c4c9c3b742 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -816,14 +816,12 @@ class BlockFactory{ $this->register(new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - //TODO: check blast resistance $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); $this->register(new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); $this->register(new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); $this->register(new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - //TODO: check blast resistance $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); $this->register(new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); $this->register(new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); From fe93609c8d2efba2ce285f9c94e75420d0cce09b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 00:02:51 +0100 Subject: [PATCH 0283/1858] Added mud bricks and related blocks --- src/block/BlockFactory.php | 10 ++++++++++ src/block/BlockTypeIds.php | 8 +++++++- src/block/VanillaBlocks.php | 8 ++++++++ .../convert/BlockObjectToBlockStateSerializer.php | 4 ++++ .../convert/BlockStateToBlockObjectDeserializer.php | 4 ++++ src/item/StringToItemParser.php | 4 ++++ .../phpunit/block/block_factory_consistency_check.json | 2 +- 7 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index c4c9c3b742..532470de9d 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -567,6 +567,7 @@ class BlockFactory{ $this->registerBlocksR14(); $this->registerBlocksR16(); $this->registerBlocksR17(); + $this->registerMudBlocks(); $this->registerOres(); } @@ -829,6 +830,15 @@ class BlockFactory{ $this->register(new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); } + private function registerMudBlocks() : void{ + $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + + $this->register(new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); + $this->register(new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); + $this->register(new Stair(new BID(Ids::MUD_BRICK_STAIRS), "Mud Brick Stairs", $mudBricksBreakInfo)); + $this->register(new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); + } + /** * 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. diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 3d23ec17e6..227dcce2a7 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -670,6 +670,12 @@ final class BlockTypeIds{ public const DEEPSLATE_COPPER_ORE = 10643; public const COPPER_ORE = 10644; public const NETHER_GOLD_ORE = 10645; + public const MUD = 10646; + public const MUD_BRICKS = 10647; + public const MUD_BRICK_SLAB = 10648; + public const MUD_BRICK_STAIRS = 10649; + public const MUD_BRICK_WALL = 10650; + public const PACKED_MUD = 10651; - public const FIRST_UNUSED_BLOCK_ID = 10646; + public const FIRST_UNUSED_BLOCK_ID = 10652; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 3955f6db78..4a2820b8b8 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -446,6 +446,10 @@ use pocketmine\utils\CloningRegistryTrait; * @method static Slab MOSSY_STONE_BRICK_SLAB() * @method static Stair MOSSY_STONE_BRICK_STAIRS() * @method static Wall MOSSY_STONE_BRICK_WALL() + * @method static Opaque MUD_BRICKS() + * @method static Slab MUD_BRICK_SLAB() + * @method static Stair MUD_BRICK_STAIRS() + * @method static Wall MUD_BRICK_WALL() * @method static MushroomStem MUSHROOM_STEM() * @method static Mycelium MYCELIUM() * @method static Netherrack NETHERRACK() @@ -1087,6 +1091,10 @@ final class VanillaBlocks{ self::register("mossy_stone_brick_stairs", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_STAIRS)); self::register("mossy_stone_brick_wall", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_WALL)); self::register("mossy_stone_bricks", $factory->fromTypeId(Ids::MOSSY_STONE_BRICKS)); + self::register("mud_brick_slab", $factory->fromTypeId(Ids::MUD_BRICK_SLAB)); + self::register("mud_brick_stairs", $factory->fromTypeId(Ids::MUD_BRICK_STAIRS)); + self::register("mud_brick_wall", $factory->fromTypeId(Ids::MUD_BRICK_WALL)); + self::register("mud_bricks", $factory->fromTypeId(Ids::MUD_BRICKS)); self::register("mushroom_stem", $factory->fromTypeId(Ids::MUSHROOM_STEM)); self::register("mycelium", $factory->fromTypeId(Ids::MYCELIUM)); self::register("nether_brick_fence", $factory->fromTypeId(Ids::NETHER_BRICK_FENCE)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 85795b2a98..fd32ad55b6 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -891,6 +891,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); $this->mapStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), Ids::MOSSY_STONE_BRICK_STAIRS); $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); + $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); + $this->mapSlab(Blocks::MUD_BRICK_SLAB(), Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB); + $this->mapStairs(Blocks::MUD_BRICK_STAIRS(), Ids::MUD_BRICK_STAIRS); + $this->map(Blocks::MUD_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::MUD_BRICK_WALL))); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 38c719b46d..948730dfa3 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -772,6 +772,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS()); $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); + $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); + $this->mapSlab(Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB, fn() => Blocks::MUD_BRICK_SLAB()); + $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS()); + $this->map(Ids::MUD_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MUD_BRICK_WALL(), $in)); $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 3c2717a3e0..f66c9a2060 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -738,6 +738,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mossy_stone_brick_stairs", fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); $result->registerBlock("mossy_stone_brick_wall", fn() => Blocks::MOSSY_STONE_BRICK_WALL()); $result->registerBlock("mossy_stone_bricks", fn() => Blocks::MOSSY_STONE_BRICKS()); + $result->registerBlock("mud_bricks", fn() => Blocks::MUD_BRICKS()); + $result->registerBlock("mud_brick_slab", fn() => Blocks::MUD_BRICK_SLAB()); + $result->registerBlock("mud_brick_stairs", fn() => Blocks::MUD_BRICK_STAIRS()); + $result->registerBlock("mud_brick_wall", fn() => Blocks::MUD_BRICK_WALL()); $result->registerBlock("mushroom_stem", fn() => Blocks::MUSHROOM_STEM()); $result->registerBlock("mycelium", fn() => Blocks::MYCELIUM()); $result->registerBlock("nether_brick_block", fn() => Blocks::NETHER_BRICKS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index c702e217b8..ac1409da31 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160448":"Coal Ore","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5182976":"Diamond Ore","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250048":"Emerald Ore","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5261824":"Gold Ore","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5276672":"Iron Ore","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5288448":"Lapis Lazuli Ore","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307392":"Nether Quartz Ore","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5347840":"Redstone Ore","5347841":"Redstone Ore","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall","5451264":"Mud Bricks","5451776":"Mud Brick Slab","5451777":"Mud Brick Slab","5451778":"Mud Brick Slab","5452288":"Mud Brick Stairs","5452289":"Mud Brick Stairs","5452290":"Mud Brick Stairs","5452291":"Mud Brick Stairs","5452292":"Mud Brick Stairs","5452293":"Mud Brick Stairs","5452294":"Mud Brick Stairs","5452295":"Mud Brick Stairs","5452800":"Mud Brick Wall","5452801":"Mud Brick Wall","5452802":"Mud Brick Wall","5452804":"Mud Brick Wall","5452805":"Mud Brick Wall","5452806":"Mud Brick Wall","5452808":"Mud Brick Wall","5452809":"Mud Brick Wall","5452810":"Mud Brick Wall","5452816":"Mud Brick Wall","5452817":"Mud Brick Wall","5452818":"Mud Brick Wall","5452820":"Mud Brick Wall","5452821":"Mud Brick Wall","5452822":"Mud Brick Wall","5452824":"Mud Brick Wall","5452825":"Mud Brick Wall","5452826":"Mud Brick Wall","5452832":"Mud Brick Wall","5452833":"Mud Brick Wall","5452834":"Mud Brick Wall","5452836":"Mud Brick Wall","5452837":"Mud Brick Wall","5452838":"Mud Brick Wall","5452840":"Mud Brick Wall","5452841":"Mud Brick Wall","5452842":"Mud Brick Wall","5452864":"Mud Brick Wall","5452865":"Mud Brick Wall","5452866":"Mud Brick Wall","5452868":"Mud Brick Wall","5452869":"Mud Brick Wall","5452870":"Mud Brick Wall","5452872":"Mud Brick Wall","5452873":"Mud Brick Wall","5452874":"Mud Brick Wall","5452880":"Mud Brick Wall","5452881":"Mud Brick Wall","5452882":"Mud Brick Wall","5452884":"Mud Brick Wall","5452885":"Mud Brick Wall","5452886":"Mud Brick Wall","5452888":"Mud Brick Wall","5452889":"Mud Brick Wall","5452890":"Mud Brick Wall","5452896":"Mud Brick Wall","5452897":"Mud Brick Wall","5452898":"Mud Brick Wall","5452900":"Mud Brick Wall","5452901":"Mud Brick Wall","5452902":"Mud Brick Wall","5452904":"Mud Brick Wall","5452905":"Mud Brick Wall","5452906":"Mud Brick Wall","5452928":"Mud Brick Wall","5452929":"Mud Brick Wall","5452930":"Mud Brick Wall","5452932":"Mud Brick Wall","5452933":"Mud Brick Wall","5452934":"Mud Brick Wall","5452936":"Mud Brick Wall","5452937":"Mud Brick Wall","5452938":"Mud Brick Wall","5452944":"Mud Brick Wall","5452945":"Mud Brick Wall","5452946":"Mud Brick Wall","5452948":"Mud Brick Wall","5452949":"Mud Brick Wall","5452950":"Mud Brick Wall","5452952":"Mud Brick Wall","5452953":"Mud Brick Wall","5452954":"Mud Brick Wall","5452960":"Mud Brick Wall","5452961":"Mud Brick Wall","5452962":"Mud Brick Wall","5452964":"Mud Brick Wall","5452965":"Mud Brick Wall","5452966":"Mud Brick Wall","5452968":"Mud Brick Wall","5452969":"Mud Brick Wall","5452970":"Mud Brick Wall","5453056":"Mud Brick Wall","5453057":"Mud Brick Wall","5453058":"Mud Brick Wall","5453060":"Mud Brick Wall","5453061":"Mud Brick Wall","5453062":"Mud Brick Wall","5453064":"Mud Brick Wall","5453065":"Mud Brick Wall","5453066":"Mud Brick Wall","5453072":"Mud Brick Wall","5453073":"Mud Brick Wall","5453074":"Mud Brick Wall","5453076":"Mud Brick Wall","5453077":"Mud Brick Wall","5453078":"Mud Brick Wall","5453080":"Mud Brick Wall","5453081":"Mud Brick Wall","5453082":"Mud Brick Wall","5453088":"Mud Brick Wall","5453089":"Mud Brick Wall","5453090":"Mud Brick Wall","5453092":"Mud Brick Wall","5453093":"Mud Brick Wall","5453094":"Mud Brick Wall","5453096":"Mud Brick Wall","5453097":"Mud Brick Wall","5453098":"Mud Brick Wall","5453120":"Mud Brick Wall","5453121":"Mud Brick Wall","5453122":"Mud Brick Wall","5453124":"Mud Brick Wall","5453125":"Mud Brick Wall","5453126":"Mud Brick Wall","5453128":"Mud Brick Wall","5453129":"Mud Brick Wall","5453130":"Mud Brick Wall","5453136":"Mud Brick Wall","5453137":"Mud Brick Wall","5453138":"Mud Brick Wall","5453140":"Mud Brick Wall","5453141":"Mud Brick Wall","5453142":"Mud Brick Wall","5453144":"Mud Brick Wall","5453145":"Mud Brick Wall","5453146":"Mud Brick Wall","5453152":"Mud Brick Wall","5453153":"Mud Brick Wall","5453154":"Mud Brick Wall","5453156":"Mud Brick Wall","5453157":"Mud Brick Wall","5453158":"Mud Brick Wall","5453160":"Mud Brick Wall","5453161":"Mud Brick Wall","5453162":"Mud Brick Wall","5453184":"Mud Brick Wall","5453185":"Mud Brick Wall","5453186":"Mud Brick Wall","5453188":"Mud Brick Wall","5453189":"Mud Brick Wall","5453190":"Mud Brick Wall","5453192":"Mud Brick Wall","5453193":"Mud Brick Wall","5453194":"Mud Brick Wall","5453200":"Mud Brick Wall","5453201":"Mud Brick Wall","5453202":"Mud Brick Wall","5453204":"Mud Brick Wall","5453205":"Mud Brick Wall","5453206":"Mud Brick Wall","5453208":"Mud Brick Wall","5453209":"Mud Brick Wall","5453210":"Mud Brick Wall","5453216":"Mud Brick Wall","5453217":"Mud Brick Wall","5453218":"Mud Brick Wall","5453220":"Mud Brick Wall","5453221":"Mud Brick Wall","5453222":"Mud Brick Wall","5453224":"Mud Brick Wall","5453225":"Mud Brick Wall","5453226":"Mud Brick Wall","5160448":"Coal Ore","5449728":"Copper Ore","5182976":"Diamond Ore","5250048":"Emerald Ore","5261824":"Gold Ore","5276672":"Iron Ore","5288448":"Lapis Lazuli Ore","5347840":"Redstone Ore","5347841":"Redstone Ore","5445632":"Deepslate Coal Ore","5449216":"Deepslate Copper Ore","5446144":"Deepslate Diamond Ore","5446656":"Deepslate Emerald Ore","5448704":"Deepslate Gold Ore","5448192":"Deepslate Iron Ore","5447168":"Deepslate Lapis Lazuli Ore","5447680":"Deepslate Redstone Ore","5447681":"Deepslate Redstone Ore","5307392":"Nether Quartz Ore","5450240":"Nether Gold Ore"},"stateDataBits":9} \ No newline at end of file From 64e93ae4e1b554b270fecb9e9543defa9ea06ccb Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 6 Jul 2022 16:02:43 +0300 Subject: [PATCH 0284/1858] Fixed spyglass using animation (#5137) --- src/item/Spyglass.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/item/Spyglass.php b/src/item/Spyglass.php index 1427a71f52..974715c258 100644 --- a/src/item/Spyglass.php +++ b/src/item/Spyglass.php @@ -23,9 +23,15 @@ declare(strict_types=1); namespace pocketmine\item; -class Spyglass extends Item{ +use pocketmine\player\Player; + +class Spyglass extends Item implements Releasable{ public function getMaxStackSize() : int{ return 1; } + + public function canStartUsingItem(Player $player) : bool{ + return true; + } } From 494cb580f3741d8853f79d21ce26737377eb40f9 Mon Sep 17 00:00:00 2001 From: Alexey <45711510+Gaprix@users.noreply.github.com> Date: Wed, 6 Jul 2022 16:06:52 +0300 Subject: [PATCH 0285/1858] Add sound after wood stripping (#5124) --- src/block/Wood.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/block/Wood.php b/src/block/Wood.php index d31d65f0e3..276c4b6798 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -31,6 +31,7 @@ use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\world\sound\ItemUseOnBlockSound; class Wood extends Opaque{ use PillarRotationTrait; @@ -73,6 +74,7 @@ class Wood extends Opaque{ $item->applyDamage(1); $this->stripped = true; $this->position->getWorld()->setBlock($this->position, $this); + $this->position->getWorld()->addSound($this->position, new ItemUseOnBlockSound($this)); return true; } return false; From 46b79fbe8564870b239527b1cb65aa65d0c1f1af Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 14:11:33 +0100 Subject: [PATCH 0286/1858] StringToItemParser: fixed light_15 and light_block_15 aliases being missing --- src/item/StringToItemParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index f66c9a2060..777eadd90c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -71,7 +71,7 @@ final class StringToItemParser extends StringToTParser{ //wall and floor coral fans are the same item $result->registerBlock($prefix("coral_fan"), fn() => Blocks::CORAL_FAN()->setCoralType($coralType)); } - for($i = Light::MIN_LIGHT_LEVEL; $i < Light::MAX_LIGHT_LEVEL; $i++){ + for($i = Light::MIN_LIGHT_LEVEL; $i <= Light::MAX_LIGHT_LEVEL; $i++){ //helper aliases, since we don't support passing data values in /give $result->registerBlock("light_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); $result->registerBlock("light_block_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); From 5c4288de01fb163caf57831a7a02d6dbdd91b933 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 14:23:32 +0100 Subject: [PATCH 0287/1858] block/Light: fixed placement when clicking on another light block closes #5132 --- src/block/Light.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/block/Light.php b/src/block/Light.php index f21fc35f93..b2d39fb9ff 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -58,6 +58,11 @@ final class Light extends Flowable{ public function canBeReplaced() : bool{ return true; } + public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ + //light blocks behave like solid blocks when placing them on another light block + return $blockReplace->canBeReplaced() && $blockReplace->getTypeId() !== $this->getTypeId(); + } + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $this->level = $this->level === self::MAX_LIGHT_LEVEL ? self::MIN_LIGHT_LEVEL : From dc8f65c0dd5d75be72a6e6b36ccd44b6b76db125 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 14:33:27 +0100 Subject: [PATCH 0288/1858] Remove unnecessary BlockStateDictionary usages --- build/generate-block-serializer-consts.php | 21 ++++++++------------- tools/generate-block-palette-spec.php | 12 +----------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index d2ea78481e..4c3e156ab4 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -30,8 +30,6 @@ use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\convert\BlockStateDictionary; -use pocketmine\network\mcpe\convert\BlockStateDictionaryEntry; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; @@ -68,11 +66,14 @@ class BlockPaletteReport{ public array $seenStateValues = []; } -function generateBlockPaletteReport(BlockStateDictionary $dictionary) : BlockPaletteReport{ +/** + * @param BlockStateData[] $states + * @phpstan-param list $states + */ +function generateBlockPaletteReport(array $states) : BlockPaletteReport{ $result = new BlockPaletteReport(); - foreach($dictionary->getStates() as $state){ - $stateData = $state->getStateData(); + foreach($states as $stateData){ $name = $stateData->getName(); $result->seenTypes[$name] = $name; foreach($stateData->getStates() as $k => $v){ @@ -190,14 +191,8 @@ try{ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); } -$entries = []; -$fakeMeta = []; -foreach($states as $state){ - $fakeMeta[$state->getName()] ??= 0; - $entries[] = new BlockStateDictionaryEntry($state, $fakeMeta[$state->getName()]++); -} -$dictionary = new BlockStateDictionary($entries); -$report = generateBlockPaletteReport($dictionary); + +$report = generateBlockPaletteReport($states); generateBlockIds(array_values($report->seenTypes)); generateBlockStateNames($report); generateBlockStringValues($report); diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index c3b04b0e52..376359ffce 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -30,8 +30,6 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\convert\BlockStateDictionary; -use pocketmine\network\mcpe\convert\BlockStateDictionaryEntry; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; @@ -64,18 +62,10 @@ try{ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); } -$entries = []; -$fakeMeta = []; -foreach($states as $state){ - $fakeMeta[$state->getName()] ??= 0; - $entries[] = new BlockStateDictionaryEntry($state, $fakeMeta[$state->getName()]++); -} -$palette = new BlockStateDictionary($entries); $reportMap = []; -foreach($palette->getStates() as $entry){ - $state = $entry->getStateData(); +foreach($states as $state){ $name = $state->getName(); $reportMap[$name] ??= []; foreach($state->getStates() as $propertyName => $value){ From a8728a02f6f2e8ef917d3902902a54f793bfaec5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 14:37:46 +0100 Subject: [PATCH 0289/1858] BlockStateDictionary: extract a more generic helper method for decoding block palette files --- build/generate-block-serializer-consts.php | 9 ++------- .../mcpe/convert/BlockStateDictionary.php | 20 ++++++++++++++----- tools/generate-block-palette-spec.php | 10 ++-------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 4c3e156ab4..9fd944157f 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -29,11 +29,9 @@ use pocketmine\data\bedrock\block\BlockStateStringValues; use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; -use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use function array_map; use function array_values; use function asort; use function count; @@ -183,10 +181,7 @@ if($paletteRaw === false){ } try{ - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple($paletteRaw) - ); + $states = BlockStateDictionary::loadPaletteFromString($paletteRaw); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 584b7db62f..6322f5255e 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\nbt\NbtDataException; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; @@ -107,6 +108,19 @@ final class BlockStateDictionary{ */ public function getStates() : array{ return $this->states; } + /** + * @return BlockStateData[] + * @phpstan-return list + * + * @throws NbtDataException + */ + public static function loadPaletteFromString(string $blockPaletteContents) : array{ + return array_map( + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) + ); + } + public static function loadFromString(string $blockPaletteContents, string $metaMapContents) : self{ $metaMap = json_decode($metaMapContents, flags: JSON_THROW_ON_ERROR); if(!is_array($metaMap)){ @@ -114,12 +128,8 @@ final class BlockStateDictionary{ } $entries = []; - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) - ); - foreach($states as $i => $state){ + foreach(self::loadPaletteFromString($blockPaletteContents) as $i => $state){ $meta = $metaMap[$i] ?? null; if($meta === null){ throw new \InvalidArgumentException("Missing associated meta value for state $i (" . $state->toNbt() . ")"); diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index 376359ffce..b41c1334a0 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -23,17 +23,14 @@ declare(strict_types=1); namespace pocketmine\tools\generate_block_palette_spec; -use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use function array_map; use function array_values; use function count; use function dirname; @@ -54,10 +51,7 @@ if(count($argv) !== 3){ [, $inputFile, $outputFile] = $argv; try{ - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))) - ); + $states = BlockStateDictionary::loadPaletteFromString(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); From a377795db9eddbd2f8e42e59375288a90611a037 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 6 Jul 2022 16:57:07 +0300 Subject: [PATCH 0290/1858] Fixed SoulFire damage (#5138) --- src/block/BaseFire.php | 4 +++- src/block/Fire.php | 4 ++++ src/block/SoulFire.php | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/block/BaseFire.php b/src/block/BaseFire.php index f60b7677d0..2f95ca1a0f 100644 --- a/src/block/BaseFire.php +++ b/src/block/BaseFire.php @@ -41,7 +41,7 @@ abstract class BaseFire extends Flowable{ } public function onEntityInside(Entity $entity) : bool{ - $ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_FIRE, 1); + $ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_FIRE, $this->getFireDamage()); $entity->attack($ev); $ev = new EntityCombustByBlockEvent($this, $entity, 8); @@ -55,6 +55,8 @@ abstract class BaseFire extends Flowable{ return true; } + abstract protected function getFireDamage() : int; + public function getDropsForCompatibleTool(Item $item) : array{ return []; } diff --git a/src/block/Fire.php b/src/block/Fire.php index a176941cd2..503dd1dc3f 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -61,6 +61,10 @@ class Fire extends BaseFire{ return $this; } + protected function getFireDamage() : int{ + return 1; + } + public function onNearbyBlockChange() : void{ $down = $this->getSide(Facing::DOWN); if(SoulFire::canBeSupportedBy($down)){ diff --git a/src/block/SoulFire.php b/src/block/SoulFire.php index 61d7b37ed9..03729c75e3 100644 --- a/src/block/SoulFire.php +++ b/src/block/SoulFire.php @@ -31,6 +31,10 @@ final class SoulFire extends BaseFire{ return 10; } + protected function getFireDamage() : int{ + return 2; + } + public static function canBeSupportedBy(Block $block) : bool{ //TODO: this really ought to use some kind of tag system $id = $block->getTypeId(); From 88a5a9547919cc2489052ccf2c36437b46e9e904 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 17:26:15 +0100 Subject: [PATCH 0291/1858] Block: mark new functions as @internal --- src/block/Block.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index 2d55a38795..cddfe0440d 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -97,6 +97,9 @@ class Block{ public function getRequiredStateDataBits() : int{ return 0; } + /** + * @internal + */ final public function decodeTypeData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); $givenBits = $typeBits; @@ -109,6 +112,9 @@ class Block{ } } + /** + * @internal + */ final public function decodeStateData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); @@ -131,6 +137,9 @@ class Block{ //NOOP } + /** + * @internal + */ final public function computeTypeData() : int{ $typeBits = $this->getRequiredTypeDataBits(); $requiredBits = $typeBits; From d40e8648210727848a5ca053054bc2ef7a0e6f40 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 21:15:27 +0100 Subject: [PATCH 0292/1858] Item: update documentation of legacyJsonDeserialize() --- src/item/Item.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/item/Item.php b/src/item/Item.php index b12bb080df..4b3cd5aee6 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -585,9 +585,9 @@ class Item implements \JsonSerializable{ } /** - * @deprecated This is intended for deserializing legacy data from the old crafting JSON and creative JSON data. + * Deserializes item JSON data produced by json_encode()ing Item instances in older versions of PocketMine-MP. + * This method exists solely to allow upgrading old JSON data stored by plugins. * - * Returns an Item from properties created in an array by {@link Item#jsonSerialize} * @param mixed[] $data * * @throws SavedDataLoadingException From 06d3fc288087fae0693ece04c9a5e40cc30418b7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 21:41:13 +0100 Subject: [PATCH 0293/1858] Changelog for 5.0.0-ALPHA1 --- changelogs/5.0-alpha.md | 302 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 changelogs/5.0-alpha.md diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md new file mode 100644 index 0000000000..9eeb54e9aa --- /dev/null +++ b/changelogs/5.0-alpha.md @@ -0,0 +1,302 @@ +**For Minecraft: Bedrock Edition 1.19.0** + +# 5.0.0-ALPHA1 +Released 6th July 2022. + +This is a development snapshot of 5.0.0, an upcoming major update to PocketMine-MP. + +## WARNING +**This is an ALPHA release.** It is an early development snapshot of the upcoming 5.0.0 release. + +This means it is LIKELY to be unstable, and/or have performance issues not found in the latest stable releases. + +**BACK UP your data before testing this.** Any world or player data loaded in 5.0.0 will not work in 4.x due to backwards-incompatible storage format changes, and may also not work in future snapshots of 5.0.0. + +In addition, there are several breaking API changes. Plugins for 4.x may require code changes to run on this version. + +The API is **not finalized**. You should expect further changes in later alphas. + +## Core +- Worlds are now saved according to the Bedrock 1.19.0 format. +- Worlds generated by Bedrock from 1.13.0 and up are now supported (previously, only worlds up to 1.12 were supported). +- `/particle` now accepts strings for particle data instead of integers. +- `/particle` no longer accepts integers for block or item IDs. +- The usage of `blockcrack`, `iconcrack` and `blockdust` particle types in `/particle` now follows the same pattern as other particle types, with the data for each being passed in the `data` parameter instead of being baked into the particle name. + +## Gameplay +### Blocks +- Added the following new blocks: + - Amethyst Block + - Ancient Debris + - Basalt + - Blackstone blocks, slabs, stairs, and walls + - Calcite + - Chiseled Deepslate + - Chiseled Nether Bricks + - Chiseled Polished Blackstone + - Cobbled Deepslate blocks, slabs, stairs, and walls + - Copper Ore + - Cracked Deepslate Bricks + - Crached Deepslate Tiles + - Cracked Nether Bricks + - Cracked Polished Blackstone Bricks + - Crimson buttons, doors, fences, fence gates, hyphae, planks, pressure plates, signs, slabs, stairs, stems, and trapdoors + - Deepslate + - Deepslate Bricks blocks, slabs, stairs, and walls + - Deepslate Ores (coal, copper, diamond, emerald, gold, iron, lapis lazuli, redstone) + - Deepslate Tiles blocks, slabs, stairs, and walls + - Honeycomb Block + - Light Block + - Mangrove buttons, doors, fences, fence gates, logs, planks, pressure plates, signs, slabs, stairs, trapdoors, and wood + - Mud Bricks blocks, slabs, stairs, and walls + - Nether Gold Ore + - Polished Basalt + - Polished Blackstone blocks, buttons, pressure plates, slabs, stairs, and walls + - Polished Blackstone Bricks blocks, slabs, stairs, and walls + - Polished Deepslate blocks, slabs, stairs, and walls + - Quartz Bricks + - Shroomlight + - Smooth Basalt + - Soul Fire + - Soul Lantern + - Soul Soil + - Soul Torch + - Tuff + - Warped buttons, doors, fences, fence gates, hyphae, planks, pressure plates, signs, slabs, stairs, stems, and trapdoors +- Added support for basalt generators +- Iron Ore and Gold Ore now drop Raw Iron and Raw Gold respectively, instead of the ore blocks. +- Item frames can now be placed on the top and bottom of blocks. +- All-sided logs ("wood", for want of a better name) can now be placed in X, Y, and Z orientations. +- Walls now connect when placed, following the pre-1.16 logic. (1.16 logic is planned to be implemented, but currently low priority.) +- Stripping logs by right-clicking them with an axe is now supported. + +### Items +- Added the following new items: + - Amethyst Shard + - Copper Ingot + - Disc Fragment (5) + - Echo Shard + - Glow Ink Sac + - Honeycomb + - Phantom Membrane + - Raw Copper + - Raw Gold + - Raw Iron + - Spyglass + +## API +### General +- Protected and public properties now use native property types wherever possible. +- Parameter and return typehints have been applied in many places where it wasn't previously possible. + +### `pocketmine\block` +#### Runtime block representation +- Blocks no longer use internal Minecraft IDs and metadata to identify themselves. All APIs associated with legacy IDs and meta have been removed. +- A new set of runtime IDs generated from `VanillaBlocks` is used to identify block types. These IDs are defined in `BlockTypeIds`. + - These new IDs are used for runtime representation of blocks on chunks, and for type comparison purposes. + - Block type IDs are used at **runtime only**. They should **NOT** be stored in configs or databases, as they are subject to change without warning. +- Block state properties (e.g. facing, colour, etc.) are now represented by PM-specific state data instead of legacy metadata. The state data consists of: + - Dynamic type data - this is retained by items when the block is broken (colour, wet/dry, coral type, etc.) - handled by `Block->decodeType()` and `Block->encodeType()` + - State data - this is discarded when the block is broken (facing direction, lit/unlit, powered/unpowered, etc.) - handled by `Block->decodeState()` and `Block->encodeState()` + +**Block type IDs, and state/type data, are intended for use at RUNTIME only. The values of type IDs and state data may change without warning. They should NOT be saved in configs or databases.** + +#### Implementing new blocks +To register a new block, the following changes are now required: + +- Add a new type ID to `BlockTypeIds` +- Register the block in `BlockFactory` +- Amend `VanillaBlocks` to include the new block +- Amend `BlockStateToBlockObjectDeserializer` to deserialize the block from disk +- Amend `BlockObjectToBlockStateSerializer` to serialize the block for disk +- Optionally, amend `StringToItemParser` to add string alias(es) for the block, so that it can be given via `/give` + +This is admittedly rather more of a hassle than in the old days, but that's the price of abstraction. Research is underway for ways to improve this without spaghettifying the code again. + +#### Change list +- The following classes have been removed: + - `BlockIdentifierFlattened` + - `BlockLegacyIds` + - `BlockLegacyMetadata` + - `utils\ColorInMetadataTrait` - `utils\ColoredTrait` now implements colour type data serialization uniformly + - `utils\InvalidBlockStateException` - this has been superseded by `pocketmine\data\runtime\InvalidSerializedRuntimeDataException` + - `utils\NormalHorizontalFacingInMetadataTrait` - `utils\HorizontalFacingTrait` now implements facing type data serialization uniformly + - `utils\PillarRotationInMetadataTrait` - `utils\PillarRotationTrait` now implements rotation type data serialization uniformly + - `utils\BlockDataSerializer` +- The following classes have been added: + - `BaseFire` + - `SoulFire` + - `BlockTypeIds` + - This is a generated enum of PocketMine-MP-specific block type IDs + - There is one for every entry in `VanillaBlocks` + - Do NOT save these IDs in a config or database, as they may change without warning + - Block type IDs are intended for comparison purposes only + - Block type IDs cannot be negative + - `CopperOre` + - `GoldOre` + - `IronOre` + - `Light` + - `NetherGoldOre` + - `utils\WallConnectionType` - enum of all possible wall connection types + - `utils\WoodType` - enum of all possible wood types, used for wood material blocks like planks and logs + - `utils\WoodTypeTrait` +- The following API methods have been removed: + - `Block->getId()` - for type comparisons, use `Block->getTypeId()` instead + - `Block->getMeta()` - for state comparisons, use `Block->getStateId()` instead + - `Block->readStateFromData()` + - `Block->writeStateToMeta()` + - `Block->writeStateToItemMeta()` + - `Block->getStateBitmask()` + - `BlockFactory->get()` + - To get a block at runtime, e.g. stone, use `VanillaBlocks::STONE()` + - To load a block from old config or database data: + 1. Use `GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta()` to convert it to modern data + 2. Pass the data to `GlobalBlockStateHandlers::getDeserializer()` to get a blockstate ID + 3. Pass the blockstate ID to `BlockFactory::fromStateId()` to get a `Block` instance + - `BlockIdentifier->getBlockId()` + - `BlockIdentifier->getAllBlockIds()` + - `BlockIdentifier->getVariant()` + - `BlockIdentifier->getItemId()` + - `Door->isPowered()` + - `Door->setPowered()` + - `Skull->isNoDrops()` + - `Skull->setNoDrops()` + - `VanillaBlocks::*_GLAZED_TERRACOTTA()` - use `VanillaBlocks::GLAZED_TERRACOTTA()->setColor(DyeColor::WHATEVER())` instead + - `utils\FallableTrait->getId()` is no longer required + - `utils\FallableTrait->getMeta()` is no longer required +- The following constants have been renamed: + - `Block::INTERNAL_METADATA_BITS` -> `Block::INTERNAL_STATE_DATA_BITS` + - `Block::INTERNAL_METADATA_MASK` -> `Block::INTERNAL_STATE_DATA_MASK` +- The following API methods have been renamed: + - `Block->getFullId()` -> `Block->getStateId()` +- The following API methods have signature changes: + - `BlockIdentifier->__construct()` now accepts `int $blockTypeId`, and no longer accepts `int $blockId, int $variant, ?int $itemId` + - `ItemFrame->getFacing()` may now return `Facing::UP` and `Facing::DOWN` + - `ItemFrame->setFacing()` now accepts `Facing::UP` and `Facing::DOWN` +- The following API methods have been added: + - `protected Block->decodeState()` - encodes the block's state properties, e.g. facing, powered/unpowered, etc. + - `protected Block->decodeType()` - encodes the block's type properties, e.g. colour, wet/dry, coral type, etc. + - `public Block->getRequiredStateDataBits()` - returns the number of bits required to encode the block's state data + - `public Block->getRequiredTypeDataBits()` - returns the number of bits required to encode the block's type data + - `public BlockIdentifier->getBlockTypeId()` - returns the block's type ID according to `BlockTypeIds` + - `public GlazedTerracotta->getColor()` (from `ColoredTrait`) - this was previously unsupported due to legacy limitations + - `public GlazedTerracotta->setColor()` (from `ColoredTrait`) - this was previously unsupported due to legacy limitations + - `public Wall->getConnections()` - returns the wall's connections and their types (see `utils\WallConnectionType`) + - `public Wall->setConnections()` - sets the wall's connections and their types (see `utils\WallConnectionType`) + - `public Wall->getConnection()` + - `public Wall->setConnection()` + - `public Wall->isPost()` + - `public Wall->setPost()` + - `public Wood->isStripped()` + - `public Wood->setStripped()` +- The following classes now use new traits, adding API methods and/or properties: + - `FenceGate` uses `utils\WoodTypeTrait` + - `GlazedTerracotta` uses `utils\ColoredTrait` + - `Planks` uses `utils\WoodTypeTrait` + - `Wood` uses `utils\WoodTypeTrait` + - `WoodenButton` uses `utils\WoodTypeTrait` + - `WoodenDoor` uses `utils\WoodTypeTrait` + - `WoodenFence` uses `utils\WoodTypeTrait` + - `WoodenPressurePlate` uses `utils\WoodTypeTrait` + - `WoodenSlab` uses `utils\WoodTypeTrait` + - `WoodenStairs` uses `utils\WoodTypeTrait` + - `WoodenTrapdoor` uses `utils\WoodTypeTrait` + +### `pocketmine\crafting` +- The following classes have been added: + - `RecipeIngredient` interface + - `ExactRecipeIngredient` - matches an exact item + - `MetaWildcardRecipeIngredient` - matches an item with the given legacy Minecraft ID, but any metadata value +- The following API methods have signature changes: + - `FurnaceRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `FurnaceRecipe->getInput()` now returns `RecipeIngredient` instead of `Item` + - `PotionContainerChangeRecipe->__construct()` now accepts `string, RecipeIngredient, string` (using Minecraft string IDs instead of legacy integers). + - `PotionContainerChangeRecipe->getIngredient()` now returns `RecipeIngredient` instead of `Item`. + - `PotionContainerChangeRecipe->getInputItemId()` now returns `string` (using Minecraft string IDs instead of legacy integers). + - `PotionContainerChangeRecipe->getOutputItemId()` now returns `string` (using Minecraft string IDs instead of legacy integers). + - `PotionTypeRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `PotionTypeRecipe->getIngredient()` now returns `RecipeIngredient` instead of `Item` + - `PotionTypeRecipe->getInput()` now returns `RecipeIngredient` instead of `Item` + - `ShapedRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `ShapedRecipe->getIngredient()` now returns `?RecipeIngredient` instead of `?Item` + - `ShapedRecipe->getIngredientList()` now returns `RecipeIngredient[]` instead of `Item[]` + - `ShapedRecipe->getIngredientMap()` now returns `RecipeIngredient[][]` instead of `Item[][]` + - `ShapelessRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `ShapelessRecipe->getIngredientList()` now returns `RecipeIngredient[]` instead of `Item[]` + +### `pocketmine\entity` +- `Entity` now declares new abstract methods which must be implemented by subclasses: + - `public Entity->getInitialDragMultiplier()` + - `public Entity->getInitialGravity()` + +### `pocketmine\item` +#### Runtime item representation +- Items no longer use internal Minecraft string IDs and metadata to identify themselves. All APIs associated with legacy IDs and/or meta have been removed. +- A new set of runtime item IDs generated from `VanillaItems` is now used to identify item types. These IDs are defined in `ItemTypeIds`. + - These new IDs are primarily intended for type comparison purposes. + - Item type IDs are used at **runtime only**. They should **NOT** be stored in configs or databases, as they are not guaranteed to remain the same between versions. +- In some cases, items may have additional "type data" which provides extra type information about an item. This replaces item metadata in some cases. + - Type data may be used to store dynamic type information such as dye colour, potion type, etc. + - Items must have the same type ID **and** type data in order to be stackable. +- Blocks, when represented as items: + - retain their block type data, but not state data (for example, different colours of concrete don't stack, but things like facing don't affect stackability) + - use the negative of their block type ID (e.g. a block with type ID `1` will have an item type ID of `-1`). +- Durable items (e.g. tools, armour) now use NBT `Damage` tag to store durability (like Minecraft 1.13+), instead of legacy meta values. + +**Item type IDs and type data are intended for RUNTIME use only. The values of type IDs and/or type data may change without warning. They should NOT be saved in configs or databases.** + +#### Implementing new items +To register a new item, the following changes are now required: + +- Add a new ID to `ItemTypeIds` +- Register the item in `ItemFactory` +- Amend `VanillaItems` to add the item +- Amend `ItemDeserializer` to add a deserializer for loading the item from disk +- Amend `ItemSerializer` to add a serializer for saving the item to disk +- Optionally, amend `StringToItemParser` to add string alias(es) for the item, so it can be given via `/give` + +Again, it's acknowledged this is rather more cumbersome than it should be, but this is an ongoing process. + +#### Change list +- `Item` is no longer `json_encode()`-able. + - The original purpose of this was to allow items to be serialized to JSON for crafting data generated from `CraftingDataPacket`. Due to changes in the generation methodology, bypassing `Item`s entirely, this is no longer necessary. + - `jsonSerialize()` requires the item to know about the method by which it will be serialized, creating a cyclic dependency between the `Item` implementation and its serialization method. + - It's relatively easy to write a replacement method to encode items to JSON as you desire. +- The following classes have been removed: + - `ItemIds` + - `Skull` + - `Bed` +- The following classes have been added: + - `CoralFan` + - `Spyglass` +- The following API methods have been added: + - `public Dye->setColor()` + - `public ItemIdentifer->getTypeId()` + - `public static ItemIdentifier::fromBlock()` + - `public Potion->setType()` + - `public SplashPotion->setType()` +- The following API methods have been removed: + - `Item->getId()` - for type comparisons, use `Item->getTypeId()` instead + - `Item->getMeta()` - use the item's specific API methods to compare information such as colour, potion type etc. + - `Item->hasAnyDamageValue()` - for meta wildcard recipe ingredients, use `pocketmine\crafting\MetaWildcardRecipeIngredient` instead + - `ItemFactory->get()` + - To get an item at runtime, e.g. iron ingot, use `VanillaItems::IRON_INGOT()` + - To get a block as an item, e.g. stone, use `VanillaBlocks::STONE()->asItem()` + - To load an item from legacy ID and meta: + 1. Use `GlobalItemDataHandlers::getUpgrader()->upgradeItemTypeDataInt()` to convert the legacy ID and meta to `ItemStackData` + 2. Pass the itemstack data to `GlobalItemDataHandlers::getDeserializer()` to get an `Item` instance + - `ItemFactory->remap()` + - `ItemIdentifier->getId()` + - `ItemIdentifier->getMeta()` +- The following API methods have been renamed: + - `Item::jsonDeserialize()` -> `Item::legacyJsonDeserialize()` + - `ItemFactory->getAllRegistered()` -> `ItemFactory->getAllKnownTypes()` +- The following API methods have signature changes: + - `ItemFactory->isRegistered()` no longer accepts a `$variant` parameter, and now expects an item type ID for the ID parameter + - `ItemIdentifier->__construct()` no longer accepts a `$variant` parameter, and now expects an item type ID for the ID parameter + - `LegacyStringToItemParser->addMapping()` now accepts a string for ID, instead of an integer + +### `pocketmine\world` +- The following classes have been added: + - `pocketmine\world\format\io\GlobalBlockStateHandlers` + - `pocketmine\world\format\io\GlobalItemDataHandlers` From ce8742433609fa04a8302b218e01e4413d722685 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 21:49:03 +0100 Subject: [PATCH 0294/1858] update changelog [ci skip] --- changelogs/5.0-alpha.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 9eeb54e9aa..6acff1123f 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -7,12 +7,11 @@ This is a development snapshot of 5.0.0, an upcoming major update to PocketMine- ## WARNING **This is an ALPHA release.** It is an early development snapshot of the upcoming 5.0.0 release. - This means it is LIKELY to be unstable, and/or have performance issues not found in the latest stable releases. -**BACK UP your data before testing this.** Any world or player data loaded in 5.0.0 will not work in 4.x due to backwards-incompatible storage format changes, and may also not work in future snapshots of 5.0.0. +**BACK UP your data before testing this.** This version will work with worlds and player data from 4.x, **BUT** any world or player data loaded in 5.0.0 **will not work in 4.x** due to backwards-incompatible storage format changes. -In addition, there are several breaking API changes. Plugins for 4.x may require code changes to run on this version. +In addition, there are a number of breaking API changes. Plugins for 4.x may require code changes to run on this version. The API is **not finalized**. You should expect further changes in later alphas. @@ -23,6 +22,12 @@ The API is **not finalized**. You should expect further changes in later alphas. - `/particle` no longer accepts integers for block or item IDs. - The usage of `blockcrack`, `iconcrack` and `blockdust` particle types in `/particle` now follows the same pattern as other particle types, with the data for each being passed in the `data` parameter instead of being baked into the particle name. +## Tools +- The following tool scripts have been added: + - `generate-block-palette-spec.php` - generates a JSON file with a readable overview of blocks, their state properties, and their possible values + - `generate-blockstate-upgrade-schema.php` - generates JSON blockstate upgrade schemas like those found in [BedrockBlockUpgradeSchema](https://github.com/pmmp/BedrockBlockUpgradeSchema) + - `generate-item-upgrade-schema.php` - generates JSON item ID/meta upgrade schemas like those found in [BedrockItemUpgradeSchema](https://github.com/pmmp/BedrockItemUpgradeSchema) + ## Gameplay ### Blocks - Added the following new blocks: From 30079f6fd0d5903315e12cbcff7abfe31c486536 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 21:52:37 +0100 Subject: [PATCH 0295/1858] Release 5.0.0-ALPHA1 --- changelogs/5.0-alpha.md | 2 +- src/VersionInfo.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 6acff1123f..eade91d275 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -3,7 +3,7 @@ # 5.0.0-ALPHA1 Released 6th July 2022. -This is a development snapshot of 5.0.0, an upcoming major update to PocketMine-MP. +This is a development snapshot of 5.0.0, an upcoming major update to PocketMine-MP. This version includes many new improvements, including support for Bedrock worlds from 1.13 onwards, a large array of new blocks, and various changes to the plugin API. ## WARNING **This is an ALPHA release.** It is an early development snapshot of the upcoming 5.0.0 release. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 6c2f8f660f..d1e0592641 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.0.0-ALPHA1"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From eb404bddb4da5953ce93c22350f4e51350a7fbd8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 21:52:37 +0100 Subject: [PATCH 0296/1858] 5.0.0-ALPHA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d1e0592641..b74de0e601 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 986daab51151dfa7d79140e5ee5838d916684c51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 22:25:17 +0100 Subject: [PATCH 0297/1858] ItemFactory: remove dead TODO comment --- src/item/ItemFactory.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 5f124df549..0e59e120c8 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -186,7 +186,6 @@ class ItemFactory{ $this->register(new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); $this->register(new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); - //the meta values for buckets are intentionally hardcoded because block IDs will change in the future $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); $this->register(new Melon(new IID(Ids::MELON), "Melon")); From ae70c63798bab3aa951b985a5f71853a2178e46c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 23:01:17 +0100 Subject: [PATCH 0298/1858] Added tinted glass --- src/block/BlockFactory.php | 2 ++ src/block/BlockTypeIds.php | 2 +- src/block/TintedGlass.php | 31 +++++++++++++++++++ src/block/VanillaBlocks.php | 2 ++ .../BlockObjectToBlockStateSerializer.php | 1 + .../BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 8 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/block/TintedGlass.php diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 532470de9d..6d867c9ee2 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -828,6 +828,8 @@ class BlockFactory{ $this->register(new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); $this->register(new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); $this->register(new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); + + $this->register(new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); } private function registerMudBlocks() : void{ diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 227dcce2a7..567f10736b 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -658,7 +658,7 @@ final class BlockTypeIds{ public const MANGROVE_WALL_SIGN = 10631; public const CRIMSON_WALL_SIGN = 10632; public const WARPED_WALL_SIGN = 10633; - + public const TINTED_GLASS = 10634; public const HONEYCOMB = 10635; public const DEEPSLATE_COAL_ORE = 10636; public const DEEPSLATE_DIAMOND_ORE = 10637; diff --git a/src/block/TintedGlass.php b/src/block/TintedGlass.php new file mode 100644 index 0000000000..752f07c93c --- /dev/null +++ b/src/block/TintedGlass.php @@ -0,0 +1,31 @@ +fromTypeId(Ids::SUNFLOWER)); self::register("sweet_berry_bush", $factory->fromTypeId(Ids::SWEET_BERRY_BUSH)); self::register("tall_grass", $factory->fromTypeId(Ids::TALL_GRASS)); + self::register("tinted_glass", $factory->fromTypeId(Ids::TINTED_GLASS)); self::register("tnt", $factory->fromTypeId(Ids::TNT)); self::register("torch", $factory->fromTypeId(Ids::TORCH)); self::register("trapped_chest", $factory->fromTypeId(Ids::TRAPPED_CHEST)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index fd32ad55b6..2b9fafa8dc 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1167,6 +1167,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); + $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->map(Blocks::TNT(), function(TNT $block) : Writer{ return Writer::create(Ids::TNT) ->writeBool(StateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 948730dfa3..8ab71c3179 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -1119,6 +1119,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::TALL_GRASS_TYPE, $type), }; }); + $this->map(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->map(Ids::TNT, function(Reader $in) : Block{ return Blocks::TNT() ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 777eadd90c..c3843a1132 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -995,6 +995,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("tall_grass", fn() => Blocks::TALL_GRASS()); $result->registerBlock("tallgrass", fn() => Blocks::FERN()); $result->registerBlock("terracotta", fn() => Blocks::STAINED_CLAY()); + $result->registerBlock("tinted_glass", fn() => Blocks::TINTED_GLASS()); $result->registerBlock("tnt", fn() => Blocks::TNT()); $result->registerBlock("torch", fn() => Blocks::TORCH()); $result->registerBlock("trapdoor", fn() => Blocks::OAK_TRAPDOOR()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index ac1409da31..a00dd5d5da 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall","5451264":"Mud Bricks","5451776":"Mud Brick Slab","5451777":"Mud Brick Slab","5451778":"Mud Brick Slab","5452288":"Mud Brick Stairs","5452289":"Mud Brick Stairs","5452290":"Mud Brick Stairs","5452291":"Mud Brick Stairs","5452292":"Mud Brick Stairs","5452293":"Mud Brick Stairs","5452294":"Mud Brick Stairs","5452295":"Mud Brick Stairs","5452800":"Mud Brick Wall","5452801":"Mud Brick Wall","5452802":"Mud Brick Wall","5452804":"Mud Brick Wall","5452805":"Mud Brick Wall","5452806":"Mud Brick Wall","5452808":"Mud Brick Wall","5452809":"Mud Brick Wall","5452810":"Mud Brick Wall","5452816":"Mud Brick Wall","5452817":"Mud Brick Wall","5452818":"Mud Brick Wall","5452820":"Mud Brick Wall","5452821":"Mud Brick Wall","5452822":"Mud Brick Wall","5452824":"Mud Brick Wall","5452825":"Mud Brick Wall","5452826":"Mud Brick Wall","5452832":"Mud Brick Wall","5452833":"Mud Brick Wall","5452834":"Mud Brick Wall","5452836":"Mud Brick Wall","5452837":"Mud Brick Wall","5452838":"Mud Brick Wall","5452840":"Mud Brick Wall","5452841":"Mud Brick Wall","5452842":"Mud Brick Wall","5452864":"Mud Brick Wall","5452865":"Mud Brick Wall","5452866":"Mud Brick Wall","5452868":"Mud Brick Wall","5452869":"Mud Brick Wall","5452870":"Mud Brick Wall","5452872":"Mud Brick Wall","5452873":"Mud Brick Wall","5452874":"Mud Brick Wall","5452880":"Mud Brick Wall","5452881":"Mud Brick Wall","5452882":"Mud Brick Wall","5452884":"Mud Brick Wall","5452885":"Mud Brick Wall","5452886":"Mud Brick Wall","5452888":"Mud Brick Wall","5452889":"Mud Brick Wall","5452890":"Mud Brick Wall","5452896":"Mud Brick Wall","5452897":"Mud Brick Wall","5452898":"Mud Brick Wall","5452900":"Mud Brick Wall","5452901":"Mud Brick Wall","5452902":"Mud Brick Wall","5452904":"Mud Brick Wall","5452905":"Mud Brick Wall","5452906":"Mud Brick Wall","5452928":"Mud Brick Wall","5452929":"Mud Brick Wall","5452930":"Mud Brick Wall","5452932":"Mud Brick Wall","5452933":"Mud Brick Wall","5452934":"Mud Brick Wall","5452936":"Mud Brick Wall","5452937":"Mud Brick Wall","5452938":"Mud Brick Wall","5452944":"Mud Brick Wall","5452945":"Mud Brick Wall","5452946":"Mud Brick Wall","5452948":"Mud Brick Wall","5452949":"Mud Brick Wall","5452950":"Mud Brick Wall","5452952":"Mud Brick Wall","5452953":"Mud Brick Wall","5452954":"Mud Brick Wall","5452960":"Mud Brick Wall","5452961":"Mud Brick Wall","5452962":"Mud Brick Wall","5452964":"Mud Brick Wall","5452965":"Mud Brick Wall","5452966":"Mud Brick Wall","5452968":"Mud Brick Wall","5452969":"Mud Brick Wall","5452970":"Mud Brick Wall","5453056":"Mud Brick Wall","5453057":"Mud Brick Wall","5453058":"Mud Brick Wall","5453060":"Mud Brick Wall","5453061":"Mud Brick Wall","5453062":"Mud Brick Wall","5453064":"Mud Brick Wall","5453065":"Mud Brick Wall","5453066":"Mud Brick Wall","5453072":"Mud Brick Wall","5453073":"Mud Brick Wall","5453074":"Mud Brick Wall","5453076":"Mud Brick Wall","5453077":"Mud Brick Wall","5453078":"Mud Brick Wall","5453080":"Mud Brick Wall","5453081":"Mud Brick Wall","5453082":"Mud Brick Wall","5453088":"Mud Brick Wall","5453089":"Mud Brick Wall","5453090":"Mud Brick Wall","5453092":"Mud Brick Wall","5453093":"Mud Brick Wall","5453094":"Mud Brick Wall","5453096":"Mud Brick Wall","5453097":"Mud Brick Wall","5453098":"Mud Brick Wall","5453120":"Mud Brick Wall","5453121":"Mud Brick Wall","5453122":"Mud Brick Wall","5453124":"Mud Brick Wall","5453125":"Mud Brick Wall","5453126":"Mud Brick Wall","5453128":"Mud Brick Wall","5453129":"Mud Brick Wall","5453130":"Mud Brick Wall","5453136":"Mud Brick Wall","5453137":"Mud Brick Wall","5453138":"Mud Brick Wall","5453140":"Mud Brick Wall","5453141":"Mud Brick Wall","5453142":"Mud Brick Wall","5453144":"Mud Brick Wall","5453145":"Mud Brick Wall","5453146":"Mud Brick Wall","5453152":"Mud Brick Wall","5453153":"Mud Brick Wall","5453154":"Mud Brick Wall","5453156":"Mud Brick Wall","5453157":"Mud Brick Wall","5453158":"Mud Brick Wall","5453160":"Mud Brick Wall","5453161":"Mud Brick Wall","5453162":"Mud Brick Wall","5453184":"Mud Brick Wall","5453185":"Mud Brick Wall","5453186":"Mud Brick Wall","5453188":"Mud Brick Wall","5453189":"Mud Brick Wall","5453190":"Mud Brick Wall","5453192":"Mud Brick Wall","5453193":"Mud Brick Wall","5453194":"Mud Brick Wall","5453200":"Mud Brick Wall","5453201":"Mud Brick Wall","5453202":"Mud Brick Wall","5453204":"Mud Brick Wall","5453205":"Mud Brick Wall","5453206":"Mud Brick Wall","5453208":"Mud Brick Wall","5453209":"Mud Brick Wall","5453210":"Mud Brick Wall","5453216":"Mud Brick Wall","5453217":"Mud Brick Wall","5453218":"Mud Brick Wall","5453220":"Mud Brick Wall","5453221":"Mud Brick Wall","5453222":"Mud Brick Wall","5453224":"Mud Brick Wall","5453225":"Mud Brick Wall","5453226":"Mud Brick Wall","5160448":"Coal Ore","5449728":"Copper Ore","5182976":"Diamond Ore","5250048":"Emerald Ore","5261824":"Gold Ore","5276672":"Iron Ore","5288448":"Lapis Lazuli Ore","5347840":"Redstone Ore","5347841":"Redstone Ore","5445632":"Deepslate Coal Ore","5449216":"Deepslate Copper Ore","5446144":"Deepslate Diamond Ore","5446656":"Deepslate Emerald Ore","5448704":"Deepslate Gold Ore","5448192":"Deepslate Iron Ore","5447168":"Deepslate Lapis Lazuli Ore","5447680":"Deepslate Redstone Ore","5447681":"Deepslate Redstone Ore","5307392":"Nether Quartz Ore","5450240":"Nether Gold Ore"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall","5444608":"Tinted Glass","5451264":"Mud Bricks","5451776":"Mud Brick Slab","5451777":"Mud Brick Slab","5451778":"Mud Brick Slab","5452288":"Mud Brick Stairs","5452289":"Mud Brick Stairs","5452290":"Mud Brick Stairs","5452291":"Mud Brick Stairs","5452292":"Mud Brick Stairs","5452293":"Mud Brick Stairs","5452294":"Mud Brick Stairs","5452295":"Mud Brick Stairs","5452800":"Mud Brick Wall","5452801":"Mud Brick Wall","5452802":"Mud Brick Wall","5452804":"Mud Brick Wall","5452805":"Mud Brick Wall","5452806":"Mud Brick Wall","5452808":"Mud Brick Wall","5452809":"Mud Brick Wall","5452810":"Mud Brick Wall","5452816":"Mud Brick Wall","5452817":"Mud Brick Wall","5452818":"Mud Brick Wall","5452820":"Mud Brick Wall","5452821":"Mud Brick Wall","5452822":"Mud Brick Wall","5452824":"Mud Brick Wall","5452825":"Mud Brick Wall","5452826":"Mud Brick Wall","5452832":"Mud Brick Wall","5452833":"Mud Brick Wall","5452834":"Mud Brick Wall","5452836":"Mud Brick Wall","5452837":"Mud Brick Wall","5452838":"Mud Brick Wall","5452840":"Mud Brick Wall","5452841":"Mud Brick Wall","5452842":"Mud Brick Wall","5452864":"Mud Brick Wall","5452865":"Mud Brick Wall","5452866":"Mud Brick Wall","5452868":"Mud Brick Wall","5452869":"Mud Brick Wall","5452870":"Mud Brick Wall","5452872":"Mud Brick Wall","5452873":"Mud Brick Wall","5452874":"Mud Brick Wall","5452880":"Mud Brick Wall","5452881":"Mud Brick Wall","5452882":"Mud Brick Wall","5452884":"Mud Brick Wall","5452885":"Mud Brick Wall","5452886":"Mud Brick Wall","5452888":"Mud Brick Wall","5452889":"Mud Brick Wall","5452890":"Mud Brick Wall","5452896":"Mud Brick Wall","5452897":"Mud Brick Wall","5452898":"Mud Brick Wall","5452900":"Mud Brick Wall","5452901":"Mud Brick Wall","5452902":"Mud Brick Wall","5452904":"Mud Brick Wall","5452905":"Mud Brick Wall","5452906":"Mud Brick Wall","5452928":"Mud Brick Wall","5452929":"Mud Brick Wall","5452930":"Mud Brick Wall","5452932":"Mud Brick Wall","5452933":"Mud Brick Wall","5452934":"Mud Brick Wall","5452936":"Mud Brick Wall","5452937":"Mud Brick Wall","5452938":"Mud Brick Wall","5452944":"Mud Brick Wall","5452945":"Mud Brick Wall","5452946":"Mud Brick Wall","5452948":"Mud Brick Wall","5452949":"Mud Brick Wall","5452950":"Mud Brick Wall","5452952":"Mud Brick Wall","5452953":"Mud Brick Wall","5452954":"Mud Brick Wall","5452960":"Mud Brick Wall","5452961":"Mud Brick Wall","5452962":"Mud Brick Wall","5452964":"Mud Brick Wall","5452965":"Mud Brick Wall","5452966":"Mud Brick Wall","5452968":"Mud Brick Wall","5452969":"Mud Brick Wall","5452970":"Mud Brick Wall","5453056":"Mud Brick Wall","5453057":"Mud Brick Wall","5453058":"Mud Brick Wall","5453060":"Mud Brick Wall","5453061":"Mud Brick Wall","5453062":"Mud Brick Wall","5453064":"Mud Brick Wall","5453065":"Mud Brick Wall","5453066":"Mud Brick Wall","5453072":"Mud Brick Wall","5453073":"Mud Brick Wall","5453074":"Mud Brick Wall","5453076":"Mud Brick Wall","5453077":"Mud Brick Wall","5453078":"Mud Brick Wall","5453080":"Mud Brick Wall","5453081":"Mud Brick Wall","5453082":"Mud Brick Wall","5453088":"Mud Brick Wall","5453089":"Mud Brick Wall","5453090":"Mud Brick Wall","5453092":"Mud Brick Wall","5453093":"Mud Brick Wall","5453094":"Mud Brick Wall","5453096":"Mud Brick Wall","5453097":"Mud Brick Wall","5453098":"Mud Brick Wall","5453120":"Mud Brick Wall","5453121":"Mud Brick Wall","5453122":"Mud Brick Wall","5453124":"Mud Brick Wall","5453125":"Mud Brick Wall","5453126":"Mud Brick Wall","5453128":"Mud Brick Wall","5453129":"Mud Brick Wall","5453130":"Mud Brick Wall","5453136":"Mud Brick Wall","5453137":"Mud Brick Wall","5453138":"Mud Brick Wall","5453140":"Mud Brick Wall","5453141":"Mud Brick Wall","5453142":"Mud Brick Wall","5453144":"Mud Brick Wall","5453145":"Mud Brick Wall","5453146":"Mud Brick Wall","5453152":"Mud Brick Wall","5453153":"Mud Brick Wall","5453154":"Mud Brick Wall","5453156":"Mud Brick Wall","5453157":"Mud Brick Wall","5453158":"Mud Brick Wall","5453160":"Mud Brick Wall","5453161":"Mud Brick Wall","5453162":"Mud Brick Wall","5453184":"Mud Brick Wall","5453185":"Mud Brick Wall","5453186":"Mud Brick Wall","5453188":"Mud Brick Wall","5453189":"Mud Brick Wall","5453190":"Mud Brick Wall","5453192":"Mud Brick Wall","5453193":"Mud Brick Wall","5453194":"Mud Brick Wall","5453200":"Mud Brick Wall","5453201":"Mud Brick Wall","5453202":"Mud Brick Wall","5453204":"Mud Brick Wall","5453205":"Mud Brick Wall","5453206":"Mud Brick Wall","5453208":"Mud Brick Wall","5453209":"Mud Brick Wall","5453210":"Mud Brick Wall","5453216":"Mud Brick Wall","5453217":"Mud Brick Wall","5453218":"Mud Brick Wall","5453220":"Mud Brick Wall","5453221":"Mud Brick Wall","5453222":"Mud Brick Wall","5453224":"Mud Brick Wall","5453225":"Mud Brick Wall","5453226":"Mud Brick Wall","5160448":"Coal Ore","5449728":"Copper Ore","5182976":"Diamond Ore","5250048":"Emerald Ore","5261824":"Gold Ore","5276672":"Iron Ore","5288448":"Lapis Lazuli Ore","5347840":"Redstone Ore","5347841":"Redstone Ore","5445632":"Deepslate Coal Ore","5449216":"Deepslate Copper Ore","5446144":"Deepslate Diamond Ore","5446656":"Deepslate Emerald Ore","5448704":"Deepslate Gold Ore","5448192":"Deepslate Iron Ore","5447168":"Deepslate Lapis Lazuli Ore","5447680":"Deepslate Redstone Ore","5447681":"Deepslate Redstone Ore","5307392":"Nether Quartz Ore","5450240":"Nether Gold Ore"},"stateDataBits":9} \ No newline at end of file From 8886a023f11b91eea46f3ae1812638c488b012c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 23:20:13 +0100 Subject: [PATCH 0299/1858] Reduce the size of block_factory_consistency_check.json by improving the storage format this reduces the size by 65%, but more importantly, doesn't cause several pages of flooding in git diff. --- .../block_factory_consistency_check.json | 2 +- .../block/regenerate_consistency_check.php | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index a00dd5d5da..258594e7ce 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"5128192":"Activator Rail","5128193":"Activator Rail","5128194":"Activator Rail","5128195":"Activator Rail","5128196":"Activator Rail","5128197":"Activator Rail","5128200":"Activator Rail","5128201":"Activator Rail","5128202":"Activator Rail","5128203":"Activator Rail","5128204":"Activator Rail","5128205":"Activator Rail","5120000":"Air","5131776":"Anvil","5131777":"Anvil","5131778":"Anvil","5131780":"Anvil","5131781":"Anvil","5131782":"Anvil","5131784":"Anvil","5131785":"Anvil","5131786":"Anvil","5131788":"Anvil","5131789":"Anvil","5131790":"Anvil","5132800":"Bamboo","5132801":"Bamboo","5132802":"Bamboo","5132804":"Bamboo","5132805":"Bamboo","5132806":"Bamboo","5132808":"Bamboo","5132809":"Bamboo","5132810":"Bamboo","5132812":"Bamboo","5132813":"Bamboo","5132814":"Bamboo","5133312":"Bamboo Sapling","5133313":"Bamboo Sapling","5133824":"Banner","5133825":"Banner","5133826":"Banner","5133827":"Banner","5133828":"Banner","5133829":"Banner","5133830":"Banner","5133831":"Banner","5133832":"Banner","5133833":"Banner","5133834":"Banner","5133835":"Banner","5133836":"Banner","5133837":"Banner","5133838":"Banner","5133839":"Banner","5133840":"Banner","5133841":"Banner","5133842":"Banner","5133843":"Banner","5133844":"Banner","5133845":"Banner","5133846":"Banner","5133847":"Banner","5133848":"Banner","5133849":"Banner","5133850":"Banner","5133851":"Banner","5133852":"Banner","5133853":"Banner","5133854":"Banner","5133855":"Banner","5133856":"Banner","5133857":"Banner","5133858":"Banner","5133859":"Banner","5133860":"Banner","5133861":"Banner","5133862":"Banner","5133863":"Banner","5133864":"Banner","5133865":"Banner","5133866":"Banner","5133867":"Banner","5133868":"Banner","5133869":"Banner","5133870":"Banner","5133871":"Banner","5133872":"Banner","5133873":"Banner","5133874":"Banner","5133875":"Banner","5133876":"Banner","5133877":"Banner","5133878":"Banner","5133879":"Banner","5133880":"Banner","5133881":"Banner","5133882":"Banner","5133883":"Banner","5133884":"Banner","5133885":"Banner","5133886":"Banner","5133887":"Banner","5133888":"Banner","5133889":"Banner","5133890":"Banner","5133891":"Banner","5133892":"Banner","5133893":"Banner","5133894":"Banner","5133895":"Banner","5133896":"Banner","5133897":"Banner","5133898":"Banner","5133899":"Banner","5133900":"Banner","5133901":"Banner","5133902":"Banner","5133903":"Banner","5133904":"Banner","5133905":"Banner","5133906":"Banner","5133907":"Banner","5133908":"Banner","5133909":"Banner","5133910":"Banner","5133911":"Banner","5133912":"Banner","5133913":"Banner","5133914":"Banner","5133915":"Banner","5133916":"Banner","5133917":"Banner","5133918":"Banner","5133919":"Banner","5133920":"Banner","5133921":"Banner","5133922":"Banner","5133923":"Banner","5133924":"Banner","5133925":"Banner","5133926":"Banner","5133927":"Banner","5133928":"Banner","5133929":"Banner","5133930":"Banner","5133931":"Banner","5133932":"Banner","5133933":"Banner","5133934":"Banner","5133935":"Banner","5133936":"Banner","5133937":"Banner","5133938":"Banner","5133939":"Banner","5133940":"Banner","5133941":"Banner","5133942":"Banner","5133943":"Banner","5133944":"Banner","5133945":"Banner","5133946":"Banner","5133947":"Banner","5133948":"Banner","5133949":"Banner","5133950":"Banner","5133951":"Banner","5133952":"Banner","5133953":"Banner","5133954":"Banner","5133955":"Banner","5133956":"Banner","5133957":"Banner","5133958":"Banner","5133959":"Banner","5133960":"Banner","5133961":"Banner","5133962":"Banner","5133963":"Banner","5133964":"Banner","5133965":"Banner","5133966":"Banner","5133967":"Banner","5133968":"Banner","5133969":"Banner","5133970":"Banner","5133971":"Banner","5133972":"Banner","5133973":"Banner","5133974":"Banner","5133975":"Banner","5133976":"Banner","5133977":"Banner","5133978":"Banner","5133979":"Banner","5133980":"Banner","5133981":"Banner","5133982":"Banner","5133983":"Banner","5133984":"Banner","5133985":"Banner","5133986":"Banner","5133987":"Banner","5133988":"Banner","5133989":"Banner","5133990":"Banner","5133991":"Banner","5133992":"Banner","5133993":"Banner","5133994":"Banner","5133995":"Banner","5133996":"Banner","5133997":"Banner","5133998":"Banner","5133999":"Banner","5134000":"Banner","5134001":"Banner","5134002":"Banner","5134003":"Banner","5134004":"Banner","5134005":"Banner","5134006":"Banner","5134007":"Banner","5134008":"Banner","5134009":"Banner","5134010":"Banner","5134011":"Banner","5134012":"Banner","5134013":"Banner","5134014":"Banner","5134015":"Banner","5134016":"Banner","5134017":"Banner","5134018":"Banner","5134019":"Banner","5134020":"Banner","5134021":"Banner","5134022":"Banner","5134023":"Banner","5134024":"Banner","5134025":"Banner","5134026":"Banner","5134027":"Banner","5134028":"Banner","5134029":"Banner","5134030":"Banner","5134031":"Banner","5134032":"Banner","5134033":"Banner","5134034":"Banner","5134035":"Banner","5134036":"Banner","5134037":"Banner","5134038":"Banner","5134039":"Banner","5134040":"Banner","5134041":"Banner","5134042":"Banner","5134043":"Banner","5134044":"Banner","5134045":"Banner","5134046":"Banner","5134047":"Banner","5134048":"Banner","5134049":"Banner","5134050":"Banner","5134051":"Banner","5134052":"Banner","5134053":"Banner","5134054":"Banner","5134055":"Banner","5134056":"Banner","5134057":"Banner","5134058":"Banner","5134059":"Banner","5134060":"Banner","5134061":"Banner","5134062":"Banner","5134063":"Banner","5134064":"Banner","5134065":"Banner","5134066":"Banner","5134067":"Banner","5134068":"Banner","5134069":"Banner","5134070":"Banner","5134071":"Banner","5134072":"Banner","5134073":"Banner","5134074":"Banner","5134075":"Banner","5134076":"Banner","5134077":"Banner","5134078":"Banner","5134079":"Banner","5390848":"Wall Banner","5390849":"Wall Banner","5390850":"Wall Banner","5390851":"Wall Banner","5390852":"Wall Banner","5390853":"Wall Banner","5390854":"Wall Banner","5390855":"Wall Banner","5390856":"Wall Banner","5390857":"Wall Banner","5390858":"Wall Banner","5390859":"Wall Banner","5390860":"Wall Banner","5390861":"Wall Banner","5390862":"Wall Banner","5390863":"Wall Banner","5390864":"Wall Banner","5390865":"Wall Banner","5390866":"Wall Banner","5390867":"Wall Banner","5390868":"Wall Banner","5390869":"Wall Banner","5390870":"Wall Banner","5390871":"Wall Banner","5390872":"Wall Banner","5390873":"Wall Banner","5390874":"Wall Banner","5390875":"Wall Banner","5390876":"Wall Banner","5390877":"Wall Banner","5390878":"Wall Banner","5390879":"Wall Banner","5390880":"Wall Banner","5390881":"Wall Banner","5390882":"Wall Banner","5390883":"Wall Banner","5390884":"Wall Banner","5390885":"Wall Banner","5390886":"Wall Banner","5390887":"Wall Banner","5390888":"Wall Banner","5390889":"Wall Banner","5390890":"Wall Banner","5390891":"Wall Banner","5390892":"Wall Banner","5390893":"Wall Banner","5390894":"Wall Banner","5390895":"Wall Banner","5390896":"Wall Banner","5390897":"Wall Banner","5390898":"Wall Banner","5390899":"Wall Banner","5390900":"Wall Banner","5390901":"Wall Banner","5390902":"Wall Banner","5390903":"Wall Banner","5390904":"Wall Banner","5390905":"Wall Banner","5390906":"Wall Banner","5390907":"Wall Banner","5390908":"Wall Banner","5390909":"Wall Banner","5390910":"Wall Banner","5390911":"Wall Banner","5134336":"Barrel","5134337":"Barrel","5134338":"Barrel","5134339":"Barrel","5134340":"Barrel","5134341":"Barrel","5134344":"Barrel","5134345":"Barrel","5134346":"Barrel","5134347":"Barrel","5134348":"Barrel","5134349":"Barrel","5134848":"Barrier","5135360":"Beacon","5135872":"Bed Block","5135873":"Bed Block","5135874":"Bed Block","5135875":"Bed Block","5135876":"Bed Block","5135877":"Bed Block","5135878":"Bed Block","5135879":"Bed Block","5135880":"Bed Block","5135881":"Bed Block","5135882":"Bed Block","5135883":"Bed Block","5135884":"Bed Block","5135885":"Bed Block","5135886":"Bed Block","5135887":"Bed Block","5135888":"Bed Block","5135889":"Bed Block","5135890":"Bed Block","5135891":"Bed Block","5135892":"Bed Block","5135893":"Bed Block","5135894":"Bed Block","5135895":"Bed Block","5135896":"Bed Block","5135897":"Bed Block","5135898":"Bed Block","5135899":"Bed Block","5135900":"Bed Block","5135901":"Bed Block","5135902":"Bed Block","5135903":"Bed Block","5135904":"Bed Block","5135905":"Bed Block","5135906":"Bed Block","5135907":"Bed Block","5135908":"Bed Block","5135909":"Bed Block","5135910":"Bed Block","5135911":"Bed Block","5135912":"Bed Block","5135913":"Bed Block","5135914":"Bed Block","5135915":"Bed Block","5135916":"Bed Block","5135917":"Bed Block","5135918":"Bed Block","5135919":"Bed Block","5135920":"Bed Block","5135921":"Bed Block","5135922":"Bed Block","5135923":"Bed Block","5135924":"Bed Block","5135925":"Bed Block","5135926":"Bed Block","5135927":"Bed Block","5135928":"Bed Block","5135929":"Bed Block","5135930":"Bed Block","5135931":"Bed Block","5135932":"Bed Block","5135933":"Bed Block","5135934":"Bed Block","5135935":"Bed Block","5135936":"Bed Block","5135937":"Bed Block","5135938":"Bed Block","5135939":"Bed Block","5135940":"Bed Block","5135941":"Bed Block","5135942":"Bed Block","5135943":"Bed Block","5135944":"Bed Block","5135945":"Bed Block","5135946":"Bed Block","5135947":"Bed Block","5135948":"Bed Block","5135949":"Bed Block","5135950":"Bed Block","5135951":"Bed Block","5135952":"Bed Block","5135953":"Bed Block","5135954":"Bed Block","5135955":"Bed Block","5135956":"Bed Block","5135957":"Bed Block","5135958":"Bed Block","5135959":"Bed Block","5135960":"Bed Block","5135961":"Bed Block","5135962":"Bed Block","5135963":"Bed Block","5135964":"Bed Block","5135965":"Bed Block","5135966":"Bed Block","5135967":"Bed Block","5135968":"Bed Block","5135969":"Bed Block","5135970":"Bed Block","5135971":"Bed Block","5135972":"Bed Block","5135973":"Bed Block","5135974":"Bed Block","5135975":"Bed Block","5135976":"Bed Block","5135977":"Bed Block","5135978":"Bed Block","5135979":"Bed Block","5135980":"Bed Block","5135981":"Bed Block","5135982":"Bed Block","5135983":"Bed Block","5135984":"Bed Block","5135985":"Bed Block","5135986":"Bed Block","5135987":"Bed Block","5135988":"Bed Block","5135989":"Bed Block","5135990":"Bed Block","5135991":"Bed Block","5135992":"Bed Block","5135993":"Bed Block","5135994":"Bed Block","5135995":"Bed Block","5135996":"Bed Block","5135997":"Bed Block","5135998":"Bed Block","5135999":"Bed Block","5136000":"Bed Block","5136001":"Bed Block","5136002":"Bed Block","5136003":"Bed Block","5136004":"Bed Block","5136005":"Bed Block","5136006":"Bed Block","5136007":"Bed Block","5136008":"Bed Block","5136009":"Bed Block","5136010":"Bed Block","5136011":"Bed Block","5136012":"Bed Block","5136013":"Bed Block","5136014":"Bed Block","5136015":"Bed Block","5136016":"Bed Block","5136017":"Bed Block","5136018":"Bed Block","5136019":"Bed Block","5136020":"Bed Block","5136021":"Bed Block","5136022":"Bed Block","5136023":"Bed Block","5136024":"Bed Block","5136025":"Bed Block","5136026":"Bed Block","5136027":"Bed Block","5136028":"Bed Block","5136029":"Bed Block","5136030":"Bed Block","5136031":"Bed Block","5136032":"Bed Block","5136033":"Bed Block","5136034":"Bed Block","5136035":"Bed Block","5136036":"Bed Block","5136037":"Bed Block","5136038":"Bed Block","5136039":"Bed Block","5136040":"Bed Block","5136041":"Bed Block","5136042":"Bed Block","5136043":"Bed Block","5136044":"Bed Block","5136045":"Bed Block","5136046":"Bed Block","5136047":"Bed Block","5136048":"Bed Block","5136049":"Bed Block","5136050":"Bed Block","5136051":"Bed Block","5136052":"Bed Block","5136053":"Bed Block","5136054":"Bed Block","5136055":"Bed Block","5136056":"Bed Block","5136057":"Bed Block","5136058":"Bed Block","5136059":"Bed Block","5136060":"Bed Block","5136061":"Bed Block","5136062":"Bed Block","5136063":"Bed Block","5136064":"Bed Block","5136065":"Bed Block","5136066":"Bed Block","5136067":"Bed Block","5136068":"Bed Block","5136069":"Bed Block","5136070":"Bed Block","5136071":"Bed Block","5136072":"Bed Block","5136073":"Bed Block","5136074":"Bed Block","5136075":"Bed Block","5136076":"Bed Block","5136077":"Bed Block","5136078":"Bed Block","5136079":"Bed Block","5136080":"Bed Block","5136081":"Bed Block","5136082":"Bed Block","5136083":"Bed Block","5136084":"Bed Block","5136085":"Bed Block","5136086":"Bed Block","5136087":"Bed Block","5136088":"Bed Block","5136089":"Bed Block","5136090":"Bed Block","5136091":"Bed Block","5136092":"Bed Block","5136093":"Bed Block","5136094":"Bed Block","5136095":"Bed Block","5136096":"Bed Block","5136097":"Bed Block","5136098":"Bed Block","5136099":"Bed Block","5136100":"Bed Block","5136101":"Bed Block","5136102":"Bed Block","5136103":"Bed Block","5136104":"Bed Block","5136105":"Bed Block","5136106":"Bed Block","5136107":"Bed Block","5136108":"Bed Block","5136109":"Bed Block","5136110":"Bed Block","5136111":"Bed Block","5136112":"Bed Block","5136113":"Bed Block","5136114":"Bed Block","5136115":"Bed Block","5136116":"Bed Block","5136117":"Bed Block","5136118":"Bed Block","5136119":"Bed Block","5136120":"Bed Block","5136121":"Bed Block","5136122":"Bed Block","5136123":"Bed Block","5136124":"Bed Block","5136125":"Bed Block","5136126":"Bed Block","5136127":"Bed Block","5136384":"Bedrock","5136385":"Bedrock","5136896":"Beetroot Block","5136897":"Beetroot Block","5136898":"Beetroot Block","5136899":"Beetroot Block","5136900":"Beetroot Block","5136901":"Beetroot Block","5136902":"Beetroot Block","5136903":"Beetroot Block","5137408":"Bell","5137409":"Bell","5137410":"Bell","5137411":"Bell","5137412":"Bell","5137413":"Bell","5137414":"Bell","5137415":"Bell","5137416":"Bell","5137417":"Bell","5137418":"Bell","5137419":"Bell","5137420":"Bell","5137421":"Bell","5137422":"Bell","5137423":"Bell","5147136":"Blue Ice","5148672":"Bone Block","5148673":"Bone Block","5148674":"Bone Block","5149184":"Bookshelf","5149696":"Brewing Stand","5149697":"Brewing Stand","5149698":"Brewing Stand","5149699":"Brewing Stand","5149700":"Brewing Stand","5149701":"Brewing Stand","5149702":"Brewing Stand","5149703":"Brewing Stand","5150720":"Brick Stairs","5150721":"Brick Stairs","5150722":"Brick Stairs","5150723":"Brick Stairs","5150724":"Brick Stairs","5150725":"Brick Stairs","5150726":"Brick Stairs","5150727":"Brick Stairs","5151744":"Bricks","5152768":"Brown Mushroom","5153792":"Cactus","5153793":"Cactus","5153794":"Cactus","5153795":"Cactus","5153796":"Cactus","5153797":"Cactus","5153798":"Cactus","5153799":"Cactus","5153800":"Cactus","5153801":"Cactus","5153802":"Cactus","5153803":"Cactus","5153804":"Cactus","5153805":"Cactus","5153806":"Cactus","5153807":"Cactus","5154304":"Cake","5154305":"Cake","5154306":"Cake","5154307":"Cake","5154308":"Cake","5154309":"Cake","5154310":"Cake","5155328":"Carrot Block","5155329":"Carrot Block","5155330":"Carrot Block","5155331":"Carrot Block","5155332":"Carrot Block","5155333":"Carrot Block","5155334":"Carrot Block","5155335":"Carrot Block","5156864":"Chest","5156865":"Chest","5156866":"Chest","5156867":"Chest","5159424":"Clay Block","5159936":"Coal Block","5160960":"Cobblestone","5299200":"Mossy Cobblestone","5161984":"Cobblestone Stairs","5161985":"Cobblestone Stairs","5161986":"Cobblestone Stairs","5161987":"Cobblestone Stairs","5161988":"Cobblestone Stairs","5161989":"Cobblestone Stairs","5161990":"Cobblestone Stairs","5161991":"Cobblestone Stairs","5300224":"Mossy Cobblestone Stairs","5300225":"Mossy Cobblestone Stairs","5300226":"Mossy Cobblestone Stairs","5300227":"Mossy Cobblestone Stairs","5300228":"Mossy Cobblestone Stairs","5300229":"Mossy Cobblestone Stairs","5300230":"Mossy Cobblestone Stairs","5300231":"Mossy Cobblestone Stairs","5163008":"Cobweb","5163520":"Cocoa Block","5163521":"Cocoa Block","5163522":"Cocoa Block","5163523":"Cocoa Block","5163524":"Cocoa Block","5163525":"Cocoa Block","5163526":"Cocoa Block","5163527":"Cocoa Block","5163528":"Cocoa Block","5163529":"Cocoa Block","5163530":"Cocoa Block","5163531":"Cocoa Block","5166080":"Coral Block","5166081":"Coral Block","5166082":"Coral Block","5166083":"Coral Block","5166084":"Coral Block","5166088":"Coral Block","5166089":"Coral Block","5166090":"Coral Block","5166091":"Coral Block","5166092":"Coral Block","5168128":"Crafting Table","5180928":"Daylight Sensor","5180929":"Daylight Sensor","5180930":"Daylight Sensor","5180931":"Daylight Sensor","5180932":"Daylight Sensor","5180933":"Daylight Sensor","5180934":"Daylight Sensor","5180935":"Daylight Sensor","5180936":"Daylight Sensor","5180937":"Daylight Sensor","5180938":"Daylight Sensor","5180939":"Daylight Sensor","5180940":"Daylight Sensor","5180941":"Daylight Sensor","5180942":"Daylight Sensor","5180943":"Daylight Sensor","5180944":"Daylight Sensor","5180945":"Daylight Sensor","5180946":"Daylight Sensor","5180947":"Daylight Sensor","5180948":"Daylight Sensor","5180949":"Daylight Sensor","5180950":"Daylight Sensor","5180951":"Daylight Sensor","5180952":"Daylight Sensor","5180953":"Daylight Sensor","5180954":"Daylight Sensor","5180955":"Daylight Sensor","5180956":"Daylight Sensor","5180957":"Daylight Sensor","5180958":"Daylight Sensor","5180959":"Daylight Sensor","5181440":"Dead Bush","5181952":"Detector Rail","5181953":"Detector Rail","5181954":"Detector Rail","5181955":"Detector Rail","5181956":"Detector Rail","5181957":"Detector Rail","5181960":"Detector Rail","5181961":"Detector Rail","5181962":"Detector Rail","5181963":"Detector Rail","5181964":"Detector Rail","5181965":"Detector Rail","5182464":"Diamond Block","5185536":"Dirt","5185537":"Dirt","5385728":"Sunflower","5385729":"Sunflower","5292544":"Lilac","5292545":"Lilac","5350400":"Rose Bush","5350401":"Rose Bush","5320704":"Peony","5320705":"Peony","5186048":"Double Tallgrass","5186049":"Double Tallgrass","5288960":"Large Fern","5288961":"Large Fern","5186560":"Dragon Egg","5187072":"Dried Kelp Block","5249536":"Emerald Block","5250560":"Enchanting Table","5251072":"End Portal Frame","5251073":"End Portal Frame","5251074":"End Portal Frame","5251075":"End Portal Frame","5251076":"End Portal Frame","5251077":"End Portal Frame","5251078":"End Portal Frame","5251079":"End Portal Frame","5251584":"End Rod","5251585":"End Rod","5251586":"End Rod","5251587":"End Rod","5251588":"End Rod","5251589":"End Rod","5252096":"End Stone","5254144":"End Stone Bricks","5253120":"End Stone Brick Stairs","5253121":"End Stone Brick Stairs","5253122":"End Stone Brick Stairs","5253123":"End Stone Brick Stairs","5253124":"End Stone Brick Stairs","5253125":"End Stone Brick Stairs","5253126":"End Stone Brick Stairs","5253127":"End Stone Brick Stairs","5254656":"Ender Chest","5254657":"Ender Chest","5254658":"Ender Chest","5254659":"Ender Chest","5255680":"Farmland","5255681":"Farmland","5255682":"Farmland","5255683":"Farmland","5255684":"Farmland","5255685":"Farmland","5255686":"Farmland","5255687":"Farmland","5256704":"Fire Block","5256705":"Fire Block","5256706":"Fire Block","5256707":"Fire Block","5256708":"Fire Block","5256709":"Fire Block","5256710":"Fire Block","5256711":"Fire Block","5256712":"Fire Block","5256713":"Fire Block","5256714":"Fire Block","5256715":"Fire Block","5256716":"Fire Block","5256717":"Fire Block","5256718":"Fire Block","5256719":"Fire Block","5257216":"Fletching Table","5171200":"Dandelion","5327360":"Poppy","5129216":"Allium","5132288":"Azure Bluet","5147648":"Blue Orchid","5167104":"Cornflower","5293056":"Lily of the Valley","5319168":"Orange Tulip","5319680":"Oxeye Daisy","5321728":"Pink Tulip","5345792":"Red Tulip","5394432":"White Tulip","5257728":"Flower Pot","5258240":"Frosted Ice","5258241":"Frosted Ice","5258242":"Frosted Ice","5258243":"Frosted Ice","5258752":"Furnace","5258753":"Furnace","5258754":"Furnace","5258755":"Furnace","5258756":"Furnace","5258757":"Furnace","5258758":"Furnace","5258759":"Furnace","5146112":"Blast Furnace","5146113":"Blast Furnace","5146114":"Blast Furnace","5146115":"Blast Furnace","5146116":"Blast Furnace","5146117":"Blast Furnace","5146118":"Blast Furnace","5146119":"Blast Furnace","5355520":"Smoker","5355521":"Smoker","5355522":"Smoker","5355523":"Smoker","5355524":"Smoker","5355525":"Smoker","5355526":"Smoker","5355527":"Smoker","5259264":"Glass","5259776":"Glass Pane","5260288":"Glowing Obsidian","5260800":"Glowstone","5261312":"Gold Block","5264384":"Grass","5264896":"Grass Path","5265408":"Gravel","5267456":"Hardened Clay","5267968":"Hardened Glass","5268480":"Hardened Glass Pane","5268992":"Hay Bale","5268993":"Hay Bale","5268994":"Hay Bale","5269504":"Hopper","5269506":"Hopper","5269507":"Hopper","5269508":"Hopper","5269509":"Hopper","5269512":"Hopper","5269514":"Hopper","5269515":"Hopper","5269516":"Hopper","5269517":"Hopper","5270016":"Ice","5273600":"update!","5274112":"ate!upd","5274624":"Invisible Bedrock","5275136":"Iron Block","5275648":"Iron Bars","5276160":"Iron Door","5276161":"Iron Door","5276162":"Iron Door","5276163":"Iron Door","5276164":"Iron Door","5276165":"Iron Door","5276166":"Iron Door","5276167":"Iron Door","5276168":"Iron Door","5276169":"Iron Door","5276170":"Iron Door","5276171":"Iron Door","5276172":"Iron Door","5276173":"Iron Door","5276174":"Iron Door","5276175":"Iron Door","5276176":"Iron Door","5276177":"Iron Door","5276178":"Iron Door","5276179":"Iron Door","5276180":"Iron Door","5276181":"Iron Door","5276182":"Iron Door","5276183":"Iron Door","5276184":"Iron Door","5276185":"Iron Door","5276186":"Iron Door","5276187":"Iron Door","5276188":"Iron Door","5276189":"Iron Door","5276190":"Iron Door","5276191":"Iron Door","5277184":"Iron Trapdoor","5277185":"Iron Trapdoor","5277186":"Iron Trapdoor","5277187":"Iron Trapdoor","5277188":"Iron Trapdoor","5277189":"Iron Trapdoor","5277190":"Iron Trapdoor","5277191":"Iron Trapdoor","5277192":"Iron Trapdoor","5277193":"Iron Trapdoor","5277194":"Iron Trapdoor","5277195":"Iron Trapdoor","5277196":"Iron Trapdoor","5277197":"Iron Trapdoor","5277198":"Iron Trapdoor","5277199":"Iron Trapdoor","5277696":"Item Frame","5277697":"Item Frame","5277698":"Item Frame","5277699":"Item Frame","5277700":"Item Frame","5277701":"Item Frame","5277704":"Item Frame","5277705":"Item Frame","5277706":"Item Frame","5277707":"Item Frame","5277708":"Item Frame","5277709":"Item Frame","5278208":"Jukebox","5286912":"Ladder","5286913":"Ladder","5286914":"Ladder","5286915":"Ladder","5287424":"Lantern","5287425":"Lantern","5422592":"Soul Lantern","5422593":"Soul Lantern","5287936":"Lapis Lazuli Block","5289472":"Lava","5289473":"Lava","5289474":"Lava","5289475":"Lava","5289476":"Lava","5289477":"Lava","5289478":"Lava","5289479":"Lava","5289480":"Lava","5289481":"Lava","5289482":"Lava","5289483":"Lava","5289484":"Lava","5289485":"Lava","5289486":"Lava","5289487":"Lava","5289488":"Lava","5289489":"Lava","5289490":"Lava","5289491":"Lava","5289492":"Lava","5289493":"Lava","5289494":"Lava","5289495":"Lava","5289496":"Lava","5289497":"Lava","5289498":"Lava","5289499":"Lava","5289500":"Lava","5289501":"Lava","5289502":"Lava","5289503":"Lava","5289984":"Lectern","5289985":"Lectern","5289986":"Lectern","5289987":"Lectern","5289988":"Lectern","5289989":"Lectern","5289990":"Lectern","5289991":"Lectern","5291008":"Lever","5291009":"Lever","5291010":"Lever","5291011":"Lever","5291012":"Lever","5291013":"Lever","5291014":"Lever","5291015":"Lever","5291016":"Lever","5291017":"Lever","5291018":"Lever","5291019":"Lever","5291020":"Lever","5291021":"Lever","5291022":"Lever","5291023":"Lever","5295104":"Loom","5295105":"Loom","5295106":"Loom","5295107":"Loom","5296128":"Magma Block","5297152":"Melon Block","5297664":"Melon Stem","5297665":"Melon Stem","5297666":"Melon Stem","5297667":"Melon Stem","5297668":"Melon Stem","5297669":"Melon Stem","5297670":"Melon Stem","5297671":"Melon Stem","5298688":"Monster Spawner","5303808":"Mycelium","5306368":"Nether Bricks","5342208":"Red Nether Bricks","5304320":"Nether Brick Fence","5305344":"Nether Brick Stairs","5305345":"Nether Brick Stairs","5305346":"Nether Brick Stairs","5305347":"Nether Brick Stairs","5305348":"Nether Brick Stairs","5305349":"Nether Brick Stairs","5305350":"Nether Brick Stairs","5305351":"Nether Brick Stairs","5341184":"Red Nether Brick Stairs","5341185":"Red Nether Brick Stairs","5341186":"Red Nether Brick Stairs","5341187":"Red Nether Brick Stairs","5341188":"Red Nether Brick Stairs","5341189":"Red Nether Brick Stairs","5341190":"Red Nether Brick Stairs","5341191":"Red Nether Brick Stairs","5420544":"Chiseled Nether Bricks","5421056":"Cracked Nether Bricks","5306880":"Nether Portal","5306881":"Nether Portal","5307904":"Nether Reactor Core","5308928":"Nether Wart Block","5308416":"Nether Wart","5308417":"Nether Wart","5308418":"Nether Wart","5308419":"Nether Wart","5309440":"Netherrack","5309952":"Note Block","5318144":"Obsidian","5320192":"Packed Ice","5322240":"Podzol","5327872":"Potato Block","5327873":"Potato Block","5327874":"Potato Block","5327875":"Potato Block","5327876":"Potato Block","5327877":"Potato Block","5327878":"Potato Block","5327879":"Potato Block","5328384":"Powered Rail","5328385":"Powered Rail","5328386":"Powered Rail","5328387":"Powered Rail","5328388":"Powered Rail","5328389":"Powered Rail","5328392":"Powered Rail","5328393":"Powered Rail","5328394":"Powered Rail","5328395":"Powered Rail","5328396":"Powered Rail","5328397":"Powered Rail","5328896":"Prismarine","5179392":"Dark Prismarine","5329408":"Prismarine Bricks","5330432":"Prismarine Bricks Stairs","5330433":"Prismarine Bricks Stairs","5330434":"Prismarine Bricks Stairs","5330435":"Prismarine Bricks Stairs","5330436":"Prismarine Bricks Stairs","5330437":"Prismarine Bricks Stairs","5330438":"Prismarine Bricks Stairs","5330439":"Prismarine Bricks Stairs","5180416":"Dark Prismarine Stairs","5180417":"Dark Prismarine Stairs","5180418":"Dark Prismarine Stairs","5180419":"Dark Prismarine Stairs","5180420":"Dark Prismarine Stairs","5180421":"Dark Prismarine Stairs","5180422":"Dark Prismarine Stairs","5180423":"Dark Prismarine Stairs","5331456":"Prismarine Stairs","5331457":"Prismarine Stairs","5331458":"Prismarine Stairs","5331459":"Prismarine Stairs","5331460":"Prismarine Stairs","5331461":"Prismarine Stairs","5331462":"Prismarine Stairs","5331463":"Prismarine Stairs","5332480":"Pumpkin","5155840":"Carved Pumpkin","5155841":"Carved Pumpkin","5155842":"Carved Pumpkin","5155843":"Carved Pumpkin","5294592":"Jack o'Lantern","5294593":"Jack o'Lantern","5294594":"Jack o'Lantern","5294595":"Jack o'Lantern","5332992":"Pumpkin Stem","5332993":"Pumpkin Stem","5332994":"Pumpkin Stem","5332995":"Pumpkin Stem","5332996":"Pumpkin Stem","5332997":"Pumpkin Stem","5332998":"Pumpkin Stem","5332999":"Pumpkin Stem","5334528":"Purpur Block","5335040":"Purpur Pillar","5335041":"Purpur Pillar","5335042":"Purpur Pillar","5336064":"Purpur Stairs","5336065":"Purpur Stairs","5336066":"Purpur Stairs","5336067":"Purpur Stairs","5336068":"Purpur Stairs","5336069":"Purpur Stairs","5336070":"Purpur Stairs","5336071":"Purpur Stairs","5336576":"Quartz Block","5157376":"Chiseled Quartz Block","5157377":"Chiseled Quartz Block","5157378":"Chiseled Quartz Block","5337088":"Quartz Pillar","5337089":"Quartz Pillar","5337090":"Quartz Pillar","5356032":"Smooth Quartz Block","5419520":"Quartz Bricks","5338112":"Quartz Stairs","5338113":"Quartz Stairs","5338114":"Quartz Stairs","5338115":"Quartz Stairs","5338116":"Quartz Stairs","5338117":"Quartz Stairs","5338118":"Quartz Stairs","5338119":"Quartz Stairs","5357056":"Smooth Quartz Stairs","5357057":"Smooth Quartz Stairs","5357058":"Smooth Quartz Stairs","5357059":"Smooth Quartz Stairs","5357060":"Smooth Quartz Stairs","5357061":"Smooth Quartz Stairs","5357062":"Smooth Quartz Stairs","5357063":"Smooth Quartz Stairs","5338624":"Rail","5338625":"Rail","5338626":"Rail","5338627":"Rail","5338628":"Rail","5338629":"Rail","5338630":"Rail","5338631":"Rail","5338632":"Rail","5338633":"Rail","5339648":"Red Mushroom","5346304":"Redstone Block","5346816":"Redstone Comparator","5346817":"Redstone Comparator","5346818":"Redstone Comparator","5346819":"Redstone Comparator","5346820":"Redstone Comparator","5346821":"Redstone Comparator","5346822":"Redstone Comparator","5346823":"Redstone Comparator","5346824":"Redstone Comparator","5346825":"Redstone Comparator","5346826":"Redstone Comparator","5346827":"Redstone Comparator","5346828":"Redstone Comparator","5346829":"Redstone Comparator","5346830":"Redstone Comparator","5346831":"Redstone Comparator","5347328":"Redstone Lamp","5347329":"Redstone Lamp","5348352":"Redstone Repeater","5348353":"Redstone Repeater","5348354":"Redstone Repeater","5348355":"Redstone Repeater","5348356":"Redstone Repeater","5348357":"Redstone Repeater","5348358":"Redstone Repeater","5348359":"Redstone Repeater","5348360":"Redstone Repeater","5348361":"Redstone Repeater","5348362":"Redstone Repeater","5348363":"Redstone Repeater","5348364":"Redstone Repeater","5348365":"Redstone Repeater","5348366":"Redstone Repeater","5348367":"Redstone Repeater","5348368":"Redstone Repeater","5348369":"Redstone Repeater","5348370":"Redstone Repeater","5348371":"Redstone Repeater","5348372":"Redstone Repeater","5348373":"Redstone Repeater","5348374":"Redstone Repeater","5348375":"Redstone Repeater","5348376":"Redstone Repeater","5348377":"Redstone Repeater","5348378":"Redstone Repeater","5348379":"Redstone Repeater","5348380":"Redstone Repeater","5348381":"Redstone Repeater","5348382":"Redstone Repeater","5348383":"Redstone Repeater","5348865":"Redstone Torch","5348866":"Redstone Torch","5348867":"Redstone Torch","5348868":"Redstone Torch","5348869":"Redstone Torch","5348873":"Redstone Torch","5348874":"Redstone Torch","5348875":"Redstone Torch","5348876":"Redstone Torch","5348877":"Redstone Torch","5349376":"Redstone","5349377":"Redstone","5349378":"Redstone","5349379":"Redstone","5349380":"Redstone","5349381":"Redstone","5349382":"Redstone","5349383":"Redstone","5349384":"Redstone","5349385":"Redstone","5349386":"Redstone","5349387":"Redstone","5349388":"Redstone","5349389":"Redstone","5349390":"Redstone","5349391":"Redstone","5349888":"reserved6","5350912":"Sand","5342720":"Red Sand","5353472":"Sea Lantern","5353984":"Sea Pickle","5353985":"Sea Pickle","5353986":"Sea Pickle","5353987":"Sea Pickle","5353988":"Sea Pickle","5353989":"Sea Pickle","5353990":"Sea Pickle","5353991":"Sea Pickle","5298184":"Mob Head","5298185":"Mob Head","5298186":"Mob Head","5298187":"Mob Head","5298188":"Mob Head","5298189":"Mob Head","5298192":"Mob Head","5298193":"Mob Head","5298194":"Mob Head","5298195":"Mob Head","5298196":"Mob Head","5298197":"Mob Head","5298200":"Mob Head","5298201":"Mob Head","5298202":"Mob Head","5298203":"Mob Head","5298204":"Mob Head","5298205":"Mob Head","5298208":"Mob Head","5298209":"Mob Head","5298210":"Mob Head","5298211":"Mob Head","5298212":"Mob Head","5298213":"Mob Head","5298216":"Mob Head","5298217":"Mob Head","5298218":"Mob Head","5298219":"Mob Head","5298220":"Mob Head","5298221":"Mob Head","5355008":"Slime Block","5361664":"Snow Block","5362176":"Snow Layer","5362177":"Snow Layer","5362178":"Snow Layer","5362179":"Snow Layer","5362180":"Snow Layer","5362181":"Snow Layer","5362182":"Snow Layer","5362183":"Snow Layer","5362688":"Soul Sand","5363200":"Sponge","5363201":"Sponge","5354496":"Shulker Box","5373952":"Stone","5129728":"Andesite","5183488":"Diorite","5262336":"Granite","5322752":"Polished Andesite","5324288":"Polished Diorite","5325824":"Polished Granite","5376000":"Stone Bricks","5302784":"Mossy Stone Bricks","5167616":"Cracked Stone Bricks","5158912":"Chiseled Stone Bricks","5272576":"Infested Stone","5273088":"Infested Stone Brick","5271040":"Infested Cobblestone","5272064":"Infested Mossy Stone Brick","5271552":"Infested Cracked Stone Brick","5270528":"Infested Chiseled Stone Brick","5378048":"Stone Stairs","5378049":"Stone Stairs","5378050":"Stone Stairs","5378051":"Stone Stairs","5378052":"Stone Stairs","5378053":"Stone Stairs","5378054":"Stone Stairs","5378055":"Stone Stairs","5360640":"Smooth Stone","5130752":"Andesite Stairs","5130753":"Andesite Stairs","5130754":"Andesite Stairs","5130755":"Andesite Stairs","5130756":"Andesite Stairs","5130757":"Andesite Stairs","5130758":"Andesite Stairs","5130759":"Andesite Stairs","5184512":"Diorite Stairs","5184513":"Diorite Stairs","5184514":"Diorite Stairs","5184515":"Diorite Stairs","5184516":"Diorite Stairs","5184517":"Diorite Stairs","5184518":"Diorite Stairs","5184519":"Diorite Stairs","5263360":"Granite Stairs","5263361":"Granite Stairs","5263362":"Granite Stairs","5263363":"Granite Stairs","5263364":"Granite Stairs","5263365":"Granite Stairs","5263366":"Granite Stairs","5263367":"Granite Stairs","5323776":"Polished Andesite Stairs","5323777":"Polished Andesite Stairs","5323778":"Polished Andesite Stairs","5323779":"Polished Andesite Stairs","5323780":"Polished Andesite Stairs","5323781":"Polished Andesite Stairs","5323782":"Polished Andesite Stairs","5323783":"Polished Andesite Stairs","5325312":"Polished Diorite Stairs","5325313":"Polished Diorite Stairs","5325314":"Polished Diorite Stairs","5325315":"Polished Diorite Stairs","5325316":"Polished Diorite Stairs","5325317":"Polished Diorite Stairs","5325318":"Polished Diorite Stairs","5325319":"Polished Diorite Stairs","5326848":"Polished Granite Stairs","5326849":"Polished Granite Stairs","5326850":"Polished Granite Stairs","5326851":"Polished Granite Stairs","5326852":"Polished Granite Stairs","5326853":"Polished Granite Stairs","5326854":"Polished Granite Stairs","5326855":"Polished Granite Stairs","5374976":"Stone Brick Stairs","5374977":"Stone Brick Stairs","5374978":"Stone Brick Stairs","5374979":"Stone Brick Stairs","5374980":"Stone Brick Stairs","5374981":"Stone Brick Stairs","5374982":"Stone Brick Stairs","5374983":"Stone Brick Stairs","5301760":"Mossy Stone Brick Stairs","5301761":"Mossy Stone Brick Stairs","5301762":"Mossy Stone Brick Stairs","5301763":"Mossy Stone Brick Stairs","5301764":"Mossy Stone Brick Stairs","5301765":"Mossy Stone Brick Stairs","5301766":"Mossy Stone Brick Stairs","5301767":"Mossy Stone Brick Stairs","5376512":"Stone Button","5376513":"Stone Button","5376514":"Stone Button","5376515":"Stone Button","5376516":"Stone Button","5376517":"Stone Button","5376520":"Stone Button","5376521":"Stone Button","5376522":"Stone Button","5376523":"Stone Button","5376524":"Stone Button","5376525":"Stone Button","5378560":"Stonecutter","5378561":"Stonecutter","5378562":"Stonecutter","5378563":"Stonecutter","5377024":"Stone Pressure Plate","5377025":"Stone Pressure Plate","5150208":"Brick Slab","5150209":"Brick Slab","5150210":"Brick Slab","5161472":"Cobblestone Slab","5161473":"Cobblestone Slab","5161474":"Cobblestone Slab","5255168":"Fake Wooden Slab","5255169":"Fake Wooden Slab","5255170":"Fake Wooden Slab","5304832":"Nether Brick Slab","5304833":"Nether Brick Slab","5304834":"Nether Brick Slab","5337600":"Quartz Slab","5337601":"Quartz Slab","5337602":"Quartz Slab","5351936":"Sandstone Slab","5351937":"Sandstone Slab","5351938":"Sandstone Slab","5361152":"Smooth Stone Slab","5361153":"Smooth Stone Slab","5361154":"Smooth Stone Slab","5374464":"Stone Brick Slab","5374465":"Stone Brick Slab","5374466":"Stone Brick Slab","5179904":"Dark Prismarine Slab","5179905":"Dark Prismarine Slab","5179906":"Dark Prismarine Slab","5299712":"Mossy Cobblestone Slab","5299713":"Mossy Cobblestone Slab","5299714":"Mossy Cobblestone Slab","5330944":"Prismarine Slab","5330945":"Prismarine Slab","5330946":"Prismarine Slab","5329920":"Prismarine Bricks Slab","5329921":"Prismarine Bricks Slab","5329922":"Prismarine Bricks Slab","5335552":"Purpur Slab","5335553":"Purpur Slab","5335554":"Purpur Slab","5340672":"Red Nether Brick Slab","5340673":"Red Nether Brick Slab","5340674":"Red Nether Brick Slab","5343744":"Red Sandstone Slab","5343745":"Red Sandstone Slab","5343746":"Red Sandstone Slab","5359616":"Smooth Sandstone Slab","5359617":"Smooth Sandstone Slab","5359618":"Smooth Sandstone Slab","5130240":"Andesite Slab","5130241":"Andesite Slab","5130242":"Andesite Slab","5184000":"Diorite Slab","5184001":"Diorite Slab","5184002":"Diorite Slab","5252608":"End Stone Brick Slab","5252609":"End Stone Brick Slab","5252610":"End Stone Brick Slab","5262848":"Granite Slab","5262849":"Granite Slab","5262850":"Granite Slab","5323264":"Polished Andesite Slab","5323265":"Polished Andesite Slab","5323266":"Polished Andesite Slab","5324800":"Polished Diorite Slab","5324801":"Polished Diorite Slab","5324802":"Polished Diorite Slab","5326336":"Polished Granite Slab","5326337":"Polished Granite Slab","5326338":"Polished Granite Slab","5358080":"Smooth Red Sandstone Slab","5358081":"Smooth Red Sandstone Slab","5358082":"Smooth Red Sandstone Slab","5169152":"Cut Red Sandstone Slab","5169153":"Cut Red Sandstone Slab","5169154":"Cut Red Sandstone Slab","5170176":"Cut Sandstone Slab","5170177":"Cut Sandstone Slab","5170178":"Cut Sandstone Slab","5301248":"Mossy Stone Brick Slab","5301249":"Mossy Stone Brick Slab","5301250":"Mossy Stone Brick Slab","5356544":"Smooth Quartz Slab","5356545":"Smooth Quartz Slab","5356546":"Smooth Quartz Slab","5377536":"Stone Slab","5377537":"Stone Slab","5377538":"Stone Slab","5290496":"Legacy Stonecutter","5385216":"Sugarcane","5385217":"Sugarcane","5385218":"Sugarcane","5385219":"Sugarcane","5385220":"Sugarcane","5385221":"Sugarcane","5385222":"Sugarcane","5385223":"Sugarcane","5385224":"Sugarcane","5385225":"Sugarcane","5385226":"Sugarcane","5385227":"Sugarcane","5385228":"Sugarcane","5385229":"Sugarcane","5385230":"Sugarcane","5385231":"Sugarcane","5386240":"Sweet Berry Bush","5386241":"Sweet Berry Bush","5386242":"Sweet Berry Bush","5386243":"Sweet Berry Bush","5387264":"TNT","5387265":"TNT","5387266":"TNT","5387267":"TNT","5256192":"Fern","5386752":"Tall Grass","5148161":"Blue Torch","5148162":"Blue Torch","5148163":"Blue Torch","5148164":"Blue Torch","5148165":"Blue Torch","5334017":"Purple Torch","5334018":"Purple Torch","5334019":"Purple Torch","5334020":"Purple Torch","5334021":"Purple Torch","5345281":"Red Torch","5345282":"Red Torch","5345283":"Red Torch","5345284":"Red Torch","5345285":"Red Torch","5266945":"Green Torch","5266946":"Green Torch","5266947":"Green Torch","5266948":"Green Torch","5266949":"Green Torch","5387777":"Torch","5387778":"Torch","5387779":"Torch","5387780":"Torch","5387781":"Torch","5388288":"Trapped Chest","5388289":"Trapped Chest","5388290":"Trapped Chest","5388291":"Trapped Chest","5388800":"Tripwire","5388801":"Tripwire","5388802":"Tripwire","5388803":"Tripwire","5388804":"Tripwire","5388805":"Tripwire","5388806":"Tripwire","5388807":"Tripwire","5388808":"Tripwire","5388809":"Tripwire","5388810":"Tripwire","5388811":"Tripwire","5388812":"Tripwire","5388813":"Tripwire","5388814":"Tripwire","5388815":"Tripwire","5389312":"Tripwire Hook","5389313":"Tripwire Hook","5389314":"Tripwire Hook","5389315":"Tripwire Hook","5389316":"Tripwire Hook","5389317":"Tripwire Hook","5389318":"Tripwire Hook","5389319":"Tripwire Hook","5389320":"Tripwire Hook","5389321":"Tripwire Hook","5389322":"Tripwire Hook","5389323":"Tripwire Hook","5389324":"Tripwire Hook","5389325":"Tripwire Hook","5389326":"Tripwire Hook","5389327":"Tripwire Hook","5389825":"Underwater Torch","5389826":"Underwater Torch","5389827":"Underwater Torch","5389828":"Underwater Torch","5389829":"Underwater Torch","5390336":"Vines","5390337":"Vines","5390338":"Vines","5390339":"Vines","5390340":"Vines","5390341":"Vines","5390342":"Vines","5390343":"Vines","5390344":"Vines","5390345":"Vines","5390346":"Vines","5390347":"Vines","5390348":"Vines","5390349":"Vines","5390350":"Vines","5390351":"Vines","5391872":"Water","5391873":"Water","5391874":"Water","5391875":"Water","5391876":"Water","5391877":"Water","5391878":"Water","5391879":"Water","5391880":"Water","5391881":"Water","5391882":"Water","5391883":"Water","5391884":"Water","5391885":"Water","5391886":"Water","5391887":"Water","5391888":"Water","5391889":"Water","5391890":"Water","5391891":"Water","5391892":"Water","5391893":"Water","5391894":"Water","5391895":"Water","5391896":"Water","5391897":"Water","5391898":"Water","5391899":"Water","5391900":"Water","5391901":"Water","5391902":"Water","5391903":"Water","5293568":"Lily Pad","5392384":"Weighted Pressure Plate Heavy","5392385":"Weighted Pressure Plate Heavy","5392386":"Weighted Pressure Plate Heavy","5392387":"Weighted Pressure Plate Heavy","5392388":"Weighted Pressure Plate Heavy","5392389":"Weighted Pressure Plate Heavy","5392390":"Weighted Pressure Plate Heavy","5392391":"Weighted Pressure Plate Heavy","5392392":"Weighted Pressure Plate Heavy","5392393":"Weighted Pressure Plate Heavy","5392394":"Weighted Pressure Plate Heavy","5392395":"Weighted Pressure Plate Heavy","5392396":"Weighted Pressure Plate Heavy","5392397":"Weighted Pressure Plate Heavy","5392398":"Weighted Pressure Plate Heavy","5392399":"Weighted Pressure Plate Heavy","5392896":"Weighted Pressure Plate Light","5392897":"Weighted Pressure Plate Light","5392898":"Weighted Pressure Plate Light","5392899":"Weighted Pressure Plate Light","5392900":"Weighted Pressure Plate Light","5392901":"Weighted Pressure Plate Light","5392902":"Weighted Pressure Plate Light","5392903":"Weighted Pressure Plate Light","5392904":"Weighted Pressure Plate Light","5392905":"Weighted Pressure Plate Light","5392906":"Weighted Pressure Plate Light","5392907":"Weighted Pressure Plate Light","5392908":"Weighted Pressure Plate Light","5392909":"Weighted Pressure Plate Light","5392910":"Weighted Pressure Plate Light","5392911":"Weighted Pressure Plate Light","5393408":"Wheat Block","5393409":"Wheat Block","5393410":"Wheat Block","5393411":"Wheat Block","5393412":"Wheat Block","5393413":"Wheat Block","5393414":"Wheat Block","5393415":"Wheat Block","5314560":"Oak Sapling","5314561":"Oak Sapling","5312512":"Oak Leaves","5312513":"Oak Leaves","5312514":"Oak Leaves","5312515":"Oak Leaves","5367808":"Spruce Sapling","5367809":"Spruce Sapling","5365760":"Spruce Leaves","5365761":"Spruce Leaves","5365762":"Spruce Leaves","5365763":"Spruce Leaves","5142016":"Birch Sapling","5142017":"Birch Sapling","5139968":"Birch Leaves","5139969":"Birch Leaves","5139970":"Birch Leaves","5139971":"Birch Leaves","5282816":"Jungle Sapling","5282817":"Jungle Sapling","5280768":"Jungle Leaves","5280769":"Jungle Leaves","5280770":"Jungle Leaves","5280771":"Jungle Leaves","5124608":"Acacia Sapling","5124609":"Acacia Sapling","5122560":"Acacia Leaves","5122561":"Acacia Leaves","5122562":"Acacia Leaves","5122563":"Acacia Leaves","5175808":"Dark Oak Sapling","5175809":"Dark Oak Sapling","5173760":"Dark Oak Leaves","5173761":"Dark Oak Leaves","5173762":"Dark Oak Leaves","5173763":"Dark Oak Leaves","5313024":"Oak Log","5313025":"Oak Log","5313026":"Oak Log","5313027":"Oak Log","5313028":"Oak Log","5313029":"Oak Log","5317632":"Oak Wood","5317633":"Oak Wood","5317634":"Oak Wood","5317635":"Oak Wood","5317636":"Oak Wood","5317637":"Oak Wood","5313536":"Oak Planks","5311488":"Oak Fence","5315584":"Oak Slab","5315585":"Oak Slab","5315586":"Oak Slab","5312000":"Oak Fence Gate","5312001":"Oak Fence Gate","5312002":"Oak Fence Gate","5312003":"Oak Fence Gate","5312004":"Oak Fence Gate","5312005":"Oak Fence Gate","5312006":"Oak Fence Gate","5312007":"Oak Fence Gate","5312008":"Oak Fence Gate","5312009":"Oak Fence Gate","5312010":"Oak Fence Gate","5312011":"Oak Fence Gate","5312012":"Oak Fence Gate","5312013":"Oak Fence Gate","5312014":"Oak Fence Gate","5312015":"Oak Fence Gate","5316096":"Oak Stairs","5316097":"Oak Stairs","5316098":"Oak Stairs","5316099":"Oak Stairs","5316100":"Oak Stairs","5316101":"Oak Stairs","5316102":"Oak Stairs","5316103":"Oak Stairs","5310976":"Oak Door","5310977":"Oak Door","5310978":"Oak Door","5310979":"Oak Door","5310980":"Oak Door","5310981":"Oak Door","5310982":"Oak Door","5310983":"Oak Door","5310984":"Oak Door","5310985":"Oak Door","5310986":"Oak Door","5310987":"Oak Door","5310988":"Oak Door","5310989":"Oak Door","5310990":"Oak Door","5310991":"Oak Door","5310992":"Oak Door","5310993":"Oak Door","5310994":"Oak Door","5310995":"Oak Door","5310996":"Oak Door","5310997":"Oak Door","5310998":"Oak Door","5310999":"Oak Door","5311000":"Oak Door","5311001":"Oak Door","5311002":"Oak Door","5311003":"Oak Door","5311004":"Oak Door","5311005":"Oak Door","5311006":"Oak Door","5311007":"Oak Door","5310464":"Oak Button","5310465":"Oak Button","5310466":"Oak Button","5310467":"Oak Button","5310468":"Oak Button","5310469":"Oak Button","5310472":"Oak Button","5310473":"Oak Button","5310474":"Oak Button","5310475":"Oak Button","5310476":"Oak Button","5310477":"Oak Button","5314048":"Oak Pressure Plate","5314049":"Oak Pressure Plate","5316608":"Oak Trapdoor","5316609":"Oak Trapdoor","5316610":"Oak Trapdoor","5316611":"Oak Trapdoor","5316612":"Oak Trapdoor","5316613":"Oak Trapdoor","5316614":"Oak Trapdoor","5316615":"Oak Trapdoor","5316616":"Oak Trapdoor","5316617":"Oak Trapdoor","5316618":"Oak Trapdoor","5316619":"Oak Trapdoor","5316620":"Oak Trapdoor","5316621":"Oak Trapdoor","5316622":"Oak Trapdoor","5316623":"Oak Trapdoor","5315072":"Oak Sign","5315073":"Oak Sign","5315074":"Oak Sign","5315075":"Oak Sign","5315076":"Oak Sign","5315077":"Oak Sign","5315078":"Oak Sign","5315079":"Oak Sign","5315080":"Oak Sign","5315081":"Oak Sign","5315082":"Oak Sign","5315083":"Oak Sign","5315084":"Oak Sign","5315085":"Oak Sign","5315086":"Oak Sign","5315087":"Oak Sign","5317120":"Oak Wall Sign","5317121":"Oak Wall Sign","5317122":"Oak Wall Sign","5317123":"Oak Wall Sign","5366272":"Spruce Log","5366273":"Spruce Log","5366274":"Spruce Log","5366275":"Spruce Log","5366276":"Spruce Log","5366277":"Spruce Log","5370880":"Spruce Wood","5370881":"Spruce Wood","5370882":"Spruce Wood","5370883":"Spruce Wood","5370884":"Spruce Wood","5370885":"Spruce Wood","5366784":"Spruce Planks","5364736":"Spruce Fence","5368832":"Spruce Slab","5368833":"Spruce Slab","5368834":"Spruce Slab","5365248":"Spruce Fence Gate","5365249":"Spruce Fence Gate","5365250":"Spruce Fence Gate","5365251":"Spruce Fence Gate","5365252":"Spruce Fence Gate","5365253":"Spruce Fence Gate","5365254":"Spruce Fence Gate","5365255":"Spruce Fence Gate","5365256":"Spruce Fence Gate","5365257":"Spruce Fence Gate","5365258":"Spruce Fence Gate","5365259":"Spruce Fence Gate","5365260":"Spruce Fence Gate","5365261":"Spruce Fence Gate","5365262":"Spruce Fence Gate","5365263":"Spruce Fence Gate","5369344":"Spruce Stairs","5369345":"Spruce Stairs","5369346":"Spruce Stairs","5369347":"Spruce Stairs","5369348":"Spruce Stairs","5369349":"Spruce Stairs","5369350":"Spruce Stairs","5369351":"Spruce Stairs","5364224":"Spruce Door","5364225":"Spruce Door","5364226":"Spruce Door","5364227":"Spruce Door","5364228":"Spruce Door","5364229":"Spruce Door","5364230":"Spruce Door","5364231":"Spruce Door","5364232":"Spruce Door","5364233":"Spruce Door","5364234":"Spruce Door","5364235":"Spruce Door","5364236":"Spruce Door","5364237":"Spruce Door","5364238":"Spruce Door","5364239":"Spruce Door","5364240":"Spruce Door","5364241":"Spruce Door","5364242":"Spruce Door","5364243":"Spruce Door","5364244":"Spruce Door","5364245":"Spruce Door","5364246":"Spruce Door","5364247":"Spruce Door","5364248":"Spruce Door","5364249":"Spruce Door","5364250":"Spruce Door","5364251":"Spruce Door","5364252":"Spruce Door","5364253":"Spruce Door","5364254":"Spruce Door","5364255":"Spruce Door","5363712":"Spruce Button","5363713":"Spruce Button","5363714":"Spruce Button","5363715":"Spruce Button","5363716":"Spruce Button","5363717":"Spruce Button","5363720":"Spruce Button","5363721":"Spruce Button","5363722":"Spruce Button","5363723":"Spruce Button","5363724":"Spruce Button","5363725":"Spruce Button","5367296":"Spruce Pressure Plate","5367297":"Spruce Pressure Plate","5369856":"Spruce Trapdoor","5369857":"Spruce Trapdoor","5369858":"Spruce Trapdoor","5369859":"Spruce Trapdoor","5369860":"Spruce Trapdoor","5369861":"Spruce Trapdoor","5369862":"Spruce Trapdoor","5369863":"Spruce Trapdoor","5369864":"Spruce Trapdoor","5369865":"Spruce Trapdoor","5369866":"Spruce Trapdoor","5369867":"Spruce Trapdoor","5369868":"Spruce Trapdoor","5369869":"Spruce Trapdoor","5369870":"Spruce Trapdoor","5369871":"Spruce Trapdoor","5368320":"Spruce Sign","5368321":"Spruce Sign","5368322":"Spruce Sign","5368323":"Spruce Sign","5368324":"Spruce Sign","5368325":"Spruce Sign","5368326":"Spruce Sign","5368327":"Spruce Sign","5368328":"Spruce Sign","5368329":"Spruce Sign","5368330":"Spruce Sign","5368331":"Spruce Sign","5368332":"Spruce Sign","5368333":"Spruce Sign","5368334":"Spruce Sign","5368335":"Spruce Sign","5370368":"Spruce Wall Sign","5370369":"Spruce Wall Sign","5370370":"Spruce Wall Sign","5370371":"Spruce Wall Sign","5140480":"Birch Log","5140481":"Birch Log","5140482":"Birch Log","5140483":"Birch Log","5140484":"Birch Log","5140485":"Birch Log","5145088":"Birch Wood","5145089":"Birch Wood","5145090":"Birch Wood","5145091":"Birch Wood","5145092":"Birch Wood","5145093":"Birch Wood","5140992":"Birch Planks","5138944":"Birch Fence","5143040":"Birch Slab","5143041":"Birch Slab","5143042":"Birch Slab","5139456":"Birch Fence Gate","5139457":"Birch Fence Gate","5139458":"Birch Fence Gate","5139459":"Birch Fence Gate","5139460":"Birch Fence Gate","5139461":"Birch Fence Gate","5139462":"Birch Fence Gate","5139463":"Birch Fence Gate","5139464":"Birch Fence Gate","5139465":"Birch Fence Gate","5139466":"Birch Fence Gate","5139467":"Birch Fence Gate","5139468":"Birch Fence Gate","5139469":"Birch Fence Gate","5139470":"Birch Fence Gate","5139471":"Birch Fence Gate","5143552":"Birch Stairs","5143553":"Birch Stairs","5143554":"Birch Stairs","5143555":"Birch Stairs","5143556":"Birch Stairs","5143557":"Birch Stairs","5143558":"Birch Stairs","5143559":"Birch Stairs","5138432":"Birch Door","5138433":"Birch Door","5138434":"Birch Door","5138435":"Birch Door","5138436":"Birch Door","5138437":"Birch Door","5138438":"Birch Door","5138439":"Birch Door","5138440":"Birch Door","5138441":"Birch Door","5138442":"Birch Door","5138443":"Birch Door","5138444":"Birch Door","5138445":"Birch Door","5138446":"Birch Door","5138447":"Birch Door","5138448":"Birch Door","5138449":"Birch Door","5138450":"Birch Door","5138451":"Birch Door","5138452":"Birch Door","5138453":"Birch Door","5138454":"Birch Door","5138455":"Birch Door","5138456":"Birch Door","5138457":"Birch Door","5138458":"Birch Door","5138459":"Birch Door","5138460":"Birch Door","5138461":"Birch Door","5138462":"Birch Door","5138463":"Birch Door","5137920":"Birch Button","5137921":"Birch Button","5137922":"Birch Button","5137923":"Birch Button","5137924":"Birch Button","5137925":"Birch Button","5137928":"Birch Button","5137929":"Birch Button","5137930":"Birch Button","5137931":"Birch Button","5137932":"Birch Button","5137933":"Birch Button","5141504":"Birch Pressure Plate","5141505":"Birch Pressure Plate","5144064":"Birch Trapdoor","5144065":"Birch Trapdoor","5144066":"Birch Trapdoor","5144067":"Birch Trapdoor","5144068":"Birch Trapdoor","5144069":"Birch Trapdoor","5144070":"Birch Trapdoor","5144071":"Birch Trapdoor","5144072":"Birch Trapdoor","5144073":"Birch Trapdoor","5144074":"Birch Trapdoor","5144075":"Birch Trapdoor","5144076":"Birch Trapdoor","5144077":"Birch Trapdoor","5144078":"Birch Trapdoor","5144079":"Birch Trapdoor","5142528":"Birch Sign","5142529":"Birch Sign","5142530":"Birch Sign","5142531":"Birch Sign","5142532":"Birch Sign","5142533":"Birch Sign","5142534":"Birch Sign","5142535":"Birch Sign","5142536":"Birch Sign","5142537":"Birch Sign","5142538":"Birch Sign","5142539":"Birch Sign","5142540":"Birch Sign","5142541":"Birch Sign","5142542":"Birch Sign","5142543":"Birch Sign","5144576":"Birch Wall Sign","5144577":"Birch Wall Sign","5144578":"Birch Wall Sign","5144579":"Birch Wall Sign","5281280":"Jungle Log","5281281":"Jungle Log","5281282":"Jungle Log","5281283":"Jungle Log","5281284":"Jungle Log","5281285":"Jungle Log","5285888":"Jungle Wood","5285889":"Jungle Wood","5285890":"Jungle Wood","5285891":"Jungle Wood","5285892":"Jungle Wood","5285893":"Jungle Wood","5281792":"Jungle Planks","5279744":"Jungle Fence","5283840":"Jungle Slab","5283841":"Jungle Slab","5283842":"Jungle Slab","5280256":"Jungle Fence Gate","5280257":"Jungle Fence Gate","5280258":"Jungle Fence Gate","5280259":"Jungle Fence Gate","5280260":"Jungle Fence Gate","5280261":"Jungle Fence Gate","5280262":"Jungle Fence Gate","5280263":"Jungle Fence Gate","5280264":"Jungle Fence Gate","5280265":"Jungle Fence Gate","5280266":"Jungle Fence Gate","5280267":"Jungle Fence Gate","5280268":"Jungle Fence Gate","5280269":"Jungle Fence Gate","5280270":"Jungle Fence Gate","5280271":"Jungle Fence Gate","5284352":"Jungle Stairs","5284353":"Jungle Stairs","5284354":"Jungle Stairs","5284355":"Jungle Stairs","5284356":"Jungle Stairs","5284357":"Jungle Stairs","5284358":"Jungle Stairs","5284359":"Jungle Stairs","5279232":"Jungle Door","5279233":"Jungle Door","5279234":"Jungle Door","5279235":"Jungle Door","5279236":"Jungle Door","5279237":"Jungle Door","5279238":"Jungle Door","5279239":"Jungle Door","5279240":"Jungle Door","5279241":"Jungle Door","5279242":"Jungle Door","5279243":"Jungle Door","5279244":"Jungle Door","5279245":"Jungle Door","5279246":"Jungle Door","5279247":"Jungle Door","5279248":"Jungle Door","5279249":"Jungle Door","5279250":"Jungle Door","5279251":"Jungle Door","5279252":"Jungle Door","5279253":"Jungle Door","5279254":"Jungle Door","5279255":"Jungle Door","5279256":"Jungle Door","5279257":"Jungle Door","5279258":"Jungle Door","5279259":"Jungle Door","5279260":"Jungle Door","5279261":"Jungle Door","5279262":"Jungle Door","5279263":"Jungle Door","5278720":"Jungle Button","5278721":"Jungle Button","5278722":"Jungle Button","5278723":"Jungle Button","5278724":"Jungle Button","5278725":"Jungle Button","5278728":"Jungle Button","5278729":"Jungle Button","5278730":"Jungle Button","5278731":"Jungle Button","5278732":"Jungle Button","5278733":"Jungle Button","5282304":"Jungle Pressure Plate","5282305":"Jungle Pressure Plate","5284864":"Jungle Trapdoor","5284865":"Jungle Trapdoor","5284866":"Jungle Trapdoor","5284867":"Jungle Trapdoor","5284868":"Jungle Trapdoor","5284869":"Jungle Trapdoor","5284870":"Jungle Trapdoor","5284871":"Jungle Trapdoor","5284872":"Jungle Trapdoor","5284873":"Jungle Trapdoor","5284874":"Jungle Trapdoor","5284875":"Jungle Trapdoor","5284876":"Jungle Trapdoor","5284877":"Jungle Trapdoor","5284878":"Jungle Trapdoor","5284879":"Jungle Trapdoor","5283328":"Jungle Sign","5283329":"Jungle Sign","5283330":"Jungle Sign","5283331":"Jungle Sign","5283332":"Jungle Sign","5283333":"Jungle Sign","5283334":"Jungle Sign","5283335":"Jungle Sign","5283336":"Jungle Sign","5283337":"Jungle Sign","5283338":"Jungle Sign","5283339":"Jungle Sign","5283340":"Jungle Sign","5283341":"Jungle Sign","5283342":"Jungle Sign","5283343":"Jungle Sign","5285376":"Jungle Wall Sign","5285377":"Jungle Wall Sign","5285378":"Jungle Wall Sign","5285379":"Jungle Wall Sign","5123072":"Acacia Log","5123073":"Acacia Log","5123074":"Acacia Log","5123075":"Acacia Log","5123076":"Acacia Log","5123077":"Acacia Log","5127680":"Acacia Wood","5127681":"Acacia Wood","5127682":"Acacia Wood","5127683":"Acacia Wood","5127684":"Acacia Wood","5127685":"Acacia Wood","5123584":"Acacia Planks","5121536":"Acacia Fence","5125632":"Acacia Slab","5125633":"Acacia Slab","5125634":"Acacia Slab","5122048":"Acacia Fence Gate","5122049":"Acacia Fence Gate","5122050":"Acacia Fence Gate","5122051":"Acacia Fence Gate","5122052":"Acacia Fence Gate","5122053":"Acacia Fence Gate","5122054":"Acacia Fence Gate","5122055":"Acacia Fence Gate","5122056":"Acacia Fence Gate","5122057":"Acacia Fence Gate","5122058":"Acacia Fence Gate","5122059":"Acacia Fence Gate","5122060":"Acacia Fence Gate","5122061":"Acacia Fence Gate","5122062":"Acacia Fence Gate","5122063":"Acacia Fence Gate","5126144":"Acacia Stairs","5126145":"Acacia Stairs","5126146":"Acacia Stairs","5126147":"Acacia Stairs","5126148":"Acacia Stairs","5126149":"Acacia Stairs","5126150":"Acacia Stairs","5126151":"Acacia Stairs","5121024":"Acacia Door","5121025":"Acacia Door","5121026":"Acacia Door","5121027":"Acacia Door","5121028":"Acacia Door","5121029":"Acacia Door","5121030":"Acacia Door","5121031":"Acacia Door","5121032":"Acacia Door","5121033":"Acacia Door","5121034":"Acacia Door","5121035":"Acacia Door","5121036":"Acacia Door","5121037":"Acacia Door","5121038":"Acacia Door","5121039":"Acacia Door","5121040":"Acacia Door","5121041":"Acacia Door","5121042":"Acacia Door","5121043":"Acacia Door","5121044":"Acacia Door","5121045":"Acacia Door","5121046":"Acacia Door","5121047":"Acacia Door","5121048":"Acacia Door","5121049":"Acacia Door","5121050":"Acacia Door","5121051":"Acacia Door","5121052":"Acacia Door","5121053":"Acacia Door","5121054":"Acacia Door","5121055":"Acacia Door","5120512":"Acacia Button","5120513":"Acacia Button","5120514":"Acacia Button","5120515":"Acacia Button","5120516":"Acacia Button","5120517":"Acacia Button","5120520":"Acacia Button","5120521":"Acacia Button","5120522":"Acacia Button","5120523":"Acacia Button","5120524":"Acacia Button","5120525":"Acacia Button","5124096":"Acacia Pressure Plate","5124097":"Acacia Pressure Plate","5126656":"Acacia Trapdoor","5126657":"Acacia Trapdoor","5126658":"Acacia Trapdoor","5126659":"Acacia Trapdoor","5126660":"Acacia Trapdoor","5126661":"Acacia Trapdoor","5126662":"Acacia Trapdoor","5126663":"Acacia Trapdoor","5126664":"Acacia Trapdoor","5126665":"Acacia Trapdoor","5126666":"Acacia Trapdoor","5126667":"Acacia Trapdoor","5126668":"Acacia Trapdoor","5126669":"Acacia Trapdoor","5126670":"Acacia Trapdoor","5126671":"Acacia Trapdoor","5125120":"Acacia Sign","5125121":"Acacia Sign","5125122":"Acacia Sign","5125123":"Acacia Sign","5125124":"Acacia Sign","5125125":"Acacia Sign","5125126":"Acacia Sign","5125127":"Acacia Sign","5125128":"Acacia Sign","5125129":"Acacia Sign","5125130":"Acacia Sign","5125131":"Acacia Sign","5125132":"Acacia Sign","5125133":"Acacia Sign","5125134":"Acacia Sign","5125135":"Acacia Sign","5127168":"Acacia Wall Sign","5127169":"Acacia Wall Sign","5127170":"Acacia Wall Sign","5127171":"Acacia Wall Sign","5174272":"Dark Oak Log","5174273":"Dark Oak Log","5174274":"Dark Oak Log","5174275":"Dark Oak Log","5174276":"Dark Oak Log","5174277":"Dark Oak Log","5178880":"Dark Oak Wood","5178881":"Dark Oak Wood","5178882":"Dark Oak Wood","5178883":"Dark Oak Wood","5178884":"Dark Oak Wood","5178885":"Dark Oak Wood","5174784":"Dark Oak Planks","5172736":"Dark Oak Fence","5176832":"Dark Oak Slab","5176833":"Dark Oak Slab","5176834":"Dark Oak Slab","5173248":"Dark Oak Fence Gate","5173249":"Dark Oak Fence Gate","5173250":"Dark Oak Fence Gate","5173251":"Dark Oak Fence Gate","5173252":"Dark Oak Fence Gate","5173253":"Dark Oak Fence Gate","5173254":"Dark Oak Fence Gate","5173255":"Dark Oak Fence Gate","5173256":"Dark Oak Fence Gate","5173257":"Dark Oak Fence Gate","5173258":"Dark Oak Fence Gate","5173259":"Dark Oak Fence Gate","5173260":"Dark Oak Fence Gate","5173261":"Dark Oak Fence Gate","5173262":"Dark Oak Fence Gate","5173263":"Dark Oak Fence Gate","5177344":"Dark Oak Stairs","5177345":"Dark Oak Stairs","5177346":"Dark Oak Stairs","5177347":"Dark Oak Stairs","5177348":"Dark Oak Stairs","5177349":"Dark Oak Stairs","5177350":"Dark Oak Stairs","5177351":"Dark Oak Stairs","5172224":"Dark Oak Door","5172225":"Dark Oak Door","5172226":"Dark Oak Door","5172227":"Dark Oak Door","5172228":"Dark Oak Door","5172229":"Dark Oak Door","5172230":"Dark Oak Door","5172231":"Dark Oak Door","5172232":"Dark Oak Door","5172233":"Dark Oak Door","5172234":"Dark Oak Door","5172235":"Dark Oak Door","5172236":"Dark Oak Door","5172237":"Dark Oak Door","5172238":"Dark Oak Door","5172239":"Dark Oak Door","5172240":"Dark Oak Door","5172241":"Dark Oak Door","5172242":"Dark Oak Door","5172243":"Dark Oak Door","5172244":"Dark Oak Door","5172245":"Dark Oak Door","5172246":"Dark Oak Door","5172247":"Dark Oak Door","5172248":"Dark Oak Door","5172249":"Dark Oak Door","5172250":"Dark Oak Door","5172251":"Dark Oak Door","5172252":"Dark Oak Door","5172253":"Dark Oak Door","5172254":"Dark Oak Door","5172255":"Dark Oak Door","5171712":"Dark Oak Button","5171713":"Dark Oak Button","5171714":"Dark Oak Button","5171715":"Dark Oak Button","5171716":"Dark Oak Button","5171717":"Dark Oak Button","5171720":"Dark Oak Button","5171721":"Dark Oak Button","5171722":"Dark Oak Button","5171723":"Dark Oak Button","5171724":"Dark Oak Button","5171725":"Dark Oak Button","5175296":"Dark Oak Pressure Plate","5175297":"Dark Oak Pressure Plate","5177856":"Dark Oak Trapdoor","5177857":"Dark Oak Trapdoor","5177858":"Dark Oak Trapdoor","5177859":"Dark Oak Trapdoor","5177860":"Dark Oak Trapdoor","5177861":"Dark Oak Trapdoor","5177862":"Dark Oak Trapdoor","5177863":"Dark Oak Trapdoor","5177864":"Dark Oak Trapdoor","5177865":"Dark Oak Trapdoor","5177866":"Dark Oak Trapdoor","5177867":"Dark Oak Trapdoor","5177868":"Dark Oak Trapdoor","5177869":"Dark Oak Trapdoor","5177870":"Dark Oak Trapdoor","5177871":"Dark Oak Trapdoor","5176320":"Dark Oak Sign","5176321":"Dark Oak Sign","5176322":"Dark Oak Sign","5176323":"Dark Oak Sign","5176324":"Dark Oak Sign","5176325":"Dark Oak Sign","5176326":"Dark Oak Sign","5176327":"Dark Oak Sign","5176328":"Dark Oak Sign","5176329":"Dark Oak Sign","5176330":"Dark Oak Sign","5176331":"Dark Oak Sign","5176332":"Dark Oak Sign","5176333":"Dark Oak Sign","5176334":"Dark Oak Sign","5176335":"Dark Oak Sign","5178368":"Dark Oak Wall Sign","5178369":"Dark Oak Wall Sign","5178370":"Dark Oak Wall Sign","5178371":"Dark Oak Wall Sign","5429248":"Mangrove Log","5429249":"Mangrove Log","5429250":"Mangrove Log","5429251":"Mangrove Log","5429252":"Mangrove Log","5429253":"Mangrove Log","5430784":"Mangrove Wood","5430785":"Mangrove Wood","5430786":"Mangrove Wood","5430787":"Mangrove Wood","5430788":"Mangrove Wood","5430789":"Mangrove Wood","5424640":"Mangrove Planks","5426176":"Mangrove Fence","5427712":"Mangrove Slab","5427713":"Mangrove Slab","5427714":"Mangrove Slab","5438464":"Mangrove Fence Gate","5438465":"Mangrove Fence Gate","5438466":"Mangrove Fence Gate","5438467":"Mangrove Fence Gate","5438468":"Mangrove Fence Gate","5438469":"Mangrove Fence Gate","5438470":"Mangrove Fence Gate","5438471":"Mangrove Fence Gate","5438472":"Mangrove Fence Gate","5438473":"Mangrove Fence Gate","5438474":"Mangrove Fence Gate","5438475":"Mangrove Fence Gate","5438476":"Mangrove Fence Gate","5438477":"Mangrove Fence Gate","5438478":"Mangrove Fence Gate","5438479":"Mangrove Fence Gate","5440000":"Mangrove Stairs","5440001":"Mangrove Stairs","5440002":"Mangrove Stairs","5440003":"Mangrove Stairs","5440004":"Mangrove Stairs","5440005":"Mangrove Stairs","5440006":"Mangrove Stairs","5440007":"Mangrove Stairs","5436928":"Mangrove Door","5436929":"Mangrove Door","5436930":"Mangrove Door","5436931":"Mangrove Door","5436932":"Mangrove Door","5436933":"Mangrove Door","5436934":"Mangrove Door","5436935":"Mangrove Door","5436936":"Mangrove Door","5436937":"Mangrove Door","5436938":"Mangrove Door","5436939":"Mangrove Door","5436940":"Mangrove Door","5436941":"Mangrove Door","5436942":"Mangrove Door","5436943":"Mangrove Door","5436944":"Mangrove Door","5436945":"Mangrove Door","5436946":"Mangrove Door","5436947":"Mangrove Door","5436948":"Mangrove Door","5436949":"Mangrove Door","5436950":"Mangrove Door","5436951":"Mangrove Door","5436952":"Mangrove Door","5436953":"Mangrove Door","5436954":"Mangrove Door","5436955":"Mangrove Door","5436956":"Mangrove Door","5436957":"Mangrove Door","5436958":"Mangrove Door","5436959":"Mangrove Door","5433856":"Mangrove Button","5433857":"Mangrove Button","5433858":"Mangrove Button","5433859":"Mangrove Button","5433860":"Mangrove Button","5433861":"Mangrove Button","5433864":"Mangrove Button","5433865":"Mangrove Button","5433866":"Mangrove Button","5433867":"Mangrove Button","5433868":"Mangrove Button","5433869":"Mangrove Button","5435392":"Mangrove Pressure Plate","5435393":"Mangrove Pressure Plate","5432320":"Mangrove Trapdoor","5432321":"Mangrove Trapdoor","5432322":"Mangrove Trapdoor","5432323":"Mangrove Trapdoor","5432324":"Mangrove Trapdoor","5432325":"Mangrove Trapdoor","5432326":"Mangrove Trapdoor","5432327":"Mangrove Trapdoor","5432328":"Mangrove Trapdoor","5432329":"Mangrove Trapdoor","5432330":"Mangrove Trapdoor","5432331":"Mangrove Trapdoor","5432332":"Mangrove Trapdoor","5432333":"Mangrove Trapdoor","5432334":"Mangrove Trapdoor","5432335":"Mangrove Trapdoor","5441536":"Mangrove Sign","5441537":"Mangrove Sign","5441538":"Mangrove Sign","5441539":"Mangrove Sign","5441540":"Mangrove Sign","5441541":"Mangrove Sign","5441542":"Mangrove Sign","5441543":"Mangrove Sign","5441544":"Mangrove Sign","5441545":"Mangrove Sign","5441546":"Mangrove Sign","5441547":"Mangrove Sign","5441548":"Mangrove Sign","5441549":"Mangrove Sign","5441550":"Mangrove Sign","5441551":"Mangrove Sign","5443072":"Mangrove Wall Sign","5443073":"Mangrove Wall Sign","5443074":"Mangrove Wall Sign","5443075":"Mangrove Wall Sign","5429760":"Crimson Stem","5429761":"Crimson Stem","5429762":"Crimson Stem","5429763":"Crimson Stem","5429764":"Crimson Stem","5429765":"Crimson Stem","5431296":"Crimson Hyphae","5431297":"Crimson Hyphae","5431298":"Crimson Hyphae","5431299":"Crimson Hyphae","5431300":"Crimson Hyphae","5431301":"Crimson Hyphae","5425152":"Crimson Planks","5426688":"Crimson Fence","5428224":"Crimson Slab","5428225":"Crimson Slab","5428226":"Crimson Slab","5438976":"Crimson Fence Gate","5438977":"Crimson Fence Gate","5438978":"Crimson Fence Gate","5438979":"Crimson Fence Gate","5438980":"Crimson Fence Gate","5438981":"Crimson Fence Gate","5438982":"Crimson Fence Gate","5438983":"Crimson Fence Gate","5438984":"Crimson Fence Gate","5438985":"Crimson Fence Gate","5438986":"Crimson Fence Gate","5438987":"Crimson Fence Gate","5438988":"Crimson Fence Gate","5438989":"Crimson Fence Gate","5438990":"Crimson Fence Gate","5438991":"Crimson Fence Gate","5440512":"Crimson Stairs","5440513":"Crimson Stairs","5440514":"Crimson Stairs","5440515":"Crimson Stairs","5440516":"Crimson Stairs","5440517":"Crimson Stairs","5440518":"Crimson Stairs","5440519":"Crimson Stairs","5437440":"Crimson Door","5437441":"Crimson Door","5437442":"Crimson Door","5437443":"Crimson Door","5437444":"Crimson Door","5437445":"Crimson Door","5437446":"Crimson Door","5437447":"Crimson Door","5437448":"Crimson Door","5437449":"Crimson Door","5437450":"Crimson Door","5437451":"Crimson Door","5437452":"Crimson Door","5437453":"Crimson Door","5437454":"Crimson Door","5437455":"Crimson Door","5437456":"Crimson Door","5437457":"Crimson Door","5437458":"Crimson Door","5437459":"Crimson Door","5437460":"Crimson Door","5437461":"Crimson Door","5437462":"Crimson Door","5437463":"Crimson Door","5437464":"Crimson Door","5437465":"Crimson Door","5437466":"Crimson Door","5437467":"Crimson Door","5437468":"Crimson Door","5437469":"Crimson Door","5437470":"Crimson Door","5437471":"Crimson Door","5434368":"Crimson Button","5434369":"Crimson Button","5434370":"Crimson Button","5434371":"Crimson Button","5434372":"Crimson Button","5434373":"Crimson Button","5434376":"Crimson Button","5434377":"Crimson Button","5434378":"Crimson Button","5434379":"Crimson Button","5434380":"Crimson Button","5434381":"Crimson Button","5435904":"Crimson Pressure Plate","5435905":"Crimson Pressure Plate","5432832":"Crimson Trapdoor","5432833":"Crimson Trapdoor","5432834":"Crimson Trapdoor","5432835":"Crimson Trapdoor","5432836":"Crimson Trapdoor","5432837":"Crimson Trapdoor","5432838":"Crimson Trapdoor","5432839":"Crimson Trapdoor","5432840":"Crimson Trapdoor","5432841":"Crimson Trapdoor","5432842":"Crimson Trapdoor","5432843":"Crimson Trapdoor","5432844":"Crimson Trapdoor","5432845":"Crimson Trapdoor","5432846":"Crimson Trapdoor","5432847":"Crimson Trapdoor","5442048":"Crimson Sign","5442049":"Crimson Sign","5442050":"Crimson Sign","5442051":"Crimson Sign","5442052":"Crimson Sign","5442053":"Crimson Sign","5442054":"Crimson Sign","5442055":"Crimson Sign","5442056":"Crimson Sign","5442057":"Crimson Sign","5442058":"Crimson Sign","5442059":"Crimson Sign","5442060":"Crimson Sign","5442061":"Crimson Sign","5442062":"Crimson Sign","5442063":"Crimson Sign","5443584":"Crimson Wall Sign","5443585":"Crimson Wall Sign","5443586":"Crimson Wall Sign","5443587":"Crimson Wall Sign","5430272":"Warped Stem","5430273":"Warped Stem","5430274":"Warped Stem","5430275":"Warped Stem","5430276":"Warped Stem","5430277":"Warped Stem","5431808":"Warped Hyphae","5431809":"Warped Hyphae","5431810":"Warped Hyphae","5431811":"Warped Hyphae","5431812":"Warped Hyphae","5431813":"Warped Hyphae","5425664":"Warped Planks","5427200":"Warped Fence","5428736":"Warped Slab","5428737":"Warped Slab","5428738":"Warped Slab","5439488":"Warped Fence Gate","5439489":"Warped Fence Gate","5439490":"Warped Fence Gate","5439491":"Warped Fence Gate","5439492":"Warped Fence Gate","5439493":"Warped Fence Gate","5439494":"Warped Fence Gate","5439495":"Warped Fence Gate","5439496":"Warped Fence Gate","5439497":"Warped Fence Gate","5439498":"Warped Fence Gate","5439499":"Warped Fence Gate","5439500":"Warped Fence Gate","5439501":"Warped Fence Gate","5439502":"Warped Fence Gate","5439503":"Warped Fence Gate","5441024":"Warped Stairs","5441025":"Warped Stairs","5441026":"Warped Stairs","5441027":"Warped Stairs","5441028":"Warped Stairs","5441029":"Warped Stairs","5441030":"Warped Stairs","5441031":"Warped Stairs","5437952":"Warped Door","5437953":"Warped Door","5437954":"Warped Door","5437955":"Warped Door","5437956":"Warped Door","5437957":"Warped Door","5437958":"Warped Door","5437959":"Warped Door","5437960":"Warped Door","5437961":"Warped Door","5437962":"Warped Door","5437963":"Warped Door","5437964":"Warped Door","5437965":"Warped Door","5437966":"Warped Door","5437967":"Warped Door","5437968":"Warped Door","5437969":"Warped Door","5437970":"Warped Door","5437971":"Warped Door","5437972":"Warped Door","5437973":"Warped Door","5437974":"Warped Door","5437975":"Warped Door","5437976":"Warped Door","5437977":"Warped Door","5437978":"Warped Door","5437979":"Warped Door","5437980":"Warped Door","5437981":"Warped Door","5437982":"Warped Door","5437983":"Warped Door","5434880":"Warped Button","5434881":"Warped Button","5434882":"Warped Button","5434883":"Warped Button","5434884":"Warped Button","5434885":"Warped Button","5434888":"Warped Button","5434889":"Warped Button","5434890":"Warped Button","5434891":"Warped Button","5434892":"Warped Button","5434893":"Warped Button","5436416":"Warped Pressure Plate","5436417":"Warped Pressure Plate","5433344":"Warped Trapdoor","5433345":"Warped Trapdoor","5433346":"Warped Trapdoor","5433347":"Warped Trapdoor","5433348":"Warped Trapdoor","5433349":"Warped Trapdoor","5433350":"Warped Trapdoor","5433351":"Warped Trapdoor","5433352":"Warped Trapdoor","5433353":"Warped Trapdoor","5433354":"Warped Trapdoor","5433355":"Warped Trapdoor","5433356":"Warped Trapdoor","5433357":"Warped Trapdoor","5433358":"Warped Trapdoor","5433359":"Warped Trapdoor","5442560":"Warped Sign","5442561":"Warped Sign","5442562":"Warped Sign","5442563":"Warped Sign","5442564":"Warped Sign","5442565":"Warped Sign","5442566":"Warped Sign","5442567":"Warped Sign","5442568":"Warped Sign","5442569":"Warped Sign","5442570":"Warped Sign","5442571":"Warped Sign","5442572":"Warped Sign","5442573":"Warped Sign","5442574":"Warped Sign","5442575":"Warped Sign","5444096":"Warped Wall Sign","5444097":"Warped Wall Sign","5444098":"Warped Wall Sign","5444099":"Warped Wall Sign","5344256":"Red Sandstone Stairs","5344257":"Red Sandstone Stairs","5344258":"Red Sandstone Stairs","5344259":"Red Sandstone Stairs","5344260":"Red Sandstone Stairs","5344261":"Red Sandstone Stairs","5344262":"Red Sandstone Stairs","5344263":"Red Sandstone Stairs","5358592":"Smooth Red Sandstone Stairs","5358593":"Smooth Red Sandstone Stairs","5358594":"Smooth Red Sandstone Stairs","5358595":"Smooth Red Sandstone Stairs","5358596":"Smooth Red Sandstone Stairs","5358597":"Smooth Red Sandstone Stairs","5358598":"Smooth Red Sandstone Stairs","5358599":"Smooth Red Sandstone Stairs","5343232":"Red Sandstone","5157888":"Chiseled Red Sandstone","5168640":"Cut Red Sandstone","5357568":"Smooth Red Sandstone","5352448":"Sandstone Stairs","5352449":"Sandstone Stairs","5352450":"Sandstone Stairs","5352451":"Sandstone Stairs","5352452":"Sandstone Stairs","5352453":"Sandstone Stairs","5352454":"Sandstone Stairs","5352455":"Sandstone Stairs","5360128":"Smooth Sandstone Stairs","5360129":"Smooth Sandstone Stairs","5360130":"Smooth Sandstone Stairs","5360131":"Smooth Sandstone Stairs","5360132":"Smooth Sandstone Stairs","5360133":"Smooth Sandstone Stairs","5360134":"Smooth Sandstone Stairs","5360135":"Smooth Sandstone Stairs","5351424":"Sandstone","5158400":"Chiseled Sandstone","5169664":"Cut Sandstone","5359104":"Smooth Sandstone","5395968":"Glazed Terracotta","5395969":"Glazed Terracotta","5395970":"Glazed Terracotta","5395971":"Glazed Terracotta","5395972":"Glazed Terracotta","5395973":"Glazed Terracotta","5395974":"Glazed Terracotta","5395975":"Glazed Terracotta","5395976":"Glazed Terracotta","5395977":"Glazed Terracotta","5395978":"Glazed Terracotta","5395979":"Glazed Terracotta","5395980":"Glazed Terracotta","5395981":"Glazed Terracotta","5395982":"Glazed Terracotta","5395983":"Glazed Terracotta","5395984":"Glazed Terracotta","5395985":"Glazed Terracotta","5395986":"Glazed Terracotta","5395987":"Glazed Terracotta","5395988":"Glazed Terracotta","5395989":"Glazed Terracotta","5395990":"Glazed Terracotta","5395991":"Glazed Terracotta","5395992":"Glazed Terracotta","5395993":"Glazed Terracotta","5395994":"Glazed Terracotta","5395995":"Glazed Terracotta","5395996":"Glazed Terracotta","5395997":"Glazed Terracotta","5395998":"Glazed Terracotta","5395999":"Glazed Terracotta","5396000":"Glazed Terracotta","5396001":"Glazed Terracotta","5396002":"Glazed Terracotta","5396003":"Glazed Terracotta","5396004":"Glazed Terracotta","5396005":"Glazed Terracotta","5396006":"Glazed Terracotta","5396007":"Glazed Terracotta","5396008":"Glazed Terracotta","5396009":"Glazed Terracotta","5396010":"Glazed Terracotta","5396011":"Glazed Terracotta","5396012":"Glazed Terracotta","5396013":"Glazed Terracotta","5396014":"Glazed Terracotta","5396015":"Glazed Terracotta","5396016":"Glazed Terracotta","5396017":"Glazed Terracotta","5396018":"Glazed Terracotta","5396019":"Glazed Terracotta","5396020":"Glazed Terracotta","5396021":"Glazed Terracotta","5396022":"Glazed Terracotta","5396023":"Glazed Terracotta","5396024":"Glazed Terracotta","5396025":"Glazed Terracotta","5396026":"Glazed Terracotta","5396027":"Glazed Terracotta","5396028":"Glazed Terracotta","5396029":"Glazed Terracotta","5396030":"Glazed Terracotta","5396031":"Glazed Terracotta","5187584":"Dyed Shulker Box","5187585":"Dyed Shulker Box","5187586":"Dyed Shulker Box","5187587":"Dyed Shulker Box","5187588":"Dyed Shulker Box","5187589":"Dyed Shulker Box","5187590":"Dyed Shulker Box","5187591":"Dyed Shulker Box","5187592":"Dyed Shulker Box","5187593":"Dyed Shulker Box","5187594":"Dyed Shulker Box","5187595":"Dyed Shulker Box","5187596":"Dyed Shulker Box","5187597":"Dyed Shulker Box","5187598":"Dyed Shulker Box","5187599":"Dyed Shulker Box","5371904":"Stained Glass","5371905":"Stained Glass","5371906":"Stained Glass","5371907":"Stained Glass","5371908":"Stained Glass","5371909":"Stained Glass","5371910":"Stained Glass","5371911":"Stained Glass","5371912":"Stained Glass","5371913":"Stained Glass","5371914":"Stained Glass","5371915":"Stained Glass","5371916":"Stained Glass","5371917":"Stained Glass","5371918":"Stained Glass","5371919":"Stained Glass","5372416":"Stained Glass Pane","5372417":"Stained Glass Pane","5372418":"Stained Glass Pane","5372419":"Stained Glass Pane","5372420":"Stained Glass Pane","5372421":"Stained Glass Pane","5372422":"Stained Glass Pane","5372423":"Stained Glass Pane","5372424":"Stained Glass Pane","5372425":"Stained Glass Pane","5372426":"Stained Glass Pane","5372427":"Stained Glass Pane","5372428":"Stained Glass Pane","5372429":"Stained Glass Pane","5372430":"Stained Glass Pane","5372431":"Stained Glass Pane","5371392":"Stained Clay","5371393":"Stained Clay","5371394":"Stained Clay","5371395":"Stained Clay","5371396":"Stained Clay","5371397":"Stained Clay","5371398":"Stained Clay","5371399":"Stained Clay","5371400":"Stained Clay","5371401":"Stained Clay","5371402":"Stained Clay","5371403":"Stained Clay","5371404":"Stained Clay","5371405":"Stained Clay","5371406":"Stained Clay","5371407":"Stained Clay","5372928":"Stained Hardened Glass","5372929":"Stained Hardened Glass","5372930":"Stained Hardened Glass","5372931":"Stained Hardened Glass","5372932":"Stained Hardened Glass","5372933":"Stained Hardened Glass","5372934":"Stained Hardened Glass","5372935":"Stained Hardened Glass","5372936":"Stained Hardened Glass","5372937":"Stained Hardened Glass","5372938":"Stained Hardened Glass","5372939":"Stained Hardened Glass","5372940":"Stained Hardened Glass","5372941":"Stained Hardened Glass","5372942":"Stained Hardened Glass","5372943":"Stained Hardened Glass","5373440":"Stained Hardened Glass Pane","5373441":"Stained Hardened Glass Pane","5373442":"Stained Hardened Glass Pane","5373443":"Stained Hardened Glass Pane","5373444":"Stained Hardened Glass Pane","5373445":"Stained Hardened Glass Pane","5373446":"Stained Hardened Glass Pane","5373447":"Stained Hardened Glass Pane","5373448":"Stained Hardened Glass Pane","5373449":"Stained Hardened Glass Pane","5373450":"Stained Hardened Glass Pane","5373451":"Stained Hardened Glass Pane","5373452":"Stained Hardened Glass Pane","5373453":"Stained Hardened Glass Pane","5373454":"Stained Hardened Glass Pane","5373455":"Stained Hardened Glass Pane","5154816":"Carpet","5154817":"Carpet","5154818":"Carpet","5154819":"Carpet","5154820":"Carpet","5154821":"Carpet","5154822":"Carpet","5154823":"Carpet","5154824":"Carpet","5154825":"Carpet","5154826":"Carpet","5154827":"Carpet","5154828":"Carpet","5154829":"Carpet","5154830":"Carpet","5154831":"Carpet","5164544":"Concrete","5164545":"Concrete","5164546":"Concrete","5164547":"Concrete","5164548":"Concrete","5164549":"Concrete","5164550":"Concrete","5164551":"Concrete","5164552":"Concrete","5164553":"Concrete","5164554":"Concrete","5164555":"Concrete","5164556":"Concrete","5164557":"Concrete","5164558":"Concrete","5164559":"Concrete","5165056":"Concrete Powder","5165057":"Concrete Powder","5165058":"Concrete Powder","5165059":"Concrete Powder","5165060":"Concrete Powder","5165061":"Concrete Powder","5165062":"Concrete Powder","5165063":"Concrete Powder","5165064":"Concrete Powder","5165065":"Concrete Powder","5165066":"Concrete Powder","5165067":"Concrete Powder","5165068":"Concrete Powder","5165069":"Concrete Powder","5165070":"Concrete Powder","5165071":"Concrete Powder","5394944":"Wool","5394945":"Wool","5394946":"Wool","5394947":"Wool","5394948":"Wool","5394949":"Wool","5394950":"Wool","5394951":"Wool","5394952":"Wool","5394953":"Wool","5394954":"Wool","5394955":"Wool","5394956":"Wool","5394957":"Wool","5394958":"Wool","5394959":"Wool","5162496":"Cobblestone Wall","5162497":"Cobblestone Wall","5162498":"Cobblestone Wall","5162500":"Cobblestone Wall","5162501":"Cobblestone Wall","5162502":"Cobblestone Wall","5162504":"Cobblestone Wall","5162505":"Cobblestone Wall","5162506":"Cobblestone Wall","5162512":"Cobblestone Wall","5162513":"Cobblestone Wall","5162514":"Cobblestone Wall","5162516":"Cobblestone Wall","5162517":"Cobblestone Wall","5162518":"Cobblestone Wall","5162520":"Cobblestone Wall","5162521":"Cobblestone Wall","5162522":"Cobblestone Wall","5162528":"Cobblestone Wall","5162529":"Cobblestone Wall","5162530":"Cobblestone Wall","5162532":"Cobblestone Wall","5162533":"Cobblestone Wall","5162534":"Cobblestone Wall","5162536":"Cobblestone Wall","5162537":"Cobblestone Wall","5162538":"Cobblestone Wall","5162560":"Cobblestone Wall","5162561":"Cobblestone Wall","5162562":"Cobblestone Wall","5162564":"Cobblestone Wall","5162565":"Cobblestone Wall","5162566":"Cobblestone Wall","5162568":"Cobblestone Wall","5162569":"Cobblestone Wall","5162570":"Cobblestone Wall","5162576":"Cobblestone Wall","5162577":"Cobblestone Wall","5162578":"Cobblestone Wall","5162580":"Cobblestone Wall","5162581":"Cobblestone Wall","5162582":"Cobblestone Wall","5162584":"Cobblestone Wall","5162585":"Cobblestone Wall","5162586":"Cobblestone Wall","5162592":"Cobblestone Wall","5162593":"Cobblestone Wall","5162594":"Cobblestone Wall","5162596":"Cobblestone Wall","5162597":"Cobblestone Wall","5162598":"Cobblestone Wall","5162600":"Cobblestone Wall","5162601":"Cobblestone Wall","5162602":"Cobblestone Wall","5162624":"Cobblestone Wall","5162625":"Cobblestone Wall","5162626":"Cobblestone Wall","5162628":"Cobblestone Wall","5162629":"Cobblestone Wall","5162630":"Cobblestone Wall","5162632":"Cobblestone Wall","5162633":"Cobblestone Wall","5162634":"Cobblestone Wall","5162640":"Cobblestone Wall","5162641":"Cobblestone Wall","5162642":"Cobblestone Wall","5162644":"Cobblestone Wall","5162645":"Cobblestone Wall","5162646":"Cobblestone Wall","5162648":"Cobblestone Wall","5162649":"Cobblestone Wall","5162650":"Cobblestone Wall","5162656":"Cobblestone Wall","5162657":"Cobblestone Wall","5162658":"Cobblestone Wall","5162660":"Cobblestone Wall","5162661":"Cobblestone Wall","5162662":"Cobblestone Wall","5162664":"Cobblestone Wall","5162665":"Cobblestone Wall","5162666":"Cobblestone Wall","5162752":"Cobblestone Wall","5162753":"Cobblestone Wall","5162754":"Cobblestone Wall","5162756":"Cobblestone Wall","5162757":"Cobblestone Wall","5162758":"Cobblestone Wall","5162760":"Cobblestone Wall","5162761":"Cobblestone Wall","5162762":"Cobblestone Wall","5162768":"Cobblestone Wall","5162769":"Cobblestone Wall","5162770":"Cobblestone Wall","5162772":"Cobblestone Wall","5162773":"Cobblestone Wall","5162774":"Cobblestone Wall","5162776":"Cobblestone Wall","5162777":"Cobblestone Wall","5162778":"Cobblestone Wall","5162784":"Cobblestone Wall","5162785":"Cobblestone Wall","5162786":"Cobblestone Wall","5162788":"Cobblestone Wall","5162789":"Cobblestone Wall","5162790":"Cobblestone Wall","5162792":"Cobblestone Wall","5162793":"Cobblestone Wall","5162794":"Cobblestone Wall","5162816":"Cobblestone Wall","5162817":"Cobblestone Wall","5162818":"Cobblestone Wall","5162820":"Cobblestone Wall","5162821":"Cobblestone Wall","5162822":"Cobblestone Wall","5162824":"Cobblestone Wall","5162825":"Cobblestone Wall","5162826":"Cobblestone Wall","5162832":"Cobblestone Wall","5162833":"Cobblestone Wall","5162834":"Cobblestone Wall","5162836":"Cobblestone Wall","5162837":"Cobblestone Wall","5162838":"Cobblestone Wall","5162840":"Cobblestone Wall","5162841":"Cobblestone Wall","5162842":"Cobblestone Wall","5162848":"Cobblestone Wall","5162849":"Cobblestone Wall","5162850":"Cobblestone Wall","5162852":"Cobblestone Wall","5162853":"Cobblestone Wall","5162854":"Cobblestone Wall","5162856":"Cobblestone Wall","5162857":"Cobblestone Wall","5162858":"Cobblestone Wall","5162880":"Cobblestone Wall","5162881":"Cobblestone Wall","5162882":"Cobblestone Wall","5162884":"Cobblestone Wall","5162885":"Cobblestone Wall","5162886":"Cobblestone Wall","5162888":"Cobblestone Wall","5162889":"Cobblestone Wall","5162890":"Cobblestone Wall","5162896":"Cobblestone Wall","5162897":"Cobblestone Wall","5162898":"Cobblestone Wall","5162900":"Cobblestone Wall","5162901":"Cobblestone Wall","5162902":"Cobblestone Wall","5162904":"Cobblestone Wall","5162905":"Cobblestone Wall","5162906":"Cobblestone Wall","5162912":"Cobblestone Wall","5162913":"Cobblestone Wall","5162914":"Cobblestone Wall","5162916":"Cobblestone Wall","5162917":"Cobblestone Wall","5162918":"Cobblestone Wall","5162920":"Cobblestone Wall","5162921":"Cobblestone Wall","5162922":"Cobblestone Wall","5131264":"Andesite Wall","5131265":"Andesite Wall","5131266":"Andesite Wall","5131268":"Andesite Wall","5131269":"Andesite Wall","5131270":"Andesite Wall","5131272":"Andesite Wall","5131273":"Andesite Wall","5131274":"Andesite Wall","5131280":"Andesite Wall","5131281":"Andesite Wall","5131282":"Andesite Wall","5131284":"Andesite Wall","5131285":"Andesite Wall","5131286":"Andesite Wall","5131288":"Andesite Wall","5131289":"Andesite Wall","5131290":"Andesite Wall","5131296":"Andesite Wall","5131297":"Andesite Wall","5131298":"Andesite Wall","5131300":"Andesite Wall","5131301":"Andesite Wall","5131302":"Andesite Wall","5131304":"Andesite Wall","5131305":"Andesite Wall","5131306":"Andesite Wall","5131328":"Andesite Wall","5131329":"Andesite Wall","5131330":"Andesite Wall","5131332":"Andesite Wall","5131333":"Andesite Wall","5131334":"Andesite Wall","5131336":"Andesite Wall","5131337":"Andesite Wall","5131338":"Andesite Wall","5131344":"Andesite Wall","5131345":"Andesite Wall","5131346":"Andesite Wall","5131348":"Andesite Wall","5131349":"Andesite Wall","5131350":"Andesite Wall","5131352":"Andesite Wall","5131353":"Andesite Wall","5131354":"Andesite Wall","5131360":"Andesite Wall","5131361":"Andesite Wall","5131362":"Andesite Wall","5131364":"Andesite Wall","5131365":"Andesite Wall","5131366":"Andesite Wall","5131368":"Andesite Wall","5131369":"Andesite Wall","5131370":"Andesite Wall","5131392":"Andesite Wall","5131393":"Andesite Wall","5131394":"Andesite Wall","5131396":"Andesite Wall","5131397":"Andesite Wall","5131398":"Andesite Wall","5131400":"Andesite Wall","5131401":"Andesite Wall","5131402":"Andesite Wall","5131408":"Andesite Wall","5131409":"Andesite Wall","5131410":"Andesite Wall","5131412":"Andesite Wall","5131413":"Andesite Wall","5131414":"Andesite Wall","5131416":"Andesite Wall","5131417":"Andesite Wall","5131418":"Andesite Wall","5131424":"Andesite Wall","5131425":"Andesite Wall","5131426":"Andesite Wall","5131428":"Andesite Wall","5131429":"Andesite Wall","5131430":"Andesite Wall","5131432":"Andesite Wall","5131433":"Andesite Wall","5131434":"Andesite Wall","5131520":"Andesite Wall","5131521":"Andesite Wall","5131522":"Andesite Wall","5131524":"Andesite Wall","5131525":"Andesite Wall","5131526":"Andesite Wall","5131528":"Andesite Wall","5131529":"Andesite Wall","5131530":"Andesite Wall","5131536":"Andesite Wall","5131537":"Andesite Wall","5131538":"Andesite Wall","5131540":"Andesite Wall","5131541":"Andesite Wall","5131542":"Andesite Wall","5131544":"Andesite Wall","5131545":"Andesite Wall","5131546":"Andesite Wall","5131552":"Andesite Wall","5131553":"Andesite Wall","5131554":"Andesite Wall","5131556":"Andesite Wall","5131557":"Andesite Wall","5131558":"Andesite Wall","5131560":"Andesite Wall","5131561":"Andesite Wall","5131562":"Andesite Wall","5131584":"Andesite Wall","5131585":"Andesite Wall","5131586":"Andesite Wall","5131588":"Andesite Wall","5131589":"Andesite Wall","5131590":"Andesite Wall","5131592":"Andesite Wall","5131593":"Andesite Wall","5131594":"Andesite Wall","5131600":"Andesite Wall","5131601":"Andesite Wall","5131602":"Andesite Wall","5131604":"Andesite Wall","5131605":"Andesite Wall","5131606":"Andesite Wall","5131608":"Andesite Wall","5131609":"Andesite Wall","5131610":"Andesite Wall","5131616":"Andesite Wall","5131617":"Andesite Wall","5131618":"Andesite Wall","5131620":"Andesite Wall","5131621":"Andesite Wall","5131622":"Andesite Wall","5131624":"Andesite Wall","5131625":"Andesite Wall","5131626":"Andesite Wall","5131648":"Andesite Wall","5131649":"Andesite Wall","5131650":"Andesite Wall","5131652":"Andesite Wall","5131653":"Andesite Wall","5131654":"Andesite Wall","5131656":"Andesite Wall","5131657":"Andesite Wall","5131658":"Andesite Wall","5131664":"Andesite Wall","5131665":"Andesite Wall","5131666":"Andesite Wall","5131668":"Andesite Wall","5131669":"Andesite Wall","5131670":"Andesite Wall","5131672":"Andesite Wall","5131673":"Andesite Wall","5131674":"Andesite Wall","5131680":"Andesite Wall","5131681":"Andesite Wall","5131682":"Andesite Wall","5131684":"Andesite Wall","5131685":"Andesite Wall","5131686":"Andesite Wall","5131688":"Andesite Wall","5131689":"Andesite Wall","5131690":"Andesite Wall","5151232":"Brick Wall","5151233":"Brick Wall","5151234":"Brick Wall","5151236":"Brick Wall","5151237":"Brick Wall","5151238":"Brick Wall","5151240":"Brick Wall","5151241":"Brick Wall","5151242":"Brick Wall","5151248":"Brick Wall","5151249":"Brick Wall","5151250":"Brick Wall","5151252":"Brick Wall","5151253":"Brick Wall","5151254":"Brick Wall","5151256":"Brick Wall","5151257":"Brick Wall","5151258":"Brick Wall","5151264":"Brick Wall","5151265":"Brick Wall","5151266":"Brick Wall","5151268":"Brick Wall","5151269":"Brick Wall","5151270":"Brick Wall","5151272":"Brick Wall","5151273":"Brick Wall","5151274":"Brick Wall","5151296":"Brick Wall","5151297":"Brick Wall","5151298":"Brick Wall","5151300":"Brick Wall","5151301":"Brick Wall","5151302":"Brick Wall","5151304":"Brick Wall","5151305":"Brick Wall","5151306":"Brick Wall","5151312":"Brick Wall","5151313":"Brick Wall","5151314":"Brick Wall","5151316":"Brick Wall","5151317":"Brick Wall","5151318":"Brick Wall","5151320":"Brick Wall","5151321":"Brick Wall","5151322":"Brick Wall","5151328":"Brick Wall","5151329":"Brick Wall","5151330":"Brick Wall","5151332":"Brick Wall","5151333":"Brick Wall","5151334":"Brick Wall","5151336":"Brick Wall","5151337":"Brick Wall","5151338":"Brick Wall","5151360":"Brick Wall","5151361":"Brick Wall","5151362":"Brick Wall","5151364":"Brick Wall","5151365":"Brick Wall","5151366":"Brick Wall","5151368":"Brick Wall","5151369":"Brick Wall","5151370":"Brick Wall","5151376":"Brick Wall","5151377":"Brick Wall","5151378":"Brick Wall","5151380":"Brick Wall","5151381":"Brick Wall","5151382":"Brick Wall","5151384":"Brick Wall","5151385":"Brick Wall","5151386":"Brick Wall","5151392":"Brick Wall","5151393":"Brick Wall","5151394":"Brick Wall","5151396":"Brick Wall","5151397":"Brick Wall","5151398":"Brick Wall","5151400":"Brick Wall","5151401":"Brick Wall","5151402":"Brick Wall","5151488":"Brick Wall","5151489":"Brick Wall","5151490":"Brick Wall","5151492":"Brick Wall","5151493":"Brick Wall","5151494":"Brick Wall","5151496":"Brick Wall","5151497":"Brick Wall","5151498":"Brick Wall","5151504":"Brick Wall","5151505":"Brick Wall","5151506":"Brick Wall","5151508":"Brick Wall","5151509":"Brick Wall","5151510":"Brick Wall","5151512":"Brick Wall","5151513":"Brick Wall","5151514":"Brick Wall","5151520":"Brick Wall","5151521":"Brick Wall","5151522":"Brick Wall","5151524":"Brick Wall","5151525":"Brick Wall","5151526":"Brick Wall","5151528":"Brick Wall","5151529":"Brick Wall","5151530":"Brick Wall","5151552":"Brick Wall","5151553":"Brick Wall","5151554":"Brick Wall","5151556":"Brick Wall","5151557":"Brick Wall","5151558":"Brick Wall","5151560":"Brick Wall","5151561":"Brick Wall","5151562":"Brick Wall","5151568":"Brick Wall","5151569":"Brick Wall","5151570":"Brick Wall","5151572":"Brick Wall","5151573":"Brick Wall","5151574":"Brick Wall","5151576":"Brick Wall","5151577":"Brick Wall","5151578":"Brick Wall","5151584":"Brick Wall","5151585":"Brick Wall","5151586":"Brick Wall","5151588":"Brick Wall","5151589":"Brick Wall","5151590":"Brick Wall","5151592":"Brick Wall","5151593":"Brick Wall","5151594":"Brick Wall","5151616":"Brick Wall","5151617":"Brick Wall","5151618":"Brick Wall","5151620":"Brick Wall","5151621":"Brick Wall","5151622":"Brick Wall","5151624":"Brick Wall","5151625":"Brick Wall","5151626":"Brick Wall","5151632":"Brick Wall","5151633":"Brick Wall","5151634":"Brick Wall","5151636":"Brick Wall","5151637":"Brick Wall","5151638":"Brick Wall","5151640":"Brick Wall","5151641":"Brick Wall","5151642":"Brick Wall","5151648":"Brick Wall","5151649":"Brick Wall","5151650":"Brick Wall","5151652":"Brick Wall","5151653":"Brick Wall","5151654":"Brick Wall","5151656":"Brick Wall","5151657":"Brick Wall","5151658":"Brick Wall","5185024":"Diorite Wall","5185025":"Diorite Wall","5185026":"Diorite Wall","5185028":"Diorite Wall","5185029":"Diorite Wall","5185030":"Diorite Wall","5185032":"Diorite Wall","5185033":"Diorite Wall","5185034":"Diorite Wall","5185040":"Diorite Wall","5185041":"Diorite Wall","5185042":"Diorite Wall","5185044":"Diorite Wall","5185045":"Diorite Wall","5185046":"Diorite Wall","5185048":"Diorite Wall","5185049":"Diorite Wall","5185050":"Diorite Wall","5185056":"Diorite Wall","5185057":"Diorite Wall","5185058":"Diorite Wall","5185060":"Diorite Wall","5185061":"Diorite Wall","5185062":"Diorite Wall","5185064":"Diorite Wall","5185065":"Diorite Wall","5185066":"Diorite Wall","5185088":"Diorite Wall","5185089":"Diorite Wall","5185090":"Diorite Wall","5185092":"Diorite Wall","5185093":"Diorite Wall","5185094":"Diorite Wall","5185096":"Diorite Wall","5185097":"Diorite Wall","5185098":"Diorite Wall","5185104":"Diorite Wall","5185105":"Diorite Wall","5185106":"Diorite Wall","5185108":"Diorite Wall","5185109":"Diorite Wall","5185110":"Diorite Wall","5185112":"Diorite Wall","5185113":"Diorite Wall","5185114":"Diorite Wall","5185120":"Diorite Wall","5185121":"Diorite Wall","5185122":"Diorite Wall","5185124":"Diorite Wall","5185125":"Diorite Wall","5185126":"Diorite Wall","5185128":"Diorite Wall","5185129":"Diorite Wall","5185130":"Diorite Wall","5185152":"Diorite Wall","5185153":"Diorite Wall","5185154":"Diorite Wall","5185156":"Diorite Wall","5185157":"Diorite Wall","5185158":"Diorite Wall","5185160":"Diorite Wall","5185161":"Diorite Wall","5185162":"Diorite Wall","5185168":"Diorite Wall","5185169":"Diorite Wall","5185170":"Diorite Wall","5185172":"Diorite Wall","5185173":"Diorite Wall","5185174":"Diorite Wall","5185176":"Diorite Wall","5185177":"Diorite Wall","5185178":"Diorite Wall","5185184":"Diorite Wall","5185185":"Diorite Wall","5185186":"Diorite Wall","5185188":"Diorite Wall","5185189":"Diorite Wall","5185190":"Diorite Wall","5185192":"Diorite Wall","5185193":"Diorite Wall","5185194":"Diorite Wall","5185280":"Diorite Wall","5185281":"Diorite Wall","5185282":"Diorite Wall","5185284":"Diorite Wall","5185285":"Diorite Wall","5185286":"Diorite Wall","5185288":"Diorite Wall","5185289":"Diorite Wall","5185290":"Diorite Wall","5185296":"Diorite Wall","5185297":"Diorite Wall","5185298":"Diorite Wall","5185300":"Diorite Wall","5185301":"Diorite Wall","5185302":"Diorite Wall","5185304":"Diorite Wall","5185305":"Diorite Wall","5185306":"Diorite Wall","5185312":"Diorite Wall","5185313":"Diorite Wall","5185314":"Diorite Wall","5185316":"Diorite Wall","5185317":"Diorite Wall","5185318":"Diorite Wall","5185320":"Diorite Wall","5185321":"Diorite Wall","5185322":"Diorite Wall","5185344":"Diorite Wall","5185345":"Diorite Wall","5185346":"Diorite Wall","5185348":"Diorite Wall","5185349":"Diorite Wall","5185350":"Diorite Wall","5185352":"Diorite Wall","5185353":"Diorite Wall","5185354":"Diorite Wall","5185360":"Diorite Wall","5185361":"Diorite Wall","5185362":"Diorite Wall","5185364":"Diorite Wall","5185365":"Diorite Wall","5185366":"Diorite Wall","5185368":"Diorite Wall","5185369":"Diorite Wall","5185370":"Diorite Wall","5185376":"Diorite Wall","5185377":"Diorite Wall","5185378":"Diorite Wall","5185380":"Diorite Wall","5185381":"Diorite Wall","5185382":"Diorite Wall","5185384":"Diorite Wall","5185385":"Diorite Wall","5185386":"Diorite Wall","5185408":"Diorite Wall","5185409":"Diorite Wall","5185410":"Diorite Wall","5185412":"Diorite Wall","5185413":"Diorite Wall","5185414":"Diorite Wall","5185416":"Diorite Wall","5185417":"Diorite Wall","5185418":"Diorite Wall","5185424":"Diorite Wall","5185425":"Diorite Wall","5185426":"Diorite Wall","5185428":"Diorite Wall","5185429":"Diorite Wall","5185430":"Diorite Wall","5185432":"Diorite Wall","5185433":"Diorite Wall","5185434":"Diorite Wall","5185440":"Diorite Wall","5185441":"Diorite Wall","5185442":"Diorite Wall","5185444":"Diorite Wall","5185445":"Diorite Wall","5185446":"Diorite Wall","5185448":"Diorite Wall","5185449":"Diorite Wall","5185450":"Diorite Wall","5253632":"End Stone Brick Wall","5253633":"End Stone Brick Wall","5253634":"End Stone Brick Wall","5253636":"End Stone Brick Wall","5253637":"End Stone Brick Wall","5253638":"End Stone Brick Wall","5253640":"End Stone Brick Wall","5253641":"End Stone Brick Wall","5253642":"End Stone Brick Wall","5253648":"End Stone Brick Wall","5253649":"End Stone Brick Wall","5253650":"End Stone Brick Wall","5253652":"End Stone Brick Wall","5253653":"End Stone Brick Wall","5253654":"End Stone Brick Wall","5253656":"End Stone Brick Wall","5253657":"End Stone Brick Wall","5253658":"End Stone Brick Wall","5253664":"End Stone Brick Wall","5253665":"End Stone Brick Wall","5253666":"End Stone Brick Wall","5253668":"End Stone Brick Wall","5253669":"End Stone Brick Wall","5253670":"End Stone Brick Wall","5253672":"End Stone Brick Wall","5253673":"End Stone Brick Wall","5253674":"End Stone Brick Wall","5253696":"End Stone Brick Wall","5253697":"End Stone Brick Wall","5253698":"End Stone Brick Wall","5253700":"End Stone Brick Wall","5253701":"End Stone Brick Wall","5253702":"End Stone Brick Wall","5253704":"End Stone Brick Wall","5253705":"End Stone Brick Wall","5253706":"End Stone Brick Wall","5253712":"End Stone Brick Wall","5253713":"End Stone Brick Wall","5253714":"End Stone Brick Wall","5253716":"End Stone Brick Wall","5253717":"End Stone Brick Wall","5253718":"End Stone Brick Wall","5253720":"End Stone Brick Wall","5253721":"End Stone Brick Wall","5253722":"End Stone Brick Wall","5253728":"End Stone Brick Wall","5253729":"End Stone Brick Wall","5253730":"End Stone Brick Wall","5253732":"End Stone Brick Wall","5253733":"End Stone Brick Wall","5253734":"End Stone Brick Wall","5253736":"End Stone Brick Wall","5253737":"End Stone Brick Wall","5253738":"End Stone Brick Wall","5253760":"End Stone Brick Wall","5253761":"End Stone Brick Wall","5253762":"End Stone Brick Wall","5253764":"End Stone Brick Wall","5253765":"End Stone Brick Wall","5253766":"End Stone Brick Wall","5253768":"End Stone Brick Wall","5253769":"End Stone Brick Wall","5253770":"End Stone Brick Wall","5253776":"End Stone Brick Wall","5253777":"End Stone Brick Wall","5253778":"End Stone Brick Wall","5253780":"End Stone Brick Wall","5253781":"End Stone Brick Wall","5253782":"End Stone Brick Wall","5253784":"End Stone Brick Wall","5253785":"End Stone Brick Wall","5253786":"End Stone Brick Wall","5253792":"End Stone Brick Wall","5253793":"End Stone Brick Wall","5253794":"End Stone Brick Wall","5253796":"End Stone Brick Wall","5253797":"End Stone Brick Wall","5253798":"End Stone Brick Wall","5253800":"End Stone Brick Wall","5253801":"End Stone Brick Wall","5253802":"End Stone Brick Wall","5253888":"End Stone Brick Wall","5253889":"End Stone Brick Wall","5253890":"End Stone Brick Wall","5253892":"End Stone Brick Wall","5253893":"End Stone Brick Wall","5253894":"End Stone Brick Wall","5253896":"End Stone Brick Wall","5253897":"End Stone Brick Wall","5253898":"End Stone Brick Wall","5253904":"End Stone Brick Wall","5253905":"End Stone Brick Wall","5253906":"End Stone Brick Wall","5253908":"End Stone Brick Wall","5253909":"End Stone Brick Wall","5253910":"End Stone Brick Wall","5253912":"End Stone Brick Wall","5253913":"End Stone Brick Wall","5253914":"End Stone Brick Wall","5253920":"End Stone Brick Wall","5253921":"End Stone Brick Wall","5253922":"End Stone Brick Wall","5253924":"End Stone Brick Wall","5253925":"End Stone Brick Wall","5253926":"End Stone Brick Wall","5253928":"End Stone Brick Wall","5253929":"End Stone Brick Wall","5253930":"End Stone Brick Wall","5253952":"End Stone Brick Wall","5253953":"End Stone Brick Wall","5253954":"End Stone Brick Wall","5253956":"End Stone Brick Wall","5253957":"End Stone Brick Wall","5253958":"End Stone Brick Wall","5253960":"End Stone Brick Wall","5253961":"End Stone Brick Wall","5253962":"End Stone Brick Wall","5253968":"End Stone Brick Wall","5253969":"End Stone Brick Wall","5253970":"End Stone Brick Wall","5253972":"End Stone Brick Wall","5253973":"End Stone Brick Wall","5253974":"End Stone Brick Wall","5253976":"End Stone Brick Wall","5253977":"End Stone Brick Wall","5253978":"End Stone Brick Wall","5253984":"End Stone Brick Wall","5253985":"End Stone Brick Wall","5253986":"End Stone Brick Wall","5253988":"End Stone Brick Wall","5253989":"End Stone Brick Wall","5253990":"End Stone Brick Wall","5253992":"End Stone Brick Wall","5253993":"End Stone Brick Wall","5253994":"End Stone Brick Wall","5254016":"End Stone Brick Wall","5254017":"End Stone Brick Wall","5254018":"End Stone Brick Wall","5254020":"End Stone Brick Wall","5254021":"End Stone Brick Wall","5254022":"End Stone Brick Wall","5254024":"End Stone Brick Wall","5254025":"End Stone Brick Wall","5254026":"End Stone Brick Wall","5254032":"End Stone Brick Wall","5254033":"End Stone Brick Wall","5254034":"End Stone Brick Wall","5254036":"End Stone Brick Wall","5254037":"End Stone Brick Wall","5254038":"End Stone Brick Wall","5254040":"End Stone Brick Wall","5254041":"End Stone Brick Wall","5254042":"End Stone Brick Wall","5254048":"End Stone Brick Wall","5254049":"End Stone Brick Wall","5254050":"End Stone Brick Wall","5254052":"End Stone Brick Wall","5254053":"End Stone Brick Wall","5254054":"End Stone Brick Wall","5254056":"End Stone Brick Wall","5254057":"End Stone Brick Wall","5254058":"End Stone Brick Wall","5263872":"Granite Wall","5263873":"Granite Wall","5263874":"Granite Wall","5263876":"Granite Wall","5263877":"Granite Wall","5263878":"Granite Wall","5263880":"Granite Wall","5263881":"Granite Wall","5263882":"Granite Wall","5263888":"Granite Wall","5263889":"Granite Wall","5263890":"Granite Wall","5263892":"Granite Wall","5263893":"Granite Wall","5263894":"Granite Wall","5263896":"Granite Wall","5263897":"Granite Wall","5263898":"Granite Wall","5263904":"Granite Wall","5263905":"Granite Wall","5263906":"Granite Wall","5263908":"Granite Wall","5263909":"Granite Wall","5263910":"Granite Wall","5263912":"Granite Wall","5263913":"Granite Wall","5263914":"Granite Wall","5263936":"Granite Wall","5263937":"Granite Wall","5263938":"Granite Wall","5263940":"Granite Wall","5263941":"Granite Wall","5263942":"Granite Wall","5263944":"Granite Wall","5263945":"Granite Wall","5263946":"Granite Wall","5263952":"Granite Wall","5263953":"Granite Wall","5263954":"Granite Wall","5263956":"Granite Wall","5263957":"Granite Wall","5263958":"Granite Wall","5263960":"Granite Wall","5263961":"Granite Wall","5263962":"Granite Wall","5263968":"Granite Wall","5263969":"Granite Wall","5263970":"Granite Wall","5263972":"Granite Wall","5263973":"Granite Wall","5263974":"Granite Wall","5263976":"Granite Wall","5263977":"Granite Wall","5263978":"Granite Wall","5264000":"Granite Wall","5264001":"Granite Wall","5264002":"Granite Wall","5264004":"Granite Wall","5264005":"Granite Wall","5264006":"Granite Wall","5264008":"Granite Wall","5264009":"Granite Wall","5264010":"Granite Wall","5264016":"Granite Wall","5264017":"Granite Wall","5264018":"Granite Wall","5264020":"Granite Wall","5264021":"Granite Wall","5264022":"Granite Wall","5264024":"Granite Wall","5264025":"Granite Wall","5264026":"Granite Wall","5264032":"Granite Wall","5264033":"Granite Wall","5264034":"Granite Wall","5264036":"Granite Wall","5264037":"Granite Wall","5264038":"Granite Wall","5264040":"Granite Wall","5264041":"Granite Wall","5264042":"Granite Wall","5264128":"Granite Wall","5264129":"Granite Wall","5264130":"Granite Wall","5264132":"Granite Wall","5264133":"Granite Wall","5264134":"Granite Wall","5264136":"Granite Wall","5264137":"Granite Wall","5264138":"Granite Wall","5264144":"Granite Wall","5264145":"Granite Wall","5264146":"Granite Wall","5264148":"Granite Wall","5264149":"Granite Wall","5264150":"Granite Wall","5264152":"Granite Wall","5264153":"Granite Wall","5264154":"Granite Wall","5264160":"Granite Wall","5264161":"Granite Wall","5264162":"Granite Wall","5264164":"Granite Wall","5264165":"Granite Wall","5264166":"Granite Wall","5264168":"Granite Wall","5264169":"Granite Wall","5264170":"Granite Wall","5264192":"Granite Wall","5264193":"Granite Wall","5264194":"Granite Wall","5264196":"Granite Wall","5264197":"Granite Wall","5264198":"Granite Wall","5264200":"Granite Wall","5264201":"Granite Wall","5264202":"Granite Wall","5264208":"Granite Wall","5264209":"Granite Wall","5264210":"Granite Wall","5264212":"Granite Wall","5264213":"Granite Wall","5264214":"Granite Wall","5264216":"Granite Wall","5264217":"Granite Wall","5264218":"Granite Wall","5264224":"Granite Wall","5264225":"Granite Wall","5264226":"Granite Wall","5264228":"Granite Wall","5264229":"Granite Wall","5264230":"Granite Wall","5264232":"Granite Wall","5264233":"Granite Wall","5264234":"Granite Wall","5264256":"Granite Wall","5264257":"Granite Wall","5264258":"Granite Wall","5264260":"Granite Wall","5264261":"Granite Wall","5264262":"Granite Wall","5264264":"Granite Wall","5264265":"Granite Wall","5264266":"Granite Wall","5264272":"Granite Wall","5264273":"Granite Wall","5264274":"Granite Wall","5264276":"Granite Wall","5264277":"Granite Wall","5264278":"Granite Wall","5264280":"Granite Wall","5264281":"Granite Wall","5264282":"Granite Wall","5264288":"Granite Wall","5264289":"Granite Wall","5264290":"Granite Wall","5264292":"Granite Wall","5264293":"Granite Wall","5264294":"Granite Wall","5264296":"Granite Wall","5264297":"Granite Wall","5264298":"Granite Wall","5302272":"Mossy Stone Brick Wall","5302273":"Mossy Stone Brick Wall","5302274":"Mossy Stone Brick Wall","5302276":"Mossy Stone Brick Wall","5302277":"Mossy Stone Brick Wall","5302278":"Mossy Stone Brick Wall","5302280":"Mossy Stone Brick Wall","5302281":"Mossy Stone Brick Wall","5302282":"Mossy Stone Brick Wall","5302288":"Mossy Stone Brick Wall","5302289":"Mossy Stone Brick Wall","5302290":"Mossy Stone Brick Wall","5302292":"Mossy Stone Brick Wall","5302293":"Mossy Stone Brick Wall","5302294":"Mossy Stone Brick Wall","5302296":"Mossy Stone Brick Wall","5302297":"Mossy Stone Brick Wall","5302298":"Mossy Stone Brick Wall","5302304":"Mossy Stone Brick Wall","5302305":"Mossy Stone Brick Wall","5302306":"Mossy Stone Brick Wall","5302308":"Mossy Stone Brick Wall","5302309":"Mossy Stone Brick Wall","5302310":"Mossy Stone Brick Wall","5302312":"Mossy Stone Brick Wall","5302313":"Mossy Stone Brick Wall","5302314":"Mossy Stone Brick Wall","5302336":"Mossy Stone Brick Wall","5302337":"Mossy Stone Brick Wall","5302338":"Mossy Stone Brick Wall","5302340":"Mossy Stone Brick Wall","5302341":"Mossy Stone Brick Wall","5302342":"Mossy Stone Brick Wall","5302344":"Mossy Stone Brick Wall","5302345":"Mossy Stone Brick Wall","5302346":"Mossy Stone Brick Wall","5302352":"Mossy Stone Brick Wall","5302353":"Mossy Stone Brick Wall","5302354":"Mossy Stone Brick Wall","5302356":"Mossy Stone Brick Wall","5302357":"Mossy Stone Brick Wall","5302358":"Mossy Stone Brick Wall","5302360":"Mossy Stone Brick Wall","5302361":"Mossy Stone Brick Wall","5302362":"Mossy Stone Brick Wall","5302368":"Mossy Stone Brick Wall","5302369":"Mossy Stone Brick Wall","5302370":"Mossy Stone Brick Wall","5302372":"Mossy Stone Brick Wall","5302373":"Mossy Stone Brick Wall","5302374":"Mossy Stone Brick Wall","5302376":"Mossy Stone Brick Wall","5302377":"Mossy Stone Brick Wall","5302378":"Mossy Stone Brick Wall","5302400":"Mossy Stone Brick Wall","5302401":"Mossy Stone Brick Wall","5302402":"Mossy Stone Brick Wall","5302404":"Mossy Stone Brick Wall","5302405":"Mossy Stone Brick Wall","5302406":"Mossy Stone Brick Wall","5302408":"Mossy Stone Brick Wall","5302409":"Mossy Stone Brick Wall","5302410":"Mossy Stone Brick Wall","5302416":"Mossy Stone Brick Wall","5302417":"Mossy Stone Brick Wall","5302418":"Mossy Stone Brick Wall","5302420":"Mossy Stone Brick Wall","5302421":"Mossy Stone Brick Wall","5302422":"Mossy Stone Brick Wall","5302424":"Mossy Stone Brick Wall","5302425":"Mossy Stone Brick Wall","5302426":"Mossy Stone Brick Wall","5302432":"Mossy Stone Brick Wall","5302433":"Mossy Stone Brick Wall","5302434":"Mossy Stone Brick Wall","5302436":"Mossy Stone Brick Wall","5302437":"Mossy Stone Brick Wall","5302438":"Mossy Stone Brick Wall","5302440":"Mossy Stone Brick Wall","5302441":"Mossy Stone Brick Wall","5302442":"Mossy Stone Brick Wall","5302528":"Mossy Stone Brick Wall","5302529":"Mossy Stone Brick Wall","5302530":"Mossy Stone Brick Wall","5302532":"Mossy Stone Brick Wall","5302533":"Mossy Stone Brick Wall","5302534":"Mossy Stone Brick Wall","5302536":"Mossy Stone Brick Wall","5302537":"Mossy Stone Brick Wall","5302538":"Mossy Stone Brick Wall","5302544":"Mossy Stone Brick Wall","5302545":"Mossy Stone Brick Wall","5302546":"Mossy Stone Brick Wall","5302548":"Mossy Stone Brick Wall","5302549":"Mossy Stone Brick Wall","5302550":"Mossy Stone Brick Wall","5302552":"Mossy Stone Brick Wall","5302553":"Mossy Stone Brick Wall","5302554":"Mossy Stone Brick Wall","5302560":"Mossy Stone Brick Wall","5302561":"Mossy Stone Brick Wall","5302562":"Mossy Stone Brick Wall","5302564":"Mossy Stone Brick Wall","5302565":"Mossy Stone Brick Wall","5302566":"Mossy Stone Brick Wall","5302568":"Mossy Stone Brick Wall","5302569":"Mossy Stone Brick Wall","5302570":"Mossy Stone Brick Wall","5302592":"Mossy Stone Brick Wall","5302593":"Mossy Stone Brick Wall","5302594":"Mossy Stone Brick Wall","5302596":"Mossy Stone Brick Wall","5302597":"Mossy Stone Brick Wall","5302598":"Mossy Stone Brick Wall","5302600":"Mossy Stone Brick Wall","5302601":"Mossy Stone Brick Wall","5302602":"Mossy Stone Brick Wall","5302608":"Mossy Stone Brick Wall","5302609":"Mossy Stone Brick Wall","5302610":"Mossy Stone Brick Wall","5302612":"Mossy Stone Brick Wall","5302613":"Mossy Stone Brick Wall","5302614":"Mossy Stone Brick Wall","5302616":"Mossy Stone Brick Wall","5302617":"Mossy Stone Brick Wall","5302618":"Mossy Stone Brick Wall","5302624":"Mossy Stone Brick Wall","5302625":"Mossy Stone Brick Wall","5302626":"Mossy Stone Brick Wall","5302628":"Mossy Stone Brick Wall","5302629":"Mossy Stone Brick Wall","5302630":"Mossy Stone Brick Wall","5302632":"Mossy Stone Brick Wall","5302633":"Mossy Stone Brick Wall","5302634":"Mossy Stone Brick Wall","5302656":"Mossy Stone Brick Wall","5302657":"Mossy Stone Brick Wall","5302658":"Mossy Stone Brick Wall","5302660":"Mossy Stone Brick Wall","5302661":"Mossy Stone Brick Wall","5302662":"Mossy Stone Brick Wall","5302664":"Mossy Stone Brick Wall","5302665":"Mossy Stone Brick Wall","5302666":"Mossy Stone Brick Wall","5302672":"Mossy Stone Brick Wall","5302673":"Mossy Stone Brick Wall","5302674":"Mossy Stone Brick Wall","5302676":"Mossy Stone Brick Wall","5302677":"Mossy Stone Brick Wall","5302678":"Mossy Stone Brick Wall","5302680":"Mossy Stone Brick Wall","5302681":"Mossy Stone Brick Wall","5302682":"Mossy Stone Brick Wall","5302688":"Mossy Stone Brick Wall","5302689":"Mossy Stone Brick Wall","5302690":"Mossy Stone Brick Wall","5302692":"Mossy Stone Brick Wall","5302693":"Mossy Stone Brick Wall","5302694":"Mossy Stone Brick Wall","5302696":"Mossy Stone Brick Wall","5302697":"Mossy Stone Brick Wall","5302698":"Mossy Stone Brick Wall","5300736":"Mossy Cobblestone Wall","5300737":"Mossy Cobblestone Wall","5300738":"Mossy Cobblestone Wall","5300740":"Mossy Cobblestone Wall","5300741":"Mossy Cobblestone Wall","5300742":"Mossy Cobblestone Wall","5300744":"Mossy Cobblestone Wall","5300745":"Mossy Cobblestone Wall","5300746":"Mossy Cobblestone Wall","5300752":"Mossy Cobblestone Wall","5300753":"Mossy Cobblestone Wall","5300754":"Mossy Cobblestone Wall","5300756":"Mossy Cobblestone Wall","5300757":"Mossy Cobblestone Wall","5300758":"Mossy Cobblestone Wall","5300760":"Mossy Cobblestone Wall","5300761":"Mossy Cobblestone Wall","5300762":"Mossy Cobblestone Wall","5300768":"Mossy Cobblestone Wall","5300769":"Mossy Cobblestone Wall","5300770":"Mossy Cobblestone Wall","5300772":"Mossy Cobblestone Wall","5300773":"Mossy Cobblestone Wall","5300774":"Mossy Cobblestone Wall","5300776":"Mossy Cobblestone Wall","5300777":"Mossy Cobblestone Wall","5300778":"Mossy Cobblestone Wall","5300800":"Mossy Cobblestone Wall","5300801":"Mossy Cobblestone Wall","5300802":"Mossy Cobblestone Wall","5300804":"Mossy Cobblestone Wall","5300805":"Mossy Cobblestone Wall","5300806":"Mossy Cobblestone Wall","5300808":"Mossy Cobblestone Wall","5300809":"Mossy Cobblestone Wall","5300810":"Mossy Cobblestone Wall","5300816":"Mossy Cobblestone Wall","5300817":"Mossy Cobblestone Wall","5300818":"Mossy Cobblestone Wall","5300820":"Mossy Cobblestone Wall","5300821":"Mossy Cobblestone Wall","5300822":"Mossy Cobblestone Wall","5300824":"Mossy Cobblestone Wall","5300825":"Mossy Cobblestone Wall","5300826":"Mossy Cobblestone Wall","5300832":"Mossy Cobblestone Wall","5300833":"Mossy Cobblestone Wall","5300834":"Mossy Cobblestone Wall","5300836":"Mossy Cobblestone Wall","5300837":"Mossy Cobblestone Wall","5300838":"Mossy Cobblestone Wall","5300840":"Mossy Cobblestone Wall","5300841":"Mossy Cobblestone Wall","5300842":"Mossy Cobblestone Wall","5300864":"Mossy Cobblestone Wall","5300865":"Mossy Cobblestone Wall","5300866":"Mossy Cobblestone Wall","5300868":"Mossy Cobblestone Wall","5300869":"Mossy Cobblestone Wall","5300870":"Mossy Cobblestone Wall","5300872":"Mossy Cobblestone Wall","5300873":"Mossy Cobblestone Wall","5300874":"Mossy Cobblestone Wall","5300880":"Mossy Cobblestone Wall","5300881":"Mossy Cobblestone Wall","5300882":"Mossy Cobblestone Wall","5300884":"Mossy Cobblestone Wall","5300885":"Mossy Cobblestone Wall","5300886":"Mossy Cobblestone Wall","5300888":"Mossy Cobblestone Wall","5300889":"Mossy Cobblestone Wall","5300890":"Mossy Cobblestone Wall","5300896":"Mossy Cobblestone Wall","5300897":"Mossy Cobblestone Wall","5300898":"Mossy Cobblestone Wall","5300900":"Mossy Cobblestone Wall","5300901":"Mossy Cobblestone Wall","5300902":"Mossy Cobblestone Wall","5300904":"Mossy Cobblestone Wall","5300905":"Mossy Cobblestone Wall","5300906":"Mossy Cobblestone Wall","5300992":"Mossy Cobblestone Wall","5300993":"Mossy Cobblestone Wall","5300994":"Mossy Cobblestone Wall","5300996":"Mossy Cobblestone Wall","5300997":"Mossy Cobblestone Wall","5300998":"Mossy Cobblestone Wall","5301000":"Mossy Cobblestone Wall","5301001":"Mossy Cobblestone Wall","5301002":"Mossy Cobblestone Wall","5301008":"Mossy Cobblestone Wall","5301009":"Mossy Cobblestone Wall","5301010":"Mossy Cobblestone Wall","5301012":"Mossy Cobblestone Wall","5301013":"Mossy Cobblestone Wall","5301014":"Mossy Cobblestone Wall","5301016":"Mossy Cobblestone Wall","5301017":"Mossy Cobblestone Wall","5301018":"Mossy Cobblestone Wall","5301024":"Mossy Cobblestone Wall","5301025":"Mossy Cobblestone Wall","5301026":"Mossy Cobblestone Wall","5301028":"Mossy Cobblestone Wall","5301029":"Mossy Cobblestone Wall","5301030":"Mossy Cobblestone Wall","5301032":"Mossy Cobblestone Wall","5301033":"Mossy Cobblestone Wall","5301034":"Mossy Cobblestone Wall","5301056":"Mossy Cobblestone Wall","5301057":"Mossy Cobblestone Wall","5301058":"Mossy Cobblestone Wall","5301060":"Mossy Cobblestone Wall","5301061":"Mossy Cobblestone Wall","5301062":"Mossy Cobblestone Wall","5301064":"Mossy Cobblestone Wall","5301065":"Mossy Cobblestone Wall","5301066":"Mossy Cobblestone Wall","5301072":"Mossy Cobblestone Wall","5301073":"Mossy Cobblestone Wall","5301074":"Mossy Cobblestone Wall","5301076":"Mossy Cobblestone Wall","5301077":"Mossy Cobblestone Wall","5301078":"Mossy Cobblestone Wall","5301080":"Mossy Cobblestone Wall","5301081":"Mossy Cobblestone Wall","5301082":"Mossy Cobblestone Wall","5301088":"Mossy Cobblestone Wall","5301089":"Mossy Cobblestone Wall","5301090":"Mossy Cobblestone Wall","5301092":"Mossy Cobblestone Wall","5301093":"Mossy Cobblestone Wall","5301094":"Mossy Cobblestone Wall","5301096":"Mossy Cobblestone Wall","5301097":"Mossy Cobblestone Wall","5301098":"Mossy Cobblestone Wall","5301120":"Mossy Cobblestone Wall","5301121":"Mossy Cobblestone Wall","5301122":"Mossy Cobblestone Wall","5301124":"Mossy Cobblestone Wall","5301125":"Mossy Cobblestone Wall","5301126":"Mossy Cobblestone Wall","5301128":"Mossy Cobblestone Wall","5301129":"Mossy Cobblestone Wall","5301130":"Mossy Cobblestone Wall","5301136":"Mossy Cobblestone Wall","5301137":"Mossy Cobblestone Wall","5301138":"Mossy Cobblestone Wall","5301140":"Mossy Cobblestone Wall","5301141":"Mossy Cobblestone Wall","5301142":"Mossy Cobblestone Wall","5301144":"Mossy Cobblestone Wall","5301145":"Mossy Cobblestone Wall","5301146":"Mossy Cobblestone Wall","5301152":"Mossy Cobblestone Wall","5301153":"Mossy Cobblestone Wall","5301154":"Mossy Cobblestone Wall","5301156":"Mossy Cobblestone Wall","5301157":"Mossy Cobblestone Wall","5301158":"Mossy Cobblestone Wall","5301160":"Mossy Cobblestone Wall","5301161":"Mossy Cobblestone Wall","5301162":"Mossy Cobblestone Wall","5305856":"Nether Brick Wall","5305857":"Nether Brick Wall","5305858":"Nether Brick Wall","5305860":"Nether Brick Wall","5305861":"Nether Brick Wall","5305862":"Nether Brick Wall","5305864":"Nether Brick Wall","5305865":"Nether Brick Wall","5305866":"Nether Brick Wall","5305872":"Nether Brick Wall","5305873":"Nether Brick Wall","5305874":"Nether Brick Wall","5305876":"Nether Brick Wall","5305877":"Nether Brick Wall","5305878":"Nether Brick Wall","5305880":"Nether Brick Wall","5305881":"Nether Brick Wall","5305882":"Nether Brick Wall","5305888":"Nether Brick Wall","5305889":"Nether Brick Wall","5305890":"Nether Brick Wall","5305892":"Nether Brick Wall","5305893":"Nether Brick Wall","5305894":"Nether Brick Wall","5305896":"Nether Brick Wall","5305897":"Nether Brick Wall","5305898":"Nether Brick Wall","5305920":"Nether Brick Wall","5305921":"Nether Brick Wall","5305922":"Nether Brick Wall","5305924":"Nether Brick Wall","5305925":"Nether Brick Wall","5305926":"Nether Brick Wall","5305928":"Nether Brick Wall","5305929":"Nether Brick Wall","5305930":"Nether Brick Wall","5305936":"Nether Brick Wall","5305937":"Nether Brick Wall","5305938":"Nether Brick Wall","5305940":"Nether Brick Wall","5305941":"Nether Brick Wall","5305942":"Nether Brick Wall","5305944":"Nether Brick Wall","5305945":"Nether Brick Wall","5305946":"Nether Brick Wall","5305952":"Nether Brick Wall","5305953":"Nether Brick Wall","5305954":"Nether Brick Wall","5305956":"Nether Brick Wall","5305957":"Nether Brick Wall","5305958":"Nether Brick Wall","5305960":"Nether Brick Wall","5305961":"Nether Brick Wall","5305962":"Nether Brick Wall","5305984":"Nether Brick Wall","5305985":"Nether Brick Wall","5305986":"Nether Brick Wall","5305988":"Nether Brick Wall","5305989":"Nether Brick Wall","5305990":"Nether Brick Wall","5305992":"Nether Brick Wall","5305993":"Nether Brick Wall","5305994":"Nether Brick Wall","5306000":"Nether Brick Wall","5306001":"Nether Brick Wall","5306002":"Nether Brick Wall","5306004":"Nether Brick Wall","5306005":"Nether Brick Wall","5306006":"Nether Brick Wall","5306008":"Nether Brick Wall","5306009":"Nether Brick Wall","5306010":"Nether Brick Wall","5306016":"Nether Brick Wall","5306017":"Nether Brick Wall","5306018":"Nether Brick Wall","5306020":"Nether Brick Wall","5306021":"Nether Brick Wall","5306022":"Nether Brick Wall","5306024":"Nether Brick Wall","5306025":"Nether Brick Wall","5306026":"Nether Brick Wall","5306112":"Nether Brick Wall","5306113":"Nether Brick Wall","5306114":"Nether Brick Wall","5306116":"Nether Brick Wall","5306117":"Nether Brick Wall","5306118":"Nether Brick Wall","5306120":"Nether Brick Wall","5306121":"Nether Brick Wall","5306122":"Nether Brick Wall","5306128":"Nether Brick Wall","5306129":"Nether Brick Wall","5306130":"Nether Brick Wall","5306132":"Nether Brick Wall","5306133":"Nether Brick Wall","5306134":"Nether Brick Wall","5306136":"Nether Brick Wall","5306137":"Nether Brick Wall","5306138":"Nether Brick Wall","5306144":"Nether Brick Wall","5306145":"Nether Brick Wall","5306146":"Nether Brick Wall","5306148":"Nether Brick Wall","5306149":"Nether Brick Wall","5306150":"Nether Brick Wall","5306152":"Nether Brick Wall","5306153":"Nether Brick Wall","5306154":"Nether Brick Wall","5306176":"Nether Brick Wall","5306177":"Nether Brick Wall","5306178":"Nether Brick Wall","5306180":"Nether Brick Wall","5306181":"Nether Brick Wall","5306182":"Nether Brick Wall","5306184":"Nether Brick Wall","5306185":"Nether Brick Wall","5306186":"Nether Brick Wall","5306192":"Nether Brick Wall","5306193":"Nether Brick Wall","5306194":"Nether Brick Wall","5306196":"Nether Brick Wall","5306197":"Nether Brick Wall","5306198":"Nether Brick Wall","5306200":"Nether Brick Wall","5306201":"Nether Brick Wall","5306202":"Nether Brick Wall","5306208":"Nether Brick Wall","5306209":"Nether Brick Wall","5306210":"Nether Brick Wall","5306212":"Nether Brick Wall","5306213":"Nether Brick Wall","5306214":"Nether Brick Wall","5306216":"Nether Brick Wall","5306217":"Nether Brick Wall","5306218":"Nether Brick Wall","5306240":"Nether Brick Wall","5306241":"Nether Brick Wall","5306242":"Nether Brick Wall","5306244":"Nether Brick Wall","5306245":"Nether Brick Wall","5306246":"Nether Brick Wall","5306248":"Nether Brick Wall","5306249":"Nether Brick Wall","5306250":"Nether Brick Wall","5306256":"Nether Brick Wall","5306257":"Nether Brick Wall","5306258":"Nether Brick Wall","5306260":"Nether Brick Wall","5306261":"Nether Brick Wall","5306262":"Nether Brick Wall","5306264":"Nether Brick Wall","5306265":"Nether Brick Wall","5306266":"Nether Brick Wall","5306272":"Nether Brick Wall","5306273":"Nether Brick Wall","5306274":"Nether Brick Wall","5306276":"Nether Brick Wall","5306277":"Nether Brick Wall","5306278":"Nether Brick Wall","5306280":"Nether Brick Wall","5306281":"Nether Brick Wall","5306282":"Nether Brick Wall","5331968":"Prismarine Wall","5331969":"Prismarine Wall","5331970":"Prismarine Wall","5331972":"Prismarine Wall","5331973":"Prismarine Wall","5331974":"Prismarine Wall","5331976":"Prismarine Wall","5331977":"Prismarine Wall","5331978":"Prismarine Wall","5331984":"Prismarine Wall","5331985":"Prismarine Wall","5331986":"Prismarine Wall","5331988":"Prismarine Wall","5331989":"Prismarine Wall","5331990":"Prismarine Wall","5331992":"Prismarine Wall","5331993":"Prismarine Wall","5331994":"Prismarine Wall","5332000":"Prismarine Wall","5332001":"Prismarine Wall","5332002":"Prismarine Wall","5332004":"Prismarine Wall","5332005":"Prismarine Wall","5332006":"Prismarine Wall","5332008":"Prismarine Wall","5332009":"Prismarine Wall","5332010":"Prismarine Wall","5332032":"Prismarine Wall","5332033":"Prismarine Wall","5332034":"Prismarine Wall","5332036":"Prismarine Wall","5332037":"Prismarine Wall","5332038":"Prismarine Wall","5332040":"Prismarine Wall","5332041":"Prismarine Wall","5332042":"Prismarine Wall","5332048":"Prismarine Wall","5332049":"Prismarine Wall","5332050":"Prismarine Wall","5332052":"Prismarine Wall","5332053":"Prismarine Wall","5332054":"Prismarine Wall","5332056":"Prismarine Wall","5332057":"Prismarine Wall","5332058":"Prismarine Wall","5332064":"Prismarine Wall","5332065":"Prismarine Wall","5332066":"Prismarine Wall","5332068":"Prismarine Wall","5332069":"Prismarine Wall","5332070":"Prismarine Wall","5332072":"Prismarine Wall","5332073":"Prismarine Wall","5332074":"Prismarine Wall","5332096":"Prismarine Wall","5332097":"Prismarine Wall","5332098":"Prismarine Wall","5332100":"Prismarine Wall","5332101":"Prismarine Wall","5332102":"Prismarine Wall","5332104":"Prismarine Wall","5332105":"Prismarine Wall","5332106":"Prismarine Wall","5332112":"Prismarine Wall","5332113":"Prismarine Wall","5332114":"Prismarine Wall","5332116":"Prismarine Wall","5332117":"Prismarine Wall","5332118":"Prismarine Wall","5332120":"Prismarine Wall","5332121":"Prismarine Wall","5332122":"Prismarine Wall","5332128":"Prismarine Wall","5332129":"Prismarine Wall","5332130":"Prismarine Wall","5332132":"Prismarine Wall","5332133":"Prismarine Wall","5332134":"Prismarine Wall","5332136":"Prismarine Wall","5332137":"Prismarine Wall","5332138":"Prismarine Wall","5332224":"Prismarine Wall","5332225":"Prismarine Wall","5332226":"Prismarine Wall","5332228":"Prismarine Wall","5332229":"Prismarine Wall","5332230":"Prismarine Wall","5332232":"Prismarine Wall","5332233":"Prismarine Wall","5332234":"Prismarine Wall","5332240":"Prismarine Wall","5332241":"Prismarine Wall","5332242":"Prismarine Wall","5332244":"Prismarine Wall","5332245":"Prismarine Wall","5332246":"Prismarine Wall","5332248":"Prismarine Wall","5332249":"Prismarine Wall","5332250":"Prismarine Wall","5332256":"Prismarine Wall","5332257":"Prismarine Wall","5332258":"Prismarine Wall","5332260":"Prismarine Wall","5332261":"Prismarine Wall","5332262":"Prismarine Wall","5332264":"Prismarine Wall","5332265":"Prismarine Wall","5332266":"Prismarine Wall","5332288":"Prismarine Wall","5332289":"Prismarine Wall","5332290":"Prismarine Wall","5332292":"Prismarine Wall","5332293":"Prismarine Wall","5332294":"Prismarine Wall","5332296":"Prismarine Wall","5332297":"Prismarine Wall","5332298":"Prismarine Wall","5332304":"Prismarine Wall","5332305":"Prismarine Wall","5332306":"Prismarine Wall","5332308":"Prismarine Wall","5332309":"Prismarine Wall","5332310":"Prismarine Wall","5332312":"Prismarine Wall","5332313":"Prismarine Wall","5332314":"Prismarine Wall","5332320":"Prismarine Wall","5332321":"Prismarine Wall","5332322":"Prismarine Wall","5332324":"Prismarine Wall","5332325":"Prismarine Wall","5332326":"Prismarine Wall","5332328":"Prismarine Wall","5332329":"Prismarine Wall","5332330":"Prismarine Wall","5332352":"Prismarine Wall","5332353":"Prismarine Wall","5332354":"Prismarine Wall","5332356":"Prismarine Wall","5332357":"Prismarine Wall","5332358":"Prismarine Wall","5332360":"Prismarine Wall","5332361":"Prismarine Wall","5332362":"Prismarine Wall","5332368":"Prismarine Wall","5332369":"Prismarine Wall","5332370":"Prismarine Wall","5332372":"Prismarine Wall","5332373":"Prismarine Wall","5332374":"Prismarine Wall","5332376":"Prismarine Wall","5332377":"Prismarine Wall","5332378":"Prismarine Wall","5332384":"Prismarine Wall","5332385":"Prismarine Wall","5332386":"Prismarine Wall","5332388":"Prismarine Wall","5332389":"Prismarine Wall","5332390":"Prismarine Wall","5332392":"Prismarine Wall","5332393":"Prismarine Wall","5332394":"Prismarine Wall","5341696":"Red Nether Brick Wall","5341697":"Red Nether Brick Wall","5341698":"Red Nether Brick Wall","5341700":"Red Nether Brick Wall","5341701":"Red Nether Brick Wall","5341702":"Red Nether Brick Wall","5341704":"Red Nether Brick Wall","5341705":"Red Nether Brick Wall","5341706":"Red Nether Brick Wall","5341712":"Red Nether Brick Wall","5341713":"Red Nether Brick Wall","5341714":"Red Nether Brick Wall","5341716":"Red Nether Brick Wall","5341717":"Red Nether Brick Wall","5341718":"Red Nether Brick Wall","5341720":"Red Nether Brick Wall","5341721":"Red Nether Brick Wall","5341722":"Red Nether Brick Wall","5341728":"Red Nether Brick Wall","5341729":"Red Nether Brick Wall","5341730":"Red Nether Brick Wall","5341732":"Red Nether Brick Wall","5341733":"Red Nether Brick Wall","5341734":"Red Nether Brick Wall","5341736":"Red Nether Brick Wall","5341737":"Red Nether Brick Wall","5341738":"Red Nether Brick Wall","5341760":"Red Nether Brick Wall","5341761":"Red Nether Brick Wall","5341762":"Red Nether Brick Wall","5341764":"Red Nether Brick Wall","5341765":"Red Nether Brick Wall","5341766":"Red Nether Brick Wall","5341768":"Red Nether Brick Wall","5341769":"Red Nether Brick Wall","5341770":"Red Nether Brick Wall","5341776":"Red Nether Brick Wall","5341777":"Red Nether Brick Wall","5341778":"Red Nether Brick Wall","5341780":"Red Nether Brick Wall","5341781":"Red Nether Brick Wall","5341782":"Red Nether Brick Wall","5341784":"Red Nether Brick Wall","5341785":"Red Nether Brick Wall","5341786":"Red Nether Brick Wall","5341792":"Red Nether Brick Wall","5341793":"Red Nether Brick Wall","5341794":"Red Nether Brick Wall","5341796":"Red Nether Brick Wall","5341797":"Red Nether Brick Wall","5341798":"Red Nether Brick Wall","5341800":"Red Nether Brick Wall","5341801":"Red Nether Brick Wall","5341802":"Red Nether Brick Wall","5341824":"Red Nether Brick Wall","5341825":"Red Nether Brick Wall","5341826":"Red Nether Brick Wall","5341828":"Red Nether Brick Wall","5341829":"Red Nether Brick Wall","5341830":"Red Nether Brick Wall","5341832":"Red Nether Brick Wall","5341833":"Red Nether Brick Wall","5341834":"Red Nether Brick Wall","5341840":"Red Nether Brick Wall","5341841":"Red Nether Brick Wall","5341842":"Red Nether Brick Wall","5341844":"Red Nether Brick Wall","5341845":"Red Nether Brick Wall","5341846":"Red Nether Brick Wall","5341848":"Red Nether Brick Wall","5341849":"Red Nether Brick Wall","5341850":"Red Nether Brick Wall","5341856":"Red Nether Brick Wall","5341857":"Red Nether Brick Wall","5341858":"Red Nether Brick Wall","5341860":"Red Nether Brick Wall","5341861":"Red Nether Brick Wall","5341862":"Red Nether Brick Wall","5341864":"Red Nether Brick Wall","5341865":"Red Nether Brick Wall","5341866":"Red Nether Brick Wall","5341952":"Red Nether Brick Wall","5341953":"Red Nether Brick Wall","5341954":"Red Nether Brick Wall","5341956":"Red Nether Brick Wall","5341957":"Red Nether Brick Wall","5341958":"Red Nether Brick Wall","5341960":"Red Nether Brick Wall","5341961":"Red Nether Brick Wall","5341962":"Red Nether Brick Wall","5341968":"Red Nether Brick Wall","5341969":"Red Nether Brick Wall","5341970":"Red Nether Brick Wall","5341972":"Red Nether Brick Wall","5341973":"Red Nether Brick Wall","5341974":"Red Nether Brick Wall","5341976":"Red Nether Brick Wall","5341977":"Red Nether Brick Wall","5341978":"Red Nether Brick Wall","5341984":"Red Nether Brick Wall","5341985":"Red Nether Brick Wall","5341986":"Red Nether Brick Wall","5341988":"Red Nether Brick Wall","5341989":"Red Nether Brick Wall","5341990":"Red Nether Brick Wall","5341992":"Red Nether Brick Wall","5341993":"Red Nether Brick Wall","5341994":"Red Nether Brick Wall","5342016":"Red Nether Brick Wall","5342017":"Red Nether Brick Wall","5342018":"Red Nether Brick Wall","5342020":"Red Nether Brick Wall","5342021":"Red Nether Brick Wall","5342022":"Red Nether Brick Wall","5342024":"Red Nether Brick Wall","5342025":"Red Nether Brick Wall","5342026":"Red Nether Brick Wall","5342032":"Red Nether Brick Wall","5342033":"Red Nether Brick Wall","5342034":"Red Nether Brick Wall","5342036":"Red Nether Brick Wall","5342037":"Red Nether Brick Wall","5342038":"Red Nether Brick Wall","5342040":"Red Nether Brick Wall","5342041":"Red Nether Brick Wall","5342042":"Red Nether Brick Wall","5342048":"Red Nether Brick Wall","5342049":"Red Nether Brick Wall","5342050":"Red Nether Brick Wall","5342052":"Red Nether Brick Wall","5342053":"Red Nether Brick Wall","5342054":"Red Nether Brick Wall","5342056":"Red Nether Brick Wall","5342057":"Red Nether Brick Wall","5342058":"Red Nether Brick Wall","5342080":"Red Nether Brick Wall","5342081":"Red Nether Brick Wall","5342082":"Red Nether Brick Wall","5342084":"Red Nether Brick Wall","5342085":"Red Nether Brick Wall","5342086":"Red Nether Brick Wall","5342088":"Red Nether Brick Wall","5342089":"Red Nether Brick Wall","5342090":"Red Nether Brick Wall","5342096":"Red Nether Brick Wall","5342097":"Red Nether Brick Wall","5342098":"Red Nether Brick Wall","5342100":"Red Nether Brick Wall","5342101":"Red Nether Brick Wall","5342102":"Red Nether Brick Wall","5342104":"Red Nether Brick Wall","5342105":"Red Nether Brick Wall","5342106":"Red Nether Brick Wall","5342112":"Red Nether Brick Wall","5342113":"Red Nether Brick Wall","5342114":"Red Nether Brick Wall","5342116":"Red Nether Brick Wall","5342117":"Red Nether Brick Wall","5342118":"Red Nether Brick Wall","5342120":"Red Nether Brick Wall","5342121":"Red Nether Brick Wall","5342122":"Red Nether Brick Wall","5344768":"Red Sandstone Wall","5344769":"Red Sandstone Wall","5344770":"Red Sandstone Wall","5344772":"Red Sandstone Wall","5344773":"Red Sandstone Wall","5344774":"Red Sandstone Wall","5344776":"Red Sandstone Wall","5344777":"Red Sandstone Wall","5344778":"Red Sandstone Wall","5344784":"Red Sandstone Wall","5344785":"Red Sandstone Wall","5344786":"Red Sandstone Wall","5344788":"Red Sandstone Wall","5344789":"Red Sandstone Wall","5344790":"Red Sandstone Wall","5344792":"Red Sandstone Wall","5344793":"Red Sandstone Wall","5344794":"Red Sandstone Wall","5344800":"Red Sandstone Wall","5344801":"Red Sandstone Wall","5344802":"Red Sandstone Wall","5344804":"Red Sandstone Wall","5344805":"Red Sandstone Wall","5344806":"Red Sandstone Wall","5344808":"Red Sandstone Wall","5344809":"Red Sandstone Wall","5344810":"Red Sandstone Wall","5344832":"Red Sandstone Wall","5344833":"Red Sandstone Wall","5344834":"Red Sandstone Wall","5344836":"Red Sandstone Wall","5344837":"Red Sandstone Wall","5344838":"Red Sandstone Wall","5344840":"Red Sandstone Wall","5344841":"Red Sandstone Wall","5344842":"Red Sandstone Wall","5344848":"Red Sandstone Wall","5344849":"Red Sandstone Wall","5344850":"Red Sandstone Wall","5344852":"Red Sandstone Wall","5344853":"Red Sandstone Wall","5344854":"Red Sandstone Wall","5344856":"Red Sandstone Wall","5344857":"Red Sandstone Wall","5344858":"Red Sandstone Wall","5344864":"Red Sandstone Wall","5344865":"Red Sandstone Wall","5344866":"Red Sandstone Wall","5344868":"Red Sandstone Wall","5344869":"Red Sandstone Wall","5344870":"Red Sandstone Wall","5344872":"Red Sandstone Wall","5344873":"Red Sandstone Wall","5344874":"Red Sandstone Wall","5344896":"Red Sandstone Wall","5344897":"Red Sandstone Wall","5344898":"Red Sandstone Wall","5344900":"Red Sandstone Wall","5344901":"Red Sandstone Wall","5344902":"Red Sandstone Wall","5344904":"Red Sandstone Wall","5344905":"Red Sandstone Wall","5344906":"Red Sandstone Wall","5344912":"Red Sandstone Wall","5344913":"Red Sandstone Wall","5344914":"Red Sandstone Wall","5344916":"Red Sandstone Wall","5344917":"Red Sandstone Wall","5344918":"Red Sandstone Wall","5344920":"Red Sandstone Wall","5344921":"Red Sandstone Wall","5344922":"Red Sandstone Wall","5344928":"Red Sandstone Wall","5344929":"Red Sandstone Wall","5344930":"Red Sandstone Wall","5344932":"Red Sandstone Wall","5344933":"Red Sandstone Wall","5344934":"Red Sandstone Wall","5344936":"Red Sandstone Wall","5344937":"Red Sandstone Wall","5344938":"Red Sandstone Wall","5345024":"Red Sandstone Wall","5345025":"Red Sandstone Wall","5345026":"Red Sandstone Wall","5345028":"Red Sandstone Wall","5345029":"Red Sandstone Wall","5345030":"Red Sandstone Wall","5345032":"Red Sandstone Wall","5345033":"Red Sandstone Wall","5345034":"Red Sandstone Wall","5345040":"Red Sandstone Wall","5345041":"Red Sandstone Wall","5345042":"Red Sandstone Wall","5345044":"Red Sandstone Wall","5345045":"Red Sandstone Wall","5345046":"Red Sandstone Wall","5345048":"Red Sandstone Wall","5345049":"Red Sandstone Wall","5345050":"Red Sandstone Wall","5345056":"Red Sandstone Wall","5345057":"Red Sandstone Wall","5345058":"Red Sandstone Wall","5345060":"Red Sandstone Wall","5345061":"Red Sandstone Wall","5345062":"Red Sandstone Wall","5345064":"Red Sandstone Wall","5345065":"Red Sandstone Wall","5345066":"Red Sandstone Wall","5345088":"Red Sandstone Wall","5345089":"Red Sandstone Wall","5345090":"Red Sandstone Wall","5345092":"Red Sandstone Wall","5345093":"Red Sandstone Wall","5345094":"Red Sandstone Wall","5345096":"Red Sandstone Wall","5345097":"Red Sandstone Wall","5345098":"Red Sandstone Wall","5345104":"Red Sandstone Wall","5345105":"Red Sandstone Wall","5345106":"Red Sandstone Wall","5345108":"Red Sandstone Wall","5345109":"Red Sandstone Wall","5345110":"Red Sandstone Wall","5345112":"Red Sandstone Wall","5345113":"Red Sandstone Wall","5345114":"Red Sandstone Wall","5345120":"Red Sandstone Wall","5345121":"Red Sandstone Wall","5345122":"Red Sandstone Wall","5345124":"Red Sandstone Wall","5345125":"Red Sandstone Wall","5345126":"Red Sandstone Wall","5345128":"Red Sandstone Wall","5345129":"Red Sandstone Wall","5345130":"Red Sandstone Wall","5345152":"Red Sandstone Wall","5345153":"Red Sandstone Wall","5345154":"Red Sandstone Wall","5345156":"Red Sandstone Wall","5345157":"Red Sandstone Wall","5345158":"Red Sandstone Wall","5345160":"Red Sandstone Wall","5345161":"Red Sandstone Wall","5345162":"Red Sandstone Wall","5345168":"Red Sandstone Wall","5345169":"Red Sandstone Wall","5345170":"Red Sandstone Wall","5345172":"Red Sandstone Wall","5345173":"Red Sandstone Wall","5345174":"Red Sandstone Wall","5345176":"Red Sandstone Wall","5345177":"Red Sandstone Wall","5345178":"Red Sandstone Wall","5345184":"Red Sandstone Wall","5345185":"Red Sandstone Wall","5345186":"Red Sandstone Wall","5345188":"Red Sandstone Wall","5345189":"Red Sandstone Wall","5345190":"Red Sandstone Wall","5345192":"Red Sandstone Wall","5345193":"Red Sandstone Wall","5345194":"Red Sandstone Wall","5352960":"Sandstone Wall","5352961":"Sandstone Wall","5352962":"Sandstone Wall","5352964":"Sandstone Wall","5352965":"Sandstone Wall","5352966":"Sandstone Wall","5352968":"Sandstone Wall","5352969":"Sandstone Wall","5352970":"Sandstone Wall","5352976":"Sandstone Wall","5352977":"Sandstone Wall","5352978":"Sandstone Wall","5352980":"Sandstone Wall","5352981":"Sandstone Wall","5352982":"Sandstone Wall","5352984":"Sandstone Wall","5352985":"Sandstone Wall","5352986":"Sandstone Wall","5352992":"Sandstone Wall","5352993":"Sandstone Wall","5352994":"Sandstone Wall","5352996":"Sandstone Wall","5352997":"Sandstone Wall","5352998":"Sandstone Wall","5353000":"Sandstone Wall","5353001":"Sandstone Wall","5353002":"Sandstone Wall","5353024":"Sandstone Wall","5353025":"Sandstone Wall","5353026":"Sandstone Wall","5353028":"Sandstone Wall","5353029":"Sandstone Wall","5353030":"Sandstone Wall","5353032":"Sandstone Wall","5353033":"Sandstone Wall","5353034":"Sandstone Wall","5353040":"Sandstone Wall","5353041":"Sandstone Wall","5353042":"Sandstone Wall","5353044":"Sandstone Wall","5353045":"Sandstone Wall","5353046":"Sandstone Wall","5353048":"Sandstone Wall","5353049":"Sandstone Wall","5353050":"Sandstone Wall","5353056":"Sandstone Wall","5353057":"Sandstone Wall","5353058":"Sandstone Wall","5353060":"Sandstone Wall","5353061":"Sandstone Wall","5353062":"Sandstone Wall","5353064":"Sandstone Wall","5353065":"Sandstone Wall","5353066":"Sandstone Wall","5353088":"Sandstone Wall","5353089":"Sandstone Wall","5353090":"Sandstone Wall","5353092":"Sandstone Wall","5353093":"Sandstone Wall","5353094":"Sandstone Wall","5353096":"Sandstone Wall","5353097":"Sandstone Wall","5353098":"Sandstone Wall","5353104":"Sandstone Wall","5353105":"Sandstone Wall","5353106":"Sandstone Wall","5353108":"Sandstone Wall","5353109":"Sandstone Wall","5353110":"Sandstone Wall","5353112":"Sandstone Wall","5353113":"Sandstone Wall","5353114":"Sandstone Wall","5353120":"Sandstone Wall","5353121":"Sandstone Wall","5353122":"Sandstone Wall","5353124":"Sandstone Wall","5353125":"Sandstone Wall","5353126":"Sandstone Wall","5353128":"Sandstone Wall","5353129":"Sandstone Wall","5353130":"Sandstone Wall","5353216":"Sandstone Wall","5353217":"Sandstone Wall","5353218":"Sandstone Wall","5353220":"Sandstone Wall","5353221":"Sandstone Wall","5353222":"Sandstone Wall","5353224":"Sandstone Wall","5353225":"Sandstone Wall","5353226":"Sandstone Wall","5353232":"Sandstone Wall","5353233":"Sandstone Wall","5353234":"Sandstone Wall","5353236":"Sandstone Wall","5353237":"Sandstone Wall","5353238":"Sandstone Wall","5353240":"Sandstone Wall","5353241":"Sandstone Wall","5353242":"Sandstone Wall","5353248":"Sandstone Wall","5353249":"Sandstone Wall","5353250":"Sandstone Wall","5353252":"Sandstone Wall","5353253":"Sandstone Wall","5353254":"Sandstone Wall","5353256":"Sandstone Wall","5353257":"Sandstone Wall","5353258":"Sandstone Wall","5353280":"Sandstone Wall","5353281":"Sandstone Wall","5353282":"Sandstone Wall","5353284":"Sandstone Wall","5353285":"Sandstone Wall","5353286":"Sandstone Wall","5353288":"Sandstone Wall","5353289":"Sandstone Wall","5353290":"Sandstone Wall","5353296":"Sandstone Wall","5353297":"Sandstone Wall","5353298":"Sandstone Wall","5353300":"Sandstone Wall","5353301":"Sandstone Wall","5353302":"Sandstone Wall","5353304":"Sandstone Wall","5353305":"Sandstone Wall","5353306":"Sandstone Wall","5353312":"Sandstone Wall","5353313":"Sandstone Wall","5353314":"Sandstone Wall","5353316":"Sandstone Wall","5353317":"Sandstone Wall","5353318":"Sandstone Wall","5353320":"Sandstone Wall","5353321":"Sandstone Wall","5353322":"Sandstone Wall","5353344":"Sandstone Wall","5353345":"Sandstone Wall","5353346":"Sandstone Wall","5353348":"Sandstone Wall","5353349":"Sandstone Wall","5353350":"Sandstone Wall","5353352":"Sandstone Wall","5353353":"Sandstone Wall","5353354":"Sandstone Wall","5353360":"Sandstone Wall","5353361":"Sandstone Wall","5353362":"Sandstone Wall","5353364":"Sandstone Wall","5353365":"Sandstone Wall","5353366":"Sandstone Wall","5353368":"Sandstone Wall","5353369":"Sandstone Wall","5353370":"Sandstone Wall","5353376":"Sandstone Wall","5353377":"Sandstone Wall","5353378":"Sandstone Wall","5353380":"Sandstone Wall","5353381":"Sandstone Wall","5353382":"Sandstone Wall","5353384":"Sandstone Wall","5353385":"Sandstone Wall","5353386":"Sandstone Wall","5375488":"Stone Brick Wall","5375489":"Stone Brick Wall","5375490":"Stone Brick Wall","5375492":"Stone Brick Wall","5375493":"Stone Brick Wall","5375494":"Stone Brick Wall","5375496":"Stone Brick Wall","5375497":"Stone Brick Wall","5375498":"Stone Brick Wall","5375504":"Stone Brick Wall","5375505":"Stone Brick Wall","5375506":"Stone Brick Wall","5375508":"Stone Brick Wall","5375509":"Stone Brick Wall","5375510":"Stone Brick Wall","5375512":"Stone Brick Wall","5375513":"Stone Brick Wall","5375514":"Stone Brick Wall","5375520":"Stone Brick Wall","5375521":"Stone Brick Wall","5375522":"Stone Brick Wall","5375524":"Stone Brick Wall","5375525":"Stone Brick Wall","5375526":"Stone Brick Wall","5375528":"Stone Brick Wall","5375529":"Stone Brick Wall","5375530":"Stone Brick Wall","5375552":"Stone Brick Wall","5375553":"Stone Brick Wall","5375554":"Stone Brick Wall","5375556":"Stone Brick Wall","5375557":"Stone Brick Wall","5375558":"Stone Brick Wall","5375560":"Stone Brick Wall","5375561":"Stone Brick Wall","5375562":"Stone Brick Wall","5375568":"Stone Brick Wall","5375569":"Stone Brick Wall","5375570":"Stone Brick Wall","5375572":"Stone Brick Wall","5375573":"Stone Brick Wall","5375574":"Stone Brick Wall","5375576":"Stone Brick Wall","5375577":"Stone Brick Wall","5375578":"Stone Brick Wall","5375584":"Stone Brick Wall","5375585":"Stone Brick Wall","5375586":"Stone Brick Wall","5375588":"Stone Brick Wall","5375589":"Stone Brick Wall","5375590":"Stone Brick Wall","5375592":"Stone Brick Wall","5375593":"Stone Brick Wall","5375594":"Stone Brick Wall","5375616":"Stone Brick Wall","5375617":"Stone Brick Wall","5375618":"Stone Brick Wall","5375620":"Stone Brick Wall","5375621":"Stone Brick Wall","5375622":"Stone Brick Wall","5375624":"Stone Brick Wall","5375625":"Stone Brick Wall","5375626":"Stone Brick Wall","5375632":"Stone Brick Wall","5375633":"Stone Brick Wall","5375634":"Stone Brick Wall","5375636":"Stone Brick Wall","5375637":"Stone Brick Wall","5375638":"Stone Brick Wall","5375640":"Stone Brick Wall","5375641":"Stone Brick Wall","5375642":"Stone Brick Wall","5375648":"Stone Brick Wall","5375649":"Stone Brick Wall","5375650":"Stone Brick Wall","5375652":"Stone Brick Wall","5375653":"Stone Brick Wall","5375654":"Stone Brick Wall","5375656":"Stone Brick Wall","5375657":"Stone Brick Wall","5375658":"Stone Brick Wall","5375744":"Stone Brick Wall","5375745":"Stone Brick Wall","5375746":"Stone Brick Wall","5375748":"Stone Brick Wall","5375749":"Stone Brick Wall","5375750":"Stone Brick Wall","5375752":"Stone Brick Wall","5375753":"Stone Brick Wall","5375754":"Stone Brick Wall","5375760":"Stone Brick Wall","5375761":"Stone Brick Wall","5375762":"Stone Brick Wall","5375764":"Stone Brick Wall","5375765":"Stone Brick Wall","5375766":"Stone Brick Wall","5375768":"Stone Brick Wall","5375769":"Stone Brick Wall","5375770":"Stone Brick Wall","5375776":"Stone Brick Wall","5375777":"Stone Brick Wall","5375778":"Stone Brick Wall","5375780":"Stone Brick Wall","5375781":"Stone Brick Wall","5375782":"Stone Brick Wall","5375784":"Stone Brick Wall","5375785":"Stone Brick Wall","5375786":"Stone Brick Wall","5375808":"Stone Brick Wall","5375809":"Stone Brick Wall","5375810":"Stone Brick Wall","5375812":"Stone Brick Wall","5375813":"Stone Brick Wall","5375814":"Stone Brick Wall","5375816":"Stone Brick Wall","5375817":"Stone Brick Wall","5375818":"Stone Brick Wall","5375824":"Stone Brick Wall","5375825":"Stone Brick Wall","5375826":"Stone Brick Wall","5375828":"Stone Brick Wall","5375829":"Stone Brick Wall","5375830":"Stone Brick Wall","5375832":"Stone Brick Wall","5375833":"Stone Brick Wall","5375834":"Stone Brick Wall","5375840":"Stone Brick Wall","5375841":"Stone Brick Wall","5375842":"Stone Brick Wall","5375844":"Stone Brick Wall","5375845":"Stone Brick Wall","5375846":"Stone Brick Wall","5375848":"Stone Brick Wall","5375849":"Stone Brick Wall","5375850":"Stone Brick Wall","5375872":"Stone Brick Wall","5375873":"Stone Brick Wall","5375874":"Stone Brick Wall","5375876":"Stone Brick Wall","5375877":"Stone Brick Wall","5375878":"Stone Brick Wall","5375880":"Stone Brick Wall","5375881":"Stone Brick Wall","5375882":"Stone Brick Wall","5375888":"Stone Brick Wall","5375889":"Stone Brick Wall","5375890":"Stone Brick Wall","5375892":"Stone Brick Wall","5375893":"Stone Brick Wall","5375894":"Stone Brick Wall","5375896":"Stone Brick Wall","5375897":"Stone Brick Wall","5375898":"Stone Brick Wall","5375904":"Stone Brick Wall","5375905":"Stone Brick Wall","5375906":"Stone Brick Wall","5375908":"Stone Brick Wall","5375909":"Stone Brick Wall","5375910":"Stone Brick Wall","5375912":"Stone Brick Wall","5375913":"Stone Brick Wall","5375914":"Stone Brick Wall","5248000":"???","5211136":"Hydrogen","5210112":"Helium","5215744":"Lithium","5192704":"Beryllium","5194240":"Boron","5196800":"Carbon","5223936":"Nitrogen","5225984":"Oxygen","5206016":"Fluorine","5221376":"Neon","5238272":"Sodium","5217280":"Magnesium","5188608":"Aluminum","5237248":"Silicon","5227008":"Phosphorus","5239296":"Sulfur","5198336":"Chlorine","5190144":"Argon","5229056":"Potassium","5195776":"Calcium","5235712":"Scandium","5244416":"Titanium","5245952":"Vanadium","5198848":"Chromium","5217792":"Manganese","5213184":"Iron","5199360":"Cobalt","5222400":"Nickel","5200896":"Copper","5248512":"Zinc","5207552":"Gallium","5208064":"Germanium","5190656":"Arsenic","5236736":"Selenium","5194752":"Bromine","5213696":"Krypton","5233664":"Rubidium","5238784":"Strontium","5247488":"Yttrium","5249024":"Zirconium","5223424":"Niobium","5219840":"Molybdenum","5240320":"Technetium","5234176":"Ruthenium","5232640":"Rhodium","5226496":"Palladium","5237760":"Silver","5195264":"Cadmium","5211648":"Indium","5243904":"Tin","5189632":"Antimony","5240832":"Tellurium","5212160":"Iodine","5246464":"Xenon","5197824":"Cesium","5191680":"Barium","5214208":"Lanthanum","5197312":"Cerium","5229568":"Praseodymium","5220864":"Neodymium","5230080":"Promethium","5235200":"Samarium","5204480":"Europium","5207040":"Gadolinium","5241856":"Terbium","5202944":"Dysprosium","5210624":"Holmium","5203968":"Erbium","5243392":"Thulium","5246976":"Ytterbium","5216768":"Lutetium","5209088":"Hafnium","5239808":"Tantalum","5244928":"Tungsten","5232128":"Rhenium","5225472":"Osmium","5212672":"Iridium","5227520":"Platinum","5208576":"Gold","5219328":"Mercury","5242368":"Thallium","5215232":"Lead","5193216":"Bismuth","5228544":"Polonium","5191168":"Astatine","5231616":"Radon","5206528":"Francium","5231104":"Radium","5188096":"Actinium","5242880":"Thorium","5230592":"Protactinium","5245440":"Uranium","5221888":"Neptunium","5228032":"Plutonium","5189120":"Americium","5201408":"Curium","5192192":"Berkelium","5196288":"Californium","5203456":"Einsteinium","5204992":"Fermium","5218816":"Mendelevium","5224448":"Nobelium","5214720":"Lawrencium","5234688":"Rutherfordium","5202432":"Dubnium","5236224":"Seaborgium","5193728":"Bohrium","5209600":"Hassium","5218304":"Meitnerium","5201920":"Darmstadtium","5233152":"Roentgenium","5200384":"Copernicium","5222912":"Nihonium","5205504":"Flerovium","5220352":"Moscovium","5216256":"Livermorium","5241344":"Tennessine","5224960":"Oganesson","5164032":"Compound Creator","5164033":"Compound Creator","5164034":"Compound Creator","5164035":"Compound Creator","5199872":"Element Constructor","5199873":"Element Constructor","5199874":"Element Constructor","5199875":"Element Constructor","5286400":"Lab Table","5286401":"Lab Table","5286402":"Lab Table","5286403":"Lab Table","5296640":"Material Reducer","5296641":"Material Reducer","5296642":"Material Reducer","5296643":"Material Reducer","5156352":"Heat Block","5153280":"Brown Mushroom Block","5153281":"Brown Mushroom Block","5153282":"Brown Mushroom Block","5153283":"Brown Mushroom Block","5153284":"Brown Mushroom Block","5153285":"Brown Mushroom Block","5153286":"Brown Mushroom Block","5153287":"Brown Mushroom Block","5153288":"Brown Mushroom Block","5153289":"Brown Mushroom Block","5153290":"Brown Mushroom Block","5340160":"Red Mushroom Block","5340161":"Red Mushroom Block","5340162":"Red Mushroom Block","5340163":"Red Mushroom Block","5340164":"Red Mushroom Block","5340165":"Red Mushroom Block","5340166":"Red Mushroom Block","5340167":"Red Mushroom Block","5340168":"Red Mushroom Block","5340169":"Red Mushroom Block","5340170":"Red Mushroom Block","5303296":"Mushroom Stem","5128704":"All Sided Mushroom Stem","5165568":"Coral","5165569":"Coral","5165570":"Coral","5165571":"Coral","5165572":"Coral","5165576":"Coral","5165577":"Coral","5165578":"Coral","5165579":"Coral","5165580":"Coral","5166592":"Coral Fan","5166593":"Coral Fan","5166594":"Coral Fan","5166595":"Coral Fan","5166596":"Coral Fan","5166600":"Coral Fan","5166601":"Coral Fan","5166602":"Coral Fan","5166603":"Coral Fan","5166604":"Coral Fan","5166608":"Coral Fan","5166609":"Coral Fan","5166610":"Coral Fan","5166611":"Coral Fan","5166612":"Coral Fan","5166616":"Coral Fan","5166617":"Coral Fan","5166618":"Coral Fan","5166619":"Coral Fan","5166620":"Coral Fan","5391360":"Wall Coral Fan","5391361":"Wall Coral Fan","5391362":"Wall Coral Fan","5391363":"Wall Coral Fan","5391364":"Wall Coral Fan","5391368":"Wall Coral Fan","5391369":"Wall Coral Fan","5391370":"Wall Coral Fan","5391371":"Wall Coral Fan","5391372":"Wall Coral Fan","5391376":"Wall Coral Fan","5391377":"Wall Coral Fan","5391378":"Wall Coral Fan","5391379":"Wall Coral Fan","5391380":"Wall Coral Fan","5391384":"Wall Coral Fan","5391385":"Wall Coral Fan","5391386":"Wall Coral Fan","5391387":"Wall Coral Fan","5391388":"Wall Coral Fan","5391392":"Wall Coral Fan","5391393":"Wall Coral Fan","5391394":"Wall Coral Fan","5391395":"Wall Coral Fan","5391396":"Wall Coral Fan","5391400":"Wall Coral Fan","5391401":"Wall Coral Fan","5391402":"Wall Coral Fan","5391403":"Wall Coral Fan","5391404":"Wall Coral Fan","5391408":"Wall Coral Fan","5391409":"Wall Coral Fan","5391410":"Wall Coral Fan","5391411":"Wall Coral Fan","5391412":"Wall Coral Fan","5391416":"Wall Coral Fan","5391417":"Wall Coral Fan","5391418":"Wall Coral Fan","5391419":"Wall Coral Fan","5391420":"Wall Coral Fan","5407232":"Light Block","5407233":"Light Block","5407234":"Light Block","5407235":"Light Block","5407236":"Light Block","5407237":"Light Block","5407238":"Light Block","5407239":"Light Block","5407240":"Light Block","5407241":"Light Block","5407242":"Light Block","5407243":"Light Block","5407244":"Light Block","5407245":"Light Block","5407246":"Light Block","5407247":"Light Block","5445120":"Honeycomb Block","5396992":"Ancient Debris","5397504":"Basalt","5397505":"Basalt","5397506":"Basalt","5398016":"Polished Basalt","5398017":"Polished Basalt","5398018":"Polished Basalt","5398528":"Smooth Basalt","5399040":"Blackstone","5399552":"Blackstone Slab","5399553":"Blackstone Slab","5399554":"Blackstone Slab","5400064":"Blackstone Stairs","5400065":"Blackstone Stairs","5400066":"Blackstone Stairs","5400067":"Blackstone Stairs","5400068":"Blackstone Stairs","5400069":"Blackstone Stairs","5400070":"Blackstone Stairs","5400071":"Blackstone Stairs","5400576":"Blackstone Wall","5400577":"Blackstone Wall","5400578":"Blackstone Wall","5400580":"Blackstone Wall","5400581":"Blackstone Wall","5400582":"Blackstone Wall","5400584":"Blackstone Wall","5400585":"Blackstone Wall","5400586":"Blackstone Wall","5400592":"Blackstone Wall","5400593":"Blackstone Wall","5400594":"Blackstone Wall","5400596":"Blackstone Wall","5400597":"Blackstone Wall","5400598":"Blackstone Wall","5400600":"Blackstone Wall","5400601":"Blackstone Wall","5400602":"Blackstone Wall","5400608":"Blackstone Wall","5400609":"Blackstone Wall","5400610":"Blackstone Wall","5400612":"Blackstone Wall","5400613":"Blackstone Wall","5400614":"Blackstone Wall","5400616":"Blackstone Wall","5400617":"Blackstone Wall","5400618":"Blackstone Wall","5400640":"Blackstone Wall","5400641":"Blackstone Wall","5400642":"Blackstone Wall","5400644":"Blackstone Wall","5400645":"Blackstone Wall","5400646":"Blackstone Wall","5400648":"Blackstone Wall","5400649":"Blackstone Wall","5400650":"Blackstone Wall","5400656":"Blackstone Wall","5400657":"Blackstone Wall","5400658":"Blackstone Wall","5400660":"Blackstone Wall","5400661":"Blackstone Wall","5400662":"Blackstone Wall","5400664":"Blackstone Wall","5400665":"Blackstone Wall","5400666":"Blackstone Wall","5400672":"Blackstone Wall","5400673":"Blackstone Wall","5400674":"Blackstone Wall","5400676":"Blackstone Wall","5400677":"Blackstone Wall","5400678":"Blackstone Wall","5400680":"Blackstone Wall","5400681":"Blackstone Wall","5400682":"Blackstone Wall","5400704":"Blackstone Wall","5400705":"Blackstone Wall","5400706":"Blackstone Wall","5400708":"Blackstone Wall","5400709":"Blackstone Wall","5400710":"Blackstone Wall","5400712":"Blackstone Wall","5400713":"Blackstone Wall","5400714":"Blackstone Wall","5400720":"Blackstone Wall","5400721":"Blackstone Wall","5400722":"Blackstone Wall","5400724":"Blackstone Wall","5400725":"Blackstone Wall","5400726":"Blackstone Wall","5400728":"Blackstone Wall","5400729":"Blackstone Wall","5400730":"Blackstone Wall","5400736":"Blackstone Wall","5400737":"Blackstone Wall","5400738":"Blackstone Wall","5400740":"Blackstone Wall","5400741":"Blackstone Wall","5400742":"Blackstone Wall","5400744":"Blackstone Wall","5400745":"Blackstone Wall","5400746":"Blackstone Wall","5400832":"Blackstone Wall","5400833":"Blackstone Wall","5400834":"Blackstone Wall","5400836":"Blackstone Wall","5400837":"Blackstone Wall","5400838":"Blackstone Wall","5400840":"Blackstone Wall","5400841":"Blackstone Wall","5400842":"Blackstone Wall","5400848":"Blackstone Wall","5400849":"Blackstone Wall","5400850":"Blackstone Wall","5400852":"Blackstone Wall","5400853":"Blackstone Wall","5400854":"Blackstone Wall","5400856":"Blackstone Wall","5400857":"Blackstone Wall","5400858":"Blackstone Wall","5400864":"Blackstone Wall","5400865":"Blackstone Wall","5400866":"Blackstone Wall","5400868":"Blackstone Wall","5400869":"Blackstone Wall","5400870":"Blackstone Wall","5400872":"Blackstone Wall","5400873":"Blackstone Wall","5400874":"Blackstone Wall","5400896":"Blackstone Wall","5400897":"Blackstone Wall","5400898":"Blackstone Wall","5400900":"Blackstone Wall","5400901":"Blackstone Wall","5400902":"Blackstone Wall","5400904":"Blackstone Wall","5400905":"Blackstone Wall","5400906":"Blackstone Wall","5400912":"Blackstone Wall","5400913":"Blackstone Wall","5400914":"Blackstone Wall","5400916":"Blackstone Wall","5400917":"Blackstone Wall","5400918":"Blackstone Wall","5400920":"Blackstone Wall","5400921":"Blackstone Wall","5400922":"Blackstone Wall","5400928":"Blackstone Wall","5400929":"Blackstone Wall","5400930":"Blackstone Wall","5400932":"Blackstone Wall","5400933":"Blackstone Wall","5400934":"Blackstone Wall","5400936":"Blackstone Wall","5400937":"Blackstone Wall","5400938":"Blackstone Wall","5400960":"Blackstone Wall","5400961":"Blackstone Wall","5400962":"Blackstone Wall","5400964":"Blackstone Wall","5400965":"Blackstone Wall","5400966":"Blackstone Wall","5400968":"Blackstone Wall","5400969":"Blackstone Wall","5400970":"Blackstone Wall","5400976":"Blackstone Wall","5400977":"Blackstone Wall","5400978":"Blackstone Wall","5400980":"Blackstone Wall","5400981":"Blackstone Wall","5400982":"Blackstone Wall","5400984":"Blackstone Wall","5400985":"Blackstone Wall","5400986":"Blackstone Wall","5400992":"Blackstone Wall","5400993":"Blackstone Wall","5400994":"Blackstone Wall","5400996":"Blackstone Wall","5400997":"Blackstone Wall","5400998":"Blackstone Wall","5401000":"Blackstone Wall","5401001":"Blackstone Wall","5401002":"Blackstone Wall","5401088":"Polished Blackstone","5401600":"Polished Blackstone Button","5401601":"Polished Blackstone Button","5401602":"Polished Blackstone Button","5401603":"Polished Blackstone Button","5401604":"Polished Blackstone Button","5401605":"Polished Blackstone Button","5401608":"Polished Blackstone Button","5401609":"Polished Blackstone Button","5401610":"Polished Blackstone Button","5401611":"Polished Blackstone Button","5401612":"Polished Blackstone Button","5401613":"Polished Blackstone Button","5402112":"Polished Blackstone Pressure Plate","5402113":"Polished Blackstone Pressure Plate","5402624":"Polished Blackstone Slab","5402625":"Polished Blackstone Slab","5402626":"Polished Blackstone Slab","5403136":"Polished Blackstone Stairs","5403137":"Polished Blackstone Stairs","5403138":"Polished Blackstone Stairs","5403139":"Polished Blackstone Stairs","5403140":"Polished Blackstone Stairs","5403141":"Polished Blackstone Stairs","5403142":"Polished Blackstone Stairs","5403143":"Polished Blackstone Stairs","5403648":"Polished Blackstone Wall","5403649":"Polished Blackstone Wall","5403650":"Polished Blackstone Wall","5403652":"Polished Blackstone Wall","5403653":"Polished Blackstone Wall","5403654":"Polished Blackstone Wall","5403656":"Polished Blackstone Wall","5403657":"Polished Blackstone Wall","5403658":"Polished Blackstone Wall","5403664":"Polished Blackstone Wall","5403665":"Polished Blackstone Wall","5403666":"Polished Blackstone Wall","5403668":"Polished Blackstone Wall","5403669":"Polished Blackstone Wall","5403670":"Polished Blackstone Wall","5403672":"Polished Blackstone Wall","5403673":"Polished Blackstone Wall","5403674":"Polished Blackstone Wall","5403680":"Polished Blackstone Wall","5403681":"Polished Blackstone Wall","5403682":"Polished Blackstone Wall","5403684":"Polished Blackstone Wall","5403685":"Polished Blackstone Wall","5403686":"Polished Blackstone Wall","5403688":"Polished Blackstone Wall","5403689":"Polished Blackstone Wall","5403690":"Polished Blackstone Wall","5403712":"Polished Blackstone Wall","5403713":"Polished Blackstone Wall","5403714":"Polished Blackstone Wall","5403716":"Polished Blackstone Wall","5403717":"Polished Blackstone Wall","5403718":"Polished Blackstone Wall","5403720":"Polished Blackstone Wall","5403721":"Polished Blackstone Wall","5403722":"Polished Blackstone Wall","5403728":"Polished Blackstone Wall","5403729":"Polished Blackstone Wall","5403730":"Polished Blackstone Wall","5403732":"Polished Blackstone Wall","5403733":"Polished Blackstone Wall","5403734":"Polished Blackstone Wall","5403736":"Polished Blackstone Wall","5403737":"Polished Blackstone Wall","5403738":"Polished Blackstone Wall","5403744":"Polished Blackstone Wall","5403745":"Polished Blackstone Wall","5403746":"Polished Blackstone Wall","5403748":"Polished Blackstone Wall","5403749":"Polished Blackstone Wall","5403750":"Polished Blackstone Wall","5403752":"Polished Blackstone Wall","5403753":"Polished Blackstone Wall","5403754":"Polished Blackstone Wall","5403776":"Polished Blackstone Wall","5403777":"Polished Blackstone Wall","5403778":"Polished Blackstone Wall","5403780":"Polished Blackstone Wall","5403781":"Polished Blackstone Wall","5403782":"Polished Blackstone Wall","5403784":"Polished Blackstone Wall","5403785":"Polished Blackstone Wall","5403786":"Polished Blackstone Wall","5403792":"Polished Blackstone Wall","5403793":"Polished Blackstone Wall","5403794":"Polished Blackstone Wall","5403796":"Polished Blackstone Wall","5403797":"Polished Blackstone Wall","5403798":"Polished Blackstone Wall","5403800":"Polished Blackstone Wall","5403801":"Polished Blackstone Wall","5403802":"Polished Blackstone Wall","5403808":"Polished Blackstone Wall","5403809":"Polished Blackstone Wall","5403810":"Polished Blackstone Wall","5403812":"Polished Blackstone Wall","5403813":"Polished Blackstone Wall","5403814":"Polished Blackstone Wall","5403816":"Polished Blackstone Wall","5403817":"Polished Blackstone Wall","5403818":"Polished Blackstone Wall","5403904":"Polished Blackstone Wall","5403905":"Polished Blackstone Wall","5403906":"Polished Blackstone Wall","5403908":"Polished Blackstone Wall","5403909":"Polished Blackstone Wall","5403910":"Polished Blackstone Wall","5403912":"Polished Blackstone Wall","5403913":"Polished Blackstone Wall","5403914":"Polished Blackstone Wall","5403920":"Polished Blackstone Wall","5403921":"Polished Blackstone Wall","5403922":"Polished Blackstone Wall","5403924":"Polished Blackstone Wall","5403925":"Polished Blackstone Wall","5403926":"Polished Blackstone Wall","5403928":"Polished Blackstone Wall","5403929":"Polished Blackstone Wall","5403930":"Polished Blackstone Wall","5403936":"Polished Blackstone Wall","5403937":"Polished Blackstone Wall","5403938":"Polished Blackstone Wall","5403940":"Polished Blackstone Wall","5403941":"Polished Blackstone Wall","5403942":"Polished Blackstone Wall","5403944":"Polished Blackstone Wall","5403945":"Polished Blackstone Wall","5403946":"Polished Blackstone Wall","5403968":"Polished Blackstone Wall","5403969":"Polished Blackstone Wall","5403970":"Polished Blackstone Wall","5403972":"Polished Blackstone Wall","5403973":"Polished Blackstone Wall","5403974":"Polished Blackstone Wall","5403976":"Polished Blackstone Wall","5403977":"Polished Blackstone Wall","5403978":"Polished Blackstone Wall","5403984":"Polished Blackstone Wall","5403985":"Polished Blackstone Wall","5403986":"Polished Blackstone Wall","5403988":"Polished Blackstone Wall","5403989":"Polished Blackstone Wall","5403990":"Polished Blackstone Wall","5403992":"Polished Blackstone Wall","5403993":"Polished Blackstone Wall","5403994":"Polished Blackstone Wall","5404000":"Polished Blackstone Wall","5404001":"Polished Blackstone Wall","5404002":"Polished Blackstone Wall","5404004":"Polished Blackstone Wall","5404005":"Polished Blackstone Wall","5404006":"Polished Blackstone Wall","5404008":"Polished Blackstone Wall","5404009":"Polished Blackstone Wall","5404010":"Polished Blackstone Wall","5404032":"Polished Blackstone Wall","5404033":"Polished Blackstone Wall","5404034":"Polished Blackstone Wall","5404036":"Polished Blackstone Wall","5404037":"Polished Blackstone Wall","5404038":"Polished Blackstone Wall","5404040":"Polished Blackstone Wall","5404041":"Polished Blackstone Wall","5404042":"Polished Blackstone Wall","5404048":"Polished Blackstone Wall","5404049":"Polished Blackstone Wall","5404050":"Polished Blackstone Wall","5404052":"Polished Blackstone Wall","5404053":"Polished Blackstone Wall","5404054":"Polished Blackstone Wall","5404056":"Polished Blackstone Wall","5404057":"Polished Blackstone Wall","5404058":"Polished Blackstone Wall","5404064":"Polished Blackstone Wall","5404065":"Polished Blackstone Wall","5404066":"Polished Blackstone Wall","5404068":"Polished Blackstone Wall","5404069":"Polished Blackstone Wall","5404070":"Polished Blackstone Wall","5404072":"Polished Blackstone Wall","5404073":"Polished Blackstone Wall","5404074":"Polished Blackstone Wall","5404160":"Chiseled Polished Blackstone","5404672":"Polished Blackstone Bricks","5405184":"Polished Blackstone Brick Slab","5405185":"Polished Blackstone Brick Slab","5405186":"Polished Blackstone Brick Slab","5405696":"Polished Blackstone Brick Stairs","5405697":"Polished Blackstone Brick Stairs","5405698":"Polished Blackstone Brick Stairs","5405699":"Polished Blackstone Brick Stairs","5405700":"Polished Blackstone Brick Stairs","5405701":"Polished Blackstone Brick Stairs","5405702":"Polished Blackstone Brick Stairs","5405703":"Polished Blackstone Brick Stairs","5406208":"Polished Blackstone Brick Wall","5406209":"Polished Blackstone Brick Wall","5406210":"Polished Blackstone Brick Wall","5406212":"Polished Blackstone Brick Wall","5406213":"Polished Blackstone Brick Wall","5406214":"Polished Blackstone Brick Wall","5406216":"Polished Blackstone Brick Wall","5406217":"Polished Blackstone Brick Wall","5406218":"Polished Blackstone Brick Wall","5406224":"Polished Blackstone Brick Wall","5406225":"Polished Blackstone Brick Wall","5406226":"Polished Blackstone Brick Wall","5406228":"Polished Blackstone Brick Wall","5406229":"Polished Blackstone Brick Wall","5406230":"Polished Blackstone Brick Wall","5406232":"Polished Blackstone Brick Wall","5406233":"Polished Blackstone Brick Wall","5406234":"Polished Blackstone Brick Wall","5406240":"Polished Blackstone Brick Wall","5406241":"Polished Blackstone Brick Wall","5406242":"Polished Blackstone Brick Wall","5406244":"Polished Blackstone Brick Wall","5406245":"Polished Blackstone Brick Wall","5406246":"Polished Blackstone Brick Wall","5406248":"Polished Blackstone Brick Wall","5406249":"Polished Blackstone Brick Wall","5406250":"Polished Blackstone Brick Wall","5406272":"Polished Blackstone Brick Wall","5406273":"Polished Blackstone Brick Wall","5406274":"Polished Blackstone Brick Wall","5406276":"Polished Blackstone Brick Wall","5406277":"Polished Blackstone Brick Wall","5406278":"Polished Blackstone Brick Wall","5406280":"Polished Blackstone Brick Wall","5406281":"Polished Blackstone Brick Wall","5406282":"Polished Blackstone Brick Wall","5406288":"Polished Blackstone Brick Wall","5406289":"Polished Blackstone Brick Wall","5406290":"Polished Blackstone Brick Wall","5406292":"Polished Blackstone Brick Wall","5406293":"Polished Blackstone Brick Wall","5406294":"Polished Blackstone Brick Wall","5406296":"Polished Blackstone Brick Wall","5406297":"Polished Blackstone Brick Wall","5406298":"Polished Blackstone Brick Wall","5406304":"Polished Blackstone Brick Wall","5406305":"Polished Blackstone Brick Wall","5406306":"Polished Blackstone Brick Wall","5406308":"Polished Blackstone Brick Wall","5406309":"Polished Blackstone Brick Wall","5406310":"Polished Blackstone Brick Wall","5406312":"Polished Blackstone Brick Wall","5406313":"Polished Blackstone Brick Wall","5406314":"Polished Blackstone Brick Wall","5406336":"Polished Blackstone Brick Wall","5406337":"Polished Blackstone Brick Wall","5406338":"Polished Blackstone Brick Wall","5406340":"Polished Blackstone Brick Wall","5406341":"Polished Blackstone Brick Wall","5406342":"Polished Blackstone Brick Wall","5406344":"Polished Blackstone Brick Wall","5406345":"Polished Blackstone Brick Wall","5406346":"Polished Blackstone Brick Wall","5406352":"Polished Blackstone Brick Wall","5406353":"Polished Blackstone Brick Wall","5406354":"Polished Blackstone Brick Wall","5406356":"Polished Blackstone Brick Wall","5406357":"Polished Blackstone Brick Wall","5406358":"Polished Blackstone Brick Wall","5406360":"Polished Blackstone Brick Wall","5406361":"Polished Blackstone Brick Wall","5406362":"Polished Blackstone Brick Wall","5406368":"Polished Blackstone Brick Wall","5406369":"Polished Blackstone Brick Wall","5406370":"Polished Blackstone Brick Wall","5406372":"Polished Blackstone Brick Wall","5406373":"Polished Blackstone Brick Wall","5406374":"Polished Blackstone Brick Wall","5406376":"Polished Blackstone Brick Wall","5406377":"Polished Blackstone Brick Wall","5406378":"Polished Blackstone Brick Wall","5406464":"Polished Blackstone Brick Wall","5406465":"Polished Blackstone Brick Wall","5406466":"Polished Blackstone Brick Wall","5406468":"Polished Blackstone Brick Wall","5406469":"Polished Blackstone Brick Wall","5406470":"Polished Blackstone Brick Wall","5406472":"Polished Blackstone Brick Wall","5406473":"Polished Blackstone Brick Wall","5406474":"Polished Blackstone Brick Wall","5406480":"Polished Blackstone Brick Wall","5406481":"Polished Blackstone Brick Wall","5406482":"Polished Blackstone Brick Wall","5406484":"Polished Blackstone Brick Wall","5406485":"Polished Blackstone Brick Wall","5406486":"Polished Blackstone Brick Wall","5406488":"Polished Blackstone Brick Wall","5406489":"Polished Blackstone Brick Wall","5406490":"Polished Blackstone Brick Wall","5406496":"Polished Blackstone Brick Wall","5406497":"Polished Blackstone Brick Wall","5406498":"Polished Blackstone Brick Wall","5406500":"Polished Blackstone Brick Wall","5406501":"Polished Blackstone Brick Wall","5406502":"Polished Blackstone Brick Wall","5406504":"Polished Blackstone Brick Wall","5406505":"Polished Blackstone Brick Wall","5406506":"Polished Blackstone Brick Wall","5406528":"Polished Blackstone Brick Wall","5406529":"Polished Blackstone Brick Wall","5406530":"Polished Blackstone Brick Wall","5406532":"Polished Blackstone Brick Wall","5406533":"Polished Blackstone Brick Wall","5406534":"Polished Blackstone Brick Wall","5406536":"Polished Blackstone Brick Wall","5406537":"Polished Blackstone Brick Wall","5406538":"Polished Blackstone Brick Wall","5406544":"Polished Blackstone Brick Wall","5406545":"Polished Blackstone Brick Wall","5406546":"Polished Blackstone Brick Wall","5406548":"Polished Blackstone Brick Wall","5406549":"Polished Blackstone Brick Wall","5406550":"Polished Blackstone Brick Wall","5406552":"Polished Blackstone Brick Wall","5406553":"Polished Blackstone Brick Wall","5406554":"Polished Blackstone Brick Wall","5406560":"Polished Blackstone Brick Wall","5406561":"Polished Blackstone Brick Wall","5406562":"Polished Blackstone Brick Wall","5406564":"Polished Blackstone Brick Wall","5406565":"Polished Blackstone Brick Wall","5406566":"Polished Blackstone Brick Wall","5406568":"Polished Blackstone Brick Wall","5406569":"Polished Blackstone Brick Wall","5406570":"Polished Blackstone Brick Wall","5406592":"Polished Blackstone Brick Wall","5406593":"Polished Blackstone Brick Wall","5406594":"Polished Blackstone Brick Wall","5406596":"Polished Blackstone Brick Wall","5406597":"Polished Blackstone Brick Wall","5406598":"Polished Blackstone Brick Wall","5406600":"Polished Blackstone Brick Wall","5406601":"Polished Blackstone Brick Wall","5406602":"Polished Blackstone Brick Wall","5406608":"Polished Blackstone Brick Wall","5406609":"Polished Blackstone Brick Wall","5406610":"Polished Blackstone Brick Wall","5406612":"Polished Blackstone Brick Wall","5406613":"Polished Blackstone Brick Wall","5406614":"Polished Blackstone Brick Wall","5406616":"Polished Blackstone Brick Wall","5406617":"Polished Blackstone Brick Wall","5406618":"Polished Blackstone Brick Wall","5406624":"Polished Blackstone Brick Wall","5406625":"Polished Blackstone Brick Wall","5406626":"Polished Blackstone Brick Wall","5406628":"Polished Blackstone Brick Wall","5406629":"Polished Blackstone Brick Wall","5406630":"Polished Blackstone Brick Wall","5406632":"Polished Blackstone Brick Wall","5406633":"Polished Blackstone Brick Wall","5406634":"Polished Blackstone Brick Wall","5406720":"Cracked Polished Blackstone Bricks","5422081":"Soul Torch","5422082":"Soul Torch","5422083":"Soul Torch","5422084":"Soul Torch","5422085":"Soul Torch","5423616":"Soul Fire","5423104":"Soul Soil","5424128":"Shroomlight","5396480":"Amethyst","5409280":"Calcite","5421568":"Tuff","5407744":"Raw Copper Block","5408256":"Raw Gold Block","5408768":"Raw Iron Block","5409792":"Deepslate","5409793":"Deepslate","5409794":"Deepslate","5420032":"Chiseled Deepslate","5410304":"Deepslate Bricks","5410816":"Deepslate Brick Slab","5410817":"Deepslate Brick Slab","5410818":"Deepslate Brick Slab","5411328":"Deepslate Brick Stairs","5411329":"Deepslate Brick Stairs","5411330":"Deepslate Brick Stairs","5411331":"Deepslate Brick Stairs","5411332":"Deepslate Brick Stairs","5411333":"Deepslate Brick Stairs","5411334":"Deepslate Brick Stairs","5411335":"Deepslate Brick Stairs","5411840":"Deepslate Brick Wall","5411841":"Deepslate Brick Wall","5411842":"Deepslate Brick Wall","5411844":"Deepslate Brick Wall","5411845":"Deepslate Brick Wall","5411846":"Deepslate Brick Wall","5411848":"Deepslate Brick Wall","5411849":"Deepslate Brick Wall","5411850":"Deepslate Brick Wall","5411856":"Deepslate Brick Wall","5411857":"Deepslate Brick Wall","5411858":"Deepslate Brick Wall","5411860":"Deepslate Brick Wall","5411861":"Deepslate Brick Wall","5411862":"Deepslate Brick Wall","5411864":"Deepslate Brick Wall","5411865":"Deepslate Brick Wall","5411866":"Deepslate Brick Wall","5411872":"Deepslate Brick Wall","5411873":"Deepslate Brick Wall","5411874":"Deepslate Brick Wall","5411876":"Deepslate Brick Wall","5411877":"Deepslate Brick Wall","5411878":"Deepslate Brick Wall","5411880":"Deepslate Brick Wall","5411881":"Deepslate Brick Wall","5411882":"Deepslate Brick Wall","5411904":"Deepslate Brick Wall","5411905":"Deepslate Brick Wall","5411906":"Deepslate Brick Wall","5411908":"Deepslate Brick Wall","5411909":"Deepslate Brick Wall","5411910":"Deepslate Brick Wall","5411912":"Deepslate Brick Wall","5411913":"Deepslate Brick Wall","5411914":"Deepslate Brick Wall","5411920":"Deepslate Brick Wall","5411921":"Deepslate Brick Wall","5411922":"Deepslate Brick Wall","5411924":"Deepslate Brick Wall","5411925":"Deepslate Brick Wall","5411926":"Deepslate Brick Wall","5411928":"Deepslate Brick Wall","5411929":"Deepslate Brick Wall","5411930":"Deepslate Brick Wall","5411936":"Deepslate Brick Wall","5411937":"Deepslate Brick Wall","5411938":"Deepslate Brick Wall","5411940":"Deepslate Brick Wall","5411941":"Deepslate Brick Wall","5411942":"Deepslate Brick Wall","5411944":"Deepslate Brick Wall","5411945":"Deepslate Brick Wall","5411946":"Deepslate Brick Wall","5411968":"Deepslate Brick Wall","5411969":"Deepslate Brick Wall","5411970":"Deepslate Brick Wall","5411972":"Deepslate Brick Wall","5411973":"Deepslate Brick Wall","5411974":"Deepslate Brick Wall","5411976":"Deepslate Brick Wall","5411977":"Deepslate Brick Wall","5411978":"Deepslate Brick Wall","5411984":"Deepslate Brick Wall","5411985":"Deepslate Brick Wall","5411986":"Deepslate Brick Wall","5411988":"Deepslate Brick Wall","5411989":"Deepslate Brick Wall","5411990":"Deepslate Brick Wall","5411992":"Deepslate Brick Wall","5411993":"Deepslate Brick Wall","5411994":"Deepslate Brick Wall","5412000":"Deepslate Brick Wall","5412001":"Deepslate Brick Wall","5412002":"Deepslate Brick Wall","5412004":"Deepslate Brick Wall","5412005":"Deepslate Brick Wall","5412006":"Deepslate Brick Wall","5412008":"Deepslate Brick Wall","5412009":"Deepslate Brick Wall","5412010":"Deepslate Brick Wall","5412096":"Deepslate Brick Wall","5412097":"Deepslate Brick Wall","5412098":"Deepslate Brick Wall","5412100":"Deepslate Brick Wall","5412101":"Deepslate Brick Wall","5412102":"Deepslate Brick Wall","5412104":"Deepslate Brick Wall","5412105":"Deepslate Brick Wall","5412106":"Deepslate Brick Wall","5412112":"Deepslate Brick Wall","5412113":"Deepslate Brick Wall","5412114":"Deepslate Brick Wall","5412116":"Deepslate Brick Wall","5412117":"Deepslate Brick Wall","5412118":"Deepslate Brick Wall","5412120":"Deepslate Brick Wall","5412121":"Deepslate Brick Wall","5412122":"Deepslate Brick Wall","5412128":"Deepslate Brick Wall","5412129":"Deepslate Brick Wall","5412130":"Deepslate Brick Wall","5412132":"Deepslate Brick Wall","5412133":"Deepslate Brick Wall","5412134":"Deepslate Brick Wall","5412136":"Deepslate Brick Wall","5412137":"Deepslate Brick Wall","5412138":"Deepslate Brick Wall","5412160":"Deepslate Brick Wall","5412161":"Deepslate Brick Wall","5412162":"Deepslate Brick Wall","5412164":"Deepslate Brick Wall","5412165":"Deepslate Brick Wall","5412166":"Deepslate Brick Wall","5412168":"Deepslate Brick Wall","5412169":"Deepslate Brick Wall","5412170":"Deepslate Brick Wall","5412176":"Deepslate Brick Wall","5412177":"Deepslate Brick Wall","5412178":"Deepslate Brick Wall","5412180":"Deepslate Brick Wall","5412181":"Deepslate Brick Wall","5412182":"Deepslate Brick Wall","5412184":"Deepslate Brick Wall","5412185":"Deepslate Brick Wall","5412186":"Deepslate Brick Wall","5412192":"Deepslate Brick Wall","5412193":"Deepslate Brick Wall","5412194":"Deepslate Brick Wall","5412196":"Deepslate Brick Wall","5412197":"Deepslate Brick Wall","5412198":"Deepslate Brick Wall","5412200":"Deepslate Brick Wall","5412201":"Deepslate Brick Wall","5412202":"Deepslate Brick Wall","5412224":"Deepslate Brick Wall","5412225":"Deepslate Brick Wall","5412226":"Deepslate Brick Wall","5412228":"Deepslate Brick Wall","5412229":"Deepslate Brick Wall","5412230":"Deepslate Brick Wall","5412232":"Deepslate Brick Wall","5412233":"Deepslate Brick Wall","5412234":"Deepslate Brick Wall","5412240":"Deepslate Brick Wall","5412241":"Deepslate Brick Wall","5412242":"Deepslate Brick Wall","5412244":"Deepslate Brick Wall","5412245":"Deepslate Brick Wall","5412246":"Deepslate Brick Wall","5412248":"Deepslate Brick Wall","5412249":"Deepslate Brick Wall","5412250":"Deepslate Brick Wall","5412256":"Deepslate Brick Wall","5412257":"Deepslate Brick Wall","5412258":"Deepslate Brick Wall","5412260":"Deepslate Brick Wall","5412261":"Deepslate Brick Wall","5412262":"Deepslate Brick Wall","5412264":"Deepslate Brick Wall","5412265":"Deepslate Brick Wall","5412266":"Deepslate Brick Wall","5412352":"Cracked Deepslate Bricks","5412864":"Deepslate Tiles","5413376":"Deepslate Tile Slab","5413377":"Deepslate Tile Slab","5413378":"Deepslate Tile Slab","5413888":"Deepslate Tile Stairs","5413889":"Deepslate Tile Stairs","5413890":"Deepslate Tile Stairs","5413891":"Deepslate Tile Stairs","5413892":"Deepslate Tile Stairs","5413893":"Deepslate Tile Stairs","5413894":"Deepslate Tile Stairs","5413895":"Deepslate Tile Stairs","5414400":"Deepslate Tile Wall","5414401":"Deepslate Tile Wall","5414402":"Deepslate Tile Wall","5414404":"Deepslate Tile Wall","5414405":"Deepslate Tile Wall","5414406":"Deepslate Tile Wall","5414408":"Deepslate Tile Wall","5414409":"Deepslate Tile Wall","5414410":"Deepslate Tile Wall","5414416":"Deepslate Tile Wall","5414417":"Deepslate Tile Wall","5414418":"Deepslate Tile Wall","5414420":"Deepslate Tile Wall","5414421":"Deepslate Tile Wall","5414422":"Deepslate Tile Wall","5414424":"Deepslate Tile Wall","5414425":"Deepslate Tile Wall","5414426":"Deepslate Tile Wall","5414432":"Deepslate Tile Wall","5414433":"Deepslate Tile Wall","5414434":"Deepslate Tile Wall","5414436":"Deepslate Tile Wall","5414437":"Deepslate Tile Wall","5414438":"Deepslate Tile Wall","5414440":"Deepslate Tile Wall","5414441":"Deepslate Tile Wall","5414442":"Deepslate Tile Wall","5414464":"Deepslate Tile Wall","5414465":"Deepslate Tile Wall","5414466":"Deepslate Tile Wall","5414468":"Deepslate Tile Wall","5414469":"Deepslate Tile Wall","5414470":"Deepslate Tile Wall","5414472":"Deepslate Tile Wall","5414473":"Deepslate Tile Wall","5414474":"Deepslate Tile Wall","5414480":"Deepslate Tile Wall","5414481":"Deepslate Tile Wall","5414482":"Deepslate Tile Wall","5414484":"Deepslate Tile Wall","5414485":"Deepslate Tile Wall","5414486":"Deepslate Tile Wall","5414488":"Deepslate Tile Wall","5414489":"Deepslate Tile Wall","5414490":"Deepslate Tile Wall","5414496":"Deepslate Tile Wall","5414497":"Deepslate Tile Wall","5414498":"Deepslate Tile Wall","5414500":"Deepslate Tile Wall","5414501":"Deepslate Tile Wall","5414502":"Deepslate Tile Wall","5414504":"Deepslate Tile Wall","5414505":"Deepslate Tile Wall","5414506":"Deepslate Tile Wall","5414528":"Deepslate Tile Wall","5414529":"Deepslate Tile Wall","5414530":"Deepslate Tile Wall","5414532":"Deepslate Tile Wall","5414533":"Deepslate Tile Wall","5414534":"Deepslate Tile Wall","5414536":"Deepslate Tile Wall","5414537":"Deepslate Tile Wall","5414538":"Deepslate Tile Wall","5414544":"Deepslate Tile Wall","5414545":"Deepslate Tile Wall","5414546":"Deepslate Tile Wall","5414548":"Deepslate Tile Wall","5414549":"Deepslate Tile Wall","5414550":"Deepslate Tile Wall","5414552":"Deepslate Tile Wall","5414553":"Deepslate Tile Wall","5414554":"Deepslate Tile Wall","5414560":"Deepslate Tile Wall","5414561":"Deepslate Tile Wall","5414562":"Deepslate Tile Wall","5414564":"Deepslate Tile Wall","5414565":"Deepslate Tile Wall","5414566":"Deepslate Tile Wall","5414568":"Deepslate Tile Wall","5414569":"Deepslate Tile Wall","5414570":"Deepslate Tile Wall","5414656":"Deepslate Tile Wall","5414657":"Deepslate Tile Wall","5414658":"Deepslate Tile Wall","5414660":"Deepslate Tile Wall","5414661":"Deepslate Tile Wall","5414662":"Deepslate Tile Wall","5414664":"Deepslate Tile Wall","5414665":"Deepslate Tile Wall","5414666":"Deepslate Tile Wall","5414672":"Deepslate Tile Wall","5414673":"Deepslate Tile Wall","5414674":"Deepslate Tile Wall","5414676":"Deepslate Tile Wall","5414677":"Deepslate Tile Wall","5414678":"Deepslate Tile Wall","5414680":"Deepslate Tile Wall","5414681":"Deepslate Tile Wall","5414682":"Deepslate Tile Wall","5414688":"Deepslate Tile Wall","5414689":"Deepslate Tile Wall","5414690":"Deepslate Tile Wall","5414692":"Deepslate Tile Wall","5414693":"Deepslate Tile Wall","5414694":"Deepslate Tile Wall","5414696":"Deepslate Tile Wall","5414697":"Deepslate Tile Wall","5414698":"Deepslate Tile Wall","5414720":"Deepslate Tile Wall","5414721":"Deepslate Tile Wall","5414722":"Deepslate Tile Wall","5414724":"Deepslate Tile Wall","5414725":"Deepslate Tile Wall","5414726":"Deepslate Tile Wall","5414728":"Deepslate Tile Wall","5414729":"Deepslate Tile Wall","5414730":"Deepslate Tile Wall","5414736":"Deepslate Tile Wall","5414737":"Deepslate Tile Wall","5414738":"Deepslate Tile Wall","5414740":"Deepslate Tile Wall","5414741":"Deepslate Tile Wall","5414742":"Deepslate Tile Wall","5414744":"Deepslate Tile Wall","5414745":"Deepslate Tile Wall","5414746":"Deepslate Tile Wall","5414752":"Deepslate Tile Wall","5414753":"Deepslate Tile Wall","5414754":"Deepslate Tile Wall","5414756":"Deepslate Tile Wall","5414757":"Deepslate Tile Wall","5414758":"Deepslate Tile Wall","5414760":"Deepslate Tile Wall","5414761":"Deepslate Tile Wall","5414762":"Deepslate Tile Wall","5414784":"Deepslate Tile Wall","5414785":"Deepslate Tile Wall","5414786":"Deepslate Tile Wall","5414788":"Deepslate Tile Wall","5414789":"Deepslate Tile Wall","5414790":"Deepslate Tile Wall","5414792":"Deepslate Tile Wall","5414793":"Deepslate Tile Wall","5414794":"Deepslate Tile Wall","5414800":"Deepslate Tile Wall","5414801":"Deepslate Tile Wall","5414802":"Deepslate Tile Wall","5414804":"Deepslate Tile Wall","5414805":"Deepslate Tile Wall","5414806":"Deepslate Tile Wall","5414808":"Deepslate Tile Wall","5414809":"Deepslate Tile Wall","5414810":"Deepslate Tile Wall","5414816":"Deepslate Tile Wall","5414817":"Deepslate Tile Wall","5414818":"Deepslate Tile Wall","5414820":"Deepslate Tile Wall","5414821":"Deepslate Tile Wall","5414822":"Deepslate Tile Wall","5414824":"Deepslate Tile Wall","5414825":"Deepslate Tile Wall","5414826":"Deepslate Tile Wall","5414912":"Cracked Deepslate Tiles","5415424":"Cobbled Deepslate","5415936":"Cobbled Deepslate Slab","5415937":"Cobbled Deepslate Slab","5415938":"Cobbled Deepslate Slab","5416448":"Cobbled Deepslate Stairs","5416449":"Cobbled Deepslate Stairs","5416450":"Cobbled Deepslate Stairs","5416451":"Cobbled Deepslate Stairs","5416452":"Cobbled Deepslate Stairs","5416453":"Cobbled Deepslate Stairs","5416454":"Cobbled Deepslate Stairs","5416455":"Cobbled Deepslate Stairs","5416960":"Cobbled Deepslate Wall","5416961":"Cobbled Deepslate Wall","5416962":"Cobbled Deepslate Wall","5416964":"Cobbled Deepslate Wall","5416965":"Cobbled Deepslate Wall","5416966":"Cobbled Deepslate Wall","5416968":"Cobbled Deepslate Wall","5416969":"Cobbled Deepslate Wall","5416970":"Cobbled Deepslate Wall","5416976":"Cobbled Deepslate Wall","5416977":"Cobbled Deepslate Wall","5416978":"Cobbled Deepslate Wall","5416980":"Cobbled Deepslate Wall","5416981":"Cobbled Deepslate Wall","5416982":"Cobbled Deepslate Wall","5416984":"Cobbled Deepslate Wall","5416985":"Cobbled Deepslate Wall","5416986":"Cobbled Deepslate Wall","5416992":"Cobbled Deepslate Wall","5416993":"Cobbled Deepslate Wall","5416994":"Cobbled Deepslate Wall","5416996":"Cobbled Deepslate Wall","5416997":"Cobbled Deepslate Wall","5416998":"Cobbled Deepslate Wall","5417000":"Cobbled Deepslate Wall","5417001":"Cobbled Deepslate Wall","5417002":"Cobbled Deepslate Wall","5417024":"Cobbled Deepslate Wall","5417025":"Cobbled Deepslate Wall","5417026":"Cobbled Deepslate Wall","5417028":"Cobbled Deepslate Wall","5417029":"Cobbled Deepslate Wall","5417030":"Cobbled Deepslate Wall","5417032":"Cobbled Deepslate Wall","5417033":"Cobbled Deepslate Wall","5417034":"Cobbled Deepslate Wall","5417040":"Cobbled Deepslate Wall","5417041":"Cobbled Deepslate Wall","5417042":"Cobbled Deepslate Wall","5417044":"Cobbled Deepslate Wall","5417045":"Cobbled Deepslate Wall","5417046":"Cobbled Deepslate Wall","5417048":"Cobbled Deepslate Wall","5417049":"Cobbled Deepslate Wall","5417050":"Cobbled Deepslate Wall","5417056":"Cobbled Deepslate Wall","5417057":"Cobbled Deepslate Wall","5417058":"Cobbled Deepslate Wall","5417060":"Cobbled Deepslate Wall","5417061":"Cobbled Deepslate Wall","5417062":"Cobbled Deepslate Wall","5417064":"Cobbled Deepslate Wall","5417065":"Cobbled Deepslate Wall","5417066":"Cobbled Deepslate Wall","5417088":"Cobbled Deepslate Wall","5417089":"Cobbled Deepslate Wall","5417090":"Cobbled Deepslate Wall","5417092":"Cobbled Deepslate Wall","5417093":"Cobbled Deepslate Wall","5417094":"Cobbled Deepslate Wall","5417096":"Cobbled Deepslate Wall","5417097":"Cobbled Deepslate Wall","5417098":"Cobbled Deepslate Wall","5417104":"Cobbled Deepslate Wall","5417105":"Cobbled Deepslate Wall","5417106":"Cobbled Deepslate Wall","5417108":"Cobbled Deepslate Wall","5417109":"Cobbled Deepslate Wall","5417110":"Cobbled Deepslate Wall","5417112":"Cobbled Deepslate Wall","5417113":"Cobbled Deepslate Wall","5417114":"Cobbled Deepslate Wall","5417120":"Cobbled Deepslate Wall","5417121":"Cobbled Deepslate Wall","5417122":"Cobbled Deepslate Wall","5417124":"Cobbled Deepslate Wall","5417125":"Cobbled Deepslate Wall","5417126":"Cobbled Deepslate Wall","5417128":"Cobbled Deepslate Wall","5417129":"Cobbled Deepslate Wall","5417130":"Cobbled Deepslate Wall","5417216":"Cobbled Deepslate Wall","5417217":"Cobbled Deepslate Wall","5417218":"Cobbled Deepslate Wall","5417220":"Cobbled Deepslate Wall","5417221":"Cobbled Deepslate Wall","5417222":"Cobbled Deepslate Wall","5417224":"Cobbled Deepslate Wall","5417225":"Cobbled Deepslate Wall","5417226":"Cobbled Deepslate Wall","5417232":"Cobbled Deepslate Wall","5417233":"Cobbled Deepslate Wall","5417234":"Cobbled Deepslate Wall","5417236":"Cobbled Deepslate Wall","5417237":"Cobbled Deepslate Wall","5417238":"Cobbled Deepslate Wall","5417240":"Cobbled Deepslate Wall","5417241":"Cobbled Deepslate Wall","5417242":"Cobbled Deepslate Wall","5417248":"Cobbled Deepslate Wall","5417249":"Cobbled Deepslate Wall","5417250":"Cobbled Deepslate Wall","5417252":"Cobbled Deepslate Wall","5417253":"Cobbled Deepslate Wall","5417254":"Cobbled Deepslate Wall","5417256":"Cobbled Deepslate Wall","5417257":"Cobbled Deepslate Wall","5417258":"Cobbled Deepslate Wall","5417280":"Cobbled Deepslate Wall","5417281":"Cobbled Deepslate Wall","5417282":"Cobbled Deepslate Wall","5417284":"Cobbled Deepslate Wall","5417285":"Cobbled Deepslate Wall","5417286":"Cobbled Deepslate Wall","5417288":"Cobbled Deepslate Wall","5417289":"Cobbled Deepslate Wall","5417290":"Cobbled Deepslate Wall","5417296":"Cobbled Deepslate Wall","5417297":"Cobbled Deepslate Wall","5417298":"Cobbled Deepslate Wall","5417300":"Cobbled Deepslate Wall","5417301":"Cobbled Deepslate Wall","5417302":"Cobbled Deepslate Wall","5417304":"Cobbled Deepslate Wall","5417305":"Cobbled Deepslate Wall","5417306":"Cobbled Deepslate Wall","5417312":"Cobbled Deepslate Wall","5417313":"Cobbled Deepslate Wall","5417314":"Cobbled Deepslate Wall","5417316":"Cobbled Deepslate Wall","5417317":"Cobbled Deepslate Wall","5417318":"Cobbled Deepslate Wall","5417320":"Cobbled Deepslate Wall","5417321":"Cobbled Deepslate Wall","5417322":"Cobbled Deepslate Wall","5417344":"Cobbled Deepslate Wall","5417345":"Cobbled Deepslate Wall","5417346":"Cobbled Deepslate Wall","5417348":"Cobbled Deepslate Wall","5417349":"Cobbled Deepslate Wall","5417350":"Cobbled Deepslate Wall","5417352":"Cobbled Deepslate Wall","5417353":"Cobbled Deepslate Wall","5417354":"Cobbled Deepslate Wall","5417360":"Cobbled Deepslate Wall","5417361":"Cobbled Deepslate Wall","5417362":"Cobbled Deepslate Wall","5417364":"Cobbled Deepslate Wall","5417365":"Cobbled Deepslate Wall","5417366":"Cobbled Deepslate Wall","5417368":"Cobbled Deepslate Wall","5417369":"Cobbled Deepslate Wall","5417370":"Cobbled Deepslate Wall","5417376":"Cobbled Deepslate Wall","5417377":"Cobbled Deepslate Wall","5417378":"Cobbled Deepslate Wall","5417380":"Cobbled Deepslate Wall","5417381":"Cobbled Deepslate Wall","5417382":"Cobbled Deepslate Wall","5417384":"Cobbled Deepslate Wall","5417385":"Cobbled Deepslate Wall","5417386":"Cobbled Deepslate Wall","5417472":"Polished Deepslate","5417984":"Polished Deepslate Slab","5417985":"Polished Deepslate Slab","5417986":"Polished Deepslate Slab","5418496":"Polished Deepslate Stairs","5418497":"Polished Deepslate Stairs","5418498":"Polished Deepslate Stairs","5418499":"Polished Deepslate Stairs","5418500":"Polished Deepslate Stairs","5418501":"Polished Deepslate Stairs","5418502":"Polished Deepslate Stairs","5418503":"Polished Deepslate Stairs","5419008":"Polished Deepslate Wall","5419009":"Polished Deepslate Wall","5419010":"Polished Deepslate Wall","5419012":"Polished Deepslate Wall","5419013":"Polished Deepslate Wall","5419014":"Polished Deepslate Wall","5419016":"Polished Deepslate Wall","5419017":"Polished Deepslate Wall","5419018":"Polished Deepslate Wall","5419024":"Polished Deepslate Wall","5419025":"Polished Deepslate Wall","5419026":"Polished Deepslate Wall","5419028":"Polished Deepslate Wall","5419029":"Polished Deepslate Wall","5419030":"Polished Deepslate Wall","5419032":"Polished Deepslate Wall","5419033":"Polished Deepslate Wall","5419034":"Polished Deepslate Wall","5419040":"Polished Deepslate Wall","5419041":"Polished Deepslate Wall","5419042":"Polished Deepslate Wall","5419044":"Polished Deepslate Wall","5419045":"Polished Deepslate Wall","5419046":"Polished Deepslate Wall","5419048":"Polished Deepslate Wall","5419049":"Polished Deepslate Wall","5419050":"Polished Deepslate Wall","5419072":"Polished Deepslate Wall","5419073":"Polished Deepslate Wall","5419074":"Polished Deepslate Wall","5419076":"Polished Deepslate Wall","5419077":"Polished Deepslate Wall","5419078":"Polished Deepslate Wall","5419080":"Polished Deepslate Wall","5419081":"Polished Deepslate Wall","5419082":"Polished Deepslate Wall","5419088":"Polished Deepslate Wall","5419089":"Polished Deepslate Wall","5419090":"Polished Deepslate Wall","5419092":"Polished Deepslate Wall","5419093":"Polished Deepslate Wall","5419094":"Polished Deepslate Wall","5419096":"Polished Deepslate Wall","5419097":"Polished Deepslate Wall","5419098":"Polished Deepslate Wall","5419104":"Polished Deepslate Wall","5419105":"Polished Deepslate Wall","5419106":"Polished Deepslate Wall","5419108":"Polished Deepslate Wall","5419109":"Polished Deepslate Wall","5419110":"Polished Deepslate Wall","5419112":"Polished Deepslate Wall","5419113":"Polished Deepslate Wall","5419114":"Polished Deepslate Wall","5419136":"Polished Deepslate Wall","5419137":"Polished Deepslate Wall","5419138":"Polished Deepslate Wall","5419140":"Polished Deepslate Wall","5419141":"Polished Deepslate Wall","5419142":"Polished Deepslate Wall","5419144":"Polished Deepslate Wall","5419145":"Polished Deepslate Wall","5419146":"Polished Deepslate Wall","5419152":"Polished Deepslate Wall","5419153":"Polished Deepslate Wall","5419154":"Polished Deepslate Wall","5419156":"Polished Deepslate Wall","5419157":"Polished Deepslate Wall","5419158":"Polished Deepslate Wall","5419160":"Polished Deepslate Wall","5419161":"Polished Deepslate Wall","5419162":"Polished Deepslate Wall","5419168":"Polished Deepslate Wall","5419169":"Polished Deepslate Wall","5419170":"Polished Deepslate Wall","5419172":"Polished Deepslate Wall","5419173":"Polished Deepslate Wall","5419174":"Polished Deepslate Wall","5419176":"Polished Deepslate Wall","5419177":"Polished Deepslate Wall","5419178":"Polished Deepslate Wall","5419264":"Polished Deepslate Wall","5419265":"Polished Deepslate Wall","5419266":"Polished Deepslate Wall","5419268":"Polished Deepslate Wall","5419269":"Polished Deepslate Wall","5419270":"Polished Deepslate Wall","5419272":"Polished Deepslate Wall","5419273":"Polished Deepslate Wall","5419274":"Polished Deepslate Wall","5419280":"Polished Deepslate Wall","5419281":"Polished Deepslate Wall","5419282":"Polished Deepslate Wall","5419284":"Polished Deepslate Wall","5419285":"Polished Deepslate Wall","5419286":"Polished Deepslate Wall","5419288":"Polished Deepslate Wall","5419289":"Polished Deepslate Wall","5419290":"Polished Deepslate Wall","5419296":"Polished Deepslate Wall","5419297":"Polished Deepslate Wall","5419298":"Polished Deepslate Wall","5419300":"Polished Deepslate Wall","5419301":"Polished Deepslate Wall","5419302":"Polished Deepslate Wall","5419304":"Polished Deepslate Wall","5419305":"Polished Deepslate Wall","5419306":"Polished Deepslate Wall","5419328":"Polished Deepslate Wall","5419329":"Polished Deepslate Wall","5419330":"Polished Deepslate Wall","5419332":"Polished Deepslate Wall","5419333":"Polished Deepslate Wall","5419334":"Polished Deepslate Wall","5419336":"Polished Deepslate Wall","5419337":"Polished Deepslate Wall","5419338":"Polished Deepslate Wall","5419344":"Polished Deepslate Wall","5419345":"Polished Deepslate Wall","5419346":"Polished Deepslate Wall","5419348":"Polished Deepslate Wall","5419349":"Polished Deepslate Wall","5419350":"Polished Deepslate Wall","5419352":"Polished Deepslate Wall","5419353":"Polished Deepslate Wall","5419354":"Polished Deepslate Wall","5419360":"Polished Deepslate Wall","5419361":"Polished Deepslate Wall","5419362":"Polished Deepslate Wall","5419364":"Polished Deepslate Wall","5419365":"Polished Deepslate Wall","5419366":"Polished Deepslate Wall","5419368":"Polished Deepslate Wall","5419369":"Polished Deepslate Wall","5419370":"Polished Deepslate Wall","5419392":"Polished Deepslate Wall","5419393":"Polished Deepslate Wall","5419394":"Polished Deepslate Wall","5419396":"Polished Deepslate Wall","5419397":"Polished Deepslate Wall","5419398":"Polished Deepslate Wall","5419400":"Polished Deepslate Wall","5419401":"Polished Deepslate Wall","5419402":"Polished Deepslate Wall","5419408":"Polished Deepslate Wall","5419409":"Polished Deepslate Wall","5419410":"Polished Deepslate Wall","5419412":"Polished Deepslate Wall","5419413":"Polished Deepslate Wall","5419414":"Polished Deepslate Wall","5419416":"Polished Deepslate Wall","5419417":"Polished Deepslate Wall","5419418":"Polished Deepslate Wall","5419424":"Polished Deepslate Wall","5419425":"Polished Deepslate Wall","5419426":"Polished Deepslate Wall","5419428":"Polished Deepslate Wall","5419429":"Polished Deepslate Wall","5419430":"Polished Deepslate Wall","5419432":"Polished Deepslate Wall","5419433":"Polished Deepslate Wall","5419434":"Polished Deepslate Wall","5444608":"Tinted Glass","5451264":"Mud Bricks","5451776":"Mud Brick Slab","5451777":"Mud Brick Slab","5451778":"Mud Brick Slab","5452288":"Mud Brick Stairs","5452289":"Mud Brick Stairs","5452290":"Mud Brick Stairs","5452291":"Mud Brick Stairs","5452292":"Mud Brick Stairs","5452293":"Mud Brick Stairs","5452294":"Mud Brick Stairs","5452295":"Mud Brick Stairs","5452800":"Mud Brick Wall","5452801":"Mud Brick Wall","5452802":"Mud Brick Wall","5452804":"Mud Brick Wall","5452805":"Mud Brick Wall","5452806":"Mud Brick Wall","5452808":"Mud Brick Wall","5452809":"Mud Brick Wall","5452810":"Mud Brick Wall","5452816":"Mud Brick Wall","5452817":"Mud Brick Wall","5452818":"Mud Brick Wall","5452820":"Mud Brick Wall","5452821":"Mud Brick Wall","5452822":"Mud Brick Wall","5452824":"Mud Brick Wall","5452825":"Mud Brick Wall","5452826":"Mud Brick Wall","5452832":"Mud Brick Wall","5452833":"Mud Brick Wall","5452834":"Mud Brick Wall","5452836":"Mud Brick Wall","5452837":"Mud Brick Wall","5452838":"Mud Brick Wall","5452840":"Mud Brick Wall","5452841":"Mud Brick Wall","5452842":"Mud Brick Wall","5452864":"Mud Brick Wall","5452865":"Mud Brick Wall","5452866":"Mud Brick Wall","5452868":"Mud Brick Wall","5452869":"Mud Brick Wall","5452870":"Mud Brick Wall","5452872":"Mud Brick Wall","5452873":"Mud Brick Wall","5452874":"Mud Brick Wall","5452880":"Mud Brick Wall","5452881":"Mud Brick Wall","5452882":"Mud Brick Wall","5452884":"Mud Brick Wall","5452885":"Mud Brick Wall","5452886":"Mud Brick Wall","5452888":"Mud Brick Wall","5452889":"Mud Brick Wall","5452890":"Mud Brick Wall","5452896":"Mud Brick Wall","5452897":"Mud Brick Wall","5452898":"Mud Brick Wall","5452900":"Mud Brick Wall","5452901":"Mud Brick Wall","5452902":"Mud Brick Wall","5452904":"Mud Brick Wall","5452905":"Mud Brick Wall","5452906":"Mud Brick Wall","5452928":"Mud Brick Wall","5452929":"Mud Brick Wall","5452930":"Mud Brick Wall","5452932":"Mud Brick Wall","5452933":"Mud Brick Wall","5452934":"Mud Brick Wall","5452936":"Mud Brick Wall","5452937":"Mud Brick Wall","5452938":"Mud Brick Wall","5452944":"Mud Brick Wall","5452945":"Mud Brick Wall","5452946":"Mud Brick Wall","5452948":"Mud Brick Wall","5452949":"Mud Brick Wall","5452950":"Mud Brick Wall","5452952":"Mud Brick Wall","5452953":"Mud Brick Wall","5452954":"Mud Brick Wall","5452960":"Mud Brick Wall","5452961":"Mud Brick Wall","5452962":"Mud Brick Wall","5452964":"Mud Brick Wall","5452965":"Mud Brick Wall","5452966":"Mud Brick Wall","5452968":"Mud Brick Wall","5452969":"Mud Brick Wall","5452970":"Mud Brick Wall","5453056":"Mud Brick Wall","5453057":"Mud Brick Wall","5453058":"Mud Brick Wall","5453060":"Mud Brick Wall","5453061":"Mud Brick Wall","5453062":"Mud Brick Wall","5453064":"Mud Brick Wall","5453065":"Mud Brick Wall","5453066":"Mud Brick Wall","5453072":"Mud Brick Wall","5453073":"Mud Brick Wall","5453074":"Mud Brick Wall","5453076":"Mud Brick Wall","5453077":"Mud Brick Wall","5453078":"Mud Brick Wall","5453080":"Mud Brick Wall","5453081":"Mud Brick Wall","5453082":"Mud Brick Wall","5453088":"Mud Brick Wall","5453089":"Mud Brick Wall","5453090":"Mud Brick Wall","5453092":"Mud Brick Wall","5453093":"Mud Brick Wall","5453094":"Mud Brick Wall","5453096":"Mud Brick Wall","5453097":"Mud Brick Wall","5453098":"Mud Brick Wall","5453120":"Mud Brick Wall","5453121":"Mud Brick Wall","5453122":"Mud Brick Wall","5453124":"Mud Brick Wall","5453125":"Mud Brick Wall","5453126":"Mud Brick Wall","5453128":"Mud Brick Wall","5453129":"Mud Brick Wall","5453130":"Mud Brick Wall","5453136":"Mud Brick Wall","5453137":"Mud Brick Wall","5453138":"Mud Brick Wall","5453140":"Mud Brick Wall","5453141":"Mud Brick Wall","5453142":"Mud Brick Wall","5453144":"Mud Brick Wall","5453145":"Mud Brick Wall","5453146":"Mud Brick Wall","5453152":"Mud Brick Wall","5453153":"Mud Brick Wall","5453154":"Mud Brick Wall","5453156":"Mud Brick Wall","5453157":"Mud Brick Wall","5453158":"Mud Brick Wall","5453160":"Mud Brick Wall","5453161":"Mud Brick Wall","5453162":"Mud Brick Wall","5453184":"Mud Brick Wall","5453185":"Mud Brick Wall","5453186":"Mud Brick Wall","5453188":"Mud Brick Wall","5453189":"Mud Brick Wall","5453190":"Mud Brick Wall","5453192":"Mud Brick Wall","5453193":"Mud Brick Wall","5453194":"Mud Brick Wall","5453200":"Mud Brick Wall","5453201":"Mud Brick Wall","5453202":"Mud Brick Wall","5453204":"Mud Brick Wall","5453205":"Mud Brick Wall","5453206":"Mud Brick Wall","5453208":"Mud Brick Wall","5453209":"Mud Brick Wall","5453210":"Mud Brick Wall","5453216":"Mud Brick Wall","5453217":"Mud Brick Wall","5453218":"Mud Brick Wall","5453220":"Mud Brick Wall","5453221":"Mud Brick Wall","5453222":"Mud Brick Wall","5453224":"Mud Brick Wall","5453225":"Mud Brick Wall","5453226":"Mud Brick Wall","5160448":"Coal Ore","5449728":"Copper Ore","5182976":"Diamond Ore","5250048":"Emerald Ore","5261824":"Gold Ore","5276672":"Iron Ore","5288448":"Lapis Lazuli Ore","5347840":"Redstone Ore","5347841":"Redstone Ore","5445632":"Deepslate Coal Ore","5449216":"Deepslate Copper Ore","5446144":"Deepslate Diamond Ore","5446656":"Deepslate Emerald Ore","5448704":"Deepslate Gold Ore","5448192":"Deepslate Iron Ore","5447168":"Deepslate Lapis Lazuli Ore","5447680":"Deepslate Redstone Ore","5447681":"Deepslate Redstone Ore","5307392":"Nether Quartz Ore","5450240":"Nether Gold Ore"},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ 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 edff9f7927..206e76ba54 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -45,7 +45,12 @@ if(file_exists($oldTablePath)){ if(!is_array($oldTable)){ throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } - $old = $oldTable["knownStates"]; + $old = []; + foreach($oldTable["knownStates"] as $name => $stateIds){ + foreach($stateIds as $stateId){ + $old[$stateId] = $name; + } + } $oldStateDataSize = $oldTable["stateDataBits"]; $oldStateDataMask = ~(~0 << $oldStateDataSize); @@ -72,15 +77,23 @@ if(file_exists($oldTablePath)){ echo "Name changed ($newId:$newStateData) " . $old[$reconstructedK] . " -> " . $name . "\n"; } } - } }else{ echo "WARNING: Unable to calculate diff, no previous consistency check file found\n"; } +$newTable = []; +foreach($new as $stateId => $name){ + $newTable[$name][] = $stateId; +} +ksort($newTable, SORT_STRING); +foreach($newTable as &$stateIds){ + sort($stateIds, SORT_NUMERIC); +} + file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( [ - "knownStates" => $new, + "knownStates" => $newTable, "stateDataBits" => Block::INTERNAL_STATE_DATA_BITS ], JSON_THROW_ON_ERROR From b0c76f4db5b7c963644eda184af5966303a3ddd0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 23:28:08 +0100 Subject: [PATCH 0300/1858] Fixed botched unit tests --- tests/phpunit/block/BlockTest.php | 11 ++++++++++- tests/phpunit/block/regenerate_consistency_check.php | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 3b8d704d97..c5df95c402 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -110,7 +110,16 @@ class BlockTest extends TestCase{ if(!is_array($list)){ throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } - $knownStates = $list["knownStates"]; + $knownStates = []; + /** + * @var string $name + * @var int[] $stateIds + */ + foreach($list["knownStates"] as $name => $stateIds){ + foreach($stateIds as $stateId){ + $knownStates[$stateId] = $name; + } + } $oldStateDataSize = $list["stateDataBits"]; self::assertSame($oldStateDataSize, Block::INTERNAL_STATE_DATA_BITS, "Changed number of state data bits - consistency check probably need regenerating"); diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index 206e76ba54..0db6d33826 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -46,6 +46,10 @@ if(file_exists($oldTablePath)){ throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } $old = []; + /** + * @var string $name + * @var int[] $stateIds + */ foreach($oldTable["knownStates"] as $name => $stateIds){ foreach($stateIds as $stateId){ $old[$stateId] = $name; From 976502e3dbc9b2593ecd9049842e5d754e851742 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 23:47:51 +0100 Subject: [PATCH 0301/1858] Move item type initialization to VanillaItems ItemFactory no longer has an obvious purpose, thanks to this ... --- src/item/ItemFactory.php | 358 +------------------------ src/item/VanillaItems.php | 537 +++++++++++++++++++++----------------- 2 files changed, 300 insertions(+), 595 deletions(-) diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 0e59e120c8..49b5943637 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -24,19 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\BlockFactory; -use pocketmine\block\utils\RecordType; -use pocketmine\block\utils\TreeType; -use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\entity\Entity; -use pocketmine\entity\Location; -use pocketmine\entity\Squid; -use pocketmine\entity\Villager; -use pocketmine\entity\Zombie; -use pocketmine\inventory\ArmorInventory; -use pocketmine\item\ItemIdentifier as IID; -use pocketmine\item\ItemTypeIds as Ids; -use pocketmine\math\Vector3; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\World; @@ -51,333 +38,12 @@ class ItemFactory{ private array $list = []; public function __construct(){ - $this->registerArmorItems(); - $this->registerSpawnEggs(); - $this->registerTierToolItems(); - - $this->register(new Apple(new IID(Ids::APPLE), "Apple")); - $this->register(new Arrow(new IID(Ids::ARROW), "Arrow")); - - $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); - $this->register(new Bamboo(new IID(Ids::BAMBOO), "Bamboo"), true); - $this->register(new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); - $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); - $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); - $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); - $this->register(new Book(new IID(Ids::BOOK), "Book")); - $this->register(new Bow(new IID(Ids::BOW), "Bow")); - $this->register(new Bowl(new IID(Ids::BOWL), "Bowl")); - $this->register(new Bread(new IID(Ids::BREAD), "Bread")); - $this->register(new Bucket(new IID(Ids::BUCKET), "Bucket")); - $this->register(new Carrot(new IID(Ids::CARROT), "Carrot")); - $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); - $this->register(new Clock(new IID(Ids::CLOCK), "Clock")); - $this->register(new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); - $this->register(new Coal(new IID(Ids::COAL), "Coal")); - - $this->register(new CoralFan(new IID(Ids::CORAL_FAN))); - - $this->register(new Coal(new IID(Ids::CHARCOAL), "Charcoal")); - $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); - $this->register(new Compass(new IID(Ids::COMPASS), "Compass")); - $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); - $this->register(new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); - $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); - $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP), "Cooked Porkchop")); - $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); - $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); - $this->register(new Cookie(new IID(Ids::COOKIE), "Cookie")); - $this->register(new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); - $this->register(new Egg(new IID(Ids::EGG), "Egg")); - $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); - $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); - $this->register(new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); - $this->register(new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); - $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); - $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); - $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); - $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); - $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); - $this->register(new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); - $this->register(new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); - $this->register(new Item(new IID(Ids::BLEACH), "Bleach")); //EDU - $this->register(new Item(new IID(Ids::BONE), "Bone")); - $this->register(new Item(new IID(Ids::BRICK), "Brick")); - $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); - $this->register(new Item(new IID(Ids::CLAY), "Clay")); - $this->register(new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); - $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); - $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); - $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); - $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); - $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); - $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); - $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_WATER), "Water")); //??? - $this->register(new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); - $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); - $this->register(new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); - $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); - $this->register(new Item(new IID(Ids::CHEMICAL_INK), "Ink")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); - $this->register(new Item(new IID(Ids::DIAMOND), "Diamond")); - $this->register(new Item(new IID(Ids::DISC_FRAGMENT_5), "Disc Fragment (5)")); - $this->register(new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); - $this->register(new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); - $this->register(new Item(new IID(Ids::INK_SAC), "Ink Sac")); - $this->register(new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); - $this->register(new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); - $this->register(new Item(new IID(Ids::EMERALD), "Emerald")); - $this->register(new Item(new IID(Ids::FEATHER), "Feather")); - $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); - $this->register(new Item(new IID(Ids::FLINT), "Flint")); - $this->register(new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); - $this->register(new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); - $this->register(new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); - $this->register(new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); - $this->register(new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); - $this->register(new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); - $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); - $this->register(new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); - $this->register(new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); - $this->register(new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); - $this->register(new Item(new IID(Ids::LEATHER), "Leather")); - $this->register(new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); - $this->register(new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); - $this->register(new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); - $this->register(new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); - $this->register(new Item(new IID(Ids::NETHER_STAR), "Nether Star")); - $this->register(new Item(new IID(Ids::PAPER), "Paper")); - $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); - $this->register(new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); - $this->register(new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); - $this->register(new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); - $this->register(new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); - $this->register(new Item(new IID(Ids::SLIMEBALL), "Slimeball")); - $this->register(new Item(new IID(Ids::SUGAR), "Sugar")); - $this->register(new Item(new IID(Ids::SCUTE), "Scute")); - $this->register(new Item(new IID(Ids::WHEAT), "Wheat")); - $this->register(new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); - $this->register(new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); - $this->register(new Item(new IID(Ids::RAW_IRON), "Raw Iron")); - $this->register(new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); - $this->register(new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); - - $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); - $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); - $this->register(new Melon(new IID(Ids::MELON), "Melon")); - $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); - $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); - $this->register(new Minecart(new IID(Ids::MINECART), "Minecart")); - $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); - $this->register(new PaintingItem(new IID(Ids::PAINTING), "Painting")); - $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); - $this->register(new Potato(new IID(Ids::POTATO), "Potato")); - $this->register(new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); - $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); - $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); - $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); - $this->register(new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); - $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); - $this->register(new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); - $this->register(new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); - $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); - $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); - $this->register(new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); - $this->register(new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); - $this->register(new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); - $this->register(new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); - $this->register(new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); - $this->register(new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); - $this->register(new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); - $this->register(new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); - $this->register(new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); - $this->register(new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); - $this->register(new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); - $this->register(new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); - $this->register(new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); - $this->register(new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); - $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); - $this->register(new Shears(new IID(Ids::SHEARS), "Shears")); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); - $this->register(new Snowball(new IID(Ids::SNOWBALL), "Snowball")); - $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); - $this->register(new Spyglass(new IID(Ids::SPYGLASS), "Spyglass")); - $this->register(new Steak(new IID(Ids::STEAK), "Steak")); - $this->register(new Stick(new IID(Ids::STICK), "Stick")); - $this->register(new StringItem(new IID(Ids::STRING), "String")); - $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); - $this->register(new Totem(new IID(Ids::TOTEM), "Totem of Undying")); - $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); - $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); - $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); - - //TODO: add interface to dye-colour objects - $this->register(new Dye(new IID(Ids::DYE), "Dye")); - $this->register(new Banner( - new IID(Ids::BANNER), - Blocks::BANNER(), - Blocks::WALL_BANNER() - )); - - $this->register(new Potion(new IID(Ids::POTION), "Potion")); - $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); - - foreach(TreeType::getAll() as $type){ - //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency - $this->register(new Boat(new IID(match($type){ - TreeType::OAK() => Ids::OAK_BOAT, - TreeType::SPRUCE() => Ids::SPRUCE_BOAT, - TreeType::BIRCH() => Ids::BIRCH_BOAT, - TreeType::JUNGLE() => Ids::JUNGLE_BOAT, - TreeType::ACACIA() => Ids::ACACIA_BOAT, - TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, - default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) - }), $type->getDisplayName() . " Boat", $type)); + foreach(VanillaItems::getAll() as $item){ + if($item->isNull()){ + continue; + } + $this->register($item); } - - //region --- auto-generated TODOs --- - //TODO: minecraft:armor_stand - //TODO: minecraft:balloon - //TODO: minecraft:banner_pattern - //TODO: minecraft:campfire - //TODO: minecraft:carrotOnAStick - //TODO: minecraft:chest_minecart - //TODO: minecraft:command_block_minecart - //TODO: minecraft:crossbow - //TODO: minecraft:elytra - //TODO: minecraft:emptyMap - //TODO: minecraft:enchanted_book - //TODO: minecraft:end_crystal - //TODO: minecraft:ender_eye - //TODO: minecraft:fireball - //TODO: minecraft:fireworks - //TODO: minecraft:fireworksCharge - //TODO: minecraft:glow_stick - //TODO: minecraft:hopper_minecart - //TODO: minecraft:horsearmordiamond - //TODO: minecraft:horsearmorgold - //TODO: minecraft:horsearmoriron - //TODO: minecraft:horsearmorleather - //TODO: minecraft:ice_bomb - //TODO: minecraft:kelp - //TODO: minecraft:lead - //TODO: minecraft:lingering_potion - //TODO: minecraft:map - //TODO: minecraft:medicine - //TODO: minecraft:name_tag - //TODO: minecraft:phantom_membrane - //TODO: minecraft:rapid_fertilizer - //TODO: minecraft:record_pigstep - //TODO: minecraft:saddle - //TODO: minecraft:shield - //TODO: minecraft:sparkler - //TODO: minecraft:spawn_egg - //TODO: minecraft:tnt_minecart - //TODO: minecraft:trident - //TODO: minecraft:turtle_helmet - //endregion - } - - private function registerSpawnEggs() : void{ - //TODO: the meta values should probably be hardcoded; they won't change, but the EntityLegacyIds might - $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG), "Zombie Spawn Egg") extends SpawnEgg{ - protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ - return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); - } - }); - $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ - public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ - return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); - } - }); - $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ - public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ - return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); - } - }); - } - - private function registerTierToolItems() : void{ - $this->register(new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); - $this->register(new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); - $this->register(new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); - $this->register(new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); - $this->register(new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); - $this->register(new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); - $this->register(new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); - $this->register(new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); - $this->register(new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); - $this->register(new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); - $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); - $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); - $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); - $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); - $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); - $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); - $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); - $this->register(new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); - $this->register(new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); - $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); - $this->register(new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); - $this->register(new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); - $this->register(new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); - $this->register(new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); - $this->register(new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); - } - - private function registerArmorItems() : void{ - $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); } /** @@ -407,20 +73,6 @@ class ItemFactory{ return -$id; } - /** - * @internal - */ - public function fromTypeId(int $typeId) : Item{ - if(isset($this->list[$typeId])){ - return clone $this->list[$typeId]; - } - if($typeId <= 0){ - return BlockFactory::getInstance()->fromTypeId(self::itemToBlockId($typeId))->asItem(); - } - - throw new \InvalidArgumentException("No item with type ID $typeId is registered"); - } - /** * Returns whether the specified item ID is already registered in the item factory. */ diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index cae21904b8..5a645353f0 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -23,9 +23,22 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\block\utils\RecordType; +use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks; +use pocketmine\block\VanillaBlocks as Blocks; +use pocketmine\entity\Entity; +use pocketmine\entity\Location; +use pocketmine\entity\Squid; +use pocketmine\entity\Villager; +use pocketmine\entity\Zombie; +use pocketmine\inventory\ArmorInventory; +use pocketmine\item\ItemIdentifier as IID; use pocketmine\item\ItemTypeIds as Ids; +use pocketmine\math\Vector3; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\CloningRegistryTrait; +use pocketmine\world\World; /** * This doc-block is generated automatically, do not modify it manually. @@ -298,249 +311,289 @@ final class VanillaItems{ } protected static function setup() : void{ - $factory = ItemFactory::getInstance(); + self::registerArmorItems(); + self::registerSpawnEggs(); + self::registerTierToolItems(); + self::register("air", VanillaBlocks::AIR()->asItem()->setCount(0)); - self::register("acacia_boat", $factory->fromTypeId(Ids::ACACIA_BOAT)); - self::register("acacia_sign", $factory->fromTypeId(Ids::ACACIA_SIGN)); - self::register("amethyst_shard", $factory->fromTypeId(Ids::AMETHYST_SHARD)); - self::register("apple", $factory->fromTypeId(Ids::APPLE)); - self::register("arrow", $factory->fromTypeId(Ids::ARROW)); - self::register("baked_potato", $factory->fromTypeId(Ids::BAKED_POTATO)); - self::register("bamboo", $factory->fromTypeId(Ids::BAMBOO)); - self::register("banner", $factory->fromTypeId(Ids::BANNER)); - self::register("beetroot", $factory->fromTypeId(Ids::BEETROOT)); - self::register("beetroot_seeds", $factory->fromTypeId(Ids::BEETROOT_SEEDS)); - self::register("beetroot_soup", $factory->fromTypeId(Ids::BEETROOT_SOUP)); - self::register("birch_boat", $factory->fromTypeId(Ids::BIRCH_BOAT)); - self::register("birch_sign", $factory->fromTypeId(Ids::BIRCH_SIGN)); - self::register("blaze_powder", $factory->fromTypeId(Ids::BLAZE_POWDER)); - self::register("blaze_rod", $factory->fromTypeId(Ids::BLAZE_ROD)); - self::register("bleach", $factory->fromTypeId(Ids::BLEACH)); - self::register("bone", $factory->fromTypeId(Ids::BONE)); - self::register("bone_meal", $factory->fromTypeId(Ids::BONE_MEAL)); - self::register("book", $factory->fromTypeId(Ids::BOOK)); - self::register("bow", $factory->fromTypeId(Ids::BOW)); - self::register("bowl", $factory->fromTypeId(Ids::BOWL)); - self::register("bread", $factory->fromTypeId(Ids::BREAD)); - self::register("brick", $factory->fromTypeId(Ids::BRICK)); - self::register("bucket", $factory->fromTypeId(Ids::BUCKET)); - self::register("carrot", $factory->fromTypeId(Ids::CARROT)); - self::register("chainmail_boots", $factory->fromTypeId(Ids::CHAINMAIL_BOOTS)); - self::register("chainmail_chestplate", $factory->fromTypeId(Ids::CHAINMAIL_CHESTPLATE)); - self::register("chainmail_helmet", $factory->fromTypeId(Ids::CHAINMAIL_HELMET)); - self::register("chainmail_leggings", $factory->fromTypeId(Ids::CHAINMAIL_LEGGINGS)); - self::register("charcoal", $factory->fromTypeId(Ids::CHARCOAL)); - self::register("chemical_aluminium_oxide", $factory->fromTypeId(Ids::CHEMICAL_ALUMINIUM_OXIDE)); - self::register("chemical_ammonia", $factory->fromTypeId(Ids::CHEMICAL_AMMONIA)); - self::register("chemical_barium_sulphate", $factory->fromTypeId(Ids::CHEMICAL_BARIUM_SULPHATE)); - self::register("chemical_benzene", $factory->fromTypeId(Ids::CHEMICAL_BENZENE)); - self::register("chemical_boron_trioxide", $factory->fromTypeId(Ids::CHEMICAL_BORON_TRIOXIDE)); - self::register("chemical_calcium_bromide", $factory->fromTypeId(Ids::CHEMICAL_CALCIUM_BROMIDE)); - self::register("chemical_calcium_chloride", $factory->fromTypeId(Ids::CHEMICAL_CALCIUM_CHLORIDE)); - self::register("chemical_cerium_chloride", $factory->fromTypeId(Ids::CHEMICAL_CERIUM_CHLORIDE)); - self::register("chemical_charcoal", $factory->fromTypeId(Ids::CHEMICAL_CHARCOAL)); - self::register("chemical_crude_oil", $factory->fromTypeId(Ids::CHEMICAL_CRUDE_OIL)); - self::register("chemical_glue", $factory->fromTypeId(Ids::CHEMICAL_GLUE)); - self::register("chemical_hydrogen_peroxide", $factory->fromTypeId(Ids::CHEMICAL_HYDROGEN_PEROXIDE)); - self::register("chemical_hypochlorite", $factory->fromTypeId(Ids::CHEMICAL_HYPOCHLORITE)); - self::register("chemical_ink", $factory->fromTypeId(Ids::CHEMICAL_INK)); - self::register("chemical_iron_sulphide", $factory->fromTypeId(Ids::CHEMICAL_IRON_SULPHIDE)); - self::register("chemical_latex", $factory->fromTypeId(Ids::CHEMICAL_LATEX)); - self::register("chemical_lithium_hydride", $factory->fromTypeId(Ids::CHEMICAL_LITHIUM_HYDRIDE)); - self::register("chemical_luminol", $factory->fromTypeId(Ids::CHEMICAL_LUMINOL)); - self::register("chemical_magnesium_nitrate", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_NITRATE)); - self::register("chemical_magnesium_oxide", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_OXIDE)); - self::register("chemical_magnesium_salts", $factory->fromTypeId(Ids::CHEMICAL_MAGNESIUM_SALTS)); - self::register("chemical_mercuric_chloride", $factory->fromTypeId(Ids::CHEMICAL_MERCURIC_CHLORIDE)); - self::register("chemical_polyethylene", $factory->fromTypeId(Ids::CHEMICAL_POLYETHYLENE)); - self::register("chemical_potassium_chloride", $factory->fromTypeId(Ids::CHEMICAL_POTASSIUM_CHLORIDE)); - self::register("chemical_potassium_iodide", $factory->fromTypeId(Ids::CHEMICAL_POTASSIUM_IODIDE)); - self::register("chemical_rubbish", $factory->fromTypeId(Ids::CHEMICAL_RUBBISH)); - self::register("chemical_salt", $factory->fromTypeId(Ids::CHEMICAL_SALT)); - self::register("chemical_soap", $factory->fromTypeId(Ids::CHEMICAL_SOAP)); - self::register("chemical_sodium_acetate", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_ACETATE)); - self::register("chemical_sodium_fluoride", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_FLUORIDE)); - self::register("chemical_sodium_hydride", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYDRIDE)); - self::register("chemical_sodium_hydroxide", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYDROXIDE)); - self::register("chemical_sodium_hypochlorite", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_HYPOCHLORITE)); - self::register("chemical_sodium_oxide", $factory->fromTypeId(Ids::CHEMICAL_SODIUM_OXIDE)); - self::register("chemical_sugar", $factory->fromTypeId(Ids::CHEMICAL_SUGAR)); - self::register("chemical_sulphate", $factory->fromTypeId(Ids::CHEMICAL_SULPHATE)); - self::register("chemical_tungsten_chloride", $factory->fromTypeId(Ids::CHEMICAL_TUNGSTEN_CHLORIDE)); - self::register("chemical_water", $factory->fromTypeId(Ids::CHEMICAL_WATER)); - self::register("chorus_fruit", $factory->fromTypeId(Ids::CHORUS_FRUIT)); - self::register("clay", $factory->fromTypeId(Ids::CLAY)); - self::register("clock", $factory->fromTypeId(Ids::CLOCK)); - self::register("clownfish", $factory->fromTypeId(Ids::CLOWNFISH)); - self::register("coal", $factory->fromTypeId(Ids::COAL)); - self::register("cocoa_beans", $factory->fromTypeId(Ids::COCOA_BEANS)); - self::register("compass", $factory->fromTypeId(Ids::COMPASS)); - self::register("cooked_chicken", $factory->fromTypeId(Ids::COOKED_CHICKEN)); - self::register("cooked_fish", $factory->fromTypeId(Ids::COOKED_FISH)); - self::register("cooked_mutton", $factory->fromTypeId(Ids::COOKED_MUTTON)); - self::register("cooked_porkchop", $factory->fromTypeId(Ids::COOKED_PORKCHOP)); - self::register("cooked_rabbit", $factory->fromTypeId(Ids::COOKED_RABBIT)); - self::register("cooked_salmon", $factory->fromTypeId(Ids::COOKED_SALMON)); - self::register("cookie", $factory->fromTypeId(Ids::COOKIE)); - self::register("copper_ingot", $factory->fromTypeId(Ids::COPPER_INGOT)); - self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); - self::register("crimson_sign", $factory->fromTypeId(Ids::CRIMSON_SIGN)); - self::register("dark_oak_boat", $factory->fromTypeId(Ids::DARK_OAK_BOAT)); - self::register("dark_oak_sign", $factory->fromTypeId(Ids::DARK_OAK_SIGN)); - self::register("diamond", $factory->fromTypeId(Ids::DIAMOND)); - self::register("diamond_axe", $factory->fromTypeId(Ids::DIAMOND_AXE)); - self::register("diamond_boots", $factory->fromTypeId(Ids::DIAMOND_BOOTS)); - self::register("diamond_chestplate", $factory->fromTypeId(Ids::DIAMOND_CHESTPLATE)); - self::register("diamond_helmet", $factory->fromTypeId(Ids::DIAMOND_HELMET)); - self::register("diamond_hoe", $factory->fromTypeId(Ids::DIAMOND_HOE)); - self::register("diamond_leggings", $factory->fromTypeId(Ids::DIAMOND_LEGGINGS)); - self::register("diamond_pickaxe", $factory->fromTypeId(Ids::DIAMOND_PICKAXE)); - self::register("diamond_shovel", $factory->fromTypeId(Ids::DIAMOND_SHOVEL)); - self::register("diamond_sword", $factory->fromTypeId(Ids::DIAMOND_SWORD)); - self::register("disc_fragment_5", $factory->fromTypeId(Ids::DISC_FRAGMENT_5)); - self::register("dragon_breath", $factory->fromTypeId(Ids::DRAGON_BREATH)); - self::register("dried_kelp", $factory->fromTypeId(Ids::DRIED_KELP)); - self::register("dye", $factory->fromTypeId(Ids::DYE)); - self::register("echo_shard", $factory->fromTypeId(Ids::ECHO_SHARD)); - self::register("egg", $factory->fromTypeId(Ids::EGG)); - self::register("emerald", $factory->fromTypeId(Ids::EMERALD)); - self::register("enchanted_golden_apple", $factory->fromTypeId(Ids::ENCHANTED_GOLDEN_APPLE)); - self::register("ender_pearl", $factory->fromTypeId(Ids::ENDER_PEARL)); - self::register("experience_bottle", $factory->fromTypeId(Ids::EXPERIENCE_BOTTLE)); - self::register("feather", $factory->fromTypeId(Ids::FEATHER)); - self::register("fermented_spider_eye", $factory->fromTypeId(Ids::FERMENTED_SPIDER_EYE)); - self::register("fishing_rod", $factory->fromTypeId(Ids::FISHING_ROD)); - self::register("flint", $factory->fromTypeId(Ids::FLINT)); - self::register("flint_and_steel", $factory->fromTypeId(Ids::FLINT_AND_STEEL)); - self::register("ghast_tear", $factory->fromTypeId(Ids::GHAST_TEAR)); - self::register("glass_bottle", $factory->fromTypeId(Ids::GLASS_BOTTLE)); - self::register("glistering_melon", $factory->fromTypeId(Ids::GLISTERING_MELON)); - self::register("glow_ink_sac", $factory->fromTypeId(Ids::GLOW_INK_SAC)); - self::register("glowstone_dust", $factory->fromTypeId(Ids::GLOWSTONE_DUST)); - self::register("gold_ingot", $factory->fromTypeId(Ids::GOLD_INGOT)); - self::register("gold_nugget", $factory->fromTypeId(Ids::GOLD_NUGGET)); - self::register("golden_apple", $factory->fromTypeId(Ids::GOLDEN_APPLE)); - self::register("golden_axe", $factory->fromTypeId(Ids::GOLDEN_AXE)); - self::register("golden_boots", $factory->fromTypeId(Ids::GOLDEN_BOOTS)); - self::register("golden_carrot", $factory->fromTypeId(Ids::GOLDEN_CARROT)); - self::register("golden_chestplate", $factory->fromTypeId(Ids::GOLDEN_CHESTPLATE)); - self::register("golden_helmet", $factory->fromTypeId(Ids::GOLDEN_HELMET)); - self::register("golden_hoe", $factory->fromTypeId(Ids::GOLDEN_HOE)); - self::register("golden_leggings", $factory->fromTypeId(Ids::GOLDEN_LEGGINGS)); - self::register("golden_pickaxe", $factory->fromTypeId(Ids::GOLDEN_PICKAXE)); - self::register("golden_shovel", $factory->fromTypeId(Ids::GOLDEN_SHOVEL)); - self::register("golden_sword", $factory->fromTypeId(Ids::GOLDEN_SWORD)); - self::register("gunpowder", $factory->fromTypeId(Ids::GUNPOWDER)); - self::register("heart_of_the_sea", $factory->fromTypeId(Ids::HEART_OF_THE_SEA)); - self::register("honeycomb", $factory->fromTypeId(Ids::HONEYCOMB)); - self::register("ink_sac", $factory->fromTypeId(Ids::INK_SAC)); - self::register("iron_axe", $factory->fromTypeId(Ids::IRON_AXE)); - self::register("iron_boots", $factory->fromTypeId(Ids::IRON_BOOTS)); - self::register("iron_chestplate", $factory->fromTypeId(Ids::IRON_CHESTPLATE)); - self::register("iron_helmet", $factory->fromTypeId(Ids::IRON_HELMET)); - self::register("iron_hoe", $factory->fromTypeId(Ids::IRON_HOE)); - self::register("iron_ingot", $factory->fromTypeId(Ids::IRON_INGOT)); - self::register("iron_leggings", $factory->fromTypeId(Ids::IRON_LEGGINGS)); - self::register("iron_nugget", $factory->fromTypeId(Ids::IRON_NUGGET)); - self::register("iron_pickaxe", $factory->fromTypeId(Ids::IRON_PICKAXE)); - self::register("iron_shovel", $factory->fromTypeId(Ids::IRON_SHOVEL)); - self::register("iron_sword", $factory->fromTypeId(Ids::IRON_SWORD)); - self::register("jungle_boat", $factory->fromTypeId(Ids::JUNGLE_BOAT)); - self::register("jungle_sign", $factory->fromTypeId(Ids::JUNGLE_SIGN)); - self::register("lapis_lazuli", $factory->fromTypeId(Ids::LAPIS_LAZULI)); - self::register("lava_bucket", $factory->fromTypeId(Ids::LAVA_BUCKET)); - self::register("leather", $factory->fromTypeId(Ids::LEATHER)); - self::register("leather_boots", $factory->fromTypeId(Ids::LEATHER_BOOTS)); - self::register("leather_cap", $factory->fromTypeId(Ids::LEATHER_CAP)); - self::register("leather_pants", $factory->fromTypeId(Ids::LEATHER_PANTS)); - self::register("leather_tunic", $factory->fromTypeId(Ids::LEATHER_TUNIC)); - self::register("magma_cream", $factory->fromTypeId(Ids::MAGMA_CREAM)); - self::register("mangrove_sign", $factory->fromTypeId(Ids::MANGROVE_SIGN)); - self::register("melon", $factory->fromTypeId(Ids::MELON)); - self::register("melon_seeds", $factory->fromTypeId(Ids::MELON_SEEDS)); - self::register("milk_bucket", $factory->fromTypeId(Ids::MILK_BUCKET)); - self::register("minecart", $factory->fromTypeId(Ids::MINECART)); - self::register("mushroom_stew", $factory->fromTypeId(Ids::MUSHROOM_STEW)); - self::register("nautilus_shell", $factory->fromTypeId(Ids::NAUTILUS_SHELL)); - self::register("nether_brick", $factory->fromTypeId(Ids::NETHER_BRICK)); - self::register("nether_quartz", $factory->fromTypeId(Ids::NETHER_QUARTZ)); - self::register("nether_star", $factory->fromTypeId(Ids::NETHER_STAR)); - self::register("oak_boat", $factory->fromTypeId(Ids::OAK_BOAT)); - self::register("oak_sign", $factory->fromTypeId(Ids::OAK_SIGN)); - self::register("painting", $factory->fromTypeId(Ids::PAINTING)); - self::register("paper", $factory->fromTypeId(Ids::PAPER)); - self::register("phantom_membrane", $factory->fromTypeId(Ids::PHANTOM_MEMBRANE)); - self::register("poisonous_potato", $factory->fromTypeId(Ids::POISONOUS_POTATO)); - self::register("popped_chorus_fruit", $factory->fromTypeId(Ids::POPPED_CHORUS_FRUIT)); - self::register("potato", $factory->fromTypeId(Ids::POTATO)); - self::register("potion", $factory->fromTypeId(Ids::POTION)); - self::register("prismarine_crystals", $factory->fromTypeId(Ids::PRISMARINE_CRYSTALS)); - self::register("prismarine_shard", $factory->fromTypeId(Ids::PRISMARINE_SHARD)); - self::register("pufferfish", $factory->fromTypeId(Ids::PUFFERFISH)); - self::register("pumpkin_pie", $factory->fromTypeId(Ids::PUMPKIN_PIE)); - self::register("pumpkin_seeds", $factory->fromTypeId(Ids::PUMPKIN_SEEDS)); - self::register("rabbit_foot", $factory->fromTypeId(Ids::RABBIT_FOOT)); - self::register("rabbit_hide", $factory->fromTypeId(Ids::RABBIT_HIDE)); - self::register("rabbit_stew", $factory->fromTypeId(Ids::RABBIT_STEW)); - self::register("raw_beef", $factory->fromTypeId(Ids::RAW_BEEF)); - self::register("raw_chicken", $factory->fromTypeId(Ids::RAW_CHICKEN)); - self::register("raw_copper", $factory->fromTypeId(Ids::RAW_COPPER)); - self::register("raw_fish", $factory->fromTypeId(Ids::RAW_FISH)); - self::register("raw_gold", $factory->fromTypeId(Ids::RAW_GOLD)); - self::register("raw_iron", $factory->fromTypeId(Ids::RAW_IRON)); - self::register("raw_mutton", $factory->fromTypeId(Ids::RAW_MUTTON)); - self::register("raw_porkchop", $factory->fromTypeId(Ids::RAW_PORKCHOP)); - self::register("raw_rabbit", $factory->fromTypeId(Ids::RAW_RABBIT)); - self::register("raw_salmon", $factory->fromTypeId(Ids::RAW_SALMON)); - self::register("record_11", $factory->fromTypeId(Ids::RECORD_11)); - self::register("record_13", $factory->fromTypeId(Ids::RECORD_13)); - self::register("record_blocks", $factory->fromTypeId(Ids::RECORD_BLOCKS)); - self::register("record_cat", $factory->fromTypeId(Ids::RECORD_CAT)); - self::register("record_chirp", $factory->fromTypeId(Ids::RECORD_CHIRP)); - self::register("record_far", $factory->fromTypeId(Ids::RECORD_FAR)); - self::register("record_mall", $factory->fromTypeId(Ids::RECORD_MALL)); - self::register("record_mellohi", $factory->fromTypeId(Ids::RECORD_MELLOHI)); - self::register("record_stal", $factory->fromTypeId(Ids::RECORD_STAL)); - self::register("record_strad", $factory->fromTypeId(Ids::RECORD_STRAD)); - self::register("record_wait", $factory->fromTypeId(Ids::RECORD_WAIT)); - self::register("record_ward", $factory->fromTypeId(Ids::RECORD_WARD)); - self::register("redstone_dust", $factory->fromTypeId(Ids::REDSTONE_DUST)); - self::register("rotten_flesh", $factory->fromTypeId(Ids::ROTTEN_FLESH)); - self::register("scute", $factory->fromTypeId(Ids::SCUTE)); - self::register("shears", $factory->fromTypeId(Ids::SHEARS)); - self::register("shulker_shell", $factory->fromTypeId(Ids::SHULKER_SHELL)); - self::register("slimeball", $factory->fromTypeId(Ids::SLIMEBALL)); - self::register("snowball", $factory->fromTypeId(Ids::SNOWBALL)); - self::register("spider_eye", $factory->fromTypeId(Ids::SPIDER_EYE)); - self::register("splash_potion", $factory->fromTypeId(Ids::SPLASH_POTION)); - self::register("spruce_boat", $factory->fromTypeId(Ids::SPRUCE_BOAT)); - self::register("spruce_sign", $factory->fromTypeId(Ids::SPRUCE_SIGN)); - self::register("spyglass", $factory->fromTypeId(Ids::SPYGLASS)); - self::register("squid_spawn_egg", $factory->fromTypeId(Ids::SQUID_SPAWN_EGG)); - self::register("steak", $factory->fromTypeId(Ids::STEAK)); - self::register("stick", $factory->fromTypeId(Ids::STICK)); - self::register("stone_axe", $factory->fromTypeId(Ids::STONE_AXE)); - self::register("stone_hoe", $factory->fromTypeId(Ids::STONE_HOE)); - self::register("stone_pickaxe", $factory->fromTypeId(Ids::STONE_PICKAXE)); - self::register("stone_shovel", $factory->fromTypeId(Ids::STONE_SHOVEL)); - self::register("stone_sword", $factory->fromTypeId(Ids::STONE_SWORD)); - self::register("string", $factory->fromTypeId(Ids::STRING)); - self::register("sugar", $factory->fromTypeId(Ids::SUGAR)); - self::register("sweet_berries", $factory->fromTypeId(Ids::SWEET_BERRIES)); - self::register("totem", $factory->fromTypeId(Ids::TOTEM)); - self::register("villager_spawn_egg", $factory->fromTypeId(Ids::VILLAGER_SPAWN_EGG)); - self::register("warped_sign", $factory->fromTypeId(Ids::WARPED_SIGN)); - self::register("water_bucket", $factory->fromTypeId(Ids::WATER_BUCKET)); - self::register("wheat", $factory->fromTypeId(Ids::WHEAT)); - self::register("wheat_seeds", $factory->fromTypeId(Ids::WHEAT_SEEDS)); - self::register("wooden_axe", $factory->fromTypeId(Ids::WOODEN_AXE)); - self::register("wooden_hoe", $factory->fromTypeId(Ids::WOODEN_HOE)); - self::register("wooden_pickaxe", $factory->fromTypeId(Ids::WOODEN_PICKAXE)); - self::register("wooden_shovel", $factory->fromTypeId(Ids::WOODEN_SHOVEL)); - self::register("wooden_sword", $factory->fromTypeId(Ids::WOODEN_SWORD)); - self::register("writable_book", $factory->fromTypeId(Ids::WRITABLE_BOOK)); - self::register("written_book", $factory->fromTypeId(Ids::WRITTEN_BOOK)); - self::register("zombie_spawn_egg", $factory->fromTypeId(Ids::ZOMBIE_SPAWN_EGG)); + self::register("apple", new Apple(new IID(Ids::APPLE), "Apple")); + self::register("arrow", new Arrow(new IID(Ids::ARROW), "Arrow")); + + self::register("baked_potato", new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); + self::register("bamboo", new Bamboo(new IID(Ids::BAMBOO), "Bamboo")); + self::register("beetroot", new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); + self::register("beetroot_seeds", new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); + self::register("beetroot_soup", new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); + self::register("blaze_rod", new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); + self::register("book", new Book(new IID(Ids::BOOK), "Book")); + self::register("bow", new Bow(new IID(Ids::BOW), "Bow")); + self::register("bowl", new Bowl(new IID(Ids::BOWL), "Bowl")); + self::register("bread", new Bread(new IID(Ids::BREAD), "Bread")); + self::register("bucket", new Bucket(new IID(Ids::BUCKET), "Bucket")); + self::register("carrot", new Carrot(new IID(Ids::CARROT), "Carrot")); + self::register("chorus_fruit", new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); + self::register("clock", new Clock(new IID(Ids::CLOCK), "Clock")); + self::register("clownfish", new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); + self::register("coal", new Coal(new IID(Ids::COAL), "Coal")); + + self::register("coral_fan", new CoralFan(new IID(Ids::CORAL_FAN))); + + self::register("charcoal", new Coal(new IID(Ids::CHARCOAL), "Charcoal")); + self::register("cocoa_beans", new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); + self::register("compass", new Compass(new IID(Ids::COMPASS), "Compass")); + self::register("cooked_chicken", new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); + self::register("cooked_fish", new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); + self::register("cooked_mutton", new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); + self::register("cooked_porkchop", new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP), "Cooked Porkchop")); + self::register("cooked_rabbit", new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); + self::register("cooked_salmon", new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); + self::register("cookie", new Cookie(new IID(Ids::COOKIE), "Cookie")); + self::register("dried_kelp", new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); + self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); + self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); + self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); + self::register("bone_meal", new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); + self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); + self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); + self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); + self::register("golden_apple", new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); + self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); + self::register("golden_carrot", new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); + self::register("amethyst_shard", new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); + self::register("blaze_powder", new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); + self::register("bleach", new Item(new IID(Ids::BLEACH), "Bleach")); + self::register("bone", new Item(new IID(Ids::BONE), "Bone")); + self::register("brick", new Item(new IID(Ids::BRICK), "Brick")); + self::register("popped_chorus_fruit", new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); + self::register("clay", new Item(new IID(Ids::CLAY), "Clay")); + self::register("chemical_salt", new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); + self::register("chemical_sodium_oxide", new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); + self::register("chemical_sodium_hydroxide", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); + self::register("chemical_magnesium_nitrate", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); + self::register("chemical_iron_sulphide", new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); + self::register("chemical_lithium_hydride", new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); + self::register("chemical_sodium_hydride", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); + self::register("chemical_calcium_bromide", new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); + self::register("chemical_magnesium_oxide", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); + self::register("chemical_sodium_acetate", new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); + self::register("chemical_luminol", new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); + self::register("chemical_charcoal", new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); + self::register("chemical_sugar", new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); + self::register("chemical_aluminium_oxide", new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); + self::register("chemical_boron_trioxide", new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); + self::register("chemical_soap", new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); + self::register("chemical_polyethylene", new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); + self::register("chemical_rubbish", new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); + self::register("chemical_magnesium_salts", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); + self::register("chemical_sulphate", new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); + self::register("chemical_barium_sulphate", new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); + self::register("chemical_potassium_chloride", new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); + self::register("chemical_mercuric_chloride", new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); + self::register("chemical_cerium_chloride", new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); + self::register("chemical_tungsten_chloride", new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); + self::register("chemical_calcium_chloride", new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); + self::register("chemical_water", new Item(new IID(Ids::CHEMICAL_WATER), "Water")); + self::register("chemical_glue", new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); + self::register("chemical_hypochlorite", new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); + self::register("chemical_crude_oil", new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); + self::register("chemical_latex", new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); + self::register("chemical_potassium_iodide", new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); + self::register("chemical_sodium_fluoride", new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); + self::register("chemical_benzene", new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); + self::register("chemical_ink", new Item(new IID(Ids::CHEMICAL_INK), "Ink")); + self::register("chemical_hydrogen_peroxide", new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); + self::register("chemical_ammonia", new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); + self::register("chemical_sodium_hypochlorite", new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + self::register("diamond", new Item(new IID(Ids::DIAMOND), "Diamond")); + self::register("disc_fragment_5", new Item(new IID(Ids::DISC_FRAGMENT_5), "Disc Fragment (5)")); + self::register("dragon_breath", new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); + self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); + self::register("ink_sac", new Item(new IID(Ids::INK_SAC), "Ink Sac")); + self::register("lapis_lazuli", new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + self::register("echo_shard", new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); + self::register("emerald", new Item(new IID(Ids::EMERALD), "Emerald")); + self::register("feather", new Item(new IID(Ids::FEATHER), "Feather")); + self::register("fermented_spider_eye", new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); + self::register("flint", new Item(new IID(Ids::FLINT), "Flint")); + self::register("ghast_tear", new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); + self::register("glistering_melon", new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); + self::register("glowstone_dust", new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); + self::register("gold_ingot", new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); + self::register("gold_nugget", new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); + self::register("gunpowder", new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); + self::register("heart_of_the_sea", new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); + self::register("honeycomb", new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); + self::register("iron_ingot", new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); + self::register("iron_nugget", new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); + self::register("leather", new Item(new IID(Ids::LEATHER), "Leather")); + self::register("magma_cream", new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); + self::register("nautilus_shell", new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); + self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); + self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); + self::register("nether_star", new Item(new IID(Ids::NETHER_STAR), "Nether Star")); + self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); + self::register("prismarine_crystals", new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); + self::register("prismarine_shard", new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); + self::register("rabbit_foot", new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); + self::register("rabbit_hide", new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); + self::register("shulker_shell", new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); + self::register("slimeball", new Item(new IID(Ids::SLIMEBALL), "Slimeball")); + self::register("sugar", new Item(new IID(Ids::SUGAR), "Sugar")); + self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); + self::register("wheat", new Item(new IID(Ids::WHEAT), "Wheat")); + self::register("copper_ingot", new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); + self::register("raw_copper", new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); + self::register("raw_iron", new Item(new IID(Ids::RAW_IRON), "Raw Iron")); + self::register("raw_gold", new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); + self::register("phantom_membrane", new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); + + self::register("water_bucket", new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); + self::register("lava_bucket", new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); + self::register("melon", new Melon(new IID(Ids::MELON), "Melon")); + self::register("melon_seeds", new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); + self::register("milk_bucket", new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); + self::register("minecart", new Minecart(new IID(Ids::MINECART), "Minecart")); + self::register("mushroom_stew", new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); + self::register("painting", new PaintingItem(new IID(Ids::PAINTING), "Painting")); + self::register("poisonous_potato", new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); + self::register("potato", new Potato(new IID(Ids::POTATO), "Potato")); + self::register("pufferfish", new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); + self::register("pumpkin_pie", new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); + self::register("pumpkin_seeds", new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); + self::register("rabbit_stew", new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); + self::register("raw_beef", new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); + self::register("raw_chicken", new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); + self::register("raw_fish", new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); + self::register("raw_mutton", new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); + self::register("raw_porkchop", new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); + self::register("raw_rabbit", new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); + self::register("raw_salmon", new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); + self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); + self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); + self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); + self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); + self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); + self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); + self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); + self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); + self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); + self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); + self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); + self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); + self::register("redstone_dust", new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); + self::register("rotten_flesh", new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); + self::register("shears", new Shears(new IID(Ids::SHEARS), "Shears")); + self::register("oak_sign", new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); + self::register("spruce_sign", new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); + self::register("birch_sign", new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + self::register("jungle_sign", new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + self::register("acacia_sign", new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + self::register("dark_oak_sign", new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + self::register("mangrove_sign", new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); + self::register("crimson_sign", new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); + self::register("warped_sign", new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); + self::register("snowball", new Snowball(new IID(Ids::SNOWBALL), "Snowball")); + self::register("spider_eye", new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); + self::register("spyglass", new Spyglass(new IID(Ids::SPYGLASS), "Spyglass")); + self::register("steak", new Steak(new IID(Ids::STEAK), "Steak")); + self::register("stick", new Stick(new IID(Ids::STICK), "Stick")); + self::register("string", new StringItem(new IID(Ids::STRING), "String")); + self::register("sweet_berries", new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); + self::register("totem", new Totem(new IID(Ids::TOTEM), "Totem of Undying")); + self::register("wheat_seeds", new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); + self::register("writable_book", new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); + self::register("written_book", new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); + + //TODO: add interface to dye-colour objects + self::register("dye", new Dye(new IID(Ids::DYE), "Dye")); + + self::register("banner", new Banner(new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER())); + + self::register("potion", new Potion(new IID(Ids::POTION), "Potion")); + self::register("splash_potion", new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); + + foreach(TreeType::getAll() as $type){ + //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency + self::register($type->name() . "_boat", new Boat(new IID(match($type){ + TreeType::OAK() => Ids::OAK_BOAT, + TreeType::SPRUCE() => Ids::SPRUCE_BOAT, + TreeType::BIRCH() => Ids::BIRCH_BOAT, + TreeType::JUNGLE() => Ids::JUNGLE_BOAT, + TreeType::ACACIA() => Ids::ACACIA_BOAT, + TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, + default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) + }), $type->getDisplayName() . " Boat", $type)); + } } + + private static function registerSpawnEggs() : void{ + self::register("zombie_spawn_egg", new class(new IID(Ids::ZOMBIE_SPAWN_EGG), "Zombie Spawn Egg") extends SpawnEgg{ + protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ + return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); + } + }); + self::register("squid_spawn_egg", new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ + public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ + return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); + } + }); + self::register("villager_spawn_egg", new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ + public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ + return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); + } + }); + } + + private static function registerTierToolItems() : void{ + self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); + self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); + self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); + self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); + self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); + self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); + self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); + self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); + self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); + self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); + self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); + self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); + self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); + self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); + self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); + self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); + self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); + self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); + self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); + self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); + self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); + self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); + self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); + self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); + self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); + } + + private static function registerArmorItems() : void{ + self::register("chainmail_boots", new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); + self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); + self::register("golden_boots", new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); + self::register("iron_boots", new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); + self::register("leather_boots", new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); + self::register("chainmail_chestplate", new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); + self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); + self::register("golden_chestplate", new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); + self::register("iron_chestplate", new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); + self::register("leather_tunic", new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); + self::register("chainmail_helmet", new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); + self::register("golden_helmet", new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); + self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); + self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); + self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); + self::register("golden_leggings", new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); + self::register("iron_leggings", new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); + self::register("leather_pants", new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); + } + } From 4d6fb2b92535db9f1c437038659be353f5d8beaa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 23:57:29 +0100 Subject: [PATCH 0302/1858] Removed ItemFactory --- src/item/ItemFactory.php | 93 ------------------- .../item/ItemSerializerDeserializerTest.php | 4 +- 2 files changed, 2 insertions(+), 95 deletions(-) delete mode 100644 src/item/ItemFactory.php diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php deleted file mode 100644 index 49b5943637..0000000000 --- a/src/item/ItemFactory.php +++ /dev/null @@ -1,93 +0,0 @@ -isNull()){ - continue; - } - $this->register($item); - } - } - - /** - * Maps an item type to its corresponding ID. This is necessary to ensure that the item is correctly loaded when - * reading data from disk storage. - * - * NOTE: If you are registering a new item type, you will need to add it to the creative inventory yourself - it - * will not automatically appear there. - * - * @throws \RuntimeException if something attempted to override an already-registered item without specifying the - * $override parameter. - */ - public function register(Item $item, bool $override = false) : void{ - $id = $item->getTypeId(); - - if(!$override && $this->isRegistered($id)){ - throw new \RuntimeException("Trying to overwrite an already registered item"); - } - - $this->list[$id] = clone $item; - } - - private static function itemToBlockId(int $id) : int{ - if($id > 0){ - throw new \InvalidArgumentException("ID $id is not a block ID"); - } - return -$id; - } - - /** - * Returns whether the specified item ID is already registered in the item factory. - */ - public function isRegistered(int $id) : bool{ - if($id <= 0){ - return BlockFactory::getInstance()->isRegistered(self::itemToBlockId($id)); - } - - return isset($this->list[$id]); - } - - /** - * @return Item[] - */ - public function getAllKnownTypes() : array{ - return $this->list; - } -} diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index 80ff0c4a4c..a7617735c2 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\item; use PHPUnit\Framework\TestCase; use pocketmine\block\BlockFactory; -use pocketmine\item\ItemFactory; +use pocketmine\item\VanillaItems; use pocketmine\world\format\io\GlobalBlockStateHandlers; final class ItemSerializerDeserializerTest extends TestCase{ @@ -39,7 +39,7 @@ final class ItemSerializerDeserializerTest extends TestCase{ } public function testAllVanillaItemsSerializableAndDeserializable() : void{ - foreach(ItemFactory::getInstance()->getAllKnownTypes() as $item){ + foreach(VanillaItems::getAll() as $item){ if($item->isNull()){ continue; } From e4d24e1edd36bbaa66827ba5b4357edc6f95c8b1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 00:22:08 +0100 Subject: [PATCH 0303/1858] Invert dependency between VanillaBlocks and BlockFactory --- src/block/BlockFactory.php | 767 +------------------ src/block/VanillaBlocks.php | 1395 +++++++++++++++++++---------------- 2 files changed, 774 insertions(+), 1388 deletions(-) diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index 6d867c9ee2..d07f4b5263 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -25,36 +25,7 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\block\BlockToolType as ToolType; -use pocketmine\block\BlockTypeIds as Ids; -use pocketmine\block\tile\Banner as TileBanner; -use pocketmine\block\tile\Barrel as TileBarrel; -use pocketmine\block\tile\Beacon as TileBeacon; -use pocketmine\block\tile\Bed as TileBed; -use pocketmine\block\tile\Bell as TileBell; -use pocketmine\block\tile\BlastFurnace as TileBlastFurnace; -use pocketmine\block\tile\BrewingStand as TileBrewingStand; -use pocketmine\block\tile\Chest as TileChest; -use pocketmine\block\tile\Comparator as TileComparator; -use pocketmine\block\tile\DaylightSensor as TileDaylightSensor; -use pocketmine\block\tile\EnchantTable as TileEnchantingTable; -use pocketmine\block\tile\EnderChest as TileEnderChest; -use pocketmine\block\tile\FlowerPot as TileFlowerPot; -use pocketmine\block\tile\Hopper as TileHopper; -use pocketmine\block\tile\ItemFrame as TileItemFrame; -use pocketmine\block\tile\Jukebox as TileJukebox; -use pocketmine\block\tile\Lectern as TileLectern; -use pocketmine\block\tile\MonsterSpawner as TileMonsterSpawner; -use pocketmine\block\tile\NormalFurnace as TileNormalFurnace; -use pocketmine\block\tile\Note as TileNote; -use pocketmine\block\tile\ShulkerBox as TileShulkerBox; -use pocketmine\block\tile\Skull as TileSkull; -use pocketmine\block\tile\Smoker as TileSmoker; -use pocketmine\block\utils\TreeType; -use pocketmine\block\utils\WoodType; use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; -use pocketmine\item\Item; -use pocketmine\item\ToolTier; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\light\LightUpdate; @@ -102,743 +73,9 @@ class BlockFactory{ public array $blastResistance = []; public function __construct(){ - $railBreakInfo = new BlockBreakInfo(0.7); - $this->register(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); - $this->register(new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); - $this->register(new Anvil(new BID(Ids::ANVIL), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); - $this->register(new Bamboo(new BID(Ids::BAMBOO), "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; - } - return parent::getBreakTime($item); - } - })); - $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", BreakInfo::instant())); - - $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->register(new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); - $this->register(new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - $this->register(new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new Transparent(new BID(Ids::BARRIER), "Barrier", BreakInfo::indestructible())); - $this->register(new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new BreakInfo(3.0))); - $this->register(new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); - $this->register(new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); - - $this->register(new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); - $this->register(new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - $this->register(new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - $this->register(new BrewingStand(new BID(Ids::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->register(new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); - $this->register(new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); - - $this->register(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", BreakInfo::instant())); - $this->register(new Cactus(new BID(Ids::CACTUS), "Cactus", new BreakInfo(0.4))); - $this->register(new Cake(new BID(Ids::CAKE), "Cake", new BreakInfo(0.5))); - $this->register(new Carrot(new BID(Ids::CARROTS), "Carrot Block", BreakInfo::instant())); - - $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); - $this->register(new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); - $this->register(new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->register(new Coal(new BID(Ids::COAL), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - - $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); - $this->register(new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->register(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - - $this->register(new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - $this->register(new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - $this->register(new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); - $this->register(new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - - $this->register(new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", BreakInfo::instant())); - $this->register(new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); - $this->register(new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - $this->register(new Opaque(new BID(Ids::EMERALD), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, 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), "End Portal Frame", BreakInfo::indestructible())); - $this->register(new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); - $this->register(new Opaque(new BID(Ids::END_STONE), "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->register(new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - - $this->register(new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); - $this->register(new Farmland(new BID(Ids::FARMLAND), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->register(new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); - $this->register(new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); - $this->register(new Flower(new BID(Ids::DANDELION), "Dandelion", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::POPPY), "Poppy", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::ALLIUM), "Allium", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::CORNFLOWER), "Cornflower", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); - $this->register(new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); - $this->register(new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - $this->register(new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - $this->register(new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - - $glassBreakInfo = new BreakInfo(0.3); - $this->register(new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); - $this->register(new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); - $this->register(new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - $this->register(new Opaque(new BID(Ids::GOLD), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - - $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); - $this->register(new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); - $this->register(new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); - $this->register(new Gravel(new BID(Ids::GRAVEL), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); - - $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); - - $hardenedGlassBreakInfo = new BreakInfo(10.0); - $this->register(new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); - $this->register(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->register(new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); - $this->register(new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); - $this->register(new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - - $updateBlockBreakInfo = new BreakInfo(1.0); - $this->register(new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); - $this->register(new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); - $this->register(new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); - - $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); - $this->register(new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); - $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); - $this->register(new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); - $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); - $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - $this->register(new Jukebox(new BID(Ids::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), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - - $lanternBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); - $this->register(new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); - - $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->register(new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); - $this->register(new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); - $this->register(new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); - $this->register(new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); - $this->register(new Magma(new BID(Ids::MAGMA), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); - $this->register(new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); - $this->register(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); - - $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); - $this->register(new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); - $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS), "Nether Brick Stairs", $netherBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS), "Red Nether Brick Stairs", $netherBrickBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_NETHER_BRICKS), "Chiseled Nether Bricks", $netherBrickBreakInfo)); - $this->register(new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); - - $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); - $this->register(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); - $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); - $this->register(new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); - $this->register(new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); - $this->register(new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->register(new Podzol(new BID(Ids::PODZOL), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); - $this->register(new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); - - $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); - $this->register(new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); - $this->register(new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS), "Prismarine Bricks Stairs", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); - $this->register(new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); - - $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->register(new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); - $this->register(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); - $this->register(new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); - - $this->register(new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); - - $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); - $this->register(new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); - - $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ), "Smooth Quartz Block", $quartzBreakInfo)); - $this->register(new Opaque(new BID(Ids::QUARTZ_BRICKS), "Quartz Bricks", $quartzBreakInfo)); - - $this->register(new Stair(new BID(Ids::QUARTZ_STAIRS), "Quartz Stairs", $quartzBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); - - $this->register(new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); - $this->register(new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); - $this->register(new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->register(new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - $this->register(new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); - $this->register(new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); - $this->register(new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); - $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); - $this->register(new Reserved6(new BID(Ids::RESERVED6), "reserved6", BreakInfo::instant())); - - $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); - $this->register(new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); - $this->register(new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); - - $this->register(new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new BreakInfo(0.3))); - $this->register(new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); - $this->register(new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); - $this->register(new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); - $this->register(new Snow(new BID(Ids::SNOW), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); - $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - $this->register(new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); - - $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register( - $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ - public function getDropsForCompatibleTool(Item $item) : array{ - return [VanillaBlocks::COBBLESTONE()->asItem()]; - } - - public function isAffectedBySilkTouch() : bool{ - return true; - } - } - ); - $this->register(new Opaque(new BID(Ids::ANDESITE), "Andesite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::DIORITE), "Diorite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::GRANITE), "Granite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); - - $this->register($stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS), "Stone Bricks", $stoneBreakInfo)); - $this->register($mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS), "Mossy Stone Bricks", $stoneBreakInfo)); - $this->register($crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); - $this->register($chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); - - $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); - $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); - $this->register(new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); - - $this->register(new Stair(new BID(Ids::STONE_STAIRS), "Stone Stairs", $stoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_STONE), "Smooth Stone", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::ANDESITE_STAIRS), "Andesite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::DIORITE_STAIRS), "Diorite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::GRANITE_STAIRS), "Granite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS), "Polished Andesite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS), "Polished Diorite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); - $this->register(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - $this->register(new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->register(new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - $this->register(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "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); - foreach([ - new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo), - new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo), - new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo), - new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo), - new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo), - new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo), - new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo), - new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo), - new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo), - new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo), - new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo), - ] as $slabType){ - $this->register($slabType); + foreach(VanillaBlocks::getAll() as $block){ + $this->register($block); } - - $this->register(new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); - $this->register(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); - $this->register(new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); - $this->register(new TallGrass(new BID(Ids::FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->register(new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); - - $this->register(new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::RED_TORCH), "Red Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", BreakInfo::instant())); - $this->register(new Torch(new BID(Ids::TORCH), "Torch", BreakInfo::instant())); - - $this->register(new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); - $this->register(new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); - $this->register(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); - $this->register(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); - $this->register(new Vine(new BID(Ids::VINES), "Vines", new BreakInfo(0.2, ToolType::AXE))); - $this->register(new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); - $this->register(new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); - - $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); - $this->register(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); - $this->register(new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); - - $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); - $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ - public function getBreakTime(Item $item) : float{ - if($item->getBlockToolType() === ToolType::SHEARS){ - return 0.0; - } - return parent::getBreakTime($item); - } - }; - $signBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $logBreakInfo = new BreakInfo(2.0, ToolType::AXE); - $woodenDoorBreakInfo = new BreakInfo(3.0, ToolType::AXE, 0, 15.0); - $woodenButtonBreakInfo = new BreakInfo(0.5, ToolType::AXE); - $woodenPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::AXE); - - foreach(TreeType::getAll() as $treeType){ - $name = $treeType->getDisplayName(); - $this->register(new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType)); - $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); - } - - foreach(WoodType::getAll() as $woodType){ - $name = $woodType->getDisplayName(); - - $this->register(new Wood(BlockLegacyIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); - $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); - - $this->register(new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); - $this->register(new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); - $this->register(new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); - - $this->register(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); - $this->register(new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); - $this->register(new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); - - $this->register(new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); - $this->register(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); - $this->register(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); - - [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($woodType); - $this->register(new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); - $this->register(new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); - } - - $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE), "Chiseled Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CUT_RED_SANDSTONE), "Cut Red Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $sandstoneBreakInfo)); - - $this->register(new Stair(new BID(Ids::SANDSTONE_STAIRS), "Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SANDSTONE), "Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_SANDSTONE), "Chiseled Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); - - $this->register(new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); - $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); - $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); - $this->register(new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); - $this->register(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); - $this->register(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->register(new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); - $this->register(new Concrete(new BID(Ids::CONCRETE), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->register(new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ - public function getBreakTime(Item $item) : float{ - $time = parent::getBreakTime($item); - if($item->getBlockToolType() === ToolType::SHEARS){ - $time *= 3; //shears break compatible blocks 15x faster, but wool 5x - } - - return $time; - } - })); - - //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->register(new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::DIORITE_WALL), "Diorite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::END_STONE_BRICK_WALL), "End Stone Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::GRANITE_WALL), "Granite Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL), "Mossy Stone Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL), "Mossy Cobblestone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::NETHER_BRICK_WALL), "Nether Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::PRISMARINE_WALL), "Prismarine Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::RED_NETHER_BRICK_WALL), "Red Nether Brick Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::RED_SANDSTONE_WALL), "Red Sandstone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::SANDSTONE_WALL), "Sandstone Wall", $wallBreakInfo)); - $this->register(new Wall(new BID(Ids::STONE_BRICK_WALL), "Stone Brick Wall", $wallBreakInfo)); - - $this->registerElements(); - - $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); - $this->register(new ChemistryTable(new BID(Ids::MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); - - $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT), "Heat Block", $chemistryTableBreakInfo)); - - $this->registerMushroomBlocks(); - - $this->register(new Coral( - new BID(Ids::CORAL), - "Coral", - BreakInfo::instant(), - )); - $this->register(new FloorCoralFan( - new BID(Ids::CORAL_FAN), - "Coral Fan", - BreakInfo::instant(), - )); - $this->register(new WallCoralFan( - new BID(Ids::WALL_CORAL_FAN), - "Wall Coral Fan", - BreakInfo::instant(), - )); - - $this->registerBlocksR13(); - $this->registerBlocksR14(); - $this->registerBlocksR16(); - $this->registerBlocksR17(); - $this->registerMudBlocks(); - - $this->registerOres(); - } - - private function registerMushroomBlocks() : void{ - $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); - - $this->register(new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); - $this->register(new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); - - //finally, the stems - $this->register(new MushroomStem(new BID(Ids::MUSHROOM_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); - $this->register(new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); - } - - private function registerElements() : void{ - $instaBreak = BreakInfo::instant(); - $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); - - $this->register(new Element(new BID(Ids::ELEMENT_HYDROGEN), "Hydrogen", $instaBreak, "h", 1, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_HELIUM), "Helium", $instaBreak, "he", 2, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_LITHIUM), "Lithium", $instaBreak, "li", 3, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_BERYLLIUM), "Beryllium", $instaBreak, "be", 4, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_BORON), "Boron", $instaBreak, "b", 5, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_CARBON), "Carbon", $instaBreak, "c", 6, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_NITROGEN), "Nitrogen", $instaBreak, "n", 7, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_OXYGEN), "Oxygen", $instaBreak, "o", 8, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_FLUORINE), "Fluorine", $instaBreak, "f", 9, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_NEON), "Neon", $instaBreak, "ne", 10, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_SODIUM), "Sodium", $instaBreak, "na", 11, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_MAGNESIUM), "Magnesium", $instaBreak, "mg", 12, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_ALUMINUM), "Aluminum", $instaBreak, "al", 13, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_SILICON), "Silicon", $instaBreak, "si", 14, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_PHOSPHORUS), "Phosphorus", $instaBreak, "p", 15, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_SULFUR), "Sulfur", $instaBreak, "s", 16, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_CHLORINE), "Chlorine", $instaBreak, "cl", 17, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_ARGON), "Argon", $instaBreak, "ar", 18, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_POTASSIUM), "Potassium", $instaBreak, "k", 19, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_CALCIUM), "Calcium", $instaBreak, "ca", 20, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_SCANDIUM), "Scandium", $instaBreak, "sc", 21, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TITANIUM), "Titanium", $instaBreak, "ti", 22, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_VANADIUM), "Vanadium", $instaBreak, "v", 23, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_CHROMIUM), "Chromium", $instaBreak, "cr", 24, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MANGANESE), "Manganese", $instaBreak, "mn", 25, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_IRON), "Iron", $instaBreak, "fe", 26, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COBALT), "Cobalt", $instaBreak, "co", 27, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NICKEL), "Nickel", $instaBreak, "ni", 28, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COPPER), "Copper", $instaBreak, "cu", 29, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ZINC), "Zinc", $instaBreak, "zn", 30, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_GALLIUM), "Gallium", $instaBreak, "ga", 31, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_GERMANIUM), "Germanium", $instaBreak, "ge", 32, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_ARSENIC), "Arsenic", $instaBreak, "as", 33, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_SELENIUM), "Selenium", $instaBreak, "se", 34, 5)); - $this->register(new Element(new BID(Ids::ELEMENT_BROMINE), "Bromine", $instaBreak, "br", 35, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_KRYPTON), "Krypton", $instaBreak, "kr", 36, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_RUBIDIUM), "Rubidium", $instaBreak, "rb", 37, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_STRONTIUM), "Strontium", $instaBreak, "sr", 38, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_YTTRIUM), "Yttrium", $instaBreak, "y", 39, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ZIRCONIUM), "Zirconium", $instaBreak, "zr", 40, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NIOBIUM), "Niobium", $instaBreak, "nb", 41, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MOLYBDENUM), "Molybdenum", $instaBreak, "mo", 42, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TECHNETIUM), "Technetium", $instaBreak, "tc", 43, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RUTHENIUM), "Ruthenium", $instaBreak, "ru", 44, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RHODIUM), "Rhodium", $instaBreak, "rh", 45, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_PALLADIUM), "Palladium", $instaBreak, "pd", 46, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_SILVER), "Silver", $instaBreak, "ag", 47, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_CADMIUM), "Cadmium", $instaBreak, "cd", 48, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_INDIUM), "Indium", $instaBreak, "in", 49, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_TIN), "Tin", $instaBreak, "sn", 50, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_ANTIMONY), "Antimony", $instaBreak, "sb", 51, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_TELLURIUM), "Tellurium", $instaBreak, "te", 52, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_IODINE), "Iodine", $instaBreak, "i", 53, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_XENON), "Xenon", $instaBreak, "xe", 54, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_CESIUM), "Cesium", $instaBreak, "cs", 55, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_BARIUM), "Barium", $instaBreak, "ba", 56, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_LANTHANUM), "Lanthanum", $instaBreak, "la", 57, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_CERIUM), "Cerium", $instaBreak, "ce", 58, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM), "Praseodymium", $instaBreak, "pr", 59, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_NEODYMIUM), "Neodymium", $instaBreak, "nd", 60, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_PROMETHIUM), "Promethium", $instaBreak, "pm", 61, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_SAMARIUM), "Samarium", $instaBreak, "sm", 62, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_EUROPIUM), "Europium", $instaBreak, "eu", 63, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_GADOLINIUM), "Gadolinium", $instaBreak, "gd", 64, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_TERBIUM), "Terbium", $instaBreak, "tb", 65, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_DYSPROSIUM), "Dysprosium", $instaBreak, "dy", 66, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_HOLMIUM), "Holmium", $instaBreak, "ho", 67, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_ERBIUM), "Erbium", $instaBreak, "er", 68, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_THULIUM), "Thulium", $instaBreak, "tm", 69, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_YTTERBIUM), "Ytterbium", $instaBreak, "yb", 70, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_LUTETIUM), "Lutetium", $instaBreak, "lu", 71, 8)); - $this->register(new Element(new BID(Ids::ELEMENT_HAFNIUM), "Hafnium", $instaBreak, "hf", 72, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TANTALUM), "Tantalum", $instaBreak, "ta", 73, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_TUNGSTEN), "Tungsten", $instaBreak, "w", 74, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_RHENIUM), "Rhenium", $instaBreak, "re", 75, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_OSMIUM), "Osmium", $instaBreak, "os", 76, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_IRIDIUM), "Iridium", $instaBreak, "ir", 77, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_PLATINUM), "Platinum", $instaBreak, "pt", 78, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_GOLD), "Gold", $instaBreak, "au", 79, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MERCURY), "Mercury", $instaBreak, "hg", 80, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_THALLIUM), "Thallium", $instaBreak, "tl", 81, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_LEAD), "Lead", $instaBreak, "pb", 82, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_BISMUTH), "Bismuth", $instaBreak, "bi", 83, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_POLONIUM), "Polonium", $instaBreak, "po", 84, 4)); - $this->register(new Element(new BID(Ids::ELEMENT_ASTATINE), "Astatine", $instaBreak, "at", 85, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_RADON), "Radon", $instaBreak, "rn", 86, 7)); - $this->register(new Element(new BID(Ids::ELEMENT_FRANCIUM), "Francium", $instaBreak, "fr", 87, 0)); - $this->register(new Element(new BID(Ids::ELEMENT_RADIUM), "Radium", $instaBreak, "ra", 88, 1)); - $this->register(new Element(new BID(Ids::ELEMENT_ACTINIUM), "Actinium", $instaBreak, "ac", 89, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_THORIUM), "Thorium", $instaBreak, "th", 90, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_PROTACTINIUM), "Protactinium", $instaBreak, "pa", 91, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_URANIUM), "Uranium", $instaBreak, "u", 92, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_NEPTUNIUM), "Neptunium", $instaBreak, "np", 93, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_PLUTONIUM), "Plutonium", $instaBreak, "pu", 94, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_AMERICIUM), "Americium", $instaBreak, "am", 95, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_CURIUM), "Curium", $instaBreak, "cm", 96, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_BERKELIUM), "Berkelium", $instaBreak, "bk", 97, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_CALIFORNIUM), "Californium", $instaBreak, "cf", 98, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_EINSTEINIUM), "Einsteinium", $instaBreak, "es", 99, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_FERMIUM), "Fermium", $instaBreak, "fm", 100, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_MENDELEVIUM), "Mendelevium", $instaBreak, "md", 101, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_NOBELIUM), "Nobelium", $instaBreak, "no", 102, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_LAWRENCIUM), "Lawrencium", $instaBreak, "lr", 103, 9)); - $this->register(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM), "Rutherfordium", $instaBreak, "rf", 104, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_DUBNIUM), "Dubnium", $instaBreak, "db", 105, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_SEABORGIUM), "Seaborgium", $instaBreak, "sg", 106, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_BOHRIUM), "Bohrium", $instaBreak, "bh", 107, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_HASSIUM), "Hassium", $instaBreak, "hs", 108, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_MEITNERIUM), "Meitnerium", $instaBreak, "mt", 109, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM), "Darmstadtium", $instaBreak, "ds", 110, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_ROENTGENIUM), "Roentgenium", $instaBreak, "rg", 111, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_COPERNICIUM), "Copernicium", $instaBreak, "cn", 112, 2)); - $this->register(new Element(new BID(Ids::ELEMENT_NIHONIUM), "Nihonium", $instaBreak, "nh", 113, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_FLEROVIUM), "Flerovium", $instaBreak, "fl", 114, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_MOSCOVIUM), "Moscovium", $instaBreak, "mc", 115, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_LIVERMORIUM), "Livermorium", $instaBreak, "lv", 116, 3)); - $this->register(new Element(new BID(Ids::ELEMENT_TENNESSINE), "Tennessine", $instaBreak, "ts", 117, 6)); - $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); - } - - private function registerOres() : void{ - $stoneOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(3.0, ToolType::PICKAXE, $toolTier->getHarvestLevel()); - $this->register(new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); - $this->register(new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - $this->register(new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - $this->register(new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - $this->register(new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - $this->register(new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - $this->register(new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - - $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(4.5, ToolType::PICKAXE, $toolTier->getHarvestLevel()); - $this->register(new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); - $this->register(new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - $this->register(new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $this->register(new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $this->register(new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $this->register(new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - $this->register(new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - $this->register(new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - - $netherrackOreBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); - $this->register(new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); - } - - private function registerBlocksR13() : void{ - $this->register(new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); - } - - private function registerBlocksR14() : void{ - $this->register(new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new BreakInfo(0.6))); - } - - private function registerBlocksR16() : void{ - //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - - $this->register(new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0))); - - $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->register(new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); - $this->register(new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); - $this->register(new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - - $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->register(new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); - $this->register(new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); - $this->register(new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); - $this->register(new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); - - //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) - $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); - $this->register(new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); - $this->register(new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new BreakInfo(0.5, ToolType::PICKAXE))); //same as regular stone button - $this->register(new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); //same as regular stone pressure plate - $this->register(new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); - $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CHISELED_POLISHED_BLACKSTONE), "Chiseled Polished Blackstone", $blackstoneBreakInfo)); - - $prefix = fn(string $thing) => "Polished Blackstone Brick" . ($thing !== "" ? " $thing" : ""); - $this->register(new Opaque(new BID(Ids::POLISHED_BLACKSTONE_BRICKS), "Polished Blackstone Bricks", $blackstoneBreakInfo)); - $this->register(new Slab(new BID(Ids::POLISHED_BLACKSTONE_BRICK_SLAB), "Polished Blackstone Brick", $slabBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); - $this->register(new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); - $this->register(new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); - - $this->register(new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", BreakInfo::instant())); - $this->register(new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); - - //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) - $this->register(new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new BreakInfo(1.0, ToolType::SHOVEL))); - - $this->register(new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ - public function getLightLevel() : int{ return 15; } - }); - } - - private function registerBlocksR17() : void{ - //in java this can be acquired using any tool - seems to be a parity issue in bedrock - $this->register(new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - - $this->register(new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->register(new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - - $this->register(new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); - $this->register(new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->register(new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); - - $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); - $this->register(new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); - - //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - $this->register(new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0))); - - $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); - $this->register(new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); - $this->register(new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); - $this->register(new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); - $this->register(new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); - $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - - $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); - $this->register(new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); - $this->register(new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); - $this->register(new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); - $this->register(new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); - $this->register(new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - - $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); - $this->register(new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); - $this->register(new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); - $this->register(new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); - $this->register(new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - - $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); - $this->register(new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); - $this->register(new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); - $this->register(new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); - $this->register(new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); - - $this->register(new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); - } - - private function registerMudBlocks() : void{ - $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - - $this->register(new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); - $this->register(new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); - $this->register(new Stair(new BID(Ids::MUD_BRICK_STAIRS), "Mud Brick Stairs", $mudBricksBreakInfo)); - $this->register(new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); } /** diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 1a1bd8fde1..15de19c182 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -23,8 +23,39 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\BlockBreakInfo as BreakInfo; +use pocketmine\block\BlockIdentifier as BID; +use pocketmine\block\BlockToolType as ToolType; use pocketmine\block\BlockTypeIds as Ids; +use pocketmine\block\tile\Banner as TileBanner; +use pocketmine\block\tile\Barrel as TileBarrel; +use pocketmine\block\tile\Beacon as TileBeacon; +use pocketmine\block\tile\Bed as TileBed; +use pocketmine\block\tile\Bell as TileBell; +use pocketmine\block\tile\BlastFurnace as TileBlastFurnace; +use pocketmine\block\tile\BrewingStand as TileBrewingStand; +use pocketmine\block\tile\Chest as TileChest; +use pocketmine\block\tile\Comparator as TileComparator; +use pocketmine\block\tile\DaylightSensor as TileDaylightSensor; +use pocketmine\block\tile\EnchantTable as TileEnchantingTable; +use pocketmine\block\tile\EnderChest as TileEnderChest; +use pocketmine\block\tile\FlowerPot as TileFlowerPot; +use pocketmine\block\tile\Hopper as TileHopper; +use pocketmine\block\tile\ItemFrame as TileItemFrame; +use pocketmine\block\tile\Jukebox as TileJukebox; +use pocketmine\block\tile\Lectern as TileLectern; +use pocketmine\block\tile\MonsterSpawner as TileMonsterSpawner; +use pocketmine\block\tile\NormalFurnace as TileNormalFurnace; +use pocketmine\block\tile\Note as TileNote; +use pocketmine\block\tile\ShulkerBox as TileShulkerBox; +use pocketmine\block\tile\Skull as TileSkull; +use pocketmine\block\tile\Smoker as TileSmoker; +use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\WoodType; +use pocketmine\item\Item; +use pocketmine\item\ToolTier; use pocketmine\utils\CloningRegistryTrait; +use function mb_strtolower; /** * This doc-block is generated automatically, do not modify it manually. @@ -677,628 +708,746 @@ final class VanillaBlocks{ } protected static function setup() : void{ - $factory = BlockFactory::getInstance(); - self::register("acacia_button", $factory->fromTypeId(Ids::ACACIA_BUTTON)); - self::register("acacia_door", $factory->fromTypeId(Ids::ACACIA_DOOR)); - self::register("acacia_fence", $factory->fromTypeId(Ids::ACACIA_FENCE)); - self::register("acacia_fence_gate", $factory->fromTypeId(Ids::ACACIA_FENCE_GATE)); - self::register("acacia_leaves", $factory->fromTypeId(Ids::ACACIA_LEAVES)); - self::register("acacia_log", $factory->fromTypeId(Ids::ACACIA_LOG)); - self::register("acacia_planks", $factory->fromTypeId(Ids::ACACIA_PLANKS)); - self::register("acacia_pressure_plate", $factory->fromTypeId(Ids::ACACIA_PRESSURE_PLATE)); - self::register("acacia_sapling", $factory->fromTypeId(Ids::ACACIA_SAPLING)); - self::register("acacia_sign", $factory->fromTypeId(Ids::ACACIA_SIGN)); - self::register("acacia_slab", $factory->fromTypeId(Ids::ACACIA_SLAB)); - self::register("acacia_stairs", $factory->fromTypeId(Ids::ACACIA_STAIRS)); - self::register("acacia_trapdoor", $factory->fromTypeId(Ids::ACACIA_TRAPDOOR)); - self::register("acacia_wall_sign", $factory->fromTypeId(Ids::ACACIA_WALL_SIGN)); - self::register("acacia_wood", $factory->fromTypeId(Ids::ACACIA_WOOD)); - self::register("activator_rail", $factory->fromTypeId(Ids::ACTIVATOR_RAIL)); - self::register("air", $factory->fromTypeId(Ids::AIR)); - self::register("all_sided_mushroom_stem", $factory->fromTypeId(Ids::ALL_SIDED_MUSHROOM_STEM)); - self::register("allium", $factory->fromTypeId(Ids::ALLIUM)); - self::register("amethyst", $factory->fromTypeId(Ids::AMETHYST)); - self::register("ancient_debris", $factory->fromTypeId(Ids::ANCIENT_DEBRIS)); - self::register("andesite", $factory->fromTypeId(Ids::ANDESITE)); - self::register("andesite_slab", $factory->fromTypeId(Ids::ANDESITE_SLAB)); - self::register("andesite_stairs", $factory->fromTypeId(Ids::ANDESITE_STAIRS)); - self::register("andesite_wall", $factory->fromTypeId(Ids::ANDESITE_WALL)); - self::register("anvil", $factory->fromTypeId(Ids::ANVIL)); - self::register("azure_bluet", $factory->fromTypeId(Ids::AZURE_BLUET)); - self::register("bamboo", $factory->fromTypeId(Ids::BAMBOO)); - self::register("bamboo_sapling", $factory->fromTypeId(Ids::BAMBOO_SAPLING)); - self::register("banner", $factory->fromTypeId(Ids::BANNER)); - self::register("barrel", $factory->fromTypeId(Ids::BARREL)); - self::register("barrier", $factory->fromTypeId(Ids::BARRIER)); - self::register("basalt", $factory->fromTypeId(Ids::BASALT)); - self::register("beacon", $factory->fromTypeId(Ids::BEACON)); - self::register("bed", $factory->fromTypeId(Ids::BED)); - self::register("bedrock", $factory->fromTypeId(Ids::BEDROCK)); - self::register("beetroots", $factory->fromTypeId(Ids::BEETROOTS)); - self::register("bell", $factory->fromTypeId(Ids::BELL)); - self::register("birch_button", $factory->fromTypeId(Ids::BIRCH_BUTTON)); - self::register("birch_door", $factory->fromTypeId(Ids::BIRCH_DOOR)); - self::register("birch_fence", $factory->fromTypeId(Ids::BIRCH_FENCE)); - self::register("birch_fence_gate", $factory->fromTypeId(Ids::BIRCH_FENCE_GATE)); - self::register("birch_leaves", $factory->fromTypeId(Ids::BIRCH_LEAVES)); - self::register("birch_log", $factory->fromTypeId(Ids::BIRCH_LOG)); - self::register("birch_planks", $factory->fromTypeId(Ids::BIRCH_PLANKS)); - self::register("birch_pressure_plate", $factory->fromTypeId(Ids::BIRCH_PRESSURE_PLATE)); - self::register("birch_sapling", $factory->fromTypeId(Ids::BIRCH_SAPLING)); - self::register("birch_sign", $factory->fromTypeId(Ids::BIRCH_SIGN)); - self::register("birch_slab", $factory->fromTypeId(Ids::BIRCH_SLAB)); - self::register("birch_stairs", $factory->fromTypeId(Ids::BIRCH_STAIRS)); - self::register("birch_trapdoor", $factory->fromTypeId(Ids::BIRCH_TRAPDOOR)); - self::register("birch_wall_sign", $factory->fromTypeId(Ids::BIRCH_WALL_SIGN)); - self::register("birch_wood", $factory->fromTypeId(Ids::BIRCH_WOOD)); - self::register("blackstone", $factory->fromTypeId(Ids::BLACKSTONE)); - self::register("blackstone_slab", $factory->fromTypeId(Ids::BLACKSTONE_SLAB)); - self::register("blackstone_stairs", $factory->fromTypeId(Ids::BLACKSTONE_STAIRS)); - self::register("blackstone_wall", $factory->fromTypeId(Ids::BLACKSTONE_WALL)); - self::register("blast_furnace", $factory->fromTypeId(Ids::BLAST_FURNACE)); - self::register("blue_ice", $factory->fromTypeId(Ids::BLUE_ICE)); - self::register("blue_orchid", $factory->fromTypeId(Ids::BLUE_ORCHID)); - self::register("blue_torch", $factory->fromTypeId(Ids::BLUE_TORCH)); - self::register("bone_block", $factory->fromTypeId(Ids::BONE_BLOCK)); - self::register("bookshelf", $factory->fromTypeId(Ids::BOOKSHELF)); - self::register("brewing_stand", $factory->fromTypeId(Ids::BREWING_STAND)); - self::register("brick_slab", $factory->fromTypeId(Ids::BRICK_SLAB)); - self::register("brick_stairs", $factory->fromTypeId(Ids::BRICK_STAIRS)); - self::register("brick_wall", $factory->fromTypeId(Ids::BRICK_WALL)); - self::register("bricks", $factory->fromTypeId(Ids::BRICKS)); - self::register("brown_mushroom", $factory->fromTypeId(Ids::BROWN_MUSHROOM)); - self::register("brown_mushroom_block", $factory->fromTypeId(Ids::BROWN_MUSHROOM_BLOCK)); - self::register("cactus", $factory->fromTypeId(Ids::CACTUS)); - self::register("cake", $factory->fromTypeId(Ids::CAKE)); - self::register("calcite", $factory->fromTypeId(Ids::CALCITE)); - self::register("carpet", $factory->fromTypeId(Ids::CARPET)); - self::register("carrots", $factory->fromTypeId(Ids::CARROTS)); - self::register("carved_pumpkin", $factory->fromTypeId(Ids::CARVED_PUMPKIN)); - self::register("chemical_heat", $factory->fromTypeId(Ids::CHEMICAL_HEAT)); - self::register("chest", $factory->fromTypeId(Ids::CHEST)); - self::register("chiseled_deepslate", $factory->fromTypeId(Ids::CHISELED_DEEPSLATE)); - self::register("chiseled_nether_bricks", $factory->fromTypeId(Ids::CHISELED_NETHER_BRICKS)); - self::register("chiseled_polished_blackstone", $factory->fromTypeId(Ids::CHISELED_POLISHED_BLACKSTONE)); - self::register("chiseled_quartz", $factory->fromTypeId(Ids::CHISELED_QUARTZ)); - self::register("chiseled_red_sandstone", $factory->fromTypeId(Ids::CHISELED_RED_SANDSTONE)); - self::register("chiseled_sandstone", $factory->fromTypeId(Ids::CHISELED_SANDSTONE)); - self::register("chiseled_stone_bricks", $factory->fromTypeId(Ids::CHISELED_STONE_BRICKS)); - self::register("clay", $factory->fromTypeId(Ids::CLAY)); - self::register("coal", $factory->fromTypeId(Ids::COAL)); - self::register("coal_ore", $factory->fromTypeId(Ids::COAL_ORE)); - self::register("cobbled_deepslate", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE)); - self::register("cobbled_deepslate_slab", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_SLAB)); - self::register("cobbled_deepslate_stairs", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_STAIRS)); - self::register("cobbled_deepslate_wall", $factory->fromTypeId(Ids::COBBLED_DEEPSLATE_WALL)); - self::register("cobblestone", $factory->fromTypeId(Ids::COBBLESTONE)); - self::register("cobblestone_slab", $factory->fromTypeId(Ids::COBBLESTONE_SLAB)); - self::register("cobblestone_stairs", $factory->fromTypeId(Ids::COBBLESTONE_STAIRS)); - self::register("cobblestone_wall", $factory->fromTypeId(Ids::COBBLESTONE_WALL)); - self::register("cobweb", $factory->fromTypeId(Ids::COBWEB)); - self::register("cocoa_pod", $factory->fromTypeId(Ids::COCOA_POD)); - self::register("compound_creator", $factory->fromTypeId(Ids::COMPOUND_CREATOR)); - self::register("concrete", $factory->fromTypeId(Ids::CONCRETE)); - self::register("concrete_powder", $factory->fromTypeId(Ids::CONCRETE_POWDER)); - self::register("copper_ore", $factory->fromTypeId(Ids::COPPER_ORE)); - self::register("coral", $factory->fromTypeId(Ids::CORAL)); - self::register("coral_block", $factory->fromTypeId(Ids::CORAL_BLOCK)); - self::register("coral_fan", $factory->fromTypeId(Ids::CORAL_FAN)); - self::register("cornflower", $factory->fromTypeId(Ids::CORNFLOWER)); - self::register("cracked_deepslate_bricks", $factory->fromTypeId(Ids::CRACKED_DEEPSLATE_BRICKS)); - self::register("cracked_deepslate_tiles", $factory->fromTypeId(Ids::CRACKED_DEEPSLATE_TILES)); - self::register("cracked_nether_bricks", $factory->fromTypeId(Ids::CRACKED_NETHER_BRICKS)); - self::register("cracked_polished_blackstone_bricks", $factory->fromTypeId(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS)); - self::register("cracked_stone_bricks", $factory->fromTypeId(Ids::CRACKED_STONE_BRICKS)); - self::register("crafting_table", $factory->fromTypeId(Ids::CRAFTING_TABLE)); - self::register("crimson_button", $factory->fromTypeId(Ids::CRIMSON_BUTTON)); - self::register("crimson_door", $factory->fromTypeId(Ids::CRIMSON_DOOR)); - self::register("crimson_fence", $factory->fromTypeId(Ids::CRIMSON_FENCE)); - self::register("crimson_fence_gate", $factory->fromTypeId(Ids::CRIMSON_FENCE_GATE)); - self::register("crimson_hyphae", $factory->fromTypeId(Ids::CRIMSON_HYPHAE)); - self::register("crimson_planks", $factory->fromTypeId(Ids::CRIMSON_PLANKS)); - self::register("crimson_pressure_plate", $factory->fromTypeId(Ids::CRIMSON_PRESSURE_PLATE)); - self::register("crimson_sign", $factory->fromTypeId(Ids::CRIMSON_SIGN)); - self::register("crimson_slab", $factory->fromTypeId(Ids::CRIMSON_SLAB)); - self::register("crimson_stairs", $factory->fromTypeId(Ids::CRIMSON_STAIRS)); - self::register("crimson_stem", $factory->fromTypeId(Ids::CRIMSON_STEM)); - self::register("crimson_trapdoor", $factory->fromTypeId(Ids::CRIMSON_TRAPDOOR)); - self::register("crimson_wall_sign", $factory->fromTypeId(Ids::CRIMSON_WALL_SIGN)); - self::register("cut_red_sandstone", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE)); - self::register("cut_red_sandstone_slab", $factory->fromTypeId(Ids::CUT_RED_SANDSTONE_SLAB)); - self::register("cut_sandstone", $factory->fromTypeId(Ids::CUT_SANDSTONE)); - self::register("cut_sandstone_slab", $factory->fromTypeId(Ids::CUT_SANDSTONE_SLAB)); - self::register("dandelion", $factory->fromTypeId(Ids::DANDELION)); - self::register("dark_oak_button", $factory->fromTypeId(Ids::DARK_OAK_BUTTON)); - self::register("dark_oak_door", $factory->fromTypeId(Ids::DARK_OAK_DOOR)); - self::register("dark_oak_fence", $factory->fromTypeId(Ids::DARK_OAK_FENCE)); - self::register("dark_oak_fence_gate", $factory->fromTypeId(Ids::DARK_OAK_FENCE_GATE)); - self::register("dark_oak_leaves", $factory->fromTypeId(Ids::DARK_OAK_LEAVES)); - self::register("dark_oak_log", $factory->fromTypeId(Ids::DARK_OAK_LOG)); - self::register("dark_oak_planks", $factory->fromTypeId(Ids::DARK_OAK_PLANKS)); - self::register("dark_oak_pressure_plate", $factory->fromTypeId(Ids::DARK_OAK_PRESSURE_PLATE)); - self::register("dark_oak_sapling", $factory->fromTypeId(Ids::DARK_OAK_SAPLING)); - self::register("dark_oak_sign", $factory->fromTypeId(Ids::DARK_OAK_SIGN)); - self::register("dark_oak_slab", $factory->fromTypeId(Ids::DARK_OAK_SLAB)); - self::register("dark_oak_stairs", $factory->fromTypeId(Ids::DARK_OAK_STAIRS)); - self::register("dark_oak_trapdoor", $factory->fromTypeId(Ids::DARK_OAK_TRAPDOOR)); - self::register("dark_oak_wall_sign", $factory->fromTypeId(Ids::DARK_OAK_WALL_SIGN)); - self::register("dark_oak_wood", $factory->fromTypeId(Ids::DARK_OAK_WOOD)); - self::register("dark_prismarine", $factory->fromTypeId(Ids::DARK_PRISMARINE)); - self::register("dark_prismarine_slab", $factory->fromTypeId(Ids::DARK_PRISMARINE_SLAB)); - self::register("dark_prismarine_stairs", $factory->fromTypeId(Ids::DARK_PRISMARINE_STAIRS)); - self::register("daylight_sensor", $factory->fromTypeId(Ids::DAYLIGHT_SENSOR)); - self::register("dead_bush", $factory->fromTypeId(Ids::DEAD_BUSH)); - self::register("deepslate", $factory->fromTypeId(Ids::DEEPSLATE)); - self::register("deepslate_brick_slab", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_SLAB)); - self::register("deepslate_brick_stairs", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_STAIRS)); - self::register("deepslate_brick_wall", $factory->fromTypeId(Ids::DEEPSLATE_BRICK_WALL)); - self::register("deepslate_bricks", $factory->fromTypeId(Ids::DEEPSLATE_BRICKS)); - self::register("deepslate_coal_ore", $factory->fromTypeId(Ids::DEEPSLATE_COAL_ORE)); - self::register("deepslate_copper_ore", $factory->fromTypeId(Ids::DEEPSLATE_COPPER_ORE)); - self::register("deepslate_diamond_ore", $factory->fromTypeId(Ids::DEEPSLATE_DIAMOND_ORE)); - self::register("deepslate_emerald_ore", $factory->fromTypeId(Ids::DEEPSLATE_EMERALD_ORE)); - self::register("deepslate_gold_ore", $factory->fromTypeId(Ids::DEEPSLATE_GOLD_ORE)); - self::register("deepslate_iron_ore", $factory->fromTypeId(Ids::DEEPSLATE_IRON_ORE)); - self::register("deepslate_lapis_lazuli_ore", $factory->fromTypeId(Ids::DEEPSLATE_LAPIS_LAZULI_ORE)); - self::register("deepslate_redstone_ore", $factory->fromTypeId(Ids::DEEPSLATE_REDSTONE_ORE)); - self::register("deepslate_tile_slab", $factory->fromTypeId(Ids::DEEPSLATE_TILE_SLAB)); - self::register("deepslate_tile_stairs", $factory->fromTypeId(Ids::DEEPSLATE_TILE_STAIRS)); - self::register("deepslate_tile_wall", $factory->fromTypeId(Ids::DEEPSLATE_TILE_WALL)); - self::register("deepslate_tiles", $factory->fromTypeId(Ids::DEEPSLATE_TILES)); - self::register("detector_rail", $factory->fromTypeId(Ids::DETECTOR_RAIL)); - self::register("diamond", $factory->fromTypeId(Ids::DIAMOND)); - self::register("diamond_ore", $factory->fromTypeId(Ids::DIAMOND_ORE)); - self::register("diorite", $factory->fromTypeId(Ids::DIORITE)); - self::register("diorite_slab", $factory->fromTypeId(Ids::DIORITE_SLAB)); - self::register("diorite_stairs", $factory->fromTypeId(Ids::DIORITE_STAIRS)); - self::register("diorite_wall", $factory->fromTypeId(Ids::DIORITE_WALL)); - self::register("dirt", $factory->fromTypeId(Ids::DIRT)); - self::register("double_tallgrass", $factory->fromTypeId(Ids::DOUBLE_TALLGRASS)); - self::register("dragon_egg", $factory->fromTypeId(Ids::DRAGON_EGG)); - self::register("dried_kelp", $factory->fromTypeId(Ids::DRIED_KELP)); - self::register("dyed_shulker_box", $factory->fromTypeId(Ids::DYED_SHULKER_BOX)); - self::register("element_actinium", $factory->fromTypeId(Ids::ELEMENT_ACTINIUM)); - self::register("element_aluminum", $factory->fromTypeId(Ids::ELEMENT_ALUMINUM)); - self::register("element_americium", $factory->fromTypeId(Ids::ELEMENT_AMERICIUM)); - self::register("element_antimony", $factory->fromTypeId(Ids::ELEMENT_ANTIMONY)); - self::register("element_argon", $factory->fromTypeId(Ids::ELEMENT_ARGON)); - self::register("element_arsenic", $factory->fromTypeId(Ids::ELEMENT_ARSENIC)); - self::register("element_astatine", $factory->fromTypeId(Ids::ELEMENT_ASTATINE)); - self::register("element_barium", $factory->fromTypeId(Ids::ELEMENT_BARIUM)); - self::register("element_berkelium", $factory->fromTypeId(Ids::ELEMENT_BERKELIUM)); - self::register("element_beryllium", $factory->fromTypeId(Ids::ELEMENT_BERYLLIUM)); - self::register("element_bismuth", $factory->fromTypeId(Ids::ELEMENT_BISMUTH)); - self::register("element_bohrium", $factory->fromTypeId(Ids::ELEMENT_BOHRIUM)); - self::register("element_boron", $factory->fromTypeId(Ids::ELEMENT_BORON)); - self::register("element_bromine", $factory->fromTypeId(Ids::ELEMENT_BROMINE)); - self::register("element_cadmium", $factory->fromTypeId(Ids::ELEMENT_CADMIUM)); - self::register("element_calcium", $factory->fromTypeId(Ids::ELEMENT_CALCIUM)); - self::register("element_californium", $factory->fromTypeId(Ids::ELEMENT_CALIFORNIUM)); - self::register("element_carbon", $factory->fromTypeId(Ids::ELEMENT_CARBON)); - self::register("element_cerium", $factory->fromTypeId(Ids::ELEMENT_CERIUM)); - self::register("element_cesium", $factory->fromTypeId(Ids::ELEMENT_CESIUM)); - self::register("element_chlorine", $factory->fromTypeId(Ids::ELEMENT_CHLORINE)); - self::register("element_chromium", $factory->fromTypeId(Ids::ELEMENT_CHROMIUM)); - self::register("element_cobalt", $factory->fromTypeId(Ids::ELEMENT_COBALT)); - self::register("element_constructor", $factory->fromTypeId(Ids::ELEMENT_CONSTRUCTOR)); - self::register("element_copernicium", $factory->fromTypeId(Ids::ELEMENT_COPERNICIUM)); - self::register("element_copper", $factory->fromTypeId(Ids::ELEMENT_COPPER)); - self::register("element_curium", $factory->fromTypeId(Ids::ELEMENT_CURIUM)); - self::register("element_darmstadtium", $factory->fromTypeId(Ids::ELEMENT_DARMSTADTIUM)); - self::register("element_dubnium", $factory->fromTypeId(Ids::ELEMENT_DUBNIUM)); - self::register("element_dysprosium", $factory->fromTypeId(Ids::ELEMENT_DYSPROSIUM)); - self::register("element_einsteinium", $factory->fromTypeId(Ids::ELEMENT_EINSTEINIUM)); - self::register("element_erbium", $factory->fromTypeId(Ids::ELEMENT_ERBIUM)); - self::register("element_europium", $factory->fromTypeId(Ids::ELEMENT_EUROPIUM)); - self::register("element_fermium", $factory->fromTypeId(Ids::ELEMENT_FERMIUM)); - self::register("element_flerovium", $factory->fromTypeId(Ids::ELEMENT_FLEROVIUM)); - self::register("element_fluorine", $factory->fromTypeId(Ids::ELEMENT_FLUORINE)); - self::register("element_francium", $factory->fromTypeId(Ids::ELEMENT_FRANCIUM)); - self::register("element_gadolinium", $factory->fromTypeId(Ids::ELEMENT_GADOLINIUM)); - self::register("element_gallium", $factory->fromTypeId(Ids::ELEMENT_GALLIUM)); - self::register("element_germanium", $factory->fromTypeId(Ids::ELEMENT_GERMANIUM)); - self::register("element_gold", $factory->fromTypeId(Ids::ELEMENT_GOLD)); - self::register("element_hafnium", $factory->fromTypeId(Ids::ELEMENT_HAFNIUM)); - self::register("element_hassium", $factory->fromTypeId(Ids::ELEMENT_HASSIUM)); - self::register("element_helium", $factory->fromTypeId(Ids::ELEMENT_HELIUM)); - self::register("element_holmium", $factory->fromTypeId(Ids::ELEMENT_HOLMIUM)); - self::register("element_hydrogen", $factory->fromTypeId(Ids::ELEMENT_HYDROGEN)); - self::register("element_indium", $factory->fromTypeId(Ids::ELEMENT_INDIUM)); - self::register("element_iodine", $factory->fromTypeId(Ids::ELEMENT_IODINE)); - self::register("element_iridium", $factory->fromTypeId(Ids::ELEMENT_IRIDIUM)); - self::register("element_iron", $factory->fromTypeId(Ids::ELEMENT_IRON)); - self::register("element_krypton", $factory->fromTypeId(Ids::ELEMENT_KRYPTON)); - self::register("element_lanthanum", $factory->fromTypeId(Ids::ELEMENT_LANTHANUM)); - self::register("element_lawrencium", $factory->fromTypeId(Ids::ELEMENT_LAWRENCIUM)); - self::register("element_lead", $factory->fromTypeId(Ids::ELEMENT_LEAD)); - self::register("element_lithium", $factory->fromTypeId(Ids::ELEMENT_LITHIUM)); - self::register("element_livermorium", $factory->fromTypeId(Ids::ELEMENT_LIVERMORIUM)); - self::register("element_lutetium", $factory->fromTypeId(Ids::ELEMENT_LUTETIUM)); - self::register("element_magnesium", $factory->fromTypeId(Ids::ELEMENT_MAGNESIUM)); - self::register("element_manganese", $factory->fromTypeId(Ids::ELEMENT_MANGANESE)); - self::register("element_meitnerium", $factory->fromTypeId(Ids::ELEMENT_MEITNERIUM)); - self::register("element_mendelevium", $factory->fromTypeId(Ids::ELEMENT_MENDELEVIUM)); - self::register("element_mercury", $factory->fromTypeId(Ids::ELEMENT_MERCURY)); - self::register("element_molybdenum", $factory->fromTypeId(Ids::ELEMENT_MOLYBDENUM)); - self::register("element_moscovium", $factory->fromTypeId(Ids::ELEMENT_MOSCOVIUM)); - self::register("element_neodymium", $factory->fromTypeId(Ids::ELEMENT_NEODYMIUM)); - self::register("element_neon", $factory->fromTypeId(Ids::ELEMENT_NEON)); - self::register("element_neptunium", $factory->fromTypeId(Ids::ELEMENT_NEPTUNIUM)); - self::register("element_nickel", $factory->fromTypeId(Ids::ELEMENT_NICKEL)); - self::register("element_nihonium", $factory->fromTypeId(Ids::ELEMENT_NIHONIUM)); - self::register("element_niobium", $factory->fromTypeId(Ids::ELEMENT_NIOBIUM)); - self::register("element_nitrogen", $factory->fromTypeId(Ids::ELEMENT_NITROGEN)); - self::register("element_nobelium", $factory->fromTypeId(Ids::ELEMENT_NOBELIUM)); - self::register("element_oganesson", $factory->fromTypeId(Ids::ELEMENT_OGANESSON)); - self::register("element_osmium", $factory->fromTypeId(Ids::ELEMENT_OSMIUM)); - self::register("element_oxygen", $factory->fromTypeId(Ids::ELEMENT_OXYGEN)); - self::register("element_palladium", $factory->fromTypeId(Ids::ELEMENT_PALLADIUM)); - self::register("element_phosphorus", $factory->fromTypeId(Ids::ELEMENT_PHOSPHORUS)); - self::register("element_platinum", $factory->fromTypeId(Ids::ELEMENT_PLATINUM)); - self::register("element_plutonium", $factory->fromTypeId(Ids::ELEMENT_PLUTONIUM)); - self::register("element_polonium", $factory->fromTypeId(Ids::ELEMENT_POLONIUM)); - self::register("element_potassium", $factory->fromTypeId(Ids::ELEMENT_POTASSIUM)); - self::register("element_praseodymium", $factory->fromTypeId(Ids::ELEMENT_PRASEODYMIUM)); - self::register("element_promethium", $factory->fromTypeId(Ids::ELEMENT_PROMETHIUM)); - self::register("element_protactinium", $factory->fromTypeId(Ids::ELEMENT_PROTACTINIUM)); - self::register("element_radium", $factory->fromTypeId(Ids::ELEMENT_RADIUM)); - self::register("element_radon", $factory->fromTypeId(Ids::ELEMENT_RADON)); - self::register("element_rhenium", $factory->fromTypeId(Ids::ELEMENT_RHENIUM)); - self::register("element_rhodium", $factory->fromTypeId(Ids::ELEMENT_RHODIUM)); - self::register("element_roentgenium", $factory->fromTypeId(Ids::ELEMENT_ROENTGENIUM)); - self::register("element_rubidium", $factory->fromTypeId(Ids::ELEMENT_RUBIDIUM)); - self::register("element_ruthenium", $factory->fromTypeId(Ids::ELEMENT_RUTHENIUM)); - self::register("element_rutherfordium", $factory->fromTypeId(Ids::ELEMENT_RUTHERFORDIUM)); - self::register("element_samarium", $factory->fromTypeId(Ids::ELEMENT_SAMARIUM)); - self::register("element_scandium", $factory->fromTypeId(Ids::ELEMENT_SCANDIUM)); - self::register("element_seaborgium", $factory->fromTypeId(Ids::ELEMENT_SEABORGIUM)); - self::register("element_selenium", $factory->fromTypeId(Ids::ELEMENT_SELENIUM)); - self::register("element_silicon", $factory->fromTypeId(Ids::ELEMENT_SILICON)); - self::register("element_silver", $factory->fromTypeId(Ids::ELEMENT_SILVER)); - self::register("element_sodium", $factory->fromTypeId(Ids::ELEMENT_SODIUM)); - self::register("element_strontium", $factory->fromTypeId(Ids::ELEMENT_STRONTIUM)); - self::register("element_sulfur", $factory->fromTypeId(Ids::ELEMENT_SULFUR)); - self::register("element_tantalum", $factory->fromTypeId(Ids::ELEMENT_TANTALUM)); - self::register("element_technetium", $factory->fromTypeId(Ids::ELEMENT_TECHNETIUM)); - self::register("element_tellurium", $factory->fromTypeId(Ids::ELEMENT_TELLURIUM)); - self::register("element_tennessine", $factory->fromTypeId(Ids::ELEMENT_TENNESSINE)); - self::register("element_terbium", $factory->fromTypeId(Ids::ELEMENT_TERBIUM)); - self::register("element_thallium", $factory->fromTypeId(Ids::ELEMENT_THALLIUM)); - self::register("element_thorium", $factory->fromTypeId(Ids::ELEMENT_THORIUM)); - self::register("element_thulium", $factory->fromTypeId(Ids::ELEMENT_THULIUM)); - self::register("element_tin", $factory->fromTypeId(Ids::ELEMENT_TIN)); - self::register("element_titanium", $factory->fromTypeId(Ids::ELEMENT_TITANIUM)); - self::register("element_tungsten", $factory->fromTypeId(Ids::ELEMENT_TUNGSTEN)); - self::register("element_uranium", $factory->fromTypeId(Ids::ELEMENT_URANIUM)); - self::register("element_vanadium", $factory->fromTypeId(Ids::ELEMENT_VANADIUM)); - self::register("element_xenon", $factory->fromTypeId(Ids::ELEMENT_XENON)); - self::register("element_ytterbium", $factory->fromTypeId(Ids::ELEMENT_YTTERBIUM)); - self::register("element_yttrium", $factory->fromTypeId(Ids::ELEMENT_YTTRIUM)); - self::register("element_zero", $factory->fromTypeId(Ids::ELEMENT_ZERO)); - self::register("element_zinc", $factory->fromTypeId(Ids::ELEMENT_ZINC)); - self::register("element_zirconium", $factory->fromTypeId(Ids::ELEMENT_ZIRCONIUM)); - self::register("emerald", $factory->fromTypeId(Ids::EMERALD)); - self::register("emerald_ore", $factory->fromTypeId(Ids::EMERALD_ORE)); - self::register("enchanting_table", $factory->fromTypeId(Ids::ENCHANTING_TABLE)); - self::register("end_portal_frame", $factory->fromTypeId(Ids::END_PORTAL_FRAME)); - self::register("end_rod", $factory->fromTypeId(Ids::END_ROD)); - self::register("end_stone", $factory->fromTypeId(Ids::END_STONE)); - self::register("end_stone_brick_slab", $factory->fromTypeId(Ids::END_STONE_BRICK_SLAB)); - self::register("end_stone_brick_stairs", $factory->fromTypeId(Ids::END_STONE_BRICK_STAIRS)); - self::register("end_stone_brick_wall", $factory->fromTypeId(Ids::END_STONE_BRICK_WALL)); - self::register("end_stone_bricks", $factory->fromTypeId(Ids::END_STONE_BRICKS)); - self::register("ender_chest", $factory->fromTypeId(Ids::ENDER_CHEST)); - self::register("fake_wooden_slab", $factory->fromTypeId(Ids::FAKE_WOODEN_SLAB)); - self::register("farmland", $factory->fromTypeId(Ids::FARMLAND)); - self::register("fern", $factory->fromTypeId(Ids::FERN)); - self::register("fire", $factory->fromTypeId(Ids::FIRE)); - self::register("fletching_table", $factory->fromTypeId(Ids::FLETCHING_TABLE)); - self::register("flower_pot", $factory->fromTypeId(Ids::FLOWER_POT)); - self::register("frosted_ice", $factory->fromTypeId(Ids::FROSTED_ICE)); - self::register("furnace", $factory->fromTypeId(Ids::FURNACE)); - self::register("glass", $factory->fromTypeId(Ids::GLASS)); - self::register("glass_pane", $factory->fromTypeId(Ids::GLASS_PANE)); - self::register("glazed_terracotta", $factory->fromTypeId(Ids::GLAZED_TERRACOTTA)); - self::register("glowing_obsidian", $factory->fromTypeId(Ids::GLOWING_OBSIDIAN)); - self::register("glowstone", $factory->fromTypeId(Ids::GLOWSTONE)); - self::register("gold", $factory->fromTypeId(Ids::GOLD)); - self::register("gold_ore", $factory->fromTypeId(Ids::GOLD_ORE)); - self::register("granite", $factory->fromTypeId(Ids::GRANITE)); - self::register("granite_slab", $factory->fromTypeId(Ids::GRANITE_SLAB)); - self::register("granite_stairs", $factory->fromTypeId(Ids::GRANITE_STAIRS)); - self::register("granite_wall", $factory->fromTypeId(Ids::GRANITE_WALL)); - self::register("grass", $factory->fromTypeId(Ids::GRASS)); - self::register("grass_path", $factory->fromTypeId(Ids::GRASS_PATH)); - self::register("gravel", $factory->fromTypeId(Ids::GRAVEL)); - self::register("green_torch", $factory->fromTypeId(Ids::GREEN_TORCH)); - self::register("hardened_clay", $factory->fromTypeId(Ids::HARDENED_CLAY)); - self::register("hardened_glass", $factory->fromTypeId(Ids::HARDENED_GLASS)); - self::register("hardened_glass_pane", $factory->fromTypeId(Ids::HARDENED_GLASS_PANE)); - self::register("hay_bale", $factory->fromTypeId(Ids::HAY_BALE)); - self::register("honeycomb", $factory->fromTypeId(Ids::HONEYCOMB)); - self::register("hopper", $factory->fromTypeId(Ids::HOPPER)); - self::register("ice", $factory->fromTypeId(Ids::ICE)); - self::register("infested_chiseled_stone_brick", $factory->fromTypeId(Ids::INFESTED_CHISELED_STONE_BRICK)); - self::register("infested_cobblestone", $factory->fromTypeId(Ids::INFESTED_COBBLESTONE)); - self::register("infested_cracked_stone_brick", $factory->fromTypeId(Ids::INFESTED_CRACKED_STONE_BRICK)); - self::register("infested_mossy_stone_brick", $factory->fromTypeId(Ids::INFESTED_MOSSY_STONE_BRICK)); - self::register("infested_stone", $factory->fromTypeId(Ids::INFESTED_STONE)); - self::register("infested_stone_brick", $factory->fromTypeId(Ids::INFESTED_STONE_BRICK)); - self::register("info_update", $factory->fromTypeId(Ids::INFO_UPDATE)); - self::register("info_update2", $factory->fromTypeId(Ids::INFO_UPDATE2)); - self::register("invisible_bedrock", $factory->fromTypeId(Ids::INVISIBLE_BEDROCK)); - self::register("iron", $factory->fromTypeId(Ids::IRON)); - self::register("iron_bars", $factory->fromTypeId(Ids::IRON_BARS)); - self::register("iron_door", $factory->fromTypeId(Ids::IRON_DOOR)); - self::register("iron_ore", $factory->fromTypeId(Ids::IRON_ORE)); - self::register("iron_trapdoor", $factory->fromTypeId(Ids::IRON_TRAPDOOR)); - self::register("item_frame", $factory->fromTypeId(Ids::ITEM_FRAME)); - self::register("jukebox", $factory->fromTypeId(Ids::JUKEBOX)); - self::register("jungle_button", $factory->fromTypeId(Ids::JUNGLE_BUTTON)); - self::register("jungle_door", $factory->fromTypeId(Ids::JUNGLE_DOOR)); - self::register("jungle_fence", $factory->fromTypeId(Ids::JUNGLE_FENCE)); - self::register("jungle_fence_gate", $factory->fromTypeId(Ids::JUNGLE_FENCE_GATE)); - self::register("jungle_leaves", $factory->fromTypeId(Ids::JUNGLE_LEAVES)); - self::register("jungle_log", $factory->fromTypeId(Ids::JUNGLE_LOG)); - self::register("jungle_planks", $factory->fromTypeId(Ids::JUNGLE_PLANKS)); - self::register("jungle_pressure_plate", $factory->fromTypeId(Ids::JUNGLE_PRESSURE_PLATE)); - self::register("jungle_sapling", $factory->fromTypeId(Ids::JUNGLE_SAPLING)); - self::register("jungle_sign", $factory->fromTypeId(Ids::JUNGLE_SIGN)); - self::register("jungle_slab", $factory->fromTypeId(Ids::JUNGLE_SLAB)); - self::register("jungle_stairs", $factory->fromTypeId(Ids::JUNGLE_STAIRS)); - self::register("jungle_trapdoor", $factory->fromTypeId(Ids::JUNGLE_TRAPDOOR)); - self::register("jungle_wall_sign", $factory->fromTypeId(Ids::JUNGLE_WALL_SIGN)); - self::register("jungle_wood", $factory->fromTypeId(Ids::JUNGLE_WOOD)); - self::register("lab_table", $factory->fromTypeId(Ids::LAB_TABLE)); - self::register("ladder", $factory->fromTypeId(Ids::LADDER)); - self::register("lantern", $factory->fromTypeId(Ids::LANTERN)); - self::register("lapis_lazuli", $factory->fromTypeId(Ids::LAPIS_LAZULI)); - self::register("lapis_lazuli_ore", $factory->fromTypeId(Ids::LAPIS_LAZULI_ORE)); - self::register("large_fern", $factory->fromTypeId(Ids::LARGE_FERN)); - self::register("lava", $factory->fromTypeId(Ids::LAVA)); - self::register("lectern", $factory->fromTypeId(Ids::LECTERN)); - self::register("legacy_stonecutter", $factory->fromTypeId(Ids::LEGACY_STONECUTTER)); - self::register("lever", $factory->fromTypeId(Ids::LEVER)); - self::register("light", $factory->fromTypeId(Ids::LIGHT)); - self::register("lilac", $factory->fromTypeId(Ids::LILAC)); - self::register("lily_of_the_valley", $factory->fromTypeId(Ids::LILY_OF_THE_VALLEY)); - self::register("lily_pad", $factory->fromTypeId(Ids::LILY_PAD)); - self::register("lit_pumpkin", $factory->fromTypeId(Ids::LIT_PUMPKIN)); - self::register("loom", $factory->fromTypeId(Ids::LOOM)); - self::register("magma", $factory->fromTypeId(Ids::MAGMA)); - self::register("mangrove_button", $factory->fromTypeId(Ids::MANGROVE_BUTTON)); - self::register("mangrove_door", $factory->fromTypeId(Ids::MANGROVE_DOOR)); - self::register("mangrove_fence", $factory->fromTypeId(Ids::MANGROVE_FENCE)); - self::register("mangrove_fence_gate", $factory->fromTypeId(Ids::MANGROVE_FENCE_GATE)); - self::register("mangrove_log", $factory->fromTypeId(Ids::MANGROVE_LOG)); - self::register("mangrove_planks", $factory->fromTypeId(Ids::MANGROVE_PLANKS)); - self::register("mangrove_pressure_plate", $factory->fromTypeId(Ids::MANGROVE_PRESSURE_PLATE)); - self::register("mangrove_sign", $factory->fromTypeId(Ids::MANGROVE_SIGN)); - self::register("mangrove_slab", $factory->fromTypeId(Ids::MANGROVE_SLAB)); - self::register("mangrove_stairs", $factory->fromTypeId(Ids::MANGROVE_STAIRS)); - self::register("mangrove_trapdoor", $factory->fromTypeId(Ids::MANGROVE_TRAPDOOR)); - self::register("mangrove_wall_sign", $factory->fromTypeId(Ids::MANGROVE_WALL_SIGN)); - self::register("mangrove_wood", $factory->fromTypeId(Ids::MANGROVE_WOOD)); - self::register("material_reducer", $factory->fromTypeId(Ids::MATERIAL_REDUCER)); - self::register("melon", $factory->fromTypeId(Ids::MELON)); - self::register("melon_stem", $factory->fromTypeId(Ids::MELON_STEM)); - self::register("mob_head", $factory->fromTypeId(Ids::MOB_HEAD)); - self::register("monster_spawner", $factory->fromTypeId(Ids::MONSTER_SPAWNER)); - self::register("mossy_cobblestone", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE)); - self::register("mossy_cobblestone_slab", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_SLAB)); - self::register("mossy_cobblestone_stairs", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_STAIRS)); - self::register("mossy_cobblestone_wall", $factory->fromTypeId(Ids::MOSSY_COBBLESTONE_WALL)); - self::register("mossy_stone_brick_slab", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_SLAB)); - self::register("mossy_stone_brick_stairs", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_STAIRS)); - self::register("mossy_stone_brick_wall", $factory->fromTypeId(Ids::MOSSY_STONE_BRICK_WALL)); - self::register("mossy_stone_bricks", $factory->fromTypeId(Ids::MOSSY_STONE_BRICKS)); - self::register("mud_brick_slab", $factory->fromTypeId(Ids::MUD_BRICK_SLAB)); - self::register("mud_brick_stairs", $factory->fromTypeId(Ids::MUD_BRICK_STAIRS)); - self::register("mud_brick_wall", $factory->fromTypeId(Ids::MUD_BRICK_WALL)); - self::register("mud_bricks", $factory->fromTypeId(Ids::MUD_BRICKS)); - self::register("mushroom_stem", $factory->fromTypeId(Ids::MUSHROOM_STEM)); - self::register("mycelium", $factory->fromTypeId(Ids::MYCELIUM)); - self::register("nether_brick_fence", $factory->fromTypeId(Ids::NETHER_BRICK_FENCE)); - self::register("nether_brick_slab", $factory->fromTypeId(Ids::NETHER_BRICK_SLAB)); - self::register("nether_brick_stairs", $factory->fromTypeId(Ids::NETHER_BRICK_STAIRS)); - self::register("nether_brick_wall", $factory->fromTypeId(Ids::NETHER_BRICK_WALL)); - self::register("nether_bricks", $factory->fromTypeId(Ids::NETHER_BRICKS)); - self::register("nether_gold_ore", $factory->fromTypeId(Ids::NETHER_GOLD_ORE)); - self::register("nether_portal", $factory->fromTypeId(Ids::NETHER_PORTAL)); - self::register("nether_quartz_ore", $factory->fromTypeId(Ids::NETHER_QUARTZ_ORE)); - self::register("nether_reactor_core", $factory->fromTypeId(Ids::NETHER_REACTOR_CORE)); - self::register("nether_wart", $factory->fromTypeId(Ids::NETHER_WART)); - self::register("nether_wart_block", $factory->fromTypeId(Ids::NETHER_WART_BLOCK)); - self::register("netherrack", $factory->fromTypeId(Ids::NETHERRACK)); - self::register("note_block", $factory->fromTypeId(Ids::NOTE_BLOCK)); - self::register("oak_button", $factory->fromTypeId(Ids::OAK_BUTTON)); - self::register("oak_door", $factory->fromTypeId(Ids::OAK_DOOR)); - self::register("oak_fence", $factory->fromTypeId(Ids::OAK_FENCE)); - self::register("oak_fence_gate", $factory->fromTypeId(Ids::OAK_FENCE_GATE)); - self::register("oak_leaves", $factory->fromTypeId(Ids::OAK_LEAVES)); - self::register("oak_log", $factory->fromTypeId(Ids::OAK_LOG)); - self::register("oak_planks", $factory->fromTypeId(Ids::OAK_PLANKS)); - self::register("oak_pressure_plate", $factory->fromTypeId(Ids::OAK_PRESSURE_PLATE)); - self::register("oak_sapling", $factory->fromTypeId(Ids::OAK_SAPLING)); - self::register("oak_sign", $factory->fromTypeId(Ids::OAK_SIGN)); - self::register("oak_slab", $factory->fromTypeId(Ids::OAK_SLAB)); - self::register("oak_stairs", $factory->fromTypeId(Ids::OAK_STAIRS)); - self::register("oak_trapdoor", $factory->fromTypeId(Ids::OAK_TRAPDOOR)); - self::register("oak_wall_sign", $factory->fromTypeId(Ids::OAK_WALL_SIGN)); - self::register("oak_wood", $factory->fromTypeId(Ids::OAK_WOOD)); - self::register("obsidian", $factory->fromTypeId(Ids::OBSIDIAN)); - self::register("orange_tulip", $factory->fromTypeId(Ids::ORANGE_TULIP)); - self::register("oxeye_daisy", $factory->fromTypeId(Ids::OXEYE_DAISY)); - self::register("packed_ice", $factory->fromTypeId(Ids::PACKED_ICE)); - self::register("peony", $factory->fromTypeId(Ids::PEONY)); - self::register("pink_tulip", $factory->fromTypeId(Ids::PINK_TULIP)); - self::register("podzol", $factory->fromTypeId(Ids::PODZOL)); - self::register("polished_andesite", $factory->fromTypeId(Ids::POLISHED_ANDESITE)); - self::register("polished_andesite_slab", $factory->fromTypeId(Ids::POLISHED_ANDESITE_SLAB)); - self::register("polished_andesite_stairs", $factory->fromTypeId(Ids::POLISHED_ANDESITE_STAIRS)); - self::register("polished_basalt", $factory->fromTypeId(Ids::POLISHED_BASALT)); - self::register("polished_blackstone", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE)); - self::register("polished_blackstone_brick_slab", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_SLAB)); - self::register("polished_blackstone_brick_stairs", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS)); - self::register("polished_blackstone_brick_wall", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICK_WALL)); - self::register("polished_blackstone_bricks", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BRICKS)); - self::register("polished_blackstone_button", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_BUTTON)); - self::register("polished_blackstone_pressure_plate", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE)); - self::register("polished_blackstone_slab", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_SLAB)); - self::register("polished_blackstone_stairs", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_STAIRS)); - self::register("polished_blackstone_wall", $factory->fromTypeId(Ids::POLISHED_BLACKSTONE_WALL)); - self::register("polished_deepslate", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE)); - self::register("polished_deepslate_slab", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_SLAB)); - self::register("polished_deepslate_stairs", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_STAIRS)); - self::register("polished_deepslate_wall", $factory->fromTypeId(Ids::POLISHED_DEEPSLATE_WALL)); - self::register("polished_diorite", $factory->fromTypeId(Ids::POLISHED_DIORITE)); - self::register("polished_diorite_slab", $factory->fromTypeId(Ids::POLISHED_DIORITE_SLAB)); - self::register("polished_diorite_stairs", $factory->fromTypeId(Ids::POLISHED_DIORITE_STAIRS)); - self::register("polished_granite", $factory->fromTypeId(Ids::POLISHED_GRANITE)); - self::register("polished_granite_slab", $factory->fromTypeId(Ids::POLISHED_GRANITE_SLAB)); - self::register("polished_granite_stairs", $factory->fromTypeId(Ids::POLISHED_GRANITE_STAIRS)); - self::register("poppy", $factory->fromTypeId(Ids::POPPY)); - self::register("potatoes", $factory->fromTypeId(Ids::POTATOES)); - self::register("powered_rail", $factory->fromTypeId(Ids::POWERED_RAIL)); - self::register("prismarine", $factory->fromTypeId(Ids::PRISMARINE)); - self::register("prismarine_bricks", $factory->fromTypeId(Ids::PRISMARINE_BRICKS)); - self::register("prismarine_bricks_slab", $factory->fromTypeId(Ids::PRISMARINE_BRICKS_SLAB)); - self::register("prismarine_bricks_stairs", $factory->fromTypeId(Ids::PRISMARINE_BRICKS_STAIRS)); - self::register("prismarine_slab", $factory->fromTypeId(Ids::PRISMARINE_SLAB)); - self::register("prismarine_stairs", $factory->fromTypeId(Ids::PRISMARINE_STAIRS)); - self::register("prismarine_wall", $factory->fromTypeId(Ids::PRISMARINE_WALL)); - self::register("pumpkin", $factory->fromTypeId(Ids::PUMPKIN)); - self::register("pumpkin_stem", $factory->fromTypeId(Ids::PUMPKIN_STEM)); - self::register("purple_torch", $factory->fromTypeId(Ids::PURPLE_TORCH)); - self::register("purpur", $factory->fromTypeId(Ids::PURPUR)); - self::register("purpur_pillar", $factory->fromTypeId(Ids::PURPUR_PILLAR)); - self::register("purpur_slab", $factory->fromTypeId(Ids::PURPUR_SLAB)); - self::register("purpur_stairs", $factory->fromTypeId(Ids::PURPUR_STAIRS)); - self::register("quartz", $factory->fromTypeId(Ids::QUARTZ)); - self::register("quartz_bricks", $factory->fromTypeId(Ids::QUARTZ_BRICKS)); - self::register("quartz_pillar", $factory->fromTypeId(Ids::QUARTZ_PILLAR)); - self::register("quartz_slab", $factory->fromTypeId(Ids::QUARTZ_SLAB)); - self::register("quartz_stairs", $factory->fromTypeId(Ids::QUARTZ_STAIRS)); - self::register("rail", $factory->fromTypeId(Ids::RAIL)); - self::register("raw_copper", $factory->fromTypeId(Ids::RAW_COPPER)); - self::register("raw_gold", $factory->fromTypeId(Ids::RAW_GOLD)); - self::register("raw_iron", $factory->fromTypeId(Ids::RAW_IRON)); - self::register("red_mushroom", $factory->fromTypeId(Ids::RED_MUSHROOM)); - self::register("red_mushroom_block", $factory->fromTypeId(Ids::RED_MUSHROOM_BLOCK)); - self::register("red_nether_brick_slab", $factory->fromTypeId(Ids::RED_NETHER_BRICK_SLAB)); - self::register("red_nether_brick_stairs", $factory->fromTypeId(Ids::RED_NETHER_BRICK_STAIRS)); - self::register("red_nether_brick_wall", $factory->fromTypeId(Ids::RED_NETHER_BRICK_WALL)); - self::register("red_nether_bricks", $factory->fromTypeId(Ids::RED_NETHER_BRICKS)); - self::register("red_sand", $factory->fromTypeId(Ids::RED_SAND)); - self::register("red_sandstone", $factory->fromTypeId(Ids::RED_SANDSTONE)); - self::register("red_sandstone_slab", $factory->fromTypeId(Ids::RED_SANDSTONE_SLAB)); - self::register("red_sandstone_stairs", $factory->fromTypeId(Ids::RED_SANDSTONE_STAIRS)); - self::register("red_sandstone_wall", $factory->fromTypeId(Ids::RED_SANDSTONE_WALL)); - self::register("red_torch", $factory->fromTypeId(Ids::RED_TORCH)); - self::register("red_tulip", $factory->fromTypeId(Ids::RED_TULIP)); - self::register("redstone", $factory->fromTypeId(Ids::REDSTONE)); - self::register("redstone_comparator", $factory->fromTypeId(Ids::REDSTONE_COMPARATOR)); - self::register("redstone_lamp", $factory->fromTypeId(Ids::REDSTONE_LAMP)); - self::register("redstone_ore", $factory->fromTypeId(Ids::REDSTONE_ORE)); - self::register("redstone_repeater", $factory->fromTypeId(Ids::REDSTONE_REPEATER)); - self::register("redstone_torch", $factory->fromTypeId(Ids::REDSTONE_TORCH)); - self::register("redstone_wire", $factory->fromTypeId(Ids::REDSTONE_WIRE)); - self::register("reserved6", $factory->fromTypeId(Ids::RESERVED6)); - self::register("rose_bush", $factory->fromTypeId(Ids::ROSE_BUSH)); - self::register("sand", $factory->fromTypeId(Ids::SAND)); - self::register("sandstone", $factory->fromTypeId(Ids::SANDSTONE)); - self::register("sandstone_slab", $factory->fromTypeId(Ids::SANDSTONE_SLAB)); - self::register("sandstone_stairs", $factory->fromTypeId(Ids::SANDSTONE_STAIRS)); - self::register("sandstone_wall", $factory->fromTypeId(Ids::SANDSTONE_WALL)); - self::register("sea_lantern", $factory->fromTypeId(Ids::SEA_LANTERN)); - self::register("sea_pickle", $factory->fromTypeId(Ids::SEA_PICKLE)); - self::register("shroomlight", $factory->fromTypeId(Ids::SHROOMLIGHT)); - self::register("shulker_box", $factory->fromTypeId(Ids::SHULKER_BOX)); - self::register("slime", $factory->fromTypeId(Ids::SLIME)); - self::register("smoker", $factory->fromTypeId(Ids::SMOKER)); - self::register("smooth_basalt", $factory->fromTypeId(Ids::SMOOTH_BASALT)); - self::register("smooth_quartz", $factory->fromTypeId(Ids::SMOOTH_QUARTZ)); - self::register("smooth_quartz_slab", $factory->fromTypeId(Ids::SMOOTH_QUARTZ_SLAB)); - self::register("smooth_quartz_stairs", $factory->fromTypeId(Ids::SMOOTH_QUARTZ_STAIRS)); - self::register("smooth_red_sandstone", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE)); - self::register("smooth_red_sandstone_slab", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE_SLAB)); - self::register("smooth_red_sandstone_stairs", $factory->fromTypeId(Ids::SMOOTH_RED_SANDSTONE_STAIRS)); - self::register("smooth_sandstone", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE)); - self::register("smooth_sandstone_slab", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE_SLAB)); - self::register("smooth_sandstone_stairs", $factory->fromTypeId(Ids::SMOOTH_SANDSTONE_STAIRS)); - self::register("smooth_stone", $factory->fromTypeId(Ids::SMOOTH_STONE)); - self::register("smooth_stone_slab", $factory->fromTypeId(Ids::SMOOTH_STONE_SLAB)); - self::register("snow", $factory->fromTypeId(Ids::SNOW)); - self::register("snow_layer", $factory->fromTypeId(Ids::SNOW_LAYER)); - self::register("soul_fire", $factory->fromTypeId(Ids::SOUL_FIRE)); - self::register("soul_lantern", $factory->fromTypeId(Ids::SOUL_LANTERN)); - self::register("soul_sand", $factory->fromTypeId(Ids::SOUL_SAND)); - self::register("soul_soil", $factory->fromTypeId(Ids::SOUL_SOIL)); - self::register("soul_torch", $factory->fromTypeId(Ids::SOUL_TORCH)); - self::register("sponge", $factory->fromTypeId(Ids::SPONGE)); - self::register("spruce_button", $factory->fromTypeId(Ids::SPRUCE_BUTTON)); - self::register("spruce_door", $factory->fromTypeId(Ids::SPRUCE_DOOR)); - self::register("spruce_fence", $factory->fromTypeId(Ids::SPRUCE_FENCE)); - self::register("spruce_fence_gate", $factory->fromTypeId(Ids::SPRUCE_FENCE_GATE)); - self::register("spruce_leaves", $factory->fromTypeId(Ids::SPRUCE_LEAVES)); - self::register("spruce_log", $factory->fromTypeId(Ids::SPRUCE_LOG)); - self::register("spruce_planks", $factory->fromTypeId(Ids::SPRUCE_PLANKS)); - self::register("spruce_pressure_plate", $factory->fromTypeId(Ids::SPRUCE_PRESSURE_PLATE)); - self::register("spruce_sapling", $factory->fromTypeId(Ids::SPRUCE_SAPLING)); - self::register("spruce_sign", $factory->fromTypeId(Ids::SPRUCE_SIGN)); - self::register("spruce_slab", $factory->fromTypeId(Ids::SPRUCE_SLAB)); - self::register("spruce_stairs", $factory->fromTypeId(Ids::SPRUCE_STAIRS)); - self::register("spruce_trapdoor", $factory->fromTypeId(Ids::SPRUCE_TRAPDOOR)); - self::register("spruce_wall_sign", $factory->fromTypeId(Ids::SPRUCE_WALL_SIGN)); - self::register("spruce_wood", $factory->fromTypeId(Ids::SPRUCE_WOOD)); - self::register("stained_clay", $factory->fromTypeId(Ids::STAINED_CLAY)); - self::register("stained_glass", $factory->fromTypeId(Ids::STAINED_GLASS)); - self::register("stained_glass_pane", $factory->fromTypeId(Ids::STAINED_GLASS_PANE)); - self::register("stained_hardened_glass", $factory->fromTypeId(Ids::STAINED_HARDENED_GLASS)); - self::register("stained_hardened_glass_pane", $factory->fromTypeId(Ids::STAINED_HARDENED_GLASS_PANE)); - self::register("stone", $factory->fromTypeId(Ids::STONE)); - self::register("stone_brick_slab", $factory->fromTypeId(Ids::STONE_BRICK_SLAB)); - self::register("stone_brick_stairs", $factory->fromTypeId(Ids::STONE_BRICK_STAIRS)); - self::register("stone_brick_wall", $factory->fromTypeId(Ids::STONE_BRICK_WALL)); - self::register("stone_bricks", $factory->fromTypeId(Ids::STONE_BRICKS)); - self::register("stone_button", $factory->fromTypeId(Ids::STONE_BUTTON)); - self::register("stone_pressure_plate", $factory->fromTypeId(Ids::STONE_PRESSURE_PLATE)); - self::register("stone_slab", $factory->fromTypeId(Ids::STONE_SLAB)); - self::register("stone_stairs", $factory->fromTypeId(Ids::STONE_STAIRS)); - self::register("stonecutter", $factory->fromTypeId(Ids::STONECUTTER)); - self::register("sugarcane", $factory->fromTypeId(Ids::SUGARCANE)); - self::register("sunflower", $factory->fromTypeId(Ids::SUNFLOWER)); - self::register("sweet_berry_bush", $factory->fromTypeId(Ids::SWEET_BERRY_BUSH)); - self::register("tall_grass", $factory->fromTypeId(Ids::TALL_GRASS)); - self::register("tinted_glass", $factory->fromTypeId(Ids::TINTED_GLASS)); - self::register("tnt", $factory->fromTypeId(Ids::TNT)); - self::register("torch", $factory->fromTypeId(Ids::TORCH)); - self::register("trapped_chest", $factory->fromTypeId(Ids::TRAPPED_CHEST)); - self::register("tripwire", $factory->fromTypeId(Ids::TRIPWIRE)); - self::register("tripwire_hook", $factory->fromTypeId(Ids::TRIPWIRE_HOOK)); - self::register("tuff", $factory->fromTypeId(Ids::TUFF)); - self::register("underwater_torch", $factory->fromTypeId(Ids::UNDERWATER_TORCH)); - self::register("vines", $factory->fromTypeId(Ids::VINES)); - self::register("wall_banner", $factory->fromTypeId(Ids::WALL_BANNER)); - self::register("wall_coral_fan", $factory->fromTypeId(Ids::WALL_CORAL_FAN)); - self::register("warped_button", $factory->fromTypeId(Ids::WARPED_BUTTON)); - self::register("warped_door", $factory->fromTypeId(Ids::WARPED_DOOR)); - self::register("warped_fence", $factory->fromTypeId(Ids::WARPED_FENCE)); - self::register("warped_fence_gate", $factory->fromTypeId(Ids::WARPED_FENCE_GATE)); - self::register("warped_hyphae", $factory->fromTypeId(Ids::WARPED_HYPHAE)); - self::register("warped_planks", $factory->fromTypeId(Ids::WARPED_PLANKS)); - self::register("warped_pressure_plate", $factory->fromTypeId(Ids::WARPED_PRESSURE_PLATE)); - self::register("warped_sign", $factory->fromTypeId(Ids::WARPED_SIGN)); - self::register("warped_slab", $factory->fromTypeId(Ids::WARPED_SLAB)); - self::register("warped_stairs", $factory->fromTypeId(Ids::WARPED_STAIRS)); - self::register("warped_stem", $factory->fromTypeId(Ids::WARPED_STEM)); - self::register("warped_trapdoor", $factory->fromTypeId(Ids::WARPED_TRAPDOOR)); - self::register("warped_wall_sign", $factory->fromTypeId(Ids::WARPED_WALL_SIGN)); - self::register("water", $factory->fromTypeId(Ids::WATER)); - self::register("weighted_pressure_plate_heavy", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY)); - self::register("weighted_pressure_plate_light", $factory->fromTypeId(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT)); - self::register("wheat", $factory->fromTypeId(Ids::WHEAT)); - self::register("white_tulip", $factory->fromTypeId(Ids::WHITE_TULIP)); - self::register("wool", $factory->fromTypeId(Ids::WOOL)); + $railBreakInfo = new BlockBreakInfo(0.7); + self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); + self::register("air", new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); + self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "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; + } + return parent::getBreakTime($item); + } + })); + self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", BreakInfo::instant())); + + $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); + self::register("banner", new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); + self::register("wall_banner", new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); + self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); + self::register("barrier", new Transparent(new BID(Ids::BARRIER), "Barrier", BreakInfo::indestructible())); + self::register("beacon", new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new BreakInfo(3.0))); + self::register("bed", new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); + self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); + + self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); + self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); + self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); + self::register("brewing_stand", new BrewingStand(new BID(Ids::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); + self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); + self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); + + self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", BreakInfo::instant())); + self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new BreakInfo(0.4))); + self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new BreakInfo(0.5))); + self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", BreakInfo::instant())); + + $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); + self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); + self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); + self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + + $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); + self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); + self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); + self::register("mossy_cobblestone_stairs", new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); + + self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); + self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); + self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); + self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); + self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); + + self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); + self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); + self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", BreakInfo::instant())); + self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); + self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); + self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", BreakInfo::indestructible())); + self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); + self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "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); + self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); + self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); + + self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); + self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); + self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); + self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); + self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", BreakInfo::instant())); + self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", BreakInfo::instant())); + self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", BreakInfo::instant())); + self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); + self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); + self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", BreakInfo::instant())); + self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); + self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); + self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); + self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", BreakInfo::instant())); + self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); + self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); + self::register("FLOWER_POT", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); + self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); + self::register("FURNACE", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("BLAST_FURNACE", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("SMOKER", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + + $glassBreakInfo = new BreakInfo(0.3); + self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); + self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); + self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); + self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); + self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + + $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); + self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); + self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); + self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); + + $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); + self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); + + $hardenedGlassBreakInfo = new BreakInfo(10.0); + self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); + self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); + self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); + self::register("HOPPER", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + + $updateBlockBreakInfo = new BreakInfo(1.0); + self::register("info_update", new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); + self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); + self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); + + $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); + self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); + self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); + $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); + self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); + self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); + self::register("ITEM_FRAME", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); + self::register("JUKEBOX", new Jukebox(new BID(Ids::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 + self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new BreakInfo(0.4, ToolType::AXE))); + + $lanternBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); + self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); + + self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); + self::register("LECTERN", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); + self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); + self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); + self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); + self::register("MONSTER_SPAWNER", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); + + $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); + self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); + self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); + self::register("nether_brick_stairs", new Stair(new BID(Ids::NETHER_BRICK_STAIRS), "Nether Brick Stairs", $netherBrickBreakInfo)); + self::register("red_nether_brick_stairs", new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS), "Red Nether Brick Stairs", $netherBrickBreakInfo)); + self::register("chiseled_nether_bricks", new Opaque(new BID(Ids::CHISELED_NETHER_BRICKS), "Chiseled Nether Bricks", $netherBrickBreakInfo)); + self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); + + self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); + self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); + self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); + self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("NOTE_BLOCK", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); + self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); + self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); + self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); + + $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); + self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); + self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); + self::register("prismarine_bricks_stairs", new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS), "Prismarine Bricks Stairs", $prismarineBreakInfo)); + self::register("dark_prismarine_stairs", new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); + self::register("prismarine_stairs", new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); + + $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); + self::register("pumpkin", new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); + self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); + self::register("lit_pumpkin", new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); + + self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); + + $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); + self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); + self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); + + $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); + self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); + self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); + self::register("smooth_quartz", new Opaque(new BID(Ids::SMOOTH_QUARTZ), "Smooth Quartz Block", $quartzBreakInfo)); + self::register("quartz_bricks", new Opaque(new BID(Ids::QUARTZ_BRICKS), "Quartz Bricks", $quartzBreakInfo)); + + self::register("quartz_stairs", new Stair(new BID(Ids::QUARTZ_STAIRS), "Quartz Stairs", $quartzBreakInfo)); + self::register("smooth_quartz_stairs", new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); + + self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); + self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); + self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + self::register("REDSTONE_COMPARATOR", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); + self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); + self::register("redstone_torch", new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); + self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); + self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", BreakInfo::instant())); + + $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); + self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); + self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); + + self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new BreakInfo(0.3))); + self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); + self::register("MOB_HEAD", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); + self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); + self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); + $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); + self::register("SHULKER_BOX", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + + $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register( + "stone", + $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ + public function getDropsForCompatibleTool(Item $item) : array{ + return [VanillaBlocks::COBBLESTONE()->asItem()]; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + } + ); + self::register("andesite", new Opaque(new BID(Ids::ANDESITE), "Andesite", $stoneBreakInfo)); + self::register("diorite", new Opaque(new BID(Ids::DIORITE), "Diorite", $stoneBreakInfo)); + self::register("granite", new Opaque(new BID(Ids::GRANITE), "Granite", $stoneBreakInfo)); + self::register("polished_andesite", new Opaque(new BID(Ids::POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); + self::register("polished_diorite", new Opaque(new BID(Ids::POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); + self::register("polished_granite", new Opaque(new BID(Ids::POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); + + self::register("stone_bricks", $stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS), "Stone Bricks", $stoneBreakInfo)); + self::register("mossy_stone_bricks", $mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS), "Mossy Stone Bricks", $stoneBreakInfo)); + self::register("cracked_stone_bricks", $crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); + self::register("chiseled_stone_bricks", $chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); + + $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); + self::register("infested_stone", new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); + self::register("infested_stone_brick", new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); + self::register("infested_cobblestone", new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); + self::register("infested_mossy_stone_brick", new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); + self::register("infested_cracked_stone_brick", new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); + self::register("infested_chiseled_stone_brick", new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); + + self::register("stone_stairs", new Stair(new BID(Ids::STONE_STAIRS), "Stone Stairs", $stoneBreakInfo)); + self::register("smooth_stone", new Opaque(new BID(Ids::SMOOTH_STONE), "Smooth Stone", $stoneBreakInfo)); + self::register("andesite_stairs", new Stair(new BID(Ids::ANDESITE_STAIRS), "Andesite Stairs", $stoneBreakInfo)); + self::register("diorite_stairs", new Stair(new BID(Ids::DIORITE_STAIRS), "Diorite Stairs", $stoneBreakInfo)); + self::register("granite_stairs", new Stair(new BID(Ids::GRANITE_STAIRS), "Granite Stairs", $stoneBreakInfo)); + self::register("polished_andesite_stairs", new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS), "Polished Andesite Stairs", $stoneBreakInfo)); + self::register("polished_diorite_stairs", new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS), "Polished Diorite Stairs", $stoneBreakInfo)); + self::register("polished_granite_stairs", new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); + self::register("stone_brick_stairs", new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); + self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); + self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); + self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); + self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "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); + + self::register("BRICK_SLAB", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); + self::register("COBBLESTONE_SLAB", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); + self::register("FAKE_WOODEN_SLAB", new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo)); + self::register("NETHER_BRICK_SLAB", new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo)); + self::register("QUARTZ_SLAB", new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo)); + self::register("SANDSTONE_SLAB", new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo)); + self::register("SMOOTH_STONE_SLAB", new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo)); + self::register("STONE_BRICK_SLAB", new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo)); + self::register("DARK_PRISMARINE_SLAB", new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo)); + self::register("MOSSY_COBBLESTONE_SLAB", new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo)); + self::register("PRISMARINE_SLAB", new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo)); + self::register("PRISMARINE_BRICKS_SLAB", new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo)); + self::register("PURPUR_SLAB", new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo)); + self::register("RED_NETHER_BRICK_SLAB", new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo)); + self::register("RED_SANDSTONE_SLAB", new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo)); + self::register("SMOOTH_SANDSTONE_SLAB", new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo)); + self::register("ANDESITE_SLAB", new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo)); + self::register("DIORITE_SLAB", new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo)); + self::register("END_STONE_BRICK_SLAB", new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo)); + self::register("GRANITE_SLAB", new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo)); + self::register("POLISHED_ANDESITE_SLAB", new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo)); + self::register("POLISHED_DIORITE_SLAB", new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo)); + self::register("POLISHED_GRANITE_SLAB", new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo)); + self::register("SMOOTH_RED_SANDSTONE_SLAB", new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo)); + self::register("CUT_RED_SANDSTONE_SLAB", new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo)); + self::register("CUT_SANDSTONE_SLAB", new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo)); + self::register("MOSSY_STONE_BRICK_SLAB", new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo)); + self::register("SMOOTH_QUARTZ_SLAB", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); + self::register("STONE_SLAB", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); + + self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); + self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); + self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); + self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("tall_grass", new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); + + self::register("blue_torch", new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", BreakInfo::instant())); + self::register("purple_torch", new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", BreakInfo::instant())); + self::register("red_torch", new Torch(new BID(Ids::RED_TORCH), "Red Torch", BreakInfo::instant())); + self::register("green_torch", new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", BreakInfo::instant())); + self::register("torch", new Torch(new BID(Ids::TORCH), "Torch", BreakInfo::instant())); + + self::register("TRAPPED_CHEST", new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); + self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); + self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); + self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); + self::register("vines", new Vine(new BID(Ids::VINES), "Vines", new BreakInfo(0.2, ToolType::AXE))); + self::register("water", new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); + self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); + + $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); + self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); + self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); + + $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ + public function getBreakTime(Item $item) : float{ + if($item->getBlockToolType() === ToolType::SHEARS){ + return 0.0; + } + return parent::getBreakTime($item); + } + }; + + foreach(TreeType::getAll() as $treeType){ + $name = $treeType->getDisplayName(); + self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType)); + self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); + } + + $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); + self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); + self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); + self::register("chiseled_red_sandstone", new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE), "Chiseled Red Sandstone", $sandstoneBreakInfo)); + self::register("cut_red_sandstone", new Opaque(new BID(Ids::CUT_RED_SANDSTONE), "Cut Red Sandstone", $sandstoneBreakInfo)); + self::register("smooth_red_sandstone", new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $sandstoneBreakInfo)); + + self::register("sandstone_stairs", new Stair(new BID(Ids::SANDSTONE_STAIRS), "Sandstone Stairs", $sandstoneBreakInfo)); + self::register("smooth_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); + self::register("sandstone", new Opaque(new BID(Ids::SANDSTONE), "Sandstone", $sandstoneBreakInfo)); + self::register("chiseled_sandstone", new Opaque(new BID(Ids::CHISELED_SANDSTONE), "Chiseled Sandstone", $sandstoneBreakInfo)); + self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); + self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); + + self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("DYED_SHULKER_BOX", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); + self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); + self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); + self::register("stained_clay", new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); + self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); + self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); + self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); + self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ + public function getBreakTime(Item $item) : float{ + $time = parent::getBreakTime($item); + if($item->getBlockToolType() === ToolType::SHEARS){ + $time *= 3; //shears break compatible blocks 15x faster, but wool 5x + } + + return $time; + } + })); + + //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); + self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); + self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); + self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); + self::register("diorite_wall", new Wall(new BID(Ids::DIORITE_WALL), "Diorite Wall", $wallBreakInfo)); + self::register("end_stone_brick_wall", new Wall(new BID(Ids::END_STONE_BRICK_WALL), "End Stone Brick Wall", $wallBreakInfo)); + self::register("granite_wall", new Wall(new BID(Ids::GRANITE_WALL), "Granite Wall", $wallBreakInfo)); + self::register("mossy_stone_brick_wall", new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL), "Mossy Stone Brick Wall", $wallBreakInfo)); + self::register("mossy_cobblestone_wall", new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL), "Mossy Cobblestone Wall", $wallBreakInfo)); + self::register("nether_brick_wall", new Wall(new BID(Ids::NETHER_BRICK_WALL), "Nether Brick Wall", $wallBreakInfo)); + self::register("prismarine_wall", new Wall(new BID(Ids::PRISMARINE_WALL), "Prismarine Wall", $wallBreakInfo)); + self::register("red_nether_brick_wall", new Wall(new BID(Ids::RED_NETHER_BRICK_WALL), "Red Nether Brick Wall", $wallBreakInfo)); + self::register("red_sandstone_wall", new Wall(new BID(Ids::RED_SANDSTONE_WALL), "Red Sandstone Wall", $wallBreakInfo)); + self::register("sandstone_wall", new Wall(new BID(Ids::SANDSTONE_WALL), "Sandstone Wall", $wallBreakInfo)); + self::register("stone_brick_wall", new Wall(new BID(Ids::STONE_BRICK_WALL), "Stone Brick Wall", $wallBreakInfo)); + + self::registerElements(); + + $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); + self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); + self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); + self::register("material_reducer", new ChemistryTable(new BID(Ids::MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); + + self::register("chemical_heat", new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT), "Heat Block", $chemistryTableBreakInfo)); + + self::registerMushroomBlocks(); + + self::register("coral", new Coral( + new BID(Ids::CORAL), + "Coral", + BreakInfo::instant(), + )); + self::register("coral_fan", new FloorCoralFan( + new BID(Ids::CORAL_FAN), + "Coral Fan", + BreakInfo::instant(), + )); + self::register("wall_coral_fan", new WallCoralFan( + new BID(Ids::WALL_CORAL_FAN), + "Wall Coral Fan", + BreakInfo::instant(), + )); + + self::registerBlocksR13(); + self::registerBlocksR14(); + self::registerBlocksR16(); + self::registerBlocksR17(); + self::registerMudBlocks(); + + self::registerOres(); + self::registerWoodenBlocks(); } + + private static function registerWoodenBlocks() : void{ + $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); + $signBreakInfo = new BreakInfo(1.0, ToolType::AXE); + $logBreakInfo = new BreakInfo(2.0, ToolType::AXE); + $woodenDoorBreakInfo = new BreakInfo(3.0, ToolType::AXE, 0, 15.0); + $woodenButtonBreakInfo = new BreakInfo(0.5, ToolType::AXE); + $woodenPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::AXE); + + foreach(WoodType::getAll() as $woodType){ + $name = $woodType->getDisplayName(); + $idName = fn(string $suffix) => $woodType->name() . "_" . $suffix; + + self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), new Wood(BlockLegacyIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); + self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); + + self::register($idName("planks"), new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); + self::register($idName("fence"), new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); + self::register($idName("slab"), new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); + + self::register($idName("fence_gate"), new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); + self::register($idName("stairs"), new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); + self::register($idName("door"), new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); + + self::register($idName("button"), new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); + self::register($idName("pressure_plate"), new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); + self::register($idName("trapdoor"), new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); + + [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($woodType); + self::register($idName("sign"), new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); + self::register($idName("wall_sign"), new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); + } + } + + private static function registerMushroomBlocks() : void{ + $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); + + self::register("brown_mushroom_block", new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); + self::register("red_mushroom_block", new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); + + //finally, the stems + self::register("mushroom_stem", new MushroomStem(new BID(Ids::MUSHROOM_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); + self::register("all_sided_mushroom_stem", new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); + } + + private static function registerElements() : void{ + $instaBreak = BreakInfo::instant(); + self::register("element_zero", new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); + + self::register("element_hydrogen", new Element(new BID(Ids::ELEMENT_HYDROGEN), "Hydrogen", $instaBreak, "h", 1, 5)); + self::register("element_helium", new Element(new BID(Ids::ELEMENT_HELIUM), "Helium", $instaBreak, "he", 2, 7)); + self::register("element_lithium", new Element(new BID(Ids::ELEMENT_LITHIUM), "Lithium", $instaBreak, "li", 3, 0)); + self::register("element_beryllium", new Element(new BID(Ids::ELEMENT_BERYLLIUM), "Beryllium", $instaBreak, "be", 4, 1)); + self::register("element_boron", new Element(new BID(Ids::ELEMENT_BORON), "Boron", $instaBreak, "b", 5, 4)); + self::register("element_carbon", new Element(new BID(Ids::ELEMENT_CARBON), "Carbon", $instaBreak, "c", 6, 5)); + self::register("element_nitrogen", new Element(new BID(Ids::ELEMENT_NITROGEN), "Nitrogen", $instaBreak, "n", 7, 5)); + self::register("element_oxygen", new Element(new BID(Ids::ELEMENT_OXYGEN), "Oxygen", $instaBreak, "o", 8, 5)); + self::register("element_fluorine", new Element(new BID(Ids::ELEMENT_FLUORINE), "Fluorine", $instaBreak, "f", 9, 6)); + self::register("element_neon", new Element(new BID(Ids::ELEMENT_NEON), "Neon", $instaBreak, "ne", 10, 7)); + self::register("element_sodium", new Element(new BID(Ids::ELEMENT_SODIUM), "Sodium", $instaBreak, "na", 11, 0)); + self::register("element_magnesium", new Element(new BID(Ids::ELEMENT_MAGNESIUM), "Magnesium", $instaBreak, "mg", 12, 1)); + self::register("element_aluminum", new Element(new BID(Ids::ELEMENT_ALUMINUM), "Aluminum", $instaBreak, "al", 13, 3)); + self::register("element_silicon", new Element(new BID(Ids::ELEMENT_SILICON), "Silicon", $instaBreak, "si", 14, 4)); + self::register("element_phosphorus", new Element(new BID(Ids::ELEMENT_PHOSPHORUS), "Phosphorus", $instaBreak, "p", 15, 5)); + self::register("element_sulfur", new Element(new BID(Ids::ELEMENT_SULFUR), "Sulfur", $instaBreak, "s", 16, 5)); + self::register("element_chlorine", new Element(new BID(Ids::ELEMENT_CHLORINE), "Chlorine", $instaBreak, "cl", 17, 6)); + self::register("element_argon", new Element(new BID(Ids::ELEMENT_ARGON), "Argon", $instaBreak, "ar", 18, 7)); + self::register("element_potassium", new Element(new BID(Ids::ELEMENT_POTASSIUM), "Potassium", $instaBreak, "k", 19, 0)); + self::register("element_calcium", new Element(new BID(Ids::ELEMENT_CALCIUM), "Calcium", $instaBreak, "ca", 20, 1)); + self::register("element_scandium", new Element(new BID(Ids::ELEMENT_SCANDIUM), "Scandium", $instaBreak, "sc", 21, 2)); + self::register("element_titanium", new Element(new BID(Ids::ELEMENT_TITANIUM), "Titanium", $instaBreak, "ti", 22, 2)); + self::register("element_vanadium", new Element(new BID(Ids::ELEMENT_VANADIUM), "Vanadium", $instaBreak, "v", 23, 2)); + self::register("element_chromium", new Element(new BID(Ids::ELEMENT_CHROMIUM), "Chromium", $instaBreak, "cr", 24, 2)); + self::register("element_manganese", new Element(new BID(Ids::ELEMENT_MANGANESE), "Manganese", $instaBreak, "mn", 25, 2)); + self::register("element_iron", new Element(new BID(Ids::ELEMENT_IRON), "Iron", $instaBreak, "fe", 26, 2)); + self::register("element_cobalt", new Element(new BID(Ids::ELEMENT_COBALT), "Cobalt", $instaBreak, "co", 27, 2)); + self::register("element_nickel", new Element(new BID(Ids::ELEMENT_NICKEL), "Nickel", $instaBreak, "ni", 28, 2)); + self::register("element_copper", new Element(new BID(Ids::ELEMENT_COPPER), "Copper", $instaBreak, "cu", 29, 2)); + self::register("element_zinc", new Element(new BID(Ids::ELEMENT_ZINC), "Zinc", $instaBreak, "zn", 30, 2)); + self::register("element_gallium", new Element(new BID(Ids::ELEMENT_GALLIUM), "Gallium", $instaBreak, "ga", 31, 3)); + self::register("element_germanium", new Element(new BID(Ids::ELEMENT_GERMANIUM), "Germanium", $instaBreak, "ge", 32, 4)); + self::register("element_arsenic", new Element(new BID(Ids::ELEMENT_ARSENIC), "Arsenic", $instaBreak, "as", 33, 4)); + self::register("element_selenium", new Element(new BID(Ids::ELEMENT_SELENIUM), "Selenium", $instaBreak, "se", 34, 5)); + self::register("element_bromine", new Element(new BID(Ids::ELEMENT_BROMINE), "Bromine", $instaBreak, "br", 35, 6)); + self::register("element_krypton", new Element(new BID(Ids::ELEMENT_KRYPTON), "Krypton", $instaBreak, "kr", 36, 7)); + self::register("element_rubidium", new Element(new BID(Ids::ELEMENT_RUBIDIUM), "Rubidium", $instaBreak, "rb", 37, 0)); + self::register("element_strontium", new Element(new BID(Ids::ELEMENT_STRONTIUM), "Strontium", $instaBreak, "sr", 38, 1)); + self::register("element_yttrium", new Element(new BID(Ids::ELEMENT_YTTRIUM), "Yttrium", $instaBreak, "y", 39, 2)); + self::register("element_zirconium", new Element(new BID(Ids::ELEMENT_ZIRCONIUM), "Zirconium", $instaBreak, "zr", 40, 2)); + self::register("element_niobium", new Element(new BID(Ids::ELEMENT_NIOBIUM), "Niobium", $instaBreak, "nb", 41, 2)); + self::register("element_molybdenum", new Element(new BID(Ids::ELEMENT_MOLYBDENUM), "Molybdenum", $instaBreak, "mo", 42, 2)); + self::register("element_technetium", new Element(new BID(Ids::ELEMENT_TECHNETIUM), "Technetium", $instaBreak, "tc", 43, 2)); + self::register("element_ruthenium", new Element(new BID(Ids::ELEMENT_RUTHENIUM), "Ruthenium", $instaBreak, "ru", 44, 2)); + self::register("element_rhodium", new Element(new BID(Ids::ELEMENT_RHODIUM), "Rhodium", $instaBreak, "rh", 45, 2)); + self::register("element_palladium", new Element(new BID(Ids::ELEMENT_PALLADIUM), "Palladium", $instaBreak, "pd", 46, 2)); + self::register("element_silver", new Element(new BID(Ids::ELEMENT_SILVER), "Silver", $instaBreak, "ag", 47, 2)); + self::register("element_cadmium", new Element(new BID(Ids::ELEMENT_CADMIUM), "Cadmium", $instaBreak, "cd", 48, 2)); + self::register("element_indium", new Element(new BID(Ids::ELEMENT_INDIUM), "Indium", $instaBreak, "in", 49, 3)); + self::register("element_tin", new Element(new BID(Ids::ELEMENT_TIN), "Tin", $instaBreak, "sn", 50, 3)); + self::register("element_antimony", new Element(new BID(Ids::ELEMENT_ANTIMONY), "Antimony", $instaBreak, "sb", 51, 4)); + self::register("element_tellurium", new Element(new BID(Ids::ELEMENT_TELLURIUM), "Tellurium", $instaBreak, "te", 52, 4)); + self::register("element_iodine", new Element(new BID(Ids::ELEMENT_IODINE), "Iodine", $instaBreak, "i", 53, 6)); + self::register("element_xenon", new Element(new BID(Ids::ELEMENT_XENON), "Xenon", $instaBreak, "xe", 54, 7)); + self::register("element_cesium", new Element(new BID(Ids::ELEMENT_CESIUM), "Cesium", $instaBreak, "cs", 55, 0)); + self::register("element_barium", new Element(new BID(Ids::ELEMENT_BARIUM), "Barium", $instaBreak, "ba", 56, 1)); + self::register("element_lanthanum", new Element(new BID(Ids::ELEMENT_LANTHANUM), "Lanthanum", $instaBreak, "la", 57, 8)); + self::register("element_cerium", new Element(new BID(Ids::ELEMENT_CERIUM), "Cerium", $instaBreak, "ce", 58, 8)); + self::register("element_praseodymium", new Element(new BID(Ids::ELEMENT_PRASEODYMIUM), "Praseodymium", $instaBreak, "pr", 59, 8)); + self::register("element_neodymium", new Element(new BID(Ids::ELEMENT_NEODYMIUM), "Neodymium", $instaBreak, "nd", 60, 8)); + self::register("element_promethium", new Element(new BID(Ids::ELEMENT_PROMETHIUM), "Promethium", $instaBreak, "pm", 61, 8)); + self::register("element_samarium", new Element(new BID(Ids::ELEMENT_SAMARIUM), "Samarium", $instaBreak, "sm", 62, 8)); + self::register("element_europium", new Element(new BID(Ids::ELEMENT_EUROPIUM), "Europium", $instaBreak, "eu", 63, 8)); + self::register("element_gadolinium", new Element(new BID(Ids::ELEMENT_GADOLINIUM), "Gadolinium", $instaBreak, "gd", 64, 8)); + self::register("element_terbium", new Element(new BID(Ids::ELEMENT_TERBIUM), "Terbium", $instaBreak, "tb", 65, 8)); + self::register("element_dysprosium", new Element(new BID(Ids::ELEMENT_DYSPROSIUM), "Dysprosium", $instaBreak, "dy", 66, 8)); + self::register("element_holmium", new Element(new BID(Ids::ELEMENT_HOLMIUM), "Holmium", $instaBreak, "ho", 67, 8)); + self::register("element_erbium", new Element(new BID(Ids::ELEMENT_ERBIUM), "Erbium", $instaBreak, "er", 68, 8)); + self::register("element_thulium", new Element(new BID(Ids::ELEMENT_THULIUM), "Thulium", $instaBreak, "tm", 69, 8)); + self::register("element_ytterbium", new Element(new BID(Ids::ELEMENT_YTTERBIUM), "Ytterbium", $instaBreak, "yb", 70, 8)); + self::register("element_lutetium", new Element(new BID(Ids::ELEMENT_LUTETIUM), "Lutetium", $instaBreak, "lu", 71, 8)); + self::register("element_hafnium", new Element(new BID(Ids::ELEMENT_HAFNIUM), "Hafnium", $instaBreak, "hf", 72, 2)); + self::register("element_tantalum", new Element(new BID(Ids::ELEMENT_TANTALUM), "Tantalum", $instaBreak, "ta", 73, 2)); + self::register("element_tungsten", new Element(new BID(Ids::ELEMENT_TUNGSTEN), "Tungsten", $instaBreak, "w", 74, 2)); + self::register("element_rhenium", new Element(new BID(Ids::ELEMENT_RHENIUM), "Rhenium", $instaBreak, "re", 75, 2)); + self::register("element_osmium", new Element(new BID(Ids::ELEMENT_OSMIUM), "Osmium", $instaBreak, "os", 76, 2)); + self::register("element_iridium", new Element(new BID(Ids::ELEMENT_IRIDIUM), "Iridium", $instaBreak, "ir", 77, 2)); + self::register("element_platinum", new Element(new BID(Ids::ELEMENT_PLATINUM), "Platinum", $instaBreak, "pt", 78, 2)); + self::register("element_gold", new Element(new BID(Ids::ELEMENT_GOLD), "Gold", $instaBreak, "au", 79, 2)); + self::register("element_mercury", new Element(new BID(Ids::ELEMENT_MERCURY), "Mercury", $instaBreak, "hg", 80, 2)); + self::register("element_thallium", new Element(new BID(Ids::ELEMENT_THALLIUM), "Thallium", $instaBreak, "tl", 81, 3)); + self::register("element_lead", new Element(new BID(Ids::ELEMENT_LEAD), "Lead", $instaBreak, "pb", 82, 3)); + self::register("element_bismuth", new Element(new BID(Ids::ELEMENT_BISMUTH), "Bismuth", $instaBreak, "bi", 83, 3)); + self::register("element_polonium", new Element(new BID(Ids::ELEMENT_POLONIUM), "Polonium", $instaBreak, "po", 84, 4)); + self::register("element_astatine", new Element(new BID(Ids::ELEMENT_ASTATINE), "Astatine", $instaBreak, "at", 85, 6)); + self::register("element_radon", new Element(new BID(Ids::ELEMENT_RADON), "Radon", $instaBreak, "rn", 86, 7)); + self::register("element_francium", new Element(new BID(Ids::ELEMENT_FRANCIUM), "Francium", $instaBreak, "fr", 87, 0)); + self::register("element_radium", new Element(new BID(Ids::ELEMENT_RADIUM), "Radium", $instaBreak, "ra", 88, 1)); + self::register("element_actinium", new Element(new BID(Ids::ELEMENT_ACTINIUM), "Actinium", $instaBreak, "ac", 89, 9)); + self::register("element_thorium", new Element(new BID(Ids::ELEMENT_THORIUM), "Thorium", $instaBreak, "th", 90, 9)); + self::register("element_protactinium", new Element(new BID(Ids::ELEMENT_PROTACTINIUM), "Protactinium", $instaBreak, "pa", 91, 9)); + self::register("element_uranium", new Element(new BID(Ids::ELEMENT_URANIUM), "Uranium", $instaBreak, "u", 92, 9)); + self::register("element_neptunium", new Element(new BID(Ids::ELEMENT_NEPTUNIUM), "Neptunium", $instaBreak, "np", 93, 9)); + self::register("element_plutonium", new Element(new BID(Ids::ELEMENT_PLUTONIUM), "Plutonium", $instaBreak, "pu", 94, 9)); + self::register("element_americium", new Element(new BID(Ids::ELEMENT_AMERICIUM), "Americium", $instaBreak, "am", 95, 9)); + self::register("element_curium", new Element(new BID(Ids::ELEMENT_CURIUM), "Curium", $instaBreak, "cm", 96, 9)); + self::register("element_berkelium", new Element(new BID(Ids::ELEMENT_BERKELIUM), "Berkelium", $instaBreak, "bk", 97, 9)); + self::register("element_californium", new Element(new BID(Ids::ELEMENT_CALIFORNIUM), "Californium", $instaBreak, "cf", 98, 9)); + self::register("element_einsteinium", new Element(new BID(Ids::ELEMENT_EINSTEINIUM), "Einsteinium", $instaBreak, "es", 99, 9)); + self::register("element_fermium", new Element(new BID(Ids::ELEMENT_FERMIUM), "Fermium", $instaBreak, "fm", 100, 9)); + self::register("element_mendelevium", new Element(new BID(Ids::ELEMENT_MENDELEVIUM), "Mendelevium", $instaBreak, "md", 101, 9)); + self::register("element_nobelium", new Element(new BID(Ids::ELEMENT_NOBELIUM), "Nobelium", $instaBreak, "no", 102, 9)); + self::register("element_lawrencium", new Element(new BID(Ids::ELEMENT_LAWRENCIUM), "Lawrencium", $instaBreak, "lr", 103, 9)); + self::register("element_rutherfordium", new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM), "Rutherfordium", $instaBreak, "rf", 104, 2)); + self::register("element_dubnium", new Element(new BID(Ids::ELEMENT_DUBNIUM), "Dubnium", $instaBreak, "db", 105, 2)); + self::register("element_seaborgium", new Element(new BID(Ids::ELEMENT_SEABORGIUM), "Seaborgium", $instaBreak, "sg", 106, 2)); + self::register("element_bohrium", new Element(new BID(Ids::ELEMENT_BOHRIUM), "Bohrium", $instaBreak, "bh", 107, 2)); + self::register("element_hassium", new Element(new BID(Ids::ELEMENT_HASSIUM), "Hassium", $instaBreak, "hs", 108, 2)); + self::register("element_meitnerium", new Element(new BID(Ids::ELEMENT_MEITNERIUM), "Meitnerium", $instaBreak, "mt", 109, 2)); + self::register("element_darmstadtium", new Element(new BID(Ids::ELEMENT_DARMSTADTIUM), "Darmstadtium", $instaBreak, "ds", 110, 2)); + self::register("element_roentgenium", new Element(new BID(Ids::ELEMENT_ROENTGENIUM), "Roentgenium", $instaBreak, "rg", 111, 2)); + self::register("element_copernicium", new Element(new BID(Ids::ELEMENT_COPERNICIUM), "Copernicium", $instaBreak, "cn", 112, 2)); + self::register("element_nihonium", new Element(new BID(Ids::ELEMENT_NIHONIUM), "Nihonium", $instaBreak, "nh", 113, 3)); + self::register("element_flerovium", new Element(new BID(Ids::ELEMENT_FLEROVIUM), "Flerovium", $instaBreak, "fl", 114, 3)); + self::register("element_moscovium", new Element(new BID(Ids::ELEMENT_MOSCOVIUM), "Moscovium", $instaBreak, "mc", 115, 3)); + self::register("element_livermorium", new Element(new BID(Ids::ELEMENT_LIVERMORIUM), "Livermorium", $instaBreak, "lv", 116, 3)); + self::register("element_tennessine", new Element(new BID(Ids::ELEMENT_TENNESSINE), "Tennessine", $instaBreak, "ts", 117, 6)); + self::register("element_oganesson", new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); + } + + private static function registerOres() : void{ + $stoneOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(3.0, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); + self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + self::register("emerald_ore", new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + self::register("gold_ore", new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + self::register("iron_ore", new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); + self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + + $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(4.5, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); + self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + self::register("deepslate_emerald_ore", new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + self::register("deepslate_gold_ore", new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + self::register("deepslate_iron_ore", new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); + self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + + $netherrackOreBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); + self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); + } + + private static function registerBlocksR13() : void{ + self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); + } + + private static function registerBlocksR14() : void{ + self::register("honeycomb", new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new BreakInfo(0.6))); + } + + private static function registerBlocksR16() : void{ + //for some reason, slabs have weird hardness like the legacy ones + $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + + self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0))); + + $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); + self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); + self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); + self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); + + $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); + self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); + self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); + self::register("blackstone_wall", new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); + + //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) + $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); + self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); + self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new BreakInfo(0.5, ToolType::PICKAXE))); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); + self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); + self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); + self::register("chiseled_polished_blackstone", new Opaque(new BID(Ids::CHISELED_POLISHED_BLACKSTONE), "Chiseled Polished Blackstone", $blackstoneBreakInfo)); + + $prefix = fn(string $thing) => "Polished Blackstone Brick" . ($thing !== "" ? " $thing" : ""); + self::register("polished_blackstone_bricks", new Opaque(new BID(Ids::POLISHED_BLACKSTONE_BRICKS), "Polished Blackstone Bricks", $blackstoneBreakInfo)); + self::register("polished_blackstone_brick_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_BRICK_SLAB), "Polished Blackstone Brick", $slabBreakInfo)); + self::register("polished_blackstone_brick_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); + self::register("polished_blackstone_brick_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); + self::register("cracked_polished_blackstone_bricks", new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); + + self::register("soul_torch", new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", BreakInfo::instant())); + self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); + + //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) + self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new BreakInfo(1.0, ToolType::SHOVEL))); + + self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ + public function getLightLevel() : int{ return 15; } + }); + } + + private static function registerBlocksR17() : void{ + //in java this can be acquired using any tool - seems to be a parity issue in bedrock + self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + + self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + + self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); + self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); + + $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + self::register("deepslate", new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); + + //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 + self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0))); + + $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); + self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); + + $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); + self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); + + $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); + + $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_wall", new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); + + self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); + } + + private static function registerMudBlocks() : void{ + $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + + self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); + self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); + self::register("mud_brick_stairs", new Stair(new BID(Ids::MUD_BRICK_STAIRS), "Mud Brick Stairs", $mudBricksBreakInfo)); + self::register("mud_brick_wall", new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); + } + } From 690efb09e39d989b6b9cbf6624dfb88fba5c635d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 00:55:34 +0100 Subject: [PATCH 0304/1858] Fixed ItemTypeIds::FIRST_UNUSED_ITEM_ID --- src/item/ItemTypeIds.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index cc6a678bbc..6db7f7536a 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -294,5 +294,5 @@ final class ItemTypeIds{ public const RAW_GOLD = 20255; public const SPYGLASS = 20256; - public const FIRST_UNUSED_ITEM_ID = 20239; + public const FIRST_UNUSED_ITEM_ID = 20257; } From 2142eb3cc9ab8209cbaa82ee376376b54041b02e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 01:01:05 +0100 Subject: [PATCH 0305/1858] VanillaItems: sort lines alphabetically --- src/item/VanillaItems.php | 205 ++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 106 deletions(-) diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 5a645353f0..bb25c1709f 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -317,29 +317,73 @@ final class VanillaItems{ self::register("air", VanillaBlocks::AIR()->asItem()->setCount(0)); + self::register("acacia_sign", new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + self::register("amethyst_shard", new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); self::register("apple", new Apple(new IID(Ids::APPLE), "Apple")); self::register("arrow", new Arrow(new IID(Ids::ARROW), "Arrow")); - self::register("baked_potato", new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); self::register("bamboo", new Bamboo(new IID(Ids::BAMBOO), "Bamboo")); + self::register("banner", new Banner(new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER())); self::register("beetroot", new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); self::register("beetroot_seeds", new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); self::register("beetroot_soup", new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); + self::register("birch_sign", new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + self::register("blaze_powder", new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); self::register("blaze_rod", new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); + self::register("bleach", new Item(new IID(Ids::BLEACH), "Bleach")); + self::register("bone", new Item(new IID(Ids::BONE), "Bone")); + self::register("bone_meal", new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); self::register("book", new Book(new IID(Ids::BOOK), "Book")); self::register("bow", new Bow(new IID(Ids::BOW), "Bow")); self::register("bowl", new Bowl(new IID(Ids::BOWL), "Bowl")); self::register("bread", new Bread(new IID(Ids::BREAD), "Bread")); + self::register("brick", new Item(new IID(Ids::BRICK), "Brick")); self::register("bucket", new Bucket(new IID(Ids::BUCKET), "Bucket")); self::register("carrot", new Carrot(new IID(Ids::CARROT), "Carrot")); + self::register("charcoal", new Coal(new IID(Ids::CHARCOAL), "Charcoal")); + self::register("chemical_aluminium_oxide", new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); + self::register("chemical_ammonia", new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); + self::register("chemical_barium_sulphate", new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); + self::register("chemical_benzene", new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); + self::register("chemical_boron_trioxide", new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); + self::register("chemical_calcium_bromide", new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); + self::register("chemical_calcium_chloride", new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); + self::register("chemical_cerium_chloride", new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); + self::register("chemical_charcoal", new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); + self::register("chemical_crude_oil", new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); + self::register("chemical_glue", new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); + self::register("chemical_hydrogen_peroxide", new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); + self::register("chemical_hypochlorite", new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); + self::register("chemical_ink", new Item(new IID(Ids::CHEMICAL_INK), "Ink")); + self::register("chemical_iron_sulphide", new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); + self::register("chemical_latex", new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); + self::register("chemical_lithium_hydride", new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); + self::register("chemical_luminol", new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); + self::register("chemical_magnesium_nitrate", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); + self::register("chemical_magnesium_oxide", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); + self::register("chemical_magnesium_salts", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); + self::register("chemical_mercuric_chloride", new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); + self::register("chemical_polyethylene", new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); + self::register("chemical_potassium_chloride", new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); + self::register("chemical_potassium_iodide", new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); + self::register("chemical_rubbish", new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); + self::register("chemical_salt", new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); + self::register("chemical_soap", new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); + self::register("chemical_sodium_acetate", new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); + self::register("chemical_sodium_fluoride", new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); + self::register("chemical_sodium_hydride", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); + self::register("chemical_sodium_hydroxide", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); + self::register("chemical_sodium_hypochlorite", new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + self::register("chemical_sodium_oxide", new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); + self::register("chemical_sugar", new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); + self::register("chemical_sulphate", new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); + self::register("chemical_tungsten_chloride", new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); + self::register("chemical_water", new Item(new IID(Ids::CHEMICAL_WATER), "Water")); self::register("chorus_fruit", new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); + self::register("clay", new Item(new IID(Ids::CLAY), "Clay")); self::register("clock", new Clock(new IID(Ids::CLOCK), "Clock")); self::register("clownfish", new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); self::register("coal", new Coal(new IID(Ids::COAL), "Coal")); - - self::register("coral_fan", new CoralFan(new IID(Ids::CORAL_FAN))); - - self::register("charcoal", new Coal(new IID(Ids::CHARCOAL), "Charcoal")); self::register("cocoa_beans", new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); self::register("compass", new Compass(new IID(Ids::COMPASS), "Compass")); self::register("cooked_chicken", new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); @@ -349,170 +393,119 @@ final class VanillaItems{ self::register("cooked_rabbit", new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); self::register("cooked_salmon", new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); self::register("cookie", new Cookie(new IID(Ids::COOKIE), "Cookie")); - self::register("dried_kelp", new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); - self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); - self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); - self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); - self::register("bone_meal", new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); - self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); - self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); - self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); - self::register("golden_apple", new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); - self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); - self::register("golden_carrot", new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); - self::register("amethyst_shard", new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); - self::register("blaze_powder", new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); - self::register("bleach", new Item(new IID(Ids::BLEACH), "Bleach")); - self::register("bone", new Item(new IID(Ids::BONE), "Bone")); - self::register("brick", new Item(new IID(Ids::BRICK), "Brick")); - self::register("popped_chorus_fruit", new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); - self::register("clay", new Item(new IID(Ids::CLAY), "Clay")); - self::register("chemical_salt", new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); - self::register("chemical_sodium_oxide", new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); - self::register("chemical_sodium_hydroxide", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); - self::register("chemical_magnesium_nitrate", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); - self::register("chemical_iron_sulphide", new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); - self::register("chemical_lithium_hydride", new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); - self::register("chemical_sodium_hydride", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); - self::register("chemical_calcium_bromide", new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); - self::register("chemical_magnesium_oxide", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); - self::register("chemical_sodium_acetate", new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); - self::register("chemical_luminol", new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); - self::register("chemical_charcoal", new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); - self::register("chemical_sugar", new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); - self::register("chemical_aluminium_oxide", new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); - self::register("chemical_boron_trioxide", new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); - self::register("chemical_soap", new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); - self::register("chemical_polyethylene", new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); - self::register("chemical_rubbish", new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); - self::register("chemical_magnesium_salts", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); - self::register("chemical_sulphate", new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); - self::register("chemical_barium_sulphate", new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); - self::register("chemical_potassium_chloride", new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); - self::register("chemical_mercuric_chloride", new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); - self::register("chemical_cerium_chloride", new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); - self::register("chemical_tungsten_chloride", new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - self::register("chemical_calcium_chloride", new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); - self::register("chemical_water", new Item(new IID(Ids::CHEMICAL_WATER), "Water")); - self::register("chemical_glue", new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); - self::register("chemical_hypochlorite", new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); - self::register("chemical_crude_oil", new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); - self::register("chemical_latex", new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); - self::register("chemical_potassium_iodide", new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); - self::register("chemical_sodium_fluoride", new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); - self::register("chemical_benzene", new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); - self::register("chemical_ink", new Item(new IID(Ids::CHEMICAL_INK), "Ink")); - self::register("chemical_hydrogen_peroxide", new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - self::register("chemical_ammonia", new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); - self::register("chemical_sodium_hypochlorite", new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + self::register("copper_ingot", new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); + self::register("coral_fan", new CoralFan(new IID(Ids::CORAL_FAN))); + self::register("crimson_sign", new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); + self::register("dark_oak_sign", new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); self::register("diamond", new Item(new IID(Ids::DIAMOND), "Diamond")); self::register("disc_fragment_5", new Item(new IID(Ids::DISC_FRAGMENT_5), "Disc Fragment (5)")); self::register("dragon_breath", new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); - self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); - self::register("ink_sac", new Item(new IID(Ids::INK_SAC), "Ink Sac")); - self::register("lapis_lazuli", new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + self::register("dried_kelp", new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); + //TODO: add interface to dye-colour objects + self::register("dye", new Dye(new IID(Ids::DYE), "Dye")); self::register("echo_shard", new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); + self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); self::register("emerald", new Item(new IID(Ids::EMERALD), "Emerald")); + self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); + self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); + self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); self::register("feather", new Item(new IID(Ids::FEATHER), "Feather")); self::register("fermented_spider_eye", new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); + self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); self::register("flint", new Item(new IID(Ids::FLINT), "Flint")); + self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); self::register("ghast_tear", new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); + self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); self::register("glistering_melon", new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); + self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); self::register("glowstone_dust", new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); self::register("gold_ingot", new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); self::register("gold_nugget", new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); + self::register("golden_apple", new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); + self::register("golden_carrot", new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); self::register("gunpowder", new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); self::register("heart_of_the_sea", new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); self::register("honeycomb", new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); + self::register("ink_sac", new Item(new IID(Ids::INK_SAC), "Ink Sac")); self::register("iron_ingot", new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); self::register("iron_nugget", new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); + self::register("jungle_sign", new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + self::register("lapis_lazuli", new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + self::register("lava_bucket", new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); self::register("leather", new Item(new IID(Ids::LEATHER), "Leather")); self::register("magma_cream", new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); - self::register("nautilus_shell", new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); - self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); - self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); - self::register("nether_star", new Item(new IID(Ids::NETHER_STAR), "Nether Star")); - self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); - self::register("prismarine_crystals", new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); - self::register("prismarine_shard", new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); - self::register("rabbit_foot", new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); - self::register("rabbit_hide", new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); - self::register("shulker_shell", new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); - self::register("slimeball", new Item(new IID(Ids::SLIMEBALL), "Slimeball")); - self::register("sugar", new Item(new IID(Ids::SUGAR), "Sugar")); - self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); - self::register("wheat", new Item(new IID(Ids::WHEAT), "Wheat")); - self::register("copper_ingot", new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); - self::register("raw_copper", new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); - self::register("raw_iron", new Item(new IID(Ids::RAW_IRON), "Raw Iron")); - self::register("raw_gold", new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); - self::register("phantom_membrane", new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); - - self::register("water_bucket", new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); - self::register("lava_bucket", new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); + self::register("mangrove_sign", new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); self::register("melon", new Melon(new IID(Ids::MELON), "Melon")); self::register("melon_seeds", new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); self::register("milk_bucket", new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); self::register("minecart", new Minecart(new IID(Ids::MINECART), "Minecart")); self::register("mushroom_stew", new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); + self::register("nautilus_shell", new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); + self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); + self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); + self::register("nether_star", new Item(new IID(Ids::NETHER_STAR), "Nether Star")); + self::register("oak_sign", new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); self::register("painting", new PaintingItem(new IID(Ids::PAINTING), "Painting")); + self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); + self::register("phantom_membrane", new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); self::register("poisonous_potato", new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); + self::register("popped_chorus_fruit", new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); self::register("potato", new Potato(new IID(Ids::POTATO), "Potato")); + self::register("potion", new Potion(new IID(Ids::POTION), "Potion")); + self::register("prismarine_crystals", new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); + self::register("prismarine_shard", new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); self::register("pufferfish", new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); self::register("pumpkin_pie", new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); self::register("pumpkin_seeds", new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); + self::register("rabbit_foot", new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); + self::register("rabbit_hide", new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); self::register("rabbit_stew", new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); self::register("raw_beef", new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); self::register("raw_chicken", new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); + self::register("raw_copper", new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); self::register("raw_fish", new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); + self::register("raw_gold", new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); + self::register("raw_iron", new Item(new IID(Ids::RAW_IRON), "Raw Iron")); self::register("raw_mutton", new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); self::register("raw_porkchop", new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); self::register("raw_rabbit", new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); self::register("raw_salmon", new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); + self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); - self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); + self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); - self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); - self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); + self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); self::register("redstone_dust", new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); self::register("rotten_flesh", new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); + self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); self::register("shears", new Shears(new IID(Ids::SHEARS), "Shears")); - self::register("oak_sign", new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - self::register("spruce_sign", new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - self::register("birch_sign", new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - self::register("jungle_sign", new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - self::register("acacia_sign", new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - self::register("dark_oak_sign", new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - self::register("mangrove_sign", new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); - self::register("crimson_sign", new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); - self::register("warped_sign", new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); + self::register("shulker_shell", new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); + self::register("slimeball", new Item(new IID(Ids::SLIMEBALL), "Slimeball")); self::register("snowball", new Snowball(new IID(Ids::SNOWBALL), "Snowball")); self::register("spider_eye", new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); + self::register("splash_potion", new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); + self::register("spruce_sign", new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); self::register("spyglass", new Spyglass(new IID(Ids::SPYGLASS), "Spyglass")); self::register("steak", new Steak(new IID(Ids::STEAK), "Steak")); self::register("stick", new Stick(new IID(Ids::STICK), "Stick")); self::register("string", new StringItem(new IID(Ids::STRING), "String")); + self::register("sugar", new Item(new IID(Ids::SUGAR), "Sugar")); self::register("sweet_berries", new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); self::register("totem", new Totem(new IID(Ids::TOTEM), "Totem of Undying")); + self::register("warped_sign", new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); + self::register("water_bucket", new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); + self::register("wheat", new Item(new IID(Ids::WHEAT), "Wheat")); self::register("wheat_seeds", new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); self::register("writable_book", new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); self::register("written_book", new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); - //TODO: add interface to dye-colour objects - self::register("dye", new Dye(new IID(Ids::DYE), "Dye")); - - self::register("banner", new Banner(new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER())); - - self::register("potion", new Potion(new IID(Ids::POTION), "Potion")); - self::register("splash_potion", new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); - foreach(TreeType::getAll() as $type){ //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency self::register($type->name() . "_boat", new Boat(new IID(match($type){ From da9937933bcc65119623f39179eca17580561030 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 01:06:17 +0100 Subject: [PATCH 0306/1858] Implemented honey bottle --- src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 1 + src/item/HoneyBottle.php | 54 ++++++++++++++++++++++ src/item/StringToItemParser.php | 1 + src/item/VanillaItems.php | 2 + 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/item/HoneyBottle.php diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 7ac959b4de..d4711f8910 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -380,7 +380,7 @@ final class ItemDeserializer{ $this->map(Ids::GUNPOWDER, fn() => Items::GUNPOWDER()); $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); //TODO: minecraft:hoglin_spawn_egg - //TODO: minecraft:honey_bottle + $this->map(Ids::HONEY_BOTTLE, fn() => Items::HONEY_BOTTLE()); $this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB()); $this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem()); //TODO: minecraft:hopper_minecart diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 4d57071c9a..c6998aa1e5 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -405,6 +405,7 @@ final class ItemSerializer{ $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); $this->map(Items::HONEYCOMB(), self::id(Ids::HONEYCOMB)); + $this->map(Items::HONEY_BOTTLE(), self::id(Ids::HONEY_BOTTLE)); $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); diff --git a/src/item/HoneyBottle.php b/src/item/HoneyBottle.php new file mode 100644 index 0000000000..a9f563b46f --- /dev/null +++ b/src/item/HoneyBottle.php @@ -0,0 +1,54 @@ +getEffects()->remove(VanillaEffects::POISON()); + } +} diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c3843a1132..bb94ca31fe 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1226,6 +1226,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING())); $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING())); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); + $result->register("honey_bottle", fn() => Items::HONEY_BOTTLE()); $result->register("honeycomb", fn() => Items::HONEYCOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY())); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index bb25c1709f..ffdab1910a 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -180,6 +180,7 @@ use pocketmine\world\World; * @method static Item GUNPOWDER() * @method static Item HEART_OF_THE_SEA() * @method static Item HONEYCOMB() + * @method static HoneyBottle HONEY_BOTTLE() * @method static Item INK_SAC() * @method static Axe IRON_AXE() * @method static Armor IRON_BOOTS() @@ -425,6 +426,7 @@ final class VanillaItems{ self::register("golden_carrot", new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); self::register("gunpowder", new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); self::register("heart_of_the_sea", new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); + self::register("honey_bottle", new HoneyBottle(new IID(Ids::HONEY_BOTTLE), "Honey Bottle")); self::register("honeycomb", new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); self::register("ink_sac", new Item(new IID(Ids::INK_SAC), "Ink Sac")); self::register("iron_ingot", new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); From 3e4f01d85ed903506f63f8a16471555dba1a75e5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 01:27:30 +0100 Subject: [PATCH 0307/1858] VanillaBlocks: fixed case of some names --- src/block/VanillaBlocks.php | 88 ++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 15de19c182..6f36093dfb 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -802,11 +802,11 @@ final class VanillaBlocks{ self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", BreakInfo::instant())); self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); - self::register("FLOWER_POT", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); + self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - self::register("FURNACE", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("BLAST_FURNACE", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("SMOKER", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $glassBreakInfo = new BreakInfo(0.3); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); @@ -827,7 +827,7 @@ final class VanillaBlocks{ self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); - self::register("HOPPER", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); $updateBlockBreakInfo = new BreakInfo(1.0); @@ -841,8 +841,8 @@ final class VanillaBlocks{ $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); - self::register("ITEM_FRAME", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - self::register("JUKEBOX", new Jukebox(new BID(Ids::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 + self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); + self::register("jukebox", new Jukebox(new BID(Ids::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 self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new BreakInfo(0.4, ToolType::AXE))); $lanternBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); @@ -851,13 +851,13 @@ final class VanillaBlocks{ self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); - self::register("LECTERN", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); - self::register("MONSTER_SPAWNER", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); @@ -874,7 +874,7 @@ final class VanillaBlocks{ self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("NOTE_BLOCK", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); + self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); @@ -914,7 +914,7 @@ final class VanillaBlocks{ self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - self::register("REDSTONE_COMPARATOR", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); self::register("redstone_torch", new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); @@ -927,14 +927,14 @@ final class VanillaBlocks{ self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new BreakInfo(0.3))); self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); - self::register("MOB_HEAD", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); + self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - self::register("SHULKER_BOX", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); self::register( @@ -986,35 +986,35 @@ final class VanillaBlocks{ //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); - self::register("BRICK_SLAB", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); - self::register("COBBLESTONE_SLAB", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); - self::register("FAKE_WOODEN_SLAB", new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo)); - self::register("NETHER_BRICK_SLAB", new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo)); - self::register("QUARTZ_SLAB", new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo)); - self::register("SANDSTONE_SLAB", new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo)); - self::register("SMOOTH_STONE_SLAB", new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo)); - self::register("STONE_BRICK_SLAB", new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo)); - self::register("DARK_PRISMARINE_SLAB", new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo)); - self::register("MOSSY_COBBLESTONE_SLAB", new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo)); - self::register("PRISMARINE_SLAB", new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo)); - self::register("PRISMARINE_BRICKS_SLAB", new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo)); - self::register("PURPUR_SLAB", new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo)); - self::register("RED_NETHER_BRICK_SLAB", new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo)); - self::register("RED_SANDSTONE_SLAB", new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo)); - self::register("SMOOTH_SANDSTONE_SLAB", new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo)); - self::register("ANDESITE_SLAB", new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo)); - self::register("DIORITE_SLAB", new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo)); - self::register("END_STONE_BRICK_SLAB", new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo)); - self::register("GRANITE_SLAB", new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo)); - self::register("POLISHED_ANDESITE_SLAB", new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo)); - self::register("POLISHED_DIORITE_SLAB", new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo)); - self::register("POLISHED_GRANITE_SLAB", new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo)); - self::register("SMOOTH_RED_SANDSTONE_SLAB", new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo)); - self::register("CUT_RED_SANDSTONE_SLAB", new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo)); - self::register("CUT_SANDSTONE_SLAB", new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo)); - self::register("MOSSY_STONE_BRICK_SLAB", new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo)); - self::register("SMOOTH_QUARTZ_SLAB", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); - self::register("STONE_SLAB", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); + self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); + self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); + self::register("fake_wooden_slab", new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo)); + self::register("nether_brick_slab", new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo)); + self::register("quartz_slab", new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo)); + self::register("sandstone_slab", new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo)); + self::register("smooth_stone_slab", new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo)); + self::register("stone_brick_slab", new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo)); + self::register("dark_prismarine_slab", new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo)); + self::register("mossy_cobblestone_slab", new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo)); + self::register("prismarine_slab", new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo)); + self::register("prismarine_bricks_slab", new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo)); + self::register("purpur_slab", new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo)); + self::register("red_nether_brick_slab", new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo)); + self::register("red_sandstone_slab", new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo)); + self::register("smooth_sandstone_slab", new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo)); + self::register("andesite_slab", new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo)); + self::register("diorite_slab", new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo)); + self::register("end_stone_brick_slab", new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo)); + self::register("granite_slab", new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo)); + self::register("polished_andesite_slab", new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo)); + self::register("polished_diorite_slab", new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo)); + self::register("polished_granite_slab", new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo)); + self::register("smooth_red_sandstone_slab", new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo)); + self::register("cut_red_sandstone_slab", new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo)); + self::register("cut_sandstone_slab", new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo)); + self::register("mossy_stone_brick_slab", new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo)); + self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); + self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); @@ -1029,7 +1029,7 @@ final class VanillaBlocks{ self::register("green_torch", new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", BreakInfo::instant())); self::register("torch", new Torch(new BID(Ids::TORCH), "Torch", BreakInfo::instant())); - self::register("TRAPPED_CHEST", new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); + self::register("trapped_chest", new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); @@ -1073,7 +1073,7 @@ final class VanillaBlocks{ self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("DYED_SHULKER_BOX", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); + self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); self::register("stained_clay", new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); From c67e42a723310a8959117dee7dd9b2cb58d3c3bb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 01:44:13 +0100 Subject: [PATCH 0308/1858] Add a hook to enable blocks to react to projectiles colliding with them this enables implementing blocks such as the target block. --- src/block/Block.php | 8 ++++++++ src/entity/projectile/Projectile.php | 1 + 2 files changed, 9 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index cddfe0440d..38abcfb4f3 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -32,6 +32,7 @@ use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; +use pocketmine\entity\projectile\Projectile; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\ItemBlock; @@ -626,6 +627,13 @@ class Block{ return null; } + /** + * Called when a projectile collides with one of this block's collision boxes. + */ + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + //NOOP + } + /** * @return AxisAlignedBB[] */ diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 41c5aa4cf8..74bb5a0a2a 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -306,5 +306,6 @@ abstract class Projectile extends Entity{ */ protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ $this->blockHit = $blockHit->getPosition()->asVector3(); + $blockHit->onProjectileHit($this, $hitResult); } } From 56e6a5564534bf6b0930556b2d1c5521561560c6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 19:44:16 +0100 Subject: [PATCH 0309/1858] LegacyBlockStateMapper: provide a way to add custom upgrade mappings this will be needed by plugin developers to upgrade old custom blocks from PM4. --- .../bedrock/LegacyToStringBidirectionalIdMap.php | 11 +++++++++++ .../bedrock/block/upgrade/LegacyBlockStateMapper.php | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/data/bedrock/LegacyToStringBidirectionalIdMap.php b/src/data/bedrock/LegacyToStringBidirectionalIdMap.php index 2ffe1b9868..e39df6ad95 100644 --- a/src/data/bedrock/LegacyToStringBidirectionalIdMap.php +++ b/src/data/bedrock/LegacyToStringBidirectionalIdMap.php @@ -81,4 +81,15 @@ abstract class LegacyToStringBidirectionalIdMap{ public function getStringToLegacyMap() : array{ return $this->stringToLegacy; } + + public function add(string $string, int $legacy) : void{ + if(isset($this->legacyToString[$legacy])){ + throw new \InvalidArgumentException("Legacy ID $legacy is already mapped to string " . $this->legacyToString[$legacy]); + } + if(isset($this->stringToLegacy[$string])){ + throw new \InvalidArgumentException("String ID $string is already mapped to legacy ID " . $this->stringToLegacy[$string]); + } + $this->legacyToString[$legacy] = $string; + $this->stringToLegacy[$string] = $legacy; + } } diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index 0822fe8173..728ef05b57 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -52,6 +52,18 @@ final class LegacyBlockStateMapper{ return $this->fromStringIdMeta($stringId, $meta); } + /** + * Adds a mapping of legacy block ID and meta to modern blockstate data. This may be needed for upgrading data from + * stored custom blocks from older versions of PocketMine-MP. + */ + public function addMapping(string $stringId, int $intId, int $meta, BlockStateData $stateData) : void{ + if(isset($this->mappingTable[$stringId][$meta])){ + throw new \InvalidArgumentException("A mapping for $stringId:$meta already exists"); + } + $this->mappingTable[$stringId][$meta] = $stateData; + $this->legacyNumericIdMap->add($intId, $stringId); + } + public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{ $mappingTable = []; From 419b21281dcfa822aee42bdbf43a9fc8cc1c9b64 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 19:54:04 +0100 Subject: [PATCH 0310/1858] Fix Copilot mixup --- src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index 728ef05b57..3b32ef15a7 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -61,7 +61,7 @@ final class LegacyBlockStateMapper{ throw new \InvalidArgumentException("A mapping for $stringId:$meta already exists"); } $this->mappingTable[$stringId][$meta] = $stateData; - $this->legacyNumericIdMap->add($intId, $stringId); + $this->legacyNumericIdMap->add($stringId, $intId); } public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{ From d894c5e97f997bf5478cb71500aa8b3767a564bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 20:00:25 +0100 Subject: [PATCH 0311/1858] Drop string ID -> legacy ID conversion tables these are not used for anything anymore --- .../bedrock/LegacyBiomeIdToStringIdMap.php | 2 +- .../bedrock/LegacyEntityIdToStringIdMap.php | 2 +- ...ionalIdMap.php => LegacyToStringIdMap.php} | 24 +------------------ .../upgrade/LegacyBlockIdToStringIdMap.php | 4 ++-- .../upgrade/LegacyItemIdToStringIdMap.php | 4 ++-- 5 files changed, 7 insertions(+), 29 deletions(-) rename src/data/bedrock/{LegacyToStringBidirectionalIdMap.php => LegacyToStringIdMap.php} (76%) diff --git a/src/data/bedrock/LegacyBiomeIdToStringIdMap.php b/src/data/bedrock/LegacyBiomeIdToStringIdMap.php index 974792eba0..b82dcf2f21 100644 --- a/src/data/bedrock/LegacyBiomeIdToStringIdMap.php +++ b/src/data/bedrock/LegacyBiomeIdToStringIdMap.php @@ -26,7 +26,7 @@ namespace pocketmine\data\bedrock; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; -final class LegacyBiomeIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ +final class LegacyBiomeIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; public function __construct(){ diff --git a/src/data/bedrock/LegacyEntityIdToStringIdMap.php b/src/data/bedrock/LegacyEntityIdToStringIdMap.php index 2e3e4aecc0..6ba3b64dea 100644 --- a/src/data/bedrock/LegacyEntityIdToStringIdMap.php +++ b/src/data/bedrock/LegacyEntityIdToStringIdMap.php @@ -26,7 +26,7 @@ namespace pocketmine\data\bedrock; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; -final class LegacyEntityIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ +final class LegacyEntityIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; public function __construct(){ diff --git a/src/data/bedrock/LegacyToStringBidirectionalIdMap.php b/src/data/bedrock/LegacyToStringIdMap.php similarity index 76% rename from src/data/bedrock/LegacyToStringBidirectionalIdMap.php rename to src/data/bedrock/LegacyToStringIdMap.php index e39df6ad95..d808b35dfa 100644 --- a/src/data/bedrock/LegacyToStringBidirectionalIdMap.php +++ b/src/data/bedrock/LegacyToStringIdMap.php @@ -31,18 +31,13 @@ use function is_int; use function is_string; use function json_decode; -abstract class LegacyToStringBidirectionalIdMap{ +abstract class LegacyToStringIdMap{ /** * @var string[] * @phpstan-var array */ private array $legacyToString = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $stringToLegacy = []; public function __construct(string $file){ $stringToLegacyId = json_decode(Utils::assumeNotFalse(file_get_contents($file), "Missing required resource file"), true); @@ -54,7 +49,6 @@ abstract class LegacyToStringBidirectionalIdMap{ throw new AssumptionFailedError("ID map should have string keys and int values"); } $this->legacyToString[$legacyId] = $stringId; - $this->stringToLegacy[$stringId] = $legacyId; } } @@ -62,10 +56,6 @@ abstract class LegacyToStringBidirectionalIdMap{ return $this->legacyToString[$legacy] ?? null; } - public function stringToLegacy(string $string) : ?int{ - return $this->stringToLegacy[$string] ?? null; - } - /** * @return string[] * @phpstan-return array @@ -74,22 +64,10 @@ abstract class LegacyToStringBidirectionalIdMap{ return $this->legacyToString; } - /** - * @return int[] - * @phpstan-return array - */ - public function getStringToLegacyMap() : array{ - return $this->stringToLegacy; - } - public function add(string $string, int $legacy) : void{ if(isset($this->legacyToString[$legacy])){ throw new \InvalidArgumentException("Legacy ID $legacy is already mapped to string " . $this->legacyToString[$legacy]); } - if(isset($this->stringToLegacy[$string])){ - throw new \InvalidArgumentException("String ID $string is already mapped to legacy ID " . $this->stringToLegacy[$string]); - } $this->legacyToString[$legacy] = $string; - $this->stringToLegacy[$string] = $legacy; } } diff --git a/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php index 0ced6361fc..bd0a14c79d 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\data\bedrock\LegacyToStringBidirectionalIdMap; +use pocketmine\data\bedrock\LegacyToStringIdMap; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; -final class LegacyBlockIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ +final class LegacyBlockIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; public function __construct(){ diff --git a/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php index 49b1a22718..62627d7f4a 100644 --- a/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item\upgrade; -use pocketmine\data\bedrock\LegacyToStringBidirectionalIdMap; +use pocketmine\data\bedrock\LegacyToStringIdMap; use pocketmine\utils\SingletonTrait; use Webmozart\PathUtil\Path; -final class LegacyItemIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ +final class LegacyItemIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; public function __construct(){ From 54a773be0c507bad17484ac068f311f751ef7689 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Jul 2022 20:04:16 +0100 Subject: [PATCH 0312/1858] SubChunk::__construct(): rename blocks to blockLayers --- src/world/format/SubChunk.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/world/format/SubChunk.php b/src/world/format/SubChunk.php index 9f1b94beca..d109681600 100644 --- a/src/world/format/SubChunk.php +++ b/src/world/format/SubChunk.php @@ -32,22 +32,17 @@ class SubChunk{ public const COORD_MASK = ~(~0 << self::COORD_BIT_SIZE); public const EDGE_LENGTH = 1 << self::COORD_BIT_SIZE; - /** @var PalettedBlockArray[] */ - private array $blockLayers; - /** * SubChunk constructor. * - * @param PalettedBlockArray[] $blocks + * @param PalettedBlockArray[] $blockLayers */ public function __construct( private int $emptyBlockId, - array $blocks, //TODO: promote this once we can break BC again (needs a name change) + private array $blockLayers, private ?LightArray $skyLight = null, private ?LightArray $blockLight = null - ){ - $this->blockLayers = $blocks; - } + ){} /** * Returns whether this subchunk contains any non-air blocks. From 66d655731a064bb2e6b85b6309b28dd252067b85 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Jul 2022 18:19:46 +0100 Subject: [PATCH 0313/1858] Don't barf on air itemstacks found on disk closes #5143 this is caused by bugs in PM4, where it saved air itemstacks when it wasn't supposed to. These issues are now all addressed in PM5, since ItemSerializer won't accept air itemstacks. --- src/data/bedrock/item/upgrade/ItemDataUpgrader.php | 13 +++++++++++-- src/item/Item.php | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index e01aeb7916..33d4bffc2e 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -116,7 +116,7 @@ final class ItemDataUpgrader{ /** * @throws SavedDataLoadingException */ - private function upgradeItemTypeNbt(CompoundTag $tag) : SavedItemData{ + private function upgradeItemTypeNbt(CompoundTag $tag) : ?SavedItemData{ if(($nameIdTag = $tag->getTag(SavedItemData::TAG_NAME)) instanceof StringTag){ //Bedrock 1.6+ @@ -124,6 +124,11 @@ final class ItemDataUpgrader{ }elseif(($idTag = $tag->getTag(self::TAG_LEGACY_ID)) instanceof ShortTag){ //Bedrock <= 1.5, PM <= 1.12 + if($idTag->getValue() === 0){ + //0 is a special case for air, which is not a valid item ID + //this isn't supposed to be saved, but this appears in some places due to bugs in older versions + return null; + } $rawNameId = $this->legacyIntToStringIdMap->legacyToString($idTag->getValue()); if($rawNameId === null){ throw new SavedDataLoadingException("Legacy item ID " . $idTag->getValue() . " doesn't map to any modern string ID"); @@ -182,8 +187,12 @@ final class ItemDataUpgrader{ /** * @throws SavedDataLoadingException */ - public function upgradeItemStackNbt(CompoundTag $tag) : SavedItemStackData{ + public function upgradeItemStackNbt(CompoundTag $tag) : ?SavedItemStackData{ $savedItemData = $this->upgradeItemTypeNbt($tag); + if($savedItemData === null){ + //air - this isn't supposed to be saved, but older versions of PM saved it in some places + return null; + } try{ //required $count = Binary::unsignByte($tag->getByte(SavedItemStackData::TAG_COUNT)); diff --git a/src/item/Item.php b/src/item/Item.php index 4b3cd5aee6..a1153e738e 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -633,6 +633,9 @@ class Item implements \JsonSerializable{ */ public static function nbtDeserialize(CompoundTag $tag) : Item{ $itemData = GlobalItemDataHandlers::getUpgrader()->upgradeItemStackNbt($tag); + if($itemData === null){ + return VanillaItems::AIR(); + } try{ return GlobalItemDataHandlers::getDeserializer()->deserializeStack($itemData); From 151f2c3f3adb1dede33593cfcb127d5cca14ba70 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Jul 2022 21:51:44 +0100 Subject: [PATCH 0314/1858] BlockStateDictionary: reduce memory footprint by 5 MB by deduplicating blockstate NBT keys and values --- .../mcpe/convert/BlockStateDictionary.php | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 6322f5255e..24d49e34c1 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -25,6 +25,10 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\NbtDataException; +use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; @@ -108,6 +112,33 @@ final class BlockStateDictionary{ */ public function getStates() : array{ return $this->states; } + /** + * @param string[] $keyIndex + * @param (ByteTag|StringTag|IntTag)[][] $valueIndex + * @phpstan-param array $keyIndex + * @phpstan-param array> $valueIndex + */ + private static function deduplicateCompound(CompoundTag $tag, array &$keyIndex, array &$valueIndex) : CompoundTag{ + if($tag->count() === 0){ + return $tag; + } + + $newTag = CompoundTag::create(); + foreach($tag as $key => $value){ + $key = $keyIndex[$key] ??= $key; + + if($value instanceof CompoundTag){ + $value = self::deduplicateCompound($value, $keyIndex, $valueIndex); + }elseif($value instanceof ByteTag || $value instanceof IntTag || $value instanceof StringTag){ + $value = $valueIndex[$value->getType()][$value->getValue()] ??= $value; + } + + $newTag->setTag($key, $value); + } + + return $newTag; + } + /** * @return BlockStateData[] * @phpstan-return list @@ -115,8 +146,13 @@ final class BlockStateDictionary{ * @throws NbtDataException */ public static function loadPaletteFromString(string $blockPaletteContents) : array{ + $keyIndex = []; + $valueIndex = []; + return array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + function(TreeRoot $root) use (&$keyIndex, &$valueIndex) : BlockStateData{ + return BlockStateData::fromNbt(self::deduplicateCompound($root->mustGetCompoundTag(), $keyIndex, $valueIndex)); + }, (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) ); } From ccb3c3cb05e6eee8afa15d7837e256a446244fe7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 16:03:51 +0100 Subject: [PATCH 0315/1858] BlockStateData: use array instead of CompoundTag to store state properties this reduces the footprint of RuntimeBlockMapping by a further 1 MB, as well as simplifying various parts of the code, and solidifying the immutability guarantee of BlockStateData. --- build/generate-block-serializer-consts.php | 2 +- .../CraftingManagerFromDataHelper.php | 5 +- src/data/bedrock/block/BlockStateData.php | 40 +++++-- .../block/CachingBlockStateDeserializer.php | 4 +- .../block/convert/BlockStateReader.php | 11 +- .../block/convert/BlockStateWriter.php | 21 ++-- .../block/upgrade/BlockDataUpgrader.php | 2 +- .../BlockStateUpgradeSchemaBlockRemap.php | 21 +--- .../upgrade/BlockStateUpgradeSchemaUtils.php | 4 +- .../block/upgrade/BlockStateUpgrader.php | 100 +++++++++++------- .../mcpe/convert/BlockStateLookupCache.php | 3 +- .../mcpe/convert/RuntimeBlockMapping.php | 3 +- src/world/format/io/BaseWorldProvider.php | 3 +- src/world/format/io/leveldb/LevelDB.php | 2 +- .../block/upgrade/BlockStateUpgraderTest.php | 17 ++- tools/generate-block-palette-spec.php | 2 +- tools/generate-blockstate-upgrade-schema.php | 18 ++-- 17 files changed, 148 insertions(+), 110 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 9fd944157f..5f82b8e580 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -74,7 +74,7 @@ function generateBlockPaletteReport(array $states) : BlockPaletteReport{ foreach($states as $stateData){ $name = $stateData->getName(); $result->seenTypes[$name] = $name; - foreach($stateData->getStates() as $k => $v){ + foreach(Utils::stringifyKeys($stateData->getStates()) as $k => $v){ $result->seenStateValues[$k][$v->getValue()] = $v->getValue(); asort($result->seenStateValues[$k]); } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index db7afe52ed..21e47a1e83 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -121,10 +121,11 @@ final class CraftingManagerFromDataHelper{ throw new SavedDataLoadingException("Meta should not be specified for blockitems"); } $blockStatesTag = $blockStatesRaw === null ? - CompoundTag::create() : + [] : (new LittleEndianNbtSerializer()) ->read(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => base64_decode($blockStatesRaw, true))) - ->mustGetCompoundTag(); + ->mustGetCompoundTag() + ->getValue(); $blockStateData = new BlockStateData($blockName, $blockStatesTag, BlockStateData::CURRENT_VERSION); }else{ $blockStateData = null; diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index a5d0662982..be0048c6d2 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -25,6 +25,8 @@ namespace pocketmine\data\bedrock\block; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\Tag; +use pocketmine\utils\Utils; use function array_keys; use function count; use function implode; @@ -46,15 +48,27 @@ final class BlockStateData{ public const TAG_STATES = "states"; public const TAG_VERSION = "version"; + /** + * @param Tag[] $states + * @phpstan-param array $states + */ public function __construct( private string $name, - private CompoundTag $states, + private array $states, private int $version ){} public function getName() : string{ return $this->name; } - public function getStates() : CompoundTag{ return $this->states; } + /** + * @return Tag[] + * @phpstan-return array + */ + public function getStates() : array{ return $this->states; } + + public function getState(string $name) : ?Tag{ + return $this->states[$name] ?? null; + } public function getVersion() : int{ return $this->version; } @@ -76,20 +90,30 @@ final class BlockStateData{ throw new BlockStateDeserializeException("Unexpected extra keys: " . implode(", ", array_keys($allKeys))); } - return new self($name, $states, $version); + return new self($name, $states->getValue(), $version); } public function toNbt() : CompoundTag{ + $statesTag = CompoundTag::create(); + foreach(Utils::stringifyKeys($this->states) as $key => $value){ + $statesTag->setTag($key, $value); + } return CompoundTag::create() ->setString(self::TAG_NAME, $this->name) ->setInt(self::TAG_VERSION, $this->version) - ->setTag(self::TAG_STATES, $this->states); + ->setTag(self::TAG_STATES, $statesTag); } public function equals(self $that) : bool{ - return - $this->name === $that->name && - $this->states->equals($that->states) && - $this->version === $that->version; + if($this->name !== $that->name || count($this->states) !== count($that->states)){ + return false; + } + foreach(Utils::stringifyKeys($this->states) as $k => $v){ + if(!isset($that->states[$k]) || !$that->states[$k]->equals($v)){ + return false; + } + } + + return true; } } diff --git a/src/data/bedrock/block/CachingBlockStateDeserializer.php b/src/data/bedrock/block/CachingBlockStateDeserializer.php index 3071a9eb1d..2078b7cc55 100644 --- a/src/data/bedrock/block/CachingBlockStateDeserializer.php +++ b/src/data/bedrock/block/CachingBlockStateDeserializer.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block; +use function count; + final class CachingBlockStateDeserializer implements DelegatingBlockStateDeserializer{ /** @@ -36,7 +38,7 @@ final class CachingBlockStateDeserializer implements DelegatingBlockStateDeseria ){} public function deserialize(BlockStateData $stateData) : int{ - if($stateData->getStates()->count() === 0){ + if(count($stateData->getStates()) === 0){ //if a block has zero properties, we can keep a map of string ID -> internal blockstate ID return $this->simpleCache[$stateData->getName()] ??= $this->realDeserializer->deserialize($stateData); } diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 0d1a0000f1..67da60088b 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -38,6 +38,7 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\Utils; use function get_class; final class BlockStateReader{ @@ -66,7 +67,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBool(string $name) : bool{ $this->usedStates[$name] = true; - $tag = $this->data->getStates()->getTag($name); + $tag = $this->data->getState($name); if($tag instanceof ByteTag){ switch($tag->getValue()){ case 0: return false; @@ -80,7 +81,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readInt(string $name) : int{ $this->usedStates[$name] = true; - $tag = $this->data->getStates()->getTag($name); + $tag = $this->data->getState($name); if($tag instanceof IntTag){ return $tag->getValue(); } @@ -100,7 +101,7 @@ final class BlockStateReader{ public function readString(string $name) : string{ $this->usedStates[$name] = true; //TODO: only allow a specific set of values (strings are primarily used for enums) - $tag = $this->data->getStates()->getTag($name); + $tag = $this->data->getState($name); if($tag instanceof StringTag){ return $tag->getValue(); } @@ -314,7 +315,7 @@ final class BlockStateReader{ * Explicitly mark a property as unused, so it doesn't get flagged as an error when debug mode is enabled */ public function ignored(string $name) : void{ - if($this->data->getStates()->getTag($name) !== null){ + if($this->data->getState($name) !== null){ $this->usedStates[$name] = true; }else{ throw $this->missingOrWrongTypeException($name, null); @@ -332,7 +333,7 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function checkUnreadProperties() : void{ - foreach($this->data->getStates() as $name => $tag){ + foreach(Utils::stringifyKeys($this->data->getStates()) as $name => $tag){ if(!isset($this->usedStates[$name])){ throw new BlockStateDeserializeException("Unread property \"$name\""); } diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 285a52aa17..db305bb3d8 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -35,17 +35,22 @@ use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; +use pocketmine\nbt\tag\Tag; final class BlockStateWriter{ - private CompoundTag $states; + /** + * @var Tag[] + * @phpstan-var array + */ + private array $states = []; public function __construct( private string $id - ){ - $this->states = CompoundTag::create(); - } + ){} public static function create(string $id) : self{ return new self($id); @@ -53,19 +58,19 @@ final class BlockStateWriter{ /** @return $this */ public function writeBool(string $name, bool $value) : self{ - $this->states->setByte($name, $value ? 1 : 0); + $this->states[$name] = new ByteTag($value ? 1 : 0); return $this; } /** @return $this */ public function writeInt(string $name, int $value) : self{ - $this->states->setInt($name, $value); + $this->states[$name] = new IntTag($value); return $this; } /** @return $this */ public function writeString(string $name, string $value) : self{ - $this->states->setString($name, $value); + $this->states[$name] = new StringTag($value); return $this; } diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index a10c30d7e1..785a36af8a 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -51,7 +51,7 @@ final class BlockDataUpgrader{ $blockStateData = $this->upgradeStringIdMeta($id, $data); if($blockStateData === null){ //unknown block, invalid ID - $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); } }else{ //Modern (post-1.13) blockstate diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php index f3ef4ec928..a0659b40ae 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -23,15 +23,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; -use pocketmine\utils\Utils; final class BlockStateUpgradeSchemaBlockRemap{ - - public CompoundTag $oldState; - public CompoundTag $newState; - /** * @param Tag[] $oldState * @param Tag[] $newState @@ -39,17 +33,8 @@ final class BlockStateUpgradeSchemaBlockRemap{ * @phpstan-param array $newState */ public function __construct( - array $oldState, + public array $oldState, public string $newName, - array $newState - ){ - $this->oldState = CompoundTag::create(); - $this->newState = CompoundTag::create(); - foreach(Utils::stringifyKeys($oldState) as $k => $v){ - $this->oldState->setTag($k, $v); - } - foreach(Utils::stringifyKeys($newState) as $k => $v){ - $this->newState->setTag($k, $v); - } - } + public array $newState + ){} } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index e6fe5c8dca..923afde762 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -240,9 +240,9 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ foreach($remaps as $remap){ $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( - array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState->getValue()), + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), $remap->newName, - array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState->getValue()), + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), ); } } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 89a6d7b855..637674a265 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -24,9 +24,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; +use function count; use function ksort; use const SORT_NUMERIC; @@ -68,12 +68,20 @@ final class BlockStateUpgrader{ } foreach($schemas as $schema){ $oldName = $blockStateData->getName(); + $oldState = $blockStateData->getStates(); if(isset($schema->remappedStates[$oldName])){ foreach($schema->remappedStates[$oldName] as $remap){ - if($blockStateData->getStates()->equals($remap->oldState)){ - $blockStateData = new BlockStateData($remap->newName, clone $remap->newState, $resultVersion); - continue 2; + if(count($oldState) !== count($remap->oldState)){ + continue; //try next state } + foreach(Utils::stringifyKeys($oldState) as $k => $v){ + if(!isset($remap->oldState[$k]) || !$remap->oldState[$k]->equals($v)){ + continue 2; //try next state + } + } + + $blockStateData = new BlockStateData($remap->newName, $remap->newState, $resultVersion); + continue 2; //try next schema } } $newName = $schema->renamedIds[$oldName] ?? null; @@ -96,42 +104,44 @@ final class BlockStateUpgrader{ return $blockStateData; } - private function cloneIfNeeded(CompoundTag $states, int &$stateChanges) : CompoundTag{ - if($stateChanges === 0){ - $states = clone $states; + /** + * @param Tag[] $states + * @phpstan-param array $states + * + * @return Tag[] + * @phpstan-return array + */ + private function applyPropertyAdded(BlockStateUpgradeSchema $schema, string $oldName, array $states, int &$stateChanges) : array{ + if(isset($schema->addedProperties[$oldName])){ + foreach(Utils::stringifyKeys($schema->addedProperties[$oldName]) as $propertyName => $value){ + if(!isset($states[$propertyName])){ + $stateChanges++; + $states[$propertyName] = $value; + } + } } - $stateChanges++; return $states; } - private function applyPropertyAdded(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ - $newStates = $states; - if(isset($schema->addedProperties[$oldName])){ - foreach(Utils::stringifyKeys($schema->addedProperties[$oldName]) as $propertyName => $value){ - $oldValue = $states->getTag($propertyName); - if($oldValue === null){ - $newStates = $this->cloneIfNeeded($newStates, $stateChanges); - $newStates->setTag($propertyName, $value); - } - } - } - - return $newStates; - } - - private function applyPropertyRemoved(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ - $newStates = $states; + /** + * @param Tag[] $states + * @phpstan-param array $states + * + * @return Tag[] + * @phpstan-return array + */ + private function applyPropertyRemoved(BlockStateUpgradeSchema $schema, string $oldName, array $states, int &$stateChanges) : array{ if(isset($schema->removedProperties[$oldName])){ foreach($schema->removedProperties[$oldName] as $propertyName){ - if($states->getTag($propertyName) !== null){ - $newStates = $this->cloneIfNeeded($newStates, $stateChanges); - $newStates->removeTag($propertyName); + if(isset($states[$propertyName])){ + $stateChanges++; + unset($states[$propertyName]); } } } - return $newStates; + return $states; } private function locateNewPropertyValue(BlockStateUpgradeSchema $schema, string $oldName, string $oldPropertyName, Tag $oldValue) : Tag{ @@ -146,18 +156,25 @@ final class BlockStateUpgrader{ return $oldValue; } - private function applyPropertyRenamedOrValueChanged(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + /** + * @param Tag[] $states + * @phpstan-param array $states + * + * @return Tag[] + * @phpstan-return array + */ + private function applyPropertyRenamedOrValueChanged(BlockStateUpgradeSchema $schema, string $oldName, array $states, int &$stateChanges) : array{ if(isset($schema->renamedProperties[$oldName])){ foreach(Utils::stringifyKeys($schema->renamedProperties[$oldName]) as $oldPropertyName => $newPropertyName){ - $oldValue = $states->getTag($oldPropertyName); + $oldValue = $states[$oldPropertyName] ?? null; if($oldValue !== null){ - $states = $this->cloneIfNeeded($states, $stateChanges); - $states->removeTag($oldPropertyName); + $stateChanges++; + unset($states[$oldPropertyName]); //If a value remap is needed, we need to do it here, since we won't be able to locate the property //after it's been renamed - value remaps are always indexed by old property name for the sake of //being able to do changes in any order. - $states->setTag($newPropertyName, $this->locateNewPropertyValue($schema, $oldName, $oldPropertyName, $oldValue)); + $states[$newPropertyName] = $this->locateNewPropertyValue($schema, $oldName, $oldPropertyName, $oldValue); } } } @@ -165,15 +182,22 @@ final class BlockStateUpgrader{ return $states; } - private function applyPropertyValueChanged(BlockStateUpgradeSchema $schema, string $oldName, CompoundTag $states, int &$stateChanges) : CompoundTag{ + /** + * @param Tag[] $states + * @phpstan-param array $states + * + * @return Tag[] + * @phpstan-return array + */ + private function applyPropertyValueChanged(BlockStateUpgradeSchema $schema, string $oldName, array $states, int &$stateChanges) : array{ if(isset($schema->remappedPropertyValues[$oldName])){ foreach(Utils::stringifyKeys($schema->remappedPropertyValues[$oldName]) as $oldPropertyName => $remappedValues){ - $oldValue = $states->getTag($oldPropertyName); + $oldValue = $states[$oldPropertyName] ?? null; if($oldValue !== null){ $newValue = $this->locateNewPropertyValue($schema, $oldName, $oldPropertyName, $oldValue); if($newValue !== $oldValue){ - $states = $this->cloneIfNeeded($states, $stateChanges); - $states->setTag($oldPropertyName, $newValue); + $stateChanges++; + $states[$oldPropertyName] = $newValue; } } } diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index 2bc5744fb3..40b08e37d1 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -74,9 +74,8 @@ final class BlockStateLookupCache{ } if(isset($this->nameToNetworkIdsLookup[$name])){ - $states = $data->getStates(); foreach($this->nameToNetworkIdsLookup[$name] as $stateId => $stateNbt){ - if($stateNbt->getStates()->equals($states)){ + if($stateNbt->equals($data)){ return $stateId; } } diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 9c9402d319..e0acc24301 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -27,7 +27,6 @@ use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\block\BlockTypeNames; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; @@ -67,7 +66,7 @@ final class RuntimeBlockMapping{ private BlockStateDictionary $blockStateDictionary, private BlockStateSerializer $blockStateSerializer ){ - $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData($this->fallbackStateData) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); } diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index 23d1ba2691..dc9f296fb7 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -25,7 +25,6 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockTypeNames; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\format\PalettedBlockArray; @@ -63,7 +62,7 @@ abstract class BaseWorldProvider implements WorldProvider{ $newStateData = $blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); if($newStateData === null){ //TODO: remember data for unknown states so we can implement them later - $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); + $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); } $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 421f657b3a..92e2fa8533 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -180,7 +180,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: remember data for unknown states so we can implement them later //TODO: this is slow; we need to cache this //TODO: log this - $palette[] = $blockStateDeserializer->deserialize(new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION)); + $palette[] = $blockStateDeserializer->deserialize(new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION)); } }catch(NbtException | BlockStateDeserializeException $e){ throw new CorruptedChunkException("Invalid blockstate NBT at offset $i in paletted storage: " . $e->getMessage(), 0, $e); diff --git a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php index 14d3994e33..86ba0f67b0 100644 --- a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\block\upgrade; use PHPUnit\Framework\TestCase; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use const PHP_INT_MAX; @@ -81,13 +80,13 @@ class BlockStateUpgraderTest extends TestCase{ } private function getEmptyPreimage() : BlockStateData{ - return new BlockStateData(self::TEST_BLOCK, CompoundTag::create(), self::TEST_VERSION); + return new BlockStateData(self::TEST_BLOCK, [], self::TEST_VERSION); } private function getPreimageOneProperty(string $propertyName, int $value) : BlockStateData{ return new BlockStateData( self::TEST_BLOCK, - CompoundTag::create()->setInt($propertyName, $value), + [$propertyName => new IntTag($value)], self::TEST_VERSION ); } @@ -98,7 +97,7 @@ class BlockStateUpgraderTest extends TestCase{ $getStateData = fn() => $this->getEmptyPreimage(); $upgradedStateData = $this->upgrade($getStateData(), $getStateData); - self::assertSame(self::TEST_PROPERTY_VALUE_1, $upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)?->getValue()); + self::assertSame(self::TEST_PROPERTY_VALUE_1, $upgradedStateData->getState(self::TEST_PROPERTY)?->getValue()); } public function testAddPropertyAlreadyExists() : void{ @@ -132,7 +131,7 @@ class BlockStateUpgraderTest extends TestCase{ $upgradedStateData = $this->upgrade($getStateData(), $getStateData); - self::assertNull($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)); + self::assertNull($upgradedStateData->getState(self::TEST_PROPERTY)); } private function prepareRenamePropertySchema(BlockStateUpgradeSchema $schema) : void{ @@ -157,7 +156,7 @@ class BlockStateUpgraderTest extends TestCase{ $upgradedStateData = $this->upgrade($getStateData(), $getStateData); - self::assertSame($valueAfter, $upgradedStateData->getStates()->getTag(self::TEST_PROPERTY_2)?->getValue()); + self::assertSame($valueAfter, $upgradedStateData->getState(self::TEST_PROPERTY_2)?->getValue()); } private function prepareRemapPropertyValueSchema(BlockStateUpgradeSchema $schema) : void{ @@ -193,7 +192,7 @@ class BlockStateUpgraderTest extends TestCase{ $upgradedStateData = $this->upgrade($getStateData(), $getStateData); - self::assertSame($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY)?->getValue(), $valueAfter); + self::assertSame($upgradedStateData->getState(self::TEST_PROPERTY)?->getValue(), $valueAfter); } /** @@ -207,7 +206,7 @@ class BlockStateUpgraderTest extends TestCase{ $upgradedStateData = $this->upgrade($getStateData(), $getStateData); - self::assertSame($upgradedStateData->getStates()->getTag(self::TEST_PROPERTY_2)?->getValue(), $valueAfter); + self::assertSame($upgradedStateData->getState(self::TEST_PROPERTY_2)?->getValue(), $valueAfter); } /** @@ -228,7 +227,7 @@ class BlockStateUpgraderTest extends TestCase{ $getStateData = fn() => new BlockStateData( self::TEST_BLOCK, - CompoundTag::create(), + [], $stateVersion ); diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index b41c1334a0..2bcee5a13c 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -62,7 +62,7 @@ $reportMap = []; foreach($states as $state){ $name = $state->getName(); $reportMap[$name] ??= []; - foreach($state->getStates() as $propertyName => $value){ + foreach(Utils::stringifyKeys($state->getStates()) as $propertyName => $value){ if($value instanceof IntTag || $value instanceof StringTag){ $rawValue = $value->getValue(); }elseif($value instanceof ByteTag){ diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 03b768323a..db13f00e59 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -97,8 +97,8 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad $propertyRemoved = []; $propertyAdded = []; - foreach($oldStates as $propertyName => $oldProperty){ - $newProperty = $newStates->getTag($propertyName); + foreach(Utils::stringifyKeys($oldStates) as $propertyName => $oldProperty){ + $newProperty = $new->getState($propertyName); if($newProperty === null){ $propertyRemoved[$propertyName] = $oldProperty; }elseif(!$newProperty->equals($oldProperty)){ @@ -112,8 +112,8 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad } } - foreach($newStates as $propertyName => $value){ - if($oldStates->getTag($propertyName) === null){ + foreach(Utils::stringifyKeys($newStates) as $propertyName => $value){ + if($old->getState($propertyName) === null){ $propertyAdded[$propertyName] = $value; } } @@ -179,9 +179,9 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad } }else{ $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( - $oldStates->getValue(), + $oldStates, $new->getName(), - $newStates->getValue() + $newStates ); \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; } @@ -231,11 +231,11 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad }else{ //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap foreach($blockStateMappings as $mapping){ - if($mapping->old->getName() !== $mapping->new->getName() || !$mapping->old->getStates()->equals($mapping->new->getStates())){ + if(!$mapping->old->equals($mapping->new)){ $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $mapping->old->getStates()->getValue(), + $mapping->old->getStates(), $mapping->new->getName(), - $mapping->new->getStates()->getValue() + $mapping->new->getStates() ); } } From 9ffee7cfc3b5033756c3d9b8be24e3fce853722b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 16:30:59 +0100 Subject: [PATCH 0316/1858] always the CS ... --- src/crafting/CraftingManagerFromDataHelper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 21e47a1e83..a5680defd1 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -39,7 +39,6 @@ use pocketmine\data\SavedDataLoadingException; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\item\Item; use pocketmine\nbt\LittleEndianNbtSerializer; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; From 99ff78a8a56405a3ffe191625b584c25381662e2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 18:57:32 +0100 Subject: [PATCH 0317/1858] Updated BedrockData --- composer.lock | 8 +- .../CraftingManagerFromDataHelper.php | 87 +++++++++---------- src/crafting/json/RecipeIngredientData.php | 6 +- 3 files changed, 46 insertions(+), 55 deletions(-) diff --git a/composer.lock b/composer.lock index 4e2daae37f..be11714203 100644 --- a/composer.lock +++ b/composer.lock @@ -280,12 +280,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "01948a627448395d9946c2e6a5e8332a8456eaa0" + "reference": "301bf7ebe55920e2885e04dd85d8043307aa94c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/01948a627448395d9946c2e6a5e8332a8456eaa0", - "reference": "01948a627448395d9946c2e6a5e8332a8456eaa0", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/301bf7ebe55920e2885e04dd85d8043307aa94c0", + "reference": "301bf7ebe55920e2885e04dd85d8043307aa94c0", "shasum": "" }, "type": "library", @@ -298,7 +298,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-07-04T16:59:39+00:00" + "time": "2022-07-09T17:43:03+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index a5680defd1..74fe74a7f2 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -39,8 +39,6 @@ use pocketmine\data\SavedDataLoadingException; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\item\Item; use pocketmine\nbt\LittleEndianNbtSerializer; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; use Webmozart\PathUtil\Path; @@ -53,39 +51,6 @@ use function json_decode; final class CraftingManagerFromDataHelper{ - private static function deserializeItemStackFromNameMeta(string $name, int $meta) : ?Item{ - $blockName = BlockItemIdMap::getInstance()->lookupBlockId($name); - if($blockName !== null){ - $blockStateDictionary = RuntimeBlockMapping::getInstance()->getBlockStateDictionary(); - $blockRuntimeId = $blockStateDictionary->lookupStateIdFromIdMeta($name, $meta === RecipeIngredientData::WILDCARD_META_VALUE ? 0 : $meta); - if($blockRuntimeId === null){ - throw new SavedDataLoadingException("$blockName with meta $meta doesn't map to any known blockstate"); - } - $blockStateData = $blockStateDictionary->getDataFromStateId($blockRuntimeId); - if($blockStateData === null){ - throw new AssumptionFailedError("We just looked up the runtime ID for this state, so it can't possibly be null"); - } - }else{ - $blockStateData = null; - } - - //TODO: for wildcards, we only need a way to check if the item serializer recognizes the ID; we don't need to - //deserialize the whole itemstack, which might give bogus results anyway if meta 0 isn't recognized - $itemTypeData = new SavedItemData( - $name, - $meta === RecipeIngredientData::WILDCARD_META_VALUE ? 0 : $meta, - $blockStateData, - null - ); - - try{ - return GlobalItemDataHandlers::getDeserializer()->deserializeType($itemTypeData); - }catch(ItemTypeDeserializeException){ - //probably unknown item - return null; - } - } - private static function deserializeIngredient(RecipeIngredientData $data) : ?RecipeIngredient{ if(isset($data->count) && $data->count !== 1){ //every case we've seen so far where this isn't the case, it's been a bug and the count was ignored anyway @@ -93,26 +58,50 @@ final class CraftingManagerFromDataHelper{ throw new SavedDataLoadingException("Recipe inputs should have a count of exactly 1"); } - $itemStack = self::deserializeItemStackFromNameMeta($data->name, $data->meta); + $meta = $data->meta ?? null; + if($meta === RecipeIngredientData::WILDCARD_META_VALUE){ + //this could be an unimplemented item, but it doesn't really matter, since the item shouldn't be able to + //be obtained anyway - filtering unknown items is only really important for outputs, to prevent players + //obtaining them + return new MetaWildcardRecipeIngredient($data->name); + } + + $itemStack = self::deserializeItemStackFromFields( + $data->name, + $meta, + $data->count ?? null, + $data->block_states ?? null, + null, + [], + [] + ); if($itemStack === null){ //probably unknown item return null; } - return $data->meta === RecipeIngredientData::WILDCARD_META_VALUE ? - new MetaWildcardRecipeIngredient($data->name) : - new ExactRecipeIngredient($itemStack); + return new ExactRecipeIngredient($itemStack); } public static function deserializeItemStack(ItemStackData $data) : ?Item{ //count, name, block_name, block_states, meta, nbt, can_place_on, can_destroy - $name = $data->name; - $meta = $data->meta ?? 0; - $count = $data->count ?? 1; + return self::deserializeItemStackFromFields( + $data->name, + $data->meta ?? null, + $data->count ?? null, + $data->block_states ?? null, + $data->nbt ?? null, + $data->can_place_on ?? [], + $data->can_destroy ?? [] + ); + } - $blockStatesRaw = $data->block_states ?? null; - $nbtRaw = $data->nbt ?? null; - $canPlaceOn = $data->can_place_on ?? []; - $canDestroy = $data->can_destroy ?? []; + /** + * @param string[] $canPlaceOn + * @param string[] $canDestroy + */ + private static function deserializeItemStackFromFields(string $name, ?int $meta, ?int $count, ?string $blockStatesRaw, ?string $nbtRaw, array $canPlaceOn, array $canDestroy) : ?Item{ + $meta ??= 0; + $count ??= 1; $blockName = BlockItemIdMap::getInstance()->lookupBlockId($name); if($blockName !== null){ @@ -325,7 +314,11 @@ final class CraftingManagerFromDataHelper{ $inputId = $recipe->input_item_name; $outputId = $recipe->output_item_name; - if(self::deserializeItemStackFromNameMeta($inputId, 0) === null || self::deserializeItemStackFromNameMeta($outputId, 0) === null){ + //TODO: this is a really awful way to just check if an ID is recognized ... + if( + self::deserializeItemStackFromFields($inputId, null, null, null, null, [], []) === null || + self::deserializeItemStackFromFields($outputId, null, null, null, null, [], []) === null + ){ //unknown item continue; } diff --git a/src/crafting/json/RecipeIngredientData.php b/src/crafting/json/RecipeIngredientData.php index ece2a6f627..f0d4ceb0c3 100644 --- a/src/crafting/json/RecipeIngredientData.php +++ b/src/crafting/json/RecipeIngredientData.php @@ -28,13 +28,11 @@ final class RecipeIngredientData{ /** @required */ public string $name; - /** @required */ public int $meta; - + public string $block_states; public int $count; - public function __construct(string $name, int $meta){ + public function __construct(string $name){ $this->name = $name; - $this->meta = $meta; } } From ad7528e3f30061248477b103696ff851bdac0d08 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 20:00:10 +0100 Subject: [PATCH 0318/1858] Added warped wart blocks, gilded blackstone and crying obsidian --- src/block/BlockTypeIds.php | 5 ++- src/block/GildedBlackstone.php | 40 +++++++++++++++++++ src/block/VanillaBlocks.php | 10 +++++ .../BlockObjectToBlockStateSerializer.php | 3 ++ .../BlockStateToBlockObjectDeserializer.php | 3 ++ src/item/StringToItemParser.php | 3 ++ .../block_factory_consistency_check.json | 2 +- 7 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/block/GildedBlackstone.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 567f10736b..d29ed8ce76 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -676,6 +676,9 @@ final class BlockTypeIds{ public const MUD_BRICK_STAIRS = 10649; public const MUD_BRICK_WALL = 10650; public const PACKED_MUD = 10651; + public const WARPED_WART_BLOCK = 10652; + public const CRYING_OBSIDIAN = 10653; + public const GILDED_BLACKSTONE = 10654; - public const FIRST_UNUSED_BLOCK_ID = 10652; + public const FIRST_UNUSED_BLOCK_ID = 10655; } diff --git a/src/block/GildedBlackstone.php b/src/block/GildedBlackstone.php new file mode 100644 index 0000000000..434bddaaa7 --- /dev/null +++ b/src/block/GildedBlackstone.php @@ -0,0 +1,40 @@ +setCount(mt_rand(2, 5))]; + } + + return parent::getDropsForCompatibleTool($item); + } + + public function isAffectedBySilkTouch() : bool{ return true; } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 6f36093dfb..e8792787e3 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -188,6 +188,7 @@ use function mb_strtolower; * @method static Wood CRIMSON_STEM() * @method static WoodenTrapdoor CRIMSON_TRAPDOOR() * @method static WallSign CRIMSON_WALL_SIGN() + * @method static Opaque CRYING_OBSIDIAN() * @method static Opaque CUT_RED_SANDSTONE() * @method static Slab CUT_RED_SANDSTONE_SLAB() * @method static Opaque CUT_SANDSTONE() @@ -381,6 +382,7 @@ use function mb_strtolower; * @method static FlowerPot FLOWER_POT() * @method static FrostedIce FROSTED_ICE() * @method static Furnace FURNACE() + * @method static GildedBlackstone GILDED_BLACKSTONE() * @method static Glass GLASS() * @method static GlassPane GLASS_PANE() * @method static GlazedTerracotta GLAZED_TERRACOTTA() @@ -679,6 +681,7 @@ use function mb_strtolower; * @method static Wood WARPED_STEM() * @method static WoodenTrapdoor WARPED_TRAPDOOR() * @method static WallSign WARPED_WALL_SIGN() + * @method static Opaque WARPED_WART_BLOCK() * @method static Water WATER() * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() @@ -1367,6 +1370,8 @@ final class VanillaBlocks{ self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); self::register("blackstone_wall", new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); + self::register("gilded_blackstone", new GildedBlackstone(new BID(Ids::GILDED_BLACKSTONE), "Gilded Blackstone", $blackstoneBreakInfo)); + //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); @@ -1393,6 +1398,11 @@ final class VanillaBlocks{ self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ public function getLightLevel() : int{ return 15; } }); + + self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new BreakInfo(1.0, ToolType::HOE))); + self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new BreakInfo(35.0 /* 50 in Java */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel())) extends Opaque{ + public function getLightLevel() : int{ return 10;} + }); } private static function registerBlocksR17() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 2b9fafa8dc..87770e2ea0 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -472,6 +472,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); $this->map(Blocks::CRIMSON_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::CRIMSON_WALL_SIGN))); + $this->mapSimple(Blocks::CRYING_OBSIDIAN(), Ids::CRYING_OBSIDIAN); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); @@ -707,6 +708,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::AGE, $block->getAge()); }); $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); + $this->mapSimple(Blocks::GILDED_BLACKSTONE(), Ids::GILDED_BLACKSTONE); $this->mapSimple(Blocks::GLASS(), Ids::GLASS); $this->mapSimple(Blocks::GLASS_PANE(), Ids::GLASS_PANE); $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ @@ -1232,6 +1234,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); $this->map(Blocks::WARPED_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WARPED_WALL_SIGN))); + $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8ab71c3179..3584a7b022 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -314,6 +314,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in)); + $this->map(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); @@ -578,6 +579,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); + $this->map(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); $this->map(Ids::GLASS, fn() => Blocks::GLASS()); $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); @@ -1187,6 +1189,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), false, $in)); $this->map(Ids::WARPED_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::WARPED_TRAPDOOR(), $in)); $this->map(Ids::WARPED_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::WARPED_WALL_SIGN(), $in)); + $this->map(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->map(Ids::WEB, fn() => Blocks::COBWEB()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index bb94ca31fe..af5cf5daa4 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -239,6 +239,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("crimson_stairs", fn() => Blocks::CRIMSON_STAIRS()); $result->registerBlock("crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(false)); $result->registerBlock("crimson_trapdoor", fn() => Blocks::CRIMSON_TRAPDOOR()); + $result->registerBlock("crying_obsidian", fn() => Blocks::CRYING_OBSIDIAN()); $result->registerBlock("cut_red_sandstone", fn() => Blocks::CUT_RED_SANDSTONE()); $result->registerBlock("cut_red_sandstone_slab", fn() => Blocks::CUT_RED_SANDSTONE_SLAB()); $result->registerBlock("cut_sandstone", fn() => Blocks::CUT_SANDSTONE()); @@ -593,6 +594,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME()); $result->registerBlock("frosted_ice", fn() => Blocks::FROSTED_ICE()); $result->registerBlock("furnace", fn() => Blocks::FURNACE()); + $result->registerBlock("gilded_blackstone", fn() => Blocks::GILDED_BLACKSTONE()); $result->registerBlock("glass", fn() => Blocks::GLASS()); $result->registerBlock("glass_pane", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glass_panel", fn() => Blocks::GLASS_PANE()); @@ -1031,6 +1033,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("warped_stairs", fn() => Blocks::WARPED_STAIRS()); $result->registerBlock("warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(false)); $result->registerBlock("warped_trapdoor", fn() => Blocks::WARPED_TRAPDOOR()); + $result->registerBlock("warped_wart_block", fn() => Blocks::WARPED_WART_BLOCK()); $result->registerBlock("water", fn() => Blocks::WATER()); $result->registerBlock("water_lily", fn() => Blocks::LILY_PAD()); $result->registerBlock("waterlily", fn() => Blocks::LILY_PAD()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 258594e7ce..a642beb39c 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 5e70ae206682cce16223417df554bc913c2bdb15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 20:18:22 +0100 Subject: [PATCH 0319/1858] Added lightning rods --- src/block/BlockTypeIds.php | 3 +- src/block/LightningRod.php | 55 +++++++++++++++++++ src/block/VanillaBlocks.php | 5 ++ .../BlockObjectToBlockStateSerializer.php | 5 ++ .../BlockStateToBlockObjectDeserializer.php | 4 ++ src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/block/LightningRod.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index d29ed8ce76..34d0716d37 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -679,6 +679,7 @@ final class BlockTypeIds{ public const WARPED_WART_BLOCK = 10652; public const CRYING_OBSIDIAN = 10653; public const GILDED_BLACKSTONE = 10654; + public const LIGHTNING_ROD = 10655; - public const FIRST_UNUSED_BLOCK_ID = 10655; + public const FIRST_UNUSED_BLOCK_ID = 10656; } diff --git a/src/block/LightningRod.php b/src/block/LightningRod.php new file mode 100644 index 0000000000..a0dd50542c --- /dev/null +++ b/src/block/LightningRod.php @@ -0,0 +1,55 @@ +facing); + + $result = AxisAlignedBB::one(); + foreach([Axis::X, Axis::Y, Axis::Z] as $axis){ + if($axis !== $myAxis){ + $result->squash($axis, 6 / 16); + } + } + + return [$result]; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + $this->facing = $face; + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index e8792787e3..a3d35552c2 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -447,6 +447,7 @@ use function mb_strtolower; * @method static Opaque LEGACY_STONECUTTER() * @method static Lever LEVER() * @method static Light LIGHT() + * @method static LightningRod LIGHTNING_ROD() * @method static DoublePlant LILAC() * @method static Flower LILY_OF_THE_VALLEY() * @method static WaterLily LILY_PAD() @@ -1449,6 +1450,10 @@ final class VanillaBlocks{ self::register("polished_deepslate_wall", new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); + + //blast resistance should be 30 if we were matched with java :( + $copperBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 18.0); + self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); } private static function registerMudBlocks() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 87770e2ea0..49b2f5e417 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -78,6 +78,7 @@ use pocketmine\block\Leaves; use pocketmine\block\Lectern; use pocketmine\block\Lever; use pocketmine\block\Light; +use pocketmine\block\LightningRod; use pocketmine\block\LitPumpkin; use pocketmine\block\Loom; use pocketmine\block\MelonStem; @@ -842,6 +843,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LIGHT_BLOCK) ->writeInt(StateNames::BLOCK_LIGHT_LEVEL, $block->getLightLevel()); }); + $this->map(Blocks::LIGHTNING_ROD(), function(LightningRod $block) : Writer{ + return Writer::create(Ids::LIGHTNING_ROD) + ->writeFacingDirection($block->getFacing()); + }); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); $this->mapSimple(Blocks::LILY_PAD(), Ids::WATERLILY); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 3584a7b022..76b27d4c48 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -692,6 +692,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::LIGHT() ->setLightLevel($in->readBoundedInt(StateNames::BLOCK_LIGHT_LEVEL, Light::MIN_LIGHT_LEVEL, Light::MAX_LIGHT_LEVEL)); }); + $this->map(Ids::LIGHTNING_ROD, function(Reader $in) : Block{ + return Blocks::LIGHTNING_ROD() + ->setFacing($in->readFacingDirection()); + }); $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index af5cf5daa4..2c134fafbf 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -695,6 +695,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("light", fn() => Blocks::LIGHT()); $result->registerBlock("light_block", fn() => Blocks::LIGHT()); $result->registerBlock("light_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); + $result->registerBlock("lightning_rod", fn() => Blocks::LIGHTNING_ROD()); $result->registerBlock("lilac", fn() => Blocks::LILAC()); $result->registerBlock("lily_of_the_valley", fn() => Blocks::LILY_OF_THE_VALLEY()); $result->registerBlock("lily_pad", fn() => Blocks::LILY_PAD()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index a642beb39c..365e849556 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From a44c089f98942ad30cab49452dcf65e2e99537e8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 9 Jul 2022 20:40:18 +0100 Subject: [PATCH 0320/1858] REEEEEEEEEEEEEE --- src/block/GildedBlackstone.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/block/GildedBlackstone.php b/src/block/GildedBlackstone.php index 434bddaaa7..e01d6bfdc7 100644 --- a/src/block/GildedBlackstone.php +++ b/src/block/GildedBlackstone.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\item\Item; use pocketmine\item\VanillaItems; +use function mt_rand; final class GildedBlackstone extends Opaque{ From 260e54e4b1d0d6e94bde41e8182e4db301e03336 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 10 Jul 2022 00:18:35 +0100 Subject: [PATCH 0321/1858] Skeleton for copper blocks, stairs and slabs --- build/generate-runtime-enum-serializers.php | 2 + src/block/BlockTypeIds.php | 6 +- src/block/Copper.php | 30 +++++++ src/block/CopperSlab.php | 30 +++++++ src/block/CopperStairs.php | 30 +++++++ src/block/VanillaBlocks.php | 9 +++ src/block/utils/CopperOxidation.php | 79 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 77 ++++++++++++++++++ .../convert/BlockStateDeserializerHelper.php | 28 +++++++ .../convert/BlockStateSerializerHelper.php | 12 +++ .../BlockStateToBlockObjectDeserializer.php | 33 ++++++++ src/data/runtime/RuntimeEnumDeserializer.php | 10 +++ src/data/runtime/RuntimeEnumSerializer.php | 10 +++ src/item/StringToItemParser.php | 13 +++ .../block_factory_consistency_check.json | 2 +- 15 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 src/block/Copper.php create mode 100644 src/block/CopperSlab.php create mode 100644 src/block/CopperStairs.php create mode 100644 src/block/utils/CopperOxidation.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index f3bd39abed..322a62fb03 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\build\generate_runtime_enum_serializers; use pocketmine\block\utils\BellAttachmentType; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; @@ -154,6 +155,7 @@ function buildEnumReaderFunc(array $enumMembers, string &$functionName) : array{ $enumsUsed = [ BellAttachmentType::getAll(), + CopperOxidation::getAll(), CoralType::getAll(), DyeColor::getAll(), LeverFacing::getAll(), diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 34d0716d37..d0baee61bd 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -680,6 +680,10 @@ final class BlockTypeIds{ public const CRYING_OBSIDIAN = 10653; public const GILDED_BLACKSTONE = 10654; public const LIGHTNING_ROD = 10655; + public const COPPER = 10656; + public const CUT_COPPER = 10657; + public const CUT_COPPER_SLAB = 10658; + public const CUT_COPPER_STAIRS = 10659; - public const FIRST_UNUSED_BLOCK_ID = 10656; + public const FIRST_UNUSED_BLOCK_ID = 10660; } diff --git a/src/block/Copper.php b/src/block/Copper.php new file mode 100644 index 0000000000..1da253fa41 --- /dev/null +++ b/src/block/Copper.php @@ -0,0 +1,30 @@ +getHarvestLevel(), 18.0); self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); + + self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); + self::register("cut_copper", new Copper(new BID(Ids::CUT_COPPER), "Cut Copper Block", $copperBreakInfo)); + self::register("cut_copper_slab", new CopperSlab(new BID(Ids::CUT_COPPER_SLAB), "Cut Copper Slab", $copperBreakInfo)); + self::register("cut_copper_stairs", new CopperStairs(new BID(Ids::CUT_COPPER_STAIRS), "Cut Copper Stairs", $copperBreakInfo)); } private static function registerMudBlocks() : void{ diff --git a/src/block/utils/CopperOxidation.php b/src/block/utils/CopperOxidation.php new file mode 100644 index 0000000000..8278819a79 --- /dev/null +++ b/src/block/utils/CopperOxidation.php @@ -0,0 +1,79 @@ +value] = $member; + } + + /** + * @var self[] + * @phpstan-var array + */ + private static array $levelMap = []; + + private function __construct( + string $name, + private int $value + ){ + $this->Enum___construct($name); + } + + public function getPrevious() : ?self{ + return self::$levelMap[$this->value - 1] ?? null; + } + + public function getNext() : ?self{ + return self::$levelMap[$this->value + 1] ?? null; + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 49b2f5e417..16a566bd1c 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -47,6 +47,9 @@ use pocketmine\block\Chest; use pocketmine\block\CocoaBlock; use pocketmine\block\Concrete; use pocketmine\block\ConcretePowder; +use pocketmine\block\Copper; +use pocketmine\block\CopperSlab; +use pocketmine\block\CopperStairs; use pocketmine\block\Coral; use pocketmine\block\CoralBlock; use pocketmine\block\DaylightSensor; @@ -419,6 +422,80 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); $this->mapSimple(Blocks::COBWEB(), Ids::WEB); + $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, Ids::WAXED_COPPER, Ids::WAXED_EXPOSED_COPPER, Ids::WAXED_WEATHERED_COPPER, Ids::WAXED_OXIDIZED_COPPER) : + Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER) + ); + }); + $this->map(Blocks::CUT_COPPER(), function(Copper $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, Ids::WAXED_CUT_COPPER, Ids::WAXED_EXPOSED_CUT_COPPER, Ids::WAXED_WEATHERED_CUT_COPPER, Ids::WAXED_OXIDIZED_CUT_COPPER) : + Helper::selectCopperId($oxidation, Ids::CUT_COPPER, Ids::EXPOSED_CUT_COPPER, Ids::WEATHERED_CUT_COPPER, Ids::OXIDIZED_CUT_COPPER) + ); + }); + $this->map(Blocks::CUT_COPPER_SLAB(), function(CopperSlab $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeSlab( + $block, + ($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_CUT_COPPER_SLAB, + Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, + Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, + Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB + ) : + Helper::selectCopperId( + $oxidation, + Ids::CUT_COPPER_SLAB, + Ids::EXPOSED_CUT_COPPER_SLAB, + Ids::WEATHERED_CUT_COPPER_SLAB, + Ids::OXIDIZED_CUT_COPPER_SLAB + ) + ), + ($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB + ) : + Helper::selectCopperId( + $oxidation, + Ids::DOUBLE_CUT_COPPER_SLAB, + Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, + Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, + Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB + ) + ) + ); + }); + $this->map(Blocks::CUT_COPPER_STAIRS(), function(CopperStairs $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeStairs( + $block, + new Writer($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_CUT_COPPER_STAIRS, + Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, + Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, + Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS + ) : + Helper::selectCopperId( + $oxidation, + Ids::CUT_COPPER_STAIRS, + Ids::EXPOSED_CUT_COPPER_STAIRS, + Ids::WEATHERED_CUT_COPPER_STAIRS, + Ids::OXIDIZED_CUT_COPPER_STAIRS + ) + ) + ); + }); $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ return Writer::create(Ids::COCOA) ->writeInt(StateNames::AGE, $block->getAge()) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index e7ebc51851..993390e9e8 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -25,6 +25,9 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Block; use pocketmine\block\Button; +use pocketmine\block\Copper; +use pocketmine\block\CopperSlab; +use pocketmine\block\CopperStairs; use pocketmine\block\Crops; use pocketmine\block\DaylightSensor; use pocketmine\block\Door; @@ -41,6 +44,7 @@ use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Trapdoor; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; @@ -85,6 +89,30 @@ final class BlockStateDeserializerHelper{ ->setSubtractMode($in->readBool(BlockStateNames::OUTPUT_SUBTRACT_BIT)); } + /** + * @phpstan-template TBlock of Copper|CopperSlab|CopperStairs + * + * @phpstan-param TBlock $block + * @phpstan-return TBlock + */ + public static function decodeCopper(Copper|CopperSlab|CopperStairs $block, CopperOxidation $oxidation) : Copper|CopperSlab|CopperStairs{ + $block->setOxidation($oxidation); + $block->setWaxed(false); + return $block; + } + + /** + * @phpstan-template TBlock of Copper|CopperSlab|CopperStairs + * + * @phpstan-param TBlock $block + * @phpstan-return TBlock + */ + public static function decodeWaxedCopper(Copper|CopperSlab|CopperStairs $block, CopperOxidation $oxidation) : Copper|CopperSlab|CopperStairs{ + $block->setOxidation($oxidation); + $block->setWaxed(true); + return $block; + } + /** @throws BlockStateDeserializeException */ public static function decodeDaylightSensor(DaylightSensor $block, BlockStateReader $in) : DaylightSensor{ return $block diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 9ef70b3616..bc6b1aec99 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -41,6 +41,7 @@ use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Torch; use pocketmine\block\Trapdoor; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\SlabType; use pocketmine\block\Wall; use pocketmine\block\WallSign; @@ -49,6 +50,7 @@ use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Facing; +use pocketmine\utils\AssumptionFailedError; final class BlockStateSerializerHelper{ @@ -81,6 +83,16 @@ final class BlockStateSerializerHelper{ ->writeTorchFacing($block->getFacing()); } + public static function selectCopperId(CopperOxidation $oxidation, string $noneId, string $exposedId, string $weatheredId, string $oxidizedId) : string{ + return match($oxidation){ + CopperOxidation::NONE() => $noneId, + CopperOxidation::EXPOSED() => $exposedId, + CopperOxidation::WEATHERED() => $weatheredId, + CopperOxidation::OXIDIZED() => $oxidizedId, + default => throw new AssumptionFailedError("Unhandled copper oxidation " . $oxidation->name()) + }; + } + public static function encodeDoor(Door $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 76b27d4c48..f4bc6ca711 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -30,6 +30,7 @@ use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; @@ -270,6 +271,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); }); + $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE())); + $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); + $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); + $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); $this->map(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE()); $this->map(Ids::CORAL, function(Reader $in) : Block{ return Blocks::CORAL() @@ -537,6 +542,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::ENDER_CHEST() ->setFacing($in->readHorizontalFacing()); }); + $this->map(Ids::EXPOSED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::EXPOSED())); + $this->map(Ids::EXPOSED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED())); + $this->mapSlab(Ids::EXPOSED_CUT_COPPER_SLAB, Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED())); + $this->mapStairs(Ids::EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED())); $this->map(Ids::FARMLAND, function(Reader $in) : Block{ return Blocks::FARMLAND() ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7)); @@ -799,6 +808,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); + $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); + $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); + $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); + $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); $this->map(Ids::PLANKS, function(Reader $in) : Block{ @@ -1196,6 +1209,26 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); + $this->map(Ids::WAXED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::NONE())); + $this->map(Ids::WAXED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); + $this->mapSlab(Ids::WAXED_CUT_COPPER_SLAB, Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); + $this->mapStairs(Ids::WAXED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); + $this->map(Ids::WAXED_EXPOSED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::EXPOSED())); + $this->map(Ids::WAXED_EXPOSED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED())); + $this->mapSlab(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED())); + $this->mapStairs(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED())); + $this->map(Ids::WAXED_OXIDIZED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); + $this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); + $this->mapSlab(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); + $this->mapStairs(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); + $this->map(Ids::WAXED_WEATHERED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::WEATHERED())); + $this->map(Ids::WAXED_WEATHERED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); + $this->mapSlab(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); + $this->mapStairs(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); + $this->map(Ids::WEATHERED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::WEATHERED())); + $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); + $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); + $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); $this->map(Ids::WEB, fn() => Blocks::COBWEB()); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializer.php index f5835f962f..fe20039d63 100644 --- a/src/data/runtime/RuntimeEnumDeserializer.php +++ b/src/data/runtime/RuntimeEnumDeserializer.php @@ -39,6 +39,16 @@ final class RuntimeEnumDeserializer{ }; } + public static function readCopperOxidation(RuntimeDataReader $r) : \pocketmine\block\utils\CopperOxidation{ + return match($r->readInt(2)){ + 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED(), + 1 => \pocketmine\block\utils\CopperOxidation::NONE(), + 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED(), + 3 => \pocketmine\block\utils\CopperOxidation::WEATHERED(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for CopperOxidation") + }; + } + public static function readCoralType(RuntimeDataReader $r) : \pocketmine\block\utils\CoralType{ return match($r->readInt(3)){ 0 => \pocketmine\block\utils\CoralType::BRAIN(), diff --git a/src/data/runtime/RuntimeEnumSerializer.php b/src/data/runtime/RuntimeEnumSerializer.php index 1b942d0a1b..53593588f1 100644 --- a/src/data/runtime/RuntimeEnumSerializer.php +++ b/src/data/runtime/RuntimeEnumSerializer.php @@ -39,6 +39,16 @@ final class RuntimeEnumSerializer{ }); } + public static function writeCopperOxidation(RuntimeDataWriter $w, \pocketmine\block\utils\CopperOxidation $value) : void{ + $w->writeInt(2, match($value){ + \pocketmine\block\utils\CopperOxidation::EXPOSED() => 0, + \pocketmine\block\utils\CopperOxidation::NONE() => 1, + \pocketmine\block\utils\CopperOxidation::OXIDIZED() => 2, + \pocketmine\block\utils\CopperOxidation::WEATHERED() => 3, + default => throw new \pocketmine\utils\AssumptionFailedError("All CopperOxidation cases should be covered") + }); + } + public static function writeCoralType(RuntimeDataWriter $w, \pocketmine\block\utils\CoralType $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\CoralType::BRAIN() => 0, diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 2c134fafbf..a38d5e61c1 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -25,6 +25,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\Light; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; @@ -77,6 +78,18 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("light_block_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); } + foreach(CopperOxidation::getAll() as $oxidation){ + $oxPrefix = $oxidation->equals(CopperOxidation::NONE()) ? "" : $oxidation->name() . "_"; + + foreach(["" => false, "waxed_" => true] as $waxedPrefix => $waxed){ + $prefix = $waxedPrefix . $oxPrefix; + $result->registerBlock($prefix . "copper_block", fn() => Blocks::COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $result->registerBlock($prefix . "cut_copper_block", fn() => Blocks::CUT_COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $result->registerBlock($prefix . "cut_copper_stairs", fn() => Blocks::CUT_COPPER_STAIRS()->setOxidation($oxidation)->setWaxed($waxed)); + $result->registerBlock($prefix . "cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); + } + } + $result->registerBlock("acacia_button", fn() => Blocks::ACACIA_BUTTON()); $result->registerBlock("acacia_door", fn() => Blocks::ACACIA_DOOR()); $result->registerBlock("acacia_door_block", fn() => Blocks::ACACIA_DOOR()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 365e849556..9324b8d134 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From a22276e679b123dacc144f13fff489c33c66a1c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 10 Jul 2022 00:19:27 +0100 Subject: [PATCH 0322/1858] there's always one ... --- src/block/utils/CopperTrait.php | 62 +++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/block/utils/CopperTrait.php diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php new file mode 100644 index 0000000000..c001657fca --- /dev/null +++ b/src/block/utils/CopperTrait.php @@ -0,0 +1,62 @@ +oxidation = RuntimeEnumDeserializer::readCopperOxidation($r); + $this->waxed = $r->readBool(); + } + + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeCopperOxidation($w, $this->oxidation); + $w->writeBool($this->waxed); + } + + public function getOxidation() : CopperOxidation{ return $this->oxidation; } + + /** @return $this */ + public function setOxidation(CopperOxidation $oxidation) : self{ + $this->oxidation = $oxidation; + return $this; + } + + public function isWaxed() : bool{ return $this->waxed; } + + /** @return $this */ + public function setWaxed(bool $waxed) : self{ + $this->waxed = $waxed; + return $this; + } +} From 14933a731be18690cebc5db95c2010d5209bb2b0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 10 Jul 2022 01:00:13 +0100 Subject: [PATCH 0323/1858] Implement copper waxing, unwaxing and scraping, minus particles there is a LevelEvent for the particles, but it's both particle and sound, which doesn't integrate well with the existing API. --- src/block/utils/CopperTrait.php | 42 ++++++++++++++++++++++++ src/world/sound/CopperWaxApplySound.php | 34 +++++++++++++++++++ src/world/sound/CopperWaxRemoveSound.php | 34 +++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 src/world/sound/CopperWaxApplySound.php create mode 100644 src/world/sound/CopperWaxRemoveSound.php diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index c001657fca..e30afe69f0 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -27,6 +27,14 @@ use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\runtime\RuntimeEnumDeserializer; use pocketmine\data\runtime\RuntimeEnumSerializer; +use pocketmine\item\Axe; +use pocketmine\item\Item; +use pocketmine\item\ItemTypeIds; +use pocketmine\math\Vector3; +use pocketmine\player\Player; +use pocketmine\world\sound\CopperWaxApplySound; +use pocketmine\world\sound\CopperWaxRemoveSound; +use pocketmine\world\sound\ItemUseOnBlockSound; trait CopperTrait{ private CopperOxidation $oxidation; @@ -59,4 +67,38 @@ trait CopperTrait{ $this->waxed = $waxed; return $this; } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->waxed && $item->getTypeId() === ItemTypeIds::HONEYCOMB){ + $this->waxed = true; + $this->position->getWorld()->setBlock($this->position, $this); + //TODO: orange particles are supposed to appear when applying wax + $this->position->getWorld()->addSound($this->position, new CopperWaxApplySound()); + $item->pop(); + return true; + } + + if($item instanceof Axe){ + if($this->waxed){ + $this->waxed = false; + $this->position->getWorld()->setBlock($this->position, $this); + //TODO: white particles are supposed to appear when removing wax + $this->position->getWorld()->addSound($this->position, new CopperWaxRemoveSound()); + $item->applyDamage(1); + return true; + } + + $previousOxidation = $this->oxidation->getPrevious(); + if($previousOxidation !== null){ + $this->oxidation = $previousOxidation; + $this->position->getWorld()->setBlock($this->position, $this); + //TODO: turquoise particles are supposed to appear when removing oxidation + $this->position->getWorld()->addSound($this->position, new ItemUseOnBlockSound($this)); + $item->applyDamage(1); + return true; + } + } + + return false; + } } diff --git a/src/world/sound/CopperWaxApplySound.php b/src/world/sound/CopperWaxApplySound.php new file mode 100644 index 0000000000..3775fa70c3 --- /dev/null +++ b/src/world/sound/CopperWaxApplySound.php @@ -0,0 +1,34 @@ + Date: Sun, 10 Jul 2022 17:41:01 +0100 Subject: [PATCH 0324/1858] RuntimeBlockMapping: avoid keeping two copies of the same blockstate data in memory --- src/network/mcpe/convert/RuntimeBlockMapping.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index e0acc24301..c5945e28dc 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -66,8 +66,11 @@ final class RuntimeBlockMapping{ private BlockStateDictionary $blockStateDictionary, private BlockStateSerializer $blockStateSerializer ){ - $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); - $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData($this->fallbackStateData) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); + $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData( + new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION) + ) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); + //lookup the state data from the dictionary to avoid keeping two copies of the same data around + $this->fallbackStateData = $this->blockStateDictionary->getDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); } public function toRuntimeId(int $internalStateId) : int{ From 32f9fcd4e9f0b529bd6018362f6b82f732bd74c1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Jul 2022 16:38:37 +0100 Subject: [PATCH 0325/1858] Ignore coral_hang_type_bit on coral_fan_hang3 it's always written, but never used. --- .../block/convert/BlockStateToBlockObjectDeserializer.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index f4bc6ca711..62da377d52 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -295,9 +295,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ - if($in->readBool(StateNames::CORAL_HANG_TYPE_BIT)){ - throw $in->badValueException(StateNames::CORAL_HANG_TYPE_BIT, "1", "This should always be zero for hang3"); - } + $in->ignored(StateNames::CORAL_HANG_TYPE_BIT); //the game always writes this, even though it's not used return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType(CoralType::HORN()); }); From 8b2d941502c4eb7ea621130c9138b073bec7f553 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Jul 2022 19:49:30 +0100 Subject: [PATCH 0326/1858] Offset integer ranges in runtime block data serialization this is useful for stuff like snow layers where the range doesn't start at 0. --- src/block/Anvil.php | 2 +- src/block/Bamboo.php | 2 +- src/block/Cactus.php | 2 +- src/block/Cake.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/Crops.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/Farmland.php | 2 +- src/block/Fire.php | 2 +- src/block/FrostedIce.php | 2 +- src/block/Light.php | 2 +- src/block/Liquid.php | 2 +- src/block/NetherWartPlant.php | 2 +- src/block/RedstoneRepeater.php | 4 ++-- src/block/SeaPickle.php | 4 ++-- src/block/SnowLayer.php | 4 ++-- src/block/Sugarcane.php | 2 +- src/block/SweetBerryBush.php | 2 +- src/block/utils/AnalogRedstoneSignalEmitterTrait.php | 2 +- src/block/utils/SignLikeRotationTrait.php | 2 +- src/data/runtime/RuntimeDataReader.php | 2 +- src/data/runtime/RuntimeDataWriter.php | 11 ++++++++++- 22 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index a859210fd4..ef8ef3f620 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -54,7 +54,7 @@ class Anvil extends Transparent implements Fallable{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeInt(2, $this->getDamage()); + $w->writeBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->getDamage()); } public function getRequiredStateDataBits() : int{ return 2; } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index eaf6c26db6..c8be857b0b 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -65,7 +65,7 @@ class Bamboo extends Transparent{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(2, $this->getLeafSize()); + $w->writeBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->getLeafSize()); $w->writeBool($this->isThick()); $w->writeBool($this->isReady()); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index cc8c602bf2..f1c4a59097 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -49,7 +49,7 @@ class Cactus extends Transparent{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->age); + $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Cake.php b/src/block/Cake.php index cbb8f93891..d3841e9efa 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -48,7 +48,7 @@ class Cake extends Transparent implements FoodSource{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->bites); + $w->writeBoundedInt(3, 0, self::MAX_BITES, $this->bites); } /** diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 5056598c31..bc6b892ca0 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -56,7 +56,7 @@ class CocoaBlock extends Transparent{ protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); - $w->writeInt(2, $this->age); + $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Crops.php b/src/block/Crops.php index f916dfb7df..52242cfe45 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -46,7 +46,7 @@ abstract class Crops extends Flowable{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->age); + $w->writeBoundedInt(3, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 8718b89c2f..93ea4ce607 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -50,7 +50,7 @@ class DaylightSensor extends Transparent{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->signalStrength); + $w->writeBoundedInt(4, 0, 15, $this->signalStrength); $w->writeBool($this->inverted); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 989254bc93..9cbb55c93b 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -45,7 +45,7 @@ class Farmland extends Transparent{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->wetness); + $w->writeBoundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } public function getWetness() : int{ return $this->wetness; } diff --git a/src/block/Fire.php b/src/block/Fire.php index 503dd1dc3f..45546c7207 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -47,7 +47,7 @@ class Fire extends BaseFire{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->age); + $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 60a42a4a52..8aba73644f 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -40,7 +40,7 @@ class FrostedIce extends Ice{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(2, $this->age); + $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Light.php b/src/block/Light.php index b2d39fb9ff..9313cb19f6 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -42,7 +42,7 @@ final class Light extends Flowable{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->level); + $w->writeBoundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } public function getLightLevel() : int{ return $this->level; } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 93c8219f5c..81f34e6f60 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -58,7 +58,7 @@ abstract class Liquid extends Transparent{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->decay); + $w->writeBoundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->writeBool($this->falling); $w->writeBool($this->still); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index d6c2287b13..13da176e7b 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -45,7 +45,7 @@ class NetherWartPlant extends Flowable{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(2, $this->age); + $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 3b77bb262c..b680d52cc8 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -48,13 +48,13 @@ class RedstoneRepeater extends Flowable{ protected function decodeState(RuntimeDataReader $r) : void{ $this->facing = $r->readHorizontalFacing(); - $this->delay = $r->readBoundedInt(2, self::MIN_DELAY - 1, self::MAX_DELAY - 1) + 1; + $this->delay = $r->readBoundedInt(2, self::MIN_DELAY, self::MAX_DELAY); $this->powered = $r->readBool(); } protected function encodeState(RuntimeDataWriter $w) : void{ $w->writeHorizontalFacing($this->facing); - $w->writeInt(2, $this->delay - 1); + $w->writeBoundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->writeBool($this->powered); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 4be3b89d7b..d6e0f32a7e 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -42,12 +42,12 @@ class SeaPickle extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->count = $r->readBoundedInt(2, self::MIN_COUNT - 1, self::MAX_COUNT - 1) + 1; + $this->count = $r->readBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT); $this->underwater = $r->readBool(); } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(2, $this->count - 1); + $w->writeBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->writeBool($this->underwater); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index d629d4d049..f45afc9f9e 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -50,11 +50,11 @@ class SnowLayer extends Flowable implements Fallable{ public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS - 1, self::MAX_LAYERS - 1) + 1; + $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS); } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->layers - 1); + $w->writeBoundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } public function getLayers() : int{ return $this->layers; } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index f91f13a5e7..6985cd4871 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -45,7 +45,7 @@ class Sugarcane extends Flowable{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->age); + $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); } private function grow() : bool{ diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 54e785664e..1fa1e180c3 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -53,7 +53,7 @@ class SweetBerryBush extends Flowable{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->age); + $w->writeBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 22d266aa71..1b9f5b26b5 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -36,7 +36,7 @@ trait AnalogRedstoneSignalEmitterTrait{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->signalStrength); + $w->writeBoundedInt(4, 0, 15, $this->signalStrength); } public function getOutputSignalStrength() : int{ return $this->signalStrength; } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index e5773dbbd3..96d0b9ef64 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -38,7 +38,7 @@ trait SignLikeRotationTrait{ } protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->rotation); + $w->writeBoundedInt(4, 0, 15, $this->rotation); } public function getRotation() : int{ return $this->rotation; } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 46c59cb276..a5bcc72cfa 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -49,7 +49,7 @@ final class RuntimeDataReader{ } public function readBoundedInt(int $bits, int $min, int $max) : int{ - $result = $this->readInt($bits); + $result = $this->readInt($bits) + $min; if($result < $min || $result > $max){ throw new InvalidSerializedRuntimeDataException("Value is outside the range $min - $max"); } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index c007592370..c10de5cea6 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -52,6 +52,15 @@ final class RuntimeDataWriter{ return $this; } + /** @param int $bits *@return $this */ + public function writeBoundedInt(int $bits, int $min, int $max, int $value) : self{ + if($value < $min || $value > $max){ + throw new \InvalidArgumentException("Value $value is outside the range $min - $max"); + } + $this->writeInt($bits, $value - $min); + return $this; + } + /** @return $this */ public function writeBool(bool $value) : self{ return $this->writeInt(1, $value ? 1 : 0); @@ -104,7 +113,7 @@ final class RuntimeDataWriter{ public function writeWallConnections(array $connections) : self{ //TODO: we can pack this into 7 bits instead of 8 foreach(Facing::HORIZONTAL as $facing){ - $this->writeInt(2, match($connections[$facing] ?? null){ + $this->writeBoundedInt(2, 0, 2, match($connections[$facing] ?? null){ null => 0, WallConnectionType::SHORT() => 1, WallConnectionType::TALL() => 2, From 20cb67461fbe79f6ed5e61b53a2e29e2c3d96111 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Jul 2022 19:50:35 +0100 Subject: [PATCH 0327/1858] Block: add the current class to the exception messages for block runtime data serialization --- src/block/Block.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 38abcfb4f3..591f54922b 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -47,6 +47,7 @@ use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\World; use function count; +use function get_class; use const PHP_INT_MAX; class Block{ @@ -109,7 +110,7 @@ class Block{ $this->decodeType($reader); $readBits = $reader->getOffset(); if($typeBits !== $readBits){ - throw new \LogicException("Exactly $typeBits bits of type data were provided, but $readBits were read"); + throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were provided, but $readBits were read"); } } @@ -126,7 +127,7 @@ class Block{ $this->decodeState($reader); $readBits = $reader->getOffset() - $typeBits; if($stateBits !== $readBits){ - throw new \LogicException("Exactly $stateBits bits of state data were provided, but $readBits were read"); + throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); } } @@ -149,7 +150,7 @@ class Block{ $this->encodeType($writer); $writtenBits = $writer->getOffset(); if($typeBits !== $writtenBits){ - throw new \LogicException("Exactly $typeBits bits of type data were expected, but $writtenBits were written"); + throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were expected, but $writtenBits were written"); } return $writer->getValue(); @@ -168,7 +169,7 @@ class Block{ $this->encodeState($writer); $writtenBits = $writer->getOffset() - $typeBits; if($stateBits !== $writtenBits){ - throw new \LogicException("Exactly $stateBits bits of state data were expected, but $writtenBits were written"); + throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); } return $writer->getValue(); From eafc23c7565d1375152a5ed62890624600396caf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Jul 2022 23:54:41 +0100 Subject: [PATCH 0328/1858] Added candles and cakes with candles --- src/block/BaseCake.php | 89 ++++++++++++ src/block/BlockTypeIds.php | 6 +- src/block/Cake.php | 77 +++------- src/block/CakeWithCandle.php | 78 +++++++++++ src/block/CakeWithDyedCandle.php | 34 +++++ src/block/Candle.php | 132 ++++++++++++++++++ src/block/DyedCandle.php | 36 +++++ src/block/VanillaBlocks.php | 13 ++ src/block/utils/CandleTrait.php | 99 +++++++++++++ .../BlockObjectToBlockStateSerializer.php | 49 +++++++ .../convert/BlockStateDeserializerHelper.php | 9 ++ .../convert/BlockStateSerializerHelper.php | 8 ++ .../BlockStateToBlockObjectDeserializer.php | 43 ++++++ src/item/StringToItemParser.php | 2 + .../block_factory_consistency_check.json | 2 +- 15 files changed, 616 insertions(+), 61 deletions(-) create mode 100644 src/block/BaseCake.php create mode 100644 src/block/CakeWithCandle.php create mode 100644 src/block/CakeWithDyedCandle.php create mode 100644 src/block/Candle.php create mode 100644 src/block/DyedCandle.php create mode 100644 src/block/utils/CandleTrait.php diff --git a/src/block/BaseCake.php b/src/block/BaseCake.php new file mode 100644 index 0000000000..5fcca644a7 --- /dev/null +++ b/src/block/BaseCake.php @@ -0,0 +1,89 @@ +getSide(Facing::DOWN); + if($down->getTypeId() !== BlockTypeIds::AIR){ + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + return false; + } + + public function onNearbyBlockChange() : void{ + if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ //Replace with common break method + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if($player !== null){ + return $player->consumeObject($this); + } + + return false; + } + + public function getFoodRestore() : int{ + return 2; + } + + public function getSaturationRestore() : float{ + return 0.4; + } + + public function requiresHunger() : bool{ + return true; + } + + /** + * @return EffectInstance[] + */ + public function getAdditionalEffects() : array{ + return []; + } + + abstract public function getResidue() : Block; + + public function onConsume(Living $consumer) : void{ + $this->position->getWorld()->setBlock($this->position, $this->getResidue()); + } +} diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index d0baee61bd..955d43dd19 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -684,6 +684,10 @@ final class BlockTypeIds{ public const CUT_COPPER = 10657; public const CUT_COPPER_SLAB = 10658; public const CUT_COPPER_STAIRS = 10659; + public const CANDLE = 10660; + public const DYED_CANDLE = 10661; + public const CAKE_WITH_CANDLE = 10662; + public const CAKE_WITH_DYED_CANDLE = 10663; - public const FIRST_UNUSED_BLOCK_ID = 10660; + public const FIRST_UNUSED_BLOCK_ID = 10664; } diff --git a/src/block/Cake.php b/src/block/Cake.php index d3841e9efa..31d1c3ad96 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -23,20 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\entity\effect\EffectInstance; -use pocketmine\entity\FoodSource; -use pocketmine\entity\Living; use pocketmine\item\Item; +use pocketmine\item\ItemBlock; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; -class Cake extends Transparent implements FoodSource{ +class Cake extends BaseCake{ public const MAX_BITES = 6; protected int $bites = 0; @@ -63,10 +59,6 @@ class Cake extends Transparent implements FoodSource{ ]; } - public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); - } - public function getBites() : int{ return $this->bites; } /** @return $this */ @@ -78,49 +70,27 @@ class Cake extends Transparent implements FoodSource{ return $this; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() !== BlockTypeIds::AIR){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ //Replace with common break method - $this->position->getWorld()->setBlock($this->position, VanillaBlocks::AIR()); - } - } - - public function getDropsForCompatibleTool(Item $item) : array{ - return []; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($player !== null){ - return $player->consumeObject($this); + if($item instanceof ItemBlock){ + $block = $item->getBlock(); + $resultBlock = null; + if($block->getTypeId() === BlockTypeIds::CANDLE){ + $resultBlock = VanillaBlocks::CAKE_WITH_CANDLE(); + }elseif($block instanceof DyedCandle){ + $resultBlock = VanillaBlocks::CAKE_WITH_DYED_CANDLE()->setColor($block->getColor()); + } + + if($resultBlock !== null){ + $this->position->getWorld()->setBlock($this->position, $resultBlock); + $item->pop(); + return true; + } } - return false; + return parent::onInteract($item, $face, $clickVector, $player); } - public function getFoodRestore() : int{ - return 2; - } - - public function getSaturationRestore() : float{ - return 0.4; - } - - public function requiresHunger() : bool{ - return true; - } - - /** - * @return Block - */ - public function getResidue(){ + public function getResidue() : Block{ $clone = clone $this; $clone->bites++; if($clone->bites > self::MAX_BITES){ @@ -128,15 +98,4 @@ class Cake extends Transparent implements FoodSource{ } return $clone; } - - /** - * @return EffectInstance[] - */ - public function getAdditionalEffects() : array{ - return []; - } - - public function onConsume(Living $consumer) : void{ - $this->position->getWorld()->setBlock($this->position, $this->getResidue()); - } } diff --git a/src/block/CakeWithCandle.php b/src/block/CakeWithCandle.php new file mode 100644 index 0000000000..63278ea362 --- /dev/null +++ b/src/block/CakeWithCandle.php @@ -0,0 +1,78 @@ +contract(1 / 16, 0, 1 / 16) + ->trim(Facing::UP, 0.5) //TODO: not sure if the candle affects height + ]; + } + + public function getCandle() : Candle{ + return VanillaBlocks::CANDLE(); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if($this->onInteractCandle($item, $face, $clickVector, $player)){ + return true; + } + + return parent::onInteract($item, $face, $clickVector, $player); + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [$this->getCandle()->asItem()]; + } + + public function getPickedItem(bool $addUserData = false) : Item{ + return VanillaBlocks::CAKE()->getPickedItem($addUserData); + } + + public function getResidue() : Block{ + return VanillaBlocks::CAKE()->setBites(1); + } + + public function onConsume(Living $consumer) : void{ + parent::onConsume($consumer); + $this->position->getWorld()->dropItem($this->position->add(0.5, 0.5, 0.5), $this->getCandle()->asItem()); + } +} diff --git a/src/block/CakeWithDyedCandle.php b/src/block/CakeWithDyedCandle.php new file mode 100644 index 0000000000..959017e4d7 --- /dev/null +++ b/src/block/CakeWithDyedCandle.php @@ -0,0 +1,34 @@ +setColor($this->color); + } +} diff --git a/src/block/Candle.php b/src/block/Candle.php new file mode 100644 index 0000000000..b917b71011 --- /dev/null +++ b/src/block/Candle.php @@ -0,0 +1,132 @@ +decodeLitState($r); + $this->count = $r->readBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT); + } + + protected function encodeState(RuntimeDataWriter $w) : void{ + $this->encodeLitState($w); + $w->writeBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + } + + public function getCount() : int{ return $this->count; } + + /** @return $this */ + public function setCount(int $count) : self{ + if($count < self::MIN_COUNT || $count > self::MAX_COUNT){ + throw new \InvalidArgumentException("Count must be in range " . self::MIN_COUNT . " ... " . self::MAX_COUNT); + } + $this->count = $count; + return $this; + } + + public function getLightLevel() : int{ + return $this->getBaseLightLevel() * $this->count; + } + + protected function recalculateCollisionBoxes() : array{ + return [ + (match($this->count){ + 1 => AxisAlignedBB::one() + ->squash(Axis::X, 7 / 16) + ->squash(Axis::Z, 7 / 16), + 2 => AxisAlignedBB::one() + ->squash(Axis::X, 5 / 16) + ->trim(Facing::NORTH, 7 / 16) //0.3 thick on the Z axis + ->trim(Facing::SOUTH, 6 / 16), + 3 => AxisAlignedBB::one() + ->trim(Facing::WEST, 5 / 16) + ->trim(Facing::EAST, 6 / 16) + ->trim(Facing::NORTH, 6 / 16) + ->trim(Facing::SOUTH, 5 / 16), + 4 => AxisAlignedBB::one() + ->squash(Axis::X, 5 / 16) + ->trim(Facing::NORTH, 5 / 16) + ->trim(Facing::SOUTH, 6 / 16), + default => throw new AssumptionFailedError("Unreachable") + })->trim(Facing::UP, 10 / 16) + ]; + } + + protected function getCandleIfCompatibleType(Block $block) : ?Candle{ + return $block instanceof Candle && $block->isSameType($this) ? $block : null; + } + + public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ + $candle = $this->getCandleIfCompatibleType($blockReplace); + return $candle !== null ? $candle->count < self::MAX_COUNT : parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + $down = $blockReplace->getSide(Facing::DOWN); + if(!$down->getSupportType(Facing::UP)->hasCenterSupport()){ + return false; + } + $existing = $this->getCandleIfCompatibleType($blockReplace); + if($existing !== null){ + if($existing->count >= self::MAX_COUNT){ + return false; + } + + $this->count = $existing->count + 1; + $this->lit = $existing->lit; + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [$this->asItem()->setCount($this->count)]; + } +} diff --git a/src/block/DyedCandle.php b/src/block/DyedCandle.php new file mode 100644 index 0000000000..b90aabac1d --- /dev/null +++ b/src/block/DyedCandle.php @@ -0,0 +1,36 @@ +color->equals($this->color) ? $result : null; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index e621f18302..7fdaa4663b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -135,7 +135,10 @@ use function mb_strtolower; * @method static BrownMushroomBlock BROWN_MUSHROOM_BLOCK() * @method static Cactus CACTUS() * @method static Cake CAKE() + * @method static CakeWithCandle CAKE_WITH_CANDLE() + * @method static CakeWithDyedCandle CAKE_WITH_DYED_CANDLE() * @method static Opaque CALCITE() + * @method static Candle CANDLE() * @method static Carpet CARPET() * @method static Carrot CARROTS() * @method static CarvedPumpkin CARVED_PUMPKIN() @@ -246,6 +249,7 @@ use function mb_strtolower; * @method static DoubleTallGrass DOUBLE_TALLGRASS() * @method static DragonEgg DRAGON_EGG() * @method static DriedKelp DRIED_KELP() + * @method static DyedCandle DYED_CANDLE() * @method static DyedShulkerBox DYED_SHULKER_BOX() * @method static Element ELEMENT_ACTINIUM() * @method static Element ELEMENT_ALUMINUM() @@ -1463,6 +1467,15 @@ final class VanillaBlocks{ self::register("cut_copper", new Copper(new BID(Ids::CUT_COPPER), "Cut Copper Block", $copperBreakInfo)); self::register("cut_copper_slab", new CopperSlab(new BID(Ids::CUT_COPPER_SLAB), "Cut Copper Slab", $copperBreakInfo)); self::register("cut_copper_stairs", new CopperStairs(new BID(Ids::CUT_COPPER_STAIRS), "Cut Copper Stairs", $copperBreakInfo)); + + $candleBreakInfo = new BreakInfo(0.1); + self::register("candle", new Candle(new BID(Ids::CANDLE), "Candle", $candleBreakInfo)); + self::register("dyed_candle", new DyedCandle(new BID(Ids::DYED_CANDLE), "Dyed Candle", $candleBreakInfo)); + + //TODO: duplicated break info :( + $cakeBreakInfo = new BreakInfo(0.5); + self::register("cake_with_candle", new CakeWithCandle(new BID(Ids::CAKE_WITH_CANDLE), "Cake With Candle", $cakeBreakInfo)); + self::register("cake_with_dyed_candle", new CakeWithDyedCandle(new BID(Ids::CAKE_WITH_DYED_CANDLE), "Cake With Dyed Candle", $cakeBreakInfo)); } private static function registerMudBlocks() : void{ diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php new file mode 100644 index 0000000000..d838299cce --- /dev/null +++ b/src/block/utils/CandleTrait.php @@ -0,0 +1,99 @@ +lit = $r->readBool(); + } + + protected function encodeState(RuntimeDataWriter $w) : void{ + $w->writeBool($this->lit); + } + + public function getLightLevel() : int{ + return $this->lit ? 3 : 0; + } + + public function isLit() : bool{ return $this->lit; } + + /** @return $this */ + public function setLit(bool $lit) : self{ + $this->lit = $lit; + return $this; + } + + /** @see Block::onInteract() */ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if($item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ + if($this->lit){ + return true; + } + if($item instanceof Durable){ + $item->applyDamage(1); + } + $this->position->getWorld()->addSound($this->position, new FlintSteelSound()); + $this->position->getWorld()->setBlock($this->position, $this->setLit(true)); + + return true; + } + if($item->isNull()){ //candle can only be extinguished with an empty hand + if(!$this->lit){ + return true; + } + $this->position->getWorld()->addSound($this->position, new FireExtinguishSound()); + $this->position->getWorld()->setBlock($this->position, $this->setLit(false)); + + return true; + } + + //yes, this is intentional! in vanilla, if the candle is not interacted with, a block is placed. + return false; + } + + /** @see Block::onProjectileHit() */ + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + if(!$this->lit && $projectile->isOnFire()){ + $this->position->getWorld()->setBlock($this->position, $this->setLit(true)); + } + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 16a566bd1c..c69537b416 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -39,6 +39,9 @@ use pocketmine\block\BrownMushroomBlock; use pocketmine\block\Button; use pocketmine\block\Cactus; use pocketmine\block\Cake; +use pocketmine\block\CakeWithCandle; +use pocketmine\block\CakeWithDyedCandle; +use pocketmine\block\Candle; use pocketmine\block\Carpet; use pocketmine\block\Carrot; use pocketmine\block\CarvedPumpkin; @@ -58,6 +61,7 @@ use pocketmine\block\Dirt; use pocketmine\block\Door; use pocketmine\block\DoublePlant; use pocketmine\block\DoubleTallGrass; +use pocketmine\block\DyedCandle; use pocketmine\block\DyedShulkerBox; use pocketmine\block\EnderChest; use pocketmine\block\EndPortalFrame; @@ -171,6 +175,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ private array $serializers = []; public function __construct(){ + $this->registerCandleSerializers(); $this->registerSerializers(); } @@ -242,6 +247,50 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return $writer->getBlockStateData(); } + private function registerCandleSerializers() : void{ + $this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE))); + $this->map(Blocks::DYED_CANDLE(), fn(DyedCandle $block) => Helper::encodeCandle($block, new Writer(match($block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_CANDLE, + DyeColor::BLUE() => Ids::BLUE_CANDLE, + DyeColor::BROWN() => Ids::BROWN_CANDLE, + DyeColor::CYAN() => Ids::CYAN_CANDLE, + DyeColor::GRAY() => Ids::GRAY_CANDLE, + DyeColor::GREEN() => Ids::GREEN_CANDLE, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CANDLE, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CANDLE, + DyeColor::LIME() => Ids::LIME_CANDLE, + DyeColor::MAGENTA() => Ids::MAGENTA_CANDLE, + DyeColor::ORANGE() => Ids::ORANGE_CANDLE, + DyeColor::PINK() => Ids::PINK_CANDLE, + DyeColor::PURPLE() => Ids::PURPLE_CANDLE, + DyeColor::RED() => Ids::RED_CANDLE, + DyeColor::WHITE() => Ids::WHITE_CANDLE, + DyeColor::YELLOW() => Ids::YELLOW_CANDLE, + default => throw new AssumptionFailedError("Unhandled DyeColor " . $block->getColor()->name()) + }))); + $this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE) + ->writeBool(StateNames::LIT, $block->isLit())); + $this->map(Blocks::CAKE_WITH_DYED_CANDLE(), fn(CakeWithDyedCandle $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_CANDLE_CAKE, + DyeColor::BLUE() => Ids::BLUE_CANDLE_CAKE, + DyeColor::BROWN() => Ids::BROWN_CANDLE_CAKE, + DyeColor::CYAN() => Ids::CYAN_CANDLE_CAKE, + DyeColor::GRAY() => Ids::GRAY_CANDLE_CAKE, + DyeColor::GREEN() => Ids::GREEN_CANDLE_CAKE, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CANDLE_CAKE, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CANDLE_CAKE, + DyeColor::LIME() => Ids::LIME_CANDLE_CAKE, + DyeColor::MAGENTA() => Ids::MAGENTA_CANDLE_CAKE, + DyeColor::ORANGE() => Ids::ORANGE_CANDLE_CAKE, + DyeColor::PINK() => Ids::PINK_CANDLE_CAKE, + DyeColor::PURPLE() => Ids::PURPLE_CANDLE_CAKE, + DyeColor::RED() => Ids::RED_CANDLE_CAKE, + DyeColor::WHITE() => Ids::WHITE_CANDLE_CAKE, + DyeColor::YELLOW() => Ids::YELLOW_CANDLE_CAKE, + default => throw new AssumptionFailedError("Unhandled DyeColor " . $block->getColor()->name()) + })->writeBool(StateNames::LIT, $block->isLit())); + } + private function registerSerializers() : void{ $this->map(Blocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); $this->map(Blocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 993390e9e8..e1f6c19207 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Block; use pocketmine\block\Button; +use pocketmine\block\Candle; use pocketmine\block\Copper; use pocketmine\block\CopperSlab; use pocketmine\block\CopperStairs; @@ -55,6 +56,7 @@ use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateNames as StateNames; use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; @@ -70,6 +72,13 @@ final class BlockStateDeserializerHelper{ ->setPressed($in->readBool(BlockStateNames::BUTTON_PRESSED_BIT)); } + /** @throws BlockStateDeserializeException */ + public static function decodeCandle(Candle $block, BlockStateReader $in) : Candle{ + return $block + ->setCount($in->readBoundedInt(StateNames::CANDLES, 0, 3) + 1) + ->setLit($in->readBool(StateNames::LIT)); + } + /** * @phpstan-template TCrops of Crops * @phpstan-param TCrops $block diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index bc6b1aec99..cd16b45b79 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Button; +use pocketmine\block\Candle; use pocketmine\block\ChemistryTable; use pocketmine\block\Crops; use pocketmine\block\Door; @@ -47,6 +48,7 @@ use pocketmine\block\Wall; use pocketmine\block\WallSign; use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockStateNames; +use pocketmine\data\bedrock\block\BlockStateNames as StateNames; use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Facing; @@ -67,6 +69,12 @@ final class BlockStateSerializerHelper{ ->writeBool(BlockStateNames::BUTTON_PRESSED_BIT, $block->isPressed()); } + public static function encodeCandle(Candle $block, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeBool(StateNames::LIT, $block->isLit()) + ->writeInt(StateNames::CANDLES, $block->getCount() - 1); + } + public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeString(BlockStateNames::CHEMISTRY_TABLE_TYPE, $chemistryTableType) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 62da377d52..f3ea9ce4ec 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -59,6 +59,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize private array $deserializeFuncs = []; public function __construct(){ + $this->registerCandleDeserializers(); $this->registerDeserializers(); } @@ -92,6 +93,48 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map($id, fn(Reader $in) : Stair => Helper::decodeStairs($getBlock(), $in)); } + private function registerCandleDeserializers() : void{ + $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in)); + $dyedCandleDeserializer = fn(DyeColor $color) => fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in); + $this->map(Ids::BLACK_CANDLE, $dyedCandleDeserializer(DyeColor::BLACK())); + $this->map(Ids::BLUE_CANDLE, $dyedCandleDeserializer(DyeColor::BLUE())); + $this->map(Ids::BROWN_CANDLE, $dyedCandleDeserializer(DyeColor::BROWN())); + $this->map(Ids::CYAN_CANDLE, $dyedCandleDeserializer(DyeColor::CYAN())); + $this->map(Ids::GRAY_CANDLE, $dyedCandleDeserializer(DyeColor::GRAY())); + $this->map(Ids::GREEN_CANDLE, $dyedCandleDeserializer(DyeColor::GREEN())); + $this->map(Ids::LIGHT_BLUE_CANDLE, $dyedCandleDeserializer(DyeColor::LIGHT_BLUE())); + $this->map(Ids::LIGHT_GRAY_CANDLE, $dyedCandleDeserializer(DyeColor::LIGHT_GRAY())); + $this->map(Ids::LIME_CANDLE, $dyedCandleDeserializer(DyeColor::LIME())); + $this->map(Ids::MAGENTA_CANDLE, $dyedCandleDeserializer(DyeColor::MAGENTA())); + $this->map(Ids::ORANGE_CANDLE, $dyedCandleDeserializer(DyeColor::ORANGE())); + $this->map(Ids::PINK_CANDLE, $dyedCandleDeserializer(DyeColor::PINK())); + $this->map(Ids::PURPLE_CANDLE, $dyedCandleDeserializer(DyeColor::PURPLE())); + $this->map(Ids::RED_CANDLE, $dyedCandleDeserializer(DyeColor::RED())); + $this->map(Ids::WHITE_CANDLE, $dyedCandleDeserializer(DyeColor::WHITE())); + $this->map(Ids::YELLOW_CANDLE, $dyedCandleDeserializer(DyeColor::YELLOW())); + + $this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT))); + $cakeWithDyedCandleDeserializer = fn(DyeColor $color) => fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE() + ->setColor($color) + ->setLit($in->readBool(StateNames::LIT)); + $this->map(Ids::BLACK_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BLACK())); + $this->map(Ids::BLUE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BLUE())); + $this->map(Ids::BROWN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BROWN())); + $this->map(Ids::CYAN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::CYAN())); + $this->map(Ids::GRAY_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::GRAY())); + $this->map(Ids::GREEN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::GREEN())); + $this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIGHT_BLUE())); + $this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIGHT_GRAY())); + $this->map(Ids::LIME_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIME())); + $this->map(Ids::MAGENTA_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::MAGENTA())); + $this->map(Ids::ORANGE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::ORANGE())); + $this->map(Ids::PINK_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::PINK())); + $this->map(Ids::PURPLE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::PURPLE())); + $this->map(Ids::RED_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::RED())); + $this->map(Ids::WHITE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::WHITE())); + $this->map(Ids::YELLOW_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::YELLOW())); + } + private function registerDeserializers() : void{ $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a38d5e61c1..5c72f1fc15 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -51,6 +51,7 @@ final class StringToItemParser extends StringToTParser{ //wall and floor banner are the same item $result->registerBlock($prefix("banner"), fn() => Blocks::BANNER()->setColor($color)); $result->registerBlock($prefix("bed"), fn() => Blocks::BED()->setColor($color)); + $result->registerBlock($prefix("candle"), fn() => Blocks::DYED_CANDLE()->setColor($color)); $result->registerBlock($prefix("carpet"), fn() => Blocks::CARPET()->setColor($color)); $result->registerBlock($prefix("concrete"), fn() => Blocks::CONCRETE()->setColor($color)); $result->registerBlock($prefix("concrete_powder"), fn() => Blocks::CONCRETE_POWDER()->setColor($color)); @@ -181,6 +182,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cake", fn() => Blocks::CAKE()); $result->registerBlock("cake_block", fn() => Blocks::CAKE()); $result->registerBlock("calcite", fn() => Blocks::CALCITE()); + $result->registerBlock("candle", fn() => Blocks::CANDLE()); $result->registerBlock("carpet", fn() => Blocks::CARPET()); $result->registerBlock("carrot_block", fn() => Blocks::CARROTS()); $result->registerBlock("carrots", fn() => Blocks::CARROTS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 9324b8d134..b265f2463a 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From d0067cfac556c62bac464a3a8aadff4b70274847 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 00:12:02 +0100 Subject: [PATCH 0329/1858] TNT now ignites when hit by a burning projectile --- src/block/TNT.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/block/TNT.php b/src/block/TNT.php index 30ebb42f64..a7d77a44e7 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -29,10 +29,12 @@ use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; use pocketmine\entity\projectile\Arrow; +use pocketmine\entity\projectile\Projectile; use pocketmine\item\Durable; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\FlintSteel; use pocketmine\item\Item; +use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\utils\Random; @@ -138,4 +140,10 @@ class TNT extends Opaque{ public function onIncinerate() : void{ $this->ignite(); } + + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + if($projectile->isOnFire()){ + $this->ignite(); + } + } } From 7dd88765156014b61ff987e4aeda3d81aafc87ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 00:23:12 +0100 Subject: [PATCH 0330/1858] TNT: remove the old unreliable way of ignition on burning arrow collide --- src/block/TNT.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/block/TNT.php b/src/block/TNT.php index a7d77a44e7..1a749bdd25 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -25,10 +25,8 @@ namespace pocketmine\block; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; -use pocketmine\entity\projectile\Arrow; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Durable; use pocketmine\item\enchantment\VanillaEnchantments; @@ -103,18 +101,6 @@ class TNT extends Opaque{ return false; } - public function hasEntityCollision() : bool{ - return true; - } - - public function onEntityInside(Entity $entity) : bool{ - if($entity instanceof Arrow && $entity->isOnFire()){ - $this->ignite(); - return false; - } - return true; - } - public function ignite(int $fuse = 80) : void{ $this->position->getWorld()->setBlock($this->position, VanillaBlocks::AIR()); From 0c7370e5645be06a659e228431d83b661df7c3da Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 16:07:16 +0100 Subject: [PATCH 0331/1858] Added wither rose --- src/block/BlockTypeIds.php | 3 +- src/block/VanillaBlocks.php | 2 + src/block/WitherRose.php | 78 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 1 + .../BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/block/WitherRose.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 955d43dd19..5197b672f1 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -688,6 +688,7 @@ final class BlockTypeIds{ public const DYED_CANDLE = 10661; public const CAKE_WITH_CANDLE = 10662; public const CAKE_WITH_DYED_CANDLE = 10663; + public const WITHER_ROSE = 10664; - public const FIRST_UNUSED_BLOCK_ID = 10664; + public const FIRST_UNUSED_BLOCK_ID = 10665; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 7fdaa4663b..377b5a962e 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -696,6 +696,7 @@ use function mb_strtolower; * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() * @method static Wheat WHEAT() * @method static Flower WHITE_TULIP() + * @method static WitherRose WITHER_ROSE() * @method static Wool WOOL() */ final class VanillaBlocks{ @@ -1356,6 +1357,7 @@ final class VanillaBlocks{ private static function registerBlocksR13() : void{ self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); + self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", BreakInfo::instant())); } private static function registerBlocksR14() : void{ diff --git a/src/block/WitherRose.php b/src/block/WitherRose.php new file mode 100644 index 0000000000..a5c64592f8 --- /dev/null +++ b/src/block/WitherRose.php @@ -0,0 +1,78 @@ +getTypeId()){ + BlockTypeIds::GRASS, + BlockTypeIds::DIRT, + BlockTypeIds::FARMLAND, + BlockTypeIds::MYCELIUM, + BlockTypeIds::PODZOL, + BlockTypeIds::NETHERRACK, + BlockTypeIds::SOUL_SAND, + BlockTypeIds::SOUL_SOIL => true, + //TODO: moss, mud, rooted dirt + default => false + }; + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + return false; + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function hasEntityCollision() : bool{ return true; } + + public function onEntityInside(Entity $entity) : bool{ + if($entity instanceof Living && !$entity->getEffects()->has(VanillaEffects::WITHER())){ + $entity->getEffects()->add(new EffectInstance(VanillaEffects::WITHER(), 40)); + } + return true; + } + + public function getFlameEncouragement() : int{ return 60; } + + public function getFlammability() : int{ return 100; } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index c69537b416..9ea1939ef3 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1377,6 +1377,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); + $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); $this->map(Blocks::WOOL(), function(Wool $block) : Writer{ return Writer::create(Ids::WOOL) ->writeColor($block->getColor()); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index f3ea9ce4ec..49901a2f24 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -1273,6 +1273,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WEB, fn() => Blocks::COBWEB()); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); + $this->map(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 5c72f1fc15..465257a079 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1058,6 +1058,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); + $result->registerBlock("wither_rose", fn() => Blocks::WITHER_ROSE()); $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::WITHER_SKELETON())); $result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false)); $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); From 323d31005fab00783647eb52b430dfce6b7c56fe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 16:24:20 +0100 Subject: [PATCH 0332/1858] Added glowing item frames --- src/block/ItemFrame.php | 20 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 2 +- .../convert/BlockStateDeserializerHelper.php | 10 ++++++++++ .../BlockStateToBlockObjectDeserializer.php | 8 ++------ src/data/bedrock/item/ItemDeserializer.php | 4 ++-- src/data/bedrock/item/ItemSerializer.php | 3 ++- src/item/StringToItemParser.php | 10 ++++++---- .../block_factory_consistency_check.json | 2 +- 8 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index cbaed26ec5..831f39760b 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -41,12 +41,24 @@ class ItemFrame extends Flowable{ public const ROTATIONS = 8; + protected bool $glowing = false; + protected bool $hasMap = false; //makes frame appear large if set protected ?Item $framedItem = null; protected int $itemRotation = 0; protected float $itemDropChance = 1.0; + public function getRequiredTypeDataBits() : int{ return 1; } + + protected function decodeType(RuntimeDataReader $r) : void{ + $this->glowing = $r->readBool(); + } + + protected function encodeType(RuntimeDataWriter $w) : void{ + $w->writeBool($this->glowing); + } + public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ @@ -133,6 +145,14 @@ class ItemFrame extends Flowable{ return $this; } + public function isGlowing() : bool{ return $this->glowing; } + + /** @return $this */ + public function setGlowing(bool $glowing) : self{ + $this->glowing = $glowing; + return $this; + } + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($this->framedItem !== null){ $this->itemRotation = ($this->itemRotation + 1) % self::ROTATIONS; diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 9ea1939ef3..2ad760c621 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -908,7 +908,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::IRON_ORE(), Ids::IRON_ORE); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ - return Writer::create(Ids::FRAME) + return Writer::create($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME) ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) ->writeFacingDirection($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index e1f6c19207..b2809d93f1 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -36,6 +36,7 @@ use pocketmine\block\FenceGate; use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; use pocketmine\block\GlazedTerracotta; +use pocketmine\block\ItemFrame; use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; @@ -48,6 +49,7 @@ use pocketmine\block\Trapdoor; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; +use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; @@ -170,6 +172,14 @@ final class BlockStateDeserializerHelper{ ->setFacing($in->readHorizontalFacing()); } + public static function decodeItemFrame(BlockStateReader $in, bool $glowing) : ItemFrame{ + $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is + return Blocks::ITEM_FRAME() + ->setFacing($in->readFacingDirection()) + ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)) + ->setGlowing($glowing); + } + /** @throws BlockStateDeserializeException */ public static function decodeLiquid(Liquid $block, BlockStateReader $in, bool $still) : Liquid{ $fluidHeightState = $in->readBoundedInt(BlockStateNames::LIQUID_DEPTH, 0, 15); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 49901a2f24..3c5a64e534 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -614,12 +614,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in)); $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in)); - $this->map(Ids::FRAME, function(Reader $in) : Block{ - $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is - return Blocks::ITEM_FRAME() - ->setFacing($in->readFacingDirection()) - ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); - }); + $this->map(Ids::FRAME, fn(Reader $in) => Helper::decodeItemFrame($in, false)); $this->map(Ids::FROSTED_ICE, function(Reader $in) : Block{ return Blocks::FROSTED_ICE() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); @@ -632,6 +627,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); $this->map(Ids::GLASS, fn() => Blocks::GLASS()); $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); + $this->map(Ids::GLOW_FRAME, fn(Reader $in) => Helper::decodeItemFrame($in, true)); $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); $this->map(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); $this->map(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index d4711f8910..86e41bcca8 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -345,7 +345,7 @@ final class ItemDeserializer{ //TODO: minecraft:flower_banner_pattern $this->map(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()->asItem()); //TODO: minecraft:fox_spawn_egg - $this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->asItem()); + $this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)->asItem()); //TODO: minecraft:frog_spawn_egg //TODO: minecraft:ghast_spawn_egg $this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR()); @@ -353,7 +353,7 @@ final class ItemDeserializer{ $this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON()); //TODO: minecraft:globe_banner_pattern //TODO: minecraft:glow_berries - //TODO: minecraft:glow_frame + $this->map(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)->asItem()); $this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC()); //TODO: minecraft:glow_squid_spawn_egg //TODO: minecraft:glow_stick diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index c6998aa1e5..1da1395c65 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Bed; use pocketmine\block\Block; +use pocketmine\block\ItemFrame; use pocketmine\block\Skull; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; @@ -233,7 +234,7 @@ final class ItemSerializer{ $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); $this->mapBlock(Blocks::HOPPER(), self::id(Ids::HOPPER)); $this->mapBlock(Blocks::IRON_DOOR(), self::id(Ids::IRON_DOOR)); - $this->mapBlock(Blocks::ITEM_FRAME(), self::id(Ids::FRAME)); + $this->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); $this->mapBlock(Blocks::JUNGLE_DOOR(), self::id(Ids::JUNGLE_DOOR)); $this->mapBlock(Blocks::MANGROVE_DOOR(), self::id(Ids::MANGROVE_DOOR)); $this->mapBlock(Blocks::NETHER_WART(), self::id(Ids::NETHER_WART)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 465257a079..6042fb3b7d 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -605,8 +605,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("flower_pot_block", fn() => Blocks::FLOWER_POT()); $result->registerBlock("flowing_lava", fn() => Blocks::LAVA()); $result->registerBlock("flowing_water", fn() => Blocks::WATER()); - $result->registerBlock("frame", fn() => Blocks::ITEM_FRAME()); - $result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME()); + $result->registerBlock("frame", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); $result->registerBlock("frosted_ice", fn() => Blocks::FROSTED_ICE()); $result->registerBlock("furnace", fn() => Blocks::FURNACE()); $result->registerBlock("gilded_blackstone", fn() => Blocks::GILDED_BLACKSTONE()); @@ -614,6 +614,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("glass_pane", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glass_panel", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA()); + $result->registerBlock("glow_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(true)); + $result->registerBlock("glow_item_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(true)); $result->registerBlock("glowing_obsidian", fn() => Blocks::GLOWING_OBSIDIAN()); $result->registerBlock("glowing_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true)); $result->registerBlock("glowingobsidian", fn() => Blocks::GLOWING_OBSIDIAN()); @@ -668,8 +670,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("iron_ore", fn() => Blocks::IRON_ORE()); $result->registerBlock("iron_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY()); $result->registerBlock("iron_trapdoor", fn() => Blocks::IRON_TRAPDOOR()); - $result->registerBlock("item_frame", fn() => Blocks::ITEM_FRAME()); - $result->registerBlock("item_frame_block", fn() => Blocks::ITEM_FRAME()); + $result->registerBlock("item_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $result->registerBlock("item_frame_block", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); $result->registerBlock("jack_o_lantern", fn() => Blocks::LIT_PUMPKIN()); $result->registerBlock("jukebox", fn() => Blocks::JUKEBOX()); $result->registerBlock("jungle_button", fn() => Blocks::JUNGLE_BUTTON()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index b265f2463a..50f3602480 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From d321094081a5c657bab123cee7dbbf83ef41942f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 16:47:55 +0100 Subject: [PATCH 0333/1858] Added hanging roots --- src/block/BlockTypeIds.php | 3 +- src/block/HangingRoots.php | 58 +++++++++++++++++++ src/block/VanillaBlocks.php | 3 + .../BlockObjectToBlockStateSerializer.php | 1 + .../BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/block/HangingRoots.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 5197b672f1..11c6b87da4 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -689,6 +689,7 @@ final class BlockTypeIds{ public const CAKE_WITH_CANDLE = 10662; public const CAKE_WITH_DYED_CANDLE = 10663; public const WITHER_ROSE = 10664; + public const HANGING_ROOTS = 10665; - public const FIRST_UNUSED_BLOCK_ID = 10665; + public const FIRST_UNUSED_BLOCK_ID = 10666; } diff --git a/src/block/HangingRoots.php b/src/block/HangingRoots.php new file mode 100644 index 0000000000..cd85bcea79 --- /dev/null +++ b/src/block/HangingRoots.php @@ -0,0 +1,58 @@ +isSolid(); //TODO: not sure if this is the correct logic + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$blockReplace->getSide(Facing::UP)->isSolid()){ + return false; + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function getDropsForIncompatibleTool(Item $item) : array{ + if($item->hasEnchantment(VanillaEnchantments::SILK_TOUCH())){ + return $this->getDropsForCompatibleTool($item); + } + return []; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 377b5a962e..a3d0514e4a 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -406,6 +406,7 @@ use function mb_strtolower; * @method static GrassPath GRASS_PATH() * @method static Gravel GRAVEL() * @method static Torch GREEN_TORCH() + * @method static HangingRoots HANGING_ROOTS() * @method static HardenedClay HARDENED_CLAY() * @method static HardenedGlass HARDENED_GLASS() * @method static HardenedGlassPane HARDENED_GLASS_PANE() @@ -1478,6 +1479,8 @@ final class VanillaBlocks{ $cakeBreakInfo = new BreakInfo(0.5); self::register("cake_with_candle", new CakeWithCandle(new BID(Ids::CAKE_WITH_CANDLE), "Cake With Candle", $cakeBreakInfo)); self::register("cake_with_dyed_candle", new CakeWithDyedCandle(new BID(Ids::CAKE_WITH_DYED_CANDLE), "Cake With Dyed Candle", $cakeBreakInfo)); + + self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", BreakInfo::instant(ToolType::SHEARS, 1))); } private static function registerMudBlocks() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 2ad760c621..7ca09189c3 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -872,6 +872,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); + $this->mapSimple(Blocks::HANGING_ROOTS(), Ids::HANGING_ROOTS); $this->mapSimple(Blocks::HARDENED_CLAY(), Ids::HARDENED_CLAY); $this->mapSimple(Blocks::HARDENED_GLASS(), Ids::HARD_GLASS); $this->mapSimple(Blocks::HARDENED_GLASS_PANE(), Ids::HARD_GLASS_PANE); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 3c5a64e534..f12559ffc8 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -643,6 +643,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); + $this->map(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 6042fb3b7d..fb034e1098 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -634,6 +634,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("grass_path", fn() => Blocks::GRASS_PATH()); $result->registerBlock("gravel", fn() => Blocks::GRAVEL()); $result->registerBlock("green_torch", fn() => Blocks::GREEN_TORCH()); + $result->registerBlock("hanging_roots", fn() => Blocks::HANGING_ROOTS()); $result->registerBlock("hard_glass", fn() => Blocks::HARDENED_GLASS()); $result->registerBlock("hard_glass_pane", fn() => Blocks::HARDENED_GLASS_PANE()); $result->registerBlock("hard_stained_glass", fn() => Blocks::STAINED_HARDENED_GLASS()); From 91719051e29466cb4b63b42514cdfc72860fd2fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 16:50:08 +0100 Subject: [PATCH 0334/1858] BlockStateToBlockObjectDeserializer: removed TODO mess these were useful when writing the initial version from scratch; not so much for implementing random blocks --- .../BlockStateToBlockObjectDeserializer.php | 1477 ----------------- 1 file changed, 1477 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index f12559ffc8..7ca7bbef7f 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -1290,1483 +1290,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); - //$this->map(Ids::ALLOW, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::AMETHYST_CLUSTER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::AZALEA, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::AZALEA_LEAVES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::AZALEA_LEAVES_FLOWERED, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BEE_NEST, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::BEEHIVE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * honey_level (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::BIG_DRIPLEAF, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * big_dripleaf_head (ByteTag) = 0, 1 - * big_dripleaf_tilt (StringTag) = full_tilt, none, partial_tilt, unstable - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::BLACK_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BLACK_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BLUE_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BLUE_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BORDER_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BROWN_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BROWN_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BUBBLE_COLUMN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * drag_down (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::BUDDING_AMETHYST, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CALCITE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CAMERA, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CAMPFIRE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * extinguished (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CARTOGRAPHY_TABLE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CAULDRON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * cauldron_liquid (StringTag) = lava, powder_snow, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->map(Ids::CAVE_VINES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * growing_plant_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::CHAIN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::CHAIN_COMMAND_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::CHISELED_DEEPSLATE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CHISELED_NETHER_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CHORUS_FLOWER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * age (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::CHORUS_PLANT, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CLIENT_REQUEST_PLACEHOLDER_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::COBBLED_DEEPSLATE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::COBBLED_DEEPSLATE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::COBBLED_DEEPSLATE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::COBBLED_DEEPSLATE_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::COMMAND_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::COMPOSTER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * composter_fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8 - */ - //}); - //$this->map(Ids::CONDUIT, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::COPPER_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::COPPER_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRACKED_DEEPSLATE_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRACKED_DEEPSLATE_TILES, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRACKED_NETHER_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_BUTTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::CRIMSON_DOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CRIMSON_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CRIMSON_FENCE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_FENCE_GATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CRIMSON_FUNGUS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_HYPHAE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::CRIMSON_NYLIUM, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_PLANKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_PRESSURE_PLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::CRIMSON_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CRIMSON_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CRIMSON_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::CRIMSON_STANDING_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::CRIMSON_STEM, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::CRIMSON_TRAPDOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CRIMSON_WALL_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::CRYING_OBSIDIAN, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::CYAN_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::CYAN_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_BRICK_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_BRICK_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::DEEPSLATE_BRICK_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_COAL_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_COPPER_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_DIAMOND_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_EMERALD_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_GOLD_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_IRON_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_LAPIS_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_REDSTONE_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DEEPSLATE_TILE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_TILE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_TILE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::DEEPSLATE_TILE_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DEEPSLATE_TILES, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DENY, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DIRT_WITH_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DISPENSER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::DRIPSTONE_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::DROPPER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * triggered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::END_GATEWAY, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::END_PORTAL, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::EXPOSED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::EXPOSED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::EXPOSED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::EXPOSED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::FLOWERING_AZALEA, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::FROG_SPAWN, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::GILDED_BLACKSTONE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::GLOW_FRAME, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * item_frame_map_bit (ByteTag) = 0, 1 - * item_frame_photo_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::GLOW_LICHEN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 - */ - //}); - //$this->map(Ids::GRAY_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::GRAY_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::GREEN_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::GREEN_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::GRINDSTONE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * attachment (StringTag) = hanging, multiple, side, standing - * direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::HANGING_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::HONEY_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::HONEYCOMB_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::INFESTED_DEEPSLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::JIGSAW, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * rotation (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::KELP, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * kelp_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::LARGE_AMETHYST_BUD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::LAVA_CAULDRON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * cauldron_liquid (StringTag) = lava, powder_snow, water - * fill_level (IntTag) = 0, 1, 2, 3, 4, 5, 6 - */ - //}); - //$this->map(Ids::LIGHT_BLUE_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIGHT_GRAY_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIGHTNING_ROD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::LIME_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIME_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::LODESTONE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MAGENTA_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MAGENTA_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_BUTTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::MANGROVE_DOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_FENCE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MANGROVE_FENCE_GATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_LEAVES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * persistent_bit (ByteTag) = 0, 1 - * update_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_LOG, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::MANGROVE_PLANKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MANGROVE_PRESSURE_PLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::MANGROVE_PROPAGULE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * hanging (ByteTag) = 0, 1 - * propagule_stage (IntTag) = 0, 1, 2, 3, 4 - */ - //}); - //$this->map(Ids::MANGROVE_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MANGROVE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::MANGROVE_STANDING_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::MANGROVE_TRAPDOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MANGROVE_WALL_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::MANGROVE_WOOD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - * stripped_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MEDIUM_AMETHYST_BUD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::MOSS_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MOSS_CARPET, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MOVING_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MUD, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MUD_BRICK_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MUD_BRICK_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MUD_BRICK_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::MUD_BRICK_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::MUD_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::MUDDY_MANGROVE_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::NETHER_GOLD_ORE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::NETHER_SPROUTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::NETHERITE_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::OBSERVER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::OCHRE_FROGLIGHT, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::ORANGE_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::ORANGE_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::OXIDIZED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::OXIDIZED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::PACKED_MUD, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::PEARLESCENT_FROGLIGHT, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::PINK_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::PINK_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::PISTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::PISTON_ARM_COLLISION, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::POINTED_DRIPSTONE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * dripstone_thickness (StringTag) = base, frustum, merge, middle, tip - * hanging (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_DEEPSLATE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_DEEPSLATE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POLISHED_DEEPSLATE_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::POLISHED_DEEPSLATE_WALL, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * wall_connection_type_east (StringTag) = none, short, tall - * wall_connection_type_north (StringTag) = none, short, tall - * wall_connection_type_south (StringTag) = none, short, tall - * wall_connection_type_west (StringTag) = none, short, tall - * wall_post_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::POWDER_SNOW, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::PURPLE_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::PURPLE_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::QUARTZ_BRICKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::RED_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::RED_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::REINFORCED_DEEPSLATE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::REPEATING_COMMAND_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * conditional_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::RESPAWN_ANCHOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * respawn_anchor_charge (IntTag) = 0, 1, 2, 3, 4 - */ - //}); - //$this->map(Ids::SCAFFOLDING, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * stability (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7 - * stability_check (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SCULK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::SCULK_CATALYST, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * bloom (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SCULK_SENSOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * powered_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SCULK_SHRIEKER, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * active (ByteTag) = 0, 1 - * can_summon (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SCULK_VEIN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * multi_face_direction_bits (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 - */ - //}); - //$this->map(Ids::SEAGRASS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * sea_grass_type (StringTag) = default, double_bot, double_top - */ - //}); - //$this->map(Ids::SHROOMLIGHT, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::SMALL_AMETHYST_BUD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SMITHING_TABLE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::SOUL_CAMPFIRE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * extinguished (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SOUL_FIRE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::SOUL_LANTERN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * hanging (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::SOUL_SOIL, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::SOUL_TORCH, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * torch_facing_direction (StringTag) = east, north, south, top, unknown, west - */ - //}); - //$this->map(Ids::SPORE_BLOSSOM, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::STICKY_PISTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::STICKY_PISTON_ARM_COLLISION, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::STRIPPED_CRIMSON_HYPHAE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRIPPED_CRIMSON_STEM, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRIPPED_MANGROVE_LOG, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRIPPED_MANGROVE_WOOD, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRIPPED_WARPED_HYPHAE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRIPPED_WARPED_STEM, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::STRUCTURE_BLOCK, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * structure_block_type (StringTag) = corner, data, export, invalid, load, save - */ - //}); - //$this->map(Ids::STRUCTURE_VOID, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * structure_void_type (StringTag) = air, void - */ - //}); - //$this->map(Ids::TARGET, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::TINTED_GLASS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::TUFF, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::TURTLE_EGG, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * cracked_state (StringTag) = cracked, max_cracked, no_cracks - * turtle_egg_count (StringTag) = four_egg, one_egg, three_egg, two_egg - */ - //}); - //$this->map(Ids::TWISTING_VINES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * twisting_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::UNKNOWN, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::VERDANT_FROGLIGHT, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::WARPED_BUTTON, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * button_pressed_bit (ByteTag) = 0, 1 - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::WARPED_DOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * door_hinge_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - * upper_block_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WARPED_DOUBLE_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WARPED_FENCE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WARPED_FENCE_GATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * in_wall_bit (ByteTag) = 0, 1 - * open_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WARPED_FUNGUS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WARPED_HYPHAE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::WARPED_NYLIUM, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WARPED_PLANKS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WARPED_PRESSURE_PLATE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * redstone_signal (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::WARPED_ROOTS, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WARPED_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WARPED_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WARPED_STANDING_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * ground_sign_direction (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - */ - //}); - //$this->map(Ids::WARPED_STEM, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * pillar_axis (StringTag) = x, y, z - */ - //}); - //$this->map(Ids::WARPED_TRAPDOOR, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * direction (IntTag) = 0, 1, 2, 3 - * open_bit (ByteTag) = 0, 1 - * upside_down_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WARPED_WALL_SIGN, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * facing_direction (IntTag) = 0, 1, 2, 3, 4, 5 - */ - //}); - //$this->map(Ids::WARPED_WART_BLOCK, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_EXPOSED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_OXIDIZED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_WEATHERED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WEATHERED_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WEATHERED_CUT_COPPER, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::WEATHERED_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WEATHERED_CUT_COPPER_STAIRS, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * upside_down_bit (ByteTag) = 0, 1 - * weirdo_direction (IntTag) = 0, 1, 2, 3 - */ - //}); - //$this->map(Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * top_slot_bit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WEEPING_VINES, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * weeping_vines_age (IntTag) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 - */ - //}); - //$this->map(Ids::WHITE_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WHITE_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::WITHER_ROSE, function(Reader $in) : Block{ - /* TODO: Un-implemented block */ - //}); - //$this->map(Ids::YELLOW_CANDLE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * candles (IntTag) = 0, 1, 2, 3 - * lit (ByteTag) = 0, 1 - */ - //}); - //$this->map(Ids::YELLOW_CANDLE_CAKE, function(Reader $in) : Block{ - /* - * TODO: Un-implemented block - * lit (ByteTag) = 0, 1 - */ - //}); } /** @throws BlockStateDeserializeException */ From eb8fb63409f788bf2f7152b9ad199c6e5665306d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 18:01:47 +0100 Subject: [PATCH 0335/1858] Added cartography and smithing tables these have working inventories, and their crafting menus will 'just work' once the items for the associated recipes have been implemented (maps, netherite). --- composer.lock | 12 ++--- src/block/BlockTypeIds.php | 4 +- src/block/CartographyTable.php | 44 +++++++++++++++++++ src/block/SmithingTable.php | 44 +++++++++++++++++++ src/block/VanillaBlocks.php | 10 +++++ .../inventory/CartographyTableInventory.php | 37 ++++++++++++++++ .../inventory/SmithingTableInventory.php | 37 ++++++++++++++++ .../CraftingManagerFromDataHelper.php | 3 +- src/crafting/ShapelessRecipeType.php | 6 ++- .../BlockObjectToBlockStateSerializer.php | 2 + .../BlockStateToBlockObjectDeserializer.php | 2 + src/network/mcpe/InventoryManager.php | 4 ++ src/network/mcpe/cache/CraftingDataCache.php | 2 + src/network/mcpe/convert/TypeConverter.php | 4 ++ 14 files changed, 202 insertions(+), 9 deletions(-) create mode 100644 src/block/CartographyTable.php create mode 100644 src/block/SmithingTable.php create mode 100644 src/block/inventory/CartographyTableInventory.php create mode 100644 src/block/inventory/SmithingTableInventory.php diff --git a/composer.lock b/composer.lock index 0544435b1e..8f85da457e 100644 --- a/composer.lock +++ b/composer.lock @@ -329,16 +329,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "11.0.0+bedrock-1.19.10", + "version": "11.0.3+bedrock-1.19.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "705f928bd010ba093d8781d20006e4cd5f79f335" + "reference": "18879218f9d05685ab6f8f68df4cb9c548978657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/705f928bd010ba093d8781d20006e4cd5f79f335", - "reference": "705f928bd010ba093d8781d20006e4cd5f79f335", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/18879218f9d05685ab6f8f68df4cb9c548978657", + "reference": "18879218f9d05685ab6f8f68df4cb9c548978657", "shasum": "" }, "require": { @@ -370,9 +370,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/11.0.0+bedrock-1.19.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/11.0.3+bedrock-1.19.10" }, - "time": "2022-07-12T23:47:47+00:00" + "time": "2022-07-14T16:54:49+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 11c6b87da4..6958efb547 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -690,6 +690,8 @@ final class BlockTypeIds{ public const CAKE_WITH_DYED_CANDLE = 10663; public const WITHER_ROSE = 10664; public const HANGING_ROOTS = 10665; + public const CARTOGRAPHY_TABLE = 10666; + public const SMITHING_TABLE = 10667; - public const FIRST_UNUSED_BLOCK_ID = 10666; + public const FIRST_UNUSED_BLOCK_ID = 10668; } diff --git a/src/block/CartographyTable.php b/src/block/CartographyTable.php new file mode 100644 index 0000000000..195c180706 --- /dev/null +++ b/src/block/CartographyTable.php @@ -0,0 +1,44 @@ +setCurrentWindow(new CartographyTableInventory($this->position)); + } + + return true; + } + + public function getFuelTime() : int{ + return 300; + } +} diff --git a/src/block/SmithingTable.php b/src/block/SmithingTable.php new file mode 100644 index 0000000000..5c4976cae5 --- /dev/null +++ b/src/block/SmithingTable.php @@ -0,0 +1,44 @@ +setCurrentWindow(new SmithingTableInventory($this->position)); + } + + return true; + } + + public function getFuelTime() : int{ + return 300; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a3d0514e4a..3939bb3b7a 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -141,6 +141,7 @@ use function mb_strtolower; * @method static Candle CANDLE() * @method static Carpet CARPET() * @method static Carrot CARROTS() + * @method static CartographyTable CARTOGRAPHY_TABLE() * @method static CarvedPumpkin CARVED_PUMPKIN() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() @@ -612,6 +613,7 @@ use function mb_strtolower; * @method static Opaque SHROOMLIGHT() * @method static ShulkerBox SHULKER_BOX() * @method static Slime SLIME() + * @method static SmithingTable SMITHING_TABLE() * @method static Furnace SMOKER() * @method static Opaque SMOOTH_BASALT() * @method static Opaque SMOOTH_QUARTZ() @@ -1158,6 +1160,7 @@ final class VanillaBlocks{ self::registerBlocksR17(); self::registerMudBlocks(); + self::registerCraftingTables(); self::registerOres(); self::registerWoodenBlocks(); } @@ -1356,6 +1359,13 @@ final class VanillaBlocks{ self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); } + private static function registerCraftingTables() : void{ + //TODO: this is the same for all wooden crafting blocks + $craftingBlockBreakInfo = new BreakInfo(2.5, ToolType::AXE); + self::register("cartography_table", new CartographyTable(new BID(Ids::CARTOGRAPHY_TABLE), "Cartography Table", $craftingBlockBreakInfo)); + self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); + } + private static function registerBlocksR13() : void{ self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", BreakInfo::instant())); diff --git a/src/block/inventory/CartographyTableInventory.php b/src/block/inventory/CartographyTableInventory.php new file mode 100644 index 0000000000..7bd9146ac6 --- /dev/null +++ b/src/block/inventory/CartographyTableInventory.php @@ -0,0 +1,37 @@ +holder = $holder; + parent::__construct(2); + } +} diff --git a/src/block/inventory/SmithingTableInventory.php b/src/block/inventory/SmithingTableInventory.php new file mode 100644 index 0000000000..a01b80cad0 --- /dev/null +++ b/src/block/inventory/SmithingTableInventory.php @@ -0,0 +1,37 @@ +holder = $holder; + parent::__construct(2); + } +} diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 74fe74a7f2..e48b20ec52 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -213,7 +213,8 @@ final class CraftingManagerFromDataHelper{ $recipeType = match($recipe->block){ "crafting_table" => ShapelessRecipeType::CRAFTING(), "stonecutter" => ShapelessRecipeType::STONECUTTER(), - //TODO: Cartography Table + "smithing_table" => ShapelessRecipeType::SMITHING(), + "cartography_table" => ShapelessRecipeType::CARTOGRAPHY(), default => null }; if($recipeType === null){ diff --git a/src/crafting/ShapelessRecipeType.php b/src/crafting/ShapelessRecipeType.php index e7d3242d57..b115c22f49 100644 --- a/src/crafting/ShapelessRecipeType.php +++ b/src/crafting/ShapelessRecipeType.php @@ -31,7 +31,9 @@ use pocketmine\utils\EnumTrait; * @see build/generate-registry-annotations.php * @generate-registry-docblock * + * @method static ShapelessRecipeType CARTOGRAPHY() * @method static ShapelessRecipeType CRAFTING() + * @method static ShapelessRecipeType SMITHING() * @method static ShapelessRecipeType STONECUTTER() */ final class ShapelessRecipeType{ @@ -40,7 +42,9 @@ final class ShapelessRecipeType{ protected static function setup() : void{ self::registerAll( new self("crafting"), - new self("stonecutter") + new self("stonecutter"), + new self("smithing"), + new self("cartography") ); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 7ca09189c3..039b4aab1f 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -443,6 +443,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeColor($block->getColor()); }); $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); + $this->mapSimple(Blocks::CARTOGRAPHY_TABLE(), Ids::CARTOGRAPHY_TABLE); $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ return Writer::create(Ids::CARVED_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); @@ -1205,6 +1206,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); $this->mapSimple(Blocks::SLIME(), Ids::SLIME); + $this->mapSimple(Blocks::SMITHING_TABLE(), Ids::SMITHING_TABLE); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); $this->mapSimple(Blocks::SMOOTH_BASALT(), Ids::SMOOTH_BASALT); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 7ca7bbef7f..27fa0da74d 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -261,6 +261,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setColor($in->readColor()); }); $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); + $this->map(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE()); $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ return Blocks::CARVED_PUMPKIN() ->setFacing($in->readLegacyHorizontalFacing()); @@ -1055,6 +1056,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readFacingWithoutDown()); }); $this->map(Ids::SLIME, fn() => Blocks::SLIME()); + $this->map(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); $this->map(Ids::SMOKER, function(Reader $in) : Block{ return Blocks::SMOKER() ->setFacing($in->readHorizontalFacing()) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 4b7f870f84..723e02d13d 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -26,11 +26,13 @@ namespace pocketmine\network\mcpe; use pocketmine\block\inventory\AnvilInventory; use pocketmine\block\inventory\BlockInventory; use pocketmine\block\inventory\BrewingStandInventory; +use pocketmine\block\inventory\CartographyTableInventory; use pocketmine\block\inventory\CraftingTableInventory; use pocketmine\block\inventory\EnchantInventory; use pocketmine\block\inventory\FurnaceInventory; use pocketmine\block\inventory\HopperInventory; use pocketmine\block\inventory\LoomInventory; +use pocketmine\block\inventory\SmithingTableInventory; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\crafting\FurnaceType; use pocketmine\inventory\CreativeInventory; @@ -225,6 +227,8 @@ class InventoryManager{ $inv instanceof HopperInventory => WindowTypes::HOPPER, $inv instanceof CraftingTableInventory => WindowTypes::WORKBENCH, $inv instanceof StonecutterInventory => WindowTypes::STONECUTTER, + $inv instanceof CartographyTableInventory => WindowTypes::CARTOGRAPHY, + $inv instanceof SmithingTableInventory => WindowTypes::SMITHING_TABLE, default => WindowTypes::CONTAINER }; return [ContainerOpenPacket::blockInv($id, $windowType, $blockPosition)]; diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 84ff5e7399..740576521f 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -86,6 +86,8 @@ final class CraftingDataCache{ $typeTag = match($recipe->getType()->id()){ ShapelessRecipeType::CRAFTING()->id() => CraftingRecipeBlockName::CRAFTING_TABLE, ShapelessRecipeType::STONECUTTER()->id() => CraftingRecipeBlockName::STONECUTTER, + ShapelessRecipeType::CARTOGRAPHY()->id() => CraftingRecipeBlockName::SMITHING_TABLE, + ShapelessRecipeType::SMITHING()->id() => CraftingRecipeBlockName::SMITHING_TABLE, default => throw new AssumptionFailedError("Unreachable"), }; $recipesWithTypeIds[] = new ProtocolShapelessRecipe( diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 179fd8e8e0..a0d4fcd8b0 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -24,9 +24,11 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\block\inventory\AnvilInventory; +use pocketmine\block\inventory\CartographyTableInventory; use pocketmine\block\inventory\CraftingTableInventory; use pocketmine\block\inventory\EnchantInventory; use pocketmine\block\inventory\LoomInventory; +use pocketmine\block\inventory\SmithingTableInventory; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\block\VanillaBlocks; use pocketmine\crafting\ExactRecipeIngredient; @@ -257,6 +259,8 @@ class TypeConverter{ $current instanceof LoomInventory => UIInventorySlotOffset::LOOM, $current instanceof StonecutterInventory => [UIInventorySlotOffset::STONE_CUTTER_INPUT => StonecutterInventory::SLOT_INPUT], $current instanceof CraftingTableInventory => UIInventorySlotOffset::CRAFTING3X3_INPUT, + $current instanceof CartographyTableInventory => UIInventorySlotOffset::CARTOGRAPHY_TABLE, + $current instanceof SmithingTableInventory => UIInventorySlotOffset::SMITHING_TABLE, default => null }; if($slotMap !== null){ From b4ce5ed515b219ad94f4659a2d38c2312229103f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 19:16:15 +0100 Subject: [PATCH 0336/1858] ItemDeserializer: throw a more specific exception on unknown items --- src/data/bedrock/item/ItemDeserializer.php | 5 +++- .../item/ItemTypeDeserializeException.php | 2 +- .../item/UnsupportedItemTypeException.php | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/data/bedrock/item/UnsupportedItemTypeException.php diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 86e41bcca8..fce02de489 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -30,6 +30,7 @@ use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateDeserializer; +use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; @@ -71,6 +72,8 @@ final class ItemDeserializer{ //TODO: this is rough duct tape; we need a better way to deal with this try{ $block = $this->blockStateDeserializer->deserialize($blockData); + }catch(UnsupportedBlockStateException $e){ + throw new UnsupportedItemTypeException($e->getMessage(), 0, $e); }catch(BlockStateDeserializeException $e){ throw new ItemTypeDeserializeException("Failed to deserialize item data: " . $e->getMessage(), 0, $e); } @@ -80,7 +83,7 @@ final class ItemDeserializer{ } $id = $data->getName(); if(!isset($this->deserializers[$id])){ - throw new ItemTypeDeserializeException("No deserializer found for ID $id"); + throw new UnsupportedItemTypeException("No deserializer found for ID $id"); } return ($this->deserializers[$id])($data); diff --git a/src/data/bedrock/item/ItemTypeDeserializeException.php b/src/data/bedrock/item/ItemTypeDeserializeException.php index 21ee91f136..53ae790530 100644 --- a/src/data/bedrock/item/ItemTypeDeserializeException.php +++ b/src/data/bedrock/item/ItemTypeDeserializeException.php @@ -23,6 +23,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; -final class ItemTypeDeserializeException extends \RuntimeException{ +class ItemTypeDeserializeException extends \RuntimeException{ } diff --git a/src/data/bedrock/item/UnsupportedItemTypeException.php b/src/data/bedrock/item/UnsupportedItemTypeException.php new file mode 100644 index 0000000000..7f579fd13f --- /dev/null +++ b/src/data/bedrock/item/UnsupportedItemTypeException.php @@ -0,0 +1,28 @@ + Date: Thu, 14 Jul 2022 20:39:09 +0100 Subject: [PATCH 0337/1858] Added netherite blocks and items --- src/block/Block.php | 4 ++ src/block/BlockTypeIds.php | 3 +- src/block/VanillaBlocks.php | 5 +++ .../BlockObjectToBlockStateSerializer.php | 1 + .../BlockStateToBlockObjectDeserializer.php | 1 + src/data/bedrock/item/ItemDeserializer.php | 22 +++++------ src/data/bedrock/item/ItemSerializer.php | 11 ++++++ src/entity/object/ItemEntity.php | 4 ++ src/item/Armor.php | 4 ++ src/item/ArmorTypeInfo.php | 12 +++++- src/item/Item.php | 7 ++++ src/item/ItemBlock.php | 4 ++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 12 ++++++ src/item/TieredTool.php | 4 ++ src/item/ToolTier.php | 4 +- src/item/VanillaItems.php | 37 +++++++++++++++++-- 17 files changed, 119 insertions(+), 19 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 591f54922b..20f77c8f11 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -504,6 +504,10 @@ class Block{ return 64; } + public function isFireProofAsItem() : bool{ + return false; + } + /** * Returns the chance that the block will catch fire from nearby fire sources. Higher values lead to faster catching * fire. diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 6958efb547..8ef7a2ee2f 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -692,6 +692,7 @@ final class BlockTypeIds{ public const HANGING_ROOTS = 10665; public const CARTOGRAPHY_TABLE = 10666; public const SMITHING_TABLE = 10667; + public const NETHERITE = 10668; - public const FIRST_UNUSED_BLOCK_ID = 10668; + public const FIRST_UNUSED_BLOCK_ID = 10669; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 3939bb3b7a..c3a76bbeb3 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -496,6 +496,7 @@ use function mb_strtolower; * @method static Wall MUD_BRICK_WALL() * @method static MushroomStem MUSHROOM_STEM() * @method static Mycelium MYCELIUM() + * @method static Opaque NETHERITE() * @method static Netherrack NETHERRACK() * @method static Opaque NETHER_BRICKS() * @method static Fence NETHER_BRICK_FENCE() @@ -1380,6 +1381,10 @@ final class VanillaBlocks{ $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0))); + $netheriteBreakInfo = new BreakInfo(50, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0); + self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ + public function isFireProofAsItem() : bool{ return true; } + }); $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 039b4aab1f..71487e461b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1033,6 +1033,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); + $this->mapSimple(Blocks::NETHERITE(), Ids::NETHERITE_BLOCK); $this->mapSimple(Blocks::NETHERRACK(), Ids::NETHERRACK); $this->mapSimple(Blocks::NETHER_BRICKS(), Ids::NETHER_BRICK); $this->mapSimple(Blocks::NETHER_BRICK_FENCE(), Ids::NETHER_BRICK_FENCE); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 27fa0da74d..8923008dfe 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -840,6 +840,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); + $this->map(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE()); $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index fce02de489..dfa463bc8b 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -458,17 +458,17 @@ final class ItemDeserializer{ $this->map(Ids::NETHER_STAR, fn() => Items::NETHER_STAR()); $this->map(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()->asItem()); $this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK()); - //TODO: minecraft:netherite_axe - //TODO: minecraft:netherite_boots - //TODO: minecraft:netherite_chestplate - //TODO: minecraft:netherite_helmet - //TODO: minecraft:netherite_hoe - //TODO: minecraft:netherite_ingot - //TODO: minecraft:netherite_leggings - //TODO: minecraft:netherite_pickaxe - //TODO: minecraft:netherite_scrap - //TODO: minecraft:netherite_shovel - //TODO: minecraft:netherite_sword + $this->map(Ids::NETHERITE_AXE, fn() => Items::NETHERITE_AXE()); + $this->map(Ids::NETHERITE_BOOTS, fn() => Items::NETHERITE_BOOTS()); + $this->map(Ids::NETHERITE_CHESTPLATE, fn() => Items::NETHERITE_CHESTPLATE()); + $this->map(Ids::NETHERITE_HELMET, fn() => Items::NETHERITE_HELMET()); + $this->map(Ids::NETHERITE_HOE, fn() => Items::NETHERITE_HOE()); + $this->map(Ids::NETHERITE_INGOT, fn() => Items::NETHERITE_INGOT()); + $this->map(Ids::NETHERITE_LEGGINGS, fn() => Items::NETHERITE_LEGGINGS()); + $this->map(Ids::NETHERITE_PICKAXE, fn() => Items::NETHERITE_PICKAXE()); + $this->map(Ids::NETHERITE_SCRAP, fn() => Items::NETHERITE_SCRAP()); + $this->map(Ids::NETHERITE_SHOVEL, fn() => Items::NETHERITE_SHOVEL()); + $this->map(Ids::NETHERITE_SWORD, fn() => Items::NETHERITE_SWORD()); //TODO: minecraft:npc_spawn_egg $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); $this->map(Ids::OAK_SIGN, fn() => Blocks::OAK_SIGN()->asItem()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 1da1395c65..b652d3a3a3 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -436,6 +436,17 @@ final class ItemSerializer{ $this->map(Items::MINECART(), self::id(Ids::MINECART)); $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); + $this->map(Items::NETHERITE_AXE(), self::id(Ids::NETHERITE_AXE)); + $this->map(Items::NETHERITE_BOOTS(), self::id(Ids::NETHERITE_BOOTS)); + $this->map(Items::NETHERITE_CHESTPLATE(), self::id(Ids::NETHERITE_CHESTPLATE)); + $this->map(Items::NETHERITE_HELMET(), self::id(Ids::NETHERITE_HELMET)); + $this->map(Items::NETHERITE_HOE(), self::id(Ids::NETHERITE_HOE)); + $this->map(Items::NETHERITE_INGOT(), self::id(Ids::NETHERITE_INGOT)); + $this->map(Items::NETHERITE_LEGGINGS(), self::id(Ids::NETHERITE_LEGGINGS)); + $this->map(Items::NETHERITE_PICKAXE(), self::id(Ids::NETHERITE_PICKAXE)); + $this->map(Items::NETHERITE_SCRAP(), self::id(Ids::NETHERITE_SCRAP)); + $this->map(Items::NETHERITE_SHOVEL(), self::id(Ids::NETHERITE_SHOVEL)); + $this->map(Items::NETHERITE_SWORD(), self::id(Ids::NETHERITE_SWORD)); $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); $this->map(Items::NETHER_QUARTZ(), self::id(Ids::QUARTZ)); $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index b6b77ead9c..1c6f0ae13c 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -200,6 +200,10 @@ class ItemEntity extends Entity{ return $this->item; } + public function isFireProof() : bool{ + return $this->item->isFireProof(); + } + public function canCollideWith(Entity $entity) : bool{ return false; } diff --git a/src/item/Armor.php b/src/item/Armor.php index 19947dd450..5304309e38 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -68,6 +68,10 @@ class Armor extends Durable{ return 1; } + public function isFireProof() : bool{ + return $this->armorInfo->isFireProof(); + } + /** * Returns the dyed colour of this armour piece. This generally only applies to leather armour. */ diff --git a/src/item/ArmorTypeInfo.php b/src/item/ArmorTypeInfo.php index c6b25bd6aa..580b73df33 100644 --- a/src/item/ArmorTypeInfo.php +++ b/src/item/ArmorTypeInfo.php @@ -27,7 +27,9 @@ class ArmorTypeInfo{ public function __construct( private int $defensePoints, private int $maxDurability, - private int $armorSlot + private int $armorSlot, + private int $toughness = 0, + private bool $fireProof = false ){} public function getDefensePoints() : int{ @@ -41,4 +43,12 @@ class ArmorTypeInfo{ public function getArmorSlot() : int{ return $this->armorSlot; } + + public function getToughness() : int{ + return $this->toughness; + } + + public function isFireProof() : bool{ + return $this->fireProof; + } } diff --git a/src/item/Item.php b/src/item/Item.php index 9dbc1a4ab7..4f0b814bfa 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -467,6 +467,13 @@ class Item implements \JsonSerializable{ return $item; } + /** + * Returns whether this item can survive being dropped into lava, or fire. + */ + public function isFireProof() : bool{ + return false; + } + /** * Returns how many points of damage this item will deal to an entity when used as a weapon. */ diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 8eb46cbdd3..4ce6c29474 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -63,6 +63,10 @@ final class ItemBlock extends Item{ return $this->getBlock()->getFuelTime(); } + public function isFireProof() : bool{ + return $this->getBlock()->isFireProofAsItem(); + } + public function getMaxStackSize() : int{ return $this->getBlock()->getMaxStackSize(); } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 6db7f7536a..ff6ef0a046 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -293,6 +293,7 @@ final class ItemTypeIds{ public const RAW_IRON = 20254; public const RAW_GOLD = 20255; public const SPYGLASS = 20256; + public const NETHERITE_SCRAP = 20257; - public const FIRST_UNUSED_ITEM_ID = 20257; + public const FIRST_UNUSED_ITEM_ID = 20258; } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index fb034e1098..c96f2ead05 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -780,6 +780,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("nether_wart", fn() => Blocks::NETHER_WART()); $result->registerBlock("nether_wart_block", fn() => Blocks::NETHER_WART_BLOCK()); $result->registerBlock("nether_wart_plant", fn() => Blocks::NETHER_WART()); + $result->registerBlock("netherite_block", fn() => Blocks::NETHERITE()); $result->registerBlock("netherrack", fn() => Blocks::NETHERRACK()); $result->registerBlock("netherreactor", fn() => Blocks::NETHER_REACTOR_CORE()); $result->registerBlock("normal_stone_stairs", fn() => Blocks::STONE_STAIRS()); @@ -1325,6 +1326,17 @@ final class StringToItemParser extends StringToTParser{ $result->register("nether_quartz", fn() => Items::NETHER_QUARTZ()); $result->register("nether_star", fn() => Items::NETHER_STAR()); $result->register("netherbrick", fn() => Items::NETHER_BRICK()); + $result->register("netherite_axe", fn() => Items::NETHERITE_AXE()); + $result->register("netherite_boots", fn() => Items::NETHERITE_BOOTS()); + $result->register("netherite_chestplate", fn() => Items::NETHERITE_CHESTPLATE()); + $result->register("netherite_helmet", fn() => Items::NETHERITE_HELMET()); + $result->register("netherite_hoe", fn() => Items::NETHERITE_HOE()); + $result->register("netherite_ingot", fn() => Items::NETHERITE_INGOT()); + $result->register("netherite_leggings", fn() => Items::NETHERITE_LEGGINGS()); + $result->register("netherite_pickaxe", fn() => Items::NETHERITE_PICKAXE()); + $result->register("netherite_scrap", fn() => Items::NETHERITE_SCRAP()); + $result->register("netherite_shovel", fn() => Items::NETHERITE_SHOVEL()); + $result->register("netherite_sword", fn() => Items::NETHERITE_SWORD()); $result->register("netherstar", fn() => Items::NETHER_STAR()); $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION())); $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION())); diff --git a/src/item/TieredTool.php b/src/item/TieredTool.php index 0975d68d51..e7d4f22015 100644 --- a/src/item/TieredTool.php +++ b/src/item/TieredTool.php @@ -50,4 +50,8 @@ abstract class TieredTool extends Tool{ return 0; } + + public function isFireProof() : bool{ + return $this->tier->equals(ToolTier::NETHERITE()); + } } diff --git a/src/item/ToolTier.php b/src/item/ToolTier.php index 08d7c52b64..231e233c33 100644 --- a/src/item/ToolTier.php +++ b/src/item/ToolTier.php @@ -34,6 +34,7 @@ use pocketmine\utils\EnumTrait; * @method static ToolTier DIAMOND() * @method static ToolTier GOLD() * @method static ToolTier IRON() + * @method static ToolTier NETHERITE() * @method static ToolTier STONE() * @method static ToolTier WOOD() */ @@ -48,7 +49,8 @@ final class ToolTier{ new self("gold", 2, 33, 5, 12), new self("stone", 3, 132, 6, 4), new self("iron", 4, 251, 7, 6), - new self("diamond", 5, 1562, 8, 8) + new self("diamond", 5, 1562, 8, 8), + new self("netherite", 6, 2032, 9, 9) ); } diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index ffdab1910a..b229039ec9 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -210,6 +210,17 @@ use pocketmine\world\World; * @method static Minecart MINECART() * @method static MushroomStew MUSHROOM_STEW() * @method static Item NAUTILUS_SHELL() + * @method static Axe NETHERITE_AXE() + * @method static Armor NETHERITE_BOOTS() + * @method static Armor NETHERITE_CHESTPLATE() + * @method static Armor NETHERITE_HELMET() + * @method static Hoe NETHERITE_HOE() + * @method static Item NETHERITE_INGOT() + * @method static Armor NETHERITE_LEGGINGS() + * @method static Pickaxe NETHERITE_PICKAXE() + * @method static Item NETHERITE_SCRAP() + * @method static Shovel NETHERITE_SHOVEL() + * @method static Sword NETHERITE_SWORD() * @method static Item NETHER_BRICK() * @method static Item NETHER_QUARTZ() * @method static Item NETHER_STAR() @@ -446,6 +457,12 @@ final class VanillaItems{ self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); self::register("nether_star", new Item(new IID(Ids::NETHER_STAR), "Nether Star")); + self::register("netherite_ingot", new class(new IID(Ids::NETHERITE_INGOT), "Netherite Ingot") extends Item{ + public function isFireProof() : bool{ return true; } + }); + self::register("netherite_scrap", new class(new IID(Ids::NETHERITE_SCRAP), "Netherite Scrap") extends Item{ + public function isFireProof() : bool{ return true; } + }); self::register("oak_sign", new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); self::register("painting", new PaintingItem(new IID(Ids::PAINTING), "Painting")); self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); @@ -544,51 +561,63 @@ final class VanillaItems{ self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); + self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE())); self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); + self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE())); self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); + self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE())); self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); + self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE())); self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); + self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE())); self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); } private static function registerArmorItems() : void{ self::register("chainmail_boots", new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); + self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET, 2))); self::register("golden_boots", new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); self::register("iron_boots", new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); self::register("leather_boots", new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); + self::register("netherite_boots", new Armor(new IID(Ids::NETHERITE_BOOTS), "Netherite Boots", new ArmorTypeInfo(3, 482, ArmorInventory::SLOT_FEET, 3, true))); + self::register("chainmail_chestplate", new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); + self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST, 2))); self::register("golden_chestplate", new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); self::register("iron_chestplate", new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); self::register("leather_tunic", new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); + self::register("netherite_chestplate", new Armor(new IID(Ids::NETHERITE_CHESTPLATE), "Netherite Chestplate", new ArmorTypeInfo(8, 593, ArmorInventory::SLOT_CHEST, 3, true))); + self::register("chainmail_helmet", new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); + self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD, 2))); self::register("golden_helmet", new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); + self::register("netherite_helmet", new Armor(new IID(Ids::NETHERITE_HELMET), "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true))); + self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); + self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2))); self::register("golden_leggings", new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); self::register("iron_leggings", new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); self::register("leather_pants", new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); + self::register("netherite_leggings", new Armor(new IID(Ids::NETHERITE_LEGGINGS), "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true))); } } From 21ed5a450fda51894e94c1c648c2987efa9d47af Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 20:42:16 +0100 Subject: [PATCH 0338/1858] Updated BlockFactory consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 50f3602480..f1852b0d93 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 07786dc4bc60fb9771a4e168350ddd5476670044 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 22:51:12 +0100 Subject: [PATCH 0339/1858] RuntimeDataWriter: fixed doc comment --- src/data/runtime/RuntimeDataWriter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index c10de5cea6..c475e4428d 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -52,7 +52,7 @@ final class RuntimeDataWriter{ return $this; } - /** @param int $bits *@return $this */ + /** @return $this */ public function writeBoundedInt(int $bits, int $min, int $max, int $value) : self{ if($value < $min || $value > $max){ throw new \InvalidArgumentException("Value $value is outside the range $min - $max"); From c15c59ae0d7aab25a4f212c9ca8f555a660accce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 22:52:07 +0100 Subject: [PATCH 0340/1858] changelog for 5.0.0-ALPHA2 [ci skip] --- changelogs/5.0-alpha.md | 114 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index eade91d275..66f3380470 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -305,3 +305,117 @@ Again, it's acknowledged this is rather more cumbersome than it should be, but t - The following classes have been added: - `pocketmine\world\format\io\GlobalBlockStateHandlers` - `pocketmine\world\format\io\GlobalItemDataHandlers` + +# 5.0.0-ALPHA2 +Released 14th July 2022. + +## Core +- Reduced memory usage of the server on startup. +- Fixed error spam when loading item frames without items in them. + +## Gameplay +### Blocks +- Added the following new blocks: + - Cakes with Candle & Dyed Candle + - Candle & Dyed Candle + - Cartography Table (not currently usable due to maps not being implemented) + - Copper block (random oxidation not yet implemented) + - Cut Copper block, stairs and slabs (random oxidation not yet implemented) + - Crying Obsidian + - Gilded Blackstone + - Glow Item Frame + - Hanging Roots + - Lightning Rod + - Netherite Block + - Smithing Table + - Tinted Glass + - Warped Wart Block + - Wither Rose + +### Items +- Added the following new items: + - Honey Bottle + - Netherite Axe + - Netherite Boots + - Netherite Chestplate + - Netherite Helmet + - Netherite Ingot + - Netherite Leggings + - Netherite Pickaxe + - Netherite Scrap + - Netherite Shovel + - Netherite Sword + +## API +### `pocketmine\block` +- Dependency between `BlockFactory` and `VanillaBlocks` has been inverted. + - Now, blocks are defined in `VanillaBlocks`, and automatically registered in `BlockFactory`. + - Manual registration in `BlockFactory` is still required for custom blocks. + - `BlockFactory` now has only one purpose, which is to map internal blockstate IDs to `Block` objects when reading blocks from chunks. +- The following new API methods have been added: + - `public Block->isFireProofAsItem()` + - `public Block->onProjectileHit()` + - `public ItemFrame->isGlowing()` + - `public ItemFrame->setGlowing()` +- The following new classes have been added: + - `BaseCake` + - `CakeWithCandle` + - `CakeWithDyedCandle` + - `Candle` + - `CartographyTable` + - `CopperSlab` + - `CopperStairs` + - `Copper` + - `DyedCandle` + - `GildedBlackstone` + - `HangingRoots` + - `LightningRod` + - `SmithingTable` + - `WitherRose` + - `utils\CandleTrait` + - `utils\CopperOxidation` + - `utils\CopperTrait` + +### `pocketmine\crafting` +- The following enum classes have new members: + - `ShapelessRecipeType` has new members `CARTOGRAPHY` and `SMITHING` + +### `pocketmine\data` +- `LegacyToStringBidirectionalIdMap` has been reduced to `LegacyToStringIdMap`. + - Since we never map from string ID to legacy ID, bidirectional mapping is no longer necessary. + - This affects the following subclasses: + - `LegacyBiomeIdToStringIdMap` + - `LegacyBlockIdToStringIdMap` + - `LegacyEntityIdToStringIdMap` + - `LegacyItemIdToStringIdMap` +- The following internal API methods have been added: + - `public LegacyToStringIdMap->add(string $string, int $legacy) : void` - adds a mapping from a custom legacy ID to custom string ID, needed for upgrading old saved data + - `public LegacyBlockStateMapper->addMapping(string $stringId, int $intId, int $meta, BlockStateData $stateData) : void` - adds a mapping from legacy block data to a modern blockstate, needed for upgrading old saved data + - `public BlockStateData->getState(string $name) : ?Tag` +- The following internal API methods have signature changes: + - `BlockStateData->__construct()` now accepts `array for `$states` instead of `CompoundTag` + - `BlockStateData->getStates()` now returns `array` instead of `CompoundTag` (allows reducing memory usage) +- The following classes have been added: + - `UnsupportedItemTypeException` + +### `pocketmine\item` +- `ItemFactory` has been removed. + - Vanilla item registration is now done via `VanillaItems`. + - The procedure for registering a custom item is the same as in ALPHA1, minus the `ItemFactory` step. +- The following API methods have been added: + - `public ArmorTypeInfo->getToughness() : int` + - `public ArmorTypeInfo->isFireProof() : bool` + - `public Item->isFireProof() : bool` +- The following API methods have signature changes: + - `ArmorTypeInfo->__construct()` now accepts optional parameters `int $toughness` and `bool $fireProof` +- The following classes have been added: + - `HoneyBottle` +- The following enums have new members: + - `ToolTier` has new member `NETHERITE` + +### `pocketmine\world` +- The following API methods have signature changes: + - `SubChunk->__construct()` parameter `$blocks` has been renamed to `$blockLayers`. +- The following classes have been added: + - `CopperWaxApplySound` + - `CopperWaxRemoveSound` From 66f2116e57cfff32f3529d1df5c14efee8b93fb9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 22:54:28 +0100 Subject: [PATCH 0341/1858] Release 5.0.0-ALPHA2 --- changelogs/5.0-alpha.md | 1 + src/VersionInfo.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 66f3380470..3e3c1340f2 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -377,6 +377,7 @@ Released 14th July 2022. - `utils\CopperTrait` ### `pocketmine\crafting` +- JSON models have been updated to reflect updated crafting data format. - The following enum classes have new members: - `ShapelessRecipeType` has new members `CARTOGRAPHY` and `SMITHING` diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b74de0e601..c8c2765272 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From c7f5215a516bdec635a740c8d3681d804bf5bf50 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Jul 2022 22:54:29 +0100 Subject: [PATCH 0342/1858] 5.0.0-ALPHA3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c8c2765272..d06ebbdd93 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From d0ff6d2e365dad0fa16a320d78f6d6e52be18005 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 16 Jul 2022 19:50:33 +0100 Subject: [PATCH 0343/1858] Enable various types of interaction to return items to the player, without needing to have a bunch of boilerplate creative mode and held item checks it became glaringly obvious that this was needed because of #4827 and #4868. this is further needed with the addition of cauldrons. --- src/block/Anvil.php | 2 +- src/block/Bamboo.php | 2 +- src/block/BambooSapling.php | 2 +- src/block/Barrel.php | 2 +- src/block/BaseCake.php | 2 +- src/block/Bed.php | 2 +- src/block/Bell.php | 2 +- src/block/Block.php | 8 ++- src/block/BrewingStand.php | 2 +- src/block/Button.php | 2 +- src/block/Cake.php | 4 +- src/block/CakeWithCandle.php | 6 +-- src/block/CartographyTable.php | 2 +- src/block/ChemistryTable.php | 2 +- src/block/Chest.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/CraftingTable.php | 2 +- src/block/Crops.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/Dirt.php | 2 +- src/block/Door.php | 2 +- src/block/DragonEgg.php | 2 +- src/block/EnchantingTable.php | 2 +- src/block/EnderChest.php | 2 +- src/block/FenceGate.php | 2 +- src/block/FlowerPot.php | 2 +- src/block/Furnace.php | 2 +- src/block/Grass.php | 2 +- src/block/Hopper.php | 2 +- src/block/Ice.php | 4 +- src/block/ItemFrame.php | 2 +- src/block/Jukebox.php | 6 +-- src/block/Lectern.php | 2 +- src/block/Lever.php | 2 +- src/block/Light.php | 2 +- src/block/Loom.php | 2 +- src/block/Pumpkin.php | 2 +- src/block/RedstoneComparator.php | 2 +- src/block/RedstoneOre.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/Sapling.php | 2 +- src/block/SeaPickle.php | 4 +- src/block/ShulkerBox.php | 2 +- src/block/SmithingTable.php | 2 +- src/block/Stonecutter.php | 2 +- src/block/Sugarcane.php | 2 +- src/block/SweetBerryBush.php | 2 +- src/block/TNT.php | 6 +-- src/block/Trapdoor.php | 2 +- src/block/Wood.php | 2 +- src/block/utils/CandleTrait.php | 2 +- src/block/utils/CopperTrait.php | 2 +- src/item/Armor.php | 11 ++-- src/item/Axe.php | 4 +- src/item/Bow.php | 2 +- src/item/Bucket.php | 15 ++---- src/item/FlintSteel.php | 2 +- src/item/Hoe.php | 4 +- src/item/Item.php | 20 +++++-- src/item/LiquidBucket.php | 7 ++- src/item/PaintingItem.php | 2 +- src/item/Pickaxe.php | 4 +- src/item/ProjectileItem.php | 2 +- src/item/Shears.php | 2 +- src/item/Shovel.php | 4 +- src/item/SpawnEgg.php | 2 +- src/item/Sword.php | 4 +- src/player/Player.php | 90 ++++++++++++++++++-------------- src/world/World.php | 29 +++++----- 69 files changed, 177 insertions(+), 155 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index ef8ef3f620..aed4dac0b1 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -89,7 +89,7 @@ class Anvil extends Transparent implements Fallable{ return SupportType::NONE(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $player->setCurrentWindow(new AnvilInventory($this->position)); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index c8be857b0b..61cb7c6655 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -149,7 +149,7 @@ class Bamboo extends Transparent{ return $top; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer){ $top = $this->seekToTop(); if($top->grow(self::getMaxHeight($top->position->getFloorX(), $top->position->getFloorZ()), mt_rand(1, 2), $player)){ diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index e1f23c5657..d005f37647 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -73,7 +73,7 @@ final class BambooSapling extends Flowable{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer || $item instanceof ItemBamboo){ if($this->grow($player)){ $item->pop(); diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 2efef6bbcf..14ef97e099 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -81,7 +81,7 @@ class Barrel extends Opaque{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $barrel = $this->position->getWorld()->getTile($this->position); if($barrel instanceof TileBarrel){ diff --git a/src/block/BaseCake.php b/src/block/BaseCake.php index 5fcca644a7..21fd6336a0 100644 --- a/src/block/BaseCake.php +++ b/src/block/BaseCake.php @@ -54,7 +54,7 @@ abstract class BaseCake extends Transparent implements FoodSource{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ return $player->consumeObject($this); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 4fd65e9090..4bf4dac238 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -130,7 +130,7 @@ class Bed extends Transparent{ return null; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $other = $this->getOtherHalf(); $playerPos = $player->getPosition(); diff --git a/src/block/Bell.php b/src/block/Bell.php index bc13a33247..3f60774306 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -139,7 +139,7 @@ final class Bell extends Transparent{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $faceHit = Facing::opposite($player->getHorizontalFacing()); if($this->attachmentType->equals(BellAttachmentType::CEILING())){ diff --git a/src/block/Block.php b/src/block/Block.php index 20f77c8f11..d521cb522f 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -275,8 +275,10 @@ class Block{ /** * Do the actions needed so the block is broken with the Item + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if full) */ - public function onBreak(Item $item, ?Player $player = null) : bool{ + public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{ if(($t = $this->position->getWorld()->getTile($this->position)) !== null){ $t->onBlockDestroyed(); } @@ -315,8 +317,10 @@ class Block{ /** * Do actions when interacted by Item. Returns if it has done anything + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ return false; } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index ee39b0ea3b..c35576d585 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -118,7 +118,7 @@ class BrewingStand extends Transparent{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $stand = $this->position->getWorld()->getTile($this->position); if($stand instanceof TileBrewingStand && $stand->canOpenWith($item->getCustomName())){ diff --git a/src/block/Button.php b/src/block/Button.php index 6cdcae3514..1ffca43875 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -69,7 +69,7 @@ abstract class Button extends Flowable{ abstract protected function getActivationTime() : int; - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if(!$this->pressed){ $this->pressed = true; $this->position->getWorld()->setBlock($this->position, $this); diff --git a/src/block/Cake.php b/src/block/Cake.php index 31d1c3ad96..e6b152ce02 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -70,7 +70,7 @@ class Cake extends BaseCake{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof ItemBlock){ $block = $item->getBlock(); $resultBlock = null; @@ -87,7 +87,7 @@ class Cake extends BaseCake{ } } - return parent::onInteract($item, $face, $clickVector, $player); + return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); } public function getResidue() : Block{ diff --git a/src/block/CakeWithCandle.php b/src/block/CakeWithCandle.php index 63278ea362..187442cd98 100644 --- a/src/block/CakeWithCandle.php +++ b/src/block/CakeWithCandle.php @@ -51,12 +51,12 @@ class CakeWithCandle extends BaseCake{ return VanillaBlocks::CANDLE(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->onInteractCandle($item, $face, $clickVector, $player)){ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($this->onInteractCandle($item, $face, $clickVector, $player, $returnedItems)){ return true; } - return parent::onInteract($item, $face, $clickVector, $player); + return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/CartographyTable.php b/src/block/CartographyTable.php index 195c180706..67d950c5ac 100644 --- a/src/block/CartographyTable.php +++ b/src/block/CartographyTable.php @@ -30,7 +30,7 @@ use pocketmine\player\Player; final class CartographyTable extends Opaque{ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $player->setCurrentWindow(new CartographyTableInventory($this->position)); } diff --git a/src/block/ChemistryTable.php b/src/block/ChemistryTable.php index d1e008d0e9..27fb636746 100644 --- a/src/block/ChemistryTable.php +++ b/src/block/ChemistryTable.php @@ -33,7 +33,7 @@ final class ChemistryTable extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ //TODO return false; } diff --git a/src/block/Chest.php b/src/block/Chest.php index 55a0591ca1..0019e16d50 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -74,7 +74,7 @@ class Chest extends Transparent{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $chest = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index bc6b892ca0..4144bd754d 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -101,7 +101,7 @@ class CocoaBlock extends Transparent{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer && $this->grow()){ $item->pop(); diff --git a/src/block/CraftingTable.php b/src/block/CraftingTable.php index cc837d0034..dcd9edce2c 100644 --- a/src/block/CraftingTable.php +++ b/src/block/CraftingTable.php @@ -30,7 +30,7 @@ use pocketmine\player\Player; class CraftingTable extends Opaque{ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $player->setCurrentWindow(new CraftingTableInventory($this->position)); } diff --git a/src/block/Crops.php b/src/block/Crops.php index 52242cfe45..092632bb27 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -68,7 +68,7 @@ abstract class Crops extends Flowable{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->age < self::MAX_AGE && $item instanceof Fertilizer){ $block = clone $this; $block->age += mt_rand(2, 5); diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 93ea4ce607..77a28274ce 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -81,7 +81,7 @@ class DaylightSensor extends Transparent{ return SupportType::NONE(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->inverted = !$this->inverted; $this->signalStrength = $this->recalculateSignalStrength(); $this->position->getWorld()->setBlock($this->position, $this); diff --git a/src/block/Dirt.php b/src/block/Dirt.php index a3c6da660a..cdf24be721 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -53,7 +53,7 @@ class Dirt extends Opaque{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($face === Facing::UP && $item instanceof Hoe){ $item->applyDamage(1); diff --git a/src/block/Door.php b/src/block/Door.php index 6657a18f04..d5497bb7c7 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -148,7 +148,7 @@ class Door extends Transparent{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->open = !$this->open; $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); diff --git a/src/block/DragonEgg.php b/src/block/DragonEgg.php index db6512a9cd..6b330246b7 100644 --- a/src/block/DragonEgg.php +++ b/src/block/DragonEgg.php @@ -48,7 +48,7 @@ class DragonEgg extends Transparent implements Fallable{ return null; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->teleport(); return true; } diff --git a/src/block/EnchantingTable.php b/src/block/EnchantingTable.php index b76147840f..f80d52d124 100644 --- a/src/block/EnchantingTable.php +++ b/src/block/EnchantingTable.php @@ -44,7 +44,7 @@ class EnchantingTable extends Transparent{ return SupportType::NONE(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ //TODO lock diff --git a/src/block/EnderChest.php b/src/block/EnderChest.php index e71206b567..68c2805f9a 100644 --- a/src/block/EnderChest.php +++ b/src/block/EnderChest.php @@ -54,7 +54,7 @@ class EnderChest extends Transparent{ return SupportType::NONE(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $enderChest = $this->position->getWorld()->getTile($this->position); if($enderChest instanceof TileEnderChest && $this->getSide(Facing::UP)->isTransparent()){ diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 4fa5313637..2eafb99587 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -109,7 +109,7 @@ class FenceGate extends Transparent{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->open = !$this->open; if($this->open && $player !== null){ $playerFacing = $player->getHorizontalFacing(); diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index e4dc03fb2c..6099539a04 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -112,7 +112,7 @@ class FlowerPot extends Flowable{ return $block->getSupportType(Facing::UP)->hasCenterSupport(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $plant = $item->getBlock(); if($this->plant !== null){ if($this->isValidPlant($plant)){ diff --git a/src/block/Furnace.php b/src/block/Furnace.php index c1b29c9863..5e2f19aabd 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -67,7 +67,7 @@ class Furnace extends Opaque{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $furnace = $this->position->getWorld()->getTile($this->position); if($furnace instanceof TileFurnace && $furnace->canOpenWith($item->getCustomName())){ diff --git a/src/block/Grass.php b/src/block/Grass.php index 16580b5dbf..342565641f 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -87,7 +87,7 @@ class Grass extends Opaque{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($face !== Facing::UP){ return false; } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index c1d01654c1..9b0996d924 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -93,7 +93,7 @@ class Hopper extends Transparent{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileHopper){ //TODO: find a way to have inventories open on click without this boilerplate in every block diff --git a/src/block/Ice.php b/src/block/Ice.php index 7edbc26596..ad83bb6ba7 100644 --- a/src/block/Ice.php +++ b/src/block/Ice.php @@ -38,12 +38,12 @@ class Ice extends Transparent{ return 0.98; } - public function onBreak(Item $item, ?Player $player = null) : bool{ + public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{ if(($player === null || $player->isSurvival()) && !$item->hasEnchantment(VanillaEnchantments::SILK_TOUCH())){ $this->position->getWorld()->setBlock($this->position, VanillaBlocks::WATER()); return true; } - return parent::onBreak($item, $player); + return parent::onBreak($item, $player, $returnedItems); } public function ticksRandomly() : bool{ diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 831f39760b..ec6d778804 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -153,7 +153,7 @@ class ItemFrame extends Flowable{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->framedItem !== null){ $this->itemRotation = ($this->itemRotation + 1) % self::ROTATIONS; }elseif(!$item->isNull()){ diff --git a/src/block/Jukebox.php b/src/block/Jukebox.php index 185426600c..3d5f340b3a 100644 --- a/src/block/Jukebox.php +++ b/src/block/Jukebox.php @@ -39,7 +39,7 @@ class Jukebox extends Opaque{ return 300; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ if($this->record !== null){ $this->ejectRecord(); @@ -83,9 +83,9 @@ class Jukebox extends Opaque{ $this->getPosition()->getWorld()->addSound($this->getPosition(), new RecordStopSound()); } - public function onBreak(Item $item, ?Player $player = null) : bool{ + public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{ $this->stopSound(); - return parent::onBreak($item, $player); + return parent::onBreak($item, $player, $returnedItems); } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 6e7026ff80..cb5a9d9fee 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -127,7 +127,7 @@ class Lectern extends Transparent{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->book === null && $item instanceof WritableBookBase){ $this->position->getWorld()->setBlock($this->position, $this->setBook($item)); $this->position->getWorld()->addSound($this->position, new LecternPlaceBookSound()); diff --git a/src/block/Lever.php b/src/block/Lever.php index d25ce1c44d..55f7ba0e89 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -106,7 +106,7 @@ class Lever extends Flowable{ } } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->activated = !$this->activated; $this->position->getWorld()->setBlock($this->position, $this); $this->position->getWorld()->addSound( diff --git a/src/block/Light.php b/src/block/Light.php index 9313cb19f6..804f98871c 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -63,7 +63,7 @@ final class Light extends Flowable{ return $blockReplace->canBeReplaced() && $blockReplace->getTypeId() !== $this->getTypeId(); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->level = $this->level === self::MAX_LIGHT_LEVEL ? self::MIN_LIGHT_LEVEL : $this->level + 1; diff --git a/src/block/Loom.php b/src/block/Loom.php index e75594ece9..a10b577232 100644 --- a/src/block/Loom.php +++ b/src/block/Loom.php @@ -34,7 +34,7 @@ final class Loom extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $player->setCurrentWindow(new LoomInventory($this->position)); return true; diff --git a/src/block/Pumpkin.php b/src/block/Pumpkin.php index 2f374670e3..19b3b2e563 100644 --- a/src/block/Pumpkin.php +++ b/src/block/Pumpkin.php @@ -33,7 +33,7 @@ use function in_array; class Pumpkin extends Opaque{ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Shears && in_array($face, Facing::HORIZONTAL, true)){ $item->applyDamage(1); $this->position->getWorld()->setBlock($this->position, VanillaBlocks::CARVED_PUMPKIN()->setFacing($face)); diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 769c7ef96a..cd2004460d 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -103,7 +103,7 @@ class RedstoneComparator extends Flowable{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->isSubtractMode = !$this->isSubtractMode; $this->position->getWorld()->setBlock($this->position, $this); return true; diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 1a7ed5e3b1..044bb31d00 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -60,7 +60,7 @@ class RedstoneOre extends Opaque{ return $this->lit ? 9 : 0; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if(!$this->lit){ $this->lit = true; $this->position->getWorld()->setBlock($this->position, $this); //no return here - this shouldn't prevent block placement diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index b680d52cc8..39b720a697 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -88,7 +88,7 @@ class RedstoneRepeater extends Flowable{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if(++$this->delay > self::MAX_DELAY){ $this->delay = self::MIN_DELAY; } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 82afb3334c..3d9a327760 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -74,7 +74,7 @@ class Sapling extends Flowable{ return false; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer && $this->grow($player)){ $item->pop(); diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index d6e0f32a7e..c79363062b 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -103,9 +103,9 @@ class SeaPickle extends Transparent{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ //TODO: bonemeal logic (requires coral) - return parent::onInteract($item, $face, $clickVector, $player); + return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index f37a8a73fb..1cc994ef24 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -97,7 +97,7 @@ class ShulkerBox extends Opaque{ return $result; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $shulker = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/SmithingTable.php b/src/block/SmithingTable.php index 5c4976cae5..741e9c02fd 100644 --- a/src/block/SmithingTable.php +++ b/src/block/SmithingTable.php @@ -30,7 +30,7 @@ use pocketmine\player\Player; final class SmithingTable extends Opaque{ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $player->setCurrentWindow(new SmithingTableInventory($this->position)); } diff --git a/src/block/Stonecutter.php b/src/block/Stonecutter.php index f31e95d2ce..7736381e43 100644 --- a/src/block/Stonecutter.php +++ b/src/block/Stonecutter.php @@ -37,7 +37,7 @@ class Stonecutter extends Transparent{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $player->setCurrentWindow(new StonecutterInventory($this->position)); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 6985cd4871..e3c8e80cc9 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -83,7 +83,7 @@ class Sugarcane extends Flowable{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer){ if(!$this->getSide(Facing::DOWN)->isSameType($this) && $this->grow()){ $item->pop(); diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 1fa1e180c3..487dd81b17 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -88,7 +88,7 @@ class SweetBerryBush extends Flowable{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->age < self::STAGE_MATURE && $item instanceof Fertilizer){ $block = clone $this; $block->age++; diff --git a/src/block/TNT.php b/src/block/TNT.php index 1a749bdd25..840d74794e 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -81,15 +81,15 @@ class TNT extends Opaque{ return $this; } - public function onBreak(Item $item, ?Player $player = null) : bool{ + public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->unstable){ $this->ignite(); return true; } - return parent::onBreak($item, $player); + return parent::onBreak($item, $player, $returnedItems); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof FlintSteel || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ if($item instanceof Durable){ $item->applyDamage(1); diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 74306d35ea..a0288d3598 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -93,7 +93,7 @@ class Trapdoor extends Transparent{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->open = !$this->open; $this->position->getWorld()->setBlock($this->position, $this); $this->position->getWorld()->addSound($this->position, new DoorSound()); diff --git a/src/block/Wood.php b/src/block/Wood.php index 276c4b6798..401ca5bd71 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -69,7 +69,7 @@ class Wood extends Opaque{ return $this->woodType->isFlammable() ? 5 : 0; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if(!$this->stripped && $item instanceof Axe){ $item->applyDamage(1); $this->stripped = true; diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index d838299cce..154ccb8287 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -63,7 +63,7 @@ trait CandleTrait{ } /** @see Block::onInteract() */ - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ if($this->lit){ return true; diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index e30afe69f0..c1730cb262 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -68,7 +68,7 @@ trait CopperTrait{ return $this; } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if(!$this->waxed && $item->getTypeId() === ItemTypeIds::HONEYCOMB){ $this->waxed = true; $this->position->getWorld()->setBlock($this->position, $this); diff --git a/src/item/Armor.php b/src/item/Armor.php index 4574165d2e..6fb538cd60 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -129,16 +129,15 @@ class Armor extends Durable{ return 0; } - public function onClickAir(Player $player, Vector3 $directionVector) : ItemUseResult{ + public function onClickAir(Player $player, Vector3 $directionVector, array &$returnedItems) : ItemUseResult{ $existing = $player->getArmorInventory()->getItem($this->getArmorSlot()); $thisCopy = clone $this; $new = $thisCopy->pop(); $player->getArmorInventory()->setItem($this->getArmorSlot(), $new); - if($thisCopy->getCount() === 0){ - $player->getInventory()->setItemInHand($existing); - }else{ //if the stack size was bigger than 1 (usually won't happen, but might be caused by plugins - $player->getInventory()->setItemInHand($thisCopy); - $player->getInventory()->addItem($existing); + $player->getInventory()->setItemInHand($existing); + if(!$thisCopy->isNull()){ + //if the stack size was bigger than 1 (usually won't happen, but might be caused by plugins) + $returnedItems[] = $thisCopy; } return ItemUseResult::SUCCESS(); } diff --git a/src/item/Axe.php b/src/item/Axe.php index 40b8b67362..57b378311d 100644 --- a/src/item/Axe.php +++ b/src/item/Axe.php @@ -41,14 +41,14 @@ class Axe extends TieredTool{ return $this->tier->getBaseAttackPoints() - 1; } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ if(!$block->getBreakInfo()->breaksInstantly()){ return $this->applyDamage(1); } return false; } - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return $this->applyDamage(2); } } diff --git a/src/item/Bow.php b/src/item/Bow.php index 460b844c65..3c1320f037 100644 --- a/src/item/Bow.php +++ b/src/item/Bow.php @@ -44,7 +44,7 @@ class Bow extends Tool implements Releasable{ return 385; } - public function onReleaseUsing(Player $player) : ItemUseResult{ + public function onReleaseUsing(Player $player, array &$returnedItems) : ItemUseResult{ $arrow = VanillaItems::ARROW(); $inventory = match(true){ $player->getOffHandInventory()->contains($arrow) => $player->getOffHandInventory(), diff --git a/src/item/Bucket.php b/src/item/Bucket.php index accfa976b0..b788a30226 100644 --- a/src/item/Bucket.php +++ b/src/item/Bucket.php @@ -37,7 +37,7 @@ class Bucket extends Item{ return 16; } - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ //TODO: move this to generic placement logic if($blockClicked instanceof Liquid && $blockClicked->isSource()){ $stack = clone $this; @@ -57,16 +57,9 @@ class Bucket extends Item{ if(!$ev->isCancelled()){ $player->getWorld()->setBlock($blockClicked->getPosition(), VanillaBlocks::AIR()); $player->getWorld()->addSound($blockClicked->getPosition()->add(0.5, 0.5, 0.5), $blockClicked->getBucketFillSound()); - if($player->hasFiniteResources()){ - if($stack->getCount() === 0){ - $player->getInventory()->setItemInHand($ev->getItem()); - }else{ - $player->getInventory()->setItemInHand($stack); - $player->getInventory()->addItem($ev->getItem()); - } - }else{ - $player->getInventory()->addItem($ev->getItem()); - } + + $this->pop(); + $returnedItems[] = $ev->getItem(); return ItemUseResult::SUCCESS(); } diff --git a/src/item/FlintSteel.php b/src/item/FlintSteel.php index 567f9d0f59..0ff2e754cd 100644 --- a/src/item/FlintSteel.php +++ b/src/item/FlintSteel.php @@ -32,7 +32,7 @@ use pocketmine\world\sound\FlintSteelSound; class FlintSteel extends Tool{ - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if($blockReplace->getTypeId() === BlockTypeIds::AIR){ $world = $player->getWorld(); $world->setBlock($blockReplace->getPosition(), VanillaBlocks::FIRE()); diff --git a/src/item/Hoe.php b/src/item/Hoe.php index 8fd1bbad63..1f2c2efaed 100644 --- a/src/item/Hoe.php +++ b/src/item/Hoe.php @@ -33,11 +33,11 @@ class Hoe extends TieredTool{ return BlockToolType::HOE; } - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return $this->applyDamage(1); } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ if(!$block->getBreakInfo()->breaksInstantly()){ return $this->applyDamage(1); } diff --git a/src/item/Item.php b/src/item/Item.php index 4f0b814bfa..7170f4fabb 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -513,38 +513,48 @@ class Item implements \JsonSerializable{ /** * Called when a player uses this item on a block. + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ return ItemUseResult::NONE(); } /** * Called when a player uses the item on air, for example throwing a projectile. * Returns whether the item was changed, for example count decrease or durability change. + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onClickAir(Player $player, Vector3 $directionVector) : ItemUseResult{ + public function onClickAir(Player $player, Vector3 $directionVector, array &$returnedItems) : ItemUseResult{ return ItemUseResult::NONE(); } /** * Called when a player is using this item and releases it. Used to handle bow shoot actions. * Returns whether the item was changed, for example count decrease or durability change. + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onReleaseUsing(Player $player) : ItemUseResult{ + public function onReleaseUsing(Player $player, array &$returnedItems) : ItemUseResult{ return ItemUseResult::NONE(); } /** * Called when this item is used to destroy a block. Usually used to update durability. + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ return false; } /** * Called when this item is used to attack an entity. Usually used to update durability. + * + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return false; } diff --git a/src/item/LiquidBucket.php b/src/item/LiquidBucket.php index 8e6d41716b..740f79b116 100644 --- a/src/item/LiquidBucket.php +++ b/src/item/LiquidBucket.php @@ -54,7 +54,7 @@ class LiquidBucket extends Item{ return VanillaItems::BUCKET(); } - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if(!$blockReplace->canBeReplaced()){ return ItemUseResult::NONE(); } @@ -68,9 +68,8 @@ class LiquidBucket extends Item{ $player->getWorld()->setBlock($blockReplace->getPosition(), $resultBlock->getFlowingForm()); $player->getWorld()->addSound($blockReplace->getPosition()->add(0.5, 0.5, 0.5), $resultBlock->getBucketEmptySound()); - if($player->hasFiniteResources()){ - $player->getInventory()->setItemInHand($ev->getItem()); - } + $this->pop(); + $returnedItems[] = $ev->getItem(); return ItemUseResult::SUCCESS(); } diff --git a/src/item/PaintingItem.php b/src/item/PaintingItem.php index 1c649c8e06..f3821d0b26 100644 --- a/src/item/PaintingItem.php +++ b/src/item/PaintingItem.php @@ -37,7 +37,7 @@ use function count; class PaintingItem extends Item{ - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if(Facing::axis($face) === Axis::Y){ return ItemUseResult::NONE(); } diff --git a/src/item/Pickaxe.php b/src/item/Pickaxe.php index 9796785072..0c8fa01642 100644 --- a/src/item/Pickaxe.php +++ b/src/item/Pickaxe.php @@ -41,14 +41,14 @@ class Pickaxe extends TieredTool{ return $this->tier->getBaseAttackPoints() - 2; } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ if(!$block->getBreakInfo()->breaksInstantly()){ return $this->applyDamage(1); } return false; } - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return $this->applyDamage(2); } } diff --git a/src/item/ProjectileItem.php b/src/item/ProjectileItem.php index e36eed21ab..8056af505a 100644 --- a/src/item/ProjectileItem.php +++ b/src/item/ProjectileItem.php @@ -36,7 +36,7 @@ abstract class ProjectileItem extends Item{ abstract protected function createEntity(Location $location, Player $thrower) : Throwable; - public function onClickAir(Player $player, Vector3 $directionVector) : ItemUseResult{ + public function onClickAir(Player $player, Vector3 $directionVector, array &$returnedItems) : ItemUseResult{ $location = $player->getLocation(); $projectile = $this->createEntity(Location::fromObject($player->getEyePos(), $player->getWorld(), $location->yaw, $location->pitch), $player); diff --git a/src/item/Shears.php b/src/item/Shears.php index a806e649f3..9c70d6cb2c 100644 --- a/src/item/Shears.php +++ b/src/item/Shears.php @@ -44,7 +44,7 @@ class Shears extends Tool{ return 15; } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ return $this->applyDamage(1); } } diff --git a/src/item/Shovel.php b/src/item/Shovel.php index dde12f4114..d3d0ae4298 100644 --- a/src/item/Shovel.php +++ b/src/item/Shovel.php @@ -41,14 +41,14 @@ class Shovel extends TieredTool{ return $this->tier->getBaseAttackPoints() - 3; } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ if(!$block->getBreakInfo()->breaksInstantly()){ return $this->applyDamage(1); } return false; } - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return $this->applyDamage(2); } } diff --git a/src/item/SpawnEgg.php b/src/item/SpawnEgg.php index 84e8e2cf5d..1147a951dd 100644 --- a/src/item/SpawnEgg.php +++ b/src/item/SpawnEgg.php @@ -34,7 +34,7 @@ abstract class SpawnEgg extends Item{ abstract protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity; - public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : ItemUseResult{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ $entity = $this->createEntity($player->getWorld(), $blockReplace->getPosition()->add(0.5, 0, 0.5), lcg_value() * 360, 0); if($this->hasCustomName()){ diff --git a/src/item/Sword.php b/src/item/Sword.php index aee1e997e4..5576f3c125 100644 --- a/src/item/Sword.php +++ b/src/item/Sword.php @@ -49,14 +49,14 @@ class Sword extends TieredTool{ return 10; } - public function onDestroyBlock(Block $block) : bool{ + public function onDestroyBlock(Block $block, array &$returnedItems) : bool{ if(!$block->getBreakInfo()->breaksInstantly()){ return $this->applyDamage(2); } return false; } - public function onAttackEntity(Entity $victim) : bool{ + public function onAttackEntity(Entity $victim, array &$returnedItems) : bool{ return $this->applyDamage(1); } } diff --git a/src/player/Player.php b/src/player/Player.php index aa391ccccd..ddea775a23 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -54,6 +54,7 @@ use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerCommandPreprocessEvent; use pocketmine\event\player\PlayerDeathEvent; use pocketmine\event\player\PlayerDisplayNameChangeEvent; +use pocketmine\event\player\PlayerDropItemEvent; use pocketmine\event\player\PlayerEmoteEvent; use pocketmine\event\player\PlayerEntityInteractEvent; use pocketmine\event\player\PlayerExhaustEvent; @@ -1443,6 +1444,39 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return true; } + /** + * @param Item[] $extraReturnedItems + */ + private function returnItemsFromAction(Item $oldHeldItem, Item $newHeldItem, array $extraReturnedItems) : void{ + $heldItemChanged = false; + if($this->hasFiniteResources()){ + if(!$newHeldItem->equalsExact($oldHeldItem) && $oldHeldItem->equalsExact($this->inventory->getItemInHand())){ + if($newHeldItem instanceof Durable && $newHeldItem->isBroken()){ + $this->broadcastSound(new ItemBreakSound()); + } + $this->inventory->setItemInHand($newHeldItem); + $heldItemChanged = true; + } + }else{ + $newHeldItem = $oldHeldItem; + } + + if($heldItemChanged && count($extraReturnedItems) > 0 && $newHeldItem->isNull()){ + $this->inventory->setItemInHand(array_shift($extraReturnedItems)); + } + foreach($this->inventory->addItem(...$extraReturnedItems) as $drop){ + //TODO: we can't generate a transaction for this since the items aren't coming from an inventory :( + $ev = new PlayerDropItemEvent($this, $drop); + if($this->isSpectator()){ + $ev->cancel(); + } + $ev->call(); + if(!$ev->isCancelled()){ + $this->dropItem($drop); + } + } + } + /** * Activates the item in hand, for example throwing a projectile. * @@ -1464,18 +1498,14 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return false; } - $result = $item->onClickAir($this, $directionVector); + $returnedItems = []; + $result = $item->onClickAir($this, $directionVector, $returnedItems); if($result->equals(ItemUseResult::FAIL())){ return false; } $this->resetItemCooldown($item); - if($this->hasFiniteResources() && !$item->equalsExact($oldItem) && $oldItem->equalsExact($this->inventory->getItemInHand())){ - if($item instanceof Durable && $item->isBroken()){ - $this->broadcastSound(new ItemBreakSound()); - } - $this->inventory->setItemInHand($item); - } + $this->returnItemsFromAction($oldItem, $item, $returnedItems); $this->setUsingItem($item instanceof Releasable && $item->canStartUsingItem($this)); @@ -1505,11 +1535,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->setUsingItem(false); $this->resetItemCooldown($slot); - if($this->hasFiniteResources() && $oldItem->equalsExact($this->inventory->getItemInHand())){ - $slot->pop(); - $this->inventory->setItemInHand($slot); - $this->inventory->addItem($slot->getResidue()); - } + $slot->pop(); + $this->returnItemsFromAction($oldItem, $slot, [$slot->getResidue()]); return true; } @@ -1531,15 +1558,11 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $oldItem = clone $item; - $result = $item->onReleaseUsing($this); + $returnedItems = []; + $result = $item->onReleaseUsing($this, $returnedItems); if($result->equals(ItemUseResult::SUCCESS())){ $this->resetItemCooldown($item); - if(!$item->equalsExact($oldItem) && $oldItem->equalsExact($this->inventory->getItemInHand())){ - if($item instanceof Durable && $item->isBroken()){ - $this->broadcastSound(new ItemBreakSound()); - } - $this->inventory->setItemInHand($item); - } + $this->returnItemsFromAction($oldItem, $item, $returnedItems); return true; } @@ -1652,13 +1675,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->stopBreakBlock($pos); $item = $this->inventory->getItemInHand(); $oldItem = clone $item; - if($this->getWorld()->useBreakOn($pos, $item, $this, true)){ - if($this->hasFiniteResources() && !$item->equalsExact($oldItem) && $oldItem->equalsExact($this->inventory->getItemInHand())){ - if($item instanceof Durable && $item->isBroken()){ - $this->broadcastSound(new ItemBreakSound()); - } - $this->inventory->setItemInHand($item); - } + $returnedItems = []; + if($this->getWorld()->useBreakOn($pos, $item, $this, true, $returnedItems)){ + $this->returnItemsFromAction($oldItem, $item, $returnedItems); $this->hungerManager->exhaust(0.005, PlayerExhaustEvent::CAUSE_MINING); return true; } @@ -1681,13 +1700,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->broadcastAnimation(new ArmSwingAnimation($this), $this->getViewers()); $item = $this->inventory->getItemInHand(); //this is a copy of the real item $oldItem = clone $item; - if($this->getWorld()->useItemOn($pos, $item, $face, $clickOffset, $this, true)){ - if($this->hasFiniteResources() && !$item->equalsExact($oldItem) && $oldItem->equalsExact($this->inventory->getItemInHand())){ - if($item instanceof Durable && $item->isBroken()){ - $this->broadcastSound(new ItemBreakSound()); - } - $this->inventory->setItemInHand($item); - } + $returnedItems = []; + if($this->getWorld()->useItemOn($pos, $item, $face, $clickOffset, $this, true, $returnedItems)){ + $this->returnItemsFromAction($oldItem, $item, $returnedItems); return true; } }else{ @@ -1762,12 +1777,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if($this->isAlive()){ //reactive damage like thorns might cause us to be killed by attacking another mob, which //would mean we'd already have dropped the inventory by the time we reached here - if($heldItem->onAttackEntity($entity) && $this->hasFiniteResources() && $oldItem->equalsExact($this->inventory->getItemInHand())){ //always fire the hook, even if we are survival - if($heldItem instanceof Durable && $heldItem->isBroken()){ - $this->broadcastSound(new ItemBreakSound()); - } - $this->inventory->setItemInHand($heldItem); - } + $returnedItems = []; + $heldItem->onAttackEntity($entity, $returnedItems); + $this->returnItemsFromAction($oldItem, $heldItem, $returnedItems); $this->hungerManager->exhaust(0.1, PlayerExhaustEvent::CAUSE_ATTACK); } diff --git a/src/world/World.php b/src/world/World.php index fab04e87d0..3f905e9622 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1660,9 +1660,10 @@ class World implements ChunkManager{ * Tries to break a block using a item, including Player time checks if available * It'll try to lower the durability if Item is a tool, and set it to Air if broken. * - * @param Item $item reference parameter (if null, can break anything) + * @param Item &$item reference parameter (if null, can break anything) + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ - public function useBreakOn(Vector3 $vector, Item &$item = null, ?Player $player = null, bool $createParticles = false) : bool{ + public function useBreakOn(Vector3 $vector, Item &$item = null, ?Player $player = null, bool $createParticles = false, array &$returnedItems = []) : bool{ $vector = $vector->floor(); $chunkX = $vector->getFloorX() >> Chunk::COORD_BIT_SIZE; @@ -1724,10 +1725,10 @@ class World implements ChunkManager{ } foreach($affectedBlocks as $t){ - $this->destroyBlockInternal($t, $item, $player, $createParticles); + $this->destroyBlockInternal($t, $item, $player, $createParticles, $returnedItems); } - $item->onDestroyBlock($target); + $item->onDestroyBlock($target, $returnedItems); if(count($drops) > 0){ $dropPos = $vector->add(0.5, 0.5, 0.5); @@ -1745,12 +1746,15 @@ class World implements ChunkManager{ return true; } - private function destroyBlockInternal(Block $target, Item $item, ?Player $player = null, bool $createParticles = false) : void{ + /** + * @param Item[] &$returnedItems + */ + private function destroyBlockInternal(Block $target, Item $item, ?Player $player, bool $createParticles, array &$returnedItems) : void{ if($createParticles){ $this->addParticle($target->getPosition()->add(0.5, 0.5, 0.5), new BlockBreakParticle($target)); } - $target->onBreak($item, $player); + $target->onBreak($item, $player, $returnedItems); $tile = $this->getTile($target->getPosition()); if($tile !== null){ @@ -1761,10 +1765,11 @@ class World implements ChunkManager{ /** * Uses a item on a position and face, placing it or activating the block * - * @param Player|null $player default null - * @param bool $playSound Whether to play a block-place sound if the block was placed successfully. + * @param Player|null $player default null + * @param bool $playSound Whether to play a block-place sound if the block was placed successfully. + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped if the inventory is full) */ - public function useItemOn(Vector3 $vector, Item &$item, int $face, ?Vector3 $clickVector = null, ?Player $player = null, bool $playSound = false) : bool{ + public function useItemOn(Vector3 $vector, Item &$item, int $face, ?Vector3 $clickVector = null, ?Player $player = null, bool $playSound = false, array &$returnedItems = []) : bool{ $blockClicked = $this->getBlock($vector); $blockReplace = $blockClicked->getSide($face); @@ -1794,18 +1799,18 @@ class World implements ChunkManager{ $ev->call(); if(!$ev->isCancelled()){ - if((!$player->isSneaking() || $item->isNull()) && $blockClicked->onInteract($item, $face, $clickVector, $player)){ + if((!$player->isSneaking() || $item->isNull()) && $blockClicked->onInteract($item, $face, $clickVector, $player, $returnedItems)){ return true; } - $result = $item->onInteractBlock($player, $blockReplace, $blockClicked, $face, $clickVector); + $result = $item->onInteractBlock($player, $blockReplace, $blockClicked, $face, $clickVector, $returnedItems); if(!$result->equals(ItemUseResult::NONE())){ return $result->equals(ItemUseResult::SUCCESS()); } }else{ return false; } - }elseif($blockClicked->onInteract($item, $face, $clickVector, $player)){ + }elseif($blockClicked->onInteract($item, $face, $clickVector, $player, $returnedItems)){ return true; } From 81edb1bed494639f512427bd97cf481e6f777fd8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 16 Jul 2022 20:00:43 +0100 Subject: [PATCH 0344/1858] GlassBottle: implement filling using API changes from 4afd3dcabfa6b9c645ab8b15fade1e37f889482f closes #4827 --- src/item/GlassBottle.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/item/GlassBottle.php b/src/item/GlassBottle.php index ca59fd2b37..bda6d132eb 100644 --- a/src/item/GlassBottle.php +++ b/src/item/GlassBottle.php @@ -23,6 +23,21 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\block\Block; +use pocketmine\block\BlockTypeIds; +use pocketmine\math\Vector3; +use pocketmine\player\Player; + class GlassBottle extends Item{ + public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ + if($blockClicked->getTypeId() === BlockTypeIds::WATER){ + $this->pop(); + $returnedItems[] = VanillaItems::POTION()->setType(PotionType::WATER()); + + return ItemUseResult::SUCCESS(); + } + + return ItemUseResult::NONE(); + } } From b3f8b5ff375381b3bcb221d55b9a47645bf6280e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 16 Jul 2022 20:01:29 +0100 Subject: [PATCH 0345/1858] Fix CS --- src/player/Player.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/player/Player.php b/src/player/Player.php index ddea775a23..2548515efe 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -133,6 +133,7 @@ use pocketmine\world\World; use Ramsey\Uuid\UuidInterface; use function abs; use function array_map; +use function array_shift; use function assert; use function count; use function explode; From 4f2f9b435214a60964fbe6758b9a3a7ab5f16756 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 16 Jul 2022 00:37:32 +0100 Subject: [PATCH 0346/1858] Block::readStateFromWorld() now returns the block object that should be used for the target position this enables changing the block type completely if the situation calls for it. --- src/block/BaseBanner.php | 4 +++- src/block/BaseSign.php | 4 +++- src/block/Bed.php | 4 +++- src/block/Block.php | 7 ++++++- src/block/Door.php | 4 +++- src/block/Fence.php | 4 +++- src/block/FlowerPot.php | 4 +++- src/block/ItemFrame.php | 4 +++- src/block/Jukebox.php | 4 +++- src/block/Lectern.php | 4 +++- src/block/Liquid.php | 4 +++- src/block/Note.php | 4 +++- src/block/RedstoneComparator.php | 4 +++- src/block/RedstoneWire.php | 4 +++- src/block/ShulkerBox.php | 4 +++- src/block/Skull.php | 4 +++- src/block/Stair.php | 4 +++- src/block/Thin.php | 4 +++- src/world/World.php | 12 ++++++++++-- 19 files changed, 67 insertions(+), 20 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index fd2b225bf9..d5f859f7c6 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -53,13 +53,15 @@ abstract class BaseBanner extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileBanner){ $this->color = $tile->getBaseColor(); $this->setPatterns($tile->getPatterns()); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 3061030a8f..7ce7a829fe 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -58,13 +58,15 @@ abstract class BaseSign extends Transparent{ $this->asItemCallback = $asItemCallback; } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileSign){ $this->text = $tile->getText(); $this->editorEntityRuntimeId = $tile->getEditorEntityRuntimeId(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Bed.php b/src/block/Bed.php index 4bf4dac238..258f9ce064 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -68,13 +68,15 @@ class Bed extends Transparent{ $w->writeBool($this->head); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); //read extra state information from the tile - this is an ugly hack $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileBed){ $this->color = $tile->getColor(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Block.php b/src/block/Block.php index d521cb522f..383b28797c 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -189,9 +189,14 @@ class Block{ * * Clears any cached precomputed objects, such as bounding boxes. Remove any outdated precomputed things such as * AABBs and force recalculation. + * + * A replacement block may be returned. This is useful if the block type changed due to reading of world data (e.g. + * data from a block entity). */ - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ $this->collisionBoxes = null; + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Door.php b/src/block/Door.php index d5497bb7c7..9f99de8498 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -58,7 +58,7 @@ class Door extends Transparent{ $w->writeBool($this->open); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); //copy door properties from other half @@ -71,6 +71,8 @@ class Door extends Transparent{ $this->hingeRight = $other->hingeRight; } } + + return $this; } public function isTop() : bool{ return $this->top; } diff --git a/src/block/Fence.php b/src/block/Fence.php index 08c9b5eac0..7180b38ea2 100644 --- a/src/block/Fence.php +++ b/src/block/Fence.php @@ -37,7 +37,7 @@ class Fence extends Transparent{ return 0.25; } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); foreach(Facing::HORIZONTAL as $facing){ @@ -48,6 +48,8 @@ class Fence extends Transparent{ unset($this->connections[$facing]); } } + + return $this; } /** diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index 6099539a04..f2cafe15eb 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -36,7 +36,7 @@ class FlowerPot extends Flowable{ protected ?Block $plant = null; - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileFlowerPot){ @@ -44,6 +44,8 @@ class FlowerPot extends Flowable{ }else{ $this->setPlant(null); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index ec6d778804..8785fbd541 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -71,7 +71,7 @@ class ItemFrame extends Flowable{ $w->writeBool($this->hasMap); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileItemFrame){ @@ -82,6 +82,8 @@ class ItemFrame extends Flowable{ $this->itemRotation = $tile->getItemRotation() % self::ROTATIONS; $this->itemDropChance = $tile->getItemDropChance(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Jukebox.php b/src/block/Jukebox.php index 3d5f340b3a..811148f749 100644 --- a/src/block/Jukebox.php +++ b/src/block/Jukebox.php @@ -96,12 +96,14 @@ class Jukebox extends Opaque{ return $drops; } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $jukebox = $this->position->getWorld()->getTile($this->position); if($jukebox instanceof JukeboxTile){ $this->record = $jukebox->getRecord(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Lectern.php b/src/block/Lectern.php index cb5a9d9fee..23c971ae24 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -59,13 +59,15 @@ class Lectern extends Transparent{ $w->writeBool($this->producingSignal); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileLectern){ $this->viewedPage = $tile->getViewedPage(); $this->book = $tile->getBook(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 81f34e6f60..e1bafbcbc1 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -160,9 +160,11 @@ abstract class Liquid extends Transparent{ return $block->falling ? 0 : $block->decay; } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $this->flowVector = null; + + return $this; } public function getFlowVector() : Vector3{ diff --git a/src/block/Note.php b/src/block/Note.php index 8417ff8e88..b67891b87d 100644 --- a/src/block/Note.php +++ b/src/block/Note.php @@ -32,7 +32,7 @@ class Note extends Opaque{ private int $pitch = self::MIN_PITCH; - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileNote){ @@ -40,6 +40,8 @@ class Note extends Opaque{ }else{ $this->pitch = self::MIN_PITCH; } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index cd2004460d..aeaaeb5434 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -60,12 +60,14 @@ class RedstoneComparator extends Flowable{ $w->writeBool($this->powered); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof Comparator){ $this->signalStrength = $tile->getSignalStrength(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/RedstoneWire.php b/src/block/RedstoneWire.php index 7c770e9c42..022672b5da 100644 --- a/src/block/RedstoneWire.php +++ b/src/block/RedstoneWire.php @@ -41,9 +41,11 @@ class RedstoneWire extends Flowable{ return false; } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); //TODO: check connections to nearby redstone components + + return $this; } public function onNearbyBlockChange() : void{ diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 1cc994ef24..b5b2223d8a 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -53,12 +53,14 @@ class ShulkerBox extends Opaque{ } } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $shulker = $this->position->getWorld()->getTile($this->position); if($shulker instanceof TileShulkerBox){ $this->facing = $shulker->getFacing(); } + + return $this; } public function getMaxStackSize() : int{ diff --git a/src/block/Skull.php b/src/block/Skull.php index 4dbdfb823e..33da1da9bd 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -77,13 +77,15 @@ class Skull extends Flowable{ $w->writeFacing($this->facing); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileSkull){ $this->skullType = $tile->getSkullType(); $this->rotation = $tile->getRotation(); } + + return $this; } public function writeStateToWorld() : void{ diff --git a/src/block/Stair.php b/src/block/Stair.php index 67a3d7b40e..5a585277bc 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -59,7 +59,7 @@ class Stair extends Transparent{ $w->writeBool($this->upsideDown); } - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $clockwise = Facing::rotateY($this->facing, true); @@ -70,6 +70,8 @@ class Stair extends Transparent{ }else{ $this->shape = StairShape::STRAIGHT(); } + + return $this; } public function isUpsideDown() : bool{ return $this->upsideDown; } diff --git a/src/block/Thin.php b/src/block/Thin.php index ad58244942..28afef3da8 100644 --- a/src/block/Thin.php +++ b/src/block/Thin.php @@ -33,7 +33,7 @@ class Thin extends Transparent{ /** @var bool[] facing => dummy */ protected array $connections = []; - public function readStateFromWorld() : void{ + public function readStateFromWorld() : Block{ parent::readStateFromWorld(); foreach(Facing::HORIZONTAL as $facing){ @@ -44,6 +44,8 @@ class Thin extends Transparent{ unset($this->connections[$facing]); } } + + return $this; } protected function recalculateCollisionBoxes() : array{ diff --git a/src/world/World.php b/src/world/World.php index 3f905e9622..7d5366b0bc 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -824,7 +824,11 @@ class World implements ChunkManager{ } $block = $this->getBlockAt($x, $y, $z); - $block->readStateFromWorld(); //for blocks like fences, force recalculation of connected AABBs + $replacement = $block->readStateFromWorld(); //for blocks like fences, force recalculation of connected AABBs + if($replacement !== $block){ + $replacement->position($this, $x, $y, $z); + $block = $replacement; + } $ev = new BlockUpdateEvent($block); $ev->call(); @@ -1548,7 +1552,11 @@ class World implements ChunkManager{ $addToCache = false; }else{ $dynamicStateRead = true; - $block->readStateFromWorld(); + $replacement = $block->readStateFromWorld(); + if($replacement !== $block){ + $replacement->position($this, $x, $y, $z); + $block = $replacement; + } $dynamicStateRead = false; } From 012b668537774515c0444556d17be4ef8a97d90f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 17 Jul 2022 21:23:41 +0100 Subject: [PATCH 0347/1858] Avoid bogus assumptions about block and item NBT on tiles --- src/block/tile/FlowerPot.php | 3 ++- src/block/tile/ItemFrame.php | 3 ++- src/block/tile/Jukebox.php | 3 ++- src/block/tile/Lectern.php | 3 ++- src/network/mcpe/convert/ItemTranslator.php | 11 +++++++++++ src/network/mcpe/convert/RuntimeBlockMapping.php | 12 ++++++++++++ 6 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 3544cd5fba..e778d0774d 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -31,6 +31,7 @@ use pocketmine\data\SavedDataLoadingException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ShortTag; +use pocketmine\network\mcpe\convert\RuntimeBlockMapping; use pocketmine\world\format\io\GlobalBlockStateHandlers; /** @@ -88,7 +89,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->getStateId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, RuntimeBlockMapping::getInstance()->toStateData($this->plant->getStateId())->toNbt()); } } } diff --git a/src/block/tile/ItemFrame.php b/src/block/tile/ItemFrame.php index 92db02d5f6..7482fa0899 100644 --- a/src/block/tile/ItemFrame.php +++ b/src/block/tile/ItemFrame.php @@ -27,6 +27,7 @@ use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\convert\ItemTranslator; use pocketmine\world\World; /** @@ -99,7 +100,7 @@ class ItemFrame extends Spawnable{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); if(!$this->item->isNull()){ - $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); + $nbt->setTag(self::TAG_ITEM, ItemTranslator::getInstance()->toNetworkNbt($this->item)); } } } diff --git a/src/block/tile/Jukebox.php b/src/block/tile/Jukebox.php index 3154c6a073..12dd3c3028 100644 --- a/src/block/tile/Jukebox.php +++ b/src/block/tile/Jukebox.php @@ -26,6 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\Record; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\convert\ItemTranslator; class Jukebox extends Spawnable{ private const TAG_RECORD = "RecordItem"; //Item CompoundTag @@ -58,7 +59,7 @@ class Jukebox extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ //this is needed for the note particles to show on the client side if($this->record !== null){ - $nbt->setTag(self::TAG_RECORD, $this->record->nbtSerialize()); + $nbt->setTag(self::TAG_RECORD, ItemTranslator::getInstance()->toNetworkNbt($this->record)); } } } diff --git a/src/block/tile/Lectern.php b/src/block/tile/Lectern.php index 28be8904e9..f094d23161 100644 --- a/src/block/tile/Lectern.php +++ b/src/block/tile/Lectern.php @@ -26,6 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\convert\ItemTranslator; use function count; /** @@ -80,7 +81,7 @@ class Lectern extends Spawnable{ $nbt->setByte(self::TAG_HAS_BOOK, $this->book !== null ? 1 : 0); $nbt->setInt(self::TAG_PAGE, $this->viewedPage); if($this->book !== null){ - $nbt->setTag(self::TAG_BOOK, $this->book->nbtSerialize()); + $nbt->setTag(self::TAG_BOOK, ItemTranslator::getInstance()->toNetworkNbt($this->book)); $nbt->setInt(self::TAG_TOTAL_PAGES, count($this->book->getPages())); } } diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index eb36ecdd26..b5a90c8a41 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -28,6 +28,7 @@ use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; +use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; @@ -96,6 +97,16 @@ final class ItemTranslator{ return [$numericId, $itemData->getMeta(), $blockRuntimeId]; } + /** + * @throws ItemTypeSerializeException + */ + public function toNetworkNbt(Item $item) : SavedItemStackData{ + //TODO: this relies on the assumption that network item NBT is the same as disk item NBT, which may not always + //be true - if we stick on an older world version while updating network version, this could be a problem (and + //may be a problem for multi version implementations) + return $this->itemSerializer->serializeStack($item); + } + /** * @throws TypeConversionException */ diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index c5945e28dc..20cea50cbc 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -94,6 +94,18 @@ final class RuntimeBlockMapping{ return $this->networkIdCache[$internalStateId] = $networkId; } + /** + * Looks up the network state data associated with the given internal state ID. + */ + public function toStateData(int $internalStateId) : BlockStateData{ + //we don't directly use the blockstate serializer here - we can't assume that the network blockstate NBT is the + //same as the disk blockstate NBT, in case we decide to have different world version than network version (or in + //case someone wants to implement multi version). + $networkRuntimeId = $this->toRuntimeId($internalStateId); + + return $this->blockStateDictionary->getDataFromStateId($networkRuntimeId) ?? throw new AssumptionFailedError("We just looked up this state ID, so it must exist"); + } + public function getBlockStateDictionary() : BlockStateDictionary{ return $this->blockStateDictionary; } public function getFallbackStateData() : BlockStateData{ return $this->fallbackStateData; } From 172bd9a12906794fa3811a1a01fc1a468a142bbc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 17 Jul 2022 21:24:27 +0100 Subject: [PATCH 0348/1858] ... --- src/network/mcpe/convert/ItemTranslator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index b5a90c8a41..13a9bad4f9 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -28,8 +28,8 @@ use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; use pocketmine\data\bedrock\item\ItemTypeSerializeException; use pocketmine\data\bedrock\item\SavedItemData; -use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\item\Item; +use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -100,11 +100,11 @@ final class ItemTranslator{ /** * @throws ItemTypeSerializeException */ - public function toNetworkNbt(Item $item) : SavedItemStackData{ + public function toNetworkNbt(Item $item) : CompoundTag{ //TODO: this relies on the assumption that network item NBT is the same as disk item NBT, which may not always //be true - if we stick on an older world version while updating network version, this could be a problem (and //may be a problem for multi version implementations) - return $this->itemSerializer->serializeStack($item); + return $this->itemSerializer->serializeStack($item)->toNbt(); } /** From 8660dfe57648dd84faf3430ef0a312f909d30c64 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 18 Jul 2022 15:13:40 +0100 Subject: [PATCH 0349/1858] Generate traits for runtime enum serialization instead of helper classes --- build/generate-runtime-enum-serializers.php | 26 +++++++----- src/block/Bell.php | 6 +-- src/block/Lever.php | 6 +-- src/block/RedMushroomBlock.php | 6 +-- src/block/Skull.php | 6 +-- src/block/Slab.php | 6 +-- src/block/utils/ColoredTrait.php | 6 +-- src/block/utils/CopperTrait.php | 6 +-- src/block/utils/CoralTypeTrait.php | 6 +-- src/data/runtime/RuntimeDataReader.php | 1 + src/data/runtime/RuntimeDataWriter.php | 1 + ...r.php => RuntimeEnumDeserializerTrait.php} | 40 ++++++++++--------- ...zer.php => RuntimeEnumSerializerTrait.php} | 40 ++++++++++--------- src/item/Banner.php | 3 +- src/item/Dye.php | 3 +- src/item/Potion.php | 3 +- src/item/SplashPotion.php | 3 +- 17 files changed, 81 insertions(+), 87 deletions(-) rename src/data/runtime/{RuntimeEnumDeserializer.php => RuntimeEnumDeserializerTrait.php} (85%) rename src/data/runtime/{RuntimeEnumSerializer.php => RuntimeEnumSerializerTrait.php} (84%) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 322a62fb03..ff0ad8bedf 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -59,8 +59,8 @@ function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $lines = []; $functionName = "write$virtualTypeName"; - $lines[] = "public static function $functionName(RuntimeDataWriter \$w, \\$nativeTypeName \$value) : void{"; - $lines[] = "\t\$w->writeInt($bits, match(\$value){"; + $lines[] = "public function $functionName(\\$nativeTypeName \$value) : void{"; + $lines[] = "\t\$this->writeInt($bits, match(\$value){"; foreach($memberNames as $key => $memberName){ $lines[] = "\t\t$memberName => $key,"; @@ -84,8 +84,8 @@ function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $lines = []; $functionName = "read$virtualTypeName"; - $lines[] = "public static function $functionName(RuntimeDataReader \$r) : \\$nativeTypeName{"; - $lines[] = "\treturn match(\$r->readInt($bits)){"; + $lines[] = "public function $functionName() : \\$nativeTypeName{"; + $lines[] = "\treturn match(\$this->readInt($bits)){"; foreach($memberNames as $key => $memberName){ $lines[] = "\t\t$key => $memberName,"; @@ -165,8 +165,16 @@ $enumsUsed = [ PotionType::getAll() ]; -$readerFuncs = []; -$writerFuncs = []; +$readerFuncs = [ + "" => [ + "abstract public function readInt(int \$bits) : int;" + ] +]; +$writerFuncs = [ + "" => [ + "abstract public function writeInt(int \$bits, int \$value) : void;" + ] +]; $functionName = ""; foreach($enumsUsed as $enumMembers){ @@ -220,14 +228,14 @@ namespace pocketmine\data\runtime; HEADER; - echo "final class $className{\n\n"; + echo "trait $className{\n\n"; echo implode("\n\n", array_map(fn(array $functionLines) => "\t" . implode("\n\t", $functionLines), $functions)); echo "\n\n}\n"; file_put_contents(dirname(__DIR__) . '/src/data/runtime/' . $className . '.php', ob_get_clean()); } -printFunctions($writerFuncs, "RuntimeEnumSerializer"); -printFunctions($readerFuncs, "RuntimeEnumDeserializer"); +printFunctions($writerFuncs, "RuntimeEnumSerializerTrait"); +printFunctions($readerFuncs, "RuntimeEnumDeserializerTrait"); echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/block/Bell.php b/src/block/Bell.php index 3f60774306..48ceb667fb 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -29,8 +29,6 @@ use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -52,12 +50,12 @@ final class Bell extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->attachmentType = RuntimeEnumDeserializer::readBellAttachmentType($r); + $this->attachmentType = $r->readBellAttachmentType(); $this->facing = $r->readHorizontalFacing(); } protected function encodeState(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeBellAttachmentType($w, $this->attachmentType); + $w->writeBellAttachmentType($this->attachmentType); $w->writeHorizontalFacing($this->facing); } diff --git a/src/block/Lever.php b/src/block/Lever.php index 55f7ba0e89..a8d31cd29b 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -26,8 +26,6 @@ namespace pocketmine\block; use pocketmine\block\utils\LeverFacing; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -50,12 +48,12 @@ class Lever extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = RuntimeEnumDeserializer::readLeverFacing($r); + $this->facing = $r->readLeverFacing(); $this->activated = $r->readBool(); } protected function encodeState(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeLeverFacing($w, $this->facing); + $w->writeLeverFacing($this->facing); $w->writeBool($this->activated); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 17f9d44907..a36182da16 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -26,8 +26,6 @@ namespace pocketmine\block; use pocketmine\block\utils\MushroomBlockType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use function mt_rand; @@ -42,11 +40,11 @@ class RedMushroomBlock extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->mushroomBlockType = RuntimeEnumDeserializer::readMushroomBlockType($r); + $this->mushroomBlockType = $r->readMushroomBlockType(); } protected function encodeState(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeMushroomBlockType($w, $this->mushroomBlockType); + $w->writeMushroomBlockType($this->mushroomBlockType); } public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; } diff --git a/src/block/Skull.php b/src/block/Skull.php index 33da1da9bd..25730341ac 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -28,8 +28,6 @@ use pocketmine\block\utils\SkullType; use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -56,11 +54,11 @@ class Skull extends Flowable{ public function getRequiredTypeDataBits() : int{ return 3; } protected function decodeType(RuntimeDataReader $r) : void{ - $this->skullType = RuntimeEnumDeserializer::readSkullType($r); + $this->skullType = $r->readSkullType(); } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeSkullType($w, $this->skullType); + $w->writeSkullType($this->skullType); } public function getRequiredStateDataBits() : int{ return 3; } diff --git a/src/block/Slab.php b/src/block/Slab.php index a1604d79c3..cff1079cbe 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -27,8 +27,6 @@ use pocketmine\block\utils\SlabType; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -47,11 +45,11 @@ class Slab extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } protected function decodeState(RuntimeDataReader $r) : void{ - $this->slabType = RuntimeEnumDeserializer::readSlabType($r); + $this->slabType = $r->readSlabType(); } protected function encodeState(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeSlabType($w, $this->slabType); + $w->writeSlabType($this->slabType); } public function isTransparent() : bool{ diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 3529f45afa..7abfd82b72 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -26,8 +26,6 @@ namespace pocketmine\block\utils; use pocketmine\block\Block; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; trait ColoredTrait{ /** @var DyeColor */ @@ -37,12 +35,12 @@ trait ColoredTrait{ /** @see Block::decodeType() */ protected function decodeType(RuntimeDataReader $r) : void{ - $this->color = RuntimeEnumDeserializer::readDyeColor($r); + $this->color = $r->readDyeColor(); } /** @see Block::encodeType() */ protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeDyeColor($w, $this->color); + $w->writeDyeColor($this->color); } public function getColor() : DyeColor{ return $this->color; } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index c1730cb262..eefb8d445d 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -25,8 +25,6 @@ namespace pocketmine\block\utils; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; @@ -43,12 +41,12 @@ trait CopperTrait{ public function getRequiredTypeDataBits() : int{ return 3; } protected function decodeType(RuntimeDataReader $r) : void{ - $this->oxidation = RuntimeEnumDeserializer::readCopperOxidation($r); + $this->oxidation = $r->readCopperOxidation(); $this->waxed = $r->readBool(); } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeCopperOxidation($w, $this->oxidation); + $w->writeCopperOxidation($this->oxidation); $w->writeBool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 2e301f302d..7ce28caa0d 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -26,8 +26,6 @@ namespace pocketmine\block\utils; use pocketmine\block\Block; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumDeserializer; -use pocketmine\data\runtime\RuntimeEnumSerializer; trait CoralTypeTrait{ protected CoralType $coralType; @@ -37,13 +35,13 @@ trait CoralTypeTrait{ /** @see Block::decodeType() */ protected function decodeType(RuntimeDataReader $r) : void{ - $this->coralType = RuntimeEnumDeserializer::readCoralType($r); + $this->coralType = $r->readCoralType(); $this->dead = $r->readBool(); } /** @see Block::encodeType() */ protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeCoralType($w, $this->coralType); + $w->writeCoralType($this->coralType); $w->writeBool($this->dead); } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index a5bcc72cfa..7fbede9b1c 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -29,6 +29,7 @@ use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; final class RuntimeDataReader{ + use RuntimeEnumDeserializerTrait; private int $offset = 0; diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index c475e4428d..ac7f1f464d 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -29,6 +29,7 @@ use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; final class RuntimeDataWriter{ + use RuntimeEnumSerializerTrait; private int $value = 0; private int $offset = 0; diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php similarity index 85% rename from src/data/runtime/RuntimeEnumDeserializer.php rename to src/data/runtime/RuntimeEnumDeserializerTrait.php index fe20039d63..b23ec5435b 100644 --- a/src/data/runtime/RuntimeEnumDeserializer.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -27,10 +27,12 @@ namespace pocketmine\data\runtime; * This class is auto-generated. Do not edit it manually. * @see build/generate-runtime-enum-serializers.php */ -final class RuntimeEnumDeserializer{ +trait RuntimeEnumDeserializerTrait{ - public static function readBellAttachmentType(RuntimeDataReader $r) : \pocketmine\block\utils\BellAttachmentType{ - return match($r->readInt(2)){ + abstract public function readInt(int $bits) : int; + + public function readBellAttachmentType() : \pocketmine\block\utils\BellAttachmentType{ + return match($this->readInt(2)){ 0 => \pocketmine\block\utils\BellAttachmentType::CEILING(), 1 => \pocketmine\block\utils\BellAttachmentType::FLOOR(), 2 => \pocketmine\block\utils\BellAttachmentType::ONE_WALL(), @@ -39,8 +41,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readCopperOxidation(RuntimeDataReader $r) : \pocketmine\block\utils\CopperOxidation{ - return match($r->readInt(2)){ + public function readCopperOxidation() : \pocketmine\block\utils\CopperOxidation{ + return match($this->readInt(2)){ 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED(), 1 => \pocketmine\block\utils\CopperOxidation::NONE(), 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED(), @@ -49,8 +51,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readCoralType(RuntimeDataReader $r) : \pocketmine\block\utils\CoralType{ - return match($r->readInt(3)){ + public function readCoralType() : \pocketmine\block\utils\CoralType{ + return match($this->readInt(3)){ 0 => \pocketmine\block\utils\CoralType::BRAIN(), 1 => \pocketmine\block\utils\CoralType::BUBBLE(), 2 => \pocketmine\block\utils\CoralType::FIRE(), @@ -60,8 +62,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readDyeColor(RuntimeDataReader $r) : \pocketmine\block\utils\DyeColor{ - return match($r->readInt(4)){ + public function readDyeColor() : \pocketmine\block\utils\DyeColor{ + return match($this->readInt(4)){ 0 => \pocketmine\block\utils\DyeColor::BLACK(), 1 => \pocketmine\block\utils\DyeColor::BLUE(), 2 => \pocketmine\block\utils\DyeColor::BROWN(), @@ -82,8 +84,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readLeverFacing(RuntimeDataReader $r) : \pocketmine\block\utils\LeverFacing{ - return match($r->readInt(3)){ + public function readLeverFacing() : \pocketmine\block\utils\LeverFacing{ + return match($this->readInt(3)){ 0 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X(), 1 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_Z(), 2 => \pocketmine\block\utils\LeverFacing::EAST(), @@ -96,8 +98,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readMushroomBlockType(RuntimeDataReader $r) : \pocketmine\block\utils\MushroomBlockType{ - return match($r->readInt(4)){ + public function readMushroomBlockType() : \pocketmine\block\utils\MushroomBlockType{ + return match($this->readInt(4)){ 0 => \pocketmine\block\utils\MushroomBlockType::ALL_CAP(), 1 => \pocketmine\block\utils\MushroomBlockType::CAP_EAST(), 2 => \pocketmine\block\utils\MushroomBlockType::CAP_MIDDLE(), @@ -113,8 +115,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readPotionType(RuntimeDataReader $r) : \pocketmine\item\PotionType{ - return match($r->readInt(6)){ + public function readPotionType() : \pocketmine\item\PotionType{ + return match($this->readInt(6)){ 0 => \pocketmine\item\PotionType::AWKWARD(), 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE(), 2 => \pocketmine\item\PotionType::HARMING(), @@ -161,8 +163,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readSkullType(RuntimeDataReader $r) : \pocketmine\block\utils\SkullType{ - return match($r->readInt(3)){ + public function readSkullType() : \pocketmine\block\utils\SkullType{ + return match($this->readInt(3)){ 0 => \pocketmine\block\utils\SkullType::CREEPER(), 1 => \pocketmine\block\utils\SkullType::DRAGON(), 2 => \pocketmine\block\utils\SkullType::PLAYER(), @@ -173,8 +175,8 @@ final class RuntimeEnumDeserializer{ }; } - public static function readSlabType(RuntimeDataReader $r) : \pocketmine\block\utils\SlabType{ - return match($r->readInt(2)){ + public function readSlabType() : \pocketmine\block\utils\SlabType{ + return match($this->readInt(2)){ 0 => \pocketmine\block\utils\SlabType::BOTTOM(), 1 => \pocketmine\block\utils\SlabType::DOUBLE(), 2 => \pocketmine\block\utils\SlabType::TOP(), diff --git a/src/data/runtime/RuntimeEnumSerializer.php b/src/data/runtime/RuntimeEnumSerializerTrait.php similarity index 84% rename from src/data/runtime/RuntimeEnumSerializer.php rename to src/data/runtime/RuntimeEnumSerializerTrait.php index 53593588f1..ec423dcd9f 100644 --- a/src/data/runtime/RuntimeEnumSerializer.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -27,10 +27,12 @@ namespace pocketmine\data\runtime; * This class is auto-generated. Do not edit it manually. * @see build/generate-runtime-enum-serializers.php */ -final class RuntimeEnumSerializer{ +trait RuntimeEnumSerializerTrait{ - public static function writeBellAttachmentType(RuntimeDataWriter $w, \pocketmine\block\utils\BellAttachmentType $value) : void{ - $w->writeInt(2, match($value){ + abstract public function writeInt(int $bits, int $value) : void; + + public function writeBellAttachmentType(\pocketmine\block\utils\BellAttachmentType $value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\BellAttachmentType::CEILING() => 0, \pocketmine\block\utils\BellAttachmentType::FLOOR() => 1, \pocketmine\block\utils\BellAttachmentType::ONE_WALL() => 2, @@ -39,8 +41,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeCopperOxidation(RuntimeDataWriter $w, \pocketmine\block\utils\CopperOxidation $value) : void{ - $w->writeInt(2, match($value){ + public function writeCopperOxidation(\pocketmine\block\utils\CopperOxidation $value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\CopperOxidation::EXPOSED() => 0, \pocketmine\block\utils\CopperOxidation::NONE() => 1, \pocketmine\block\utils\CopperOxidation::OXIDIZED() => 2, @@ -49,8 +51,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeCoralType(RuntimeDataWriter $w, \pocketmine\block\utils\CoralType $value) : void{ - $w->writeInt(3, match($value){ + public function writeCoralType(\pocketmine\block\utils\CoralType $value) : void{ + $this->writeInt(3, match($value){ \pocketmine\block\utils\CoralType::BRAIN() => 0, \pocketmine\block\utils\CoralType::BUBBLE() => 1, \pocketmine\block\utils\CoralType::FIRE() => 2, @@ -60,8 +62,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeDyeColor(RuntimeDataWriter $w, \pocketmine\block\utils\DyeColor $value) : void{ - $w->writeInt(4, match($value){ + public function writeDyeColor(\pocketmine\block\utils\DyeColor $value) : void{ + $this->writeInt(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, \pocketmine\block\utils\DyeColor::BLUE() => 1, \pocketmine\block\utils\DyeColor::BROWN() => 2, @@ -82,8 +84,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeLeverFacing(RuntimeDataWriter $w, \pocketmine\block\utils\LeverFacing $value) : void{ - $w->writeInt(3, match($value){ + public function writeLeverFacing(\pocketmine\block\utils\LeverFacing $value) : void{ + $this->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, @@ -96,8 +98,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeMushroomBlockType(RuntimeDataWriter $w, \pocketmine\block\utils\MushroomBlockType $value) : void{ - $w->writeInt(4, match($value){ + public function writeMushroomBlockType(\pocketmine\block\utils\MushroomBlockType $value) : void{ + $this->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, @@ -113,8 +115,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writePotionType(RuntimeDataWriter $w, \pocketmine\item\PotionType $value) : void{ - $w->writeInt(6, match($value){ + public function writePotionType(\pocketmine\item\PotionType $value) : void{ + $this->writeInt(6, match($value){ \pocketmine\item\PotionType::AWKWARD() => 0, \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, \pocketmine\item\PotionType::HARMING() => 2, @@ -161,8 +163,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeSkullType(RuntimeDataWriter $w, \pocketmine\block\utils\SkullType $value) : void{ - $w->writeInt(3, match($value){ + public function writeSkullType(\pocketmine\block\utils\SkullType $value) : void{ + $this->writeInt(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, \pocketmine\block\utils\SkullType::DRAGON() => 1, \pocketmine\block\utils\SkullType::PLAYER() => 2, @@ -173,8 +175,8 @@ final class RuntimeEnumSerializer{ }); } - public static function writeSlabType(RuntimeDataWriter $w, \pocketmine\block\utils\SlabType $value) : void{ - $w->writeInt(2, match($value){ + public function writeSlabType(\pocketmine\block\utils\SlabType $value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\SlabType::BOTTOM() => 0, \pocketmine\block\utils\SlabType::DOUBLE() => 1, \pocketmine\block\utils\SlabType::TOP() => 2, diff --git a/src/item/Banner.php b/src/item/Banner.php index 57202d388c..6fd242c035 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -30,7 +30,6 @@ use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; @@ -65,7 +64,7 @@ class Banner extends ItemBlockWallOrFloor{ } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeDyeColor($w, $this->color); + $w->writeDyeColor($this->color); } /** diff --git a/src/item/Dye.php b/src/item/Dye.php index fa93a1471f..70b0730590 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -25,7 +25,6 @@ namespace pocketmine\item; use pocketmine\block\utils\DyeColor; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumSerializer; class Dye extends Item{ private DyeColor $color; @@ -36,7 +35,7 @@ class Dye extends Item{ } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writeDyeColor($w, $this->color); + $w->writeDyeColor($this->color); } public function getColor() : DyeColor{ diff --git a/src/item/Potion.php b/src/item/Potion.php index 462d6abed0..d1e40b673f 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\entity\Living; use pocketmine\player\Player; @@ -38,7 +37,7 @@ class Potion extends Item implements ConsumableItem{ } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writePotionType($w, $this->potionType); + $w->writePotionType($this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index ab1bab4d3c..52ae10e64a 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\data\runtime\RuntimeDataWriter; -use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; use pocketmine\entity\projectile\Throwable; @@ -40,7 +39,7 @@ class SplashPotion extends ProjectileItem{ } protected function encodeType(RuntimeDataWriter $w) : void{ - RuntimeEnumSerializer::writePotionType($w, $this->potionType); + $w->writePotionType($this->potionType); } public function getType() : PotionType{ return $this->potionType; } From b8d1b00985bc0495247793ac6431107bb56182e3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 18 Jul 2022 15:26:14 +0100 Subject: [PATCH 0350/1858] phpstan fail very sad :( --- build/generate-runtime-enum-serializers.php | 2 +- src/data/runtime/RuntimeEnumSerializerTrait.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index ff0ad8bedf..944eb97728 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -172,7 +172,7 @@ $readerFuncs = [ ]; $writerFuncs = [ "" => [ - "abstract public function writeInt(int \$bits, int \$value) : void;" + "abstract public function writeInt(int \$bits, int \$value) : self;" ] ]; $functionName = ""; diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index ec423dcd9f..8d0d98a9fc 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -29,7 +29,7 @@ namespace pocketmine\data\runtime; */ trait RuntimeEnumSerializerTrait{ - abstract public function writeInt(int $bits, int $value) : void; + abstract public function writeInt(int $bits, int $value) : self; public function writeBellAttachmentType(\pocketmine\block\utils\BellAttachmentType $value) : void{ $this->writeInt(2, match($value){ From cf34f88a679296f552b8663b97090342d86f5b0d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 18 Jul 2022 15:48:03 +0100 Subject: [PATCH 0351/1858] Make Block::decodeState() and encodeState() more codegen-friendly --- src/block/BrewingStand.php | 21 ++-------------- src/block/Vine.php | 8 ++---- src/data/runtime/RuntimeDataReader.php | 34 ++++++++++++++++++++++++++ src/data/runtime/RuntimeDataWriter.php | 34 ++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index c35576d585..c0e3d9e378 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -47,28 +47,11 @@ class BrewingStand extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(RuntimeDataReader $r) : void{ - $result = []; - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ - if($r->readBool()){ - $result[$member->id()] = $member; - } - } - - $this->setSlots($result); + $this->setSlots($r->readBrewingStandSlots()); } protected function encodeState(RuntimeDataWriter $w) : void{ - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ - $w->writeBool(isset($this->slots[$member->id()])); - } + $w->writeBrewingStandSlots($this->getSlots()); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Vine.php b/src/block/Vine.php index d716b5eb81..a90de6c8da 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -43,15 +43,11 @@ class Vine extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ - foreach(Facing::HORIZONTAL as $facing){ - $this->setFace($facing, $r->readBool()); - } + $this->faces = $r->readHorizontalFacingFlags(); } protected function encodeState(RuntimeDataWriter $w) : void{ - foreach(Facing::HORIZONTAL as $facing){ - $w->writeBool($this->hasFace($facing)); - } + $w->writeHorizontalFacingFlags($this->faces); } /** @return int[] */ diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 7fbede9b1c..5ed08cdf8c 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; +use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -71,6 +72,20 @@ final class RuntimeDataReader{ }; } + /** + * @return int[] + */ + public function readHorizontalFacingFlags() : array{ + $result = []; + foreach(Facing::HORIZONTAL as $facing){ + if($this->readBool()){ + $result[$facing] = $facing; + } + } + + return $result; + } + public function readFacing() : int{ return match($this->readInt(3)){ 0 => Facing::DOWN, @@ -121,5 +136,24 @@ final class RuntimeDataReader{ return $connections; } + /** + * @return BrewingStandSlot[] + * @phpstan-return array + */ + public function readBrewingStandSlots() : array{ + $result = []; + foreach([ + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), + ] as $member){ + if($this->readBool()){ + $result[$member->id()] = $member; + } + } + + return $result; + } + public function getOffset() : int{ return $this->offset; } } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index ac7f1f464d..a0d7ba7ba0 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -23,10 +23,12 @@ declare(strict_types=1); namespace pocketmine\data\runtime; +use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; +use function array_flip; final class RuntimeDataWriter{ use RuntimeEnumSerializerTrait; @@ -78,6 +80,20 @@ final class RuntimeDataWriter{ }); } + /** + * @param int[] $faces + * + * @return $this + */ + public function writeHorizontalFacingFlags(array $faces) : self{ + $uniqueFaces = array_flip($faces); + foreach(Facing::HORIZONTAL as $facing){ + $this->writeBool(isset($uniqueFaces[$facing])); + } + + return $this; + } + public function writeFacing(int $facing) : self{ return $this->writeInt(3, match($facing){ 0 => Facing::DOWN, @@ -125,6 +141,24 @@ final class RuntimeDataWriter{ return $this; } + /** + * @param BrewingStandSlot[] $slots + * @phpstan-param array $slots + * + * @return $this + */ + public function writeBrewingStandSlots(array $slots) : self{ + foreach([ + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), + ] as $member){ + $this->writeBool(isset($slots[$member->id()])); + } + + return $this; + } + public function getValue() : int{ return $this->value; } public function getOffset() : int{ return $this->offset; } From 6d4279671e7ee5b0987f1e8e0e1e9c076fd0565a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 18 Jul 2022 18:25:41 +0100 Subject: [PATCH 0352/1858] A giant hack to cut down code needed for runtime block serialization by 50% this also avoids repeated information and inconsistencies. --- build/generate-runtime-enum-serializers.php | 15 ++-- src/block/Anvil.php | 16 +--- src/block/Bamboo.php | 14 +-- src/block/BambooSapling.php | 8 +- src/block/Barrel.php | 11 +-- src/block/Bed.php | 14 +-- src/block/Bedrock.php | 8 +- src/block/Bell.php | 11 +-- src/block/Block.php | 22 ++--- src/block/BrewingStand.php | 8 +- src/block/Button.php | 11 +-- src/block/Cactus.php | 8 +- src/block/Cake.php | 8 +- src/block/CakeWithDyedCandle.php | 6 ++ src/block/Candle.php | 12 +-- src/block/CocoaBlock.php | 11 +-- src/block/CopperStairs.php | 6 ++ src/block/Crops.php | 8 +- src/block/DaylightSensor.php | 11 +-- src/block/DetectorRail.php | 11 +-- src/block/Dirt.php | 8 +- src/block/Door.php | 17 ++-- src/block/DoublePlant.php | 8 +- src/block/DyedCandle.php | 6 ++ src/block/EndPortalFrame.php | 11 +-- src/block/Farmland.php | 8 +- src/block/FenceGate.php | 14 +-- src/block/Fire.php | 8 +- src/block/FloorCoralFan.php | 8 +- src/block/FrostedIce.php | 8 +- src/block/Furnace.php | 11 +-- src/block/Hopper.php | 16 +--- src/block/ItemFrame.php | 19 ++-- src/block/Lantern.php | 8 +- src/block/Leaves.php | 11 +-- src/block/Lectern.php | 11 +-- src/block/Lever.php | 11 +-- src/block/Light.php | 8 +- src/block/Liquid.php | 14 +-- src/block/NetherPortal.php | 8 +- src/block/NetherWartPlant.php | 8 +- src/block/Rail.php | 13 +-- src/block/RedMushroomBlock.php | 8 +- src/block/RedstoneComparator.php | 15 +--- src/block/RedstoneLamp.php | 8 +- src/block/RedstoneOre.php | 8 +- src/block/RedstoneRepeater.php | 14 +-- src/block/RedstoneTorch.php | 11 +-- src/block/Sapling.php | 8 +- src/block/SeaPickle.php | 11 +-- src/block/ShulkerBox.php | 6 +- src/block/SimplePressurePlate.php | 8 +- src/block/Skull.php | 21 +---- src/block/Slab.php | 8 +- src/block/SnowLayer.php | 8 +- src/block/Sponge.php | 8 +- src/block/Stair.php | 11 +-- src/block/StraightOnlyRail.php | 13 +-- src/block/Sugarcane.php | 8 +- src/block/SweetBerryBush.php | 8 +- src/block/TNT.php | 16 +--- src/block/Torch.php | 13 +-- src/block/Trapdoor.php | 14 +-- src/block/Tripwire.php | 17 ++-- src/block/TripwireHook.php | 14 +-- src/block/UnknownBlock.php | 8 +- src/block/Vine.php | 8 +- src/block/Wall.php | 11 +-- src/block/WallCoralFan.php | 8 +- src/block/Wood.php | 8 +- .../AnalogRedstoneSignalEmitterTrait.php | 8 +- src/block/utils/AnyFacingTrait.php | 8 +- src/block/utils/CandleTrait.php | 8 +- src/block/utils/ColoredTrait.php | 11 +-- src/block/utils/CopperTrait.php | 20 +++-- src/block/utils/CoralTypeTrait.php | 14 +-- src/block/utils/HorizontalFacingTrait.php | 8 +- src/block/utils/PillarRotationTrait.php | 8 +- .../utils/RailPoweredByRedstoneTrait.php | 11 +-- src/block/utils/SignLikeRotationTrait.php | 8 +- src/data/runtime/RuntimeDataReader.php | 88 +++++++++++++------ src/data/runtime/RuntimeDataWriter.php | 65 +++++++------- .../runtime/RuntimeEnumDeserializerTrait.php | 38 ++++---- .../runtime/RuntimeEnumSerializerTrait.php | 38 ++++---- src/item/Banner.php | 2 +- src/item/CoralFan.php | 2 +- src/item/Dye.php | 2 +- src/item/ItemBlock.php | 2 +- src/item/Potion.php | 2 +- src/item/SplashPotion.php | 2 +- 90 files changed, 380 insertions(+), 717 deletions(-) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 944eb97728..65d2b3a612 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -41,6 +41,7 @@ use function dirname; use function file_put_contents; use function implode; use function ksort; +use function lcfirst; use function log; use function ob_get_clean; use function ob_start; @@ -58,9 +59,9 @@ function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $bits = getBitsRequired($memberNames); $lines = []; - $functionName = "write$virtualTypeName"; + $functionName = lcfirst($virtualTypeName); $lines[] = "public function $functionName(\\$nativeTypeName \$value) : void{"; - $lines[] = "\t\$this->writeInt($bits, match(\$value){"; + $lines[] = "\t\$this->int($bits, match(\$value){"; foreach($memberNames as $key => $memberName){ $lines[] = "\t\t$memberName => $key,"; @@ -83,9 +84,9 @@ function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $bits = getBitsRequired($memberNames); $lines = []; - $functionName = "read$virtualTypeName"; - $lines[] = "public function $functionName() : \\$nativeTypeName{"; - $lines[] = "\treturn match(\$this->readInt($bits)){"; + $functionName = lcfirst($virtualTypeName); + $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; + $lines[] = "\t\$value = match(\$this->readInt($bits)){"; foreach($memberNames as $key => $memberName){ $lines[] = "\t\t$key => $memberName,"; @@ -167,12 +168,12 @@ $enumsUsed = [ $readerFuncs = [ "" => [ - "abstract public function readInt(int \$bits) : int;" + "abstract protected function readInt(int \$bits) : int;" ] ]; $writerFuncs = [ "" => [ - "abstract public function writeInt(int \$bits, int \$value) : self;" + "abstract public function int(int \$bits, int \$value) : void;" ] ]; $functionName = ""; diff --git a/src/block/Anvil.php b/src/block/Anvil.php index aed4dac0b1..0472e4cc79 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -49,22 +49,14 @@ class Anvil extends Transparent implements Fallable{ public function getRequiredTypeDataBits() : int{ return 2; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED)); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->getDamage()); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->setFacing($r->readHorizontalFacing()); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->getFacing()); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); } public function getDamage() : int{ return $this->damage; } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 61cb7c6655..f231d19b53 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -58,16 +58,10 @@ class Bamboo extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->setLeafSize($r->readBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES)); - $this->setThick($r->readBool()); - $this->setReady($r->readBool()); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->getLeafSize()); - $w->writeBool($this->isThick()); - $w->writeBool($this->isReady()); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); + $w->bool($this->thick); + $w->bool($this->ready); } public function isThick() : bool{ return $this->thick; } diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index d005f37647..216dc255a3 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -39,12 +39,8 @@ final class BambooSapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->setReady($r->readBool()); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->isReady()); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->ready); } public function isReady() : bool{ return $this->ready; } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 14ef97e099..68c3448250 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -41,14 +41,9 @@ class Barrel extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->setFacing($r->readFacing()); - $this->setOpen($r->readBool()); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->getFacing()); - $w->writeBool($this->isOpen()); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facing($this->facing); + $w->bool($this->open); } public function isOpen() : bool{ diff --git a/src/block/Bed.php b/src/block/Bed.php index 258f9ce064..350bf865df 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -56,16 +56,10 @@ class Bed extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->occupied = $r->readBool(); - $this->head = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->occupied); - $w->writeBool($this->head); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->occupied); + $w->bool($this->head); } public function readStateFromWorld() : Block{ diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index ac8e95037b..b4252d27c6 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -31,12 +31,8 @@ class Bedrock extends Opaque{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->burnsForever = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->burnsForever); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->burnsForever); } public function burnsForever() : bool{ diff --git a/src/block/Bell.php b/src/block/Bell.php index 48ceb667fb..3cc131792d 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -49,14 +49,9 @@ final class Bell extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->attachmentType = $r->readBellAttachmentType(); - $this->facing = $r->readHorizontalFacing(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBellAttachmentType($this->attachmentType); - $w->writeHorizontalFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bellAttachmentType($this->attachmentType); + $w->horizontalFacing($this->facing); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Block.php b/src/block/Block.php index 383b28797c..aab1a3bc89 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -107,7 +107,7 @@ class Block{ $givenBits = $typeBits; $reader = new RuntimeDataReader($givenBits, $data); - $this->decodeType($reader); + $this->describeType($reader); $readBits = $reader->getOffset(); if($typeBits !== $readBits){ throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were provided, but $readBits were read"); @@ -124,21 +124,13 @@ class Block{ $reader = new RuntimeDataReader($givenBits, $data); $this->decodeTypeData($reader->readInt($typeBits)); - $this->decodeState($reader); + $this->describeState($reader); $readBits = $reader->getOffset() - $typeBits; if($stateBits !== $readBits){ throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); } } - protected function decodeType(RuntimeDataReader $r) : void{ - //NOOP - } - - protected function decodeState(RuntimeDataReader $r) : void{ - //NOOP - } - /** * @internal */ @@ -147,7 +139,7 @@ class Block{ $requiredBits = $typeBits; $writer = new RuntimeDataWriter($requiredBits); - $this->encodeType($writer); + $this->describeType($writer); $writtenBits = $writer->getOffset(); if($typeBits !== $writtenBits){ throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were expected, but $writtenBits were written"); @@ -164,9 +156,9 @@ class Block{ $stateBits = $this->getRequiredStateDataBits(); $requiredBits = $typeBits + $stateBits; $writer = new RuntimeDataWriter($requiredBits); - $writer->writeInt($typeBits, $this->computeTypeData()); + $writer->int($typeBits, $this->computeTypeData()); - $this->encodeState($writer); + $this->describeState($writer); $writtenBits = $writer->getOffset() - $typeBits; if($stateBits !== $writtenBits){ throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); @@ -175,11 +167,11 @@ class Block{ return $writer->getValue(); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ //NOOP } - protected function encodeState(RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ //NOOP } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index c0e3d9e378..dabaa75e20 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -46,12 +46,8 @@ class BrewingStand extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->setSlots($r->readBrewingStandSlots()); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBrewingStandSlots($this->getSlots()); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->brewingStandSlots($this->slots); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Button.php b/src/block/Button.php index 1ffca43875..98fcf69a24 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -41,14 +41,9 @@ abstract class Button extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readFacing(); - $this->pressed = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); - $w->writeBool($this->pressed); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facing($this->facing); + $w->bool($this->pressed); } public function isPressed() : bool{ return $this->pressed; } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index f1c4a59097..40087f53e6 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -44,12 +44,8 @@ class Cactus extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Cake.php b/src/block/Cake.php index e6b152ce02..a17a767c1c 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -39,12 +39,8 @@ class Cake extends BaseCake{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->bites = $r->readBoundedInt(3, 0, self::MAX_BITES); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, 0, self::MAX_BITES, $this->bites); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } /** diff --git a/src/block/CakeWithDyedCandle.php b/src/block/CakeWithDyedCandle.php index 959017e4d7..211da887a8 100644 --- a/src/block/CakeWithDyedCandle.php +++ b/src/block/CakeWithDyedCandle.php @@ -24,10 +24,16 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; +use pocketmine\block\utils\DyeColor; class CakeWithDyedCandle extends CakeWithCandle{ use ColoredTrait; + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + $this->color = DyeColor::WHITE(); + parent::__construct($idInfo, $name, $breakInfo); + } + public function getCandle() : Candle{ return VanillaBlocks::DYED_CANDLE()->setColor($this->color); } diff --git a/src/block/Candle.php b/src/block/Candle.php index b917b71011..bda600edcd 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -37,8 +37,7 @@ use pocketmine\world\BlockTransaction; class Candle extends Transparent{ use CandleTrait { - decodeState as decodeLitState; - encodeState as encodeLitState; + describeState as encodeLitState; getLightLevel as getBaseLightLevel; } @@ -51,14 +50,9 @@ class Candle extends Transparent{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->decodeLitState($r); - $this->count = $r->readBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ $this->encodeLitState($w); - $w->writeBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); } public function getCount() : int{ return $this->count; } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 4144bd754d..47213f82f0 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -49,14 +49,9 @@ class CocoaBlock extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/CopperStairs.php b/src/block/CopperStairs.php index b16d49ec1e..a932938d22 100644 --- a/src/block/CopperStairs.php +++ b/src/block/CopperStairs.php @@ -23,8 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CopperTrait; class CopperStairs extends Stair{ use CopperTrait; + + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + $this->oxidation = CopperOxidation::NONE(); + parent::__construct($idInfo, $name, $breakInfo); + } } diff --git a/src/block/Crops.php b/src/block/Crops.php index 092632bb27..4052485c60 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -41,12 +41,8 @@ abstract class Crops extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(3, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 77a28274ce..d266817d11 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -44,14 +44,9 @@ class DaylightSensor extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->signalStrength = $r->readBoundedInt(4, 0, 15); - $this->inverted = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, 15, $this->signalStrength); - $w->writeBool($this->inverted); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, 15, $this->signalStrength); + $w->bool($this->inverted); } public function isInverted() : bool{ diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 7165972147..92c60f9f88 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -31,14 +31,9 @@ class DetectorRail extends StraightOnlyRail{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - parent::decodeState($r); - $this->activated = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - parent::encodeState($w); - $w->writeBool($this->activated); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + parent::describeState($w); + $w->bool($this->activated); } public function isActivated() : bool{ return $this->activated; } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index cdf24be721..c1e4e26c1a 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -37,12 +37,8 @@ class Dirt extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->coarse = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBool($this->coarse); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->coarse); } public function isCoarse() : bool{ return $this->coarse; } diff --git a/src/block/Door.php b/src/block/Door.php index 9f99de8498..366670a418 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -44,18 +44,11 @@ class Door extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->top = $r->readBool(); - $this->hingeRight = $r->readBool(); - $this->open = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->top); - $w->writeBool($this->hingeRight); - $w->writeBool($this->open); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->top); + $w->bool($this->hingeRight); + $w->bool($this->open); } public function readStateFromWorld() : Block{ diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index f291298f48..4874826d29 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -36,12 +36,8 @@ class DoublePlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->top = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->top); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->top); } public function isTop() : bool{ return $this->top; } diff --git a/src/block/DyedCandle.php b/src/block/DyedCandle.php index b90aabac1d..76b9a14276 100644 --- a/src/block/DyedCandle.php +++ b/src/block/DyedCandle.php @@ -24,10 +24,16 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; +use pocketmine\block\utils\DyeColor; class DyedCandle extends Candle{ use ColoredTrait; + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + $this->color = DyeColor::WHITE(); + parent::__construct($idInfo, $name, $breakInfo); + } + protected function getCandleIfCompatibleType(Block $block) : ?Candle{ $result = parent::getCandleIfCompatibleType($block); //different coloured candles can't be combined in the same block diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 5cc4294c89..2e42509848 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -38,14 +38,9 @@ class EndPortalFrame extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->eye = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->eye); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->eye); } public function hasEye() : bool{ return $this->eye; } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 9cbb55c93b..037f31bbb2 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -40,12 +40,8 @@ class Farmland extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, 0, self::MAX_WETNESS, $this->wetness); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } public function getWetness() : int{ return $this->wetness; } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 2eafb99587..d18f1dcc06 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -45,16 +45,10 @@ class FenceGate extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->open = $r->readBool(); - $this->inWall = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->open); - $w->writeBool($this->inWall); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->open); + $w->bool($this->inWall); } public function isOpen() : bool{ return $this->open; } diff --git a/src/block/Fire.php b/src/block/Fire.php index 45546c7207..30ecb61388 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -42,12 +42,8 @@ class Fire extends BaseFire{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 24769ae5bb..250fe0e4c4 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -40,12 +40,8 @@ final class FloorCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->axis = $r->readHorizontalAxis(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalAxis($this->axis); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalAxis($this->axis); } public function getAxis() : int{ return $this->axis; } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 8aba73644f..0cce7ca98e 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -35,12 +35,8 @@ class FrostedIce extends Ice{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 5e2f19aabd..3ec3958838 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -41,14 +41,9 @@ class Furnace extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->lit = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->lit); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->lit); } public function getLightLevel() : int{ diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 9b0996d924..603a48baeb 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -43,18 +42,9 @@ class Hopper extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $facing = $r->readFacing(); - if($facing === Facing::UP){ - throw new InvalidSerializedRuntimeDataException("Hopper may not face upward"); - } - $this->facing = $facing; - $this->powered = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facingExcept($this->facing, Facing::UP); + $w->bool($this->powered); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 8785fbd541..8443972ec8 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -51,24 +51,15 @@ class ItemFrame extends Flowable{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->glowing = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBool($this->glowing); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->glowing); } public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readFacing(); - $this->hasMap = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); - $w->writeBool($this->hasMap); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facing($this->facing); + $w->bool($this->hasMap); } public function readStateFromWorld() : Block{ diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 825a545607..d33ed5883d 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -46,12 +46,8 @@ class Lantern extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->hanging = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->hanging); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->hanging); } public function isHanging() : bool{ return $this->hanging; } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 93c423e06a..c63939cd8a 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -50,14 +50,9 @@ class Leaves extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->noDecay = $r->readBool(); - $this->checkDecay = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->noDecay); - $w->writeBool($this->checkDecay); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->noDecay); + $w->bool($this->checkDecay); } public function isNoDecay() : bool{ return $this->noDecay; } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 23c971ae24..66c857110d 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -49,14 +49,9 @@ class Lectern extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->producingSignal = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->producingSignal); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->producingSignal); } public function readStateFromWorld() : Block{ diff --git a/src/block/Lever.php b/src/block/Lever.php index a8d31cd29b..d8cb306589 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -47,14 +47,9 @@ class Lever extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readLeverFacing(); - $this->activated = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeLeverFacing($this->facing); - $w->writeBool($this->activated); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->leverFacing($this->facing); + $w->bool($this->activated); } public function getFacing() : LeverFacing{ return $this->facing; } diff --git a/src/block/Light.php b/src/block/Light.php index 804f98871c..397a8f98dc 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -37,12 +37,8 @@ final class Light extends Flowable{ public function getRequiredTypeDataBits() : int{ return 4; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->level = $r->readBoundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } public function getLightLevel() : int{ return $this->level; } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index e1bafbcbc1..914b884046 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -51,16 +51,10 @@ abstract class Liquid extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->decay = $r->readBoundedInt(3, 0, self::MAX_DECAY); - $this->falling = $r->readBool(); - $this->still = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, 0, self::MAX_DECAY, $this->decay); - $w->writeBool($this->falling); - $w->writeBool($this->still); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); + $w->bool($this->falling); + $w->bool($this->still); } public function isFalling() : bool{ return $this->falling; } diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 0c957a6173..7a12ebd74f 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -37,12 +37,8 @@ class NetherPortal extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->axis = $r->readHorizontalAxis(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalAxis($this->axis); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalAxis($this->axis); } public function getAxis() : int{ diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 13da176e7b..a9325d92fa 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -40,12 +40,8 @@ class NetherWartPlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(2, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Rail.php b/src/block/Rail.php index 5cce509499..31d74c061f 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Facing; @@ -38,16 +37,8 @@ class Rail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $railShape = $r->readInt(4); - if(!isset(RailConnectionInfo::CONNECTIONS[$railShape]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$railShape])){ - throw new InvalidSerializedRuntimeDataException("Invalid rail shape $railShape"); - } - $this->railShape = $railShape; - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(4, $this->railShape); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->railShape($this->railShape); } protected function setShapeFromConnections(array $connections) : void{ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index a36182da16..c9595e6338 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -39,12 +39,8 @@ class RedMushroomBlock extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->mushroomBlockType = $r->readMushroomBlockType(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeMushroomBlockType($this->mushroomBlockType); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->mushroomBlockType($this->mushroomBlockType); } public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index aeaaeb5434..50fe4d28f0 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -47,17 +47,10 @@ class RedstoneComparator extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->isSubtractMode = $r->readBool(); - $this->powered = $r->readBool(); - //TODO: this doesn't call the decoder from AnalogRedstoneSignalEmitter - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->isSubtractMode); - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->isSubtractMode); + $w->bool($this->powered); } public function readStateFromWorld() : Block{ diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 4b10797a4d..9a8c3785cb 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -32,12 +32,8 @@ class RedstoneLamp extends Opaque{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->powered = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->powered); } public function getLightLevel() : int{ diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 044bb31d00..c4f4497004 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -36,12 +36,8 @@ class RedstoneOre extends Opaque{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->lit = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->lit); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->lit); } public function isLit() : bool{ diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 39b720a697..b72d25463c 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -46,16 +46,10 @@ class RedstoneRepeater extends Flowable{ public function getRequiredStateDataBits() : int{ return 5; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->delay = $r->readBoundedInt(2, self::MIN_DELAY, self::MAX_DELAY); - $this->powered = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBoundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); + $w->bool($this->powered); } public function getDelay() : int{ return $this->delay; } diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index 420a070983..ba37039f24 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -31,14 +31,9 @@ class RedstoneTorch extends Torch{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - parent::decodeState($r); - $this->lit = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - parent::encodeState($w); - $w->writeBool($this->lit); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + parent::describeState($w); + $w->bool($this->lit); } public function isLit() : bool{ diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 3d9a327760..c7117d4b2a 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -49,12 +49,8 @@ class Sapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->ready = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->ready); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->ready); } public function isReady() : bool{ return $this->ready; } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index c79363062b..fe2cd1dac9 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -41,14 +41,9 @@ class SeaPickle extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->count = $r->readBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT); - $this->underwater = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); - $w->writeBool($this->underwater); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + $w->bool($this->underwater); } public function getCount() : int{ return $this->count; } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index b5b2223d8a..72236be487 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -37,11 +37,7 @@ class ShulkerBox extends Opaque{ public function getRequiredStateDataBits() : int{ return 0; } - protected function decodeState(RuntimeDataReader $r) : void{ - //NOOP - we don't read or write facing here, because the tile persists it - } - - protected function encodeState(RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index cf203e35fa..1d0a9d8c14 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -31,12 +31,8 @@ abstract class SimplePressurePlate extends PressurePlate{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->pressed = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->pressed); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->pressed); } public function isPressed() : bool{ return $this->pressed; } diff --git a/src/block/Skull.php b/src/block/Skull.php index 25730341ac..b7a7074768 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\utils\SkullType; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -53,26 +52,14 @@ class Skull extends Flowable{ public function getRequiredTypeDataBits() : int{ return 3; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->skullType = $r->readSkullType(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeSkullType($this->skullType); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->skullType($this->skullType); } public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $facing = $r->readFacing(); - if($facing === Facing::DOWN){ - throw new InvalidSerializedRuntimeDataException("Skull may not face down"); - } - $this->facing = $facing; - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facingExcept($this->facing, Facing::DOWN); } public function readStateFromWorld() : Block{ diff --git a/src/block/Slab.php b/src/block/Slab.php index cff1079cbe..37eaf5e6b5 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -44,12 +44,8 @@ class Slab extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->slabType = $r->readSlabType(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeSlabType($this->slabType); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->slabType($this->slabType); } public function isTransparent() : bool{ diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index f45afc9f9e..65c08333ec 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -49,12 +49,8 @@ class SnowLayer extends Flowable implements Fallable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } public function getLayers() : int{ return $this->layers; } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index d2752a18f1..d4eceb5422 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -31,12 +31,8 @@ class Sponge extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->wet = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBool($this->wet); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->wet); } public function isWet() : bool{ return $this->wet; } diff --git a/src/block/Stair.php b/src/block/Stair.php index 5a585277bc..541266f0a6 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -49,14 +49,9 @@ class Stair extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->upsideDown = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->upsideDown); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->upsideDown); } public function readStateFromWorld() : Block{ diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 1c09c3caeb..9b81413551 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use function array_keys; @@ -40,16 +39,8 @@ class StraightOnlyRail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $railShape = $r->readInt(3); - if(!isset(RailConnectionInfo::CONNECTIONS[$railShape])){ - throw new InvalidSerializedRuntimeDataException("No rail shape matches meta $railShape"); - } - $this->railShape = $railShape; - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeInt(3, $this->railShape); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->straightOnlyRailShape($this->railShape); } protected function setShapeFromConnections(array $connections) : void{ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index e3c8e80cc9..2697a14f93 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -40,12 +40,8 @@ class Sugarcane extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, self::MAX_AGE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } private function grow() : bool{ diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 487dd81b17..ac040976a7 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -48,12 +48,8 @@ class SweetBerryBush extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->age = $r->readBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/TNT.php b/src/block/TNT.php index 840d74794e..1b435b011b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -47,22 +47,14 @@ class TNT extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->worksUnderwater = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBool($this->worksUnderwater); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->worksUnderwater); } public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->unstable = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->unstable); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->unstable); } public function isUnstable() : bool{ return $this->unstable; } diff --git a/src/block/Torch.php b/src/block/Torch.php index dbb9014a80..b84012839b 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -40,16 +39,8 @@ class Torch extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $facing = $r->readFacing(); - if($facing === Facing::DOWN){ - throw new InvalidSerializedRuntimeDataException("Torch cannot have a DOWN facing"); - } - $this->facing = $facing; - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facingExcept($this->facing, Facing::DOWN); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index a0288d3598..57b9f4f653 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -43,16 +43,10 @@ class Trapdoor extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->top = $r->readBool(); - $this->open = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->top); - $w->writeBool($this->open); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->top); + $w->bool($this->open); } public function isOpen() : bool{ return $this->open; } diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 1971b391c0..74d55ffba4 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -36,18 +36,11 @@ class Tripwire extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->triggered = $r->readBool(); - $this->suspended = $r->readBool(); - $this->connected = $r->readBool(); - $this->disarmed = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->triggered); - $w->writeBool($this->suspended); - $w->writeBool($this->connected); - $w->writeBool($this->disarmed); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->triggered); + $w->bool($this->suspended); + $w->bool($this->connected); + $w->bool($this->disarmed); } public function isTriggered() : bool{ return $this->triggered; } diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index bd240d20ed..cb39e42d08 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -41,16 +41,10 @@ class TripwireHook extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - $this->connected = $r->readBool(); - $this->powered = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); - $w->writeBool($this->connected); - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); + $w->bool($this->connected); + $w->bool($this->powered); } public function isConnected() : bool{ return $this->connected; } diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 753aee99d1..52cbb4e647 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -36,14 +36,10 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - protected function decodeType(RuntimeDataReader $r) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block - $this->stateData = $r->readInt(Block::INTERNAL_STATE_DATA_BITS); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); + $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); } public function canBePlaced() : bool{ diff --git a/src/block/Vine.php b/src/block/Vine.php index a90de6c8da..40e2cd5e8e 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -42,12 +42,8 @@ class Vine extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->faces = $r->readHorizontalFacingFlags(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacingFlags($this->faces); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacingFlags($this->faces); } /** @return int[] */ diff --git a/src/block/Wall.php b/src/block/Wall.php index e3ceff6ce2..d4c116bda3 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -45,14 +45,9 @@ class Wall extends Transparent{ public function getRequiredStateDataBits() : int{ return 9; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->connections = $r->readWallConnections(); - $this->post = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeWallConnections($this->connections); - $w->writeBool($this->post); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->wallConnections($this->connections); + $w->bool($this->post); } /** diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 9164c2cf11..b678d80ede 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -39,12 +39,8 @@ final class WallCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/Wood.php b/src/block/Wood.php index 401ca5bd71..50032eaa18 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -41,12 +41,8 @@ class Wood extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->stripped = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeBool($this->stripped); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->stripped); } public function isStripped() : bool{ return $this->stripped; } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 1b9f5b26b5..4c8cd5be91 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -31,12 +31,8 @@ trait AnalogRedstoneSignalEmitterTrait{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->signalStrength = $r->readBoundedInt(4, 0, 15); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, 15, $this->signalStrength); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, 15, $this->signalStrength); } public function getOutputSignalStrength() : int{ return $this->signalStrength; } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index c6ccd56459..cf98507d31 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -32,12 +32,8 @@ trait AnyFacingTrait{ public function getRequiredStateDataBits() : int{ return 3; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readFacing(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->facing($this->facing); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 154ccb8287..bb1e3fba31 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -42,12 +42,8 @@ trait CandleTrait{ public function getRequiredStateDataBits() : int{ return 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->lit = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBool($this->lit); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->bool($this->lit); } public function getLightLevel() : int{ diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 7abfd82b72..00e0d61a2e 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -33,14 +33,9 @@ trait ColoredTrait{ public function getRequiredTypeDataBits() : int{ return 4; } - /** @see Block::decodeType() */ - protected function decodeType(RuntimeDataReader $r) : void{ - $this->color = $r->readDyeColor(); - } - - /** @see Block::encodeType() */ - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeDyeColor($this->color); + /** @see Block::describeType() */ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->dyeColor($this->color); } public function getColor() : DyeColor{ return $this->color; } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index eefb8d445d..3d47b64efc 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\block\BlockBreakInfo; +use pocketmine\block\BlockIdentifier; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Axe; @@ -36,18 +38,18 @@ use pocketmine\world\sound\ItemUseOnBlockSound; trait CopperTrait{ private CopperOxidation $oxidation; - private bool $waxed; + private bool $waxed = false; + + public function __construct(BlockIdentifier $identifier, string $name, BlockBreakInfo $breakInfo){ + $this->oxidation = CopperOxidation::NONE(); + parent::__construct($identifier, $name, $breakInfo); + } public function getRequiredTypeDataBits() : int{ return 3; } - protected function decodeType(RuntimeDataReader $r) : void{ - $this->oxidation = $r->readCopperOxidation(); - $this->waxed = $r->readBool(); - } - - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeCopperOxidation($this->oxidation); - $w->writeBool($this->waxed); + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->copperOxidation($this->oxidation); + $w->bool($this->waxed); } public function getOxidation() : CopperOxidation{ return $this->oxidation; } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 7ce28caa0d..ccab725e10 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -33,16 +33,10 @@ trait CoralTypeTrait{ public function getRequiredTypeDataBits() : int{ return 4; } - /** @see Block::decodeType() */ - protected function decodeType(RuntimeDataReader $r) : void{ - $this->coralType = $r->readCoralType(); - $this->dead = $r->readBool(); - } - - /** @see Block::encodeType() */ - protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeCoralType($this->coralType); - $w->writeBool($this->dead); + /** @see Block::describeType() */ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->coralType($this->coralType); + $w->bool($this->dead); } public function getCoralType() : CoralType{ return $this->coralType; } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index c20bab71ee..437dd2cf30 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -33,12 +33,8 @@ trait HorizontalFacingTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->facing = $r->readHorizontalFacing(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeHorizontalFacing($this->facing); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->horizontalFacing($this->facing); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index c8fe6216b4..8c1480b03b 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -38,12 +38,8 @@ trait PillarRotationTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->axis = $r->readAxis(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeAxis($this->axis); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->axis($this->axis); } /** @see Axis */ diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 361129518b..64a03f35e4 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -31,13 +31,8 @@ trait RailPoweredByRedstoneTrait{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function decodeState(RuntimeDataReader $r) : void{ - parent::decodeState($r); - $this->powered = $r->readBool(); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - parent::encodeState($w); - $w->writeBool($this->powered); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + parent::describeState($w); + $w->bool($this->powered); } } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 96d0b9ef64..e2c6d7609b 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -33,12 +33,8 @@ trait SignLikeRotationTrait{ public function getRequiredStateDataBits() : int{ return 4; } - protected function decodeState(RuntimeDataReader $r) : void{ - $this->rotation = $r->readBoundedInt(4, 0, 15); - } - - protected function encodeState(RuntimeDataWriter $w) : void{ - $w->writeBoundedInt(4, 0, 15, $this->rotation); + protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->boundedInt(4, 0, 15, $this->rotation); } public function getRotation() : int{ return $this->rotation; } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 5ed08cdf8c..f09d857f51 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\RailConnectionInfo; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -50,20 +51,28 @@ final class RuntimeDataReader{ return $value; } - public function readBoundedInt(int $bits, int $min, int $max) : int{ + public function int(int $bits, int &$value) : void{ + $value = $this->readInt($bits); + } + + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ $result = $this->readInt($bits) + $min; if($result < $min || $result > $max){ throw new InvalidSerializedRuntimeDataException("Value is outside the range $min - $max"); } - return $result; + $value = $result; } - public function readBool() : bool{ + protected function readBool() : bool{ return $this->readInt(1) === 1; } - public function readHorizontalFacing() : int{ - return match($this->readInt(2)){ + public function bool(bool &$value) : void{ + $value = $this->readBool(); + } + + public function horizontalFacing(int &$facing) : void{ + $facing = match($this->readInt(2)){ 0 => Facing::NORTH, 1 => Facing::EAST, 2 => Facing::SOUTH, @@ -73,9 +82,9 @@ final class RuntimeDataReader{ } /** - * @return int[] + * @param int[] $faces */ - public function readHorizontalFacingFlags() : array{ + public function horizontalFacingFlags(array &$faces) : void{ $result = []; foreach(Facing::HORIZONTAL as $facing){ if($this->readBool()){ @@ -83,11 +92,11 @@ final class RuntimeDataReader{ } } - return $result; + $faces = $result; } - public function readFacing() : int{ - return match($this->readInt(3)){ + public function facing(int &$facing) : void{ + $facing = match($this->readInt(3)){ 0 => Facing::DOWN, 1 => Facing::UP, 2 => Facing::NORTH, @@ -98,8 +107,18 @@ final class RuntimeDataReader{ }; } - public function readAxis() : int{ - return match($this->readInt(2)){ + public function facingExcept(int &$facing, int $except) : void{ + $result = 0; + $this->facing($result); + if($result === $except){ + throw new InvalidSerializedRuntimeDataException("Illegal facing value"); + } + + $facing = $result; + } + + public function axis(int &$axis) : void{ + $axis = match($this->readInt(2)){ 0 => Axis::X, 1 => Axis::Z, 2 => Axis::Y, @@ -107,8 +126,8 @@ final class RuntimeDataReader{ }; } - public function readHorizontalAxis() : int{ - return match($this->readInt(1)){ + public function horizontalAxis(int &$axis) : void{ + $axis = match($this->readInt(1)){ 0 => Axis::X, 1 => Axis::Z, default => throw new AssumptionFailedError("Unreachable") @@ -116,16 +135,17 @@ final class RuntimeDataReader{ } /** - * @return WallConnectionType[] - * @phpstan-return array + * @param WallConnectionType[] $connections + * @phpstan-param array $connections */ - public function readWallConnections() : array{ - $connections = []; + public function wallConnections(array &$connections) : void{ + $result = []; //TODO: we can pack this into 7 bits instead of 8 foreach(Facing::HORIZONTAL as $facing){ - $type = $this->readBoundedInt(2, 0, 2); + $type = 0; + $this->boundedInt(2, 0, 2, $type); if($type !== 0){ - $connections[$facing] = match($type){ + $result[$facing] = match($type){ 1 => WallConnectionType::SHORT(), 2 => WallConnectionType::TALL(), default => throw new AssumptionFailedError("Unreachable") @@ -133,14 +153,14 @@ final class RuntimeDataReader{ } } - return $connections; + $connections = $result; } /** - * @return BrewingStandSlot[] - * @phpstan-return array + * @param BrewingStandSlot[] $slots + * @phpstan-param array $slots */ - public function readBrewingStandSlots() : array{ + public function brewingStandSlots(array &$slots) : void{ $result = []; foreach([ BrewingStandSlot::EAST(), @@ -152,7 +172,25 @@ final class RuntimeDataReader{ } } - return $result; + $slots = $result; + } + + public function railShape(int &$railShape) : void{ + $result = $this->readInt(4); + if(!isset(RailConnectionInfo::CONNECTIONS[$result]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$result])){ + throw new InvalidSerializedRuntimeDataException("Invalid rail shape $result"); + } + + $railShape = $result; + } + + public function straightOnlyRailShape(int &$railShape) : void{ + $result = $this->readInt(3); + if(!isset(RailConnectionInfo::CONNECTIONS[$result])){ + throw new InvalidSerializedRuntimeDataException("No rail shape matches meta $result"); + } + + $railShape = $result; } public function getOffset() : int{ return $this->offset; } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index a0d7ba7ba0..23aa45b39b 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -40,8 +40,7 @@ final class RuntimeDataWriter{ private int $maxBits ){} - /** @return $this */ - public function writeInt(int $bits, int $value) : self{ + public function int(int $bits, int $value) : void{ if($this->offset + $bits > $this->maxBits){ throw new \InvalidArgumentException("Bit buffer cannot be larger than $this->maxBits bits (already have $this->offset bits)"); } @@ -51,27 +50,21 @@ final class RuntimeDataWriter{ $this->value |= ($value << $this->offset); $this->offset += $bits; - - return $this; } - /** @return $this */ - public function writeBoundedInt(int $bits, int $min, int $max, int $value) : self{ + public function boundedInt(int $bits, int $min, int $max, int $value) : void{ if($value < $min || $value > $max){ throw new \InvalidArgumentException("Value $value is outside the range $min - $max"); } - $this->writeInt($bits, $value - $min); - return $this; + $this->int($bits, $value - $min); } - /** @return $this */ - public function writeBool(bool $value) : self{ - return $this->writeInt(1, $value ? 1 : 0); + public function bool(bool $value) : void{ + $this->int(1, $value ? 1 : 0); } - /** @return $this */ - public function writeHorizontalFacing(int $facing) : self{ - return $this->writeInt(2, match($facing){ + public function horizontalFacing(int $facing) : void{ + $this->int(2, match($facing){ Facing::NORTH => 0, Facing::EAST => 1, Facing::SOUTH => 2, @@ -82,20 +75,16 @@ final class RuntimeDataWriter{ /** * @param int[] $faces - * - * @return $this */ - public function writeHorizontalFacingFlags(array $faces) : self{ + public function horizontalFacingFlags(array $faces) : void{ $uniqueFaces = array_flip($faces); foreach(Facing::HORIZONTAL as $facing){ - $this->writeBool(isset($uniqueFaces[$facing])); + $this->bool(isset($uniqueFaces[$facing])); } - - return $this; } - public function writeFacing(int $facing) : self{ - return $this->writeInt(3, match($facing){ + public function facing(int $facing) : void{ + $this->int(3, match($facing){ 0 => Facing::DOWN, 1 => Facing::UP, 2 => Facing::NORTH, @@ -106,8 +95,12 @@ final class RuntimeDataWriter{ }); } - public function writeAxis(int $axis) : self{ - return $this->writeInt(2, match($axis){ + public function facingExcept(int $facing, int $except) : void{ + $this->facing($facing); + } + + public function axis(int $axis) : void{ + $this->int(2, match($axis){ Axis::X => 0, Axis::Z => 1, Axis::Y => 2, @@ -115,8 +108,8 @@ final class RuntimeDataWriter{ }); } - public function writeHorizontalAxis(int $axis) : self{ - return $this->writeInt(1, match($axis){ + public function horizontalAxis(int $axis) : void{ + $this->int(1, match($axis){ Axis::X => 0, Axis::Z => 1, default => throw new \InvalidArgumentException("Invalid horizontal axis $axis") @@ -127,36 +120,38 @@ final class RuntimeDataWriter{ * @param WallConnectionType[] $connections * @phpstan-param array $connections */ - public function writeWallConnections(array $connections) : self{ + public function wallConnections(array $connections) : void{ //TODO: we can pack this into 7 bits instead of 8 foreach(Facing::HORIZONTAL as $facing){ - $this->writeBoundedInt(2, 0, 2, match($connections[$facing] ?? null){ + $this->boundedInt(2, 0, 2, match($connections[$facing] ?? null){ null => 0, WallConnectionType::SHORT() => 1, WallConnectionType::TALL() => 2, default => throw new AssumptionFailedError("Unreachable") }); } - - return $this; } /** * @param BrewingStandSlot[] $slots * @phpstan-param array $slots - * - * @return $this */ - public function writeBrewingStandSlots(array $slots) : self{ + public function brewingStandSlots(array $slots) : void{ foreach([ BrewingStandSlot::EAST(), BrewingStandSlot::NORTHWEST(), BrewingStandSlot::SOUTHWEST(), ] as $member){ - $this->writeBool(isset($slots[$member->id()])); + $this->bool(isset($slots[$member->id()])); } + } - return $this; + public function railShape(int $railShape) : void{ + $this->int(4, $railShape); + } + + public function straightOnlyRailShape(int $railShape) : void{ + $this->int(3, $railShape); } public function getValue() : int{ return $this->value; } diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index b23ec5435b..5c2a9adcda 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -29,10 +29,10 @@ namespace pocketmine\data\runtime; */ trait RuntimeEnumDeserializerTrait{ - abstract public function readInt(int $bits) : int; + abstract protected function readInt(int $bits) : int; - public function readBellAttachmentType() : \pocketmine\block\utils\BellAttachmentType{ - return match($this->readInt(2)){ + public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ + $value = match($this->readInt(2)){ 0 => \pocketmine\block\utils\BellAttachmentType::CEILING(), 1 => \pocketmine\block\utils\BellAttachmentType::FLOOR(), 2 => \pocketmine\block\utils\BellAttachmentType::ONE_WALL(), @@ -41,8 +41,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readCopperOxidation() : \pocketmine\block\utils\CopperOxidation{ - return match($this->readInt(2)){ + public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ + $value = match($this->readInt(2)){ 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED(), 1 => \pocketmine\block\utils\CopperOxidation::NONE(), 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED(), @@ -51,8 +51,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readCoralType() : \pocketmine\block\utils\CoralType{ - return match($this->readInt(3)){ + public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ + $value = match($this->readInt(3)){ 0 => \pocketmine\block\utils\CoralType::BRAIN(), 1 => \pocketmine\block\utils\CoralType::BUBBLE(), 2 => \pocketmine\block\utils\CoralType::FIRE(), @@ -62,8 +62,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readDyeColor() : \pocketmine\block\utils\DyeColor{ - return match($this->readInt(4)){ + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ + $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\DyeColor::BLACK(), 1 => \pocketmine\block\utils\DyeColor::BLUE(), 2 => \pocketmine\block\utils\DyeColor::BROWN(), @@ -84,8 +84,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readLeverFacing() : \pocketmine\block\utils\LeverFacing{ - return match($this->readInt(3)){ + public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ + $value = match($this->readInt(3)){ 0 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X(), 1 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_Z(), 2 => \pocketmine\block\utils\LeverFacing::EAST(), @@ -98,8 +98,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readMushroomBlockType() : \pocketmine\block\utils\MushroomBlockType{ - return match($this->readInt(4)){ + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ + $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\MushroomBlockType::ALL_CAP(), 1 => \pocketmine\block\utils\MushroomBlockType::CAP_EAST(), 2 => \pocketmine\block\utils\MushroomBlockType::CAP_MIDDLE(), @@ -115,8 +115,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readPotionType() : \pocketmine\item\PotionType{ - return match($this->readInt(6)){ + public function potionType(\pocketmine\item\PotionType &$value) : void{ + $value = match($this->readInt(6)){ 0 => \pocketmine\item\PotionType::AWKWARD(), 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE(), 2 => \pocketmine\item\PotionType::HARMING(), @@ -163,8 +163,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readSkullType() : \pocketmine\block\utils\SkullType{ - return match($this->readInt(3)){ + public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ + $value = match($this->readInt(3)){ 0 => \pocketmine\block\utils\SkullType::CREEPER(), 1 => \pocketmine\block\utils\SkullType::DRAGON(), 2 => \pocketmine\block\utils\SkullType::PLAYER(), @@ -175,8 +175,8 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function readSlabType() : \pocketmine\block\utils\SlabType{ - return match($this->readInt(2)){ + public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ + $value = match($this->readInt(2)){ 0 => \pocketmine\block\utils\SlabType::BOTTOM(), 1 => \pocketmine\block\utils\SlabType::DOUBLE(), 2 => \pocketmine\block\utils\SlabType::TOP(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 8d0d98a9fc..16c01fd39a 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -29,10 +29,10 @@ namespace pocketmine\data\runtime; */ trait RuntimeEnumSerializerTrait{ - abstract public function writeInt(int $bits, int $value) : self; + abstract public function int(int $bits, int $value) : void; - public function writeBellAttachmentType(\pocketmine\block\utils\BellAttachmentType $value) : void{ - $this->writeInt(2, match($value){ + public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType $value) : void{ + $this->int(2, match($value){ \pocketmine\block\utils\BellAttachmentType::CEILING() => 0, \pocketmine\block\utils\BellAttachmentType::FLOOR() => 1, \pocketmine\block\utils\BellAttachmentType::ONE_WALL() => 2, @@ -41,8 +41,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeCopperOxidation(\pocketmine\block\utils\CopperOxidation $value) : void{ - $this->writeInt(2, match($value){ + public function copperOxidation(\pocketmine\block\utils\CopperOxidation $value) : void{ + $this->int(2, match($value){ \pocketmine\block\utils\CopperOxidation::EXPOSED() => 0, \pocketmine\block\utils\CopperOxidation::NONE() => 1, \pocketmine\block\utils\CopperOxidation::OXIDIZED() => 2, @@ -51,8 +51,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeCoralType(\pocketmine\block\utils\CoralType $value) : void{ - $this->writeInt(3, match($value){ + public function coralType(\pocketmine\block\utils\CoralType $value) : void{ + $this->int(3, match($value){ \pocketmine\block\utils\CoralType::BRAIN() => 0, \pocketmine\block\utils\CoralType::BUBBLE() => 1, \pocketmine\block\utils\CoralType::FIRE() => 2, @@ -62,8 +62,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeDyeColor(\pocketmine\block\utils\DyeColor $value) : void{ - $this->writeInt(4, match($value){ + public function dyeColor(\pocketmine\block\utils\DyeColor $value) : void{ + $this->int(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, \pocketmine\block\utils\DyeColor::BLUE() => 1, \pocketmine\block\utils\DyeColor::BROWN() => 2, @@ -84,8 +84,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeLeverFacing(\pocketmine\block\utils\LeverFacing $value) : void{ - $this->writeInt(3, match($value){ + public function leverFacing(\pocketmine\block\utils\LeverFacing $value) : void{ + $this->int(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, @@ -98,8 +98,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeMushroomBlockType(\pocketmine\block\utils\MushroomBlockType $value) : void{ - $this->writeInt(4, match($value){ + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType $value) : void{ + $this->int(4, match($value){ \pocketmine\block\utils\MushroomBlockType::ALL_CAP() => 0, \pocketmine\block\utils\MushroomBlockType::CAP_EAST() => 1, \pocketmine\block\utils\MushroomBlockType::CAP_MIDDLE() => 2, @@ -115,8 +115,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writePotionType(\pocketmine\item\PotionType $value) : void{ - $this->writeInt(6, match($value){ + public function potionType(\pocketmine\item\PotionType $value) : void{ + $this->int(6, match($value){ \pocketmine\item\PotionType::AWKWARD() => 0, \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, \pocketmine\item\PotionType::HARMING() => 2, @@ -163,8 +163,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeSkullType(\pocketmine\block\utils\SkullType $value) : void{ - $this->writeInt(3, match($value){ + public function skullType(\pocketmine\block\utils\SkullType $value) : void{ + $this->int(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, \pocketmine\block\utils\SkullType::DRAGON() => 1, \pocketmine\block\utils\SkullType::PLAYER() => 2, @@ -175,8 +175,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function writeSlabType(\pocketmine\block\utils\SlabType $value) : void{ - $this->writeInt(2, match($value){ + public function slabType(\pocketmine\block\utils\SlabType $value) : void{ + $this->int(2, match($value){ \pocketmine\block\utils\SlabType::BOTTOM() => 0, \pocketmine\block\utils\SlabType::DOUBLE() => 1, \pocketmine\block\utils\SlabType::TOP() => 2, diff --git a/src/item/Banner.php b/src/item/Banner.php index 6fd242c035..80def9ad52 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -64,7 +64,7 @@ class Banner extends ItemBlockWallOrFloor{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeDyeColor($this->color); + $w->dyeColor($this->color); } /** diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index 9644205035..acb8d35779 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -33,7 +33,7 @@ use pocketmine\math\Facing; final class CoralFan extends Item{ use CoralTypeTrait { - encodeType as encodeCoralType; + describeType as encodeCoralType; } public function __construct(ItemIdentifier $identifier){ diff --git a/src/item/Dye.php b/src/item/Dye.php index 70b0730590..6f550ae18f 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -35,7 +35,7 @@ class Dye extends Item{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeDyeColor($this->color); + $w->dyeColor($this->color); } public function getColor() : DyeColor{ diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 4ce6c29474..b923b9d7e9 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -45,7 +45,7 @@ final class ItemBlock extends Item{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); + $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/Potion.php b/src/item/Potion.php index d1e40b673f..5848dee47e 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -37,7 +37,7 @@ class Potion extends Item implements ConsumableItem{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writePotionType($this->potionType); + $w->potionType($this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index 52ae10e64a..ca4023e6a5 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -39,7 +39,7 @@ class SplashPotion extends ProjectileItem{ } protected function encodeType(RuntimeDataWriter $w) : void{ - $w->writePotionType($this->potionType); + $w->potionType($this->potionType); } public function getType() : PotionType{ return $this->potionType; } From b0a492c06384f11fe771662f1a62bdf6fadd86ff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 18 Jul 2022 18:47:30 +0100 Subject: [PATCH 0353/1858] Move simple block (de)serializer registrations into their own functions --- .../BlockObjectToBlockStateSerializer.php | 834 +++++++++--------- .../BlockStateToBlockObjectDeserializer.php | 696 +++++++-------- 2 files changed, 769 insertions(+), 761 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 71487e461b..553f84ff0b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -176,6 +176,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ public function __construct(){ $this->registerCandleSerializers(); + $this->registerSimpleSerializers(); $this->registerSerializers(); } @@ -291,355 +292,41 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ })->writeBool(StateNames::LIT, $block->isLit())); } - private function registerSerializers() : void{ - $this->map(Blocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); - $this->map(Blocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); - $this->map(Blocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); - $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); - $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); - $this->map(Blocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::ACACIA_STANDING_SIGN))); - $this->map(Blocks::ACACIA_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::ACACIA_STAIRS))); - $this->map(Blocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); - $this->map(Blocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); - $this->map(Blocks::ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ - return Writer::create(Ids::ACTIVATOR_RAIL) - ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) - ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); - }); + private function registerSimpleSerializers() : void{ $this->mapSimple(Blocks::AIR(), Ids::AIR); - $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); - $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) - ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); $this->mapSimple(Blocks::ANCIENT_DEBRIS(), Ids::ANCIENT_DEBRIS); - $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); - $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); - $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); - $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); - $this->map(Blocks::ANVIL(), function(Anvil $block) : Writer{ - return Writer::create(Ids::ANVIL) - ->writeLegacyHorizontalFacing($block->getFacing()) - ->writeString(StateNames::DAMAGE, match($damage = $block->getDamage()){ - 0 => StringValues::DAMAGE_UNDAMAGED, - 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, - 2 => StringValues::DAMAGE_VERY_DAMAGED, - default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), - }); - }); - $this->map(Blocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); - $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ - return Writer::create(Ids::BAMBOO) - ->writeBool(StateNames::AGE_BIT, $block->isReady()) - ->writeString(StateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ - Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, - Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, - Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, - default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), - }) - ->writeString(StateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); - }); - $this->map(Blocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ - return Writer::create(Ids::BAMBOO_SAPLING) - ->writeBool(StateNames::AGE_BIT, $block->isReady()) - - //TODO: bug in MCPE - ->writeString(StateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); - }); - $this->map(Blocks::BANNER(), function(FloorBanner $block) : Writer{ - return Writer::create(Ids::STANDING_BANNER) - ->writeInt(StateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); - }); - $this->map(Blocks::BARREL(), function(Barrel $block) : Writer{ - return Writer::create(Ids::BARREL) - ->writeBool(StateNames::OPEN_BIT, $block->isOpen()) - ->writeFacingDirection($block->getFacing()); - }); $this->mapSimple(Blocks::BARRIER(), Ids::BARRIER); - $this->map(Blocks::BASALT(), function(SimplePillar $block) : Writer{ - return Writer::create(Ids::BASALT) - ->writePillarAxis($block->getAxis()); - }); $this->mapSimple(Blocks::BEACON(), Ids::BEACON); - $this->map(Blocks::BED(), function(Bed $block) : Writer{ - return Writer::create(Ids::BED) - ->writeBool(StateNames::HEAD_PIECE_BIT, $block->isHeadPart()) - ->writeBool(StateNames::OCCUPIED_BIT, $block->isOccupied()) - ->writeLegacyHorizontalFacing($block->getFacing()); - }); - $this->map(Blocks::BEDROCK(), function(Block $block) : Writer{ - return Writer::create(Ids::BEDROCK) - ->writeBool(StateNames::INFINIBURN_BIT, $block->burnsForever()); - }); - $this->map(Blocks::BEETROOTS(), fn(Beetroot $block) => Helper::encodeCrops($block, new Writer(Ids::BEETROOT))); - $this->map(Blocks::BELL(), function(Bell $block) : Writer{ - return Writer::create(Ids::BELL) - ->writeBellAttachmentType($block->getAttachmentType()) - ->writeBool(StateNames::TOGGLE_BIT, false) //we don't care about this; it's just to keep MCPE happy - ->writeLegacyHorizontalFacing($block->getFacing()); - - }); - $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); - $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); - $this->map(Blocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); - $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); - $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); - $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); - $this->map(Blocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); - $this->mapStairs(Blocks::BIRCH_STAIRS(), Ids::BIRCH_STAIRS); - $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); - $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); - $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); $this->mapSimple(Blocks::BLACKSTONE(), Ids::BLACKSTONE); - $this->mapSlab(Blocks::BLACKSTONE_SLAB(), Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB); - $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); - $this->map(Blocks::BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::BLACKSTONE_WALL))); - $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); $this->mapSimple(Blocks::BLUE_ICE(), Ids::BLUE_ICE); - $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); - $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); - $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ - return Writer::create(Ids::BONE_BLOCK) - ->writeInt(StateNames::DEPRECATED, 0) - ->writePillarAxis($block->getAxis()); - }); $this->mapSimple(Blocks::BOOKSHELF(), Ids::BOOKSHELF); - $this->map(Blocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ - return Writer::create(Ids::BREWING_STAND) - ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) - ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) - ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); - }); $this->mapSimple(Blocks::BRICKS(), Ids::BRICK_BLOCK); - $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); - $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); - $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); $this->mapSimple(Blocks::BROWN_MUSHROOM(), Ids::BROWN_MUSHROOM); - $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); - $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ - return Writer::create(Ids::CACTUS) - ->writeInt(StateNames::AGE, $block->getAge()); - }); - $this->map(Blocks::CAKE(), function(Cake $block) : Writer{ - return Writer::create(Ids::CAKE) - ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); - }); $this->mapSimple(Blocks::CALCITE(), Ids::CALCITE); - $this->map(Blocks::CARPET(), function(Carpet $block) : Writer{ - return Writer::create(Ids::CARPET) - ->writeColor($block->getColor()); - }); - $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); $this->mapSimple(Blocks::CARTOGRAPHY_TABLE(), Ids::CARTOGRAPHY_TABLE); - $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ - return Writer::create(Ids::CARVED_PUMPKIN) - ->writeLegacyHorizontalFacing($block->getFacing()); - }); $this->mapSimple(Blocks::CHEMICAL_HEAT(), Ids::CHEMICAL_HEAT); - $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ - return Writer::create(Ids::CHEST) - ->writeHorizontalFacing($block->getFacing()); - }); $this->mapSimple(Blocks::CHISELED_DEEPSLATE(), Ids::CHISELED_DEEPSLATE); $this->mapSimple(Blocks::CHISELED_NETHER_BRICKS(), Ids::CHISELED_NETHER_BRICKS); $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); - $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); - $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); $this->mapSimple(Blocks::CLAY(), Ids::CLAY); $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); $this->mapSimple(Blocks::COAL_ORE(), Ids::COAL_ORE); $this->mapSimple(Blocks::COBBLED_DEEPSLATE(), Ids::COBBLED_DEEPSLATE); - $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); - $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); - $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); $this->mapSimple(Blocks::COBBLESTONE(), Ids::COBBLESTONE); - $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); - $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); - $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); $this->mapSimple(Blocks::COBWEB(), Ids::WEB); - $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ - $oxidation = $block->getOxidation(); - return new Writer($block->isWaxed() ? - Helper::selectCopperId($oxidation, Ids::WAXED_COPPER, Ids::WAXED_EXPOSED_COPPER, Ids::WAXED_WEATHERED_COPPER, Ids::WAXED_OXIDIZED_COPPER) : - Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER) - ); - }); - $this->map(Blocks::CUT_COPPER(), function(Copper $block) : Writer{ - $oxidation = $block->getOxidation(); - return new Writer($block->isWaxed() ? - Helper::selectCopperId($oxidation, Ids::WAXED_CUT_COPPER, Ids::WAXED_EXPOSED_CUT_COPPER, Ids::WAXED_WEATHERED_CUT_COPPER, Ids::WAXED_OXIDIZED_CUT_COPPER) : - Helper::selectCopperId($oxidation, Ids::CUT_COPPER, Ids::EXPOSED_CUT_COPPER, Ids::WEATHERED_CUT_COPPER, Ids::OXIDIZED_CUT_COPPER) - ); - }); - $this->map(Blocks::CUT_COPPER_SLAB(), function(CopperSlab $block) : Writer{ - $oxidation = $block->getOxidation(); - return Helper::encodeSlab( - $block, - ($block->isWaxed() ? - Helper::selectCopperId( - $oxidation, - Ids::WAXED_CUT_COPPER_SLAB, - Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, - Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, - Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB - ) : - Helper::selectCopperId( - $oxidation, - Ids::CUT_COPPER_SLAB, - Ids::EXPOSED_CUT_COPPER_SLAB, - Ids::WEATHERED_CUT_COPPER_SLAB, - Ids::OXIDIZED_CUT_COPPER_SLAB - ) - ), - ($block->isWaxed() ? - Helper::selectCopperId( - $oxidation, - Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, - Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, - Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, - Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB - ) : - Helper::selectCopperId( - $oxidation, - Ids::DOUBLE_CUT_COPPER_SLAB, - Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, - Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, - Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB - ) - ) - ); - }); - $this->map(Blocks::CUT_COPPER_STAIRS(), function(CopperStairs $block) : Writer{ - $oxidation = $block->getOxidation(); - return Helper::encodeStairs( - $block, - new Writer($block->isWaxed() ? - Helper::selectCopperId( - $oxidation, - Ids::WAXED_CUT_COPPER_STAIRS, - Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, - Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, - Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS - ) : - Helper::selectCopperId( - $oxidation, - Ids::CUT_COPPER_STAIRS, - Ids::EXPOSED_CUT_COPPER_STAIRS, - Ids::WEATHERED_CUT_COPPER_STAIRS, - Ids::OXIDIZED_CUT_COPPER_STAIRS - ) - ) - ); - }); - $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ - return Writer::create(Ids::COCOA) - ->writeInt(StateNames::AGE, $block->getAge()) - ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); - }); - $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::CONCRETE(), function(Concrete $block) : Writer{ - return Writer::create(Ids::CONCRETE) - ->writeColor($block->getColor()); - }); - $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ - return Writer::create(Ids::CONCRETE_POWDER) - ->writeColor($block->getColor()); - }); $this->mapSimple(Blocks::COPPER_ORE(), Ids::COPPER_ORE); - $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ - return Writer::create(Ids::CORAL) - ->writeBool(StateNames::DEAD_BIT, $block->isDead()) - ->writeCoralType($block->getCoralType()); - }); - $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ - return Writer::create(Ids::CORAL_BLOCK) - ->writeBool(StateNames::DEAD_BIT, $block->isDead()) - ->writeCoralType($block->getCoralType()); - }); - $this->map(Blocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ - return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) - ->writeCoralType($block->getCoralType()) - ->writeInt(StateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ - Axis::X => 0, - Axis::Z => 1, - default => throw new BlockStateSerializeException("Invalid axis {$axis}"), - }); - }); - $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); $this->mapSimple(Blocks::CRACKED_DEEPSLATE_BRICKS(), Ids::CRACKED_DEEPSLATE_BRICKS); $this->mapSimple(Blocks::CRACKED_DEEPSLATE_TILES(), Ids::CRACKED_DEEPSLATE_TILES); $this->mapSimple(Blocks::CRACKED_NETHER_BRICKS(), Ids::CRACKED_NETHER_BRICKS); $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); - $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); - $this->map(Blocks::CRIMSON_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CRIMSON_BUTTON))); - $this->map(Blocks::CRIMSON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CRIMSON_DOOR))); $this->mapSimple(Blocks::CRIMSON_FENCE(), Ids::CRIMSON_FENCE); - $this->map(Blocks::CRIMSON_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::CRIMSON_FENCE_GATE))); - $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); $this->mapSimple(Blocks::CRIMSON_PLANKS(), Ids::CRIMSON_PLANKS); - $this->map(Blocks::CRIMSON_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::CRIMSON_PRESSURE_PLATE))); - $this->map(Blocks::CRIMSON_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::CRIMSON_STANDING_SIGN))); - $this->mapSlab(Blocks::CRIMSON_SLAB(), Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB); - $this->mapStairs(Blocks::CRIMSON_STAIRS(), Ids::CRIMSON_STAIRS); - $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); - $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); - $this->map(Blocks::CRIMSON_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::CRIMSON_WALL_SIGN))); $this->mapSimple(Blocks::CRYING_OBSIDIAN(), Ids::CRYING_OBSIDIAN); - $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); - $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); $this->mapSimple(Blocks::DANDELION(), Ids::YELLOW_FLOWER); - $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); - $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); - $this->map(Blocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); - $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); - $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); - $this->map(Blocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); - $this->map(Blocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); - $this->mapStairs(Blocks::DARK_OAK_STAIRS(), Ids::DARK_OAK_STAIRS); - $this->map(Blocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); - $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); - $this->map(Blocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); - $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); - $this->mapStairs(Blocks::DARK_PRISMARINE_STAIRS(), Ids::DARK_PRISMARINE_STAIRS); - $this->map(Blocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ - return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) - ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); - }); $this->mapSimple(Blocks::DEAD_BUSH(), Ids::DEADBUSH); - $this->map(Blocks::DEEPSLATE(), function(SimplePillar $block) : Writer{ - return Writer::create(Ids::DEEPSLATE) - ->writePillarAxis($block->getAxis()); - }); $this->mapSimple(Blocks::DEEPSLATE_BRICKS(), Ids::DEEPSLATE_BRICKS); - $this->mapSlab(Blocks::DEEPSLATE_BRICK_SLAB(), Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB); - $this->mapStairs(Blocks::DEEPSLATE_BRICK_STAIRS(), Ids::DEEPSLATE_BRICK_STAIRS); - $this->map(Blocks::DEEPSLATE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_BRICK_WALL))); $this->mapSimple(Blocks::DEEPSLATE_COAL_ORE(), Ids::DEEPSLATE_COAL_ORE); $this->mapSimple(Blocks::DEEPSLATE_COPPER_ORE(), Ids::DEEPSLATE_COPPER_ORE); $this->mapSimple(Blocks::DEEPSLATE_DIAMOND_ORE(), Ids::DEEPSLATE_DIAMOND_ORE); @@ -647,33 +334,11 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::DEEPSLATE_GOLD_ORE(), Ids::DEEPSLATE_GOLD_ORE); $this->mapSimple(Blocks::DEEPSLATE_IRON_ORE(), Ids::DEEPSLATE_IRON_ORE); $this->mapSimple(Blocks::DEEPSLATE_LAPIS_LAZULI_ORE(), Ids::DEEPSLATE_LAPIS_ORE); - $this->map(Blocks::DEEPSLATE_REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_DEEPSLATE_REDSTONE_ORE : Ids::DEEPSLATE_REDSTONE_ORE)); $this->mapSimple(Blocks::DEEPSLATE_TILES(), Ids::DEEPSLATE_TILES); - $this->mapSlab(Blocks::DEEPSLATE_TILE_SLAB(), Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB); - $this->mapStairs(Blocks::DEEPSLATE_TILE_STAIRS(), Ids::DEEPSLATE_TILE_STAIRS); - $this->map(Blocks::DEEPSLATE_TILE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_TILE_WALL))); - $this->map(Blocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ - return Writer::create(Ids::DETECTOR_RAIL) - ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) - ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); - }); $this->mapSimple(Blocks::DIAMOND(), Ids::DIAMOND_BLOCK); $this->mapSimple(Blocks::DIAMOND_ORE(), Ids::DIAMOND_ORE); - $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); - $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); - $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); - $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); - $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ - return Writer::create(Ids::DIRT) - ->writeString(StateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); - }); - $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); $this->mapSimple(Blocks::DRAGON_EGG(), Ids::DRAGON_EGG); $this->mapSimple(Blocks::DRIED_KELP(), Ids::DRIED_KELP_BLOCK); - $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ - return Writer::create(Ids::SHULKER_BOX) - ->writeColor($block->getColor()); - }); $this->mapSimple(Blocks::ELEMENT_ACTINIUM(), Ids::ELEMENT_89); $this->mapSimple(Blocks::ELEMENT_ALUMINUM(), Ids::ELEMENT_13); $this->mapSimple(Blocks::ELEMENT_AMERICIUM(), Ids::ELEMENT_95); @@ -697,7 +362,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::ELEMENT_CHLORINE(), Ids::ELEMENT_17); $this->mapSimple(Blocks::ELEMENT_CHROMIUM(), Ids::ELEMENT_24); $this->mapSimple(Blocks::ELEMENT_COBALT(), Ids::ELEMENT_27); - $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->mapSimple(Blocks::ELEMENT_COPERNICIUM(), Ids::ELEMENT_112); $this->mapSimple(Blocks::ELEMENT_COPPER(), Ids::ELEMENT_29); $this->mapSimple(Blocks::ELEMENT_CURIUM(), Ids::ELEMENT_96); @@ -797,6 +461,423 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::EMERALD(), Ids::EMERALD_BLOCK); $this->mapSimple(Blocks::EMERALD_ORE(), Ids::EMERALD_ORE); $this->mapSimple(Blocks::ENCHANTING_TABLE(), Ids::ENCHANTING_TABLE); + $this->mapSimple(Blocks::END_STONE(), Ids::END_STONE); + $this->mapSimple(Blocks::END_STONE_BRICKS(), Ids::END_BRICKS); + $this->mapSimple(Blocks::FLETCHING_TABLE(), Ids::FLETCHING_TABLE); + $this->mapSimple(Blocks::GILDED_BLACKSTONE(), Ids::GILDED_BLACKSTONE); + $this->mapSimple(Blocks::GLASS(), Ids::GLASS); + $this->mapSimple(Blocks::GLASS_PANE(), Ids::GLASS_PANE); + $this->mapSimple(Blocks::GLOWING_OBSIDIAN(), Ids::GLOWINGOBSIDIAN); + $this->mapSimple(Blocks::GLOWSTONE(), Ids::GLOWSTONE); + $this->mapSimple(Blocks::GOLD(), Ids::GOLD_BLOCK); + $this->mapSimple(Blocks::GOLD_ORE(), Ids::GOLD_ORE); + $this->mapSimple(Blocks::GRASS(), Ids::GRASS); + $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); + $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); + $this->mapSimple(Blocks::HANGING_ROOTS(), Ids::HANGING_ROOTS); + $this->mapSimple(Blocks::HARDENED_CLAY(), Ids::HARDENED_CLAY); + $this->mapSimple(Blocks::HARDENED_GLASS(), Ids::HARD_GLASS); + $this->mapSimple(Blocks::HARDENED_GLASS_PANE(), Ids::HARD_GLASS_PANE); + $this->mapSimple(Blocks::HONEYCOMB(), Ids::HONEYCOMB_BLOCK); + $this->mapSimple(Blocks::ICE(), Ids::ICE); + $this->mapSimple(Blocks::INFO_UPDATE(), Ids::INFO_UPDATE); + $this->mapSimple(Blocks::INFO_UPDATE2(), Ids::INFO_UPDATE2); + $this->mapSimple(Blocks::INVISIBLE_BEDROCK(), Ids::INVISIBLE_BEDROCK); + $this->mapSimple(Blocks::IRON(), Ids::IRON_BLOCK); + $this->mapSimple(Blocks::IRON_BARS(), Ids::IRON_BARS); + $this->mapSimple(Blocks::IRON_ORE(), Ids::IRON_ORE); + $this->mapSimple(Blocks::JUKEBOX(), Ids::JUKEBOX); + $this->mapSimple(Blocks::LAPIS_LAZULI(), Ids::LAPIS_BLOCK); + $this->mapSimple(Blocks::LAPIS_LAZULI_ORE(), Ids::LAPIS_ORE); + $this->mapSimple(Blocks::LEGACY_STONECUTTER(), Ids::STONECUTTER); + $this->mapSimple(Blocks::LILY_PAD(), Ids::WATERLILY); + $this->mapSimple(Blocks::MAGMA(), Ids::MAGMA); + $this->mapSimple(Blocks::MANGROVE_FENCE(), Ids::MANGROVE_FENCE); + $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); + $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); + $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); + $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); + $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); + $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); + $this->mapSimple(Blocks::NETHERITE(), Ids::NETHERITE_BLOCK); + $this->mapSimple(Blocks::NETHERRACK(), Ids::NETHERRACK); + $this->mapSimple(Blocks::NETHER_BRICKS(), Ids::NETHER_BRICK); + $this->mapSimple(Blocks::NETHER_BRICK_FENCE(), Ids::NETHER_BRICK_FENCE); + $this->mapSimple(Blocks::NETHER_GOLD_ORE(), Ids::NETHER_GOLD_ORE); + $this->mapSimple(Blocks::NETHER_QUARTZ_ORE(), Ids::QUARTZ_ORE); + $this->mapSimple(Blocks::NETHER_REACTOR_CORE(), Ids::NETHERREACTOR); + $this->mapSimple(Blocks::NETHER_WART_BLOCK(), Ids::NETHER_WART_BLOCK); + $this->mapSimple(Blocks::NOTE_BLOCK(), Ids::NOTEBLOCK); + $this->mapSimple(Blocks::OBSIDIAN(), Ids::OBSIDIAN); + $this->mapSimple(Blocks::PACKED_ICE(), Ids::PACKED_ICE); + $this->mapSimple(Blocks::PODZOL(), Ids::PODZOL); + $this->mapSimple(Blocks::POLISHED_BLACKSTONE(), Ids::POLISHED_BLACKSTONE); + $this->mapSimple(Blocks::POLISHED_BLACKSTONE_BRICKS(), Ids::POLISHED_BLACKSTONE_BRICKS); + $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); + $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); + $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); + $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); + $this->mapSimple(Blocks::RAW_IRON(), Ids::RAW_IRON_BLOCK); + $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); + $this->mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); + $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); + $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); + $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); + $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); + $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); + $this->mapSimple(Blocks::SLIME(), Ids::SLIME); + $this->mapSimple(Blocks::SMITHING_TABLE(), Ids::SMITHING_TABLE); + $this->mapSimple(Blocks::SMOOTH_BASALT(), Ids::SMOOTH_BASALT); + $this->mapSimple(Blocks::SMOOTH_STONE(), Ids::SMOOTH_STONE); + $this->mapSimple(Blocks::SNOW(), Ids::SNOW); + $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); + $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); + $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); + $this->mapSimple(Blocks::TUFF(), Ids::TUFF); + $this->mapSimple(Blocks::WARPED_FENCE(), Ids::WARPED_FENCE); + $this->mapSimple(Blocks::WARPED_PLANKS(), Ids::WARPED_PLANKS); + $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); + $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); + } + + private function registerSerializers() : void{ + $this->map(Blocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); + $this->map(Blocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); + $this->map(Blocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); + $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); + $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); + $this->map(Blocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::ACACIA_STANDING_SIGN))); + $this->map(Blocks::ACACIA_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_ACACIA)); + $this->map(Blocks::ACACIA_STAIRS(), fn(WoodenStairs $block) => Helper::encodeStairs($block, new Writer(Ids::ACACIA_STAIRS))); + $this->map(Blocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); + $this->map(Blocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); + $this->map(Blocks::ACACIA_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ + return Writer::create(Ids::ACTIVATOR_RAIL) + ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); + $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); + $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); + $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); + $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); + $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); + $this->map(Blocks::ANVIL(), function(Anvil $block) : Writer{ + return Writer::create(Ids::ANVIL) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeString(StateNames::DAMAGE, match($damage = $block->getDamage()){ + 0 => StringValues::DAMAGE_UNDAMAGED, + 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, + 2 => StringValues::DAMAGE_VERY_DAMAGED, + default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), + }); + }); + $this->map(Blocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); + $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ + return Writer::create(Ids::BAMBOO) + ->writeBool(StateNames::AGE_BIT, $block->isReady()) + ->writeString(StateNames::BAMBOO_LEAF_SIZE, match($block->getLeafSize()){ + Bamboo::NO_LEAVES => StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES, + Bamboo::SMALL_LEAVES => StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES, + Bamboo::LARGE_LEAVES => StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES, + default => throw new BlockStateSerializeException("Invalid Bamboo leaf thickness " . $block->getLeafSize()), + }) + ->writeString(StateNames::BAMBOO_STALK_THICKNESS, $block->isThick() ? StringValues::BAMBOO_STALK_THICKNESS_THICK : StringValues::BAMBOO_STALK_THICKNESS_THIN); + }); + $this->map(Blocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ + return Writer::create(Ids::BAMBOO_SAPLING) + ->writeBool(StateNames::AGE_BIT, $block->isReady()) + + //TODO: bug in MCPE + ->writeString(StateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); + }); + $this->map(Blocks::BANNER(), function(FloorBanner $block) : Writer{ + return Writer::create(Ids::STANDING_BANNER) + ->writeInt(StateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); + }); + $this->map(Blocks::BARREL(), function(Barrel $block) : Writer{ + return Writer::create(Ids::BARREL) + ->writeBool(StateNames::OPEN_BIT, $block->isOpen()) + ->writeFacingDirection($block->getFacing()); + }); + $this->map(Blocks::BASALT(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::BASALT) + ->writePillarAxis($block->getAxis()); + }); + $this->map(Blocks::BED(), function(Bed $block) : Writer{ + return Writer::create(Ids::BED) + ->writeBool(StateNames::HEAD_PIECE_BIT, $block->isHeadPart()) + ->writeBool(StateNames::OCCUPIED_BIT, $block->isOccupied()) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(Blocks::BEDROCK(), function(Block $block) : Writer{ + return Writer::create(Ids::BEDROCK) + ->writeBool(StateNames::INFINIBURN_BIT, $block->burnsForever()); + }); + $this->map(Blocks::BEETROOTS(), fn(Beetroot $block) => Helper::encodeCrops($block, new Writer(Ids::BEETROOT))); + $this->map(Blocks::BELL(), function(Bell $block) : Writer{ + return Writer::create(Ids::BELL) + ->writeBellAttachmentType($block->getAttachmentType()) + ->writeBool(StateNames::TOGGLE_BIT, false) //we don't care about this; it's just to keep MCPE happy + ->writeLegacyHorizontalFacing($block->getFacing()); + + }); + $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); + $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); + $this->map(Blocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); + $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); + $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); + $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); + $this->map(Blocks::BIRCH_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::BIRCH_STANDING_SIGN))); + $this->map(Blocks::BIRCH_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_BIRCH)); + $this->mapStairs(Blocks::BIRCH_STAIRS(), Ids::BIRCH_STAIRS); + $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); + $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); + $this->map(Blocks::BIRCH_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->mapSlab(Blocks::BLACKSTONE_SLAB(), Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB); + $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); + $this->map(Blocks::BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::BLACKSTONE_WALL))); + $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); + $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); + $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ + return Writer::create(Ids::BONE_BLOCK) + ->writeInt(StateNames::DEPRECATED, 0) + ->writePillarAxis($block->getAxis()); + }); + $this->map(Blocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ + return Writer::create(Ids::BREWING_STAND) + ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) + ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) + ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); + }); + $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); + $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); + $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); + $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); + $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ + return Writer::create(Ids::CACTUS) + ->writeInt(StateNames::AGE, $block->getAge()); + }); + $this->map(Blocks::CAKE(), function(Cake $block) : Writer{ + return Writer::create(Ids::CAKE) + ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); + }); + $this->map(Blocks::CARPET(), function(Carpet $block) : Writer{ + return Writer::create(Ids::CARPET) + ->writeColor($block->getColor()); + }); + $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); + $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ + return Writer::create(Ids::CARVED_PUMPKIN) + ->writeLegacyHorizontalFacing($block->getFacing()); + }); + $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ + return Writer::create(Ids::CHEST) + ->writeHorizontalFacing($block->getFacing()); + }); + $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); + $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); + $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); + $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); + $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); + $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); + $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); + $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); + $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); + $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, Ids::WAXED_COPPER, Ids::WAXED_EXPOSED_COPPER, Ids::WAXED_WEATHERED_COPPER, Ids::WAXED_OXIDIZED_COPPER) : + Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER) + ); + }); + $this->map(Blocks::CUT_COPPER(), function(Copper $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, Ids::WAXED_CUT_COPPER, Ids::WAXED_EXPOSED_CUT_COPPER, Ids::WAXED_WEATHERED_CUT_COPPER, Ids::WAXED_OXIDIZED_CUT_COPPER) : + Helper::selectCopperId($oxidation, Ids::CUT_COPPER, Ids::EXPOSED_CUT_COPPER, Ids::WEATHERED_CUT_COPPER, Ids::OXIDIZED_CUT_COPPER) + ); + }); + $this->map(Blocks::CUT_COPPER_SLAB(), function(CopperSlab $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeSlab( + $block, + ($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_CUT_COPPER_SLAB, + Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, + Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, + Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB + ) : + Helper::selectCopperId( + $oxidation, + Ids::CUT_COPPER_SLAB, + Ids::EXPOSED_CUT_COPPER_SLAB, + Ids::WEATHERED_CUT_COPPER_SLAB, + Ids::OXIDIZED_CUT_COPPER_SLAB + ) + ), + ($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, + Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB + ) : + Helper::selectCopperId( + $oxidation, + Ids::DOUBLE_CUT_COPPER_SLAB, + Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, + Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, + Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB + ) + ) + ); + }); + $this->map(Blocks::CUT_COPPER_STAIRS(), function(CopperStairs $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeStairs( + $block, + new Writer($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_CUT_COPPER_STAIRS, + Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, + Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, + Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS + ) : + Helper::selectCopperId( + $oxidation, + Ids::CUT_COPPER_STAIRS, + Ids::EXPOSED_CUT_COPPER_STAIRS, + Ids::WEATHERED_CUT_COPPER_STAIRS, + Ids::OXIDIZED_CUT_COPPER_STAIRS + ) + ) + ); + }); + $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ + return Writer::create(Ids::COCOA) + ->writeInt(StateNames::AGE, $block->getAge()) + ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); + }); + $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::CONCRETE(), function(Concrete $block) : Writer{ + return Writer::create(Ids::CONCRETE) + ->writeColor($block->getColor()); + }); + $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ + return Writer::create(Ids::CONCRETE_POWDER) + ->writeColor($block->getColor()); + }); + $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ + return Writer::create(Ids::CORAL) + ->writeBool(StateNames::DEAD_BIT, $block->isDead()) + ->writeCoralType($block->getCoralType()); + }); + $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ + return Writer::create(Ids::CORAL_BLOCK) + ->writeBool(StateNames::DEAD_BIT, $block->isDead()) + ->writeCoralType($block->getCoralType()); + }); + $this->map(Blocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ + return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) + ->writeCoralType($block->getCoralType()) + ->writeInt(StateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ + Axis::X => 0, + Axis::Z => 1, + default => throw new BlockStateSerializeException("Invalid axis {$axis}"), + }); + }); + $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); + $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); + $this->map(Blocks::CRIMSON_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CRIMSON_BUTTON))); + $this->map(Blocks::CRIMSON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CRIMSON_DOOR))); + $this->map(Blocks::CRIMSON_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::CRIMSON_FENCE_GATE))); + $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); + $this->map(Blocks::CRIMSON_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::CRIMSON_PRESSURE_PLATE))); + $this->map(Blocks::CRIMSON_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::CRIMSON_STANDING_SIGN))); + $this->mapSlab(Blocks::CRIMSON_SLAB(), Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB); + $this->mapStairs(Blocks::CRIMSON_STAIRS(), Ids::CRIMSON_STAIRS); + $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); + $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); + $this->map(Blocks::CRIMSON_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::CRIMSON_WALL_SIGN))); + $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); + $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); + $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); + $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); + $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); + $this->map(Blocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); + $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); + $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) + ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); + $this->map(Blocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); + $this->map(Blocks::DARK_OAK_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::DARKOAK_STANDING_SIGN))); + $this->map(Blocks::DARK_OAK_SLAB(), fn(Slab $block) => Helper::encodeWoodenSlab($block, StringValues::WOOD_TYPE_DARK_OAK)); + $this->mapStairs(Blocks::DARK_OAK_STAIRS(), Ids::DARK_OAK_STAIRS); + $this->map(Blocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); + $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); + $this->map(Blocks::DARK_OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); + $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) + ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); + $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); + $this->mapStairs(Blocks::DARK_PRISMARINE_STAIRS(), Ids::DARK_PRISMARINE_STAIRS); + $this->map(Blocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ + return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) + ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); + }); + $this->map(Blocks::DEEPSLATE(), function(SimplePillar $block) : Writer{ + return Writer::create(Ids::DEEPSLATE) + ->writePillarAxis($block->getAxis()); + }); + $this->mapSlab(Blocks::DEEPSLATE_BRICK_SLAB(), Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB); + $this->mapStairs(Blocks::DEEPSLATE_BRICK_STAIRS(), Ids::DEEPSLATE_BRICK_STAIRS); + $this->map(Blocks::DEEPSLATE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_BRICK_WALL))); + $this->map(Blocks::DEEPSLATE_REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_DEEPSLATE_REDSTONE_ORE : Ids::DEEPSLATE_REDSTONE_ORE)); + $this->mapSlab(Blocks::DEEPSLATE_TILE_SLAB(), Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB); + $this->mapStairs(Blocks::DEEPSLATE_TILE_STAIRS(), Ids::DEEPSLATE_TILE_STAIRS); + $this->map(Blocks::DEEPSLATE_TILE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::DEEPSLATE_TILE_WALL))); + $this->map(Blocks::DETECTOR_RAIL(), function(DetectorRail $block) : Writer{ + return Writer::create(Ids::DETECTOR_RAIL) + ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) + ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); + }); + $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); + $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); + $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); + $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); + $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ + return Writer::create(Ids::DIRT) + ->writeString(StateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); + }); + $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ + return Writer::create(Ids::SHULKER_BOX) + ->writeColor($block->getColor()); + }); + $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) ->writeHorizontalFacing($block->getFacing()); @@ -810,8 +891,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::END_ROD) ->writeEndRodFacingDirection($block->getFacing()); }); - $this->mapSimple(Blocks::END_STONE(), Ids::END_STONE); - $this->mapSimple(Blocks::END_STONE_BRICKS(), Ids::END_BRICKS); $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); @@ -826,7 +905,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::FIRE) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->mapSimple(Blocks::FLETCHING_TABLE(), Ids::FLETCHING_TABLE); $this->map(Blocks::FLOWER_POT(), function() : Writer{ return Writer::create(Ids::FLOWER_POT) ->writeBool(StateNames::UPDATE_BIT, true); //to keep MCPE happy @@ -836,9 +914,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::AGE, $block->getAge()); }); $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); - $this->mapSimple(Blocks::GILDED_BLACKSTONE(), Ids::GILDED_BLACKSTONE); - $this->mapSimple(Blocks::GLASS(), Ids::GLASS); - $this->mapSimple(Blocks::GLASS_PANE(), Ids::GLASS_PANE); $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ return Writer::create(match ($color = $block->getColor()) { DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, @@ -861,34 +936,21 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }) ->writeHorizontalFacing($block->getFacing()); }); - $this->mapSimple(Blocks::GLOWING_OBSIDIAN(), Ids::GLOWINGOBSIDIAN); - $this->mapSimple(Blocks::GLOWSTONE(), Ids::GLOWSTONE); - $this->mapSimple(Blocks::GOLD(), Ids::GOLD_BLOCK); - $this->mapSimple(Blocks::GOLD_ORE(), Ids::GOLD_ORE); $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); - $this->mapSimple(Blocks::GRASS(), Ids::GRASS); - $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); - $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); - $this->mapSimple(Blocks::HANGING_ROOTS(), Ids::HANGING_ROOTS); - $this->mapSimple(Blocks::HARDENED_CLAY(), Ids::HARDENED_CLAY); - $this->mapSimple(Blocks::HARDENED_GLASS(), Ids::HARD_GLASS); - $this->mapSimple(Blocks::HARDENED_GLASS_PANE(), Ids::HARD_GLASS_PANE); $this->map(Blocks::HAY_BALE(), function(HayBale $block) : Writer{ return Writer::create(Ids::HAY_BLOCK) ->writeInt(StateNames::DEPRECATED, 0) ->writePillarAxis($block->getAxis()); }); - $this->mapSimple(Blocks::HONEYCOMB(), Ids::HONEYCOMB_BLOCK); $this->map(Blocks::HOPPER(), function(Hopper $block) : Writer{ return Writer::create(Ids::HOPPER) ->writeBool(StateNames::TOGGLE_BIT, $block->isPowered()) ->writeFacingWithoutUp($block->getFacing()); }); - $this->mapSimple(Blocks::ICE(), Ids::ICE); $this->map(Blocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); $this->map(Blocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) @@ -901,13 +963,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); $this->map(Blocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); - $this->mapSimple(Blocks::INFO_UPDATE(), Ids::INFO_UPDATE); - $this->mapSimple(Blocks::INFO_UPDATE2(), Ids::INFO_UPDATE2); - $this->mapSimple(Blocks::INVISIBLE_BEDROCK(), Ids::INVISIBLE_BEDROCK); - $this->mapSimple(Blocks::IRON(), Ids::IRON_BLOCK); - $this->mapSimple(Blocks::IRON_BARS(), Ids::IRON_BARS); $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); - $this->mapSimple(Blocks::IRON_ORE(), Ids::IRON_ORE); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ return Writer::create($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME) @@ -915,7 +971,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) ->writeFacingDirection($block->getFacing()); }); - $this->mapSimple(Blocks::JUKEBOX(), Ids::JUKEBOX); $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); $this->map(Blocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) @@ -942,8 +997,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LANTERN) ->writeBool(StateNames::HANGING, $block->isHanging()); }); - $this->mapSimple(Blocks::LAPIS_LAZULI(), Ids::LAPIS_BLOCK); - $this->mapSimple(Blocks::LAPIS_LAZULI_ORE(), Ids::LAPIS_ORE); $this->map(Blocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); $this->map(Blocks::LECTERN(), function(Lectern $block) : Writer{ @@ -951,7 +1004,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isProducingSignal()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->mapSimple(Blocks::LEGACY_STONECUTTER(), Ids::STONECUTTER); $this->map(Blocks::LEVER(), function(Lever $block) : Writer{ return Writer::create(Ids::LEVER) ->writeBool(StateNames::OPEN_BIT, $block->isActivated()) @@ -977,7 +1029,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); - $this->mapSimple(Blocks::LILY_PAD(), Ids::WATERLILY); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); @@ -986,13 +1037,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LOOM) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->mapSimple(Blocks::MAGMA(), Ids::MAGMA); $this->map(Blocks::MANGROVE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::MANGROVE_BUTTON))); $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); - $this->mapSimple(Blocks::MANGROVE_FENCE(), Ids::MANGROVE_FENCE); $this->map(Blocks::MANGROVE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::MANGROVE_FENCE_GATE))); $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); - $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); $this->map(Blocks::MANGROVE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::MANGROVE_PRESSURE_PLATE))); $this->map(Blocks::MANGROVE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::MANGROVE_STANDING_SIGN))); $this->mapSlab(Blocks::MANGROVE_SLAB(), Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB); @@ -1011,14 +1059,11 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ } }); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); - $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); $this->map(Blocks::MOB_HEAD(), function(Skull $block) : Writer{ return Writer::create(Ids::SKULL) ->writeFacingWithoutDown($block->getFacing()); }); - $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); - $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); $this->map(Blocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); @@ -1026,21 +1071,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); $this->mapStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), Ids::MOSSY_STONE_BRICK_STAIRS); $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); - $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); $this->mapSlab(Blocks::MUD_BRICK_SLAB(), Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::MUD_BRICK_STAIRS(), Ids::MUD_BRICK_STAIRS); $this->map(Blocks::MUD_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::MUD_BRICK_WALL))); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); - $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); - $this->mapSimple(Blocks::NETHERITE(), Ids::NETHERITE_BLOCK); - $this->mapSimple(Blocks::NETHERRACK(), Ids::NETHERRACK); - $this->mapSimple(Blocks::NETHER_BRICKS(), Ids::NETHER_BRICK); - $this->mapSimple(Blocks::NETHER_BRICK_FENCE(), Ids::NETHER_BRICK_FENCE); $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); - $this->mapSimple(Blocks::NETHER_GOLD_ORE(), Ids::NETHER_GOLD_ORE); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) ->writeString(StateNames::PORTAL_AXIS, match($block->getAxis()){ @@ -1049,14 +1087,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Nether Portal axis " . $block->getAxis()), }); }); - $this->mapSimple(Blocks::NETHER_QUARTZ_ORE(), Ids::QUARTZ_ORE); - $this->mapSimple(Blocks::NETHER_REACTOR_CORE(), Ids::NETHERREACTOR); $this->map(Blocks::NETHER_WART(), function(NetherWartPlant $block) : Writer{ return Writer::create(Ids::NETHER_WART) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->mapSimple(Blocks::NETHER_WART_BLOCK(), Ids::NETHER_WART_BLOCK); - $this->mapSimple(Blocks::NOTE_BLOCK(), Ids::NOTEBLOCK); $this->map(Blocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); $this->map(Blocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); $this->map(Blocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) @@ -1074,13 +1108,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->map(Blocks::OAK_WOOD(), fn(Wood $block) => Helper::encodeAllSidedLog($block)); - $this->mapSimple(Blocks::OBSIDIAN(), Ids::OBSIDIAN); $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); - $this->mapSimple(Blocks::PACKED_ICE(), Ids::PACKED_ICE); $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); - $this->mapSimple(Blocks::PODZOL(), Ids::PODZOL); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); @@ -1088,8 +1119,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::POLISHED_BASALT) ->writePillarAxis($block->getAxis()); }); - $this->mapSimple(Blocks::POLISHED_BLACKSTONE(), Ids::POLISHED_BLACKSTONE); - $this->mapSimple(Blocks::POLISHED_BLACKSTONE_BRICKS(), Ids::POLISHED_BLACKSTONE_BRICKS); $this->mapSlab(Blocks::POLISHED_BLACKSTONE_BRICK_SLAB(), Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS(), Ids::POLISHED_BLACKSTONE_BRICK_STAIRS); $this->map(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_BRICK_WALL))); @@ -1098,7 +1127,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::POLISHED_BLACKSTONE_SLAB(), Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_BLACKSTONE_STAIRS(), Ids::POLISHED_BLACKSTONE_STAIRS); $this->map(Blocks::POLISHED_BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_BLACKSTONE_WALL))); - $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); $this->mapSlab(Blocks::POLISHED_DEEPSLATE_SLAB(), Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_DEEPSLATE_STAIRS(), Ids::POLISHED_DEEPSLATE_STAIRS); $this->map(Blocks::POLISHED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_DEEPSLATE_WALL))); @@ -1143,7 +1171,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); $this->mapStairs(Blocks::PURPUR_STAIRS(), Ids::PURPUR_STAIRS); $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); - $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); $this->mapStairs(Blocks::QUARTZ_STAIRS(), Ids::QUARTZ_STAIRS); @@ -1151,10 +1178,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::RAIL) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); - $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); - $this->mapSimple(Blocks::RAW_IRON(), Ids::RAW_IRON_BLOCK); - $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); $this->map(Blocks::REDSTONE_COMPARATOR(), function(RedstoneComparator $block) : Writer{ return Writer::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) ->writeBool(StateNames::OUTPUT_LIT_BIT, $block->isPowered()) @@ -1176,9 +1199,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::REDSTONE_WIRE) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); - $this->mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); - $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); $this->map(Blocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); $this->mapStairs(Blocks::RED_NETHER_BRICK_STAIRS(), Ids::RED_NETHER_BRICK_STAIRS); $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); @@ -1190,7 +1211,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); $this->map(Blocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); - $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); @@ -1198,18 +1218,12 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); - $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ return Writer::create(Ids::SEA_PICKLE) ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) ->writeInt(StateNames::CLUSTER_COUNT, $block->getCount() - 1); }); - $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); - $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); - $this->mapSimple(Blocks::SLIME(), Ids::SLIME); - $this->mapSimple(Blocks::SMITHING_TABLE(), Ids::SMITHING_TABLE); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); - $this->mapSimple(Blocks::SMOOTH_BASALT(), Ids::SMOOTH_BASALT); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); $this->mapStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), Ids::SMOOTH_QUARTZ_STAIRS); @@ -1219,9 +1233,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); $this->mapStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), Ids::SMOOTH_SANDSTONE_STAIRS); - $this->mapSimple(Blocks::SMOOTH_STONE(), Ids::SMOOTH_STONE); $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); - $this->mapSimple(Blocks::SNOW(), Ids::SNOW); $this->map(Blocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ return Writer::create(Ids::SNOW_LAYER) ->writeBool(StateNames::COVERED_BIT, false) @@ -1235,8 +1247,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SOUL_LANTERN) ->writeBool(StateNames::HANGING, $block->isHanging()); }); - $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); - $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); $this->map(Blocks::SOUL_TORCH(), function(Torch $block) : Writer{ return Writer::create(Ids::SOUL_TORCH) ->writeTorchFacing($block->getFacing()); @@ -1304,7 +1314,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); - $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->map(Blocks::TNT(), function(TNT $block) : Writer{ return Writer::create(Ids::TNT) ->writeBool(StateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) @@ -1331,7 +1340,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isPowered()) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->mapSimple(Blocks::TUFF(), Ids::TUFF); $this->map(Blocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ return Writer::create(Ids::UNDERWATER_TORCH) ->writeTorchFacing($block->getFacing()); @@ -1358,10 +1366,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::WARPED_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::WARPED_BUTTON))); $this->map(Blocks::WARPED_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::WARPED_DOOR))); - $this->mapSimple(Blocks::WARPED_FENCE(), Ids::WARPED_FENCE); $this->map(Blocks::WARPED_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::WARPED_FENCE_GATE))); $this->map(Blocks::WARPED_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE)); - $this->mapSimple(Blocks::WARPED_PLANKS(), Ids::WARPED_PLANKS); $this->map(Blocks::WARPED_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WARPED_PRESSURE_PLATE))); $this->map(Blocks::WARPED_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::WARPED_STANDING_SIGN))); $this->mapSlab(Blocks::WARPED_SLAB(), Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB); @@ -1369,7 +1375,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); $this->map(Blocks::WARPED_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WARPED_WALL_SIGN))); - $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) @@ -1381,7 +1386,6 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); - $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); $this->map(Blocks::WOOL(), function(Wool $block) : Writer{ return Writer::create(Ids::WOOL) ->writeColor($block->getColor()); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 8923008dfe..111abbc80c 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -60,6 +60,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize public function __construct(){ $this->registerCandleDeserializers(); + $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -135,151 +136,20 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::YELLOW_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::YELLOW())); } - private function registerDeserializers() : void{ - $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); - $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); - $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in)); - $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::ACACIA_PRESSURE_PLATE(), $in)); - $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS()); - $this->map(Ids::ACACIA_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::ACACIA_SIGN(), $in)); - $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in)); - $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); - $this->map(Ids::ACTIVATOR_RAIL, function(Reader $in) : Block{ - return Blocks::ACTIVATOR_RAIL() - ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); - }); + private function registerSimpleDeserializers() : void{ $this->map(Ids::AIR, fn() => Blocks::AIR()); $this->map(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); $this->map(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS()); - $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); - $this->map(Ids::ANVIL, function(Reader $in) : Block{ - return Blocks::ANVIL() - ->setDamage(match($value = $in->readString(StateNames::DAMAGE)){ - StringValues::DAMAGE_UNDAMAGED => 0, - StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, - StringValues::DAMAGE_VERY_DAMAGED => 2, - StringValues::DAMAGE_BROKEN => 0, - default => throw $in->badValueException(StateNames::DAMAGE, $value), - }) - ->setFacing($in->readLegacyHorizontalFacing()); - }); - $this->map(Ids::BAMBOO, function(Reader $in) : Block{ - return Blocks::BAMBOO() - ->setLeafSize(match($value = $in->readString(StateNames::BAMBOO_LEAF_SIZE)){ - StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, - StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, - default => throw $in->badValueException(StateNames::BAMBOO_LEAF_SIZE, $value), - }) - ->setReady($in->readBool(StateNames::AGE_BIT)) - ->setThick(match($value = $in->readString(StateNames::BAMBOO_STALK_THICKNESS)){ - StringValues::BAMBOO_STALK_THICKNESS_THIN => false, - StringValues::BAMBOO_STALK_THICKNESS_THICK => true, - default => throw $in->badValueException(StateNames::BAMBOO_STALK_THICKNESS, $value), - }); - }); - $this->map(Ids::BAMBOO_SAPLING, function(Reader $in) : Block{ - $in->ignored(StateNames::SAPLING_TYPE); //bug in MCPE - return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT)); - }); - $this->map(Ids::BARREL, function(Reader $in) : Block{ - return Blocks::BARREL() - ->setFacing($in->readFacingDirection()) - ->setOpen($in->readBool(StateNames::OPEN_BIT)); - }); $this->map(Ids::BARRIER, fn() => Blocks::BARRIER()); - $this->map(Ids::BASALT, function(Reader $in){ - return Blocks::BASALT() - ->setAxis($in->readPillarAxis()); - }); $this->map(Ids::BEACON, fn() => Blocks::BEACON()); - $this->map(Ids::BED, function(Reader $in) : Block{ - return Blocks::BED() - ->setFacing($in->readLegacyHorizontalFacing()) - ->setHead($in->readBool(StateNames::HEAD_PIECE_BIT)) - ->setOccupied($in->readBool(StateNames::OCCUPIED_BIT)); - }); - $this->map(Ids::BEDROCK, function(Reader $in) : Block{ - return Blocks::BEDROCK() - ->setBurnsForever($in->readBool(StateNames::INFINIBURN_BIT)); - }); - $this->map(Ids::BEETROOT, fn(Reader $in) => Helper::decodeCrops(Blocks::BEETROOTS(), $in)); - $this->map(Ids::BELL, function(Reader $in) : Block{ - $in->ignored(StateNames::TOGGLE_BIT); //only useful at runtime - return Blocks::BELL() - ->setFacing($in->readLegacyHorizontalFacing()) - ->setAttachmentType($in->readBellAttachmentType()); - }); - $this->map(Ids::BIRCH_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::BIRCH_BUTTON(), $in)); - $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in)); - $this->map(Ids::BIRCH_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::BIRCH_FENCE_GATE(), $in)); - $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::BIRCH_PRESSURE_PLATE(), $in)); - $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS()); - $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); - $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); - $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); $this->map(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE()); - $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); - $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS()); - $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); - $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); - $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ - return Blocks::BLAST_FURNACE() - ->setFacing($in->readHorizontalFacing()) - ->setLit(false); - }); - $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); $this->map(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); - $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ - $in->ignored(StateNames::DEPRECATED); - return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); - }); $this->map(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); - $this->map(Ids::BREWING_STAND, function(Reader $in) : Block{ - return Blocks::BREWING_STAND() - ->setSlot(BrewingStandSlot::EAST(), $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT)) - ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) - ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); - }); $this->map(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); - $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); - $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); $this->map(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); - $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); - $this->map(Ids::CACTUS, function(Reader $in) : Block{ - return Blocks::CACTUS() - ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); - }); - $this->map(Ids::CAKE, function(Reader $in) : Block{ - return Blocks::CAKE() - ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); - }); $this->map(Ids::CALCITE, fn() => Blocks::CALCITE()); - $this->map(Ids::CARPET, function(Reader $in) : Block{ - return Blocks::CARPET() - ->setColor($in->readColor()); - }); - $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); $this->map(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE()); - $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ - return Blocks::CARVED_PUMPKIN() - ->setFacing($in->readLegacyHorizontalFacing()); - }); $this->map(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT()); - $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ - StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), - StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => Blocks::ELEMENT_CONSTRUCTOR(), - StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => Blocks::LAB_TABLE(), - StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => Blocks::MATERIAL_REDUCER(), - default => throw $in->badValueException(StateNames::CHEMISTRY_TABLE_TYPE, $type), - })->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); - }); - $this->map(Ids::CHEST, function(Reader $in) : Block{ - return Blocks::CHEST() - ->setFacing($in->readHorizontalFacing()); - }); $this->map(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); $this->map(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); $this->map(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); @@ -287,104 +157,18 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); $this->map(Ids::COBBLED_DEEPSLATE, fn() => Blocks::COBBLED_DEEPSLATE()); - $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); - $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); - $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); $this->map(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE()); - $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); - $this->map(Ids::COCOA, function(Reader $in) : Block{ - return Blocks::COCOA_POD() - ->setAge($in->readBoundedInt(StateNames::AGE, 0, 2)) - ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); - }); - $this->map(Ids::COLORED_TORCH_BP, function(Reader $in) : Block{ - return $in->readBool(StateNames::COLOR_BIT) ? - Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : - Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); - }); - $this->map(Ids::COLORED_TORCH_RG, function(Reader $in) : Block{ - return $in->readBool(StateNames::COLOR_BIT) ? - Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : - Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); - }); - $this->map(Ids::CONCRETE, function(Reader $in) : Block{ - return Blocks::CONCRETE() - ->setColor($in->readColor()); - }); - $this->map(Ids::CONCRETE_POWDER, function(Reader $in) : Block{ - return Blocks::CONCRETE_POWDER() - ->setColor($in->readColor()); - }); - $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE())); - $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); - $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); - $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); $this->map(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE()); - $this->map(Ids::CORAL, function(Reader $in) : Block{ - return Blocks::CORAL() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(StateNames::DEAD_BIT)); - }); - $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ - return Blocks::CORAL_BLOCK() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(StateNames::DEAD_BIT)); - }); - $this->map(Ids::CORAL_FAN, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) - ->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) - ->setDead(true)); - $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); - $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); - $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ - $in->ignored(StateNames::CORAL_HANG_TYPE_BIT); //the game always writes this, even though it's not used - return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType(CoralType::HORN()); - }); $this->map(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); $this->map(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); $this->map(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); - $this->map(Ids::CRIMSON_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CRIMSON_BUTTON(), $in)); - $this->map(Ids::CRIMSON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CRIMSON_DOOR(), $in)); - $this->mapSlab(Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB, fn() => Blocks::CRIMSON_SLAB()); $this->map(Ids::CRIMSON_FENCE, fn() => Blocks::CRIMSON_FENCE()); - $this->map(Ids::CRIMSON_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::CRIMSON_FENCE_GATE(), $in)); - $this->map(Ids::CRIMSON_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_HYPHAE(), false, $in)); $this->map(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS()); - $this->map(Ids::CRIMSON_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CRIMSON_PRESSURE_PLATE(), $in)); - $this->mapStairs(Ids::CRIMSON_STAIRS, fn() => Blocks::CRIMSON_STAIRS()); - $this->map(Ids::CRIMSON_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::CRIMSON_SIGN(), $in)); - $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); - $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); - $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in)); $this->map(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); - $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); - $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); - $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); - $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); - $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in)); - $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS()); - $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); - $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS()); - $this->map(Ids::DARKOAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::DARK_OAK_SIGN(), $in)); - $this->map(Ids::DARKOAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::DARK_OAK_WALL_SIGN(), $in)); - $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) - ->setInverted(false)); - $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) - ->setInverted(true)); $this->map(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); - $this->map(Ids::DEEPSLATE, function(Reader $in) : Block{ - return Blocks::DEEPSLATE() - ->setAxis($in->readPillarAxis()); - }); $this->map(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); - $this->mapSlab(Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_BRICK_SLAB()); - $this->mapStairs(Ids::DEEPSLATE_BRICK_STAIRS, fn() => Blocks::DEEPSLATE_BRICK_STAIRS()); - $this->map(Ids::DEEPSLATE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_BRICK_WALL(), $in)); $this->map(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE()); $this->map(Ids::DEEPSLATE_COPPER_ORE, fn() => Blocks::DEEPSLATE_COPPER_ORE()); $this->map(Ids::DEEPSLATE_DIAMOND_ORE, fn() => Blocks::DEEPSLATE_DIAMOND_ORE()); @@ -392,58 +176,9 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::DEEPSLATE_GOLD_ORE, fn() => Blocks::DEEPSLATE_GOLD_ORE()); $this->map(Ids::DEEPSLATE_IRON_ORE, fn() => Blocks::DEEPSLATE_IRON_ORE()); $this->map(Ids::DEEPSLATE_LAPIS_ORE, fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE()); - $this->map(Ids::DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(false)); $this->map(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); - $this->mapSlab(Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_TILE_SLAB()); - $this->mapStairs(Ids::DEEPSLATE_TILE_STAIRS, fn() => Blocks::DEEPSLATE_TILE_STAIRS()); - $this->map(Ids::DEEPSLATE_TILE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_TILE_WALL(), $in)); - $this->map(Ids::DETECTOR_RAIL, function(Reader $in) : Block{ - return Blocks::DETECTOR_RAIL() - ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT)) - ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); - }); $this->map(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); $this->map(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); - $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); - $this->map(Ids::DIRT, function(Reader $in) : Block{ - return Blocks::DIRT() - ->setCoarse(match($value = $in->readString(StateNames::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => false, - StringValues::DIRT_TYPE_COARSE => true, - default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), - }); - }); - $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ - StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), - StringValues::DOUBLE_PLANT_TYPE_GRASS => Blocks::DOUBLE_TALLGRASS(), - StringValues::DOUBLE_PLANT_TYPE_PAEONIA => Blocks::PEONY(), - StringValues::DOUBLE_PLANT_TYPE_ROSE => Blocks::ROSE_BUSH(), - StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => Blocks::SUNFLOWER(), - StringValues::DOUBLE_PLANT_TYPE_SYRINGA => Blocks::LILAC(), - default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), - })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB2, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB3, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB4, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_WOODEN_SLAB, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); - }); $this->map(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); $this->map(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP()); $this->map(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO()); @@ -568,8 +303,355 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD()); $this->map(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE()); $this->map(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); - $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); $this->map(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); + $this->map(Ids::END_STONE, fn() => Blocks::END_STONE()); + $this->map(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); + $this->map(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); + $this->map(Ids::GLASS, fn() => Blocks::GLASS()); + $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); + $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); + $this->map(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); + $this->map(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); + $this->map(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); + $this->map(Ids::GRASS, fn() => Blocks::GRASS()); + $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); + $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); + $this->map(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); + $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); + $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); + $this->map(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); + $this->map(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); + $this->map(Ids::ICE, fn() => Blocks::ICE()); + $this->map(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); + $this->map(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); + $this->map(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); + $this->map(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); + $this->map(Ids::IRON_BLOCK, fn() => Blocks::IRON()); + $this->map(Ids::IRON_ORE, fn() => Blocks::IRON_ORE()); + $this->map(Ids::JUKEBOX, fn() => Blocks::JUKEBOX()); + $this->map(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI()); + $this->map(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE()); + $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); + $this->map(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); + $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); + $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); + $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); + $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); + $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); + $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); + $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); + $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); + $this->map(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE()); + $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); + $this->map(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE()); + $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); + $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); + $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); + $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); + $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); + $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); + $this->map(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); + $this->map(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); + $this->map(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); + $this->map(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); + $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); + $this->map(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); + $this->map(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD()); + $this->map(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); + $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); + $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); + $this->map(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); + $this->map(Ids::RESERVED6, fn() => Blocks::RESERVED6()); + $this->map(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); + $this->map(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); + $this->map(Ids::SLIME, fn() => Blocks::SLIME()); + $this->map(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); + $this->map(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); + $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); + $this->map(Ids::SNOW, fn() => Blocks::SNOW()); + $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); + $this->map(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); + $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); + $this->map(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); + $this->map(Ids::TUFF, fn() => Blocks::TUFF()); + $this->map(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); + $this->map(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE()); + $this->map(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); + $this->map(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); + $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); + $this->map(Ids::WEB, fn() => Blocks::COBWEB()); + $this->map(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); + $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); + } + + private function registerDeserializers() : void{ + $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in)); + $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in)); + $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in)); + $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::ACACIA_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS()); + $this->map(Ids::ACACIA_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::ACACIA_SIGN(), $in)); + $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in)); + $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); + $this->map(Ids::ACTIVATOR_RAIL, function(Reader $in) : Block{ + return Blocks::ACTIVATOR_RAIL() + ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); + }); + $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); + $this->map(Ids::ANVIL, function(Reader $in) : Block{ + return Blocks::ANVIL() + ->setDamage(match($value = $in->readString(StateNames::DAMAGE)){ + StringValues::DAMAGE_UNDAMAGED => 0, + StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, + StringValues::DAMAGE_VERY_DAMAGED => 2, + StringValues::DAMAGE_BROKEN => 0, + default => throw $in->badValueException(StateNames::DAMAGE, $value), + }) + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::BAMBOO, function(Reader $in) : Block{ + return Blocks::BAMBOO() + ->setLeafSize(match($value = $in->readString(StateNames::BAMBOO_LEAF_SIZE)){ + StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES, + StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES, + default => throw $in->badValueException(StateNames::BAMBOO_LEAF_SIZE, $value), + }) + ->setReady($in->readBool(StateNames::AGE_BIT)) + ->setThick(match($value = $in->readString(StateNames::BAMBOO_STALK_THICKNESS)){ + StringValues::BAMBOO_STALK_THICKNESS_THIN => false, + StringValues::BAMBOO_STALK_THICKNESS_THICK => true, + default => throw $in->badValueException(StateNames::BAMBOO_STALK_THICKNESS, $value), + }); + }); + $this->map(Ids::BAMBOO_SAPLING, function(Reader $in) : Block{ + $in->ignored(StateNames::SAPLING_TYPE); //bug in MCPE + return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT)); + }); + $this->map(Ids::BARREL, function(Reader $in) : Block{ + return Blocks::BARREL() + ->setFacing($in->readFacingDirection()) + ->setOpen($in->readBool(StateNames::OPEN_BIT)); + }); + $this->map(Ids::BASALT, function(Reader $in){ + return Blocks::BASALT() + ->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::BED, function(Reader $in) : Block{ + return Blocks::BED() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setHead($in->readBool(StateNames::HEAD_PIECE_BIT)) + ->setOccupied($in->readBool(StateNames::OCCUPIED_BIT)); + }); + $this->map(Ids::BEDROCK, function(Reader $in) : Block{ + return Blocks::BEDROCK() + ->setBurnsForever($in->readBool(StateNames::INFINIBURN_BIT)); + }); + $this->map(Ids::BEETROOT, fn(Reader $in) => Helper::decodeCrops(Blocks::BEETROOTS(), $in)); + $this->map(Ids::BELL, function(Reader $in) : Block{ + $in->ignored(StateNames::TOGGLE_BIT); //only useful at runtime + return Blocks::BELL() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setAttachmentType($in->readBellAttachmentType()); + }); + $this->map(Ids::BIRCH_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::BIRCH_BUTTON(), $in)); + $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in)); + $this->map(Ids::BIRCH_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::BIRCH_FENCE_GATE(), $in)); + $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::BIRCH_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS()); + $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in)); + $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); + $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); + $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); + $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS()); + $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); + $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); + $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ + return Blocks::BLAST_FURNACE() + ->setFacing($in->readHorizontalFacing()) + ->setLit(false); + }); + $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); + $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ + $in->ignored(StateNames::DEPRECATED); + return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); + }); + $this->map(Ids::BREWING_STAND, function(Reader $in) : Block{ + return Blocks::BREWING_STAND() + ->setSlot(BrewingStandSlot::EAST(), $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT)) + ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); + }); + $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); + $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); + $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); + $this->map(Ids::CACTUS, function(Reader $in) : Block{ + return Blocks::CACTUS() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); + }); + $this->map(Ids::CAKE, function(Reader $in) : Block{ + return Blocks::CAKE() + ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); + }); + $this->map(Ids::CARPET, function(Reader $in) : Block{ + return Blocks::CARPET() + ->setColor($in->readColor()); + }); + $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); + $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ + return Blocks::CARVED_PUMPKIN() + ->setFacing($in->readLegacyHorizontalFacing()); + }); + $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ + StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), + StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => Blocks::ELEMENT_CONSTRUCTOR(), + StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => Blocks::LAB_TABLE(), + StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => Blocks::MATERIAL_REDUCER(), + default => throw $in->badValueException(StateNames::CHEMISTRY_TABLE_TYPE, $type), + })->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); + }); + $this->map(Ids::CHEST, function(Reader $in) : Block{ + return Blocks::CHEST() + ->setFacing($in->readHorizontalFacing()); + }); + $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); + $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); + $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); + $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); + $this->map(Ids::COCOA, function(Reader $in) : Block{ + return Blocks::COCOA_POD() + ->setAge($in->readBoundedInt(StateNames::AGE, 0, 2)) + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); + }); + $this->map(Ids::COLORED_TORCH_BP, function(Reader $in) : Block{ + return $in->readBool(StateNames::COLOR_BIT) ? + Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : + Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::COLORED_TORCH_RG, function(Reader $in) : Block{ + return $in->readBool(StateNames::COLOR_BIT) ? + Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : + Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); + }); + $this->map(Ids::CONCRETE, function(Reader $in) : Block{ + return Blocks::CONCRETE() + ->setColor($in->readColor()); + }); + $this->map(Ids::CONCRETE_POWDER, function(Reader $in) : Block{ + return Blocks::CONCRETE_POWDER() + ->setColor($in->readColor()); + }); + $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE())); + $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); + $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); + $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); + $this->map(Ids::CORAL, function(Reader $in) : Block{ + return Blocks::CORAL() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(StateNames::DEAD_BIT)); + }); + $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ + return Blocks::CORAL_BLOCK() + ->setCoralType($in->readCoralType()) + ->setDead($in->readBool(StateNames::DEAD_BIT)); + }); + $this->map(Ids::CORAL_FAN, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) + ->setDead(false)); + $this->map(Ids::CORAL_FAN_DEAD, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) + ->setDead(true)); + $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); + $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); + $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ + $in->ignored(StateNames::CORAL_HANG_TYPE_BIT); //the game always writes this, even though it's not used + return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) + ->setCoralType(CoralType::HORN()); + }); + $this->map(Ids::CRIMSON_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CRIMSON_BUTTON(), $in)); + $this->map(Ids::CRIMSON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CRIMSON_DOOR(), $in)); + $this->mapSlab(Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB, fn() => Blocks::CRIMSON_SLAB()); + $this->map(Ids::CRIMSON_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::CRIMSON_FENCE_GATE(), $in)); + $this->map(Ids::CRIMSON_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_HYPHAE(), false, $in)); + $this->map(Ids::CRIMSON_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CRIMSON_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::CRIMSON_STAIRS, fn() => Blocks::CRIMSON_STAIRS()); + $this->map(Ids::CRIMSON_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::CRIMSON_SIGN(), $in)); + $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); + $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); + $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in)); + $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); + $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); + $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); + $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); + $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in)); + $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS()); + $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); + $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS()); + $this->map(Ids::DARKOAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::DARK_OAK_SIGN(), $in)); + $this->map(Ids::DARKOAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::DARK_OAK_WALL_SIGN(), $in)); + $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) + ->setInverted(false)); + $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) + ->setInverted(true)); + $this->map(Ids::DEEPSLATE, function(Reader $in) : Block{ + return Blocks::DEEPSLATE() + ->setAxis($in->readPillarAxis()); + }); + $this->mapSlab(Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_BRICK_SLAB()); + $this->mapStairs(Ids::DEEPSLATE_BRICK_STAIRS, fn() => Blocks::DEEPSLATE_BRICK_STAIRS()); + $this->map(Ids::DEEPSLATE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_BRICK_WALL(), $in)); + $this->map(Ids::DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(false)); + $this->mapSlab(Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_TILE_SLAB()); + $this->mapStairs(Ids::DEEPSLATE_TILE_STAIRS, fn() => Blocks::DEEPSLATE_TILE_STAIRS()); + $this->map(Ids::DEEPSLATE_TILE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_TILE_WALL(), $in)); + $this->map(Ids::DETECTOR_RAIL, function(Reader $in) : Block{ + return Blocks::DETECTOR_RAIL() + ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT)) + ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); + }); + $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); + $this->map(Ids::DIRT, function(Reader $in) : Block{ + return Blocks::DIRT() + ->setCoarse(match($value = $in->readString(StateNames::DIRT_TYPE)){ + StringValues::DIRT_TYPE_NORMAL => false, + StringValues::DIRT_TYPE_COARSE => true, + default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), + }); + }); + $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ + return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ + StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), + StringValues::DOUBLE_PLANT_TYPE_GRASS => Blocks::DOUBLE_TALLGRASS(), + StringValues::DOUBLE_PLANT_TYPE_PAEONIA => Blocks::PEONY(), + StringValues::DOUBLE_PLANT_TYPE_ROSE => Blocks::ROSE_BUSH(), + StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => Blocks::SUNFLOWER(), + StringValues::DOUBLE_PLANT_TYPE_SYRINGA => Blocks::LILAC(), + default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), + })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); + }); + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs + return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB2, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs + return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB3, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs + return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB4, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs + return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->map(Ids::DOUBLE_WOODEN_SLAB, function(Reader $in) : Block{ + $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs + return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); + }); + $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() ->setEye($in->readBool(StateNames::END_PORTAL_EYE_BIT)) @@ -579,7 +661,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::END_ROD() ->setFacing($in->readEndRodFacingDirection()); }); - $this->map(Ids::END_STONE, fn() => Blocks::END_STONE()); $this->map(Ids::ENDER_CHEST, function(Reader $in) : Block{ return Blocks::ENDER_CHEST() ->setFacing($in->readHorizontalFacing()); @@ -608,7 +689,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::FIRE() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); $this->map(Ids::FLOWER_POT, function(Reader $in) : Block{ $in->ignored(StateNames::UPDATE_BIT); return Blocks::FLOWER_POT(); @@ -625,28 +705,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); - $this->map(Ids::GLASS, fn() => Blocks::GLASS()); - $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); $this->map(Ids::GLOW_FRAME, fn(Reader $in) => Helper::decodeItemFrame($in, true)); - $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); - $this->map(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); - $this->map(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); - $this->map(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); $this->map(Ids::GOLDEN_RAIL, function(Reader $in) : Block{ return Blocks::POWERED_RAIL() ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); - $this->map(Ids::GRASS, fn() => Blocks::GRASS()); - $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); - $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); - $this->map(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); - $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); - $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ return Blocks::STAINED_HARDENED_GLASS() ->setColor($in->readColor()); @@ -655,28 +722,18 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::STAINED_HARDENED_GLASS_PANE() ->setColor($in->readColor()); }); - $this->map(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); }); $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in)); - $this->map(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); $this->map(Ids::HOPPER, function(Reader $in) : Block{ return Blocks::HOPPER() ->setFacing($in->readFacingWithoutUp()) ->setPowered($in->readBool(StateNames::TOGGLE_BIT)); }); - $this->map(Ids::ICE, fn() => Blocks::ICE()); - $this->map(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); - $this->map(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); - $this->map(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); - $this->map(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); - $this->map(Ids::IRON_BLOCK, fn() => Blocks::IRON()); $this->map(Ids::IRON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::IRON_DOOR(), $in)); - $this->map(Ids::IRON_ORE, fn() => Blocks::IRON_ORE()); $this->map(Ids::IRON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::IRON_TRAPDOOR(), $in)); - $this->map(Ids::JUKEBOX, fn() => Blocks::JUKEBOX()); $this->map(Ids::JUNGLE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::JUNGLE_BUTTON(), $in)); $this->map(Ids::JUNGLE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::JUNGLE_DOOR(), $in)); $this->map(Ids::JUNGLE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::JUNGLE_FENCE_GATE(), $in)); @@ -693,8 +750,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::LANTERN() ->setHanging($in->readBool(StateNames::HANGING)); }); - $this->map(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI()); - $this->map(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE()); $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in)); $this->map(Ids::LEAVES, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::OLD_LEAF_TYPE)){ @@ -792,14 +847,11 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readLegacyHorizontalFacing()); }); $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); - $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); $this->map(Ids::MANGROVE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::MANGROVE_BUTTON(), $in)); $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in)); $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB()); - $this->map(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); $this->map(Ids::MANGROVE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::MANGROVE_FENCE_GATE(), $in)); $this->map(Ids::MANGROVE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_LOG(), false, $in)); - $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); $this->map(Ids::MANGROVE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::MANGROVE_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS()); $this->map(Ids::MANGROVE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::MANGROVE_SIGN(), $in)); @@ -809,9 +861,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $in->ignored(StateNames::STRIPPED_BIT); //this is also ignored by vanilla return Helper::decodeLog(Blocks::MANGROVE_WOOD(), false, $in); }); - $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); - $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); $this->map(Ids::MONSTER_EGG, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::MONSTER_EGG_STONE_TYPE)){ StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => Blocks::INFESTED_CHISELED_STONE_BRICK(), @@ -823,36 +873,23 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::MONSTER_EGG_STONE_TYPE, $type), }; }); - $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS()); $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); - $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); $this->mapSlab(Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB, fn() => Blocks::MUD_BRICK_SLAB()); $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS()); $this->map(Ids::MUD_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MUD_BRICK_WALL(), $in)); - $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); - $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); - $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); - $this->map(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE()); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ return Blocks::NETHER_WART() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); - $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); - $this->map(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE()); - $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); - $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); - $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); - $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); - $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); $this->map(Ids::PLANKS, function(Reader $in) : Block{ return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ @@ -865,23 +902,19 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodName), }; }); - $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); $this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ return Blocks::POLISHED_BASALT() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); $this->map(Ids::POLISHED_BLACKSTONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::POLISHED_BLACKSTONE_BUTTON(), $in)); $this->mapSlab(Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_SLAB()); $this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::POLISHED_BLACKSTONE_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_STAIRS()); $this->map(Ids::POLISHED_BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_WALL(), $in)); - $this->map(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); $this->mapSlab(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB()); $this->mapStairs(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS()); $this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), $in)); - $this->map(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); $this->mapSlab(Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DEEPSLATE_SLAB()); $this->mapStairs(Ids::POLISHED_DEEPSLATE_STAIRS, fn() => Blocks::POLISHED_DEEPSLATE_STAIRS()); $this->map(Ids::POLISHED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_DEEPSLATE_WALL(), $in)); @@ -947,16 +980,11 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return throw $in->badValueException(StateNames::CHISEL_TYPE, $type); } }); - $this->map(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); - $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS()); $this->map(Ids::RAIL, function(Reader $in) : Block{ return Blocks::RAIL() ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); }); - $this->map(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); - $this->map(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD()); - $this->map(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); $this->map(Ids::RED_FLOWER, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::FLOWER_TYPE)){ StringValues::FLOWER_TYPE_ALLIUM => Blocks::ALLIUM(), @@ -974,9 +1002,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; }); $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::RED(), $in)); - $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); - $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ @@ -988,7 +1014,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }; }); $this->mapStairs(Ids::RED_SANDSTONE_STAIRS, fn() => Blocks::RED_SANDSTONE_STAIRS()); - $this->map(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); $this->map(Ids::REDSTONE_LAMP, function() : Block{ return Blocks::REDSTONE_LAMP() ->setPowered(false); @@ -1010,7 +1035,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::SUGARCANE() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::RESERVED6, fn() => Blocks::RESERVED6()); $this->map(Ids::SAND, function(Reader $in) : Block{ return match($value = $in->readString(StateNames::SAND_TYPE)){ StringValues::SAND_TYPE_NORMAL => Blocks::SAND(), @@ -1040,13 +1064,11 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }) ->setReady($in->readBool(StateNames::AGE_BIT)); }); - $this->map(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ return Blocks::SEA_PICKLE() ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); $this->map(Ids::SHULKER_BOX, function(Reader $in) : Block{ return Blocks::DYED_SHULKER_BOX() ->setColor($in->readColor()); @@ -1056,19 +1078,14 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::MOB_HEAD() ->setFacing($in->readFacingWithoutDown()); }); - $this->map(Ids::SLIME, fn() => Blocks::SLIME()); - $this->map(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); $this->map(Ids::SMOKER, function(Reader $in) : Block{ return Blocks::SMOKER() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS()); $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS()); - $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); - $this->map(Ids::SNOW, fn() => Blocks::SNOW()); $this->map(Ids::SNOW_LAYER, function(Reader $in) : Block{ $in->ignored(StateNames::COVERED_BIT); //seems to be useless return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); @@ -1081,8 +1098,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::SOUL_LANTERN() ->setHanging($in->readBool(StateNames::HANGING)); }); - $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); - $this->map(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); $this->map(Ids::SOUL_TORCH, function(Reader $in) : Block{ return Blocks::SOUL_TORCH() ->setFacing($in->readTorchFacing()); @@ -1149,7 +1164,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::STONE_BRICK_TYPE, $type), }; }); - $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); $this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ return Blocks::STONECUTTER() ->setFacing($in->readHorizontalFacing()); @@ -1179,7 +1193,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize default => throw $in->badValueException(StateNames::TALL_GRASS_TYPE, $type), }; }); - $this->map(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->map(Ids::TNT, function(Reader $in) : Block{ return Blocks::TNT() ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) @@ -1207,12 +1220,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize ->setFacing($in->readLegacyHorizontalFacing()) ->setPowered($in->readBool(StateNames::POWERED_BIT)); }); - $this->map(Ids::TUFF, fn() => Blocks::TUFF()); $this->map(Ids::UNDERWATER_TORCH, function(Reader $in) : Block{ return Blocks::UNDERWATER_TORCH() ->setFacing($in->readTorchFacing()); }); - $this->map(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); $this->map(Ids::UNLIT_REDSTONE_TORCH, function(Reader $in) : Block{ return Blocks::REDSTONE_TORCH() ->setFacing($in->readTorchFacing()) @@ -1237,19 +1248,15 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WARPED_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::WARPED_BUTTON(), $in)); $this->map(Ids::WARPED_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::WARPED_DOOR(), $in)); $this->mapSlab(Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB, fn() => Blocks::WARPED_SLAB()); - $this->map(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE()); $this->map(Ids::WARPED_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::WARPED_FENCE_GATE(), $in)); $this->map(Ids::WARPED_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_HYPHAE(), false, $in)); - $this->map(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); $this->map(Ids::WARPED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::WARPED_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::WARPED_STAIRS, fn() => Blocks::WARPED_STAIRS()); $this->map(Ids::WARPED_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::WARPED_SIGN(), $in)); $this->map(Ids::WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), false, $in)); $this->map(Ids::WARPED_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::WARPED_TRAPDOOR(), $in)); $this->map(Ids::WARPED_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::WARPED_WALL_SIGN(), $in)); - $this->map(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); - $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->map(Ids::WAXED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::NONE())); $this->map(Ids::WAXED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); $this->mapSlab(Ids::WAXED_CUT_COPPER_SLAB, Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); @@ -1270,10 +1277,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); - $this->map(Ids::WEB, fn() => Blocks::COBWEB()); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); - $this->map(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), @@ -1291,7 +1296,6 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::WOOL() ->setColor($in->readColor()); }); - $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); } From afaf9dbc88591e48dbfcf62ec7d76099ea6e6105 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 15:32:08 +0100 Subject: [PATCH 0354/1858] Rename LegacyBlockStateMapper -> BlockIdMetaUpgrader this more accurately describes what it's used for. --- src/data/bedrock/block/upgrade/BlockDataUpgrader.php | 2 +- .../{LegacyBlockStateMapper.php => BlockIdMetaUpgrader.php} | 2 +- src/world/format/io/GlobalBlockStateHandlers.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/data/bedrock/block/upgrade/{LegacyBlockStateMapper.php => BlockIdMetaUpgrader.php} (98%) diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index 785a36af8a..3fae1d2413 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -30,7 +30,7 @@ use pocketmine\nbt\tag\CompoundTag; final class BlockDataUpgrader{ public function __construct( - private LegacyBlockStateMapper $legacyBlockStateMapper, + private BlockIdMetaUpgrader $legacyBlockStateMapper, private BlockStateUpgrader $blockStateUpgrader ){} diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php similarity index 98% rename from src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php rename to src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php index 3b32ef15a7..3bb63a6232 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php @@ -30,7 +30,7 @@ use pocketmine\utils\BinaryStream; /** * Handles translating legacy 1.12 block ID/meta into modern blockstates. */ -final class LegacyBlockStateMapper{ +final class BlockIdMetaUpgrader{ /** * @param BlockStateData[][] $mappingTable * @phpstan-param array> $mappingTable diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 4cbf645d63..2ba979a66e 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -31,10 +31,10 @@ use pocketmine\data\bedrock\block\CachingBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockStateToBlockObjectDeserializer; use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; +use pocketmine\data\bedrock\block\upgrade\BlockIdMetaUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; -use pocketmine\data\bedrock\block\upgrade\LegacyBlockStateMapper; use pocketmine\errorhandler\ErrorToExceptionHandler; use Webmozart\PathUtil\Path; use function file_get_contents; @@ -69,7 +69,7 @@ final class GlobalBlockStateHandlers{ BlockStateData::CURRENT_VERSION )); self::$blockDataUpgrader = new BlockDataUpgrader( - LegacyBlockStateMapper::loadFromString( + BlockIdMetaUpgrader::loadFromString( ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join( BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, '1.12.0_to_1.18.10_blockstate_map.bin' From b36b65927c4e0e380a638adfaf0c3021eb333e67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 16:02:35 +0100 Subject: [PATCH 0355/1858] BlockDataUpgrader: expose BlockIdMetaUpgrader via getter --- src/data/bedrock/block/upgrade/BlockDataUpgrader.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index 3fae1d2413..e27469ac2f 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -30,16 +30,16 @@ use pocketmine\nbt\tag\CompoundTag; final class BlockDataUpgrader{ public function __construct( - private BlockIdMetaUpgrader $legacyBlockStateMapper, + private BlockIdMetaUpgrader $blockIdMetaUpgrader, private BlockStateUpgrader $blockStateUpgrader ){} public function upgradeIntIdMeta(int $id, int $meta) : ?BlockStateData{ - return $this->legacyBlockStateMapper->fromIntIdMeta($id, $meta); + return $this->blockIdMetaUpgrader->fromIntIdMeta($id, $meta); } public function upgradeStringIdMeta(string $id, int $meta) : ?BlockStateData{ - return $this->legacyBlockStateMapper->fromStringIdMeta($id, $meta); + return $this->blockIdMetaUpgrader->fromStringIdMeta($id, $meta); } public function upgradeBlockStateNbt(CompoundTag $tag) : ?BlockStateData{ @@ -62,4 +62,6 @@ final class BlockDataUpgrader{ } public function getBlockStateUpgrader() : BlockStateUpgrader{ return $this->blockStateUpgrader; } + + public function getBlockIdMetaUpgrader() : BlockIdMetaUpgrader{ return $this->blockIdMetaUpgrader; } } From 9a8902d1fe26d492346c9e9a50ab99dd28e5d5fd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 16:08:05 +0100 Subject: [PATCH 0356/1858] LegacyToStringMap: don't throw if the existing mapping is the same as the one we want to register this was making it inconvenient for plugins to use BlockIdMetaUpgrader->addMapping(), because the block legacy ID map contains IDs up to 1.16, but the table of mapped 1.12 blockstates only goes up to ... well ... 1.12. This left a gap of several versions' blocks unable to be mapped. --- src/data/bedrock/LegacyToStringIdMap.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/bedrock/LegacyToStringIdMap.php b/src/data/bedrock/LegacyToStringIdMap.php index d808b35dfa..e5181e1934 100644 --- a/src/data/bedrock/LegacyToStringIdMap.php +++ b/src/data/bedrock/LegacyToStringIdMap.php @@ -66,6 +66,9 @@ abstract class LegacyToStringIdMap{ public function add(string $string, int $legacy) : void{ if(isset($this->legacyToString[$legacy])){ + if($this->legacyToString[$legacy] === $string){ + return; + } throw new \InvalidArgumentException("Legacy ID $legacy is already mapped to string " . $this->legacyToString[$legacy]); } $this->legacyToString[$legacy] = $string; From f64e306fb8f94d577178ee16c1e6df79eb599308 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 16:21:27 +0100 Subject: [PATCH 0357/1858] Make BlockIdMetaUpgrader API less dumb the old impl prevented registering more than one meta -> state mapping since the legacy numeric ID map would throw an exception if attempting to map the same ID more than once. --- .../bedrock/block/upgrade/BlockIdMetaUpgrader.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php index 3bb63a6232..ef82672950 100644 --- a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php @@ -52,16 +52,23 @@ final class BlockIdMetaUpgrader{ return $this->fromStringIdMeta($stringId, $meta); } + /** + * Adds a mapping of legacy block numeric ID to modern string ID. This is used for upgrading blocks from pre-1.2.13 + * worlds (PM3). It's also needed for upgrading flower pot contents and falling blocks from PM4 worlds. + */ + public function addIntIdToStringIdMapping(int $intId, string $stringId) : void{ + $this->legacyNumericIdMap->add($stringId, $intId); + } + /** * Adds a mapping of legacy block ID and meta to modern blockstate data. This may be needed for upgrading data from * stored custom blocks from older versions of PocketMine-MP. */ - public function addMapping(string $stringId, int $intId, int $meta, BlockStateData $stateData) : void{ + public function addIdMetaToStateMapping(string $stringId, int $meta, BlockStateData $stateData) : void{ if(isset($this->mappingTable[$stringId][$meta])){ throw new \InvalidArgumentException("A mapping for $stringId:$meta already exists"); } $this->mappingTable[$stringId][$meta] = $stateData; - $this->legacyNumericIdMap->add($stringId, $intId); } public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{ From 87b840ff97fc604869eacb1f3897e76c812beab6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 17:47:41 +0100 Subject: [PATCH 0358/1858] Added a hack to allow tiles to trigger client-side render updates on blocks without actually changing the block Bedrock block entity updates don't directly trigger block rendering updates. This is a problem when the block entity data affects the block's appearance directly (e.g. cauldron water colour, flower pot contents), because it means changing them won't directly result in a client-side render update. This hack allows tiles to spoof block updates without actually changing the server-side block, keeping the internals and API clean of random shitbox workarounds. fixes #5174 fixes #4944 --- src/block/tile/FlowerPot.php | 6 ++++++ src/block/tile/Spawnable.php | 20 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 2 +- src/world/World.php | 18 ++++++++++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index e778d0774d..9ef15053ac 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -27,7 +27,9 @@ use pocketmine\block\Air; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\SavedDataLoadingException; +use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ShortTag; @@ -92,4 +94,8 @@ class FlowerPot extends Spawnable{ $nbt->setTag(self::TAG_PLANT_BLOCK, RuntimeBlockMapping::getInstance()->toStateData($this->plant->getStateId())->toNbt()); } } + + public function getRenderUpdateBugWorkaroundStateProperties(Block $block) : array{ + return [BlockStateNames::UPDATE_BIT => new ByteTag(1)]; + } } diff --git a/src/block/tile/Spawnable.php b/src/block/tile/Spawnable.php index 73ad2142af..67bc72fd91 100644 --- a/src/block/tile/Spawnable.php +++ b/src/block/tile/Spawnable.php @@ -23,7 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\tile; +use pocketmine\block\Block; +use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\protocol\types\CacheableNbt; use function get_class; @@ -49,6 +53,22 @@ abstract class Spawnable extends Tile{ $this->spawnCompoundCache = null; } + /** + * The Bedrock client won't re-render a block if the block's state properties didn't change. This is a problem when + * the tile may affect the block's appearance. For example, a cauldron's liquid changes colour based on the dye + * inside. + * + * This is worked around in vanilla by modifying one of the block's state properties to a different value, and then + * changing it back again. Since we don't want to litter core implementation with hacks like this, we brush it under + * the rug into Tile. + * + * @return ByteTag[]|IntTag[]|StringTag[] + * @phpstan-return array + */ + public function getRenderUpdateBugWorkaroundStateProperties(Block $block) : array{ + return []; + } + /** * Returns encoded NBT (varint, little-endian) used to spawn this tile to clients. Uses cache where possible, * populates cache if it is null. diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 553f84ff0b..26958f5987 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -907,7 +907,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::FLOWER_POT(), function() : Writer{ return Writer::create(Ids::FLOWER_POT) - ->writeBool(StateNames::UPDATE_BIT, true); //to keep MCPE happy + ->writeBool(StateNames::UPDATE_BIT, false); //to keep MCPE happy }); $this->map(Blocks::FROSTED_ICE(), function(FrostedIce $block) : Writer{ return Writer::create(Ids::FROSTED_ICE) diff --git a/src/world/World.php b/src/world/World.php index 7d5366b0bc..8704789926 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -36,6 +36,7 @@ use pocketmine\block\tile\TileFactory; use pocketmine\block\UnknownBlock; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\BiomeIds; +use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\EntityFactory; @@ -948,6 +949,22 @@ class World implements ChunkManager{ $fullBlock = $this->getBlockAt($b->x, $b->y, $b->z); $blockPosition = BlockPosition::fromVector3($b); + + $tile = $this->getTileAt($b->x, $b->y, $b->z); + if($tile instanceof Spawnable && ($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) !== null){ + $originalStateData = $blockMapping->toStateData($fullBlock->getStateId()); + $fakeStateData = new BlockStateData( + $originalStateData->getName(), + array_merge($originalStateData->getStates(), $fakeStateProperties), + $originalStateData->getVersion() + ); + $packets[] = UpdateBlockPacket::create( + $blockPosition, + $blockMapping->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()), + UpdateBlockPacket::FLAG_NETWORK, + UpdateBlockPacket::DATA_LAYER_NORMAL + ); + } $packets[] = UpdateBlockPacket::create( $blockPosition, $blockMapping->toRuntimeId($fullBlock->getStateId()), @@ -955,7 +972,6 @@ class World implements ChunkManager{ UpdateBlockPacket::DATA_LAYER_NORMAL ); - $tile = $this->getTileAt($b->x, $b->y, $b->z); if($tile instanceof Spawnable){ $packets[] = BlockActorDataPacket::create($blockPosition, $tile->getSerializedSpawnCompound()); } From eccfb3bbe21a1fc3c4b2fde77fc8bb4de0066980 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 17:59:53 +0100 Subject: [PATCH 0359/1858] World: fix borked check --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index 8704789926..68ea37fa08 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -951,7 +951,7 @@ class World implements ChunkManager{ $blockPosition = BlockPosition::fromVector3($b); $tile = $this->getTileAt($b->x, $b->y, $b->z); - if($tile instanceof Spawnable && ($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) !== null){ + if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){ $originalStateData = $blockMapping->toStateData($fullBlock->getStateId()); $fakeStateData = new BlockStateData( $originalStateData->getName(), From fa201b081c44bf767dc89fabdf9ec4282252d6c8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 19 Jul 2022 20:28:09 +0100 Subject: [PATCH 0360/1858] Added spore blossoms I got tired of the flood of warning messages every time someone joined the dev server... --- src/block/BlockTypeIds.php | 3 +- src/block/SporeBlossom.php | 56 +++++++++++++++++++ src/block/VanillaBlocks.php | 6 ++ src/block/tile/SporeBlossom.php | 46 +++++++++++++++ src/block/tile/TileFactory.php | 1 + .../BlockObjectToBlockStateSerializer.php | 1 + .../BlockStateToBlockObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 9 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/block/SporeBlossom.php create mode 100644 src/block/tile/SporeBlossom.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 8ef7a2ee2f..27fc92bd58 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -693,6 +693,7 @@ final class BlockTypeIds{ public const CARTOGRAPHY_TABLE = 10666; public const SMITHING_TABLE = 10667; public const NETHERITE = 10668; + public const SPORE_BLOSSOM = 10669; - public const FIRST_UNUSED_BLOCK_ID = 10669; + public const FIRST_UNUSED_BLOCK_ID = 10670; } diff --git a/src/block/SporeBlossom.php b/src/block/SporeBlossom.php new file mode 100644 index 0000000000..83f9723c84 --- /dev/null +++ b/src/block/SporeBlossom.php @@ -0,0 +1,56 @@ +getSupportType(Facing::DOWN)->equals(SupportType::FULL()); + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::UP))){ + return false; + } + + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index c3a76bbeb3..679e51553f 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -636,6 +636,7 @@ use function mb_strtolower; * @method static Opaque SOUL_SOIL() * @method static Torch SOUL_TORCH() * @method static Sponge SPONGE() + * @method static SporeBlossom SPORE_BLOSSOM() * @method static WoodenButton SPRUCE_BUTTON() * @method static WoodenDoor SPRUCE_DOOR() * @method static WoodenFence SPRUCE_FENCE() @@ -1159,6 +1160,7 @@ final class VanillaBlocks{ self::registerBlocksR14(); self::registerBlocksR16(); self::registerBlocksR17(); + self::registerBlocksR18(); self::registerMudBlocks(); self::registerCraftingTables(); @@ -1498,6 +1500,10 @@ final class VanillaBlocks{ self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", BreakInfo::instant(ToolType::SHEARS, 1))); } + private static function registerBlocksR18() : void{ + self::register("spore_blossom", new SporeBlossom(new BID(Ids::SPORE_BLOSSOM), "Spore Blossom", BreakInfo::instant())); + } + private static function registerMudBlocks() : void{ $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); diff --git a/src/block/tile/SporeBlossom.php b/src/block/tile/SporeBlossom.php new file mode 100644 index 0000000000..ba048ecb30 --- /dev/null +++ b/src/block/tile/SporeBlossom.php @@ -0,0 +1,46 @@ +register(ShulkerBox::class, ["ShulkerBox", "minecraft:shulker_box"]); $this->register(Sign::class, ["Sign", "minecraft:sign"]); $this->register(Smoker::class, ["Smoker", "minecraft:smoker"]); + $this->register(SporeBlossom::class, ["SporeBlossom", "minecraft:spore_blossom"]); $this->register(Skull::class, ["Skull", "minecraft:skull"]); //TODO: Campfire diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 26958f5987..27b620ee01 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -532,6 +532,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SNOW(), Ids::SNOW); $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); + $this->mapSimple(Blocks::SPORE_BLOSSOM(), Ids::SPORE_BLOSSOM); $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); $this->mapSimple(Blocks::WARPED_FENCE(), Ids::WARPED_FENCE); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 111abbc80c..fb689c2948 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -371,6 +371,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::SNOW, fn() => Blocks::SNOW()); $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); $this->map(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); + $this->map(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); $this->map(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->map(Ids::TUFF, fn() => Blocks::TUFF()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c96f2ead05..1cdca32ad9 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -944,6 +944,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("soul_soil", fn() => Blocks::SOUL_SOIL()); $result->registerBlock("soul_torch", fn() => Blocks::SOUL_TORCH()); $result->registerBlock("sponge", fn() => Blocks::SPONGE()); + $result->registerBlock("spore_blossom", fn() => Blocks::SPORE_BLOSSOM()); $result->registerBlock("spruce_button", fn() => Blocks::SPRUCE_BUTTON()); $result->registerBlock("spruce_door", fn() => Blocks::SPRUCE_DOOR()); $result->registerBlock("spruce_door_block", fn() => Blocks::SPRUCE_DOOR()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index f1852b0d93..475485f542 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 44c4118080ab2dc0296fd203361e88e4116c134e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Jul 2022 15:22:47 +0100 Subject: [PATCH 0361/1858] fix CS again --- src/block/tile/SporeBlossom.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/tile/SporeBlossom.php b/src/block/tile/SporeBlossom.php index ba048ecb30..46ad80e10f 100644 --- a/src/block/tile/SporeBlossom.php +++ b/src/block/tile/SporeBlossom.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block\tile; -use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; /** From 466307a43f580a8dc9103f7e4cdf4a1346a41b48 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Jul 2022 15:46:43 +0100 Subject: [PATCH 0362/1858] Attempting to reduce IDE performance hit of working in StringToItemParser --- src/item/StringToItemParser.php | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 1cdca32ad9..2a8b9d1076 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -46,6 +46,15 @@ final class StringToItemParser extends StringToTParser{ private static function make() : self{ $result = new self; + self::registerDynamicBlocks($result); + self::registerBlocks($result); + self::registerDynamicItems($result); + self::registerItems($result); + + return $result; + } + + private static function registerDynamicBlocks(self $result) : void{ foreach(DyeColor::getAll() as $color){ $prefix = fn(string $name) => $color->name() . "_" . $name; //wall and floor banner are the same item @@ -63,9 +72,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock($prefix("stained_hardened_glass_pane"), fn() => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)); $result->registerBlock($prefix("wool"), fn() => Blocks::WOOL()->setColor($color)); $result->registerBlock($prefix("shulker_box"), fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); - - $result->register($prefix("dye"), fn() => Items::DYE()->setColor($color)); } + foreach(CoralType::getAll() as $coralType){ $prefix = fn(string $name) => $coralType->name() . "_" . $name; $result->registerBlock($prefix("coral"), fn() => Blocks::CORAL()->setCoralType($coralType)); @@ -90,7 +98,9 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock($prefix . "cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); } } + } + private static function registerBlocks(self $result) : void{ $result->registerBlock("acacia_button", fn() => Blocks::ACACIA_BUTTON()); $result->registerBlock("acacia_door", fn() => Blocks::ACACIA_DOOR()); $result->registerBlock("acacia_door_block", fn() => Blocks::ACACIA_DOOR()); @@ -1085,6 +1095,17 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("yellow_flower", fn() => Blocks::DANDELION()); $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); + } + + private static function registerDynamicItems(self $result) : void{ + foreach(DyeColor::getAll() as $color){ + $prefix = fn(string $name) => $color->name() . "_" . $name; + + $result->register($prefix("dye"), fn() => Items::DYE()->setColor($color)); + } + } + + private static function registerItems(self $result) : void{ $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); $result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD()); @@ -1466,8 +1487,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("writable_book", fn() => Items::WRITABLE_BOOK()); $result->register("written_book", fn() => Items::WRITTEN_BOOK()); $result->register("zombie_spawn_egg", fn() => Items::ZOMBIE_SPAWN_EGG()); - - return $result; } /** @phpstan-param \Closure(string $input) : Block $callback */ From c1acf443372f7aed9c729bdad20eeb3342cd4697 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 20 Jul 2022 16:12:58 +0100 Subject: [PATCH 0363/1858] Implement cauldrons (#5163) the following things are currently not implemented: - particle/sound effects when an entity extinguishes itself - particle/sound effects when mixing different stuff in a cauldron - powder snow cauldron both of these things are contingent on #5169, but for the time being, the PR is functionally complete and I want to move on to something else without being stalled by the particle+sound problem (which I haven't yet decided how to solve). --- src/block/BlockTypeIds.php | 7 +- src/block/Cauldron.php | 104 +++++++++ src/block/FillableCauldron.php | 132 +++++++++++ src/block/LavaCauldron.php | 88 ++++++++ src/block/PotionCauldron.php | 108 +++++++++ src/block/VanillaBlocks.php | 14 ++ src/block/WaterCauldron.php | 209 ++++++++++++++++++ src/block/tile/Cauldron.php | 135 +++++++++++ src/block/tile/TileFactory.php | 1 + .../BlockObjectToBlockStateSerializer.php | 10 + .../convert/BlockStateSerializerHelper.php | 6 + .../BlockStateToBlockObjectDeserializer.php | 20 ++ src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 1 + src/item/ItemTypeIds.php | 4 +- src/item/StringToItemParser.php | 1 + src/world/sound/CauldronAddDyeSound.php | 35 +++ src/world/sound/CauldronCleanItemSound.php | 35 +++ src/world/sound/CauldronDyeItemSound.php | 35 +++ src/world/sound/CauldronEmptyLavaSound.php | 35 +++ src/world/sound/CauldronEmptyPotionSound.php | 35 +++ .../sound/CauldronEmptyPowderSnowSound.php | 35 +++ src/world/sound/CauldronEmptyWaterSound.php | 35 +++ src/world/sound/CauldronFillLavaSound.php | 35 +++ src/world/sound/CauldronFillPotionSound.php | 35 +++ .../sound/CauldronFillPowderSnowSound.php | 35 +++ src/world/sound/CauldronFillWaterSound.php | 35 +++ .../block_factory_consistency_check.json | 2 +- .../BlockSerializerDeserializerTest.php | 6 + 29 files changed, 1231 insertions(+), 4 deletions(-) create mode 100644 src/block/Cauldron.php create mode 100644 src/block/FillableCauldron.php create mode 100644 src/block/LavaCauldron.php create mode 100644 src/block/PotionCauldron.php create mode 100644 src/block/WaterCauldron.php create mode 100644 src/block/tile/Cauldron.php create mode 100644 src/world/sound/CauldronAddDyeSound.php create mode 100644 src/world/sound/CauldronCleanItemSound.php create mode 100644 src/world/sound/CauldronDyeItemSound.php create mode 100644 src/world/sound/CauldronEmptyLavaSound.php create mode 100644 src/world/sound/CauldronEmptyPotionSound.php create mode 100644 src/world/sound/CauldronEmptyPowderSnowSound.php create mode 100644 src/world/sound/CauldronEmptyWaterSound.php create mode 100644 src/world/sound/CauldronFillLavaSound.php create mode 100644 src/world/sound/CauldronFillPotionSound.php create mode 100644 src/world/sound/CauldronFillPowderSnowSound.php create mode 100644 src/world/sound/CauldronFillWaterSound.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 27fc92bd58..69c4d6ee67 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -694,6 +694,11 @@ final class BlockTypeIds{ public const SMITHING_TABLE = 10667; public const NETHERITE = 10668; public const SPORE_BLOSSOM = 10669; + public const CAULDRON = 10670; + public const WATER_CAULDRON = 10671; + public const LAVA_CAULDRON = 10672; + public const POTION_CAULDRON = 10673; + public const POWDER_SNOW_CAULDRON = 10674; - public const FIRST_UNUSED_BLOCK_ID = 10670; + public const FIRST_UNUSED_BLOCK_ID = 10675; } diff --git a/src/block/Cauldron.php b/src/block/Cauldron.php new file mode 100644 index 0000000000..da1a938b29 --- /dev/null +++ b/src/block/Cauldron.php @@ -0,0 +1,104 @@ +position->getWorld()->getTile($this->position); + assert($tile instanceof TileCauldron); + + //empty cauldrons don't use this information + $tile->setCustomWaterColor(null); + $tile->setPotionItem(null); + } + + protected function recalculateCollisionBoxes() : array{ + $result = [ + AxisAlignedBB::one()->trim(Facing::UP, 11 / 16) //bottom of the cauldron + ]; + + foreach(Facing::HORIZONTAL as $f){ //add the frame parts around the bowl + $result[] = AxisAlignedBB::one()->trim($f, 14 / 16); + } + return $result; + } + + public function getSupportType(int $facing) : SupportType{ + return $facing === Facing::UP ? SupportType::EDGE() : SupportType::NONE(); + } + + /** + * @param Item[] &$returnedItems + */ + private function fill(int $amount, FillableCauldron $result, Item $usedItem, Item $returnedItem, array &$returnedItems) : void{ + $this->position->getWorld()->setBlock($this->position, $result->setFillLevel($amount)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), $result->getFillSound()); + + $usedItem->pop(); + $returnedItems[] = $returnedItem; + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item->getTypeId() === ItemTypeIds::WATER_BUCKET){ + $this->fill(FillableCauldron::MAX_FILL_LEVEL, VanillaBlocks::WATER_CAULDRON(), $item, VanillaItems::BUCKET(), $returnedItems); + }elseif($item->getTypeId() === ItemTypeIds::LAVA_BUCKET){ + $this->fill(FillableCauldron::MAX_FILL_LEVEL, VanillaBlocks::LAVA_CAULDRON(), $item, VanillaItems::BUCKET(), $returnedItems); + }elseif($item->getTypeId() === ItemTypeIds::POWDER_SNOW_BUCKET){ + //TODO: powder snow cauldron + }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion + if($item->getType()->equals(PotionType::WATER())){ + $this->fill(WaterCauldron::WATER_BOTTLE_FILL_AMOUNT, VanillaBlocks::WATER_CAULDRON(), $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); + }else{ + $this->fill(PotionCauldron::POTION_FILL_AMOUNT, VanillaBlocks::POTION_CAULDRON()->setPotionItem($item), $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); + } + } + + return true; + } + + public function onNearbyBlockChange() : void{ + $world = $this->position->getWorld(); + if($world->getBlock($this->position->up())->getTypeId() === BlockTypeIds::WATER){ + $cauldron = VanillaBlocks::WATER_CAULDRON()->setFillLevel(FillableCauldron::MAX_FILL_LEVEL); + $world->setBlock($this->position, $cauldron); + $world->addSound($this->position->add(0.5, 0.5, 0.5), $cauldron->getFillSound()); + } + } +} diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php new file mode 100644 index 0000000000..acc16e5750 --- /dev/null +++ b/src/block/FillableCauldron.php @@ -0,0 +1,132 @@ +boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); + } + + public function getFillLevel() : int{ return $this->fillLevel; } + + /** @return $this */ + public function setFillLevel(int $fillLevel) : self{ + if($fillLevel < self::MIN_FILL_LEVEL || $fillLevel > self::MAX_FILL_LEVEL){ + throw new \InvalidArgumentException("Fill level must be in range " . self::MIN_FILL_LEVEL . " ... " . self::MAX_FILL_LEVEL); + } + $this->fillLevel = $fillLevel; + return $this; + } + + protected function recalculateCollisionBoxes() : array{ + $result = [ + AxisAlignedBB::one()->trim(Facing::UP, 11 / 16) //bottom of the cauldron + ]; + + foreach(Facing::HORIZONTAL as $f){ //add the frame parts around the bowl + $result[] = AxisAlignedBB::one()->trim($f, 14 / 16); + } + return $result; + } + + public function getSupportType(int $facing) : SupportType{ + return $facing === Facing::UP ? SupportType::EDGE() : SupportType::NONE(); + } + + protected function withFillLevel(int $fillLevel) : Block{ + return $fillLevel === 0 ? VanillaBlocks::CAULDRON() : $this->setFillLevel(min(self::MAX_FILL_LEVEL, $fillLevel)); + } + + /** + * @param Item[] &$returnedItems + */ + protected function addFillLevels(int $amount, Item $usedItem, Item $returnedItem, array &$returnedItems) : void{ + if($this->fillLevel >= self::MAX_FILL_LEVEL){ + return; + } + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->fillLevel + $amount)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), $this->getFillSound()); + + $usedItem->pop(); + $returnedItems[] = $returnedItem; + } + + /** + * @param Item[] &$returnedItems + */ + protected function removeFillLevels(int $amount, Item $usedItem, Item $returnedItem, array &$returnedItems) : void{ + if($this->fillLevel < $amount){ + return; + } + + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->fillLevel - $amount)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), $this->getEmptySound()); + + $usedItem->pop(); + $returnedItems[] = $returnedItem; + } + + /** + * Returns the sound played when adding levels to the cauldron liquid. + */ + abstract public function getFillSound() : Sound; + + /** + * Returns the sound played when removing levels from the cauldron liquid. + */ + abstract public function getEmptySound() : Sound; + + /** + * @param Item[] &$returnedItems + */ + protected function mix(Item $usedItem, Item $returnedItem, array &$returnedItems) : void{ + $this->position->getWorld()->setBlock($this->position, VanillaBlocks::CAULDRON()); + //TODO: sounds and particles + + $usedItem->pop(); + $returnedItems[] = $returnedItem; + } + + public function asItem() : Item{ + return VanillaBlocks::CAULDRON()->asItem(); + } +} diff --git a/src/block/LavaCauldron.php b/src/block/LavaCauldron.php new file mode 100644 index 0000000000..3df903e228 --- /dev/null +++ b/src/block/LavaCauldron.php @@ -0,0 +1,88 @@ +position->getWorld()->getTile($this->position); + assert($tile instanceof TileCauldron); + + $tile->setCustomWaterColor(null); + $tile->setPotionItem(null); + } + + public function getLightLevel() : int{ + return 15; + } + + public function getFillSound() : Sound{ + return new CauldronFillLavaSound(); + } + + public function getEmptySound() : Sound{ + return new CauldronEmptyLavaSound(); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + match($item->getTypeId()){ + ItemTypeIds::BUCKET => $this->removeFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::LAVA_BUCKET(), $returnedItems), + ItemTypeIds::POWDER_SNOW_BUCKET, ItemTypeIds::WATER_BUCKET => $this->mix($item, VanillaItems::BUCKET(), $returnedItems), + ItemTypeIds::LINGERING_POTION, ItemTypeIds::POTION, ItemTypeIds::SPLASH_POTION => $this->mix($item, VanillaItems::GLASS_BOTTLE(), $returnedItems), + default => null + }; + return true; + } + + public function hasEntityCollision() : bool{ return true; } + + public function onEntityInside(Entity $entity) : bool{ + $ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_LAVA, 4); + $entity->attack($ev); + + $ev = new EntityCombustByBlockEvent($this, $entity, 8); + $ev->call(); + if(!$ev->isCancelled()){ + $entity->setOnFire($ev->getDuration()); + } + + return true; + } +} diff --git a/src/block/PotionCauldron.php b/src/block/PotionCauldron.php new file mode 100644 index 0000000000..d0bcf2af5d --- /dev/null +++ b/src/block/PotionCauldron.php @@ -0,0 +1,108 @@ +position->getWorld()->getTile($this->position); + $this->potionItem = $tile instanceof TileCauldron ? $tile->getPotionItem() : null; + + return $this; + } + + public function writeStateToWorld() : void{ + parent::writeStateToWorld(); + $tile = $this->position->getWorld()->getTile($this->position); + assert($tile instanceof TileCauldron); + $tile->setCustomWaterColor(null); + $tile->setPotionItem($this->potionItem); + } + + public function getPotionItem() : ?Item{ return $this->potionItem === null ? null : clone $this->potionItem; } + + /** @return $this */ + public function setPotionItem(?Item $potionItem) : self{ + $this->potionItem = $potionItem !== null ? (clone $potionItem)->setCount(1) : null; + return $this; + } + + public function getFillSound() : Sound{ + return new CauldronFillPotionSound(); + } + + public function getEmptySound() : Sound{ + return new CauldronEmptyPotionSound(); + } + + /** + * @param Item[] &$returnedItems + */ + protected function addFillLevelsOrMix(int $amount, Item $usedItem, Item $returnedItem, array &$returnedItems) : void{ + if($this->potionItem !== null && !$usedItem->equals($this->potionItem, true, false)){ + $this->mix($usedItem, $returnedItem, $returnedItems); + }else{ + $this->addFillLevels($amount, $usedItem, $returnedItem, $returnedItems); + } + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + match($item->getTypeId()){ + ItemTypeIds::LINGERING_POTION, ItemTypeIds::POTION, ItemTypeIds::SPLASH_POTION => $this->addFillLevelsOrMix(self::POTION_FILL_AMOUNT, $item, VanillaItems::GLASS_BOTTLE(), $returnedItems), + ItemTypeIds::GLASS_BOTTLE => $this->potionItem === null ? null : $this->removeFillLevels(self::POTION_FILL_AMOUNT, $item, clone $this->potionItem, $returnedItems), + ItemTypeIds::LAVA_BUCKET, ItemTypeIds::POWDER_SNOW_BUCKET, ItemTypeIds::WATER_BUCKET => $this->mix($item, VanillaItems::BUCKET(), $returnedItems), + //TODO: tipped arrows + default => null + }; + return true; + } + + public function onNearbyBlockChange() : void{ + $world = $this->position->getWorld(); + if($world->getBlock($this->position->up())->getTypeId() === BlockTypeIds::WATER){ + $cauldron = VanillaBlocks::WATER_CAULDRON()->setFillLevel(FillableCauldron::MAX_FILL_LEVEL); + $world->setBlock($this->position, $cauldron); + $world->addSound($this->position->add(0.5, 0.5, 0.5), $cauldron->getFillSound()); + } + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 679e51553f..a900cabe5b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -34,6 +34,7 @@ use pocketmine\block\tile\Bed as TileBed; use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\tile\BlastFurnace as TileBlastFurnace; use pocketmine\block\tile\BrewingStand as TileBrewingStand; +use pocketmine\block\tile\Cauldron as TileCauldron; use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\Comparator as TileComparator; use pocketmine\block\tile\DaylightSensor as TileDaylightSensor; @@ -143,6 +144,7 @@ use function mb_strtolower; * @method static Carrot CARROTS() * @method static CartographyTable CARTOGRAPHY_TABLE() * @method static CarvedPumpkin CARVED_PUMPKIN() + * @method static Cauldron CAULDRON() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() * @method static Opaque CHISELED_DEEPSLATE() @@ -453,6 +455,7 @@ use function mb_strtolower; * @method static LapisOre LAPIS_LAZULI_ORE() * @method static DoubleTallGrass LARGE_FERN() * @method static Lava LAVA() + * @method static LavaCauldron LAVA_CAULDRON() * @method static Lectern LECTERN() * @method static Opaque LEGACY_STONECUTTER() * @method static Lever LEVER() @@ -558,6 +561,7 @@ use function mb_strtolower; * @method static Stair POLISHED_GRANITE_STAIRS() * @method static Flower POPPY() * @method static Potato POTATOES() + * @method static PotionCauldron POTION_CAULDRON() * @method static PoweredRail POWERED_RAIL() * @method static Opaque PRISMARINE() * @method static Opaque PRISMARINE_BRICKS() @@ -697,6 +701,7 @@ use function mb_strtolower; * @method static WallSign WARPED_WALL_SIGN() * @method static Opaque WARPED_WART_BLOCK() * @method static Water WATER() + * @method static WaterCauldron WATER_CAULDRON() * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() * @method static Wheat WHEAT() @@ -1166,6 +1171,7 @@ final class VanillaBlocks{ self::registerCraftingTables(); self::registerOres(); self::registerWoodenBlocks(); + self::registerCauldronBlocks(); } private static function registerWoodenBlocks() : void{ @@ -1513,4 +1519,12 @@ final class VanillaBlocks{ self::register("mud_brick_wall", new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); } + private static function registerCauldronBlocks() : void{ + $cauldronBreakInfo = new BreakInfo(2, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + + self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); + self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); + self::register("lava_cauldron", new LavaCauldron(new BID(Ids::LAVA_CAULDRON, TileCauldron::class), "Lava Cauldron", $cauldronBreakInfo)); + self::register("potion_cauldron", new PotionCauldron(new BID(Ids::POTION_CAULDRON, TileCauldron::class), "Potion Cauldron", $cauldronBreakInfo)); + } } diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php new file mode 100644 index 0000000000..f346ac4a0c --- /dev/null +++ b/src/block/WaterCauldron.php @@ -0,0 +1,209 @@ +position->getWorld()->getTile($this->position); + + $potionItem = $tile instanceof TileCauldron ? $tile->getPotionItem() : null; + if($potionItem !== null){ + //TODO: HACK! we keep potion cauldrons as a separate block type due to different behaviour, but in the + //blockstate they are typically indistinguishable from water cauldrons. This hack converts cauldrons into + //their appropriate type. + return VanillaBlocks::POTION_CAULDRON()->setFillLevel($this->getFillLevel())->setPotionItem($potionItem); + } + + $this->customWaterColor = $tile instanceof TileCauldron ? $tile->getCustomWaterColor() : null; + + return $this; + } + + public function writeStateToWorld() : void{ + parent::writeStateToWorld(); + $tile = $this->position->getWorld()->getTile($this->position); + assert($tile instanceof TileCauldron); + $tile->setCustomWaterColor($this->customWaterColor); + $tile->setPotionItem(null); + } + + /** @return Color|null */ + public function getCustomWaterColor() : ?Color{ return $this->customWaterColor; } + + /** @return $this */ + public function setCustomWaterColor(?Color $customWaterColor) : self{ + $this->customWaterColor = $customWaterColor; + return $this; + } + + public function getFillSound() : Sound{ + return new CauldronFillWaterSound(); + } + + public function getEmptySound() : Sound{ + return new CauldronEmptyWaterSound(); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if(($newColor = match($item->getTypeId()){ + ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE()->getRgbValue(), + ItemTypeIds::INK_SAC => DyeColor::BLACK()->getRgbValue(), + ItemTypeIds::COCOA_BEANS => DyeColor::BROWN()->getRgbValue(), + ItemTypeIds::BONE_MEAL => DyeColor::WHITE()->getRgbValue(), + ItemTypeIds::DYE => $item instanceof Dye ? $item->getColor()->getRgbValue() : null, + default => null + }) !== null && $newColor->toRGBA() !== $this->customWaterColor?->toRGBA() + ){ + $this->position->getWorld()->setBlock($this->position, $this->setCustomWaterColor($this->customWaterColor === null ? $newColor : Color::mix($this->customWaterColor, $newColor))); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronAddDyeSound()); + + $item->pop(); + }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion + if($item->getType()->equals(PotionType::WATER())){ + $this->addFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); + }else{ + $this->mix($item, VanillaItems::GLASS_BOTTLE(), $returnedItems); + } + }elseif($item instanceof Armor){ + if($this->customWaterColor !== null){ + if(match($item->getTypeId()){ //TODO: a DyeableArmor class would probably be a better idea, since not all types of armor are dyeable + ItemTypeIds::LEATHER_CAP, + ItemTypeIds::LEATHER_TUNIC, + ItemTypeIds::LEATHER_PANTS, + ItemTypeIds::LEATHER_BOOTS => true, + default => false + } && $item->getCustomColor()?->toRGBA() !== $this->customWaterColor->toRGBA()){ + $item->setCustomColor($this->customWaterColor); + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::DYE_ARMOR_USE_AMOUNT)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronDyeItemSound()); + } + }elseif($item->getCustomColor() !== null){ + $item->clearCustomColor(); + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_ARMOR_USE_AMOUNT)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + } + }elseif($item instanceof Banner){ + $patterns = $item->getPatterns(); + if(count($patterns) > 0 && $this->customWaterColor === null){ + array_pop($patterns); + $item->setPatterns($patterns); + + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_BANNER_USE_AMOUNT)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + } + }elseif($item instanceof ItemBlock && $item->getBlock()->getTypeId() === BlockTypeIds::DYED_SHULKER_BOX){ + if($this->customWaterColor === null){ + $newItem = VanillaBlocks::SHULKER_BOX()->asItem(); + $newItem->setNamedTag($item->getNamedTag()); + + $item->pop(); + $returnedItems[] = $newItem; + + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_SHULKER_BOX_USE_AMOUNT)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + } + }else{ + match($item->getTypeId()){ + ItemTypeIds::WATER_BUCKET => $this->addFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::BUCKET(), $returnedItems), + ItemTypeIds::BUCKET => $this->removeFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::WATER_BUCKET(), $returnedItems), + ItemTypeIds::GLASS_BOTTLE => $this->removeFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::POTION()->setType(PotionType::WATER()), $returnedItems), + ItemTypeIds::LAVA_BUCKET, ItemTypeIds::POWDER_SNOW_BUCKET => $this->mix($item, VanillaItems::BUCKET(), $returnedItems), + default => null + }; + } + + return true; + } + + public function hasEntityCollision() : bool{ return true; } + + public function onEntityInside(Entity $entity) : bool{ + if($entity->isOnFire()){ + $entity->extinguish(); + //TODO: particles + + $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::ENTITY_EXTINGUISH_USE_AMOUNT)); + } + + return true; + } + + public function onNearbyBlockChange() : void{ + $hasCustomWaterColor = $this->customWaterColor !== null; + if($this->getFillLevel() < self::MAX_FILL_LEVEL || $hasCustomWaterColor){ + $world = $this->position->getWorld(); + if($world->getBlock($this->position->up())->getTypeId() === BlockTypeIds::WATER){ + if($hasCustomWaterColor){ + //TODO: particles + } + $world->setBlock($this->position, $this->setCustomWaterColor(null)->setFillLevel(FillableCauldron::MAX_FILL_LEVEL)); + $world->addSound($this->position->add(0.5, 0.5, 0.5), $this->getFillSound()); + } + } + } +} diff --git a/src/block/tile/Cauldron.php b/src/block/tile/Cauldron.php new file mode 100644 index 0000000000..d10f97e149 --- /dev/null +++ b/src/block/tile/Cauldron.php @@ -0,0 +1,135 @@ +potionItem; } + + public function setPotionItem(?Item $potionItem) : void{ + $this->potionItem = $potionItem; + } + + public function getCustomWaterColor() : ?Color{ return $this->customWaterColor; } + + public function setCustomWaterColor(?Color $customWaterColor) : void{ + $this->customWaterColor = $customWaterColor; + } + + protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ + $nbt->setShort(self::TAG_POTION_CONTAINER_TYPE, match($this->potionItem?->getTypeId()){ + ItemTypeIds::POTION => self::POTION_CONTAINER_TYPE_NORMAL, + ItemTypeIds::SPLASH_POTION => self::POTION_CONTAINER_TYPE_SPLASH, + ItemTypeIds::LINGERING_POTION => self::POTION_CONTAINER_TYPE_LINGERING, + null => self::POTION_CONTAINER_TYPE_NONE, + default => throw new AssumptionFailedError("Unexpected potion item type") + }); + + //TODO: lingering potion + $type = $this->potionItem instanceof Potion || $this->potionItem instanceof SplashPotion ? $this->potionItem->getType() : null; + $nbt->setShort(self::TAG_POTION_ID, $type === null ? self::POTION_ID_NONE : PotionTypeIdMap::getInstance()->toId($type)); + + if($this->customWaterColor !== null){ + $nbt->setInt(self::TAG_CUSTOM_COLOR, Binary::signInt($this->customWaterColor->toARGB())); + } + } + + public function readSaveData(CompoundTag $nbt) : void{ + $containerType = $nbt->getShort(self::TAG_POTION_CONTAINER_TYPE, self::POTION_CONTAINER_TYPE_NONE); + $potionId = $nbt->getShort(self::TAG_POTION_ID, self::POTION_ID_NONE); + if($containerType !== self::POTION_CONTAINER_TYPE_NONE && $potionId !== self::POTION_ID_NONE){ + $potionType = PotionTypeIdMap::getInstance()->fromId($potionId); + if($potionType === null){ + throw new SavedDataLoadingException("Unknown potion type ID $potionId"); + } + $this->potionItem = match($containerType){ + self::POTION_CONTAINER_TYPE_NORMAL => VanillaItems::POTION()->setType($potionType), + self::POTION_CONTAINER_TYPE_SPLASH => VanillaItems::SPLASH_POTION()->setType($potionType), + self::POTION_CONTAINER_TYPE_LINGERING => throw new SavedDataLoadingException("Not implemented"), + default => throw new SavedDataLoadingException("Invalid potion container type ID $containerType") + }; + }else{ + $this->potionItem = null; + } + + $this->customWaterColor = ($customColorTag = $nbt->getTag(self::TAG_CUSTOM_COLOR)) instanceof IntTag ? Color::fromARGB(Binary::unsignInt($customColorTag->getValue())) : null; + } + + protected function writeSaveData(CompoundTag $nbt) : void{ + $nbt->setShort(self::TAG_POTION_CONTAINER_TYPE, match($this->potionItem?->getTypeId()){ + ItemTypeIds::POTION => self::POTION_CONTAINER_TYPE_NORMAL, + ItemTypeIds::SPLASH_POTION => self::POTION_CONTAINER_TYPE_SPLASH, + ItemTypeIds::LINGERING_POTION => self::POTION_CONTAINER_TYPE_LINGERING, + null => self::POTION_CONTAINER_TYPE_NONE, + default => throw new AssumptionFailedError("Unexpected potion item type") + }); + + //TODO: lingering potion + $type = $this->potionItem instanceof Potion || $this->potionItem instanceof SplashPotion ? $this->potionItem->getType() : null; + $nbt->setShort(self::TAG_POTION_ID, $type === null ? self::POTION_ID_NONE : PotionTypeIdMap::getInstance()->toId($type)); + + if($this->customWaterColor !== null){ + $nbt->setInt(self::TAG_CUSTOM_COLOR, Binary::signInt($this->customWaterColor->toARGB())); + } + } + + public function getRenderUpdateBugWorkaroundStateProperties(Block $block) : array{ + if($block instanceof FillableCauldron){ + $realFillLevel = $block->getFillLevel(); + return [BlockStateNames::FILL_LEVEL => new IntTag($realFillLevel === FillableCauldron::MAX_FILL_LEVEL ? FillableCauldron::MIN_FILL_LEVEL : $realFillLevel + 1)]; + } + + return []; + } +} diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index d321c47547..4a9c738726 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -57,6 +57,7 @@ final class TileFactory{ $this->register(Bell::class, ["Bell", "minecraft:bell"]); $this->register(BlastFurnace::class, ["BlastFurnace", "minecraft:blast_furnace"]); $this->register(BrewingStand::class, ["BrewingStand", "minecraft:brewing_stand"]); + $this->register(Cauldron::class, ["Cauldron", "minecraft:cauldron"]); $this->register(Chest::class, ["Chest", "minecraft:chest"]); $this->register(Comparator::class, ["Comparator", "minecraft:comparator"]); $this->register(DaylightSensor::class, ["DaylightDetector", "minecraft:daylight_detector"]); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 27b620ee01..cba222dab4 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -68,6 +68,7 @@ use pocketmine\block\EndPortalFrame; use pocketmine\block\EndRod; use pocketmine\block\Farmland; use pocketmine\block\FenceGate; +use pocketmine\block\FillableCauldron; use pocketmine\block\Fire; use pocketmine\block\FloorBanner; use pocketmine\block\FloorCoralFan; @@ -176,6 +177,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ public function __construct(){ $this->registerCandleSerializers(); + $this->registerCauldronSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); } @@ -292,6 +294,14 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ })->writeBool(StateNames::LIT, $block->isLit())); } + private function registerCauldronSerializers() : void{ + $this->map(Blocks::CAULDRON(), fn() => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, 0, new Writer(Ids::CAULDRON))); + $this->map(Blocks::LAVA_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_LAVA, $b->getFillLevel(), new Writer(Ids::LAVA_CAULDRON))); + //potion cauldrons store their real information in the block actor data + $this->map(Blocks::POTION_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel(), new Writer(Ids::CAULDRON))); + $this->map(Blocks::WATER_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel(), new Writer(Ids::CAULDRON))); + } + private function registerSimpleSerializers() : void{ $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index cd16b45b79..c87b64788f 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -91,6 +91,12 @@ final class BlockStateSerializerHelper{ ->writeTorchFacing($block->getFacing()); } + public static function encodeCauldron(string $liquid, int $fillLevel, BlockStateWriter $out) : BlockStateWriter{ + return $out + ->writeString(BlockStateNames::CAULDRON_LIQUID, $liquid) + ->writeInt(BlockStateNames::FILL_LEVEL, $fillLevel); + } + public static function selectCopperId(CopperOxidation $oxidation, string $noneId, string $exposedId, string $weatheredId, string $oxidizedId) : string{ return match($oxidation){ CopperOxidation::NONE() => $noneId, diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index fb689c2948..765a5ae1d9 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -60,6 +60,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize public function __construct(){ $this->registerCandleDeserializers(); + $this->registerCauldronDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -136,6 +137,25 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::YELLOW_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::YELLOW())); } + private function registerCauldronDeserializers() : void{ + $deserializer = function(Reader $in) : Block{ + $level = $in->readBoundedInt(StateNames::FILL_LEVEL, 0, 6); + if($level === 0){ + $in->ignored(StateNames::CAULDRON_LIQUID); + return Blocks::CAULDRON(); + } + + return (match($liquid = $in->readString(StateNames::CAULDRON_LIQUID)){ + StringValues::CAULDRON_LIQUID_WATER => Blocks::WATER_CAULDRON(), + StringValues::CAULDRON_LIQUID_LAVA => Blocks::LAVA_CAULDRON(), + StringValues::CAULDRON_LIQUID_POWDER_SNOW => throw new UnsupportedBlockStateException("Powder snow is not supported yet"), + default => throw $in->badValueException(StateNames::CAULDRON_LIQUID, $liquid) + })->setFillLevel($level); + }; + $this->map(Ids::CAULDRON, $deserializer); + $this->map(Ids::LAVA_CAULDRON, $deserializer); + } + private function registerSimpleDeserializers() : void{ $this->map(Ids::AIR, fn() => Blocks::AIR()); $this->map(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index dfa463bc8b..85d415d6ab 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -198,7 +198,7 @@ final class ItemDeserializer{ $this->map(Ids::CARROT, fn() => Items::CARROT()); //TODO: minecraft:carrot_on_a_stick //TODO: minecraft:cat_spawn_egg - //TODO: minecraft:cauldron + $this->map(Ids::CAULDRON, fn() => Blocks::CAULDRON()->asItem()); //TODO: minecraft:cave_spider_spawn_egg //TODO: minecraft:chain $this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS()); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index b652d3a3a3..0c993f2e6a 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -229,6 +229,7 @@ final class ItemSerializer{ $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); $this->mapBlock(Blocks::BREWING_STAND(), self::id(Ids::BREWING_STAND)); $this->mapBlock(Blocks::CAKE(), self::id(Ids::CAKE)); + $this->mapBlock(Blocks::CAULDRON(), self::id(Ids::CAULDRON)); $this->mapBlock(Blocks::CRIMSON_DOOR(), self::id(Ids::CRIMSON_DOOR)); $this->mapBlock(Blocks::DARK_OAK_DOOR(), self::id(Ids::DARK_OAK_DOOR)); $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index ff6ef0a046..d82f236421 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -294,6 +294,8 @@ final class ItemTypeIds{ public const RAW_GOLD = 20255; public const SPYGLASS = 20256; public const NETHERITE_SCRAP = 20257; + public const POWDER_SNOW_BUCKET = 20258; + public const LINGERING_POTION = 20259; - public const FIRST_UNUSED_ITEM_ID = 20258; + public const FIRST_UNUSED_ITEM_ID = 20260; } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 2a8b9d1076..0b41a78264 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -197,6 +197,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("carrot_block", fn() => Blocks::CARROTS()); $result->registerBlock("carrots", fn() => Blocks::CARROTS()); $result->registerBlock("carved_pumpkin", fn() => Blocks::CARVED_PUMPKIN()); + $result->registerBlock("cauldron", fn() => Blocks::CAULDRON()); $result->registerBlock("chemical_heat", fn() => Blocks::CHEMICAL_HEAT()); $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); diff --git a/src/world/sound/CauldronAddDyeSound.php b/src/world/sound/CauldronAddDyeSound.php new file mode 100644 index 0000000000..2a427959ee --- /dev/null +++ b/src/world/sound/CauldronAddDyeSound.php @@ -0,0 +1,35 @@ +getMessage()); } + if($block->getTypeId() === BlockTypeIds::POTION_CAULDRON){ + //this pretends to be a water cauldron in the blockstate, and stores its actual data in the blockentity + continue; + } + //The following are workarounds for differences in blockstate representation in Bedrock vs PM //In these cases, some properties are not stored in the blockstate (but rather in the block entity NBT), but //they do form part of the internal blockstate hash in PM. This leads to inconsistencies when serializing From 67682cbf27ba40176af16e836d31d96131ebb118 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Jul 2022 20:19:36 +0100 Subject: [PATCH 0364/1858] Added chorus plant and flower --- src/block/BlockTypeIds.php | 4 +- src/block/ChorusFlower.php | 236 ++++++++++++++++++ src/block/ChorusPlant.php | 102 ++++++++ src/block/VanillaBlocks.php | 9 + .../BlockObjectToBlockStateSerializer.php | 6 + .../BlockStateToBlockObjectDeserializer.php | 6 + src/item/StringToItemParser.php | 2 + src/world/sound/ChorusFlowerDieSound.php | 35 +++ src/world/sound/ChorusFlowerGrowSound.php | 35 +++ .../block_factory_consistency_check.json | 2 +- 10 files changed, 435 insertions(+), 2 deletions(-) create mode 100644 src/block/ChorusFlower.php create mode 100644 src/block/ChorusPlant.php create mode 100644 src/world/sound/ChorusFlowerDieSound.php create mode 100644 src/world/sound/ChorusFlowerGrowSound.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 69c4d6ee67..cf84b2a601 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -699,6 +699,8 @@ final class BlockTypeIds{ public const LAVA_CAULDRON = 10672; public const POTION_CAULDRON = 10673; public const POWDER_SNOW_CAULDRON = 10674; + public const CHORUS_FLOWER = 10675; + public const CHORUS_PLANT = 10676; - public const FIRST_UNUSED_BLOCK_ID = 10675; + public const FIRST_UNUSED_BLOCK_ID = 10676; } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php new file mode 100644 index 0000000000..2a0c9ac029 --- /dev/null +++ b/src/block/ChorusFlower.php @@ -0,0 +1,236 @@ +boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); + } + + public function getAge() : int{ return $this->age; } + + /** @return $this */ + public function setAge(int $age) : self{ + if($age < self::MIN_AGE || $age > self::MAX_AGE){ + throw new \InvalidArgumentException("Age must be in the range " . self::MIN_AGE . " ... " . self::MAX_AGE); + } + $this->age = $age; + return $this; + } + + protected function recalculateCollisionBoxes() : array{ + return [AxisAlignedBB::one()]; + } + + private function canBeSupportedAt(Position $position) : bool{ + $world = $position->getWorld(); + $down = $world->getBlock($position->down()); + + if($down->getTypeId() === BlockTypeIds::END_STONE || $down->getTypeId() === BlockTypeIds::CHORUS_PLANT){ + return true; + } + + $plantAdjacent = false; + foreach($position->sidesAroundAxis(Axis::Y) as $sidePosition){ + $block = $world->getBlock($sidePosition); + + if($block->getTypeId() === BlockTypeIds::CHORUS_PLANT){ + if($plantAdjacent){ //at most one plant may be horizontally adjacent + return false; + } + $plantAdjacent = true; + }elseif($block->getTypeId() !== BlockTypeIds::AIR){ + return false; + } + } + + return $plantAdjacent; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedAt($blockReplace->getPosition())){ + return false; + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedAt($this->position)){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + $this->position->getWorld()->useBreakOn($this->position); + } + + public function ticksRandomly() : bool{ return $this->age < self::MAX_AGE; } + + /** + * @phpstan-return array{int, bool} + */ + private function scanStem() : array{ + $world = $this->position->getWorld(); + + $stemHeight = 0; + $endStoneBelow = false; + for($yOffset = 0; $yOffset < self::MAX_STEM_HEIGHT; $yOffset++, $stemHeight++){ + $down = $world->getBlock($this->position->down($yOffset + 1)); + + if($down->getTypeId() !== BlockTypeIds::CHORUS_PLANT){ + if($down->getTypeId() === BlockTypeIds::END_STONE){ + $endStoneBelow = true; + } + break; + } + } + + return [$stemHeight, $endStoneBelow]; + } + + private function allHorizontalBlocksEmpty(World $world, Vector3 $position, ?int $except) : bool{ + foreach($position->sidesAroundAxis(Axis::Y) as $facing => $sidePosition){ + if($facing === $except){ + continue; + } + if($world->getBlock($sidePosition)->getTypeId() !== BlockTypeIds::AIR){ + return false; + } + } + + return true; + } + + private function canGrowUpwards(int $stemHeight, bool $endStoneBelow) : bool{ + $world = $this->position->getWorld(); + + $up = $this->position->up(); + if( + //the space above must be empty and writable + !$world->isInWorld($up->x, $up->y, $up->z) || + $world->getBlock($up)->getTypeId() !== BlockTypeIds::AIR || + ( + //the space above that must be empty, but doesn't need to be writable + $world->isInWorld($up->x, $up->y + 1, $up->z) && + $world->getBlock($up->up())->getTypeId() !== BlockTypeIds::AIR + ) + ){ + return false; + } + + if($this->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::AIR){ + if($stemHeight >= self::MAX_STEM_HEIGHT){ + return false; + } + + if($stemHeight > 1 && $stemHeight > mt_rand(0, $endStoneBelow ? 4 : 3)){ //chance decreases for each added block of chorus plant + return false; + } + } + + return $this->allHorizontalBlocksEmpty($world, $up, null); + } + + private function grow(int $facing, int $ageChange, ?BlockTransaction $tx) : BlockTransaction{ + if($tx === null){ + $tx = new BlockTransaction($this->position->getWorld()); + } + $tx->addBlock($this->position->getSide($facing), (clone $this)->setAge($this->getAge() + $ageChange)); + + return $tx; + } + + public function onRandomTick() : void{ + $world = $this->position->getWorld(); + + if($this->age >= self::MAX_AGE){ + return; + } + + $tx = null; + + [$stemHeight, $endStoneBelow] = $this->scanStem(); + if($this->canGrowUpwards($stemHeight, $endStoneBelow)){ + $tx = $this->grow(Facing::UP, 0, $tx); + }else{ + $facingVisited = []; + for($attempts = 0, $maxAttempts = mt_rand(0, $endStoneBelow ? 4 : 3); $attempts < $maxAttempts; $attempts++){ + $facing = Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]; + if(isset($facingVisited[$facing])){ + continue; + } + $facingVisited[$facing] = true; + + $sidePosition = $this->position->getSide($facing); + if( + $world->getBlock($sidePosition)->getTypeId() === BlockTypeIds::AIR && + $world->getBlock($sidePosition->down())->getTypeId() === BlockTypeIds::AIR && + $this->allHorizontalBlocksEmpty($world, $sidePosition, Facing::opposite($facing)) + ){ + $tx = $this->grow($facing, 1, $tx); + } + } + } + + if($tx !== null){ + $tx->addBlock($this->position, VanillaBlocks::CHORUS_PLANT()); + $ev = new StructureGrowEvent($this, $tx, null); + $ev->call(); + if(!$ev->isCancelled() && $tx->apply()){ + $world->addSound($this->position->add(0.5, 0.5, 0.5), new ChorusFlowerGrowSound()); + } + }else{ + $world->addSound($this->position->add(0.5, 0.5, 0.5), new ChorusFlowerDieSound()); + $this->position->getWorld()->setBlock($this->position, $this->setAge(self::MAX_AGE)); + } + } +} diff --git a/src/block/ChorusPlant.php b/src/block/ChorusPlant.php new file mode 100644 index 0000000000..ebc5308eeb --- /dev/null +++ b/src/block/ChorusPlant.php @@ -0,0 +1,102 @@ +getAllSides() as $facing => $block){ + $id = $block->getTypeId(); + if($id !== BlockTypeIds::END_STONE && $id !== BlockTypeIds::CHORUS_FLOWER && !$block->isSameType($this)){ + $bb->trim($facing, 2 / 16); + } + } + + return [$bb]; + } + + private function canBeSupportedBy(Block $block) : bool{ + return $block->isSameType($this) || $block->getTypeId() === BlockTypeIds::END_STONE; + } + + private function canStay(Position $position) : bool{ + $world = $position->getWorld(); + + $down = $world->getBlock($position->down()); + $verticalAir = $down->getTypeId() === BlockTypeIds::AIR || $world->getBlock($position->up())->getTypeId() === BlockTypeIds::AIR; + + foreach($position->sidesAroundAxis(Axis::Y) as $sidePosition){ + $block = $world->getBlock($sidePosition); + + if($block->getTypeId() === BlockTypeIds::CHORUS_PLANT){ + if(!$verticalAir){ + return false; + } + + if($this->canBeSupportedBy($block->getSide(Facing::DOWN))){ + return true; + } + } + } + + if($this->canBeSupportedBy($down)){ + return true; + } + + return false; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canStay($blockReplace->getPosition())){ + return false; + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canStay($this->position)){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function getDropsForCompatibleTool(Item $item) : array{ + if(mt_rand(0, 1) === 1){ + return [VanillaItems::CHORUS_FRUIT()]; + } + + return []; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a900cabe5b..830c59b1b3 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -154,6 +154,8 @@ use function mb_strtolower; * @method static Opaque CHISELED_RED_SANDSTONE() * @method static Opaque CHISELED_SANDSTONE() * @method static Opaque CHISELED_STONE_BRICKS() + * @method static ChorusFlower CHORUS_FLOWER() + * @method static ChorusPlant CHORUS_PLANT() * @method static Clay CLAY() * @method static Coal COAL() * @method static CoalOre COAL_ORE() @@ -1169,6 +1171,7 @@ final class VanillaBlocks{ self::registerMudBlocks(); self::registerCraftingTables(); + self::registerChorusBlocks(); self::registerOres(); self::registerWoodenBlocks(); self::registerCauldronBlocks(); @@ -1375,6 +1378,12 @@ final class VanillaBlocks{ self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); } + private static function registerChorusBlocks() : void{ + $chorusBlockBreakInfo = new BreakInfo(0.4, ToolType::AXE); + self::register("chorus_plant", new ChorusPlant(new BID(Ids::CHORUS_PLANT), "Chorus Plant", $chorusBlockBreakInfo)); + self::register("chorus_flower", new ChorusFlower(new BID(Ids::CHORUS_FLOWER), "Chorus Flower", $chorusBlockBreakInfo)); + } + private static function registerBlocksR13() : void{ self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", BreakInfo::instant())); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index cba222dab4..7a95c70581 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -47,6 +47,7 @@ use pocketmine\block\Carrot; use pocketmine\block\CarvedPumpkin; use pocketmine\block\ChemistryTable; use pocketmine\block\Chest; +use pocketmine\block\ChorusFlower; use pocketmine\block\CocoaBlock; use pocketmine\block\Concrete; use pocketmine\block\ConcretePowder; @@ -319,6 +320,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CHISELED_DEEPSLATE(), Ids::CHISELED_DEEPSLATE); $this->mapSimple(Blocks::CHISELED_NETHER_BRICKS(), Ids::CHISELED_NETHER_BRICKS); $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); + $this->mapSimple(Blocks::CHORUS_PLANT(), Ids::CHORUS_PLANT); $this->mapSimple(Blocks::CLAY(), Ids::CLAY); $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); $this->mapSimple(Blocks::COAL_ORE(), Ids::COAL_ORE); @@ -704,6 +706,10 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); + $this->map(Blocks::CHORUS_FLOWER(), function(ChorusFlower $block) : Writer{ + return Writer::create(Ids::CHORUS_FLOWER) + ->writeInt(StateNames::AGE, $block->getAge()); + }); $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 765a5ae1d9..77ac319beb 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; +use pocketmine\block\ChorusFlower; use pocketmine\block\Light; use pocketmine\block\Slab; use pocketmine\block\Stair; @@ -173,6 +174,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); $this->map(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); $this->map(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); + $this->map(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT()); $this->map(Ids::CLAY, fn() => Blocks::CLAY()); $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); @@ -537,6 +539,10 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize return Blocks::CHEST() ->setFacing($in->readHorizontalFacing()); }); + $this->map(Ids::CHORUS_FLOWER, function(Reader $in) : Block{ + return Blocks::CHORUS_FLOWER() + ->setAge($in->readBoundedInt(StateNames::AGE, ChorusFlower::MIN_AGE, ChorusFlower::MAX_AGE)); + }); $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 0b41a78264..eab33700a8 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -209,6 +209,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("chiseled_red_sandstone", fn() => Blocks::CHISELED_RED_SANDSTONE()); $result->registerBlock("chiseled_sandstone", fn() => Blocks::CHISELED_SANDSTONE()); $result->registerBlock("chiseled_stone_bricks", fn() => Blocks::CHISELED_STONE_BRICKS()); + $result->registerBlock("chorus_flower", fn() => Blocks::CHORUS_FLOWER()); + $result->registerBlock("chorus_plant", fn() => Blocks::CHORUS_PLANT()); $result->registerBlock("clay_block", fn() => Blocks::CLAY()); $result->registerBlock("coal_block", fn() => Blocks::COAL()); $result->registerBlock("coal_ore", fn() => Blocks::COAL_ORE()); diff --git a/src/world/sound/ChorusFlowerDieSound.php b/src/world/sound/ChorusFlowerDieSound.php new file mode 100644 index 0000000000..c91bdf9eda --- /dev/null +++ b/src/world/sound/ChorusFlowerDieSound.php @@ -0,0 +1,35 @@ + Date: Wed, 20 Jul 2022 20:20:14 +0100 Subject: [PATCH 0365/1858] LegacyStringToItemParser: special-case air, which the item deserializer doesn't recognize --- src/item/LegacyStringToItemParser.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index 12c10f874d..f8a14dde06 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -118,7 +118,13 @@ final class LegacyStringToItemParser{ throw new LegacyStringToItemParserException("Unable to parse \"" . $b[1] . "\" from \"" . $input . "\" as a valid meta value"); } - $legacyId = $this->map[strtolower($b[0])] ?? null; + $lower = strtolower($b[0]); + if($lower === "0" || $lower === "air"){ + //item deserializer doesn't recognize air items since they aren't supposed to exist + return VanillaItems::AIR(); + } + + $legacyId = $this->map[$lower] ?? null; if($legacyId === null){ throw new LegacyStringToItemParserException("Unable to resolve \"" . $input . "\" to a valid item"); } From 2d2df22ee7902ce9283de22ffeae5d6a80d50907 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Jul 2022 20:47:34 +0100 Subject: [PATCH 0366/1858] Ignore some PHPStan errors --- tests/phpstan/configs/actual-problems.neon | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 2306d422b4..c3b0b6b479 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -105,6 +105,21 @@ parameters: count: 1 path: ../../../src/block/Cactus.php + - + message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" + count: 2 + path: ../../../src/block/ChorusFlower.php + + - + message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" + count: 2 + path: ../../../src/block/ChorusFlower.php + + - + message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" + count: 2 + path: ../../../src/block/ChorusFlower.php + - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getRealBlockSkyLightAt\\(\\) expects int, float\\|int given\\.$#" count: 1 From bedf79e2cda63a6a7f14348f1aa3eae92a79c388 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Jul 2022 16:12:27 +0100 Subject: [PATCH 0367/1858] BaseWorldProvider: don't crash the server when encountering an unknown block --- src/world/format/io/BaseWorldProvider.php | 13 +++++++++---- src/world/format/io/GlobalBlockStateHandlers.php | 7 +++++++ src/world/format/io/leveldb/LevelDB.php | 5 +---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index dc9f296fb7..cd1cc9b5f4 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io; -use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\BlockTypeNames; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\format\PalettedBlockArray; @@ -62,10 +61,16 @@ abstract class BaseWorldProvider implements WorldProvider{ $newStateData = $blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); if($newStateData === null){ //TODO: remember data for unknown states so we can implement them later - $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); + $newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData(); } - $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); + try{ + $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); + }catch(BlockStateDeserializeException){ + //TODO: this needs to be logged + //TODO: maybe we can remember unknown states for later saving instead of discarding them and destroying maps... + $newPalette[$k] = $blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); + } } //TODO: this is sub-optimal since it reallocates the offset table multiple times diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 2ba979a66e..195b9337a1 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\BlockStateSerializer; +use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\data\bedrock\block\CachingBlockStateDeserializer; use pocketmine\data\bedrock\block\CachingBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; @@ -54,6 +55,8 @@ final class GlobalBlockStateHandlers{ private static ?BlockDataUpgrader $blockDataUpgrader = null; + private static ?BlockStateData $unknownBlockStateData = null; + public static function getDeserializer() : BlockStateDeserializer{ return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer(new BlockStateToBlockObjectDeserializer()); } @@ -83,4 +86,8 @@ final class GlobalBlockStateHandlers{ return self::$blockDataUpgrader; } + + public static function getUnknownBlockStateData() : BlockStateData{ + return self::$unknownBlockStateData ??= new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); + } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 92e2fa8533..4d8794e31e 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -26,9 +26,7 @@ namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; -use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializeException; -use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; @@ -178,9 +176,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $palette[] = $blockStateDeserializer->deserialize($blockStateData); }catch(BlockStateDeserializeException){ //TODO: remember data for unknown states so we can implement them later - //TODO: this is slow; we need to cache this //TODO: log this - $palette[] = $blockStateDeserializer->deserialize(new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION)); + $palette[] = $blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } }catch(NbtException | BlockStateDeserializeException $e){ throw new CorruptedChunkException("Invalid blockstate NBT at offset $i in paletted storage: " . $e->getMessage(), 0, $e); From a7313ed9d938d7275a30a09c1b4e86323a531e05 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 15:57:37 +0100 Subject: [PATCH 0368/1858] Added rooted dirt --- build/generate-runtime-enum-serializers.php | 2 + src/block/Dirt.php | 42 +++++++++++----- src/block/Grass.php | 3 +- src/block/Mycelium.php | 3 +- src/block/utils/DirtType.php | 48 +++++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 11 ++++- .../BlockStateToBlockObjectDeserializer.php | 8 ++-- .../runtime/RuntimeEnumDeserializerTrait.php | 9 ++++ .../runtime/RuntimeEnumSerializerTrait.php | 9 ++++ src/item/StringToItemParser.php | 7 ++- .../block_factory_consistency_check.json | 2 +- 11 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 src/block/utils/DirtType.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 65d2b3a612..c50414281f 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -26,6 +26,7 @@ namespace pocketmine\build\generate_runtime_enum_serializers; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\MushroomBlockType; @@ -158,6 +159,7 @@ $enumsUsed = [ BellAttachmentType::getAll(), CopperOxidation::getAll(), CoralType::getAll(), + DirtType::getAll(), DyeColor::getAll(), LeverFacing::getAll(), MushroomBlockType::getAll(), diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 4a2d90d8a3..90cfadc290 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,8 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\DirtType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\item\Fertilizer; use pocketmine\item\Hoe; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -33,32 +35,50 @@ use pocketmine\player\Player; use pocketmine\world\sound\ItemUseOnBlockSound; class Dirt extends Opaque{ - protected bool $coarse = false; + protected DirtType $dirtType; - public function getRequiredTypeDataBits() : int{ return 1; } - - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ - $w->bool($this->coarse); + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + $this->dirtType = DirtType::NORMAL(); + parent::__construct($idInfo, $name, $breakInfo); } - public function isCoarse() : bool{ return $this->coarse; } + public function getRequiredTypeDataBits() : int{ return 2; } + + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->dirtType($this->dirtType); + } + + public function getDirtType() : DirtType{ return $this->dirtType; } /** @return $this */ - public function setCoarse(bool $coarse) : self{ - $this->coarse = $coarse; + public function setDirtType(DirtType $dirtType) : self{ + $this->dirtType = $dirtType; return $this; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + $world = $this->position->getWorld(); if($face === Facing::UP && $item instanceof Hoe){ $item->applyDamage(1); - $newBlock = $this->coarse ? VanillaBlocks::DIRT() : VanillaBlocks::FARMLAND(); - $world = $this->position->getWorld(); - $world->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); + $newBlock = $this->dirtType->equals(DirtType::NORMAL()) ? VanillaBlocks::FARMLAND() : VanillaBlocks::DIRT(); + $center = $this->position->add(0.5, 0.5, 0.5); + $world->addSound($center, new ItemUseOnBlockSound($newBlock)); $world->setBlock($this->position, $newBlock); + if($this->dirtType->equals(DirtType::ROOTED())){ + $world->dropItem($center, VanillaBlocks::HANGING_ROOTS()->asItem()); + } return true; + }elseif($this->dirtType->equals(DirtType::ROOTED()) && $item instanceof Fertilizer){ + $down = $this->getSide(Facing::DOWN); + if($down->getTypeId() !== BlockTypeIds::AIR){ + return true; + } + + $item->pop(); + $world->setBlock($down->position, VanillaBlocks::HANGING_ROOTS()); + //TODO: bonemeal particles, growth sounds } return false; diff --git a/src/block/Grass.php b/src/block/Grass.php index 14353ac7ca..54975d0460 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\DirtType; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Hoe; @@ -72,7 +73,7 @@ class Grass extends Opaque{ $b = $world->getBlockAt($x, $y, $z); if( !($b instanceof Dirt) || - $b->isCoarse() || + !$b->getDirtType()->equals(DirtType::NORMAL()) || $world->getFullLightAt($x, $y + 1, $z) < 4 || $world->getBlockAt($x, $y + 1, $z)->getLightFilter() >= 2 ){ diff --git a/src/block/Mycelium.php b/src/block/Mycelium.php index f7e989c45a..c87f893678 100644 --- a/src/block/Mycelium.php +++ b/src/block/Mycelium.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\DirtType; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -51,7 +52,7 @@ class Mycelium extends Opaque{ $z = mt_rand($this->position->z - 1, $this->position->z + 1); $world = $this->position->getWorld(); $block = $world->getBlockAt($x, $y, $z); - if($block instanceof Dirt && !$block->isCoarse()){ + if($block instanceof Dirt && $block->getDirtType()->equals(DirtType::NORMAL())){ if($block->getSide(Facing::UP) instanceof Transparent){ $ev = new BlockSpreadEvent($block, $this, VanillaBlocks::MYCELIUM()); $ev->call(); diff --git a/src/block/utils/DirtType.php b/src/block/utils/DirtType.php new file mode 100644 index 0000000000..536268676d --- /dev/null +++ b/src/block/utils/DirtType.php @@ -0,0 +1,48 @@ +mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ + $dirtType = $block->getDirtType(); + if($dirtType->equals(DirtType::ROOTED())){ + return new Writer(Ids::DIRT_WITH_ROOTS); + } return Writer::create(Ids::DIRT) - ->writeString(StateNames::DIRT_TYPE, $block->isCoarse() ? StringValues::DIRT_TYPE_COARSE : StringValues::DIRT_TYPE_NORMAL); + ->writeString(StateNames::DIRT_TYPE, match($dirtType){ + DirtType::COARSE() => StringValues::DIRT_TYPE_COARSE, + DirtType::NORMAL() => StringValues::DIRT_TYPE_NORMAL, + default => throw new AssumptionFailedError("Unhandled dirt type " . $dirtType->name()) + }); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 77ac319beb..fac4eef3aa 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -33,6 +33,7 @@ use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; @@ -641,12 +642,13 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); $this->map(Ids::DIRT, function(Reader $in) : Block{ return Blocks::DIRT() - ->setCoarse(match($value = $in->readString(StateNames::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => false, - StringValues::DIRT_TYPE_COARSE => true, + ->setDirtType(match($value = $in->readString(StateNames::DIRT_TYPE)){ + StringValues::DIRT_TYPE_NORMAL => DirtType::NORMAL(), + StringValues::DIRT_TYPE_COARSE => DirtType::COARSE(), default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), }); }); + $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 5c2a9adcda..b9c7492427 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -62,6 +62,15 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ + $value = match($this->readInt(2)){ + 0 => \pocketmine\block\utils\DirtType::COARSE(), + 1 => \pocketmine\block\utils\DirtType::NORMAL(), + 2 => \pocketmine\block\utils\DirtType::ROOTED(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DirtType") + }; + } + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\DyeColor::BLACK(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 16c01fd39a..4b62803ada 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -62,6 +62,15 @@ trait RuntimeEnumSerializerTrait{ }); } + public function dirtType(\pocketmine\block\utils\DirtType $value) : void{ + $this->int(2, match($value){ + \pocketmine\block\utils\DirtType::COARSE() => 0, + \pocketmine\block\utils\DirtType::NORMAL() => 1, + \pocketmine\block\utils\DirtType::ROOTED() => 2, + default => throw new \pocketmine\utils\AssumptionFailedError("All DirtType cases should be covered") + }); + } + public function dyeColor(\pocketmine\block\utils\DyeColor $value) : void{ $this->int(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index eab33700a8..7586867efa 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\Light; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; @@ -214,7 +215,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("clay_block", fn() => Blocks::CLAY()); $result->registerBlock("coal_block", fn() => Blocks::COAL()); $result->registerBlock("coal_ore", fn() => Blocks::COAL_ORE()); - $result->registerBlock("coarse_dirt", fn() => Blocks::DIRT()->setCoarse(true)); + $result->registerBlock("coarse_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE())); $result->registerBlock("cobble", fn() => Blocks::COBBLESTONE()); $result->registerBlock("cobble_stairs", fn() => Blocks::COBBLESTONE_STAIRS()); $result->registerBlock("cobble_wall", fn() => Blocks::COBBLESTONE_WALL()); @@ -329,7 +330,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("diorite_slab", fn() => Blocks::DIORITE_SLAB()); $result->registerBlock("diorite_stairs", fn() => Blocks::DIORITE_STAIRS()); $result->registerBlock("diorite_wall", fn() => Blocks::DIORITE_WALL()); - $result->registerBlock("dirt", fn() => Blocks::DIRT()); + $result->registerBlock("dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL())); + $result->registerBlock("dirt_with_roots", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); $result->registerBlock("door_block", fn() => Blocks::OAK_DOOR()); $result->registerBlock("double_plant", fn() => Blocks::SUNFLOWER()); $result->registerBlock("double_red_sandstone_slab", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE())); @@ -914,6 +916,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("repeater", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("repeater_block", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("reserved6", fn() => Blocks::RESERVED6()); + $result->registerBlock("rooted_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); $result->registerBlock("rose", fn() => Blocks::POPPY()); $result->registerBlock("rose_bush", fn() => Blocks::ROSE_BUSH()); $result->registerBlock("sand", fn() => Blocks::SAND()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 5c59869c7f..58c22103e8 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From b13f333b2ecdd4eac81c772ebf5ef0e1cc8efe70 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 16:40:46 +0100 Subject: [PATCH 0369/1858] Added mud and packed mud --- src/block/BlockTypeIds.php | 2 +- src/block/Dirt.php | 9 +++++++++ src/block/VanillaBlocks.php | 5 +++++ .../block/convert/BlockObjectToBlockStateSerializer.php | 2 ++ .../convert/BlockStateToBlockObjectDeserializer.php | 2 ++ src/item/StringToItemParser.php | 2 ++ tests/phpunit/block/block_factory_consistency_check.json | 2 +- 7 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index cf84b2a601..5171f40942 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -702,5 +702,5 @@ final class BlockTypeIds{ public const CHORUS_FLOWER = 10675; public const CHORUS_PLANT = 10676; - public const FIRST_UNUSED_BLOCK_ID = 10676; + public const FIRST_UNUSED_BLOCK_ID = 10677; } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 90cfadc290..d496cdab53 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -29,10 +29,14 @@ use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Fertilizer; use pocketmine\item\Hoe; use pocketmine\item\Item; +use pocketmine\item\Potion; +use pocketmine\item\PotionType; +use pocketmine\item\SplashPotion; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\sound\ItemUseOnBlockSound; +use pocketmine\world\sound\WaterSplashSound; class Dirt extends Opaque{ protected DirtType $dirtType; @@ -79,6 +83,11 @@ class Dirt extends Opaque{ $item->pop(); $world->setBlock($down->position, VanillaBlocks::HANGING_ROOTS()); //TODO: bonemeal particles, growth sounds + }elseif(($item instanceof Potion || $item instanceof SplashPotion) && $item->getType()->equals(PotionType::WATER())){ + $item->pop(); + $world->setBlock($this->position, VanillaBlocks::MUD()); + $world->addSound($this->position, new WaterSplashSound(0.5)); + return true; } return false; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 830c59b1b3..89c62732cc 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -495,6 +495,7 @@ use function mb_strtolower; * @method static Slab MOSSY_STONE_BRICK_SLAB() * @method static Stair MOSSY_STONE_BRICK_STAIRS() * @method static Wall MOSSY_STONE_BRICK_WALL() + * @method static Opaque MUD() * @method static Opaque MUD_BRICKS() * @method static Slab MUD_BRICK_SLAB() * @method static Stair MUD_BRICK_STAIRS() @@ -534,6 +535,7 @@ use function mb_strtolower; * @method static Flower ORANGE_TULIP() * @method static Flower OXEYE_DAISY() * @method static PackedIce PACKED_ICE() + * @method static Opaque PACKED_MUD() * @method static DoublePlant PEONY() * @method static Flower PINK_TULIP() * @method static Podzol PODZOL() @@ -1520,6 +1522,9 @@ final class VanillaBlocks{ } private static function registerMudBlocks() : void{ + self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new BreakInfo(1.0, ToolType::PICKAXE, 0, 15.0))); + $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 40c1c26410..1bb8ba7332 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -510,6 +510,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); + $this->mapSimple(Blocks::MUD(), Ids::MUD); $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); $this->mapSimple(Blocks::NETHERITE(), Ids::NETHERITE_BLOCK); @@ -523,6 +524,7 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::NOTE_BLOCK(), Ids::NOTEBLOCK); $this->mapSimple(Blocks::OBSIDIAN(), Ids::OBSIDIAN); $this->mapSimple(Blocks::PACKED_ICE(), Ids::PACKED_ICE); + $this->mapSimple(Blocks::PACKED_MUD(), Ids::PACKED_MUD); $this->mapSimple(Blocks::PODZOL(), Ids::PODZOL); $this->mapSimple(Blocks::POLISHED_BLACKSTONE(), Ids::POLISHED_BLACKSTONE); $this->mapSimple(Blocks::POLISHED_BLACKSTONE_BRICKS(), Ids::POLISHED_BLACKSTONE_BRICKS); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index fac4eef3aa..d82abac597 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -360,6 +360,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); + $this->map(Ids::MUD, fn() => Blocks::MUD()); $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); @@ -372,6 +373,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); + $this->map(Ids::PACKED_MUD, fn() => Blocks::PACKED_MUD()); $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); $this->map(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); $this->map(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 7586867efa..3d0f858d59 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -774,6 +774,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mossy_stone_brick_stairs", fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); $result->registerBlock("mossy_stone_brick_wall", fn() => Blocks::MOSSY_STONE_BRICK_WALL()); $result->registerBlock("mossy_stone_bricks", fn() => Blocks::MOSSY_STONE_BRICKS()); + $result->registerBlock("mud", fn() => Blocks::MUD()); $result->registerBlock("mud_bricks", fn() => Blocks::MUD_BRICKS()); $result->registerBlock("mud_brick_slab", fn() => Blocks::MUD_BRICK_SLAB()); $result->registerBlock("mud_brick_stairs", fn() => Blocks::MUD_BRICK_STAIRS()); @@ -824,6 +825,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("orange_tulip", fn() => Blocks::ORANGE_TULIP()); $result->registerBlock("oxeye_daisy", fn() => Blocks::OXEYE_DAISY()); $result->registerBlock("packed_ice", fn() => Blocks::PACKED_ICE()); + $result->registerBlock("packed_mud", fn() => Blocks::PACKED_MUD()); $result->registerBlock("peony", fn() => Blocks::PEONY()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 58c22103e8..f8042af504 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 17635e770b78625fc3e8d148ced3134a9bc432e6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 16:49:58 +0100 Subject: [PATCH 0370/1858] ................. --- src/world/sound/WaterSplashSound.php | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/world/sound/WaterSplashSound.php diff --git a/src/world/sound/WaterSplashSound.php b/src/world/sound/WaterSplashSound.php new file mode 100644 index 0000000000..f7b662ec8e --- /dev/null +++ b/src/world/sound/WaterSplashSound.php @@ -0,0 +1,48 @@ + 1){ + throw new \InvalidArgumentException("Volume must be between 0 and 1"); + } + } + + public function encode(Vector3 $pos) : array{ + return [LevelSoundEventPacket::create( + LevelSoundEvent::SPLASH, + $pos, + (int) ($this->volume * 16777215), + ":", + false, + false + )]; + } +} From 38e495babf29d600d9f13cc76042071ca841fbd8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 17:20:23 +0100 Subject: [PATCH 0371/1858] Added mangrove roots and muddy mangrove roots --- src/block/BlockTypeIds.php | 4 ++- src/block/MangroveRoots.php | 31 +++++++++++++++++++ src/block/VanillaBlocks.php | 6 ++++ .../BlockObjectToBlockStateSerializer.php | 2 ++ .../BlockStateToBlockObjectDeserializer.php | 2 ++ src/item/StringToItemParser.php | 2 ++ 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/block/MangroveRoots.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 5171f40942..b6a5c31fea 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -701,6 +701,8 @@ final class BlockTypeIds{ public const POWDER_SNOW_CAULDRON = 10674; public const CHORUS_FLOWER = 10675; public const CHORUS_PLANT = 10676; + public const MANGROVE_ROOTS = 10677; + public const MUDDY_MANGROVE_ROOTS = 10678; - public const FIRST_UNUSED_BLOCK_ID = 10677; + public const FIRST_UNUSED_BLOCK_ID = 10679; } diff --git a/src/block/MangroveRoots.php b/src/block/MangroveRoots.php new file mode 100644 index 0000000000..c9bc49a3bd --- /dev/null +++ b/src/block/MangroveRoots.php @@ -0,0 +1,31 @@ +mapSimple(Blocks::MAGMA(), Ids::MAGMA); $this->mapSimple(Blocks::MANGROVE_FENCE(), Ids::MANGROVE_FENCE); $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); + $this->mapSimple(Blocks::MANGROVE_ROOTS(), Ids::MANGROVE_ROOTS); $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); $this->mapSimple(Blocks::MUD(), Ids::MUD); + $this->mapSimple(Blocks::MUDDY_MANGROVE_ROOTS(), Ids::MUDDY_MANGROVE_ROOTS); $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); $this->mapSimple(Blocks::NETHERITE(), Ids::NETHERITE_BLOCK); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index d82abac597..277cdb394a 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -357,10 +357,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); $this->map(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); + $this->map(Ids::MANGROVE_ROOTS, fn() => Blocks::MANGROVE_ROOTS()); $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); $this->map(Ids::MUD, fn() => Blocks::MUD()); + $this->map(Ids::MUDDY_MANGROVE_ROOTS, fn() => Blocks::MUDDY_MANGROVE_ROOTS()); $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 3d0f858d59..ced95eba5d 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -750,6 +750,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(false)); $result->registerBlock("mangrove_planks", fn() => Blocks::MANGROVE_PLANKS()); $result->registerBlock("mangrove_pressure_plate", fn() => Blocks::MANGROVE_PRESSURE_PLATE()); + $result->registerBlock("mangrove_roots", fn() => Blocks::MANGROVE_ROOTS()); $result->registerBlock("mangrove_sign", fn() => Blocks::MANGROVE_SIGN()); $result->registerBlock("mangrove_slab", fn() => Blocks::MANGROVE_SLAB()); $result->registerBlock("mangrove_stairs", fn() => Blocks::MANGROVE_STAIRS()); @@ -779,6 +780,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mud_brick_slab", fn() => Blocks::MUD_BRICK_SLAB()); $result->registerBlock("mud_brick_stairs", fn() => Blocks::MUD_BRICK_STAIRS()); $result->registerBlock("mud_brick_wall", fn() => Blocks::MUD_BRICK_WALL()); + $result->registerBlock("muddy_mangrove_roots", fn() => Blocks::MUDDY_MANGROVE_ROOTS()); $result->registerBlock("mushroom_stem", fn() => Blocks::MUSHROOM_STEM()); $result->registerBlock("mycelium", fn() => Blocks::MYCELIUM()); $result->registerBlock("nether_brick_block", fn() => Blocks::NETHER_BRICKS()); From 4419161a496f00e39d9b25e848551804ea3d2909 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 17:39:26 +0100 Subject: [PATCH 0372/1858] Updated consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index f8042af504..4669ee31b1 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 102406ee79f57759fa75e603c1fb68ab23e7e12a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 17:40:38 +0100 Subject: [PATCH 0373/1858] Added froglights --- build/generate-runtime-enum-serializers.php | 2 + src/block/BlockTypeIds.php | 3 +- src/block/Froglight.php | 56 +++++++++++++++++++ src/block/VanillaBlocks.php | 2 + src/block/utils/FroglightType.php | 48 ++++++++++++++++ .../BlockObjectToBlockStateSerializer.php | 11 ++++ .../BlockStateToBlockObjectDeserializer.php | 4 ++ .../runtime/RuntimeEnumDeserializerTrait.php | 9 +++ .../runtime/RuntimeEnumSerializerTrait.php | 9 +++ src/item/StringToItemParser.php | 5 ++ .../block_factory_consistency_check.json | 2 +- 11 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 src/block/Froglight.php create mode 100644 src/block/utils/FroglightType.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index c50414281f..7118abf414 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -28,6 +28,7 @@ use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\MushroomBlockType; use pocketmine\block\utils\SkullType; @@ -161,6 +162,7 @@ $enumsUsed = [ CoralType::getAll(), DirtType::getAll(), DyeColor::getAll(), + FroglightType::getAll(), LeverFacing::getAll(), MushroomBlockType::getAll(), SkullType::getAll(), diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index b6a5c31fea..ddbb4b48a3 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -703,6 +703,7 @@ final class BlockTypeIds{ public const CHORUS_PLANT = 10676; public const MANGROVE_ROOTS = 10677; public const MUDDY_MANGROVE_ROOTS = 10678; + public const FROGLIGHT = 10679; - public const FIRST_UNUSED_BLOCK_ID = 10679; + public const FIRST_UNUSED_BLOCK_ID = 10680; } diff --git a/src/block/Froglight.php b/src/block/Froglight.php new file mode 100644 index 0000000000..8b35a66817 --- /dev/null +++ b/src/block/Froglight.php @@ -0,0 +1,56 @@ +froglightType = FroglightType::OCHRE(); + parent::__construct($idInfo, $name, $breakInfo); + } + + public function getRequiredTypeDataBits() : int{ return 2; } + + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->froglightType($this->froglightType); + } + + public function getFroglightType() : FroglightType{ return $this->froglightType; } + + /** @return $this */ + public function setFroglightType(FroglightType $froglightType) : self{ + $this->froglightType = $froglightType; + return $this; + } + + public function getLightLevel() : int{ + return 15; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 89b4d9aef3..0a065caa30 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -393,6 +393,7 @@ use function mb_strtolower; * @method static Fire FIRE() * @method static FletchingTable FLETCHING_TABLE() * @method static FlowerPot FLOWER_POT() + * @method static Froglight FROGLIGHT() * @method static FrostedIce FROSTED_ICE() * @method static Furnace FURNACE() * @method static GildedBlackstone GILDED_BLACKSTONE() @@ -1170,6 +1171,7 @@ final class VanillaBlocks{ self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new BreakInfo(0.7, ToolType::AXE))); //TODO: muddy mangrove roots are supposed to be axis-rotatable (Bedrock parity issue https://bugs.mojang.com/browse/MCPE-153721) self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new BreakInfo(0.7, ToolType::SHOVEL))); + self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new BreakInfo(0.3))); self::registerBlocksR13(); self::registerBlocksR14(); diff --git a/src/block/utils/FroglightType.php b/src/block/utils/FroglightType.php new file mode 100644 index 0000000000..f6b9c1d13f --- /dev/null +++ b/src/block/utils/FroglightType.php @@ -0,0 +1,48 @@ +writeBool(StateNames::UPDATE_BIT, false); //to keep MCPE happy }); + $this->map(Blocks::FROGLIGHT(), function(Froglight $block){ + return Writer::create(match($block->getFroglightType()){ + FroglightType::OCHRE() => Ids::OCHRE_FROGLIGHT, + FroglightType::PEARLESCENT() => Ids::PEARLESCENT_FROGLIGHT, + FroglightType::VERDANT() => Ids::VERDANT_FROGLIGHT, + default => throw new AssumptionFailedError("Unhandled froglight type " . $block->getFroglightType()->name()) + }) + ->writePillarAxis($block->getAxis()); + }); $this->map(Blocks::FROSTED_ICE(), function(FrostedIce $block) : Writer{ return Writer::create(Ids::FROSTED_ICE) ->writeInt(StateNames::AGE, $block->getAge()); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 277cdb394a..38f1bcebbe 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -35,6 +35,7 @@ use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; @@ -918,11 +919,13 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize }); $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); + $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE())->setAxis($in->readPillarAxis())); $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); + $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT())->setAxis($in->readPillarAxis())); $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); $this->map(Ids::PLANKS, function(Reader $in) : Block{ return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ @@ -1265,6 +1268,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->map(Ids::UNPOWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in)); $this->map(Ids::UNPOWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in) ->setPowered(false)); + $this->map(Ids::VERDANT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::VERDANT())->setAxis($in->readPillarAxis())); $this->map(Ids::VINE, function(Reader $in) : Block{ $vineDirectionFlags = $in->readBoundedInt(StateNames::VINE_DIRECTION_BITS, 0, 15); return Blocks::VINES() diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index b9c7492427..7bcbd09ed4 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -93,6 +93,15 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ + $value = match($this->readInt(2)){ + 0 => \pocketmine\block\utils\FroglightType::OCHRE(), + 1 => \pocketmine\block\utils\FroglightType::PEARLESCENT(), + 2 => \pocketmine\block\utils\FroglightType::VERDANT(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for FroglightType") + }; + } + public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ $value = match($this->readInt(3)){ 0 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 4b62803ada..e3bdcbccbb 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -93,6 +93,15 @@ trait RuntimeEnumSerializerTrait{ }); } + public function froglightType(\pocketmine\block\utils\FroglightType $value) : void{ + $this->int(2, match($value){ + \pocketmine\block\utils\FroglightType::OCHRE() => 0, + \pocketmine\block\utils\FroglightType::PEARLESCENT() => 1, + \pocketmine\block\utils\FroglightType::VERDANT() => 2, + default => throw new \pocketmine\utils\AssumptionFailedError("All FroglightType cases should be covered") + }); + } + public function leverFacing(\pocketmine\block\utils\LeverFacing $value) : void{ $this->int(3, match($value){ \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X() => 0, diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index ced95eba5d..a538380ce3 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -29,6 +29,7 @@ use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; +use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; @@ -99,6 +100,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock($prefix . "cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); } } + + foreach(FroglightType::getAll() as $froglightType){ + $result->registerBlock($froglightType->name() . "_froglight", fn() => Blocks::FROGLIGHT()->setFroglightType($froglightType)); + } } private static function registerBlocks(self $result) : void{ diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 4669ee31b1..1b4ce3d406 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 91e91b1d9fbf7b9e7e1c4b138759ef66055d6bca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 17:56:08 +0100 Subject: [PATCH 0374/1858] Reduce code width when tool tiers are given to BlockBreakInfo this is the majority of uses of harvest level --- src/block/BlockBreakInfo.php | 5 ++ src/block/VanillaBlocks.php | 138 +++++++++++++++++------------------ 2 files changed, 74 insertions(+), 69 deletions(-) diff --git a/src/block/BlockBreakInfo.php b/src/block/BlockBreakInfo.php index a2d43efbc3..429ad7c53f 100644 --- a/src/block/BlockBreakInfo.php +++ b/src/block/BlockBreakInfo.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\ToolTier; use function get_class; class BlockBreakInfo{ @@ -52,6 +53,10 @@ class BlockBreakInfo{ $this->blastResistance = $blastResistance ?? $hardness * 5; } + public static function tier(float $hardness, int $toolType, ToolTier $toolTier, ?float $blastResistance = null) : self{ + return new self($hardness, $toolType, $toolTier->getHarvestLevel(), $blastResistance); + } + public static function instant(int $toolType = BlockToolType::NONE, int $toolHarvestLevel = 0) : self{ return new self(0.0, $toolType, $toolHarvestLevel, 0.0); } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 0a065caa30..64d24e72c2 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -741,7 +741,7 @@ final class VanillaBlocks{ $railBreakInfo = new BlockBreakInfo(0.7); self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); self::register("air", new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); - self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 6000.0))); self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SWORD){ @@ -762,13 +762,13 @@ final class VanillaBlocks{ self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); - self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); - $bricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $bricksBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); @@ -780,9 +780,9 @@ final class VanillaBlocks{ $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); - $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $cobblestoneBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); @@ -790,13 +790,13 @@ final class VanillaBlocks{ self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", BreakInfo::tier(7.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); @@ -804,19 +804,19 @@ final class VanillaBlocks{ self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); + self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 6000.0))); self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", BreakInfo::indestructible())); self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); - self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 45.0))); + self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD(), 45.0))); - $endBrickBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 4.0); + $endBrickBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD(), 4.0); self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); + self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", BreakInfo::tier(22.5, ToolType::PICKAXE, ToolTier::WOOD(), 3000.0))); self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); @@ -834,30 +834,30 @@ final class VanillaBlocks{ self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); $glassBreakInfo = new BreakInfo(0.3); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); + self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", BreakInfo::tier(10.0, ToolType::PICKAXE, ToolTier::DIAMOND(), 50.0))); self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); - $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); + $hardenedClayBreakInfo = BreakInfo::tier(1.25, ToolType::PICKAXE, ToolTier::WOOD(), 21.0); self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new BreakInfo(10.0); self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); - self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD(), 15.0))); self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); $updateBlockBreakInfo = new BreakInfo(1.0); @@ -865,32 +865,32 @@ final class VanillaBlocks{ self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); - $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); + $ironBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::STONE(), 30.0); self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); - $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); + $ironDoorBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 25.0); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); self::register("jukebox", new Jukebox(new BID(Ids::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 self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - $lanternBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $lanternBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()); self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); - self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::STONE()))); self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); - self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); - self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); - $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $netherBrickBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); @@ -900,10 +900,10 @@ final class VanillaBlocks{ self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); - self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); - self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", BreakInfo::tier(0.4, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); @@ -911,7 +911,7 @@ final class VanillaBlocks{ self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); - $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $prismarineBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); @@ -926,12 +926,12 @@ final class VanillaBlocks{ self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); - $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $purpurBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); - $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $quartzBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD()); self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); @@ -943,7 +943,7 @@ final class VanillaBlocks{ self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); - self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); @@ -959,14 +959,14 @@ final class VanillaBlocks{ self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); - self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", BreakInfo::tier(0.2, ToolType::SHOVEL, ToolTier::WOOD()))); + self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", BreakInfo::tier(0.1, ToolType::SHOVEL, ToolTier::WOOD()))); self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); - $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $stoneBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register( "stone", $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ @@ -1011,10 +1011,10 @@ final class VanillaBlocks{ self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); //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); + $stoneSlabBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); @@ -1046,7 +1046,7 @@ final class VanillaBlocks{ self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); - self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); @@ -1067,7 +1067,7 @@ final class VanillaBlocks{ self::register("water", new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); - $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $weightedPressurePlateBreakInfo = BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()); self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); @@ -1087,7 +1087,7 @@ final class VanillaBlocks{ self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); } - $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $sandstoneBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD()); self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); @@ -1102,7 +1102,7 @@ final class VanillaBlocks{ self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); - self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", BreakInfo::tier(1.4, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); @@ -1110,7 +1110,7 @@ final class VanillaBlocks{ self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); - self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", BreakInfo::tier(1.8, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ @@ -1124,7 +1124,7 @@ final class VanillaBlocks{ })); //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); + $wallBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); @@ -1142,7 +1142,7 @@ final class VanillaBlocks{ self::registerElements(); - $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $chemistryTableBreakInfo = BreakInfo::tier(2.5, ToolType::PICKAXE, ToolTier::WOOD()); self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); @@ -1376,7 +1376,7 @@ final class VanillaBlocks{ self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $netherrackOreBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $netherrackOreBreakInfo = BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()); self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); } @@ -1405,20 +1405,20 @@ final class VanillaBlocks{ private static function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $slabBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); - self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new BreakInfo(30, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0))); - $netheriteBreakInfo = new BreakInfo(50, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 3600.0); + self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", BreakInfo::tier(30, ToolType::PICKAXE, ToolTier::DIAMOND(), 3600.0))); + $netheriteBreakInfo = BreakInfo::tier(50, ToolType::PICKAXE, ToolTier::DIAMOND(), 3600.0); self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); - $basaltBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); + $basaltBreakInfo = BreakInfo::tier(1.25, ToolType::PICKAXE, ToolTier::WOOD(), 21.0); self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - $blackstoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $blackstoneBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); @@ -1430,7 +1430,7 @@ final class VanillaBlocks{ $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new BreakInfo(0.5, ToolType::PICKAXE))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); @@ -1461,42 +1461,42 @@ final class VanillaBlocks{ private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new BreakInfo(0.75, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", BreakInfo::tier(0.75, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); - self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); - self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new BreakInfo(5, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0))); + self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::STONE(), 30.0))); + self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); + self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::STONE(), 30.0))); - $deepslateBreakInfo = new BreakInfo(3, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + $deepslateBreakInfo = BreakInfo::tier(3, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); self::register("deepslate", new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0))); + self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0))); - $deepslateBrickBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + $deepslateBrickBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - $deepslateTilesBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + $deepslateTilesBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - $cobbledDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + $cobbledDeepslateBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - $polishedDeepslateBreakInfo = new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 18.0); + $polishedDeepslateBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); @@ -1505,7 +1505,7 @@ final class VanillaBlocks{ self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); //blast resistance should be 30 if we were matched with java :( - $copperBreakInfo = new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 18.0); + $copperBreakInfo = BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::STONE(), 18.0); self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); @@ -1533,7 +1533,7 @@ final class VanillaBlocks{ self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new BreakInfo(0.5, ToolType::SHOVEL))); self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new BreakInfo(1.0, ToolType::PICKAXE, 0, 15.0))); - $mudBricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); + $mudBricksBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); @@ -1542,7 +1542,7 @@ final class VanillaBlocks{ } private static function registerCauldronBlocks() : void{ - $cauldronBreakInfo = new BreakInfo(2, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); + $cauldronBreakInfo = BreakInfo::tier(2, ToolType::PICKAXE, ToolTier::WOOD()); self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); From cffa3b8a727dc37031e9c2a68973afdd45834bcf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 18:21:04 +0100 Subject: [PATCH 0375/1858] Reduce BlockBreakInfo code width further by specializing for common tool types this considerably reduces width and makes adding new stuff much less irritating. --- src/block/BlockBreakInfo.php | 12 ++ src/block/VanillaBlocks.php | 246 +++++++++++++++++------------------ 2 files changed, 135 insertions(+), 123 deletions(-) diff --git a/src/block/BlockBreakInfo.php b/src/block/BlockBreakInfo.php index 429ad7c53f..b49cb6f13d 100644 --- a/src/block/BlockBreakInfo.php +++ b/src/block/BlockBreakInfo.php @@ -57,6 +57,18 @@ class BlockBreakInfo{ return new self($hardness, $toolType, $toolTier->getHarvestLevel(), $blastResistance); } + public static function pickaxe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : self{ + return new self($hardness, BlockToolType::PICKAXE, $toolTier?->getHarvestLevel() ?? 0, $blastResistance); + } + + public static function shovel(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : self{ + return new self($hardness, BlockToolType::SHOVEL, $toolTier?->getHarvestLevel() ?? 0, $blastResistance); + } + + public static function axe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : self{ + return new self($hardness, BlockToolType::AXE, $toolTier?->getHarvestLevel() ?? 0, $blastResistance); + } + public static function instant(int $toolType = BlockToolType::NONE, int $toolHarvestLevel = 0) : self{ return new self(0.0, $toolType, $toolHarvestLevel, 0.0); } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 64d24e72c2..f3fda7dba9 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -741,7 +741,7 @@ final class VanillaBlocks{ $railBreakInfo = new BlockBreakInfo(0.7); self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); self::register("air", new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); - self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 6000.0))); + self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0))); self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SWORD){ @@ -752,23 +752,23 @@ final class VanillaBlocks{ })); self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", BreakInfo::instant())); - $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); + $bannerBreakInfo = BreakInfo::axe(1.0); self::register("banner", new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); self::register("wall_banner", new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); + self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", BreakInfo::axe(2.5))); self::register("barrier", new Transparent(new BID(Ids::BARRIER), "Barrier", BreakInfo::indestructible())); self::register("beacon", new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new BreakInfo(3.0))); self::register("bed", new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); - self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", BreakInfo::pickaxe(5.0, ToolTier::WOOD()))); + self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", BreakInfo::pickaxe(2.8))); + self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", BreakInfo::pickaxe(2.0, ToolTier::WOOD()))); + self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", BreakInfo::axe(1.5))); + self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); - $bricksBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $bricksBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); @@ -777,49 +777,49 @@ final class VanillaBlocks{ self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new BreakInfo(0.5))); self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", BreakInfo::instant())); - $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); + $chestBreakInfo = BreakInfo::axe(2.5); self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); - self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); + self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", BreakInfo::shovel(0.6))); + self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0))); - $cobblestoneBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $cobblestoneBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); self::register("mossy_cobblestone_stairs", new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", BreakInfo::tier(7.0, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); - self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); + self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", BreakInfo::axe(0.2, null, 15.0))); + self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", BreakInfo::pickaxe(7.0, ToolTier::WOOD()))); + self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", BreakInfo::axe(2.5))); + self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", BreakInfo::axe(0.2))); self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); - self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0))); + self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", BreakInfo::shovel(0.5))); self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", BreakInfo::instant())); self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", BreakInfo::pickaxe(3.0, ToolTier::WOOD()))); self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); - self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 6000.0))); + self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0))); + self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0))); self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", BreakInfo::indestructible())); self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); - self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD(), 45.0))); + self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 45.0))); - $endBrickBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD(), 4.0); + $endBrickBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD(), 4.0); self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", BreakInfo::tier(22.5, ToolType::PICKAXE, ToolTier::WOOD(), 3000.0))); - self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); + self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0))); + self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", BreakInfo::shovel(0.6))); self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); - self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); + self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", BreakInfo::axe(2.5, null, 2.5))); self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", BreakInfo::instant())); self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", BreakInfo::instant())); self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", BreakInfo::instant())); @@ -833,64 +833,64 @@ final class VanillaBlocks{ self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", BreakInfo::pickaxe(2.5))); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); $glassBreakInfo = new BreakInfo(0.3); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", BreakInfo::tier(10.0, ToolType::PICKAXE, ToolTier::DIAMOND(), 50.0))); - self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); + self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", BreakInfo::pickaxe(10.0, ToolTier::DIAMOND(), 50.0))); + self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", BreakInfo::pickaxe(0.3))); + self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", BreakInfo::pickaxe(3.0, ToolTier::IRON(), 30.0))); - $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); + $grassBreakInfo = BreakInfo::shovel(0.6); self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); - self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); + self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", BreakInfo::shovel(0.6))); - $hardenedClayBreakInfo = BreakInfo::tier(1.25, ToolType::PICKAXE, ToolTier::WOOD(), 21.0); + $hardenedClayBreakInfo = BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0); self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new BreakInfo(10.0); self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); - self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD(), 15.0))); - self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 15.0))); + self::register("ice", new Ice(new BID(Ids::ICE), "Ice", BreakInfo::pickaxe(0.5))); $updateBlockBreakInfo = new BreakInfo(1.0); self::register("info_update", new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); - $ironBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::STONE(), 30.0); + $ironBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::STONE(), 30.0); self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); - $ironDoorBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 25.0); + $ironDoorBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 25.0); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - self::register("jukebox", new Jukebox(new BID(Ids::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 - self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new BreakInfo(0.4, ToolType::AXE))); + self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", BreakInfo::axe(0.8))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not + self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", BreakInfo::axe(0.4))); - $lanternBreakInfo = BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()); + $lanternBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::WOOD()); self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); - self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::STONE()))); + self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", BreakInfo::pickaxe(3.0, ToolTier::STONE()))); self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); - self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", BreakInfo::axe(2.0))); self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); - self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new BreakInfo(2.5, ToolType::AXE))); - self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); + self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", BreakInfo::axe(2.5))); + self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); + self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", BreakInfo::axe(1.0))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); - self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); + self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", BreakInfo::pickaxe(5.0, ToolTier::WOOD()))); + self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", BreakInfo::shovel(0.6))); - $netherBrickBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $netherBrickBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); @@ -900,18 +900,18 @@ final class VanillaBlocks{ self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); - self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", BreakInfo::pickaxe(3.0, ToolTier::WOOD()))); self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); - self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", BreakInfo::tier(0.4, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); - self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); - self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", BreakInfo::pickaxe(0.4, ToolTier::WOOD()))); + self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", BreakInfo::axe(0.8))); + self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND(), 6000.0))); + self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", BreakInfo::pickaxe(0.5))); + self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", BreakInfo::shovel(0.5))); self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); - $prismarineBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $prismarineBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); @@ -919,19 +919,19 @@ final class VanillaBlocks{ self::register("dark_prismarine_stairs", new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); self::register("prismarine_stairs", new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); - $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); + $pumpkinBreakInfo = BreakInfo::axe(1.0); self::register("pumpkin", new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); self::register("lit_pumpkin", new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); - $purpurBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $purpurBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); - $quartzBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD()); + $quartzBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD()); self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); @@ -943,7 +943,7 @@ final class VanillaBlocks{ self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); - self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", BreakInfo::tier(5.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); + self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0))); self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); @@ -951,7 +951,7 @@ final class VanillaBlocks{ self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", BreakInfo::instant())); - $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); + $sandBreakInfo = BreakInfo::shovel(0.5); self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); @@ -959,14 +959,14 @@ final class VanillaBlocks{ self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); - self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", BreakInfo::tier(0.2, ToolType::SHOVEL, ToolTier::WOOD()))); - self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", BreakInfo::tier(0.1, ToolType::SHOVEL, ToolTier::WOOD()))); - self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", BreakInfo::shovel(0.2, ToolTier::WOOD()))); + self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", BreakInfo::shovel(0.1, ToolTier::WOOD()))); + self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", BreakInfo::shovel(0.5))); self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); - $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); + $shulkerBoxBreakInfo = BreakInfo::pickaxe(2); self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); - $stoneBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $stoneBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); self::register( "stone", $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ @@ -991,7 +991,7 @@ final class VanillaBlocks{ self::register("cracked_stone_bricks", $crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); self::register("chiseled_stone_bricks", $chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); - $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); + $infestedStoneBreakInfo = BreakInfo::pickaxe(0.75); self::register("infested_stone", new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); self::register("infested_stone_brick", new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); self::register("infested_cobblestone", new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); @@ -1009,12 +1009,12 @@ final class VanillaBlocks{ self::register("polished_granite_stairs", new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); self::register("stone_brick_stairs", new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); - self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", BreakInfo::pickaxe(0.5))); + self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", BreakInfo::pickaxe(3.5))); + self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); //TODO: in the future this won't be the same for all the types - $stoneSlabBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $stoneSlabBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); @@ -1046,7 +1046,7 @@ final class VanillaBlocks{ self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); - self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); @@ -1063,11 +1063,11 @@ final class VanillaBlocks{ self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); - self::register("vines", new Vine(new BID(Ids::VINES), "Vines", new BreakInfo(0.2, ToolType::AXE))); + self::register("vines", new Vine(new BID(Ids::VINES), "Vines", BreakInfo::axe(0.2))); self::register("water", new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); - $weightedPressurePlateBreakInfo = BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()); + $weightedPressurePlateBreakInfo = BreakInfo::pickaxe(0.5, ToolTier::WOOD()); self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); @@ -1087,7 +1087,7 @@ final class VanillaBlocks{ self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); } - $sandstoneBreakInfo = BreakInfo::tier(0.8, ToolType::PICKAXE, ToolTier::WOOD()); + $sandstoneBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD()); self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); @@ -1102,7 +1102,7 @@ final class VanillaBlocks{ self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); - self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", BreakInfo::tier(1.4, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", BreakInfo::pickaxe(1.4, ToolTier::WOOD()))); self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); @@ -1110,8 +1110,8 @@ final class VanillaBlocks{ self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); - self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", BreakInfo::tier(1.8, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); + self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", BreakInfo::pickaxe(1.8, ToolTier::WOOD()))); + self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", BreakInfo::shovel(0.5))); self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); @@ -1124,7 +1124,7 @@ final class VanillaBlocks{ })); //TODO: in the future these won't all have the same hardness; they only do now because of the old metadata crap - $wallBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $wallBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); @@ -1142,7 +1142,7 @@ final class VanillaBlocks{ self::registerElements(); - $chemistryTableBreakInfo = BreakInfo::tier(2.5, ToolType::PICKAXE, ToolTier::WOOD()); + $chemistryTableBreakInfo = BreakInfo::pickaxe(2.5, ToolTier::WOOD()); self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); @@ -1168,9 +1168,9 @@ final class VanillaBlocks{ BreakInfo::instant(), )); - self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new BreakInfo(0.7, ToolType::AXE))); + self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", BreakInfo::axe(0.7))); //TODO: muddy mangrove roots are supposed to be axis-rotatable (Bedrock parity issue https://bugs.mojang.com/browse/MCPE-153721) - self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new BreakInfo(0.7, ToolType::SHOVEL))); + self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", BreakInfo::shovel(0.7))); self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new BreakInfo(0.3))); self::registerBlocksR13(); @@ -1188,12 +1188,12 @@ final class VanillaBlocks{ } private static function registerWoodenBlocks() : void{ - $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); - $signBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $logBreakInfo = new BreakInfo(2.0, ToolType::AXE); - $woodenDoorBreakInfo = new BreakInfo(3.0, ToolType::AXE, 0, 15.0); - $woodenButtonBreakInfo = new BreakInfo(0.5, ToolType::AXE); - $woodenPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::AXE); + $planksBreakInfo = BreakInfo::axe(2.0, null, 15.0); + $signBreakInfo = BreakInfo::axe(1.0); + $logBreakInfo = BreakInfo::axe(2.0); + $woodenDoorBreakInfo = BreakInfo::axe(3.0, null, 15.0); + $woodenButtonBreakInfo = BreakInfo::axe(0.5); + $woodenPressurePlateBreakInfo = BreakInfo::axe(0.5); foreach(WoodType::getAll() as $woodType){ $name = $woodType->getDisplayName(); @@ -1221,7 +1221,7 @@ final class VanillaBlocks{ } private static function registerMushroomBlocks() : void{ - $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); + $mushroomBlockBreakInfo = BreakInfo::axe(0.2); self::register("brown_mushroom_block", new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); self::register("red_mushroom_block", new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); @@ -1356,7 +1356,7 @@ final class VanillaBlocks{ } private static function registerOres() : void{ - $stoneOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(3.0, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + $stoneOreBreakInfo = fn(ToolTier $toolTier) => BreakInfo::pickaxe(3.0, $toolTier); self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); @@ -1366,7 +1366,7 @@ final class VanillaBlocks{ self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new BreakInfo(4.5, ToolType::PICKAXE, $toolTier->getHarvestLevel()); + $deepslateOreBreakInfo = fn(ToolTier $toolTier) => BreakInfo::pickaxe(4.5, $toolTier); self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); @@ -1376,20 +1376,20 @@ final class VanillaBlocks{ self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $netherrackOreBreakInfo = BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::WOOD()); + $netherrackOreBreakInfo = BreakInfo::pickaxe(3.0, ToolTier::WOOD()); self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); } private static function registerCraftingTables() : void{ //TODO: this is the same for all wooden crafting blocks - $craftingBlockBreakInfo = new BreakInfo(2.5, ToolType::AXE); + $craftingBlockBreakInfo = BreakInfo::axe(2.5); self::register("cartography_table", new CartographyTable(new BID(Ids::CARTOGRAPHY_TABLE), "Cartography Table", $craftingBlockBreakInfo)); self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); } private static function registerChorusBlocks() : void{ - $chorusBlockBreakInfo = new BreakInfo(0.4, ToolType::AXE); + $chorusBlockBreakInfo = BreakInfo::axe(0.4); self::register("chorus_plant", new ChorusPlant(new BID(Ids::CHORUS_PLANT), "Chorus Plant", $chorusBlockBreakInfo)); self::register("chorus_flower", new ChorusFlower(new BID(Ids::CHORUS_FLOWER), "Chorus Flower", $chorusBlockBreakInfo)); } @@ -1405,20 +1405,20 @@ final class VanillaBlocks{ private static function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $slabBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); - self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", BreakInfo::tier(30, ToolType::PICKAXE, ToolTier::DIAMOND(), 3600.0))); - $netheriteBreakInfo = BreakInfo::tier(50, ToolType::PICKAXE, ToolTier::DIAMOND(), 3600.0); + self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", BreakInfo::pickaxe(30, ToolTier::DIAMOND(), 3600.0))); + $netheriteBreakInfo = BreakInfo::pickaxe(50, ToolTier::DIAMOND(), 3600.0); self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); - $basaltBreakInfo = BreakInfo::tier(1.25, ToolType::PICKAXE, ToolTier::WOOD(), 21.0); + $basaltBreakInfo = BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0); self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - $blackstoneBreakInfo = BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $blackstoneBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); @@ -1429,8 +1429,8 @@ final class VanillaBlocks{ //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); - self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new BreakInfo(0.5, ToolType::PICKAXE))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), BreakInfo::tier(0.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), BreakInfo::pickaxe(0.5))); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); @@ -1447,56 +1447,56 @@ final class VanillaBlocks{ self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) - self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new BreakInfo(1.0, ToolType::SHOVEL))); + self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", BreakInfo::shovel(1.0))); self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ public function getLightLevel() : int{ return 15; } }); self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new BreakInfo(1.0, ToolType::HOE))); - self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new BreakInfo(35.0 /* 50 in Java */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel())) extends Opaque{ + self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND())) extends Opaque{ public function getLightLevel() : int{ return 10;} }); } private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD()))); + self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", BreakInfo::pickaxe(1.5, ToolTier::WOOD()))); - self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", BreakInfo::tier(0.75, ToolType::PICKAXE, ToolTier::WOOD()))); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", BreakInfo::tier(1.5, ToolType::PICKAXE, ToolTier::WOOD(), 30.0))); + self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", BreakInfo::pickaxe(0.75, ToolTier::WOOD()))); + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0))); - self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::STONE(), 30.0))); - self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::IRON(), 30.0))); - self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", BreakInfo::tier(5, ToolType::PICKAXE, ToolTier::STONE(), 30.0))); + self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0))); + self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", BreakInfo::pickaxe(5, ToolTier::IRON(), 30.0))); + self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0))); - $deepslateBreakInfo = BreakInfo::tier(3, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); + $deepslateBreakInfo = BreakInfo::pickaxe(3, ToolTier::WOOD(), 18.0); self::register("deepslate", new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0))); + self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0))); - $deepslateBrickBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); + $deepslateBrickBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - $deepslateTilesBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); + $deepslateTilesBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - $cobbledDeepslateBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); + $cobbledDeepslateBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - $polishedDeepslateBreakInfo = BreakInfo::tier(3.5, ToolType::PICKAXE, ToolTier::WOOD(), 18.0); + $polishedDeepslateBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); @@ -1505,7 +1505,7 @@ final class VanillaBlocks{ self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); //blast resistance should be 30 if we were matched with java :( - $copperBreakInfo = BreakInfo::tier(3.0, ToolType::PICKAXE, ToolTier::STONE(), 18.0); + $copperBreakInfo = BreakInfo::pickaxe(3.0, ToolTier::STONE(), 18.0); self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); @@ -1530,10 +1530,10 @@ final class VanillaBlocks{ } private static function registerMudBlocks() : void{ - self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new BreakInfo(0.5, ToolType::SHOVEL))); - self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new BreakInfo(1.0, ToolType::PICKAXE, 0, 15.0))); + self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", BreakInfo::shovel(0.5))); + self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", BreakInfo::pickaxe(1.0, null, 15.0))); - $mudBricksBreakInfo = BreakInfo::tier(2.0, ToolType::PICKAXE, ToolTier::WOOD(), 30.0); + $mudBricksBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); @@ -1542,7 +1542,7 @@ final class VanillaBlocks{ } private static function registerCauldronBlocks() : void{ - $cauldronBreakInfo = BreakInfo::tier(2, ToolType::PICKAXE, ToolTier::WOOD()); + $cauldronBreakInfo = BreakInfo::pickaxe(2, ToolTier::WOOD()); self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); From b751207969ad4dcdfe9cb70f0047e8ca7acdb0d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 18:24:09 +0100 Subject: [PATCH 0376/1858] Added missing blast resistance to Crying Obsidian --- src/block/VanillaBlocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index f3fda7dba9..231ae8c717 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1454,7 +1454,7 @@ final class VanillaBlocks{ }); self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new BreakInfo(1.0, ToolType::HOE))); - self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND())) extends Opaque{ + self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND(), 6000.0)) extends Opaque{ public function getLightLevel() : int{ return 10;} }); } From 89b784734e9c46c9f9f24e228aa96e71259a25b8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 18:45:57 +0100 Subject: [PATCH 0377/1858] Fixed crimson/warped planks being usable as furnace fuel --- src/block/FenceGate.php | 2 +- src/block/Planks.php | 2 +- src/block/Wood.php | 2 +- src/block/WoodenFence.php | 2 +- src/block/WoodenSlab.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index f439819d3a..96cb41d4ee 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -119,7 +119,7 @@ class FenceGate extends Transparent{ } public function getFuelTime() : int{ - return 300; + return $this->woodType->isFlammable() ? 300 : 0; } public function getFlameEncouragement() : int{ diff --git a/src/block/Planks.php b/src/block/Planks.php index 0eca22c24c..1074f8adf3 100644 --- a/src/block/Planks.php +++ b/src/block/Planks.php @@ -29,7 +29,7 @@ class Planks extends Opaque{ use WoodTypeTrait; public function getFuelTime() : int{ - return 300; + return $this->woodType->isFlammable() ? 300 : 0; } public function getFlameEncouragement() : int{ diff --git a/src/block/Wood.php b/src/block/Wood.php index 50032eaa18..cadc32036f 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -54,7 +54,7 @@ class Wood extends Opaque{ } public function getFuelTime() : int{ - return 300; + return $this->woodType->isFlammable() ? 300 : 0; } public function getFlameEncouragement() : int{ diff --git a/src/block/WoodenFence.php b/src/block/WoodenFence.php index 88d444f516..c12043a865 100644 --- a/src/block/WoodenFence.php +++ b/src/block/WoodenFence.php @@ -29,7 +29,7 @@ class WoodenFence extends Fence{ use WoodTypeTrait; public function getFuelTime() : int{ - return 300; + return $this->woodType->isFlammable() ? 300 : 0; } public function getFlameEncouragement() : int{ diff --git a/src/block/WoodenSlab.php b/src/block/WoodenSlab.php index b6f6647dae..b388a36ea3 100644 --- a/src/block/WoodenSlab.php +++ b/src/block/WoodenSlab.php @@ -29,7 +29,7 @@ class WoodenSlab extends Slab{ use WoodTypeTrait; public function getFuelTime() : int{ - return 300; + return $this->woodType->isFlammable() ? 300 : 0; } public function getFlameEncouragement() : int{ From 6a2315a63dbad4a0bd54c719fc8b311e28636c77 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 20:42:54 +0100 Subject: [PATCH 0378/1858] Accept BlockTypeInfo in Block constructor, instead of BlockBreakInfo this will allow more stuff to be passed via the constructor without having to change dozens of classes to do it. --- src/block/BaseBanner.php | 4 +- src/block/BaseCoral.php | 4 +- src/block/BaseSign.php | 4 +- src/block/Bed.php | 4 +- src/block/Bell.php | 4 +- src/block/Block.php | 4 +- src/block/BlockFactory.php | 2 +- src/block/BlockTypeInfo.php | 33 ++ src/block/CakeWithDyedCandle.php | 4 +- src/block/Carpet.php | 4 +- src/block/Concrete.php | 4 +- src/block/ConcretePowder.php | 4 +- src/block/CopperStairs.php | 4 +- src/block/CoralBlock.php | 4 +- src/block/Dirt.php | 4 +- src/block/DyedCandle.php | 4 +- src/block/DyedShulkerBox.php | 4 +- src/block/Element.php | 4 +- src/block/Froglight.php | 4 +- src/block/GlazedTerracotta.php | 4 +- src/block/InfestedStone.php | 4 +- src/block/Lantern.php | 4 +- src/block/Leaves.php | 4 +- src/block/Lever.php | 4 +- src/block/PotionCauldron.php | 4 +- src/block/RedMushroomBlock.php | 4 +- src/block/Sapling.php | 4 +- src/block/Skull.php | 4 +- src/block/Slab.php | 4 +- 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 | 4 +- src/block/UnknownBlock.php | 4 +- src/block/VanillaBlocks.php | 455 +++++++++++++------------ src/block/Wool.php | 4 +- src/block/utils/CopperTrait.php | 5 +- src/block/utils/WoodTypeTrait.php | 5 +- tests/phpunit/block/BlockTest.php | 8 +- 41 files changed, 342 insertions(+), 306 deletions(-) create mode 100644 src/block/BlockTypeInfo.php diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index d5f859f7c6..89e06d5356 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -48,9 +48,9 @@ abstract class BaseBanner extends Transparent{ */ protected array $patterns = []; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::BLACK(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function readStateFromWorld() : Block{ diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index f3bb9255de..f1a5a9e799 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -31,8 +31,8 @@ use pocketmine\item\Item; abstract class BaseCoral extends Transparent{ use CoralTypeTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ - parent::__construct($idInfo, $name, $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ + parent::__construct($idInfo, $name, $typeInfo); $this->coralType = CoralType::TUBE(); } diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 7ce7a829fe..a1413ccbfb 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -51,9 +51,9 @@ abstract class BaseSign extends Transparent{ /** * @param \Closure() : Item $asItemCallback */ - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, WoodType $woodType, \Closure $asItemCallback){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, WoodType $woodType, \Closure $asItemCallback){ $this->woodType = $woodType; - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); $this->text = new SignText(); $this->asItemCallback = $asItemCallback; } diff --git a/src/block/Bed.php b/src/block/Bed.php index 350bf865df..3a5e0ff101 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -49,9 +49,9 @@ class Bed extends Transparent{ protected bool $occupied = false; protected bool $head = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::RED(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 4; } diff --git a/src/block/Bell.php b/src/block/Bell.php index 4c8d95146a..702a3bac65 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -42,9 +42,9 @@ final class Bell extends Transparent{ private BellAttachmentType $attachmentType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->attachmentType = BellAttachmentType::FLOOR(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 4; } diff --git a/src/block/Block.php b/src/block/Block.php index ae2374c060..d6830e4507 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -65,10 +65,10 @@ class Block{ /** * @param string $name English name of the block type (TODO: implement translations) */ - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->idInfo = $idInfo; $this->fallbackName = $name; - $this->breakInfo = $breakInfo; + $this->breakInfo = $typeInfo->getBreakInfo(); $this->position = new Position(0, 0, 0, null); } diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index d07f4b5263..737747184a 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -157,7 +157,7 @@ class BlockFactory{ }else{ $typeId = $stateId >> Block::INTERNAL_STATE_DATA_BITS; $stateData = $stateId & Block::INTERNAL_STATE_DATA_MASK; - $block = new UnknownBlock(new BID($typeId), BreakInfo::instant(), $stateData); + $block = new UnknownBlock(new BID($typeId), new BlockTypeInfo(BreakInfo::instant()), $stateData); } return $block; diff --git a/src/block/BlockTypeInfo.php b/src/block/BlockTypeInfo.php new file mode 100644 index 0000000000..6f52a310a6 --- /dev/null +++ b/src/block/BlockTypeInfo.php @@ -0,0 +1,33 @@ +breakInfo; } +} diff --git a/src/block/CakeWithDyedCandle.php b/src/block/CakeWithDyedCandle.php index 211da887a8..e01ad3e1b9 100644 --- a/src/block/CakeWithDyedCandle.php +++ b/src/block/CakeWithDyedCandle.php @@ -29,9 +29,9 @@ use pocketmine\block\utils\DyeColor; class CakeWithDyedCandle extends CakeWithCandle{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getCandle() : Candle{ diff --git a/src/block/Carpet.php b/src/block/Carpet.php index 75b9220b91..c979571ebf 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -35,9 +35,9 @@ use pocketmine\world\BlockTransaction; class Carpet extends Flowable{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function isSolid() : bool{ diff --git a/src/block/Concrete.php b/src/block/Concrete.php index 7f07be3085..cb8ee3b529 100644 --- a/src/block/Concrete.php +++ b/src/block/Concrete.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; class Concrete extends Opaque{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index b70532c3ff..cfe2ccec69 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -36,9 +36,9 @@ class ConcretePowder extends Opaque implements Fallable{ onNearbyBlockChange as protected startFalling; } - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function onNearbyBlockChange() : void{ diff --git a/src/block/CopperStairs.php b/src/block/CopperStairs.php index a932938d22..fe52616ce9 100644 --- a/src/block/CopperStairs.php +++ b/src/block/CopperStairs.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\CopperTrait; class CopperStairs extends Stair{ use CopperTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->oxidation = CopperOxidation::NONE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index 0ab8317808..2243113b97 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -31,9 +31,9 @@ use function mt_rand; final class CoralBlock extends Opaque{ use CoralTypeTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->coralType = CoralType::TUBE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function onNearbyBlockChange() : void{ diff --git a/src/block/Dirt.php b/src/block/Dirt.php index d496cdab53..d0b38806a0 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -41,9 +41,9 @@ use pocketmine\world\sound\WaterSplashSound; class Dirt extends Opaque{ protected DirtType $dirtType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->dirtType = DirtType::NORMAL(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredTypeDataBits() : int{ return 2; } diff --git a/src/block/DyedCandle.php b/src/block/DyedCandle.php index 76b9a14276..55d76e4066 100644 --- a/src/block/DyedCandle.php +++ b/src/block/DyedCandle.php @@ -29,9 +29,9 @@ use pocketmine\block\utils\DyeColor; class DyedCandle extends Candle{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } protected function getCandleIfCompatibleType(Block $block) : ?Candle{ diff --git a/src/block/DyedShulkerBox.php b/src/block/DyedShulkerBox.php index ffe5e5f16a..196ee02822 100644 --- a/src/block/DyedShulkerBox.php +++ b/src/block/DyedShulkerBox.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class DyedShulkerBox extends ShulkerBox{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/Element.php b/src/block/Element.php index 8d6fb79850..9c8a91621a 100644 --- a/src/block/Element.php +++ b/src/block/Element.php @@ -27,12 +27,12 @@ class Element extends Opaque{ public function __construct( BlockIdentifier $idInfo, string $name, - BlockBreakInfo $breakInfo, + BlockTypeInfo $typeInfo, private string $symbol, private int $atomicWeight, private int $group ){ - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getAtomicWeight() : int{ diff --git a/src/block/Froglight.php b/src/block/Froglight.php index 8b35a66817..0e8daa4b68 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -31,9 +31,9 @@ final class Froglight extends SimplePillar{ private FroglightType $froglightType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->froglightType = FroglightType::OCHRE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredTypeDataBits() : int{ return 2; } diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index 687c19a16c..5568703c23 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -33,8 +33,8 @@ class GlazedTerracotta extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::BLACK(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/InfestedStone.php b/src/block/InfestedStone.php index 7700b572cc..eb10b38ade 100644 --- a/src/block/InfestedStone.php +++ b/src/block/InfestedStone.php @@ -29,8 +29,8 @@ final class InfestedStone extends Opaque{ private int $imitated; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, Block $imitated){ - parent::__construct($idInfo, $name, $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, Block $imitated){ + parent::__construct($idInfo, $name, $typeInfo); $this->imitated = $imitated->getStateId(); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index d33ed5883d..50df67576c 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -39,9 +39,9 @@ class Lantern extends Transparent{ protected bool $hanging = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, int $lightLevel){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, int $lightLevel){ $this->lightLevel = $lightLevel; - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 1; } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index bf2dc18eb5..60b20b5406 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -43,8 +43,8 @@ class Leaves extends Transparent{ protected bool $noDecay = false; protected bool $checkDecay = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, TreeType $treeType){ - parent::__construct($idInfo, $name, $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, TreeType $treeType){ + parent::__construct($idInfo, $name, $typeInfo); $this->treeType = $treeType; } diff --git a/src/block/Lever.php b/src/block/Lever.php index 45f5d2fb25..a5a30936f9 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -40,9 +40,9 @@ class Lever extends Flowable{ protected LeverFacing $facing; protected bool $activated = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->facing = LeverFacing::UP_AXIS_X(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 4; } diff --git a/src/block/PotionCauldron.php b/src/block/PotionCauldron.php index d0bcf2af5d..b8259fbc35 100644 --- a/src/block/PotionCauldron.php +++ b/src/block/PotionCauldron.php @@ -39,8 +39,8 @@ final class PotionCauldron extends FillableCauldron{ private ?Item $potionItem = null; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ - parent::__construct($idInfo, $name, $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ + parent::__construct($idInfo, $name, $typeInfo); } public function readStateFromWorld() : Block{ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index c9595e6338..18ab59bd1b 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -32,9 +32,9 @@ use function mt_rand; class RedMushroomBlock extends Opaque{ protected MushroomBlockType $mushroomBlockType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->mushroomBlockType = MushroomBlockType::PORES(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 4; } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 629e1f81ee..03cde4cbd6 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -42,8 +42,8 @@ class Sapling extends Flowable{ private TreeType $treeType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, TreeType $treeType){ - parent::__construct($idInfo, $name, $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, TreeType $treeType){ + parent::__construct($idInfo, $name, $typeInfo); $this->treeType = $treeType; } diff --git a/src/block/Skull.php b/src/block/Skull.php index b7a7074768..b2e02b8d43 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -45,9 +45,9 @@ class Skull extends Flowable{ protected int $facing = Facing::NORTH; 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){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->skullType = SkullType::SKELETON(); //TODO: this should be a parameter - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredTypeDataBits() : int{ return 3; } diff --git a/src/block/Slab.php b/src/block/Slab.php index 37eaf5e6b5..a1b09a151d 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -37,8 +37,8 @@ use pocketmine\world\BlockTransaction; class Slab extends Transparent{ protected SlabType $slabType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ - parent::__construct($idInfo, $name . " Slab", $breakInfo); + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ + parent::__construct($idInfo, $name . " Slab", $typeInfo); $this->slabType = SlabType::BOTTOM(); } diff --git a/src/block/StainedGlass.php b/src/block/StainedGlass.php index ad9ed24af1..5b4b6a883c 100644 --- a/src/block/StainedGlass.php +++ b/src/block/StainedGlass.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class StainedGlass extends Glass{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/StainedGlassPane.php b/src/block/StainedGlassPane.php index 38c43f79b5..2a592395dd 100644 --- a/src/block/StainedGlassPane.php +++ b/src/block/StainedGlassPane.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class StainedGlassPane extends GlassPane{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/StainedHardenedClay.php b/src/block/StainedHardenedClay.php index e805e91cfe..1a9d68737b 100644 --- a/src/block/StainedHardenedClay.php +++ b/src/block/StainedHardenedClay.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedClay extends HardenedClay{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/StainedHardenedGlass.php b/src/block/StainedHardenedGlass.php index e3915807df..85d5fcec0f 100644 --- a/src/block/StainedHardenedGlass.php +++ b/src/block/StainedHardenedGlass.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedGlass extends HardenedGlass{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/StainedHardenedGlassPane.php b/src/block/StainedHardenedGlassPane.php index 8054730872..4a61f9778b 100644 --- a/src/block/StainedHardenedGlassPane.php +++ b/src/block/StainedHardenedGlassPane.php @@ -29,8 +29,8 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedGlassPane extends HardenedGlassPane{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } } diff --git a/src/block/Stair.php b/src/block/Stair.php index 541266f0a6..83569e8b15 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -42,9 +42,9 @@ class Stair extends Transparent{ protected bool $upsideDown = false; protected StairShape $shape; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->shape = StairShape::STRAIGHT(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getRequiredStateDataBits() : int{ return 3; } diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 52cbb4e647..02b125e982 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -31,8 +31,8 @@ class UnknownBlock extends Transparent{ private int $stateData; - public function __construct(BlockIdentifier $idInfo, BlockBreakInfo $breakInfo, int $stateData){ - parent::__construct($idInfo, "Unknown", $breakInfo); + public function __construct(BlockIdentifier $idInfo, BlockTypeInfo $typeInfo, int $stateData){ + parent::__construct($idInfo, "Unknown", $typeInfo); $this->stateData = $stateData; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 231ae8c717..0f2532f8a2 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\BlockTypeInfo as Info; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockToolType as ToolType; @@ -738,159 +739,159 @@ final class VanillaBlocks{ } protected static function setup() : void{ - $railBreakInfo = new BlockBreakInfo(0.7); + $railBreakInfo = new Info(new BlockBreakInfo(0.7)); self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); - self::register("air", new Air(new BID(Ids::AIR), "Air", BreakInfo::indestructible(-1.0))); - self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0))); - self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ + self::register("air", new Air(new BID(Ids::AIR), "Air", new Info(BreakInfo::indestructible(-1.0)))); + self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0)))); + self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new Info(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; } return parent::getBreakTime($item); } - })); - self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", BreakInfo::instant())); + }))); + self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", new Info(BreakInfo::instant()))); - $bannerBreakInfo = BreakInfo::axe(1.0); + $bannerBreakInfo = new Info(BreakInfo::axe(1.0)); self::register("banner", new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); self::register("wall_banner", new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", BreakInfo::axe(2.5))); - self::register("barrier", new Transparent(new BID(Ids::BARRIER), "Barrier", BreakInfo::indestructible())); - self::register("beacon", new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new BreakInfo(3.0))); - self::register("bed", new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); - self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", BreakInfo::indestructible())); + self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new Info(BreakInfo::axe(2.5)))); + self::register("barrier", new Transparent(new BID(Ids::BARRIER), "Barrier", new Info(BreakInfo::indestructible()))); + self::register("beacon", new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new Info(new BreakInfo(3.0)))); + self::register("bed", new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new Info(new BreakInfo(0.2)))); + self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", new Info(BreakInfo::indestructible()))); - self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", BreakInfo::instant())); - self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", BreakInfo::pickaxe(5.0, ToolTier::WOOD()))); - self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", BreakInfo::pickaxe(2.8))); - self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", BreakInfo::pickaxe(2.0, ToolTier::WOOD()))); - self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", BreakInfo::axe(1.5))); - self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); + self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", new Info(BreakInfo::instant()))); + self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); + self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new Info(BreakInfo::pickaxe(2.8)))); + self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD())))); + self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new Info(BreakInfo::axe(1.5)))); + self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); - $bricksBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $bricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); - self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", BreakInfo::instant())); - self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new BreakInfo(0.4))); - self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new BreakInfo(0.5))); - self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", BreakInfo::instant())); + self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", new Info(BreakInfo::instant()))); + self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new Info(new BreakInfo(0.4)))); + self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new Info(new BreakInfo(0.5)))); + self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", new Info(BreakInfo::instant()))); - $chestBreakInfo = BreakInfo::axe(2.5); + $chestBreakInfo = new Info(BreakInfo::axe(2.5)); self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); - self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", BreakInfo::shovel(0.6))); - self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0))); + self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new Info(BreakInfo::shovel(0.6)))); + self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0)))); - $cobblestoneBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $cobblestoneBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); self::register("mossy_cobblestone_stairs", new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", BreakInfo::axe(0.2, null, 15.0))); - self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", BreakInfo::pickaxe(7.0, ToolTier::WOOD()))); - self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", BreakInfo::axe(2.5))); - self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", BreakInfo::axe(0.2))); - self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new Info(new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1)))); + self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new Info(BreakInfo::axe(0.2, null, 15.0)))); + self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD())))); + self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new Info(BreakInfo::axe(2.5)))); + self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new Info(BreakInfo::axe(0.2)))); + self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0))); - self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", BreakInfo::shovel(0.5))); - self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", BreakInfo::instant())); - self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", BreakInfo::instant())); - self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", BreakInfo::instant())); - self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", BreakInfo::instant())); - self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); - self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", BreakInfo::pickaxe(3.0, ToolTier::WOOD()))); - self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0))); - self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0))); - self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", BreakInfo::indestructible())); - self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", BreakInfo::instant())); - self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 45.0))); + self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0)))); + self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new Info(BreakInfo::shovel(0.5)))); + self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", new Info(BreakInfo::instant()))); + self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", new Info(BreakInfo::instant()))); + self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", new Info(BreakInfo::instant()))); + self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", new Info(BreakInfo::instant()))); + self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())))); + self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new Info(new BreakInfo(0.5, ToolType::NONE, 0, 12.5)))); + self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0)))); + self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0)))); + self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", new Info(BreakInfo::indestructible()))); + self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", new Info(BreakInfo::instant()))); + self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 45.0)))); - $endBrickBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD(), 4.0); + $endBrickBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD(), 4.0)); self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0))); - self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", BreakInfo::shovel(0.6))); - self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", BreakInfo::instant())); - self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", BreakInfo::axe(2.5, null, 2.5))); - self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", BreakInfo::instant())); - self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", BreakInfo::instant())); - self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", BreakInfo::instant())); - self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); - self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); - self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", BreakInfo::instant())); - self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); - self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); - self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); - self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", BreakInfo::instant())); - self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", BreakInfo::instant())); - self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", BreakInfo::instant())); - self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", BreakInfo::pickaxe(2.5))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); + self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0)))); + self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6)))); + self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant()))); + self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new Info(BreakInfo::axe(2.5, null, 2.5)))); + self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", new Info(BreakInfo::instant()))); + self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", new Info(BreakInfo::instant()))); + self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", new Info(BreakInfo::instant()))); + self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", new Info(BreakInfo::instant()))); + self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", new Info(BreakInfo::instant()))); + self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", new Info(BreakInfo::instant()))); + self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", new Info(BreakInfo::instant()))); + self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", new Info(BreakInfo::instant()))); + self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", new Info(BreakInfo::instant()))); + self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", new Info(BreakInfo::instant()))); + self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", new Info(BreakInfo::instant()))); + self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", new Info(BreakInfo::instant()))); + self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); + self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); - $glassBreakInfo = new BreakInfo(0.3); + $glassBreakInfo = new Info(new BreakInfo(0.3)); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", BreakInfo::pickaxe(10.0, ToolTier::DIAMOND(), 50.0))); - self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", BreakInfo::pickaxe(0.3))); - self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", BreakInfo::pickaxe(3.0, ToolTier::IRON(), 30.0))); + self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new Info(BreakInfo::pickaxe(10.0, ToolTier::DIAMOND(), 50.0)))); + self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new Info(BreakInfo::pickaxe(0.3)))); + self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON(), 30.0)))); - $grassBreakInfo = BreakInfo::shovel(0.6); + $grassBreakInfo = new Info(BreakInfo::shovel(0.6)); self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); - self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", BreakInfo::shovel(0.6))); + self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new Info(BreakInfo::shovel(0.6)))); - $hardenedClayBreakInfo = BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0); + $hardenedClayBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0)); self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); - $hardenedGlassBreakInfo = new BreakInfo(10.0); + $hardenedGlassBreakInfo = new Info(new BreakInfo(10.0)); self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new BreakInfo(0.5))); - self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 15.0))); - self::register("ice", new Ice(new BID(Ids::ICE), "Ice", BreakInfo::pickaxe(0.5))); + self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new Info(new BreakInfo(0.5)))); + self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 15.0)))); + self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new Info(BreakInfo::pickaxe(0.5)))); - $updateBlockBreakInfo = new BreakInfo(1.0); + $updateBlockBreakInfo = new Info(new BreakInfo(1.0)); self::register("info_update", new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); - self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", BreakInfo::indestructible())); + self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", new Info(BreakInfo::indestructible()))); - $ironBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::STONE(), 30.0); + $ironBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::STONE(), 30.0)); self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); - $ironDoorBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 25.0); + $ironDoorBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 25.0)); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); - self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", BreakInfo::axe(0.8))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not - self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", BreakInfo::axe(0.4))); + self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new Info(new BreakInfo(0.25)))); + self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", new Info(BreakInfo::axe(0.8)))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not + self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new Info(BreakInfo::axe(0.4)))); - $lanternBreakInfo = BreakInfo::pickaxe(5.0, ToolTier::WOOD()); + $lanternBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())); self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); - self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", BreakInfo::pickaxe(3.0, ToolTier::STONE()))); - self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", BreakInfo::indestructible(500.0))); - self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", BreakInfo::axe(2.0))); - self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new BreakInfo(0.5))); - self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", BreakInfo::axe(2.5))); - self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); - self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", BreakInfo::axe(1.0))); - self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", BreakInfo::instant())); - self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", BreakInfo::pickaxe(5.0, ToolTier::WOOD()))); - self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", BreakInfo::shovel(0.6))); + self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE())))); + self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", new Info(BreakInfo::indestructible(500.0)))); + self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new Info(BreakInfo::axe(2.0)))); + self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new Info(new BreakInfo(0.5)))); + self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new Info(BreakInfo::axe(2.5)))); + self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); + self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new Info(BreakInfo::axe(1.0)))); + self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", new Info(BreakInfo::instant()))); + self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); + self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new Info(BreakInfo::shovel(0.6)))); - $netherBrickBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $netherBrickBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); @@ -899,19 +900,19 @@ final class VanillaBlocks{ self::register("chiseled_nether_bricks", new Opaque(new BID(Ids::CHISELED_NETHER_BRICKS), "Chiseled Nether Bricks", $netherBrickBreakInfo)); self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); - self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", BreakInfo::indestructible(0.0))); - self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", BreakInfo::pickaxe(3.0, ToolTier::WOOD()))); - self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); - self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", BreakInfo::instant())); - self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", BreakInfo::pickaxe(0.4, ToolTier::WOOD()))); - self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", BreakInfo::axe(0.8))); - self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND(), 6000.0))); - self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", BreakInfo::pickaxe(0.5))); - self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", BreakInfo::shovel(0.5))); - self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", BreakInfo::instant())); + self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", new Info(BreakInfo::indestructible(0.0)))); + self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())))); + self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); + self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", new Info(BreakInfo::instant()))); + self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new Info(BreakInfo::pickaxe(0.4, ToolTier::WOOD())))); + self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new Info(BreakInfo::axe(0.8)))); + self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND(), 6000.0)))); + self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new Info(BreakInfo::pickaxe(0.5)))); + self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new Info(BreakInfo::shovel(0.5)))); + self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", new Info(BreakInfo::instant()))); self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); - $prismarineBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); + $prismarineBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); @@ -919,19 +920,19 @@ final class VanillaBlocks{ self::register("dark_prismarine_stairs", new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); self::register("prismarine_stairs", new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); - $pumpkinBreakInfo = BreakInfo::axe(1.0); + $pumpkinBreakInfo = new Info(BreakInfo::axe(1.0)); self::register("pumpkin", new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); self::register("lit_pumpkin", new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); - self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", BreakInfo::instant())); + self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", new Info(BreakInfo::instant()))); - $purpurBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); + $purpurBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); - $quartzBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD()); + $quartzBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); @@ -942,31 +943,31 @@ final class VanillaBlocks{ self::register("smooth_quartz_stairs", new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); - self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", BreakInfo::instant())); - self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0))); - self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new BreakInfo(0.3))); - self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", BreakInfo::instant())); - self::register("redstone_torch", new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", BreakInfo::instant())); - self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", BreakInfo::instant())); - self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", BreakInfo::instant())); + self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", new Info(BreakInfo::instant()))); + self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0)))); + self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", new Info(BreakInfo::instant()))); + self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new Info(new BreakInfo(0.3)))); + self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", new Info(BreakInfo::instant()))); + self::register("redstone_torch", new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", new Info(BreakInfo::instant()))); + self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", new Info(BreakInfo::instant()))); + self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", new Info(BreakInfo::instant()))); - $sandBreakInfo = BreakInfo::shovel(0.5); + $sandBreakInfo = new Info(BreakInfo::shovel(0.5)); self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); - self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new BreakInfo(0.3))); - self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", BreakInfo::instant())); - self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new BreakInfo(1.0))); - self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", BreakInfo::instant())); - self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", BreakInfo::shovel(0.2, ToolTier::WOOD()))); - self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", BreakInfo::shovel(0.1, ToolTier::WOOD()))); - self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", BreakInfo::shovel(0.5))); - self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new BreakInfo(0.6, ToolType::HOE))); - $shulkerBoxBreakInfo = BreakInfo::pickaxe(2); + self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new Info(new BreakInfo(0.3)))); + self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); + self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new Info(new BreakInfo(1.0)))); + self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", new Info(BreakInfo::instant()))); + self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD())))); + self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD())))); + self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new Info(BreakInfo::shovel(0.5)))); + self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new Info(new BreakInfo(0.6, ToolType::HOE)))); + $shulkerBoxBreakInfo = new Info(BreakInfo::pickaxe(2)); self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); - $stoneBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); + $stoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); self::register( "stone", $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ @@ -991,7 +992,7 @@ final class VanillaBlocks{ self::register("cracked_stone_bricks", $crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); self::register("chiseled_stone_bricks", $chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); - $infestedStoneBreakInfo = BreakInfo::pickaxe(0.75); + $infestedStoneBreakInfo = new Info(BreakInfo::pickaxe(0.75)); self::register("infested_stone", new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); self::register("infested_stone_brick", new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); self::register("infested_cobblestone", new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); @@ -1009,12 +1010,12 @@ final class VanillaBlocks{ self::register("polished_granite_stairs", new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); self::register("stone_brick_stairs", new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", BreakInfo::pickaxe(0.5))); - self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", BreakInfo::pickaxe(3.5))); - self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); + self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new Info(BreakInfo::pickaxe(0.5)))); + self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new Info(BreakInfo::pickaxe(3.5)))); + self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); //TODO: in the future this won't be the same for all the types - $stoneSlabBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $stoneSlabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); @@ -1046,48 +1047,48 @@ final class VanillaBlocks{ self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); - self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", BreakInfo::pickaxe(3.5, ToolTier::WOOD()))); - self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", BreakInfo::instant())); - self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", BreakInfo::instant())); - self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", BreakInfo::instant())); - self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); - self::register("tall_grass", new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); + self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", new Info(BreakInfo::instant()))); + self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", new Info(BreakInfo::instant()))); + self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", new Info(BreakInfo::instant()))); + self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("tall_grass", new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("blue_torch", new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", BreakInfo::instant())); - self::register("purple_torch", new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", BreakInfo::instant())); - self::register("red_torch", new Torch(new BID(Ids::RED_TORCH), "Red Torch", BreakInfo::instant())); - self::register("green_torch", new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", BreakInfo::instant())); - self::register("torch", new Torch(new BID(Ids::TORCH), "Torch", BreakInfo::instant())); + self::register("blue_torch", new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", new Info(BreakInfo::instant()))); + self::register("purple_torch", new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", new Info(BreakInfo::instant()))); + self::register("red_torch", new Torch(new BID(Ids::RED_TORCH), "Red Torch", new Info(BreakInfo::instant()))); + self::register("green_torch", new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", new Info(BreakInfo::instant()))); + self::register("torch", new Torch(new BID(Ids::TORCH), "Torch", new Info(BreakInfo::instant()))); self::register("trapped_chest", new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); - self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", BreakInfo::instant())); - self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", BreakInfo::instant())); - self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", BreakInfo::instant())); - self::register("vines", new Vine(new BID(Ids::VINES), "Vines", BreakInfo::axe(0.2))); - self::register("water", new Water(new BID(Ids::WATER), "Water", BreakInfo::indestructible(500.0))); - self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", BreakInfo::instant())); + self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", new Info(BreakInfo::instant()))); + self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", new Info(BreakInfo::instant()))); + self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", new Info(BreakInfo::instant()))); + self::register("vines", new Vine(new BID(Ids::VINES), "Vines", new Info(BreakInfo::axe(0.2)))); + self::register("water", new Water(new BID(Ids::WATER), "Water", new Info(BreakInfo::indestructible(500.0)))); + self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", new Info(BreakInfo::instant()))); - $weightedPressurePlateBreakInfo = BreakInfo::pickaxe(0.5, ToolTier::WOOD()); + $weightedPressurePlateBreakInfo = new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())); self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); - self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", BreakInfo::instant())); + self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", new Info(BreakInfo::instant()))); - $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ + $leavesBreakInfo = new Info(new class(0.2, ToolType::HOE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SHEARS){ return 0.0; } return parent::getBreakTime($item); } - }; + }); foreach(TreeType::getAll() as $treeType){ $name = $treeType->getDisplayName(); - self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType)); + self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", new Info(BreakInfo::instant()), $treeType)); self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); } - $sandstoneBreakInfo = BreakInfo::pickaxe(0.8, ToolTier::WOOD()); + $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); @@ -1102,17 +1103,17 @@ final class VanillaBlocks{ self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); - self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", BreakInfo::pickaxe(1.4, ToolTier::WOOD()))); + self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new Info(BreakInfo::pickaxe(1.4, ToolTier::WOOD())))); self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); self::register("stained_clay", new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new BreakInfo(0.1))); - self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", BreakInfo::pickaxe(1.8, ToolTier::WOOD()))); - self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", BreakInfo::shovel(0.5))); - self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ + self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new Info(new BreakInfo(0.1)))); + self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new Info(BreakInfo::pickaxe(1.8, ToolTier::WOOD())))); + self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new Info(BreakInfo::shovel(0.5)))); + self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new Info(new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); if($item->getBlockToolType() === ToolType::SHEARS){ @@ -1121,10 +1122,10 @@ final class VanillaBlocks{ return $time; } - })); + }))); //TODO: in the future these won't all have the same hardness; they only do now because of the old metadata crap - $wallBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $wallBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); @@ -1142,7 +1143,7 @@ final class VanillaBlocks{ self::registerElements(); - $chemistryTableBreakInfo = BreakInfo::pickaxe(2.5, ToolTier::WOOD()); + $chemistryTableBreakInfo = new Info(BreakInfo::pickaxe(2.5, ToolTier::WOOD())); self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); @@ -1155,23 +1156,23 @@ final class VanillaBlocks{ self::register("coral", new Coral( new BID(Ids::CORAL), "Coral", - BreakInfo::instant(), + new Info(BreakInfo::instant()), )); self::register("coral_fan", new FloorCoralFan( new BID(Ids::CORAL_FAN), "Coral Fan", - BreakInfo::instant(), + new Info(BreakInfo::instant()), )); self::register("wall_coral_fan", new WallCoralFan( new BID(Ids::WALL_CORAL_FAN), "Wall Coral Fan", - BreakInfo::instant(), + new Info(BreakInfo::instant()), )); - self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", BreakInfo::axe(0.7))); + self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new Info(BreakInfo::axe(0.7)))); //TODO: muddy mangrove roots are supposed to be axis-rotatable (Bedrock parity issue https://bugs.mojang.com/browse/MCPE-153721) - self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", BreakInfo::shovel(0.7))); - self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new BreakInfo(0.3))); + self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7)))); + self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new Info(new BreakInfo(0.3)))); self::registerBlocksR13(); self::registerBlocksR14(); @@ -1188,12 +1189,12 @@ final class VanillaBlocks{ } private static function registerWoodenBlocks() : void{ - $planksBreakInfo = BreakInfo::axe(2.0, null, 15.0); - $signBreakInfo = BreakInfo::axe(1.0); - $logBreakInfo = BreakInfo::axe(2.0); - $woodenDoorBreakInfo = BreakInfo::axe(3.0, null, 15.0); - $woodenButtonBreakInfo = BreakInfo::axe(0.5); - $woodenPressurePlateBreakInfo = BreakInfo::axe(0.5); + $planksBreakInfo = new Info(BreakInfo::axe(2.0, null, 15.0)); + $signBreakInfo = new Info(BreakInfo::axe(1.0)); + $logBreakInfo = new Info(BreakInfo::axe(2.0)); + $woodenDoorBreakInfo = new Info(BreakInfo::axe(3.0, null, 15.0)); + $woodenButtonBreakInfo = new Info(BreakInfo::axe(0.5)); + $woodenPressurePlateBreakInfo = new Info(BreakInfo::axe(0.5)); foreach(WoodType::getAll() as $woodType){ $name = $woodType->getDisplayName(); @@ -1221,7 +1222,7 @@ final class VanillaBlocks{ } private static function registerMushroomBlocks() : void{ - $mushroomBlockBreakInfo = BreakInfo::axe(0.2); + $mushroomBlockBreakInfo = new Info(BreakInfo::axe(0.2)); self::register("brown_mushroom_block", new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); self::register("red_mushroom_block", new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); @@ -1232,7 +1233,7 @@ final class VanillaBlocks{ } private static function registerElements() : void{ - $instaBreak = BreakInfo::instant(); + $instaBreak = new Info(BreakInfo::instant()); self::register("element_zero", new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); self::register("element_hydrogen", new Element(new BID(Ids::ELEMENT_HYDROGEN), "Hydrogen", $instaBreak, "h", 1, 5)); @@ -1356,7 +1357,7 @@ final class VanillaBlocks{ } private static function registerOres() : void{ - $stoneOreBreakInfo = fn(ToolTier $toolTier) => BreakInfo::pickaxe(3.0, $toolTier); + $stoneOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(3.0, $toolTier)); self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); @@ -1366,7 +1367,7 @@ final class VanillaBlocks{ self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - $deepslateOreBreakInfo = fn(ToolTier $toolTier) => BreakInfo::pickaxe(4.5, $toolTier); + $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(4.5, $toolTier)); self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); @@ -1376,49 +1377,49 @@ final class VanillaBlocks{ self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - $netherrackOreBreakInfo = BreakInfo::pickaxe(3.0, ToolTier::WOOD()); + $netherrackOreBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())); self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); } private static function registerCraftingTables() : void{ //TODO: this is the same for all wooden crafting blocks - $craftingBlockBreakInfo = BreakInfo::axe(2.5); + $craftingBlockBreakInfo = new Info(BreakInfo::axe(2.5)); self::register("cartography_table", new CartographyTable(new BID(Ids::CARTOGRAPHY_TABLE), "Cartography Table", $craftingBlockBreakInfo)); self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); } private static function registerChorusBlocks() : void{ - $chorusBlockBreakInfo = BreakInfo::axe(0.4); + $chorusBlockBreakInfo = new Info(BreakInfo::axe(0.4)); self::register("chorus_plant", new ChorusPlant(new BID(Ids::CHORUS_PLANT), "Chorus Plant", $chorusBlockBreakInfo)); self::register("chorus_flower", new ChorusFlower(new BID(Ids::CHORUS_FLOWER), "Chorus Flower", $chorusBlockBreakInfo)); } private static function registerBlocksR13() : void{ - self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", BreakInfo::indestructible())); - self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", BreakInfo::instant())); + self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", new Info(BreakInfo::indestructible()))); + self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", new Info(BreakInfo::instant()))); } private static function registerBlocksR14() : void{ - self::register("honeycomb", new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new BreakInfo(0.6))); + self::register("honeycomb", new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new Info(new BreakInfo(0.6)))); } private static function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $slabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); - self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", BreakInfo::pickaxe(30, ToolTier::DIAMOND(), 3600.0))); - $netheriteBreakInfo = BreakInfo::pickaxe(50, ToolTier::DIAMOND(), 3600.0); + self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND(), 3600.0)))); + $netheriteBreakInfo = new Info(BreakInfo::pickaxe(50, ToolTier::DIAMOND(), 3600.0)); self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); - $basaltBreakInfo = BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0); + $basaltBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0)); self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - $blackstoneBreakInfo = BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0); + $blackstoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); @@ -1429,8 +1430,8 @@ final class VanillaBlocks{ //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); - self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), BreakInfo::pickaxe(0.5))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), BreakInfo::pickaxe(0.5, ToolTier::WOOD()))); + self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new Info(BreakInfo::pickaxe(0.5)))); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); @@ -1443,69 +1444,69 @@ final class VanillaBlocks{ self::register("polished_blackstone_brick_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); self::register("cracked_polished_blackstone_bricks", new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); - self::register("soul_torch", new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", BreakInfo::instant())); - self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", BreakInfo::instant())); + self::register("soul_torch", new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", new Info(BreakInfo::instant()))); + self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", new Info(BreakInfo::instant()))); //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) - self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", BreakInfo::shovel(1.0))); + self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new Info(BreakInfo::shovel(1.0)))); - self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new BreakInfo(1.0, ToolType::HOE)) extends Opaque{ + self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new Info(new BreakInfo(1.0, ToolType::HOE))) extends Opaque{ public function getLightLevel() : int{ return 15; } }); - self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new BreakInfo(1.0, ToolType::HOE))); - self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND(), 6000.0)) extends Opaque{ + self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); + self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND(), 6000.0))) extends Opaque{ public function getLightLevel() : int{ return 10;} }); } private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", BreakInfo::pickaxe(1.5, ToolTier::WOOD()))); + self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD())))); - self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", BreakInfo::pickaxe(0.75, ToolTier::WOOD()))); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0))); + self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD())))); + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)))); - self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0))); - self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", BreakInfo::pickaxe(5, ToolTier::IRON(), 30.0))); - self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0))); + self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0)))); + self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON(), 30.0)))); + self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0)))); - $deepslateBreakInfo = BreakInfo::pickaxe(3, ToolTier::WOOD(), 18.0); + $deepslateBreakInfo = new Info(BreakInfo::pickaxe(3, ToolTier::WOOD(), 18.0)); self::register("deepslate", new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0))); + self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)))); - $deepslateBrickBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); + $deepslateBrickBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - $deepslateTilesBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); + $deepslateTilesBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - $cobbledDeepslateBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); + $cobbledDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - $polishedDeepslateBreakInfo = BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0); + $polishedDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_wall", new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); - self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new BreakInfo(0.3))); + self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new Info(new BreakInfo(0.3)))); //blast resistance should be 30 if we were matched with java :( - $copperBreakInfo = BreakInfo::pickaxe(3.0, ToolTier::STONE(), 18.0); + $copperBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE(), 18.0)); self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); @@ -1513,27 +1514,27 @@ final class VanillaBlocks{ self::register("cut_copper_slab", new CopperSlab(new BID(Ids::CUT_COPPER_SLAB), "Cut Copper Slab", $copperBreakInfo)); self::register("cut_copper_stairs", new CopperStairs(new BID(Ids::CUT_COPPER_STAIRS), "Cut Copper Stairs", $copperBreakInfo)); - $candleBreakInfo = new BreakInfo(0.1); + $candleBreakInfo = new Info(new BreakInfo(0.1)); self::register("candle", new Candle(new BID(Ids::CANDLE), "Candle", $candleBreakInfo)); self::register("dyed_candle", new DyedCandle(new BID(Ids::DYED_CANDLE), "Dyed Candle", $candleBreakInfo)); //TODO: duplicated break info :( - $cakeBreakInfo = new BreakInfo(0.5); + $cakeBreakInfo = new Info(new BreakInfo(0.5)); self::register("cake_with_candle", new CakeWithCandle(new BID(Ids::CAKE_WITH_CANDLE), "Cake With Candle", $cakeBreakInfo)); self::register("cake_with_dyed_candle", new CakeWithDyedCandle(new BID(Ids::CAKE_WITH_DYED_CANDLE), "Cake With Dyed Candle", $cakeBreakInfo)); - self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", BreakInfo::instant(ToolType::SHEARS, 1))); + self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); } private static function registerBlocksR18() : void{ - self::register("spore_blossom", new SporeBlossom(new BID(Ids::SPORE_BLOSSOM), "Spore Blossom", BreakInfo::instant())); + self::register("spore_blossom", new SporeBlossom(new BID(Ids::SPORE_BLOSSOM), "Spore Blossom", new Info(BreakInfo::instant()))); } private static function registerMudBlocks() : void{ - self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", BreakInfo::shovel(0.5))); - self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", BreakInfo::pickaxe(1.0, null, 15.0))); + self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new Info(BreakInfo::shovel(0.5)))); + self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new Info(BreakInfo::pickaxe(1.0, null, 15.0)))); - $mudBricksBreakInfo = BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0); + $mudBricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); @@ -1542,7 +1543,7 @@ final class VanillaBlocks{ } private static function registerCauldronBlocks() : void{ - $cauldronBreakInfo = BreakInfo::pickaxe(2, ToolTier::WOOD()); + $cauldronBreakInfo = new Info(BreakInfo::pickaxe(2, ToolTier::WOOD())); self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); diff --git a/src/block/Wool.php b/src/block/Wool.php index b3a563a2e3..2cc2b75358 100644 --- a/src/block/Wool.php +++ b/src/block/Wool.php @@ -29,9 +29,9 @@ use pocketmine\block\utils\DyeColor; class Wool extends Opaque{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getFlameEncouragement() : int{ diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 3d47b64efc..33dba4d20a 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -25,6 +25,7 @@ namespace pocketmine\block\utils; use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockIdentifier; +use pocketmine\block\BlockTypeInfo; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Axe; @@ -40,9 +41,9 @@ trait CopperTrait{ private CopperOxidation $oxidation; private bool $waxed = false; - public function __construct(BlockIdentifier $identifier, string $name, BlockBreakInfo $breakInfo){ + public function __construct(BlockIdentifier $identifier, string $name, BlockTypeInfo $typeInfo){ $this->oxidation = CopperOxidation::NONE(); - parent::__construct($identifier, $name, $breakInfo); + parent::__construct($identifier, $name, $typeInfo); } public function getRequiredTypeDataBits() : int{ return 3; } diff --git a/src/block/utils/WoodTypeTrait.php b/src/block/utils/WoodTypeTrait.php index 0ecd4e6f1c..d5c9ee0fc9 100644 --- a/src/block/utils/WoodTypeTrait.php +++ b/src/block/utils/WoodTypeTrait.php @@ -25,13 +25,14 @@ namespace pocketmine\block\utils; use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockIdentifier; +use pocketmine\block\BlockTypeInfo; trait WoodTypeTrait{ private WoodType $woodType; //immutable for now - public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, WoodType $woodType){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, WoodType $woodType){ $this->woodType = $woodType; - parent::__construct($idInfo, $name, $breakInfo); + parent::__construct($idInfo, $name, $typeInfo); } public function getWoodType() : WoodType{ diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index c5df95c402..69848492ed 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -43,7 +43,7 @@ class BlockTest extends TestCase{ * Test registering a block which would overwrite another block, without forcing it */ public function testAccidentalOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", new BlockTypeInfo(BlockBreakInfo::instant())); $this->expectException(\InvalidArgumentException::class); $this->blockFactory->register($block); } @@ -52,7 +52,7 @@ class BlockTest extends TestCase{ * Test registering a block deliberately overwriting another block works as expected */ public function testDeliberateOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", BlockBreakInfo::instant()); + $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", new BlockTypeInfo(BlockBreakInfo::instant())); $this->blockFactory->register($block, true); self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromStateId($block->getStateId())); } @@ -63,7 +63,7 @@ class BlockTest extends TestCase{ public function testRegisterNewBlock() : void{ for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", BlockBreakInfo::instant()); + $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); $this->blockFactory->register($b); self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); return; @@ -78,7 +78,7 @@ class BlockTest extends TestCase{ */ public function testRegisterIdTooSmall() : void{ self::expectException(\InvalidArgumentException::class); - $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1), "Out Of Bounds Block", BlockBreakInfo::instant())); + $this->blockFactory->register(new OutOfBoundsBlock(new BlockIdentifier(-1), "Out Of Bounds Block", new BlockTypeInfo(BlockBreakInfo::instant()))); } /** From 817591910b7876047ddd2de3ab62d72f2087b856 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jul 2022 21:01:49 +0100 Subject: [PATCH 0379/1858] Fix CS --- src/block/VanillaBlocks.php | 2 +- src/block/utils/CopperTrait.php | 1 - src/block/utils/WoodTypeTrait.php | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 0f2532f8a2..dbe3383bf8 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\BlockTypeInfo as Info; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockToolType as ToolType; use pocketmine\block\BlockTypeIds as Ids; +use pocketmine\block\BlockTypeInfo as Info; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\tile\Beacon as TileBeacon; diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 33dba4d20a..51d269b427 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockIdentifier; use pocketmine\block\BlockTypeInfo; use pocketmine\data\runtime\RuntimeDataReader; diff --git a/src/block/utils/WoodTypeTrait.php b/src/block/utils/WoodTypeTrait.php index d5c9ee0fc9..b2e023ad90 100644 --- a/src/block/utils/WoodTypeTrait.php +++ b/src/block/utils/WoodTypeTrait.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\block\BlockBreakInfo; use pocketmine\block\BlockIdentifier; use pocketmine\block\BlockTypeInfo; From d9b050fb688155ec962f574388eb48342fc8f9d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 00:08:02 +0100 Subject: [PATCH 0380/1858] First look at using (very) basic tags for dynamic block properties this allows plugins to, for example, add their own custom dirt-like blocks which support having flowers placed on them. --- src/block/Bamboo.php | 9 +--- src/block/BambooSapling.php | 9 +--- src/block/Block.php | 29 +++++++++-- src/block/BlockTypeInfo.php | 18 ++++++- src/block/BlockTypeTags.php | 32 ++++++++++++ src/block/Cactus.php | 10 ++-- src/block/DoublePlant.php | 7 +-- src/block/Flower.php | 5 +- src/block/FlowerPot.php | 9 +--- src/block/Sapling.php | 5 +- src/block/Stem.php | 3 +- src/block/Sugarcane.php | 11 +++- src/block/SweetBerryBush.php | 4 +- src/block/TallGrass.php | 7 +-- src/block/VanillaBlocks.php | 70 ++++++++++++++------------ src/block/WitherRose.php | 21 ++++---- src/world/generator/populator/Tree.php | 7 +-- 17 files changed, 158 insertions(+), 98 deletions(-) create mode 100644 src/block/BlockTypeTags.php diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 948755830b..1481027ff0 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -124,14 +124,7 @@ class Bamboo extends Transparent{ } private function canBeSupportedBy(Block $block) : bool{ - //TODO: tags would be better for this - return - $block instanceof Dirt || - $block instanceof Grass || - $block instanceof Gravel || - $block instanceof Sand || - $block instanceof Mycelium || - $block instanceof Podzol; + return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); } private function seekToTop() : Bamboo{ diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index f388d6e352..2aec4f09b9 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -52,14 +52,7 @@ final class BambooSapling extends Flowable{ } private function canBeSupportedBy(Block $block) : bool{ - //TODO: tags would be better for this - return - $block instanceof Dirt || - $block instanceof Grass || - $block instanceof Gravel || - $block instanceof Sand || - $block instanceof Mycelium || - $block instanceof Podzol; + return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/Block.php b/src/block/Block.php index d6830e4507..21fa23497b 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -56,7 +56,7 @@ class Block{ protected BlockIdentifier $idInfo; protected string $fallbackName; - protected BlockBreakInfo $breakInfo; + protected BlockTypeInfo $typeInfo; protected Position $position; /** @var AxisAlignedBB[]|null */ @@ -68,7 +68,7 @@ class Block{ public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->idInfo = $idInfo; $this->fallbackName = $name; - $this->breakInfo = $typeInfo->getBreakInfo(); + $this->typeInfo = $typeInfo; $this->position = new Position(0, 0, 0, null); } @@ -237,6 +237,25 @@ class Block{ return $this->getStateId() === $other->getStateId(); } + /** + * @return string[] + */ + public function getTypeTags() : array{ + return $this->typeInfo->getTypeTags(); + } + + /** + * Returns whether this block type has the given type tag. Type tags are used as a dynamic way to tag blocks as + * having certain properties, allowing type checks which are more dynamic than hardcoding a bunch of IDs or a bunch + * of instanceof checks. + * + * For example, grass blocks, dirt, farmland, podzol and mycelium are all dirt-like blocks, and support the + * placement of blocks like flowers, so they have a common tag which allows them to be identified as such. + */ + public function hasTypeTag(string $tag) : bool{ + return $this->typeInfo->hasTypeTag($tag); + } + /** * AKA: Block->isPlaceable */ @@ -268,7 +287,7 @@ class Block{ * Returns an object containing information about the destruction requirements of this block. */ public function getBreakInfo() : BlockBreakInfo{ - return $this->breakInfo; + return $this->typeInfo->getBreakInfo(); } /** @@ -412,7 +431,7 @@ class Block{ * @return Item[] */ public function getDrops(Item $item) : array{ - if($this->breakInfo->isToolCompatible($item)){ + if($this->getBreakInfo()->isToolCompatible($item)){ if($this->isAffectedBySilkTouch() && $item->hasEnchantment(VanillaEnchantments::SILK_TOUCH())){ return $this->getSilkTouchDrops($item); } @@ -454,7 +473,7 @@ class Block{ * Returns how much XP will be dropped by breaking this block with the given item. */ public function getXpDropForTool(Item $item) : int{ - if($item->hasEnchantment(VanillaEnchantments::SILK_TOUCH()) || !$this->breakInfo->isToolCompatible($item)){ + if($item->hasEnchantment(VanillaEnchantments::SILK_TOUCH()) || !$this->getBreakInfo()->isToolCompatible($item)){ return 0; } diff --git a/src/block/BlockTypeInfo.php b/src/block/BlockTypeInfo.php index 6f52a310a6..7add260058 100644 --- a/src/block/BlockTypeInfo.php +++ b/src/block/BlockTypeInfo.php @@ -23,11 +23,27 @@ declare(strict_types=1); namespace pocketmine\block; +use function array_fill_keys; +use function array_keys; + final class BlockTypeInfo{ + /** + * @var true[] + * @phpstan-var array + */ + private array $typeTags; public function __construct( private BlockBreakInfo $breakInfo, - ){} + array $typeTags = [] + ){ + $this->typeTags = array_fill_keys($typeTags, true); + } public function getBreakInfo() : BlockBreakInfo{ return $this->breakInfo; } + + /** @return string[] */ + public function getTypeTags() : array{ return array_keys($this->typeTags); } + + public function hasTypeTag(string $tag) : bool{ return isset($this->typeTags[$tag]); } } diff --git a/src/block/BlockTypeTags.php b/src/block/BlockTypeTags.php new file mode 100644 index 0000000000..8bcd4c589a --- /dev/null +++ b/src/block/BlockTypeTags.php @@ -0,0 +1,32 @@ +isSameType($this) || $block->hasTypeTag(BlockTypeTags::SAND); + } + public function onNearbyBlockChange() : void{ - $down = $this->getSide(Facing::DOWN); $world = $this->position->getWorld(); - if($down->getTypeId() !== BlockTypeIds::SAND && $down->getTypeId() !== BlockTypeIds::RED_SAND && !$down->isSameType($this)){ + if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ $world->useBreakOn($this->position); }else{ foreach(Facing::HORIZONTAL as $side){ @@ -131,8 +134,7 @@ class Cactus extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() === BlockTypeIds::SAND || $down->getTypeId() === BlockTypeIds::RED_SAND || $down->isSameType($this)){ + if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ foreach(Facing::HORIZONTAL as $side){ if($this->getSide($side)->isSolid()){ return false; diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 4874826d29..6d6c80f0f4 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -49,8 +49,8 @@ class DoublePlant extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $id = $blockReplace->getSide(Facing::DOWN)->getTypeId(); - if(($id === BlockTypeIds::GRASS || $id === BlockTypeIds::DIRT) && $blockReplace->getSide(Facing::UP)->canBeReplaced()){ + $down = $blockReplace->getSide(Facing::DOWN); + if($down->hasTypeTag(BlockTypeTags::DIRT) && $blockReplace->getSide(Facing::UP)->canBeReplaced()){ $top = clone $this; $top->top = true; $tx->addBlock($blockReplace->position, $this)->addBlock($blockReplace->position->getSide(Facing::UP), $top); @@ -74,7 +74,8 @@ class DoublePlant extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->isValidHalfPlant() || (!$this->top && $this->getSide(Facing::DOWN)->isTransparent())){ + $down = $this->getSide(Facing::DOWN); + if(!$this->isValidHalfPlant() || (!$this->top && !$down->hasTypeTag(BlockTypeTags::DIRT) && !$down->hasTypeTag(BlockTypeTags::MUD))){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Flower.php b/src/block/Flower.php index 0c4f2827fa..fca5dd98fd 100644 --- a/src/block/Flower.php +++ b/src/block/Flower.php @@ -33,7 +33,7 @@ class Flower extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::FARMLAND){ + if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -41,7 +41,8 @@ class Flower extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->isTransparent()){ + $down = $this->getSide(Facing::DOWN); + if(!$down->hasTypeTag(BlockTypeTags::DIRT) && !$down->hasTypeTag(BlockTypeTags::MUD)){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index 757c518503..1c85ea0d85 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -79,14 +79,7 @@ class FlowerPot extends Flowable{ } private function isValidPlant(Block $block) : bool{ - return - $block instanceof Cactus || - $block instanceof DeadBush || - $block instanceof Flower || - $block instanceof RedMushroom || - $block instanceof Sapling || - ($block instanceof TallGrass && $block->getTypeId() === BlockTypeIds::LARGE_FERN); - //TODO: bamboo + return $block->hasTypeTag(BlockTypeTags::POTTABLE_PLANTS); } /** diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 03cde4cbd6..cfe3012234 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -63,7 +63,7 @@ class Sapling extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::FARMLAND){ + if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -81,7 +81,8 @@ class Sapling extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->isTransparent()){ + $down = $this->getSide(Facing::DOWN); + if(!$down->hasTypeTag(BlockTypeTags::DIRT) && !$down->hasTypeTag(BlockTypeTags::MUD)){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Stem.php b/src/block/Stem.php index 175731c9e4..3c7d1d2c30 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -53,8 +53,7 @@ abstract class Stem extends Crops{ } $side = $this->getSide(Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]); - $d = $side->getSide(Facing::DOWN); - if($side->getTypeId() === BlockTypeIds::AIR && ($d->getTypeId() === BlockTypeIds::FARMLAND || $d->getTypeId() === BlockTypeIds::GRASS || $d->getTypeId() === BlockTypeIds::DIRT)){ + if($side->getTypeId() === BlockTypeIds::AIR && $side->getSide(Facing::DOWN)->hasTypeTag(BlockTypeTags::DIRT)){ $ev = new BlockGrowEvent($side, $grow); $ev->call(); if(!$ev->isCancelled()){ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 35c99bcabb..3acaaa367b 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -92,9 +92,16 @@ class Sugarcane extends Flowable{ return false; } + private function canBeSupportedBy(Block $block) : bool{ + return + $block->hasTypeTag(BlockTypeTags::MUD) || + $block->hasTypeTag(BlockTypeTags::DIRT) || + $block->hasTypeTag(BlockTypeTags::SAND); + } + public function onNearbyBlockChange() : void{ $down = $this->getSide(Facing::DOWN); - if($down->isTransparent() && !$down->isSameType($this)){ + if(!$down->isSameType($this) && !$this->canBeSupportedBy($down)){ $this->position->getWorld()->useBreakOn($this->position); } } @@ -118,7 +125,7 @@ class Sugarcane extends Flowable{ $down = $this->getSide(Facing::DOWN); if($down->isSameType($this)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - }elseif($down->getTypeId() === BlockTypeIds::GRASS || $down->getTypeId() === BlockTypeIds::DIRT || $down->getTypeId() === BlockTypeIds::SAND || $down->getTypeId() === BlockTypeIds::RED_SAND || $down->getTypeId() === BlockTypeIds::PODZOL){ + }elseif($this->canBeSupportedBy($down)){ foreach(Facing::HORIZONTAL as $side){ if($down->getSide($side) instanceof Water){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 2c75758e18..f7b8b1c02e 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -73,8 +73,8 @@ class SweetBerryBush extends Flowable{ } protected function canBeSupportedBy(Block $block) : bool{ - $id = $block->getTypeId(); - return $id === BlockTypeIds::GRASS || $id === BlockTypeIds::DIRT || $id === BlockTypeIds::PODZOL; + return $block->getTypeId() !== BlockTypeIds::FARMLAND && //bedrock-specific thing (bug?) + ($block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD)); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index 801a073227..1811aa0e1c 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -38,8 +38,8 @@ class TallGrass extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN)->getTypeId(); - if($down === BlockTypeIds::GRASS || $down === BlockTypeIds::DIRT){ + $down = $this->getSide(Facing::DOWN); + if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -47,7 +47,8 @@ class TallGrass extends Flowable{ } public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->isTransparent()){ //Replace with common break method + $down = $this->getSide(Facing::DOWN); + if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ //Replace with common break method $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index dbe3383bf8..c5c6db1f74 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -28,6 +28,7 @@ use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockToolType as ToolType; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\BlockTypeInfo as Info; +use pocketmine\block\BlockTypeTags as Tags; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\tile\Beacon as TileBeacon; @@ -750,7 +751,7 @@ final class VanillaBlocks{ } return parent::getBreakTime($item); } - }))); + }, [Tags::POTTABLE_PLANTS]))); self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", new Info(BreakInfo::instant()))); $bannerBreakInfo = new Info(BreakInfo::axe(1.0)); @@ -773,8 +774,8 @@ final class VanillaBlocks{ self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); - self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", new Info(BreakInfo::instant()))); - self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new Info(new BreakInfo(0.4)))); + self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); + self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new Info(new BreakInfo(0.4), [Tags::POTTABLE_PLANTS]))); self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new Info(new BreakInfo(0.5)))); self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", new Info(BreakInfo::instant()))); @@ -794,11 +795,11 @@ final class VanillaBlocks{ self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD())))); self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new Info(BreakInfo::axe(2.5)))); self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new Info(BreakInfo::axe(0.2)))); - self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0)))); - self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new Info(BreakInfo::shovel(0.5)))); + self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", new Info(BreakInfo::instant()))); self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", new Info(BreakInfo::instant()))); self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", new Info(BreakInfo::instant()))); @@ -818,22 +819,24 @@ final class VanillaBlocks{ self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0)))); - self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6)))); + self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant()))); self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new Info(BreakInfo::axe(2.5, null, 2.5)))); - self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", new Info(BreakInfo::instant()))); - self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", new Info(BreakInfo::instant()))); - self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", new Info(BreakInfo::instant()))); - self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", new Info(BreakInfo::instant()))); - self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", new Info(BreakInfo::instant()))); - self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", new Info(BreakInfo::instant()))); - self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", new Info(BreakInfo::instant()))); - self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", new Info(BreakInfo::instant()))); - self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", new Info(BreakInfo::instant()))); - self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", new Info(BreakInfo::instant()))); - self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", new Info(BreakInfo::instant()))); - self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", new Info(BreakInfo::instant()))); - self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); + + $flowerTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); + self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", $flowerTypeInfo)); + self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", $flowerTypeInfo)); + self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", $flowerTypeInfo)); + self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", $flowerTypeInfo)); + self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", $flowerTypeInfo)); + self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", $flowerTypeInfo)); + self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", $flowerTypeInfo)); + self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", $flowerTypeInfo)); + self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", $flowerTypeInfo)); + self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", $flowerTypeInfo)); + self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", $flowerTypeInfo)); + self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); + self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", $flowerTypeInfo)); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); @@ -846,9 +849,9 @@ final class VanillaBlocks{ self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new Info(BreakInfo::pickaxe(0.3)))); self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON(), 30.0)))); - $grassBreakInfo = new Info(BreakInfo::shovel(0.6)); - self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", $grassBreakInfo)); - self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", $grassBreakInfo)); + $grassBreakInfo = BreakInfo::shovel(0.6); + self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", new Info($grassBreakInfo, [Tags::DIRT]))); + self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", new Info($grassBreakInfo))); self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new Info(BreakInfo::shovel(0.6)))); $hardenedClayBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0)); @@ -889,7 +892,7 @@ final class VanillaBlocks{ self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new Info(BreakInfo::axe(1.0)))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", new Info(BreakInfo::instant()))); self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); - self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new Info(BreakInfo::shovel(0.6)))); + self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); $netherBrickBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); @@ -908,7 +911,7 @@ final class VanillaBlocks{ self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new Info(BreakInfo::axe(0.8)))); self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND(), 6000.0)))); self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new Info(BreakInfo::pickaxe(0.5)))); - self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new Info(BreakInfo::shovel(0.5)))); + self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", new Info(BreakInfo::instant()))); self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); @@ -943,7 +946,7 @@ final class VanillaBlocks{ self::register("smooth_quartz_stairs", new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); - self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", new Info(BreakInfo::instant()))); + self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0)))); self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", new Info(BreakInfo::instant()))); self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new Info(new BreakInfo(0.3)))); @@ -952,9 +955,9 @@ final class VanillaBlocks{ self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", new Info(BreakInfo::instant()))); self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", new Info(BreakInfo::instant()))); - $sandBreakInfo = new Info(BreakInfo::shovel(0.5)); - self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandBreakInfo)); - self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandBreakInfo)); + $sandTypeInfo = new Info(BreakInfo::shovel(0.5), [Tags::SAND]); + self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandTypeInfo)); + self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandTypeInfo)); self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new Info(new BreakInfo(0.3)))); self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); @@ -1051,7 +1054,7 @@ final class VanillaBlocks{ self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", new Info(BreakInfo::instant()))); self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", new Info(BreakInfo::instant()))); self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", new Info(BreakInfo::instant()))); - self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); self::register("tall_grass", new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("blue_torch", new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", new Info(BreakInfo::instant()))); @@ -1081,10 +1084,11 @@ final class VanillaBlocks{ return parent::getBreakTime($item); } }); + $saplingTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); foreach(TreeType::getAll() as $treeType){ $name = $treeType->getDisplayName(); - self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", new Info(BreakInfo::instant()), $treeType)); + self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", $saplingTypeInfo, $treeType)); self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); } @@ -1171,7 +1175,7 @@ final class VanillaBlocks{ self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new Info(BreakInfo::axe(0.7)))); //TODO: muddy mangrove roots are supposed to be axis-rotatable (Bedrock parity issue https://bugs.mojang.com/browse/MCPE-153721) - self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7)))); + self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new Info(new BreakInfo(0.3)))); self::registerBlocksR13(); @@ -1397,7 +1401,7 @@ final class VanillaBlocks{ private static function registerBlocksR13() : void{ self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", new Info(BreakInfo::indestructible()))); - self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", new Info(BreakInfo::instant()))); + self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); } private static function registerBlocksR14() : void{ @@ -1531,7 +1535,7 @@ final class VanillaBlocks{ } private static function registerMudBlocks() : void{ - self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new Info(BreakInfo::shovel(0.5)))); + self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new Info(BreakInfo::shovel(0.5), [Tags::MUD]))); self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new Info(BreakInfo::pickaxe(1.0, null, 15.0)))); $mudBricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); diff --git a/src/block/WitherRose.php b/src/block/WitherRose.php index a5c64592f8..696b261150 100644 --- a/src/block/WitherRose.php +++ b/src/block/WitherRose.php @@ -36,18 +36,15 @@ use pocketmine\world\BlockTransaction; class WitherRose extends Flowable{ private function canBeSupportedBy(Block $block) : bool{ - return match($block->getTypeId()){ - BlockTypeIds::GRASS, - BlockTypeIds::DIRT, - BlockTypeIds::FARMLAND, - BlockTypeIds::MYCELIUM, - BlockTypeIds::PODZOL, - BlockTypeIds::NETHERRACK, - BlockTypeIds::SOUL_SAND, - BlockTypeIds::SOUL_SOIL => true, - //TODO: moss, mud, rooted dirt - default => false - }; + return + $block->hasTypeTag(BlockTypeTags::DIRT) || + $block->hasTypeTag(BlockTypeTags::MUD) || + match($block->getTypeId()){ + BlockTypeIds::NETHERRACK, + BlockTypeIds::SOUL_SAND, + BlockTypeIds::SOUL_SOIL => true, + default => false + }; } public function onNearbyBlockChange() : void{ diff --git a/src/world/generator/populator/Tree.php b/src/world/generator/populator/Tree.php index 7b191a9f05..b98af52eec 100644 --- a/src/world/generator/populator/Tree.php +++ b/src/world/generator/populator/Tree.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\generator\populator; use pocketmine\block\BlockTypeIds; +use pocketmine\block\BlockTypeTags; use pocketmine\block\utils\TreeType; use pocketmine\utils\Random; use pocketmine\world\ChunkManager; @@ -67,10 +68,10 @@ class Tree implements Populator{ private function getHighestWorkableBlock(ChunkManager $world, int $x, int $z) : int{ for($y = 127; $y >= 0; --$y){ - $b = $world->getBlockAt($x, $y, $z)->getTypeId(); - if($b === BlockTypeIds::DIRT || $b === BlockTypeIds::GRASS){ + $b = $world->getBlockAt($x, $y, $z); + if($b->hasTypeTag(BlockTypeTags::DIRT) || $b->hasTypeTag(BlockTypeTags::MUD)){ return $y + 1; - }elseif($b !== BlockTypeIds::AIR && $b !== BlockTypeIds::SNOW_LAYER){ + }elseif($b->getTypeId() !== BlockTypeIds::AIR && $b->getTypeId() !== BlockTypeIds::SNOW_LAYER){ return -1; } } From e3640907ba9bb1601f1b2ec21753593070b6d496 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 00:14:17 +0100 Subject: [PATCH 0381/1858] fix PHPStan --- src/block/BlockTypeInfo.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/block/BlockTypeInfo.php b/src/block/BlockTypeInfo.php index 7add260058..eb6b89ad1a 100644 --- a/src/block/BlockTypeInfo.php +++ b/src/block/BlockTypeInfo.php @@ -33,6 +33,9 @@ final class BlockTypeInfo{ */ private array $typeTags; + /** + * @param string[] $typeTags + */ public function __construct( private BlockBreakInfo $breakInfo, array $typeTags = [] From f4de4bd9713f14b2d2d7f980c07dfd553f5260ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 21:41:40 +0100 Subject: [PATCH 0382/1858] Fixed FloatingTextParticle merge error --- src/world/particle/FloatingTextParticle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index f5d0536ad0..811d2ddacb 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -94,7 +94,7 @@ class FloatingTextParticle implements Particle{ EntityMetadataProperties::BOUNDING_BOX_WIDTH => new FloatMetadataProperty(0.0), EntityMetadataProperties::BOUNDING_BOX_HEIGHT => new FloatMetadataProperty(0.0), EntityMetadataProperties::NAMETAG => new StringMetadataProperty($name), - EntityMetadataProperties::VARIANT => new IntMetadataProperty(RuntimeBlockMapping::getInstance()->toRuntimeId(VanillaBlocks::AIR()->getFullId())), + EntityMetadataProperties::VARIANT => new IntMetadataProperty(RuntimeBlockMapping::getInstance()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), EntityMetadataProperties::ALWAYS_SHOW_NAMETAG => new ByteMetadataProperty(1), ]; $p[] = AddActorPacket::create( From 6ba3b3954148b8a2b443628b4219d0356394fbbf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 21:57:51 +0100 Subject: [PATCH 0383/1858] Added tests for BlockTypeIds and ItemTypeIds --- tests/phpunit/block/BlockTypeIdsTest.php | 46 ++++++++++++++++++++++++ tests/phpunit/item/ItemTypeIdsTest.php | 46 ++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/phpunit/block/BlockTypeIdsTest.php create mode 100644 tests/phpunit/item/ItemTypeIdsTest.php diff --git a/tests/phpunit/block/BlockTypeIdsTest.php b/tests/phpunit/block/BlockTypeIdsTest.php new file mode 100644 index 0000000000..5d38c740ad --- /dev/null +++ b/tests/phpunit/block/BlockTypeIdsTest.php @@ -0,0 +1,46 @@ +getConstants(); + unset($constants['FIRST_UNUSED_BLOCK_ID']); + + self::assertSame($reflect->getConstant('FIRST_UNUSED_BLOCK_ID'), max($constants) + 1, "FIRST_UNUSED_BLOCK_ID must be one higher than the highest fixed type ID"); + } + + public function testNoDuplicates() : void{ + $idTable = (new \ReflectionClass(BlockTypeIds::class))->getConstants(); + + self::assertSameSize($idTable, array_unique($idTable), "Every BlockTypeID must be unique"); + } +} diff --git a/tests/phpunit/item/ItemTypeIdsTest.php b/tests/phpunit/item/ItemTypeIdsTest.php new file mode 100644 index 0000000000..a5394bcbb7 --- /dev/null +++ b/tests/phpunit/item/ItemTypeIdsTest.php @@ -0,0 +1,46 @@ +getConstants(); + unset($constants['FIRST_UNUSED_ITEM_ID']); + + self::assertSame($reflect->getConstant('FIRST_UNUSED_ITEM_ID'), max($constants) + 1, "FIRST_UNUSED_ITEM_ID must be one higher than the highest fixed type ID"); + } + + public function testNoDuplicates() : void{ + $idTable = (new \ReflectionClass(ItemTypeIds::class))->getConstants(); + + self::assertSameSize($idTable, array_unique($idTable), "Every ItemTypeID must be unique"); + } +} From 79125b8426c4ad63c10ea3ffc8e1cd673f2d726a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 22:02:47 +0100 Subject: [PATCH 0384/1858] Added APIs to get a new unique block/item type ID this centralization is needed to avoid conflicts between different plugins fighting over the same hardcoded IDs. --- src/block/BlockTypeIds.php | 9 +++++++++ src/item/ItemTypeIds.php | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index ddbb4b48a3..487700ac0a 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -706,4 +706,13 @@ final class BlockTypeIds{ public const FROGLIGHT = 10679; public const FIRST_UNUSED_BLOCK_ID = 10680; + + private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; + + /** + * Returns a new runtime block type ID, e.g. for use by a custom block. + */ + public static function newId() : int{ + return self::$nextDynamicId++; + } } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index d82f236421..06ee39be46 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -298,4 +298,13 @@ final class ItemTypeIds{ public const LINGERING_POTION = 20259; public const FIRST_UNUSED_ITEM_ID = 20260; + + private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; + + /** + * Returns a new runtime item type ID, e.g. for use by a custom item. + */ + public static function newId() : int{ + return self::$nextDynamicId++; + } } From 723ae9eca08dd74e1706b4d02e964b9c6c086cd1 Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 27 Jul 2022 03:43:05 +0200 Subject: [PATCH 0385/1858] Fixed tallgrass being unplaceable since d9b050fb688155ec962f574388eb48342fc8f9d1 (#5197) --- src/block/TallGrass.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index 1811aa0e1c..e8f533325a 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -37,9 +37,12 @@ class TallGrass extends Flowable{ return true; } + private function canBeSupportedBy(Block $block) : bool{ + return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); + } + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ + if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -47,8 +50,7 @@ class TallGrass extends Flowable{ } public function onNearbyBlockChange() : void{ - $down = $this->getSide(Facing::DOWN); - if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ //Replace with common break method + if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ //Replace with common break method $this->position->getWorld()->useBreakOn($this->position); } } From f1c571a528b2a5aa966b5601e52aca71aced23a3 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Fri, 12 Aug 2022 15:10:31 -0500 Subject: [PATCH 0386/1858] WaterCauldron: fixed dye not being cleared when using water bottles or buckets, close #5221 (#5222) --- src/block/WaterCauldron.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index f346ac4a0c..8b5aa03302 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -125,7 +125,7 @@ final class WaterCauldron extends FillableCauldron{ $item->pop(); }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion if($item->getType()->equals(PotionType::WATER())){ - $this->addFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); + $this->setCustomWaterColor(null)->addFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); }else{ $this->mix($item, VanillaItems::GLASS_BOTTLE(), $returnedItems); } @@ -169,7 +169,7 @@ final class WaterCauldron extends FillableCauldron{ } }else{ match($item->getTypeId()){ - ItemTypeIds::WATER_BUCKET => $this->addFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::BUCKET(), $returnedItems), + ItemTypeIds::WATER_BUCKET => $this->setCustomWaterColor(null)->addFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::BUCKET(), $returnedItems), ItemTypeIds::BUCKET => $this->removeFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::WATER_BUCKET(), $returnedItems), ItemTypeIds::GLASS_BOTTLE => $this->removeFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::POTION()->setType(PotionType::WATER()), $returnedItems), ItemTypeIds::LAVA_BUCKET, ItemTypeIds::POWDER_SNOW_BUCKET => $this->mix($item, VanillaItems::BUCKET(), $returnedItems), From bf4f6e5d533e4bda3f3b9759990b3cd99f995046 Mon Sep 17 00:00:00 2001 From: Colin Date: Sun, 14 Aug 2022 18:37:55 +0200 Subject: [PATCH 0387/1858] Bamboo: fixed supporting block requirements (#5196) --- src/block/Bamboo.php | 6 +++++- src/block/BambooSapling.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 1481027ff0..2f26406297 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -124,7 +124,11 @@ class Bamboo extends Transparent{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); + return + $block->getTypeId() === BlockTypeIds::GRAVEL || + $block->hasTypeTag(BlockTypeTags::DIRT) || + $block->hasTypeTag(BlockTypeTags::MUD) || + $block->hasTypeTag(BlockTypeTags::SAND); } private function seekToTop() : Bamboo{ diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 2aec4f09b9..b3eba99fff 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -52,7 +52,11 @@ final class BambooSapling extends Flowable{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); + return + $block->getTypeId() === BlockTypeIds::GRAVEL || + $block->hasTypeTag(BlockTypeTags::DIRT) || + $block->hasTypeTag(BlockTypeTags::MUD) || + $block->hasTypeTag(BlockTypeTags::SAND); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ From d4f96a155a06b442c6e9ef7eeb53983aa3e05e24 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 14 Aug 2022 18:53:01 +0100 Subject: [PATCH 0388/1858] Support axis rotation of Muddy Mangrove Roots (implemented in 1.19.20) --- src/block/VanillaBlocks.php | 5 ++--- .../block/convert/BlockObjectToBlockStateSerializer.php | 4 ++-- .../block/convert/BlockStateToBlockObjectDeserializer.php | 4 ++-- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index c5c6db1f74..53458fbd9d 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -500,7 +500,7 @@ use function mb_strtolower; * @method static Stair MOSSY_STONE_BRICK_STAIRS() * @method static Wall MOSSY_STONE_BRICK_WALL() * @method static Opaque MUD() - * @method static Transparent MUDDY_MANGROVE_ROOTS() + * @method static SimplePillar MUDDY_MANGROVE_ROOTS() * @method static Opaque MUD_BRICKS() * @method static Slab MUD_BRICK_SLAB() * @method static Stair MUD_BRICK_STAIRS() @@ -1174,8 +1174,7 @@ final class VanillaBlocks{ )); self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new Info(BreakInfo::axe(0.7)))); - //TODO: muddy mangrove roots are supposed to be axis-rotatable (Bedrock parity issue https://bugs.mojang.com/browse/MCPE-153721) - self::register("muddy_mangrove_roots", new Transparent(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); + self::register("muddy_mangrove_roots", new SimplePillar(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new Info(new BreakInfo(0.3)))); self::registerBlocksR13(); diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php index 58ec6aa8d5..ffe792116d 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php @@ -1114,8 +1114,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::MUD_BRICK_SLAB(), Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::MUD_BRICK_STAIRS(), Ids::MUD_BRICK_STAIRS); $this->map(Blocks::MUD_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::MUD_BRICK_WALL))); - $this->map(Blocks::MUDDY_MANGROVE_ROOTS(), fn() => Writer::create(Ids::MUDDY_MANGROVE_ROOTS) - ->writePillarAxis(Axis::Y)); //TODO + $this->map(Blocks::MUDDY_MANGROVE_ROOTS(), fn(SimplePillar $block) => Writer::create(Ids::MUDDY_MANGROVE_ROOTS) + ->writePillarAxis($block->getAxis())); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 196475df73..adb9fe368a 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -912,8 +912,8 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS()); $this->map(Ids::MUD_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MUD_BRICK_WALL(), $in)); $this->map(Ids::MUDDY_MANGROVE_ROOTS, function(Reader $in) : Block{ - $in->todo(StateNames::PILLAR_AXIS); - return Blocks::MUDDY_MANGROVE_ROOTS(); + return Blocks::MUDDY_MANGROVE_ROOTS() + ->setAxis($in->readPillarAxis()); }); $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 1b4ce3d406..acb664eb81 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From eeb95872ea54c18404c283be030d295248ac0572 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 14 Aug 2022 20:12:24 +0100 Subject: [PATCH 0389/1858] Release 5.0.0-ALPHA3 --- changelogs/5.0-alpha.md | 93 +++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 3e3c1340f2..5b2e362345 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -420,3 +420,96 @@ Released 14th July 2022. - The following classes have been added: - `CopperWaxApplySound` - `CopperWaxRemoveSound` + +# 5.0.0-ALPHA3 +Released 14th August 2022. + +## Core +- Support for Bedrock 1.19.20. +- Dropped support for Bedrock versions older than 1.19.20. +- Improved performance of dropping block inventory contents when the block is destroyed. + +## Fixes +- Fixed errors when loading air itemstacks from PM4 worlds. These weren't supposed to exist (vanilla doesn't save them), but they were present in older PM worlds due to a bug in older versions. +- Fixed server crash when discovering unknown blocks in non-leveldb worlds during conversion. +- Fixed crimson / warped planks being usable as furnace fuel. + +## Gameplay +### Blocks +- Added the following new blocks: + - Cauldron + - Chorus Flower + - Chorus Plant + - Froglight (pearlescent, verdant, ochre) + - Mangrove Roots + - Muddy Mangrove Roots + - Rooted Dirt + - Spore Blossom +- Fixed lava setting entities on fire for an incorrect duration (Java vs Bedrock inconsistency). + +### Items +- Glass bottles can now be filled with water by clicking on a water source block. + +## API +### `pocketmine\block` +#### Highlights +- Introduced "type tags" concept, which allows marking certain blocks as having certain behaviours. + - The idea for this system was borrowed from the Minecraft Java tags system. + - It's still in very early concept stage, but is currently used for deciding which types of blocks plants can be placed on without needing to enumerate every single ID in every class, eliminating a bunch of boilerplate code and improving consistency. +- All `Block` descendents now accept `BlockTypeInfo` in the constructor, instead of `BlockBreakInfo`. + - This allows for future additions without needing to change dozens of overridden constructors. +- Dynamic type and state property serialization now each use a single, unified method (`describeType` and `describeState` respectively) which accept `RuntimeDataReader|RuntimeDataWriter`, instead of separate decode/encode methods. + - This simplifies implementing new blocks and avoids duplication of information. +- `&$returnedItems` reference parameter is now used in some places to enable actions to return items to players without caring about whether they are in creative or anything else. + - This eliminates boilerplate code of deciding whether to set the player's held item or not, as well as automatically dropping any overflow items that don't fit into the inventory. + - This is currently used when filling/emptying cauldrons using buckets or glass bottles. +- `BlockTypeIds` now exposes `newId()` static method to ease addition of custom blocks. + +#### Changes +- The following API methods have signature changes: + - `Block->onInteract()` now accepts `array &$returnedItems` reference parameter. + - `Block->onBreak()` now accepts `array &$returnedItems` reference parameter. + - `Block->readStateFromWorld()` now returns `Block`. + - This allows blocks to replace themselves with a different block entirely based on world conditions. +- The following new classes have been added: + - `BlockTypeInfo` + - `BlockTypeTags` +- The following new API methods have been added: + - `protected Block->describeState(RuntimeDataReader|RuntimeDataWriter $w) : void` - describes to a runtime data reader/writer how to read/write the block's state properties + - `protected Block->describeType(RuntimeDataReader|RuntimeDataWriter $w) : void` - describes to a runtime data reader/writer how to read/write the block's dynamic type properties + - `public Block->getTypeTags() : array` + - `public Block->hasTypeTag(string $tag) : bool` + - `public Spawnable->getRenderUpdateBugWorkaroundStateProperties(Block $block) : array` - allows spawnable tiles to spoof block state properties to work around client-side rendering bugs without actually changing the block server-side + - `public static BlockBreakInfo::axe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::pickaxe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::shovel(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::tier(float $hardness, int $toolType, ToolTier $toolTier, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockTypeIds::newId() : int` - returns a new dynamic block type ID for use by custom blocks + +### `pocketmine\data` +- The following classes have been renamed: + - `LegacyBlockStateMapper` -> `BlockIdMetaUpgrader` +- The following API methods have been added: + - `public BlockDataUpgrader->getIdMetaUpgrader() : BlockIdMetaUpgrader` + - `public BlockIdMetaUpgrader->addIdMetaToStateMapping(string $stringId, int $meta, BlockStateData $stateData) : void` + - `public BlockIdMetaUpgrader->addIntIdToStringIdMapping(int $intId, string $stringId) : void` +- The following API methods have been removed: + - `BlockIdMetaUpgrader->addMapping()` - use `addIdMetaToStateMapping()` (and `addIntIdToStringIdMapping()` if necessary) instead +- `LegacyToStringMap` no longer throws exceptions when adding the same mapping twice if the addition would have no effect. + +### `pocketmine\item` +#### Highlights +- `&$returnedItems` reference parameter is now used in some places to enable actions to return items to players without caring about whether they are in creative or anything else. + - This eliminates boilerplate code of deciding whether to set the player's held item or not, as well as automatically dropping any overflow items that don't fit into the inventory. + - This is used for things like filling/emptying buckets and bottles, and equipping armor. + +#### Changes +- The following new API methods have been added: + - `public Armor->clearCustomColor() : $this` - clears the custom color of an armor item + - `public static ItemTypeIds::newId() : int` - returns a new dynamic item type ID for use by custom items +- The following API methods have signature changes: + - `Item->onAttackEntity()` now accepts `array &$returnedItems` reference parameter. + - `Item->onClickAir()` now accepts `array &$returnedItems` reference parameter. + - `Item->onDestroyBlock()` now accepts `array &$returnedItems` reference parameter. + - `Item->onInteractBlock()` now accepts `array &$returnedItems` reference parameter. + - `Item->onReleaseUsing()` now accepts `array &$returnedItems` reference parameter. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d06ebbdd93..deb4ef9b95 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From cb020988d4a662332fdd60a666a1af99182bf252 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 14 Aug 2022 20:12:25 +0100 Subject: [PATCH 0390/1858] 5.0.0-ALPHA4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index deb4ef9b95..6ea4844ccd 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 304bb84af28d2d8e705636a424518b4338bbbe71 Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 15 Aug 2022 17:26:48 +0200 Subject: [PATCH 0391/1858] BlockFormEvent: Added getCausingBlock() method (#5226) --- src/block/ConcretePowder.php | 16 ++++++++++------ src/block/Liquid.php | 2 +- src/event/block/BlockFormEvent.php | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index cfe2ccec69..8a39daa0d9 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -42,8 +42,8 @@ class ConcretePowder extends Opaque implements Fallable{ } public function onNearbyBlockChange() : void{ - if(($block = $this->checkAdjacentWater()) !== null){ - $ev = new BlockFormEvent($this, $block); + if(($water = $this->getAdjacentWater()) !== null){ + $ev = new BlockFormEvent($this, VanillaBlocks::CONCRETE()->setColor($this->color), $water); $ev->call(); if(!$ev->isCancelled()){ $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); @@ -54,16 +54,20 @@ class ConcretePowder extends Opaque implements Fallable{ } public function tickFalling() : ?Block{ - return $this->checkAdjacentWater(); + if ($this->getAdjacentWater() === null) { + return null; + } + return VanillaBlocks::CONCRETE()->setColor($this->color); } - private function checkAdjacentWater() : ?Block{ + private function getAdjacentWater() : ?Water{ foreach(Facing::ALL as $i){ if($i === Facing::DOWN){ continue; } - if($this->getSide($i) instanceof Water){ - return VanillaBlocks::CONCRETE()->setColor($this->color); + $block = $this->getSide($i); + if($block instanceof Water){ + return $block; } } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index b14457f257..769fc039a7 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -366,7 +366,7 @@ abstract class Liquid extends Transparent{ } protected function liquidCollide(Block $cause, Block $result) : bool{ - $ev = new BlockFormEvent($this, $result); + $ev = new BlockFormEvent($this, $result, $cause); $ev->call(); if(!$ev->isCancelled()){ $world = $this->position->getWorld(); diff --git a/src/event/block/BlockFormEvent.php b/src/event/block/BlockFormEvent.php index 5211e3a0f4..95c4841135 100644 --- a/src/event/block/BlockFormEvent.php +++ b/src/event/block/BlockFormEvent.php @@ -23,10 +23,26 @@ declare(strict_types=1); namespace pocketmine\event\block; +use pocketmine\block\Block; + /** * Called when a new block forms, usually as the result of some action. * This could be things like obsidian forming due to collision of lava and water. */ class BlockFormEvent extends BaseBlockChangeEvent{ + public function __construct( + Block $block, + Block $newState, + private Block $causingBlock + ){ + parent::__construct($block, $newState); + } + + /** + * Returns the block which caused the target block to form into a new state. + */ + public function getCausingBlock() : Block{ + return $this->causingBlock; + } } From 8e97e9dcdaef17037d5028b63e58013a54f3d8ae Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 15 Aug 2022 16:42:51 +0100 Subject: [PATCH 0392/1858] SimpleCommandMap: Enforce command permissions by default (#4681) this resolves many security issues, as well as removing a ton of boilerplate code. It may be desirable to react to permission denied; this can be done by overriding Command->testPermission(), or by using setPermissionMessage() to set a custom permission denied message. --- src/command/PluginCommand.php | 4 ---- src/command/SimpleCommandMap.php | 4 +++- src/command/defaults/BanCommand.php | 4 ---- src/command/defaults/BanIpCommand.php | 4 ---- src/command/defaults/BanListCommand.php | 4 ---- src/command/defaults/ClearCommand.php | 4 ---- src/command/defaults/DefaultGamemodeCommand.php | 4 ---- src/command/defaults/DeopCommand.php | 4 ---- src/command/defaults/DifficultyCommand.php | 4 ---- src/command/defaults/DumpMemoryCommand.php | 4 ---- src/command/defaults/EffectCommand.php | 4 ---- src/command/defaults/EnchantCommand.php | 4 ---- src/command/defaults/GamemodeCommand.php | 4 ---- src/command/defaults/GarbageCollectorCommand.php | 4 ---- src/command/defaults/GiveCommand.php | 4 ---- src/command/defaults/HelpCommand.php | 4 ---- src/command/defaults/KickCommand.php | 4 ---- src/command/defaults/KillCommand.php | 4 ---- src/command/defaults/ListCommand.php | 4 ---- src/command/defaults/MeCommand.php | 4 ---- src/command/defaults/OpCommand.php | 4 ---- src/command/defaults/PardonCommand.php | 4 ---- src/command/defaults/PardonIpCommand.php | 4 ---- src/command/defaults/ParticleCommand.php | 4 ---- src/command/defaults/PluginsCommand.php | 4 ---- src/command/defaults/SaveCommand.php | 4 ---- src/command/defaults/SaveOffCommand.php | 4 ---- src/command/defaults/SaveOnCommand.php | 4 ---- src/command/defaults/SayCommand.php | 4 ---- src/command/defaults/SeedCommand.php | 4 ---- src/command/defaults/SetWorldSpawnCommand.php | 4 ---- src/command/defaults/SpawnpointCommand.php | 4 ---- src/command/defaults/StatusCommand.php | 4 ---- src/command/defaults/StopCommand.php | 4 ---- src/command/defaults/TeleportCommand.php | 4 ---- src/command/defaults/TellCommand.php | 4 ---- src/command/defaults/TimeCommand.php | 3 --- src/command/defaults/TimingsCommand.php | 4 ---- src/command/defaults/TitleCommand.php | 4 ---- src/command/defaults/TransferServerCommand.php | 4 ---- src/command/defaults/VersionCommand.php | 4 ---- src/command/defaults/WhitelistCommand.php | 4 ---- 42 files changed, 3 insertions(+), 164 deletions(-) diff --git a/src/command/PluginCommand.php b/src/command/PluginCommand.php index 07b0999f05..55b8df3ed9 100644 --- a/src/command/PluginCommand.php +++ b/src/command/PluginCommand.php @@ -43,10 +43,6 @@ final class PluginCommand extends Command implements PluginOwned{ return false; } - if(!$this->testPermission($sender)){ - return false; - } - $success = $this->executor->onCommand($sender, $this, $commandLabel, $args); if(!$success && $this->usageMessage !== ""){ diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 429cd3a3b8..89a9d64657 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -202,7 +202,9 @@ class SimpleCommandMap implements CommandMap{ $target->timings->startTiming(); try{ - $target->execute($sender, $sentCommandLabel, $args); + if($target->testPermission($sender)){ + $target->execute($sender, $sentCommandLabel, $args); + } }catch(InvalidCommandSyntaxException $e){ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::commands_generic_usage($target->getUsage()))); }finally{ diff --git a/src/command/defaults/BanCommand.php b/src/command/defaults/BanCommand.php index 734159a209..fc3117ae1b 100644 --- a/src/command/defaults/BanCommand.php +++ b/src/command/defaults/BanCommand.php @@ -45,10 +45,6 @@ class BanCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/BanIpCommand.php b/src/command/defaults/BanIpCommand.php index 13c74888c3..2d8bc0632e 100644 --- a/src/command/defaults/BanIpCommand.php +++ b/src/command/defaults/BanIpCommand.php @@ -46,10 +46,6 @@ class BanIpCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/BanListCommand.php b/src/command/defaults/BanListCommand.php index 5ec515a2b9..606aef9a29 100644 --- a/src/command/defaults/BanListCommand.php +++ b/src/command/defaults/BanListCommand.php @@ -47,10 +47,6 @@ class BanListCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(isset($args[0])){ $args[0] = strtolower($args[0]); if($args[0] === "ips"){ diff --git a/src/command/defaults/ClearCommand.php b/src/command/defaults/ClearCommand.php index 7e4f810658..7acd03ea7c 100644 --- a/src/command/defaults/ClearCommand.php +++ b/src/command/defaults/ClearCommand.php @@ -51,10 +51,6 @@ class ClearCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) > 3){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/DefaultGamemodeCommand.php b/src/command/defaults/DefaultGamemodeCommand.php index 860a7506d6..03eff24819 100644 --- a/src/command/defaults/DefaultGamemodeCommand.php +++ b/src/command/defaults/DefaultGamemodeCommand.php @@ -42,10 +42,6 @@ class DefaultGamemodeCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/DeopCommand.php b/src/command/defaults/DeopCommand.php index a32d941085..eb6cec2688 100644 --- a/src/command/defaults/DeopCommand.php +++ b/src/command/defaults/DeopCommand.php @@ -45,10 +45,6 @@ class DeopCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/DifficultyCommand.php b/src/command/defaults/DifficultyCommand.php index b73204f56b..0bfc384e32 100644 --- a/src/command/defaults/DifficultyCommand.php +++ b/src/command/defaults/DifficultyCommand.php @@ -43,10 +43,6 @@ class DifficultyCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) !== 1){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/DumpMemoryCommand.php b/src/command/defaults/DumpMemoryCommand.php index 83f177e017..3844199a12 100644 --- a/src/command/defaults/DumpMemoryCommand.php +++ b/src/command/defaults/DumpMemoryCommand.php @@ -40,10 +40,6 @@ class DumpMemoryCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $sender->getServer()->getMemoryManager()->dumpServerMemory($args[0] ?? (Path::join($sender->getServer()->getDataPath(), "memory_dumps", date("D_M_j-H.i.s-T_Y"))), 48, 80); return true; } diff --git a/src/command/defaults/EffectCommand.php b/src/command/defaults/EffectCommand.php index 159832bacc..5339f4a5b5 100644 --- a/src/command/defaults/EffectCommand.php +++ b/src/command/defaults/EffectCommand.php @@ -46,10 +46,6 @@ class EffectCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 092ceb006d..64bb146bbf 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -44,10 +44,6 @@ class EnchantCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 1363d34dcf..77fade0b01 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -45,10 +45,6 @@ class GamemodeCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/GarbageCollectorCommand.php b/src/command/defaults/GarbageCollectorCommand.php index 69875c7d5c..c77fd794f7 100644 --- a/src/command/defaults/GarbageCollectorCommand.php +++ b/src/command/defaults/GarbageCollectorCommand.php @@ -43,10 +43,6 @@ class GarbageCollectorCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $chunksCollected = 0; $entitiesCollected = 0; diff --git a/src/command/defaults/GiveCommand.php b/src/command/defaults/GiveCommand.php index 650a262d02..2d465c74c1 100644 --- a/src/command/defaults/GiveCommand.php +++ b/src/command/defaults/GiveCommand.php @@ -51,10 +51,6 @@ class GiveCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/HelpCommand.php b/src/command/defaults/HelpCommand.php index 7fe12e039a..d5a530f56c 100644 --- a/src/command/defaults/HelpCommand.php +++ b/src/command/defaults/HelpCommand.php @@ -55,10 +55,6 @@ class HelpCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ $commandName = ""; $pageNumber = 1; diff --git a/src/command/defaults/KickCommand.php b/src/command/defaults/KickCommand.php index 3ccb2e527c..78767b9dab 100644 --- a/src/command/defaults/KickCommand.php +++ b/src/command/defaults/KickCommand.php @@ -47,10 +47,6 @@ class KickCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index c041e0cbbe..eebabd3d9f 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -47,10 +47,6 @@ class KillCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) >= 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/ListCommand.php b/src/command/defaults/ListCommand.php index 5df3e1a918..d86416f3d9 100644 --- a/src/command/defaults/ListCommand.php +++ b/src/command/defaults/ListCommand.php @@ -45,10 +45,6 @@ class ListCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $playerNames = array_map(function(Player $player) : string{ return $player->getName(); }, array_filter($sender->getServer()->getOnlinePlayers(), function(Player $player) use ($sender) : bool{ diff --git a/src/command/defaults/MeCommand.php b/src/command/defaults/MeCommand.php index 586d6cb39c..33564e9ccb 100644 --- a/src/command/defaults/MeCommand.php +++ b/src/command/defaults/MeCommand.php @@ -44,10 +44,6 @@ class MeCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/OpCommand.php b/src/command/defaults/OpCommand.php index 53cbc7461b..97b483c80f 100644 --- a/src/command/defaults/OpCommand.php +++ b/src/command/defaults/OpCommand.php @@ -45,10 +45,6 @@ class OpCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/PardonCommand.php b/src/command/defaults/PardonCommand.php index a1ea1e6ee5..a545fb3509 100644 --- a/src/command/defaults/PardonCommand.php +++ b/src/command/defaults/PardonCommand.php @@ -43,10 +43,6 @@ class PardonCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) !== 1){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/PardonIpCommand.php b/src/command/defaults/PardonIpCommand.php index d9a229354a..a7adc237de 100644 --- a/src/command/defaults/PardonIpCommand.php +++ b/src/command/defaults/PardonIpCommand.php @@ -44,10 +44,6 @@ class PardonIpCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) !== 1){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/ParticleCommand.php b/src/command/defaults/ParticleCommand.php index 1c9972efba..2c5d1c5d6d 100644 --- a/src/command/defaults/ParticleCommand.php +++ b/src/command/defaults/ParticleCommand.php @@ -84,10 +84,6 @@ class ParticleCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 7){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/PluginsCommand.php b/src/command/defaults/PluginsCommand.php index e4c83354d3..39f86e637e 100644 --- a/src/command/defaults/PluginsCommand.php +++ b/src/command/defaults/PluginsCommand.php @@ -47,10 +47,6 @@ class PluginsCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $list = array_map(function(Plugin $plugin) : string{ return ($plugin->isEnabled() ? TextFormat::GREEN : TextFormat::RED) . $plugin->getDescription()->getFullName(); }, $sender->getServer()->getPluginManager()->getPlugins()); diff --git a/src/command/defaults/SaveCommand.php b/src/command/defaults/SaveCommand.php index 10d036d55c..0fefc573c0 100644 --- a/src/command/defaults/SaveCommand.php +++ b/src/command/defaults/SaveCommand.php @@ -41,10 +41,6 @@ class SaveCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - Command::broadcastCommandMessage($sender, KnownTranslationFactory::pocketmine_save_start()); $start = microtime(true); diff --git a/src/command/defaults/SaveOffCommand.php b/src/command/defaults/SaveOffCommand.php index b4d86d486c..bb13623d72 100644 --- a/src/command/defaults/SaveOffCommand.php +++ b/src/command/defaults/SaveOffCommand.php @@ -39,10 +39,6 @@ class SaveOffCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $sender->getServer()->getWorldManager()->setAutoSave(false); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_save_disabled()); diff --git a/src/command/defaults/SaveOnCommand.php b/src/command/defaults/SaveOnCommand.php index 20504122b7..cb842db9ef 100644 --- a/src/command/defaults/SaveOnCommand.php +++ b/src/command/defaults/SaveOnCommand.php @@ -39,10 +39,6 @@ class SaveOnCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $sender->getServer()->getWorldManager()->setAutoSave(true); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_save_enabled()); diff --git a/src/command/defaults/SayCommand.php b/src/command/defaults/SayCommand.php index 16e681553a..8419d0de2b 100644 --- a/src/command/defaults/SayCommand.php +++ b/src/command/defaults/SayCommand.php @@ -45,10 +45,6 @@ class SayCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/SeedCommand.php b/src/command/defaults/SeedCommand.php index e7345f8baa..af353f87a4 100644 --- a/src/command/defaults/SeedCommand.php +++ b/src/command/defaults/SeedCommand.php @@ -39,10 +39,6 @@ class SeedCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if($sender instanceof Player){ $seed = $sender->getPosition()->getWorld()->getSeed(); }else{ diff --git a/src/command/defaults/SetWorldSpawnCommand.php b/src/command/defaults/SetWorldSpawnCommand.php index 0c0d46c110..928afd86a6 100644 --- a/src/command/defaults/SetWorldSpawnCommand.php +++ b/src/command/defaults/SetWorldSpawnCommand.php @@ -46,10 +46,6 @@ class SetWorldSpawnCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ if($sender instanceof Player){ $location = $sender->getPosition(); diff --git a/src/command/defaults/SpawnpointCommand.php b/src/command/defaults/SpawnpointCommand.php index b5932770a9..de8789e9aa 100644 --- a/src/command/defaults/SpawnpointCommand.php +++ b/src/command/defaults/SpawnpointCommand.php @@ -47,10 +47,6 @@ class SpawnpointCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $target = null; if(count($args) === 0){ diff --git a/src/command/defaults/StatusCommand.php b/src/command/defaults/StatusCommand.php index 7e5f9b544f..67088be9c1 100644 --- a/src/command/defaults/StatusCommand.php +++ b/src/command/defaults/StatusCommand.php @@ -45,10 +45,6 @@ class StatusCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - $mUsage = Process::getAdvancedMemoryUsage(); $server = $sender->getServer(); diff --git a/src/command/defaults/StopCommand.php b/src/command/defaults/StopCommand.php index 664fa3657f..382f99ca06 100644 --- a/src/command/defaults/StopCommand.php +++ b/src/command/defaults/StopCommand.php @@ -39,10 +39,6 @@ class StopCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_stop_start()); $sender->getServer()->shutdown(); diff --git a/src/command/defaults/TeleportCommand.php b/src/command/defaults/TeleportCommand.php index 618ae10a29..5713ef2316 100644 --- a/src/command/defaults/TeleportCommand.php +++ b/src/command/defaults/TeleportCommand.php @@ -59,10 +59,6 @@ class TeleportCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - switch(count($args)){ case 1: // /tp targetPlayer case 3: // /tp x y z diff --git a/src/command/defaults/TellCommand.php b/src/command/defaults/TellCommand.php index bf36d255fa..672e5b74bf 100644 --- a/src/command/defaults/TellCommand.php +++ b/src/command/defaults/TellCommand.php @@ -47,10 +47,6 @@ class TellCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/TimeCommand.php b/src/command/defaults/TimeCommand.php index 49edee2b84..33357e4df0 100644 --- a/src/command/defaults/TimeCommand.php +++ b/src/command/defaults/TimeCommand.php @@ -51,9 +51,6 @@ class TimeCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } if(count($args) < 1){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/TimingsCommand.php b/src/command/defaults/TimingsCommand.php index 14fae62f52..9a5076072f 100644 --- a/src/command/defaults/TimingsCommand.php +++ b/src/command/defaults/TimingsCommand.php @@ -67,10 +67,6 @@ class TimingsCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) !== 1){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/TitleCommand.php b/src/command/defaults/TitleCommand.php index 19218799cf..cf0670608f 100644 --- a/src/command/defaults/TitleCommand.php +++ b/src/command/defaults/TitleCommand.php @@ -44,10 +44,6 @@ class TitleCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 2){ throw new InvalidCommandSyntaxException(); } diff --git a/src/command/defaults/TransferServerCommand.php b/src/command/defaults/TransferServerCommand.php index 5d15c82585..532f0e18cd 100644 --- a/src/command/defaults/TransferServerCommand.php +++ b/src/command/defaults/TransferServerCommand.php @@ -42,10 +42,6 @@ class TransferServerCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) < 1){ throw new InvalidCommandSyntaxException(); }elseif(!($sender instanceof Player)){ diff --git a/src/command/defaults/VersionCommand.php b/src/command/defaults/VersionCommand.php index 9fa6709574..6c579cdda2 100644 --- a/src/command/defaults/VersionCommand.php +++ b/src/command/defaults/VersionCommand.php @@ -53,10 +53,6 @@ class VersionCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 0){ $sender->sendMessage(KnownTranslationFactory::pocketmine_command_version_serverSoftwareName( VersionInfo::NAME diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index 02fd65f23f..2b1a90c53f 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -55,10 +55,6 @@ class WhitelistCommand extends VanillaCommand{ } public function execute(CommandSender $sender, string $commandLabel, array $args){ - if(!$this->testPermission($sender)){ - return true; - } - if(count($args) === 1){ switch(strtolower($args[0])){ case "reload": From 223de3ad232334dfe86d3debe698ed41a8f2d8f9 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Mon, 15 Aug 2022 11:00:58 -0500 Subject: [PATCH 0393/1858] Implement Fire Charge (#5225) --- src/block/TNT.php | 6 +++ src/data/bedrock/item/ItemDeserializer.php | 2 +- src/data/bedrock/item/ItemSerializer.php | 1 + src/item/FireCharge.php | 48 ++++++++++++++++++++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 1 + src/item/VanillaItems.php | 2 + 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/item/FireCharge.php diff --git a/src/block/TNT.php b/src/block/TNT.php index dca4920d31..cf1158a67b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -32,6 +32,7 @@ use pocketmine\item\Durable; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\FlintSteel; use pocketmine\item\Item; +use pocketmine\item\ItemTypeIds; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -82,6 +83,11 @@ class TNT extends Opaque{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item->getTypeId() === ItemTypeIds::FIRE_CHARGE){ + $item->pop(); + $this->ignite(); + return true; + } if($item instanceof FlintSteel || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ if($item instanceof Durable){ $item->applyDamage(1); diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 85d415d6ab..a9012af89a 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -338,7 +338,7 @@ final class ItemDeserializer{ $this->map(Ids::FERMENTED_SPIDER_EYE, fn() => Items::FERMENTED_SPIDER_EYE()); //TODO: minecraft:field_masoned_banner_pattern //TODO: minecraft:filled_map - //TODO: minecraft:fire_charge + $this->map(Ids::FIRE_CHARGE, fn() => Items::FIRE_CHARGE()); //TODO: minecraft:firefly_spawn_egg //TODO: minecraft:firework_rocket //TODO: minecraft:firework_star diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 0c993f2e6a..19754739d4 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -383,6 +383,7 @@ final class ItemSerializer{ $this->map(Items::EXPERIENCE_BOTTLE(), self::id(Ids::EXPERIENCE_BOTTLE)); $this->map(Items::FEATHER(), self::id(Ids::FEATHER)); $this->map(Items::FERMENTED_SPIDER_EYE(), self::id(Ids::FERMENTED_SPIDER_EYE)); + $this->map(Items::FIRE_CHARGE(), self::id(Ids::FIRE_CHARGE)); $this->map(Items::FISHING_ROD(), self::id(Ids::FISHING_ROD)); $this->map(Items::FLINT(), self::id(Ids::FLINT)); $this->map(Items::FLINT_AND_STEEL(), self::id(Ids::FLINT_AND_STEEL)); diff --git a/src/item/FireCharge.php b/src/item/FireCharge.php new file mode 100644 index 0000000000..20e7e4f89e --- /dev/null +++ b/src/item/FireCharge.php @@ -0,0 +1,48 @@ +getTypeId() === BlockTypeIds::AIR){ + $world = $player->getWorld(); + $world->setBlock($blockReplace->getPosition(), VanillaBlocks::FIRE()); + $world->addSound($blockReplace->getPosition()->add(0.5, 0.5, 0.5), new BlazeShootSound()); + + $this->pop(); + + return ItemUseResult::SUCCESS(); + } + + return ItemUseResult::NONE(); + } +} diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 06ee39be46..6f23fb9f80 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -296,8 +296,9 @@ final class ItemTypeIds{ public const NETHERITE_SCRAP = 20257; public const POWDER_SNOW_BUCKET = 20258; public const LINGERING_POTION = 20259; + public const FIRE_CHARGE = 20260; - public const FIRST_UNUSED_ITEM_ID = 20260; + public const FIRST_UNUSED_ITEM_ID = 20261; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a538380ce3..d0bdcb5f9e 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1246,6 +1246,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); + $result->register("fire_charge", fn() => Items::FIRE_CHARGE()); $result->register("fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::FIRE_RESISTANCE())); $result->register("fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::FIRE_RESISTANCE())); $result->register("fish", fn() => Items::RAW_FISH()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index b229039ec9..11129238ef 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -156,6 +156,7 @@ use pocketmine\world\World; * @method static ExperienceBottle EXPERIENCE_BOTTLE() * @method static Item FEATHER() * @method static Item FERMENTED_SPIDER_EYE() + * @method static FireCharge FIRE_CHARGE() * @method static FishingRod FISHING_ROD() * @method static Item FLINT() * @method static FlintSteel FLINT_AND_STEEL() @@ -423,6 +424,7 @@ final class VanillaItems{ self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); self::register("feather", new Item(new IID(Ids::FEATHER), "Feather")); self::register("fermented_spider_eye", new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); + self::register("fire_charge", new FireCharge(new IID(Ids::FIRE_CHARGE), "Fire Charge")); self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); self::register("flint", new Item(new IID(Ids::FLINT), "Flint")); self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); From b65e0f64f6bd5ef25df5e16649715e7e671fdfae Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Tue, 16 Aug 2022 11:26:32 -0500 Subject: [PATCH 0394/1858] Implement Suspicious Stew (#5224) --- build/generate-runtime-enum-serializers.php | 2 + src/data/bedrock/SuspiciousStewTypeIdMap.php | 72 ++++++++++++ src/data/bedrock/SuspiciousStewTypeIds.php | 37 +++++++ src/data/bedrock/item/ItemDeserializer.php | 10 +- src/data/bedrock/item/ItemSerializer.php | 3 + .../runtime/RuntimeEnumDeserializerTrait.php | 16 +++ .../runtime/RuntimeEnumSerializerTrait.php | 16 +++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 6 + src/item/SuspiciousStew.php | 74 +++++++++++++ src/item/SuspiciousStewType.php | 104 ++++++++++++++++++ src/item/VanillaItems.php | 2 + 12 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 src/data/bedrock/SuspiciousStewTypeIdMap.php create mode 100644 src/data/bedrock/SuspiciousStewTypeIds.php create mode 100644 src/item/SuspiciousStew.php create mode 100644 src/item/SuspiciousStewType.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 7118abf414..e3cfc2abee 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -34,6 +34,7 @@ use pocketmine\block\utils\MushroomBlockType; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; use pocketmine\item\PotionType; +use pocketmine\item\SuspiciousStewType; use function array_key_first; use function array_keys; use function array_map; @@ -167,6 +168,7 @@ $enumsUsed = [ MushroomBlockType::getAll(), SkullType::getAll(), SlabType::getAll(), + SuspiciousStewType::getAll(), PotionType::getAll() ]; diff --git a/src/data/bedrock/SuspiciousStewTypeIdMap.php b/src/data/bedrock/SuspiciousStewTypeIdMap.php new file mode 100644 index 0000000000..54c1fdcb9a --- /dev/null +++ b/src/data/bedrock/SuspiciousStewTypeIdMap.php @@ -0,0 +1,72 @@ + + */ + private array $idToEnum; + + /** + * @var int[] + * @phpstan-var array + */ + private array $enumToId; + + private function __construct(){ + $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY()); + $this->register(SuspiciousStewTypeIds::CORNFLOWER, SuspiciousStewType::CORNFLOWER()); + $this->register(SuspiciousStewTypeIds::TULIP, SuspiciousStewType::TULIP()); + $this->register(SuspiciousStewTypeIds::AZURE_BLUET, SuspiciousStewType::AZURE_BLUET()); + $this->register(SuspiciousStewTypeIds::LILY_OF_THE_VALLEY, SuspiciousStewType::LILY_OF_THE_VALLEY()); + $this->register(SuspiciousStewTypeIds::DANDELION, SuspiciousStewType::DANDELION()); + $this->register(SuspiciousStewTypeIds::BLUE_ORCHID, SuspiciousStewType::BLUE_ORCHID()); + $this->register(SuspiciousStewTypeIds::ALLIUM, SuspiciousStewType::ALLIUM()); + $this->register(SuspiciousStewTypeIds::OXEYE_DAISY, SuspiciousStewType::OXEYE_DAISY()); + $this->register(SuspiciousStewTypeIds::WITHER_ROSE, SuspiciousStewType::WITHER_ROSE()); + } + + private function register(int $id, SuspiciousStewType $type) : void{ + $this->idToEnum[$id] = $type; + $this->enumToId[$type->id()] = $id; + } + + public function fromId(int $id) : ?SuspiciousStewType{ + return $this->idToEnum[$id] ?? null; + } + + public function toId(SuspiciousStewType $type) : int{ + if(!isset($this->enumToId[$type->id()])){ + throw new \InvalidArgumentException("Type does not have a mapped ID"); + } + return $this->enumToId[$type->id()]; + } +} diff --git a/src/data/bedrock/SuspiciousStewTypeIds.php b/src/data/bedrock/SuspiciousStewTypeIds.php new file mode 100644 index 0000000000..15025abdee --- /dev/null +++ b/src/data/bedrock/SuspiciousStewTypeIds.php @@ -0,0 +1,37 @@ +map(Ids::STRING, fn() => Items::STRING()); $this->map(Ids::SUGAR, fn() => Items::SUGAR()); $this->map(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()->asItem()); - //TODO: minecraft:suspicious_stew + $this->map(Ids::SUSPICIOUS_STEW, function(Data $data) : Item{ + $meta = $data->getMeta(); + $suspiciousStewType = SuspiciousStewTypeIdMap::getInstance()->fromId($meta); + if($suspiciousStewType === null){ + throw new ItemTypeDeserializeException("Unknown suspicious stew type ID $meta"); + } + return Items::SUSPICIOUS_STEW()->setType($suspiciousStewType); + }); $this->map(Ids::SWEET_BERRIES, fn() => Items::SWEET_BERRIES()); //TODO: minecraft:tadpole_bucket //TODO: minecraft:tadpole_spawn_egg diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 19754739d4..6945eac5ee 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -36,6 +36,7 @@ use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; +use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; use pocketmine\item\Banner; use pocketmine\item\CoralFan; use pocketmine\item\Dye; @@ -43,6 +44,7 @@ use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\Potion; use pocketmine\item\SplashPotion; +use pocketmine\item\SuspiciousStew; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; use function class_parents; @@ -513,6 +515,7 @@ final class ItemSerializer{ $this->map(Items::STONE_SWORD(), self::id(Ids::STONE_SWORD)); $this->map(Items::STRING(), self::id(Ids::STRING)); $this->map(Items::SUGAR(), self::id(Ids::SUGAR)); + $this->map(Items::SUSPICIOUS_STEW(), fn(SuspiciousStew $item) => new Data(Ids::SUSPICIOUS_STEW, SuspiciousStewTypeIdMap::getInstance()->toId($item->getType()))); $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 7bcbd09ed4..bb83e805e9 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -202,4 +202,20 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ + $value = match($this->readInt(4)){ + 0 => \pocketmine\item\SuspiciousStewType::ALLIUM(), + 1 => \pocketmine\item\SuspiciousStewType::AZURE_BLUET(), + 2 => \pocketmine\item\SuspiciousStewType::BLUE_ORCHID(), + 3 => \pocketmine\item\SuspiciousStewType::CORNFLOWER(), + 4 => \pocketmine\item\SuspiciousStewType::DANDELION(), + 5 => \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY(), + 6 => \pocketmine\item\SuspiciousStewType::OXEYE_DAISY(), + 7 => \pocketmine\item\SuspiciousStewType::POPPY(), + 8 => \pocketmine\item\SuspiciousStewType::TULIP(), + 9 => \pocketmine\item\SuspiciousStewType::WITHER_ROSE(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for SuspiciousStewType") + }; + } + } diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index e3bdcbccbb..91deba5e3d 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -202,4 +202,20 @@ trait RuntimeEnumSerializerTrait{ }); } + public function suspiciousStewType(\pocketmine\item\SuspiciousStewType $value) : void{ + $this->int(4, match($value){ + \pocketmine\item\SuspiciousStewType::ALLIUM() => 0, + \pocketmine\item\SuspiciousStewType::AZURE_BLUET() => 1, + \pocketmine\item\SuspiciousStewType::BLUE_ORCHID() => 2, + \pocketmine\item\SuspiciousStewType::CORNFLOWER() => 3, + \pocketmine\item\SuspiciousStewType::DANDELION() => 4, + \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY() => 5, + \pocketmine\item\SuspiciousStewType::OXEYE_DAISY() => 6, + \pocketmine\item\SuspiciousStewType::POPPY() => 7, + \pocketmine\item\SuspiciousStewType::TULIP() => 8, + \pocketmine\item\SuspiciousStewType::WITHER_ROSE() => 9, + default => throw new \pocketmine\utils\AssumptionFailedError("All SuspiciousStewType cases should be covered") + }); + } + } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 6f23fb9f80..a36526acab 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -297,8 +297,9 @@ final class ItemTypeIds{ public const POWDER_SNOW_BUCKET = 20258; public const LINGERING_POTION = 20259; public const FIRE_CHARGE = 20260; + public const SUSPICIOUS_STEW = 20261; - public const FIRST_UNUSED_ITEM_ID = 20261; + public const FIRST_UNUSED_ITEM_ID = 20262; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d0bdcb5f9e..8daf0f87ea 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1118,6 +1118,11 @@ final class StringToItemParser extends StringToTParser{ $result->register($prefix("dye"), fn() => Items::DYE()->setColor($color)); } + foreach(SuspiciousStewType::getAll() as $suspiciousStewType){ + $prefix = fn(string $name) => $suspiciousStewType->name() . "_" . $name; + + $result->register($prefix("suspicious_stew"), fn() => Items::SUSPICIOUS_STEW()->setType($suspiciousStewType)); + } } private static function registerItems(self $result) : void{ @@ -1474,6 +1479,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("strong_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); $result->register("strong_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); $result->register("sugar", fn() => Items::SUGAR()); + $result->register("suspicious_stew", fn() => Items::SUSPICIOUS_STEW()); $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); $result->register("swiftness_potion", fn() => Items::POTION()->setType(PotionType::SWIFTNESS())); $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS())); diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php new file mode 100644 index 0000000000..e6b9895e01 --- /dev/null +++ b/src/item/SuspiciousStew.php @@ -0,0 +1,74 @@ +suspiciousStewType = SuspiciousStewType::POPPY(); + parent::__construct($identifier, $name); + } + + protected function encodeType(RuntimeDataWriter $w) : void{ + $w->suspiciousStewType($this->suspiciousStewType); + } + + public function getType() : SuspiciousStewType{ return $this->suspiciousStewType; } + + /** + * @return $this + */ + public function setType(SuspiciousStewType $type) : self{ + $this->suspiciousStewType = $type; + return $this; + } + + public function getMaxStackSize() : int{ + return 1; + } + + public function requiresHunger() : bool{ + return false; + } + + public function getFoodRestore() : int{ + return 6; + } + + public function getSaturationRestore() : float{ + return 7.2; + } + + public function getAdditionalEffects() : array{ + return $this->suspiciousStewType->getEffects(); + } + + public function getResidue() : Item{ + return VanillaItems::BOWL(); + } +} diff --git a/src/item/SuspiciousStewType.php b/src/item/SuspiciousStewType.php new file mode 100644 index 0000000000..27209b5731 --- /dev/null +++ b/src/item/SuspiciousStewType.php @@ -0,0 +1,104 @@ + [ + new EffectInstance(VanillaEffects::NIGHT_VISION(), 80) + ]), + new self("cornflower", fn() => [ + new EffectInstance(VanillaEffects::JUMP_BOOST(), 80) + ]), + new self("tulip", fn() => [ + new EffectInstance(VanillaEffects::WEAKNESS(), 140) + ]), + new self("azure_bluet", fn() => [ + new EffectInstance(VanillaEffects::BLINDNESS(), 120) + ]), + new self("lily_of_the_valley", fn() => [ + new EffectInstance(VanillaEffects::POISON(), 200) + ]), + new self("dandelion", fn() => [ + new EffectInstance(VanillaEffects::SATURATION(), 6) + ]), + new self("blue_orchid", fn() => [ + new EffectInstance(VanillaEffects::SATURATION(), 6) + ]), + new self("allium", fn() => [ + new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 40) + ]), + new self("oxeye_daisy", fn() => [ + new EffectInstance(VanillaEffects::REGENERATION(), 120) + ]), + new self("wither_rose", fn() => [ + new EffectInstance(VanillaEffects::WITHER(), 120) + ]) + ); + } + + /** + * @phpstan-param \Closure() : list $effectsGetter + */ + private function __construct( + string $enumName, + private \Closure $effectsGetter + ){ + $this->Enum___construct($enumName); + } + + /** + * @return EffectInstance[] + * @phpstan-return list + */ + public function getEffects() : array{ + return ($this->effectsGetter)(); + } +} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 11129238ef..d7091041e7 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -286,6 +286,7 @@ use pocketmine\world\World; * @method static Sword STONE_SWORD() * @method static StringItem STRING() * @method static Item SUGAR() + * @method static SuspiciousStew SUSPICIOUS_STEW() * @method static SweetBerries SWEET_BERRIES() * @method static Totem TOTEM() * @method static SpawnEgg VILLAGER_SPAWN_EGG() @@ -518,6 +519,7 @@ final class VanillaItems{ self::register("stick", new Stick(new IID(Ids::STICK), "Stick")); self::register("string", new StringItem(new IID(Ids::STRING), "String")); self::register("sugar", new Item(new IID(Ids::SUGAR), "Sugar")); + self::register("suspicious_stew", new SuspiciousStew(new IID(Ids::SUSPICIOUS_STEW), "Suspicious Stew")); self::register("sweet_berries", new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); self::register("totem", new Totem(new IID(Ids::TOTEM), "Totem of Undying")); self::register("warped_sign", new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); From 6e8f11d5e8585d50bb9a5f02af4bfd8ae0b5b25a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 Aug 2022 17:42:18 +0100 Subject: [PATCH 0395/1858] UnknownBlock: fixed type data encoding --- src/block/UnknownBlock.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 02b125e982..75afd32b21 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -36,6 +36,8 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } + public function getRequiredTypeDataBits() : int{ return Block::INTERNAL_STATE_DATA_BITS; } + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block From 2b7510945a3efd97836ae85cc08bfe44581169a9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 18 Aug 2022 17:38:57 +0100 Subject: [PATCH 0396/1858] First look at ItemStackRequest usage (very unstable) --- composer.json | 2 +- composer.lock | 38 +-- src/network/mcpe/InventoryManager.php | 145 ++++++--- .../mcpe/InventoryManagerPredictedChanges.php | 61 ++++ src/network/mcpe/ItemStackInfo.php | 41 +++ .../mcpe/handler/InGamePacketHandler.php | 77 +++-- .../mcpe/handler/ItemStackRequestExecutor.php | 288 ++++++++++++++++++ .../mcpe/handler/PreSpawnPacketHandler.php | 2 +- 8 files changed, 560 insertions(+), 94 deletions(-) create mode 100644 src/network/mcpe/InventoryManagerPredictedChanges.php create mode 100644 src/network/mcpe/ItemStackInfo.php create mode 100644 src/network/mcpe/handler/ItemStackRequestExecutor.php diff --git a/composer.json b/composer.json index 5334687cf9..8d5d7adad8 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-data": "~1.10.0+bedrock-1.19.20", - "pocketmine/bedrock-protocol": "~12.0.0+bedrock-1.19.20", + "pocketmine/bedrock-protocol": "~12.1.0+bedrock-1.19.20", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 34cce5d637..8eb97af452 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "80afa24adf37096a23643e051d6128ce", + "content-hash": "df65cc2917f6ab13745a48a6eb2fe48a", "packages": [ { "name": "adhocore/json-comment", @@ -63,16 +63,16 @@ }, { "name": "brick/math", - "version": "0.10.1", + "version": "0.10.2", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "de846578401f4e58f911b3afeb62ced56365ed87" + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/de846578401f4e58f911b3afeb62ced56365ed87", - "reference": "de846578401f4e58f911b3afeb62ced56365ed87", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", "shasum": "" }, "require": { @@ -107,7 +107,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.1" + "source": "https://github.com/brick/math/tree/0.10.2" }, "funding": [ { @@ -115,7 +115,7 @@ "type": "github" } ], - "time": "2022-08-01T22:54:31+00:00" + "time": "2022-08-10T22:54:19+00:00" }, { "name": "fgrosse/phpasn1", @@ -271,16 +271,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "12.0.0+bedrock-1.19.20", + "version": "12.1.0+bedrock-1.19.20", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "c2778039544fa0c7c5bd3af7963149e7552f4215" + "reference": "f754df1c7becfad89599052e3ac07852a02dc4dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/c2778039544fa0c7c5bd3af7963149e7552f4215", - "reference": "c2778039544fa0c7c5bd3af7963149e7552f4215", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/f754df1c7becfad89599052e3ac07852a02dc4dd", + "reference": "f754df1c7becfad89599052e3ac07852a02dc4dd", "shasum": "" }, "require": { @@ -312,9 +312,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/bedrock-1.19.20" + "source": "https://github.com/pmmp/BedrockProtocol/tree/12.1.0+bedrock-1.19.20" }, - "time": "2022-08-09T17:57:29+00:00" + "time": "2022-08-16T19:55:35+00:00" }, { "name": "pocketmine/binaryutils", @@ -532,16 +532,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.8.3", + "version": "2.8.4", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "113c115a3b8976917eb22b74dccab464831b6483" + "reference": "6709467487d270c962deee16972c7786949d1511" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/113c115a3b8976917eb22b74dccab464831b6483", - "reference": "113c115a3b8976917eb22b74dccab464831b6483", + "url": "https://api.github.com/repos/pmmp/Language/zipball/6709467487d270c962deee16972c7786949d1511", + "reference": "6709467487d270c962deee16972c7786949d1511", "shasum": "" }, "type": "library", @@ -549,9 +549,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.8.3" + "source": "https://github.com/pmmp/Language/tree/2.8.4" }, - "time": "2022-05-11T13:51:37+00:00" + "time": "2022-08-16T17:47:52+00:00" }, { "name": "pocketmine/log", diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 323136086b..b831ef4865 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -87,7 +87,7 @@ class InventoryManager{ /** * @var Item[][] - * @phpstan-var array> + * @phpstan-var array */ private array $initiatedSlotChanges = []; private int $clientSelectedHotbarSlot = -1; @@ -99,6 +99,13 @@ class InventoryManager{ /** @phpstan-var \Closure() : void */ private ?\Closure $pendingOpenWindowCallback = null; + private int $nextItemStackId = 1; + /** + * @var int[][] + * @phpstan-var array> + */ + private array $itemStackInfos = []; + public function __construct( private Player $player, private NetworkSession $session @@ -141,11 +148,14 @@ class InventoryManager{ private function remove(int $id) : void{ $inventory = $this->windowMap[$id]; - $splObjectId = spl_object_id($inventory); - unset($this->windowMap[$id], $this->initiatedSlotChanges[$id], $this->complexWindows[$splObjectId]); - foreach($this->complexSlotToWindowMap as $netSlot => $entry){ - if($entry->getInventory() === $inventory){ - unset($this->complexSlotToWindowMap[$netSlot]); + unset($this->windowMap[$id]); + if($this->getWindowId($inventory) === null){ + $splObjectId = spl_object_id($inventory); + unset($this->initiatedSlotChanges[$splObjectId], $this->itemStackInfos[$splObjectId], $this->complexWindows[$splObjectId]); + foreach($this->complexSlotToWindowMap as $netSlot => $entry){ + if($entry->getInventory() === $inventory){ + unset($this->complexSlotToWindowMap[$netSlot]); + } } } } @@ -159,7 +169,7 @@ class InventoryManager{ } /** - * @phpstan-return array{Inventory, int} + * @phpstan-return array{Inventory, int}|null */ public function locateWindowAndSlot(int $windowId, int $netSlotId) : ?array{ if($windowId === ContainerIds::UI){ @@ -176,11 +186,15 @@ class InventoryManager{ return null; } - public function onTransactionStart(InventoryTransaction $tx) : void{ + public function addPredictedSlotChange(Inventory $inventory, int $slot, Item $item) : void{ + $predictions = ($this->initiatedSlotChanges[spl_object_id($inventory)] ??= new InventoryManagerPredictedChanges($inventory)); + $predictions->add($slot, $item); + } + + public function addTransactionPredictedSlotChanges(InventoryTransaction $tx) : void{ foreach($tx->getActions() as $action){ - if($action instanceof SlotChangeAction && ($windowId = $this->getWindowId($action->getInventory())) !== null){ - //in some cases the inventory might not have a window ID, but still be referenced by a transaction (e.g. crafting grid changes), so we can't unconditionally record the change here or we might leak things - $this->initiatedSlotChanges[$windowId][$action->getSlot()] = $action->getTargetItem(); + if($action instanceof SlotChangeAction){ + $this->addPredictedSlotChange($action->getInventory(), $action->getSlot(), $action->getTargetItem()); } } } @@ -189,17 +203,23 @@ class InventoryManager{ * @param NetworkInventoryAction[] $networkInventoryActions * @throws PacketHandlingException */ - public function addPredictedSlotChanges(array $networkInventoryActions) : void{ + public function addRawPredictedSlotChanges(array $networkInventoryActions) : void{ foreach($networkInventoryActions as $action){ - if($action->sourceType === NetworkInventoryAction::SOURCE_CONTAINER && isset($this->windowMap[$action->windowId])){ - //this won't cover stuff like crafting grid due to too much magic - try{ - $item = TypeConverter::getInstance()->netItemStackToCore($action->newItem->getItemStack()); - }catch(TypeConversionException $e){ - throw new PacketHandlingException($e->getMessage(), 0, $e); - } - $this->initiatedSlotChanges[$action->windowId][$action->inventorySlot] = $item; + if($action->sourceType !== NetworkInventoryAction::SOURCE_CONTAINER){ + continue; } + $info = $this->locateWindowAndSlot($action->windowId, $action->inventorySlot); + if($info === null){ + continue; + } + + [$inventory, $slot] = $info; + try{ + $item = TypeConverter::getInstance()->netItemStackToCore($action->newItem->getItemStack()); + }catch(TypeConversionException $e){ + throw new PacketHandlingException($e->getMessage(), 0, $e); + } + $this->addPredictedSlotChange($inventory, $slot, $item); } } @@ -356,9 +376,10 @@ class InventoryManager{ } if($windowId !== null && $netSlot !== null){ $currentItem = $inventory->getItem($slot); - $clientSideItem = $this->initiatedSlotChanges[$windowId][$netSlot] ?? null; + $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; + $clientSideItem = $predictions?->getSlot($slot); if($clientSideItem === null || !$clientSideItem->equalsExact($currentItem)){ - $itemStackWrapper = ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($currentItem)); + $itemStackWrapper = $this->wrapItemStack($inventory, $slot, $currentItem); if($windowId === ContainerIds::OFFHAND){ //TODO: HACK! //The client may sometimes ignore the InventorySlotPacket for the offhand slot. @@ -370,7 +391,7 @@ class InventoryManager{ $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); } } - unset($this->initiatedSlotChanges[$windowId][$netSlot]); + $predictions?->remove($slot); } } @@ -381,26 +402,28 @@ class InventoryManager{ }else{ $windowId = $this->getWindowId($inventory); } - $typeConverter = TypeConverter::getInstance(); if($windowId !== null){ if($slotMap !== null){ + $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; foreach($inventory->getContents(true) as $slotId => $item){ $packetSlot = $slotMap->mapCoreToNet($slotId) ?? null; if($packetSlot === null){ continue; } - unset($this->initiatedSlotChanges[$windowId][$packetSlot]); + $predictions?->remove($slotId); $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $packetSlot, - ItemStackWrapper::legacy($typeConverter->coreItemStackToNet($inventory->getItem($slotId))) + $this->wrapItemStack($inventory, $slotId, $inventory->getItem($slotId)) )); } }else{ - unset($this->initiatedSlotChanges[$windowId]); - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, array_map(function(Item $itemStack) use ($typeConverter) : ItemStackWrapper{ - return ItemStackWrapper::legacy($typeConverter->coreItemStackToNet($itemStack)); - }, $inventory->getContents(true)))); + unset($this->initiatedSlotChanges[spl_object_id($inventory)]); + $contents = []; + foreach($inventory->getContents(true) as $slotId => $item){ + $contents[] = $this->wrapItemStack($inventory, $slotId, $item); + } + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $contents)); } } } @@ -415,14 +438,9 @@ class InventoryManager{ } public function syncMismatchedPredictedSlotChanges() : void{ - foreach($this->initiatedSlotChanges as $windowId => $slots){ - foreach($slots as $netSlot => $expectedItem){ - $located = $this->locateWindowAndSlot($windowId, $netSlot); - if($located === null){ - continue; - } - [$inventory, $slot] = $located; - + foreach($this->initiatedSlotChanges as $predictions){ + $inventory = $predictions->getInventory(); + foreach($predictions->getSlots() as $slot => $expectedItem){ if(!$inventory->slotExists($slot)){ continue; //TODO: size desync ??? } @@ -449,11 +467,14 @@ class InventoryManager{ } public function syncSelectedHotbarSlot() : void{ - $selected = $this->player->getInventory()->getHeldItemIndex(); + $playerInventory = $this->player->getInventory(); + $selected = $playerInventory->getHeldItemIndex(); if($selected !== $this->clientSelectedHotbarSlot){ + $itemStackInfo = $this->itemStackInfos[spl_object_id($playerInventory)][$selected]; + $this->session->sendDataPacket(MobEquipmentPacket::create( $this->player->getId(), - ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($this->player->getInventory()->getItemInHand())), + new ItemStackWrapper($itemStackInfo->getStackId(), $itemStackInfo->getItemStack()), $selected, $selected, ContainerIds::INVENTORY @@ -470,4 +491,48 @@ class InventoryManager{ return new CreativeContentEntry($nextEntryId++, $typeConverter->coreItemStackToNet($item)); }, $this->player->isSpectator() ? [] : CreativeInventory::getInstance()->getAll()))); } + + private function newItemStackId() : int{ + return $this->nextItemStackId++; + } + + public function trackItemStack(Inventory $inventory, int $slotId, Item $item, ?int $itemStackRequestId) : ItemStackInfo{ + $existing = $this->itemStackInfos[spl_object_id($inventory)][$slotId] ?? null; + $typeConverter = TypeConverter::getInstance(); + $itemStack = $typeConverter->coreItemStackToNet($item); + if($existing !== null && $existing->getItemStack()->equals($itemStack)){ + return $existing; + } + + $info = new ItemStackInfo($itemStackRequestId, $item->isNull() ? 0 : $this->newItemStackId(), $itemStack); + return $this->itemStackInfos[spl_object_id($inventory)][$slotId] = $info; + } + + private function wrapItemStack(Inventory $inventory, int $slotId, Item $item) : ItemStackWrapper{ + $info = $this->trackItemStack($inventory, $slotId, $item, null); + return new ItemStackWrapper($info->getStackId(), $info->getItemStack()); + } + + public function matchItemStack(Inventory $inventory, int $slotId, int $itemStackId) : bool{ + $inventoryObjectId = spl_object_id($inventory); + if(!isset($this->itemStackInfos[$inventoryObjectId])){ + $this->session->getLogger()->debug("Attempted to match item preimage unsynced inventory " . get_class($inventory) . "#" . $inventoryObjectId); + return false; + } + $info = $this->itemStackInfos[$inventoryObjectId][$slotId] ?? null; + if($info === null){ + $this->session->getLogger()->debug("Attempted to match item preimage for unsynced slot $slotId in " . get_class($inventory) . "#$inventoryObjectId that isn't synced"); + return false; + } + + if(!($itemStackId < 0 ? $info->getRequestId() === $itemStackId : $info->getStackId() === $itemStackId)){ + $this->session->getLogger()->debug( + "Mismatched expected itemstack: " . get_class($inventory) . "#" . $inventoryObjectId . ", " . + "slot: $slotId, expected: $itemStackId, actual: " . $info->getStackId() . ", last modified by request: " . ($info->getRequestId() ?? "none") + ); + return false; + } + + return true; + } } diff --git a/src/network/mcpe/InventoryManagerPredictedChanges.php b/src/network/mcpe/InventoryManagerPredictedChanges.php new file mode 100644 index 0000000000..a381234a41 --- /dev/null +++ b/src/network/mcpe/InventoryManagerPredictedChanges.php @@ -0,0 +1,61 @@ + + */ + private array $slots = []; + + public function __construct( + private Inventory $inventory + ){} + + public function getInventory() : Inventory{ return $this->inventory; } + + /** + * @return Item[] + * @phpstan-return array + */ + public function getSlots() : array{ + return $this->slots; + } + + public function getSlot(int $slot) : ?Item{ + return $this->slots[$slot] ?? null; + } + + public function add(int $slot, Item $item) : void{ + $this->slots[$slot] = $item; + } + + public function remove(int $slot) : void{ + unset($this->slots[$slot]); + } +} diff --git a/src/network/mcpe/ItemStackInfo.php b/src/network/mcpe/ItemStackInfo.php new file mode 100644 index 0000000000..630765bfa3 --- /dev/null +++ b/src/network/mcpe/ItemStackInfo.php @@ -0,0 +1,41 @@ +requestId; } + + public function getStackId() : int{ return $this->stackId; } + + public function getItemStack() : ItemStack{ return $this->itemStack; } +} diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 7a8caabfec..3b44cd027a 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -65,6 +65,8 @@ use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\InteractPacket; use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; use pocketmine\network\mcpe\protocol\ItemFrameDropItemPacket; +use pocketmine\network\mcpe\protocol\ItemStackRequestPacket; +use pocketmine\network\mcpe\protocol\ItemStackResponsePacket; use pocketmine\network\mcpe\protocol\LabTablePacket; use pocketmine\network\mcpe\protocol\LecternUpdatePacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; @@ -119,7 +121,6 @@ use function is_bool; use function is_infinite; use function is_nan; use function json_decode; -use function json_encode; use function max; use function mb_strlen; use function microtime; @@ -263,6 +264,14 @@ class InGamePacketHandler extends PacketHandler{ } } + $itemStackRequest = $packet->getItemStackRequest(); + if($itemStackRequest !== null){ + $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $itemStackRequest); + $transaction = $executor->generateInventoryTransaction(); + $result = $this->executeInventoryTransaction($transaction); + $this->session->sendDataPacket(ItemStackResponsePacket::create([$executor->buildItemStackResponse($result)])); + } + $blockActions = $packet->getBlockActions(); if($blockActions !== null){ foreach($blockActions as $k => $blockAction){ @@ -333,6 +342,21 @@ class InGamePacketHandler extends PacketHandler{ return $result; } + private function executeInventoryTransaction(InventoryTransaction $transaction) : bool{ + $this->player->setUsingItem(false); + $this->inventoryManager->addTransactionPredictedSlotChanges($transaction); + try{ + $transaction->execute(); + }catch(TransactionException $e){ + $logger = $this->session->getLogger(); + $logger->debug("Failed to execute inventory transaction: " . $e->getMessage()); + + return false; + } + + return true; + } + private function handleNormalTransaction(NormalTransactionData $data) : bool{ /** @var InventoryAction[] $actions */ $actions = []; @@ -380,18 +404,8 @@ class InGamePacketHandler extends PacketHandler{ //all of the parts before we can execute it return true; } - $this->player->setUsingItem(false); try{ - $this->inventoryManager->onTransactionStart($this->craftingTransaction); - $this->craftingTransaction->execute(); - }catch(TransactionException $e){ - $this->session->getLogger()->debug("Failed to execute crafting transaction: " . $e->getMessage()); - - //TODO: only sync slots that the client tried to change - foreach($this->craftingTransaction->getInventories() as $inventory){ - $this->inventoryManager->syncContents($inventory); - } - return false; + return $this->executeInventoryTransaction($this->craftingTransaction); }finally{ $this->craftingTransaction = null; } @@ -408,30 +422,13 @@ class InGamePacketHandler extends PacketHandler{ return true; } - $this->player->setUsingItem(false); - $transaction = new InventoryTransaction($this->player, $actions); - $this->inventoryManager->onTransactionStart($transaction); - try{ - $transaction->execute(); - }catch(TransactionException $e){ - $logger = $this->session->getLogger(); - $logger->debug("Failed to execute inventory transaction: " . $e->getMessage()); - $logger->debug("Actions: " . json_encode($data->getActions())); - - foreach($transaction->getInventories() as $inventory){ - $this->inventoryManager->syncContents($inventory); - } - - return false; - } + return $this->executeInventoryTransaction(new InventoryTransaction($this->player, $actions)); } - - return true; } private function handleUseItemTransaction(UseItemTransactionData $data) : bool{ $this->player->selectHotbarSlot($data->getHotbarSlot()); - $this->inventoryManager->addPredictedSlotChanges($data->getActions()); + $this->inventoryManager->addRawPredictedSlotChanges($data->getActions()); switch($data->getActionType()){ case UseItemTransactionData::ACTION_CLICK_BLOCK: @@ -517,7 +514,7 @@ class InGamePacketHandler extends PacketHandler{ } $this->player->selectHotbarSlot($data->getHotbarSlot()); - $this->inventoryManager->addPredictedSlotChanges($data->getActions()); + $this->inventoryManager->addRawPredictedSlotChanges($data->getActions()); //TODO: use transactiondata for rollbacks here switch($data->getActionType()){ @@ -534,7 +531,7 @@ class InGamePacketHandler extends PacketHandler{ private function handleReleaseItemTransaction(ReleaseItemTransactionData $data) : bool{ $this->player->selectHotbarSlot($data->getHotbarSlot()); - $this->inventoryManager->addPredictedSlotChanges($data->getActions()); + $this->inventoryManager->addRawPredictedSlotChanges($data->getActions()); //TODO: use transactiondata for rollbacks here (resending entire inventory is very wasteful) switch($data->getActionType()){ @@ -548,6 +545,20 @@ class InGamePacketHandler extends PacketHandler{ return false; } + public function handleItemStackRequest(ItemStackRequestPacket $packet) : bool{ + $responses = []; + foreach($packet->getRequests() as $request){ + $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); + $transaction = $executor->generateInventoryTransaction(); + $result = $this->executeInventoryTransaction($transaction); + $responses[] = $executor->buildItemStackResponse($result); + } + + $this->session->sendDataPacket(ItemStackResponsePacket::create($responses)); + + return true; + } + public function handleMobEquipment(MobEquipmentPacket $packet) : bool{ if($packet->windowId === ContainerIds::OFFHAND){ return true; //this happens when we put an item into the offhand diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php new file mode 100644 index 0000000000..52c46f9191 --- /dev/null +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -0,0 +1,288 @@ +builder = new TransactionBuilder(); + } + + private function translateContainerId(int $containerInterfaceId) : int{ + return match($containerInterfaceId){ + ContainerUIIds::ARMOR => ContainerIds::ARMOR, + + ContainerUIIds::HOTBAR, + ContainerUIIds::INVENTORY, + ContainerUIIds::COMBINED_HOTBAR_AND_INVENTORY => ContainerIds::INVENTORY, + + ContainerUIIds::OFFHAND => ContainerIds::OFFHAND, + + ContainerUIIds::ANVIL_INPUT, + ContainerUIIds::ANVIL_MATERIAL, + ContainerUIIds::BEACON_PAYMENT, + ContainerUIIds::CARTOGRAPHY_ADDITIONAL, + ContainerUIIds::CARTOGRAPHY_INPUT, + ContainerUIIds::COMPOUND_CREATOR_INPUT, + ContainerUIIds::CRAFTING_INPUT, + ContainerUIIds::CREATED_OUTPUT, + ContainerUIIds::CURSOR, + ContainerUIIds::ENCHANTING_INPUT, + ContainerUIIds::ENCHANTING_MATERIAL, + ContainerUIIds::GRINDSTONE_ADDITIONAL, + ContainerUIIds::GRINDSTONE_INPUT, + ContainerUIIds::LAB_TABLE_INPUT, + ContainerUIIds::LOOM_DYE, + ContainerUIIds::LOOM_INPUT, + ContainerUIIds::LOOM_MATERIAL, + ContainerUIIds::MATERIAL_REDUCER_INPUT, + ContainerUIIds::MATERIAL_REDUCER_OUTPUT, + ContainerUIIds::SMITHING_TABLE_INPUT, + ContainerUIIds::SMITHING_TABLE_MATERIAL, + ContainerUIIds::STONECUTTER_INPUT, + ContainerUIIds::TRADE2_INGREDIENT1, + ContainerUIIds::TRADE2_INGREDIENT2, + ContainerUIIds::TRADE_INGREDIENT1, + ContainerUIIds::TRADE_INGREDIENT2 => ContainerIds::UI, + + ContainerUIIds::BARREL, + ContainerUIIds::BLAST_FURNACE_INGREDIENT, + ContainerUIIds::BREWING_STAND_FUEL, + ContainerUIIds::BREWING_STAND_INPUT, + ContainerUIIds::BREWING_STAND_RESULT, + ContainerUIIds::FURNACE_FUEL, + ContainerUIIds::FURNACE_INGREDIENT, + ContainerUIIds::FURNACE_RESULT, + ContainerUIIds::LEVEL_ENTITY, //chest + ContainerUIIds::SHULKER_BOX, + ContainerUIIds::SMOKER_INGREDIENT => $this->inventoryManager->getCurrentWindowId(), + + //all preview slots are ignored, since the client shouldn't be modifying those directly + + default => throw new PacketHandlingException("Unexpected container UI ID $containerInterfaceId") + }; + } + + /** + * @phpstan-return array{Inventory, int} + */ + private function getInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ + $windowId = $this->translateContainerId($info->getContainerId()); + $info = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); + if($info === null){ + throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); + } + [$inventory, $slot] = $info; + if(!$inventory->slotExists($slot)){ + throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); + } + + return [$inventory, $slot]; + } + + /** + * @phpstan-return array{TransactionBuilderInventory, int} + */ + private function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ + [$inventory, $slot] = $this->getInventoryAndSlot($info); + + if( + $info->getStackId() !== $this->request->getRequestId() && //using TransactionBuilderInventory enables this to work + !$this->inventoryManager->matchItemStack($inventory, $slot, $info->getStackId()) + ){ + throw new PacketHandlingException("Inventory " . $info->getContainerId() . ", slot " . $slot . ": server-side item does not match expected"); + } + + return [$this->builder->getInventory($inventory), $slot]; + } + + private function transferItems(ItemStackRequestSlotInfo $source, ItemStackRequestSlotInfo $destination, int $count) : void{ + [$sourceInventory, $sourceSlot] = $this->getBuilderInventoryAndSlot($source); + [$targetInventory, $targetSlot] = $this->getBuilderInventoryAndSlot($destination); + + $oldSourceItem = $sourceInventory->getItem($sourceSlot); + $oldTargetItem = $targetInventory->getItem($targetSlot); + + if(!$targetInventory->isSlotEmpty($targetSlot) && !$oldTargetItem->canStackWith($oldSourceItem)){ + throw new PacketHandlingException("Can only transfer items into an empty slot, or a slot containing the same item"); + } + [$newSourceItem, $newTargetItem] = $this->splitStack($oldSourceItem, $count, $oldTargetItem->getCount()); + + $sourceInventory->setItem($sourceSlot, $newSourceItem); + $targetInventory->setItem($targetSlot, $newTargetItem); + } + + /** + * @phpstan-return array{Item, Item} + */ + private function splitStack(Item $item, int $transferredCount, int $targetCount) : array{ + if($item->getCount() < $transferredCount){ + throw new PacketHandlingException("Cannot take $transferredCount items from a stack of " . $item->getCount()); + } + + $leftover = clone $item; + $removed = $leftover->pop($transferredCount); + $removed->setCount($removed->getCount() + $targetCount); + if($leftover->isNull()){ + $leftover = VanillaItems::AIR(); + } + + return [$leftover, $removed]; + } + + private function processItemStackRequestAction(ItemStackRequestAction $action) : void{ + if( + $action instanceof TakeStackRequestAction || + $action instanceof PlaceStackRequestAction + ){ + $this->requestSlotInfos[] = $action->getSource(); + $this->requestSlotInfos[] = $action->getDestination(); + $this->transferItems($action->getSource(), $action->getDestination(), $action->getCount()); + }elseif($action instanceof SwapStackRequestAction){ + $this->requestSlotInfos[] = $action->getSlot1(); + $this->requestSlotInfos[] = $action->getSlot2(); + + [$inventory1, $slot1] = $this->getBuilderInventoryAndSlot($action->getSlot1()); + [$inventory2, $slot2] = $this->getBuilderInventoryAndSlot($action->getSlot2()); + + $item1 = $inventory1->getItem($slot1); + $item2 = $inventory2->getItem($slot2); + $inventory1->setItem($slot1, $item2); + $inventory2->setItem($slot2, $item1); + }elseif($action instanceof DropStackRequestAction){ + $this->requestSlotInfos[] = $action->getSource(); + [$inventory, $slot] = $this->getBuilderInventoryAndSlot($action->getSource()); + + $oldItem = $inventory->getItem($slot); + [$leftover, $dropped] = $this->splitStack($oldItem, $action->getCount(), 0); + + //TODO: this action has a "randomly" field, I have no idea what it's used for + $inventory->setItem($slot, $leftover); + $this->builder->addAction(new DropItemAction($dropped)); + }elseif($action instanceof DestroyStackRequestAction){ + $this->requestSlotInfos[] = $action->getSource(); + [$inventory, $slot] = $this->getBuilderInventoryAndSlot($action->getSource()); + + $oldItem = $inventory->getItem($slot); + [$leftover, $destroyed] = $this->splitStack($oldItem, $action->getCount(), 0); + + $inventory->setItem($slot, $leftover); + $this->builder->addAction(new DestroyItemAction($destroyed)); + }elseif($action instanceof CraftingConsumeInputStackRequestAction){ + //we don't need this for the PM system + $this->requestSlotInfos[] = $action->getSource(); + $this->crafting = true; + }elseif( + $action instanceof CraftRecipeStackRequestAction || //TODO + $action instanceof CraftRecipeAutoStackRequestAction || //TODO + $action instanceof CraftingMarkSecondaryResultStackRequestAction || //no obvious use + $action instanceof DeprecatedCraftingResultsStackRequestAction //no obvious use + ){ + $this->crafting = true; + }else{ + throw new PacketHandlingException("Unhandled item stack request action: " . get_class($action)); + } + } + + public function generateInventoryTransaction() : InventoryTransaction{ + foreach($this->request->getActions() as $action){ + $this->processItemStackRequestAction($action); + } + $inventoryActions = $this->builder->generateActions(); + + return $this->crafting ? + new CraftingTransaction($this->player, $this->player->getServer()->getCraftingManager(), $inventoryActions) : + new InventoryTransaction($this->player, $inventoryActions); + } + + public function buildItemStackResponse(bool $success) : ItemStackResponse{ + $responseInfosByContainer = []; + foreach($this->requestSlotInfos as $requestInfo){ + [$inventory, $slot] = $this->getInventoryAndSlot($requestInfo); + + $item = $inventory->getItem($slot); + $info = $this->inventoryManager->trackItemStack($inventory, $slot, $item, $this->request->getRequestId()); + + $responseInfosByContainer[$requestInfo->getContainerId()][] = new ItemStackResponseSlotInfo( + $requestInfo->getSlotId(), + $requestInfo->getSlotId(), + $info->getItemStack()->getCount(), + $info->getStackId(), + $item->hasCustomName() ? $item->getCustomName() : "", + 0 + ); + } + + $responseContainerInfos = []; + foreach($responseInfosByContainer as $containerId => $responseInfos){ + $responseContainerInfos[] = new ItemStackResponseContainerInfo($containerId, $responseInfos); + } + + return new ItemStackResponse($success ? ItemStackResponse::RESULT_OK : ItemStackResponse::RESULT_ERROR, $this->request->getRequestId(), $responseContainerInfos); + } +} diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 92e5023515..cf7c9b0f39 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -96,7 +96,7 @@ class PreSpawnPacketHandler extends PacketHandler{ 0, 0, "", - false, + true, sprintf("%s %s", VersionInfo::NAME, VersionInfo::VERSION()->getFullVersion(true)), Uuid::fromString(Uuid::NIL), false, From 3235d128e5f9e5cb58e596eb8c8131b2a71bde28 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 18 Aug 2022 18:25:49 +0100 Subject: [PATCH 0397/1858] Fixed handling of fake requests during block placement and other actions --- .../mcpe/handler/InGamePacketHandler.php | 12 ++ .../ItemStackContainerIdTranslator.php | 90 ++++++++++++++ .../mcpe/handler/ItemStackRequestExecutor.php | 112 ++---------------- .../mcpe/handler/ItemStackResponseBuilder.php | 94 +++++++++++++++ 4 files changed, 208 insertions(+), 100 deletions(-) create mode 100644 src/network/mcpe/handler/ItemStackContainerIdTranslator.php create mode 100644 src/network/mcpe/handler/ItemStackResponseBuilder.php diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 3b44cd027a..252eddb2ee 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -339,6 +339,17 @@ class InGamePacketHandler extends PacketHandler{ }else{ $this->inventoryManager->syncMismatchedPredictedSlotChanges(); } + if($packet->requestId !== 0){ + $itemStackResponseBuilder = new ItemStackResponseBuilder($packet->requestId, $this->inventoryManager); + foreach($packet->requestChangedSlots as $requestChangedSlotsEntry){ + foreach($requestChangedSlotsEntry->getChangedSlotIndexes() as $slotId){ + $itemStackResponseBuilder->addSlot($requestChangedSlotsEntry->getContainerId(), $slotId); + } + } + $itemStackResponse = $itemStackResponseBuilder->build($result); + $this->session->sendDataPacket(ItemStackResponsePacket::create([$itemStackResponse])); + $this->session->getLogger()->debug("Sent item stack response for fake stack request " . $packet->requestId); + } return $result; } @@ -551,6 +562,7 @@ class InGamePacketHandler extends PacketHandler{ $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); $transaction = $executor->generateInventoryTransaction(); $result = $this->executeInventoryTransaction($transaction); + $this->session->getLogger()->debug("Item stack request " . $request->getRequestId() . " result: " . ($result ? "success" : "failure")); $responses[] = $executor->buildItemStackResponse($result); } diff --git a/src/network/mcpe/handler/ItemStackContainerIdTranslator.php b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php new file mode 100644 index 0000000000..a0ad3b26c7 --- /dev/null +++ b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php @@ -0,0 +1,90 @@ + ContainerIds::ARMOR, + + ContainerUIIds::HOTBAR, + ContainerUIIds::INVENTORY, + ContainerUIIds::COMBINED_HOTBAR_AND_INVENTORY => ContainerIds::INVENTORY, + + ContainerUIIds::OFFHAND => ContainerIds::OFFHAND, + + ContainerUIIds::ANVIL_INPUT, + ContainerUIIds::ANVIL_MATERIAL, + ContainerUIIds::BEACON_PAYMENT, + ContainerUIIds::CARTOGRAPHY_ADDITIONAL, + ContainerUIIds::CARTOGRAPHY_INPUT, + ContainerUIIds::COMPOUND_CREATOR_INPUT, + ContainerUIIds::CRAFTING_INPUT, + ContainerUIIds::CREATED_OUTPUT, + ContainerUIIds::CURSOR, + ContainerUIIds::ENCHANTING_INPUT, + ContainerUIIds::ENCHANTING_MATERIAL, + ContainerUIIds::GRINDSTONE_ADDITIONAL, + ContainerUIIds::GRINDSTONE_INPUT, + ContainerUIIds::LAB_TABLE_INPUT, + ContainerUIIds::LOOM_DYE, + ContainerUIIds::LOOM_INPUT, + ContainerUIIds::LOOM_MATERIAL, + ContainerUIIds::MATERIAL_REDUCER_INPUT, + ContainerUIIds::MATERIAL_REDUCER_OUTPUT, + ContainerUIIds::SMITHING_TABLE_INPUT, + ContainerUIIds::SMITHING_TABLE_MATERIAL, + ContainerUIIds::STONECUTTER_INPUT, + ContainerUIIds::TRADE2_INGREDIENT1, + ContainerUIIds::TRADE2_INGREDIENT2, + ContainerUIIds::TRADE_INGREDIENT1, + ContainerUIIds::TRADE_INGREDIENT2 => ContainerIds::UI, + + ContainerUIIds::BARREL, + ContainerUIIds::BLAST_FURNACE_INGREDIENT, + ContainerUIIds::BREWING_STAND_FUEL, + ContainerUIIds::BREWING_STAND_INPUT, + ContainerUIIds::BREWING_STAND_RESULT, + ContainerUIIds::FURNACE_FUEL, + ContainerUIIds::FURNACE_INGREDIENT, + ContainerUIIds::FURNACE_RESULT, + ContainerUIIds::LEVEL_ENTITY, //chest + ContainerUIIds::SHULKER_BOX, + ContainerUIIds::SMOKER_INGREDIENT => $currentWindowId, + + //all preview slots are ignored, since the client shouldn't be modifying those directly + + default => throw new PacketHandlingException("Unexpected container UI ID $containerInterfaceId") + }; + } +} diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 52c46f9191..4b7923205c 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; -use pocketmine\block\inventory\CraftingTableInventory; -use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; @@ -34,8 +32,6 @@ use pocketmine\inventory\transaction\TransactionBuilderInventory; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\network\mcpe\InventoryManager; -use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; -use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingConsumeInputStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingMarkSecondaryResultStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeAutoStackRequestAction; @@ -50,12 +46,9 @@ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\PlaceStackRequ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\SwapStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\TakeStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; -use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseContainerInfo; -use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseSlotInfo; use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use function get_class; -use function var_dump; final class ItemStackRequestExecutor{ private TransactionBuilder $builder; @@ -73,83 +66,19 @@ final class ItemStackRequestExecutor{ $this->builder = new TransactionBuilder(); } - private function translateContainerId(int $containerInterfaceId) : int{ - return match($containerInterfaceId){ - ContainerUIIds::ARMOR => ContainerIds::ARMOR, - - ContainerUIIds::HOTBAR, - ContainerUIIds::INVENTORY, - ContainerUIIds::COMBINED_HOTBAR_AND_INVENTORY => ContainerIds::INVENTORY, - - ContainerUIIds::OFFHAND => ContainerIds::OFFHAND, - - ContainerUIIds::ANVIL_INPUT, - ContainerUIIds::ANVIL_MATERIAL, - ContainerUIIds::BEACON_PAYMENT, - ContainerUIIds::CARTOGRAPHY_ADDITIONAL, - ContainerUIIds::CARTOGRAPHY_INPUT, - ContainerUIIds::COMPOUND_CREATOR_INPUT, - ContainerUIIds::CRAFTING_INPUT, - ContainerUIIds::CREATED_OUTPUT, - ContainerUIIds::CURSOR, - ContainerUIIds::ENCHANTING_INPUT, - ContainerUIIds::ENCHANTING_MATERIAL, - ContainerUIIds::GRINDSTONE_ADDITIONAL, - ContainerUIIds::GRINDSTONE_INPUT, - ContainerUIIds::LAB_TABLE_INPUT, - ContainerUIIds::LOOM_DYE, - ContainerUIIds::LOOM_INPUT, - ContainerUIIds::LOOM_MATERIAL, - ContainerUIIds::MATERIAL_REDUCER_INPUT, - ContainerUIIds::MATERIAL_REDUCER_OUTPUT, - ContainerUIIds::SMITHING_TABLE_INPUT, - ContainerUIIds::SMITHING_TABLE_MATERIAL, - ContainerUIIds::STONECUTTER_INPUT, - ContainerUIIds::TRADE2_INGREDIENT1, - ContainerUIIds::TRADE2_INGREDIENT2, - ContainerUIIds::TRADE_INGREDIENT1, - ContainerUIIds::TRADE_INGREDIENT2 => ContainerIds::UI, - - ContainerUIIds::BARREL, - ContainerUIIds::BLAST_FURNACE_INGREDIENT, - ContainerUIIds::BREWING_STAND_FUEL, - ContainerUIIds::BREWING_STAND_INPUT, - ContainerUIIds::BREWING_STAND_RESULT, - ContainerUIIds::FURNACE_FUEL, - ContainerUIIds::FURNACE_INGREDIENT, - ContainerUIIds::FURNACE_RESULT, - ContainerUIIds::LEVEL_ENTITY, //chest - ContainerUIIds::SHULKER_BOX, - ContainerUIIds::SMOKER_INGREDIENT => $this->inventoryManager->getCurrentWindowId(), - - //all preview slots are ignored, since the client shouldn't be modifying those directly - - default => throw new PacketHandlingException("Unexpected container UI ID $containerInterfaceId") - }; - } - - /** - * @phpstan-return array{Inventory, int} - */ - private function getInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ - $windowId = $this->translateContainerId($info->getContainerId()); - $info = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); - if($info === null){ - throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); - } - [$inventory, $slot] = $info; - if(!$inventory->slotExists($slot)){ - throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); - } - - return [$inventory, $slot]; - } - /** * @phpstan-return array{TransactionBuilderInventory, int} */ private function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ - [$inventory, $slot] = $this->getInventoryAndSlot($info); + $windowId = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId()); + $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); + if($windowAndSlot === null){ + throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); + } + [$inventory, $slot] = $windowAndSlot; + if(!$inventory->slotExists($slot)){ + throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); + } if( $info->getStackId() !== $this->request->getRequestId() && //using TransactionBuilderInventory enables this to work @@ -261,28 +190,11 @@ final class ItemStackRequestExecutor{ } public function buildItemStackResponse(bool $success) : ItemStackResponse{ - $responseInfosByContainer = []; + $builder = new ItemStackResponseBuilder($this->request->getRequestId(), $this->inventoryManager); foreach($this->requestSlotInfos as $requestInfo){ - [$inventory, $slot] = $this->getInventoryAndSlot($requestInfo); - - $item = $inventory->getItem($slot); - $info = $this->inventoryManager->trackItemStack($inventory, $slot, $item, $this->request->getRequestId()); - - $responseInfosByContainer[$requestInfo->getContainerId()][] = new ItemStackResponseSlotInfo( - $requestInfo->getSlotId(), - $requestInfo->getSlotId(), - $info->getItemStack()->getCount(), - $info->getStackId(), - $item->hasCustomName() ? $item->getCustomName() : "", - 0 - ); + $builder->addSlot($requestInfo->getContainerId(), $requestInfo->getSlotId()); } - $responseContainerInfos = []; - foreach($responseInfosByContainer as $containerId => $responseInfos){ - $responseContainerInfos[] = new ItemStackResponseContainerInfo($containerId, $responseInfos); - } - - return new ItemStackResponse($success ? ItemStackResponse::RESULT_OK : ItemStackResponse::RESULT_ERROR, $this->request->getRequestId(), $responseContainerInfos); + return $builder->build($success); } } diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php new file mode 100644 index 0000000000..11315695e3 --- /dev/null +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -0,0 +1,94 @@ +> + */ + private array $changedSlots = []; + + public function __construct( + private int $requestId, + private InventoryManager $inventoryManager + ){} + + public function addSlot(int $containerInterfaceId, int $slotId) : void{ + $this->changedSlots[$containerInterfaceId][$slotId] = $slotId; + } + + /** + * @phpstan-return array{Inventory, int} + */ + private function getInventoryAndSlot(int $containerInterfaceId, int $slotId) : array{ + $windowId = ItemStackContainerIdTranslator::translate($containerInterfaceId, $this->inventoryManager->getCurrentWindowId()); + $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); + if($windowAndSlot === null){ + throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); + } + [$inventory, $slot] = $windowAndSlot; + if(!$inventory->slotExists($slot)){ + throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); + } + + return [$inventory, $slot]; + } + + public function build(bool $success) : ItemStackResponse{ + $responseInfosByContainer = []; + foreach($this->changedSlots as $containerInterfaceId => $slotIds){ + foreach($slotIds as $slotId){ + [$inventory, $slot] = $this->getInventoryAndSlot($containerInterfaceId, $slotId); + + $item = $inventory->getItem($slot); + $info = $this->inventoryManager->trackItemStack($inventory, $slot, $item, $this->requestId); + + $responseInfosByContainer[$containerInterfaceId][] = new ItemStackResponseSlotInfo( + $slotId, + $slotId, + $info->getItemStack()->getCount(), + $info->getStackId(), + $item->hasCustomName() ? $item->getCustomName() : "", + 0 + ); + } + } + + $responseContainerInfos = []; + foreach($responseInfosByContainer as $containerInterfaceId => $responseInfos){ + $responseContainerInfos[] = new ItemStackResponseContainerInfo($containerInterfaceId, $responseInfos); + } + + return new ItemStackResponse($success ? ItemStackResponse::RESULT_OK : ItemStackResponse::RESULT_ERROR, $this->requestId, $responseContainerInfos); + } +} From fedd5416636df18654d7883dc3cd8a72b3351538 Mon Sep 17 00:00:00 2001 From: alvin0319 Date: Mon, 22 Aug 2022 04:05:09 +0900 Subject: [PATCH 0398/1858] Dye now can be used to change Sign text color (#4690) --- src/block/BaseSign.php | 55 ++++++++++++++++++++++++++++++ src/block/tile/Sign.php | 32 ++++++++++++++++- src/block/utils/SignText.php | 26 ++++++++++++-- src/world/sound/DyeUseSound.php | 35 +++++++++++++++++++ src/world/sound/InkSacUseSound.php | 35 +++++++++++++++++++ 5 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 src/world/sound/DyeUseSound.php create mode 100644 src/world/sound/InkSacUseSound.php diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index a1413ccbfb..bd6316af95 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -24,17 +24,23 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Sign as TileSign; +use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SignText; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodType; use pocketmine\block\utils\WoodTypeTrait; +use pocketmine\color\Color; use pocketmine\event\block\SignChangeEvent; +use pocketmine\item\Dye; use pocketmine\item\Item; +use pocketmine\item\ItemTypeIds; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\utils\TextFormat; use pocketmine\world\BlockTransaction; +use pocketmine\world\sound\DyeUseSound; +use pocketmine\world\sound\InkSacUseSound; use function array_map; use function assert; use function strlen; @@ -111,6 +117,55 @@ abstract class BaseSign extends Transparent{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } + private function doSignChange(SignText $newText, Player $player, Item $item) : bool{ + $ev = new SignChangeEvent($this, $player, $newText); + $ev->call(); + if(!$ev->isCancelled()){ + $this->text = $ev->getNewText(); + $this->position->getWorld()->setBlock($this->position, $this); + $item->pop(); + return true; + } + + return false; + } + + private function changeSignGlowingState(bool $glowing, Player $player, Item $item) : bool{ + if($this->text->isGlowing() !== $glowing && $this->doSignChange(new SignText($this->text->getLines(), $this->text->getBaseColor(), $glowing), $player, $item)){ + $this->position->getWorld()->addSound($this->position, new InkSacUseSound()); + return true; + } + return false; + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($player === null){ + return false; + } + $dyeColor = $item instanceof Dye ? $item->getColor() : match($item->getTypeId()){ + ItemTypeIds::BONE_MEAL => DyeColor::WHITE(), + ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), + ItemTypeIds::COCOA_BEANS => DyeColor::BROWN(), + default => null + }; + if($dyeColor !== null){ + $color = $dyeColor->equals(DyeColor::BLACK()) ? new Color(0, 0, 0) : $dyeColor->getRgbValue(); + if($color->toARGB() === $this->text->getBaseColor()->toARGB()){ + return false; + } + + if($this->doSignChange(new SignText($this->text->getLines(), $color, $this->text->isGlowing()), $player, $item)){ + $this->position->getWorld()->addSound($this->position, new DyeUseSound()); + return true; + } + }elseif($item->getTypeId() === ItemTypeIds::INK_SAC){ + return $this->changeSignGlowingState(false, $player, $item); + }elseif($item->getTypeId() === ItemTypeIds::GLOW_INK_SAC){ + return $this->changeSignGlowingState(true, $player, $item); + } + return false; + } + /** * Returns an object containing information about the sign text. */ diff --git a/src/block/tile/Sign.php b/src/block/tile/Sign.php index b4383d1578..3d3d30713b 100644 --- a/src/block/tile/Sign.php +++ b/src/block/tile/Sign.php @@ -24,9 +24,13 @@ declare(strict_types=1); namespace pocketmine\block\tile; use pocketmine\block\utils\SignText; +use pocketmine\color\Color; use pocketmine\math\Vector3; +use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; +use pocketmine\utils\Binary; use pocketmine\world\World; use function array_pad; use function array_slice; @@ -42,6 +46,13 @@ use function sprintf; class Sign extends Spawnable{ public const TAG_TEXT_BLOB = "Text"; public const TAG_TEXT_LINE = "Text%d"; //sprintf()able + public const TAG_TEXT_COLOR = "SignTextColor"; + public const TAG_GLOWING_TEXT = "IgnoreLighting"; + /** + * This tag is set to indicate that MCPE-117835 has been addressed in whatever version this sign was created. + * @see https://bugs.mojang.com/browse/MCPE-117835 + */ + public const TAG_LEGACY_BUG_RESOLVE = "TextIgnoreLegacyBugResolved"; /** * @return string[] @@ -60,7 +71,20 @@ class Sign extends Spawnable{ public function readSaveData(CompoundTag $nbt) : void{ if(($textBlobTag = $nbt->getTag(self::TAG_TEXT_BLOB)) instanceof StringTag){ //MCPE 1.2 save format - $this->text = SignText::fromBlob(mb_scrub($textBlobTag->getValue(), 'UTF-8')); + $baseColor = new Color(0, 0, 0); + $glowingText = false; + if(($baseColorTag = $nbt->getTag(self::TAG_TEXT_COLOR)) instanceof IntTag){ + $baseColor = Color::fromARGB(Binary::unsignInt($baseColorTag->getValue())); + } + if( + ($glowingTextTag = $nbt->getTag(self::TAG_GLOWING_TEXT)) instanceof ByteTag && + ($lightingBugResolvedTag = $nbt->getTag(self::TAG_LEGACY_BUG_RESOLVE)) instanceof ByteTag + ){ + //both of these must be 1 - if only one is set, it's a leftover from 1.16.210 experimental features + //see https://bugs.mojang.com/browse/MCPE-117835 + $glowingText = $glowingTextTag->getValue() !== 0 && $lightingBugResolvedTag->getValue() !== 0; + } + $this->text = SignText::fromBlob(mb_scrub($textBlobTag->getValue(), 'UTF-8'), $baseColor, $glowingText); }else{ $text = []; for($i = 0; $i < SignText::LINE_COUNT; ++$i){ @@ -80,6 +104,9 @@ class Sign extends Spawnable{ $textKey = sprintf(self::TAG_TEXT_LINE, $i + 1); $nbt->setString($textKey, $this->text->getLine($i)); } + $nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB())); + $nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0); + $nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1); } public function getText() : SignText{ @@ -108,5 +135,8 @@ class Sign extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ $nbt->setString(self::TAG_TEXT_BLOB, implode("\n", $this->text->getLines())); + $nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB())); + $nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0); + $nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1); } } diff --git a/src/block/utils/SignText.php b/src/block/utils/SignText.php index 6f3cb69dd7..cdde8f5eb2 100644 --- a/src/block/utils/SignText.php +++ b/src/block/utils/SignText.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\color\Color; use pocketmine\utils\Utils; use function array_fill; use function array_pad; @@ -37,6 +38,8 @@ class SignText{ /** @var string[] */ private array $lines; + private Color $baseColor; + private bool $glowing; /** * @param string[]|null $lines index-sensitive; omitting an index will leave it unchanged @@ -45,7 +48,7 @@ class SignText{ * @throws \InvalidArgumentException if invalid keys (out of bounds or string) are found in the array * @throws \InvalidArgumentException if any line is not valid UTF-8 or contains a newline */ - public function __construct(?array $lines = null){ + public function __construct(?array $lines = null, ?Color $baseColor = null, bool $glowing = false){ $this->lines = array_fill(0, self::LINE_COUNT, ""); if($lines !== null){ if(count($lines) > self::LINE_COUNT){ @@ -61,6 +64,8 @@ class SignText{ $this->lines[$k] = $line; } } + $this->baseColor = $baseColor ?? new Color(0, 0, 0); + $this->glowing = $glowing; } /** @@ -69,8 +74,8 @@ class SignText{ * * @throws \InvalidArgumentException if the text is not valid UTF-8 */ - public static function fromBlob(string $blob) : SignText{ - return new self(array_slice(array_pad(explode("\n", $blob), self::LINE_COUNT, ""), 0, self::LINE_COUNT)); + public static function fromBlob(string $blob, ?Color $baseColor = null, bool $glowing = false) : SignText{ + return new self(array_slice(array_pad(explode("\n", $blob), self::LINE_COUNT, ""), 0, self::LINE_COUNT), $baseColor, $glowing); } /** @@ -103,4 +108,19 @@ class SignText{ $this->checkLineIndex($index); return $this->lines[$index]; } + + /** + * Returns the base text color of sign. Color codes using the § escape character will override this color when used. + */ + public function getBaseColor() : Color{ + return $this->baseColor; + } + + /** + * Returns whether the sign text is glowing. When true, the text will have an outline (usually a darker tone of the + * base color, or white for black text), and will glow in the dark, making it readable without any light sources. + */ + public function isGlowing() : bool{ + return $this->glowing; + } } diff --git a/src/world/sound/DyeUseSound.php b/src/world/sound/DyeUseSound.php new file mode 100644 index 0000000000..5357c6e8bc --- /dev/null +++ b/src/world/sound/DyeUseSound.php @@ -0,0 +1,35 @@ + Date: Fri, 26 Aug 2022 15:54:21 +0100 Subject: [PATCH 0399/1858] StringToItemParser: improve some readability slightly --- src/item/StringToItemParser.php | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 96d542cc28..66378551b3 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -58,30 +58,30 @@ final class StringToItemParser extends StringToTParser{ private static function registerDynamicBlocks(self $result) : void{ foreach(DyeColor::getAll() as $color){ - $prefix = fn(string $name) => $color->name() . "_" . $name; + $register = fn(string $name, \Closure $callback) => $result->registerBlock($color->name() . "_" . $name, $callback); //wall and floor banner are the same item - $result->registerBlock($prefix("banner"), fn() => Blocks::BANNER()->setColor($color)); - $result->registerBlock($prefix("bed"), fn() => Blocks::BED()->setColor($color)); - $result->registerBlock($prefix("candle"), fn() => Blocks::DYED_CANDLE()->setColor($color)); - $result->registerBlock($prefix("carpet"), fn() => Blocks::CARPET()->setColor($color)); - $result->registerBlock($prefix("concrete"), fn() => Blocks::CONCRETE()->setColor($color)); - $result->registerBlock($prefix("concrete_powder"), fn() => Blocks::CONCRETE_POWDER()->setColor($color)); - $result->registerBlock($prefix("glazed_terracotta"), fn() => Blocks::GLAZED_TERRACOTTA()->setColor($color)); - $result->registerBlock($prefix("stained_clay"), fn() => Blocks::STAINED_CLAY()->setColor($color)); - $result->registerBlock($prefix("stained_glass"), fn() => Blocks::STAINED_GLASS()->setColor($color)); - $result->registerBlock($prefix("stained_glass_pane"), fn() => Blocks::STAINED_GLASS_PANE()->setColor($color)); - $result->registerBlock($prefix("stained_hardened_glass"), fn() => Blocks::STAINED_HARDENED_GLASS()->setColor($color)); - $result->registerBlock($prefix("stained_hardened_glass_pane"), fn() => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)); - $result->registerBlock($prefix("wool"), fn() => Blocks::WOOL()->setColor($color)); - $result->registerBlock($prefix("shulker_box"), fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); + $register("banner", fn() => Blocks::BANNER()->setColor($color)); + $register("bed", fn() => Blocks::BED()->setColor($color)); + $register("candle", fn() => Blocks::DYED_CANDLE()->setColor($color)); + $register("carpet", fn() => Blocks::CARPET()->setColor($color)); + $register("concrete", fn() => Blocks::CONCRETE()->setColor($color)); + $register("concrete_powder", fn() => Blocks::CONCRETE_POWDER()->setColor($color)); + $register("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA()->setColor($color)); + $register("stained_clay", fn() => Blocks::STAINED_CLAY()->setColor($color)); + $register("stained_glass", fn() => Blocks::STAINED_GLASS()->setColor($color)); + $register("stained_glass_pane", fn() => Blocks::STAINED_GLASS_PANE()->setColor($color)); + $register("stained_hardened_glass", fn() => Blocks::STAINED_HARDENED_GLASS()->setColor($color)); + $register("stained_hardened_glass_pane", fn() => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)); + $register("wool", fn() => Blocks::WOOL()->setColor($color)); + $register("shulker_box", fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); } foreach(CoralType::getAll() as $coralType){ - $prefix = fn(string $name) => $coralType->name() . "_" . $name; - $result->registerBlock($prefix("coral"), fn() => Blocks::CORAL()->setCoralType($coralType)); - $result->registerBlock($prefix("coral_block"), fn() => Blocks::CORAL_BLOCK()->setCoralType($coralType)); + $register = fn(string $name, \Closure $callback) => $result->registerBlock($coralType->name() . "_" . $name, $callback); + $register("coral", fn() => Blocks::CORAL()->setCoralType($coralType)); + $register("coral_block", fn() => Blocks::CORAL_BLOCK()->setCoralType($coralType)); //wall and floor coral fans are the same item - $result->registerBlock($prefix("coral_fan"), fn() => Blocks::CORAL_FAN()->setCoralType($coralType)); + $register("coral_fan", fn() => Blocks::CORAL_FAN()->setCoralType($coralType)); } for($i = Light::MIN_LIGHT_LEVEL; $i <= Light::MAX_LIGHT_LEVEL; $i++){ //helper aliases, since we don't support passing data values in /give @@ -93,11 +93,11 @@ final class StringToItemParser extends StringToTParser{ $oxPrefix = $oxidation->equals(CopperOxidation::NONE()) ? "" : $oxidation->name() . "_"; foreach(["" => false, "waxed_" => true] as $waxedPrefix => $waxed){ - $prefix = $waxedPrefix . $oxPrefix; - $result->registerBlock($prefix . "copper_block", fn() => Blocks::COPPER()->setOxidation($oxidation)->setWaxed($waxed)); - $result->registerBlock($prefix . "cut_copper_block", fn() => Blocks::CUT_COPPER()->setOxidation($oxidation)->setWaxed($waxed)); - $result->registerBlock($prefix . "cut_copper_stairs", fn() => Blocks::CUT_COPPER_STAIRS()->setOxidation($oxidation)->setWaxed($waxed)); - $result->registerBlock($prefix . "cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); + $register = fn(string $name, \Closure $callback) => $result->registerBlock($waxedPrefix . $oxPrefix . $name, $callback); + $register("copper_block", fn() => Blocks::COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $register("cut_copper_block", fn() => Blocks::CUT_COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $register("cut_copper_stairs", fn() => Blocks::CUT_COPPER_STAIRS()->setOxidation($oxidation)->setWaxed($waxed)); + $register("cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); } } From ca3612e4ffa93307c9ac0a95054fbfab66a36083 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 Aug 2022 16:18:13 +0100 Subject: [PATCH 0400/1858] Preparations for attempted unification of ItemSerializer and ItemDeserializer --- src/data/bedrock/item/ItemDeserializer.php | 108 ++++++++++++--------- 1 file changed, 61 insertions(+), 47 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index a61c3b89e1..1897d3a204 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; +use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; @@ -65,6 +66,13 @@ final class ItemDeserializer{ $this->deserializers[$id] = $deserializer; } + /** + * @phpstan-param \Closure(Data) : Block $deserializer + */ + public function mapBlock(string $id, \Closure $deserializer) : void{ + $this->map($id, fn(Data $data) => $deserializer($data)->asItem()); + } + /** * @throws ItemTypeDeserializeException */ @@ -115,10 +123,53 @@ final class ItemDeserializer{ return $itemStack; } + private function registerSpecialBlockDeserializers() : void{ + $this->mapBlock(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()); + $this->mapBlock(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()); + $this->mapBlock(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()); + $this->mapBlock(Ids::CAKE, fn() => Blocks::CAKE()); + $this->mapBlock(Ids::CAULDRON, fn() => Blocks::CAULDRON()); + $this->mapBlock(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()); + $this->mapBlock(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()); + $this->mapBlock(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()); + $this->mapBlock(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()); + $this->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $this->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); + $this->mapBlock(Ids::HOPPER, fn() => Blocks::HOPPER()); + $this->mapBlock(Ids::IRON_DOOR, fn() => Blocks::IRON_DOOR()); + $this->mapBlock(Ids::JUNGLE_DOOR, fn() => Blocks::JUNGLE_DOOR()); + $this->mapBlock(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()); + $this->mapBlock(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()); + $this->mapBlock(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()); + $this->mapBlock(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()); + $this->mapBlock(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()); + $this->mapBlock(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()); + $this->mapBlock(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()); + + $this->mapBlock(Ids::BED, function(Data $data) : Block{ + $meta = $data->getMeta(); + $color = DyeColorIdMap::getInstance()->fromId($meta); + if($color === null){ + throw new ItemTypeDeserializeException("Unknown bed meta $meta"); + } + return Blocks::BED()->setColor($color); + }); + $this->mapBlock(Ids::SKULL, function(Data $data) : Block{ + $meta = $data->getMeta(); + try{ + $skullType = SkullType::fromMagicNumber($meta); + }catch(\InvalidArgumentException $e){ + throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); + } + return Blocks::MOB_HEAD()->setSkullType($skullType); + }); + } + private function registerDeserializers() : void{ + $this->registerSpecialBlockDeserializers(); + $this->map(Ids::ACACIA_BOAT, fn() => Items::ACACIA_BOAT()); - $this->map(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()->asItem()); - $this->map(Ids::ACACIA_SIGN, fn() => Blocks::ACACIA_SIGN()->asItem()); + $this->map(Ids::ACACIA_SIGN, fn() => Items::ACACIA_SIGN()); //TODO: minecraft:agent_spawn_egg //TODO: minecraft:allay_spawn_egg $this->map(Ids::AMETHYST_SHARD, fn() => Items::AMETHYST_SHARD()); @@ -144,22 +195,13 @@ final class ItemDeserializer{ }); //TODO: minecraft:banner_pattern //TODO: minecraft:bat_spawn_egg - $this->map(Ids::BED, function(Data $data) : Item{ - $meta = $data->getMeta(); - $color = DyeColorIdMap::getInstance()->fromId($meta); - if($color === null){ - throw new ItemTypeDeserializeException("Unknown bed meta $meta"); - } - return Blocks::BED()->setColor($color)->asItem(); - }); //TODO: minecraft:bee_spawn_egg $this->map(Ids::BEEF, fn() => Items::RAW_BEEF()); $this->map(Ids::BEETROOT, fn() => Items::BEETROOT()); $this->map(Ids::BEETROOT_SEEDS, fn() => Items::BEETROOT_SEEDS()); $this->map(Ids::BEETROOT_SOUP, fn() => Items::BEETROOT_SOUP()); $this->map(Ids::BIRCH_BOAT, fn() => Items::BIRCH_BOAT()); - $this->map(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()->asItem()); - $this->map(Ids::BIRCH_SIGN, fn() => Blocks::BIRCH_SIGN()->asItem()); + $this->map(Ids::BIRCH_SIGN, fn() => Items::BIRCH_SIGN()); $this->map(Ids::BLACK_DYE, fn() => Items::DYE()->setColor(DyeColor::BLACK())); $this->map(Ids::BLAZE_POWDER, fn() => Items::BLAZE_POWDER()); $this->map(Ids::BLAZE_ROD, fn() => Items::BLAZE_ROD()); @@ -189,17 +231,14 @@ final class ItemDeserializer{ $this->map(Ids::BOW, fn() => Items::BOW()); $this->map(Ids::BOWL, fn() => Items::BOWL()); $this->map(Ids::BREAD, fn() => Items::BREAD()); - $this->map(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()->asItem()); $this->map(Ids::BRICK, fn() => Items::BRICK()); $this->map(Ids::BROWN_DYE, fn() => Items::DYE()->setColor(DyeColor::BROWN())); $this->map(Ids::BUCKET, fn() => Items::BUCKET()); - $this->map(Ids::CAKE, fn() => Blocks::CAKE()->asItem()); //TODO: minecraft:camera //TODO: minecraft:campfire $this->map(Ids::CARROT, fn() => Items::CARROT()); //TODO: minecraft:carrot_on_a_stick //TODO: minecraft:cat_spawn_egg - $this->map(Ids::CAULDRON, fn() => Blocks::CAULDRON()->asItem()); //TODO: minecraft:cave_spider_spawn_egg //TODO: minecraft:chain $this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS()); @@ -219,7 +258,6 @@ final class ItemDeserializer{ //TODO: minecraft:cod_bucket //TODO: minecraft:cod_spawn_egg //TODO: minecraft:command_block_minecart - $this->map(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()->asItem()); $this->map(Ids::COMPASS, fn() => Items::COMPASS()); $this->map(Ids::COMPOUND, fn(Data $data) => match($data->getMeta()){ CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), @@ -274,13 +312,11 @@ final class ItemDeserializer{ //TODO: minecraft:cow_spawn_egg //TODO: minecraft:creeper_banner_pattern //TODO: minecraft:creeper_spawn_egg - $this->map(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()->asItem()); - $this->map(Ids::CRIMSON_SIGN, fn() => Blocks::CRIMSON_SIGN()->asItem()); + $this->map(Ids::CRIMSON_SIGN, fn() => Items::CRIMSON_SIGN()); //TODO: minecraft:crossbow $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); - $this->map(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()->asItem()); - $this->map(Ids::DARK_OAK_SIGN, fn() => Blocks::DARK_OAK_SIGN()->asItem()); + $this->map(Ids::DARK_OAK_SIGN, fn() => Items::DARK_OAK_SIGN()); $this->map(Ids::DIAMOND, fn() => Items::DIAMOND()); $this->map(Ids::DIAMOND_AXE, fn() => Items::DIAMOND_AXE()); $this->map(Ids::DIAMOND_BOOTS, fn() => Items::DIAMOND_BOOTS()); @@ -347,9 +383,7 @@ final class ItemDeserializer{ $this->map(Ids::FLINT, fn() => Items::FLINT()); $this->map(Ids::FLINT_AND_STEEL, fn() => Items::FLINT_AND_STEEL()); //TODO: minecraft:flower_banner_pattern - $this->map(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()->asItem()); //TODO: minecraft:fox_spawn_egg - $this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)->asItem()); //TODO: minecraft:frog_spawn_egg //TODO: minecraft:ghast_spawn_egg $this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR()); @@ -357,7 +391,6 @@ final class ItemDeserializer{ $this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON()); //TODO: minecraft:globe_banner_pattern //TODO: minecraft:glow_berries - $this->map(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)->asItem()); $this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC()); //TODO: minecraft:glow_squid_spawn_egg //TODO: minecraft:glow_stick @@ -386,7 +419,6 @@ final class ItemDeserializer{ //TODO: minecraft:hoglin_spawn_egg $this->map(Ids::HONEY_BOTTLE, fn() => Items::HONEY_BOTTLE()); $this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB()); - $this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem()); //TODO: minecraft:hopper_minecart //TODO: minecraft:horse_spawn_egg //TODO: minecraft:husk_spawn_egg @@ -395,7 +427,6 @@ final class ItemDeserializer{ $this->map(Ids::IRON_AXE, fn() => Items::IRON_AXE()); $this->map(Ids::IRON_BOOTS, fn() => Items::IRON_BOOTS()); $this->map(Ids::IRON_CHESTPLATE, fn() => Items::IRON_CHESTPLATE()); - $this->map(Ids::IRON_DOOR, fn() => Blocks::IRON_DOOR()->asItem()); $this->map(Ids::IRON_HELMET, fn() => Items::IRON_HELMET()); $this->map(Ids::IRON_HOE, fn() => Items::IRON_HOE()); //TODO: minecraft:iron_horse_armor @@ -406,8 +437,7 @@ final class ItemDeserializer{ $this->map(Ids::IRON_SHOVEL, fn() => Items::IRON_SHOVEL()); $this->map(Ids::IRON_SWORD, fn() => Items::IRON_SWORD()); $this->map(Ids::JUNGLE_BOAT, fn() => Items::JUNGLE_BOAT()); - $this->map(Ids::JUNGLE_DOOR, fn() => Blocks::JUNGLE_DOOR()->asItem()); - $this->map(Ids::JUNGLE_SIGN, fn() => Blocks::JUNGLE_SIGN()->asItem()); + $this->map(Ids::JUNGLE_SIGN, fn() => Items::JUNGLE_SIGN()); //TODO: minecraft:kelp $this->map(Ids::LAPIS_LAZULI, fn() => Items::LAPIS_LAZULI()); $this->map(Ids::LAVA_BUCKET, fn() => Items::LAVA_BUCKET()); @@ -427,8 +457,7 @@ final class ItemDeserializer{ $this->map(Ids::MAGENTA_DYE, fn() => Items::DYE()->setColor(DyeColor::MAGENTA())); $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); //TODO: minecraft:magma_cube_spawn_egg - $this->map(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()->asItem()); - $this->map(Ids::MANGROVE_SIGN, fn() => Blocks::MANGROVE_SIGN()->asItem()); + $this->map(Ids::MANGROVE_SIGN, fn() => Items::MANGROVE_SIGN()); //TODO: minecraft:medicine $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); @@ -457,7 +486,6 @@ final class ItemDeserializer{ $this->map(Ids::NAUTILUS_SHELL, fn() => Items::NAUTILUS_SHELL()); //TODO: minecraft:nether_sprouts $this->map(Ids::NETHER_STAR, fn() => Items::NETHER_STAR()); - $this->map(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()->asItem()); $this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK()); $this->map(Ids::NETHERITE_AXE, fn() => Items::NETHERITE_AXE()); $this->map(Ids::NETHERITE_BOOTS, fn() => Items::NETHERITE_BOOTS()); @@ -472,7 +500,7 @@ final class ItemDeserializer{ $this->map(Ids::NETHERITE_SWORD, fn() => Items::NETHERITE_SWORD()); //TODO: minecraft:npc_spawn_egg $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); - $this->map(Ids::OAK_SIGN, fn() => Blocks::OAK_SIGN()->asItem()); + $this->map(Ids::OAK_SIGN, fn() => Items::OAK_SIGN()); //TODO: minecraft:ocelot_spawn_egg $this->map(Ids::ORANGE_DYE, fn() => Items::DYE()->setColor(DyeColor::ORANGE())); $this->map(Ids::PAINTING, fn() => Items::PAINTING()); @@ -522,7 +550,6 @@ final class ItemDeserializer{ $this->map(Ids::RAW_IRON, fn() => Items::RAW_IRON()); $this->map(Ids::RED_DYE, fn() => Items::DYE()->setColor(DyeColor::RED())); $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); - $this->map(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()->asItem()); $this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH()); //TODO: minecraft:saddle $this->map(Ids::SALMON, fn() => Items::RAW_SALMON()); @@ -537,15 +564,6 @@ final class ItemDeserializer{ //TODO: minecraft:silverfish_spawn_egg //TODO: minecraft:skeleton_horse_spawn_egg //TODO: minecraft:skeleton_spawn_egg - $this->map(Ids::SKULL, function(Data $data) : Item{ - $meta = $data->getMeta(); - try{ - $skullType = SkullType::fromMagicNumber($meta); - }catch(\InvalidArgumentException $e){ - throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); - } - return Blocks::MOB_HEAD()->setSkullType($skullType)->asItem(); - }); //TODO: minecraft:skull_banner_pattern $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); //TODO: minecraft:slime_spawn_egg @@ -569,8 +587,7 @@ final class ItemDeserializer{ return Items::SPLASH_POTION()->setType($potionType); }); $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); - $this->map(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()->asItem()); - $this->map(Ids::SPRUCE_SIGN, fn() => Blocks::SPRUCE_SIGN()->asItem()); + $this->map(Ids::SPRUCE_SIGN, fn() => Items::SPRUCE_SIGN()); $this->map(Ids::SPYGLASS, fn() => Items::SPYGLASS()); $this->map(Ids::SQUID_SPAWN_EGG, fn() => Items::SQUID_SPAWN_EGG()); $this->map(Ids::STICK, fn() => Items::STICK()); @@ -583,7 +600,6 @@ final class ItemDeserializer{ //TODO: minecraft:strider_spawn_egg $this->map(Ids::STRING, fn() => Items::STRING()); $this->map(Ids::SUGAR, fn() => Items::SUGAR()); - $this->map(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()->asItem()); $this->map(Ids::SUSPICIOUS_STEW, function(Data $data) : Item{ $meta = $data->getMeta(); $suspiciousStewType = SuspiciousStewTypeIdMap::getInstance()->fromId($meta); @@ -607,9 +623,8 @@ final class ItemDeserializer{ $this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG()); //TODO: minecraft:vindicator_spawn_egg //TODO: minecraft:wandering_trader_spawn_egg - $this->map(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()->asItem()); //TODO: minecraft:warped_fungus_on_a_stick - $this->map(Ids::WARPED_SIGN, fn() => Blocks::WARPED_SIGN()->asItem()); + $this->map(Ids::WARPED_SIGN, fn() => Items::WARPED_SIGN()); $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); $this->map(Ids::WHEAT, fn() => Items::WHEAT()); $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); @@ -618,7 +633,6 @@ final class ItemDeserializer{ //TODO: minecraft:wither_skeleton_spawn_egg //TODO: minecraft:wolf_spawn_egg $this->map(Ids::WOODEN_AXE, fn() => Items::WOODEN_AXE()); - $this->map(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()->asItem()); $this->map(Ids::WOODEN_HOE, fn() => Items::WOODEN_HOE()); $this->map(Ids::WOODEN_PICKAXE, fn() => Items::WOODEN_PICKAXE()); $this->map(Ids::WOODEN_SHOVEL, fn() => Items::WOODEN_SHOVEL()); From 64ac20173b86aea37771d997dbe121e35e4aed19 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 Aug 2022 17:06:09 +0100 Subject: [PATCH 0401/1858] ItemDeserializer: remove unnecessary code these are legacy IDs and are upgraded to modern IDs before ever reaching this code. --- src/data/bedrock/item/ItemDeserializer.php | 47 ---------------------- 1 file changed, 47 deletions(-) diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index 1897d3a204..d846b741bf 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -27,14 +27,12 @@ use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\utils\DyeColor; 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\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\PotionTypeIdMap; @@ -43,7 +41,6 @@ use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\VanillaItems as Items; use pocketmine\nbt\NbtException; -use pocketmine\utils\AssumptionFailedError; use function min; final class ItemDeserializer{ @@ -208,22 +205,6 @@ final class ItemDeserializer{ //TODO: minecraft:blaze_spawn_egg $this->map(Ids::BLEACH, fn() => Items::BLEACH()); $this->map(Ids::BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::BLUE())); - $this->map(Ids::BOAT, function(Data $data) : Item{ - try{ - $treeType = TreeType::fromMagicNumber($data->getMeta()); - }catch(\InvalidArgumentException $e){ - throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); - } - return match($treeType->id()){ - TreeType::OAK()->id() => Items::OAK_BOAT(), - TreeType::SPRUCE()->id() => Items::SPRUCE_BOAT(), - TreeType::BIRCH()->id() => Items::BIRCH_BOAT(), - TreeType::JUNGLE()->id() => Items::JUNGLE_BOAT(), - TreeType::ACACIA()->id() => Items::ACACIA_BOAT(), - TreeType::DARK_OAK()->id() => Items::DARK_OAK_BOAT(), - default => throw new AssumptionFailedError("Unexpected tree type " . $treeType->name()) - }; - }); $this->map(Ids::BONE, fn() => Items::BONE()); $this->map(Ids::BONE_MEAL, fn() => Items::BONE_MEAL()); $this->map(Ids::BOOK, fn() => Items::BOOK()); @@ -334,28 +315,6 @@ final class ItemDeserializer{ $this->map(Ids::DRAGON_BREATH, fn() => Items::DRAGON_BREATH()); $this->map(Ids::DRIED_KELP, fn() => Items::DRIED_KELP()); //TODO: minecraft:drowned_spawn_egg - $this->map(Ids::DYE, function(Data $data) : Item{ - $meta = $data->getMeta(); - $item = match($meta) { - 0 => Items::INK_SAC(), - 3 => Items::COCOA_BEANS(), - 4 => Items::LAPIS_LAZULI(), - 15 => Items::BONE_MEAL(), - 16 => Items::DYE()->setColor(DyeColor::BLACK()), - 17 => Items::DYE()->setColor(DyeColor::BROWN()), - 18 => Items::DYE()->setColor(DyeColor::BLUE()), - 19 => Items::DYE()->setColor(DyeColor::WHITE()), - default => null - }; - if($item !== null){ - return $item; - } - $dyeColor = DyeColorIdMap::getInstance()->fromInvertedId($meta); - if($dyeColor === null){ - throw new ItemTypeDeserializeException("Unknown dye meta $meta"); - } - return Items::DYE()->setColor($dyeColor); - }); $this->map(Ids::ECHO_SHARD, fn() => Items::ECHO_SHARD()); $this->map(Ids::EGG, fn() => Items::EGG()); //TODO: minecraft:elder_guardian_spawn_egg @@ -570,12 +529,6 @@ final class ItemDeserializer{ $this->map(Ids::SNOWBALL, fn() => Items::SNOWBALL()); //TODO: minecraft:soul_campfire //TODO: minecraft:sparkler - $this->map(Ids::SPAWN_EGG, fn(Data $data) => match($data->getMeta()){ - EntityLegacyIds::ZOMBIE => Items::ZOMBIE_SPAWN_EGG(), - EntityLegacyIds::SQUID => Items::SQUID_SPAWN_EGG(), - EntityLegacyIds::VILLAGER => Items::VILLAGER_SPAWN_EGG(), - default => throw new ItemTypeDeserializeException("Unhandled spawn egg meta " . $data->getMeta()) - }); $this->map(Ids::SPIDER_EYE, fn() => Items::SPIDER_EYE()); //TODO: minecraft:spider_spawn_egg $this->map(Ids::SPLASH_POTION, function(Data $data) : Item{ From 4bd232582841d87f136561715c7b94f0a5595488 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 Aug 2022 17:07:35 +0100 Subject: [PATCH 0402/1858] Remove obsolete TreeType magic numbers --- src/block/utils/TreeType.php | 40 +++++++----------------------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/src/block/utils/TreeType.php b/src/block/utils/TreeType.php index b031e0e99f..180f17a47a 100644 --- a/src/block/utils/TreeType.php +++ b/src/block/utils/TreeType.php @@ -44,42 +44,20 @@ final class TreeType{ __construct as Enum___construct; } - /** @var TreeType[] */ - private static array $numericIdMap = []; - protected static function setup() : void{ self::registerAll( - new TreeType("oak", "Oak", 0), - new TreeType("spruce", "Spruce", 1), - new TreeType("birch", "Birch", 2), - new TreeType("jungle", "Jungle", 3), - new TreeType("acacia", "Acacia", 4), - new TreeType("dark_oak", "Dark Oak", 5) + new TreeType("oak", "Oak"), + new TreeType("spruce", "Spruce"), + new TreeType("birch", "Birch"), + new TreeType("jungle", "Jungle"), + new TreeType("acacia", "Acacia"), + new TreeType("dark_oak", "Dark Oak") ); } - protected static function register(TreeType $type) : void{ - self::Enum_register($type); - self::$numericIdMap[$type->getMagicNumber()] = $type; - } - - /** - * @internal - * - * @throws \InvalidArgumentException - */ - public static function fromMagicNumber(int $magicNumber) : TreeType{ - self::checkInit(); - if(!isset(self::$numericIdMap[$magicNumber])){ - throw new \InvalidArgumentException("Unknown tree type magic number $magicNumber"); - } - return self::$numericIdMap[$magicNumber]; - } - private function __construct( string $enumName, - private string $displayName, - private int $magicNumber + private string $displayName ){ $this->Enum___construct($enumName); } @@ -87,8 +65,4 @@ final class TreeType{ public function getDisplayName() : string{ return $this->displayName; } - - public function getMagicNumber() : int{ - return $this->magicNumber; - } } From 7fd4c12ea1b34c6de1fb7c2868490ce799823a80 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 Aug 2022 15:10:55 +0100 Subject: [PATCH 0403/1858] First look at (mostly) unified item serializer registrar this halves the amount of code needed to implement most items. --- src/data/bedrock/DyeColorIdMap.php | 57 +- src/data/bedrock/item/ItemDeserializer.php | 491 +---------------- src/data/bedrock/item/ItemSerializer.php | 331 +---------- .../ItemSerializerDeserializerRegistrar.php | 517 ++++++++++++++++++ 4 files changed, 560 insertions(+), 836 deletions(-) create mode 100644 src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php diff --git a/src/data/bedrock/DyeColorIdMap.php b/src/data/bedrock/DyeColorIdMap.php index 112ffe9371..63ee67b4bf 100644 --- a/src/data/bedrock/DyeColorIdMap.php +++ b/src/data/bedrock/DyeColorIdMap.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; use pocketmine\block\utils\DyeColor; +use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\utils\SingletonTrait; final class DyeColorIdMap{ @@ -41,28 +42,42 @@ final class DyeColorIdMap{ */ private array $enumToId = []; + /** + * @var DyeColor[] + * @phpstan-var array + */ + private array $itemIdToEnum = []; + + /** + * @var string[] + * @phpstan-var array + */ + private array $enumToItemId = []; + private function __construct(){ - $this->register(0, DyeColor::WHITE()); - $this->register(1, DyeColor::ORANGE()); - $this->register(2, DyeColor::MAGENTA()); - $this->register(3, DyeColor::LIGHT_BLUE()); - $this->register(4, DyeColor::YELLOW()); - $this->register(5, DyeColor::LIME()); - $this->register(6, DyeColor::PINK()); - $this->register(7, DyeColor::GRAY()); - $this->register(8, DyeColor::LIGHT_GRAY()); - $this->register(9, DyeColor::CYAN()); - $this->register(10, DyeColor::PURPLE()); - $this->register(11, DyeColor::BLUE()); - $this->register(12, DyeColor::BROWN()); - $this->register(13, DyeColor::GREEN()); - $this->register(14, DyeColor::RED()); - $this->register(15, DyeColor::BLACK()); + $this->register(0, ItemTypeNames::WHITE_DYE, DyeColor::WHITE()); + $this->register(1, ItemTypeNames::ORANGE_DYE, DyeColor::ORANGE()); + $this->register(2, ItemTypeNames::MAGENTA_DYE, DyeColor::MAGENTA()); + $this->register(3, ItemTypeNames::LIGHT_BLUE_DYE, DyeColor::LIGHT_BLUE()); + $this->register(4, ItemTypeNames::YELLOW_DYE, DyeColor::YELLOW()); + $this->register(5, ItemTypeNames::LIME_DYE, DyeColor::LIME()); + $this->register(6, ItemTypeNames::PINK_DYE, DyeColor::PINK()); + $this->register(7, ItemTypeNames::GRAY_DYE, DyeColor::GRAY()); + $this->register(8, ItemTypeNames::LIGHT_GRAY_DYE, DyeColor::LIGHT_GRAY()); + $this->register(9, ItemTypeNames::CYAN_DYE, DyeColor::CYAN()); + $this->register(10, ItemTypeNames::PURPLE_DYE, DyeColor::PURPLE()); + $this->register(11, ItemTypeNames::BLUE_DYE, DyeColor::BLUE()); + $this->register(12, ItemTypeNames::BROWN_DYE, DyeColor::BROWN()); + $this->register(13, ItemTypeNames::GREEN_DYE, DyeColor::GREEN()); + $this->register(14, ItemTypeNames::RED_DYE, DyeColor::RED()); + $this->register(15, ItemTypeNames::BLACK_DYE, DyeColor::BLACK()); } - private function register(int $id, DyeColor $color) : void{ + private function register(int $id, string $itemId, DyeColor $color) : void{ $this->idToEnum[$id] = $color; $this->enumToId[$color->id()] = $id; + $this->itemIdToEnum[$itemId] = $color; + $this->enumToItemId[$color->id()] = $itemId; } public function toId(DyeColor $color) : int{ @@ -73,6 +88,10 @@ final class DyeColorIdMap{ return ~$this->toId($color) & 0xf; } + public function toItemId(DyeColor $color) : string{ + return $this->enumToItemId[$color->id()]; + } + public function fromId(int $id) : ?DyeColor{ return $this->idToEnum[$id]; } @@ -80,4 +99,8 @@ final class DyeColorIdMap{ public function fromInvertedId(int $id) : ?DyeColor{ return $this->fromId(~$id & 0xf); } + + public function fromItemId(string $itemId) : ?DyeColor{ + return $this->itemIdToEnum[$itemId] ?? null; + } } diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index d846b741bf..bde907d4e0 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -25,21 +25,12 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\block\utils\DyeColor; -use pocketmine\block\utils\SkullType; -use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; -use pocketmine\data\bedrock\PotionTypeIdMap; -use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; use pocketmine\item\Durable; use pocketmine\item\Item; -use pocketmine\item\VanillaItems as Items; use pocketmine\nbt\NbtException; use function min; @@ -53,7 +44,7 @@ final class ItemDeserializer{ public function __construct( private BlockStateDeserializer $blockStateDeserializer ){ - $this->registerDeserializers(); + new ItemSerializerDeserializerRegistrar($this, null); } /** @@ -119,484 +110,4 @@ final class ItemDeserializer{ return $itemStack; } - - private function registerSpecialBlockDeserializers() : void{ - $this->mapBlock(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()); - $this->mapBlock(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()); - $this->mapBlock(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()); - $this->mapBlock(Ids::CAKE, fn() => Blocks::CAKE()); - $this->mapBlock(Ids::CAULDRON, fn() => Blocks::CAULDRON()); - $this->mapBlock(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()); - $this->mapBlock(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()); - $this->mapBlock(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()); - $this->mapBlock(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()); - $this->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); - $this->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); - $this->mapBlock(Ids::HOPPER, fn() => Blocks::HOPPER()); - $this->mapBlock(Ids::IRON_DOOR, fn() => Blocks::IRON_DOOR()); - $this->mapBlock(Ids::JUNGLE_DOOR, fn() => Blocks::JUNGLE_DOOR()); - $this->mapBlock(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()); - $this->mapBlock(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()); - $this->mapBlock(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()); - $this->mapBlock(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()); - $this->mapBlock(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()); - $this->mapBlock(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()); - $this->mapBlock(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()); - - $this->mapBlock(Ids::BED, function(Data $data) : Block{ - $meta = $data->getMeta(); - $color = DyeColorIdMap::getInstance()->fromId($meta); - if($color === null){ - throw new ItemTypeDeserializeException("Unknown bed meta $meta"); - } - return Blocks::BED()->setColor($color); - }); - $this->mapBlock(Ids::SKULL, function(Data $data) : Block{ - $meta = $data->getMeta(); - try{ - $skullType = SkullType::fromMagicNumber($meta); - }catch(\InvalidArgumentException $e){ - throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); - } - return Blocks::MOB_HEAD()->setSkullType($skullType); - }); - } - - private function registerDeserializers() : void{ - $this->registerSpecialBlockDeserializers(); - - $this->map(Ids::ACACIA_BOAT, fn() => Items::ACACIA_BOAT()); - $this->map(Ids::ACACIA_SIGN, fn() => Items::ACACIA_SIGN()); - //TODO: minecraft:agent_spawn_egg - //TODO: minecraft:allay_spawn_egg - $this->map(Ids::AMETHYST_SHARD, fn() => Items::AMETHYST_SHARD()); - $this->map(Ids::APPLE, fn() => Items::APPLE()); - //TODO: minecraft:armor_stand - $this->map(Ids::ARROW, function(Data $data) : Item{ - if($data->getMeta() === 0){ - return Items::ARROW(); - } - throw new ItemTypeDeserializeException("Tipped arrows are not implemented yet"); - }); - //TODO: minecraft:axolotl_bucket - //TODO: minecraft:axolotl_spawn_egg - $this->map(Ids::BAKED_POTATO, fn() => Items::BAKED_POTATO()); - //TODO: minecraft:balloon - $this->map(Ids::BANNER, function(Data $data) : Item{ - $meta = $data->getMeta(); - $color = DyeColorIdMap::getInstance()->fromInvertedId($meta); - if($color === null){ - throw new ItemTypeDeserializeException("Unknown banner meta $meta"); - } - return Items::BANNER()->setColor($color); - }); - //TODO: minecraft:banner_pattern - //TODO: minecraft:bat_spawn_egg - //TODO: minecraft:bee_spawn_egg - $this->map(Ids::BEEF, fn() => Items::RAW_BEEF()); - $this->map(Ids::BEETROOT, fn() => Items::BEETROOT()); - $this->map(Ids::BEETROOT_SEEDS, fn() => Items::BEETROOT_SEEDS()); - $this->map(Ids::BEETROOT_SOUP, fn() => Items::BEETROOT_SOUP()); - $this->map(Ids::BIRCH_BOAT, fn() => Items::BIRCH_BOAT()); - $this->map(Ids::BIRCH_SIGN, fn() => Items::BIRCH_SIGN()); - $this->map(Ids::BLACK_DYE, fn() => Items::DYE()->setColor(DyeColor::BLACK())); - $this->map(Ids::BLAZE_POWDER, fn() => Items::BLAZE_POWDER()); - $this->map(Ids::BLAZE_ROD, fn() => Items::BLAZE_ROD()); - //TODO: minecraft:blaze_spawn_egg - $this->map(Ids::BLEACH, fn() => Items::BLEACH()); - $this->map(Ids::BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::BLUE())); - $this->map(Ids::BONE, fn() => Items::BONE()); - $this->map(Ids::BONE_MEAL, fn() => Items::BONE_MEAL()); - $this->map(Ids::BOOK, fn() => Items::BOOK()); - //TODO: minecraft:bordure_indented_banner_pattern - $this->map(Ids::BOW, fn() => Items::BOW()); - $this->map(Ids::BOWL, fn() => Items::BOWL()); - $this->map(Ids::BREAD, fn() => Items::BREAD()); - $this->map(Ids::BRICK, fn() => Items::BRICK()); - $this->map(Ids::BROWN_DYE, fn() => Items::DYE()->setColor(DyeColor::BROWN())); - $this->map(Ids::BUCKET, fn() => Items::BUCKET()); - //TODO: minecraft:camera - //TODO: minecraft:campfire - $this->map(Ids::CARROT, fn() => Items::CARROT()); - //TODO: minecraft:carrot_on_a_stick - //TODO: minecraft:cat_spawn_egg - //TODO: minecraft:cave_spider_spawn_egg - //TODO: minecraft:chain - $this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS()); - $this->map(Ids::CHAINMAIL_CHESTPLATE, fn() => Items::CHAINMAIL_CHESTPLATE()); - $this->map(Ids::CHAINMAIL_HELMET, fn() => Items::CHAINMAIL_HELMET()); - $this->map(Ids::CHAINMAIL_LEGGINGS, fn() => Items::CHAINMAIL_LEGGINGS()); - $this->map(Ids::CHARCOAL, fn() => Items::CHARCOAL()); - //TODO: minecraft:chest_minecart - $this->map(Ids::CHICKEN, fn() => Items::RAW_CHICKEN()); - //TODO: minecraft:chicken_spawn_egg - $this->map(Ids::CHORUS_FRUIT, fn() => Items::CHORUS_FRUIT()); - $this->map(Ids::CLAY_BALL, fn() => Items::CLAY()); - $this->map(Ids::CLOCK, fn() => Items::CLOCK()); - $this->map(Ids::COAL, fn() => Items::COAL()); - $this->map(Ids::COCOA_BEANS, fn() => Items::COCOA_BEANS()); - $this->map(Ids::COD, fn() => Items::RAW_FISH()); - //TODO: minecraft:cod_bucket - //TODO: minecraft:cod_spawn_egg - //TODO: minecraft:command_block_minecart - $this->map(Ids::COMPASS, fn() => Items::COMPASS()); - $this->map(Ids::COMPOUND, fn(Data $data) => match($data->getMeta()){ - CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), - CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(), - CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(), - CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(), - CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(), - CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(), - CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(), - CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(), - CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(), - CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(), - CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(), - CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(), - CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(), - CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(), - CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(), - CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(), - CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(), - CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(), - CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(), - CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(), - CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(), - CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(), - CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(), - CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(), - CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(), - CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(), - CompoundTypeIds::WATER => Items::CHEMICAL_WATER(), - CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(), - CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(), - CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(), - CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(), - CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(), - CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(), - CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(), - CompoundTypeIds::INK => Items::CHEMICAL_INK(), - CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), - CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), - CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), - default => throw new ItemTypeDeserializeException("Unknown chemical meta " . $data->getMeta()) - }); - $this->map(Ids::COOKED_BEEF, fn() => Items::STEAK()); - $this->map(Ids::COOKED_CHICKEN, fn() => Items::COOKED_CHICKEN()); - $this->map(Ids::COOKED_COD, fn() => Items::COOKED_FISH()); - $this->map(Ids::COOKED_MUTTON, fn() => Items::COOKED_MUTTON()); - $this->map(Ids::COOKED_PORKCHOP, fn() => Items::COOKED_PORKCHOP()); - $this->map(Ids::COOKED_RABBIT, fn() => Items::COOKED_RABBIT()); - $this->map(Ids::COOKED_SALMON, fn() => Items::COOKED_SALMON()); - $this->map(Ids::COOKIE, fn() => Items::COOKIE()); - $this->map(Ids::COPPER_INGOT, fn() => Items::COPPER_INGOT()); - //TODO: minecraft:cow_spawn_egg - //TODO: minecraft:creeper_banner_pattern - //TODO: minecraft:creeper_spawn_egg - $this->map(Ids::CRIMSON_SIGN, fn() => Items::CRIMSON_SIGN()); - //TODO: minecraft:crossbow - $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); - $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); - $this->map(Ids::DARK_OAK_SIGN, fn() => Items::DARK_OAK_SIGN()); - $this->map(Ids::DIAMOND, fn() => Items::DIAMOND()); - $this->map(Ids::DIAMOND_AXE, fn() => Items::DIAMOND_AXE()); - $this->map(Ids::DIAMOND_BOOTS, fn() => Items::DIAMOND_BOOTS()); - $this->map(Ids::DIAMOND_CHESTPLATE, fn() => Items::DIAMOND_CHESTPLATE()); - $this->map(Ids::DIAMOND_HELMET, fn() => Items::DIAMOND_HELMET()); - $this->map(Ids::DIAMOND_HOE, fn() => Items::DIAMOND_HOE()); - //TODO: minecraft:diamond_horse_armor - $this->map(Ids::DIAMOND_LEGGINGS, fn() => Items::DIAMOND_LEGGINGS()); - $this->map(Ids::DIAMOND_PICKAXE, fn() => Items::DIAMOND_PICKAXE()); - $this->map(Ids::DIAMOND_SHOVEL, fn() => Items::DIAMOND_SHOVEL()); - $this->map(Ids::DIAMOND_SWORD, fn() => Items::DIAMOND_SWORD()); - $this->map(Ids::DISC_FRAGMENT_5, fn() => Items::DISC_FRAGMENT_5()); - //TODO: minecraft:dolphin_spawn_egg - //TODO: minecraft:donkey_spawn_egg - $this->map(Ids::DRAGON_BREATH, fn() => Items::DRAGON_BREATH()); - $this->map(Ids::DRIED_KELP, fn() => Items::DRIED_KELP()); - //TODO: minecraft:drowned_spawn_egg - $this->map(Ids::ECHO_SHARD, fn() => Items::ECHO_SHARD()); - $this->map(Ids::EGG, fn() => Items::EGG()); - //TODO: minecraft:elder_guardian_spawn_egg - //TODO: minecraft:elytra - $this->map(Ids::EMERALD, fn() => Items::EMERALD()); - //TODO: minecraft:empty_map - //TODO: minecraft:enchanted_book - $this->map(Ids::ENCHANTED_GOLDEN_APPLE, fn() => Items::ENCHANTED_GOLDEN_APPLE()); - //TODO: minecraft:end_crystal - //TODO: minecraft:ender_eye - $this->map(Ids::ENDER_PEARL, fn() => Items::ENDER_PEARL()); - //TODO: minecraft:enderman_spawn_egg - //TODO: minecraft:endermite_spawn_egg - //TODO: minecraft:evoker_spawn_egg - $this->map(Ids::EXPERIENCE_BOTTLE, fn() => Items::EXPERIENCE_BOTTLE()); - $this->map(Ids::FEATHER, fn() => Items::FEATHER()); - $this->map(Ids::FERMENTED_SPIDER_EYE, fn() => Items::FERMENTED_SPIDER_EYE()); - //TODO: minecraft:field_masoned_banner_pattern - //TODO: minecraft:filled_map - $this->map(Ids::FIRE_CHARGE, fn() => Items::FIRE_CHARGE()); - //TODO: minecraft:firefly_spawn_egg - //TODO: minecraft:firework_rocket - //TODO: minecraft:firework_star - $this->map(Ids::FISHING_ROD, fn() => Items::FISHING_ROD()); - $this->map(Ids::FLINT, fn() => Items::FLINT()); - $this->map(Ids::FLINT_AND_STEEL, fn() => Items::FLINT_AND_STEEL()); - //TODO: minecraft:flower_banner_pattern - //TODO: minecraft:fox_spawn_egg - //TODO: minecraft:frog_spawn_egg - //TODO: minecraft:ghast_spawn_egg - $this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR()); - $this->map(Ids::GLASS_BOTTLE, fn() => Items::GLASS_BOTTLE()); - $this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON()); - //TODO: minecraft:globe_banner_pattern - //TODO: minecraft:glow_berries - $this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC()); - //TODO: minecraft:glow_squid_spawn_egg - //TODO: minecraft:glow_stick - $this->map(Ids::GLOWSTONE_DUST, fn() => Items::GLOWSTONE_DUST()); - //TODO: minecraft:goat_horn - //TODO: minecraft:goat_spawn_egg - $this->map(Ids::GOLD_INGOT, fn() => Items::GOLD_INGOT()); - $this->map(Ids::GOLD_NUGGET, fn() => Items::GOLD_NUGGET()); - $this->map(Ids::GOLDEN_APPLE, fn() => Items::GOLDEN_APPLE()); - $this->map(Ids::GOLDEN_AXE, fn() => Items::GOLDEN_AXE()); - $this->map(Ids::GOLDEN_BOOTS, fn() => Items::GOLDEN_BOOTS()); - $this->map(Ids::GOLDEN_CARROT, fn() => Items::GOLDEN_CARROT()); - $this->map(Ids::GOLDEN_CHESTPLATE, fn() => Items::GOLDEN_CHESTPLATE()); - $this->map(Ids::GOLDEN_HELMET, fn() => Items::GOLDEN_HELMET()); - $this->map(Ids::GOLDEN_HOE, fn() => Items::GOLDEN_HOE()); - //TODO: minecraft:golden_horse_armor - $this->map(Ids::GOLDEN_LEGGINGS, fn() => Items::GOLDEN_LEGGINGS()); - $this->map(Ids::GOLDEN_PICKAXE, fn() => Items::GOLDEN_PICKAXE()); - $this->map(Ids::GOLDEN_SHOVEL, fn() => Items::GOLDEN_SHOVEL()); - $this->map(Ids::GOLDEN_SWORD, fn() => Items::GOLDEN_SWORD()); - $this->map(Ids::GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::GRAY())); - $this->map(Ids::GREEN_DYE, fn() => Items::DYE()->setColor(DyeColor::GREEN())); - //TODO: minecraft:guardian_spawn_egg - $this->map(Ids::GUNPOWDER, fn() => Items::GUNPOWDER()); - $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); - //TODO: minecraft:hoglin_spawn_egg - $this->map(Ids::HONEY_BOTTLE, fn() => Items::HONEY_BOTTLE()); - $this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB()); - //TODO: minecraft:hopper_minecart - //TODO: minecraft:horse_spawn_egg - //TODO: minecraft:husk_spawn_egg - //TODO: minecraft:ice_bomb - $this->map(Ids::INK_SAC, fn() => Items::INK_SAC()); - $this->map(Ids::IRON_AXE, fn() => Items::IRON_AXE()); - $this->map(Ids::IRON_BOOTS, fn() => Items::IRON_BOOTS()); - $this->map(Ids::IRON_CHESTPLATE, fn() => Items::IRON_CHESTPLATE()); - $this->map(Ids::IRON_HELMET, fn() => Items::IRON_HELMET()); - $this->map(Ids::IRON_HOE, fn() => Items::IRON_HOE()); - //TODO: minecraft:iron_horse_armor - $this->map(Ids::IRON_INGOT, fn() => Items::IRON_INGOT()); - $this->map(Ids::IRON_LEGGINGS, fn() => Items::IRON_LEGGINGS()); - $this->map(Ids::IRON_NUGGET, fn() => Items::IRON_NUGGET()); - $this->map(Ids::IRON_PICKAXE, fn() => Items::IRON_PICKAXE()); - $this->map(Ids::IRON_SHOVEL, fn() => Items::IRON_SHOVEL()); - $this->map(Ids::IRON_SWORD, fn() => Items::IRON_SWORD()); - $this->map(Ids::JUNGLE_BOAT, fn() => Items::JUNGLE_BOAT()); - $this->map(Ids::JUNGLE_SIGN, fn() => Items::JUNGLE_SIGN()); - //TODO: minecraft:kelp - $this->map(Ids::LAPIS_LAZULI, fn() => Items::LAPIS_LAZULI()); - $this->map(Ids::LAVA_BUCKET, fn() => Items::LAVA_BUCKET()); - //TODO: minecraft:lead - $this->map(Ids::LEATHER, fn() => Items::LEATHER()); - $this->map(Ids::LEATHER_BOOTS, fn() => Items::LEATHER_BOOTS()); - $this->map(Ids::LEATHER_CHESTPLATE, fn() => Items::LEATHER_TUNIC()); - $this->map(Ids::LEATHER_HELMET, fn() => Items::LEATHER_CAP()); - //TODO: minecraft:leather_horse_armor - $this->map(Ids::LEATHER_LEGGINGS, fn() => Items::LEATHER_PANTS()); - $this->map(Ids::LIGHT_BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_BLUE())); - $this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_GRAY())); - $this->map(Ids::LIME_DYE, fn() => Items::DYE()->setColor(DyeColor::LIME())); - //TODO: minecraft:lingering_potion - //TODO: minecraft:llama_spawn_egg - //TODO: minecraft:lodestone_compass - $this->map(Ids::MAGENTA_DYE, fn() => Items::DYE()->setColor(DyeColor::MAGENTA())); - $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); - //TODO: minecraft:magma_cube_spawn_egg - $this->map(Ids::MANGROVE_SIGN, fn() => Items::MANGROVE_SIGN()); - //TODO: minecraft:medicine - $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); - $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); - $this->map(Ids::MILK_BUCKET, fn() => Items::MILK_BUCKET()); - $this->map(Ids::MINECART, fn() => Items::MINECART()); - //TODO: minecraft:mojang_banner_pattern - //TODO: minecraft:mooshroom_spawn_egg - //TODO: minecraft:mule_spawn_egg - $this->map(Ids::MUSHROOM_STEW, fn() => Items::MUSHROOM_STEW()); - $this->map(Ids::MUSIC_DISC_11, fn() => Items::RECORD_11()); - $this->map(Ids::MUSIC_DISC_13, fn() => Items::RECORD_13()); - $this->map(Ids::MUSIC_DISC_BLOCKS, fn() => Items::RECORD_BLOCKS()); - $this->map(Ids::MUSIC_DISC_CAT, fn() => Items::RECORD_CAT()); - $this->map(Ids::MUSIC_DISC_CHIRP, fn() => Items::RECORD_CHIRP()); - $this->map(Ids::MUSIC_DISC_FAR, fn() => Items::RECORD_FAR()); - $this->map(Ids::MUSIC_DISC_MALL, fn() => Items::RECORD_MALL()); - $this->map(Ids::MUSIC_DISC_MELLOHI, fn() => Items::RECORD_MELLOHI()); - //TODO: minecraft:music_disc_otherside - //TODO: minecraft:music_disc_pigstep - $this->map(Ids::MUSIC_DISC_STAL, fn() => Items::RECORD_STAL()); - $this->map(Ids::MUSIC_DISC_STRAD, fn() => Items::RECORD_STRAD()); - $this->map(Ids::MUSIC_DISC_WAIT, fn() => Items::RECORD_WAIT()); - $this->map(Ids::MUSIC_DISC_WARD, fn() => Items::RECORD_WARD()); - $this->map(Ids::MUTTON, fn() => Items::RAW_MUTTON()); - //TODO: minecraft:name_tag - $this->map(Ids::NAUTILUS_SHELL, fn() => Items::NAUTILUS_SHELL()); - //TODO: minecraft:nether_sprouts - $this->map(Ids::NETHER_STAR, fn() => Items::NETHER_STAR()); - $this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK()); - $this->map(Ids::NETHERITE_AXE, fn() => Items::NETHERITE_AXE()); - $this->map(Ids::NETHERITE_BOOTS, fn() => Items::NETHERITE_BOOTS()); - $this->map(Ids::NETHERITE_CHESTPLATE, fn() => Items::NETHERITE_CHESTPLATE()); - $this->map(Ids::NETHERITE_HELMET, fn() => Items::NETHERITE_HELMET()); - $this->map(Ids::NETHERITE_HOE, fn() => Items::NETHERITE_HOE()); - $this->map(Ids::NETHERITE_INGOT, fn() => Items::NETHERITE_INGOT()); - $this->map(Ids::NETHERITE_LEGGINGS, fn() => Items::NETHERITE_LEGGINGS()); - $this->map(Ids::NETHERITE_PICKAXE, fn() => Items::NETHERITE_PICKAXE()); - $this->map(Ids::NETHERITE_SCRAP, fn() => Items::NETHERITE_SCRAP()); - $this->map(Ids::NETHERITE_SHOVEL, fn() => Items::NETHERITE_SHOVEL()); - $this->map(Ids::NETHERITE_SWORD, fn() => Items::NETHERITE_SWORD()); - //TODO: minecraft:npc_spawn_egg - $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); - $this->map(Ids::OAK_SIGN, fn() => Items::OAK_SIGN()); - //TODO: minecraft:ocelot_spawn_egg - $this->map(Ids::ORANGE_DYE, fn() => Items::DYE()->setColor(DyeColor::ORANGE())); - $this->map(Ids::PAINTING, fn() => Items::PAINTING()); - //TODO: minecraft:panda_spawn_egg - $this->map(Ids::PAPER, fn() => Items::PAPER()); - //TODO: minecraft:parrot_spawn_egg - $this->map(Ids::PHANTOM_MEMBRANE, fn() => Items::PHANTOM_MEMBRANE()); - //TODO: minecraft:phantom_spawn_egg - //TODO: minecraft:pig_spawn_egg - //TODO: minecraft:piglin_banner_pattern - //TODO: minecraft:piglin_brute_spawn_egg - //TODO: minecraft:piglin_spawn_egg - //TODO: minecraft:pillager_spawn_egg - $this->map(Ids::PINK_DYE, fn() => Items::DYE()->setColor(DyeColor::PINK())); - $this->map(Ids::POISONOUS_POTATO, fn() => Items::POISONOUS_POTATO()); - //TODO: minecraft:polar_bear_spawn_egg - $this->map(Ids::POPPED_CHORUS_FRUIT, fn() => Items::POPPED_CHORUS_FRUIT()); - $this->map(Ids::PORKCHOP, fn() => Items::RAW_PORKCHOP()); - $this->map(Ids::POTATO, fn() => Items::POTATO()); - $this->map(Ids::POTION, function(Data $data) : Item{ - $meta = $data->getMeta(); - $potionType = PotionTypeIdMap::getInstance()->fromId($meta); - if($potionType === null){ - throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); - } - return Items::POTION()->setType($potionType); - }); - //TODO: minecraft:powder_snow_bucket - $this->map(Ids::PRISMARINE_CRYSTALS, fn() => Items::PRISMARINE_CRYSTALS()); - $this->map(Ids::PRISMARINE_SHARD, fn() => Items::PRISMARINE_SHARD()); - $this->map(Ids::PUFFERFISH, fn() => Items::PUFFERFISH()); - //TODO: minecraft:pufferfish_bucket - //TODO: minecraft:pufferfish_spawn_egg - $this->map(Ids::PUMPKIN_PIE, fn() => Items::PUMPKIN_PIE()); - $this->map(Ids::PUMPKIN_SEEDS, fn() => Items::PUMPKIN_SEEDS()); - $this->map(Ids::PURPLE_DYE, fn() => Items::DYE()->setColor(DyeColor::PURPLE())); - $this->map(Ids::QUARTZ, fn() => Items::NETHER_QUARTZ()); - $this->map(Ids::RABBIT, fn() => Items::RAW_RABBIT()); - $this->map(Ids::RABBIT_FOOT, fn() => Items::RABBIT_FOOT()); - $this->map(Ids::RABBIT_HIDE, fn() => Items::RABBIT_HIDE()); - //TODO: minecraft:rabbit_spawn_egg - $this->map(Ids::RABBIT_STEW, fn() => Items::RABBIT_STEW()); - //TODO: minecraft:rapid_fertilizer - //TODO: minecraft:ravager_spawn_egg - $this->map(Ids::RAW_COPPER, fn() => Items::RAW_COPPER()); - $this->map(Ids::RAW_GOLD, fn() => Items::RAW_GOLD()); - $this->map(Ids::RAW_IRON, fn() => Items::RAW_IRON()); - $this->map(Ids::RED_DYE, fn() => Items::DYE()->setColor(DyeColor::RED())); - $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); - $this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH()); - //TODO: minecraft:saddle - $this->map(Ids::SALMON, fn() => Items::RAW_SALMON()); - //TODO: minecraft:salmon_bucket - //TODO: minecraft:salmon_spawn_egg - $this->map(Ids::SCUTE, fn() => Items::SCUTE()); - $this->map(Ids::SHEARS, fn() => Items::SHEARS()); - //TODO: minecraft:sheep_spawn_egg - //TODO: minecraft:shield - $this->map(Ids::SHULKER_SHELL, fn() => Items::SHULKER_SHELL()); - //TODO: minecraft:shulker_spawn_egg - //TODO: minecraft:silverfish_spawn_egg - //TODO: minecraft:skeleton_horse_spawn_egg - //TODO: minecraft:skeleton_spawn_egg - //TODO: minecraft:skull_banner_pattern - $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); - //TODO: minecraft:slime_spawn_egg - $this->map(Ids::SNOWBALL, fn() => Items::SNOWBALL()); - //TODO: minecraft:soul_campfire - //TODO: minecraft:sparkler - $this->map(Ids::SPIDER_EYE, fn() => Items::SPIDER_EYE()); - //TODO: minecraft:spider_spawn_egg - $this->map(Ids::SPLASH_POTION, function(Data $data) : Item{ - $meta = $data->getMeta(); - $potionType = PotionTypeIdMap::getInstance()->fromId($meta); - if($potionType === null){ - throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); - } - return Items::SPLASH_POTION()->setType($potionType); - }); - $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); - $this->map(Ids::SPRUCE_SIGN, fn() => Items::SPRUCE_SIGN()); - $this->map(Ids::SPYGLASS, fn() => Items::SPYGLASS()); - $this->map(Ids::SQUID_SPAWN_EGG, fn() => Items::SQUID_SPAWN_EGG()); - $this->map(Ids::STICK, fn() => Items::STICK()); - $this->map(Ids::STONE_AXE, fn() => Items::STONE_AXE()); - $this->map(Ids::STONE_HOE, fn() => Items::STONE_HOE()); - $this->map(Ids::STONE_PICKAXE, fn() => Items::STONE_PICKAXE()); - $this->map(Ids::STONE_SHOVEL, fn() => Items::STONE_SHOVEL()); - $this->map(Ids::STONE_SWORD, fn() => Items::STONE_SWORD()); - //TODO: minecraft:stray_spawn_egg - //TODO: minecraft:strider_spawn_egg - $this->map(Ids::STRING, fn() => Items::STRING()); - $this->map(Ids::SUGAR, fn() => Items::SUGAR()); - $this->map(Ids::SUSPICIOUS_STEW, function(Data $data) : Item{ - $meta = $data->getMeta(); - $suspiciousStewType = SuspiciousStewTypeIdMap::getInstance()->fromId($meta); - if($suspiciousStewType === null){ - throw new ItemTypeDeserializeException("Unknown suspicious stew type ID $meta"); - } - return Items::SUSPICIOUS_STEW()->setType($suspiciousStewType); - }); - $this->map(Ids::SWEET_BERRIES, fn() => Items::SWEET_BERRIES()); - //TODO: minecraft:tadpole_bucket - //TODO: minecraft:tadpole_spawn_egg - //TODO: minecraft:tnt_minecart - $this->map(Ids::TOTEM_OF_UNDYING, fn() => Items::TOTEM()); - //TODO: minecraft:trident - $this->map(Ids::TROPICAL_FISH, fn() => Items::CLOWNFISH()); - //TODO: minecraft:tropical_fish_bucket - //TODO: minecraft:tropical_fish_spawn_egg - //TODO: minecraft:turtle_helmet - //TODO: minecraft:turtle_spawn_egg - //TODO: minecraft:vex_spawn_egg - $this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG()); - //TODO: minecraft:vindicator_spawn_egg - //TODO: minecraft:wandering_trader_spawn_egg - //TODO: minecraft:warped_fungus_on_a_stick - $this->map(Ids::WARPED_SIGN, fn() => Items::WARPED_SIGN()); - $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); - $this->map(Ids::WHEAT, fn() => Items::WHEAT()); - $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); - $this->map(Ids::WHITE_DYE, fn() => Items::DYE()->setColor(DyeColor::WHITE())); - //TODO: minecraft:witch_spawn_egg - //TODO: minecraft:wither_skeleton_spawn_egg - //TODO: minecraft:wolf_spawn_egg - $this->map(Ids::WOODEN_AXE, fn() => Items::WOODEN_AXE()); - $this->map(Ids::WOODEN_HOE, fn() => Items::WOODEN_HOE()); - $this->map(Ids::WOODEN_PICKAXE, fn() => Items::WOODEN_PICKAXE()); - $this->map(Ids::WOODEN_SHOVEL, fn() => Items::WOODEN_SHOVEL()); - $this->map(Ids::WOODEN_SWORD, fn() => Items::WOODEN_SWORD()); - $this->map(Ids::WRITABLE_BOOK, fn() => Items::WRITABLE_BOOK()); - $this->map(Ids::WRITTEN_BOOK, fn() => Items::WRITTEN_BOOK()); - $this->map(Ids::YELLOW_DYE, fn() => Items::DYE()->setColor(DyeColor::YELLOW())); - //TODO: minecraft:zoglin_spawn_egg - //TODO: minecraft:zombie_horse_spawn_egg - //TODO: minecraft:zombie_pigman_spawn_egg - $this->map(Ids::ZOMBIE_SPAWN_EGG, fn() => Items::ZOMBIE_SPAWN_EGG()); - //TODO: minecraft:zombie_villager_spawn_egg - } } diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 6945eac5ee..152334d759 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -23,28 +23,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; -use pocketmine\block\Bed; use pocketmine\block\Block; -use pocketmine\block\ItemFrame; -use pocketmine\block\Skull; -use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; -use pocketmine\data\bedrock\PotionTypeIdMap; -use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; -use pocketmine\item\Banner; use pocketmine\item\CoralFan; -use pocketmine\item\Dye; use pocketmine\item\Item; use pocketmine\item\ItemBlock; -use pocketmine\item\Potion; -use pocketmine\item\SplashPotion; -use pocketmine\item\SuspiciousStew; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; use function class_parents; @@ -69,7 +55,8 @@ final class ItemSerializer{ public function __construct( private BlockStateSerializer $blockStateSerializer ){ - $this->registerSerializers(); + $this->registerSpecialBlockSerializers(); + new ItemSerializerDeserializerRegistrar(null, $this); } /** @@ -212,324 +199,10 @@ final class ItemSerializer{ return new Data($itemNameId, 0, $blockStateData); } - /** - * @phpstan-return \Closure() : Data - */ - private static function id(string $id) : \Closure{ - return fn() => new Data($id); - } - - /** - * @phpstan-return \Closure() : Data - */ - private static function chemical(int $type) : \Closure{ - return fn() => new Data(Ids::COMPOUND, $type); - } - private function registerSpecialBlockSerializers() : void{ - $this->mapBlock(Blocks::ACACIA_DOOR(), self::id(Ids::ACACIA_DOOR)); - $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); - $this->mapBlock(Blocks::BREWING_STAND(), self::id(Ids::BREWING_STAND)); - $this->mapBlock(Blocks::CAKE(), self::id(Ids::CAKE)); - $this->mapBlock(Blocks::CAULDRON(), self::id(Ids::CAULDRON)); - $this->mapBlock(Blocks::CRIMSON_DOOR(), self::id(Ids::CRIMSON_DOOR)); - $this->mapBlock(Blocks::DARK_OAK_DOOR(), self::id(Ids::DARK_OAK_DOOR)); - $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); - $this->mapBlock(Blocks::HOPPER(), self::id(Ids::HOPPER)); - $this->mapBlock(Blocks::IRON_DOOR(), self::id(Ids::IRON_DOOR)); - $this->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); - $this->mapBlock(Blocks::JUNGLE_DOOR(), self::id(Ids::JUNGLE_DOOR)); - $this->mapBlock(Blocks::MANGROVE_DOOR(), self::id(Ids::MANGROVE_DOOR)); - $this->mapBlock(Blocks::NETHER_WART(), self::id(Ids::NETHER_WART)); - $this->mapBlock(Blocks::OAK_DOOR(), self::id(Ids::WOODEN_DOOR)); - $this->mapBlock(Blocks::REDSTONE_COMPARATOR(), self::id(Ids::COMPARATOR)); - $this->mapBlock(Blocks::REDSTONE_REPEATER(), self::id(Ids::REPEATER)); - $this->mapBlock(Blocks::SPRUCE_DOOR(), self::id(Ids::SPRUCE_DOOR)); - $this->mapBlock(Blocks::SUGARCANE(), self::id(Ids::SUGAR_CANE)); - $this->mapBlock(Blocks::WARPED_DOOR(), self::id(Ids::WARPED_DOOR)); - - $this->mapBlock(Blocks::BED(), fn(Bed $block) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($block->getColor()))); - $this->mapBlock(Blocks::MOB_HEAD(), fn(Skull $block) => new Data(Ids::SKULL, $block->getSkullType()->getMagicNumber())); - } - - private function registerSerializers() : void{ - $this->registerSpecialBlockSerializers(); - //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock //Bamboo->getBlock() returns BambooSapling :( $this->map(Items::BAMBOO(), fn() => $this->standardBlock(Blocks::BAMBOO())); $this->map(Items::CORAL_FAN(), fn(CoralFan $item) => $this->standardBlock($item->getBlock())); - - $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); - $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); - $this->map(Items::AMETHYST_SHARD(), self::id(Ids::AMETHYST_SHARD)); - $this->map(Items::APPLE(), self::id(Ids::APPLE)); - $this->map(Items::ARROW(), self::id(Ids::ARROW)); - $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); - $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); - $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); - $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); - $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); - $this->map(Items::BIRCH_BOAT(), self::id(Ids::BIRCH_BOAT)); - $this->map(Items::BIRCH_SIGN(), self::id(Ids::BIRCH_SIGN)); - $this->map(Items::BLAZE_POWDER(), self::id(Ids::BLAZE_POWDER)); - $this->map(Items::BLAZE_ROD(), self::id(Ids::BLAZE_ROD)); - $this->map(Items::BLEACH(), self::id(Ids::BLEACH)); - $this->map(Items::BONE(), self::id(Ids::BONE)); - $this->map(Items::BONE_MEAL(), self::id(Ids::BONE_MEAL)); - $this->map(Items::BOOK(), self::id(Ids::BOOK)); - $this->map(Items::BOW(), self::id(Ids::BOW)); - $this->map(Items::BOWL(), self::id(Ids::BOWL)); - $this->map(Items::BREAD(), self::id(Ids::BREAD)); - $this->map(Items::BRICK(), self::id(Ids::BRICK)); - $this->map(Items::BUCKET(), self::id(Ids::BUCKET)); - $this->map(Items::CARROT(), self::id(Ids::CARROT)); - $this->map(Items::CHAINMAIL_BOOTS(), self::id(Ids::CHAINMAIL_BOOTS)); - $this->map(Items::CHAINMAIL_CHESTPLATE(), self::id(Ids::CHAINMAIL_CHESTPLATE)); - $this->map(Items::CHAINMAIL_HELMET(), self::id(Ids::CHAINMAIL_HELMET)); - $this->map(Items::CHAINMAIL_LEGGINGS(), self::id(Ids::CHAINMAIL_LEGGINGS)); - $this->map(Items::CHARCOAL(), self::id(Ids::CHARCOAL)); - $this->map(Items::CHEMICAL_ALUMINIUM_OXIDE(), self::chemical(CompoundTypeIds::ALUMINIUM_OXIDE)); - $this->map(Items::CHEMICAL_AMMONIA(), self::chemical(CompoundTypeIds::AMMONIA)); - $this->map(Items::CHEMICAL_BARIUM_SULPHATE(), self::chemical(CompoundTypeIds::BARIUM_SULPHATE)); - $this->map(Items::CHEMICAL_BENZENE(), self::chemical(CompoundTypeIds::BENZENE)); - $this->map(Items::CHEMICAL_BORON_TRIOXIDE(), self::chemical(CompoundTypeIds::BORON_TRIOXIDE)); - $this->map(Items::CHEMICAL_CALCIUM_BROMIDE(), self::chemical(CompoundTypeIds::CALCIUM_BROMIDE)); - $this->map(Items::CHEMICAL_CALCIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CALCIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_CERIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CERIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_CHARCOAL(), self::chemical(CompoundTypeIds::CHARCOAL)); - $this->map(Items::CHEMICAL_CRUDE_OIL(), self::chemical(CompoundTypeIds::CRUDE_OIL)); - $this->map(Items::CHEMICAL_GLUE(), self::chemical(CompoundTypeIds::GLUE)); - $this->map(Items::CHEMICAL_HYDROGEN_PEROXIDE(), self::chemical(CompoundTypeIds::HYDROGEN_PEROXIDE)); - $this->map(Items::CHEMICAL_HYPOCHLORITE(), self::chemical(CompoundTypeIds::HYPOCHLORITE)); - $this->map(Items::CHEMICAL_INK(), self::chemical(CompoundTypeIds::INK)); - $this->map(Items::CHEMICAL_IRON_SULPHIDE(), self::chemical(CompoundTypeIds::IRON_SULPHIDE)); - $this->map(Items::CHEMICAL_LATEX(), self::chemical(CompoundTypeIds::LATEX)); - $this->map(Items::CHEMICAL_LITHIUM_HYDRIDE(), self::chemical(CompoundTypeIds::LITHIUM_HYDRIDE)); - $this->map(Items::CHEMICAL_LUMINOL(), self::chemical(CompoundTypeIds::LUMINOL)); - $this->map(Items::CHEMICAL_MAGNESIUM_NITRATE(), self::chemical(CompoundTypeIds::MAGNESIUM_NITRATE)); - $this->map(Items::CHEMICAL_MAGNESIUM_OXIDE(), self::chemical(CompoundTypeIds::MAGNESIUM_OXIDE)); - $this->map(Items::CHEMICAL_MAGNESIUM_SALTS(), self::chemical(CompoundTypeIds::MAGNESIUM_SALTS)); - $this->map(Items::CHEMICAL_MERCURIC_CHLORIDE(), self::chemical(CompoundTypeIds::MERCURIC_CHLORIDE)); - $this->map(Items::CHEMICAL_POLYETHYLENE(), self::chemical(CompoundTypeIds::POLYETHYLENE)); - $this->map(Items::CHEMICAL_POTASSIUM_CHLORIDE(), self::chemical(CompoundTypeIds::POTASSIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_POTASSIUM_IODIDE(), self::chemical(CompoundTypeIds::POTASSIUM_IODIDE)); - $this->map(Items::CHEMICAL_RUBBISH(), self::chemical(CompoundTypeIds::RUBBISH)); - $this->map(Items::CHEMICAL_SALT(), self::chemical(CompoundTypeIds::SALT)); - $this->map(Items::CHEMICAL_SOAP(), self::chemical(CompoundTypeIds::SOAP)); - $this->map(Items::CHEMICAL_SODIUM_ACETATE(), self::chemical(CompoundTypeIds::SODIUM_ACETATE)); - $this->map(Items::CHEMICAL_SODIUM_FLUORIDE(), self::chemical(CompoundTypeIds::SODIUM_FLUORIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYDRIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDRIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYDROXIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDROXIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYPOCHLORITE(), self::chemical(CompoundTypeIds::SODIUM_HYPOCHLORITE)); - $this->map(Items::CHEMICAL_SODIUM_OXIDE(), self::chemical(CompoundTypeIds::SODIUM_OXIDE)); - $this->map(Items::CHEMICAL_SUGAR(), self::chemical(CompoundTypeIds::SUGAR)); - $this->map(Items::CHEMICAL_SULPHATE(), self::chemical(CompoundTypeIds::SULPHATE)); - $this->map(Items::CHEMICAL_TUNGSTEN_CHLORIDE(), self::chemical(CompoundTypeIds::TUNGSTEN_CHLORIDE)); - $this->map(Items::CHEMICAL_WATER(), self::chemical(CompoundTypeIds::WATER)); - $this->map(Items::CHORUS_FRUIT(), self::id(Ids::CHORUS_FRUIT)); - $this->map(Items::CLAY(), self::id(Ids::CLAY_BALL)); - $this->map(Items::CLOCK(), self::id(Ids::CLOCK)); - $this->map(Items::CLOWNFISH(), self::id(Ids::TROPICAL_FISH)); - $this->map(Items::COAL(), self::id(Ids::COAL)); - $this->map(Items::COCOA_BEANS(), self::id(Ids::COCOA_BEANS)); - $this->map(Items::COMPASS(), self::id(Ids::COMPASS)); - $this->map(Items::COOKED_CHICKEN(), self::id(Ids::COOKED_CHICKEN)); - $this->map(Items::COOKED_FISH(), self::id(Ids::COOKED_COD)); - $this->map(Items::COOKED_MUTTON(), self::id(Ids::COOKED_MUTTON)); - $this->map(Items::COOKED_PORKCHOP(), self::id(Ids::COOKED_PORKCHOP)); - $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); - $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); - $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); - $this->map(Items::COPPER_INGOT(), self::id(Ids::COPPER_INGOT)); - $this->map(Items::CRIMSON_SIGN(), self::id(Ids::CRIMSON_SIGN)); - $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); - $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); - $this->map(Items::DIAMOND(), self::id(Ids::DIAMOND)); - $this->map(Items::DIAMOND_AXE(), self::id(Ids::DIAMOND_AXE)); - $this->map(Items::DIAMOND_BOOTS(), self::id(Ids::DIAMOND_BOOTS)); - $this->map(Items::DIAMOND_CHESTPLATE(), self::id(Ids::DIAMOND_CHESTPLATE)); - $this->map(Items::DIAMOND_HELMET(), self::id(Ids::DIAMOND_HELMET)); - $this->map(Items::DIAMOND_HOE(), self::id(Ids::DIAMOND_HOE)); - $this->map(Items::DIAMOND_LEGGINGS(), self::id(Ids::DIAMOND_LEGGINGS)); - $this->map(Items::DIAMOND_PICKAXE(), self::id(Ids::DIAMOND_PICKAXE)); - $this->map(Items::DIAMOND_SHOVEL(), self::id(Ids::DIAMOND_SHOVEL)); - $this->map(Items::DIAMOND_SWORD(), self::id(Ids::DIAMOND_SWORD)); - $this->map(Items::DISC_FRAGMENT_5(), self::id(Ids::DISC_FRAGMENT_5)); - $this->map(Items::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH)); - $this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP)); - $this->map(Items::DYE(), fn(Dye $item) => new Data(match($item->getColor()){ - DyeColor::BLACK() => Ids::BLACK_DYE, - DyeColor::BLUE() => Ids::BLUE_DYE, - DyeColor::BROWN() => Ids::BROWN_DYE, - DyeColor::CYAN() => Ids::CYAN_DYE, - DyeColor::GRAY() => Ids::GRAY_DYE, - DyeColor::GREEN() => Ids::GREEN_DYE, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_DYE, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_DYE, - DyeColor::LIME() => Ids::LIME_DYE, - DyeColor::MAGENTA() => Ids::MAGENTA_DYE, - DyeColor::ORANGE() => Ids::ORANGE_DYE, - DyeColor::PINK() => Ids::PINK_DYE, - DyeColor::PURPLE() => Ids::PURPLE_DYE, - DyeColor::RED() => Ids::RED_DYE, - DyeColor::WHITE() => Ids::WHITE_DYE, - DyeColor::YELLOW() => Ids::YELLOW_DYE, - default => throw new AssumptionFailedError("Unhandled dye color " . $item->getColor()->name()), - })); - $this->map(Items::ECHO_SHARD(), self::id(Ids::ECHO_SHARD)); - $this->map(Items::EGG(), self::id(Ids::EGG)); - $this->map(Items::EMERALD(), self::id(Ids::EMERALD)); - $this->map(Items::ENCHANTED_GOLDEN_APPLE(), self::id(Ids::ENCHANTED_GOLDEN_APPLE)); - $this->map(Items::ENDER_PEARL(), self::id(Ids::ENDER_PEARL)); - $this->map(Items::EXPERIENCE_BOTTLE(), self::id(Ids::EXPERIENCE_BOTTLE)); - $this->map(Items::FEATHER(), self::id(Ids::FEATHER)); - $this->map(Items::FERMENTED_SPIDER_EYE(), self::id(Ids::FERMENTED_SPIDER_EYE)); - $this->map(Items::FIRE_CHARGE(), self::id(Ids::FIRE_CHARGE)); - $this->map(Items::FISHING_ROD(), self::id(Ids::FISHING_ROD)); - $this->map(Items::FLINT(), self::id(Ids::FLINT)); - $this->map(Items::FLINT_AND_STEEL(), self::id(Ids::FLINT_AND_STEEL)); - $this->map(Items::GHAST_TEAR(), self::id(Ids::GHAST_TEAR)); - $this->map(Items::GLASS_BOTTLE(), self::id(Ids::GLASS_BOTTLE)); - $this->map(Items::GLISTERING_MELON(), self::id(Ids::GLISTERING_MELON_SLICE)); - $this->map(Items::GLOWSTONE_DUST(), self::id(Ids::GLOWSTONE_DUST)); - $this->map(Items::GLOW_INK_SAC(), self::id(Ids::GLOW_INK_SAC)); - $this->map(Items::GOLDEN_APPLE(), self::id(Ids::GOLDEN_APPLE)); - $this->map(Items::GOLDEN_AXE(), self::id(Ids::GOLDEN_AXE)); - $this->map(Items::GOLDEN_BOOTS(), self::id(Ids::GOLDEN_BOOTS)); - $this->map(Items::GOLDEN_CARROT(), self::id(Ids::GOLDEN_CARROT)); - $this->map(Items::GOLDEN_CHESTPLATE(), self::id(Ids::GOLDEN_CHESTPLATE)); - $this->map(Items::GOLDEN_HELMET(), self::id(Ids::GOLDEN_HELMET)); - $this->map(Items::GOLDEN_HOE(), self::id(Ids::GOLDEN_HOE)); - $this->map(Items::GOLDEN_LEGGINGS(), self::id(Ids::GOLDEN_LEGGINGS)); - $this->map(Items::GOLDEN_PICKAXE(), self::id(Ids::GOLDEN_PICKAXE)); - $this->map(Items::GOLDEN_SHOVEL(), self::id(Ids::GOLDEN_SHOVEL)); - $this->map(Items::GOLDEN_SWORD(), self::id(Ids::GOLDEN_SWORD)); - $this->map(Items::GOLD_INGOT(), self::id(Ids::GOLD_INGOT)); - $this->map(Items::GOLD_NUGGET(), self::id(Ids::GOLD_NUGGET)); - $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); - $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); - $this->map(Items::HONEYCOMB(), self::id(Ids::HONEYCOMB)); - $this->map(Items::HONEY_BOTTLE(), self::id(Ids::HONEY_BOTTLE)); - $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); - $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); - $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); - $this->map(Items::IRON_CHESTPLATE(), self::id(Ids::IRON_CHESTPLATE)); - $this->map(Items::IRON_HELMET(), self::id(Ids::IRON_HELMET)); - $this->map(Items::IRON_HOE(), self::id(Ids::IRON_HOE)); - $this->map(Items::IRON_INGOT(), self::id(Ids::IRON_INGOT)); - $this->map(Items::IRON_LEGGINGS(), self::id(Ids::IRON_LEGGINGS)); - $this->map(Items::IRON_NUGGET(), self::id(Ids::IRON_NUGGET)); - $this->map(Items::IRON_PICKAXE(), self::id(Ids::IRON_PICKAXE)); - $this->map(Items::IRON_SHOVEL(), self::id(Ids::IRON_SHOVEL)); - $this->map(Items::IRON_SWORD(), self::id(Ids::IRON_SWORD)); - $this->map(Items::JUNGLE_BOAT(), self::id(Ids::JUNGLE_BOAT)); - $this->map(Items::JUNGLE_SIGN(), self::id(Ids::JUNGLE_SIGN)); - $this->map(Items::LAPIS_LAZULI(), self::id(Ids::LAPIS_LAZULI)); - $this->map(Items::LAVA_BUCKET(), self::id(Ids::LAVA_BUCKET)); - $this->map(Items::LEATHER(), self::id(Ids::LEATHER)); - $this->map(Items::LEATHER_BOOTS(), self::id(Ids::LEATHER_BOOTS)); - $this->map(Items::LEATHER_CAP(), self::id(Ids::LEATHER_HELMET)); - $this->map(Items::LEATHER_PANTS(), self::id(Ids::LEATHER_LEGGINGS)); - $this->map(Items::LEATHER_TUNIC(), self::id(Ids::LEATHER_CHESTPLATE)); - $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); - $this->map(Items::MANGROVE_SIGN(), self::id(Ids::MANGROVE_SIGN)); - $this->map(Items::MELON(), self::id(Ids::MELON_SLICE)); - $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); - $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); - $this->map(Items::MINECART(), self::id(Ids::MINECART)); - $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); - $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); - $this->map(Items::NETHERITE_AXE(), self::id(Ids::NETHERITE_AXE)); - $this->map(Items::NETHERITE_BOOTS(), self::id(Ids::NETHERITE_BOOTS)); - $this->map(Items::NETHERITE_CHESTPLATE(), self::id(Ids::NETHERITE_CHESTPLATE)); - $this->map(Items::NETHERITE_HELMET(), self::id(Ids::NETHERITE_HELMET)); - $this->map(Items::NETHERITE_HOE(), self::id(Ids::NETHERITE_HOE)); - $this->map(Items::NETHERITE_INGOT(), self::id(Ids::NETHERITE_INGOT)); - $this->map(Items::NETHERITE_LEGGINGS(), self::id(Ids::NETHERITE_LEGGINGS)); - $this->map(Items::NETHERITE_PICKAXE(), self::id(Ids::NETHERITE_PICKAXE)); - $this->map(Items::NETHERITE_SCRAP(), self::id(Ids::NETHERITE_SCRAP)); - $this->map(Items::NETHERITE_SHOVEL(), self::id(Ids::NETHERITE_SHOVEL)); - $this->map(Items::NETHERITE_SWORD(), self::id(Ids::NETHERITE_SWORD)); - $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); - $this->map(Items::NETHER_QUARTZ(), self::id(Ids::QUARTZ)); - $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); - $this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT)); - $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); - $this->map(Items::PAINTING(), self::id(Ids::PAINTING)); - $this->map(Items::PAPER(), self::id(Ids::PAPER)); - $this->map(Items::PHANTOM_MEMBRANE(), self::id(Ids::PHANTOM_MEMBRANE)); - $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); - $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); - $this->map(Items::POTATO(), self::id(Ids::POTATO)); - $this->map(Items::POTION(), fn(Potion $item) => new Data(Ids::POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::PRISMARINE_CRYSTALS(), self::id(Ids::PRISMARINE_CRYSTALS)); - $this->map(Items::PRISMARINE_SHARD(), self::id(Ids::PRISMARINE_SHARD)); - $this->map(Items::PUFFERFISH(), self::id(Ids::PUFFERFISH)); - $this->map(Items::PUMPKIN_PIE(), self::id(Ids::PUMPKIN_PIE)); - $this->map(Items::PUMPKIN_SEEDS(), self::id(Ids::PUMPKIN_SEEDS)); - $this->map(Items::RABBIT_FOOT(), self::id(Ids::RABBIT_FOOT)); - $this->map(Items::RABBIT_HIDE(), self::id(Ids::RABBIT_HIDE)); - $this->map(Items::RABBIT_STEW(), self::id(Ids::RABBIT_STEW)); - $this->map(Items::RAW_BEEF(), self::id(Ids::BEEF)); - $this->map(Items::RAW_CHICKEN(), self::id(Ids::CHICKEN)); - $this->map(Items::RAW_COPPER(), self::id(Ids::RAW_COPPER)); - $this->map(Items::RAW_FISH(), self::id(Ids::COD)); - $this->map(Items::RAW_GOLD(), self::id(Ids::RAW_GOLD)); - $this->map(Items::RAW_IRON(), self::id(Ids::RAW_IRON)); - $this->map(Items::RAW_MUTTON(), self::id(Ids::MUTTON)); - $this->map(Items::RAW_PORKCHOP(), self::id(Ids::PORKCHOP)); - $this->map(Items::RAW_RABBIT(), self::id(Ids::RABBIT)); - $this->map(Items::RAW_SALMON(), self::id(Ids::SALMON)); - $this->map(Items::RECORD_11(), self::id(Ids::MUSIC_DISC_11)); - $this->map(Items::RECORD_13(), self::id(Ids::MUSIC_DISC_13)); - $this->map(Items::RECORD_BLOCKS(), self::id(Ids::MUSIC_DISC_BLOCKS)); - $this->map(Items::RECORD_CAT(), self::id(Ids::MUSIC_DISC_CAT)); - $this->map(Items::RECORD_CHIRP(), self::id(Ids::MUSIC_DISC_CHIRP)); - $this->map(Items::RECORD_FAR(), self::id(Ids::MUSIC_DISC_FAR)); - $this->map(Items::RECORD_MALL(), self::id(Ids::MUSIC_DISC_MALL)); - $this->map(Items::RECORD_MELLOHI(), self::id(Ids::MUSIC_DISC_MELLOHI)); - $this->map(Items::RECORD_STAL(), self::id(Ids::MUSIC_DISC_STAL)); - $this->map(Items::RECORD_STRAD(), self::id(Ids::MUSIC_DISC_STRAD)); - $this->map(Items::RECORD_WAIT(), self::id(Ids::MUSIC_DISC_WAIT)); - $this->map(Items::RECORD_WARD(), self::id(Ids::MUSIC_DISC_WARD)); - $this->map(Items::REDSTONE_DUST(), self::id(Ids::REDSTONE)); - $this->map(Items::ROTTEN_FLESH(), self::id(Ids::ROTTEN_FLESH)); - $this->map(Items::SCUTE(), self::id(Ids::SCUTE)); - $this->map(Items::SHEARS(), self::id(Ids::SHEARS)); - $this->map(Items::SHULKER_SHELL(), self::id(Ids::SHULKER_SHELL)); - $this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL)); - $this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL)); - $this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE)); - $this->map(Items::SPLASH_POTION(), fn(SplashPotion $item) => new Data(Ids::SPLASH_POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT)); - $this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN)); - $this->map(Items::SPYGLASS(), self::id(Ids::SPYGLASS)); - $this->map(Items::SQUID_SPAWN_EGG(), self::id(Ids::SQUID_SPAWN_EGG)); - $this->map(Items::STEAK(), self::id(Ids::COOKED_BEEF)); - $this->map(Items::STICK(), self::id(Ids::STICK)); - $this->map(Items::STONE_AXE(), self::id(Ids::STONE_AXE)); - $this->map(Items::STONE_HOE(), self::id(Ids::STONE_HOE)); - $this->map(Items::STONE_PICKAXE(), self::id(Ids::STONE_PICKAXE)); - $this->map(Items::STONE_SHOVEL(), self::id(Ids::STONE_SHOVEL)); - $this->map(Items::STONE_SWORD(), self::id(Ids::STONE_SWORD)); - $this->map(Items::STRING(), self::id(Ids::STRING)); - $this->map(Items::SUGAR(), self::id(Ids::SUGAR)); - $this->map(Items::SUSPICIOUS_STEW(), fn(SuspiciousStew $item) => new Data(Ids::SUSPICIOUS_STEW, SuspiciousStewTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); - $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); - $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); - $this->map(Items::WARPED_SIGN(), self::id(Ids::WARPED_SIGN)); - $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); - $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); - $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); - $this->map(Items::WOODEN_AXE(), self::id(Ids::WOODEN_AXE)); - $this->map(Items::WOODEN_HOE(), self::id(Ids::WOODEN_HOE)); - $this->map(Items::WOODEN_PICKAXE(), self::id(Ids::WOODEN_PICKAXE)); - $this->map(Items::WOODEN_SHOVEL(), self::id(Ids::WOODEN_SHOVEL)); - $this->map(Items::WOODEN_SWORD(), self::id(Ids::WOODEN_SWORD)); - $this->map(Items::WRITABLE_BOOK(), self::id(Ids::WRITABLE_BOOK)); - $this->map(Items::WRITTEN_BOOK(), self::id(Ids::WRITTEN_BOOK)); - $this->map(Items::ZOMBIE_SPAWN_EGG(), self::id(Ids::ZOMBIE_SPAWN_EGG)); } } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php new file mode 100644 index 0000000000..62ab3d7f3f --- /dev/null +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -0,0 +1,517 @@ +register1to1BlockMappings(); + $this->register1to1ItemMappings(); + $this->register1to1BlockWithMetaMappings(); + $this->register1to1ItemWithMetaMappings(); + $this->register1ToNItemMappings(); + $this->registerMiscBlockMappings(); + $this->registerMiscItemMappings(); + } + + public function map1to1Item(string $id, Item $item) : void{ + $this->deserializer?->map($id, fn() => clone $item); + $this->serializer?->map($item, fn() => new Data($id)); + } + + /** + * @phpstan-template TItem of Item + * @phpstan-param TItem $item + * @phpstan-param \Closure(TItem, int) : void $deserializeMeta + * @phpstan-param \Closure(TItem) : int $serializeMeta + */ + public function map1to1ItemWithMeta(string $id, Item $item, \Closure $deserializeMeta, \Closure $serializeMeta) : void{ + $this->deserializer?->map($id, function(Data $data) use ($item, $deserializeMeta) : Item{ + $result = clone $item; + $deserializeMeta($result, $data->getMeta()); + return $result; + }); + $this->serializer?->map($item, function(Item $item) use ($id, $serializeMeta) : Data{ + /** @phpstan-var TItem $item */ + $meta = $serializeMeta($item); + return new Data($id, $meta); + }); + } + + public function map1to1Block(string $id, Block $block) : void{ + $this->deserializer?->mapBlock($id, fn() => $block); + $this->serializer?->mapBlock($block, fn() => new Data($id)); + } + + /** + * @phpstan-template TBlock of Block + * @phpstan-param TBlock $block + * @phpstan-param \Closure(TBlock, int) : void $deserializeMeta + * @phpstan-param \Closure(TBlock) : int $serializeMeta + */ + public function map1to1BlockWithMeta(string $id, Block $block, \Closure $deserializeMeta, \Closure $serializeMeta) : void{ + $this->deserializer?->mapBlock($id, function(Data $data) use ($block, $deserializeMeta) : Block{ + $result = clone $block; + $deserializeMeta($result, $data->getMeta()); + return $result; + }); + $this->serializer?->mapBlock($block, function(Block $block) use ($id, $serializeMeta) : Data{ + $meta = $serializeMeta($block); + return new Data($id, $meta); + }); + } + + /** + * @param Item[] $items + * @phpstan-param array $items + */ + public function map1ToNItem(string $id, array $items) : void{ + $this->deserializer?->map($id, function(Data $data) use ($items) : Item{ + $result = $items[$data->getMeta()] ?? null; + if($result === null){ + throw new ItemTypeDeserializeException("Unhandled meta value " . $data->getMeta() . " for item ID " . $data->getName()); + } + return clone $result; + }); + foreach($items as $meta => $item){ + $this->serializer?->map($item, fn() => new Data($id, $meta)); + } + } + + /** + * Registers mappings for item IDs which directly correspond to PocketMine-MP blockitems. + * Mappings here are only necessary when the item has a dedicated item ID; in these cases, the blockstate is not + * included in the itemstack, and the item ID may be different from the block ID. + */ + private function register1to1BlockMappings() : void{ + $this->map1to1Block(Ids::ACACIA_DOOR, Blocks::ACACIA_DOOR()); + $this->map1to1Block(Ids::BIRCH_DOOR, Blocks::BIRCH_DOOR()); + $this->map1to1Block(Ids::BREWING_STAND, Blocks::BREWING_STAND()); + $this->map1to1Block(Ids::CAKE, Blocks::CAKE()); + $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON()); + $this->map1to1Block(Ids::COMPARATOR, Blocks::REDSTONE_COMPARATOR()); + $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR()); + $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR()); + $this->map1to1Block(Ids::FLOWER_POT, Blocks::FLOWER_POT()); + $this->map1to1Block(Ids::HOPPER, Blocks::HOPPER()); + $this->map1to1Block(Ids::IRON_DOOR, Blocks::IRON_DOOR()); + $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR()); + $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR()); + $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART()); + $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER()); + $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR()); + $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE()); + $this->map1to1Block(Ids::WARPED_DOOR, Blocks::WARPED_DOOR()); + $this->map1to1Block(Ids::WOODEN_DOOR, Blocks::OAK_DOOR()); + } + + /** + * Registers mappings for item IDs which directly correspond to PocketMine-MP items. + */ + private function register1to1ItemMappings() : void{ + $this->map1to1Item(Ids::ACACIA_BOAT, Items::ACACIA_BOAT()); + $this->map1to1Item(Ids::ACACIA_SIGN, Items::ACACIA_SIGN()); + $this->map1to1Item(Ids::AMETHYST_SHARD, Items::AMETHYST_SHARD()); + $this->map1to1Item(Ids::APPLE, Items::APPLE()); + $this->map1to1Item(Ids::BAKED_POTATO, Items::BAKED_POTATO()); + $this->map1to1Item(Ids::BEEF, Items::RAW_BEEF()); + $this->map1to1Item(Ids::BEETROOT, Items::BEETROOT()); + $this->map1to1Item(Ids::BEETROOT_SEEDS, Items::BEETROOT_SEEDS()); + $this->map1to1Item(Ids::BEETROOT_SOUP, Items::BEETROOT_SOUP()); + $this->map1to1Item(Ids::BIRCH_BOAT, Items::BIRCH_BOAT()); + $this->map1to1Item(Ids::BIRCH_SIGN, Items::BIRCH_SIGN()); + $this->map1to1Item(Ids::BLAZE_POWDER, Items::BLAZE_POWDER()); + $this->map1to1Item(Ids::BLAZE_ROD, Items::BLAZE_ROD()); + $this->map1to1Item(Ids::BLEACH, Items::BLEACH()); + $this->map1to1Item(Ids::BONE, Items::BONE()); + $this->map1to1Item(Ids::BONE_MEAL, Items::BONE_MEAL()); + $this->map1to1Item(Ids::BOOK, Items::BOOK()); + $this->map1to1Item(Ids::BOW, Items::BOW()); + $this->map1to1Item(Ids::BOWL, Items::BOWL()); + $this->map1to1Item(Ids::BREAD, Items::BREAD()); + $this->map1to1Item(Ids::BRICK, Items::BRICK()); + $this->map1to1Item(Ids::BUCKET, Items::BUCKET()); + $this->map1to1Item(Ids::CARROT, Items::CARROT()); + $this->map1to1Item(Ids::CHAINMAIL_BOOTS, Items::CHAINMAIL_BOOTS()); + $this->map1to1Item(Ids::CHAINMAIL_CHESTPLATE, Items::CHAINMAIL_CHESTPLATE()); + $this->map1to1Item(Ids::CHAINMAIL_HELMET, Items::CHAINMAIL_HELMET()); + $this->map1to1Item(Ids::CHAINMAIL_LEGGINGS, Items::CHAINMAIL_LEGGINGS()); + $this->map1to1Item(Ids::CHARCOAL, Items::CHARCOAL()); + $this->map1to1Item(Ids::CHICKEN, Items::RAW_CHICKEN()); + $this->map1to1Item(Ids::CHORUS_FRUIT, Items::CHORUS_FRUIT()); + $this->map1to1Item(Ids::CLAY_BALL, Items::CLAY()); + $this->map1to1Item(Ids::CLOCK, Items::CLOCK()); + $this->map1to1Item(Ids::COAL, Items::COAL()); + $this->map1to1Item(Ids::COCOA_BEANS, Items::COCOA_BEANS()); + $this->map1to1Item(Ids::COD, Items::RAW_FISH()); + $this->map1to1Item(Ids::COMPASS, Items::COMPASS()); + $this->map1to1Item(Ids::COOKED_BEEF, Items::STEAK()); + $this->map1to1Item(Ids::COOKED_CHICKEN, Items::COOKED_CHICKEN()); + $this->map1to1Item(Ids::COOKED_COD, Items::COOKED_FISH()); + $this->map1to1Item(Ids::COOKED_MUTTON, Items::COOKED_MUTTON()); + $this->map1to1Item(Ids::COOKED_PORKCHOP, Items::COOKED_PORKCHOP()); + $this->map1to1Item(Ids::COOKED_RABBIT, Items::COOKED_RABBIT()); + $this->map1to1Item(Ids::COOKED_SALMON, Items::COOKED_SALMON()); + $this->map1to1Item(Ids::COOKIE, Items::COOKIE()); + $this->map1to1Item(Ids::COPPER_INGOT, Items::COPPER_INGOT()); + $this->map1to1Item(Ids::CRIMSON_SIGN, Items::CRIMSON_SIGN()); + $this->map1to1Item(Ids::DARK_OAK_BOAT, Items::DARK_OAK_BOAT()); + $this->map1to1Item(Ids::DARK_OAK_SIGN, Items::DARK_OAK_SIGN()); + $this->map1to1Item(Ids::DIAMOND, Items::DIAMOND()); + $this->map1to1Item(Ids::DIAMOND_AXE, Items::DIAMOND_AXE()); + $this->map1to1Item(Ids::DIAMOND_BOOTS, Items::DIAMOND_BOOTS()); + $this->map1to1Item(Ids::DIAMOND_CHESTPLATE, Items::DIAMOND_CHESTPLATE()); + $this->map1to1Item(Ids::DIAMOND_HELMET, Items::DIAMOND_HELMET()); + $this->map1to1Item(Ids::DIAMOND_HOE, Items::DIAMOND_HOE()); + $this->map1to1Item(Ids::DIAMOND_LEGGINGS, Items::DIAMOND_LEGGINGS()); + $this->map1to1Item(Ids::DIAMOND_PICKAXE, Items::DIAMOND_PICKAXE()); + $this->map1to1Item(Ids::DIAMOND_SHOVEL, Items::DIAMOND_SHOVEL()); + $this->map1to1Item(Ids::DIAMOND_SWORD, Items::DIAMOND_SWORD()); + $this->map1to1Item(Ids::DISC_FRAGMENT_5, Items::DISC_FRAGMENT_5()); + $this->map1to1Item(Ids::DRAGON_BREATH, Items::DRAGON_BREATH()); + $this->map1to1Item(Ids::DRIED_KELP, Items::DRIED_KELP()); + $this->map1to1Item(Ids::ECHO_SHARD, Items::ECHO_SHARD()); + $this->map1to1Item(Ids::EGG, Items::EGG()); + $this->map1to1Item(Ids::EMERALD, Items::EMERALD()); + $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE()); + $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL()); + $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE()); + $this->map1to1Item(Ids::FEATHER, Items::FEATHER()); + $this->map1to1Item(Ids::FERMENTED_SPIDER_EYE, Items::FERMENTED_SPIDER_EYE()); + $this->map1to1Item(Ids::FIRE_CHARGE, Items::FIRE_CHARGE()); + $this->map1to1Item(Ids::FISHING_ROD, Items::FISHING_ROD()); + $this->map1to1Item(Ids::FLINT, Items::FLINT()); + $this->map1to1Item(Ids::FLINT_AND_STEEL, Items::FLINT_AND_STEEL()); + $this->map1to1Item(Ids::GHAST_TEAR, Items::GHAST_TEAR()); + $this->map1to1Item(Ids::GLASS_BOTTLE, Items::GLASS_BOTTLE()); + $this->map1to1Item(Ids::GLISTERING_MELON_SLICE, Items::GLISTERING_MELON()); + $this->map1to1Item(Ids::GLOW_INK_SAC, Items::GLOW_INK_SAC()); + $this->map1to1Item(Ids::GLOWSTONE_DUST, Items::GLOWSTONE_DUST()); + $this->map1to1Item(Ids::GOLD_INGOT, Items::GOLD_INGOT()); + $this->map1to1Item(Ids::GOLD_NUGGET, Items::GOLD_NUGGET()); + $this->map1to1Item(Ids::GOLDEN_APPLE, Items::GOLDEN_APPLE()); + $this->map1to1Item(Ids::GOLDEN_AXE, Items::GOLDEN_AXE()); + $this->map1to1Item(Ids::GOLDEN_BOOTS, Items::GOLDEN_BOOTS()); + $this->map1to1Item(Ids::GOLDEN_CARROT, Items::GOLDEN_CARROT()); + $this->map1to1Item(Ids::GOLDEN_CHESTPLATE, Items::GOLDEN_CHESTPLATE()); + $this->map1to1Item(Ids::GOLDEN_HELMET, Items::GOLDEN_HELMET()); + $this->map1to1Item(Ids::GOLDEN_HOE, Items::GOLDEN_HOE()); + $this->map1to1Item(Ids::GOLDEN_LEGGINGS, Items::GOLDEN_LEGGINGS()); + $this->map1to1Item(Ids::GOLDEN_PICKAXE, Items::GOLDEN_PICKAXE()); + $this->map1to1Item(Ids::GOLDEN_SHOVEL, Items::GOLDEN_SHOVEL()); + $this->map1to1Item(Ids::GOLDEN_SWORD, Items::GOLDEN_SWORD()); + $this->map1to1Item(Ids::GUNPOWDER, Items::GUNPOWDER()); + $this->map1to1Item(Ids::HEART_OF_THE_SEA, Items::HEART_OF_THE_SEA()); + $this->map1to1Item(Ids::HONEY_BOTTLE, Items::HONEY_BOTTLE()); + $this->map1to1Item(Ids::HONEYCOMB, Items::HONEYCOMB()); + $this->map1to1Item(Ids::INK_SAC, Items::INK_SAC()); + $this->map1to1Item(Ids::IRON_AXE, Items::IRON_AXE()); + $this->map1to1Item(Ids::IRON_BOOTS, Items::IRON_BOOTS()); + $this->map1to1Item(Ids::IRON_CHESTPLATE, Items::IRON_CHESTPLATE()); + $this->map1to1Item(Ids::IRON_HELMET, Items::IRON_HELMET()); + $this->map1to1Item(Ids::IRON_HOE, Items::IRON_HOE()); + $this->map1to1Item(Ids::IRON_INGOT, Items::IRON_INGOT()); + $this->map1to1Item(Ids::IRON_LEGGINGS, Items::IRON_LEGGINGS()); + $this->map1to1Item(Ids::IRON_NUGGET, Items::IRON_NUGGET()); + $this->map1to1Item(Ids::IRON_PICKAXE, Items::IRON_PICKAXE()); + $this->map1to1Item(Ids::IRON_SHOVEL, Items::IRON_SHOVEL()); + $this->map1to1Item(Ids::IRON_SWORD, Items::IRON_SWORD()); + $this->map1to1Item(Ids::JUNGLE_BOAT, Items::JUNGLE_BOAT()); + $this->map1to1Item(Ids::JUNGLE_SIGN, Items::JUNGLE_SIGN()); + $this->map1to1Item(Ids::LAPIS_LAZULI, Items::LAPIS_LAZULI()); + $this->map1to1Item(Ids::LAVA_BUCKET, Items::LAVA_BUCKET()); + $this->map1to1Item(Ids::LEATHER, Items::LEATHER()); + $this->map1to1Item(Ids::LEATHER_BOOTS, Items::LEATHER_BOOTS()); + $this->map1to1Item(Ids::LEATHER_CHESTPLATE, Items::LEATHER_TUNIC()); + $this->map1to1Item(Ids::LEATHER_HELMET, Items::LEATHER_CAP()); + $this->map1to1Item(Ids::LEATHER_LEGGINGS, Items::LEATHER_PANTS()); + $this->map1to1Item(Ids::MAGMA_CREAM, Items::MAGMA_CREAM()); + $this->map1to1Item(Ids::MANGROVE_SIGN, Items::MANGROVE_SIGN()); + $this->map1to1Item(Ids::MELON_SEEDS, Items::MELON_SEEDS()); + $this->map1to1Item(Ids::MELON_SLICE, Items::MELON()); + $this->map1to1Item(Ids::MILK_BUCKET, Items::MILK_BUCKET()); + $this->map1to1Item(Ids::MINECART, Items::MINECART()); + $this->map1to1Item(Ids::MUSHROOM_STEW, Items::MUSHROOM_STEW()); + $this->map1to1Item(Ids::MUSIC_DISC_11, Items::RECORD_11()); + $this->map1to1Item(Ids::MUSIC_DISC_13, Items::RECORD_13()); + $this->map1to1Item(Ids::MUSIC_DISC_BLOCKS, Items::RECORD_BLOCKS()); + $this->map1to1Item(Ids::MUSIC_DISC_CAT, Items::RECORD_CAT()); + $this->map1to1Item(Ids::MUSIC_DISC_CHIRP, Items::RECORD_CHIRP()); + $this->map1to1Item(Ids::MUSIC_DISC_FAR, Items::RECORD_FAR()); + $this->map1to1Item(Ids::MUSIC_DISC_MALL, Items::RECORD_MALL()); + $this->map1to1Item(Ids::MUSIC_DISC_MELLOHI, Items::RECORD_MELLOHI()); + $this->map1to1Item(Ids::MUSIC_DISC_STAL, Items::RECORD_STAL()); + $this->map1to1Item(Ids::MUSIC_DISC_STRAD, Items::RECORD_STRAD()); + $this->map1to1Item(Ids::MUSIC_DISC_WAIT, Items::RECORD_WAIT()); + $this->map1to1Item(Ids::MUSIC_DISC_WARD, Items::RECORD_WARD()); + $this->map1to1Item(Ids::MUTTON, Items::RAW_MUTTON()); + $this->map1to1Item(Ids::NAUTILUS_SHELL, Items::NAUTILUS_SHELL()); + $this->map1to1Item(Ids::NETHER_STAR, Items::NETHER_STAR()); + $this->map1to1Item(Ids::NETHERBRICK, Items::NETHER_BRICK()); + $this->map1to1Item(Ids::NETHERITE_AXE, Items::NETHERITE_AXE()); + $this->map1to1Item(Ids::NETHERITE_BOOTS, Items::NETHERITE_BOOTS()); + $this->map1to1Item(Ids::NETHERITE_CHESTPLATE, Items::NETHERITE_CHESTPLATE()); + $this->map1to1Item(Ids::NETHERITE_HELMET, Items::NETHERITE_HELMET()); + $this->map1to1Item(Ids::NETHERITE_HOE, Items::NETHERITE_HOE()); + $this->map1to1Item(Ids::NETHERITE_INGOT, Items::NETHERITE_INGOT()); + $this->map1to1Item(Ids::NETHERITE_LEGGINGS, Items::NETHERITE_LEGGINGS()); + $this->map1to1Item(Ids::NETHERITE_PICKAXE, Items::NETHERITE_PICKAXE()); + $this->map1to1Item(Ids::NETHERITE_SCRAP, Items::NETHERITE_SCRAP()); + $this->map1to1Item(Ids::NETHERITE_SHOVEL, Items::NETHERITE_SHOVEL()); + $this->map1to1Item(Ids::NETHERITE_SWORD, Items::NETHERITE_SWORD()); + $this->map1to1Item(Ids::OAK_BOAT, Items::OAK_BOAT()); + $this->map1to1Item(Ids::OAK_SIGN, Items::OAK_SIGN()); + $this->map1to1Item(Ids::PAINTING, Items::PAINTING()); + $this->map1to1Item(Ids::PAPER, Items::PAPER()); + $this->map1to1Item(Ids::PHANTOM_MEMBRANE, Items::PHANTOM_MEMBRANE()); + $this->map1to1Item(Ids::POISONOUS_POTATO, Items::POISONOUS_POTATO()); + $this->map1to1Item(Ids::POPPED_CHORUS_FRUIT, Items::POPPED_CHORUS_FRUIT()); + $this->map1to1Item(Ids::PORKCHOP, Items::RAW_PORKCHOP()); + $this->map1to1Item(Ids::POTATO, Items::POTATO()); + $this->map1to1Item(Ids::PRISMARINE_CRYSTALS, Items::PRISMARINE_CRYSTALS()); + $this->map1to1Item(Ids::PRISMARINE_SHARD, Items::PRISMARINE_SHARD()); + $this->map1to1Item(Ids::PUFFERFISH, Items::PUFFERFISH()); + $this->map1to1Item(Ids::PUMPKIN_PIE, Items::PUMPKIN_PIE()); + $this->map1to1Item(Ids::PUMPKIN_SEEDS, Items::PUMPKIN_SEEDS()); + $this->map1to1Item(Ids::QUARTZ, Items::NETHER_QUARTZ()); + $this->map1to1Item(Ids::RABBIT, Items::RAW_RABBIT()); + $this->map1to1Item(Ids::RABBIT_FOOT, Items::RABBIT_FOOT()); + $this->map1to1Item(Ids::RABBIT_HIDE, Items::RABBIT_HIDE()); + $this->map1to1Item(Ids::RABBIT_STEW, Items::RABBIT_STEW()); + $this->map1to1Item(Ids::RAW_COPPER, Items::RAW_COPPER()); + $this->map1to1Item(Ids::RAW_GOLD, Items::RAW_GOLD()); + $this->map1to1Item(Ids::RAW_IRON, Items::RAW_IRON()); + $this->map1to1Item(Ids::REDSTONE, Items::REDSTONE_DUST()); + $this->map1to1Item(Ids::ROTTEN_FLESH, Items::ROTTEN_FLESH()); + $this->map1to1Item(Ids::SALMON, Items::RAW_SALMON()); + $this->map1to1Item(Ids::SCUTE, Items::SCUTE()); + $this->map1to1Item(Ids::SHEARS, Items::SHEARS()); + $this->map1to1Item(Ids::SHULKER_SHELL, Items::SHULKER_SHELL()); + $this->map1to1Item(Ids::SLIME_BALL, Items::SLIMEBALL()); + $this->map1to1Item(Ids::SNOWBALL, Items::SNOWBALL()); + $this->map1to1Item(Ids::SPIDER_EYE, Items::SPIDER_EYE()); + $this->map1to1Item(Ids::SPRUCE_BOAT, Items::SPRUCE_BOAT()); + $this->map1to1Item(Ids::SPRUCE_SIGN, Items::SPRUCE_SIGN()); + $this->map1to1Item(Ids::SPYGLASS, Items::SPYGLASS()); + $this->map1to1Item(Ids::SQUID_SPAWN_EGG, Items::SQUID_SPAWN_EGG()); + $this->map1to1Item(Ids::STICK, Items::STICK()); + $this->map1to1Item(Ids::STONE_AXE, Items::STONE_AXE()); + $this->map1to1Item(Ids::STONE_HOE, Items::STONE_HOE()); + $this->map1to1Item(Ids::STONE_PICKAXE, Items::STONE_PICKAXE()); + $this->map1to1Item(Ids::STONE_SHOVEL, Items::STONE_SHOVEL()); + $this->map1to1Item(Ids::STONE_SWORD, Items::STONE_SWORD()); + $this->map1to1Item(Ids::STRING, Items::STRING()); + $this->map1to1Item(Ids::SUGAR, Items::SUGAR()); + $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES()); + $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM()); + $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH()); + $this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG()); + $this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN()); + $this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET()); + $this->map1to1Item(Ids::WHEAT, Items::WHEAT()); + $this->map1to1Item(Ids::WHEAT_SEEDS, Items::WHEAT_SEEDS()); + $this->map1to1Item(Ids::WOODEN_AXE, Items::WOODEN_AXE()); + $this->map1to1Item(Ids::WOODEN_HOE, Items::WOODEN_HOE()); + $this->map1to1Item(Ids::WOODEN_PICKAXE, Items::WOODEN_PICKAXE()); + $this->map1to1Item(Ids::WOODEN_SHOVEL, Items::WOODEN_SHOVEL()); + $this->map1to1Item(Ids::WOODEN_SWORD, Items::WOODEN_SWORD()); + $this->map1to1Item(Ids::WRITABLE_BOOK, Items::WRITABLE_BOOK()); + $this->map1to1Item(Ids::WRITTEN_BOOK, Items::WRITTEN_BOOK()); + $this->map1to1Item(Ids::ZOMBIE_SPAWN_EGG, Items::ZOMBIE_SPAWN_EGG()); + } + + /** + * Registers mappings for item IDs which map to different PocketMine-MP item types, depending on their meta + * values. + * This can only be used if the target item type doesn't require any additional properties, since the items are + * indexed by their base type ID. + */ + private function register1ToNItemMappings() : void{ + $this->map1ToNItem(Ids::ARROW, [ + 0 => Items::ARROW(), + //TODO: tipped arrows + ]); + $this->map1ToNItem(Ids::COMPOUND, [ + CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), + CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(), + CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(), + CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(), + CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(), + CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(), + CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(), + CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(), + CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(), + CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(), + CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(), + CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(), + CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(), + CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(), + CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(), + CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(), + CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(), + CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(), + CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(), + CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(), + CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(), + CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(), + CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(), + CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(), + CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(), + CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(), + CompoundTypeIds::WATER => Items::CHEMICAL_WATER(), + CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(), + CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(), + CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(), + CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(), + CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(), + CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(), + CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(), + CompoundTypeIds::INK => Items::CHEMICAL_INK(), + CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), + CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), + CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), + ]); + } + + /** + * Registers mappings for item IDs which map to single blockitems, and have meta values that alter their properties. + * TODO: try and make this less ugly; for the most part the logic is symmetrical, it's just difficult to write it + * in a unified manner. + */ + private function register1to1BlockWithMetaMappings() : void{ + $this->map1to1BlockWithMeta( + Ids::BED, + Blocks::BED(), + function(Bed $block, int $meta) : void{ + $block->setColor(DyeColorIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown bed color ID $meta")); + }, + fn(Bed $block) => DyeColorIdMap::getInstance()->toId($block->getColor()) + ); + $this->map1to1BlockWithMeta( + Ids::SKULL, + Blocks::MOB_HEAD(), + function(Skull $block, int $meta) : void{ + try{ + $skullType = SkullType::fromMagicNumber($meta); + }catch(\InvalidArgumentException $e){ + throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); + } + $block->setSkullType($skullType); + }, + fn(Skull $block) => $block->getSkullType()->getMagicNumber() + ); + } + + /** + * Registers mappings for item IDs which map to single items, and have meta values that alter their properties. + * TODO: try and make this less ugly; for the most part the logic is symmetrical, it's just difficult to write it + * in a unified manner. + */ + private function register1to1ItemWithMetaMappings() : void{ + $this->map1to1ItemWithMeta( + Ids::BANNER, + Items::BANNER(), + function(Banner $item, int $meta) : void{ + $item->setColor(DyeColorIdMap::getInstance()->fromInvertedId($meta) ?? throw new ItemTypeDeserializeException("Unknown banner meta $meta")); + }, + fn(Banner $item) => DyeColorIdMap::getInstance()->toInvertedId($item->getColor()) + ); + $this->map1to1ItemWithMeta( + Ids::POTION, + Items::POTION(), + function(Potion $item, int $meta) : void{ + $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown potion type ID $meta")); + }, + fn(Potion $item) => PotionTypeIdMap::getInstance()->toId($item->getType()) + ); + $this->map1to1ItemWithMeta( + Ids::SPLASH_POTION, + Items::SPLASH_POTION(), + function(SplashPotion $item, int $meta) : void{ + $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown potion type ID $meta")); + }, + fn(SplashPotion $item) => PotionTypeIdMap::getInstance()->toId($item->getType()) + ); + $this->map1to1ItemWithMeta( + Ids::SUSPICIOUS_STEW, + Items::SUSPICIOUS_STEW(), + function(SuspiciousStew $item, int $meta) : void{ + $item->setType(SuspiciousStewTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown suspicious stew type ID $meta")); + }, + fn(SuspiciousStew $item) => SuspiciousStewTypeIdMap::getInstance()->toId($item->getType()) + ); + } + + /** + * Registers serializers and deserializers for blocks that don't fit any other pattern. + * Ideally we want to get rid of this completely, if possible. + * + * Most of these are single PocketMine-MP items which map to multiple IDs depending on their properties, which is + * complex to implement in a generic way. + */ + private function registerMiscBlockMappings() : void{ + $this->deserializer?->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $this->deserializer?->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); + $this->serializer?->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); + } + + /** + * Registers serializers and deserializers for items that don't fit any other pattern. + * Ideally we want to get rid of this completely, if possible. + * + * Most of these are single PocketMine-MP items which map to multiple IDs depending on their properties, which is + * complex to implement in a generic way. + */ + private function registerMiscItemMappings() : void{ + foreach(DyeColor::getAll() as $color){ + $id = DyeColorIdMap::getInstance()->toItemId($color); + $this->deserializer?->map($id, fn() => Items::DYE()->setColor($color)); + } + $this->serializer?->map(Items::DYE(), fn(Dye $item) => new Data(DyeColorIdMap::getInstance()->toItemId($item->getColor()))); + } +} From 5c5d96d00b69015017110d6876656861b55e49de Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 Aug 2022 18:04:11 +0100 Subject: [PATCH 0404/1858] ItemBlock: remember fuel time, fireproof and max stack size this avoids repeatedly creating blocks for no reason when calling these methods. This does assume that these methods always return the same result for a given block type, but I think that's a fair enough assumption. --- src/item/ItemBlock.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index b923b9d7e9..20504e8d0c 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -38,10 +38,18 @@ final class ItemBlock extends Item{ private int $blockTypeId; private int $blockTypeData; + private int $fuelTime; + private bool $fireProof; + private int $maxStackSize; + public function __construct(Block $block){ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); $this->blockTypeId = $block->getTypeId(); $this->blockTypeData = $block->computeTypeData(); + + $this->fuelTime = $block->getFuelTime(); + $this->fireProof = $block->isFireProofAsItem(); + $this->maxStackSize = $block->getMaxStackSize(); } protected function encodeType(RuntimeDataWriter $w) : void{ @@ -60,14 +68,14 @@ final class ItemBlock extends Item{ } public function getFuelTime() : int{ - return $this->getBlock()->getFuelTime(); + return $this->fuelTime; } public function isFireProof() : bool{ - return $this->getBlock()->isFireProofAsItem(); + return $this->fireProof; } public function getMaxStackSize() : int{ - return $this->getBlock()->getMaxStackSize(); + return $this->maxStackSize; } } From d5762d3f4487772ffb6b7c77af4cd659585f6520 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 Aug 2022 19:18:30 +0100 Subject: [PATCH 0405/1858] Item: allow describing type data to a reader as well as a writer we don't currently need this, but it's better to have it in case we need it after PM5 release. This is also now consistent with blocks. --- src/item/Banner.php | 3 ++- src/item/CoralFan.php | 3 ++- src/item/Dye.php | 3 ++- src/item/Item.php | 5 +++-- src/item/ItemBlock.php | 3 ++- src/item/Potion.php | 3 ++- src/item/SplashPotion.php | 3 ++- src/item/SuspiciousStew.php | 3 ++- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/item/Banner.php b/src/item/Banner.php index 80def9ad52..6cb91eb6ac 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -29,6 +29,7 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; @@ -63,7 +64,7 @@ class Banner extends ItemBlockWallOrFloor{ return $this; } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index acb8d35779..c3f23d2ca3 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -41,7 +42,7 @@ final class CoralFan extends Item{ parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ //this is aliased to ensure a compile error in case the functions in Item or Block start to differ in future //right now we can directly reuse encodeType from CoralTypeTrait, but that might silently stop working if Item //were to be altered. CoralTypeTrait was originally intended for blocks, so it's better not to assume anything. diff --git a/src/item/Dye.php b/src/item/Dye.php index 6f550ae18f..4a32983d8f 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\DyeColor; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; class Dye extends Item{ @@ -34,7 +35,7 @@ class Dye extends Item{ parent::__construct($identifier, $name); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/Item.php b/src/item/Item.php index 7170f4fabb..32bf0ff441 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -32,6 +32,7 @@ use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; @@ -435,11 +436,11 @@ class Item implements \JsonSerializable{ final public function computeTypeData() : int{ $writer = new RuntimeDataWriter(16); //TODO: max bits should be a constant instead of being hardcoded all over the place - $this->encodeType($writer); + $this->describeType($writer); return $writer->getValue(); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ //NOOP } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 20504e8d0c..0c50d0adb5 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -26,6 +26,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\VanillaBlocks; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; /** @@ -52,7 +53,7 @@ final class ItemBlock extends Item{ $this->maxStackSize = $block->getMaxStackSize(); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); } diff --git a/src/item/Potion.php b/src/item/Potion.php index 5848dee47e..1933c99095 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Living; use pocketmine\player\Player; @@ -36,7 +37,7 @@ class Potion extends Item implements ConsumableItem{ parent::__construct($identifier, $name); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index ca4023e6a5..462b670b32 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; @@ -38,7 +39,7 @@ class SplashPotion extends ProjectileItem{ parent::__construct($identifier, $name); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php index e6b9895e01..8f5eb3e2d1 100644 --- a/src/item/SuspiciousStew.php +++ b/src/item/SuspiciousStew.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; class SuspiciousStew extends Food{ @@ -34,7 +35,7 @@ class SuspiciousStew extends Food{ parent::__construct($identifier, $name); } - protected function encodeType(RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ $w->suspiciousStewType($this->suspiciousStewType); } From 2a982d48ad2056ac5aef3b7b930e2b6d751987b7 Mon Sep 17 00:00:00 2001 From: Alexey <45711510+Gaprix@users.noreply.github.com> Date: Sat, 17 Sep 2022 19:48:23 +0300 Subject: [PATCH 0406/1858] Do not always make the coral dead immediately after placement (#5149) --- src/block/BaseCoral.php | 35 ++++++++++++++++++++++------------- src/block/FloorCoralFan.php | 3 +++ src/block/WallCoralFan.php | 3 +++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index f1a5a9e799..37aab85f9b 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -27,6 +27,7 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; +use function mt_rand; abstract class BaseCoral extends Transparent{ use CoralTypeTrait; @@ -38,20 +39,13 @@ abstract class BaseCoral extends Transparent{ public function onNearbyBlockChange() : void{ if(!$this->dead){ - $world = $this->position->getWorld(); + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(40, 200)); + } + } - $hasWater = false; - foreach($this->position->sides() as $vector3){ - if($world->getBlock($vector3) instanceof Water){ - $hasWater = true; - break; - } - } - - //TODO: check water inside the block itself (not supported on the API yet) - if(!$hasWater){ - $world->setBlock($this->position, $this->setDead(true)); - } + public function onScheduledUpdate() : void{ + if(!$this->dead && !$this->isCoveredWithWater()){ + $this->position->getWorld()->setBlock($this->position, $this->setDead(true)); } } @@ -65,6 +59,21 @@ abstract class BaseCoral extends Transparent{ public function isSolid() : bool{ return false; } + protected function isCoveredWithWater() : bool{ + $world = $this->position->getWorld(); + + $hasWater = false; + foreach($this->position->sides() as $vector3){ + if($world->getBlock($vector3) instanceof Water){ + $hasWater = true; + break; + } + } + + //TODO: check water inside the block itself (not supported on the API yet) + return $hasWater; + } + protected function recalculateCollisionBoxes() : array{ return []; } public function getSupportType(int $facing) : SupportType{ diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 250fe0e4c4..a9d53c119c 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -70,6 +70,9 @@ final class FloorCoralFan extends BaseCoral{ $this->axis = Axis::Z; } } + + $this->dead = !$this->isCoveredWithWater(); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index b678d80ede..5349f78f28 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -49,6 +49,9 @@ final class WallCoralFan extends BaseCoral{ return false; } $this->facing = $face; + + $this->dead = !$this->isCoveredWithWater(); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } From c24370b8ac699806b8c8b8558747b35e955592a2 Mon Sep 17 00:00:00 2001 From: DavyCraft648 <67502532+DavyCraft648@users.noreply.github.com> Date: Fri, 23 Sep 2022 20:59:44 +0700 Subject: [PATCH 0407/1858] CraftingDataCache: Fix Cartography's recipe block name (#5302) --- src/network/mcpe/cache/CraftingDataCache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 4856ba354c..436c3ccf02 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -87,7 +87,7 @@ final class CraftingDataCache{ $typeTag = match($recipe->getType()->id()){ ShapelessRecipeType::CRAFTING()->id() => CraftingRecipeBlockName::CRAFTING_TABLE, ShapelessRecipeType::STONECUTTER()->id() => CraftingRecipeBlockName::STONECUTTER, - ShapelessRecipeType::CARTOGRAPHY()->id() => CraftingRecipeBlockName::SMITHING_TABLE, + ShapelessRecipeType::CARTOGRAPHY()->id() => CraftingRecipeBlockName::CARTOGRAPHY_TABLE, ShapelessRecipeType::SMITHING()->id() => CraftingRecipeBlockName::SMITHING_TABLE, default => throw new AssumptionFailedError("Unreachable"), }; From 590eb74703c072ab136b54c8ee1f9cd20a05e598 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 13:30:53 +0100 Subject: [PATCH 0408/1858] Make Block(De)Serializer much less nasty to interact with this makes it a lot less inconvenient to access the primary blockstate serializer/deserializer, which is necessary for registering new blocks. --- .../block/CachingBlockStateDeserializer.php | 51 ------------------- .../block/CachingBlockStateSerializer.php | 43 ---------------- .../DelegatingBlockStateDeserializer.php | 29 ----------- .../block/DelegatingBlockStateSerializer.php | 29 ----------- .../BlockObjectToBlockStateSerializer.php | 9 +++- .../BlockStateToBlockObjectDeserializer.php | 13 +++++ .../format/io/GlobalBlockStateHandlers.php | 16 +++--- 7 files changed, 27 insertions(+), 163 deletions(-) delete mode 100644 src/data/bedrock/block/CachingBlockStateDeserializer.php delete mode 100644 src/data/bedrock/block/CachingBlockStateSerializer.php delete mode 100644 src/data/bedrock/block/DelegatingBlockStateDeserializer.php delete mode 100644 src/data/bedrock/block/DelegatingBlockStateSerializer.php diff --git a/src/data/bedrock/block/CachingBlockStateDeserializer.php b/src/data/bedrock/block/CachingBlockStateDeserializer.php deleted file mode 100644 index 2078b7cc55..0000000000 --- a/src/data/bedrock/block/CachingBlockStateDeserializer.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ - private array $simpleCache = []; - - public function __construct( - private BlockStateDeserializer $realDeserializer - ){} - - public function deserialize(BlockStateData $stateData) : int{ - if(count($stateData->getStates()) === 0){ - //if a block has zero properties, we can keep a map of string ID -> internal blockstate ID - return $this->simpleCache[$stateData->getName()] ??= $this->realDeserializer->deserialize($stateData); - } - - //we can't cache blocks that have properties - go ahead and deserialize the slow way - return $this->realDeserializer->deserialize($stateData); - } - - public function getRealDeserializer() : BlockStateDeserializer{ return $this->realDeserializer; } -} diff --git a/src/data/bedrock/block/CachingBlockStateSerializer.php b/src/data/bedrock/block/CachingBlockStateSerializer.php deleted file mode 100644 index f6129622de..0000000000 --- a/src/data/bedrock/block/CachingBlockStateSerializer.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ - private array $cache = []; - - public function __construct( - private BlockStateSerializer $realSerializer - ){} - - public function serialize(int $stateId) : BlockStateData{ - return $this->cache[$stateId] ??= $this->realSerializer->serialize($stateId); - } - - public function getRealSerializer() : BlockStateSerializer{ return $this->realSerializer; } -} diff --git a/src/data/bedrock/block/DelegatingBlockStateDeserializer.php b/src/data/bedrock/block/DelegatingBlockStateDeserializer.php deleted file mode 100644 index 1844d44fc0..0000000000 --- a/src/data/bedrock/block/DelegatingBlockStateDeserializer.php +++ /dev/null @@ -1,29 +0,0 @@ - + */ + private array $cache = []; + public function __construct(){ $this->registerCandleSerializers(); $this->registerCauldronSerializers(); @@ -188,7 +194,8 @@ final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ public function serialize(int $stateId) : BlockStateData{ //TODO: singleton usage not ideal - return $this->serializeBlock(BlockFactory::getInstance()->fromStateId($stateId)); + //TODO: we may want to deduplicate cache entries to avoid wasting memory + return $this->cache[$stateId] ??= $this->serializeBlock(BlockFactory::getInstance()->fromStateId($stateId)); } /** diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index adb9fe368a..14871be251 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -51,6 +51,7 @@ use pocketmine\data\bedrock\block\convert\BlockStateReader as Reader; use pocketmine\math\Axis; use pocketmine\math\Facing; use function array_key_exists; +use function count; use function min; final class BlockStateToBlockObjectDeserializer implements BlockStateDeserializer{ @@ -61,6 +62,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize */ private array $deserializeFuncs = []; + /** + * @var int[] + * @phpstan-var array + */ + private array $simpleCache = []; + public function __construct(){ $this->registerCandleDeserializers(); $this->registerCauldronDeserializers(); @@ -69,6 +76,12 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize } public function deserialize(BlockStateData $stateData) : int{ + if(count($stateData->getStates()) === 0){ + //if a block has zero properties, we can keep a map of string ID -> internal blockstate ID + return $this->simpleCache[$stateData->getName()] ??= $this->deserializeBlock($stateData)->getStateId(); + } + + //we can't cache blocks that have properties - go ahead and deserialize the slow way return $this->deserializeBlock($stateData)->getStateId(); } diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 195b9337a1..49924f5ed8 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -24,11 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\BlockStateDeserializer; -use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\block\BlockTypeNames; -use pocketmine\data\bedrock\block\CachingBlockStateDeserializer; -use pocketmine\data\bedrock\block\CachingBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; use pocketmine\data\bedrock\block\convert\BlockStateToBlockObjectDeserializer; use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; @@ -49,20 +45,20 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; */ final class GlobalBlockStateHandlers{ - private static ?BlockStateSerializer $blockStateSerializer = null; + private static ?BlockObjectToBlockStateSerializer $blockStateSerializer = null; - private static ?BlockStateDeserializer $blockStateDeserializer = null; + private static ?BlockStateToBlockObjectDeserializer $blockStateDeserializer = null; private static ?BlockDataUpgrader $blockDataUpgrader = null; private static ?BlockStateData $unknownBlockStateData = null; - public static function getDeserializer() : BlockStateDeserializer{ - return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer(new BlockStateToBlockObjectDeserializer()); + public static function getDeserializer() : BlockStateToBlockObjectDeserializer{ + return self::$blockStateDeserializer ??= new BlockStateToBlockObjectDeserializer(); } - public static function getSerializer() : BlockStateSerializer{ - return self::$blockStateSerializer ??= new CachingBlockStateSerializer(new BlockObjectToBlockStateSerializer()); + public static function getSerializer() : BlockObjectToBlockStateSerializer{ + return self::$blockStateSerializer ??= new BlockObjectToBlockStateSerializer(); } public static function getUpgrader() : BlockDataUpgrader{ From cf9610c710f1038753139cce304669db72881809 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 13:41:41 +0100 Subject: [PATCH 0409/1858] BlockStateToBlockObjectDeserializer: added mapSimple() for symmetry's sake this will also make it marginally easier to switch to a unified system. --- .../BlockStateToBlockObjectDeserializer.php | 505 +++++++++--------- 1 file changed, 255 insertions(+), 250 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 14871be251..e63ee2def1 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -93,6 +93,11 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize $this->deserializeFuncs[$id] = $c; } + /** @phpstan-param \Closure() : Block $getBlock */ + public function mapSimple(string $id, \Closure $getBlock) : void{ + $this->map($id, $getBlock); + } + /** * @phpstan-param \Closure() : Slab $getBlock */ @@ -173,256 +178,256 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize } private function registerSimpleDeserializers() : void{ - $this->map(Ids::AIR, fn() => Blocks::AIR()); - $this->map(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); - $this->map(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS()); - $this->map(Ids::BARRIER, fn() => Blocks::BARRIER()); - $this->map(Ids::BEACON, fn() => Blocks::BEACON()); - $this->map(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE()); - $this->map(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); - $this->map(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); - $this->map(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); - $this->map(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); - $this->map(Ids::CALCITE, fn() => Blocks::CALCITE()); - $this->map(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE()); - $this->map(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT()); - $this->map(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); - $this->map(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); - $this->map(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); - $this->map(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT()); - $this->map(Ids::CLAY, fn() => Blocks::CLAY()); - $this->map(Ids::COAL_BLOCK, fn() => Blocks::COAL()); - $this->map(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); - $this->map(Ids::COBBLED_DEEPSLATE, fn() => Blocks::COBBLED_DEEPSLATE()); - $this->map(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE()); - $this->map(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE()); - $this->map(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); - $this->map(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); - $this->map(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); - $this->map(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); - $this->map(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); - $this->map(Ids::CRIMSON_FENCE, fn() => Blocks::CRIMSON_FENCE()); - $this->map(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS()); - $this->map(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); - $this->map(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); - $this->map(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); - $this->map(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE()); - $this->map(Ids::DEEPSLATE_COPPER_ORE, fn() => Blocks::DEEPSLATE_COPPER_ORE()); - $this->map(Ids::DEEPSLATE_DIAMOND_ORE, fn() => Blocks::DEEPSLATE_DIAMOND_ORE()); - $this->map(Ids::DEEPSLATE_EMERALD_ORE, fn() => Blocks::DEEPSLATE_EMERALD_ORE()); - $this->map(Ids::DEEPSLATE_GOLD_ORE, fn() => Blocks::DEEPSLATE_GOLD_ORE()); - $this->map(Ids::DEEPSLATE_IRON_ORE, fn() => Blocks::DEEPSLATE_IRON_ORE()); - $this->map(Ids::DEEPSLATE_LAPIS_ORE, fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE()); - $this->map(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); - $this->map(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); - $this->map(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); - $this->map(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); - $this->map(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP()); - $this->map(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO()); - $this->map(Ids::ELEMENT_1, fn() => Blocks::ELEMENT_HYDROGEN()); - $this->map(Ids::ELEMENT_10, fn() => Blocks::ELEMENT_NEON()); - $this->map(Ids::ELEMENT_100, fn() => Blocks::ELEMENT_FERMIUM()); - $this->map(Ids::ELEMENT_101, fn() => Blocks::ELEMENT_MENDELEVIUM()); - $this->map(Ids::ELEMENT_102, fn() => Blocks::ELEMENT_NOBELIUM()); - $this->map(Ids::ELEMENT_103, fn() => Blocks::ELEMENT_LAWRENCIUM()); - $this->map(Ids::ELEMENT_104, fn() => Blocks::ELEMENT_RUTHERFORDIUM()); - $this->map(Ids::ELEMENT_105, fn() => Blocks::ELEMENT_DUBNIUM()); - $this->map(Ids::ELEMENT_106, fn() => Blocks::ELEMENT_SEABORGIUM()); - $this->map(Ids::ELEMENT_107, fn() => Blocks::ELEMENT_BOHRIUM()); - $this->map(Ids::ELEMENT_108, fn() => Blocks::ELEMENT_HASSIUM()); - $this->map(Ids::ELEMENT_109, fn() => Blocks::ELEMENT_MEITNERIUM()); - $this->map(Ids::ELEMENT_11, fn() => Blocks::ELEMENT_SODIUM()); - $this->map(Ids::ELEMENT_110, fn() => Blocks::ELEMENT_DARMSTADTIUM()); - $this->map(Ids::ELEMENT_111, fn() => Blocks::ELEMENT_ROENTGENIUM()); - $this->map(Ids::ELEMENT_112, fn() => Blocks::ELEMENT_COPERNICIUM()); - $this->map(Ids::ELEMENT_113, fn() => Blocks::ELEMENT_NIHONIUM()); - $this->map(Ids::ELEMENT_114, fn() => Blocks::ELEMENT_FLEROVIUM()); - $this->map(Ids::ELEMENT_115, fn() => Blocks::ELEMENT_MOSCOVIUM()); - $this->map(Ids::ELEMENT_116, fn() => Blocks::ELEMENT_LIVERMORIUM()); - $this->map(Ids::ELEMENT_117, fn() => Blocks::ELEMENT_TENNESSINE()); - $this->map(Ids::ELEMENT_118, fn() => Blocks::ELEMENT_OGANESSON()); - $this->map(Ids::ELEMENT_12, fn() => Blocks::ELEMENT_MAGNESIUM()); - $this->map(Ids::ELEMENT_13, fn() => Blocks::ELEMENT_ALUMINUM()); - $this->map(Ids::ELEMENT_14, fn() => Blocks::ELEMENT_SILICON()); - $this->map(Ids::ELEMENT_15, fn() => Blocks::ELEMENT_PHOSPHORUS()); - $this->map(Ids::ELEMENT_16, fn() => Blocks::ELEMENT_SULFUR()); - $this->map(Ids::ELEMENT_17, fn() => Blocks::ELEMENT_CHLORINE()); - $this->map(Ids::ELEMENT_18, fn() => Blocks::ELEMENT_ARGON()); - $this->map(Ids::ELEMENT_19, fn() => Blocks::ELEMENT_POTASSIUM()); - $this->map(Ids::ELEMENT_2, fn() => Blocks::ELEMENT_HELIUM()); - $this->map(Ids::ELEMENT_20, fn() => Blocks::ELEMENT_CALCIUM()); - $this->map(Ids::ELEMENT_21, fn() => Blocks::ELEMENT_SCANDIUM()); - $this->map(Ids::ELEMENT_22, fn() => Blocks::ELEMENT_TITANIUM()); - $this->map(Ids::ELEMENT_23, fn() => Blocks::ELEMENT_VANADIUM()); - $this->map(Ids::ELEMENT_24, fn() => Blocks::ELEMENT_CHROMIUM()); - $this->map(Ids::ELEMENT_25, fn() => Blocks::ELEMENT_MANGANESE()); - $this->map(Ids::ELEMENT_26, fn() => Blocks::ELEMENT_IRON()); - $this->map(Ids::ELEMENT_27, fn() => Blocks::ELEMENT_COBALT()); - $this->map(Ids::ELEMENT_28, fn() => Blocks::ELEMENT_NICKEL()); - $this->map(Ids::ELEMENT_29, fn() => Blocks::ELEMENT_COPPER()); - $this->map(Ids::ELEMENT_3, fn() => Blocks::ELEMENT_LITHIUM()); - $this->map(Ids::ELEMENT_30, fn() => Blocks::ELEMENT_ZINC()); - $this->map(Ids::ELEMENT_31, fn() => Blocks::ELEMENT_GALLIUM()); - $this->map(Ids::ELEMENT_32, fn() => Blocks::ELEMENT_GERMANIUM()); - $this->map(Ids::ELEMENT_33, fn() => Blocks::ELEMENT_ARSENIC()); - $this->map(Ids::ELEMENT_34, fn() => Blocks::ELEMENT_SELENIUM()); - $this->map(Ids::ELEMENT_35, fn() => Blocks::ELEMENT_BROMINE()); - $this->map(Ids::ELEMENT_36, fn() => Blocks::ELEMENT_KRYPTON()); - $this->map(Ids::ELEMENT_37, fn() => Blocks::ELEMENT_RUBIDIUM()); - $this->map(Ids::ELEMENT_38, fn() => Blocks::ELEMENT_STRONTIUM()); - $this->map(Ids::ELEMENT_39, fn() => Blocks::ELEMENT_YTTRIUM()); - $this->map(Ids::ELEMENT_4, fn() => Blocks::ELEMENT_BERYLLIUM()); - $this->map(Ids::ELEMENT_40, fn() => Blocks::ELEMENT_ZIRCONIUM()); - $this->map(Ids::ELEMENT_41, fn() => Blocks::ELEMENT_NIOBIUM()); - $this->map(Ids::ELEMENT_42, fn() => Blocks::ELEMENT_MOLYBDENUM()); - $this->map(Ids::ELEMENT_43, fn() => Blocks::ELEMENT_TECHNETIUM()); - $this->map(Ids::ELEMENT_44, fn() => Blocks::ELEMENT_RUTHENIUM()); - $this->map(Ids::ELEMENT_45, fn() => Blocks::ELEMENT_RHODIUM()); - $this->map(Ids::ELEMENT_46, fn() => Blocks::ELEMENT_PALLADIUM()); - $this->map(Ids::ELEMENT_47, fn() => Blocks::ELEMENT_SILVER()); - $this->map(Ids::ELEMENT_48, fn() => Blocks::ELEMENT_CADMIUM()); - $this->map(Ids::ELEMENT_49, fn() => Blocks::ELEMENT_INDIUM()); - $this->map(Ids::ELEMENT_5, fn() => Blocks::ELEMENT_BORON()); - $this->map(Ids::ELEMENT_50, fn() => Blocks::ELEMENT_TIN()); - $this->map(Ids::ELEMENT_51, fn() => Blocks::ELEMENT_ANTIMONY()); - $this->map(Ids::ELEMENT_52, fn() => Blocks::ELEMENT_TELLURIUM()); - $this->map(Ids::ELEMENT_53, fn() => Blocks::ELEMENT_IODINE()); - $this->map(Ids::ELEMENT_54, fn() => Blocks::ELEMENT_XENON()); - $this->map(Ids::ELEMENT_55, fn() => Blocks::ELEMENT_CESIUM()); - $this->map(Ids::ELEMENT_56, fn() => Blocks::ELEMENT_BARIUM()); - $this->map(Ids::ELEMENT_57, fn() => Blocks::ELEMENT_LANTHANUM()); - $this->map(Ids::ELEMENT_58, fn() => Blocks::ELEMENT_CERIUM()); - $this->map(Ids::ELEMENT_59, fn() => Blocks::ELEMENT_PRASEODYMIUM()); - $this->map(Ids::ELEMENT_6, fn() => Blocks::ELEMENT_CARBON()); - $this->map(Ids::ELEMENT_60, fn() => Blocks::ELEMENT_NEODYMIUM()); - $this->map(Ids::ELEMENT_61, fn() => Blocks::ELEMENT_PROMETHIUM()); - $this->map(Ids::ELEMENT_62, fn() => Blocks::ELEMENT_SAMARIUM()); - $this->map(Ids::ELEMENT_63, fn() => Blocks::ELEMENT_EUROPIUM()); - $this->map(Ids::ELEMENT_64, fn() => Blocks::ELEMENT_GADOLINIUM()); - $this->map(Ids::ELEMENT_65, fn() => Blocks::ELEMENT_TERBIUM()); - $this->map(Ids::ELEMENT_66, fn() => Blocks::ELEMENT_DYSPROSIUM()); - $this->map(Ids::ELEMENT_67, fn() => Blocks::ELEMENT_HOLMIUM()); - $this->map(Ids::ELEMENT_68, fn() => Blocks::ELEMENT_ERBIUM()); - $this->map(Ids::ELEMENT_69, fn() => Blocks::ELEMENT_THULIUM()); - $this->map(Ids::ELEMENT_7, fn() => Blocks::ELEMENT_NITROGEN()); - $this->map(Ids::ELEMENT_70, fn() => Blocks::ELEMENT_YTTERBIUM()); - $this->map(Ids::ELEMENT_71, fn() => Blocks::ELEMENT_LUTETIUM()); - $this->map(Ids::ELEMENT_72, fn() => Blocks::ELEMENT_HAFNIUM()); - $this->map(Ids::ELEMENT_73, fn() => Blocks::ELEMENT_TANTALUM()); - $this->map(Ids::ELEMENT_74, fn() => Blocks::ELEMENT_TUNGSTEN()); - $this->map(Ids::ELEMENT_75, fn() => Blocks::ELEMENT_RHENIUM()); - $this->map(Ids::ELEMENT_76, fn() => Blocks::ELEMENT_OSMIUM()); - $this->map(Ids::ELEMENT_77, fn() => Blocks::ELEMENT_IRIDIUM()); - $this->map(Ids::ELEMENT_78, fn() => Blocks::ELEMENT_PLATINUM()); - $this->map(Ids::ELEMENT_79, fn() => Blocks::ELEMENT_GOLD()); - $this->map(Ids::ELEMENT_8, fn() => Blocks::ELEMENT_OXYGEN()); - $this->map(Ids::ELEMENT_80, fn() => Blocks::ELEMENT_MERCURY()); - $this->map(Ids::ELEMENT_81, fn() => Blocks::ELEMENT_THALLIUM()); - $this->map(Ids::ELEMENT_82, fn() => Blocks::ELEMENT_LEAD()); - $this->map(Ids::ELEMENT_83, fn() => Blocks::ELEMENT_BISMUTH()); - $this->map(Ids::ELEMENT_84, fn() => Blocks::ELEMENT_POLONIUM()); - $this->map(Ids::ELEMENT_85, fn() => Blocks::ELEMENT_ASTATINE()); - $this->map(Ids::ELEMENT_86, fn() => Blocks::ELEMENT_RADON()); - $this->map(Ids::ELEMENT_87, fn() => Blocks::ELEMENT_FRANCIUM()); - $this->map(Ids::ELEMENT_88, fn() => Blocks::ELEMENT_RADIUM()); - $this->map(Ids::ELEMENT_89, fn() => Blocks::ELEMENT_ACTINIUM()); - $this->map(Ids::ELEMENT_9, fn() => Blocks::ELEMENT_FLUORINE()); - $this->map(Ids::ELEMENT_90, fn() => Blocks::ELEMENT_THORIUM()); - $this->map(Ids::ELEMENT_91, fn() => Blocks::ELEMENT_PROTACTINIUM()); - $this->map(Ids::ELEMENT_92, fn() => Blocks::ELEMENT_URANIUM()); - $this->map(Ids::ELEMENT_93, fn() => Blocks::ELEMENT_NEPTUNIUM()); - $this->map(Ids::ELEMENT_94, fn() => Blocks::ELEMENT_PLUTONIUM()); - $this->map(Ids::ELEMENT_95, fn() => Blocks::ELEMENT_AMERICIUM()); - $this->map(Ids::ELEMENT_96, fn() => Blocks::ELEMENT_CURIUM()); - $this->map(Ids::ELEMENT_97, fn() => Blocks::ELEMENT_BERKELIUM()); - $this->map(Ids::ELEMENT_98, fn() => Blocks::ELEMENT_CALIFORNIUM()); - $this->map(Ids::ELEMENT_99, fn() => Blocks::ELEMENT_EINSTEINIUM()); - $this->map(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD()); - $this->map(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE()); - $this->map(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); - $this->map(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); - $this->map(Ids::END_STONE, fn() => Blocks::END_STONE()); - $this->map(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); - $this->map(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); - $this->map(Ids::GLASS, fn() => Blocks::GLASS()); - $this->map(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); - $this->map(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); - $this->map(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); - $this->map(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); - $this->map(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); - $this->map(Ids::GRASS, fn() => Blocks::GRASS()); - $this->map(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); - $this->map(Ids::GRAVEL, fn() => Blocks::GRAVEL()); - $this->map(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); - $this->map(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); - $this->map(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); - $this->map(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); - $this->map(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); - $this->map(Ids::ICE, fn() => Blocks::ICE()); - $this->map(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); - $this->map(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); - $this->map(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); - $this->map(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); - $this->map(Ids::IRON_BLOCK, fn() => Blocks::IRON()); - $this->map(Ids::IRON_ORE, fn() => Blocks::IRON_ORE()); - $this->map(Ids::JUKEBOX, fn() => Blocks::JUKEBOX()); - $this->map(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI()); - $this->map(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE()); - $this->map(Ids::MAGMA, fn() => Blocks::MAGMA()); - $this->map(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); - $this->map(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); - $this->map(Ids::MANGROVE_ROOTS, fn() => Blocks::MANGROVE_ROOTS()); - $this->map(Ids::MELON_BLOCK, fn() => Blocks::MELON()); - $this->map(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); - $this->map(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); - $this->map(Ids::MUD, fn() => Blocks::MUD()); - $this->map(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); - $this->map(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); - $this->map(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); - $this->map(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); - $this->map(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE()); - $this->map(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); - $this->map(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE()); - $this->map(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); - $this->map(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); - $this->map(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); - $this->map(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); - $this->map(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); - $this->map(Ids::PACKED_MUD, fn() => Blocks::PACKED_MUD()); - $this->map(Ids::PODZOL, fn() => Blocks::PODZOL()); - $this->map(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); - $this->map(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); - $this->map(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); - $this->map(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); - $this->map(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); - $this->map(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); - $this->map(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD()); - $this->map(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); - $this->map(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); - $this->map(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); - $this->map(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); - $this->map(Ids::RESERVED6, fn() => Blocks::RESERVED6()); - $this->map(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); - $this->map(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); - $this->map(Ids::SLIME, fn() => Blocks::SLIME()); - $this->map(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); - $this->map(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); - $this->map(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); - $this->map(Ids::SNOW, fn() => Blocks::SNOW()); - $this->map(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); - $this->map(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); - $this->map(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); - $this->map(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); - $this->map(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); - $this->map(Ids::TUFF, fn() => Blocks::TUFF()); - $this->map(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); - $this->map(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE()); - $this->map(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); - $this->map(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); - $this->map(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); - $this->map(Ids::WEB, fn() => Blocks::COBWEB()); - $this->map(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); - $this->map(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); + $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); + $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); + $this->mapSimple(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS()); + $this->mapSimple(Ids::BARRIER, fn() => Blocks::BARRIER()); + $this->mapSimple(Ids::BEACON, fn() => Blocks::BEACON()); + $this->mapSimple(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE()); + $this->mapSimple(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE()); + $this->mapSimple(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); + $this->mapSimple(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); + $this->mapSimple(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); + $this->mapSimple(Ids::CALCITE, fn() => Blocks::CALCITE()); + $this->mapSimple(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE()); + $this->mapSimple(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT()); + $this->mapSimple(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); + $this->mapSimple(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); + $this->mapSimple(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); + $this->mapSimple(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT()); + $this->mapSimple(Ids::CLAY, fn() => Blocks::CLAY()); + $this->mapSimple(Ids::COAL_BLOCK, fn() => Blocks::COAL()); + $this->mapSimple(Ids::COAL_ORE, fn() => Blocks::COAL_ORE()); + $this->mapSimple(Ids::COBBLED_DEEPSLATE, fn() => Blocks::COBBLED_DEEPSLATE()); + $this->mapSimple(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE()); + $this->mapSimple(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE()); + $this->mapSimple(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); + $this->mapSimple(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); + $this->mapSimple(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); + $this->mapSimple(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); + $this->mapSimple(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); + $this->mapSimple(Ids::CRIMSON_FENCE, fn() => Blocks::CRIMSON_FENCE()); + $this->mapSimple(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS()); + $this->mapSimple(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); + $this->mapSimple(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); + $this->mapSimple(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); + $this->mapSimple(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE()); + $this->mapSimple(Ids::DEEPSLATE_COPPER_ORE, fn() => Blocks::DEEPSLATE_COPPER_ORE()); + $this->mapSimple(Ids::DEEPSLATE_DIAMOND_ORE, fn() => Blocks::DEEPSLATE_DIAMOND_ORE()); + $this->mapSimple(Ids::DEEPSLATE_EMERALD_ORE, fn() => Blocks::DEEPSLATE_EMERALD_ORE()); + $this->mapSimple(Ids::DEEPSLATE_GOLD_ORE, fn() => Blocks::DEEPSLATE_GOLD_ORE()); + $this->mapSimple(Ids::DEEPSLATE_IRON_ORE, fn() => Blocks::DEEPSLATE_IRON_ORE()); + $this->mapSimple(Ids::DEEPSLATE_LAPIS_ORE, fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE()); + $this->mapSimple(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); + $this->mapSimple(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); + $this->mapSimple(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); + $this->mapSimple(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); + $this->mapSimple(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP()); + $this->mapSimple(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO()); + $this->mapSimple(Ids::ELEMENT_1, fn() => Blocks::ELEMENT_HYDROGEN()); + $this->mapSimple(Ids::ELEMENT_10, fn() => Blocks::ELEMENT_NEON()); + $this->mapSimple(Ids::ELEMENT_100, fn() => Blocks::ELEMENT_FERMIUM()); + $this->mapSimple(Ids::ELEMENT_101, fn() => Blocks::ELEMENT_MENDELEVIUM()); + $this->mapSimple(Ids::ELEMENT_102, fn() => Blocks::ELEMENT_NOBELIUM()); + $this->mapSimple(Ids::ELEMENT_103, fn() => Blocks::ELEMENT_LAWRENCIUM()); + $this->mapSimple(Ids::ELEMENT_104, fn() => Blocks::ELEMENT_RUTHERFORDIUM()); + $this->mapSimple(Ids::ELEMENT_105, fn() => Blocks::ELEMENT_DUBNIUM()); + $this->mapSimple(Ids::ELEMENT_106, fn() => Blocks::ELEMENT_SEABORGIUM()); + $this->mapSimple(Ids::ELEMENT_107, fn() => Blocks::ELEMENT_BOHRIUM()); + $this->mapSimple(Ids::ELEMENT_108, fn() => Blocks::ELEMENT_HASSIUM()); + $this->mapSimple(Ids::ELEMENT_109, fn() => Blocks::ELEMENT_MEITNERIUM()); + $this->mapSimple(Ids::ELEMENT_11, fn() => Blocks::ELEMENT_SODIUM()); + $this->mapSimple(Ids::ELEMENT_110, fn() => Blocks::ELEMENT_DARMSTADTIUM()); + $this->mapSimple(Ids::ELEMENT_111, fn() => Blocks::ELEMENT_ROENTGENIUM()); + $this->mapSimple(Ids::ELEMENT_112, fn() => Blocks::ELEMENT_COPERNICIUM()); + $this->mapSimple(Ids::ELEMENT_113, fn() => Blocks::ELEMENT_NIHONIUM()); + $this->mapSimple(Ids::ELEMENT_114, fn() => Blocks::ELEMENT_FLEROVIUM()); + $this->mapSimple(Ids::ELEMENT_115, fn() => Blocks::ELEMENT_MOSCOVIUM()); + $this->mapSimple(Ids::ELEMENT_116, fn() => Blocks::ELEMENT_LIVERMORIUM()); + $this->mapSimple(Ids::ELEMENT_117, fn() => Blocks::ELEMENT_TENNESSINE()); + $this->mapSimple(Ids::ELEMENT_118, fn() => Blocks::ELEMENT_OGANESSON()); + $this->mapSimple(Ids::ELEMENT_12, fn() => Blocks::ELEMENT_MAGNESIUM()); + $this->mapSimple(Ids::ELEMENT_13, fn() => Blocks::ELEMENT_ALUMINUM()); + $this->mapSimple(Ids::ELEMENT_14, fn() => Blocks::ELEMENT_SILICON()); + $this->mapSimple(Ids::ELEMENT_15, fn() => Blocks::ELEMENT_PHOSPHORUS()); + $this->mapSimple(Ids::ELEMENT_16, fn() => Blocks::ELEMENT_SULFUR()); + $this->mapSimple(Ids::ELEMENT_17, fn() => Blocks::ELEMENT_CHLORINE()); + $this->mapSimple(Ids::ELEMENT_18, fn() => Blocks::ELEMENT_ARGON()); + $this->mapSimple(Ids::ELEMENT_19, fn() => Blocks::ELEMENT_POTASSIUM()); + $this->mapSimple(Ids::ELEMENT_2, fn() => Blocks::ELEMENT_HELIUM()); + $this->mapSimple(Ids::ELEMENT_20, fn() => Blocks::ELEMENT_CALCIUM()); + $this->mapSimple(Ids::ELEMENT_21, fn() => Blocks::ELEMENT_SCANDIUM()); + $this->mapSimple(Ids::ELEMENT_22, fn() => Blocks::ELEMENT_TITANIUM()); + $this->mapSimple(Ids::ELEMENT_23, fn() => Blocks::ELEMENT_VANADIUM()); + $this->mapSimple(Ids::ELEMENT_24, fn() => Blocks::ELEMENT_CHROMIUM()); + $this->mapSimple(Ids::ELEMENT_25, fn() => Blocks::ELEMENT_MANGANESE()); + $this->mapSimple(Ids::ELEMENT_26, fn() => Blocks::ELEMENT_IRON()); + $this->mapSimple(Ids::ELEMENT_27, fn() => Blocks::ELEMENT_COBALT()); + $this->mapSimple(Ids::ELEMENT_28, fn() => Blocks::ELEMENT_NICKEL()); + $this->mapSimple(Ids::ELEMENT_29, fn() => Blocks::ELEMENT_COPPER()); + $this->mapSimple(Ids::ELEMENT_3, fn() => Blocks::ELEMENT_LITHIUM()); + $this->mapSimple(Ids::ELEMENT_30, fn() => Blocks::ELEMENT_ZINC()); + $this->mapSimple(Ids::ELEMENT_31, fn() => Blocks::ELEMENT_GALLIUM()); + $this->mapSimple(Ids::ELEMENT_32, fn() => Blocks::ELEMENT_GERMANIUM()); + $this->mapSimple(Ids::ELEMENT_33, fn() => Blocks::ELEMENT_ARSENIC()); + $this->mapSimple(Ids::ELEMENT_34, fn() => Blocks::ELEMENT_SELENIUM()); + $this->mapSimple(Ids::ELEMENT_35, fn() => Blocks::ELEMENT_BROMINE()); + $this->mapSimple(Ids::ELEMENT_36, fn() => Blocks::ELEMENT_KRYPTON()); + $this->mapSimple(Ids::ELEMENT_37, fn() => Blocks::ELEMENT_RUBIDIUM()); + $this->mapSimple(Ids::ELEMENT_38, fn() => Blocks::ELEMENT_STRONTIUM()); + $this->mapSimple(Ids::ELEMENT_39, fn() => Blocks::ELEMENT_YTTRIUM()); + $this->mapSimple(Ids::ELEMENT_4, fn() => Blocks::ELEMENT_BERYLLIUM()); + $this->mapSimple(Ids::ELEMENT_40, fn() => Blocks::ELEMENT_ZIRCONIUM()); + $this->mapSimple(Ids::ELEMENT_41, fn() => Blocks::ELEMENT_NIOBIUM()); + $this->mapSimple(Ids::ELEMENT_42, fn() => Blocks::ELEMENT_MOLYBDENUM()); + $this->mapSimple(Ids::ELEMENT_43, fn() => Blocks::ELEMENT_TECHNETIUM()); + $this->mapSimple(Ids::ELEMENT_44, fn() => Blocks::ELEMENT_RUTHENIUM()); + $this->mapSimple(Ids::ELEMENT_45, fn() => Blocks::ELEMENT_RHODIUM()); + $this->mapSimple(Ids::ELEMENT_46, fn() => Blocks::ELEMENT_PALLADIUM()); + $this->mapSimple(Ids::ELEMENT_47, fn() => Blocks::ELEMENT_SILVER()); + $this->mapSimple(Ids::ELEMENT_48, fn() => Blocks::ELEMENT_CADMIUM()); + $this->mapSimple(Ids::ELEMENT_49, fn() => Blocks::ELEMENT_INDIUM()); + $this->mapSimple(Ids::ELEMENT_5, fn() => Blocks::ELEMENT_BORON()); + $this->mapSimple(Ids::ELEMENT_50, fn() => Blocks::ELEMENT_TIN()); + $this->mapSimple(Ids::ELEMENT_51, fn() => Blocks::ELEMENT_ANTIMONY()); + $this->mapSimple(Ids::ELEMENT_52, fn() => Blocks::ELEMENT_TELLURIUM()); + $this->mapSimple(Ids::ELEMENT_53, fn() => Blocks::ELEMENT_IODINE()); + $this->mapSimple(Ids::ELEMENT_54, fn() => Blocks::ELEMENT_XENON()); + $this->mapSimple(Ids::ELEMENT_55, fn() => Blocks::ELEMENT_CESIUM()); + $this->mapSimple(Ids::ELEMENT_56, fn() => Blocks::ELEMENT_BARIUM()); + $this->mapSimple(Ids::ELEMENT_57, fn() => Blocks::ELEMENT_LANTHANUM()); + $this->mapSimple(Ids::ELEMENT_58, fn() => Blocks::ELEMENT_CERIUM()); + $this->mapSimple(Ids::ELEMENT_59, fn() => Blocks::ELEMENT_PRASEODYMIUM()); + $this->mapSimple(Ids::ELEMENT_6, fn() => Blocks::ELEMENT_CARBON()); + $this->mapSimple(Ids::ELEMENT_60, fn() => Blocks::ELEMENT_NEODYMIUM()); + $this->mapSimple(Ids::ELEMENT_61, fn() => Blocks::ELEMENT_PROMETHIUM()); + $this->mapSimple(Ids::ELEMENT_62, fn() => Blocks::ELEMENT_SAMARIUM()); + $this->mapSimple(Ids::ELEMENT_63, fn() => Blocks::ELEMENT_EUROPIUM()); + $this->mapSimple(Ids::ELEMENT_64, fn() => Blocks::ELEMENT_GADOLINIUM()); + $this->mapSimple(Ids::ELEMENT_65, fn() => Blocks::ELEMENT_TERBIUM()); + $this->mapSimple(Ids::ELEMENT_66, fn() => Blocks::ELEMENT_DYSPROSIUM()); + $this->mapSimple(Ids::ELEMENT_67, fn() => Blocks::ELEMENT_HOLMIUM()); + $this->mapSimple(Ids::ELEMENT_68, fn() => Blocks::ELEMENT_ERBIUM()); + $this->mapSimple(Ids::ELEMENT_69, fn() => Blocks::ELEMENT_THULIUM()); + $this->mapSimple(Ids::ELEMENT_7, fn() => Blocks::ELEMENT_NITROGEN()); + $this->mapSimple(Ids::ELEMENT_70, fn() => Blocks::ELEMENT_YTTERBIUM()); + $this->mapSimple(Ids::ELEMENT_71, fn() => Blocks::ELEMENT_LUTETIUM()); + $this->mapSimple(Ids::ELEMENT_72, fn() => Blocks::ELEMENT_HAFNIUM()); + $this->mapSimple(Ids::ELEMENT_73, fn() => Blocks::ELEMENT_TANTALUM()); + $this->mapSimple(Ids::ELEMENT_74, fn() => Blocks::ELEMENT_TUNGSTEN()); + $this->mapSimple(Ids::ELEMENT_75, fn() => Blocks::ELEMENT_RHENIUM()); + $this->mapSimple(Ids::ELEMENT_76, fn() => Blocks::ELEMENT_OSMIUM()); + $this->mapSimple(Ids::ELEMENT_77, fn() => Blocks::ELEMENT_IRIDIUM()); + $this->mapSimple(Ids::ELEMENT_78, fn() => Blocks::ELEMENT_PLATINUM()); + $this->mapSimple(Ids::ELEMENT_79, fn() => Blocks::ELEMENT_GOLD()); + $this->mapSimple(Ids::ELEMENT_8, fn() => Blocks::ELEMENT_OXYGEN()); + $this->mapSimple(Ids::ELEMENT_80, fn() => Blocks::ELEMENT_MERCURY()); + $this->mapSimple(Ids::ELEMENT_81, fn() => Blocks::ELEMENT_THALLIUM()); + $this->mapSimple(Ids::ELEMENT_82, fn() => Blocks::ELEMENT_LEAD()); + $this->mapSimple(Ids::ELEMENT_83, fn() => Blocks::ELEMENT_BISMUTH()); + $this->mapSimple(Ids::ELEMENT_84, fn() => Blocks::ELEMENT_POLONIUM()); + $this->mapSimple(Ids::ELEMENT_85, fn() => Blocks::ELEMENT_ASTATINE()); + $this->mapSimple(Ids::ELEMENT_86, fn() => Blocks::ELEMENT_RADON()); + $this->mapSimple(Ids::ELEMENT_87, fn() => Blocks::ELEMENT_FRANCIUM()); + $this->mapSimple(Ids::ELEMENT_88, fn() => Blocks::ELEMENT_RADIUM()); + $this->mapSimple(Ids::ELEMENT_89, fn() => Blocks::ELEMENT_ACTINIUM()); + $this->mapSimple(Ids::ELEMENT_9, fn() => Blocks::ELEMENT_FLUORINE()); + $this->mapSimple(Ids::ELEMENT_90, fn() => Blocks::ELEMENT_THORIUM()); + $this->mapSimple(Ids::ELEMENT_91, fn() => Blocks::ELEMENT_PROTACTINIUM()); + $this->mapSimple(Ids::ELEMENT_92, fn() => Blocks::ELEMENT_URANIUM()); + $this->mapSimple(Ids::ELEMENT_93, fn() => Blocks::ELEMENT_NEPTUNIUM()); + $this->mapSimple(Ids::ELEMENT_94, fn() => Blocks::ELEMENT_PLUTONIUM()); + $this->mapSimple(Ids::ELEMENT_95, fn() => Blocks::ELEMENT_AMERICIUM()); + $this->mapSimple(Ids::ELEMENT_96, fn() => Blocks::ELEMENT_CURIUM()); + $this->mapSimple(Ids::ELEMENT_97, fn() => Blocks::ELEMENT_BERKELIUM()); + $this->mapSimple(Ids::ELEMENT_98, fn() => Blocks::ELEMENT_CALIFORNIUM()); + $this->mapSimple(Ids::ELEMENT_99, fn() => Blocks::ELEMENT_EINSTEINIUM()); + $this->mapSimple(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD()); + $this->mapSimple(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE()); + $this->mapSimple(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); + $this->mapSimple(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); + $this->mapSimple(Ids::END_STONE, fn() => Blocks::END_STONE()); + $this->mapSimple(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); + $this->mapSimple(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); + $this->mapSimple(Ids::GLASS, fn() => Blocks::GLASS()); + $this->mapSimple(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE()); + $this->mapSimple(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN()); + $this->mapSimple(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); + $this->mapSimple(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); + $this->mapSimple(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); + $this->mapSimple(Ids::GRASS, fn() => Blocks::GRASS()); + $this->mapSimple(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); + $this->mapSimple(Ids::GRAVEL, fn() => Blocks::GRAVEL()); + $this->mapSimple(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); + $this->mapSimple(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS()); + $this->mapSimple(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE()); + $this->mapSimple(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); + $this->mapSimple(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); + $this->mapSimple(Ids::ICE, fn() => Blocks::ICE()); + $this->mapSimple(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); + $this->mapSimple(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); + $this->mapSimple(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); + $this->mapSimple(Ids::IRON_BARS, fn() => Blocks::IRON_BARS()); + $this->mapSimple(Ids::IRON_BLOCK, fn() => Blocks::IRON()); + $this->mapSimple(Ids::IRON_ORE, fn() => Blocks::IRON_ORE()); + $this->mapSimple(Ids::JUKEBOX, fn() => Blocks::JUKEBOX()); + $this->mapSimple(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI()); + $this->mapSimple(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE()); + $this->mapSimple(Ids::MAGMA, fn() => Blocks::MAGMA()); + $this->mapSimple(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE()); + $this->mapSimple(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); + $this->mapSimple(Ids::MANGROVE_ROOTS, fn() => Blocks::MANGROVE_ROOTS()); + $this->mapSimple(Ids::MELON_BLOCK, fn() => Blocks::MELON()); + $this->mapSimple(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); + $this->mapSimple(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); + $this->mapSimple(Ids::MUD, fn() => Blocks::MUD()); + $this->mapSimple(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); + $this->mapSimple(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); + $this->mapSimple(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS()); + $this->mapSimple(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE()); + $this->mapSimple(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE()); + $this->mapSimple(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK()); + $this->mapSimple(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE()); + $this->mapSimple(Ids::NETHERRACK, fn() => Blocks::NETHERRACK()); + $this->mapSimple(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE()); + $this->mapSimple(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK()); + $this->mapSimple(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN()); + $this->mapSimple(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); + $this->mapSimple(Ids::PACKED_MUD, fn() => Blocks::PACKED_MUD()); + $this->mapSimple(Ids::PODZOL, fn() => Blocks::PODZOL()); + $this->mapSimple(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); + $this->mapSimple(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); + $this->mapSimple(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); + $this->mapSimple(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); + $this->mapSimple(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); + $this->mapSimple(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); + $this->mapSimple(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD()); + $this->mapSimple(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); + $this->mapSimple(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); + $this->mapSimple(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); + $this->mapSimple(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); + $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6()); + $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); + $this->mapSimple(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); + $this->mapSimple(Ids::SLIME, fn() => Blocks::SLIME()); + $this->mapSimple(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); + $this->mapSimple(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); + $this->mapSimple(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); + $this->mapSimple(Ids::SNOW, fn() => Blocks::SNOW()); + $this->mapSimple(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); + $this->mapSimple(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); + $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); + $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); + $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); + $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF()); + $this->mapSimple(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); + $this->mapSimple(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE()); + $this->mapSimple(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS()); + $this->mapSimple(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); + $this->mapSimple(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); + $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB()); + $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); + $this->mapSimple(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); } private function registerDeserializers() : void{ From 1609b11c8e228faa397146b76c4c128a164cfe60 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 13:43:00 +0100 Subject: [PATCH 0410/1858] Make blockstate (de)serializer names a bit less verbose --- ...izer.php => BlockObjectToStateSerializer.php} | 2 +- ...er.php => BlockStateToObjectDeserializer.php} | 2 +- src/world/format/io/GlobalBlockStateHandlers.php | 16 ++++++++-------- .../convert/BlockSerializerDeserializerTest.php | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) rename src/data/bedrock/block/convert/{BlockObjectToBlockStateSerializer.php => BlockObjectToStateSerializer.php} (99%) rename src/data/bedrock/block/convert/{BlockStateToBlockObjectDeserializer.php => BlockStateToObjectDeserializer.php} (99%) diff --git a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php similarity index 99% rename from src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php rename to src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 5a8fa4bf5e..23a11412d2 100644 --- a/src/data/bedrock/block/convert/BlockObjectToBlockStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -169,7 +169,7 @@ use pocketmine\utils\AssumptionFailedError; use function class_parents; use function get_class; -final class BlockObjectToBlockStateSerializer implements BlockStateSerializer{ +final class BlockObjectToStateSerializer implements BlockStateSerializer{ /** * These callables actually accept Block, but for the sake of type completeness, it has to be never, since we can't * describe the bottom type of a type hierarchy only containing Block. diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php similarity index 99% rename from src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php rename to src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index e63ee2def1..f73a071e9c 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -54,7 +54,7 @@ use function array_key_exists; use function count; use function min; -final class BlockStateToBlockObjectDeserializer implements BlockStateDeserializer{ +final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ /** * @var \Closure[] diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 49924f5ed8..95d36417fd 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -25,8 +25,8 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockTypeNames; -use pocketmine\data\bedrock\block\convert\BlockObjectToBlockStateSerializer; -use pocketmine\data\bedrock\block\convert\BlockStateToBlockObjectDeserializer; +use pocketmine\data\bedrock\block\convert\BlockObjectToStateSerializer; +use pocketmine\data\bedrock\block\convert\BlockStateToObjectDeserializer; use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockIdMetaUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; @@ -45,20 +45,20 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; */ final class GlobalBlockStateHandlers{ - private static ?BlockObjectToBlockStateSerializer $blockStateSerializer = null; + private static ?BlockObjectToStateSerializer $blockStateSerializer = null; - private static ?BlockStateToBlockObjectDeserializer $blockStateDeserializer = null; + private static ?BlockStateToObjectDeserializer $blockStateDeserializer = null; private static ?BlockDataUpgrader $blockDataUpgrader = null; private static ?BlockStateData $unknownBlockStateData = null; - public static function getDeserializer() : BlockStateToBlockObjectDeserializer{ - return self::$blockStateDeserializer ??= new BlockStateToBlockObjectDeserializer(); + public static function getDeserializer() : BlockStateToObjectDeserializer{ + return self::$blockStateDeserializer ??= new BlockStateToObjectDeserializer(); } - public static function getSerializer() : BlockObjectToBlockStateSerializer{ - return self::$blockStateSerializer ??= new BlockObjectToBlockStateSerializer(); + public static function getSerializer() : BlockObjectToStateSerializer{ + return self::$blockStateSerializer ??= new BlockObjectToStateSerializer(); } public static function getUpgrader() : BlockDataUpgrader{ diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index 50b66ec23c..f69b4d0108 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -34,12 +34,12 @@ use pocketmine\data\bedrock\block\BlockStateSerializeException; use function print_r; final class BlockSerializerDeserializerTest extends TestCase{ - private BlockStateToBlockObjectDeserializer $deserializer; - private BlockObjectToBlockStateSerializer $serializer; + private BlockStateToObjectDeserializer $deserializer; + private BlockObjectToStateSerializer $serializer; public function setUp() : void{ - $this->deserializer = new BlockStateToBlockObjectDeserializer(); - $this->serializer = new BlockObjectToBlockStateSerializer(); + $this->deserializer = new BlockStateToObjectDeserializer(); + $this->serializer = new BlockObjectToStateSerializer(); } public function testAllKnownBlockStatesSerializableAndDeserializable() : void{ From 24ac54331396b15d2f531e32af32af01e40f7971 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 15:09:33 +0100 Subject: [PATCH 0411/1858] Prepare alpha4 changelog --- changelogs/5.0-alpha.md | 94 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 5b2e362345..14e1a85ff3 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -513,3 +513,97 @@ Released 14th August 2022. - `Item->onDestroyBlock()` now accepts `array &$returnedItems` reference parameter. - `Item->onInteractBlock()` now accepts `array &$returnedItems` reference parameter. - `Item->onReleaseUsing()` now accepts `array &$returnedItems` reference parameter. + +# 5.0.0-ALPHA4 +Released 24th September 2022. + +## Core +- Now targeting Minecraft: Bedrock 1.19.30. +- A new `console.enable-input` option has been added to `pocketmine.yml`, which allows disabling the console reader in environments where it's not needed (e.g. a Docker container). This can be useful to save processor and memory resources. +- Crashdumps now include JIT mode information for use by the Crash Archive. + +## Internals +- Improved handling of "UI" inventories in network `InventoryManager`. Their contents are now synced correctly. + +## API +### General +- Plugin dependents are now always disabled before their dependencies on shutdown, to ensure that the dependents can finish what they are doing correctly. + +### `pocketmine\block` +- The following new API methods have been added: + - `public SignText->isGlowing() : bool` + - `public SignText->getBaseColor() : pocketmine\color\Color` +- The following API methods have signature changes: + - `SignText::fromBlob()` now accepts two new optional parameters: `?Color $baseColor` and `bool $glowing` + - `SignText::__construct()` now accepts two new optional parameters: `?Color $baseColor` and `bool $glowing` +- The following API methods have been removed: + - `TreeType::fromMagicNumber()` + - `TreeType->getMagicNumber()` + +### `pocketmine\command` +- Command permissions are now always checked by the server when running a command. + - This only affects commands implemented by extending `Command`. Plugins using `PluginBase->onCommand()` are not affected by this change, since they already had permissions checked by the server anyway. + - Previously, direct inheritors of `Command` were responsible for checking permissions, which required developers to duplicate the same code in every command, and opened lots of potential for security vulnerabilities. + - If you want to do something on permission denied (e.g. sending a special message, or audit logging), you can do so by overriding `Command->testPermission()`, instead of baking the code directly into `Command->execute()`. + - If you don't want to use permissions at all, just create a permission with a default of `true` (or belonging to `pocketmine.group.user`) and assign that. + +### `pocketmine\data` +#### Highlights +- Introduced an experimental, mostly unified item (de)serializer registrar, `ItemSerializerDeserializerRegistrar`. + - This class includes helper methods to register symmetric serializer and deserializer callbacks into an `ItemSerializer` and `ItemDeserializer`. + - This halves the amount of code needed to register new items in the vast majority of cases. + - This is currently used to register all currently implemented items. + +#### Other changes +- The following classes have been renamed: + - `BlockObjectToBlockStateSerializer` -> `BlockObjectToStateSerializer` + - `BlockStateToBlockObjectDeserializer` -> `BlockStateToObjectDeserializer` +- The following classes have been removed: + - `CachingBlockStateDeserializer` + - `CachingBlockStateSerializer` + - `DelegatingBlockStateDeserializer` + - `DelegatingBlockStateSerializer` +- The following new API methods have been added: + - `public BlockStateToObjectDeserializer->mapSimple(string $stringId, \Closure() : Block $getBlock) : void` - for symmetry with the serializer + +### `pocketmine\event` +- `BlockFormEvent` now includes information about the block which caused the event. + - Added `public BlockFormEvent->getCausingBlock() : Block` + +### `pocketmine\inventory` +- Introduced a new `TransactionBuilder` class, which considerably simplifies the process of constructing an `InventoryTransaction` from generic `setItem()` calls. + - This is currently used to build server-side transactions for evicting the contents of the crafting grid when closing the main inventory. + - This is planned for use with the new Minecraft Bedrock item stack request system. + +### `pocketmine\item` +- The following API methods have been changed: + - `Item->encodeType(RuntimeDataWriter $w) : void` -> `Item->describeType(RuntimeDataReader|RuntimeDataWriter $w) : void` +- The following new classes have been added: + - `SuspiciousStew` + - `SuspiciousStewType` + +### `pocketmine\utils` +- The following new API methods have been added: + - `public static Utils::getOpcacheJitMode() : int` + +### `pocketmine\world` +- The following new classes have been added: + - `sound\DyeUseSound` + - `sound\InkSacUseSound` +- The following API methods have changed signatures: + - `GlobalBlockStateHandlers::getSerializer()` now returns `BlockObjectToStateSerializer` directly instead of `BlockStateSerializer`. + - `GlobalBlockStateHandlers::getDeserializer()` now returns `BlockStateToObjectDeserializer` directly instead of `BlockStateDeserializer`. + +## Gameplay +### Blocks +- Coral and coral fans now behave correctly when placed out of water (they no longer immediately die). +- Added support for dyeing sign text and making it glow. +- Fixed dead bush being able to be placed on some invalid blocks (e.g. stone). +- TNT can now be ignited by fire charges. +- Vines can now only be placed on the side of full-cube blocks. +- Fixed sugarcane not being able to be placed on some blocks. + +### Items +- Added the following new items: + - Fire Charge + - Suspicious Stew From b6289e5807173ed9aaea1bb2f4799d18bf2e2c79 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 15:17:53 +0100 Subject: [PATCH 0412/1858] Release 5.0.0-ALPHA4 --- changelogs/5.0-alpha.md | 15 +++++++++++++-- src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 14e1a85ff3..6eedae0ad8 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -519,11 +519,14 @@ Released 24th September 2022. ## Core - Now targeting Minecraft: Bedrock 1.19.30. +- All tests and static analysis are now being run on PHP 8.1 as well as PHP 8.0. +- Silenced warning about Xdebug when it's loaded but disabled by `xdebug.mode` configuration. - A new `console.enable-input` option has been added to `pocketmine.yml`, which allows disabling the console reader in environments where it's not needed (e.g. a Docker container). This can be useful to save processor and memory resources. +- Console reader polling is now done on the main thread. Since the console reader communication is now done via sockets, there's no longer any reason for it to have its own thread. - Crashdumps now include JIT mode information for use by the Crash Archive. - -## Internals - Improved handling of "UI" inventories in network `InventoryManager`. Their contents are now synced correctly. +- Fixed cartography table recipes pretending to be smithing table recipes in `CraftingDataPacket`. +- Fixed incorrect key being used for saving entity type IDs in save data. ## API ### General @@ -574,6 +577,7 @@ Released 24th September 2022. - Introduced a new `TransactionBuilder` class, which considerably simplifies the process of constructing an `InventoryTransaction` from generic `setItem()` calls. - This is currently used to build server-side transactions for evicting the contents of the crafting grid when closing the main inventory. - This is planned for use with the new Minecraft Bedrock item stack request system. +- Improved PHPStan type information available for `Inventory` and `BaseInventory`. ### `pocketmine\item` - The following API methods have been changed: @@ -595,6 +599,9 @@ Released 24th September 2022. - `GlobalBlockStateHandlers::getDeserializer()` now returns `BlockStateToObjectDeserializer` directly instead of `BlockStateDeserializer`. ## Gameplay +### General +- Spectator players are no longer able to acquire blocks by block picking that they don't already have in their inventories. The behaviour is now the same as survival mode. + ### Blocks - Coral and coral fans now behave correctly when placed out of water (they no longer immediately die). - Added support for dyeing sign text and making it glow. @@ -607,3 +614,7 @@ Released 24th September 2022. - Added the following new items: - Fire Charge - Suspicious Stew + +### Effects +- Updated damage modifier amounts for Instant Damage to be more in line with vanilla. +- Updated duration modifier amounts for Regeneration to be more like vanilla. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 6ea4844ccd..ff117131f8 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 18c9ccb01cd508bcca9d78999f8d620df428eeb6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 15:17:54 +0100 Subject: [PATCH 0413/1858] 5.0.0-ALPHA5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index ff117131f8..b4d3c92b5b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From f6a99499423aecdd872f6eeb7b9728cf73d6164c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 15:35:49 +0100 Subject: [PATCH 0414/1858] Remove PlayerCommandPreprocessEvent closes #4284 --- .../player/PlayerCommandPreprocessEvent.php | 62 ------------------- src/player/Player.php | 14 +---- 2 files changed, 3 insertions(+), 73 deletions(-) delete mode 100644 src/event/player/PlayerCommandPreprocessEvent.php diff --git a/src/event/player/PlayerCommandPreprocessEvent.php b/src/event/player/PlayerCommandPreprocessEvent.php deleted file mode 100644 index 5cbed294b9..0000000000 --- a/src/event/player/PlayerCommandPreprocessEvent.php +++ /dev/null @@ -1,62 +0,0 @@ -player = $player; - } - - public function getMessage() : string{ - return $this->message; - } - - public function setMessage(string $message) : void{ - $this->message = $message; - } - - public function setPlayer(Player $player) : void{ - $this->player = $player; - } -} diff --git a/src/player/Player.php b/src/player/Player.php index 75c87ff805..5ced7dd254 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -51,7 +51,6 @@ use pocketmine\event\player\PlayerBedLeaveEvent; use pocketmine\event\player\PlayerBlockPickEvent; use pocketmine\event\player\PlayerChangeSkinEvent; use pocketmine\event\player\PlayerChatEvent; -use pocketmine\event\player\PlayerCommandPreprocessEvent; use pocketmine\event\player\PlayerDeathEvent; use pocketmine\event\player\PlayerDisplayNameChangeEvent; use pocketmine\event\player\PlayerDropItemEvent; @@ -1401,19 +1400,12 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $messagePart = substr($messagePart, 1); } - $ev = new PlayerCommandPreprocessEvent($this, $messagePart); - $ev->call(); - - if($ev->isCancelled()){ - break; - } - - if(strpos($ev->getMessage(), "/") === 0){ + if(strpos($messagePart, "/") === 0){ Timings::$playerCommand->startTiming(); - $this->server->dispatchCommand($ev->getPlayer(), substr($ev->getMessage(), 1)); + $this->server->dispatchCommand($this, substr($messagePart, 1)); Timings::$playerCommand->stopTiming(); }else{ - $ev = new PlayerChatEvent($this, $ev->getMessage(), $this->server->getBroadcastChannelSubscribers(Server::BROADCAST_CHANNEL_USERS)); + $ev = new PlayerChatEvent($this, $messagePart, $this->server->getBroadcastChannelSubscribers(Server::BROADCAST_CHANNEL_USERS)); $ev->call(); if(!$ev->isCancelled()){ $this->server->broadcastMessage($this->getServer()->getLanguage()->translateString($ev->getFormat(), [$ev->getPlayer()->getDisplayName(), $ev->getMessage()]), $ev->getRecipients()); From 1bc8fb18517de273e11450217bed38dbb9b93cf8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 16:32:02 +0100 Subject: [PATCH 0415/1858] BlockStateToObjectDeserializer: reduce code duplication in legacy slab handling --- .../BlockStateToObjectDeserializer.php | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index f73a071e9c..7677d7cf62 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -99,13 +99,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } /** - * @phpstan-param \Closure() : Slab $getBlock + * @phpstan-param \Closure(Reader) : Slab $getBlock */ public function mapSlab(string $singleId, string $doubleId, \Closure $getBlock) : void{ - $this->map($singleId, fn(Reader $in) : Slab => $getBlock()->setSlabType($in->readSlabPosition())); + $this->map($singleId, fn(Reader $in) : Slab => $getBlock($in)->setSlabType($in->readSlabPosition())); $this->map($doubleId, function(Reader $in) use ($getBlock) : Slab{ $in->ignored(StateNames::TOP_SLOT_BIT); - return $getBlock()->setSlabType(SlabType::DOUBLE()); + return $getBlock($in)->setSlabType(SlabType::DOUBLE()); }); } @@ -682,26 +682,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab1Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB2, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab2Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB3, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab3Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB4, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapStoneSlab4Type($in)->setSlabType(SlabType::DOUBLE()); - }); - $this->map(Ids::DOUBLE_WOODEN_SLAB, function(Reader $in) : Block{ - $in->ignored(StateNames::TOP_SLOT_BIT); //useless for double slabs - return Helper::mapWoodenSlabType($in)->setSlabType(SlabType::DOUBLE()); - }); $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() @@ -1206,10 +1186,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); - $this->map(Ids::STONE_BLOCK_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)->setSlabType($in->readSlabPosition())); - $this->map(Ids::STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)->setSlabType($in->readSlabPosition())); + $this->mapSlab(Ids::STONE_BLOCK_SLAB, Ids::DOUBLE_STONE_BLOCK_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)); + $this->mapSlab(Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)); + $this->mapSlab(Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)); + $this->mapSlab(Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)); $this->mapStairs(Ids::STONE_STAIRS, fn() => Blocks::COBBLESTONE_STAIRS()); $this->map(Ids::STONEBRICK, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::STONE_BRICK_TYPE)){ @@ -1349,7 +1329,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::WOODEN_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::OAK_BUTTON(), $in)); $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in)); $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::OAK_PRESSURE_PLATE(), $in)); - $this->map(Ids::WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)->setSlabType($in->readSlabPosition())); + $this->mapSlab(Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)); $this->map(Ids::WOOL, function(Reader $in) : Block{ return Blocks::WOOL() ->setColor($in->readColor()); From ab0202ba294c6a151b0f5f473cac782170144f2b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Sep 2022 18:14:18 +0100 Subject: [PATCH 0416/1858] Block: correct documentation for getIdInfo() on PM5 --- src/block/Block.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 2286848967..24a5d917f2 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -77,8 +77,8 @@ class Block{ } /** - * Returns an object containing information about how to identify and store this block type, such as its legacy - * numeric ID(s), tile type (if any), and legacy variant metadata. + * Returns an object containing information about how to identify and store this block type, such as type ID and + * tile type (if any). */ public function getIdInfo() : BlockIdentifier{ return $this->idInfo; From 383dc2a2b9ca3a87f330391cfb998651cb06b5b5 Mon Sep 17 00:00:00 2001 From: Alexey <45711510+Gaprix@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:18:53 +0300 Subject: [PATCH 0417/1858] Fix the copper block scrape sound (#5147) Co-authored-by: Dylan T --- src/block/utils/CopperTrait.php | 4 ++-- src/world/sound/ScrapeSound.php | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/world/sound/ScrapeSound.php diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 51d269b427..6bbb4fa37b 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -34,7 +34,7 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\sound\CopperWaxApplySound; use pocketmine\world\sound\CopperWaxRemoveSound; -use pocketmine\world\sound\ItemUseOnBlockSound; +use pocketmine\world\sound\ScrapeSound; trait CopperTrait{ private CopperOxidation $oxidation; @@ -93,7 +93,7 @@ trait CopperTrait{ $this->oxidation = $previousOxidation; $this->position->getWorld()->setBlock($this->position, $this); //TODO: turquoise particles are supposed to appear when removing oxidation - $this->position->getWorld()->addSound($this->position, new ItemUseOnBlockSound($this)); + $this->position->getWorld()->addSound($this->position, new ScrapeSound()); $item->applyDamage(1); return true; } diff --git a/src/world/sound/ScrapeSound.php b/src/world/sound/ScrapeSound.php new file mode 100644 index 0000000000..39f35adab0 --- /dev/null +++ b/src/world/sound/ScrapeSound.php @@ -0,0 +1,34 @@ + Date: Wed, 28 Sep 2022 12:19:15 -0500 Subject: [PATCH 0418/1858] Implement Turtle Shell (#5235) --- .../ItemSerializerDeserializerRegistrar.php | 1 + src/entity/Living.php | 7 ++++ src/item/Item.php | 9 ++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 1 + src/item/TurtleHelmet.php | 41 +++++++++++++++++++ src/item/VanillaItems.php | 2 + 7 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/item/TurtleHelmet.php diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 62ab3d7f3f..c213397c9f 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -350,6 +350,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES()); $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM()); $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH()); + $this->map1to1Item(Ids::TURTLE_HELMET, Items::TURTLE_HELMET()); $this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG()); $this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN()); $this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET()); diff --git a/src/entity/Living.php b/src/entity/Living.php index 11e59031a2..30a0b68d4a 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -610,6 +610,13 @@ abstract class Living extends Entity{ if($this->doAirSupplyTick($tickDiff)){ $hasUpdate = true; } + + foreach($this->armorInventory->getContents() as $index => $item){ + if($item->onTickWorn($this)){ + $hasUpdate = true; + $this->armorInventory->setItem($index, $item); + } + } } if($this->attackTime > 0){ diff --git a/src/item/Item.php b/src/item/Item.php index 32bf0ff441..ed516adc02 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -36,6 +36,7 @@ use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; +use pocketmine\entity\Living; use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\math\Vector3; use pocketmine\nbt\LittleEndianNbtSerializer; @@ -559,6 +560,14 @@ class Item implements \JsonSerializable{ return false; } + /** + * Called when this item is being worn by an entity. + * Returns whether it did something. + */ + public function onTickWorn(Living $entity) : bool{ + return false; + } + /** * Returns the number of ticks a player must wait before activating this item again. */ diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index a36526acab..cc4be26d4e 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -298,8 +298,9 @@ final class ItemTypeIds{ public const LINGERING_POTION = 20259; public const FIRE_CHARGE = 20260; public const SUSPICIOUS_STEW = 20261; + public const TURTLE_HELMET = 20262; - public const FIRST_UNUSED_ITEM_ID = 20262; + public const FIRST_UNUSED_ITEM_ID = 20263; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 66378551b3..c3dfa6ecd2 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1486,6 +1486,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK())); $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK())); $result->register("totem", fn() => Items::TOTEM()); + $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER())); $result->register("turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::TURTLE_MASTER())); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); diff --git a/src/item/TurtleHelmet.php b/src/item/TurtleHelmet.php new file mode 100644 index 0000000000..2ee1d74d2f --- /dev/null +++ b/src/item/TurtleHelmet.php @@ -0,0 +1,41 @@ +isUnderwater()){ + $entity->getEffects()->add(new EffectInstance(VanillaEffects::WATER_BREATHING(), 200, 0, false)); + return true; + } + + return false; + } +} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 93634d2bc5..f9e7862373 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -289,6 +289,7 @@ use pocketmine\world\World; * @method static SuspiciousStew SUSPICIOUS_STEW() * @method static SweetBerries SWEET_BERRIES() * @method static Totem TOTEM() + * @method static TurtleHelmet TURTLE_HELMET() * @method static SpawnEgg VILLAGER_SPAWN_EGG() * @method static ItemBlockWallOrFloor WARPED_SIGN() * @method static LiquidBucket WATER_BUCKET() @@ -616,6 +617,7 @@ final class VanillaItems{ self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); self::register("netherite_helmet", new Armor(new IID(Ids::NETHERITE_HELMET), "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true))); + self::register("turtle_helmet", new TurtleHelmet(new IID(Ids::TURTLE_HELMET), "Turtle Shell", new ArmorTypeInfo(2, 276, ArmorInventory::SLOT_HEAD))); self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2))); From 0edf2ea6a4fbc60740e1d226778b53ae33e6be14 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 29 Sep 2022 21:50:15 +0100 Subject: [PATCH 0419/1858] ConcretePowder: fix CS --- src/block/ConcretePowder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index 8a39daa0d9..02fa31adbe 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -54,7 +54,7 @@ class ConcretePowder extends Opaque implements Fallable{ } public function tickFalling() : ?Block{ - if ($this->getAdjacentWater() === null) { + if($this->getAdjacentWater() === null){ return null; } return VanillaBlocks::CONCRETE()->setColor($this->color); From db7cee6f224c25da9d6ddf7f674f3bf18fdbdc29 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Oct 2022 22:06:03 +0100 Subject: [PATCH 0420/1858] Player: check if the item meaningfully changed before discarding it in creative fixes #5220 --- src/player/Player.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 126951811c..74616b23ff 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1473,15 +1473,27 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ private function returnItemsFromAction(Item $oldHeldItem, Item $newHeldItem, array $extraReturnedItems) : void{ $heldItemChanged = false; - if($this->hasFiniteResources()){ - if(!$newHeldItem->equalsExact($oldHeldItem) && $oldHeldItem->equalsExact($this->inventory->getItemInHand())){ + + if(!$newHeldItem->equalsExact($oldHeldItem) && $oldHeldItem->equalsExact($this->inventory->getItemInHand())){ + //determine if the item was changed in some meaningful way, or just damaged/changed count + //if it was really changed we always need to set it, whether we have finite resources or not + $newReplica = clone $oldHeldItem; + $newReplica->setCount($newHeldItem->getCount()); + if($newReplica instanceof Durable && $newHeldItem instanceof Durable){ + $newReplica->setDamage($newHeldItem->getDamage()); + } + $damagedOrDeducted = $newReplica->equalsExact($newHeldItem); + + if(!$damagedOrDeducted || $this->hasFiniteResources()){ if($newHeldItem instanceof Durable && $newHeldItem->isBroken()){ $this->broadcastSound(new ItemBreakSound()); } $this->inventory->setItemInHand($newHeldItem); $heldItemChanged = true; } - }else{ + } + + if(!$heldItemChanged){ $newHeldItem = $oldHeldItem; } From f88ae938974529bced853635f3cd013885b91cba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Oct 2022 16:43:36 +0100 Subject: [PATCH 0421/1858] BC break: Replaced webmozart/path-util with symfony/filesystem, closes #5332 --- build/generate-known-translation-apis.php | 2 +- composer.json | 2 +- composer.lock | 423 +++++++++++++----- src/MemoryManager.php | 2 +- src/PocketMine.php | 2 +- src/Server.php | 2 +- src/command/defaults/DumpMemoryCommand.php | 2 +- src/command/defaults/TimingsCommand.php | 2 +- .../ConsoleReaderChildProcessDaemon.php | 2 +- .../CraftingManagerFromDataHelper.php | 2 +- src/crash/CrashDump.php | 2 +- .../bedrock/LegacyBiomeIdToStringIdMap.php | 2 +- .../bedrock/LegacyEntityIdToStringIdMap.php | 2 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 2 +- .../upgrade/LegacyBlockIdToStringIdMap.php | 2 +- src/data/bedrock/item/BlockItemIdMap.php | 2 +- .../upgrade/ItemIdMetaUpgradeSchemaUtils.php | 2 +- .../upgrade/LegacyItemIdToStringIdMap.php | 2 +- .../item/upgrade/R12ItemIdToBlockIdMap.php | 2 +- src/inventory/CreativeInventory.php | 2 +- src/item/LegacyStringToItemParser.php | 2 +- src/lang/Language.php | 2 +- src/network/mcpe/cache/StaticPacketCache.php | 2 +- .../mcpe/convert/GlobalItemTypeDictionary.php | 2 +- .../mcpe/convert/RuntimeBlockMapping.php | 2 +- src/plugin/PluginBase.php | 2 +- src/plugin/PluginManager.php | 2 +- src/resourcepacks/ResourcePackManager.php | 2 +- src/scheduler/DumpWorkerMemoryTask.php | 2 +- src/utils/Config.php | 2 +- src/utils/Filesystem.php | 2 +- src/wizard/SetupWizard.php | 2 +- src/world/WorldManager.php | 2 +- src/world/format/io/FormatConverter.php | 2 +- .../format/io/GlobalBlockStateHandlers.php | 2 +- .../format/io/GlobalItemDataHandlers.php | 2 +- src/world/format/io/data/BedrockWorldData.php | 2 +- src/world/format/io/data/JavaWorldData.php | 2 +- src/world/format/io/leveldb/LevelDB.php | 2 +- .../format/io/region/RegionWorldProvider.php | 2 +- .../io/region/WritableRegionWorldProvider.php | 2 +- .../format/io/region/RegionLoaderTest.php | 2 +- tools/generate-item-upgrade-schema.php | 2 +- tools/generate-permission-doc.php | 2 +- tools/simulate-chunk-selector.php | 2 +- 45 files changed, 357 insertions(+), 154 deletions(-) diff --git a/build/generate-known-translation-apis.php b/build/generate-known-translation-apis.php index e799735c0d..af617c5235 100644 --- a/build/generate-known-translation-apis.php +++ b/build/generate-known-translation-apis.php @@ -25,7 +25,7 @@ namespace pocketmine\build\generate_known_translation_apis; use pocketmine\lang\Translatable; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_map; use function count; use function dirname; diff --git a/composer.json b/composer.json index 069821e879..9787b01ace 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "pocketmine/raklib-ipc": "^0.1.0", "pocketmine/snooze": "^0.3.0", "ramsey/uuid": "^4.1", - "webmozart/path-util": "^2.3" + "symfony/filesystem": "^5.4" }, "require-dev": { "phpstan/phpstan": "1.8.8", diff --git a/composer.lock b/composer.lock index 8ac56d931e..cf5fcfcc81 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "76009ed4482b5d406cac5d9cd83e1ec4", + "content-hash": "94c6278cb07e5bfe8b20c93c17b59135", "packages": [ { "name": "adhocore/json-comment", @@ -1076,6 +1076,318 @@ ], "time": "2022-09-16T03:22:46+00:00" }, + { + "name": "symfony/filesystem", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-09-21T19:53:16+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-10T07:21:04+00:00" + }, { "name": "symfony/polyfill-php81", "version": "v1.26.0", @@ -1154,115 +1466,6 @@ } ], "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" } ], "packages-dev": [ diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 49a728c897..cf7bc745dc 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -30,7 +30,7 @@ use pocketmine\scheduler\GarbageCollectionTask; use pocketmine\timings\Timings; use pocketmine\utils\Process; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function arsort; use function count; use function fclose; diff --git a/src/PocketMine.php b/src/PocketMine.php index b2e9a57a79..faccb27e13 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -34,7 +34,7 @@ namespace pocketmine { use pocketmine\utils\Timezone; use pocketmine\utils\Utils; use pocketmine\wizard\SetupWizard; - use Webmozart\PathUtil\Path; + use Symfony\Component\Filesystem\Path; use function defined; use function extension_loaded; use function function_exists; diff --git a/src/Server.php b/src/Server.php index 541e1ae9f4..d8d22f5205 100644 --- a/src/Server.php +++ b/src/Server.php @@ -115,7 +115,7 @@ use pocketmine\world\World; use pocketmine\world\WorldCreationOptions; use pocketmine\world\WorldManager; use Ramsey\Uuid\UuidInterface; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_sum; use function base64_encode; use function cli_set_process_title; diff --git a/src/command/defaults/DumpMemoryCommand.php b/src/command/defaults/DumpMemoryCommand.php index 3844199a12..d118fb06e1 100644 --- a/src/command/defaults/DumpMemoryCommand.php +++ b/src/command/defaults/DumpMemoryCommand.php @@ -25,7 +25,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\permission\DefaultPermissionNames; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function date; class DumpMemoryCommand extends VanillaCommand{ diff --git a/src/command/defaults/TimingsCommand.php b/src/command/defaults/TimingsCommand.php index 9a5076072f..ae736b64f8 100644 --- a/src/command/defaults/TimingsCommand.php +++ b/src/command/defaults/TimingsCommand.php @@ -35,7 +35,7 @@ use pocketmine\timings\TimingsHandler; use pocketmine\utils\InternetException; use pocketmine\utils\InternetRequestResult; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function count; use function fclose; use function file_exists; diff --git a/src/console/ConsoleReaderChildProcessDaemon.php b/src/console/ConsoleReaderChildProcessDaemon.php index a0c689d37b..138559f06e 100644 --- a/src/console/ConsoleReaderChildProcessDaemon.php +++ b/src/console/ConsoleReaderChildProcessDaemon.php @@ -25,7 +25,7 @@ namespace pocketmine\console; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function base64_encode; use function fgets; use function fopen; diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index e48b20ec52..6b0dd19295 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -41,7 +41,7 @@ use pocketmine\item\Item; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function base64_decode; use function file_get_contents; use function get_debug_type; diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index e724ea2171..e743a67044 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -33,7 +33,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use pocketmine\VersionInfo; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function base64_encode; use function error_get_last; use function file; diff --git a/src/data/bedrock/LegacyBiomeIdToStringIdMap.php b/src/data/bedrock/LegacyBiomeIdToStringIdMap.php index b82dcf2f21..ef71176179 100644 --- a/src/data/bedrock/LegacyBiomeIdToStringIdMap.php +++ b/src/data/bedrock/LegacyBiomeIdToStringIdMap.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; final class LegacyBiomeIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; diff --git a/src/data/bedrock/LegacyEntityIdToStringIdMap.php b/src/data/bedrock/LegacyEntityIdToStringIdMap.php index 6ba3b64dea..a86fbaf53c 100644 --- a/src/data/bedrock/LegacyEntityIdToStringIdMap.php +++ b/src/data/bedrock/LegacyEntityIdToStringIdMap.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; final class LegacyEntityIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 923afde762..5626354024 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -33,7 +33,7 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_map; use function count; use function file_get_contents; diff --git a/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php index bd0a14c79d..f42dc6d8a5 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockIdToStringIdMap.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\LegacyToStringIdMap; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; final class LegacyBlockIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; diff --git a/src/data/bedrock/item/BlockItemIdMap.php b/src/data/bedrock/item/BlockItemIdMap.php index 89ae14f786..04c4058ffb 100644 --- a/src/data/bedrock/item/BlockItemIdMap.php +++ b/src/data/bedrock/item/BlockItemIdMap.php @@ -26,7 +26,7 @@ namespace pocketmine\data\bedrock\item; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_flip; use function file_get_contents; use function is_array; diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php index 441ca02eed..0d315819c8 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\data\bedrock\item\upgrade\model\ItemIdMetaUpgradeSchemaModel; use pocketmine\errorhandler\ErrorToExceptionHandler; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; use function gettype; use function is_object; diff --git a/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php index 62627d7f4a..7ca1367fb8 100644 --- a/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/item/upgrade/LegacyItemIdToStringIdMap.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\data\bedrock\LegacyToStringIdMap; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; final class LegacyItemIdToStringIdMap extends LegacyToStringIdMap{ use SingletonTrait; diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index 6c0cf5cd37..be8a070d9f 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -26,7 +26,7 @@ namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; use function is_array; use function is_string; diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 5dd293b4cd..ea5893f87b 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -27,7 +27,7 @@ use pocketmine\crafting\CraftingManagerFromDataHelper; use pocketmine\crafting\json\ItemStackData; use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; final class CreativeInventory{ use SingletonTrait; diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index f8a14dde06..cc4ec2bfbb 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -30,7 +30,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function explode; use function file_get_contents; use function is_array; diff --git a/src/lang/Language.php b/src/lang/Language.php index 035726a16a..c14708a059 100644 --- a/src/lang/Language.php +++ b/src/lang/Language.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\lang; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_filter; use function array_map; use function count; diff --git a/src/network/mcpe/cache/StaticPacketCache.php b/src/network/mcpe/cache/StaticPacketCache.php index b4e1a71501..c3eca501d0 100644 --- a/src/network/mcpe/cache/StaticPacketCache.php +++ b/src/network/mcpe/cache/StaticPacketCache.php @@ -28,7 +28,7 @@ use pocketmine\network\mcpe\protocol\BiomeDefinitionListPacket; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\network\mcpe\protocol\types\CacheableNbt; use pocketmine\utils\SingletonTrait; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; class StaticPacketCache{ diff --git a/src/network/mcpe/convert/GlobalItemTypeDictionary.php b/src/network/mcpe/convert/GlobalItemTypeDictionary.php index 17fedd8401..5b4381657f 100644 --- a/src/network/mcpe/convert/GlobalItemTypeDictionary.php +++ b/src/network/mcpe/convert/GlobalItemTypeDictionary.php @@ -26,7 +26,7 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; final class GlobalItemTypeDictionary{ diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 20cea50cbc..523afe0260 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -31,7 +31,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalBlockStateHandlers; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; /** diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index e9bdc2f209..9b0ac23998 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -33,7 +33,7 @@ use pocketmine\Server; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Config; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function count; use function dirname; use function fclose; diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 1e7797201f..a3f4f1fcb2 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -40,7 +40,7 @@ use pocketmine\Server; use pocketmine\timings\TimingsHandler; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_diff_key; use function array_key_exists; use function array_keys; diff --git a/src/resourcepacks/ResourcePackManager.php b/src/resourcepacks/ResourcePackManager.php index e6b37543a5..d1482d8b6c 100644 --- a/src/resourcepacks/ResourcePackManager.php +++ b/src/resourcepacks/ResourcePackManager.php @@ -25,7 +25,7 @@ namespace pocketmine\resourcepacks; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\utils\Config; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_keys; use function copy; use function count; diff --git a/src/scheduler/DumpWorkerMemoryTask.php b/src/scheduler/DumpWorkerMemoryTask.php index 98b5e8909b..b1cf3840c7 100644 --- a/src/scheduler/DumpWorkerMemoryTask.php +++ b/src/scheduler/DumpWorkerMemoryTask.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\scheduler; use pocketmine\MemoryManager; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; /** * Task used to dump memory from AsyncWorkers diff --git a/src/utils/Config.php b/src/utils/Config.php index a705a04cfa..6fb9f3f4c1 100644 --- a/src/utils/Config.php +++ b/src/utils/Config.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\utils; use pocketmine\errorhandler\ErrorToExceptionHandler; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_change_key_case; use function array_fill_keys; use function array_keys; diff --git a/src/utils/Filesystem.php b/src/utils/Filesystem.php index 20ec8b3124..a4c1ff236f 100644 --- a/src/utils/Filesystem.php +++ b/src/utils/Filesystem.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\utils; use pocketmine\errorhandler\ErrorToExceptionHandler; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function copy; use function dirname; use function fclose; diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index 8373b0e8bb..c9170bd8dd 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -39,7 +39,7 @@ use pocketmine\utils\Internet; use pocketmine\utils\InternetException; use pocketmine\utils\Utils; use pocketmine\VersionInfo; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function fgets; use function sleep; use function strtolower; diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index 83f7aac981..1c26d494be 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -39,7 +39,7 @@ use pocketmine\world\format\io\WorldProviderManager; use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\generator\InvalidGeneratorOptionsException; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_keys; use function array_shift; use function assert; diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index 48f4d67b90..5f93f3a7b8 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -27,7 +27,7 @@ use pocketmine\utils\Filesystem; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\generator\normal\Normal; use pocketmine\world\WorldCreationOptions; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function basename; use function crc32; use function file_exists; diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 95d36417fd..36202fe9f9 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -33,7 +33,7 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index 850a679a1c..dab291b581 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -29,7 +29,7 @@ use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgradeSchemaUtils; use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\bedrock\item\upgrade\R12ItemIdToBlockIdMap; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; final class GlobalItemDataHandlers{ diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 5378be7f20..9cdeef0fc8 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -38,7 +38,7 @@ use pocketmine\world\generator\Flat; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\World; use pocketmine\world\WorldCreationOptions; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_get_contents; use function file_put_contents; use function strlen; diff --git a/src/world/format/io/data/JavaWorldData.php b/src/world/format/io/data/JavaWorldData.php index e57bbe9410..e53d857ad8 100644 --- a/src/world/format/io/data/JavaWorldData.php +++ b/src/world/format/io/data/JavaWorldData.php @@ -35,7 +35,7 @@ use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\World; use pocketmine\world\WorldCreationOptions; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function ceil; use function file_get_contents; use function file_put_contents; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 4d8794e31e..c57ebdb6be 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -50,7 +50,7 @@ use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; use pocketmine\world\WorldCreationOptions; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function array_map; use function array_values; use function chr; diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index c8c52321dd..967370c41f 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -32,7 +32,7 @@ use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\data\JavaWorldData; use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\WorldData; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function assert; use function file_exists; use function is_dir; diff --git a/src/world/format/io/region/WritableRegionWorldProvider.php b/src/world/format/io/region/WritableRegionWorldProvider.php index fd43994744..56cc2ff710 100644 --- a/src/world/format/io/region/WritableRegionWorldProvider.php +++ b/src/world/format/io/region/WritableRegionWorldProvider.php @@ -27,7 +27,7 @@ use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\data\JavaWorldData; use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\WorldCreationOptions; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function file_exists; use function mkdir; diff --git a/tests/phpunit/world/format/io/region/RegionLoaderTest.php b/tests/phpunit/world/format/io/region/RegionLoaderTest.php index abf73a0f57..e4db900727 100644 --- a/tests/phpunit/world/format/io/region/RegionLoaderTest.php +++ b/tests/phpunit/world/format/io/region/RegionLoaderTest.php @@ -25,7 +25,7 @@ namespace pocketmine\world\format\io\region; use PHPUnit\Framework\TestCase; use pocketmine\world\format\ChunkException; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function bin2hex; use function clearstatcache; use function file_exists; diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php index 59fab8026c..31a7467bf8 100644 --- a/tools/generate-item-upgrade-schema.php +++ b/tools/generate-item-upgrade-schema.php @@ -30,7 +30,7 @@ declare(strict_types=1); namespace pocketmine\tools\generate_item_upgrade_schema; use pocketmine\errorhandler\ErrorToExceptionHandler; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function count; use function dirname; use function file_get_contents; diff --git a/tools/generate-permission-doc.php b/tools/generate-permission-doc.php index 7d66740aa9..fd04f1a296 100644 --- a/tools/generate-permission-doc.php +++ b/tools/generate-permission-doc.php @@ -27,7 +27,7 @@ use pocketmine\permission\DefaultPermissions; use pocketmine\permission\PermissionManager; use pocketmine\utils\Utils; use pocketmine\VersionInfo; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function count; use function dirname; use function fclose; diff --git a/tools/simulate-chunk-selector.php b/tools/simulate-chunk-selector.php index e360a96e9d..81beb6bb3c 100644 --- a/tools/simulate-chunk-selector.php +++ b/tools/simulate-chunk-selector.php @@ -28,7 +28,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use pocketmine\world\format\Chunk; use pocketmine\world\World; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function assert; use function count; use function dirname; From 774df0fa4c98de327891998fb0c63a4e90413f5b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Oct 2022 17:06:09 +0100 Subject: [PATCH 0422/1858] DataPacketSendEvent: added setPackets() this is an implicit BC break, since plugins may assume that the packets in this array aren't going to change. However, in practice, it's not likely to cause any real issues. --- src/Server.php | 1 + src/event/server/DataPacketSendEvent.php | 7 +++++++ src/network/mcpe/NetworkSession.php | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Server.php b/src/Server.php index d8d22f5205..4cff7d3db6 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1359,6 +1359,7 @@ class Server{ return false; } $recipients = $ev->getTargets(); + $packets = $ev->getPackets(); /** @var PacketBroadcaster[] $broadcasters */ $broadcasters = []; diff --git a/src/event/server/DataPacketSendEvent.php b/src/event/server/DataPacketSendEvent.php index 8cbe47cf8b..e7345abd49 100644 --- a/src/event/server/DataPacketSendEvent.php +++ b/src/event/server/DataPacketSendEvent.php @@ -56,4 +56,11 @@ class DataPacketSendEvent extends ServerEvent implements Cancellable{ public function getPackets() : array{ return $this->packets; } + + /** + * @param ClientboundPacket[] $packets + */ + public function setPackets(array $packets) : void{ + $this->packets = $packets; + } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 3b868e0f5a..5b36c0b066 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -436,8 +436,11 @@ class NetworkSession{ if($ev->isCancelled()){ return false; } + $packets = $ev->getPackets(); - $this->addToSendBuffer($packet); + foreach($packets as $evPacket){ + $this->addToSendBuffer($evPacket); + } if($immediate){ $this->flushSendBuffer(true); } From e1b0e00c6f886adcdd6944fe1418deae1f89b694 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Oct 2022 17:10:33 +0100 Subject: [PATCH 0423/1858] DataPacketSendEvent: add array type validation this API is used directly by plugins, so anything goes. --- src/event/server/DataPacketSendEvent.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/event/server/DataPacketSendEvent.php b/src/event/server/DataPacketSendEvent.php index e7345abd49..147d99db34 100644 --- a/src/event/server/DataPacketSendEvent.php +++ b/src/event/server/DataPacketSendEvent.php @@ -27,6 +27,7 @@ use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\ClientboundPacket; +use pocketmine\utils\Utils; /** * Called when packets are sent to network sessions. @@ -61,6 +62,7 @@ class DataPacketSendEvent extends ServerEvent implements Cancellable{ * @param ClientboundPacket[] $packets */ public function setPackets(array $packets) : void{ + Utils::validateArrayValueType($packets, function(ClientboundPacket $_) : void{}); $this->packets = $packets; } } From b70f7afbd65f1586e529347310d80bc12c0ac6ec Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Oct 2022 21:07:07 +0100 Subject: [PATCH 0424/1858] Fix CS according to latest version of php-cs-fixer --- src/block/WaterCauldron.php | 1 - src/block/utils/WoodType.php | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index 8b5aa03302..88327a0101 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -92,7 +92,6 @@ final class WaterCauldron extends FillableCauldron{ $tile->setPotionItem(null); } - /** @return Color|null */ public function getCustomWaterColor() : ?Color{ return $this->customWaterColor; } /** @return $this */ diff --git a/src/block/utils/WoodType.php b/src/block/utils/WoodType.php index e31f3a6dae..5d3feaaecb 100644 --- a/src/block/utils/WoodType.php +++ b/src/block/utils/WoodType.php @@ -74,9 +74,7 @@ final class WoodType{ public function isFlammable() : bool{ return $this->flammable; } - /** @return string|null */ public function getStandardLogSuffix() : ?string{ return $this->standardLogSuffix; } - /** @return string|null */ public function getAllSidedLogSuffix() : ?string{ return $this->allSidedLogSuffix; } } From bd01a919e55e06b34016a2e061f8a6f0ff1cb38a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Oct 2022 16:57:10 +0100 Subject: [PATCH 0425/1858] Move command timings to Timings:: this avoids duplicate timings entries when command labels are changed and changed back, or if multiple command maps are in use. In addition, it also solves some PHPStan issues :) --- src/command/Command.php | 5 ----- src/command/FormattedCommandAlias.php | 6 ++++-- src/command/SimpleCommandMap.php | 6 ++++-- src/timings/Timings.php | 12 ++++++++++++ tests/phpstan/configs/actual-problems.neon | 20 -------------------- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/src/command/Command.php b/src/command/Command.php index 24180416b8..7ae9ae7c1b 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -31,8 +31,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\permission\PermissionManager; use pocketmine\Server; -use pocketmine\timings\Timings; -use pocketmine\timings\TimingsHandler; use pocketmine\utils\BroadcastLoggerForwarder; use pocketmine\utils\TextFormat; use function explode; @@ -60,8 +58,6 @@ abstract class Command{ private ?string $permission = null; private ?string $permissionMessage = null; - public ?TimingsHandler $timings = null; - /** * @param string[] $aliases */ @@ -136,7 +132,6 @@ abstract class Command{ public function setLabel(string $name) : bool{ $this->nextLabel = $name; if(!$this->isRegistered()){ - $this->timings = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Command: " . $name); $this->label = $name; return true; diff --git a/src/command/FormattedCommandAlias.php b/src/command/FormattedCommandAlias.php index 21d2c0e70c..b6b466451f 100644 --- a/src/command/FormattedCommandAlias.php +++ b/src/command/FormattedCommandAlias.php @@ -26,6 +26,7 @@ namespace pocketmine\command; use pocketmine\command\utils\CommandStringHelper; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; +use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\TextFormat; use function array_map; @@ -82,14 +83,15 @@ class FormattedCommandAlias extends Command{ } if(($target = $commandMap->getCommand($commandLabel)) !== null){ - $target->timings->startTiming(); + $timings = Timings::getCommandDispatchTimings($target->getLabel()); + $timings->startTiming(); try{ $target->execute($sender, $commandLabel, $commandArgs); }catch(InvalidCommandSyntaxException $e){ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::commands_generic_usage($target->getUsage()))); }finally{ - $target->timings->stopTiming(); + $timings->stopTiming(); } }else{ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::pocketmine_command_notFound($commandLabel, "/help")->prefix(TextFormat::RED))); diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 89824aa324..858cf45757 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -68,6 +68,7 @@ use pocketmine\command\utils\CommandStringHelper; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\Server; +use pocketmine\timings\Timings; use pocketmine\utils\TextFormat; use function array_shift; use function count; @@ -199,7 +200,8 @@ class SimpleCommandMap implements CommandMap{ $sentCommandLabel = array_shift($args); if($sentCommandLabel !== null && ($target = $this->getCommand($sentCommandLabel)) !== null){ - $target->timings->startTiming(); + $timings = Timings::getCommandDispatchTimings($target->getLabel()); + $timings->startTiming(); try{ if($target->testPermission($sender)){ @@ -208,7 +210,7 @@ class SimpleCommandMap implements CommandMap{ }catch(InvalidCommandSyntaxException $e){ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::commands_generic_usage($target->getUsage()))); }finally{ - $target->timings->stopTiming(); + $timings->stopTiming(); } return true; } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 41ecd3bb14..d4b4f75609 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -93,6 +93,12 @@ abstract class Timings{ /** @var TimingsHandler[] */ public static array $pluginTaskTimingMap = []; + /** + * @var TimingsHandler[] + * @phpstan-var array + */ + private static array $commandTimingMap = []; + public static TimingsHandler $broadcastPackets; public static function init() : void{ @@ -227,4 +233,10 @@ abstract class Timings{ return self::$packetSendTimingMap[$pid]; } + + public static function getCommandDispatchTimings(string $commandName) : TimingsHandler{ + self::init(); + + return self::$commandTimingMap[$commandName] ??= new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Command - " . $commandName); + } } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 6388854526..893e2c1b49 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -470,26 +470,6 @@ parameters: count: 1 path: ../../../src/command/Command.php - - - message: "#^Cannot call method startTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/FormattedCommandAlias.php - - - - message: "#^Cannot call method stopTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/FormattedCommandAlias.php - - - - message: "#^Cannot call method startTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/SimpleCommandMap.php - - - - message: "#^Cannot call method stopTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/SimpleCommandMap.php - - message: "#^Cannot call method addParticle\\(\\) on pocketmine\\\\world\\\\World\\|null\\.$#" count: 1 From d1d5020c5381f894ab132737efc9b141a484f517 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Tue, 18 Oct 2022 10:56:21 -0500 Subject: [PATCH 0426/1858] FallableTrait: add default implementation of tickFalling() to reduce Fallable pollution (#5350) this is only used by concrete powder currently, so it doesn't make much sense to reimplement it in every implementor of Fallable. --- src/block/Anvil.php | 4 ---- src/block/DragonEgg.php | 4 ---- src/block/Gravel.php | 4 ---- src/block/Sand.php | 4 ---- src/block/SnowLayer.php | 4 ---- src/block/utils/FallableTrait.php | 4 ++++ 6 files changed, 4 insertions(+), 20 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 0472e4cc79..d9c407409e 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -95,8 +95,4 @@ class Anvil extends Transparent implements Fallable{ } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - - public function tickFalling() : ?Block{ - return null; - } } diff --git a/src/block/DragonEgg.php b/src/block/DragonEgg.php index 27a30a1c5f..98809152d6 100644 --- a/src/block/DragonEgg.php +++ b/src/block/DragonEgg.php @@ -44,10 +44,6 @@ class DragonEgg extends Transparent implements Fallable{ return 1; } - public function tickFalling() : ?Block{ - return null; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $this->teleport(); return true; diff --git a/src/block/Gravel.php b/src/block/Gravel.php index 856449ce04..4bff2208ff 100644 --- a/src/block/Gravel.php +++ b/src/block/Gravel.php @@ -45,8 +45,4 @@ class Gravel extends Opaque implements Fallable{ public function isAffectedBySilkTouch() : bool{ return true; } - - public function tickFalling() : ?Block{ - return null; - } } diff --git a/src/block/Sand.php b/src/block/Sand.php index 17fc80a204..df56b73484 100644 --- a/src/block/Sand.php +++ b/src/block/Sand.php @@ -28,8 +28,4 @@ use pocketmine\block\utils\FallableTrait; class Sand extends Opaque implements Fallable{ use FallableTrait; - - public function tickFalling() : ?Block{ - return null; - } } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 84620ebcae..e3628f98ac 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -116,10 +116,6 @@ class SnowLayer extends Flowable implements Fallable{ } } - public function tickFalling() : ?Block{ - return null; - } - public function getDropsForCompatibleTool(Item $item) : array{ return [ VanillaItems::SNOWBALL()->setCount(max(1, (int) floor($this->layers / 2))) diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index 1ed348dcaf..8e878b1723 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -54,4 +54,8 @@ trait FallableTrait{ $fall->spawnToAll(); } } + + public function tickFalling() : ?Block{ + return null; + } } From 68e862b6fa26fec380ffc7ad6d9f9f2c4c7e561d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Nov 2022 20:53:20 +0000 Subject: [PATCH 0427/1858] Scrub PHPStan baselines (next-major) --- phpstan.neon.dist | 1 - tests/phpstan/configs/actual-problems.neon | 2 +- tests/phpstan/configs/gc-hacks.neon | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 tests/phpstan/configs/gc-hacks.neon diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 6fc15b07a9..4f24a676b1 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,7 +1,6 @@ includes: - tests/phpstan/analyse-for-current-php-version.neon.php - tests/phpstan/configs/actual-problems.neon - - tests/phpstan/configs/gc-hacks.neon - tests/phpstan/configs/impossible-generics.neon - tests/phpstan/configs/php-bugs.neon - tests/phpstan/configs/phpstan-bugs.neon diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 1f334cecfa..3d1976d7a9 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -582,7 +582,7 @@ parameters: - message: "#^Cannot cast mixed to int\\.$#" - count: 3 + count: 2 path: ../../../src/item/Item.php - diff --git a/tests/phpstan/configs/gc-hacks.neon b/tests/phpstan/configs/gc-hacks.neon deleted file mode 100644 index 846a8dfe4f..0000000000 --- a/tests/phpstan/configs/gc-hacks.neon +++ /dev/null @@ -1,3 +0,0 @@ -parameters: - ignoreErrors: [] - From 1a5cc8212c8aa5643df3449468f239ac81898f22 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Nov 2022 14:23:17 +0000 Subject: [PATCH 0428/1858] World: fixed spawning in the void when the spawn terrain is higher than y=70 on default worlds fixes #5390 --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index 1f88256c3b..0839dbe048 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2794,8 +2794,8 @@ class World implements ChunkManager{ if($this->getBlockAt($x, $y, $z)->isFullCube()){ if($wasAir){ $y++; - break; } + break; }else{ $wasAir = true; } From 90305a0b9278f3d661c243c8b27d9748c567ae57 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 13 Nov 2022 14:47:37 +0000 Subject: [PATCH 0429/1858] Release 5.0.0-ALPHA5 --- changelogs/5.0-alpha.md | 29 +++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 6eedae0ad8..f408d106b3 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -618,3 +618,32 @@ Released 24th September 2022. ### Effects - Updated damage modifier amounts for Instant Damage to be more in line with vanilla. - Updated duration modifier amounts for Regeneration to be more like vanilla. + +# 5.0.0-ALPHA5 +Released 13th November 2022. + +**This release includes changes from [4.11.0-BETA2](https://github.com/pmmp/PocketMine-MP/releases/4.11.0-BETA2) and earlier, which may not be listed here.** + +## General +- Added support for Minecraft: Bedrock 1.19.40. +- Removed support for earlier versions. + +## API +### `pocketmine\block` +- `FallableTrait` now includes a default implementation of `tickFalling()`. + +### `pocketmine\event` +- The following API methods have been removed: + - `PlayerCommandPreprocessEvent` +- The following API methods have been added: + - `public DataPacketSendEvent->setPackets(list $packets) : void` + +## Gameplay +### General +- Fixed dyeing leather armour in cauldrons. + +### Blocks +- Copper blocks now play the correct scrape sound when using an axe on them. + +## Internals +- Moved command timings to `Timings`. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b4d3c92b5b..1b2165612e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA5"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From b3b8516661424ff904b45a1e4ee35c8963d9b045 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 13 Nov 2022 14:47:41 +0000 Subject: [PATCH 0430/1858] 5.0.0-ALPHA6 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1b2165612e..6955b826b3 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA5"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA6"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 34839da757dc2657dfe3576d0c4be8c67f943669 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Tue, 15 Nov 2022 15:50:05 +0100 Subject: [PATCH 0431/1858] Fix missing sound when a projectile strikes an amethyst block (#5382) closes #5358 --- src/block/VanillaBlocks.php | 11 ++++++- src/world/sound/AmethystBlockChimeSound.php | 35 +++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/world/sound/AmethystBlockChimeSound.php diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 4b1c127e1a..585bf759dc 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -55,9 +55,13 @@ use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WoodType; +use pocketmine\entity\projectile\Projectile; use pocketmine\item\Item; use pocketmine\item\ToolTier; +use pocketmine\math\RayTraceResult; use pocketmine\utils\CloningRegistryTrait; +use pocketmine\world\sound\AmethystBlockChimeSound; +use pocketmine\world\sound\BlockPunchSound; use function mb_strtolower; /** @@ -1466,7 +1470,12 @@ final class VanillaBlocks{ private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new Opaque(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD())))); + self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD()))) extends Opaque{ + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + $this->position->getWorld()->addSound($this->position, new AmethystBlockChimeSound()); + $this->position->getWorld()->addSound($this->position, new BlockPunchSound($this)); + } + }); self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD())))); self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)))); diff --git a/src/world/sound/AmethystBlockChimeSound.php b/src/world/sound/AmethystBlockChimeSound.php new file mode 100644 index 0000000000..64efbb8ced --- /dev/null +++ b/src/world/sound/AmethystBlockChimeSound.php @@ -0,0 +1,35 @@ + Date: Tue, 15 Nov 2022 18:29:42 +0300 Subject: [PATCH 0432/1858] Implement Weeping & Twisting vines (#5396) --- src/block/BlockTypeIds.php | 4 +- src/block/NetherVines.php | 196 ++++++++++++++++++ src/block/VanillaBlocks.php | 6 + .../convert/BlockObjectToStateSerializer.php | 9 + .../BlockStateToObjectDeserializer.php | 8 + src/item/StringToItemParser.php | 2 + .../block_factory_consistency_check.json | 2 +- 7 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 src/block/NetherVines.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 487700ac0a..3fdb447284 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -704,8 +704,10 @@ final class BlockTypeIds{ public const MANGROVE_ROOTS = 10677; public const MUDDY_MANGROVE_ROOTS = 10678; public const FROGLIGHT = 10679; + public const TWISTING_VINES = 10680; + public const WEEPING_VINES = 10681; - public const FIRST_UNUSED_BLOCK_ID = 10680; + public const FIRST_UNUSED_BLOCK_ID = 10682; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php new file mode 100644 index 0000000000..5b7a46d76f --- /dev/null +++ b/src/block/NetherVines.php @@ -0,0 +1,196 @@ +growthFace = $growthFace; + parent::__construct($idInfo, $name, $typeInfo); + } + + public function getRequiredStateDataBits() : int{ + return 5; + } + + public function describeState(RuntimeDataWriter|RuntimeDataReader $w) : void{ + $w->boundedInt(5, 0, self::MAX_AGE, $this->age); + } + + public function getAge() : int{ + return $this->age; + } + + /** @return $this */ + public function setAge(int $age) : self{ + if($age < 0 || $age > self::MAX_AGE){ + throw new \InvalidArgumentException("Age must be in range 0-" . self::MAX_AGE); + } + + $this->age = $age; + return $this; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + + public function ticksRandomly() : bool{ + return true; + } + + public function canClimb() : bool{ + return true; + } + + private function getSupportFace() : int{ + return Facing::opposite($this->growthFace); + } + + private function canBeSupportedBy(Block $block) : bool{ + return $block->getSupportType($this->getSupportFace())->hasCenterSupport() || $block->isSameType($this); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedBy($this->getSide($this->getSupportFace()))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + /** + * Returns the block at the end of the vine structure furthest from the supporting block. + */ + private function seekToTip() : NetherVines{ + $top = $this; + while(($next = $top->getSide($this->growthFace)) instanceof NetherVines && $next->isSameType($this)){ + $top = $next; + } + return $top; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedBy($blockReplace->getSide($this->getSupportFace()))){ + return false; + } + $this->age = mt_rand(0, self::MAX_AGE - 1); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer){ + if($this->grow($player, mt_rand(1, 5))){ + $item->pop(); + } + return true; + } + return false; + } + + public function onRandomTick() : void{ + if(mt_rand(1, 10) === 1 && $this->age < self::MAX_AGE){ + if($this->getSide($this->growthFace)->canBeReplaced()){ + $this->grow(null); + } + } + } + + private function grow(?Player $player, int $growthAmount = 1) : bool{ + $top = $this->seekToTip(); + $age = $top->getAge(); + $pos = $top->getPosition(); + $world = $pos->getWorld(); + $changedBlocks = 0; + + $tx = new BlockTransaction($world); + + for($i = 1; $i <= $growthAmount; $i++){ + $growthPos = $pos->getSide($this->growthFace, $i); + if(!$world->isInWorld($growthPos->getFloorX(), $growthPos->getFloorY(), $growthPos->getFloorZ()) || !$world->getBlock($growthPos)->canBeReplaced()){ + break; + } + $tx->addBlock($growthPos, (clone $top)->setAge(min(++$age, self::MAX_AGE))); + $changedBlocks++; + } + + if($changedBlocks > 0){ + $ev = new StructureGrowEvent($top, $tx, $player); + $ev->call(); + + if($ev->isCancelled()){ + return false; + } + + return $tx->apply(); + } + + return false; + } + + public function hasEntityCollision() : bool{ + return true; + } + + public function onEntityInside(Entity $entity) : bool{ + $entity->resetFallDistance(); + return false; + } + + protected function recalculateCollisionBoxes() : array{ + return []; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + if(($item->getBlockToolType() & BlockToolType::SHEARS) !== 0 || mt_rand(1, 3) === 1){ + return [$this->asItem()]; + } + return []; + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 585bf759dc..bfce7c41b8 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -58,6 +58,7 @@ use pocketmine\block\utils\WoodType; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Item; use pocketmine\item\ToolTier; +use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; use pocketmine\utils\CloningRegistryTrait; use pocketmine\world\sound\AmethystBlockChimeSound; @@ -695,6 +696,7 @@ use function mb_strtolower; * @method static Tripwire TRIPWIRE() * @method static TripwireHook TRIPWIRE_HOOK() * @method static Opaque TUFF() + * @method static NetherVines TWISTING_VINES() * @method static UnderwaterTorch UNDERWATER_TORCH() * @method static Vine VINES() * @method static WallBanner WALL_BANNER() @@ -715,6 +717,7 @@ use function mb_strtolower; * @method static Opaque WARPED_WART_BLOCK() * @method static Water WATER() * @method static WaterCauldron WATER_CAULDRON() + * @method static NetherVines WEEPING_VINES() * @method static WeightedPressurePlateHeavy WEIGHTED_PRESSURE_PLATE_HEAVY() * @method static WeightedPressurePlateLight WEIGHTED_PRESSURE_PLATE_LIGHT() * @method static Wheat WHEAT() @@ -1466,6 +1469,9 @@ final class VanillaBlocks{ self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND(), 6000.0))) extends Opaque{ public function getLightLevel() : int{ return 10;} }); + + self::register("twisting_vines", new NetherVines(new BID(Ids::TWISTING_VINES), "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); + self::register("weeping_vines", new NetherVines(new BID(Ids::WEEPING_VINES), "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); } private static function registerBlocksR17() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 23a11412d2..07e7ac4fb7 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -93,6 +93,7 @@ use pocketmine\block\LitPumpkin; use pocketmine\block\Loom; use pocketmine\block\MelonStem; use pocketmine\block\NetherPortal; +use pocketmine\block\NetherVines; use pocketmine\block\NetherWartPlant; use pocketmine\block\Potato; use pocketmine\block\PoweredRail; @@ -1389,6 +1390,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isPowered()) ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::TWISTING_VINES(), function(NetherVines $block) : Writer{ + return Writer::create(Ids::TWISTING_VINES) + ->writeInt(StateNames::TWISTING_VINES_AGE, $block->getAge()); + }); $this->map(Blocks::UNDERWATER_TORCH(), function(UnderwaterTorch $block) : Writer{ return Writer::create(Ids::UNDERWATER_TORCH) ->writeTorchFacing($block->getFacing()); @@ -1425,6 +1430,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); $this->map(Blocks::WARPED_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WARPED_WALL_SIGN))); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); + $this->map(Blocks::WEEPING_VINES(), function(NetherVines $block) : Writer{ + return Writer::create(Ids::WEEPING_VINES) + ->writeInt(StateNames::WEEPING_VINES_AGE, $block->getAge()); + }); $this->map(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), function(WeightedPressurePlateHeavy $block) : Writer{ return Writer::create(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE) ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 7677d7cf62..b05effd4ab 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -1257,6 +1257,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readLegacyHorizontalFacing()) ->setPowered($in->readBool(StateNames::POWERED_BIT)); }); + $this->map(Ids::TWISTING_VINES, function(Reader $in) : Block{ + return Blocks::TWISTING_VINES() + ->setAge($in->readBoundedInt(StateNames::TWISTING_VINES_AGE, 0, 25)); + }); $this->map(Ids::UNDERWATER_TORCH, function(Reader $in) : Block{ return Blocks::UNDERWATER_TORCH() ->setFacing($in->readTorchFacing()); @@ -1315,6 +1319,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); + $this->map(Ids::WEEPING_VINES, function(Reader $in) : Block{ + return Blocks::WEEPING_VINES() + ->setAge($in->readBoundedInt(StateNames::WEEPING_VINES_AGE, 0, 25)); + }); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c3dfa6ecd2..6dbe55b79e 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1054,6 +1054,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("trunk", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("tuff", fn() => Blocks::TUFF()); + $result->registerBlock("twisting_vines", fn() => Blocks::TWISTING_VINES()); $result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH()); $result->registerBlock("undyed_shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("unlit_redstone_torch", fn() => Blocks::REDSTONE_TORCH()); @@ -1084,6 +1085,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("water_lily", fn() => Blocks::LILY_PAD()); $result->registerBlock("waterlily", fn() => Blocks::LILY_PAD()); $result->registerBlock("web", fn() => Blocks::COBWEB()); + $result->registerBlock("weeping_vines", fn() => Blocks::WEEPING_VINES()); $result->registerBlock("weighted_pressure_plate_heavy", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY()); $result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT()); $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index acb664eb81..0ff09efa1c 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 1bc5e225abf9194b4d4e11bcd224f0590210175a Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 21 Nov 2022 17:38:18 +0300 Subject: [PATCH 0433/1858] Candle: Fix support type (#5422) --- src/block/Candle.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/block/Candle.php b/src/block/Candle.php index bda600edcd..9afc4c6deb 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\CandleTrait; +use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -94,6 +95,10 @@ class Candle extends Transparent{ ]; } + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } + protected function getCandleIfCompatibleType(Block $block) : ?Candle{ return $block instanceof Candle && $block->isSameType($this) ? $block : null; } From 23ae0c7cac79d29d5dc23030140dcc32b7d3c6cf Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Wed, 23 Nov 2022 13:32:15 +0100 Subject: [PATCH 0434/1858] Add Furnace->getType() : FurnaceType method (#5425) closes #4761 this targets next-major due to BC-breaking changes to Furnace::__construct() --- src/block/Furnace.php | 12 ++++++++++++ src/block/VanillaBlocks.php | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 8b86f3af63..2147169f2a 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -26,6 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; +use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -37,8 +38,15 @@ class Furnace extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; + protected FurnaceType $furnaceType; + protected bool $lit = false; + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, FurnaceType $furnaceType){ + $this->furnaceType = $furnaceType; + parent::__construct($idInfo, $name, $typeInfo); + } + public function getRequiredStateDataBits() : int{ return 3; } protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ @@ -46,6 +54,10 @@ class Furnace extends Opaque{ $w->bool($this->lit); } + public function getFurnaceType() : FurnaceType{ + return $this->furnaceType; + } + public function getLightLevel() : int{ return $this->lit ? 13 : 0; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index bfce7c41b8..a4e70031b0 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -55,6 +55,7 @@ use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WoodType; +use pocketmine\crafting\FurnaceType; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Item; use pocketmine\item\ToolTier; @@ -846,9 +847,9 @@ final class VanillaBlocks{ self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", $flowerTypeInfo)); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::FURNACE())); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::BLAST_FURNACE())); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::SMOKER())); $glassBreakInfo = new Info(new BreakInfo(0.3)); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); From 3b6ff3c42b46a001020f0f61a09ac18e45475730 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Nov 2022 14:03:35 +0000 Subject: [PATCH 0435/1858] Apply union types in some places (BC breaks) --- src/block/utils/SignText.php | 5 +---- src/event/HandlerList.php | 7 ++----- src/event/HandlerListManager.php | 4 +--- src/permission/Permissible.php | 14 ++++--------- src/permission/PermissibleDelegateTrait.php | 22 +++++---------------- src/permission/PermissibleInternal.php | 14 ++++--------- src/permission/PermissionAttachment.php | 10 ++-------- src/permission/PermissionManager.php | 5 +---- src/permission/PermissionParser.php | 4 +--- src/plugin/PluginDescription.php | 2 +- src/thread/ThreadManager.php | 18 ++++------------- src/utils/Internet.php | 6 +++--- src/utils/Process.php | 2 +- 13 files changed, 30 insertions(+), 83 deletions(-) diff --git a/src/block/utils/SignText.php b/src/block/utils/SignText.php index 27e8b5c5e4..1ea7de3d6a 100644 --- a/src/block/utils/SignText.php +++ b/src/block/utils/SignText.php @@ -87,10 +87,7 @@ class SignText{ return $this->lines; } - /** - * @param int|string $index - */ - private function checkLineIndex($index) : void{ + private function checkLineIndex(int|string $index) : void{ if(!is_int($index)){ throw new \InvalidArgumentException("Index must be an integer"); } diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 7d93c2ebe7..57388cef59 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -57,10 +57,7 @@ class HandlerList{ } } - /** - * @param RegisteredListener|Listener|Plugin $object - */ - public function unregister($object) : void{ + public function unregister(RegisteredListener|Plugin|Listener $object) : void{ if($object instanceof Plugin || $object instanceof Listener){ foreach($this->handlerSlots as $priority => $list){ foreach($list as $hash => $listener){ @@ -71,7 +68,7 @@ class HandlerList{ } } } - }elseif($object instanceof RegisteredListener){ + }else{ if(isset($this->handlerSlots[$object->getPriority()][spl_object_id($object)])){ unset($this->handlerSlots[$object->getPriority()][spl_object_id($object)]); } diff --git a/src/event/HandlerListManager.php b/src/event/HandlerListManager.php index ecff0b85b3..ab94674cfa 100644 --- a/src/event/HandlerListManager.php +++ b/src/event/HandlerListManager.php @@ -40,10 +40,8 @@ class HandlerListManager{ /** * Unregisters all the listeners * If a Plugin or Listener is passed, all the listeners with that object will be removed - * - * @param Plugin|Listener|RegisteredListener|null $object */ - public function unregisterAll($object = null) : void{ + public function unregisterAll(RegisteredListener|Plugin|Listener|null $object = null) : void{ if($object instanceof Listener || $object instanceof Plugin || $object instanceof RegisteredListener){ foreach($this->allLists as $h){ $h->unregister($object); diff --git a/src/permission/Permissible.php b/src/permission/Permissible.php index 2047dcec7d..b3527e1c40 100644 --- a/src/permission/Permissible.php +++ b/src/permission/Permissible.php @@ -35,32 +35,26 @@ interface Permissible{ * * @internal * @see Permissible::addAttachment() for normal permission assignments - * @param Permission|string $name */ - public function setBasePermission($name, bool $grant) : void; + public function setBasePermission(Permission|string $name, bool $grant) : void; /** * Unsets a baseline permission previously set. If it wasn't already set, this will have no effect. * Note that this might have different results than setting the permission to false. * * @internal - * @param Permission|string $name */ - public function unsetBasePermission($name) : void; + public function unsetBasePermission(Permission|string $name) : void; /** * Checks if this instance has a permission overridden - * - * @param string|Permission $name */ - public function isPermissionSet($name) : bool; + public function isPermissionSet(Permission|string $name) : bool; /** * Returns the permission value if overridden, or the default value if not - * - * @param string|Permission $name */ - public function hasPermission($name) : bool; + public function hasPermission(Permission|string $name) : bool; public function addAttachment(Plugin $plugin, ?string $name = null, ?bool $value = null) : PermissionAttachment; diff --git a/src/permission/PermissibleDelegateTrait.php b/src/permission/PermissibleDelegateTrait.php index fa051ecd8c..22f6508484 100644 --- a/src/permission/PermissibleDelegateTrait.php +++ b/src/permission/PermissibleDelegateTrait.php @@ -31,31 +31,19 @@ trait PermissibleDelegateTrait{ /** @var Permissible */ private $perm; - /** - * @param Permission|string $name - */ - public function setBasePermission($name, bool $value) : void{ - $this->perm->setBasePermission($name, $value); + public function setBasePermission(Permission|string $name, bool $grant) : void{ + $this->perm->setBasePermission($name, $grant); } - /** - * @param Permission|string $name - */ - public function unsetBasePermission($name) : void{ + public function unsetBasePermission(Permission|string $name) : void{ $this->perm->unsetBasePermission($name); } - /** - * @param Permission|string $name - */ - public function isPermissionSet($name) : bool{ + public function isPermissionSet(Permission|string $name) : bool{ return $this->perm->isPermissionSet($name); } - /** - * @param Permission|string $name - */ - public function hasPermission($name) : bool{ + public function hasPermission(Permission|string $name) : bool{ return $this->perm->hasPermission($name); } diff --git a/src/permission/PermissibleInternal.php b/src/permission/PermissibleInternal.php index 2401869a96..49c34b49a4 100644 --- a/src/permission/PermissibleInternal.php +++ b/src/permission/PermissibleInternal.php @@ -69,7 +69,7 @@ class PermissibleInternal implements Permissible{ $this->recalculatePermissions(); } - public function setBasePermission($name, bool $grant) : void{ + public function setBasePermission(Permission|string $name, bool $grant) : void{ if($name instanceof Permission){ $name = $name->getName(); } @@ -77,22 +77,16 @@ class PermissibleInternal implements Permissible{ $this->recalculatePermissions(); } - public function unsetBasePermission($name) : void{ + public function unsetBasePermission(Permission|string $name) : void{ unset($this->rootPermissions[$name instanceof Permission ? $name->getName() : $name]); $this->recalculatePermissions(); } - /** - * @param Permission|string $name - */ - public function isPermissionSet($name) : bool{ + public function isPermissionSet(Permission|string $name) : bool{ return isset($this->permissions[$name instanceof Permission ? $name->getName() : $name]); } - /** - * @param Permission|string $name - */ - public function hasPermission($name) : bool{ + public function hasPermission(Permission|string $name) : bool{ if($name instanceof Permission){ $name = $name->getName(); } diff --git a/src/permission/PermissionAttachment.php b/src/permission/PermissionAttachment.php index 68f5440699..b01fba3070 100644 --- a/src/permission/PermissionAttachment.php +++ b/src/permission/PermissionAttachment.php @@ -96,10 +96,7 @@ class PermissionAttachment{ $this->recalculatePermissibles(); } - /** - * @param string|Permission $name - */ - public function setPermission($name, bool $value) : void{ + public function setPermission(Permission|string $name, bool $value) : void{ $name = $name instanceof Permission ? $name->getName() : $name; if(isset($this->permissions[$name])){ if($this->permissions[$name] === $value){ @@ -120,10 +117,7 @@ class PermissionAttachment{ $this->recalculatePermissibles(); } - /** - * @param string|Permission $name - */ - public function unsetPermission($name) : void{ + public function unsetPermission(Permission|string $name) : void{ $name = $name instanceof Permission ? $name->getName() : $name; if(isset($this->permissions[$name])){ unset($this->permissions[$name]); diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index cbb917781a..b7e622934f 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -56,10 +56,7 @@ class PermissionManager{ return false; } - /** - * @param string|Permission $permission - */ - public function removePermission($permission) : void{ + public function removePermission(Permission|string $permission) : void{ if($permission instanceof Permission){ unset($this->permissions[$permission->getName()]); }else{ diff --git a/src/permission/PermissionParser.php b/src/permission/PermissionParser.php index d498b9315c..0c08702c8f 100644 --- a/src/permission/PermissionParser.php +++ b/src/permission/PermissionParser.php @@ -54,11 +54,9 @@ class PermissionParser{ ]; /** - * @param bool|string $value - * * @throws PermissionParserException */ - public static function defaultFromString($value) : string{ + public static function defaultFromString(bool|string $value) : string{ if(is_bool($value)){ if($value){ return "true"; diff --git a/src/plugin/PluginDescription.php b/src/plugin/PluginDescription.php index 7574d7297f..522da2a78b 100644 --- a/src/plugin/PluginDescription.php +++ b/src/plugin/PluginDescription.php @@ -85,7 +85,7 @@ class PluginDescription{ /** * @param string|mixed[] $yamlString */ - public function __construct($yamlString){ + public function __construct(array|string $yamlString){ if(is_string($yamlString)){ $map = yaml_parse($yamlString); if($map === false){ diff --git a/src/thread/ThreadManager.php b/src/thread/ThreadManager.php index b22a424e75..f383b2c491 100644 --- a/src/thread/ThreadManager.php +++ b/src/thread/ThreadManager.php @@ -40,22 +40,12 @@ class ThreadManager extends \Volatile{ return self::$instance; } - /** - * @param Worker|Thread $thread - */ - public function add($thread) : void{ - if($thread instanceof Thread || $thread instanceof Worker){ - $this[spl_object_id($thread)] = $thread; - } + public function add(Worker|Thread $thread) : void{ + $this[spl_object_id($thread)] = $thread; } - /** - * @param Worker|Thread $thread - */ - public function remove($thread) : void{ - if($thread instanceof Thread || $thread instanceof Worker){ - unset($this[spl_object_id($thread)]); - } + public function remove(Worker|Thread $thread) : void{ + unset($this[spl_object_id($thread)]); } /** diff --git a/src/utils/Internet.php b/src/utils/Internet.php index 7161cf4534..8744ebd96f 100644 --- a/src/utils/Internet.php +++ b/src/utils/Internet.php @@ -169,7 +169,7 @@ class Internet{ * @phpstan-param TErrorVar $err * @phpstan-param-out TErrorVar|string $err */ - public static function postURL(string $page, $args, int $timeout = 10, array $extraHeaders = [], &$err = null) : ?InternetRequestResult{ + public static function postURL(string $page, array|string $args, int $timeout = 10, array $extraHeaders = [], &$err = null) : ?InternetRequestResult{ try{ return self::simpleCurl($page, $timeout, $extraHeaders, [ CURLOPT_POST => 1, @@ -185,7 +185,7 @@ class Internet{ * General cURL shorthand function. * NOTE: This is a blocking operation and can take a significant amount of time. It is inadvisable to use this method on the main thread. * - * @param float|int $timeout The maximum connect timeout and timeout in seconds, correct to ms. + * @param float $timeout The maximum connect timeout and timeout in seconds, correct to ms. * @param string[] $extraHeaders extra headers to send as a plain string array * @param array $extraOpts extra CURLOPT_* to set as an [opt => value] map * @param \Closure|null $onSuccess function to be called if there is no error. Accepts a resource argument as the cURL handle. @@ -195,7 +195,7 @@ class Internet{ * * @throws InternetException if a cURL error occurs */ - public static function simpleCurl(string $page, $timeout = 10, array $extraHeaders = [], array $extraOpts = [], ?\Closure $onSuccess = null) : InternetRequestResult{ + public static function simpleCurl(string $page, float $timeout = 10, array $extraHeaders = [], array $extraOpts = [], ?\Closure $onSuccess = null) : InternetRequestResult{ if(!self::$online){ throw new InternetException("Cannot execute web request while offline"); } diff --git a/src/utils/Process.php b/src/utils/Process.php index bdc264133e..d0d38ec009 100644 --- a/src/utils/Process.php +++ b/src/utils/Process.php @@ -157,7 +157,7 @@ final class Process{ * * @return int process exit code */ - public static function execute(string $command, string &$stdout = null, string &$stderr = null) : int{ + public static function execute(string $command, ?string &$stdout = null, ?string &$stderr = null) : int{ $process = proc_open($command, [ ["pipe", "r"], ["pipe", "w"], From fdb07cdbcd35225b0c062fc0109bd74e43b74962 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Nov 2022 14:21:38 +0000 Subject: [PATCH 0436/1858] Added more missing native types according to 8.0 standards --- src/MemoryManager.php | 9 ++---- src/Server.php | 7 ++--- src/ServerConfigGroup.php | 7 +---- src/event/player/PlayerCreationEvent.php | 12 +++---- src/player/Player.php | 5 +-- src/promise/PromiseResolver.php | 3 +- src/scheduler/AsyncTask.php | 11 ++----- src/scheduler/AsyncWorker.php | 8 ++--- src/utils/Config.php | 40 +++++------------------- src/utils/Filesystem.php | 7 +---- src/utils/Internet.php | 4 +-- src/utils/MainLogger.php | 8 +---- src/utils/Timezone.php | 9 ++---- src/utils/Utils.php | 9 ++---- 14 files changed, 31 insertions(+), 108 deletions(-) diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 70e5d8a77e..9b35c952fe 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -285,10 +285,8 @@ class MemoryManager{ /** * Static memory dumper accessible from any thread. - * - * @param mixed $startingObject */ - public static function dumpMemory($startingObject, string $outputFolder, int $maxNesting, int $maxStringSize, \Logger $logger) : void{ + public static function dumpMemory(mixed $startingObject, string $outputFolder, int $maxNesting, int $maxStringSize, \Logger $logger) : void{ $hardLimit = Utils::assumeNotFalse(ini_get('memory_limit'), "memory_limit INI directive should always exist"); ini_set('memory_limit', '-1'); gc_disable(); @@ -479,7 +477,6 @@ class MemoryManager{ } /** - * @param mixed $from * @param object[] $objects reference parameter * @param int[] $refCounts reference parameter * @@ -487,10 +484,8 @@ class MemoryManager{ * @phpstan-param array $refCounts * @phpstan-param-out array $objects * @phpstan-param-out array $refCounts - * - * @return mixed */ - private static function continueDump($from, array &$objects, array &$refCounts, int $recursion, int $maxNesting, int $maxStringSize){ + private static function continueDump(mixed $from, array &$objects, array &$refCounts, int $recursion, int $maxNesting, int $maxStringSize) : mixed{ if($maxNesting <= 0){ return "(error) NESTING LIMIT REACHED"; } diff --git a/src/Server.php b/src/Server.php index e0eb84c1f0..4c4f25348d 100644 --- a/src/Server.php +++ b/src/Server.php @@ -470,10 +470,7 @@ class Server{ return $this->configGroup->getPropertyBool("player.save-player-data", true); } - /** - * @return OfflinePlayer|Player - */ - public function getOfflinePlayer(string $name){ + public function getOfflinePlayer(string $name) : Player|OfflinePlayer|null{ $name = strtolower($name); $result = $this->getPlayerExact($name); @@ -1538,7 +1535,7 @@ class Server{ * @param mixed[][]|null $trace * @phpstan-param list>|null $trace */ - public function exceptionHandler(\Throwable $e, $trace = null) : void{ + public function exceptionHandler(\Throwable $e, ?array $trace = null) : void{ while(@ob_end_flush()){} global $lastError; diff --git a/src/ServerConfigGroup.php b/src/ServerConfigGroup.php index 0a3b09c873..b4a3a90871 100644 --- a/src/ServerConfigGroup.php +++ b/src/ServerConfigGroup.php @@ -43,12 +43,7 @@ final class ServerConfigGroup{ private Config $serverProperties ){} - /** - * @param mixed $defaultValue - * - * @return mixed - */ - public function getProperty(string $variable, $defaultValue = null){ + public function getProperty(string $variable, mixed $defaultValue = null) : mixed{ if(!array_key_exists($variable, $this->propertyCache)){ $v = getopt("", ["$variable::"]); if(isset($v[$variable])){ diff --git a/src/event/player/PlayerCreationEvent.php b/src/event/player/PlayerCreationEvent.php index 7e7e2cfaa8..7f76f5f529 100644 --- a/src/event/player/PlayerCreationEvent.php +++ b/src/event/player/PlayerCreationEvent.php @@ -54,18 +54,16 @@ class PlayerCreationEvent extends Event{ } /** - * @return string * @phpstan-return class-string */ - public function getBaseClass(){ + public function getBaseClass() : string{ return $this->baseClass; } /** - * @param string $class * @phpstan-param class-string $class */ - public function setBaseClass($class) : void{ + public function setBaseClass(string $class) : void{ if(!is_a($class, $this->baseClass, true)){ throw new \RuntimeException("Base class $class must extend " . $this->baseClass); } @@ -74,18 +72,16 @@ class PlayerCreationEvent extends Event{ } /** - * @return string * @phpstan-return class-string */ - public function getPlayerClass(){ + public function getPlayerClass() : string{ return $this->playerClass; } /** - * @param string $class * @phpstan-param class-string $class */ - public function setPlayerClass($class) : void{ + public function setPlayerClass(string $class) : void{ Utils::testValidInstance($class, $this->baseClass); $this->playerClass = $class; } diff --git a/src/player/Player.php b/src/player/Player.php index 6c045836f5..4f99c93a47 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2054,10 +2054,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } } - /** - * @param mixed $responseData - */ - public function onFormSubmit(int $formId, $responseData) : bool{ + public function onFormSubmit(int $formId, mixed $responseData) : bool{ if(!isset($this->forms[$formId])){ $this->logger->debug("Got unexpected response for form $formId"); return false; diff --git a/src/promise/PromiseResolver.php b/src/promise/PromiseResolver.php index 30a60e0cd6..97b181d0b2 100644 --- a/src/promise/PromiseResolver.php +++ b/src/promise/PromiseResolver.php @@ -38,10 +38,9 @@ final class PromiseResolver{ } /** - * @param mixed $value * @phpstan-param TValue $value */ - public function resolve($value) : void{ + public function resolve(mixed $value) : void{ if($this->shared->resolved){ throw new \LogicException("Promise has already been resolved/rejected"); } diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 65591d4d9b..13a4f57810 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -124,10 +124,7 @@ abstract class AsyncTask extends \Threaded{ return $this->result; } - /** - * @param mixed $result - */ - public function setResult($result) : void{ + public function setResult(mixed $result) : void{ $this->result = ($this->serialized = !is_scalar($result)) ? igbinary_serialize($result) : $result; } @@ -166,7 +163,7 @@ abstract class AsyncTask extends \Threaded{ * * @param mixed $progress A value that can be safely serialize()'ed. */ - public function publishProgress($progress) : void{ + public function publishProgress(mixed $progress) : void{ $this->progressUpdates[] = igbinary_serialize($progress); } @@ -213,10 +210,8 @@ abstract class AsyncTask extends \Threaded{ * * Objects stored in this storage can be retrieved using fetchLocal() on the same thread that this method was called * from. - * - * @param mixed $complexData the data to store */ - protected function storeLocal(string $key, $complexData) : void{ + protected function storeLocal(string $key, mixed $complexData) : void{ if(self::$threadLocalStorage === null){ /* * It's necessary to use an object (not array) here because pthreads is stupid. Non-default array statics diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index af1ec2ad68..0b7087571a 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -76,10 +76,8 @@ class AsyncWorker extends Worker{ /** * Saves mixed data into the worker's thread-local object store. This can be used to store objects which you * want to use on this worker thread from multiple AsyncTasks. - * - * @param mixed $value */ - public function saveToThreadStore(string $identifier, $value) : void{ + public function saveToThreadStore(string $identifier, mixed $value) : void{ if(\Thread::getCurrentThread() !== $this){ throw new \LogicException("Thread-local data can only be stored in the thread context"); } @@ -93,10 +91,8 @@ class AsyncWorker extends Worker{ * account for the possibility that what you're trying to retrieve might not exist. * * Objects stored in this storage may ONLY be retrieved while the task is running. - * - * @return mixed */ - public function getFromThreadStore(string $identifier){ + public function getFromThreadStore(string $identifier) : mixed{ if(\Thread::getCurrentThread() !== $this){ throw new \LogicException("Thread-local data can only be fetched in the thread context"); } diff --git a/src/utils/Config.php b/src/utils/Config.php index eab5174e98..cee137e32a 100644 --- a/src/utils/Config.php +++ b/src/utils/Config.php @@ -341,11 +341,7 @@ class Config{ $this->remove($k); } - /** - * @param string $key - * @param mixed $value - */ - public function setNested($key, $value) : void{ + public function setNested(string $key, mixed $value) : void{ $vars = explode(".", $key); $base = array_shift($vars); @@ -368,13 +364,7 @@ class Config{ $this->changed = true; } - /** - * @param string $key - * @param mixed $default - * - * @return mixed - */ - public function getNested($key, $default = null){ + public function getNested(string $key, mixed $default = null) : mixed{ if(isset($this->nestedCache[$key])){ return $this->nestedCache[$key]; } @@ -420,21 +410,11 @@ class Config{ } } - /** - * @param string $k - * @param mixed $default - * - * @return bool|mixed - */ - public function get($k, $default = false){ + public function get(string $k, mixed $default = false) : mixed{ return $this->config[$k] ?? $default; } - /** - * @param string $k key to be set - * @param mixed $v value to set key - */ - public function set($k, $v = true) : void{ + public function set(string $k, mixed $v = true) : void{ $this->config[$k] = $v; $this->changed = true; foreach(Utils::stringifyKeys($this->nestedCache) as $nestedKey => $nvalue){ @@ -454,10 +434,9 @@ class Config{ } /** - * @param string $k - * @param bool $lowercase If set, searches Config in single-case / lowercase. + * @param bool $lowercase If set, searches Config in single-case / lowercase. */ - public function exists($k, bool $lowercase = false) : bool{ + public function exists(string $k, bool $lowercase = false) : bool{ if($lowercase){ $k = strtolower($k); //Convert requested key to lower $array = array_change_key_case($this->config, CASE_LOWER); //Change all keys in array to lower @@ -467,10 +446,7 @@ class Config{ } } - /** - * @param string $k - */ - public function remove($k) : void{ + public function remove(string $k) : void{ unset($this->config[$k]); $this->changed = true; } @@ -498,7 +474,7 @@ class Config{ * @phpstan-param array $data * @phpstan-param-out array $data */ - private function fillDefaults(array $default, &$data) : int{ + private function fillDefaults(array $default, array &$data) : int{ $changed = 0; foreach(Utils::stringifyKeys($default) as $k => $v){ if(is_array($v)){ diff --git a/src/utils/Filesystem.php b/src/utils/Filesystem.php index a4c1ff236f..762d39c3b6 100644 --- a/src/utils/Filesystem.php +++ b/src/utils/Filesystem.php @@ -159,12 +159,7 @@ final class Filesystem{ */ public static function getCleanedPaths() : array{ return self::$cleanedPaths; } - /** - * @param string $path - * - * @return string - */ - public static function cleanPath($path){ + public static function cleanPath(string $path) : string{ $result = str_replace([DIRECTORY_SEPARATOR, ".php", "phar://"], ["/", "", ""], $path); //remove relative paths diff --git a/src/utils/Internet.php b/src/utils/Internet.php index 8744ebd96f..87a90f4886 100644 --- a/src/utils/Internet.php +++ b/src/utils/Internet.php @@ -71,10 +71,8 @@ class Internet{ * Lazily gets the External IP using an external service and caches the result * * @param bool $force default false, force IP check even when cached - * - * @return string|false */ - public static function getIP(bool $force = false){ + public static function getIP(bool $force = false) : string|false{ if(!self::$online){ return false; }elseif(self::$ip !== false && !$force){ diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index 641233a260..6f65303bf0 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -172,13 +172,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ } } - /** - * @param string $message - * @param string $level - * @param string $prefix - * @param string $color - */ - protected function send($message, $level, $prefix, $color) : void{ + protected function send(string $message, string $level, string $prefix, string $color) : void{ $time = new \DateTime('now', new \DateTimeZone($this->timezone)); $thread = \Thread::getCurrentThread(); diff --git a/src/utils/Timezone.php b/src/utils/Timezone.php index 3cf3a19dff..8564bd85cb 100644 --- a/src/utils/Timezone.php +++ b/src/utils/Timezone.php @@ -101,10 +101,7 @@ abstract class Timezone{ \GlobalLogger::get()->warning("Timezone could not be automatically determined or was set to an invalid value. An incorrect timezone will result in incorrect timestamps on console logs. It has been set to \"UTC\" by default. You can change it on the php.ini file."); } - /** - * @return string|false - */ - public static function detectSystemTimezone(){ + public static function detectSystemTimezone() : string|false{ switch(Utils::getOS()){ case Utils::OS_WINDOWS: $regex = '/(UTC)(\+*\-*\d*\d*\:*\d*\d*)/'; @@ -178,10 +175,8 @@ abstract class Timezone{ /** * @param string $offset In the format of +09:00, +02:00, -04:00 etc. - * - * @return string|false */ - private static function parseOffset($offset){ + private static function parseOffset(string $offset) : string|false{ //Make signed offsets unsigned for date_parse if(strpos($offset, '-') !== false){ $negative_offset = true; diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 3e8e420b75..4f3f6d5777 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -345,10 +345,8 @@ final class Utils{ /** * Returns a string that can be printed, replaces non-printable characters - * - * @param mixed $str */ - public static function printable($str) : string{ + public static function printable(mixed $str) : string{ if(!is_string($str)){ return gettype($str); } @@ -369,10 +367,7 @@ final class Utils{ return $hash; } - /** - * @param object $value - */ - public static function getReferenceCount($value, bool $includeCurrent = true) : int{ + public static function getReferenceCount(object $value, bool $includeCurrent = true) : int{ ob_start(); debug_zval_dump($value); $contents = ob_get_contents(); From d634b3de183d35897c7cb1750e1376e1179af80d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Nov 2022 14:41:44 +0000 Subject: [PATCH 0437/1858] Update composer dependencies --- composer.lock | 92 +++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/composer.lock b/composer.lock index ca06b71e06..976456abcd 100644 --- a/composer.lock +++ b/composer.lock @@ -590,16 +590,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.9.2", + "version": "2.9.3", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "8813ffd2a4501521ca9433c534f3009f941de136" + "reference": "73db4397b4150b29819bf39cc371924cc2e3f502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/8813ffd2a4501521ca9433c534f3009f941de136", - "reference": "8813ffd2a4501521ca9433c534f3009f941de136", + "url": "https://api.github.com/repos/pmmp/Language/zipball/73db4397b4150b29819bf39cc371924cc2e3f502", + "reference": "73db4397b4150b29819bf39cc371924cc2e3f502", "shasum": "" }, "type": "library", @@ -607,9 +607,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.9.2" + "source": "https://github.com/pmmp/Language/tree/2.9.3" }, - "time": "2022-10-21T20:30:38+00:00" + "time": "2022-11-12T13:59:25+00:00" }, { "name": "pocketmine/log", @@ -1140,16 +1140,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -1164,7 +1164,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1202,7 +1202,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -1218,20 +1218,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -1246,7 +1246,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1285,7 +1285,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -1301,20 +1301,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -1323,7 +1323,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1368,7 +1368,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -1384,20 +1384,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -1406,7 +1406,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1447,7 +1447,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -1463,7 +1463,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" } ], "packages-dev": [ @@ -1598,16 +1598,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -1648,9 +1648,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "phar-io/manifest", @@ -1924,16 +1924,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.18", + "version": "9.2.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", "shasum": "" }, "require": { @@ -1989,7 +1989,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" }, "funding": [ { @@ -1997,7 +1997,7 @@ "type": "github" } ], - "time": "2022-10-27T13:35:33+00:00" + "time": "2022-11-18T07:47:47+00:00" }, { "name": "phpunit/php-file-iterator", From b0c6e8d8e0beb08d9010370b77ae0d9a855d32a9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 26 Nov 2022 19:32:39 +0000 Subject: [PATCH 0438/1858] StringToItemParser: added lookupAliases() and lookupBlockAliases() this permits reverse-lookuping all registered aliases that map to the given item (including properties). this may be useful for plugins to use for generating configs, instead of using IDs or some godawful hack using getName(). --- src/item/StringToItemParser.php | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 6dbe55b79e..b1ff4000b2 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -36,6 +36,7 @@ use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\SingletonTrait; use pocketmine\utils\StringToTParser; +use function array_keys; /** * Handles parsing items from strings. This is used to interpret names from the /give command (and others). @@ -1514,6 +1515,18 @@ final class StringToItemParser extends StringToTParser{ $result->register("zombie_spawn_egg", fn() => Items::ZOMBIE_SPAWN_EGG()); } + /** + * @var true[][][] + * @phpstan-var array>> + */ + private array $reverseMap = []; + + public function register(string $alias, \Closure $callback) : void{ + parent::register($alias, $callback); + $item = $callback($alias); + $this->reverseMap[$item->getTypeId()][$item->computeTypeData()][$alias] = true; + } + /** @phpstan-param \Closure(string $input) : Block $callback */ public function registerBlock(string $alias, \Closure $callback) : void{ $this->register($alias, fn(string $input) => $callback($input)->asItem()); @@ -1522,4 +1535,25 @@ final class StringToItemParser extends StringToTParser{ public function parse(string $input) : ?Item{ return parent::parse($input); } + + /** + * Returns a list of currently registered aliases that resolve to the given item. + * + * @return string[] + * @phpstan-return list + */ + public function lookupAliases(Item $item) : array{ + $aliases = $this->reverseMap[$item->getTypeId()][$item->computeTypeData()] ?? []; + return array_keys($aliases); + } + + /** + * Returns a list of currently registered aliases that resolve to the item form of the given block. + * + * @return string[] + * @phpstan-return list + */ + public function lookupBlockAliases(Block $block) : array{ + return $this->lookupAliases($block->asItem()); + } } From 8f20b9da9123be723d9215c7588710f89abbe01f Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Sat, 26 Nov 2022 20:55:16 +0100 Subject: [PATCH 0439/1858] Rename ExplosionPrimeEvent to EntityPreExplodeEvent (#5434) --- src/entity/object/PrimedTNT.php | 4 ++-- src/event/entity/EntityExplodeEvent.php | 2 +- .../{ExplosionPrimeEvent.php => EntityPreExplodeEvent.php} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/event/entity/{ExplosionPrimeEvent.php => EntityPreExplodeEvent.php} (96%) diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index 8049ec386e..6c88488a36 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -27,7 +27,7 @@ use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Explosive; use pocketmine\event\entity\EntityDamageEvent; -use pocketmine\event\entity\ExplosionPrimeEvent; +use pocketmine\event\entity\EntityPreExplodeEvent; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; @@ -113,7 +113,7 @@ class PrimedTNT extends Entity implements Explosive{ } public function explode() : void{ - $ev = new ExplosionPrimeEvent($this, 4); + $ev = new EntityPreExplodeEvent($this, 4); $ev->call(); if(!$ev->isCancelled()){ //TODO: deal with underwater TNT (underwater TNT treats water as if it has a blast resistance of 0) diff --git a/src/event/entity/EntityExplodeEvent.php b/src/event/entity/EntityExplodeEvent.php index b2837883a0..f2463af0ee 100644 --- a/src/event/entity/EntityExplodeEvent.php +++ b/src/event/entity/EntityExplodeEvent.php @@ -34,7 +34,7 @@ use pocketmine\world\Position; * Called when an entity explodes, after the explosion's impact has been calculated. * No changes have been made to the world at this stage. * - * @see ExplosionPrimeEvent + * @see EntityPreExplodeEvent * * @phpstan-extends EntityEvent */ diff --git a/src/event/entity/ExplosionPrimeEvent.php b/src/event/entity/EntityPreExplodeEvent.php similarity index 96% rename from src/event/entity/ExplosionPrimeEvent.php rename to src/event/entity/EntityPreExplodeEvent.php index 615b12ffd8..3633f29d76 100644 --- a/src/event/entity/ExplosionPrimeEvent.php +++ b/src/event/entity/EntityPreExplodeEvent.php @@ -35,7 +35,7 @@ use pocketmine\event\CancellableTrait; * * @phpstan-extends EntityEvent */ -class ExplosionPrimeEvent extends EntityEvent implements Cancellable{ +class EntityPreExplodeEvent extends EntityEvent implements Cancellable{ use CancellableTrait; private bool $blockBreaking = true; From bc8def3be1bdd53c2ecd44ae3b732705c3bd64df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 2 Dec 2022 13:02:18 +0000 Subject: [PATCH 0440/1858] Update BedrockData --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 25cf979649..fe5a5bf6bd 100644 --- a/composer.lock +++ b/composer.lock @@ -280,12 +280,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "3988f8887581082b53c6da64cac81a7837bba5e2" + "reference": "d64617faab77300d828debcd1e3597b3403b63b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/3988f8887581082b53c6da64cac81a7837bba5e2", - "reference": "3988f8887581082b53c6da64cac81a7837bba5e2", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d64617faab77300d828debcd1e3597b3403b63b7", + "reference": "d64617faab77300d828debcd1e3597b3403b63b7", "shasum": "" }, "type": "library", @@ -298,7 +298,7 @@ "issues": "https://github.com/pmmp/BedrockData/issues", "source": "https://github.com/pmmp/BedrockData/tree/modern-world-support" }, - "time": "2022-11-30T16:22:05+00:00" + "time": "2022-12-02T13:01:28+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", From ca3b5c38b7c6d6dab3e0212bb1508f02b04d4539 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 2 Dec 2022 14:03:58 +0000 Subject: [PATCH 0441/1858] Added internal support for tag recipe ingredients --- .../CraftingManagerFromDataHelper.php | 6 +- src/crafting/TagWildcardRecipeIngredient.php | 55 ++++++++++ src/data/bedrock/ItemTagToIdMap.php | 102 ++++++++++++++++++ src/network/mcpe/convert/TypeConverter.php | 12 ++- 4 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 src/crafting/TagWildcardRecipeIngredient.php create mode 100644 src/data/bedrock/ItemTagToIdMap.php diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index c071825238..7e5362d229 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -52,14 +52,14 @@ use function json_decode; final class CraftingManagerFromDataHelper{ private static function deserializeIngredient(RecipeIngredientData $data) : ?RecipeIngredient{ - if(!isset($data->name)){ - return null; //TODO: not yet implemented - } if(isset($data->count) && $data->count !== 1){ //every case we've seen so far where this isn't the case, it's been a bug and the count was ignored anyway //e.g. gold blocks crafted from 9 ingots, but each input item individually had a count of 9 throw new SavedDataLoadingException("Recipe inputs should have a count of exactly 1"); } + if(isset($data->tag)){ + return new TagWildcardRecipeIngredient($data->tag); + } $meta = $data->meta ?? null; if($meta === RecipeIngredientData::WILDCARD_META_VALUE){ diff --git a/src/crafting/TagWildcardRecipeIngredient.php b/src/crafting/TagWildcardRecipeIngredient.php new file mode 100644 index 0000000000..7ac261f08f --- /dev/null +++ b/src/crafting/TagWildcardRecipeIngredient.php @@ -0,0 +1,55 @@ +tagName; } + + public function accepts(Item $item) : bool{ + if($item->getCount() < 1){ + return false; + } + + return ItemTagToIdMap::getInstance()->tagContainsId($this->tagName, GlobalItemDataHandlers::getSerializer()->serializeType($item)->getName()); + } + + public function __toString() : string{ + return "TagWildcardRecipeIngredient($this->tagName)"; + } +} \ No newline at end of file diff --git a/src/data/bedrock/ItemTagToIdMap.php b/src/data/bedrock/ItemTagToIdMap.php new file mode 100644 index 0000000000..a5fb7952cf --- /dev/null +++ b/src/data/bedrock/ItemTagToIdMap.php @@ -0,0 +1,102 @@ + file_get_contents(Path::join(BEDROCK_DATA_PATH, 'item_tags.json'))), true, flags: JSON_THROW_ON_ERROR); + if(!is_array($map)){ + throw new AssumptionFailedError("Invalid item tag map, expected array"); + } + $cleanMap = []; + foreach($map as $tagName => $ids){ + if(!is_string($tagName)){ + throw new AssumptionFailedError("Invalid item tag name $tagName, expected string as key"); + } + if(!is_array($ids)){ + throw new AssumptionFailedError("Invalid item tag $tagName, expected array of IDs as value"); + } + $cleanIds = []; + foreach($ids as $id){ + if(!is_string($id)){ + throw new AssumptionFailedError("Invalid item tag $tagName, expected string as ID, got " . gettype($id)); + } + $cleanIds[] = $id; + } + $cleanMap[$tagName] = $cleanIds; + } + + return new self($cleanMap); + } + + /** + * @var true[][] + * @phpstan-var array> + */ + private array $tagToIdsMap = []; + + /** + * @param string[][] $tagToIds + * @phpstan-param array> $tagToIds + */ + public function __construct( + array $tagToIds + ){ + foreach(Utils::stringifyKeys($tagToIds) as $tag => $ids){ + foreach($ids as $id){ + $this->tagToIdsMap[$tag][$id] = true; + } + } + } + + /** + * @return string[] + * @phpstan-return list + */ + public function getIdsForTag(string $tag) : array{ + return array_keys($this->tagToIdsMap[$tag] ?? []); + } + + public function tagContainsId(string $tag, string $id) : bool{ + return isset($this->tagToIdsMap[$tag][$id]); + } + + public function addIdToTag(string $tag, string $id) : void{ + $this->tagToIdsMap[$tag][$id] = true; + } +} \ No newline at end of file diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 26b4a2ddf2..27836a3c72 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -27,6 +27,7 @@ use pocketmine\block\VanillaBlocks; use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; +use pocketmine\crafting\TagWildcardRecipeIngredient; use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; @@ -46,6 +47,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient as ProtocolRecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; +use pocketmine\network\mcpe\protocol\types\recipe\TagItemDescriptor; use pocketmine\player\GameMode; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; @@ -118,6 +120,7 @@ class TypeConverter{ if($ingredient instanceof MetaWildcardRecipeIngredient){ $id = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($ingredient->getItemId()); $meta = self::RECIPE_INPUT_WILDCARD_META; + $descriptor = new IntIdMetaItemDescriptor($id, $meta); }elseif($ingredient instanceof ExactRecipeIngredient){ $item = $ingredient->getItem(); [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId($item); @@ -127,11 +130,14 @@ class TypeConverter{ throw new AssumptionFailedError("Every block state should have an associated meta value"); } } + $descriptor = new IntIdMetaItemDescriptor($id, $meta); + }elseif($ingredient instanceof TagWildcardRecipeIngredient){ + $descriptor = new TagItemDescriptor($ingredient->getTagName()); }else{ throw new \LogicException("Unsupported recipe ingredient type " . get_class($ingredient) . ", only " . ExactRecipeIngredient::class . " and " . MetaWildcardRecipeIngredient::class . " are supported"); } - return new ProtocolRecipeIngredient(new IntIdMetaItemDescriptor($id, $meta), 1); + return new ProtocolRecipeIngredient($descriptor, 1); } public function netRecipeIngredientToCore(ProtocolRecipeIngredient $ingredient) : ?RecipeIngredient{ @@ -140,6 +146,10 @@ class TypeConverter{ return null; } + if($descriptor instanceof TagItemDescriptor){ + return new TagWildcardRecipeIngredient($descriptor->getTag()); + } + if($descriptor instanceof IntIdMetaItemDescriptor){ $stringId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($descriptor->getId()); $meta = $descriptor->getMeta(); From 18c2e90574238fe8abe3bcec85540a4d16fe78c5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 5 Dec 2022 14:47:44 +0000 Subject: [PATCH 0442/1858] fix CS --- src/crafting/TagWildcardRecipeIngredient.php | 2 +- src/data/bedrock/ItemTagToIdMap.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/crafting/TagWildcardRecipeIngredient.php b/src/crafting/TagWildcardRecipeIngredient.php index 7ac261f08f..32bcf08e1a 100644 --- a/src/crafting/TagWildcardRecipeIngredient.php +++ b/src/crafting/TagWildcardRecipeIngredient.php @@ -52,4 +52,4 @@ final class TagWildcardRecipeIngredient implements RecipeIngredient{ public function __toString() : string{ return "TagWildcardRecipeIngredient($this->tagName)"; } -} \ No newline at end of file +} diff --git a/src/data/bedrock/ItemTagToIdMap.php b/src/data/bedrock/ItemTagToIdMap.php index a5fb7952cf..fa5b24e7aa 100644 --- a/src/data/bedrock/ItemTagToIdMap.php +++ b/src/data/bedrock/ItemTagToIdMap.php @@ -28,6 +28,12 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; +use function array_keys; +use function file_get_contents; +use function gettype; +use function is_array; +use function is_string; +use function json_decode; use const pocketmine\BEDROCK_DATA_PATH; /** @@ -99,4 +105,4 @@ final class ItemTagToIdMap{ public function addIdToTag(string $tag, string $id) : void{ $this->tagToIdsMap[$tag][$id] = true; } -} \ No newline at end of file +} From 8e600b4a78f989f394febc8de277bb95d7e6b008 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 6 Dec 2022 12:48:28 +0000 Subject: [PATCH 0443/1858] ItemBlock: fixed unnecessary double singleton usage --- src/item/ItemBlock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 0c50d0adb5..eb476de88a 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -63,7 +63,7 @@ final class ItemBlock extends Item{ if(!$factory->isRegistered($this->blockTypeId)){ return VanillaBlocks::AIR(); } - $blockType = BlockFactory::getInstance()->fromTypeId($this->blockTypeId); + $blockType = $factory->fromTypeId($this->blockTypeId); $blockType->decodeTypeData($this->blockTypeData); return $blockType; } From 84f9136b95abf3ff24bf6dfb00cb2efa6c6af9db Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Thu, 15 Dec 2022 14:12:18 -0500 Subject: [PATCH 0444/1858] Implement anvil damage on fall (#5345) --- src/block/Anvil.php | 14 ++++++++++++++ src/block/utils/Fallable.php | 7 +++++++ src/block/utils/FallableTrait.php | 4 ++++ src/entity/object/FallingBlock.php | 7 +++++++ 4 files changed, 32 insertions(+) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index d9c407409e..4b71bd5943 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -30,12 +30,15 @@ use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\entity\object\FallingBlock; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use function lcg_value; +use function round; class Anvil extends Transparent implements Fallable{ use FallableTrait; @@ -95,4 +98,15 @@ class Anvil extends Transparent implements Fallable{ } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } + + public function onHitGround(FallingBlock $blockEntity) : bool{ + if(lcg_value() < 0.05 + (round($blockEntity->getFallDistance()) - 1) * 0.05){ + if($this->damage !== self::VERY_DAMAGED){ + $this->damage = $this->damage + 1; + }else{ + return false; + } + } + return true; + } } diff --git a/src/block/utils/Fallable.php b/src/block/utils/Fallable.php index 2f191f1c2d..6c7973d8c6 100644 --- a/src/block/utils/Fallable.php +++ b/src/block/utils/Fallable.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; +use pocketmine\entity\object\FallingBlock; interface Fallable{ @@ -33,4 +34,10 @@ interface Fallable{ * Return null if you don't want to change the usual behaviour. */ public function tickFalling() : ?Block; + + /** + * Called when FallingBlock hits the ground. + * Returns whether the block should be placed. + */ + public function onHitGround(FallingBlock $blockEntity) : bool; } diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index 8e878b1723..522ea22b15 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -58,4 +58,8 @@ trait FallableTrait{ public function tickFalling() : ?Block{ return null; } + + public function onHitGround(FallingBlock $blockEntity) : bool{ + return true; + } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 6b15ed9c82..46f1df102d 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -145,6 +145,13 @@ class FallingBlock extends Entity{ return $hasUpdate; } + protected function onHitGround() : ?float{ + if($this->block instanceof Fallable && !$this->block->onHitGround($this)){ + $this->flagForDespawn(); + } + return null; + } + public function getBlock() : Block{ return $this->block; } From ba4d03897232f7f540b171a3ee6c9cd24fb5d266 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 15 Dec 2022 21:41:33 +0000 Subject: [PATCH 0445/1858] ShapelessRecipe: make type parameter mandatory --- src/crafting/ShapelessRecipe.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/crafting/ShapelessRecipe.php b/src/crafting/ShapelessRecipe.php index ce7a57c304..a9e1f023c5 100644 --- a/src/crafting/ShapelessRecipe.php +++ b/src/crafting/ShapelessRecipe.php @@ -37,11 +37,9 @@ class ShapelessRecipe implements CraftingRecipe{ /** * @param RecipeIngredient[] $ingredients No more than 9 total. This applies to sum of item stack counts, not count of array. * @param Item[] $results List of result items created by this recipe. - * - * TODO: we'll want to make the type parameter mandatory in PM5 */ - public function __construct(array $ingredients, array $results, ?ShapelessRecipeType $type = null){ - $this->type = $type ?? ShapelessRecipeType::CRAFTING(); + public function __construct(array $ingredients, array $results, ShapelessRecipeType $type){ + $this->type = $type; if(count($ingredients) > 9){ throw new \InvalidArgumentException("Shapeless recipes cannot have more than 9 ingredients"); From 3d7509487478c7c19527af75d14b9b77b55b8cb0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 15 Dec 2022 22:43:36 +0000 Subject: [PATCH 0446/1858] Standardize explosion radius terminology closes #5061 --- src/entity/object/PrimedTNT.php | 2 +- src/event/entity/EntityPreExplodeEvent.php | 14 +++++++------- src/world/Explosion.php | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index 6c88488a36..72d169d986 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -117,7 +117,7 @@ class PrimedTNT extends Entity implements Explosive{ $ev->call(); if(!$ev->isCancelled()){ //TODO: deal with underwater TNT (underwater TNT treats water as if it has a blast resistance of 0) - $explosion = new Explosion(Position::fromObject($this->location->add(0, $this->size->getHeight() / 2, 0), $this->getWorld()), $ev->getForce(), $this); + $explosion = new Explosion(Position::fromObject($this->location->add(0, $this->size->getHeight() / 2, 0), $this->getWorld()), $ev->getRadius(), $this); if($ev->isBlockBreaking()){ $explosion->explodeA(); } diff --git a/src/event/entity/EntityPreExplodeEvent.php b/src/event/entity/EntityPreExplodeEvent.php index 3633f29d76..f02a85ecd9 100644 --- a/src/event/entity/EntityPreExplodeEvent.php +++ b/src/event/entity/EntityPreExplodeEvent.php @@ -42,23 +42,23 @@ class EntityPreExplodeEvent extends EntityEvent implements Cancellable{ public function __construct( Entity $entity, - protected float $force + protected float $radius ){ - if($force <= 0){ + if($radius <= 0){ throw new \InvalidArgumentException("Explosion radius must be positive"); } $this->entity = $entity; } - public function getForce() : float{ - return $this->force; + public function getRadius() : float{ + return $this->radius; } - public function setForce(float $force) : void{ - if($force <= 0){ + public function setRadius(float $radius) : void{ + if($radius <= 0){ throw new \InvalidArgumentException("Explosion radius must be positive"); } - $this->force = $force; + $this->radius = $radius; } public function isBlockBreaking() : bool{ diff --git a/src/world/Explosion.php b/src/world/Explosion.php index fbe5541a37..6bd72fb6f3 100644 --- a/src/world/Explosion.php +++ b/src/world/Explosion.php @@ -58,7 +58,7 @@ class Explosion{ public function __construct( public Position $source, - public float $size, + public float $radius, private Entity|Block|null $what = null ){ if(!$this->source->isValid()){ @@ -66,8 +66,8 @@ class Explosion{ } $this->world = $this->source->getWorld(); - if($size <= 0){ - throw new \InvalidArgumentException("Explosion radius must be greater than 0, got $size"); + if($radius <= 0){ + throw new \InvalidArgumentException("Explosion radius must be greater than 0, got $radius"); } $this->subChunkExplorer = new SubChunkExplorer($this->world); } @@ -77,7 +77,7 @@ class Explosion{ * will be destroyed. */ public function explodeA() : bool{ - if($this->size < 0.1){ + if($this->radius < 0.1){ return false; } @@ -96,7 +96,7 @@ class Explosion{ $pointerY = $this->source->y; $pointerZ = $this->source->z; - for($blastForce = $this->size * (mt_rand(700, 1300) / 1000); $blastForce > 0; $blastForce -= $this->stepLen * 0.75){ + for($blastForce = $this->radius * (mt_rand(700, 1300) / 1000); $blastForce > 0; $blastForce -= $this->stepLen * 0.75){ $x = (int) $pointerX; $y = (int) $pointerY; $z = (int) $pointerZ; @@ -142,7 +142,7 @@ class Explosion{ */ public function explodeB() : bool{ $source = (new Vector3($this->source->x, $this->source->y, $this->source->z))->floor(); - $yield = min(100, (1 / $this->size) * 100); + $yield = min(100, (1 / $this->radius) * 100); if($this->what instanceof Entity){ $ev = new EntityExplodeEvent($this->what, $this->source, $this->affectedBlocks, $yield); @@ -155,7 +155,7 @@ class Explosion{ } } - $explosionSize = $this->size * 2; + $explosionSize = $this->radius * 2; $minX = (int) floor($this->source->x - $explosionSize - 1); $maxX = (int) ceil($this->source->x + $explosionSize + 1); $minY = (int) floor($this->source->y - $explosionSize - 1); From 1785cbb6b5acffbb996ce8355eb05da112852211 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Sun, 18 Dec 2022 14:33:50 -0500 Subject: [PATCH 0447/1858] Implement FallingBlock missing sounds (#5348) --- src/block/Anvil.php | 6 ++++++ src/block/utils/Fallable.php | 6 ++++++ src/block/utils/FallableTrait.php | 5 +++++ src/entity/object/FallingBlock.php | 11 +++++++++-- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 4b71bd5943..59b8d17c9f 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -37,6 +37,8 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use pocketmine\world\sound\AnvilFallSound; +use pocketmine\world\sound\Sound; use function lcg_value; use function round; @@ -109,4 +111,8 @@ class Anvil extends Transparent implements Fallable{ } return true; } + + public function getLandSound() : ?Sound{ + return new AnvilFallSound(); + } } diff --git a/src/block/utils/Fallable.php b/src/block/utils/Fallable.php index 6c7973d8c6..74f96ac8b6 100644 --- a/src/block/utils/Fallable.php +++ b/src/block/utils/Fallable.php @@ -25,6 +25,7 @@ namespace pocketmine\block\utils; use pocketmine\block\Block; use pocketmine\entity\object\FallingBlock; +use pocketmine\world\sound\Sound; interface Fallable{ @@ -40,4 +41,9 @@ interface Fallable{ * Returns whether the block should be placed. */ public function onHitGround(FallingBlock $blockEntity) : bool; + + /** + * Returns the sound that will be played when FallingBlock hits the ground. + */ + public function getLandSound() : ?Sound; } diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index 522ea22b15..d13a7f794f 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -30,6 +30,7 @@ use pocketmine\entity\object\FallingBlock; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; use pocketmine\world\Position; +use pocketmine\world\sound\Sound; /** * This trait handles falling behaviour for blocks that need them. @@ -62,4 +63,8 @@ trait FallableTrait{ public function onHitGround(FallingBlock $blockEntity) : bool{ return true; } + + public function getLandSound() : ?Sound{ + return null; + } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 46f1df102d..4333b89334 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -42,6 +42,7 @@ use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; use pocketmine\world\format\io\GlobalBlockStateHandlers; +use pocketmine\world\sound\BlockBreakSound; use function abs; class FallingBlock extends Entity{ @@ -128,14 +129,20 @@ class FallingBlock extends Entity{ if($this->onGround || $blockTarget !== null){ $this->flagForDespawn(); + $blockResult = $blockTarget ?? $this->block; $block = $world->getBlock($pos); if(!$block->canBeReplaced() || !$world->isInWorld($pos->getFloorX(), $pos->getFloorY(), $pos->getFloorZ()) || ($this->onGround && abs($this->location->y - $this->location->getFloorY()) > 0.001)){ $world->dropItem($this->location, $this->block->asItem()); + $world->addSound($pos->add(0.5, 0.5, 0.5), new BlockBreakSound($blockResult)); }else{ - $ev = new EntityBlockChangeEvent($this, $block, $blockTarget ?? $this->block); + $ev = new EntityBlockChangeEvent($this, $block, $blockResult); $ev->call(); if(!$ev->isCancelled()){ - $world->setBlock($pos, $ev->getTo()); + $b = $ev->getTo(); + $world->setBlock($pos, $b); + if($this->onGround && $b instanceof Fallable && ($sound = $b->getLandSound()) !== null){ + $world->addSound($pos->add(0.5, 0.5, 0.5), $sound); + } } } $hasUpdate = true; From 44e288554a4d15bbf9afab0a23c6c227fc24334e Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Sun, 18 Dec 2022 16:15:27 -0500 Subject: [PATCH 0448/1858] Implement new records (#5433) --- src/block/utils/RecordType.php | 7 ++++++- .../bedrock/item/ItemSerializerDeserializerRegistrar.php | 3 +++ src/item/StringToItemParser.php | 3 +++ src/item/VanillaItems.php | 6 ++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/block/utils/RecordType.php b/src/block/utils/RecordType.php index f58f9fd605..9b0ab580fc 100644 --- a/src/block/utils/RecordType.php +++ b/src/block/utils/RecordType.php @@ -36,12 +36,15 @@ use pocketmine\utils\EnumTrait; * * @method static RecordType DISK_11() * @method static RecordType DISK_13() + * @method static RecordType DISK_5() * @method static RecordType DISK_BLOCKS() * @method static RecordType DISK_CAT() * @method static RecordType DISK_CHIRP() * @method static RecordType DISK_FAR() * @method static RecordType DISK_MALL() * @method static RecordType DISK_MELLOHI() + * @method static RecordType DISK_OTHERSIDE() + * @method static RecordType DISK_PIGSTEP() * @method static RecordType DISK_STAL() * @method static RecordType DISK_STRAD() * @method static RecordType DISK_WAIT() @@ -55,18 +58,20 @@ final class RecordType{ protected static function setup() : void{ self::registerAll( new RecordType("disk_13", "C418 - 13", LevelSoundEvent::RECORD_13, KnownTranslationFactory::item_record_13_desc()), + new RecordType("disk_5", "Samuel Åberg - 5", LevelSoundEvent::RECORD_5, KnownTranslationFactory::item_record_5_desc()), new RecordType("disk_cat", "C418 - cat", LevelSoundEvent::RECORD_CAT, KnownTranslationFactory::item_record_cat_desc()), new RecordType("disk_blocks", "C418 - blocks", LevelSoundEvent::RECORD_BLOCKS, KnownTranslationFactory::item_record_blocks_desc()), new RecordType("disk_chirp", "C418 - chirp", LevelSoundEvent::RECORD_CHIRP, KnownTranslationFactory::item_record_chirp_desc()), new RecordType("disk_far", "C418 - far", LevelSoundEvent::RECORD_FAR, KnownTranslationFactory::item_record_far_desc()), new RecordType("disk_mall", "C418 - mall", LevelSoundEvent::RECORD_MALL, KnownTranslationFactory::item_record_mall_desc()), new RecordType("disk_mellohi", "C418 - mellohi", LevelSoundEvent::RECORD_MELLOHI, KnownTranslationFactory::item_record_mellohi_desc()), + new RecordType("disk_otherside", "Lena Raine - otherside", LevelSoundEvent::RECORD_OTHERSIDE, KnownTranslationFactory::item_record_otherside_desc()), + new RecordType("disk_pigstep", "Lena Raine - Pigstep", LevelSoundEvent::RECORD_PIGSTEP, KnownTranslationFactory::item_record_pigstep_desc()), new RecordType("disk_stal", "C418 - stal", LevelSoundEvent::RECORD_STAL, KnownTranslationFactory::item_record_stal_desc()), new RecordType("disk_strad", "C418 - strad", LevelSoundEvent::RECORD_STRAD, KnownTranslationFactory::item_record_strad_desc()), new RecordType("disk_ward", "C418 - ward", LevelSoundEvent::RECORD_WARD, KnownTranslationFactory::item_record_ward_desc()), new RecordType("disk_11", "C418 - 11", LevelSoundEvent::RECORD_11, KnownTranslationFactory::item_record_11_desc()), new RecordType("disk_wait", "C418 - wait", LevelSoundEvent::RECORD_WAIT, KnownTranslationFactory::item_record_wait_desc()) - //TODO: Lena Raine - Pigstep ); } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index c213397c9f..1c51154fef 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -279,12 +279,15 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::MUSHROOM_STEW, Items::MUSHROOM_STEW()); $this->map1to1Item(Ids::MUSIC_DISC_11, Items::RECORD_11()); $this->map1to1Item(Ids::MUSIC_DISC_13, Items::RECORD_13()); + $this->map1to1Item(Ids::MUSIC_DISC_5, Items::RECORD_5()); $this->map1to1Item(Ids::MUSIC_DISC_BLOCKS, Items::RECORD_BLOCKS()); $this->map1to1Item(Ids::MUSIC_DISC_CAT, Items::RECORD_CAT()); $this->map1to1Item(Ids::MUSIC_DISC_CHIRP, Items::RECORD_CHIRP()); $this->map1to1Item(Ids::MUSIC_DISC_FAR, Items::RECORD_FAR()); $this->map1to1Item(Ids::MUSIC_DISC_MALL, Items::RECORD_MALL()); $this->map1to1Item(Ids::MUSIC_DISC_MELLOHI, Items::RECORD_MELLOHI()); + $this->map1to1Item(Ids::MUSIC_DISC_OTHERSIDE, Items::RECORD_OTHERSIDE()); + $this->map1to1Item(Ids::MUSIC_DISC_PIGSTEP, Items::RECORD_PIGSTEP()); $this->map1to1Item(Ids::MUSIC_DISC_STAL, Items::RECORD_STAL()); $this->map1to1Item(Ids::MUSIC_DISC_STRAD, Items::RECORD_STRAD()); $this->map1to1Item(Ids::MUSIC_DISC_WAIT, Items::RECORD_WAIT()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index b1ff4000b2..de2aafa57b 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1421,12 +1421,15 @@ final class StringToItemParser extends StringToTParser{ $result->register("raw_salmon", fn() => Items::RAW_SALMON()); $result->register("record_11", fn() => Items::RECORD_11()); $result->register("record_13", fn() => Items::RECORD_13()); + $result->register("record_5", fn() => Items::RECORD_5()); $result->register("record_blocks", fn() => Items::RECORD_BLOCKS()); $result->register("record_cat", fn() => Items::RECORD_CAT()); $result->register("record_chirp", fn() => Items::RECORD_CHIRP()); $result->register("record_far", fn() => Items::RECORD_FAR()); $result->register("record_mall", fn() => Items::RECORD_MALL()); $result->register("record_mellohi", fn() => Items::RECORD_MELLOHI()); + $result->register("record_otherside", fn() => Items::RECORD_OTHERSIDE()); + $result->register("record_pigstep", fn() => Items::RECORD_PIGSTEP()); $result->register("record_stal", fn() => Items::RECORD_STAL()); $result->register("record_strad", fn() => Items::RECORD_STRAD()); $result->register("record_wait", fn() => Items::RECORD_WAIT()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index f9e7862373..d39869f925 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -254,12 +254,15 @@ use pocketmine\world\World; * @method static RawSalmon RAW_SALMON() * @method static Record RECORD_11() * @method static Record RECORD_13() + * @method static Record RECORD_5() * @method static Record RECORD_BLOCKS() * @method static Record RECORD_CAT() * @method static Record RECORD_CHIRP() * @method static Record RECORD_FAR() * @method static Record RECORD_MALL() * @method static Record RECORD_MELLOHI() + * @method static Record RECORD_OTHERSIDE() + * @method static Record RECORD_PIGSTEP() * @method static Record RECORD_STAL() * @method static Record RECORD_STRAD() * @method static Record RECORD_WAIT() @@ -496,12 +499,15 @@ final class VanillaItems{ self::register("raw_salmon", new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); + self::register("record_5", new Record(new IID(Ids::RECORD_5), RecordType::DISK_5(), "Record 5")); self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); + self::register("record_otherside", new Record(new IID(Ids::RECORD_OTHERSIDE), RecordType::DISK_OTHERSIDE(), "Record Otherside")); + self::register("record_pigstep", new Record(new IID(Ids::RECORD_PIGSTEP), RecordType::DISK_PIGSTEP(), "Record Pigstep")); self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); From 58eec637c16466ea550c37249f952cd1a605186c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 13:39:41 +0000 Subject: [PATCH 0449/1858] Constify NBT keys in world data handling this code is one giant mess that needs to be cleaned up though... --- src/world/format/io/data/BaseNbtWorldData.php | 31 +++-- src/world/format/io/data/BedrockWorldData.php | 129 +++++++++++------- src/world/format/io/data/JavaWorldData.php | 100 ++++++++------ 3 files changed, 155 insertions(+), 105 deletions(-) diff --git a/src/world/format/io/data/BaseNbtWorldData.php b/src/world/format/io/data/BaseNbtWorldData.php index e02bcf21f1..ecd9b483ca 100644 --- a/src/world/format/io/data/BaseNbtWorldData.php +++ b/src/world/format/io/data/BaseNbtWorldData.php @@ -32,6 +32,15 @@ use pocketmine\world\format\io\WorldData; use function file_exists; abstract class BaseNbtWorldData implements WorldData{ + protected const TAG_LEVEL_NAME = "LevelName"; + protected const TAG_GENERATOR_NAME = "generatorName"; + protected const TAG_GENERATOR_OPTIONS = "generatorOptions"; + protected const TAG_RANDOM_SEED = "RandomSeed"; + protected const TAG_TIME = "Time"; + protected const TAG_SPAWN_X = "SpawnX"; + protected const TAG_SPAWN_Y = "SpawnY"; + protected const TAG_SPAWN_Z = "SpawnZ"; + protected CompoundTag $compoundTag; /** @@ -104,40 +113,40 @@ abstract class BaseNbtWorldData implements WorldData{ /* The below are common between PC and PE */ public function getName() : string{ - return $this->compoundTag->getString("LevelName"); + return $this->compoundTag->getString(self::TAG_LEVEL_NAME); } public function getGenerator() : string{ - return $this->compoundTag->getString("generatorName", "DEFAULT"); + return $this->compoundTag->getString(self::TAG_GENERATOR_NAME, "DEFAULT"); } public function getGeneratorOptions() : string{ - return $this->compoundTag->getString("generatorOptions", ""); + return $this->compoundTag->getString(self::TAG_GENERATOR_OPTIONS, ""); } public function getSeed() : int{ - return $this->compoundTag->getLong("RandomSeed"); + return $this->compoundTag->getLong(self::TAG_RANDOM_SEED); } public function getTime() : int{ - if(($timeTag = $this->compoundTag->getTag("Time")) instanceof IntTag){ //some older PM worlds had this in the wrong format + if(($timeTag = $this->compoundTag->getTag(self::TAG_TIME)) instanceof IntTag){ //some older PM worlds had this in the wrong format return $timeTag->getValue(); } - return $this->compoundTag->getLong("Time", 0); + return $this->compoundTag->getLong(self::TAG_TIME, 0); } public function setTime(int $value) : void{ - $this->compoundTag->setLong("Time", $value); + $this->compoundTag->setLong(self::TAG_TIME, $value); } public function getSpawn() : Vector3{ - return new Vector3($this->compoundTag->getInt("SpawnX"), $this->compoundTag->getInt("SpawnY"), $this->compoundTag->getInt("SpawnZ")); + return new Vector3($this->compoundTag->getInt(self::TAG_SPAWN_X), $this->compoundTag->getInt(self::TAG_SPAWN_Y), $this->compoundTag->getInt(self::TAG_SPAWN_Z)); } public function setSpawn(Vector3 $pos) : void{ - $this->compoundTag->setInt("SpawnX", $pos->getFloorX()); - $this->compoundTag->setInt("SpawnY", $pos->getFloorY()); - $this->compoundTag->setInt("SpawnZ", $pos->getFloorZ()); + $this->compoundTag->setInt(self::TAG_SPAWN_X, $pos->getFloorX()); + $this->compoundTag->setInt(self::TAG_SPAWN_Y, $pos->getFloorY()); + $this->compoundTag->setInt(self::TAG_SPAWN_Z, $pos->getFloorZ()); } } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 9cdeef0fc8..d628bd5c48 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -54,6 +54,29 @@ class BedrockWorldData extends BaseNbtWorldData{ public const GENERATOR_INFINITE = 1; public const GENERATOR_FLAT = 2; + private const TAG_DAY_CYCLE_STOP_TIME = "DayCycleStopTime"; + private const TAG_DIFFICULTY = "Difficulty"; + private const TAG_FORCE_GAME_TYPE = "ForceGameType"; + private const TAG_GAME_TYPE = "GameType"; + private const TAG_GENERATOR = "Generator"; + private const TAG_LAST_PLAYED = "LastPlayed"; + private const TAG_NETWORK_VERSION = "NetworkVersion"; + private const TAG_STORAGE_VERSION = "StorageVersion"; + private const TAG_IS_EDU = "eduLevel"; + private const TAG_FALL_DAMAGE_ENABLED = "falldamage"; + private const TAG_FIRE_DAMAGE_ENABLED = "firedamage"; + private const TAG_ACHIEVEMENTS_DISABLED = "hasBeenLoadedInCreative"; + private const TAG_IMMUTABLE_WORLD = "immutableWorld"; + private const TAG_LIGHTNING_LEVEL = "lightningLevel"; + private const TAG_LIGHTNING_TIME = "lightningTime"; + private const TAG_PVP_ENABLED = "pvp"; + private const TAG_RAIN_LEVEL = "rainLevel"; + private const TAG_RAIN_TIME = "rainTime"; + private const TAG_SPAWN_MOBS = "spawnMobs"; + private const TAG_TEXTURE_PACKS_REQUIRED = "texturePacksRequired"; + private const TAG_HARDCORE = "hardcore"; + private const TAG_GAME_RULES = "GameRules"; + public static function generate(string $path, string $name, WorldCreationOptions $options) : void{ switch($options->getGeneratorClass()){ case Flat::class: @@ -66,39 +89,39 @@ class BedrockWorldData extends BaseNbtWorldData{ $worldData = CompoundTag::create() //Vanilla fields - ->setInt("DayCycleStopTime", -1) - ->setInt("Difficulty", $options->getDifficulty()) - ->setByte("ForceGameType", 0) - ->setInt("GameType", 0) - ->setInt("Generator", $generatorType) - ->setLong("LastPlayed", time()) - ->setString("LevelName", $name) - ->setInt("NetworkVersion", self::CURRENT_STORAGE_NETWORK_VERSION) + ->setInt(self::TAG_DAY_CYCLE_STOP_TIME, -1) + ->setInt(self::TAG_DIFFICULTY, $options->getDifficulty()) + ->setByte(self::TAG_FORCE_GAME_TYPE, 0) + ->setInt(self::TAG_GAME_TYPE, 0) + ->setInt(self::TAG_GENERATOR, $generatorType) + ->setLong(self::TAG_LAST_PLAYED, time()) + ->setString(self::TAG_LEVEL_NAME, $name) + ->setInt(self::TAG_NETWORK_VERSION, self::CURRENT_STORAGE_NETWORK_VERSION) //->setInt("Platform", 2) //TODO: find out what the possible values are for - ->setLong("RandomSeed", $options->getSeed()) - ->setInt("SpawnX", $options->getSpawnPosition()->getFloorX()) - ->setInt("SpawnY", $options->getSpawnPosition()->getFloorY()) - ->setInt("SpawnZ", $options->getSpawnPosition()->getFloorZ()) - ->setInt("StorageVersion", self::CURRENT_STORAGE_VERSION) - ->setLong("Time", 0) - ->setByte("eduLevel", 0) - ->setByte("falldamage", 1) - ->setByte("firedamage", 1) - ->setByte("hasBeenLoadedInCreative", 1) //badly named, this actually determines whether achievements can be earned in this world... - ->setByte("immutableWorld", 0) - ->setFloat("lightningLevel", 0.0) - ->setInt("lightningTime", 0) - ->setByte("pvp", 1) - ->setFloat("rainLevel", 0.0) - ->setInt("rainTime", 0) - ->setByte("spawnMobs", 1) - ->setByte("texturePacksRequired", 0) //TODO + ->setLong(self::TAG_RANDOM_SEED, $options->getSeed()) + ->setInt(self::TAG_SPAWN_X, $options->getSpawnPosition()->getFloorX()) + ->setInt(self::TAG_SPAWN_Y, $options->getSpawnPosition()->getFloorY()) + ->setInt(self::TAG_SPAWN_Z, $options->getSpawnPosition()->getFloorZ()) + ->setInt(self::TAG_STORAGE_VERSION, self::CURRENT_STORAGE_VERSION) + ->setLong(self::TAG_TIME, 0) + ->setByte(self::TAG_IS_EDU, 0) + ->setByte(self::TAG_FALL_DAMAGE_ENABLED, 1) + ->setByte(self::TAG_FIRE_DAMAGE_ENABLED, 1) + ->setByte(self::TAG_ACHIEVEMENTS_DISABLED, 1) //badly named, this actually determines whether achievements can be earned in this world... + ->setByte(self::TAG_IMMUTABLE_WORLD, 0) + ->setFloat(self::TAG_LIGHTNING_LEVEL, 0.0) + ->setInt(self::TAG_LIGHTNING_TIME, 0) + ->setByte(self::TAG_PVP_ENABLED, 1) + ->setFloat(self::TAG_RAIN_LEVEL, 0.0) + ->setInt(self::TAG_RAIN_TIME, 0) + ->setByte(self::TAG_SPAWN_MOBS, 1) + ->setByte(self::TAG_TEXTURE_PACKS_REQUIRED, 0) //TODO //Additional PocketMine-MP fields - ->setTag("GameRules", new CompoundTag()) - ->setByte("hardcore", 0) - ->setString("generatorName", GeneratorManager::getInstance()->getGeneratorName($options->getGeneratorClass())) - ->setString("generatorOptions", $options->getGeneratorOptions()); + ->setTag(self::TAG_GAME_RULES, new CompoundTag()) + ->setByte(self::TAG_HARDCORE, 0) + ->setString(self::TAG_GENERATOR_NAME, GeneratorManager::getInstance()->getGeneratorName($options->getGeneratorClass())) + ->setString(self::TAG_GENERATOR_OPTIONS, $options->getGeneratorOptions()); $nbt = new LittleEndianNbtSerializer(); $buffer = $nbt->write(new TreeRoot($worldData)); @@ -120,7 +143,7 @@ class BedrockWorldData extends BaseNbtWorldData{ throw new CorruptedWorldException($e->getMessage(), 0, $e); } - $version = $worldData->getInt("StorageVersion", Limits::INT32_MAX); + $version = $worldData->getInt(self::TAG_STORAGE_VERSION, Limits::INT32_MAX); if($version > self::CURRENT_STORAGE_VERSION){ throw new UnsupportedWorldFormatException("LevelDB world format version $version is currently unsupported"); } @@ -129,18 +152,18 @@ class BedrockWorldData extends BaseNbtWorldData{ } protected function fix() : void{ - $generatorNameTag = $this->compoundTag->getTag("generatorName"); + $generatorNameTag = $this->compoundTag->getTag(self::TAG_GENERATOR_NAME); if(!($generatorNameTag instanceof StringTag)){ - if(($mcpeGeneratorTypeTag = $this->compoundTag->getTag("Generator")) instanceof IntTag){ + if(($mcpeGeneratorTypeTag = $this->compoundTag->getTag(self::TAG_GENERATOR)) instanceof IntTag){ switch($mcpeGeneratorTypeTag->getValue()){ //Detect correct generator from MCPE data case self::GENERATOR_FLAT: - $this->compoundTag->setString("generatorName", "flat"); - $this->compoundTag->setString("generatorOptions", "2;7,3,3,2;1"); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, "flat"); + $this->compoundTag->setString(self::TAG_GENERATOR_OPTIONS, "2;7,3,3,2;1"); break; case self::GENERATOR_INFINITE: //TODO: add a null generator which does not generate missing chunks (to allow importing back to MCPE and generating more normal terrain without PocketMine messing things up) - $this->compoundTag->setString("generatorName", "default"); - $this->compoundTag->setString("generatorOptions", ""); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, "default"); + $this->compoundTag->setString(self::TAG_GENERATOR_OPTIONS, ""); break; case self::GENERATOR_LIMITED: throw new UnsupportedWorldFormatException("Limited worlds are not currently supported"); @@ -148,20 +171,20 @@ class BedrockWorldData extends BaseNbtWorldData{ throw new UnsupportedWorldFormatException("Unknown LevelDB generator type"); } }else{ - $this->compoundTag->setString("generatorName", "default"); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, "default"); } }elseif(($generatorName = self::hackyFixForGeneratorClasspathInLevelDat($generatorNameTag->getValue())) !== null){ - $this->compoundTag->setString("generatorName", $generatorName); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, $generatorName); } - if(!($this->compoundTag->getTag("generatorOptions")) instanceof StringTag){ - $this->compoundTag->setString("generatorOptions", ""); + if(!($this->compoundTag->getTag(self::TAG_GENERATOR_OPTIONS)) instanceof StringTag){ + $this->compoundTag->setString(self::TAG_GENERATOR_OPTIONS, ""); } } public function save() : void{ - $this->compoundTag->setInt("NetworkVersion", self::CURRENT_STORAGE_NETWORK_VERSION); - $this->compoundTag->setInt("StorageVersion", self::CURRENT_STORAGE_VERSION); + $this->compoundTag->setInt(self::TAG_NETWORK_VERSION, self::CURRENT_STORAGE_NETWORK_VERSION); + $this->compoundTag->setInt(self::TAG_STORAGE_VERSION, self::CURRENT_STORAGE_VERSION); $nbt = new LittleEndianNbtSerializer(); $buffer = $nbt->write(new TreeRoot($this->compoundTag)); @@ -169,42 +192,42 @@ class BedrockWorldData extends BaseNbtWorldData{ } public function getDifficulty() : int{ - return $this->compoundTag->getInt("Difficulty", World::DIFFICULTY_NORMAL); + return $this->compoundTag->getInt(self::TAG_DIFFICULTY, World::DIFFICULTY_NORMAL); } public function setDifficulty(int $difficulty) : void{ - $this->compoundTag->setInt("Difficulty", $difficulty); //yes, this is intended! (in PE: int, PC: byte) + $this->compoundTag->setInt(self::TAG_DIFFICULTY, $difficulty); //yes, this is intended! (in PE: int, PC: byte) } public function getRainTime() : int{ - return $this->compoundTag->getInt("rainTime", 0); + return $this->compoundTag->getInt(self::TAG_RAIN_TIME, 0); } public function setRainTime(int $ticks) : void{ - $this->compoundTag->setInt("rainTime", $ticks); + $this->compoundTag->setInt(self::TAG_RAIN_TIME, $ticks); } public function getRainLevel() : float{ - return $this->compoundTag->getFloat("rainLevel", 0.0); + return $this->compoundTag->getFloat(self::TAG_RAIN_LEVEL, 0.0); } public function setRainLevel(float $level) : void{ - $this->compoundTag->setFloat("rainLevel", $level); + $this->compoundTag->setFloat(self::TAG_RAIN_LEVEL, $level); } public function getLightningTime() : int{ - return $this->compoundTag->getInt("lightningTime", 0); + return $this->compoundTag->getInt(self::TAG_LIGHTNING_TIME, 0); } public function setLightningTime(int $ticks) : void{ - $this->compoundTag->setInt("lightningTime", $ticks); + $this->compoundTag->setInt(self::TAG_LIGHTNING_TIME, $ticks); } public function getLightningLevel() : float{ - return $this->compoundTag->getFloat("lightningLevel", 0.0); + return $this->compoundTag->getFloat(self::TAG_LIGHTNING_LEVEL, 0.0); } public function setLightningLevel(float $level) : void{ - $this->compoundTag->setFloat("lightningLevel", $level); + $this->compoundTag->setFloat(self::TAG_LIGHTNING_LEVEL, $level); } } diff --git a/src/world/format/io/data/JavaWorldData.php b/src/world/format/io/data/JavaWorldData.php index e53d857ad8..817cee0fea 100644 --- a/src/world/format/io/data/JavaWorldData.php +++ b/src/world/format/io/data/JavaWorldData.php @@ -46,31 +46,49 @@ use const ZLIB_ENCODING_GZIP; class JavaWorldData extends BaseNbtWorldData{ + private const TAG_DAY_TIME = "DayTime"; + private const TAG_DIFFICULTY = "Difficulty"; + private const TAG_FORMAT_VERSION = "version"; + private const TAG_GAME_RULES = "GameRules"; + private const TAG_GAME_TYPE = "GameType"; + private const TAG_GENERATOR_VERSION = "generatorVersion"; + private const TAG_HARDCORE = "hardcore"; + private const TAG_INITIALIZED = "initialized"; + private const TAG_LAST_PLAYED = "LastPlayed"; + private const TAG_LIGHTNING_LEVEL = "lightningLevel"; + private const TAG_RAINING = "raining"; + private const TAG_RAIN_LEVEL = "rainLevel"; + private const TAG_RAIN_TIME = "rainTime"; + private const TAG_ROOT_DATA = "Data"; + private const TAG_SIZE_ON_DISK = "SizeOnDisk"; + private const TAG_THUNDERING = "thundering"; + private const TAG_THUNDER_TIME = "thunderTime"; + public static function generate(string $path, string $name, WorldCreationOptions $options, int $version = 19133) : void{ //TODO, add extra details $worldData = CompoundTag::create() - ->setByte("hardcore", 0) - ->setByte("Difficulty", $options->getDifficulty()) - ->setByte("initialized", 1) - ->setInt("GameType", 0) - ->setInt("generatorVersion", 1) //2 in MCPE - ->setInt("SpawnX", $options->getSpawnPosition()->getFloorX()) - ->setInt("SpawnY", $options->getSpawnPosition()->getFloorY()) - ->setInt("SpawnZ", $options->getSpawnPosition()->getFloorZ()) - ->setInt("version", $version) - ->setInt("DayTime", 0) - ->setLong("LastPlayed", (int) (microtime(true) * 1000)) - ->setLong("RandomSeed", $options->getSeed()) - ->setLong("SizeOnDisk", 0) - ->setLong("Time", 0) - ->setString("generatorName", GeneratorManager::getInstance()->getGeneratorName($options->getGeneratorClass())) - ->setString("generatorOptions", $options->getGeneratorOptions()) - ->setString("LevelName", $name) - ->setTag("GameRules", new CompoundTag()); + ->setByte(self::TAG_HARDCORE, 0) + ->setByte(self::TAG_DIFFICULTY, $options->getDifficulty()) + ->setByte(self::TAG_INITIALIZED, 1) + ->setInt(self::TAG_GAME_TYPE, 0) + ->setInt(self::TAG_GENERATOR_VERSION, 1) //2 in MCPE + ->setInt(self::TAG_SPAWN_X, $options->getSpawnPosition()->getFloorX()) + ->setInt(self::TAG_SPAWN_Y, $options->getSpawnPosition()->getFloorY()) + ->setInt(self::TAG_SPAWN_Z, $options->getSpawnPosition()->getFloorZ()) + ->setInt(self::TAG_FORMAT_VERSION, $version) + ->setInt(self::TAG_DAY_TIME, 0) + ->setLong(self::TAG_LAST_PLAYED, (int) (microtime(true) * 1000)) + ->setLong(self::TAG_RANDOM_SEED, $options->getSeed()) + ->setLong(self::TAG_SIZE_ON_DISK, 0) + ->setLong(self::TAG_TIME, 0) + ->setString(self::TAG_GENERATOR_NAME, GeneratorManager::getInstance()->getGeneratorName($options->getGeneratorClass())) + ->setString(self::TAG_GENERATOR_OPTIONS, $options->getGeneratorOptions()) + ->setString(self::TAG_LEVEL_NAME, $name) + ->setTag(self::TAG_GAME_RULES, new CompoundTag()); $nbt = new BigEndianNbtSerializer(); - $buffer = zlib_encode($nbt->write(new TreeRoot(CompoundTag::create()->setTag("Data", $worldData))), ZLIB_ENCODING_GZIP); + $buffer = zlib_encode($nbt->write(new TreeRoot(CompoundTag::create()->setTag(self::TAG_ROOT_DATA, $worldData))), ZLIB_ENCODING_GZIP); file_put_contents(Path::join($path, "level.dat"), $buffer); } @@ -90,79 +108,79 @@ class JavaWorldData extends BaseNbtWorldData{ throw new CorruptedWorldException($e->getMessage(), 0, $e); } - $dataTag = $worldData->getTag("Data"); + $dataTag = $worldData->getTag(self::TAG_ROOT_DATA); if(!($dataTag instanceof CompoundTag)){ - throw new CorruptedWorldException("Missing 'Data' key or wrong type"); + throw new CorruptedWorldException("Missing '" . self::TAG_ROOT_DATA . "' key or wrong type"); } return $dataTag; } protected function fix() : void{ - $generatorNameTag = $this->compoundTag->getTag("generatorName"); + $generatorNameTag = $this->compoundTag->getTag(self::TAG_GENERATOR_NAME); if(!($generatorNameTag instanceof StringTag)){ - $this->compoundTag->setString("generatorName", "default"); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, "default"); }elseif(($generatorName = self::hackyFixForGeneratorClasspathInLevelDat($generatorNameTag->getValue())) !== null){ - $this->compoundTag->setString("generatorName", $generatorName); + $this->compoundTag->setString(self::TAG_GENERATOR_NAME, $generatorName); } - if(!($this->compoundTag->getTag("generatorOptions") instanceof StringTag)){ - $this->compoundTag->setString("generatorOptions", ""); + if(!($this->compoundTag->getTag(self::TAG_GENERATOR_OPTIONS) instanceof StringTag)){ + $this->compoundTag->setString(self::TAG_GENERATOR_OPTIONS, ""); } } public function save() : void{ $nbt = new BigEndianNbtSerializer(); - $buffer = Utils::assumeNotFalse(zlib_encode($nbt->write(new TreeRoot(CompoundTag::create()->setTag("Data", $this->compoundTag))), ZLIB_ENCODING_GZIP)); + $buffer = Utils::assumeNotFalse(zlib_encode($nbt->write(new TreeRoot(CompoundTag::create()->setTag(self::TAG_ROOT_DATA, $this->compoundTag))), ZLIB_ENCODING_GZIP)); Filesystem::safeFilePutContents($this->dataPath, $buffer); } public function getDifficulty() : int{ - return $this->compoundTag->getByte("Difficulty", World::DIFFICULTY_NORMAL); + return $this->compoundTag->getByte(self::TAG_DIFFICULTY, World::DIFFICULTY_NORMAL); } public function setDifficulty(int $difficulty) : void{ - $this->compoundTag->setByte("Difficulty", $difficulty); + $this->compoundTag->setByte(self::TAG_DIFFICULTY, $difficulty); } public function getRainTime() : int{ - return $this->compoundTag->getInt("rainTime", 0); + return $this->compoundTag->getInt(self::TAG_RAIN_TIME, 0); } public function setRainTime(int $ticks) : void{ - $this->compoundTag->setInt("rainTime", $ticks); + $this->compoundTag->setInt(self::TAG_RAIN_TIME, $ticks); } public function getRainLevel() : float{ - if(($rainLevelTag = $this->compoundTag->getTag("rainLevel")) instanceof FloatTag){ //PocketMine/MCPE + if(($rainLevelTag = $this->compoundTag->getTag(self::TAG_RAIN_LEVEL)) instanceof FloatTag){ //PocketMine/MCPE return $rainLevelTag->getValue(); } - return (float) $this->compoundTag->getByte("raining", 0); //PC vanilla + return (float) $this->compoundTag->getByte(self::TAG_RAINING, 0); //PC vanilla } public function setRainLevel(float $level) : void{ - $this->compoundTag->setFloat("rainLevel", $level); //PocketMine/MCPE - $this->compoundTag->setByte("raining", (int) ceil($level)); //PC vanilla + $this->compoundTag->setFloat(self::TAG_RAIN_LEVEL, $level); //PocketMine/MCPE + $this->compoundTag->setByte(self::TAG_RAINING, (int) ceil($level)); //PC vanilla } public function getLightningTime() : int{ - return $this->compoundTag->getInt("thunderTime", 0); + return $this->compoundTag->getInt(self::TAG_THUNDER_TIME, 0); } public function setLightningTime(int $ticks) : void{ - $this->compoundTag->setInt("thunderTime", $ticks); + $this->compoundTag->setInt(self::TAG_THUNDER_TIME, $ticks); } public function getLightningLevel() : float{ - if(($lightningLevelTag = $this->compoundTag->getTag("lightningLevel")) instanceof FloatTag){ //PocketMine/MCPE + if(($lightningLevelTag = $this->compoundTag->getTag(self::TAG_LIGHTNING_LEVEL)) instanceof FloatTag){ //PocketMine/MCPE return $lightningLevelTag->getValue(); } - return (float) $this->compoundTag->getByte("thundering", 0); //PC vanilla + return (float) $this->compoundTag->getByte(self::TAG_THUNDERING, 0); //PC vanilla } public function setLightningLevel(float $level) : void{ - $this->compoundTag->setFloat("lightningLevel", $level); //PocketMine/MCPE - $this->compoundTag->setByte("thundering", (int) ceil($level)); //PC vanilla + $this->compoundTag->setFloat(self::TAG_LIGHTNING_LEVEL, $level); //PocketMine/MCPE + $this->compoundTag->setByte(self::TAG_THUNDERING, (int) ceil($level)); //PC vanilla } } From b27c47335cb404c6049dec43a49cccf3b2b3edd8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 13:43:28 +0000 Subject: [PATCH 0450/1858] JavaWorldData: remove Bedrock-compatible hacks we don't need these, since we don't write to Java world formats anymore anyway. --- src/world/format/io/data/JavaWorldData.php | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/world/format/io/data/JavaWorldData.php b/src/world/format/io/data/JavaWorldData.php index 817cee0fea..8575ee7296 100644 --- a/src/world/format/io/data/JavaWorldData.php +++ b/src/world/format/io/data/JavaWorldData.php @@ -55,9 +55,7 @@ class JavaWorldData extends BaseNbtWorldData{ private const TAG_HARDCORE = "hardcore"; private const TAG_INITIALIZED = "initialized"; private const TAG_LAST_PLAYED = "LastPlayed"; - private const TAG_LIGHTNING_LEVEL = "lightningLevel"; private const TAG_RAINING = "raining"; - private const TAG_RAIN_LEVEL = "rainLevel"; private const TAG_RAIN_TIME = "rainTime"; private const TAG_ROOT_DATA = "Data"; private const TAG_SIZE_ON_DISK = "SizeOnDisk"; @@ -151,16 +149,11 @@ class JavaWorldData extends BaseNbtWorldData{ } public function getRainLevel() : float{ - if(($rainLevelTag = $this->compoundTag->getTag(self::TAG_RAIN_LEVEL)) instanceof FloatTag){ //PocketMine/MCPE - return $rainLevelTag->getValue(); - } - - return (float) $this->compoundTag->getByte(self::TAG_RAINING, 0); //PC vanilla + return (float) $this->compoundTag->getByte(self::TAG_RAINING, 0); } public function setRainLevel(float $level) : void{ - $this->compoundTag->setFloat(self::TAG_RAIN_LEVEL, $level); //PocketMine/MCPE - $this->compoundTag->setByte(self::TAG_RAINING, (int) ceil($level)); //PC vanilla + $this->compoundTag->setByte(self::TAG_RAINING, (int) ceil($level)); } public function getLightningTime() : int{ @@ -172,15 +165,10 @@ class JavaWorldData extends BaseNbtWorldData{ } public function getLightningLevel() : float{ - if(($lightningLevelTag = $this->compoundTag->getTag(self::TAG_LIGHTNING_LEVEL)) instanceof FloatTag){ //PocketMine/MCPE - return $lightningLevelTag->getValue(); - } - - return (float) $this->compoundTag->getByte(self::TAG_THUNDERING, 0); //PC vanilla + return (float) $this->compoundTag->getByte(self::TAG_THUNDERING, 0); } public function setLightningLevel(float $level) : void{ - $this->compoundTag->setFloat(self::TAG_LIGHTNING_LEVEL, $level); //PocketMine/MCPE - $this->compoundTag->setByte(self::TAG_THUNDERING, (int) ceil($level)); //PC vanilla + $this->compoundTag->setByte(self::TAG_THUNDERING, (int) ceil($level)); } } From be1087c071dff8d1eac2e731541793bc7031606b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 14:55:24 +0000 Subject: [PATCH 0451/1858] Accept worlds from 1.19.40 and up --- src/world/format/io/data/BedrockWorldData.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index d628bd5c48..efdae18731 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -47,8 +47,8 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ - public const CURRENT_STORAGE_VERSION = 9; - public const CURRENT_STORAGE_NETWORK_VERSION = 527; // 1.19.0 + public const CURRENT_STORAGE_VERSION = 10; + public const CURRENT_STORAGE_NETWORK_VERSION = 560; public const GENERATOR_LIMITED = 0; public const GENERATOR_INFINITE = 1; From d7ebabd7714edb85a3b66c8fb0f72d7278effedf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 14:56:04 +0000 Subject: [PATCH 0452/1858] Fixed the client asking to upgrade PM-generated worlds --- src/world/format/io/data/BedrockWorldData.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index efdae18731..01eb18c642 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -27,6 +27,7 @@ use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\utils\Binary; @@ -49,6 +50,13 @@ class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; public const CURRENT_STORAGE_NETWORK_VERSION = 560; + public const CURRENT_CLIENT_VERSION_TARGET = [ + 1, //major + 19, //minor + 50, //patch + 0, //revision + 0 //is beta + ]; public const GENERATOR_LIMITED = 0; public const GENERATOR_INFINITE = 1; @@ -76,6 +84,7 @@ class BedrockWorldData extends BaseNbtWorldData{ private const TAG_TEXTURE_PACKS_REQUIRED = "texturePacksRequired"; private const TAG_HARDCORE = "hardcore"; private const TAG_GAME_RULES = "GameRules"; + private const TAG_LAST_OPENED_WITH_VERSION = "lastOpenedWithVersion"; public static function generate(string $path, string $name, WorldCreationOptions $options) : void{ switch($options->getGeneratorClass()){ @@ -116,6 +125,7 @@ class BedrockWorldData extends BaseNbtWorldData{ ->setInt(self::TAG_RAIN_TIME, 0) ->setByte(self::TAG_SPAWN_MOBS, 1) ->setByte(self::TAG_TEXTURE_PACKS_REQUIRED, 0) //TODO + ->setTag(self::TAG_LAST_OPENED_WITH_VERSION, new ListTag(array_map(fn(int $v) => new IntTag($v), self::CURRENT_CLIENT_VERSION_TARGET))) //Additional PocketMine-MP fields ->setTag(self::TAG_GAME_RULES, new CompoundTag()) @@ -185,6 +195,7 @@ class BedrockWorldData extends BaseNbtWorldData{ public function save() : void{ $this->compoundTag->setInt(self::TAG_NETWORK_VERSION, self::CURRENT_STORAGE_NETWORK_VERSION); $this->compoundTag->setInt(self::TAG_STORAGE_VERSION, self::CURRENT_STORAGE_VERSION); + $this->compoundTag->setTag(self::TAG_LAST_OPENED_WITH_VERSION, new ListTag(array_map(fn(int $v) => new IntTag($v), self::CURRENT_CLIENT_VERSION_TARGET))); $nbt = new LittleEndianNbtSerializer(); $buffer = $nbt->write(new TreeRoot($this->compoundTag)); From a30c649607386d8494ee297e7ef9c074b368c56f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 14:59:55 +0000 Subject: [PATCH 0453/1858] BedrockWorldData: enable commands by default --- src/world/format/io/data/BedrockWorldData.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 01eb18c642..62a7575f1a 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -85,6 +85,7 @@ class BedrockWorldData extends BaseNbtWorldData{ private const TAG_HARDCORE = "hardcore"; private const TAG_GAME_RULES = "GameRules"; private const TAG_LAST_OPENED_WITH_VERSION = "lastOpenedWithVersion"; + private const TAG_COMMANDS_ENABLED = "commandsEnabled"; public static function generate(string $path, string $name, WorldCreationOptions $options) : void{ switch($options->getGeneratorClass()){ @@ -125,6 +126,7 @@ class BedrockWorldData extends BaseNbtWorldData{ ->setInt(self::TAG_RAIN_TIME, 0) ->setByte(self::TAG_SPAWN_MOBS, 1) ->setByte(self::TAG_TEXTURE_PACKS_REQUIRED, 0) //TODO + ->setByte(self::TAG_COMMANDS_ENABLED, 1) ->setTag(self::TAG_LAST_OPENED_WITH_VERSION, new ListTag(array_map(fn(int $v) => new IntTag($v), self::CURRENT_CLIENT_VERSION_TARGET))) //Additional PocketMine-MP fields From de3af9e66059957debee62d35288c6fa6ae6ae79 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 15:02:59 +0000 Subject: [PATCH 0454/1858] Fix CS --- src/world/format/io/data/BedrockWorldData.php | 1 + src/world/format/io/data/JavaWorldData.php | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 62a7575f1a..d9530cdad5 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -40,6 +40,7 @@ use pocketmine\world\generator\GeneratorManager; use pocketmine\world\World; use pocketmine\world\WorldCreationOptions; use Symfony\Component\Filesystem\Path; +use function array_map; use function file_get_contents; use function file_put_contents; use function strlen; diff --git a/src/world/format/io/data/JavaWorldData.php b/src/world/format/io/data/JavaWorldData.php index 8575ee7296..a93ee90a78 100644 --- a/src/world/format/io/data/JavaWorldData.php +++ b/src/world/format/io/data/JavaWorldData.php @@ -26,7 +26,6 @@ namespace pocketmine\world\format\io\data; use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\nbt\tag\FloatTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\utils\Filesystem; From 9809909072ff806da75b92d6d9a86125105e70d2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 15:06:06 +0000 Subject: [PATCH 0455/1858] BedrockWorldData: remove unused custom fields --- src/world/format/io/data/BedrockWorldData.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index d9530cdad5..111f7749c5 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -83,8 +83,6 @@ class BedrockWorldData extends BaseNbtWorldData{ private const TAG_RAIN_TIME = "rainTime"; private const TAG_SPAWN_MOBS = "spawnMobs"; private const TAG_TEXTURE_PACKS_REQUIRED = "texturePacksRequired"; - private const TAG_HARDCORE = "hardcore"; - private const TAG_GAME_RULES = "GameRules"; private const TAG_LAST_OPENED_WITH_VERSION = "lastOpenedWithVersion"; private const TAG_COMMANDS_ENABLED = "commandsEnabled"; @@ -131,8 +129,6 @@ class BedrockWorldData extends BaseNbtWorldData{ ->setTag(self::TAG_LAST_OPENED_WITH_VERSION, new ListTag(array_map(fn(int $v) => new IntTag($v), self::CURRENT_CLIENT_VERSION_TARGET))) //Additional PocketMine-MP fields - ->setTag(self::TAG_GAME_RULES, new CompoundTag()) - ->setByte(self::TAG_HARDCORE, 0) ->setString(self::TAG_GENERATOR_NAME, GeneratorManager::getInstance()->getGeneratorName($options->getGeneratorClass())) ->setString(self::TAG_GENERATOR_OPTIONS, $options->getGeneratorOptions()); From 0efd928db695e5bc7ddf858a0025bc6c39523934 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 15:11:06 +0000 Subject: [PATCH 0456/1858] Apply a prefix to block type tags --- src/block/BlockTypeTags.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/block/BlockTypeTags.php b/src/block/BlockTypeTags.php index 8bcd4c589a..8537a28142 100644 --- a/src/block/BlockTypeTags.php +++ b/src/block/BlockTypeTags.php @@ -24,9 +24,10 @@ declare(strict_types=1); namespace pocketmine\block; final class BlockTypeTags{ + private const PREFIX = "pocketmine:"; - public const DIRT = "dirt"; - public const MUD = "mud"; - public const SAND = "sand"; - public const POTTABLE_PLANTS = "pottable"; + public const DIRT = self::PREFIX . "dirt"; + public const MUD = self::PREFIX . "mud"; + public const SAND = self::PREFIX . "sand"; + public const POTTABLE_PLANTS = self::PREFIX . "pottable"; } From f38b15cf8344650c8e5370573af8c3fc275a835c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 15:22:09 +0000 Subject: [PATCH 0457/1858] Added tag for fire blocks --- src/block/BlockTypeTags.php | 1 + src/block/VanillaBlocks.php | 4 ++-- src/entity/projectile/SplashPotion.php | 6 +++--- src/player/Player.php | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/block/BlockTypeTags.php b/src/block/BlockTypeTags.php index 8537a28142..19a4825d96 100644 --- a/src/block/BlockTypeTags.php +++ b/src/block/BlockTypeTags.php @@ -30,4 +30,5 @@ final class BlockTypeTags{ public const MUD = self::PREFIX . "mud"; public const SAND = self::PREFIX . "sand"; public const POTTABLE_PLANTS = self::PREFIX . "pottable"; + public const FIRE = self::PREFIX . "fire"; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a4e70031b0..277cac26c9 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -829,7 +829,7 @@ final class VanillaBlocks{ self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0)))); self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); - self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant()))); + self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant(), [Tags::FIRE]))); self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new Info(BreakInfo::axe(2.5, null, 2.5)))); $flowerTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); @@ -1457,7 +1457,7 @@ final class VanillaBlocks{ self::register("cracked_polished_blackstone_bricks", new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); self::register("soul_torch", new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", new Info(BreakInfo::instant()))); - self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", new Info(BreakInfo::instant()))); + self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", new Info(BreakInfo::instant(), [Tags::FIRE]))); //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new Info(BreakInfo::shovel(1.0)))); diff --git a/src/entity/projectile/SplashPotion.php b/src/entity/projectile/SplashPotion.php index 3f6eeff7ea..4f4e3de978 100644 --- a/src/entity/projectile/SplashPotion.php +++ b/src/entity/projectile/SplashPotion.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\entity\projectile; -use pocketmine\block\BlockTypeIds; +use pocketmine\block\BlockTypeTags; use pocketmine\block\VanillaBlocks; use pocketmine\color\Color; use pocketmine\data\bedrock\PotionTypeIdMap; @@ -130,11 +130,11 @@ class SplashPotion extends Throwable{ }elseif($event instanceof ProjectileHitBlockEvent && $this->getPotionType()->equals(PotionType::WATER())){ $blockIn = $event->getBlockHit()->getSide($event->getRayTraceResult()->getHitFace()); - if($blockIn->getTypeId() === BlockTypeIds::FIRE){ + if($blockIn->hasTypeTag(BlockTypeTags::FIRE)){ $this->getWorld()->setBlock($blockIn->getPosition(), VanillaBlocks::AIR()); } foreach($blockIn->getHorizontalSides() as $horizontalSide){ - if($horizontalSide->getTypeId() === BlockTypeIds::FIRE){ + if($horizontalSide->hasTypeTag(BlockTypeTags::FIRE)){ $this->getWorld()->setBlock($horizontalSide->getPosition(), VanillaBlocks::AIR()); } } diff --git a/src/player/Player.php b/src/player/Player.php index 6025710d98..5b352acf74 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\player; use pocketmine\block\Bed; -use pocketmine\block\BlockTypeIds; +use pocketmine\block\BlockTypeTags; use pocketmine\block\UnknownBlock; use pocketmine\block\VanillaBlocks; use pocketmine\command\CommandSender; @@ -1684,7 +1684,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } $block = $target->getSide($face); - if($block->getTypeId() === BlockTypeIds::FIRE || $block->getTypeId() === BlockTypeIds::SOUL_FIRE){ + if($block->hasTypeTag(BlockTypeTags::FIRE)){ $this->getWorld()->setBlock($block->getPosition(), VanillaBlocks::AIR()); $this->getWorld()->addSound($block->getPosition()->add(0.5, 0.5, 0.5), new FireExtinguishSound()); return true; From ec59dc1c8016d2fd7f9aa82e6fee87f2d5c228d0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 15:58:26 +0000 Subject: [PATCH 0458/1858] SuspiciousStewTypeIdMap: fixed uninitialized fields --- src/data/bedrock/SuspiciousStewTypeIdMap.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/SuspiciousStewTypeIdMap.php b/src/data/bedrock/SuspiciousStewTypeIdMap.php index 54c1fdcb9a..1dc86abf19 100644 --- a/src/data/bedrock/SuspiciousStewTypeIdMap.php +++ b/src/data/bedrock/SuspiciousStewTypeIdMap.php @@ -33,13 +33,13 @@ final class SuspiciousStewTypeIdMap{ * @var SuspiciousStewType[] * @phpstan-var array */ - private array $idToEnum; + private array $idToEnum = []; /** * @var int[] * @phpstan-var array */ - private array $enumToId; + private array $enumToId = []; private function __construct(){ $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY()); From 16f90f412031ca9142354712dafe418bb11ddb15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 16:04:32 +0000 Subject: [PATCH 0459/1858] EntityFactory: remove legacy save IDs this can be more cleanly handled using BedrockData. --- src/data/bedrock/EntityLegacyIds.php | 134 --------------------------- src/entity/EntityFactory.php | 38 ++++---- 2 files changed, 18 insertions(+), 154 deletions(-) delete mode 100644 src/data/bedrock/EntityLegacyIds.php diff --git a/src/data/bedrock/EntityLegacyIds.php b/src/data/bedrock/EntityLegacyIds.php deleted file mode 100644 index 8e60ef0e97..0000000000 --- a/src/data/bedrock/EntityLegacyIds.php +++ /dev/null @@ -1,134 +0,0 @@ -register(Arrow::class, function(World $world, CompoundTag $nbt) : Arrow{ return new Arrow(Helper::parseLocation($nbt, $world), null, $nbt->getByte(Arrow::TAG_CRIT, 0) === 1, $nbt); - }, ['Arrow', 'minecraft:arrow'], LegacyIds::ARROW); + }, ['Arrow', 'minecraft:arrow']); $this->register(Egg::class, function(World $world, CompoundTag $nbt) : Egg{ return new Egg(Helper::parseLocation($nbt, $world), null, $nbt); - }, ['Egg', 'minecraft:egg'], LegacyIds::EGG); + }, ['Egg', 'minecraft:egg']); $this->register(EnderPearl::class, function(World $world, CompoundTag $nbt) : EnderPearl{ return new EnderPearl(Helper::parseLocation($nbt, $world), null, $nbt); - }, ['ThrownEnderpearl', 'minecraft:ender_pearl'], LegacyIds::ENDER_PEARL); + }, ['ThrownEnderpearl', 'minecraft:ender_pearl']); $this->register(ExperienceBottle::class, function(World $world, CompoundTag $nbt) : ExperienceBottle{ return new ExperienceBottle(Helper::parseLocation($nbt, $world), null, $nbt); - }, ['ThrownExpBottle', 'minecraft:xp_bottle'], LegacyIds::XP_BOTTLE); + }, ['ThrownExpBottle', 'minecraft:xp_bottle']); $this->register(ExperienceOrb::class, function(World $world, CompoundTag $nbt) : ExperienceOrb{ $value = 1; @@ -109,11 +109,11 @@ final class EntityFactory{ } return new ExperienceOrb(Helper::parseLocation($nbt, $world), $value, $nbt); - }, ['XPOrb', 'minecraft:xp_orb'], LegacyIds::XP_ORB); + }, ['XPOrb', 'minecraft:xp_orb']); $this->register(FallingBlock::class, function(World $world, CompoundTag $nbt) : FallingBlock{ return new FallingBlock(Helper::parseLocation($nbt, $world), FallingBlock::parseBlockNBT(BlockFactory::getInstance(), $nbt), $nbt); - }, ['FallingSand', 'minecraft:falling_block'], LegacyIds::FALLING_BLOCK); + }, ['FallingSand', 'minecraft:falling_block']); $this->register(ItemEntity::class, function(World $world, CompoundTag $nbt) : ItemEntity{ $itemTag = $nbt->getCompoundTag(ItemEntity::TAG_ITEM); @@ -126,7 +126,7 @@ final class EntityFactory{ throw new SavedDataLoadingException("Item is invalid"); } return new ItemEntity(Helper::parseLocation($nbt, $world), $item, $nbt); - }, ['Item', 'minecraft:item'], LegacyIds::ITEM); + }, ['Item', 'minecraft:item']); $this->register(Painting::class, function(World $world, CompoundTag $nbt) : Painting{ $motive = PaintingMotive::getMotiveByName($nbt->getString(Painting::TAG_MOTIVE)); @@ -143,15 +143,15 @@ final class EntityFactory{ } return new Painting(Helper::parseLocation($nbt, $world), $blockIn, $facing, $motive, $nbt); - }, ['Painting', 'minecraft:painting'], LegacyIds::PAINTING); + }, ['Painting', 'minecraft:painting']); $this->register(PrimedTNT::class, function(World $world, CompoundTag $nbt) : PrimedTNT{ return new PrimedTNT(Helper::parseLocation($nbt, $world), $nbt); - }, ['PrimedTnt', 'PrimedTNT', 'minecraft:tnt'], LegacyIds::TNT); + }, ['PrimedTnt', 'PrimedTNT', 'minecraft:tnt']); $this->register(Snowball::class, function(World $world, CompoundTag $nbt) : Snowball{ return new Snowball(Helper::parseLocation($nbt, $world), null, $nbt); - }, ['Snowball', 'minecraft:snowball'], LegacyIds::SNOWBALL); + }, ['Snowball', 'minecraft:snowball']); $this->register(SplashPotion::class, function(World $world, CompoundTag $nbt) : SplashPotion{ $potionType = PotionTypeIdMap::getInstance()->fromId($nbt->getShort("PotionId", PotionTypeIds::WATER)); @@ -159,19 +159,19 @@ final class EntityFactory{ throw new SavedDataLoadingException("No such potion type"); } return new SplashPotion(Helper::parseLocation($nbt, $world), null, $potionType, $nbt); - }, ['ThrownPotion', 'minecraft:potion', 'thrownpotion'], LegacyIds::SPLASH_POTION); + }, ['ThrownPotion', 'minecraft:potion', 'thrownpotion']); $this->register(Squid::class, function(World $world, CompoundTag $nbt) : Squid{ return new Squid(Helper::parseLocation($nbt, $world), $nbt); - }, ['Squid', 'minecraft:squid'], LegacyIds::SQUID); + }, ['Squid', 'minecraft:squid']); $this->register(Villager::class, function(World $world, CompoundTag $nbt) : Villager{ return new Villager(Helper::parseLocation($nbt, $world), $nbt); - }, ['Villager', 'minecraft:villager'], LegacyIds::VILLAGER); + }, ['Villager', 'minecraft:villager']); $this->register(Zombie::class, function(World $world, CompoundTag $nbt) : Zombie{ return new Zombie(Helper::parseLocation($nbt, $world), $nbt); - }, ['Zombie', 'minecraft:zombie'], LegacyIds::ZOMBIE); + }, ['Zombie', 'minecraft:zombie']); $this->register(Human::class, function(World $world, CompoundTag $nbt) : Human{ return new Human(Helper::parseLocation($nbt, $world), Human::parseSkinNBT($nbt), $nbt); @@ -191,7 +191,7 @@ final class EntityFactory{ * * @throws \InvalidArgumentException */ - public function register(string $className, \Closure $creationFunc, array $saveNames, ?int $legacyMcpeSaveId = null) : void{ + public function register(string $className, \Closure $creationFunc, array $saveNames) : void{ if(count($saveNames) === 0){ throw new \InvalidArgumentException("At least one save name must be provided"); } @@ -205,9 +205,6 @@ final class EntityFactory{ foreach($saveNames as $name){ $this->creationFuncs[$name] = $creationFunc; } - if($legacyMcpeSaveId !== null){ - $this->creationFuncs[$legacyMcpeSaveId] = $creationFunc; - } $this->saveNames[$className] = reset($saveNames); } @@ -225,7 +222,8 @@ final class EntityFactory{ if($saveId instanceof StringTag){ $func = $this->creationFuncs[$saveId->getValue()] ?? null; }elseif($saveId instanceof IntTag){ //legacy MCPE format - $func = $this->creationFuncs[$saveId->getValue() & 0xff] ?? null; + $stringId = LegacyEntityIdToStringIdMap::getInstance()->legacyToString($saveId->getValue() & 0xff); + $func = $stringId !== null ? $this->creationFuncs[$stringId] ?? null : null; } if($func === null){ return null; From 83bfe790fa3dd66945f356ae0fe724b867edb74b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 22:18:24 +0000 Subject: [PATCH 0460/1858] Prepare 5.0.0-ALPHA6 changelog --- changelogs/5.0-alpha.md | 92 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index f408d106b3..41f15a0853 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -646,4 +646,94 @@ Released 13th November 2022. - Copper blocks now play the correct scrape sound when using an axe on them. ## Internals -- Moved command timings to `Timings`. \ No newline at end of file +- Moved command timings to `Timings`. + +# 5.0.0-ALPHA6 +Released 19th December 2022. + +**This release includes changes from the following releases, which may not be explicitly mentioned:** +- [4.10.2](https://github.com/pmmp/PocketMine-MP/releases/tag/4.10.2) +- [4.11.0](https://github.com/pmmp/PocketMine-MP/releases/tag/4.11.0) +- [4.12.0](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.0) +- [4.12.1](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.1) +- [4.12.2](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.2) + +## General +- Fixed the Bedrock client asking to upgrade worlds exported from PocketMine-MP to Bedrock (missing level.dat fields). +- Added support for 1.19.40 and newer Bedrock worlds. +- Commands are now enabled by default in worlds exported from PocketMine-MP to Bedrock. + +## Gameplay +### Blocks +- Added the following new blocks: + - Twisting Vines + - Weeping Vines +- Anvils are now damaged when they hit the ground after falling. +- Added missing sounds for anvils hitting the ground after falling. +- Fixed missing sounds when a projectile strikes an amethyst block. +- Fixed some blocks being incorrectly able to be placed on top of a candle cake. + +### Items +- Added the following new items: + - Music Disc (5) + - Music Disc (Otherside) + - Music Disc (Pigstep) +- Implemented Swift Sneak enchantment. +- Armour durability is now only reduced when the wearer receives a type of damage that the armour can protect against. + +## API +### General +- Union and mixed native parameter, return and property types are now used where appropriate. + +### `pocketmine\block` +- The following new API methods have been added: + - `public Furnace->getType() : utils\FurnaceType` +- The following interfaces have new requirements: + - `utils\Fallable` now requires `onHitGround()` to be implemented (although filled by default implementation in `FallableTrait`). + - `utils\Fallable` now requires `getLandSound()` to be implemented (although filled by default implementation in `FallableTrait`). +- The following new API constants have been added: + - `public BlockTypeTags::FIRE` - used by fire and soul fire + +### `pocketmine\crafting` +- The `$type` parameter of `ShapelessRecipe->__construct()` is now mandatory. + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Living->getDisplayName() : string` +- The following API methods have changed signatures: + - `EntityFactory->register()` no longer accepts a `$legacyMcpeSaveId` parameter (now handled by internal conversions instead). + +### `pocketmine\event` +- The following classes have been renamed: + - `entity\ExplosionPrimeEvent` -> `entity\EntityPreExplodeEvent` +- The following new classes have been added: + - `world\WorldParticleEvent` - called when a particle is spawned in a world + - `world\WorldSoundEvent` - called when a sound is played in a world +- The following API methods have changed signatures: + - `entity\EntityPreExplodeEvent->__construct()` has the `$force` parameter renamed to `$radius` + - `entity\EntityPreExplodeEvent->getForce() : float` -> `entity\EntityPreExplodeEvent->getRadius() : float` + - `entity\EntityPreExplodeEvent->setForce(float $force) : void` -> `entity\EntityPreExplodeEvent->setRadius(float $radius) : void` + +### `pocketmine\item` +- The following new API methods have been added: + - `public Item->keepOnDeath() : bool` - returns whether this item will be retained when a player carrying it dies + - `public Item->onInteractEntity(Player $player, Entity $entity, Vector3 $clickPos) : bool` - called when a player interacts with an entity with this item in their hand + - `public Item->setKeepOnDeath(bool $keepOnDeath) : void` - sets whether this item will be retained when a player carrying it dies + - `public StringToItemParser->lookupAliases(Item $item) : list` - returns a list of all registered aliases for the given item + - `public StringToItemParser->lookupBlockAliases(Block $block) : list` - returns a list of all registered aliases for the given block + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setPackEncryptionKey(string $id, ?string $key) : void` - sets the encryption key to be used for the resource pack identified by the given UUID + - `public ResourcePackManager->setResourceStack(list $resourceStack) : void` - sets the resource stack to be used by the server + +### `pocketmine\world` +- The following API methods have changed signatures: + - `Explosion->__construct()` has the `$size` parameter renamed to `$radius` +- The following public properties have been renamed: + - `Explosion->size` -> `Explosion->radius` + +## Internals +- `EntityLegacyIds` has been removed. Legacy entity IDs found during world loading are now converted via `LegacyEntityIdToStringIdMap`. +- All usages of NBT keys now use class constants instead of hardcoded strings (except for an occasional overlooked one). +- All members of `BlockTypeTags` now have a `pocketmine:` prefix on the value. This does not affect constant usages. From da4315df058044622d9964e5014c863c3be20ee3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 22:21:13 +0000 Subject: [PATCH 0461/1858] Release 5.0.0-ALPHA6 --- changelogs/5.0-alpha.md | 2 +- src/VersionInfo.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 41f15a0853..de11e5c7ad 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -651,7 +651,7 @@ Released 13th November 2022. # 5.0.0-ALPHA6 Released 19th December 2022. -**This release includes changes from the following releases, which may not be explicitly mentioned:** +**This release includes changes from the following releases, which may not be mentioned:** - [4.10.2](https://github.com/pmmp/PocketMine-MP/releases/tag/4.10.2) - [4.11.0](https://github.com/pmmp/PocketMine-MP/releases/tag/4.11.0) - [4.12.0](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.0) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 6955b826b3..dca68d5411 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA6"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 044d35956eaf29145d595c973da1ee292d040979 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 22:21:14 +0000 Subject: [PATCH 0462/1858] 5.0.0-ALPHA7 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index dca68d5411..cfca3b4b59 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA6"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA7"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From b3473960b49f397f64ce6cbcc994bf413b2ab4ac Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Thu, 22 Dec 2022 18:22:04 +0300 Subject: [PATCH 0463/1858] Implemented chain (#5454) --- src/block/BlockTypeIds.php | 3 +- src/block/Chain.php | 48 +++++++++++++++++++ src/block/VanillaBlocks.php | 3 ++ .../convert/BlockObjectToStateSerializer.php | 5 ++ .../BlockStateToObjectDeserializer.php | 4 ++ .../ItemSerializerDeserializerRegistrar.php | 1 + src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 8 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/block/Chain.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 3fdb447284..3ab25dfbc5 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -706,8 +706,9 @@ final class BlockTypeIds{ public const FROGLIGHT = 10679; public const TWISTING_VINES = 10680; public const WEEPING_VINES = 10681; + public const CHAIN = 10682; - public const FIRST_UNUSED_BLOCK_ID = 10682; + public const FIRST_UNUSED_BLOCK_ID = 10683; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/Chain.php b/src/block/Chain.php new file mode 100644 index 0000000000..fa8ffd1e82 --- /dev/null +++ b/src/block/Chain.php @@ -0,0 +1,48 @@ +axis === Axis::Y && Facing::axis($facing) === Axis::Y ? SupportType::CENTER() : SupportType::NONE(); + } + + protected function recalculateCollisionBoxes() : array{ + $bb = AxisAlignedBB::one(); + foreach([Axis::Y, Axis::Z, Axis::X] as $axis){ + if($axis !== $this->axis){ + $bb->squash($axis, 13 / 32); + } + } + return [$bb]; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 277cac26c9..0e3bd41f01 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -153,6 +153,7 @@ use function mb_strtolower; * @method static CartographyTable CARTOGRAPHY_TABLE() * @method static CarvedPumpkin CARVED_PUMPKIN() * @method static Cauldron CAULDRON() + * @method static Chain CHAIN() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() * @method static Opaque CHISELED_DEEPSLATE() @@ -1473,6 +1474,8 @@ final class VanillaBlocks{ self::register("twisting_vines", new NetherVines(new BID(Ids::TWISTING_VINES), "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); self::register("weeping_vines", new NetherVines(new BID(Ids::WEEPING_VINES), "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); + + self::register("chain", new Chain(new BID(Ids::CHAIN), "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); } private static function registerBlocksR17() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 07e7ac4fb7..493a4e29c3 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -45,6 +45,7 @@ use pocketmine\block\Candle; use pocketmine\block\Carpet; use pocketmine\block\Carrot; use pocketmine\block\CarvedPumpkin; +use pocketmine\block\Chain; use pocketmine\block\ChemistryTable; use pocketmine\block\Chest; use pocketmine\block\ChorusFlower; @@ -712,6 +713,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CARVED_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::CHAIN(), function(Chain $block) : Writer{ + return Writer::create(Ids::CHAIN) + ->writePillarAxis($block->getAxis()); + }); $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index b05effd4ab..4621c65606 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -549,6 +549,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CARVED_PUMPKIN() ->setFacing($in->readLegacyHorizontalFacing()); }); + $this->map(Ids::CHAIN, function(Reader $in) : Block{ + return Blocks::CHAIN() + ->setAxis($in->readPillarAxis()); + }); $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 1c51154fef..ee78dba032 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -134,6 +134,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::BREWING_STAND, Blocks::BREWING_STAND()); $this->map1to1Block(Ids::CAKE, Blocks::CAKE()); $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON()); + $this->map1to1Block(Ids::CHAIN, Blocks::CHAIN()); $this->map1to1Block(Ids::COMPARATOR, Blocks::REDSTONE_COMPARATOR()); $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR()); $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index de2aafa57b..836371147c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -205,6 +205,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("carrots", fn() => Blocks::CARROTS()); $result->registerBlock("carved_pumpkin", fn() => Blocks::CARVED_PUMPKIN()); $result->registerBlock("cauldron", fn() => Blocks::CAULDRON()); + $result->registerBlock("chain", fn() => Blocks::CHAIN()); $result->registerBlock("chemical_heat", fn() => Blocks::CHEMICAL_HEAT()); $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 0ff09efa1c..490fc655ae 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From b4c7d33388d8a22e0583dea03b4f4366849a11e8 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Sat, 24 Dec 2022 18:38:12 +0100 Subject: [PATCH 0464/1858] Implement Medicine (from Education Edition) (#5450) --- build/generate-runtime-enum-serializers.php | 2 + src/data/bedrock/MedicineTypeIdMap.php | 66 +++++++++++++++++ src/data/bedrock/MedicineTypeIds.php | 31 ++++++++ .../ItemSerializerDeserializerRegistrar.php | 10 +++ .../runtime/RuntimeEnumDeserializerTrait.php | 10 +++ .../runtime/RuntimeEnumSerializerTrait.php | 10 +++ src/item/ItemTypeIds.php | 3 +- src/item/Medicine.php | 73 +++++++++++++++++++ src/item/MedicineType.php | 66 +++++++++++++++++ src/item/StringToItemParser.php | 4 + src/item/VanillaItems.php | 2 + 11 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 src/data/bedrock/MedicineTypeIdMap.php create mode 100644 src/data/bedrock/MedicineTypeIds.php create mode 100644 src/item/Medicine.php create mode 100644 src/item/MedicineType.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 5907628f0c..f71b87cdc5 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -33,6 +33,7 @@ use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\MushroomBlockType; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; +use pocketmine\item\MedicineType; use pocketmine\item\PotionType; use pocketmine\item\SuspiciousStewType; use function array_key_first; @@ -166,6 +167,7 @@ $enumsUsed = [ DyeColor::getAll(), FroglightType::getAll(), LeverFacing::getAll(), + MedicineType::getAll(), MushroomBlockType::getAll(), SkullType::getAll(), SlabType::getAll(), diff --git a/src/data/bedrock/MedicineTypeIdMap.php b/src/data/bedrock/MedicineTypeIdMap.php new file mode 100644 index 0000000000..a85dbb7a8e --- /dev/null +++ b/src/data/bedrock/MedicineTypeIdMap.php @@ -0,0 +1,66 @@ + + */ + private array $idToEnum = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $enumToId = []; + + private function __construct(){ + $this->register(MedicineTypeIds::ANTIDOTE, MedicineType::ANTIDOTE()); + $this->register(MedicineTypeIds::ELIXIR, MedicineType::ELIXIR()); + $this->register(MedicineTypeIds::EYE_DROPS, MedicineType::EYE_DROPS()); + $this->register(MedicineTypeIds::TONIC, MedicineType::TONIC()); + } + + private function register(int $id, MedicineType $type) : void{ + $this->idToEnum[$id] = $type; + $this->enumToId[$type->id()] = $id; + } + + public function fromId(int $id) : ?MedicineType{ + return $this->idToEnum[$id] ?? null; + } + + public function toId(MedicineType $type) : int{ + if(!isset($this->enumToId[$type->id()])){ + throw new \InvalidArgumentException("Type does not have a mapped ID"); + } + return $this->enumToId[$type->id()]; + } +} diff --git a/src/data/bedrock/MedicineTypeIds.php b/src/data/bedrock/MedicineTypeIds.php new file mode 100644 index 0000000000..8c0110ec32 --- /dev/null +++ b/src/data/bedrock/MedicineTypeIds.php @@ -0,0 +1,31 @@ + DyeColorIdMap::getInstance()->toInvertedId($item->getColor()) ); + $this->map1to1ItemWithMeta( + Ids::MEDICINE, + Items::MEDICINE(), + function(Medicine $item, int $meta) : void{ + $item->setType(MedicineTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown medicine type ID $meta")); + }, + fn(Medicine $item) => MedicineTypeIdMap::getInstance()->toId($item->getType()) + ); $this->map1to1ItemWithMeta( Ids::POTION, Items::POTION(), diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index bb83e805e9..278cfc1522 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -116,6 +116,16 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function medicineType(\pocketmine\item\MedicineType &$value) : void{ + $value = match($this->readInt(2)){ + 0 => \pocketmine\item\MedicineType::ANTIDOTE(), + 1 => \pocketmine\item\MedicineType::ELIXIR(), + 2 => \pocketmine\item\MedicineType::EYE_DROPS(), + 3 => \pocketmine\item\MedicineType::TONIC(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MedicineType") + }; + } + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\MushroomBlockType::ALL_CAP(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 91deba5e3d..09a706e953 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -116,6 +116,16 @@ trait RuntimeEnumSerializerTrait{ }); } + public function medicineType(\pocketmine\item\MedicineType $value) : void{ + $this->int(2, match($value){ + \pocketmine\item\MedicineType::ANTIDOTE() => 0, + \pocketmine\item\MedicineType::ELIXIR() => 1, + \pocketmine\item\MedicineType::EYE_DROPS() => 2, + \pocketmine\item\MedicineType::TONIC() => 3, + default => throw new \pocketmine\utils\AssumptionFailedError("All MedicineType cases should be covered") + }); + } + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType $value) : void{ $this->int(4, match($value){ \pocketmine\block\utils\MushroomBlockType::ALL_CAP() => 0, diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index cc4be26d4e..b7eea80556 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -299,8 +299,9 @@ final class ItemTypeIds{ public const FIRE_CHARGE = 20260; public const SUSPICIOUS_STEW = 20261; public const TURTLE_HELMET = 20262; + public const MEDICINE = 20263; - public const FIRST_UNUSED_ITEM_ID = 20263; + public const FIRST_UNUSED_ITEM_ID = 20264; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/Medicine.php b/src/item/Medicine.php new file mode 100644 index 0000000000..0915a19c1d --- /dev/null +++ b/src/item/Medicine.php @@ -0,0 +1,73 @@ +medicineType = MedicineType::EYE_DROPS(); + parent::__construct($identifier, $name); + } + + protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + $w->medicineType($this->medicineType); + } + + public function getType() : MedicineType{ return $this->medicineType; } + + /** + * @return $this + */ + public function setType(MedicineType $type) : self{ + $this->medicineType = $type; + return $this; + } + + public function getMaxStackSize() : int{ + return 1; + } + + public function onConsume(Living $consumer) : void{ + $consumer->getEffects()->remove($this->getType()->getCuredEffect()); + } + + public function getAdditionalEffects() : array{ + return []; + } + + public function getResidue() : Item{ + return VanillaItems::GLASS_BOTTLE(); + } + + public function canStartUsingItem(Player $player) : bool{ + return $player->getEffects()->has($this->getType()->getCuredEffect()); + } +} diff --git a/src/item/MedicineType.php b/src/item/MedicineType.php new file mode 100644 index 0000000000..f7ce2b816d --- /dev/null +++ b/src/item/MedicineType.php @@ -0,0 +1,66 @@ +Enum___construct($enumName); + } + + public function getDisplayName() : string{ return $this->displayName; } + + public function getCuredEffect() : Effect{ return $this->curedEffect; } +} diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 836371147c..63baf3effc 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1133,6 +1133,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); $result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD()); + $result->register("antidote", fn() => Items::MEDICINE()->setType(MedicineType::ANTIDOTE())); $result->register("apple", fn() => Items::APPLE()); $result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); @@ -1248,11 +1249,13 @@ final class StringToItemParser extends StringToTParser{ $result->register("dye", fn() => Items::INK_SAC()); $result->register("echo_shard", fn() => Items::ECHO_SHARD()); $result->register("egg", fn() => Items::EGG()); + $result->register("elixir", fn() => Items::MEDICINE()->setType(MedicineType::ELIXIR())); $result->register("emerald", fn() => Items::EMERALD()); $result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("ender_pearl", fn() => Items::ENDER_PEARL()); $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); + $result->register("eye_drops", fn() => Items::MEDICINE()->setType(MedicineType::EYE_DROPS())); $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); $result->register("fire_charge", fn() => Items::FIRE_CHARGE()); @@ -1492,6 +1495,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS())); $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK())); $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK())); + $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC())); $result->register("totem", fn() => Items::TOTEM()); $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER())); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index d39869f925..38d7eff9f7 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -205,6 +205,7 @@ use pocketmine\world\World; * @method static Armor LEATHER_TUNIC() * @method static Item MAGMA_CREAM() * @method static ItemBlockWallOrFloor MANGROVE_SIGN() + * @method static Medicine MEDICINE() * @method static Melon MELON() * @method static MelonSeeds MELON_SEEDS() * @method static MilkBucket MILK_BUCKET() @@ -456,6 +457,7 @@ final class VanillaItems{ self::register("leather", new Item(new IID(Ids::LEATHER), "Leather")); self::register("magma_cream", new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); self::register("mangrove_sign", new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); + self::register("medicine", new Medicine(new IID(Ids::MEDICINE), "Medicine")); self::register("melon", new Melon(new IID(Ids::MELON), "Melon")); self::register("melon_seeds", new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); self::register("milk_bucket", new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); From 133884da7274ce5585466bb6d82748255a47a8d6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Dec 2022 17:41:59 +0000 Subject: [PATCH 0465/1858] Remove deprecated permissions --- src/permission/DefaultPermissionNames.php | 7 --- src/permission/DefaultPermissions.php | 53 ++++++----------------- 2 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/permission/DefaultPermissionNames.php b/src/permission/DefaultPermissionNames.php index 6dc86c9ae0..fab532e286 100644 --- a/src/permission/DefaultPermissionNames.php +++ b/src/permission/DefaultPermissionNames.php @@ -34,17 +34,13 @@ final class DefaultPermissionNames{ public const COMMAND_DEFAULTGAMEMODE = "pocketmine.command.defaultgamemode"; public const COMMAND_DIFFICULTY = "pocketmine.command.difficulty"; public const COMMAND_DUMPMEMORY = "pocketmine.command.dumpmemory"; - public const COMMAND_EFFECT = "pocketmine.command.effect"; public const COMMAND_EFFECT_OTHER = "pocketmine.command.effect.other"; public const COMMAND_EFFECT_SELF = "pocketmine.command.effect.self"; - public const COMMAND_ENCHANT = "pocketmine.command.enchant"; public const COMMAND_ENCHANT_OTHER = "pocketmine.command.enchant.other"; public const COMMAND_ENCHANT_SELF = "pocketmine.command.enchant.self"; - public const COMMAND_GAMEMODE = "pocketmine.command.gamemode"; public const COMMAND_GAMEMODE_OTHER = "pocketmine.command.gamemode.other"; public const COMMAND_GAMEMODE_SELF = "pocketmine.command.gamemode.self"; public const COMMAND_GC = "pocketmine.command.gc"; - public const COMMAND_GIVE = "pocketmine.command.give"; public const COMMAND_GIVE_OTHER = "pocketmine.command.give.other"; public const COMMAND_GIVE_SELF = "pocketmine.command.give.self"; public const COMMAND_HELP = "pocketmine.command.help"; @@ -63,12 +59,10 @@ final class DefaultPermissionNames{ public const COMMAND_SAY = "pocketmine.command.say"; public const COMMAND_SEED = "pocketmine.command.seed"; public const COMMAND_SETWORLDSPAWN = "pocketmine.command.setworldspawn"; - public const COMMAND_SPAWNPOINT = "pocketmine.command.spawnpoint"; public const COMMAND_SPAWNPOINT_OTHER = "pocketmine.command.spawnpoint.other"; public const COMMAND_SPAWNPOINT_SELF = "pocketmine.command.spawnpoint.self"; public const COMMAND_STATUS = "pocketmine.command.status"; public const COMMAND_STOP = "pocketmine.command.stop"; - public const COMMAND_TELEPORT = "pocketmine.command.teleport"; public const COMMAND_TELEPORT_OTHER = "pocketmine.command.teleport.other"; public const COMMAND_TELEPORT_SELF = "pocketmine.command.teleport.self"; public const COMMAND_TELL = "pocketmine.command.tell"; @@ -78,7 +72,6 @@ final class DefaultPermissionNames{ public const COMMAND_TIME_START = "pocketmine.command.time.start"; public const COMMAND_TIME_STOP = "pocketmine.command.time.stop"; public const COMMAND_TIMINGS = "pocketmine.command.timings"; - public const COMMAND_TITLE = "pocketmine.command.title"; public const COMMAND_TITLE_OTHER = "pocketmine.command.title.other"; public const COMMAND_TITLE_SELF = "pocketmine.command.title.self"; public const COMMAND_TRANSFERSERVER = "pocketmine.command.transferserver"; diff --git a/src/permission/DefaultPermissions.php b/src/permission/DefaultPermissions.php index 6f9c79b801..bff4bf1c86 100644 --- a/src/permission/DefaultPermissions.php +++ b/src/permission/DefaultPermissions.php @@ -44,12 +44,6 @@ abstract class DefaultPermissions{ return PermissionManager::getInstance()->getPermission($candidate->getName()); } - private static function registerDeprecatedPermission(string $name) : Permission{ - $permission = new Permission($name, "Deprecated, kept for backwards compatibility only"); - PermissionManager::getInstance()->addPermission($permission); - return $permission; - } - public static function registerCorePermissions() : void{ $consoleRoot = self::registerPermission(new Permission(self::ROOT_CONSOLE, "Grants all console permissions")); $operatorRoot = self::registerPermission(new Permission(self::ROOT_OPERATOR, "Grants all operator permissions"), [$consoleRoot]); @@ -65,25 +59,15 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DEFAULTGAMEMODE, "Allows the user to change the default gamemode"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DIFFICULTY, "Allows the user to change the game difficulty"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DUMPMEMORY, "Allows the user to dump memory contents"), [$consoleRoot]); - - $effectRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_EFFECT); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_OTHER, "Allows the user to modify effects of other players"), [$operatorRoot, $effectRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_SELF, "Allows the user to modify their own effects"), [$operatorRoot, $effectRoot]); - - $enchantRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_ENCHANT); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_OTHER, "Allows the user to enchant the held items of other players"), [$operatorRoot, $enchantRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_SELF, "Allows the user to enchant their own held item"), [$operatorRoot, $enchantRoot]); - - $gameModeRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_GAMEMODE); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_OTHER, "Allows the user to change the game mode of other players"), [$operatorRoot, $gameModeRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_SELF, "Allows the user to change their own game mode"), [$operatorRoot, $gameModeRoot]); - + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_OTHER, "Allows the user to modify effects of other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_SELF, "Allows the user to modify their own effects"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_OTHER, "Allows the user to enchant the held items of other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_SELF, "Allows the user to enchant their own held item"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_OTHER, "Allows the user to change the game mode of other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_SELF, "Allows the user to change their own game mode"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GC, "Allows the user to fire garbage collection tasks"), [$operatorRoot]); - - $giveRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_GIVE); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_OTHER, "Allows the user to give items to other players"), [$operatorRoot, $giveRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_SELF, "Allows the user to give items to themselves"), [$operatorRoot, $giveRoot]); - + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_OTHER, "Allows the user to give items to other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_SELF, "Allows the user to give items to themselves"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_HELP, "Allows the user to view the help menu"), [$everyoneRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_KICK, "Allows the user to kick players"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_KILL_OTHER, "Allows the user to kill other players"), [$operatorRoot]); @@ -100,18 +84,12 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SAY, "Allows the user to talk as the console"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SEED, "Allows the user to view the seed of the world"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SETWORLDSPAWN, "Allows the user to change the world spawn"), [$operatorRoot]); - - $spawnpointRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_SPAWNPOINT); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER, "Allows the user to change the respawn point of other players"), [$operatorRoot, $spawnpointRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, "Allows the user to change their own respawn point"), [$operatorRoot, $spawnpointRoot]); - + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER, "Allows the user to change the respawn point of other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, "Allows the user to change their own respawn point"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_STATUS, "Allows the user to view the server performance"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_STOP, "Allows the user to stop the server"), [$operatorRoot]); - - $teleportRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_TELEPORT); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_OTHER, "Allows the user to teleport other players"), [$operatorRoot, $teleportRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_SELF, "Allows the user to teleport themselves"), [$operatorRoot, $teleportRoot]); - + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_OTHER, "Allows the user to teleport other players"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_SELF, "Allows the user to teleport themselves"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELL, "Allows the user to privately message another player"), [$everyoneRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_ADD, "Allows the user to fast-forward time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_QUERY, "Allows the user query the time"), [$operatorRoot]); @@ -119,11 +97,8 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_START, "Allows the user to restart the time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_STOP, "Allows the user to stop the time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIMINGS, "Allows the user to record timings to analyse server performance"), [$operatorRoot]); - - $titleRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_TITLE); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_OTHER, "Allows the user to send a title to the specified player"), [$operatorRoot, $titleRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_SELF, "Allows the user to send a title to themselves"), [$operatorRoot, $titleRoot]); - + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_OTHER, "Allows the user to send a title to the specified player"), [$operatorRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_SELF, "Allows the user to send a title to themselves"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TRANSFERSERVER, "Allows the user to transfer self to another server"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_UNBAN_IP, "Allows the user to unban IP addresses"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_UNBAN_PLAYER, "Allows the user to unban players"), [$operatorRoot]); From 8fd4918429651f01ba3b5440646496930bd40284 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 25 Dec 2022 18:26:53 +0000 Subject: [PATCH 0466/1858] Use Filesystem::fileGetContents() in more places --- src/data/bedrock/ItemTagToIdMap.php | 5 ++--- .../block/upgrade/BlockStateUpgradeSchemaUtils.php | 9 ++------- src/data/bedrock/item/BlockItemIdMap.php | 5 ++--- .../item/upgrade/ItemIdMetaUpgradeSchemaUtils.php | 9 ++------- src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php | 4 ++-- src/world/format/io/GlobalBlockStateHandlers.php | 7 +++---- tools/generate-block-palette-spec.php | 5 ++--- tools/generate-blockstate-upgrade-schema.php | 9 ++------- tools/generate-item-upgrade-schema.php | 6 +++--- 9 files changed, 20 insertions(+), 39 deletions(-) diff --git a/src/data/bedrock/ItemTagToIdMap.php b/src/data/bedrock/ItemTagToIdMap.php index 0782ff424f..9190fa28be 100644 --- a/src/data/bedrock/ItemTagToIdMap.php +++ b/src/data/bedrock/ItemTagToIdMap.php @@ -23,13 +23,12 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; -use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_keys; -use function file_get_contents; use function gettype; use function is_array; use function is_string; @@ -46,7 +45,7 @@ final class ItemTagToIdMap{ use SingletonTrait; private static function make() : self{ - $map = json_decode(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join(BEDROCK_DATA_PATH, 'item_tags.json'))), true, flags: JSON_THROW_ON_ERROR); + $map = json_decode(Filesystem::fileGetContents(Path::join(BEDROCK_DATA_PATH, 'item_tags.json')), true, flags: JSON_THROW_ON_ERROR); if(!is_array($map)){ throw new AssumptionFailedError("Invalid item tag map, expected array"); } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 5626354024..27aa5b5103 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -27,16 +27,15 @@ use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModel; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelTag; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; -use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_map; use function count; -use function file_get_contents; use function get_debug_type; use function gettype; use function implode; @@ -275,11 +274,7 @@ final class BlockStateUpgradeSchemaUtils{ $fullPath = Path::join($path, $filename); - try{ - $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); - }catch(\ErrorException $e){ - throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); - } + $raw = Filesystem::fileGetContents($fullPath); try{ $schema = self::loadSchemaFromString($raw, $priority); diff --git a/src/data/bedrock/item/BlockItemIdMap.php b/src/data/bedrock/item/BlockItemIdMap.php index d012fe3cb2..58a155a5a7 100644 --- a/src/data/bedrock/item/BlockItemIdMap.php +++ b/src/data/bedrock/item/BlockItemIdMap.php @@ -24,11 +24,10 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; -use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_flip; -use function file_get_contents; use function is_array; use function json_decode; use const JSON_THROW_ON_ERROR; @@ -42,7 +41,7 @@ final class BlockItemIdMap{ private static function make() : self{ $map = json_decode( - Utils::assumeNotFalse(file_get_contents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), "Missing required resource file"), + Filesystem::fileGetContents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), associative: true, flags: JSON_THROW_ON_ERROR ); diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php index c7d5d15771..6aade2eaa8 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -24,9 +24,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\data\bedrock\item\upgrade\model\ItemIdMetaUpgradeSchemaModel; -use pocketmine\errorhandler\ErrorToExceptionHandler; +use pocketmine\utils\Filesystem; use Symfony\Component\Filesystem\Path; -use function file_get_contents; use function gettype; use function is_object; use function json_decode; @@ -60,11 +59,7 @@ final class ItemIdMetaUpgradeSchemaUtils{ $fullPath = Path::join($path, $filename); - try{ - $raw = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($fullPath)); - }catch(\ErrorException $e){ - throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); - } + $raw = Filesystem::fileGetContents($fullPath); try{ $schema = self::loadSchemaFromString($raw, $priority); diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index 9e5c86a3d5..2aac8de64e 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -24,10 +24,10 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; -use function file_get_contents; use function is_array; use function is_string; use function json_decode; @@ -47,7 +47,7 @@ final class R12ItemIdToBlockIdMap{ private static function make() : self{ $map = json_decode( - Utils::assumeNotFalse(file_get_contents(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, '1.12.0_item_id_to_block_id_map.json')), "Missing required resource file"), + Filesystem::fileGetContents(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, '1.12.0_item_id_to_block_id_map.json')), associative: true, flags: JSON_THROW_ON_ERROR ); diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 36202fe9f9..d22eb368bb 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -32,9 +32,8 @@ use pocketmine\data\bedrock\block\upgrade\BlockIdMetaUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; -use pocketmine\errorhandler\ErrorToExceptionHandler; +use pocketmine\utils\Filesystem; use Symfony\Component\Filesystem\Path; -use function file_get_contents; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; /** @@ -69,10 +68,10 @@ final class GlobalBlockStateHandlers{ )); self::$blockDataUpgrader = new BlockDataUpgrader( BlockIdMetaUpgrader::loadFromString( - ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join( + Filesystem::fileGetContents(Path::join( BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, '1.12.0_to_1.18.10_blockstate_map.bin' - ))), + )), LegacyBlockIdToStringIdMap::getInstance(), $blockStateUpgrader ), diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index bb8505b779..6217d54378 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -23,18 +23,17 @@ declare(strict_types=1); namespace pocketmine\tools\generate_block_palette_spec; -use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use function array_values; use function count; use function dirname; -use function file_get_contents; use function file_put_contents; use function fwrite; use function get_class; @@ -54,7 +53,7 @@ if(count($argv) !== 3){ [, $inputFile, $outputFile] = $argv; try{ - $states = BlockStateDictionary::loadPaletteFromString(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))); + $states = BlockStateDictionary::loadPaletteFromString(Filesystem::fileGetContents($inputFile)); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index abf0be7975..f052432640 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -28,15 +28,14 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; -use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\tag\Tag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use function array_key_first; use function count; use function dirname; -use function file_get_contents; use function file_put_contents; use function fwrite; use function json_encode; @@ -59,11 +58,7 @@ class BlockStateMapping{ * @phpstan-return array> */ function loadUpgradeTable(string $file, bool $reverse) : array{ - try{ - $contents = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($file)); - }catch(\ErrorException $e){ - throw new \RuntimeException("Failed loading mapping table file $file: " . $e->getMessage(), 0, $e); - } + $contents = Filesystem::fileGetContents($file); $data = (new NetworkNbtSerializer())->readMultiple($contents); $result = []; diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php index 0f59bebe01..c6096bafba 100644 --- a/tools/generate-item-upgrade-schema.php +++ b/tools/generate-item-upgrade-schema.php @@ -30,10 +30,10 @@ declare(strict_types=1); namespace pocketmine\tools\generate_item_upgrade_schema; use pocketmine\errorhandler\ErrorToExceptionHandler; +use pocketmine\utils\Filesystem; use Symfony\Component\Filesystem\Path; use function count; use function dirname; -use function file_get_contents; use function file_put_contents; use function is_array; use function json_decode; @@ -55,7 +55,7 @@ if(count($argv) !== 4){ [, $mappingTableFile, $upgradeSchemasDir, $outputFile] = $argv; -$target = json_decode(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($mappingTableFile)), true, JSON_THROW_ON_ERROR); +$target = json_decode(Filesystem::fileGetContents($mappingTableFile), true, JSON_THROW_ON_ERROR); if(!is_array($target)){ \GlobalLogger::get()->error("Invalid mapping table file"); exit(1); @@ -69,7 +69,7 @@ foreach($files as $file){ continue; } \GlobalLogger::get()->info("Processing schema file $file"); - $data = json_decode(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join($upgradeSchemasDir, $file))), associative: true, flags: JSON_THROW_ON_ERROR); + $data = json_decode(Filesystem::fileGetContents(Path::join($upgradeSchemasDir, $file)), associative: true, flags: JSON_THROW_ON_ERROR); if(!is_array($data)){ \GlobalLogger::get()->error("Invalid schema file $file"); exit(1); From c1ba735c9e9b68416b7e50d56ab37e16691d7234 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 18:05:34 +0000 Subject: [PATCH 0467/1858] Move common protocol disconnection logic to NetworkSession --- src/network/mcpe/NetworkSession.php | 9 ++++++++- src/network/mcpe/handler/LoginPacketHandler.php | 10 +--------- .../mcpe/handler/SessionStartPacketHandler.php | 12 +----------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 29a3bff413..6ac31cd9f3 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -74,6 +74,7 @@ use pocketmine\network\mcpe\protocol\PacketDecodeException; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayStatusPacket; +use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\RemoveActorPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; @@ -201,7 +202,6 @@ class NetworkSession{ $this->connectTime = time(); $this->setHandler(new SessionStartPacketHandler( - $this->server, $this, fn() => $this->onSessionStartSuccess() )); @@ -581,6 +581,13 @@ class NetworkSession{ }, $reason); } + public function disconnectIncompatibleProtocol(int $protocolVersion) : void{ + $this->tryDisconnect( + fn() => $this->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true), + $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion)) + ); + } + /** * Instructs the remote client to connect to a different server. */ diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 11e5b4af44..07ca46b392 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -25,7 +25,6 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\entity\InvalidSkinException; use pocketmine\event\player\PlayerPreLoginEvent; -use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\KnownTranslationKeys; use pocketmine\network\mcpe\auth\ProcessLoginTask; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; @@ -33,7 +32,6 @@ use pocketmine\network\mcpe\JwtException; use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\LoginPacket; -use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\types\login\AuthenticationData; use pocketmine\network\mcpe\protocol\types\login\ClientData; @@ -64,13 +62,7 @@ class LoginPacketHandler extends PacketHandler{ public function handleLogin(LoginPacket $packet) : bool{ if(!$this->isCompatibleProtocol($packet->protocol)){ - $this->session->sendDataPacket(PlayStatusPacket::create($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true); - - //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) - $this->session->disconnect( - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $packet->protocol)), - false - ); + $this->session->disconnectIncompatibleProtocol($packet->protocol); return true; } diff --git a/src/network/mcpe/handler/SessionStartPacketHandler.php b/src/network/mcpe/handler/SessionStartPacketHandler.php index 687422de20..dd7ae47a85 100644 --- a/src/network/mcpe/handler/SessionStartPacketHandler.php +++ b/src/network/mcpe/handler/SessionStartPacketHandler.php @@ -23,14 +23,11 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; -use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\NetworkSettingsPacket; -use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\RequestNetworkSettingsPacket; use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; -use pocketmine\Server; final class SessionStartPacketHandler extends PacketHandler{ @@ -38,7 +35,6 @@ final class SessionStartPacketHandler extends PacketHandler{ * @phpstan-param \Closure() : void $onSuccess */ public function __construct( - private Server $server, private NetworkSession $session, private \Closure $onSuccess ){} @@ -46,13 +42,7 @@ final class SessionStartPacketHandler extends PacketHandler{ public function handleRequestNetworkSettings(RequestNetworkSettingsPacket $packet) : bool{ $protocolVersion = $packet->getProtocolVersion(); if(!$this->isCompatibleProtocol($protocolVersion)){ - $this->session->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true); - - //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) - $this->session->disconnect( - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion)), - false - ); + $this->session->disconnectIncompatibleProtocol($protocolVersion); return true; } From 9796dfd4d910b0269ffd03a2d9ad567478c5c616 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 18:32:22 +0000 Subject: [PATCH 0468/1858] Fix build --- src/network/mcpe/NetworkSession.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 6ac31cd9f3..c3f510b04d 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -583,7 +583,9 @@ class NetworkSession{ public function disconnectIncompatibleProtocol(int $protocolVersion) : void{ $this->tryDisconnect( - fn() => $this->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true), + function() use ($protocolVersion) : void{ + $this->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true); + }, $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion)) ); } From f173b91ca19927117fb53aad4d3025d10c1fb907 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 18:36:07 +0000 Subject: [PATCH 0469/1858] Introduce support for Translatable disconnection messages this allows localizing disconnection screens (at least, once #4512 has been addressed) and the disconnect reasons shown on the console. We already had disconnect messages implicitly localized in a few places, so this is just formalizing it. This does break BC with any code that previously passed translation keys as the disconnect screen message, because they'll no longer be translated (only Translatables will be translatated now). --- .../player/PlayerDuplicateLoginEvent.php | 7 ++-- src/event/player/PlayerKickEvent.php | 6 +-- src/event/player/PlayerPreLoginEvent.php | 9 ++-- src/event/player/PlayerQuitEvent.php | 4 +- src/network/NetworkSessionManager.php | 3 +- src/network/mcpe/NetworkSession.php | 41 ++++++++++++------- src/network/mcpe/auth/ProcessLoginTask.php | 32 ++++++++------- .../mcpe/auth/VerifyLoginException.php | 10 +++++ .../mcpe/handler/LoginPacketHandler.php | 13 +++--- .../handler/ResourcePacksPacketHandler.php | 4 +- src/player/Player.php | 12 +++--- 11 files changed, 86 insertions(+), 55 deletions(-) diff --git a/src/event/player/PlayerDuplicateLoginEvent.php b/src/event/player/PlayerDuplicateLoginEvent.php index 0de9ace002..c7c1ece681 100644 --- a/src/event/player/PlayerDuplicateLoginEvent.php +++ b/src/event/player/PlayerDuplicateLoginEvent.php @@ -26,6 +26,7 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; use pocketmine\event\Event; +use pocketmine\lang\Translatable; use pocketmine\network\mcpe\NetworkSession; /** @@ -35,7 +36,7 @@ use pocketmine\network\mcpe\NetworkSession; class PlayerDuplicateLoginEvent extends Event implements Cancellable{ use CancellableTrait; - private string $disconnectMessage = "Logged in from another location"; + private Translatable|string $disconnectMessage = "Logged in from another location"; public function __construct( private NetworkSession $connectingSession, @@ -53,11 +54,11 @@ class PlayerDuplicateLoginEvent extends Event implements Cancellable{ /** * Returns the message shown to the session which gets disconnected. */ - public function getDisconnectMessage() : string{ + public function getDisconnectMessage() : Translatable|string{ return $this->disconnectMessage; } - public function setDisconnectMessage(string $message) : void{ + public function setDisconnectMessage(Translatable|string $message) : void{ $this->disconnectMessage = $message; } } diff --git a/src/event/player/PlayerKickEvent.php b/src/event/player/PlayerKickEvent.php index 4d98d24e8c..11f77e4de8 100644 --- a/src/event/player/PlayerKickEvent.php +++ b/src/event/player/PlayerKickEvent.php @@ -36,7 +36,7 @@ class PlayerKickEvent extends PlayerEvent implements Cancellable{ public function __construct( Player $player, - protected string $reason, + protected Translatable|string $reason, protected Translatable|string $quitMessage ){ $this->player = $player; @@ -46,7 +46,7 @@ class PlayerKickEvent extends PlayerEvent implements Cancellable{ * Sets the message shown on the kicked player's disconnection screen. * This message is also displayed in the console and server log. */ - public function setReason(string $reason) : void{ + public function setReason(Translatable|string $reason) : void{ $this->reason = $reason; } @@ -55,7 +55,7 @@ class PlayerKickEvent extends PlayerEvent implements Cancellable{ * This message is also displayed in the console and server log. * When kicked by the /kick command, the default is something like "Kicked by admin.". */ - public function getReason() : string{ + public function getReason() : Translatable|string{ return $this->reason; } diff --git a/src/event/player/PlayerPreLoginEvent.php b/src/event/player/PlayerPreLoginEvent.php index 9403691430..537aeba661 100644 --- a/src/event/player/PlayerPreLoginEvent.php +++ b/src/event/player/PlayerPreLoginEvent.php @@ -25,6 +25,7 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\Event; +use pocketmine\lang\Translatable; use pocketmine\player\PlayerInfo; use function array_keys; use function count; @@ -52,7 +53,7 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ self::KICK_REASON_BANNED ]; - /** @var string[] reason const => associated message */ + /** @var Translatable[]|string[] reason const => associated message */ protected array $kickReasons = []; public function __construct( @@ -107,7 +108,7 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ * Sets a reason to disallow the player to continue continue authenticating, with a message. * This can also be used to change kick messages for already-set flags. */ - public function setKickReason(int $flag, string $message) : void{ + public function setKickReason(int $flag, Translatable|string $message) : void{ $this->kickReasons[$flag] = $message; } @@ -138,7 +139,7 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ /** * Returns the kick message provided for the given kick flag, or null if not set. */ - public function getKickMessage(int $flag) : ?string{ + public function getKickMessage(int $flag) : Translatable|string|null{ return $this->kickReasons[$flag] ?? null; } @@ -150,7 +151,7 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ * * @see PlayerPreLoginEvent::KICK_REASON_PRIORITY */ - public function getFinalKickMessage() : string{ + public function getFinalKickMessage() : Translatable|string{ foreach(self::KICK_REASON_PRIORITY as $p){ if(isset($this->kickReasons[$p])){ return $this->kickReasons[$p]; diff --git a/src/event/player/PlayerQuitEvent.php b/src/event/player/PlayerQuitEvent.php index ce1c807874..13b48d6c02 100644 --- a/src/event/player/PlayerQuitEvent.php +++ b/src/event/player/PlayerQuitEvent.php @@ -40,7 +40,7 @@ class PlayerQuitEvent extends PlayerEvent{ public function __construct( Player $player, protected Translatable|string $quitMessage, - protected string $quitReason + protected Translatable|string $quitReason ){ $this->player = $player; } @@ -62,7 +62,7 @@ class PlayerQuitEvent extends PlayerEvent{ /** * Returns the disconnect reason shown in the server log and on the console. */ - public function getQuitReason() : string{ + public function getQuitReason() : Translatable|string{ return $this->quitReason; } } diff --git a/src/network/NetworkSessionManager.php b/src/network/NetworkSessionManager.php index de1b7bfe31..99a5a6a79c 100644 --- a/src/network/NetworkSessionManager.php +++ b/src/network/NetworkSessionManager.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network; +use pocketmine\lang\Translatable; use pocketmine\network\mcpe\NetworkSession; use function count; use function spl_object_id; @@ -74,7 +75,7 @@ class NetworkSessionManager{ /** * Terminates all connected sessions with the given reason. */ - public function close(string $reason = "") : void{ + public function close(Translatable|string $reason = "") : void{ foreach($this->sessions as $session){ $session->disconnect($reason); } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index c3f510b04d..5b3d6bb3fe 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -34,7 +34,6 @@ use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\form\Form; use pocketmine\lang\KnownTranslationFactory; -use pocketmine\lang\KnownTranslationKeys; use pocketmine\lang\Translatable; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; @@ -230,9 +229,7 @@ class NetworkSession{ $this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET); $this->logger->setPrefix($this->getLogPrefix()); }, - function(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void{ - $this->setAuthenticationStatus($isAuthenticated, $authRequired, $error, $clientPubKey); - } + \Closure::fromCallable([$this, "setAuthenticationStatus"]) )); } @@ -542,7 +539,7 @@ class NetworkSession{ /** * @phpstan-param \Closure() : void $func */ - private function tryDisconnect(\Closure $func, string $reason) : void{ + private function tryDisconnect(\Closure $func, Translatable|string $reason) : void{ if($this->connected && !$this->disconnectGuard){ $this->disconnectGuard = true; $func(); @@ -555,7 +552,14 @@ class NetworkSession{ $this->disposeHooks->clear(); $this->setHandler(null); $this->connected = false; - $this->logger->info("Session closed due to $reason"); + + if($reason instanceof Translatable){ + $translated = $this->server->getLanguage()->translate($reason); + }else{ + $translated = $reason; + } + //TODO: l10n + $this->logger->info("Session closed due to $translated"); } } @@ -567,13 +571,22 @@ class NetworkSession{ $this->invManager = null; } + private function sendDisconnectPacket(Translatable|string $reason) : void{ + if($reason instanceof Translatable){ + $translated = $this->server->getLanguage()->translate($reason); + }else{ + $translated = $reason; + } + $this->sendDataPacket(DisconnectPacket::create($translated)); + } + /** * Disconnects the session, destroying the associated player (if it exists). */ - public function disconnect(string $reason, bool $notify = true) : void{ + public function disconnect(Translatable|string $reason, bool $notify = true) : void{ $this->tryDisconnect(function() use ($reason, $notify) : void{ if($notify){ - $this->sendDataPacket(DisconnectPacket::create($reason)); + $this->sendDisconnectPacket($reason); } if($this->player !== null){ $this->player->onPostDisconnect($reason, null); @@ -593,7 +606,7 @@ class NetworkSession{ /** * Instructs the remote client to connect to a different server. */ - public function transfer(string $ip, int $port, string $reason = "transfer") : void{ + public function transfer(string $ip, int $port, Translatable|string $reason = "transfer") : void{ $this->tryDisconnect(function() use ($ip, $port, $reason) : void{ $this->sendDataPacket(TransferPacket::create($ip, $port), true); if($this->player !== null){ @@ -605,9 +618,9 @@ class NetworkSession{ /** * Called by the Player when it is closed (for example due to getting kicked). */ - public function onPlayerDestroyed(string $reason) : void{ + public function onPlayerDestroyed(Translatable|string $reason) : void{ $this->tryDisconnect(function() use ($reason) : void{ - $this->sendDataPacket(DisconnectPacket::create($reason)); + $this->sendDisconnectPacket($reason); }, $reason); } @@ -623,7 +636,7 @@ class NetworkSession{ }, $reason); } - private function setAuthenticationStatus(bool $authenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void{ + private function setAuthenticationStatus(bool $authenticated, bool $authRequired, Translatable|string|null $error, ?string $clientPubKey) : void{ if(!$this->connected){ return; } @@ -636,7 +649,7 @@ class NetworkSession{ } if($error !== null){ - $this->disconnect($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_invalidSession($this->server->getLanguage()->translateString($error)))); + $this->disconnect(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error)); return; } @@ -645,7 +658,7 @@ class NetworkSession{ if(!$this->authenticated){ if($authRequired){ - $this->disconnect(KnownTranslationKeys::DISCONNECTIONSCREEN_NOTAUTHENTICATED); + $this->disconnect(KnownTranslationFactory::disconnectionScreen_notAuthenticated()); return; } if($this->info instanceof XboxLivePlayerInfo){ diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 553fef68f2..8df9886d32 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\auth; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\lang\KnownTranslationFactory; +use pocketmine\lang\Translatable; use pocketmine\network\mcpe\JwtException; use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\protocol\types\login\JwtChainLinkBody; @@ -49,7 +50,7 @@ class ProcessLoginTask extends AsyncTask{ * keychain is invalid for whatever reason (bad signature, not in nbf-exp window, etc). If this is non-null, the * keychain might have been tampered with. The player will always be disconnected if this is non-null. */ - private ?string $error = "Unknown"; + private Translatable|string|null $error = "Unknown"; /** * Whether the player is logged into Xbox Live. This is true if any link in the keychain is signed with the Mojang * root public key. @@ -59,7 +60,7 @@ class ProcessLoginTask extends AsyncTask{ /** * @param string[] $chainJwts - * @phpstan-param \Closure(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPublicKey) : void $onCompletion + * @phpstan-param \Closure(bool $isAuthenticated, bool $authRequired, Translatable|string|null $error, ?string $clientPublicKey) : void $onCompletion */ public function __construct( array $chainJwts, @@ -76,7 +77,7 @@ class ProcessLoginTask extends AsyncTask{ $this->clientPublicKey = $this->validateChain(); $this->error = null; }catch(VerifyLoginException $e){ - $this->error = $e->getMessage(); + $this->error = $e->getDisconnectMessage(); } } @@ -109,7 +110,8 @@ class ProcessLoginTask extends AsyncTask{ try{ [$headersArray, $claimsArray, ] = JwtUtils::parse($jwt); }catch(JwtException $e){ - throw new VerifyLoginException("Failed to parse JWT: " . $e->getMessage(), 0, $e); + //TODO: we shouldn't be showing internal information like this to the client + throw new VerifyLoginException("Failed to parse JWT: " . $e->getMessage(), null, 0, $e); } $mapper = new \JsonMapper(); @@ -121,21 +123,23 @@ class ProcessLoginTask extends AsyncTask{ /** @var JwtHeader $headers */ $headers = $mapper->map($headersArray, new JwtHeader()); }catch(\JsonMapper_Exception $e){ - throw new VerifyLoginException("Invalid JWT header: " . $e->getMessage(), 0, $e); + //TODO: we shouldn't be showing internal information like this to the client + throw new VerifyLoginException("Invalid JWT header: " . $e->getMessage(), null, 0, $e); } $headerDerKey = base64_decode($headers->x5u, true); if($headerDerKey === false){ + //TODO: we shouldn't be showing internal information like this to the client throw new VerifyLoginException("Invalid JWT public key: base64 decoding error decoding x5u"); } if($currentPublicKey === null){ if(!$first){ - throw new VerifyLoginException(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_MISSINGKEY); + throw new VerifyLoginException("Missing JWT public key", KnownTranslationFactory::pocketmine_disconnect_invalidSession_missingKey()); } }elseif($headerDerKey !== $currentPublicKey){ //Fast path: if the header key doesn't match what we expected, the signature isn't going to validate anyway - throw new VerifyLoginException(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE); + throw new VerifyLoginException("Invalid JWT signature", KnownTranslationFactory::pocketmine_disconnect_invalidSession_badSignature()); } try{ @@ -145,10 +149,10 @@ class ProcessLoginTask extends AsyncTask{ } try{ if(!JwtUtils::verify($jwt, $signingKeyOpenSSL)){ - throw new VerifyLoginException(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE); + throw new VerifyLoginException("Invalid JWT signature", KnownTranslationFactory::pocketmine_disconnect_invalidSession_badSignature()); } }catch(JwtException $e){ - throw new VerifyLoginException($e->getMessage(), 0, $e); + throw new VerifyLoginException($e->getMessage(), null, 0, $e); } if($headers->x5u === self::MOJANG_ROOT_PUBLIC_KEY){ @@ -164,16 +168,16 @@ class ProcessLoginTask extends AsyncTask{ /** @var JwtChainLinkBody $claims */ $claims = $mapper->map($claimsArray, new JwtChainLinkBody()); }catch(\JsonMapper_Exception $e){ - throw new VerifyLoginException("Invalid chain link body: " . $e->getMessage(), 0, $e); + throw new VerifyLoginException("Invalid chain link body: " . $e->getMessage(), null, 0, $e); } $time = time(); if(isset($claims->nbf) && $claims->nbf > $time + self::CLOCK_DRIFT_MAX){ - throw new VerifyLoginException(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_TOOEARLY); + throw new VerifyLoginException("JWT not yet valid", KnownTranslationFactory::pocketmine_disconnect_invalidSession_tooEarly()); } if(isset($claims->exp) && $claims->exp < $time - self::CLOCK_DRIFT_MAX){ - throw new VerifyLoginException(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE); + throw new VerifyLoginException("JWT expired", KnownTranslationFactory::pocketmine_disconnect_invalidSession_tooLate()); } if(isset($claims->identityPublicKey)){ @@ -188,7 +192,7 @@ class ProcessLoginTask extends AsyncTask{ public function onCompletion() : void{ /** * @var \Closure $callback - * @phpstan-var \Closure(bool, bool, ?string, ?string) : void $callback + * @phpstan-var \Closure(bool, bool, Translatable|string|null, ?string) : void $callback */ $callback = $this->fetchLocal(self::TLS_KEY_ON_COMPLETION); $callback($this->authenticated, $this->authRequired, $this->error, $this->clientPublicKey); diff --git a/src/network/mcpe/auth/VerifyLoginException.php b/src/network/mcpe/auth/VerifyLoginException.php index b112215a81..b58c97416c 100644 --- a/src/network/mcpe/auth/VerifyLoginException.php +++ b/src/network/mcpe/auth/VerifyLoginException.php @@ -23,6 +23,16 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\auth; +use pocketmine\lang\Translatable; + class VerifyLoginException extends \RuntimeException{ + private Translatable|string $disconnectMessage; + + public function __construct(string $message, Translatable|string|null $disconnectMessage = null, int $code = 0, ?\Throwable $previous = null){ + parent::__construct($message, $code, $previous); + $this->disconnectMessage = $disconnectMessage ?? $message; + } + + public function getDisconnectMessage() : Translatable|string{ return $this->disconnectMessage; } } diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 07ca46b392..1c7e59b690 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -25,7 +25,8 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\entity\InvalidSkinException; use pocketmine\event\player\PlayerPreLoginEvent; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\lang\KnownTranslationFactory; +use pocketmine\lang\Translatable; use pocketmine\network\mcpe\auth\ProcessLoginTask; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\JwtException; @@ -51,7 +52,7 @@ use function is_array; class LoginPacketHandler extends PacketHandler{ /** * @phpstan-param \Closure(PlayerInfo) : void $playerInfoConsumer - * @phpstan-param \Closure(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void $authCallback + * @phpstan-param \Closure(bool $isAuthenticated, bool $authRequired, Translatable|string|null $error, ?string $clientPubKey) : void $authCallback */ public function __construct( private Server $server, @@ -70,7 +71,7 @@ class LoginPacketHandler extends PacketHandler{ $extraData = $this->fetchAuthData($packet->chainDataJwt); if(!Player::isValidUserName($extraData->displayName)){ - $this->session->disconnect(KnownTranslationKeys::DISCONNECTIONSCREEN_INVALIDNAME); + $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidName()); return true; } @@ -80,7 +81,7 @@ class LoginPacketHandler extends PacketHandler{ $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); - $this->session->disconnect(KnownTranslationKeys::DISCONNECTIONSCREEN_INVALIDSKIN); + $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidSkin()); return true; } @@ -116,12 +117,14 @@ class LoginPacketHandler extends PacketHandler{ $this->server->requiresAuthentication() ); if($this->server->getNetwork()->getConnectionCount() > $this->server->getMaxPlayers()){ - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationKeys::DISCONNECTIONSCREEN_SERVERFULL); + $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull()); } if(!$this->server->isWhitelisted($playerInfo->getUsername())){ + //TODO: l10n $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, "Server is whitelisted"); } if($this->server->getNameBans()->isBanned($playerInfo->getUsername()) || $this->server->getIPBans()->isBanned($this->session->getIp())){ + //TODO: l10n $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, "You are banned"); } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index d1ba857240..0dfe15ef44 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\ResourcePackChunkDataPacket; @@ -86,7 +86,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ private function disconnectWithError(string $error) : void{ $this->session->getLogger()->error("Error downloading resource packs: " . $error); - $this->session->disconnect(KnownTranslationKeys::DISCONNECTIONSCREEN_RESOURCEPACK); + $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_resourcePack()); } public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{ diff --git a/src/player/Player.php b/src/player/Player.php index 507747b0fc..5819fa8cb9 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -96,7 +96,6 @@ use pocketmine\item\Item; use pocketmine\item\ItemUseResult; use pocketmine\item\Releasable; use pocketmine\lang\KnownTranslationFactory; -use pocketmine\lang\KnownTranslationKeys; use pocketmine\lang\Language; use pocketmine\lang\Translatable; use pocketmine\math\Vector3; @@ -2102,13 +2101,13 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ /** * Kicks a player from the server */ - public function kick(string $reason = "", Translatable|string|null $quitMessage = null) : bool{ + public function kick(Translatable|string $reason = "", Translatable|string|null $quitMessage = null) : bool{ $ev = new PlayerKickEvent($this, $reason, $quitMessage ?? $this->getLeaveMessage()); $ev->call(); if(!$ev->isCancelled()){ $reason = $ev->getReason(); if($reason === ""){ - $reason = KnownTranslationKeys::DISCONNECTIONSCREEN_NOREASON; + $reason = KnownTranslationFactory::disconnectionScreen_noReason(); } $this->disconnect($reason, $ev->getQuitMessage()); @@ -2127,10 +2126,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * * Note for internals developers: Do not call this from network sessions. It will cause a feedback loop. * - * @param string $reason Shown to the player, usually this will appear on their disconnect screen. + * @param Translatable|string $reason Shown on the disconnect screen, and in the server log * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) */ - public function disconnect(string $reason, Translatable|string|null $quitMessage = null) : void{ + public function disconnect(Translatable|string $reason, Translatable|string|null $quitMessage = null) : void{ if(!$this->isConnected()){ return; } @@ -2143,10 +2142,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @internal * This method executes post-disconnect actions and cleanups. * - * @param string $reason Shown to the player, usually this will appear on their disconnect screen. * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) */ - public function onPostDisconnect(string $reason, Translatable|string|null $quitMessage) : void{ + public function onPostDisconnect(Translatable|string $reason, Translatable|string|null $quitMessage) : void{ if($this->isConnected()){ throw new \LogicException("Player is still connected"); } From 6b8b7311f09b10eefbbf7b5b10874b2338b602ee Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 18:57:32 +0000 Subject: [PATCH 0470/1858] Support localized disconnect screen messages for PlayerLoginEvent --- src/event/player/PlayerLoginEvent.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/event/player/PlayerLoginEvent.php b/src/event/player/PlayerLoginEvent.php index e8edc5db9f..734e548232 100644 --- a/src/event/player/PlayerLoginEvent.php +++ b/src/event/player/PlayerLoginEvent.php @@ -25,6 +25,7 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; +use pocketmine\lang\Translatable; use pocketmine\player\Player; /** @@ -37,16 +38,16 @@ class PlayerLoginEvent extends PlayerEvent implements Cancellable{ public function __construct( Player $player, - protected string $kickMessage + protected Translatable|string $kickMessage ){ $this->player = $player; } - public function setKickMessage(string $kickMessage) : void{ + public function setKickMessage(Translatable|string $kickMessage) : void{ $this->kickMessage = $kickMessage; } - public function getKickMessage() : string{ + public function getKickMessage() : Translatable|string{ return $this->kickMessage; } } From 7ac6bd79a9fda0a8a335b608bb7fc3c85d5fcdbc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 20:05:59 +0000 Subject: [PATCH 0471/1858] Localized remaining disconnection screens (except one or two that should never actually happen) --- composer.json | 2 +- composer.lock | 14 +- src/Server.php | 3 +- src/command/defaults/BanCommand.php | 2 +- src/command/defaults/BanIpCommand.php | 2 +- src/command/defaults/KickCommand.php | 2 +- src/command/defaults/WhitelistCommand.php | 5 +- .../player/PlayerDuplicateLoginEvent.php | 7 +- src/event/player/PlayerTransferEvent.php | 7 +- src/lang/KnownTranslationFactory.php | 341 ++++++++++++++++++ src/lang/KnownTranslationKeys.php | 82 +++++ src/network/mcpe/NetworkSession.php | 18 +- .../mcpe/handler/LoginPacketHandler.php | 21 +- .../handler/ResourcePacksPacketHandler.php | 2 +- src/network/mcpe/raklib/RakLibInterface.php | 9 +- src/player/Player.php | 12 +- 16 files changed, 486 insertions(+), 43 deletions(-) diff --git a/composer.json b/composer.json index ad19b71aac..db0f8a7912 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "pocketmine/classloader": "^0.2.0", "pocketmine/color": "^0.2.0", "pocketmine/errorhandler": "^0.6.0", - "pocketmine/locale-data": "~2.11.0", + "pocketmine/locale-data": "~2.15.0", "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0", "pocketmine/math": "^0.4.0", diff --git a/composer.lock b/composer.lock index 75639aa994..b95eaa9a0a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d4da4bb4787764fbe706a04311c3cbf", + "content-hash": "d833363f328eda3b1e080c3c5a7c76a4", "packages": [ { "name": "adhocore/json-comment", @@ -591,16 +591,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.11.0", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "4b33d8fa53eda53d9662a7478806ebae2e4a5c53" + "reference": "87feaefdd8364730a2350e58fa274b1b493a9d3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/4b33d8fa53eda53d9662a7478806ebae2e4a5c53", - "reference": "4b33d8fa53eda53d9662a7478806ebae2e4a5c53", + "url": "https://api.github.com/repos/pmmp/Language/zipball/87feaefdd8364730a2350e58fa274b1b493a9d3f", + "reference": "87feaefdd8364730a2350e58fa274b1b493a9d3f", "shasum": "" }, "type": "library", @@ -608,9 +608,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.11.0" + "source": "https://github.com/pmmp/Language/tree/2.15.0" }, - "time": "2022-11-25T14:24:34+00:00" + "time": "2022-12-27T19:59:39+00:00" }, { "name": "pocketmine/log", diff --git a/src/Server.php b/src/Server.php index c082f4a1d0..8c1cc71228 100644 --- a/src/Server.php +++ b/src/Server.php @@ -567,7 +567,8 @@ class Server{ }, static function() use ($playerPromiseResolver, $session) : void{ if($session->isConnected()){ - $session->disconnect("Spawn terrain generation failed"); + $session->getLogger()->error("Spawn terrain generation failed"); + $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal()); } $playerPromiseResolver->reject(); } diff --git a/src/command/defaults/BanCommand.php b/src/command/defaults/BanCommand.php index fc3117ae1b..7cc7a8148a 100644 --- a/src/command/defaults/BanCommand.php +++ b/src/command/defaults/BanCommand.php @@ -55,7 +55,7 @@ class BanCommand extends VanillaCommand{ $sender->getServer()->getNameBans()->addBan($name, $reason, null, $sender->getName()); if(($player = $sender->getServer()->getPlayerExact($name)) instanceof Player){ - $player->kick($reason !== "" ? "Banned by admin. Reason: " . $reason : "Banned by admin."); + $player->kick($reason !== "" ? KnownTranslationFactory::pocketmine_disconnect_ban($reason) : KnownTranslationFactory::pocketmine_disconnect_ban_noReason()); } Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_ban_success($player !== null ? $player->getName() : $name)); diff --git a/src/command/defaults/BanIpCommand.php b/src/command/defaults/BanIpCommand.php index 2d8bc0632e..3c8ceceafd 100644 --- a/src/command/defaults/BanIpCommand.php +++ b/src/command/defaults/BanIpCommand.php @@ -78,7 +78,7 @@ class BanIpCommand extends VanillaCommand{ foreach($sender->getServer()->getOnlinePlayers() as $player){ if($player->getNetworkSession()->getIp() === $ip){ - $player->kick("Banned by admin. Reason: " . ($reason !== "" ? $reason : "IP banned.")); + $player->kick(KnownTranslationFactory::pocketmine_disconnect_ban($reason !== "" ? $reason : KnownTranslationFactory::pocketmine_disconnect_ban_ip())); } } diff --git a/src/command/defaults/KickCommand.php b/src/command/defaults/KickCommand.php index 78767b9dab..1bb38d1b20 100644 --- a/src/command/defaults/KickCommand.php +++ b/src/command/defaults/KickCommand.php @@ -55,7 +55,7 @@ class KickCommand extends VanillaCommand{ $reason = trim(implode(" ", $args)); if(($player = $sender->getServer()->getPlayerByPrefix($name)) instanceof Player){ - $player->kick("Kicked by admin." . ($reason !== "" ? " Reason: " . $reason : "")); + $player->kick($reason !== "" ? KnownTranslationFactory::pocketmine_disconnect_kick($reason) : KnownTranslationFactory::pocketmine_disconnect_kick_noReason()); if($reason !== ""){ Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_kick_success_reason($player->getName(), $reason)); }else{ diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index 2b1a90c53f..a69334c4a6 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -122,7 +122,7 @@ class WhitelistCommand extends VanillaCommand{ $server = $sender->getServer(); $server->removeWhitelist($args[1]); if(!$server->isWhitelisted($args[1])){ - $server->getPlayerExact($args[1])?->kick("Server whitelisted."); + $server->getPlayerExact($args[1])?->kick(KnownTranslationFactory::pocketmine_disconnect_kick(KnownTranslationFactory::pocketmine_disconnect_whitelisted())); } Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_whitelist_remove_success($args[1])); } @@ -135,9 +135,10 @@ class WhitelistCommand extends VanillaCommand{ } private function kickNonWhitelistedPlayers(Server $server) : void{ + $message = KnownTranslationFactory::pocketmine_disconnect_kick(KnownTranslationFactory::pocketmine_disconnect_whitelisted()); foreach($server->getOnlinePlayers() as $player){ if(!$server->isWhitelisted($player->getName())){ - $player->kick("Server whitelisted."); + $player->kick($message); } } } diff --git a/src/event/player/PlayerDuplicateLoginEvent.php b/src/event/player/PlayerDuplicateLoginEvent.php index c7c1ece681..53d68bcd0f 100644 --- a/src/event/player/PlayerDuplicateLoginEvent.php +++ b/src/event/player/PlayerDuplicateLoginEvent.php @@ -26,6 +26,7 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; use pocketmine\event\Event; +use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\network\mcpe\NetworkSession; @@ -36,12 +37,14 @@ use pocketmine\network\mcpe\NetworkSession; class PlayerDuplicateLoginEvent extends Event implements Cancellable{ use CancellableTrait; - private Translatable|string $disconnectMessage = "Logged in from another location"; + private Translatable|string $disconnectMessage; public function __construct( private NetworkSession $connectingSession, private NetworkSession $existingSession - ){} + ){ + $this->disconnectMessage = KnownTranslationFactory::disconnectionScreen_loggedinOtherLocation(); + } public function getConnectingSession() : NetworkSession{ return $this->connectingSession; diff --git a/src/event/player/PlayerTransferEvent.php b/src/event/player/PlayerTransferEvent.php index 1e08ec5d7d..5d8c0bb7e1 100644 --- a/src/event/player/PlayerTransferEvent.php +++ b/src/event/player/PlayerTransferEvent.php @@ -25,6 +25,7 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; +use pocketmine\lang\Translatable; use pocketmine\player\Player; /** @@ -37,7 +38,7 @@ class PlayerTransferEvent extends PlayerEvent implements Cancellable{ Player $player, protected string $address, protected int $port, - protected string $message + protected Translatable|string $message ){ $this->player = $player; } @@ -73,14 +74,14 @@ class PlayerTransferEvent extends PlayerEvent implements Cancellable{ /** * Returns the disconnect reason shown in the server log and on the console. */ - public function getMessage() : string{ + public function getMessage() : Translatable|string{ return $this->message; } /** * Sets the disconnect reason shown in the server log and on the console. */ - public function setMessage(string $message) : void{ + public function setMessage(Translatable|string $message) : void{ $this->message = $message; } } diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index f1db1c6d11..584fb342d0 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -661,6 +661,12 @@ final class KnownTranslationFactory{ ]); } + public static function death_attack_fireworks(Translatable|string $param0) : Translatable{ + return new Translatable(KnownTranslationKeys::DEATH_ATTACK_FIREWORKS, [ + 0 => $param0, + ]); + } + public static function death_attack_generic(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::DEATH_ATTACK_GENERIC, [ 0 => $param0, @@ -760,6 +766,10 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_INVALIDSKIN, []); } + public static function disconnectionScreen_loggedinOtherLocation() : Translatable{ + return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_LOGGEDINOTHERLOCATION, []); + } + public static function disconnectionScreen_noReason() : Translatable{ return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_NOREASON, []); } @@ -1574,6 +1584,47 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DEBUG_ENABLE, []); } + public static function pocketmine_disconnect_ban(Translatable|string $reason) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN, [ + "reason" => $reason, + ]); + } + + public static function pocketmine_disconnect_ban_hardcore() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_HARDCORE, []); + } + + public static function pocketmine_disconnect_ban_ip() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_IP, []); + } + + public static function pocketmine_disconnect_ban_noReason() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_NOREASON, []); + } + + public static function pocketmine_disconnect_error(Translatable|string $error, Translatable|string $errorId) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR, [ + "error" => $error, + "errorId" => $errorId, + ]); + } + + public static function pocketmine_disconnect_error_authentication() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION, []); + } + + public static function pocketmine_disconnect_error_badPacket() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_BADPACKET, []); + } + + public static function pocketmine_disconnect_error_internal() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_INTERNAL, []); + } + + public static function pocketmine_disconnect_error_loginTimeout() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT, []); + } + public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ 0 => $param0, @@ -1602,6 +1653,28 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE, []); } + public static function pocketmine_disconnect_kick(Translatable|string $reason) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_KICK, [ + "reason" => $reason, + ]); + } + + public static function pocketmine_disconnect_kick_noReason() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_KICK_NOREASON, []); + } + + public static function pocketmine_disconnect_transfer() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_TRANSFER, []); + } + + public static function pocketmine_disconnect_whitelisted() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_WHITELISTED, []); + } + + public static function pocketmine_disconnect_xblImpersonation() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_XBLIMPERSONATION, []); + } + public static function pocketmine_level_ambiguousFormat(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_LEVEL_AMBIGUOUSFORMAT, [ 0 => $param0, @@ -1707,6 +1780,274 @@ final class KnownTranslationFactory{ ]); } + public static function pocketmine_network_session_close(Translatable|string $reason) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_CLOSE, [ + "reason" => $reason, + ]); + } + + public static function pocketmine_network_session_open() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_OPEN, []); + } + + public static function pocketmine_network_session_playerName(Translatable|string $playerName) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_PLAYERNAME, [ + "playerName" => $playerName, + ]); + } + + public static function pocketmine_permission_broadcast_admin() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_BROADCAST_ADMIN, []); + } + + public static function pocketmine_permission_broadcast_user() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_BROADCAST_USER, []); + } + + public static function pocketmine_permission_command_ban_ip() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_IP, []); + } + + public static function pocketmine_permission_command_ban_list() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_LIST, []); + } + + public static function pocketmine_permission_command_ban_player() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_PLAYER, []); + } + + public static function pocketmine_permission_command_clear_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CLEAR_OTHER, []); + } + + public static function pocketmine_permission_command_clear_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF, []); + } + + public static function pocketmine_permission_command_defaultgamemode() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE, []); + } + + public static function pocketmine_permission_command_difficulty() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DIFFICULTY, []); + } + + public static function pocketmine_permission_command_dumpmemory() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DUMPMEMORY, []); + } + + public static function pocketmine_permission_command_effect_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_EFFECT_OTHER, []); + } + + public static function pocketmine_permission_command_effect_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_EFFECT_SELF, []); + } + + public static function pocketmine_permission_command_enchant_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ENCHANT_OTHER, []); + } + + public static function pocketmine_permission_command_enchant_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ENCHANT_SELF, []); + } + + public static function pocketmine_permission_command_gamemode_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GAMEMODE_OTHER, []); + } + + public static function pocketmine_permission_command_gamemode_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GAMEMODE_SELF, []); + } + + public static function pocketmine_permission_command_gc() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GC, []); + } + + public static function pocketmine_permission_command_give_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GIVE_OTHER, []); + } + + public static function pocketmine_permission_command_give_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GIVE_SELF, []); + } + + public static function pocketmine_permission_command_help() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_HELP, []); + } + + public static function pocketmine_permission_command_kick() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KICK, []); + } + + public static function pocketmine_permission_command_kill_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KILL_OTHER, []); + } + + public static function pocketmine_permission_command_kill_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KILL_SELF, []); + } + + public static function pocketmine_permission_command_list() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_LIST, []); + } + + public static function pocketmine_permission_command_me() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ME, []); + } + + public static function pocketmine_permission_command_op_give() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_OP_GIVE, []); + } + + public static function pocketmine_permission_command_op_take() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_OP_TAKE, []); + } + + public static function pocketmine_permission_command_particle() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_PARTICLE, []); + } + + public static function pocketmine_permission_command_plugins() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_PLUGINS, []); + } + + public static function pocketmine_permission_command_save_disable() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_DISABLE, []); + } + + public static function pocketmine_permission_command_save_enable() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_ENABLE, []); + } + + public static function pocketmine_permission_command_save_perform() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_PERFORM, []); + } + + public static function pocketmine_permission_command_say() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAY, []); + } + + public static function pocketmine_permission_command_seed() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SEED, []); + } + + public static function pocketmine_permission_command_setworldspawn() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SETWORLDSPAWN, []); + } + + public static function pocketmine_permission_command_spawnpoint_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_OTHER, []); + } + + public static function pocketmine_permission_command_spawnpoint_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_SELF, []); + } + + public static function pocketmine_permission_command_status() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_STATUS, []); + } + + public static function pocketmine_permission_command_stop() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_STOP, []); + } + + public static function pocketmine_permission_command_teleport_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELEPORT_OTHER, []); + } + + public static function pocketmine_permission_command_teleport_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELEPORT_SELF, []); + } + + public static function pocketmine_permission_command_tell() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELL, []); + } + + public static function pocketmine_permission_command_time_add() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_ADD, []); + } + + public static function pocketmine_permission_command_time_query() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_QUERY, []); + } + + public static function pocketmine_permission_command_time_set() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_SET, []); + } + + public static function pocketmine_permission_command_time_start() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_START, []); + } + + public static function pocketmine_permission_command_time_stop() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_STOP, []); + } + + public static function pocketmine_permission_command_timings() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIMINGS, []); + } + + public static function pocketmine_permission_command_title_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TITLE_OTHER, []); + } + + public static function pocketmine_permission_command_title_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TITLE_SELF, []); + } + + public static function pocketmine_permission_command_transferserver() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TRANSFERSERVER, []); + } + + public static function pocketmine_permission_command_unban_ip() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_UNBAN_IP, []); + } + + public static function pocketmine_permission_command_unban_player() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_UNBAN_PLAYER, []); + } + + public static function pocketmine_permission_command_version() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_VERSION, []); + } + + public static function pocketmine_permission_command_whitelist_add() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_ADD, []); + } + + public static function pocketmine_permission_command_whitelist_disable() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_DISABLE, []); + } + + public static function pocketmine_permission_command_whitelist_enable() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_ENABLE, []); + } + + public static function pocketmine_permission_command_whitelist_list() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_LIST, []); + } + + public static function pocketmine_permission_command_whitelist_reload() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_RELOAD, []); + } + + public static function pocketmine_permission_command_whitelist_remove() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE, []); + } + + public static function pocketmine_permission_group_console() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_CONSOLE, []); + } + + public static function pocketmine_permission_group_operator() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_OPERATOR, []); + } + + public static function pocketmine_permission_group_user() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_USER, []); + } + public static function pocketmine_player_invalidEntity(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_PLAYER_INVALIDENTITY, [ 0 => $param0, diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index bd98496cb5..d69e1db944 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -146,6 +146,7 @@ final class KnownTranslationKeys{ public const DEATH_ATTACK_EXPLOSION_PLAYER = "death.attack.explosion.player"; public const DEATH_ATTACK_FALL = "death.attack.fall"; public const DEATH_ATTACK_FALLINGBLOCK = "death.attack.fallingBlock"; + public const DEATH_ATTACK_FIREWORKS = "death.attack.fireworks"; public const DEATH_ATTACK_GENERIC = "death.attack.generic"; public const DEATH_ATTACK_INFIRE = "death.attack.inFire"; public const DEATH_ATTACK_INWALL = "death.attack.inWall"; @@ -163,6 +164,7 @@ final class KnownTranslationKeys{ public const DEFAULT_VALUES_INFO = "default_values_info"; public const DISCONNECTIONSCREEN_INVALIDNAME = "disconnectionScreen.invalidName"; public const DISCONNECTIONSCREEN_INVALIDSKIN = "disconnectionScreen.invalidSkin"; + public const DISCONNECTIONSCREEN_LOGGEDINOTHERLOCATION = "disconnectionScreen.loggedinOtherLocation"; public const DISCONNECTIONSCREEN_NOREASON = "disconnectionScreen.noReason"; public const DISCONNECTIONSCREEN_NOTAUTHENTICATED = "disconnectionScreen.notAuthenticated"; public const DISCONNECTIONSCREEN_OUTDATEDCLIENT = "disconnectionScreen.outdatedClient"; @@ -342,12 +344,26 @@ final class KnownTranslationKeys{ public const POCKETMINE_DATA_PLAYEROLD = "pocketmine.data.playerOld"; public const POCKETMINE_DATA_SAVEERROR = "pocketmine.data.saveError"; public const POCKETMINE_DEBUG_ENABLE = "pocketmine.debug.enable"; + public const POCKETMINE_DISCONNECT_BAN = "pocketmine.disconnect.ban"; + public const POCKETMINE_DISCONNECT_BAN_HARDCORE = "pocketmine.disconnect.ban.hardcore"; + public const POCKETMINE_DISCONNECT_BAN_IP = "pocketmine.disconnect.ban.ip"; + public const POCKETMINE_DISCONNECT_BAN_NOREASON = "pocketmine.disconnect.ban.noReason"; + public const POCKETMINE_DISCONNECT_ERROR = "pocketmine.disconnect.error"; + public const POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION = "pocketmine.disconnect.error.authentication"; + public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket"; + public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal"; + public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_MISSINGKEY = "pocketmine.disconnect.invalidSession.missingKey"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOEARLY = "pocketmine.disconnect.invalidSession.tooEarly"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE = "pocketmine.disconnect.invalidSession.tooLate"; + public const POCKETMINE_DISCONNECT_KICK = "pocketmine.disconnect.kick"; + public const POCKETMINE_DISCONNECT_KICK_NOREASON = "pocketmine.disconnect.kick.noReason"; + public const POCKETMINE_DISCONNECT_TRANSFER = "pocketmine.disconnect.transfer"; + public const POCKETMINE_DISCONNECT_WHITELISTED = "pocketmine.disconnect.whitelisted"; + public const POCKETMINE_DISCONNECT_XBLIMPERSONATION = "pocketmine.disconnect.xblImpersonation"; public const POCKETMINE_LEVEL_AMBIGUOUSFORMAT = "pocketmine.level.ambiguousFormat"; public const POCKETMINE_LEVEL_BACKGROUNDGENERATION = "pocketmine.level.backgroundGeneration"; public const POCKETMINE_LEVEL_BADDEFAULTFORMAT = "pocketmine.level.badDefaultFormat"; @@ -365,6 +381,72 @@ final class KnownTranslationKeys{ public const POCKETMINE_LEVEL_UNKNOWNGENERATOR = "pocketmine.level.unknownGenerator"; public const POCKETMINE_LEVEL_UNLOADING = "pocketmine.level.unloading"; public const POCKETMINE_LEVEL_UNSUPPORTEDFORMAT = "pocketmine.level.unsupportedFormat"; + public const POCKETMINE_NETWORK_SESSION_CLOSE = "pocketmine.network.session.close"; + public const POCKETMINE_NETWORK_SESSION_OPEN = "pocketmine.network.session.open"; + public const POCKETMINE_NETWORK_SESSION_PLAYERNAME = "pocketmine.network.session.playerName"; + public const POCKETMINE_PERMISSION_BROADCAST_ADMIN = "pocketmine.permission.broadcast.admin"; + public const POCKETMINE_PERMISSION_BROADCAST_USER = "pocketmine.permission.broadcast.user"; + public const POCKETMINE_PERMISSION_COMMAND_BAN_IP = "pocketmine.permission.command.ban.ip"; + public const POCKETMINE_PERMISSION_COMMAND_BAN_LIST = "pocketmine.permission.command.ban.list"; + public const POCKETMINE_PERMISSION_COMMAND_BAN_PLAYER = "pocketmine.permission.command.ban.player"; + public const POCKETMINE_PERMISSION_COMMAND_CLEAR_OTHER = "pocketmine.permission.command.clear.other"; + public const POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF = "pocketmine.permission.command.clear.self"; + public const POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE = "pocketmine.permission.command.defaultgamemode"; + public const POCKETMINE_PERMISSION_COMMAND_DIFFICULTY = "pocketmine.permission.command.difficulty"; + public const POCKETMINE_PERMISSION_COMMAND_DUMPMEMORY = "pocketmine.permission.command.dumpmemory"; + public const POCKETMINE_PERMISSION_COMMAND_EFFECT_OTHER = "pocketmine.permission.command.effect.other"; + public const POCKETMINE_PERMISSION_COMMAND_EFFECT_SELF = "pocketmine.permission.command.effect.self"; + public const POCKETMINE_PERMISSION_COMMAND_ENCHANT_OTHER = "pocketmine.permission.command.enchant.other"; + public const POCKETMINE_PERMISSION_COMMAND_ENCHANT_SELF = "pocketmine.permission.command.enchant.self"; + public const POCKETMINE_PERMISSION_COMMAND_GAMEMODE_OTHER = "pocketmine.permission.command.gamemode.other"; + public const POCKETMINE_PERMISSION_COMMAND_GAMEMODE_SELF = "pocketmine.permission.command.gamemode.self"; + public const POCKETMINE_PERMISSION_COMMAND_GC = "pocketmine.permission.command.gc"; + public const POCKETMINE_PERMISSION_COMMAND_GIVE_OTHER = "pocketmine.permission.command.give.other"; + public const POCKETMINE_PERMISSION_COMMAND_GIVE_SELF = "pocketmine.permission.command.give.self"; + public const POCKETMINE_PERMISSION_COMMAND_HELP = "pocketmine.permission.command.help"; + public const POCKETMINE_PERMISSION_COMMAND_KICK = "pocketmine.permission.command.kick"; + public const POCKETMINE_PERMISSION_COMMAND_KILL_OTHER = "pocketmine.permission.command.kill.other"; + public const POCKETMINE_PERMISSION_COMMAND_KILL_SELF = "pocketmine.permission.command.kill.self"; + public const POCKETMINE_PERMISSION_COMMAND_LIST = "pocketmine.permission.command.list"; + public const POCKETMINE_PERMISSION_COMMAND_ME = "pocketmine.permission.command.me"; + public const POCKETMINE_PERMISSION_COMMAND_OP_GIVE = "pocketmine.permission.command.op.give"; + public const POCKETMINE_PERMISSION_COMMAND_OP_TAKE = "pocketmine.permission.command.op.take"; + public const POCKETMINE_PERMISSION_COMMAND_PARTICLE = "pocketmine.permission.command.particle"; + public const POCKETMINE_PERMISSION_COMMAND_PLUGINS = "pocketmine.permission.command.plugins"; + public const POCKETMINE_PERMISSION_COMMAND_SAVE_DISABLE = "pocketmine.permission.command.save.disable"; + public const POCKETMINE_PERMISSION_COMMAND_SAVE_ENABLE = "pocketmine.permission.command.save.enable"; + public const POCKETMINE_PERMISSION_COMMAND_SAVE_PERFORM = "pocketmine.permission.command.save.perform"; + public const POCKETMINE_PERMISSION_COMMAND_SAY = "pocketmine.permission.command.say"; + public const POCKETMINE_PERMISSION_COMMAND_SEED = "pocketmine.permission.command.seed"; + public const POCKETMINE_PERMISSION_COMMAND_SETWORLDSPAWN = "pocketmine.permission.command.setworldspawn"; + public const POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_OTHER = "pocketmine.permission.command.spawnpoint.other"; + public const POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_SELF = "pocketmine.permission.command.spawnpoint.self"; + public const POCKETMINE_PERMISSION_COMMAND_STATUS = "pocketmine.permission.command.status"; + public const POCKETMINE_PERMISSION_COMMAND_STOP = "pocketmine.permission.command.stop"; + public const POCKETMINE_PERMISSION_COMMAND_TELEPORT_OTHER = "pocketmine.permission.command.teleport.other"; + public const POCKETMINE_PERMISSION_COMMAND_TELEPORT_SELF = "pocketmine.permission.command.teleport.self"; + public const POCKETMINE_PERMISSION_COMMAND_TELL = "pocketmine.permission.command.tell"; + public const POCKETMINE_PERMISSION_COMMAND_TIME_ADD = "pocketmine.permission.command.time.add"; + public const POCKETMINE_PERMISSION_COMMAND_TIME_QUERY = "pocketmine.permission.command.time.query"; + public const POCKETMINE_PERMISSION_COMMAND_TIME_SET = "pocketmine.permission.command.time.set"; + public const POCKETMINE_PERMISSION_COMMAND_TIME_START = "pocketmine.permission.command.time.start"; + public const POCKETMINE_PERMISSION_COMMAND_TIME_STOP = "pocketmine.permission.command.time.stop"; + public const POCKETMINE_PERMISSION_COMMAND_TIMINGS = "pocketmine.permission.command.timings"; + public const POCKETMINE_PERMISSION_COMMAND_TITLE_OTHER = "pocketmine.permission.command.title.other"; + public const POCKETMINE_PERMISSION_COMMAND_TITLE_SELF = "pocketmine.permission.command.title.self"; + public const POCKETMINE_PERMISSION_COMMAND_TRANSFERSERVER = "pocketmine.permission.command.transferserver"; + public const POCKETMINE_PERMISSION_COMMAND_UNBAN_IP = "pocketmine.permission.command.unban.ip"; + public const POCKETMINE_PERMISSION_COMMAND_UNBAN_PLAYER = "pocketmine.permission.command.unban.player"; + public const POCKETMINE_PERMISSION_COMMAND_VERSION = "pocketmine.permission.command.version"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_ADD = "pocketmine.permission.command.whitelist.add"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_DISABLE = "pocketmine.permission.command.whitelist.disable"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_ENABLE = "pocketmine.permission.command.whitelist.enable"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_LIST = "pocketmine.permission.command.whitelist.list"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_RELOAD = "pocketmine.permission.command.whitelist.reload"; + public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE = "pocketmine.permission.command.whitelist.remove"; + public const POCKETMINE_PERMISSION_GROUP_CONSOLE = "pocketmine.permission.group.console"; + public const POCKETMINE_PERMISSION_GROUP_OPERATOR = "pocketmine.permission.group.operator"; + public const POCKETMINE_PERMISSION_GROUP_USER = "pocketmine.permission.group.user"; public const POCKETMINE_PLAYER_INVALIDENTITY = "pocketmine.player.invalidEntity"; public const POCKETMINE_PLAYER_INVALIDMOVE = "pocketmine.player.invalidMove"; public const POCKETMINE_PLAYER_LOGIN = "pocketmine.player.logIn"; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 5b3d6bb3fe..d04e61b6f2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -132,6 +132,7 @@ use function get_class; use function in_array; use function json_encode; use function ksort; +use function random_bytes; use function strcasecmp; use function strlen; use function strtolower; @@ -236,7 +237,11 @@ class NetworkSession{ protected function createPlayer() : void{ $this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion( \Closure::fromCallable([$this, 'onPlayerCreated']), - fn() => $this->disconnect("Player creation failed") //TODO: this should never actually occur... right? + function() : void{ + //TODO: this should never actually occur... right? + $this->logger->error("Failed to create player"); + $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal()); + } ); } @@ -594,6 +599,10 @@ class NetworkSession{ }, $reason); } + public function disconnectWithError(Translatable|string $reason) : void{ + $this->disconnect(KnownTranslationFactory::pocketmine_disconnect_error($reason, bin2hex(random_bytes(6)))); + } + public function disconnectIncompatibleProtocol(int $protocolVersion) : void{ $this->tryDisconnect( function() use ($protocolVersion) : void{ @@ -606,7 +615,8 @@ class NetworkSession{ /** * Instructs the remote client to connect to a different server. */ - public function transfer(string $ip, int $port, Translatable|string $reason = "transfer") : void{ + public function transfer(string $ip, int $port, Translatable|string|null $reason = null) : void{ + $reason ??= KnownTranslationFactory::pocketmine_disconnect_transfer(); $this->tryDisconnect(function() use ($ip, $port, $reason) : void{ $this->sendDataPacket(TransferPacket::create($ip, $port), true); if($this->player !== null){ @@ -649,7 +659,7 @@ class NetworkSession{ } if($error !== null){ - $this->disconnect(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error)); + $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error)); return; } @@ -1146,7 +1156,7 @@ class NetworkSession{ if($this->info === null){ if(time() >= $this->connectTime + 10){ - $this->disconnect("Login timeout"); + $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_loginTimeout()); } return; diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 1c7e59b690..0919f85e30 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -71,7 +71,7 @@ class LoginPacketHandler extends PacketHandler{ $extraData = $this->fetchAuthData($packet->chainDataJwt); if(!Player::isValidUserName($extraData->displayName)){ - $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidName()); + $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidName()); return true; } @@ -81,7 +81,7 @@ class LoginPacketHandler extends PacketHandler{ $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); - $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidSkin()); + $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidSkin()); return true; } @@ -120,12 +120,19 @@ class LoginPacketHandler extends PacketHandler{ $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull()); } if(!$this->server->isWhitelisted($playerInfo->getUsername())){ - //TODO: l10n - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, "Server is whitelisted"); + $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, KnownTranslationFactory::pocketmine_disconnect_whitelisted()); } - if($this->server->getNameBans()->isBanned($playerInfo->getUsername()) || $this->server->getIPBans()->isBanned($this->session->getIp())){ - //TODO: l10n - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, "You are banned"); + + $banMessage = null; + if(($banEntry = $this->server->getNameBans()->getEntry($playerInfo->getUsername())) !== null){ + $banReason = $banEntry->getReason(); + $banMessage = $banReason === "" ? KnownTranslationFactory::pocketmine_disconnect_ban_noReason() : KnownTranslationFactory::pocketmine_disconnect_ban($banReason); + }elseif(($banEntry = $this->server->getIPBans()->getEntry($this->session->getIp())) !== null){ + $banReason = $banEntry->getReason(); + $banMessage = KnownTranslationFactory::pocketmine_disconnect_ban($banReason !== "" ? $banReason : KnownTranslationFactory::pocketmine_disconnect_ban_ip()); + } + if($banMessage !== null){ + $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, $banMessage); } $ev->call(); diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 0dfe15ef44..8e76c545d6 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -86,7 +86,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ private function disconnectWithError(string $error) : void{ $this->session->getLogger()->error("Error downloading resource packs: " . $error); - $this->session->disconnect(KnownTranslationFactory::disconnectionScreen_resourcePack()); + $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_resourcePack()); } public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{ diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index bf1f75c269..c48cba81c8 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\convert\TypeConverter; @@ -46,10 +47,8 @@ use raklib\server\ServerEventListener; use raklib\utils\InternetAddress; use function addcslashes; use function base64_encode; -use function bin2hex; use function implode; use function mt_rand; -use function random_bytes; use function rtrim; use function substr; use const PHP_INT_MAX; @@ -182,14 +181,12 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ try{ $session->handleEncoded($buf); }catch(PacketHandlingException $e){ - $errorId = bin2hex(random_bytes(6)); - $logger = $session->getLogger(); - $logger->error("Bad packet (error ID $errorId): " . $e->getMessage()); + $logger->error("Bad packet: " . $e->getMessage()); //intentionally doesn't use logException, we don't want spammy packet error traces to appear in release mode $logger->debug(implode("\n", Utils::printableExceptionInfo($e))); - $session->disconnect("Packet processing error (Error ID: $errorId)"); + $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_badPacket()); $this->interface->blockAddress($address, 5); } } diff --git a/src/player/Player.php b/src/player/Player.php index 5819fa8cb9..fa1ac0f488 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2081,14 +2081,14 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ /** * Transfers a player to another server. * - * @param string $address The IP address or hostname of the destination server - * @param int $port The destination port, defaults to 19132 - * @param string $message Message to show in the console when closing the player + * @param string $address The IP address or hostname of the destination server + * @param int $port The destination port, defaults to 19132 + * @param Translatable|string|null $message Message to show in the console when closing the player, null will use the default message * * @return bool if transfer was successful. */ - public function transfer(string $address, int $port = 19132, string $message = "transfer") : bool{ - $ev = new PlayerTransferEvent($this, $address, $port, $message); + public function transfer(string $address, int $port = 19132, Translatable|string|null $message = null) : bool{ + $ev = new PlayerTransferEvent($this, $address, $port, $message ?? KnownTranslationFactory::pocketmine_disconnect_transfer()); $ev->call(); if(!$ev->isCancelled()){ $this->getNetworkSession()->transfer($ev->getAddress(), $ev->getPort(), $ev->getMessage()); @@ -2303,7 +2303,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function respawn() : void{ if($this->server->isHardcore()){ - if($this->kick("You have been banned because you died in hardcore mode")){ //this allows plugins to prevent the ban by cancelling PlayerKickEvent + if($this->kick(KnownTranslationFactory::pocketmine_disconnect_ban(KnownTranslationFactory::pocketmine_disconnect_ban_hardcore()))){ //this allows plugins to prevent the ban by cancelling PlayerKickEvent $this->server->getNameBans()->addBan($this->getName(), "Died in hardcore mode"); } return; From c79806eaf0a31762570ecd4b3316a2fd487e6de2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 20:11:46 +0000 Subject: [PATCH 0472/1858] NetworkSession: localize session open, close, and player name discovery messages --- src/network/mcpe/NetworkSession.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index d04e61b6f2..986684f623 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -207,7 +207,7 @@ class NetworkSession{ )); $this->manager->add($this); - $this->logger->info("Session opened"); + $this->logger->info($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_network_session_open())); } private function getLogPrefix() : string{ @@ -227,7 +227,7 @@ class NetworkSession{ $this, function(PlayerInfo $info) : void{ $this->info = $info; - $this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET); + $this->logger->info($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_network_session_playerName(TextFormat::AQUA . $info->getUsername() . TextFormat::RESET))); $this->logger->setPrefix($this->getLogPrefix()); }, \Closure::fromCallable([$this, "setAuthenticationStatus"]) @@ -558,13 +558,7 @@ class NetworkSession{ $this->setHandler(null); $this->connected = false; - if($reason instanceof Translatable){ - $translated = $this->server->getLanguage()->translate($reason); - }else{ - $translated = $reason; - } - //TODO: l10n - $this->logger->info("Session closed due to $translated"); + $this->logger->info($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_network_session_close($reason))); } } From 2da9b76452cc2a951c4f10e771bddeb139fe3006 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Dec 2022 20:29:38 +0000 Subject: [PATCH 0473/1858] Added translatable descriptions for permissions --- src/permission/DefaultPermissions.php | 127 +++++++++++---------- src/permission/Permission.php | 10 +- tests/phpstan/configs/actual-problems.neon | 2 +- tools/generate-permission-doc.php | 9 +- 4 files changed, 78 insertions(+), 70 deletions(-) diff --git a/src/permission/DefaultPermissions.php b/src/permission/DefaultPermissions.php index 06e7705f80..4af3d1b099 100644 --- a/src/permission/DefaultPermissions.php +++ b/src/permission/DefaultPermissions.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\permission; +use pocketmine\lang\KnownTranslationFactory as l10n; use pocketmine\permission\DefaultPermissionNames as Names; abstract class DefaultPermissions{ @@ -47,69 +48,69 @@ abstract class DefaultPermissions{ } public static function registerCorePermissions() : void{ - $consoleRoot = self::registerPermission(new Permission(self::ROOT_CONSOLE, "Grants all console permissions")); - $operatorRoot = self::registerPermission(new Permission(self::ROOT_OPERATOR, "Grants all operator permissions"), [$consoleRoot]); - $everyoneRoot = self::registerPermission(new Permission(self::ROOT_USER, "Grants all non-sensitive permissions that everyone gets by default"), [$operatorRoot]); + $consoleRoot = self::registerPermission(new Permission(self::ROOT_CONSOLE, l10n::pocketmine_permission_group_console())); + $operatorRoot = self::registerPermission(new Permission(self::ROOT_OPERATOR, l10n::pocketmine_permission_group_operator()), [$consoleRoot]); + $everyoneRoot = self::registerPermission(new Permission(self::ROOT_USER, l10n::pocketmine_permission_group_user()), [$operatorRoot]); - self::registerPermission(new Permission(Names::BROADCAST_ADMIN, "Allows the user to receive administrative broadcasts"), [$operatorRoot]); - self::registerPermission(new Permission(Names::BROADCAST_USER, "Allows the user to receive user broadcasts"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_BAN_IP, "Allows the user to ban IP addresses"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_BAN_LIST, "Allows the user to list banned players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_BAN_PLAYER, "Allows the user to ban players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_CLEAR_OTHER, "Allows the user to clear inventory of other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_CLEAR_SELF, "Allows the user to clear their own inventory"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_DEFAULTGAMEMODE, "Allows the user to change the default gamemode"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_DIFFICULTY, "Allows the user to change the game difficulty"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_DUMPMEMORY, "Allows the user to dump memory contents"), [$consoleRoot]); - self::registerPermission(new Permission(Names::COMMAND_EFFECT_OTHER, "Allows the user to modify effects of other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_EFFECT_SELF, "Allows the user to modify their own effects"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_ENCHANT_OTHER, "Allows the user to enchant the held items of other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_ENCHANT_SELF, "Allows the user to enchant their own held item"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_GAMEMODE_OTHER, "Allows the user to change the game mode of other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_GAMEMODE_SELF, "Allows the user to change their own game mode"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_GC, "Allows the user to fire garbage collection tasks"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_GIVE_OTHER, "Allows the user to give items to other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_GIVE_SELF, "Allows the user to give items to themselves"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_HELP, "Allows the user to view the help menu"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_KICK, "Allows the user to kick players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_KILL_OTHER, "Allows the user to kill other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_KILL_SELF, "Allows the user to commit suicide"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_LIST, "Allows the user to list all online players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_ME, "Allows the user to perform a chat action"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_OP_GIVE, "Allows the user to give a player operator status"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_OP_TAKE, "Allows the user to take a player's operator status"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_PARTICLE, "Allows the user to create particle effects"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_PLUGINS, "Allows the user to view the list of plugins"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SAVE_DISABLE, "Allows the user to disable automatic saving"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SAVE_ENABLE, "Allows the user to enable automatic saving"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SAVE_PERFORM, "Allows the user to perform a manual save"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SAY, "Allows the user to talk as the console"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SEED, "Allows the user to view the seed of the world"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SETWORLDSPAWN, "Allows the user to change the world spawn"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SPAWNPOINT_OTHER, "Allows the user to change the respawn point of other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SPAWNPOINT_SELF, "Allows the user to change their own respawn point"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_STATUS, "Allows the user to view the server performance"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_STOP, "Allows the user to stop the server"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TELEPORT_OTHER, "Allows the user to teleport other players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TELEPORT_SELF, "Allows the user to teleport themselves"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TELL, "Allows the user to privately message another player"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIME_ADD, "Allows the user to fast-forward time"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIME_QUERY, "Allows the user query the time"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIME_SET, "Allows the user to change the time"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIME_START, "Allows the user to restart the time"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIME_STOP, "Allows the user to stop the time"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TIMINGS, "Allows the user to record timings to analyse server performance"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TITLE_OTHER, "Allows the user to send a title to the specified player"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TITLE_SELF, "Allows the user to send a title to themselves"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_TRANSFERSERVER, "Allows the user to transfer self to another server"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_UNBAN_IP, "Allows the user to unban IP addresses"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_UNBAN_PLAYER, "Allows the user to unban players"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_VERSION, "Allows the user to view the version of the server"), [$everyoneRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_ADD, "Allows the user to add a player to the server whitelist"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_DISABLE, "Allows the user to disable the server whitelist"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_ENABLE, "Allows the user to enable the server whitelist"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_LIST, "Allows the user to list all players on the server whitelist"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_RELOAD, "Allows the user to reload the server whitelist"), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_WHITELIST_REMOVE, "Allows the user to remove a player from the server whitelist"), [$operatorRoot]); + self::registerPermission(new Permission(Names::BROADCAST_ADMIN, l10n::pocketmine_permission_broadcast_admin()), [$operatorRoot]); + self::registerPermission(new Permission(Names::BROADCAST_USER, l10n::pocketmine_permission_broadcast_user()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_BAN_IP, l10n::pocketmine_permission_command_ban_ip()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_BAN_LIST, l10n::pocketmine_permission_command_ban_list()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_BAN_PLAYER, l10n::pocketmine_permission_command_ban_player()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_CLEAR_OTHER, l10n::pocketmine_permission_command_clear_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_CLEAR_SELF, l10n::pocketmine_permission_command_clear_self()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_DEFAULTGAMEMODE, l10n::pocketmine_permission_command_defaultgamemode()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_DIFFICULTY, l10n::pocketmine_permission_command_difficulty()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_DUMPMEMORY, l10n::pocketmine_permission_command_dumpmemory()), [$consoleRoot]); + self::registerPermission(new Permission(Names::COMMAND_EFFECT_OTHER, l10n::pocketmine_permission_command_effect_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_EFFECT_SELF, l10n::pocketmine_permission_command_effect_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_ENCHANT_OTHER, l10n::pocketmine_permission_command_enchant_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_ENCHANT_SELF, l10n::pocketmine_permission_command_enchant_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_GAMEMODE_OTHER, l10n::pocketmine_permission_command_gamemode_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_GAMEMODE_SELF, l10n::pocketmine_permission_command_gamemode_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_GC, l10n::pocketmine_permission_command_gc()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_GIVE_OTHER, l10n::pocketmine_permission_command_give_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_GIVE_SELF, l10n::pocketmine_permission_command_give_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_HELP, l10n::pocketmine_permission_command_help()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_KICK, l10n::pocketmine_permission_command_kick()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_KILL_OTHER, l10n::pocketmine_permission_command_kill_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_KILL_SELF, l10n::pocketmine_permission_command_kill_self()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_LIST, l10n::pocketmine_permission_command_list()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_ME, l10n::pocketmine_permission_command_me()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_OP_GIVE, l10n::pocketmine_permission_command_op_give()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_OP_TAKE, l10n::pocketmine_permission_command_op_take()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_PARTICLE, l10n::pocketmine_permission_command_particle()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_PLUGINS, l10n::pocketmine_permission_command_plugins()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SAVE_DISABLE, l10n::pocketmine_permission_command_save_disable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SAVE_ENABLE, l10n::pocketmine_permission_command_save_enable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SAVE_PERFORM, l10n::pocketmine_permission_command_save_enable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SAY, l10n::pocketmine_permission_command_say()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SEED, l10n::pocketmine_permission_command_seed()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SETWORLDSPAWN, l10n::pocketmine_permission_command_setworldspawn()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SPAWNPOINT_OTHER, l10n::pocketmine_permission_command_spawnpoint_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SPAWNPOINT_SELF, l10n::pocketmine_permission_command_spawnpoint_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_STATUS, l10n::pocketmine_permission_command_status()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_STOP, l10n::pocketmine_permission_command_stop()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TELEPORT_OTHER, l10n::pocketmine_permission_command_teleport_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TELEPORT_SELF, l10n::pocketmine_permission_command_teleport_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TELL, l10n::pocketmine_permission_command_tell()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIME_ADD, l10n::pocketmine_permission_command_time_add()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIME_QUERY, l10n::pocketmine_permission_command_time_query()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIME_SET, l10n::pocketmine_permission_command_time_set()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIME_START, l10n::pocketmine_permission_command_time_start()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIME_STOP, l10n::pocketmine_permission_command_time_stop()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TIMINGS, l10n::pocketmine_permission_command_timings()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TITLE_OTHER, l10n::pocketmine_permission_command_title_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TITLE_SELF, l10n::pocketmine_permission_command_title_self()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_TRANSFERSERVER, l10n::pocketmine_permission_command_transferserver()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_UNBAN_IP, l10n::pocketmine_permission_command_unban_ip()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_UNBAN_PLAYER, l10n::pocketmine_permission_command_unban_player()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_VERSION, l10n::pocketmine_permission_command_version()), [$everyoneRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_ADD, l10n::pocketmine_permission_command_whitelist_add()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_DISABLE, l10n::pocketmine_permission_command_whitelist_disable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_ENABLE, l10n::pocketmine_permission_command_whitelist_enable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_LIST, l10n::pocketmine_permission_command_whitelist_list()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_RELOAD, l10n::pocketmine_permission_command_whitelist_reload()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_WHITELIST_REMOVE, l10n::pocketmine_permission_command_whitelist_remove()), [$operatorRoot]); } } diff --git a/src/permission/Permission.php b/src/permission/Permission.php index f73f33ab86..fc10e35877 100644 --- a/src/permission/Permission.php +++ b/src/permission/Permission.php @@ -27,11 +27,13 @@ declare(strict_types=1); namespace pocketmine\permission; +use pocketmine\lang\Translatable; + /** * Represents a permission */ class Permission{ - private string $description; + private Translatable|string $description; /** * Creates a new Permission object to be attached to Permissible objects @@ -41,7 +43,7 @@ class Permission{ */ public function __construct( private string $name, - ?string $description = null, + Translatable|string|null $description = null, private array $children = [] ){ $this->description = $description ?? ""; //TODO: wtf ???? @@ -61,11 +63,11 @@ class Permission{ return $this->children; } - public function getDescription() : string{ + public function getDescription() : Translatable|string{ return $this->description; } - public function setDescription(string $value) : void{ + public function setDescription(Translatable|string $value) : void{ $this->description = $value; } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 38a306f8cd..44e3c0fcfc 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -746,7 +746,7 @@ parameters: path: ../../../src/permission/PermissionParser.php - - message: "#^Parameter \\#2 \\$description of class pocketmine\\\\permission\\\\Permission constructor expects string\\|null, mixed given\\.$#" + message: "#^Parameter \\#2 \\$description of class pocketmine\\\\permission\\\\Permission constructor expects pocketmine\\\\lang\\\\Translatable\\|string\\|null, mixed given\\.$#" count: 1 path: ../../../src/permission/PermissionParser.php diff --git a/tools/generate-permission-doc.php b/tools/generate-permission-doc.php index fd04f1a296..79b6ced5cf 100644 --- a/tools/generate-permission-doc.php +++ b/tools/generate-permission-doc.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\generate_permission_doc; +use pocketmine\lang\Language; +use pocketmine\lang\Translatable; use pocketmine\permission\DefaultPermissions; use pocketmine\permission\PermissionManager; use pocketmine\utils\Utils; @@ -58,6 +60,7 @@ function markdownify(string $name) : string{ return str_replace(['.', '`', ' '], ['', '', '-'], strtolower($name)); } DefaultPermissions::registerCorePermissions(); +$language = new Language(Language::FALLBACK_LANGUAGE); $cwd = Utils::assumeNotFalse(getcwd()); $output = Path::join($cwd, "core-permissions.$format"); @@ -94,12 +97,14 @@ if($format === "md"){ fwrite($doc, "\n"); } foreach($permissions as $permission){ + $description = $permission->getDescription(); + $plainDescription = $description instanceof Translatable ? $language->translate($description) : $description; if($format === "md"){ $link = count($permission->getChildren()) === 0 ? "N/A" : "[Jump](#" . markdownify("Permissions implied by `" . $permission->getName() . "`") . ")"; - fwrite($doc, "| `" . $permission->getName() . "` | " . $permission->getDescription() . " | $link |\n"); + fwrite($doc, "| `" . $permission->getName() . "` | $plainDescription | $link |\n"); }else{ fwrite($doc, " * - ``" . $permission->getName() . "``\n"); - fwrite($doc, " - " . $permission->getDescription() . "\n"); + fwrite($doc, " - $plainDescription\n"); if(count($permission->getChildren()) === 0){ fwrite($doc, " - N/A\n"); }else{ From 42db3abf5e109478da7c80a31d4a7082ff5cb4ff Mon Sep 17 00:00:00 2001 From: BrandPVP <114182697+BrandPVP@users.noreply.github.com> Date: Sat, 31 Dec 2022 16:04:22 +0300 Subject: [PATCH 0474/1858] QueryInfo->setPlayerList() now accepts string[] instead of Player[] (#5476) --- src/network/query/QueryInfo.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/network/query/QueryInfo.php b/src/network/query/QueryInfo.php index 1dc0dcf7e8..2d36ac7e6e 100644 --- a/src/network/query/QueryInfo.php +++ b/src/network/query/QueryInfo.php @@ -29,6 +29,7 @@ use pocketmine\plugin\Plugin; use pocketmine\Server; use pocketmine\utils\Binary; use pocketmine\utils\Utils; +use function array_map; use function chr; use function count; use function str_replace; @@ -41,7 +42,7 @@ final class QueryInfo{ private bool $listPlugins; /** @var Plugin[] */ private array $plugins; - /** @var Player[] */ + /** @var string[] */ private array $players; private string $gametype; @@ -67,7 +68,7 @@ final class QueryInfo{ $this->serverName = $server->getMotd(); $this->listPlugins = $server->getConfigGroup()->getPropertyBool("settings.query-plugins", true); $this->plugins = $server->getPluginManager()->getPlugins(); - $this->players = $server->getOnlinePlayers(); + $this->players = array_map(fn(Player $p) => $p->getName(), $server->getOnlinePlayers()); $this->gametype = ($server->getGamemode()->equals(GameMode::SURVIVAL()) || $server->getGamemode()->equals(GameMode::ADVENTURE())) ? "SMP" : "CMP"; $this->version = $server->getVersion(); @@ -122,17 +123,17 @@ final class QueryInfo{ } /** - * @return Player[] + * @return string[] */ public function getPlayerList() : array{ return $this->players; } /** - * @param Player[] $players + * @param string[] $players */ public function setPlayerList(array $players) : void{ - Utils::validateArrayValueType($players, function(Player $_) : void{}); + Utils::validateArrayValueType($players, function(string $_) : void{}); $this->players = $players; $this->destroyCache(); } @@ -226,7 +227,7 @@ final class QueryInfo{ $query .= "\x00\x01player_\x00\x00"; foreach($this->players as $player){ - $query .= $player->getName() . "\x00"; + $query .= $player . "\x00"; } $query .= "\x00"; From d8d236842fb18f3f59d7669b0b398932f39fef12 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 3 Jan 2023 19:54:41 +0000 Subject: [PATCH 0475/1858] Fixed merge error --- src/network/mcpe/handler/InGamePacketHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index c617d15987..51be22658f 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -258,7 +258,7 @@ class InGamePacketHandler extends PacketHandler{ if(count($useItemTransaction->getTransactionData()->getActions()) > 100){ throw new PacketHandlingException("Too many actions in item use transaction"); } - $this->inventoryManager->addPredictedSlotChanges($useItemTransaction->getTransactionData()->getActions()); + $this->inventoryManager->addRawPredictedSlotChanges($useItemTransaction->getTransactionData()->getActions()); if(!$this->handleUseItemTransaction($useItemTransaction->getTransactionData())){ $packetHandled = false; $this->session->getLogger()->debug("Unhandled transaction in PlayerAuthInputPacket (type " . $useItemTransaction->getTransactionData()->getActionType() . ")"); From 5fdbb19852dec121aa61e4e84f97983887dbb96e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Jan 2023 00:13:51 +0000 Subject: [PATCH 0476/1858] Fixed a whole bunch of issues with legacy transactions --- src/network/mcpe/InventoryManager.php | 40 +++++++++++--- .../mcpe/handler/InGamePacketHandler.php | 54 ++++++++++--------- .../mcpe/handler/ItemStackResponseBuilder.php | 15 ++++-- 3 files changed, 75 insertions(+), 34 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index cb8c73eb3c..ea978d2cb7 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -51,6 +51,7 @@ use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\CreativeContentEntry; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; @@ -100,6 +101,8 @@ class InventoryManager{ private ?\Closure $pendingOpenWindowCallback = null; private int $nextItemStackId = 1; + private ?int $currentItemStackRequestId = null; + /** * @var int[][] * @phpstan-var array> @@ -186,7 +189,7 @@ class InventoryManager{ return null; } - public function addPredictedSlotChange(Inventory $inventory, int $slot, Item $item) : void{ + private function addPredictedSlotChange(Inventory $inventory, int $slot, Item $item) : void{ $predictions = ($this->initiatedSlotChanges[spl_object_id($inventory)] ??= new InventoryManagerPredictedChanges($inventory)); $predictions->add($slot, $item); } @@ -223,6 +226,10 @@ class InventoryManager{ } } + public function setCurrentItemStackRequestId(?int $id) : void{ + $this->currentItemStackRequestId = $id; + } + /** * When the server initiates a window close, it does so by sending a ContainerClose to the client, which causes the * client to behave as if it initiated the close itself. It responds by sending a ContainerClose back to the server, @@ -390,8 +397,25 @@ class InventoryManager{ //BDS (Bedrock Dedicated Server) also seems to work this way. $this->session->sendDataPacket(InventoryContentPacket::create($windowId, [$itemStackWrapper])); }else{ + if($this->currentItemStackRequestId !== null){ + //TODO: HACK! + //When right-clicking to equip armour, the client predicts the content of the armour slot, but + //doesn't report it in the transaction packet. The server then sends an InventorySlotPacket to + //the client, assuming the slot changed for some other reason, since there is no prediction for + //the slot. + //However, later requests involving that itemstack will refer to the request ID in which the + //armour was equipped, instead of the stack ID provided by the server in the outgoing + //InventorySlotPacket. (Perhaps because the item is already the same as the client actually + //predicted, but didn't tell us?) + //We work around this bug by setting the slot to air and then back to the correct item. In + //theory, setting a different count and then back again (or changing any other property) would + //also work, but this is simpler. + $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, new ItemStackWrapper(0, ItemStack::null()))); + } $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); } + }elseif($this->currentItemStackRequestId !== null){ + $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); } $predictions?->remove($slot); } @@ -498,11 +522,15 @@ class InventoryManager{ return $this->nextItemStackId++; } - public function trackItemStack(Inventory $inventory, int $slotId, Item $item, ?int $itemStackRequestId) : ItemStackInfo{ + public function getItemStackInfo(Inventory $inventory, int $slot) : ?ItemStackInfo{ + return $this->itemStackInfos[spl_object_id($inventory)][$slot] ?? null; + } + + private function trackItemStack(Inventory $inventory, int $slotId, Item $item, ?int $itemStackRequestId) : ItemStackInfo{ $existing = $this->itemStackInfos[spl_object_id($inventory)][$slotId] ?? null; $typeConverter = TypeConverter::getInstance(); $itemStack = $typeConverter->coreItemStackToNet($item); - if($existing !== null && $existing->getItemStack()->equals($itemStack)){ + if($existing !== null && $existing->getItemStack()->equals($itemStack) && $existing->getRequestId() === $itemStackRequestId){ return $existing; } @@ -515,7 +543,7 @@ class InventoryManager{ return new ItemStackWrapper($info->getStackId(), $info->getItemStack()); } - public function matchItemStack(Inventory $inventory, int $slotId, int $itemStackId) : bool{ + public function matchItemStack(Inventory $inventory, int $slotId, int $clientItemStackId) : bool{ $inventoryObjectId = spl_object_id($inventory); if(!isset($this->itemStackInfos[$inventoryObjectId])){ $this->session->getLogger()->debug("Attempted to match item preimage unsynced inventory " . get_class($inventory) . "#" . $inventoryObjectId); @@ -527,10 +555,10 @@ class InventoryManager{ return false; } - if(!($itemStackId < 0 ? $info->getRequestId() === $itemStackId : $info->getStackId() === $itemStackId)){ + if(!($clientItemStackId < 0 ? $info->getRequestId() === $clientItemStackId : $info->getStackId() === $clientItemStackId)){ $this->session->getLogger()->debug( "Mismatched expected itemstack: " . get_class($inventory) . "#" . $inventoryObjectId . ", " . - "slot: $slotId, expected: $itemStackId, actual: " . $info->getStackId() . ", last modified by request: " . ($info->getRequestId() ?? "none") + "slot: $slotId, client expected: $clientItemStackId, server actual: " . $info->getStackId() . ", last modified by request: " . ($info->getRequestId() ?? "none") ); return false; } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 51be22658f..c618c2c16a 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -97,6 +97,8 @@ use pocketmine\network\mcpe\protocol\types\inventory\MismatchTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; use pocketmine\network\mcpe\protocol\types\inventory\NormalTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\ReleaseItemTransactionData; +use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\ItemStackRequest; +use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\mcpe\protocol\types\inventory\UseItemOnEntityTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\UseItemTransactionData; @@ -258,6 +260,8 @@ class InGamePacketHandler extends PacketHandler{ if(count($useItemTransaction->getTransactionData()->getActions()) > 100){ throw new PacketHandlingException("Too many actions in item use transaction"); } + + $this->inventoryManager->setCurrentItemStackRequestId($useItemTransaction->getRequestId()); $this->inventoryManager->addRawPredictedSlotChanges($useItemTransaction->getTransactionData()->getActions()); if(!$this->handleUseItemTransaction($useItemTransaction->getTransactionData())){ $packetHandled = false; @@ -265,14 +269,13 @@ class InGamePacketHandler extends PacketHandler{ }else{ $this->inventoryManager->syncMismatchedPredictedSlotChanges(); } + $this->inventoryManager->setCurrentItemStackRequestId(null); } $itemStackRequest = $packet->getItemStackRequest(); if($itemStackRequest !== null){ - $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $itemStackRequest); - $transaction = $executor->generateInventoryTransaction(); - $result = $this->executeInventoryTransaction($transaction); - $this->session->sendDataPacket(ItemStackResponsePacket::create([$executor->buildItemStackResponse($result)])); + $result = $this->handleSingleItemStackRequest($itemStackRequest); + $this->session->sendDataPacket(ItemStackResponsePacket::create([$result])); } $blockActions = $packet->getBlockActions(); @@ -330,10 +333,11 @@ class InGamePacketHandler extends PacketHandler{ throw new PacketHandlingException("Too many actions in inventory transaction"); } + $this->inventoryManager->setCurrentItemStackRequestId($packet->requestId); $this->inventoryManager->addRawPredictedSlotChanges($packet->trData->getActions()); if($packet->trData instanceof NormalTransactionData){ - $result = $this->handleNormalTransaction($packet->trData); + $result = $this->handleNormalTransaction($packet->trData, $packet->requestId); }elseif($packet->trData instanceof MismatchTransactionData){ $this->session->getLogger()->debug("Mismatch transaction received"); $this->inventoryManager->syncAll(); @@ -349,22 +353,14 @@ class InGamePacketHandler extends PacketHandler{ if($this->craftingTransaction === null){ //don't sync if we're waiting to complete a crafting transaction $this->inventoryManager->syncMismatchedPredictedSlotChanges(); } - if($packet->requestId !== 0){ - $itemStackResponseBuilder = new ItemStackResponseBuilder($packet->requestId, $this->inventoryManager); - foreach($packet->requestChangedSlots as $requestChangedSlotsEntry){ - foreach($requestChangedSlotsEntry->getChangedSlotIndexes() as $slotId){ - $itemStackResponseBuilder->addSlot($requestChangedSlotsEntry->getContainerId(), $slotId); - } - } - $itemStackResponse = $itemStackResponseBuilder->build($result); - $this->session->sendDataPacket(ItemStackResponsePacket::create([$itemStackResponse])); - $this->session->getLogger()->debug("Sent item stack response for fake stack request " . $packet->requestId); - } + $this->inventoryManager->setCurrentItemStackRequestId(null); return $result; } - private function executeInventoryTransaction(InventoryTransaction $transaction) : bool{ + private function executeInventoryTransaction(InventoryTransaction $transaction, int $requestId) : bool{ $this->player->setUsingItem(false); + + $this->inventoryManager->setCurrentItemStackRequestId($requestId); $this->inventoryManager->addTransactionPredictedSlotChanges($transaction); try{ $transaction->execute(); @@ -373,12 +369,15 @@ class InGamePacketHandler extends PacketHandler{ $logger->debug("Failed to execute inventory transaction: " . $e->getMessage()); return false; + }finally{ + $this->inventoryManager->syncMismatchedPredictedSlotChanges(); + $this->inventoryManager->setCurrentItemStackRequestId(null); } return true; } - private function handleNormalTransaction(NormalTransactionData $data) : bool{ + private function handleNormalTransaction(NormalTransactionData $data, int $itemStackRequestId) : bool{ /** @var InventoryAction[] $actions */ $actions = []; @@ -426,7 +425,7 @@ class InGamePacketHandler extends PacketHandler{ return true; } try{ - return $this->executeInventoryTransaction($this->craftingTransaction); + return $this->executeInventoryTransaction($this->craftingTransaction, $itemStackRequestId); }finally{ $this->craftingTransaction = null; } @@ -443,7 +442,7 @@ class InGamePacketHandler extends PacketHandler{ return true; } - return $this->executeInventoryTransaction(new InventoryTransaction($this->player, $actions)); + return $this->executeInventoryTransaction(new InventoryTransaction($this->player, $actions), $itemStackRequestId); } } @@ -558,14 +557,19 @@ class InGamePacketHandler extends PacketHandler{ return false; } + private function handleSingleItemStackRequest(ItemStackRequest $request) : ItemStackResponse{ + $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); + $transaction = $executor->generateInventoryTransaction(); + $result = $this->executeInventoryTransaction($transaction, $request->getRequestId()); + $this->session->getLogger()->debug("Item stack request " . $request->getRequestId() . " result: " . ($result ? "success" : "failure")); + + return $executor->buildItemStackResponse($result); + } + public function handleItemStackRequest(ItemStackRequestPacket $packet) : bool{ $responses = []; foreach($packet->getRequests() as $request){ - $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); - $transaction = $executor->generateInventoryTransaction(); - $result = $this->executeInventoryTransaction($transaction); - $this->session->getLogger()->debug("Item stack request " . $request->getRequestId() . " result: " . ($result ? "success" : "failure")); - $responses[] = $executor->buildItemStackResponse($result); + $responses[] = $this->handleSingleItemStackRequest($request); } $this->session->sendDataPacket(ItemStackResponsePacket::create($responses)); diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 11315695e3..e83a75db4f 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -70,14 +70,23 @@ final class ItemStackResponseBuilder{ foreach($slotIds as $slotId){ [$inventory, $slot] = $this->getInventoryAndSlot($containerInterfaceId, $slotId); + $itemStackInfo = $this->inventoryManager->getItemStackInfo($inventory, $slot); + if($itemStackInfo === null){ + //TODO: what if a plugin closes the inventory while the transaction is ongoing? + throw new \LogicException("ItemStackInfo should never be null for an open inventory"); + } + if($itemStackInfo->getRequestId() !== $this->requestId){ + //the itemstack may have been synced due to transaction producing results that the client did not + //predict correctly, which will wipe out the tracked request ID (intentionally) + continue; + } $item = $inventory->getItem($slot); - $info = $this->inventoryManager->trackItemStack($inventory, $slot, $item, $this->requestId); $responseInfosByContainer[$containerInterfaceId][] = new ItemStackResponseSlotInfo( $slotId, $slotId, - $info->getItemStack()->getCount(), - $info->getStackId(), + $item->getCount(), + $itemStackInfo->getStackId(), $item->hasCustomName() ? $item->getCustomName() : "", 0 ); From 85231215e7d559ca0bd28471c79fab32970ca306 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 4 Jan 2023 23:10:46 +0300 Subject: [PATCH 0477/1858] Implemented Sculk (#5489) --- src/block/BlockTypeIds.php | 3 +- src/block/Sculk.php | 41 +++++++++++++++++++ src/block/VanillaBlocks.php | 2 + .../convert/BlockObjectToStateSerializer.php | 1 + .../BlockStateToObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 7 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/block/Sculk.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 3ab25dfbc5..c63b224324 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -707,8 +707,9 @@ final class BlockTypeIds{ public const TWISTING_VINES = 10680; public const WEEPING_VINES = 10681; public const CHAIN = 10682; + public const SCULK = 10683; - public const FIRST_UNUSED_BLOCK_ID = 10683; + public const FIRST_UNUSED_BLOCK_ID = 10684; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/Sculk.php b/src/block/Sculk.php new file mode 100644 index 0000000000..6f1f95f276 --- /dev/null +++ b/src/block/Sculk.php @@ -0,0 +1,41 @@ +mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); + $this->mapSimple(Blocks::SCULK(), Ids::SCULK); $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); $this->mapSimple(Blocks::SHULKER_BOX(), Ids::UNDYED_SHULKER_BOX); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 4621c65606..fdae56e317 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -407,6 +407,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); $this->mapSimple(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6()); + $this->mapSimple(Ids::SCULK, fn() => Blocks::SCULK()); $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); $this->mapSimple(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); $this->mapSimple(Ids::SLIME, fn() => Blocks::SLIME()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 63baf3effc..e6afaab5c9 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -936,6 +936,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("sandstone_stairs", fn() => Blocks::SANDSTONE_STAIRS()); $result->registerBlock("sandstone_wall", fn() => Blocks::SANDSTONE_WALL()); $result->registerBlock("sapling", fn() => Blocks::OAK_SAPLING()); + $result->registerBlock("sculk", fn() => Blocks::SCULK()); $result->registerBlock("sea_lantern", fn() => Blocks::SEA_LANTERN()); $result->registerBlock("sea_pickle", fn() => Blocks::SEA_PICKLE()); $result->registerBlock("sealantern", fn() => Blocks::SEA_LANTERN()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 490fc655ae..db27a85282 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 2e9a3f9160f2dbdcdf9632129221c7408ed69b86 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Jan 2023 22:29:29 +0000 Subject: [PATCH 0478/1858] Working crafting :woohoo: --- src/crafting/CraftingManager.php | 16 ++ .../transaction/CraftingTransaction.php | 51 +++-- src/network/mcpe/cache/CraftingDataCache.php | 23 +-- .../mcpe/handler/ItemStackRequestExecutor.php | 177 ++++++++++++------ .../mcpe/handler/ItemStackResponseBuilder.php | 4 + 5 files changed, 187 insertions(+), 84 deletions(-) diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 8edfaf3aa6..d1421c8374 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -45,6 +45,12 @@ class CraftingManager{ */ protected $shapelessRecipes = []; + /** + * @var CraftingRecipe[] + * @phpstan-var array + */ + private array $craftingRecipeIndex = []; + /** * @var FurnaceRecipeManager[] * @phpstan-var array @@ -153,6 +159,14 @@ class CraftingManager{ return $this->shapedRecipes; } + /** + * @return CraftingRecipe[] + * @phpstan-return array + */ + public function getCraftingRecipeIndex() : array{ + return $this->craftingRecipeIndex; + } + public function getFurnaceRecipeManager(FurnaceType $furnaceType) : FurnaceRecipeManager{ return $this->furnaceRecipeManagers[$furnaceType->id()]; } @@ -175,6 +189,7 @@ class CraftingManager{ public function registerShapedRecipe(ShapedRecipe $recipe) : void{ $this->shapedRecipes[self::hashOutputs($recipe->getResults())][] = $recipe; + $this->craftingRecipeIndex[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); @@ -183,6 +198,7 @@ class CraftingManager{ public function registerShapelessRecipe(ShapelessRecipe $recipe) : void{ $this->shapelessRecipes[self::hashOutputs($recipe->getResults())][] = $recipe; + $this->craftingRecipeIndex[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback(); diff --git a/src/inventory/transaction/CraftingTransaction.php b/src/inventory/transaction/CraftingTransaction.php index 792984e0fb..5771038ed9 100644 --- a/src/inventory/transaction/CraftingTransaction.php +++ b/src/inventory/transaction/CraftingTransaction.php @@ -60,9 +60,11 @@ class CraftingTransaction extends InventoryTransaction{ private CraftingManager $craftingManager; - public function __construct(Player $source, CraftingManager $craftingManager, array $actions = []){ + public function __construct(Player $source, CraftingManager $craftingManager, array $actions = [], ?CraftingRecipe $recipe = null, ?int $repetitions = null){ parent::__construct($source, $actions); $this->craftingManager = $craftingManager; + $this->recipe = $recipe; + $this->repetitions = $repetitions; } /** @@ -123,6 +125,18 @@ class CraftingTransaction extends InventoryTransaction{ return $iterations; } + private function validateRecipe(CraftingRecipe $recipe, ?int $expectedRepetitions) : int{ + //compute number of times recipe was crafted + $repetitions = $this->matchRecipeItems($this->outputs, $recipe->getResultsFor($this->source->getCraftingGrid()), false); + if($expectedRepetitions !== null && $repetitions !== $expectedRepetitions){ + throw new TransactionValidationException("Expected $expectedRepetitions repetitions, got $repetitions"); + } + //assert that $repetitions x recipe ingredients should be consumed + $this->matchRecipeItems($this->inputs, $recipe->getIngredientList(), true, $repetitions); + + return $repetitions; + } + public function validate() : void{ $this->squashDuplicateSlotChanges(); if(count($this->actions) < 1){ @@ -131,25 +145,24 @@ class CraftingTransaction extends InventoryTransaction{ $this->matchItems($this->outputs, $this->inputs); - $failed = 0; - foreach($this->craftingManager->matchRecipeByOutputs($this->outputs) as $recipe){ - try{ - //compute number of times recipe was crafted - $this->repetitions = $this->matchRecipeItems($this->outputs, $recipe->getResultsFor($this->source->getCraftingGrid()), false); - //assert that $repetitions x recipe ingredients should be consumed - $this->matchRecipeItems($this->inputs, $recipe->getIngredientList(), true, $this->repetitions); - - //Success! - $this->recipe = $recipe; - break; - }catch(TransactionValidationException $e){ - //failed - ++$failed; - } - } - if($this->recipe === null){ - throw new TransactionValidationException("Unable to match a recipe to transaction (tried to match against $failed recipes)"); + $failed = 0; + foreach($this->craftingManager->matchRecipeByOutputs($this->outputs) as $recipe){ + try{ + $this->repetitions = $this->validateRecipe($recipe, $this->repetitions); + $this->recipe = $recipe; + break; + }catch(TransactionValidationException $e){ + //failed + ++$failed; + } + } + + if($this->recipe === null){ + throw new TransactionValidationException("Unable to match a recipe to transaction (tried to match against $failed recipes)"); + } + }else{ + $this->repetitions = $this->validateRecipe($this->recipe, $this->repetitions); } } diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 8589f1881c..c1dc4820c2 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -25,6 +25,8 @@ namespace pocketmine\network\mcpe\cache; use pocketmine\crafting\CraftingManager; use pocketmine\crafting\FurnaceType; +use pocketmine\crafting\ShapedRecipe; +use pocketmine\crafting\ShapelessRecipe; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; use pocketmine\network\mcpe\convert\ItemTranslator; @@ -76,12 +78,12 @@ final class CraftingDataCache{ private function buildCraftingDataCache(CraftingManager $manager) : CraftingDataPacket{ Timings::$craftingDataCacheRebuild->startTiming(); - $counter = 0; $nullUUID = Uuid::fromString(Uuid::NIL); $converter = TypeConverter::getInstance(); $recipesWithTypeIds = []; - foreach($manager->getShapelessRecipes() as $list){ - foreach($list as $recipe){ + + foreach($manager->getCraftingRecipeIndex() as $index => $recipe){ + if($recipe instanceof ShapelessRecipe){ $typeTag = match($recipe->getType()->id()){ ShapelessRecipeType::CRAFTING()->id() => CraftingRecipeBlockName::CRAFTING_TABLE, ShapelessRecipeType::STONECUTTER()->id() => CraftingRecipeBlockName::STONECUTTER, @@ -89,7 +91,7 @@ final class CraftingDataCache{ }; $recipesWithTypeIds[] = new ProtocolShapelessRecipe( CraftingDataPacket::ENTRY_SHAPELESS, - Binary::writeInt(++$counter), + Binary::writeInt($index), array_map(function(Item $item) use ($converter) : RecipeIngredient{ return $converter->coreItemStackToRecipeIngredient($item); }, $recipe->getIngredientList()), @@ -99,12 +101,9 @@ final class CraftingDataCache{ $nullUUID, $typeTag, 50, - $counter + $index ); - } - } - foreach($manager->getShapedRecipes() as $list){ - foreach($list as $recipe){ + }elseif($recipe instanceof ShapedRecipe){ $inputs = []; for($row = 0, $height = $recipe->getHeight(); $row < $height; ++$row){ @@ -114,7 +113,7 @@ final class CraftingDataCache{ } $recipesWithTypeIds[] = $r = new ProtocolShapedRecipe( CraftingDataPacket::ENTRY_SHAPED, - Binary::writeInt(++$counter), + Binary::writeInt($index), $inputs, array_map(function(Item $item) use ($converter) : ItemStack{ return $converter->coreItemStackToNet($item); @@ -122,8 +121,10 @@ final class CraftingDataCache{ $nullUUID, CraftingRecipeBlockName::CRAFTING_TABLE, 50, - $counter + $index ); + }else{ + //TODO: probably special recipe types } } diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 4b7923205c..60edbab296 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; +use pocketmine\crafting\CraftingGrid; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; @@ -30,8 +31,8 @@ use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionBuilder; use pocketmine\inventory\transaction\TransactionBuilderInventory; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use pocketmine\network\mcpe\InventoryManager; +use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingConsumeInputStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingMarkSecondaryResultStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeAutoStackRequestAction; @@ -46,8 +47,10 @@ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\PlaceStackRequ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\SwapStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\TakeStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; +use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; +use pocketmine\utils\AssumptionFailedError; use function get_class; final class ItemStackRequestExecutor{ @@ -56,7 +59,11 @@ final class ItemStackRequestExecutor{ /** @var ItemStackRequestSlotInfo[] */ private array $requestSlotInfos = []; - private bool $crafting = false; + private ?InventoryTransaction $specialTransaction = null; + + /** @var Item[] */ + private array $craftingResults = []; + private int $craftingOutputIndex = 0; public function __construct( private Player $player, @@ -91,37 +98,91 @@ final class ItemStackRequestExecutor{ } private function transferItems(ItemStackRequestSlotInfo $source, ItemStackRequestSlotInfo $destination, int $count) : void{ - [$sourceInventory, $sourceSlot] = $this->getBuilderInventoryAndSlot($source); - [$targetInventory, $targetSlot] = $this->getBuilderInventoryAndSlot($destination); - - $oldSourceItem = $sourceInventory->getItem($sourceSlot); - $oldTargetItem = $targetInventory->getItem($targetSlot); - - if(!$targetInventory->isSlotEmpty($targetSlot) && !$oldTargetItem->canStackWith($oldSourceItem)){ - throw new PacketHandlingException("Can only transfer items into an empty slot, or a slot containing the same item"); - } - [$newSourceItem, $newTargetItem] = $this->splitStack($oldSourceItem, $count, $oldTargetItem->getCount()); - - $sourceInventory->setItem($sourceSlot, $newSourceItem); - $targetInventory->setItem($targetSlot, $newTargetItem); + $removed = $this->removeItemFromSlot($source, $count); + $this->addItemToSlot($destination, $removed, $count); } /** - * @phpstan-return array{Item, Item} + * Deducts items from an inventory slot, returning a stack containing the removed items. */ - private function splitStack(Item $item, int $transferredCount, int $targetCount) : array{ - if($item->getCount() < $transferredCount){ - throw new PacketHandlingException("Cannot take $transferredCount items from a stack of " . $item->getCount()); + private function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ + $this->requestSlotInfos[] = $slotInfo; + [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); + + $existingItem = $inventory->getItem($slot); + if($existingItem->getCount() < $count){ + throw new PacketHandlingException("Cannot take $count items from a stack of " . $existingItem->getCount()); } + $removed = $existingItem->pop($count); + $inventory->setItem($slot, $existingItem); + + return $removed; + } + + /** + * Adds items to the target slot, if they are stackable. + */ + private function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : Item{ + $this->requestSlotInfos[] = $slotInfo; + [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); + + $existingItem = $inventory->getItem($slot); + if(!$existingItem->isNull() && !$existingItem->canStackWith($item)){ + throw new PacketHandlingException("Can only add items to an empty slot, or a slot containing the same item"); + } + + //we can't use the existing item here; it may be an empty stack + $newItem = clone $item; + $newItem->setCount($existingItem->getCount() + $count); + $inventory->setItem($slot, $newItem); + $leftover = clone $item; - $removed = $leftover->pop($transferredCount); - $removed->setCount($removed->getCount() + $targetCount); - if($leftover->isNull()){ - $leftover = VanillaItems::AIR(); + $leftover->pop($count); + + return $leftover; + } + + private function beginCrafting(int $recipeId, int $repetitions) : void{ + if($this->specialTransaction !== null){ + throw new PacketHandlingException("Cannot perform more than 1 special action per request"); + } + if($repetitions < 1){ //TODO: upper bound? + throw new PacketHandlingException("Cannot craft a recipe less than 1 time"); + } + $craftingManager = $this->player->getServer()->getCraftingManager(); + $recipe = $craftingManager->getCraftingRecipeIndex()[$recipeId] ?? null; + if($recipe === null){ + throw new PacketHandlingException("Unknown crafting recipe ID $recipeId"); } - return [$leftover, $removed]; + $this->specialTransaction = new CraftingTransaction($this->player, $craftingManager, [], $recipe, $repetitions); + + $currentWindow = $this->player->getCurrentWindow(); + if($currentWindow !== null && !($currentWindow instanceof CraftingGrid)){ + throw new PacketHandlingException("Cannot complete crafting when the player's current window is not a crafting grid"); + } + $craftingGrid = $currentWindow ?? $this->player->getCraftingGrid(); + + $craftingResults = $recipe->getResultsFor($craftingGrid); + foreach($craftingResults as $k => $craftingResult){ + $craftingResult->setCount($craftingResult->getCount() * $repetitions); + $this->craftingResults[$k] = $craftingResult; + } + } + + private function takeCraftingResult(ItemStackRequestSlotInfo $destination, int $count) : void{ + $recipeResultItem = $this->craftingResults[$this->craftingOutputIndex] ?? null; + if($recipeResultItem === null){ + throw new PacketHandlingException("Cannot refer to nonexisting crafting output index " . $this->craftingOutputIndex); + } + + $availableCount = $recipeResultItem->getCount(); + if($availableCount < $count){ + throw new PacketHandlingException("Tried to take too many results from crafting"); + } + + $this->craftingResults[$this->craftingOutputIndex] = $this->addItemToSlot($destination, $recipeResultItem, $count); } private function processItemStackRequestAction(ItemStackRequestAction $action) : void{ @@ -129,9 +190,14 @@ final class ItemStackRequestExecutor{ $action instanceof TakeStackRequestAction || $action instanceof PlaceStackRequestAction ){ - $this->requestSlotInfos[] = $action->getSource(); - $this->requestSlotInfos[] = $action->getDestination(); - $this->transferItems($action->getSource(), $action->getDestination(), $action->getCount()); + $source = $action->getSource(); + $destination = $action->getDestination(); + + if($source->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $source->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ + $this->takeCraftingResult($destination, $action->getCount()); + }else{ + $this->transferItems($source, $destination, $action->getCount()); + } }elseif($action instanceof SwapStackRequestAction){ $this->requestSlotInfos[] = $action->getSlot1(); $this->requestSlotInfos[] = $action->getSlot2(); @@ -144,35 +210,35 @@ final class ItemStackRequestExecutor{ $inventory1->setItem($slot1, $item2); $inventory2->setItem($slot2, $item1); }elseif($action instanceof DropStackRequestAction){ - $this->requestSlotInfos[] = $action->getSource(); - [$inventory, $slot] = $this->getBuilderInventoryAndSlot($action->getSource()); - - $oldItem = $inventory->getItem($slot); - [$leftover, $dropped] = $this->splitStack($oldItem, $action->getCount(), 0); - //TODO: this action has a "randomly" field, I have no idea what it's used for - $inventory->setItem($slot, $leftover); + $dropped = $this->removeItemFromSlot($action->getSource(), $action->getCount()); $this->builder->addAction(new DropItemAction($dropped)); + }elseif($action instanceof DestroyStackRequestAction){ - $this->requestSlotInfos[] = $action->getSource(); - [$inventory, $slot] = $this->getBuilderInventoryAndSlot($action->getSource()); - - $oldItem = $inventory->getItem($slot); - [$leftover, $destroyed] = $this->splitStack($oldItem, $action->getCount(), 0); - - $inventory->setItem($slot, $leftover); + $destroyed = $this->removeItemFromSlot($action->getSource(), $action->getCount()); $this->builder->addAction(new DestroyItemAction($destroyed)); + + }elseif($action instanceof CraftRecipeStackRequestAction){ + $this->beginCrafting($action->getRecipeId(), 1); + }elseif($action instanceof CraftRecipeAutoStackRequestAction){ + $this->beginCrafting($action->getRecipeId(), $action->getRepetitions()); }elseif($action instanceof CraftingConsumeInputStackRequestAction){ - //we don't need this for the PM system - $this->requestSlotInfos[] = $action->getSource(); - $this->crafting = true; - }elseif( - $action instanceof CraftRecipeStackRequestAction || //TODO - $action instanceof CraftRecipeAutoStackRequestAction || //TODO - $action instanceof CraftingMarkSecondaryResultStackRequestAction || //no obvious use - $action instanceof DeprecatedCraftingResultsStackRequestAction //no obvious use - ){ - $this->crafting = true; + if(!$this->specialTransaction instanceof CraftingTransaction){ + throw new PacketHandlingException("Cannot consume crafting input when no crafting transaction is in progress"); + } + $this->removeItemFromSlot($action->getSource(), $action->getCount()); //output discarded - we allow CraftingTransaction to verify the balance + + }elseif($action instanceof CraftingMarkSecondaryResultStackRequestAction){ + if(!$this->specialTransaction instanceof CraftingTransaction){ + throw new AssumptionFailedError("Cannot mark crafting result index when no crafting transaction is in progress"); + } + $outputIndex = $action->getCraftingGridSlot(); + if($outputIndex < 0){ + throw new PacketHandlingException("Crafting result index cannot be negative"); + } + $this->craftingOutputIndex = $outputIndex; + }elseif($action instanceof DeprecatedCraftingResultsStackRequestAction){ + //no obvious use }else{ throw new PacketHandlingException("Unhandled item stack request action: " . get_class($action)); } @@ -184,9 +250,12 @@ final class ItemStackRequestExecutor{ } $inventoryActions = $this->builder->generateActions(); - return $this->crafting ? - new CraftingTransaction($this->player, $this->player->getServer()->getCraftingManager(), $inventoryActions) : - new InventoryTransaction($this->player, $inventoryActions); + $transaction = $this->specialTransaction ?? new InventoryTransaction($this->player); + foreach($inventoryActions as $action){ + $transaction->addAction($action); + } + + return $transaction; } public function buildItemStackResponse(bool $success) : ItemStackResponse{ diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index e83a75db4f..722ed39bf6 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\inventory\Inventory; use pocketmine\network\mcpe\InventoryManager; +use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseContainerInfo; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseSlotInfo; @@ -67,6 +68,9 @@ final class ItemStackResponseBuilder{ public function build(bool $success) : ItemStackResponse{ $responseInfosByContainer = []; foreach($this->changedSlots as $containerInterfaceId => $slotIds){ + if($containerInterfaceId === ContainerUIIds::CREATED_OUTPUT){ + continue; + } foreach($slotIds as $slotId){ [$inventory, $slot] = $this->getInventoryAndSlot($containerInterfaceId, $slotId); From c6e11a845320af4bfa102cc012e0db57bdea2357 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Wed, 4 Jan 2023 18:22:31 -0500 Subject: [PATCH 0479/1858] Remove unnecessary ternary operator (#5493) --- src/network/mcpe/handler/ItemStackResponseBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 722ed39bf6..782404ebe4 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -91,7 +91,7 @@ final class ItemStackResponseBuilder{ $slotId, $item->getCount(), $itemStackInfo->getStackId(), - $item->hasCustomName() ? $item->getCustomName() : "", + $item->getCustomName(), 0 ); } From eedc943766ed310bccbf3ee039ff2cce3f501e95 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 5 Jan 2023 17:23:50 +0000 Subject: [PATCH 0480/1858] Confine legacy transaction handling to dropping items only --- .../mcpe/handler/InGamePacketHandler.php | 100 +++++++----------- 1 file changed, 38 insertions(+), 62 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index c618c2c16a..b6b7c68beb 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -31,11 +31,11 @@ use pocketmine\entity\animation\ConsumingItemAnimation; use pocketmine\entity\Attribute; use pocketmine\entity\InvalidSkinException; use pocketmine\event\player\PlayerEditBookEvent; -use pocketmine\inventory\transaction\action\InventoryAction; +use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; use pocketmine\inventory\transaction\InventoryTransaction; +use pocketmine\inventory\transaction\TransactionBuilder; use pocketmine\inventory\transaction\TransactionException; -use pocketmine\inventory\transaction\TransactionValidationException; use pocketmine\item\VanillaItems; use pocketmine\item\WritableBook; use pocketmine\item\WritableBookPage; @@ -99,7 +99,6 @@ use pocketmine\network\mcpe\protocol\types\inventory\NormalTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\ReleaseItemTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\ItemStackRequest; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; -use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\mcpe\protocol\types\inventory\UseItemOnEntityTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\UseItemTransactionData; use pocketmine\network\mcpe\protocol\types\PlayerAction; @@ -378,72 +377,49 @@ class InGamePacketHandler extends PacketHandler{ } private function handleNormalTransaction(NormalTransactionData $data, int $itemStackRequestId) : bool{ - /** @var InventoryAction[] $actions */ - $actions = []; + //When the ItemStackRequest system is used, this transaction type is only used for dropping items by pressing Q. + //I don't know why they don't just use ItemStackRequest for that too, which already supports dropping items by + //clicking them outside an open inventory menu, but for now it is what it is. + //Fortunately, this means we can be extremely strict about the validation criteria. + + if(count($data->getActions()) > 2){ + throw new PacketHandlingException("Expected exactly 2 actions for dropping an item"); + } - $isCraftingPart = false; - $converter = TypeConverter::getInstance(); foreach($data->getActions() as $networkInventoryAction){ - if( - $networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_TODO || ( - $this->craftingTransaction !== null && - !$networkInventoryAction->oldItem->getItemStack()->equals($networkInventoryAction->newItem->getItemStack()) && - $networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_CONTAINER && - $networkInventoryAction->windowId === ContainerIds::UI && - $networkInventoryAction->inventorySlot === UIInventorySlotOffset::CREATED_ITEM_OUTPUT - ) - ){ - $isCraftingPart = true; - } + if($networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_WORLD){ + //drop item - we don't need to validate this, we only care about the count + //if the resulting actions don't match the client for some reason, it will trigger an automatic + //prediction rollback anyway. + //it's technically possible to see this more than once, but a normal client should never do that. + $inventory = $this->player->getInventory(); + $heldItem = $inventory->getItemInHand(); - try{ - $action = $converter->createInventoryAction($networkInventoryAction, $this->player, $this->inventoryManager); - if($action !== null){ - $actions[] = $action; + try{ + $droppedItem = TypeConverter::getInstance()->netItemStackToCore($networkInventoryAction->newItem->getItemStack()); + }catch(TypeConversionException $e){ + throw PacketHandlingException::wrap($e); } - }catch(TypeConversionException $e){ - $this->session->getLogger()->debug("Error unpacking inventory action: " . $e->getMessage()); - return false; + + //TODO: if we can avoid decoding incoming item NBT, it will be faster to compare network ItemStacks + //rather than converting to internal itemstacks and using canStackWith() here. + if(!$heldItem->canStackWith($droppedItem) || $heldItem->getCount() < $droppedItem->getCount()){ + return false; + } + + //purposely overwritten here - this allows any immutable internal references to be shared + $droppedItem = $heldItem->pop($droppedItem->getCount()); + + $builder = new TransactionBuilder(); + $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $heldItem); + $builder->addAction(new DropItemAction($droppedItem)); + + $transaction = new InventoryTransaction($this->player, $builder->generateActions()); + return $this->executeInventoryTransaction($transaction, $itemStackRequestId); } } - if($isCraftingPart){ - if($this->craftingTransaction === null){ - //TODO: this might not be crafting if there is a special inventory open (anvil, enchanting, loom etc) - $this->craftingTransaction = new CraftingTransaction($this->player, $this->player->getServer()->getCraftingManager(), $actions); - }else{ - foreach($actions as $action){ - $this->craftingTransaction->addAction($action); - } - } - - try{ - $this->craftingTransaction->validate(); - }catch(TransactionValidationException $e){ - //transaction is incomplete - crafting transaction comes in lots of little bits, so we have to collect - //all of the parts before we can execute it - return true; - } - try{ - return $this->executeInventoryTransaction($this->craftingTransaction, $itemStackRequestId); - }finally{ - $this->craftingTransaction = null; - } - }else{ - //normal transaction fallthru - if($this->craftingTransaction !== null){ - $this->session->getLogger()->debug("Got unexpected normal inventory action with incomplete crafting transaction, refusing to execute crafting"); - $this->craftingTransaction = null; - return false; - } - - if(count($actions) === 0){ - //TODO: 1.13+ often sends transactions with nothing but useless crap in them, no need for the debug noise - return true; - } - - return $this->executeInventoryTransaction(new InventoryTransaction($this->player, $actions), $itemStackRequestId); - } + throw new PacketHandlingException("Legacy 'normal' transactions should only be used for dropping items"); } private function handleUseItemTransaction(UseItemTransactionData $data) : bool{ From 30d3869eea998dbe9a1ff6c98fb9782383404a5c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 5 Jan 2023 17:26:58 +0000 Subject: [PATCH 0481/1858] Remove dead code --- src/network/mcpe/convert/TypeConverter.php | 66 ---------------------- 1 file changed, 66 deletions(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 2c7a3415ef..e8826e5912 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -24,11 +24,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\block\BlockLegacyIds; -use pocketmine\inventory\transaction\action\CreateItemAction; -use pocketmine\inventory\transaction\action\DestroyItemAction; -use pocketmine\inventory\transaction\action\DropItemAction; -use pocketmine\inventory\transaction\action\InventoryAction; -use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -37,17 +32,12 @@ use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; -use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\protocol\types\GameMode as ProtocolGameMode; -use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; -use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; -use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; use pocketmine\player\GameMode; -use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; @@ -261,60 +251,4 @@ class TypeConverter{ throw TypeConversionException::wrap($e, "Bad itemstack NBT data"); } } - - /** - * @throws TypeConversionException - */ - public function createInventoryAction(NetworkInventoryAction $action, Player $player, InventoryManager $inventoryManager) : ?InventoryAction{ - if($action->oldItem->getItemStack()->equals($action->newItem->getItemStack())){ - //filter out useless noise in 1.13 - return null; - } - try{ - $old = $this->netItemStackToCore($action->oldItem->getItemStack()); - }catch(TypeConversionException $e){ - throw TypeConversionException::wrap($e, "Inventory action: oldItem"); - } - try{ - $new = $this->netItemStackToCore($action->newItem->getItemStack()); - }catch(TypeConversionException $e){ - throw TypeConversionException::wrap($e, "Inventory action: newItem"); - } - switch($action->sourceType){ - case NetworkInventoryAction::SOURCE_CONTAINER: - if($action->windowId === ContainerIds::UI && $action->inventorySlot === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ - return null; //useless noise - } - $located = $inventoryManager->locateWindowAndSlot($action->windowId, $action->inventorySlot); - if($located !== null){ - [$window, $slot] = $located; - return new SlotChangeAction($window, $slot, $old, $new); - } - - throw new TypeConversionException("No open container with window ID $action->windowId"); - case NetworkInventoryAction::SOURCE_WORLD: - if($action->inventorySlot !== NetworkInventoryAction::ACTION_MAGIC_SLOT_DROP_ITEM){ - throw new TypeConversionException("Only expecting drop-item world actions from the client!"); - } - - return new DropItemAction($new); - case NetworkInventoryAction::SOURCE_CREATIVE: - switch($action->inventorySlot){ - case NetworkInventoryAction::ACTION_MAGIC_SLOT_CREATIVE_DELETE_ITEM: - return new DestroyItemAction($new); - case NetworkInventoryAction::ACTION_MAGIC_SLOT_CREATIVE_CREATE_ITEM: - return new CreateItemAction($old); - default: - throw new TypeConversionException("Unexpected creative action type $action->inventorySlot"); - - } - case NetworkInventoryAction::SOURCE_TODO: - //These are used to balance a transaction that involves special actions, like crafting, enchanting, etc. - //The vanilla server just accepted these without verifying them. We don't need to care about them since - //we verify crafting by checking for imbalances anyway. - return null; - default: - throw new TypeConversionException("Unknown inventory source type $action->sourceType"); - } - } } From 3d6baa8a55ca3c2ce1870a6e67ab8adf13deb9db Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 5 Jan 2023 18:09:57 +0000 Subject: [PATCH 0482/1858] Working creative inventory, with a few more hacks than I'd like --- src/network/mcpe/InventoryManager.php | 13 ++-- .../mcpe/handler/ItemStackRequestExecutor.php | 78 ++++++++++++++----- 2 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index ea978d2cb7..d710d12710 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -60,7 +60,6 @@ use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\ObjectSet; -use function array_map; use function array_search; use function get_class; use function is_int; @@ -512,10 +511,14 @@ class InventoryManager{ public function syncCreative() : void{ $typeConverter = TypeConverter::getInstance(); - $nextEntryId = 1; - $this->session->sendDataPacket(CreativeContentPacket::create(array_map(function(Item $item) use($typeConverter, &$nextEntryId) : CreativeContentEntry{ - return new CreativeContentEntry($nextEntryId++, $typeConverter->coreItemStackToNet($item)); - }, $this->player->isSpectator() ? [] : CreativeInventory::getInstance()->getAll()))); + $entries = []; + if(!$this->player->isSpectator()){ + //creative inventory may have holes if items were unregistered - ensure network IDs used are always consistent + foreach(CreativeInventory::getInstance()->getAll() as $k => $item){ + $entries[] = new CreativeContentEntry($k, $typeConverter->coreItemStackToNet($item)); + } + } + $this->session->sendDataPacket(CreativeContentPacket::create($entries)); } private function newItemStackId() : int{ diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 60edbab296..46e9caf7f7 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; use pocketmine\crafting\CraftingGrid; +use pocketmine\inventory\CreativeInventory; +use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; @@ -37,6 +39,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingConsum use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingMarkSecondaryResultStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeAutoStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeStackRequestAction; +use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CreativeCreateStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\DeprecatedCraftingResultsStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\DestroyStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\DropStackRequestAction; @@ -51,6 +54,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; +use function array_key_first; use function get_class; final class ItemStackRequestExecutor{ @@ -63,7 +67,10 @@ final class ItemStackRequestExecutor{ /** @var Item[] */ private array $craftingResults = []; - private int $craftingOutputIndex = 0; + + private ?Item $nextCreatedItem = null; + private bool $createdItemFromCreativeInventory = false; + private int $createdItemsTakenCount = 0; public function __construct( private Player $player, @@ -123,7 +130,7 @@ final class ItemStackRequestExecutor{ /** * Adds items to the target slot, if they are stackable. */ - private function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : Item{ + private function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : void{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); @@ -136,11 +143,25 @@ final class ItemStackRequestExecutor{ $newItem = clone $item; $newItem->setCount($existingItem->getCount() + $count); $inventory->setItem($slot, $newItem); + } - $leftover = clone $item; - $leftover->pop($count); - - return $leftover; + private function setNextCreatedItem(?Item $item, bool $creative = false) : void{ + if($item !== null && $item->isNull()){ + $item = null; + } + if($this->nextCreatedItem !== null){ + //while this is more complicated than simply adding the action when the item is taken, this ensures that + //plugins can tell the difference between 1 item that got split into 2 slots, vs 2 separate items. + if($this->createdItemFromCreativeInventory && $this->createdItemsTakenCount > 0){ + $this->nextCreatedItem->setCount($this->createdItemsTakenCount); + $this->builder->addAction(new CreateItemAction($this->nextCreatedItem)); + }elseif($this->createdItemsTakenCount < $this->nextCreatedItem->getCount()){ + throw new PacketHandlingException("Not all of the previous created item was taken"); + } + } + $this->nextCreatedItem = $item; + $this->createdItemFromCreativeInventory = $creative; + $this->createdItemsTakenCount = 0; } private function beginCrafting(int $recipeId, int $repetitions) : void{ @@ -169,20 +190,27 @@ final class ItemStackRequestExecutor{ $craftingResult->setCount($craftingResult->getCount() * $repetitions); $this->craftingResults[$k] = $craftingResult; } + $this->setNextCreatedItem($this->craftingResults[array_key_first($this->craftingResults)]); } - private function takeCraftingResult(ItemStackRequestSlotInfo $destination, int $count) : void{ - $recipeResultItem = $this->craftingResults[$this->craftingOutputIndex] ?? null; - if($recipeResultItem === null){ - throw new PacketHandlingException("Cannot refer to nonexisting crafting output index " . $this->craftingOutputIndex); + private function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ + $createdItem = $this->nextCreatedItem; + if($createdItem === null){ + throw new PacketHandlingException("No created item is waiting to be taken"); } - $availableCount = $recipeResultItem->getCount(); - if($availableCount < $count){ - throw new PacketHandlingException("Tried to take too many results from crafting"); + if(!$this->createdItemFromCreativeInventory){ + $availableCount = $createdItem->getCount() - $this->createdItemsTakenCount; + if($count > $availableCount){ + throw new PacketHandlingException("Not enough created items available to be taken (have $availableCount, tried to take $count)"); + } } - $this->craftingResults[$this->craftingOutputIndex] = $this->addItemToSlot($destination, $recipeResultItem, $count); + $this->createdItemsTakenCount += $count; + $this->addItemToSlot($destination, $createdItem, $count); + if(!$this->createdItemFromCreativeInventory && $this->createdItemsTakenCount >= $createdItem->getCount()){ + $this->setNextCreatedItem(null); + } } private function processItemStackRequestAction(ItemStackRequestAction $action) : void{ @@ -194,7 +222,7 @@ final class ItemStackRequestExecutor{ $destination = $action->getDestination(); if($source->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $source->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ - $this->takeCraftingResult($destination, $action->getCount()); + $this->takeCreatedItem($destination, $action->getCount()); }else{ $this->transferItems($source, $destination, $action->getCount()); } @@ -218,6 +246,16 @@ final class ItemStackRequestExecutor{ $destroyed = $this->removeItemFromSlot($action->getSource(), $action->getCount()); $this->builder->addAction(new DestroyItemAction($destroyed)); + }elseif($action instanceof CreativeCreateStackRequestAction){ + $item = CreativeInventory::getInstance()->getItem($action->getCreativeItemId()); + if($item === null){ + //TODO: the item may have been unregistered after the client was sent the creative contents, leaving a + //gap in the creative item list. This probably shouldn't be a violation, but I'm not sure how else to + //handle it right now. + throw new PacketHandlingException("Tried to create nonexisting creative item " . $action->getCreativeItemId()); + } + + $this->setNextCreatedItem($item, true); }elseif($action instanceof CraftRecipeStackRequestAction){ $this->beginCrafting($action->getRecipeId(), 1); }elseif($action instanceof CraftRecipeAutoStackRequestAction){ @@ -232,11 +270,12 @@ final class ItemStackRequestExecutor{ if(!$this->specialTransaction instanceof CraftingTransaction){ throw new AssumptionFailedError("Cannot mark crafting result index when no crafting transaction is in progress"); } - $outputIndex = $action->getCraftingGridSlot(); - if($outputIndex < 0){ - throw new PacketHandlingException("Crafting result index cannot be negative"); + + $nextResultItem = $this->craftingResults[$action->getCraftingGridSlot()] ?? null; + if($nextResultItem === null){ + throw new PacketHandlingException("No such crafting result index " . $action->getCraftingGridSlot()); } - $this->craftingOutputIndex = $outputIndex; + $this->setNextCreatedItem($nextResultItem); }elseif($action instanceof DeprecatedCraftingResultsStackRequestAction){ //no obvious use }else{ @@ -248,6 +287,7 @@ final class ItemStackRequestExecutor{ foreach($this->request->getActions() as $action){ $this->processItemStackRequestAction($action); } + $this->setNextCreatedItem(null); $inventoryActions = $this->builder->generateActions(); $transaction = $this->specialTransaction ?? new InventoryTransaction($this->player); From 36525d905543849379badd051ceac9609bf1872c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 5 Jan 2023 20:41:44 +0000 Subject: [PATCH 0483/1858] Fixed multi-output recipe handling --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 46e9caf7f7..ce9fe2d9a2 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -190,7 +190,10 @@ final class ItemStackRequestExecutor{ $craftingResult->setCount($craftingResult->getCount() * $repetitions); $this->craftingResults[$k] = $craftingResult; } - $this->setNextCreatedItem($this->craftingResults[array_key_first($this->craftingResults)]); + if(count($this->craftingResults) === 1){ + //for multi-output recipes, later actions will tell us which result to create and when + $this->setNextCreatedItem($this->craftingResults[array_key_first($this->craftingResults)]); + } } private function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ From b24eb153f9d3478b4159d6e904971f9e6c267118 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 5 Jan 2023 21:18:30 +0000 Subject: [PATCH 0484/1858] Constrain inventory transaction predictions these are now only used for actions done with a closed inventory window. This means that they can only predict the slots of inventory, offhand and armor (total 41 slots) and perhaps include some DropItem actions. --- src/network/mcpe/InventoryManager.php | 9 +++++++++ src/network/mcpe/handler/InGamePacketHandler.php | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index d710d12710..b9cb992620 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -210,6 +210,15 @@ class InventoryManager{ if($action->sourceType !== NetworkInventoryAction::SOURCE_CONTAINER){ continue; } + + //legacy transactions should not modify or predict anything other than these inventories, since these are + //the only ones accessible when not in-game (ItemStackRequest is used for everything else) + if(match($action->windowId){ + ContainerIds::INVENTORY, ContainerIds::OFFHAND, ContainerIds::ARMOR => false, + default => true + }){ + throw new PacketHandlingException("Legacy transactions cannot predict changes to inventory with ID " . $action->windowId); + } $info = $this->locateWindowAndSlot($action->windowId, $action->inventorySlot); if($info === null){ continue; diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index b6b7c68beb..80a0f20151 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -328,7 +328,7 @@ class InGamePacketHandler extends PacketHandler{ public function handleInventoryTransaction(InventoryTransactionPacket $packet) : bool{ $result = true; - if(count($packet->trData->getActions()) > 100){ + if(count($packet->trData->getActions()) > 50){ throw new PacketHandlingException("Too many actions in inventory transaction"); } From d3cea2ca7cc16561df483981cab8e86c59b98ee5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 6 Jan 2023 02:07:31 +0000 Subject: [PATCH 0485/1858] CS --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index ce9fe2d9a2..37ba047f1c 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -55,6 +55,7 @@ use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use function array_key_first; +use function count; use function get_class; final class ItemStackRequestExecutor{ From 8633804f156817eb4db9f44ed2125e44ded01667 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 6 Jan 2023 20:26:19 +0000 Subject: [PATCH 0486/1858] InventoryManager: disentangle slot tracking from slot syncing --- src/inventory/BaseInventory.php | 2 +- src/network/mcpe/InventoryManager.php | 117 ++++++++++++++------------ 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 06b3b9800e..daf41c5799 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -348,7 +348,7 @@ abstract class BaseInventory implements Inventory{ if($invManager === null){ continue; } - $invManager->syncSlot($this, $index); + $invManager->onSlotChange($this, $index); } } diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index b9cb992620..cdc5881806 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -382,51 +382,63 @@ class InventoryManager{ } } + public function onSlotChange(Inventory $inventory, int $slot) : void{ + $currentItem = $inventory->getItem($slot); + $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; + $clientSideItem = $predictions?->getSlot($slot); + if($clientSideItem === null || !$clientSideItem->equalsExact($currentItem)){ + //no prediction or incorrect - do not associate this with the currently active itemstack request + $this->trackItemStack($inventory, $slot, $currentItem, null); + $this->syncSlot($inventory, $slot); + }else{ + //correctly predicted - associate the change with the currently active itemstack request + $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); + } + $predictions?->remove($slot); + } + public function syncSlot(Inventory $inventory, int $slot) : void{ + $itemStackInfo = $this->getItemStackInfo($inventory, $slot); + if($itemStackInfo === null){ + throw new \LogicException("Cannot sync an untracked inventory slot"); + } $slotMap = $this->complexWindows[spl_object_id($inventory)] ?? null; if($slotMap !== null){ $windowId = ContainerIds::UI; - $netSlot = $slotMap->mapCoreToNet($slot) ?? null; + $netSlot = $slotMap->mapCoreToNet($slot) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); }else{ - $windowId = $this->getWindowId($inventory); + $windowId = $this->getWindowId($inventory) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); $netSlot = $slot; } - if($windowId !== null && $netSlot !== null){ - $currentItem = $inventory->getItem($slot); - $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; - $clientSideItem = $predictions?->getSlot($slot); - if($clientSideItem === null || !$clientSideItem->equalsExact($currentItem)){ - $itemStackWrapper = $this->wrapItemStack($inventory, $slot, $currentItem); - if($windowId === ContainerIds::OFFHAND){ - //TODO: HACK! - //The client may sometimes ignore the InventorySlotPacket for the offhand slot. - //This can cause a lot of problems (totems, arrows, and more...). - //The workaround is to send an InventoryContentPacket instead - //BDS (Bedrock Dedicated Server) also seems to work this way. - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, [$itemStackWrapper])); - }else{ - if($this->currentItemStackRequestId !== null){ - //TODO: HACK! - //When right-clicking to equip armour, the client predicts the content of the armour slot, but - //doesn't report it in the transaction packet. The server then sends an InventorySlotPacket to - //the client, assuming the slot changed for some other reason, since there is no prediction for - //the slot. - //However, later requests involving that itemstack will refer to the request ID in which the - //armour was equipped, instead of the stack ID provided by the server in the outgoing - //InventorySlotPacket. (Perhaps because the item is already the same as the client actually - //predicted, but didn't tell us?) - //We work around this bug by setting the slot to air and then back to the correct item. In - //theory, setting a different count and then back again (or changing any other property) would - //also work, but this is simpler. - $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, new ItemStackWrapper(0, ItemStack::null()))); - } - $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); - } - }elseif($this->currentItemStackRequestId !== null){ - $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); + + $itemStackWrapper = new ItemStackWrapper($itemStackInfo->getStackId(), $itemStackInfo->getItemStack()); + if($windowId === ContainerIds::OFFHAND){ + //TODO: HACK! + //The client may sometimes ignore the InventorySlotPacket for the offhand slot. + //This can cause a lot of problems (totems, arrows, and more...). + //The workaround is to send an InventoryContentPacket instead + //BDS (Bedrock Dedicated Server) also seems to work this way. + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, [$itemStackWrapper])); + }else{ + if($this->currentItemStackRequestId !== null){ + //TODO: HACK! + //When right-clicking to equip armour, the client predicts the content of the armour slot, but + //doesn't report it in the transaction packet. The server then sends an InventorySlotPacket to + //the client, assuming the slot changed for some other reason, since there is no prediction for + //the slot. + //However, later requests involving that itemstack will refer to the request ID in which the + //armour was equipped, instead of the stack ID provided by the server in the outgoing + //InventorySlotPacket. (Perhaps because the item is already the same as the client actually + //predicted, but didn't tell us?) + //We work around this bug by setting the slot to air and then back to the correct item. In + //theory, setting a different count and then back again (or changing any other property) would + //also work, but this is simpler. + $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, new ItemStackWrapper(0, ItemStack::null()))); } - $predictions?->remove($slot); + $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); } + $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; + $predictions?->remove($slot); } public function syncContents(Inventory $inventory) : void{ @@ -437,26 +449,25 @@ class InventoryManager{ $windowId = $this->getWindowId($inventory); } if($windowId !== null){ + unset($this->initiatedSlotChanges[spl_object_id($inventory)]); + $contents = []; + foreach($inventory->getContents(true) as $slot => $item){ + $info = $this->trackItemStack($inventory, $slot, $item, null); + $contents[] = new ItemStackWrapper($info->getStackId(), $info->getItemStack()); + } if($slotMap !== null){ - $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; - foreach($inventory->getContents(true) as $slotId => $item){ + foreach($contents as $slotId => $info){ $packetSlot = $slotMap->mapCoreToNet($slotId) ?? null; if($packetSlot === null){ continue; } - $predictions?->remove($slotId); $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $packetSlot, - $this->wrapItemStack($inventory, $slotId, $inventory->getItem($slotId)) + $info )); } }else{ - unset($this->initiatedSlotChanges[spl_object_id($inventory)]); - $contents = []; - foreach($inventory->getContents(true) as $slotId => $item){ - $contents[] = $this->wrapItemStack($inventory, $slotId, $item); - } $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $contents)); } } @@ -475,14 +486,13 @@ class InventoryManager{ foreach($this->initiatedSlotChanges as $predictions){ $inventory = $predictions->getInventory(); foreach($predictions->getSlots() as $slot => $expectedItem){ - if(!$inventory->slotExists($slot)){ + if(!$inventory->slotExists($slot) || $this->getItemStackInfo($inventory, $slot) === null){ continue; //TODO: size desync ??? } - $actualItem = $inventory->getItem($slot); - if(!$actualItem->equalsExact($expectedItem)){ - $this->session->getLogger()->debug("Detected prediction mismatch in inventory " . get_class($inventory) . "#" . spl_object_id($inventory) . " slot $slot"); - $this->syncSlot($inventory, $slot); - } + + //any prediction that still exists at this point is a slot that was predicted to change but didn't + $this->session->getLogger()->debug("Detected prediction mismatch in inventory " . get_class($inventory) . "#" . spl_object_id($inventory) . " slot $slot"); + $this->syncSlot($inventory, $slot); } } @@ -550,11 +560,6 @@ class InventoryManager{ return $this->itemStackInfos[spl_object_id($inventory)][$slotId] = $info; } - private function wrapItemStack(Inventory $inventory, int $slotId, Item $item) : ItemStackWrapper{ - $info = $this->trackItemStack($inventory, $slotId, $item, null); - return new ItemStackWrapper($info->getStackId(), $info->getItemStack()); - } - public function matchItemStack(Inventory $inventory, int $slotId, int $clientItemStackId) : bool{ $inventoryObjectId = spl_object_id($inventory); if(!isset($this->itemStackInfos[$inventoryObjectId])){ From 1123a5aa23f8e9ab925ca0dad13aa94337f5a651 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 6 Jan 2023 20:45:08 +0000 Subject: [PATCH 0487/1858] InventoryManager: Track predictions using ItemStack directly, instead of internal Item this removes the need for deserializing network itemstacks to core items, thereby eliminating a whole bunch of potential security issues. --- src/network/mcpe/InventoryManager.php | 28 ++++++++----------- .../mcpe/InventoryManagerPredictedChanges.php | 14 +++++----- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index cdc5881806..a0a28a3a28 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -38,7 +38,6 @@ use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\TypeConversionException; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; @@ -188,7 +187,7 @@ class InventoryManager{ return null; } - private function addPredictedSlotChange(Inventory $inventory, int $slot, Item $item) : void{ + private function addPredictedSlotChange(Inventory $inventory, int $slot, ItemStack $item) : void{ $predictions = ($this->initiatedSlotChanges[spl_object_id($inventory)] ??= new InventoryManagerPredictedChanges($inventory)); $predictions->add($slot, $item); } @@ -196,7 +195,9 @@ class InventoryManager{ public function addTransactionPredictedSlotChanges(InventoryTransaction $tx) : void{ foreach($tx->getActions() as $action){ if($action instanceof SlotChangeAction){ - $this->addPredictedSlotChange($action->getInventory(), $action->getSlot(), $action->getTargetItem()); + //TODO: ItemStackRequestExecutor can probably build these predictions with much lower overhead + $itemStack = TypeConverter::getInstance()->coreItemStackToNet($action->getTargetItem()); + $this->addPredictedSlotChange($action->getInventory(), $action->getSlot(), $itemStack); } } } @@ -225,12 +226,7 @@ class InventoryManager{ } [$inventory, $slot] = $info; - try{ - $item = TypeConverter::getInstance()->netItemStackToCore($action->newItem->getItemStack()); - }catch(TypeConversionException $e){ - throw new PacketHandlingException($e->getMessage(), 0, $e); - } - $this->addPredictedSlotChange($inventory, $slot, $item); + $this->addPredictedSlotChange($inventory, $slot, $action->newItem->getItemStack()); } } @@ -383,10 +379,10 @@ class InventoryManager{ } public function onSlotChange(Inventory $inventory, int $slot) : void{ - $currentItem = $inventory->getItem($slot); + $currentItem = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItem($slot)); $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; $clientSideItem = $predictions?->getSlot($slot); - if($clientSideItem === null || !$clientSideItem->equalsExact($currentItem)){ + if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request $this->trackItemStack($inventory, $slot, $currentItem, null); $this->syncSlot($inventory, $slot); @@ -452,7 +448,8 @@ class InventoryManager{ unset($this->initiatedSlotChanges[spl_object_id($inventory)]); $contents = []; foreach($inventory->getContents(true) as $slot => $item){ - $info = $this->trackItemStack($inventory, $slot, $item, null); + $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); + $info = $this->trackItemStack($inventory, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $info->getItemStack()); } if($slotMap !== null){ @@ -548,15 +545,14 @@ class InventoryManager{ return $this->itemStackInfos[spl_object_id($inventory)][$slot] ?? null; } - private function trackItemStack(Inventory $inventory, int $slotId, Item $item, ?int $itemStackRequestId) : ItemStackInfo{ + private function trackItemStack(Inventory $inventory, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ $existing = $this->itemStackInfos[spl_object_id($inventory)][$slotId] ?? null; - $typeConverter = TypeConverter::getInstance(); - $itemStack = $typeConverter->coreItemStackToNet($item); if($existing !== null && $existing->getItemStack()->equals($itemStack) && $existing->getRequestId() === $itemStackRequestId){ return $existing; } - $info = new ItemStackInfo($itemStackRequestId, $item->isNull() ? 0 : $this->newItemStackId(), $itemStack); + //TODO: ItemStack->isNull() would be nice to have here + $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId(), $itemStack); return $this->itemStackInfos[spl_object_id($inventory)][$slotId] = $info; } diff --git a/src/network/mcpe/InventoryManagerPredictedChanges.php b/src/network/mcpe/InventoryManagerPredictedChanges.php index a381234a41..8264e83fbb 100644 --- a/src/network/mcpe/InventoryManagerPredictedChanges.php +++ b/src/network/mcpe/InventoryManagerPredictedChanges.php @@ -24,12 +24,12 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; use pocketmine\inventory\Inventory; -use pocketmine\item\Item; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; final class InventoryManagerPredictedChanges{ /** - * @var Item[] - * @phpstan-var array + * @var ItemStack[] + * @phpstan-var array */ private array $slots = []; @@ -40,18 +40,18 @@ final class InventoryManagerPredictedChanges{ public function getInventory() : Inventory{ return $this->inventory; } /** - * @return Item[] - * @phpstan-return array + * @return ItemStack[] + * @phpstan-return array */ public function getSlots() : array{ return $this->slots; } - public function getSlot(int $slot) : ?Item{ + public function getSlot(int $slot) : ?ItemStack{ return $this->slots[$slot] ?? null; } - public function add(int $slot, Item $item) : void{ + public function add(int $slot, ItemStack $item) : void{ $this->slots[$slot] = $item; } From faaec12aaf56e42672287913bfb41d51a86a6a4e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 6 Jan 2023 22:16:29 +0000 Subject: [PATCH 0488/1858] Update BedrockProtocol --- composer.json | 2 +- composer.lock | 117 ++++++++++-------- .../mcpe/handler/ItemStackRequestExecutor.php | 8 +- 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/composer.json b/composer.json index 68a22e7f15..183f0e1f7d 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-data": "~1.13.0+bedrock-1.19.50", - "pocketmine/bedrock-protocol": "~17.1.0+bedrock-1.19.50", + "pocketmine/bedrock-protocol": "~18.0.0+bedrock-1.19.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index a2f6c207e0..41db164072 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "76c6b5521d8f88d9070e8dec1c0ae144", + "content-hash": "9c80c749cc8f464806f8164d6ec670e0", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "17.1.0+bedrock-1.19.50", + "version": "18.0.0+bedrock-1.19.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "c572706cf5e3202718dd35a35dd30fe08cd671de" + "reference": "b558ec883bd967dd3339f513cba62d2fbcd63349" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/c572706cf5e3202718dd35a35dd30fe08cd671de", - "reference": "c572706cf5e3202718dd35a35dd30fe08cd671de", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/b558ec883bd967dd3339f513cba62d2fbcd63349", + "reference": "b558ec883bd967dd3339f513cba62d2fbcd63349", "shasum": "" }, "require": { @@ -293,13 +293,13 @@ "netresearch/jsonmapper": "^4.0", "php": "^8.0", "pocketmine/binaryutils": "^0.2.0", - "pocketmine/color": "^0.2.0", + "pocketmine/color": "^0.2.0 || ^0.3.0", "pocketmine/math": "^0.3.0 || ^0.4.0", "pocketmine/nbt": "^0.3.0", "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.9.3", + "phpstan/phpstan": "1.9.4", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/17.1.0+bedrock-1.19.50" + "source": "https://github.com/pmmp/BedrockProtocol/tree/18.0.0+bedrock-1.19.50" }, - "time": "2022-12-15T20:34:49+00:00" + "time": "2023-01-06T21:47:35+00:00" }, { "name": "pocketmine/binaryutils", @@ -852,42 +852,53 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", "shasum": "" }, "require": { - "php": "^7.3 || ^8", + "php": "^7.4 || ^8.0", "symfony/polyfill-php81": "^1.23" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -915,7 +926,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/1.3.0" }, "funding": [ { @@ -927,27 +938,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-27T19:12:24+00:00" }, { "name": "ramsey/uuid", - "version": "4.6.0", + "version": "4.7.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + "reference": "a1acf96007170234a8399586a6e2ab8feba109d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/a1acf96007170234a8399586a6e2ab8feba109d1", + "reference": "a1acf96007170234a8399586a6e2ab8feba109d1", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.0" + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -1007,7 +1018,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.6.0" + "source": "https://github.com/ramsey/uuid/tree/4.7.1" }, "funding": [ { @@ -1019,7 +1030,7 @@ "type": "tidelift" } ], - "time": "2022-11-05T23:03:38+00:00" + "time": "2022-12-31T22:20:34+00:00" }, { "name": "symfony/filesystem", @@ -1525,30 +1536,30 @@ "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -1575,7 +1586,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -1591,7 +1602,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "myclabs/deep-copy", @@ -1980,16 +1991,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.22", + "version": "9.2.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df" + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", "shasum": "" }, "require": { @@ -2045,7 +2056,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" }, "funding": [ { @@ -2053,7 +2064,7 @@ "type": "github" } ], - "time": "2022-12-18T16:40:55+00:00" + "time": "2022-12-28T12:41:10+00:00" }, { "name": "phpunit/php-file-iterator", diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 37ba047f1c..be7e472ac4 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -36,7 +36,7 @@ use pocketmine\item\Item; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingConsumeInputStackRequestAction; -use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingMarkSecondaryResultStackRequestAction; +use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftingCreateSpecificResultStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeAutoStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CraftRecipeStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\CreativeCreateStackRequestAction; @@ -270,14 +270,14 @@ final class ItemStackRequestExecutor{ } $this->removeItemFromSlot($action->getSource(), $action->getCount()); //output discarded - we allow CraftingTransaction to verify the balance - }elseif($action instanceof CraftingMarkSecondaryResultStackRequestAction){ + }elseif($action instanceof CraftingCreateSpecificResultStackRequestAction){ if(!$this->specialTransaction instanceof CraftingTransaction){ throw new AssumptionFailedError("Cannot mark crafting result index when no crafting transaction is in progress"); } - $nextResultItem = $this->craftingResults[$action->getCraftingGridSlot()] ?? null; + $nextResultItem = $this->craftingResults[$action->getResultIndex()] ?? null; if($nextResultItem === null){ - throw new PacketHandlingException("No such crafting result index " . $action->getCraftingGridSlot()); + throw new PacketHandlingException("No such crafting result index " . $action->getResultIndex()); } $this->setNextCreatedItem($nextResultItem); }elseif($action instanceof DeprecatedCraftingResultsStackRequestAction){ From c5ca0857ee06bb2d73ab0b10d61a80acb641674e Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sun, 8 Jan 2023 18:56:14 +0300 Subject: [PATCH 0489/1858] TileFactory: removed outdated TODO (#5503) [ci skip] --- src/block/tile/TileFactory.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index 4a9c738726..ef1c630f15 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -78,7 +78,6 @@ final class TileFactory{ $this->register(Skull::class, ["Skull", "minecraft:skull"]); //TODO: Campfire - //TODO: Cauldron //TODO: ChalkboardBlock //TODO: ChemistryTable //TODO: CommandBlock From 9b4b960eb2165461d3ef393cf33030e7c2ce98f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 17:07:22 +0000 Subject: [PATCH 0490/1858] Remove deprecated methods --- src/entity/Living.php | 10 ---------- src/player/Player.php | 8 -------- 2 files changed, 18 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index 34a2975783..09e609b84c 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -294,16 +294,6 @@ abstract class Living extends Entity{ return $nbt; } - /** - * @deprecated This function always returns true, no matter whether the target is in the line of sight or not. - * @see VoxelRayTrace::inDirection() for a more generalized method of ray-tracing to a target. - */ - public function hasLineOfSight(Entity $entity) : bool{ - //TODO: head height - return true; - //return $this->getLevelNonNull()->rayTraceBlocks(Vector3::createVector($this->x, $this->y + $this->height, $this->z), Vector3::createVector($entity->x, $entity->y + $entity->height, $entity->z)) === null; - } - public function getEffects() : EffectManager{ return $this->effectManager; } diff --git a/src/player/Player.php b/src/player/Player.php index 702992b0bf..4281df2b8e 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2013,14 +2013,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->getNetworkSession()->onChatMessage($message); } - /** - * @deprecated Use {@link Player::sendMessage()} with a Translatable instead. - * @param string[]|Translatable[] $parameters - */ - public function sendTranslation(string $message, array $parameters = []) : void{ - $this->sendMessage(new Translatable($message, $parameters)); - } - /** * @param string[] $args */ From 9c391a6809cb03323644e8b5af50741d109b2078 Mon Sep 17 00:00:00 2001 From: BrandPVP <114182697+BrandPVP@users.noreply.github.com> Date: Mon, 9 Jan 2023 23:43:08 +0300 Subject: [PATCH 0491/1858] Declare built-in command names inside the constructor (#5487) This increases code consistency by placing the name in the same place where everything else about the command is defined. --- src/command/SimpleCommandMap.php | 80 +++++++++---------- src/command/defaults/BanCommand.php | 4 +- src/command/defaults/BanIpCommand.php | 4 +- src/command/defaults/BanListCommand.php | 4 +- src/command/defaults/ClearCommand.php | 4 +- .../defaults/DefaultGamemodeCommand.php | 4 +- src/command/defaults/DeopCommand.php | 4 +- src/command/defaults/DifficultyCommand.php | 4 +- src/command/defaults/DumpMemoryCommand.php | 6 +- src/command/defaults/EffectCommand.php | 4 +- src/command/defaults/EnchantCommand.php | 4 +- src/command/defaults/GamemodeCommand.php | 4 +- .../defaults/GarbageCollectorCommand.php | 4 +- src/command/defaults/GiveCommand.php | 4 +- src/command/defaults/HelpCommand.php | 4 +- src/command/defaults/KickCommand.php | 4 +- src/command/defaults/KillCommand.php | 4 +- src/command/defaults/ListCommand.php | 4 +- src/command/defaults/MeCommand.php | 4 +- src/command/defaults/OpCommand.php | 4 +- src/command/defaults/PardonCommand.php | 4 +- src/command/defaults/PardonIpCommand.php | 4 +- src/command/defaults/ParticleCommand.php | 4 +- src/command/defaults/PluginsCommand.php | 4 +- src/command/defaults/SaveCommand.php | 4 +- src/command/defaults/SaveOffCommand.php | 4 +- src/command/defaults/SaveOnCommand.php | 4 +- src/command/defaults/SayCommand.php | 4 +- src/command/defaults/SeedCommand.php | 4 +- src/command/defaults/SetWorldSpawnCommand.php | 4 +- src/command/defaults/SpawnpointCommand.php | 4 +- src/command/defaults/StatusCommand.php | 4 +- src/command/defaults/StopCommand.php | 4 +- src/command/defaults/TeleportCommand.php | 4 +- src/command/defaults/TellCommand.php | 4 +- src/command/defaults/TimeCommand.php | 4 +- src/command/defaults/TimingsCommand.php | 4 +- src/command/defaults/TitleCommand.php | 4 +- .../defaults/TransferServerCommand.php | 4 +- src/command/defaults/VersionCommand.php | 4 +- src/command/defaults/WhitelistCommand.php | 4 +- 41 files changed, 121 insertions(+), 121 deletions(-) diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 2af24ffedb..b0308e7f01 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -89,46 +89,46 @@ class SimpleCommandMap implements CommandMap{ private function setDefaultCommands() : void{ $this->registerAll("pocketmine", [ - new BanCommand("ban"), - new BanIpCommand("ban-ip"), - new BanListCommand("banlist"), - new ClearCommand("clear"), - new DefaultGamemodeCommand("defaultgamemode"), - new DeopCommand("deop"), - new DifficultyCommand("difficulty"), - new DumpMemoryCommand("dumpmemory"), - new EffectCommand("effect"), - new EnchantCommand("enchant"), - new GamemodeCommand("gamemode"), - new GarbageCollectorCommand("gc"), - new GiveCommand("give"), - new HelpCommand("help"), - new KickCommand("kick"), - new KillCommand("kill"), - new ListCommand("list"), - new MeCommand("me"), - new OpCommand("op"), - new PardonCommand("pardon"), - new PardonIpCommand("pardon-ip"), - new ParticleCommand("particle"), - new PluginsCommand("plugins"), - new SaveCommand("save-all"), - new SaveOffCommand("save-off"), - new SaveOnCommand("save-on"), - new SayCommand("say"), - new SeedCommand("seed"), - new SetWorldSpawnCommand("setworldspawn"), - new SpawnpointCommand("spawnpoint"), - new StatusCommand("status"), - new StopCommand("stop"), - new TeleportCommand("tp"), - new TellCommand("tell"), - new TimeCommand("time"), - new TimingsCommand("timings"), - new TitleCommand("title"), - new TransferServerCommand("transferserver"), - new VersionCommand("version"), - new WhitelistCommand("whitelist") + new BanCommand(), + new BanIpCommand(), + new BanListCommand(), + new ClearCommand(), + new DefaultGamemodeCommand(), + new DeopCommand(), + new DifficultyCommand(), + new DumpMemoryCommand(), + new EffectCommand(), + new EnchantCommand(), + new GamemodeCommand(), + new GarbageCollectorCommand(), + new GiveCommand(), + new HelpCommand(), + new KickCommand(), + new KillCommand(), + new ListCommand(), + new MeCommand(), + new OpCommand(), + new PardonCommand(), + new PardonIpCommand(), + new ParticleCommand(), + new PluginsCommand(), + new SaveCommand(), + new SaveOffCommand(), + new SaveOnCommand(), + new SayCommand(), + new SeedCommand(), + new SetWorldSpawnCommand(), + new SpawnpointCommand(), + new StatusCommand(), + new StopCommand(), + new TeleportCommand(), + new TellCommand(), + new TimeCommand(), + new TimingsCommand(), + new TitleCommand(), + new TransferServerCommand(), + new VersionCommand(), + new WhitelistCommand() ]); } diff --git a/src/command/defaults/BanCommand.php b/src/command/defaults/BanCommand.php index 7cc7a8148a..adbdb6d3ad 100644 --- a/src/command/defaults/BanCommand.php +++ b/src/command/defaults/BanCommand.php @@ -35,9 +35,9 @@ use function implode; class BanCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "ban", KnownTranslationFactory::pocketmine_command_ban_player_description(), KnownTranslationFactory::commands_ban_usage() ); diff --git a/src/command/defaults/BanIpCommand.php b/src/command/defaults/BanIpCommand.php index 3c8ceceafd..a23477e0d7 100644 --- a/src/command/defaults/BanIpCommand.php +++ b/src/command/defaults/BanIpCommand.php @@ -36,9 +36,9 @@ use function inet_pton; class BanIpCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "ban-ip", KnownTranslationFactory::pocketmine_command_ban_ip_description(), KnownTranslationFactory::commands_banip_usage() ); diff --git a/src/command/defaults/BanListCommand.php b/src/command/defaults/BanListCommand.php index 606aef9a29..95c2149696 100644 --- a/src/command/defaults/BanListCommand.php +++ b/src/command/defaults/BanListCommand.php @@ -37,9 +37,9 @@ use const SORT_STRING; class BanListCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "banlist", KnownTranslationFactory::pocketmine_command_banlist_description(), KnownTranslationFactory::commands_banlist_usage() ); diff --git a/src/command/defaults/ClearCommand.php b/src/command/defaults/ClearCommand.php index bb8b8d3c33..4e312b4e95 100644 --- a/src/command/defaults/ClearCommand.php +++ b/src/command/defaults/ClearCommand.php @@ -40,9 +40,9 @@ use function min; class ClearCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "clear", KnownTranslationFactory::pocketmine_command_clear_description(), KnownTranslationFactory::pocketmine_command_clear_usage() ); diff --git a/src/command/defaults/DefaultGamemodeCommand.php b/src/command/defaults/DefaultGamemodeCommand.php index 03eff24819..3860b9e34e 100644 --- a/src/command/defaults/DefaultGamemodeCommand.php +++ b/src/command/defaults/DefaultGamemodeCommand.php @@ -32,9 +32,9 @@ use function count; class DefaultGamemodeCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "defaultgamemode", KnownTranslationFactory::pocketmine_command_defaultgamemode_description(), KnownTranslationFactory::commands_defaultgamemode_usage() ); diff --git a/src/command/defaults/DeopCommand.php b/src/command/defaults/DeopCommand.php index eb6cec2688..4167012f76 100644 --- a/src/command/defaults/DeopCommand.php +++ b/src/command/defaults/DeopCommand.php @@ -35,9 +35,9 @@ use function count; class DeopCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "deop", KnownTranslationFactory::pocketmine_command_deop_description(), KnownTranslationFactory::commands_deop_usage() ); diff --git a/src/command/defaults/DifficultyCommand.php b/src/command/defaults/DifficultyCommand.php index 0bfc384e32..98eb3be3bc 100644 --- a/src/command/defaults/DifficultyCommand.php +++ b/src/command/defaults/DifficultyCommand.php @@ -33,9 +33,9 @@ use function count; class DifficultyCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "difficulty", KnownTranslationFactory::pocketmine_command_difficulty_description(), KnownTranslationFactory::commands_difficulty_usage() ); diff --git a/src/command/defaults/DumpMemoryCommand.php b/src/command/defaults/DumpMemoryCommand.php index d118fb06e1..d54ed88ee7 100644 --- a/src/command/defaults/DumpMemoryCommand.php +++ b/src/command/defaults/DumpMemoryCommand.php @@ -30,11 +30,11 @@ use function date; class DumpMemoryCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "dumpmemory", "Dumps the memory", - "/$name [path]" + "/dumpmemory [path]" ); $this->setPermission(DefaultPermissionNames::COMMAND_DUMPMEMORY); } diff --git a/src/command/defaults/EffectCommand.php b/src/command/defaults/EffectCommand.php index 566861bd32..187fd4573a 100644 --- a/src/command/defaults/EffectCommand.php +++ b/src/command/defaults/EffectCommand.php @@ -37,9 +37,9 @@ use function strtolower; class EffectCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "effect", KnownTranslationFactory::pocketmine_command_effect_description(), KnownTranslationFactory::commands_effect_usage() ); diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index e81473f786..26d7d9bec4 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -34,9 +34,9 @@ use function implode; class EnchantCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "enchant", KnownTranslationFactory::pocketmine_command_enchant_description(), KnownTranslationFactory::commands_enchant_usage() ); diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 2741101b65..8fe4e38e97 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -34,9 +34,9 @@ use function implode; class GamemodeCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "gamemode", KnownTranslationFactory::pocketmine_command_gamemode_description(), KnownTranslationFactory::commands_gamemode_usage() ); diff --git a/src/command/defaults/GarbageCollectorCommand.php b/src/command/defaults/GarbageCollectorCommand.php index 2aebf3b191..7bd64666f1 100644 --- a/src/command/defaults/GarbageCollectorCommand.php +++ b/src/command/defaults/GarbageCollectorCommand.php @@ -34,9 +34,9 @@ use function round; class GarbageCollectorCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "gc", KnownTranslationFactory::pocketmine_command_gc_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_GC); diff --git a/src/command/defaults/GiveCommand.php b/src/command/defaults/GiveCommand.php index 5356278952..4249044923 100644 --- a/src/command/defaults/GiveCommand.php +++ b/src/command/defaults/GiveCommand.php @@ -41,9 +41,9 @@ use function implode; class GiveCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "give", KnownTranslationFactory::pocketmine_command_give_description(), KnownTranslationFactory::pocketmine_command_give_usage() ); diff --git a/src/command/defaults/HelpCommand.php b/src/command/defaults/HelpCommand.php index c38f1be962..487c915f28 100644 --- a/src/command/defaults/HelpCommand.php +++ b/src/command/defaults/HelpCommand.php @@ -44,9 +44,9 @@ use const SORT_NATURAL; class HelpCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "help", KnownTranslationFactory::pocketmine_command_help_description(), KnownTranslationFactory::commands_help_usage(), ["?"] diff --git a/src/command/defaults/KickCommand.php b/src/command/defaults/KickCommand.php index 1bb38d1b20..3d63e8bb33 100644 --- a/src/command/defaults/KickCommand.php +++ b/src/command/defaults/KickCommand.php @@ -37,9 +37,9 @@ use function trim; class KickCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "kick", KnownTranslationFactory::pocketmine_command_kick_description(), KnownTranslationFactory::commands_kick_usage() ); diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index 6ee9e5ac9d..169905563f 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -34,9 +34,9 @@ use function implode; class KillCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "kill", KnownTranslationFactory::pocketmine_command_kill_description(), KnownTranslationFactory::pocketmine_command_kill_usage(), ["suicide"] diff --git a/src/command/defaults/ListCommand.php b/src/command/defaults/ListCommand.php index d86416f3d9..0264a2ef4f 100644 --- a/src/command/defaults/ListCommand.php +++ b/src/command/defaults/ListCommand.php @@ -36,9 +36,9 @@ use const SORT_STRING; class ListCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "list", KnownTranslationFactory::pocketmine_command_list_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_LIST); diff --git a/src/command/defaults/MeCommand.php b/src/command/defaults/MeCommand.php index f7d3978a5d..a6708840c3 100644 --- a/src/command/defaults/MeCommand.php +++ b/src/command/defaults/MeCommand.php @@ -34,9 +34,9 @@ use function implode; class MeCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "me", KnownTranslationFactory::pocketmine_command_me_description(), KnownTranslationFactory::commands_me_usage() ); diff --git a/src/command/defaults/OpCommand.php b/src/command/defaults/OpCommand.php index 97b483c80f..bcd1193511 100644 --- a/src/command/defaults/OpCommand.php +++ b/src/command/defaults/OpCommand.php @@ -35,9 +35,9 @@ use function count; class OpCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "op", KnownTranslationFactory::pocketmine_command_op_description(), KnownTranslationFactory::commands_op_usage() ); diff --git a/src/command/defaults/PardonCommand.php b/src/command/defaults/PardonCommand.php index a545fb3509..425b9e69f1 100644 --- a/src/command/defaults/PardonCommand.php +++ b/src/command/defaults/PardonCommand.php @@ -32,9 +32,9 @@ use function count; class PardonCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "pardon", KnownTranslationFactory::pocketmine_command_unban_player_description(), KnownTranslationFactory::commands_unban_usage(), ["unban"] diff --git a/src/command/defaults/PardonIpCommand.php b/src/command/defaults/PardonIpCommand.php index a7adc237de..65bed221b0 100644 --- a/src/command/defaults/PardonIpCommand.php +++ b/src/command/defaults/PardonIpCommand.php @@ -33,9 +33,9 @@ use function inet_pton; class PardonIpCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "pardon-ip", KnownTranslationFactory::pocketmine_command_unban_ip_description(), KnownTranslationFactory::commands_unbanip_usage(), ["unban-ip"] diff --git a/src/command/defaults/ParticleCommand.php b/src/command/defaults/ParticleCommand.php index 2c5d1c5d6d..f20d47ccc3 100644 --- a/src/command/defaults/ParticleCommand.php +++ b/src/command/defaults/ParticleCommand.php @@ -74,9 +74,9 @@ use function strtolower; class ParticleCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "particle", KnownTranslationFactory::pocketmine_command_particle_description(), KnownTranslationFactory::pocketmine_command_particle_usage() ); diff --git a/src/command/defaults/PluginsCommand.php b/src/command/defaults/PluginsCommand.php index ba7f602a4b..d68fcbb01a 100644 --- a/src/command/defaults/PluginsCommand.php +++ b/src/command/defaults/PluginsCommand.php @@ -36,9 +36,9 @@ use const SORT_STRING; class PluginsCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "plugins", KnownTranslationFactory::pocketmine_command_plugins_description(), null, ["pl"] diff --git a/src/command/defaults/SaveCommand.php b/src/command/defaults/SaveCommand.php index 0fefc573c0..4e406e6a3c 100644 --- a/src/command/defaults/SaveCommand.php +++ b/src/command/defaults/SaveCommand.php @@ -32,9 +32,9 @@ use function round; class SaveCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "save-all", KnownTranslationFactory::pocketmine_command_save_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_SAVE_PERFORM); diff --git a/src/command/defaults/SaveOffCommand.php b/src/command/defaults/SaveOffCommand.php index bb13623d72..73b8ca1517 100644 --- a/src/command/defaults/SaveOffCommand.php +++ b/src/command/defaults/SaveOffCommand.php @@ -30,9 +30,9 @@ use pocketmine\permission\DefaultPermissionNames; class SaveOffCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "save-off", KnownTranslationFactory::pocketmine_command_saveoff_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_SAVE_DISABLE); diff --git a/src/command/defaults/SaveOnCommand.php b/src/command/defaults/SaveOnCommand.php index cb842db9ef..f0a324aebe 100644 --- a/src/command/defaults/SaveOnCommand.php +++ b/src/command/defaults/SaveOnCommand.php @@ -30,9 +30,9 @@ use pocketmine\permission\DefaultPermissionNames; class SaveOnCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "save-on", KnownTranslationFactory::pocketmine_command_saveon_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_SAVE_ENABLE); diff --git a/src/command/defaults/SayCommand.php b/src/command/defaults/SayCommand.php index 8419d0de2b..5c3203b5f0 100644 --- a/src/command/defaults/SayCommand.php +++ b/src/command/defaults/SayCommand.php @@ -35,9 +35,9 @@ use function implode; class SayCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "say", KnownTranslationFactory::pocketmine_command_say_description(), KnownTranslationFactory::commands_say_usage() ); diff --git a/src/command/defaults/SeedCommand.php b/src/command/defaults/SeedCommand.php index af353f87a4..6b426bd45e 100644 --- a/src/command/defaults/SeedCommand.php +++ b/src/command/defaults/SeedCommand.php @@ -30,9 +30,9 @@ use pocketmine\player\Player; class SeedCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "seed", KnownTranslationFactory::pocketmine_command_seed_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_SEED); diff --git a/src/command/defaults/SetWorldSpawnCommand.php b/src/command/defaults/SetWorldSpawnCommand.php index 928afd86a6..f251ab8a44 100644 --- a/src/command/defaults/SetWorldSpawnCommand.php +++ b/src/command/defaults/SetWorldSpawnCommand.php @@ -36,9 +36,9 @@ use function count; class SetWorldSpawnCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "setworldspawn", KnownTranslationFactory::pocketmine_command_setworldspawn_description(), KnownTranslationFactory::commands_setworldspawn_usage() ); diff --git a/src/command/defaults/SpawnpointCommand.php b/src/command/defaults/SpawnpointCommand.php index 445fea44fd..e037a68293 100644 --- a/src/command/defaults/SpawnpointCommand.php +++ b/src/command/defaults/SpawnpointCommand.php @@ -37,9 +37,9 @@ use function round; class SpawnpointCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "spawnpoint", KnownTranslationFactory::pocketmine_command_spawnpoint_description(), KnownTranslationFactory::commands_spawnpoint_usage() ); diff --git a/src/command/defaults/StatusCommand.php b/src/command/defaults/StatusCommand.php index 15a6032973..ea65a546ff 100644 --- a/src/command/defaults/StatusCommand.php +++ b/src/command/defaults/StatusCommand.php @@ -36,9 +36,9 @@ use function round; class StatusCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "status", KnownTranslationFactory::pocketmine_command_status_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_STATUS); diff --git a/src/command/defaults/StopCommand.php b/src/command/defaults/StopCommand.php index 382f99ca06..bc4eef91cb 100644 --- a/src/command/defaults/StopCommand.php +++ b/src/command/defaults/StopCommand.php @@ -30,9 +30,9 @@ use pocketmine\permission\DefaultPermissionNames; class StopCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "stop", KnownTranslationFactory::pocketmine_command_stop_description() ); $this->setPermission(DefaultPermissionNames::COMMAND_STOP); diff --git a/src/command/defaults/TeleportCommand.php b/src/command/defaults/TeleportCommand.php index 7493347e89..8ccfcec328 100644 --- a/src/command/defaults/TeleportCommand.php +++ b/src/command/defaults/TeleportCommand.php @@ -40,9 +40,9 @@ use function round; class TeleportCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "tp", KnownTranslationFactory::pocketmine_command_tp_description(), KnownTranslationFactory::commands_tp_usage(), ["teleport"] diff --git a/src/command/defaults/TellCommand.php b/src/command/defaults/TellCommand.php index 672e5b74bf..713023382b 100644 --- a/src/command/defaults/TellCommand.php +++ b/src/command/defaults/TellCommand.php @@ -36,9 +36,9 @@ use function implode; class TellCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "tell", KnownTranslationFactory::pocketmine_command_tell_description(), KnownTranslationFactory::commands_message_usage(), ["w", "msg"] diff --git a/src/command/defaults/TimeCommand.php b/src/command/defaults/TimeCommand.php index 33357e4df0..325e178a82 100644 --- a/src/command/defaults/TimeCommand.php +++ b/src/command/defaults/TimeCommand.php @@ -35,9 +35,9 @@ use function implode; class TimeCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "time", KnownTranslationFactory::pocketmine_command_time_description(), KnownTranslationFactory::pocketmine_command_time_usage() ); diff --git a/src/command/defaults/TimingsCommand.php b/src/command/defaults/TimingsCommand.php index ae736b64f8..00f0a057f1 100644 --- a/src/command/defaults/TimingsCommand.php +++ b/src/command/defaults/TimingsCommand.php @@ -57,9 +57,9 @@ use const PHP_EOL; class TimingsCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "timings", KnownTranslationFactory::pocketmine_command_timings_description(), KnownTranslationFactory::pocketmine_command_timings_usage() ); diff --git a/src/command/defaults/TitleCommand.php b/src/command/defaults/TitleCommand.php index dfe24dc7b7..e3bc247d7a 100644 --- a/src/command/defaults/TitleCommand.php +++ b/src/command/defaults/TitleCommand.php @@ -33,9 +33,9 @@ use function implode; class TitleCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "title", KnownTranslationFactory::pocketmine_command_title_description(), KnownTranslationFactory::commands_title_usage() ); diff --git a/src/command/defaults/TransferServerCommand.php b/src/command/defaults/TransferServerCommand.php index 532f0e18cd..d0cbd316a9 100644 --- a/src/command/defaults/TransferServerCommand.php +++ b/src/command/defaults/TransferServerCommand.php @@ -32,9 +32,9 @@ use function count; class TransferServerCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "transferserver", KnownTranslationFactory::pocketmine_command_transferserver_description(), KnownTranslationFactory::pocketmine_command_transferserver_usage() ); diff --git a/src/command/defaults/VersionCommand.php b/src/command/defaults/VersionCommand.php index 20aa9b0e95..bafb129d1a 100644 --- a/src/command/defaults/VersionCommand.php +++ b/src/command/defaults/VersionCommand.php @@ -40,9 +40,9 @@ use const PHP_VERSION; class VersionCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "version", KnownTranslationFactory::pocketmine_command_version_description(), KnownTranslationFactory::pocketmine_command_version_usage(), ["ver", "about"] diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index a69334c4a6..cbf72902d6 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -38,9 +38,9 @@ use const SORT_STRING; class WhitelistCommand extends VanillaCommand{ - public function __construct(string $name){ + public function __construct(){ parent::__construct( - $name, + "whitelist", KnownTranslationFactory::pocketmine_command_whitelist_description(), KnownTranslationFactory::commands_whitelist_usage() ); From ca1f1bf09fb646088d47f5cd819f8095e9255d3e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 Jan 2023 21:52:44 +0000 Subject: [PATCH 0492/1858] Fixed glowing item frames due to technical limitations, this requires separating them back into two different block types. However, this isn't too egregious since it's just one flag, and actually simplifies some code. closes #5478 --- src/block/BlockTypeIds.php | 1 + src/block/ItemFrame.php | 16 ---------- src/block/VanillaBlocks.php | 8 ++++- src/block/tile/GlowingItemFrame.php | 32 +++++++++++++++++++ src/block/tile/TileFactory.php | 1 + .../convert/BlockObjectToStateSerializer.php | 8 ++--- .../convert/BlockStateDeserializerHelper.php | 8 ++--- .../convert/BlockStateSerializerHelper.php | 9 ++++++ .../BlockStateToObjectDeserializer.php | 4 +-- .../ItemSerializerDeserializerRegistrar.php | 17 ++-------- src/item/StringToItemParser.php | 13 ++++---- .../block_factory_consistency_check.json | 2 +- 12 files changed, 67 insertions(+), 52 deletions(-) create mode 100644 src/block/tile/GlowingItemFrame.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index c63b224324..d8d3064583 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -708,6 +708,7 @@ final class BlockTypeIds{ public const WEEPING_VINES = 10681; public const CHAIN = 10682; public const SCULK = 10683; + public const GLOWING_ITEM_FRAME = 10684; public const FIRST_UNUSED_BLOCK_ID = 10684; diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 68510cf27d..6d92d33342 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -44,20 +44,12 @@ class ItemFrame extends Flowable{ public const ROTATIONS = 8; - protected bool $glowing = false; - protected bool $hasMap = false; //makes frame appear large if set protected ?Item $framedItem = null; protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - public function getRequiredTypeDataBits() : int{ return 1; } - - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ - $w->bool($this->glowing); - } - public function getRequiredStateDataBits() : int{ return 4; } protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ @@ -141,14 +133,6 @@ class ItemFrame extends Flowable{ return $this; } - public function isGlowing() : bool{ return $this->glowing; } - - /** @return $this */ - public function setGlowing(bool $glowing) : self{ - $this->glowing = $glowing; - return $this; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->framedItem !== null){ $this->itemRotation = ($this->itemRotation + 1) % self::ROTATIONS; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index d14d288a59..1e1f7829cc 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -43,6 +43,7 @@ use pocketmine\block\tile\DaylightSensor as TileDaylightSensor; use pocketmine\block\tile\EnchantTable as TileEnchantingTable; use pocketmine\block\tile\EnderChest as TileEnderChest; use pocketmine\block\tile\FlowerPot as TileFlowerPot; +use pocketmine\block\tile\GlowingItemFrame as TileGlowingItemFrame; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\tile\Jukebox as TileJukebox; @@ -409,6 +410,7 @@ use function mb_strtolower; * @method static Glass GLASS() * @method static GlassPane GLASS_PANE() * @method static GlazedTerracotta GLAZED_TERRACOTTA() + * @method static ItemFrame GLOWING_ITEM_FRAME() * @method static GlowingObsidian GLOWING_OBSIDIAN() * @method static Glowstone GLOWSTONE() * @method static Opaque GOLD() @@ -886,7 +888,11 @@ final class VanillaBlocks{ $ironDoorBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 25.0)); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); - self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", new Info(new BreakInfo(0.25)))); + + $itemFrameInfo = new Info(new BreakInfo(0.25)); + self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", $itemFrameInfo)); + self::register("glowing_item_frame", new ItemFrame(new BID(Ids::GLOWING_ITEM_FRAME, TileGlowingItemFrame::class), "Glow Item Frame", $itemFrameInfo)); + self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", new Info(BreakInfo::axe(0.8)))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new Info(BreakInfo::axe(0.4)))); diff --git a/src/block/tile/GlowingItemFrame.php b/src/block/tile/GlowingItemFrame.php new file mode 100644 index 0000000000..c388241b8b --- /dev/null +++ b/src/block/tile/GlowingItemFrame.php @@ -0,0 +1,32 @@ +register(Smoker::class, ["Smoker", "minecraft:smoker"]); $this->register(SporeBlossom::class, ["SporeBlossom", "minecraft:spore_blossom"]); $this->register(Skull::class, ["Skull", "minecraft:skull"]); + $this->register(GlowingItemFrame::class, ["GlowItemFrame"]); //TODO: Campfire //TODO: ChalkboardBlock diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index c6dfa294eb..80519c6098 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -990,6 +990,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }) ->writeHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::GLOWING_ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::GLOW_FRAME)); $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); @@ -1019,12 +1020,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); - $this->map(Blocks::ITEM_FRAME(), function(ItemFrame $block) : Writer{ - return Writer::create($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME) - ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) - ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) - ->writeFacingDirection($block->getFacing()); - }); + $this->map(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::FRAME)); $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); $this->map(Blocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index b2809d93f1..e7bd14dfdc 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -49,7 +49,6 @@ use pocketmine\block\Trapdoor; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; -use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; @@ -172,12 +171,11 @@ final class BlockStateDeserializerHelper{ ->setFacing($in->readHorizontalFacing()); } - public static function decodeItemFrame(BlockStateReader $in, bool $glowing) : ItemFrame{ + public static function decodeItemFrame(ItemFrame $block, BlockStateReader $in) : ItemFrame{ $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is - return Blocks::ITEM_FRAME() + return $block ->setFacing($in->readFacingDirection()) - ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)) - ->setGlowing($glowing); + ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); } /** @throws BlockStateDeserializeException */ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index c87b64788f..312e726fc7 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -32,6 +32,7 @@ use pocketmine\block\DoublePlant; use pocketmine\block\FenceGate; use pocketmine\block\FloorSign; use pocketmine\block\Furnace; +use pocketmine\block\ItemFrame; use pocketmine\block\Leaves; use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; @@ -50,6 +51,7 @@ use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateNames as StateNames; use pocketmine\data\bedrock\block\BlockTypeNames as Ids; +use pocketmine\data\bedrock\block\convert\BlockStateWriter as Writer; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; @@ -138,6 +140,13 @@ final class BlockStateSerializerHelper{ ->writeHorizontalFacing($block->getFacing()); } + public static function encodeItemFrame(ItemFrame $block, string $id) : BlockStateWriter{ + return Writer::create($id) + ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) + ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) + ->writeFacingDirection($block->getFacing()); + } + private static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeBool(BlockStateNames::PERSISTENT_BIT, $block->isNoDecay()) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index fdae56e317..bca2cb390c 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -731,7 +731,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in)); $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in)); - $this->map(Ids::FRAME, fn(Reader $in) => Helper::decodeItemFrame($in, false)); + $this->map(Ids::FRAME, fn(Reader $in) => Helper::decodeItemFrame(Blocks::ITEM_FRAME(), $in)); $this->map(Ids::FROSTED_ICE, function(Reader $in) : Block{ return Blocks::FROSTED_ICE() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); @@ -741,7 +741,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::GLOW_FRAME, fn(Reader $in) => Helper::decodeItemFrame($in, true)); + $this->map(Ids::GLOW_FRAME, fn(Reader $in) => Helper::decodeItemFrame(Blocks::GLOWING_ITEM_FRAME(), $in)); $this->map(Ids::GOLDEN_RAIL, function(Reader $in) : Block{ return Blocks::POWERED_RAIL() ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index d80bb38403..aafac3b60f 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Bed; use pocketmine\block\Block; -use pocketmine\block\ItemFrame; use pocketmine\block\Skull; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SkullType; @@ -57,7 +56,6 @@ final class ItemSerializerDeserializerRegistrar{ $this->register1to1BlockWithMetaMappings(); $this->register1to1ItemWithMetaMappings(); $this->register1ToNItemMappings(); - $this->registerMiscBlockMappings(); $this->registerMiscItemMappings(); } @@ -141,6 +139,8 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR()); $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR()); $this->map1to1Block(Ids::FLOWER_POT, Blocks::FLOWER_POT()); + $this->map1to1Block(Ids::FRAME, Blocks::ITEM_FRAME()); + $this->map1to1Block(Ids::GLOW_FRAME, Blocks::GLOWING_ITEM_FRAME()); $this->map1to1Block(Ids::HOPPER, Blocks::HOPPER()); $this->map1to1Block(Ids::IRON_DOOR, Blocks::IRON_DOOR()); $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR()); @@ -502,19 +502,6 @@ final class ItemSerializerDeserializerRegistrar{ ); } - /** - * Registers serializers and deserializers for blocks that don't fit any other pattern. - * Ideally we want to get rid of this completely, if possible. - * - * Most of these are single PocketMine-MP items which map to multiple IDs depending on their properties, which is - * complex to implement in a generic way. - */ - private function registerMiscBlockMappings() : void{ - $this->deserializer?->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); - $this->deserializer?->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); - $this->serializer?->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); - } - /** * Registers serializers and deserializers for items that don't fit any other pattern. * Ideally we want to get rid of this completely, if possible. diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index e6afaab5c9..8a66e3a07b 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -627,8 +627,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("flower_pot_block", fn() => Blocks::FLOWER_POT()); $result->registerBlock("flowing_lava", fn() => Blocks::LAVA()); $result->registerBlock("flowing_water", fn() => Blocks::WATER()); - $result->registerBlock("frame", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); - $result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $result->registerBlock("frame", fn() => Blocks::ITEM_FRAME()); + $result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME()); $result->registerBlock("frosted_ice", fn() => Blocks::FROSTED_ICE()); $result->registerBlock("furnace", fn() => Blocks::FURNACE()); $result->registerBlock("gilded_blackstone", fn() => Blocks::GILDED_BLACKSTONE()); @@ -636,8 +636,9 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("glass_pane", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glass_panel", fn() => Blocks::GLASS_PANE()); $result->registerBlock("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA()); - $result->registerBlock("glow_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(true)); - $result->registerBlock("glow_item_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(true)); + $result->registerBlock("glow_frame", fn() => Blocks::GLOWING_ITEM_FRAME()); + $result->registerBlock("glow_item_frame", fn() => Blocks::GLOWING_ITEM_FRAME()); + $result->registerBlock("glowing_item_frame", fn() => Blocks::GLOWING_ITEM_FRAME()); $result->registerBlock("glowing_obsidian", fn() => Blocks::GLOWING_OBSIDIAN()); $result->registerBlock("glowing_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true)); $result->registerBlock("glowingobsidian", fn() => Blocks::GLOWING_OBSIDIAN()); @@ -693,8 +694,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("iron_ore", fn() => Blocks::IRON_ORE()); $result->registerBlock("iron_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY()); $result->registerBlock("iron_trapdoor", fn() => Blocks::IRON_TRAPDOOR()); - $result->registerBlock("item_frame", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); - $result->registerBlock("item_frame_block", fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $result->registerBlock("item_frame", fn() => Blocks::ITEM_FRAME()); + $result->registerBlock("item_frame_block", fn() => Blocks::ITEM_FRAME()); $result->registerBlock("jack_o_lantern", fn() => Blocks::LIT_PUMPKIN()); $result->registerBlock("jukebox", fn() => Blocks::JUKEBOX()); $result->registerBlock("jungle_button", fn() => Blocks::JUNGLE_BUTTON()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index db27a85282..f68366a3a0 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277702,5277703,5277704,5277705,5277706,5277707,5277712,5277713,5277714,5277715,5277716,5277717,5277718,5277719,5277720,5277721,5277722,5277723],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From c671d8a80b0cf496b09f02cd963432fc6c773012 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 Jan 2023 21:57:35 +0000 Subject: [PATCH 0493/1858] ItemFrame: fixed support conditions --- src/block/ItemFrame.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 6d92d33342..8828a8097a 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\utils\AnyFacingTrait; +use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\item\Item; @@ -165,14 +166,18 @@ class ItemFrame extends Flowable{ return true; } + private function canBeSupportedBy(Block $block, int $face) : bool{ + return !$block->getSupportType($face)->equals(SupportType::NONE()); + } + public function onNearbyBlockChange() : void{ - if(!$this->getSide(Facing::opposite($this->facing))->isSolid()){ + if(!$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing)){ $this->position->getWorld()->useBreakOn($this->position); } } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$blockClicked->isSolid()){ + if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ return false; } From 6dd006e7303ce74264bddd0bf992e228234b0107 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 13 Jan 2023 01:31:24 +0000 Subject: [PATCH 0494/1858] Update BlockTypeIds.php --- src/block/BlockTypeIds.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index d8d3064583..66fda94114 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -710,7 +710,7 @@ final class BlockTypeIds{ public const SCULK = 10683; public const GLOWING_ITEM_FRAME = 10684; - public const FIRST_UNUSED_BLOCK_ID = 10684; + public const FIRST_UNUSED_BLOCK_ID = 10685; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; From b76265cd37f1ca5f730ec8b51259fe666c2f7687 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 Jan 2023 17:20:08 +0000 Subject: [PATCH 0495/1858] PlayerChatEvent: introduce new formatting API this API is simultaneously more powerful and cleaner than the previous system. The previous system relied on undocumented behaviour and was limited to non-localizable strings. This enables custom servers to implement their own chat formats (e.g. containing localizable tags) which will be displayed in each player's own language (once per-player language has been properly implemented, anyway). --- src/event/player/PlayerChatEvent.php | 12 +++---- src/player/Player.php | 5 +-- src/player/chat/ChatFormatter.php | 38 ++++++++++++++++++++ src/player/chat/LegacyRawChatFormatter.php | 41 ++++++++++++++++++++++ src/player/chat/StandardChatFormatter.php | 37 +++++++++++++++++++ 5 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 src/player/chat/ChatFormatter.php create mode 100644 src/player/chat/LegacyRawChatFormatter.php create mode 100644 src/player/chat/StandardChatFormatter.php diff --git a/src/event/player/PlayerChatEvent.php b/src/event/player/PlayerChatEvent.php index 6f27321429..1cdbb49fb8 100644 --- a/src/event/player/PlayerChatEvent.php +++ b/src/event/player/PlayerChatEvent.php @@ -26,7 +26,7 @@ namespace pocketmine\event\player; use pocketmine\command\CommandSender; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\player\chat\ChatFormatter; use pocketmine\player\Player; use pocketmine\utils\Utils; @@ -43,7 +43,7 @@ class PlayerChatEvent extends PlayerEvent implements Cancellable{ Player $player, protected string $message, protected array $recipients, - protected string $format = KnownTranslationKeys::CHAT_TYPE_TEXT + protected ChatFormatter $formatter ){ $this->player = $player; } @@ -63,12 +63,12 @@ class PlayerChatEvent extends PlayerEvent implements Cancellable{ $this->player = $player; } - public function getFormat() : string{ - return $this->format; + public function getFormatter() : ChatFormatter{ + return $this->formatter; } - public function setFormat(string $format) : void{ - $this->format = $format; + public function setFormatter(ChatFormatter $formatter) : void{ + $this->formatter = $formatter; } /** diff --git a/src/player/Player.php b/src/player/Player.php index 4281df2b8e..523e5c81f7 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -114,6 +114,7 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\permission\DefaultPermissions; use pocketmine\permission\PermissibleBase; use pocketmine\permission\PermissibleDelegateTrait; +use pocketmine\player\chat\StandardChatFormatter; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; @@ -1445,10 +1446,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->server->dispatchCommand($this, substr($messagePart, 1)); Timings::$playerCommand->stopTiming(); }else{ - $ev = new PlayerChatEvent($this, $messagePart, $this->server->getBroadcastChannelSubscribers(Server::BROADCAST_CHANNEL_USERS)); + $ev = new PlayerChatEvent($this, $messagePart, $this->server->getBroadcastChannelSubscribers(Server::BROADCAST_CHANNEL_USERS), new StandardChatFormatter()); $ev->call(); if(!$ev->isCancelled()){ - $this->server->broadcastMessage($this->getServer()->getLanguage()->translateString($ev->getFormat(), [$ev->getPlayer()->getDisplayName(), $ev->getMessage()]), $ev->getRecipients()); + $this->server->broadcastMessage($ev->getFormatter()->format($ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients()); } } } diff --git a/src/player/chat/ChatFormatter.php b/src/player/chat/ChatFormatter.php new file mode 100644 index 0000000000..5e85985ec6 --- /dev/null +++ b/src/player/chat/ChatFormatter.php @@ -0,0 +1,38 @@ +format); + } +} diff --git a/src/player/chat/StandardChatFormatter.php b/src/player/chat/StandardChatFormatter.php new file mode 100644 index 0000000000..e077b9b47d --- /dev/null +++ b/src/player/chat/StandardChatFormatter.php @@ -0,0 +1,37 @@ + Date: Fri, 13 Jan 2023 17:48:56 +0000 Subject: [PATCH 0496/1858] Properly localize jukebox popups --- src/block/Jukebox.php | 4 +-- src/network/mcpe/NetworkSession.php | 33 +++++++++++++------ .../mcpe/handler/DeathPacketHandler.php | 4 +-- src/player/Player.php | 7 ++-- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/block/Jukebox.php b/src/block/Jukebox.php index 2574256683..20c3cab613 100644 --- a/src/block/Jukebox.php +++ b/src/block/Jukebox.php @@ -26,7 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Jukebox as JukeboxTile; use pocketmine\item\Item; use pocketmine\item\Record; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\lang\KnownTranslationFactory; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\sound\RecordSound; @@ -45,7 +45,7 @@ class Jukebox extends Opaque{ if($this->record !== null){ $this->ejectRecord(); }elseif($item instanceof Record){ - $player->sendJukeboxPopup(KnownTranslationKeys::RECORD_NOWPLAYING, [$player->getLanguage()->translate($item->getRecordType()->getTranslatableName())]); + $player->sendJukeboxPopup(KnownTranslationFactory::record_nowPlaying($item->getRecordType()->getTranslatableName())); $this->insertRecord($item->pop()); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 93e06e5241..f16a75d979 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -991,26 +991,39 @@ class NetworkSession{ $this->sendDataPacket(AvailableCommandsPacket::create($commandData, [], [], [])); } + /** + * @return string[][] + * @phpstan-return array{string, string[]} + */ + public function prepareClientTranslatableMessage(Translatable $message) : array{ + //we can't send nested translations to the client, so make sure they are always pre-translated by the server + $language = $this->player->getLanguage(); + $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $message->getParameters()); + return [$language->translateString($message->getText(), $parameters, "pocketmine."), $parameters]; + } + public function onChatMessage(Translatable|string $message) : void{ if($message instanceof Translatable){ - $language = $this->player->getLanguage(); if(!$this->server->isLanguageForced()){ - //we can't send nested translations to the client, so make sure they are always pre-translated by the server - $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $message->getParameters()); - $this->sendDataPacket(TextPacket::translation($language->translateString($message->getText(), $parameters, "pocketmine."), $parameters)); + $this->sendDataPacket(TextPacket::translation(...$this->prepareClientTranslatableMessage($message))); }else{ - $this->sendDataPacket(TextPacket::raw($language->translate($message))); + $this->sendDataPacket(TextPacket::raw($this->player->getLanguage()->translate($message))); } }else{ $this->sendDataPacket(TextPacket::raw($message)); } } - /** - * @param string[] $parameters - */ - public function onJukeboxPopup(string $key, array $parameters) : void{ - $this->sendDataPacket(TextPacket::jukeboxPopup($key, $parameters)); + public function onJukeboxPopup(Translatable|string $message) : void{ + $parameters = []; + if($message instanceof Translatable){ + if(!$this->server->isLanguageForced()){ + [$message, $parameters] = $this->prepareClientTranslatableMessage($message); + }else{ + $message = $this->player->getLanguage()->translate($message); + } + } + $this->sendDataPacket(TextPacket::jukeboxPopup($message, $parameters)); } public function onPopup(string $message) : void{ diff --git a/src/network/mcpe/handler/DeathPacketHandler.php b/src/network/mcpe/handler/DeathPacketHandler.php index 6347d8f659..c0c6e45ba4 100644 --- a/src/network/mcpe/handler/DeathPacketHandler.php +++ b/src/network/mcpe/handler/DeathPacketHandler.php @@ -54,9 +54,7 @@ class DeathPacketHandler extends PacketHandler{ if($this->deathMessage instanceof Translatable){ $language = $this->player->getLanguage(); if(!$this->player->getServer()->isLanguageForced()){ - //we can't send nested translations to the client, so make sure they are always pre-translated by the server - $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $this->deathMessage->getParameters()); - $message = $language->translateString($this->deathMessage->getText(), $parameters, "pocketmine."); + [$message, $parameters] = $this->session->prepareClientTranslatableMessage($this->deathMessage); }else{ $message = $language->translate($this->deathMessage); } diff --git a/src/player/Player.php b/src/player/Player.php index 523e5c81f7..0478080cfc 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2014,11 +2014,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->getNetworkSession()->onChatMessage($message); } - /** - * @param string[] $args - */ - public function sendJukeboxPopup(string $key, array $args) : void{ - $this->getNetworkSession()->onJukeboxPopup($key, $args); + public function sendJukeboxPopup(Translatable|string $message) : void{ + $this->getNetworkSession()->onJukeboxPopup($message); } /** From 950eddf405482be0b779ac6b16d10016d9b4e4aa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 Jan 2023 17:57:41 +0000 Subject: [PATCH 0497/1858] Fix build --- src/network/mcpe/handler/DeathPacketHandler.php | 1 - tests/phpstan/configs/actual-problems.neon | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/DeathPacketHandler.php b/src/network/mcpe/handler/DeathPacketHandler.php index c0c6e45ba4..9ed1a72f25 100644 --- a/src/network/mcpe/handler/DeathPacketHandler.php +++ b/src/network/mcpe/handler/DeathPacketHandler.php @@ -32,7 +32,6 @@ use pocketmine\network\mcpe\protocol\PlayerActionPacket; use pocketmine\network\mcpe\protocol\RespawnPacket; use pocketmine\network\mcpe\protocol\types\PlayerAction; use pocketmine\player\Player; -use function array_map; class DeathPacketHandler extends PacketHandler{ public function __construct( diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 44e3c0fcfc..6698add08c 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -617,7 +617,7 @@ parameters: - message: "#^Cannot call method getLanguage\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" - count: 2 + count: 4 path: ../../../src/network/mcpe/NetworkSession.php - From c55e23a2c6712fa141b59447be31694fe3e91607 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 14 Jan 2023 20:59:27 +0000 Subject: [PATCH 0498/1858] Localized disconnect message for spawn selection failure --- composer.json | 2 +- composer.lock | 14 +++++++------- src/Server.php | 2 +- src/lang/KnownTranslationFactory.php | 4 ++++ src/lang/KnownTranslationKeys.php | 1 + src/player/Player.php | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 9439370ddd..e0a62356de 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "pocketmine/classloader": "^0.2.0", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", - "pocketmine/locale-data": "~2.17.0", + "pocketmine/locale-data": "~2.18.0", "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0", "pocketmine/math": "^0.4.0", diff --git a/composer.lock b/composer.lock index 79036c66da..dbb111bd2a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5c869a38ea239fff76262c1648cef623", + "content-hash": "032bb0034871b16cbce5767efe6f69e4", "packages": [ { "name": "adhocore/json-comment", @@ -591,16 +591,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.17.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "a2c7071117c98ccc0e333994271cab1072eb3c06" + "reference": "0f50afc3d0fec29f769a62e93c71f8a0fb968f76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/a2c7071117c98ccc0e333994271cab1072eb3c06", - "reference": "a2c7071117c98ccc0e333994271cab1072eb3c06", + "url": "https://api.github.com/repos/pmmp/Language/zipball/0f50afc3d0fec29f769a62e93c71f8a0fb968f76", + "reference": "0f50afc3d0fec29f769a62e93c71f8a0fb968f76", "shasum": "" }, "type": "library", @@ -608,9 +608,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.17.0" + "source": "https://github.com/pmmp/Language/tree/2.18.0" }, - "time": "2023-01-13T17:22:45+00:00" + "time": "2023-01-14T17:52:46+00:00" }, { "name": "pocketmine/log", diff --git a/src/Server.php b/src/Server.php index 0422324f7c..c8939ecdac 100644 --- a/src/Server.php +++ b/src/Server.php @@ -580,7 +580,7 @@ class Server{ }, function() use ($playerPromiseResolver, $session) : void{ if($session->isConnected()){ - $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal()); + $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_respawn()); } $playerPromiseResolver->reject(); } diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index c114ae5dea..07a8b17b46 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -1629,6 +1629,10 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT, []); } + public static function pocketmine_disconnect_error_respawn() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_RESPAWN, []); + } + public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ 0 => $param0, diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index 0dd623f602..3221ecbdc4 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -354,6 +354,7 @@ final class KnownTranslationKeys{ public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket"; public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal"; public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout"; + public const POCKETMINE_DISCONNECT_ERROR_RESPAWN = "pocketmine.disconnect.error.respawn"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; diff --git a/src/player/Player.php b/src/player/Player.php index e9b1977e73..5bf99b3bbf 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2349,7 +2349,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ }, function() : void{ if($this->isConnected()){ - $this->disconnect("Unable to find a respawn position"); + $this->getNetworkSession()->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_respawn()); } } ); From 7abfc465674cdfa37c6718e791da8eb12d0d56b9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Jan 2023 21:41:30 +0000 Subject: [PATCH 0499/1858] First look at 3D biome support --- .../mcpe/serializer/ChunkSerializer.php | 70 +++---- src/world/World.php | 12 +- src/world/format/BiomeArray.php | 72 ------- src/world/format/Chunk.php | 24 +-- src/world/format/SubChunk.php | 5 + src/world/format/io/ChunkUtils.php | 22 +++ src/world/format/io/FastChunkSerializer.php | 51 ++--- src/world/format/io/leveldb/LevelDB.php | 181 +++++++++++++++--- src/world/format/io/region/Anvil.php | 5 +- .../io/region/LegacyAnvilChunkTrait.php | 43 +++-- src/world/format/io/region/McRegion.php | 38 ++-- src/world/format/io/region/PMAnvil.php | 5 +- src/world/generator/Flat.php | 3 +- src/world/generator/PopulationTask.php | 4 +- src/world/generator/hell/Nether.php | 7 +- src/world/generator/normal/Normal.php | 6 +- src/world/generator/populator/GroundCover.php | 2 +- tests/phpunit/world/format/ChunkTest.php | 9 +- tests/phpunit/world/format/SubChunkTest.php | 3 +- 19 files changed, 319 insertions(+), 243 deletions(-) delete mode 100644 src/world/format/BiomeArray.php diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index e628652df7..7725878557 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -36,9 +36,7 @@ use pocketmine\utils\BinaryStream; use pocketmine\world\format\Chunk; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; -use function chr; use function count; -use function str_repeat; final class ChunkSerializer{ private function __construct(){ @@ -64,13 +62,16 @@ final class ChunkSerializer{ $stream = PacketSerializer::encoder($encoderContext); $subChunkCount = self::getSubChunkCount($chunk); - for($y = Chunk::MIN_SUBCHUNK_INDEX, $writtenCount = 0; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ + $writtenCount = 0; + for($y = Chunk::MIN_SUBCHUNK_INDEX; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream, false); } - //TODO: right now we don't support 3D natively, so we just 3Dify our 2D biomes so they fill the column - $encodedBiomePalette = self::serializeBiomesAsPalette($chunk); - $stream->put(str_repeat($encodedBiomePalette, 24)); + $biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance(); + //all biomes must always be written :( + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ + self::serializeBiomePalette($chunk->getSubChunk($y)->getBiomeArray(), $biomeIdMap, $stream); + } $stream->putByte(0); //border block array count //Border block entry format: 1 byte (4 bits X, 4 bits Z). These are however useless since they crash the regular client. @@ -123,6 +124,28 @@ final class ChunkSerializer{ } } + private static function serializeBiomePalette(PalettedBlockArray $biomePalette, LegacyBiomeIdToStringIdMap $biomeIdMap, PacketSerializer $stream) : void{ + $biomePaletteBitsPerBlock = $biomePalette->getBitsPerBlock(); + $stream->putByte(($biomePaletteBitsPerBlock << 1) | 1); //the last bit is non-persistence (like for blocks), though it has no effect on biomes since they always use integer IDs + $stream->put($biomePalette->getWordArray()); + + //these LSHIFT by 1 uvarints are optimizations: the client expects zigzag varints here + //but since we know they are always unsigned, we can avoid the extra fcall overhead of + //zigzag and just shift directly. + $biomePaletteArray = $biomePalette->getPalette(); + if($biomePaletteBitsPerBlock !== 0){ + $stream->putUnsignedVarInt(count($biomePaletteArray) << 1); + } + + foreach($biomePaletteArray as $p){ + if($biomeIdMap->legacyToString($p) === null){ + //make sure we aren't sending bogus biomes - the 1.18.0 client crashes if we do this + $p = BiomeIds::OCEAN; + } + $stream->put(Binary::writeUnsignedVarInt($p << 1)); + } + } + public static function serializeTiles(Chunk $chunk) : string{ $stream = new BinaryStream(); foreach($chunk->getTiles() as $tile){ @@ -133,39 +156,4 @@ final class ChunkSerializer{ return $stream->getBuffer(); } - - private static function serializeBiomesAsPalette(Chunk $chunk) : string{ - $biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance(); - $biomePalette = new PalettedBlockArray($chunk->getBiomeId(0, 0)); - for($x = 0; $x < 16; ++$x){ - for($z = 0; $z < 16; ++$z){ - $biomeId = $chunk->getBiomeId($x, $z); - if($biomeIdMap->legacyToString($biomeId) === null){ - //make sure we aren't sending bogus biomes - the 1.18.0 client crashes if we do this - $biomeId = BiomeIds::OCEAN; - } - for($y = 0; $y < 16; ++$y){ - $biomePalette->set($x, $y, $z, $biomeId); - } - } - } - - $biomePaletteBitsPerBlock = $biomePalette->getBitsPerBlock(); - $encodedBiomePalette = - chr(($biomePaletteBitsPerBlock << 1) | 1) . //the last bit is non-persistence (like for blocks), though it has no effect on biomes since they always use integer IDs - $biomePalette->getWordArray(); - - //these LSHIFT by 1 uvarints are optimizations: the client expects zigzag varints here - //but since we know they are always unsigned, we can avoid the extra fcall overhead of - //zigzag and just shift directly. - $biomePaletteArray = $biomePalette->getPalette(); - if($biomePaletteBitsPerBlock !== 0){ - $encodedBiomePalette .= Binary::writeUnsignedVarInt(count($biomePaletteArray) << 1); - } - foreach($biomePaletteArray as $p){ - $encodedBiomePalette .= Binary::writeUnsignedVarInt($p << 1); - } - - return $encodedBiomePalette; - } } diff --git a/src/world/World.php b/src/world/World.php index d8f555ea36..2d7f18d4e0 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2241,23 +2241,23 @@ class World implements ChunkManager{ return ($chunk = $this->loadChunk($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE)) !== null ? $chunk->getTile($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK) : null; } - public function getBiomeId(int $x, int $z) : int{ + public function getBiomeId(int $x, int $y, int $z) : int{ if(($chunk = $this->loadChunk($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE)) !== null){ - return $chunk->getBiomeId($x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK); + return $chunk->getBiomeId($x & Chunk::COORD_MASK, $y & Chunk::COORD_MASK, $z & Chunk::COORD_MASK); } return BiomeIds::OCEAN; //TODO: this should probably throw instead (terrain not generated yet) } - public function getBiome(int $x, int $z) : Biome{ - return BiomeRegistry::getInstance()->getBiome($this->getBiomeId($x, $z)); + public function getBiome(int $x, int $y, int $z) : Biome{ + return BiomeRegistry::getInstance()->getBiome($this->getBiomeId($x, $y, $z)); } - public function setBiomeId(int $x, int $z, int $biomeId) : void{ + public function setBiomeId(int $x, int $y, int $z, int $biomeId) : void{ $chunkX = $x >> Chunk::COORD_BIT_SIZE; $chunkZ = $z >> Chunk::COORD_BIT_SIZE; $this->unlockChunk($chunkX, $chunkZ, null); if(($chunk = $this->loadChunk($chunkX, $chunkZ)) !== null){ - $chunk->setBiomeId($x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK, $biomeId); + $chunk->setBiomeId($x & Chunk::COORD_MASK, $y & Chunk::COORD_MASK, $z & Chunk::COORD_MASK, $biomeId); }else{ //if we allowed this, the modifications would be lost when the chunk is created throw new WorldException("Cannot set biome in a non-generated chunk"); diff --git a/src/world/format/BiomeArray.php b/src/world/format/BiomeArray.php deleted file mode 100644 index 5c7a3131f1..0000000000 --- a/src/world/format/BiomeArray.php +++ /dev/null @@ -1,72 +0,0 @@ -payload = $payload; - } - - public static function fill(int $biomeId) : self{ - return new BiomeArray(str_repeat(chr($biomeId), 256)); - } - - private static function idx(int $x, int $z) : int{ - if($x < 0 || $x >= 16 || $z < 0 || $z >= 16){ - throw new \InvalidArgumentException("x and z must be in the range 0-15"); - } - return ($z << 4) | $x; - } - - public function get(int $x, int $z) : int{ - return ord($this->payload[self::idx($x, $z)]); - } - - public function set(int $x, int $z, int $biomeId) : void{ - if($biomeId < 0 || $biomeId >= 256){ - throw new \InvalidArgumentException("Biome ID must be in the range 0-255"); - } - $this->payload[self::idx($x, $z)] = chr($biomeId); - } - - /** - * @return string ZZZZXXXX key bits - */ - public function getData() : string{ - return $this->payload; - } -} diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index e6b4780c6f..7c55b6292e 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -29,6 +29,7 @@ namespace pocketmine\world\format; use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\block\tile\Tile; +use pocketmine\data\bedrock\BiomeIds; use function array_map; class Chunk{ @@ -59,21 +60,19 @@ class Chunk{ protected HeightArray $heightMap; - protected BiomeArray $biomeIds; - /** * @param SubChunk[] $subChunks */ - public function __construct(array $subChunks, BiomeArray $biomeIds, bool $terrainPopulated){ + public function __construct(array $subChunks, bool $terrainPopulated){ $this->subChunks = new \SplFixedArray(Chunk::MAX_SUBCHUNKS); foreach($this->subChunks as $y => $null){ - $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, []); + //TODO: we should probably require all subchunks to be provided here + $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], new PalettedBlockArray(BiomeIds::OCEAN)); } $val = (self::MAX_SUBCHUNK_INDEX + 1) * SubChunk::EDGE_LENGTH; $this->heightMap = HeightArray::fill($val); //TODO: what about lazily initializing this? - $this->biomeIds = $biomeIds; $this->terrainPopulated = $terrainPopulated; } @@ -153,8 +152,8 @@ class Chunk{ * * @return int 0-255 */ - public function getBiomeId(int $x, int $z) : int{ - return $this->biomeIds->get($x, $z); + public function getBiomeId(int $x, int $y, int $z) : int{ + return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBiomeArray()->get($x, $y, $z); } /** @@ -164,8 +163,8 @@ class Chunk{ * @param int $z 0-15 * @param int $biomeId 0-255 */ - public function setBiomeId(int $x, int $z, int $biomeId) : void{ - $this->biomeIds->set($x, $z, $biomeId); + public function setBiomeId(int $x, int $y, int $z, int $biomeId) : void{ + $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBiomeArray()->set($x, $y, $z, $biomeId); $this->terrainDirtyFlags |= self::DIRTY_FLAG_BIOMES; } @@ -230,10 +229,6 @@ class Chunk{ } } - public function getBiomeIdArray() : string{ - return $this->biomeIds->getData(); - } - /** * @return int[] */ @@ -291,7 +286,7 @@ class Chunk{ throw new \InvalidArgumentException("Invalid subchunk Y coordinate $y"); } - $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, []); + $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], new PalettedBlockArray(BiomeIds::OCEAN)); $this->setTerrainDirtyFlag(self::DIRTY_FLAG_BLOCKS, true); } @@ -322,7 +317,6 @@ class Chunk{ return clone $subChunk; }, $this->subChunks->toArray())); $this->heightMap = clone $this->heightMap; - $this->biomeIds = clone $this->biomeIds; } /** diff --git a/src/world/format/SubChunk.php b/src/world/format/SubChunk.php index d109681600..5dc2215140 100644 --- a/src/world/format/SubChunk.php +++ b/src/world/format/SubChunk.php @@ -40,6 +40,7 @@ class SubChunk{ public function __construct( private int $emptyBlockId, private array $blockLayers, + private PalettedBlockArray $biomes, private ?LightArray $skyLight = null, private ?LightArray $blockLight = null ){} @@ -102,6 +103,8 @@ class SubChunk{ return null; //highest block not in this subchunk } + public function getBiomeArray() : PalettedBlockArray{ return $this->biomes; } + public function getBlockSkyLightArray() : LightArray{ return $this->skyLight ??= LightArray::fill(0); } @@ -137,6 +140,7 @@ class SubChunk{ unset($this->blockLayers[$k]); } $this->blockLayers = array_values($this->blockLayers); + $this->biomes->collectGarbage(); if($this->skyLight !== null && $this->skyLight->isUniform(0)){ $this->skyLight = null; @@ -150,6 +154,7 @@ class SubChunk{ $this->blockLayers = array_map(function(PalettedBlockArray $array) : PalettedBlockArray{ return clone $array; }, $this->blockLayers); + $this->biomes = clone $this->biomes; if($this->skyLight !== null){ $this->skyLight = clone $this->skyLight; diff --git a/src/world/format/io/ChunkUtils.php b/src/world/format/io/ChunkUtils.php index b9b3666855..3692b2470f 100644 --- a/src/world/format/io/ChunkUtils.php +++ b/src/world/format/io/ChunkUtils.php @@ -23,8 +23,11 @@ declare(strict_types=1); namespace pocketmine\world\format\io; +use pocketmine\world\format\PalettedBlockArray; use function chr; +use function ord; use function str_repeat; +use function strlen; class ChunkUtils{ @@ -42,4 +45,23 @@ class ChunkUtils{ return $result; } + /** + * Converts 2D biomes into a 3D biome palette. This palette can then be cloned for every subchunk. + */ + public static function extrapolate3DBiomes(string $biomes2d) : PalettedBlockArray{ + if(strlen($biomes2d) !== 256){ + throw new \InvalidArgumentException("Biome array is expected to be exactly 256 bytes"); + } + $biomePalette = new PalettedBlockArray(ord($biomes2d[0])); + for($x = 0; $x < 16; ++$x){ + for($z = 0; $z < 16; ++$z){ + $biomeId = ord($biomes2d[($z << 4) | $x]); + for($y = 0; $y < 16; ++$y){ + $biomePalette->set($x, $y, $z, $biomeId); + } + } + } + + return $biomePalette; + } } diff --git a/src/world/format/io/FastChunkSerializer.php b/src/world/format/io/FastChunkSerializer.php index 7da8c9ab4c..6e18f27ac5 100644 --- a/src/world/format/io/FastChunkSerializer.php +++ b/src/world/format/io/FastChunkSerializer.php @@ -25,7 +25,6 @@ namespace pocketmine\world\format\io; use pocketmine\utils\Binary; use pocketmine\utils\BinaryStream; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; @@ -46,6 +45,17 @@ final class FastChunkSerializer{ //NOOP } + private static function serializePalettedArray(BinaryStream $stream, PalettedBlockArray $array) : void{ + $wordArray = $array->getWordArray(); + $palette = $array->getPalette(); + + $stream->putByte($array->getBitsPerBlock()); + $stream->put($wordArray); + $serialPalette = pack("L*", ...$palette); + $stream->putInt(strlen($serialPalette)); + $stream->put($serialPalette); + } + /** * Fast-serializes the chunk for passing between threads * TODO: tiles and entities @@ -67,23 +77,25 @@ final class FastChunkSerializer{ $layers = $subChunk->getBlockLayers(); $stream->putByte(count($layers)); foreach($layers as $blocks){ - $wordArray = $blocks->getWordArray(); - $palette = $blocks->getPalette(); - - $stream->putByte($blocks->getBitsPerBlock()); - $stream->put($wordArray); - $serialPalette = pack("L*", ...$palette); - $stream->putInt(strlen($serialPalette)); - $stream->put($serialPalette); + self::serializePalettedArray($stream, $blocks); } + self::serializePalettedArray($stream, $subChunk->getBiomeArray()); + } - //biomes - $stream->put($chunk->getBiomeIdArray()); - return $stream->getBuffer(); } + private static function deserializePalettedArray(BinaryStream $stream) : PalettedBlockArray{ + $bitsPerBlock = $stream->getByte(); + $words = $stream->get(PalettedBlockArray::getExpectedWordArraySize($bitsPerBlock)); + /** @var int[] $unpackedPalette */ + $unpackedPalette = unpack("L*", $stream->get($stream->getInt())); //unpack() will never fail here + $palette = array_values($unpackedPalette); + + return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); + } + /** * Deserializes a fast-serialized chunk */ @@ -103,19 +115,12 @@ final class FastChunkSerializer{ /** @var PalettedBlockArray[] $layers */ $layers = []; for($i = 0, $layerCount = $stream->getByte(); $i < $layerCount; ++$i){ - $bitsPerBlock = $stream->getByte(); - $words = $stream->get(PalettedBlockArray::getExpectedWordArraySize($bitsPerBlock)); - /** @var int[] $unpackedPalette */ - $unpackedPalette = unpack("L*", $stream->get($stream->getInt())); //unpack() will never fail here - $palette = array_values($unpackedPalette); - - $layers[] = PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); + $layers[] = self::deserializePalettedArray($stream); } - $subChunks[$y] = new SubChunk($airBlockId, $layers); + $biomeArray = self::deserializePalettedArray($stream); + $subChunks[$y] = new SubChunk($airBlockId, $layers, $biomeArray); } - $biomeIds = new BiomeArray($stream->get(256)); - - return new Chunk($subChunks, $biomeIds, $terrainPopulated); + return new Chunk($subChunks, $terrainPopulated); } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 13514261bf..c8bb35e733 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -35,7 +35,6 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\Binary; use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\BaseWorldProvider; use pocketmine\world\format\io\ChunkData; @@ -145,7 +144,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** * @throws CorruptedChunkException */ - protected function deserializePaletted(BinaryStream $stream) : PalettedBlockArray{ + protected function deserializeBlockPalette(BinaryStream $stream) : PalettedBlockArray{ $bitsPerBlock = $stream->getByte() >> 1; try{ @@ -188,6 +187,99 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); } + /** + * @throws CorruptedChunkException + */ + private static function getExpected3dBiomesCount(int $chunkVersion) : int{ + return match(true){ + $chunkVersion >= ChunkVersion::v1_18_30 => 24, + $chunkVersion >= ChunkVersion::v1_18_0_25_beta => 25, + $chunkVersion >= ChunkVersion::v1_18_0_24_beta => 32, + $chunkVersion >= ChunkVersion::v1_18_0_22_beta => 65, + $chunkVersion >= ChunkVersion::v1_17_40_20_beta_experimental_caves_cliffs => 32, + default => throw new CorruptedChunkException("Chunk version $chunkVersion should not have 3D biomes") + }; + } + + /** + * @throws CorruptedChunkException + */ + private static function deserializeBiomePalette(BinaryStream $stream, int $bitsPerBlock) : PalettedBlockArray{ + try{ + $words = $stream->get(PalettedBlockArray::getExpectedWordArraySize($bitsPerBlock)); + }catch(\InvalidArgumentException $e){ + throw new CorruptedChunkException("Failed to deserialize paletted biomes: " . $e->getMessage(), 0, $e); + } + $palette = []; + $paletteSize = $bitsPerBlock === 0 ? 1 : $stream->getLInt(); + + for($i = 0; $i < $paletteSize; ++$i){ + $palette[] = $stream->getLInt(); + } + + //TODO: exceptions + return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); + } + + private static function serializeBiomePalette(BinaryStream $stream, PalettedBlockArray $biomes) : void{ + $stream->putByte($biomes->getBitsPerBlock() << 1); + $stream->put($biomes->getWordArray()); + + $palette = $biomes->getPalette(); + if($biomes->getBitsPerBlock() !== 0){ + $stream->putLInt(count($palette)); + } + foreach($palette as $p){ + $stream->putLInt($p); + } + } + + /** + * @throws CorruptedChunkException + * @return PalettedBlockArray[] + * @phpstan-return array + */ + private static function deserialize3dBiomes(BinaryStream $stream, int $chunkVersion) : array{ + $previous = null; + $result = []; + $nextIndex = Chunk::MIN_SUBCHUNK_INDEX; + + $expectedCount = self::getExpected3dBiomesCount($chunkVersion); + for($i = 0; $i < $expectedCount; ++$i){ + try{ + $bitsPerBlock = $stream->getByte() >> 1; + if($bitsPerBlock === 127){ + if($previous === null){ + throw new CorruptedChunkException("Serialized biome palette $i has no previous palette to copy from"); + } + $decoded = clone $previous; + }else{ + $decoded = self::deserializeBiomePalette($stream, $bitsPerBlock); + } + $previous = $decoded; + if($nextIndex <= Chunk::MAX_SUBCHUNK_INDEX){ //older versions wrote additional superfluous biome palettes + $result[$nextIndex++] = $decoded; + } + }catch(BinaryDataException $e){ + throw new CorruptedChunkException("Failed to deserialize biome palette $i: " . $e->getMessage(), 0, $e); + } + } + if(!$stream->feof()){ + throw new CorruptedChunkException("3D biomes data contains extra unread data"); + } + + return $result; + } + + private static function serialize3dBiomes(BinaryStream $stream, Chunk $chunk) : void{ + //TODO: the server-side min/max may not coincide with the world storage min/max - we may need additional logic to handle this + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; $y++){ + //TODO: is it worth trying to use the previous palette if it's the same as the current one? vanilla supports + //this, but it's not clear if it's worth the effort to implement. + self::serializeBiomePalette($stream, $chunk->getSubChunk($y)->getBiomeArray()); + } + } + /** * @phpstan-param-out int $x * @phpstan-param-out int $y @@ -280,9 +372,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** @var SubChunk[] $subChunks */ $subChunks = []; - /** @var BiomeArray|null $biomeArray */ - $biomeArray = null; - $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; @@ -330,8 +419,37 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ case ChunkVersion::v1_0_0: $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); + $biomeArrays = []; + if(($maps2d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES)) !== false){ + $binaryStream = new BinaryStream($maps2d); + + try{ + $binaryStream->get(512); //heightmap, discard it + $biomes3d = ChunkUtils::extrapolate3DBiomes($binaryStream->get(256)); //never throws + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ + $biomeArrays[$i] = clone $biomes3d; + } + }elseif(($maps3d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_3D_BIOMES)) !== false){ + $binaryStream = new BinaryStream($maps3d); + + try{ + $binaryStream->get(512); + $biomeArrays = self::deserialize3dBiomes($binaryStream, $chunkVersion); + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + }else{ + for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ + $biomeArrays[$i] = new PalettedBlockArray(BiomeIds::OCEAN); //polyfill + } + } + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y + $subChunkKeyOffset))) === false){ + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], $biomeArrays[$y]); continue; } @@ -369,14 +487,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $storages[] = $convertedLegacyExtraData[$y]; } - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); break; case SubChunkVersion::PALETTED_SINGLE: - $storages = [$this->deserializePaletted($binaryStream)]; + $storages = [$this->deserializeBlockPalette($binaryStream)]; if(isset($convertedLegacyExtraData[$y])){ $storages[] = $convertedLegacyExtraData[$y]; } - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); break; case SubChunkVersion::PALETTED_MULTI: case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: @@ -390,9 +508,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $storages = []; for($k = 0; $k < $storageCount; ++$k){ - $storages[] = $this->deserializePaletted($binaryStream); + $storages[] = $this->deserializeBlockPalette($binaryStream); } - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); } break; default: @@ -401,16 +519,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } } - if(($maps2d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES)) !== false){ - $binaryStream = new BinaryStream($maps2d); - - try{ - $binaryStream->get(512); //heightmap, discard it - $biomeArray = new BiomeArray($binaryStream->get(256)); //never throws - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - } break; case ChunkVersion::v0_9_5: case ChunkVersion::v0_9_2: @@ -430,22 +538,30 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ throw new CorruptedChunkException($e->getMessage(), 0, $e); } + try{ + $binaryStream->get(256); //heightmap, discard it + /** @var int[] $unpackedBiomeArray */ + $unpackedBiomeArray = unpack("N*", $binaryStream->get(1024)); //unpack() will never fail here + $biomes3d = ChunkUtils::extrapolate3DBiomes(ChunkUtils::convertBiomeColors(array_values($unpackedBiomeArray))); //never throws + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + for($yy = 0; $yy < 8; ++$yy){ $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy)]; if(isset($convertedLegacyExtraData[$yy])){ $storages[] = $convertedLegacyExtraData[$yy]; } - $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); + $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, clone $biomes3d); } - try{ - $binaryStream->get(256); //heightmap, discard it - /** @var int[] $unpackedBiomeArray */ - $unpackedBiomeArray = unpack("N*", $binaryStream->get(1024)); //unpack() will never fail here - $biomeArray = new BiomeArray(ChunkUtils::convertBiomeColors(array_values($unpackedBiomeArray))); //never throws - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); + //make sure extrapolated biomes get filled in correctly + for($yy = Chunk::MIN_SUBCHUNK_INDEX; $yy <= Chunk::MAX_SUBCHUNK_INDEX; ++$yy){ + if(!isset($subChunks[$yy])){ + $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); + } } + break; default: //TODO: set chunks read-only so the version on disk doesn't get overwritten @@ -485,8 +601,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: tile ticks, biome states (?) $chunk = new Chunk( - $subChunks, - $biomeArray ?? BiomeArray::fill(BiomeIds::OCEAN), //TODO: maybe missing biomes should be an error? + $subChunks, //TODO: maybe missing biomes should be an error? $terrainPopulated ); @@ -545,7 +660,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BIOMES)){ - $write->put($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES, str_repeat("\x00", 512) . $chunk->getBiomeIdArray()); + $write->delete($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES); + $stream = new BinaryStream(); + $stream->put(str_repeat("\x00", 512)); //fake heightmap + self::serialize3dBiomes($stream, $chunk); + $write->put($index . ChunkDataKey::HEIGHTMAP_AND_3D_BIOMES, $stream->getBuffer()); } //TODO: use this properly diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index 8012facd93..c1b6b96718 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -26,16 +26,17 @@ namespace pocketmine\world\format\io\region; use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; class Anvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; - protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ + protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkYZX( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) - )]); + )], $biomes3d); //ignore legacy light information } diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index 8d4f8ddf4d..05d4b0fb85 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; +use pocketmine\block\Block; +use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\NbtDataException; @@ -30,12 +32,13 @@ use pocketmine\nbt\tag\ByteArrayTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntArrayTag; use pocketmine\nbt\tag\ListTag; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; +use function strlen; use function zlib_decode; /** @@ -67,34 +70,38 @@ trait LegacyAnvilChunkTrait{ throw new CorruptedChunkException("'Level' key is missing from chunk NBT"); } + $makeBiomeArray = function(string $biomeIds) : PalettedBlockArray{ + if(strlen($biomeIds) !== 256){ + throw new CorruptedChunkException("Expected biome array to be exactly 256 bytes, got " . strlen($biomeIds)); + } + //TODO: we may need to convert legacy biome IDs + return ChunkUtils::extrapolate3DBiomes($biomeIds); + }; + + if(($biomeColorsTag = $chunk->getTag("BiomeColors")) instanceof IntArrayTag){ + $biomes3d = $makeBiomeArray(ChunkUtils::convertBiomeColors($biomeColorsTag->getValue())); //Convert back to original format + }elseif(($biomesTag = $chunk->getTag("Biomes")) instanceof ByteArrayTag){ + $biomes3d = $makeBiomeArray($biomesTag->getValue()); + }else{ + $biomes3d = new PalettedBlockArray(BiomeIds::OCEAN); + } + $subChunks = []; $subChunksTag = $chunk->getListTag("Sections") ?? []; foreach($subChunksTag as $subChunk){ if($subChunk instanceof CompoundTag){ - $subChunks[$subChunk->getByte("Y")] = $this->deserializeSubChunk($subChunk); + $subChunks[$subChunk->getByte("Y")] = $this->deserializeSubChunk($subChunk, clone $biomes3d); } } - - $makeBiomeArray = function(string $biomeIds) : BiomeArray{ - try{ - return new BiomeArray($biomeIds); - }catch(\InvalidArgumentException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ + if(!isset($subChunks[$y])){ + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); } - }; - $biomeArray = null; - if(($biomeColorsTag = $chunk->getTag("BiomeColors")) instanceof IntArrayTag){ - $biomeArray = $makeBiomeArray(ChunkUtils::convertBiomeColors($biomeColorsTag->getValue())); //Convert back to original format - }elseif(($biomesTag = $chunk->getTag("Biomes")) instanceof ByteArrayTag){ - $biomeArray = $makeBiomeArray($biomesTag->getValue()); - }else{ - $biomeArray = BiomeArray::fill(BiomeIds::OCEAN); } return new ChunkData( new Chunk( $subChunks, - $biomeArray, $chunk->getByte("TerrainPopulated", 0) !== 0 ), ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], @@ -102,6 +109,6 @@ trait LegacyAnvilChunkTrait{ ); } - abstract protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk; + abstract protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk; } diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 98e9f703e9..f911d00432 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -33,12 +33,13 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntArrayTag; use pocketmine\nbt\tag\ListTag; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; +use function strlen; use function zlib_decode; class McRegion extends RegionWorldProvider{ @@ -69,34 +70,37 @@ class McRegion extends RegionWorldProvider{ //trying to read it. return null; } + + $makeBiomeArray = function(string $biomeIds) : PalettedBlockArray{ + if(strlen($biomeIds) !== 256){ + throw new CorruptedChunkException("Expected biome array to be exactly 256 bytes, got " . strlen($biomeIds)); + } + return ChunkUtils::extrapolate3DBiomes($biomeIds); + }; + if(($biomeColorsTag = $chunk->getTag("BiomeColors")) instanceof IntArrayTag){ + $biomes3d = $makeBiomeArray(ChunkUtils::convertBiomeColors($biomeColorsTag->getValue())); //Convert back to original format + }elseif(($biomesTag = $chunk->getTag("Biomes")) instanceof ByteArrayTag){ + $biomes3d = $makeBiomeArray($biomesTag->getValue()); + }else{ + $biomes3d = new PalettedBlockArray(BiomeIds::OCEAN); + } + $subChunks = []; $fullIds = self::readFixedSizeByteArray($chunk, "Blocks", 32768); $fullData = self::readFixedSizeByteArray($chunk, "Data", 16384); for($y = 0; $y < 8; ++$y){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)]); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)], clone $biomes3d); } - - $makeBiomeArray = function(string $biomeIds) : BiomeArray{ - try{ - return new BiomeArray($biomeIds); - }catch(\InvalidArgumentException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ + if(!isset($subChunks[$y])){ + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); } - }; - $biomeIds = null; - if(($biomeColorsTag = $chunk->getTag("BiomeColors")) instanceof IntArrayTag){ - $biomeIds = $makeBiomeArray(ChunkUtils::convertBiomeColors($biomeColorsTag->getValue())); //Convert back to original format - }elseif(($biomesTag = $chunk->getTag("Biomes")) instanceof ByteArrayTag){ - $biomeIds = $makeBiomeArray($biomesTag->getValue()); - }else{ - $biomeIds = BiomeArray::fill(BiomeIds::OCEAN); } return new ChunkData( new Chunk( $subChunks, - $biomeIds, $chunk->getByte("TerrainPopulated", 0) !== 0 ), ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], diff --git a/src/world/format/io/region/PMAnvil.php b/src/world/format/io/region/PMAnvil.php index 29b47b3524..8d31f73bc5 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io\region; use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; /** @@ -35,11 +36,11 @@ use pocketmine\world\format\SubChunk; class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; - protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ + protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkXZY( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) - )]); + )], $biomes3d); } protected static function getRegionFileExtension() : string{ diff --git a/src/world/generator/Flat.php b/src/world/generator/Flat.php index 12dbc4bd0c..9536cde03f 100644 --- a/src/world/generator/Flat.php +++ b/src/world/generator/Flat.php @@ -25,7 +25,6 @@ namespace pocketmine\world\generator; use pocketmine\block\VanillaBlocks; use pocketmine\world\ChunkManager; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\SubChunk; use pocketmine\world\generator\object\OreType; @@ -67,7 +66,7 @@ class Flat extends Generator{ } protected function generateBaseChunk() : void{ - $this->chunk = new Chunk([], BiomeArray::fill($this->options->getBiomeId()), false); + $this->chunk = new Chunk([], false); $structure = $this->options->getStructure(); $count = count($structure); diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index b2e3d610c1..e7e2b407c4 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -23,10 +23,8 @@ declare(strict_types=1); namespace pocketmine\world\generator; -use pocketmine\data\bedrock\BiomeIds; use pocketmine\scheduler\AsyncTask; use pocketmine\utils\AssumptionFailedError; -use pocketmine\world\format\BiomeArray; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; use pocketmine\world\SimpleChunkManager; @@ -112,7 +110,7 @@ class PopulationTask extends AsyncTask{ } private static function setOrGenerateChunk(SimpleChunkManager $manager, Generator $generator, int $chunkX, int $chunkZ, ?Chunk $chunk) : Chunk{ - $manager->setChunk($chunkX, $chunkZ, $chunk ?? new Chunk([], BiomeArray::fill(BiomeIds::OCEAN), false)); + $manager->setChunk($chunkX, $chunkZ, $chunk ?? new Chunk([], false)); if($chunk === null){ $generator->generateChunk($manager, $chunkX, $chunkZ); $chunk = $manager->getChunk($chunkX, $chunkZ); diff --git a/src/world/generator/hell/Nether.php b/src/world/generator/hell/Nether.php index 61c8624a0f..e00b22015a 100644 --- a/src/world/generator/hell/Nether.php +++ b/src/world/generator/hell/Nether.php @@ -34,6 +34,7 @@ use pocketmine\world\generator\noise\Simplex; use pocketmine\world\generator\object\OreType; use pocketmine\world\generator\populator\Ore; use pocketmine\world\generator\populator\Populator; +use pocketmine\world\World; use function abs; class Nether extends Generator{ @@ -78,7 +79,9 @@ class Nether extends Generator{ for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < Chunk::EDGE_LENGTH; ++$z){ - $chunk->setBiomeId($x, $z, BiomeIds::HELL); + for($y = World::Y_MIN; $y < World::Y_MAX; $y++){ + $chunk->setBiomeId($x, $y, $z, BiomeIds::HELL); + } for($y = 0; $y < 128; ++$y){ if($y === 0 || $y === 127){ @@ -109,7 +112,7 @@ class Nether extends Generator{ } $chunk = $world->getChunk($chunkX, $chunkZ); - $biome = BiomeRegistry::getInstance()->getBiome($chunk->getBiomeId(7, 7)); + $biome = BiomeRegistry::getInstance()->getBiome($chunk->getBiomeId(7, 7, 7)); $biome->populateChunk($world, $chunkX, $chunkZ, $this->random); } } diff --git a/src/world/generator/normal/Normal.php b/src/world/generator/normal/Normal.php index c03a06feb8..107d147e92 100644 --- a/src/world/generator/normal/Normal.php +++ b/src/world/generator/normal/Normal.php @@ -160,7 +160,9 @@ class Normal extends Generator{ $weightSum = 0; $biome = $this->pickBiome($absoluteX, $absoluteZ); - $chunk->setBiomeId($x, $z, $biome->getId()); + for($y = World::Y_MIN; $y < World::Y_MAX; $y++){ + $chunk->setBiomeId($x, $y, $z, $biome->getId()); + } for($sx = -$this->gaussian->smoothSize; $sx <= $this->gaussian->smoothSize; ++$sx){ for($sz = -$this->gaussian->smoothSize; $sz <= $this->gaussian->smoothSize; ++$sz){ @@ -218,7 +220,7 @@ class Normal extends Generator{ } $chunk = $world->getChunk($chunkX, $chunkZ); - $biome = BiomeRegistry::getInstance()->getBiome($chunk->getBiomeId(7, 7)); + $biome = BiomeRegistry::getInstance()->getBiome($chunk->getBiomeId(7, 7, 7)); $biome->populateChunk($world, $chunkX, $chunkZ, $this->random); } } diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 2aa6cca9b9..16a1d95a0a 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -41,7 +41,7 @@ class GroundCover implements Populator{ $biomeRegistry = BiomeRegistry::getInstance(); for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < Chunk::EDGE_LENGTH; ++$z){ - $biome = $biomeRegistry->getBiome($chunk->getBiomeId($x, $z)); + $biome = $biomeRegistry->getBiome($chunk->getBiomeId($x, 0, $z)); $cover = $biome->getGroundCover(); if(count($cover) > 0){ $diffY = 0; diff --git a/tests/phpunit/world/format/ChunkTest.php b/tests/phpunit/world/format/ChunkTest.php index b285a63085..a8cca71b2d 100644 --- a/tests/phpunit/world/format/ChunkTest.php +++ b/tests/phpunit/world/format/ChunkTest.php @@ -24,23 +24,22 @@ declare(strict_types=1); namespace pocketmine\world\format; use PHPUnit\Framework\TestCase; -use pocketmine\data\bedrock\BiomeIds; class ChunkTest extends TestCase{ public function testClone() : void{ - $chunk = new Chunk([], BiomeArray::fill(BiomeIds::OCEAN), false); + $chunk = new Chunk([], false); $chunk->setFullBlock(0, 0, 0, 1); - $chunk->setBiomeId(0, 0, 1); + $chunk->setBiomeId(0, 0, 0, 1); $chunk->setHeightMap(0, 0, 1); $chunk2 = clone $chunk; $chunk2->setFullBlock(0, 0, 0, 2); - $chunk2->setBiomeId(0, 0, 2); + $chunk2->setBiomeId(0, 0, 0, 2); $chunk2->setHeightMap(0, 0, 2); self::assertNotSame($chunk->getFullBlock(0, 0, 0), $chunk2->getFullBlock(0, 0, 0)); - self::assertNotSame($chunk->getBiomeId(0, 0), $chunk2->getBiomeId(0, 0)); + self::assertNotSame($chunk->getBiomeId(0, 0, 0), $chunk2->getBiomeId(0, 0, 0)); self::assertNotSame($chunk->getHeightMap(0, 0), $chunk2->getHeightMap(0, 0)); } } diff --git a/tests/phpunit/world/format/SubChunkTest.php b/tests/phpunit/world/format/SubChunkTest.php index 4f33a45fc0..3b78610510 100644 --- a/tests/phpunit/world/format/SubChunkTest.php +++ b/tests/phpunit/world/format/SubChunkTest.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format; use PHPUnit\Framework\TestCase; +use pocketmine\data\bedrock\BiomeIds; class SubChunkTest extends TestCase{ @@ -31,7 +32,7 @@ class SubChunkTest extends TestCase{ * Test that a cloned SubChunk instance doesn't influence the original */ public function testClone() : void{ - $sub1 = new SubChunk(0, []); + $sub1 = new SubChunk(0, [], new PalettedBlockArray(BiomeIds::OCEAN)); $sub1->setFullBlock(0, 0, 0, 1); $sub1->getBlockLightArray()->set(0, 0, 0, 1); From 7314151c4731ccc215a77824df82943a7b0bea7d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Jan 2023 22:47:43 +0000 Subject: [PATCH 0500/1858] LevelDB: code cleanup --- src/world/format/io/leveldb/LevelDB.php | 372 ++++++++++++++---------- 1 file changed, 214 insertions(+), 158 deletions(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index c8bb35e733..8f3aa54abd 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; @@ -187,6 +188,22 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); } + private static function serializeBlockPalette(BinaryStream $stream, PalettedBlockArray $blocks, BlockStateSerializer $blockStateSerializer) : void{ + $stream->putByte($blocks->getBitsPerBlock() << 1); + $stream->put($blocks->getWordArray()); + + $palette = $blocks->getPalette(); + if($blocks->getBitsPerBlock() !== 0){ + $stream->putLInt(count($palette)); + } + $tags = []; + foreach($palette as $p){ + $tags[] = new TreeRoot($blockStateSerializer->serialize($p)->toNbt()); + } + + $stream->put((new LittleEndianNbtSerializer())->writeMultiple($tags)); + } + /** * @throws CorruptedChunkException */ @@ -353,10 +370,203 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return ord($chunkVersionRaw); } + /** + * Deserializes terrain data stored in the 0.9 full-chunk format into subchunks. + * + * @return SubChunk[] + * @phpstan-return array + * @throws CorruptedWorldException + */ + private function deserializeLegacyTerrainData(string $index, int $chunkVersion) : array{ + $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); + + $legacyTerrain = $this->db->get($index . ChunkDataKey::LEGACY_TERRAIN); + if($legacyTerrain === false){ + throw new CorruptedChunkException("Missing expected LEGACY_TERRAIN tag for format version $chunkVersion"); + } + $binaryStream = new BinaryStream($legacyTerrain); + try{ + $fullIds = $binaryStream->get(32768); + $fullData = $binaryStream->get(16384); + $binaryStream->get(32768); //legacy light info, discard it + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + + try{ + $binaryStream->get(256); //heightmap, discard it + /** @var int[] $unpackedBiomeArray */ + $unpackedBiomeArray = unpack("N*", $binaryStream->get(1024)); //unpack() will never fail here + $biomes3d = ChunkUtils::extrapolate3DBiomes(ChunkUtils::convertBiomeColors(array_values($unpackedBiomeArray))); //never throws + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + + $subChunks = []; + for($yy = 0; $yy < 8; ++$yy){ + $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy)]; + if(isset($convertedLegacyExtraData[$yy])){ + $storages[] = $convertedLegacyExtraData[$yy]; + } + $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, clone $biomes3d); + } + + //make sure extrapolated biomes get filled in correctly + for($yy = Chunk::MIN_SUBCHUNK_INDEX; $yy <= Chunk::MAX_SUBCHUNK_INDEX; ++$yy){ + if(!isset($subChunks[$yy])){ + $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); + } + } + + return $subChunks; + } + + /** + * Deserializes a subchunk stored in the legacy non-paletted format used from 1.0 until 1.2.13. + */ + private function deserializeNonPalettedSubChunkData(BinaryStream $binaryStream, int $chunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette) : SubChunk{ + try{ + $blocks = $binaryStream->get(4096); + $blockData = $binaryStream->get(2048); + + if($chunkVersion < ChunkVersion::v1_1_0){ + $binaryStream->get(4096); //legacy light info, discard it + } + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + + $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData)]; + if($convertedLegacyExtraData !== null){ + $storages[] = $convertedLegacyExtraData; + } + + return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + } + + /** + * Deserializes subchunk data stored under a subchunk LevelDB key. + * + * @see ChunkDataKey::SUBCHUNK + * @throws CorruptedChunkException + */ + private function deserializeSubChunkData(BinaryStream $binaryStream, int $chunkVersion, int $subChunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette) : SubChunk{ + switch($subChunkVersion){ + case SubChunkVersion::CLASSIC: + case SubChunkVersion::CLASSIC_BUG_2: //these are all identical to version 0, but vanilla respects these so we should also + case SubChunkVersion::CLASSIC_BUG_3: + case SubChunkVersion::CLASSIC_BUG_4: + case SubChunkVersion::CLASSIC_BUG_5: + case SubChunkVersion::CLASSIC_BUG_6: + case SubChunkVersion::CLASSIC_BUG_7: + return $this->deserializeNonPalettedSubChunkData($binaryStream, $chunkVersion, $convertedLegacyExtraData, $biomePalette); + case SubChunkVersion::PALETTED_SINGLE: + $storages = [$this->deserializeBlockPalette($binaryStream)]; + if($convertedLegacyExtraData !== null){ + $storages[] = $convertedLegacyExtraData; + } + return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + case SubChunkVersion::PALETTED_MULTI: + case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: + //legacy extradata layers intentionally ignored because they aren't supposed to exist in v8 + + $storageCount = $binaryStream->getByte(); + if($subChunkVersion >= SubChunkVersion::PALETTED_MULTI_WITH_OFFSET){ + //height ignored; this seems pointless since this is already in the key anyway + $binaryStream->getByte(); + } + + $storages = []; + for($k = 0; $k < $storageCount; ++$k){ + $storages[] = $this->deserializeBlockPalette($binaryStream); + } + return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + default: + //TODO: set chunks read-only so the version on disk doesn't get overwritten + throw new CorruptedChunkException("don't know how to decode LevelDB subchunk format version $subChunkVersion"); + } + } + private static function hasOffsetCavesAndCliffsSubChunks(int $chunkVersion) : bool{ return $chunkVersion >= ChunkVersion::v1_16_220_50_unused && $chunkVersion <= ChunkVersion::v1_16_230_50_unused; } + /** + * Deserializes any subchunks stored under subchunk LevelDB keys, upgrading them to the current format if necessary. + * + * @param PalettedBlockArray[] $convertedLegacyExtraData + * @param PalettedBlockArray[] $biomeArrays + * + * @phpstan-param array $convertedLegacyExtraData + * @phpstan-param array $biomeArrays + * @phpstan-param-out bool $hasBeenUpgraded + * + * @return SubChunk[] + * @phpstan-return array + */ + private function deserializeAllSubChunkData(string $index, int $chunkVersion, bool &$hasBeenUpgraded, array $convertedLegacyExtraData, array $biomeArrays) : array{ + $subChunks = []; + + $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; + for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ + if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y + $subChunkKeyOffset))) === false){ + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], $biomeArrays[$y]); + continue; + } + + $binaryStream = new BinaryStream($data); + if($binaryStream->feof()){ + throw new CorruptedChunkException("Unexpected empty data for subchunk $y"); + } + $subChunkVersion = $binaryStream->getByte(); + if($subChunkVersion < self::CURRENT_LEVEL_SUBCHUNK_VERSION){ + $hasBeenUpgraded = true; + } + + $subChunks[$y] = $this->deserializeSubChunkData($binaryStream, $chunkVersion, $subChunkVersion, $convertedLegacyExtraData[$y] ?? null, $biomeArrays[$y]); + } + + return $subChunks; + } + + /** + * Deserializes any available biome data into an array of paletted biomes. Old 2D biomes are extrapolated to 3D. + * + * @return PalettedBlockArray[] + * @phpstan-return array + */ + private function deserializeBiomeData(string $index, int $chunkVersion) : array{ + $biomeArrays = []; + if(($maps2d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES)) !== false){ + $binaryStream = new BinaryStream($maps2d); + + try{ + $binaryStream->get(512); //heightmap, discard it + $biomes3d = ChunkUtils::extrapolate3DBiomes($binaryStream->get(256)); //never throws + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ + $biomeArrays[$i] = clone $biomes3d; + } + }elseif(($maps3d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_3D_BIOMES)) !== false){ + $binaryStream = new BinaryStream($maps3d); + + try{ + $binaryStream->get(512); + $biomeArrays = self::deserialize3dBiomes($binaryStream, $chunkVersion); + }catch(BinaryDataException $e){ + throw new CorruptedChunkException($e->getMessage(), 0, $e); + } + }else{ + for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ + $biomeArrays[$i] = new PalettedBlockArray(BiomeIds::OCEAN); //polyfill + } + } + + return $biomeArrays; + } + /** * @throws CorruptedChunkException */ @@ -369,13 +579,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return null; } - /** @var SubChunk[] $subChunks */ - $subChunks = []; - $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; - $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; - switch($chunkVersion){ case ChunkVersion::v1_18_30: case ChunkVersion::v1_18_0_25_beta: @@ -418,150 +623,13 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: check beds case ChunkVersion::v1_0_0: $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); - - $biomeArrays = []; - if(($maps2d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES)) !== false){ - $binaryStream = new BinaryStream($maps2d); - - try{ - $binaryStream->get(512); //heightmap, discard it - $biomes3d = ChunkUtils::extrapolate3DBiomes($binaryStream->get(256)); //never throws - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ - $biomeArrays[$i] = clone $biomes3d; - } - }elseif(($maps3d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_3D_BIOMES)) !== false){ - $binaryStream = new BinaryStream($maps3d); - - try{ - $binaryStream->get(512); - $biomeArrays = self::deserialize3dBiomes($binaryStream, $chunkVersion); - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - }else{ - for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ - $biomeArrays[$i] = new PalettedBlockArray(BiomeIds::OCEAN); //polyfill - } - } - - for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ - if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y + $subChunkKeyOffset))) === false){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], $biomeArrays[$y]); - continue; - } - - $binaryStream = new BinaryStream($data); - if($binaryStream->feof()){ - throw new CorruptedChunkException("Unexpected empty data for subchunk $y"); - } - $subChunkVersion = $binaryStream->getByte(); - if($subChunkVersion < self::CURRENT_LEVEL_SUBCHUNK_VERSION){ - $hasBeenUpgraded = true; - } - - switch($subChunkVersion){ - case SubChunkVersion::CLASSIC: - case SubChunkVersion::CLASSIC_BUG_2: //these are all identical to version 0, but vanilla respects these so we should also - case SubChunkVersion::CLASSIC_BUG_3: - case SubChunkVersion::CLASSIC_BUG_4: - case SubChunkVersion::CLASSIC_BUG_5: - case SubChunkVersion::CLASSIC_BUG_6: - case SubChunkVersion::CLASSIC_BUG_7: - try{ - $blocks = $binaryStream->get(4096); - $blockData = $binaryStream->get(2048); - - if($chunkVersion < ChunkVersion::v1_1_0){ - $binaryStream->get(4096); //legacy light info, discard it - $hasBeenUpgraded = true; - } - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - - $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData)]; - if(isset($convertedLegacyExtraData[$y])){ - $storages[] = $convertedLegacyExtraData[$y]; - } - - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); - break; - case SubChunkVersion::PALETTED_SINGLE: - $storages = [$this->deserializeBlockPalette($binaryStream)]; - if(isset($convertedLegacyExtraData[$y])){ - $storages[] = $convertedLegacyExtraData[$y]; - } - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); - break; - case SubChunkVersion::PALETTED_MULTI: - case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: - //legacy extradata layers intentionally ignored because they aren't supposed to exist in v8 - $storageCount = $binaryStream->getByte(); - if($subChunkVersion >= SubChunkVersion::PALETTED_MULTI_WITH_OFFSET){ - //height ignored; this seems pointless since this is already in the key anyway - $binaryStream->getByte(); - } - if($storageCount > 0){ - $storages = []; - - for($k = 0; $k < $storageCount; ++$k){ - $storages[] = $this->deserializeBlockPalette($binaryStream); - } - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomeArrays[$y]); - } - break; - default: - //TODO: set chunks read-only so the version on disk doesn't get overwritten - throw new CorruptedChunkException("don't know how to decode LevelDB subchunk format version $subChunkVersion"); - } - } - + $biomeArrays = $this->deserializeBiomeData($index, $chunkVersion); + $subChunks = $this->deserializeAllSubChunkData($index, $chunkVersion, $hasBeenUpgraded, $convertedLegacyExtraData, $biomeArrays); break; case ChunkVersion::v0_9_5: case ChunkVersion::v0_9_2: case ChunkVersion::v0_9_0: - $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); - - $legacyTerrain = $this->db->get($index . ChunkDataKey::LEGACY_TERRAIN); - if($legacyTerrain === false){ - throw new CorruptedChunkException("Missing expected LEGACY_TERRAIN tag for format version $chunkVersion"); - } - $binaryStream = new BinaryStream($legacyTerrain); - try{ - $fullIds = $binaryStream->get(32768); - $fullData = $binaryStream->get(16384); - $binaryStream->get(32768); //legacy light info, discard it - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - - try{ - $binaryStream->get(256); //heightmap, discard it - /** @var int[] $unpackedBiomeArray */ - $unpackedBiomeArray = unpack("N*", $binaryStream->get(1024)); //unpack() will never fail here - $biomes3d = ChunkUtils::extrapolate3DBiomes(ChunkUtils::convertBiomeColors(array_values($unpackedBiomeArray))); //never throws - }catch(BinaryDataException $e){ - throw new CorruptedChunkException($e->getMessage(), 0, $e); - } - - for($yy = 0; $yy < 8; ++$yy){ - $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy)]; - if(isset($convertedLegacyExtraData[$yy])){ - $storages[] = $convertedLegacyExtraData[$yy]; - } - $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, clone $biomes3d); - } - - //make sure extrapolated biomes get filled in correctly - for($yy = Chunk::MIN_SUBCHUNK_INDEX; $yy <= Chunk::MAX_SUBCHUNK_INDEX; ++$yy){ - if(!isset($subChunks[$yy])){ - $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); - } - } - + $subChunks = $this->deserializeLegacyTerrainData($index, $chunkVersion); break; default: //TODO: set chunks read-only so the version on disk doesn't get overwritten @@ -639,19 +707,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $layers = $subChunk->getBlockLayers(); $subStream->putByte(count($layers)); foreach($layers as $blocks){ - $subStream->putByte($blocks->getBitsPerBlock() << 1); - $subStream->put($blocks->getWordArray()); - - $palette = $blocks->getPalette(); - if($blocks->getBitsPerBlock() !== 0){ - $subStream->putLInt(count($palette)); - } - $tags = []; - foreach($palette as $p){ - $tags[] = new TreeRoot($blockStateSerializer->serialize($p)->toNbt()); - } - - $subStream->put((new LittleEndianNbtSerializer())->writeMultiple($tags)); + self::serializeBlockPalette($subStream, $blocks, $blockStateSerializer); } $write->put($key, $subStream->getBuffer()); From 664089861a8e19ac072e9f53155adc98d5d0270a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jan 2023 14:27:51 +0000 Subject: [PATCH 0501/1858] Bump phpstan/phpstan from 1.9.11 to 1.9.12 (#5517) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.11 to 1.9.12. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.11...1.9.12) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 1b2679e71c..c9d3908d52 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.11", + "phpstan/phpstan": "1.9.12", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 861d73ead9..b2bbb472cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d5ea4a4f41bf80636b678e6d3d06eac0", + "content-hash": "1c5a3de092db3cda702d3f39d3da246c", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.11", + "version": "1.9.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "60f3d68481eef216199eae7a2603cd5fe124d464" + "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/60f3d68481eef216199eae7a2603cd5fe124d464", - "reference": "60f3d68481eef216199eae7a2603cd5fe124d464", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/44a338ff0d5572c13fd77dfd91addb96e48c29f8", + "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.11" + "source": "https://github.com/phpstan/phpstan/tree/1.9.12" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T14:04:13+00:00" + "time": "2023-01-17T10:44:04+00:00" }, { "name": "phpstan/phpstan-phpunit", From a8556dff02cbc981cc108bc4e4f29782e7c6be8f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 15:00:18 +0000 Subject: [PATCH 0502/1858] RakLibInterface: include Snooze events in Connection Handler timings --- src/network/mcpe/raklib/RakLibInterface.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index bf1f75c269..5eec4b31bf 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -36,6 +36,8 @@ use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; use pocketmine\Server; use pocketmine\snooze\SleeperNotifier; +use pocketmine\timings\Timings; +use pocketmine\timings\TimingsHandler; use pocketmine\utils\Utils; use raklib\generic\SocketException; use raklib\protocol\EncapsulatedPacket; @@ -110,7 +112,12 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ public function start() : void{ $this->server->getTickSleeper()->addNotifier($this->sleeper, function() : void{ - while($this->eventReceiver->handle($this)); + Timings::$connection->startTiming(); + try{ + while($this->eventReceiver->handle($this)); + }finally{ + Timings::$connection->stopTiming(); + } }); $this->server->getLogger()->debug("Waiting for RakLib to start..."); try{ From 2f5e08067d2558559d65e90945f3297624cf7bb0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 15:16:30 +0000 Subject: [PATCH 0503/1858] Release 4.12.10 --- changelogs/4.12.md | 11 +++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/changelogs/4.12.md b/changelogs/4.12.md index ab96c20828..8878a42f52 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -93,3 +93,14 @@ Released 16th January 2023. ## Other changes - Increased packet batch budget for player sessions. + +# 4.12.10 +Released 18th January 2023. + +## Fixes +- Fixed reported server load not including the time spent processing Snooze interrupts between ticks (e.g. incoming network packets). +- Fixed `Connection Handler` entry in timings report not including time spent receiving packets. + +## Note about server load & performance +This version will report higher apparent server load than previous versions. The actual performance of the server is unchanged; the previous reported load was inaccurate. +These bugs have been present for nearly 5 years (ever since the first introduction of Snooze in 3.0.0). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9bbff9b63d..1c1023ae53 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.12.10"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 217f9aea02945816ec8a8280ccef7e297fe7ee3b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 15:16:33 +0000 Subject: [PATCH 0504/1858] 4.12.11 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1c1023ae53..fe876727a4 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.10"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.12.11"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 7c068101b719dfaf330f5b23c0055b902877d06e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 15:17:37 +0000 Subject: [PATCH 0505/1858] =?UTF-8?q?CS=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/mcpe/raklib/RakLibInterface.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 5eec4b31bf..ef9f7d6417 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -37,7 +37,6 @@ use pocketmine\network\PacketHandlingException; use pocketmine\Server; use pocketmine\snooze\SleeperNotifier; use pocketmine\timings\Timings; -use pocketmine\timings\TimingsHandler; use pocketmine\utils\Utils; use raklib\generic\SocketException; use raklib\protocol\EncapsulatedPacket; From 1d9336ed677ce5df380c75da11d779d13ea2c0ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 16:15:43 +0000 Subject: [PATCH 0506/1858] Release 4.13.0-BETA1 --- changelogs/4.13-beta.md | 94 +++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +-- 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.13-beta.md diff --git a/changelogs/4.13-beta.md b/changelogs/4.13-beta.md new file mode 100644 index 0000000000..865d2267b3 --- /dev/null +++ b/changelogs/4.13-beta.md @@ -0,0 +1,94 @@ +**For Minecraft: Bedrock Edition 1.19.50** + +This is a minor feature release for PocketMine-MP, introducing some new features and improvements. + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.13.0-BETA1 +Released 18th January 2023. + +## Gameplay +- Death message is now shown on the death screen when a player dies. +- Armour damage is now only increased if the armour reduced the damage taken. +- Implemented Swift Sneak enchantment. +- Fixed incorrect collision box calculation of walls and glass/bars when connected. Note: Client-side, wall connections are still broken; this only fixes projectile flight server-side. + +## Performance +- Improved performance of chunk selection for chunk random ticking using a cache. This improves performance of chunk random ticking by 10-20%. + +## Localization +- Added localized description for the `/dumpmemory` command. + +## Permissions +- Added the following new core permissions: + - `pocketmine.command.effect.other` - allows the player to use the `/effect` command on other players (default operator only) + - `pocketmine.command.effect.self` - allows the player to use the `/effect` command on themselves (default operator only) + - `pocketmine.command.enchant.other` - allows the player to use the `/enchant` command on other players (default operator only) + - `pocketmine.command.enchant.self` - allows the player to use the `/enchant` command on themselves (default operator only) + - `pocketmine.command.gamemode.other` - allows the player to use the `/gamemode` command on other players (default operator only) + - `pocketmine.command.gamemode.self` - allows the player to use the `/gamemode` command on themselves (default operator only) + - `pocketmine.command.give.other` - allows the player to use the `/give` command on other players (default operator only) + - `pocketmine.command.give.self` - allows the player to use the `/give` command on themselves (default operator only) + - `pocketmine.command.spawnpoint.other` - allows the player to use the `/spawnpoint` command on other players (default operator only) + - `pocketmine.command.spawnpoint.self` - allows the player to use the `/spawnpoint` command on themselves (default operator only) + - `pocketmine.command.teleport.other` - allows the player to use the `/teleport` command on other players (default operator only) + - `pocketmine.command.teleport.self` - allows the player to use the `/teleport` command on themselves (default operator only) + - `pocketmine.command.title.other` - allows the player to use the `/title` command on other players (default operator only) + - `pocketmine.command.title.self` - allows the player to use the `/title` command on themselves (default operator only) + +## Internals +- Decoupled `Player->sendMessage()` and `Player->sendTranslation()`. +- Refactored resource pack loading in `ResourcePackManager` to make it easier to understand. +- Client-aware translation processing has been moved to `NetworkSession` due to being client-specific. +- Replaced hardcoded strings with constants in various places. +- `NetworkSession` destructive cleanup is now deferred to the next session tick. This fixes various `InventoryManager` crashes when kicking players during events. +- Updated code using `strpos()` to use `str_starts_with()`, `str_ends_with()` and `str_contains()` where appropriate. +- Added documentation for some internal methods. + +## API +### `pocketmine\command` +- The following new API methods have been added: + - `protected VanillaCommand->fetchPermittedPlayerTarget(...) : ?Player` - fetches a player target according to the given sender permissions, or null if not found or not permitted + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Living->getDisplayName() : string` - the name of the entity to be shown in death messages, commands etc. + +### `pocketmine\event\world` +- The following new classes have been added: + - `WorldSoundEvent` - called when a sound is played in a world + - `WorldParticleEvent` - called when a particle is spawned in a world + +### `pocketmine\item` +- The following new API methods have been added: + - `public Item->onInteractEntity(Player $player, Entity $entity, Vector3 $clickVector) : bool` - called when a player interacts with an entity with this item in hand + +### `pocketmine\lang` +- `Language->translate()` and `Language->translateString()` no longer parse nested translation in the "base text". This was never intended behaviour, and didn't work beyond the first level anyway. + +### `pocketmine\player` +- The following new interfaces have been added: + - `PlayerDataProvider` - implemented by classes which want to offer storage for player data +- The following new classes have been added: + - `DatFilePlayerDataProvider` - the default player data provider, which stores `.dat` files in the `players` folder + - `PlayerDataLoadException` - thrown when an error occurs while loading player data + - `PlayerDataSaveException` - thrown when an error occurs while saving player data +- The following API methods have been deprecated: + - `Player->sendTranslation()` - use `Player->sendMessage()` instead with a `Translatable` message + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setResourceStack(list $resourceStack) : void` - sets the list of resource packs to be applied by players + - `public ResourcePackManager->setPackEncryptionKey(string $id, ?string $key) : void` - sets the encryption key to be used for a resource pack + +### `pocketmine\utils` +- The following new API methods have been added: + - `public static Filesystem::fileGetContents(...) : string` - a wrapper around `file_get_contents()` which throws an exception on failure + +### `pocketmine\world` +- The following new API methods have been added: + - `public World->requestSafeSpawn(?Vector3 $spawn = null) : Promise` - an async version of `getSafeSpawn()` which generates all the needed chunks before returning diff --git a/src/VersionInfo.php b/src/VersionInfo.php index fe876727a4..053c813ec0 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.11"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "stable"; + public const BASE_VERSION = "4.13.0-BETA1"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "beta"; private function __construct(){ //NOOP From d9324b9951687df4ecc429691439099887866ef2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 16:15:47 +0000 Subject: [PATCH 0507/1858] 4.13.0-BETA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 053c813ec0..a55ca2ba32 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.13.0-BETA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.13.0-BETA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From f0925ff9dc197a358800c64e34ea7d91fb0d22d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 16:32:22 +0000 Subject: [PATCH 0508/1858] draft-release: link to the correct channel-specific changelog not having this made releasing alphas and betas error-prone, because I'd have to manually amend the changelog URL in the release. --- .github/workflows/draft-release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index f73bc5f28c..3d49656a8d 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -55,6 +55,7 @@ jobs: echo ::set-output name=MCPE_VERSION::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK;') echo ::set-output name=PM_VERSION_SHORT::$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\VersionInfo::BASE_VERSION); array_pop($v); echo implode(".", $v);') echo ::set-output name=PM_VERSION_MD::$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\VersionInfo::BASE_VERSION);') + echo ::set-output name=CHANGELOG_SUFFIX::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') - name: Generate build info run: php build/generate-build-info-json.php ${{ github.sha }} ${{ steps.get-pm-version.outputs.PM_VERSION }} ${{ github.repository }} ${{ steps.build-number.outputs.BUILD_NUMBER }} ${{ github.run_id }} > build_info.json @@ -80,4 +81,4 @@ jobs: body: | **For Minecraft: Bedrock Edition ${{ steps.get-pm-version.outputs.MCPE_VERSION }}** - Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. + Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}${{ steps.get-pm-version.outputs.CHANGELOG_SUFFIX }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. From 023010370b3794d0e79471c28adf2e23b09b78a8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 19:50:18 +0000 Subject: [PATCH 0509/1858] Release 5.0.0-ALPHA7 --- changelogs/5.0-alpha.md | 132 ++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 133 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index de11e5c7ad..09d92bc7a4 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -737,3 +737,135 @@ Released 19th December 2022. - `EntityLegacyIds` has been removed. Legacy entity IDs found during world loading are now converted via `LegacyEntityIdToStringIdMap`. - All usages of NBT keys now use class constants instead of hardcoded strings (except for an occasional overlooked one). - All members of `BlockTypeTags` now have a `pocketmine:` prefix on the value. This does not affect constant usages. + +# 5.0.0-ALPHA7 +Released 18th January 2023. + +**This release includes changes from the following releases, which may not be mentioned:** +- [4.12.3](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.3) +- [4.12.4](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.4) +- [4.12.5](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.5) +- [4.12.6](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.6) +- [4.12.7](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.7) +- [4.12.8](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.8) +- [4.12.9](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.9) +- [4.12.10](https://github.com/pmmp/PocketMine-MP/releases/tag/4.12.10) +- [4.13.0-BETA1](https://github.com/pmmp/PocketMine-MP/releases/tag/4.13.0-BETA1) + +## Fixes +- Fixed glowing item frame placement creating the wrong tile, causing invisible items. + +## Localization +- Localized disconnect messages are now used in the following cases: + - Server full + - Player not on the server whitelist + - Player on the server ban list + - Invalid skin + - Invalid username + - Kicked using `/kick` + - Banned using `/ban` + - Failure to find a safe spawn position +- Session open, session close and session player name discovery messages are now localized. +- All permissions now have localized descriptions. These are not currently used by PocketMine-MP, but may be useful for plugins. + +## Gameplay +### Worlds +- Added support for 3D biomes. This isn't used by PocketMine-MP yet, but is necessary to be able to fully load 1.18 worlds. + +### Blocks +- Added the following new blocks: + - Chain + - Sculk + +### Items +- Added the following new items: + - Eye Drops (from Education Edition) + - Antidote (from Education Edition) + - Elixir (from Education Edition) + - Tonic (from Education Edition) + +## API +### Overview +- Biome-related APIs have changed to accommodate 3D biomes. +- Disconnect-related APIs have changed to accommodate localized disconnect messages. +- New, more powerful chat formatting API introduced to `PlayerChatEvent`. +- Glowing item frames moved to a separate block type instead of being a property of regular item frames (due to technical limitations). + +### `pocketmine\block` +- The following API methods have been removed: + - `ItemFrame->isGlowing() : bool` + - `ItemFrame->setGlowing(bool $glowing) : void` +- The following new API methods have been added: + - `public static VanillaBlocks::GLOWING_ITEM_FRAME() : ItemFrame` +- The following constants have been added: + - `BlockTypeIds::GLOWING_ITEM_FRAME` + - `BlockTypeIds::CHAIN` + - `BlockTypeIds::SCULK` +- The following new classes have been added: + - `Chain` + - `Sculk` + +### `pocketmine\event\player` +- The following API methods have changed signatures: + - `PlayerDuplicateLoginEvent->getDisconnectMessage()` now returns `Translatable|string` instead of `string` + - `PlayerDuplicateLoginEvent->setDisconnectMessage()` now accepts `Translatable|string` instead of `string` + - `PlayerKickEvent->getReason()` now returns `Translatable|string` instead of `string` + - `PlayerKickEvent->setReason()` now accepts `Translatable|string` instead of `string` + - `PlayerLoginEvent->getKickMessage()` now returns `Translatable|string` instead of `string` + - `PlayerLoginEvent->setKickMessage()` now accepts `Translatable|string` instead of `string` + - `PlayerPreLoginEvent->getFinalKickMessage()` now returns `Translatable|string` instead of `string` + - `PlayerPreLoginEvent->getKickMessage()` now returns `Translatable|string|null` instead of `string|null` + - `PlayerPreLoginEvent->setKickReason()` now accepts `Translatable|string` for the `$message` parameter instead of `string` + - `PlayerQuitEvent->getQuitReason()` now returns `Translatable|string` instead of `string` +- The following API methods have been removed: + - `PlayerChatEvent->getFormat()` (use `PlayerChatEvent->getChatFormatter()` instead) + - `PlayerChatEvent->setFormat()` (use `PlayerChatEvent->setChatFormatter()` instead) +- The following new API methods have been added: + - `public PlayerChatEvent->setChatFormatter(\pocketmine\player\chat\ChatFormatter $formatter) : void` - sets the chat formatter to be used for this event + - `public PlayerChatEvent->getChatFormatter() : \pocketmine\player\chat\ChatFormatter` - returns the chat formatter to be used for this event + +### `pocketmine\item` +- The following new classes have been added: + - `Medicine` + - `MedicineType` +- The following new class constants have been added: + - `ItemTypeIds::MEDICINE` + +### `pocketmine\network\query` +- The following API methods have changed signatures: + - `QueryInfo->getPlayerList()` now returns `list` instead of `list` + - `QueryInfo->setPlayerList()` now accepts `list` instead of `list` + +### `pocketmine\player` +- The following API methods have changed signatures: + - `Player->kick()` now accepts `Translatable|string` for `$reason` instead of `string` (to allow localized kick messages) + - `Player->disconnect()` now accepts `Translatable|string` for `$reason` instead of `string` (to allow localized disconnect messages) + - `Player->sendJukeboxPopup()` now accepts `Translatable|string` instead of `string, string[]` + +#### `pocketmine\player\chat` +- The following new classes have been added: + - `ChatFormatter` - interface implemented by chat formatters + - `StandardChatFormatter` - formats chat messages in the vanilla Minecraft style + - `LegacyRawChatFormatter` - implements the same behaviour previously used by `PlayerChatEvent->setFormat()` + +### `pocketmine\world` +- The following API methods have changed signatures: + - `World->getBiome()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `World->getBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `World->setBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + +#### `pocketmine\world\format` +- The following new API methods have been added: + - `public SubChunk->getBiomeArray() : PalettedBlockArray` +- The following API methods have changed signatures: + - `Chunk->getBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `Chunk->setBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `Chunk->__construct()` no longer accepts `BiomeArray` as a parameter (contained in each subchunk instead) + - `SubChunk->__construct()` now accepts `int $emptyBlockId, list $blocks, PalettedBlockArray $biomes, ?LightArray $blockLight, ?LightArray $skyLight` instead of `int, list, ?LightArray, ?LightArray` +- The following classes have been removed + - `BiomeArray` + +## Internals +- Built-in commands now declare their names inside the class constructor, rather than accepting them as parameters. This improves code consistency. +- `NetworkSession` disconnect APIs now accept `Translatable|string` instead of `string` to allow localized disconnect messages. +- All external usages of `KnownTranslationKeys` are now removed. All localized messages are now sent using `Translatable` objects (usually from `KnownTranslationFactory`). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index cfca3b4b59..90d1a5f9bc 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA7"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 5d2ac214a8756dcc3693815f116d7230edbf0ac7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 19:50:18 +0000 Subject: [PATCH 0510/1858] 5.0.0-ALPHA8 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 90d1a5f9bc..98044d7dee 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA7"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA8"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 41e60cb62c0b50559c64e8e590b95a84bf4c22de Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 20:36:53 +0000 Subject: [PATCH 0511/1858] NetworkSession: remove unnecessary translation --- src/network/mcpe/NetworkSession.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index c087694299..3cb21106d2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -634,7 +634,7 @@ class NetworkSession{ function() use ($protocolVersion) : void{ $this->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true); }, - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion)) + KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion) ); } From d7f40f75d27f62d39c57a6b9c1decb560ed9ea26 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 20:45:49 +0000 Subject: [PATCH 0512/1858] PlayerPreLoginEvent: fixed documentation errors --- src/event/player/PlayerPreLoginEvent.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/event/player/PlayerPreLoginEvent.php b/src/event/player/PlayerPreLoginEvent.php index 4f266d661b..0f9ddd7129 100644 --- a/src/event/player/PlayerPreLoginEvent.php +++ b/src/event/player/PlayerPreLoginEvent.php @@ -69,8 +69,8 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ /** * Returns an object containing self-proclaimed information about the connecting player. - * WARNING: THE PLAYER IS NOT VERIFIED DURING THIS EVENT. At this point, it's unknown if the player is real or a - * hacker. + * WARNING: THE PLAYER IS NOT VERIFIED DURING THIS EVENT. At this point, this could be a hacker posing as another + * player. */ public function getPlayerInfo() : PlayerInfo{ return $this->playerInfo; @@ -109,7 +109,7 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ } /** - * Sets a reason to disallow the player to continue continue authenticating, with a message. + * Sets a reason to disallow the player to continue authenticating, with a message. * This can also be used to change kick messages for already-set flags. */ public function setKickReason(int $flag, string $message) : void{ From b8f6b66e42e830539e5b24d532710d536bbdb8c2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Jan 2023 20:57:17 +0000 Subject: [PATCH 0513/1858] First look at separating disconnect reason and disconnect screen messages (#4512) --- .../player/PlayerDisconnectEventTrait.php | 62 +++++++++++++++++++ .../player/PlayerDuplicateLoginEvent.php | 5 +- src/event/player/PlayerKickEvent.php | 23 ++----- src/network/NetworkSessionManager.php | 7 ++- src/network/mcpe/NetworkSession.php | 31 +++++----- .../handler/ResourcePacksPacketHandler.php | 2 +- src/player/Player.php | 26 +++++--- 7 files changed, 111 insertions(+), 45 deletions(-) create mode 100644 src/event/player/PlayerDisconnectEventTrait.php diff --git a/src/event/player/PlayerDisconnectEventTrait.php b/src/event/player/PlayerDisconnectEventTrait.php new file mode 100644 index 0000000000..219f742472 --- /dev/null +++ b/src/event/player/PlayerDisconnectEventTrait.php @@ -0,0 +1,62 @@ +disconnectReason = $disconnectReason; + } + + /** + * Returns the kick reason shown in the server log and on the console. + * When kicked by the /kick command, the default is something like "Kicked by admin.". + */ + public function getDisconnectReason() : Translatable|string{ + return $this->disconnectReason; + } + + /** + * Sets the message shown on the player's disconnection screen. + * This can be as long as you like, and may contain formatting and newlines. + * If this is set to null, the kick reason will be used as the disconnect screen message directly. + */ + public function setDisconnectScreenMessage(Translatable|string|null $disconnectScreenMessage) : void{ + $this->disconnectScreenMessage = $disconnectScreenMessage; + } + + /** + * Returns the message shown on the player's disconnection screen. + * When kicked by the /kick command, the default is something like "Kicked by admin.". + * If this is null, the kick reason will be used as the disconnect screen message directly. + */ + public function getDisconnectScreenMessage() : Translatable|string|null{ return $this->disconnectScreenMessage ?? $this->disconnectReason; } +} diff --git a/src/event/player/PlayerDuplicateLoginEvent.php b/src/event/player/PlayerDuplicateLoginEvent.php index 53d68bcd0f..eddd544fdc 100644 --- a/src/event/player/PlayerDuplicateLoginEvent.php +++ b/src/event/player/PlayerDuplicateLoginEvent.php @@ -36,12 +36,15 @@ use pocketmine\network\mcpe\NetworkSession; */ class PlayerDuplicateLoginEvent extends Event implements Cancellable{ use CancellableTrait; + use PlayerDisconnectEventTrait; private Translatable|string $disconnectMessage; public function __construct( private NetworkSession $connectingSession, - private NetworkSession $existingSession + private NetworkSession $existingSession, + private Translatable|string $disconnectReason, + private Translatable|string|null $disconnectScreenMessage ){ $this->disconnectMessage = KnownTranslationFactory::disconnectionScreen_loggedinOtherLocation(); } diff --git a/src/event/player/PlayerKickEvent.php b/src/event/player/PlayerKickEvent.php index 11f77e4de8..8e00385a2a 100644 --- a/src/event/player/PlayerKickEvent.php +++ b/src/event/player/PlayerKickEvent.php @@ -33,32 +33,17 @@ use pocketmine\player\Player; */ class PlayerKickEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; + use PlayerDisconnectEventTrait; public function __construct( Player $player, - protected Translatable|string $reason, - protected Translatable|string $quitMessage + protected Translatable|string $disconnectReason, + protected Translatable|string $quitMessage, + protected Translatable|string|null $disconnectScreenMessage ){ $this->player = $player; } - /** - * Sets the message shown on the kicked player's disconnection screen. - * This message is also displayed in the console and server log. - */ - public function setReason(Translatable|string $reason) : void{ - $this->reason = $reason; - } - - /** - * Returns the message shown on the kicked player's disconnection screen. - * This message is also displayed in the console and server log. - * When kicked by the /kick command, the default is something like "Kicked by admin.". - */ - public function getReason() : Translatable|string{ - return $this->reason; - } - /** * Sets the quit message broadcasted to other players. */ diff --git a/src/network/NetworkSessionManager.php b/src/network/NetworkSessionManager.php index 35ddb04531..d8ff7fe038 100644 --- a/src/network/NetworkSessionManager.php +++ b/src/network/NetworkSessionManager.php @@ -96,10 +96,13 @@ class NetworkSessionManager{ /** * Terminates all connected sessions with the given reason. + * + * @param Translatable|string $reason Shown in the server log - this should be a short one-line message + * @param Translatable|string|null $disconnectScreenMessage Shown on the player's disconnection screen (null will use the reason) */ - public function close(Translatable|string $reason = "") : void{ + public function close(Translatable|string $reason = "", Translatable|string|null $disconnectScreenMessage = null) : void{ foreach($this->sessions as $session){ - $session->disconnect($reason); + $session->disconnect($reason, $disconnectScreenMessage); } $this->sessions = []; } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 3cb21106d2..5025928d20 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -602,22 +602,25 @@ class NetworkSession{ $this->invManager = null; } - private function sendDisconnectPacket(Translatable|string $reason) : void{ - if($reason instanceof Translatable){ - $translated = $this->server->getLanguage()->translate($reason); + private function sendDisconnectPacket(Translatable|string $message) : void{ + if($message instanceof Translatable){ + $translated = $this->server->getLanguage()->translate($message); }else{ - $translated = $reason; + $translated = $message; } $this->sendDataPacket(DisconnectPacket::create($translated)); } /** * Disconnects the session, destroying the associated player (if it exists). + * + * @param Translatable|string $reason Shown in the server log - this should be a short one-line message + * @param Translatable|string|null $disconnectScreenMessage Shown on the player's disconnection screen (null will use the reason) */ - public function disconnect(Translatable|string $reason, bool $notify = true) : void{ - $this->tryDisconnect(function() use ($reason, $notify) : void{ + public function disconnect(Translatable|string $reason, Translatable|string|null $disconnectScreenMessage = null, bool $notify = true) : void{ + $this->tryDisconnect(function() use ($reason, $disconnectScreenMessage, $notify) : void{ if($notify){ - $this->sendDisconnectPacket($reason); + $this->sendDisconnectPacket($disconnectScreenMessage ?? $reason); } if($this->player !== null){ $this->player->onPostDisconnect($reason, null); @@ -654,9 +657,9 @@ class NetworkSession{ /** * Called by the Player when it is closed (for example due to getting kicked). */ - public function onPlayerDestroyed(Translatable|string $reason) : void{ - $this->tryDisconnect(function() use ($reason) : void{ - $this->sendDisconnectPacket($reason); + public function onPlayerDestroyed(Translatable|string $reason, Translatable|string $disconnectScreenMessage) : void{ + $this->tryDisconnect(function() use ($disconnectScreenMessage) : void{ + $this->sendDisconnectPacket($disconnectScreenMessage); }, $reason); } @@ -694,7 +697,7 @@ class NetworkSession{ if(!$this->authenticated){ if($authRequired){ - $this->disconnect(KnownTranslationFactory::disconnectionScreen_notAuthenticated()); + $this->disconnect("Not authenticated", KnownTranslationFactory::disconnectionScreen_notAuthenticated()); return; } if($this->info instanceof XboxLivePlayerInfo){ @@ -728,14 +731,14 @@ class NetworkSession{ if($kickForXUIDMismatch($info instanceof XboxLivePlayerInfo ? $info->getXuid() : "")){ return; } - $ev = new PlayerDuplicateLoginEvent($this, $existingSession); + $ev = new PlayerDuplicateLoginEvent($this, $existingSession, KnownTranslationFactory::disconnectionScreen_loggedinOtherLocation(), null); $ev->call(); if($ev->isCancelled()){ - $this->disconnect($ev->getDisconnectMessage()); + $this->disconnect($ev->getDisconnectReason(), $ev->getDisconnectScreenMessage()); return; } - $existingSession->disconnect($ev->getDisconnectMessage()); + $existingSession->disconnect($ev->getDisconnectReason(), $ev->getDisconnectScreenMessage()); } } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 8e76c545d6..7438fe47c1 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -93,7 +93,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ switch($packet->status){ case ResourcePackClientResponsePacket::STATUS_REFUSED: //TODO: add lang strings for this - $this->session->disconnect("You must accept resource packs to join this server.", true); + $this->session->disconnect("Refused resource packs", "You must accept resource packs to join this server.", true); break; case ResourcePackClientResponsePacket::STATUS_SEND_PACKS: foreach($packet->packIds as $uuid){ diff --git a/src/player/Player.php b/src/player/Player.php index 5bf99b3bbf..3218929a90 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2090,16 +2090,24 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ /** * Kicks a player from the server + * + * @param Translatable|string $reason Shown in the server log - this should be a short one-line message + * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) + * @param Translatable|string|null $disconnectScreenMessage Shown on the player's disconnection screen (null will use the reason) */ - public function kick(Translatable|string $reason = "", Translatable|string|null $quitMessage = null) : bool{ - $ev = new PlayerKickEvent($this, $reason, $quitMessage ?? $this->getLeaveMessage()); + public function kick(Translatable|string $reason = "", Translatable|string|null $quitMessage = null, Translatable|string|null $disconnectScreenMessage = null) : bool{ + $ev = new PlayerKickEvent($this, $reason, $quitMessage ?? $this->getLeaveMessage(), $disconnectScreenMessage); $ev->call(); if(!$ev->isCancelled()){ - $reason = $ev->getReason(); + $reason = $ev->getDisconnectReason(); if($reason === ""){ $reason = KnownTranslationFactory::disconnectionScreen_noReason(); } - $this->disconnect($reason, $ev->getQuitMessage()); + $disconnectScreenMessage = $ev->getDisconnectScreenMessage() ?? $reason; + if($disconnectScreenMessage === ""){ + $disconnectScreenMessage = KnownTranslationFactory::disconnectionScreen_noReason(); + } + $this->disconnect($reason, $ev->getQuitMessage(), $disconnectScreenMessage); return true; } @@ -2116,15 +2124,16 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * * Note for internals developers: Do not call this from network sessions. It will cause a feedback loop. * - * @param Translatable|string $reason Shown on the disconnect screen, and in the server log - * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) + * @param Translatable|string $reason Shown in the server log - this should be a short one-line message + * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) + * @param Translatable|string|null $disconnectScreenMessage Shown on the player's disconnection screen (null will use the reason) */ - public function disconnect(Translatable|string $reason, Translatable|string|null $quitMessage = null) : void{ + public function disconnect(Translatable|string $reason, Translatable|string|null $quitMessage = null, Translatable|string|null $disconnectScreenMessage = null) : void{ if(!$this->isConnected()){ return; } - $this->getNetworkSession()->onPlayerDestroyed($reason); + $this->getNetworkSession()->onPlayerDestroyed($reason, $disconnectScreenMessage ?? $reason); $this->onPostDisconnect($reason, $quitMessage); } @@ -2132,6 +2141,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @internal * This method executes post-disconnect actions and cleanups. * + * @param Translatable|string $reason Shown in the server log - this should be a short one-line message * @param Translatable|string|null $quitMessage Message to broadcast to online players (null will use default) */ public function onPostDisconnect(Translatable|string $reason, Translatable|string|null $quitMessage) : void{ From 448aeec78067c2c671344f276de410af8501ab18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jan 2023 13:04:28 +0000 Subject: [PATCH 0514/1858] Bump phpstan/phpstan from 1.9.12 to 1.9.13 (#5520) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.12 to 1.9.13. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.12...1.9.13) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index c9d3908d52..50593ee5b8 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.12", + "phpstan/phpstan": "1.9.13", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index b2bbb472cf..b23e4916d9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1c5a3de092db3cda702d3f39d3da246c", + "content-hash": "15ba4659fe5eb8a99345c917325e90fd", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.12", + "version": "1.9.13", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8" + "reference": "a0922426da3a7d0d9334e99a363f7f9f6e23e84f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/44a338ff0d5572c13fd77dfd91addb96e48c29f8", - "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a0922426da3a7d0d9334e99a363f7f9f6e23e84f", + "reference": "a0922426da3a7d0d9334e99a363f7f9f6e23e84f", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.12" + "source": "https://github.com/phpstan/phpstan/tree/1.9.13" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-17T10:44:04+00:00" + "time": "2023-01-18T15:26:53+00:00" }, { "name": "phpstan/phpstan-phpunit", From 441919c5e3770f08c69563977268231737c80ac5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Jan 2023 01:12:35 +0000 Subject: [PATCH 0515/1858] Begin testing on PHP 8.2 --- .github/workflows/main.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a24e3db203..597cdfc135 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,11 +13,11 @@ jobs: strategy: matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10] + php: [8.0.23, 8.1.10, 8.2.1] steps: - name: Build and prepare PHP cache - uses: pmmp/setup-php-action@82a44d659bf5046612c69f036af3e14dc32e3fa8 + uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -31,13 +31,13 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10] + php: [8.0.23, 8.1.10, 8.2.1] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@82a44d659bf5046612c69f036af3e14dc32e3fa8 + uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -69,13 +69,13 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10] + php: [8.0.23, 8.1.10, 8.2.1] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@82a44d659bf5046612c69f036af3e14dc32e3fa8 + uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -107,7 +107,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10] + php: [8.0.23, 8.1.10, 8.2.1] steps: - uses: actions/checkout@v3 @@ -115,7 +115,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@82a44d659bf5046612c69f036af3e14dc32e3fa8 + uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -147,13 +147,13 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10] + php: [8.0.23, 8.1.10, 8.2.1] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@82a44d659bf5046612c69f036af3e14dc32e3fa8 + uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 with: php-version: ${{ matrix.php }} install-path: "./bin" From 65ef929d229ce51546f5f9795fbd8bc6d9d1e3ba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Jan 2023 01:13:15 +0000 Subject: [PATCH 0516/1858] Update Actions PHP versions --- .github/workflows/main.yml | 10 +++++----- .github/workflows/update-php-versions.php | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 597cdfc135..2aca2934e4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10, 8.2.1] + php: [8.0.27, 8.1.14, 8.2.1] steps: - name: Build and prepare PHP cache @@ -31,7 +31,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10, 8.2.1] + php: [8.0.27, 8.1.14, 8.2.1] steps: - uses: actions/checkout@v3 @@ -69,7 +69,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10, 8.2.1] + php: [8.0.27, 8.1.14, 8.2.1] steps: - uses: actions/checkout@v3 @@ -107,7 +107,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10, 8.2.1] + php: [8.0.27, 8.1.14, 8.2.1] steps: - uses: actions/checkout@v3 @@ -147,7 +147,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.23, 8.1.10, 8.2.1] + php: [8.0.27, 8.1.14, 8.2.1] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/update-php-versions.php b/.github/workflows/update-php-versions.php index 7ff7985665..92e79a6dec 100644 --- a/.github/workflows/update-php-versions.php +++ b/.github/workflows/update-php-versions.php @@ -23,7 +23,8 @@ declare(strict_types=1); const VERSIONS = [ "8.0", - "8.1" + "8.1", + "8.2" ]; $workflowFile = file_get_contents(__DIR__ . '/main.yml'); From 74e052de51424d0e919c5c76fb7708651762adb4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Jan 2023 01:30:39 +0000 Subject: [PATCH 0517/1858] Terminal: fix deprecation error on PHP 8.2 --- src/utils/Terminal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/Terminal.php b/src/utils/Terminal.php index 7144b8a9b7..49b4224ec8 100644 --- a/src/utils/Terminal.php +++ b/src/utils/Terminal.php @@ -92,7 +92,7 @@ abstract class Terminal{ self::$FORMAT_RESET = "\x1b[m"; - $color = fn(int $code) => "\x1b[38;5;${code}m"; + $color = fn(int $code) => "\x1b[38;5;{$code}m"; self::$COLOR_BLACK = $color(16); self::$COLOR_DARK_BLUE = $color(19); From b1a5b02d3ab2c192ea15a100530a535b97f876d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Jan 2023 01:55:52 +0000 Subject: [PATCH 0518/1858] Updated DevTools to 1.16.1 --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index bd0fa048da..a67f9af8d6 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit bd0fa048dae29bebe25ba76d8c58788e92418b67 +Subproject commit a67f9af8d6cff1615975c68a9b171a8f09aac0c4 From d5b7bf77b0265fc8223bd815514c7baca997afad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Jan 2023 09:44:19 +0000 Subject: [PATCH 0519/1858] Bump build/php from `6b605ed` to `b479ec4` (#5521) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `6b605ed` to `b479ec4`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/6b605ed7c458fc8f95080ffe41a7f248a7160107...b479ec438f05459eac959f4952152527bbc7ce0b) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 6b605ed7c4..b479ec438f 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 6b605ed7c458fc8f95080ffe41a7f248a7160107 +Subproject commit b479ec438f05459eac959f4952152527bbc7ce0b From f948cb0086e71d1dfa0b16cfbe0e50fbcbd4fc75 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 21 Jan 2023 15:30:36 +0000 Subject: [PATCH 0520/1858] PocketMine.php: refuse pthreads 5.0 --- src/PocketMine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index f491158263..4b0b644ecb 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -122,7 +122,7 @@ namespace pocketmine { if(substr_count($pthreads_version, ".") < 2){ $pthreads_version = "0.$pthreads_version"; } - if(version_compare($pthreads_version, "4.0.0") < 0 || version_compare($pthreads_version, "5.0.0") > 0){ + if(version_compare($pthreads_version, "4.0.0") < 0 || version_compare($pthreads_version, "5.0.0") >= 0){ $messages[] = "pthreads ^4.0.0 is required, while you have $pthreads_version."; } } From ce9b25e97a14c702d5be1b221f6c7b3356e8b5c2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 22 Jan 2023 20:44:26 +0000 Subject: [PATCH 0521/1858] Release 4.12.11 --- changelogs/4.12.md | 13 +++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/changelogs/4.12.md b/changelogs/4.12.md index 8878a42f52..068fefab47 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -104,3 +104,16 @@ Released 18th January 2023. ## Note about server load & performance This version will report higher apparent server load than previous versions. The actual performance of the server is unchanged; the previous reported load was inaccurate. These bugs have been present for nearly 5 years (ever since the first introduction of Snooze in 3.0.0). + +# 4.12.11 +Released 22nd January 2023. + +## General +- Code is now tested and analysed using PHP 8.2 in addition to 8.1 and 8.0. + +## Fixes +- Fixed pthreads 5.0.0 incorrectly being treated as compatible. +- Fixed deprecation errors on PHP 8.2. + +## Documentation +- Updated documentation in `PlayerPreLoginEvent`. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index fe876727a4..f884a0fb98 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.12.11"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 608fcd6cd70007a11dd49c5dc1ac6e07a0b42240 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 22 Jan 2023 20:44:31 +0000 Subject: [PATCH 0522/1858] 4.12.12 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index f884a0fb98..05a46d15da 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.11"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.12.12"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From a12aac71fd3534fbfa12fec710b72f73c7053742 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 19:36:52 +0000 Subject: [PATCH 0523/1858] Updated setup-php-action --- .github/workflows/main.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2aca2934e4..913a575f32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,10 +17,11 @@ jobs: steps: - name: Build and prepare PHP cache - uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 + uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 with: php-version: ${{ matrix.php }} install-path: "./bin" + pm-version-major: "4" phpstan: name: PHPStan analysis @@ -37,10 +38,11 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 + uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 with: php-version: ${{ matrix.php }} install-path: "./bin" + pm-version-major: "4" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -75,10 +77,11 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 + uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 with: php-version: ${{ matrix.php }} install-path: "./bin" + pm-version-major: "4" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -115,10 +118,11 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 + uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 with: php-version: ${{ matrix.php }} install-path: "./bin" + pm-version-major: "4" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -153,10 +157,11 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@7e0f5f0a95e9d45d1d5fab0e1ee7555fa3b04339 + uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 with: php-version: ${{ matrix.php }} install-path: "./bin" + pm-version-major: "4" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php From 222415859af50e583087e24fd4c6a9e7a9a4eba2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:02:33 +0000 Subject: [PATCH 0524/1858] Require pthreads ^5.1 This version of pthreads has a substantially improved API, improved performance, improved memory usage, and much less magical and broken behaviour. --- .github/workflows/main.yml | 10 +- composer.json | 8 +- composer.lock | 91 ++++++++++--------- src/PocketMine.php | 4 +- src/console/ConsoleReaderChildProcess.php | 11 ++- src/network/mcpe/ChunkRequestTask.php | 8 +- src/network/mcpe/auth/ProcessLoginTask.php | 10 +- .../mcpe/compression/CompressBatchTask.php | 9 +- .../mcpe/raklib/PthreadsChannelReader.php | 5 +- .../mcpe/raklib/PthreadsChannelWriter.php | 5 +- src/network/mcpe/raklib/RakLibInterface.php | 6 +- src/network/mcpe/raklib/RakLibServer.php | 25 +++-- .../SnoozeAwarePthreadsChannelWriter.php | 5 +- src/scheduler/AsyncPool.php | 2 +- src/scheduler/AsyncTask.php | 32 +++---- src/thread/CommonThreadPartsTrait.php | 9 +- src/thread/NonThreadSafeValue.php | 57 ++++++++++++ src/thread/ThreadManager.php | 15 ++- src/utils/MainLogger.php | 3 + src/utils/MainLoggerThread.php | 9 +- tests/phpstan/configs/phpstan-bugs.neon | 8 +- tests/phpstan/stubs/pthreads.stub | 31 ++++++- 22 files changed, 245 insertions(+), 118 deletions(-) create mode 100644 src/thread/NonThreadSafeValue.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0481c78c97..85abd45ed6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: with: php-version: ${{ matrix.php }} install-path: "./bin" - pm-version-major: "4" + pm-version-major: "5" phpstan: name: PHPStan analysis @@ -42,7 +42,7 @@ jobs: with: php-version: ${{ matrix.php }} install-path: "./bin" - pm-version-major: "4" + pm-version-major: "5" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -81,7 +81,7 @@ jobs: with: php-version: ${{ matrix.php }} install-path: "./bin" - pm-version-major: "4" + pm-version-major: "5" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -122,7 +122,7 @@ jobs: with: php-version: ${{ matrix.php }} install-path: "./bin" - pm-version-major: "4" + pm-version-major: "5" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php @@ -161,7 +161,7 @@ jobs: with: php-version: ${{ matrix.php }} install-path: "./bin" - pm-version-major: "4" + pm-version-major: "5" - name: Install Composer run: curl -sS https://getcomposer.org/installer | php diff --git a/composer.json b/composer.json index 41d30efe25..39d0a9e16c 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pthreads": "^4.0", + "ext-pthreads": "^5.1", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", @@ -40,17 +40,17 @@ "pocketmine/bedrock-protocol": "~18.0.0+bedrock-1.19.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", - "pocketmine/classloader": "^0.2.0", + "pocketmine/classloader": "dev-pthreads-v5", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.18.0", "pocketmine/log": "^0.4.0", - "pocketmine/log-pthreads": "^0.4.0", + "pocketmine/log-pthreads": "dev-pthreads-v5", "pocketmine/math": "^0.4.0", "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.14.2", "pocketmine/raklib-ipc": "^0.1.0", - "pocketmine/snooze": "^0.3.0", + "pocketmine/snooze": "dev-pthreads-v5", "ramsey/uuid": "^4.1", "symfony/filesystem": "^5.4" }, diff --git a/composer.lock b/composer.lock index a48d419ba2..d31480efad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "19f6b653d5b36e04f2d799de5972e567", + "content-hash": "5725b919e65c02842812b1fed8a3d77c", "packages": [ { "name": "adhocore/json-comment", @@ -469,20 +469,20 @@ }, { "name": "pocketmine/classloader", - "version": "0.2.0", + "version": "dev-pthreads-v5", "source": { "type": "git", "url": "https://github.com/pmmp/ClassLoader.git", - "reference": "49ea303993efdfb39cd302e2156d50aa78209e78" + "reference": "dc98186e947d8940b8f6f4dbb2837f7c961a4812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/49ea303993efdfb39cd302e2156d50aa78209e78", - "reference": "49ea303993efdfb39cd302e2156d50aa78209e78", + "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/dc98186e947d8940b8f6f4dbb2837f7c961a4812", + "reference": "dc98186e947d8940b8f6f4dbb2837f7c961a4812", "shasum": "" }, "require": { - "ext-pthreads": "~3.2.0 || ^4.0", + "ext-pthreads": "^5.0", "ext-reflection": "*", "php": "^8.0" }, @@ -491,8 +491,8 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.99", - "phpstan/phpstan-strict-rules": "^0.12.4", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5" }, "type": "library", @@ -508,9 +508,9 @@ "description": "Ad-hoc autoloading components used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/ClassLoader/issues", - "source": "https://github.com/pmmp/ClassLoader/tree/0.2.0" + "source": "https://github.com/pmmp/ClassLoader/tree/pthreads-v5" }, - "time": "2021-11-01T20:17:27+00:00" + "time": "2023-01-20T18:50:37+00:00" }, { "name": "pocketmine/color", @@ -591,16 +591,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.18.0", + "version": "2.18.3", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "0f50afc3d0fec29f769a62e93c71f8a0fb968f76" + "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/0f50afc3d0fec29f769a62e93c71f8a0fb968f76", - "reference": "0f50afc3d0fec29f769a62e93c71f8a0fb968f76", + "url": "https://api.github.com/repos/pmmp/Language/zipball/da25bfe9ee4822a84feb9b7e620c56ad4000aed0", + "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0", "shasum": "" }, "type": "library", @@ -608,9 +608,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.18.0" + "source": "https://github.com/pmmp/Language/tree/2.18.3" }, - "time": "2023-01-14T17:52:46+00:00" + "time": "2023-01-17T21:43:36+00:00" }, { "name": "pocketmine/log", @@ -655,21 +655,21 @@ }, { "name": "pocketmine/log-pthreads", - "version": "0.4.0", + "version": "dev-pthreads-v5", "source": { "type": "git", "url": "https://github.com/pmmp/LogPthreads.git", - "reference": "61f709e8cf36bcc24e4efe02acded680a1ce23cd" + "reference": "83a66c9b8c39531b97a3b08c0ea97db967a3c60a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/61f709e8cf36bcc24e4efe02acded680a1ce23cd", - "reference": "61f709e8cf36bcc24e4efe02acded680a1ce23cd", + "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/83a66c9b8c39531b97a3b08c0ea97db967a3c60a", + "reference": "83a66c9b8c39531b97a3b08c0ea97db967a3c60a", "shasum": "" }, "require": { - "ext-pthreads": "~3.2.0 || ^4.0", - "php": "^7.4 || ^8.0", + "ext-pthreads": "^5.0", + "php": "^8.0", "pocketmine/log": "^0.4.0" }, "conflict": { @@ -677,8 +677,8 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.88", - "phpstan/phpstan-strict-rules": "^0.12.4" + "phpstan/phpstan": "1.8.11", + "phpstan/phpstan-strict-rules": "^1.0" }, "type": "library", "autoload": { @@ -693,9 +693,9 @@ "description": "Logging components specialized for pthreads used by PocketMine-MP and related projects", "support": { "issues": "https://github.com/pmmp/LogPthreads/issues", - "source": "https://github.com/pmmp/LogPthreads/tree/0.4.0" + "source": "https://github.com/pmmp/LogPthreads/tree/pthreads-v5" }, - "time": "2021-11-01T21:42:09+00:00" + "time": "2023-01-20T19:45:45+00:00" }, { "name": "pocketmine/math", @@ -866,26 +866,26 @@ }, { "name": "pocketmine/snooze", - "version": "0.3.1", + "version": "dev-pthreads-v5", "source": { "type": "git", "url": "https://github.com/pmmp/Snooze.git", - "reference": "0ac8fc2a781c419a1f64ebca4d5835028f59e29b" + "reference": "8589ddfa1672215dcc78d8edb7acb4cf67d59d5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Snooze/zipball/0ac8fc2a781c419a1f64ebca4d5835028f59e29b", - "reference": "0ac8fc2a781c419a1f64ebca4d5835028f59e29b", + "url": "https://api.github.com/repos/pmmp/Snooze/zipball/8589ddfa1672215dcc78d8edb7acb4cf67d59d5a", + "reference": "8589ddfa1672215dcc78d8edb7acb4cf67d59d5a", "shasum": "" }, "require": { - "ext-pthreads": "~3.2.0 || ^4.0", - "php-64bit": "^7.3 || ^8.0" + "ext-pthreads": "^5.0", + "php-64bit": "^8.0" }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.99", - "phpstan/phpstan-strict-rules": "^0.12.4" + "phpstan/phpstan": "1.9.14", + "phpstan/phpstan-strict-rules": "^1.0" }, "type": "library", "autoload": { @@ -900,9 +900,9 @@ "description": "Thread notification management library for code using the pthreads extension", "support": { "issues": "https://github.com/pmmp/Snooze/issues", - "source": "https://github.com/pmmp/Snooze/tree/0.3.1" + "source": "https://github.com/pmmp/Snooze/tree/pthreads-v5" }, - "time": "2021-11-01T20:50:08+00:00" + "time": "2023-01-20T18:19:39+00:00" }, { "name": "ramsey/collection", @@ -1610,16 +1610,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.2", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -1660,9 +1660,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-11-12T15:38:23+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "phar-io/manifest", @@ -3374,7 +3374,10 @@ "stability-flags": { "pocketmine/bedrock-block-upgrade-schema": 20, "pocketmine/bedrock-data": 20, - "pocketmine/bedrock-item-upgrade-schema": 20 + "pocketmine/bedrock-item-upgrade-schema": 20, + "pocketmine/classloader": 20, + "pocketmine/log-pthreads": 20, + "pocketmine/snooze": 20 }, "prefer-stable": false, "prefer-lowest": false, @@ -3396,7 +3399,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pthreads": "^4.0", + "ext-pthreads": "^5.1", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/src/PocketMine.php b/src/PocketMine.php index 4b0b644ecb..762837102c 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -122,8 +122,8 @@ namespace pocketmine { if(substr_count($pthreads_version, ".") < 2){ $pthreads_version = "0.$pthreads_version"; } - if(version_compare($pthreads_version, "4.0.0") < 0 || version_compare($pthreads_version, "5.0.0") >= 0){ - $messages[] = "pthreads ^4.0.0 is required, while you have $pthreads_version."; + if(version_compare($pthreads_version, "5.1.0") < 0 || version_compare($pthreads_version, "6.0.0") >= 0){ + $messages[] = "pthreads ^5.0.0 is required, while you have $pthreads_version."; } } diff --git a/src/console/ConsoleReaderChildProcess.php b/src/console/ConsoleReaderChildProcess.php index 2d4e3fc56f..3dd2c24c28 100644 --- a/src/console/ConsoleReaderChildProcess.php +++ b/src/console/ConsoleReaderChildProcess.php @@ -46,13 +46,17 @@ if($socket === false){ throw new \RuntimeException("Failed to connect to server process ($errCode): $errMessage"); } -$channel = new \Threaded(); +/** @phpstan-var \ThreadedArray $channel */ +$channel = new \ThreadedArray(); $thread = new class($channel) extends \Thread{ + /** + * @phpstan-param \ThreadedArray $channel + */ public function __construct( - private \Threaded $channel, + private \ThreadedArray $channel, ){} - public function run(){ + public function run() : void{ require dirname(__DIR__, 2) . '/vendor/autoload.php'; $channel = $this->channel; @@ -75,7 +79,6 @@ while(!feof($socket)){ if(count($channel) === 0){ $channel->wait(1_000_000); } - /** @var string|null $line */ $line = $channel->shift(); return $line; }); diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 1c9410f223..b466618c9e 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -33,6 +33,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\ChunkPosition; use pocketmine\network\mcpe\serializer\ChunkSerializer; use pocketmine\scheduler\AsyncTask; +use pocketmine\thread\NonThreadSafeValue; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; @@ -43,14 +44,15 @@ class ChunkRequestTask extends AsyncTask{ protected string $chunk; protected int $chunkX; protected int $chunkZ; - protected Compressor $compressor; + /** @phpstan-var NonThreadSafeValue */ + protected NonThreadSafeValue $compressor; private string $tiles; /** * @phpstan-param (\Closure() : void)|null $onError */ public function __construct(int $chunkX, int $chunkZ, Chunk $chunk, CompressBatchPromise $promise, Compressor $compressor, ?\Closure $onError = null){ - $this->compressor = $compressor; + $this->compressor = new NonThreadSafeValue($compressor); $this->chunk = FastChunkSerializer::serializeTerrain($chunk); $this->chunkX = $chunkX; @@ -66,7 +68,7 @@ class ChunkRequestTask extends AsyncTask{ $subCount = ChunkSerializer::getSubChunkCount($chunk); $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); - $this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload))->getBuffer())); + $this->setResult($this->compressor->deserialize()->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload))->getBuffer())); } public function onError() : void{ diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 8df9886d32..1ea36fa375 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -30,6 +30,7 @@ use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\protocol\types\login\JwtChainLinkBody; use pocketmine\network\mcpe\protocol\types\login\JwtHeader; use pocketmine\scheduler\AsyncTask; +use pocketmine\thread\NonThreadSafeValue; use function base64_decode; use function igbinary_serialize; use function igbinary_unserialize; @@ -49,8 +50,10 @@ class ProcessLoginTask extends AsyncTask{ * Whether the keychain signatures were validated correctly. This will be set to an error message if any link in the * keychain is invalid for whatever reason (bad signature, not in nbf-exp window, etc). If this is non-null, the * keychain might have been tampered with. The player will always be disconnected if this is non-null. + * + * @phpstan-var NonThreadSafeValue|string|null */ - private Translatable|string|null $error = "Unknown"; + private NonThreadSafeValue|string|null $error = "Unknown"; /** * Whether the player is logged into Xbox Live. This is true if any link in the keychain is signed with the Mojang * root public key. @@ -77,7 +80,8 @@ class ProcessLoginTask extends AsyncTask{ $this->clientPublicKey = $this->validateChain(); $this->error = null; }catch(VerifyLoginException $e){ - $this->error = $e->getDisconnectMessage(); + $disconnectMessage = $e->getDisconnectMessage(); + $this->error = $disconnectMessage instanceof Translatable ? new NonThreadSafeValue($disconnectMessage) : $disconnectMessage; } } @@ -195,6 +199,6 @@ class ProcessLoginTask extends AsyncTask{ * @phpstan-var \Closure(bool, bool, Translatable|string|null, ?string) : void $callback */ $callback = $this->fetchLocal(self::TLS_KEY_ON_COMPLETION); - $callback($this->authenticated, $this->authRequired, $this->error, $this->clientPublicKey); + $callback($this->authenticated, $this->authRequired, $this->error instanceof NonThreadSafeValue ? $this->error->deserialize() : $this->error, $this->clientPublicKey); } } diff --git a/src/network/mcpe/compression/CompressBatchTask.php b/src/network/mcpe/compression/CompressBatchTask.php index b863076fa1..96e9051b68 100644 --- a/src/network/mcpe/compression/CompressBatchTask.php +++ b/src/network/mcpe/compression/CompressBatchTask.php @@ -24,21 +24,26 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\compression; use pocketmine\scheduler\AsyncTask; +use pocketmine\thread\NonThreadSafeValue; class CompressBatchTask extends AsyncTask{ private const TLS_KEY_PROMISE = "promise"; + /** @phpstan-var NonThreadSafeValue */ + private NonThreadSafeValue $compressor; + public function __construct( private string $data, CompressBatchPromise $promise, - private Compressor $compressor + Compressor $compressor ){ + $this->compressor = new NonThreadSafeValue($compressor); $this->storeLocal(self::TLS_KEY_PROMISE, $promise); } public function onRun() : void{ - $this->setResult($this->compressor->compress($this->data)); + $this->setResult($this->compressor->deserialize()->compress($this->data)); } public function onCompletion() : void{ diff --git a/src/network/mcpe/raklib/PthreadsChannelReader.php b/src/network/mcpe/raklib/PthreadsChannelReader.php index d5b52c7903..68c718b0fb 100644 --- a/src/network/mcpe/raklib/PthreadsChannelReader.php +++ b/src/network/mcpe/raklib/PthreadsChannelReader.php @@ -26,7 +26,10 @@ namespace pocketmine\network\mcpe\raklib; use raklib\server\ipc\InterThreadChannelReader; final class PthreadsChannelReader implements InterThreadChannelReader{ - public function __construct(private \Threaded $buffer){} + /** + * @phpstan-param \ThreadedArray $buffer + */ + public function __construct(private \ThreadedArray $buffer){} public function read() : ?string{ return $this->buffer->shift(); diff --git a/src/network/mcpe/raklib/PthreadsChannelWriter.php b/src/network/mcpe/raklib/PthreadsChannelWriter.php index 5462f77767..afbeefdd20 100644 --- a/src/network/mcpe/raklib/PthreadsChannelWriter.php +++ b/src/network/mcpe/raklib/PthreadsChannelWriter.php @@ -26,7 +26,10 @@ namespace pocketmine\network\mcpe\raklib; use raklib\server\ipc\InterThreadChannelWriter; final class PthreadsChannelWriter implements InterThreadChannelWriter{ - public function __construct(private \Threaded $buffer){} + /** + * @phpstan-param \ThreadedArray $buffer + */ + public function __construct(private \ThreadedArray $buffer){} public function write(string $str) : void{ $this->buffer[] = $str; diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 1cb82ef5af..1adb3c8443 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -85,8 +85,10 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->sleeper = new SleeperNotifier(); - $mainToThreadBuffer = new \Threaded(); - $threadToMainBuffer = new \Threaded(); + /** @phpstan-var \ThreadedArray $mainToThreadBuffer */ + $mainToThreadBuffer = new \ThreadedArray(); + /** @phpstan-var \ThreadedArray $threadToMainBuffer */ + $threadToMainBuffer = new \ThreadedArray(); $this->rakLib = new RakLibServer( $this->server->getLogger(), diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index 13523f3a8f..ccdadca558 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; use pocketmine\snooze\SleeperNotifier; +use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; use raklib\generic\Socket; use raklib\generic\SocketException; @@ -43,19 +44,27 @@ class RakLibServer extends Thread{ protected bool $cleanShutdown = false; protected bool $ready = false; protected string $mainPath; - public ?RakLibThreadCrashInfo $crashInfo = null; + /** @phpstan-var NonThreadSafeValue|null */ + public ?NonThreadSafeValue $crashInfo = null; + /** @phpstan-var NonThreadSafeValue */ + protected NonThreadSafeValue $address; + /** + * @phpstan-param \ThreadedArray $mainToThreadBuffer + * @phpstan-param \ThreadedArray $threadToMainBuffer + */ public function __construct( protected \ThreadedLogger $logger, - protected \Threaded $mainToThreadBuffer, - protected \Threaded $threadToMainBuffer, - protected InternetAddress $address, + protected \ThreadedArray $mainToThreadBuffer, + protected \ThreadedArray $threadToMainBuffer, + InternetAddress $address, protected int $serverId, protected int $maxMtuSize, protected int $protocolVersion, protected SleeperNotifier $mainThreadNotifier ){ $this->mainPath = \pocketmine\PATH; + $this->address = new NonThreadSafeValue($address); } /** @@ -75,12 +84,12 @@ class RakLibServer extends Thread{ } public function getCrashInfo() : ?RakLibThreadCrashInfo{ - return $this->crashInfo; + return $this->crashInfo?->deserialize(); } private function setCrashInfo(RakLibThreadCrashInfo $info) : void{ $this->synchronized(function(RakLibThreadCrashInfo $info) : void{ - $this->crashInfo = $info; + $this->crashInfo = new NonThreadSafeValue($info); $this->notify(); }, $info); } @@ -91,7 +100,7 @@ class RakLibServer extends Thread{ while(!$this->ready && $this->crashInfo === null){ $this->wait(); } - $crashInfo = $this->crashInfo; + $crashInfo = $this->crashInfo?->deserialize(); if($crashInfo !== null){ if($crashInfo->getClass() === SocketException::class){ throw new SocketException($crashInfo->getMessage()); @@ -110,7 +119,7 @@ class RakLibServer extends Thread{ register_shutdown_function([$this, "shutdownHandler"]); try{ - $socket = new Socket($this->address); + $socket = new Socket($this->address->deserialize()); }catch(SocketException $e){ $this->setCrashInfo(RakLibThreadCrashInfo::fromThrowable($e)); return; diff --git a/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php b/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php index 739acf051f..723cb3730e 100644 --- a/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php +++ b/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php @@ -27,8 +27,11 @@ use pocketmine\snooze\SleeperNotifier; use raklib\server\ipc\InterThreadChannelWriter; final class SnoozeAwarePthreadsChannelWriter implements InterThreadChannelWriter{ + /** + * @phpstan-param \ThreadedArray $buffer + */ public function __construct( - private \Threaded $buffer, + private \ThreadedArray $buffer, private SleeperNotifier $notifier ){} diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 76fe6c052e..e8097c3dfc 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -158,7 +158,7 @@ class AsyncPool{ throw new \InvalidArgumentException("Cannot submit the same AsyncTask instance more than once"); } - $task->progressUpdates = new \Threaded(); + $task->progressUpdates = new \ThreadedArray(); $task->setSubmitted(); $this->getWorker($worker)->stack($task); diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 9b8866f439..2194f47dbd 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\scheduler; -use pocketmine\utils\AssumptionFailedError; +use pocketmine\thread\NonThreadSafeValue; use function igbinary_serialize; use function igbinary_unserialize; +use function is_null; use function is_scalar; -use function is_string; use function spl_object_id; /** @@ -51,15 +51,10 @@ use function spl_object_id; * thread, e.g. during {@link AsyncTask::onCompletion()} or {@link AsyncTask::onProgressUpdate()}. This means that * whatever you do in onRun() must be able to work without the Server instance. * - * WARNING: Any non-Threaded objects WILL BE SERIALIZED when assigned to members of AsyncTasks or other Threaded object. - * If later accessed from said Threaded object, you will be operating on a COPY OF THE OBJECT, NOT THE ORIGINAL OBJECT. - * If you want to store non-serializable objects to access when the task completes, store them using + * If you want to store non-thread-safe objects to access when the task completes, store them using * {@link AsyncTask::storeLocal}. - * - * WARNING: Arrays are converted to Volatile objects when assigned as members of Threaded objects. - * Keep this in mind when using arrays stored as members of your AsyncTask. */ -abstract class AsyncTask extends \Threaded{ +abstract class AsyncTask extends \ThreadedRunnable{ /** * @var \ArrayObject|mixed[]|null object hash => mixed data * @phpstan-var \ArrayObject>|null @@ -71,10 +66,11 @@ abstract class AsyncTask extends \Threaded{ /** @var AsyncWorker|null $worker */ public $worker = null; - public \Threaded $progressUpdates; + /** @phpstan-var \ThreadedArray */ + public \ThreadedArray $progressUpdates; - private string|int|bool|null|float $result = null; - private bool $serialized = false; + /** @phpstan-var NonThreadSafeValue|string|int|bool|float|null */ + private NonThreadSafeValue|string|int|bool|null|float $result = null; private bool $cancelRun = false; private bool $submitted = false; @@ -117,15 +113,14 @@ abstract class AsyncTask extends \Threaded{ * @return mixed */ public function getResult(){ - if($this->serialized){ - if(!is_string($this->result)) throw new AssumptionFailedError("Result expected to be a serialized string"); - return igbinary_unserialize($this->result); + if($this->result instanceof NonThreadSafeValue){ + return $this->result->deserialize(); } return $this->result; } public function setResult(mixed $result) : void{ - $this->result = ($this->serialized = !is_scalar($result)) ? igbinary_serialize($result) : $result; + $this->result = is_scalar($result) || is_null($result) ? $result : new NonThreadSafeValue($result); } public function cancelRun() : void{ @@ -164,15 +159,14 @@ abstract class AsyncTask extends \Threaded{ * @param mixed $progress A value that can be safely serialize()'ed. */ public function publishProgress(mixed $progress) : void{ - $this->progressUpdates[] = igbinary_serialize($progress); + $this->progressUpdates[] = igbinary_serialize($progress) ?? throw new \InvalidArgumentException("Progress must be serializable"); } /** * @internal Only call from AsyncPool.php on the main thread */ public function checkProgressUpdates() : void{ - while($this->progressUpdates->count() !== 0){ - $progress = $this->progressUpdates->shift(); + while(($progress = $this->progressUpdates->shift()) !== null){ $this->onProgressUpdate(igbinary_unserialize($progress)); } } diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 8268d5c3f9..777acd0097 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -28,8 +28,11 @@ use pocketmine\Server; use function error_reporting; trait CommonThreadPartsTrait{ - /** @var \Threaded|\ClassLoader[]|null */ - private ?\Threaded $classLoaders = null; + /** + * @var \ThreadedArray|\ClassLoader[]|null + * @phpstan-var \ThreadedArray|null + */ + private ?\ThreadedArray $classLoaders = null; protected ?string $composerAutoloaderPath = null; protected bool $isKilled = false; @@ -52,7 +55,7 @@ trait CommonThreadPartsTrait{ } if($this->classLoaders === null){ - $this->classLoaders = new \Threaded(); + $this->classLoaders = new \ThreadedArray(); }else{ foreach($this->classLoaders as $k => $autoloader){ unset($this->classLoaders[$k]); diff --git a/src/thread/NonThreadSafeValue.php b/src/thread/NonThreadSafeValue.php new file mode 100644 index 0000000000..9d443b065e --- /dev/null +++ b/src/thread/NonThreadSafeValue.php @@ -0,0 +1,57 @@ +variable = igbinary_serialize($variable) ?? throw new \InvalidArgumentException("Cannot serialize variable of type " . get_debug_type($variable)); + } + + /** + * Returns a deserialized copy of the original variable. + * + * @phpstan-return TValue + */ + public function deserialize() : mixed{ + return igbinary_unserialize($this->variable); + } +} diff --git a/src/thread/ThreadManager.php b/src/thread/ThreadManager.php index f383b2c491..a60d9bf9e5 100644 --- a/src/thread/ThreadManager.php +++ b/src/thread/ThreadManager.php @@ -25,7 +25,7 @@ namespace pocketmine\thread; use function spl_object_id; -class ThreadManager extends \Volatile{ +class ThreadManager extends \ThreadedBase{ private static ?self $instance = null; @@ -40,12 +40,19 @@ class ThreadManager extends \Volatile{ return self::$instance; } + /** @phpstan-var \ThreadedArray */ + private \ThreadedArray $threads; + + private function __construct(){ + $this->threads = new \ThreadedArray(); + } + public function add(Worker|Thread $thread) : void{ - $this[spl_object_id($thread)] = $thread; + $this->threads[spl_object_id($thread)] = $thread; } public function remove(Worker|Thread $thread) : void{ - unset($this[spl_object_id($thread)]); + unset($this->threads[spl_object_id($thread)]); } /** @@ -56,7 +63,7 @@ class ThreadManager extends \Volatile{ /** * @var Worker|Thread $thread */ - foreach($this as $key => $thread){ + foreach($this->threads as $key => $thread){ $array[$key] = $thread; } diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index 6f65303bf0..f796155864 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -194,6 +194,9 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ Terminal::writeLine($message); $this->logWriterThread->write($time->format("Y-m-d") . " " . TextFormat::clean($message) . PHP_EOL); + /** + * @var \ThreadedLoggerAttachment $attachment + */ foreach($this->attachments as $attachment){ $attachment->log($level, $message); } diff --git a/src/utils/MainLoggerThread.php b/src/utils/MainLoggerThread.php index b565621340..c7287e3490 100644 --- a/src/utils/MainLoggerThread.php +++ b/src/utils/MainLoggerThread.php @@ -30,14 +30,15 @@ use function is_resource; use function touch; final class MainLoggerThread extends \Thread{ - private \Threaded $buffer; + /** @phpstan-var \ThreadedArray */ + private \ThreadedArray $buffer; private bool $syncFlush = false; private bool $shutdown = false; public function __construct( private string $logFile ){ - $this->buffer = new \Threaded(); + $this->buffer = new \ThreadedArray(); touch($this->logFile); } @@ -72,9 +73,7 @@ final class MainLoggerThread extends \Thread{ * @param resource $logResource */ private function writeLogStream($logResource) : void{ - while($this->buffer->count() > 0){ - /** @var string $chunk */ - $chunk = $this->buffer->shift(); + while(($chunk = $this->buffer->shift()) !== null){ fwrite($logResource, $chunk); } diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 3ee56e8be5..f45f9a643e 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -46,9 +46,9 @@ parameters: path: ../../../src/plugin/PluginManager.php - - message: "#^Offset \\(int\\|string\\) on array\\ in isset\\(\\) always exists and is not nullable\\.$#" + message: "#^Parameter \\#1 \\$work of method Worker\\:\\:stack\\(\\) expects Threaded, pocketmine\\\\scheduler\\\\AsyncTask given\\.$#" count: 1 - path: ../../../src/plugin/PluginManager.php + path: ../../../src/scheduler/AsyncPool.php - message: "#^Static property pocketmine\\\\scheduler\\\\AsyncTask\\:\\:\\$threadLocalStorage \\(ArrayObject\\\\>\\|null\\) does not accept non\\-empty\\-array\\\\>\\|ArrayObject\\\\>\\.$#" @@ -56,12 +56,12 @@ parameters: path: ../../../src/scheduler/AsyncTask.php - - message: "#^Property pocketmine\\\\thread\\\\Thread\\:\\:\\$classLoaders \\(\\(iterable\\&Threaded\\)\\|null\\) does not accept array\\\\|\\(iterable\\&Threaded\\)\\.$#" + message: "#^Property pocketmine\\\\thread\\\\Thread\\:\\:\\$classLoaders \\(ThreadedArray\\\\|null\\) does not accept array\\{ClassLoader\\}\\|ThreadedArray\\\\.$#" count: 1 path: ../../../src/thread/Thread.php - - message: "#^Property pocketmine\\\\thread\\\\Worker\\:\\:\\$classLoaders \\(\\(iterable\\&Threaded\\)\\|null\\) does not accept array\\\\|\\(iterable\\&Threaded\\)\\.$#" + message: "#^Property pocketmine\\\\thread\\\\Worker\\:\\:\\$classLoaders \\(ThreadedArray\\\\|null\\) does not accept array\\{ClassLoader\\}\\|ThreadedArray\\\\.$#" count: 1 path: ../../../src/thread/Worker.php diff --git a/tests/phpstan/stubs/pthreads.stub b/tests/phpstan/stubs/pthreads.stub index 054c8c372a..a48fceea02 100644 --- a/tests/phpstan/stubs/pthreads.stub +++ b/tests/phpstan/stubs/pthreads.stub @@ -1,6 +1,33 @@ + * @implements \IteratorAggregate */ -class Threaded implements \Traversable{} +abstract class ThreadedBase implements \IteratorAggregate{ + + /** + * @template TReturn + * @param \Closure() : TReturn $function + * @param mixed ...$args + * @return TReturn + */ + public function synchronized(\Closure $function, mixed ...$args) : mixed{} +} + +/** + * @template TKey of array-key + * @template TValue + * @implements ArrayAccess + */ +final class ThreadedArray extends ThreadedBase implements Countable, ArrayAccess{ + + /** + * @return TValue|null + */ + public function pop() : mixed{} + + /** + * @return TValue|null + */ + public function shift() : mixed{} +} \ No newline at end of file From 06ad1a2d2b37cdead3640a002f7a7c04e0a16274 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:04:01 +0000 Subject: [PATCH 0525/1858] Updated dependencies to release versions --- composer.json | 6 +++--- composer.lock | 43 ++++++++++++++++++++----------------------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/composer.json b/composer.json index 39d0a9e16c..f4f97914f5 100644 --- a/composer.json +++ b/composer.json @@ -40,17 +40,17 @@ "pocketmine/bedrock-protocol": "~18.0.0+bedrock-1.19.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", - "pocketmine/classloader": "dev-pthreads-v5", + "pocketmine/classloader": "^0.3.0", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.18.0", "pocketmine/log": "^0.4.0", - "pocketmine/log-pthreads": "dev-pthreads-v5", + "pocketmine/log-pthreads": "^0.5.0", "pocketmine/math": "^0.4.0", "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.14.2", "pocketmine/raklib-ipc": "^0.1.0", - "pocketmine/snooze": "dev-pthreads-v5", + "pocketmine/snooze": "^0.4.0", "ramsey/uuid": "^4.1", "symfony/filesystem": "^5.4" }, diff --git a/composer.lock b/composer.lock index d31480efad..fec4f42dc8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5725b919e65c02842812b1fed8a3d77c", + "content-hash": "17ca826af1a32c9768cd162e75d10ad5", "packages": [ { "name": "adhocore/json-comment", @@ -469,16 +469,16 @@ }, { "name": "pocketmine/classloader", - "version": "dev-pthreads-v5", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/pmmp/ClassLoader.git", - "reference": "dc98186e947d8940b8f6f4dbb2837f7c961a4812" + "reference": "407caf521186ec1f03024f39031cc681ad491026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/dc98186e947d8940b8f6f4dbb2837f7c961a4812", - "reference": "dc98186e947d8940b8f6f4dbb2837f7c961a4812", + "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/407caf521186ec1f03024f39031cc681ad491026", + "reference": "407caf521186ec1f03024f39031cc681ad491026", "shasum": "" }, "require": { @@ -508,9 +508,9 @@ "description": "Ad-hoc autoloading components used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/ClassLoader/issues", - "source": "https://github.com/pmmp/ClassLoader/tree/pthreads-v5" + "source": "https://github.com/pmmp/ClassLoader/tree/0.3.0" }, - "time": "2023-01-20T18:50:37+00:00" + "time": "2023-01-23T19:46:53+00:00" }, { "name": "pocketmine/color", @@ -655,16 +655,16 @@ }, { "name": "pocketmine/log-pthreads", - "version": "dev-pthreads-v5", + "version": "0.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/LogPthreads.git", - "reference": "83a66c9b8c39531b97a3b08c0ea97db967a3c60a" + "reference": "0ecfea6dcfc9a9f5c86e126ac1661732de5c5666" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/83a66c9b8c39531b97a3b08c0ea97db967a3c60a", - "reference": "83a66c9b8c39531b97a3b08c0ea97db967a3c60a", + "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/0ecfea6dcfc9a9f5c86e126ac1661732de5c5666", + "reference": "0ecfea6dcfc9a9f5c86e126ac1661732de5c5666", "shasum": "" }, "require": { @@ -693,9 +693,9 @@ "description": "Logging components specialized for pthreads used by PocketMine-MP and related projects", "support": { "issues": "https://github.com/pmmp/LogPthreads/issues", - "source": "https://github.com/pmmp/LogPthreads/tree/pthreads-v5" + "source": "https://github.com/pmmp/LogPthreads/tree/0.5.0" }, - "time": "2023-01-20T19:45:45+00:00" + "time": "2023-01-23T19:52:12+00:00" }, { "name": "pocketmine/math", @@ -866,16 +866,16 @@ }, { "name": "pocketmine/snooze", - "version": "dev-pthreads-v5", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/Snooze.git", - "reference": "8589ddfa1672215dcc78d8edb7acb4cf67d59d5a" + "reference": "6b1d6cc645d674590ff9be2438ac00032f9ee292" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Snooze/zipball/8589ddfa1672215dcc78d8edb7acb4cf67d59d5a", - "reference": "8589ddfa1672215dcc78d8edb7acb4cf67d59d5a", + "url": "https://api.github.com/repos/pmmp/Snooze/zipball/6b1d6cc645d674590ff9be2438ac00032f9ee292", + "reference": "6b1d6cc645d674590ff9be2438ac00032f9ee292", "shasum": "" }, "require": { @@ -900,9 +900,9 @@ "description": "Thread notification management library for code using the pthreads extension", "support": { "issues": "https://github.com/pmmp/Snooze/issues", - "source": "https://github.com/pmmp/Snooze/tree/pthreads-v5" + "source": "https://github.com/pmmp/Snooze/tree/0.4.0" }, - "time": "2023-01-20T18:19:39+00:00" + "time": "2023-01-23T19:43:19+00:00" }, { "name": "ramsey/collection", @@ -3374,10 +3374,7 @@ "stability-flags": { "pocketmine/bedrock-block-upgrade-schema": 20, "pocketmine/bedrock-data": 20, - "pocketmine/bedrock-item-upgrade-schema": 20, - "pocketmine/classloader": 20, - "pocketmine/log-pthreads": 20, - "pocketmine/snooze": 20 + "pocketmine/bedrock-item-upgrade-schema": 20 }, "prefer-stable": false, "prefer-lowest": false, From bd3e9e1cad1d788f587a6e92a5ea0b5a02030dc6 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 23 Jan 2023 20:13:29 +0000 Subject: [PATCH 0526/1858] Do not allow more than 1 run to compile PHP at a time this causes cache collisions and build failures --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 913a575f32..6e5d22e0b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,6 +9,7 @@ jobs: build-php: name: Prepare PHP runs-on: ${{ matrix.image }} + concurrency: php-build-${{ matrix.php }} strategy: matrix: From 002f7d6826ba0fa7a91feeddf785641b640e3f71 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:21:06 +0000 Subject: [PATCH 0527/1858] PlayerDuplicateLoginEvent: remove dead code --- src/event/player/PlayerDuplicateLoginEvent.php | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/event/player/PlayerDuplicateLoginEvent.php b/src/event/player/PlayerDuplicateLoginEvent.php index eddd544fdc..fb0f8186e0 100644 --- a/src/event/player/PlayerDuplicateLoginEvent.php +++ b/src/event/player/PlayerDuplicateLoginEvent.php @@ -38,16 +38,12 @@ class PlayerDuplicateLoginEvent extends Event implements Cancellable{ use CancellableTrait; use PlayerDisconnectEventTrait; - private Translatable|string $disconnectMessage; - public function __construct( private NetworkSession $connectingSession, private NetworkSession $existingSession, private Translatable|string $disconnectReason, private Translatable|string|null $disconnectScreenMessage - ){ - $this->disconnectMessage = KnownTranslationFactory::disconnectionScreen_loggedinOtherLocation(); - } + ){} public function getConnectingSession() : NetworkSession{ return $this->connectingSession; @@ -56,15 +52,4 @@ class PlayerDuplicateLoginEvent extends Event implements Cancellable{ public function getExistingSession() : NetworkSession{ return $this->existingSession; } - - /** - * Returns the message shown to the session which gets disconnected. - */ - public function getDisconnectMessage() : Translatable|string{ - return $this->disconnectMessage; - } - - public function setDisconnectMessage(Translatable|string $message) : void{ - $this->disconnectMessage = $message; - } } From 375ec8e00cce63ae28d84ac5b1c1cd93919ca72a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:36:02 +0000 Subject: [PATCH 0528/1858] Fix CS --- src/event/player/PlayerDuplicateLoginEvent.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/event/player/PlayerDuplicateLoginEvent.php b/src/event/player/PlayerDuplicateLoginEvent.php index fb0f8186e0..3acb566151 100644 --- a/src/event/player/PlayerDuplicateLoginEvent.php +++ b/src/event/player/PlayerDuplicateLoginEvent.php @@ -26,7 +26,6 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; use pocketmine\event\Event; -use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\network\mcpe\NetworkSession; From 5aa8b953a817491ea04f33cb1bc1e17e94796acf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:38:35 +0000 Subject: [PATCH 0529/1858] Release 5.0.0-ALPHA8 --- changelogs/5.0-alpha.md | 40 ++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 09d92bc7a4..7841114763 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -869,3 +869,43 @@ Released 18th January 2023. - Built-in commands now declare their names inside the class constructor, rather than accepting them as parameters. This improves code consistency. - `NetworkSession` disconnect APIs now accept `Translatable|string` instead of `string` to allow localized disconnect messages. - All external usages of `KnownTranslationKeys` are now removed. All localized messages are now sent using `Translatable` objects (usually from `KnownTranslationFactory`). + +# 5.0.0-ALPHA8 +Released 23rd January 2023. + +## Core +- Updated `ext-pthreads` requirement to `^5.1.0`. This version improves performance, memory usage, includes BC-breaking API changes, and removes a lot of confusing behaviour. + - See [`ext-pthreads` 5.0.0 release](https://github.com/pmmp/pthreads/releases/tag/5.0.0) for more information. + - For the most part, plugins will be unaffected, unless using `Threaded` objects directly, or directly interacting with other pthreads APIs. + +## API +### Overview +- It's now possible to specify a different disconnect reason and disconnection screen message. This is useful if you want to display a fancy disconnect screen, but don't want to spam the server log with useless information. + +### `pocketmine\event\player` +- The following API methods have been removed: + - `PlayerKickEvent->getReason()` - replaced by `getDisconnectReason()` and `getDisconnectScreenMessage()` + - `PlayerKickEvent->setReason()` - replaced by `setDisconnectReason()` and `setDisconnectScreenMessage()` + - `PlayerDuplicateLoginEvent->getDisconnectMessage()` - replaced by `getDisconnectReason()` and `getDisconnectScreenMessage()` + - `PlayerDuplicateLoginEvent->setDisconnectMessage()` - replaced by `setDisconnectReason()` and `setDisconnectScreenMessage()` +- The following new API methods have been added: + - `public PlayerKickEvent->getDisconnectReason() : Translatable|string` - returns the reason for the disconnection displayed in the console and server log + - `public PlayerKickEvent->setDisconnectReason(Translatable|string $disconnectReason) : void` - sets the reason for the disconnection displayed in the console and server log + - `public PlayerKickEvent->getDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen (the message in `getDisconnectReason()` is used if null is returned) + - `public PlayerKickEvent->setDisconnectScreenMessage(Translatable|string|null $disconnectScreenMessage) : void` - sets the message to be displayed on the disconnect screen (the message in `setDisconnectReason()` is used if null is passed) + - `public PlayerDuplicateLoginEvent->getDisconnectReason() : Translatable|string` - returns the reason for the disconnection displayed in the console and server log + - `public PlayerDuplicateLoginEvent->setDisconnectReason(Translatable|string $disconnectReason) : void` - sets the reason for the disconnection displayed in the console and server log + - `public PlayerDuplicateLoginEvent->getDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen (the message in `getDisconnectReason()` is used if null is returned) + - `public PlayerDuplicateLoginEvent->setDisconnectScreenMessage(Translatable|string|null $disconnectScreenMessage) : void` - sets the message to be displayed on the disconnect screen (the message in `setDisconnectReason()` is used if null is passed) + +### `pocketmine\network` +- The following API methods have changed signatures: + - `NetworkSessionManager->close()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter. + +### `pocketmine\player` +- The following API methods have changed signatures: + - `Player->kick()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter, which is the message to be displayed on the disconnect screen (the message in `$reason` is used if null is passed) + - `Player->disconnect()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter, which is the message to be displayed on the disconnect screen (the message in `$reason` is used if null is passed) + +## Internals +- `NetworkSession` disconnect methods have been altered to allow specifying a different disconnect reason and disconnection screen message. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 98044d7dee..55e6d705cf 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA8"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 92896c78da01b68ee9a281bb73da163783b765f4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Jan 2023 20:38:35 +0000 Subject: [PATCH 0530/1858] 5.0.0-ALPHA9 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 55e6d705cf..01b260f6f1 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA8"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA9"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 18013e95514984d54210ffcbb27a951b859d7fde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 13:51:50 +0000 Subject: [PATCH 0531/1858] Bump build/php from `b479ec4` to `af250d7` (#5527) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `b479ec4` to `af250d7`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/b479ec438f05459eac959f4952152527bbc7ce0b...af250d7e065ca4a1b8004d9e245a0f444846dde0) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index b479ec438f..af250d7e06 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit b479ec438f05459eac959f4952152527bbc7ce0b +Subproject commit af250d7e065ca4a1b8004d9e245a0f444846dde0 From cbaff1caecefea7abc186836de95f2db3c816e9f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 24 Jan 2023 15:49:42 +0000 Subject: [PATCH 0532/1858] BlockPlaceEvent: use BlockTransaction, closes #1760 BlockPlaceEvent no longer extends BlockEvent, since it's now a multi-block event getBlockReplaced() is removed getTransaction() is added to be honest, BlockPlaceEvent should be something like PlayerBlockPlaceEvent... --- src/event/block/BlockPlaceEvent.php | 25 ++++++++++++++++--------- src/world/World.php | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/event/block/BlockPlaceEvent.php b/src/event/block/BlockPlaceEvent.php index eeb6a7dbc9..b92569fc16 100644 --- a/src/event/block/BlockPlaceEvent.php +++ b/src/event/block/BlockPlaceEvent.php @@ -26,24 +26,24 @@ namespace pocketmine\event\block; use pocketmine\block\Block; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; +use pocketmine\event\Event; use pocketmine\item\Item; use pocketmine\player\Player; +use pocketmine\world\BlockTransaction; /** - * Called when a player places a block + * Called when a player initiates a block placement action. + * More than one block may be changed by a single placement action, for example when placing a door. */ -class BlockPlaceEvent extends BlockEvent implements Cancellable{ +class BlockPlaceEvent extends Event implements Cancellable{ use CancellableTrait; public function __construct( protected Player $player, - Block $blockPlace, - protected Block $blockReplace, + protected BlockTransaction $transaction, protected Block $blockAgainst, protected Item $item - ){ - parent::__construct($blockPlace); - } + ){} /** * Returns the player who is placing the block. @@ -59,8 +59,15 @@ class BlockPlaceEvent extends BlockEvent implements Cancellable{ return clone $this->item; } - public function getBlockReplaced() : Block{ - return $this->blockReplace; + /** + * Returns a BlockTransaction object containing all the block positions that will be changed by this event, and the + * states they will be changed to. + * + * This will usually contain only one block, but may contain more if the block being placed is a multi-block + * structure such as a door or bed. + */ + public function getTransaction() : BlockTransaction{ + return $this->transaction; } public function getBlockAgainst() : Block{ diff --git a/src/world/World.php b/src/world/World.php index 2d7f18d4e0..e6f2406145 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2051,7 +2051,7 @@ class World implements ChunkManager{ } if($player !== null){ - $ev = new BlockPlaceEvent($player, $hand, $blockReplace, $blockClicked, $item); + $ev = new BlockPlaceEvent($player, $tx, $blockClicked, $item); if($player->isSpectator()){ $ev->cancel(); } From ceea8220a9003898be814065199a72062248c8ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 13:23:48 +0000 Subject: [PATCH 0533/1858] Bump symfony/filesystem from 5.4.13 to 5.4.19 (#5530) Bumps [symfony/filesystem](https://github.com/symfony/filesystem) from 5.4.13 to 5.4.19. - [Release notes](https://github.com/symfony/filesystem/releases) - [Changelog](https://github.com/symfony/filesystem/blob/6.2/CHANGELOG.md) - [Commits](https://github.com/symfony/filesystem/compare/v5.4.13...v5.4.19) --- updated-dependencies: - dependency-name: symfony/filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index b23e4916d9..0b528344ca 100644 --- a/composer.lock +++ b/composer.lock @@ -1034,16 +1034,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", + "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", "shasum": "" }, "require": { @@ -1078,7 +1078,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.4.19" }, "funding": [ { @@ -1094,7 +1094,7 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2023-01-14T19:14:44+00:00" }, { "name": "symfony/polyfill-ctype", From 2f469ef4a0baa9d1157e578c7ecc7e78fd27411c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 25 Jan 2023 18:50:14 +0000 Subject: [PATCH 0534/1858] Added mangrove, azalea and flowering azalea leaves --- src/block/BlockLegacyIdHelper.php | 22 +++--- src/block/BlockTypeIds.php | 5 +- src/block/Leaves.php | 32 +++++--- src/block/VanillaBlocks.php | 9 ++- src/block/utils/LeavesType.php | 74 +++++++++++++++++++ .../convert/BlockObjectToStateSerializer.php | 3 + .../convert/BlockStateDeserializerHelper.php | 8 ++ .../convert/BlockStateSerializerHelper.php | 2 +- .../BlockStateToObjectDeserializer.php | 35 ++++----- src/item/StringToItemParser.php | 3 + .../block_factory_consistency_check.json | 2 +- 11 files changed, 150 insertions(+), 45 deletions(-) create mode 100644 src/block/utils/LeavesType.php diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index 0a1b74538a..c7cb2f5d79 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -26,6 +26,7 @@ namespace pocketmine\block; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; +use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WoodType; use pocketmine\item\VanillaItems; @@ -108,15 +109,18 @@ final class BlockLegacyIdHelper{ }); } - public static function getLeavesIdentifier(TreeType $treeType) : BID{ - return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_LEAVES, - TreeType::SPRUCE()->id() => Ids::SPRUCE_LEAVES, - TreeType::BIRCH()->id() => Ids::BIRCH_LEAVES, - TreeType::JUNGLE()->id() => Ids::JUNGLE_LEAVES, - TreeType::ACACIA()->id() => Ids::ACACIA_LEAVES, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_LEAVES, - default => throw new AssumptionFailedError("All tree types should be covered") + public static function getLeavesIdentifier(LeavesType $leavesType) : BID{ + return new BID(match($leavesType->id()){ + LeavesType::OAK()->id() => Ids::OAK_LEAVES, + LeavesType::SPRUCE()->id() => Ids::SPRUCE_LEAVES, + LeavesType::BIRCH()->id() => Ids::BIRCH_LEAVES, + LeavesType::JUNGLE()->id() => Ids::JUNGLE_LEAVES, + LeavesType::ACACIA()->id() => Ids::ACACIA_LEAVES, + LeavesType::DARK_OAK()->id() => Ids::DARK_OAK_LEAVES, + LeavesType::MANGROVE()->id() => Ids::MANGROVE_LEAVES, + LeavesType::AZALEA()->id() => Ids::AZALEA_LEAVES, + LeavesType::FLOWERING_AZALEA()->id() => Ids::FLOWERING_AZALEA_LEAVES, + default => throw new AssumptionFailedError("All leaves types should be covered") }); } diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 66fda94114..324ef60ce0 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -709,8 +709,11 @@ final class BlockTypeIds{ public const CHAIN = 10682; public const SCULK = 10683; public const GLOWING_ITEM_FRAME = 10684; + public const MANGROVE_LEAVES = 10685; + public const AZALEA_LEAVES = 10686; + public const FLOWERING_AZALEA_LEAVES = 10687; - public const FIRST_UNUSED_BLOCK_ID = 10685; + public const FIRST_UNUSED_BLOCK_ID = 10688; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/Leaves.php b/src/block/Leaves.php index c93d798da9..9dc38e091c 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\TreeType; use pocketmine\data\runtime\RuntimeDataReader; @@ -39,13 +40,13 @@ use pocketmine\world\World; use function mt_rand; class Leaves extends Transparent{ - protected TreeType $treeType; + protected LeavesType $leavesType; //immutable for now protected bool $noDecay = false; protected bool $checkDecay = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, TreeType $treeType){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, LeavesType $leavesType){ parent::__construct($idInfo, $name, $typeInfo); - $this->treeType = $treeType; + $this->leavesType = $leavesType; } public function getRequiredStateDataBits() : int{ return 2; } @@ -55,6 +56,8 @@ class Leaves extends Transparent{ $w->bool($this->checkDecay); } + public function getLeavesType() : LeavesType{ return $this->leavesType; } + public function isNoDecay() : bool{ return $this->noDecay; } /** @return $this */ @@ -140,17 +143,22 @@ class Leaves extends Transparent{ $drops = []; if(mt_rand(1, 20) === 1){ //Saplings - $drops[] = (match($this->treeType){ - TreeType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), - TreeType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), - TreeType::DARK_OAK() => VanillaBlocks::DARK_OAK_SAPLING(), - TreeType::JUNGLE() => VanillaBlocks::JUNGLE_SAPLING(), - TreeType::OAK() => VanillaBlocks::OAK_SAPLING(), - TreeType::SPRUCE() => VanillaBlocks::SPRUCE_SAPLING(), + $sapling = (match($this->leavesType){ + LeavesType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), + LeavesType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), + LeavesType::DARK_OAK() => VanillaBlocks::DARK_OAK_SAPLING(), + LeavesType::JUNGLE() => VanillaBlocks::JUNGLE_SAPLING(), + LeavesType::OAK() => VanillaBlocks::OAK_SAPLING(), + LeavesType::SPRUCE() => VanillaBlocks::SPRUCE_SAPLING(), + LeavesType::MANGROVE(), //TODO: mangrove propagule + LeavesType::AZALEA(), LeavesType::FLOWERING_AZALEA() => null, //TODO: azalea default => throw new AssumptionFailedError("Unreachable") - })->asItem(); + })?->asItem(); + if($sapling !== null){ + $drops[] = $sapling; + } } - if(($this->treeType->equals(TreeType::OAK()) || $this->treeType->equals(TreeType::DARK_OAK())) && mt_rand(1, 200) === 1){ //Apples + if(($this->leavesType->equals(LeavesType::OAK()) || $this->leavesType->equals(LeavesType::DARK_OAK())) && mt_rand(1, 200) === 1){ //Apples $drops[] = VanillaItems::APPLE(); } if(mt_rand(1, 50) === 1){ diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 1e1f7829cc..ee4e3595a6 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -54,6 +54,7 @@ use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; +use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\TreeType; use pocketmine\block\utils\WoodType; use pocketmine\crafting\FurnaceType; @@ -99,6 +100,7 @@ use function mb_strtolower; * @method static Stair ANDESITE_STAIRS() * @method static Wall ANDESITE_WALL() * @method static Anvil ANVIL() + * @method static Leaves AZALEA_LEAVES() * @method static Flower AZURE_BLUET() * @method static Bamboo BAMBOO() * @method static BambooSapling BAMBOO_SAPLING() @@ -402,6 +404,7 @@ use function mb_strtolower; * @method static TallGrass FERN() * @method static Fire FIRE() * @method static FletchingTable FLETCHING_TABLE() + * @method static Leaves FLOWERING_AZALEA_LEAVES() * @method static FlowerPot FLOWER_POT() * @method static Froglight FROGLIGHT() * @method static FrostedIce FROSTED_ICE() @@ -485,6 +488,7 @@ use function mb_strtolower; * @method static WoodenDoor MANGROVE_DOOR() * @method static WoodenFence MANGROVE_FENCE() * @method static FenceGate MANGROVE_FENCE_GATE() + * @method static Leaves MANGROVE_LEAVES() * @method static Wood MANGROVE_LOG() * @method static Planks MANGROVE_PLANKS() * @method static WoodenPressurePlate MANGROVE_PRESSURE_PLATE() @@ -1106,7 +1110,10 @@ final class VanillaBlocks{ foreach(TreeType::getAll() as $treeType){ $name = $treeType->getDisplayName(); self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", $saplingTypeInfo, $treeType)); - self::register($treeType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); + } + foreach(LeavesType::getAll() as $leavesType){ + $name = $leavesType->getDisplayName(); + self::register($leavesType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); } $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); diff --git a/src/block/utils/LeavesType.php b/src/block/utils/LeavesType.php new file mode 100644 index 0000000000..c7bc1a0ed3 --- /dev/null +++ b/src/block/utils/LeavesType.php @@ -0,0 +1,74 @@ +Enum___construct($enumName); + } + + public function getDisplayName() : string{ + return $this->displayName; + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 82e84c18c8..04c56e5369 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -605,6 +605,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), }); }); + $this->map(Blocks::AZALEA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::AZALEA_LEAVES))); $this->map(Blocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ return Writer::create(Ids::BAMBOO) @@ -950,6 +951,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::FLOWER_POT) ->writeBool(StateNames::UPDATE_BIT, false); //to keep MCPE happy }); + $this->map(Blocks::FLOWERING_AZALEA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::AZALEA_LEAVES_FLOWERED))); $this->map(Blocks::FROGLIGHT(), function(Froglight $block){ return Writer::create(match($block->getFroglightType()){ FroglightType::OCHRE() => Ids::OCHRE_FROGLIGHT, @@ -1086,6 +1088,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MANGROVE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::MANGROVE_BUTTON))); $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); $this->map(Blocks::MANGROVE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::MANGROVE_FENCE_GATE))); + $this->map(Blocks::MANGROVE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::MANGROVE_LEAVES))); $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); $this->map(Blocks::MANGROVE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::MANGROVE_PRESSURE_PLATE))); $this->map(Blocks::MANGROVE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::MANGROVE_STANDING_SIGN))); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index e7bd14dfdc..6384a3e942 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -37,6 +37,7 @@ use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; use pocketmine\block\GlazedTerracotta; use pocketmine\block\ItemFrame; +use pocketmine\block\Leaves; use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; @@ -178,6 +179,13 @@ final class BlockStateDeserializerHelper{ ->setHasMap($in->readBool(StateNames::ITEM_FRAME_MAP_BIT)); } + /** @throws BlockStateDeserializeException */ + public static function decodeLeaves(Leaves $block, BlockStateReader $in) : Leaves{ + return $block + ->setNoDecay($in->readBool(StateNames::PERSISTENT_BIT)) + ->setCheckDecay($in->readBool(StateNames::UPDATE_BIT)); + } + /** @throws BlockStateDeserializeException */ public static function decodeLiquid(Liquid $block, BlockStateReader $in, bool $still) : Liquid{ $fluidHeightState = $in->readBoundedInt(BlockStateNames::LIQUID_DEPTH, 0, 15); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 312e726fc7..f449cae8f8 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -147,7 +147,7 @@ final class BlockStateSerializerHelper{ ->writeFacingDirection($block->getFacing()); } - private static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeBool(BlockStateNames::PERSISTENT_BIT, $block->isNoDecay()) ->writeBool(BlockStateNames::UPDATE_BIT, $block->isCheckDecay()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index bca2cb390c..7b10b935d1 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -457,6 +457,8 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }) ->setFacing($in->readLegacyHorizontalFacing()); }); + $this->map(Ids::AZALEA_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::AZALEA_LEAVES(), $in)); + $this->map(Ids::AZALEA_LEAVES_FLOWERED, fn(Reader $in) => Helper::decodeLeaves(Blocks::FLOWERING_AZALEA_LEAVES(), $in)); $this->map(Ids::BAMBOO, function(Reader $in) : Block{ return Blocks::BAMBOO() ->setLeafSize(match($value = $in->readString(StateNames::BAMBOO_LEAF_SIZE)){ @@ -787,26 +789,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setHanging($in->readBool(StateNames::HANGING)); }); $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in)); - $this->map(Ids::LEAVES, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::OLD_LEAF_TYPE)){ - StringValues::OLD_LEAF_TYPE_BIRCH => Blocks::BIRCH_LEAVES(), - StringValues::OLD_LEAF_TYPE_JUNGLE => Blocks::JUNGLE_LEAVES(), - StringValues::OLD_LEAF_TYPE_OAK => Blocks::OAK_LEAVES(), - StringValues::OLD_LEAF_TYPE_SPRUCE => Blocks::SPRUCE_LEAVES(), - default => throw $in->badValueException(StateNames::OLD_LEAF_TYPE, $type), - }) - ->setNoDecay($in->readBool(StateNames::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(StateNames::UPDATE_BIT)); - }); - $this->map(Ids::LEAVES2, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::NEW_LEAF_TYPE)){ - StringValues::NEW_LEAF_TYPE_ACACIA => Blocks::ACACIA_LEAVES(), - StringValues::NEW_LEAF_TYPE_DARK_OAK => Blocks::DARK_OAK_LEAVES(), - default => throw $in->badValueException(StateNames::NEW_LEAF_TYPE, $type), - }) - ->setNoDecay($in->readBool(StateNames::PERSISTENT_BIT)) - ->setCheckDecay($in->readBool(StateNames::UPDATE_BIT)); - }); + $this->map(Ids::LEAVES, fn(Reader $in) => Helper::decodeLeaves(match($type = $in->readString(StateNames::OLD_LEAF_TYPE)){ + StringValues::OLD_LEAF_TYPE_BIRCH => Blocks::BIRCH_LEAVES(), + StringValues::OLD_LEAF_TYPE_JUNGLE => Blocks::JUNGLE_LEAVES(), + StringValues::OLD_LEAF_TYPE_OAK => Blocks::OAK_LEAVES(), + StringValues::OLD_LEAF_TYPE_SPRUCE => Blocks::SPRUCE_LEAVES(), + default => throw $in->badValueException(StateNames::OLD_LEAF_TYPE, $type), + }, $in)); + $this->map(Ids::LEAVES2, fn(Reader $in) => Helper::decodeLeaves(match($type = $in->readString(StateNames::NEW_LEAF_TYPE)){ + StringValues::NEW_LEAF_TYPE_ACACIA => Blocks::ACACIA_LEAVES(), + StringValues::NEW_LEAF_TYPE_DARK_OAK => Blocks::DARK_OAK_LEAVES(), + default => throw $in->badValueException(StateNames::NEW_LEAF_TYPE, $type), + }, $in)); $this->map(Ids::LECTERN, function(Reader $in) : Block{ return Blocks::LECTERN() ->setFacing($in->readLegacyHorizontalFacing()) @@ -887,6 +881,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in)); $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB()); $this->map(Ids::MANGROVE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::MANGROVE_FENCE_GATE(), $in)); + $this->map(Ids::MANGROVE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::MANGROVE_LEAVES(), $in)); $this->map(Ids::MANGROVE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_LOG(), false, $in)); $this->map(Ids::MANGROVE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::MANGROVE_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 8a66e3a07b..a7408dd51c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -140,6 +140,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("andesite_wall", fn() => Blocks::ANDESITE_WALL()); $result->registerBlock("anvil", fn() => Blocks::ANVIL()); $result->registerBlock("ateupd_block", fn() => Blocks::INFO_UPDATE2()); + $result->registerBlock("azalea_leaves", fn() => Blocks::AZALEA_LEAVES()); $result->registerBlock("azure_bluet", fn() => Blocks::AZURE_BLUET()); $result->registerBlock("bamboo", fn() => Blocks::BAMBOO()); $result->registerBlock("bamboo_sapling", fn() => Blocks::BAMBOO_SAPLING()); @@ -625,6 +626,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("fletching_table", fn() => Blocks::FLETCHING_TABLE()); $result->registerBlock("flower_pot", fn() => Blocks::FLOWER_POT()); $result->registerBlock("flower_pot_block", fn() => Blocks::FLOWER_POT()); + $result->registerBlock("flowering_azalea_leaves", fn() => Blocks::FLOWERING_AZALEA_LEAVES()); $result->registerBlock("flowing_lava", fn() => Blocks::LAVA()); $result->registerBlock("flowing_water", fn() => Blocks::WATER()); $result->registerBlock("frame", fn() => Blocks::ITEM_FRAME()); @@ -755,6 +757,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mangrove_door", fn() => Blocks::MANGROVE_DOOR()); $result->registerBlock("mangrove_fence", fn() => Blocks::MANGROVE_FENCE()); $result->registerBlock("mangrove_fence_gate", fn() => Blocks::MANGROVE_FENCE_GATE()); + $result->registerBlock("mangrove_leaves", fn() => Blocks::MANGROVE_LEAVES()); $result->registerBlock("mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(false)); $result->registerBlock("mangrove_planks", fn() => Blocks::MANGROVE_PLANKS()); $result->registerBlock("mangrove_pressure_plate", fn() => Blocks::MANGROVE_PRESSURE_PLATE()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index f68366a3a0..951af22a7a 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azalea Leaves":[5471232,5471233,5471234,5471235],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Flowering Azalea Leaves":[5471744,5471745,5471746,5471747],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Leaves":[5470720,5470721,5470722,5470723],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From 0a3ecfdae9bee568722e393e26ee5b97d07394a0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 25 Jan 2023 18:53:11 +0000 Subject: [PATCH 0535/1858] Clean up terminology around block state IDs and their handling --- src/block/Block.php | 4 ++-- src/block/InfestedStone.php | 2 +- ...Factory.php => RuntimeBlockStateRegistry.php} | 9 ++++++--- src/block/tile/FlowerPot.php | 4 ++-- .../convert/BlockObjectToStateSerializer.php | 4 ++-- src/data/bedrock/item/ItemDeserializer.php | 4 ++-- src/entity/EntityFactory.php | 4 ++-- src/entity/object/FallingBlock.php | 4 ++-- src/item/ItemBlock.php | 4 ++-- src/item/ItemBlockWallOrFloor.php | 6 +++--- src/world/Explosion.php | 6 +++--- src/world/SimpleChunkManager.php | 6 +++--- src/world/World.php | 16 ++++++++-------- src/world/format/Chunk.php | 8 ++++---- src/world/format/SubChunk.php | 4 ++-- src/world/generator/Flat.php | 2 +- src/world/generator/hell/Nether.php | 6 +++--- src/world/generator/normal/Normal.php | 6 +++--- src/world/generator/populator/GroundCover.php | 10 +++++----- src/world/light/BlockLightUpdate.php | 4 ++-- src/world/light/LightPopulationTask.php | 4 ++-- src/world/light/LightUpdate.php | 2 +- src/world/light/SkyLightUpdate.php | 6 +++--- tests/phpunit/block/BlockTest.php | 4 ++-- .../block/regenerate_consistency_check.php | 6 +++--- .../convert/BlockSerializerDeserializerTest.php | 4 ++-- .../item/ItemSerializerDeserializerTest.php | 4 ++-- .../mcpe/convert/RuntimeBlockMappingTest.php | 4 ++-- tests/phpunit/world/format/ChunkTest.php | 6 +++--- tests/phpunit/world/format/SubChunkTest.php | 6 +++--- 30 files changed, 81 insertions(+), 78 deletions(-) rename src/block/{BlockFactory.php => RuntimeBlockStateRegistry.php} (93%) diff --git a/src/block/Block.php b/src/block/Block.php index 2e8faf82fc..5bbddb0c0e 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -97,7 +97,7 @@ class Block{ * Returns the full blockstate ID of this block. This is a compact way of representing a blockstate used to store * blocks in chunks at runtime. * - * This ID can be used to later obtain a copy of this block using {@link BlockFactory::fromStateId()}. + * This ID can be used to later obtain a copy of this block using {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeStateData(); @@ -216,7 +216,7 @@ class Block{ */ public function writeStateToWorld() : void{ $world = $this->position->getWorld(); - $world->getOrLoadChunkAtPosition($this->position)->setFullBlock($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId()); + $world->getOrLoadChunkAtPosition($this->position)->setBlockStateId($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId()); $tileType = $this->idInfo->getTileClass(); $oldTile = $world->getTile($this->position); diff --git a/src/block/InfestedStone.php b/src/block/InfestedStone.php index eb10b38ade..deaa013fc7 100644 --- a/src/block/InfestedStone.php +++ b/src/block/InfestedStone.php @@ -35,7 +35,7 @@ final class InfestedStone extends Opaque{ } public function getImitatedBlock() : Block{ - return BlockFactory::getInstance()->fromStateId($this->imitated); + return RuntimeBlockStateRegistry::getInstance()->fromStateId($this->imitated); } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/BlockFactory.php b/src/block/RuntimeBlockStateRegistry.php similarity index 93% rename from src/block/BlockFactory.php rename to src/block/RuntimeBlockStateRegistry.php index 9c17e0c455..5aef7006f5 100644 --- a/src/block/BlockFactory.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -32,10 +32,13 @@ use pocketmine\world\light\LightUpdate; use function min; /** - * Manages deserializing block types from their legacy blockIDs and metadata. - * This is primarily needed for loading chunks from disk. + * Blocks are stored as state IDs in chunks at runtime (it would waste far too much memory to represent every block as + * an object). This class maps block state IDs to their corresponding block objects when reading blocks from chunks at + * runtime. + * + * @internal Plugin devs shouldn't need to interact with this class at all, unless registering a new block type. */ -class BlockFactory{ +class RuntimeBlockStateRegistry{ use SingletonTrait; /** diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 9ef15053ac..d6c2c58fb9 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -25,7 +25,7 @@ namespace pocketmine\block\tile; use pocketmine\block\Air; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\SavedDataLoadingException; @@ -67,7 +67,7 @@ class FlowerPot extends Spawnable{ }catch(BlockStateDeserializeException $e){ throw new SavedDataLoadingException("Error deserializing plant for flower pot: " . $e->getMessage(), 0, $e); } - $this->setPlant(BlockFactory::getInstance()->fromStateId($blockStateId)); + $this->setPlant(RuntimeBlockStateRegistry::getInstance()->fromStateId($blockStateId)); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 04c56e5369..6e7497c0d9 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -32,7 +32,6 @@ use pocketmine\block\Bed; use pocketmine\block\Beetroot; use pocketmine\block\Bell; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; use pocketmine\block\BoneBlock; use pocketmine\block\BrewingStand; use pocketmine\block\BrownMushroomBlock; @@ -107,6 +106,7 @@ use pocketmine\block\RedstoneOre; use pocketmine\block\RedstoneRepeater; use pocketmine\block\RedstoneTorch; use pocketmine\block\RedstoneWire; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\Sapling; use pocketmine\block\SeaPickle; use pocketmine\block\SimplePillar; @@ -197,7 +197,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ public function serialize(int $stateId) : BlockStateData{ //TODO: singleton usage not ideal //TODO: we may want to deduplicate cache entries to avoid wasting memory - return $this->cache[$stateId] ??= $this->serializeBlock(BlockFactory::getInstance()->fromStateId($stateId)); + return $this->cache[$stateId] ??= $this->serializeBlock(RuntimeBlockStateRegistry::getInstance()->fromStateId($stateId)); } /** diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index bde907d4e0..f4f43e3cb8 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; @@ -76,7 +76,7 @@ final class ItemDeserializer{ } //TODO: worth caching this or not? - return BlockFactory::getInstance()->fromStateId($block)->asItem(); + return RuntimeBlockStateRegistry::getInstance()->fromStateId($block)->asItem(); } $id = $data->getName(); if(!isset($this->deserializers[$id])){ diff --git a/src/entity/EntityFactory.php b/src/entity/EntityFactory.php index 0a6839cc1a..d8d189cffc 100644 --- a/src/entity/EntityFactory.php +++ b/src/entity/EntityFactory.php @@ -26,7 +26,7 @@ namespace pocketmine\entity; use DaveRandom\CallbackValidator\CallbackType; use DaveRandom\CallbackValidator\ParameterType; use DaveRandom\CallbackValidator\ReturnType; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\data\bedrock\LegacyEntityIdToStringIdMap; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\data\bedrock\PotionTypeIds; @@ -112,7 +112,7 @@ final class EntityFactory{ }, ['XPOrb', 'minecraft:xp_orb']); $this->register(FallingBlock::class, function(World $world, CompoundTag $nbt) : FallingBlock{ - return new FallingBlock(Helper::parseLocation($nbt, $world), FallingBlock::parseBlockNBT(BlockFactory::getInstance(), $nbt), $nbt); + return new FallingBlock(Helper::parseLocation($nbt, $world), FallingBlock::parseBlockNBT(RuntimeBlockStateRegistry::getInstance(), $nbt), $nbt); }, ['FallingSand', 'minecraft:falling_block']); $this->register(ItemEntity::class, function(World $world, CompoundTag $nbt) : ItemEntity{ diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 15b7aeac94..301d38b645 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\entity\object; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\utils\Fallable; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; @@ -66,7 +66,7 @@ class FallingBlock extends Entity{ protected function getInitialGravity() : float{ return 0.04; } - public static function parseBlockNBT(BlockFactory $factory, CompoundTag $nbt) : Block{ + public static function parseBlockNBT(RuntimeBlockStateRegistry $factory, CompoundTag $nbt) : Block{ //TODO: 1.8+ save format $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index eb476de88a..1a005286d7 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\VanillaBlocks; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; @@ -59,7 +59,7 @@ final class ItemBlock extends Item{ public function getBlock(?int $clickedFace = null) : Block{ //TODO: HACKY MESS, CLEAN IT UP - $factory = BlockFactory::getInstance(); + $factory = RuntimeBlockStateRegistry::getInstance(); if(!$factory->isRegistered($this->blockTypeId)){ return VanillaBlocks::AIR(); } diff --git a/src/item/ItemBlockWallOrFloor.php b/src/item/ItemBlockWallOrFloor.php index bd1213b349..c20c73a1d0 100644 --- a/src/item/ItemBlockWallOrFloor.php +++ b/src/item/ItemBlockWallOrFloor.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -40,9 +40,9 @@ class ItemBlockWallOrFloor extends Item{ public function getBlock(?int $clickedFace = null) : Block{ if($clickedFace !== null && Facing::axis($clickedFace) !== Axis::Y){ - return BlockFactory::getInstance()->fromStateId($this->wallVariant); + return RuntimeBlockStateRegistry::getInstance()->fromStateId($this->wallVariant); } - return BlockFactory::getInstance()->fromStateId($this->floorVariant); + return RuntimeBlockStateRegistry::getInstance()->fromStateId($this->floorVariant); } public function getFuelTime() : int{ diff --git a/src/world/Explosion.php b/src/world/Explosion.php index 6bd72fb6f3..acc806f999 100644 --- a/src/world/Explosion.php +++ b/src/world/Explosion.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\TNT; use pocketmine\block\VanillaBlocks; use pocketmine\entity\Entity; @@ -81,7 +81,7 @@ class Explosion{ return false; } - $blockFactory = BlockFactory::getInstance(); + $blockFactory = RuntimeBlockStateRegistry::getInstance(); $mRays = $this->rays - 1; for($i = 0; $i < $this->rays; ++$i){ @@ -112,7 +112,7 @@ class Explosion{ continue; } - $state = $this->subChunkExplorer->currentSubChunk->getFullBlock($vBlockX & SubChunk::COORD_MASK, $vBlockY & SubChunk::COORD_MASK, $vBlockZ & SubChunk::COORD_MASK); + $state = $this->subChunkExplorer->currentSubChunk->getBlockStateId($vBlockX & SubChunk::COORD_MASK, $vBlockY & SubChunk::COORD_MASK, $vBlockZ & SubChunk::COORD_MASK); $blastResistance = $blockFactory->blastResistance[$state] ?? 0; if($blastResistance >= 0){ diff --git a/src/world/SimpleChunkManager.php b/src/world/SimpleChunkManager.php index 85849c450f..221adbe899 100644 --- a/src/world/SimpleChunkManager.php +++ b/src/world/SimpleChunkManager.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\VanillaBlocks; use pocketmine\utils\Limits; use pocketmine\world\format\Chunk; @@ -41,14 +41,14 @@ class SimpleChunkManager implements ChunkManager{ public function getBlockAt(int $x, int $y, int $z) : Block{ if($this->isInWorld($x, $y, $z) && ($chunk = $this->getChunk($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE)) !== null){ - return BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); + return RuntimeBlockStateRegistry::getInstance()->fromStateId($chunk->getBlockStateId($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); } return VanillaBlocks::AIR(); } 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->getStateId()); + $chunk->setBlockStateId($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 e6f2406145..15ea9f7874 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -28,8 +28,8 @@ namespace pocketmine\world; use pocketmine\block\Air; use pocketmine\block\Block; -use pocketmine\block\BlockFactory; use pocketmine\block\BlockTypeIds; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; use pocketmine\block\tile\TileFactory; @@ -533,7 +533,7 @@ class World implements ChunkManager{ if($blockStateData === null){ continue; } - $block = BlockFactory::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); + $block = RuntimeBlockStateRegistry::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); }else{ //TODO: we probably ought to log an error here continue; @@ -544,7 +544,7 @@ class World implements ChunkManager{ } } - foreach(BlockFactory::getInstance()->getAllKnownStates() as $state){ + foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $state){ $dontTickName = $dontTickBlocks[$state->getTypeId()] ?? null; if($dontTickName === null && $state->ticksRandomly()){ $this->randomTickBlocks[$state->getStateId()] = true; @@ -1295,7 +1295,7 @@ class World implements ChunkManager{ $entity->onRandomUpdate(); } - $blockFactory = BlockFactory::getInstance(); + $blockFactory = RuntimeBlockStateRegistry::getInstance(); foreach($chunk->getSubChunks() as $Y => $subChunk){ if(!$subChunk->isEmptyFast()){ $k = 0; @@ -1309,7 +1309,7 @@ class World implements ChunkManager{ $z = ($k >> (SubChunk::COORD_BIT_SIZE * 2)) & SubChunk::COORD_MASK; $k >>= (SubChunk::COORD_BIT_SIZE * 3); - $state = $subChunk->getFullBlock($x, $y, $z); + $state = $subChunk->getBlockStateId($x, $y, $z); if(isset($this->randomTickBlocks[$state])){ $block = $blockFactory->fromStateId($state); @@ -1609,7 +1609,7 @@ class World implements ChunkManager{ return; } - $blockFactory = BlockFactory::getInstance(); + $blockFactory = RuntimeBlockStateRegistry::getInstance(); $this->timings->doBlockSkyLightUpdates->startTiming(); if($this->skyLightUpdate === null){ $this->skyLightUpdate = new SkyLightUpdate(new SubChunkExplorer($this), $blockFactory->lightFilter, $blockFactory->blocksDirectSkyLight); @@ -1732,7 +1732,7 @@ class World implements ChunkManager{ $chunk = $this->chunks[$chunkHash] ?? null; if($chunk !== null){ - $block = BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); + $block = RuntimeBlockStateRegistry::getInstance()->fromStateId($chunk->getBlockStateId($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK)); }else{ $addToCache = false; $block = VanillaBlocks::AIR(); @@ -2371,7 +2371,7 @@ class World implements ChunkManager{ $localY = $tilePosition->getFloorY(); $localZ = $tilePosition->getFloorZ() & Chunk::COORD_MASK; - $newBlock = BlockFactory::getInstance()->fromStateId($chunk->getFullBlock($localX, $localY, $localZ)); + $newBlock = RuntimeBlockStateRegistry::getInstance()->fromStateId($chunk->getBlockStateId($localX, $localY, $localZ)); $expectedTileClass = $newBlock->getIdInfo()->getTileClass(); if( $expectedTileClass === null || //new block doesn't expect a tile diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 7c55b6292e..fd0b83a7b5 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -93,15 +93,15 @@ class Chunk{ * * @return int bitmap, (id << 4) | meta */ - public function getFullBlock(int $x, int $y, int $z) : int{ - return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getFullBlock($x, $y & SubChunk::COORD_MASK, $z); + public function getBlockStateId(int $x, int $y, int $z) : int{ + return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBlockStateId($x, $y & SubChunk::COORD_MASK, $z); } /** * Sets the blockstate at the given coordinate by internal ID. */ - public function setFullBlock(int $x, int $y, int $z, int $block) : void{ - $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->setFullBlock($x, $y & SubChunk::COORD_MASK, $z, $block); + public function setBlockStateId(int $x, int $y, int $z, int $block) : void{ + $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->setBlockStateId($x, $y & SubChunk::COORD_MASK, $z, $block); $this->terrainDirtyFlags |= self::DIRTY_FLAG_BLOCKS; } diff --git a/src/world/format/SubChunk.php b/src/world/format/SubChunk.php index 5dc2215140..3f7e943e31 100644 --- a/src/world/format/SubChunk.php +++ b/src/world/format/SubChunk.php @@ -69,14 +69,14 @@ class SubChunk{ */ public function getEmptyBlockId() : int{ return $this->emptyBlockId; } - public function getFullBlock(int $x, int $y, int $z) : int{ + public function getBlockStateId(int $x, int $y, int $z) : int{ if(count($this->blockLayers) === 0){ return $this->emptyBlockId; } return $this->blockLayers[0]->get($x, $y, $z); } - public function setFullBlock(int $x, int $y, int $z, int $block) : void{ + public function setBlockStateId(int $x, int $y, int $z, int $block) : void{ if(count($this->blockLayers) === 0){ $this->blockLayers[] = new PalettedBlockArray($this->emptyBlockId); } diff --git a/src/world/generator/Flat.php b/src/world/generator/Flat.php index 9536cde03f..01efaff07c 100644 --- a/src/world/generator/Flat.php +++ b/src/world/generator/Flat.php @@ -77,7 +77,7 @@ class Flat extends Generator{ for($Z = 0; $Z < SubChunk::EDGE_LENGTH; ++$Z){ for($X = 0; $X < SubChunk::EDGE_LENGTH; ++$X){ - $subchunk->setFullBlock($X, $y, $Z, $id); + $subchunk->setBlockStateId($X, $y, $Z, $id); } } } diff --git a/src/world/generator/hell/Nether.php b/src/world/generator/hell/Nether.php index e00b22015a..665d9452e4 100644 --- a/src/world/generator/hell/Nether.php +++ b/src/world/generator/hell/Nether.php @@ -85,16 +85,16 @@ class Nether extends Generator{ for($y = 0; $y < 128; ++$y){ if($y === 0 || $y === 127){ - $chunk->setFullBlock($x, $y, $z, $bedrock); + $chunk->setBlockStateId($x, $y, $z, $bedrock); continue; } $noiseValue = (abs($this->emptyHeight - $y) / $this->emptyHeight) * $this->emptyAmplitude - $noise[$x][$z][$y]; $noiseValue -= 1 - $this->density; if($noiseValue > 0){ - $chunk->setFullBlock($x, $y, $z, $netherrack); + $chunk->setBlockStateId($x, $y, $z, $netherrack); }elseif($y <= $this->waterHeight){ - $chunk->setFullBlock($x, $y, $z, $stillLava); + $chunk->setBlockStateId($x, $y, $z, $stillLava); } } } diff --git a/src/world/generator/normal/Normal.php b/src/world/generator/normal/Normal.php index 107d147e92..a750fc8946 100644 --- a/src/world/generator/normal/Normal.php +++ b/src/world/generator/normal/Normal.php @@ -194,15 +194,15 @@ class Normal extends Generator{ for($y = 0; $y < 128; ++$y){ if($y === 0){ - $chunk->setFullBlock($x, $y, $z, $bedrock); + $chunk->setBlockStateId($x, $y, $z, $bedrock); continue; } $noiseValue = $noise[$x][$z][$y] - 1 / $smoothHeight * ($y - $smoothHeight - $minSum); if($noiseValue > 0){ - $chunk->setFullBlock($x, $y, $z, $stone); + $chunk->setBlockStateId($x, $y, $z, $stone); }elseif($y <= $this->waterHeight){ - $chunk->setFullBlock($x, $y, $z, $stillWater); + $chunk->setBlockStateId($x, $y, $z, $stillWater); } } } diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 16a1d95a0a..1ce0c9fcaa 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\world\generator\populator; -use pocketmine\block\BlockFactory; use pocketmine\block\BlockTypeIds; use pocketmine\block\Liquid; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\utils\Random; use pocketmine\world\biome\BiomeRegistry; use pocketmine\world\ChunkManager; @@ -37,7 +37,7 @@ class GroundCover implements Populator{ public function populate(ChunkManager $world, int $chunkX, int $chunkZ, Random $random) : void{ $chunk = $world->getChunk($chunkX, $chunkZ); - $factory = BlockFactory::getInstance(); + $factory = RuntimeBlockStateRegistry::getInstance(); $biomeRegistry = BiomeRegistry::getInstance(); for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < Chunk::EDGE_LENGTH; ++$z){ @@ -51,7 +51,7 @@ class GroundCover implements Populator{ $startY = 127; for(; $startY > 0; --$startY){ - if(!$factory->fromStateId($chunk->getFullBlock($x, $startY, $z))->isTransparent()){ + if(!$factory->fromStateId($chunk->getBlockStateId($x, $startY, $z))->isTransparent()){ break; } } @@ -59,7 +59,7 @@ class GroundCover implements Populator{ $endY = $startY - count($cover); for($y = $startY; $y > $endY && $y >= 0; --$y){ $b = $cover[$startY - $y]; - $id = $factory->fromStateId($chunk->getFullBlock($x, $y, $z)); + $id = $factory->fromStateId($chunk->getBlockStateId($x, $y, $z)); if($id->getTypeId() === BlockTypeIds::AIR && $b->isSolid()){ break; } @@ -67,7 +67,7 @@ class GroundCover implements Populator{ continue; } - $chunk->setFullBlock($x, $y, $z, $b->getStateId()); + $chunk->setBlockStateId($x, $y, $z, $b->getStateId()); } } } diff --git a/src/world/light/BlockLightUpdate.php b/src/world/light/BlockLightUpdate.php index cc8964fbe2..b7e0aa9e30 100644 --- a/src/world/light/BlockLightUpdate.php +++ b/src/world/light/BlockLightUpdate.php @@ -50,7 +50,7 @@ class BlockLightUpdate extends LightUpdate{ public function recalculateNode(int $x, int $y, int $z) : void{ if($this->subChunkExplorer->moveTo($x, $y, $z) !== SubChunkExplorerStatus::INVALID){ - $block = $this->subChunkExplorer->currentSubChunk->getFullBlock($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); + $block = $this->subChunkExplorer->currentSubChunk->getBlockStateId($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); $this->setAndUpdateLight($x, $y, $z, max($this->lightEmitters[$block] ?? 0, $this->getHighestAdjacentLight($x, $y, $z) - ($this->lightFilters[$block] ?? self::BASE_LIGHT_FILTER))); } } @@ -83,7 +83,7 @@ class BlockLightUpdate extends LightUpdate{ for($x = 0; $x < SubChunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < SubChunk::EDGE_LENGTH; ++$z){ for($y = 0; $y < SubChunk::EDGE_LENGTH; ++$y){ - $light = $this->lightEmitters[$subChunk->getFullBlock($x, $y, $z)] ?? 0; + $light = $this->lightEmitters[$subChunk->getBlockStateId($x, $y, $z)] ?? 0; if($light > 0){ $this->setAndUpdateLight( $baseX + $x, diff --git a/src/world/light/LightPopulationTask.php b/src/world/light/LightPopulationTask.php index 2acccbf8f4..5aa0ead65a 100644 --- a/src/world/light/LightPopulationTask.php +++ b/src/world/light/LightPopulationTask.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\light; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\scheduler\AsyncTask; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; @@ -57,7 +57,7 @@ class LightPopulationTask extends AsyncTask{ $manager = new SimpleChunkManager(World::Y_MIN, World::Y_MAX); $manager->setChunk(0, 0, $chunk); - $blockFactory = BlockFactory::getInstance(); + $blockFactory = RuntimeBlockStateRegistry::getInstance(); foreach([ "Block" => new BlockLightUpdate(new SubChunkExplorer($manager), $blockFactory->lightFilter, $blockFactory->light), "Sky" => new SkyLightUpdate(new SubChunkExplorer($manager), $blockFactory->lightFilter, $blockFactory->blocksDirectSkyLight), diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index 83c99e5a4b..d40e68e05c 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -191,7 +191,7 @@ abstract class LightUpdate{ $ly = $y & SubChunk::COORD_MASK; $lz = $z & SubChunk::COORD_MASK; $current = $lightArray->get($lx, $ly, $lz); - $potentialLight = $newAdjacentLevel - ($this->lightFilters[$this->subChunkExplorer->currentSubChunk->getFullBlock($lx, $ly, $lz)] ?? self::BASE_LIGHT_FILTER); + $potentialLight = $newAdjacentLevel - ($this->lightFilters[$this->subChunkExplorer->currentSubChunk->getBlockStateId($lx, $ly, $lz)] ?? self::BASE_LIGHT_FILTER); if($current < $potentialLight){ $lightArray->set($lx, $ly, $lz, $potentialLight); diff --git a/src/world/light/SkyLightUpdate.php b/src/world/light/SkyLightUpdate.php index d77f1de5b8..5015634829 100644 --- a/src/world/light/SkyLightUpdate.php +++ b/src/world/light/SkyLightUpdate.php @@ -66,7 +66,7 @@ class SkyLightUpdate extends LightUpdate{ $chunk = $this->subChunkExplorer->currentChunk; $oldHeightMap = $chunk->getHeightMap($x & Chunk::COORD_MASK, $z & Chunk::COORD_MASK); - $source = $this->subChunkExplorer->currentSubChunk->getFullBlock($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); + $source = $this->subChunkExplorer->currentSubChunk->getBlockStateId($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); $yPlusOne = $y + 1; @@ -194,7 +194,7 @@ class SkyLightUpdate extends LightUpdate{ $result->set($x, $z, World::Y_MIN); }else{ for(; $y >= World::Y_MIN; --$y){ - if(isset($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)])){ + if(isset($directSkyLightBlockers[$chunk->getBlockStateId($x, $y, $z)])){ $result->set($x, $z, $y + 1); break; } @@ -221,7 +221,7 @@ class SkyLightUpdate extends LightUpdate{ return World::Y_MIN; } for(; $y >= World::Y_MIN; --$y){ - if(isset($directSkyLightBlockers[$chunk->getFullBlock($x, $y, $z)])){ + if(isset($directSkyLightBlockers[$chunk->getBlockStateId($x, $y, $z)])){ break; } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 7404b15e3e..3f6dbac952 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -33,11 +33,11 @@ use const SORT_STRING; class BlockTest extends TestCase{ - /** @var BlockFactory */ + /** @var RuntimeBlockStateRegistry */ private $blockFactory; public function setUp() : void{ - $this->blockFactory = new BlockFactory(); + $this->blockFactory = new RuntimeBlockStateRegistry(); } /** diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index 0db6d33826..9930c54f0c 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -22,17 +22,17 @@ declare(strict_types=1); use pocketmine\block\Block; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\utils\AssumptionFailedError; require dirname(__DIR__, 3) . '/vendor/autoload.php'; /* This script needs to be re-run after any intentional blockfactory change (adding or removing a block state). */ -$factory = new \pocketmine\block\BlockFactory(); +$factory = new \pocketmine\block\RuntimeBlockStateRegistry(); $remaps = []; $new = []; -foreach(BlockFactory::getInstance()->getAllKnownStates() as $index => $block){ +foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $index => $block){ if($index !== $block->getStateId()){ throw new AssumptionFailedError("State index should always match state ID"); } diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index f69b4d0108..71d4135ea3 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -26,8 +26,8 @@ namespace pocketmine\data\bedrock\block\convert; use PHPUnit\Framework\TestCase; use pocketmine\block\BaseBanner; use pocketmine\block\Bed; -use pocketmine\block\BlockFactory; use pocketmine\block\BlockTypeIds; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\Skull; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateSerializeException; @@ -43,7 +43,7 @@ final class BlockSerializerDeserializerTest extends TestCase{ } public function testAllKnownBlockStatesSerializableAndDeserializable() : void{ - foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){ + foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $block){ try{ $blockStateData = $this->serializer->serializeBlock($block); }catch(BlockStateSerializeException $e){ diff --git a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php index a7617735c2..b3945d0f6b 100644 --- a/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/item/ItemSerializerDeserializerTest.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; use PHPUnit\Framework\TestCase; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\item\VanillaItems; use pocketmine\world\format\io\GlobalBlockStateHandlers; @@ -60,7 +60,7 @@ final class ItemSerializerDeserializerTest extends TestCase{ } public function testAllVanillaBlocksSerializableAndDeserializable() : void{ - foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){ + foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $block){ $item = $block->asItem(); if($item->isNull()){ continue; diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php index 5817355031..9e7287da25 100644 --- a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php +++ b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use PHPUnit\Framework\TestCase; -use pocketmine\block\BlockFactory; +use pocketmine\block\RuntimeBlockStateRegistry; class RuntimeBlockMappingTest extends TestCase{ @@ -32,7 +32,7 @@ class RuntimeBlockMappingTest extends TestCase{ * @doesNotPerformAssertions */ public function testAllBlockStatesSerialize() : void{ - foreach(BlockFactory::getInstance()->getAllKnownStates() as $state){ + foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $state){ RuntimeBlockMapping::getInstance()->toRuntimeId($state->getStateId()); } } diff --git a/tests/phpunit/world/format/ChunkTest.php b/tests/phpunit/world/format/ChunkTest.php index a8cca71b2d..d612ce9d29 100644 --- a/tests/phpunit/world/format/ChunkTest.php +++ b/tests/phpunit/world/format/ChunkTest.php @@ -29,16 +29,16 @@ class ChunkTest extends TestCase{ public function testClone() : void{ $chunk = new Chunk([], false); - $chunk->setFullBlock(0, 0, 0, 1); + $chunk->setBlockStateId(0, 0, 0, 1); $chunk->setBiomeId(0, 0, 0, 1); $chunk->setHeightMap(0, 0, 1); $chunk2 = clone $chunk; - $chunk2->setFullBlock(0, 0, 0, 2); + $chunk2->setBlockStateId(0, 0, 0, 2); $chunk2->setBiomeId(0, 0, 0, 2); $chunk2->setHeightMap(0, 0, 2); - self::assertNotSame($chunk->getFullBlock(0, 0, 0), $chunk2->getFullBlock(0, 0, 0)); + self::assertNotSame($chunk->getBlockStateId(0, 0, 0), $chunk2->getBlockStateId(0, 0, 0)); self::assertNotSame($chunk->getBiomeId(0, 0, 0), $chunk2->getBiomeId(0, 0, 0)); self::assertNotSame($chunk->getHeightMap(0, 0), $chunk2->getHeightMap(0, 0)); } diff --git a/tests/phpunit/world/format/SubChunkTest.php b/tests/phpunit/world/format/SubChunkTest.php index 3b78610510..cdb440147f 100644 --- a/tests/phpunit/world/format/SubChunkTest.php +++ b/tests/phpunit/world/format/SubChunkTest.php @@ -34,17 +34,17 @@ class SubChunkTest extends TestCase{ public function testClone() : void{ $sub1 = new SubChunk(0, [], new PalettedBlockArray(BiomeIds::OCEAN)); - $sub1->setFullBlock(0, 0, 0, 1); + $sub1->setBlockStateId(0, 0, 0, 1); $sub1->getBlockLightArray()->set(0, 0, 0, 1); $sub1->getBlockSkyLightArray()->set(0, 0, 0, 1); $sub2 = clone $sub1; - $sub2->setFullBlock(0, 0, 0, 2); + $sub2->setBlockStateId(0, 0, 0, 2); $sub2->getBlockLightArray()->set(0, 0, 0, 2); $sub2->getBlockSkyLightArray()->set(0, 0, 0, 2); - self::assertNotSame($sub1->getFullBlock(0, 0, 0), $sub2->getFullBlock(0, 0, 0)); + self::assertNotSame($sub1->getBlockStateId(0, 0, 0), $sub2->getBlockStateId(0, 0, 0)); self::assertNotSame($sub1->getBlockLightArray()->get(0, 0, 0), $sub2->getBlockLightArray()->get(0, 0, 0)); self::assertNotSame($sub1->getBlockSkyLightArray()->get(0, 0, 0), $sub2->getBlockSkyLightArray()->get(0, 0, 0)); } From 2cd8e4d2708e5391796f51fab9379a4da04ee35c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 25 Jan 2023 19:02:42 +0000 Subject: [PATCH 0536/1858] ... --- src/block/Leaves.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 9dc38e091c..d4f22c8ac9 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SupportType; -use pocketmine\block\utils\TreeType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\event\block\LeavesDecayEvent; From b58d7fc82a8aecc45919f6cd15da256c1fe148f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 13:00:07 +0000 Subject: [PATCH 0537/1858] Bump build/php from `af250d7` to `83bec42` (#5534) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `af250d7` to `83bec42`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/af250d7e065ca4a1b8004d9e245a0f444846dde0...83bec42c3cdb7a9acf120596f555cb0748f429b4) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index af250d7e06..83bec42c3c 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit af250d7e065ca4a1b8004d9e245a0f444846dde0 +Subproject commit 83bec42c3cdb7a9acf120596f555cb0748f429b4 From f56339c30649f426e7e2d49256b3319f39a2bc0f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Jan 2023 14:48:43 +0000 Subject: [PATCH 0538/1858] Fix build --- src/block/Block.php | 7 ++- src/world/Explosion.php | 7 ++- src/world/generator/hell/Nether.php | 4 +- src/world/generator/normal/Normal.php | 3 +- src/world/generator/populator/GroundCover.php | 2 +- tests/phpstan/configs/actual-problems.neon | 53 ++----------------- 6 files changed, 22 insertions(+), 54 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 5bbddb0c0e..1481284a80 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -42,6 +42,7 @@ use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\player\Player; +use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\format\Chunk; use pocketmine\world\Position; @@ -216,7 +217,11 @@ class Block{ */ public function writeStateToWorld() : void{ $world = $this->position->getWorld(); - $world->getOrLoadChunkAtPosition($this->position)->setBlockStateId($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId()); + $chunk = $world->getOrLoadChunkAtPosition($this->position); + if($chunk === null){ + throw new AssumptionFailedError("World::setBlock() should have loaded the chunk before calling this method"); + } + $chunk->setBlockStateId($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId()); $tileType = $this->idInfo->getTileClass(); $oldTile = $world->getTile($this->position); diff --git a/src/world/Explosion.php b/src/world/Explosion.php index acc806f999..601f9109e2 100644 --- a/src/world/Explosion.php +++ b/src/world/Explosion.php @@ -35,6 +35,7 @@ use pocketmine\event\entity\EntityExplodeEvent; use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; +use pocketmine\utils\AssumptionFailedError; use pocketmine\world\format\SubChunk; use pocketmine\world\particle\HugeExplodeSeedParticle; use pocketmine\world\sound\ExplodeSound; @@ -111,8 +112,12 @@ class Explosion{ if($this->subChunkExplorer->moveTo($vBlockX, $vBlockY, $vBlockZ) === SubChunkExplorerStatus::INVALID){ continue; } + $subChunk = $this->subChunkExplorer->currentSubChunk; + if($subChunk === null){ + throw new AssumptionFailedError("SubChunkExplorer subchunk should not be null here"); + } - $state = $this->subChunkExplorer->currentSubChunk->getBlockStateId($vBlockX & SubChunk::COORD_MASK, $vBlockY & SubChunk::COORD_MASK, $vBlockZ & SubChunk::COORD_MASK); + $state = $subChunk->getBlockStateId($vBlockX & SubChunk::COORD_MASK, $vBlockY & SubChunk::COORD_MASK, $vBlockZ & SubChunk::COORD_MASK); $blastResistance = $blockFactory->blastResistance[$state] ?? 0; if($blastResistance >= 0){ diff --git a/src/world/generator/hell/Nether.php b/src/world/generator/hell/Nether.php index 665d9452e4..f58360820c 100644 --- a/src/world/generator/hell/Nether.php +++ b/src/world/generator/hell/Nether.php @@ -25,6 +25,7 @@ namespace pocketmine\world\generator\hell; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\BiomeIds; +use pocketmine\utils\AssumptionFailedError; use pocketmine\world\biome\BiomeRegistry; use pocketmine\world\ChunkManager; use pocketmine\world\format\Chunk; @@ -71,7 +72,8 @@ class Nether extends Generator{ $noise = $this->noiseBase->getFastNoise3D(Chunk::EDGE_LENGTH, 128, Chunk::EDGE_LENGTH, 4, 8, 4, $chunkX * Chunk::EDGE_LENGTH, 0, $chunkZ * Chunk::EDGE_LENGTH); - $chunk = $world->getChunk($chunkX, $chunkZ); + //TODO: why don't we just create and set the chunk here directly? + $chunk = $world->getChunk($chunkX, $chunkZ) ?? throw new \InvalidArgumentException("Chunk $chunkX $chunkZ does not yet exist"); $bedrock = VanillaBlocks::BEDROCK()->getStateId(); $netherrack = VanillaBlocks::NETHERRACK()->getStateId(); diff --git a/src/world/generator/normal/Normal.php b/src/world/generator/normal/Normal.php index a750fc8946..1d4805e165 100644 --- a/src/world/generator/normal/Normal.php +++ b/src/world/generator/normal/Normal.php @@ -141,7 +141,8 @@ class Normal extends Generator{ $noise = $this->noiseBase->getFastNoise3D(Chunk::EDGE_LENGTH, 128, Chunk::EDGE_LENGTH, 4, 8, 4, $chunkX * Chunk::EDGE_LENGTH, 0, $chunkZ * Chunk::EDGE_LENGTH); - $chunk = $world->getChunk($chunkX, $chunkZ); + //TODO: why don't we just create and set the chunk here directly? + $chunk = $world->getChunk($chunkX, $chunkZ) ?? throw new \InvalidArgumentException("Chunk $chunkX $chunkZ does not yet exist"); $biomeCache = []; diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 1ce0c9fcaa..6af3e657ca 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -36,7 +36,7 @@ use function min; class GroundCover implements Populator{ public function populate(ChunkManager $world, int $chunkX, int $chunkZ, Random $random) : void{ - $chunk = $world->getChunk($chunkX, $chunkZ); + $chunk = $world->getChunk($chunkX, $chunkZ) ?? throw new \InvalidArgumentException("Chunk $chunkX $chunkZ does not yet exist"); $factory = RuntimeBlockStateRegistry::getInstance(); $biomeRegistry = BiomeRegistry::getInstance(); for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 6698add08c..5f01c2d189 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -61,7 +61,7 @@ parameters: path: ../../../src/VersionInfo.php - - message: "#^Cannot call method setFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" + message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\format\\\\Chunk\\:\\:setBlockStateId\\(\\) expects int, float\\|int given\\.$#" count: 1 path: ../../../src/block/Block.php @@ -910,11 +910,6 @@ parameters: count: 1 path: ../../../src/utils/Utils.php - - - message: "#^Cannot call method getFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" - count: 1 - path: ../../../src/world/Explosion.php - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -1150,31 +1145,11 @@ parameters: count: 1 path: ../../../src/world/generator/hell/Nether.php - - - message: "#^Cannot call method setBiomeId\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 1 - path: ../../../src/world/generator/hell/Nether.php - - - - message: "#^Cannot call method setFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 3 - path: ../../../src/world/generator/hell/Nether.php - - message: "#^Cannot call method getBiomeId\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" count: 1 path: ../../../src/world/generator/normal/Normal.php - - - message: "#^Cannot call method setBiomeId\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 1 - path: ../../../src/world/generator/normal/Normal.php - - - - message: "#^Cannot call method setFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 3 - path: ../../../src/world/generator/normal/Normal.php - - message: "#^Parameter \\#1 \\$start of method pocketmine\\\\utils\\\\Random\\:\\:nextRange\\(\\) expects int, float\\|int given\\.$#" count: 2 @@ -1195,28 +1170,13 @@ parameters: count: 1 path: ../../../src/world/generator/object/TallGrass.php - - - message: "#^Cannot call method getBiomeId\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 1 - path: ../../../src/world/generator/populator/GroundCover.php - - - - message: "#^Cannot call method getFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 2 - path: ../../../src/world/generator/populator/GroundCover.php - - - - message: "#^Cannot call method setFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 1 - path: ../../../src/world/generator/populator/GroundCover.php - - message: "#^Cannot call method getBlockLightArray\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 path: ../../../src/world/light/BlockLightUpdate.php - - message: "#^Cannot call method getFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" + message: "#^Cannot call method getBlockStateId\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 path: ../../../src/world/light/BlockLightUpdate.php @@ -1241,7 +1201,7 @@ parameters: path: ../../../src/world/light/LightPopulationTask.php - - message: "#^Cannot call method getFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" + message: "#^Cannot call method getBlockStateId\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 path: ../../../src/world/light/LightUpdate.php @@ -1251,7 +1211,7 @@ parameters: path: ../../../src/world/light/SkyLightUpdate.php - - message: "#^Cannot call method getFullBlock\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" + message: "#^Cannot call method getBlockStateId\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 path: ../../../src/world/light/SkyLightUpdate.php @@ -1280,11 +1240,6 @@ parameters: count: 1 path: ../../../src/world/light/SkyLightUpdate.php - - - message: "#^Only numeric types are allowed in \\+, int\\|false given on the left side\\.$#" - count: 1 - path: ../../../src/world/light/SkyLightUpdate.php - - message: "#^Parameter \\#1 \\$chunk of static method pocketmine\\\\world\\\\light\\\\SkyLightUpdate\\:\\:recalculateHeightMap\\(\\) expects pocketmine\\\\world\\\\format\\\\Chunk, pocketmine\\\\world\\\\format\\\\Chunk\\|null given\\.$#" count: 1 From 0975da57d661090a9f2afeb4e8c1cdffd0c1baed Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Jan 2023 14:51:18 +0000 Subject: [PATCH 0539/1858] Removed obsolete pthreads-related ignoreErrors --- tests/phpstan/configs/actual-problems.neon | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 5f01c2d189..0ab691189f 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -730,11 +730,6 @@ parameters: count: 1 path: ../../../src/network/mcpe/encryption/PrepareEncryptionTask.php - - - message: "#^Method pocketmine\\\\network\\\\mcpe\\\\raklib\\\\PthreadsChannelReader\\:\\:read\\(\\) should return string\\|null but returns mixed\\.$#" - count: 1 - path: ../../../src/network/mcpe/raklib/PthreadsChannelReader.php - - message: "#^Method pocketmine\\\\permission\\\\DefaultPermissions\\:\\:registerPermission\\(\\) should return pocketmine\\\\permission\\\\Permission but returns pocketmine\\\\permission\\\\Permission\\|null\\.$#" count: 1 @@ -835,21 +830,6 @@ parameters: count: 1 path: ../../../src/scheduler/AsyncTask.php - - - message: "#^PHPDoc type pocketmine\\\\scheduler\\\\AsyncWorker\\|null of property pocketmine\\\\scheduler\\\\AsyncTask\\:\\:\\$worker is not the same as PHPDoc type Worker of overridden property Threaded\\:\\:\\$worker\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncTask.php - - - - message: "#^Parameter \\#1 \\$str of function igbinary_unserialize expects string, mixed given\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncTask.php - - - - message: "#^Property pocketmine\\\\scheduler\\\\AsyncTask\\:\\:\\$result \\(bool\\|float\\|int\\|string\\|null\\) does not accept mixed\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncTask.php - - message: "#^Property pocketmine\\\\scheduler\\\\BulkCurlTask\\:\\:\\$operations \\(string\\) does not accept string\\|null\\.$#" count: 1 From 7eca3e808120465a9dcd7390d0c936b91dcfde20 Mon Sep 17 00:00:00 2001 From: zSALLAZAR Date: Wed, 25 Jan 2023 22:53:27 +0100 Subject: [PATCH 0540/1858] Fix typo closes #5533 --- src/MemoryManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 0162f0be0e..06ed0656d9 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -71,7 +71,7 @@ use const SORT_NUMERIC; class MemoryManager{ private const DEFAULT_CHECK_RATE = Server::TARGET_TICKS_PER_SECOND; private const DEFAULT_CONTINUOUS_TRIGGER_RATE = Server::TARGET_TICKS_PER_SECOND * 2; - private const DEEFAULT_TICKS_PER_GC = 30 * 60 * Server::TARGET_TICKS_PER_SECOND; + private const DEFAULT_TICKS_PER_GC = 30 * 60 * Server::TARGET_TICKS_PER_SECOND; private int $memoryLimit; private int $globalMemoryLimit; @@ -139,7 +139,7 @@ class MemoryManager{ $this->continuousTrigger = $config->getPropertyBool("memory.continuous-trigger", true); $this->continuousTriggerRate = $config->getPropertyInt("memory.continuous-trigger-rate", self::DEFAULT_CONTINUOUS_TRIGGER_RATE); - $this->garbageCollectionPeriod = $config->getPropertyInt("memory.garbage-collection.period", self::DEEFAULT_TICKS_PER_GC); + $this->garbageCollectionPeriod = $config->getPropertyInt("memory.garbage-collection.period", self::DEFAULT_TICKS_PER_GC); $this->garbageCollectionTrigger = $config->getPropertyBool("memory.garbage-collection.low-memory-trigger", true); $this->garbageCollectionAsync = $config->getPropertyBool("memory.garbage-collection.collect-async-worker", true); From 2b987b450b87d64416fa33c1552d470b28520315 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Jan 2023 14:58:32 +0000 Subject: [PATCH 0541/1858] always the CS... --- src/world/generator/hell/Nether.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/world/generator/hell/Nether.php b/src/world/generator/hell/Nether.php index f58360820c..e12e03eb51 100644 --- a/src/world/generator/hell/Nether.php +++ b/src/world/generator/hell/Nether.php @@ -25,7 +25,6 @@ namespace pocketmine\world\generator\hell; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\BiomeIds; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\biome\BiomeRegistry; use pocketmine\world\ChunkManager; use pocketmine\world\format\Chunk; From 0f81b7be15047000ec4d29eb36fbb261277d1e8e Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Thu, 26 Jan 2023 18:08:15 +0300 Subject: [PATCH 0542/1858] Fixed deepslate drops (#5535) Co-authored-by: Dylan T --- src/block/VanillaBlocks.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index ee4e3595a6..898e5833b1 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1510,7 +1510,15 @@ final class VanillaBlocks{ self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0)))); $deepslateBreakInfo = new Info(BreakInfo::pickaxe(3, ToolTier::WOOD(), 18.0)); - self::register("deepslate", new SimplePillar(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo)); + self::register("deepslate", new class(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo) extends SimplePillar{ + public function getDropsForCompatibleTool(Item $item) : array{ + return [VanillaBlocks::COBBLED_DEEPSLATE()->asItem()]; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + }); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)))); From 5226300b99d8fdd60f117f6d99b70038ce2d56ef Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Fri, 27 Jan 2023 18:07:41 -0500 Subject: [PATCH 0543/1858] Ring bell when hit by a projectile (#5505) --- src/block/Bell.php | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/block/Bell.php b/src/block/Bell.php index f9e61e43d1..85c4ecaaf1 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -29,9 +29,11 @@ use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\entity\projectile\Projectile; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; +use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; @@ -134,14 +136,7 @@ final class Bell extends Transparent{ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ $faceHit = Facing::opposite($player->getHorizontalFacing()); - if( - $this->attachmentType->equals(BellAttachmentType::CEILING()) || - ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && Facing::axis($faceHit) === Facing::axis($this->facing)) || - ( - ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) || $this->attachmentType->equals(BellAttachmentType::TWO_WALLS())) && - ($faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true)) - ) - ){ + if($this->isValidFaceToRing($faceHit)){ $this->ring($faceHit); return true; } @@ -150,6 +145,13 @@ final class Bell extends Transparent{ return false; } + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + $faceHit = Facing::opposite($projectile->getHorizontalFacing()); + if($this->isValidFaceToRing($faceHit)){ + $this->ring($faceHit); + } + } + public function ring(int $faceHit) : void{ $world = $this->position->getWorld(); $world->addSound($this->position, new BellRingSound()); @@ -158,4 +160,15 @@ final class Bell extends Transparent{ $world->broadcastPacketToViewers($this->position, $tile->createFakeUpdatePacket($faceHit)); } } + + private function isValidFaceToRing(int $faceHit) : bool{ + return ( + $this->attachmentType->equals(BellAttachmentType::CEILING()) || + ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && Facing::axis($faceHit) === Facing::axis($this->facing)) || + ( + ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) || $this->attachmentType->equals(BellAttachmentType::TWO_WALLS())) && + ($faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true)) + ) + ); + } } From 00dbb6855a1a6e4dcfbe609b2b5eb2851ac0014c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 23:08:08 +0000 Subject: [PATCH 0544/1858] Bump build/php from `83bec42` to `1c44c61` (#5539) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `83bec42` to `1c44c61`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/83bec42c3cdb7a9acf120596f555cb0748f429b4...1c44c615c30b3ea2c4d8da93aa8dc96c1b56b47d) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 83bec42c3c..1c44c615c3 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 83bec42c3cdb7a9acf120596f555cb0748f429b4 +Subproject commit 1c44c615c30b3ea2c4d8da93aa8dc96c1b56b47d From 7529953f0a334eaa9cabfa850e6c644b57340ee9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 23:08:36 +0000 Subject: [PATCH 0545/1858] Bump phpstan/phpstan from 1.9.13 to 1.9.14 (#5523) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.13 to 1.9.14. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.13...1.9.14) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 50593ee5b8..9b1501ea33 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.13", + "phpstan/phpstan": "1.9.14", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 0b528344ca..655fdba851 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "15ba4659fe5eb8a99345c917325e90fd", + "content-hash": "8e2b03d128d6c14cf0f5e78d4bb7af90", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.13", + "version": "1.9.14", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a0922426da3a7d0d9334e99a363f7f9f6e23e84f" + "reference": "e5fcc96289cf737304286a9b505fbed091f02e58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a0922426da3a7d0d9334e99a363f7f9f6e23e84f", - "reference": "a0922426da3a7d0d9334e99a363f7f9f6e23e84f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5fcc96289cf737304286a9b505fbed091f02e58", + "reference": "e5fcc96289cf737304286a9b505fbed091f02e58", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.13" + "source": "https://github.com/phpstan/phpstan/tree/1.9.14" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-18T15:26:53+00:00" + "time": "2023-01-19T10:47:09+00:00" }, { "name": "phpstan/phpstan-phpunit", From fe12e8d944b244ffb1c20259631b30f3af37e9e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 12:39:14 +0000 Subject: [PATCH 0546/1858] Bump build/php from `1c44c61` to `c658506` (#5542) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `1c44c61` to `c658506`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/1c44c615c30b3ea2c4d8da93aa8dc96c1b56b47d...c6585061ca9b2f5aed7d030aae583fc3de9b2557) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 1c44c615c3..c6585061ca 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 1c44c615c30b3ea2c4d8da93aa8dc96c1b56b47d +Subproject commit c6585061ca9b2f5aed7d030aae583fc3de9b2557 From 0ac9584bbb85b92208bb6565b156c8cf076ff4cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 12:49:42 +0000 Subject: [PATCH 0547/1858] Bump shivammathur/setup-php from 2.23.0 to 2.24.0 (#5543) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.23.0 to 2.24.0. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.23.0...2.24.0) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 595b7374a5..91fb4c83e8 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.23.0 + uses: shivammathur/setup-php@2.24.0 with: php-version: 8.0 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 3d49656a8d..0b7217a08e 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -18,7 +18,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.23.0 + uses: shivammathur/setup-php@2.24.0 with: php-version: 8.0 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6e5d22e0b4..ad9fc56ec8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -201,7 +201,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.23.0 + uses: shivammathur/setup-php@2.24.0 with: php-version: 8.0 tools: php-cs-fixer:3.11 From 92c29b81722702306c2e728566d4112d38661e34 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jan 2023 12:53:06 +0000 Subject: [PATCH 0548/1858] Update transitive composer dependencies --- composer.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index 655fdba851..c0a3800fe1 100644 --- a/composer.lock +++ b/composer.lock @@ -1665,16 +1665,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.2", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -1715,9 +1715,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-11-12T15:38:23+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "phar-io/manifest", @@ -1991,16 +1991,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.23", + "version": "9.2.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", "shasum": "" }, "require": { @@ -2056,7 +2056,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" }, "funding": [ { @@ -2064,7 +2064,7 @@ "type": "github" } ], - "time": "2022-12-28T12:41:10+00:00" + "time": "2023-01-26T08:26:55+00:00" }, { "name": "phpunit/php-file-iterator", From 96c32d24ba48e77ff4c47649f309376a1fc213cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jan 2023 13:23:40 +0000 Subject: [PATCH 0549/1858] Update composer dependencies --- composer.json | 4 ++-- composer.lock | 28 ++++++++++++++-------------- src/lang/KnownTranslationFactory.php | 4 ++++ src/lang/KnownTranslationKeys.php | 1 + 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/composer.json b/composer.json index a4a53a6271..c4570bb09c 100644 --- a/composer.json +++ b/composer.json @@ -35,13 +35,13 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-data": "~1.13.0+bedrock-1.19.50", - "pocketmine/bedrock-protocol": "~18.0.0+bedrock-1.19.50", + "pocketmine/bedrock-protocol": "~18.1.0+bedrock-1.19.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", - "pocketmine/locale-data": "~2.17.0", + "pocketmine/locale-data": "~2.18.0", "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0", "pocketmine/math": "^0.4.0", diff --git a/composer.lock b/composer.lock index ef0bfa35f8..e8987fccf4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0c1d23e60b8e9afc418cc45d5ee35b87", + "content-hash": "2c0f273b515174abfdcef4fc4ad3c262", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "18.0.0+bedrock-1.19.50", + "version": "18.1.0+bedrock-1.19.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "b558ec883bd967dd3339f513cba62d2fbcd63349" + "reference": "c34f22847a1cc362a3f1c45698576d30d1e8392f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/b558ec883bd967dd3339f513cba62d2fbcd63349", - "reference": "b558ec883bd967dd3339f513cba62d2fbcd63349", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/c34f22847a1cc362a3f1c45698576d30d1e8392f", + "reference": "c34f22847a1cc362a3f1c45698576d30d1e8392f", "shasum": "" }, "require": { @@ -299,7 +299,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.9.13", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/18.0.0+bedrock-1.19.50" + "source": "https://github.com/pmmp/BedrockProtocol/tree/18.1.0+bedrock-1.19.50" }, - "time": "2023-01-06T21:47:35+00:00" + "time": "2023-01-20T12:35:30+00:00" }, { "name": "pocketmine/binaryutils", @@ -537,16 +537,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.17.0", + "version": "2.18.3", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "a2c7071117c98ccc0e333994271cab1072eb3c06" + "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/a2c7071117c98ccc0e333994271cab1072eb3c06", - "reference": "a2c7071117c98ccc0e333994271cab1072eb3c06", + "url": "https://api.github.com/repos/pmmp/Language/zipball/da25bfe9ee4822a84feb9b7e620c56ad4000aed0", + "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0", "shasum": "" }, "type": "library", @@ -554,9 +554,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.17.0" + "source": "https://github.com/pmmp/Language/tree/2.18.3" }, - "time": "2023-01-13T17:22:45+00:00" + "time": "2023-01-17T21:43:36+00:00" }, { "name": "pocketmine/log", diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index c114ae5dea..07a8b17b46 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -1629,6 +1629,10 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT, []); } + public static function pocketmine_disconnect_error_respawn() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_RESPAWN, []); + } + public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ 0 => $param0, diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index 0dd623f602..3221ecbdc4 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -354,6 +354,7 @@ final class KnownTranslationKeys{ public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket"; public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal"; public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout"; + public const POCKETMINE_DISCONNECT_ERROR_RESPAWN = "pocketmine.disconnect.error.respawn"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; From 63c3127248d936f7b80b2d6b39746fb85b6e58fc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jan 2023 21:52:31 +0000 Subject: [PATCH 0550/1858] Scrub PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 0afae17b60..f5db3f8c49 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -5,11 +5,6 @@ parameters: count: 2 path: ../../../build/make-release.php - - - message: "#^Parameter \\#1 \\$pharPath of function pocketmine\\\\build\\\\server_phar\\\\buildPhar expects string, array\\\\|string\\|false given\\.$#" - count: 1 - path: ../../../build/server-phar.php - - message: "#^Parameter \\#1 \\$strings of function pocketmine\\\\build\\\\server_phar\\\\preg_quote_array expects array\\, array\\ given\\.$#" count: 1 @@ -30,11 +25,6 @@ parameters: count: 1 path: ../../../src/Server.php - - - message: "#^Cannot cast array\\\\|string\\|false to string\\.$#" - count: 1 - path: ../../../src/ServerConfigGroup.php - - message: "#^Cannot cast mixed to int\\.$#" count: 2 @@ -1315,11 +1305,6 @@ parameters: count: 3 path: ../../../src/world/light/SkyLightUpdate.php - - - message: "#^Only numeric types are allowed in \\+, int\\|false given on the left side\\.$#" - count: 1 - path: ../../../src/world/light/SkyLightUpdate.php - - message: "#^Only numeric types are allowed in \\-, int\\|null given on the right side\\.$#" count: 1 From cb1aac3cd40e9949721dd387cf6a8083d7d09a58 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jan 2023 21:55:26 +0000 Subject: [PATCH 0551/1858] Release 4.13.0 --- changelogs/4.13.md | 94 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +-- 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.13.md diff --git a/changelogs/4.13.md b/changelogs/4.13.md new file mode 100644 index 0000000000..085cc03492 --- /dev/null +++ b/changelogs/4.13.md @@ -0,0 +1,94 @@ +**For Minecraft: Bedrock Edition 1.19.50** + +This is a minor feature release for PocketMine-MP, introducing some new features and improvements. + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.13.0 +Released 30th January 2023. + +## Gameplay +- Death message is now shown on the death screen when a player dies. +- Armour damage is now only increased if the armour reduced the damage taken. +- Implemented Swift Sneak enchantment. +- Fixed incorrect collision box calculation of walls and glass/bars when connected. Note: Client-side, wall connections are still broken; this only fixes projectile flight server-side. + +## Performance +- Improved performance of chunk selection for chunk random ticking using a cache. This improves performance of chunk random ticking by 10-20%. + +## Localization +- Added localized description for the `/dumpmemory` command. + +## Permissions +- Added the following new core permissions: + - `pocketmine.command.effect.other` - allows the player to use the `/effect` command on other players (default operator only) + - `pocketmine.command.effect.self` - allows the player to use the `/effect` command on themselves (default operator only) + - `pocketmine.command.enchant.other` - allows the player to use the `/enchant` command on other players (default operator only) + - `pocketmine.command.enchant.self` - allows the player to use the `/enchant` command on themselves (default operator only) + - `pocketmine.command.gamemode.other` - allows the player to use the `/gamemode` command on other players (default operator only) + - `pocketmine.command.gamemode.self` - allows the player to use the `/gamemode` command on themselves (default operator only) + - `pocketmine.command.give.other` - allows the player to use the `/give` command on other players (default operator only) + - `pocketmine.command.give.self` - allows the player to use the `/give` command on themselves (default operator only) + - `pocketmine.command.spawnpoint.other` - allows the player to use the `/spawnpoint` command on other players (default operator only) + - `pocketmine.command.spawnpoint.self` - allows the player to use the `/spawnpoint` command on themselves (default operator only) + - `pocketmine.command.teleport.other` - allows the player to use the `/teleport` command on other players (default operator only) + - `pocketmine.command.teleport.self` - allows the player to use the `/teleport` command on themselves (default operator only) + - `pocketmine.command.title.other` - allows the player to use the `/title` command on other players (default operator only) + - `pocketmine.command.title.self` - allows the player to use the `/title` command on themselves (default operator only) + +## Internals +- Decoupled `Player->sendMessage()` and `Player->sendTranslation()`. +- Refactored resource pack loading in `ResourcePackManager` to make it easier to understand. +- Client-aware translation processing has been moved to `NetworkSession` due to being client-specific. +- Replaced hardcoded strings with constants in various places. +- `NetworkSession` destructive cleanup is now deferred to the next session tick. This fixes various `InventoryManager` crashes when kicking players during events. +- Updated code using `strpos()` to use `str_starts_with()`, `str_ends_with()` and `str_contains()` where appropriate. +- Added documentation for some internal methods. + +## API +### `pocketmine\command` +- The following new API methods have been added: + - `protected VanillaCommand->fetchPermittedPlayerTarget(...) : ?Player` - fetches a player target according to the given sender permissions, or null if not found or not permitted + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Living->getDisplayName() : string` - the name of the entity to be shown in death messages, commands etc. + +### `pocketmine\event\world` +- The following new classes have been added: + - `WorldSoundEvent` - called when a sound is played in a world + - `WorldParticleEvent` - called when a particle is spawned in a world + +### `pocketmine\item` +- The following new API methods have been added: + - `public Item->onInteractEntity(Player $player, Entity $entity, Vector3 $clickVector) : bool` - called when a player interacts with an entity with this item in hand + +### `pocketmine\lang` +- `Language->translate()` and `Language->translateString()` no longer parse nested translation in the "base text". This was never intended behaviour, and didn't work beyond the first level anyway. + +### `pocketmine\player` +- The following new interfaces have been added: + - `PlayerDataProvider` - implemented by classes which want to offer storage for player data +- The following new classes have been added: + - `DatFilePlayerDataProvider` - the default player data provider, which stores `.dat` files in the `players` folder + - `PlayerDataLoadException` - thrown when an error occurs while loading player data + - `PlayerDataSaveException` - thrown when an error occurs while saving player data +- The following API methods have been deprecated: + - `Player->sendTranslation()` - use `Player->sendMessage()` instead with a `Translatable` message + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setResourceStack(list $resourceStack) : void` - sets the list of resource packs to be applied by players + - `public ResourcePackManager->setPackEncryptionKey(string $id, ?string $key) : void` - sets the encryption key to be used for a resource pack + +### `pocketmine\utils` +- The following new API methods have been added: + - `public static Filesystem::fileGetContents(...) : string` - a wrapper around `file_get_contents()` which throws an exception on failure + +### `pocketmine\world` +- The following new API methods have been added: + - `public World->requestSafeSpawn(?Vector3 $spawn = null) : Promise` - an async version of `getSafeSpawn()` which generates all the needed chunks before returning diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a55ca2ba32..bc0f696361 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.13.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "beta"; + public const BASE_VERSION = "4.13.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; private function __construct(){ //NOOP From 4562cfb85bc5f8d9bd15077716eb9956e784c975 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jan 2023 21:55:26 +0000 Subject: [PATCH 0552/1858] 4.13.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index bc0f696361..253c907d3c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.13.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.13.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From d3fff4e0b253fe8e323eba80125ac16aa3c72e56 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Feb 2023 21:21:55 +0000 Subject: [PATCH 0553/1858] Updated to newer BedrockBlockUpgradeSchema --- composer.lock | 8 +++--- .../block/upgrade/BlockIdMetaUpgrader.php | 28 +++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index 55c86608e6..83a6d6ca04 100644 --- a/composer.lock +++ b/composer.lock @@ -254,12 +254,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4" + "reference": "b0cc441e029cf5a6de5b05dd0f5657208855232b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4", - "reference": "63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/b0cc441e029cf5a6de5b05dd0f5657208855232b", + "reference": "b0cc441e029cf5a6de5b05dd0f5657208855232b", "shasum": "" }, "default-branch": true, @@ -273,7 +273,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-08-07T19:29:31+00:00" + "time": "2023-02-01T21:11:39+00:00" }, { "name": "pocketmine/bedrock-data", diff --git a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php index ef82672950..972362b86b 100644 --- a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; /** @@ -75,15 +76,24 @@ final class BlockIdMetaUpgrader{ $mappingTable = []; $legacyStateMapReader = new BinaryStream($data); - $nbtReader = new NetworkNbtSerializer(); - while(!$legacyStateMapReader->feof()){ - $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); - $meta = $legacyStateMapReader->getLShort(); + $nbtReader = new LittleEndianNbtSerializer(); - $offset = $legacyStateMapReader->getOffset(); - $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); - $legacyStateMapReader->setOffset($offset); - $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); + $idCount = $legacyStateMapReader->getUnsignedVarInt(); + for($idIndex = 0; $idIndex < $idCount; $idIndex++){ + $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); + + $metaCount = $legacyStateMapReader->getUnsignedVarInt(); + for($metaIndex = 0; $metaIndex < $metaCount; $metaIndex++){ + $meta = $legacyStateMapReader->getUnsignedVarInt(); + + $offset = $legacyStateMapReader->getOffset(); + $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); + $legacyStateMapReader->setOffset($offset); + $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); + } + } + if(!$legacyStateMapReader->feof()){ + throw new BinaryDataException("Unexpected trailing data in legacy state map data"); } return new self($mappingTable, $idMap); From 0e15a8698a8e0a9f44beb4ca89c7ed74737612d7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Feb 2023 22:35:59 +0000 Subject: [PATCH 0554/1858] BlockStateUpgrader: do not use blockstate version to manage internal schemas these are no longer reliable. --- .../block/upgrade/BlockStateUpgradeSchema.php | 8 ++- .../upgrade/BlockStateUpgradeSchemaUtils.php | 28 ++++---- .../block/upgrade/BlockStateUpgrader.php | 69 +++++++++---------- .../format/io/GlobalBlockStateHandlers.php | 3 +- 4 files changed, 53 insertions(+), 55 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php index 44c56e6cae..36960383e2 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php @@ -69,14 +69,18 @@ final class BlockStateUpgradeSchema{ public int $maxVersionMinor, public int $maxVersionPatch, public int $maxVersionRevision, - private int $priority + private int $schemaId ){} + /** + * @deprecated This is defined by Mojang, and therefore cannot be relied on. Use getSchemaId() instead for + * internal version management. + */ public function getVersionId() : int{ return ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; } - public function getPriority() : int{ return $this->priority; } + public function getSchemaId() : int{ return $this->schemaId; } public function isEmpty() : bool{ foreach([ diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 27aa5b5103..64f79663ee 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -110,13 +110,13 @@ final class BlockStateUpgradeSchemaUtils{ }; } - public static function fromJsonModel(BlockStateUpgradeSchemaModel $model, int $priority) : BlockStateUpgradeSchema{ + public static function fromJsonModel(BlockStateUpgradeSchemaModel $model, int $schemaId) : BlockStateUpgradeSchema{ $result = new BlockStateUpgradeSchema( $model->maxVersionMajor, $model->maxVersionMinor, $model->maxVersionPatch, $model->maxVersionRevision, - $priority + $schemaId ); $result->renamedIds = $model->renamedIds ?? []; $result->renamedProperties = $model->renamedProperties ?? []; @@ -250,11 +250,11 @@ final class BlockStateUpgradeSchemaUtils{ } /** - * Returns a list of schemas ordered by priority. Oldest schemas appear first. + * Returns a list of schemas ordered by schema ID. Oldest schemas appear first. * * @return BlockStateUpgradeSchema[] */ - public static function loadSchemas(string $path, int $currentVersion) : array{ + public static function loadSchemas(string $path, int $maxSchemaId) : array{ $iterator = new \RegexIterator( new \FilesystemIterator( $path, @@ -270,32 +270,30 @@ final class BlockStateUpgradeSchemaUtils{ /** @var string[] $matches */ foreach($iterator as $matches){ $filename = $matches[0]; - $priority = (int) $matches[1]; + $schemaId = (int) $matches[1]; + + if($schemaId > $maxSchemaId){ + continue; + } $fullPath = Path::join($path, $filename); $raw = Filesystem::fileGetContents($fullPath); try{ - $schema = self::loadSchemaFromString($raw, $priority); + $schema = self::loadSchemaFromString($raw, $schemaId); }catch(\RuntimeException $e){ throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); } - if($schema->getVersionId() > $currentVersion){ - //this might be a beta schema which shouldn't be applicable - //TODO: why do we load the whole schema just to throw it away if it's too new? ... - continue; - } - - $result[$priority] = $schema; + $result[$schemaId] = $schema; } ksort($result, SORT_NUMERIC); return $result; } - public static function loadSchemaFromString(string $raw, int $priority) : BlockStateUpgradeSchema{ + public static function loadSchemaFromString(string $raw, int $schemaId) : BlockStateUpgradeSchema{ try{ $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); }catch(\JsonException $e){ @@ -312,6 +310,6 @@ final class BlockStateUpgradeSchemaUtils{ throw new \RuntimeException($e->getMessage(), 0, $e); } - return self::fromJsonModel($model, $priority); + return self::fromJsonModel($model, $schemaId); } } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 637674a265..b7fd5a4223 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -31,7 +31,7 @@ use function ksort; use const SORT_NUMERIC; final class BlockStateUpgrader{ - /** @var BlockStateUpgradeSchema[][] */ + /** @var BlockStateUpgradeSchema[] */ private array $upgradeSchemas = []; /** @@ -45,59 +45,54 @@ final class BlockStateUpgrader{ } public function addSchema(BlockStateUpgradeSchema $schema) : void{ - $schemaList = $this->upgradeSchemas[$schema->getVersionId()] ?? []; - - $priority = $schema->getPriority(); - if(isset($schemaList[$priority])){ - throw new \InvalidArgumentException("Cannot add two schemas to the same version with the same priority"); + $schemaId = $schema->getSchemaId(); + if(isset($this->upgradeSchemas[$schemaId])){ + throw new \InvalidArgumentException("Cannot add two schemas with the same schema ID"); } - $schemaList[$priority] = $schema; - ksort($schemaList, SORT_NUMERIC); - $this->upgradeSchemas[$schema->getVersionId()] = $schemaList; + $this->upgradeSchemas[$schemaId] = $schema; ksort($this->upgradeSchemas, SORT_NUMERIC); } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ $version = $blockStateData->getVersion(); - foreach($this->upgradeSchemas as $resultVersion => $schemas){ + foreach($this->upgradeSchemas as $schema){ + $resultVersion = $schema->getVersionId(); if($version > $resultVersion){ //even if this is actually the same version, we have to apply it anyway because mojang are dumb and //didn't always bump the blockstate version when changing it :( continue; } - foreach($schemas as $schema){ - $oldName = $blockStateData->getName(); - $oldState = $blockStateData->getStates(); - if(isset($schema->remappedStates[$oldName])){ - foreach($schema->remappedStates[$oldName] as $remap){ - if(count($oldState) !== count($remap->oldState)){ - continue; //try next state - } - foreach(Utils::stringifyKeys($oldState) as $k => $v){ - if(!isset($remap->oldState[$k]) || !$remap->oldState[$k]->equals($v)){ - continue 2; //try next state - } - } - - $blockStateData = new BlockStateData($remap->newName, $remap->newState, $resultVersion); - continue 2; //try next schema + $oldName = $blockStateData->getName(); + $oldState = $blockStateData->getStates(); + if(isset($schema->remappedStates[$oldName])){ + foreach($schema->remappedStates[$oldName] as $remap){ + if(count($oldState) !== count($remap->oldState)){ + continue; //try next state } + foreach(Utils::stringifyKeys($oldState) as $k => $v){ + if(!isset($remap->oldState[$k]) || !$remap->oldState[$k]->equals($v)){ + continue 2; //try next state + } + } + + $blockStateData = new BlockStateData($remap->newName, $remap->newState, $resultVersion); + continue 2; //try next schema } - $newName = $schema->renamedIds[$oldName] ?? null; + } + $newName = $schema->renamedIds[$oldName] ?? null; - $stateChanges = 0; - $states = $blockStateData->getStates(); + $stateChanges = 0; + $states = $blockStateData->getStates(); - $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyRenamedOrValueChanged($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyValueChanged($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRenamedOrValueChanged($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyValueChanged($schema, $oldName, $states, $stateChanges); - if($newName !== null || $stateChanges > 0){ - $blockStateData = new BlockStateData($newName ?? $oldName, $states, $resultVersion); - //don't break out; we may need to further upgrade the state - } + if($newName !== null || $stateChanges > 0){ + $blockStateData = new BlockStateData($newName ?? $oldName, $states, $resultVersion); + //don't break out; we may need to further upgrade the state } } diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index d22eb368bb..bd983dea82 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -43,6 +43,7 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; * benefits for now. */ final class GlobalBlockStateHandlers{ + public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 151; //https://github.com/pmmp/BedrockBlockUpgradeSchema/blob/b0cc441e029cf5a6de5b05dd0f5657208855232b/nbt_upgrade_schema/0151_1.19.0.34_beta_to_1.19.20.json private static ?BlockObjectToStateSerializer $blockStateSerializer = null; @@ -64,7 +65,7 @@ final class GlobalBlockStateHandlers{ if(self::$blockDataUpgrader === null){ $blockStateUpgrader = new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), - BlockStateData::CURRENT_VERSION + self::MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID )); self::$blockDataUpgrader = new BlockDataUpgrader( BlockIdMetaUpgrader::loadFromString( From 3c46bf01c609d4459dbcb322c53469e3adad87cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 14:47:38 +0000 Subject: [PATCH 0555/1858] Begin removing dependence on obsolete files from BedrockData these files were only kept for backwards compatibility, and aren't actively maintained. They are only needed for legacy conversions in the modern day era. --- composer.json | 2 + composer.lock | 54 ++++++++++++++++++- src/CoreConstants.php | 2 + .../bedrock/LegacyBlockIdToStringIdMap.php | 2 +- .../bedrock/LegacyItemIdToStringIdMap.php | 2 +- 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index c4570bb09c..bd1a85af9b 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,9 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", + "pocketmine/bedrock-block-upgrade-schema": "^1.0.0", "pocketmine/bedrock-data": "~1.13.0+bedrock-1.19.50", + "pocketmine/bedrock-item-upgrade-schema": "^1.0.0", "pocketmine/bedrock-protocol": "~18.1.0+bedrock-1.19.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index e8987fccf4..6829f4a650 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2c0f273b515174abfdcef4fc4ad3c262", + "content-hash": "a9e05a8358faee33178bac5279d864f4", "packages": [ { "name": "adhocore/json-comment", @@ -248,6 +248,32 @@ }, "time": "2022-12-08T20:46:14+00:00" }, + { + "name": "pocketmine/bedrock-block-upgrade-schema", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC0-1.0" + ], + "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", + "support": { + "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" + }, + "time": "2023-02-01T21:09:54+00:00" + }, { "name": "pocketmine/bedrock-data", "version": "1.13.0+bedrock-1.19.50", @@ -274,6 +300,32 @@ }, "time": "2022-11-30T16:19:59+00:00" }, + { + "name": "pocketmine/bedrock-item-upgrade-schema", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", + "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", + "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC0-1.0" + ], + "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", + "support": { + "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.0.0" + }, + "time": "2023-02-01T22:50:02+00:00" + }, { "name": "pocketmine/bedrock-protocol", "version": "18.1.0+bedrock-1.19.50", diff --git a/src/CoreConstants.php b/src/CoreConstants.php index 7b0345b1c2..c184862377 100644 --- a/src/CoreConstants.php +++ b/src/CoreConstants.php @@ -37,4 +37,6 @@ define('pocketmine\PATH', dirname(__DIR__) . '/'); define('pocketmine\RESOURCE_PATH', dirname(__DIR__) . '/resources/'); define('pocketmine\BEDROCK_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-data/'); define('pocketmine\LOCALE_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/locale-data/'); +define('pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-block-upgrade-schema/'); +define('pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-item-upgrade-schema/'); define('pocketmine\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__) . '/vendor/autoload.php'); diff --git a/src/data/bedrock/LegacyBlockIdToStringIdMap.php b/src/data/bedrock/LegacyBlockIdToStringIdMap.php index 35c24caf9a..8b4a1365c1 100644 --- a/src/data/bedrock/LegacyBlockIdToStringIdMap.php +++ b/src/data/bedrock/LegacyBlockIdToStringIdMap.php @@ -30,6 +30,6 @@ final class LegacyBlockIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ use SingletonTrait; public function __construct(){ - parent::__construct(Path::join(\pocketmine\BEDROCK_DATA_PATH, 'block_id_map.json')); + parent::__construct(Path::join(\pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'block_legacy_id_map.json')); } } diff --git a/src/data/bedrock/LegacyItemIdToStringIdMap.php b/src/data/bedrock/LegacyItemIdToStringIdMap.php index 254ad96bb1..9f5c257ddf 100644 --- a/src/data/bedrock/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/LegacyItemIdToStringIdMap.php @@ -30,6 +30,6 @@ final class LegacyItemIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ use SingletonTrait; public function __construct(){ - parent::__construct(Path::join(\pocketmine\BEDROCK_DATA_PATH, 'item_id_map.json')); + parent::__construct(Path::join(\pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'item_id_map.json')); } } From cfa1e7486a4831ca6c567a1ecdbeab0b091c6dbd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 15:25:03 +0000 Subject: [PATCH 0556/1858] Move legacy recipes and creative items in-house having them here allows BedrockData to represent latest versions freely, without being limited by technical limitations of PM4. --- resources/legacy_creativeitems.json | 4898 +++ resources/legacy_recipes.json | 49988 ++++++++++++++++++++++++++ src/Server.php | 2 +- src/inventory/CreativeInventory.php | 2 +- 4 files changed, 54888 insertions(+), 2 deletions(-) create mode 100644 resources/legacy_creativeitems.json create mode 100644 resources/legacy_recipes.json diff --git a/resources/legacy_creativeitems.json b/resources/legacy_creativeitems.json new file mode 100644 index 0000000000..f4f5e40484 --- /dev/null +++ b/resources/legacy_creativeitems.json @@ -0,0 +1,4898 @@ +[ + { + "id": 5 + }, + { + "id": 5, + "damage": 1 + }, + { + "id": 5, + "damage": 2 + }, + { + "id": 5, + "damage": 3 + }, + { + "id": 5, + "damage": 4 + }, + { + "id": 5, + "damage": 5 + }, + { + "id": -242 + }, + { + "id": -243 + }, + { + "id": 139 + }, + { + "id": 139, + "damage": 1 + }, + { + "id": 139, + "damage": 2 + }, + { + "id": 139, + "damage": 3 + }, + { + "id": 139, + "damage": 4 + }, + { + "id": 139, + "damage": 5 + }, + { + "id": 139, + "damage": 12 + }, + { + "id": 139, + "damage": 7 + }, + { + "id": 139, + "damage": 8 + }, + { + "id": 139, + "damage": 6 + }, + { + "id": 139, + "damage": 9 + }, + { + "id": 139, + "damage": 13 + }, + { + "id": 139, + "damage": 10 + }, + { + "id": 139, + "damage": 11 + }, + { + "id": -277 + }, + { + "id": -297 + }, + { + "id": -278 + }, + { + "id": 85 + }, + { + "id": 85, + "damage": 1 + }, + { + "id": 85, + "damage": 2 + }, + { + "id": 85, + "damage": 3 + }, + { + "id": 85, + "damage": 4 + }, + { + "id": 85, + "damage": 5 + }, + { + "id": 113 + }, + { + "id": -256 + }, + { + "id": -257 + }, + { + "id": 107 + }, + { + "id": 183 + }, + { + "id": 184 + }, + { + "id": 185 + }, + { + "id": 187 + }, + { + "id": 186 + }, + { + "id": -258 + }, + { + "id": -259 + }, + { + "id": -180 + }, + { + "id": 67 + }, + { + "id": -179 + }, + { + "id": 53 + }, + { + "id": 134 + }, + { + "id": 135 + }, + { + "id": 136 + }, + { + "id": 163 + }, + { + "id": 164 + }, + { + "id": 109 + }, + { + "id": -175 + }, + { + "id": 128 + }, + { + "id": -177 + }, + { + "id": 180 + }, + { + "id": -176 + }, + { + "id": -169 + }, + { + "id": -172 + }, + { + "id": -170 + }, + { + "id": -173 + }, + { + "id": -171 + }, + { + "id": -174 + }, + { + "id": 108 + }, + { + "id": 114 + }, + { + "id": -184 + }, + { + "id": -178 + }, + { + "id": 156 + }, + { + "id": -185 + }, + { + "id": 203 + }, + { + "id": -2 + }, + { + "id": -3 + }, + { + "id": -4 + }, + { + "id": -254 + }, + { + "id": -255 + }, + { + "id": -276 + }, + { + "id": -292 + }, + { + "id": -275 + }, + { + "id": 324 + }, + { + "id": 427 + }, + { + "id": 428 + }, + { + "id": 429 + }, + { + "id": 430 + }, + { + "id": 431 + }, + { + "id": 330 + }, + { + "id": 755 + }, + { + "id": 756 + }, + { + "id": 96 + }, + { + "id": -149 + }, + { + "id": -146 + }, + { + "id": -148 + }, + { + "id": -145 + }, + { + "id": -147 + }, + { + "id": 167 + }, + { + "id": -246 + }, + { + "id": -247 + }, + { + "id": 101 + }, + { + "id": 20 + }, + { + "id": 241 + }, + { + "id": 241, + "damage": 8 + }, + { + "id": 241, + "damage": 7 + }, + { + "id": 241, + "damage": 15 + }, + { + "id": 241, + "damage": 12 + }, + { + "id": 241, + "damage": 14 + }, + { + "id": 241, + "damage": 1 + }, + { + "id": 241, + "damage": 4 + }, + { + "id": 241, + "damage": 5 + }, + { + "id": 241, + "damage": 13 + }, + { + "id": 241, + "damage": 9 + }, + { + "id": 241, + "damage": 3 + }, + { + "id": 241, + "damage": 11 + }, + { + "id": 241, + "damage": 10 + }, + { + "id": 241, + "damage": 2 + }, + { + "id": 241, + "damage": 6 + }, + { + "id": 102 + }, + { + "id": 160 + }, + { + "id": 160, + "damage": 8 + }, + { + "id": 160, + "damage": 7 + }, + { + "id": 160, + "damage": 15 + }, + { + "id": 160, + "damage": 12 + }, + { + "id": 160, + "damage": 14 + }, + { + "id": 160, + "damage": 1 + }, + { + "id": 160, + "damage": 4 + }, + { + "id": 160, + "damage": 5 + }, + { + "id": 160, + "damage": 13 + }, + { + "id": 160, + "damage": 9 + }, + { + "id": 160, + "damage": 3 + }, + { + "id": 160, + "damage": 11 + }, + { + "id": 160, + "damage": 10 + }, + { + "id": 160, + "damage": 2 + }, + { + "id": 160, + "damage": 6 + }, + { + "id": 65 + }, + { + "id": -165 + }, + { + "id": 44 + }, + { + "id": -166, + "damage": 2 + }, + { + "id": 44, + "damage": 3 + }, + { + "id": 182, + "damage": 5 + }, + { + "id": 158 + }, + { + "id": 158, + "damage": 1 + }, + { + "id": 158, + "damage": 2 + }, + { + "id": 158, + "damage": 3 + }, + { + "id": 158, + "damage": 4 + }, + { + "id": 158, + "damage": 5 + }, + { + "id": 44, + "damage": 5 + }, + { + "id": -166 + }, + { + "id": 44, + "damage": 1 + }, + { + "id": -166, + "damage": 3 + }, + { + "id": 182, + "damage": 6 + }, + { + "id": 182 + }, + { + "id": -166, + "damage": 4 + }, + { + "id": -162, + "damage": 1 + }, + { + "id": -162, + "damage": 6 + }, + { + "id": -162, + "damage": 7 + }, + { + "id": -162, + "damage": 4 + }, + { + "id": -162, + "damage": 5 + }, + { + "id": -162, + "damage": 3 + }, + { + "id": -162, + "damage": 2 + }, + { + "id": 44, + "damage": 4 + }, + { + "id": 44, + "damage": 7 + }, + { + "id": 182, + "damage": 7 + }, + { + "id": -162 + }, + { + "id": 44, + "damage": 6 + }, + { + "id": -166, + "damage": 1 + }, + { + "id": 182, + "damage": 1 + }, + { + "id": 182, + "damage": 2 + }, + { + "id": 182, + "damage": 3 + }, + { + "id": 182, + "damage": 4 + }, + { + "id": -264 + }, + { + "id": -265 + }, + { + "id": -282 + }, + { + "id": -293 + }, + { + "id": -284 + }, + { + "id": 45 + }, + { + "id": -302 + }, + { + "id": -303 + }, + { + "id": -304 + }, + { + "id": 98 + }, + { + "id": 98, + "damage": 1 + }, + { + "id": 98, + "damage": 2 + }, + { + "id": 98, + "damage": 3 + }, + { + "id": 206 + }, + { + "id": 168, + "damage": 2 + }, + { + "id": -274 + }, + { + "id": -280 + }, + { + "id": -281 + }, + { + "id": -279 + }, + { + "id": 4 + }, + { + "id": 48 + }, + { + "id": -183 + }, + { + "id": 24 + }, + { + "id": 24, + "damage": 1 + }, + { + "id": 24, + "damage": 2 + }, + { + "id": 24, + "damage": 3 + }, + { + "id": 179 + }, + { + "id": 179, + "damage": 1 + }, + { + "id": 179, + "damage": 2 + }, + { + "id": 179, + "damage": 3 + }, + { + "id": 173 + }, + { + "id": -139 + }, + { + "id": 41 + }, + { + "id": 42 + }, + { + "id": 133 + }, + { + "id": 57 + }, + { + "id": 22 + }, + { + "id": 155 + }, + { + "id": 155, + "damage": 2 + }, + { + "id": 155, + "damage": 1 + }, + { + "id": 155, + "damage": 3 + }, + { + "id": 168 + }, + { + "id": 168, + "damage": 1 + }, + { + "id": 165 + }, + { + "id": -220 + }, + { + "id": -221 + }, + { + "id": 170 + }, + { + "id": 216 + }, + { + "id": 112 + }, + { + "id": 215 + }, + { + "id": -270 + }, + { + "id": -222 + }, + { + "id": 35 + }, + { + "id": 35, + "damage": 8 + }, + { + "id": 35, + "damage": 7 + }, + { + "id": 35, + "damage": 15 + }, + { + "id": 35, + "damage": 12 + }, + { + "id": 35, + "damage": 14 + }, + { + "id": 35, + "damage": 1 + }, + { + "id": 35, + "damage": 4 + }, + { + "id": 35, + "damage": 5 + }, + { + "id": 35, + "damage": 13 + }, + { + "id": 35, + "damage": 9 + }, + { + "id": 35, + "damage": 3 + }, + { + "id": 35, + "damage": 11 + }, + { + "id": 35, + "damage": 10 + }, + { + "id": 35, + "damage": 2 + }, + { + "id": 35, + "damage": 6 + }, + { + "id": 171 + }, + { + "id": 171, + "damage": 8 + }, + { + "id": 171, + "damage": 7 + }, + { + "id": 171, + "damage": 15 + }, + { + "id": 171, + "damage": 12 + }, + { + "id": 171, + "damage": 14 + }, + { + "id": 171, + "damage": 1 + }, + { + "id": 171, + "damage": 4 + }, + { + "id": 171, + "damage": 5 + }, + { + "id": 171, + "damage": 13 + }, + { + "id": 171, + "damage": 9 + }, + { + "id": 171, + "damage": 3 + }, + { + "id": 171, + "damage": 11 + }, + { + "id": 171, + "damage": 10 + }, + { + "id": 171, + "damage": 2 + }, + { + "id": 171, + "damage": 6 + }, + { + "id": 237 + }, + { + "id": 237, + "damage": 8 + }, + { + "id": 237, + "damage": 7 + }, + { + "id": 237, + "damage": 15 + }, + { + "id": 237, + "damage": 12 + }, + { + "id": 237, + "damage": 14 + }, + { + "id": 237, + "damage": 1 + }, + { + "id": 237, + "damage": 4 + }, + { + "id": 237, + "damage": 5 + }, + { + "id": 237, + "damage": 13 + }, + { + "id": 237, + "damage": 9 + }, + { + "id": 237, + "damage": 3 + }, + { + "id": 237, + "damage": 11 + }, + { + "id": 237, + "damage": 10 + }, + { + "id": 237, + "damage": 2 + }, + { + "id": 237, + "damage": 6 + }, + { + "id": 236 + }, + { + "id": 236, + "damage": 8 + }, + { + "id": 236, + "damage": 7 + }, + { + "id": 236, + "damage": 15 + }, + { + "id": 236, + "damage": 12 + }, + { + "id": 236, + "damage": 14 + }, + { + "id": 236, + "damage": 1 + }, + { + "id": 236, + "damage": 4 + }, + { + "id": 236, + "damage": 5 + }, + { + "id": 236, + "damage": 13 + }, + { + "id": 236, + "damage": 9 + }, + { + "id": 236, + "damage": 3 + }, + { + "id": 236, + "damage": 11 + }, + { + "id": 236, + "damage": 10 + }, + { + "id": 236, + "damage": 2 + }, + { + "id": 236, + "damage": 6 + }, + { + "id": 82 + }, + { + "id": 172 + }, + { + "id": 159 + }, + { + "id": 159, + "damage": 8 + }, + { + "id": 159, + "damage": 7 + }, + { + "id": 159, + "damage": 15 + }, + { + "id": 159, + "damage": 12 + }, + { + "id": 159, + "damage": 14 + }, + { + "id": 159, + "damage": 1 + }, + { + "id": 159, + "damage": 4 + }, + { + "id": 159, + "damage": 5 + }, + { + "id": 159, + "damage": 13 + }, + { + "id": 159, + "damage": 9 + }, + { + "id": 159, + "damage": 3 + }, + { + "id": 159, + "damage": 11 + }, + { + "id": 159, + "damage": 10 + }, + { + "id": 159, + "damage": 2 + }, + { + "id": 159, + "damage": 6 + }, + { + "id": 220 + }, + { + "id": 228 + }, + { + "id": 227 + }, + { + "id": 235 + }, + { + "id": 232 + }, + { + "id": 234 + }, + { + "id": 221 + }, + { + "id": 224 + }, + { + "id": 225 + }, + { + "id": 233 + }, + { + "id": 229 + }, + { + "id": 223 + }, + { + "id": 231 + }, + { + "id": 219 + }, + { + "id": 222 + }, + { + "id": 226 + }, + { + "id": 201 + }, + { + "id": 201, + "damage": 2 + }, + { + "id": 214 + }, + { + "id": -227 + }, + { + "id": -230 + }, + { + "id": -232 + }, + { + "id": -233 + }, + { + "id": -234 + }, + { + "id": -235 + }, + { + "id": -236 + }, + { + "id": 3 + }, + { + "id": 3, + "damage": 1 + }, + { + "id": 60 + }, + { + "id": 2 + }, + { + "id": 198 + }, + { + "id": 243 + }, + { + "id": 110 + }, + { + "id": 1 + }, + { + "id": 15 + }, + { + "id": 14 + }, + { + "id": 56 + }, + { + "id": 21 + }, + { + "id": 73 + }, + { + "id": 16 + }, + { + "id": 129 + }, + { + "id": 153 + }, + { + "id": -288 + }, + { + "id": -271 + }, + { + "id": 13 + }, + { + "id": 1, + "damage": 1 + }, + { + "id": 1, + "damage": 3 + }, + { + "id": 1, + "damage": 5 + }, + { + "id": -273 + }, + { + "id": 1, + "damage": 2 + }, + { + "id": 1, + "damage": 4 + }, + { + "id": 1, + "damage": 6 + }, + { + "id": -291 + }, + { + "id": 12 + }, + { + "id": 12, + "damage": 1 + }, + { + "id": 81 + }, + { + "id": 17 + }, + { + "id": -10 + }, + { + "id": 17, + "damage": 1 + }, + { + "id": -5 + }, + { + "id": 17, + "damage": 2 + }, + { + "id": -6 + }, + { + "id": 17, + "damage": 3 + }, + { + "id": -7 + }, + { + "id": 162 + }, + { + "id": -8 + }, + { + "id": 162, + "damage": 1 + }, + { + "id": -9 + }, + { + "id": -225 + }, + { + "id": -240 + }, + { + "id": -226 + }, + { + "id": -241 + }, + { + "id": -212 + }, + { + "id": -212, + "damage": 8 + }, + { + "id": -212, + "damage": 1 + }, + { + "id": -212, + "damage": 9 + }, + { + "id": -212, + "damage": 2 + }, + { + "id": -212, + "damage": 10 + }, + { + "id": -212, + "damage": 3 + }, + { + "id": -212, + "damage": 11 + }, + { + "id": -212, + "damage": 4 + }, + { + "id": -212, + "damage": 12 + }, + { + "id": -212, + "damage": 5 + }, + { + "id": -212, + "damage": 13 + }, + { + "id": -299 + }, + { + "id": -300 + }, + { + "id": -298 + }, + { + "id": -301 + }, + { + "id": 18 + }, + { + "id": 18, + "damage": 1 + }, + { + "id": 18, + "damage": 2 + }, + { + "id": 18, + "damage": 3 + }, + { + "id": 161 + }, + { + "id": 161, + "damage": 1 + }, + { + "id": 6 + }, + { + "id": 6, + "damage": 1 + }, + { + "id": 6, + "damage": 2 + }, + { + "id": 6, + "damage": 3 + }, + { + "id": 6, + "damage": 4 + }, + { + "id": 6, + "damage": 5 + }, + { + "id": -218 + }, + { + "id": 295 + }, + { + "id": 361 + }, + { + "id": 362 + }, + { + "id": 458 + }, + { + "id": 296 + }, + { + "id": 457 + }, + { + "id": 392 + }, + { + "id": 394 + }, + { + "id": 391 + }, + { + "id": 396 + }, + { + "id": 260 + }, + { + "id": 322 + }, + { + "id": 466 + }, + { + "id": 103 + }, + { + "id": 360 + }, + { + "id": 382 + }, + { + "id": 477 + }, + { + "id": 86 + }, + { + "id": -155 + }, + { + "id": 91 + }, + { + "id": 736 + }, + { + "id": 31, + "damage": 2 + }, + { + "id": 175, + "damage": 3 + }, + { + "id": 31, + "damage": 1 + }, + { + "id": 175, + "damage": 2 + }, + { + "id": 760 + }, + { + "id": -131, + "damage": 3 + }, + { + "id": -131, + "damage": 1 + }, + { + "id": -131, + "damage": 2 + }, + { + "id": -131 + }, + { + "id": -131, + "damage": 4 + }, + { + "id": -131, + "damage": 11 + }, + { + "id": -131, + "damage": 9 + }, + { + "id": -131, + "damage": 10 + }, + { + "id": -131, + "damage": 8 + }, + { + "id": -131, + "damage": 12 + }, + { + "id": -133, + "damage": 3 + }, + { + "id": -133, + "damage": 1 + }, + { + "id": -133, + "damage": 2 + }, + { + "id": -133 + }, + { + "id": -133, + "damage": 4 + }, + { + "id": -134, + "damage": 3 + }, + { + "id": -134, + "damage": 1 + }, + { + "id": -134, + "damage": 2 + }, + { + "id": -134 + }, + { + "id": -134, + "damage": 4 + }, + { + "id": 335 + }, + { + "id": -130 + }, + { + "id": -223 + }, + { + "id": -224 + }, + { + "id": 37 + }, + { + "id": 38 + }, + { + "id": 38, + "damage": 1 + }, + { + "id": 38, + "damage": 2 + }, + { + "id": 38, + "damage": 3 + }, + { + "id": 38, + "damage": 4 + }, + { + "id": 38, + "damage": 5 + }, + { + "id": 38, + "damage": 6 + }, + { + "id": 38, + "damage": 7 + }, + { + "id": 38, + "damage": 8 + }, + { + "id": 38, + "damage": 9 + }, + { + "id": 38, + "damage": 10 + }, + { + "id": 175 + }, + { + "id": 175, + "damage": 1 + }, + { + "id": 175, + "damage": 4 + }, + { + "id": 175, + "damage": 5 + }, + { + "id": -216 + }, + { + "id": 351, + "damage": 19 + }, + { + "id": 351, + "damage": 7 + }, + { + "id": 351, + "damage": 8 + }, + { + "id": 351, + "damage": 16 + }, + { + "id": 351, + "damage": 17 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 14 + }, + { + "id": 351, + "damage": 11 + }, + { + "id": 351, + "damage": 10 + }, + { + "id": 351, + "damage": 2 + }, + { + "id": 351, + "damage": 6 + }, + { + "id": 351, + "damage": 12 + }, + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 5 + }, + { + "id": 351, + "damage": 13 + }, + { + "id": 351, + "damage": 9 + }, + { + "id": 351 + }, + { + "id": 351, + "damage": 3 + }, + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 15 + }, + { + "id": 106 + }, + { + "id": -231 + }, + { + "id": -287 + }, + { + "id": 111 + }, + { + "id": 32 + }, + { + "id": -163 + }, + { + "id": 80 + }, + { + "id": 79 + }, + { + "id": 174 + }, + { + "id": -11 + }, + { + "id": 78 + }, + { + "id": 365 + }, + { + "id": 319 + }, + { + "id": 363 + }, + { + "id": 423 + }, + { + "id": 411 + }, + { + "id": 349 + }, + { + "id": 460 + }, + { + "id": 461 + }, + { + "id": 462 + }, + { + "id": 39 + }, + { + "id": 40 + }, + { + "id": -228 + }, + { + "id": -229 + }, + { + "id": 99, + "damage": 14 + }, + { + "id": 100, + "damage": 14 + }, + { + "id": 99, + "damage": 15 + }, + { + "id": 99 + }, + { + "id": 344 + }, + { + "id": 338 + }, + { + "id": 353 + }, + { + "id": 367 + }, + { + "id": 352 + }, + { + "id": 30 + }, + { + "id": 375 + }, + { + "id": 52 + }, + { + "id": 97 + }, + { + "id": 97, + "damage": 1 + }, + { + "id": 97, + "damage": 2 + }, + { + "id": 97, + "damage": 3 + }, + { + "id": 97, + "damage": 4 + }, + { + "id": 97, + "damage": 5 + }, + { + "id": 122 + }, + { + "id": -159 + }, + { + "id": 383, + "damage": 10 + }, + { + "id": 383, + "damage": 122 + }, + { + "id": 383, + "damage": 11 + }, + { + "id": 383, + "damage": 12 + }, + { + "id": 383, + "damage": 13 + }, + { + "id": 383, + "damage": 14 + }, + { + "id": 383, + "damage": 28 + }, + { + "id": 383, + "damage": 22 + }, + { + "id": 383, + "damage": 75 + }, + { + "id": 383, + "damage": 16 + }, + { + "id": 383, + "damage": 19 + }, + { + "id": 383, + "damage": 30 + }, + { + "id": 383, + "damage": 18 + }, + { + "id": 383, + "damage": 29 + }, + { + "id": 383, + "damage": 23 + }, + { + "id": 383, + "damage": 24 + }, + { + "id": 383, + "damage": 25 + }, + { + "id": 383, + "damage": 26 + }, + { + "id": 383, + "damage": 27 + }, + { + "id": 383, + "damage": 111 + }, + { + "id": 383, + "damage": 112 + }, + { + "id": 383, + "damage": 108 + }, + { + "id": 383, + "damage": 109 + }, + { + "id": 383, + "damage": 31 + }, + { + "id": 383, + "damage": 74 + }, + { + "id": 383, + "damage": 113 + }, + { + "id": 383, + "damage": 121 + }, + { + "id": 383, + "damage": 33 + }, + { + "id": 383, + "damage": 38 + }, + { + "id": 383, + "damage": 39 + }, + { + "id": 383, + "damage": 34 + }, + { + "id": 383, + "damage": 48 + }, + { + "id": 383, + "damage": 46 + }, + { + "id": 383, + "damage": 37 + }, + { + "id": 383, + "damage": 35 + }, + { + "id": 383, + "damage": 32 + }, + { + "id": 383, + "damage": 36 + }, + { + "id": 383, + "damage": 47 + }, + { + "id": 383, + "damage": 110 + }, + { + "id": 383, + "damage": 17 + }, + { + "id": 383, + "damage": 40 + }, + { + "id": 383, + "damage": 45 + }, + { + "id": 383, + "damage": 49 + }, + { + "id": 383, + "damage": 50 + }, + { + "id": 383, + "damage": 55 + }, + { + "id": 383, + "damage": 42 + }, + { + "id": 383, + "damage": 125 + }, + { + "id": 383, + "damage": 124 + }, + { + "id": 383, + "damage": 123 + }, + { + "id": 383, + "damage": 126 + }, + { + "id": 383, + "damage": 127 + }, + { + "id": 383, + "damage": 41 + }, + { + "id": 383, + "damage": 43 + }, + { + "id": 383, + "damage": 54 + }, + { + "id": 383, + "damage": 57 + }, + { + "id": 383, + "damage": 104 + }, + { + "id": 383, + "damage": 105 + }, + { + "id": 383, + "damage": 15 + }, + { + "id": 383, + "damage": 118 + }, + { + "id": 383, + "damage": 44 + }, + { + "id": 383, + "damage": 58 + }, + { + "id": 383, + "damage": 114 + }, + { + "id": 383, + "damage": 59 + }, + { + "id": 49 + }, + { + "id": -289 + }, + { + "id": 7 + }, + { + "id": 88 + }, + { + "id": 87 + }, + { + "id": 213 + }, + { + "id": 372 + }, + { + "id": 121 + }, + { + "id": 200 + }, + { + "id": 240 + }, + { + "id": 432 + }, + { + "id": 433 + }, + { + "id": 19 + }, + { + "id": 19, + "damage": 1 + }, + { + "id": -132 + }, + { + "id": -132, + "damage": 1 + }, + { + "id": -132, + "damage": 2 + }, + { + "id": -132, + "damage": 3 + }, + { + "id": -132, + "damage": 4 + }, + { + "id": -132, + "damage": 8 + }, + { + "id": -132, + "damage": 9 + }, + { + "id": -132, + "damage": 10 + }, + { + "id": -132, + "damage": 11 + }, + { + "id": -132, + "damage": 12 + }, + { + "id": 298 + }, + { + "id": 302 + }, + { + "id": 306 + }, + { + "id": 314 + }, + { + "id": 310 + }, + { + "id": 748 + }, + { + "id": 299 + }, + { + "id": 303 + }, + { + "id": 307 + }, + { + "id": 315 + }, + { + "id": 311 + }, + { + "id": 749 + }, + { + "id": 300 + }, + { + "id": 304 + }, + { + "id": 308 + }, + { + "id": 316 + }, + { + "id": 312 + }, + { + "id": 750 + }, + { + "id": 301 + }, + { + "id": 305 + }, + { + "id": 309 + }, + { + "id": 317 + }, + { + "id": 313 + }, + { + "id": 751 + }, + { + "id": 268 + }, + { + "id": 272 + }, + { + "id": 267 + }, + { + "id": 283 + }, + { + "id": 276 + }, + { + "id": 743 + }, + { + "id": 271 + }, + { + "id": 275 + }, + { + "id": 258 + }, + { + "id": 286 + }, + { + "id": 279 + }, + { + "id": 746 + }, + { + "id": 270 + }, + { + "id": 274 + }, + { + "id": 257 + }, + { + "id": 285 + }, + { + "id": 278 + }, + { + "id": 745 + }, + { + "id": 269 + }, + { + "id": 273 + }, + { + "id": 256 + }, + { + "id": 284 + }, + { + "id": 277 + }, + { + "id": 744 + }, + { + "id": 290 + }, + { + "id": 291 + }, + { + "id": 292 + }, + { + "id": 294 + }, + { + "id": 293 + }, + { + "id": 747 + }, + { + "id": 261 + }, + { + "id": 471 + }, + { + "id": 262 + }, + { + "id": 262, + "damage": 6 + }, + { + "id": 262, + "damage": 7 + }, + { + "id": 262, + "damage": 8 + }, + { + "id": 262, + "damage": 9 + }, + { + "id": 262, + "damage": 10 + }, + { + "id": 262, + "damage": 11 + }, + { + "id": 262, + "damage": 12 + }, + { + "id": 262, + "damage": 13 + }, + { + "id": 262, + "damage": 14 + }, + { + "id": 262, + "damage": 15 + }, + { + "id": 262, + "damage": 16 + }, + { + "id": 262, + "damage": 17 + }, + { + "id": 262, + "damage": 18 + }, + { + "id": 262, + "damage": 19 + }, + { + "id": 262, + "damage": 20 + }, + { + "id": 262, + "damage": 21 + }, + { + "id": 262, + "damage": 22 + }, + { + "id": 262, + "damage": 23 + }, + { + "id": 262, + "damage": 24 + }, + { + "id": 262, + "damage": 25 + }, + { + "id": 262, + "damage": 26 + }, + { + "id": 262, + "damage": 27 + }, + { + "id": 262, + "damage": 28 + }, + { + "id": 262, + "damage": 29 + }, + { + "id": 262, + "damage": 30 + }, + { + "id": 262, + "damage": 31 + }, + { + "id": 262, + "damage": 32 + }, + { + "id": 262, + "damage": 33 + }, + { + "id": 262, + "damage": 34 + }, + { + "id": 262, + "damage": 35 + }, + { + "id": 262, + "damage": 36 + }, + { + "id": 262, + "damage": 37 + }, + { + "id": 262, + "damage": 38 + }, + { + "id": 262, + "damage": 39 + }, + { + "id": 262, + "damage": 40 + }, + { + "id": 262, + "damage": 41 + }, + { + "id": 262, + "damage": 42 + }, + { + "id": 262, + "damage": 43 + }, + { + "id": 513 + }, + { + "id": 366 + }, + { + "id": 320 + }, + { + "id": 364 + }, + { + "id": 424 + }, + { + "id": 412 + }, + { + "id": 350 + }, + { + "id": 463 + }, + { + "id": 297 + }, + { + "id": 282 + }, + { + "id": 459 + }, + { + "id": 413 + }, + { + "id": 393 + }, + { + "id": 357 + }, + { + "id": 400 + }, + { + "id": 354 + }, + { + "id": 464 + }, + { + "id": 346 + }, + { + "id": 398 + }, + { + "id": 757 + }, + { + "id": 332 + }, + { + "id": 359 + }, + { + "id": 259 + }, + { + "id": 420 + }, + { + "id": 347 + }, + { + "id": 345 + }, + { + "id": 395 + }, + { + "id": 395, + "damage": 2 + }, + { + "id": 329 + }, + { + "id": 416 + }, + { + "id": 417 + }, + { + "id": 418 + }, + { + "id": 419 + }, + { + "id": 455 + }, + { + "id": 469 + }, + { + "id": 444 + }, + { + "id": 450 + }, + { + "id": 374 + }, + { + "id": 384 + }, + { + "id": 373 + }, + { + "id": 373, + "damage": 1 + }, + { + "id": 373, + "damage": 2 + }, + { + "id": 373, + "damage": 3 + }, + { + "id": 373, + "damage": 4 + }, + { + "id": 373, + "damage": 5 + }, + { + "id": 373, + "damage": 6 + }, + { + "id": 373, + "damage": 7 + }, + { + "id": 373, + "damage": 8 + }, + { + "id": 373, + "damage": 9 + }, + { + "id": 373, + "damage": 10 + }, + { + "id": 373, + "damage": 11 + }, + { + "id": 373, + "damage": 12 + }, + { + "id": 373, + "damage": 13 + }, + { + "id": 373, + "damage": 14 + }, + { + "id": 373, + "damage": 15 + }, + { + "id": 373, + "damage": 16 + }, + { + "id": 373, + "damage": 17 + }, + { + "id": 373, + "damage": 18 + }, + { + "id": 373, + "damage": 19 + }, + { + "id": 373, + "damage": 20 + }, + { + "id": 373, + "damage": 21 + }, + { + "id": 373, + "damage": 22 + }, + { + "id": 373, + "damage": 23 + }, + { + "id": 373, + "damage": 24 + }, + { + "id": 373, + "damage": 25 + }, + { + "id": 373, + "damage": 26 + }, + { + "id": 373, + "damage": 27 + }, + { + "id": 373, + "damage": 28 + }, + { + "id": 373, + "damage": 29 + }, + { + "id": 373, + "damage": 30 + }, + { + "id": 373, + "damage": 31 + }, + { + "id": 373, + "damage": 32 + }, + { + "id": 373, + "damage": 33 + }, + { + "id": 373, + "damage": 34 + }, + { + "id": 373, + "damage": 35 + }, + { + "id": 373, + "damage": 36 + }, + { + "id": 373, + "damage": 37 + }, + { + "id": 373, + "damage": 38 + }, + { + "id": 373, + "damage": 39 + }, + { + "id": 373, + "damage": 40 + }, + { + "id": 373, + "damage": 41 + }, + { + "id": 373, + "damage": 42 + }, + { + "id": 438 + }, + { + "id": 438, + "damage": 1 + }, + { + "id": 438, + "damage": 2 + }, + { + "id": 438, + "damage": 3 + }, + { + "id": 438, + "damage": 4 + }, + { + "id": 438, + "damage": 5 + }, + { + "id": 438, + "damage": 6 + }, + { + "id": 438, + "damage": 7 + }, + { + "id": 438, + "damage": 8 + }, + { + "id": 438, + "damage": 9 + }, + { + "id": 438, + "damage": 10 + }, + { + "id": 438, + "damage": 11 + }, + { + "id": 438, + "damage": 12 + }, + { + "id": 438, + "damage": 13 + }, + { + "id": 438, + "damage": 14 + }, + { + "id": 438, + "damage": 15 + }, + { + "id": 438, + "damage": 16 + }, + { + "id": 438, + "damage": 17 + }, + { + "id": 438, + "damage": 18 + }, + { + "id": 438, + "damage": 19 + }, + { + "id": 438, + "damage": 20 + }, + { + "id": 438, + "damage": 21 + }, + { + "id": 438, + "damage": 22 + }, + { + "id": 438, + "damage": 23 + }, + { + "id": 438, + "damage": 24 + }, + { + "id": 438, + "damage": 25 + }, + { + "id": 438, + "damage": 26 + }, + { + "id": 438, + "damage": 27 + }, + { + "id": 438, + "damage": 28 + }, + { + "id": 438, + "damage": 29 + }, + { + "id": 438, + "damage": 30 + }, + { + "id": 438, + "damage": 31 + }, + { + "id": 438, + "damage": 32 + }, + { + "id": 438, + "damage": 33 + }, + { + "id": 438, + "damage": 34 + }, + { + "id": 438, + "damage": 35 + }, + { + "id": 438, + "damage": 36 + }, + { + "id": 438, + "damage": 37 + }, + { + "id": 438, + "damage": 38 + }, + { + "id": 438, + "damage": 39 + }, + { + "id": 438, + "damage": 40 + }, + { + "id": 438, + "damage": 41 + }, + { + "id": 438, + "damage": 42 + }, + { + "id": 441 + }, + { + "id": 441, + "damage": 1 + }, + { + "id": 441, + "damage": 2 + }, + { + "id": 441, + "damage": 3 + }, + { + "id": 441, + "damage": 4 + }, + { + "id": 441, + "damage": 5 + }, + { + "id": 441, + "damage": 6 + }, + { + "id": 441, + "damage": 7 + }, + { + "id": 441, + "damage": 8 + }, + { + "id": 441, + "damage": 9 + }, + { + "id": 441, + "damage": 10 + }, + { + "id": 441, + "damage": 11 + }, + { + "id": 441, + "damage": 12 + }, + { + "id": 441, + "damage": 13 + }, + { + "id": 441, + "damage": 14 + }, + { + "id": 441, + "damage": 15 + }, + { + "id": 441, + "damage": 16 + }, + { + "id": 441, + "damage": 17 + }, + { + "id": 441, + "damage": 18 + }, + { + "id": 441, + "damage": 19 + }, + { + "id": 441, + "damage": 20 + }, + { + "id": 441, + "damage": 21 + }, + { + "id": 441, + "damage": 22 + }, + { + "id": 441, + "damage": 23 + }, + { + "id": 441, + "damage": 24 + }, + { + "id": 441, + "damage": 25 + }, + { + "id": 441, + "damage": 26 + }, + { + "id": 441, + "damage": 27 + }, + { + "id": 441, + "damage": 28 + }, + { + "id": 441, + "damage": 29 + }, + { + "id": 441, + "damage": 30 + }, + { + "id": 441, + "damage": 31 + }, + { + "id": 441, + "damage": 32 + }, + { + "id": 441, + "damage": 33 + }, + { + "id": 441, + "damage": 34 + }, + { + "id": 441, + "damage": 35 + }, + { + "id": 441, + "damage": 36 + }, + { + "id": 441, + "damage": 37 + }, + { + "id": 441, + "damage": 38 + }, + { + "id": 441, + "damage": 39 + }, + { + "id": 441, + "damage": 40 + }, + { + "id": 441, + "damage": 41 + }, + { + "id": 441, + "damage": 42 + }, + { + "id": 280 + }, + { + "id": 355 + }, + { + "id": 355, + "damage": 8 + }, + { + "id": 355, + "damage": 7 + }, + { + "id": 355, + "damage": 15 + }, + { + "id": 355, + "damage": 12 + }, + { + "id": 355, + "damage": 14 + }, + { + "id": 355, + "damage": 1 + }, + { + "id": 355, + "damage": 4 + }, + { + "id": 355, + "damage": 5 + }, + { + "id": 355, + "damage": 13 + }, + { + "id": 355, + "damage": 9 + }, + { + "id": 355, + "damage": 3 + }, + { + "id": 355, + "damage": 11 + }, + { + "id": 355, + "damage": 10 + }, + { + "id": 355, + "damage": 2 + }, + { + "id": 355, + "damage": 6 + }, + { + "id": 50 + }, + { + "id": -268 + }, + { + "id": -156 + }, + { + "id": -208 + }, + { + "id": -269 + }, + { + "id": 58 + }, + { + "id": -200 + }, + { + "id": -201 + }, + { + "id": -202 + }, + { + "id": -219 + }, + { + "id": 720 + }, + { + "id": 801 + }, + { + "id": 61 + }, + { + "id": -196 + }, + { + "id": -198 + }, + { + "id": -272 + }, + { + "id": 238, + "damage": 8 + }, + { + "id": 238 + }, + { + "id": 238, + "damage": 12 + }, + { + "id": 238, + "damage": 4 + }, + { + "id": 379 + }, + { + "id": 145 + }, + { + "id": 145, + "damage": 4 + }, + { + "id": 145, + "damage": 8 + }, + { + "id": -195 + }, + { + "id": 116 + }, + { + "id": 47 + }, + { + "id": -194 + }, + { + "id": 380 + }, + { + "id": -213 + }, + { + "id": 54 + }, + { + "id": 146 + }, + { + "id": 130 + }, + { + "id": -203 + }, + { + "id": 205 + }, + { + "id": 218 + }, + { + "id": 218, + "damage": 8 + }, + { + "id": 218, + "damage": 7 + }, + { + "id": 218, + "damage": 15 + }, + { + "id": 218, + "damage": 12 + }, + { + "id": 218, + "damage": 14 + }, + { + "id": 218, + "damage": 1 + }, + { + "id": 218, + "damage": 4 + }, + { + "id": 218, + "damage": 5 + }, + { + "id": 218, + "damage": 13 + }, + { + "id": 218, + "damage": 9 + }, + { + "id": 218, + "damage": 3 + }, + { + "id": 218, + "damage": 11 + }, + { + "id": 218, + "damage": 10 + }, + { + "id": 218, + "damage": 2 + }, + { + "id": 218, + "damage": 6 + }, + { + "id": 425 + }, + { + "id": 25 + }, + { + "id": 84 + }, + { + "id": 500 + }, + { + "id": 501 + }, + { + "id": 502 + }, + { + "id": 503 + }, + { + "id": 504 + }, + { + "id": 505 + }, + { + "id": 506 + }, + { + "id": 507 + }, + { + "id": 508 + }, + { + "id": 509 + }, + { + "id": 510 + }, + { + "id": 511 + }, + { + "id": 759 + }, + { + "id": 348 + }, + { + "id": 89 + }, + { + "id": 123 + }, + { + "id": 169 + }, + { + "id": 323 + }, + { + "id": 472 + }, + { + "id": 473 + }, + { + "id": 474 + }, + { + "id": 475 + }, + { + "id": 476 + }, + { + "id": 753 + }, + { + "id": 754 + }, + { + "id": 321 + }, + { + "id": 389 + }, + { + "id": 737 + }, + { + "id": 390 + }, + { + "id": 281 + }, + { + "id": 325 + }, + { + "id": 325, + "damage": 1 + }, + { + "id": 325, + "damage": 8 + }, + { + "id": 325, + "damage": 10 + }, + { + "id": 325, + "damage": 2 + }, + { + "id": 325, + "damage": 3 + }, + { + "id": 325, + "damage": 4 + }, + { + "id": 325, + "damage": 5 + }, + { + "id": 397, + "damage": 3 + }, + { + "id": 397, + "damage": 2 + }, + { + "id": 397, + "damage": 4 + }, + { + "id": 397, + "damage": 5 + }, + { + "id": 397 + }, + { + "id": 397, + "damage": 1 + }, + { + "id": 138 + }, + { + "id": -206 + }, + { + "id": -157 + }, + { + "id": -197 + }, + { + "id": 120 + }, + { + "id": 263 + }, + { + "id": 263, + "damage": 1 + }, + { + "id": 264 + }, + { + "id": 452 + }, + { + "id": 265 + }, + { + "id": 752 + }, + { + "id": 742 + }, + { + "id": 371 + }, + { + "id": 266 + }, + { + "id": 388 + }, + { + "id": 406 + }, + { + "id": 337 + }, + { + "id": 336 + }, + { + "id": 405 + }, + { + "id": 409 + }, + { + "id": 422 + }, + { + "id": 465 + }, + { + "id": 467 + }, + { + "id": 468 + }, + { + "id": 470 + }, + { + "id": 287 + }, + { + "id": 288 + }, + { + "id": 318 + }, + { + "id": 289 + }, + { + "id": 334 + }, + { + "id": 415 + }, + { + "id": 414 + }, + { + "id": 385 + }, + { + "id": 369 + }, + { + "id": 377 + }, + { + "id": 378 + }, + { + "id": 376 + }, + { + "id": 437 + }, + { + "id": 445 + }, + { + "id": 370 + }, + { + "id": 341 + }, + { + "id": 368 + }, + { + "id": 381 + }, + { + "id": 399 + }, + { + "id": 208 + }, + { + "id": 426 + }, + { + "id": 339 + }, + { + "id": 340 + }, + { + "id": 386 + }, + { + "id": 36 + }, + { + "id": -12 + }, + { + "id": -13 + }, + { + "id": -14 + }, + { + "id": -15 + }, + { + "id": -16 + }, + { + "id": -17 + }, + { + "id": -18 + }, + { + "id": -19 + }, + { + "id": -20 + }, + { + "id": -21 + }, + { + "id": -22 + }, + { + "id": -23 + }, + { + "id": -24 + }, + { + "id": -25 + }, + { + "id": -26 + }, + { + "id": -27 + }, + { + "id": -28 + }, + { + "id": -29 + }, + { + "id": -30 + }, + { + "id": -31 + }, + { + "id": -32 + }, + { + "id": -33 + }, + { + "id": -34 + }, + { + "id": -35 + }, + { + "id": -36 + }, + { + "id": -37 + }, + { + "id": -38 + }, + { + "id": -39 + }, + { + "id": -40 + }, + { + "id": -41 + }, + { + "id": -42 + }, + { + "id": -43 + }, + { + "id": -44 + }, + { + "id": -45 + }, + { + "id": -46 + }, + { + "id": -47 + }, + { + "id": -48 + }, + { + "id": -49 + }, + { + "id": -50 + }, + { + "id": -51 + }, + { + "id": -52 + }, + { + "id": -53 + }, + { + "id": -54 + }, + { + "id": -55 + }, + { + "id": -56 + }, + { + "id": -57 + }, + { + "id": -58 + }, + { + "id": -59 + }, + { + "id": -60 + }, + { + "id": -61 + }, + { + "id": -62 + }, + { + "id": -63 + }, + { + "id": -64 + }, + { + "id": -65 + }, + { + "id": -66 + }, + { + "id": -67 + }, + { + "id": -68 + }, + { + "id": -69 + }, + { + "id": -70 + }, + { + "id": -71 + }, + { + "id": -72 + }, + { + "id": -73 + }, + { + "id": -74 + }, + { + "id": -75 + }, + { + "id": -76 + }, + { + "id": -77 + }, + { + "id": -78 + }, + { + "id": -79 + }, + { + "id": -80 + }, + { + "id": -81 + }, + { + "id": -82 + }, + { + "id": -83 + }, + { + "id": -84 + }, + { + "id": -85 + }, + { + "id": -86 + }, + { + "id": -87 + }, + { + "id": -88 + }, + { + "id": -89 + }, + { + "id": -90 + }, + { + "id": -91 + }, + { + "id": -92 + }, + { + "id": -93 + }, + { + "id": -94 + }, + { + "id": -95 + }, + { + "id": -96 + }, + { + "id": -97 + }, + { + "id": -98 + }, + { + "id": -99 + }, + { + "id": -100 + }, + { + "id": -101 + }, + { + "id": -102 + }, + { + "id": -103 + }, + { + "id": -104 + }, + { + "id": -105 + }, + { + "id": -106 + }, + { + "id": -107 + }, + { + "id": -108 + }, + { + "id": -109 + }, + { + "id": -110 + }, + { + "id": -111 + }, + { + "id": -112 + }, + { + "id": -113 + }, + { + "id": -114 + }, + { + "id": -115 + }, + { + "id": -116 + }, + { + "id": -117 + }, + { + "id": -118 + }, + { + "id": -119 + }, + { + "id": -120 + }, + { + "id": -121 + }, + { + "id": -122 + }, + { + "id": -123 + }, + { + "id": -124 + }, + { + "id": -125 + }, + { + "id": -126 + }, + { + "id": -127 + }, + { + "id": -128 + }, + { + "id": -129 + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" + }, + { + "id": 403, + "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" + }, + { + "id": 333 + }, + { + "id": 333, + "damage": 1 + }, + { + "id": 333, + "damage": 2 + }, + { + "id": 333, + "damage": 3 + }, + { + "id": 333, + "damage": 4 + }, + { + "id": 333, + "damage": 5 + }, + { + "id": 66 + }, + { + "id": 27 + }, + { + "id": 28 + }, + { + "id": 126 + }, + { + "id": 328 + }, + { + "id": 342 + }, + { + "id": 408 + }, + { + "id": 407 + }, + { + "id": 331 + }, + { + "id": 152 + }, + { + "id": 76 + }, + { + "id": 69 + }, + { + "id": 143 + }, + { + "id": -144 + }, + { + "id": -141 + }, + { + "id": -143 + }, + { + "id": -140 + }, + { + "id": -142 + }, + { + "id": 77 + }, + { + "id": -260 + }, + { + "id": -261 + }, + { + "id": -296 + }, + { + "id": 131 + }, + { + "id": 72 + }, + { + "id": -154 + }, + { + "id": -151 + }, + { + "id": -153 + }, + { + "id": -150 + }, + { + "id": -152 + }, + { + "id": -262 + }, + { + "id": -263 + }, + { + "id": 70 + }, + { + "id": 147 + }, + { + "id": 148 + }, + { + "id": -295 + }, + { + "id": 251 + }, + { + "id": 151 + }, + { + "id": 356 + }, + { + "id": 404 + }, + { + "id": 410 + }, + { + "id": 125, + "damage": 3 + }, + { + "id": 23, + "damage": 3 + }, + { + "id": 33, + "damage": 1 + }, + { + "id": 29, + "damage": 1 + }, + { + "id": 46 + }, + { + "id": 421 + }, + { + "id": -204 + }, + { + "id": 446 + }, + { + "id": 446, + "damage": 8 + }, + { + "id": 446, + "damage": 7 + }, + { + "id": 446, + "damage": 15 + }, + { + "id": 446, + "damage": 12 + }, + { + "id": 446, + "damage": 14 + }, + { + "id": 446, + "damage": 1 + }, + { + "id": 446, + "damage": 4 + }, + { + "id": 446, + "damage": 5 + }, + { + "id": 446, + "damage": 13 + }, + { + "id": 446, + "damage": 9 + }, + { + "id": 446, + "damage": 3 + }, + { + "id": 446, + "damage": 11 + }, + { + "id": 446, + "damage": 10 + }, + { + "id": 446, + "damage": 2 + }, + { + "id": 446, + "damage": 6 + }, + { + "id": 446, + "damage": 15, + "nbt_b64": "CgAAAwQAVHlwZQEAAAAA" + }, + { + "id": 434 + }, + { + "id": 434, + "damage": 1 + }, + { + "id": 434, + "damage": 2 + }, + { + "id": 434, + "damage": 3 + }, + { + "id": 434, + "damage": 4 + }, + { + "id": 434, + "damage": 5 + }, + { + "id": 434, + "damage": 6 + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 401, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + }, + { + "id": 402, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d\/wA=" + }, + { + "id": 402, + "damage": 8, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H\/wA=" + }, + { + "id": 402, + "damage": 7, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d\/wA=" + }, + { + "id": 402, + "damage": 15, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw\/wA=" + }, + { + "id": 402, + "damage": 12, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6\/wA=" + }, + { + "id": 402, + "damage": 14, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5\/wA=" + }, + { + "id": 402, + "damage": 1, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w\/wA=" + }, + { + "id": 402, + "damage": 4, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8\/wA=" + }, + { + "id": 402, + "damage": 5, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ\/wA=" + }, + { + "id": 402, + "damage": 13, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H\/wA=" + }, + { + "id": 402, + "damage": 9, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz\/wA=" + }, + { + "id": 402, + "damage": 3, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD\/wA=" + }, + { + "id": 402, + "damage": 11, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+\/wA=" + }, + { + "id": 402, + "damage": 10, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA\/wA=" + }, + { + "id": 402, + "damage": 2, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe\/wA=" + }, + { + "id": 402, + "damage": 6, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW\/wA=" + }, + { + "id": 758 + }, + { + "id": -239 + }, + { + "id": 741 + } +] \ No newline at end of file diff --git a/resources/legacy_recipes.json b/resources/legacy_recipes.json new file mode 100644 index 0000000000..0647aad0c8 --- /dev/null +++ b/resources/legacy_recipes.json @@ -0,0 +1,49988 @@ +{ + "potion_container_change": [ + { + "ingredient": { + "id": 289 + }, + "input_item_id": 373, + "output_item_id": 438 + }, + { + "ingredient": { + "id": 437 + }, + "input_item_id": 438, + "output_item_id": 441 + } + ], + "potion_type": [ + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 12 + }, + "output": { + "id": 373, + "damage": 13 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 14 + }, + "output": { + "id": 373, + "damage": 15 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 17 + }, + "output": { + "id": 373, + "damage": 18 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 19 + }, + "output": { + "id": 373, + "damage": 20 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 25 + }, + "output": { + "id": 373, + "damage": 26 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 28 + }, + "output": { + "id": 373, + "damage": 29 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 31 + }, + "output": { + "id": 373, + "damage": 32 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 34 + }, + "output": { + "id": 373, + "damage": 35 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 37 + }, + "output": { + "id": 373, + "damage": 38 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 40 + }, + "output": { + "id": 373, + "damage": 41 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 5 + }, + "output": { + "id": 373, + "damage": 6 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 7 + }, + "output": { + "id": 373, + "damage": 8 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373, + "damage": 9 + }, + "output": { + "id": 373, + "damage": 10 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 12 + }, + "output": { + "id": 438, + "damage": 13 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 14 + }, + "output": { + "id": 438, + "damage": 15 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 17 + }, + "output": { + "id": 438, + "damage": 18 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 19 + }, + "output": { + "id": 438, + "damage": 20 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 25 + }, + "output": { + "id": 438, + "damage": 26 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 28 + }, + "output": { + "id": 438, + "damage": 29 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 31 + }, + "output": { + "id": 438, + "damage": 32 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 34 + }, + "output": { + "id": 438, + "damage": 35 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 37 + }, + "output": { + "id": 438, + "damage": 38 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 40 + }, + "output": { + "id": 438, + "damage": 41 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 5 + }, + "output": { + "id": 438, + "damage": 6 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 7 + }, + "output": { + "id": 438, + "damage": 8 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438, + "damage": 9 + }, + "output": { + "id": 438, + "damage": 10 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 12 + }, + "output": { + "id": 441, + "damage": 13 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 14 + }, + "output": { + "id": 441, + "damage": 15 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 17 + }, + "output": { + "id": 441, + "damage": 18 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 19 + }, + "output": { + "id": 441, + "damage": 20 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 25 + }, + "output": { + "id": 441, + "damage": 26 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 28 + }, + "output": { + "id": 441, + "damage": 29 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 31 + }, + "output": { + "id": 441, + "damage": 32 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 34 + }, + "output": { + "id": 441, + "damage": 35 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 37 + }, + "output": { + "id": 441, + "damage": 38 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 40 + }, + "output": { + "id": 441, + "damage": 41 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 5 + }, + "output": { + "id": 441, + "damage": 6 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 7 + }, + "output": { + "id": 441, + "damage": 8 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441, + "damage": 9 + }, + "output": { + "id": 441, + "damage": 10 + } + }, + { + "ingredient": { + "id": 331 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 14 + }, + "output": { + "id": 373, + "damage": 16 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 17 + }, + "output": { + "id": 373, + "damage": 42 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 21 + }, + "output": { + "id": 373, + "damage": 22 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 23 + }, + "output": { + "id": 373, + "damage": 24 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 25 + }, + "output": { + "id": 373, + "damage": 27 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 28 + }, + "output": { + "id": 373, + "damage": 30 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 31 + }, + "output": { + "id": 373, + "damage": 33 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 37 + }, + "output": { + "id": 373, + "damage": 39 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373, + "damage": 9 + }, + "output": { + "id": 373, + "damage": 11 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 3 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 14 + }, + "output": { + "id": 438, + "damage": 16 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 17 + }, + "output": { + "id": 438, + "damage": 42 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 21 + }, + "output": { + "id": 438, + "damage": 22 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 23 + }, + "output": { + "id": 438, + "damage": 24 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 25 + }, + "output": { + "id": 438, + "damage": 27 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 28 + }, + "output": { + "id": 438, + "damage": 30 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 31 + }, + "output": { + "id": 438, + "damage": 33 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 37 + }, + "output": { + "id": 438, + "damage": 39 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438, + "damage": 9 + }, + "output": { + "id": 438, + "damage": 11 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 3 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 14 + }, + "output": { + "id": 441, + "damage": 16 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 17 + }, + "output": { + "id": 441, + "damage": 42 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 21 + }, + "output": { + "id": 441, + "damage": 22 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 23 + }, + "output": { + "id": 441, + "damage": 24 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 25 + }, + "output": { + "id": 441, + "damage": 27 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 28 + }, + "output": { + "id": 441, + "damage": 30 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 31 + }, + "output": { + "id": 441, + "damage": 33 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 37 + }, + "output": { + "id": 441, + "damage": 39 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441, + "damage": 9 + }, + "output": { + "id": 441, + "damage": 11 + } + }, + { + "ingredient": { + "id": 348 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 3 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 14 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 14 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 14 + } + }, + { + "ingredient": { + "id": 353 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 28 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 28 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 28 + } + }, + { + "ingredient": { + "id": 370 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 372 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 4 + } + }, + { + "ingredient": { + "id": 372 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 4 + } + }, + { + "ingredient": { + "id": 372 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 4 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 25 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 25 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 25 + } + }, + { + "ingredient": { + "id": 375 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 10 + }, + "output": { + "id": 373, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 14 + }, + "output": { + "id": 373, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 15 + }, + "output": { + "id": 373, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 1 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 21 + }, + "output": { + "id": 373, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 22 + }, + "output": { + "id": 373, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 25 + }, + "output": { + "id": 373, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 26 + }, + "output": { + "id": 373, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 27 + }, + "output": { + "id": 373, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 2 + }, + "output": { + "id": 373, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 31 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 32 + }, + "output": { + "id": 373, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 33 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 3 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 5 + }, + "output": { + "id": 373, + "damage": 7 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 6 + }, + "output": { + "id": 373, + "damage": 8 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373, + "damage": 9 + }, + "output": { + "id": 373, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 10 + }, + "output": { + "id": 438, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 14 + }, + "output": { + "id": 438, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 15 + }, + "output": { + "id": 438, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 1 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 21 + }, + "output": { + "id": 438, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 22 + }, + "output": { + "id": 438, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 25 + }, + "output": { + "id": 438, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 26 + }, + "output": { + "id": 438, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 27 + }, + "output": { + "id": 438, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 2 + }, + "output": { + "id": 438, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 31 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 32 + }, + "output": { + "id": 438, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 33 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 3 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 5 + }, + "output": { + "id": 438, + "damage": 7 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 6 + }, + "output": { + "id": 438, + "damage": 8 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438, + "damage": 9 + }, + "output": { + "id": 438, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 10 + }, + "output": { + "id": 441, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 14 + }, + "output": { + "id": 441, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 15 + }, + "output": { + "id": 441, + "damage": 18 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 1 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 21 + }, + "output": { + "id": 441, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 22 + }, + "output": { + "id": 441, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 25 + }, + "output": { + "id": 441, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 26 + }, + "output": { + "id": 441, + "damage": 23 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 27 + }, + "output": { + "id": 441, + "damage": 24 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 2 + }, + "output": { + "id": 441, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 31 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 32 + }, + "output": { + "id": 441, + "damage": 35 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 33 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 3 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 5 + }, + "output": { + "id": 441, + "damage": 7 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 6 + }, + "output": { + "id": 441, + "damage": 8 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441, + "damage": 9 + }, + "output": { + "id": 441, + "damage": 17 + } + }, + { + "ingredient": { + "id": 376 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 34 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 31 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 31 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 31 + } + }, + { + "ingredient": { + "id": 377 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 12 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 12 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 12 + } + }, + { + "ingredient": { + "id": 378 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 21 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 21 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 21 + } + }, + { + "ingredient": { + "id": 382 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 396 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 5 + } + }, + { + "ingredient": { + "id": 396 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 5 + } + }, + { + "ingredient": { + "id": 396 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 5 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 9 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 373 + }, + "output": { + "id": 373, + "damage": 1 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 9 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 438 + }, + "output": { + "id": 438, + "damage": 1 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 9 + } + }, + { + "ingredient": { + "id": 414 + }, + "input": { + "id": 441 + }, + "output": { + "id": 441, + "damage": 1 + } + }, + { + "ingredient": { + "id": 462 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 19 + } + }, + { + "ingredient": { + "id": 462 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 19 + } + }, + { + "ingredient": { + "id": 462 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 19 + } + }, + { + "ingredient": { + "id": 469 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 37 + } + }, + { + "ingredient": { + "id": 469 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 37 + } + }, + { + "ingredient": { + "id": 469 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 37 + } + }, + { + "ingredient": { + "id": 470 + }, + "input": { + "id": 373, + "damage": 4 + }, + "output": { + "id": 373, + "damage": 40 + } + }, + { + "ingredient": { + "id": 470 + }, + "input": { + "id": 438, + "damage": 4 + }, + "output": { + "id": 438, + "damage": 40 + } + }, + { + "ingredient": { + "id": 470 + }, + "input": { + "id": 441, + "damage": 4 + }, + "output": { + "id": 441, + "damage": 40 + } + } + ], + "shaped": [ + { + "block": "crafting_table", + "input": { + "A": { + "id": -10, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 8, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -139, + "damage": -1 + } + }, + "output": [ + { + "id": 464, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -155, + "damage": -1 + }, + "B": { + "id": 50, + "damage": -1 + } + }, + "output": [ + { + "id": 91 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -163, + "damage": -1 + }, + "B": { + "id": 287, + "damage": -1 + } + }, + "output": [ + { + "id": -165, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "ABA", + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -163 + } + }, + "output": [ + { + "id": 280 + } + ], + "priority": 2, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -183 + } + }, + "output": [ + { + "id": 44, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 10 + } + }, + "output": [ + { + "id": 5, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 11 + } + }, + "output": [ + { + "id": 5, + "damage": 3, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 12 + } + }, + "output": [ + { + "id": 5, + "damage": 4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 13 + } + }, + "output": [ + { + "id": 5, + "damage": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 1 + } + }, + "output": [ + { + "id": 5, + "damage": 1, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 2 + } + }, + "output": [ + { + "id": 5, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 3 + } + }, + "output": [ + { + "id": 5, + "damage": 3, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 4 + } + }, + "output": [ + { + "id": 5, + "damage": 4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 5 + } + }, + "output": [ + { + "id": 5, + "damage": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 8 + } + }, + "output": [ + { + "id": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212, + "damage": 9 + } + }, + "output": [ + { + "id": 5, + "damage": 1, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -212 + } + }, + "output": [ + { + "id": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -225, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -225, + "damage": -1 + } + }, + "output": [ + { + "id": -242, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -225, + "damage": -1 + } + }, + "output": [ + { + "id": -299, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -226, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -226, + "damage": -1 + } + }, + "output": [ + { + "id": -243, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -226, + "damage": -1 + } + }, + "output": [ + { + "id": -298, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -234, + "damage": -1 + } + }, + "output": [ + { + "id": -235, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -240, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -240, + "damage": -1 + } + }, + "output": [ + { + "id": -242, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -240, + "damage": -1 + } + }, + "output": [ + { + "id": -300, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -241, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -241, + "damage": -1 + } + }, + "output": [ + { + "id": -243, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -241, + "damage": -1 + } + }, + "output": [ + { + "id": -301, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 84 + } + ], + "priority": 2, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 513 + } + ], + "priority": 2, + "shape": [ + "ABA", + "AAA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": -256, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 268 + } + ], + "priority": 2, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 269 + } + ], + "priority": 2, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 270 + } + ], + "priority": 2, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 271 + } + ], + "priority": 2, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 290 + } + ], + "priority": 2, + "shape": [ + "AA ", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 753, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 25 + } + ], + "priority": 2, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 340, + "damage": -1 + } + }, + "output": [ + { + "id": 47 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 4, + "damage": -1 + }, + "C": { + "id": 265, + "damage": -1 + }, + "D": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 33, + "damage": 1 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BCB", + "BDB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + }, + "B": { + "id": 736, + "damage": -1 + } + }, + "output": [ + { + "id": -219 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -246, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -254, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -260 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -262 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -264, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 280, + "count": 4 + } + ], + "priority": 2, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 281, + "count": 4 + } + ], + "priority": 2, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 54 + } + ], + "priority": 2, + "shape": [ + "AAA", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 58 + } + ], + "priority": 2, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 755, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 84 + } + ], + "priority": 2, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 513 + } + ], + "priority": 2, + "shape": [ + "ABA", + "AAA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": -257, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 268 + } + ], + "priority": 2, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 269 + } + ], + "priority": 2, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 270 + } + ], + "priority": 2, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 271 + } + ], + "priority": 2, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 290 + } + ], + "priority": 2, + "shape": [ + "AA ", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 754, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 25 + } + ], + "priority": 2, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 340, + "damage": -1 + } + }, + "output": [ + { + "id": 47 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 4, + "damage": -1 + }, + "C": { + "id": 265, + "damage": -1 + }, + "D": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 33, + "damage": 1 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BCB", + "BDB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + }, + "B": { + "id": 736, + "damage": -1 + } + }, + "output": [ + { + "id": -219 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -247, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -255, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -261 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -263 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -265, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 280, + "count": 4 + } + ], + "priority": 2, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 281, + "count": 4 + } + ], + "priority": 2, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 54 + } + ], + "priority": 2, + "shape": [ + "AAA", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 58 + } + ], + "priority": 2, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 756, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -264, + "damage": -1 + }, + "B": { + "id": 47, + "damage": -1 + } + }, + "output": [ + { + "id": -194 + } + ], + "priority": 2, + "shape": [ + "AAA", + " B ", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -264, + "damage": -1 + } + }, + "output": [ + { + "id": -213 + } + ], + "priority": 2, + "shape": [ + "A A", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -265, + "damage": -1 + }, + "B": { + "id": 47, + "damage": -1 + } + }, + "output": [ + { + "id": -194 + } + ], + "priority": 2, + "shape": [ + "AAA", + " B ", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -265, + "damage": -1 + } + }, + "output": [ + { + "id": -213 + } + ], + "priority": 2, + "shape": [ + "A A", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -270, + "damage": -1 + } + }, + "output": [ + { + "id": 742, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 272 + } + ], + "priority": 2, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 273 + } + ], + "priority": 2, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 274 + } + ], + "priority": 2, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 275 + } + ], + "priority": 2, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 291 + } + ], + "priority": 2, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": -276, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": -277, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": -282, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": -291, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": 61 + } + ], + "priority": 2, + "shape": [ + "AAA", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -274, + "damage": -1 + } + }, + "output": [ + { + "id": -275, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -274, + "damage": -1 + } + }, + "output": [ + { + "id": -278, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -274, + "damage": -1 + } + }, + "output": [ + { + "id": -284, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -289, + "damage": -1 + }, + "B": { + "id": 89, + "damage": -1 + } + }, + "output": [ + { + "id": -272 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -274, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -292, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -293, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -295 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -296 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -291, + "damage": -1 + } + }, + "output": [ + { + "id": -297, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -293, + "damage": -1 + } + }, + "output": [ + { + "id": -279 + } + ], + "priority": 0, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -298, + "damage": -1 + } + }, + "output": [ + { + "id": -243, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -299, + "damage": -1 + } + }, + "output": [ + { + "id": -242, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -300, + "damage": -1 + } + }, + "output": [ + { + "id": -242, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -301, + "damage": -1 + } + }, + "output": [ + { + "id": -243, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -5, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 9, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "damage": 1, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -6, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 10, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -7, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "damage": 3, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -8, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "damage": 4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -9, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": -212, + "damage": 13, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": 5, + "damage": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 1 + } + }, + "output": [ + { + "id": -162, + "damage": 6, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 1 + } + }, + "output": [ + { + "id": -169, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 1 + } + }, + "output": [ + { + "id": 1, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 1 + } + }, + "output": [ + { + "id": 139, + "damage": 2, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 2 + } + }, + "output": [ + { + "id": -162, + "damage": 7, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 2 + } + }, + "output": [ + { + "id": -172, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 3 + } + }, + "output": [ + { + "id": -162, + "damage": 4, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 3 + } + }, + "output": [ + { + "id": -170, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 3 + } + }, + "output": [ + { + "id": 1, + "damage": 4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 3 + } + }, + "output": [ + { + "id": 139, + "damage": 3, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 4 + } + }, + "output": [ + { + "id": -162, + "damage": 5, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 4 + } + }, + "output": [ + { + "id": -173, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 5 + } + }, + "output": [ + { + "id": -162, + "damage": 3, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 5 + } + }, + "output": [ + { + "id": -171, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 5 + } + }, + "output": [ + { + "id": 1, + "damage": 6, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 5 + } + }, + "output": [ + { + "id": 139, + "damage": 4, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 6 + } + }, + "output": [ + { + "id": -162, + "damage": 2, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1, + "damage": 6 + } + }, + "output": [ + { + "id": -174, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 10 + } + }, + "output": [ + { + "id": 160, + "damage": 5, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 11 + } + }, + "output": [ + { + "id": 160, + "damage": 4, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 12 + } + }, + "output": [ + { + "id": 160, + "damage": 3, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 13 + } + }, + "output": [ + { + "id": 160, + "damage": 2, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 14 + } + }, + "output": [ + { + "id": 160, + "damage": 1, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 160, + "damage": 15, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 17 + } + }, + "output": [ + { + "id": 160, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 18 + } + }, + "output": [ + { + "id": 160, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 19 + } + }, + "output": [ + { + "id": 160, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 1 + } + }, + "output": [ + { + "id": 160, + "damage": 14, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 2 + } + }, + "output": [ + { + "id": 160, + "damage": 13, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 5 + } + }, + "output": [ + { + "id": 160, + "damage": 10, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 6 + } + }, + "output": [ + { + "id": 160, + "damage": 9, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 7 + } + }, + "output": [ + { + "id": 160, + "damage": 8, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 8 + } + }, + "output": [ + { + "id": 160, + "damage": 7, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 102, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 9 + } + }, + "output": [ + { + "id": 160, + "damage": 6, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 112, + "damage": -1 + }, + "B": { + "id": 405, + "damage": -1 + } + }, + "output": [ + { + "id": 113, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 112, + "damage": -1 + } + }, + "output": [ + { + "id": 114, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 112, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "damage": 9, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 112 + } + }, + "output": [ + { + "id": 44, + "damage": 7, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 12, + "damage": 1 + } + }, + "output": [ + { + "id": 179 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 121, + "damage": -1 + } + }, + "output": [ + { + "id": 206, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 12 + } + }, + "output": [ + { + "id": 24 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 133, + "damage": -1 + } + }, + "output": [ + { + "id": 388, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 152, + "damage": -1 + } + }, + "output": [ + { + "id": 331, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155, + "damage": 3 + } + }, + "output": [ + { + "id": -166, + "damage": 1, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155, + "damage": 3 + } + }, + "output": [ + { + "id": -185, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155 + } + }, + "output": [ + { + "id": -304 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155 + } + }, + "output": [ + { + "id": 155, + "damage": 2, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155 + } + }, + "output": [ + { + "id": 156, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 155 + } + }, + "output": [ + { + "id": 44, + "damage": 6, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 158, + "damage": -1 + }, + "B": { + "id": 47, + "damage": -1 + } + }, + "output": [ + { + "id": -194 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 158, + "damage": -1 + } + }, + "output": [ + { + "id": -213 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 162, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 162, + "damage": 1 + } + }, + "output": [ + { + "id": -212, + "damage": 5, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 162, + "damage": 1 + } + }, + "output": [ + { + "id": 5, + "damage": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 162 + } + }, + "output": [ + { + "id": -212, + "damage": 4, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 162 + } + }, + "output": [ + { + "id": 5, + "damage": 4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 165, + "damage": -1 + } + }, + "output": [ + { + "id": 341, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168, + "damage": 1 + } + }, + "output": [ + { + "id": -3, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168, + "damage": 1 + } + }, + "output": [ + { + "id": 182, + "damage": 3, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168, + "damage": 2 + } + }, + "output": [ + { + "id": -4, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168, + "damage": 2 + } + }, + "output": [ + { + "id": 182, + "damage": 4, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168 + } + }, + "output": [ + { + "id": -2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168 + } + }, + "output": [ + { + "id": 139, + "damage": 11, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 168 + } + }, + "output": [ + { + "id": 182, + "damage": 2, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + } + }, + "output": [ + { + "id": -198 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 1 + } + }, + "output": [ + { + "id": -212, + "damage": 1, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 1 + } + }, + "output": [ + { + "id": 5, + "damage": 1, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 2 + } + }, + "output": [ + { + "id": -212, + "damage": 2, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 2 + } + }, + "output": [ + { + "id": 5, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 3 + } + }, + "output": [ + { + "id": -212, + "damage": 3, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17, + "damage": 3 + } + }, + "output": [ + { + "id": 5, + "damage": 3, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 170, + "damage": -1 + } + }, + "output": [ + { + "id": 296, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 10 + } + }, + "output": [ + { + "id": 171, + "damage": 5, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 11 + } + }, + "output": [ + { + "id": 171, + "damage": 4, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 12 + } + }, + "output": [ + { + "id": 171, + "damage": 3, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 13 + } + }, + "output": [ + { + "id": 171, + "damage": 2, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 14 + } + }, + "output": [ + { + "id": 171, + "damage": 1, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 171, + "damage": 15, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 17 + } + }, + "output": [ + { + "id": 171, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 18 + } + }, + "output": [ + { + "id": 171, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 1 + } + }, + "output": [ + { + "id": 171, + "damage": 14, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 2 + } + }, + "output": [ + { + "id": 171, + "damage": 13, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 5 + } + }, + "output": [ + { + "id": 171, + "damage": 10, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 6 + } + }, + "output": [ + { + "id": 171, + "damage": 9, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 7 + } + }, + "output": [ + { + "id": 171, + "damage": 8, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 8 + } + }, + "output": [ + { + "id": 171, + "damage": 7, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 171 + }, + "B": { + "id": 351, + "damage": 9 + } + }, + "output": [ + { + "id": 171, + "damage": 6, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 10 + } + }, + "output": [ + { + "id": 159, + "damage": 5, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 11 + } + }, + "output": [ + { + "id": 159, + "damage": 4, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 12 + } + }, + "output": [ + { + "id": 159, + "damage": 3, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 13 + } + }, + "output": [ + { + "id": 159, + "damage": 2, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 14 + } + }, + "output": [ + { + "id": 159, + "damage": 1, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 15 + } + }, + "output": [ + { + "id": 159, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 159, + "damage": 15, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 17 + } + }, + "output": [ + { + "id": 159, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 18 + } + }, + "output": [ + { + "id": 159, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 19 + } + }, + "output": [ + { + "id": 159, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 1 + } + }, + "output": [ + { + "id": 159, + "damage": 14, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 2 + } + }, + "output": [ + { + "id": 159, + "damage": 13, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 3 + } + }, + "output": [ + { + "id": 159, + "damage": 12, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 4 + } + }, + "output": [ + { + "id": 159, + "damage": 11, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 5 + } + }, + "output": [ + { + "id": 159, + "damage": 10, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 6 + } + }, + "output": [ + { + "id": 159, + "damage": 9, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 7 + } + }, + "output": [ + { + "id": 159, + "damage": 8, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 8 + } + }, + "output": [ + { + "id": 159, + "damage": 7, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 9 + } + }, + "output": [ + { + "id": 159, + "damage": 6, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 172, + "damage": -1 + }, + "B": { + "id": 351 + } + }, + "output": [ + { + "id": 159, + "damage": 15, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 173, + "damage": -1 + } + }, + "output": [ + { + "id": 263, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 174, + "damage": -1 + } + }, + "output": [ + { + "id": -11 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179, + "damage": 1 + } + }, + "output": [ + { + "id": 182, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179, + "damage": 2 + } + }, + "output": [ + { + "id": -166, + "damage": 4, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179, + "damage": 3 + } + }, + "output": [ + { + "id": -162, + "damage": 1, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179, + "damage": 3 + } + }, + "output": [ + { + "id": -176, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179 + } + }, + "output": [ + { + "id": 139, + "damage": 12, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179 + } + }, + "output": [ + { + "id": 179, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179 + } + }, + "output": [ + { + "id": 180, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 179 + } + }, + "output": [ + { + "id": 182, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17 + } + }, + "output": [ + { + "id": -212, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 17 + } + }, + "output": [ + { + "id": 5, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 182, + "damage": 1 + } + }, + "output": [ + { + "id": 201, + "damage": 2 + } + ], + "priority": 50, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 182 + } + }, + "output": [ + { + "id": 179, + "damage": 1 + } + ], + "priority": 50, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1 + } + }, + "output": [ + { + "id": -166, + "damage": 2, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1 + } + }, + "output": [ + { + "id": -180, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1 + } + }, + "output": [ + { + "id": 70 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1 + } + }, + "output": [ + { + "id": 77 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 1 + } + }, + "output": [ + { + "id": 98, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 10 + } + }, + "output": [ + { + "id": 241, + "damage": 5, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 11 + } + }, + "output": [ + { + "id": 241, + "damage": 4, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 12 + } + }, + "output": [ + { + "id": 241, + "damage": 3, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 13 + } + }, + "output": [ + { + "id": 241, + "damage": 2, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 14 + } + }, + "output": [ + { + "id": 241, + "damage": 1, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 15 + } + }, + "output": [ + { + "id": 241, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 241, + "damage": 15, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 17 + } + }, + "output": [ + { + "id": 241, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 18 + } + }, + "output": [ + { + "id": 241, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 19 + } + }, + "output": [ + { + "id": 241, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 1 + } + }, + "output": [ + { + "id": 241, + "damage": 14, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 2 + } + }, + "output": [ + { + "id": 241, + "damage": 13, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 3 + } + }, + "output": [ + { + "id": 241, + "damage": 12, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 4 + } + }, + "output": [ + { + "id": 241, + "damage": 11, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 5 + } + }, + "output": [ + { + "id": 241, + "damage": 10, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 6 + } + }, + "output": [ + { + "id": 241, + "damage": 9, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 7 + } + }, + "output": [ + { + "id": 241, + "damage": 8, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 8 + } + }, + "output": [ + { + "id": 241, + "damage": 7, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 9 + } + }, + "output": [ + { + "id": 241, + "damage": 6, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 351 + } + }, + "output": [ + { + "id": 241, + "damage": 15, + "count": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 381, + "damage": -1 + }, + "C": { + "id": 370, + "damage": -1 + } + }, + "output": [ + { + "id": 426 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "ACA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 399, + "damage": -1 + }, + "C": { + "id": 49, + "damage": -1 + } + }, + "output": [ + { + "id": 138 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 406, + "damage": -1 + }, + "C": { + "id": -264, + "damage": -1 + } + }, + "output": [ + { + "id": 151 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + }, + "B": { + "id": 406, + "damage": -1 + }, + "C": { + "id": -265, + "damage": -1 + } + }, + "output": [ + { + "id": 151 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + } + }, + "output": [ + { + "id": 102, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20, + "damage": -1 + } + }, + "output": [ + { + "id": 374, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 201, + "damage": -1 + } + }, + "output": [ + { + "id": 203, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 201 + } + }, + "output": [ + { + "id": 182, + "damage": 1, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 206, + "damage": -1 + } + }, + "output": [ + { + "id": -178, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 206, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "damage": 10, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 206 + } + }, + "output": [ + { + "id": -162, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 20 + }, + "B": { + "id": 406, + "damage": -1 + }, + "C": { + "id": 158, + "damage": -1 + } + }, + "output": [ + { + "id": 151 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 215, + "damage": -1 + } + }, + "output": [ + { + "id": -184, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 215, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "damage": 13, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 215 + } + }, + "output": [ + { + "id": 182, + "damage": 7, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 22, + "damage": -1 + } + }, + "output": [ + { + "id": 351, + "damage": 4, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24, + "damage": 1 + } + }, + "output": [ + { + "id": 44, + "damage": 1, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24, + "damage": 2 + } + }, + "output": [ + { + "id": -166, + "damage": 3, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24, + "damage": 3 + } + }, + "output": [ + { + "id": -177, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24, + "damage": 3 + } + }, + "output": [ + { + "id": 182, + "damage": 6, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 10 + } + }, + "output": [ + { + "id": 160, + "damage": 10, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 11 + } + }, + "output": [ + { + "id": 160, + "damage": 11, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 12 + } + }, + "output": [ + { + "id": 160, + "damage": 12, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 13 + } + }, + "output": [ + { + "id": 160, + "damage": 13, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 14 + } + }, + "output": [ + { + "id": 160, + "damage": 14, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 15 + } + }, + "output": [ + { + "id": 160, + "damage": 15, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 1 + } + }, + "output": [ + { + "id": 160, + "damage": 1, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 2 + } + }, + "output": [ + { + "id": 160, + "damage": 2, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 3 + } + }, + "output": [ + { + "id": 160, + "damage": 3, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 4 + } + }, + "output": [ + { + "id": 160, + "damage": 4, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 5 + } + }, + "output": [ + { + "id": 160, + "damage": 5, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 6 + } + }, + "output": [ + { + "id": 160, + "damage": 6, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 7 + } + }, + "output": [ + { + "id": 160, + "damage": 7, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 8 + } + }, + "output": [ + { + "id": 160, + "damage": 8, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241, + "damage": 9 + } + }, + "output": [ + { + "id": 160, + "damage": 9, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 241 + } + }, + "output": [ + { + "id": 160, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24 + } + }, + "output": [ + { + "id": 128, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24 + } + }, + "output": [ + { + "id": 139, + "damage": 5, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24 + } + }, + "output": [ + { + "id": 24, + "damage": 2, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 24 + } + }, + "output": [ + { + "id": 44, + "damage": 1, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 10 + } + }, + "output": [ + { + "id": 262, + "damage": 11, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 11 + } + }, + "output": [ + { + "id": 262, + "damage": 12, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 12 + } + }, + "output": [ + { + "id": 262, + "damage": 13, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 13 + } + }, + "output": [ + { + "id": 262, + "damage": 14, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 14 + } + }, + "output": [ + { + "id": 262, + "damage": 15, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 15 + } + }, + "output": [ + { + "id": 262, + "damage": 16, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 16 + } + }, + "output": [ + { + "id": 262, + "damage": 17, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 17 + } + }, + "output": [ + { + "id": 262, + "damage": 18, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 18 + } + }, + "output": [ + { + "id": 262, + "damage": 19, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 19 + } + }, + "output": [ + { + "id": 262, + "damage": 20, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 20 + } + }, + "output": [ + { + "id": 262, + "damage": 21, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 21 + } + }, + "output": [ + { + "id": 262, + "damage": 22, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 22 + } + }, + "output": [ + { + "id": 262, + "damage": 23, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 23 + } + }, + "output": [ + { + "id": 262, + "damage": 24, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 24 + } + }, + "output": [ + { + "id": 262, + "damage": 25, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 25 + } + }, + "output": [ + { + "id": 262, + "damage": 26, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 26 + } + }, + "output": [ + { + "id": 262, + "damage": 27, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 27 + } + }, + "output": [ + { + "id": 262, + "damage": 28, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 28 + } + }, + "output": [ + { + "id": 262, + "damage": 29, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 29 + } + }, + "output": [ + { + "id": 262, + "damage": 30, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 30 + } + }, + "output": [ + { + "id": 262, + "damage": 31, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 31 + } + }, + "output": [ + { + "id": 262, + "damage": 32, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 32 + } + }, + "output": [ + { + "id": 262, + "damage": 33, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 33 + } + }, + "output": [ + { + "id": 262, + "damage": 34, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 34 + } + }, + "output": [ + { + "id": 262, + "damage": 35, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 35 + } + }, + "output": [ + { + "id": 262, + "damage": 36, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 36 + } + }, + "output": [ + { + "id": 262, + "damage": 37, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 37 + } + }, + "output": [ + { + "id": 262, + "damage": 38, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 38 + } + }, + "output": [ + { + "id": 262, + "damage": 39, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 39 + } + }, + "output": [ + { + "id": 262, + "damage": 40, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 40 + } + }, + "output": [ + { + "id": 262, + "damage": 41, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 41 + } + }, + "output": [ + { + "id": 262, + "damage": 42, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 42 + } + }, + "output": [ + { + "id": 262, + "damage": 43, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 5 + } + }, + "output": [ + { + "id": 262, + "damage": 6, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 6 + } + }, + "output": [ + { + "id": 262, + "damage": 7, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 7 + } + }, + "output": [ + { + "id": 262, + "damage": 8, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 8 + } + }, + "output": [ + { + "id": 262, + "damage": 9, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 262 + }, + "B": { + "id": 441, + "damage": 9 + } + }, + "output": [ + { + "id": 262, + "damage": 10, + "count": 8 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 263, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 50, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 263, + "damage": 1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 50, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 263 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": -236, + "damage": -1 + } + }, + "output": [ + { + "id": -268, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 263 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": 88, + "damage": -1 + } + }, + "output": [ + { + "id": -268, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 263 + } + }, + "output": [ + { + "id": 173 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 276 + } + ], + "priority": 0, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 277 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 278 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 279 + } + ], + "priority": 0, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 293 + } + ], + "priority": 0, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 310 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 311 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 312 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 313 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 57 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -202 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -202 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 1, + "damage": -1 + } + }, + "output": [ + { + "id": -197 + } + ], + "priority": 0, + "shape": [ + " A ", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 131 + } + ], + "priority": 2, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 131 + } + ], + "priority": 2, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 131, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": 76, + "damage": -1 + } + }, + "output": [ + { + "id": 126, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 256 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 257 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 258 + } + ], + "priority": 0, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 267 + } + ], + "priority": 0, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 292 + } + ], + "priority": 0, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 66, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "A A", + "ABA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 345 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": -202 + } + ], + "priority": 0, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 54, + "damage": -1 + } + }, + "output": [ + { + "id": 410 + } + ], + "priority": 0, + "shape": [ + "A A", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 61, + "damage": -1 + }, + "C": { + "id": -183, + "damage": -1 + } + }, + "output": [ + { + "id": -196 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + }, + "B": { + "id": 70, + "damage": -1 + }, + "C": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 28, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "A A", + "ABA", + "ACA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 101, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 148 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 167 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 306 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 307 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 308 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 309 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 325 + } + ], + "priority": 0, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 328 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 330, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 359 + } + ], + "priority": 0, + "shape": [ + " A", + "A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 380 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 42 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 452, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 260, + "damage": -1 + } + }, + "output": [ + { + "id": 322 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 27, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "A A", + "ABA", + "ACA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 283 + } + ], + "priority": 0, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 284 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 285 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 286 + } + ], + "priority": 0, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 294 + } + ], + "priority": 0, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 347 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 147 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 314 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 315 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 316 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 317 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 371, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 266, + "damage": -1 + } + }, + "output": [ + { + "id": 41 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -162, + "damage": -1 + }, + "C": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -162, + "damage": -1 + }, + "C": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -166, + "damage": -1 + }, + "C": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -166, + "damage": -1 + }, + "C": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -166, + "damage": 2 + }, + "C": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 0, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -212, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -225, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -226, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -240, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -241, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": 162, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -236, + "damage": -1 + }, + "C": { + "id": 17, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 1, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -258 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -259 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -264, + "damage": -1 + } + }, + "output": [ + { + "id": -203 + } + ], + "priority": 2, + "shape": [ + "ABA", + "A A", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": -265, + "damage": -1 + } + }, + "output": [ + { + "id": -203 + } + ], + "priority": 2, + "shape": [ + "ABA", + "A A", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 158, + "damage": -1 + } + }, + "output": [ + { + "id": -203 + } + ], + "priority": 0, + "shape": [ + "ABA", + "A A", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 182, + "damage": -1 + }, + "C": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 182, + "damage": -1 + }, + "C": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -212, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": 162, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263, + "damage": 1 + }, + "C": { + "id": 17, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -212, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -225, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -226, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -240, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -241, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": 162, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 263 + }, + "C": { + "id": 17, + "damage": -1 + } + }, + "output": [ + { + "id": 720 + } + ], + "priority": 1, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + }, + "C": { + "id": 287, + "damage": -1 + }, + "D": { + "id": 131, + "damage": -1 + } + }, + "output": [ + { + "id": 471 + } + ], + "priority": 0, + "shape": [ + "ABA", + "CDC", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 287, + "damage": -1 + } + }, + "output": [ + { + "id": 261 + } + ], + "priority": 0, + "shape": [ + " AB", + "A B", + " AB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 287, + "damage": -1 + } + }, + "output": [ + { + "id": 346 + } + ], + "priority": 0, + "shape": [ + " A", + " AB", + "A B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 389 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 35, + "damage": -1 + } + }, + "output": [ + { + "id": 321 + } + ], + "priority": 50, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 4, + "damage": -1 + } + }, + "output": [ + { + "id": 69 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 44, + "damage": -1 + }, + "C": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 44, + "damage": -1 + }, + "C": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -195 + } + ], + "priority": 2, + "shape": [ + "ABA", + "C C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 44 + } + }, + "output": [ + { + "id": 425 + } + ], + "priority": 0, + "shape": [ + "AAA", + " A ", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": 183 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": 184 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": 185 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": 187 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": 186 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 5 + } + }, + "output": [ + { + "id": 107 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -10, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -212, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -225, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -226, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -240, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -241, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -5, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -6, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -7, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -8, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": -9, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": 162, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 2, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + }, + "B": { + "id": 88, + "damage": -1 + }, + "C": { + "id": 17, + "damage": -1 + } + }, + "output": [ + { + "id": 801 + } + ], + "priority": 1, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 65, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 287, + "damage": -1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -204 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 287, + "damage": -1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -204 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 287, + "damage": -1 + }, + "B": { + "id": 341, + "damage": -1 + } + }, + "output": [ + { + "id": 420, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "AA ", + "AB ", + " A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 287, + "damage": -1 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": -204 + } + ], + "priority": 0, + "shape": [ + "AA", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 287, + "damage": -1 + } + }, + "output": [ + { + "id": 35 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 289, + "damage": -1 + }, + "B": { + "id": 12, + "damage": -1 + } + }, + "output": [ + { + "id": 46 + } + ], + "priority": 0, + "shape": [ + "ABA", + "BAB", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 296, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 3 + } + }, + "output": [ + { + "id": 357, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 296, + "damage": -1 + } + }, + "output": [ + { + "id": 170 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 296, + "damage": -1 + } + }, + "output": [ + { + "id": 297 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 318, + "damage": -1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -201 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 318, + "damage": -1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -201 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 318, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + }, + "C": { + "id": 288, + "damage": -1 + } + }, + "output": [ + { + "id": 262, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 318, + "damage": -1 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": -201 + } + ], + "priority": 0, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 325, + "damage": 1 + }, + "B": { + "id": 353, + "damage": -1 + }, + "C": { + "id": 344, + "damage": -1 + }, + "D": { + "id": 296, + "damage": -1 + } + }, + "output": [ + { + "id": 354 + }, + { + "id": 325, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BCB", + "DDD" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 331, + "damage": -1 + }, + "B": { + "id": 170, + "damage": -1 + } + }, + "output": [ + { + "id": -239 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 331, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 76 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 331, + "damage": -1 + }, + "B": { + "id": 89, + "damage": -1 + } + }, + "output": [ + { + "id": 123 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 152 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 332, + "damage": -1 + } + }, + "output": [ + { + "id": 80 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 298 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 299 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 300 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 301 + } + ], + "priority": 0, + "shape": [ + "A A", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 334, + "damage": -1 + } + }, + "output": [ + { + "id": 416 + } + ], + "priority": 0, + "shape": [ + "A A", + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 336, + "damage": -1 + } + }, + "output": [ + { + "id": 390 + } + ], + "priority": 0, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 336, + "damage": -1 + } + }, + "output": [ + { + "id": 45 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 337, + "damage": -1 + } + }, + "output": [ + { + "id": 82 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 338, + "damage": -1 + } + }, + "output": [ + { + "id": 339, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 338, + "damage": -1 + } + }, + "output": [ + { + "id": 353 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 339, + "damage": -1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": -200 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 339, + "damage": -1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": -200 + } + ], + "priority": 2, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 339, + "damage": -1 + }, + "B": { + "id": 345, + "damage": -1 + } + }, + "output": [ + { + "id": 395, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 339, + "damage": -1 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": -200 + } + ], + "priority": 0, + "shape": [ + "AA", + "BB", + "BB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 339, + "damage": -1 + } + }, + "output": [ + { + "id": 395 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 340, + "damage": -1 + }, + "B": { + "id": 264, + "damage": -1 + }, + "C": { + "id": 49, + "damage": -1 + } + }, + "output": [ + { + "id": 116 + } + ], + "priority": 0, + "shape": [ + " A ", + "BCB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 341, + "damage": -1 + }, + "B": { + "id": 33, + "damage": -1 + } + }, + "output": [ + { + "id": 29, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 341, + "damage": -1 + } + }, + "output": [ + { + "id": 165 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 346, + "damage": -1 + }, + "B": { + "id": -229, + "damage": -1 + } + }, + "output": [ + { + "id": 757 + } + ], + "priority": 0, + "shape": [ + "A ", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 346, + "damage": -1 + }, + "B": { + "id": 391, + "damage": -1 + } + }, + "output": [ + { + "id": 398 + } + ], + "priority": 0, + "shape": [ + "A ", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 348, + "damage": -1 + } + }, + "output": [ + { + "id": 89 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 10 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 10 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 10 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 5 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 10 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 10 + } + }, + "output": [ + { + "id": 171, + "damage": 10, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 11 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 11 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 11 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 4 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 11 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 11 + } + }, + "output": [ + { + "id": 171, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 12 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 12 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 12 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 12 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 12 + } + }, + "output": [ + { + "id": 171, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 13 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 13 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 13 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 13 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 13 + } + }, + "output": [ + { + "id": 171, + "damage": 13, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 14 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 14 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 14 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 14 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 14 + } + }, + "output": [ + { + "id": 171, + "damage": 14, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 15 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 15 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 15 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 15 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 15 + } + }, + "output": [ + { + "id": 171, + "damage": 15, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 1 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 1 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 14 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 1 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 1 + } + }, + "output": [ + { + "id": 171, + "damage": 1, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 2 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 2 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 2 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 13 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 2 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 2 + } + }, + "output": [ + { + "id": 171, + "damage": 2, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 3 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 3 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 3 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 12 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 3 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 3 + } + }, + "output": [ + { + "id": 171, + "damage": 3, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 4 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 4 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 4 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 11 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 4 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 4 + } + }, + "output": [ + { + "id": 171, + "damage": 4, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 5 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 5 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 5 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 10 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 5 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 5 + } + }, + "output": [ + { + "id": 171, + "damage": 5, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 6 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 6 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 6 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 9 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 6 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 6 + } + }, + "output": [ + { + "id": 171, + "damage": 6, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 7 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 7 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 7 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 7 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 7 + } + }, + "output": [ + { + "id": 171, + "damage": 7, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 8 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 8 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 8 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 7 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 8 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 8 + } + }, + "output": [ + { + "id": 171, + "damage": 8, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 9 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 9 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 9 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 9 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35, + "damage": 9 + } + }, + "output": [ + { + "id": 171, + "damage": 9, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 351, + "damage": 15 + } + }, + "output": [ + { + "id": 216 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 351, + "damage": 4 + } + }, + "output": [ + { + "id": 22 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35 + }, + "B": { + "id": -242, + "damage": -1 + } + }, + "output": [ + { + "id": 355 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35 + }, + "B": { + "id": -243, + "damage": -1 + } + }, + "output": [ + { + "id": 355 + } + ], + "priority": 2, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35 + }, + "B": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 355 + } + ], + "priority": 1, + "shape": [ + "AAA", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 35 + } + }, + "output": [ + { + "id": 171, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 360, + "damage": -1 + } + }, + "output": [ + { + "id": 103 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 360, + "damage": -1 + } + }, + "output": [ + { + "id": 362 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 369, + "damage": -1 + }, + "B": { + "id": -273, + "damage": -1 + } + }, + "output": [ + { + "id": 379 + } + ], + "priority": 2, + "shape": [ + " A ", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 369, + "damage": -1 + }, + "B": { + "id": 4, + "damage": -1 + } + }, + "output": [ + { + "id": 379 + } + ], + "priority": 0, + "shape": [ + " A ", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 369, + "damage": -1 + }, + "B": { + "id": 433, + "damage": -1 + } + }, + "output": [ + { + "id": 208, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 371, + "damage": -1 + }, + "B": { + "id": 360, + "damage": -1 + } + }, + "output": [ + { + "id": 382 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 371, + "damage": -1 + }, + "B": { + "id": 391, + "damage": -1 + } + }, + "output": [ + { + "id": 396 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 371, + "damage": -1 + } + }, + "output": [ + { + "id": 266 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 372, + "damage": -1 + } + }, + "output": [ + { + "id": 214 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 378, + "damage": -1 + } + }, + "output": [ + { + "id": 213 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 388, + "damage": -1 + } + }, + "output": [ + { + "id": 133 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 3 + }, + "B": { + "id": 13, + "damage": -1 + } + }, + "output": [ + { + "id": 3, + "damage": 1, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AB", + "BA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 261, + "damage": -1 + }, + "C": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 23, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "ACA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 272 + } + ], + "priority": 0, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 273 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 274 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 275 + } + ], + "priority": 0, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 291 + } + ], + "priority": 0, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + }, + "C": { + "id": 406, + "damage": -1 + } + }, + "output": [ + { + "id": 251 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBC", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 125, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + }, + "B": { + "id": 406, + "damage": -1 + } + }, + "output": [ + { + "id": 1, + "damage": 3, + "count": 2 + } + ], + "priority": 0, + "shape": [ + "AB", + "BA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + } + }, + "output": [ + { + "id": 61 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4, + "damage": -1 + } + }, + "output": [ + { + "id": 67, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 405, + "damage": -1 + }, + "B": { + "id": 372, + "damage": -1 + } + }, + "output": [ + { + "id": 215 + } + ], + "priority": 0, + "shape": [ + "AB", + "BA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 405, + "damage": -1 + } + }, + "output": [ + { + "id": 112 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 406, + "damage": -1 + } + }, + "output": [ + { + "id": 155 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 409, + "damage": -1 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 168, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 409, + "damage": -1 + }, + "B": { + "id": 351 + } + }, + "output": [ + { + "id": 168, + "damage": 1 + } + ], + "priority": 1, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 409, + "damage": -1 + }, + "B": { + "id": 422, + "damage": -1 + } + }, + "output": [ + { + "id": 169 + } + ], + "priority": 0, + "shape": [ + "ABA", + "BBB", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 409, + "damage": -1 + } + }, + "output": [ + { + "id": 168, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 409, + "damage": -1 + } + }, + "output": [ + { + "id": 168 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 41, + "damage": -1 + } + }, + "output": [ + { + "id": 266, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 410, + "damage": -1 + }, + "B": { + "id": 328, + "damage": -1 + } + }, + "output": [ + { + "id": 408 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 415, + "damage": -1 + } + }, + "output": [ + { + "id": 334 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 42, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 145 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + "BBB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 42, + "damage": -1 + } + }, + "output": [ + { + "id": 265, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 433, + "damage": -1 + } + }, + "output": [ + { + "id": 201, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 44, + "damage": 1 + } + }, + "output": [ + { + "id": 24, + "damage": 1 + } + ], + "priority": 50, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 44, + "damage": 5 + } + }, + "output": [ + { + "id": 98, + "damage": 3 + } + ], + "priority": 50, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 44, + "damage": 6 + } + }, + "output": [ + { + "id": 155, + "damage": 1 + } + ], + "priority": 50, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 44, + "damage": 7 + } + }, + "output": [ + { + "id": -302 + } + ], + "priority": 0, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 445, + "damage": -1 + }, + "B": { + "id": 54, + "damage": -1 + } + }, + "output": [ + { + "id": 205 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 45, + "damage": -1 + } + }, + "output": [ + { + "id": 108, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 45, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "damage": 6, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 452, + "damage": -1 + }, + "B": { + "id": -268, + "damage": -1 + } + }, + "output": [ + { + "id": -269 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 452, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 758 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 452, + "damage": -1 + }, + "B": { + "id": 50, + "damage": -1 + } + }, + "output": [ + { + "id": -208 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 452, + "damage": -1 + } + }, + "output": [ + { + "id": 265 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 45 + } + }, + "output": [ + { + "id": 44, + "damage": 4, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 464, + "damage": -1 + } + }, + "output": [ + { + "id": -139 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 465, + "damage": -1 + }, + "B": { + "id": 467, + "damage": -1 + } + }, + "output": [ + { + "id": -157 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 468, + "damage": -1 + } + }, + "output": [ + { + "id": 469 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 46 + }, + "B": { + "id": 328, + "damage": -1 + } + }, + "output": [ + { + "id": 407 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 48, + "damage": -1 + } + }, + "output": [ + { + "id": -179, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 48, + "damage": -1 + } + }, + "output": [ + { + "id": 139, + "damage": 1, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 48 + } + }, + "output": [ + { + "id": 182, + "damage": 5, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 49, + "damage": -1 + }, + "B": { + "id": 381, + "damage": -1 + } + }, + "output": [ + { + "id": 130 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 4 + } + }, + "output": [ + { + "id": 44, + "damage": 3, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 264, + "damage": -1 + } + }, + "output": [ + { + "id": 84 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 265, + "damage": -1 + } + }, + "output": [ + { + "id": 513 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 268 + } + ], + "priority": 0, + "shape": [ + "A", + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 269 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 270 + } + ], + "priority": 0, + "shape": [ + "AAA", + " B ", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 271 + } + ], + "priority": 0, + "shape": [ + "AA", + "AB", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 290 + } + ], + "priority": 0, + "shape": [ + "AA", + " B", + " B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 25 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 340, + "damage": -1 + } + }, + "output": [ + { + "id": 47 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 4 + }, + "C": { + "id": 265, + "damage": -1 + }, + "D": { + "id": 331, + "damage": -1 + } + }, + "output": [ + { + "id": 33, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BCB", + "BDB" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + }, + "B": { + "id": 736, + "damage": -1 + } + }, + "output": [ + { + "id": -219 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 280, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 281, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A A", + " A " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 54 + } + ], + "priority": 0, + "shape": [ + "AAA", + "A A", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": -1 + } + }, + "output": [ + { + "id": 58 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 472, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "damage": 1, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": -144 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": -149, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": -154 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": 134, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": 134, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": 158, + "damage": 1, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 1 + } + }, + "output": [ + { + "id": 427, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 473, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "damage": 2, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": -141 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": -146, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": -151 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": 135, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": 135, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": 158, + "damage": 2, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 2 + } + }, + "output": [ + { + "id": 428, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 474, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "damage": 3, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": -143 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": -148, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": -153 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": 136, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": 136, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": 158, + "damage": 3, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 3 + } + }, + "output": [ + { + "id": 429, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333, + "damage": 4 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 475, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "damage": 4, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": -140 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": -145, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": -150 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": 158, + "damage": 4, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": 163, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": 163, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 4 + } + }, + "output": [ + { + "id": 430, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333, + "damage": 5 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 476, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "damage": 5, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": -142 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": -147, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": -152 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": 158, + "damage": 5, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": 164, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": 164, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5, + "damage": 5 + } + }, + "output": [ + { + "id": 431, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 54, + "damage": -1 + }, + "B": { + "id": 328, + "damage": -1 + } + }, + "output": [ + { + "id": 342 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 57, + "damage": -1 + } + }, + "output": [ + { + "id": 264, + "count": 9 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + }, + "B": { + "id": 269, + "damage": -1 + } + }, + "output": [ + { + "id": 333 + } + ], + "priority": 0, + "shape": [ + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 323, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + " B " + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + }, + "B": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 85, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ABA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 143 + } + ], + "priority": 50, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 158, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 324, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 53, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 53, + "count": 4 + } + ], + "priority": 50, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 72 + } + ], + "priority": 50, + "shape": [ + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 5 + } + }, + "output": [ + { + "id": 96, + "count": 2 + } + ], + "priority": 50, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 736, + "damage": -1 + } + }, + "output": [ + { + "id": -221 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 737, + "damage": -1 + } + }, + "output": [ + { + "id": -220 + }, + { + "id": 374, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "AA", + "AA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 737, + "damage": -1 + } + }, + "output": [ + { + "id": 353, + "count": 3 + }, + { + "id": 374 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 742, + "damage": -1 + } + }, + "output": [ + { + "id": -270 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 76, + "damage": -1 + }, + "B": { + "id": 331, + "damage": -1 + }, + "C": { + "id": 1 + } + }, + "output": [ + { + "id": 356 + } + ], + "priority": 0, + "shape": [ + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 76, + "damage": -1 + }, + "B": { + "id": 406, + "damage": -1 + }, + "C": { + "id": 1 + } + }, + "output": [ + { + "id": 404 + } + ], + "priority": 0, + "shape": [ + " A ", + "ABA", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 79, + "damage": -1 + } + }, + "output": [ + { + "id": 174 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 80, + "damage": -1 + } + }, + "output": [ + { + "id": 78, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 86, + "damage": -1 + } + }, + "output": [ + { + "id": 361, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98, + "damage": 1 + } + }, + "output": [ + { + "id": -166, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98, + "damage": 1 + } + }, + "output": [ + { + "id": -175, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98, + "damage": 1 + } + }, + "output": [ + { + "id": 139, + "damage": 8, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98, + "damage": 3 + }, + "B": { + "id": 742, + "damage": -1 + } + }, + "output": [ + { + "id": -222 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98 + } + }, + "output": [ + { + "id": 109, + "count": 4 + } + ], + "priority": 0, + "shape": [ + "A ", + "AA ", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98 + } + }, + "output": [ + { + "id": 139, + "damage": 7, + "count": 6 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 98 + } + }, + "output": [ + { + "id": 44, + "damage": 5, + "count": 6 + } + ], + "priority": 50, + "shape": [ + "AAA" + ] + } + ], + "shaped_chemistry": [ + { + "block": "crafting_table", + "input": { + "A": { + "id": -22 + }, + "B": { + "id": 46 + } + }, + "output": [ + { + "id": 46, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": -23 + }, + "B": { + "id": 50 + } + }, + "output": [ + { + "id": 239 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 10 + } + }, + "output": [ + { + "id": 254, + "damage": 5, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 11 + } + }, + "output": [ + { + "id": 254, + "damage": 4, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 12 + } + }, + "output": [ + { + "id": 254, + "damage": 3, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 13 + } + }, + "output": [ + { + "id": 254, + "damage": 2, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 1, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 15 + } + }, + "output": [ + { + "id": 254, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 16 + } + }, + "output": [ + { + "id": 254, + "damage": 15, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 17 + } + }, + "output": [ + { + "id": 254, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 18 + } + }, + "output": [ + { + "id": 254, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 19 + } + }, + "output": [ + { + "id": 254, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 1 + } + }, + "output": [ + { + "id": 254, + "damage": 14, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 2 + } + }, + "output": [ + { + "id": 254, + "damage": 13, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 3 + } + }, + "output": [ + { + "id": 254, + "damage": 12, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 4 + } + }, + "output": [ + { + "id": 254, + "damage": 11, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 5 + } + }, + "output": [ + { + "id": 254, + "damage": 10, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 6 + } + }, + "output": [ + { + "id": 254, + "damage": 9, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 7 + } + }, + "output": [ + { + "id": 254, + "damage": 8, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 8 + } + }, + "output": [ + { + "id": 254, + "damage": 7, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351, + "damage": 9 + } + }, + "output": [ + { + "id": 254, + "damage": 6, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + }, + "B": { + "id": 351 + } + }, + "output": [ + { + "id": 254, + "damage": 15, + "count": 8 + } + ], + "priority": 0, + "shape": [ + "AAA", + "ABA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 253 + } + }, + "output": [ + { + "id": 190, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 10 + } + }, + "output": [ + { + "id": 191, + "damage": 10, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 11 + } + }, + "output": [ + { + "id": 191, + "damage": 11, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 11 + } + }, + "output": [ + { + "id": 191, + "damage": 11, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 12 + } + }, + "output": [ + { + "id": 191, + "damage": 12, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 12 + } + }, + "output": [ + { + "id": 191, + "damage": 12, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 13 + } + }, + "output": [ + { + "id": 191, + "damage": 13, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 14, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 15 + } + }, + "output": [ + { + "id": 191, + "damage": 15, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 15 + } + }, + "output": [ + { + "id": 191, + "damage": 15, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 1 + } + }, + "output": [ + { + "id": 191, + "damage": 1, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 2 + } + }, + "output": [ + { + "id": 191, + "damage": 2, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 3 + } + }, + "output": [ + { + "id": 191, + "damage": 3, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 4 + } + }, + "output": [ + { + "id": 191, + "damage": 4, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 5 + } + }, + "output": [ + { + "id": 191, + "damage": 5, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 6 + } + }, + "output": [ + { + "id": 191, + "damage": 6, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 7 + } + }, + "output": [ + { + "id": 191, + "damage": 7, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 8 + } + }, + "output": [ + { + "id": 191, + "damage": 8, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254, + "damage": 9 + } + }, + "output": [ + { + "id": 191, + "damage": 9, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254 + } + }, + "output": [ + { + "id": 191, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 254 + } + }, + "output": [ + { + "id": 191, + "count": 16 + } + ], + "priority": 0, + "shape": [ + "AAA", + "AAA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 102 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 190, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 10 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 10, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 11 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 11 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 12 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 12 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 13 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 13, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 14 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 14, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 15 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 15, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 15 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 15, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 1 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 1, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 2 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 2, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 3 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 3, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 4 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 4, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 5 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 5, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 6 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 6, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 7 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 7, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 8 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 8, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160, + "damage": 9 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "damage": 9, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 160 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 191, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 20 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 253, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 10 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 10, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 11 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 11 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 11, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 12 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 12 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 12, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 13 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 13, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 14 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 14, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 15 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 15, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 15 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 15, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 1 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 1, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 2 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 2, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 3 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 3, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 4 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 4, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 5 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 5, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 6 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 6, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 7 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 7, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 8 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 8, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241, + "damage": 9 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "damage": 9, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 13 + }, + "B": { + "id": 241 + }, + "C": { + "id": 499, + "damage": 14 + } + }, + "output": [ + { + "id": 254, + "count": 3 + } + ], + "priority": 0, + "shape": [ + "AAA", + "BBB", + "CCC" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 10 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 10 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 11 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 11 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 12 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 12 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 13 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 13 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 14 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 14 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 17 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 18 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 4 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 19 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 15 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 1 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 2 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 5 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 5 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 6 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 6 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 8 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 8 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 16 + }, + "B": { + "id": 499, + "damage": 35 + }, + "C": { + "id": 351, + "damage": 9 + }, + "D": { + "id": 499, + "damage": 10 + } + }, + "output": [ + { + "id": 166, + "damage": 9 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 21 + }, + "B": { + "id": -23 + }, + "C": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 442, + "damage": 5 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 21 + }, + "B": { + "id": 50 + } + }, + "output": [ + { + "id": 204, + "damage": 8 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 22 + }, + "B": { + "id": -23 + }, + "C": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 442, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 22 + }, + "B": { + "id": 50 + } + }, + "output": [ + { + "id": 202 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 23 + }, + "B": { + "id": -23 + }, + "C": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 442, + "damage": 4 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 23 + }, + "B": { + "id": 50 + } + }, + "output": [ + { + "id": 204 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 24 + }, + "B": { + "id": -23 + }, + "C": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 442, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 24 + }, + "B": { + "id": 50 + } + }, + "output": [ + { + "id": 202, + "damage": 8 + } + ], + "priority": 0, + "shape": [ + "A", + "B" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 25 + }, + "B": { + "id": -23 + }, + "C": { + "id": 280, + "damage": -1 + } + }, + "output": [ + { + "id": 442, + "damage": 14 + } + ], + "priority": 0, + "shape": [ + "A", + "B", + "C" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 10 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 5 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 11 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 4 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 12 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 3 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 13 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 2 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 14 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 1 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 15 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 16 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 15 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 17 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 12 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 18 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 11 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 19 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 1 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 14 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 2 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 13 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 3 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 12 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 4 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 11 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 5 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 10 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 6 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 9 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 7 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 8 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 8 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 7 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351, + "damage": 9 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 6 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + }, + { + "block": "crafting_table", + "input": { + "A": { + "id": 499, + "damage": 30 + }, + "B": { + "id": 351 + }, + "C": { + "id": -13 + }, + "D": { + "id": 420, + "damage": -1 + } + }, + "output": [ + { + "id": 448, + "damage": 15 + } + ], + "priority": 0, + "shape": [ + "ABA", + "ACA", + "ADA" + ] + } + ], + "shapeless": [ + { + "block": "cartography_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 345, + "damage": -1 + } + ], + "output": [ + { + "id": 395, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "cartography_table", + "input": [ + { + "id": 339, + "damage": -1 + } + ], + "output": [ + { + "id": 395 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": -216, + "damage": -1 + } + ], + "output": [ + { + "id": 351, + "damage": 16 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": -220, + "damage": -1 + }, + { + "id": 374, + "damage": -1 + }, + { + "id": 374, + "damage": -1 + }, + { + "id": 374, + "damage": -1 + }, + { + "id": 374, + "damage": -1 + } + ], + "output": [ + { + "id": 737, + "count": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 1, + "damage": 3 + }, + { + "id": 4, + "damage": -1 + } + ], + "output": [ + { + "id": 1, + "damage": 5, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 1, + "damage": 3 + }, + { + "id": 406, + "damage": -1 + } + ], + "output": [ + { + "id": 1, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 175, + "damage": 1 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 175, + "damage": 4 + } + ], + "output": [ + { + "id": 351, + "damage": 1, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 175, + "damage": 5 + } + ], + "output": [ + { + "id": 351, + "damage": 9, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 175 + } + ], + "output": [ + { + "id": 351, + "damage": 11, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 216, + "damage": -1 + } + ], + "output": [ + { + "id": 351, + "damage": 15, + "count": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 265, + "damage": -1 + }, + { + "id": 318, + "damage": -1 + } + ], + "output": [ + { + "id": 259 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 281, + "damage": -1 + }, + { + "id": 393, + "damage": -1 + }, + { + "id": 391, + "damage": -1 + }, + { + "id": 39, + "damage": -1 + }, + { + "id": 412, + "damage": -1 + } + ], + "output": [ + { + "id": 413 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 281, + "damage": -1 + }, + { + "id": 393, + "damage": -1 + }, + { + "id": 391, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 412, + "damage": -1 + } + ], + "output": [ + { + "id": 413 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 281, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + }, + { + "id": 457, + "damage": -1 + } + ], + "output": [ + { + "id": 459 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 402, + "damage": 10, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 402, + "damage": 11, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 402, + "damage": 12, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 402, + "damage": 13, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 402, + "damage": 14, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 402, + "damage": 15, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 402, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 402, + "damage": 3, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 402, + "damage": 4, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 402, + "damage": 15, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 402, + "damage": 1, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 402, + "damage": 2, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 402, + "damage": 3, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 402, + "damage": 4, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 402, + "damage": 5, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 402, + "damage": 6, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 402, + "damage": 7, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 402, + "damage": 8, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 402, + "damage": 9, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 289, + "damage": -1 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 402, + "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d\/wA=" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 30, + "damage": -1 + } + ], + "output": [ + { + "id": 287, + "count": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 106, + "damage": -1 + } + ], + "output": [ + { + "id": 434, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + }, + { + "id": 402, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + } + ], + "output": [ + { + "id": 401, + "count": 3, + "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 38, + "damage": 8 + } + ], + "output": [ + { + "id": 434, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 397, + "damage": 1 + } + ], + "output": [ + { + "id": 434, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 397, + "damage": 4 + } + ], + "output": [ + { + "id": 434 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 45, + "damage": -1 + } + ], + "output": [ + { + "id": 434, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339, + "damage": -1 + }, + { + "id": 466, + "damage": -1 + } + ], + "output": [ + { + "id": 434, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 339 + }, + { + "id": 339 + }, + { + "id": 339 + }, + { + "id": 334 + } + ], + "output": [ + { + "id": 340 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 340, + "damage": -1 + }, + { + "id": 351 + }, + { + "id": 288, + "damage": -1 + } + ], + "output": [ + { + "id": 386 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 5, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 10 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 4, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 11 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 3, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 12 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 2, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 13 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 1, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 14 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "count": 8 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 19 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 15, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 351, + "damage": 15 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 3 + } + ], + "priority": 7 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 8, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 351, + "damage": 19 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 3 + } + ], + "priority": 3 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 8, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 16 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 12, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 17 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 11, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 12, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 12, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 4 + } + ], + "priority": 6 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 4 + } + ], + "priority": 4 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 3 + } + ], + "priority": 2 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 351, + "damage": 5, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 351, + "damage": 6, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 18 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 19 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 14, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 351, + "damage": 14, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 9, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 9, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 1 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 13, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 10, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 10, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 2 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 12, + "count": 8 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 351, + "damage": 17 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 11, + "count": 8 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 12, + "count": 2 + } + ], + "priority": 4 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 12, + "count": 2 + } + ], + "priority": 3 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 4 + } + ], + "priority": 8 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 4 + } + ], + "priority": 7 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 3 + } + ], + "priority": 5 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 351, + "damage": 5, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 351, + "damage": 6, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 351, + "damage": 18 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 10, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 351, + "damage": 13, + "count": 2 + } + ], + "priority": 3 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 5 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 9, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 6 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 8, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 7 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 7, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 2 + } + ], + "priority": 6 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 2 + } + ], + "priority": 4 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 8 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 6, + "count": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351, + "damage": 9 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 12 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + }, + { + "id": 13, + "damage": -1 + } + ], + "output": [ + { + "id": 237, + "damage": 15, + "count": 8 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 351, + "damage": 15 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 3 + } + ], + "priority": 8 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 351, + "damage": 8, + "count": 2 + } + ], + "priority": 3 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 351, + "damage": 19 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 7, + "count": 3 + } + ], + "priority": 5 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 351, + "damage": 8, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + }, + { + "id": 35 + } + ], + "output": [ + { + "id": 35, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 351 + } + ], + "output": [ + { + "id": 351, + "damage": 16 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 352, + "damage": -1 + } + ], + "output": [ + { + "id": 351, + "damage": 15, + "count": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 10 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 11 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 12 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 13 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 14 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 15 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 1 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 2 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 3 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 4 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 5 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 6 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 7 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 8 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355, + "damage": 9 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 355, + "damage": 5 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 355, + "damage": 4 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 355, + "damage": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 355, + "damage": 2 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 355, + "damage": 1 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 355, + "damage": 14 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 355, + "damage": 13 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 355, + "damage": 12 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 355, + "damage": 11 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 355, + "damage": 10 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 355, + "damage": 9 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 355, + "damage": 8 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 355, + "damage": 7 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 355, + "damage": 6 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 355 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 355, + "damage": 15 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 368, + "damage": -1 + }, + { + "id": 377, + "damage": -1 + } + ], + "output": [ + { + "id": 381 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 369, + "damage": -1 + } + ], + "output": [ + { + "id": 377, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 375, + "damage": -1 + }, + { + "id": 39, + "damage": -1 + }, + { + "id": 353, + "damage": -1 + } + ], + "output": [ + { + "id": 376 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 377, + "damage": -1 + }, + { + "id": 263, + "damage": -1 + }, + { + "id": 289, + "damage": -1 + } + ], + "output": [ + { + "id": 385, + "count": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 377, + "damage": -1 + }, + { + "id": 263, + "damage": 1 + }, + { + "id": 289, + "damage": -1 + } + ], + "output": [ + { + "id": 385, + "count": 3 + } + ], + "priority": 50 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 377, + "damage": -1 + }, + { + "id": 341, + "damage": -1 + } + ], + "output": [ + { + "id": 378 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 37 + } + ], + "output": [ + { + "id": 351, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 10 + } + ], + "output": [ + { + "id": 351, + "damage": 19 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 1 + } + ], + "output": [ + { + "id": 351, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 2 + } + ], + "output": [ + { + "id": 351, + "damage": 13 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 3 + } + ], + "output": [ + { + "id": 351, + "damage": 7 + } + ], + "priority": 2 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 4 + } + ], + "output": [ + { + "id": 351, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 5 + } + ], + "output": [ + { + "id": 351, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 6 + } + ], + "output": [ + { + "id": 351, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 7 + } + ], + "output": [ + { + "id": 351, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 8 + } + ], + "output": [ + { + "id": 351, + "damage": 7 + } + ], + "priority": 1 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38, + "damage": 9 + } + ], + "output": [ + { + "id": 351, + "damage": 18 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 38 + } + ], + "output": [ + { + "id": 351, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": -216, + "damage": -1 + } + ], + "output": [ + { + "id": 734, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 37, + "damage": -1 + } + ], + "output": [ + { + "id": 734, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 10 + } + ], + "output": [ + { + "id": 734, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 1 + } + ], + "output": [ + { + "id": 734, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 2 + } + ], + "output": [ + { + "id": 734, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 3 + } + ], + "output": [ + { + "id": 734, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 4 + } + ], + "output": [ + { + "id": 734, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 5 + } + ], + "output": [ + { + "id": 734, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 6 + } + ], + "output": [ + { + "id": 734, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 7 + } + ], + "output": [ + { + "id": 734, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 8 + } + ], + "output": [ + { + "id": 734, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38, + "damage": 9 + } + ], + "output": [ + { + "id": 734, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + }, + { + "id": 38 + } + ], + "output": [ + { + "id": 734 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 39, + "damage": -1 + }, + { + "id": 40, + "damage": -1 + }, + { + "id": 281, + "damage": -1 + } + ], + "output": [ + { + "id": 282 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 395, + "damage": 1 + }, + { + "id": 345, + "damage": -1 + } + ], + "output": [ + { + "id": 395, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 395 + }, + { + "id": 345, + "damage": -1 + } + ], + "output": [ + { + "id": 395, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 4, + "damage": -1 + }, + { + "id": 106, + "damage": -1 + } + ], + "output": [ + { + "id": 48 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 457, + "damage": -1 + } + ], + "output": [ + { + "id": 351, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 54, + "damage": -1 + }, + { + "id": 131, + "damage": -1 + } + ], + "output": [ + { + "id": 146 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 752, + "damage": -1 + }, + { + "id": 752, + "damage": -1 + }, + { + "id": 752, + "damage": -1 + }, + { + "id": 752, + "damage": -1 + }, + { + "id": 266, + "damage": -1 + }, + { + "id": 266, + "damage": -1 + }, + { + "id": 266, + "damage": -1 + }, + { + "id": 266, + "damage": -1 + } + ], + "output": [ + { + "id": 742 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 86, + "damage": -1 + }, + { + "id": 353, + "damage": -1 + }, + { + "id": 344, + "damage": -1 + } + ], + "output": [ + { + "id": 400 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 98 + }, + { + "id": 106, + "damage": -1 + } + ], + "output": [ + { + "id": 98, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -183 + } + ], + "output": [ + { + "id": 44, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -234, + "damage": -1 + } + ], + "output": [ + { + "id": -235 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -274 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -275 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -276 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -277 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -278 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -279 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -282, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -284, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -291 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -292 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -293, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -273, + "damage": -1 + } + ], + "output": [ + { + "id": -297 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -274, + "damage": -1 + } + ], + "output": [ + { + "id": -275 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -274, + "damage": -1 + } + ], + "output": [ + { + "id": -278 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -274, + "damage": -1 + } + ], + "output": [ + { + "id": -284, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -274 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -275 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -278 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -279 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -284, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -292 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -293, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": -291, + "damage": -1 + } + ], + "output": [ + { + "id": -297 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": -162, + "damage": 6, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": -162, + "damage": 7, + "count": 2 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": -169 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": -172 + } + ], + "priority": 5 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": 1, + "damage": 2 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 1 + } + ], + "output": [ + { + "id": 139, + "damage": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 2 + } + ], + "output": [ + { + "id": -162, + "damage": 7, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 2 + } + ], + "output": [ + { + "id": -172 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": -162, + "damage": 4, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": -162, + "damage": 5, + "count": 2 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": -170 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": -173 + } + ], + "priority": 5 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": 1, + "damage": 4 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 3 + } + ], + "output": [ + { + "id": 139, + "damage": 3 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 4 + } + ], + "output": [ + { + "id": -162, + "damage": 5, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 4 + } + ], + "output": [ + { + "id": -173 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": -162, + "damage": 2, + "count": 2 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": -162, + "damage": 3, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": -171 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": -174 + } + ], + "priority": 5 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": 1, + "damage": 6 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 5 + } + ], + "output": [ + { + "id": 139, + "damage": 4 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 6 + } + ], + "output": [ + { + "id": -162, + "damage": 2, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1, + "damage": 6 + } + ], + "output": [ + { + "id": -174 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 112, + "damage": -1 + } + ], + "output": [ + { + "id": -302 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 112 + } + ], + "output": [ + { + "id": 114 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 112 + } + ], + "output": [ + { + "id": 139, + "damage": 9 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 112 + } + ], + "output": [ + { + "id": 44, + "damage": 7, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 121 + } + ], + "output": [ + { + "id": -162, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 121 + } + ], + "output": [ + { + "id": -178 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 121 + } + ], + "output": [ + { + "id": 139, + "damage": 10 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 121 + } + ], + "output": [ + { + "id": 206 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155, + "damage": 3 + } + ], + "output": [ + { + "id": -166, + "damage": 1, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155, + "damage": 3 + } + ], + "output": [ + { + "id": -185 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155 + } + ], + "output": [ + { + "id": -304 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155 + } + ], + "output": [ + { + "id": 155, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155 + } + ], + "output": [ + { + "id": 155, + "damage": 2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155 + } + ], + "output": [ + { + "id": 156 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 155 + } + ], + "output": [ + { + "id": 44, + "damage": 6, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168, + "damage": 1 + } + ], + "output": [ + { + "id": -3 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168, + "damage": 1 + } + ], + "output": [ + { + "id": 182, + "damage": 3, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168, + "damage": 2 + } + ], + "output": [ + { + "id": -4 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168, + "damage": 2 + } + ], + "output": [ + { + "id": 182, + "damage": 4, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168 + } + ], + "output": [ + { + "id": -2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168 + } + ], + "output": [ + { + "id": 139, + "damage": 11 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 168 + } + ], + "output": [ + { + "id": 182, + "damage": 2, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179, + "damage": 3 + } + ], + "output": [ + { + "id": -162, + "damage": 1, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179, + "damage": 3 + } + ], + "output": [ + { + "id": -176 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179 + } + ], + "output": [ + { + "id": 139, + "damage": 12 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179 + } + ], + "output": [ + { + "id": 179, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179 + } + ], + "output": [ + { + "id": 179, + "damage": 2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179 + } + ], + "output": [ + { + "id": 180 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 179 + } + ], + "output": [ + { + "id": 182, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": -166, + "damage": 2, + "count": 2 + } + ], + "priority": 5 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": -180 + } + ], + "priority": 6 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": 109 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": 139, + "damage": 7 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": 44, + "damage": 5, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": 98, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 1 + } + ], + "output": [ + { + "id": 98 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 201 + } + ], + "output": [ + { + "id": 182, + "damage": 1, + "count": 2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 201 + } + ], + "output": [ + { + "id": 201, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 201 + } + ], + "output": [ + { + "id": 203 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 206 + } + ], + "output": [ + { + "id": -162, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 206 + } + ], + "output": [ + { + "id": -178 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 206 + } + ], + "output": [ + { + "id": 139, + "damage": 10 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 215 + } + ], + "output": [ + { + "id": -184 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 215 + } + ], + "output": [ + { + "id": 139, + "damage": 13 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 215 + } + ], + "output": [ + { + "id": 182, + "damage": 7, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24, + "damage": 3 + } + ], + "output": [ + { + "id": -177 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24, + "damage": 3 + } + ], + "output": [ + { + "id": 182, + "damage": 6, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24 + } + ], + "output": [ + { + "id": 128 + } + ], + "priority": 3 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24 + } + ], + "output": [ + { + "id": 139, + "damage": 5 + } + ], + "priority": 4 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24 + } + ], + "output": [ + { + "id": 24, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24 + } + ], + "output": [ + { + "id": 24, + "damage": 2 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 24 + } + ], + "output": [ + { + "id": 44, + "damage": 1, + "count": 2 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 45 + } + ], + "output": [ + { + "id": 108 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 45 + } + ], + "output": [ + { + "id": 139, + "damage": 6 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 45 + } + ], + "output": [ + { + "id": 44, + "damage": 4, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 48 + } + ], + "output": [ + { + "id": -179 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 48 + } + ], + "output": [ + { + "id": 139, + "damage": 1 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 48 + } + ], + "output": [ + { + "id": 182, + "damage": 5, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 4 + } + ], + "output": [ + { + "id": 139 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 4 + } + ], + "output": [ + { + "id": 44, + "damage": 3, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 4 + } + ], + "output": [ + { + "id": 67 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98, + "damage": 1 + } + ], + "output": [ + { + "id": -166, + "count": 2 + } + ], + "priority": 0 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98, + "damage": 1 + } + ], + "output": [ + { + "id": -175 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98, + "damage": 1 + } + ], + "output": [ + { + "id": 139, + "damage": 8 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98 + } + ], + "output": [ + { + "id": 109 + } + ], + "priority": 1 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98 + } + ], + "output": [ + { + "id": 139, + "damage": 7 + } + ], + "priority": 2 + }, + { + "block": "stonecutter", + "input": [ + { + "id": 98 + } + ], + "output": [ + { + "id": 44, + "damage": 5, + "count": 2 + } + ], + "priority": 0 + } + ], + "shapeless_chemistry": [ + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 10 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 11 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 12 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 13 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 14 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 15 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 1 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 2 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 3 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 4 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 5 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 6 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 7 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 8 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 171, + "damage": 9 + } + ], + "output": [ + { + "id": 171 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 10 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 11 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 12 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 13 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 14 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 15 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 1 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 2 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 3 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 4 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 5 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 6 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 7 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 8 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 35, + "damage": 9 + } + ], + "output": [ + { + "id": 35 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 10 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 11 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 12 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 13 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 14 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 15 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 1 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 2 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 3 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 4 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 5 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 6 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 7 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 8 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 355, + "damage": 9 + } + ], + "output": [ + { + "id": 355 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 10 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 11 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 12 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 13 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 14 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 1 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 2 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 3 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 4 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 5 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 6 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 7 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 8 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446, + "damage": 9 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 451, + "damage": -1 + }, + { + "id": 446 + } + ], + "output": [ + { + "id": 446, + "damage": 15 + } + ], + "priority": 0 + } + ], + "shapeless_shulker_box": [ + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 205 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 10 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 11 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 12 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 13 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 14 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 15 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 1 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 2 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 3 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 4 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 5 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 6 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 7 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 8 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 15 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 19 + } + ], + "output": [ + { + "id": 218 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218, + "damage": 9 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 10 + } + ], + "output": [ + { + "id": 218, + "damage": 5 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 11 + } + ], + "output": [ + { + "id": 218, + "damage": 4 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 12 + } + ], + "output": [ + { + "id": 218, + "damage": 3 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 13 + } + ], + "output": [ + { + "id": 218, + "damage": 2 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 14 + } + ], + "output": [ + { + "id": 218, + "damage": 1 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 16 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 17 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 18 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 1 + } + ], + "output": [ + { + "id": 218, + "damage": 14 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 2 + } + ], + "output": [ + { + "id": 218, + "damage": 13 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 3 + } + ], + "output": [ + { + "id": 218, + "damage": 12 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 4 + } + ], + "output": [ + { + "id": 218, + "damage": 11 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 5 + } + ], + "output": [ + { + "id": 218, + "damage": 10 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 6 + } + ], + "output": [ + { + "id": 218, + "damage": 9 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 7 + } + ], + "output": [ + { + "id": 218, + "damage": 8 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 8 + } + ], + "output": [ + { + "id": 218, + "damage": 7 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351, + "damage": 9 + } + ], + "output": [ + { + "id": 218, + "damage": 6 + } + ], + "priority": 0 + }, + { + "block": "crafting_table", + "input": [ + { + "id": 218 + }, + { + "id": 351 + } + ], + "output": [ + { + "id": 218, + "damage": 15 + } + ], + "priority": 0 + } + ], + "smelting": [ + { + "block": "blast_furnace", + "input": { + "id": -271, + "damage": -1 + }, + "output": { + "id": 752 + } + }, + { + "block": "blast_furnace", + "input": { + "id": -288, + "damage": -1 + }, + "output": { + "id": 266 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 129, + "damage": -1 + }, + "output": { + "id": 388 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 14, + "damage": -1 + }, + "output": { + "id": 266 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 15, + "damage": -1 + }, + "output": { + "id": 265 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 153, + "damage": -1 + }, + "output": { + "id": 406 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 16, + "damage": -1 + }, + "output": { + "id": 263 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 21, + "damage": -1 + }, + "output": { + "id": 351, + "damage": 4 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 256, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 257, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 258, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 267, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 283, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 284, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 285, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 286, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 292, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 294, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 302 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 303 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 304 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 305 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 306 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 307 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 308 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 309 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 314 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 315 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 316 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 317 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 417, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 418, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 56, + "damage": -1 + }, + "output": { + "id": 264 + } + }, + { + "block": "blast_furnace", + "input": { + "id": 73, + "damage": -1 + }, + "output": { + "id": 331 + } + }, + { + "block": "campfire", + "input": { + "id": 319, + "damage": -1 + }, + "output": { + "id": 320 + } + }, + { + "block": "campfire", + "input": { + "id": 335, + "damage": -1 + }, + "output": { + "id": 464 + } + }, + { + "block": "campfire", + "input": { + "id": 349, + "damage": -1 + }, + "output": { + "id": 350 + } + }, + { + "block": "campfire", + "input": { + "id": 363, + "damage": -1 + }, + "output": { + "id": 364 + } + }, + { + "block": "campfire", + "input": { + "id": 365, + "damage": -1 + }, + "output": { + "id": 366 + } + }, + { + "block": "campfire", + "input": { + "id": 392, + "damage": -1 + }, + "output": { + "id": 393 + } + }, + { + "block": "campfire", + "input": { + "id": 411, + "damage": -1 + }, + "output": { + "id": 412 + } + }, + { + "block": "campfire", + "input": { + "id": 423, + "damage": -1 + }, + "output": { + "id": 424 + } + }, + { + "block": "campfire", + "input": { + "id": 460, + "damage": -1 + }, + "output": { + "id": 463 + } + }, + { + "block": "furnace", + "input": { + "id": -10, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -156, + "damage": -1 + }, + "output": { + "id": 351, + "damage": 10 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 10 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 11 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 12 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 13 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 2 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 3 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 4 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 5 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 8 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212, + "damage": 9 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -212 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -271, + "damage": -1 + }, + "output": { + "id": 752 + } + }, + { + "block": "furnace", + "input": { + "id": -274, + "damage": -1 + }, + "output": { + "id": -280 + } + }, + { + "block": "furnace", + "input": { + "id": -288, + "damage": -1 + }, + "output": { + "id": 266 + } + }, + { + "block": "furnace", + "input": { + "id": -5, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -6, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -7, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -8, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": -9, + "damage": -1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 112, + "damage": -1 + }, + "output": { + "id": -303 + } + }, + { + "block": "furnace", + "input": { + "id": 12, + "damage": -1 + }, + "output": { + "id": 20 + } + }, + { + "block": "furnace", + "input": { + "id": 129, + "damage": -1 + }, + "output": { + "id": 388 + } + }, + { + "block": "furnace", + "input": { + "id": 14, + "damage": -1 + }, + "output": { + "id": 266 + } + }, + { + "block": "furnace", + "input": { + "id": 15, + "damage": -1 + }, + "output": { + "id": 265 + } + }, + { + "block": "furnace", + "input": { + "id": 153, + "damage": -1 + }, + "output": { + "id": 406 + } + }, + { + "block": "furnace", + "input": { + "id": 155 + }, + "output": { + "id": 155, + "damage": 3 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 10 + }, + "output": { + "id": 219 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 11 + }, + "output": { + "id": 231 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 12 + }, + "output": { + "id": 232 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 13 + }, + "output": { + "id": 233 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 14 + }, + "output": { + "id": 234 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 15 + }, + "output": { + "id": 235 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 1 + }, + "output": { + "id": 221 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 2 + }, + "output": { + "id": 222 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 3 + }, + "output": { + "id": 223 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 4 + }, + "output": { + "id": 224 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 5 + }, + "output": { + "id": 225 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 6 + }, + "output": { + "id": 226 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 7 + }, + "output": { + "id": 227 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 8 + }, + "output": { + "id": 228 + } + }, + { + "block": "furnace", + "input": { + "id": 159, + "damage": 9 + }, + "output": { + "id": 229 + } + }, + { + "block": "furnace", + "input": { + "id": 159 + }, + "output": { + "id": 220 + } + }, + { + "block": "furnace", + "input": { + "id": 16, + "damage": -1 + }, + "output": { + "id": 263 + } + }, + { + "block": "furnace", + "input": { + "id": 162, + "damage": 1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 162 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 17, + "damage": 1 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 17, + "damage": 2 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 17, + "damage": 3 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 179, + "damage": -1 + }, + "output": { + "id": 179, + "damage": 3 + } + }, + { + "block": "furnace", + "input": { + "id": 17 + }, + "output": { + "id": 263, + "damage": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 19, + "damage": 1 + }, + "output": { + "id": 19 + } + }, + { + "block": "furnace", + "input": { + "id": 1 + }, + "output": { + "id": -183 + } + }, + { + "block": "furnace", + "input": { + "id": 21, + "damage": -1 + }, + "output": { + "id": 351, + "damage": 4 + } + }, + { + "block": "furnace", + "input": { + "id": 24, + "damage": -1 + }, + "output": { + "id": 24, + "damage": 3 + } + }, + { + "block": "furnace", + "input": { + "id": 256, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 257, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 258, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 267, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 283, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 284, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 285, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 286, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 292, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 294, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 302 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 303 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 304 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 305 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 306 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 307 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 308 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 309 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 314 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 315 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 316 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 317 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 319, + "damage": -1 + }, + "output": { + "id": 320 + } + }, + { + "block": "furnace", + "input": { + "id": 335, + "damage": -1 + }, + "output": { + "id": 464 + } + }, + { + "block": "furnace", + "input": { + "id": 337, + "damage": -1 + }, + "output": { + "id": 336 + } + }, + { + "block": "furnace", + "input": { + "id": 349, + "damage": -1 + }, + "output": { + "id": 350 + } + }, + { + "block": "furnace", + "input": { + "id": 363, + "damage": -1 + }, + "output": { + "id": 364 + } + }, + { + "block": "furnace", + "input": { + "id": 365, + "damage": -1 + }, + "output": { + "id": 366 + } + }, + { + "block": "furnace", + "input": { + "id": 392, + "damage": -1 + }, + "output": { + "id": 393 + } + }, + { + "block": "furnace", + "input": { + "id": 4, + "damage": -1 + }, + "output": { + "id": 1 + } + }, + { + "block": "furnace", + "input": { + "id": 411, + "damage": -1 + }, + "output": { + "id": 412 + } + }, + { + "block": "furnace", + "input": { + "id": 417, + "damage": -1 + }, + "output": { + "id": 452 + } + }, + { + "block": "furnace", + "input": { + "id": 418, + "damage": -1 + }, + "output": { + "id": 371 + } + }, + { + "block": "furnace", + "input": { + "id": 423, + "damage": -1 + }, + "output": { + "id": 424 + } + }, + { + "block": "furnace", + "input": { + "id": 432, + "damage": -1 + }, + "output": { + "id": 433 + } + }, + { + "block": "furnace", + "input": { + "id": 460, + "damage": -1 + }, + "output": { + "id": 463 + } + }, + { + "block": "furnace", + "input": { + "id": 56, + "damage": -1 + }, + "output": { + "id": 264 + } + }, + { + "block": "furnace", + "input": { + "id": 73, + "damage": -1 + }, + "output": { + "id": 331 + } + }, + { + "block": "furnace", + "input": { + "id": 81, + "damage": -1 + }, + "output": { + "id": 351, + "damage": 2 + } + }, + { + "block": "furnace", + "input": { + "id": 82, + "damage": -1 + }, + "output": { + "id": 172 + } + }, + { + "block": "furnace", + "input": { + "id": 87, + "damage": -1 + }, + "output": { + "id": 405 + } + }, + { + "block": "furnace", + "input": { + "id": 98 + }, + "output": { + "id": 98, + "damage": 2 + } + }, + { + "block": "smoker", + "input": { + "id": 319, + "damage": -1 + }, + "output": { + "id": 320 + } + }, + { + "block": "smoker", + "input": { + "id": 335, + "damage": -1 + }, + "output": { + "id": 464 + } + }, + { + "block": "smoker", + "input": { + "id": 349, + "damage": -1 + }, + "output": { + "id": 350 + } + }, + { + "block": "smoker", + "input": { + "id": 363, + "damage": -1 + }, + "output": { + "id": 364 + } + }, + { + "block": "smoker", + "input": { + "id": 365, + "damage": -1 + }, + "output": { + "id": 366 + } + }, + { + "block": "smoker", + "input": { + "id": 392, + "damage": -1 + }, + "output": { + "id": 393 + } + }, + { + "block": "smoker", + "input": { + "id": 411, + "damage": -1 + }, + "output": { + "id": 412 + } + }, + { + "block": "smoker", + "input": { + "id": 423, + "damage": -1 + }, + "output": { + "id": 424 + } + }, + { + "block": "smoker", + "input": { + "id": 460, + "damage": -1 + }, + "output": { + "id": 463 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 319, + "damage": -1 + }, + "output": { + "id": 320 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 335, + "damage": -1 + }, + "output": { + "id": 464 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 349, + "damage": -1 + }, + "output": { + "id": 350 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 363, + "damage": -1 + }, + "output": { + "id": 364 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 365, + "damage": -1 + }, + "output": { + "id": 366 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 392, + "damage": -1 + }, + "output": { + "id": 393 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 411, + "damage": -1 + }, + "output": { + "id": 412 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 423, + "damage": -1 + }, + "output": { + "id": 424 + } + }, + { + "block": "soul_campfire", + "input": { + "id": 460, + "damage": -1 + }, + "output": { + "id": 463 + } + } + ], + "special_hardcoded": [ + "00000000-0000-0000-0000-000000000001", + "00000000-0000-0000-0000-000000000002", + "442d85ed-8272-4543-a6f1-418f90ded05d", + "602234e4-cac1-4353-8bb7-b1ebff70024b", + "85939755-ba10-4d9d-a4cc-efb7a8e943c4", + "8b36268c-1829-483c-a0f1-993b7156a8f2", + "98c84b38-1085-46bd-b1ce-dd38c159e6cc", + "aecd2294-4b94-434b-8667-4499bb2c9327", + "b5c5d105-75a2-4076-af2b-923ea2bf4bf0", + "d1ca6b84-338e-4f2f-9c6b-76cc8b4bd98d", + "d392b075-4ba1-40ae-8789-af868d56f6ce", + "d81aaeaf-e172-4440-9225-868df030d27b" + ] +} \ No newline at end of file diff --git a/src/Server.php b/src/Server.php index 71e43b1556..0fc467bef3 100644 --- a/src/Server.php +++ b/src/Server.php @@ -959,7 +959,7 @@ class Server{ $this->commandMap = new SimpleCommandMap($this); - $this->craftingManager = CraftingManagerFromDataHelper::make(Path::join(\pocketmine\BEDROCK_DATA_PATH, "recipes.json")); + $this->craftingManager = CraftingManagerFromDataHelper::make(Path::join(\pocketmine\RESOURCE_PATH, "legacy_recipes.json")); $this->resourceManager = new ResourcePackManager(Path::join($this->getDataPath(), "resource_packs"), $this->logger); diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 8037e60917..25d3152a48 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -37,7 +37,7 @@ final class CreativeInventory{ private array $creative = []; private function __construct(){ - $creativeItems = json_decode(Filesystem::fileGetContents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json")), true); + $creativeItems = json_decode(Filesystem::fileGetContents(Path::join(\pocketmine\RESOURCE_PATH, "legacy_creativeitems.json")), true); foreach($creativeItems as $data){ $item = Item::jsonDeserialize($data); From e9b994cbc3cf979b902738d0a6563bef6a832a04 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 15:29:45 +0000 Subject: [PATCH 0557/1858] Allow limiting max schema ID loaded for item ID upgrading --- .../bedrock/item/upgrade/ItemDataUpgrader.php | 6 +++--- .../item/upgrade/ItemIdMetaUpgradeSchema.php | 4 ++-- .../item/upgrade/ItemIdMetaUpgradeSchemaUtils.php | 15 +++++++++------ src/world/format/io/GlobalItemDataHandlers.php | 3 ++- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index defaed6a39..f37bc7f8e7 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -64,10 +64,10 @@ final class ItemDataUpgrader{ } public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ - if(isset($this->idMetaUpgradeSchemas[$schema->getPriority()])){ - throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getPriority()); + if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ + throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); } - $this->idMetaUpgradeSchemas[$schema->getPriority()] = $schema; + $this->idMetaUpgradeSchemas[$schema->getSchemaId()] = $schema; ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); } diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php index e88111ef21..8a271e4307 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php @@ -36,10 +36,10 @@ final class ItemIdMetaUpgradeSchema{ public function __construct( private array $renamedIds, private array $remappedMetas, - private int $priority + private int $schemaId ){} - public function getPriority() : int{ return $this->priority; } + public function getSchemaId() : int{ return $this->schemaId; } public function renameId(string $id) : ?string{ return $this->renamedIds[mb_strtolower($id, 'US-ASCII')] ?? null; diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php index 6aade2eaa8..ef1543a80a 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -39,7 +39,7 @@ final class ItemIdMetaUpgradeSchemaUtils{ * @return ItemIdMetaUpgradeSchema[] * @phpstan-return array */ - public static function loadSchemas(string $path) : array{ + public static function loadSchemas(string $path, int $maxSchemaId) : array{ $iterator = new \RegexIterator( new \FilesystemIterator( $path, @@ -55,26 +55,29 @@ final class ItemIdMetaUpgradeSchemaUtils{ /** @var string[] $matches */ foreach($iterator as $matches){ $filename = $matches[0]; - $priority = (int) $matches[1]; + $schemaId = (int) $matches[1]; + if($schemaId > $maxSchemaId){ + continue; + } $fullPath = Path::join($path, $filename); $raw = Filesystem::fileGetContents($fullPath); try{ - $schema = self::loadSchemaFromString($raw, $priority); + $schema = self::loadSchemaFromString($raw, $schemaId); }catch(\RuntimeException $e){ throw new \RuntimeException("Loading schema file $fullPath: " . $e->getMessage(), 0, $e); } - $result[$priority] = $schema; + $result[$schemaId] = $schema; } ksort($result, SORT_NUMERIC); return $result; } - public static function loadSchemaFromString(string $raw, int $priority) : ItemIdMetaUpgradeSchema{ + public static function loadSchemaFromString(string $raw, int $schemaId) : ItemIdMetaUpgradeSchema{ try{ $json = json_decode($raw, false, flags: JSON_THROW_ON_ERROR); }catch(\JsonException $e){ @@ -91,6 +94,6 @@ final class ItemIdMetaUpgradeSchemaUtils{ throw new \RuntimeException($e->getMessage(), 0, $e); } - return new ItemIdMetaUpgradeSchema($model->renamedIds, $model->remappedMetas, $priority); + return new ItemIdMetaUpgradeSchema($model->renamedIds, $model->remappedMetas, $schemaId); } } diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index dab291b581..d7530113a2 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -33,6 +33,7 @@ use Symfony\Component\Filesystem\Path; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; final class GlobalItemDataHandlers{ + public const MAX_ITEM_ID_UPGRADE_SCHEMA_ID = 81; //0081_1.18.30_to_1.19.30.34_beta.json private static ?ItemSerializer $itemSerializer = null; @@ -53,7 +54,7 @@ final class GlobalItemDataHandlers{ LegacyItemIdToStringIdMap::getInstance(), R12ItemIdToBlockIdMap::getInstance(), GlobalBlockStateHandlers::getUpgrader(), - ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema')) + ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID) ); } } From 6b7a4e2c418e369348d00c3933cbe2934b49a22c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 16:08:49 +0000 Subject: [PATCH 0558/1858] Split up ItemDataUpgrader (preparing for code backport) --- .../bedrock/item/upgrade/ItemDataUpgrader.php | 49 ++---------- .../item/upgrade/ItemIdMetaUpgrader.php | 77 +++++++++++++++++++ .../format/io/GlobalItemDataHandlers.php | 5 +- 3 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index f37bc7f8e7..47ac61219c 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -36,40 +36,19 @@ use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\StringTag; use pocketmine\utils\Binary; use function assert; -use function ksort; -use const SORT_NUMERIC; final class ItemDataUpgrader{ private const TAG_LEGACY_ID = "id"; //TAG_Short (or TAG_String for Java itemstacks) /** - * @var ItemIdMetaUpgradeSchema[] - * @phpstan-var array - */ - private array $idMetaUpgradeSchemas = []; - - /** - * @param ItemIdMetaUpgradeSchema[] $idMetaUpgradeSchemas * @phpstan-param array $idMetaUpgradeSchemas */ public function __construct( + private ItemIdMetaUpgrader $idMetaUpgrader, private LegacyItemIdToStringIdMap $legacyIntToStringIdMap, private R12ItemIdToBlockIdMap $r12ItemIdToBlockIdMap, private BlockDataUpgrader $blockDataUpgrader, - array $idMetaUpgradeSchemas - ){ - foreach($idMetaUpgradeSchemas as $schema){ - $this->addIdMetaUpgradeSchema($schema); - } - } - - public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ - if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ - throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); - } - $this->idMetaUpgradeSchemas[$schema->getSchemaId()] = $schema; - ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); - } + ){} /** * This function replaces the legacy ItemFactory::get(). @@ -87,7 +66,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? @@ -107,6 +86,8 @@ final class ItemDataUpgrader{ * @throws SavedDataLoadingException if the legacy numeric ID doesn't map to a string ID */ public function upgradeItemTypeDataInt(int $legacyNumericId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ + //do not upgrade the ID beyond this initial step - we need the 1.12 ID for the item ID -> block ID map in the + //next step $rawNameId = $this->legacyIntToStringIdMap->legacyToString($legacyNumericId); if($rawNameId === null){ throw new SavedDataLoadingException("Unmapped legacy item ID $legacyNumericId"); @@ -158,7 +139,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? @@ -217,21 +198,5 @@ final class ItemDataUpgrader{ ); } - /** - * @phpstan-return array{string, int} - */ - public function upgradeItemStringIdMeta(string $id, int $meta) : array{ - $newId = $id; - $newMeta = $meta; - foreach($this->idMetaUpgradeSchemas as $schema){ - if(($remappedMetaId = $schema->remapMeta($newId, $newMeta)) !== null){ - $newId = $remappedMetaId; - $newMeta = 0; - }elseif(($renamedId = $schema->renameId($newId)) !== null){ - $newId = $renamedId; - } - } - - return [$newId, $newMeta]; - } + public function getIdMetaUpgrader() : ItemIdMetaUpgrader{ return $this->idMetaUpgrader; } } diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php new file mode 100644 index 0000000000..6a0ec3eedd --- /dev/null +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php @@ -0,0 +1,77 @@ + + */ + private array $idMetaUpgradeSchemas = []; + + /** + * @param ItemIdMetaUpgradeSchema[] $idMetaUpgradeSchemas + * @phpstan-param array $idMetaUpgradeSchemas + */ + public function __construct( + array $idMetaUpgradeSchemas, + ){ + foreach($idMetaUpgradeSchemas as $schema){ + $this->addIdMetaUpgradeSchema($schema); + } + } + + public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ + if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ + throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); + } + $this->idMetaUpgradeSchemas[$schema->getSchemaId()] = $schema; + ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); + } + + /** + * @phpstan-return array{string, int} + */ + public function upgradeStringIdMeta(string $id, int $meta) : array{ + $newId = $id; + $newMeta = $meta; + foreach($this->idMetaUpgradeSchemas as $schema){ + if(($remappedMetaId = $schema->remapMeta($newId, $newMeta)) !== null){ + $newId = $remappedMetaId; + $newMeta = 0; + }elseif(($renamedId = $schema->renameId($newId)) !== null){ + $newId = $renamedId; + } + } + + return [$newId, $newMeta]; + } +} diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index d7530113a2..3c456dabd8 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; +use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgrader; use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgradeSchemaUtils; use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\bedrock\item\upgrade\R12ItemIdToBlockIdMap; @@ -51,10 +52,10 @@ final class GlobalItemDataHandlers{ public static function getUpgrader() : ItemDataUpgrader{ return self::$itemDataUpgrader ??= new ItemDataUpgrader( + new ItemIdMetaUpgrader(ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID)), LegacyItemIdToStringIdMap::getInstance(), R12ItemIdToBlockIdMap::getInstance(), - GlobalBlockStateHandlers::getUpgrader(), - ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID) + GlobalBlockStateHandlers::getUpgrader() ); } } From da5302ca86825451d01c3879d785cc6702f22a24 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 16:21:50 +0000 Subject: [PATCH 0559/1858] BlockStateData: introduce and use current() --- src/crafting/CraftingManagerFromDataHelper.php | 2 +- src/data/bedrock/block/BlockStateData.php | 8 ++++++++ src/data/bedrock/block/convert/BlockStateWriter.php | 2 +- src/data/bedrock/block/upgrade/BlockDataUpgrader.php | 2 +- src/network/mcpe/convert/RuntimeBlockMapping.php | 2 +- src/world/format/io/GlobalBlockStateHandlers.php | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 8e0bb8e04f..228e3623a9 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -117,7 +117,7 @@ final class CraftingManagerFromDataHelper{ ->read(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => base64_decode($blockStatesRaw, true))) ->mustGetCompoundTag() ->getValue(); - $blockStateData = new BlockStateData($blockName, $blockStatesTag, BlockStateData::CURRENT_VERSION); + $blockStateData = BlockStateData::current($blockName, $blockStatesTag); }else{ $blockStateData = null; } diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index be0048c6d2..6ac0184f72 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -58,6 +58,14 @@ final class BlockStateData{ private int $version ){} + /** + * @param Tag[] $states + * @phpstan-param array $states + */ + public static function current(string $name, array $states) : self{ + return new self($name, $states, self::CURRENT_VERSION); + } + public function getName() : string{ return $this->name; } /** diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index db305bb3d8..eefd2ec69d 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -281,6 +281,6 @@ final class BlockStateWriter{ } public function getBlockStateData() : BlockStateData{ - return new BlockStateData($this->id, $this->states, BlockStateData::CURRENT_VERSION); + return BlockStateData::current($this->id, $this->states); } } diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index e27469ac2f..ad73cc98a5 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -51,7 +51,7 @@ final class BlockDataUpgrader{ $blockStateData = $this->upgradeStringIdMeta($id, $data); if($blockStateData === null){ //unknown block, invalid ID - $blockStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); + $blockStateData = BlockStateData::current(BlockTypeNames::INFO_UPDATE, []); } }else{ //Modern (post-1.13) blockstate diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index f4d57924b4..a379cd659f 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -63,7 +63,7 @@ final class RuntimeBlockMapping{ private BlockStateSerializer $blockStateSerializer ){ $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData( - new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION) + BlockStateData::current(BlockTypeNames::INFO_UPDATE, []) ) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); //lookup the state data from the dictionary to avoid keeping two copies of the same data around $this->fallbackStateData = $this->blockStateDictionary->getDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index bd983dea82..1d7476acdd 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -84,6 +84,6 @@ final class GlobalBlockStateHandlers{ } public static function getUnknownBlockStateData() : BlockStateData{ - return self::$unknownBlockStateData ??= new BlockStateData(BlockTypeNames::INFO_UPDATE, [], BlockStateData::CURRENT_VERSION); + return self::$unknownBlockStateData ??= BlockStateData::current(BlockTypeNames::INFO_UPDATE, []); } } From 433b0ca6ccaf415b0d2b012bad4d656dac38c621 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 16:23:21 +0000 Subject: [PATCH 0560/1858] Fix PHPStan --- src/data/bedrock/item/upgrade/ItemDataUpgrader.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 47ac61219c..07629043ee 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -40,9 +40,6 @@ use function assert; final class ItemDataUpgrader{ private const TAG_LEGACY_ID = "id"; //TAG_Short (or TAG_String for Java itemstacks) - /** - * @phpstan-param array $idMetaUpgradeSchemas - */ public function __construct( private ItemIdMetaUpgrader $idMetaUpgrader, private LegacyItemIdToStringIdMap $legacyIntToStringIdMap, From 981385cf4a3b1ab5d9aabbeed4294ed2ee79bebb Mon Sep 17 00:00:00 2001 From: alvin0319 Date: Sat, 4 Feb 2023 23:04:31 +0900 Subject: [PATCH 0561/1858] GeneratorManager: Removed redundant Closure wrapping (#5551) --- src/world/generator/GeneratorManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/generator/GeneratorManager.php b/src/world/generator/GeneratorManager.php index a00edd5591..180450b72a 100644 --- a/src/world/generator/GeneratorManager.php +++ b/src/world/generator/GeneratorManager.php @@ -40,7 +40,7 @@ final class GeneratorManager{ private array $list = []; public function __construct(){ - $this->addGenerator(Flat::class, "flat", \Closure::fromCallable(function(string $preset) : ?InvalidGeneratorOptionsException{ + $this->addGenerator(Flat::class, "flat", function(string $preset) : ?InvalidGeneratorOptionsException{ if($preset === ""){ return null; } @@ -50,7 +50,7 @@ final class GeneratorManager{ }catch(InvalidGeneratorOptionsException $e){ return $e; } - })); + }); $this->addGenerator(Normal::class, "normal", fn() => null); $this->addGenerator(Normal::class, "default", fn() => null); $this->addGenerator(Nether::class, "hell", fn() => null); From 811352e2ef1c8ea744d1454b5058a4947a0a8741 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 11:50:10 +0000 Subject: [PATCH 0562/1858] Bump build/php from `c658506` to `f51e954` (#5555) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `c658506` to `f51e954`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/c6585061ca9b2f5aed7d030aae583fc3de9b2557...f51e954743d32aba515a91b2d8b7e6a65e4ac064) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index c6585061ca..f51e954743 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit c6585061ca9b2f5aed7d030aae583fc3de9b2557 +Subproject commit f51e954743d32aba515a91b2d8b7e6a65e4ac064 From 8d2a9ce67cda6c13340151da2898d7e4d1d08cfa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Feb 2023 12:09:19 +0000 Subject: [PATCH 0563/1858] Clean PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 87fbb0ebab..90ec78b196 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -20,11 +20,6 @@ parameters: count: 1 path: ../../../src/Server.php - - - message: "#^Parameter \\#1 \\$input of function yaml_parse expects string, string\\|false given\\.$#" - count: 1 - path: ../../../src/Server.php - - message: "#^Cannot cast mixed to int\\.$#" count: 2 @@ -580,11 +575,6 @@ parameters: count: 1 path: ../../../src/inventory/CreativeInventory.php - - - message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" - count: 1 - path: ../../../src/inventory/CreativeInventory.php - - message: "#^Parameter \\#2 \\$recipe of class pocketmine\\\\event\\\\inventory\\\\CraftItemEvent constructor expects pocketmine\\\\crafting\\\\CraftingRecipe, pocketmine\\\\crafting\\\\CraftingRecipe\\|null given\\.$#" count: 1 From 8912a97be7e9cdc20512e30256ce58e7aad03018 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Feb 2023 12:11:42 +0000 Subject: [PATCH 0564/1858] Update Composer dependencies --- composer.lock | 52 +++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/composer.lock b/composer.lock index e8987fccf4..9ae4cab1d6 100644 --- a/composer.lock +++ b/composer.lock @@ -2309,16 +2309,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.28", + "version": "9.6.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e" + "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", "shasum": "" }, "require": { @@ -2360,7 +2360,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -2391,7 +2391,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" }, "funding": [ { @@ -2407,7 +2407,7 @@ "type": "tidelift" } ], - "time": "2023-01-14T12:32:24+00:00" + "time": "2023-02-04T13:37:15+00:00" }, { "name": "sebastian/cli-parser", @@ -2775,16 +2775,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -2826,7 +2826,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -2834,7 +2834,7 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", @@ -3148,16 +3148,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -3196,10 +3196,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -3207,7 +3207,7 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", @@ -3266,16 +3266,16 @@ }, { "name": "sebastian/type", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { @@ -3310,7 +3310,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -3318,7 +3318,7 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", From 41ab698f93a5b72add7b332ec53df43430845ee7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Feb 2023 12:29:54 +0000 Subject: [PATCH 0565/1858] wrong filename --- src/data/bedrock/LegacyItemIdToStringIdMap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/LegacyItemIdToStringIdMap.php b/src/data/bedrock/LegacyItemIdToStringIdMap.php index 9f5c257ddf..85a2939a3c 100644 --- a/src/data/bedrock/LegacyItemIdToStringIdMap.php +++ b/src/data/bedrock/LegacyItemIdToStringIdMap.php @@ -30,6 +30,6 @@ final class LegacyItemIdToStringIdMap extends LegacyToStringBidirectionalIdMap{ use SingletonTrait; public function __construct(){ - parent::__construct(Path::join(\pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'item_id_map.json')); + parent::__construct(Path::join(\pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'item_legacy_id_map.json')); } } From 39207c79923feb93a37b387254df61a561d88c1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 12:39:49 +0000 Subject: [PATCH 0566/1858] Bump phpstan/phpstan from 1.9.14 to 1.9.15 (#5557) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.14 to 1.9.15. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.14...1.9.15) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index c4570bb09c..712515cf74 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.14", + "phpstan/phpstan": "1.9.15", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 9ae4cab1d6..0a3a8ebd7b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2c0f273b515174abfdcef4fc4ad3c262", + "content-hash": "140417e76259e8c3f520623c3de3f1e7", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.14", + "version": "1.9.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e5fcc96289cf737304286a9b505fbed091f02e58" + "reference": "642f5d78e4bfb9d9bebed898740ca82b53264d9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5fcc96289cf737304286a9b505fbed091f02e58", - "reference": "e5fcc96289cf737304286a9b505fbed091f02e58", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/642f5d78e4bfb9d9bebed898740ca82b53264d9b", + "reference": "642f5d78e4bfb9d9bebed898740ca82b53264d9b", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.14" + "source": "https://github.com/phpstan/phpstan/tree/1.9.15" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-19T10:47:09+00:00" + "time": "2023-02-07T07:49:27+00:00" }, { "name": "phpstan/phpstan-phpunit", From e47627f56577666d8f3aee1bb8a0ccf616b3a24b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 10:09:15 +0000 Subject: [PATCH 0567/1858] Bump build/php from `f51e954` to `fb297eb` (#5558) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `f51e954` to `fb297eb`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/f51e954743d32aba515a91b2d8b7e6a65e4ac064...fb297eb511862ef3d4ca0aff5256a8caf5513cb4) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index f51e954743..fb297eb511 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit f51e954743d32aba515a91b2d8b7e6a65e4ac064 +Subproject commit fb297eb511862ef3d4ca0aff5256a8caf5513cb4 From 5d7b99daf4d438173cefd7c5f7da8d62b5aca153 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 10:55:09 +0000 Subject: [PATCH 0568/1858] Bump phpstan/phpstan from 1.9.15 to 1.9.16 (#5560) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.15 to 1.9.16. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.15...1.9.16) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 712515cf74..03b37a0144 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.15", + "phpstan/phpstan": "1.9.16", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 0a3a8ebd7b..dc1ee168fa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "140417e76259e8c3f520623c3de3f1e7", + "content-hash": "8b0866fdb437375a50307205a9e01643", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.15", + "version": "1.9.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "642f5d78e4bfb9d9bebed898740ca82b53264d9b" + "reference": "922e2689bb180575d0f57de0443c431a5a698e8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/642f5d78e4bfb9d9bebed898740ca82b53264d9b", - "reference": "642f5d78e4bfb9d9bebed898740ca82b53264d9b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/922e2689bb180575d0f57de0443c431a5a698e8f", + "reference": "922e2689bb180575d0f57de0443c431a5a698e8f", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.15" + "source": "https://github.com/phpstan/phpstan/tree/1.9.16" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-07T07:49:27+00:00" + "time": "2023-02-07T10:42:21+00:00" }, { "name": "phpstan/phpstan-phpunit", From 3ba662f64fcfb9c9bd120d95b975505aeeba6438 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 18:46:37 +0000 Subject: [PATCH 0569/1858] 1.19.60 --- composer.json | 4 +-- composer.lock | 26 +++++++++--------- src/entity/Human.php | 13 ++++----- src/network/mcpe/NetworkSession.php | 41 +++++++++++++++-------------- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/composer.json b/composer.json index 03b37a0144..26de28c159 100644 --- a/composer.json +++ b/composer.json @@ -34,8 +34,8 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-data": "~1.13.0+bedrock-1.19.50", - "pocketmine/bedrock-protocol": "~18.1.0+bedrock-1.19.50", + "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", + "pocketmine/bedrock-protocol": "~19.0.0+bedrock-1.19.60", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index dc1ee168fa..6ff40e4215 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8b0866fdb437375a50307205a9e01643", + "content-hash": "f516e1546e5d16c31fef01d2a98c0da8", "packages": [ { "name": "adhocore/json-comment", @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "1.13.0+bedrock-1.19.50", + "version": "1.14.0+bedrock-1.19.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "57337ddc9433a0e245a1ce48c51af05f0573d58d" + "reference": "7b06234ec6e1f4fb06ad4b2f177e606c25df9b46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/57337ddc9433a0e245a1ce48c51af05f0573d58d", - "reference": "57337ddc9433a0e245a1ce48c51af05f0573d58d", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/7b06234ec6e1f4fb06ad4b2f177e606c25df9b46", + "reference": "7b06234ec6e1f4fb06ad4b2f177e606c25df9b46", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.50" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.60" }, - "time": "2022-11-30T16:19:59+00:00" + "time": "2023-02-08T18:32:01+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "18.1.0+bedrock-1.19.50", + "version": "19.0.0+bedrock-1.19.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "c34f22847a1cc362a3f1c45698576d30d1e8392f" + "reference": "3c8cf08d09b8b3fafc209d184e66e50d2e34c06c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/c34f22847a1cc362a3f1c45698576d30d1e8392f", - "reference": "c34f22847a1cc362a3f1c45698576d30d1e8392f", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/3c8cf08d09b8b3fafc209d184e66e50d2e34c06c", + "reference": "3c8cf08d09b8b3fafc209d184e66e50d2e34c06c", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/18.1.0+bedrock-1.19.50" + "source": "https://github.com/pmmp/BedrockProtocol/tree/19.0.0+bedrock-1.19.60" }, - "time": "2023-01-20T12:35:30+00:00" + "time": "2023-02-08T18:38:02+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/entity/Human.php b/src/entity/Human.php index 58911a07cf..50034e5c35 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -50,6 +50,7 @@ use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\AddPlayerPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayerSkinPacket; +use pocketmine\network\mcpe\protocol\types\AbilitiesData; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; use pocketmine\network\mcpe\protocol\types\DeviceOS; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; @@ -60,7 +61,7 @@ use pocketmine\network\mcpe\protocol\types\GameMode; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; -use pocketmine\network\mcpe\protocol\types\UpdateAbilitiesPacketLayer; +use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\player\Player; use pocketmine\utils\Limits; @@ -507,14 +508,14 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ GameMode::SURVIVAL, $this->getAllNetworkData(), new PropertySyncData([], []), - UpdateAbilitiesPacket::create(CommandPermissions::NORMAL, PlayerPermissions::VISITOR, $this->getId() /* TODO: this should be unique ID */, [ - new UpdateAbilitiesPacketLayer( - UpdateAbilitiesPacketLayer::LAYER_BASE, - array_fill(0, UpdateAbilitiesPacketLayer::NUMBER_OF_ABILITIES, false), + UpdateAbilitiesPacket::create(new AbilitiesData(CommandPermissions::NORMAL, PlayerPermissions::VISITOR, $this->getId() /* TODO: this should be unique ID */, [ + new AbilitiesLayer( + AbilitiesLayer::LAYER_BASE, + array_fill(0, AbilitiesLayer::NUMBER_OF_ABILITIES, false), 0.0, 0.0 ) - ]), + ])), [], //TODO: entity links "", //device ID (we intentionally don't send this - secvuln) DeviceOS::UNKNOWN //we intentionally don't send this (secvuln) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 49f87793fb..4e7f051276 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -90,6 +90,7 @@ use pocketmine\network\mcpe\protocol\TakeItemActorPacket; use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\ToastRequestPacket; use pocketmine\network\mcpe\protocol\TransferPacket; +use pocketmine\network\mcpe\protocol\types\AbilitiesData; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\command\CommandData; use pocketmine\network\mcpe\protocol\types\command\CommandEnum; @@ -103,7 +104,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; -use pocketmine\network\mcpe\protocol\types\UpdateAbilitiesPacketLayer; +use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\network\mcpe\protocol\UpdateAdventureSettingsPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; @@ -848,33 +849,33 @@ class NetworkSession{ //ALL of these need to be set for the base layer, otherwise the client will cry $boolAbilities = [ - UpdateAbilitiesPacketLayer::ABILITY_ALLOW_FLIGHT => $for->getAllowFlight(), - UpdateAbilitiesPacketLayer::ABILITY_FLYING => $for->isFlying(), - UpdateAbilitiesPacketLayer::ABILITY_NO_CLIP => !$for->hasBlockCollision(), - UpdateAbilitiesPacketLayer::ABILITY_OPERATOR => $isOp, - UpdateAbilitiesPacketLayer::ABILITY_TELEPORT => $for->hasPermission(DefaultPermissionNames::COMMAND_TELEPORT_SELF), - UpdateAbilitiesPacketLayer::ABILITY_INVULNERABLE => $for->isCreative(), - UpdateAbilitiesPacketLayer::ABILITY_MUTED => false, - UpdateAbilitiesPacketLayer::ABILITY_WORLD_BUILDER => false, - UpdateAbilitiesPacketLayer::ABILITY_INFINITE_RESOURCES => !$for->hasFiniteResources(), - UpdateAbilitiesPacketLayer::ABILITY_LIGHTNING => false, - UpdateAbilitiesPacketLayer::ABILITY_BUILD => !$for->isSpectator(), - UpdateAbilitiesPacketLayer::ABILITY_MINE => !$for->isSpectator(), - UpdateAbilitiesPacketLayer::ABILITY_DOORS_AND_SWITCHES => !$for->isSpectator(), - UpdateAbilitiesPacketLayer::ABILITY_OPEN_CONTAINERS => !$for->isSpectator(), - UpdateAbilitiesPacketLayer::ABILITY_ATTACK_PLAYERS => !$for->isSpectator(), - UpdateAbilitiesPacketLayer::ABILITY_ATTACK_MOBS => !$for->isSpectator(), + AbilitiesLayer::ABILITY_ALLOW_FLIGHT => $for->getAllowFlight(), + AbilitiesLayer::ABILITY_FLYING => $for->isFlying(), + AbilitiesLayer::ABILITY_NO_CLIP => !$for->hasBlockCollision(), + AbilitiesLayer::ABILITY_OPERATOR => $isOp, + AbilitiesLayer::ABILITY_TELEPORT => $for->hasPermission(DefaultPermissionNames::COMMAND_TELEPORT_SELF), + AbilitiesLayer::ABILITY_INVULNERABLE => $for->isCreative(), + AbilitiesLayer::ABILITY_MUTED => false, + AbilitiesLayer::ABILITY_WORLD_BUILDER => false, + AbilitiesLayer::ABILITY_INFINITE_RESOURCES => !$for->hasFiniteResources(), + AbilitiesLayer::ABILITY_LIGHTNING => false, + AbilitiesLayer::ABILITY_BUILD => !$for->isSpectator(), + AbilitiesLayer::ABILITY_MINE => !$for->isSpectator(), + AbilitiesLayer::ABILITY_DOORS_AND_SWITCHES => !$for->isSpectator(), + AbilitiesLayer::ABILITY_OPEN_CONTAINERS => !$for->isSpectator(), + AbilitiesLayer::ABILITY_ATTACK_PLAYERS => !$for->isSpectator(), + AbilitiesLayer::ABILITY_ATTACK_MOBS => !$for->isSpectator(), ]; - $this->sendDataPacket(UpdateAbilitiesPacket::create( + $this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData( $isOp ? CommandPermissions::OPERATOR : CommandPermissions::NORMAL, $isOp ? PlayerPermissions::OPERATOR : PlayerPermissions::MEMBER, $for->getId(), [ //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! - new UpdateAbilitiesPacketLayer(UpdateAbilitiesPacketLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), + new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), ] - )); + ))); } public function syncAdventureSettings() : void{ From 7bbc04e6deaf5dd31d2d3f4f17e18517f1fcc440 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 18:55:38 +0000 Subject: [PATCH 0570/1858] Silence PlayerSkinPacket debug messages during spawn response stage the client sends its skin here in 1.19.60 for some reason, which makes no sense - I can only assume it's a bug --- src/network/mcpe/handler/SpawnResponsePacketHandler.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/network/mcpe/handler/SpawnResponsePacketHandler.php b/src/network/mcpe/handler/SpawnResponsePacketHandler.php index 554322af59..2ebb9d2b6b 100644 --- a/src/network/mcpe/handler/SpawnResponsePacketHandler.php +++ b/src/network/mcpe/handler/SpawnResponsePacketHandler.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket; +use pocketmine\network\mcpe\protocol\PlayerSkinPacket; use pocketmine\network\mcpe\protocol\SetLocalPlayerAsInitializedPacket; final class SpawnResponsePacketHandler extends PacketHandler{ @@ -37,6 +38,13 @@ final class SpawnResponsePacketHandler extends PacketHandler{ return true; } + public function handlePlayerSkin(PlayerSkinPacket $packet) : bool{ + //TODO: REMOVE THIS + //As of 1.19.60, we receive this packet during pre-spawn for no obvious reason. The skin is still sent in the + //login packet, so we can ignore this one. If unhandled, this packet makes a huge debug spam in the log. + return true; + } + public function handlePlayerAuthInput(PlayerAuthInputPacket $packet) : bool{ //the client will send this every tick once we start sending chunks, but we don't handle it in this stage //this is very spammy so we filter it out From 5a4550a4fc19cf08715833f781f496b954d43162 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 18:55:49 +0000 Subject: [PATCH 0571/1858] CS --- src/entity/Human.php | 2 +- src/network/mcpe/NetworkSession.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/entity/Human.php b/src/entity/Human.php index 50034e5c35..5ede1abf8b 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -51,6 +51,7 @@ use pocketmine\network\mcpe\protocol\AddPlayerPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayerSkinPacket; use pocketmine\network\mcpe\protocol\types\AbilitiesData; +use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; use pocketmine\network\mcpe\protocol\types\DeviceOS; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; @@ -61,7 +62,6 @@ use pocketmine\network\mcpe\protocol\types\GameMode; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; -use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\player\Player; use pocketmine\utils\Limits; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 4e7f051276..0caccb53cb 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -91,6 +91,7 @@ use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\ToastRequestPacket; use pocketmine\network\mcpe\protocol\TransferPacket; use pocketmine\network\mcpe\protocol\types\AbilitiesData; +use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\command\CommandData; use pocketmine\network\mcpe\protocol\types\command\CommandEnum; @@ -104,7 +105,6 @@ use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; -use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\network\mcpe\protocol\UpdateAdventureSettingsPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; From 40b90bb722c1278cd2b04a4981bd9a0664cca4a4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 19:47:12 +0000 Subject: [PATCH 0572/1858] InGamePacketHandler: log a debug when processing skin change requests --- src/network/mcpe/handler/InGamePacketHandler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index cc2c24776c..f93b4da5ae 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -745,6 +745,7 @@ class InGamePacketHandler extends PacketHandler{ } public function handlePlayerSkin(PlayerSkinPacket $packet) : bool{ + $this->session->getLogger()->debug("Processing skin change request"); try{ $skin = SkinAdapterSingleton::get()->fromSkinData($packet->skin); }catch(InvalidSkinException $e){ From 475888b0318b3eaca3c749563c338b2d07e27e93 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 20:16:41 +0000 Subject: [PATCH 0573/1858] InGamePacketHandler: do not process repeated skin change requests for the same full skin ID this fixes a feedback loop with persona skins in 1.19.60. --- src/network/mcpe/handler/InGamePacketHandler.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index f93b4da5ae..40e77f4107 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -149,6 +149,8 @@ class InGamePacketHandler extends PacketHandler{ /** @var bool */ public $forceMoveSync = false; + protected ?string $lastRequestedFullSkinId = null; + public function __construct( private Player $player, private NetworkSession $session, @@ -745,6 +747,14 @@ class InGamePacketHandler extends PacketHandler{ } public function handlePlayerSkin(PlayerSkinPacket $packet) : bool{ + if($packet->skin->getFullSkinId() === $this->lastRequestedFullSkinId){ + //TODO: HACK! In 1.19.60, the client sends its skin back to us if we sent it a skin different from the one + //it's using. We need to prevent this from causing a feedback loop. + $this->session->getLogger()->debug("Refused duplicate skin change request"); + return true; + } + $this->lastRequestedFullSkinId = $packet->skin->getFullSkinId(); + $this->session->getLogger()->debug("Processing skin change request"); try{ $skin = SkinAdapterSingleton::get()->fromSkinData($packet->skin); From c7930ce9ec0045e712d21a65b95a24be6e051c8c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 20:21:42 +0000 Subject: [PATCH 0574/1858] Release 4.14.0 --- changelogs/4.14.md | 14 ++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.14.md diff --git a/changelogs/4.14.md b/changelogs/4.14.md new file mode 100644 index 0000000000..206e990486 --- /dev/null +++ b/changelogs/4.14.md @@ -0,0 +1,14 @@ +**For Minecraft: Bedrock Edition 1.19.60** + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.14.0 +Released 8th February 2023. + +## General +- Added support for Minecraft: Bedrock Edition 1.19.60. +- Removed support for older versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 253c907d3c..746da4e504 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.13.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.14.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From c62845e92a82254aa169b7a6e0b98561beacf084 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Feb 2023 20:21:43 +0000 Subject: [PATCH 0575/1858] 4.14.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 746da4e504..74aeaa19c5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.14.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.14.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From fbaf8e3fc826f67964e3de5418cbe3e7afa13353 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 11 Feb 2023 17:13:12 +0000 Subject: [PATCH 0576/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 26de28c159..74be1967b9 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.16", + "phpstan/phpstan": "1.9.17", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 6ff40e4215..630320020f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f516e1546e5d16c31fef01d2a98c0da8", + "content-hash": "f4a0fb9a6731f083ef7e29fc3f527171", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.16", + "version": "1.9.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "922e2689bb180575d0f57de0443c431a5a698e8f" + "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/922e2689bb180575d0f57de0443c431a5a698e8f", - "reference": "922e2689bb180575d0f57de0443c431a5a698e8f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2", + "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.16" + "source": "https://github.com/phpstan/phpstan/tree/1.9.17" }, "funding": [ { @@ -1887,20 +1887,20 @@ "type": "tidelift" } ], - "time": "2023-02-07T10:42:21+00:00" + "time": "2023-02-08T12:25:00+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "54a24bd23e9e80ee918cdc24f909d376c2e273f7" + "reference": "d77af96c1aaec28f7c0293677132eaaad079e01b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/54a24bd23e9e80ee918cdc24f909d376c2e273f7", - "reference": "54a24bd23e9e80ee918cdc24f909d376c2e273f7", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d77af96c1aaec28f7c0293677132eaaad079e01b", + "reference": "d77af96c1aaec28f7c0293677132eaaad079e01b", "shasum": "" }, "require": { @@ -1937,9 +1937,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.3" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.4" }, - "time": "2022-12-21T15:25:00+00:00" + "time": "2023-02-09T08:05:29+00:00" }, { "name": "phpstan/phpstan-strict-rules", From 5d0388e7478428d3c575bcdde4bc62da9ddb0299 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 11:10:29 +0000 Subject: [PATCH 0577/1858] PlayerPreLoginEvent no longer implements Cancellable please see #5516 for motivation on this, but I don't think anyone will be complaining - this behaviour made no sense and caused a lot of confusion for people who were trying to set custom ban messages. --- src/event/player/PlayerPreLoginEvent.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/event/player/PlayerPreLoginEvent.php b/src/event/player/PlayerPreLoginEvent.php index 258120fd7c..8a3bbec9f8 100644 --- a/src/event/player/PlayerPreLoginEvent.php +++ b/src/event/player/PlayerPreLoginEvent.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\event\player; -use pocketmine\event\Cancellable; use pocketmine\event\Event; use pocketmine\lang\Translatable; use pocketmine\player\PlayerInfo; @@ -40,7 +39,7 @@ use function count; * WARNING: Any information about the player CANNOT be trusted at this stage, because they are not authenticated and * could be a hacker posing as another player. */ -class PlayerPreLoginEvent extends Event implements Cancellable{ +class PlayerPreLoginEvent extends Event{ public const KICK_REASON_PLUGIN = 0; public const KICK_REASON_SERVER_FULL = 1; public const KICK_REASON_SERVER_WHITELISTED = 2; @@ -160,8 +159,4 @@ class PlayerPreLoginEvent extends Event implements Cancellable{ return ""; } - - public function isCancelled() : bool{ - return !$this->isAllowed(); - } } From 2d56aa50b9469a53ec6bfbddc2f5337624dbf170 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 11:32:32 +0000 Subject: [PATCH 0578/1858] A bunch of mostly inseparable changes to PlayerPreLoginEvent including support for separated disconnect reasons and disconnect screen messages (closes #4512) While the refactoring of kick reason -> kick flag wasn't exactly in my agenda, I realized that these changes would become pretty confusing and inconsistent with other events if they weren't refactored. Hopefully I don't have to break this API again for a while... --- src/event/player/PlayerPreLoginEvent.php | 100 ++++++++++++------ .../mcpe/handler/LoginPacketHandler.php | 8 +- 2 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/event/player/PlayerPreLoginEvent.php b/src/event/player/PlayerPreLoginEvent.php index 8a3bbec9f8..5a69c0e175 100644 --- a/src/event/player/PlayerPreLoginEvent.php +++ b/src/event/player/PlayerPreLoginEvent.php @@ -40,20 +40,22 @@ use function count; * could be a hacker posing as another player. */ class PlayerPreLoginEvent extends Event{ - public const KICK_REASON_PLUGIN = 0; - public const KICK_REASON_SERVER_FULL = 1; - public const KICK_REASON_SERVER_WHITELISTED = 2; - public const KICK_REASON_BANNED = 3; + public const KICK_FLAG_PLUGIN = 0; + public const KICK_FLAG_SERVER_FULL = 1; + public const KICK_FLAG_SERVER_WHITELISTED = 2; + public const KICK_FLAG_BANNED = 3; - public const KICK_REASON_PRIORITY = [ - self::KICK_REASON_PLUGIN, //Plugin reason should always take priority over anything else - self::KICK_REASON_SERVER_FULL, - self::KICK_REASON_SERVER_WHITELISTED, - self::KICK_REASON_BANNED + public const KICK_FLAG_PRIORITY = [ + self::KICK_FLAG_PLUGIN, //Plugin reason should always take priority over anything else + self::KICK_FLAG_SERVER_FULL, + self::KICK_FLAG_SERVER_WHITELISTED, + self::KICK_FLAG_BANNED ]; /** @var Translatable[]|string[] reason const => associated message */ - protected array $kickReasons = []; + protected array $disconnectReasons = []; + /** @var Translatable[]|string[] */ + protected array $disconnectScreenMessages = []; public function __construct( private PlayerInfo $playerInfo, @@ -88,27 +90,31 @@ class PlayerPreLoginEvent extends Event{ } /** - * Returns an array of kick reasons currently assigned. + * Returns an array of kick flags currently assigned. * * @return int[] */ - public function getKickReasons() : array{ - return array_keys($this->kickReasons); + public function getKickFlags() : array{ + return array_keys($this->disconnectReasons); } /** - * Returns whether the given kick reason is set for this event. + * Returns whether the given kick flag is set for this event. */ - public function isKickReasonSet(int $flag) : bool{ - return isset($this->kickReasons[$flag]); + public function isKickFlagSet(int $flag) : bool{ + return isset($this->disconnectReasons[$flag]); } /** * Sets a reason to disallow the player to continue authenticating, with a message. * This can also be used to change kick messages for already-set flags. + * + * @param Translatable|string $disconnectReason Shown in the server log - this should be a short one-line message + * @param Translatable|string|null $disconnectScreenMessage Shown on the player's disconnection screen (null will use the reason) */ - public function setKickReason(int $flag, Translatable|string $message) : void{ - $this->kickReasons[$flag] = $message; + public function setKickFlag(int $flag, Translatable|string $disconnectReason, Translatable|string|null $disconnectScreenMessage = null) : void{ + $this->disconnectReasons[$flag] = $disconnectReason; + $this->disconnectScreenMessages[$flag] = $disconnectScreenMessage ?? $disconnectReason; } /** @@ -117,43 +123,69 @@ class PlayerPreLoginEvent extends Event{ * * @param int $flag Specific flag to clear. */ - public function clearKickReason(int $flag) : void{ - unset($this->kickReasons[$flag]); + public function clearKickFlag(int $flag) : void{ + unset($this->disconnectReasons[$flag], $this->disconnectScreenMessages[$flag]); } /** * Clears all pre-assigned kick reasons, allowing the player to continue logging in. */ - public function clearAllKickReasons() : void{ - $this->kickReasons = []; + public function clearAllKickFlags() : void{ + $this->disconnectReasons = []; + $this->disconnectScreenMessages = []; } /** * Returns whether the player is allowed to continue logging in. */ public function isAllowed() : bool{ - return count($this->kickReasons) === 0; + return count($this->disconnectReasons) === 0; } /** - * Returns the kick message provided for the given kick flag, or null if not set. + * Returns the disconnect reason provided for the given kick flag, or null if not set. + * This is the message which will be shown in the server log and on the console. */ - public function getKickMessage(int $flag) : Translatable|string|null{ - return $this->kickReasons[$flag] ?? null; + public function getDisconnectReason(int $flag) : Translatable|string|null{ + return $this->disconnectReasons[$flag] ?? null; } /** - * Returns the final kick message which will be shown on the disconnect screen. - * - * Note: Only one message (the highest priority one) will be shown. See priority order to decide how to set your + * Returns the disconnect screen message provided for the given kick flag, or null if not set. + * This is the message shown to the player on the disconnect screen. + */ + public function getDisconnectScreenMessage(int $flag) : Translatable|string|null{ + return $this->disconnectScreenMessages[$flag] ?? null; + } + + /** + * Resolves the message that will be shown in the server log if the player is kicked. + * Only one message (the highest priority one) will be shown. See priority order to decide how to set your * messages. * - * @see PlayerPreLoginEvent::KICK_REASON_PRIORITY + * @see PlayerPreLoginEvent::KICK_FLAG_PRIORITY */ - public function getFinalKickMessage() : Translatable|string{ - foreach(self::KICK_REASON_PRIORITY as $p){ - if(isset($this->kickReasons[$p])){ - return $this->kickReasons[$p]; + public function getFinalDisconnectReason() : Translatable|string{ + foreach(self::KICK_FLAG_PRIORITY as $p){ + if(isset($this->disconnectReasons[$p])){ + return $this->disconnectReasons[$p]; + } + } + + return ""; + } + + /** + * Resolves the message that will be shown on the player's disconnect screen if they are kicked. + * Only one message (the highest priority one) will be shown. See priority order to decide how to set your + * messages. + * + * @see PlayerPreLoginEvent::KICK_FLAG_PRIORITY + */ + public function getFinalDisconnectScreenMessage() : Translatable|string{ + foreach(self::KICK_FLAG_PRIORITY as $p){ + if(isset($this->disconnectScreenMessages[$p])){ + return $this->disconnectScreenMessages[$p]; } } diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 744896b4d8..acc4250999 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -117,10 +117,10 @@ class LoginPacketHandler extends PacketHandler{ $this->server->requiresAuthentication() ); if($this->server->getNetwork()->getValidConnectionCount() > $this->server->getMaxPlayers()){ - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull()); + $ev->setKickFlag(PlayerPreLoginEvent::KICK_FLAG_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull()); } if(!$this->server->isWhitelisted($playerInfo->getUsername())){ - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, KnownTranslationFactory::pocketmine_disconnect_whitelisted()); + $ev->setKickFlag(PlayerPreLoginEvent::KICK_FLAG_SERVER_WHITELISTED, KnownTranslationFactory::pocketmine_disconnect_whitelisted()); } $banMessage = null; @@ -132,12 +132,12 @@ class LoginPacketHandler extends PacketHandler{ $banMessage = KnownTranslationFactory::pocketmine_disconnect_ban($banReason !== "" ? $banReason : KnownTranslationFactory::pocketmine_disconnect_ban_ip()); } if($banMessage !== null){ - $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, $banMessage); + $ev->setKickFlag(PlayerPreLoginEvent::KICK_FLAG_BANNED, $banMessage); } $ev->call(); if(!$ev->isAllowed()){ - $this->session->disconnect($ev->getFinalKickMessage()); + $this->session->disconnect($ev->getFinalDisconnectReason(), $ev->getFinalDisconnectScreenMessage()); return true; } From 6854830b6e802cd4bce66107294e262a1a3fb8d5 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Mon, 13 Feb 2023 13:21:35 +0100 Subject: [PATCH 0579/1858] start.sh: Use -n instead of ! -z (#5567) See https://github.com/koalaman/shellcheck/wiki/SC2236 --- start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start.sh b/start.sh index 63a9a273b8..74b24591ac 100755 --- a/start.sh +++ b/start.sh @@ -23,7 +23,7 @@ if [ "$PHP_BINARY" == "" ]; then if [ -f ./bin/php7/bin/php ]; then export PHPRC="" PHP_BINARY="./bin/php7/bin/php" - elif [[ ! -z $(type php 2> /dev/null) ]]; then + elif [[ -n $(type php 2> /dev/null) ]]; then PHP_BINARY=$(type -p php) else echo "Couldn't find a PHP binary in system PATH or $PWD/bin/php7/bin" From 69155015c9cf53cd96e1df2b87cb340460f5c0e4 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Mon, 13 Feb 2023 13:24:47 +0100 Subject: [PATCH 0580/1858] Double quote array expansions to avoid re-splitting elements. (#5570) See: https://github.com/koalaman/shellcheck/wiki/SC2068 --- start.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start.sh b/start.sh index 74b24591ac..0121f3887b 100755 --- a/start.sh +++ b/start.sh @@ -51,12 +51,12 @@ if [ "$DO_LOOP" == "yes" ]; then if [ ${LOOPS} -gt 0 ]; then echo "Restarted $LOOPS times" fi - "$PHP_BINARY" "$POCKETMINE_FILE" $@ + "$PHP_BINARY" "$POCKETMINE_FILE" "$@" echo "To escape the loop, press CTRL+C now. Otherwise, wait 5 seconds for the server to restart." echo "" sleep 5 ((LOOPS++)) done else - exec "$PHP_BINARY" "$POCKETMINE_FILE" $@ + exec "$PHP_BINARY" "$POCKETMINE_FILE" "$@" fi From 525f62e1e43f6b9e3c0e808998c3a967cff90948 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:00:16 +0000 Subject: [PATCH 0581/1858] =?UTF-8?q?=C3=82RakLib=200.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 4 +-- composer.lock | 36 ++++++++++----------- src/network/mcpe/raklib/RakLibInterface.php | 5 +-- src/network/mcpe/raklib/RakLibServer.php | 3 +- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 6371e4697b..4a26ad682c 100644 --- a/composer.json +++ b/composer.json @@ -48,8 +48,8 @@ "pocketmine/log-pthreads": "^0.5.0", "pocketmine/math": "^0.4.0", "pocketmine/nbt": "^0.3.2", - "pocketmine/raklib": "^0.14.2", - "pocketmine/raklib-ipc": "^0.1.0", + "pocketmine/raklib": "^0.15.0", + "pocketmine/raklib-ipc": "^0.2.0", "pocketmine/snooze": "^0.4.0", "ramsey/uuid": "^4.1", "symfony/filesystem": "^5.4" diff --git a/composer.lock b/composer.lock index f242a9cb6c..4a8fab0f92 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "627198dc2e7f08e616478e9ca8ce9ae7", + "content-hash": "4e1a995669862685144f13d26f45fd6d", "packages": [ { "name": "adhocore/json-comment", @@ -780,16 +780,16 @@ }, { "name": "pocketmine/raklib", - "version": "0.14.5", + "version": "0.15.0", "source": { "type": "git", "url": "https://github.com/pmmp/RakLib.git", - "reference": "85b4e5cb7117d37e010eeadb3ff53b21276c6f48" + "reference": "1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/85b4e5cb7117d37e010eeadb3ff53b21276c6f48", - "reference": "85b4e5cb7117d37e010eeadb3ff53b21276c6f48", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1", + "reference": "1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1", "shasum": "" }, "require": { @@ -801,7 +801,7 @@ "pocketmine/log": "^0.3.0 || ^0.4.0" }, "require-dev": { - "phpstan/phpstan": "1.7.7", + "phpstan/phpstan": "1.9.17", "phpstan/phpstan-strict-rules": "^1.0" }, "type": "library", @@ -817,33 +817,33 @@ "description": "A RakNet server implementation written in PHP", "support": { "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/0.14.5" + "source": "https://github.com/pmmp/RakLib/tree/0.15.0" }, - "time": "2022-08-25T16:16:44+00:00" + "time": "2023-02-13T12:56:35+00:00" }, { "name": "pocketmine/raklib-ipc", - "version": "0.1.1", + "version": "0.2.0", "source": { "type": "git", "url": "https://github.com/pmmp/RakLibIpc.git", - "reference": "922a6444b0c6c7daaa5aa5a832107e1ec4738aed" + "reference": "26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLibIpc/zipball/922a6444b0c6c7daaa5aa5a832107e1ec4738aed", - "reference": "922a6444b0c6c7daaa5aa5a832107e1ec4738aed", + "url": "https://api.github.com/repos/pmmp/RakLibIpc/zipball/26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c", + "reference": "26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", + "php": "^8.0", "php-64bit": "*", "pocketmine/binaryutils": "^0.2.0", - "pocketmine/raklib": "^0.13.1 || ^0.14.0" + "pocketmine/raklib": "^0.15.0" }, "require-dev": { - "phpstan/phpstan": "0.12.81", - "phpstan/phpstan-strict-rules": "^0.12.2" + "phpstan/phpstan": "1.9.17", + "phpstan/phpstan-strict-rules": "^1.0.0" }, "type": "library", "autoload": { @@ -858,9 +858,9 @@ "description": "Channel-based protocols for inter-thread/inter-process communication with RakLib", "support": { "issues": "https://github.com/pmmp/RakLibIpc/issues", - "source": "https://github.com/pmmp/RakLibIpc/tree/0.1.1" + "source": "https://github.com/pmmp/RakLibIpc/tree/0.2.0" }, - "time": "2021-09-22T17:01:12+00:00" + "time": "2023-02-13T13:40:40+00:00" }, { "name": "pocketmine/snooze", diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 1adb3c8443..f09eff2e65 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -39,6 +39,7 @@ use pocketmine\Server; use pocketmine\snooze\SleeperNotifier; use pocketmine\timings\Timings; use pocketmine\utils\Utils; +use raklib\generic\DisconnectReason; use raklib\generic\SocketException; use raklib\protocol\EncapsulatedPacket; use raklib\protocol\PacketReliability; @@ -142,11 +143,11 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ } } - public function onClientDisconnect(int $sessionId, string $reason) : void{ + public function onClientDisconnect(int $sessionId, int $reason) : void{ if(isset($this->sessions[$sessionId])){ $session = $this->sessions[$sessionId]; unset($this->sessions[$sessionId]); - $session->onClientDisconnect($reason); + $session->onClientDisconnect(DisconnectReason::toString($reason)); } } diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index ccdadca558..f199d6aa51 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -31,6 +31,7 @@ use raklib\generic\SocketException; use raklib\server\ipc\RakLibToUserThreadMessageSender; use raklib\server\ipc\UserToRakLibThreadMessageReceiver; use raklib\server\Server; +use raklib\server\ServerSocket; use raklib\server\SimpleProtocolAcceptor; use raklib\utils\ExceptionTraceCleaner; use raklib\utils\InternetAddress; @@ -119,7 +120,7 @@ class RakLibServer extends Thread{ register_shutdown_function([$this, "shutdownHandler"]); try{ - $socket = new Socket($this->address->deserialize()); + $socket = new ServerSocket($this->address->deserialize()); }catch(SocketException $e){ $this->setCrashInfo(RakLibThreadCrashInfo::fromThrowable($e)); return; From 886b40a4551fb71d81ca9ddc89230e4de646e101 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:10:25 +0000 Subject: [PATCH 0582/1858] =?UTF-8?q?=C3=82Localize=20disconnect=20reasons?= =?UTF-8?q?=20for=20RakLib=20disconnects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- composer.lock | 14 +++++++------- src/lang/KnownTranslationFactory.php | 12 ++++++++++++ src/lang/KnownTranslationKeys.php | 3 +++ src/network/mcpe/NetworkSession.php | 2 +- src/network/mcpe/raklib/RakLibInterface.php | 7 ++++++- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 4a26ad682c..14af18c146 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "pocketmine/classloader": "^0.3.0", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", - "pocketmine/locale-data": "~2.18.0", + "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.5.0", "pocketmine/math": "^0.4.0", diff --git a/composer.lock b/composer.lock index 4a8fab0f92..808f1f3714 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4e1a995669862685144f13d26f45fd6d", + "content-hash": "ba82d633c6f28c95ea7dbe0dc97be7f0", "packages": [ { "name": "adhocore/json-comment", @@ -589,16 +589,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.18.3", + "version": "2.19.0", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0" + "reference": "f47d1687f21f09d2858f040873184a11746b1cf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/da25bfe9ee4822a84feb9b7e620c56ad4000aed0", - "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0", + "url": "https://api.github.com/repos/pmmp/Language/zipball/f47d1687f21f09d2858f040873184a11746b1cf7", + "reference": "f47d1687f21f09d2858f040873184a11746b1cf7", "shasum": "" }, "type": "library", @@ -606,9 +606,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.18.3" + "source": "https://github.com/pmmp/Language/tree/2.19.0" }, - "time": "2023-01-17T21:43:36+00:00" + "time": "2023-02-13T13:55:22+00:00" }, { "name": "pocketmine/log", diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index 07a8b17b46..ea8c2952e5 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -1606,6 +1606,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_NOREASON, []); } + public static function pocketmine_disconnect_clientDisconnect() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_CLIENTDISCONNECT, []); + } + + public static function pocketmine_disconnect_clientReconnect() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_CLIENTRECONNECT, []); + } + public static function pocketmine_disconnect_error(Translatable|string $error, Translatable|string $errorId) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR, [ "error" => $error, @@ -1633,6 +1641,10 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_RESPAWN, []); } + public static function pocketmine_disconnect_error_timeout() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_TIMEOUT, []); + } + public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ 0 => $param0, diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index 3221ecbdc4..c834527306 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -349,12 +349,15 @@ final class KnownTranslationKeys{ public const POCKETMINE_DISCONNECT_BAN_HARDCORE = "pocketmine.disconnect.ban.hardcore"; public const POCKETMINE_DISCONNECT_BAN_IP = "pocketmine.disconnect.ban.ip"; public const POCKETMINE_DISCONNECT_BAN_NOREASON = "pocketmine.disconnect.ban.noReason"; + public const POCKETMINE_DISCONNECT_CLIENTDISCONNECT = "pocketmine.disconnect.clientDisconnect"; + public const POCKETMINE_DISCONNECT_CLIENTRECONNECT = "pocketmine.disconnect.clientReconnect"; public const POCKETMINE_DISCONNECT_ERROR = "pocketmine.disconnect.error"; public const POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION = "pocketmine.disconnect.error.authentication"; public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket"; public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal"; public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout"; public const POCKETMINE_DISCONNECT_ERROR_RESPAWN = "pocketmine.disconnect.error.respawn"; + public const POCKETMINE_DISCONNECT_ERROR_TIMEOUT = "pocketmine.disconnect.error.timeout"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 87731d7912..44b1e30031 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -668,7 +668,7 @@ class NetworkSession{ * Called by the network interface to close the session when the client disconnects without server input, for * example in a timeout condition or voluntary client disconnect. */ - public function onClientDisconnect(string $reason) : void{ + public function onClientDisconnect(Translatable|string $reason) : void{ $this->tryDisconnect(function() use ($reason) : void{ if($this->player !== null){ $this->player->onPostDisconnect($reason, null); diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index f09eff2e65..412a741528 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -147,7 +147,12 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ if(isset($this->sessions[$sessionId])){ $session = $this->sessions[$sessionId]; unset($this->sessions[$sessionId]); - $session->onClientDisconnect(DisconnectReason::toString($reason)); + $session->onClientDisconnect(match($reason){ + DisconnectReason::CLIENT_DISCONNECT => KnownTranslationFactory::pocketmine_disconnect_clientDisconnect(), + DisconnectReason::PEER_TIMEOUT => KnownTranslationFactory::pocketmine_disconnect_error_timeout(), + DisconnectReason::CLIENT_RECONNECT => KnownTranslationFactory::pocketmine_disconnect_clientReconnect(), + default => "Unknown RakLib disconnect reason (ID $reason)" + }); } } From d891646d0ab2a62b3dbc93093555fca1a393023d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:10:42 +0000 Subject: [PATCH 0583/1858] Fix CS --- src/network/mcpe/raklib/RakLibServer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index f199d6aa51..3238d1b442 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe\raklib; use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; -use raklib\generic\Socket; use raklib\generic\SocketException; use raklib\server\ipc\RakLibToUserThreadMessageSender; use raklib\server\ipc\UserToRakLibThreadMessageReceiver; From 082f9e164772c2ca42f8ef1ef0b854345c32ae01 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:22:36 +0000 Subject: [PATCH 0584/1858] Deny permission to use a command if no permission is set Having no permission is almost always a bug. We already have behaviour elsewhere in the core that assumes undefined permission = permission denied. This behaviour might confuse some people, but I think it's much less dangerous than accidentally allowing everyone to use your command. --- src/command/Command.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command/Command.php b/src/command/Command.php index 7ae9ae7c1b..65d4decea5 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -113,7 +113,7 @@ abstract class Command{ public function testPermissionSilent(CommandSender $target, ?string $permission = null) : bool{ $permission ??= $this->permission; if($permission === null || $permission === ""){ - return true; + return false; } foreach(explode(";", $permission) as $p){ From cb10360c204d30aa4c0bf6ada3f43be895c5ccb6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:24:30 +0000 Subject: [PATCH 0585/1858] SimpleCommandMap: require commands to have a permission fixes #5305 --- src/command/SimpleCommandMap.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index b0308e7f01..b46a24d08f 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -139,6 +139,10 @@ class SimpleCommandMap implements CommandMap{ } public function register(string $fallbackPrefix, Command $command, ?string $label = null) : bool{ + if($command->getPermission() === null){ + throw new \InvalidArgumentException("Commands must have a permission set"); + } + if($label === null){ $label = $command->getLabel(); } From caebe14dab3e9862822e20479f7d33ffda11976f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:44:55 +0000 Subject: [PATCH 0586/1858] Use an array for command permissions it doesn't make sense to have to parse the string every time we want to verify permissions, nor to expect that people will somehow know to use ; to separate them without it being documented anywhere... --- src/command/Command.php | 40 +++++++++++++--------- src/command/SimpleCommandMap.php | 2 +- src/command/defaults/ClearCommand.php | 3 +- src/command/defaults/EffectCommand.php | 5 ++- src/command/defaults/EnchantCommand.php | 5 ++- src/command/defaults/GamemodeCommand.php | 5 ++- src/command/defaults/GiveCommand.php | 4 +-- src/command/defaults/KillCommand.php | 3 +- src/command/defaults/SpawnpointCommand.php | 5 ++- src/command/defaults/TeleportCommand.php | 5 ++- src/command/defaults/TimeCommand.php | 5 ++- src/command/defaults/TitleCommand.php | 4 +-- src/command/defaults/WhitelistCommand.php | 4 +-- 13 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/command/Command.php b/src/command/Command.php index 65d4decea5..b144ad4044 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -33,7 +33,7 @@ use pocketmine\permission\PermissionManager; use pocketmine\Server; use pocketmine\utils\BroadcastLoggerForwarder; use pocketmine\utils\TextFormat; -use function explode; +use function implode; use function str_replace; abstract class Command{ @@ -55,7 +55,8 @@ abstract class Command{ protected Translatable|string $usageMessage; - private ?string $permission = null; + /** @var string[] */ + private array $permission = []; private ?string $permissionMessage = null; /** @@ -81,19 +82,28 @@ abstract class Command{ return $this->name; } - public function getPermission() : ?string{ + /** + * @return string[] + */ + public function getPermission() : array{ return $this->permission; } - public function setPermission(?string $permission) : void{ - if($permission !== null){ - foreach(explode(";", $permission) as $perm){ - if(PermissionManager::getInstance()->getPermission($perm) === null){ - throw new \InvalidArgumentException("Cannot use non-existing permission \"$perm\""); - } + /** + * @param string[]|string|null $permissions + */ + public function setPermissions(array $permissions) : void{ + $permissionManager = PermissionManager::getInstance(); + foreach($permissions as $perm){ + if($permissionManager->getPermission($perm) === null){ + throw new \InvalidArgumentException("Cannot use non-existing permission \"$perm\""); } } - $this->permission = $permission; + $this->permission = $permissions; + } + + public function setPermission(?string $permission) : void{ + $this->setPermissions($permission === null ? [] : explode(";", $permission)); } public function testPermission(CommandSender $target, ?string $permission = null) : bool{ @@ -104,19 +114,15 @@ abstract class Command{ if($this->permissionMessage === null){ $target->sendMessage(KnownTranslationFactory::pocketmine_command_error_permission($this->name)->prefix(TextFormat::RED)); }elseif($this->permissionMessage !== ""){ - $target->sendMessage(str_replace("", $permission ?? $this->permission, $this->permissionMessage)); + $target->sendMessage(str_replace("", $permission ?? implode(";", $this->permission), $this->permissionMessage)); } return false; } public function testPermissionSilent(CommandSender $target, ?string $permission = null) : bool{ - $permission ??= $this->permission; - if($permission === null || $permission === ""){ - return false; - } - - foreach(explode(";", $permission) as $p){ + $list = $permission !== null ? [$permission] : $this->permission; + foreach($list as $p){ if($target->hasPermission($p)){ return true; } diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index b46a24d08f..525ecd3176 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -139,7 +139,7 @@ class SimpleCommandMap implements CommandMap{ } public function register(string $fallbackPrefix, Command $command, ?string $label = null) : bool{ - if($command->getPermission() === null){ + if(count($command->getPermission()) === 0){ throw new \InvalidArgumentException("Commands must have a permission set"); } diff --git a/src/command/defaults/ClearCommand.php b/src/command/defaults/ClearCommand.php index 4e312b4e95..f6f491fbfa 100644 --- a/src/command/defaults/ClearCommand.php +++ b/src/command/defaults/ClearCommand.php @@ -35,7 +35,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\utils\TextFormat; use function count; -use function implode; use function min; class ClearCommand extends VanillaCommand{ @@ -46,7 +45,7 @@ class ClearCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_clear_description(), KnownTranslationFactory::pocketmine_command_clear_usage() ); - $this->setPermission(implode(";", [DefaultPermissionNames::COMMAND_CLEAR_SELF, DefaultPermissionNames::COMMAND_CLEAR_OTHER])); + $this->setPermissions([DefaultPermissionNames::COMMAND_CLEAR_SELF, DefaultPermissionNames::COMMAND_CLEAR_OTHER]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/EffectCommand.php b/src/command/defaults/EffectCommand.php index 187fd4573a..9383232229 100644 --- a/src/command/defaults/EffectCommand.php +++ b/src/command/defaults/EffectCommand.php @@ -32,7 +32,6 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\utils\Limits; use pocketmine\utils\TextFormat; use function count; -use function implode; use function strtolower; class EffectCommand extends VanillaCommand{ @@ -43,10 +42,10 @@ class EffectCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_effect_description(), KnownTranslationFactory::commands_effect_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_EFFECT_SELF, DefaultPermissionNames::COMMAND_EFFECT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 26d7d9bec4..583bd59ec9 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -30,7 +30,6 @@ use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use function count; -use function implode; class EnchantCommand extends VanillaCommand{ @@ -40,10 +39,10 @@ class EnchantCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_enchant_description(), KnownTranslationFactory::commands_enchant_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_ENCHANT_SELF, DefaultPermissionNames::COMMAND_ENCHANT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 8fe4e38e97..86ca8e9df6 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -30,7 +30,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\GameMode; use function count; -use function implode; class GamemodeCommand extends VanillaCommand{ @@ -40,10 +39,10 @@ class GamemodeCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_gamemode_description(), KnownTranslationFactory::commands_gamemode_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_GAMEMODE_SELF, DefaultPermissionNames::COMMAND_GAMEMODE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/GiveCommand.php b/src/command/defaults/GiveCommand.php index 4249044923..72d33688b0 100644 --- a/src/command/defaults/GiveCommand.php +++ b/src/command/defaults/GiveCommand.php @@ -47,10 +47,10 @@ class GiveCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_give_description(), KnownTranslationFactory::pocketmine_command_give_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_GIVE_SELF, DefaultPermissionNames::COMMAND_GIVE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index 169905563f..e58234ead3 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -30,7 +30,6 @@ use pocketmine\event\entity\EntityDamageEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use function count; -use function implode; class KillCommand extends VanillaCommand{ @@ -41,7 +40,7 @@ class KillCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_kill_usage(), ["suicide"] ); - $this->setPermission(implode(";", [DefaultPermissionNames::COMMAND_KILL_SELF, DefaultPermissionNames::COMMAND_KILL_OTHER])); + $this->setPermissions([DefaultPermissionNames::COMMAND_KILL_SELF, DefaultPermissionNames::COMMAND_KILL_OTHER]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/SpawnpointCommand.php b/src/command/defaults/SpawnpointCommand.php index e037a68293..614a749d53 100644 --- a/src/command/defaults/SpawnpointCommand.php +++ b/src/command/defaults/SpawnpointCommand.php @@ -32,7 +32,6 @@ use pocketmine\player\Player; use pocketmine\world\Position; use pocketmine\world\World; use function count; -use function implode; use function round; class SpawnpointCommand extends VanillaCommand{ @@ -43,10 +42,10 @@ class SpawnpointCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_spawnpoint_description(), KnownTranslationFactory::commands_spawnpoint_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/TeleportCommand.php b/src/command/defaults/TeleportCommand.php index 8ccfcec328..b506364bf5 100644 --- a/src/command/defaults/TeleportCommand.php +++ b/src/command/defaults/TeleportCommand.php @@ -35,7 +35,6 @@ use pocketmine\utils\TextFormat; use pocketmine\world\World; use function array_shift; use function count; -use function implode; use function round; class TeleportCommand extends VanillaCommand{ @@ -47,10 +46,10 @@ class TeleportCommand extends VanillaCommand{ KnownTranslationFactory::commands_tp_usage(), ["teleport"] ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TELEPORT_SELF, DefaultPermissionNames::COMMAND_TELEPORT_OTHER - ])); + ]); } private function findPlayer(CommandSender $sender, string $playerName) : ?Player{ diff --git a/src/command/defaults/TimeCommand.php b/src/command/defaults/TimeCommand.php index 325e178a82..8e937b21be 100644 --- a/src/command/defaults/TimeCommand.php +++ b/src/command/defaults/TimeCommand.php @@ -31,7 +31,6 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\Player; use pocketmine\world\World; use function count; -use function implode; class TimeCommand extends VanillaCommand{ @@ -41,13 +40,13 @@ class TimeCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_time_description(), KnownTranslationFactory::pocketmine_command_time_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TIME_ADD, DefaultPermissionNames::COMMAND_TIME_SET, DefaultPermissionNames::COMMAND_TIME_START, DefaultPermissionNames::COMMAND_TIME_STOP, DefaultPermissionNames::COMMAND_TIME_QUERY - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/TitleCommand.php b/src/command/defaults/TitleCommand.php index e3bc247d7a..ecc4c569cf 100644 --- a/src/command/defaults/TitleCommand.php +++ b/src/command/defaults/TitleCommand.php @@ -39,10 +39,10 @@ class TitleCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_title_description(), KnownTranslationFactory::commands_title_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TITLE_SELF, DefaultPermissionNames::COMMAND_TITLE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index cbf72902d6..65860aefae 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -44,14 +44,14 @@ class WhitelistCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_whitelist_description(), KnownTranslationFactory::commands_whitelist_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_WHITELIST_RELOAD, DefaultPermissionNames::COMMAND_WHITELIST_ENABLE, DefaultPermissionNames::COMMAND_WHITELIST_DISABLE, DefaultPermissionNames::COMMAND_WHITELIST_LIST, DefaultPermissionNames::COMMAND_WHITELIST_ADD, DefaultPermissionNames::COMMAND_WHITELIST_REMOVE - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ From aacd92bf08ec765308e9e1ef5cab6cf11710ea93 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Feb 2023 14:46:37 +0000 Subject: [PATCH 0587/1858] Command: fix setPermissions docblock --- src/command/Command.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command/Command.php b/src/command/Command.php index b144ad4044..175be6433e 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -90,7 +90,7 @@ abstract class Command{ } /** - * @param string[]|string|null $permissions + * @param string[] $permissions */ public function setPermissions(array $permissions) : void{ $permissionManager = PermissionManager::getInstance(); From 2fd6e769e611b2cfe3501532c5b26394ddd1dd55 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 14:59:05 +0000 Subject: [PATCH 0588/1858] NetworkSession: Improved packet budgeting this fixes players getting kicked during server lag spikes. closes #5532 --- src/network/mcpe/NetworkSession.php | 35 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 0caccb53cb..53fe430f9a 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -361,12 +361,9 @@ class NetworkSession{ } if($this->incomingPacketBatchBudget <= 0){ - if(!function_exists('xdebug_is_debugger_active') || !xdebug_is_debugger_active()){ + $this->updatePacketBudget(); + if($this->incomingPacketBatchBudget <= 0){ throw new PacketHandlingException("Receiving packets too fast"); - }else{ - //when a debugging session is active, the server may halt at any point for an indefinite length of time, - //in which time the client will continue to send packets - $this->incomingPacketBatchBudget = self::INCOMING_PACKET_BATCH_MAX_BUDGET; } } $this->incomingPacketBatchBudget--; @@ -1143,6 +1140,23 @@ class NetworkSession{ $this->sendDataPacket(ToastRequestPacket::create($title, $body)); } + private function updatePacketBudget() : void{ + $nowNs = hrtime(true); + $timeSinceLastUpdateNs = $nowNs - $this->lastPacketBudgetUpdateTimeNs; + if($timeSinceLastUpdateNs > 50_000_000){ + $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); + /* + * If the server takes an abnormally long time to process a tick, add the budget for time difference to + * compensate. This extra budget may be very large, but it will disappear the next time a normal update + * occurs. This ensures that backlogs during a large lag spike don't cause everyone to get kicked. + * As long as all the backlogged packets are processed before the next tick, everything should be OK for + * clients behaving normally. + */ + $this->incomingPacketBatchBudget = min($this->incomingPacketBatchBudget, self::INCOMING_PACKET_BATCH_MAX_BUDGET) + (self::INCOMING_PACKET_BATCH_PER_TICK * 2 * $ticksSinceLastUpdate); + $this->lastPacketBudgetUpdateTimeNs = $nowNs; + } + } + public function tick() : void{ if(!$this->isConnected()){ $this->dispose(); @@ -1170,16 +1184,5 @@ class NetworkSession{ } $this->flushSendBuffer(); - - $nowNs = hrtime(true); - $timeSinceLastUpdateNs = $nowNs - $this->lastPacketBudgetUpdateTimeNs; - if($timeSinceLastUpdateNs > 50_000_000){ - $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); - $this->incomingPacketBatchBudget = min( - $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * 2 * $ticksSinceLastUpdate), - self::INCOMING_PACKET_BATCH_MAX_BUDGET - ); - $this->lastPacketBudgetUpdateTimeNs = $nowNs; - } } } From 910c4c4b24510d422af0888a098a87cc40735abc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:02:00 +0000 Subject: [PATCH 0589/1858] Updated BedrockProtocol --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 74be1967b9..04ec453763 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", - "pocketmine/bedrock-protocol": "~19.0.0+bedrock-1.19.60", + "pocketmine/bedrock-protocol": "~19.1.0+bedrock-1.19.60", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 630320020f..f87d2be111 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f4a0fb9a6731f083ef7e29fc3f527171", + "content-hash": "2121c9df1e7a2193339f5a4fc9f70f52", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "19.0.0+bedrock-1.19.60", + "version": "19.1.0+bedrock-1.19.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "3c8cf08d09b8b3fafc209d184e66e50d2e34c06c" + "reference": "b57d8145cb765110d599dd68241f2ebe68c80933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/3c8cf08d09b8b3fafc209d184e66e50d2e34c06c", - "reference": "3c8cf08d09b8b3fafc209d184e66e50d2e34c06c", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/b57d8145cb765110d599dd68241f2ebe68c80933", + "reference": "b57d8145cb765110d599dd68241f2ebe68c80933", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.0.0+bedrock-1.19.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/19.1.0+bedrock-1.19.60" }, - "time": "2023-02-08T18:38:02+00:00" + "time": "2023-02-15T12:35:51+00:00" }, { "name": "pocketmine/binaryutils", From c5dcd268ad0c5f0932b1b6e27e264b9d8a8b36df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:04:41 +0000 Subject: [PATCH 0590/1858] CS --- src/network/mcpe/NetworkSession.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 53fe430f9a..ebc9439607 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -129,7 +129,6 @@ use function array_values; use function base64_encode; use function bin2hex; use function count; -use function function_exists; use function get_class; use function hrtime; use function in_array; @@ -143,7 +142,6 @@ use function strtolower; use function substr; use function time; use function ucfirst; -use function xdebug_is_debugger_active; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; From c0f3dbdd70385d975a57001ce958e270cd8de0dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:12:53 +0000 Subject: [PATCH 0591/1858] Regenerate constants for block and item data handling --- src/data/bedrock/block/BlockStateNames.php | 1 + src/data/bedrock/block/BlockTypeNames.php | 29 ++++++++++++++++++++++ src/data/bedrock/item/ItemTypeNames.php | 10 ++++++++ 3 files changed, 40 insertions(+) diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 31973c01ec..96cfc1fa58 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -44,6 +44,7 @@ final class BlockStateNames{ public const BITE_COUNTER = "bite_counter"; public const BLOCK_LIGHT_LEVEL = "block_light_level"; public const BLOOM = "bloom"; + public const BOOKS_STORED = "books_stored"; public const BREWING_STAND_SLOT_A_BIT = "brewing_stand_slot_a_bit"; public const BREWING_STAND_SLOT_B_BIT = "brewing_stand_slot_b_bit"; public const BREWING_STAND_SLOT_C_BIT = "brewing_stand_slot_c_bit"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 9df7637734..913472c478 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -34,6 +34,7 @@ final class BlockTypeNames{ public const ACACIA_BUTTON = "minecraft:acacia_button"; public const ACACIA_DOOR = "minecraft:acacia_door"; public const ACACIA_FENCE_GATE = "minecraft:acacia_fence_gate"; + public const ACACIA_HANGING_SIGN = "minecraft:acacia_hanging_sign"; public const ACACIA_PRESSURE_PLATE = "minecraft:acacia_pressure_plate"; public const ACACIA_STAIRS = "minecraft:acacia_stairs"; public const ACACIA_STANDING_SIGN = "minecraft:acacia_standing_sign"; @@ -51,7 +52,25 @@ final class BlockTypeNames{ public const AZALEA_LEAVES = "minecraft:azalea_leaves"; public const AZALEA_LEAVES_FLOWERED = "minecraft:azalea_leaves_flowered"; public const BAMBOO = "minecraft:bamboo"; + public const BAMBOO_BLOCK = "minecraft:bamboo_block"; + public const BAMBOO_BUTTON = "minecraft:bamboo_button"; + public const BAMBOO_DOOR = "minecraft:bamboo_door"; + public const BAMBOO_DOUBLE_SLAB = "minecraft:bamboo_double_slab"; + public const BAMBOO_FENCE = "minecraft:bamboo_fence"; + public const BAMBOO_FENCE_GATE = "minecraft:bamboo_fence_gate"; + public const BAMBOO_HANGING_SIGN = "minecraft:bamboo_hanging_sign"; + public const BAMBOO_MOSAIC = "minecraft:bamboo_mosaic"; + public const BAMBOO_MOSAIC_DOUBLE_SLAB = "minecraft:bamboo_mosaic_double_slab"; + public const BAMBOO_MOSAIC_SLAB = "minecraft:bamboo_mosaic_slab"; + public const BAMBOO_MOSAIC_STAIRS = "minecraft:bamboo_mosaic_stairs"; + public const BAMBOO_PLANKS = "minecraft:bamboo_planks"; + public const BAMBOO_PRESSURE_PLATE = "minecraft:bamboo_pressure_plate"; public const BAMBOO_SAPLING = "minecraft:bamboo_sapling"; + public const BAMBOO_SLAB = "minecraft:bamboo_slab"; + public const BAMBOO_STAIRS = "minecraft:bamboo_stairs"; + public const BAMBOO_STANDING_SIGN = "minecraft:bamboo_standing_sign"; + public const BAMBOO_TRAPDOOR = "minecraft:bamboo_trapdoor"; + public const BAMBOO_WALL_SIGN = "minecraft:bamboo_wall_sign"; public const BARREL = "minecraft:barrel"; public const BARRIER = "minecraft:barrier"; public const BASALT = "minecraft:basalt"; @@ -66,6 +85,7 @@ final class BlockTypeNames{ public const BIRCH_BUTTON = "minecraft:birch_button"; public const BIRCH_DOOR = "minecraft:birch_door"; public const BIRCH_FENCE_GATE = "minecraft:birch_fence_gate"; + public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; public const BIRCH_PRESSURE_PLATE = "minecraft:birch_pressure_plate"; public const BIRCH_STAIRS = "minecraft:birch_stairs"; public const BIRCH_STANDING_SIGN = "minecraft:birch_standing_sign"; @@ -117,6 +137,7 @@ final class BlockTypeNames{ public const CHEMICAL_HEAT = "minecraft:chemical_heat"; public const CHEMISTRY_TABLE = "minecraft:chemistry_table"; public const CHEST = "minecraft:chest"; + public const CHISELED_BOOKSHELF = "minecraft:chiseled_bookshelf"; public const CHISELED_DEEPSLATE = "minecraft:chiseled_deepslate"; public const CHISELED_NETHER_BRICKS = "minecraft:chiseled_nether_bricks"; public const CHISELED_POLISHED_BLACKSTONE = "minecraft:chiseled_polished_blackstone"; @@ -161,6 +182,7 @@ final class BlockTypeNames{ public const CRIMSON_FENCE = "minecraft:crimson_fence"; public const CRIMSON_FENCE_GATE = "minecraft:crimson_fence_gate"; public const CRIMSON_FUNGUS = "minecraft:crimson_fungus"; + public const CRIMSON_HANGING_SIGN = "minecraft:crimson_hanging_sign"; public const CRIMSON_HYPHAE = "minecraft:crimson_hyphae"; public const CRIMSON_NYLIUM = "minecraft:crimson_nylium"; public const CRIMSON_PLANKS = "minecraft:crimson_planks"; @@ -182,6 +204,7 @@ final class BlockTypeNames{ public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_FENCE_GATE = "minecraft:dark_oak_fence_gate"; + public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_PRESSURE_PLATE = "minecraft:dark_oak_pressure_plate"; public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; @@ -424,6 +447,7 @@ final class BlockTypeNames{ public const JUNGLE_BUTTON = "minecraft:jungle_button"; public const JUNGLE_DOOR = "minecraft:jungle_door"; public const JUNGLE_FENCE_GATE = "minecraft:jungle_fence_gate"; + public const JUNGLE_HANGING_SIGN = "minecraft:jungle_hanging_sign"; public const JUNGLE_PRESSURE_PLATE = "minecraft:jungle_pressure_plate"; public const JUNGLE_STAIRS = "minecraft:jungle_stairs"; public const JUNGLE_STANDING_SIGN = "minecraft:jungle_standing_sign"; @@ -472,6 +496,7 @@ final class BlockTypeNames{ public const MANGROVE_DOUBLE_SLAB = "minecraft:mangrove_double_slab"; public const MANGROVE_FENCE = "minecraft:mangrove_fence"; public const MANGROVE_FENCE_GATE = "minecraft:mangrove_fence_gate"; + public const MANGROVE_HANGING_SIGN = "minecraft:mangrove_hanging_sign"; public const MANGROVE_LEAVES = "minecraft:mangrove_leaves"; public const MANGROVE_LOG = "minecraft:mangrove_log"; public const MANGROVE_PLANKS = "minecraft:mangrove_planks"; @@ -515,6 +540,7 @@ final class BlockTypeNames{ public const NETHERREACTOR = "minecraft:netherreactor"; public const NORMAL_STONE_STAIRS = "minecraft:normal_stone_stairs"; public const NOTEBLOCK = "minecraft:noteblock"; + public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; public const OAK_STAIRS = "minecraft:oak_stairs"; public const OBSERVER = "minecraft:observer"; public const OBSIDIAN = "minecraft:obsidian"; @@ -642,6 +668,7 @@ final class BlockTypeNames{ public const SPRUCE_BUTTON = "minecraft:spruce_button"; public const SPRUCE_DOOR = "minecraft:spruce_door"; public const SPRUCE_FENCE_GATE = "minecraft:spruce_fence_gate"; + public const SPRUCE_HANGING_SIGN = "minecraft:spruce_hanging_sign"; public const SPRUCE_PRESSURE_PLATE = "minecraft:spruce_pressure_plate"; public const SPRUCE_STAIRS = "minecraft:spruce_stairs"; public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; @@ -667,6 +694,7 @@ final class BlockTypeNames{ public const STONECUTTER = "minecraft:stonecutter"; public const STONECUTTER_BLOCK = "minecraft:stonecutter_block"; public const STRIPPED_ACACIA_LOG = "minecraft:stripped_acacia_log"; + public const STRIPPED_BAMBOO_BLOCK = "minecraft:stripped_bamboo_block"; public const STRIPPED_BIRCH_LOG = "minecraft:stripped_birch_log"; public const STRIPPED_CRIMSON_HYPHAE = "minecraft:stripped_crimson_hyphae"; public const STRIPPED_CRIMSON_STEM = "minecraft:stripped_crimson_stem"; @@ -709,6 +737,7 @@ final class BlockTypeNames{ public const WARPED_FENCE = "minecraft:warped_fence"; public const WARPED_FENCE_GATE = "minecraft:warped_fence_gate"; public const WARPED_FUNGUS = "minecraft:warped_fungus"; + public const WARPED_HANGING_SIGN = "minecraft:warped_hanging_sign"; public const WARPED_HYPHAE = "minecraft:warped_hyphae"; public const WARPED_NYLIUM = "minecraft:warped_nylium"; public const WARPED_PLANKS = "minecraft:warped_planks"; diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index b8cd2b9b76..80a103df3d 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -41,6 +41,9 @@ final class ItemTypeNames{ public const AXOLOTL_SPAWN_EGG = "minecraft:axolotl_spawn_egg"; public const BAKED_POTATO = "minecraft:baked_potato"; public const BALLOON = "minecraft:balloon"; + public const BAMBOO_CHEST_RAFT = "minecraft:bamboo_chest_raft"; + public const BAMBOO_RAFT = "minecraft:bamboo_raft"; + public const BAMBOO_SIGN = "minecraft:bamboo_sign"; public const BANNER = "minecraft:banner"; public const BANNER_PATTERN = "minecraft:banner_pattern"; public const BAT_SPAWN_EGG = "minecraft:bat_spawn_egg"; @@ -73,6 +76,7 @@ final class ItemTypeNames{ public const BROWN_DYE = "minecraft:brown_dye"; public const BUCKET = "minecraft:bucket"; public const CAKE = "minecraft:cake"; + public const CAMEL_SPAWN_EGG = "minecraft:camel_spawn_egg"; public const CAMERA = "minecraft:camera"; public const CAMPFIRE = "minecraft:campfire"; public const CARROT = "minecraft:carrot"; @@ -149,6 +153,7 @@ final class ItemTypeNames{ public const ENCHANTED_BOOK = "minecraft:enchanted_book"; public const ENCHANTED_GOLDEN_APPLE = "minecraft:enchanted_golden_apple"; public const END_CRYSTAL = "minecraft:end_crystal"; + public const ENDER_DRAGON_SPAWN_EGG = "minecraft:ender_dragon_spawn_egg"; public const ENDER_EYE = "minecraft:ender_eye"; public const ENDER_PEARL = "minecraft:ender_pearl"; public const ENDERMAN_SPAWN_EGG = "minecraft:enderman_spawn_egg"; @@ -215,6 +220,7 @@ final class ItemTypeNames{ public const IRON_BOOTS = "minecraft:iron_boots"; public const IRON_CHESTPLATE = "minecraft:iron_chestplate"; public const IRON_DOOR = "minecraft:iron_door"; + public const IRON_GOLEM_SPAWN_EGG = "minecraft:iron_golem_spawn_egg"; public const IRON_HELMET = "minecraft:iron_helmet"; public const IRON_HOE = "minecraft:iron_hoe"; public const IRON_HORSE_ARMOR = "minecraft:iron_horse_armor"; @@ -359,6 +365,8 @@ final class ItemTypeNames{ public const SKULL_BANNER_PATTERN = "minecraft:skull_banner_pattern"; public const SLIME_BALL = "minecraft:slime_ball"; public const SLIME_SPAWN_EGG = "minecraft:slime_spawn_egg"; + public const SNIFFER_SPAWN_EGG = "minecraft:sniffer_spawn_egg"; + public const SNOW_GOLEM_SPAWN_EGG = "minecraft:snow_golem_spawn_egg"; public const SNOWBALL = "minecraft:snowball"; public const SOUL_CAMPFIRE = "minecraft:soul_campfire"; public const SPARKLER = "minecraft:sparkler"; @@ -389,6 +397,7 @@ final class ItemTypeNames{ public const TADPOLE_SPAWN_EGG = "minecraft:tadpole_spawn_egg"; public const TNT_MINECART = "minecraft:tnt_minecart"; public const TOTEM_OF_UNDYING = "minecraft:totem_of_undying"; + public const TRADER_LLAMA_SPAWN_EGG = "minecraft:trader_llama_spawn_egg"; public const TRIDENT = "minecraft:trident"; public const TROPICAL_FISH = "minecraft:tropical_fish"; public const TROPICAL_FISH_BUCKET = "minecraft:tropical_fish_bucket"; @@ -409,6 +418,7 @@ final class ItemTypeNames{ public const WHITE_DYE = "minecraft:white_dye"; public const WITCH_SPAWN_EGG = "minecraft:witch_spawn_egg"; public const WITHER_SKELETON_SPAWN_EGG = "minecraft:wither_skeleton_spawn_egg"; + public const WITHER_SPAWN_EGG = "minecraft:wither_spawn_egg"; public const WOLF_SPAWN_EGG = "minecraft:wolf_spawn_egg"; public const WOODEN_AXE = "minecraft:wooden_axe"; public const WOODEN_DOOR = "minecraft:wooden_door"; From 7611155ff9c063834faa900f325424d347d12954 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:13:12 +0000 Subject: [PATCH 0592/1858] CS --- src/command/Command.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/command/Command.php b/src/command/Command.php index 175be6433e..e17e7de87d 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -33,6 +33,7 @@ use pocketmine\permission\PermissionManager; use pocketmine\Server; use pocketmine\utils\BroadcastLoggerForwarder; use pocketmine\utils\TextFormat; +use function explode; use function implode; use function str_replace; From 75f74454c63058e4906061605ed0f963eccec584 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:15:04 +0300 Subject: [PATCH 0593/1858] Implemented reinforced deepslate (#5553) --- src/block/BlockTypeIds.php | 3 ++- src/block/VanillaBlocks.php | 6 ++++++ .../bedrock/block/convert/BlockObjectToStateSerializer.php | 1 + .../block/convert/BlockStateToObjectDeserializer.php | 1 + src/item/StringToItemParser.php | 1 + tests/phpunit/block/block_factory_consistency_check.json | 2 +- 6 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 324ef60ce0..63ffb2025d 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -712,8 +712,9 @@ final class BlockTypeIds{ public const MANGROVE_LEAVES = 10685; public const AZALEA_LEAVES = 10686; public const FLOWERING_AZALEA_LEAVES = 10687; + public const REINFORCED_DEEPSLATE = 10688; - public const FIRST_UNUSED_BLOCK_ID = 10688; + public const FIRST_UNUSED_BLOCK_ID = 10689; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 898e5833b1..31584f6685 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -628,6 +628,7 @@ use function mb_strtolower; * @method static Wall RED_SANDSTONE_WALL() * @method static Torch RED_TORCH() * @method static Flower RED_TULIP() + * @method static Opaque REINFORCED_DEEPSLATE() * @method static Reserved6 RESERVED6() * @method static DoublePlant ROSE_BUSH() * @method static Sand SAND() @@ -1201,6 +1202,11 @@ final class VanillaBlocks{ self::register("muddy_mangrove_roots", new SimplePillar(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new Info(new BreakInfo(0.3)))); self::register("sculk", new Sculk(new BID(Ids::SCULK), "Sculk", new Info(new BreakInfo(0.6, ToolType::HOE)))); + self::register("reinforced_deepslate", new class(new BID(Ids::REINFORCED_DEEPSLATE), "Reinforced Deepslate", new Info(new BreakInfo(55.0, ToolType::NONE, 0, 3600.0))) extends Opaque{ + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } + }); self::registerBlocksR13(); self::registerBlocksR14(); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 6e7497c0d9..40d5650c36 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -544,6 +544,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); $this->mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); + $this->mapSimple(Blocks::REINFORCED_DEEPSLATE(), Ids::REINFORCED_DEEPSLATE); $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); $this->mapSimple(Blocks::SCULK(), Ids::SCULK); $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 7b10b935d1..39e7b0b657 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -406,6 +406,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); $this->mapSimple(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); $this->mapSimple(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); + $this->mapSimple(Ids::REINFORCED_DEEPSLATE, fn() => Blocks::REINFORCED_DEEPSLATE()); $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6()); $this->mapSimple(Ids::SCULK, fn() => Blocks::SCULK()); $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a7408dd51c..37b8276f2b 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -928,6 +928,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("redstone_wire", fn() => Blocks::REDSTONE_WIRE()); $result->registerBlock("reeds", fn() => Blocks::SUGARCANE()); $result->registerBlock("reeds_block", fn() => Blocks::SUGARCANE()); + $result->registerBlock("reinforced_deepslate", fn() => Blocks::REINFORCED_DEEPSLATE()); $result->registerBlock("repeater", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("repeater_block", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("reserved6", fn() => Blocks::RESERVED6()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 951af22a7a..5f7ce0cbf3 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azalea Leaves":[5471232,5471233,5471234,5471235],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Flowering Azalea Leaves":[5471744,5471745,5471746,5471747],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Leaves":[5470720,5470721,5470722,5470723],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azalea Leaves":[5471232,5471233,5471234,5471235],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Flowering Azalea Leaves":[5471744,5471745,5471746,5471747],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Leaves":[5470720,5470721,5470722,5470723],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Reinforced Deepslate":[5472256],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file From d7a0f5362e7d9617f239f02cb7f9c5e9d5b92407 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:19:38 +0000 Subject: [PATCH 0594/1858] Release 4.14.1 --- changelogs/4.14.md | 7 +++++++ src/VersionInfo.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelogs/4.14.md b/changelogs/4.14.md index 206e990486..f266e8b019 100644 --- a/changelogs/4.14.md +++ b/changelogs/4.14.md @@ -12,3 +12,10 @@ Released 8th February 2023. ## General - Added support for Minecraft: Bedrock Edition 1.19.60. - Removed support for older versions. + +# 4.14.1 +Released 15th February 2023. + +## Fixes +- Fixed all players getting kicked with `Receiving packets too fast` if a server tick takes longer than 5 seconds (e.g. because of autosave or GC). +- Fixed players getting kicked when linking with entities. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 74aeaa19c5..0847d4c37d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.14.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 396d64c60bb5c9aefd625dff1dd7b5a6541e8402 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Feb 2023 15:19:39 +0000 Subject: [PATCH 0595/1858] 4.14.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0847d4c37d..99a977fdac 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.14.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.14.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 4c3892b2d648b162c3cb742a8f4109252c3923b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Feb 2023 15:41:12 +0000 Subject: [PATCH 0596/1858] RuntimeBlockStateRegistry: separate permutation expansion from register() --- src/block/RuntimeBlockStateRegistry.php | 48 +++++++++++++++---------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index 5aef7006f5..15106d227c 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -29,6 +29,7 @@ use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\light\LightUpdate; +use function get_class; use function min; /** @@ -81,6 +82,34 @@ class RuntimeBlockStateRegistry{ } } + /** + * Generates all the possible valid blockstates for a given block type. + * + * @phpstan-return \Generator + */ + private static function generateAllStatesForType(Block $block) : \Generator{ + //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 + $bits = $block->getRequiredTypeDataBits() + $block->getRequiredStateDataBits(); + if($bits > Block::INTERNAL_STATE_DATA_BITS){ + throw new \InvalidArgumentException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); + } + for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ + $v = clone $block; + try{ + $v->decodeStateData($stateData); + if($v->computeStateData() !== $stateData){ + //TODO: this should probably be a hard error + throw new InvalidSerializedRuntimeDataException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeStateData() . " for input $stateData)"); + } + }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it + continue; + } + + yield $v; + } + } + /** * 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. @@ -102,24 +131,7 @@ class RuntimeBlockStateRegistry{ $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 - $bits = $block->getRequiredTypeDataBits() + $block->getRequiredStateDataBits(); - if($bits > Block::INTERNAL_STATE_DATA_BITS){ - throw new \InvalidArgumentException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); - } - for($stateData = 0; $stateData < (1 << $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 InvalidSerializedRuntimeDataException("Corrupted state"); - } - }catch(InvalidSerializedRuntimeDataException $e){ //invalid property combination, leave it - continue; - } - + foreach(self::generateAllStatesForType($block) as $v){ $this->fillStaticArrays($v->getStateId(), $v); } } From e6f1cb69d1ee6871d21ff1c664cf74d1c7cceb09 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Feb 2023 15:44:58 +0000 Subject: [PATCH 0597/1858] RuntimeBlockStateRegistry: throw a hard error on blockstates that return different state data than they were given this suggests improper validation of state data. --- src/block/RuntimeBlockStateRegistry.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index 15106d227c..ae6386e33c 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -100,7 +100,7 @@ class RuntimeBlockStateRegistry{ $v->decodeStateData($stateData); if($v->computeStateData() !== $stateData){ //TODO: this should probably be a hard error - throw new InvalidSerializedRuntimeDataException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeStateData() . " for input $stateData)"); + throw new \LogicException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeStateData() . " for input $stateData)"); } }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it continue; From ceff230d73aba84e0fdad55d765879102ac5a248 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Feb 2023 15:57:54 +0000 Subject: [PATCH 0598/1858] Simplify generation of enum serializers code --- build/generate-runtime-enum-serializers.php | 71 +++++++-------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index f71b87cdc5..cb30ef3dff 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -60,11 +60,10 @@ require dirname(__DIR__) . '/vendor/autoload.php'; * @return string[] * @phpstan-return list */ -function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string &$functionName) : array{ +function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string $functionName) : array{ $bits = getBitsRequired($memberNames); $lines = []; - $functionName = lcfirst($virtualTypeName); $lines[] = "public function $functionName(\\$nativeTypeName \$value) : void{"; $lines[] = "\t\$this->int($bits, match(\$value){"; @@ -85,11 +84,10 @@ function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array * @return string[] * @phpstan-return list */ -function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string &$functionName) : array{ +function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string $functionName) : array{ $bits = getBitsRequired($memberNames); $lines = []; - $functionName = lcfirst($virtualTypeName); $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; $lines[] = "\t\$value = match(\$this->readInt($bits)){"; @@ -122,43 +120,6 @@ function stringifyEnumMembers(array $members, string $enumClass) : array{ return array_map(fn(string $enumCaseName) => "\\$enumClass::$enumCaseName()", array_keys($members)); } -/** - * @param object[] $enumMembers - * @phpstan-param array $enumMembers - * - * @return string[] - * @phpstan-return list - */ -function buildEnumWriterFunc(array $enumMembers, string &$functionName) : array{ - $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); - return buildWriterFunc( - $reflect->getShortName(), - $reflect->getName(), - stringifyEnumMembers($enumMembers, $reflect->getName()), - $functionName - ); -} - -/** - * @param object[] $enumMembers - * @phpstan-param array $enumMembers - * - * @return string[] - * @phpstan-return list - */ -function buildEnumReaderFunc(array $enumMembers, string &$functionName) : array{ - if(count($enumMembers) === 0){ - throw new \InvalidArgumentException("Enum members cannot be empty"); - } - $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); - return buildReaderFunc( - $reflect->getShortName(), - $reflect->getName(), - stringifyEnumMembers($enumMembers, $reflect->getName()), - $functionName - ); -} - $enumsUsed = [ BellAttachmentType::getAll(), CopperOxidation::getAll(), @@ -185,15 +146,29 @@ $writerFuncs = [ "abstract public function int(int \$bits, int \$value) : void;" ] ]; -$functionName = ""; foreach($enumsUsed as $enumMembers){ - $writerF = buildEnumWriterFunc($enumMembers, $functionName); - /** @var string $functionName */ - $writerFuncs[$functionName] = $writerF; - $readerF = buildEnumReaderFunc($enumMembers, $functionName); - /** @var string $functionName */ - $readerFuncs[$functionName] = $readerF; + if(count($enumMembers) === 0){ + throw new \InvalidArgumentException("Enum members cannot be empty"); + } + $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); + $virtualTypeName = $reflect->getShortName(); + $nativeTypeName = $reflect->getName(); + $functionName = lcfirst($virtualTypeName); + + $stringifiedMembers = stringifyEnumMembers($enumMembers, $nativeTypeName); + $writerFuncs[$functionName] = buildWriterFunc( + $virtualTypeName, + $nativeTypeName, + $stringifiedMembers, + $functionName + ); + $readerFuncs[$functionName] = buildReaderFunc( + $virtualTypeName, + $nativeTypeName, + $stringifiedMembers, + $functionName + ); } /** From c2f6d8139a1413b05a1999561162d6d73b97a3bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Feb 2023 16:23:32 +0000 Subject: [PATCH 0599/1858] Added interface RuntimeDataDescriber --- build/generate-runtime-enum-serializers.php | 24 +++++-- src/block/Anvil.php | 7 +- src/block/Bamboo.php | 5 +- src/block/BambooSapling.php | 5 +- src/block/Barrel.php | 5 +- src/block/Bed.php | 5 +- src/block/Bedrock.php | 5 +- src/block/Bell.php | 5 +- src/block/Block.php | 7 +- src/block/BrewingStand.php | 5 +- src/block/Button.php | 5 +- src/block/Cactus.php | 5 +- src/block/Cake.php | 5 +- src/block/Candle.php | 5 +- src/block/ChorusFlower.php | 5 +- src/block/CocoaBlock.php | 5 +- src/block/Crops.php | 5 +- src/block/DaylightSensor.php | 5 +- src/block/DetectorRail.php | 5 +- src/block/Dirt.php | 5 +- src/block/Door.php | 5 +- src/block/DoublePlant.php | 5 +- src/block/EndPortalFrame.php | 5 +- src/block/Farmland.php | 5 +- src/block/FenceGate.php | 5 +- src/block/FillableCauldron.php | 5 +- src/block/Fire.php | 5 +- src/block/FloorCoralFan.php | 5 +- src/block/Froglight.php | 5 +- src/block/FrostedIce.php | 5 +- src/block/Furnace.php | 5 +- src/block/Hopper.php | 5 +- src/block/ItemFrame.php | 5 +- src/block/Lantern.php | 5 +- src/block/Leaves.php | 5 +- src/block/Lectern.php | 5 +- src/block/Lever.php | 5 +- src/block/Light.php | 5 +- src/block/Liquid.php | 5 +- src/block/NetherPortal.php | 5 +- src/block/NetherVines.php | 5 +- src/block/NetherWartPlant.php | 5 +- src/block/Rail.php | 5 +- src/block/RedMushroomBlock.php | 5 +- src/block/RedstoneComparator.php | 5 +- src/block/RedstoneLamp.php | 5 +- src/block/RedstoneOre.php | 5 +- src/block/RedstoneRepeater.php | 5 +- src/block/RedstoneTorch.php | 5 +- src/block/Sapling.php | 5 +- src/block/SeaPickle.php | 5 +- src/block/ShulkerBox.php | 5 +- src/block/SimplePressurePlate.php | 5 +- src/block/Skull.php | 7 +- src/block/Slab.php | 5 +- src/block/SnowLayer.php | 5 +- src/block/Sponge.php | 5 +- src/block/Stair.php | 5 +- src/block/StraightOnlyRail.php | 5 +- src/block/Sugarcane.php | 5 +- src/block/SweetBerryBush.php | 5 +- src/block/TNT.php | 7 +- src/block/Torch.php | 5 +- src/block/Trapdoor.php | 5 +- src/block/Tripwire.php | 5 +- src/block/TripwireHook.php | 5 +- src/block/UnknownBlock.php | 5 +- src/block/Vine.php | 5 +- src/block/Wall.php | 5 +- src/block/WallCoralFan.php | 5 +- src/block/Wood.php | 5 +- .../AnalogRedstoneSignalEmitterTrait.php | 5 +- src/block/utils/AnyFacingTrait.php | 5 +- src/block/utils/CandleTrait.php | 5 +- src/block/utils/ColoredTrait.php | 5 +- src/block/utils/CopperTrait.php | 5 +- src/block/utils/CoralTypeTrait.php | 5 +- src/block/utils/HorizontalFacingTrait.php | 5 +- src/block/utils/PillarRotationTrait.php | 5 +- .../utils/RailPoweredByRedstoneTrait.php | 5 +- src/block/utils/SignLikeRotationTrait.php | 5 +- src/data/runtime/RuntimeDataDescriber.php | 67 +++++++++++++++++++ src/data/runtime/RuntimeDataReader.php | 13 ++-- src/data/runtime/RuntimeDataWriter.php | 58 +++++++++------- src/data/runtime/RuntimeEnumDescriber.php | 58 ++++++++++++++++ .../runtime/RuntimeEnumSerializerTrait.php | 54 +++++++-------- src/item/Banner.php | 5 +- src/item/CoralFan.php | 5 +- src/item/Dye.php | 5 +- src/item/Item.php | 4 +- src/item/ItemBlock.php | 5 +- src/item/Medicine.php | 5 +- src/item/Potion.php | 5 +- src/item/SplashPotion.php | 5 +- src/item/SuspiciousStew.php | 5 +- 95 files changed, 395 insertions(+), 331 deletions(-) create mode 100644 src/data/runtime/RuntimeDataDescriber.php create mode 100644 src/data/runtime/RuntimeEnumDescriber.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index cb30ef3dff..d4b723814c 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -64,8 +64,8 @@ function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $bits = getBitsRequired($memberNames); $lines = []; - $lines[] = "public function $functionName(\\$nativeTypeName \$value) : void{"; - $lines[] = "\t\$this->int($bits, match(\$value){"; + $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; + $lines[] = "\t\$this->writeInt($bits, match(\$value){"; foreach($memberNames as $key => $memberName){ $lines[] = "\t\t$memberName => $key,"; @@ -101,6 +101,10 @@ function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array return $lines; } +function buildInterfaceFunc(string $nativeTypeName, string $functionName) : string{ + return "public function $functionName(\\$nativeTypeName &\$value) : void;"; +} + /** * @param mixed[] $members */ @@ -143,9 +147,10 @@ $readerFuncs = [ ]; $writerFuncs = [ "" => [ - "abstract public function int(int \$bits, int \$value) : void;" + "abstract protected function writeInt(int \$bits, int \$value) : void;" ] ]; +$interfaceFuncs = []; foreach($enumsUsed as $enumMembers){ if(count($enumMembers) === 0){ @@ -169,13 +174,17 @@ foreach($enumsUsed as $enumMembers){ $stringifiedMembers, $functionName ); + $interfaceFuncs[$functionName] = [buildInterfaceFunc( + $nativeTypeName, + $functionName + )]; } /** * @param string[][] $functions * @phpstan-param array> $functions */ -function printFunctions(array $functions, string $className) : void{ +function printFunctions(array $functions, string $className, string $classType) : void{ ksort($functions, SORT_STRING); ob_start(); @@ -213,14 +222,15 @@ namespace pocketmine\data\runtime; HEADER; - echo "trait $className{\n\n"; + echo "$classType $className{\n\n"; echo implode("\n\n", array_map(fn(array $functionLines) => "\t" . implode("\n\t", $functionLines), $functions)); echo "\n\n}\n"; file_put_contents(dirname(__DIR__) . '/src/data/runtime/' . $className . '.php', ob_get_clean()); } -printFunctions($writerFuncs, "RuntimeEnumSerializerTrait"); -printFunctions($readerFuncs, "RuntimeEnumDeserializerTrait"); +printFunctions($writerFuncs, "RuntimeEnumSerializerTrait", "trait"); +printFunctions($readerFuncs, "RuntimeEnumDeserializerTrait", "trait"); +printFunctions($interfaceFuncs, "RuntimeEnumDescriber", "interface"); echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 59b8d17c9f..76dc2cedee 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -28,8 +28,7 @@ use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\object\FallingBlock; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -54,13 +53,13 @@ class Anvil extends Transparent implements Fallable{ public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 2f26406297..b576e771f7 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; @@ -58,7 +57,7 @@ class Bamboo extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); $w->bool($this->ready); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index b3eba99fff..d5342f6b42 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; @@ -39,7 +38,7 @@ final class BambooSapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 68c3448250..ee732b72c9 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -41,7 +40,7 @@ class Barrel extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->open); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 3a5e0ff101..6da2f5aa93 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -28,8 +28,7 @@ use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; @@ -56,7 +55,7 @@ class Bed extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); $w->bool($this->head); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index b4252d27c6..5095d3a648 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class Bedrock extends Opaque{ private bool $burnsForever = false; public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index 85c4ecaaf1..20942f1df8 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -27,8 +27,7 @@ use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -51,7 +50,7 @@ final class Bell extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); $w->horizontalFacing($this->facing); } diff --git a/src/block/Block.php b/src/block/Block.php index 1481284a80..2dce0a49a2 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -29,6 +29,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; @@ -174,7 +175,7 @@ class Block{ $stateBits = $this->getRequiredStateDataBits(); $requiredBits = $typeBits + $stateBits; $writer = new RuntimeDataWriter($requiredBits); - $writer->int($typeBits, $this->computeTypeData()); + $writer->writeInt($typeBits, $this->computeTypeData()); $this->describeState($writer); $writtenBits = $writer->getOffset() - $typeBits; @@ -185,11 +186,11 @@ class Block{ return $writer->getValue(); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //NOOP } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index cdc34eef9f..033d93df07 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\BrewingStand as TileBrewingStand; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -46,7 +45,7 @@ class BrewingStand extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->brewingStandSlots($this->slots); } diff --git a/src/block/Button.php b/src/block/Button.php index 64a953b7b9..6274b7e695 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -41,7 +40,7 @@ abstract class Button extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->pressed); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 2f384b9239..8828219d8a 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\event\block\BlockGrowEvent; use pocketmine\event\entity\EntityDamageByBlockEvent; @@ -44,7 +43,7 @@ class Cactus extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index a17a767c1c..8870968c26 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\math\AxisAlignedBB; @@ -39,7 +38,7 @@ class Cake extends BaseCake{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } diff --git a/src/block/Candle.php b/src/block/Candle.php index 9afc4c6deb..b382c0fe5e 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\CandleTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -51,7 +50,7 @@ class Candle extends Transparent{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 2a0c9ac029..8b20b0e3d9 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\projectile\Projectile; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Item; @@ -52,7 +51,7 @@ final class ChorusFlower extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataWriter|RuntimeDataReader $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 47213f82f0..02c4390b9f 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -49,7 +48,7 @@ class CocoaBlock extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Crops.php b/src/block/Crops.php index 4052485c60..aabab87bb5 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -41,7 +40,7 @@ abstract class Crops extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 2fdcfdef48..27ec3764ed 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -44,7 +43,7 @@ class DaylightSensor extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); $w->bool($this->inverted); } diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 92c60f9f88..032f308702 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->activated); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index d0b38806a0..ead1e0c830 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\DirtType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; use pocketmine\item\Hoe; use pocketmine\item\Item; @@ -48,7 +47,7 @@ class Dirt extends Opaque{ public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Door.php b/src/block/Door.php index 263d854aa5..b0eba797c5 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -44,7 +43,7 @@ class Door extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->hingeRight); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 6d6c80f0f4..00c967271e 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -36,7 +35,7 @@ class DoublePlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 2e42509848..f4e08393fa 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -38,7 +37,7 @@ class EndPortalFrame extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->eye); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 2e80c5d2a5..cdc3b464e9 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityTrampleFarmlandEvent; @@ -40,7 +39,7 @@ class Farmland extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 96cb41d4ee..75ffccbeae 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodTypeTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -45,7 +44,7 @@ class FenceGate extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->open); $w->bool($this->inWall); diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index acc16e5750..048b3f3126 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -42,7 +41,7 @@ abstract class FillableCauldron extends Transparent{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } diff --git a/src/block/Fire.php b/src/block/Fire.php index df3f8c79f4..8184caf6de 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockBurnEvent; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\math\Facing; @@ -42,7 +41,7 @@ class Fire extends BaseFire{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index a9d53c119c..11bfb9e0fc 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; @@ -40,7 +39,7 @@ final class FloorCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index 0e8daa4b68..e93ec2eb85 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FroglightType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; final class Froglight extends SimplePillar{ @@ -38,7 +37,7 @@ final class Froglight extends SimplePillar{ public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 081e5ad711..c1eacb0193 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockMeltEvent; use function mt_rand; @@ -35,7 +34,7 @@ class FrostedIce extends Ice{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 2147169f2a..8cb1749857 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -27,8 +27,7 @@ use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\crafting\FurnaceType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -49,7 +48,7 @@ class Furnace extends Opaque{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->lit); } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 603a48baeb..7764a4ee7d 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -42,7 +41,7 @@ class Hopper extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 8828a8097a..a3c313ca26 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\utils\AnyFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -53,7 +52,7 @@ class ItemFrame extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->hasMap); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 50df67576c..47aa4496f6 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -46,7 +45,7 @@ class Lantern extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index d4f22c8ac9..94d6cbccae 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\LeavesDecayEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -50,7 +49,7 @@ class Leaves extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->noDecay); $w->bool($this->checkDecay); } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index c77afd8e1b..7a144dbb87 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -27,8 +27,7 @@ use pocketmine\block\tile\Lectern as TileLectern; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\math\AxisAlignedBB; @@ -49,7 +48,7 @@ class Lectern extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->producingSignal); } diff --git a/src/block/Lever.php b/src/block/Lever.php index b82fb04cb2..a399376875 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\LeverFacing; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -47,7 +46,7 @@ class Lever extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); } diff --git a/src/block/Light.php b/src/block/Light.php index 397a8f98dc..bdd232b6c2 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -37,7 +36,7 @@ final class Light extends Flowable{ public function getRequiredTypeDataBits() : int{ return 4; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 769fc039a7..4f76d4699c 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\MinimumCostFlowCalculator; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\event\block\BlockFormEvent; use pocketmine\event\block\BlockSpreadEvent; @@ -51,7 +50,7 @@ abstract class Liquid extends Transparent{ public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); $w->bool($this->still); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 7a12ebd74f..873040fd3c 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -37,7 +36,7 @@ class NetherPortal extends Transparent{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index 5b7a46d76f..c2c4971127 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -57,7 +56,7 @@ class NetherVines extends Flowable{ return 5; } - public function describeState(RuntimeDataWriter|RuntimeDataReader $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(5, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index a9325d92fa..2d3316b2cf 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -40,7 +39,7 @@ class NetherWartPlant extends Flowable{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 31d74c061f..2d37f6e95d 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Facing; use function array_keys; use function implode; @@ -37,7 +36,7 @@ class Rail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->railShape($this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 18ab59bd1b..42763ba95a 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\MushroomBlockType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use function mt_rand; @@ -39,7 +38,7 @@ class RedMushroomBlock extends Opaque{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->mushroomBlockType($this->mushroomBlockType); } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 50fe4d28f0..e105701d19 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -28,8 +28,7 @@ use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -47,7 +46,7 @@ class RedstoneComparator extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->isSubtractMode); $w->bool($this->powered); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 9a8c3785cb..5557076b37 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -24,15 +24,14 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\PoweredByRedstoneTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index c4f4497004..34d463731a 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; @@ -36,7 +35,7 @@ class RedstoneOre extends Opaque{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index b72d25463c..212bc9f4e2 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -46,7 +45,7 @@ class RedstoneRepeater extends Flowable{ public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->bool($this->powered); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index ba37039f24..b36bc91853 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ protected bool $lit = true; public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->lit); } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index cfe3012234..ea04ba624b 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\TreeType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -49,7 +48,7 @@ class Sapling extends Flowable{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index fe2cd1dac9..770ae6b45a 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; @@ -41,7 +40,7 @@ class SeaPickle extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 72236be487..292506deb3 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -37,7 +36,7 @@ class ShulkerBox extends Opaque{ public function getRequiredStateDataBits() : int{ return 0; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index 1d0a9d8c14..f93e244a57 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index b2e02b8d43..36a587aa9c 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\utils\SkullType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -52,13 +51,13 @@ class Skull extends Flowable{ public function getRequiredTypeDataBits() : int{ return 3; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Slab.php b/src/block/Slab.php index a1b09a151d..3290648ebd 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -44,7 +43,7 @@ class Slab extends Transparent{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->slabType($this->slabType); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index e3628f98ac..4f3950e740 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockMeltEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -49,7 +48,7 @@ class SnowLayer extends Flowable implements Fallable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index d4eceb5422..d8784febd2 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; public function getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index 83569e8b15..afbbf79182 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -26,8 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\StairShape; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -49,7 +48,7 @@ class Stair extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->upsideDown); } diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 9b81413551..bb9482fe90 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\data\bedrock\block\BlockLegacyMetadata; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use function array_keys; use function implode; @@ -39,7 +38,7 @@ class StraightOnlyRail extends BaseRail{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->straightOnlyRailShape($this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 69951dce43..a23c6d74d8 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -41,7 +40,7 @@ class Sugarcane extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index f7b8b1c02e..a93306da9e 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\block\BlockGrowEvent; @@ -48,7 +47,7 @@ class SweetBerryBush extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index cf1158a67b..1206d0e302 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; use pocketmine\entity\projectile\Projectile; @@ -48,13 +47,13 @@ class TNT extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index 0542c2be6a..5b496c9ad7 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -39,7 +38,7 @@ class Torch extends Flowable{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 8f6d5aab16..83bf4693e6 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -43,7 +42,7 @@ class Trapdoor extends Transparent{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->open); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 74d55ffba4..c785e6d12f 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -36,7 +35,7 @@ class Tripwire extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->triggered); $w->bool($this->suspended); $w->bool($this->connected); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index cb39e42d08..9180f971f7 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -41,7 +40,7 @@ class TripwireHook extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->connected); $w->bool($this->powered); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index dd4a934c3c..f3faeb6896 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; /** @@ -41,7 +40,7 @@ class UnknownBlock extends Transparent{ public function getRequiredTypeDataBits() : int{ return Block::INTERNAL_STATE_DATA_BITS; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); diff --git a/src/block/Vine.php b/src/block/Vine.php index 0ba00fee6e..65c6d59aef 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -42,7 +41,7 @@ class Vine extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacingFlags($this->faces); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 817df16588..84b45150c6 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WallConnectionType; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -45,7 +44,7 @@ class Wall extends Transparent{ public function getRequiredStateDataBits() : int{ return 9; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->wallConnections($this->connections); $w->bool($this->post); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index e100170f4f..f50438c6e4 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; @@ -39,7 +38,7 @@ final class WallCoralFan extends BaseCoral{ public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index cadc32036f..5ffd1c7751 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -25,8 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\PillarRotationTrait; use pocketmine\block\utils\WoodTypeTrait; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\math\Vector3; @@ -41,7 +40,7 @@ class Wood extends Opaque{ public function getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 4c8cd5be91..5247e75769 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index cf98507d31..0788c1acaa 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Facing; trait AnyFacingTrait{ @@ -32,7 +31,7 @@ trait AnyFacingTrait{ public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index bb1e3fba31..1391382e48 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Durable; use pocketmine\item\enchantment\VanillaEnchantments; @@ -42,7 +41,7 @@ trait CandleTrait{ public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 00e0d61a2e..ce71131593 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; trait ColoredTrait{ /** @var DyeColor */ @@ -34,7 +33,7 @@ trait ColoredTrait{ public function getRequiredTypeDataBits() : int{ return 4; } /** @see Block::describeType() */ - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 6bbb4fa37b..0842d13511 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -25,8 +25,7 @@ namespace pocketmine\block\utils; use pocketmine\block\BlockIdentifier; use pocketmine\block\BlockTypeInfo; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Axe; use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; @@ -47,7 +46,7 @@ trait CopperTrait{ public function getRequiredTypeDataBits() : int{ return 3; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index ccab725e10..3e362394af 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; trait CoralTypeTrait{ protected CoralType $coralType; @@ -34,7 +33,7 @@ trait CoralTypeTrait{ public function getRequiredTypeDataBits() : int{ return 4; } /** @see Block::describeType() */ - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); $w->bool($this->dead); } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 437dd2cf30..283cba0784 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -33,7 +32,7 @@ trait HorizontalFacingTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 8c1480b03b..9b898ca150 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -38,7 +37,7 @@ trait PillarRotationTrait{ public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->axis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 64a03f35e4..19801ee104 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->powered); } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index e2c6d7609b..9fb03b8a45 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use function floor; trait SignLikeRotationTrait{ @@ -33,7 +32,7 @@ trait SignLikeRotationTrait{ public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->rotation); } diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php new file mode 100644 index 0000000000..e983cea313 --- /dev/null +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -0,0 +1,67 @@ + $connections + */ + public function wallConnections(array &$connections) : void; + + /** + * @param BrewingStandSlot[] $slots + * @phpstan-param array $slots + */ + public function brewingStandSlots(array &$slots) : void; + + public function railShape(int &$railShape) : void; + + public function straightOnlyRailShape(int &$railShape) : void; +} diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index f09d857f51..14fbca209c 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -30,7 +30,7 @@ use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; -final class RuntimeDataReader{ +final class RuntimeDataReader implements RuntimeDataDescriber{ use RuntimeEnumDeserializerTrait; private int $offset = 0; @@ -55,12 +55,16 @@ final class RuntimeDataReader{ $value = $this->readInt($bits); } - public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + protected function readBoundedInt(int $bits, int $min, int $max) : int{ $result = $this->readInt($bits) + $min; if($result < $min || $result > $max){ throw new InvalidSerializedRuntimeDataException("Value is outside the range $min - $max"); } - $value = $result; + return $result; + } + + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + $value = $this->readBoundedInt($bits, $min, $max); } protected function readBool() : bool{ @@ -142,8 +146,7 @@ final class RuntimeDataReader{ $result = []; //TODO: we can pack this into 7 bits instead of 8 foreach(Facing::HORIZONTAL as $facing){ - $type = 0; - $this->boundedInt(2, 0, 2, $type); + $type = $this->readBoundedInt(2, 0, 2); if($type !== 0){ $result[$facing] = match($type){ 1 => WallConnectionType::SHORT(), diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index 23aa45b39b..feaef3698f 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -30,7 +30,7 @@ use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; use function array_flip; -final class RuntimeDataWriter{ +final class RuntimeDataWriter implements RuntimeDataDescriber{ use RuntimeEnumSerializerTrait; private int $value = 0; @@ -40,7 +40,7 @@ final class RuntimeDataWriter{ private int $maxBits ){} - public function int(int $bits, int $value) : void{ + public function writeInt(int $bits, int $value) : void{ if($this->offset + $bits > $this->maxBits){ throw new \InvalidArgumentException("Bit buffer cannot be larger than $this->maxBits bits (already have $this->offset bits)"); } @@ -52,19 +52,31 @@ final class RuntimeDataWriter{ $this->offset += $bits; } - public function boundedInt(int $bits, int $min, int $max, int $value) : void{ + public function int(int $bits, int &$value) : void{ + $this->writeInt($bits, $value); + } + + protected function writeBoundedInt(int $bits, int $min, int $max, int $value) : void{ if($value < $min || $value > $max){ throw new \InvalidArgumentException("Value $value is outside the range $min - $max"); } - $this->int($bits, $value - $min); + $this->writeInt($bits, $value - $min); } - public function bool(bool $value) : void{ - $this->int(1, $value ? 1 : 0); + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + $this->writeBoundedInt($bits, $min, $max, $value); } - public function horizontalFacing(int $facing) : void{ - $this->int(2, match($facing){ + protected function writeBool(bool $value) : void{ + $this->writeInt(1, $value ? 1 : 0); + } + + public function bool(bool &$value) : void{ + $this->writeBool($value); + } + + public function horizontalFacing(int &$facing) : void{ + $this->writeInt(2, match($facing){ Facing::NORTH => 0, Facing::EAST => 1, Facing::SOUTH => 2, @@ -76,15 +88,15 @@ final class RuntimeDataWriter{ /** * @param int[] $faces */ - public function horizontalFacingFlags(array $faces) : void{ + public function horizontalFacingFlags(array &$faces) : void{ $uniqueFaces = array_flip($faces); foreach(Facing::HORIZONTAL as $facing){ - $this->bool(isset($uniqueFaces[$facing])); + $this->writeBool(isset($uniqueFaces[$facing])); } } - public function facing(int $facing) : void{ - $this->int(3, match($facing){ + public function facing(int &$facing) : void{ + $this->writeInt(3, match($facing){ 0 => Facing::DOWN, 1 => Facing::UP, 2 => Facing::NORTH, @@ -95,12 +107,12 @@ final class RuntimeDataWriter{ }); } - public function facingExcept(int $facing, int $except) : void{ + public function facingExcept(int &$facing, int $except) : void{ $this->facing($facing); } - public function axis(int $axis) : void{ - $this->int(2, match($axis){ + public function axis(int &$axis) : void{ + $this->writeInt(2, match($axis){ Axis::X => 0, Axis::Z => 1, Axis::Y => 2, @@ -108,8 +120,8 @@ final class RuntimeDataWriter{ }); } - public function horizontalAxis(int $axis) : void{ - $this->int(1, match($axis){ + public function horizontalAxis(int &$axis) : void{ + $this->writeInt(1, match($axis){ Axis::X => 0, Axis::Z => 1, default => throw new \InvalidArgumentException("Invalid horizontal axis $axis") @@ -120,10 +132,10 @@ final class RuntimeDataWriter{ * @param WallConnectionType[] $connections * @phpstan-param array $connections */ - public function wallConnections(array $connections) : void{ + public function wallConnections(array &$connections) : void{ //TODO: we can pack this into 7 bits instead of 8 foreach(Facing::HORIZONTAL as $facing){ - $this->boundedInt(2, 0, 2, match($connections[$facing] ?? null){ + $this->writeBoundedInt(2, 0, 2, match($connections[$facing] ?? null){ null => 0, WallConnectionType::SHORT() => 1, WallConnectionType::TALL() => 2, @@ -136,21 +148,21 @@ final class RuntimeDataWriter{ * @param BrewingStandSlot[] $slots * @phpstan-param array $slots */ - public function brewingStandSlots(array $slots) : void{ + public function brewingStandSlots(array &$slots) : void{ foreach([ BrewingStandSlot::EAST(), BrewingStandSlot::NORTHWEST(), BrewingStandSlot::SOUTHWEST(), ] as $member){ - $this->bool(isset($slots[$member->id()])); + $this->writeBool(isset($slots[$member->id()])); } } - public function railShape(int $railShape) : void{ + public function railShape(int &$railShape) : void{ $this->int(4, $railShape); } - public function straightOnlyRailShape(int $railShape) : void{ + public function straightOnlyRailShape(int &$railShape) : void{ $this->int(3, $railShape); } diff --git a/src/data/runtime/RuntimeEnumDescriber.php b/src/data/runtime/RuntimeEnumDescriber.php new file mode 100644 index 0000000000..dc0083e8ba --- /dev/null +++ b/src/data/runtime/RuntimeEnumDescriber.php @@ -0,0 +1,58 @@ +int(2, match($value){ + public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\BellAttachmentType::CEILING() => 0, \pocketmine\block\utils\BellAttachmentType::FLOOR() => 1, \pocketmine\block\utils\BellAttachmentType::ONE_WALL() => 2, @@ -41,8 +41,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function copperOxidation(\pocketmine\block\utils\CopperOxidation $value) : void{ - $this->int(2, match($value){ + public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\CopperOxidation::EXPOSED() => 0, \pocketmine\block\utils\CopperOxidation::NONE() => 1, \pocketmine\block\utils\CopperOxidation::OXIDIZED() => 2, @@ -51,8 +51,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function coralType(\pocketmine\block\utils\CoralType $value) : void{ - $this->int(3, match($value){ + public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ + $this->writeInt(3, match($value){ \pocketmine\block\utils\CoralType::BRAIN() => 0, \pocketmine\block\utils\CoralType::BUBBLE() => 1, \pocketmine\block\utils\CoralType::FIRE() => 2, @@ -62,8 +62,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function dirtType(\pocketmine\block\utils\DirtType $value) : void{ - $this->int(2, match($value){ + public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\DirtType::COARSE() => 0, \pocketmine\block\utils\DirtType::NORMAL() => 1, \pocketmine\block\utils\DirtType::ROOTED() => 2, @@ -71,8 +71,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function dyeColor(\pocketmine\block\utils\DyeColor $value) : void{ - $this->int(4, match($value){ + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ + $this->writeInt(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, \pocketmine\block\utils\DyeColor::BLUE() => 1, \pocketmine\block\utils\DyeColor::BROWN() => 2, @@ -93,8 +93,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function froglightType(\pocketmine\block\utils\FroglightType $value) : void{ - $this->int(2, match($value){ + public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\FroglightType::OCHRE() => 0, \pocketmine\block\utils\FroglightType::PEARLESCENT() => 1, \pocketmine\block\utils\FroglightType::VERDANT() => 2, @@ -102,8 +102,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function leverFacing(\pocketmine\block\utils\LeverFacing $value) : void{ - $this->int(3, match($value){ + public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ + $this->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, @@ -116,8 +116,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function medicineType(\pocketmine\item\MedicineType $value) : void{ - $this->int(2, match($value){ + public function medicineType(\pocketmine\item\MedicineType &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\item\MedicineType::ANTIDOTE() => 0, \pocketmine\item\MedicineType::ELIXIR() => 1, \pocketmine\item\MedicineType::EYE_DROPS() => 2, @@ -126,8 +126,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType $value) : void{ - $this->int(4, match($value){ + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ + $this->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, @@ -143,8 +143,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function potionType(\pocketmine\item\PotionType $value) : void{ - $this->int(6, match($value){ + public function potionType(\pocketmine\item\PotionType &$value) : void{ + $this->writeInt(6, match($value){ \pocketmine\item\PotionType::AWKWARD() => 0, \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, \pocketmine\item\PotionType::HARMING() => 2, @@ -191,8 +191,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function skullType(\pocketmine\block\utils\SkullType $value) : void{ - $this->int(3, match($value){ + public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ + $this->writeInt(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, \pocketmine\block\utils\SkullType::DRAGON() => 1, \pocketmine\block\utils\SkullType::PLAYER() => 2, @@ -203,8 +203,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function slabType(\pocketmine\block\utils\SlabType $value) : void{ - $this->int(2, match($value){ + public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ + $this->writeInt(2, match($value){ \pocketmine\block\utils\SlabType::BOTTOM() => 0, \pocketmine\block\utils\SlabType::DOUBLE() => 1, \pocketmine\block\utils\SlabType::TOP() => 2, @@ -212,8 +212,8 @@ trait RuntimeEnumSerializerTrait{ }); } - public function suspiciousStewType(\pocketmine\item\SuspiciousStewType $value) : void{ - $this->int(4, match($value){ + public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ + $this->writeInt(4, match($value){ \pocketmine\item\SuspiciousStewType::ALLIUM() => 0, \pocketmine\item\SuspiciousStewType::AZURE_BLUET() => 1, \pocketmine\item\SuspiciousStewType::BLUE_ORCHID() => 2, diff --git a/src/item/Banner.php b/src/item/Banner.php index e86d4dbce9..5de6bd9091 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -29,8 +29,7 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; @@ -64,7 +63,7 @@ class Banner extends ItemBlockWallOrFloor{ return $this; } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index c3f23d2ca3..7ea31d53de 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -27,8 +27,7 @@ use pocketmine\block\Block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -42,7 +41,7 @@ final class CoralFan extends Item{ parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //this is aliased to ensure a compile error in case the functions in Item or Block start to differ in future //right now we can directly reuse encodeType from CoralTypeTrait, but that might silently stop working if Item //were to be altered. CoralTypeTrait was originally intended for blocks, so it's better not to assume anything. diff --git a/src/item/Dye.php b/src/item/Dye.php index 4a32983d8f..969c66eeeb 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -24,8 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\DyeColor; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class Dye extends Item{ private DyeColor $color; @@ -35,7 +34,7 @@ class Dye extends Item{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/Item.php b/src/item/Item.php index ded0de16b7..ea2bd61250 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -32,7 +32,7 @@ use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; -use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; @@ -470,7 +470,7 @@ class Item implements \JsonSerializable{ return $writer->getValue(); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //NOOP } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 1a005286d7..a7e14b5ce8 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -26,8 +26,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\VanillaBlocks; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; /** * Class used for Items that directly represent blocks, such as stone, dirt, wood etc. @@ -53,7 +52,7 @@ final class ItemBlock extends Item{ $this->maxStackSize = $block->getMaxStackSize(); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); } diff --git a/src/item/Medicine.php b/src/item/Medicine.php index 0915a19c1d..099af6d3ca 100644 --- a/src/item/Medicine.php +++ b/src/item/Medicine.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Living; use pocketmine\player\Player; @@ -37,7 +36,7 @@ class Medicine extends Item implements ConsumableItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->medicineType($this->medicineType); } diff --git a/src/item/Potion.php b/src/item/Potion.php index 1933c99095..7fcbeaa046 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Living; use pocketmine\player\Player; @@ -37,7 +36,7 @@ class Potion extends Item implements ConsumableItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index 462b670b32..a99d7541d0 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; use pocketmine\entity\projectile\Throwable; @@ -39,7 +38,7 @@ class SplashPotion extends ProjectileItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php index 8f5eb3e2d1..1ecb94d7bc 100644 --- a/src/item/SuspiciousStew.php +++ b/src/item/SuspiciousStew.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\runtime\RuntimeDataReader; -use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeDataDescriber; class SuspiciousStew extends Food{ @@ -35,7 +34,7 @@ class SuspiciousStew extends Food{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->suspiciousStewType($this->suspiciousStewType); } From 55a48e0c8403fa24250ffc05e86158107b8750d5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Feb 2023 16:45:19 +0000 Subject: [PATCH 0600/1858] Block: specifying required type/state data bits is no longer required RuntimeDataSizeCalculator allows calculating the number of required bits from describeType directly, which considerably reduces boilerplate code. --- build/generate-runtime-enum-serializers.php | 27 +++++ src/block/Anvil.php | 4 - src/block/Bamboo.php | 2 - src/block/BambooSapling.php | 2 - src/block/Barrel.php | 2 - src/block/Bed.php | 2 - src/block/Bedrock.php | 2 - src/block/Bell.php | 2 - src/block/Block.php | 32 +++++- src/block/BrewingStand.php | 2 - src/block/Button.php | 2 - src/block/Cactus.php | 2 - src/block/Cake.php | 2 - src/block/Candle.php | 4 - src/block/ChorusFlower.php | 2 - src/block/CocoaBlock.php | 2 - src/block/Crops.php | 2 - src/block/DaylightSensor.php | 2 - src/block/DetectorRail.php | 2 - src/block/Dirt.php | 2 - src/block/Door.php | 2 - src/block/DoublePlant.php | 2 - src/block/EndPortalFrame.php | 2 - src/block/Farmland.php | 2 - src/block/FenceGate.php | 2 - src/block/FillableCauldron.php | 4 - src/block/Fire.php | 2 - src/block/FloorCoralFan.php | 2 - src/block/Froglight.php | 2 - src/block/FrostedIce.php | 2 - src/block/Furnace.php | 2 - src/block/Hopper.php | 2 - src/block/ItemFrame.php | 2 - src/block/Lantern.php | 2 - src/block/Leaves.php | 2 - src/block/Lectern.php | 2 - src/block/Lever.php | 2 - src/block/Light.php | 2 - src/block/Liquid.php | 2 - src/block/NetherPortal.php | 2 - src/block/NetherVines.php | 4 - src/block/NetherWartPlant.php | 2 - src/block/Rail.php | 2 - src/block/RedMushroomBlock.php | 2 - src/block/RedstoneComparator.php | 2 - src/block/RedstoneLamp.php | 2 - src/block/RedstoneOre.php | 2 - src/block/RedstoneRepeater.php | 2 - src/block/RedstoneTorch.php | 2 - src/block/Sapling.php | 2 - src/block/SeaPickle.php | 2 - src/block/ShulkerBox.php | 2 - src/block/SimplePressurePlate.php | 2 - src/block/Skull.php | 4 - src/block/Slab.php | 2 - src/block/SnowLayer.php | 2 - src/block/Sponge.php | 2 - src/block/Stair.php | 2 - src/block/StraightOnlyRail.php | 2 - src/block/Sugarcane.php | 2 - src/block/SweetBerryBush.php | 2 - src/block/TNT.php | 4 - src/block/Torch.php | 2 - src/block/Trapdoor.php | 2 - src/block/Tripwire.php | 2 - src/block/TripwireHook.php | 2 - src/block/UnknownBlock.php | 2 - src/block/Vine.php | 2 - src/block/Wall.php | 2 - src/block/WallCoralFan.php | 2 - src/block/Wood.php | 2 - .../AnalogRedstoneSignalEmitterTrait.php | 2 - src/block/utils/AnyFacingTrait.php | 2 - src/block/utils/CandleTrait.php | 2 - src/block/utils/ColoredTrait.php | 2 - src/block/utils/CopperTrait.php | 2 - src/block/utils/CoralTypeTrait.php | 2 - src/block/utils/HorizontalFacingTrait.php | 2 - src/block/utils/PillarRotationTrait.php | 2 - .../utils/RailPoweredByRedstoneTrait.php | 2 - src/block/utils/SignLikeRotationTrait.php | 2 - .../runtime/RuntimeDataSizeCalculator.php | 99 +++++++++++++++++++ .../RuntimeEnumSizeCalculatorTrait.php | 86 ++++++++++++++++ 83 files changed, 242 insertions(+), 172 deletions(-) create mode 100644 src/data/runtime/RuntimeDataSizeCalculator.php create mode 100644 src/data/runtime/RuntimeEnumSizeCalculatorTrait.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index d4b723814c..db1d384ca8 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -105,6 +105,22 @@ function buildInterfaceFunc(string $nativeTypeName, string $functionName) : stri return "public function $functionName(\\$nativeTypeName &\$value) : void;"; } +/** + * @param string[] $memberNames + * @phpstan-param list $memberNames + * + * @return string[] + * @phpstan-return list + */ +function buildSizeCalculationFunc(string $nativeTypeName, string $functionName, array $memberNames) : array{ + $lines = []; + $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; + $lines[] = "\t\$this->addBits(" . getBitsRequired($memberNames) . ");"; + $lines[] = "}"; + + return $lines; +} + /** * @param mixed[] $members */ @@ -151,6 +167,11 @@ $writerFuncs = [ ] ]; $interfaceFuncs = []; +$sizeCalculationFuncs = [ + "" => [ + "abstract protected function addBits(int \$bits) : void;" + ] +]; foreach($enumsUsed as $enumMembers){ if(count($enumMembers) === 0){ @@ -178,6 +199,11 @@ foreach($enumsUsed as $enumMembers){ $nativeTypeName, $functionName )]; + $sizeCalculationFuncs[$functionName] = buildSizeCalculationFunc( + $nativeTypeName, + $functionName, + $stringifiedMembers + ); } /** @@ -232,5 +258,6 @@ HEADER; printFunctions($writerFuncs, "RuntimeEnumSerializerTrait", "trait"); printFunctions($readerFuncs, "RuntimeEnumDeserializerTrait", "trait"); printFunctions($interfaceFuncs, "RuntimeEnumDescriber", "interface"); +printFunctions($sizeCalculationFuncs, "RuntimeEnumSizeCalculatorTrait", "trait"); echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 76dc2cedee..17814e2c90 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,14 +51,10 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index b576e771f7..a6a08859be 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -55,8 +55,6 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index d5342f6b42..cfa81519bd 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -36,8 +36,6 @@ use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ private bool $ready = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index ee732b72c9..68eda53319 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -38,8 +38,6 @@ class Barrel extends Opaque{ protected bool $open = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->open); diff --git a/src/block/Bed.php b/src/block/Bed.php index 6da2f5aa93..678c8a5429 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -53,8 +53,6 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 5095d3a648..4bca833056 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Bedrock extends Opaque{ private bool $burnsForever = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index 20942f1df8..f20a031c2e 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -48,8 +48,6 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); $w->horizontalFacing($this->facing); diff --git a/src/block/Block.php b/src/block/Block.php index 2dce0a49a2..6863f47bcd 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -31,6 +31,7 @@ use pocketmine\block\tile\Tile; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\data\runtime\RuntimeDataReader; +use pocketmine\data\runtime\RuntimeDataSizeCalculator; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\projectile\Projectile; @@ -64,6 +65,17 @@ class Block{ /** @var AxisAlignedBB[]|null */ protected ?array $collisionBoxes = null; + /** + * @var int[] + * @phpstan-var array + */ + private static array $typeDataBits = []; + /** + * @var int[] + * @phpstan-var array + */ + private static array $stateDataBits = []; + /** * @param string $name English name of the block type (TODO: implement translations) */ @@ -114,9 +126,25 @@ class Block{ return new ItemBlock($this); } - public function getRequiredTypeDataBits() : int{ return 0; } + final public function getRequiredTypeDataBits() : int{ + $class = get_class($this); + if(isset(self::$typeDataBits[$class])){ + return self::$typeDataBits[$class]; + } + $calculator = new RuntimeDataSizeCalculator(); + $this->describeType($calculator); + return self::$typeDataBits[$class] = $calculator->getBitsUsed(); + } - public function getRequiredStateDataBits() : int{ return 0; } + final public function getRequiredStateDataBits() : int{ + $class = get_class($this); + if(isset(self::$stateDataBits[$class])){ + return self::$stateDataBits[$class]; + } + $calculator = new RuntimeDataSizeCalculator(); + $this->describeState($calculator); + return self::$stateDataBits[$class] = $calculator->getBitsUsed(); + } /** * @internal diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 033d93df07..479d207393 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -43,8 +43,6 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->brewingStandSlots($this->slots); } diff --git a/src/block/Button.php b/src/block/Button.php index 6274b7e695..aa6ca8fa0b 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -38,8 +38,6 @@ abstract class Button extends Flowable{ protected bool $pressed = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->pressed); diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 8828219d8a..18dd726e77 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -41,8 +41,6 @@ class Cactus extends Transparent{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 8870968c26..93e51be218 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -36,8 +36,6 @@ class Cake extends BaseCake{ protected int $bites = 0; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } diff --git a/src/block/Candle.php b/src/block/Candle.php index b382c0fe5e..4870277cc2 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -46,10 +46,6 @@ class Candle extends Transparent{ private int $count = self::MIN_COUNT; - public function getRequiredStateDataBits() : int{ - return 3; - } - protected function describeState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 8b20b0e3d9..2aa65d1f66 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -49,8 +49,6 @@ final class ChorusFlower extends Flowable{ private int $age = self::MIN_AGE; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 02c4390b9f..fe4f1736bd 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -46,8 +46,6 @@ class CocoaBlock extends Transparent{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); diff --git a/src/block/Crops.php b/src/block/Crops.php index aabab87bb5..c1c13bee97 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -38,8 +38,6 @@ abstract class Crops extends Flowable{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 27ec3764ed..2a55500c66 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -41,8 +41,6 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; - public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); $w->bool($this->inverted); diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 032f308702..8af12276b9 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->activated); diff --git a/src/block/Dirt.php b/src/block/Dirt.php index ead1e0c830..900879433e 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -45,8 +45,6 @@ class Dirt extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Door.php b/src/block/Door.php index b0eba797c5..98a8f53090 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -41,8 +41,6 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 00c967271e..be231c1eaa 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -33,8 +33,6 @@ use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ protected bool $top = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index f4e08393fa..5a6537d4d7 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -35,8 +35,6 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->eye); diff --git a/src/block/Farmland.php b/src/block/Farmland.php index cdc3b464e9..7ce08c2d99 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -37,8 +37,6 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 75ffccbeae..7ad96d8421 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -42,8 +42,6 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->open); diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index 048b3f3126..b6d9b995e5 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -37,10 +37,6 @@ abstract class FillableCauldron extends Transparent{ private int $fillLevel = self::MIN_FILL_LEVEL; - public function getRequiredStateDataBits() : int{ - return 3; - } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } diff --git a/src/block/Fire.php b/src/block/Fire.php index 8184caf6de..6f43322617 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -39,8 +39,6 @@ class Fire extends BaseFire{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 11bfb9e0fc..173c87a08f 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -37,8 +37,6 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index e93ec2eb85..13b68e21ed 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -35,8 +35,6 @@ final class Froglight extends SimplePillar{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredTypeDataBits() : int{ return 2; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index c1eacb0193..5953ce8ae4 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -32,8 +32,6 @@ class FrostedIce extends Ice{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 8cb1749857..f830a38355 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -46,8 +46,6 @@ class Furnace extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->lit); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 7764a4ee7d..778e5c2a17 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,8 +39,6 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index a3c313ca26..94754910f3 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -50,8 +50,6 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->hasMap); diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 47aa4496f6..a5d8031dd4 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -43,8 +43,6 @@ class Lantern extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 94d6cbccae..b83de2dde3 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -47,8 +47,6 @@ class Leaves extends Transparent{ $this->leavesType = $leavesType; } - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->noDecay); $w->bool($this->checkDecay); diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 7a144dbb87..ae1df8549c 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -46,8 +46,6 @@ class Lectern extends Transparent{ protected bool $producingSignal = false; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->producingSignal); diff --git a/src/block/Lever.php b/src/block/Lever.php index a399376875..284a646d9a 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -44,8 +44,6 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); diff --git a/src/block/Light.php b/src/block/Light.php index bdd232b6c2..5ee7281c9f 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -34,8 +34,6 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; - public function getRequiredTypeDataBits() : int{ return 4; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 4f76d4699c..476a8f8c71 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -48,8 +48,6 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; - public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 873040fd3c..0c507a166f 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -34,8 +34,6 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index c2c4971127..4a924b2bee 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -52,10 +52,6 @@ class NetherVines extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ - return 5; - } - public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(5, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 2d3316b2cf..787b1f5f86 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -37,8 +37,6 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 2d37f6e95d..12b47e6ea1 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -34,8 +34,6 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->railShape($this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 42763ba95a..17fced4129 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -36,8 +36,6 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->mushroomBlockType($this->mushroomBlockType); } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index e105701d19..0f8fee840e 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -44,8 +44,6 @@ class RedstoneComparator extends Flowable{ protected bool $isSubtractMode = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->isSubtractMode); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 5557076b37..1d0ff73451 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -29,8 +29,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 34d463731a..13cf84205f 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -33,8 +33,6 @@ use function mt_rand; class RedstoneOre extends Opaque{ protected bool $lit = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 212bc9f4e2..d1ad17eeb6 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -43,8 +43,6 @@ class RedstoneRepeater extends Flowable{ protected int $delay = self::MIN_DELAY; - public function getRequiredStateDataBits() : int{ return 5; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index b36bc91853..f85c6c07a2 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ protected bool $lit = true; - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->lit); diff --git a/src/block/Sapling.php b/src/block/Sapling.php index ea04ba624b..838a32ce8c 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -46,8 +46,6 @@ class Sapling extends Flowable{ $this->treeType = $treeType; } - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 770ae6b45a..c2955cbaa3 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -38,8 +38,6 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 292506deb3..e979b09e52 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -34,8 +34,6 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; - public function getRequiredStateDataBits() : int{ return 0; } - protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index f93e244a57..f4ad37ea44 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 36a587aa9c..10403ab6b0 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -49,14 +49,10 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredTypeDataBits() : int{ return 3; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Slab.php b/src/block/Slab.php index 3290648ebd..4e25d15a4a 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -41,8 +41,6 @@ class Slab extends Transparent{ $this->slabType = SlabType::BOTTOM(); } - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->slabType($this->slabType); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 4f3950e740..ec08620c08 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -46,8 +46,6 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index d8784febd2..b4e523ffa3 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; - public function getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index afbbf79182..971dbc43af 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -46,8 +46,6 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->upsideDown); diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index bb9482fe90..fe3d19b25e 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -36,8 +36,6 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->straightOnlyRailShape($this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index a23c6d74d8..cc41c0fb0e 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -38,8 +38,6 @@ class Sugarcane extends Flowable{ protected int $age = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index a93306da9e..c9e9232e72 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -45,8 +45,6 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index 1206d0e302..7012f7145b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -45,14 +45,10 @@ 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 getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index 5b496c9ad7..b7bc5136f3 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -36,8 +36,6 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 83bf4693e6..79e3f0e8f9 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -40,8 +40,6 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index c785e6d12f..b8b3e732d4 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -33,8 +33,6 @@ class Tripwire extends Flowable{ protected bool $connected = false; protected bool $disarmed = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->triggered); $w->bool($this->suspended); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 9180f971f7..2ad6057b8f 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -38,8 +38,6 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->connected); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index f3faeb6896..7c48b236fa 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -38,8 +38,6 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - public function getRequiredTypeDataBits() : int{ return Block::INTERNAL_STATE_DATA_BITS; } - protected function describeType(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block diff --git a/src/block/Vine.php b/src/block/Vine.php index 65c6d59aef..53d4b1efe1 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -39,8 +39,6 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacingFlags($this->faces); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 84b45150c6..8b128c525f 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -42,8 +42,6 @@ class Wall extends Transparent{ protected array $connections = []; protected bool $post = false; - public function getRequiredStateDataBits() : int{ return 9; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->wallConnections($this->connections); $w->bool($this->post); diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index f50438c6e4..c7e350c473 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -36,8 +36,6 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index 5ffd1c7751..9a0c36e1d6 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -38,8 +38,6 @@ class Wood extends Opaque{ private bool $stripped = false; - public function getRequiredTypeDataBits() : int{ return 1; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 5247e75769..783517dcd0 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 0788c1acaa..78fdd9bf9e 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -29,8 +29,6 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; - public function getRequiredStateDataBits() : int{ return 3; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 1391382e48..60dd618490 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -39,8 +39,6 @@ use pocketmine\world\sound\FlintSteelSound; trait CandleTrait{ private bool $lit = false; - public function getRequiredStateDataBits() : int{ return 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index ce71131593..42abe64b95 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -30,8 +30,6 @@ trait ColoredTrait{ /** @var DyeColor */ private $color; - public function getRequiredTypeDataBits() : int{ return 4; } - /** @see Block::describeType() */ protected function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 0842d13511..ed230c6bad 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -44,8 +44,6 @@ trait CopperTrait{ parent::__construct($identifier, $name, $typeInfo); } - public function getRequiredTypeDataBits() : int{ return 3; } - protected function describeType(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 3e362394af..d2c96c8f4a 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -30,8 +30,6 @@ trait CoralTypeTrait{ protected CoralType $coralType; protected bool $dead = false; - public function getRequiredTypeDataBits() : int{ return 4; } - /** @see Block::describeType() */ protected function describeType(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 283cba0784..b1558b154a 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -30,8 +30,6 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 9b898ca150..0fc206a203 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -35,8 +35,6 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; - public function getRequiredStateDataBits() : int{ return 2; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->axis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 19801ee104..a95fea253e 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -28,8 +28,6 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; - public function getRequiredStateDataBits() : int{ return parent::getRequiredStateDataBits() + 1; } - protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->powered); diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 9fb03b8a45..2fed259106 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -30,8 +30,6 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; - public function getRequiredStateDataBits() : int{ return 4; } - protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->rotation); } diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php new file mode 100644 index 0000000000..5678ffd81e --- /dev/null +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -0,0 +1,99 @@ +bits += $bits; + } + + public function getBitsUsed() : int{ + return $this->bits; + } + + public function int(int $bits, int &$value) : void{ + $this->addBits($bits); + } + + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + $this->addBits($bits); + } + + public function bool(bool &$value) : void{ + $this->addBits(1); + } + + public function horizontalFacing(int &$facing) : void{ + $this->addBits(2); + } + + /** + * @inheritDoc + */ + public function horizontalFacingFlags(array &$faces) : void{ + $this->addBits(count(Facing::HORIZONTAL)); + // TODO: Implement horizontalFacingFlags() method. + } + + public function facing(int &$facing) : void{ + $this->addBits(3); + } + + public function facingExcept(int &$facing, int $except) : void{ + $this->facing($facing); + } + + public function axis(int &$axis) : void{ + $this->addBits(2); + } + + public function horizontalAxis(int &$axis) : void{ + $this->addBits(1); + } + + public function wallConnections(array &$connections) : void{ + //TODO: this can be reduced to 7 if we pack the trinary values + $this->addBits(8); + } + + public function brewingStandSlots(array &$slots) : void{ + $this->addBits(count(BrewingStandSlot::getAll())); + } + + public function railShape(int &$railShape) : void{ + $this->addBits(4); + } + + public function straightOnlyRailShape(int &$railShape) : void{ + $this->addBits(3); + } +} diff --git a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php new file mode 100644 index 0000000000..25defa2c0a --- /dev/null +++ b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php @@ -0,0 +1,86 @@ +addBits(2); + } + + public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ + $this->addBits(2); + } + + public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ + $this->addBits(3); + } + + public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ + $this->addBits(2); + } + + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ + $this->addBits(4); + } + + public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ + $this->addBits(2); + } + + public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ + $this->addBits(3); + } + + public function medicineType(\pocketmine\item\MedicineType &$value) : void{ + $this->addBits(2); + } + + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ + $this->addBits(4); + } + + public function potionType(\pocketmine\item\PotionType &$value) : void{ + $this->addBits(6); + } + + public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ + $this->addBits(3); + } + + public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ + $this->addBits(2); + } + + public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ + $this->addBits(4); + } + +} From 1e3b025916ad2c1ce5f33dbdca5bf1d6e013b44a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 16:36:32 +0000 Subject: [PATCH 0601/1858] 1.19.62 --- composer.json | 2 +- composer.lock | 14 ++++++------- .../mcpe/handler/LoginPacketHandler.php | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 04ec453763..159e007be9 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", - "pocketmine/bedrock-protocol": "~19.1.0+bedrock-1.19.60", + "pocketmine/bedrock-protocol": "~19.2.0+bedrock-1.19.62", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index f87d2be111..9bd452dca2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2121c9df1e7a2193339f5a4fc9f70f52", + "content-hash": "56a1e8facd8fd7d56d6c7d2eb390e842", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "19.1.0+bedrock-1.19.60", + "version": "19.2.0+bedrock-1.19.62", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "b57d8145cb765110d599dd68241f2ebe68c80933" + "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/b57d8145cb765110d599dd68241f2ebe68c80933", - "reference": "b57d8145cb765110d599dd68241f2ebe68c80933", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", + "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.1.0+bedrock-1.19.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/19.2.0+bedrock-1.19.62" }, - "time": "2023-02-15T12:35:51+00:00" + "time": "2023-02-17T16:32:49+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 80f162697a..6d896aba97 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -84,6 +84,27 @@ class LoginPacketHandler extends PacketHandler{ } $clientData = $this->parseClientData($packet->clientDataJwt); + + //TODO: REMOVE THIS + //Mojang forgot to bump the protocol version when they changed protocol in 1.19.62. Check the game version instead. + if(preg_match('/^(\d+)\.(\d+)\.(\d+)/', $clientData->GameVersion, $matches) !== 1){ + throw new PacketHandlingException("Invalid game version format, expected at least 3 digits"); + } + $major = (int) $matches[1]; + $minor = (int) $matches[2]; + $patch = (int) $matches[3]; + if($major === 1 && $minor === 19 && $patch < 62){ + $this->session->sendDataPacket(PlayStatusPacket::create(PlayStatusPacket::LOGIN_FAILED_CLIENT), true); + + //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) + $this->session->disconnect( + $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol("$packet->protocol (< v1.19.62)")), + false + ); + + return true; + } + try{ $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ From 9a6d7b505cca3440228d276ce5363de26ce430a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 16:37:34 +0000 Subject: [PATCH 0602/1858] Release 4.15.0 --- changelogs/4.15.md | 14 ++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.15.md diff --git a/changelogs/4.15.md b/changelogs/4.15.md new file mode 100644 index 0000000000..b80115e88e --- /dev/null +++ b/changelogs/4.15.md @@ -0,0 +1,14 @@ +**For Minecraft: Bedrock Edition 1.19.62** + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.15.0 +Released 17th February 2023. + +## General +- Added support for Minecraft: Bedrock Edition 1.19.62. +- Removed support for older versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 99a977fdac..18cd74521b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.14.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.15.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 38828e2b424cd193e71e3fc9f1e06a5a02334ac5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 16:37:34 +0000 Subject: [PATCH 0603/1858] 4.15.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 18cd74521b..a763bf0700 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.15.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 71aad310c614453b8a2404a95994d04c15328c3d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 16:39:46 +0000 Subject: [PATCH 0604/1858] stfu --- src/network/mcpe/handler/LoginPacketHandler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 6d896aba97..c2367454b0 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -46,6 +46,7 @@ use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use Ramsey\Uuid\Uuid; use function is_array; +use function preg_match; /** * Handles the initial login phase of the session. This handler is used as the initial state. From b56b35b10d643f0b1b98b259daa1b9f888291638 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 20:14:38 +0000 Subject: [PATCH 0605/1858] ItemEntity: fixed a bunch of suspicious logic in entityBaseTick() closes #5580 --- src/entity/object/ItemEntity.php | 44 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 4a58620f75..08dea06591 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -113,33 +113,42 @@ class ItemEntity extends Entity{ $hasUpdate = parent::entityBaseTick($tickDiff); - if(!$this->isFlaggedForDespawn() && $this->pickupDelay !== self::NEVER_DESPAWN){ //Infinite delay + if($this->isFlaggedForDespawn()){ + return $hasUpdate; + } + + if($this->pickupDelay !== self::NEVER_DESPAWN && $this->pickupDelay > 0){ //Infinite delay + $hasUpdate = true; $this->pickupDelay -= $tickDiff; if($this->pickupDelay < 0){ $this->pickupDelay = 0; } - if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ - $mergeable = [$this]; //in case the merge target ends up not being this - $mergeTarget = $this; - foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ - if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ - continue; - } + } - if($entity->isMergeable($this)){ - $mergeable[] = $entity; - if($entity->item->getCount() > $mergeTarget->item->getCount()){ - $mergeTarget = $entity; - } - } + if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ + $mergeable = [$this]; //in case the merge target ends up not being this + $mergeTarget = $this; + foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ + if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ + continue; } - foreach($mergeable as $itemEntity){ - if($itemEntity !== $mergeTarget){ - $itemEntity->tryMergeInto($mergeTarget); + + if($entity->isMergeable($this)){ + $mergeable[] = $entity; + if($entity->item->getCount() > $mergeTarget->item->getCount()){ + $mergeTarget = $entity; } } } + foreach($mergeable as $itemEntity){ + if($itemEntity !== $mergeTarget){ + $itemEntity->tryMergeInto($mergeTarget); + } + } + } + if(!$this->isFlaggedForDespawn() && $this->despawnDelay !== self::NEVER_DESPAWN){ + $hasUpdate = true; $this->despawnDelay -= $tickDiff; if($this->despawnDelay <= 0){ $ev = new ItemDespawnEvent($this); @@ -148,7 +157,6 @@ class ItemEntity extends Entity{ $this->despawnDelay = self::DEFAULT_DESPAWN_DELAY; }else{ $this->flagForDespawn(); - $hasUpdate = true; } } } From 42df1a5c704e870fc3a8377119496b5a6af505df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 20:19:32 +0000 Subject: [PATCH 0606/1858] Fixed merge error --- src/network/mcpe/handler/LoginPacketHandler.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index b1b29bc1a7..8ea93d29cd 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -33,6 +33,7 @@ use pocketmine\network\mcpe\JwtException; use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\LoginPacket; +use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\types\login\AuthenticationData; use pocketmine\network\mcpe\protocol\types\login\ClientData; @@ -92,8 +93,8 @@ class LoginPacketHandler extends PacketHandler{ //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) $this->session->disconnect( - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol("$packet->protocol (< v1.19.62)")), - false + KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol("$packet->protocol (< v1.19.62)"), + notify: false ); return true; From 9cdb6419367d41f46bc51aabeb75c93ae5b0cd27 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:47:20 +0000 Subject: [PATCH 0607/1858] Added encode packet timings these changes required some new APIs in BedrockProtocol. --- composer.json | 2 +- composer.lock | 14 +++++----- src/network/mcpe/NetworkSession.php | 28 ++++++++++++++++--- .../mcpe/StandardPacketBroadcaster.php | 9 ++++-- src/timings/Timings.php | 11 ++++++++ 5 files changed, 49 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 0b5a1b69f8..6c06419189 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pocketmine/bedrock-block-upgrade-schema": "^1.0.0", "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", "pocketmine/bedrock-item-upgrade-schema": "^1.0.0", - "pocketmine/bedrock-protocol": "~19.2.0+bedrock-1.19.62", + "pocketmine/bedrock-protocol": "~19.3.0+bedrock-1.19.62", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 99ef44d628..b070d7fc0a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4c3c6f98f5d9eb34c3c5dab3a2f59282", + "content-hash": "7e0991461c05ed03067e19ed52f4579b", "packages": [ { "name": "adhocore/json-comment", @@ -328,16 +328,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "19.2.0+bedrock-1.19.62", + "version": "19.3.0+bedrock-1.19.62", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b" + "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", - "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a5bf4753c7f30f781c4541918e238f5bb637e7ad", + "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad", "shasum": "" }, "require": { @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.2.0+bedrock-1.19.62" + "source": "https://github.com/pmmp/BedrockProtocol/tree/19.3.0+bedrock-1.19.62" }, - "time": "2023-02-17T16:32:49+00:00" + "time": "2023-02-19T16:11:03+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index ebc9439607..7dc9680f27 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -120,6 +120,7 @@ use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\BinaryStream; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; use pocketmine\utils\Utils; @@ -176,7 +177,7 @@ class NetworkSession{ private ?EncryptionContext $cipher = null; - /** @var Packet[] */ + /** @var ClientboundPacket[] */ private array $sendBuffer = []; /** @@ -263,6 +264,23 @@ class NetworkSession{ ); } + /** + * @param ClientboundPacket[] $packets + */ + public static function encodePacketBatchTimed(BinaryStream $stream, PacketSerializerContext $context, array $packets) : void{ + PacketBatch::encodeRaw($stream, array_map(function(ClientboundPacket $packet) use ($context) : string{ + $timings = Timings::getEncodeDataPacketTimings($packet); + $timings->startTiming(); + try{ + $stream = PacketSerializer::encoder($this->packetSerializerContext); + $packet->encode($stream); + return $stream->getBuffer(); + }finally{ + $timings->stopTiming(); + } + }, $packets)); + } + private function onPlayerCreated(Player $player) : void{ if(!$this->isConnected()){ //the remote player might have disconnected before spawn terrain generation was finished @@ -502,12 +520,14 @@ class NetworkSession{ $syncMode = false; } - $batch = PacketBatch::fromPackets($this->packetSerializerContext, ...$this->sendBuffer); + $stream = new BinaryStream(); + self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); + if($this->enableCompression){ - $promise = $this->server->prepareBatch($batch, $this->compressor, $syncMode); + $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); }else{ $promise = new CompressBatchPromise(); - $promise->resolve($batch->getBuffer()); + $promise->resolve($stream->getBuffer()); } $this->sendBuffer = []; $this->queueCompressedNoBufferFlush($promise, $immediate); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 9cba70739c..73848ccae1 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\Server; +use pocketmine\utils\BinaryStream; use function spl_object_id; final class StandardPacketBroadcaster implements PacketBroadcaster{ @@ -38,7 +39,9 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $serializerContext = $recipient->getPacketSerializerContext(); $bufferId = spl_object_id($serializerContext); if(!isset($buffers[$bufferId])){ - $buffers[$bufferId] = PacketBatch::fromPackets($serializerContext, ...$packets); + $stream = new BinaryStream(); + NetworkSession::encodePacketBatchTimed($stream, $serializerContext, $packets); + $buffers[$bufferId] = $stream->getBuffer(); } //TODO: different compressors might be compatible, it might not be necessary to split them up by object @@ -52,14 +55,14 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $buffer = $buffers[$bufferId]; foreach($compressorMap as $compressorId => $compressorTargets){ $compressor = $compressors[$compressorId]; - if(!$compressor->willCompress($buffer->getBuffer())){ + if(!$compressor->willCompress($buffer)){ foreach($compressorTargets as $target){ foreach($packets as $pk){ $target->addToSendBuffer($pk); } } }else{ - $promise = $this->server->prepareBatch($buffer, $compressor); + $promise = $this->server->prepareBatch(new PacketBatch($buffer), $compressor); foreach($compressorTargets as $target){ $target->queueCompressed($promise); } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 1f8426969f..426e9ab611 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -127,6 +127,9 @@ abstract class Timings{ /** @var TimingsHandler[] */ private static array $packetHandleTimingMap = []; + /** @var TimingsHandler[] */ + private static array $packetEncodeTimingMap = []; + /** @var TimingsHandler[] */ public static $packetSendTimingMap = []; /** @var TimingsHandler[] */ @@ -254,6 +257,14 @@ abstract class Timings{ ); } + public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ + $pid = $pk->pid(); + return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler( + self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName() . " [0x" . dechex($pid) . "]", + self::getSendDataPacketTimings($pk) + ); + } + public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ From 2a3288c4f98aae9a685cd43226c42c18bb5c4e3f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:50:03 +0000 Subject: [PATCH 0608/1858] Avoid useless throwaway PacketBatch objects --- src/network/mcpe/ChunkRequestTask.php | 6 +++++- src/network/mcpe/NetworkSession.php | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index f666140994..b1d18eb2bb 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -33,6 +33,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\ChunkPosition; use pocketmine\network\mcpe\serializer\ChunkSerializer; use pocketmine\scheduler\AsyncTask; +use pocketmine\utils\BinaryStream; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; @@ -72,7 +73,10 @@ class ChunkRequestTask extends AsyncTask{ $subCount = ChunkSerializer::getSubChunkCount($chunk) + ChunkSerializer::LOWER_PADDING_SIZE; $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); - $this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload))->getBuffer())); + + $stream = new BinaryStream(); + PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload)]); + $this->setResult($this->compressor->compress($stream->getBuffer())); } public function onError() : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7dc9680f27..96020f405b 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -411,7 +411,13 @@ class NetworkSession{ } try{ - foreach((new PacketBatch($decompressed))->getPackets($this->packetPool, $this->packetSerializerContext, 1300) as [$packet, $buffer]){ + $stream = new BinaryStream($decompressed); + $count = 0; + foreach(PacketBatch::decodeRaw($stream) as $buffer){ + if(++$count > 1300){ + throw new PacketHandlingException("Too many packets in batch"); + } + $packet = $this->packetPool->getPacket($buffer); if($packet === null){ $this->logger->debug("Unknown packet: " . base64_encode($buffer)); throw new PacketHandlingException("Unknown packet received"); From d5e92b4ae69f6e10188167828e82a69c64f6fd5c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:53:04 +0000 Subject: [PATCH 0609/1858] ... --- src/network/mcpe/NetworkSession.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 96020f405b..771d231e69 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -272,7 +272,7 @@ class NetworkSession{ $timings = Timings::getEncodeDataPacketTimings($packet); $timings->startTiming(); try{ - $stream = PacketSerializer::encoder($this->packetSerializerContext); + $stream = PacketSerializer::encoder($context); $packet->encode($stream); return $stream->getBuffer(); }finally{ From 4dbcd714bdf52c6c8eaffbe95255409e2dca1a67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 17:21:10 +0000 Subject: [PATCH 0610/1858] =?UTF-8?q?NetworkSession:=20fixed=20some=20segm?= =?UTF-8?q?ents=20of=20recv/send=20logic=20not=20being=20covered=20by=20th?= =?UTF-8?q?eir=20respective=20network=20timings=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/mcpe/NetworkSession.php | 200 +++++++++++++++------------- 1 file changed, 110 insertions(+), 90 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 771d231e69..2b995ef8f5 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -376,62 +376,67 @@ class NetworkSession{ return; } - if($this->incomingPacketBatchBudget <= 0){ - $this->updatePacketBudget(); - if($this->incomingPacketBatchBudget <= 0){ - throw new PacketHandlingException("Receiving packets too fast"); - } - } - $this->incomingPacketBatchBudget--; - - if($this->cipher !== null){ - Timings::$playerNetworkReceiveDecrypt->startTiming(); - try{ - $payload = $this->cipher->decrypt($payload); - }catch(DecryptionException $e){ - $this->logger->debug("Encrypted packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Packet decryption error"); - }finally{ - Timings::$playerNetworkReceiveDecrypt->stopTiming(); - } - } - - if($this->enableCompression){ - Timings::$playerNetworkReceiveDecompress->startTiming(); - try{ - $decompressed = $this->compressor->decompress($payload); - }catch(DecompressionException $e){ - $this->logger->debug("Failed to decompress packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); - }finally{ - Timings::$playerNetworkReceiveDecompress->stopTiming(); - } - }else{ - $decompressed = $payload; - } - + Timings::$playerNetworkReceive->startTiming(); try{ - $stream = new BinaryStream($decompressed); - $count = 0; - foreach(PacketBatch::decodeRaw($stream) as $buffer){ - if(++$count > 1300){ - throw new PacketHandlingException("Too many packets in batch"); - } - $packet = $this->packetPool->getPacket($buffer); - if($packet === null){ - $this->logger->debug("Unknown packet: " . base64_encode($buffer)); - throw new PacketHandlingException("Unknown packet received"); - } - try{ - $this->handleDataPacket($packet, $buffer); - }catch(PacketHandlingException $e){ - $this->logger->debug($packet->getName() . ": " . base64_encode($buffer)); - throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); + if($this->incomingPacketBatchBudget <= 0){ + $this->updatePacketBudget(); + if($this->incomingPacketBatchBudget <= 0){ + throw new PacketHandlingException("Receiving packets too fast"); } } - }catch(PacketDecodeException $e){ - $this->logger->logException($e); - throw PacketHandlingException::wrap($e, "Packet batch decode error"); + $this->incomingPacketBatchBudget--; + + if($this->cipher !== null){ + Timings::$playerNetworkReceiveDecrypt->startTiming(); + try{ + $payload = $this->cipher->decrypt($payload); + }catch(DecryptionException $e){ + $this->logger->debug("Encrypted packet: " . base64_encode($payload)); + throw PacketHandlingException::wrap($e, "Packet decryption error"); + }finally{ + Timings::$playerNetworkReceiveDecrypt->stopTiming(); + } + } + + if($this->enableCompression){ + Timings::$playerNetworkReceiveDecompress->startTiming(); + try{ + $decompressed = $this->compressor->decompress($payload); + }catch(DecompressionException $e){ + $this->logger->debug("Failed to decompress packet: " . base64_encode($payload)); + throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); + }finally{ + Timings::$playerNetworkReceiveDecompress->stopTiming(); + } + }else{ + $decompressed = $payload; + } + + try{ + $stream = new BinaryStream($decompressed); + $count = 0; + foreach(PacketBatch::decodeRaw($stream) as $buffer){ + if(++$count > 1300){ + throw new PacketHandlingException("Too many packets in batch"); + } + $packet = $this->packetPool->getPacket($buffer); + if($packet === null){ + $this->logger->debug("Unknown packet: " . base64_encode($buffer)); + throw new PacketHandlingException("Unknown packet received"); + } + try{ + $this->handleDataPacket($packet, $buffer); + }catch(PacketHandlingException $e){ + $this->logger->debug($packet->getName() . ": " . base64_encode($buffer)); + throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); + } + } + }catch(PacketDecodeException $e){ + $this->logger->logException($e); + throw PacketHandlingException::wrap($e, "Packet batch decode error"); + } + }finally{ + Timings::$playerNetworkReceive->stopTiming(); } } @@ -519,24 +524,29 @@ class NetworkSession{ private function flushSendBuffer(bool $immediate = false) : void{ if(count($this->sendBuffer) > 0){ - $syncMode = null; //automatic - if($immediate){ - $syncMode = true; - }elseif($this->forceAsyncCompression){ - $syncMode = false; - } + Timings::$playerNetworkSend->startTiming(); + try{ + $syncMode = null; //automatic + if($immediate){ + $syncMode = true; + }elseif($this->forceAsyncCompression){ + $syncMode = false; + } - $stream = new BinaryStream(); - self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); + $stream = new BinaryStream(); + self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); - if($this->enableCompression){ - $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); - }else{ - $promise = new CompressBatchPromise(); - $promise->resolve($stream->getBuffer()); + if($this->enableCompression){ + $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); + }else{ + $promise = new CompressBatchPromise(); + $promise->resolve($stream->getBuffer()); + } + $this->sendBuffer = []; + $this->queueCompressedNoBufferFlush($promise, $immediate); + }finally{ + Timings::$playerNetworkSend->stopTiming(); } - $this->sendBuffer = []; - $this->queueCompressedNoBufferFlush($promise, $immediate); } } @@ -549,35 +559,45 @@ class NetworkSession{ } public function queueCompressed(CompressBatchPromise $payload, bool $immediate = false) : void{ - $this->flushSendBuffer($immediate); //Maintain ordering if possible - $this->queueCompressedNoBufferFlush($payload, $immediate); + Timings::$playerNetworkSend->startTiming(); + try{ + $this->flushSendBuffer($immediate); //Maintain ordering if possible + $this->queueCompressedNoBufferFlush($payload, $immediate); + }finally{ + Timings::$playerNetworkSend->stopTiming(); + } } private function queueCompressedNoBufferFlush(CompressBatchPromise $payload, bool $immediate = false) : void{ - if($immediate){ - //Skips all queues - $this->sendEncoded($payload->getResult(), true); - }else{ - $this->compressedQueue->enqueue($payload); - $payload->onResolve(function(CompressBatchPromise $payload) : void{ - if($this->connected && $this->compressedQueue->bottom() === $payload){ - $this->compressedQueue->dequeue(); //result unused - $this->sendEncoded($payload->getResult()); + Timings::$playerNetworkSend->startTiming(); + try{ + if($immediate){ + //Skips all queues + $this->sendEncoded($payload->getResult(), true); + }else{ + $this->compressedQueue->enqueue($payload); + $payload->onResolve(function(CompressBatchPromise $payload) : void{ + if($this->connected && $this->compressedQueue->bottom() === $payload){ + $this->compressedQueue->dequeue(); //result unused + $this->sendEncoded($payload->getResult()); - while(!$this->compressedQueue->isEmpty()){ - /** @var CompressBatchPromise $current */ - $current = $this->compressedQueue->bottom(); - if($current->hasResult()){ - $this->compressedQueue->dequeue(); + while(!$this->compressedQueue->isEmpty()){ + /** @var CompressBatchPromise $current */ + $current = $this->compressedQueue->bottom(); + if($current->hasResult()){ + $this->compressedQueue->dequeue(); - $this->sendEncoded($current->getResult()); - }else{ - //can't send any more queued until this one is ready - break; + $this->sendEncoded($current->getResult()); + }else{ + //can't send any more queued until this one is ready + break; + } } } - } - }); + }); + } + }finally{ + Timings::$playerNetworkSend->stopTiming(); } } From 871bd169a882ee1ba3fac716456ee16ecaad0e01 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 17:58:12 +0000 Subject: [PATCH 0611/1858] Timings: remove unnecessary code --- src/timings/Timings.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 426e9ab611..7d3942d3cd 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -234,8 +234,7 @@ abstract class Timings{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ - $pkName = (new \ReflectionClass($pk))->getShortName(); - self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pkName . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive); + self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive); } return self::$packetReceiveTimingMap[$pid]; @@ -268,8 +267,7 @@ abstract class Timings{ public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ - $pkName = (new \ReflectionClass($pk))->getShortName(); - self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pkName . " [0x" . dechex($pid) . "]", self::$playerNetworkSend); + self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkSend); } return self::$packetSendTimingMap[$pid]; From 168af31fd7cd096fe42e606ce904f8f6780eb302 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 18:39:29 +0000 Subject: [PATCH 0612/1858] Bump phpstan/phpstan from 1.9.17 to 1.9.18 (#5585) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.17 to 1.9.18. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.17...1.9.18) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 159e007be9..9da2cb8bf8 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.17", + "phpstan/phpstan": "1.9.18", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 9bd452dca2..f82fd893be 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "56a1e8facd8fd7d56d6c7d2eb390e842", + "content-hash": "a6622fa16daeb7ba4d9a792579db468f", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.17", + "version": "1.9.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2" + "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2", - "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f2d5cf71be91172a57c649770b73c20ebcffb0bf", + "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.17" + "source": "https://github.com/phpstan/phpstan/tree/1.9.18" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-08T12:25:00+00:00" + "time": "2023-02-17T15:01:27+00:00" }, { "name": "phpstan/phpstan-phpunit", From 59a04c971fdd177e565fb2cb398626546a773e92 Mon Sep 17 00:00:00 2001 From: Armen Deroian Date: Tue, 21 Feb 2023 10:01:22 -0500 Subject: [PATCH 0613/1858] Getter and setter for gravity (#5584) closes #5525 --- src/entity/Entity.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index bdcd088a58..46e60feaa8 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -803,6 +803,15 @@ abstract class Entity{ $this->server->broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion())]); } + public function getGravity() : float{ + return $this->gravity; + } + + public function setGravity(float $gravity) : void{ + Utils::checkFloatNotInfOrNaN("gravity", $gravity); + $this->gravity = $gravity; + } + public function hasGravity() : bool{ return $this->gravityEnabled; } From 799739fe86194f81caf443eaf8f01887c7d66561 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:22:38 +0000 Subject: [PATCH 0614/1858] Updated build/php submodule to pmmp/PHP-Binaries@b2207cf70d3fc5b81f50a655aba4730fcf40a37c --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index fb297eb511..b2207cf70d 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit fb297eb511862ef3d4ca0aff5256a8caf5513cb4 +Subproject commit b2207cf70d3fc5b81f50a655aba4730fcf40a37c From 47e9ecd2578b8232f8f3f7f9b7a469fed46e8332 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:23:25 +0000 Subject: [PATCH 0615/1858] Release 4.15.1 --- changelogs/4.15.md | 8 ++++++++ src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/changelogs/4.15.md b/changelogs/4.15.md index b80115e88e..c8543a0f1d 100644 --- a/changelogs/4.15.md +++ b/changelogs/4.15.md @@ -12,3 +12,11 @@ Released 17th February 2023. ## General - Added support for Minecraft: Bedrock Edition 1.19.62. - Removed support for older versions. + +# 4.15.1 +Released 21st February 2023. + +## Fixes +- Fixed dropped items not despawning when in non-ticking chunks. +- Fixed dropped items not despawning if an infinite pickup delay is set. +- Fixed infinite despawn delay (never despawn) being ignored for dropped items. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a763bf0700..4f3f194906 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.15.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From b574d49d361d9f38a33df12bfc0f4812107a91e7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:23:25 +0000 Subject: [PATCH 0616/1858] 4.15.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4f3f194906..8f62b9718a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.15.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 2feb9ca9037ef0dd4b9bf8f4b905a5b22ed58661 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 16:12:44 +0000 Subject: [PATCH 0617/1858] ItemIdMetaUpgrader: consistency of API method naming --- src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php index 6a0ec3eedd..71ba2f47eb 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php @@ -45,11 +45,11 @@ final class ItemIdMetaUpgrader{ array $idMetaUpgradeSchemas, ){ foreach($idMetaUpgradeSchemas as $schema){ - $this->addIdMetaUpgradeSchema($schema); + $this->addSchema($schema); } } - public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ + public function addSchema(ItemIdMetaUpgradeSchema $schema) : void{ if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); } From 94ffef1a99fa1afdf80c8de5b9a380e67b333237 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 16:14:31 +0000 Subject: [PATCH 0618/1858] ItemIdMetaUpgrader: consistency of API method naming --- src/data/bedrock/item/upgrade/ItemDataUpgrader.php | 4 ++-- src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 07629043ee..46fce81cea 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -63,7 +63,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgrade($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? @@ -136,7 +136,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgrade($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php index 71ba2f47eb..8afd28f0e6 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php @@ -60,7 +60,7 @@ final class ItemIdMetaUpgrader{ /** * @phpstan-return array{string, int} */ - public function upgradeStringIdMeta(string $id, int $meta) : array{ + public function upgrade(string $id, int $meta) : array{ $newId = $id; $newMeta = $meta; foreach($this->idMetaUpgradeSchemas as $schema){ From 9a67fbf27abfc6c5aa45a7361b326096742d9132 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 16:44:27 +0000 Subject: [PATCH 0619/1858] Release 5.0.0-ALPHA9 --- changelogs/5.0-alpha.md | 129 +++++++++++++++++++++++++++++++++++++++- src/VersionInfo.php | 2 +- 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/changelogs/5.0-alpha.md b/changelogs/5.0-alpha.md index 7841114763..981bd37879 100644 --- a/changelogs/5.0-alpha.md +++ b/changelogs/5.0-alpha.md @@ -908,4 +908,131 @@ Released 23rd January 2023. - `Player->disconnect()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter, which is the message to be displayed on the disconnect screen (the message in `$reason` is used if null is passed) ## Internals -- `NetworkSession` disconnect methods have been altered to allow specifying a different disconnect reason and disconnection screen message. \ No newline at end of file +- `NetworkSession` disconnect methods have been altered to allow specifying a different disconnect reason and disconnection screen message. + +# 5.0.0-ALPHA9 +Released 21st February 2023. + +## Core +- Introduced timings for individual packet encoding. +- Network timings now cover more parts of the network system which weren't previously accounted for. + +## API +### `pocketmine\block` +- Blocks are no longer required to explicitly specify how many type or state data bits they require. This is now automatically calculated using `RuntimeDataSizeCalculator`. +- The following API methods have changed signatures: + - `Block->describeState()` now accepts `RuntimeDataDescriber` instead of `RuntimeDataReader|RuntimeDataWriter` + - `Block->describeType()` now accepts `RuntimeDataDescriber` instead of `RuntimeDataReader|RuntimeDataWriter` + - `Block->getRequiredStateDataBits()` is now `final`. + - `Block->getRequiredTypeDataBits()` is now `final`. + - `Leaves->__construct()` now `LeavesType $leavesType` instead of `TreeType $treeType` +- The following API methods have been added: + - `public Leaves->getLeavesType() : LeavesType` - returns the type of leaves +- The following classes have been added: + - `LeavesType` - an enum of all the different types of leaves +- The following classes have been renamed: + - `BlockFactory` -> `RuntimeBlockStateRegistry` - this more accurately describes the purpose of the class +- The following API methods have changed behaviour: + - `RuntimeBlockStateRegistry->register()` now throws a `LogicException` if a block does not properly reject invalid state data. + +### `pocketmine\command` +- `SimpleCommandMap` now requires all commands to have a permission set when registered. + - If you actually want to allow everyone to use your command (not advised), you can add a new permission to the `pocketmine.group.user` group, or use `default: true` for `plugin.yml` permissions. +- The following API methods have changed behaviour: + - `Command->testPermissionSilent()` now returns `false` if there are no permissions associated with the command. This is to prevent commands with no permissions being usable by everyone, which has previously been a source of security issues. +- The following API methods have been added: + - `public Command->getPermissions() : list` - returns a list of permissions which grant usage access to this command. A user with one or more of these permissions will be able to invoke the command's `execute()` method + - `public Command->setPermissions(list $permissions) : void` - sets the permissions which grant usage access to this command. This should be used instead of `setPermission()` with `;` separators (which is now deprecated) + +### `pocketmine\data\bedrock\block` +- The following API methods have been added: + - `public static BlockStateData::current(string $name, array $states) : BlockStateData` - creates a new `BlockStateData` instance with the current blockstate version + +### `pocketmine\data\bedrock\block\upgrade` +- Blockstate upgrade schemas are now indexed by schema ID instead of Minecraft version. This is because the Minecraft blockstate version isn't consistently bumped when changes are made. +- `BlockStateUpgrader` now requires that every schema added must have a unique schema ID. +- The following API methods have been removed: + - `BlockStateUpgradeSchema->getPriority()` +- The following API methods have been added: + - `public BlockStateUpgradeSchema->getSchemaId() : int` - returns the schema ID of this upgrade schema, usually the number at the start of the JSON filename +- The following API methods have changed signatures: + - `BlockStateUpgradeSchemaUtils::fromJsonModel()` now accepts `int $schemaId` instead of `int $priority` + - `BlockStateUpgradeSchemaUtils::loadSchemaFromString()` now accepts `int $schemaId` instead of `int $priority` + - `BlockStateUpgradeSchemaUtils::loadSchemas()` now accepts `int $maxSchemaId` instead of `int $currentVersion` + +### `pocketmine\data\bedrock\item\upgrade` +- The following API methods have changed signatures: + - `ItemUpgradeSchemaUtils::loadSchemas()` now accepts `int $maxSchemaId` +- The following API methods have been renamed: + - `ItemIdMetaUpgradeSchema->getPriority()` -> `ItemIdMetaUpgradeSchema->getSchemaId()` +- The following classes have been added: + - `ItemIdMetaUpgrader` - encapsulates handling for upgrading item string IDs and meta to newer versions +- The following API methods have been moved: + - `ItemDataUpgrader->addIdMetaUpgradeSchema()` -> `ItemIdMetaUpgrader->addSchema()` + - `ItemDataUpgrader->upgradeItemStringIdMeta()` -> `ItemIdMetaUpgrader->upgrade()` + +### `pocketmine\data\runtime` +- The following interfaces have been added: + - `RuntimeDataDescriber` - contract for symmetric APIs exposed by `RuntimeDataReader`, `RuntimeDataWriter` and `RuntimeDataSizeCalculator` + +### `pocketmine\event\player` +- `PlayerPreLoginEvent` now supports setting separate log reasons (disconnect reason) and disconnect screen messages. +- The following classes have inheritance changes: + - `PlayerPreLoginEvent` no longer implements `Cancellable`. This caused unexpected behaviour for most plugin devs due to default-ignoring cancelled events, forcing people to usually have to use `@handleCancelled` to handle the event when they wanted to use it. +- The following API methods have been added: + - `public PlayerPreLoginEvent->getDisconnectScreenMessage(int $flag) : Translatable|string|null` - returns the message to be displayed on the disconnect screen for the specified kick flag, if set + - `public PlayerPreLoginEvent->getFinalDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen, taking into account the kick flags set +- The following API constants have been renamed: + - `PlayerPreLoginEvent::KICK_REASON_BANNED` -> `PlayerPreLoginEvent::KICK_FLAG_BANNED` + - `PlayerPreLoginEvent::KICK_REASON_PLUGIN` -> `PlayerPreLoginEvent::KICK_FLAG_PLUGIN` + - `PlayerPreLoginEvent::KICK_REASON_PRIORITY` -> `PlayerPreLoginEvent::KICK_FLAG_PRIORITY` + - `PlayerPreLoginEvent::KICK_REASON_SERVER_FULL` -> `PlayerPreLoginEvent::KICK_FLAG_SERVER_FULL` + - `PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED` -> `PlayerPreLoginEvent::KICK_FLAG_SERVER_WHITELISTED` +- The following API methods have been renamed: + - `PlayerPreLoginEvent->clearAllKickReasons()` -> `PlayerPreLoginEvent->clearAllKickFlags()` + - `PlayerPreLoginEvent->clearKickReason()` -> `PlayerPreLoginEvent->clearKickFlag()` + - `PlayerPreLoginEvent->getFinalKickMessage()` -> `PlayerPreLoginEvent->getFinalDisconnectReason()` (now used for logs only, if a disconnect screen message is set for the highest priority flag) + - `PlayerPreLoginEvent->getKickMessage()` -> `PlayerPreLoginEvent->getDisconnectReason()` (now used for logs only, if a disconnect screen message is set for the flag) + - `PlayerPreLoginEvent->getKickReasons()` -> `PlayerPreLoginEvent->getKickFlags()` + - `PlayerPreLoginEvent->isKickReasonSet()` -> `PlayerPreLoginEvent->isKickFlagSet()` + - `PlayerPreLoginEvent->setKickReason()` -> `PlayerPreLoginEvent->setKickFlag()` +- The following API methods have changed signatures: + - `PlayerPreLoginEvent->setKickFlag()` (previously `setKickReason()`) now accepts `Translatable|string $disconnectReason, Translatable|string|null $disconnectScreenMessage = null` instead of `Translatable|string $message` + +### `pocketmine\event\block` +- The following classes have inheritance changes: + - `BlockPlaceEvent` no longer extends `BlockEvent`, and therefore no longer has `getBlock()`. +- The following API methods have been removed: + - `BlockPlaceEvent->getBlockReplaced()` - this information is now provided in the `BlockTransaction` object returned by `BlockPlaceEvent->getTransaction()` +- The following API methods have been added: + - `public BlockPlaceEvent->getTransaction() : BlockTransaction` - returns the transaction containing a list of changed block positions and the blockstates they will be changed to +- The following API methods have changed signatures: + - `BlockPlaceEvent->__construct()` now accepts `BlockTransaction $transaction` instead of `Block $blockPlace, Block $blockReplace` + +### `pocketmine\item` +- The following API methods have signature changes: + - `Item->describeType()` now accepts `RuntimeDataDescriber` instead of `RuntimeDataReader|RuntimeDataWriter` + +### `pocketmine\world\format` +- The following API methods have been renamed: + - `Chunk->getFullBlock()` -> `Chunk->getBlockStateId()` + - `Chunk->setFullBlock()` -> `Chunk->setBlockStateId()` + - `SubChunk->getFullBlock()` -> `SubChunk->getBlockStateId()` + - `SubChunk->setFullBlock()` -> `SubChunk->setBlockStateId()` + +## Gameplay +### Blocks +- The following new blocks have been added: + - Mangrove Leaves + - Azalea Leaves + - Flowering Azalea Leaves + - Reinforced Deepslate +- Fixed incorrect drops of deepslate when mined without a Silk Touch tool. +- Bells now ring when hit by a projectile. + +## Internals +- `build/generate-runtime-enum-serializers.php` now generates the following additional classes: + - `interface RuntimeEnumDescriber` + - `trait RuntimeEnumSizeCalculatorTrait` +- Block type/state data required bits are now calculated from `Block->describeType()` using `RuntimeDataSizeCalculator`. +- Commands now use an array for permissions internally, instead of a string separated by `;`. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 01b260f6f1..c3206271a0 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-ALPHA9"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 627c62a230f08fa21e4351ec157c597cb63fa2cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 16:44:31 +0000 Subject: [PATCH 0620/1858] 5.0.0-ALPHA10 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c3206271a0..51f9cca157 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA9"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-ALPHA10"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From efdd7a186d6858ee0dbdf895b3749cd35994052a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 18:31:33 +0000 Subject: [PATCH 0621/1858] World: fixed population timer sometimes not being stopped --- src/world/World.php | 94 +++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index ced320550c..cd134f577e 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -3118,59 +3118,63 @@ class World implements ChunkManager{ Timings::$population->startTiming(); - for($xx = -1; $xx <= 1; ++$xx){ - for($zz = -1; $zz <= 1; ++$zz){ - if($this->isChunkLocked($chunkX + $xx, $chunkZ + $zz)){ - //chunk is already in use by another generation request; queue the request for later - return $resolver?->getPromise() ?? $this->enqueuePopulationRequest($chunkX, $chunkZ, $associatedChunkLoader); + try{ + for($xx = -1; $xx <= 1; ++$xx){ + for($zz = -1; $zz <= 1; ++$zz){ + if($this->isChunkLocked($chunkX + $xx, $chunkZ + $zz)){ + //chunk is already in use by another generation request; queue the request for later + return $resolver?->getPromise() ?? $this->enqueuePopulationRequest($chunkX, $chunkZ, $associatedChunkLoader); + } } } - } - $this->activeChunkPopulationTasks[$chunkHash] = true; - if($resolver === null){ - $resolver = new PromiseResolver(); - $this->chunkPopulationRequestMap[$chunkHash] = $resolver; - } - - $chunkPopulationLockId = new ChunkLockId(); - - $temporaryChunkLoader = new class implements ChunkLoader{}; - for($xx = -1; $xx <= 1; ++$xx){ - for($zz = -1; $zz <= 1; ++$zz){ - $this->lockChunk($chunkX + $xx, $chunkZ + $zz, $chunkPopulationLockId); - $this->registerChunkLoader($temporaryChunkLoader, $chunkX + $xx, $chunkZ + $zz); + $this->activeChunkPopulationTasks[$chunkHash] = true; + if($resolver === null){ + $resolver = new PromiseResolver(); + $this->chunkPopulationRequestMap[$chunkHash] = $resolver; } - } - $centerChunk = $this->loadChunk($chunkX, $chunkZ); - $adjacentChunks = $this->getAdjacentChunks($chunkX, $chunkZ); - $task = new PopulationTask( - $this->worldId, - $chunkX, - $chunkZ, - $centerChunk, - $adjacentChunks, - function(Chunk $centerChunk, array $adjacentChunks) use ($chunkPopulationLockId, $chunkX, $chunkZ, $temporaryChunkLoader) : void{ - if(!$this->isLoaded()){ - return; + $chunkPopulationLockId = new ChunkLockId(); + + $temporaryChunkLoader = new class implements ChunkLoader{ + }; + for($xx = -1; $xx <= 1; ++$xx){ + for($zz = -1; $zz <= 1; ++$zz){ + $this->lockChunk($chunkX + $xx, $chunkZ + $zz, $chunkPopulationLockId); + $this->registerChunkLoader($temporaryChunkLoader, $chunkX + $xx, $chunkZ + $zz); } - - $this->generateChunkCallback($chunkPopulationLockId, $chunkX, $chunkZ, $centerChunk, $adjacentChunks, $temporaryChunkLoader); } - ); - $workerId = $this->workerPool->selectWorker(); - if(!isset($this->workerPool->getRunningWorkers()[$workerId]) && isset($this->generatorRegisteredWorkers[$workerId])){ - $this->logger->debug("Selected worker $workerId previously had generator registered, but is now offline"); - unset($this->generatorRegisteredWorkers[$workerId]); - } - if(!isset($this->generatorRegisteredWorkers[$workerId])){ - $this->registerGeneratorToWorker($workerId); - } - $this->workerPool->submitTaskToWorker($task, $workerId); - Timings::$population->stopTiming(); - return $resolver->getPromise(); + $centerChunk = $this->loadChunk($chunkX, $chunkZ); + $adjacentChunks = $this->getAdjacentChunks($chunkX, $chunkZ); + $task = new PopulationTask( + $this->worldId, + $chunkX, + $chunkZ, + $centerChunk, + $adjacentChunks, + function(Chunk $centerChunk, array $adjacentChunks) use ($chunkPopulationLockId, $chunkX, $chunkZ, $temporaryChunkLoader) : void{ + if(!$this->isLoaded()){ + return; + } + + $this->generateChunkCallback($chunkPopulationLockId, $chunkX, $chunkZ, $centerChunk, $adjacentChunks, $temporaryChunkLoader); + } + ); + $workerId = $this->workerPool->selectWorker(); + if(!isset($this->workerPool->getRunningWorkers()[$workerId]) && isset($this->generatorRegisteredWorkers[$workerId])){ + $this->logger->debug("Selected worker $workerId previously had generator registered, but is now offline"); + unset($this->generatorRegisteredWorkers[$workerId]); + } + if(!isset($this->generatorRegisteredWorkers[$workerId])){ + $this->registerGeneratorToWorker($workerId); + } + $this->workerPool->submitTaskToWorker($task, $workerId); + + return $resolver->getPromise(); + }finally{ + Timings::$population->stopTiming(); + } } /** From 6ec778d0afea099fffeb67396a2cb56836f6cb4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:47:54 +0000 Subject: [PATCH 0622/1858] Bump phpstan/phpstan from 1.9.18 to 1.10.1 (#5588) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.18 to 1.10.1. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.18...1.10.1) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 9da2cb8bf8..1cf94ba76d 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.18", + "phpstan/phpstan": "1.10.1", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index f82fd893be..98c5f889d9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a6622fa16daeb7ba4d9a792579db468f", + "content-hash": "8d3c9720715d57b86cfc5d8288ac197d", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.18", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf" + "reference": "1cd5fc530a8b68702f3733ad64294b2a39564198" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f2d5cf71be91172a57c649770b73c20ebcffb0bf", - "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1cd5fc530a8b68702f3733ad64294b2a39564198", + "reference": "1cd5fc530a8b68702f3733ad64294b2a39564198", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.18" + "source": "https://github.com/phpstan/phpstan/tree/1.10.1" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-17T15:01:27+00:00" + "time": "2023-02-21T21:57:23+00:00" }, { "name": "phpstan/phpstan-phpunit", From 6a64486f55e37cbd7a0ce092335441d111fa77e4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Feb 2023 21:51:49 +0000 Subject: [PATCH 0623/1858] StandardPacketBroadcaster: Improve performance when broadcasting small packets In refactors during PM4, I stripped out packet buffer caching, as it was problematic when events alter packets in undetectable ways. However, I never cleaned this part of the code up properly after enabling DataPacketSendEvent to include multiple packets and multiple targets, so we were still individually encoding the packet(s) for every single session if the sum total of the sizes was below 256 bytes. This change encodes packets once in the StandardPacketBroadcaster and retains their buffers to post to the session's send buffer directly if the resulting batch is below compression threshold. This code is still not optimal (see ##5589), but fixing this brings broadcasting performance back to PM3 levels, without any of PM3's problems. --- src/network/mcpe/NetworkSession.php | 37 +++++++------------ .../mcpe/StandardPacketBroadcaster.php | 28 +++++++++----- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 2b995ef8f5..8becf1260e 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -177,7 +177,7 @@ class NetworkSession{ private ?EncryptionContext $cipher = null; - /** @var ClientboundPacket[] */ + /** @var string[] */ private array $sendBuffer = []; /** @@ -264,23 +264,6 @@ class NetworkSession{ ); } - /** - * @param ClientboundPacket[] $packets - */ - public static function encodePacketBatchTimed(BinaryStream $stream, PacketSerializerContext $context, array $packets) : void{ - PacketBatch::encodeRaw($stream, array_map(function(ClientboundPacket $packet) use ($context) : string{ - $timings = Timings::getEncodeDataPacketTimings($packet); - $timings->startTiming(); - try{ - $stream = PacketSerializer::encoder($context); - $packet->encode($stream); - return $stream->getBuffer(); - }finally{ - $timings->stopTiming(); - } - }, $packets)); - } - private function onPlayerCreated(Player $player) : void{ if(!$this->isConnected()){ //the remote player might have disconnected before spawn terrain generation was finished @@ -498,7 +481,7 @@ class NetworkSession{ return false; } - $this->addToSendBuffer($packet); + $this->addToSendBuffer(self::encodePacketTimed(PacketSerializer::encoder($this->packetSerializerContext), $packet)); if($immediate){ $this->flushSendBuffer(true); } @@ -512,16 +495,24 @@ class NetworkSession{ /** * @internal */ - public function addToSendBuffer(ClientboundPacket $packet) : void{ - $timings = Timings::getSendDataPacketTimings($packet); + public static function encodePacketTimed(PacketSerializer $serializer, ClientboundPacket $packet) : string{ + $timings = Timings::getEncodeDataPacketTimings($packet); $timings->startTiming(); try{ - $this->sendBuffer[] = $packet; + $packet->encode($serializer); + return $serializer->getBuffer(); }finally{ $timings->stopTiming(); } } + /** + * @internal + */ + public function addToSendBuffer(string $buffer) : void{ + $this->sendBuffer[] = $buffer; + } + private function flushSendBuffer(bool $immediate = false) : void{ if(count($this->sendBuffer) > 0){ Timings::$playerNetworkSend->startTiming(); @@ -534,7 +525,7 @@ class NetworkSession{ } $stream = new BinaryStream(); - self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); + PacketBatch::encodeRaw($stream, $this->sendBuffer); if($this->enableCompression){ $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 73848ccae1..c52b8f93d8 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -23,25 +23,35 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\Server; use pocketmine\utils\BinaryStream; +use function array_map; use function spl_object_id; final class StandardPacketBroadcaster implements PacketBroadcaster{ public function __construct(private Server $server){} public function broadcastPackets(array $recipients, array $packets) : void{ - $buffers = []; + $batchBuffers = []; + + /** @var string[][] $packetBuffers */ + $packetBuffers = []; $compressors = []; + /** @var NetworkSession[][][] $targetMap */ $targetMap = []; foreach($recipients as $recipient){ $serializerContext = $recipient->getPacketSerializerContext(); $bufferId = spl_object_id($serializerContext); - if(!isset($buffers[$bufferId])){ + if(!isset($batchBuffers[$bufferId])){ + $packetBuffers[$bufferId] = array_map(function(ClientboundPacket $packet) use ($serializerContext) : string{ + return NetworkSession::encodePacketTimed(PacketSerializer::encoder($serializerContext), $packet); + }, $packets); $stream = new BinaryStream(); - NetworkSession::encodePacketBatchTimed($stream, $serializerContext, $packets); - $buffers[$bufferId] = $stream->getBuffer(); + PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); + $batchBuffers[$bufferId] = $stream->getBuffer(); } //TODO: different compressors might be compatible, it might not be necessary to split them up by object @@ -52,17 +62,17 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ } foreach($targetMap as $bufferId => $compressorMap){ - $buffer = $buffers[$bufferId]; + $batchBuffer = $batchBuffers[$bufferId]; foreach($compressorMap as $compressorId => $compressorTargets){ $compressor = $compressors[$compressorId]; - if(!$compressor->willCompress($buffer)){ + if(!$compressor->willCompress($batchBuffer)){ foreach($compressorTargets as $target){ - foreach($packets as $pk){ - $target->addToSendBuffer($pk); + foreach($packetBuffers[$bufferId] as $packetBuffer){ + $target->addToSendBuffer($packetBuffer); } } }else{ - $promise = $this->server->prepareBatch(new PacketBatch($buffer), $compressor); + $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor); foreach($compressorTargets as $target){ $target->queueCompressed($promise); } From 8234360c8d4b54aca3fff531d02fa4bbf7017af2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Feb 2023 22:43:10 +0000 Subject: [PATCH 0624/1858] Avoid creating batch buffers just to determine whether a batch should be globally compressed Instead, sum together the lengths of encoded packet buffers and use that to decide whether to build the buffer or not. --- src/Server.php | 3 ++ .../mcpe/StandardPacketBroadcaster.php | 46 +++++++++++++------ .../mcpe/compression/ThresholdCompressor.php | 31 +++++++++++++ .../mcpe/compression/ZlibCompressor.php | 10 ++-- 4 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 src/network/mcpe/compression/ThresholdCompressor.php diff --git a/src/Server.php b/src/Server.php index 0fc467bef3..116e6f39e0 100644 --- a/src/Server.php +++ b/src/Server.php @@ -891,6 +891,9 @@ class Server{ if($this->configGroup->getPropertyInt("network.batch-threshold", 256) >= 0){ $netCompressionThreshold = $this->configGroup->getPropertyInt("network.batch-threshold", 256); } + if($netCompressionThreshold < 0){ + $netCompressionThreshold = null; + } $netCompressionLevel = $this->configGroup->getPropertyInt("network.compression-level", 6); if($netCompressionLevel < 1 || $netCompressionLevel > 9){ diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index c52b8f93d8..04b3253f54 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -23,21 +23,19 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use pocketmine\network\mcpe\protocol\ClientboundPacket; +use pocketmine\network\mcpe\compression\ThresholdCompressor; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\Server; use pocketmine\utils\BinaryStream; -use function array_map; use function spl_object_id; +use function strlen; final class StandardPacketBroadcaster implements PacketBroadcaster{ public function __construct(private Server $server){} public function broadcastPackets(array $recipients, array $packets) : void{ - $batchBuffers = []; - - /** @var string[][] $packetBuffers */ + $packetBufferTotalLengths = []; $packetBuffers = []; $compressors = []; /** @var NetworkSession[][][] $targetMap */ @@ -45,13 +43,14 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ foreach($recipients as $recipient){ $serializerContext = $recipient->getPacketSerializerContext(); $bufferId = spl_object_id($serializerContext); - if(!isset($batchBuffers[$bufferId])){ - $packetBuffers[$bufferId] = array_map(function(ClientboundPacket $packet) use ($serializerContext) : string{ - return NetworkSession::encodePacketTimed(PacketSerializer::encoder($serializerContext), $packet); - }, $packets); - $stream = new BinaryStream(); - PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); - $batchBuffers[$bufferId] = $stream->getBuffer(); + if(!isset($packetBuffers[$bufferId])){ + $packetBufferTotalLengths[$bufferId] = 0; + $packetBuffers[$bufferId] = []; + foreach($packets as $packet){ + $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder($serializerContext), $packet); + $packetBufferTotalLengths[$bufferId] += strlen($buffer); + $packetBuffers[$bufferId][] = $buffer; + } } //TODO: different compressors might be compatible, it might not be necessary to split them up by object @@ -62,10 +61,29 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ } foreach($targetMap as $bufferId => $compressorMap){ - $batchBuffer = $batchBuffers[$bufferId]; foreach($compressorMap as $compressorId => $compressorTargets){ $compressor = $compressors[$compressorId]; - if(!$compressor->willCompress($batchBuffer)){ + + $batchBuffer = null; + if($compressor instanceof ThresholdCompressor){ + $threshold = $compressor->getCompressionThreshold(); + if($threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ + //do not prepare shared batch unless we're sure it will be compressed + $stream = new BinaryStream(); + PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); + $batchBuffer = $stream->getBuffer(); + } + }else{ + //this is a legacy compressor, so we have to encode the batch and check if it will compress + $stream = new BinaryStream(); + PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); + $tempBatchBuffer = $stream->getBuffer(); + if($compressor->willCompress($tempBatchBuffer)){ + $batchBuffer = $tempBatchBuffer; + } + } + + if($batchBuffer === null){ foreach($compressorTargets as $target){ foreach($packetBuffers[$bufferId] as $packetBuffer){ $target->addToSendBuffer($packetBuffer); diff --git a/src/network/mcpe/compression/ThresholdCompressor.php b/src/network/mcpe/compression/ThresholdCompressor.php new file mode 100644 index 0000000000..4c3c0ad55a --- /dev/null +++ b/src/network/mcpe/compression/ThresholdCompressor.php @@ -0,0 +1,31 @@ +minCompressionSize; + } + public function willCompress(string $data) : bool{ - return $this->minCompressionSize > -1 && strlen($data) >= $this->minCompressionSize; + return $this->minCompressionSize !== null && strlen($data) >= $this->minCompressionSize; } /** From 9acb4d64dbf641601ac7085a41fdec78cb8f94c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Feb 2023 21:45:12 +0000 Subject: [PATCH 0625/1858] Added generated constants for available BedrockData files this makes it easier to detect unused files, detect removed files, and also avoid typos in usages. --- .github/workflows/main.yml | 3 + build/generate-bedrockdata-path-consts.php | 128 ++++++++++++++++++ src/data/bedrock/BedrockDataFiles.php | 54 ++++++++ .../bedrock/LegacyBiomeIdToStringIdMap.php | 3 +- .../bedrock/LegacyEntityIdToStringIdMap.php | 3 +- src/network/mcpe/cache/StaticPacketCache.php | 6 +- .../mcpe/convert/GlobalItemTypeDictionary.php | 4 +- src/network/mcpe/convert/ItemTranslator.php | 4 +- .../mcpe/convert/RuntimeBlockMapping.php | 6 +- 9 files changed, 197 insertions(+), 14 deletions(-) create mode 100644 build/generate-bedrockdata-path-consts.php create mode 100644 src/data/bedrock/BedrockDataFiles.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ad9fc56ec8..029676a3f0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -186,6 +186,9 @@ jobs: - name: Regenerate KnownTranslation APIs run: php build/generate-known-translation-apis.php + - name: Regenerate BedrockData available files constants + run: php build/generate-bedrockdata-path-consts.php + - name: Verify code is unchanged run: | git diff diff --git a/build/generate-bedrockdata-path-consts.php b/build/generate-bedrockdata-path-consts.php new file mode 100644 index 0000000000..31e23c9b6f --- /dev/null +++ b/build/generate-bedrockdata-path-consts.php @@ -0,0 +1,128 @@ + $fileName){ + fwrite($output, "\tpublic const " . constantify($fileName) . " = BEDROCK_DATA_PATH . '/$fileName';\n"); +} + +fwrite($output, "}\n"); +fclose($output); + +echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/data/bedrock/BedrockDataFiles.php b/src/data/bedrock/BedrockDataFiles.php new file mode 100644 index 0000000000..731c91120b --- /dev/null +++ b/src/data/bedrock/BedrockDataFiles.php @@ -0,0 +1,54 @@ + Date: Thu, 23 Feb 2023 21:52:17 +0000 Subject: [PATCH 0626/1858] Use BedrockData 2.0.0 --- composer.json | 2 +- composer.lock | 14 +++++++------- src/data/bedrock/BedrockDataFiles.php | 4 ---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index cef3836d04..7e2f99bbe0 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", "pocketmine/bedrock-block-upgrade-schema": "^1.0.0", - "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", + "pocketmine/bedrock-data": "~2.0.0+bedrock-1.19.60", "pocketmine/bedrock-item-upgrade-schema": "^1.0.0", "pocketmine/bedrock-protocol": "~19.3.0+bedrock-1.19.62", "pocketmine/binaryutils": "^0.2.1", diff --git a/composer.lock b/composer.lock index 55fe67b56d..4ac53fdd4e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "402f78d672d4e0bd8f092272bf7d82d7", + "content-hash": "751296f0dc345e8e74017e65b1a36ba3", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "1.14.0+bedrock-1.19.60", + "version": "2.0.0+bedrock-1.19.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "7b06234ec6e1f4fb06ad4b2f177e606c25df9b46" + "reference": "957e49b2381641af29f595e4f32ded3e76ce4723" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/7b06234ec6e1f4fb06ad4b2f177e606c25df9b46", - "reference": "7b06234ec6e1f4fb06ad4b2f177e606c25df9b46", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/957e49b2381641af29f595e4f32ded3e76ce4723", + "reference": "957e49b2381641af29f595e4f32ded3e76ce4723", "shasum": "" }, "type": "library", @@ -296,9 +296,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.60" + "source": "https://github.com/pmmp/BedrockData/tree/2.0.0+bedrock-1.19.60" }, - "time": "2023-02-08T18:32:01+00:00" + "time": "2023-02-23T21:25:04+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", diff --git a/src/data/bedrock/BedrockDataFiles.php b/src/data/bedrock/BedrockDataFiles.php index 731c91120b..2c9350ca3b 100644 --- a/src/data/bedrock/BedrockDataFiles.php +++ b/src/data/bedrock/BedrockDataFiles.php @@ -34,7 +34,6 @@ final class BedrockDataFiles{ public const BIOME_DEFINITIONS_NBT = BEDROCK_DATA_PATH . '/biome_definitions.nbt'; public const BIOME_DEFINITIONS_FULL_NBT = BEDROCK_DATA_PATH . '/biome_definitions_full.nbt'; public const BIOME_ID_MAP_JSON = BEDROCK_DATA_PATH . '/biome_id_map.json'; - public const BLOCK_ID_MAP_JSON = BEDROCK_DATA_PATH . '/block_id_map.json'; public const BLOCK_ID_TO_ITEM_ID_MAP_JSON = BEDROCK_DATA_PATH . '/block_id_to_item_id_map.json'; public const BLOCK_STATE_META_MAP_JSON = BEDROCK_DATA_PATH . '/block_state_meta_map.json'; public const CANONICAL_BLOCK_STATES_NBT = BEDROCK_DATA_PATH . '/canonical_block_states.nbt'; @@ -42,13 +41,10 @@ final class BedrockDataFiles{ public const CREATIVEITEMS_JSON = BEDROCK_DATA_PATH . '/creativeitems.json'; public const ENTITY_ID_MAP_JSON = BEDROCK_DATA_PATH . '/entity_id_map.json'; public const ENTITY_IDENTIFIERS_NBT = BEDROCK_DATA_PATH . '/entity_identifiers.nbt'; - public const ITEM_ID_MAP_JSON = BEDROCK_DATA_PATH . '/item_id_map.json'; public const ITEM_TAGS_JSON = BEDROCK_DATA_PATH . '/item_tags.json'; public const LEVEL_SOUND_ID_MAP_JSON = BEDROCK_DATA_PATH . '/level_sound_id_map.json'; public const PARTICLE_ID_MAP_JSON = BEDROCK_DATA_PATH . '/particle_id_map.json'; - public const R12_BLOCK_STATES_JSON = BEDROCK_DATA_PATH . '/r12_block_states.json'; public const R12_TO_CURRENT_BLOCK_MAP_BIN = BEDROCK_DATA_PATH . '/r12_to_current_block_map.bin'; public const R16_TO_CURRENT_ITEM_MAP_JSON = BEDROCK_DATA_PATH . '/r16_to_current_item_map.json'; - public const RECIPES_JSON = BEDROCK_DATA_PATH . '/recipes.json'; public const REQUIRED_ITEM_LIST_JSON = BEDROCK_DATA_PATH . '/required_item_list.json'; } From f44946cb491c39652c7c36aebbc657d81c7fe568 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Feb 2023 22:00:24 +0000 Subject: [PATCH 0627/1858] ... --- build/generate-bedrockdata-path-consts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/generate-bedrockdata-path-consts.php b/build/generate-bedrockdata-path-consts.php index 31e23c9b6f..6ad6d83fd8 100644 --- a/build/generate-bedrockdata-path-consts.php +++ b/build/generate-bedrockdata-path-consts.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\build\generate_bedrockdata_path_consts; -use Webmozart\PathUtil\Path; +use Symfony\Component\Filesystem\Path; use function dirname; use function fclose; use function fopen; From 7608d5f04e347f9548d2040aa624867571848125 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 23 Feb 2023 22:03:35 +0000 Subject: [PATCH 0628/1858] Use BedrockDataFiles in more places --- src/data/bedrock/ItemTagToIdMap.php | 4 +--- src/data/bedrock/item/BlockItemIdMap.php | 5 ++--- src/inventory/CreativeInventory.php | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/data/bedrock/ItemTagToIdMap.php b/src/data/bedrock/ItemTagToIdMap.php index 9190fa28be..84f2ff451f 100644 --- a/src/data/bedrock/ItemTagToIdMap.php +++ b/src/data/bedrock/ItemTagToIdMap.php @@ -27,14 +27,12 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; -use Symfony\Component\Filesystem\Path; use function array_keys; use function gettype; use function is_array; use function is_string; use function json_decode; use const JSON_THROW_ON_ERROR; -use const pocketmine\BEDROCK_DATA_PATH; /** * Tracks Minecraft Bedrock item tags, and the item IDs which belong to them @@ -45,7 +43,7 @@ final class ItemTagToIdMap{ use SingletonTrait; private static function make() : self{ - $map = json_decode(Filesystem::fileGetContents(Path::join(BEDROCK_DATA_PATH, 'item_tags.json')), true, flags: JSON_THROW_ON_ERROR); + $map = json_decode(Filesystem::fileGetContents(BedrockDataFiles::ITEM_TAGS_JSON), true, flags: JSON_THROW_ON_ERROR); if(!is_array($map)){ throw new AssumptionFailedError("Invalid item tag map, expected array"); } diff --git a/src/data/bedrock/item/BlockItemIdMap.php b/src/data/bedrock/item/BlockItemIdMap.php index 58a155a5a7..6a993f60d5 100644 --- a/src/data/bedrock/item/BlockItemIdMap.php +++ b/src/data/bedrock/item/BlockItemIdMap.php @@ -23,15 +23,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; +use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; -use Symfony\Component\Filesystem\Path; use function array_flip; use function is_array; use function json_decode; use const JSON_THROW_ON_ERROR; -use const pocketmine\BEDROCK_DATA_PATH; /** * Bidirectional map of block IDs to their corresponding blockitem IDs, used for storing items on disk @@ -41,7 +40,7 @@ final class BlockItemIdMap{ private static function make() : self{ $map = json_decode( - Filesystem::fileGetContents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), + Filesystem::fileGetContents(BedrockDataFiles::BLOCK_ID_TO_ITEM_ID_MAP_JSON), associative: true, flags: JSON_THROW_ON_ERROR ); diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index ea5893f87b..76cfd874a8 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -25,9 +25,9 @@ namespace pocketmine\inventory; use pocketmine\crafting\CraftingManagerFromDataHelper; use pocketmine\crafting\json\ItemStackData; +use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\item\Item; use pocketmine\utils\SingletonTrait; -use Symfony\Component\Filesystem\Path; final class CreativeInventory{ use SingletonTrait; @@ -37,7 +37,7 @@ final class CreativeInventory{ private function __construct(){ $creativeItems = CraftingManagerFromDataHelper::loadJsonArrayOfObjectsFile( - Path::join(\pocketmine\BEDROCK_DATA_PATH, "creativeitems.json"), + BedrockDataFiles::CREATIVEITEMS_JSON, ItemStackData::class ); foreach($creativeItems as $data){ From ae50b952f1fcd82100eb6acacba8d7dd568928df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Feb 2023 22:15:58 +0000 Subject: [PATCH 0629/1858] Accept 1.19.63 (same protocol, different protocol version) --- src/network/mcpe/handler/LoginPacketHandler.php | 16 ---------------- .../mcpe/handler/SessionStartPacketHandler.php | 5 ++++- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index c2367454b0..cbeff15987 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -64,18 +64,6 @@ class LoginPacketHandler extends PacketHandler{ ){} public function handleLogin(LoginPacket $packet) : bool{ - if(!$this->isCompatibleProtocol($packet->protocol)){ - $this->session->sendDataPacket(PlayStatusPacket::create($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true); - - //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) - $this->session->disconnect( - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $packet->protocol)), - false - ); - - return true; - } - $extraData = $this->fetchAuthData($packet->chainDataJwt); if(!Player::isValidUserName($extraData->displayName)){ @@ -237,8 +225,4 @@ class LoginPacketHandler extends PacketHandler{ $this->server->getAsyncPool()->submitTask(new ProcessLoginTask($packet->chainDataJwt->chain, $packet->clientDataJwt, $authRequired, $this->authCallback)); $this->session->setHandler(null); //drop packets received during login verification } - - protected function isCompatibleProtocol(int $protocolVersion) : bool{ - return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL; - } } diff --git a/src/network/mcpe/handler/SessionStartPacketHandler.php b/src/network/mcpe/handler/SessionStartPacketHandler.php index 687422de20..5625869f1c 100644 --- a/src/network/mcpe/handler/SessionStartPacketHandler.php +++ b/src/network/mcpe/handler/SessionStartPacketHandler.php @@ -71,6 +71,9 @@ final class SessionStartPacketHandler extends PacketHandler{ } protected function isCompatibleProtocol(int $protocolVersion) : bool{ - return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL; + //TODO: REMOVE THIS + //1.19.63 released with an unchanged protocol, but a bumped protocol version, since they forgot to do it in the + //previous release. Since they are functionally identical, we can accept both. + return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL || $protocolVersion === 568; } } From 308cdb68631f1e4190d3741231e1219e80080e90 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Feb 2023 22:18:34 +0000 Subject: [PATCH 0630/1858] Release 4.15.2 --- changelogs/4.15.md | 9 +++++++++ src/VersionInfo.php | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelogs/4.15.md b/changelogs/4.15.md index c8543a0f1d..b4a1f5dc41 100644 --- a/changelogs/4.15.md +++ b/changelogs/4.15.md @@ -20,3 +20,12 @@ Released 21st February 2023. - Fixed dropped items not despawning when in non-ticking chunks. - Fixed dropped items not despawning if an infinite pickup delay is set. - Fixed infinite despawn delay (never despawn) being ignored for dropped items. + +# 4.15.2 +Released 24th February 2023. + +## General +- Accept Minecraft: Bedrock Edition 1.19.63 (identical protocol to 1.19.62, but different version due to Mojang mixup). + +## Fixes +- Fixed `World Population` timer sometimes not being stopped, causing strange results in timings reports. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8f62b9718a..54fa9dda4d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.15.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From d92173cdedf641820fb53cb2ac799b5889d18308 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Feb 2023 22:18:34 +0000 Subject: [PATCH 0631/1858] 4.15.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 54fa9dda4d..b54f8eed1b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.15.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From e7209679fb26e7d9382e3a4bcc5cf03e98e29fc8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Feb 2023 22:23:00 +0000 Subject: [PATCH 0632/1858] ... --- src/network/mcpe/handler/LoginPacketHandler.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index cbeff15987..5185eb7079 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -34,7 +34,6 @@ use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\LoginPacket; use pocketmine\network\mcpe\protocol\PlayStatusPacket; -use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\types\login\AuthenticationData; use pocketmine\network\mcpe\protocol\types\login\ClientData; use pocketmine\network\mcpe\protocol\types\login\ClientDataToSkinDataHelper; From 8f024cb3824cf645b0301004c9be97538e55e51a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:04:34 +0000 Subject: [PATCH 0633/1858] Bump docker/build-push-action from 3.3.0 to 4.0.0 (#5545) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.3.0 to 4.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3.3.0...v4.0.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 99e0fb5524..a209fd688a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -46,7 +46,7 @@ jobs: run: echo ::set-output name=NAME::$(echo "${GITHUB_REPOSITORY,,}") - name: Build image for tag - uses: docker/build-push-action@v3.3.0 + uses: docker/build-push-action@v4.0.0 with: push: true context: ./pocketmine-mp @@ -59,7 +59,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v3.3.0 + uses: docker/build-push-action@v4.0.0 with: push: true context: ./pocketmine-mp @@ -72,7 +72,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v3.3.0 + uses: docker/build-push-action@v4.0.0 with: push: true context: ./pocketmine-mp @@ -85,7 +85,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v3.3.0 + uses: docker/build-push-action@v4.0.0 with: push: true context: ./pocketmine-mp From 17afd38274e17ae83f2713094800a9d053a59d49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:36:33 +0000 Subject: [PATCH 0634/1858] Bump phpstan/phpstan from 1.10.1 to 1.10.3 (#5593) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.1 to 1.10.3. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.1...1.10.3) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 1cf94ba76d..2f24b36604 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.1", + "phpstan/phpstan": "1.10.3", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 98c5f889d9..69beba8a3a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8d3c9720715d57b86cfc5d8288ac197d", + "content-hash": "b08764ff79ef4e00a5f7a7b08145c5de", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.1", + "version": "1.10.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "1cd5fc530a8b68702f3733ad64294b2a39564198" + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1cd5fc530a8b68702f3733ad64294b2a39564198", - "reference": "1cd5fc530a8b68702f3733ad64294b2a39564198", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5419375b5891add97dc74be71e6c1c34baaddf64", + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.1" + "source": "https://github.com/phpstan/phpstan/tree/1.10.3" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-21T21:57:23+00:00" + "time": "2023-02-25T14:47:13+00:00" }, { "name": "phpstan/phpstan-phpunit", From a6cf39b94edfb66184e693e3b83c4f8119668260 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Feb 2023 20:39:01 +0000 Subject: [PATCH 0635/1858] Update composer dependencies --- composer.lock | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/composer.lock b/composer.lock index 69beba8a3a..f473a301d5 100644 --- a/composer.lock +++ b/composer.lock @@ -1891,21 +1891,21 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.4", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "d77af96c1aaec28f7c0293677132eaaad079e01b" + "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d77af96c1aaec28f7c0293677132eaaad079e01b", - "reference": "d77af96c1aaec28f7c0293677132eaaad079e01b", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", + "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.3" + "phpstan/phpstan": "^1.10" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -1937,31 +1937,32 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.4" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.8" }, - "time": "2023-02-09T08:05:29+00:00" + "time": "2023-02-25T15:14:31+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.4.5", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d" + "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d", - "reference": "361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b7dd96a5503919a43b3cd06a2dced9d4252492f2", + "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.7" + "phpstan/phpstan": "^1.10" }, "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -1985,29 +1986,29 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.4.5" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.0" }, - "time": "2023-01-11T14:16:29+00:00" + "time": "2023-02-21T10:17:10+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.24", + "version": "9.2.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" + "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954", + "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -2056,7 +2057,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25" }, "funding": [ { @@ -2064,7 +2065,7 @@ "type": "github" } ], - "time": "2023-01-26T08:26:55+00:00" + "time": "2023-02-25T05:32:00+00:00" }, { "name": "phpunit/php-file-iterator", From 369e0855a7e3607dde956710d2ebbf9d5bffc689 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Feb 2023 19:17:46 +0000 Subject: [PATCH 0636/1858] Update composer dependencies --- composer.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/composer.lock b/composer.lock index f473a301d5..bf596305b8 100644 --- a/composer.lock +++ b/composer.lock @@ -1034,16 +1034,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" + "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", + "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", "shasum": "" }, "require": { @@ -1078,7 +1078,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.19" + "source": "https://github.com/symfony/filesystem/tree/v5.4.21" }, "funding": [ { @@ -1094,7 +1094,7 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1891,16 +1891,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.8", + "version": "1.3.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5" + "reference": "34ee324a2b8fcab680fbb3f3f3d6c86389df35ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", - "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/34ee324a2b8fcab680fbb3f3f3d6c86389df35ba", + "reference": "34ee324a2b8fcab680fbb3f3f3d6c86389df35ba", "shasum": "" }, "require": { @@ -1937,9 +1937,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.8" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.9" }, - "time": "2023-02-25T15:14:31+00:00" + "time": "2023-02-28T13:04:23+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -2310,16 +2310,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.3", + "version": "9.6.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" + "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d", + "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d", "shasum": "" }, "require": { @@ -2392,7 +2392,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4" }, "funding": [ { @@ -2408,7 +2408,7 @@ "type": "tidelift" } ], - "time": "2023-02-04T13:37:15+00:00" + "time": "2023-02-27T13:06:37+00:00" }, { "name": "sebastian/cli-parser", From 948aa059c37fdfcdc63ef7e61ae0e1fe10c88e02 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 15:09:52 +0000 Subject: [PATCH 0637/1858] =?UTF-8?q?=C3=82Command:=20fixed=20inconsistent?= =?UTF-8?q?=20API=20method=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/command/Command.php | 2 +- src/command/SimpleCommandMap.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/command/Command.php b/src/command/Command.php index e17e7de87d..02bae60d9e 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -86,7 +86,7 @@ abstract class Command{ /** * @return string[] */ - public function getPermission() : array{ + public function getPermissions() : array{ return $this->permission; } diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 525ecd3176..1268e715b7 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -139,7 +139,7 @@ class SimpleCommandMap implements CommandMap{ } public function register(string $fallbackPrefix, Command $command, ?string $label = null) : bool{ - if(count($command->getPermission()) === 0){ + if(count($command->getPermissions()) === 0){ throw new \InvalidArgumentException("Commands must have a permission set"); } From 77fe0a69ba363f85734e604c6cf1bee5a4abb0d4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 15:10:46 +0000 Subject: [PATCH 0638/1858] ItemIdentifier: remove dead TODO comment --- src/item/ItemIdentifier.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index 5ddf652bd2..e0d0d28ba9 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -33,9 +33,6 @@ class ItemIdentifier{ public static function fromBlock(Block $block) : self{ //negative item type IDs are treated as block IDs //TODO: maybe an ItemBlockIdentifier is in order? - //TODO: this isn't vanilla-compliant, but it'll do for now - we only use the "legacy" item ID/meta for full type - //indexing right now, because item type IDs aren't granular enough - //this should be removed once that's addressed return new self(-$block->getTypeId()); } From 33140482bb66242c6ae6dc6e89fc0b61ea1ed930 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 15:28:50 +0000 Subject: [PATCH 0639/1858] ItemTypeIds: added fromBlockTypeId() and toBlockTypeId() this allows checking the type of a blockitem without being required to create a block to do it. --- src/block/WaterCauldron.php | 3 +-- src/block/inventory/ShulkerBoxInventory.php | 10 ++++------ src/item/ItemIdentifier.php | 3 +-- src/item/ItemTypeIds.php | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index 88327a0101..fddccf43bc 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -31,7 +31,6 @@ use pocketmine\item\Armor; use pocketmine\item\Banner; use pocketmine\item\Dye; use pocketmine\item\Item; -use pocketmine\item\ItemBlock; use pocketmine\item\ItemTypeIds; use pocketmine\item\Potion; use pocketmine\item\PotionType; @@ -155,7 +154,7 @@ final class WaterCauldron extends FillableCauldron{ $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_BANNER_USE_AMOUNT)); $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); } - }elseif($item instanceof ItemBlock && $item->getBlock()->getTypeId() === BlockTypeIds::DYED_SHULKER_BOX){ + }elseif(ItemTypeIds::toBlockTypeId($item->getTypeId()) === BlockTypeIds::DYED_SHULKER_BOX){ if($this->customWaterColor === null){ $newItem = VanillaBlocks::SHULKER_BOX()->asItem(); $newItem->setNamedTag($item->getNamedTag()); diff --git a/src/block/inventory/ShulkerBoxInventory.php b/src/block/inventory/ShulkerBoxInventory.php index 102e0b648c..d915a99518 100644 --- a/src/block/inventory/ShulkerBoxInventory.php +++ b/src/block/inventory/ShulkerBoxInventory.php @@ -26,7 +26,7 @@ namespace pocketmine\block\inventory; use pocketmine\block\BlockTypeIds; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; -use pocketmine\item\ItemBlock; +use pocketmine\item\ItemTypeIds; use pocketmine\network\mcpe\protocol\BlockEventPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\world\Position; @@ -51,11 +51,9 @@ class ShulkerBoxInventory extends SimpleInventory implements BlockInventory{ } public function canAddItem(Item $item) : bool{ - if($item instanceof ItemBlock){ - $blockTypeId = $item->getBlock()->getTypeId(); - if($blockTypeId === BlockTypeIds::SHULKER_BOX || $blockTypeId === BlockTypeIds::DYED_SHULKER_BOX){ - return false; - } + $blockTypeId = ItemTypeIds::toBlockTypeId($item->getTypeId()); + if($blockTypeId === BlockTypeIds::SHULKER_BOX || $blockTypeId === BlockTypeIds::DYED_SHULKER_BOX){ + return false; } return parent::canAddItem($item); } diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index e0d0d28ba9..8be4d7d56b 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -31,9 +31,8 @@ class ItemIdentifier{ ){} public static function fromBlock(Block $block) : self{ - //negative item type IDs are treated as block IDs //TODO: maybe an ItemBlockIdentifier is in order? - return new self(-$block->getTypeId()); + return new self(ItemTypeIds::fromBlockTypeId($block->getTypeId())); } public function getTypeId() : int{ return $this->typeId; } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index b7eea80556..1808425555 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -311,4 +311,19 @@ final class ItemTypeIds{ public static function newId() : int{ return self::$nextDynamicId++; } + + public static function fromBlockTypeId(int $blockTypeId) : int{ + if($blockTypeId < 0){ + throw new \InvalidArgumentException("Block type IDs cannot be negative"); + } + //negative item type IDs are treated as block IDs + return -$blockTypeId; + } + + public static function toBlockTypeId(int $itemTypeId) : int{ + if($itemTypeId > 0){ + throw new \InvalidArgumentException("Item type ID $itemTypeId does not represent a block"); + } + return -$itemTypeId; + } } From f64dc01bd1c14ff3f79bd6c18d0c337dbc0e87e0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 15:50:18 +0000 Subject: [PATCH 0640/1858] ItemBlock: drop the charade about overriding built-in block types this allows cleaning up a whole lot of abusable mess from the API, and we never properly supported overriding built-in block types anyway. --- src/block/Anvil.php | 4 +-- src/block/Bamboo.php | 2 +- src/block/BambooSapling.php | 2 +- src/block/Barrel.php | 2 +- src/block/Bed.php | 2 +- src/block/Bedrock.php | 2 +- src/block/Bell.php | 2 +- src/block/Block.php | 4 +-- src/block/BrewingStand.php | 2 +- src/block/Button.php | 2 +- src/block/Cactus.php | 2 +- src/block/Cake.php | 2 +- src/block/Candle.php | 2 +- src/block/ChorusFlower.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/Crops.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/DetectorRail.php | 2 +- src/block/Dirt.php | 2 +- src/block/Door.php | 2 +- src/block/DoublePlant.php | 2 +- src/block/EndPortalFrame.php | 2 +- src/block/Farmland.php | 2 +- src/block/FenceGate.php | 2 +- src/block/FillableCauldron.php | 2 +- src/block/Fire.php | 2 +- src/block/FloorCoralFan.php | 2 +- src/block/Froglight.php | 2 +- src/block/FrostedIce.php | 2 +- src/block/Furnace.php | 2 +- src/block/Hopper.php | 2 +- src/block/ItemFrame.php | 2 +- src/block/Lantern.php | 2 +- src/block/Leaves.php | 2 +- src/block/Lectern.php | 2 +- src/block/Lever.php | 2 +- src/block/Light.php | 2 +- src/block/Liquid.php | 2 +- src/block/NetherPortal.php | 2 +- src/block/NetherWartPlant.php | 2 +- src/block/Rail.php | 2 +- src/block/RedMushroomBlock.php | 2 +- src/block/RedstoneComparator.php | 2 +- src/block/RedstoneLamp.php | 2 +- src/block/RedstoneOre.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/RedstoneTorch.php | 2 +- src/block/RuntimeBlockStateRegistry.php | 28 --------------- src/block/Sapling.php | 2 +- src/block/SeaPickle.php | 2 +- src/block/ShulkerBox.php | 2 +- src/block/SimplePressurePlate.php | 2 +- src/block/Skull.php | 4 +-- src/block/Slab.php | 2 +- src/block/SnowLayer.php | 2 +- src/block/Sponge.php | 2 +- src/block/Stair.php | 2 +- src/block/StraightOnlyRail.php | 2 +- src/block/Sugarcane.php | 2 +- src/block/SweetBerryBush.php | 2 +- src/block/TNT.php | 4 +-- src/block/Torch.php | 2 +- src/block/Trapdoor.php | 2 +- src/block/Tripwire.php | 2 +- src/block/TripwireHook.php | 2 +- src/block/UnknownBlock.php | 2 +- src/block/Vine.php | 2 +- src/block/Wall.php | 2 +- src/block/WallCoralFan.php | 2 +- src/block/Wood.php | 2 +- .../AnalogRedstoneSignalEmitterTrait.php | 2 +- src/block/utils/AnyFacingTrait.php | 2 +- src/block/utils/CandleTrait.php | 2 +- src/block/utils/ColoredTrait.php | 2 +- src/block/utils/CopperTrait.php | 2 +- src/block/utils/CoralTypeTrait.php | 2 +- src/block/utils/HorizontalFacingTrait.php | 2 +- src/block/utils/PillarRotationTrait.php | 2 +- .../utils/RailPoweredByRedstoneTrait.php | 2 +- src/block/utils/SignLikeRotationTrait.php | 2 +- src/item/ItemBlock.php | 36 +++++-------------- tests/phpunit/block/BlockTest.php | 13 ++----- 82 files changed, 94 insertions(+), 149 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 17814e2c90..270004973d 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,11 +51,11 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index a6a08859be..d766cdc2e3 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -55,7 +55,7 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); $w->bool($this->ready); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index cfa81519bd..53db4b54bd 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ private bool $ready = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 68eda53319..e9218db567 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -38,7 +38,7 @@ class Barrel extends Opaque{ protected bool $open = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->open); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 678c8a5429..4b42627966 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -53,7 +53,7 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); $w->bool($this->head); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 4bca833056..7d8ed647fd 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Bedrock extends Opaque{ private bool $burnsForever = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index f20a031c2e..6792dc1a4d 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -48,7 +48,7 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); $w->horizontalFacing($this->facing); } diff --git a/src/block/Block.php b/src/block/Block.php index 6863f47bcd..34b3272959 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -214,11 +214,11 @@ class Block{ return $writer->getValue(); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ //NOOP } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ //NOOP } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 479d207393..8c3d29ba1d 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -43,7 +43,7 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->brewingStandSlots($this->slots); } diff --git a/src/block/Button.php b/src/block/Button.php index aa6ca8fa0b..4573f03a4f 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -38,7 +38,7 @@ abstract class Button extends Flowable{ protected bool $pressed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->pressed); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 18dd726e77..66b8734dde 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -41,7 +41,7 @@ class Cactus extends Transparent{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 93e51be218..4266ece687 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -36,7 +36,7 @@ class Cake extends BaseCake{ protected int $bites = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } diff --git a/src/block/Candle.php b/src/block/Candle.php index 4870277cc2..4982ae1890 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -46,7 +46,7 @@ class Candle extends Transparent{ private int $count = self::MIN_COUNT; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 2aa65d1f66..9236be47ab 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -49,7 +49,7 @@ final class ChorusFlower extends Flowable{ private int $age = self::MIN_AGE; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index fe4f1736bd..bfa0778dcb 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -46,7 +46,7 @@ class CocoaBlock extends Transparent{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Crops.php b/src/block/Crops.php index c1c13bee97..de9d3f2db5 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -38,7 +38,7 @@ abstract class Crops extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 2a55500c66..cb296e8097 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -41,7 +41,7 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); $w->bool($this->inverted); } diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 8af12276b9..10f371c660 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->activated); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 900879433e..33f3800d7d 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -45,7 +45,7 @@ class Dirt extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Door.php b/src/block/Door.php index 98a8f53090..13188ffa37 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -41,7 +41,7 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->hingeRight); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index be231c1eaa..4b74cf7019 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -33,7 +33,7 @@ use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ protected bool $top = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 5a6537d4d7..89e700ca26 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -35,7 +35,7 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->eye); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 7ce08c2d99..bd2ff2f858 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -37,7 +37,7 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 7ad96d8421..6bc86853b1 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -42,7 +42,7 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->open); $w->bool($this->inWall); diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index b6d9b995e5..5f92eed57d 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -37,7 +37,7 @@ abstract class FillableCauldron extends Transparent{ private int $fillLevel = self::MIN_FILL_LEVEL; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } diff --git a/src/block/Fire.php b/src/block/Fire.php index 6f43322617..e1d4633224 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -39,7 +39,7 @@ class Fire extends BaseFire{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 173c87a08f..ff484fb78f 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -37,7 +37,7 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index 13b68e21ed..dcd14c900a 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -35,7 +35,7 @@ final class Froglight extends SimplePillar{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 5953ce8ae4..b2d2750a33 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -32,7 +32,7 @@ class FrostedIce extends Ice{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index f830a38355..f6cbe6bcf1 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -46,7 +46,7 @@ class Furnace extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->lit); } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 778e5c2a17..42ccb14c77 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,7 +39,7 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 94754910f3..63016a390a 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -50,7 +50,7 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->hasMap); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index a5d8031dd4..a8fbddd371 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -43,7 +43,7 @@ class Lantern extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index b83de2dde3..886946425d 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -47,7 +47,7 @@ class Leaves extends Transparent{ $this->leavesType = $leavesType; } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->noDecay); $w->bool($this->checkDecay); } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index ae1df8549c..0b4f3f6223 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -46,7 +46,7 @@ class Lectern extends Transparent{ protected bool $producingSignal = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->producingSignal); } diff --git a/src/block/Lever.php b/src/block/Lever.php index 284a646d9a..8894028152 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -44,7 +44,7 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); } diff --git a/src/block/Light.php b/src/block/Light.php index 5ee7281c9f..963c003854 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -34,7 +34,7 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 476a8f8c71..7126e44661 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -48,7 +48,7 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); $w->bool($this->still); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 0c507a166f..dcad2a1990 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -34,7 +34,7 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 787b1f5f86..afdf406cf0 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -37,7 +37,7 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 12b47e6ea1..2a0f4059df 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -34,7 +34,7 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->railShape($this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 17fced4129..ab5d89fe91 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -36,7 +36,7 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->mushroomBlockType($this->mushroomBlockType); } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 0f8fee840e..c7a2917e49 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -44,7 +44,7 @@ class RedstoneComparator extends Flowable{ protected bool $isSubtractMode = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->isSubtractMode); $w->bool($this->powered); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 1d0ff73451..2a4d517d68 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -29,7 +29,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 13cf84205f..d0d0268373 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -33,7 +33,7 @@ use function mt_rand; class RedstoneOre extends Opaque{ protected bool $lit = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index d1ad17eeb6..6b93626596 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -43,7 +43,7 @@ class RedstoneRepeater extends Flowable{ protected int $delay = self::MIN_DELAY; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->bool($this->powered); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index f85c6c07a2..fa1331eebb 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ protected bool $lit = true; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->lit); } diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index ae6386e33c..a62e907367 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -151,18 +151,6 @@ class RuntimeBlockStateRegistry{ } } - /** - * @internal - * Returns the default state of the block type associated with the given type ID. - */ - public function fromTypeId(int $typeId) : Block{ - if(isset($this->typeIndex[$typeId])){ - return clone $this->typeIndex[$typeId]; - } - - throw new \InvalidArgumentException("Block ID $typeId is not registered"); - } - public function fromStateId(int $stateId) : Block{ if($stateId < 0){ throw new \InvalidArgumentException("Block state ID cannot be negative"); @@ -178,22 +166,6 @@ class RuntimeBlockStateRegistry{ return $block; } - /** - * Returns whether a specified block state is already registered in the block factory. - */ - public function isRegistered(int $typeId) : bool{ - $b = $this->typeIndex[$typeId] ?? null; - return $b !== null && !($b instanceof UnknownBlock); - } - - /** - * @return Block[] - * @phpstan-return array - */ - public function getAllKnownTypes() : array{ - return $this->typeIndex; - } - /** * @return Block[] */ diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 838a32ce8c..9a973c9272 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -46,7 +46,7 @@ class Sapling extends Flowable{ $this->treeType = $treeType; } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index c2955cbaa3..d643f841c6 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -38,7 +38,7 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index e979b09e52..88ba6e7b80 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -34,7 +34,7 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index f4ad37ea44..050654e76f 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 10403ab6b0..74daa831fb 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -49,11 +49,11 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Slab.php b/src/block/Slab.php index 4e25d15a4a..95a07e1b02 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -41,7 +41,7 @@ class Slab extends Transparent{ $this->slabType = SlabType::BOTTOM(); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->slabType($this->slabType); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index ec08620c08..a2528e02c6 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -46,7 +46,7 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index b4e523ffa3..5b283d18b2 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index 971dbc43af..8e299c0352 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -46,7 +46,7 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->upsideDown); } diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index fe3d19b25e..63e43a52e6 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -36,7 +36,7 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->straightOnlyRailShape($this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index cc41c0fb0e..716c205b16 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -38,7 +38,7 @@ class Sugarcane extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index c9e9232e72..0ba065ce63 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -45,7 +45,7 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index 7012f7145b..d35473e11b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -45,11 +45,11 @@ class TNT extends Opaque{ protected bool $unstable = false; //TODO: Usage unclear, seems to be a weird hack in vanilla protected bool $worksUnderwater = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index b7bc5136f3..1b659891f6 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -36,7 +36,7 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 79e3f0e8f9..898722f5b7 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -40,7 +40,7 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->open); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index b8b3e732d4..732b356760 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -33,7 +33,7 @@ class Tripwire extends Flowable{ protected bool $connected = false; protected bool $disarmed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->triggered); $w->bool($this->suspended); $w->bool($this->connected); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 2ad6057b8f..c135041237 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -38,7 +38,7 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->connected); $w->bool($this->powered); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 7c48b236fa..4523fd7ec3 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -38,7 +38,7 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); diff --git a/src/block/Vine.php b/src/block/Vine.php index 53d4b1efe1..a0309d840a 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -39,7 +39,7 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacingFlags($this->faces); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 8b128c525f..0bad315e93 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -42,7 +42,7 @@ class Wall extends Transparent{ protected array $connections = []; protected bool $post = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->wallConnections($this->connections); $w->bool($this->post); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index c7e350c473..5928f7842f 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index 9a0c36e1d6..3fbae40dad 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -38,7 +38,7 @@ class Wood extends Opaque{ private bool $stripped = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 783517dcd0..e3c4c94426 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 78fdd9bf9e..25618d9dca 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -29,7 +29,7 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 60dd618490..867cf15da7 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -39,7 +39,7 @@ use pocketmine\world\sound\FlintSteelSound; trait CandleTrait{ private bool $lit = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 42abe64b95..b9a14bee12 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -31,7 +31,7 @@ trait ColoredTrait{ private $color; /** @see Block::describeType() */ - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index ed230c6bad..11c0178f9e 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -44,7 +44,7 @@ trait CopperTrait{ parent::__construct($identifier, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index d2c96c8f4a..4607831c85 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -31,7 +31,7 @@ trait CoralTypeTrait{ protected bool $dead = false; /** @see Block::describeType() */ - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); $w->bool($this->dead); } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index b1558b154a..624250e116 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -30,7 +30,7 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 0fc206a203..fccd53676f 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -35,7 +35,7 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->axis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index a95fea253e..d4e9af665f 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->powered); } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 2fed259106..38ab84cb73 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -30,7 +30,7 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + public function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->rotation); } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index a7e14b5ce8..16c4badf32 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\RuntimeBlockStateRegistry; -use pocketmine\block\VanillaBlocks; use pocketmine\data\runtime\RuntimeDataDescriber; /** @@ -35,47 +33,29 @@ use pocketmine\data\runtime\RuntimeDataDescriber; * just place wheat crops when used on the ground). */ final class ItemBlock extends Item{ - private int $blockTypeId; - private int $blockTypeData; - - private int $fuelTime; - private bool $fireProof; - private int $maxStackSize; - - public function __construct(Block $block){ + public function __construct( + private Block $block + ){ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); - $this->blockTypeId = $block->getTypeId(); - $this->blockTypeData = $block->computeTypeData(); - - $this->fuelTime = $block->getFuelTime(); - $this->fireProof = $block->isFireProofAsItem(); - $this->maxStackSize = $block->getMaxStackSize(); } protected function describeType(RuntimeDataDescriber $w) : void{ - $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); + $this->block->describeType($w); } public function getBlock(?int $clickedFace = null) : Block{ - //TODO: HACKY MESS, CLEAN IT UP - $factory = RuntimeBlockStateRegistry::getInstance(); - if(!$factory->isRegistered($this->blockTypeId)){ - return VanillaBlocks::AIR(); - } - $blockType = $factory->fromTypeId($this->blockTypeId); - $blockType->decodeTypeData($this->blockTypeData); - return $blockType; + return clone $this->block; } public function getFuelTime() : int{ - return $this->fuelTime; + return $this->block->getFuelTime(); } public function isFireProof() : bool{ - return $this->fireProof; + return $this->block->isFireProofAsItem(); } public function getMaxStackSize() : int{ - return $this->maxStackSize; + return $this->block->getMaxStackSize(); } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 3f6dbac952..cfcdf47b2c 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -62,16 +62,9 @@ class BlockTest extends TestCase{ * Test registering a new block which does not yet exist */ public function testRegisterNewBlock() : void{ - for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ - if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); - $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); - return; - } - } - - throw new \RuntimeException("Can't test registering new blocks because no unused spaces left"); + $b = new StrangeNewBlock(new BlockIdentifier(BlockTypeIds::newId()), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); + $this->blockFactory->register($b); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); } /** From 7c974a12e119dc376328dd96a044986ccea106ff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 15:51:55 +0000 Subject: [PATCH 0641/1858] Revert "ItemBlock: drop the charade about overriding built-in block types" This reverts commit f64dc01bd1c14ff3f79bd6c18d0c337dbc0e87e0. I forgot that the ItemBlock constructor implicitly strips off any states of the origin block, which is something that we unfortunately can't do any other way right now, since the blocks don't remember their default states. --- src/block/Anvil.php | 4 +-- src/block/Bamboo.php | 2 +- src/block/BambooSapling.php | 2 +- src/block/Barrel.php | 2 +- src/block/Bed.php | 2 +- src/block/Bedrock.php | 2 +- src/block/Bell.php | 2 +- src/block/Block.php | 4 +-- src/block/BrewingStand.php | 2 +- src/block/Button.php | 2 +- src/block/Cactus.php | 2 +- src/block/Cake.php | 2 +- src/block/Candle.php | 2 +- src/block/ChorusFlower.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/Crops.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/DetectorRail.php | 2 +- src/block/Dirt.php | 2 +- src/block/Door.php | 2 +- src/block/DoublePlant.php | 2 +- src/block/EndPortalFrame.php | 2 +- src/block/Farmland.php | 2 +- src/block/FenceGate.php | 2 +- src/block/FillableCauldron.php | 2 +- src/block/Fire.php | 2 +- src/block/FloorCoralFan.php | 2 +- src/block/Froglight.php | 2 +- src/block/FrostedIce.php | 2 +- src/block/Furnace.php | 2 +- src/block/Hopper.php | 2 +- src/block/ItemFrame.php | 2 +- src/block/Lantern.php | 2 +- src/block/Leaves.php | 2 +- src/block/Lectern.php | 2 +- src/block/Lever.php | 2 +- src/block/Light.php | 2 +- src/block/Liquid.php | 2 +- src/block/NetherPortal.php | 2 +- src/block/NetherWartPlant.php | 2 +- src/block/Rail.php | 2 +- src/block/RedMushroomBlock.php | 2 +- src/block/RedstoneComparator.php | 2 +- src/block/RedstoneLamp.php | 2 +- src/block/RedstoneOre.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/RedstoneTorch.php | 2 +- src/block/RuntimeBlockStateRegistry.php | 28 +++++++++++++++ src/block/Sapling.php | 2 +- src/block/SeaPickle.php | 2 +- src/block/ShulkerBox.php | 2 +- src/block/SimplePressurePlate.php | 2 +- src/block/Skull.php | 4 +-- src/block/Slab.php | 2 +- src/block/SnowLayer.php | 2 +- src/block/Sponge.php | 2 +- src/block/Stair.php | 2 +- src/block/StraightOnlyRail.php | 2 +- src/block/Sugarcane.php | 2 +- src/block/SweetBerryBush.php | 2 +- src/block/TNT.php | 4 +-- src/block/Torch.php | 2 +- src/block/Trapdoor.php | 2 +- src/block/Tripwire.php | 2 +- src/block/TripwireHook.php | 2 +- src/block/UnknownBlock.php | 2 +- src/block/Vine.php | 2 +- src/block/Wall.php | 2 +- src/block/WallCoralFan.php | 2 +- src/block/Wood.php | 2 +- .../AnalogRedstoneSignalEmitterTrait.php | 2 +- src/block/utils/AnyFacingTrait.php | 2 +- src/block/utils/CandleTrait.php | 2 +- src/block/utils/ColoredTrait.php | 2 +- src/block/utils/CopperTrait.php | 2 +- src/block/utils/CoralTypeTrait.php | 2 +- src/block/utils/HorizontalFacingTrait.php | 2 +- src/block/utils/PillarRotationTrait.php | 2 +- .../utils/RailPoweredByRedstoneTrait.php | 2 +- src/block/utils/SignLikeRotationTrait.php | 2 +- src/item/ItemBlock.php | 36 ++++++++++++++----- tests/phpunit/block/BlockTest.php | 13 +++++-- 82 files changed, 149 insertions(+), 94 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 270004973d..17814e2c90 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,11 +51,11 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index d766cdc2e3..a6a08859be 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -55,7 +55,7 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); $w->bool($this->ready); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 53db4b54bd..cfa81519bd 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ private bool $ready = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index e9218db567..68eda53319 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -38,7 +38,7 @@ class Barrel extends Opaque{ protected bool $open = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->open); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 4b42627966..678c8a5429 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -53,7 +53,7 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); $w->bool($this->head); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 7d8ed647fd..4bca833056 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Bedrock extends Opaque{ private bool $burnsForever = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index 6792dc1a4d..f20a031c2e 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -48,7 +48,7 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); $w->horizontalFacing($this->facing); } diff --git a/src/block/Block.php b/src/block/Block.php index 34b3272959..6863f47bcd 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -214,11 +214,11 @@ class Block{ return $writer->getValue(); } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //NOOP } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 8c3d29ba1d..479d207393 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -43,7 +43,7 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->brewingStandSlots($this->slots); } diff --git a/src/block/Button.php b/src/block/Button.php index 4573f03a4f..aa6ca8fa0b 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -38,7 +38,7 @@ abstract class Button extends Flowable{ protected bool $pressed = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->pressed); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 66b8734dde..18dd726e77 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -41,7 +41,7 @@ class Cactus extends Transparent{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 4266ece687..93e51be218 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -36,7 +36,7 @@ class Cake extends BaseCake{ protected int $bites = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } diff --git a/src/block/Candle.php b/src/block/Candle.php index 4982ae1890..4870277cc2 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -46,7 +46,7 @@ class Candle extends Transparent{ private int $count = self::MIN_COUNT; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 9236be47ab..2aa65d1f66 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -49,7 +49,7 @@ final class ChorusFlower extends Flowable{ private int $age = self::MIN_AGE; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index bfa0778dcb..fe4f1736bd 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -46,7 +46,7 @@ class CocoaBlock extends Transparent{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Crops.php b/src/block/Crops.php index de9d3f2db5..c1c13bee97 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -38,7 +38,7 @@ abstract class Crops extends Flowable{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index cb296e8097..2a55500c66 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -41,7 +41,7 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); $w->bool($this->inverted); } diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 10f371c660..8af12276b9 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->activated); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 33f3800d7d..900879433e 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -45,7 +45,7 @@ class Dirt extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Door.php b/src/block/Door.php index 13188ffa37..98a8f53090 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -41,7 +41,7 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->hingeRight); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 4b74cf7019..be231c1eaa 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -33,7 +33,7 @@ use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ protected bool $top = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 89e700ca26..5a6537d4d7 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -35,7 +35,7 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->eye); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index bd2ff2f858..7ce08c2d99 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -37,7 +37,7 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 6bc86853b1..7ad96d8421 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -42,7 +42,7 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->open); $w->bool($this->inWall); diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index 5f92eed57d..b6d9b995e5 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -37,7 +37,7 @@ abstract class FillableCauldron extends Transparent{ private int $fillLevel = self::MIN_FILL_LEVEL; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } diff --git a/src/block/Fire.php b/src/block/Fire.php index e1d4633224..6f43322617 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -39,7 +39,7 @@ class Fire extends BaseFire{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index ff484fb78f..173c87a08f 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -37,7 +37,7 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index dcd14c900a..13b68e21ed 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -35,7 +35,7 @@ final class Froglight extends SimplePillar{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index b2d2750a33..5953ce8ae4 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -32,7 +32,7 @@ class FrostedIce extends Ice{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index f6cbe6bcf1..f830a38355 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -46,7 +46,7 @@ class Furnace extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->lit); } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 42ccb14c77..778e5c2a17 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,7 +39,7 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 63016a390a..94754910f3 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -50,7 +50,7 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->hasMap); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index a8fbddd371..a5d8031dd4 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -43,7 +43,7 @@ class Lantern extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 886946425d..b83de2dde3 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -47,7 +47,7 @@ class Leaves extends Transparent{ $this->leavesType = $leavesType; } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->noDecay); $w->bool($this->checkDecay); } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index 0b4f3f6223..ae1df8549c 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -46,7 +46,7 @@ class Lectern extends Transparent{ protected bool $producingSignal = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->producingSignal); } diff --git a/src/block/Lever.php b/src/block/Lever.php index 8894028152..284a646d9a 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -44,7 +44,7 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); } diff --git a/src/block/Light.php b/src/block/Light.php index 963c003854..5ee7281c9f 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -34,7 +34,7 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 7126e44661..476a8f8c71 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -48,7 +48,7 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); $w->bool($this->still); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index dcad2a1990..0c507a166f 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -34,7 +34,7 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index afdf406cf0..787b1f5f86 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -37,7 +37,7 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 2a0f4059df..12b47e6ea1 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -34,7 +34,7 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->railShape($this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index ab5d89fe91..17fced4129 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -36,7 +36,7 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->mushroomBlockType($this->mushroomBlockType); } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index c7a2917e49..0f8fee840e 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -44,7 +44,7 @@ class RedstoneComparator extends Flowable{ protected bool $isSubtractMode = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->isSubtractMode); $w->bool($this->powered); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 2a4d517d68..1d0ff73451 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -29,7 +29,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index d0d0268373..13cf84205f 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -33,7 +33,7 @@ use function mt_rand; class RedstoneOre extends Opaque{ protected bool $lit = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 6b93626596..d1ad17eeb6 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -43,7 +43,7 @@ class RedstoneRepeater extends Flowable{ protected int $delay = self::MIN_DELAY; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->bool($this->powered); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index fa1331eebb..f85c6c07a2 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ protected bool $lit = true; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->lit); } diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index a62e907367..ae6386e33c 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -151,6 +151,18 @@ class RuntimeBlockStateRegistry{ } } + /** + * @internal + * Returns the default state of the block type associated with the given type ID. + */ + public function fromTypeId(int $typeId) : Block{ + if(isset($this->typeIndex[$typeId])){ + return clone $this->typeIndex[$typeId]; + } + + throw new \InvalidArgumentException("Block ID $typeId is not registered"); + } + public function fromStateId(int $stateId) : Block{ if($stateId < 0){ throw new \InvalidArgumentException("Block state ID cannot be negative"); @@ -166,6 +178,22 @@ class RuntimeBlockStateRegistry{ return $block; } + /** + * Returns whether a specified block state is already registered in the block factory. + */ + public function isRegistered(int $typeId) : bool{ + $b = $this->typeIndex[$typeId] ?? null; + return $b !== null && !($b instanceof UnknownBlock); + } + + /** + * @return Block[] + * @phpstan-return array + */ + public function getAllKnownTypes() : array{ + return $this->typeIndex; + } + /** * @return Block[] */ diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 9a973c9272..838a32ce8c 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -46,7 +46,7 @@ class Sapling extends Flowable{ $this->treeType = $treeType; } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index d643f841c6..c2955cbaa3 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -38,7 +38,7 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 88ba6e7b80..e979b09e52 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -34,7 +34,7 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index 050654e76f..f4ad37ea44 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 74daa831fb..10403ab6b0 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -49,11 +49,11 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Slab.php b/src/block/Slab.php index 95a07e1b02..4e25d15a4a 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -41,7 +41,7 @@ class Slab extends Transparent{ $this->slabType = SlabType::BOTTOM(); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->slabType($this->slabType); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index a2528e02c6..ec08620c08 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -46,7 +46,7 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index 5b283d18b2..b4e523ffa3 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index 8e299c0352..971dbc43af 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -46,7 +46,7 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->upsideDown); } diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 63e43a52e6..fe3d19b25e 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -36,7 +36,7 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->straightOnlyRailShape($this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 716c205b16..cc41c0fb0e 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -38,7 +38,7 @@ class Sugarcane extends Flowable{ protected int $age = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 0ba065ce63..c9e9232e72 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -45,7 +45,7 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index d35473e11b..7012f7145b 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -45,11 +45,11 @@ 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 describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index 1b659891f6..b7bc5136f3 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -36,7 +36,7 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 898722f5b7..79e3f0e8f9 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -40,7 +40,7 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->open); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 732b356760..b8b3e732d4 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -33,7 +33,7 @@ class Tripwire extends Flowable{ protected bool $connected = false; protected bool $disarmed = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->triggered); $w->bool($this->suspended); $w->bool($this->connected); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index c135041237..2ad6057b8f 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -38,7 +38,7 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->connected); $w->bool($this->powered); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 4523fd7ec3..7c48b236fa 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -38,7 +38,7 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); diff --git a/src/block/Vine.php b/src/block/Vine.php index a0309d840a..53d4b1efe1 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -39,7 +39,7 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacingFlags($this->faces); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 0bad315e93..8b128c525f 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -42,7 +42,7 @@ class Wall extends Transparent{ protected array $connections = []; protected bool $post = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->wallConnections($this->connections); $w->bool($this->post); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 5928f7842f..c7e350c473 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index 3fbae40dad..9a0c36e1d6 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -38,7 +38,7 @@ class Wood extends Opaque{ private bool $stripped = false; - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index e3c4c94426..783517dcd0 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 25618d9dca..78fdd9bf9e 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -29,7 +29,7 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 867cf15da7..60dd618490 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -39,7 +39,7 @@ use pocketmine\world\sound\FlintSteelSound; trait CandleTrait{ private bool $lit = false; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index b9a14bee12..42abe64b95 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -31,7 +31,7 @@ trait ColoredTrait{ private $color; /** @see Block::describeType() */ - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 11c0178f9e..ed230c6bad 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -44,7 +44,7 @@ trait CopperTrait{ parent::__construct($identifier, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 4607831c85..d2c96c8f4a 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -31,7 +31,7 @@ trait CoralTypeTrait{ protected bool $dead = false; /** @see Block::describeType() */ - public function describeType(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); $w->bool($this->dead); } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index 624250e116..b1558b154a 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -30,7 +30,7 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index fccd53676f..0fc206a203 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -35,7 +35,7 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->axis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index d4e9af665f..a95fea253e 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ parent::describeState($w); $w->bool($this->powered); } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 38ab84cb73..2fed259106 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -30,7 +30,7 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->rotation); } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 16c4badf32..a7e14b5ce8 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; +use pocketmine\block\RuntimeBlockStateRegistry; +use pocketmine\block\VanillaBlocks; use pocketmine\data\runtime\RuntimeDataDescriber; /** @@ -33,29 +35,47 @@ use pocketmine\data\runtime\RuntimeDataDescriber; * just place wheat crops when used on the ground). */ final class ItemBlock extends Item{ - public function __construct( - private Block $block - ){ + private int $blockTypeId; + private int $blockTypeData; + + private int $fuelTime; + private bool $fireProof; + private int $maxStackSize; + + public function __construct(Block $block){ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); + $this->blockTypeId = $block->getTypeId(); + $this->blockTypeData = $block->computeTypeData(); + + $this->fuelTime = $block->getFuelTime(); + $this->fireProof = $block->isFireProofAsItem(); + $this->maxStackSize = $block->getMaxStackSize(); } protected function describeType(RuntimeDataDescriber $w) : void{ - $this->block->describeType($w); + $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); } public function getBlock(?int $clickedFace = null) : Block{ - return clone $this->block; + //TODO: HACKY MESS, CLEAN IT UP + $factory = RuntimeBlockStateRegistry::getInstance(); + if(!$factory->isRegistered($this->blockTypeId)){ + return VanillaBlocks::AIR(); + } + $blockType = $factory->fromTypeId($this->blockTypeId); + $blockType->decodeTypeData($this->blockTypeData); + return $blockType; } public function getFuelTime() : int{ - return $this->block->getFuelTime(); + return $this->fuelTime; } public function isFireProof() : bool{ - return $this->block->isFireProofAsItem(); + return $this->fireProof; } public function getMaxStackSize() : int{ - return $this->block->getMaxStackSize(); + return $this->maxStackSize; } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index cfcdf47b2c..3f6dbac952 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -62,9 +62,16 @@ class BlockTest extends TestCase{ * Test registering a new block which does not yet exist */ public function testRegisterNewBlock() : void{ - $b = new StrangeNewBlock(new BlockIdentifier(BlockTypeIds::newId()), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); - $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); + for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ + if(!$this->blockFactory->isRegistered($i)){ + $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); + $this->blockFactory->register($b); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); + return; + } + } + + throw new \RuntimeException("Can't test registering new blocks because no unused spaces left"); } /** From cbb58d3e0d0ba8d78e13482217a52ff44baa1d1a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 16:23:40 +0000 Subject: [PATCH 0642/1858] Block: reduce method placement chaos --- src/block/Block.php | 83 +++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 6863f47bcd..d0edd01a7b 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -105,6 +105,15 @@ class Block{ return $this->fallbackName; } + + /** + * Returns a type ID that identifies this type of block. This does not include information like facing, open/closed, + * powered/unpowered, etc. + */ + public function getTypeId() : int{ + return $this->idInfo->getBlockTypeId(); + } + /** * @internal * @@ -117,6 +126,39 @@ class Block{ return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeStateData(); } + /** + * Returns whether the given block has an equivalent type to this one. This compares the type IDs. + */ + public function isSameType(Block $other) : bool{ + return $this->getTypeId() === $other->getTypeId(); + } + + /** + * Returns whether the given block has the same type and properties as this block. + */ + public function isSameState(Block $other) : bool{ + return $this->getStateId() === $other->getStateId(); + } + + /** + * @return string[] + */ + public function getTypeTags() : array{ + return $this->typeInfo->getTypeTags(); + } + + /** + * Returns whether this block type has the given type tag. Type tags are used as a dynamic way to tag blocks as + * having certain properties, allowing type checks which are more dynamic than hardcoding a bunch of IDs or a bunch + * of instanceof checks. + * + * For example, grass blocks, dirt, farmland, podzol and mycelium are all dirt-like blocks, and support the + * placement of blocks like flowers, so they have a common tag which allows them to be identified as such. + */ + public function hasTypeTag(string $tag) : bool{ + return $this->typeInfo->hasTypeTag($tag); + } + /** * Returns the block as an item. * State information such as facing, powered/unpowered, open/closed, etc., is discarded. @@ -272,47 +314,6 @@ class Block{ } } - /** - * Returns a type ID that identifies this type of block. This does not include information like facing, open/closed, - * powered/unpowered, etc. - */ - public function getTypeId() : int{ - return $this->idInfo->getBlockTypeId(); - } - - /** - * Returns whether the given block has an equivalent type to this one. This compares the type IDs. - */ - public function isSameType(Block $other) : bool{ - return $this->getTypeId() === $other->getTypeId(); - } - - /** - * Returns whether the given block has the same type and properties as this block. - */ - public function isSameState(Block $other) : bool{ - return $this->getStateId() === $other->getStateId(); - } - - /** - * @return string[] - */ - public function getTypeTags() : array{ - return $this->typeInfo->getTypeTags(); - } - - /** - * Returns whether this block type has the given type tag. Type tags are used as a dynamic way to tag blocks as - * having certain properties, allowing type checks which are more dynamic than hardcoding a bunch of IDs or a bunch - * of instanceof checks. - * - * For example, grass blocks, dirt, farmland, podzol and mycelium are all dirt-like blocks, and support the - * placement of blocks like flowers, so they have a common tag which allows them to be identified as such. - */ - public function hasTypeTag(string $tag) : bool{ - return $this->typeInfo->hasTypeTag($tag); - } - /** * AKA: Block->isPlaceable */ From 4692552fdc9280403b8cfcd5525b25ccaa319762 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 16:32:33 +0000 Subject: [PATCH 0643/1858] Block: improve documentation of type ID and state ID --- src/block/Block.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index d0edd01a7b..3f2bc5cb22 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -105,10 +105,14 @@ class Block{ return $this->fallbackName; } - /** - * Returns a type ID that identifies this type of block. This does not include information like facing, open/closed, - * powered/unpowered, etc. + * Returns a type ID that identifies this type of block. This allows comparing basic block types, e.g. wool, stone, + * glass, etc. + * + * This does **NOT** include information like facing, open/closed, powered/unpowered, colour, etc. This means that, + * for example, red wool and green wool have the same type ID. + * + * @see BlockTypeIds */ public function getTypeId() : int{ return $this->idInfo->getBlockTypeId(); @@ -120,6 +124,11 @@ class Block{ * Returns the full blockstate ID of this block. This is a compact way of representing a blockstate used to store * blocks in chunks at runtime. * + * This usually encodes all properties of the block, such as facing, open/closed, powered/unpowered, colour, etc. + * However, some blocks (such as signs and chests) may store additional properties in an associated "tile" if they + * have too many possible values to be encoded into the state ID. These extra properties are **NOT** included in + * this function's result. + * * This ID can be used to later obtain a copy of this block using {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ From e15e53859fa902a6ef8c402d611f0ab411ca0294 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 17:25:48 +0000 Subject: [PATCH 0644/1858] tidy --- src/block/Block.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 3f2bc5cb22..aed5582417 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -202,8 +202,7 @@ class Block{ */ final public function decodeTypeData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); - $givenBits = $typeBits; - $reader = new RuntimeDataReader($givenBits, $data); + $reader = new RuntimeDataReader($typeBits, $data); $this->describeType($reader); $readBits = $reader->getOffset(); @@ -218,8 +217,7 @@ class Block{ final public function decodeStateData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); - $givenBits = $typeBits + $stateBits; - $reader = new RuntimeDataReader($givenBits, $data); + $reader = new RuntimeDataReader($typeBits + $stateBits, $data); $this->decodeTypeData($reader->readInt($typeBits)); $this->describeState($reader); @@ -234,8 +232,7 @@ class Block{ */ final public function computeTypeData() : int{ $typeBits = $this->getRequiredTypeDataBits(); - $requiredBits = $typeBits; - $writer = new RuntimeDataWriter($requiredBits); + $writer = new RuntimeDataWriter($typeBits); $this->describeType($writer); $writtenBits = $writer->getOffset(); @@ -252,8 +249,7 @@ class Block{ final public function computeStateData() : int{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); - $requiredBits = $typeBits + $stateBits; - $writer = new RuntimeDataWriter($requiredBits); + $writer = new RuntimeDataWriter($typeBits + $stateBits); $writer->writeInt($typeBits, $this->computeTypeData()); $this->describeState($writer); From 972f107972f931bf658e8ab730d25de8e365704c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 17:31:52 +0000 Subject: [PATCH 0645/1858] Block: added documentation for describeType() and describeState() --- src/block/Block.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index aed5582417..fb43a214f3 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -261,10 +261,26 @@ class Block{ return $writer->getValue(); } + /** + * Describes properties of this block which apply to both the block and item form of the block. + * Examples of suitable properties include colour, skull type, and any other information which **IS** kept when the + * block is mined or block-picked. + * + * The method implementation must NOT use conditional logic to determine which properties are written. It must + * always write the same properties in the same order, regardless of the current state of the block. + */ protected function describeType(RuntimeDataDescriber $w) : void{ //NOOP } + /** + * Describes properties of this block which apply only to the block form of the block. + * Examples of suitable properties include facing, open/closed, powered/unpowered, on/off, and any other information + * which **IS NOT** kept when the block is mined or block-picked. + * + * The method implementation must NOT use conditional logic to determine which properties are written. It must + * always write the same properties in the same order, regardless of the current state of the block. + */ protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP } From 95c18ef99a93126eba4f52d8482d84a9e28a4dda Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Mar 2023 17:42:44 +0000 Subject: [PATCH 0646/1858] Block: change confusing naming of decode/computeStateData these actually accept a combination of type and state data, so it's a bit inconsistent with other references to 'state data'. --- src/block/Block.php | 8 ++++---- src/block/RuntimeBlockStateRegistry.php | 6 +++--- tests/phpunit/block/BlockTest.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index fb43a214f3..934a485d97 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -132,7 +132,7 @@ class Block{ * This ID can be used to later obtain a copy of this block using {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ - return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeStateData(); + return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeTypeAndStateData(); } /** @@ -214,7 +214,7 @@ class Block{ /** * @internal */ - final public function decodeStateData(int $data) : void{ + final public function decodeTypeAndStateData(int $data) : void{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); $reader = new RuntimeDataReader($typeBits + $stateBits, $data); @@ -246,7 +246,7 @@ class Block{ /** * @internal */ - final public function computeStateData() : int{ + final public function computeTypeAndStateData() : int{ $typeBits = $this->getRequiredTypeDataBits(); $stateBits = $this->getRequiredStateDataBits(); $writer = new RuntimeDataWriter($typeBits + $stateBits); @@ -720,7 +720,7 @@ class Block{ * @return string */ public function __toString(){ - return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->computeStateData() . ")"; + return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->computeTypeAndStateData() . ")"; } /** diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index ae6386e33c..ed3761b720 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -97,10 +97,10 @@ class RuntimeBlockStateRegistry{ for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ $v = clone $block; try{ - $v->decodeStateData($stateData); - if($v->computeStateData() !== $stateData){ + $v->decodeTypeAndStateData($stateData); + if($v->computeTypeAndStateData() !== $stateData){ //TODO: this should probably be a hard error - throw new \LogicException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeStateData() . " for input $stateData)"); + throw new \LogicException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeTypeAndStateData() . " for input $stateData)"); } }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it continue; diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 3f6dbac952..8712212c54 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -126,7 +126,7 @@ class BlockTest extends TestCase{ $states = $this->blockFactory->getAllKnownStates(); foreach($states 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::assertArrayHasKey($stateId, $knownStates, "New block state $stateId (" . $state->getTypeId() . ":" . $state->computeTypeAndStateData() . ", " . print_r($state, true) . ") - consistency check may need regenerating"); self::assertSame($knownStates[$stateId], $state->getName()); } asort($knownStates, SORT_STRING); From a382f0fd920f416e0a0f4e51aa5673fa8d9ff6f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:05:59 +0000 Subject: [PATCH 0647/1858] Bump phpstan/phpstan-phpunit from 1.3.8 to 1.3.10 (#5602) Bumps [phpstan/phpstan-phpunit](https://github.com/phpstan/phpstan-phpunit) from 1.3.8 to 1.3.10. - [Release notes](https://github.com/phpstan/phpstan-phpunit/releases) - [Commits](https://github.com/phpstan/phpstan-phpunit/compare/1.3.8...1.3.10) --- updated-dependencies: - dependency-name: phpstan/phpstan-phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index f473a301d5..0a792f2846 100644 --- a/composer.lock +++ b/composer.lock @@ -1891,16 +1891,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.8", + "version": "1.3.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5" + "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", - "reference": "4a19a3cb5b2d28b143f350e45e9f6e17e2cb81b5", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4cc5c6cc38e56bce7ea47c4091814e516d172dc3", + "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3", "shasum": "" }, "require": { @@ -1937,9 +1937,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.8" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.10" }, - "time": "2023-02-25T15:14:31+00:00" + "time": "2023-03-02T10:25:13+00:00" }, { "name": "phpstan/phpstan-strict-rules", From 0edc5f81138afec6099b48e81104b7a84f6f6d46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:06:18 +0000 Subject: [PATCH 0648/1858] Bump phpunit/phpunit from 9.6.3 to 9.6.4 (#5597) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.3 to 9.6.4. - [Release notes](https://github.com/sebastianbergmann/phpunit/releases) - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-9.6.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.3...9.6.4) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 0a792f2846..1abc4e881f 100644 --- a/composer.lock +++ b/composer.lock @@ -2310,16 +2310,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.3", + "version": "9.6.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" + "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d", + "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d", "shasum": "" }, "require": { @@ -2392,7 +2392,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4" }, "funding": [ { @@ -2408,7 +2408,7 @@ "type": "tidelift" } ], - "time": "2023-02-04T13:37:15+00:00" + "time": "2023-02-27T13:06:37+00:00" }, { "name": "sebastian/cli-parser", From aaec21f544ae09c248396a4529c0d82b489a9a0a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 15:04:43 +0000 Subject: [PATCH 0649/1858] Compressor: Use minCompressionThreshold exclusively closes #5589 --- src/Server.php | 3 +- .../mcpe/StandardPacketBroadcaster.php | 32 ++++++------------- src/network/mcpe/compression/Compressor.php | 13 ++++++-- .../mcpe/compression/ThresholdCompressor.php | 31 ------------------ .../mcpe/compression/ZlibCompressor.php | 11 +++---- 5 files changed, 25 insertions(+), 65 deletions(-) delete mode 100644 src/network/mcpe/compression/ThresholdCompressor.php diff --git a/src/Server.php b/src/Server.php index 116e6f39e0..e65b9d8ef9 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1388,7 +1388,8 @@ class Server{ $buffer = $stream->getBuffer(); if($sync === null){ - $sync = !($this->networkCompressionAsync && $compressor->willCompress($buffer)); + $threshold = $compressor->getCompressionThreshold(); + $sync = !$this->networkCompressionAsync || $threshold === null || strlen($stream->getBuffer()) < $threshold; } $promise = new CompressBatchPromise(); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 04b3253f54..3bdbbe9556 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use pocketmine\network\mcpe\compression\ThresholdCompressor; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\Server; @@ -64,36 +63,23 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ foreach($compressorMap as $compressorId => $compressorTargets){ $compressor = $compressors[$compressorId]; - $batchBuffer = null; - if($compressor instanceof ThresholdCompressor){ - $threshold = $compressor->getCompressionThreshold(); - if($threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ - //do not prepare shared batch unless we're sure it will be compressed - $stream = new BinaryStream(); - PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); - $batchBuffer = $stream->getBuffer(); - } - }else{ - //this is a legacy compressor, so we have to encode the batch and check if it will compress + $threshold = $compressor->getCompressionThreshold(); + if($threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ + //do not prepare shared batch unless we're sure it will be compressed $stream = new BinaryStream(); PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); - $tempBatchBuffer = $stream->getBuffer(); - if($compressor->willCompress($tempBatchBuffer)){ - $batchBuffer = $tempBatchBuffer; - } - } + $batchBuffer = $stream->getBuffer(); - if($batchBuffer === null){ + $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor); + foreach($compressorTargets as $target){ + $target->queueCompressed($promise); + } + }else{ foreach($compressorTargets as $target){ foreach($packetBuffers[$bufferId] as $packetBuffer){ $target->addToSendBuffer($packetBuffer); } } - }else{ - $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor); - foreach($compressorTargets as $target){ - $target->queueCompressed($promise); - } } } } diff --git a/src/network/mcpe/compression/Compressor.php b/src/network/mcpe/compression/Compressor.php index e15c7eb85a..a299f4eb08 100644 --- a/src/network/mcpe/compression/Compressor.php +++ b/src/network/mcpe/compression/Compressor.php @@ -24,13 +24,20 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\compression; interface Compressor{ - - public function willCompress(string $data) : bool; - /** * @throws DecompressionException */ public function decompress(string $payload) : string; public function compress(string $payload) : string; + + /** + * Returns the minimum size of packet batch that the compressor will attempt to compress. + * + * The compressor's output **MUST** still be valid input for the decompressor even if the compressor input is + * below this threshold. + * However, it may choose to use a cheaper compression option (e.g. zlib level 0, which simply wraps the data and + * doesn't attempt to compress it) to avoid wasting CPU time. + */ + public function getCompressionThreshold() : ?int; } diff --git a/src/network/mcpe/compression/ThresholdCompressor.php b/src/network/mcpe/compression/ThresholdCompressor.php deleted file mode 100644 index 4c3c0ad55a..0000000000 --- a/src/network/mcpe/compression/ThresholdCompressor.php +++ /dev/null @@ -1,31 +0,0 @@ -minCompressionSize; } - public function willCompress(string $data) : bool{ - return $this->minCompressionSize !== null && strlen($data) >= $this->minCompressionSize; - } - /** * @throws DecompressionException */ @@ -76,11 +72,12 @@ final class ZlibCompressor implements ThresholdCompressor{ } public function compress(string $payload) : string{ + $compressible = $this->minCompressionSize !== null && strlen($payload) >= $this->minCompressionSize; if(function_exists('libdeflate_deflate_compress')){ - return $this->willCompress($payload) ? + return $compressible ? libdeflate_deflate_compress($payload, $this->level) : self::zlib_encode($payload, 0); } - return self::zlib_encode($payload, $this->willCompress($payload) ? $this->level : 0); + return self::zlib_encode($payload, $compressible ? $this->level : 0); } } From b9d62de29d146bc7fdfd71516fa83fba2ecabf83 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 15:47:34 +0000 Subject: [PATCH 0650/1858] Pack wall connections into 7 bits for runtime data encoding --- src/block/Block.php | 2 +- src/data/runtime/RuntimeDataReader.php | 6 ++++-- src/data/runtime/RuntimeDataSizeCalculator.php | 3 +-- src/data/runtime/RuntimeDataWriter.php | 9 ++++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 934a485d97..d557411fe6 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -54,7 +54,7 @@ use function get_class; use const PHP_INT_MAX; class Block{ - public const INTERNAL_STATE_DATA_BITS = 9; + public const INTERNAL_STATE_DATA_BITS = 8; public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS); protected BlockIdentifier $idInfo; diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 14fbca209c..ded875385b 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -144,9 +144,10 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ */ public function wallConnections(array &$connections) : void{ $result = []; - //TODO: we can pack this into 7 bits instead of 8 + $offset = 0; + $packed = $this->readBoundedInt(7, 0, (3 ** 4) - 1); foreach(Facing::HORIZONTAL as $facing){ - $type = $this->readBoundedInt(2, 0, 2); + $type = intdiv($packed, (3 ** $offset)) % 3; if($type !== 0){ $result[$facing] = match($type){ 1 => WallConnectionType::SHORT(), @@ -154,6 +155,7 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ default => throw new AssumptionFailedError("Unreachable") }; } + $offset++; } $connections = $result; diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 5678ffd81e..ded2094701 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -81,8 +81,7 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ } public function wallConnections(array &$connections) : void{ - //TODO: this can be reduced to 7 if we pack the trinary values - $this->addBits(8); + $this->addBits(7); } public function brewingStandSlots(array &$slots) : void{ diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index feaef3698f..0b3cd73e3c 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -133,15 +133,18 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ * @phpstan-param array $connections */ public function wallConnections(array &$connections) : void{ - //TODO: we can pack this into 7 bits instead of 8 + $packed = 0; + $offset = 0; foreach(Facing::HORIZONTAL as $facing){ - $this->writeBoundedInt(2, 0, 2, match($connections[$facing] ?? null){ + $packed += match($connections[$facing] ?? null){ null => 0, WallConnectionType::SHORT() => 1, WallConnectionType::TALL() => 2, default => throw new AssumptionFailedError("Unreachable") - }); + } * (3 ** $offset); + $offset++; } + $this->writeBoundedInt(7, 0, (3 ** 4) - 1, $packed); } /** From 5eeb63f64b93bc6af5f40e4731215f1f38b7d05f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 15:52:57 +0000 Subject: [PATCH 0651/1858] always the CS ... --- src/data/runtime/RuntimeDataReader.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index ded875385b..280a0f4996 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -29,6 +29,7 @@ use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; +use function intdiv; final class RuntimeDataReader implements RuntimeDataDescriber{ use RuntimeEnumDeserializerTrait; From a42a67fc507f1939d96c162849d33ac9b4bc0342 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 15:53:56 +0000 Subject: [PATCH 0652/1858] Update consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 5f7ce0cbf3..1fc151ab52 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[5248000],"Acacia Button":[5120512,5120513,5120514,5120515,5120516,5120517,5120520,5120521,5120522,5120523,5120524,5120525],"Acacia Door":[5121024,5121025,5121026,5121027,5121028,5121029,5121030,5121031,5121032,5121033,5121034,5121035,5121036,5121037,5121038,5121039,5121040,5121041,5121042,5121043,5121044,5121045,5121046,5121047,5121048,5121049,5121050,5121051,5121052,5121053,5121054,5121055],"Acacia Fence":[5121536],"Acacia Fence Gate":[5122048,5122049,5122050,5122051,5122052,5122053,5122054,5122055,5122056,5122057,5122058,5122059,5122060,5122061,5122062,5122063],"Acacia Leaves":[5122560,5122561,5122562,5122563],"Acacia Log":[5123072,5123073,5123074,5123075,5123076,5123077],"Acacia Planks":[5123584],"Acacia Pressure Plate":[5124096,5124097],"Acacia Sapling":[5124608,5124609],"Acacia Sign":[5125120,5125121,5125122,5125123,5125124,5125125,5125126,5125127,5125128,5125129,5125130,5125131,5125132,5125133,5125134,5125135],"Acacia Slab":[5125632,5125633,5125634],"Acacia Stairs":[5126144,5126145,5126146,5126147,5126148,5126149,5126150,5126151],"Acacia Trapdoor":[5126656,5126657,5126658,5126659,5126660,5126661,5126662,5126663,5126664,5126665,5126666,5126667,5126668,5126669,5126670,5126671],"Acacia Wall Sign":[5127168,5127169,5127170,5127171],"Acacia Wood":[5127680,5127681,5127682,5127683,5127684,5127685],"Actinium":[5188096],"Activator Rail":[5128192,5128193,5128194,5128195,5128196,5128197,5128200,5128201,5128202,5128203,5128204,5128205],"Air":[5120000],"All Sided Mushroom Stem":[5128704],"Allium":[5129216],"Aluminum":[5188608],"Americium":[5189120],"Amethyst":[5396480],"Ancient Debris":[5396992],"Andesite":[5129728],"Andesite Slab":[5130240,5130241,5130242],"Andesite Stairs":[5130752,5130753,5130754,5130755,5130756,5130757,5130758,5130759],"Andesite Wall":[5131264,5131265,5131266,5131268,5131269,5131270,5131272,5131273,5131274,5131280,5131281,5131282,5131284,5131285,5131286,5131288,5131289,5131290,5131296,5131297,5131298,5131300,5131301,5131302,5131304,5131305,5131306,5131328,5131329,5131330,5131332,5131333,5131334,5131336,5131337,5131338,5131344,5131345,5131346,5131348,5131349,5131350,5131352,5131353,5131354,5131360,5131361,5131362,5131364,5131365,5131366,5131368,5131369,5131370,5131392,5131393,5131394,5131396,5131397,5131398,5131400,5131401,5131402,5131408,5131409,5131410,5131412,5131413,5131414,5131416,5131417,5131418,5131424,5131425,5131426,5131428,5131429,5131430,5131432,5131433,5131434,5131520,5131521,5131522,5131524,5131525,5131526,5131528,5131529,5131530,5131536,5131537,5131538,5131540,5131541,5131542,5131544,5131545,5131546,5131552,5131553,5131554,5131556,5131557,5131558,5131560,5131561,5131562,5131584,5131585,5131586,5131588,5131589,5131590,5131592,5131593,5131594,5131600,5131601,5131602,5131604,5131605,5131606,5131608,5131609,5131610,5131616,5131617,5131618,5131620,5131621,5131622,5131624,5131625,5131626,5131648,5131649,5131650,5131652,5131653,5131654,5131656,5131657,5131658,5131664,5131665,5131666,5131668,5131669,5131670,5131672,5131673,5131674,5131680,5131681,5131682,5131684,5131685,5131686,5131688,5131689,5131690],"Antimony":[5189632],"Anvil":[5131776,5131777,5131778,5131780,5131781,5131782,5131784,5131785,5131786,5131788,5131789,5131790],"Argon":[5190144],"Arsenic":[5190656],"Astatine":[5191168],"Azalea Leaves":[5471232,5471233,5471234,5471235],"Azure Bluet":[5132288],"Bamboo":[5132800,5132801,5132802,5132804,5132805,5132806,5132808,5132809,5132810,5132812,5132813,5132814],"Bamboo Sapling":[5133312,5133313],"Banner":[5133824,5133825,5133826,5133827,5133828,5133829,5133830,5133831,5133832,5133833,5133834,5133835,5133836,5133837,5133838,5133839,5133840,5133841,5133842,5133843,5133844,5133845,5133846,5133847,5133848,5133849,5133850,5133851,5133852,5133853,5133854,5133855,5133856,5133857,5133858,5133859,5133860,5133861,5133862,5133863,5133864,5133865,5133866,5133867,5133868,5133869,5133870,5133871,5133872,5133873,5133874,5133875,5133876,5133877,5133878,5133879,5133880,5133881,5133882,5133883,5133884,5133885,5133886,5133887,5133888,5133889,5133890,5133891,5133892,5133893,5133894,5133895,5133896,5133897,5133898,5133899,5133900,5133901,5133902,5133903,5133904,5133905,5133906,5133907,5133908,5133909,5133910,5133911,5133912,5133913,5133914,5133915,5133916,5133917,5133918,5133919,5133920,5133921,5133922,5133923,5133924,5133925,5133926,5133927,5133928,5133929,5133930,5133931,5133932,5133933,5133934,5133935,5133936,5133937,5133938,5133939,5133940,5133941,5133942,5133943,5133944,5133945,5133946,5133947,5133948,5133949,5133950,5133951,5133952,5133953,5133954,5133955,5133956,5133957,5133958,5133959,5133960,5133961,5133962,5133963,5133964,5133965,5133966,5133967,5133968,5133969,5133970,5133971,5133972,5133973,5133974,5133975,5133976,5133977,5133978,5133979,5133980,5133981,5133982,5133983,5133984,5133985,5133986,5133987,5133988,5133989,5133990,5133991,5133992,5133993,5133994,5133995,5133996,5133997,5133998,5133999,5134000,5134001,5134002,5134003,5134004,5134005,5134006,5134007,5134008,5134009,5134010,5134011,5134012,5134013,5134014,5134015,5134016,5134017,5134018,5134019,5134020,5134021,5134022,5134023,5134024,5134025,5134026,5134027,5134028,5134029,5134030,5134031,5134032,5134033,5134034,5134035,5134036,5134037,5134038,5134039,5134040,5134041,5134042,5134043,5134044,5134045,5134046,5134047,5134048,5134049,5134050,5134051,5134052,5134053,5134054,5134055,5134056,5134057,5134058,5134059,5134060,5134061,5134062,5134063,5134064,5134065,5134066,5134067,5134068,5134069,5134070,5134071,5134072,5134073,5134074,5134075,5134076,5134077,5134078,5134079],"Barium":[5191680],"Barrel":[5134336,5134337,5134338,5134339,5134340,5134341,5134344,5134345,5134346,5134347,5134348,5134349],"Barrier":[5134848],"Basalt":[5397504,5397505,5397506],"Beacon":[5135360],"Bed Block":[5135872,5135873,5135874,5135875,5135876,5135877,5135878,5135879,5135880,5135881,5135882,5135883,5135884,5135885,5135886,5135887,5135888,5135889,5135890,5135891,5135892,5135893,5135894,5135895,5135896,5135897,5135898,5135899,5135900,5135901,5135902,5135903,5135904,5135905,5135906,5135907,5135908,5135909,5135910,5135911,5135912,5135913,5135914,5135915,5135916,5135917,5135918,5135919,5135920,5135921,5135922,5135923,5135924,5135925,5135926,5135927,5135928,5135929,5135930,5135931,5135932,5135933,5135934,5135935,5135936,5135937,5135938,5135939,5135940,5135941,5135942,5135943,5135944,5135945,5135946,5135947,5135948,5135949,5135950,5135951,5135952,5135953,5135954,5135955,5135956,5135957,5135958,5135959,5135960,5135961,5135962,5135963,5135964,5135965,5135966,5135967,5135968,5135969,5135970,5135971,5135972,5135973,5135974,5135975,5135976,5135977,5135978,5135979,5135980,5135981,5135982,5135983,5135984,5135985,5135986,5135987,5135988,5135989,5135990,5135991,5135992,5135993,5135994,5135995,5135996,5135997,5135998,5135999,5136000,5136001,5136002,5136003,5136004,5136005,5136006,5136007,5136008,5136009,5136010,5136011,5136012,5136013,5136014,5136015,5136016,5136017,5136018,5136019,5136020,5136021,5136022,5136023,5136024,5136025,5136026,5136027,5136028,5136029,5136030,5136031,5136032,5136033,5136034,5136035,5136036,5136037,5136038,5136039,5136040,5136041,5136042,5136043,5136044,5136045,5136046,5136047,5136048,5136049,5136050,5136051,5136052,5136053,5136054,5136055,5136056,5136057,5136058,5136059,5136060,5136061,5136062,5136063,5136064,5136065,5136066,5136067,5136068,5136069,5136070,5136071,5136072,5136073,5136074,5136075,5136076,5136077,5136078,5136079,5136080,5136081,5136082,5136083,5136084,5136085,5136086,5136087,5136088,5136089,5136090,5136091,5136092,5136093,5136094,5136095,5136096,5136097,5136098,5136099,5136100,5136101,5136102,5136103,5136104,5136105,5136106,5136107,5136108,5136109,5136110,5136111,5136112,5136113,5136114,5136115,5136116,5136117,5136118,5136119,5136120,5136121,5136122,5136123,5136124,5136125,5136126,5136127],"Bedrock":[5136384,5136385],"Beetroot Block":[5136896,5136897,5136898,5136899,5136900,5136901,5136902,5136903],"Bell":[5137408,5137409,5137410,5137411,5137412,5137413,5137414,5137415,5137416,5137417,5137418,5137419,5137420,5137421,5137422,5137423],"Berkelium":[5192192],"Beryllium":[5192704],"Birch Button":[5137920,5137921,5137922,5137923,5137924,5137925,5137928,5137929,5137930,5137931,5137932,5137933],"Birch Door":[5138432,5138433,5138434,5138435,5138436,5138437,5138438,5138439,5138440,5138441,5138442,5138443,5138444,5138445,5138446,5138447,5138448,5138449,5138450,5138451,5138452,5138453,5138454,5138455,5138456,5138457,5138458,5138459,5138460,5138461,5138462,5138463],"Birch Fence":[5138944],"Birch Fence Gate":[5139456,5139457,5139458,5139459,5139460,5139461,5139462,5139463,5139464,5139465,5139466,5139467,5139468,5139469,5139470,5139471],"Birch Leaves":[5139968,5139969,5139970,5139971],"Birch Log":[5140480,5140481,5140482,5140483,5140484,5140485],"Birch Planks":[5140992],"Birch Pressure Plate":[5141504,5141505],"Birch Sapling":[5142016,5142017],"Birch Sign":[5142528,5142529,5142530,5142531,5142532,5142533,5142534,5142535,5142536,5142537,5142538,5142539,5142540,5142541,5142542,5142543],"Birch Slab":[5143040,5143041,5143042],"Birch Stairs":[5143552,5143553,5143554,5143555,5143556,5143557,5143558,5143559],"Birch Trapdoor":[5144064,5144065,5144066,5144067,5144068,5144069,5144070,5144071,5144072,5144073,5144074,5144075,5144076,5144077,5144078,5144079],"Birch Wall Sign":[5144576,5144577,5144578,5144579],"Birch Wood":[5145088,5145089,5145090,5145091,5145092,5145093],"Bismuth":[5193216],"Blackstone":[5399040],"Blackstone Slab":[5399552,5399553,5399554],"Blackstone Stairs":[5400064,5400065,5400066,5400067,5400068,5400069,5400070,5400071],"Blackstone Wall":[5400576,5400577,5400578,5400580,5400581,5400582,5400584,5400585,5400586,5400592,5400593,5400594,5400596,5400597,5400598,5400600,5400601,5400602,5400608,5400609,5400610,5400612,5400613,5400614,5400616,5400617,5400618,5400640,5400641,5400642,5400644,5400645,5400646,5400648,5400649,5400650,5400656,5400657,5400658,5400660,5400661,5400662,5400664,5400665,5400666,5400672,5400673,5400674,5400676,5400677,5400678,5400680,5400681,5400682,5400704,5400705,5400706,5400708,5400709,5400710,5400712,5400713,5400714,5400720,5400721,5400722,5400724,5400725,5400726,5400728,5400729,5400730,5400736,5400737,5400738,5400740,5400741,5400742,5400744,5400745,5400746,5400832,5400833,5400834,5400836,5400837,5400838,5400840,5400841,5400842,5400848,5400849,5400850,5400852,5400853,5400854,5400856,5400857,5400858,5400864,5400865,5400866,5400868,5400869,5400870,5400872,5400873,5400874,5400896,5400897,5400898,5400900,5400901,5400902,5400904,5400905,5400906,5400912,5400913,5400914,5400916,5400917,5400918,5400920,5400921,5400922,5400928,5400929,5400930,5400932,5400933,5400934,5400936,5400937,5400938,5400960,5400961,5400962,5400964,5400965,5400966,5400968,5400969,5400970,5400976,5400977,5400978,5400980,5400981,5400982,5400984,5400985,5400986,5400992,5400993,5400994,5400996,5400997,5400998,5401000,5401001,5401002],"Blast Furnace":[5146112,5146113,5146114,5146115,5146116,5146117,5146118,5146119],"Blue Ice":[5147136],"Blue Orchid":[5147648],"Blue Torch":[5148161,5148162,5148163,5148164,5148165],"Bohrium":[5193728],"Bone Block":[5148672,5148673,5148674],"Bookshelf":[5149184],"Boron":[5194240],"Brewing Stand":[5149696,5149697,5149698,5149699,5149700,5149701,5149702,5149703],"Brick Slab":[5150208,5150209,5150210],"Brick Stairs":[5150720,5150721,5150722,5150723,5150724,5150725,5150726,5150727],"Brick Wall":[5151232,5151233,5151234,5151236,5151237,5151238,5151240,5151241,5151242,5151248,5151249,5151250,5151252,5151253,5151254,5151256,5151257,5151258,5151264,5151265,5151266,5151268,5151269,5151270,5151272,5151273,5151274,5151296,5151297,5151298,5151300,5151301,5151302,5151304,5151305,5151306,5151312,5151313,5151314,5151316,5151317,5151318,5151320,5151321,5151322,5151328,5151329,5151330,5151332,5151333,5151334,5151336,5151337,5151338,5151360,5151361,5151362,5151364,5151365,5151366,5151368,5151369,5151370,5151376,5151377,5151378,5151380,5151381,5151382,5151384,5151385,5151386,5151392,5151393,5151394,5151396,5151397,5151398,5151400,5151401,5151402,5151488,5151489,5151490,5151492,5151493,5151494,5151496,5151497,5151498,5151504,5151505,5151506,5151508,5151509,5151510,5151512,5151513,5151514,5151520,5151521,5151522,5151524,5151525,5151526,5151528,5151529,5151530,5151552,5151553,5151554,5151556,5151557,5151558,5151560,5151561,5151562,5151568,5151569,5151570,5151572,5151573,5151574,5151576,5151577,5151578,5151584,5151585,5151586,5151588,5151589,5151590,5151592,5151593,5151594,5151616,5151617,5151618,5151620,5151621,5151622,5151624,5151625,5151626,5151632,5151633,5151634,5151636,5151637,5151638,5151640,5151641,5151642,5151648,5151649,5151650,5151652,5151653,5151654,5151656,5151657,5151658],"Bricks":[5151744],"Bromine":[5194752],"Brown Mushroom":[5152768],"Brown Mushroom Block":[5153280,5153281,5153282,5153283,5153284,5153285,5153286,5153287,5153288,5153289,5153290],"Cactus":[5153792,5153793,5153794,5153795,5153796,5153797,5153798,5153799,5153800,5153801,5153802,5153803,5153804,5153805,5153806,5153807],"Cadmium":[5195264],"Cake":[5154304,5154305,5154306,5154307,5154308,5154309,5154310],"Cake With Candle":[5458944,5458945],"Cake With Dyed Candle":[5459456,5459457,5459458,5459459,5459460,5459461,5459462,5459463,5459464,5459465,5459466,5459467,5459468,5459469,5459470,5459471,5459472,5459473,5459474,5459475,5459476,5459477,5459478,5459479,5459480,5459481,5459482,5459483,5459484,5459485,5459486,5459487],"Calcite":[5409280],"Calcium":[5195776],"Californium":[5196288],"Candle":[5457920,5457921,5457922,5457923,5457924,5457925,5457926,5457927],"Carbon":[5196800],"Carpet":[5154816,5154817,5154818,5154819,5154820,5154821,5154822,5154823,5154824,5154825,5154826,5154827,5154828,5154829,5154830,5154831],"Carrot Block":[5155328,5155329,5155330,5155331,5155332,5155333,5155334,5155335],"Cartography Table":[5460992],"Carved Pumpkin":[5155840,5155841,5155842,5155843],"Cauldron":[5463040],"Cerium":[5197312],"Cesium":[5197824],"Chain":[5469184,5469185,5469186],"Chest":[5156864,5156865,5156866,5156867],"Chiseled Deepslate":[5420032],"Chiseled Nether Bricks":[5420544],"Chiseled Polished Blackstone":[5404160],"Chiseled Quartz Block":[5157376,5157377,5157378],"Chiseled Red Sandstone":[5157888],"Chiseled Sandstone":[5158400],"Chiseled Stone Bricks":[5158912],"Chlorine":[5198336],"Chorus Flower":[5465600,5465601,5465602,5465603,5465604,5465605],"Chorus Plant":[5466112],"Chromium":[5198848],"Clay Block":[5159424],"Coal Block":[5159936],"Coal Ore":[5160448],"Cobalt":[5199360],"Cobbled Deepslate":[5415424],"Cobbled Deepslate Slab":[5415936,5415937,5415938],"Cobbled Deepslate Stairs":[5416448,5416449,5416450,5416451,5416452,5416453,5416454,5416455],"Cobbled Deepslate Wall":[5416960,5416961,5416962,5416964,5416965,5416966,5416968,5416969,5416970,5416976,5416977,5416978,5416980,5416981,5416982,5416984,5416985,5416986,5416992,5416993,5416994,5416996,5416997,5416998,5417000,5417001,5417002,5417024,5417025,5417026,5417028,5417029,5417030,5417032,5417033,5417034,5417040,5417041,5417042,5417044,5417045,5417046,5417048,5417049,5417050,5417056,5417057,5417058,5417060,5417061,5417062,5417064,5417065,5417066,5417088,5417089,5417090,5417092,5417093,5417094,5417096,5417097,5417098,5417104,5417105,5417106,5417108,5417109,5417110,5417112,5417113,5417114,5417120,5417121,5417122,5417124,5417125,5417126,5417128,5417129,5417130,5417216,5417217,5417218,5417220,5417221,5417222,5417224,5417225,5417226,5417232,5417233,5417234,5417236,5417237,5417238,5417240,5417241,5417242,5417248,5417249,5417250,5417252,5417253,5417254,5417256,5417257,5417258,5417280,5417281,5417282,5417284,5417285,5417286,5417288,5417289,5417290,5417296,5417297,5417298,5417300,5417301,5417302,5417304,5417305,5417306,5417312,5417313,5417314,5417316,5417317,5417318,5417320,5417321,5417322,5417344,5417345,5417346,5417348,5417349,5417350,5417352,5417353,5417354,5417360,5417361,5417362,5417364,5417365,5417366,5417368,5417369,5417370,5417376,5417377,5417378,5417380,5417381,5417382,5417384,5417385,5417386],"Cobblestone":[5160960],"Cobblestone Slab":[5161472,5161473,5161474],"Cobblestone Stairs":[5161984,5161985,5161986,5161987,5161988,5161989,5161990,5161991],"Cobblestone Wall":[5162496,5162497,5162498,5162500,5162501,5162502,5162504,5162505,5162506,5162512,5162513,5162514,5162516,5162517,5162518,5162520,5162521,5162522,5162528,5162529,5162530,5162532,5162533,5162534,5162536,5162537,5162538,5162560,5162561,5162562,5162564,5162565,5162566,5162568,5162569,5162570,5162576,5162577,5162578,5162580,5162581,5162582,5162584,5162585,5162586,5162592,5162593,5162594,5162596,5162597,5162598,5162600,5162601,5162602,5162624,5162625,5162626,5162628,5162629,5162630,5162632,5162633,5162634,5162640,5162641,5162642,5162644,5162645,5162646,5162648,5162649,5162650,5162656,5162657,5162658,5162660,5162661,5162662,5162664,5162665,5162666,5162752,5162753,5162754,5162756,5162757,5162758,5162760,5162761,5162762,5162768,5162769,5162770,5162772,5162773,5162774,5162776,5162777,5162778,5162784,5162785,5162786,5162788,5162789,5162790,5162792,5162793,5162794,5162816,5162817,5162818,5162820,5162821,5162822,5162824,5162825,5162826,5162832,5162833,5162834,5162836,5162837,5162838,5162840,5162841,5162842,5162848,5162849,5162850,5162852,5162853,5162854,5162856,5162857,5162858,5162880,5162881,5162882,5162884,5162885,5162886,5162888,5162889,5162890,5162896,5162897,5162898,5162900,5162901,5162902,5162904,5162905,5162906,5162912,5162913,5162914,5162916,5162917,5162918,5162920,5162921,5162922],"Cobweb":[5163008],"Cocoa Block":[5163520,5163521,5163522,5163523,5163524,5163525,5163526,5163527,5163528,5163529,5163530,5163531],"Compound Creator":[5164032,5164033,5164034,5164035],"Concrete":[5164544,5164545,5164546,5164547,5164548,5164549,5164550,5164551,5164552,5164553,5164554,5164555,5164556,5164557,5164558,5164559],"Concrete Powder":[5165056,5165057,5165058,5165059,5165060,5165061,5165062,5165063,5165064,5165065,5165066,5165067,5165068,5165069,5165070,5165071],"Copernicium":[5200384],"Copper":[5200896],"Copper Block":[5455872,5455873,5455874,5455875,5455876,5455877,5455878,5455879],"Copper Ore":[5449728],"Coral":[5165568,5165569,5165570,5165571,5165572,5165576,5165577,5165578,5165579,5165580],"Coral Block":[5166080,5166081,5166082,5166083,5166084,5166088,5166089,5166090,5166091,5166092],"Coral Fan":[5166592,5166593,5166594,5166595,5166596,5166600,5166601,5166602,5166603,5166604,5166608,5166609,5166610,5166611,5166612,5166616,5166617,5166618,5166619,5166620],"Cornflower":[5167104],"Cracked Deepslate Bricks":[5412352],"Cracked Deepslate Tiles":[5414912],"Cracked Nether Bricks":[5421056],"Cracked Polished Blackstone Bricks":[5406720],"Cracked Stone Bricks":[5167616],"Crafting Table":[5168128],"Crimson Button":[5434368,5434369,5434370,5434371,5434372,5434373,5434376,5434377,5434378,5434379,5434380,5434381],"Crimson Door":[5437440,5437441,5437442,5437443,5437444,5437445,5437446,5437447,5437448,5437449,5437450,5437451,5437452,5437453,5437454,5437455,5437456,5437457,5437458,5437459,5437460,5437461,5437462,5437463,5437464,5437465,5437466,5437467,5437468,5437469,5437470,5437471],"Crimson Fence":[5426688],"Crimson Fence Gate":[5438976,5438977,5438978,5438979,5438980,5438981,5438982,5438983,5438984,5438985,5438986,5438987,5438988,5438989,5438990,5438991],"Crimson Hyphae":[5431296,5431297,5431298,5431299,5431300,5431301],"Crimson Planks":[5425152],"Crimson Pressure Plate":[5435904,5435905],"Crimson Sign":[5442048,5442049,5442050,5442051,5442052,5442053,5442054,5442055,5442056,5442057,5442058,5442059,5442060,5442061,5442062,5442063],"Crimson Slab":[5428224,5428225,5428226],"Crimson Stairs":[5440512,5440513,5440514,5440515,5440516,5440517,5440518,5440519],"Crimson Stem":[5429760,5429761,5429762,5429763,5429764,5429765],"Crimson Trapdoor":[5432832,5432833,5432834,5432835,5432836,5432837,5432838,5432839,5432840,5432841,5432842,5432843,5432844,5432845,5432846,5432847],"Crimson Wall Sign":[5443584,5443585,5443586,5443587],"Crying Obsidian":[5454336],"Curium":[5201408],"Cut Copper Block":[5456384,5456385,5456386,5456387,5456388,5456389,5456390,5456391],"Cut Copper Slab Slab":[5456896,5456897,5456898,5456899,5456900,5456901,5456902,5456903,5456904,5456905,5456906,5456907,5456908,5456909,5456910,5456911,5456912,5456913,5456914,5456915,5456916,5456917,5456918,5456919],"Cut Copper Stairs":[5457408,5457409,5457410,5457411,5457412,5457413,5457414,5457415,5457416,5457417,5457418,5457419,5457420,5457421,5457422,5457423,5457424,5457425,5457426,5457427,5457428,5457429,5457430,5457431,5457432,5457433,5457434,5457435,5457436,5457437,5457438,5457439,5457440,5457441,5457442,5457443,5457444,5457445,5457446,5457447,5457448,5457449,5457450,5457451,5457452,5457453,5457454,5457455,5457456,5457457,5457458,5457459,5457460,5457461,5457462,5457463,5457464,5457465,5457466,5457467,5457468,5457469,5457470,5457471],"Cut Red Sandstone":[5168640],"Cut Red Sandstone Slab":[5169152,5169153,5169154],"Cut Sandstone":[5169664],"Cut Sandstone Slab":[5170176,5170177,5170178],"Dandelion":[5171200],"Dark Oak Button":[5171712,5171713,5171714,5171715,5171716,5171717,5171720,5171721,5171722,5171723,5171724,5171725],"Dark Oak Door":[5172224,5172225,5172226,5172227,5172228,5172229,5172230,5172231,5172232,5172233,5172234,5172235,5172236,5172237,5172238,5172239,5172240,5172241,5172242,5172243,5172244,5172245,5172246,5172247,5172248,5172249,5172250,5172251,5172252,5172253,5172254,5172255],"Dark Oak Fence":[5172736],"Dark Oak Fence Gate":[5173248,5173249,5173250,5173251,5173252,5173253,5173254,5173255,5173256,5173257,5173258,5173259,5173260,5173261,5173262,5173263],"Dark Oak Leaves":[5173760,5173761,5173762,5173763],"Dark Oak Log":[5174272,5174273,5174274,5174275,5174276,5174277],"Dark Oak Planks":[5174784],"Dark Oak Pressure Plate":[5175296,5175297],"Dark Oak Sapling":[5175808,5175809],"Dark Oak Sign":[5176320,5176321,5176322,5176323,5176324,5176325,5176326,5176327,5176328,5176329,5176330,5176331,5176332,5176333,5176334,5176335],"Dark Oak Slab":[5176832,5176833,5176834],"Dark Oak Stairs":[5177344,5177345,5177346,5177347,5177348,5177349,5177350,5177351],"Dark Oak Trapdoor":[5177856,5177857,5177858,5177859,5177860,5177861,5177862,5177863,5177864,5177865,5177866,5177867,5177868,5177869,5177870,5177871],"Dark Oak Wall Sign":[5178368,5178369,5178370,5178371],"Dark Oak Wood":[5178880,5178881,5178882,5178883,5178884,5178885],"Dark Prismarine":[5179392],"Dark Prismarine Slab":[5179904,5179905,5179906],"Dark Prismarine Stairs":[5180416,5180417,5180418,5180419,5180420,5180421,5180422,5180423],"Darmstadtium":[5201920],"Daylight Sensor":[5180928,5180929,5180930,5180931,5180932,5180933,5180934,5180935,5180936,5180937,5180938,5180939,5180940,5180941,5180942,5180943,5180944,5180945,5180946,5180947,5180948,5180949,5180950,5180951,5180952,5180953,5180954,5180955,5180956,5180957,5180958,5180959],"Dead Bush":[5181440],"Deepslate":[5409792,5409793,5409794],"Deepslate Brick Slab":[5410816,5410817,5410818],"Deepslate Brick Stairs":[5411328,5411329,5411330,5411331,5411332,5411333,5411334,5411335],"Deepslate Brick Wall":[5411840,5411841,5411842,5411844,5411845,5411846,5411848,5411849,5411850,5411856,5411857,5411858,5411860,5411861,5411862,5411864,5411865,5411866,5411872,5411873,5411874,5411876,5411877,5411878,5411880,5411881,5411882,5411904,5411905,5411906,5411908,5411909,5411910,5411912,5411913,5411914,5411920,5411921,5411922,5411924,5411925,5411926,5411928,5411929,5411930,5411936,5411937,5411938,5411940,5411941,5411942,5411944,5411945,5411946,5411968,5411969,5411970,5411972,5411973,5411974,5411976,5411977,5411978,5411984,5411985,5411986,5411988,5411989,5411990,5411992,5411993,5411994,5412000,5412001,5412002,5412004,5412005,5412006,5412008,5412009,5412010,5412096,5412097,5412098,5412100,5412101,5412102,5412104,5412105,5412106,5412112,5412113,5412114,5412116,5412117,5412118,5412120,5412121,5412122,5412128,5412129,5412130,5412132,5412133,5412134,5412136,5412137,5412138,5412160,5412161,5412162,5412164,5412165,5412166,5412168,5412169,5412170,5412176,5412177,5412178,5412180,5412181,5412182,5412184,5412185,5412186,5412192,5412193,5412194,5412196,5412197,5412198,5412200,5412201,5412202,5412224,5412225,5412226,5412228,5412229,5412230,5412232,5412233,5412234,5412240,5412241,5412242,5412244,5412245,5412246,5412248,5412249,5412250,5412256,5412257,5412258,5412260,5412261,5412262,5412264,5412265,5412266],"Deepslate Bricks":[5410304],"Deepslate Coal Ore":[5445632],"Deepslate Copper Ore":[5449216],"Deepslate Diamond Ore":[5446144],"Deepslate Emerald Ore":[5446656],"Deepslate Gold Ore":[5448704],"Deepslate Iron Ore":[5448192],"Deepslate Lapis Lazuli Ore":[5447168],"Deepslate Redstone Ore":[5447680,5447681],"Deepslate Tile Slab":[5413376,5413377,5413378],"Deepslate Tile Stairs":[5413888,5413889,5413890,5413891,5413892,5413893,5413894,5413895],"Deepslate Tile Wall":[5414400,5414401,5414402,5414404,5414405,5414406,5414408,5414409,5414410,5414416,5414417,5414418,5414420,5414421,5414422,5414424,5414425,5414426,5414432,5414433,5414434,5414436,5414437,5414438,5414440,5414441,5414442,5414464,5414465,5414466,5414468,5414469,5414470,5414472,5414473,5414474,5414480,5414481,5414482,5414484,5414485,5414486,5414488,5414489,5414490,5414496,5414497,5414498,5414500,5414501,5414502,5414504,5414505,5414506,5414528,5414529,5414530,5414532,5414533,5414534,5414536,5414537,5414538,5414544,5414545,5414546,5414548,5414549,5414550,5414552,5414553,5414554,5414560,5414561,5414562,5414564,5414565,5414566,5414568,5414569,5414570,5414656,5414657,5414658,5414660,5414661,5414662,5414664,5414665,5414666,5414672,5414673,5414674,5414676,5414677,5414678,5414680,5414681,5414682,5414688,5414689,5414690,5414692,5414693,5414694,5414696,5414697,5414698,5414720,5414721,5414722,5414724,5414725,5414726,5414728,5414729,5414730,5414736,5414737,5414738,5414740,5414741,5414742,5414744,5414745,5414746,5414752,5414753,5414754,5414756,5414757,5414758,5414760,5414761,5414762,5414784,5414785,5414786,5414788,5414789,5414790,5414792,5414793,5414794,5414800,5414801,5414802,5414804,5414805,5414806,5414808,5414809,5414810,5414816,5414817,5414818,5414820,5414821,5414822,5414824,5414825,5414826],"Deepslate Tiles":[5412864],"Detector Rail":[5181952,5181953,5181954,5181955,5181956,5181957,5181960,5181961,5181962,5181963,5181964,5181965],"Diamond Block":[5182464],"Diamond Ore":[5182976],"Diorite":[5183488],"Diorite Slab":[5184000,5184001,5184002],"Diorite Stairs":[5184512,5184513,5184514,5184515,5184516,5184517,5184518,5184519],"Diorite Wall":[5185024,5185025,5185026,5185028,5185029,5185030,5185032,5185033,5185034,5185040,5185041,5185042,5185044,5185045,5185046,5185048,5185049,5185050,5185056,5185057,5185058,5185060,5185061,5185062,5185064,5185065,5185066,5185088,5185089,5185090,5185092,5185093,5185094,5185096,5185097,5185098,5185104,5185105,5185106,5185108,5185109,5185110,5185112,5185113,5185114,5185120,5185121,5185122,5185124,5185125,5185126,5185128,5185129,5185130,5185152,5185153,5185154,5185156,5185157,5185158,5185160,5185161,5185162,5185168,5185169,5185170,5185172,5185173,5185174,5185176,5185177,5185178,5185184,5185185,5185186,5185188,5185189,5185190,5185192,5185193,5185194,5185280,5185281,5185282,5185284,5185285,5185286,5185288,5185289,5185290,5185296,5185297,5185298,5185300,5185301,5185302,5185304,5185305,5185306,5185312,5185313,5185314,5185316,5185317,5185318,5185320,5185321,5185322,5185344,5185345,5185346,5185348,5185349,5185350,5185352,5185353,5185354,5185360,5185361,5185362,5185364,5185365,5185366,5185368,5185369,5185370,5185376,5185377,5185378,5185380,5185381,5185382,5185384,5185385,5185386,5185408,5185409,5185410,5185412,5185413,5185414,5185416,5185417,5185418,5185424,5185425,5185426,5185428,5185429,5185430,5185432,5185433,5185434,5185440,5185441,5185442,5185444,5185445,5185446,5185448,5185449,5185450],"Dirt":[5185536,5185537,5185538],"Double Tallgrass":[5186048,5186049],"Dragon Egg":[5186560],"Dried Kelp Block":[5187072],"Dubnium":[5202432],"Dyed Candle":[5458432,5458433,5458434,5458435,5458436,5458437,5458438,5458439,5458440,5458441,5458442,5458443,5458444,5458445,5458446,5458447,5458448,5458449,5458450,5458451,5458452,5458453,5458454,5458455,5458456,5458457,5458458,5458459,5458460,5458461,5458462,5458463,5458464,5458465,5458466,5458467,5458468,5458469,5458470,5458471,5458472,5458473,5458474,5458475,5458476,5458477,5458478,5458479,5458480,5458481,5458482,5458483,5458484,5458485,5458486,5458487,5458488,5458489,5458490,5458491,5458492,5458493,5458494,5458495,5458496,5458497,5458498,5458499,5458500,5458501,5458502,5458503,5458504,5458505,5458506,5458507,5458508,5458509,5458510,5458511,5458512,5458513,5458514,5458515,5458516,5458517,5458518,5458519,5458520,5458521,5458522,5458523,5458524,5458525,5458526,5458527,5458528,5458529,5458530,5458531,5458532,5458533,5458534,5458535,5458536,5458537,5458538,5458539,5458540,5458541,5458542,5458543,5458544,5458545,5458546,5458547,5458548,5458549,5458550,5458551,5458552,5458553,5458554,5458555,5458556,5458557,5458558,5458559],"Dyed Shulker Box":[5187584,5187585,5187586,5187587,5187588,5187589,5187590,5187591,5187592,5187593,5187594,5187595,5187596,5187597,5187598,5187599],"Dysprosium":[5202944],"Einsteinium":[5203456],"Element Constructor":[5199872,5199873,5199874,5199875],"Emerald Block":[5249536],"Emerald Ore":[5250048],"Enchanting Table":[5250560],"End Portal Frame":[5251072,5251073,5251074,5251075,5251076,5251077,5251078,5251079],"End Rod":[5251584,5251585,5251586,5251587,5251588,5251589],"End Stone":[5252096],"End Stone Brick Slab":[5252608,5252609,5252610],"End Stone Brick Stairs":[5253120,5253121,5253122,5253123,5253124,5253125,5253126,5253127],"End Stone Brick Wall":[5253632,5253633,5253634,5253636,5253637,5253638,5253640,5253641,5253642,5253648,5253649,5253650,5253652,5253653,5253654,5253656,5253657,5253658,5253664,5253665,5253666,5253668,5253669,5253670,5253672,5253673,5253674,5253696,5253697,5253698,5253700,5253701,5253702,5253704,5253705,5253706,5253712,5253713,5253714,5253716,5253717,5253718,5253720,5253721,5253722,5253728,5253729,5253730,5253732,5253733,5253734,5253736,5253737,5253738,5253760,5253761,5253762,5253764,5253765,5253766,5253768,5253769,5253770,5253776,5253777,5253778,5253780,5253781,5253782,5253784,5253785,5253786,5253792,5253793,5253794,5253796,5253797,5253798,5253800,5253801,5253802,5253888,5253889,5253890,5253892,5253893,5253894,5253896,5253897,5253898,5253904,5253905,5253906,5253908,5253909,5253910,5253912,5253913,5253914,5253920,5253921,5253922,5253924,5253925,5253926,5253928,5253929,5253930,5253952,5253953,5253954,5253956,5253957,5253958,5253960,5253961,5253962,5253968,5253969,5253970,5253972,5253973,5253974,5253976,5253977,5253978,5253984,5253985,5253986,5253988,5253989,5253990,5253992,5253993,5253994,5254016,5254017,5254018,5254020,5254021,5254022,5254024,5254025,5254026,5254032,5254033,5254034,5254036,5254037,5254038,5254040,5254041,5254042,5254048,5254049,5254050,5254052,5254053,5254054,5254056,5254057,5254058],"End Stone Bricks":[5254144],"Ender Chest":[5254656,5254657,5254658,5254659],"Erbium":[5203968],"Europium":[5204480],"Fake Wooden Slab":[5255168,5255169,5255170],"Farmland":[5255680,5255681,5255682,5255683,5255684,5255685,5255686,5255687],"Fermium":[5204992],"Fern":[5256192],"Fire Block":[5256704,5256705,5256706,5256707,5256708,5256709,5256710,5256711,5256712,5256713,5256714,5256715,5256716,5256717,5256718,5256719],"Flerovium":[5205504],"Fletching Table":[5257216],"Flower Pot":[5257728],"Flowering Azalea Leaves":[5471744,5471745,5471746,5471747],"Fluorine":[5206016],"Francium":[5206528],"Froglight":[5467648,5467649,5467650,5467652,5467653,5467654,5467656,5467657,5467658],"Frosted Ice":[5258240,5258241,5258242,5258243],"Furnace":[5258752,5258753,5258754,5258755,5258756,5258757,5258758,5258759],"Gadolinium":[5207040],"Gallium":[5207552],"Germanium":[5208064],"Gilded Blackstone":[5454848],"Glass":[5259264],"Glass Pane":[5259776],"Glazed Terracotta":[5395968,5395969,5395970,5395971,5395972,5395973,5395974,5395975,5395976,5395977,5395978,5395979,5395980,5395981,5395982,5395983,5395984,5395985,5395986,5395987,5395988,5395989,5395990,5395991,5395992,5395993,5395994,5395995,5395996,5395997,5395998,5395999,5396000,5396001,5396002,5396003,5396004,5396005,5396006,5396007,5396008,5396009,5396010,5396011,5396012,5396013,5396014,5396015,5396016,5396017,5396018,5396019,5396020,5396021,5396022,5396023,5396024,5396025,5396026,5396027,5396028,5396029,5396030,5396031],"Glow Item Frame":[5470208,5470209,5470210,5470211,5470212,5470213,5470216,5470217,5470218,5470219,5470220,5470221],"Glowing Obsidian":[5260288],"Glowstone":[5260800],"Gold":[5208576],"Gold Block":[5261312],"Gold Ore":[5261824],"Granite":[5262336],"Granite Slab":[5262848,5262849,5262850],"Granite Stairs":[5263360,5263361,5263362,5263363,5263364,5263365,5263366,5263367],"Granite Wall":[5263872,5263873,5263874,5263876,5263877,5263878,5263880,5263881,5263882,5263888,5263889,5263890,5263892,5263893,5263894,5263896,5263897,5263898,5263904,5263905,5263906,5263908,5263909,5263910,5263912,5263913,5263914,5263936,5263937,5263938,5263940,5263941,5263942,5263944,5263945,5263946,5263952,5263953,5263954,5263956,5263957,5263958,5263960,5263961,5263962,5263968,5263969,5263970,5263972,5263973,5263974,5263976,5263977,5263978,5264000,5264001,5264002,5264004,5264005,5264006,5264008,5264009,5264010,5264016,5264017,5264018,5264020,5264021,5264022,5264024,5264025,5264026,5264032,5264033,5264034,5264036,5264037,5264038,5264040,5264041,5264042,5264128,5264129,5264130,5264132,5264133,5264134,5264136,5264137,5264138,5264144,5264145,5264146,5264148,5264149,5264150,5264152,5264153,5264154,5264160,5264161,5264162,5264164,5264165,5264166,5264168,5264169,5264170,5264192,5264193,5264194,5264196,5264197,5264198,5264200,5264201,5264202,5264208,5264209,5264210,5264212,5264213,5264214,5264216,5264217,5264218,5264224,5264225,5264226,5264228,5264229,5264230,5264232,5264233,5264234,5264256,5264257,5264258,5264260,5264261,5264262,5264264,5264265,5264266,5264272,5264273,5264274,5264276,5264277,5264278,5264280,5264281,5264282,5264288,5264289,5264290,5264292,5264293,5264294,5264296,5264297,5264298],"Grass":[5264384],"Grass Path":[5264896],"Gravel":[5265408],"Green Torch":[5266945,5266946,5266947,5266948,5266949],"Hafnium":[5209088],"Hanging Roots":[5460480],"Hardened Clay":[5267456],"Hardened Glass":[5267968],"Hardened Glass Pane":[5268480],"Hassium":[5209600],"Hay Bale":[5268992,5268993,5268994],"Heat Block":[5156352],"Helium":[5210112],"Holmium":[5210624],"Honeycomb Block":[5445120],"Hopper":[5269504,5269506,5269507,5269508,5269509,5269512,5269514,5269515,5269516,5269517],"Hydrogen":[5211136],"Ice":[5270016],"Indium":[5211648],"Infested Chiseled Stone Brick":[5270528],"Infested Cobblestone":[5271040],"Infested Cracked Stone Brick":[5271552],"Infested Mossy Stone Brick":[5272064],"Infested Stone":[5272576],"Infested Stone Brick":[5273088],"Invisible Bedrock":[5274624],"Iodine":[5212160],"Iridium":[5212672],"Iron":[5213184],"Iron Bars":[5275648],"Iron Block":[5275136],"Iron Door":[5276160,5276161,5276162,5276163,5276164,5276165,5276166,5276167,5276168,5276169,5276170,5276171,5276172,5276173,5276174,5276175,5276176,5276177,5276178,5276179,5276180,5276181,5276182,5276183,5276184,5276185,5276186,5276187,5276188,5276189,5276190,5276191],"Iron Ore":[5276672],"Iron Trapdoor":[5277184,5277185,5277186,5277187,5277188,5277189,5277190,5277191,5277192,5277193,5277194,5277195,5277196,5277197,5277198,5277199],"Item Frame":[5277696,5277697,5277698,5277699,5277700,5277701,5277704,5277705,5277706,5277707,5277708,5277709],"Jack o'Lantern":[5294592,5294593,5294594,5294595],"Jukebox":[5278208],"Jungle Button":[5278720,5278721,5278722,5278723,5278724,5278725,5278728,5278729,5278730,5278731,5278732,5278733],"Jungle Door":[5279232,5279233,5279234,5279235,5279236,5279237,5279238,5279239,5279240,5279241,5279242,5279243,5279244,5279245,5279246,5279247,5279248,5279249,5279250,5279251,5279252,5279253,5279254,5279255,5279256,5279257,5279258,5279259,5279260,5279261,5279262,5279263],"Jungle Fence":[5279744],"Jungle Fence Gate":[5280256,5280257,5280258,5280259,5280260,5280261,5280262,5280263,5280264,5280265,5280266,5280267,5280268,5280269,5280270,5280271],"Jungle Leaves":[5280768,5280769,5280770,5280771],"Jungle Log":[5281280,5281281,5281282,5281283,5281284,5281285],"Jungle Planks":[5281792],"Jungle Pressure Plate":[5282304,5282305],"Jungle Sapling":[5282816,5282817],"Jungle Sign":[5283328,5283329,5283330,5283331,5283332,5283333,5283334,5283335,5283336,5283337,5283338,5283339,5283340,5283341,5283342,5283343],"Jungle Slab":[5283840,5283841,5283842],"Jungle Stairs":[5284352,5284353,5284354,5284355,5284356,5284357,5284358,5284359],"Jungle Trapdoor":[5284864,5284865,5284866,5284867,5284868,5284869,5284870,5284871,5284872,5284873,5284874,5284875,5284876,5284877,5284878,5284879],"Jungle Wall Sign":[5285376,5285377,5285378,5285379],"Jungle Wood":[5285888,5285889,5285890,5285891,5285892,5285893],"Krypton":[5213696],"Lab Table":[5286400,5286401,5286402,5286403],"Ladder":[5286912,5286913,5286914,5286915],"Lantern":[5287424,5287425],"Lanthanum":[5214208],"Lapis Lazuli Block":[5287936],"Lapis Lazuli Ore":[5288448],"Large Fern":[5288960,5288961],"Lava":[5289472,5289473,5289474,5289475,5289476,5289477,5289478,5289479,5289480,5289481,5289482,5289483,5289484,5289485,5289486,5289487,5289488,5289489,5289490,5289491,5289492,5289493,5289494,5289495,5289496,5289497,5289498,5289499,5289500,5289501,5289502,5289503],"Lava Cauldron":[5464064,5464065,5464066,5464067,5464068,5464069],"Lawrencium":[5214720],"Lead":[5215232],"Lectern":[5289984,5289985,5289986,5289987,5289988,5289989,5289990,5289991],"Legacy Stonecutter":[5290496],"Lever":[5291008,5291009,5291010,5291011,5291012,5291013,5291014,5291015,5291016,5291017,5291018,5291019,5291020,5291021,5291022,5291023],"Light Block":[5407232,5407233,5407234,5407235,5407236,5407237,5407238,5407239,5407240,5407241,5407242,5407243,5407244,5407245,5407246,5407247],"Lightning Rod":[5455360,5455361,5455362,5455363,5455364,5455365],"Lilac":[5292544,5292545],"Lily Pad":[5293568],"Lily of the Valley":[5293056],"Lithium":[5215744],"Livermorium":[5216256],"Loom":[5295104,5295105,5295106,5295107],"Lutetium":[5216768],"Magma Block":[5296128],"Magnesium":[5217280],"Manganese":[5217792],"Mangrove Button":[5433856,5433857,5433858,5433859,5433860,5433861,5433864,5433865,5433866,5433867,5433868,5433869],"Mangrove Door":[5436928,5436929,5436930,5436931,5436932,5436933,5436934,5436935,5436936,5436937,5436938,5436939,5436940,5436941,5436942,5436943,5436944,5436945,5436946,5436947,5436948,5436949,5436950,5436951,5436952,5436953,5436954,5436955,5436956,5436957,5436958,5436959],"Mangrove Fence":[5426176],"Mangrove Fence Gate":[5438464,5438465,5438466,5438467,5438468,5438469,5438470,5438471,5438472,5438473,5438474,5438475,5438476,5438477,5438478,5438479],"Mangrove Leaves":[5470720,5470721,5470722,5470723],"Mangrove Log":[5429248,5429249,5429250,5429251,5429252,5429253],"Mangrove Planks":[5424640],"Mangrove Pressure Plate":[5435392,5435393],"Mangrove Roots":[5466624],"Mangrove Sign":[5441536,5441537,5441538,5441539,5441540,5441541,5441542,5441543,5441544,5441545,5441546,5441547,5441548,5441549,5441550,5441551],"Mangrove Slab":[5427712,5427713,5427714],"Mangrove Stairs":[5440000,5440001,5440002,5440003,5440004,5440005,5440006,5440007],"Mangrove Trapdoor":[5432320,5432321,5432322,5432323,5432324,5432325,5432326,5432327,5432328,5432329,5432330,5432331,5432332,5432333,5432334,5432335],"Mangrove Wall Sign":[5443072,5443073,5443074,5443075],"Mangrove Wood":[5430784,5430785,5430786,5430787,5430788,5430789],"Material Reducer":[5296640,5296641,5296642,5296643],"Meitnerium":[5218304],"Melon Block":[5297152],"Melon Stem":[5297664,5297665,5297666,5297667,5297668,5297669,5297670,5297671],"Mendelevium":[5218816],"Mercury":[5219328],"Mob Head":[5298184,5298185,5298186,5298187,5298188,5298189,5298192,5298193,5298194,5298195,5298196,5298197,5298200,5298201,5298202,5298203,5298204,5298205,5298208,5298209,5298210,5298211,5298212,5298213,5298216,5298217,5298218,5298219,5298220,5298221],"Molybdenum":[5219840],"Monster Spawner":[5298688],"Moscovium":[5220352],"Mossy Cobblestone":[5299200],"Mossy Cobblestone Slab":[5299712,5299713,5299714],"Mossy Cobblestone Stairs":[5300224,5300225,5300226,5300227,5300228,5300229,5300230,5300231],"Mossy Cobblestone Wall":[5300736,5300737,5300738,5300740,5300741,5300742,5300744,5300745,5300746,5300752,5300753,5300754,5300756,5300757,5300758,5300760,5300761,5300762,5300768,5300769,5300770,5300772,5300773,5300774,5300776,5300777,5300778,5300800,5300801,5300802,5300804,5300805,5300806,5300808,5300809,5300810,5300816,5300817,5300818,5300820,5300821,5300822,5300824,5300825,5300826,5300832,5300833,5300834,5300836,5300837,5300838,5300840,5300841,5300842,5300864,5300865,5300866,5300868,5300869,5300870,5300872,5300873,5300874,5300880,5300881,5300882,5300884,5300885,5300886,5300888,5300889,5300890,5300896,5300897,5300898,5300900,5300901,5300902,5300904,5300905,5300906,5300992,5300993,5300994,5300996,5300997,5300998,5301000,5301001,5301002,5301008,5301009,5301010,5301012,5301013,5301014,5301016,5301017,5301018,5301024,5301025,5301026,5301028,5301029,5301030,5301032,5301033,5301034,5301056,5301057,5301058,5301060,5301061,5301062,5301064,5301065,5301066,5301072,5301073,5301074,5301076,5301077,5301078,5301080,5301081,5301082,5301088,5301089,5301090,5301092,5301093,5301094,5301096,5301097,5301098,5301120,5301121,5301122,5301124,5301125,5301126,5301128,5301129,5301130,5301136,5301137,5301138,5301140,5301141,5301142,5301144,5301145,5301146,5301152,5301153,5301154,5301156,5301157,5301158,5301160,5301161,5301162],"Mossy Stone Brick Slab":[5301248,5301249,5301250],"Mossy Stone Brick Stairs":[5301760,5301761,5301762,5301763,5301764,5301765,5301766,5301767],"Mossy Stone Brick Wall":[5302272,5302273,5302274,5302276,5302277,5302278,5302280,5302281,5302282,5302288,5302289,5302290,5302292,5302293,5302294,5302296,5302297,5302298,5302304,5302305,5302306,5302308,5302309,5302310,5302312,5302313,5302314,5302336,5302337,5302338,5302340,5302341,5302342,5302344,5302345,5302346,5302352,5302353,5302354,5302356,5302357,5302358,5302360,5302361,5302362,5302368,5302369,5302370,5302372,5302373,5302374,5302376,5302377,5302378,5302400,5302401,5302402,5302404,5302405,5302406,5302408,5302409,5302410,5302416,5302417,5302418,5302420,5302421,5302422,5302424,5302425,5302426,5302432,5302433,5302434,5302436,5302437,5302438,5302440,5302441,5302442,5302528,5302529,5302530,5302532,5302533,5302534,5302536,5302537,5302538,5302544,5302545,5302546,5302548,5302549,5302550,5302552,5302553,5302554,5302560,5302561,5302562,5302564,5302565,5302566,5302568,5302569,5302570,5302592,5302593,5302594,5302596,5302597,5302598,5302600,5302601,5302602,5302608,5302609,5302610,5302612,5302613,5302614,5302616,5302617,5302618,5302624,5302625,5302626,5302628,5302629,5302630,5302632,5302633,5302634,5302656,5302657,5302658,5302660,5302661,5302662,5302664,5302665,5302666,5302672,5302673,5302674,5302676,5302677,5302678,5302680,5302681,5302682,5302688,5302689,5302690,5302692,5302693,5302694,5302696,5302697,5302698],"Mossy Stone Bricks":[5302784],"Mud":[5450752],"Mud Brick Slab":[5451776,5451777,5451778],"Mud Brick Stairs":[5452288,5452289,5452290,5452291,5452292,5452293,5452294,5452295],"Mud Brick Wall":[5452800,5452801,5452802,5452804,5452805,5452806,5452808,5452809,5452810,5452816,5452817,5452818,5452820,5452821,5452822,5452824,5452825,5452826,5452832,5452833,5452834,5452836,5452837,5452838,5452840,5452841,5452842,5452864,5452865,5452866,5452868,5452869,5452870,5452872,5452873,5452874,5452880,5452881,5452882,5452884,5452885,5452886,5452888,5452889,5452890,5452896,5452897,5452898,5452900,5452901,5452902,5452904,5452905,5452906,5452928,5452929,5452930,5452932,5452933,5452934,5452936,5452937,5452938,5452944,5452945,5452946,5452948,5452949,5452950,5452952,5452953,5452954,5452960,5452961,5452962,5452964,5452965,5452966,5452968,5452969,5452970,5453056,5453057,5453058,5453060,5453061,5453062,5453064,5453065,5453066,5453072,5453073,5453074,5453076,5453077,5453078,5453080,5453081,5453082,5453088,5453089,5453090,5453092,5453093,5453094,5453096,5453097,5453098,5453120,5453121,5453122,5453124,5453125,5453126,5453128,5453129,5453130,5453136,5453137,5453138,5453140,5453141,5453142,5453144,5453145,5453146,5453152,5453153,5453154,5453156,5453157,5453158,5453160,5453161,5453162,5453184,5453185,5453186,5453188,5453189,5453190,5453192,5453193,5453194,5453200,5453201,5453202,5453204,5453205,5453206,5453208,5453209,5453210,5453216,5453217,5453218,5453220,5453221,5453222,5453224,5453225,5453226],"Mud Bricks":[5451264],"Muddy Mangrove Roots":[5467136,5467137,5467138],"Mushroom Stem":[5303296],"Mycelium":[5303808],"Neodymium":[5220864],"Neon":[5221376],"Neptunium":[5221888],"Nether Brick Fence":[5304320],"Nether Brick Slab":[5304832,5304833,5304834],"Nether Brick Stairs":[5305344,5305345,5305346,5305347,5305348,5305349,5305350,5305351],"Nether Brick Wall":[5305856,5305857,5305858,5305860,5305861,5305862,5305864,5305865,5305866,5305872,5305873,5305874,5305876,5305877,5305878,5305880,5305881,5305882,5305888,5305889,5305890,5305892,5305893,5305894,5305896,5305897,5305898,5305920,5305921,5305922,5305924,5305925,5305926,5305928,5305929,5305930,5305936,5305937,5305938,5305940,5305941,5305942,5305944,5305945,5305946,5305952,5305953,5305954,5305956,5305957,5305958,5305960,5305961,5305962,5305984,5305985,5305986,5305988,5305989,5305990,5305992,5305993,5305994,5306000,5306001,5306002,5306004,5306005,5306006,5306008,5306009,5306010,5306016,5306017,5306018,5306020,5306021,5306022,5306024,5306025,5306026,5306112,5306113,5306114,5306116,5306117,5306118,5306120,5306121,5306122,5306128,5306129,5306130,5306132,5306133,5306134,5306136,5306137,5306138,5306144,5306145,5306146,5306148,5306149,5306150,5306152,5306153,5306154,5306176,5306177,5306178,5306180,5306181,5306182,5306184,5306185,5306186,5306192,5306193,5306194,5306196,5306197,5306198,5306200,5306201,5306202,5306208,5306209,5306210,5306212,5306213,5306214,5306216,5306217,5306218,5306240,5306241,5306242,5306244,5306245,5306246,5306248,5306249,5306250,5306256,5306257,5306258,5306260,5306261,5306262,5306264,5306265,5306266,5306272,5306273,5306274,5306276,5306277,5306278,5306280,5306281,5306282],"Nether Bricks":[5306368],"Nether Gold Ore":[5450240],"Nether Portal":[5306880,5306881],"Nether Quartz Ore":[5307392],"Nether Reactor Core":[5307904],"Nether Wart":[5308416,5308417,5308418,5308419],"Nether Wart Block":[5308928],"Netherite Block":[5462016],"Netherrack":[5309440],"Nickel":[5222400],"Nihonium":[5222912],"Niobium":[5223424],"Nitrogen":[5223936],"Nobelium":[5224448],"Note Block":[5309952],"Oak Button":[5310464,5310465,5310466,5310467,5310468,5310469,5310472,5310473,5310474,5310475,5310476,5310477],"Oak Door":[5310976,5310977,5310978,5310979,5310980,5310981,5310982,5310983,5310984,5310985,5310986,5310987,5310988,5310989,5310990,5310991,5310992,5310993,5310994,5310995,5310996,5310997,5310998,5310999,5311000,5311001,5311002,5311003,5311004,5311005,5311006,5311007],"Oak Fence":[5311488],"Oak Fence Gate":[5312000,5312001,5312002,5312003,5312004,5312005,5312006,5312007,5312008,5312009,5312010,5312011,5312012,5312013,5312014,5312015],"Oak Leaves":[5312512,5312513,5312514,5312515],"Oak Log":[5313024,5313025,5313026,5313027,5313028,5313029],"Oak Planks":[5313536],"Oak Pressure Plate":[5314048,5314049],"Oak Sapling":[5314560,5314561],"Oak Sign":[5315072,5315073,5315074,5315075,5315076,5315077,5315078,5315079,5315080,5315081,5315082,5315083,5315084,5315085,5315086,5315087],"Oak Slab":[5315584,5315585,5315586],"Oak Stairs":[5316096,5316097,5316098,5316099,5316100,5316101,5316102,5316103],"Oak Trapdoor":[5316608,5316609,5316610,5316611,5316612,5316613,5316614,5316615,5316616,5316617,5316618,5316619,5316620,5316621,5316622,5316623],"Oak Wall Sign":[5317120,5317121,5317122,5317123],"Oak Wood":[5317632,5317633,5317634,5317635,5317636,5317637],"Obsidian":[5318144],"Oganesson":[5224960],"Orange Tulip":[5319168],"Osmium":[5225472],"Oxeye Daisy":[5319680],"Oxygen":[5225984],"Packed Ice":[5320192],"Packed Mud":[5453312],"Palladium":[5226496],"Peony":[5320704,5320705],"Phosphorus":[5227008],"Pink Tulip":[5321728],"Platinum":[5227520],"Plutonium":[5228032],"Podzol":[5322240],"Polished Andesite":[5322752],"Polished Andesite Slab":[5323264,5323265,5323266],"Polished Andesite Stairs":[5323776,5323777,5323778,5323779,5323780,5323781,5323782,5323783],"Polished Basalt":[5398016,5398017,5398018],"Polished Blackstone":[5401088],"Polished Blackstone Brick Slab":[5405184,5405185,5405186],"Polished Blackstone Brick Stairs":[5405696,5405697,5405698,5405699,5405700,5405701,5405702,5405703],"Polished Blackstone Brick Wall":[5406208,5406209,5406210,5406212,5406213,5406214,5406216,5406217,5406218,5406224,5406225,5406226,5406228,5406229,5406230,5406232,5406233,5406234,5406240,5406241,5406242,5406244,5406245,5406246,5406248,5406249,5406250,5406272,5406273,5406274,5406276,5406277,5406278,5406280,5406281,5406282,5406288,5406289,5406290,5406292,5406293,5406294,5406296,5406297,5406298,5406304,5406305,5406306,5406308,5406309,5406310,5406312,5406313,5406314,5406336,5406337,5406338,5406340,5406341,5406342,5406344,5406345,5406346,5406352,5406353,5406354,5406356,5406357,5406358,5406360,5406361,5406362,5406368,5406369,5406370,5406372,5406373,5406374,5406376,5406377,5406378,5406464,5406465,5406466,5406468,5406469,5406470,5406472,5406473,5406474,5406480,5406481,5406482,5406484,5406485,5406486,5406488,5406489,5406490,5406496,5406497,5406498,5406500,5406501,5406502,5406504,5406505,5406506,5406528,5406529,5406530,5406532,5406533,5406534,5406536,5406537,5406538,5406544,5406545,5406546,5406548,5406549,5406550,5406552,5406553,5406554,5406560,5406561,5406562,5406564,5406565,5406566,5406568,5406569,5406570,5406592,5406593,5406594,5406596,5406597,5406598,5406600,5406601,5406602,5406608,5406609,5406610,5406612,5406613,5406614,5406616,5406617,5406618,5406624,5406625,5406626,5406628,5406629,5406630,5406632,5406633,5406634],"Polished Blackstone Bricks":[5404672],"Polished Blackstone Button":[5401600,5401601,5401602,5401603,5401604,5401605,5401608,5401609,5401610,5401611,5401612,5401613],"Polished Blackstone Pressure Plate":[5402112,5402113],"Polished Blackstone Slab":[5402624,5402625,5402626],"Polished Blackstone Stairs":[5403136,5403137,5403138,5403139,5403140,5403141,5403142,5403143],"Polished Blackstone Wall":[5403648,5403649,5403650,5403652,5403653,5403654,5403656,5403657,5403658,5403664,5403665,5403666,5403668,5403669,5403670,5403672,5403673,5403674,5403680,5403681,5403682,5403684,5403685,5403686,5403688,5403689,5403690,5403712,5403713,5403714,5403716,5403717,5403718,5403720,5403721,5403722,5403728,5403729,5403730,5403732,5403733,5403734,5403736,5403737,5403738,5403744,5403745,5403746,5403748,5403749,5403750,5403752,5403753,5403754,5403776,5403777,5403778,5403780,5403781,5403782,5403784,5403785,5403786,5403792,5403793,5403794,5403796,5403797,5403798,5403800,5403801,5403802,5403808,5403809,5403810,5403812,5403813,5403814,5403816,5403817,5403818,5403904,5403905,5403906,5403908,5403909,5403910,5403912,5403913,5403914,5403920,5403921,5403922,5403924,5403925,5403926,5403928,5403929,5403930,5403936,5403937,5403938,5403940,5403941,5403942,5403944,5403945,5403946,5403968,5403969,5403970,5403972,5403973,5403974,5403976,5403977,5403978,5403984,5403985,5403986,5403988,5403989,5403990,5403992,5403993,5403994,5404000,5404001,5404002,5404004,5404005,5404006,5404008,5404009,5404010,5404032,5404033,5404034,5404036,5404037,5404038,5404040,5404041,5404042,5404048,5404049,5404050,5404052,5404053,5404054,5404056,5404057,5404058,5404064,5404065,5404066,5404068,5404069,5404070,5404072,5404073,5404074],"Polished Deepslate":[5417472],"Polished Deepslate Slab":[5417984,5417985,5417986],"Polished Deepslate Stairs":[5418496,5418497,5418498,5418499,5418500,5418501,5418502,5418503],"Polished Deepslate Wall":[5419008,5419009,5419010,5419012,5419013,5419014,5419016,5419017,5419018,5419024,5419025,5419026,5419028,5419029,5419030,5419032,5419033,5419034,5419040,5419041,5419042,5419044,5419045,5419046,5419048,5419049,5419050,5419072,5419073,5419074,5419076,5419077,5419078,5419080,5419081,5419082,5419088,5419089,5419090,5419092,5419093,5419094,5419096,5419097,5419098,5419104,5419105,5419106,5419108,5419109,5419110,5419112,5419113,5419114,5419136,5419137,5419138,5419140,5419141,5419142,5419144,5419145,5419146,5419152,5419153,5419154,5419156,5419157,5419158,5419160,5419161,5419162,5419168,5419169,5419170,5419172,5419173,5419174,5419176,5419177,5419178,5419264,5419265,5419266,5419268,5419269,5419270,5419272,5419273,5419274,5419280,5419281,5419282,5419284,5419285,5419286,5419288,5419289,5419290,5419296,5419297,5419298,5419300,5419301,5419302,5419304,5419305,5419306,5419328,5419329,5419330,5419332,5419333,5419334,5419336,5419337,5419338,5419344,5419345,5419346,5419348,5419349,5419350,5419352,5419353,5419354,5419360,5419361,5419362,5419364,5419365,5419366,5419368,5419369,5419370,5419392,5419393,5419394,5419396,5419397,5419398,5419400,5419401,5419402,5419408,5419409,5419410,5419412,5419413,5419414,5419416,5419417,5419418,5419424,5419425,5419426,5419428,5419429,5419430,5419432,5419433,5419434],"Polished Diorite":[5324288],"Polished Diorite Slab":[5324800,5324801,5324802],"Polished Diorite Stairs":[5325312,5325313,5325314,5325315,5325316,5325317,5325318,5325319],"Polished Granite":[5325824],"Polished Granite Slab":[5326336,5326337,5326338],"Polished Granite Stairs":[5326848,5326849,5326850,5326851,5326852,5326853,5326854,5326855],"Polonium":[5228544],"Poppy":[5327360],"Potassium":[5229056],"Potato Block":[5327872,5327873,5327874,5327875,5327876,5327877,5327878,5327879],"Potion Cauldron":[5464576,5464577,5464578,5464579,5464580,5464581],"Powered Rail":[5328384,5328385,5328386,5328387,5328388,5328389,5328392,5328393,5328394,5328395,5328396,5328397],"Praseodymium":[5229568],"Prismarine":[5328896],"Prismarine Bricks":[5329408],"Prismarine Bricks Slab":[5329920,5329921,5329922],"Prismarine Bricks Stairs":[5330432,5330433,5330434,5330435,5330436,5330437,5330438,5330439],"Prismarine Slab":[5330944,5330945,5330946],"Prismarine Stairs":[5331456,5331457,5331458,5331459,5331460,5331461,5331462,5331463],"Prismarine Wall":[5331968,5331969,5331970,5331972,5331973,5331974,5331976,5331977,5331978,5331984,5331985,5331986,5331988,5331989,5331990,5331992,5331993,5331994,5332000,5332001,5332002,5332004,5332005,5332006,5332008,5332009,5332010,5332032,5332033,5332034,5332036,5332037,5332038,5332040,5332041,5332042,5332048,5332049,5332050,5332052,5332053,5332054,5332056,5332057,5332058,5332064,5332065,5332066,5332068,5332069,5332070,5332072,5332073,5332074,5332096,5332097,5332098,5332100,5332101,5332102,5332104,5332105,5332106,5332112,5332113,5332114,5332116,5332117,5332118,5332120,5332121,5332122,5332128,5332129,5332130,5332132,5332133,5332134,5332136,5332137,5332138,5332224,5332225,5332226,5332228,5332229,5332230,5332232,5332233,5332234,5332240,5332241,5332242,5332244,5332245,5332246,5332248,5332249,5332250,5332256,5332257,5332258,5332260,5332261,5332262,5332264,5332265,5332266,5332288,5332289,5332290,5332292,5332293,5332294,5332296,5332297,5332298,5332304,5332305,5332306,5332308,5332309,5332310,5332312,5332313,5332314,5332320,5332321,5332322,5332324,5332325,5332326,5332328,5332329,5332330,5332352,5332353,5332354,5332356,5332357,5332358,5332360,5332361,5332362,5332368,5332369,5332370,5332372,5332373,5332374,5332376,5332377,5332378,5332384,5332385,5332386,5332388,5332389,5332390,5332392,5332393,5332394],"Promethium":[5230080],"Protactinium":[5230592],"Pumpkin":[5332480],"Pumpkin Stem":[5332992,5332993,5332994,5332995,5332996,5332997,5332998,5332999],"Purple Torch":[5334017,5334018,5334019,5334020,5334021],"Purpur Block":[5334528],"Purpur Pillar":[5335040,5335041,5335042],"Purpur Slab":[5335552,5335553,5335554],"Purpur Stairs":[5336064,5336065,5336066,5336067,5336068,5336069,5336070,5336071],"Quartz Block":[5336576],"Quartz Bricks":[5419520],"Quartz Pillar":[5337088,5337089,5337090],"Quartz Slab":[5337600,5337601,5337602],"Quartz Stairs":[5338112,5338113,5338114,5338115,5338116,5338117,5338118,5338119],"Radium":[5231104],"Radon":[5231616],"Rail":[5338624,5338625,5338626,5338627,5338628,5338629,5338630,5338631,5338632,5338633],"Raw Copper Block":[5407744],"Raw Gold Block":[5408256],"Raw Iron Block":[5408768],"Red Mushroom":[5339648],"Red Mushroom Block":[5340160,5340161,5340162,5340163,5340164,5340165,5340166,5340167,5340168,5340169,5340170],"Red Nether Brick Slab":[5340672,5340673,5340674],"Red Nether Brick Stairs":[5341184,5341185,5341186,5341187,5341188,5341189,5341190,5341191],"Red Nether Brick Wall":[5341696,5341697,5341698,5341700,5341701,5341702,5341704,5341705,5341706,5341712,5341713,5341714,5341716,5341717,5341718,5341720,5341721,5341722,5341728,5341729,5341730,5341732,5341733,5341734,5341736,5341737,5341738,5341760,5341761,5341762,5341764,5341765,5341766,5341768,5341769,5341770,5341776,5341777,5341778,5341780,5341781,5341782,5341784,5341785,5341786,5341792,5341793,5341794,5341796,5341797,5341798,5341800,5341801,5341802,5341824,5341825,5341826,5341828,5341829,5341830,5341832,5341833,5341834,5341840,5341841,5341842,5341844,5341845,5341846,5341848,5341849,5341850,5341856,5341857,5341858,5341860,5341861,5341862,5341864,5341865,5341866,5341952,5341953,5341954,5341956,5341957,5341958,5341960,5341961,5341962,5341968,5341969,5341970,5341972,5341973,5341974,5341976,5341977,5341978,5341984,5341985,5341986,5341988,5341989,5341990,5341992,5341993,5341994,5342016,5342017,5342018,5342020,5342021,5342022,5342024,5342025,5342026,5342032,5342033,5342034,5342036,5342037,5342038,5342040,5342041,5342042,5342048,5342049,5342050,5342052,5342053,5342054,5342056,5342057,5342058,5342080,5342081,5342082,5342084,5342085,5342086,5342088,5342089,5342090,5342096,5342097,5342098,5342100,5342101,5342102,5342104,5342105,5342106,5342112,5342113,5342114,5342116,5342117,5342118,5342120,5342121,5342122],"Red Nether Bricks":[5342208],"Red Sand":[5342720],"Red Sandstone":[5343232],"Red Sandstone Slab":[5343744,5343745,5343746],"Red Sandstone Stairs":[5344256,5344257,5344258,5344259,5344260,5344261,5344262,5344263],"Red Sandstone Wall":[5344768,5344769,5344770,5344772,5344773,5344774,5344776,5344777,5344778,5344784,5344785,5344786,5344788,5344789,5344790,5344792,5344793,5344794,5344800,5344801,5344802,5344804,5344805,5344806,5344808,5344809,5344810,5344832,5344833,5344834,5344836,5344837,5344838,5344840,5344841,5344842,5344848,5344849,5344850,5344852,5344853,5344854,5344856,5344857,5344858,5344864,5344865,5344866,5344868,5344869,5344870,5344872,5344873,5344874,5344896,5344897,5344898,5344900,5344901,5344902,5344904,5344905,5344906,5344912,5344913,5344914,5344916,5344917,5344918,5344920,5344921,5344922,5344928,5344929,5344930,5344932,5344933,5344934,5344936,5344937,5344938,5345024,5345025,5345026,5345028,5345029,5345030,5345032,5345033,5345034,5345040,5345041,5345042,5345044,5345045,5345046,5345048,5345049,5345050,5345056,5345057,5345058,5345060,5345061,5345062,5345064,5345065,5345066,5345088,5345089,5345090,5345092,5345093,5345094,5345096,5345097,5345098,5345104,5345105,5345106,5345108,5345109,5345110,5345112,5345113,5345114,5345120,5345121,5345122,5345124,5345125,5345126,5345128,5345129,5345130,5345152,5345153,5345154,5345156,5345157,5345158,5345160,5345161,5345162,5345168,5345169,5345170,5345172,5345173,5345174,5345176,5345177,5345178,5345184,5345185,5345186,5345188,5345189,5345190,5345192,5345193,5345194],"Red Torch":[5345281,5345282,5345283,5345284,5345285],"Red Tulip":[5345792],"Redstone":[5349376,5349377,5349378,5349379,5349380,5349381,5349382,5349383,5349384,5349385,5349386,5349387,5349388,5349389,5349390,5349391],"Redstone Block":[5346304],"Redstone Comparator":[5346816,5346817,5346818,5346819,5346820,5346821,5346822,5346823,5346824,5346825,5346826,5346827,5346828,5346829,5346830,5346831],"Redstone Lamp":[5347328,5347329],"Redstone Ore":[5347840,5347841],"Redstone Repeater":[5348352,5348353,5348354,5348355,5348356,5348357,5348358,5348359,5348360,5348361,5348362,5348363,5348364,5348365,5348366,5348367,5348368,5348369,5348370,5348371,5348372,5348373,5348374,5348375,5348376,5348377,5348378,5348379,5348380,5348381,5348382,5348383],"Redstone Torch":[5348865,5348866,5348867,5348868,5348869,5348873,5348874,5348875,5348876,5348877],"Reinforced Deepslate":[5472256],"Rhenium":[5232128],"Rhodium":[5232640],"Roentgenium":[5233152],"Rose Bush":[5350400,5350401],"Rubidium":[5233664],"Ruthenium":[5234176],"Rutherfordium":[5234688],"Samarium":[5235200],"Sand":[5350912],"Sandstone":[5351424],"Sandstone Slab":[5351936,5351937,5351938],"Sandstone Stairs":[5352448,5352449,5352450,5352451,5352452,5352453,5352454,5352455],"Sandstone Wall":[5352960,5352961,5352962,5352964,5352965,5352966,5352968,5352969,5352970,5352976,5352977,5352978,5352980,5352981,5352982,5352984,5352985,5352986,5352992,5352993,5352994,5352996,5352997,5352998,5353000,5353001,5353002,5353024,5353025,5353026,5353028,5353029,5353030,5353032,5353033,5353034,5353040,5353041,5353042,5353044,5353045,5353046,5353048,5353049,5353050,5353056,5353057,5353058,5353060,5353061,5353062,5353064,5353065,5353066,5353088,5353089,5353090,5353092,5353093,5353094,5353096,5353097,5353098,5353104,5353105,5353106,5353108,5353109,5353110,5353112,5353113,5353114,5353120,5353121,5353122,5353124,5353125,5353126,5353128,5353129,5353130,5353216,5353217,5353218,5353220,5353221,5353222,5353224,5353225,5353226,5353232,5353233,5353234,5353236,5353237,5353238,5353240,5353241,5353242,5353248,5353249,5353250,5353252,5353253,5353254,5353256,5353257,5353258,5353280,5353281,5353282,5353284,5353285,5353286,5353288,5353289,5353290,5353296,5353297,5353298,5353300,5353301,5353302,5353304,5353305,5353306,5353312,5353313,5353314,5353316,5353317,5353318,5353320,5353321,5353322,5353344,5353345,5353346,5353348,5353349,5353350,5353352,5353353,5353354,5353360,5353361,5353362,5353364,5353365,5353366,5353368,5353369,5353370,5353376,5353377,5353378,5353380,5353381,5353382,5353384,5353385,5353386],"Scandium":[5235712],"Sculk":[5469696],"Sea Lantern":[5353472],"Sea Pickle":[5353984,5353985,5353986,5353987,5353988,5353989,5353990,5353991],"Seaborgium":[5236224],"Selenium":[5236736],"Shroomlight":[5424128],"Shulker Box":[5354496],"Silicon":[5237248],"Silver":[5237760],"Slime Block":[5355008],"Smithing Table":[5461504],"Smoker":[5355520,5355521,5355522,5355523,5355524,5355525,5355526,5355527],"Smooth Basalt":[5398528],"Smooth Quartz Block":[5356032],"Smooth Quartz Slab":[5356544,5356545,5356546],"Smooth Quartz Stairs":[5357056,5357057,5357058,5357059,5357060,5357061,5357062,5357063],"Smooth Red Sandstone":[5357568],"Smooth Red Sandstone Slab":[5358080,5358081,5358082],"Smooth Red Sandstone Stairs":[5358592,5358593,5358594,5358595,5358596,5358597,5358598,5358599],"Smooth Sandstone":[5359104],"Smooth Sandstone Slab":[5359616,5359617,5359618],"Smooth Sandstone Stairs":[5360128,5360129,5360130,5360131,5360132,5360133,5360134,5360135],"Smooth Stone":[5360640],"Smooth Stone Slab":[5361152,5361153,5361154],"Snow Block":[5361664],"Snow Layer":[5362176,5362177,5362178,5362179,5362180,5362181,5362182,5362183],"Sodium":[5238272],"Soul Fire":[5423616],"Soul Lantern":[5422592,5422593],"Soul Sand":[5362688],"Soul Soil":[5423104],"Soul Torch":[5422081,5422082,5422083,5422084,5422085],"Sponge":[5363200,5363201],"Spore Blossom":[5462528],"Spruce Button":[5363712,5363713,5363714,5363715,5363716,5363717,5363720,5363721,5363722,5363723,5363724,5363725],"Spruce Door":[5364224,5364225,5364226,5364227,5364228,5364229,5364230,5364231,5364232,5364233,5364234,5364235,5364236,5364237,5364238,5364239,5364240,5364241,5364242,5364243,5364244,5364245,5364246,5364247,5364248,5364249,5364250,5364251,5364252,5364253,5364254,5364255],"Spruce Fence":[5364736],"Spruce Fence Gate":[5365248,5365249,5365250,5365251,5365252,5365253,5365254,5365255,5365256,5365257,5365258,5365259,5365260,5365261,5365262,5365263],"Spruce Leaves":[5365760,5365761,5365762,5365763],"Spruce Log":[5366272,5366273,5366274,5366275,5366276,5366277],"Spruce Planks":[5366784],"Spruce Pressure Plate":[5367296,5367297],"Spruce Sapling":[5367808,5367809],"Spruce Sign":[5368320,5368321,5368322,5368323,5368324,5368325,5368326,5368327,5368328,5368329,5368330,5368331,5368332,5368333,5368334,5368335],"Spruce Slab":[5368832,5368833,5368834],"Spruce Stairs":[5369344,5369345,5369346,5369347,5369348,5369349,5369350,5369351],"Spruce Trapdoor":[5369856,5369857,5369858,5369859,5369860,5369861,5369862,5369863,5369864,5369865,5369866,5369867,5369868,5369869,5369870,5369871],"Spruce Wall Sign":[5370368,5370369,5370370,5370371],"Spruce Wood":[5370880,5370881,5370882,5370883,5370884,5370885],"Stained Clay":[5371392,5371393,5371394,5371395,5371396,5371397,5371398,5371399,5371400,5371401,5371402,5371403,5371404,5371405,5371406,5371407],"Stained Glass":[5371904,5371905,5371906,5371907,5371908,5371909,5371910,5371911,5371912,5371913,5371914,5371915,5371916,5371917,5371918,5371919],"Stained Glass Pane":[5372416,5372417,5372418,5372419,5372420,5372421,5372422,5372423,5372424,5372425,5372426,5372427,5372428,5372429,5372430,5372431],"Stained Hardened Glass":[5372928,5372929,5372930,5372931,5372932,5372933,5372934,5372935,5372936,5372937,5372938,5372939,5372940,5372941,5372942,5372943],"Stained Hardened Glass Pane":[5373440,5373441,5373442,5373443,5373444,5373445,5373446,5373447,5373448,5373449,5373450,5373451,5373452,5373453,5373454,5373455],"Stone":[5373952],"Stone Brick Slab":[5374464,5374465,5374466],"Stone Brick Stairs":[5374976,5374977,5374978,5374979,5374980,5374981,5374982,5374983],"Stone Brick Wall":[5375488,5375489,5375490,5375492,5375493,5375494,5375496,5375497,5375498,5375504,5375505,5375506,5375508,5375509,5375510,5375512,5375513,5375514,5375520,5375521,5375522,5375524,5375525,5375526,5375528,5375529,5375530,5375552,5375553,5375554,5375556,5375557,5375558,5375560,5375561,5375562,5375568,5375569,5375570,5375572,5375573,5375574,5375576,5375577,5375578,5375584,5375585,5375586,5375588,5375589,5375590,5375592,5375593,5375594,5375616,5375617,5375618,5375620,5375621,5375622,5375624,5375625,5375626,5375632,5375633,5375634,5375636,5375637,5375638,5375640,5375641,5375642,5375648,5375649,5375650,5375652,5375653,5375654,5375656,5375657,5375658,5375744,5375745,5375746,5375748,5375749,5375750,5375752,5375753,5375754,5375760,5375761,5375762,5375764,5375765,5375766,5375768,5375769,5375770,5375776,5375777,5375778,5375780,5375781,5375782,5375784,5375785,5375786,5375808,5375809,5375810,5375812,5375813,5375814,5375816,5375817,5375818,5375824,5375825,5375826,5375828,5375829,5375830,5375832,5375833,5375834,5375840,5375841,5375842,5375844,5375845,5375846,5375848,5375849,5375850,5375872,5375873,5375874,5375876,5375877,5375878,5375880,5375881,5375882,5375888,5375889,5375890,5375892,5375893,5375894,5375896,5375897,5375898,5375904,5375905,5375906,5375908,5375909,5375910,5375912,5375913,5375914],"Stone Bricks":[5376000],"Stone Button":[5376512,5376513,5376514,5376515,5376516,5376517,5376520,5376521,5376522,5376523,5376524,5376525],"Stone Pressure Plate":[5377024,5377025],"Stone Slab":[5377536,5377537,5377538],"Stone Stairs":[5378048,5378049,5378050,5378051,5378052,5378053,5378054,5378055],"Stonecutter":[5378560,5378561,5378562,5378563],"Strontium":[5238784],"Sugarcane":[5385216,5385217,5385218,5385219,5385220,5385221,5385222,5385223,5385224,5385225,5385226,5385227,5385228,5385229,5385230,5385231],"Sulfur":[5239296],"Sunflower":[5385728,5385729],"Sweet Berry Bush":[5386240,5386241,5386242,5386243],"TNT":[5387264,5387265,5387266,5387267],"Tall Grass":[5386752],"Tantalum":[5239808],"Technetium":[5240320],"Tellurium":[5240832],"Tennessine":[5241344],"Terbium":[5241856],"Thallium":[5242368],"Thorium":[5242880],"Thulium":[5243392],"Tin":[5243904],"Tinted Glass":[5444608],"Titanium":[5244416],"Torch":[5387777,5387778,5387779,5387780,5387781],"Trapped Chest":[5388288,5388289,5388290,5388291],"Tripwire":[5388800,5388801,5388802,5388803,5388804,5388805,5388806,5388807,5388808,5388809,5388810,5388811,5388812,5388813,5388814,5388815],"Tripwire Hook":[5389312,5389313,5389314,5389315,5389316,5389317,5389318,5389319,5389320,5389321,5389322,5389323,5389324,5389325,5389326,5389327],"Tuff":[5421568],"Tungsten":[5244928],"Twisting Vines":[5468160,5468161,5468162,5468163,5468164,5468165,5468166,5468167,5468168,5468169,5468170,5468171,5468172,5468173,5468174,5468175,5468176,5468177,5468178,5468179,5468180,5468181,5468182,5468183,5468184,5468185],"Underwater Torch":[5389825,5389826,5389827,5389828,5389829],"Uranium":[5245440],"Vanadium":[5245952],"Vines":[5390336,5390337,5390338,5390339,5390340,5390341,5390342,5390343,5390344,5390345,5390346,5390347,5390348,5390349,5390350,5390351],"Wall Banner":[5390848,5390849,5390850,5390851,5390852,5390853,5390854,5390855,5390856,5390857,5390858,5390859,5390860,5390861,5390862,5390863,5390864,5390865,5390866,5390867,5390868,5390869,5390870,5390871,5390872,5390873,5390874,5390875,5390876,5390877,5390878,5390879,5390880,5390881,5390882,5390883,5390884,5390885,5390886,5390887,5390888,5390889,5390890,5390891,5390892,5390893,5390894,5390895,5390896,5390897,5390898,5390899,5390900,5390901,5390902,5390903,5390904,5390905,5390906,5390907,5390908,5390909,5390910,5390911],"Wall Coral Fan":[5391360,5391361,5391362,5391363,5391364,5391368,5391369,5391370,5391371,5391372,5391376,5391377,5391378,5391379,5391380,5391384,5391385,5391386,5391387,5391388,5391392,5391393,5391394,5391395,5391396,5391400,5391401,5391402,5391403,5391404,5391408,5391409,5391410,5391411,5391412,5391416,5391417,5391418,5391419,5391420],"Warped Button":[5434880,5434881,5434882,5434883,5434884,5434885,5434888,5434889,5434890,5434891,5434892,5434893],"Warped Door":[5437952,5437953,5437954,5437955,5437956,5437957,5437958,5437959,5437960,5437961,5437962,5437963,5437964,5437965,5437966,5437967,5437968,5437969,5437970,5437971,5437972,5437973,5437974,5437975,5437976,5437977,5437978,5437979,5437980,5437981,5437982,5437983],"Warped Fence":[5427200],"Warped Fence Gate":[5439488,5439489,5439490,5439491,5439492,5439493,5439494,5439495,5439496,5439497,5439498,5439499,5439500,5439501,5439502,5439503],"Warped Hyphae":[5431808,5431809,5431810,5431811,5431812,5431813],"Warped Planks":[5425664],"Warped Pressure Plate":[5436416,5436417],"Warped Sign":[5442560,5442561,5442562,5442563,5442564,5442565,5442566,5442567,5442568,5442569,5442570,5442571,5442572,5442573,5442574,5442575],"Warped Slab":[5428736,5428737,5428738],"Warped Stairs":[5441024,5441025,5441026,5441027,5441028,5441029,5441030,5441031],"Warped Stem":[5430272,5430273,5430274,5430275,5430276,5430277],"Warped Trapdoor":[5433344,5433345,5433346,5433347,5433348,5433349,5433350,5433351,5433352,5433353,5433354,5433355,5433356,5433357,5433358,5433359],"Warped Wall Sign":[5444096,5444097,5444098,5444099],"Warped Wart Block":[5453824],"Water":[5391872,5391873,5391874,5391875,5391876,5391877,5391878,5391879,5391880,5391881,5391882,5391883,5391884,5391885,5391886,5391887,5391888,5391889,5391890,5391891,5391892,5391893,5391894,5391895,5391896,5391897,5391898,5391899,5391900,5391901,5391902,5391903],"Water Cauldron":[5463552,5463553,5463554,5463555,5463556,5463557],"Weeping Vines":[5468672,5468673,5468674,5468675,5468676,5468677,5468678,5468679,5468680,5468681,5468682,5468683,5468684,5468685,5468686,5468687,5468688,5468689,5468690,5468691,5468692,5468693,5468694,5468695,5468696,5468697],"Weighted Pressure Plate Heavy":[5392384,5392385,5392386,5392387,5392388,5392389,5392390,5392391,5392392,5392393,5392394,5392395,5392396,5392397,5392398,5392399],"Weighted Pressure Plate Light":[5392896,5392897,5392898,5392899,5392900,5392901,5392902,5392903,5392904,5392905,5392906,5392907,5392908,5392909,5392910,5392911],"Wheat Block":[5393408,5393409,5393410,5393411,5393412,5393413,5393414,5393415],"White Tulip":[5394432],"Wither Rose":[5459968],"Wool":[5394944,5394945,5394946,5394947,5394948,5394949,5394950,5394951,5394952,5394953,5394954,5394955,5394956,5394957,5394958,5394959],"Xenon":[5246464],"Ytterbium":[5246976],"Yttrium":[5247488],"Zinc":[5248512],"Zirconium":[5249024],"ate!upd":[5274112],"reserved6":[5349888],"update!":[5273600]},"stateDataBits":9} \ No newline at end of file +{"knownStates":{"???":[2624000],"Acacia Button":[2560256,2560257,2560258,2560259,2560260,2560261,2560264,2560265,2560266,2560267,2560268,2560269],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560768],"Acacia Fence Gate":[2561024,2561025,2561026,2561027,2561028,2561029,2561030,2561031,2561032,2561033,2561034,2561035,2561036,2561037,2561038,2561039],"Acacia Leaves":[2561280,2561281,2561282,2561283],"Acacia Log":[2561536,2561537,2561538,2561539,2561540,2561541],"Acacia Planks":[2561792],"Acacia Pressure Plate":[2562048,2562049],"Acacia Sapling":[2562304,2562305],"Acacia Sign":[2562560,2562561,2562562,2562563,2562564,2562565,2562566,2562567,2562568,2562569,2562570,2562571,2562572,2562573,2562574,2562575],"Acacia Slab":[2562816,2562817,2562818],"Acacia Stairs":[2563072,2563073,2563074,2563075,2563076,2563077,2563078,2563079],"Acacia Trapdoor":[2563328,2563329,2563330,2563331,2563332,2563333,2563334,2563335,2563336,2563337,2563338,2563339,2563340,2563341,2563342,2563343],"Acacia Wall Sign":[2563584,2563585,2563586,2563587],"Acacia Wood":[2563840,2563841,2563842,2563843,2563844,2563845],"Actinium":[2594048],"Activator Rail":[2564096,2564097,2564098,2564099,2564100,2564101,2564104,2564105,2564106,2564107,2564108,2564109],"Air":[2560000],"All Sided Mushroom Stem":[2564352],"Allium":[2564608],"Aluminum":[2594304],"Americium":[2594560],"Amethyst":[2698240],"Ancient Debris":[2698496],"Andesite":[2564864],"Andesite Slab":[2565120,2565121,2565122],"Andesite Stairs":[2565376,2565377,2565378,2565379,2565380,2565381,2565382,2565383],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565696,2565697,2565698,2565699,2565700,2565701,2565702,2565703,2565704,2565705,2565706,2565707,2565708,2565709,2565710,2565711,2565712,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565824,2565825,2565826,2565827,2565828,2565829,2565830,2565831,2565832,2565833,2565834,2565835,2565836,2565837,2565838,2565839,2565840],"Antimony":[2594816],"Anvil":[2565888,2565889,2565890,2565892,2565893,2565894,2565896,2565897,2565898,2565900,2565901,2565902],"Argon":[2595072],"Arsenic":[2595328],"Astatine":[2595584],"Azalea Leaves":[2735616,2735617,2735618,2735619],"Azure Bluet":[2566144],"Bamboo":[2566400,2566401,2566402,2566404,2566405,2566406,2566408,2566409,2566410,2566412,2566413,2566414],"Bamboo Sapling":[2566656,2566657],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595840],"Barrel":[2567168,2567169,2567170,2567171,2567172,2567173,2567176,2567177,2567178,2567179,2567180,2567181],"Barrier":[2567424],"Basalt":[2698752,2698753,2698754],"Beacon":[2567680],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568192,2568193],"Beetroot Block":[2568448,2568449,2568450,2568451,2568452,2568453,2568454,2568455],"Bell":[2568704,2568705,2568706,2568707,2568708,2568709,2568710,2568711,2568712,2568713,2568714,2568715,2568716,2568717,2568718,2568719],"Berkelium":[2596096],"Beryllium":[2596352],"Birch Button":[2568960,2568961,2568962,2568963,2568964,2568965,2568968,2568969,2568970,2568971,2568972,2568973],"Birch Door":[2569216,2569217,2569218,2569219,2569220,2569221,2569222,2569223,2569224,2569225,2569226,2569227,2569228,2569229,2569230,2569231,2569232,2569233,2569234,2569235,2569236,2569237,2569238,2569239,2569240,2569241,2569242,2569243,2569244,2569245,2569246,2569247],"Birch Fence":[2569472],"Birch Fence Gate":[2569728,2569729,2569730,2569731,2569732,2569733,2569734,2569735,2569736,2569737,2569738,2569739,2569740,2569741,2569742,2569743],"Birch Leaves":[2569984,2569985,2569986,2569987],"Birch Log":[2570240,2570241,2570242,2570243,2570244,2570245],"Birch Planks":[2570496],"Birch Pressure Plate":[2570752,2570753],"Birch Sapling":[2571008,2571009],"Birch Sign":[2571264,2571265,2571266,2571267,2571268,2571269,2571270,2571271,2571272,2571273,2571274,2571275,2571276,2571277,2571278,2571279],"Birch Slab":[2571520,2571521,2571522],"Birch Stairs":[2571776,2571777,2571778,2571779,2571780,2571781,2571782,2571783],"Birch Trapdoor":[2572032,2572033,2572034,2572035,2572036,2572037,2572038,2572039,2572040,2572041,2572042,2572043,2572044,2572045,2572046,2572047],"Birch Wall Sign":[2572288,2572289,2572290,2572291],"Birch Wood":[2572544,2572545,2572546,2572547,2572548,2572549],"Bismuth":[2596608],"Blackstone":[2699520],"Blackstone Slab":[2699776,2699777,2699778],"Blackstone Stairs":[2700032,2700033,2700034,2700035,2700036,2700037,2700038,2700039],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700352,2700353,2700354,2700355,2700356,2700357,2700358,2700359,2700360,2700361,2700362,2700363,2700364,2700365,2700366,2700367,2700368,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700480,2700481,2700482,2700483,2700484,2700485,2700486,2700487,2700488,2700489,2700490,2700491,2700492,2700493,2700494,2700495,2700496],"Blast Furnace":[2573056,2573057,2573058,2573059,2573060,2573061,2573062,2573063],"Blue Ice":[2573568],"Blue Orchid":[2573824],"Blue Torch":[2574081,2574082,2574083,2574084,2574085],"Bohrium":[2596864],"Bone Block":[2574336,2574337,2574338],"Bookshelf":[2574592],"Boron":[2597120],"Brewing Stand":[2574848,2574849,2574850,2574851,2574852,2574853,2574854,2574855],"Brick Slab":[2575104,2575105,2575106],"Brick Stairs":[2575360,2575361,2575362,2575363,2575364,2575365,2575366,2575367],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575632,2575633,2575634,2575635,2575636,2575637,2575638,2575639,2575640,2575641,2575642,2575643,2575644,2575645,2575646,2575647,2575648,2575649,2575650,2575651,2575652,2575653,2575654,2575655,2575656,2575657,2575658,2575659,2575660,2575661,2575662,2575663,2575664,2575665,2575666,2575667,2575668,2575669,2575670,2575671,2575672,2575673,2575674,2575675,2575676,2575677,2575678,2575679,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575760,2575761,2575762,2575763,2575764,2575765,2575766,2575767,2575768,2575769,2575770,2575771,2575772,2575773,2575774,2575775,2575776,2575777,2575778,2575779,2575780,2575781,2575782,2575783,2575784,2575785,2575786,2575787,2575788,2575789,2575790,2575791,2575792,2575793,2575794,2575795,2575796,2575797,2575798,2575799,2575800,2575801,2575802,2575803,2575804,2575805,2575806,2575807,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824],"Bricks":[2575872],"Bromine":[2597376],"Brown Mushroom":[2576384],"Brown Mushroom Block":[2576640,2576641,2576642,2576643,2576644,2576645,2576646,2576647,2576648,2576649,2576650],"Cactus":[2576896,2576897,2576898,2576899,2576900,2576901,2576902,2576903,2576904,2576905,2576906,2576907,2576908,2576909,2576910,2576911],"Cadmium":[2597632],"Cake":[2577152,2577153,2577154,2577155,2577156,2577157,2577158],"Cake With Candle":[2729472,2729473],"Cake With Dyed Candle":[2729728,2729729,2729730,2729731,2729732,2729733,2729734,2729735,2729736,2729737,2729738,2729739,2729740,2729741,2729742,2729743,2729744,2729745,2729746,2729747,2729748,2729749,2729750,2729751,2729752,2729753,2729754,2729755,2729756,2729757,2729758,2729759],"Calcite":[2704640],"Calcium":[2597888],"Californium":[2598144],"Candle":[2728960,2728961,2728962,2728963,2728964,2728965,2728966,2728967],"Carbon":[2598400],"Carpet":[2577408,2577409,2577410,2577411,2577412,2577413,2577414,2577415,2577416,2577417,2577418,2577419,2577420,2577421,2577422,2577423],"Carrot Block":[2577664,2577665,2577666,2577667,2577668,2577669,2577670,2577671],"Cartography Table":[2730496],"Carved Pumpkin":[2577920,2577921,2577922,2577923],"Cauldron":[2731520],"Cerium":[2598656],"Cesium":[2598912],"Chain":[2734592,2734593,2734594],"Chest":[2578432,2578433,2578434,2578435],"Chiseled Deepslate":[2710016],"Chiseled Nether Bricks":[2710272],"Chiseled Polished Blackstone":[2702080],"Chiseled Quartz Block":[2578688,2578689,2578690],"Chiseled Red Sandstone":[2578944],"Chiseled Sandstone":[2579200],"Chiseled Stone Bricks":[2579456],"Chlorine":[2599168],"Chorus Flower":[2732800,2732801,2732802,2732803,2732804,2732805],"Chorus Plant":[2733056],"Chromium":[2599424],"Clay Block":[2579712],"Coal Block":[2579968],"Coal Ore":[2580224],"Cobalt":[2599680],"Cobbled Deepslate":[2707712],"Cobbled Deepslate Slab":[2707968,2707969,2707970],"Cobbled Deepslate Stairs":[2708224,2708225,2708226,2708227,2708228,2708229,2708230,2708231],"Cobbled Deepslate Wall":[2708480,2708481,2708482,2708483,2708484,2708485,2708486,2708487,2708488,2708489,2708490,2708491,2708492,2708493,2708494,2708495,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708512,2708513,2708514,2708515,2708516,2708517,2708518,2708519,2708520,2708521,2708522,2708523,2708524,2708525,2708526,2708527,2708528,2708529,2708530,2708531,2708532,2708533,2708534,2708535,2708536,2708537,2708538,2708539,2708540,2708541,2708542,2708543,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708608,2708609,2708610,2708611,2708612,2708613,2708614,2708615,2708616,2708617,2708618,2708619,2708620,2708621,2708622,2708623,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708640,2708641,2708642,2708643,2708644,2708645,2708646,2708647,2708648,2708649,2708650,2708651,2708652,2708653,2708654,2708655,2708656,2708657,2708658,2708659,2708660,2708661,2708662,2708663,2708664,2708665,2708666,2708667,2708668,2708669,2708670,2708671,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688],"Cobblestone":[2580480],"Cobblestone Slab":[2580736,2580737,2580738],"Cobblestone Stairs":[2580992,2580993,2580994,2580995,2580996,2580997,2580998,2580999],"Cobblestone Wall":[2581248,2581249,2581250,2581251,2581252,2581253,2581254,2581255,2581256,2581257,2581258,2581259,2581260,2581261,2581262,2581263,2581264,2581265,2581266,2581267,2581268,2581269,2581270,2581271,2581272,2581273,2581274,2581275,2581276,2581277,2581278,2581279,2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581296,2581297,2581298,2581299,2581300,2581301,2581302,2581303,2581304,2581305,2581306,2581307,2581308,2581309,2581310,2581311,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581376,2581377,2581378,2581379,2581380,2581381,2581382,2581383,2581384,2581385,2581386,2581387,2581388,2581389,2581390,2581391,2581392,2581393,2581394,2581395,2581396,2581397,2581398,2581399,2581400,2581401,2581402,2581403,2581404,2581405,2581406,2581407,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581424,2581425,2581426,2581427,2581428,2581429,2581430,2581431,2581432,2581433,2581434,2581435,2581436,2581437,2581438,2581439,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456],"Cobweb":[2581504],"Cocoa Block":[2581760,2581761,2581762,2581763,2581764,2581765,2581766,2581767,2581768,2581769,2581770,2581771],"Compound Creator":[2582016,2582017,2582018,2582019],"Concrete":[2582272,2582273,2582274,2582275,2582276,2582277,2582278,2582279,2582280,2582281,2582282,2582283,2582284,2582285,2582286,2582287],"Concrete Powder":[2582528,2582529,2582530,2582531,2582532,2582533,2582534,2582535,2582536,2582537,2582538,2582539,2582540,2582541,2582542,2582543],"Copernicium":[2600192],"Copper":[2600448],"Copper Block":[2727936,2727937,2727938,2727939,2727940,2727941,2727942,2727943],"Copper Ore":[2724864],"Coral":[2582784,2582785,2582786,2582787,2582788,2582792,2582793,2582794,2582795,2582796],"Coral Block":[2583040,2583041,2583042,2583043,2583044,2583048,2583049,2583050,2583051,2583052],"Coral Fan":[2583296,2583297,2583298,2583299,2583300,2583304,2583305,2583306,2583307,2583308,2583312,2583313,2583314,2583315,2583316,2583320,2583321,2583322,2583323,2583324],"Cornflower":[2583552],"Cracked Deepslate Bricks":[2706176],"Cracked Deepslate Tiles":[2707456],"Cracked Nether Bricks":[2710528],"Cracked Polished Blackstone Bricks":[2703360],"Cracked Stone Bricks":[2583808],"Crafting Table":[2584064],"Crimson Button":[2717184,2717185,2717186,2717187,2717188,2717189,2717192,2717193,2717194,2717195,2717196,2717197],"Crimson Door":[2718720,2718721,2718722,2718723,2718724,2718725,2718726,2718727,2718728,2718729,2718730,2718731,2718732,2718733,2718734,2718735,2718736,2718737,2718738,2718739,2718740,2718741,2718742,2718743,2718744,2718745,2718746,2718747,2718748,2718749,2718750,2718751],"Crimson Fence":[2713344],"Crimson Fence Gate":[2719488,2719489,2719490,2719491,2719492,2719493,2719494,2719495,2719496,2719497,2719498,2719499,2719500,2719501,2719502,2719503],"Crimson Hyphae":[2715648,2715649,2715650,2715651,2715652,2715653],"Crimson Planks":[2712576],"Crimson Pressure Plate":[2717952,2717953],"Crimson Sign":[2721024,2721025,2721026,2721027,2721028,2721029,2721030,2721031,2721032,2721033,2721034,2721035,2721036,2721037,2721038,2721039],"Crimson Slab":[2714112,2714113,2714114],"Crimson Stairs":[2720256,2720257,2720258,2720259,2720260,2720261,2720262,2720263],"Crimson Stem":[2714880,2714881,2714882,2714883,2714884,2714885],"Crimson Trapdoor":[2716416,2716417,2716418,2716419,2716420,2716421,2716422,2716423,2716424,2716425,2716426,2716427,2716428,2716429,2716430,2716431],"Crimson Wall Sign":[2721792,2721793,2721794,2721795],"Crying Obsidian":[2727168],"Curium":[2600704],"Cut Copper Block":[2728192,2728193,2728194,2728195,2728196,2728197,2728198,2728199],"Cut Copper Slab Slab":[2728448,2728449,2728450,2728451,2728452,2728453,2728454,2728455,2728456,2728457,2728458,2728459,2728460,2728461,2728462,2728463,2728464,2728465,2728466,2728467,2728468,2728469,2728470,2728471],"Cut Copper Stairs":[2728704,2728705,2728706,2728707,2728708,2728709,2728710,2728711,2728712,2728713,2728714,2728715,2728716,2728717,2728718,2728719,2728720,2728721,2728722,2728723,2728724,2728725,2728726,2728727,2728728,2728729,2728730,2728731,2728732,2728733,2728734,2728735,2728736,2728737,2728738,2728739,2728740,2728741,2728742,2728743,2728744,2728745,2728746,2728747,2728748,2728749,2728750,2728751,2728752,2728753,2728754,2728755,2728756,2728757,2728758,2728759,2728760,2728761,2728762,2728763,2728764,2728765,2728766,2728767],"Cut Red Sandstone":[2584320],"Cut Red Sandstone Slab":[2584576,2584577,2584578],"Cut Sandstone":[2584832],"Cut Sandstone Slab":[2585088,2585089,2585090],"Dandelion":[2585600],"Dark Oak Button":[2585856,2585857,2585858,2585859,2585860,2585861,2585864,2585865,2585866,2585867,2585868,2585869],"Dark Oak Door":[2586112,2586113,2586114,2586115,2586116,2586117,2586118,2586119,2586120,2586121,2586122,2586123,2586124,2586125,2586126,2586127,2586128,2586129,2586130,2586131,2586132,2586133,2586134,2586135,2586136,2586137,2586138,2586139,2586140,2586141,2586142,2586143],"Dark Oak Fence":[2586368],"Dark Oak Fence Gate":[2586624,2586625,2586626,2586627,2586628,2586629,2586630,2586631,2586632,2586633,2586634,2586635,2586636,2586637,2586638,2586639],"Dark Oak Leaves":[2586880,2586881,2586882,2586883],"Dark Oak Log":[2587136,2587137,2587138,2587139,2587140,2587141],"Dark Oak Planks":[2587392],"Dark Oak Pressure Plate":[2587648,2587649],"Dark Oak Sapling":[2587904,2587905],"Dark Oak Sign":[2588160,2588161,2588162,2588163,2588164,2588165,2588166,2588167,2588168,2588169,2588170,2588171,2588172,2588173,2588174,2588175],"Dark Oak Slab":[2588416,2588417,2588418],"Dark Oak Stairs":[2588672,2588673,2588674,2588675,2588676,2588677,2588678,2588679],"Dark Oak Trapdoor":[2588928,2588929,2588930,2588931,2588932,2588933,2588934,2588935,2588936,2588937,2588938,2588939,2588940,2588941,2588942,2588943],"Dark Oak Wall Sign":[2589184,2589185,2589186,2589187],"Dark Oak Wood":[2589440,2589441,2589442,2589443,2589444,2589445],"Dark Prismarine":[2589696],"Dark Prismarine Slab":[2589952,2589953,2589954],"Dark Prismarine Stairs":[2590208,2590209,2590210,2590211,2590212,2590213,2590214,2590215],"Darmstadtium":[2600960],"Daylight Sensor":[2590464,2590465,2590466,2590467,2590468,2590469,2590470,2590471,2590472,2590473,2590474,2590475,2590476,2590477,2590478,2590479,2590480,2590481,2590482,2590483,2590484,2590485,2590486,2590487,2590488,2590489,2590490,2590491,2590492,2590493,2590494,2590495],"Dead Bush":[2590720],"Deepslate":[2704896,2704897,2704898],"Deepslate Brick Slab":[2705408,2705409,2705410],"Deepslate Brick Stairs":[2705664,2705665,2705666,2705667,2705668,2705669,2705670,2705671],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705936,2705937,2705938,2705939,2705940,2705941,2705942,2705943,2705944,2705945,2705946,2705947,2705948,2705949,2705950,2705951,2705952,2705953,2705954,2705955,2705956,2705957,2705958,2705959,2705960,2705961,2705962,2705963,2705964,2705965,2705966,2705967,2705968,2705969,2705970,2705971,2705972,2705973,2705974,2705975,2705976,2705977,2705978,2705979,2705980,2705981,2705982,2705983,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706064,2706065,2706066,2706067,2706068,2706069,2706070,2706071,2706072,2706073,2706074,2706075,2706076,2706077,2706078,2706079,2706080,2706081,2706082,2706083,2706084,2706085,2706086,2706087,2706088,2706089,2706090,2706091,2706092,2706093,2706094,2706095,2706096,2706097,2706098,2706099,2706100,2706101,2706102,2706103,2706104,2706105,2706106,2706107,2706108,2706109,2706110,2706111,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128],"Deepslate Bricks":[2705152],"Deepslate Coal Ore":[2722816],"Deepslate Copper Ore":[2724608],"Deepslate Diamond Ore":[2723072],"Deepslate Emerald Ore":[2723328],"Deepslate Gold Ore":[2724352],"Deepslate Iron Ore":[2724096],"Deepslate Lapis Lazuli Ore":[2723584],"Deepslate Redstone Ore":[2723840,2723841],"Deepslate Tile Slab":[2706688,2706689,2706690],"Deepslate Tile Stairs":[2706944,2706945,2706946,2706947,2706948,2706949,2706950,2706951],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707216,2707217,2707218,2707219,2707220,2707221,2707222,2707223,2707224,2707225,2707226,2707227,2707228,2707229,2707230,2707231,2707232,2707233,2707234,2707235,2707236,2707237,2707238,2707239,2707240,2707241,2707242,2707243,2707244,2707245,2707246,2707247,2707248,2707249,2707250,2707251,2707252,2707253,2707254,2707255,2707256,2707257,2707258,2707259,2707260,2707261,2707262,2707263,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707344,2707345,2707346,2707347,2707348,2707349,2707350,2707351,2707352,2707353,2707354,2707355,2707356,2707357,2707358,2707359,2707360,2707361,2707362,2707363,2707364,2707365,2707366,2707367,2707368,2707369,2707370,2707371,2707372,2707373,2707374,2707375,2707376,2707377,2707378,2707379,2707380,2707381,2707382,2707383,2707384,2707385,2707386,2707387,2707388,2707389,2707390,2707391,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408],"Deepslate Tiles":[2706432],"Detector Rail":[2590976,2590977,2590978,2590979,2590980,2590981,2590984,2590985,2590986,2590987,2590988,2590989],"Diamond Block":[2591232],"Diamond Ore":[2591488],"Diorite":[2591744],"Diorite Slab":[2592000,2592001,2592002],"Diorite Stairs":[2592256,2592257,2592258,2592259,2592260,2592261,2592262,2592263],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592592,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592720],"Dirt":[2592768,2592769,2592770],"Double Tallgrass":[2593024,2593025],"Dragon Egg":[2593280],"Dried Kelp Block":[2593536],"Dubnium":[2601216],"Dyed Candle":[2729216,2729217,2729218,2729219,2729220,2729221,2729222,2729223,2729224,2729225,2729226,2729227,2729228,2729229,2729230,2729231,2729232,2729233,2729234,2729235,2729236,2729237,2729238,2729239,2729240,2729241,2729242,2729243,2729244,2729245,2729246,2729247,2729248,2729249,2729250,2729251,2729252,2729253,2729254,2729255,2729256,2729257,2729258,2729259,2729260,2729261,2729262,2729263,2729264,2729265,2729266,2729267,2729268,2729269,2729270,2729271,2729272,2729273,2729274,2729275,2729276,2729277,2729278,2729279,2729280,2729281,2729282,2729283,2729284,2729285,2729286,2729287,2729288,2729289,2729290,2729291,2729292,2729293,2729294,2729295,2729296,2729297,2729298,2729299,2729300,2729301,2729302,2729303,2729304,2729305,2729306,2729307,2729308,2729309,2729310,2729311,2729312,2729313,2729314,2729315,2729316,2729317,2729318,2729319,2729320,2729321,2729322,2729323,2729324,2729325,2729326,2729327,2729328,2729329,2729330,2729331,2729332,2729333,2729334,2729335,2729336,2729337,2729338,2729339,2729340,2729341,2729342,2729343],"Dyed Shulker Box":[2593792,2593793,2593794,2593795,2593796,2593797,2593798,2593799,2593800,2593801,2593802,2593803,2593804,2593805,2593806,2593807],"Dysprosium":[2601472],"Einsteinium":[2601728],"Element Constructor":[2599936,2599937,2599938,2599939],"Emerald Block":[2624768],"Emerald Ore":[2625024],"Enchanting Table":[2625280],"End Portal Frame":[2625536,2625537,2625538,2625539,2625540,2625541,2625542,2625543],"End Rod":[2625792,2625793,2625794,2625795,2625796,2625797],"End Stone":[2626048],"End Stone Brick Slab":[2626304,2626305,2626306],"End Stone Brick Stairs":[2626560,2626561,2626562,2626563,2626564,2626565,2626566,2626567],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626880,2626881,2626882,2626883,2626884,2626885,2626886,2626887,2626888,2626889,2626890,2626891,2626892,2626893,2626894,2626895,2626896,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627008,2627009,2627010,2627011,2627012,2627013,2627014,2627015,2627016,2627017,2627018,2627019,2627020,2627021,2627022,2627023,2627024],"End Stone Bricks":[2627072],"Ender Chest":[2627328,2627329,2627330,2627331],"Erbium":[2601984],"Europium":[2602240],"Fake Wooden Slab":[2627584,2627585,2627586],"Farmland":[2627840,2627841,2627842,2627843,2627844,2627845,2627846,2627847],"Fermium":[2602496],"Fern":[2628096],"Fire Block":[2628352,2628353,2628354,2628355,2628356,2628357,2628358,2628359,2628360,2628361,2628362,2628363,2628364,2628365,2628366,2628367],"Flerovium":[2602752],"Fletching Table":[2628608],"Flower Pot":[2628864],"Flowering Azalea Leaves":[2735872,2735873,2735874,2735875],"Fluorine":[2603008],"Francium":[2603264],"Froglight":[2733824,2733825,2733826,2733828,2733829,2733830,2733832,2733833,2733834],"Frosted Ice":[2629120,2629121,2629122,2629123],"Furnace":[2629376,2629377,2629378,2629379,2629380,2629381,2629382,2629383],"Gadolinium":[2603520],"Gallium":[2603776],"Germanium":[2604032],"Gilded Blackstone":[2727424],"Glass":[2629632],"Glass Pane":[2629888],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735104,2735105,2735106,2735107,2735108,2735109,2735112,2735113,2735114,2735115,2735116,2735117],"Glowing Obsidian":[2630144],"Glowstone":[2630400],"Gold":[2604288],"Gold Block":[2630656],"Gold Ore":[2630912],"Granite":[2631168],"Granite Slab":[2631424,2631425,2631426],"Granite Stairs":[2631680,2631681,2631682,2631683,2631684,2631685,2631686,2631687],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632000,2632001,2632002,2632003,2632004,2632005,2632006,2632007,2632008,2632009,2632010,2632011,2632012,2632013,2632014,2632015,2632016,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632128,2632129,2632130,2632131,2632132,2632133,2632134,2632135,2632136,2632137,2632138,2632139,2632140,2632141,2632142,2632143,2632144],"Grass":[2632192],"Grass Path":[2632448],"Gravel":[2632704],"Green Torch":[2633473,2633474,2633475,2633476,2633477],"Hafnium":[2604544],"Hanging Roots":[2730240],"Hardened Clay":[2633728],"Hardened Glass":[2633984],"Hardened Glass Pane":[2634240],"Hassium":[2604800],"Hay Bale":[2634496,2634497,2634498],"Heat Block":[2578176],"Helium":[2605056],"Holmium":[2605312],"Honeycomb Block":[2722560],"Hopper":[2634752,2634754,2634755,2634756,2634757,2634760,2634762,2634763,2634764,2634765],"Hydrogen":[2605568],"Ice":[2635008],"Indium":[2605824],"Infested Chiseled Stone Brick":[2635264],"Infested Cobblestone":[2635520],"Infested Cracked Stone Brick":[2635776],"Infested Mossy Stone Brick":[2636032],"Infested Stone":[2636288],"Infested Stone Brick":[2636544],"Invisible Bedrock":[2637312],"Iodine":[2606080],"Iridium":[2606336],"Iron":[2606592],"Iron Bars":[2637824],"Iron Block":[2637568],"Iron Door":[2638080,2638081,2638082,2638083,2638084,2638085,2638086,2638087,2638088,2638089,2638090,2638091,2638092,2638093,2638094,2638095,2638096,2638097,2638098,2638099,2638100,2638101,2638102,2638103,2638104,2638105,2638106,2638107,2638108,2638109,2638110,2638111],"Iron Ore":[2638336],"Iron Trapdoor":[2638592,2638593,2638594,2638595,2638596,2638597,2638598,2638599,2638600,2638601,2638602,2638603,2638604,2638605,2638606,2638607],"Item Frame":[2638848,2638849,2638850,2638851,2638852,2638853,2638856,2638857,2638858,2638859,2638860,2638861],"Jack o'Lantern":[2647296,2647297,2647298,2647299],"Jukebox":[2639104],"Jungle Button":[2639360,2639361,2639362,2639363,2639364,2639365,2639368,2639369,2639370,2639371,2639372,2639373],"Jungle Door":[2639616,2639617,2639618,2639619,2639620,2639621,2639622,2639623,2639624,2639625,2639626,2639627,2639628,2639629,2639630,2639631,2639632,2639633,2639634,2639635,2639636,2639637,2639638,2639639,2639640,2639641,2639642,2639643,2639644,2639645,2639646,2639647],"Jungle Fence":[2639872],"Jungle Fence Gate":[2640128,2640129,2640130,2640131,2640132,2640133,2640134,2640135,2640136,2640137,2640138,2640139,2640140,2640141,2640142,2640143],"Jungle Leaves":[2640384,2640385,2640386,2640387],"Jungle Log":[2640640,2640641,2640642,2640643,2640644,2640645],"Jungle Planks":[2640896],"Jungle Pressure Plate":[2641152,2641153],"Jungle Sapling":[2641408,2641409],"Jungle Sign":[2641664,2641665,2641666,2641667,2641668,2641669,2641670,2641671,2641672,2641673,2641674,2641675,2641676,2641677,2641678,2641679],"Jungle Slab":[2641920,2641921,2641922],"Jungle Stairs":[2642176,2642177,2642178,2642179,2642180,2642181,2642182,2642183],"Jungle Trapdoor":[2642432,2642433,2642434,2642435,2642436,2642437,2642438,2642439,2642440,2642441,2642442,2642443,2642444,2642445,2642446,2642447],"Jungle Wall Sign":[2642688,2642689,2642690,2642691],"Jungle Wood":[2642944,2642945,2642946,2642947,2642948,2642949],"Krypton":[2606848],"Lab Table":[2643200,2643201,2643202,2643203],"Ladder":[2643456,2643457,2643458,2643459],"Lantern":[2643712,2643713],"Lanthanum":[2607104],"Lapis Lazuli Block":[2643968],"Lapis Lazuli Ore":[2644224],"Large Fern":[2644480,2644481],"Lava":[2644736,2644737,2644738,2644739,2644740,2644741,2644742,2644743,2644744,2644745,2644746,2644747,2644748,2644749,2644750,2644751,2644752,2644753,2644754,2644755,2644756,2644757,2644758,2644759,2644760,2644761,2644762,2644763,2644764,2644765,2644766,2644767],"Lava Cauldron":[2732032,2732033,2732034,2732035,2732036,2732037],"Lawrencium":[2607360],"Lead":[2607616],"Lectern":[2644992,2644993,2644994,2644995,2644996,2644997,2644998,2644999],"Legacy Stonecutter":[2645248],"Lever":[2645504,2645505,2645506,2645507,2645508,2645509,2645510,2645511,2645512,2645513,2645514,2645515,2645516,2645517,2645518,2645519],"Light Block":[2703616,2703617,2703618,2703619,2703620,2703621,2703622,2703623,2703624,2703625,2703626,2703627,2703628,2703629,2703630,2703631],"Lightning Rod":[2727680,2727681,2727682,2727683,2727684,2727685],"Lilac":[2646272,2646273],"Lily Pad":[2646784],"Lily of the Valley":[2646528],"Lithium":[2607872],"Livermorium":[2608128],"Loom":[2647552,2647553,2647554,2647555],"Lutetium":[2608384],"Magma Block":[2648064],"Magnesium":[2608640],"Manganese":[2608896],"Mangrove Button":[2716928,2716929,2716930,2716931,2716932,2716933,2716936,2716937,2716938,2716939,2716940,2716941],"Mangrove Door":[2718464,2718465,2718466,2718467,2718468,2718469,2718470,2718471,2718472,2718473,2718474,2718475,2718476,2718477,2718478,2718479,2718480,2718481,2718482,2718483,2718484,2718485,2718486,2718487,2718488,2718489,2718490,2718491,2718492,2718493,2718494,2718495],"Mangrove Fence":[2713088],"Mangrove Fence Gate":[2719232,2719233,2719234,2719235,2719236,2719237,2719238,2719239,2719240,2719241,2719242,2719243,2719244,2719245,2719246,2719247],"Mangrove Leaves":[2735360,2735361,2735362,2735363],"Mangrove Log":[2714624,2714625,2714626,2714627,2714628,2714629],"Mangrove Planks":[2712320],"Mangrove Pressure Plate":[2717696,2717697],"Mangrove Roots":[2733312],"Mangrove Sign":[2720768,2720769,2720770,2720771,2720772,2720773,2720774,2720775,2720776,2720777,2720778,2720779,2720780,2720781,2720782,2720783],"Mangrove Slab":[2713856,2713857,2713858],"Mangrove Stairs":[2720000,2720001,2720002,2720003,2720004,2720005,2720006,2720007],"Mangrove Trapdoor":[2716160,2716161,2716162,2716163,2716164,2716165,2716166,2716167,2716168,2716169,2716170,2716171,2716172,2716173,2716174,2716175],"Mangrove Wall Sign":[2721536,2721537,2721538,2721539],"Mangrove Wood":[2715392,2715393,2715394,2715395,2715396,2715397],"Material Reducer":[2648320,2648321,2648322,2648323],"Meitnerium":[2609152],"Melon Block":[2648576],"Melon Stem":[2648832,2648833,2648834,2648835,2648836,2648837,2648838,2648839],"Mendelevium":[2609408],"Mercury":[2609664],"Mob Head":[2649096,2649097,2649098,2649099,2649100,2649101,2649104,2649105,2649106,2649107,2649108,2649109,2649112,2649113,2649114,2649115,2649116,2649117,2649120,2649121,2649122,2649123,2649124,2649125,2649128,2649129,2649130,2649131,2649132,2649133],"Molybdenum":[2609920],"Monster Spawner":[2649344],"Moscovium":[2610176],"Mossy Cobblestone":[2649600],"Mossy Cobblestone Slab":[2649856,2649857,2649858],"Mossy Cobblestone Stairs":[2650112,2650113,2650114,2650115,2650116,2650117,2650118,2650119],"Mossy Cobblestone Wall":[2650368,2650369,2650370,2650371,2650372,2650373,2650374,2650375,2650376,2650377,2650378,2650379,2650380,2650381,2650382,2650383,2650384,2650385,2650386,2650387,2650388,2650389,2650390,2650391,2650392,2650393,2650394,2650395,2650396,2650397,2650398,2650399,2650400,2650401,2650402,2650403,2650404,2650405,2650406,2650407,2650408,2650409,2650410,2650411,2650412,2650413,2650414,2650415,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650496,2650497,2650498,2650499,2650500,2650501,2650502,2650503,2650504,2650505,2650506,2650507,2650508,2650509,2650510,2650511,2650512,2650513,2650514,2650515,2650516,2650517,2650518,2650519,2650520,2650521,2650522,2650523,2650524,2650525,2650526,2650527,2650528,2650529,2650530,2650531,2650532,2650533,2650534,2650535,2650536,2650537,2650538,2650539,2650540,2650541,2650542,2650543,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576],"Mossy Stone Brick Slab":[2650624,2650625,2650626],"Mossy Stone Brick Stairs":[2650880,2650881,2650882,2650883,2650884,2650885,2650886,2650887],"Mossy Stone Brick Wall":[2651136,2651137,2651138,2651139,2651140,2651141,2651142,2651143,2651144,2651145,2651146,2651147,2651148,2651149,2651150,2651151,2651152,2651153,2651154,2651155,2651156,2651157,2651158,2651159,2651160,2651161,2651162,2651163,2651164,2651165,2651166,2651167,2651168,2651169,2651170,2651171,2651172,2651173,2651174,2651175,2651176,2651177,2651178,2651179,2651180,2651181,2651182,2651183,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651264,2651265,2651266,2651267,2651268,2651269,2651270,2651271,2651272,2651273,2651274,2651275,2651276,2651277,2651278,2651279,2651280,2651281,2651282,2651283,2651284,2651285,2651286,2651287,2651288,2651289,2651290,2651291,2651292,2651293,2651294,2651295,2651296,2651297,2651298,2651299,2651300,2651301,2651302,2651303,2651304,2651305,2651306,2651307,2651308,2651309,2651310,2651311,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344],"Mossy Stone Bricks":[2651392],"Mud":[2725376],"Mud Brick Slab":[2725888,2725889,2725890],"Mud Brick Stairs":[2726144,2726145,2726146,2726147,2726148,2726149,2726150,2726151],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726464,2726465,2726466,2726467,2726468,2726469,2726470,2726471,2726472,2726473,2726474,2726475,2726476,2726477,2726478,2726479,2726480,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726592,2726593,2726594,2726595,2726596,2726597,2726598,2726599,2726600,2726601,2726602,2726603,2726604,2726605,2726606,2726607,2726608],"Mud Bricks":[2725632],"Muddy Mangrove Roots":[2733568,2733569,2733570],"Mushroom Stem":[2651648],"Mycelium":[2651904],"Neodymium":[2610432],"Neon":[2610688],"Neptunium":[2610944],"Nether Brick Fence":[2652160],"Nether Brick Slab":[2652416,2652417,2652418],"Nether Brick Stairs":[2652672,2652673,2652674,2652675,2652676,2652677,2652678,2652679],"Nether Brick Wall":[2652928,2652929,2652930,2652931,2652932,2652933,2652934,2652935,2652936,2652937,2652938,2652939,2652940,2652941,2652942,2652943,2652944,2652945,2652946,2652947,2652948,2652949,2652950,2652951,2652952,2652953,2652954,2652955,2652956,2652957,2652958,2652959,2652960,2652961,2652962,2652963,2652964,2652965,2652966,2652967,2652968,2652969,2652970,2652971,2652972,2652973,2652974,2652975,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653056,2653057,2653058,2653059,2653060,2653061,2653062,2653063,2653064,2653065,2653066,2653067,2653068,2653069,2653070,2653071,2653072,2653073,2653074,2653075,2653076,2653077,2653078,2653079,2653080,2653081,2653082,2653083,2653084,2653085,2653086,2653087,2653088,2653089,2653090,2653091,2653092,2653093,2653094,2653095,2653096,2653097,2653098,2653099,2653100,2653101,2653102,2653103,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136],"Nether Bricks":[2653184],"Nether Gold Ore":[2725120],"Nether Portal":[2653440,2653441],"Nether Quartz Ore":[2653696],"Nether Reactor Core":[2653952],"Nether Wart":[2654208,2654209,2654210,2654211],"Nether Wart Block":[2654464],"Netherite Block":[2731008],"Netherrack":[2654720],"Nickel":[2611200],"Nihonium":[2611456],"Niobium":[2611712],"Nitrogen":[2611968],"Nobelium":[2612224],"Note Block":[2654976],"Oak Button":[2655232,2655233,2655234,2655235,2655236,2655237,2655240,2655241,2655242,2655243,2655244,2655245],"Oak Door":[2655488,2655489,2655490,2655491,2655492,2655493,2655494,2655495,2655496,2655497,2655498,2655499,2655500,2655501,2655502,2655503,2655504,2655505,2655506,2655507,2655508,2655509,2655510,2655511,2655512,2655513,2655514,2655515,2655516,2655517,2655518,2655519],"Oak Fence":[2655744],"Oak Fence Gate":[2656000,2656001,2656002,2656003,2656004,2656005,2656006,2656007,2656008,2656009,2656010,2656011,2656012,2656013,2656014,2656015],"Oak Leaves":[2656256,2656257,2656258,2656259],"Oak Log":[2656512,2656513,2656514,2656515,2656516,2656517],"Oak Planks":[2656768],"Oak Pressure Plate":[2657024,2657025],"Oak Sapling":[2657280,2657281],"Oak Sign":[2657536,2657537,2657538,2657539,2657540,2657541,2657542,2657543,2657544,2657545,2657546,2657547,2657548,2657549,2657550,2657551],"Oak Slab":[2657792,2657793,2657794],"Oak Stairs":[2658048,2658049,2658050,2658051,2658052,2658053,2658054,2658055],"Oak Trapdoor":[2658304,2658305,2658306,2658307,2658308,2658309,2658310,2658311,2658312,2658313,2658314,2658315,2658316,2658317,2658318,2658319],"Oak Wall Sign":[2658560,2658561,2658562,2658563],"Oak Wood":[2658816,2658817,2658818,2658819,2658820,2658821],"Obsidian":[2659072],"Oganesson":[2612480],"Orange Tulip":[2659584],"Osmium":[2612736],"Oxeye Daisy":[2659840],"Oxygen":[2612992],"Packed Ice":[2660096],"Packed Mud":[2726656],"Palladium":[2613248],"Peony":[2660352,2660353],"Phosphorus":[2613504],"Pink Tulip":[2660864],"Platinum":[2613760],"Plutonium":[2614016],"Podzol":[2661120],"Polished Andesite":[2661376],"Polished Andesite Slab":[2661632,2661633,2661634],"Polished Andesite Stairs":[2661888,2661889,2661890,2661891,2661892,2661893,2661894,2661895],"Polished Basalt":[2699008,2699009,2699010],"Polished Blackstone":[2700544],"Polished Blackstone Brick Slab":[2702592,2702593,2702594],"Polished Blackstone Brick Stairs":[2702848,2702849,2702850,2702851,2702852,2702853,2702854,2702855],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703168,2703169,2703170,2703171,2703172,2703173,2703174,2703175,2703176,2703177,2703178,2703179,2703180,2703181,2703182,2703183,2703184,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703296,2703297,2703298,2703299,2703300,2703301,2703302,2703303,2703304,2703305,2703306,2703307,2703308,2703309,2703310,2703311,2703312],"Polished Blackstone Bricks":[2702336],"Polished Blackstone Button":[2700800,2700801,2700802,2700803,2700804,2700805,2700808,2700809,2700810,2700811,2700812,2700813],"Polished Blackstone Pressure Plate":[2701056,2701057],"Polished Blackstone Slab":[2701312,2701313,2701314],"Polished Blackstone Stairs":[2701568,2701569,2701570,2701571,2701572,2701573,2701574,2701575],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701888,2701889,2701890,2701891,2701892,2701893,2701894,2701895,2701896,2701897,2701898,2701899,2701900,2701901,2701902,2701903,2701904,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702016,2702017,2702018,2702019,2702020,2702021,2702022,2702023,2702024,2702025,2702026,2702027,2702028,2702029,2702030,2702031,2702032],"Polished Deepslate":[2708736],"Polished Deepslate Slab":[2708992,2708993,2708994],"Polished Deepslate Stairs":[2709248,2709249,2709250,2709251,2709252,2709253,2709254,2709255],"Polished Deepslate Wall":[2709504,2709505,2709506,2709507,2709508,2709509,2709510,2709511,2709512,2709513,2709514,2709515,2709516,2709517,2709518,2709519,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709536,2709537,2709538,2709539,2709540,2709541,2709542,2709543,2709544,2709545,2709546,2709547,2709548,2709549,2709550,2709551,2709552,2709553,2709554,2709555,2709556,2709557,2709558,2709559,2709560,2709561,2709562,2709563,2709564,2709565,2709566,2709567,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709632,2709633,2709634,2709635,2709636,2709637,2709638,2709639,2709640,2709641,2709642,2709643,2709644,2709645,2709646,2709647,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709664,2709665,2709666,2709667,2709668,2709669,2709670,2709671,2709672,2709673,2709674,2709675,2709676,2709677,2709678,2709679,2709680,2709681,2709682,2709683,2709684,2709685,2709686,2709687,2709688,2709689,2709690,2709691,2709692,2709693,2709694,2709695,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712],"Polished Diorite":[2662144],"Polished Diorite Slab":[2662400,2662401,2662402],"Polished Diorite Stairs":[2662656,2662657,2662658,2662659,2662660,2662661,2662662,2662663],"Polished Granite":[2662912],"Polished Granite Slab":[2663168,2663169,2663170],"Polished Granite Stairs":[2663424,2663425,2663426,2663427,2663428,2663429,2663430,2663431],"Polonium":[2614272],"Poppy":[2663680],"Potassium":[2614528],"Potato Block":[2663936,2663937,2663938,2663939,2663940,2663941,2663942,2663943],"Potion Cauldron":[2732288,2732289,2732290,2732291,2732292,2732293],"Powered Rail":[2664192,2664193,2664194,2664195,2664196,2664197,2664200,2664201,2664202,2664203,2664204,2664205],"Praseodymium":[2614784],"Prismarine":[2664448],"Prismarine Bricks":[2664704],"Prismarine Bricks Slab":[2664960,2664961,2664962],"Prismarine Bricks Stairs":[2665216,2665217,2665218,2665219,2665220,2665221,2665222,2665223],"Prismarine Slab":[2665472,2665473,2665474],"Prismarine Stairs":[2665728,2665729,2665730,2665731,2665732,2665733,2665734,2665735],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666048,2666049,2666050,2666051,2666052,2666053,2666054,2666055,2666056,2666057,2666058,2666059,2666060,2666061,2666062,2666063,2666064,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666176,2666177,2666178,2666179,2666180,2666181,2666182,2666183,2666184,2666185,2666186,2666187,2666188,2666189,2666190,2666191,2666192],"Promethium":[2615040],"Protactinium":[2615296],"Pumpkin":[2666240],"Pumpkin Stem":[2666496,2666497,2666498,2666499,2666500,2666501,2666502,2666503],"Purple Torch":[2667009,2667010,2667011,2667012,2667013],"Purpur Block":[2667264],"Purpur Pillar":[2667520,2667521,2667522],"Purpur Slab":[2667776,2667777,2667778],"Purpur Stairs":[2668032,2668033,2668034,2668035,2668036,2668037,2668038,2668039],"Quartz Block":[2668288],"Quartz Bricks":[2709760],"Quartz Pillar":[2668544,2668545,2668546],"Quartz Slab":[2668800,2668801,2668802],"Quartz Stairs":[2669056,2669057,2669058,2669059,2669060,2669061,2669062,2669063],"Radium":[2615552],"Radon":[2615808],"Rail":[2669312,2669313,2669314,2669315,2669316,2669317,2669318,2669319,2669320,2669321],"Raw Copper Block":[2703872],"Raw Gold Block":[2704128],"Raw Iron Block":[2704384],"Red Mushroom":[2669824],"Red Mushroom Block":[2670080,2670081,2670082,2670083,2670084,2670085,2670086,2670087,2670088,2670089,2670090],"Red Nether Brick Slab":[2670336,2670337,2670338],"Red Nether Brick Stairs":[2670592,2670593,2670594,2670595,2670596,2670597,2670598,2670599],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670864,2670865,2670866,2670867,2670868,2670869,2670870,2670871,2670872,2670873,2670874,2670875,2670876,2670877,2670878,2670879,2670880,2670881,2670882,2670883,2670884,2670885,2670886,2670887,2670888,2670889,2670890,2670891,2670892,2670893,2670894,2670895,2670896,2670897,2670898,2670899,2670900,2670901,2670902,2670903,2670904,2670905,2670906,2670907,2670908,2670909,2670910,2670911,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670992,2670993,2670994,2670995,2670996,2670997,2670998,2670999,2671000,2671001,2671002,2671003,2671004,2671005,2671006,2671007,2671008,2671009,2671010,2671011,2671012,2671013,2671014,2671015,2671016,2671017,2671018,2671019,2671020,2671021,2671022,2671023,2671024,2671025,2671026,2671027,2671028,2671029,2671030,2671031,2671032,2671033,2671034,2671035,2671036,2671037,2671038,2671039,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056],"Red Nether Bricks":[2671104],"Red Sand":[2671360],"Red Sandstone":[2671616],"Red Sandstone Slab":[2671872,2671873,2671874],"Red Sandstone Stairs":[2672128,2672129,2672130,2672131,2672132,2672133,2672134,2672135],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672400,2672401,2672402,2672403,2672404,2672405,2672406,2672407,2672408,2672409,2672410,2672411,2672412,2672413,2672414,2672415,2672416,2672417,2672418,2672419,2672420,2672421,2672422,2672423,2672424,2672425,2672426,2672427,2672428,2672429,2672430,2672431,2672432,2672433,2672434,2672435,2672436,2672437,2672438,2672439,2672440,2672441,2672442,2672443,2672444,2672445,2672446,2672447,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672528,2672529,2672530,2672531,2672532,2672533,2672534,2672535,2672536,2672537,2672538,2672539,2672540,2672541,2672542,2672543,2672544,2672545,2672546,2672547,2672548,2672549,2672550,2672551,2672552,2672553,2672554,2672555,2672556,2672557,2672558,2672559,2672560,2672561,2672562,2672563,2672564,2672565,2672566,2672567,2672568,2672569,2672570,2672571,2672572,2672573,2672574,2672575,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592],"Red Torch":[2672641,2672642,2672643,2672644,2672645],"Red Tulip":[2672896],"Redstone":[2674688,2674689,2674690,2674691,2674692,2674693,2674694,2674695,2674696,2674697,2674698,2674699,2674700,2674701,2674702,2674703],"Redstone Block":[2673152],"Redstone Comparator":[2673408,2673409,2673410,2673411,2673412,2673413,2673414,2673415,2673416,2673417,2673418,2673419,2673420,2673421,2673422,2673423],"Redstone Lamp":[2673664,2673665],"Redstone Ore":[2673920,2673921],"Redstone Repeater":[2674176,2674177,2674178,2674179,2674180,2674181,2674182,2674183,2674184,2674185,2674186,2674187,2674188,2674189,2674190,2674191,2674192,2674193,2674194,2674195,2674196,2674197,2674198,2674199,2674200,2674201,2674202,2674203,2674204,2674205,2674206,2674207],"Redstone Torch":[2674433,2674434,2674435,2674436,2674437,2674441,2674442,2674443,2674444,2674445],"Reinforced Deepslate":[2736128],"Rhenium":[2616064],"Rhodium":[2616320],"Roentgenium":[2616576],"Rose Bush":[2675200,2675201],"Rubidium":[2616832],"Ruthenium":[2617088],"Rutherfordium":[2617344],"Samarium":[2617600],"Sand":[2675456],"Sandstone":[2675712],"Sandstone Slab":[2675968,2675969,2675970],"Sandstone Stairs":[2676224,2676225,2676226,2676227,2676228,2676229,2676230,2676231],"Sandstone Wall":[2676480,2676481,2676482,2676483,2676484,2676485,2676486,2676487,2676488,2676489,2676490,2676491,2676492,2676493,2676494,2676495,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676512,2676513,2676514,2676515,2676516,2676517,2676518,2676519,2676520,2676521,2676522,2676523,2676524,2676525,2676526,2676527,2676528,2676529,2676530,2676531,2676532,2676533,2676534,2676535,2676536,2676537,2676538,2676539,2676540,2676541,2676542,2676543,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676608,2676609,2676610,2676611,2676612,2676613,2676614,2676615,2676616,2676617,2676618,2676619,2676620,2676621,2676622,2676623,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676640,2676641,2676642,2676643,2676644,2676645,2676646,2676647,2676648,2676649,2676650,2676651,2676652,2676653,2676654,2676655,2676656,2676657,2676658,2676659,2676660,2676661,2676662,2676663,2676664,2676665,2676666,2676667,2676668,2676669,2676670,2676671,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688],"Scandium":[2617856],"Sculk":[2734848],"Sea Lantern":[2676736],"Sea Pickle":[2676992,2676993,2676994,2676995,2676996,2676997,2676998,2676999],"Seaborgium":[2618112],"Selenium":[2618368],"Shroomlight":[2712064],"Shulker Box":[2677248],"Silicon":[2618624],"Silver":[2618880],"Slime Block":[2677504],"Smithing Table":[2730752],"Smoker":[2677760,2677761,2677762,2677763,2677764,2677765,2677766,2677767],"Smooth Basalt":[2699264],"Smooth Quartz Block":[2678016],"Smooth Quartz Slab":[2678272,2678273,2678274],"Smooth Quartz Stairs":[2678528,2678529,2678530,2678531,2678532,2678533,2678534,2678535],"Smooth Red Sandstone":[2678784],"Smooth Red Sandstone Slab":[2679040,2679041,2679042],"Smooth Red Sandstone Stairs":[2679296,2679297,2679298,2679299,2679300,2679301,2679302,2679303],"Smooth Sandstone":[2679552],"Smooth Sandstone Slab":[2679808,2679809,2679810],"Smooth Sandstone Stairs":[2680064,2680065,2680066,2680067,2680068,2680069,2680070,2680071],"Smooth Stone":[2680320],"Smooth Stone Slab":[2680576,2680577,2680578],"Snow Block":[2680832],"Snow Layer":[2681088,2681089,2681090,2681091,2681092,2681093,2681094,2681095],"Sodium":[2619136],"Soul Fire":[2711808],"Soul Lantern":[2711296,2711297],"Soul Sand":[2681344],"Soul Soil":[2711552],"Soul Torch":[2711041,2711042,2711043,2711044,2711045],"Sponge":[2681600,2681601],"Spore Blossom":[2731264],"Spruce Button":[2681856,2681857,2681858,2681859,2681860,2681861,2681864,2681865,2681866,2681867,2681868,2681869],"Spruce Door":[2682112,2682113,2682114,2682115,2682116,2682117,2682118,2682119,2682120,2682121,2682122,2682123,2682124,2682125,2682126,2682127,2682128,2682129,2682130,2682131,2682132,2682133,2682134,2682135,2682136,2682137,2682138,2682139,2682140,2682141,2682142,2682143],"Spruce Fence":[2682368],"Spruce Fence Gate":[2682624,2682625,2682626,2682627,2682628,2682629,2682630,2682631,2682632,2682633,2682634,2682635,2682636,2682637,2682638,2682639],"Spruce Leaves":[2682880,2682881,2682882,2682883],"Spruce Log":[2683136,2683137,2683138,2683139,2683140,2683141],"Spruce Planks":[2683392],"Spruce Pressure Plate":[2683648,2683649],"Spruce Sapling":[2683904,2683905],"Spruce Sign":[2684160,2684161,2684162,2684163,2684164,2684165,2684166,2684167,2684168,2684169,2684170,2684171,2684172,2684173,2684174,2684175],"Spruce Slab":[2684416,2684417,2684418],"Spruce Stairs":[2684672,2684673,2684674,2684675,2684676,2684677,2684678,2684679],"Spruce Trapdoor":[2684928,2684929,2684930,2684931,2684932,2684933,2684934,2684935,2684936,2684937,2684938,2684939,2684940,2684941,2684942,2684943],"Spruce Wall Sign":[2685184,2685185,2685186,2685187],"Spruce Wood":[2685440,2685441,2685442,2685443,2685444,2685445],"Stained Clay":[2685696,2685697,2685698,2685699,2685700,2685701,2685702,2685703,2685704,2685705,2685706,2685707,2685708,2685709,2685710,2685711],"Stained Glass":[2685952,2685953,2685954,2685955,2685956,2685957,2685958,2685959,2685960,2685961,2685962,2685963,2685964,2685965,2685966,2685967],"Stained Glass Pane":[2686208,2686209,2686210,2686211,2686212,2686213,2686214,2686215,2686216,2686217,2686218,2686219,2686220,2686221,2686222,2686223],"Stained Hardened Glass":[2686464,2686465,2686466,2686467,2686468,2686469,2686470,2686471,2686472,2686473,2686474,2686475,2686476,2686477,2686478,2686479],"Stained Hardened Glass Pane":[2686720,2686721,2686722,2686723,2686724,2686725,2686726,2686727,2686728,2686729,2686730,2686731,2686732,2686733,2686734,2686735],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687234],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687824,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687952],"Stone Bricks":[2688000],"Stone Button":[2688256,2688257,2688258,2688259,2688260,2688261,2688264,2688265,2688266,2688267,2688268,2688269],"Stone Pressure Plate":[2688512,2688513],"Stone Slab":[2688768,2688769,2688770],"Stone Stairs":[2689024,2689025,2689026,2689027,2689028,2689029,2689030,2689031],"Stonecutter":[2689280,2689281,2689282,2689283],"Strontium":[2619392],"Sugarcane":[2692608,2692609,2692610,2692611,2692612,2692613,2692614,2692615,2692616,2692617,2692618,2692619,2692620,2692621,2692622,2692623],"Sulfur":[2619648],"Sunflower":[2692864,2692865],"Sweet Berry Bush":[2693120,2693121,2693122,2693123],"TNT":[2693632,2693633,2693634,2693635],"Tall Grass":[2693376],"Tantalum":[2619904],"Technetium":[2620160],"Tellurium":[2620416],"Tennessine":[2620672],"Terbium":[2620928],"Thallium":[2621184],"Thorium":[2621440],"Thulium":[2621696],"Tin":[2621952],"Tinted Glass":[2722304],"Titanium":[2622208],"Torch":[2693889,2693890,2693891,2693892,2693893],"Trapped Chest":[2694144,2694145,2694146,2694147],"Tripwire":[2694400,2694401,2694402,2694403,2694404,2694405,2694406,2694407,2694408,2694409,2694410,2694411,2694412,2694413,2694414,2694415],"Tripwire Hook":[2694656,2694657,2694658,2694659,2694660,2694661,2694662,2694663,2694664,2694665,2694666,2694667,2694668,2694669,2694670,2694671],"Tuff":[2710784],"Tungsten":[2622464],"Twisting Vines":[2734080,2734081,2734082,2734083,2734084,2734085,2734086,2734087,2734088,2734089,2734090,2734091,2734092,2734093,2734094,2734095,2734096,2734097,2734098,2734099,2734100,2734101,2734102,2734103,2734104,2734105],"Underwater Torch":[2694913,2694914,2694915,2694916,2694917],"Uranium":[2622720],"Vanadium":[2622976],"Vines":[2695168,2695169,2695170,2695171,2695172,2695173,2695174,2695175,2695176,2695177,2695178,2695179,2695180,2695181,2695182,2695183],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695684,2695688,2695689,2695690,2695691,2695692,2695696,2695697,2695698,2695699,2695700,2695704,2695705,2695706,2695707,2695708,2695712,2695713,2695714,2695715,2695716,2695720,2695721,2695722,2695723,2695724,2695728,2695729,2695730,2695731,2695732,2695736,2695737,2695738,2695739,2695740],"Warped Button":[2717440,2717441,2717442,2717443,2717444,2717445,2717448,2717449,2717450,2717451,2717452,2717453],"Warped Door":[2718976,2718977,2718978,2718979,2718980,2718981,2718982,2718983,2718984,2718985,2718986,2718987,2718988,2718989,2718990,2718991,2718992,2718993,2718994,2718995,2718996,2718997,2718998,2718999,2719000,2719001,2719002,2719003,2719004,2719005,2719006,2719007],"Warped Fence":[2713600],"Warped Fence Gate":[2719744,2719745,2719746,2719747,2719748,2719749,2719750,2719751,2719752,2719753,2719754,2719755,2719756,2719757,2719758,2719759],"Warped Hyphae":[2715904,2715905,2715906,2715907,2715908,2715909],"Warped Planks":[2712832],"Warped Pressure Plate":[2718208,2718209],"Warped Sign":[2721280,2721281,2721282,2721283,2721284,2721285,2721286,2721287,2721288,2721289,2721290,2721291,2721292,2721293,2721294,2721295],"Warped Slab":[2714368,2714369,2714370],"Warped Stairs":[2720512,2720513,2720514,2720515,2720516,2720517,2720518,2720519],"Warped Stem":[2715136,2715137,2715138,2715139,2715140,2715141],"Warped Trapdoor":[2716672,2716673,2716674,2716675,2716676,2716677,2716678,2716679,2716680,2716681,2716682,2716683,2716684,2716685,2716686,2716687],"Warped Wall Sign":[2722048,2722049,2722050,2722051],"Warped Wart Block":[2726912],"Water":[2695936,2695937,2695938,2695939,2695940,2695941,2695942,2695943,2695944,2695945,2695946,2695947,2695948,2695949,2695950,2695951,2695952,2695953,2695954,2695955,2695956,2695957,2695958,2695959,2695960,2695961,2695962,2695963,2695964,2695965,2695966,2695967],"Water Cauldron":[2731776,2731777,2731778,2731779,2731780,2731781],"Weeping Vines":[2734336,2734337,2734338,2734339,2734340,2734341,2734342,2734343,2734344,2734345,2734346,2734347,2734348,2734349,2734350,2734351,2734352,2734353,2734354,2734355,2734356,2734357,2734358,2734359,2734360,2734361],"Weighted Pressure Plate Heavy":[2696192,2696193,2696194,2696195,2696196,2696197,2696198,2696199,2696200,2696201,2696202,2696203,2696204,2696205,2696206,2696207],"Weighted Pressure Plate Light":[2696448,2696449,2696450,2696451,2696452,2696453,2696454,2696455,2696456,2696457,2696458,2696459,2696460,2696461,2696462,2696463],"Wheat Block":[2696704,2696705,2696706,2696707,2696708,2696709,2696710,2696711],"White Tulip":[2697216],"Wither Rose":[2729984],"Wool":[2697472,2697473,2697474,2697475,2697476,2697477,2697478,2697479,2697480,2697481,2697482,2697483,2697484,2697485,2697486,2697487],"Xenon":[2623232],"Ytterbium":[2623488],"Yttrium":[2623744],"Zinc":[2624256],"Zirconium":[2624512],"ate!upd":[2637056],"reserved6":[2674944],"update!":[2636800]},"stateDataBits":8} \ No newline at end of file From a39f61a33dd687809080aceb79a9cf341398f2b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:18:01 +0000 Subject: [PATCH 0653/1858] Release 4.16.0-BETA1 --- changelogs/4.16-beta.md | 37 +++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.16-beta.md diff --git a/changelogs/4.16-beta.md b/changelogs/4.16-beta.md new file mode 100644 index 0000000000..1ffc0f9305 --- /dev/null +++ b/changelogs/4.16-beta.md @@ -0,0 +1,37 @@ +**For Minecraft: Bedrock Edition 1.19.62** + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.16.0-BETA1 +## General +- Added granular timings for packet encode, similar to the existing timings for packet decode. +- Timings now covers several areas of the network system which were previously not counted by network timings, but were counted by total timings. This provides a better insight into the performance of the network system. + +## Performance +- Improved performance of packet batch handling by avoiding unnecessary object allocations. +- Improved performance of packet broadcasting when the broadcast size is below the batch threshold. Previously, the packets would be encoded once by every recipient, but now they are encoded once and then added to the send buffer of each session in their raw form. + - This change mostly affects servers with larger maps, where players are more widely distributed. + +## Build system +- Added a new script `build/generate-bedrockdata-path-consts.php`, which must be run whenever BedrockData is updated. This script generates a class of constants with the file paths of all BedrockData files. + +## API +### `pocketmine\entity` +- The following new API methods have been added: + - `public Entity->getGravity() : float` - returns the entity's gravity acceleration in blocks/tick^2 + - `public Entity->setGravity(float $gravity) : void` - sets the entity's gravity acceleration in blocks/tick^2 + +## Internals +- Now uses [`pocketmine/bedrock-data` 2.0.0](https://github.com/pmmp/BedrockData/releases/tag/2.0.0+bedrock-1.19.60). + - This version is now used by both PM4 and PM5, reducing maintenance burden. +- Now uses [`pocketmine/bedrock-protocol` 19.3.0](https://github.com/pmmp/BedrockProtocol/releases/tag/19.3.0+bedrock-1.19.62). + - This version provides new APIs for handling packet batches which enabled improving performance and adding new features, such as detailed packet encode timings. +- Crafting recipes and creative inventory data are now loaded from `recipes/legacy_recipes.json` and `recipes/legacy_creativeitems.json` respectively. Previously, these were loaded from BedrockData directly, but BedrockData 2.0 now uses a format which can't be supported in 4.x without BC breaks. +- Added dependencies on [`pocketmine/bedrock-block-upgrade-schema`](https://github.com/pmmp/BedrockBlockUpgradeSchema) and [`pocketmine/bedrock-item-upgrade-schema`](https://github.com/pmmp/BedrockItemUpgradeSchema). These provide mapping files no longer present in BedrockData 2.0. +- Reduced and/or eliminated most usages of `PacketBatch`, since it only appeared as a throwaway object and was therefore wasting performance. +- `Compressor` now exposes `getCompressionThreshold()` instead of `willCompress()`, which allows determining whether a batch will be compressed without allocating it. +- Added `pocketmine\data\bedrock\BedrockDataFiles`, an auto-generated class of constants with the file paths of all BedrockData files. This makes it easier to locate usages, detect unused files and avoid typos. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b54f8eed1b..5228d48aa2 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.16.0-BETA1"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 6d636fc2c7f836239c0cea80f0468a922c92dba2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:18:04 +0000 Subject: [PATCH 0654/1858] 4.16.0-BETA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5228d48aa2..18caedbc3f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.16.0-BETA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.16.0-BETA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 14e7d3e143b2baf4aa6595e368c7900cb3687d13 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:19:34 +0000 Subject: [PATCH 0655/1858] Release 4.16.0-BETA2 --- changelogs/4.16-beta.md | 8 ++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/changelogs/4.16-beta.md b/changelogs/4.16-beta.md index 1ffc0f9305..ba68472868 100644 --- a/changelogs/4.16-beta.md +++ b/changelogs/4.16-beta.md @@ -7,6 +7,8 @@ Plugin developers should **only** update their required API to this version if y **WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. # 4.16.0-BETA1 +Released 4th March 2023. + ## General - Added granular timings for packet encode, similar to the existing timings for packet decode. - Timings now covers several areas of the network system which were previously not counted by network timings, but were counted by total timings. This provides a better insight into the performance of the network system. @@ -35,3 +37,9 @@ Plugin developers should **only** update their required API to this version if y - Reduced and/or eliminated most usages of `PacketBatch`, since it only appeared as a throwaway object and was therefore wasting performance. - `Compressor` now exposes `getCompressionThreshold()` instead of `willCompress()`, which allows determining whether a batch will be compressed without allocating it. - Added `pocketmine\data\bedrock\BedrockDataFiles`, an auto-generated class of constants with the file paths of all BedrockData files. This makes it easier to locate usages, detect unused files and avoid typos. + +# 4.16.0-BETA2 +Released 4th March 2023. + +## General +- Fixed incorrect release channel for 4.16.0-BETA1. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 18caedbc3f..2479e7be77 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,8 +32,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.16.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "stable"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "beta"; private function __construct(){ //NOOP From eb2f0ed3d0cc836f67b72e2feeaa9425ff8faca4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:19:34 +0000 Subject: [PATCH 0656/1858] 4.16.0-BETA3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2479e7be77..9314226b25 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.16.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.16.0-BETA3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From 70f1ee3e9763d44f072ed4005ebb7420558e60c3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:28:18 +0000 Subject: [PATCH 0657/1858] draft-release: set prerelease flag properly --- .github/workflows/draft-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 0b7217a08e..112155ba4c 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -56,6 +56,7 @@ jobs: echo ::set-output name=PM_VERSION_SHORT::$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\VersionInfo::BASE_VERSION); array_pop($v); echo implode(".", $v);') echo ::set-output name=PM_VERSION_MD::$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\VersionInfo::BASE_VERSION);') echo ::set-output name=CHANGELOG_SUFFIX::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') + echo ::set-output name=PRERELEASE::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "false" : "true";') - name: Generate build info run: php build/generate-build-info-json.php ${{ github.sha }} ${{ steps.get-pm-version.outputs.PM_VERSION }} ${{ github.repository }} ${{ steps.build-number.outputs.BUILD_NUMBER }} ${{ github.run_id }} > build_info.json @@ -75,6 +76,7 @@ jobs: artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json commit: ${{ github.sha }} draft: true + prerelease: ${{ steps.get-pm-version.outputs.PRERELEASE }} name: PocketMine-MP ${{ steps.get-pm-version.outputs.PM_VERSION }} tag: ${{ steps.get-pm-version.outputs.PM_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} From f8893efb941e2504d1826fca6114cd2e69d94358 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:34:00 +0000 Subject: [PATCH 0658/1858] Don't bother with global batch compression if there is only 1 recipient this allows the session to achieve better ratios, and also reduces worker pool spam. --- src/network/mcpe/StandardPacketBroadcaster.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 3bdbbe9556..342efce0a8 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -64,7 +64,7 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $compressor = $compressors[$compressorId]; $threshold = $compressor->getCompressionThreshold(); - if($threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ + if(count($compressorTargets) > 1 && $threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ //do not prepare shared batch unless we're sure it will be compressed $stream = new BinaryStream(); PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); From a523189149db1dc935f9b9eb537abb84e38a6749 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:41:41 +0000 Subject: [PATCH 0659/1858] Added separate timings for broadcast and session buffer compression --- src/Server.php | 7 ++++--- src/network/mcpe/NetworkSession.php | 2 +- src/network/mcpe/StandardPacketBroadcaster.php | 3 ++- src/timings/Timings.php | 6 ++++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Server.php b/src/Server.php index e65b9d8ef9..e5f312f4e0 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1381,9 +1381,10 @@ class Server{ * * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). */ - public function prepareBatch(PacketBatch $stream, Compressor $compressor, ?bool $sync = null) : CompressBatchPromise{ + public function prepareBatch(PacketBatch $stream, Compressor $compressor, ?bool $sync = null, ?TimingsHandler $timings = null) : CompressBatchPromise{ + $timings ??= Timings::$playerNetworkSendCompress; try{ - Timings::$playerNetworkSendCompress->startTiming(); + $timings->startTiming(); $buffer = $stream->getBuffer(); @@ -1402,7 +1403,7 @@ class Server{ return $promise; }finally{ - Timings::$playerNetworkSendCompress->stopTiming(); + $timings->stopTiming(); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 8becf1260e..04512e3497 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -528,7 +528,7 @@ class NetworkSession{ PacketBatch::encodeRaw($stream, $this->sendBuffer); if($this->enableCompression){ - $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); + $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode, Timings::$playerNetworkSendCompressSessionBuffer); }else{ $promise = new CompressBatchPromise(); $promise->resolve($stream->getBuffer()); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 342efce0a8..cca6daec58 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\Server; +use pocketmine\timings\Timings; use pocketmine\utils\BinaryStream; use function spl_object_id; use function strlen; @@ -70,7 +71,7 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); $batchBuffer = $stream->getBuffer(); - $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor); + $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); foreach($compressorTargets as $target){ $target->queueCompressed($promise); } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 7d3942d3cd..1faab0ea17 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -52,6 +52,10 @@ abstract class Timings{ public static $playerNetworkSend; /** @var TimingsHandler */ public static $playerNetworkSendCompress; + + public static TimingsHandler $playerNetworkSendCompressBroadcast; + public static TimingsHandler $playerNetworkSendCompressSessionBuffer; + /** @var TimingsHandler */ public static $playerNetworkSendEncrypt; /** @var TimingsHandler */ @@ -153,6 +157,8 @@ abstract class Timings{ self::$playerNetworkSend = new TimingsHandler("Player Network Send"); self::$playerNetworkSendCompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression", self::$playerNetworkSend); + self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress); + self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress); self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend); self::$playerNetworkReceive = new TimingsHandler("Player Network Receive"); From 3db1492c18255dce2066e9575f2d1245c86f69da Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:43:29 +0000 Subject: [PATCH 0660/1858] Fix CS again --- src/network/mcpe/StandardPacketBroadcaster.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index cca6daec58..f1009d23b2 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -28,6 +28,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\BinaryStream; +use function count; use function spl_object_id; use function strlen; From 035d4b7263cdbef17610fbc1c8bf7d6f3813a8d6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:47:58 +0000 Subject: [PATCH 0661/1858] MemoryManager: stringify floats, fixes #5598 --- src/MemoryManager.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 06ed0656d9..e04c5e857c 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -49,6 +49,7 @@ use function ini_get; use function ini_set; use function intdiv; use function is_array; +use function is_float; use function is_object; use function is_resource; use function is_string; @@ -519,6 +520,8 @@ class MemoryManager{ $data = "(string) len(" . strlen($from) . ") " . substr(Utils::printable($from), 0, $maxStringSize); }elseif(is_resource($from)){ $data = "(resource) " . print_r($from, true); + }elseif(is_float($from)){ + $data = "(float) $from"; }else{ $data = $from; } From 3aa40829aee629102e46ebf11a709b13c381a7f9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:55:31 +0000 Subject: [PATCH 0662/1858] Update composer dependencies --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 1abc4e881f..9b554c95fc 100644 --- a/composer.lock +++ b/composer.lock @@ -1034,16 +1034,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" + "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", + "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", "shasum": "" }, "require": { @@ -1078,7 +1078,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.19" + "source": "https://github.com/symfony/filesystem/tree/v5.4.21" }, "funding": [ { @@ -1094,7 +1094,7 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/polyfill-ctype", From 4073c3fb393b19c0393250e9a877fa18f801b6a7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 16:56:08 +0000 Subject: [PATCH 0663/1858] Update composer dependencies --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index be4cd1fecd..6865b7d7f5 100644 --- a/composer.lock +++ b/composer.lock @@ -1943,16 +1943,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.9", + "version": "1.3.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "34ee324a2b8fcab680fbb3f3f3d6c86389df35ba" + "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/34ee324a2b8fcab680fbb3f3f3d6c86389df35ba", - "reference": "34ee324a2b8fcab680fbb3f3f3d6c86389df35ba", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4cc5c6cc38e56bce7ea47c4091814e516d172dc3", + "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3", "shasum": "" }, "require": { @@ -1989,9 +1989,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.9" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.10" }, - "time": "2023-02-28T13:04:23+00:00" + "time": "2023-03-02T10:25:13+00:00" }, { "name": "phpstan/phpstan-strict-rules", From 87a2e0460c69f2d35ef04648730a5abf65bf4e78 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Mar 2023 17:09:32 +0000 Subject: [PATCH 0664/1858] Ping Discord news subscribers on new releases --- .github/workflows/discord-release-embed.php | 11 ++++++----- .github/workflows/discord-release-notify.yml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/discord-release-embed.php b/.github/workflows/discord-release-embed.php index 41ef898789..9bcb41bc8c 100644 --- a/.github/workflows/discord-release-embed.php +++ b/.github/workflows/discord-release-embed.php @@ -18,8 +18,9 @@ require dirname(__DIR__, 2) . '/vendor/autoload.php'; /** * @phpstan-return array */ -function generateDiscordEmbed(string $version, string $channel, string $description, string $detailsUrl, string $sourceUrl, string $pharDownloadUrl, string $buildLogUrl) : array{ +function generateDiscordEmbed(string $version, string $channel, string $description, string $detailsUrl, string $sourceUrl, string $pharDownloadUrl, string $buildLogUrl, int $newsPingRoleId) : array{ return [ + "content" => "<@&$newsPingRoleId> New PocketMine-MP release: $version ($channel)", "embeds" => [ [ "title" => "New PocketMine-MP release: $version ($channel)", @@ -35,11 +36,11 @@ DESCRIPTION, ]; } -if(count($argv) !== 5){ - fwrite(STDERR, "Required arguments: github repo, version, API token\n"); +if(count($argv) !== 6){ + fwrite(STDERR, "Required arguments: github repo, version, API token, webhook URL, ping role ID\n"); exit(1); } -[, $repo, $tagName, $token, $hookURL] = $argv; +[, $repo, $tagName, $token, $hookURL, $newsPingRoleId] = $argv; $result = Internet::getURL('https://api.github.com/repos/' . $repo . '/releases/tags/' . $tagName, extraHeaders: [ 'Authorization: token ' . $token @@ -86,7 +87,7 @@ $buildLogUrl = $buildInfoJson["build_log_url"]; $description = $releaseInfoJson["body"]; -$discordPayload = generateDiscordEmbed($buildInfoJson["base_version"], $buildInfoJson["channel"], $description, $detailsUrl, $sourceUrl, $pharDownloadUrl, $buildLogUrl); +$discordPayload = generateDiscordEmbed($buildInfoJson["base_version"], $buildInfoJson["channel"], $description, $detailsUrl, $sourceUrl, $pharDownloadUrl, $buildLogUrl, (int) $newsPingRoleId); $response = Internet::postURL( $hookURL, diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 91fb4c83e8..2a5cadf2db 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -35,4 +35,4 @@ jobs: run: echo ::set-output name=TAG_NAME::$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') - name: Run webhook post script - run: php .github/workflows/discord-release-embed.php ${{ github.repository }} ${{ steps.tag-name.outputs.TAG_NAME }} ${{ github.token }} ${{ secrets.DISCORD_RELEASE_WEBHOOK }} + run: php .github/workflows/discord-release-embed.php ${{ github.repository }} ${{ steps.tag-name.outputs.TAG_NAME }} ${{ github.token }} ${{ secrets.DISCORD_RELEASE_WEBHOOK }} ${{ secrets.DISCORD_NEWS_PING_ROLE_ID }} From 8933064cd575d3e057e500e6bd907765133fed35 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Mar 2023 17:02:33 +0000 Subject: [PATCH 0665/1858] Fixed missing blockstate upgrader --- src/world/format/io/GlobalBlockStateHandlers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 1d7476acdd..0fbc1c91ae 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -43,7 +43,7 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; * benefits for now. */ final class GlobalBlockStateHandlers{ - public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 151; //https://github.com/pmmp/BedrockBlockUpgradeSchema/blob/b0cc441e029cf5a6de5b05dd0f5657208855232b/nbt_upgrade_schema/0151_1.19.0.34_beta_to_1.19.20.json + public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 161; //0161_1.19.50_to_1.19.60.26_beta.json private static ?BlockObjectToStateSerializer $blockStateSerializer = null; From a05e8b366f9bb3f450b094c3081ca5564f4de220 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:40:08 +0000 Subject: [PATCH 0666/1858] Bump phpstan/phpstan from 1.10.3 to 1.10.4 (#5610) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.3 to 1.10.4. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.3...1.10.4) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 2f24b36604..6a7ae8275a 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.3", + "phpstan/phpstan": "1.10.4", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 9b554c95fc..c06a82b8ea 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b08764ff79ef4e00a5f7a7b08145c5de", + "content-hash": "379b9119e336f110eef12091b79f41d5", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.3", + "version": "1.10.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5419375b5891add97dc74be71e6c1c34baaddf64" + "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5419375b5891add97dc74be71e6c1c34baaddf64", - "reference": "5419375b5891add97dc74be71e6c1c34baaddf64", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8d39218664b45a4a42d5be66d2b63dcf8c149982", + "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.3" + "source": "https://github.com/phpstan/phpstan/tree/1.10.4" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T14:47:13+00:00" + "time": "2023-03-06T13:39:20+00:00" }, { "name": "phpstan/phpstan-phpunit", From a784d93bfdb2186b89e54c83a03e084c1c217071 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:13:16 +0000 Subject: [PATCH 0667/1858] Update composer dependencies --- composer.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/composer.lock b/composer.lock index 9b554c95fc..20f4c1e4c7 100644 --- a/composer.lock +++ b/composer.lock @@ -728,16 +728,16 @@ }, { "name": "pocketmine/raklib", - "version": "0.14.5", + "version": "0.14.6", "source": { "type": "git", "url": "https://github.com/pmmp/RakLib.git", - "reference": "85b4e5cb7117d37e010eeadb3ff53b21276c6f48" + "reference": "aeca667d5ecc4cc18fded612f29e3511bbf62f42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/85b4e5cb7117d37e010eeadb3ff53b21276c6f48", - "reference": "85b4e5cb7117d37e010eeadb3ff53b21276c6f48", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/aeca667d5ecc4cc18fded612f29e3511bbf62f42", + "reference": "aeca667d5ecc4cc18fded612f29e3511bbf62f42", "shasum": "" }, "require": { @@ -749,7 +749,7 @@ "pocketmine/log": "^0.3.0 || ^0.4.0" }, "require-dev": { - "phpstan/phpstan": "1.7.7", + "phpstan/phpstan": "1.9.17", "phpstan/phpstan-strict-rules": "^1.0" }, "type": "library", @@ -765,9 +765,9 @@ "description": "A RakNet server implementation written in PHP", "support": { "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/0.14.5" + "source": "https://github.com/pmmp/RakLib/tree/0.14.6" }, - "time": "2022-08-25T16:16:44+00:00" + "time": "2023-03-07T15:10:23+00:00" }, { "name": "pocketmine/raklib-ipc", @@ -1665,16 +1665,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.15.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", "shasum": "" }, "require": { @@ -1715,9 +1715,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-03-05T19:49:14+00:00" }, { "name": "phar-io/manifest", @@ -1992,16 +1992,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.25", + "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954" + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954", - "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { @@ -2023,8 +2023,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -2057,7 +2057,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { @@ -2065,7 +2065,7 @@ "type": "github" } ], - "time": "2023-02-25T05:32:00+00:00" + "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", From a49957682e3952466cef4645d53b069b660ede12 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:15:05 +0000 Subject: [PATCH 0668/1858] Update RakLib --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 95125029ed..8caa44c214 100644 --- a/composer.lock +++ b/composer.lock @@ -780,16 +780,16 @@ }, { "name": "pocketmine/raklib", - "version": "0.15.0", + "version": "0.15.1", "source": { "type": "git", "url": "https://github.com/pmmp/RakLib.git", - "reference": "1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1" + "reference": "79b7b4d1d7516dc6e322514453645ad9452b20ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1", - "reference": "1f490cff6bf5e9eb46ebdbf7a7994d62be2bd2c1", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/79b7b4d1d7516dc6e322514453645ad9452b20ca", + "reference": "79b7b4d1d7516dc6e322514453645ad9452b20ca", "shasum": "" }, "require": { @@ -817,9 +817,9 @@ "description": "A RakNet server implementation written in PHP", "support": { "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/0.15.0" + "source": "https://github.com/pmmp/RakLib/tree/0.15.1" }, - "time": "2023-02-13T12:56:35+00:00" + "time": "2023-03-07T15:10:34+00:00" }, { "name": "pocketmine/raklib-ipc", From ef942a627ff38bba9658639e70fde12c9a3c342f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:23:12 +0000 Subject: [PATCH 0669/1858] actions: drop concurrency group this is causing builds to get randomly cancelled when multiple branches are pushed at once. --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ad9fc56ec8..050353b17b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,6 @@ jobs: build-php: name: Prepare PHP runs-on: ${{ matrix.image }} - concurrency: php-build-${{ matrix.php }} strategy: matrix: From 9d442f2104b934b4031af93b650ad80cff745fc0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:25:22 +0000 Subject: [PATCH 0670/1858] Update composer dependencies --- composer.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/composer.lock b/composer.lock index 8caa44c214..554bdb2400 100644 --- a/composer.lock +++ b/composer.lock @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" + "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/78c965a2316986ac0eaf3235d75efb187127e7a2", + "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2", "shasum": "" }, "type": "library", @@ -270,9 +270,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.0" }, - "time": "2023-02-01T21:09:54+00:00" + "time": "2023-03-06T17:53:36+00:00" }, { "name": "pocketmine/bedrock-data", @@ -1608,16 +1608,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.15.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", "shasum": "" }, "require": { @@ -1658,9 +1658,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-03-05T19:49:14+00:00" }, { "name": "phar-io/manifest", @@ -1935,16 +1935,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.25", + "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954" + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954", - "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { @@ -1966,8 +1966,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -2000,7 +2000,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { @@ -2008,7 +2008,7 @@ "type": "github" } ], - "time": "2023-02-25T05:32:00+00:00" + "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", From 71e3e3652250130762110c63a2649b04865fc74c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:33:03 +0000 Subject: [PATCH 0671/1858] Release 4.15.3 --- changelogs/4.15.md | 9 ++++++++- src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/changelogs/4.15.md b/changelogs/4.15.md index b4a1f5dc41..32413bf7ad 100644 --- a/changelogs/4.15.md +++ b/changelogs/4.15.md @@ -28,4 +28,11 @@ Released 24th February 2023. - Accept Minecraft: Bedrock Edition 1.19.63 (identical protocol to 1.19.62, but different version due to Mojang mixup). ## Fixes -- Fixed `World Population` timer sometimes not being stopped, causing strange results in timings reports. \ No newline at end of file +- Fixed `World Population` timer sometimes not being stopped, causing strange results in timings reports. + +# 4.15.3 +Released 7th March 2023. + +## Fixes +- Fixed `/dumpmemory` crash when any object contained an `INF` or `NaN` float value. +- Updated RakLib for security fixes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b54f8eed1b..7bc5b2ad18 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.15.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 616844696ecb774ae40acc5c479f138cfc8da657 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 15:33:03 +0000 Subject: [PATCH 0672/1858] 4.15.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7bc5b2ad18..84c712e65a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.15.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 93d844a28189bf954560b741d4682aa04e21d2cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 16:12:27 +0000 Subject: [PATCH 0673/1858] build/make-release: improve support for non-stable release channels --- build/make-release.php | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/build/make-release.php b/build/make-release.php index 610dbbe6d9..4466e7b6f4 100644 --- a/build/make-release.php +++ b/build/make-release.php @@ -36,11 +36,13 @@ use function fwrite; use function getopt; use function is_string; use function max; +use function preg_match; use function preg_replace; use function sleep; use function sprintf; use function str_pad; use function strlen; +use function strtolower; use function system; use const STDERR; use const STDIN; @@ -102,22 +104,43 @@ function main() : void{ $filteredOpts[$optName] = $optValue; } + $channel = $filteredOpts["channel"] ?? null; if(isset($filteredOpts["current"])){ $currentVer = new VersionString($filteredOpts["current"]); }else{ $currentVer = new VersionString(VersionInfo::BASE_VERSION); } - if(isset($filteredOpts["next"])){ - $nextVer = new VersionString($filteredOpts["next"]); + + $nextVer = isset($filteredOpts["next"]) ? new VersionString($filteredOpts["next"]) : null; + + $suffix = $currentVer->getSuffix(); + if($suffix !== ""){ + if($channel === "stable"){ + fwrite(STDERR, "error: cannot release a suffixed build into the stable channel\n"); + exit(1); + } + if(preg_match('/^([A-Za-z]+)(\d+)$/', $suffix, $matches) !== 1){ + echo "error: invalid current version suffix \"$suffix\"; aborting\n"; + exit(1); + } + $nextVer ??= new VersionString(sprintf( + "%u.%u.%u-%s%u", + $currentVer->getMajor(), + $currentVer->getMinor(), + $currentVer->getPatch(), + $matches[1], + ((int) $matches[2]) + 1 + )); + $channel ??= strtolower($matches[1]); }else{ - $nextVer = new VersionString(sprintf( + $nextVer ??= new VersionString(sprintf( "%u.%u.%u", $currentVer->getMajor(), $currentVer->getMinor(), $currentVer->getPatch() + 1 )); + $channel ??= "stable"; } - $channel = $filteredOpts["channel"] ?? VersionInfo::BUILD_CHANNEL; echo "About to tag version $currentVer. Next version will be $nextVer.\n"; echo "$currentVer will be published on release channel \"$channel\".\n"; From fa131dab1259c25d48c41b4ce82de5f833eb0326 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 16:19:50 +0000 Subject: [PATCH 0674/1858] Release 4.16.0 --- changelogs/4.16.md | 41 +++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +++--- 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.16.md diff --git a/changelogs/4.16.md b/changelogs/4.16.md new file mode 100644 index 0000000000..9ba623b85b --- /dev/null +++ b/changelogs/4.16.md @@ -0,0 +1,41 @@ +**For Minecraft: Bedrock Edition 1.19.62** + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.16.0 +Released 7th March 2023. + +## General +- Added granular timings for packet encode, similar to the existing timings for packet decode. +- Split `Player Network Send - Compression` timings into two timers, one for `Session Buffer` compression and one for `Broadcast` compression. +- Timings now covers several areas of the network system which were previously not counted by network timings, but were counted by total timings. This provides a better insight into the performance of the network system. + +## Performance +- Improved performance of packet batch handling by avoiding unnecessary object allocations. +- Improved performance of packet broadcasting when the broadcast size is below the batch threshold. Previously, the packets would be encoded once by every recipient, but now they are encoded once and then added to the send buffer of each session in their raw form. + - This change mostly affects servers with larger maps, where players are more widely distributed. +- Improved performance of packet broadcasting when the broadcast has only one recipient (allow the session to compress the packet with the rest of its buffer). + +## Build system +- Added a new script `build/generate-bedrockdata-path-consts.php`, which must be run whenever BedrockData is updated. This script generates a class of constants with the file paths of all BedrockData files. + +## API +### `pocketmine\entity` +- The following new API methods have been added: + - `public Entity->getGravity() : float` - returns the entity's gravity acceleration in blocks/tick^2 + - `public Entity->setGravity(float $gravity) : void` - sets the entity's gravity acceleration in blocks/tick^2 + +## Internals +- Now uses [`pocketmine/bedrock-data` 2.0.0](https://github.com/pmmp/BedrockData/releases/tag/2.0.0+bedrock-1.19.60). + - This version is now used by both PM4 and PM5, reducing maintenance burden. +- Now uses [`pocketmine/bedrock-protocol` 19.3.0](https://github.com/pmmp/BedrockProtocol/releases/tag/19.3.0+bedrock-1.19.62). + - This version provides new APIs for handling packet batches which enabled improving performance and adding new features, such as detailed packet encode timings. +- Crafting recipes and creative inventory data are now loaded from `recipes/legacy_recipes.json` and `recipes/legacy_creativeitems.json` respectively. Previously, these were loaded from BedrockData directly, but BedrockData 2.0 now uses a format which can't be supported in 4.x without BC breaks. +- Added dependencies on [`pocketmine/bedrock-block-upgrade-schema`](https://github.com/pmmp/BedrockBlockUpgradeSchema) and [`pocketmine/bedrock-item-upgrade-schema`](https://github.com/pmmp/BedrockItemUpgradeSchema). These provide mapping files no longer present in BedrockData 2.0. +- Reduced and/or eliminated most usages of `PacketBatch`, since it only appeared as a throwaway object and was therefore wasting performance. +- `Compressor` now exposes `getCompressionThreshold()` instead of `willCompress()`, which allows determining whether a batch will be compressed without allocating it. +- Added `pocketmine\data\bedrock\BedrockDataFiles`, an auto-generated class of constants with the file paths of all BedrockData files. This makes it easier to locate usages, detect unused files and avoid typos. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9314226b25..c15d1af7bd 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.16.0-BETA3"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "beta"; + public const BASE_VERSION = "4.16.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; private function __construct(){ //NOOP From 3aec0fa3df488f8515a986e07d35aacfb07e8cf4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 16:19:51 +0000 Subject: [PATCH 0675/1858] 4.16.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c15d1af7bd..079605b389 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.16.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.16.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 9e329d55a8d25b5857cfcb882d5ea383b4ec3e6f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 16:51:53 +0000 Subject: [PATCH 0676/1858] Release 5.0.0-BETA1 --- changelogs/5.0-beta.md | 44 ++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +++--- 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 changelogs/5.0-beta.md diff --git a/changelogs/5.0-beta.md b/changelogs/5.0-beta.md new file mode 100644 index 0000000000..0fef808fcc --- /dev/null +++ b/changelogs/5.0-beta.md @@ -0,0 +1,44 @@ +**For Minecraft: Bedrock Edition 1.19.62** + +5.0.0 is a major update to PocketMine-MP, including many new features and API changes. It is **not** compatible with plugins written for previous versions of PocketMine-MP. + +**During the beta phase, no new features will be added.** + +This stage of development is focused on stability and cleaning up any major issues introduced during the alpha stage. + +## WARNING +**This is a BETA release.** This means that it may be unstable, and is not yet ready for production use. + +Since this version has undergone substantial changes compared to 4.x, plugins written for 4.x will need to be updated to work on this version. + +Breaking API changes may still occur during the beta phase, but only if they are strictly necessary to fix a problem prior to full release. + +**BACK UP your data before testing this.** This version will work with worlds and player data from 4.x, +BUT any world or player data loaded in 5.0.0 will not work in 4.x due to backwards-incompatible storage format changes. + +# 5.0.0-BETA1 +Released 7th March 2023. + +**This release includes changes from the following releases:** +- [All 5.0.0 alpha releases](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA1/changelogs/5.0-alpha.md) +- [4.15.2](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA1/changelogs/4.15.md#4152) +- [4.15.3](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA1/changelogs/4.15.md#4153) +- [4.16.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA1/changelogs/4.16.md#4160) + +## API +### `pocketmine\block` +- Improved documentation for the following methods: + - `Block->getTypeId()` + - `Block->getStateId()` + - `Block->describeType()` + - `Block->describeState()` + +### `pocketmine\command` +- The following API methods have been renamed: + - `Command->getPermission()` -> `Command->getPermissions()` + +## Internals +- The following methods have been renamed: + - `Block->computeStateData()` -> `Block->computeTypeAndStateData()` + - `Block->decodeStateData()` -> `Block->decodeTypeAndStateData()` +- Wall state data now packs connections into 7 bits instead of 8. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 51f9cca157..05e917d81e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-ALPHA10"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "alpha"; + public const BASE_VERSION = "5.0.0-BETA1"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "beta"; private function __construct(){ //NOOP From 867b8945e42f92b639c93199d458f9cc5e3ba9f6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 16:51:57 +0000 Subject: [PATCH 0677/1858] 5.0.0-BETA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 05e917d81e..fd4a0409b9 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-BETA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-BETA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From fff8f0f81517ab12d21793b94c70c9a8bc580d92 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 Mar 2023 17:08:35 +0000 Subject: [PATCH 0678/1858] Use Item->canStackWith() instead of Item->equals() wherever possible --- src/block/tile/Furnace.php | 2 +- src/item/Item.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/tile/Furnace.php b/src/block/tile/Furnace.php index 5364e1d27a..a706a827e7 100644 --- a/src/block/tile/Furnace.php +++ b/src/block/tile/Furnace.php @@ -165,7 +165,7 @@ abstract class Furnace extends Spawnable implements Container, Nameable{ $furnaceType = $this->getFurnaceType(); $smelt = $this->position->getWorld()->getServer()->getCraftingManager()->getFurnaceRecipeManager($furnaceType)->match($raw); - $canSmelt = ($smelt instanceof FurnaceRecipe && $raw->getCount() > 0 && (($smelt->getResult()->equals($product) && $product->getCount() < $product->getMaxStackSize()) || $product->isNull())); + $canSmelt = ($smelt instanceof FurnaceRecipe && $raw->getCount() > 0 && (($smelt->getResult()->canStackWith($product) && $product->getCount() < $product->getMaxStackSize()) || $product->isNull())); if($this->remainingFuelTime <= 0 && $canSmelt && $fuel->getFuelTime() > 0 && $fuel->getCount() > 0){ $this->checkFuel($fuel); diff --git a/src/item/Item.php b/src/item/Item.php index ea2bd61250..d340eb760b 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -637,7 +637,7 @@ class Item implements \JsonSerializable{ * Returns whether the specified item stack has the same ID, damage, NBT and count as this item stack. */ final public function equalsExact(Item $other) : bool{ - return $this->equals($other, true, true) && $this->count === $other->count; + return $this->canStackWith($other) && $this->count === $other->count; } final public function __toString() : string{ From acaa1a9ce121313351a6176b4c18d9e50f0a1d8c Mon Sep 17 00:00:00 2001 From: Dylan T Date: Tue, 7 Mar 2023 17:28:31 +0000 Subject: [PATCH 0679/1858] contributing: update table to reflect branch name changes these branches were renamed to make them more auto-complete-friendly. --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84c5ec297a..44b5be1061 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Larger contributions like feature additions should be preceded by a [Change Prop ## Choosing a target branch PocketMine-MP has three primary branches of development. -| Type of change | `stable` | `next-minor` | `next-major` | +| Type of change | `stable` | `minor-next` | `major-next` | |:---------------|:--------:|:------------:|:------------:| | Bug fixes | ✔️ | ✔️ | ✔️ | | Improvements to API docs | ✔️ | ✔️ | ✔️ | From 6151576baa1c3d933735998b07f032d3fe585aed Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Feb 2023 01:19:50 +0000 Subject: [PATCH 0680/1858] Added model for smithing recipe --- .../CraftingManagerFromDataHelper.php | 2 + .../json/SmithingTransformRecipeData.php | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/crafting/json/SmithingTransformRecipeData.php diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 228e3623a9..0a28ca328f 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -333,6 +333,8 @@ final class CraftingManagerFromDataHelper{ )); } + //TODO: smithing + return $result; } } diff --git a/src/crafting/json/SmithingTransformRecipeData.php b/src/crafting/json/SmithingTransformRecipeData.php new file mode 100644 index 0000000000..dfb203a074 --- /dev/null +++ b/src/crafting/json/SmithingTransformRecipeData.php @@ -0,0 +1,43 @@ +input = $input; + $this->addition = $addition; + $this->output = $output; + $this->block = $block; + } +} \ No newline at end of file From 9b1ec261c47bf8ea4c733541399d72bd6a820b06 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Mar 2023 22:20:12 +0000 Subject: [PATCH 0681/1858] ... --- src/crafting/json/SmithingTransformRecipeData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crafting/json/SmithingTransformRecipeData.php b/src/crafting/json/SmithingTransformRecipeData.php index dfb203a074..3ad78f48d1 100644 --- a/src/crafting/json/SmithingTransformRecipeData.php +++ b/src/crafting/json/SmithingTransformRecipeData.php @@ -40,4 +40,4 @@ final class SmithingTransformRecipeData{ $this->output = $output; $this->block = $block; } -} \ No newline at end of file +} From 54c19fd662812a37758569be7d18c85d8435d7dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Mar 2023 23:04:09 +0000 Subject: [PATCH 0682/1858] Open-source script that generates recipes and other goodies for BedrockData this script has been lurking in my workspace for years, waiting to be cleaned up and open-sourced. --- tools/generate-bedrock-data-from-packets.php | 558 +++++++++++++++++++ 1 file changed, 558 insertions(+) create mode 100644 tools/generate-bedrock-data-from-packets.php diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php new file mode 100644 index 0000000000..3dc8ad172a --- /dev/null +++ b/tools/generate-bedrock-data-from-packets.php @@ -0,0 +1,558 @@ +blockMapping = new RuntimeBlockMapping( + BlockStateDictionary::loadFromString( + Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "canonical_block_states.nbt")), + Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "block_state_meta_map.json")), + ), + GlobalBlockStateHandlers::getSerializer() + ); + } + + private static function blockStatePropertiesToString(BlockStateData $blockStateData) : string{ + $statePropertiesTag = CompoundTag::create(); + foreach(Utils::stringifyKeys($blockStateData->getStates()) as $name => $value){ + $statePropertiesTag->setTag($name, $value); + } + return base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($statePropertiesTag))); + } + + private function itemStackToJson(ItemStack $itemStack) : ItemStackData{ + if($itemStack->getId() === 0){ + throw new InvalidArgumentException("Cannot serialize a null itemstack"); + } + if($this->itemTypeDictionary === null){ + throw new PacketHandlingException("Can't process item yet; haven't received item type dictionary"); + } + $data = new ItemStackData($this->itemTypeDictionary->fromIntId($itemStack->getId())); + + if($itemStack->getCount() !== 1){ + $data->count = $itemStack->getCount(); + } + + $meta = $itemStack->getMeta(); + if($meta === 32767){ + $meta = 0; //kick wildcard magic bullshit + } + if($itemStack->getBlockRuntimeId() !== 0){ + if($meta !== 0){ + throw new PacketHandlingException("Unexpected non-zero blockitem meta"); + } + $blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null; + if($blockState === null){ + throw new PacketHandlingException("Unmapped blockstate ID " . $itemStack->getBlockRuntimeId()); + } + + $stateProperties = $blockState->getStates(); + if(count($stateProperties) > 0){ + $data->block_states = self::blockStatePropertiesToString($blockState); + } + }elseif($meta !== 0){ + $data->meta = $meta; + } + + $nbt = $itemStack->getNbt(); + if($nbt !== null && count($nbt) > 0){ + $data->nbt = base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($nbt))); + } + + if(count($itemStack->getCanPlaceOn()) > 0){ + $data->can_place_on = $itemStack->getCanPlaceOn(); + } + if(count($itemStack->getCanDestroy()) > 0){ + $data->can_destroy = $itemStack->getCanDestroy(); + } + + return $data; + } + + /** + * @return mixed[] + */ + private static function objectToOrderedArray(object $object) : array{ + $result = (array) $object; + ksort($result, SORT_STRING); + + foreach($result as $property => $value){ + if(is_object($value)){ + $result[$property] = self::objectToOrderedArray($value); + }elseif(is_array($value)){ + $array = []; + foreach($value as $k => $v){ + if(is_object($v)){ + $array[$k] = self::objectToOrderedArray($v); + }else{ + $array[$k] = $v; + } + } + + $result[$property] = $array; + } + } + + return $result; + } + + private static function sort(mixed $object) : mixed{ + if(is_object($object)){ + return self::objectToOrderedArray($object); + } + if(is_array($object)){ + $result = []; + foreach($object as $k => $v){ + $result[$k] = self::sort($v); + } + return $result; + } + + return $object; + } + + public function handleStartGame(StartGamePacket $packet) : bool{ + $this->itemTypeDictionary = new ItemTypeDictionary($packet->itemTable); + + echo "updating legacy item ID mapping table\n"; + $table = []; + foreach($packet->itemTable as $entry){ + $table[$entry->getStringId()] = [ + "runtime_id" => $entry->getNumericId(), + "component_based" => $entry->isComponentBased() + ]; + } + ksort($table, SORT_STRING); + file_put_contents($this->bedrockDataPath . '/required_item_list.json', json_encode($table, JSON_PRETTY_PRINT) . "\n"); + + foreach($packet->levelSettings->experiments->getExperiments() as $name => $experiment){ + echo "Experiment \"$name\" is " . ($experiment ? "" : "not ") . "active\n"; + } + return true; + } + + public function handleCreativeContent(CreativeContentPacket $packet) : bool{ + echo "updating creative inventory data\n"; + $items = array_map(function(CreativeContentEntry $entry) : array{ + return self::objectToOrderedArray($this->itemStackToJson($entry->getItem())); + }, $packet->getEntries()); + file_put_contents($this->bedrockDataPath . '/creativeitems.json', json_encode($items, JSON_PRETTY_PRINT) . "\n"); + return true; + } + + private function recipeIngredientToJson(RecipeIngredient $itemStack) : RecipeIngredientData{ + if($this->itemTypeDictionary === null){ + throw new PacketHandlingException("Can't process item yet; haven't received item type dictionary"); + } + + $descriptor = $itemStack->getDescriptor(); + if($descriptor === null){ + throw new PacketHandlingException("Can't json-serialize a null recipe ingredient"); + } + $data = new RecipeIngredientData(); + + if($descriptor instanceof IntIdMetaItemDescriptor || $descriptor instanceof StringIdMetaItemDescriptor){ + if($descriptor instanceof IntIdMetaItemDescriptor){ + $data->name = $this->itemTypeDictionary->fromIntId($descriptor->getId()); + }else{ + $data->name = $descriptor->getId(); + } + $meta = $descriptor->getMeta(); + if($meta !== 32767){ + $blockStateId = $this->blockMapping->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta); + if($blockStateId !== null){ + $blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($blockStateId); + if($blockState !== null && count($blockState->getStates()) > 0){ + $data->block_states = self::blockStatePropertiesToString($blockState); + } + }elseif($meta !== 0){ + $data->meta = $meta; + } + }else{ + $data->meta = $meta; + } + }elseif($descriptor instanceof TagItemDescriptor){ + $data->tag = $descriptor->getTag(); + }elseif($descriptor instanceof MolangItemDescriptor){ + $data->molang_expression = $descriptor->getMolangExpression(); + $data->molang_version = $descriptor->getMolangVersion(); + }elseif($descriptor instanceof ComplexAliasItemDescriptor){ + $data->name = $descriptor->getAlias(); + }else{ + throw new \UnexpectedValueException("Unknown item descriptor type " . get_class($descriptor)); + } + if($itemStack->getCount() !== 1){ + $data->count = $itemStack->getCount(); + } + + return $data; + } + + private function shapedRecipeToJson(ShapedRecipe $entry) : ShapedRecipeData{ + $keys = []; + + $shape = []; + $char = ord("A"); + + $outputsByKey = []; + foreach($entry->getInput() as $x => $row){ + foreach($row as $y => $ingredient){ + if($ingredient->getDescriptor() === null){ + $shape[$x][$y] = " "; + }else{ + $jsonIngredient = $this->recipeIngredientToJson($ingredient); + $hash = json_encode($jsonIngredient, JSON_THROW_ON_ERROR); + if(isset($keys[$hash])){ + $shape[$x][$y] = $keys[$hash]; + }else{ + $key = chr($char); + $keys[$hash] = $shape[$x][$y] = $key; + $outputsByKey[$key] = $jsonIngredient; + $char++; + } + } + } + } + return new ShapedRecipeData( + array_map(fn(array $array) => implode('', $array), $shape), + $outputsByKey, + array_map(fn(ItemStack $output) => $this->itemStackToJson($output), $entry->getOutput()), + $entry->getBlockName(), + $entry->getPriority() + ); + } + + private function shapelessRecipeToJson(ShapelessRecipe $recipe) : ShapelessRecipeData{ + return new ShapelessRecipeData( + array_map(fn(RecipeIngredient $input) => $this->recipeIngredientToJson($input), $recipe->getInputs()), + array_map(fn(ItemStack $output) => $this->itemStackToJson($output), $recipe->getOutputs()), + $recipe->getBlockName(), + $recipe->getPriority() + ); + } + + private function furnaceRecipeToJson(FurnaceRecipe $recipe) : FurnaceRecipeData{ + return new FurnaceRecipeData( + $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getInputId(), $recipe->getInputMeta() ?? 32767), 1)), + $this->itemStackToJson($recipe->getResult()), + $recipe->getBlockName() + ); + } + + private function smithingRecipeToJson(SmithingTransformRecipe $recipe) : SmithingTransformRecipeData{ + return new SmithingTransformRecipeData( + $this->recipeIngredientToJson($recipe->getInput()), + $this->recipeIngredientToJson($recipe->getAddition()), + $this->itemStackToJson($recipe->getOutput()), + $recipe->getBlockName() + ); + } + + public function handleCraftingData(CraftingDataPacket $packet) : bool{ + echo "updating crafting data\n"; + + $recipesPath = Path::join($this->bedrockDataPath, "recipes"); + Filesystem::recursiveUnlink($recipesPath); + @mkdir($recipesPath); + + $recipes = []; + foreach($packet->recipesWithTypeIds as $entry){ + static $typeMap = [ + CraftingDataPacket::ENTRY_SHAPELESS => "shapeless_crafting", + CraftingDataPacket::ENTRY_SHAPED => "shaped_crafting", + CraftingDataPacket::ENTRY_FURNACE => "smelting", + CraftingDataPacket::ENTRY_FURNACE_DATA => "smelting", + CraftingDataPacket::ENTRY_MULTI => "special_hardcoded", + CraftingDataPacket::ENTRY_SHULKER_BOX => "shapeless_shulker_box", + CraftingDataPacket::ENTRY_SHAPELESS_CHEMISTRY => "shapeless_chemistry", + CraftingDataPacket::ENTRY_SHAPED_CHEMISTRY => "shaped_chemistry", + CraftingDataPacket::ENTRY_SMITHING_TRANSFORM => "smithing", + ]; + if(!isset($typeMap[$entry->getTypeId()])){ + throw new \UnexpectedValueException("Unknown recipe type ID " . $entry->getTypeId()); + } + $mappedType = $typeMap[$entry->getTypeId()]; + + if($entry instanceof ShapedRecipe){ + $recipes[$mappedType][] = $this->shapedRecipeToJson($entry); + }elseif($entry instanceof ShapelessRecipe){ + $recipes[$mappedType][] = $this->shapelessRecipeToJson($entry); + }elseif($entry instanceof MultiRecipe){ + $recipes[$mappedType][] = $entry->getRecipeId()->toString(); + }elseif($entry instanceof FurnaceRecipe){ + $recipes[$mappedType][] = $this->furnaceRecipeToJson($entry); + }elseif($entry instanceof SmithingTransformRecipe){ + $recipes[$mappedType][] = $this->smithingRecipeToJson($entry); + }else{ + throw new AssumptionFailedError("Unknown recipe type " . get_class($entry)); + } + } + + foreach($packet->potionTypeRecipes as $recipe){ + $recipes["potion_type"][] = new PotionTypeRecipeData( + $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getInputItemId(), $recipe->getInputItemMeta()), 1)), + $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getIngredientItemId(), $recipe->getIngredientItemMeta()), 1)), + $this->itemStackToJson(new ItemStack($recipe->getOutputItemId(), $recipe->getOutputItemMeta(), 1, 0, null, [], [], null)), + ); + } + + if($this->itemTypeDictionary === null){ + throw new AssumptionFailedError("We should have already crashed if this was null"); + } + foreach($packet->potionContainerRecipes as $recipe){ + $recipes["potion_container_change"][] = new PotionContainerChangeRecipeData( + $this->itemTypeDictionary->fromIntId($recipe->getInputItemId()), + $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getIngredientItemId(), 0), 1)), + $this->itemTypeDictionary->fromIntId($recipe->getOutputItemId()), + ); + } + + //this sorts the data into a canonical order to make diffs between versions reliable + //how the data is ordered doesn't matter as long as it's reproducible + foreach($recipes as $_type => $entries){ + $_sortedRecipes = []; + foreach($entries as $entry){ + $entry = self::sort($entry); + $_key = json_encode($entry); + while(isset($_sortedRecipes[$_key])){ + echo "warning: duplicated $_type recipe: $_key\n"; + $_key .= "a"; + } + $_sortedRecipes[$_key] = $entry; + } + ksort($_sortedRecipes, SORT_STRING); + $recipes[$_type] = array_values($_sortedRecipes); + } + + ksort($recipes, SORT_STRING); + foreach($recipes as $type => $entries){ + echo "$type: " . count($entries) . "\n"; + } + foreach($recipes as $type => $entries){ + file_put_contents(Path::join($recipesPath, $type . '.json'), json_encode($entries, JSON_PRETTY_PRINT) . "\n"); + } + + return true; + } + + public function handleAvailableActorIdentifiers(AvailableActorIdentifiersPacket $packet) : bool{ + echo "storing actor identifiers" . PHP_EOL; + + $tag = $packet->identifiers->getRoot(); + if(!($tag instanceof CompoundTag)){ + throw new AssumptionFailedError(); + } + $idList = $tag->getTag("idlist"); + if(!($idList instanceof ListTag) || $idList->getTagType() !== NBT::TAG_Compound){ + echo $tag . "\n"; + throw new \RuntimeException("expected TAG_List(\"idlist\") tag inside root TAG_Compound"); + } + if($tag->count() > 1){ + echo $tag . "\n"; + echo "!!! unexpected extra data found in available actor identifiers\n"; + } + echo "updating legacy => string entity ID mapping table\n"; + $map = []; + /** + * @var CompoundTag $thing + */ + foreach($idList as $thing){ + $map[$thing->getString("id")] = $thing->getInt("rid"); + } + asort($map, SORT_NUMERIC); + file_put_contents($this->bedrockDataPath . '/entity_id_map.json', json_encode($map, JSON_PRETTY_PRINT) . "\n"); + echo "storing entity identifiers\n"; + file_put_contents($this->bedrockDataPath . '/entity_identifiers.nbt', $packet->identifiers->getEncodedNbt()); + return true; + } + + public function handleBiomeDefinitionList(BiomeDefinitionListPacket $packet) : bool{ + echo "storing biome definitions" . PHP_EOL; + + file_put_contents($this->bedrockDataPath . '/biome_definitions_full.nbt', $packet->definitions->getEncodedNbt()); + + $nbt = $packet->definitions->getRoot(); + if(!$nbt instanceof CompoundTag){ + throw new AssumptionFailedError(); + } + $strippedNbt = clone $nbt; + foreach($strippedNbt as $compound){ + if($compound instanceof CompoundTag){ + foreach([ + "minecraft:capped_surface", + "minecraft:consolidated_features", + "minecraft:frozen_ocean_surface", + "minecraft:legacy_world_generation_rules", + "minecraft:mesa_surface", + "minecraft:mountain_parameters", + "minecraft:multinoise_generation_rules", + "minecraft:overworld_generation_rules", + "minecraft:surface_material_adjustments", + "minecraft:surface_parameters", + "minecraft:swamp_surface", + ] as $remove){ + $compound->removeTag($remove); + } + } + } + + file_put_contents($this->bedrockDataPath . '/biome_definitions.nbt', (new CacheableNbt($strippedNbt))->getEncodedNbt()); + + return true; + } +} + +/** + * @param string[] $argv + */ +function main(array $argv) : int{ + if(count($argv) !== 3){ + fwrite(STDERR, 'Usage: ' . PHP_BINARY . ' ' . __FILE__ . ' '); + return 1; + } + [, $inputFile, $bedrockDataPath] = $argv; + + $handler = new ParserPacketHandler($bedrockDataPath); + + $packets = file($inputFile, FILE_IGNORE_NEW_LINES); + if($packets === false){ + fwrite(STDERR, 'File ' . $inputFile . ' not found or permission denied'); + return 1; + } + + foreach($packets as $lineNum => $line){ + $parts = explode(':', $line); + if(count($parts) !== 2){ + fwrite(STDERR, 'Wrong packet format at line ' . ($lineNum + 1) . ', expected read:base64 or write:base64'); + return 1; + } + $raw = base64_decode($parts[1], true); + if($raw === false){ + fwrite(STDERR, 'Invalid base64\'d packet on line ' . ($lineNum + 1) . ' could not be parsed'); + return 1; + } + + $pk = PacketPool::getInstance()->getPacket($raw); + if($pk === null){ + fwrite(STDERR, "Unknown packet on line " . ($lineNum + 1) . ": " . $parts[1]); + continue; + } + $serializer = PacketSerializer::decoder($raw, 0, new PacketSerializerContext( + $handler->itemTypeDictionary ?? + new ItemTypeDictionary([new ItemTypeEntry("minecraft:shield", 0, false)])) + ); + + $pk->decode($serializer); + $pk->handle($handler); + if(!$serializer->feof()){ + echo "Packet on line " . ($lineNum + 1) . ": didn't read all data from " . get_class($pk) . " (stopped at offset " . $serializer->getOffset() . " of " . strlen($serializer->getBuffer()) . " bytes): " . bin2hex($serializer->getRemaining()) . "\n"; + } + } + return 0; +} + +exit(main($argv)); From 2b88b215bfa1b47a588f6cd32eec252526fcc889 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Mar 2023 23:10:11 +0000 Subject: [PATCH 0683/1858] CS cleanup --- tools/generate-bedrock-data-from-packets.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 3dc8ad172a..7be3ad1abf 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -17,7 +17,7 @@ * @link http://www.pocketmine.net/ * * -*/ + */ declare(strict_types=1); @@ -87,13 +87,16 @@ use function fwrite; use function get_class; use function implode; use function is_array; +use function is_object; use function json_encode; use function ksort; +use function mkdir; use function ord; use function strlen; use const FILE_IGNORE_NEW_LINES; use const JSON_PRETTY_PRINT; use const JSON_THROW_ON_ERROR; +use const PHP_BINARY; use const PHP_EOL; use const SORT_NUMERIC; use const SORT_STRING; From 7c95a65aded7f0430536950181103ae8b8f45fa9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Mar 2023 23:14:11 +0000 Subject: [PATCH 0684/1858] ... --- tools/generate-bedrock-data-from-packets.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 7be3ad1abf..853c8e39f3 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -53,7 +53,6 @@ use pocketmine\network\mcpe\protocol\types\CacheableNbt; use pocketmine\network\mcpe\protocol\types\inventory\CreativeContentEntry; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\ItemTypeEntry; -use pocketmine\network\mcpe\protocol\types\recipe\ComplexAliasItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipe; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\MolangItemDescriptor; @@ -283,8 +282,6 @@ class ParserPacketHandler extends PacketHandler{ }elseif($descriptor instanceof MolangItemDescriptor){ $data->molang_expression = $descriptor->getMolangExpression(); $data->molang_version = $descriptor->getMolangVersion(); - }elseif($descriptor instanceof ComplexAliasItemDescriptor){ - $data->name = $descriptor->getAlias(); }else{ throw new \UnexpectedValueException("Unknown item descriptor type " . get_class($descriptor)); } From 328b87fc1815942b435f82541891767106e8a59c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:49:34 +0000 Subject: [PATCH 0685/1858] Bump phpstan/phpstan from 1.10.4 to 1.10.6 (#5617) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.4 to 1.10.6. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.4...1.10.6) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 64e62ed28c..199355edee 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.4", + "phpstan/phpstan": "1.10.6", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 227bb4025e..7a3a2b36c6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2230c1697e4d7d490f5957b3a80d80a7", + "content-hash": "825f81aefc92c23eb815207e78fe3fda", "packages": [ { "name": "adhocore/json-comment", @@ -1884,16 +1884,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.4", + "version": "1.10.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982" + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8d39218664b45a4a42d5be66d2b63dcf8c149982", - "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", "shasum": "" }, "require": { @@ -1923,7 +1923,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.4" + "source": "https://github.com/phpstan/phpstan/tree/1.10.6" }, "funding": [ { @@ -1939,7 +1939,7 @@ "type": "tidelift" } ], - "time": "2023-03-06T13:39:20+00:00" + "time": "2023-03-09T16:55:12+00:00" }, { "name": "phpstan/phpstan-phpunit", From b13e97de3d3fb5ff8dd155cf61f5238426ecb15e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 11 Mar 2023 19:12:48 +0000 Subject: [PATCH 0686/1858] Timings: fixed receivePacket timer showing 2x the actual number of received packets --- src/network/mcpe/NetworkSession.php | 53 ++++++++++++++++------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 04512e3497..2e3b5b8dac 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -431,32 +431,39 @@ class NetworkSession{ throw new PacketHandlingException("Unexpected non-serverbound packet"); } - $timings = Timings::getDecodeDataPacketTimings($packet); + $timings = Timings::getReceiveDataPacketTimings($packet); $timings->startTiming(); - try{ - $stream = PacketSerializer::decoder($buffer, 0, $this->packetSerializerContext); - try{ - $packet->decode($stream); - }catch(PacketDecodeException $e){ - throw PacketHandlingException::wrap($e); - } - if(!$stream->feof()){ - $remains = substr($stream->getBuffer(), $stream->getOffset()); - $this->logger->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains)); - } - }finally{ - $timings->stopTiming(); - } - $timings = Timings::getHandleDataPacketTimings($packet); - $timings->startTiming(); try{ - //TODO: I'm not sure DataPacketReceiveEvent should be included in the handler timings, but it needs to be - //included for now to ensure the receivePacket timings are counted the way they were before - $ev = new DataPacketReceiveEvent($this, $packet); - $ev->call(); - if(!$ev->isCancelled() && ($this->handler === null || !$packet->handle($this->handler))){ - $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); + $decodeTimings = Timings::getDecodeDataPacketTimings($packet); + $decodeTimings->startTiming(); + try{ + $stream = PacketSerializer::decoder($buffer, 0, $this->packetSerializerContext); + try{ + $packet->decode($stream); + }catch(PacketDecodeException $e){ + throw PacketHandlingException::wrap($e); + } + if(!$stream->feof()){ + $remains = substr($stream->getBuffer(), $stream->getOffset()); + $this->logger->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains)); + } + }finally{ + $decodeTimings->stopTiming(); + } + + $handlerTimings = Timings::getHandleDataPacketTimings($packet); + $handlerTimings->startTiming(); + try{ + //TODO: I'm not sure DataPacketReceiveEvent should be included in the handler timings, but it needs to be + //included for now to ensure the receivePacket timings are counted the way they were before + $ev = new DataPacketReceiveEvent($this, $packet); + $ev->call(); + if(!$ev->isCancelled() && ($this->handler === null || !$packet->handle($this->handler))){ + $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); + } + }finally{ + $handlerTimings->stopTiming(); } }finally{ $timings->stopTiming(); From fa7c38276cc9f44765b70e488b559e3711d39965 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 11 Mar 2023 21:54:14 +0000 Subject: [PATCH 0687/1858] Fixing gigantic clusterfuck with protocol contexts and broadcasting fixes #5623 --- src/network/mcpe/NetworkSession.php | 7 +- .../mcpe/StandardPacketBroadcaster.php | 69 ++++++++++--------- src/network/mcpe/raklib/RakLibInterface.php | 7 +- 3 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 04512e3497..7125c01ccb 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -43,7 +43,6 @@ use pocketmine\network\mcpe\cache\ChunkCache; use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\DecompressionException; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\encryption\DecryptionException; @@ -188,8 +187,6 @@ class NetworkSession{ private bool $forceAsyncCompression = true; private bool $enableCompression = false; //disabled until handshake completed - private PacketSerializerContext $packetSerializerContext; - private ?InventoryManager $invManager = null; /** @@ -202,6 +199,7 @@ class NetworkSession{ private Server $server, private NetworkSessionManager $manager, private PacketPool $packetPool, + private PacketSerializerContext $packetSerializerContext, private PacketSender $sender, private PacketBroadcaster $broadcaster, private Compressor $compressor, @@ -212,9 +210,6 @@ class NetworkSession{ $this->compressedQueue = new \SplQueue(); - //TODO: allow this to be injected - $this->packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); - $this->disposeHooks = new ObjectSet(); $this->connectTime = time(); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index f1009d23b2..f83cff64df 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\BinaryStream; @@ -33,54 +34,54 @@ use function spl_object_id; use function strlen; final class StandardPacketBroadcaster implements PacketBroadcaster{ - public function __construct(private Server $server){} + public function __construct( + private Server $server, + private PacketSerializerContext $protocolContext + ){} public function broadcastPackets(array $recipients, array $packets) : void{ - $packetBufferTotalLengths = []; - $packetBuffers = []; $compressors = []; - /** @var NetworkSession[][][] $targetMap */ - $targetMap = []; + + /** @var NetworkSession[][] $targetsByCompressor */ + $targetsByCompressor = []; foreach($recipients as $recipient){ - $serializerContext = $recipient->getPacketSerializerContext(); - $bufferId = spl_object_id($serializerContext); - if(!isset($packetBuffers[$bufferId])){ - $packetBufferTotalLengths[$bufferId] = 0; - $packetBuffers[$bufferId] = []; - foreach($packets as $packet){ - $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder($serializerContext), $packet); - $packetBufferTotalLengths[$bufferId] += strlen($buffer); - $packetBuffers[$bufferId][] = $buffer; - } + if($recipient->getPacketSerializerContext() !== $this->protocolContext){ + throw new \InvalidArgumentException("Only recipients with the same protocol context as the broadcaster can be broadcast to by this broadcaster"); } //TODO: different compressors might be compatible, it might not be necessary to split them up by object $compressor = $recipient->getCompressor(); $compressors[spl_object_id($compressor)] = $compressor; - $targetMap[$bufferId][spl_object_id($compressor)][] = $recipient; + $targetsByCompressor[spl_object_id($compressor)][] = $recipient; } - foreach($targetMap as $bufferId => $compressorMap){ - foreach($compressorMap as $compressorId => $compressorTargets){ - $compressor = $compressors[$compressorId]; + $totalLength = 0; + $packetBuffers = []; + foreach($packets as $packet){ + $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder($this->protocolContext), $packet); + $totalLength += strlen($buffer); + $packetBuffers[] = $buffer; + } - $threshold = $compressor->getCompressionThreshold(); - if(count($compressorTargets) > 1 && $threshold !== null && $packetBufferTotalLengths[$bufferId] >= $threshold){ - //do not prepare shared batch unless we're sure it will be compressed - $stream = new BinaryStream(); - PacketBatch::encodeRaw($stream, $packetBuffers[$bufferId]); - $batchBuffer = $stream->getBuffer(); + foreach($targetsByCompressor as $compressorId => $compressorTargets){ + $compressor = $compressors[$compressorId]; - $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); - foreach($compressorTargets as $target){ - $target->queueCompressed($promise); - } - }else{ - foreach($compressorTargets as $target){ - foreach($packetBuffers[$bufferId] as $packetBuffer){ - $target->addToSendBuffer($packetBuffer); - } + $threshold = $compressor->getCompressionThreshold(); + if(count($compressorTargets) > 1 && $threshold !== null && $totalLength >= $threshold){ + //do not prepare shared batch unless we're sure it will be compressed + $stream = new BinaryStream(); + PacketBatch::encodeRaw($stream, $packetBuffers); + $batchBuffer = $stream->getBuffer(); + + $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); + foreach($compressorTargets as $target){ + $target->queueCompressed($promise); + } + }else{ + foreach($compressorTargets as $target){ + foreach($packetBuffers as $packetBuffer){ + $target->addToSendBuffer($packetBuffer); } } } diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index ef9f7d6417..993566f852 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -25,11 +25,13 @@ namespace pocketmine\network\mcpe\raklib; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; +use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\ProtocolInfo; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\StandardPacketBroadcaster; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; @@ -79,6 +81,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private SleeperNotifier $sleeper; private PacketBroadcaster $broadcaster; + private PacketSerializerContext $packetSerializerContext; public function __construct(Server $server, string $ip, int $port, bool $ipV6){ $this->server = $server; @@ -106,7 +109,8 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ new PthreadsChannelWriter($mainToThreadBuffer) ); - $this->broadcaster = new StandardPacketBroadcaster($this->server); + $this->packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); + $this->broadcaster = new StandardPacketBroadcaster($this->server, $this->packetSerializerContext); } public function start() : void{ @@ -166,6 +170,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->server, $this->network->getSessionManager(), PacketPool::getInstance(), + $this->packetSerializerContext, new RakLibPacketSender($sessionId, $this), $this->broadcaster, ZlibCompressor::getInstance(), //TODO: this shouldn't be hardcoded, but we might need the RakNet protocol version to select it From 8e280ebb8bef3aeedda457398ad262fb6c5a118a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 11 Mar 2023 22:16:24 +0000 Subject: [PATCH 0688/1858] RuntimeBlockMapping: avoid unnecessary PacketSerializer usage --- .../mcpe/convert/RuntimeBlockMapping.php | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index b7c78a20be..dd396af9bb 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -29,8 +29,7 @@ use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; +use pocketmine\utils\BinaryStream; use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; @@ -55,14 +54,14 @@ final class RuntimeBlockMapping{ } public function __construct(string $canonicalBlockStatesFile, string $r12ToCurrentBlockMapFile){ - $stream = PacketSerializer::decoder( - Filesystem::fileGetContents($canonicalBlockStatesFile), - 0, - new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()) - ); + $stream = new BinaryStream(Filesystem::fileGetContents($canonicalBlockStatesFile)); $list = []; + $nbtReader = new NetworkNbtSerializer(); while(!$stream->feof()){ - $list[] = $stream->getNbtCompoundRoot(); + $offset = $stream->getOffset(); + $blockState = $nbtReader->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); + $stream->setOffset($offset); + $list[] = $blockState; } $this->bedrockKnownStates = $list; @@ -73,14 +72,10 @@ final class RuntimeBlockMapping{ $legacyIdMap = LegacyBlockIdToStringIdMap::getInstance(); /** @var R12ToCurrentBlockMapEntry[] $legacyStateMap */ $legacyStateMap = []; - $legacyStateMapReader = PacketSerializer::decoder( - Filesystem::fileGetContents($r12ToCurrentBlockMapFile), - 0, - new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()) - ); + $legacyStateMapReader = new BinaryStream(Filesystem::fileGetContents($r12ToCurrentBlockMapFile)); $nbtReader = new NetworkNbtSerializer(); while(!$legacyStateMapReader->feof()){ - $id = $legacyStateMapReader->getString(); + $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); $meta = $legacyStateMapReader->getLShort(); $offset = $legacyStateMapReader->getOffset(); From a12319436850673c98b441a4094da0681fc9e81c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Mar 2023 16:14:19 +0000 Subject: [PATCH 0689/1858] BlockStateData: added getVersionAsString() --- src/data/bedrock/block/BlockStateData.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 6ac0184f72..00eb947f96 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -80,6 +80,14 @@ final class BlockStateData{ public function getVersion() : int{ return $this->version; } + public function getVersionAsString() : string{ + $major = ($this->version >> 24) & 0xff; + $minor = ($this->version >> 16) & 0xff; + $patch = ($this->version >> 8) & 0xff; + $revision = $this->version & 0xff; + return "$major.$minor.$patch.$revision"; + } + /** * @throws BlockStateDeserializeException */ From e2071e59c8b48a77094210c08d8101d344f7a58f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Mar 2023 17:44:10 +0000 Subject: [PATCH 0690/1858] actions: update PHP versions --- .github/workflows/main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2a4f177413..c347b84363 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: image: [ubuntu-20.04] - php: [8.0.27, 8.1.14, 8.2.1] + php: [8.0.28, 8.1.16, 8.2.3] steps: - name: Build and prepare PHP cache @@ -32,7 +32,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.27, 8.1.14, 8.2.1] + php: [8.0.28, 8.1.16, 8.2.3] steps: - uses: actions/checkout@v3 @@ -71,7 +71,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.27, 8.1.14, 8.2.1] + php: [8.0.28, 8.1.16, 8.2.3] steps: - uses: actions/checkout@v3 @@ -110,7 +110,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.27, 8.1.14, 8.2.1] + php: [8.0.28, 8.1.16, 8.2.3] steps: - uses: actions/checkout@v3 @@ -151,7 +151,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.27, 8.1.14, 8.2.1] + php: [8.0.28, 8.1.16, 8.2.3] steps: - uses: actions/checkout@v3 From d376399b7f332384532a82eaf69b9b02dad5bd0c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 17:29:25 +0000 Subject: [PATCH 0691/1858] Update composer dependencies bedrock-item-upgrade-schema and bedrock-block-upgrade-schema are now minor-version-locked, to prevent introducing new upgrade schemas not intended for the currently in-use version previously I'd intended to do this using max schema IDs, but this has proven to be error-prone, so it makes more sense to lock them in using package version constraints instead. --- composer.json | 4 ++-- composer.lock | 42 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 199355edee..47c2e448f7 100644 --- a/composer.json +++ b/composer.json @@ -34,9 +34,9 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-block-upgrade-schema": "^1.0.0", + "pocketmine/bedrock-block-upgrade-schema": "~1.0.0", "pocketmine/bedrock-data": "~2.0.0+bedrock-1.19.60", - "pocketmine/bedrock-item-upgrade-schema": "^1.0.0", + "pocketmine/bedrock-item-upgrade-schema": "~1.0.0", "pocketmine/bedrock-protocol": "~19.3.0+bedrock-1.19.62", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", diff --git a/composer.lock b/composer.lock index 7a3a2b36c6..ba9e927a61 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "825f81aefc92c23eb815207e78fe3fda", + "content-hash": "1911f5d75ca37c8390925a70f5e08210", "packages": [ { "name": "adhocore/json-comment", @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.1.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2" + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/78c965a2316986ac0eaf3235d75efb187127e7a2", - "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", "shasum": "" }, "type": "library", @@ -270,9 +270,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" }, - "time": "2023-03-06T17:53:36+00:00" + "time": "2023-02-01T21:09:54+00:00" }, { "name": "pocketmine/bedrock-data", @@ -1658,16 +1658,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -1705,7 +1705,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -1713,7 +1713,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", @@ -2362,16 +2362,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.4", + "version": "9.6.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d" + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d", - "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", "shasum": "" }, "require": { @@ -2404,8 +2404,8 @@ "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -2444,7 +2444,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" }, "funding": [ { @@ -2460,7 +2460,7 @@ "type": "tidelift" } ], - "time": "2023-02-27T13:06:37+00:00" + "time": "2023-03-09T06:34:10+00:00" }, { "name": "sebastian/cli-parser", From 3de7a8c27f1bd3a612c1fb64b7e3628f515f949c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:08:10 +0000 Subject: [PATCH 0692/1858] Updated for 1.19.70 --- composer.json | 8 +-- composer.lock | 52 +++++++++---------- .../mcpe/handler/LoginPacketHandler.php | 23 -------- .../handler/SessionStartPacketHandler.php | 5 +- 4 files changed, 31 insertions(+), 57 deletions(-) diff --git a/composer.json b/composer.json index 47c2e448f7..23bf5f1267 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-block-upgrade-schema": "~1.0.0", - "pocketmine/bedrock-data": "~2.0.0+bedrock-1.19.60", - "pocketmine/bedrock-item-upgrade-schema": "~1.0.0", - "pocketmine/bedrock-protocol": "~19.3.0+bedrock-1.19.62", + "pocketmine/bedrock-block-upgrade-schema": "~1.1.1+bedrock-1.19.70", + "pocketmine/bedrock-data": "~2.1.1+bedrock-1.19.70", + "pocketmine/bedrock-item-upgrade-schema": "~1.1.0+bedrock-1.19.70", + "pocketmine/bedrock-protocol": "~20.0.0+bedrock-1.19.70", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index ba9e927a61..4f149eee92 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1911f5d75ca37c8390925a70f5e08210", + "content-hash": "1d0c1d2fe668d85ae87110a1e3cfac05", "packages": [ { "name": "adhocore/json-comment", @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" + "reference": "e0540343e649a92126a1d4071ec401a811416c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/e0540343e649a92126a1d4071ec401a811416c76", + "reference": "e0540343e649a92126a1d4071ec401a811416c76", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.1" }, - "time": "2023-02-01T21:09:54+00:00" + "time": "2023-03-08T23:45:59+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.0.0+bedrock-1.19.60", + "version": "2.1.1+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "957e49b2381641af29f595e4f32ded3e76ce4723" + "reference": "cba0567bcb25f987f2712092f8d662056719e82d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/957e49b2381641af29f595e4f32ded3e76ce4723", - "reference": "957e49b2381641af29f595e4f32ded3e76ce4723", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/cba0567bcb25f987f2712092f8d662056719e82d", + "reference": "cba0567bcb25f987f2712092f8d662056719e82d", "shasum": "" }, "type": "library", @@ -296,22 +296,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.0.0+bedrock-1.19.60" + "source": "https://github.com/pmmp/BedrockData/tree/2.1.1+bedrock-1.19.70" }, - "time": "2023-02-23T21:25:04+00:00" + "time": "2023-03-14T18:03:19+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7" + "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", - "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/aab89a1f121a0c127557a4a0cf981330301c9c45", + "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45", "shasum": "" }, "type": "library", @@ -322,22 +322,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.0.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.1.0" }, - "time": "2023-02-01T22:50:02+00:00" + "time": "2023-03-08T22:27:13+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "19.3.0+bedrock-1.19.62", + "version": "20.0.0+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad" + "reference": "4892a5020187da805d7b46ab522d8185b0283726" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a5bf4753c7f30f781c4541918e238f5bb637e7ad", - "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/4892a5020187da805d7b46ab522d8185b0283726", + "reference": "4892a5020187da805d7b46ab522d8185b0283726", "shasum": "" }, "require": { @@ -351,7 +351,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.9.13", + "phpstan/phpstan": "1.10.1", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.3.0+bedrock-1.19.62" + "source": "https://github.com/pmmp/BedrockProtocol/tree/20.0.0+bedrock-1.19.70" }, - "time": "2023-02-19T16:11:03+00:00" + "time": "2023-03-14T17:06:38+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 5185eb7079..82510fc11e 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -25,7 +25,6 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\entity\InvalidSkinException; use pocketmine\event\player\PlayerPreLoginEvent; -use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\KnownTranslationKeys; use pocketmine\network\mcpe\auth\ProcessLoginTask; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; @@ -33,7 +32,6 @@ use pocketmine\network\mcpe\JwtException; use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\LoginPacket; -use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\types\login\AuthenticationData; use pocketmine\network\mcpe\protocol\types\login\ClientData; use pocketmine\network\mcpe\protocol\types\login\ClientDataToSkinDataHelper; @@ -45,7 +43,6 @@ use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use Ramsey\Uuid\Uuid; use function is_array; -use function preg_match; /** * Handles the initial login phase of the session. This handler is used as the initial state. @@ -73,26 +70,6 @@ class LoginPacketHandler extends PacketHandler{ $clientData = $this->parseClientData($packet->clientDataJwt); - //TODO: REMOVE THIS - //Mojang forgot to bump the protocol version when they changed protocol in 1.19.62. Check the game version instead. - if(preg_match('/^(\d+)\.(\d+)\.(\d+)/', $clientData->GameVersion, $matches) !== 1){ - throw new PacketHandlingException("Invalid game version format, expected at least 3 digits"); - } - $major = (int) $matches[1]; - $minor = (int) $matches[2]; - $patch = (int) $matches[3]; - if($major === 1 && $minor === 19 && $patch < 62){ - $this->session->sendDataPacket(PlayStatusPacket::create(PlayStatusPacket::LOGIN_FAILED_CLIENT), true); - - //This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client) - $this->session->disconnect( - $this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol("$packet->protocol (< v1.19.62)")), - false - ); - - return true; - } - try{ $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ diff --git a/src/network/mcpe/handler/SessionStartPacketHandler.php b/src/network/mcpe/handler/SessionStartPacketHandler.php index 5625869f1c..687422de20 100644 --- a/src/network/mcpe/handler/SessionStartPacketHandler.php +++ b/src/network/mcpe/handler/SessionStartPacketHandler.php @@ -71,9 +71,6 @@ final class SessionStartPacketHandler extends PacketHandler{ } protected function isCompatibleProtocol(int $protocolVersion) : bool{ - //TODO: REMOVE THIS - //1.19.63 released with an unchanged protocol, but a bumped protocol version, since they forgot to do it in the - //previous release. Since they are functionally identical, we can accept both. - return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL || $protocolVersion === 568; + return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL; } } From 9564c815822343fcfa5ef5c700491ff041581503 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:14:40 +0000 Subject: [PATCH 0693/1858] Release 4.17.0 --- changelogs/4.17.md | 14 ++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.17.md diff --git a/changelogs/4.17.md b/changelogs/4.17.md new file mode 100644 index 0000000000..d35cc77d90 --- /dev/null +++ b/changelogs/4.17.md @@ -0,0 +1,14 @@ +**For Minecraft: Bedrock Edition 1.19.70** + +### Note about API versions +Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.17.0 +Released 14th March 2023. + +## General +- Added support for Minecraft: Bedrock Edition 1.19.70. +- Removed support for older versions. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 079605b389..83b2180ae2 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.16.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.17.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 590f6dad087f07c08133ad5a36bf3d2dc1491f40 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:14:40 +0000 Subject: [PATCH 0694/1858] 4.17.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 83b2180ae2..880fda6981 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.17.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.17.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 2f862a552a698f2c12d18e964371624b8cdae619 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:31:25 +0000 Subject: [PATCH 0695/1858] actions: Replace deprecated ::set-output commands --- .github/workflows/build-docker-image.yml | 10 +++++----- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 14 +++++++------- .github/workflows/update-updater-api.yml | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index a209fd688a..7ff0925dff 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -30,20 +30,20 @@ jobs: id: tag-name run: | VERSION=$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') - echo ::set-output name=TAG_NAME::$VERSION - echo ::set-output name=MAJOR::$(echo $VERSION | cut -d. -f1) - echo ::set-output name=MINOR::$(echo $VERSION | cut -d. -f1-2) + echo TAG_NAME=$VERSION >> $GITHUB_OUTPUT + echo MAJOR=$(echo $VERSION | cut -d. -f1) >> $GITHUB_OUTPUT + echo MINOR=$(echo $VERSION | cut -d. -f1-2) >> $GITHUB_OUTPUT - name: Download new release information run: curl -f -L ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ steps.tag-name.outputs.TAG_NAME }}/build_info.json -o new_build_info.json - name: Detect channel id: channel - run: echo ::set-output name=CHANNEL::$(jq -r '.channel' new_build_info.json) + run: echo CHANNEL=$(jq -r '.channel' new_build_info.json) >> $GITHUB_OUTPUT - name: Get name of Docker repository name id: docker-repo-name - run: echo ::set-output name=NAME::$(echo "${GITHUB_REPOSITORY,,}") + run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag uses: docker/build-push-action@v4.0.0 diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 2a5cadf2db..deb8e9ff09 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -32,7 +32,7 @@ jobs: - name: Get actual tag name id: tag-name - run: echo ::set-output name=TAG_NAME::$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') + run: echo TAG_NAME=$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') >> $GITHUB_OUTPUT - name: Run webhook post script run: php .github/workflows/discord-release-embed.php ${{ github.repository }} ${{ steps.tag-name.outputs.TAG_NAME }} ${{ github.token }} ${{ secrets.DISCORD_RELEASE_WEBHOOK }} ${{ secrets.DISCORD_NEWS_PING_ROLE_ID }} diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 112155ba4c..cce7501183 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -40,7 +40,7 @@ jobs: run: | BUILD_NUMBER=$((2000+$GITHUB_RUN_NUMBER)) #to stay above jenkins echo "Build number: $BUILD_NUMBER" - echo ::set-output name=BUILD_NUMBER::$BUILD_NUMBER + echo BUILD_NUMBER=$BUILD_NUMBER >> $GITHUB_OUTPUT - name: Minify BedrockData JSON files run: php vendor/pocketmine/bedrock-data/.minify_json.php @@ -51,12 +51,12 @@ jobs: - name: Get PocketMine-MP release version id: get-pm-version run: | - echo ::set-output name=PM_VERSION::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BASE_VERSION;') - echo ::set-output name=MCPE_VERSION::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK;') - echo ::set-output name=PM_VERSION_SHORT::$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\VersionInfo::BASE_VERSION); array_pop($v); echo implode(".", $v);') - echo ::set-output name=PM_VERSION_MD::$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\VersionInfo::BASE_VERSION);') - echo ::set-output name=CHANGELOG_SUFFIX::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') - echo ::set-output name=PRERELEASE::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "false" : "true";') + echo PM_VERSION=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BASE_VERSION;') >> $GITHUB_OUTPUT + echo MCPE_VERSION=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK;') >> $GITHUB_OUTPUT + echo PM_VERSION_SHORT=$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\VersionInfo::BASE_VERSION); array_pop($v); echo implode(".", $v);') >> $GITHUB_OUTPUT + echo PM_VERSION_MD=$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\VersionInfo::BASE_VERSION);') >> $GITHUB_OUTPUT + echo CHANGELOG_SUFFIX=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') >> $GITHUB_OUTPUT + echo PRERELEASE=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "false" : "true";') >> $GITHUB_OUTPUT - name: Generate build info run: php build/generate-build-info-json.php ${{ github.sha }} ${{ steps.get-pm-version.outputs.PM_VERSION }} ${{ github.repository }} ${{ steps.build-number.outputs.BUILD_NUMBER }} ${{ github.run_id }} > build_info.json diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index aaac9b4d2c..dc40d17e91 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -20,14 +20,14 @@ jobs: - name: Get actual tag name id: tag-name - run: echo ::set-output name=TAG_NAME::$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') + run: echo TAG_NAME=$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') >> $GITHUB_OUTPUT - name: Download new release information run: curl -f -L ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ steps.tag-name.outputs.TAG_NAME }}/build_info.json -o new_build_info.json - name: Detect channel id: channel - run: echo ::set-output name=CHANNEL::$(jq -r '.channel' new_build_info.json) + run: echo CHANNEL=$(jq -r '.channel' new_build_info.json) >> $GITHUB_OUTPUT - name: Copy release information run: | From 7cad9be0d24d238b4c51c61e912f76a1a393d166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 18:32:10 +0000 Subject: [PATCH 0696/1858] Bump build/php from `b2207cf` to `71b9f9d` (#5634) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `b2207cf` to `71b9f9d`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/b2207cf70d3fc5b81f50a655aba4730fcf40a37c...71b9f9d2d7b3ee45d9475803b96c080f5f22f373) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index b2207cf70d..71b9f9d2d7 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit b2207cf70d3fc5b81f50a655aba4730fcf40a37c +Subproject commit 71b9f9d2d7b3ee45d9475803b96c080f5f22f373 From 85a64d56fbce9f38ecafd5ce3fe1c52837648eac Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:42:01 +0000 Subject: [PATCH 0697/1858] Updated composer dependencies (major-next) --- composer.lock | 54 +++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/composer.lock b/composer.lock index 28e657c4a5..b379351ce1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9751c90077792bd5d12ebb53a0214ec1", + "content-hash": "1fce2212ea8f1510f2d68da4f46023db", "packages": [ { "name": "adhocore/json-comment", @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.1.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2" + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/78c965a2316986ac0eaf3235d75efb187127e7a2", - "reference": "78c965a2316986ac0eaf3235d75efb187127e7a2", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", + "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", "shasum": "" }, "type": "library", @@ -270,9 +270,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" }, - "time": "2023-03-06T17:53:36+00:00" + "time": "2023-02-01T21:09:54+00:00" }, { "name": "pocketmine/bedrock-data", @@ -1549,16 +1549,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -1596,7 +1596,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -1604,7 +1604,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", @@ -1775,16 +1775,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.4", + "version": "1.10.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982" + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8d39218664b45a4a42d5be66d2b63dcf8c149982", - "reference": "8d39218664b45a4a42d5be66d2b63dcf8c149982", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", "shasum": "" }, "require": { @@ -1814,7 +1814,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.4" + "source": "https://github.com/phpstan/phpstan/tree/1.10.6" }, "funding": [ { @@ -1830,7 +1830,7 @@ "type": "tidelift" } ], - "time": "2023-03-06T13:39:20+00:00" + "time": "2023-03-09T16:55:12+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -2253,16 +2253,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.4", + "version": "9.6.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d" + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d", - "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", "shasum": "" }, "require": { @@ -2295,8 +2295,8 @@ "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -2335,7 +2335,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" }, "funding": [ { @@ -2351,7 +2351,7 @@ "type": "tidelift" } ], - "time": "2023-02-27T13:06:37+00:00" + "time": "2023-03-09T06:34:10+00:00" }, { "name": "sebastian/cli-parser", From 777b4d6ac3c79e88c53310dc800f16a38fe4a0f6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:50:04 +0000 Subject: [PATCH 0698/1858] PM5-specific updates for 1.19.70 --- src/data/bedrock/block/BlockStateData.php | 6 +- src/data/bedrock/block/BlockStateNames.php | 1 + src/data/bedrock/block/BlockTypeNames.php | 21 +++++- .../convert/BlockObjectToStateSerializer.php | 72 ++++++++++++------- .../BlockStateToObjectDeserializer.php | 57 +++++++++------ src/data/bedrock/item/ItemTypeNames.php | 8 +++ .../format/io/GlobalBlockStateHandlers.php | 2 +- .../format/io/GlobalItemDataHandlers.php | 2 +- tools/generate-bedrock-data-from-packets.php | 3 + 9 files changed, 120 insertions(+), 52 deletions(-) diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 00eb947f96..cc04bc31c0 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -40,9 +40,9 @@ final class BlockStateData{ */ public const CURRENT_VERSION = (1 << 24) | //major - (18 << 16) | //minor - (10 << 8) | //patch - (1); //revision + (19 << 16) | //minor + (70 << 8) | //patch + (15); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 96cfc1fa58..47838373fc 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -48,6 +48,7 @@ final class BlockStateNames{ public const BREWING_STAND_SLOT_A_BIT = "brewing_stand_slot_a_bit"; public const BREWING_STAND_SLOT_B_BIT = "brewing_stand_slot_b_bit"; public const BREWING_STAND_SLOT_C_BIT = "brewing_stand_slot_c_bit"; + public const BRUSHED_PROGRESS = "brushed_progress"; public const BUTTON_PRESSED_BIT = "button_pressed_bit"; public const CAN_SUMMON = "can_summon"; public const CANDLES = "candles"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 913472c478..56526ea9d1 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -94,6 +94,7 @@ final class BlockTypeNames{ public const BLACK_CANDLE = "minecraft:black_candle"; public const BLACK_CANDLE_CAKE = "minecraft:black_candle_cake"; public const BLACK_GLAZED_TERRACOTTA = "minecraft:black_glazed_terracotta"; + public const BLACK_WOOL = "minecraft:black_wool"; public const BLACKSTONE = "minecraft:blackstone"; public const BLACKSTONE_DOUBLE_SLAB = "minecraft:blackstone_double_slab"; public const BLACKSTONE_SLAB = "minecraft:blackstone_slab"; @@ -104,6 +105,7 @@ final class BlockTypeNames{ public const BLUE_CANDLE_CAKE = "minecraft:blue_candle_cake"; public const BLUE_GLAZED_TERRACOTTA = "minecraft:blue_glazed_terracotta"; public const BLUE_ICE = "minecraft:blue_ice"; + public const BLUE_WOOL = "minecraft:blue_wool"; public const BONE_BLOCK = "minecraft:bone_block"; public const BOOKSHELF = "minecraft:bookshelf"; public const BORDER_BLOCK = "minecraft:border_block"; @@ -115,6 +117,7 @@ final class BlockTypeNames{ public const BROWN_GLAZED_TERRACOTTA = "minecraft:brown_glazed_terracotta"; public const BROWN_MUSHROOM = "minecraft:brown_mushroom"; public const BROWN_MUSHROOM_BLOCK = "minecraft:brown_mushroom_block"; + public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; public const BUDDING_AMETHYST = "minecraft:budding_amethyst"; public const CACTUS = "minecraft:cactus"; @@ -201,6 +204,7 @@ final class BlockTypeNames{ public const CYAN_CANDLE = "minecraft:cyan_candle"; public const CYAN_CANDLE_CAKE = "minecraft:cyan_candle_cake"; public const CYAN_GLAZED_TERRACOTTA = "minecraft:cyan_glazed_terracotta"; + public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_FENCE_GATE = "minecraft:dark_oak_fence_gate"; @@ -214,6 +218,7 @@ final class BlockTypeNames{ public const DAYLIGHT_DETECTOR = "minecraft:daylight_detector"; public const DAYLIGHT_DETECTOR_INVERTED = "minecraft:daylight_detector_inverted"; public const DEADBUSH = "minecraft:deadbush"; + public const DECORATED_POT = "minecraft:decorated_pot"; public const DEEPSLATE = "minecraft:deepslate"; public const DEEPSLATE_BRICK_DOUBLE_SLAB = "minecraft:deepslate_brick_double_slab"; public const DEEPSLATE_BRICK_SLAB = "minecraft:deepslate_brick_slab"; @@ -417,9 +422,11 @@ final class BlockTypeNames{ public const GRAY_CANDLE = "minecraft:gray_candle"; public const GRAY_CANDLE_CAKE = "minecraft:gray_candle_cake"; public const GRAY_GLAZED_TERRACOTTA = "minecraft:gray_glazed_terracotta"; + public const GRAY_WOOL = "minecraft:gray_wool"; public const GREEN_CANDLE = "minecraft:green_candle"; public const GREEN_CANDLE_CAKE = "minecraft:green_candle_cake"; public const GREEN_GLAZED_TERRACOTTA = "minecraft:green_glazed_terracotta"; + public const GREEN_WOOL = "minecraft:green_wool"; public const GRINDSTONE = "minecraft:grindstone"; public const HANGING_ROOTS = "minecraft:hanging_roots"; public const HARD_GLASS = "minecraft:hard_glass"; @@ -469,13 +476,16 @@ final class BlockTypeNames{ public const LIGHT_BLUE_CANDLE = "minecraft:light_blue_candle"; public const LIGHT_BLUE_CANDLE_CAKE = "minecraft:light_blue_candle_cake"; public const LIGHT_BLUE_GLAZED_TERRACOTTA = "minecraft:light_blue_glazed_terracotta"; + public const LIGHT_BLUE_WOOL = "minecraft:light_blue_wool"; public const LIGHT_GRAY_CANDLE = "minecraft:light_gray_candle"; public const LIGHT_GRAY_CANDLE_CAKE = "minecraft:light_gray_candle_cake"; + public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; public const LIME_CANDLE = "minecraft:lime_candle"; public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; public const LIME_GLAZED_TERRACOTTA = "minecraft:lime_glazed_terracotta"; + public const LIME_WOOL = "minecraft:lime_wool"; public const LIT_BLAST_FURNACE = "minecraft:lit_blast_furnace"; public const LIT_DEEPSLATE_REDSTONE_ORE = "minecraft:lit_deepslate_redstone_ore"; public const LIT_FURNACE = "minecraft:lit_furnace"; @@ -490,6 +500,7 @@ final class BlockTypeNames{ public const MAGENTA_CANDLE = "minecraft:magenta_candle"; public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; + public const MAGENTA_WOOL = "minecraft:magenta_wool"; public const MAGMA = "minecraft:magma"; public const MANGROVE_BUTTON = "minecraft:mangrove_button"; public const MANGROVE_DOOR = "minecraft:mangrove_door"; @@ -548,6 +559,7 @@ final class BlockTypeNames{ public const ORANGE_CANDLE = "minecraft:orange_candle"; public const ORANGE_CANDLE_CAKE = "minecraft:orange_candle_cake"; public const ORANGE_GLAZED_TERRACOTTA = "minecraft:orange_glazed_terracotta"; + public const ORANGE_WOOL = "minecraft:orange_wool"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; public const OXIDIZED_CUT_COPPER = "minecraft:oxidized_cut_copper"; public const OXIDIZED_CUT_COPPER_SLAB = "minecraft:oxidized_cut_copper_slab"; @@ -559,6 +571,7 @@ final class BlockTypeNames{ public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; + public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; public const PLANKS = "minecraft:planks"; @@ -598,6 +611,7 @@ final class BlockTypeNames{ public const PURPLE_CANDLE = "minecraft:purple_candle"; public const PURPLE_CANDLE_CAKE = "minecraft:purple_candle_cake"; public const PURPLE_GLAZED_TERRACOTTA = "minecraft:purple_glazed_terracotta"; + public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; public const PURPUR_STAIRS = "minecraft:purpur_stairs"; public const QUARTZ_BLOCK = "minecraft:quartz_block"; @@ -618,6 +632,7 @@ final class BlockTypeNames{ public const RED_NETHER_BRICK_STAIRS = "minecraft:red_nether_brick_stairs"; public const RED_SANDSTONE = "minecraft:red_sandstone"; public const RED_SANDSTONE_STAIRS = "minecraft:red_sandstone_stairs"; + public const RED_WOOL = "minecraft:red_wool"; public const REDSTONE_BLOCK = "minecraft:redstone_block"; public const REDSTONE_LAMP = "minecraft:redstone_lamp"; public const REDSTONE_ORE = "minecraft:redstone_ore"; @@ -708,12 +723,15 @@ final class BlockTypeNames{ public const STRIPPED_WARPED_STEM = "minecraft:stripped_warped_stem"; public const STRUCTURE_BLOCK = "minecraft:structure_block"; public const STRUCTURE_VOID = "minecraft:structure_void"; + public const SUSPICIOUS_SAND = "minecraft:suspicious_sand"; public const SWEET_BERRY_BUSH = "minecraft:sweet_berry_bush"; public const TALLGRASS = "minecraft:tallgrass"; public const TARGET = "minecraft:target"; public const TINTED_GLASS = "minecraft:tinted_glass"; public const TNT = "minecraft:tnt"; public const TORCH = "minecraft:torch"; + public const TORCHFLOWER = "minecraft:torchflower"; + public const TORCHFLOWER_CROP = "minecraft:torchflower_crop"; public const TRAPDOOR = "minecraft:trapdoor"; public const TRAPPED_CHEST = "minecraft:trapped_chest"; public const TRIP_WIRE = "minecraft:trip_wire"; @@ -783,15 +801,16 @@ final class BlockTypeNames{ public const WHITE_CANDLE = "minecraft:white_candle"; public const WHITE_CANDLE_CAKE = "minecraft:white_candle_cake"; public const WHITE_GLAZED_TERRACOTTA = "minecraft:white_glazed_terracotta"; + public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; public const WOOD = "minecraft:wood"; public const WOODEN_BUTTON = "minecraft:wooden_button"; public const WOODEN_DOOR = "minecraft:wooden_door"; public const WOODEN_PRESSURE_PLATE = "minecraft:wooden_pressure_plate"; public const WOODEN_SLAB = "minecraft:wooden_slab"; - public const WOOL = "minecraft:wool"; public const YELLOW_CANDLE = "minecraft:yellow_candle"; public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; + public const YELLOW_WOOL = "minecraft:yellow_wool"; } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 40d5650c36..871e478475 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -189,6 +189,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ public function __construct(){ $this->registerCandleSerializers(); + $this->registerFlatColorBlockSerializers(); $this->registerCauldronSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); @@ -303,6 +304,51 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ })->writeBool(StateNames::LIT, $block->isLit())); } + public function registerFlatColorBlockSerializers() : void{ + $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ + return Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, + DyeColor::BLUE() => Ids::BLUE_GLAZED_TERRACOTTA, + DyeColor::BROWN() => Ids::BROWN_GLAZED_TERRACOTTA, + DyeColor::CYAN() => Ids::CYAN_GLAZED_TERRACOTTA, + DyeColor::GRAY() => Ids::GRAY_GLAZED_TERRACOTTA, + DyeColor::GREEN() => Ids::GREEN_GLAZED_TERRACOTTA, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, + DyeColor::LIGHT_GRAY() => Ids::SILVER_GLAZED_TERRACOTTA, + DyeColor::LIME() => Ids::LIME_GLAZED_TERRACOTTA, + DyeColor::MAGENTA() => Ids::MAGENTA_GLAZED_TERRACOTTA, + DyeColor::ORANGE() => Ids::ORANGE_GLAZED_TERRACOTTA, + DyeColor::PINK() => Ids::PINK_GLAZED_TERRACOTTA, + DyeColor::PURPLE() => Ids::PURPLE_GLAZED_TERRACOTTA, + DyeColor::RED() => Ids::RED_GLAZED_TERRACOTTA, + DyeColor::WHITE() => Ids::WHITE_GLAZED_TERRACOTTA, + DyeColor::YELLOW() => Ids::YELLOW_GLAZED_TERRACOTTA, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + }) + ->writeHorizontalFacing($block->getFacing()); + }); + + $this->map(Blocks::WOOL(), fn(Wool $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_WOOL, + DyeColor::BLUE() => Ids::BLUE_WOOL, + DyeColor::BROWN() => Ids::BROWN_WOOL, + DyeColor::CYAN() => Ids::CYAN_WOOL, + DyeColor::GRAY() => Ids::GRAY_WOOL, + DyeColor::GREEN() => Ids::GREEN_WOOL, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_WOOL, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_WOOL, + DyeColor::LIME() => Ids::LIME_WOOL, + DyeColor::MAGENTA() => Ids::MAGENTA_WOOL, + DyeColor::ORANGE() => Ids::ORANGE_WOOL, + DyeColor::PINK() => Ids::PINK_WOOL, + DyeColor::PURPLE() => Ids::PURPLE_WOOL, + DyeColor::RED() => Ids::RED_WOOL, + DyeColor::WHITE() => Ids::WHITE_WOOL, + DyeColor::YELLOW() => Ids::YELLOW_WOOL, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + } + private function registerCauldronSerializers() : void{ $this->map(Blocks::CAULDRON(), fn() => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, 0, new Writer(Ids::CAULDRON))); $this->map(Blocks::LAVA_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_LAVA, $b->getFillLevel(), new Writer(Ids::LAVA_CAULDRON))); @@ -967,28 +1013,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::AGE, $block->getAge()); }); $this->map(Blocks::FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::FURNACE, Ids::LIT_FURNACE)); - $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ - return Writer::create(match ($color = $block->getColor()) { - DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, - DyeColor::BLUE() => Ids::BLUE_GLAZED_TERRACOTTA, - DyeColor::BROWN() => Ids::BROWN_GLAZED_TERRACOTTA, - DyeColor::CYAN() => Ids::CYAN_GLAZED_TERRACOTTA, - DyeColor::GRAY() => Ids::GRAY_GLAZED_TERRACOTTA, - DyeColor::GREEN() => Ids::GREEN_GLAZED_TERRACOTTA, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, - DyeColor::LIGHT_GRAY() => Ids::SILVER_GLAZED_TERRACOTTA, - DyeColor::LIME() => Ids::LIME_GLAZED_TERRACOTTA, - DyeColor::MAGENTA() => Ids::MAGENTA_GLAZED_TERRACOTTA, - DyeColor::ORANGE() => Ids::ORANGE_GLAZED_TERRACOTTA, - DyeColor::PINK() => Ids::PINK_GLAZED_TERRACOTTA, - DyeColor::PURPLE() => Ids::PURPLE_GLAZED_TERRACOTTA, - DyeColor::RED() => Ids::RED_GLAZED_TERRACOTTA, - DyeColor::WHITE() => Ids::WHITE_GLAZED_TERRACOTTA, - DyeColor::YELLOW() => Ids::YELLOW_GLAZED_TERRACOTTA, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) - }) - ->writeHorizontalFacing($block->getFacing()); - }); $this->map(Blocks::GLOWING_ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::GLOW_FRAME)); $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); @@ -1446,9 +1470,5 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); - $this->map(Blocks::WOOL(), function(Wool $block) : Writer{ - return Writer::create(Ids::WOOL) - ->writeColor($block->getColor()); - }); } } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 39e7b0b657..a6c57937e8 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -70,6 +70,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ public function __construct(){ $this->registerCandleDeserializers(); + $this->registerFlatColorBlockDeserializers(); $this->registerCauldronDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); @@ -158,6 +159,42 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::YELLOW_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::YELLOW())); } + private function registerFlatColorBlockDeserializers() : void{ + $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); + $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); + $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); + $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); + $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); + $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); + $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); + $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_GRAY(), $in)); + $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); + $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); + $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); + $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); + $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PURPLE(), $in)); + $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::RED(), $in)); + $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); + $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); + + $this->mapSimple(Ids::BLACK_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BLACK())); + $this->mapSimple(Ids::BLUE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BLUE())); + $this->mapSimple(Ids::BROWN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BROWN())); + $this->mapSimple(Ids::CYAN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::CYAN())); + $this->mapSimple(Ids::GRAY_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::GRAY())); + $this->mapSimple(Ids::GREEN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::GREEN())); + $this->mapSimple(Ids::LIGHT_BLUE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIGHT_BLUE())); + $this->mapSimple(Ids::LIGHT_GRAY_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIGHT_GRAY())); + $this->mapSimple(Ids::LIME_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIME())); + $this->mapSimple(Ids::MAGENTA_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::MAGENTA())); + $this->mapSimple(Ids::ORANGE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::ORANGE())); + $this->mapSimple(Ids::PINK_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::PINK())); + $this->mapSimple(Ids::PURPLE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::PURPLE())); + $this->mapSimple(Ids::RED_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::RED())); + $this->mapSimple(Ids::WHITE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::WHITE())); + $this->mapSimple(Ids::YELLOW_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::YELLOW())); + } + private function registerCauldronDeserializers() : void{ $deserializer = function(Reader $in) : Block{ $level = $in->readBoundedInt(StateNames::FILL_LEVEL, 0, 6); @@ -516,13 +553,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS()); $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); - $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); - $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis()); @@ -534,7 +569,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); }); $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); - $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); $this->map(Ids::CACTUS, function(Reader $in) : Block{ return Blocks::CACTUS() @@ -639,7 +673,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), false, $in)); $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in)); $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in)); - $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in)); $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in)); $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in)); @@ -751,8 +784,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); - $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); - $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ return Blocks::STAINED_HARDENED_GLASS() ->setColor($in->readColor()); @@ -830,9 +861,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LIGHTNING_ROD() ->setFacing($in->readFacingDirection()); }); - $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); - $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); $this->map(Ids::LIT_BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() ->setFacing($in->readHorizontalFacing()) @@ -877,7 +906,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); }); - $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); $this->map(Ids::MANGROVE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::MANGROVE_BUTTON(), $in)); $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in)); $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB()); @@ -922,13 +950,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE())->setAxis($in->readPillarAxis())); - $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT())->setAxis($in->readPillarAxis())); - $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); $this->map(Ids::PLANKS, function(Reader $in) : Block{ return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_OAK => Blocks::OAK_PLANKS(), @@ -986,7 +1012,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::PUMPKIN(); }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); - $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PURPLE(), $in)); $this->map(Ids::PURPUR_BLOCK, function(Reader $in) : Block{ $type = $in->readString(StateNames::CHISEL_TYPE); if($type === StringValues::CHISEL_TYPE_LINES){ @@ -1039,7 +1064,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ default => throw $in->badValueException(StateNames::FLOWER_TYPE, $type), }; }); - $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::RED(), $in)); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ @@ -1111,7 +1135,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::DYED_SHULKER_BOX() ->setColor($in->readColor()); }); - $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_GRAY(), $in)); $this->map(Ids::SKULL, function(Reader $in) : Block{ return Blocks::MOB_HEAD() ->setFacing($in->readFacingWithoutDown()); @@ -1325,7 +1348,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setAge($in->readBoundedInt(StateNames::WEEPING_VINES_AGE, 0, 25)); }); $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in)); - $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), @@ -1339,11 +1361,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in)); $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::OAK_PRESSURE_PLATE(), $in)); $this->mapSlab(Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)); - $this->map(Ids::WOOL, function(Reader $in) : Block{ - return Blocks::WOOL() - ->setColor($in->readColor()); - }); - $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); } /** @throws BlockStateDeserializeException */ diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 80a103df3d..2a808d4161 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -35,7 +35,9 @@ final class ItemTypeNames{ public const ALLAY_SPAWN_EGG = "minecraft:allay_spawn_egg"; public const AMETHYST_SHARD = "minecraft:amethyst_shard"; public const APPLE = "minecraft:apple"; + public const ARCHER_POTTERY_SHARD = "minecraft:archer_pottery_shard"; public const ARMOR_STAND = "minecraft:armor_stand"; + public const ARMS_UP_POTTERY_SHARD = "minecraft:arms_up_pottery_shard"; public const ARROW = "minecraft:arrow"; public const AXOLOTL_BUCKET = "minecraft:axolotl_bucket"; public const AXOLOTL_SPAWN_EGG = "minecraft:axolotl_spawn_egg"; @@ -74,6 +76,7 @@ final class ItemTypeNames{ public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK = "minecraft:brick"; public const BROWN_DYE = "minecraft:brown_dye"; + public const BRUSH = "minecraft:brush"; public const BUCKET = "minecraft:bucket"; public const CAKE = "minecraft:cake"; public const CAMEL_SPAWN_EGG = "minecraft:camel_spawn_egg"; @@ -126,6 +129,7 @@ final class ItemTypeNames{ public const DARK_OAK_CHEST_BOAT = "minecraft:dark_oak_chest_boat"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; + public const DEBUG_STICK = "minecraft:debug_stick"; public const DIAMOND = "minecraft:diamond"; public const DIAMOND_AXE = "minecraft:diamond_axe"; public const DIAMOND_BOOTS = "minecraft:diamond_boots"; @@ -326,6 +330,7 @@ final class ItemTypeNames{ public const POWDER_SNOW_BUCKET = "minecraft:powder_snow_bucket"; public const PRISMARINE_CRYSTALS = "minecraft:prismarine_crystals"; public const PRISMARINE_SHARD = "minecraft:prismarine_shard"; + public const PRIZE_POTTERY_SHARD = "minecraft:prize_pottery_shard"; public const PUFFERFISH = "minecraft:pufferfish"; public const PUFFERFISH_BUCKET = "minecraft:pufferfish_bucket"; public const PUFFERFISH_SPAWN_EGG = "minecraft:pufferfish_spawn_egg"; @@ -363,6 +368,7 @@ final class ItemTypeNames{ public const SKELETON_SPAWN_EGG = "minecraft:skeleton_spawn_egg"; public const SKULL = "minecraft:skull"; public const SKULL_BANNER_PATTERN = "minecraft:skull_banner_pattern"; + public const SKULL_POTTERY_SHARD = "minecraft:skull_pottery_shard"; public const SLIME_BALL = "minecraft:slime_ball"; public const SLIME_SPAWN_EGG = "minecraft:slime_spawn_egg"; public const SNIFFER_SPAWN_EGG = "minecraft:sniffer_spawn_egg"; @@ -396,6 +402,7 @@ final class ItemTypeNames{ public const TADPOLE_BUCKET = "minecraft:tadpole_bucket"; public const TADPOLE_SPAWN_EGG = "minecraft:tadpole_spawn_egg"; public const TNT_MINECART = "minecraft:tnt_minecart"; + public const TORCHFLOWER_SEEDS = "minecraft:torchflower_seeds"; public const TOTEM_OF_UNDYING = "minecraft:totem_of_undying"; public const TRADER_LLAMA_SPAWN_EGG = "minecraft:trader_llama_spawn_egg"; public const TRIDENT = "minecraft:trident"; @@ -426,6 +433,7 @@ final class ItemTypeNames{ public const WOODEN_PICKAXE = "minecraft:wooden_pickaxe"; public const WOODEN_SHOVEL = "minecraft:wooden_shovel"; public const WOODEN_SWORD = "minecraft:wooden_sword"; + public const WOOL = "minecraft:wool"; public const WRITABLE_BOOK = "minecraft:writable_book"; public const WRITTEN_BOOK = "minecraft:written_book"; public const YELLOW_DYE = "minecraft:yellow_dye"; diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 0fbc1c91ae..2aee9876c9 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -43,7 +43,7 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; * benefits for now. */ final class GlobalBlockStateHandlers{ - public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 161; //0161_1.19.50_to_1.19.60.26_beta.json + public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 171; //0171_1.19.60_to_1.9.70.26_beta.json private static ?BlockObjectToStateSerializer $blockStateSerializer = null; diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index 3c456dabd8..e3bef64660 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -34,7 +34,7 @@ use Symfony\Component\Filesystem\Path; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; final class GlobalItemDataHandlers{ - public const MAX_ITEM_ID_UPGRADE_SCHEMA_ID = 81; //0081_1.18.30_to_1.19.30.34_beta.json + public const MAX_ITEM_ID_UPGRADE_SCHEMA_ID = 91; //0091_1.19.60_to_1.19.70.26_beta.json private static ?ItemSerializer $itemSerializer = null; diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 853c8e39f3..7be3ad1abf 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -53,6 +53,7 @@ use pocketmine\network\mcpe\protocol\types\CacheableNbt; use pocketmine\network\mcpe\protocol\types\inventory\CreativeContentEntry; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\ItemTypeEntry; +use pocketmine\network\mcpe\protocol\types\recipe\ComplexAliasItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipe; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\MolangItemDescriptor; @@ -282,6 +283,8 @@ class ParserPacketHandler extends PacketHandler{ }elseif($descriptor instanceof MolangItemDescriptor){ $data->molang_expression = $descriptor->getMolangExpression(); $data->molang_version = $descriptor->getMolangVersion(); + }elseif($descriptor instanceof ComplexAliasItemDescriptor){ + $data->name = $descriptor->getAlias(); }else{ throw new \UnexpectedValueException("Unknown item descriptor type " . get_class($descriptor)); } From 10d22a55ec698023eee19d899b954412d105df6b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 18:50:34 +0000 Subject: [PATCH 0699/1858] Updated composer dependencies (PM5) --- composer.lock | 52 +++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/composer.lock b/composer.lock index b379351ce1..e03cb4d662 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1fce2212ea8f1510f2d68da4f46023db", + "content-hash": "500661d6d723c3853f8e3b66c838a66b", "packages": [ { "name": "adhocore/json-comment", @@ -250,16 +250,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4" + "reference": "e0540343e649a92126a1d4071ec401a811416c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/a05ce434eb7f8c11058d26833bc975fe635b23b4", - "reference": "a05ce434eb7f8c11058d26833bc975fe635b23b4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/e0540343e649a92126a1d4071ec401a811416c76", + "reference": "e0540343e649a92126a1d4071ec401a811416c76", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.0.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.1" }, - "time": "2023-02-01T21:09:54+00:00" + "time": "2023-03-08T23:45:59+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.0.0+bedrock-1.19.60", + "version": "2.1.1+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "957e49b2381641af29f595e4f32ded3e76ce4723" + "reference": "cba0567bcb25f987f2712092f8d662056719e82d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/957e49b2381641af29f595e4f32ded3e76ce4723", - "reference": "957e49b2381641af29f595e4f32ded3e76ce4723", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/cba0567bcb25f987f2712092f8d662056719e82d", + "reference": "cba0567bcb25f987f2712092f8d662056719e82d", "shasum": "" }, "type": "library", @@ -296,22 +296,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.0.0+bedrock-1.19.60" + "source": "https://github.com/pmmp/BedrockData/tree/2.1.1+bedrock-1.19.70" }, - "time": "2023-02-23T21:25:04+00:00" + "time": "2023-03-14T18:03:19+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7" + "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", - "reference": "7e53f77ea34ba30b1f94d3c24e64e19d3c4296e7", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/aab89a1f121a0c127557a4a0cf981330301c9c45", + "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45", "shasum": "" }, "type": "library", @@ -322,22 +322,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.0.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.1.0" }, - "time": "2023-02-01T22:50:02+00:00" + "time": "2023-03-08T22:27:13+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "19.3.0+bedrock-1.19.62", + "version": "20.0.0+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad" + "reference": "4892a5020187da805d7b46ab522d8185b0283726" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a5bf4753c7f30f781c4541918e238f5bb637e7ad", - "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/4892a5020187da805d7b46ab522d8185b0283726", + "reference": "4892a5020187da805d7b46ab522d8185b0283726", "shasum": "" }, "require": { @@ -351,7 +351,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.9.13", + "phpstan/phpstan": "1.10.1", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.3.0+bedrock-1.19.62" + "source": "https://github.com/pmmp/BedrockProtocol/tree/20.0.0+bedrock-1.19.70" }, - "time": "2023-02-19T16:11:03+00:00" + "time": "2023-03-14T17:06:38+00:00" }, { "name": "pocketmine/binaryutils", From 14f141fab27f6517d0799b9c5351dc1352c2fd13 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 19:00:15 +0000 Subject: [PATCH 0700/1858] NetworkSession: Stop counting DataPacketReceiveEvent in handler timings we want it to be included in receive timings, but not handler timings. Handler timings should reflect the time spent in the actual session PacketHandler, not in the event. --- src/network/mcpe/NetworkSession.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index abc84f6165..56b0622d8b 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -447,18 +447,18 @@ class NetworkSession{ $decodeTimings->stopTiming(); } - $handlerTimings = Timings::getHandleDataPacketTimings($packet); - $handlerTimings->startTiming(); - try{ - //TODO: I'm not sure DataPacketReceiveEvent should be included in the handler timings, but it needs to be - //included for now to ensure the receivePacket timings are counted the way they were before - $ev = new DataPacketReceiveEvent($this, $packet); - $ev->call(); - if(!$ev->isCancelled() && ($this->handler === null || !$packet->handle($this->handler))){ - $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); + $ev = new DataPacketReceiveEvent($this, $packet); + $ev->call(); + if(!$ev->isCancelled()){ + $handlerTimings = Timings::getHandleDataPacketTimings($packet); + $handlerTimings->startTiming(); + try{ + if($this->handler === null || !$packet->handle($this->handler)){ + $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); + } + }finally{ + $handlerTimings->stopTiming(); } - }finally{ - $handlerTimings->stopTiming(); } }finally{ $timings->stopTiming(); From 34ced382db077cc23bd01a0feade7421917204c2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 22:56:11 +0000 Subject: [PATCH 0701/1858] Eliminate final remaining usage of TypeConverter::netItemStackToCore() instead, we can verify that the held items match by comparing the received ItemStack with the one cached in InventoryManager, which is more cost effective and closes off internal item deserializers to external attacks. --- .../mcpe/handler/InGamePacketHandler.php | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 1fd0f584c4..dbf2aa5abf 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -46,7 +46,6 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; -use pocketmine\network\mcpe\convert\TypeConversionException; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; @@ -392,25 +391,23 @@ class InGamePacketHandler extends PacketHandler{ //prediction rollback anyway. //it's technically possible to see this more than once, but a normal client should never do that. $inventory = $this->player->getInventory(); - $heldItem = $inventory->getItemInHand(); - try{ - $droppedItem = TypeConverter::getInstance()->netItemStackToCore($networkInventoryAction->newItem->getItemStack()); - }catch(TypeConversionException $e){ - throw PacketHandlingException::wrap($e); + $heldItemStack = $this->inventoryManager->getItemStackInfo($inventory, $inventory->getHeldItemIndex())?->getItemStack(); + if($heldItemStack === null){ + throw new AssumptionFailedError("Missing itemstack info for held item"); } - - //TODO: if we can avoid decoding incoming item NBT, it will be faster to compare network ItemStacks - //rather than converting to internal itemstacks and using canStackWith() here. - if(!$heldItem->canStackWith($droppedItem) || $heldItem->getCount() < $droppedItem->getCount()){ + $droppedItemStack = $networkInventoryAction->newItem->getItemStack(); + //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known + //itemstack info with the one the client sent. This is costly, but we don't have any other option :( + if(!$heldItemStack->equalsWithoutCount($droppedItemStack) || $heldItemStack->getCount() < $droppedItemStack->getCount()){ return false; } - //purposely overwritten here - this allows any immutable internal references to be shared - $droppedItem = $heldItem->pop($droppedItem->getCount()); + $newHeldItem = $inventory->getItemInHand(); + $droppedItem = $newHeldItem->pop($droppedItemStack->getCount()); $builder = new TransactionBuilder(); - $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $heldItem); + $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $newHeldItem); $builder->addAction(new DropItemAction($droppedItem)); $transaction = new InventoryTransaction($this->player, $builder->generateActions()); From 4ba4d556ed02607ae22fff96e245aa7bc947d412 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Mar 2023 23:27:16 +0000 Subject: [PATCH 0702/1858] Tidy up world version related things I decided to scrap the max schema ID stuff, since it just adds extra places to forget updating. Instead, it's better to use minor version locks and version metadata, as we do for BedrockData and BedrockProtocol. --- src/world/format/io/GlobalBlockStateHandlers.php | 5 ++--- src/world/format/io/GlobalItemDataHandlers.php | 5 ++--- src/world/format/io/data/BedrockWorldData.php | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 2aee9876c9..ed162c8cae 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -34,6 +34,7 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\LegacyBlockIdToStringIdMap; use pocketmine\utils\Filesystem; use Symfony\Component\Filesystem\Path; +use const PHP_INT_MAX; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; /** @@ -43,8 +44,6 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; * benefits for now. */ final class GlobalBlockStateHandlers{ - public const MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID = 171; //0171_1.19.60_to_1.9.70.26_beta.json - private static ?BlockObjectToStateSerializer $blockStateSerializer = null; private static ?BlockStateToObjectDeserializer $blockStateDeserializer = null; @@ -65,7 +64,7 @@ final class GlobalBlockStateHandlers{ if(self::$blockDataUpgrader === null){ $blockStateUpgrader = new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), - self::MAX_BLOCKSTATE_UPGRADE_SCHEMA_ID + PHP_INT_MAX )); self::$blockDataUpgrader = new BlockDataUpgrader( BlockIdMetaUpgrader::loadFromString( diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index e3bef64660..ea5568c7cb 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -31,11 +31,10 @@ use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgradeSchemaUtils; use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\bedrock\item\upgrade\R12ItemIdToBlockIdMap; use Symfony\Component\Filesystem\Path; +use const PHP_INT_MAX; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; final class GlobalItemDataHandlers{ - public const MAX_ITEM_ID_UPGRADE_SCHEMA_ID = 91; //0091_1.19.60_to_1.19.70.26_beta.json - private static ?ItemSerializer $itemSerializer = null; private static ?ItemDeserializer $itemDeserializer = null; @@ -52,7 +51,7 @@ final class GlobalItemDataHandlers{ public static function getUpgrader() : ItemDataUpgrader{ return self::$itemDataUpgrader ??= new ItemDataUpgrader( - new ItemIdMetaUpgrader(ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID)), + new ItemIdMetaUpgrader(ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), PHP_INT_MAX)), LegacyItemIdToStringIdMap::getInstance(), R12ItemIdToBlockIdMap::getInstance(), GlobalBlockStateHandlers::getUpgrader() diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index fbe8b36b82..82279e734f 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -49,11 +49,11 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 560; + public const CURRENT_STORAGE_NETWORK_VERSION = 575; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 19, //minor - 50, //patch + 70, //patch 0, //revision 0 //is beta ]; From b266f45152bc8fa07388f8dc6caec27049903e5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:44:20 +0000 Subject: [PATCH 0703/1858] Bump build/php from `71b9f9d` to `a464454` (#5637) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `71b9f9d` to `a464454`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/71b9f9d2d7b3ee45d9475803b96c080f5f22f373...a464454d1ed946baabd32a02ddcf66361374b99c) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 71b9f9d2d7..a464454d1e 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 71b9f9d2d7b3ee45d9475803b96c080f5f22f373 +Subproject commit a464454d1ed946baabd32a02ddcf66361374b99c From 5f9e0081fdde243bad9ebd3853d05ae48dabb20a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 16:36:05 +0000 Subject: [PATCH 0704/1858] Fixed mushroom block silk-touch drops and block picking behaviour fixes #5284 --- src/block/RedMushroomBlock.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 820a0e5f89..1aa602bd97 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -34,7 +34,7 @@ class RedMushroomBlock extends Opaque{ protected MushroomBlockType $mushroomBlockType; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->mushroomBlockType = MushroomBlockType::PORES(); + $this->mushroomBlockType = MushroomBlockType::ALL_CAP(); parent::__construct($idInfo, $name, $breakInfo); } @@ -42,6 +42,11 @@ class RedMushroomBlock extends Opaque{ return MushroomBlockTypeIdMap::getInstance()->toId($this->mushroomBlockType); } + protected function writeStateToItemMeta() : int{ + //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative) + return BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_CAP; + } + public function readStateFromData(int $id, int $stateMeta) : void{ $type = MushroomBlockTypeIdMap::getInstance()->fromId($stateMeta); if($type === null){ From 72853677bb5839b4d5a8768fd338b203d49b7dd5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 16:54:13 +0000 Subject: [PATCH 0705/1858] Fixed mushroom blocks for PM5 closes #5284 --- src/block/RedMushroomBlock.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 17fced4129..dfa50e2657 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -32,11 +32,13 @@ class RedMushroomBlock extends Opaque{ protected MushroomBlockType $mushroomBlockType; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->mushroomBlockType = MushroomBlockType::PORES(); + $this->mushroomBlockType = MushroomBlockType::ALL_CAP(); parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeType(RuntimeDataDescriber $w) : void{ + //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative), + //so this information needs to be kept in the type info $w->mushroomBlockType($this->mushroomBlockType); } @@ -57,4 +59,12 @@ class RedMushroomBlock extends Opaque{ public function isAffectedBySilkTouch() : bool{ return true; } + + public function getSilkTouchDrops(Item $item) : array{ + return [(clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP())->asItem()]; + } + + public function getPickedItem(bool $addUserData = false) : Item{ + return (clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP())->asItem(); + } } From e7e19abe85a98d1c4b66a92e3b0ac574bde888ca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 17:17:56 +0000 Subject: [PATCH 0706/1858] IPv4 and IPv6 RakLibInterface instances now both use the same broadcaster and context fixes #5625 --- src/Server.php | 14 ++++++++++---- src/network/mcpe/raklib/RakLibInterface.php | 8 ++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Server.php b/src/Server.php index e5f312f4e0..43460e9447 100644 --- a/src/Server.php +++ b/src/Server.php @@ -54,13 +54,16 @@ use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\CompressBatchTask; use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\ZlibCompressor; +use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\encryption\EncryptionContext; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\raklib\RakLibInterface; +use pocketmine\network\mcpe\StandardPacketBroadcaster; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\query\DedicatedQueryNetworkInterface; @@ -1169,10 +1172,10 @@ class Server{ return !$anyWorldFailedToLoad; } - private function startupPrepareConnectableNetworkInterfaces(string $ip, int $port, bool $ipV6, bool $useQuery) : bool{ + private function startupPrepareConnectableNetworkInterfaces(string $ip, int $port, bool $ipV6, bool $useQuery, PacketBroadcaster $packetBroadcaster, PacketSerializerContext $packetSerializerContext) : bool{ $prettyIp = $ipV6 ? "[$ip]" : $ip; try{ - $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6)); + $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $packetSerializerContext)); }catch(NetworkInterfaceStartException $e){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_networkStartFailed( $ip, @@ -1198,11 +1201,14 @@ class Server{ private function startupPrepareNetworkInterfaces() : bool{ $useQuery = $this->configGroup->getConfigBool("enable-query", true); + $packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); + $broadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); + if( - !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery) || + !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $broadcaster, $packetSerializerContext) || ( $this->configGroup->getConfigBool("enable-ipv6", true) && - !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery) + !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $broadcaster, $packetSerializerContext) ) ){ return false; diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 993566f852..1f7ae9767c 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -83,8 +83,11 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private PacketBroadcaster $broadcaster; private PacketSerializerContext $packetSerializerContext; - public function __construct(Server $server, string $ip, int $port, bool $ipV6){ + public function __construct(Server $server, string $ip, int $port, bool $ipV6, PacketBroadcaster $packetBroadcaster, PacketSerializerContext $packetSerializerContext){ $this->server = $server; + $this->broadcaster = $packetBroadcaster; + $this->packetSerializerContext = $packetSerializerContext; + $this->rakServerId = mt_rand(0, PHP_INT_MAX); $this->sleeper = new SleeperNotifier(); @@ -108,9 +111,6 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->interface = new UserToRakLibThreadMessageSender( new PthreadsChannelWriter($mainToThreadBuffer) ); - - $this->packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); - $this->broadcaster = new StandardPacketBroadcaster($this->server, $this->packetSerializerContext); } public function start() : void{ From cc8660629b53e8687adeaed2f6c896582dd8e39e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 18:17:45 +0000 Subject: [PATCH 0707/1858] First look at shared EntityEventBroadcaster, this improves performance in PvP servers and other areas where lots of players or entities exist in one space. fixes #5622 --- src/Server.php | 21 ++- src/entity/Entity.php | 16 +- src/entity/Human.php | 48 +++--- src/entity/Living.php | 16 +- src/entity/object/ItemEntity.php | 9 +- src/entity/projectile/Arrow.php | 9 +- src/network/mcpe/EntityEventBroadcaster.php | 93 ++++++++++++ src/network/mcpe/NetworkBroadcastUtils.php | 54 +++++++ src/network/mcpe/NetworkSession.php | 101 +------------ .../mcpe/StandardEntityEventBroadcaster.php | 143 ++++++++++++++++++ .../mcpe/handler/PreSpawnPacketHandler.php | 4 +- src/network/mcpe/raklib/RakLibInterface.php | 14 +- tests/phpstan/configs/actual-problems.neon | 35 ++--- 13 files changed, 393 insertions(+), 170 deletions(-) create mode 100644 src/network/mcpe/EntityEventBroadcaster.php create mode 100644 src/network/mcpe/NetworkBroadcastUtils.php create mode 100644 src/network/mcpe/StandardEntityEventBroadcaster.php diff --git a/src/Server.php b/src/Server.php index 43460e9447..dbccda2da3 100644 --- a/src/Server.php +++ b/src/Server.php @@ -56,6 +56,7 @@ use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\encryption\EncryptionContext; +use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ClientboundPacket; @@ -63,6 +64,7 @@ use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\raklib\RakLibInterface; +use pocketmine\network\mcpe\StandardEntityEventBroadcaster; use pocketmine\network\mcpe\StandardPacketBroadcaster; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; @@ -1172,10 +1174,18 @@ class Server{ return !$anyWorldFailedToLoad; } - private function startupPrepareConnectableNetworkInterfaces(string $ip, int $port, bool $ipV6, bool $useQuery, PacketBroadcaster $packetBroadcaster, PacketSerializerContext $packetSerializerContext) : bool{ + private function startupPrepareConnectableNetworkInterfaces( + string $ip, + int $port, + bool $ipV6, + bool $useQuery, + PacketBroadcaster $packetBroadcaster, + EntityEventBroadcaster $entityEventBroadcaster, + PacketSerializerContext $packetSerializerContext + ) : bool{ $prettyIp = $ipV6 ? "[$ip]" : $ip; try{ - $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $packetSerializerContext)); + $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext)); }catch(NetworkInterfaceStartException $e){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_networkStartFailed( $ip, @@ -1202,13 +1212,14 @@ class Server{ $useQuery = $this->configGroup->getConfigBool("enable-query", true); $packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); - $broadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); + $packetBroadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); + $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster); if( - !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $broadcaster, $packetSerializerContext) || + !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext) || ( $this->configGroup->getConfigBool("enable-ipv6", true) && - !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $broadcaster, $packetSerializerContext) + !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext) ) ){ return false; diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 46e60feaa8..c206b81d3a 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -44,6 +44,8 @@ use pocketmine\nbt\tag\DoubleTag; use pocketmine\nbt\tag\FloatTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\StringTag; +use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddActorPacket; use pocketmine\network\mcpe\protocol\MoveActorAbsolutePacket; use pocketmine\network\mcpe\protocol\SetActorMotionPacket; @@ -1537,7 +1539,7 @@ abstract class Entity{ $id = spl_object_id($player); if(isset($this->hasSpawned[$id])){ if($send){ - $player->getNetworkSession()->onEntityRemoved($this); + $player->getNetworkSession()->getEntityEventBroadcaster()->onEntityRemoved([$player->getNetworkSession()], $this); } unset($this->hasSpawned[$id]); } @@ -1548,9 +1550,11 @@ abstract class Entity{ * player moves, viewers will once again be able to see the entity. */ public function despawnFromAll() : void{ - foreach($this->hasSpawned as $player){ - $this->despawnFrom($player); - } + NetworkBroadcastUtils::broadcastEntityEvent( + $this->hasSpawned, + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onEntityRemoved($recipients, $this) + ); + $this->hasSpawned = []; } /** @@ -1624,9 +1628,7 @@ abstract class Entity{ $targets = $targets ?? $this->hasSpawned; $data = $data ?? $this->getAllNetworkData(); - foreach($targets as $p){ - $p->getNetworkSession()->syncActorData($this, $data); - } + NetworkBroadcastUtils::broadcastEntityEvent($targets, fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->syncActorData($recipients, $this, $data)); } /** diff --git a/src/entity/Human.php b/src/entity/Human.php index 5ede1abf8b..6957776130 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -47,6 +47,8 @@ use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\convert\TypeConverter; +use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddPlayerPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayerSkinPacket; @@ -189,9 +191,10 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } public function emote(string $emoteId) : void{ - foreach($this->getViewers() as $player){ - $player->getNetworkSession()->onEmote($this, $emoteId); - } + NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onEmote($recipients, $this, $emoteId) + ); } public function getHungerManager() : HungerManager{ @@ -270,11 +273,10 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ $this->xpManager = new ExperienceManager($this); $this->inventory = new PlayerInventory($this); - $syncHeldItem = function() : void{ - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onMobMainHandItemChange($this); - } - }; + $syncHeldItem = fn() => NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobMainHandItemChange($recipients, $this) + ); $this->inventory->getListeners()->add(new CallbackInventoryListener( function(Inventory $unused, int $slot, Item $unused2) use ($syncHeldItem) : void{ if($slot === $this->inventory->getHeldItemIndex()){ @@ -315,11 +317,10 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ if($offHand !== null){ $this->offHandInventory->setItem(0, Item::nbtDeserialize($offHand)); } - $this->offHandInventory->getListeners()->add(CallbackInventoryListener::onAnyChange(function() : void{ - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onMobOffHandItemChange($this); - } - })); + $this->offHandInventory->getListeners()->add(CallbackInventoryListener::onAnyChange(fn() => NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobOffHandItemChange($recipients, $this) + ))); $enderChestInventoryTag = $nbt->getListTag(self::TAG_ENDER_CHEST_INVENTORY); if($enderChestInventoryTag !== null){ @@ -333,11 +334,10 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } $this->inventory->setHeldItemIndex($nbt->getInt(self::TAG_SELECTED_INVENTORY_SLOT, 0)); - $this->inventory->getHeldItemIndexChangeListeners()->add(function(int $oldIndex) : void{ - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onMobMainHandItemChange($this); - } - }); + $this->inventory->getHeldItemIndexChangeListeners()->add(fn() => NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobMainHandItemChange($recipients, $this) + )); $this->hungerManager->setFood((float) $nbt->getInt(self::TAG_FOOD_LEVEL, (int) $this->hungerManager->getFood())); $this->hungerManager->setExhaustion($nbt->getFloat(self::TAG_FOOD_EXHAUSTION_LEVEL, $this->hungerManager->getExhaustion())); @@ -490,11 +490,12 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } protected function sendSpawnPacket(Player $player) : void{ + $networkSession = $player->getNetworkSession(); if(!($this instanceof Player)){ - $player->getNetworkSession()->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), SkinAdapterSingleton::get()->toSkinData($this->skin))])); + $networkSession->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), SkinAdapterSingleton::get()->toSkinData($this->skin))])); } - $player->getNetworkSession()->sendDataPacket(AddPlayerPacket::create( + $networkSession->sendDataPacket(AddPlayerPacket::create( $this->getUniqueId(), $this->getName(), $this->getId(), @@ -524,11 +525,12 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ //TODO: Hack for MCPE 1.2.13: DATA_NAMETAG is useless in AddPlayerPacket, so it has to be sent separately $this->sendData([$player], [EntityMetadataProperties::NAMETAG => new StringMetadataProperty($this->getNameTag())]); - $player->getNetworkSession()->onMobArmorChange($this); - $player->getNetworkSession()->onMobOffHandItemChange($this); + $entityEventBroadcaster = $networkSession->getEntityEventBroadcaster(); + $entityEventBroadcaster->onMobArmorChange([$networkSession], $this); + $entityEventBroadcaster->onMobOffHandItemChange([$networkSession], $this); if(!($this instanceof Player)){ - $player->getNetworkSession()->sendDataPacket(PlayerListPacket::remove([PlayerListEntry::createRemovalEntry($this->uuid)])); + $networkSession->sendDataPacket(PlayerListPacket::remove([PlayerListEntry::createRemovalEntry($this->uuid)])); } } diff --git a/src/entity/Living.php b/src/entity/Living.php index 86457321e4..ab84ec1caa 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -50,6 +50,8 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\FloatTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\ShortTag; +use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataFlags; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; @@ -143,13 +145,10 @@ abstract class Living extends Entity{ $this->armorInventory = new ArmorInventory($this); //TODO: load/save armor inventory contents - $this->armorInventory->getListeners()->add(CallbackInventoryListener::onAnyChange( - function(Inventory $unused) : void{ - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onMobArmorChange($this); - } - } - )); + $this->armorInventory->getListeners()->add(CallbackInventoryListener::onAnyChange(fn() => NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobArmorChange($recipients, $this) + ))); $health = $this->getMaxHealth(); @@ -850,7 +849,8 @@ abstract class Living extends Entity{ protected function sendSpawnPacket(Player $player) : void{ parent::sendSpawnPacket($player); - $player->getNetworkSession()->onMobArmorChange($this); + $networkSession = $player->getNetworkSession(); + $networkSession->getEntityEventBroadcaster()->onMobArmorChange([$networkSession], $this); } protected function syncNetworkData(EntityMetadataCollection $properties) : void{ diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 08dea06591..109b0629cf 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -35,6 +35,8 @@ use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\convert\TypeConverter; +use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddItemActorPacket; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; @@ -328,9 +330,10 @@ class ItemEntity extends Entity{ return; } - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onPlayerPickUpItem($player, $this); - } + NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onPickUpItem($recipients, $player, $this) + ); $inventory = $ev->getInventory(); if($inventory !== null){ diff --git a/src/entity/projectile/Arrow.php b/src/entity/projectile/Arrow.php index 0d284d496d..92e7f91c3a 100644 --- a/src/entity/projectile/Arrow.php +++ b/src/entity/projectile/Arrow.php @@ -33,6 +33,8 @@ use pocketmine\event\entity\ProjectileHitEvent; use pocketmine\item\VanillaItems; use pocketmine\math\RayTraceResult; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataFlags; @@ -196,9 +198,10 @@ class Arrow extends Projectile{ return; } - foreach($this->getViewers() as $viewer){ - $viewer->getNetworkSession()->onPlayerPickUpItem($player, $this); - } + NetworkBroadcastUtils::broadcastEntityEvent( + $this->getViewers(), + fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onPickUpItem($recipients, $player, $this) + ); $ev->getInventory()?->addItem($ev->getItem()); $this->flagForDespawn(); diff --git a/src/network/mcpe/EntityEventBroadcaster.php b/src/network/mcpe/EntityEventBroadcaster.php new file mode 100644 index 0000000000..252563149c --- /dev/null +++ b/src/network/mcpe/EntityEventBroadcaster.php @@ -0,0 +1,93 @@ + $properties + */ + public function syncActorData(array $recipients, Entity $entity, array $properties) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onEntityEffectAdded(array $recipients, Living $entity, EffectInstance $effect, bool $replacesOldEffect) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onEntityEffectRemoved(array $recipients, Living $entity, EffectInstance $effect) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onEntityRemoved(array $recipients, Entity $entity) : void; + + /** + * TODO: expand this to more than just humans + * + * @param NetworkSession[] $recipients + */ + public function onMobMainHandItemChange(array $recipients,Human $mob) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onMobOffHandItemChange(array $recipients, Human $mob) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onMobArmorChange(array $recipients, Living $mob) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onPickUpItem(array $recipients, Entity $collector, Entity $pickedUp) : void; + + /** + * @param NetworkSession[] $recipients + */ + public function onEmote(array $recipients, Human $from, string $emoteId) : void; +} diff --git a/src/network/mcpe/NetworkBroadcastUtils.php b/src/network/mcpe/NetworkBroadcastUtils.php new file mode 100644 index 0000000000..3a02534504 --- /dev/null +++ b/src/network/mcpe/NetworkBroadcastUtils.php @@ -0,0 +1,54 @@ +) : void $callback + */ + public static function broadcastEntityEvent(array $recipients, \Closure $callback) : void{ + $uniqueBroadcasters = []; + $broadcasterTargets = []; + + foreach($recipients as $recipient){ + $session = $recipient->getNetworkSession(); + $broadcaster = $session->getEntityEventBroadcaster(); + $uniqueBroadcasters[spl_object_id($broadcaster)] = $broadcaster; + $broadcasterTargets[spl_object_id($broadcaster)][spl_object_id($session)] = $session; + } + + foreach($uniqueBroadcasters as $k => $broadcaster){ + $callback($broadcaster, $broadcasterTargets[$k]); + } + } +} diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 56b0622d8b..e0b1e07ec8 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -23,12 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use pocketmine\data\bedrock\EffectIdMap; -use pocketmine\entity\Attribute; use pocketmine\entity\effect\EffectInstance; -use pocketmine\entity\Entity; -use pocketmine\entity\Human; -use pocketmine\entity\Living; use pocketmine\event\player\PlayerDuplicateLoginEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; @@ -61,10 +56,6 @@ use pocketmine\network\mcpe\protocol\AvailableCommandsPacket; use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\DisconnectPacket; -use pocketmine\network\mcpe\protocol\EmotePacket; -use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket; -use pocketmine\network\mcpe\protocol\MobEffectPacket; -use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\NetworkChunkPublisherUpdatePacket; @@ -73,19 +64,16 @@ use pocketmine\network\mcpe\protocol\PacketDecodeException; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayStatusPacket; -use pocketmine\network\mcpe\protocol\RemoveActorPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket; -use pocketmine\network\mcpe\protocol\SetActorDataPacket; use pocketmine\network\mcpe\protocol\SetDifficultyPacket; use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; use pocketmine\network\mcpe\protocol\SetSpawnPositionPacket; use pocketmine\network\mcpe\protocol\SetTimePacket; use pocketmine\network\mcpe\protocol\SetTitlePacket; -use pocketmine\network\mcpe\protocol\TakeItemActorPacket; use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\ToastRequestPacket; use pocketmine\network\mcpe\protocol\TransferPacket; @@ -97,16 +85,10 @@ use pocketmine\network\mcpe\protocol\types\command\CommandEnum; use pocketmine\network\mcpe\protocol\types\command\CommandParameter; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; use pocketmine\network\mcpe\protocol\types\DimensionIds; -use pocketmine\network\mcpe\protocol\types\entity\Attribute as NetworkAttribute; -use pocketmine\network\mcpe\protocol\types\entity\MetadataProperty; -use pocketmine\network\mcpe\protocol\types\entity\PropertySyncData; -use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; -use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\network\mcpe\protocol\UpdateAdventureSettingsPacket; -use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use pocketmine\network\NetworkSessionManager; use pocketmine\network\PacketHandlingException; use pocketmine\permission\DefaultPermissionNames; @@ -134,7 +116,6 @@ use function hrtime; use function in_array; use function intdiv; use function json_encode; -use function ksort; use function min; use function strcasecmp; use function strlen; @@ -143,7 +124,6 @@ use function substr; use function time; use function ucfirst; use const JSON_THROW_ON_ERROR; -use const SORT_NUMERIC; class NetworkSession{ private const INCOMING_PACKET_BATCH_PER_TICK = 2; //usually max 1 per tick, but transactions may arrive separately @@ -202,6 +182,7 @@ class NetworkSession{ private PacketSerializerContext $packetSerializerContext, private PacketSender $sender, private PacketBroadcaster $broadcaster, + private EntityEventBroadcaster $entityEventBroadcaster, private Compressor $compressor, private string $ip, private int $port @@ -223,6 +204,7 @@ class NetworkSession{ $this->manager->add($this); $this->logger->info("Session opened"); + $this->entityEventBroadcaster = $entityEventBroadcaster; } private function getLogPrefix() : string{ @@ -273,10 +255,10 @@ class NetworkSession{ $effectManager = $this->player->getEffects(); $effectManager->getEffectAddHooks()->add($effectAddHook = function(EffectInstance $effect, bool $replacesOldEffect) : void{ - $this->onEntityEffectAdded($this->player, $effect, $replacesOldEffect); + $this->entityEventBroadcaster->onEntityEffectAdded([$this], $this->player, $effect, $replacesOldEffect); }); $effectManager->getEffectRemoveHooks()->add($effectRemoveHook = function(EffectInstance $effect) : void{ - $this->onEntityEffectRemoved($this->player, $effect); + $this->entityEventBroadcaster->onEntityEffectRemoved([$this], $this->player, $effect); }); $this->disposeHooks->add(static function() use ($effectManager, $effectAddHook, $effectRemoveHook) : void{ $effectManager->getEffectAddHooks()->remove($effectAddHook); @@ -547,6 +529,8 @@ class NetworkSession{ public function getBroadcaster() : PacketBroadcaster{ return $this->broadcaster; } + public function getEntityEventBroadcaster() : EntityEventBroadcaster{ return $this->entityEventBroadcaster; } + public function getCompressor() : Compressor{ return $this->compressor; } @@ -817,7 +801,7 @@ class NetworkSession{ } public function onServerRespawn() : void{ - $this->syncAttributes($this->player, $this->player->getAttributeMap()->getAll()); + $this->entityEventBroadcaster->syncAttributes([$this], $this->player, $this->player->getAttributeMap()->getAll()); $this->player->sendData(null); $this->syncAbilities($this->player); @@ -926,41 +910,6 @@ class NetworkSession{ )); } - /** - * @param Attribute[] $attributes - */ - public function syncAttributes(Living $entity, array $attributes) : void{ - if(count($attributes) > 0){ - $this->sendDataPacket(UpdateAttributesPacket::create($entity->getId(), array_map(function(Attribute $attr) : NetworkAttribute{ - return new NetworkAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getDefaultValue(), []); - }, $attributes), 0)); - } - } - - /** - * @param MetadataProperty[] $properties - * @phpstan-param array $properties - */ - public function syncActorData(Entity $entity, array $properties) : void{ - //TODO: HACK! as of 1.18.10, the client responds differently to the same data ordered in different orders - for - //example, sending HEIGHT in the list before FLAGS when unsetting the SWIMMING flag results in a hitbox glitch - ksort($properties, SORT_NUMERIC); - $this->sendDataPacket(SetActorDataPacket::create($entity->getId(), $properties, new PropertySyncData([], []), 0)); - } - - public function onEntityEffectAdded(Living $entity, EffectInstance $effect, bool $replacesOldEffect) : void{ - //TODO: we may need yet another effect <=> ID map in the future depending on protocol changes - $this->sendDataPacket(MobEffectPacket::add($entity->getId(), $replacesOldEffect, EffectIdMap::getInstance()->toId($effect->getType()), $effect->getAmplifier(), $effect->isVisible(), $effect->getDuration())); - } - - public function onEntityEffectRemoved(Living $entity, EffectInstance $effect) : void{ - $this->sendDataPacket(MobEffectPacket::remove($entity->getId(), EffectIdMap::getInstance()->toId($effect->getType()))); - } - - public function onEntityRemoved(Entity $entity) : void{ - $this->sendDataPacket(RemoveActorPacket::create($entity->getId())); - } - public function syncAvailableCommands() : void{ $commandData = []; foreach($this->server->getCommandMap()->getCommands() as $name => $command){ @@ -1096,36 +1045,6 @@ class NetworkSession{ return $this->invManager; } - /** - * TODO: expand this to more than just humans - */ - public function onMobMainHandItemChange(Human $mob) : void{ - //TODO: we could send zero for slot here because remote players don't need to know which slot was selected - $inv = $mob->getInventory(); - $this->sendDataPacket(MobEquipmentPacket::create($mob->getId(), ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItemInHand())), $inv->getHeldItemIndex(), $inv->getHeldItemIndex(), ContainerIds::INVENTORY)); - } - - public function onMobOffHandItemChange(Human $mob) : void{ - $inv = $mob->getOffHandInventory(); - $this->sendDataPacket(MobEquipmentPacket::create($mob->getId(), ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItem(0))), 0, 0, ContainerIds::OFFHAND)); - } - - public function onMobArmorChange(Living $mob) : void{ - $inv = $mob->getArmorInventory(); - $converter = TypeConverter::getInstance(); - $this->sendDataPacket(MobArmorEquipmentPacket::create( - $mob->getId(), - ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getHelmet())), - ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getChestplate())), - ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getLeggings())), - ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getBoots())) - )); - } - - public function onPlayerPickUpItem(Player $collector, Entity $pickedUp) : void{ - $this->sendDataPacket(TakeItemActorPacket::create($collector->getId(), $pickedUp->getId())); - } - /** * @param Player[] $players */ @@ -1169,10 +1088,6 @@ class NetworkSession{ $this->sendDataPacket(SetTitlePacket::setAnimationTimes($fadeIn, $stay, $fadeOut)); } - public function onEmote(Human $from, string $emoteId) : void{ - $this->sendDataPacket(EmotePacket::create($from->getId(), $emoteId, EmotePacket::FLAG_SERVER)); - } - public function onToastNotification(string $title, string $body) : void{ $this->sendDataPacket(ToastRequestPacket::create($title, $body)); } @@ -1212,7 +1127,7 @@ class NetworkSession{ $this->player->doChunkRequests(); $dirtyAttributes = $this->player->getAttributeMap()->needSend(); - $this->syncAttributes($this->player, $dirtyAttributes); + $this->entityEventBroadcaster->syncAttributes([$this], $this->player, $dirtyAttributes); foreach($dirtyAttributes as $attribute){ //TODO: we might need to send these to other players in the future //if that happens, this will need to become more complex than a flag on the attribute itself diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php new file mode 100644 index 0000000000..da0fac6efb --- /dev/null +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -0,0 +1,143 @@ +broadcaster->broadcastPackets($recipients, [$packet]); + } + + public function syncAttributes(array $recipients, Living $entity, array $attributes) : void{ + if(count($attributes) > 0){ + $this->sendDataPacket($recipients, UpdateAttributesPacket::create( + $entity->getId(), + array_map(fn(Attribute $attr) => new NetworkAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getDefaultValue(), []), $attributes), + 0 + )); + } + } + + public function syncActorData(array $recipients, Entity $entity, array $properties) : void{ + //TODO: HACK! as of 1.18.10, the client responds differently to the same data ordered in different orders - for + //example, sending HEIGHT in the list before FLAGS when unsetting the SWIMMING flag results in a hitbox glitch + ksort($properties, SORT_NUMERIC); + $this->sendDataPacket($recipients, SetActorDataPacket::create($entity->getId(), $properties, new PropertySyncData([], []), 0)); + } + + public function onEntityEffectAdded(array $recipients, Living $entity, EffectInstance $effect, bool $replacesOldEffect) : void{ + //TODO: we may need yet another effect <=> ID map in the future depending on protocol changes + $this->sendDataPacket($recipients, MobEffectPacket::add( + $entity->getId(), + $replacesOldEffect, + EffectIdMap::getInstance()->toId($effect->getType()), + $effect->getAmplifier(), + $effect->isVisible(), + $effect->getDuration() + )); + } + + public function onEntityEffectRemoved(array $recipients, Living $entity, EffectInstance $effect) : void{ + $this->sendDataPacket($recipients, MobEffectPacket::remove($entity->getId(), EffectIdMap::getInstance()->toId($effect->getType()))); + } + + public function onEntityRemoved(array $recipients, Entity $entity) : void{ + $this->sendDataPacket($recipients, RemoveActorPacket::create($entity->getId())); + } + + public function onMobMainHandItemChange(array $recipients, Human $mob) : void{ + //TODO: we could send zero for slot here because remote players don't need to know which slot was selected + $inv = $mob->getInventory(); + $this->sendDataPacket($recipients, MobEquipmentPacket::create( + $mob->getId(), + ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItemInHand())), + $inv->getHeldItemIndex(), + $inv->getHeldItemIndex(), + ContainerIds::INVENTORY + )); + } + + public function onMobOffHandItemChange(array $recipients, Human $mob) : void{ + $inv = $mob->getOffHandInventory(); + $this->sendDataPacket($recipients, MobEquipmentPacket::create( + $mob->getId(), + ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItem(0))), + 0, + 0, + ContainerIds::OFFHAND + )); + } + + public function onMobArmorChange(array $recipients, Living $mob) : void{ + $inv = $mob->getArmorInventory(); + $converter = TypeConverter::getInstance(); + $this->sendDataPacket($recipients, MobArmorEquipmentPacket::create( + $mob->getId(), + ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getHelmet())), + ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getChestplate())), + ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getLeggings())), + ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getBoots())) + )); + } + + public function onPickUpItem(array $recipients, Entity $collector, Entity $pickedUp) : void{ + $this->sendDataPacket($recipients, TakeItemActorPacket::create($collector->getId(), $pickedUp->getId())); + } + + public function onEmote(array $recipients, Human $from, string $emoteId) : void{ + $this->sendDataPacket($recipients, EmotePacket::create($from->getId(), $emoteId, EmotePacket::FLAG_SERVER)); + } +} diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 04c51d3fb3..3eeecbb862 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -114,7 +114,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $this->session->sendDataPacket(StaticPacketCache::getInstance()->getBiomeDefs()); $this->session->getLogger()->debug("Sending attributes"); - $this->session->syncAttributes($this->player, $this->player->getAttributeMap()->getAll()); + $this->session->getEntityEventBroadcaster()->syncAttributes([$this->session], $this->player, $this->player->getAttributeMap()->getAll()); $this->session->getLogger()->debug("Sending available commands"); $this->session->syncAvailableCommands(); @@ -125,7 +125,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $this->session->getLogger()->debug("Sending effects"); foreach($this->player->getEffects()->all() as $effect){ - $this->session->onEntityEffectAdded($this->player, $effect, false); + $this->session->getEntityEventBroadcaster()->onEntityEffectAdded([$this->session], $this->player, $effect, false); } $this->session->getLogger()->debug("Sending actor metadata"); diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 1f7ae9767c..d588199386 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -25,14 +25,13 @@ namespace pocketmine\network\mcpe\raklib; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; +use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; -use pocketmine\network\mcpe\StandardPacketBroadcaster; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; @@ -80,13 +79,15 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private SleeperNotifier $sleeper; - private PacketBroadcaster $broadcaster; + private PacketBroadcaster $packetBroadcaster; + private EntityEventBroadcaster $entityEventBroadcaster; private PacketSerializerContext $packetSerializerContext; - public function __construct(Server $server, string $ip, int $port, bool $ipV6, PacketBroadcaster $packetBroadcaster, PacketSerializerContext $packetSerializerContext){ + public function __construct(Server $server, string $ip, int $port, bool $ipV6, PacketBroadcaster $packetBroadcaster, EntityEventBroadcaster $entityEventBroadcaster, PacketSerializerContext $packetSerializerContext){ $this->server = $server; - $this->broadcaster = $packetBroadcaster; + $this->packetBroadcaster = $packetBroadcaster; $this->packetSerializerContext = $packetSerializerContext; + $this->entityEventBroadcaster = $entityEventBroadcaster; $this->rakServerId = mt_rand(0, PHP_INT_MAX); @@ -172,7 +173,8 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ PacketPool::getInstance(), $this->packetSerializerContext, new RakLibPacketSender($sessionId, $this), - $this->broadcaster, + $this->packetBroadcaster, + $this->entityEventBroadcaster, ZlibCompressor::getInstance(), //TODO: this shouldn't be hardcoded, but we might need the RakNet protocol version to select it $address, $port diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 90ec78b196..8e28edaa51 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -490,11 +490,6 @@ parameters: count: 1 path: ../../../src/command/defaults/TimingsCommand.php - - - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 2 - path: ../../../src/console/ConsoleReader.php - - message: "#^Parameter \\#1 \\$path of static method pocketmine\\\\utils\\\\Filesystem\\:\\:cleanPath\\(\\) expects string, mixed given\\.$#" count: 1 @@ -650,21 +645,6 @@ parameters: count: 1 path: ../../../src/network/mcpe/NetworkSession.php - - - message: "#^Parameter \\#1 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\NetworkSession\\:\\:onEntityEffectAdded\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" - count: 1 - path: ../../../src/network/mcpe/NetworkSession.php - - - - message: "#^Parameter \\#1 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\NetworkSession\\:\\:onEntityEffectRemoved\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" - count: 1 - path: ../../../src/network/mcpe/NetworkSession.php - - - - message: "#^Parameter \\#1 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\NetworkSession\\:\\:syncAttributes\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" - count: 1 - path: ../../../src/network/mcpe/NetworkSession.php - - message: "#^Parameter \\#1 \\$for of method pocketmine\\\\network\\\\mcpe\\\\NetworkSession\\:\\:syncAbilities\\(\\) expects pocketmine\\\\player\\\\Player, pocketmine\\\\player\\\\Player\\|null given\\.$#" count: 2 @@ -685,6 +665,21 @@ parameters: count: 1 path: ../../../src/network/mcpe/NetworkSession.php + - + message: "#^Parameter \\#2 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\EntityEventBroadcaster\\:\\:onEntityEffectAdded\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" + count: 1 + path: ../../../src/network/mcpe/NetworkSession.php + + - + message: "#^Parameter \\#2 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\EntityEventBroadcaster\\:\\:onEntityEffectRemoved\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" + count: 1 + path: ../../../src/network/mcpe/NetworkSession.php + + - + message: "#^Parameter \\#2 \\$entity of method pocketmine\\\\network\\\\mcpe\\\\EntityEventBroadcaster\\:\\:syncAttributes\\(\\) expects pocketmine\\\\entity\\\\Living, pocketmine\\\\player\\\\Player\\|null given\\.$#" + count: 1 + path: ../../../src/network/mcpe/NetworkSession.php + - message: "#^Parameter \\#2 \\$player of class pocketmine\\\\network\\\\mcpe\\\\handler\\\\PreSpawnPacketHandler constructor expects pocketmine\\\\player\\\\Player, pocketmine\\\\player\\\\Player\\|null given\\.$#" count: 1 From e0fdbe6eb1b689e0d2e65503c78734582369b0d9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 20:46:42 +0000 Subject: [PATCH 0708/1858] make-release: don't automatically push this is rather obnoxious when attempting to push test releases to a fork. --- build/make-release.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build/make-release.php b/build/make-release.php index 4466e7b6f4..7a570eb357 100644 --- a/build/make-release.php +++ b/build/make-release.php @@ -38,7 +38,6 @@ use function is_string; use function max; use function preg_match; use function preg_replace; -use function sleep; use function sprintf; use function str_pad; use function strlen; @@ -160,9 +159,6 @@ function main() : void{ replaceVersion($versionInfoPath, $nextVer->getBaseVersion(), true, $channel); systemWrapper('git add "' . $versionInfoPath . '"', "failed to stage changes for post-release commit"); systemWrapper('git commit -m "' . $nextVer->getBaseVersion() . ' is next" --include "' . $versionInfoPath . '"', "failed to create post-release commit"); - echo "pushing changes in 5 seconds\n"; - sleep(5); - systemWrapper('git push origin HEAD ' . $currentVer->getBaseVersion(), "failed to push changes to remote"); } main(); From acebbeed1674c26cfc004146eabbeeeb1c63d06d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 20:59:36 +0000 Subject: [PATCH 0709/1858] Added version channels for update.pmmp.io --- .github/workflows/update-updater-api.yml | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index dc40d17e91..906278ef37 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -25,13 +25,25 @@ jobs: - name: Download new release information run: curl -f -L ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ steps.tag-name.outputs.TAG_NAME }}/build_info.json -o new_build_info.json - - name: Detect channel + - name: Detect channels id: channel - run: echo CHANNEL=$(jq -r '.channel' new_build_info.json) >> $GITHUB_OUTPUT - - - name: Copy release information run: | - cp new_build_info.json channels/${{ steps.channel.outputs.CHANNEL }}.json + CHANNEL=$(jq -r '.channel' new_build_info.json) + VERSION=${{ steps.tag-name.outputs.TAG_NAME }} + echo CHANNEL=$CHANNEL >> $GITHUB_OUTPUT + if [ "$CHANNEL" == "stable" ]; then + echo MAJOR=$(echo $VERSION | cut -d. -f1) >> $GITHUB_OUTPUT + echo MINOR=$(echo $VERSION | cut -d. -f1-2) >> $GITHUB_OUTPUT + else + echo MAJOR=$(echo $VERSION | cut -d. -f1)-$CHANNEL >> $GITHUB_OUTPUT + echo MINOR=$(echo $VERSION | cut -d. -f1-2)-$CHANNEL >> $GITHUB_OUTPUT + fi + + - name: Update channel info + run: | + cp new_build_info.json "channels/${{ steps.channel.outputs.CHANNEL }}.json" + cp new_build_info.json "channels/${{ steps.channel.outputs.MAJOR }}.json" + cp new_build_info.json "channels/${{ steps.channel.outputs.MINOR }}.json" rm new_build_info.json - name: Commit changes From a31e3331fd0b7dcd499d31030e685bdf7a1a8129 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 22:25:23 +0000 Subject: [PATCH 0710/1858] Move Server::broadcastPackets() to NetworkBroadcastUtils::broadcastPackets() this has no business being in Server, and it also doesn't need to be an instance method, since it never uses $this. --- src/Server.php | 41 +----------------- src/network/mcpe/NetworkBroadcastUtils.php | 49 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/Server.php b/src/Server.php index dbccda2da3..ee509696e8 100644 --- a/src/Server.php +++ b/src/Server.php @@ -43,7 +43,6 @@ use pocketmine\event\player\PlayerCreationEvent; use pocketmine\event\player\PlayerDataSaveEvent; use pocketmine\event\player\PlayerLoginEvent; use pocketmine\event\server\CommandEvent; -use pocketmine\event\server\DataPacketSendEvent; use pocketmine\event\server\QueryRegenerateEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Language; @@ -57,6 +56,7 @@ use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\encryption\EncryptionContext; use pocketmine\network\mcpe\EntityEventBroadcaster; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ClientboundPacket; @@ -1353,44 +1353,7 @@ class Server{ * @param ClientboundPacket[] $packets */ public function broadcastPackets(array $players, array $packets) : bool{ - if(count($packets) === 0){ - throw new \InvalidArgumentException("Cannot broadcast empty list of packets"); - } - - return Timings::$broadcastPackets->time(function() use ($players, $packets) : bool{ - /** @var NetworkSession[] $recipients */ - $recipients = []; - foreach($players as $player){ - if($player->isConnected()){ - $recipients[] = $player->getNetworkSession(); - } - } - if(count($recipients) === 0){ - return false; - } - - $ev = new DataPacketSendEvent($recipients, $packets); - $ev->call(); - if($ev->isCancelled()){ - return false; - } - $recipients = $ev->getTargets(); - - /** @var PacketBroadcaster[] $broadcasters */ - $broadcasters = []; - /** @var NetworkSession[][] $broadcasterTargets */ - $broadcasterTargets = []; - foreach($recipients as $recipient){ - $broadcaster = $recipient->getBroadcaster(); - $broadcasters[spl_object_id($broadcaster)] = $broadcaster; - $broadcasterTargets[spl_object_id($broadcaster)][] = $recipient; - } - foreach($broadcasters as $broadcaster){ - $broadcaster->broadcastPackets($broadcasterTargets[spl_object_id($broadcaster)], $packets); - } - - return true; - }); + return NetworkBroadcastUtils::broadcastPackets($players, $packets); } /** diff --git a/src/network/mcpe/NetworkBroadcastUtils.php b/src/network/mcpe/NetworkBroadcastUtils.php index 3a02534504..8d04d35c53 100644 --- a/src/network/mcpe/NetworkBroadcastUtils.php +++ b/src/network/mcpe/NetworkBroadcastUtils.php @@ -23,7 +23,11 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; +use pocketmine\event\server\DataPacketSendEvent; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\player\Player; +use pocketmine\timings\Timings; +use function count; use function spl_object_id; final class NetworkBroadcastUtils{ @@ -32,6 +36,51 @@ final class NetworkBroadcastUtils{ //NOOP } + /** + * @param Player[] $recipients + * @param ClientboundPacket[] $packets + */ + public static function broadcastPackets(array $recipients, array $packets) : bool{ + if(count($packets) === 0){ + throw new \InvalidArgumentException("Cannot broadcast empty list of packets"); + } + + return Timings::$broadcastPackets->time(function() use ($recipients, $packets) : bool{ + /** @var NetworkSession[] $sessions */ + $sessions = []; + foreach($recipients as $player){ + if($player->isConnected()){ + $sessions[] = $player->getNetworkSession(); + } + } + if(count($sessions) === 0){ + return false; + } + + $ev = new DataPacketSendEvent($sessions, $packets); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $sessions = $ev->getTargets(); + + /** @var PacketBroadcaster[] $uniqueBroadcasters */ + $uniqueBroadcasters = []; + /** @var NetworkSession[][] $broadcasterTargets */ + $broadcasterTargets = []; + foreach($sessions as $recipient){ + $broadcaster = $recipient->getBroadcaster(); + $uniqueBroadcasters[spl_object_id($broadcaster)] = $broadcaster; + $broadcasterTargets[spl_object_id($broadcaster)][spl_object_id($recipient)] = $recipient; + } + foreach($uniqueBroadcasters as $broadcaster){ + $broadcaster->broadcastPackets($broadcasterTargets[spl_object_id($broadcaster)], $packets); + } + + return true; + }); + } + /** * @param Player[] $recipients * @phpstan-param \Closure(EntityEventBroadcaster, array) : void $callback From 337a2547682cdcb0dc36f212ebe3b8fe9f66ae83 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 22:28:51 +0000 Subject: [PATCH 0711/1858] Use NetworkBroadcastUtils for broadcasting packets this eradicates all but 4 usages of Server in Entity, which is extremely cool. --- src/Server.php | 1 + src/entity/Entity.php | 8 ++++---- src/entity/Human.php | 2 +- src/world/World.php | 7 ++++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Server.php b/src/Server.php index ee509696e8..a81b1d74b3 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1351,6 +1351,7 @@ class Server{ /** * @param Player[] $players * @param ClientboundPacket[] $packets + * @deprecated */ public function broadcastPackets(array $players, array $packets) : bool{ return NetworkBroadcastUtils::broadcastPackets($players, $packets); diff --git a/src/entity/Entity.php b/src/entity/Entity.php index c206b81d3a..c60f2c1c48 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -787,7 +787,7 @@ abstract class Entity{ $this->spawnTo($player); } }else{ - $this->server->broadcastPackets($this->hasSpawned, [MoveActorAbsolutePacket::create( + NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [MoveActorAbsolutePacket::create( $this->id, $this->getOffsetPosition($this->location), $this->location->pitch, @@ -802,7 +802,7 @@ abstract class Entity{ } protected function broadcastMotion() : void{ - $this->server->broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion())]); + NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion())]); } public function getGravity() : float{ @@ -1682,7 +1682,7 @@ abstract class Entity{ * @param Player[]|null $targets */ public function broadcastAnimation(Animation $animation, ?array $targets = null) : void{ - $this->server->broadcastPackets($targets ?? $this->getViewers(), $animation->encode()); + NetworkBroadcastUtils::broadcastPackets($targets ?? $this->getViewers(), $animation->encode()); } /** @@ -1691,7 +1691,7 @@ abstract class Entity{ */ public function broadcastSound(Sound $sound, ?array $targets = null) : void{ if(!$this->silent){ - $this->server->broadcastPackets($targets ?? $this->getViewers(), $sound->encode($this->location)); + NetworkBroadcastUtils::broadcastPackets($targets ?? $this->getViewers(), $sound->encode($this->location)); } } diff --git a/src/entity/Human.php b/src/entity/Human.php index 6957776130..cdbd70bd7d 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -176,7 +176,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ * @param Player[]|null $targets */ public function sendSkin(?array $targets = null) : void{ - $this->server->broadcastPackets($targets ?? $this->hasSpawned, [ + NetworkBroadcastUtils::broadcastPackets($targets ?? $this->hasSpawned, [ PlayerSkinPacket::create($this->getUniqueId(), "", "", SkinAdapterSingleton::get()->toSkinData($this->skin)) ]); } diff --git a/src/world/World.php b/src/world/World.php index cd134f577e..34cc33bd73 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -65,6 +65,7 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\BlockActorDataPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; @@ -685,7 +686,7 @@ class World implements ChunkManager{ $this->broadcastPacketToViewers($pos, $e); } }else{ - $this->server->broadcastPackets($this->filterViewersForPosition($pos, $players), $pk); + NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $players), $pk); } } } @@ -711,7 +712,7 @@ class World implements ChunkManager{ $this->broadcastPacketToViewers($pos, $e); } }else{ - $this->server->broadcastPackets($this->filterViewersForPosition($pos, $ev->getRecipients()), $pk); + NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $ev->getRecipients()), $pk); } } } @@ -1021,7 +1022,7 @@ class World implements ChunkManager{ World::getXZ($index, $chunkX, $chunkZ); $chunkPlayers = $this->getChunkPlayers($chunkX, $chunkZ); if(count($chunkPlayers) > 0){ - $this->server->broadcastPackets($chunkPlayers, $entries); + NetworkBroadcastUtils::broadcastPackets($chunkPlayers, $entries); } } From 08ee825d9183c0492e5ba20e2655eb17e15778e7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 22:41:19 +0000 Subject: [PATCH 0712/1858] StandardPacketBroadcaster: Include varint length prefix in length calculation varints encode 7 bits per byte, so a log with base 128 will tell us how many bytes are required to encode the length of the packet. --- src/network/mcpe/StandardPacketBroadcaster.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index f83cff64df..1ed0f16aee 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -30,6 +30,7 @@ use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\BinaryStream; use function count; +use function log; use function spl_object_id; use function strlen; @@ -60,7 +61,8 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $packetBuffers = []; foreach($packets as $packet){ $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder($this->protocolContext), $packet); - $totalLength += strlen($buffer); + //varint length prefix + packet buffer + $totalLength += (((int) log(strlen($buffer), 128)) + 1) + strlen($buffer); $packetBuffers[] = $buffer; } From 183d1f40389abf369ce164b974b7ede78700c9c3 Mon Sep 17 00:00:00 2001 From: Armen Deroian Date: Wed, 15 Mar 2023 18:47:19 -0400 Subject: [PATCH 0713/1858] Implement DataPacketPreReceiveEvent (#5559) closes #5554 This is called just before the packet is decoded, allowing the event to be used to drop packets from clients without wasting CPU time decoding them. This can be particularly useful for mitigating denial-of-service attacks. --- .../server/DataPacketPreReceiveEvent.php | 54 +++++++++++++++++++ src/network/mcpe/NetworkSession.php | 7 +++ 2 files changed, 61 insertions(+) create mode 100644 src/event/server/DataPacketPreReceiveEvent.php diff --git a/src/event/server/DataPacketPreReceiveEvent.php b/src/event/server/DataPacketPreReceiveEvent.php new file mode 100644 index 0000000000..8369fa2579 --- /dev/null +++ b/src/event/server/DataPacketPreReceiveEvent.php @@ -0,0 +1,54 @@ +origin; + } + + public function getPacketId() : int{ + return $this->packetId; + } + + public function getPacketBuffer() : string{ + return $this->packetBuffer; + } +} diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index e0b1e07ec8..de7d4436f4 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\entity\effect\EffectInstance; use pocketmine\event\player\PlayerDuplicateLoginEvent; +use pocketmine\event\server\DataPacketPreReceiveEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\form\Form; @@ -412,6 +413,12 @@ class NetworkSession{ $timings->startTiming(); try{ + $ev = new DataPacketPreReceiveEvent($this, $packet->pid(), $buffer); + $ev->call(); + if($ev->isCancelled()){ + return; + } + $decodeTimings = Timings::getDecodeDataPacketTimings($packet); $decodeTimings->startTiming(); try{ From 941fd03998b53e22126d5183d59aeee104dc7a22 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 15 Mar 2023 22:58:10 +0000 Subject: [PATCH 0714/1858] Remove useless code --- src/network/mcpe/NetworkSession.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index de7d4436f4..4c96ea1eae 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -205,7 +205,6 @@ class NetworkSession{ $this->manager->add($this); $this->logger->info("Session opened"); - $this->entityEventBroadcaster = $entityEventBroadcaster; } private function getLogPrefix() : string{ From 11ef6414b003098f88bdc42739c23419f639381c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 13:32:46 +0000 Subject: [PATCH 0715/1858] Server: remove deprecated method --- src/Server.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/Server.php b/src/Server.php index d2f4f4b797..0a246d0ccb 100644 --- a/src/Server.php +++ b/src/Server.php @@ -56,10 +56,8 @@ use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\encryption\EncryptionContext; use pocketmine\network\mcpe\EntityEventBroadcaster; -use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; -use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; @@ -1344,15 +1342,6 @@ class Server{ return count($recipients); } - /** - * @param Player[] $players - * @param ClientboundPacket[] $packets - * @deprecated - */ - public function broadcastPackets(array $players, array $packets) : bool{ - return NetworkBroadcastUtils::broadcastPackets($players, $packets); - } - /** * Broadcasts a list of packets in a batch to a list of players * From ec2b53f61adc7c2dc8af9442d72fcecbe4fc406c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 13:35:12 +0000 Subject: [PATCH 0716/1858] Remove unnecessary PacketBatch instantiations --- src/Server.php | 7 ++----- src/network/mcpe/NetworkSession.php | 2 +- src/network/mcpe/StandardPacketBroadcaster.php | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Server.php b/src/Server.php index 0a246d0ccb..5bda2976b2 100644 --- a/src/Server.php +++ b/src/Server.php @@ -59,7 +59,6 @@ use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ProtocolInfo; -use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\raklib\RakLibInterface; use pocketmine\network\mcpe\StandardEntityEventBroadcaster; @@ -1347,16 +1346,14 @@ class Server{ * * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). */ - public function prepareBatch(PacketBatch $stream, Compressor $compressor, ?bool $sync = null, ?TimingsHandler $timings = null) : CompressBatchPromise{ + public function prepareBatch(string $buffer, Compressor $compressor, ?bool $sync = null, ?TimingsHandler $timings = null) : CompressBatchPromise{ $timings ??= Timings::$playerNetworkSendCompress; try{ $timings->startTiming(); - $buffer = $stream->getBuffer(); - if($sync === null){ $threshold = $compressor->getCompressionThreshold(); - $sync = !$this->networkCompressionAsync || $threshold === null || strlen($stream->getBuffer()) < $threshold; + $sync = !$this->networkCompressionAsync || $threshold === null || strlen($buffer) < $threshold; } $promise = new CompressBatchPromise(); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 60c69f2b38..72c7f97fe3 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -523,7 +523,7 @@ class NetworkSession{ PacketBatch::encodeRaw($stream, $this->sendBuffer); if($this->enableCompression){ - $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode, Timings::$playerNetworkSendCompressSessionBuffer); + $promise = $this->server->prepareBatch($stream->getBuffer(), $this->compressor, $syncMode, Timings::$playerNetworkSendCompressSessionBuffer); }else{ $promise = new CompressBatchPromise(); $promise->resolve($stream->getBuffer()); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 1ed0f16aee..3aa7c535b8 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -76,7 +76,7 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ PacketBatch::encodeRaw($stream, $packetBuffers); $batchBuffer = $stream->getBuffer(); - $promise = $this->server->prepareBatch(new PacketBatch($batchBuffer), $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); + $promise = $this->server->prepareBatch($batchBuffer, $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); foreach($compressorTargets as $target){ $target->queueCompressed($promise); } From ef45180b805196fc0ca6bb1a1f0646816c8c672d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 13:40:37 +0000 Subject: [PATCH 0717/1858] Rename DataPacketPreReceiveEvent -> DataPacketDecodeEvent thank you @IvanCraft623 for the suggestion --- ...ataPacketPreReceiveEvent.php => DataPacketDecodeEvent.php} | 2 +- src/network/mcpe/NetworkSession.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/event/server/{DataPacketPreReceiveEvent.php => DataPacketDecodeEvent.php} (94%) diff --git a/src/event/server/DataPacketPreReceiveEvent.php b/src/event/server/DataPacketDecodeEvent.php similarity index 94% rename from src/event/server/DataPacketPreReceiveEvent.php rename to src/event/server/DataPacketDecodeEvent.php index 8369fa2579..44aefbb916 100644 --- a/src/event/server/DataPacketPreReceiveEvent.php +++ b/src/event/server/DataPacketDecodeEvent.php @@ -31,7 +31,7 @@ use pocketmine\network\mcpe\NetworkSession; * Called before a packet is decoded and handled by the network session. * Cancelling this event will drop the packet without decoding it, minimizing wasted CPU time. */ -class DataPacketPreReceiveEvent extends ServerEvent implements Cancellable{ +class DataPacketDecodeEvent extends ServerEvent implements Cancellable{ use CancellableTrait; public function __construct( diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 4c96ea1eae..80f9928581 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -25,7 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\entity\effect\EffectInstance; use pocketmine\event\player\PlayerDuplicateLoginEvent; -use pocketmine\event\server\DataPacketPreReceiveEvent; +use pocketmine\event\server\DataPacketDecodeEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\form\Form; @@ -412,7 +412,7 @@ class NetworkSession{ $timings->startTiming(); try{ - $ev = new DataPacketPreReceiveEvent($this, $packet->pid(), $buffer); + $ev = new DataPacketDecodeEvent($this, $packet->pid(), $buffer); $ev->call(); if($ev->isCancelled()){ return; From 83945ff0a06144c7e2a7249024434a675603f7fc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 15:02:42 +0000 Subject: [PATCH 0718/1858] Do not update release channels if the new build has a lower version ID this prevents stuff like 5.0.0 beta versions getting overwritten by 4.x beta versions. --- .github/workflows/update-updater-api.yml | 39 ++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index 906278ef37..c8f73ea150 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -41,9 +41,42 @@ jobs: - name: Update channel info run: | - cp new_build_info.json "channels/${{ steps.channel.outputs.CHANNEL }}.json" - cp new_build_info.json "channels/${{ steps.channel.outputs.MAJOR }}.json" - cp new_build_info.json "channels/${{ steps.channel.outputs.MINOR }}.json" + function version_id() { + major=$(echo $1 | cut -d. -f1) + minor=$(echo $1 | cut -d. -f2) + patch=$(echo $1 | cut -d. -f3) + echo $(((major * 1000000) + (minor * 1000) + patch)) + } + + function update_channel() { + local target_file_name="$1" + local new_file_name="$2" + + local old_version_id + local new_version_id + + if [ ! -f "$target_file_name" ]; then + echo "Creating channel file: $target_file_name" + cp "$new_file_name" "$target_file_name" + else + old_version_id=$(version_id "$(jq -r '.base_version' "$target_file_name")") + new_version_id=$(version_id "$(jq -r '.base_version' "$new_file_name")") + + echo "Old version ID: $old_version_id" + echo "New version ID: $new_version_id" + + if [ $new_version_id -ge $old_version_id ]; then #suffixed versions will have the same version ID - assume they'll always be newer + echo "Updating channel file: $target_file_name ($old_version_id -> $new_version_id)" + cp "$new_file_name" "$target_file_name" + else + echo "Version $new_version_id is less than $old_version_id, not updating channel file: $target_file_name" + fi + fi + } + + update_channel "channels/${{ steps.channel.outputs.CHANNEL }}.json" "new_build_info.json" + update_channel "channels/${{ steps.channel.outputs.MAJOR }}.json" "new_build_info.json" + update_channel "channels/${{ steps.channel.outputs.MINOR }}.json" "new_build_info.json" rm new_build_info.json - name: Commit changes From 9caed104882cba0a26cacbc95f612251595c2264 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 15:03:14 +0000 Subject: [PATCH 0719/1858] update-updater-api: use github.repository_owner to make fork testing of this workflow less obnoxious --- .github/workflows/update-updater-api.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index c8f73ea150..d3a4001360 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v3 with: - repository: pmmp/update.pmmp.io + repository: ${{ github.repository_owner }}/update.pmmp.io ssh-key: ${{ secrets.UPDATE_PMMP_IO_DEPLOY_KEY }} - name: Get actual tag name From bd21feffc41e984719a7ade06e3756d5c05b1d38 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 21:45:18 +0000 Subject: [PATCH 0720/1858] Release 4.18.0-ALPHA1 --- changelogs/4.18-alpha.md | 45 ++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +++--- 2 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.18-alpha.md diff --git a/changelogs/4.18-alpha.md b/changelogs/4.18-alpha.md new file mode 100644 index 0000000000..d2c5998fc9 --- /dev/null +++ b/changelogs/4.18-alpha.md @@ -0,0 +1,45 @@ +**For Minecraft: Bedrock Edition 1.19.70** + +### Note about API versions +Plugins which don't touch the `pocketmine\network\mcpe` namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +### Alpha release warning +Alpha releases are **experimental**. Features introduced in these releases are subject to change or removal. + +APIs which existed **prior** to this version will continue to work as normal, so plugins which use them will continue to work. + +### Highlights +This version makes changes to the internal network system to improve server performance and reduce memory usage. + +While these changes don't affect non-internal API, they are still significant enough to warrant a new minor version, as they may break plugins which use the internal network API (not recommended). + +# 4.18.0-ALPHA1 +Released 16th March 2023. + +## General +- Improved server performance in congested areas of the world (lots of players and/or entities in the same area). + +## API +### `pocketmine\event\server` +- The following new classes have been added: + - `DataPacketDecodeEvent` - called before a packet is decoded by a `NetworkSession`; useful to mitigate DoS attacks if PocketMine-MP hasn't been patched against new bugs yet + +## Internals +- Introduced new system for broadcasting entity events to network sessions. + - This change improves performance when lots of players and/or entities are in the same area. + - New interface `EntityEventBroadcaster` and class `StandardEntityEventBroadcaster` have been added to implement this. + - All entity-specific `on*()` and `sync*()` methods have been removed from `NetworkSession` (BC break). + - `NetworkSession` now accepts an `EntityEventBroadcaster` instance in its constructor. + - `NetworkBroadcastUtils::broadcastEntityEvent()` can be used to efficiently broadcast events to unique broadcasters shared by several network sessions. +- All network sessions now share the same `PacketSerializerContext` and `PacketBroadcaster` by default. + - Previously, every session had its own context, meaning that broadcast optimisations were not used, causing significant performance losses compared to 3.x. + - This change improves performance in congested areas by allowing reuse of previously encoded packet buffers for all sessions sharing the same context. + - Packet broadcasts are automatically encoded separately per unique `PacketSerializerContext` instance. This allows, for example, a multi-version fork to have a separate context for each protocol version, to ensure maximum broadcast efficiency while encoding different packets for different versions. + - `PacketSerializerContext` is now passed in `NetworkSession::__construct()`, instead of being created by the session. +- `StandardPacketBroadcaster` is now locked to a single `PacketSerializer` context, reducing complexity. +- Introduced `NetworkBroadcastUtils::broadcastPackets()`, replacing `Server->broadcastPackets()`. +- `Server->broadcastPackets()` has been deprecated. It will be removed in a future version. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 880fda6981..cecefa7d7b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.17.1"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "stable"; + public const BASE_VERSION = "4.18.0-ALPHA1"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "alpha"; private function __construct(){ //NOOP From 765aef0810900ac7eadb9b0691b4bddb03da0f43 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Mar 2023 21:45:21 +0000 Subject: [PATCH 0721/1858] 4.18.0-ALPHA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index cecefa7d7b..b99f51fc9d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.0-ALPHA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.0-ALPHA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 2135776c19f964161f1ad8acfd605f45f0da99fc Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 17 Mar 2023 16:21:57 +0000 Subject: [PATCH 0722/1858] readme: goodbye docker hub, won't miss you [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1075f1aa7..d4a9620708 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## Getting started - [Documentation](http://pmmp.readthedocs.org/) - [Installation instructions](https://pmmp.readthedocs.io/en/rtfd/installation.html) -- [Docker image](https://hub.docker.com/r/pmmp/pocketmine-mp) +- [Docker image](https://github.com/pmmp/PocketMine-MP/pkgs/container/pocketmine-mp) - [Plugin repository](https://poggit.pmmp.io/plugins) ## Discussion/Help From 471625e697f1f1fc85154a8a33c3f8c50e33c9b5 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 17 Mar 2023 16:24:13 +0000 Subject: [PATCH 0723/1858] readme: remove docker hub shield sadly there isn't any ghcr replacement right now. [ci skip] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index d4a9620708..f91fdd31d6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@

CI GitHub release (latest SemVer) - Docker image version (latest semver) Discord
GitHub all releases From 2177d8d35274c998486448fb17446e419aa6fe0d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Mar 2023 16:30:37 +0000 Subject: [PATCH 0724/1858] Push Docker image tags to ghcr.io --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7ff0925dff..4a4b0d35af 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -52,7 +52,7 @@ jobs: context: ./pocketmine-mp tags: | ${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }} -# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }} + ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }} build-args: | PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }} PMMP_REPO=${{ github.repository }} @@ -65,7 +65,7 @@ jobs: context: ./pocketmine-mp tags: | ${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }} -# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }} + ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }} build-args: | PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }} PMMP_REPO=${{ github.repository }} @@ -78,7 +78,7 @@ jobs: context: ./pocketmine-mp tags: | ${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }} -# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }} + ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }} build-args: | PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }} PMMP_REPO=${{ github.repository }} @@ -91,7 +91,7 @@ jobs: context: ./pocketmine-mp tags: | ${{ steps.docker-repo-name.outputs.NAME }}:latest -# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:latest + ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:latest build-args: | PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }} PMMP_REPO=${{ github.repository }} From 195bc3b62327806069fa0f6aad227af6a46bf1b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 18 Mar 2023 21:53:17 +0000 Subject: [PATCH 0725/1858] NetworkSession: prevent dev client asserts from missing ability flags --- src/network/mcpe/NetworkSession.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 2e3b5b8dac..071c754b7f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -904,6 +904,7 @@ class NetworkSession{ AbilitiesLayer::ABILITY_OPEN_CONTAINERS => !$for->isSpectator(), AbilitiesLayer::ABILITY_ATTACK_PLAYERS => !$for->isSpectator(), AbilitiesLayer::ABILITY_ATTACK_MOBS => !$for->isSpectator(), + AbilitiesLayer::ABILITY_PRIVILEGED_BUILDER => false, ]; $this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData( From 9a969e21c7933ca8f8c9f6f755a23aaa90eb0881 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 18 Mar 2023 22:49:52 +0000 Subject: [PATCH 0726/1858] =?UTF-8?q?=C3=82NetworkSession:=20ensure=20onRe?= =?UTF-8?q?solve=20handler=20for=20CompressBatchPromise=20is=20covered=20b?= =?UTF-8?q?y=20network=20send=20timings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/mcpe/NetworkSession.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 80f9928581..d5ccc3d045 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -561,20 +561,25 @@ class NetworkSession{ $this->compressedQueue->enqueue($payload); $payload->onResolve(function(CompressBatchPromise $payload) : void{ if($this->connected && $this->compressedQueue->bottom() === $payload){ - $this->compressedQueue->dequeue(); //result unused - $this->sendEncoded($payload->getResult()); + Timings::$playerNetworkSend->startTiming(); + try{ + $this->compressedQueue->dequeue(); //result unused + $this->sendEncoded($payload->getResult()); - while(!$this->compressedQueue->isEmpty()){ - /** @var CompressBatchPromise $current */ - $current = $this->compressedQueue->bottom(); - if($current->hasResult()){ - $this->compressedQueue->dequeue(); + while(!$this->compressedQueue->isEmpty()){ + /** @var CompressBatchPromise $current */ + $current = $this->compressedQueue->bottom(); + if($current->hasResult()){ + $this->compressedQueue->dequeue(); - $this->sendEncoded($current->getResult()); - }else{ - //can't send any more queued until this one is ready - break; + $this->sendEncoded($current->getResult()); + }else{ + //can't send any more queued until this one is ready + break; + } } + }finally{ + Timings::$playerNetworkSend->stopTiming(); } } }); From 3d56bd267cb435a422c1573f64f625b57a217c61 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 18 Mar 2023 23:13:25 +0000 Subject: [PATCH 0727/1858] Timings: fixup network timer inheritance --- src/timings/Timings.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 1faab0ea17..2d2dbbb0fe 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -155,21 +155,22 @@ abstract class Timings{ self::$garbageCollector = new TimingsHandler("Garbage Collector", self::$memoryManager); self::$titleTick = new TimingsHandler("Console Title Tick"); - self::$playerNetworkSend = new TimingsHandler("Player Network Send"); + self::$connection = new TimingsHandler("Connection Handler"); + + self::$playerNetworkSend = new TimingsHandler("Player Network Send", self::$connection); self::$playerNetworkSendCompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression", self::$playerNetworkSend); self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress); self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress); self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend); - self::$playerNetworkReceive = new TimingsHandler("Player Network Receive"); + self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection); self::$playerNetworkReceiveDecompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceive); self::$playerNetworkReceiveDecrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decryption", self::$playerNetworkReceive); self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSend); self::$playerChunkOrder = new TimingsHandler("Player Order Chunks"); - self::$playerChunkSend = new TimingsHandler("Player Send Chunks"); - self::$connection = new TimingsHandler("Connection Handler"); + self::$playerChunkSend = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Chunks", self::$playerNetworkSend); self::$scheduler = new TimingsHandler("Scheduler"); self::$serverCommand = new TimingsHandler("Server Command"); self::$worldLoad = new TimingsHandler("World Load"); From eec53f9ae0c3300f751e8f3c2f0104adcf781ac5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 15:39:44 +0000 Subject: [PATCH 0728/1858] Timings: clean up timer names --- src/timings/Timings.php | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 2d2dbbb0fe..3bcaa67353 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -27,9 +27,7 @@ use pocketmine\block\tile\Tile; use pocketmine\entity\Entity; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; -use pocketmine\player\Player; use pocketmine\scheduler\TaskHandler; -use function dechex; abstract class Timings{ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; @@ -184,10 +182,10 @@ abstract class Timings{ self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load"); self::$syncPlayerDataSave = new TimingsHandler("Player Data Save"); - self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityMove"); + self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement"); self::$playerCheckNearEntities = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities"); - self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity"); - self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickTileEntity"); + self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick"); + self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick"); self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityBaseTick"); self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "livingEntityBaseTick"); @@ -195,8 +193,8 @@ abstract class Timings{ self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks"); self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks"); - self::$playerCommand = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "playerCommand"); - self::$craftingDataCacheRebuild = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "craftingDataCacheRebuild"); + self::$playerCommand = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Command"); + self::$craftingDataCacheRebuild = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Build CraftingDataPacket Cache"); } @@ -219,11 +217,7 @@ abstract class Timings{ public static function getEntityTimings(Entity $entity) : TimingsHandler{ $entityType = (new \ReflectionClass($entity))->getShortName(); if(!isset(self::$entityTypeTimingMap[$entityType])){ - if($entity instanceof Player){ - self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity - EntityPlayer", self::$tickEntity); - }else{ - self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity - " . $entityType, self::$tickEntity); - } + self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick - " . $entityType, self::$tickEntity); } return self::$entityTypeTimingMap[$entityType]; @@ -232,7 +226,7 @@ abstract class Timings{ public static function getTileEntityTimings(Tile $tile) : TimingsHandler{ $tileType = (new \ReflectionClass($tile))->getShortName(); if(!isset(self::$tileEntityTypeTimingMap[$tileType])){ - self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickTileEntity - " . $tileType, self::$tickTileEntity); + self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick - " . $tileType, self::$tickTileEntity); } return self::$tileEntityTypeTimingMap[$tileType]; @@ -241,7 +235,7 @@ abstract class Timings{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ - self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive); + self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Receive - " . $pk->getName(), self::$playerNetworkReceive); } return self::$packetReceiveTimingMap[$pid]; @@ -250,7 +244,7 @@ abstract class Timings{ public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetDecodeTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Decode - " . $pk->getName() . " [0x" . dechex($pid) . "]", + self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Decode - " . $pk->getName(), self::getReceiveDataPacketTimings($pk) ); } @@ -258,7 +252,7 @@ abstract class Timings{ public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetHandleTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Handler - " . $pk->getName() . " [0x" . dechex($pid) . "]", + self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Handler - " . $pk->getName(), self::getReceiveDataPacketTimings($pk) ); } @@ -266,7 +260,7 @@ abstract class Timings{ public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName() . " [0x" . dechex($pid) . "]", + self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName(), self::getSendDataPacketTimings($pk) ); } @@ -274,7 +268,7 @@ abstract class Timings{ public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ - self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkSend); + self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Send - " . $pk->getName(), self::$playerNetworkSend); } return self::$packetSendTimingMap[$pid]; From 607bdfa42f4724a136ba62014468571cfa2c4088 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 15:49:35 +0000 Subject: [PATCH 0729/1858] Timings: added new timers for entity move collision checks and projectile move ray tracing projectiles get their own distinct sub-timer, since the logic is completely different from regular entities. --- src/entity/Entity.php | 2 ++ src/entity/projectile/Projectile.php | 7 +++++-- src/timings/Timings.php | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index c60f2c1c48..c388a741ba 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1139,6 +1139,7 @@ abstract class Entity{ $this->blocksAround = null; Timings::$entityMove->startTiming(); + Timings::$entityMoveCollision->startTiming(); $wantedX = $dx; $wantedY = $dy; @@ -1223,6 +1224,7 @@ abstract class Entity{ $this->boundingBox = $moveBB; } + Timings::$entityMoveCollision->stopTiming(); $this->location = new Location( ($this->boundingBox->minX + $this->boundingBox->maxX) / 2, diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 68afabd08a..b04f8c61b0 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -175,7 +175,8 @@ abstract class Projectile extends Entity{ protected function move(float $dx, float $dy, float $dz) : void{ $this->blocksAround = null; - Timings::$entityMove->startTiming(); + Timings::$projectileMove->startTiming(); + Timings::$projectileMoveRayTrace->startTiming(); $start = $this->location->asVector3(); $end = $start->add($dx, $dy, $dz); @@ -221,6 +222,8 @@ abstract class Projectile extends Entity{ } } + Timings::$projectileMoveRayTrace->stopTiming(); + $this->location = Location::fromObject( $end, $this->location->world, @@ -268,7 +271,7 @@ abstract class Projectile extends Entity{ $this->getWorld()->onEntityMoved($this); $this->checkBlockIntersections(); - Timings::$entityMove->stopTiming(); + Timings::$projectileMove->stopTiming(); } /** diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 3bcaa67353..fa21dace46 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -89,6 +89,12 @@ abstract class Timings{ /** @var TimingsHandler */ public static $entityMove; + + public static TimingsHandler $entityMoveCollision; + + public static TimingsHandler $projectileMove; + public static TimingsHandler $projectileMoveRayTrace; + /** @var TimingsHandler */ public static $playerCheckNearEntities; /** @var TimingsHandler */ @@ -183,6 +189,11 @@ abstract class Timings{ self::$syncPlayerDataSave = new TimingsHandler("Player Data Save"); self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement"); + self::$entityMoveCollision = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement - Collision Checks", self::$entityMove); + + self::$projectileMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement", self::$entityMove); + self::$projectileMoveRayTrace = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement - Ray Tracing", self::$projectileMove); + self::$playerCheckNearEntities = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities"); self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick"); self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick"); From 7bc5d8c824d989eaaaa00d0a9c92355099e4fdfc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 15:57:36 +0000 Subject: [PATCH 0730/1858] Rename more timers --- src/timings/Timings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index fa21dace46..ad5be83f1a 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -198,8 +198,8 @@ abstract class Timings{ self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick"); self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick"); - self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityBaseTick"); - self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "livingEntityBaseTick"); + self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick"); + self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - Living"); self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks"); self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks"); From 054c06fab9fe5b050cc2b4802d1502233cfa335e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 15:59:06 +0000 Subject: [PATCH 0731/1858] Add specialized entityBaseTick timer for item entities since item merging is a potential hotspot, we want to know if this code section is a performance problem. Current timers only tell us whether overall ticking of a particular entity is slow, but that includes movement and therefore isn't particularly helpful. --- src/entity/object/ItemEntity.php | 83 +++++++++++++++++--------------- src/timings/Timings.php | 3 ++ 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 109b0629cf..d28d70773d 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -41,6 +41,7 @@ use pocketmine\network\mcpe\protocol\AddItemActorPacket; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\player\Player; +use pocketmine\timings\Timings; use function max; class ItemEntity extends Entity{ @@ -113,57 +114,63 @@ class ItemEntity extends Entity{ return false; } - $hasUpdate = parent::entityBaseTick($tickDiff); + Timings::$itemEntityBaseTick->startTiming(); + try{ - if($this->isFlaggedForDespawn()){ - return $hasUpdate; - } + $hasUpdate = parent::entityBaseTick($tickDiff); - if($this->pickupDelay !== self::NEVER_DESPAWN && $this->pickupDelay > 0){ //Infinite delay - $hasUpdate = true; - $this->pickupDelay -= $tickDiff; - if($this->pickupDelay < 0){ - $this->pickupDelay = 0; + if($this->isFlaggedForDespawn()){ + return $hasUpdate; } - } - if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ - $mergeable = [$this]; //in case the merge target ends up not being this - $mergeTarget = $this; - foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ - if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ - continue; + if($this->pickupDelay !== self::NEVER_DESPAWN && $this->pickupDelay > 0){ //Infinite delay + $hasUpdate = true; + $this->pickupDelay -= $tickDiff; + if($this->pickupDelay < 0){ + $this->pickupDelay = 0; } + } - if($entity->isMergeable($this)){ - $mergeable[] = $entity; - if($entity->item->getCount() > $mergeTarget->item->getCount()){ - $mergeTarget = $entity; + if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ + $mergeable = [$this]; //in case the merge target ends up not being this + $mergeTarget = $this; + foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ + if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ + continue; + } + + if($entity->isMergeable($this)){ + $mergeable[] = $entity; + if($entity->item->getCount() > $mergeTarget->item->getCount()){ + $mergeTarget = $entity; + } + } + } + foreach($mergeable as $itemEntity){ + if($itemEntity !== $mergeTarget){ + $itemEntity->tryMergeInto($mergeTarget); } } } - foreach($mergeable as $itemEntity){ - if($itemEntity !== $mergeTarget){ - $itemEntity->tryMergeInto($mergeTarget); + + if(!$this->isFlaggedForDespawn() && $this->despawnDelay !== self::NEVER_DESPAWN){ + $hasUpdate = true; + $this->despawnDelay -= $tickDiff; + if($this->despawnDelay <= 0){ + $ev = new ItemDespawnEvent($this); + $ev->call(); + if($ev->isCancelled()){ + $this->despawnDelay = self::DEFAULT_DESPAWN_DELAY; + }else{ + $this->flagForDespawn(); + } } } - } - if(!$this->isFlaggedForDespawn() && $this->despawnDelay !== self::NEVER_DESPAWN){ - $hasUpdate = true; - $this->despawnDelay -= $tickDiff; - if($this->despawnDelay <= 0){ - $ev = new ItemDespawnEvent($this); - $ev->call(); - if($ev->isCancelled()){ - $this->despawnDelay = self::DEFAULT_DESPAWN_DELAY; - }else{ - $this->flagForDespawn(); - } - } + return $hasUpdate; + }finally{ + Timings::$itemEntityBaseTick->stopTiming(); } - - return $hasUpdate; } /** diff --git a/src/timings/Timings.php b/src/timings/Timings.php index ad5be83f1a..8e44774054 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -107,6 +107,8 @@ abstract class Timings{ /** @var TimingsHandler */ public static $livingEntityBaseTick; + public static TimingsHandler $itemEntityBaseTick; + /** @var TimingsHandler */ public static $schedulerSync; /** @var TimingsHandler */ @@ -200,6 +202,7 @@ abstract class Timings{ self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick"); self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - Living"); + self::$itemEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - ItemEntity"); self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks"); self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks"); From 419962d3a2ee6339ac3ac7bf71841a6fc76446f4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 16:12:47 +0000 Subject: [PATCH 0732/1858] Added timer for player-specific movement code players use an entirely different pathway for movement processing, which could be costly. --- src/player/Player.php | 11 +++++++++++ src/timings/Timings.php | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/player/Player.php b/src/player/Player.php index 8d9afcbc15..e54db939e9 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1212,6 +1212,15 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @param Vector3 $newPos Coordinates of the player's feet, centered horizontally at the base of their bounding box. */ public function handleMovement(Vector3 $newPos) : void{ + Timings::$playerMove->startTiming(); + try{ + $this->actuallyHandleMovement($newPos); + }finally{ + Timings::$playerMove->stopTiming(); + } + } + + private function actuallyHandleMovement(Vector3 $newPos) : void{ $this->moveRateLimit--; if($this->moveRateLimit < 0){ return; @@ -1365,6 +1374,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->timings->startTiming(); if($this->spawned){ + Timings::$playerMove->startTiming(); $this->processMostRecentMovements(); $this->motion = new Vector3(0, 0, 0); //TODO: HACK! (Fixes player knockback being messed up) if($this->onGround){ @@ -1372,6 +1382,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ }else{ $this->inAirTicks += $tickDiff; } + Timings::$playerMove->stopTiming(); Timings::$entityBaseTick->startTiming(); $this->entityBaseTick($tickDiff); diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 8e44774054..3359a2eebf 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -148,6 +148,8 @@ abstract class Timings{ /** @var TimingsHandler */ public static $broadcastPackets; + public static TimingsHandler $playerMove; + public static function init() : void{ if(self::$initialized){ return; @@ -175,6 +177,7 @@ abstract class Timings{ self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSend); + self::$playerMove = new TimingsHandler("Player Movement"); self::$playerChunkOrder = new TimingsHandler("Player Order Chunks"); self::$playerChunkSend = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Chunks", self::$playerNetworkSend); self::$scheduler = new TimingsHandler("Scheduler"); From 05d9298958606144a07c39062d3e27d79a3c5623 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 16:33:59 +0000 Subject: [PATCH 0733/1858] PHPStan 1.10.7 --- composer.json | 2 +- composer.lock | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 23bf5f1267..00673dd2cc 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.6", + "phpstan/phpstan": "1.10.7", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 4f149eee92..bf8ede4887 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1d0c1d2fe668d85ae87110a1e3cfac05", + "content-hash": "6622f1adc1d8ce4c025c367f8825f936", "packages": [ { "name": "adhocore/json-comment", @@ -1884,16 +1884,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.6", + "version": "1.10.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" + "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b10ceb526d9607903c5b2673f1fc8775dbe48975", + "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975", "shasum": "" }, "require": { @@ -1922,8 +1922,11 @@ "static analysis" ], "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.6" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -1939,7 +1942,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:55:12+00:00" + "time": "2023-03-16T15:24:20+00:00" }, { "name": "phpstan/phpstan-phpunit", From a619fd2be688ca63d20e82bc72a9d146404d83cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 16:37:38 +0000 Subject: [PATCH 0734/1858] Scrub PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 5 ----- tests/phpstan/configs/phpstan-bugs.neon | 20 -------------------- 2 files changed, 25 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 90ec78b196..ac9093da1e 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -490,11 +490,6 @@ parameters: count: 1 path: ../../../src/command/defaults/TimingsCommand.php - - - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 2 - path: ../../../src/console/ConsoleReader.php - - message: "#^Parameter \\#1 \\$path of static method pocketmine\\\\utils\\\\Filesystem\\:\\:cleanPath\\(\\) expects string, mixed given\\.$#" count: 1 diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 3ee56e8be5..99cf2aaa76 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -5,11 +5,6 @@ parameters: count: 1 path: ../../../src/block/BaseBanner.php - - - message: "#^Comparison operation \"\\<\" between int\\<1, max\\> and 1 is always false\\.$#" - count: 1 - path: ../../../src/console/ConsoleCommandSender.php - - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 @@ -35,21 +30,11 @@ parameters: count: 1 path: ../../../src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php - - - message: "#^Comparison operation \"\\<\" between int\\<1, max\\> and 1 is always false\\.$#" - count: 1 - path: ../../../src/player/Player.php - - message: "#^Dead catch \\- RuntimeException is never thrown in the try block\\.$#" count: 1 path: ../../../src/plugin/PluginManager.php - - - message: "#^Offset \\(int\\|string\\) on array\\ in isset\\(\\) always exists and is not nullable\\.$#" - count: 1 - path: ../../../src/plugin/PluginManager.php - - message: "#^Static property pocketmine\\\\scheduler\\\\AsyncTask\\:\\:\\$threadLocalStorage \\(ArrayObject\\\\>\\|null\\) does not accept non\\-empty\\-array\\\\>\\|ArrayObject\\\\>\\.$#" count: 1 @@ -65,11 +50,6 @@ parameters: count: 1 path: ../../../src/thread/Worker.php - - - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 2 - path: ../../../src/world/format/io/region/RegionLoader.php - - message: "#^Casting to int something that's already int\\.$#" count: 1 From 01d557062a5f51ac8b153f4c6700284f052c8a0b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 16:41:01 +0000 Subject: [PATCH 0735/1858] Remove dead baseline --- phpstan.neon.dist | 1 - tests/phpstan/configs/runtime-type-checks.neon | 12 ------------ 2 files changed, 13 deletions(-) delete mode 100644 tests/phpstan/configs/runtime-type-checks.neon diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 6fc15b07a9..d184a0fd04 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -5,7 +5,6 @@ includes: - tests/phpstan/configs/impossible-generics.neon - tests/phpstan/configs/php-bugs.neon - tests/phpstan/configs/phpstan-bugs.neon - - tests/phpstan/configs/runtime-type-checks.neon - tests/phpstan/configs/spl-fixed-array-sucks.neon - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon diff --git a/tests/phpstan/configs/runtime-type-checks.neon b/tests/phpstan/configs/runtime-type-checks.neon deleted file mode 100644 index fb1e456b78..0000000000 --- a/tests/phpstan/configs/runtime-type-checks.neon +++ /dev/null @@ -1,12 +0,0 @@ -parameters: - ignoreErrors: - - - message: "#^Casting to int something that's already int\\.$#" - count: 2 - path: ../../../src/item/Item.php - - - - message: "#^Instanceof between pocketmine\\\\nbt\\\\tag\\\\CompoundTag and pocketmine\\\\nbt\\\\tag\\\\CompoundTag will always evaluate to true\\.$#" - count: 1 - path: ../../../src/network/mcpe/handler/InGamePacketHandler.php - From 52ea4feac00a116c53fc5f98602d9704ff8b8164 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 16:53:02 +0000 Subject: [PATCH 0736/1858] Updated pocketmine/locale-data --- composer.json | 2 +- composer.lock | 14 +++++++------- src/lang/KnownTranslationFactory.php | 12 ++++++++++++ src/lang/KnownTranslationKeys.php | 3 +++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 00673dd2cc..4f7afd1485 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "pocketmine/classloader": "^0.2.0", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", - "pocketmine/locale-data": "~2.18.0", + "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0", "pocketmine/math": "^0.4.0", diff --git a/composer.lock b/composer.lock index bf8ede4887..3305ea5b1a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6622f1adc1d8ce4c025c367f8825f936", + "content-hash": "7c02da0a4bfc5f59effdf8e55b085c08", "packages": [ { "name": "adhocore/json-comment", @@ -589,16 +589,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.18.3", + "version": "2.19.5", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0" + "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/da25bfe9ee4822a84feb9b7e620c56ad4000aed0", - "reference": "da25bfe9ee4822a84feb9b7e620c56ad4000aed0", + "url": "https://api.github.com/repos/pmmp/Language/zipball/71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", + "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", "shasum": "" }, "type": "library", @@ -606,9 +606,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.18.3" + "source": "https://github.com/pmmp/Language/tree/2.19.5" }, - "time": "2023-01-17T21:43:36+00:00" + "time": "2023-03-19T16:45:15+00:00" }, { "name": "pocketmine/log", diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index 07a8b17b46..ea8c2952e5 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -1606,6 +1606,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_NOREASON, []); } + public static function pocketmine_disconnect_clientDisconnect() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_CLIENTDISCONNECT, []); + } + + public static function pocketmine_disconnect_clientReconnect() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_CLIENTRECONNECT, []); + } + public static function pocketmine_disconnect_error(Translatable|string $error, Translatable|string $errorId) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR, [ "error" => $error, @@ -1633,6 +1641,10 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_RESPAWN, []); } + public static function pocketmine_disconnect_error_timeout() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_TIMEOUT, []); + } + public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ 0 => $param0, diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index 3221ecbdc4..c834527306 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -349,12 +349,15 @@ final class KnownTranslationKeys{ public const POCKETMINE_DISCONNECT_BAN_HARDCORE = "pocketmine.disconnect.ban.hardcore"; public const POCKETMINE_DISCONNECT_BAN_IP = "pocketmine.disconnect.ban.ip"; public const POCKETMINE_DISCONNECT_BAN_NOREASON = "pocketmine.disconnect.ban.noReason"; + public const POCKETMINE_DISCONNECT_CLIENTDISCONNECT = "pocketmine.disconnect.clientDisconnect"; + public const POCKETMINE_DISCONNECT_CLIENTRECONNECT = "pocketmine.disconnect.clientReconnect"; public const POCKETMINE_DISCONNECT_ERROR = "pocketmine.disconnect.error"; public const POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION = "pocketmine.disconnect.error.authentication"; public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket"; public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal"; public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout"; public const POCKETMINE_DISCONNECT_ERROR_RESPAWN = "pocketmine.disconnect.error.respawn"; + public const POCKETMINE_DISCONNECT_ERROR_TIMEOUT = "pocketmine.disconnect.error.timeout"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; From 4864444440d993c1bb3c1a17ed2ac0163fb5357e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Mar 2023 22:14:23 +0000 Subject: [PATCH 0737/1858] Added CraftingManager::getCraftingRecipeFromIndex() --- src/crafting/CraftingManager.php | 4 ++++ src/network/mcpe/handler/ItemStackRequestExecutor.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index d1421c8374..3b2bd173a4 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -167,6 +167,10 @@ class CraftingManager{ return $this->craftingRecipeIndex; } + public function getCraftingRecipeFromIndex(int $index) : ?CraftingRecipe{ + return $this->craftingRecipeIndex[$index] ?? null; + } + public function getFurnaceRecipeManager(FurnaceType $furnaceType) : FurnaceRecipeManager{ return $this->furnaceRecipeManagers[$furnaceType->id()]; } diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index be7e472ac4..b904f279d7 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -173,7 +173,7 @@ final class ItemStackRequestExecutor{ throw new PacketHandlingException("Cannot craft a recipe less than 1 time"); } $craftingManager = $this->player->getServer()->getCraftingManager(); - $recipe = $craftingManager->getCraftingRecipeIndex()[$recipeId] ?? null; + $recipe = $craftingManager->getCraftingRecipeFromIndex($recipeId); if($recipe === null){ throw new PacketHandlingException("Unknown crafting recipe ID $recipeId"); } From 7b0816e42fd61d7a1ec580920ac35a98831ccdf5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 00:52:26 +0000 Subject: [PATCH 0738/1858] Properly handle transaction building errors instead of kicking the player --- .../TransactionBuilderInventory.php | 4 + src/network/mcpe/InventoryManager.php | 23 ---- .../mcpe/handler/InGamePacketHandler.php | 13 ++- .../mcpe/handler/ItemStackRequestExecutor.php | 108 +++++++++++++----- .../mcpe/handler/ItemStackResponseBuilder.php | 19 +-- 5 files changed, 104 insertions(+), 63 deletions(-) diff --git a/src/inventory/transaction/TransactionBuilderInventory.php b/src/inventory/transaction/TransactionBuilderInventory.php index 4995284a04..95b6c4a147 100644 --- a/src/inventory/transaction/TransactionBuilderInventory.php +++ b/src/inventory/transaction/TransactionBuilderInventory.php @@ -50,6 +50,10 @@ final class TransactionBuilderInventory extends BaseInventory{ $this->changedSlots = new \SplFixedArray($this->actualInventory->getSize()); } + public function getActualInventory() : Inventory{ + return $this->actualInventory; + } + protected function internalSetContents(array $items) : void{ for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ if(!isset($items[$i])){ diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index a0a28a3a28..1ea14b33c2 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -555,27 +555,4 @@ class InventoryManager{ $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId(), $itemStack); return $this->itemStackInfos[spl_object_id($inventory)][$slotId] = $info; } - - public function matchItemStack(Inventory $inventory, int $slotId, int $clientItemStackId) : bool{ - $inventoryObjectId = spl_object_id($inventory); - if(!isset($this->itemStackInfos[$inventoryObjectId])){ - $this->session->getLogger()->debug("Attempted to match item preimage unsynced inventory " . get_class($inventory) . "#" . $inventoryObjectId); - return false; - } - $info = $this->itemStackInfos[$inventoryObjectId][$slotId] ?? null; - if($info === null){ - $this->session->getLogger()->debug("Attempted to match item preimage for unsynced slot $slotId in " . get_class($inventory) . "#$inventoryObjectId that isn't synced"); - return false; - } - - if(!($clientItemStackId < 0 ? $info->getRequestId() === $clientItemStackId : $info->getStackId() === $clientItemStackId)){ - $this->session->getLogger()->debug( - "Mismatched expected itemstack: " . get_class($inventory) . "#" . $inventoryObjectId . ", " . - "slot: $slotId, client expected: $clientItemStackId, server actual: " . $info->getStackId() . ", last modified by request: " . ($info->getRequestId() ?? "none") - ); - return false; - } - - return true; - } } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index dbf2aa5abf..70bb827a20 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -110,11 +110,13 @@ use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Limits; use pocketmine\utils\TextFormat; +use pocketmine\utils\Utils; use pocketmine\world\format\Chunk; use function array_push; use function base64_encode; use function count; use function fmod; +use function implode; use function in_array; use function is_bool; use function is_infinite; @@ -531,9 +533,14 @@ class InGamePacketHandler extends PacketHandler{ private function handleSingleItemStackRequest(ItemStackRequest $request) : ItemStackResponse{ $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); - $transaction = $executor->generateInventoryTransaction(); - $result = $this->executeInventoryTransaction($transaction, $request->getRequestId()); - $this->session->getLogger()->debug("Item stack request " . $request->getRequestId() . " result: " . ($result ? "success" : "failure")); + try{ + $transaction = $executor->generateInventoryTransaction(); + $result = $this->executeInventoryTransaction($transaction, $request->getRequestId()); + }catch(ItemStackRequestProcessException $e){ + $result = false; + $this->session->getLogger()->debug("ItemStackRequest #" . $request->getRequestId() . " failed: " . $e->getMessage()); + $this->session->getLogger()->debug(implode("\n", Utils::printableExceptionInfo($e))); + } return $executor->buildItemStackResponse($result); } diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index b904f279d7..c2ae8e3056 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\crafting\CraftingGrid; use pocketmine\inventory\CreativeInventory; +use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; @@ -81,25 +82,49 @@ final class ItemStackRequestExecutor{ $this->builder = new TransactionBuilder(); } + private function prettyInventoryAndSlot(Inventory $inventory, int $slot) : string{ + if($inventory instanceof TransactionBuilderInventory){ + $inventory = $inventory->getActualInventory(); + } + return (new \ReflectionClass($inventory))->getShortName() . "#" . spl_object_id($inventory) . ", slot: $slot"; + } + + /** + * @throws ItemStackRequestProcessException + */ + private function matchItemStack(Inventory $inventory, int $slotId, int $clientItemStackId) : void{ + $info = $this->inventoryManager->getItemStackInfo($inventory, $slotId); + if($info === null){ + throw new AssumptionFailedError("The inventory is tracked and the slot is valid, so this should not be null"); + } + + if(!($clientItemStackId < 0 ? $info->getRequestId() === $clientItemStackId : $info->getStackId() === $clientItemStackId)){ + throw new ItemStackRequestProcessException( + $this->prettyInventoryAndSlot($inventory, $slotId) . ": " . + "Mismatched expected itemstack, " . + "client expected: $clientItemStackId, server actual: " . $info->getStackId() . ", last modified by request: " . ($info->getRequestId() ?? "none") + ); + } + } + /** * @phpstan-return array{TransactionBuilderInventory, int} + * + * @throws ItemStackRequestProcessException */ private function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ $windowId = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); if($windowAndSlot === null){ - throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); + throw new ItemStackRequestProcessException("No open inventory matches container UI ID: " . $info->getContainerId() . ", slot ID: " . $info->getSlotId()); } [$inventory, $slot] = $windowAndSlot; if(!$inventory->slotExists($slot)){ - throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); + throw new ItemStackRequestProcessException("No such inventory slot :" . $this->prettyInventoryAndSlot($inventory, $slot)); } - if( - $info->getStackId() !== $this->request->getRequestId() && //using TransactionBuilderInventory enables this to work - !$this->inventoryManager->matchItemStack($inventory, $slot, $info->getStackId()) - ){ - throw new PacketHandlingException("Inventory " . $info->getContainerId() . ", slot " . $slot . ": server-side item does not match expected"); + if($info->getStackId() !== $this->request->getRequestId()){ //the itemstack may have been modified by the current request + $this->matchItemStack($inventory, $slot, $info->getStackId()); } return [$this->builder->getInventory($inventory), $slot]; @@ -112,6 +137,7 @@ final class ItemStackRequestExecutor{ /** * Deducts items from an inventory slot, returning a stack containing the removed items. + * @throws ItemStackRequestProcessException */ private function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ $this->requestSlotInfos[] = $slotInfo; @@ -119,7 +145,7 @@ final class ItemStackRequestExecutor{ $existingItem = $inventory->getItem($slot); if($existingItem->getCount() < $count){ - throw new PacketHandlingException("Cannot take $count items from a stack of " . $existingItem->getCount()); + throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Cannot take $count items from a stack of " . $existingItem->getCount()); } $removed = $existingItem->pop($count); @@ -137,7 +163,7 @@ final class ItemStackRequestExecutor{ $existingItem = $inventory->getItem($slot); if(!$existingItem->isNull() && !$existingItem->canStackWith($item)){ - throw new PacketHandlingException("Can only add items to an empty slot, or a slot containing the same item"); + throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Can only add items to an empty slot, or a slot containing the same item"); } //we can't use the existing item here; it may be an empty stack @@ -146,6 +172,9 @@ final class ItemStackRequestExecutor{ $inventory->setItem($slot, $newItem); } + /** + * @throws ItemStackRequestProcessException + */ private function setNextCreatedItem(?Item $item, bool $creative = false) : void{ if($item !== null && $item->isNull()){ $item = null; @@ -157,7 +186,7 @@ final class ItemStackRequestExecutor{ $this->nextCreatedItem->setCount($this->createdItemsTakenCount); $this->builder->addAction(new CreateItemAction($this->nextCreatedItem)); }elseif($this->createdItemsTakenCount < $this->nextCreatedItem->getCount()){ - throw new PacketHandlingException("Not all of the previous created item was taken"); + throw new ItemStackRequestProcessException("Not all of the previous created item was taken"); } } $this->nextCreatedItem = $item; @@ -165,24 +194,27 @@ final class ItemStackRequestExecutor{ $this->createdItemsTakenCount = 0; } + /** + * @throws ItemStackRequestProcessException + */ private function beginCrafting(int $recipeId, int $repetitions) : void{ if($this->specialTransaction !== null){ - throw new PacketHandlingException("Cannot perform more than 1 special action per request"); + throw new ItemStackRequestProcessException("Another special transaction is already in progress"); } if($repetitions < 1){ //TODO: upper bound? - throw new PacketHandlingException("Cannot craft a recipe less than 1 time"); + throw new ItemStackRequestProcessException("Cannot craft a recipe less than 1 time"); } $craftingManager = $this->player->getServer()->getCraftingManager(); $recipe = $craftingManager->getCraftingRecipeFromIndex($recipeId); if($recipe === null){ - throw new PacketHandlingException("Unknown crafting recipe ID $recipeId"); + throw new ItemStackRequestProcessException("No such crafting recipe index: $recipeId"); } $this->specialTransaction = new CraftingTransaction($this->player, $craftingManager, [], $recipe, $repetitions); $currentWindow = $this->player->getCurrentWindow(); if($currentWindow !== null && !($currentWindow instanceof CraftingGrid)){ - throw new PacketHandlingException("Cannot complete crafting when the player's current window is not a crafting grid"); + throw new ItemStackRequestProcessException("Player's current window is not a crafting grid"); } $craftingGrid = $currentWindow ?? $this->player->getCraftingGrid(); @@ -200,13 +232,13 @@ final class ItemStackRequestExecutor{ private function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ $createdItem = $this->nextCreatedItem; if($createdItem === null){ - throw new PacketHandlingException("No created item is waiting to be taken"); + throw new ItemStackRequestProcessException("No created item is waiting to be taken"); } if(!$this->createdItemFromCreativeInventory){ $availableCount = $createdItem->getCount() - $this->createdItemsTakenCount; if($count > $availableCount){ - throw new PacketHandlingException("Not enough created items available to be taken (have $availableCount, tried to take $count)"); + throw new ItemStackRequestProcessException("Not enough created items available to be taken (have $availableCount, tried to take $count)"); } } @@ -217,6 +249,22 @@ final class ItemStackRequestExecutor{ } } + /** + * @throws ItemStackRequestProcessException + */ + private function assertDoingCrafting() : void{ + if(!$this->specialTransaction instanceof CraftingTransaction){ + if($this->specialTransaction === null){ + throw new ItemStackRequestProcessException("Expected CraftRecipe or CraftRecipeAuto action to precede this action"); + }else{ + throw new ItemStackRequestProcessException("A different special transaction is already in progress"); + } + } + } + + /** + * @throws ItemStackRequestProcessException + */ private function processItemStackRequestAction(ItemStackRequestAction $action) : void{ if( $action instanceof TakeStackRequestAction || @@ -253,10 +301,7 @@ final class ItemStackRequestExecutor{ }elseif($action instanceof CreativeCreateStackRequestAction){ $item = CreativeInventory::getInstance()->getItem($action->getCreativeItemId()); if($item === null){ - //TODO: the item may have been unregistered after the client was sent the creative contents, leaving a - //gap in the creative item list. This probably shouldn't be a violation, but I'm not sure how else to - //handle it right now. - throw new PacketHandlingException("Tried to create nonexisting creative item " . $action->getCreativeItemId()); + throw new ItemStackRequestProcessException("No such creative item index: " . $action->getCreativeItemId()); } $this->setNextCreatedItem($item, true); @@ -265,31 +310,34 @@ final class ItemStackRequestExecutor{ }elseif($action instanceof CraftRecipeAutoStackRequestAction){ $this->beginCrafting($action->getRecipeId(), $action->getRepetitions()); }elseif($action instanceof CraftingConsumeInputStackRequestAction){ - if(!$this->specialTransaction instanceof CraftingTransaction){ - throw new PacketHandlingException("Cannot consume crafting input when no crafting transaction is in progress"); - } + $this->assertDoingCrafting(); $this->removeItemFromSlot($action->getSource(), $action->getCount()); //output discarded - we allow CraftingTransaction to verify the balance }elseif($action instanceof CraftingCreateSpecificResultStackRequestAction){ - if(!$this->specialTransaction instanceof CraftingTransaction){ - throw new AssumptionFailedError("Cannot mark crafting result index when no crafting transaction is in progress"); - } + $this->assertDoingCrafting(); $nextResultItem = $this->craftingResults[$action->getResultIndex()] ?? null; if($nextResultItem === null){ - throw new PacketHandlingException("No such crafting result index " . $action->getResultIndex()); + throw new ItemStackRequestProcessException("No such crafting result index: " . $action->getResultIndex()); } $this->setNextCreatedItem($nextResultItem); }elseif($action instanceof DeprecatedCraftingResultsStackRequestAction){ //no obvious use }else{ - throw new PacketHandlingException("Unhandled item stack request action: " . get_class($action)); + throw new ItemStackRequestProcessException("Unhandled item stack request action"); } } + /** + * @throws ItemStackRequestProcessException + */ public function generateInventoryTransaction() : InventoryTransaction{ - foreach($this->request->getActions() as $action){ - $this->processItemStackRequestAction($action); + foreach($this->request->getActions() as $k => $action){ + try{ + $this->processItemStackRequestAction($action); + }catch(ItemStackRequestProcessException $e){ + throw new ItemStackRequestProcessException("Error processing action $k (" . (new \ReflectionClass($action))->getShortName() . "): " . $e->getMessage(), 0, $e); + } } $this->setNextCreatedItem(null); $inventoryActions = $this->builder->generateActions(); diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 782404ebe4..35a07425ed 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -29,7 +29,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseContainerInfo; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseSlotInfo; -use pocketmine\network\PacketHandlingException; +use pocketmine\utils\AssumptionFailedError; final class ItemStackResponseBuilder{ @@ -51,15 +51,15 @@ final class ItemStackResponseBuilder{ /** * @phpstan-return array{Inventory, int} */ - private function getInventoryAndSlot(int $containerInterfaceId, int $slotId) : array{ + private function getInventoryAndSlot(int $containerInterfaceId, int $slotId) : ?array{ $windowId = ItemStackContainerIdTranslator::translate($containerInterfaceId, $this->inventoryManager->getCurrentWindowId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ - throw new PacketHandlingException("Stack request action cannot target an inventory that is not open"); + return null; } [$inventory, $slot] = $windowAndSlot; if(!$inventory->slotExists($slot)){ - throw new PacketHandlingException("Stack request action cannot target an inventory slot that does not exist"); + return null; } return [$inventory, $slot]; @@ -72,16 +72,21 @@ final class ItemStackResponseBuilder{ continue; } foreach($slotIds as $slotId){ - [$inventory, $slot] = $this->getInventoryAndSlot($containerInterfaceId, $slotId); + $inventoryAndSlot = $this->getInventoryAndSlot($containerInterfaceId, $slotId); + if($inventoryAndSlot === null){ + //a plugin may have closed the inventory during an event, or the slot may have been invalid + continue; + } + [$inventory, $slot] = $inventoryAndSlot; $itemStackInfo = $this->inventoryManager->getItemStackInfo($inventory, $slot); if($itemStackInfo === null){ - //TODO: what if a plugin closes the inventory while the transaction is ongoing? - throw new \LogicException("ItemStackInfo should never be null for an open inventory"); + throw new AssumptionFailedError("ItemStackInfo should never be null for an open inventory"); } if($itemStackInfo->getRequestId() !== $this->requestId){ //the itemstack may have been synced due to transaction producing results that the client did not //predict correctly, which will wipe out the tracked request ID (intentionally) + //TODO: is this the correct behaviour? continue; } $item = $inventory->getItem($slot); From d57aca1367dc42ddbc35f36e524e80bed912e438 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 00:53:00 +0000 Subject: [PATCH 0739/1858] CS --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index c2ae8e3056..5ba92e4aa0 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -52,12 +52,11 @@ use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\SwapStackReque use pocketmine\network\mcpe\protocol\types\inventory\stackrequest\TakeStackRequestAction; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; -use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use function array_key_first; use function count; -use function get_class; +use function spl_object_id; final class ItemStackRequestExecutor{ private TransactionBuilder $builder; From 804feedb67adfa894be310e5823d92647632e01f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 00:54:33 +0000 Subject: [PATCH 0740/1858] Added some dumb limits --- src/network/mcpe/handler/InGamePacketHandler.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 70bb827a20..f4f882c802 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -532,6 +532,10 @@ class InGamePacketHandler extends PacketHandler{ } private function handleSingleItemStackRequest(ItemStackRequest $request) : ItemStackResponse{ + if(count($request->getActions()) > 20){ + //TODO: we can probably lower this limit, but this will do for now + throw new PacketHandlingException("Too many actions in ItemStackRequest"); + } $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); try{ $transaction = $executor->generateInventoryTransaction(); @@ -547,6 +551,10 @@ class InGamePacketHandler extends PacketHandler{ public function handleItemStackRequest(ItemStackRequestPacket $packet) : bool{ $responses = []; + if(count($packet->getRequests()) > 80){ + //TODO: we can probably lower this limit, but this will do for now + throw new PacketHandlingException("Too many requests in ItemStackRequestPacket"); + } foreach($packet->getRequests() as $request){ $responses[] = $this->handleSingleItemStackRequest($request); } From 67b7b60d18ecc188c8003a101b5eff9db4cc4918 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 01:19:07 +0000 Subject: [PATCH 0741/1858] .............. --- .../ItemStackRequestProcessException.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/network/mcpe/handler/ItemStackRequestProcessException.php diff --git a/src/network/mcpe/handler/ItemStackRequestProcessException.php b/src/network/mcpe/handler/ItemStackRequestProcessException.php new file mode 100644 index 0000000000..7d5c667cfb --- /dev/null +++ b/src/network/mcpe/handler/ItemStackRequestProcessException.php @@ -0,0 +1,31 @@ + Date: Mon, 20 Mar 2023 01:28:18 +0000 Subject: [PATCH 0742/1858] InGamePacketHandler: remove dead code --- src/network/mcpe/handler/InGamePacketHandler.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index f4f882c802..f05e99607f 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -136,9 +136,6 @@ use const JSON_THROW_ON_ERROR; class InGamePacketHandler extends PacketHandler{ private const MAX_FORM_RESPONSE_DEPTH = 2; //modal/simple will be 1, custom forms 2 - they will never contain anything other than string|int|float|bool|null - /** @var CraftingTransaction|null */ - protected $craftingTransaction = null; - /** @var float */ protected $lastRightClickTime = 0.0; /** @var UseItemTransactionData|null */ @@ -349,9 +346,7 @@ class InGamePacketHandler extends PacketHandler{ $result = $this->handleReleaseItemTransaction($packet->trData); } - if($this->craftingTransaction === null){ //don't sync if we're waiting to complete a crafting transaction - $this->inventoryManager->syncMismatchedPredictedSlotChanges(); - } + $this->inventoryManager->syncMismatchedPredictedSlotChanges(); $this->inventoryManager->setCurrentItemStackRequestId(null); return $result; } From 4e55433ed804bf3fa378b20d44a750bf4d0f2262 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 01:35:03 +0000 Subject: [PATCH 0743/1858] Fixed request rejecting --- composer.json | 2 +- composer.lock | 16 ++++++++-------- src/network/mcpe/handler/InGamePacketHandler.php | 5 ++++- .../mcpe/handler/ItemStackRequestExecutor.php | 4 ++-- .../mcpe/handler/ItemStackResponseBuilder.php | 4 ++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 23bf5f1267..4a6ac4f5ef 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~1.1.1+bedrock-1.19.70", "pocketmine/bedrock-data": "~2.1.1+bedrock-1.19.70", "pocketmine/bedrock-item-upgrade-schema": "~1.1.0+bedrock-1.19.70", - "pocketmine/bedrock-protocol": "~20.0.0+bedrock-1.19.70", + "pocketmine/bedrock-protocol": "~20.1.0+bedrock-1.19.70", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 4f149eee92..33fb06dfd9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1d0c1d2fe668d85ae87110a1e3cfac05", + "content-hash": "01afa65b40f95ad9378c8cd999e6098d", "packages": [ { "name": "adhocore/json-comment", @@ -328,16 +328,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "20.0.0+bedrock-1.19.70", + "version": "20.1.0+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "4892a5020187da805d7b46ab522d8185b0283726" + "reference": "91d67c8b1bced3c82d0841b1041c0c1f4e93eb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/4892a5020187da805d7b46ab522d8185b0283726", - "reference": "4892a5020187da805d7b46ab522d8185b0283726", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/91d67c8b1bced3c82d0841b1041c0c1f4e93eb68", + "reference": "91d67c8b1bced3c82d0841b1041c0c1f4e93eb68", "shasum": "" }, "require": { @@ -351,7 +351,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.1", + "phpstan/phpstan": "1.10.7", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/20.0.0+bedrock-1.19.70" + "source": "https://github.com/pmmp/BedrockProtocol/tree/20.1.0+bedrock-1.19.70" }, - "time": "2023-03-14T17:06:38+00:00" + "time": "2023-03-20T01:17:00+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index f05e99607f..e6e7d09160 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -541,7 +541,10 @@ class InGamePacketHandler extends PacketHandler{ $this->session->getLogger()->debug(implode("\n", Utils::printableExceptionInfo($e))); } - return $executor->buildItemStackResponse($result); + if(!$result){ + return new ItemStackResponse(ItemStackResponse::RESULT_ERROR, $request->getRequestId()); + } + return $executor->buildItemStackResponse(); } public function handleItemStackRequest(ItemStackRequestPacket $packet) : bool{ diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 5ba92e4aa0..15f1776f04 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -349,12 +349,12 @@ final class ItemStackRequestExecutor{ return $transaction; } - public function buildItemStackResponse(bool $success) : ItemStackResponse{ + public function buildItemStackResponse() : ItemStackResponse{ $builder = new ItemStackResponseBuilder($this->request->getRequestId(), $this->inventoryManager); foreach($this->requestSlotInfos as $requestInfo){ $builder->addSlot($requestInfo->getContainerId(), $requestInfo->getSlotId()); } - return $builder->build($success); + return $builder->build(); } } diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 35a07425ed..1c742077f8 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -65,7 +65,7 @@ final class ItemStackResponseBuilder{ return [$inventory, $slot]; } - public function build(bool $success) : ItemStackResponse{ + public function build() : ItemStackResponse{ $responseInfosByContainer = []; foreach($this->changedSlots as $containerInterfaceId => $slotIds){ if($containerInterfaceId === ContainerUIIds::CREATED_OUTPUT){ @@ -107,6 +107,6 @@ final class ItemStackResponseBuilder{ $responseContainerInfos[] = new ItemStackResponseContainerInfo($containerInterfaceId, $responseInfos); } - return new ItemStackResponse($success ? ItemStackResponse::RESULT_OK : ItemStackResponse::RESULT_ERROR, $this->requestId, $responseContainerInfos); + return new ItemStackResponse(ItemStackResponse::RESULT_OK, $this->requestId, $responseContainerInfos); } } From c91168db66f58a14c51e8a1d33f12b9f1a4a24eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 01:35:15 +0000 Subject: [PATCH 0744/1858] ... --- src/network/mcpe/handler/InGamePacketHandler.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index e6e7d09160..682cc0d4e5 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -33,7 +33,6 @@ use pocketmine\entity\Attribute; use pocketmine\entity\InvalidSkinException; use pocketmine\event\player\PlayerEditBookEvent; use pocketmine\inventory\transaction\action\DropItemAction; -use pocketmine\inventory\transaction\CraftingTransaction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionBuilder; use pocketmine\inventory\transaction\TransactionException; From 2751e1ec02a70a4a53f61540a552714a9d872a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o?= <57811430+SmallkingDev@users.noreply.github.com> Date: Mon, 20 Mar 2023 12:54:28 +0000 Subject: [PATCH 0745/1858] replacing new Vector3(0, 0, 0) with Vector3::zero() (#5640) --- src/entity/Entity.php | 2 +- src/entity/EntityDataHelper.php | 2 +- src/entity/projectile/Projectile.php | 2 +- src/event/player/PlayerInteractEvent.php | 2 +- src/player/Player.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index c388a741ba..69fc684a1f 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -246,7 +246,7 @@ abstract class Entity{ if($nbt !== null){ $this->motion = EntityDataHelper::parseVec3($nbt, self::TAG_MOTION, true); }else{ - $this->motion = new Vector3(0, 0, 0); + $this->motion = Vector3::zero(); } $this->resetLastMovements(); diff --git a/src/entity/EntityDataHelper.php b/src/entity/EntityDataHelper.php index 1a15d74580..60e45e535a 100644 --- a/src/entity/EntityDataHelper.php +++ b/src/entity/EntityDataHelper.php @@ -80,7 +80,7 @@ final class EntityDataHelper{ public static function parseVec3(CompoundTag $nbt, string $tagName, bool $optional) : Vector3{ $pos = $nbt->getTag($tagName); if($pos === null && $optional){ - return new Vector3(0, 0, 0); + return Vector3::zero(); } if(!($pos instanceof ListTag) || ($pos->getTagType() !== NBT::TAG_Double && $pos->getTagType() !== NBT::TAG_Float)){ throw new SavedDataLoadingException("'$tagName' should be a List or List"); diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index b04f8c61b0..56a7eb57ed 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -255,7 +255,7 @@ abstract class Projectile extends Entity{ } $this->isCollided = $this->onGround = true; - $this->motion = new Vector3(0, 0, 0); + $this->motion = Vector3::zero(); }else{ $this->isCollided = $this->onGround = false; $this->blockHit = null; diff --git a/src/event/player/PlayerInteractEvent.php b/src/event/player/PlayerInteractEvent.php index f283913643..39e94b5d87 100644 --- a/src/event/player/PlayerInteractEvent.php +++ b/src/event/player/PlayerInteractEvent.php @@ -59,7 +59,7 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{ $this->player = $player; $this->item = $item; $this->blockTouched = $block; - $this->touchVector = $touchVector ?? new Vector3(0, 0, 0); + $this->touchVector = $touchVector ?? Vector3::zero(); $this->blockFace = $face; $this->action = $action; } diff --git a/src/player/Player.php b/src/player/Player.php index e54db939e9..52eabac172 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1376,7 +1376,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if($this->spawned){ Timings::$playerMove->startTiming(); $this->processMostRecentMovements(); - $this->motion = new Vector3(0, 0, 0); //TODO: HACK! (Fixes player knockback being messed up) + $this->motion = Vector3::zero(); //TODO: HACK! (Fixes player knockback being messed up) if($this->onGround){ $this->inAirTicks = 0; }else{ From 59bae9b0774976c9f449f6aa1c70676b23d563dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 16:53:57 +0000 Subject: [PATCH 0746/1858] Give InventoryManager internals clearer names and stop mixing 'window' and 'inventory' terminology... --- src/network/mcpe/ComplexWindowMapEntry.php | 64 ---------------------- src/network/mcpe/InventoryManager.php | 62 ++++++++++++--------- 2 files changed, 35 insertions(+), 91 deletions(-) delete mode 100644 src/network/mcpe/ComplexWindowMapEntry.php diff --git a/src/network/mcpe/ComplexWindowMapEntry.php b/src/network/mcpe/ComplexWindowMapEntry.php deleted file mode 100644 index c2792297b0..0000000000 --- a/src/network/mcpe/ComplexWindowMapEntry.php +++ /dev/null @@ -1,64 +0,0 @@ - - */ - private array $reverseSlotMap = []; - - /** - * @param int[] $slotMap - * @phpstan-param array $slotMap - */ - public function __construct( - private Inventory $inventory, - private array $slotMap - ){ - foreach($slotMap as $slot => $index){ - $this->reverseSlotMap[$index] = $slot; - } - } - - public function getInventory() : Inventory{ return $this->inventory; } - - /** - * @return int[] - * @phpstan-return array - */ - public function getSlotMap() : array{ return $this->slotMap; } - - public function mapNetToCore(int $slot) : ?int{ - return $this->slotMap[$slot] ?? null; - } - - public function mapCoreToNet(int $slot) : ?int{ - return $this->reverseSlotMap[$slot] ?? null; - } -} diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 1ea14b33c2..8a40762b42 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -69,18 +69,21 @@ use function spl_object_id; * @phpstan-type ContainerOpenClosure \Closure(int $id, Inventory $inventory) : (list|null) */ class InventoryManager{ - /** @var Inventory[] */ - private array $windowMap = []; /** - * @var ComplexWindowMapEntry[] - * @phpstan-var array + * @var Inventory[] network window ID => Inventory + * @phpstan-var array */ - private array $complexWindows = []; + private array $networkIdToInventoryMap = []; /** - * @var ComplexWindowMapEntry[] - * @phpstan-var array + * @var ComplexInventoryMapEntry[] spl_object_id(Inventory) => ComplexWindowMapEntry + * @phpstan-var array */ - private array $complexSlotToWindowMap = []; + private array $complexInventorySlotMaps = []; + /** + * @var ComplexInventoryMapEntry[] net slot ID => ComplexWindowMapEntry + * @phpstan-var array + */ + private array $complexSlotToInventoryMap = []; private int $lastInventoryNetworkId = ContainerIds::FIRST; @@ -126,7 +129,7 @@ class InventoryManager{ } private function add(int $id, Inventory $inventory) : void{ - $this->windowMap[$id] = $inventory; + $this->networkIdToInventoryMap[$id] = $inventory; } private function addDynamic(Inventory $inventory) : int{ @@ -140,29 +143,34 @@ class InventoryManager{ * @phpstan-param array|int $slotMap */ private function addComplex(array|int $slotMap, Inventory $inventory) : void{ - $entry = new ComplexWindowMapEntry($inventory, is_int($slotMap) ? [$slotMap => 0] : $slotMap); - $this->complexWindows[spl_object_id($inventory)] = $entry; + $entry = new ComplexInventoryMapEntry($inventory, is_int($slotMap) ? [$slotMap => 0] : $slotMap); + $this->complexInventorySlotMaps[spl_object_id($inventory)] = $entry; foreach($entry->getSlotMap() as $netSlot => $coreSlot){ - $this->complexSlotToWindowMap[$netSlot] = $entry; + $this->complexSlotToInventoryMap[$netSlot] = $entry; } } private function remove(int $id) : void{ - $inventory = $this->windowMap[$id]; - unset($this->windowMap[$id]); + $inventory = $this->networkIdToInventoryMap[$id]; + unset($this->networkIdToInventoryMap[$id]); if($this->getWindowId($inventory) === null){ $splObjectId = spl_object_id($inventory); - unset($this->initiatedSlotChanges[$splObjectId], $this->itemStackInfos[$splObjectId], $this->complexWindows[$splObjectId]); - foreach($this->complexSlotToWindowMap as $netSlot => $entry){ + unset( + $this->initiatedSlotChanges[$splObjectId], + $this->itemStackInfos[$splObjectId], + $this->complexInventorySlotMaps[$splObjectId], + $this->pendingSlotSyncs[$splObjectId] + ); + foreach($this->complexSlotToInventoryMap as $netSlot => $entry){ if($entry->getInventory() === $inventory){ - unset($this->complexSlotToWindowMap[$netSlot]); + unset($this->complexSlotToInventoryMap[$netSlot]); } } } } public function getWindowId(Inventory $inventory) : ?int{ - return ($id = array_search($inventory, $this->windowMap, true)) !== false ? $id : null; + return ($id = array_search($inventory, $this->networkIdToInventoryMap, true)) !== false ? $id : null; } public function getCurrentWindowId() : int{ @@ -174,15 +182,15 @@ class InventoryManager{ */ public function locateWindowAndSlot(int $windowId, int $netSlotId) : ?array{ if($windowId === ContainerIds::UI){ - $entry = $this->complexSlotToWindowMap[$netSlotId] ?? null; + $entry = $this->complexSlotToInventoryMap[$netSlotId] ?? null; if($entry === null){ return null; } $coreSlotId = $entry->mapNetToCore($netSlotId); return $coreSlotId !== null ? [$entry->getInventory(), $coreSlotId] : null; } - if(isset($this->windowMap[$windowId])){ - return [$this->windowMap[$windowId], $netSlotId]; + if(isset($this->networkIdToInventoryMap[$windowId])){ + return [$this->networkIdToInventoryMap[$windowId], $netSlotId]; } return null; } @@ -344,7 +352,7 @@ class InventoryManager{ } public function onCurrentWindowRemove() : void{ - if(isset($this->windowMap[$this->lastInventoryNetworkId])){ + if(isset($this->networkIdToInventoryMap[$this->lastInventoryNetworkId])){ $this->remove($this->lastInventoryNetworkId); $this->session->sendDataPacket(ContainerClosePacket::create($this->lastInventoryNetworkId, true)); if($this->pendingCloseWindowId !== null){ @@ -356,7 +364,7 @@ class InventoryManager{ public function onClientRemoveWindow(int $id) : void{ if($id === $this->lastInventoryNetworkId){ - if(isset($this->windowMap[$id]) && $id !== $this->pendingCloseWindowId){ + if(isset($this->networkIdToInventoryMap[$id]) && $id !== $this->pendingCloseWindowId){ $this->remove($id); $this->player->removeCurrentWindow(); } @@ -398,7 +406,7 @@ class InventoryManager{ if($itemStackInfo === null){ throw new \LogicException("Cannot sync an untracked inventory slot"); } - $slotMap = $this->complexWindows[spl_object_id($inventory)] ?? null; + $slotMap = $this->complexInventorySlotMaps[spl_object_id($inventory)] ?? null; if($slotMap !== null){ $windowId = ContainerIds::UI; $netSlot = $slotMap->mapCoreToNet($slot) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); @@ -438,7 +446,7 @@ class InventoryManager{ } public function syncContents(Inventory $inventory) : void{ - $slotMap = $this->complexWindows[spl_object_id($inventory)] ?? null; + $slotMap = $this->complexInventorySlotMaps[spl_object_id($inventory)] ?? null; if($slotMap !== null){ $windowId = ContainerIds::UI; }else{ @@ -471,10 +479,10 @@ class InventoryManager{ } public function syncAll() : void{ - foreach($this->windowMap as $inventory){ + foreach($this->networkIdToInventoryMap as $inventory){ $this->syncContents($inventory); } - foreach($this->complexWindows as $entry){ + foreach($this->complexInventorySlotMaps as $entry){ $this->syncContents($entry->getInventory()); } } From 6ccb8f737305059038d695c82db1bfba3047d514 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 16:57:38 +0000 Subject: [PATCH 0747/1858] git --- src/network/mcpe/ComplexInventoryMapEntry.php | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/network/mcpe/ComplexInventoryMapEntry.php diff --git a/src/network/mcpe/ComplexInventoryMapEntry.php b/src/network/mcpe/ComplexInventoryMapEntry.php new file mode 100644 index 0000000000..dfd3e999a4 --- /dev/null +++ b/src/network/mcpe/ComplexInventoryMapEntry.php @@ -0,0 +1,64 @@ + + */ + private array $reverseSlotMap = []; + + /** + * @param int[] $slotMap + * @phpstan-param array $slotMap + */ + public function __construct( + private Inventory $inventory, + private array $slotMap + ){ + foreach($slotMap as $slot => $index){ + $this->reverseSlotMap[$index] = $slot; + } + } + + public function getInventory() : Inventory{ return $this->inventory; } + + /** + * @return int[] + * @phpstan-return array + */ + public function getSlotMap() : array{ return $this->slotMap; } + + public function mapNetToCore(int $slot) : ?int{ + return $this->slotMap[$slot] ?? null; + } + + public function mapCoreToNet(int $slot) : ?int{ + return $this->reverseSlotMap[$slot] ?? null; + } +} From 3d70a169e11df3301aebd84d35bedc8447667cf9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 17:31:54 +0000 Subject: [PATCH 0748/1858] Reduce chaos in InventoryManager the information in these arrays is usually needed all at the same time, so it doesn't make sense to force multiple array lookups for it. in addition, this (obviously) cleans up the code quite a lot. --- src/network/mcpe/InventoryManager.php | 106 +++++++++--------- ...dChanges.php => InventoryManagerEntry.php} | 33 ++---- 2 files changed, 60 insertions(+), 79 deletions(-) rename src/network/mcpe/{InventoryManagerPredictedChanges.php => InventoryManagerEntry.php} (63%) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 8a40762b42..868ccebdf6 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -69,16 +69,17 @@ use function spl_object_id; * @phpstan-type ContainerOpenClosure \Closure(int $id, Inventory $inventory) : (list|null) */ class InventoryManager{ + /** + * @var InventoryManagerEntry[] spl_object_id(Inventory) => InventoryManagerEntry + * @phpstan-var array + */ + private array $inventories = []; + /** * @var Inventory[] network window ID => Inventory * @phpstan-var array */ private array $networkIdToInventoryMap = []; - /** - * @var ComplexInventoryMapEntry[] spl_object_id(Inventory) => ComplexWindowMapEntry - * @phpstan-var array - */ - private array $complexInventorySlotMaps = []; /** * @var ComplexInventoryMapEntry[] net slot ID => ComplexWindowMapEntry * @phpstan-var array @@ -87,11 +88,6 @@ class InventoryManager{ private int $lastInventoryNetworkId = ContainerIds::FIRST; - /** - * @var Item[][] - * @phpstan-var array - */ - private array $initiatedSlotChanges = []; private int $clientSelectedHotbarSlot = -1; /** @phpstan-var ObjectSet */ @@ -104,12 +100,6 @@ class InventoryManager{ private int $nextItemStackId = 1; private ?int $currentItemStackRequestId = null; - /** - * @var int[][] - * @phpstan-var array> - */ - private array $itemStackInfos = []; - public function __construct( private Player $player, private NetworkSession $session @@ -129,10 +119,12 @@ class InventoryManager{ } private function add(int $id, Inventory $inventory) : void{ + $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); $this->networkIdToInventoryMap[$id] = $inventory; } private function addDynamic(Inventory $inventory) : int{ + $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); $this->lastInventoryNetworkId = max(ContainerIds::FIRST, ($this->lastInventoryNetworkId + 1) % ContainerIds::LAST); $this->add($this->lastInventoryNetworkId, $inventory); return $this->lastInventoryNetworkId; @@ -144,7 +136,10 @@ class InventoryManager{ */ private function addComplex(array|int $slotMap, Inventory $inventory) : void{ $entry = new ComplexInventoryMapEntry($inventory, is_int($slotMap) ? [$slotMap => 0] : $slotMap); - $this->complexInventorySlotMaps[spl_object_id($inventory)] = $entry; + $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry( + $inventory, + $entry + ); foreach($entry->getSlotMap() as $netSlot => $coreSlot){ $this->complexSlotToInventoryMap[$netSlot] = $entry; } @@ -154,13 +149,7 @@ class InventoryManager{ $inventory = $this->networkIdToInventoryMap[$id]; unset($this->networkIdToInventoryMap[$id]); if($this->getWindowId($inventory) === null){ - $splObjectId = spl_object_id($inventory); - unset( - $this->initiatedSlotChanges[$splObjectId], - $this->itemStackInfos[$splObjectId], - $this->complexInventorySlotMaps[$splObjectId], - $this->pendingSlotSyncs[$splObjectId] - ); + unset($this->inventories[spl_object_id($inventory)]); foreach($this->complexSlotToInventoryMap as $netSlot => $entry){ if($entry->getInventory() === $inventory){ unset($this->complexSlotToInventoryMap[$netSlot]); @@ -196,8 +185,7 @@ class InventoryManager{ } private function addPredictedSlotChange(Inventory $inventory, int $slot, ItemStack $item) : void{ - $predictions = ($this->initiatedSlotChanges[spl_object_id($inventory)] ??= new InventoryManagerPredictedChanges($inventory)); - $predictions->add($slot, $item); + $this->inventories[spl_object_id($inventory)]->predictions[$slot] = $item; } public function addTransactionPredictedSlotChanges(InventoryTransaction $tx) : void{ @@ -388,8 +376,8 @@ class InventoryManager{ public function onSlotChange(Inventory $inventory, int $slot) : void{ $currentItem = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItem($slot)); - $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; - $clientSideItem = $predictions?->getSlot($slot); + $inventoryEntry = $this->inventories[spl_object_id($inventory)]; + $clientSideItem = $inventoryEntry->predictions[$slot] ?? null; if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request $this->trackItemStack($inventory, $slot, $currentItem, null); @@ -398,18 +386,22 @@ class InventoryManager{ //correctly predicted - associate the change with the currently active itemstack request $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); } - $predictions?->remove($slot); + + unset($inventoryEntry->predictions[$slot]); } public function syncSlot(Inventory $inventory, int $slot) : void{ - $itemStackInfo = $this->getItemStackInfo($inventory, $slot); + $entry = $this->inventories[spl_object_id($inventory)] ?? null; + if($entry === null){ + throw new \LogicException("Cannot sync an untracked inventory"); + } + $itemStackInfo = $entry->itemStackInfos[$slot]; if($itemStackInfo === null){ throw new \LogicException("Cannot sync an untracked inventory slot"); } - $slotMap = $this->complexInventorySlotMaps[spl_object_id($inventory)] ?? null; - if($slotMap !== null){ + if($entry->complexSlotMap !== null){ $windowId = ContainerIds::UI; - $netSlot = $slotMap->mapCoreToNet($slot) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); + $netSlot = $entry->complexSlotMap->mapCoreToNet($slot) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); }else{ $windowId = $this->getWindowId($inventory) ?? throw new AssumptionFailedError("We already have an ItemStackInfo, so this should not be null"); $netSlot = $slot; @@ -441,28 +433,27 @@ class InventoryManager{ } $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); } - $predictions = $this->initiatedSlotChanges[spl_object_id($inventory)] ?? null; - $predictions?->remove($slot); + unset($entry->predictions[$slot]); } public function syncContents(Inventory $inventory) : void{ - $slotMap = $this->complexInventorySlotMaps[spl_object_id($inventory)] ?? null; - if($slotMap !== null){ + $entry = $this->inventories[spl_object_id($inventory)]; + if($entry->complexSlotMap !== null){ $windowId = ContainerIds::UI; }else{ $windowId = $this->getWindowId($inventory); } if($windowId !== null){ - unset($this->initiatedSlotChanges[spl_object_id($inventory)]); + $entry->predictions = []; $contents = []; foreach($inventory->getContents(true) as $slot => $item){ $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); $info = $this->trackItemStack($inventory, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $info->getItemStack()); } - if($slotMap !== null){ + if($entry->complexSlotMap !== null){ foreach($contents as $slotId => $info){ - $packetSlot = $slotMap->mapCoreToNet($slotId) ?? null; + $packetSlot = $entry->complexSlotMap->mapCoreToNet($slotId) ?? null; if($packetSlot === null){ continue; } @@ -479,19 +470,16 @@ class InventoryManager{ } public function syncAll() : void{ - foreach($this->networkIdToInventoryMap as $inventory){ - $this->syncContents($inventory); - } - foreach($this->complexInventorySlotMaps as $entry){ - $this->syncContents($entry->getInventory()); + foreach($this->inventories as $entry){ + $this->syncContents($entry->inventory); } } public function syncMismatchedPredictedSlotChanges() : void{ - foreach($this->initiatedSlotChanges as $predictions){ - $inventory = $predictions->getInventory(); - foreach($predictions->getSlots() as $slot => $expectedItem){ - if(!$inventory->slotExists($slot) || $this->getItemStackInfo($inventory, $slot) === null){ + foreach($this->inventories as $entry){ + $inventory = $entry->inventory; + foreach($entry->predictions as $slot => $expectedItem){ + if(!$inventory->slotExists($slot) || $entry->itemStackInfos[$slot] === null){ continue; //TODO: size desync ??? } @@ -499,9 +487,9 @@ class InventoryManager{ $this->session->getLogger()->debug("Detected prediction mismatch in inventory " . get_class($inventory) . "#" . spl_object_id($inventory) . " slot $slot"); $this->syncSlot($inventory, $slot); } - } - $this->initiatedSlotChanges = []; + $entry->predictions = []; + } } public function syncData(Inventory $inventory, int $propertyId, int $value) : void{ @@ -519,7 +507,10 @@ class InventoryManager{ $playerInventory = $this->player->getInventory(); $selected = $playerInventory->getHeldItemIndex(); if($selected !== $this->clientSelectedHotbarSlot){ - $itemStackInfo = $this->itemStackInfos[spl_object_id($playerInventory)][$selected]; + $itemStackInfo = $this->getItemStackInfo($playerInventory, $selected); + if($itemStackInfo === null){ + throw new AssumptionFailedError("Player inventory slots should always be tracked"); + } $this->session->sendDataPacket(MobEquipmentPacket::create( $this->player->getId(), @@ -550,17 +541,22 @@ class InventoryManager{ } public function getItemStackInfo(Inventory $inventory, int $slot) : ?ItemStackInfo{ - return $this->itemStackInfos[spl_object_id($inventory)][$slot] ?? null; + $entry = $this->inventories[spl_object_id($inventory)] ?? null; + return $entry?->itemStackInfos[$slot] ?? null; } private function trackItemStack(Inventory $inventory, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ - $existing = $this->itemStackInfos[spl_object_id($inventory)][$slotId] ?? null; + $entry = $this->inventories[spl_object_id($inventory)] ?? null; + if($entry === null){ + throw new \LogicException("Cannot track an item stack for an untracked inventory"); + } + $existing = $entry->itemStackInfos[$slotId] ?? null; if($existing !== null && $existing->getItemStack()->equals($itemStack) && $existing->getRequestId() === $itemStackRequestId){ return $existing; } //TODO: ItemStack->isNull() would be nice to have here $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId(), $itemStack); - return $this->itemStackInfos[spl_object_id($inventory)][$slotId] = $info; + return $entry->itemStackInfos[$slotId] = $info; } } diff --git a/src/network/mcpe/InventoryManagerPredictedChanges.php b/src/network/mcpe/InventoryManagerEntry.php similarity index 63% rename from src/network/mcpe/InventoryManagerPredictedChanges.php rename to src/network/mcpe/InventoryManagerEntry.php index 8264e83fbb..7b97a45b0f 100644 --- a/src/network/mcpe/InventoryManagerPredictedChanges.php +++ b/src/network/mcpe/InventoryManagerEntry.php @@ -26,36 +26,21 @@ namespace pocketmine\network\mcpe; use pocketmine\inventory\Inventory; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; -final class InventoryManagerPredictedChanges{ +final class InventoryManagerEntry{ /** * @var ItemStack[] * @phpstan-var array */ - private array $slots = []; - - public function __construct( - private Inventory $inventory - ){} - - public function getInventory() : Inventory{ return $this->inventory; } + public array $predictions; /** - * @return ItemStack[] - * @phpstan-return array + * @var ItemStackInfo[] + * @phpstan-var array */ - public function getSlots() : array{ - return $this->slots; - } + public array $itemStackInfos = []; - public function getSlot(int $slot) : ?ItemStack{ - return $this->slots[$slot] ?? null; - } - - public function add(int $slot, ItemStack $item) : void{ - $this->slots[$slot] = $item; - } - - public function remove(int $slot) : void{ - unset($this->slots[$slot]); - } + public function __construct( + public Inventory $inventory, + public ?ComplexInventoryMapEntry $complexSlotMap = null + ){} } From a83fc85f1e80a113cd2e4c59eb195cba02640d15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 17:32:44 +0000 Subject: [PATCH 0749/1858] InventoryManagerEntry: fixed missing default --- src/network/mcpe/InventoryManagerEntry.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/InventoryManagerEntry.php b/src/network/mcpe/InventoryManagerEntry.php index 7b97a45b0f..b87650e297 100644 --- a/src/network/mcpe/InventoryManagerEntry.php +++ b/src/network/mcpe/InventoryManagerEntry.php @@ -31,7 +31,7 @@ final class InventoryManagerEntry{ * @var ItemStack[] * @phpstan-var array */ - public array $predictions; + public array $predictions = []; /** * @var ItemStackInfo[] From e8085e22a00074638f7808e30647d69f7ddd9792 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 18:40:18 +0000 Subject: [PATCH 0750/1858] Fixed crash when opening main inventory the InventoryManagerEntry was getting overwritten, since we don't expect to open the same inventory with two different window IDs. --- src/network/mcpe/InventoryManager.php | 39 ++++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 868ccebdf6..e93f2bc391 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -118,30 +118,48 @@ class InventoryManager{ }); } - private function add(int $id, Inventory $inventory) : void{ - $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); + private function associateIdWithInventory(int $id, Inventory $inventory) : void{ $this->networkIdToInventoryMap[$id] = $inventory; } - private function addDynamic(Inventory $inventory) : int{ - $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); + private function getNewWindowId() : int{ $this->lastInventoryNetworkId = max(ContainerIds::FIRST, ($this->lastInventoryNetworkId + 1) % ContainerIds::LAST); - $this->add($this->lastInventoryNetworkId, $inventory); return $this->lastInventoryNetworkId; } + private function add(int $id, Inventory $inventory) : void{ + if(isset($this->inventories[spl_object_id($inventory)])){ + throw new \InvalidArgumentException("Inventory " . get_class($inventory) . " is already tracked"); + } + $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); + $this->associateIdWithInventory($id, $inventory); + } + + private function addDynamic(Inventory $inventory) : int{ + if(isset($this->inventories[spl_object_id($inventory)])){ + throw new \InvalidArgumentException("Inventory " . get_class($inventory) . " is already tracked"); + } + $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); + $id = $this->getNewWindowId(); + $this->add($id, $inventory); + return $id; + } + /** * @param int[]|int $slotMap * @phpstan-param array|int $slotMap */ private function addComplex(array|int $slotMap, Inventory $inventory) : void{ - $entry = new ComplexInventoryMapEntry($inventory, is_int($slotMap) ? [$slotMap => 0] : $slotMap); + if(isset($this->inventories[spl_object_id($inventory)])){ + throw new \InvalidArgumentException("Inventory " . get_class($inventory) . " is already tracked"); + } + $complexSlotMap = new ComplexInventoryMapEntry($inventory, is_int($slotMap) ? [$slotMap => 0] : $slotMap); $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry( $inventory, - $entry + $complexSlotMap ); - foreach($entry->getSlotMap() as $netSlot => $coreSlot){ - $this->complexSlotToInventoryMap[$netSlot] = $entry; + foreach($complexSlotMap->getSlotMap() as $netSlot => $coreSlot){ + $this->complexSlotToInventoryMap[$netSlot] = $complexSlotMap; } } @@ -329,7 +347,8 @@ class InventoryManager{ $this->onCurrentWindowRemove(); $this->openWindowDeferred(function() : void{ - $windowId = $this->addDynamic($this->player->getInventory()); + $windowId = $this->getNewWindowId(); + $this->associateIdWithInventory($windowId, $this->player->getInventory()); $this->session->sendDataPacket(ContainerOpenPacket::entityInv( $windowId, From ca6d51498f12427a947467da8fcad7811418e6cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 19:16:00 +0000 Subject: [PATCH 0751/1858] Buffer slot and content syncing until the end of the tick we may receive multiple requests in one tick (e.g. crafting in a batch) --- src/network/mcpe/InventoryManager.php | 36 +++++++++++++++++-- src/network/mcpe/InventoryManagerEntry.php | 6 ++++ src/network/mcpe/NetworkSession.php | 1 + .../mcpe/handler/InGamePacketHandler.php | 15 +++++--- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index e93f2bc391..225b6cdecb 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -59,8 +59,11 @@ use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\ObjectSet; +use function array_keys; use function array_search; +use function count; use function get_class; +use function implode; use function is_int; use function max; use function spl_object_id; @@ -100,6 +103,8 @@ class InventoryManager{ private int $nextItemStackId = 1; private ?int $currentItemStackRequestId = null; + private bool $fullSyncRequested = false; + public function __construct( private Player $player, private NetworkSession $session @@ -400,7 +405,7 @@ class InventoryManager{ if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request $this->trackItemStack($inventory, $slot, $currentItem, null); - $this->syncSlot($inventory, $slot); + $inventoryEntry->pendingSyncs[$slot] = $slot; }else{ //correctly predicted - associate the change with the currently active itemstack request $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); @@ -452,7 +457,7 @@ class InventoryManager{ } $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); } - unset($entry->predictions[$slot]); + unset($entry->predictions[$slot], $entry->pendingSyncs[$slot]); } public function syncContents(Inventory $inventory) : void{ @@ -464,6 +469,7 @@ class InventoryManager{ } if($windowId !== null){ $entry->predictions = []; + $entry->pendingSyncs = []; $contents = []; foreach($inventory->getContents(true) as $slot => $item){ $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); @@ -494,6 +500,10 @@ class InventoryManager{ } } + public function requestSyncAll() : void{ + $this->fullSyncRequested = true; + } + public function syncMismatchedPredictedSlotChanges() : void{ foreach($this->inventories as $entry){ $inventory = $entry->inventory; @@ -504,13 +514,33 @@ class InventoryManager{ //any prediction that still exists at this point is a slot that was predicted to change but didn't $this->session->getLogger()->debug("Detected prediction mismatch in inventory " . get_class($inventory) . "#" . spl_object_id($inventory) . " slot $slot"); - $this->syncSlot($inventory, $slot); + $entry->pendingSyncs[$slot] = $slot; } $entry->predictions = []; } } + public function flushPendingUpdates() : void{ + if($this->fullSyncRequested){ + $this->fullSyncRequested = false; + $this->session->getLogger()->debug("Full inventory sync requested, sending contents of " . count($this->inventories) . " inventories"); + $this->syncAll(); + }else{ + foreach($this->inventories as $entry){ + if(count($entry->pendingSyncs) === 0){ + continue; + } + $inventory = $entry->inventory; + $this->session->getLogger()->debug("Syncing slots " . implode(", ", array_keys($entry->pendingSyncs)) . " in inventory " . get_class($inventory) . "#" . spl_object_id($inventory)); + foreach($entry->pendingSyncs as $slot){ + $this->syncSlot($inventory, $slot); + } + $entry->pendingSyncs = []; + } + } + } + public function syncData(Inventory $inventory, int $propertyId, int $value) : void{ $windowId = $this->getWindowId($inventory); if($windowId !== null){ diff --git a/src/network/mcpe/InventoryManagerEntry.php b/src/network/mcpe/InventoryManagerEntry.php index b87650e297..fa49baf873 100644 --- a/src/network/mcpe/InventoryManagerEntry.php +++ b/src/network/mcpe/InventoryManagerEntry.php @@ -39,6 +39,12 @@ final class InventoryManagerEntry{ */ public array $itemStackInfos = []; + /** + * @var int[] + * @phpstan-var array + */ + public array $pendingSyncs = []; + public function __construct( public Inventory $inventory, public ?ComplexInventoryMapEntry $complexSlotMap = null diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 56b0622d8b..697795f1c2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1219,6 +1219,7 @@ class NetworkSession{ $attribute->markSynchronized(); } } + $this->invManager?->flushPendingUpdates(); $this->flushSendBuffer(); } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 682cc0d4e5..68e9391958 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -35,7 +35,8 @@ use pocketmine\event\player\PlayerEditBookEvent; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionBuilder; -use pocketmine\inventory\transaction\TransactionException; +use pocketmine\inventory\transaction\TransactionCancelledException; +use pocketmine\inventory\transaction\TransactionValidationException; use pocketmine\item\VanillaItems; use pocketmine\item\WritableBook; use pocketmine\item\WritableBookPage; @@ -335,7 +336,7 @@ class InGamePacketHandler extends PacketHandler{ $result = $this->handleNormalTransaction($packet->trData, $packet->requestId); }elseif($packet->trData instanceof MismatchTransactionData){ $this->session->getLogger()->debug("Mismatch transaction received"); - $this->inventoryManager->syncAll(); + $this->inventoryManager->requestSyncAll(); $result = true; }elseif($packet->trData instanceof UseItemTransactionData){ $result = $this->handleUseItemTransaction($packet->trData); @@ -357,9 +358,14 @@ class InGamePacketHandler extends PacketHandler{ $this->inventoryManager->addTransactionPredictedSlotChanges($transaction); try{ $transaction->execute(); - }catch(TransactionException $e){ + }catch(TransactionValidationException $e){ + $this->inventoryManager->requestSyncAll(); $logger = $this->session->getLogger(); - $logger->debug("Failed to execute inventory transaction: " . $e->getMessage()); + $logger->debug("Invalid inventory transaction $requestId: " . $e->getMessage()); + + return false; + }catch(TransactionCancelledException){ + $this->session->getLogger()->debug("Inventory transaction $requestId cancelled by a plugin"); return false; }finally{ @@ -538,6 +544,7 @@ class InGamePacketHandler extends PacketHandler{ $result = false; $this->session->getLogger()->debug("ItemStackRequest #" . $request->getRequestId() . " failed: " . $e->getMessage()); $this->session->getLogger()->debug(implode("\n", Utils::printableExceptionInfo($e))); + $this->inventoryManager->requestSyncAll(); } if(!$result){ From 758b5ee500b2860d4f9997f90120ebd048c9d95f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 21:27:56 +0000 Subject: [PATCH 0752/1858] InventoryManager: fixed armor slots hack the correct condition for this should be an unsynced armor slot changed during a transaction, but conveying this information to syncSlot() is a bit of a hassle, so this will do for now. --- src/network/mcpe/InventoryManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 225b6cdecb..d86821c2ff 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -440,7 +440,7 @@ class InventoryManager{ //BDS (Bedrock Dedicated Server) also seems to work this way. $this->session->sendDataPacket(InventoryContentPacket::create($windowId, [$itemStackWrapper])); }else{ - if($this->currentItemStackRequestId !== null){ + if($windowId === ContainerIds::ARMOR){ //TODO: HACK! //When right-clicking to equip armour, the client predicts the content of the armour slot, but //doesn't report it in the transaction packet. The server then sends an InventorySlotPacket to From c9601ae67dd35434817dc3429e6e35aac57e5997 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 22:00:38 +0000 Subject: [PATCH 0753/1858] Fixed crash when opening crafting table and other 'UI' inventories --- src/network/mcpe/InventoryManager.php | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index d86821c2ff..5b5708b8a7 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -141,10 +141,6 @@ class InventoryManager{ } private function addDynamic(Inventory $inventory) : int{ - if(isset($this->inventories[spl_object_id($inventory)])){ - throw new \InvalidArgumentException("Inventory " . get_class($inventory) . " is already tracked"); - } - $this->inventories[spl_object_id($inventory)] = new InventoryManagerEntry($inventory); $id = $this->getNewWindowId(); $this->add($id, $inventory); return $id; @@ -168,6 +164,17 @@ class InventoryManager{ } } + /** + * @param int[]|int $slotMap + * @phpstan-param array|int $slotMap + */ + private function addComplexDynamic(array|int $slotMap, Inventory $inventory) : int{ + $this->addComplex($slotMap, $inventory); + $id = $this->getNewWindowId(); + $this->associateIdWithInventory($id, $inventory); + return $id; + } + private function remove(int $id) : void{ $inventory = $this->networkIdToInventoryMap[$id]; unset($this->networkIdToInventoryMap[$id]); @@ -296,9 +303,10 @@ class InventoryManager{ $this->onCurrentWindowRemove(); $this->openWindowDeferred(function() use ($inventory) : void{ - $windowId = $this->addDynamic($inventory); if(($slotMap = $this->createComplexSlotMapping($inventory)) !== null){ - $this->addComplex($slotMap, $inventory); + $windowId = $this->addComplexDynamic($slotMap, $inventory); + }else{ + $windowId = $this->addDynamic($inventory); } foreach($this->containerOpenCallbacks as $callback){ From 23ea72116428c28f748b25720890b622139df5b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 22:15:02 +0000 Subject: [PATCH 0754/1858] Reduce packets-per-batch limit to 100 this should be well in excess of requirements with the ItemStackRequest system in use. --- src/network/mcpe/NetworkSession.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index f40f2085f6..99ba222b26 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -376,7 +376,7 @@ class NetworkSession{ $stream = new BinaryStream($decompressed); $count = 0; foreach(PacketBatch::decodeRaw($stream) as $buffer){ - if(++$count > 1300){ + if(++$count > 100){ throw new PacketHandlingException("Too many packets in batch"); } $packet = $this->packetPool->getPacket($buffer); From 035a0a4e9dddc58286883abe82c9303151e5618d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 22:57:58 +0000 Subject: [PATCH 0755/1858] InventoryManager: specialize trackItemStack() to avoid useless lookups --- src/network/mcpe/InventoryManager.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 5b5708b8a7..4bf1e5a15a 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -412,11 +412,11 @@ class InventoryManager{ $clientSideItem = $inventoryEntry->predictions[$slot] ?? null; if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request - $this->trackItemStack($inventory, $slot, $currentItem, null); + $this->trackItemStack($inventoryEntry, $slot, $currentItem, null); $inventoryEntry->pendingSyncs[$slot] = $slot; }else{ //correctly predicted - associate the change with the currently active itemstack request - $this->trackItemStack($inventory, $slot, $currentItem, $this->currentItemStackRequestId); + $this->trackItemStack($inventoryEntry, $slot, $currentItem, $this->currentItemStackRequestId); } unset($inventoryEntry->predictions[$slot]); @@ -481,7 +481,7 @@ class InventoryManager{ $contents = []; foreach($inventory->getContents(true) as $slot => $item){ $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); - $info = $this->trackItemStack($inventory, $slot, $itemStack, null); + $info = $this->trackItemStack($entry, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $info->getItemStack()); } if($entry->complexSlotMap !== null){ @@ -602,11 +602,7 @@ class InventoryManager{ return $entry?->itemStackInfos[$slot] ?? null; } - private function trackItemStack(Inventory $inventory, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ - $entry = $this->inventories[spl_object_id($inventory)] ?? null; - if($entry === null){ - throw new \LogicException("Cannot track an item stack for an untracked inventory"); - } + private function trackItemStack(InventoryManagerEntry $entry, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ $existing = $entry->itemStackInfos[$slotId] ?? null; if($existing !== null && $existing->getItemStack()->equals($itemStack) && $existing->getRequestId() === $itemStackRequestId){ return $existing; From 1992d3b6db4f3c2e993d7f5f2f0b4d69965508bc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 23:08:17 +0000 Subject: [PATCH 0756/1858] InventoryManager: avoid useless work in trackItemStack() this attempts to accommodate slots being set to themselves, which is a rare enough occurrence (only plugins will cause it) that it doesn't make sense to penalize every inventory update this way. attempting to avoid changing the itemstackID in this way is detrimental to performance, and it doesn't actually matter if we set a new itemstackID anyway. --- src/network/mcpe/InventoryManager.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 4bf1e5a15a..a6fe63635e 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -603,11 +603,6 @@ class InventoryManager{ } private function trackItemStack(InventoryManagerEntry $entry, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ - $existing = $entry->itemStackInfos[$slotId] ?? null; - if($existing !== null && $existing->getItemStack()->equals($itemStack) && $existing->getRequestId() === $itemStackRequestId){ - return $existing; - } - //TODO: ItemStack->isNull() would be nice to have here $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId(), $itemStack); return $entry->itemStackInfos[$slotId] = $info; From 63310cf764039af3524d9e32b61c6b2d3dd3d9eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 23:18:43 +0000 Subject: [PATCH 0757/1858] Do not cache ItemStacks for every item this is very memory inefficient, and only provides a performance advantage in cold code anyway. --- src/network/mcpe/InventoryManager.php | 19 ++++++++++--------- src/network/mcpe/InventoryManagerEntry.php | 2 +- src/network/mcpe/ItemStackInfo.php | 7 +------ .../mcpe/handler/InGamePacketHandler.php | 7 ++----- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index a6fe63635e..5aa22b0022 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -413,7 +413,7 @@ class InventoryManager{ if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request $this->trackItemStack($inventoryEntry, $slot, $currentItem, null); - $inventoryEntry->pendingSyncs[$slot] = $slot; + $inventoryEntry->pendingSyncs[$slot] = $currentItem; }else{ //correctly predicted - associate the change with the currently active itemstack request $this->trackItemStack($inventoryEntry, $slot, $currentItem, $this->currentItemStackRequestId); @@ -422,7 +422,7 @@ class InventoryManager{ unset($inventoryEntry->predictions[$slot]); } - public function syncSlot(Inventory $inventory, int $slot) : void{ + public function syncSlot(Inventory $inventory, int $slot, ItemStack $itemStack) : void{ $entry = $this->inventories[spl_object_id($inventory)] ?? null; if($entry === null){ throw new \LogicException("Cannot sync an untracked inventory"); @@ -439,7 +439,7 @@ class InventoryManager{ $netSlot = $slot; } - $itemStackWrapper = new ItemStackWrapper($itemStackInfo->getStackId(), $itemStackInfo->getItemStack()); + $itemStackWrapper = new ItemStackWrapper($itemStackInfo->getStackId(), $itemStack); if($windowId === ContainerIds::OFFHAND){ //TODO: HACK! //The client may sometimes ignore the InventorySlotPacket for the offhand slot. @@ -482,7 +482,7 @@ class InventoryManager{ foreach($inventory->getContents(true) as $slot => $item){ $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); $info = $this->trackItemStack($entry, $slot, $itemStack, null); - $contents[] = new ItemStackWrapper($info->getStackId(), $info->getItemStack()); + $contents[] = new ItemStackWrapper($info->getStackId(), $itemStack); } if($entry->complexSlotMap !== null){ foreach($contents as $slotId => $info){ @@ -513,6 +513,7 @@ class InventoryManager{ } public function syncMismatchedPredictedSlotChanges() : void{ + $typeConverter = TypeConverter::getInstance(); foreach($this->inventories as $entry){ $inventory = $entry->inventory; foreach($entry->predictions as $slot => $expectedItem){ @@ -522,7 +523,7 @@ class InventoryManager{ //any prediction that still exists at this point is a slot that was predicted to change but didn't $this->session->getLogger()->debug("Detected prediction mismatch in inventory " . get_class($inventory) . "#" . spl_object_id($inventory) . " slot $slot"); - $entry->pendingSyncs[$slot] = $slot; + $entry->pendingSyncs[$slot] = $typeConverter->coreItemStackToNet($inventory->getItem($slot)); } $entry->predictions = []; @@ -541,8 +542,8 @@ class InventoryManager{ } $inventory = $entry->inventory; $this->session->getLogger()->debug("Syncing slots " . implode(", ", array_keys($entry->pendingSyncs)) . " in inventory " . get_class($inventory) . "#" . spl_object_id($inventory)); - foreach($entry->pendingSyncs as $slot){ - $this->syncSlot($inventory, $slot); + foreach($entry->pendingSyncs as $slot => $itemStack){ + $this->syncSlot($inventory, $slot, $itemStack); } $entry->pendingSyncs = []; } @@ -571,7 +572,7 @@ class InventoryManager{ $this->session->sendDataPacket(MobEquipmentPacket::create( $this->player->getId(), - new ItemStackWrapper($itemStackInfo->getStackId(), $itemStackInfo->getItemStack()), + new ItemStackWrapper($itemStackInfo->getStackId(), TypeConverter::getInstance()->coreItemStackToNet($playerInventory->getItemInHand())), $selected, $selected, ContainerIds::INVENTORY @@ -604,7 +605,7 @@ class InventoryManager{ private function trackItemStack(InventoryManagerEntry $entry, int $slotId, ItemStack $itemStack, ?int $itemStackRequestId) : ItemStackInfo{ //TODO: ItemStack->isNull() would be nice to have here - $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId(), $itemStack); + $info = new ItemStackInfo($itemStackRequestId, $itemStack->getId() === 0 ? 0 : $this->newItemStackId()); return $entry->itemStackInfos[$slotId] = $info; } } diff --git a/src/network/mcpe/InventoryManagerEntry.php b/src/network/mcpe/InventoryManagerEntry.php index fa49baf873..ac2a40dfe6 100644 --- a/src/network/mcpe/InventoryManagerEntry.php +++ b/src/network/mcpe/InventoryManagerEntry.php @@ -41,7 +41,7 @@ final class InventoryManagerEntry{ /** * @var int[] - * @phpstan-var array + * @phpstan-var array */ public array $pendingSyncs = []; diff --git a/src/network/mcpe/ItemStackInfo.php b/src/network/mcpe/ItemStackInfo.php index 630765bfa3..ace138198d 100644 --- a/src/network/mcpe/ItemStackInfo.php +++ b/src/network/mcpe/ItemStackInfo.php @@ -23,19 +23,14 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; - final class ItemStackInfo{ public function __construct( private ?int $requestId, - private int $stackId, - private ItemStack $itemStack + private int $stackId ){} public function getRequestId() : ?int{ return $this->requestId; } public function getStackId() : int{ return $this->stackId; } - - public function getItemStack() : ItemStack{ return $this->itemStack; } } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 68e9391958..67d7ebb65a 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -394,14 +394,11 @@ class InGamePacketHandler extends PacketHandler{ //it's technically possible to see this more than once, but a normal client should never do that. $inventory = $this->player->getInventory(); - $heldItemStack = $this->inventoryManager->getItemStackInfo($inventory, $inventory->getHeldItemIndex())?->getItemStack(); - if($heldItemStack === null){ - throw new AssumptionFailedError("Missing itemstack info for held item"); - } + $heldItemStack = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItemInHand()); $droppedItemStack = $networkInventoryAction->newItem->getItemStack(); //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known //itemstack info with the one the client sent. This is costly, but we don't have any other option :( - if(!$heldItemStack->equalsWithoutCount($droppedItemStack) || $heldItemStack->getCount() < $droppedItemStack->getCount()){ + if($heldItemStack->getCount() < $droppedItemStack->getCount() || !$heldItemStack->equalsWithoutCount($droppedItemStack)){ return false; } From ee72e80fbbdd138e0f7130e2ea557e4ae6dd3a42 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 23:21:24 +0000 Subject: [PATCH 0758/1858] ItemStackResponseBuilder: removed incorrect code the client expects that all itemstacks must be acked by ItemStackResponse, regardless of whether the server changed them to some other item. We'll overwrite the item to the correct thing at the end of the tick anyway. --- src/network/mcpe/handler/ItemStackResponseBuilder.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 1c742077f8..325a2b108b 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -83,12 +83,6 @@ final class ItemStackResponseBuilder{ if($itemStackInfo === null){ throw new AssumptionFailedError("ItemStackInfo should never be null for an open inventory"); } - if($itemStackInfo->getRequestId() !== $this->requestId){ - //the itemstack may have been synced due to transaction producing results that the client did not - //predict correctly, which will wipe out the tracked request ID (intentionally) - //TODO: is this the correct behaviour? - continue; - } $item = $inventory->getItem($slot); $responseInfosByContainer[$containerInterfaceId][] = new ItemStackResponseSlotInfo( From ecc830a689df326ab88497de438657c8673c8b07 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 23:24:52 +0000 Subject: [PATCH 0759/1858] InventoryManager: avoid calling TypeConverter::getInstance() in a loop --- src/network/mcpe/InventoryManager.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 5aa22b0022..0222d6d406 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -479,8 +479,9 @@ class InventoryManager{ $entry->predictions = []; $entry->pendingSyncs = []; $contents = []; + $typeConverter = TypeConverter::getInstance(); foreach($inventory->getContents(true) as $slot => $item){ - $itemStack = TypeConverter::getInstance()->coreItemStackToNet($item); + $itemStack = $typeConverter->coreItemStackToNet($item); $info = $this->trackItemStack($entry, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $itemStack); } From e7771d76f2fb9d0d9561f5c02a45035eab6c3dc4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 20 Mar 2023 23:29:02 +0000 Subject: [PATCH 0760/1858] Cover buffered inventory sync in timings --- src/network/mcpe/NetworkSession.php | 7 ++++++- src/timings/Timings.php | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 99ba222b26..2d628c839f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1146,7 +1146,12 @@ class NetworkSession{ $attribute->markSynchronized(); } } - $this->invManager?->flushPendingUpdates(); + Timings::$playerNetworkSendInventorySync->startTiming(); + try{ + $this->invManager?->flushPendingUpdates(); + }finally{ + Timings::$playerNetworkSendInventorySync->stopTiming(); + } $this->flushSendBuffer(); } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 3359a2eebf..6688601328 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -56,6 +56,9 @@ abstract class Timings{ /** @var TimingsHandler */ public static $playerNetworkSendEncrypt; + + public static TimingsHandler $playerNetworkSendInventorySync; + /** @var TimingsHandler */ public static $playerNetworkReceive; /** @var TimingsHandler */ @@ -170,6 +173,7 @@ abstract class Timings{ self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress); self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress); self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend); + self::$playerNetworkSendInventorySync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Inventory Sync", self::$playerNetworkSend); self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection); self::$playerNetworkReceiveDecompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceive); From 097632902ab1a02ec366ff2ecde65b63ba162923 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:02:32 +0000 Subject: [PATCH 0761/1858] InGamePacketHandler: fixed crash condition in drop item handler --- src/network/mcpe/handler/InGamePacketHandler.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 67d7ebb65a..c2fa13d466 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -387,15 +387,18 @@ class InGamePacketHandler extends PacketHandler{ } foreach($data->getActions() as $networkInventoryAction){ - if($networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_WORLD){ + if($networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_WORLD && $networkInventoryAction->inventorySlot == NetworkInventoryAction::ACTION_MAGIC_SLOT_DROP_ITEM){ //drop item - we don't need to validate this, we only care about the count //if the resulting actions don't match the client for some reason, it will trigger an automatic //prediction rollback anyway. //it's technically possible to see this more than once, but a normal client should never do that. + $droppedItemStack = $networkInventoryAction->newItem->getItemStack(); + if($droppedItemStack->getCount() <= 0){ + throw new PacketHandlingException("Expected positive count for dropped item"); + } $inventory = $this->player->getInventory(); $heldItemStack = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItemInHand()); - $droppedItemStack = $networkInventoryAction->newItem->getItemStack(); //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known //itemstack info with the one the client sent. This is costly, but we don't have any other option :( if($heldItemStack->getCount() < $droppedItemStack->getCount() || !$heldItemStack->equalsWithoutCount($droppedItemStack)){ From ccd288d7fa38ab24f0b17bab0af64ba2581f01a2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:04:29 +0000 Subject: [PATCH 0762/1858] Avoid repeated calls to getItemInHand() in drop item handler --- src/network/mcpe/handler/InGamePacketHandler.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index c2fa13d466..6dbeaa8f4e 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -398,18 +398,19 @@ class InGamePacketHandler extends PacketHandler{ } $inventory = $this->player->getInventory(); - $heldItemStack = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItemInHand()); + $heldItem = $inventory->getItemInHand(); + $heldItemStack = TypeConverter::getInstance()->coreItemStackToNet($heldItem); //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known //itemstack info with the one the client sent. This is costly, but we don't have any other option :( if($heldItemStack->getCount() < $droppedItemStack->getCount() || !$heldItemStack->equalsWithoutCount($droppedItemStack)){ return false; } - $newHeldItem = $inventory->getItemInHand(); - $droppedItem = $newHeldItem->pop($droppedItemStack->getCount()); + //this modifies $heldItem + $droppedItem = $heldItem->pop($droppedItemStack->getCount()); $builder = new TransactionBuilder(); - $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $newHeldItem); + $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $heldItem); $builder->addAction(new DropItemAction($droppedItem)); $transaction = new InventoryTransaction($this->player, $builder->generateActions()); From 955f7944bb5dc3278c42c2467ffc29d2f1afd373 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:06:33 +0000 Subject: [PATCH 0763/1858] ItemStackRequestExecutor: fixed another possible crash condition --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 15f1776f04..11bfeb8414 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -141,6 +141,9 @@ final class ItemStackRequestExecutor{ private function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); + if($count === 0){ + throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Cannot take 0 items from a stack"); + } $existingItem = $inventory->getItem($slot); if($existingItem->getCount() < $count){ From f90315c4a234b1de6c707ad18b7c632e004a96fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:13:21 +0000 Subject: [PATCH 0764/1858] ItemStackRequestExecutor: harden against invalid item counts these cases should all be impossible, but that's assuming that the core code doesn't start using them for a different purpose in the future. --- .../mcpe/handler/ItemStackRequestExecutor.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 11bfeb8414..df66f49389 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -141,8 +141,9 @@ final class ItemStackRequestExecutor{ private function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); - if($count === 0){ - throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Cannot take 0 items from a stack"); + if($count < 1){ + //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits + throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Cannot take less than 1 items from a stack"); } $existingItem = $inventory->getItem($slot); @@ -162,6 +163,10 @@ final class ItemStackRequestExecutor{ private function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : void{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); + if($count < 1){ + //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits + throw new ItemStackRequestProcessException($this->prettyInventoryAndSlot($inventory, $slot) . ": Cannot take less than 1 items from a stack"); + } $existingItem = $inventory->getItem($slot); if(!$existingItem->isNull() && !$existingItem->canStackWith($item)){ @@ -232,6 +237,10 @@ final class ItemStackRequestExecutor{ } private function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ + if($count < 1){ + //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits + throw new ItemStackRequestProcessException("Cannot take less than 1 created item"); + } $createdItem = $this->nextCreatedItem; if($createdItem === null){ throw new ItemStackRequestProcessException("No created item is waiting to be taken"); From e57fbff28c1175d4536e487a1c1f877436b3f0c2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:16:03 +0000 Subject: [PATCH 0765/1858] ItemStackRequestExecutor: added a sanity check for recipe repetitions --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index df66f49389..3aa751f27d 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -211,6 +211,12 @@ final class ItemStackRequestExecutor{ if($repetitions < 1){ //TODO: upper bound? throw new ItemStackRequestProcessException("Cannot craft a recipe less than 1 time"); } + if($repetitions > 256){ + //TODO: we can probably lower this limit to 64, but I'm unsure if there are cases where the client may + //request more than 64 repetitions of a recipe. + //It's already hard-limited to 256 repetitions in the protocol, so this is just a sanity check. + throw new ItemStackRequestProcessException("Cannot craft a recipe more than 256 times"); + } $craftingManager = $this->player->getServer()->getCraftingManager(); $recipe = $craftingManager->getCraftingRecipeFromIndex($recipeId); if($recipe === null){ From 08e8ef275f01507628a6fdd6670a4de392706096 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:17:24 +0000 Subject: [PATCH 0766/1858] remove comment --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 3aa751f27d..6ac67b5dc0 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -208,7 +208,7 @@ final class ItemStackRequestExecutor{ if($this->specialTransaction !== null){ throw new ItemStackRequestProcessException("Another special transaction is already in progress"); } - if($repetitions < 1){ //TODO: upper bound? + if($repetitions < 1){ throw new ItemStackRequestProcessException("Cannot craft a recipe less than 1 time"); } if($repetitions > 256){ From c8d9477da122c4afe83660e6cf0c4806c16f7156 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:22:21 +0000 Subject: [PATCH 0767/1858] ItemStackRequestExecutor: make non-final, and make some stuff protected this allows for plugin extension, for example to implement anvils. --- .../mcpe/handler/ItemStackRequestExecutor.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 6ac67b5dc0..002988bfff 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -58,7 +58,7 @@ use function array_key_first; use function count; use function spl_object_id; -final class ItemStackRequestExecutor{ +class ItemStackRequestExecutor{ private TransactionBuilder $builder; /** @var ItemStackRequestSlotInfo[] */ @@ -81,7 +81,7 @@ final class ItemStackRequestExecutor{ $this->builder = new TransactionBuilder(); } - private function prettyInventoryAndSlot(Inventory $inventory, int $slot) : string{ + protected function prettyInventoryAndSlot(Inventory $inventory, int $slot) : string{ if($inventory instanceof TransactionBuilderInventory){ $inventory = $inventory->getActualInventory(); } @@ -111,7 +111,7 @@ final class ItemStackRequestExecutor{ * * @throws ItemStackRequestProcessException */ - private function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ + protected function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ $windowId = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); if($windowAndSlot === null){ @@ -129,7 +129,7 @@ final class ItemStackRequestExecutor{ return [$this->builder->getInventory($inventory), $slot]; } - private function transferItems(ItemStackRequestSlotInfo $source, ItemStackRequestSlotInfo $destination, int $count) : void{ + protected function transferItems(ItemStackRequestSlotInfo $source, ItemStackRequestSlotInfo $destination, int $count) : void{ $removed = $this->removeItemFromSlot($source, $count); $this->addItemToSlot($destination, $removed, $count); } @@ -138,7 +138,7 @@ final class ItemStackRequestExecutor{ * Deducts items from an inventory slot, returning a stack containing the removed items. * @throws ItemStackRequestProcessException */ - private function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ + protected function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); if($count < 1){ @@ -160,7 +160,7 @@ final class ItemStackRequestExecutor{ /** * Adds items to the target slot, if they are stackable. */ - private function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : void{ + protected function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : void{ $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); if($count < 1){ @@ -182,7 +182,7 @@ final class ItemStackRequestExecutor{ /** * @throws ItemStackRequestProcessException */ - private function setNextCreatedItem(?Item $item, bool $creative = false) : void{ + protected function setNextCreatedItem(?Item $item, bool $creative = false) : void{ if($item !== null && $item->isNull()){ $item = null; } @@ -204,7 +204,7 @@ final class ItemStackRequestExecutor{ /** * @throws ItemStackRequestProcessException */ - private function beginCrafting(int $recipeId, int $repetitions) : void{ + protected function beginCrafting(int $recipeId, int $repetitions) : void{ if($this->specialTransaction !== null){ throw new ItemStackRequestProcessException("Another special transaction is already in progress"); } @@ -242,7 +242,7 @@ final class ItemStackRequestExecutor{ } } - private function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ + protected function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ if($count < 1){ //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits throw new ItemStackRequestProcessException("Cannot take less than 1 created item"); @@ -282,7 +282,7 @@ final class ItemStackRequestExecutor{ /** * @throws ItemStackRequestProcessException */ - private function processItemStackRequestAction(ItemStackRequestAction $action) : void{ + protected function processItemStackRequestAction(ItemStackRequestAction $action) : void{ if( $action instanceof TakeStackRequestAction || $action instanceof PlaceStackRequestAction From 1a9322c00a10b6cb06a43696bd1cd0b0b70ae554 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:23:31 +0000 Subject: [PATCH 0768/1858] ItemStackRequestExecutor: added some missing @throws --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 002988bfff..bdc2937a5e 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -129,6 +129,9 @@ class ItemStackRequestExecutor{ return [$this->builder->getInventory($inventory), $slot]; } + /** + * @throws ItemStackRequestProcessException + */ protected function transferItems(ItemStackRequestSlotInfo $source, ItemStackRequestSlotInfo $destination, int $count) : void{ $removed = $this->removeItemFromSlot($source, $count); $this->addItemToSlot($destination, $removed, $count); @@ -159,6 +162,7 @@ class ItemStackRequestExecutor{ /** * Adds items to the target slot, if they are stackable. + * @throws ItemStackRequestProcessException */ protected function addItemToSlot(ItemStackRequestSlotInfo $slotInfo, Item $item, int $count) : void{ $this->requestSlotInfos[] = $slotInfo; @@ -242,6 +246,9 @@ class ItemStackRequestExecutor{ } } + /** + * @throws ItemStackRequestProcessException + */ protected function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ if($count < 1){ //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits From 66a4c4c88b1d70d2705bf32e51d80802bdc651ae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:26:19 +0000 Subject: [PATCH 0769/1858] Release 4.18.0-ALPHA2 --- changelogs/4.18-alpha.md | 46 ++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/changelogs/4.18-alpha.md b/changelogs/4.18-alpha.md index d2c5998fc9..fde35a1da7 100644 --- a/changelogs/4.18-alpha.md +++ b/changelogs/4.18-alpha.md @@ -43,3 +43,49 @@ Released 16th March 2023. - `StandardPacketBroadcaster` is now locked to a single `PacketSerializer` context, reducing complexity. - Introduced `NetworkBroadcastUtils::broadcastPackets()`, replacing `Server->broadcastPackets()`. - `Server->broadcastPackets()` has been deprecated. It will be removed in a future version. + +# 4.18.0-ALPHA2 +Released 21st March 2023. + +## General +- Included more sections of the network system in Player Network Send timings. +- Changed the names of some timings to make them more user-friendly. +- Removed packet IDs from `receivePacket` and `sendPacket` timings, as they were not very useful. +- Added new specialized timers for the following: + - Item entity base ticking (merging) + - Player movement processing + - Entity movement processing (collision checking section) + - Projectile movement (all) + - Projectile movement processing (ray tracing section) + +## API +### `pocketmine\crafting` +- The following new API methods have been added: + - `CraftingManager->getCraftingRecipeIndex() : array` - returns a list of all crafting recipes + - `CraftingManager->getCraftingRecipeFromIndex(int $index) : ?CraftingRecipe` - returns the crafting recipe at the given index, or null if it doesn't exist + +### `pocketmine\inventory\transaction` +- The following API methods have changed signatures: + - `CraftingTransaction->__construct()` now accepts additional arguments `?CraftingRecipe $recipe = null, ?int $repetitions = null` +- The following new API methods have been added: + - `TransactionBuilderInventory->getActualInventory() : Inventory` - returns the actual inventory that this inventory is a proxy for + +## Internals +### Network +- Introduced support for the `ItemStackRequest` Minecraft: Bedrock network protocol. + - This fixes a large number of inventory- and crafting-related bugs. + - This also improves server security by closing off many code pathways that might have been used for exploits. `TypeConverter->netItemStackToCore()` is no longer used in server code, and remains for tool usage only. + - This system is also significantly more bandwidth-efficient and has lower overhead than the legacy system. + - This now opens the gateway to easily implement lots of gameplay features which have been missing for a long time, such as enchanting, anvils, looms, and more. + - Significant changes have been made to `pocketmine\network\mcpe\InventoryManager` internals. These shouldn't affect plugins, but may affect plugins which use internal network API. + - **No changes have been made to the plugin `InventoryTransaction` API**. + - This system has been implemented as a shim for the existing PocketMine-MP transaction system to preserve plugin compatibility. Plugins using `InventoryTransactionEvent` should continue to work seamlessly. + - The `InventoryTransaction` API will be redesigned in a future major version to make use of the new information provided by the `ItemStackRequest` system. + - `InventoryTransactionPacket` is no longer sent by the client for "regular" inventory actions. However, it is still sent when dropping items, interacting with blocks, and using items. +- Inventory slot and content syncing is now buffered until the end of the tick. This reduces outbound network usage when the client performs multiple transactions in a single tick (e.g. crafting a stack of items). +- Renamed some `InventoryManager` internal properties to make them easier to understand. +- `TypeConverter->createInventoryAction()` has been removed. +- Packet batch limit has been lowered to `100` packets. With the introduction of `ItemStackRequest`, this is more than sufficient for normal gameplay. + +### Other +- Use `Vector3::zero()` instead of `new Vector3()` in some places. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b99f51fc9d..194d834d87 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.18.0-ALPHA2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From 043e81e737f165cf6c39b0edb789393d14fe6625 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 00:26:19 +0000 Subject: [PATCH 0770/1858] 4.18.0-ALPHA3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 194d834d87..779298f360 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.0-ALPHA2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.0-ALPHA3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "alpha"; private function __construct(){ From ea386c42d305448f95b2e6511f1a240b127258a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Mar 2023 14:45:18 +0000 Subject: [PATCH 0771/1858] InGamePacketHandler: fixed dropping items from unselected hotbar slots --- .../mcpe/handler/InGamePacketHandler.php | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 6dbeaa8f4e..213ce2b8c5 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -386,39 +386,51 @@ class InGamePacketHandler extends PacketHandler{ throw new PacketHandlingException("Expected exactly 2 actions for dropping an item"); } + $sourceSlot = null; + $clientItemStack = null; + $droppedCount = null; + foreach($data->getActions() as $networkInventoryAction){ if($networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_WORLD && $networkInventoryAction->inventorySlot == NetworkInventoryAction::ACTION_MAGIC_SLOT_DROP_ITEM){ - //drop item - we don't need to validate this, we only care about the count - //if the resulting actions don't match the client for some reason, it will trigger an automatic - //prediction rollback anyway. - //it's technically possible to see this more than once, but a normal client should never do that. - $droppedItemStack = $networkInventoryAction->newItem->getItemStack(); - if($droppedItemStack->getCount() <= 0){ + $droppedCount = $networkInventoryAction->newItem->getItemStack()->getCount(); + if($droppedCount <= 0){ throw new PacketHandlingException("Expected positive count for dropped item"); } - $inventory = $this->player->getInventory(); - - $heldItem = $inventory->getItemInHand(); - $heldItemStack = TypeConverter::getInstance()->coreItemStackToNet($heldItem); - //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known - //itemstack info with the one the client sent. This is costly, but we don't have any other option :( - if($heldItemStack->getCount() < $droppedItemStack->getCount() || !$heldItemStack->equalsWithoutCount($droppedItemStack)){ - return false; - } - - //this modifies $heldItem - $droppedItem = $heldItem->pop($droppedItemStack->getCount()); - - $builder = new TransactionBuilder(); - $builder->getInventory($inventory)->setItem($inventory->getHeldItemIndex(), $heldItem); - $builder->addAction(new DropItemAction($droppedItem)); - - $transaction = new InventoryTransaction($this->player, $builder->generateActions()); - return $this->executeInventoryTransaction($transaction, $itemStackRequestId); + }elseif($networkInventoryAction->sourceType === NetworkInventoryAction::SOURCE_CONTAINER && $networkInventoryAction->windowId === ContainerIds::INVENTORY){ + //mobile players can drop an item from a non-selected hotbar slot + $sourceSlot = $networkInventoryAction->inventorySlot; + $clientItemStack = $networkInventoryAction->oldItem->getItemStack(); + }else{ + throw new PacketHandlingException("Unexpected action type in drop item transaction"); } } + if($sourceSlot === null || $clientItemStack === null || $droppedCount === null){ + throw new PacketHandlingException("Missing information in drop item transaction, need source slot, client item stack and dropped count"); + } - throw new PacketHandlingException("Legacy 'normal' transactions should only be used for dropping items"); + $inventory = $this->player->getInventory(); + + if(!$inventory->slotExists($sourceSlot)){ + return false; //TODO: size desync?? + } + + $sourceSlotItem = $inventory->getItem($sourceSlot); + $serverItemStack = TypeConverter::getInstance()->coreItemStackToNet($sourceSlotItem); + //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known + //itemstack info with the one the client sent. This is costly, but we don't have any other option :( + if(!$serverItemStack->equals($clientItemStack)){ + return false; + } + + //this modifies $sourceSlotItem + $droppedItem = $sourceSlotItem->pop($droppedCount); + + $builder = new TransactionBuilder(); + $builder->getInventory($inventory)->setItem($sourceSlot, $sourceSlotItem); + $builder->addAction(new DropItemAction($droppedItem)); + + $transaction = new InventoryTransaction($this->player, $builder->generateActions()); + return $this->executeInventoryTransaction($transaction, $itemStackRequestId); } private function handleUseItemTransaction(UseItemTransactionData $data) : bool{ From b11457d605272dc9610be95dd5e81efd48d13b41 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Mar 2023 22:24:25 +0000 Subject: [PATCH 0772/1858] Fixed uncaught exception when retrieving a packet from the pool --- src/network/mcpe/NetworkSession.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 071c754b7f..ffd47c201d 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -120,6 +120,7 @@ use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; @@ -414,7 +415,7 @@ class NetworkSession{ throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); } } - }catch(PacketDecodeException $e){ + }catch(PacketDecodeException|BinaryDataException $e){ $this->logger->logException($e); throw PacketHandlingException::wrap($e, "Packet batch decode error"); } From db59f71130c0f0d2cdbeb6f20502c32c4bb1d46a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Mar 2023 22:29:00 +0000 Subject: [PATCH 0773/1858] attempt to fix ghcr.io docker image push --- .github/workflows/build-docker-image.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 4a4b0d35af..918ec2cb11 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -20,6 +20,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Clone pmmp/PocketMine-Docker repository uses: actions/checkout@v3 with: From 00286e761c7461aa64950efa23f6492d29ea7e84 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Mar 2023 22:35:24 +0000 Subject: [PATCH 0774/1858] Release 4.17.1 --- changelogs/4.17.md | 21 ++++++++++++++++++++- src/VersionInfo.php | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/changelogs/4.17.md b/changelogs/4.17.md index d35cc77d90..58669cc250 100644 --- a/changelogs/4.17.md +++ b/changelogs/4.17.md @@ -11,4 +11,23 @@ Released 14th March 2023. ## General - Added support for Minecraft: Bedrock Edition 1.19.70. -- Removed support for older versions. \ No newline at end of file +- Removed support for older versions. + +# 4.17.1 +Released 22nd March 2023. + +## General +- Docker images for PocketMine-MP are now published on [GitHub Container Registry](https://github.com/pmmp/PocketMine-MP/pkgs/container/pocketmine-mp). The Docker Hub images will stop being maintained in the future. +- Updated translations. + +## Fixes +- Fixed server crash on empty packets in certain cases. +- Fixed mushroom blocks dropping the wrong items when broken with a silk-touch tool. +- Fixed mushroom blocks giving the wrong items when block-picked. +- Fixed missing ability flag `PRIVILEGED_BUILDER`. + +## Internals +- `update-updater-api.yml` workflow now uses `github.repository_owner` to make it easier to test the workflow on forks. +- Added version-specific channels to `update.pmmp.io`, such as `4`, `4.18-beta`, `4.17`, etc. +- Replaced deprecated `::set-output` commands in GitHub Actions workflows. +- `build/make-release.php` no longer automatically pushes changes, to avoid accidents when testing release workflows on forks. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 880fda6981..0a9abc9f84 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.17.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 0b8193aeb35f9394d0fccf82f58a47d9c604effb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 22 Mar 2023 22:35:25 +0000 Subject: [PATCH 0775/1858] 4.17.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0a9abc9f84..87214e6919 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.17.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.17.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 58d5126adaeb803ab0a4ec903de8f4d2322e7034 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Mar 2023 13:29:33 +0000 Subject: [PATCH 0776/1858] InventoryManager: fixed crashes when setting contents or slots of inventories during InventoryCloseEvent (and other similar logic) --- src/network/mcpe/InventoryManager.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 0222d6d406..35a45956bc 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -407,8 +407,13 @@ class InventoryManager{ } public function onSlotChange(Inventory $inventory, int $slot) : void{ + $inventoryEntry = $this->inventories[spl_object_id($inventory)] ?? null; + if($inventoryEntry === null){ + //this can happen when an inventory changed during InventoryCloseEvent, or when a temporary inventory + //is cleared before removal. + return; + } $currentItem = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItem($slot)); - $inventoryEntry = $this->inventories[spl_object_id($inventory)]; $clientSideItem = $inventoryEntry->predictions[$slot] ?? null; if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request @@ -469,7 +474,12 @@ class InventoryManager{ } public function syncContents(Inventory $inventory) : void{ - $entry = $this->inventories[spl_object_id($inventory)]; + $entry = $this->inventories[spl_object_id($inventory)] ?? null; + if($entry === null){ + //this can happen when an inventory changed during InventoryCloseEvent, or when a temporary inventory + //is cleared before removal. + return; + } if($entry->complexSlotMap !== null){ $windowId = ContainerIds::UI; }else{ From 341a9b78b531a0ff47ffcf36c3fb413153409450 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Mar 2023 13:48:33 +0000 Subject: [PATCH 0777/1858] LegacyStringToItemParser: update documentation --- src/item/LegacyStringToItemParser.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index 6a0f852c0c..a52b6c716e 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -49,6 +49,9 @@ use function trim; * Avoid using this wherever possible. Unless you need to parse item strings containing meta (e.g. "dye:4", "351:4") or * item IDs (e.g. "351"), you should prefer the newer StringToItemParser, which is much more user-friendly, more * flexible, and also supports registering custom aliases for any item in any state. + * + * WARNING: This class does NOT support items added during or after PocketMine-MP 5.0.0. Use StringToItemParser for + * modern items. */ final class LegacyStringToItemParser{ use SingletonTrait; From dd37b531adf711520ac28f223aeebda435f44e5d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Mar 2023 14:02:23 +0000 Subject: [PATCH 0778/1858] CONTRIBUTING.md: document network API policy --- CONTRIBUTING.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 44b5be1061..293d2f4360 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,21 +21,22 @@ Larger contributions like feature additions should be preceded by a [Change Prop ## Choosing a target branch PocketMine-MP has three primary branches of development. -| Type of change | `stable` | `minor-next` | `major-next` | -|:---------------|:--------:|:------------:|:------------:| -| Bug fixes | ✔️ | ✔️ | ✔️ | -| Improvements to API docs | ✔️ | ✔️ | ✔️ | -| Cleaning up code | ❌ | ✔️ | ✔️ | -| Changing code formatting or style | ❌ | ✔️ | ✔️ | -| Addition of new core features | ❌ | 🟡 Only if non-disruptive | ✔️ | -| Changing core behaviour (e.g. making something use threads) | ❌ | ✔️ | ✔️ | -| Addition of new configuration options | ❌ | 🟡 Only if optional | ✔️ | -| Addition of new API classes, methods or constants | ❌ | ✔️ | ✔️ | -| Deprecating API classes, methods or constants | ❌ | ✔️ | ✔️ | -| Adding optional parameters to an API method | ❌ | ✔️ | ✔️ | -| Changing API behaviour | ❌ | 🟡 Only if backwards-compatible | ✔️ | -| Removal of API | ❌ | ❌ | ✔️ | -| Backwards-incompatible API change (e.g. renaming a method) | ❌ | ❌ | ✔️ | +| Type of change | `stable` | `minor-next` | `major-next` | +|:--------------------------------------------------------------------------------------------|:--------:|:-------------------------------:|:------------:| +| Bug fixes | ✔️ | ✔️ | ✔️ | +| Improvements to API docs | ✔️ | ✔️ | ✔️ | +| Cleaning up code | ❌ | ✔️ | ✔️ | +| Changing code formatting or style | ❌ | ✔️ | ✔️ | +| Addition of new core features | ❌ | 🟡 Only if non-disruptive | ✔️ | +| Changing core behaviour (e.g. making something use threads) | ❌ | ✔️ | ✔️ | +| Addition of new configuration options | ❌ | 🟡 Only if optional | ✔️ | +| Addition of new API classes, methods or constants | ❌ | ✔️ | ✔️ | +| Deprecating API classes, methods or constants | ❌ | ✔️ | ✔️ | +| Adding optional parameters to an API method | ❌ | ✔️ | ✔️ | +| Changing API behaviour | ❌ | 🟡 Only if backwards-compatible | ✔️ | +| Removal of API | ❌ | ❌ | ✔️ | +| Backwards-incompatible API change (e.g. renaming a method) | ❌ | ❌ | ✔️ | +| Backwards-incompatible internals change (e.g. changing things in `pocketmine\network\mcpe`) | ❌ | ✔️ | ✔️ | ### Notes - **Non-disruptive** means that usage should not be significantly altered by the change. @@ -43,6 +44,9 @@ PocketMine-MP has three primary branches of development. - Examples of **disruptive** changes include changing the way the server is run, world format changes (since those require downtime for the user to convert their world). - **API** includes all public and protected classes, functions and constants (unless marked as `@internal`). - Private members are not part of the API, **unless in a trait**. +- Minecraft's protocol changes are considered necessary internal changes, and are **not** subject to the same rules. + - Protocol changes must always be released in a new minor version, since they disrupt user experience by requiring a client update. +- BC-breaking changes to the internal network API are allowed, but only in new minor versions. This ensures that plugins which use the internal network API will not break (though they shouldn't use such API anyway). ## Making a pull request The basic procedure to create a pull request is: From 289c0b08f4621b939bdb4d471c57aa96319e1247 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Mar 2023 14:06:25 +0000 Subject: [PATCH 0779/1858] Explicitly state that pocketmine\network\mcpe is an internal package --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 293d2f4360..45841fc15a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,6 +44,7 @@ PocketMine-MP has three primary branches of development. - Examples of **disruptive** changes include changing the way the server is run, world format changes (since those require downtime for the user to convert their world). - **API** includes all public and protected classes, functions and constants (unless marked as `@internal`). - Private members are not part of the API, **unless in a trait**. + - The `pocketmine\network\mcpe` package is considered implicitly `@internal` in its entirety (see its [README](src/network/mcpe/README.md) for more details). - Minecraft's protocol changes are considered necessary internal changes, and are **not** subject to the same rules. - Protocol changes must always be released in a new minor version, since they disrupt user experience by requiring a client update. - BC-breaking changes to the internal network API are allowed, but only in new minor versions. This ensures that plugins which use the internal network API will not break (though they shouldn't use such API anyway). From 0818388bd5c14e5113bea20e6b31407a665b7d69 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Mar 2023 19:41:40 +0000 Subject: [PATCH 0780/1858] Allow remapped oldState and newState to accept null, to make it easier for third-party tools to use the schemas since PHP emits empty JSON objects as arrays, this makes it pretty annoying to work with the schemas in other languages. However, nullability is something most languages understand pretty easily. This should continue to support old schemas. --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 4 ++-- ...BlockStateUpgradeSchemaModelBlockRemap.php | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 64f79663ee..03019aeab0 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -150,9 +150,9 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ foreach($remaps as $remap){ $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaBlockRemap( - array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState), + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState ?? []), $remap->newName, - array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState), + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState ?? []), ); } } diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index be601d51b3..0991e54690 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -23,24 +23,25 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade\model; +use function count; + final class BlockStateUpgradeSchemaModelBlockRemap{ /** - * @var BlockStateUpgradeSchemaModelTag[] - * @phpstan-var array + * @var BlockStateUpgradeSchemaModelTag[]|null + * @phpstan-var array|null * @required */ - public array $oldState; + public ?array $oldState; /** @required */ public string $newName; /** - * @var BlockStateUpgradeSchemaModelTag[] - * @phpstan-var array - * @required + * @var BlockStateUpgradeSchemaModelTag[]|null + * @phpstan-var array|null */ - public array $newState; + public ?array $newState; /** * @param BlockStateUpgradeSchemaModelTag[] $oldState @@ -49,8 +50,8 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ * @phpstan-param array $newState */ public function __construct(array $oldState, string $newName, array $newState){ - $this->oldState = $oldState; + $this->oldState = count($oldState) === 0 ? null : $oldState; $this->newName = $newName; - $this->newState = $newState; + $this->newState = count($newState) === 0 ? null : $newState; } } From 6f02b83a26d13abff82df9a44e9376cff04dc34d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Mar 2023 20:26:50 +0000 Subject: [PATCH 0781/1858] Update composer dependencies --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 3305ea5b1a..5de16dab92 100644 --- a/composer.lock +++ b/composer.lock @@ -1946,16 +1946,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.10", + "version": "1.3.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3" + "reference": "9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4cc5c6cc38e56bce7ea47c4091814e516d172dc3", - "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c", + "reference": "9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c", "shasum": "" }, "require": { @@ -1992,9 +1992,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.10" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.11" }, - "time": "2023-03-02T10:25:13+00:00" + "time": "2023-03-25T19:42:13+00:00" }, { "name": "phpstan/phpstan-strict-rules", From 0e8b28716a09b4837455f8845b6d2f1113403cb8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Mar 2023 20:51:34 +0000 Subject: [PATCH 0782/1858] Release 4.18.0 --- changelogs/4.18.md | 80 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 ++-- 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.18.md diff --git a/changelogs/4.18.md b/changelogs/4.18.md new file mode 100644 index 0000000000..b7b7509a68 --- /dev/null +++ b/changelogs/4.18.md @@ -0,0 +1,80 @@ +**For Minecraft: Bedrock Edition 1.19.70** + +### Note about API versions +Plugins which don't touch the `pocketmine\network\mcpe` namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +### Highlights +This version significantly improves server performance with many players and/or entities by making changes to the internal network system. + +It also introduces support for the newer `ItemStackRequest` protocol, which fixes many bugs and improves server security. + +While these changes don't affect non-internal API, they are still significant enough to warrant a new minor version, as they may break plugins which use the internal network API (not recommended). + +# 4.18.0 +Released 25th March 2023. + +## General +- Significantly improved server performance in congested areas of the world (lots of players and/or entities in the same area). +- Included more sections of the network system in `Player Network Send` performance timings. +- Changed the names of some performance timings to make them more user-friendly. +- Removed packet IDs from `receivePacket` and `sendPacket` performance timings, as they were not very useful. +- Added new specialized performance timings for the following: + - Item entity base ticking (merging) + - Player movement processing + - Entity movement processing (collision checking section) + - Projectile movement (all) + - Projectile movement processing (ray tracing section) + +## API +### `pocketmine\crafting` +- The following new API methods have been added: + - `CraftingManager->getCraftingRecipeIndex() : array` - returns a list of all crafting recipes + - `CraftingManager->getCraftingRecipeFromIndex(int $index) : ?CraftingRecipe` - returns the crafting recipe at the given index, or null if it doesn't exist + +### `pocketmine\event\server` +- The following new classes have been added: + - `DataPacketDecodeEvent` - called before a packet is decoded by a `NetworkSession`; useful to mitigate DoS attacks if PocketMine-MP hasn't been patched against new bugs yet + +### `pocketmine\inventory\transaction` +- The following API methods have changed signatures: + - `CraftingTransaction->__construct()` now accepts additional arguments `?CraftingRecipe $recipe = null, ?int $repetitions = null` +- The following new API methods have been added: + - `TransactionBuilderInventory->getActualInventory() : Inventory` - returns the actual inventory that this inventory is a proxy for + +## Internals +### Network +- Introduced new system for broadcasting entity events to network sessions. + - This change improves performance when lots of players and/or entities are in the same area. + - New interface `EntityEventBroadcaster` and class `StandardEntityEventBroadcaster` have been added to implement this. + - All entity-specific `on*()` and `sync*()` methods have been removed from `NetworkSession` (internals backwards compatibility break, not covered by API version guarantee). + - `NetworkSession` now accepts an `EntityEventBroadcaster` instance in its constructor. + - `NetworkBroadcastUtils::broadcastEntityEvent()` can be used to efficiently broadcast events to unique broadcasters shared by several network sessions. +- All network sessions now share the same `PacketSerializerContext` and `PacketBroadcaster` by default. + - Previously, every session had its own context, meaning that broadcast optimisations were not used, causing significant performance losses compared to 3.x. + - This change improves performance in congested areas by allowing reuse of previously encoded packet buffers for all sessions sharing the same context. + - Packet broadcasts are automatically encoded separately per unique `PacketSerializerContext` instance. This allows, for example, a multi-version fork to have a separate context for each protocol version, to ensure maximum broadcast efficiency while encoding different packets for different versions. + - `PacketSerializerContext` is now passed in `NetworkSession::__construct()`, instead of being created by the session. +- `StandardPacketBroadcaster` is now locked to a single `PacketSerializer` context, reducing complexity. +- Introduced `NetworkBroadcastUtils::broadcastPackets()`, replacing `Server->broadcastPackets()`. +- `Server->broadcastPackets()` has been deprecated. It will be removed in a future version. +- Introduced support for the `ItemStackRequest` Minecraft: Bedrock network protocol. + - This fixes a large number of inventory- and crafting-related bugs. + - This also improves server security by closing off many code pathways that might have been used for exploits. `TypeConverter->netItemStackToCore()` is no longer used in server code, and remains for tool usage only. + - This system is also significantly more bandwidth-efficient and has lower overhead than the legacy system. + - This now opens the gateway to easily implement lots of gameplay features which have been missing for a long time, such as enchanting, anvils, looms, and more. + - Significant changes have been made to `pocketmine\network\mcpe\InventoryManager` internals. These shouldn't affect plugins, but may affect plugins which use internal network API. + - **No changes have been made to the plugin `InventoryTransaction` API**. + - This system has been implemented as a shim for the existing PocketMine-MP transaction system to preserve plugin compatibility. Plugins using `InventoryTransactionEvent` should continue to work seamlessly. + - The `InventoryTransaction` API will be redesigned in a future major version to make use of the new information provided by the `ItemStackRequest` system. + - `InventoryTransactionPacket` is no longer sent by the client for "regular" inventory actions. However, it is still sent when dropping items, interacting with blocks, and using items. +- Inventory slot and content syncing is now buffered until the end of the tick. This reduces outbound network usage when the client performs multiple transactions in a single tick (e.g. crafting a stack of items). +- Renamed some `InventoryManager` internal properties to make them easier to understand. +- `TypeConverter->createInventoryAction()` has been removed. +- Packet batch limit has been lowered to `100` packets. With the introduction of `ItemStackRequest`, this is more than sufficient for normal gameplay. + +### Other +- Use `Vector3::zero()` instead of `new Vector3()` in some places. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 779298f360..a6a9a0daad 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.0-ALPHA3"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "alpha"; + public const BASE_VERSION = "4.18.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; private function __construct(){ //NOOP From acc8ae87fbec8ecee9914a62c0ced96ff0555d08 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Mar 2023 20:51:38 +0000 Subject: [PATCH 0783/1858] 4.18.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a6a9a0daad..1f293e9a7c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 006cdaf6ea7870d5876f384a944c60fa5a12760b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 26 Mar 2023 18:56:24 +0100 Subject: [PATCH 0784/1858] RakLibInterface: log the name of the session which triggered an unhandled exception this makes it easier to identify what sequence of events led up to the crash. --- src/network/mcpe/raklib/RakLibInterface.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index d588199386..46927b4f6f 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -192,6 +192,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $session = $this->sessions[$sessionId]; $address = $session->getIp(); $buf = substr($packet, 1); + $name = $session->getDisplayName(); try{ $session->handleEncoded($buf); }catch(PacketHandlingException $e){ @@ -204,6 +205,10 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $logger->debug(implode("\n", Utils::printableExceptionInfo($e))); $session->disconnect("Packet processing error (Error ID: $errorId)"); $this->interface->blockAddress($address, 5); + }catch(\Throwable $e){ + //record the name of the player who caused the crash, to make it easier to find the reproducing steps + $this->server->getLogger()->emergency("Crash occurred while handling a packet from session: $name"); + throw $e; } } } From cebdb95265e9115d5be5aef3400be3332a15d533 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 01:15:42 +0100 Subject: [PATCH 0785/1858] Optimise plugin timings report entries this format is already supported by the timings host, so no changes are required to support this. --- src/plugin/PluginManager.php | 2 +- src/timings/TimingsHandler.php | 18 +++++++++++++++--- src/timings/TimingsRecord.php | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 88fd773e28..d109b23fac 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -651,7 +651,7 @@ class PluginManager{ throw new PluginException("Plugin attempted to register event handler " . $handlerName . "() to event " . $event . " while not enabled"); } - $timings = new TimingsHandler("Plugin: " . $plugin->getDescription()->getFullName() . " Event: " . $handlerName . "(" . (new \ReflectionClass($event))->getShortName() . ")"); + $timings = new TimingsHandler($handlerName . "(" . (new \ReflectionClass($event))->getShortName() . ")", group: $plugin->getDescription()->getFullName()); $registeredListener = new RegisteredListener($handler, $priority, $plugin, $handleCancelled, $timings); HandlerListManager::global()->getListFor($event)->register($registeredListener); diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index a619e3ba84..a291c314dd 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -34,7 +34,7 @@ class TimingsHandler{ /** @return string[] */ public static function printTimings() : array{ - $result = ["Minecraft"]; + $groups = []; foreach(TimingsRecord::getAll() as $timings){ $time = $timings->getTotalTime(); @@ -46,7 +46,16 @@ class TimingsHandler{ $avg = $time / $count; - $result[] = " " . $timings->getName() . " Time: $time Count: " . $count . " Avg: $avg Violations: " . $timings->getViolations(); + $group = $timings->getGroup(); + $groups[$group][] = $timings->getName() . " Time: $time Count: " . $count . " Avg: $avg Violations: " . $timings->getViolations(); + } + $result = []; + + foreach($groups as $groupName => $lines){ + $result[] = $groupName; + foreach($lines as $line){ + $result[] = " $line"; + } } $result[] = "# Version " . Server::getInstance()->getVersion(); @@ -102,11 +111,14 @@ class TimingsHandler{ public function __construct( private string $name, - private ?TimingsHandler $parent = null + private ?TimingsHandler $parent = null, + private string $group = "Minecraft" ){} public function getName() : string{ return $this->name; } + public function getGroup() : string{ return $this->group; } + public function startTiming() : void{ if(self::$enabled){ $this->internalStartTiming(hrtime(true)); diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index 8ee752ae2b..8449a7e8d0 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -88,6 +88,8 @@ final class TimingsRecord{ public function getName() : string{ return $this->handler->getName(); } + public function getGroup() : string{ return $this->handler->getGroup(); } + public function getCount() : int{ return $this->count; } public function getCurCount() : int{ return $this->curCount; } From c1cef19f849839b8c4f17fbc8edeac7e2530eb09 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 01:17:15 +0100 Subject: [PATCH 0786/1858] stringifyKeys --- src/timings/TimingsHandler.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index a291c314dd..3cf65c2033 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -25,6 +25,7 @@ namespace pocketmine\timings; use pocketmine\entity\Living; use pocketmine\Server; +use pocketmine\utils\Utils; use function count; use function hrtime; @@ -51,7 +52,7 @@ class TimingsHandler{ } $result = []; - foreach($groups as $groupName => $lines){ + foreach(Utils::stringifyKeys($groups) as $groupName => $lines){ $result[] = $groupName; foreach($lines as $line){ $result[] = " $line"; From 9db7e5f0ca984f17d6a8218d1c74b9be1c605863 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 01:19:17 +0100 Subject: [PATCH 0787/1858] Be more concise in event handler timing names --- src/plugin/PluginManager.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index d109b23fac..0cd3e23b1d 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -63,6 +63,7 @@ use function realpath; use function shuffle; use function sprintf; use function str_contains; +use function str_starts_with; use function strtolower; /** @@ -651,6 +652,11 @@ class PluginManager{ throw new PluginException("Plugin attempted to register event handler " . $handlerName . "() to event " . $event . " while not enabled"); } + $prefix = $plugin->getDescription()->getSrcNamespacePrefix(); + if(str_starts_with($handlerName, $prefix)){ + $handlerName = substr($handlerName, strlen($prefix) + 1); + } + $timings = new TimingsHandler($handlerName . "(" . (new \ReflectionClass($event))->getShortName() . ")", group: $plugin->getDescription()->getFullName()); $registeredListener = new RegisteredListener($handler, $priority, $plugin, $handleCancelled, $timings); From 1959d6dc9be569510a2fac866217acd489aa82d4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 12:59:26 +0100 Subject: [PATCH 0788/1858] Fix CS --- src/plugin/PluginManager.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 0cd3e23b1d..09d98e5df6 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -64,7 +64,9 @@ use function shuffle; use function sprintf; use function str_contains; use function str_starts_with; +use function strlen; use function strtolower; +use function substr; /** * Manages all the plugins From eca9fe50b61d678a0e826b8864632ee169bdb710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:03:30 +0100 Subject: [PATCH 0789/1858] Bump build/php from `a464454` to `9d8807b` (#5654) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `a464454` to `9d8807b`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/a464454d1ed946baabd32a02ddcf66361374b99c...9d8807be825b3fafd420534f2c29351c1bda6398) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index a464454d1e..9d8807be82 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a464454d1ed946baabd32a02ddcf66361374b99c +Subproject commit 9d8807be825b3fafd420534f2c29351c1bda6398 From 58974765a68f63a9968a7ff3a06f584ff2ee08d2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 13:03:01 +0100 Subject: [PATCH 0790/1858] InGamePacketHandler: fixed crash when attempting to drop more of an item than is available --- src/network/mcpe/handler/InGamePacketHandler.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 213ce2b8c5..3e08259158 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -415,6 +415,9 @@ class InGamePacketHandler extends PacketHandler{ } $sourceSlotItem = $inventory->getItem($sourceSlot); + if($sourceSlotItem->getCount() < $droppedCount){ + return false; + } $serverItemStack = TypeConverter::getInstance()->coreItemStackToNet($sourceSlotItem); //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known //itemstack info with the one the client sent. This is costly, but we don't have any other option :( From 811639f2cdfead34cc0412f9fc76584661226ebf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 13:26:14 +0100 Subject: [PATCH 0791/1858] InGamePacketHandler: relax errors on normal transactions to fix book editing for some reason book edits generate a transaction in addition to BookEditPacket. PM has never used the transaction, and it doesn't pass anyway because CreateItemAction can't be used in survival mode. However, since the strict validation introduced since ItemStackRequest, this dud transaction now causes the player to get kicked without these changes. --- .../mcpe/handler/InGamePacketHandler.php | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 3e08259158..6227e2a5af 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -377,13 +377,21 @@ class InGamePacketHandler extends PacketHandler{ } private function handleNormalTransaction(NormalTransactionData $data, int $itemStackRequestId) : bool{ - //When the ItemStackRequest system is used, this transaction type is only used for dropping items by pressing Q. + //When the ItemStackRequest system is used, this transaction type is used for dropping items by pressing Q. //I don't know why they don't just use ItemStackRequest for that too, which already supports dropping items by //clicking them outside an open inventory menu, but for now it is what it is. - //Fortunately, this means we can be extremely strict about the validation criteria. + //Fortunately, this means we can be much stricter about the validation criteria. - if(count($data->getActions()) > 2){ - throw new PacketHandlingException("Expected exactly 2 actions for dropping an item"); + $actionCount = count($data->getActions()); + if($actionCount > 2){ + if($actionCount > 5){ + throw new PacketHandlingException("Too many actions ($actionCount) in normal inventory transaction"); + } + + //Due to a bug in the game, this transaction type is still sent when a player edits a book. We don't need + //these transactions for editing books, since we have BookEditPacket, so we can just ignore them. + $this->session->getLogger()->debug("Ignoring normal inventory transaction with $actionCount actions (drop-item should have exactly 2 actions)"); + return false; } $sourceSlot = null; @@ -401,11 +409,13 @@ class InGamePacketHandler extends PacketHandler{ $sourceSlot = $networkInventoryAction->inventorySlot; $clientItemStack = $networkInventoryAction->oldItem->getItemStack(); }else{ - throw new PacketHandlingException("Unexpected action type in drop item transaction"); + $this->session->getLogger()->debug("Unexpected inventory action type $networkInventoryAction->sourceType in drop item transaction"); + return false; } } if($sourceSlot === null || $clientItemStack === null || $droppedCount === null){ - throw new PacketHandlingException("Missing information in drop item transaction, need source slot, client item stack and dropped count"); + $this->session->getLogger()->debug("Missing information in drop item transaction, need source slot, client item stack and dropped count"); + return false; } $inventory = $this->player->getInventory(); From 3ee62d84402ec92706defd4132ce137a59f5242b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 15:44:42 +0100 Subject: [PATCH 0792/1858] InGamePacketHandler: increase max ItemStackRequest actions to 60 due to implementation quirks + some unforeseen ways these actions can behave, there can be as many as 53 actions in a single crafting request. This is an edge case, but it has to be catered for. --- src/network/mcpe/handler/InGamePacketHandler.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 6227e2a5af..5ee45347e9 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -558,8 +558,17 @@ class InGamePacketHandler extends PacketHandler{ } private function handleSingleItemStackRequest(ItemStackRequest $request) : ItemStackResponse{ - if(count($request->getActions()) > 20){ - //TODO: we can probably lower this limit, but this will do for now + if(count($request->getActions()) > 60){ + //recipe book auto crafting can affect all slots of the inventory when consuming inputs or producing outputs + //this means there could be as many as 50 CraftingConsumeInput actions or Place (taking the result) actions + //in a single request (there are certain ways items can be arranged which will result in the same stack + //being taken from multiple times, but this is behaviour with a calculable limit) + //this means there SHOULD be AT MOST 53 actions in a single request, but 60 is a nice round number. + //n64Stacks = ? + //n1Stacks = 45 - n64Stacks + //nItemsRequiredFor1Craft = 9 + //nResults = floor((n1Stacks + (n64Stacks * 64)) / nItemsRequiredFor1Craft) + //nTakeActionsTotal = floor(64 / nResults) + max(1, 64 % nResults) + ((nResults * nItemsRequiredFor1Craft) - (n64Stacks * 64)) throw new PacketHandlingException("Too many actions in ItemStackRequest"); } $executor = new ItemStackRequestExecutor($this->player, $this->inventoryManager, $request); From af385668c2bb7b91595ef4d3f7edb90d854fb04f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 17:55:39 +0100 Subject: [PATCH 0793/1858] InventoryManager: give more detailed information on failure to get info for held item --- src/network/mcpe/InventoryManager.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 35a45956bc..a651b92135 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -576,9 +576,13 @@ class InventoryManager{ $playerInventory = $this->player->getInventory(); $selected = $playerInventory->getHeldItemIndex(); if($selected !== $this->clientSelectedHotbarSlot){ - $itemStackInfo = $this->getItemStackInfo($playerInventory, $selected); + $inventoryEntry = $this->inventories[spl_object_id($playerInventory)] ?? null; + if($inventoryEntry === null){ + throw new AssumptionFailedError("Player inventory should always be tracked"); + } + $itemStackInfo = $inventoryEntry->itemStackInfos[$selected] ?? null; if($itemStackInfo === null){ - throw new AssumptionFailedError("Player inventory slots should always be tracked"); + throw new AssumptionFailedError("Untracked player inventory slot $selected"); } $this->session->sendDataPacket(MobEquipmentPacket::create( From cd603e82663937fa6660c78842a657acfbcc4bab Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 18:03:16 +0100 Subject: [PATCH 0794/1858] Release 4.18.1 --- changelogs/4.18.md | 14 +++++++++++++- src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/changelogs/4.18.md b/changelogs/4.18.md index b7b7509a68..4007b206c7 100644 --- a/changelogs/4.18.md +++ b/changelogs/4.18.md @@ -77,4 +77,16 @@ Released 25th March 2023. - Packet batch limit has been lowered to `100` packets. With the introduction of `ItemStackRequest`, this is more than sufficient for normal gameplay. ### Other -- Use `Vector3::zero()` instead of `new Vector3()` in some places. \ No newline at end of file +- Use `Vector3::zero()` instead of `new Vector3()` in some places. + +# 4.18.1 +Released 27th March 2023. + +## General +- `RakLibInterface` now logs the name of the currently active session if a crash occurs when processing a packet. This makes it easier to reproduce bugs, which is important to be able to fix them. +- Added more detailed debugging information to `InventoryManager->syncSelectedHotbarSlot()`. + +## Fixes +- Fixed server crash when attempting to drop more of an item from a stack than available in the inventory. +- Fixed packet processing errors when editing writable books. +- Fixed packet processing errors when shift-clicking on the recipe book to craft recipes which draw from a large number of inventory slots. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1f293e9a7c..fcece5e89c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.18.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From beb0713a40ee2c07d47b0a3d9020616752ddf933 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Mar 2023 18:03:17 +0100 Subject: [PATCH 0795/1858] 4.18.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index fcece5e89c..14e4d3883d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From bea878e9e91f377046bfe1e2b7d88b77f2a5544f Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:17:08 -0500 Subject: [PATCH 0796/1858] Implement anvil fall damage (#5312) --- src/block/Anvil.php | 8 ++++++++ src/block/utils/Fallable.php | 12 ++++++++++++ src/block/utils/FallableTrait.php | 8 ++++++++ src/entity/Living.php | 14 ++++++++++++++ src/entity/object/FallingBlock.php | 20 ++++++++++++++++++-- src/event/entity/EntityDamageEvent.php | 2 ++ src/event/player/PlayerDeathEvent.php | 14 ++++++++++++++ 7 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 17814e2c90..edfb9491de 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -107,6 +107,14 @@ class Anvil extends Transparent implements Fallable{ return true; } + public function getFallDamagePerBlock() : float{ + return 2.0; + } + + public function getMaxFallDamage() : float{ + return 40.0; + } + public function getLandSound() : ?Sound{ return new AnvilFallSound(); } diff --git a/src/block/utils/Fallable.php b/src/block/utils/Fallable.php index 74f96ac8b6..8f0dbc8348 100644 --- a/src/block/utils/Fallable.php +++ b/src/block/utils/Fallable.php @@ -42,6 +42,18 @@ interface Fallable{ */ public function onHitGround(FallingBlock $blockEntity) : bool; + /** + * Returns the damage caused per fallen block. This is multiplied by the fall distance (and capped according to + * {@link Fallable::getMaxFallDamage()}) to calculate the damage dealt to any entities who intersect with the block + * when it hits the ground. + */ + public function getFallDamagePerBlock() : float; + + /** + * Returns the maximum damage the block can deal to an entity when it hits the ground. + */ + public function getMaxFallDamage() : float; + /** * Returns the sound that will be played when FallingBlock hits the ground. */ diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index d13a7f794f..f062792efa 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -64,6 +64,14 @@ trait FallableTrait{ return true; } + public function getFallDamagePerBlock() : float{ + return 0.0; + } + + public function getMaxFallDamage() : float{ + return 0.0; + } + public function getLandSound() : ?Sound{ return null; } diff --git a/src/entity/Living.php b/src/entity/Living.php index b30ab7f87b..29a8ceae8f 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -73,6 +73,7 @@ use function max; use function min; use function mt_getrandmax; use function mt_rand; +use function round; use function sqrt; use const M_PI; @@ -429,6 +430,10 @@ abstract class Living extends Entity{ $source->setModifier(-$source->getFinalDamage() * min(ceil(min($totalEpf, 25) * (mt_rand(50, 100) / 100)), 20) * 0.04, EntityDamageEvent::MODIFIER_ARMOR_ENCHANTMENTS); $source->setModifier(-min($this->getAbsorption(), $source->getFinalDamage()), EntityDamageEvent::MODIFIER_ABSORPTION); + + if($cause === EntityDamageEvent::CAUSE_FALLING_BLOCK && $this->armorInventory->getHelmet() instanceof Armor){ + $source->setModifier(-($source->getFinalDamage() / 4), EntityDamageEvent::MODIFIER_ARMOR_HELMET); + } } /** @@ -460,6 +465,15 @@ abstract class Living extends Entity{ if($damage > 0){ $attacker->attack(new EntityDamageByEntityEvent($this, $attacker, EntityDamageEvent::CAUSE_MAGIC, $damage)); } + + if($source->getModifier(EntityDamageEvent::MODIFIER_ARMOR_HELMET) < 0){ + $helmet = $this->armorInventory->getHelmet(); + if($helmet instanceof Armor){ + $finalDamage = $source->getFinalDamage(); + $this->damageItem($helmet, (int) round($finalDamage * 4 + lcg_value() * $finalDamage * 2)); + $this->armorInventory->setHelmet($helmet); + } + } } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 301d38b645..0371ec9501 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -30,8 +30,10 @@ use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; +use pocketmine\entity\Living; use pocketmine\entity\Location; use pocketmine\event\entity\EntityBlockChangeEvent; +use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; @@ -44,6 +46,8 @@ use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\sound\BlockBreakSound; use function abs; +use function min; +use function round; class FallingBlock extends Entity{ private const TAG_FALLING_BLOCK = "FallingBlock"; //TAG_Compound @@ -156,8 +160,20 @@ class FallingBlock extends Entity{ } protected function onHitGround() : ?float{ - if($this->block instanceof Fallable && !$this->block->onHitGround($this)){ - $this->flagForDespawn(); + if($this->block instanceof Fallable){ + $damagePerBlock = $this->block->getFallDamagePerBlock(); + if($damagePerBlock > 0 && ($fallenBlocks = round($this->fallDistance) - 1) > 0){ + $damage = min($fallenBlocks * $damagePerBlock, $this->block->getMaxFallDamage()); + foreach($this->getWorld()->getCollidingEntities($this->getBoundingBox()) as $entity){ + if($entity instanceof Living){ + $ev = new EntityDamageByEntityEvent($this, $entity, EntityDamageEvent::CAUSE_FALLING_BLOCK, $damage); + $entity->attack($ev); + } + } + } + if(!$this->block->onHitGround($this)){ + $this->flagForDespawn(); + } } return null; } diff --git a/src/event/entity/EntityDamageEvent.php b/src/event/entity/EntityDamageEvent.php index edb44f1f71..7c3e2aaa40 100644 --- a/src/event/entity/EntityDamageEvent.php +++ b/src/event/entity/EntityDamageEvent.php @@ -46,6 +46,7 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{ public const MODIFIER_TOTEM = 8; public const MODIFIER_WEAPON_ENCHANTMENTS = 9; public const MODIFIER_PREVIOUS_DAMAGE_COOLDOWN = 10; + public const MODIFIER_ARMOR_HELMET = 11; public const CAUSE_CONTACT = 0; public const CAUSE_ENTITY_ATTACK = 1; @@ -63,6 +64,7 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{ public const CAUSE_MAGIC = 13; public const CAUSE_CUSTOM = 14; public const CAUSE_STARVATION = 15; + public const CAUSE_FALLING_BLOCK = 16; private float $baseDamage; private float $originalBase; diff --git a/src/event/player/PlayerDeathEvent.php b/src/event/player/PlayerDeathEvent.php index dd7c21eb29..4a1632cfc5 100644 --- a/src/event/player/PlayerDeathEvent.php +++ b/src/event/player/PlayerDeathEvent.php @@ -25,6 +25,7 @@ namespace pocketmine\event\player; use pocketmine\block\BlockTypeIds; use pocketmine\entity\Living; +use pocketmine\entity\object\FallingBlock; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; @@ -155,6 +156,19 @@ class PlayerDeathEvent extends EntityDeathEvent{ case EntityDamageEvent::CAUSE_MAGIC: return KnownTranslationFactory::death_attack_magic($name); + case EntityDamageEvent::CAUSE_FALLING_BLOCK: + if($deathCause instanceof EntityDamageByEntityEvent){ + $e = $deathCause->getDamager(); + if($e instanceof FallingBlock){ + if($e->getBlock()->getTypeId() === BlockTypeIds::ANVIL){ + return KnownTranslationFactory::death_attack_anvil($name); + }else{ + return KnownTranslationFactory::death_attack_fallingBlock($name); + } + } + } + break; + case EntityDamageEvent::CAUSE_CUSTOM: break; From b49a9ae81d4346ee5952d79a259207b03579f6dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Mar 2023 17:25:17 +0100 Subject: [PATCH 0797/1858] Added timings for calling events this gives a somewhat better overview of events, particularly if many plugins are subscribed to the same costly event (e.g. PlayerMoveEvent). In addition, it allows us to see the frequency that events are occurring. --- src/event/Event.php | 5 +++++ src/timings/Timings.php | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/event/Event.php b/src/event/Event.php index 7437283aca..df0f6bb03a 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -26,6 +26,7 @@ declare(strict_types=1); */ namespace pocketmine\event; +use pocketmine\timings\Timings; use function get_class; abstract class Event{ @@ -51,6 +52,9 @@ abstract class Event{ throw new \RuntimeException("Recursive event call detected (reached max depth of " . self::MAX_EVENT_CALL_DEPTH . " calls)"); } + $timings = Timings::getEventTimings($this); + $timings->startTiming(); + $handlerList = HandlerListManager::global()->getListFor(get_class($this)); ++self::$eventCallDepth; @@ -67,6 +71,7 @@ abstract class Event{ } }finally{ --self::$eventCallDepth; + $timings->stopTiming(); } } } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 6688601328..4525c217d2 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -28,6 +28,8 @@ use pocketmine\entity\Entity; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\scheduler\TaskHandler; +use function get_class; +use function str_starts_with; abstract class Timings{ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; @@ -153,6 +155,9 @@ abstract class Timings{ public static TimingsHandler $playerMove; + /** @var TimingsHandler[] */ + private static array $events = []; + public static function init() : void{ if(self::$initialized){ return; @@ -294,4 +299,18 @@ abstract class Timings{ return self::$packetSendTimingMap[$pid]; } + + public static function getEventTimings(Event $event) : TimingsHandler{ + $eventClass = get_class($event); + if(!isset(self::$events[$eventClass])){ + if(str_starts_with($eventClass, "pocketmine\\event\\")){ + $name = (new \ReflectionClass($event))->getShortName(); + }else{ + $name = $eventClass; + } + self::$events[$eventClass] = new TimingsHandler($name, group: "Events"); + } + + return self::$events[$eventClass]; + } } From 5e1f837a737466b00f1660b1b0d59f1cc03c7e54 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Mar 2023 22:46:18 +0100 Subject: [PATCH 0798/1858] ... --- src/timings/Timings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 4525c217d2..c420f796f6 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -25,6 +25,7 @@ namespace pocketmine\timings; use pocketmine\block\tile\Tile; use pocketmine\entity\Entity; +use pocketmine\event\Event; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\scheduler\TaskHandler; From bed218d1ddfd1dd8b041107c42079656250402d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:11:30 +0100 Subject: [PATCH 0799/1858] Fixed the first letter of event timing names getting trimmed off when src-namespace-prefix is not used --- src/plugin/PluginManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 09d98e5df6..c7a4063fc4 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -655,7 +655,7 @@ class PluginManager{ } $prefix = $plugin->getDescription()->getSrcNamespacePrefix(); - if(str_starts_with($handlerName, $prefix)){ + if(str_starts_with($handlerName, $prefix) && $prefix !== ""){ $handlerName = substr($handlerName, strlen($prefix) + 1); } From c3a16d9b1fe9089b7341ad68db3b997c03970795 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:31:46 +0100 Subject: [PATCH 0800/1858] ItemStackResponseBuilder: fixed durability appearing to reset when moving durables around the inventory closes #5656 --- src/network/mcpe/handler/ItemStackResponseBuilder.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 325a2b108b..68a549f219 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; use pocketmine\inventory\Inventory; +use pocketmine\item\Durable; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; @@ -91,7 +92,7 @@ final class ItemStackResponseBuilder{ $item->getCount(), $itemStackInfo->getStackId(), $item->getCustomName(), - 0 + $item instanceof Durable ? $item->getDamage() : 0, ); } } From dc1b5a92857d58facf17e06525b30e52c780816d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:46:28 +0100 Subject: [PATCH 0801/1858] it might help if we actually included the fix --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 4f7afd1485..1bc3c53705 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~1.1.1+bedrock-1.19.70", "pocketmine/bedrock-data": "~2.1.1+bedrock-1.19.70", "pocketmine/bedrock-item-upgrade-schema": "~1.1.0+bedrock-1.19.70", - "pocketmine/bedrock-protocol": "~20.0.0+bedrock-1.19.70", + "pocketmine/bedrock-protocol": "~20.1.1+bedrock-1.19.70", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 3305ea5b1a..8ee6f71cbe 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7c02da0a4bfc5f59effdf8e55b085c08", + "content-hash": "7c779ace575b5ef662eb5a6b0f173418", "packages": [ { "name": "adhocore/json-comment", @@ -328,16 +328,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "20.0.0+bedrock-1.19.70", + "version": "20.1.1+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "4892a5020187da805d7b46ab522d8185b0283726" + "reference": "455dbad93d29b4489b60910a41e38b8007b26563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/4892a5020187da805d7b46ab522d8185b0283726", - "reference": "4892a5020187da805d7b46ab522d8185b0283726", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/455dbad93d29b4489b60910a41e38b8007b26563", + "reference": "455dbad93d29b4489b60910a41e38b8007b26563", "shasum": "" }, "require": { @@ -351,7 +351,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.1", + "phpstan/phpstan": "1.10.7", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/20.0.0+bedrock-1.19.70" + "source": "https://github.com/pmmp/BedrockProtocol/tree/20.1.1+bedrock-1.19.70" }, - "time": "2023-03-14T17:06:38+00:00" + "time": "2023-03-29T22:38:17+00:00" }, { "name": "pocketmine/binaryutils", From 9e8c0a6beabf1fac7c81b1f9687ed998a630a5ca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:47:49 +0100 Subject: [PATCH 0802/1858] Release 4.17.2 --- changelogs/4.17.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.17.md b/changelogs/4.17.md index 58669cc250..aa50ccd5a5 100644 --- a/changelogs/4.17.md +++ b/changelogs/4.17.md @@ -31,3 +31,9 @@ Released 22nd March 2023. - Added version-specific channels to `update.pmmp.io`, such as `4`, `4.18-beta`, `4.17`, etc. - Replaced deprecated `::set-output` commands in GitHub Actions workflows. - `build/make-release.php` no longer automatically pushes changes, to avoid accidents when testing release workflows on forks. + +# 4.17.2 +Released 29th March 2023. + +## Fixes +- Fixed players being unable to join due to the appearance of a new `x5t` field in the JWT header of Xbox Live authentication tokens. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0a9abc9f84..22b95e3f5d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,7 +31,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.17.1"; + public const BASE_VERSION = "4.17.2"; public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; From 17a1266056e3aeaaf5e28db100137f05545ca549 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:52:31 +0100 Subject: [PATCH 0803/1858] Release 4.18.2 --- changelogs/4.18.md | 9 ++++++++- src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/changelogs/4.18.md b/changelogs/4.18.md index 4007b206c7..435784fb0f 100644 --- a/changelogs/4.18.md +++ b/changelogs/4.18.md @@ -89,4 +89,11 @@ Released 27th March 2023. ## Fixes - Fixed server crash when attempting to drop more of an item from a stack than available in the inventory. - Fixed packet processing errors when editing writable books. -- Fixed packet processing errors when shift-clicking on the recipe book to craft recipes which draw from a large number of inventory slots. \ No newline at end of file +- Fixed packet processing errors when shift-clicking on the recipe book to craft recipes which draw from a large number of inventory slots. + +# 4.18.2 +Released 29th March 2023. + +## Fixes +- Fixed players being unable to join due to the appearance of a new `x5t` field in the JWT header of Xbox Live authentication tokens. +- Fixed items' durability appearing to reset when moving them around in the inventory. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 14e4d3883d..82dfd68058 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.18.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From a78ae731199589e796c1b6f0daa97b5d790f2c38 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Mar 2023 23:52:31 +0100 Subject: [PATCH 0804/1858] 4.18.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 82dfd68058..0ac6813401 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 0c47455b2456cf2216b33eb2ea7a6ebd8ecdcf8a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 30 Mar 2023 18:12:06 +0100 Subject: [PATCH 0805/1858] Timings: ensure that Average Players count is shown properly when custom player classes are used --- src/timings/Timings.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 6688601328..e4f2538747 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -27,6 +27,7 @@ use pocketmine\block\tile\Tile; use pocketmine\entity\Entity; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; +use pocketmine\player\Player; use pocketmine\scheduler\TaskHandler; abstract class Timings{ @@ -236,8 +237,14 @@ abstract class Timings{ } public static function getEntityTimings(Entity $entity) : TimingsHandler{ - $entityType = (new \ReflectionClass($entity))->getShortName(); + $reflect = new \ReflectionClass($entity); + $entityType = $reflect->getShortName(); if(!isset(self::$entityTypeTimingMap[$entityType])){ + //the timings viewer calculates average player count by looking at this timer, so we need to ensure it has + //a name it can identify. However, we also want to make it obvious if this is a custom Player class. + if($entity instanceof Player && $reflect->getName() !== Player::class){ + $entityType = "Player (" . $reflect->getName() . ")"; + } self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick - " . $entityType, self::$tickEntity); } From 5ac0d7ae11d1302ab15757c295594f8ed17b800b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 17:08:59 +0100 Subject: [PATCH 0806/1858] TimingsRecord: fixed incorrect violations calculation closes #5665 --- src/timings/TimingsRecord.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index 8ee752ae2b..532d2eaee9 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\timings; use pocketmine\Server; -use function round; +use function floor; use function spl_object_id; /** @@ -56,7 +56,7 @@ final class TimingsRecord{ if($measure){ foreach(self::$records as $record){ if($record->curTickTotal > Server::TARGET_NANOSECONDS_PER_TICK){ - $record->violations += (int) round($record->curTickTotal / Server::TARGET_NANOSECONDS_PER_TICK); + $record->violations += (int) floor($record->curTickTotal / Server::TARGET_NANOSECONDS_PER_TICK); } $record->curTickTotal = 0; $record->curCount = 0; From a862cf5144fbac028b95c7c44fa54fce1ad4f9a4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 17:27:11 +0100 Subject: [PATCH 0807/1858] Workaround ItemStackRequest offhand incorrect slot bug closes #5667 this appears to be a client bug specific to ItemStackRequest. --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 7 ++++++- src/network/mcpe/handler/ItemStackResponseBuilder.php | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index bdc2937a5e..840a23cc1d 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -113,7 +113,12 @@ class ItemStackRequestExecutor{ */ protected function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ $windowId = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId()); - $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $info->getSlotId()); + $slotId = $info->getSlotId(); + if($info->getContainerId() === ContainerUIIds::OFFHAND && $slotId === 1){ + //TODO: HACK! The client sends an incorrect slot ID for the offhand as of 1.19.70 + $slotId = 0; + } + $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ throw new ItemStackRequestProcessException("No open inventory matches container UI ID: " . $info->getContainerId() . ", slot ID: " . $info->getSlotId()); } diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 68a549f219..2a55c2d95e 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -53,6 +53,10 @@ final class ItemStackResponseBuilder{ * @phpstan-return array{Inventory, int} */ private function getInventoryAndSlot(int $containerInterfaceId, int $slotId) : ?array{ + if($containerInterfaceId === ContainerUIIds::OFFHAND && $slotId === 1){ + //TODO: HACK! The client sends an incorrect slot ID for the offhand as of 1.19.70 + $slotId = 0; + } $windowId = ItemStackContainerIdTranslator::translate($containerInterfaceId, $this->inventoryManager->getCurrentWindowId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ From a2ff9649d5f9a14a2bb6e9ab7bab4ea731d225a3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 19:44:06 +0100 Subject: [PATCH 0808/1858] Timings: do not shorten event handler timing names this doesn't work very well in tree view timings --- src/timings/Timings.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index c420f796f6..dcabc3657c 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -304,12 +304,7 @@ abstract class Timings{ public static function getEventTimings(Event $event) : TimingsHandler{ $eventClass = get_class($event); if(!isset(self::$events[$eventClass])){ - if(str_starts_with($eventClass, "pocketmine\\event\\")){ - $name = (new \ReflectionClass($event))->getShortName(); - }else{ - $name = $eventClass; - } - self::$events[$eventClass] = new TimingsHandler($name, group: "Events"); + self::$events[$eventClass] = new TimingsHandler($eventClass, group: "Events"); } return self::$events[$eventClass]; From 4a770e5801c86cbfeb50c34a6713b2c101bacef6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 20:32:42 +0100 Subject: [PATCH 0809/1858] CS --- src/timings/Timings.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index dcabc3657c..8104ed192f 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -30,7 +30,6 @@ use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\scheduler\TaskHandler; use function get_class; -use function str_starts_with; abstract class Timings{ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; From 02e11b5a60f799bd9e4a793a5194c0b403814613 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 31 Mar 2023 21:26:58 +0100 Subject: [PATCH 0810/1858] Timings tree (#5587) Split timings into tree reports this will allow the timings site to display timings as a tree, instead of as a list as is done now, which will enable more precise identification of performance issues. An example of this can be seen here: https://timings.pmmp.io/?id=302629 The format changes are fully backwards compatible, as the timings site aggregates timings from timers with the same names, and doesn't limit how much extra data can appear at the end of a line. --- src/timings/TimingsHandler.php | 52 +++++++++++++++++++++++++++------- src/timings/TimingsRecord.php | 27 +++++++++++++++++- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index 3cf65c2033..231325c3ef 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -28,6 +28,8 @@ use pocketmine\Server; use pocketmine\utils\Utils; use function count; use function hrtime; +use function implode; +use function spl_object_id; class TimingsHandler{ private static bool $enabled = false; @@ -48,7 +50,16 @@ class TimingsHandler{ $avg = $time / $count; $group = $timings->getGroup(); - $groups[$group][] = $timings->getName() . " Time: $time Count: " . $count . " Avg: $avg Violations: " . $timings->getViolations(); + $groups[$group][] = implode(" ", [ + $timings->getName(), + "Time: $time", + "Count: $count", + "Avg: $avg", + "Violations: " . $timings->getViolations(), + "RecordId: " . $timings->getId(), + "ParentRecordId: " . ($timings->getParentId() ?? "none"), + "TimerId: " . $timings->getTimerId() + ]); } $result = []; @@ -107,9 +118,15 @@ class TimingsHandler{ } } - private ?TimingsRecord $record = null; + private ?TimingsRecord $rootRecord = null; private int $timingDepth = 0; + /** + * @var TimingsRecord[] + * @phpstan-var array + */ + private array $recordsByParent = []; + public function __construct( private string $name, private ?TimingsHandler $parent = null, @@ -128,13 +145,24 @@ class TimingsHandler{ private function internalStartTiming(int $now) : void{ if(++$this->timingDepth === 1){ - if($this->record === null){ - $this->record = new TimingsRecord($this); - } - $this->record->startTiming($now); if($this->parent !== null){ $this->parent->internalStartTiming($now); } + + $current = TimingsRecord::getCurrentRecord(); + if($current !== null){ + $record = $this->recordsByParent[spl_object_id($current)] ?? null; + if($record === null){ + $record = new TimingsRecord($this, $current); + $this->recordsByParent[spl_object_id($current)] = $record; + } + }else{ + if($this->rootRecord === null){ + $this->rootRecord = new TimingsRecord($this, null); + } + $record = $this->rootRecord; + } + $record->startTiming($now); } } @@ -155,9 +183,12 @@ class TimingsHandler{ return; } - if($this->record !== null){ - //this might be null if a timings reset occurred while the timer was running - $this->record->stopTiming($now); + $record = TimingsRecord::getCurrentRecord(); + if($record !== null){ + if($record->getTimerId() !== spl_object_id($this)){ + throw new \LogicException("Timer \"" . $record->getName() . "\" should have been stopped before stopping timer \"" . $this->name . "\""); + } + $record->stopTiming($now); } if($this->parent !== null){ $this->parent->internalStopTiming($now); @@ -184,6 +215,7 @@ class TimingsHandler{ * @internal */ public function destroyCycles() : void{ - $this->record = null; + $this->rootRecord = null; + $this->recordsByParent = []; } } diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index 8449a7e8d0..891f41b3f8 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\timings; use pocketmine\Server; +use pocketmine\utils\AssumptionFailedError; use function round; use function spl_object_id; @@ -39,11 +40,14 @@ final class TimingsRecord{ */ private static array $records = []; + private static ?self $currentRecord = null; + public static function clearRecords() : void{ foreach(self::$records as $record){ $record->handler->destroyCycles(); } self::$records = []; + self::$currentRecord = null; } /** @@ -81,11 +85,18 @@ final class TimingsRecord{ public function __construct( //I'm not the biggest fan of this cycle, but it seems to be the most effective way to avoid leaking anything. - private TimingsHandler $handler + private TimingsHandler $handler, + private ?TimingsRecord $parentRecord ){ self::$records[spl_object_id($this)] = $this; } + public function getId() : int{ return spl_object_id($this); } + + public function getParentId() : ?int{ return $this->parentRecord?->getId(); } + + public function getTimerId() : int{ return spl_object_id($this->handler); } + public function getName() : string{ return $this->handler->getName(); } public function getGroup() : string{ return $this->handler->getGroup(); } @@ -104,12 +115,22 @@ final class TimingsRecord{ public function startTiming(int $now) : void{ $this->start = $now; + self::$currentRecord = $this; } public function stopTiming(int $now) : void{ if($this->start == 0){ return; } + if(self::$currentRecord !== $this){ + if(self::$currentRecord === null){ + //timings may have been stopped while this timer was running + return; + } + + throw new AssumptionFailedError("stopTiming() called on a non-current timer"); + } + self::$currentRecord = $this->parentRecord; $diff = $now - $this->start; $this->totalTime += $diff; $this->curTickTotal += $diff; @@ -117,4 +138,8 @@ final class TimingsRecord{ ++$this->count; $this->start = 0; } + + public static function getCurrentRecord() : ?self{ + return self::$currentRecord; + } } From 199ef7401f0bf266362dd48ddd0611e3ca1b79ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 21:49:25 +0100 Subject: [PATCH 0811/1858] Revert "Timings: do not shorten event handler timing names" This reverts commit a2ff9649d5f9a14a2bb6e9ab7bab4ea731d225a3. --- src/timings/Timings.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 74567ce4ce..c569290786 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -310,7 +310,12 @@ abstract class Timings{ public static function getEventTimings(Event $event) : TimingsHandler{ $eventClass = get_class($event); if(!isset(self::$events[$eventClass])){ - self::$events[$eventClass] = new TimingsHandler($eventClass, group: "Events"); + if(str_starts_with($eventClass, "pocketmine\\event\\")){ + $name = (new \ReflectionClass($event))->getShortName(); + }else{ + $name = $eventClass; + } + self::$events[$eventClass] = new TimingsHandler($name, group: "Events"); } return self::$events[$eventClass]; From a6a360d1792317f57a44789d05cacd8186e3e79e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 21:51:00 +0100 Subject: [PATCH 0812/1858] Revert "Be more concise in event handler timing names" This reverts commit 9db7e5f0ca984f17d6a8218d1c74b9be1c605863. --- src/plugin/PluginManager.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index c7a4063fc4..d109b23fac 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -63,10 +63,7 @@ use function realpath; use function shuffle; use function sprintf; use function str_contains; -use function str_starts_with; -use function strlen; use function strtolower; -use function substr; /** * Manages all the plugins @@ -654,11 +651,6 @@ class PluginManager{ throw new PluginException("Plugin attempted to register event handler " . $handlerName . "() to event " . $event . " while not enabled"); } - $prefix = $plugin->getDescription()->getSrcNamespacePrefix(); - if(str_starts_with($handlerName, $prefix) && $prefix !== ""){ - $handlerName = substr($handlerName, strlen($prefix) + 1); - } - $timings = new TimingsHandler($handlerName . "(" . (new \ReflectionClass($event))->getShortName() . ")", group: $plugin->getDescription()->getFullName()); $registeredListener = new RegisteredListener($handler, $priority, $plugin, $handleCancelled, $timings); From 73522d06ef55623bbdeb6d1b6119af1e89e22483 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 31 Mar 2023 21:51:07 +0100 Subject: [PATCH 0813/1858] ... --- src/timings/Timings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index c569290786..864abf3913 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -31,6 +31,7 @@ use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\player\Player; use pocketmine\scheduler\TaskHandler; use function get_class; +use function str_starts_with; abstract class Timings{ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; From 6e8eda4ac1f08a15e0248e72a6751f0abd863d65 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Apr 2023 22:22:21 +0100 Subject: [PATCH 0814/1858] Fixed creative inventory items getting modified by ItemStackRequests --- src/inventory/CreativeInventory.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 25d3152a48..7d6754f8c0 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -27,6 +27,7 @@ use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; +use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function json_decode; @@ -60,11 +61,11 @@ final class CreativeInventory{ * @return Item[] */ public function getAll() : array{ - return $this->creative; + return Utils::cloneObjectArray($this->creative); } public function getItem(int $index) : ?Item{ - return $this->creative[$index] ?? null; + return isset($this->creative[$index]) ? clone $this->creative[$index] : null; } public function getItemIndex(Item $item) : int{ From 4bb8daa1a5006e5fc07ecb78e8f07e44fa72705b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Apr 2023 22:24:40 +0100 Subject: [PATCH 0815/1858] ItemStackRequestExecutor: allow any action to take from the created output slot fixes #5679 --- .../mcpe/handler/ItemStackRequestExecutor.php | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 840a23cc1d..81d820c2bb 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -147,6 +147,11 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ protected function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ + if($slotInfo->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $slotInfo->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ + //special case for the "created item" output slot + //TODO: do we need to send a response for this slot info? + return $this->takeCreatedItem($count); + } $this->requestSlotInfos[] = $slotInfo; [$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo); if($count < 1){ @@ -188,6 +193,13 @@ class ItemStackRequestExecutor{ $inventory->setItem($slot, $newItem); } + protected function dropItem(Item $item, int $count) : void{ + if($count < 1){ + throw new ItemStackRequestProcessException("Cannot drop less than 1 of an item"); + } + $this->builder->addAction(new DropItemAction((clone $item)->setCount($count))); + } + /** * @throws ItemStackRequestProcessException */ @@ -254,7 +266,7 @@ class ItemStackRequestExecutor{ /** * @throws ItemStackRequestProcessException */ - protected function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{ + protected function takeCreatedItem(int $count) : Item{ if($count < 1){ //this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits throw new ItemStackRequestProcessException("Cannot take less than 1 created item"); @@ -272,10 +284,12 @@ class ItemStackRequestExecutor{ } $this->createdItemsTakenCount += $count; - $this->addItemToSlot($destination, $createdItem, $count); + $createdItem = clone $createdItem; + $createdItem->setCount($count); if(!$this->createdItemFromCreativeInventory && $this->createdItemsTakenCount >= $createdItem->getCount()){ $this->setNextCreatedItem(null); } + return $createdItem; } /** @@ -299,14 +313,7 @@ class ItemStackRequestExecutor{ $action instanceof TakeStackRequestAction || $action instanceof PlaceStackRequestAction ){ - $source = $action->getSource(); - $destination = $action->getDestination(); - - if($source->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $source->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ - $this->takeCreatedItem($destination, $action->getCount()); - }else{ - $this->transferItems($source, $destination, $action->getCount()); - } + $this->transferItems($action->getSource(), $action->getDestination(), $action->getCount()); }elseif($action instanceof SwapStackRequestAction){ $this->requestSlotInfos[] = $action->getSlot1(); $this->requestSlotInfos[] = $action->getSlot2(); From 9cd07f6721fd38e5aa8ddf9cea548f39543a095d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Apr 2023 22:37:13 +0100 Subject: [PATCH 0816/1858] NetworkBroadcastUtils: remove dead code we don't allow changing the target list anymore, since it increases internal complexity, so this code is redundant. --- src/network/mcpe/NetworkBroadcastUtils.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/NetworkBroadcastUtils.php b/src/network/mcpe/NetworkBroadcastUtils.php index 8d04d35c53..ce173119e0 100644 --- a/src/network/mcpe/NetworkBroadcastUtils.php +++ b/src/network/mcpe/NetworkBroadcastUtils.php @@ -62,7 +62,6 @@ final class NetworkBroadcastUtils{ if($ev->isCancelled()){ return false; } - $sessions = $ev->getTargets(); /** @var PacketBroadcaster[] $uniqueBroadcasters */ $uniqueBroadcasters = []; From 2936726bf8a8e18cd07eaf5c0f563a50589f7916 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Apr 2023 22:46:14 +0100 Subject: [PATCH 0817/1858] Fixed packets sent by EntityEventBroadcaster not firing DataPacketSendEvent closes #5670 I'm not super happy with this fix, since it can still be broken if StandardPacketBroadcaster is replaced by something else. However, fixing that problem is probably going to require internal BC breaks, which are not suitable for a patch release. --- src/network/mcpe/NetworkBroadcastUtils.php | 7 ------- src/network/mcpe/StandardPacketBroadcaster.php | 10 ++++++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/network/mcpe/NetworkBroadcastUtils.php b/src/network/mcpe/NetworkBroadcastUtils.php index ce173119e0..76ae987384 100644 --- a/src/network/mcpe/NetworkBroadcastUtils.php +++ b/src/network/mcpe/NetworkBroadcastUtils.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use pocketmine\event\server\DataPacketSendEvent; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\player\Player; use pocketmine\timings\Timings; @@ -57,12 +56,6 @@ final class NetworkBroadcastUtils{ return false; } - $ev = new DataPacketSendEvent($sessions, $packets); - $ev->call(); - if($ev->isCancelled()){ - return false; - } - /** @var PacketBroadcaster[] $uniqueBroadcasters */ $uniqueBroadcasters = []; /** @var NetworkSession[][] $broadcasterTargets */ diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 1ed0f16aee..da9fa5101f 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; +use pocketmine\event\server\DataPacketSendEvent; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; @@ -41,6 +42,15 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ ){} public function broadcastPackets(array $recipients, array $packets) : void{ + //TODO: this shouldn't really be called here, since the broadcaster might be replaced by an alternative + //implementation that doesn't fire events + $ev = new DataPacketSendEvent($recipients, $packets); + $ev->call(); + if($ev->isCancelled()){ + return; + } + $packets = $ev->getPackets(); + $compressors = []; /** @var NetworkSession[][] $targetsByCompressor */ From 8b64ea9e658f92fddd8dbb0dd8e3826bf05e7d9c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:07:23 +0100 Subject: [PATCH 0818/1858] Release 4.18.3 --- changelogs/4.18.md | 12 ++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelogs/4.18.md b/changelogs/4.18.md index 435784fb0f..890f00d6d7 100644 --- a/changelogs/4.18.md +++ b/changelogs/4.18.md @@ -97,3 +97,15 @@ Released 29th March 2023. ## Fixes - Fixed players being unable to join due to the appearance of a new `x5t` field in the JWT header of Xbox Live authentication tokens. - Fixed items' durability appearing to reset when moving them around in the inventory. + +# 4.18.3 +Released 5th April 2023. + +## Fixes +- Fixed Average Players not being shown on timings reports when custom player classes are used. +- Fixed incorrect tick violation calculation in timings reports. +- Fixed not being able to add or remove items from the offhand slot. +- Fixed creative inventory item count corruption when taking items (some players would see 64x items in the creative inventory after rejoining or changing gamemode). +- Fixed not being able to drop items directly from the creative inventory on mobile. +- Fixed `DataPacketReceiveEvent` not being called for packets sent by `EntityEventBroadcaster`. +- `CreativeInventory::getItem()` and `CreativeInventory::getAll()` now return cloned itemstacks, to prevent accidental modification of the creative inventory. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0ac6813401..d6464302ff 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.18.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 9037d5f16b3e00fc1dcdef09883247adda547d4f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:07:38 +0100 Subject: [PATCH 0819/1858] 4.18.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d6464302ff..61ec22aec2 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 14c1a9550d51bc09fd425a412189941a35fbe3d6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:12:21 +0100 Subject: [PATCH 0820/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 37 +++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index 1bc3c53705..1eb2eb8665 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.7", + "phpstan/phpstan": "1.10.11", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 8d914bb31f..17a18e11ee 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7c779ace575b5ef662eb5a6b0f173418", + "content-hash": "6cd5185a409af08d842a5e41ba3b877b", "packages": [ { "name": "adhocore/json-comment", @@ -1884,16 +1884,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.7", + "version": "1.10.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975" + "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b10ceb526d9607903c5b2673f1fc8775dbe48975", - "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", + "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", "shasum": "" }, "require": { @@ -1942,7 +1942,7 @@ "type": "tidelift" } ], - "time": "2023-03-16T15:24:20+00:00" + "time": "2023-04-04T19:17:42+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -1998,16 +1998,16 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2" + "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b7dd96a5503919a43b3cd06a2dced9d4252492f2", - "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6", + "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6", "shasum": "" }, "require": { @@ -2041,9 +2041,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.0" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1" }, - "time": "2023-02-21T10:17:10+00:00" + "time": "2023-03-29T14:47:40+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2365,16 +2365,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.5", + "version": "9.6.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" + "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", - "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115", + "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115", "shasum": "" }, "require": { @@ -2447,7 +2447,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6" }, "funding": [ { @@ -2463,7 +2464,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T06:34:10+00:00" + "time": "2023-03-27T11:43:46+00:00" }, { "name": "sebastian/cli-parser", From 8ef2780dcdadf7684230f211da7bb6f0ace4c99d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:35:54 +0100 Subject: [PATCH 0821/1858] Use group format for tasks --- src/timings/Timings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 864abf3913..69047f8617 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -227,7 +227,7 @@ abstract class Timings{ } public static function getScheduledTaskTimings(TaskHandler $task, int $period) : TimingsHandler{ - $name = "Task: " . $task->getOwnerName() . " Runnable: " . $task->getTaskName(); + $name = "Task: " . $task->getTaskName(); if($period > 0){ $name .= "(interval:" . $period . ")"; @@ -236,7 +236,7 @@ abstract class Timings{ } if(!isset(self::$pluginTaskTimingMap[$name])){ - self::$pluginTaskTimingMap[$name] = new TimingsHandler($name, self::$schedulerSync); + self::$pluginTaskTimingMap[$name] = new TimingsHandler($name, self::$schedulerSync, $task->getOwnerName()); } return self::$pluginTaskTimingMap[$name]; From b2f755720ddf0da6c82dbab3b506284923346ae2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:47:47 +0100 Subject: [PATCH 0822/1858] Use a proper Breakdown timing group instead of the unwieldy INCLUDED_BY_OTHER_TIMINGS_PREFIX --- src/command/Command.php | 2 +- src/timings/Timings.php | 83 +++++++++++++++++++++----------------- src/world/WorldTimings.php | 34 ++++++++-------- 3 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/command/Command.php b/src/command/Command.php index 12a1b8e38b..7e67074ce7 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -139,7 +139,7 @@ abstract class Command{ public function setLabel(string $name) : bool{ $this->nextLabel = $name; if(!$this->isRegistered()){ - $this->timings = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Command: " . $name); + $this->timings = new TimingsHandler("Command: " . $name, group: Timings::GROUP_BREAKDOWN); $this->label = $name; return true; diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 69047f8617..07cd8e957f 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -34,7 +34,13 @@ use function get_class; use function str_starts_with; abstract class Timings{ + /** + * @deprecated This was used by the old timings viewer to make a timer appear in the Breakdown section of a timings + * report. Provide a group to your timer's constructor instead. + * @see Timings::GROUP_BREAKDOWN + */ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; + public const GROUP_BREAKDOWN = "Minecraft - Breakdown"; private static bool $initialized = false; @@ -167,8 +173,8 @@ abstract class Timings{ self::$initialized = true; self::$fullTick = new TimingsHandler("Full Server Tick"); - self::$serverTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Server Tick Update Cycle", self::$fullTick); - self::$serverInterrupts = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Server Mid-Tick Processing", self::$fullTick); + self::$serverTick = new TimingsHandler("Server Tick Update Cycle", self::$fullTick, group: self::GROUP_BREAKDOWN); + self::$serverInterrupts = new TimingsHandler("Server Mid-Tick Processing", self::$fullTick, group: self::GROUP_BREAKDOWN); self::$memoryManager = new TimingsHandler("Memory Manager"); self::$garbageCollector = new TimingsHandler("Garbage Collector", self::$memoryManager); self::$titleTick = new TimingsHandler("Console Title Tick"); @@ -176,21 +182,21 @@ abstract class Timings{ self::$connection = new TimingsHandler("Connection Handler"); self::$playerNetworkSend = new TimingsHandler("Player Network Send", self::$connection); - self::$playerNetworkSendCompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression", self::$playerNetworkSend); - self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress); - self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress); - self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend); - self::$playerNetworkSendInventorySync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Inventory Sync", self::$playerNetworkSend); + self::$playerNetworkSendCompress = new TimingsHandler("Player Network Send - Compression", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendCompressBroadcast = new TimingsHandler("Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler("Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendEncrypt = new TimingsHandler("Player Network Send - Encryption", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendInventorySync = new TimingsHandler("Player Network Send - Inventory Sync", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection); - self::$playerNetworkReceiveDecompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceive); - self::$playerNetworkReceiveDecrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decryption", self::$playerNetworkReceive); + self::$playerNetworkReceiveDecompress = new TimingsHandler("Player Network Receive - Decompression", self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); + self::$playerNetworkReceiveDecrypt = new TimingsHandler("Player Network Receive - Decryption", self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); - self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSend); + self::$broadcastPackets = new TimingsHandler("Broadcast Packets", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$playerMove = new TimingsHandler("Player Movement"); self::$playerChunkOrder = new TimingsHandler("Player Order Chunks"); - self::$playerChunkSend = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Chunks", self::$playerNetworkSend); + self::$playerChunkSend = new TimingsHandler("Player Network Send - Chunks", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$scheduler = new TimingsHandler("Scheduler"); self::$serverCommand = new TimingsHandler("Server Command"); self::$worldLoad = new TimingsHandler("World Load"); @@ -198,31 +204,31 @@ abstract class Timings{ self::$population = new TimingsHandler("World Population"); self::$generationCallback = new TimingsHandler("World Generation Callback"); self::$permissibleCalculation = new TimingsHandler("Permissible Calculation"); - self::$permissibleCalculationDiff = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Permissible Calculation - Diff", self::$permissibleCalculation); - self::$permissibleCalculationCallback = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Permissible Calculation - Callbacks", self::$permissibleCalculation); + self::$permissibleCalculationDiff = new TimingsHandler("Permissible Calculation - Diff", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); + self::$permissibleCalculationCallback = new TimingsHandler("Permissible Calculation - Callbacks", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load"); self::$syncPlayerDataSave = new TimingsHandler("Player Data Save"); - self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement"); - self::$entityMoveCollision = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement - Collision Checks", self::$entityMove); + self::$entityMove = new TimingsHandler("Entity Movement", group: self::GROUP_BREAKDOWN); + self::$entityMoveCollision = new TimingsHandler("Entity Movement - Collision Checks", self::$entityMove, group: self::GROUP_BREAKDOWN); - self::$projectileMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement", self::$entityMove); - self::$projectileMoveRayTrace = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement - Ray Tracing", self::$projectileMove); + self::$projectileMove = new TimingsHandler("Projectile Movement", self::$entityMove, group: self::GROUP_BREAKDOWN); + self::$projectileMoveRayTrace = new TimingsHandler("Projectile Movement - Ray Tracing", self::$projectileMove, group: self::GROUP_BREAKDOWN); - self::$playerCheckNearEntities = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities"); - self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick"); - self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick"); + self::$playerCheckNearEntities = new TimingsHandler("checkNearEntities", group: self::GROUP_BREAKDOWN); + self::$tickEntity = new TimingsHandler("Entity Tick", group: self::GROUP_BREAKDOWN); + self::$tickTileEntity = new TimingsHandler("Block Entity Tick", group: self::GROUP_BREAKDOWN); - self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick"); - self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - Living"); - self::$itemEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - ItemEntity"); + self::$entityBaseTick = new TimingsHandler("Entity Base Tick", group: self::GROUP_BREAKDOWN); + self::$livingEntityBaseTick = new TimingsHandler("Entity Base Tick - Living", group: self::GROUP_BREAKDOWN); + self::$itemEntityBaseTick = new TimingsHandler("Entity Base Tick - ItemEntity", group: self::GROUP_BREAKDOWN); - self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks"); - self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks"); + self::$schedulerSync = new TimingsHandler("Scheduler - Sync Tasks", group: self::GROUP_BREAKDOWN); + self::$schedulerAsync = new TimingsHandler("Scheduler - Async Tasks", group: self::GROUP_BREAKDOWN); - self::$playerCommand = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Command"); - self::$craftingDataCacheRebuild = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Build CraftingDataPacket Cache"); + self::$playerCommand = new TimingsHandler("Player Command", group: self::GROUP_BREAKDOWN); + self::$craftingDataCacheRebuild = new TimingsHandler("Build CraftingDataPacket Cache", group: self::GROUP_BREAKDOWN); } @@ -251,7 +257,7 @@ abstract class Timings{ if($entity instanceof Player && $reflect->getName() !== Player::class){ $entityType = "Player (" . $reflect->getName() . ")"; } - self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick - " . $entityType, self::$tickEntity); + self::$entityTypeTimingMap[$entityType] = new TimingsHandler("Entity Tick - " . $entityType, self::$tickEntity, group: self::GROUP_BREAKDOWN); } return self::$entityTypeTimingMap[$entityType]; @@ -260,7 +266,7 @@ abstract class Timings{ public static function getTileEntityTimings(Tile $tile) : TimingsHandler{ $tileType = (new \ReflectionClass($tile))->getShortName(); if(!isset(self::$tileEntityTypeTimingMap[$tileType])){ - self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick - " . $tileType, self::$tickTileEntity); + self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler("Block Entity Tick - " . $tileType, self::$tickTileEntity, group: self::GROUP_BREAKDOWN); } return self::$tileEntityTypeTimingMap[$tileType]; @@ -269,7 +275,7 @@ abstract class Timings{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ - self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Receive - " . $pk->getName(), self::$playerNetworkReceive); + self::$packetReceiveTimingMap[$pid] = new TimingsHandler("Receive - " . $pk->getName(), self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); } return self::$packetReceiveTimingMap[$pid]; @@ -278,31 +284,34 @@ abstract class Timings{ public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetDecodeTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Decode - " . $pk->getName(), - self::getReceiveDataPacketTimings($pk) + "Decode - " . $pk->getName(), + self::getReceiveDataPacketTimings($pk), + group: self::GROUP_BREAKDOWN ); } public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetHandleTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Handler - " . $pk->getName(), - self::getReceiveDataPacketTimings($pk) + "Handler - " . $pk->getName(), + self::getReceiveDataPacketTimings($pk), + group: self::GROUP_BREAKDOWN ); } public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler( - self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName(), - self::getSendDataPacketTimings($pk) + "Encode - " . $pk->getName(), + self::getSendDataPacketTimings($pk), + group: self::GROUP_BREAKDOWN ); } public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ - self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Send - " . $pk->getName(), self::$playerNetworkSend); + self::$packetSendTimingMap[$pid] = new TimingsHandler("Send - " . $pk->getName(), self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); } return self::$packetSendTimingMap[$pid]; diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index e6a5d6d60e..5a51f920b2 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -53,27 +53,27 @@ class WorldTimings{ public function __construct(World $world){ $name = $world->getFolderName() . " - "; - $this->setBlock = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "setBlock"); - $this->doBlockLightUpdates = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Block Light Updates"); - $this->doBlockSkyLightUpdates = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Sky Light Updates"); + $this->setBlock = new TimingsHandler($name . "setBlock", group: Timings::GROUP_BREAKDOWN); + $this->doBlockLightUpdates = new TimingsHandler($name . "Block Light Updates", group: Timings::GROUP_BREAKDOWN); + $this->doBlockSkyLightUpdates = new TimingsHandler($name . "Sky Light Updates", group: Timings::GROUP_BREAKDOWN); - $this->doChunkUnload = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Unload Chunks"); - $this->scheduledBlockUpdates = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Scheduled Block Updates"); - $this->randomChunkUpdates = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Random Chunk Updates"); - $this->randomChunkUpdatesChunkSelection = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Random Chunk Updates - Chunk Selection"); - $this->doChunkGC = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Garbage Collection"); - $this->entityTick = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Tick Entities"); + $this->doChunkUnload = new TimingsHandler($name . "Unload Chunks", group: Timings::GROUP_BREAKDOWN); + $this->scheduledBlockUpdates = new TimingsHandler($name . "Scheduled Block Updates", group: Timings::GROUP_BREAKDOWN); + $this->randomChunkUpdates = new TimingsHandler($name . "Random Chunk Updates", group: Timings::GROUP_BREAKDOWN); + $this->randomChunkUpdatesChunkSelection = new TimingsHandler($name . "Random Chunk Updates - Chunk Selection", group: Timings::GROUP_BREAKDOWN); + $this->doChunkGC = new TimingsHandler($name . "Garbage Collection", group: Timings::GROUP_BREAKDOWN); + $this->entityTick = new TimingsHandler($name . "Tick Entities", group: Timings::GROUP_BREAKDOWN); Timings::init(); //make sure the timers we want are available - $this->syncChunkSend = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Player Send Chunks", Timings::$playerChunkSend); - $this->syncChunkSendPrepare = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Player Send Chunk Prepare", Timings::$playerChunkSend); + $this->syncChunkSend = new TimingsHandler($name . "Player Send Chunks", Timings::$playerChunkSend, group: Timings::GROUP_BREAKDOWN); + $this->syncChunkSendPrepare = new TimingsHandler($name . "Player Send Chunk Prepare", Timings::$playerChunkSend, group: Timings::GROUP_BREAKDOWN); - $this->syncChunkLoad = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Load", Timings::$worldLoad); - $this->syncChunkLoadData = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Load - Data"); - $this->syncChunkLoadFixInvalidBlocks = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Load - Fix Invalid Blocks"); - $this->syncChunkLoadEntities = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Load - Entities"); - $this->syncChunkLoadTileEntities = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Load - TileEntities"); - $this->syncChunkSave = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . $name . "Chunk Save", Timings::$worldSave); + $this->syncChunkLoad = new TimingsHandler($name . "Chunk Load", Timings::$worldLoad, group: Timings::GROUP_BREAKDOWN); + $this->syncChunkLoadData = new TimingsHandler($name . "Chunk Load - Data", group: Timings::GROUP_BREAKDOWN); + $this->syncChunkLoadFixInvalidBlocks = new TimingsHandler($name . "Chunk Load - Fix Invalid Blocks", group: Timings::GROUP_BREAKDOWN); + $this->syncChunkLoadEntities = new TimingsHandler($name . "Chunk Load - Entities", group: Timings::GROUP_BREAKDOWN); + $this->syncChunkLoadTileEntities = new TimingsHandler($name . "Chunk Load - TileEntities", group: Timings::GROUP_BREAKDOWN); + $this->syncChunkSave = new TimingsHandler($name . "Chunk Save", Timings::$worldSave, group: Timings::GROUP_BREAKDOWN); $this->doTick = new TimingsHandler($name . "World Tick"); } From 61b0ad3e7fc984fcfcb6277163b64974f12f3a71 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 20:58:49 +0100 Subject: [PATCH 0823/1858] PreSpawnPacketHandler: added dedicated timer for the humongous amount of crap that has to be sent pre-spawn --- .../mcpe/handler/PreSpawnPacketHandler.php | 154 +++++++++--------- src/timings/Timings.php | 2 + 2 files changed, 82 insertions(+), 74 deletions(-) diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 8c47f65836..e914a0a2eb 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -44,6 +44,7 @@ use pocketmine\network\mcpe\protocol\types\PlayerMovementType; use pocketmine\network\mcpe\protocol\types\SpawnSettings; use pocketmine\player\Player; use pocketmine\Server; +use pocketmine\timings\Timings; use pocketmine\VersionInfo; use Ramsey\Uuid\Uuid; use function sprintf; @@ -60,89 +61,94 @@ class PreSpawnPacketHandler extends PacketHandler{ ){} public function setUp() : void{ - $location = $this->player->getLocation(); - $world = $location->getWorld(); + Timings::$playerNetworkSendPreSpawnGameData->startTiming(); + try{ + $location = $this->player->getLocation(); + $world = $location->getWorld(); - $this->session->getLogger()->debug("Preparing StartGamePacket"); - $levelSettings = new LevelSettings(); - $levelSettings->seed = -1; - $levelSettings->spawnSettings = new SpawnSettings(SpawnSettings::BIOME_TYPE_DEFAULT, "", DimensionIds::OVERWORLD); //TODO: implement this properly - $levelSettings->worldGamemode = TypeConverter::getInstance()->coreGameModeToProtocol($this->server->getGamemode()); - $levelSettings->difficulty = $world->getDifficulty(); - $levelSettings->spawnPosition = BlockPosition::fromVector3($world->getSpawnLocation()); - $levelSettings->hasAchievementsDisabled = true; - $levelSettings->time = $world->getTime(); - $levelSettings->eduEditionOffer = 0; - $levelSettings->rainLevel = 0; //TODO: implement these properly - $levelSettings->lightningLevel = 0; - $levelSettings->commandsEnabled = true; - $levelSettings->gameRules = [ - "naturalregeneration" => new BoolGameRule(false, false) //Hack for client side regeneration - ]; - $levelSettings->experiments = new Experiments([], false); + $this->session->getLogger()->debug("Preparing StartGamePacket"); + $levelSettings = new LevelSettings(); + $levelSettings->seed = -1; + $levelSettings->spawnSettings = new SpawnSettings(SpawnSettings::BIOME_TYPE_DEFAULT, "", DimensionIds::OVERWORLD); //TODO: implement this properly + $levelSettings->worldGamemode = TypeConverter::getInstance()->coreGameModeToProtocol($this->server->getGamemode()); + $levelSettings->difficulty = $world->getDifficulty(); + $levelSettings->spawnPosition = BlockPosition::fromVector3($world->getSpawnLocation()); + $levelSettings->hasAchievementsDisabled = true; + $levelSettings->time = $world->getTime(); + $levelSettings->eduEditionOffer = 0; + $levelSettings->rainLevel = 0; //TODO: implement these properly + $levelSettings->lightningLevel = 0; + $levelSettings->commandsEnabled = true; + $levelSettings->gameRules = [ + "naturalregeneration" => new BoolGameRule(false, false) //Hack for client side regeneration + ]; + $levelSettings->experiments = new Experiments([], false); - $this->session->sendDataPacket(StartGamePacket::create( - $this->player->getId(), - $this->player->getId(), - TypeConverter::getInstance()->coreGameModeToProtocol($this->player->getGamemode()), - $this->player->getOffsetPosition($location), - $location->pitch, - $location->yaw, - new CacheableNbt(CompoundTag::create()), //TODO: we don't care about this right now - $levelSettings, - "", - $this->server->getMotd(), - "", - false, - new PlayerMovementSettings(PlayerMovementType::SERVER_AUTHORITATIVE_V1, 0, false), - 0, - 0, - "", - true, - sprintf("%s %s", VersionInfo::NAME, VersionInfo::VERSION()->getFullVersion(true)), - Uuid::fromString(Uuid::NIL), - false, - [], - 0, - GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(), - )); + $this->session->sendDataPacket(StartGamePacket::create( + $this->player->getId(), + $this->player->getId(), + TypeConverter::getInstance()->coreGameModeToProtocol($this->player->getGamemode()), + $this->player->getOffsetPosition($location), + $location->pitch, + $location->yaw, + new CacheableNbt(CompoundTag::create()), //TODO: we don't care about this right now + $levelSettings, + "", + $this->server->getMotd(), + "", + false, + new PlayerMovementSettings(PlayerMovementType::SERVER_AUTHORITATIVE_V1, 0, false), + 0, + 0, + "", + true, + sprintf("%s %s", VersionInfo::NAME, VersionInfo::VERSION()->getFullVersion(true)), + Uuid::fromString(Uuid::NIL), + false, + [], + 0, + GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(), + )); - $this->session->getLogger()->debug("Sending actor identifiers"); - $this->session->sendDataPacket(StaticPacketCache::getInstance()->getAvailableActorIdentifiers()); + $this->session->getLogger()->debug("Sending actor identifiers"); + $this->session->sendDataPacket(StaticPacketCache::getInstance()->getAvailableActorIdentifiers()); - $this->session->getLogger()->debug("Sending biome definitions"); - $this->session->sendDataPacket(StaticPacketCache::getInstance()->getBiomeDefs()); + $this->session->getLogger()->debug("Sending biome definitions"); + $this->session->sendDataPacket(StaticPacketCache::getInstance()->getBiomeDefs()); - $this->session->getLogger()->debug("Sending attributes"); - $this->session->getEntityEventBroadcaster()->syncAttributes([$this->session], $this->player, $this->player->getAttributeMap()->getAll()); + $this->session->getLogger()->debug("Sending attributes"); + $this->session->getEntityEventBroadcaster()->syncAttributes([$this->session], $this->player, $this->player->getAttributeMap()->getAll()); - $this->session->getLogger()->debug("Sending available commands"); - $this->session->syncAvailableCommands(); + $this->session->getLogger()->debug("Sending available commands"); + $this->session->syncAvailableCommands(); - $this->session->getLogger()->debug("Sending abilities"); - $this->session->syncAbilities($this->player); - $this->session->syncAdventureSettings(); + $this->session->getLogger()->debug("Sending abilities"); + $this->session->syncAbilities($this->player); + $this->session->syncAdventureSettings(); - $this->session->getLogger()->debug("Sending effects"); - foreach($this->player->getEffects()->all() as $effect){ - $this->session->getEntityEventBroadcaster()->onEntityEffectAdded([$this->session], $this->player, $effect, false); + $this->session->getLogger()->debug("Sending effects"); + foreach($this->player->getEffects()->all() as $effect){ + $this->session->getEntityEventBroadcaster()->onEntityEffectAdded([$this->session], $this->player, $effect, false); + } + + $this->session->getLogger()->debug("Sending actor metadata"); + $this->player->sendData([$this->player]); + + $this->session->getLogger()->debug("Sending inventory"); + $this->inventoryManager->syncAll(); + $this->inventoryManager->syncSelectedHotbarSlot(); + + $this->session->getLogger()->debug("Sending creative inventory data"); + $this->inventoryManager->syncCreative(); + + $this->session->getLogger()->debug("Sending crafting data"); + $this->session->sendDataPacket(CraftingDataCache::getInstance()->getCache($this->server->getCraftingManager())); + + $this->session->getLogger()->debug("Sending player list"); + $this->session->syncPlayerList($this->server->getOnlinePlayers()); + }finally{ + Timings::$playerNetworkSendPreSpawnGameData->stopTiming(); } - - $this->session->getLogger()->debug("Sending actor metadata"); - $this->player->sendData([$this->player]); - - $this->session->getLogger()->debug("Sending inventory"); - $this->inventoryManager->syncAll(); - $this->inventoryManager->syncSelectedHotbarSlot(); - - $this->session->getLogger()->debug("Sending creative inventory data"); - $this->inventoryManager->syncCreative(); - - $this->session->getLogger()->debug("Sending crafting data"); - $this->session->sendDataPacket(CraftingDataCache::getInstance()->getCache($this->server->getCraftingManager())); - - $this->session->getLogger()->debug("Sending player list"); - $this->session->syncPlayerList($this->server->getOnlinePlayers()); } public function handleRequestChunkRadius(RequestChunkRadiusPacket $packet) : bool{ diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 07cd8e957f..9342c81be9 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -68,6 +68,7 @@ abstract class Timings{ public static $playerNetworkSendEncrypt; public static TimingsHandler $playerNetworkSendInventorySync; + public static TimingsHandler $playerNetworkSendPreSpawnGameData; /** @var TimingsHandler */ public static $playerNetworkReceive; @@ -187,6 +188,7 @@ abstract class Timings{ self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler("Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress, group: self::GROUP_BREAKDOWN); self::$playerNetworkSendEncrypt = new TimingsHandler("Player Network Send - Encryption", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$playerNetworkSendInventorySync = new TimingsHandler("Player Network Send - Inventory Sync", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendPreSpawnGameData = new TimingsHandler("Player Network Send - Pre-Spawn Game Data", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection); self::$playerNetworkReceiveDecompress = new TimingsHandler("Player Network Receive - Decompression", self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); From dbcd2b1e65c3dc46b7231521773d7aeef7c3dd1c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 21:04:00 +0100 Subject: [PATCH 0824/1858] ItemTypeIds::toBlockTypeId() now returns null for non-blockitem IDs closes #5648 --- src/item/ItemTypeIds.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 1808425555..ddde0d1cbb 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -320,9 +320,9 @@ final class ItemTypeIds{ return -$blockTypeId; } - public static function toBlockTypeId(int $itemTypeId) : int{ - if($itemTypeId > 0){ - throw new \InvalidArgumentException("Item type ID $itemTypeId does not represent a block"); + public static function toBlockTypeId(int $itemTypeId) : ?int{ + if($itemTypeId > 0){ //not a blockitem + return null; } return -$itemTypeId; } From f32a853bd4f9774a7e1357de9d0a3b871a5a9aff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 21:37:08 +0100 Subject: [PATCH 0825/1858] HandlerList: remove useless isset --- src/event/HandlerList.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 0e16555b38..40d4fc5666 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -76,9 +76,7 @@ class HandlerList{ } } }elseif($object instanceof RegisteredListener){ - if(isset($this->handlerSlots[$object->getPriority()][spl_object_id($object)])){ - unset($this->handlerSlots[$object->getPriority()][spl_object_id($object)]); - } + unset($this->handlerSlots[$object->getPriority()][spl_object_id($object)]); } } From 4724195791f3c8dee6d51677438d507a19b3a1a8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 5 Apr 2023 23:02:28 +0100 Subject: [PATCH 0826/1858] Improved performance of event calls This change significantly reduces the amount of work done by event handlers. Instead of traversing all of the priorities and event parent chain multiple times, we reduce event handlers down to a simple list, which doesn't require any logic to iterate over. Previously, calling an event with lots of parents costed more than an event which directly descended from Event. In addition, we had to do a lot of usually useless work to check all priorities, when in practice, only NORMAL will be used in almost all cases. This change makes it more cost effective to implement the feature suggested by #5678; however, it will still require additional changes. --- src/event/Event.php | 11 ++---- src/event/HandlerList.php | 49 +++++++++++++++++++++++++++ src/event/RegisteredListenerCache.php | 35 +++++++++++++++++++ 3 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 src/event/RegisteredListenerCache.php diff --git a/src/event/Event.php b/src/event/Event.php index df0f6bb03a..1ae7bb96f6 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -59,15 +59,8 @@ abstract class Event{ ++self::$eventCallDepth; try{ - foreach(EventPriority::ALL as $priority){ - $currentList = $handlerList; - while($currentList !== null){ - foreach($currentList->getListenersByPriority($priority) as $registration){ - $registration->callEvent($this); - } - - $currentList = $currentList->getParent(); - } + foreach($handlerList->getListenerList() as $registration){ + $registration->callEvent($this); } }finally{ --self::$eventCallDepth; diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 40d4fc5666..7774ea8406 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -31,6 +31,11 @@ class HandlerList{ /** @var RegisteredListener[][] */ private array $handlerSlots = []; + private RegisteredListenerCache $handlerCache; + + /** @var RegisteredListenerCache[] */ + private array $affectedHandlerCaches = []; + /** * @phpstan-template TEvent of Event * @phpstan-param class-string $class @@ -39,6 +44,11 @@ class HandlerList{ private string $class, private ?HandlerList $parentList ){ + $this->handlerCache = new RegisteredListenerCache(); + for($list = $this; $list !== null; $list = $list->parentList){ + $list->affectedHandlerCaches[spl_object_id($this->handlerCache)] = $this->handlerCache; + } + $this->handlerSlots = array_fill_keys(EventPriority::ALL, []); } @@ -50,6 +60,7 @@ class HandlerList{ throw new \InvalidArgumentException("This listener is already registered to priority {$listener->getPriority()} of event {$this->class}"); } $this->handlerSlots[$listener->getPriority()][spl_object_id($listener)] = $listener; + $this->invalidateAffectedCaches(); } /** @@ -59,6 +70,7 @@ class HandlerList{ foreach($listeners as $listener){ $this->register($listener); } + $this->invalidateAffectedCaches(); } /** @@ -78,10 +90,12 @@ class HandlerList{ }elseif($object instanceof RegisteredListener){ unset($this->handlerSlots[$object->getPriority()][spl_object_id($object)]); } + $this->invalidateAffectedCaches(); } public function clear() : void{ $this->handlerSlots = array_fill_keys(EventPriority::ALL, []); + $this->invalidateAffectedCaches(); } /** @@ -94,4 +108,39 @@ class HandlerList{ public function getParent() : ?HandlerList{ return $this->parentList; } + + /** + * Invalidates all known caches which might be affected by this list's contents. + */ + private function invalidateAffectedCaches() : void{ + foreach($this->affectedHandlerCaches as $cache){ + $cache->list = null; + } + } + + /** + * @return RegisteredListener[] + * @phpstan-return list + */ + public function getListenerList() : array{ + if($this->handlerCache->list !== null){ + return $this->handlerCache->list; + } + + $handlerLists = []; + for($currentList = $this; $currentList !== null; $currentList = $currentList->parentList){ + $handlerLists[] = $currentList; + } + + $listeners = []; + foreach(EventPriority::ALL as $priority){ + foreach($handlerLists as $currentList){ + foreach($currentList->getListenersByPriority($priority) as $registration){ + $listeners[] = $registration; + } + } + } + + return $this->handlerCache->list = $listeners; + } } diff --git a/src/event/RegisteredListenerCache.php b/src/event/RegisteredListenerCache.php new file mode 100644 index 0000000000..1b675c7169 --- /dev/null +++ b/src/event/RegisteredListenerCache.php @@ -0,0 +1,35 @@ + + */ + public ?array $list = null; +} From 734adec90d24b92bb17df46612f784c266a2e709 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Apr 2023 14:46:02 +0100 Subject: [PATCH 0827/1858] TimingsCommand: log the response body on failed paste --- src/command/defaults/TimingsCommand.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/command/defaults/TimingsCommand.php b/src/command/defaults/TimingsCommand.php index ecfa7b281c..60b4564b85 100644 --- a/src/command/defaults/TimingsCommand.php +++ b/src/command/defaults/TimingsCommand.php @@ -167,6 +167,7 @@ class TimingsCommand extends VanillaCommand{ Command::broadcastCommandMessage($sender, KnownTranslationFactory::pocketmine_command_timings_timingsRead( "https://" . $host . "/?id=" . $response["id"])); }else{ + $sender->getServer()->getLogger()->debug("Invalid response from timings server: " . $result->getBody()); Command::broadcastCommandMessage($sender, KnownTranslationFactory::pocketmine_command_timings_pasteError()); } } From bf84caa02c00a5ef3f280b35f8bd8a199235ff28 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Apr 2023 15:05:40 +0100 Subject: [PATCH 0828/1858] Timings: record peak tick time and active ticks this information is useful for determining the sizes of lag spikes, and giving more accurate average times. --- src/timings/TimingsHandler.php | 4 +++- src/timings/TimingsRecord.php | 20 ++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index 231325c3ef..e20adb6724 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -58,7 +58,9 @@ class TimingsHandler{ "Violations: " . $timings->getViolations(), "RecordId: " . $timings->getId(), "ParentRecordId: " . ($timings->getParentId() ?? "none"), - "TimerId: " . $timings->getTimerId() + "TimerId: " . $timings->getTimerId(), + "Ticks: " . $timings->getTicksActive(), + "Peak: " . $timings->getPeakTime(), ]); } $result = []; diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index 84b2c8a2bf..5254d2e7d0 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -59,11 +59,17 @@ final class TimingsRecord{ public static function tick(bool $measure = true) : void{ if($measure){ foreach(self::$records as $record){ - if($record->curTickTotal > Server::TARGET_NANOSECONDS_PER_TICK){ - $record->violations += (int) floor($record->curTickTotal / Server::TARGET_NANOSECONDS_PER_TICK); + if($record->curCount > 0){ + if($record->curTickTotal > Server::TARGET_NANOSECONDS_PER_TICK){ + $record->violations += (int) floor($record->curTickTotal / Server::TARGET_NANOSECONDS_PER_TICK); + } + if($record->curTickTotal > $record->peakTime){ + $record->peakTime = $record->curTickTotal; + } + $record->curTickTotal = 0; + $record->curCount = 0; + $record->ticksActive++; } - $record->curTickTotal = 0; - $record->curCount = 0; } }else{ foreach(self::$records as $record){ @@ -82,6 +88,8 @@ final class TimingsRecord{ private int $totalTime = 0; private int $curTickTotal = 0; private int $violations = 0; + private int $ticksActive = 0; + private int $peakTime = 0; public function __construct( //I'm not the biggest fan of this cycle, but it seems to be the most effective way to avoid leaking anything. @@ -113,6 +121,10 @@ final class TimingsRecord{ public function getViolations() : int{ return $this->violations; } + public function getTicksActive() : int{ return $this->ticksActive; } + + public function getPeakTime() : float{ return $this->peakTime; } + public function startTiming(int $now) : void{ $this->start = $now; self::$currentRecord = $this; From 1683aa681d2060d5474c7075a1a784aed50fc095 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Apr 2023 15:08:49 +0100 Subject: [PATCH 0829/1858] TimingsHandler: added format version --- src/timings/TimingsHandler.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index e20adb6724..b77610a655 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -32,6 +32,8 @@ use function implode; use function spl_object_id; class TimingsHandler{ + private const FORMAT_VERSION = 1; + private static bool $enabled = false; private static int $timingStart = 0; @@ -88,6 +90,7 @@ class TimingsHandler{ $result[] = "# Entities " . $entities; $result[] = "# LivingEntities " . $livingEntities; + $result[] = "# FormatVersion " . self::FORMAT_VERSION; $sampleTime = hrtime(true) - self::$timingStart; $result[] = "Sample time $sampleTime (" . ($sampleTime / 1000000000) . "s)"; From f5b4d646689948d8d3791380ac05161ef17c0730 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 7 Apr 2023 21:35:58 +0100 Subject: [PATCH 0830/1858] Player: increase max distance between movements to allow high levels of speed to work correctly speed 255 may allow the player to move as much as 14.8 blocks per tick when sprinting. --- src/player/Player.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 52eabac172..00f85b9ff9 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1231,7 +1231,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $revert = false; - if($distanceSquared > 100){ + if($distanceSquared > 225){ //15 blocks //TODO: this is probably too big if we process every movement /* !!! BEWARE YE WHO ENTER HERE !!! * @@ -1243,7 +1243,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * If you must tamper with this code, be aware that this can cause very nasty results. Do not waste our time * asking for help if you suffer the consequences of messing with this. */ - $this->logger->debug("Moved too fast, reverting movement"); + $this->logger->debug("Moved too fast (" . sqrt($distanceSquared) . " blocks in 1 movement), reverting movement"); $this->logger->debug("Old position: " . $oldPos->asVector3() . ", new position: " . $newPos); $revert = true; }elseif(!$this->getWorld()->isInLoadedTerrain($newPos)){ From 7b55c984bff7803209d9b24457031282dd31124b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 7 Apr 2023 21:40:46 +0100 Subject: [PATCH 0831/1858] InGamePacketHandler: reduce debug noise on outdated movements --- src/network/mcpe/handler/InGamePacketHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 5ee45347e9..37f23e158b 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -214,7 +214,7 @@ class InGamePacketHandler extends PacketHandler{ if($newPos->distanceSquared($curPos) > 1){ //Tolerate up to 1 block to avoid problems with client-sided physics when spawning in blocks $this->session->getLogger()->debug("Got outdated pre-teleport movement, received " . $newPos . ", expected " . $curPos); //Still getting movements from before teleport, ignore them - return false; + return true; } // Once we get a movement within a reasonable distance, treat it as a teleport ACK and remove position lock From d6c923b525a510c6c7675714b6286c53db3a89c4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 7 Apr 2023 22:33:30 +0100 Subject: [PATCH 0832/1858] ExperienceOrb: add get/setDespawnDelay closes #5645 the code for this is borrowed from ItemEntity. I didn't feel like a base class was appropriate, and we can't (yet) declare constants in traits. --- src/entity/object/ExperienceOrb.php | 36 ++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/entity/object/ExperienceOrb.php b/src/entity/object/ExperienceOrb.php index 2b5932e9c2..b2db156426 100644 --- a/src/entity/object/ExperienceOrb.php +++ b/src/entity/object/ExperienceOrb.php @@ -32,6 +32,7 @@ use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; use pocketmine\player\Player; +use function max; use function sqrt; class ExperienceOrb extends Entity{ @@ -48,6 +49,10 @@ class ExperienceOrb extends Entity{ /** Split sizes used for dropping experience orbs. */ public const ORB_SPLIT_SIZES = [2477, 1237, 617, 307, 149, 73, 37, 17, 7, 3, 1]; //This is indexed biggest to smallest so that we can return as soon as we found the biggest value. + public const DEFAULT_DESPAWN_DELAY = 6000; + public const NEVER_DESPAWN = -1; + public const MAX_DESPAWN_DELAY = 32767 + self::DEFAULT_DESPAWN_DELAY; //max value storable by mojang NBT :( + /** * Returns the largest size of normal XP orb that will be spawned for the specified amount of XP. Used to split XP * up into multiple orbs when an amount of XP is dropped. @@ -82,7 +87,10 @@ class ExperienceOrb extends Entity{ public $gravity = 0.04; public $drag = 0.02; - /** @var int */ + /** + * @var int + * @deprecated + */ protected $age = 0; /** @@ -100,6 +108,8 @@ class ExperienceOrb extends Entity{ /** @var int */ protected $xpValue; + private int $despawnDelay = self::DEFAULT_DESPAWN_DELAY; + public function __construct(Location $location, int $xpValue, ?CompoundTag $nbt = null){ $this->xpValue = $xpValue; parent::__construct($location, $nbt); @@ -111,12 +121,22 @@ class ExperienceOrb extends Entity{ parent::initEntity($nbt); $this->age = $nbt->getShort(self::TAG_AGE, 0); + if($this->age === -32768){ + $this->despawnDelay = self::NEVER_DESPAWN; + }else{ + $this->despawnDelay = max(0, self::DEFAULT_DESPAWN_DELAY - $this->age); + } } public function saveNBT() : CompoundTag{ $nbt = parent::saveNBT(); - $nbt->setShort(self::TAG_AGE, $this->age); + if($this->despawnDelay === self::NEVER_DESPAWN){ + $age = -32768; + }else{ + $age = self::DEFAULT_DESPAWN_DELAY - $this->despawnDelay; + } + $nbt->setShort(self::TAG_AGE, $age); $nbt->setShort(self::TAG_VALUE_PC, $this->getXpValue()); $nbt->setInt(self::TAG_VALUE_PE, $this->getXpValue()); @@ -124,6 +144,15 @@ class ExperienceOrb extends Entity{ return $nbt; } + public function getDespawnDelay() : int{ return $this->despawnDelay; } + + public function setDespawnDelay(int $despawnDelay) : void{ + if(($despawnDelay < 0 || $despawnDelay > self::MAX_DESPAWN_DELAY) && $despawnDelay !== self::NEVER_DESPAWN){ + throw new \InvalidArgumentException("Despawn ticker must be in range 0 ... " . self::MAX_DESPAWN_DELAY . " or " . self::NEVER_DESPAWN . ", got $despawnDelay"); + } + $this->despawnDelay = $despawnDelay; + } + public function getXpValue() : int{ return $this->xpValue; } @@ -161,7 +190,8 @@ class ExperienceOrb extends Entity{ $hasUpdate = parent::entityBaseTick($tickDiff); $this->age += $tickDiff; - if($this->age > 6000){ + $this->despawnDelay -= $tickDiff; + if($this->despawnDelay <= 0){ $this->flagForDespawn(); return true; } From 3ea8d27a3bdcf7866119928b4e0ee9d498bfdfe3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 7 Apr 2023 22:55:27 +0100 Subject: [PATCH 0833/1858] HandlerList: improve listener list development to make way for #5678 --- src/event/EventPriority.php | 2 ++ src/event/HandlerList.php | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/event/EventPriority.php b/src/event/EventPriority.php index cdeb3136a3..99c71faff6 100644 --- a/src/event/EventPriority.php +++ b/src/event/EventPriority.php @@ -32,6 +32,8 @@ use function mb_strtoupper; * LOWEST -> LOW -> NORMAL -> HIGH -> HIGHEST -> MONITOR * * MONITOR events should not change the event outcome or contents + * + * WARNING: If these values are changed, handler sorting in HandlerList::getListenerList() may need to be updated. */ final class EventPriority{ diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 7774ea8406..0bc2075604 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -24,8 +24,10 @@ declare(strict_types=1); namespace pocketmine\event; use pocketmine\plugin\Plugin; -use function array_fill_keys; +use function array_merge; +use function krsort; use function spl_object_id; +use const SORT_NUMERIC; class HandlerList{ /** @var RegisteredListener[][] */ @@ -48,8 +50,6 @@ class HandlerList{ for($list = $this; $list !== null; $list = $list->parentList){ $list->affectedHandlerCaches[spl_object_id($this->handlerCache)] = $this->handlerCache; } - - $this->handlerSlots = array_fill_keys(EventPriority::ALL, []); } /** @@ -94,7 +94,7 @@ class HandlerList{ } public function clear() : void{ - $this->handlerSlots = array_fill_keys(EventPriority::ALL, []); + $this->handlerSlots = []; $this->invalidateAffectedCaches(); } @@ -132,15 +132,17 @@ class HandlerList{ $handlerLists[] = $currentList; } - $listeners = []; - foreach(EventPriority::ALL as $priority){ - foreach($handlerLists as $currentList){ - foreach($currentList->getListenersByPriority($priority) as $registration){ - $listeners[] = $registration; - } + $listenersByPriority = []; + foreach($handlerLists as $currentList){ + foreach($currentList->handlerSlots as $priority => $listeners){ + $listenersByPriority[$priority] = array_merge($listenersByPriority[$priority] ?? [], $listeners); } } + //TODO: why on earth do the priorities have higher values for lower priority? + krsort($listenersByPriority, SORT_NUMERIC); + $listeners = array_merge(...$listenersByPriority); + return $this->handlerCache->list = $listeners; } } From 76ebedff6a999a4e1e5344d12323fa7a332206b1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 7 Apr 2023 22:58:30 +0100 Subject: [PATCH 0834/1858] HandlerList: remove unnecessary variable --- src/event/HandlerList.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 0bc2075604..692e8ac70d 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -141,8 +141,7 @@ class HandlerList{ //TODO: why on earth do the priorities have higher values for lower priority? krsort($listenersByPriority, SORT_NUMERIC); - $listeners = array_merge(...$listenersByPriority); - return $this->handlerCache->list = $listeners; + return $this->handlerCache->list = array_merge(...$listenersByPriority); } } From 24374297e7548e8f957c0eb4e470eecd6cc51eba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Apr 2023 13:53:15 +0100 Subject: [PATCH 0835/1858] NetworkSession: extract rate limiting functionality into its own unit, and apply a separate rate limit to game packets --- src/network/mcpe/NetworkSession.php | 48 ++++------------ src/network/mcpe/PacketRateLimiter.php | 80 ++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 37 deletions(-) create mode 100644 src/network/mcpe/PacketRateLimiter.php diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 92b916326f..a59d0ccc8f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -128,19 +128,14 @@ use function ucfirst; use const JSON_THROW_ON_ERROR; class NetworkSession{ - private const INCOMING_PACKET_BATCH_PER_TICK = 2; //usually max 1 per tick, but transactions may arrive separately - private const INCOMING_PACKET_BATCH_MAX_BUDGET = 100 * self::INCOMING_PACKET_BATCH_PER_TICK; //enough to account for a 5-second lag spike + private const INCOMING_PACKET_BATCH_PER_TICK = 2; //usually max 1 per tick, but transactions arrive separately + private const INCOMING_PACKET_BATCH_BUFFER_TICKS = 100; //enough to account for a 5-second lag spike - /** - * At most this many more packets can be received. If this reaches zero, any additional packets received will cause - * the player to be kicked from the server. - * This number is increased every tick up to a maximum limit. - * - * @see self::INCOMING_PACKET_BATCH_PER_TICK - * @see self::INCOMING_PACKET_BATCH_MAX_BUDGET - */ - private int $incomingPacketBatchBudget = self::INCOMING_PACKET_BATCH_MAX_BUDGET; - private int $lastPacketBudgetUpdateTimeNs; + private const INCOMING_GAME_PACKETS_PER_TICK = 2; + private const INCOMING_GAME_PACKETS_BUFFER_TICKS = 100; + + private PacketRateLimiter $packetBatchLimiter; + private PacketRateLimiter $gamePacketLimiter; private \PrefixedLogger $logger; private ?Player $player = null; @@ -196,7 +191,8 @@ class NetworkSession{ $this->disposeHooks = new ObjectSet(); $this->connectTime = time(); - $this->lastPacketBudgetUpdateTimeNs = hrtime(true); + $this->packetBatchLimiter = new PacketRateLimiter("Packet Batches", self::INCOMING_PACKET_BATCH_PER_TICK, self::INCOMING_PACKET_BATCH_BUFFER_TICKS); + $this->gamePacketLimiter = new PacketRateLimiter("Game Packets", self::INCOMING_GAME_PACKETS_PER_TICK, self::INCOMING_GAME_PACKETS_BUFFER_TICKS); $this->setHandler(new SessionStartPacketHandler( $this->server, @@ -339,13 +335,7 @@ class NetworkSession{ Timings::$playerNetworkReceive->startTiming(); try{ - if($this->incomingPacketBatchBudget <= 0){ - $this->updatePacketBudget(); - if($this->incomingPacketBatchBudget <= 0){ - throw new PacketHandlingException("Receiving packets too fast"); - } - } - $this->incomingPacketBatchBudget--; + $this->packetBatchLimiter->decrement(); if($this->cipher !== null){ Timings::$playerNetworkReceiveDecrypt->startTiming(); @@ -377,6 +367,7 @@ class NetworkSession{ $stream = new BinaryStream($decompressed); $count = 0; foreach(PacketBatch::decodeRaw($stream) as $buffer){ + $this->gamePacketLimiter->decrement(); if(++$count > 100){ throw new PacketHandlingException("Too many packets in batch"); } @@ -1105,23 +1096,6 @@ class NetworkSession{ $this->sendDataPacket(ToastRequestPacket::create($title, $body)); } - private function updatePacketBudget() : void{ - $nowNs = hrtime(true); - $timeSinceLastUpdateNs = $nowNs - $this->lastPacketBudgetUpdateTimeNs; - if($timeSinceLastUpdateNs > 50_000_000){ - $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); - /* - * If the server takes an abnormally long time to process a tick, add the budget for time difference to - * compensate. This extra budget may be very large, but it will disappear the next time a normal update - * occurs. This ensures that backlogs during a large lag spike don't cause everyone to get kicked. - * As long as all the backlogged packets are processed before the next tick, everything should be OK for - * clients behaving normally. - */ - $this->incomingPacketBatchBudget = min($this->incomingPacketBatchBudget, self::INCOMING_PACKET_BATCH_MAX_BUDGET) + (self::INCOMING_PACKET_BATCH_PER_TICK * 2 * $ticksSinceLastUpdate); - $this->lastPacketBudgetUpdateTimeNs = $nowNs; - } - } - public function tick() : void{ if(!$this->isConnected()){ $this->dispose(); diff --git a/src/network/mcpe/PacketRateLimiter.php b/src/network/mcpe/PacketRateLimiter.php new file mode 100644 index 0000000000..3a9dffa01f --- /dev/null +++ b/src/network/mcpe/PacketRateLimiter.php @@ -0,0 +1,80 @@ +maxBudget = $this->averagePerTick * $maxBufferTicks; + $this->budget = $this->maxBudget; + $this->lastUpdateTimeNs = hrtime(true); + } + + /** + * @throws PacketHandlingException if the rate limit has been exceeded + */ + public function decrement(int $amount = 1) : void{ + if($this->budget <= 0){ + $this->update(); + if($this->budget <= 0){ + throw new PacketHandlingException("Exceeded rate limit for \"$this->name\""); + } + } + $this->budget -= $amount; + } + + public function update() : void{ + $nowNs = hrtime(true); + $timeSinceLastUpdateNs = $nowNs - $this->lastUpdateTimeNs; + if($timeSinceLastUpdateNs > $this->updateFrequencyNs){ + $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, $this->updateFrequencyNs); + /* + * If the server takes an abnormally long time to process a tick, add the budget for time difference to + * compensate. This extra budget may be very large, but it will disappear the next time a normal update + * occurs. This ensures that backlogs during a large lag spike don't cause everyone to get kicked. + * As long as all the backlogged packets are processed before the next tick, everything should be OK for + * clients behaving normally. + */ + $this->budget = min($this->budget, $this->maxBudget) + ($this->averagePerTick * 2 * $ticksSinceLastUpdate); + $this->lastUpdateTimeNs = $nowNs; + } + } +} \ No newline at end of file From 017fcde6aab97e9e38dec4d60554760a5c7112fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Apr 2023 13:56:53 +0100 Subject: [PATCH 0836/1858] always the CS... --- src/network/mcpe/NetworkSession.php | 3 --- src/network/mcpe/PacketRateLimiter.php | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index a59d0ccc8f..7f07fbd77c 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -114,11 +114,8 @@ use function base64_encode; use function bin2hex; use function count; use function get_class; -use function hrtime; use function in_array; -use function intdiv; use function json_encode; -use function min; use function strcasecmp; use function strlen; use function strtolower; diff --git a/src/network/mcpe/PacketRateLimiter.php b/src/network/mcpe/PacketRateLimiter.php index 3a9dffa01f..3f0fbf768a 100644 --- a/src/network/mcpe/PacketRateLimiter.php +++ b/src/network/mcpe/PacketRateLimiter.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; use pocketmine\network\PacketHandlingException; +use function hrtime; use function intdiv; use function min; @@ -77,4 +78,4 @@ final class PacketRateLimiter{ $this->lastUpdateTimeNs = $nowNs; } } -} \ No newline at end of file +} From 3f821508378f1b8e0a50c61218d25cf4006885f5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Apr 2023 14:06:50 +0100 Subject: [PATCH 0837/1858] Update Composer dependencies --- composer.lock | 52 +++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/composer.lock b/composer.lock index 17a18e11ee..9dacda0efd 100644 --- a/composer.lock +++ b/composer.lock @@ -199,16 +199,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.1.0", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", "shasum": "" }, "require": { @@ -244,9 +244,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" }, - "time": "2022-12-08T20:46:14+00:00" + "time": "2023-04-09T17:37:40+00:00" }, { "name": "pocketmine/bedrock-block-upgrade-schema", @@ -328,16 +328,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "20.1.1+bedrock-1.19.70", + "version": "20.1.2+bedrock-1.19.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "455dbad93d29b4489b60910a41e38b8007b26563" + "reference": "2787c531039b3d92fa3ec92f28b95158dc24b915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/455dbad93d29b4489b60910a41e38b8007b26563", - "reference": "455dbad93d29b4489b60910a41e38b8007b26563", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/2787c531039b3d92fa3ec92f28b95158dc24b915", + "reference": "2787c531039b3d92fa3ec92f28b95158dc24b915", "shasum": "" }, "require": { @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/20.1.1+bedrock-1.19.70" + "source": "https://github.com/pmmp/BedrockProtocol/tree/20.1.2+bedrock-1.19.70" }, - "time": "2023-03-29T22:38:17+00:00" + "time": "2023-04-10T11:40:32+00:00" }, { "name": "pocketmine/binaryutils", @@ -512,23 +512,23 @@ }, { "name": "pocketmine/color", - "version": "0.3.0", + "version": "0.3.1", "source": { "type": "git", "url": "https://github.com/pmmp/Color.git", - "reference": "8cb346d0a21ad3287cc8d7175e4b643416607249" + "reference": "a0421f1e9e0b0c619300fb92d593283378f6a5e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Color/zipball/8cb346d0a21ad3287cc8d7175e4b643416607249", - "reference": "8cb346d0a21ad3287cc8d7175e4b643416607249", + "url": "https://api.github.com/repos/pmmp/Color/zipball/a0421f1e9e0b0c619300fb92d593283378f6a5e1", + "reference": "a0421f1e9e0b0c619300fb92d593283378f6a5e1", "shasum": "" }, "require": { "php": "^8.0" }, "require-dev": { - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.10.3", "phpstan/phpstan-strict-rules": "^1.2.0" }, "type": "library", @@ -544,9 +544,9 @@ "description": "Color handling library used by PocketMine-MP and related projects", "support": { "issues": "https://github.com/pmmp/Color/issues", - "source": "https://github.com/pmmp/Color/tree/0.3.0" + "source": "https://github.com/pmmp/Color/tree/0.3.1" }, - "time": "2022-12-18T19:49:21+00:00" + "time": "2023-04-10T11:38:05+00:00" }, { "name": "pocketmine/errorhandler", @@ -738,16 +738,16 @@ }, { "name": "pocketmine/nbt", - "version": "0.3.3", + "version": "0.3.4", "source": { "type": "git", "url": "https://github.com/pmmp/NBT.git", - "reference": "f4321be50df1a18b9f4e94d428a2e68a6e2ac2b4" + "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/NBT/zipball/f4321be50df1a18b9f4e94d428a2e68a6e2ac2b4", - "reference": "f4321be50df1a18b9f4e94d428a2e68a6e2ac2b4", + "url": "https://api.github.com/repos/pmmp/NBT/zipball/62c02464c6708b2467c1e1a2af01af09d5114eda", + "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda", "shasum": "" }, "require": { @@ -757,7 +757,7 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.7.7", + "phpstan/phpstan": "1.10.3", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -774,9 +774,9 @@ "description": "PHP library for working with Named Binary Tags", "support": { "issues": "https://github.com/pmmp/NBT/issues", - "source": "https://github.com/pmmp/NBT/tree/0.3.3" + "source": "https://github.com/pmmp/NBT/tree/0.3.4" }, - "time": "2022-07-06T14:13:26+00:00" + "time": "2023-04-10T11:31:20+00:00" }, { "name": "pocketmine/raklib", From f61f72180f2498648875ea7947e297b485fefccc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Apr 2023 14:17:53 +0100 Subject: [PATCH 0838/1858] Release 4.18.4 --- changelogs/4.18.md | 12 ++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelogs/4.18.md b/changelogs/4.18.md index 890f00d6d7..940a855bd0 100644 --- a/changelogs/4.18.md +++ b/changelogs/4.18.md @@ -109,3 +109,15 @@ Released 5th April 2023. - Fixed not being able to drop items directly from the creative inventory on mobile. - Fixed `DataPacketReceiveEvent` not being called for packets sent by `EntityEventBroadcaster`. - `CreativeInventory::getItem()` and `CreativeInventory::getAll()` now return cloned itemstacks, to prevent accidental modification of the creative inventory. + +# 4.18.4 +Released 10th April 2023. + +## Fixes +- Fixed movement becoming broken when the player moves at high speed (e.g. due to high levels of the Speed effect). +- Updated dependencies to get fixes in `pocketmine/nbt` and `pocketmine/bedrock-protocol`. + +## Internals +### Network +- Game packets are now rate-limited in a similar manner to packet batches. This helps to more effectively mitigate certain types of DoS attacks. +- Added a new class `PacketRateLimiter`, implementing functionality previously baked directly into `NetworkSession` in a more generic way to allow reuse. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 61ec22aec2..4f0dcddd53 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.18.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From e667b5c7db76c96ee23cdbce40958efedf309393 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Apr 2023 14:17:56 +0100 Subject: [PATCH 0839/1858] 4.18.5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4f0dcddd53..723613b39a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.18.5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 1c0eed56f1eb2940c0b5ffdc9c4df794bd14eaa4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 13:52:37 +0100 Subject: [PATCH 0840/1858] Added runtime test for event handler inheritance, to ensure I don't accidentally break it with optimisations --- .../src/EventHandlerInheritanceTest.php | 88 +++++++++++++++++++ tests/plugins/TesterPlugin/src/Main.php | 4 +- .../TesterPlugin/src/event/ChildEvent.php | 28 ++++++ .../src/event/GrandchildEvent.php | 28 ++++++ .../TesterPlugin/src/event/ParentEvent.php | 28 ++++++ 5 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php create mode 100644 tests/plugins/TesterPlugin/src/event/ChildEvent.php create mode 100644 tests/plugins/TesterPlugin/src/event/GrandchildEvent.php create mode 100644 tests/plugins/TesterPlugin/src/event/ParentEvent.php diff --git a/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php b/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php new file mode 100644 index 0000000000..efe20f8d8f --- /dev/null +++ b/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php @@ -0,0 +1,88 @@ +getPlugin(); + $plugin->getServer()->getPluginManager()->registerEvent( + ParentEvent::class, + function(ParentEvent $event) : void{ + $this->callOrder[] = ParentEvent::class; + }, + EventPriority::NORMAL, + $plugin + ); + $plugin->getServer()->getPluginManager()->registerEvent( + ChildEvent::class, + function(ChildEvent $event) : void{ + $this->callOrder[] = ChildEvent::class; + }, + EventPriority::NORMAL, + $plugin + ); + $plugin->getServer()->getPluginManager()->registerEvent( + GrandchildEvent::class, + function(GrandchildEvent $event) : void{ + $this->callOrder[] = GrandchildEvent::class; + }, + EventPriority::NORMAL, + $plugin + ); + + $event = new GrandchildEvent(); + $event->call(); + + if($this->callOrder === self::EXPECTED_ORDER){ + $this->setResult(Test::RESULT_OK); + }else{ + $plugin->getLogger()->error("Expected order: " . implode(", ", self::EXPECTED_ORDER) . ", got: " . implode(", ", $this->callOrder)); + $this->setResult(Test::RESULT_FAILED); + } + } +} diff --git a/tests/plugins/TesterPlugin/src/Main.php b/tests/plugins/TesterPlugin/src/Main.php index 2afd9d6aea..26d3441f4a 100644 --- a/tests/plugins/TesterPlugin/src/Main.php +++ b/tests/plugins/TesterPlugin/src/Main.php @@ -56,7 +56,9 @@ class Main extends PluginBase implements Listener{ } }), 10); - $this->waitingTests = []; + $this->waitingTests = [ + new EventHandlerInheritanceTest($this), + ]; } public function onServerCommand(CommandEvent $event) : void{ diff --git a/tests/plugins/TesterPlugin/src/event/ChildEvent.php b/tests/plugins/TesterPlugin/src/event/ChildEvent.php new file mode 100644 index 0000000000..b71d2627fc --- /dev/null +++ b/tests/plugins/TesterPlugin/src/event/ChildEvent.php @@ -0,0 +1,28 @@ + Date: Tue, 11 Apr 2023 20:01:19 +0100 Subject: [PATCH 0841/1858] Ticking chunks rewrite (#5689) This API is much more flexible than the old, allowing any arbitrary set of chunks to be ticked. These changes also improve the performance of random chunk ticking by almost entirely eliminating the cost of chunk selection. Ticking chunks are now reevaluated when a player moves, instead of every tick. The system also does not attempt to check the same chunks twice, leading to further improvements. Overall, the overhead of random chunk selection is reduced anywhere from 80-96%. In practice, this can offer a 5-10% performance gain for servers with sparsely distributed players. --- src/player/ChunkSelector.php | 16 ++--- src/player/Player.php | 36 ++++++++-- src/player/PlayerChunkLoader.php | 4 ++ src/world/ChunkTicker.php | 34 +++++++++ src/world/TickingChunkEntry.php | 34 +++++++++ src/world/TickingChunkLoader.php | 4 ++ src/world/World.php | 117 +++++++++++++++++++++++++++---- 7 files changed, 220 insertions(+), 25 deletions(-) create mode 100644 src/world/ChunkTicker.php create mode 100644 src/world/TickingChunkEntry.php diff --git a/src/player/ChunkSelector.php b/src/player/ChunkSelector.php index d88ef5fa44..feb1b25e21 100644 --- a/src/player/ChunkSelector.php +++ b/src/player/ChunkSelector.php @@ -54,23 +54,23 @@ final class ChunkSelector{ //If the chunk is in the radius, others at the same offsets in different quadrants are also guaranteed to be. /* Top right quadrant */ - yield World::chunkHash($centerX + $x, $centerZ + $z); + yield $subRadius => World::chunkHash($centerX + $x, $centerZ + $z); /* Top left quadrant */ - yield World::chunkHash($centerX - $x - 1, $centerZ + $z); + yield $subRadius => World::chunkHash($centerX - $x - 1, $centerZ + $z); /* Bottom right quadrant */ - yield World::chunkHash($centerX + $x, $centerZ - $z - 1); + yield $subRadius => World::chunkHash($centerX + $x, $centerZ - $z - 1); /* Bottom left quadrant */ - yield World::chunkHash($centerX - $x - 1, $centerZ - $z - 1); + yield $subRadius => World::chunkHash($centerX - $x - 1, $centerZ - $z - 1); if($x !== $z){ /* Top right quadrant mirror */ - yield World::chunkHash($centerX + $z, $centerZ + $x); + yield $subRadius => World::chunkHash($centerX + $z, $centerZ + $x); /* Top left quadrant mirror */ - yield World::chunkHash($centerX - $z - 1, $centerZ + $x); + yield $subRadius => World::chunkHash($centerX - $z - 1, $centerZ + $x); /* Bottom right quadrant mirror */ - yield World::chunkHash($centerX + $z, $centerZ - $x - 1); + yield $subRadius => World::chunkHash($centerX + $z, $centerZ - $x - 1); /* Bottom left quadrant mirror */ - yield World::chunkHash($centerX - $z - 1, $centerZ - $x - 1); + yield $subRadius => World::chunkHash($centerX - $z - 1, $centerZ - $x - 1); } } } diff --git a/src/player/Player.php b/src/player/Player.php index 00f85b9ff9..8b871bf3e0 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -121,6 +121,8 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\TextFormat; use pocketmine\world\ChunkListener; use pocketmine\world\ChunkListenerNoOpTrait; +use pocketmine\world\ChunkLoader; +use pocketmine\world\ChunkTicker; use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\sound\EntityAttackNoDamageSound; @@ -237,12 +239,16 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected array $loadQueue = []; protected int $nextChunkOrderRun = 5; + /** @var true[] */ + private array $tickingChunks = []; + protected int $viewDistance = -1; protected int $spawnThreshold; protected int $spawnChunkLoadCount = 0; protected int $chunksPerTick; protected ChunkSelector $chunkSelector; - protected PlayerChunkLoader $chunkLoader; + protected ChunkLoader $chunkLoader; + protected ChunkTicker $chunkTicker; /** @var bool[] map: raw UUID (string) => bool */ protected array $hiddenPlayers = []; @@ -308,8 +314,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->spawnThreshold = (int) (($this->server->getConfigGroup()->getPropertyInt("chunk-sending.spawn-radius", 4) ** 2) * M_PI); $this->chunkSelector = new ChunkSelector(); - $this->chunkLoader = new PlayerChunkLoader($spawnLocation); - + $this->chunkLoader = new class implements ChunkLoader{}; + $this->chunkTicker = new ChunkTicker(); $world = $spawnLocation->getWorld(); //load the spawn chunk so we can see the terrain $xSpawnChunk = $spawnLocation->getFloorX() >> Chunk::COORD_BIT_SIZE; @@ -747,6 +753,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $world->unregisterChunkLoader($this->chunkLoader, $x, $z); $world->unregisterChunkListener($this, $x, $z); unset($this->loadQueue[$index]); + $world->unregisterTickingChunk($this->chunkTicker, $x, $z); + unset($this->tickingChunks[$index]); } protected function spawnEntitiesOnAllChunks() : void{ @@ -798,6 +806,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ unset($this->loadQueue[$index]); $this->getWorld()->registerChunkLoader($this->chunkLoader, $X, $Z, true); $this->getWorld()->registerChunkListener($this, $X, $Z); + if(isset($this->tickingChunks[$index])){ + $this->getWorld()->registerTickingChunk($this->chunkTicker, $X, $Z); + } $this->getWorld()->requestChunkPopulation($X, $Z, $this->chunkLoader)->onCompletion( function() use ($X, $Z, $index, $world) : void{ @@ -895,16 +906,23 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ Timings::$playerChunkOrder->startTiming(); $newOrder = []; + $tickingChunks = []; $unloadChunks = $this->usedChunks; + $world = $this->getWorld(); + $tickingChunkRadius = $world->getChunkTickRadius(); + foreach($this->chunkSelector->selectChunks( $this->server->getAllowedViewDistance($this->viewDistance), $this->location->getFloorX() >> Chunk::COORD_BIT_SIZE, $this->location->getFloorZ() >> Chunk::COORD_BIT_SIZE - ) as $hash){ + ) as $radius => $hash){ if(!isset($this->usedChunks[$hash]) || $this->usedChunks[$hash]->equals(UsedChunkStatus::NEEDED())){ $newOrder[$hash] = true; } + if($radius < $tickingChunkRadius){ + $tickingChunks[$hash] = true; + } unset($unloadChunks[$hash]); } @@ -912,10 +930,18 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ World::getXZ($index, $X, $Z); $this->unloadChunk($X, $Z); } + foreach($this->tickingChunks as $hash => $_){ + //any chunks we encounter here are still used by the player, but may no longer be within ticking range + if(!isset($tickingChunks[$hash]) && !isset($newOrder[$hash])){ + World::getXZ($hash, $tickingChunkX, $tickingChunkZ); + $world->unregisterTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); + } + } $this->loadQueue = $newOrder; + $this->tickingChunks = $tickingChunks; + if(count($this->loadQueue) > 0 || count($unloadChunks) > 0){ - $this->chunkLoader->setCurrentLocation($this->location); $this->getNetworkSession()->syncViewAreaCenterPoint($this->location, $this->viewDistance); } diff --git a/src/player/PlayerChunkLoader.php b/src/player/PlayerChunkLoader.php index 65267642c1..175f242d34 100644 --- a/src/player/PlayerChunkLoader.php +++ b/src/player/PlayerChunkLoader.php @@ -26,6 +26,10 @@ namespace pocketmine\player; use pocketmine\math\Vector3; use pocketmine\world\TickingChunkLoader; +/** + * @deprecated This class was only needed to implement TickingChunkLoader, which is now deprecated. + * ChunkTicker should be registered on ticking chunks to make them tick instead. + */ final class PlayerChunkLoader implements TickingChunkLoader{ public function __construct(private Vector3 $currentLocation){} diff --git a/src/world/ChunkTicker.php b/src/world/ChunkTicker.php new file mode 100644 index 0000000000..c85c5f0e6d --- /dev/null +++ b/src/world/ChunkTicker.php @@ -0,0 +1,34 @@ + ChunkTicker + * @phpstan-var array + */ + public array $tickers = []; + + public bool $ready = false; +} diff --git a/src/world/TickingChunkLoader.php b/src/world/TickingChunkLoader.php index c081571c32..a44173c335 100644 --- a/src/world/TickingChunkLoader.php +++ b/src/world/TickingChunkLoader.php @@ -27,6 +27,10 @@ namespace pocketmine\world; * TickingChunkLoader includes all of the same functionality as ChunkLoader (it can be used in the same way). * However, using this version will also cause chunks around the loader's reported coordinates to get random block * updates. + * + * @deprecated + * @see World::registerTickingChunk() + * @see World::unregisterTickingChunk() */ interface TickingChunkLoader extends ChunkLoader{ diff --git a/src/world/World.php b/src/world/World.php index 34cc33bd73..31e0ba897b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -210,13 +210,24 @@ class World implements ChunkManager{ /** * @var TickingChunkLoader[] spl_object_id => TickingChunkLoader * @phpstan-var array + * + * @deprecated */ private array $tickingLoaders = []; /** * @var int[] spl_object_id => number of chunks * @phpstan-var array + * + * @deprecated */ private array $tickingLoaderCounter = []; + + /** + * @var TickingChunkEntry[] chunkHash => TickingChunkEntry + * @phpstan-var array + */ + private array $tickingChunks = []; + /** * @var ChunkLoader[][] chunkHash => [spl_object_id => ChunkLoader] * @phpstan-var array> @@ -1129,32 +1140,61 @@ class World implements ChunkManager{ } /** - * Returns the radius of chunks to be ticked around each ticking chunk loader (usually players). This is referred to - * as "simulation distance" in the Minecraft: Bedrock world options screen. + * Returns the radius of chunks to be ticked around each player. This is referred to as "simulation distance" in the + * Minecraft: Bedrock world options screen. */ public function getChunkTickRadius() : int{ return $this->chunkTickRadius; } /** - * Sets the radius of chunks ticked around each ticking chunk loader (usually players). + * Sets the radius of chunks ticked around each player. This may not take effect immediately, since each player + * needs to recalculate their tick radius. */ public function setChunkTickRadius(int $radius) : void{ $this->chunkTickRadius = $radius; } - private function tickChunks() : void{ - if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){ - return; + /** + * Instructs the World to tick the specified chunk, for as long as this chunk ticker (or any other chunk ticker) is + * registered to it. + */ + public function registerTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void{ + $chunkPosHash = World::chunkHash($chunkX, $chunkZ); + $entry = $this->tickingChunks[$chunkPosHash] ?? null; + if($entry === null){ + $entry = $this->tickingChunks[$chunkPosHash] = new TickingChunkEntry(); } + $entry->tickers[spl_object_id($ticker)] = $ticker; + } - $this->timings->randomChunkUpdatesChunkSelection->startTiming(); - - /** @var bool[] $chunkTickList chunkhash => dummy */ - $chunkTickList = []; - - $chunkTickableCache = []; + /** + * Unregisters the given chunk ticker from the specified chunk. If there are other tickers still registered to the + * chunk, it will continue to be ticked. + */ + public function unregisterTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void{ + $chunkHash = World::chunkHash($chunkX, $chunkZ); + $tickerId = spl_object_id($ticker); + if(isset($this->tickingChunks[$chunkHash]->tickers[$tickerId])){ + unset($this->tickingChunks[$chunkHash]->tickers[$tickerId]); + if(count($this->tickingChunks[$chunkHash]->tickers) === 0){ + unset($this->tickingChunks[$chunkHash]); + } + } + } + /** + * @deprecated + * + * @param true[] $chunkTickList + * @param bool[] $chunkTickableCache + * + * @phpstan-param array $chunkTickList + * @phpstan-param array $chunkTickableCache + * @phpstan-param-out array $chunkTickList + * @phpstan-param-out array $chunkTickableCache + */ + private function selectTickableChunksLegacy(array &$chunkTickList, array &$chunkTickableCache) : void{ $centerChunks = []; $selector = new ChunkSelector(); @@ -1179,6 +1219,38 @@ class World implements ChunkManager{ } } } + } + + private function tickChunks() : void{ + if($this->chunkTickRadius <= 0 || (count($this->tickingChunks) === 0 && count($this->tickingLoaders) === 0)){ + return; + } + + $this->timings->randomChunkUpdatesChunkSelection->startTiming(); + + /** @var bool[] $chunkTickList chunkhash => dummy */ + $chunkTickList = []; + + $chunkTickableCache = []; + + foreach($this->tickingChunks as $hash => $entry){ + if(!$entry->ready){ + World::getXZ($hash, $chunkX, $chunkZ); + if($this->isChunkTickable($chunkX, $chunkZ, $chunkTickableCache)){ + $entry->ready = true; + }else{ + //the chunk has been flagged as temporarily not tickable, so we don't want to tick it this time + continue; + } + } + $chunkTickList[$hash] = true; + } + + //TODO: REMOVE THIS + //backwards compatibility for TickingChunkLoader, although I'm not sure this is really necessary in practice + if(count($this->tickingLoaders) !== 0){ + $this->selectTickableChunksLegacy($chunkTickList, $chunkTickableCache); + } $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); @@ -1230,11 +1302,28 @@ class World implements ChunkManager{ return true; } + /** + * Marks the 3x3 chunks around the specified chunk as not ready to be ticked. This is used to prevent chunk ticking + * while a chunk is being populated, light-populated, or unloaded. + * Each chunk will be rechecked every tick until it is ready to be ticked again. + */ + private function markTickingChunkUnavailable(int $chunkX, int $chunkZ) : void{ + for($cx = -1; $cx <= 1; ++$cx){ + for($cz = -1; $cz <= 1; ++$cz){ + $chunkHash = World::chunkHash($chunkX + $cx, $chunkZ + $cz); + if(isset($this->tickingChunks[$chunkHash])){ + $this->tickingChunks[$chunkHash]->ready = false; + } + } + } + } + private function orderLightPopulation(int $chunkX, int $chunkZ) : void{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $lightPopulatedState = $this->chunks[$chunkHash]->isLightPopulated(); if($lightPopulatedState === false){ $this->chunks[$chunkHash]->setLightPopulated(null); + $this->markTickingChunkUnavailable($chunkX, $chunkZ); $this->workerPool->submitTask(new LightPopulationTask( $this->chunks[$chunkHash], @@ -2302,6 +2391,7 @@ class World implements ChunkManager{ throw new \InvalidArgumentException("Chunk $chunkX $chunkZ is already locked"); } $this->chunkLock[$chunkHash] = $lockId; + $this->markTickingChunkUnavailable($chunkX, $chunkZ); } /** @@ -2367,6 +2457,7 @@ class World implements ChunkManager{ unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); $chunk->setTerrainDirty(); + $this->markTickingChunkUnavailable($chunkX, $chunkZ); //this replacement chunk may not meet the conditions for ticking if(!$this->isChunkInUse($chunkX, $chunkZ)){ $this->unloadChunkRequest($chunkX, $chunkZ); @@ -2809,6 +2900,8 @@ class World implements ChunkManager{ unset($this->chunks[$chunkHash]); unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); + unset($this->tickingChunks[$chunkHash]); + $this->markTickingChunkUnavailable($x, $z); if(array_key_exists($chunkHash, $this->chunkPopulationRequestMap)){ $this->logger->debug("Rejecting population promise for chunk $x $z"); From 3490e2b06a72909be27a684d8f607c9ab4c86977 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 22:33:44 +0100 Subject: [PATCH 0842/1858] Mark RegisteredListenerCache as internal --- src/event/RegisteredListenerCache.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/event/RegisteredListenerCache.php b/src/event/RegisteredListenerCache.php index 1b675c7169..e5e3155465 100644 --- a/src/event/RegisteredListenerCache.php +++ b/src/event/RegisteredListenerCache.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\event; +/** + * @internal + */ final class RegisteredListenerCache{ /** From ad88490e84ffc49d08eae8e2d7d845646617d93d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 22:34:11 +0100 Subject: [PATCH 0843/1858] Mark TickingChunkEntry as internal --- src/world/TickingChunkEntry.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/world/TickingChunkEntry.php b/src/world/TickingChunkEntry.php index c255cf835c..ca965463d5 100644 --- a/src/world/TickingChunkEntry.php +++ b/src/world/TickingChunkEntry.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\world; +/** + * @internal + */ final class TickingChunkEntry{ /** * @var ChunkTicker[] spl_object_id => ChunkTicker From 89deb0fe18f86d83a1d190682b60ae72da9cfe0c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 22:48:02 +0100 Subject: [PATCH 0844/1858] Release 4.19.0 --- changelogs/4.19.md | 77 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +-- 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.19.md diff --git a/changelogs/4.19.md b/changelogs/4.19.md new file mode 100644 index 0000000000..de5da53404 --- /dev/null +++ b/changelogs/4.19.md @@ -0,0 +1,77 @@ +**For Minecraft: Bedrock Edition 1.19.70** + +### Note about API versions +Plugins which don't touch the `pocketmine\network\mcpe` namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +### Highlights +This version introduces support for a new, more advanced version of Timings. +This improved system provides more detail than the old system, and supports being displayed in a tree view, making it much easier to see which timers contribute to which other timers. + +In addition, some minor performance improvements have been made, along with a couple of minor API additions. + +# 4.19.0 +Released 11th April 2023. + +## General +- Updated the Timings system. + - Timings records now include parent information, allowing them to be displayed in a tree view (e.g. https://timings.pmmp.io/?id=303556). + - Timings records now include additional information, such as Peak (max time spent on any single tick), and Ticks (number of ticks the timer was active on). + - New timings have been added for every event. + - A new timer `Player Network Send - Pre-Spawn Game Data` has been added, and covers most of the time spent handling `ResourcePackClientResponsePacket`, giving a clearer picture of what's happening. +- Improved performance of the plugin event system. + - By introducing some caching, the event system now has 90% less overhead than in previous versions. +- Improved performance of the random chunk ticking system. + - The selection of ticked random chunks, and their validation for ticking, is now cached. This significantly reduces the overhead of chunk selection. + - Factions servers and other game modes with big maps and sparsely populated areas will see the most benefit from this change. + - Real-world performance benefit of this change is anywhere from 0-20%, depending on server type and configuration. +- The `timings paste` command now logs a debug message with the server response on failure to paste a timings report. + +## API +### `pocketmine\entity\object` +- The following API constants have been added: + - `ExperienceOrb::DEFAULT_DESPAWN_DELAY` - the default delay in ticks before an experience orb despawns + - `ExperienceOrb::NEVER_DESPAWN` - magic value for `setDespawnDelay()` to make an experience orb never despawn + - `ExperienceOrb::MAX_DESPAWN_DELAY` - the maximum delay in ticks before an experience orb despawns +- The following API methods have been added: + - `public ExperienceOrb->getDespawnDelay() : int` - returns the delay in ticks before this experience orb despawns + - `public ExperienceOrb->setDespawnDelay(int $despawnDelay) : void` - sets the delay in ticks before this experience orb despawns +- The following properties have been deprecated + - `ExperienceOrb->age` - superseded by despawn delay methods + +### `pocketmine\event` +- The following API methods have been added: + - `public HandlerList->getListenerList() : list` - returns an ordered list of handlers to be called for the event + +### `pocketmine\player` +- The following API methods have behavioural changes: + - `ChunkSelector->selectChunks()` now yields the distance in chunks from the center as the key, instead of an incrementing integer. +- The following classes have been deprecated: + - `PlayerChunkLoader` (this was technically internal, but never marked as such) + +### `pocketmine\timings` +- The following API constants have been deprecated: +- `Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX` - this is superseded by timings group support (see `Timings::GROUP_BREAKDOWN`) +- The following API constants have been added: +- `Timings::GROUP_BREAKDOWN` - this group makes a timer appear in the `Minecraft - Breakdown` section of a timings report +- The following API methods have been added: +- `public TimingsHandler->getGroup() : string` - returns the name of the table in which this timer will appear in a timings report +- The following API methods have changed signatures: +- `TimingsHandler->__construct()` now accepts an additional, optional `string $group` parameter, which defaults to `Minecraft`. + +### `pocketmine\world` +#### Highlights +Ticking chunks is now done using the `ChunkTicker` system, which has a much more fine-grained API than the old `TickingChunkLoader` system, as well as better performance. +It works similarly to the `ChunkLoader` system, in that chunks will be ticked as long as at least one `ChunkTicker` is registered for them. + +#### API changes +- The following classes have been deprecated: + - `TickingChunkLoader` - this has been superseded by the more powerful and performant `ChunkTicker` APIs +- The following classes have been added: + - `ChunkTicker` - an opaque object used for `registerTickingChunk()` to instruct the `World` that we want a chunk to be ticked +- The following API methods have been added: + - `public World->registerTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void` - registers a chunk to be ticked by the given `ChunkTicker` + - `public World->unregisterTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void` - unregisters a chunk from being ticked by the given `ChunkTicker` diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 723613b39a..2624370f06 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.5"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.19.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 87d8c1ea11cdd34a3f4bbd0ec87437be9b76a76d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 22:48:05 +0100 Subject: [PATCH 0845/1858] 4.19.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2624370f06..50ef8c3778 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.19.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.19.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From ed88d68fd70b6fb1204f7d584c092bc2b8d46630 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:20:58 +0100 Subject: [PATCH 0846/1858] Remove stuff deprecated in 4.19.0 --- src/entity/object/ExperienceOrb.php | 10 ++-- src/player/PlayerChunkLoader.php | 47 ------------------ src/timings/Timings.php | 6 --- src/world/TickingChunkLoader.php | 40 --------------- src/world/World.php | 76 +---------------------------- 5 files changed, 4 insertions(+), 175 deletions(-) delete mode 100644 src/player/PlayerChunkLoader.php delete mode 100644 src/world/TickingChunkLoader.php diff --git a/src/entity/object/ExperienceOrb.php b/src/entity/object/ExperienceOrb.php index 0d3af7e6ce..5120da3e14 100644 --- a/src/entity/object/ExperienceOrb.php +++ b/src/entity/object/ExperienceOrb.php @@ -84,9 +84,6 @@ class ExperienceOrb extends Entity{ return $result; } - /** @deprecated */ - protected int $age = 0; - /** Ticker used for determining interval in which to look for new target players. */ protected int $lookForTargetTime = 0; @@ -111,11 +108,11 @@ class ExperienceOrb extends Entity{ protected function initEntity(CompoundTag $nbt) : void{ parent::initEntity($nbt); - $this->age = $nbt->getShort(self::TAG_AGE, 0); - if($this->age === -32768){ + $age = $nbt->getShort(self::TAG_AGE, 0); + if($age === -32768){ $this->despawnDelay = self::NEVER_DESPAWN; }else{ - $this->despawnDelay = max(0, self::DEFAULT_DESPAWN_DELAY - $this->age); + $this->despawnDelay = max(0, self::DEFAULT_DESPAWN_DELAY - $age); } } @@ -180,7 +177,6 @@ class ExperienceOrb extends Entity{ protected function entityBaseTick(int $tickDiff = 1) : bool{ $hasUpdate = parent::entityBaseTick($tickDiff); - $this->age += $tickDiff; $this->despawnDelay -= $tickDiff; if($this->despawnDelay <= 0){ $this->flagForDespawn(); diff --git a/src/player/PlayerChunkLoader.php b/src/player/PlayerChunkLoader.php deleted file mode 100644 index 175f242d34..0000000000 --- a/src/player/PlayerChunkLoader.php +++ /dev/null @@ -1,47 +0,0 @@ -currentLocation = $currentLocation; - } - - public function getX() : float{ - return $this->currentLocation->getFloorX(); - } - - public function getZ() : float{ - return $this->currentLocation->getFloorZ(); - } -} diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 9f011e3edf..a4d2a69670 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -34,12 +34,6 @@ use function get_class; use function str_starts_with; abstract class Timings{ - /** - * @deprecated This was used by the old timings viewer to make a timer appear in the Breakdown section of a timings - * report. Provide a group to your timer's constructor instead. - * @see Timings::GROUP_BREAKDOWN - */ - public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; public const GROUP_BREAKDOWN = "Minecraft - Breakdown"; private static bool $initialized = false; diff --git a/src/world/TickingChunkLoader.php b/src/world/TickingChunkLoader.php deleted file mode 100644 index a44173c335..0000000000 --- a/src/world/TickingChunkLoader.php +++ /dev/null @@ -1,40 +0,0 @@ - TickingChunkLoader - * @phpstan-var array - * - * @deprecated - */ - private array $tickingLoaders = []; - /** - * @var int[] spl_object_id => number of chunks - * @phpstan-var array - * - * @deprecated - */ - private array $tickingLoaderCounter = []; - /** * @var TickingChunkEntry[] chunkHash => TickingChunkEntry * @phpstan-var array @@ -799,15 +783,6 @@ class World implements ChunkManager{ $this->chunkLoaders[$chunkHash][$loaderId] = $loader; - if($loader instanceof TickingChunkLoader){ - if(!isset($this->tickingLoaders[$loaderId])){ - $this->tickingLoaderCounter[$loaderId] = 1; - $this->tickingLoaders[$loaderId] = $loader; - }else{ - ++$this->tickingLoaderCounter[$loaderId]; - } - } - $this->cancelUnloadChunkRequest($chunkX, $chunkZ); if($autoLoad){ @@ -828,11 +803,6 @@ class World implements ChunkManager{ unset($this->chunkPopulationRequestMap[$chunkHash]); } } - - if(isset($this->tickingLoaderCounter[$loaderId]) && --$this->tickingLoaderCounter[$loaderId] === 0){ - unset($this->tickingLoaderCounter[$loaderId]); - unset($this->tickingLoaders[$loaderId]); - } } } @@ -1206,46 +1176,8 @@ class World implements ChunkManager{ } } - /** - * @deprecated - * - * @param true[] $chunkTickList - * @param bool[] $chunkTickableCache - * - * @phpstan-param array $chunkTickList - * @phpstan-param array $chunkTickableCache - * @phpstan-param-out array $chunkTickList - * @phpstan-param-out array $chunkTickableCache - */ - private function selectTickableChunksLegacy(array &$chunkTickList, array &$chunkTickableCache) : void{ - $centerChunks = []; - - $selector = new ChunkSelector(); - foreach($this->tickingLoaders as $loader){ - $centerChunkX = (int) floor($loader->getX()) >> Chunk::COORD_BIT_SIZE; - $centerChunkZ = (int) floor($loader->getZ()) >> Chunk::COORD_BIT_SIZE; - $centerChunkPosHash = World::chunkHash($centerChunkX, $centerChunkZ); - if(isset($centerChunks[$centerChunkPosHash])){ - //we already queued chunks in this radius because of a previous loader on the same chunk - continue; - } - $centerChunks[$centerChunkPosHash] = true; - - foreach($selector->selectChunks( - $this->chunkTickRadius, - $centerChunkX, - $centerChunkZ - ) as $hash){ - World::getXZ($hash, $chunkX, $chunkZ); - if(!isset($chunkTickList[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ, $chunkTickableCache)){ - $chunkTickList[$hash] = true; - } - } - } - } - private function tickChunks() : void{ - if($this->chunkTickRadius <= 0 || (count($this->tickingChunks) === 0 && count($this->tickingLoaders) === 0)){ + if($this->chunkTickRadius <= 0 || count($this->tickingChunks) === 0){ return; } @@ -1269,12 +1201,6 @@ class World implements ChunkManager{ $chunkTickList[$hash] = true; } - //TODO: REMOVE THIS - //backwards compatibility for TickingChunkLoader, although I'm not sure this is really necessary in practice - if(count($this->tickingLoaders) !== 0){ - $this->selectTickableChunksLegacy($chunkTickList, $chunkTickableCache); - } - $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); foreach($chunkTickList as $index => $_){ From dd9ea4ee02b1344e2d0eb6862522951d19d8cd51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:27:01 +0100 Subject: [PATCH 0847/1858] Release 5.0.0-BETA2 --- changelogs/5.0-beta.md | 53 +++++++++++++++++++++++++++++++++++++++++- src/VersionInfo.php | 2 +- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/changelogs/5.0-beta.md b/changelogs/5.0-beta.md index 0fef808fcc..e2e9079b5c 100644 --- a/changelogs/5.0-beta.md +++ b/changelogs/5.0-beta.md @@ -41,4 +41,55 @@ Released 7th March 2023. - The following methods have been renamed: - `Block->computeStateData()` -> `Block->computeTypeAndStateData()` - `Block->decodeStateData()` -> `Block->decodeTypeAndStateData()` -- Wall state data now packs connections into 7 bits instead of 8. \ No newline at end of file +- Wall state data now packs connections into 7 bits instead of 8. + +# 5.0.0-BETA2 +Released 11th April 2023. + +**This release includes changes from the following releases:** +- [4.17.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.17.md#4170) +- [4.17.1](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.17.md#4171) +- [4.17.2](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.17.md#4172) +- [4.18.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.18.md#4180) +- [4.18.1](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.18.md#4181) +- [4.18.2](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.18.md#4182) +- [4.18.3](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.18.md#4183) +- [4.18.4](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.18.md#4184) +- [4.19.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA2/changelogs/4.19.md#4190) + +## Tools +- Added script `tools/generate-bedrock-data-from-packets.php`. This tool accepts a txt file containing base64-encoded packet dumps. + - This script has been used to generate data for [BedrockData](https://github.com/pmmp/BedrockData) for several years, but has only now been open-sourced. + - It's used to generate data such as crafting recipes, creative inventory data, and various other blobs of data needed to support the current version of Minecraft: Bedrock Edition. + +## Gameplay +- Anvils now damage entities when they fall on top of them. + +## API +### `pocketmine\block\utils` +- The following API interface requirements have been added (BC breaking): + - `public Fallable->getFallDamagePerBlock() : float` (default implementation provided by `FallableTrait`) + - `public Fallable->getMaxFallDamage() : float` (default implementation provided by `FallableTrait`) + +### `pocketmine\data\bedrock\block` +- The following new API methods have been added: + - `public BlockStateData->getVersionAsString() : string` + +#### `pocketmine\data\bedrock\block\upgrade\model` +- `BlockStateUpgradeSchemaModelBlockRemap` now accepts `null` for `oldState` and `newState`. This makes it easier to generate portable schemas for other languages to read. + +### `pocketmine\event\entity` +- The following new API constants have been added: + - `EntityDamageEvent::CAUSE_FALLING_BLOCK` + - `EntityDamageEvent::MODIFIER_ARMOR_HELMET` + +### `pocketmine\item` +- The following API methods have signature changes: + - `ItemTypeIds::toBlockTypeId()` may now return `null` if the item type ID is not a block. + +### `pocketmine\player` +- The following classes have been removed: + - `PlayerChunkLoader` - deprecated in 4.19.0 (this was technically internal, but never marked as such) + +## Internals +- Make use of `Item->canStackWith()` instead of `Item->equals()` wherever possible, to make the code more readable. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9fa2339ff7..4955f5c173 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -33,7 +33,7 @@ final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "beta"; private function __construct(){ From 18658cb74d056cd9a5bb0c0f41db2bcfae330bf5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:27:01 +0100 Subject: [PATCH 0848/1858] 5.0.0-BETA3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4955f5c173..20486d1695 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,8 +32,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-BETA3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From 858d4a2ed2774a62410cab0c11c0709859ee266a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:35:14 +0100 Subject: [PATCH 0849/1858] changelog: fixed indentation I have no idea what happened here... --- changelogs/4.19.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/changelogs/4.19.md b/changelogs/4.19.md index de5da53404..9befb4e0bc 100644 --- a/changelogs/4.19.md +++ b/changelogs/4.19.md @@ -54,13 +54,13 @@ Released 11th April 2023. ### `pocketmine\timings` - The following API constants have been deprecated: -- `Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX` - this is superseded by timings group support (see `Timings::GROUP_BREAKDOWN`) + - `Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX` - this is superseded by timings group support (see `Timings::GROUP_BREAKDOWN`) - The following API constants have been added: -- `Timings::GROUP_BREAKDOWN` - this group makes a timer appear in the `Minecraft - Breakdown` section of a timings report + - `Timings::GROUP_BREAKDOWN` - this group makes a timer appear in the `Minecraft - Breakdown` section of a timings report - The following API methods have been added: -- `public TimingsHandler->getGroup() : string` - returns the name of the table in which this timer will appear in a timings report + - `public TimingsHandler->getGroup() : string` - returns the name of the table in which this timer will appear in a timings report - The following API methods have changed signatures: -- `TimingsHandler->__construct()` now accepts an additional, optional `string $group` parameter, which defaults to `Minecraft`. + - `TimingsHandler->__construct()` now accepts an additional, optional `string $group` parameter, which defaults to `Minecraft`. ### `pocketmine\world` #### Highlights From a6e79c50042d28ac64a4094b67fcc6a9fd9faff6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:45:01 +0100 Subject: [PATCH 0850/1858] TimingsHandler: remove useless paste metadata these fields are not used by any version of timings, so this code is redundant. --- src/timings/TimingsHandler.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index b77610a655..d43b432bc6 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -23,10 +23,8 @@ declare(strict_types=1); namespace pocketmine\timings; -use pocketmine\entity\Living; use pocketmine\Server; use pocketmine\utils\Utils; -use function count; use function hrtime; use function implode; use function spl_object_id; @@ -77,19 +75,6 @@ class TimingsHandler{ $result[] = "# Version " . Server::getInstance()->getVersion(); $result[] = "# " . Server::getInstance()->getName() . " " . Server::getInstance()->getPocketMineVersion(); - $entities = 0; - $livingEntities = 0; - foreach(Server::getInstance()->getWorldManager()->getWorlds() as $world){ - $entities += count($world->getEntities()); - foreach($world->getEntities() as $e){ - if($e instanceof Living){ - ++$livingEntities; - } - } - } - - $result[] = "# Entities " . $entities; - $result[] = "# LivingEntities " . $livingEntities; $result[] = "# FormatVersion " . self::FORMAT_VERSION; $sampleTime = hrtime(true) - self::$timingStart; From ba62e0f9cbe0c21fccc4fb80bfc34f724009a050 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Apr 2023 23:55:34 +0100 Subject: [PATCH 0851/1858] WorldManager: fixed borked pre-generation for new worlds' spawn terrain perhaps directly altering the behaviour of selectChunks() wasn't a good idea? ... --- src/world/WorldManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index 5632c960bd..1124d513da 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -286,7 +286,7 @@ class WorldManager{ $centerX = $spawnLocation->getFloorX() >> Chunk::COORD_BIT_SIZE; $centerZ = $spawnLocation->getFloorZ() >> Chunk::COORD_BIT_SIZE; - $selected = iterator_to_array((new ChunkSelector())->selectChunks(8, $centerX, $centerZ)); + $selected = iterator_to_array((new ChunkSelector())->selectChunks(8, $centerX, $centerZ), preserve_keys: false); $done = 0; $total = count($selected); foreach($selected as $index){ From 7e92da126d3d080f1c58ea1bde8fd7dc2b86ef21 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Apr 2023 15:42:33 +0100 Subject: [PATCH 0852/1858] DelegateInventory: fixed slots being synced twice and breaking ItemStackRequests the second time the slot is synced, there is no prediction, so the slot update isn't associated with a request anymore. This causes subsequent requests in the same packet to fail, since the dependency request ID isn't associated with the slot anymore. This change fixes the problem by only allowing the backing inventory to trigger a call to DelegateInventory->on*Change(). While we could have removed and re-added the listener instead, this way is safer since it doesn't assume that the backing inventory won't modify the given item in setItem(). closes #5692 --- src/inventory/DelegateInventory.php | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/inventory/DelegateInventory.php b/src/inventory/DelegateInventory.php index 391b9599c7..ba9e5a983e 100644 --- a/src/inventory/DelegateInventory.php +++ b/src/inventory/DelegateInventory.php @@ -30,6 +30,7 @@ use pocketmine\item\Item; */ class DelegateInventory extends BaseInventory{ private InventoryListener $inventoryListener; + private bool $backingInventoryChanging = false; public function __construct( private Inventory $backingInventory @@ -39,12 +40,22 @@ class DelegateInventory extends BaseInventory{ $this->backingInventory->getListeners()->add($this->inventoryListener = new CallbackInventoryListener( static function(Inventory $unused, int $slot, Item $oldItem) use ($weakThis) : void{ if(($strongThis = $weakThis->get()) !== null){ - $strongThis->onSlotChange($slot, $oldItem); + $strongThis->backingInventoryChanging = true; + try{ + $strongThis->onSlotChange($slot, $oldItem); + }finally{ + $strongThis->backingInventoryChanging = false; + } } }, static function(Inventory $unused, array $oldContents) use ($weakThis) : void{ if(($strongThis = $weakThis->get()) !== null){ - $strongThis->onContentChange($oldContents); + $strongThis->backingInventoryChanging = true; + try{ + $strongThis->onContentChange($oldContents); + }finally{ + $strongThis->backingInventoryChanging = false; + } } } )); @@ -73,4 +84,16 @@ class DelegateInventory extends BaseInventory{ protected function internalSetContents(array $items) : void{ $this->backingInventory->setContents($items); } + + protected function onSlotChange(int $index, Item $before) : void{ + if($this->backingInventoryChanging){ + parent::onSlotChange($index, $before); + } + } + + protected function onContentChange(array $itemsBefore) : void{ + if($this->backingInventoryChanging){ + parent::onContentChange($itemsBefore); + } + } } From 03363940988a4662a73ccd42628430471c613073 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Apr 2023 16:44:10 +0100 Subject: [PATCH 0853/1858] Human: remove useless NameTag tag this is not written anywhere, so this code never does anything. --- src/entity/Human.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/entity/Human.php b/src/entity/Human.php index cdbd70bd7d..707c816f81 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -92,7 +92,6 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ private const TAG_XP_PROGRESS = "XpP"; //TAG_Float private const TAG_LIFETIME_XP_TOTAL = "XpTotal"; //TAG_Int private const TAG_XP_SEED = "XpSeed"; //TAG_Int - private const TAG_NAME_TAG = "NameTag"; //TAG_String private const TAG_SKIN = "Skin"; //TAG_Compound private const TAG_SKIN_NAME = "Name"; //TAG_String private const TAG_SKIN_DATA = "Data"; //TAG_ByteArray @@ -245,10 +244,6 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ * For Human entities which are not players, sets their properties such as nametag, skin and UUID from NBT. */ protected function initHumanData(CompoundTag $nbt) : void{ - if(($nameTagTag = $nbt->getTag(self::TAG_NAME_TAG)) instanceof StringTag){ - $this->setNameTag($nameTagTag->getValue()); - } - //TODO: use of NIL UUID for namespace is a hack; we should provide a proper UUID for the namespace $this->uuid = Uuid::uuid3(Uuid::NIL, ((string) $this->getId()) . $this->skin->getSkinData() . $this->getNameTag()); } From 18b528f72d490c179f4d25b472689452fb9ad44d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Apr 2023 21:01:46 +0100 Subject: [PATCH 0854/1858] ItemStackRequestExecutor: fixed borked taking of created items closes #5695 --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 81d820c2bb..124606112c 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -284,12 +284,12 @@ class ItemStackRequestExecutor{ } $this->createdItemsTakenCount += $count; - $createdItem = clone $createdItem; - $createdItem->setCount($count); + $takenItem = clone $createdItem; + $takenItem->setCount($count); if(!$this->createdItemFromCreativeInventory && $this->createdItemsTakenCount >= $createdItem->getCount()){ $this->setNextCreatedItem(null); } - return $createdItem; + return $takenItem; } /** From c3a2199f0e8a34329d8d8f34a23d4a17cbc5fffe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:05:37 +0100 Subject: [PATCH 0855/1858] Reduce global usage in world providers --- src/world/format/io/BaseWorldProvider.php | 22 ++++++++++++++------- src/world/format/io/leveldb/LevelDB.php | 24 ++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index cd1cc9b5f4..a1ddb3c8f5 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -24,6 +24,9 @@ declare(strict_types=1); namespace pocketmine\world\format\io; use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\BlockStateDeserializer; +use pocketmine\data\bedrock\block\BlockStateSerializer; +use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\format\PalettedBlockArray; @@ -33,6 +36,10 @@ use function file_exists; abstract class BaseWorldProvider implements WorldProvider{ protected WorldData $worldData; + protected BlockStateDeserializer $blockStateDeserializer; + protected BlockDataUpgrader $blockDataUpgrader; + protected BlockStateSerializer $blockStateSerializer; + public function __construct( protected string $path ){ @@ -40,6 +47,11 @@ abstract class BaseWorldProvider implements WorldProvider{ throw new WorldException("World does not exist"); } + //TODO: this should not rely on singletons + $this->blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); + $this->blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); + $this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); + $this->worldData = $this->loadLevelData(); } @@ -52,24 +64,20 @@ abstract class BaseWorldProvider implements WorldProvider{ private function translatePalette(PalettedBlockArray $blockArray) : PalettedBlockArray{ $palette = $blockArray->getPalette(); - //TODO: this should be dependency-injected so it can be replaced, but that would break BC - //also, we want it to be lazy-loaded ... - $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); - $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); $newPalette = []; foreach($palette as $k => $legacyIdMeta){ - $newStateData = $blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); + $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); if($newStateData === null){ //TODO: remember data for unknown states so we can implement them later $newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData(); } try{ - $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); + $newPalette[$k] = $this->blockStateDeserializer->deserialize($newStateData); }catch(BlockStateDeserializeException){ //TODO: this needs to be logged //TODO: maybe we can remember unknown states for later saving instead of discarding them and destroying maps... - $newPalette[$k] = $blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); + $newPalette[$k] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 8f3aa54abd..ff57d14cd2 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -27,7 +27,6 @@ use pocketmine\block\Block; use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; -use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtException; @@ -158,14 +157,12 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $paletteSize = $bitsPerBlock === 0 ? 1 : $stream->getLInt(); - $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); - $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); for($i = 0; $i < $paletteSize; ++$i){ try{ $offset = $stream->getOffset(); $blockStateNbt = $nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); - $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); if($blockStateData === null){ //upgrading blockstates should always succeed, regardless of whether they've been implemented or not throw new BlockStateDeserializeException("Invalid or improperly mapped legacy blockstate: " . $blockStateNbt->toString()); @@ -173,11 +170,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $stream->setOffset($offset); try{ - $palette[] = $blockStateDeserializer->deserialize($blockStateData); + $palette[] = $this->blockStateDeserializer->deserialize($blockStateData); }catch(BlockStateDeserializeException){ //TODO: remember data for unknown states so we can implement them later //TODO: log this - $palette[] = $blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); + $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } }catch(NbtException | BlockStateDeserializeException $e){ throw new CorruptedChunkException("Invalid blockstate NBT at offset $i in paletted storage: " . $e->getMessage(), 0, $e); @@ -188,7 +185,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); } - private static function serializeBlockPalette(BinaryStream $stream, PalettedBlockArray $blocks, BlockStateSerializer $blockStateSerializer) : void{ + private function serializeBlockPalette(BinaryStream $stream, PalettedBlockArray $blocks) : void{ $stream->putByte($blocks->getBitsPerBlock() << 1); $stream->put($blocks->getWordArray()); @@ -198,7 +195,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } $tags = []; foreach($palette as $p){ - $tags[] = new TreeRoot($blockStateSerializer->serialize($p)->toNbt()); + $tags[] = new TreeRoot($this->blockStateSerializer->serialize($p)->toNbt()); } $stream->put((new LittleEndianNbtSerializer())->writeMultiple($tags)); @@ -327,8 +324,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $binaryStream = new BinaryStream($extraRawData); $count = $binaryStream->getLInt(); - $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); - $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); for($i = 0; $i < $count; ++$i){ $key = $binaryStream->getLInt(); $value = $binaryStream->getLShort(); @@ -340,13 +335,13 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockId = $value & 0xff; $blockData = ($value >> 8) & 0xf; - $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $blockData); + $blockStateData = $this->blockDataUpgrader->upgradeIntIdMeta($blockId, $blockData); if($blockStateData === null){ //TODO: we could preserve this in case it's supported in the future, but this was historically only //used for grass anyway, so we probably don't need to care continue; } - $blockStateId = $blockStateDeserializer->deserialize($blockStateData); + $blockStateId = $this->blockStateDeserializer->deserialize($blockStateData); if(!isset($extraDataLayers[$ySub])){ $extraDataLayers[$ySub] = new PalettedBlockArray(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS); @@ -693,9 +688,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)){ $subChunks = $chunk->getSubChunks(); - //TODO: this should not rely on globals, but in PM4 we have no other option, and it's not worse than what we - //were doing before anyway ... - $blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); foreach($subChunks as $y => $subChunk){ $key = $index . ChunkDataKey::SUBCHUNK . chr($y); if($subChunk->isEmptyAuthoritative()){ @@ -707,7 +699,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $layers = $subChunk->getBlockLayers(); $subStream->putByte(count($layers)); foreach($layers as $blocks){ - self::serializeBlockPalette($subStream, $blocks, $blockStateSerializer); + $this->serializeBlockPalette($subStream, $blocks); } $write->put($key, $subStream->getBuffer()); From 1c626baf1a2f1086b63bf3d7293dfa415c6d7ab9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:27:55 +0100 Subject: [PATCH 0856/1858] Fixed dodgy custom block registration test --- tests/phpunit/block/BlockTest.php | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 8712212c54..cf0b674d62 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -62,16 +62,9 @@ class BlockTest extends TestCase{ * Test registering a new block which does not yet exist */ public function testRegisterNewBlock() : void{ - for($i = BlockTypeIds::FIRST_UNUSED_BLOCK_ID; $i < BlockTypeIds::FIRST_UNUSED_BLOCK_ID + 256; ++$i){ - if(!$this->blockFactory->isRegistered($i)){ - $b = new StrangeNewBlock(new BlockIdentifier($i), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); - $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); - return; - } - } - - throw new \RuntimeException("Can't test registering new blocks because no unused spaces left"); + $b = new StrangeNewBlock(new BlockIdentifier(BlockTypeIds::newId()), "Strange New Block", new BlockTypeInfo(BlockBreakInfo::instant())); + $this->blockFactory->register($b); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->fromStateId($b->getStateId())); } /** From 874fdf5adb420565d2df91490167952528214a6c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:44:47 +0100 Subject: [PATCH 0857/1858] ItemBlock: reference blocks directly (take 2) This was first attempted in f64dc01bd1c14ff3f79bd6c18d0c337dbc0e87e0, but reverted, since I hadn't considered how to handle stripping state data from blocks. This removes the abusable API RuntimeBlockStateRegistry::fromTypeId() and related methods. These were only used to allow ItemBlocks to magically start referencing other blocks if the blocks were overridden by a plugin, but this was never a well-supported use-case anyway. Instead of relying on RuntimeBlockStateRegistry, we remember the state that the block had during its constructor, and use that to normalize the non-item properties for asItem(). closes #5609 --- src/block/Anvil.php | 2 +- src/block/Block.php | 48 +++++++++++++++++-------- src/block/Dirt.php | 2 +- src/block/Froglight.php | 2 +- src/block/Light.php | 2 +- src/block/NetherVines.php | 2 +- src/block/RedMushroomBlock.php | 2 +- src/block/RuntimeBlockStateRegistry.php | 28 --------------- src/block/Skull.php | 2 +- src/block/Slab.php | 2 +- src/block/Sponge.php | 2 +- src/block/TNT.php | 2 +- src/block/UnknownBlock.php | 2 +- src/block/Wood.php | 2 +- src/block/utils/ColoredTrait.php | 2 +- src/block/utils/CopperTrait.php | 2 +- src/block/utils/CoralTypeTrait.php | 2 +- src/item/ItemBlock.php | 34 +++++------------- 18 files changed, 57 insertions(+), 83 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index edfb9491de..ee8b25e384 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,7 +51,7 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } diff --git a/src/block/Block.php b/src/block/Block.php index d557411fe6..be46de5923 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -76,6 +76,8 @@ class Block{ */ private static array $stateDataBits = []; + private int $defaultStateData; + /** * @param string $name English name of the block type (TODO: implement translations) */ @@ -84,6 +86,8 @@ class Block{ $this->fallbackName = $name; $this->typeInfo = $typeInfo; $this->position = new Position(0, 0, 0, null); + + $this->defaultStateData = $this->computeStateData(); } public function __clone(){ @@ -174,7 +178,9 @@ class Block{ * Type information such as colour, wood type, etc. is preserved. */ public function asItem() : Item{ - return new ItemBlock($this); + $normalized = clone $this; + $normalized->decodeStateData($this->defaultStateData); + return new ItemBlock($normalized); } final public function getRequiredTypeDataBits() : int{ @@ -211,6 +217,17 @@ class Block{ } } + private function decodeStateData(int $data) : void{ + $stateBits = $this->getRequiredStateDataBits(); + $reader = new RuntimeDataReader($stateBits, $data); + + $this->describeState($reader); + $readBits = $reader->getOffset(); + if($stateBits !== $readBits){ + throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); + } + } + /** * @internal */ @@ -219,12 +236,7 @@ class Block{ $stateBits = $this->getRequiredStateDataBits(); $reader = new RuntimeDataReader($typeBits + $stateBits, $data); $this->decodeTypeData($reader->readInt($typeBits)); - - $this->describeState($reader); - $readBits = $reader->getOffset() - $typeBits; - if($stateBits !== $readBits){ - throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); - } + $this->decodeStateData($reader->readInt($stateBits)); } /** @@ -243,6 +255,19 @@ class Block{ return $writer->getValue(); } + private function computeStateData() : int{ + $stateBits = $this->getRequiredStateDataBits(); + $writer = new RuntimeDataWriter($stateBits); + + $this->describeState($writer); + $writtenBits = $writer->getOffset(); + if($stateBits !== $writtenBits){ + throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); + } + + return $writer->getValue(); + } + /** * @internal */ @@ -251,12 +276,7 @@ class Block{ $stateBits = $this->getRequiredStateDataBits(); $writer = new RuntimeDataWriter($typeBits + $stateBits); $writer->writeInt($typeBits, $this->computeTypeData()); - - $this->describeState($writer); - $writtenBits = $writer->getOffset() - $typeBits; - if($stateBits !== $writtenBits){ - throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); - } + $writer->writeInt($stateBits, $this->computeStateData()); return $writer->getValue(); } @@ -269,7 +289,7 @@ class Block{ * The method implementation must NOT use conditional logic to determine which properties are written. It must * always write the same properties in the same order, regardless of the current state of the block. */ - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ //NOOP } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 900879433e..33f3800d7d 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -45,7 +45,7 @@ class Dirt extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index 13b68e21ed..dcd14c900a 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -35,7 +35,7 @@ final class Froglight extends SimplePillar{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/Light.php b/src/block/Light.php index 5ee7281c9f..963c003854 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -34,7 +34,7 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index 4a924b2bee..d00580624c 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -52,7 +52,7 @@ class NetherVines extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeState(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->boundedInt(5, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index dfa50e2657..07afbfc217 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -36,7 +36,7 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative), //so this information needs to be kept in the type info $w->mushroomBlockType($this->mushroomBlockType); diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index ed3761b720..cdcd4b73a7 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -151,18 +151,6 @@ class RuntimeBlockStateRegistry{ } } - /** - * @internal - * Returns the default state of the block type associated with the given type ID. - */ - public function fromTypeId(int $typeId) : Block{ - if(isset($this->typeIndex[$typeId])){ - return clone $this->typeIndex[$typeId]; - } - - throw new \InvalidArgumentException("Block ID $typeId is not registered"); - } - public function fromStateId(int $stateId) : Block{ if($stateId < 0){ throw new \InvalidArgumentException("Block state ID cannot be negative"); @@ -178,22 +166,6 @@ class RuntimeBlockStateRegistry{ return $block; } - /** - * Returns whether a specified block state is already registered in the block factory. - */ - public function isRegistered(int $typeId) : bool{ - $b = $this->typeIndex[$typeId] ?? null; - return $b !== null && !($b instanceof UnknownBlock); - } - - /** - * @return Block[] - * @phpstan-return array - */ - public function getAllKnownTypes() : array{ - return $this->typeIndex; - } - /** * @return Block[] */ diff --git a/src/block/Skull.php b/src/block/Skull.php index 10403ab6b0..926c5cc801 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -49,7 +49,7 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } diff --git a/src/block/Slab.php b/src/block/Slab.php index 4e25d15a4a..fa5833d7c2 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -37,8 +37,8 @@ class Slab extends Transparent{ protected SlabType $slabType; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - parent::__construct($idInfo, $name . " Slab", $typeInfo); $this->slabType = SlabType::BOTTOM(); + parent::__construct($idInfo, $name . " Slab", $typeInfo); } protected function describeState(RuntimeDataDescriber $w) : void{ diff --git a/src/block/Sponge.php b/src/block/Sponge.php index b4e523ffa3..5b283d18b2 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/TNT.php b/src/block/TNT.php index 7012f7145b..d50028f927 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -45,7 +45,7 @@ class TNT extends Opaque{ protected bool $unstable = false; //TODO: Usage unclear, seems to be a weird hack in vanilla protected bool $worksUnderwater = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 7c48b236fa..4523fd7ec3 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -38,7 +38,7 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); diff --git a/src/block/Wood.php b/src/block/Wood.php index 9a0c36e1d6..3fbae40dad 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -38,7 +38,7 @@ class Wood extends Opaque{ private bool $stripped = false; - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 42abe64b95..b9a14bee12 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -31,7 +31,7 @@ trait ColoredTrait{ private $color; /** @see Block::describeType() */ - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index ed230c6bad..11c0178f9e 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -44,7 +44,7 @@ trait CopperTrait{ parent::__construct($identifier, $name, $typeInfo); } - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index d2c96c8f4a..4607831c85 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -31,7 +31,7 @@ trait CoralTypeTrait{ protected bool $dead = false; /** @see Block::describeType() */ - protected function describeType(RuntimeDataDescriber $w) : void{ + public function describeType(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); $w->bool($this->dead); } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index a7e14b5ce8..ccd8793ef9 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -35,47 +35,29 @@ use pocketmine\data\runtime\RuntimeDataDescriber; * just place wheat crops when used on the ground). */ final class ItemBlock extends Item{ - private int $blockTypeId; - private int $blockTypeData; - - private int $fuelTime; - private bool $fireProof; - private int $maxStackSize; - - public function __construct(Block $block){ + public function __construct( + private Block $block + ){ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); - $this->blockTypeId = $block->getTypeId(); - $this->blockTypeData = $block->computeTypeData(); - - $this->fuelTime = $block->getFuelTime(); - $this->fireProof = $block->isFireProofAsItem(); - $this->maxStackSize = $block->getMaxStackSize(); } protected function describeType(RuntimeDataDescriber $w) : void{ - $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); + $this->block->describeType($w); } public function getBlock(?int $clickedFace = null) : Block{ - //TODO: HACKY MESS, CLEAN IT UP - $factory = RuntimeBlockStateRegistry::getInstance(); - if(!$factory->isRegistered($this->blockTypeId)){ - return VanillaBlocks::AIR(); - } - $blockType = $factory->fromTypeId($this->blockTypeId); - $blockType->decodeTypeData($this->blockTypeData); - return $blockType; + return clone $this->block; } public function getFuelTime() : int{ - return $this->fuelTime; + return $this->block->getFuelTime(); } public function isFireProof() : bool{ - return $this->fireProof; + return $this->block->isFireProofAsItem(); } public function getMaxStackSize() : int{ - return $this->maxStackSize; + return $this->block->getMaxStackSize(); } } From 6703f46a08cf022ef1c165a53588914fca1408a2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:47:08 +0100 Subject: [PATCH 0858/1858] Remove random dead TODOs --- src/block/RuntimeBlockStateRegistry.php | 1 - src/world/format/io/leveldb/LevelDB.php | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index cdcd4b73a7..080690c28b 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -99,7 +99,6 @@ class RuntimeBlockStateRegistry{ try{ $v->decodeTypeAndStateData($stateData); if($v->computeTypeAndStateData() !== $stateData){ - //TODO: this should probably be a hard error throw new \LogicException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeTypeAndStateData() . " for input $stateData)"); } }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index ff57d14cd2..8c0a43287b 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -627,7 +627,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $subChunks = $this->deserializeLegacyTerrainData($index, $chunkVersion); break; default: - //TODO: set chunks read-only so the version on disk doesn't get overwritten throw new CorruptedChunkException("don't know how to decode chunk format version $chunkVersion"); } @@ -664,7 +663,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: tile ticks, biome states (?) $chunk = new Chunk( - $subChunks, //TODO: maybe missing biomes should be an error? + $subChunks, $terrainPopulated ); From 6cace51a212318410aabcfc58110ad0b9c1245b5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:47:17 +0100 Subject: [PATCH 0859/1858] Remove unused variable --- src/world/format/io/leveldb/LevelDB.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 8c0a43287b..fa38bf4b83 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -679,7 +679,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $write = new \LevelDBWriteBatch(); - $previousVersion = $this->readVersion($chunkX, $chunkZ); $write->put($index . ChunkDataKey::NEW_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); $chunk = $chunkData->getChunk(); From 5950707267d3b60fa3fc086bc9a2910a49ee3315 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:55:09 +0100 Subject: [PATCH 0860/1858] Block: simplify required type data / state data bits code --- src/block/Block.php | 81 +++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index be46de5923..bfbfcb3b63 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -65,17 +65,8 @@ class Block{ /** @var AxisAlignedBB[]|null */ protected ?array $collisionBoxes = null; - /** - * @var int[] - * @phpstan-var array - */ - private static array $typeDataBits = []; - /** - * @var int[] - * @phpstan-var array - */ - private static array $stateDataBits = []; - + private int $requiredTypeDataBits; + private int $requiredStateDataBits; private int $defaultStateData; /** @@ -87,6 +78,14 @@ class Block{ $this->typeInfo = $typeInfo; $this->position = new Position(0, 0, 0, null); + $calculator = new RuntimeDataSizeCalculator(); + $this->describeType($calculator); + $this->requiredTypeDataBits = $calculator->getBitsUsed(); + + $calculator = new RuntimeDataSizeCalculator(); + $this->describeState($calculator); + $this->requiredStateDataBits = $calculator->getBitsUsed(); + $this->defaultStateData = $this->computeStateData(); } @@ -184,47 +183,33 @@ class Block{ } final public function getRequiredTypeDataBits() : int{ - $class = get_class($this); - if(isset(self::$typeDataBits[$class])){ - return self::$typeDataBits[$class]; - } - $calculator = new RuntimeDataSizeCalculator(); - $this->describeType($calculator); - return self::$typeDataBits[$class] = $calculator->getBitsUsed(); + return $this->requiredTypeDataBits; } final public function getRequiredStateDataBits() : int{ - $class = get_class($this); - if(isset(self::$stateDataBits[$class])){ - return self::$stateDataBits[$class]; - } - $calculator = new RuntimeDataSizeCalculator(); - $this->describeState($calculator); - return self::$stateDataBits[$class] = $calculator->getBitsUsed(); + return $this->requiredStateDataBits; } /** * @internal */ final public function decodeTypeData(int $data) : void{ - $typeBits = $this->getRequiredTypeDataBits(); - $reader = new RuntimeDataReader($typeBits, $data); + $reader = new RuntimeDataReader($this->requiredTypeDataBits, $data); $this->describeType($reader); $readBits = $reader->getOffset(); - if($typeBits !== $readBits){ - throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were provided, but $readBits were read"); + if($this->requiredTypeDataBits !== $readBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were provided, but $readBits were read"); } } private function decodeStateData(int $data) : void{ - $stateBits = $this->getRequiredStateDataBits(); - $reader = new RuntimeDataReader($stateBits, $data); + $reader = new RuntimeDataReader($this->requiredStateDataBits, $data); $this->describeState($reader); $readBits = $reader->getOffset(); - if($stateBits !== $readBits){ - throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); + if($this->requiredStateDataBits !== $readBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were provided, but $readBits were read"); } } @@ -232,37 +217,33 @@ class Block{ * @internal */ final public function decodeTypeAndStateData(int $data) : void{ - $typeBits = $this->getRequiredTypeDataBits(); - $stateBits = $this->getRequiredStateDataBits(); - $reader = new RuntimeDataReader($typeBits + $stateBits, $data); - $this->decodeTypeData($reader->readInt($typeBits)); - $this->decodeStateData($reader->readInt($stateBits)); + $reader = new RuntimeDataReader($this->requiredTypeDataBits + $this->requiredStateDataBits, $data); + $this->decodeTypeData($reader->readInt($this->requiredTypeDataBits)); + $this->decodeStateData($reader->readInt($this->requiredStateDataBits)); } /** * @internal */ final public function computeTypeData() : int{ - $typeBits = $this->getRequiredTypeDataBits(); - $writer = new RuntimeDataWriter($typeBits); + $writer = new RuntimeDataWriter($this->requiredTypeDataBits); $this->describeType($writer); $writtenBits = $writer->getOffset(); - if($typeBits !== $writtenBits){ - throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were expected, but $writtenBits were written"); + if($this->requiredTypeDataBits !== $writtenBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were expected, but $writtenBits were written"); } return $writer->getValue(); } private function computeStateData() : int{ - $stateBits = $this->getRequiredStateDataBits(); - $writer = new RuntimeDataWriter($stateBits); + $writer = new RuntimeDataWriter($this->requiredStateDataBits); $this->describeState($writer); $writtenBits = $writer->getOffset(); - if($stateBits !== $writtenBits){ - throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); + if($this->requiredStateDataBits !== $writtenBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were expected, but $writtenBits were written"); } return $writer->getValue(); @@ -272,11 +253,9 @@ class Block{ * @internal */ final public function computeTypeAndStateData() : int{ - $typeBits = $this->getRequiredTypeDataBits(); - $stateBits = $this->getRequiredStateDataBits(); - $writer = new RuntimeDataWriter($typeBits + $stateBits); - $writer->writeInt($typeBits, $this->computeTypeData()); - $writer->writeInt($stateBits, $this->computeStateData()); + $writer = new RuntimeDataWriter($this->requiredTypeDataBits + $this->requiredStateDataBits); + $writer->writeInt($this->requiredTypeDataBits, $this->computeTypeData()); + $writer->writeInt($this->requiredStateDataBits, $this->computeStateData()); return $writer->getValue(); } From 027d8f73778b1a6153a79a7edcd875c362e0f0b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 12:55:18 +0100 Subject: [PATCH 0861/1858] always the CS... --- src/item/ItemBlock.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index ccd8793ef9..16c4badf32 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\RuntimeBlockStateRegistry; -use pocketmine\block\VanillaBlocks; use pocketmine\data\runtime\RuntimeDataDescriber; /** From e40774d62fec6373f1af4e3e111ccd618e2d1abd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 13:06:56 +0100 Subject: [PATCH 0862/1858] Block: make internal methods private (they are no longer used outside of Block) --- src/block/Block.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index bfbfcb3b63..8fbb8123dc 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -190,10 +190,7 @@ class Block{ return $this->requiredStateDataBits; } - /** - * @internal - */ - final public function decodeTypeData(int $data) : void{ + private function decodeTypeData(int $data) : void{ $reader = new RuntimeDataReader($this->requiredTypeDataBits, $data); $this->describeType($reader); @@ -222,10 +219,7 @@ class Block{ $this->decodeStateData($reader->readInt($this->requiredStateDataBits)); } - /** - * @internal - */ - final public function computeTypeData() : int{ + private function computeTypeData() : int{ $writer = new RuntimeDataWriter($this->requiredTypeDataBits); $this->describeType($writer); From b122703fd0505c2c8315add011df782660e3adf7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 13:18:47 +0100 Subject: [PATCH 0863/1858] BaseCoral: fixed late property initialization --- src/block/BaseCoral.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index 79a489e5bd..73b2c48d67 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -34,8 +34,8 @@ abstract class BaseCoral extends Transparent{ use CoralTypeTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - parent::__construct($idInfo, $name, $typeInfo); $this->coralType = CoralType::TUBE(); + parent::__construct($idInfo, $name, $typeInfo); } public function onNearbyBlockChange() : void{ From 10243c7b2c315e10bd7f212d3dc265b13ba8f48a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 13:19:24 +0100 Subject: [PATCH 0864/1858] Bump phpstan/phpstan from 1.10.11 to 1.10.13 (#5697) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.11 to 1.10.13. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.11...1.10.13) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 1eb2eb8665..b57cf9b7ac 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.11", + "phpstan/phpstan": "1.10.13", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 9dacda0efd..e84eb6c8ce 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6cd5185a409af08d842a5e41ba3b877b", + "content-hash": "d819da2b086b38c4dd2a5028084e251c", "packages": [ { "name": "adhocore/json-comment", @@ -1884,16 +1884,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.11", + "version": "1.10.13", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21" + "reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", - "reference": "8aa62e6ea8b58ffb650e02940e55a788cbc3fe21", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f07bf8c6980b81bf9e49d44bd0caf2e737614a70", + "reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70", "shasum": "" }, "require": { @@ -1942,7 +1942,7 @@ "type": "tidelift" } ], - "time": "2023-04-04T19:17:42+00:00" + "time": "2023-04-12T19:29:52+00:00" }, { "name": "phpstan/phpstan-phpunit", From 6acabf7a1b7b7c27e6ec4187d466a15b3e48a102 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Apr 2023 13:40:53 +0100 Subject: [PATCH 0865/1858] Block: add clarifying note about isSameType() I'm still not happy with this method though... --- src/block/Block.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index 8fbb8123dc..b818cbac92 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -140,6 +140,9 @@ class Block{ /** * Returns whether the given block has an equivalent type to this one. This compares the type IDs. + * + * Type properties (e.g. colour, skull type, etc.) are not compared. This means that different colours of wool, + * concrete, etc. will all be considered as having the same type. */ public function isSameType(Block $other) : bool{ return $this->getTypeId() === $other->getTypeId(); From 6fc4ce0f8635dfea0ed86791d5b4b867c9151175 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 15:40:52 +0100 Subject: [PATCH 0866/1858] =?UTF-8?q?=C3=82TimingsCommand:=20include=20HTT?= =?UTF-8?q?P=20response=20code=20in=20debug=20message=20we=20should=20prob?= =?UTF-8?q?ably=20show=20this=20in=20the=20regular=20response=20message,?= =?UTF-8?q?=20but=20we=20need=20new=20translations=20for=20that.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/command/defaults/TimingsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command/defaults/TimingsCommand.php b/src/command/defaults/TimingsCommand.php index 60b4564b85..4eea19eb71 100644 --- a/src/command/defaults/TimingsCommand.php +++ b/src/command/defaults/TimingsCommand.php @@ -167,7 +167,7 @@ class TimingsCommand extends VanillaCommand{ Command::broadcastCommandMessage($sender, KnownTranslationFactory::pocketmine_command_timings_timingsRead( "https://" . $host . "/?id=" . $response["id"])); }else{ - $sender->getServer()->getLogger()->debug("Invalid response from timings server: " . $result->getBody()); + $sender->getServer()->getLogger()->debug("Invalid response from timings server (" . $result->getCode() . "): " . $result->getBody()); Command::broadcastCommandMessage($sender, KnownTranslationFactory::pocketmine_command_timings_pasteError()); } } From e48a4aaa551e7a61a9664846c3e5a6492fefbf6d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 16:00:22 +0100 Subject: [PATCH 0867/1858] World: fixed chunk ticking not being disabled by setting chunk ticking radius to 0 I can't believe I missed this ... --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index 31e0ba897b..607da30cbb 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -507,7 +507,7 @@ class World implements ChunkManager{ $this->time = $this->provider->getWorldData()->getTime(); $cfg = $this->server->getConfigGroup(); - $this->chunkTickRadius = min($this->server->getViewDistance(), max(1, $cfg->getPropertyInt("chunk-ticking.tick-radius", 4))); + $this->chunkTickRadius = min($this->server->getViewDistance(), max(0, $cfg->getPropertyInt("chunk-ticking.tick-radius", 4))); if($cfg->getPropertyInt("chunk-ticking.per-tick", 40) <= 0){ //TODO: this needs l10n $this->logger->warning("\"chunk-ticking.per-tick\" setting is deprecated, but you've used it to disable chunk ticking. Set \"chunk-ticking.tick-radius\" to 0 in \"pocketmine.yml\" instead."); From ab0c444823f5cf98f4c58604944c15fec0d24a2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 16:01:24 +0100 Subject: [PATCH 0868/1858] Player: fixed ticking chunks not being re-registered if they never left the view distance closes #5699 --- src/player/Player.php | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 8b871bf3e0..11e7ba3b09 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -894,6 +894,31 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } } + /** + * @param true[] $oldTickingChunks + * @param true[] $newTickingChunks + * + * @phpstan-param array $oldTickingChunks + * @phpstan-param array $newTickingChunks + */ + private function updateTickingChunkRegistrations(array $oldTickingChunks, array $newTickingChunks) : void{ + $world = $this->getWorld(); + foreach($oldTickingChunks as $hash => $_){ + if(!isset($newTickingChunks[$hash]) && !isset($this->loadQueue[$hash])){ + //we are (probably) still using this chunk, but it's no longer within ticking range + World::getXZ($hash, $tickingChunkX, $tickingChunkZ); + $world->unregisterTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); + } + } + foreach($newTickingChunks as $hash => $_){ + if(!isset($oldTickingChunks[$hash]) && !isset($this->loadQueue[$hash])){ + //we were already using this chunk, but it is now within ticking range + World::getXZ($hash, $tickingChunkX, $tickingChunkZ); + $world->registerTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); + } + } + } + /** * Calculates which new chunks this player needs to use, and which currently-used chunks it needs to stop using. * This is based on factors including the player's current render radius and current position. @@ -930,15 +955,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ World::getXZ($index, $X, $Z); $this->unloadChunk($X, $Z); } - foreach($this->tickingChunks as $hash => $_){ - //any chunks we encounter here are still used by the player, but may no longer be within ticking range - if(!isset($tickingChunks[$hash]) && !isset($newOrder[$hash])){ - World::getXZ($hash, $tickingChunkX, $tickingChunkZ); - $world->unregisterTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); - } - } $this->loadQueue = $newOrder; + + $this->updateTickingChunkRegistrations($this->tickingChunks, $tickingChunks); $this->tickingChunks = $tickingChunks; if(count($this->loadQueue) > 0 || count($unloadChunks) > 0){ From 692e1253c68f3aaa50e00a5a8deae74d253db791 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 16:02:17 +0100 Subject: [PATCH 0869/1858] Fixed AABB height for farmland and grass paths (fixed in 1.19.50) --- src/block/Farmland.php | 2 +- src/block/GrassPath.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 57392300f9..04f2e80b80 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -64,7 +64,7 @@ class Farmland extends Transparent{ * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ - return [AxisAlignedBB::one()]; //TODO: this should be trimmed at the top by 1/16, but MCPE currently treats them as a full block (https://bugs.mojang.com/browse/MCPE-12109) + return [AxisAlignedBB::one()->trim(Facing::UP, 1 / 16)]; } public function onNearbyBlockChange() : void{ diff --git a/src/block/GrassPath.php b/src/block/GrassPath.php index 7cbb873ef4..5b11bd3745 100644 --- a/src/block/GrassPath.php +++ b/src/block/GrassPath.php @@ -33,7 +33,7 @@ class GrassPath extends Transparent{ * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ - return [AxisAlignedBB::one()]; //TODO: this should be trimmed at the top by 1/16, but MCPE currently treats them as a full block (https://bugs.mojang.com/browse/MCPE-12109) + return [AxisAlignedBB::one()->trim(Facing::UP, 1 / 16)]; } public function onNearbyBlockChange() : void{ From 5a29d07021bb4c1b9c037d60f1ef681d7c7b9ccf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 16:47:43 +0100 Subject: [PATCH 0870/1858] Release 4.19.1 --- changelogs/4.19.md | 11 +++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/changelogs/4.19.md b/changelogs/4.19.md index 9befb4e0bc..a64a4011cb 100644 --- a/changelogs/4.19.md +++ b/changelogs/4.19.md @@ -75,3 +75,14 @@ It works similarly to the `ChunkLoader` system, in that chunks will be ticked as - The following API methods have been added: - `public World->registerTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void` - registers a chunk to be ticked by the given `ChunkTicker` - `public World->unregisterTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void` - unregisters a chunk from being ticked by the given `ChunkTicker` + +# 4.19.1 +Released 14th April 2023. + +## Fixes +- Fixed inventory rollbacks when spreading items in ender chests. +- Fixed inventory rollbacks when shift-clicking to craft and the outputs would have been split across multiple inventory slots. +- Fixed incorrect spawn terrain generation for newly created worlds. +- Fixed `chunk-ticking.tick-radius` not disabling chunk ticking when set to `0`. +- Fixed chunks not being ticked if they previously left a player's simulation distance without leaving their view distance. +- Fixed height of collision boxes for Grass Path and Farmland blocks. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 50ef8c3778..bc50c984cd 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.19.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 3dd1ce2d02497db8882c1652e79fbbfea07c03e0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 16:47:46 +0100 Subject: [PATCH 0871/1858] 4.19.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index bc50c984cd..765628d131 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.19.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.19.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 7aeedd8220970147f3ee6476a17ee411686e5540 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 17:32:56 +0100 Subject: [PATCH 0872/1858] Timings: fixed every player getting its own timings we need a more consistent way to deal with this --- src/timings/Timings.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 9342c81be9..2207643994 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -256,10 +256,11 @@ abstract class Timings{ if(!isset(self::$entityTypeTimingMap[$entityType])){ //the timings viewer calculates average player count by looking at this timer, so we need to ensure it has //a name it can identify. However, we also want to make it obvious if this is a custom Player class. + $displayName = $entityType; if($entity instanceof Player && $reflect->getName() !== Player::class){ - $entityType = "Player (" . $reflect->getName() . ")"; + $displayName = "Player (" . $reflect->getName() . ")"; } - self::$entityTypeTimingMap[$entityType] = new TimingsHandler("Entity Tick - " . $entityType, self::$tickEntity, group: self::GROUP_BREAKDOWN); + self::$entityTypeTimingMap[$entityType] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN); } return self::$entityTypeTimingMap[$entityType]; From bf7975da5736ed612fc8282976774b23d7b268b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 18:22:35 +0100 Subject: [PATCH 0873/1858] Timings: use class to index packet timings, not IDs on multi version servers, the same packet may have different IDs, or different packets might use the same ID. In these cases, we don't want the timings to get split up or erroneously reused. --- src/timings/Timings.php | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 2207643994..70c202c9e3 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -276,17 +276,15 @@ abstract class Timings{ } public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ - $pid = $pk->pid(); - if(!isset(self::$packetReceiveTimingMap[$pid])){ - self::$packetReceiveTimingMap[$pid] = new TimingsHandler("Receive - " . $pk->getName(), self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); + if(!isset(self::$packetReceiveTimingMap[$pk::class])){ + self::$packetReceiveTimingMap[$pk::class] = new TimingsHandler("Receive - " . $pk->getName(), self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); } - return self::$packetReceiveTimingMap[$pid]; + return self::$packetReceiveTimingMap[$pk::class]; } public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ - $pid = $pk->pid(); - return self::$packetDecodeTimingMap[$pid] ??= new TimingsHandler( + return self::$packetDecodeTimingMap[$pk::class] ??= new TimingsHandler( "Decode - " . $pk->getName(), self::getReceiveDataPacketTimings($pk), group: self::GROUP_BREAKDOWN @@ -294,8 +292,7 @@ abstract class Timings{ } public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ - $pid = $pk->pid(); - return self::$packetHandleTimingMap[$pid] ??= new TimingsHandler( + return self::$packetHandleTimingMap[$pk::class] ??= new TimingsHandler( "Handler - " . $pk->getName(), self::getReceiveDataPacketTimings($pk), group: self::GROUP_BREAKDOWN @@ -303,8 +300,7 @@ abstract class Timings{ } public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ - $pid = $pk->pid(); - return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler( + return self::$packetEncodeTimingMap[$pk::class] ??= new TimingsHandler( "Encode - " . $pk->getName(), self::getSendDataPacketTimings($pk), group: self::GROUP_BREAKDOWN @@ -312,12 +308,11 @@ abstract class Timings{ } public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ - $pid = $pk->pid(); - if(!isset(self::$packetSendTimingMap[$pid])){ - self::$packetSendTimingMap[$pid] = new TimingsHandler("Send - " . $pk->getName(), self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + if(!isset(self::$packetSendTimingMap[$pk::class])){ + self::$packetSendTimingMap[$pk::class] = new TimingsHandler("Send - " . $pk->getName(), self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); } - return self::$packetSendTimingMap[$pid]; + return self::$packetSendTimingMap[$pk::class]; } public static function getEventTimings(Event $event) : TimingsHandler{ From 6c6f686f8eee873cb7219ed109bbbf3b4701be70 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 18:24:53 +0100 Subject: [PATCH 0874/1858] Timings: be more intelligent about shortening timer names non-pocketmine classes may reuse the names of pocketmine core classes. We don't want timers to get erroneously reused in this case. --- src/timings/Timings.php | 48 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 70c202c9e3..a400a73b4f 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -250,29 +250,42 @@ abstract class Timings{ return self::$pluginTaskTimingMap[$name]; } + /** + * @phpstan-template T of object + * @phpstan-param class-string $class + */ + private static function shortenCoreClassName(string $class, string $prefix) : string{ + if(str_starts_with($class, $prefix)){ + return (new \ReflectionClass($class))->getShortName(); + } + return $class; + } + public static function getEntityTimings(Entity $entity) : TimingsHandler{ - $reflect = new \ReflectionClass($entity); - $entityType = $reflect->getShortName(); - if(!isset(self::$entityTypeTimingMap[$entityType])){ - //the timings viewer calculates average player count by looking at this timer, so we need to ensure it has - //a name it can identify. However, we also want to make it obvious if this is a custom Player class. - $displayName = $entityType; - if($entity instanceof Player && $reflect->getName() !== Player::class){ - $displayName = "Player (" . $reflect->getName() . ")"; + if(!isset(self::$entityTypeTimingMap[$entity::class])){ + if($entity instanceof Player){ + //the timings viewer calculates average player count by looking at this timer, so we need to ensure it has + //a name it can identify. However, we also want to make it obvious if this is a custom Player class. + $displayName = $entity::class !== Player::class ? "Player (" . $entity::class . ")" : "Player"; + }else{ + $displayName = self::shortenCoreClassName($entity::class, "pocketmine\\entity\\"); } - self::$entityTypeTimingMap[$entityType] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN); + self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN); } - return self::$entityTypeTimingMap[$entityType]; + return self::$entityTypeTimingMap[$entity::class]; } public static function getTileEntityTimings(Tile $tile) : TimingsHandler{ - $tileType = (new \ReflectionClass($tile))->getShortName(); - if(!isset(self::$tileEntityTypeTimingMap[$tileType])){ - self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler("Block Entity Tick - " . $tileType, self::$tickTileEntity, group: self::GROUP_BREAKDOWN); + if(!isset(self::$tileEntityTypeTimingMap[$tile::class])){ + self::$tileEntityTypeTimingMap[$tile::class] = new TimingsHandler( + "Block Entity Tick - " . self::shortenCoreClassName($tile::class, "pocketmine\\block\\tile\\"), + self::$tickTileEntity, + group: self::GROUP_BREAKDOWN + ); } - return self::$tileEntityTypeTimingMap[$tileType]; + return self::$tileEntityTypeTimingMap[$tile::class]; } public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ @@ -318,12 +331,7 @@ abstract class Timings{ public static function getEventTimings(Event $event) : TimingsHandler{ $eventClass = get_class($event); if(!isset(self::$events[$eventClass])){ - if(str_starts_with($eventClass, "pocketmine\\event\\")){ - $name = (new \ReflectionClass($event))->getShortName(); - }else{ - $name = $eventClass; - } - self::$events[$eventClass] = new TimingsHandler($name, group: "Events"); + self::$events[$eventClass] = new TimingsHandler(self::shortenCoreClassName($eventClass, "pocketmine\\event\\"), group: "Events"); } return self::$events[$eventClass]; From 5ab954b7a04fd265db723a3d367672d2e120d083 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 18:31:57 +0100 Subject: [PATCH 0875/1858] Update composer dependencies --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index e84eb6c8ce..d92d16d275 100644 --- a/composer.lock +++ b/composer.lock @@ -2365,16 +2365,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.6", + "version": "9.6.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115" + "reference": "c993f0d3b0489ffc42ee2fe0bd645af1538a63b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c993f0d3b0489ffc42ee2fe0bd645af1538a63b2", + "reference": "c993f0d3b0489ffc42ee2fe0bd645af1538a63b2", "shasum": "" }, "require": { @@ -2448,7 +2448,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.7" }, "funding": [ { @@ -2464,7 +2464,7 @@ "type": "tidelift" } ], - "time": "2023-03-27T11:43:46+00:00" + "time": "2023-04-14T08:58:40+00:00" }, { "name": "sebastian/cli-parser", From a534ac759ab1d13c50de8f5728ed28612a6dd019 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 18:43:41 +0100 Subject: [PATCH 0876/1858] Release 4.19.2 --- changelogs/4.19.md | 8 ++++++++ src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/changelogs/4.19.md b/changelogs/4.19.md index a64a4011cb..b8127b335d 100644 --- a/changelogs/4.19.md +++ b/changelogs/4.19.md @@ -86,3 +86,11 @@ Released 14th April 2023. - Fixed `chunk-ticking.tick-radius` not disabling chunk ticking when set to `0`. - Fixed chunks not being ticked if they previously left a player's simulation distance without leaving their view distance. - Fixed height of collision boxes for Grass Path and Farmland blocks. + +# 4.19.2 +Released 14th April 2023. + +## Fixes +- Fixed player timings duplication leading to extremely large timings reports when timings runs for a long time with many players. +- Packet timings are now indexed by class FQN instead of packet ID. This prevents erroneous timer reuse on packet ID reuse (e.g. multi version servers). +- Fixed entity timings being shared by different classes with the same short name. This led to incorrect timings being reported for some entities when custom entities were used. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 765628d131..573fffa2f6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.19.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From df0d72bf6146e0f0aeb93b31070e1b589f4d65b8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Apr 2023 18:43:44 +0100 Subject: [PATCH 0877/1858] 4.19.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 573fffa2f6..42ead9ee5e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.19.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.19.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 4ba57f2b039173b238f115bbd912cf091fc45b50 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Apr 2023 00:40:43 +0100 Subject: [PATCH 0878/1858] RegisteredListener: use try...finally to stop timings While event handlers should not throw exceptions, we need to make sure the timings get stopped in the correct order, because the parent Event timer will be stopped due to using a finally block. If this happens while the handler timing is still running, a second exception will occur, obscuring the real error. --- src/event/RegisteredListener.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/event/RegisteredListener.php b/src/event/RegisteredListener.php index d227fc2cb5..6b29dfec30 100644 --- a/src/event/RegisteredListener.php +++ b/src/event/RegisteredListener.php @@ -57,8 +57,11 @@ class RegisteredListener{ return; } $this->timings->startTiming(); - ($this->handler)($event); - $this->timings->stopTiming(); + try{ + ($this->handler)($event); + }finally{ + $this->timings->stopTiming(); + } } public function isHandlingCancelled() : bool{ From b5dc72b0ee4fffba7be91e022a804f255bb58c98 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Apr 2023 16:47:17 +0100 Subject: [PATCH 0879/1858] tools/simulate-chunk-selector: fixed the script being completely broken getopt() behaviour is really, really dumb --- tools/simulate-chunk-selector.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/simulate-chunk-selector.php b/tools/simulate-chunk-selector.php index 81beb6bb3c..0b279268ab 100644 --- a/tools/simulate-chunk-selector.php +++ b/tools/simulate-chunk-selector.php @@ -24,12 +24,10 @@ declare(strict_types=1); namespace pocketmine\tools\simulate_chunk_selector; use pocketmine\player\ChunkSelector; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use pocketmine\world\format\Chunk; use pocketmine\world\World; use Symfony\Component\Filesystem\Path; -use function assert; use function count; use function dirname; use function fwrite; @@ -128,7 +126,12 @@ if(count(getopt("", ["help"])) !== 0){ exit(0); } -foreach(Utils::stringifyKeys(getopt("", ["radius:", "baseX:", "baseZ:", "scale:", "chunksPerStep:"])) as $name => $value){ +$opts = getopt("", ["radius:", "baseX:", "baseZ:", "scale:", "chunksPerStep:", "output:"]); +foreach(["radius", "baseX", "baseZ", "scale", "chunksPerStep"] as $name){ + $value = $opts[$name] ?? null; + if($value === null){ + continue; + } if(!is_string($value) || (string) ((int) $value) !== $value){ fwrite(STDERR, "Value for --$name must be an integer\n"); exit(1); @@ -139,8 +142,7 @@ foreach(Utils::stringifyKeys(getopt("", ["radius:", "baseX:", "baseZ:", "scale:" "baseX" => ($baseX = $value), "baseZ" => ($baseZ = $value), "scale" => ($scale = $value), - "chunksPerStep" => ($nChunksPerStep = $value), - default => throw new AssumptionFailedError("getopt() returned unknown option") + "chunksPerStep" => ($nChunksPerStep = $value) }; } if($radius === null){ @@ -149,10 +151,10 @@ if($radius === null){ } $outputDirectory = null; -foreach(Utils::stringifyKeys(getopt("", ["output:"])) as $name => $value){ - assert($name === "output"); +if(isset($opts["output"])){ + $value = $opts["output"]; if(!is_string($value)){ - fwrite(STDERR, "Value for --$name must be a string\n"); + fwrite(STDERR, "Value for --output be a string\n"); exit(1); } if(!@mkdir($value) && !is_dir($value)){ From 56fbd45dd5790a9bbc7182b800933c5f38e1700a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Apr 2023 17:38:26 +0100 Subject: [PATCH 0880/1858] Entity: avoid double-checking block intersections for moving entities fixes #1824 --- src/entity/Entity.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 69fc684a1f..346f196e4c 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -115,6 +115,8 @@ abstract class Entity{ /** @var Block[]|null */ protected $blocksAround; + private bool $checkBlockIntersectionsNextTick = true; + /** @var Location */ protected $location; /** @var Location */ @@ -649,7 +651,10 @@ abstract class Entity{ $hasUpdate = false; - $this->checkBlockIntersections(); + if($this->checkBlockIntersectionsNextTick){ + $this->checkBlockIntersections(); + } + $this->checkBlockIntersectionsNextTick = true; if($this->location->y <= World::Y_MIN - 16 && $this->isAlive()){ $ev = new EntityDamageEvent($this, EntityDamageEvent::CAUSE_VOID, 10); @@ -1308,6 +1313,7 @@ abstract class Entity{ } protected function checkBlockIntersections() : void{ + $this->checkBlockIntersectionsNextTick = false; $vectors = []; foreach($this->getBlocksAroundWithEntityInsideActions() as $block){ From 9561ae5af7d679974ef5eef66317936c2e5563eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Apr 2023 17:57:51 +0100 Subject: [PATCH 0881/1858] Entity: micro optimisation for checkBlockIntersections() --- src/entity/Entity.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 346f196e4c..0266407c9e 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1325,10 +1325,12 @@ abstract class Entity{ } } - $vector = Vector3::sum(...$vectors); - if($vector->lengthSquared() > 0){ - $d = 0.014; - $this->motion = $this->motion->addVector($vector->normalize()->multiply($d)); + if(count($vectors) > 0){ + $vector = Vector3::sum(...$vectors); + if($vector->lengthSquared() > 0){ + $d = 0.014; + $this->motion = $this->motion->addVector($vector->normalize()->multiply($d)); + } } } From 0629d11e130ba3d9b2b240c97dfbecfa79e121a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 16 Apr 2023 20:51:55 +0100 Subject: [PATCH 0882/1858] Avoid unnecessary events work in handleDataPacket if the events have no registered handlers this particular optimisation became possible thanks to changes in 4.19. I observed that the allocation of Event objects and calling ->call() was costing us a significant percentage of the time taken in PlayerAuthInputPacket handlers. This change produces a measurable 2 microsecond reduction in overhead for PlayerAuthInputPacket handling when players are not moving (10.7 -> 8.7 microseconds). On a server with 200 players, this translates into a 1% reduction in CPU load for PlayerAuthInputPacket alone. It will also benefit other packets, but not to the extent that PlayerAuthInputPacket benefits. --- src/event/Event.php | 11 +++++++++ src/network/mcpe/NetworkSession.php | 35 ++++++++++++++++------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/event/Event.php b/src/event/Event.php index 1ae7bb96f6..6264d85259 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -27,6 +27,7 @@ declare(strict_types=1); namespace pocketmine\event; use pocketmine\timings\Timings; +use function count; use function get_class; abstract class Event{ @@ -67,4 +68,14 @@ abstract class Event{ $timings->stopTiming(); } } + + /** + * Returns whether the current class context has any registered global handlers. + * This can be used in hot code paths to avoid unnecessary event object creation. + * + * Usage: SomeEventClass::hasHandlers() + */ + public static function hasHandlers() : bool{ + return count(HandlerListManager::global()->getListFor(static::class)->getListenerList()) > 0; + } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7f07fbd77c..dfba61babc 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -401,10 +401,12 @@ class NetworkSession{ $timings->startTiming(); try{ - $ev = new DataPacketDecodeEvent($this, $packet->pid(), $buffer); - $ev->call(); - if($ev->isCancelled()){ - return; + if(DataPacketDecodeEvent::hasHandlers()){ + $ev = new DataPacketDecodeEvent($this, $packet->pid(), $buffer); + $ev->call(); + if($ev->isCancelled()){ + return; + } } $decodeTimings = Timings::getDecodeDataPacketTimings($packet); @@ -424,19 +426,22 @@ class NetworkSession{ $decodeTimings->stopTiming(); } - $ev = new DataPacketReceiveEvent($this, $packet); - $ev->call(); - if(!$ev->isCancelled()){ - $handlerTimings = Timings::getHandleDataPacketTimings($packet); - $handlerTimings->startTiming(); - try{ - if($this->handler === null || !$packet->handle($this->handler)){ - $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); - } - }finally{ - $handlerTimings->stopTiming(); + if(DataPacketReceiveEvent::hasHandlers()){ + $ev = new DataPacketReceiveEvent($this, $packet); + $ev->call(); + if($ev->isCancelled()){ + return; } } + $handlerTimings = Timings::getHandleDataPacketTimings($packet); + $handlerTimings->startTiming(); + try{ + if($this->handler === null || !$packet->handle($this->handler)){ + $this->logger->debug("Unhandled " . $packet->getName() . ": " . base64_encode($stream->getBuffer())); + } + }finally{ + $handlerTimings->stopTiming(); + } }finally{ $timings->stopTiming(); } From d07acd0013fa3093154de365f9574dd2350f4957 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 17 Apr 2023 14:05:46 +0100 Subject: [PATCH 0883/1858] RakLibInterface: split error ID into 4-character chunks this makes it easier to read, since the error ID can't be copy-pasted from the disconnection screen on the client. --- src/network/mcpe/raklib/RakLibInterface.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 46927b4f6f..f420d4352f 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -53,6 +53,7 @@ use function implode; use function mt_rand; use function random_bytes; use function rtrim; +use function str_split; use function substr; use const PHP_INT_MAX; @@ -196,7 +197,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ try{ $session->handleEncoded($buf); }catch(PacketHandlingException $e){ - $errorId = bin2hex(random_bytes(6)); + $errorId = implode("-", str_split(bin2hex(random_bytes(6)), 4)); $logger = $session->getLogger(); $logger->error("Bad packet (error ID $errorId): " . $e->getMessage()); From 40168a457e8b129e763f3bc33fc458904cba2cca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Apr 2023 14:43:25 +0100 Subject: [PATCH 0884/1858] TypeConverter: fixed coreItemStackToNet() causing item NBT to be prepared twice hasNamedTag() calls getNamedTag(), which calls serializeCompoundTag(), which writes the item's properties into the given NBT tag. --- src/network/mcpe/convert/TypeConverter.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index e8826e5912..3fe679196a 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -135,9 +135,11 @@ class TypeConverter{ if($itemStack->isNull()){ return ItemStack::null(); } - $nbt = null; - if($itemStack->hasNamedTag()){ - $nbt = clone $itemStack->getNamedTag(); + $nbt = $itemStack->getNamedTag(); + if($nbt->count() === 0){ + $nbt = null; + }else{ + $nbt = clone $nbt; } $isBlockItem = $itemStack->getId() < 256; From 6102740ee35c2f03387748bb795fe74b7724655f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Apr 2023 15:00:34 +0100 Subject: [PATCH 0885/1858] TypeConverter: use a less slow hack to restore meta values on items sent by the client this isn't even really needed anymore, since we don't decode items from the client since 4.18. However, this may still be useful for tools. --- src/network/mcpe/convert/TypeConverter.php | 26 +++++++--------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 3fe679196a..09d5d4a2e0 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; +use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\item\Durable; use pocketmine\item\Item; @@ -142,8 +143,6 @@ class TypeConverter{ $nbt = clone $nbt; } - $isBlockItem = $itemStack->getId() < 256; - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack->getId(), $itemStack->getMeta()); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with @@ -168,23 +167,15 @@ class TypeConverter{ } $nbt->setInt(self::DAMAGE_TAG, $itemStack->getDamage()); $meta = 0; - }elseif($isBlockItem && $itemStack->getMeta() !== 0){ - //TODO HACK: This foul-smelling code ensures that we can correctly deserialize an item when the - //client sends it back to us, because as of 1.16.220, blockitems quietly discard their metadata - //client-side. Aside from being very annoying, this also breaks various server-side behaviours. - if($nbt === null){ - $nbt = new CompoundTag(); - } - $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); - $meta = 0; } } $blockRuntimeId = 0; - if($isBlockItem){ + if($itemStack->getId() < 256){ $block = $itemStack->getBlock(); if($block->getId() !== BlockLegacyIds::AIR){ $blockRuntimeId = RuntimeBlockMapping::getInstance()->toRuntimeId($block->getFullId()); + $meta = 0; } } @@ -210,6 +201,11 @@ class TypeConverter{ $compound = $itemStack->getNbt(); [$id, $meta] = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta()); + if($itemStack->getBlockRuntimeId() !== 0){ + //blockitem meta is zeroed out by the client, so we have to infer it from the block runtime ID + $blockFullId = RuntimeBlockMapping::getInstance()->fromRuntimeId($itemStack->getBlockRuntimeId()); + $meta = $blockFullId & Block::INTERNAL_METADATA_MASK; + } if($compound !== null){ $compound = clone $compound; @@ -224,12 +220,6 @@ class TypeConverter{ $compound->removeTag(self::DAMAGE_TAG_CONFLICT_RESOLUTION); $compound->setTag(self::DAMAGE_TAG, $conflicted); } - }elseif(($metaTag = $compound->getTag(self::PM_META_TAG)) instanceof IntTag){ - //TODO HACK: This foul-smelling code ensures that we can correctly deserialize an item when the - //client sends it back to us, because as of 1.16.220, blockitems quietly discard their metadata - //client-side. Aside from being very annoying, this also breaks various server-side behaviours. - $meta = $metaTag->getValue(); - $compound->removeTag(self::PM_META_TAG); } if($compound->count() === 0){ $compound = null; From a77fc8109f669a7859fe46edc5a0bdb73c0d4b46 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Apr 2023 15:02:52 +0100 Subject: [PATCH 0886/1858] TypeConverter: avoid repeated calls to getId() and getMeta() --- src/network/mcpe/convert/TypeConverter.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 09d5d4a2e0..cfc2454d97 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -143,7 +143,9 @@ class TypeConverter{ $nbt = clone $nbt; } - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack->getId(), $itemStack->getMeta()); + $internalId = $itemStack->getId(); + $internalMeta = $itemStack->getMeta(); + $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($internalId, $internalMeta); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with //other unmapped items. @@ -151,8 +153,8 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setInt(self::PM_ID_TAG, $itemStack->getId()); - $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); + $nbt->setInt(self::PM_ID_TAG, $internalId); + $nbt->setInt(self::PM_META_TAG, $internalMeta); }else{ [$id, $meta] = $idMeta; @@ -171,7 +173,7 @@ class TypeConverter{ } $blockRuntimeId = 0; - if($itemStack->getId() < 256){ + if($internalId < 256){ $block = $itemStack->getBlock(); if($block->getId() !== BlockLegacyIds::AIR){ $blockRuntimeId = RuntimeBlockMapping::getInstance()->toRuntimeId($block->getFullId()); From 674b65f789c193cb221027c7f71a37d83074d877 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Apr 2023 16:18:34 +0100 Subject: [PATCH 0887/1858] Item: optimise serializeCompoundTag() a little --- src/item/Item.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/item/Item.php b/src/item/Item.php index 785a38ca0f..d59e15cd76 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -353,30 +353,35 @@ class Item implements \JsonSerializable{ } protected function serializeCompoundTag(CompoundTag $tag) : void{ - $display = $tag->getCompoundTag(self::TAG_DISPLAY) ?? new CompoundTag(); + $display = $tag->getCompoundTag(self::TAG_DISPLAY); - $this->hasCustomName() ? - $display->setString(self::TAG_DISPLAY_NAME, $this->getCustomName()) : - $display->removeTag(self::TAG_DISPLAY_NAME); + if($this->customName !== ""){ + $display ??= new CompoundTag(); + $display->setString(self::TAG_DISPLAY_NAME, $this->customName); + }else{ + $display?->removeTag(self::TAG_DISPLAY_NAME); + } if(count($this->lore) > 0){ $loreTag = new ListTag(); foreach($this->lore as $line){ $loreTag->push(new StringTag($line)); } + $display ??= new CompoundTag(); $display->setTag(self::TAG_DISPLAY_LORE, $loreTag); }else{ - $display->removeTag(self::TAG_DISPLAY_LORE); + $display?->removeTag(self::TAG_DISPLAY_LORE); } - $display->count() > 0 ? + $display !== null && $display->count() > 0 ? $tag->setTag(self::TAG_DISPLAY, $display) : $tag->removeTag(self::TAG_DISPLAY); - if($this->hasEnchantments()){ + if(count($this->enchantments) > 0){ $ench = new ListTag(); - foreach($this->getEnchantments() as $enchantmentInstance){ + $enchantmentIdMap = EnchantmentIdMap::getInstance(); + foreach($this->enchantments as $enchantmentInstance){ $ench->push(CompoundTag::create() - ->setShort(self::TAG_ENCH_ID, EnchantmentIdMap::getInstance()->toId($enchantmentInstance->getType())) + ->setShort(self::TAG_ENCH_ID, $enchantmentIdMap->toId($enchantmentInstance->getType())) ->setShort(self::TAG_ENCH_LVL, $enchantmentInstance->getLevel()) ); } @@ -385,8 +390,8 @@ class Item implements \JsonSerializable{ $tag->removeTag(self::TAG_ENCH); } - ($blockData = $this->getCustomBlockData()) !== null ? - $tag->setTag(self::TAG_BLOCK_ENTITY_TAG, clone $blockData) : + $this->blockEntityTag !== null ? + $tag->setTag(self::TAG_BLOCK_ENTITY_TAG, clone $this->blockEntityTag) : $tag->removeTag(self::TAG_BLOCK_ENTITY_TAG); if(count($this->canPlaceOn) > 0){ From 4147d0dc7594b308b04a055db8db217680028e10 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Apr 2023 16:42:50 +0100 Subject: [PATCH 0888/1858] tools/generate-blockstate-upgrade-schema: give better errors when a weird new blockstate version is found --- tools/generate-blockstate-upgrade-schema.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index f052432640..6fa2d5b72c 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -196,7 +196,14 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad if($foundVersion === -1 || $mapping->new->getVersion() === $foundVersion){ $foundVersion = $mapping->new->getVersion(); }else{ - throw new AssumptionFailedError("Mixed versions found"); + $logger = \GlobalLogger::get(); + $logger->emergency("Mismatched upgraded versions found: $foundVersion and " . $mapping->new->getVersion()); + $logger->emergency("Mismatched new state: " . $mapping->new->toNbt()); + $logger->emergency("This is probably because the game didn't recognize the input blockstate, so it was returned unchanged."); + $logger->emergency("This is usually because the block is locked behind an experimental toggle that isn't enabled on the world you used when generating this upgrade table."); + $logger->emergency("You can test this in a vanilla game using the /give or /setblock commands to try and acquire the block. Keep trying different experiments until you find the right one."); + + exit(1); } } } From 769be8e140bb671017f7119529e15902479f642b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 20 Apr 2023 00:18:32 +0100 Subject: [PATCH 0889/1858] =?UTF-8?q?Fix=20CS=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/generate-blockstate-upgrade-schema.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 6fa2d5b72c..85d42a35bf 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -30,7 +30,6 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; use pocketmine\nbt\tag\Tag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use function array_key_first; From f9318bf286844829b27ac56bc08d4a1bcfedc138 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 15:38:11 +0100 Subject: [PATCH 0890/1858] TimingsHandler: stop throwing exceptions when timers aren't stopped in the right order this is usually because of an uncaught exception interacting with a try...finally block. This will normally result in a crash anyway, and we don't want to obscure the real error. --- src/timings/TimingsHandler.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index b77610a655..be4979f15e 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -189,12 +189,12 @@ class TimingsHandler{ } $record = TimingsRecord::getCurrentRecord(); - if($record !== null){ - if($record->getTimerId() !== spl_object_id($this)){ - throw new \LogicException("Timer \"" . $record->getName() . "\" should have been stopped before stopping timer \"" . $this->name . "\""); - } + $timerId = spl_object_id($this); + for(; $record !== null && $record->getTimerId() !== $timerId; $record = TimingsRecord::getCurrentRecord()){ + \GlobalLogger::get()->error("Timer \"" . $record->getName() . "\" should have been stopped before stopping timer \"" . $this->name . "\""); $record->stopTiming($now); } + $record?->stopTiming($now); if($this->parent !== null){ $this->parent->internalStopTiming($now); } From 11e34b3e5cdab7639031d8af53aeacf0242ab487 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 15:53:02 +0100 Subject: [PATCH 0891/1858] Release 4.19.3 --- changelogs/4.19.md | 15 +++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/changelogs/4.19.md b/changelogs/4.19.md index b8127b335d..89ef3140bc 100644 --- a/changelogs/4.19.md +++ b/changelogs/4.19.md @@ -94,3 +94,18 @@ Released 14th April 2023. - Fixed player timings duplication leading to extremely large timings reports when timings runs for a long time with many players. - Packet timings are now indexed by class FQN instead of packet ID. This prevents erroneous timer reuse on packet ID reuse (e.g. multi version servers). - Fixed entity timings being shared by different classes with the same short name. This led to incorrect timings being reported for some entities when custom entities were used. + +# 4.19.3 +Released 21st April 2023. + +## General +- Error IDs for `Packet processing error` disconnects are now split into 4-character chunks to make them easier to type (since they can't be copied from the disconnection screen of a client). + +## Fixes +- Fixed entity-block intersections being checked twice per tick. Besides wasting CPU time, this may have caused unexpected behaviour during entity-block interactions with blocks like water or cacti. +- Fixed performance issue in network inventory synchronization due item NBT being prepared twice. +- Fixed `tools/simulate-chunk-selector.php` argument parsing being completely broken (weird behaviour of PHP `getopt()`). + +## Internals +- `TimingsHandler->stopTiming()` now logs an error message if a subtimer wasn't stopped, rather than throwing an exception. + - Due to interactions between `try...finally` and unexpected errors, throwing exceptions made it difficult for plugin developers to debug errors in their plugins, since it obscured the original error. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 42ead9ee5e..0858d617b8 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.19.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From d06d3bc87173df6340c1e5aa3a8995a149300149 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 15:53:05 +0100 Subject: [PATCH 0892/1858] 4.19.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0858d617b8..75b43e6f22 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.19.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.19.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 84a16ce69ae8b8880b2f3ff4e86fbedbe18348fe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 16:19:06 +0100 Subject: [PATCH 0893/1858] HandlerList: fixed crash on getting unused priority these sub-arrays are no longer allocated if no handlers are registered. fixes #5713 --- src/event/HandlerList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 692e8ac70d..efbb20a1b4 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -102,7 +102,7 @@ class HandlerList{ * @return RegisteredListener[] */ public function getListenersByPriority(int $priority) : array{ - return $this->handlerSlots[$priority]; + return $this->handlerSlots[$priority] ?? []; } public function getParent() : ?HandlerList{ From 6c0ad9589be59009a23ec9100a1f2e3e07671bf2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 20:25:21 +0100 Subject: [PATCH 0894/1858] Block: rename isSameType() to hasSameTypeId() this should remove any ambiguity about its behaviour. --- src/block/Bamboo.php | 6 +++--- src/block/Block.php | 2 +- src/block/Cactus.php | 4 ++-- src/block/Candle.php | 2 +- src/block/Chest.php | 4 ++-- src/block/ChorusPlant.php | 4 ++-- src/block/Door.php | 8 ++++---- src/block/DoublePlant.php | 2 +- src/block/Liquid.php | 6 +++--- src/block/NetherVines.php | 4 ++-- src/block/Slab.php | 4 ++-- src/block/Stem.php | 2 +- src/block/Sugarcane.php | 10 +++++----- src/world/World.php | 4 ++-- src/world/generator/object/Ore.php | 4 ++-- 15 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index a6a08859be..dae8572061 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -131,7 +131,7 @@ class Bamboo extends Transparent{ private function seekToTop() : Bamboo{ $world = $this->position->getWorld(); $top = $this; - while(($next = $world->getBlock($top->position->up())) instanceof Bamboo && $next->isSameType($this)){ + while(($next = $world->getBlock($top->position->up())) instanceof Bamboo && $next->hasSameTypeId($this)){ $top = $next; } return $top; @@ -156,7 +156,7 @@ class Bamboo extends Transparent{ public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); $below = $world->getBlock($this->position->down()); - if(!$this->canBeSupportedBy($below) && !$below->isSameType($this)){ + if(!$this->canBeSupportedBy($below) && !$below->hasSameTypeId($this)){ $world->useBreakOn($this->position); } } @@ -168,7 +168,7 @@ class Bamboo extends Transparent{ } $height = 1; - while($world->getBlock($this->position->subtract(0, $height, 0))->isSameType($this)){ + while($world->getBlock($this->position->subtract(0, $height, 0))->hasSameTypeId($this)){ if(++$height >= $maxHeight){ return false; } diff --git a/src/block/Block.php b/src/block/Block.php index b818cbac92..d5cd821fde 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -144,7 +144,7 @@ class Block{ * Type properties (e.g. colour, skull type, etc.) are not compared. This means that different colours of wool, * concrete, etc. will all be considered as having the same type. */ - public function isSameType(Block $other) : bool{ + public function hasSameTypeId(Block $other) : bool{ return $this->getTypeId() === $other->getTypeId(); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 18dd726e77..3563eded7d 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -79,7 +79,7 @@ class Cactus extends Transparent{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->isSameType($this) || $block->hasTypeTag(BlockTypeTags::SAND); + return $block->hasSameTypeId($this) || $block->hasTypeTag(BlockTypeTags::SAND); } public function onNearbyBlockChange() : void{ @@ -102,7 +102,7 @@ class Cactus extends Transparent{ } public function onRandomTick() : void{ - if(!$this->getSide(Facing::DOWN)->isSameType($this)){ + if(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)){ $world = $this->position->getWorld(); if($this->age === self::MAX_AGE){ for($y = 1; $y < 3; ++$y){ diff --git a/src/block/Candle.php b/src/block/Candle.php index 4870277cc2..d958152228 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -95,7 +95,7 @@ class Candle extends Transparent{ } protected function getCandleIfCompatibleType(Block $block) : ?Candle{ - return $block instanceof Candle && $block->isSameType($this) ? $block : null; + return $block instanceof Candle && $block->hasSameTypeId($this) ? $block : null; } public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ diff --git a/src/block/Chest.php b/src/block/Chest.php index bb10e91dfc..45c1905058 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -57,13 +57,13 @@ class Chest extends Transparent{ foreach([false, true] as $clockwise){ $side = Facing::rotateY($this->facing, $clockwise); $c = $this->getSide($side); - if($c instanceof Chest && $c->isSameType($this) && $c->facing === $this->facing){ + if($c instanceof Chest && $c->hasSameTypeId($this) && $c->facing === $this->facing){ $pair = $world->getTile($c->position); if($pair instanceof TileChest && !$pair->isPaired()){ [$left, $right] = $clockwise ? [$c, $this] : [$this, $c]; $ev = new ChestPairEvent($left, $right); $ev->call(); - if(!$ev->isCancelled() && $world->getBlock($this->position)->isSameType($this) && $world->getBlock($c->position)->isSameType($c)){ + if(!$ev->isCancelled() && $world->getBlock($this->position)->hasSameTypeId($this) && $world->getBlock($c->position)->hasSameTypeId($c)){ $pair->pairWith($tile); $tile->pairWith($pair); break; diff --git a/src/block/ChorusPlant.php b/src/block/ChorusPlant.php index ebc5308eeb..f7642bd048 100644 --- a/src/block/ChorusPlant.php +++ b/src/block/ChorusPlant.php @@ -40,7 +40,7 @@ final class ChorusPlant extends Flowable{ $bb = AxisAlignedBB::one(); foreach($this->getAllSides() as $facing => $block){ $id = $block->getTypeId(); - if($id !== BlockTypeIds::END_STONE && $id !== BlockTypeIds::CHORUS_FLOWER && !$block->isSameType($this)){ + if($id !== BlockTypeIds::END_STONE && $id !== BlockTypeIds::CHORUS_FLOWER && !$block->hasSameTypeId($this)){ $bb->trim($facing, 2 / 16); } } @@ -49,7 +49,7 @@ final class ChorusPlant extends Flowable{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->isSameType($this) || $block->getTypeId() === BlockTypeIds::END_STONE; + return $block->hasSameTypeId($this) || $block->getTypeId() === BlockTypeIds::END_STONE; } private function canStay(Position $position) : bool{ diff --git a/src/block/Door.php b/src/block/Door.php index 98a8f53090..d3a2abfb67 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -53,7 +53,7 @@ class Door extends Transparent{ //copy door properties from other half $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); - if($other instanceof Door && $other->isSameType($this)){ + if($other instanceof Door && $other->hasSameTypeId($this)){ if($this->top){ $this->facing = $other->facing; $this->open = $other->open; @@ -126,7 +126,7 @@ class Door extends Transparent{ $next = $this->getSide(Facing::rotateY($this->facing, false)); $next2 = $this->getSide(Facing::rotateY($this->facing, true)); - if($next->isSameType($this) || (!$next2->isTransparent() && $next->isTransparent())){ //Door hinge + if($next->hasSameTypeId($this) || (!$next2->isTransparent() && $next->isTransparent())){ //Door hinge $this->hingeRight = true; } @@ -145,7 +145,7 @@ class Door extends Transparent{ $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); $world = $this->position->getWorld(); - if($other instanceof Door && $other->isSameType($this)){ + if($other instanceof Door && $other->hasSameTypeId($this)){ $other->open = $this->open; $world->setBlock($other->position, $other); } @@ -166,7 +166,7 @@ class Door extends Transparent{ public function getAffectedBlocks() : array{ $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); - if($other->isSameType($this)){ + if($other->hasSameTypeId($this)){ return [$this, $other]; } return parent::getAffectedBlocks(); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index be231c1eaa..cb341adadf 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -65,7 +65,7 @@ class DoublePlant extends Flowable{ return ( $other instanceof DoublePlant && - $other->isSameType($this) && + $other->hasSameTypeId($this) && $other->top !== $this->top ); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 476a8f8c71..ba04510a0d 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -144,7 +144,7 @@ abstract class Liquid extends Transparent{ } protected function getEffectiveFlowDecay(Block $block) : int{ - if(!($block instanceof Liquid) || !$block->isSameType($this)){ + if(!($block instanceof Liquid) || !$block->hasSameTypeId($this)){ return -1; } @@ -282,7 +282,7 @@ abstract class Liquid extends Transparent{ $minAdjacentSources = $this->getMinAdjacentSourcesToFormSource(); if($minAdjacentSources !== null && $this->adjacentSources >= $minAdjacentSources){ $bottomBlock = $world->getBlockAt($this->position->x, $this->position->y - 1, $this->position->z); - if($bottomBlock->isSolid() || ($bottomBlock instanceof Liquid && $bottomBlock->isSameType($this) && $bottomBlock->isSource())){ + if($bottomBlock->isSolid() || ($bottomBlock instanceof Liquid && $bottomBlock->hasSameTypeId($this) && $bottomBlock->isSource())){ $newDecay = 0; $falling = false; } @@ -343,7 +343,7 @@ abstract class Liquid extends Transparent{ /** @phpstan-impure */ private function getSmallestFlowDecay(Block $block, int $decay) : int{ - if(!($block instanceof Liquid) || !$block->isSameType($this)){ + if(!($block instanceof Liquid) || !$block->hasSameTypeId($this)){ return $decay; } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index d00580624c..34ab406c66 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -87,7 +87,7 @@ class NetherVines extends Flowable{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType($this->getSupportFace())->hasCenterSupport() || $block->isSameType($this); + return $block->getSupportType($this->getSupportFace())->hasCenterSupport() || $block->hasSameTypeId($this); } public function onNearbyBlockChange() : void{ @@ -101,7 +101,7 @@ class NetherVines extends Flowable{ */ private function seekToTip() : NetherVines{ $top = $this; - while(($next = $top->getSide($this->growthFace)) instanceof NetherVines && $next->isSameType($this)){ + while(($next = $top->getSide($this->growthFace)) instanceof NetherVines && $next->hasSameTypeId($this)){ $top = $next; } return $top; diff --git a/src/block/Slab.php b/src/block/Slab.php index fa5833d7c2..265dce6954 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -69,7 +69,7 @@ class Slab extends Transparent{ return true; } - if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->isSameType($this)){ + if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->hasSameTypeId($this)){ if($blockReplace->slabType->equals(SlabType::TOP())){ //Trying to combine with top slab return $clickVector->y <= 0.5 || (!$isClickedBlock && $face === Facing::UP); }else{ @@ -81,7 +81,7 @@ class Slab extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->isSameType($this) && ( + if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->hasSameTypeId($this) && ( ($blockReplace->slabType->equals(SlabType::TOP()) && ($clickVector->y <= 0.5 || $face === Facing::UP)) || ($blockReplace->slabType->equals(SlabType::BOTTOM()) && ($clickVector->y >= 0.5 || $face === Facing::DOWN)) )){ diff --git a/src/block/Stem.php b/src/block/Stem.php index 3c7d1d2c30..5f06a46cb1 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -47,7 +47,7 @@ abstract class Stem extends Crops{ }else{ $grow = $this->getPlant(); foreach(Facing::HORIZONTAL as $side){ - if($this->getSide($side)->isSameType($grow)){ + if($this->getSide($side)->hasSameTypeId($grow)){ return; } } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index cc41c0fb0e..136527e782 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -45,7 +45,7 @@ class Sugarcane extends Flowable{ private function seekToBottom() : Position{ $world = $this->position->getWorld(); $bottom = $this->position; - while(($next = $world->getBlock($bottom->down()))->isSameType($this)){ + while(($next = $world->getBlock($bottom->down()))->hasSameTypeId($this)){ $bottom = $next->position; } return $bottom; @@ -67,7 +67,7 @@ class Sugarcane extends Flowable{ } $world->setBlock($b->position, $ev->getNewState()); $grew = true; - }elseif(!$b->isSameType($this)){ + }elseif(!$b->hasSameTypeId($this)){ break; } } @@ -108,7 +108,7 @@ class Sugarcane extends Flowable{ public function onNearbyBlockChange() : void{ $down = $this->getSide(Facing::DOWN); - if(!$down->isSameType($this) && !$this->canBeSupportedBy($down)){ + if(!$down->hasSameTypeId($this) && !$this->canBeSupportedBy($down)){ $this->position->getWorld()->useBreakOn($this->position); } } @@ -118,7 +118,7 @@ class Sugarcane extends Flowable{ } public function onRandomTick() : void{ - if(!$this->getSide(Facing::DOWN)->isSameType($this)){ + if(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)){ if($this->age === self::MAX_AGE){ $this->grow($this->position); }else{ @@ -130,7 +130,7 @@ class Sugarcane extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - if($down->isSameType($this)){ + if($down->hasSameTypeId($this)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); }elseif($this->canBeSupportedBy($down)){ foreach(Facing::HORIZONTAL as $side){ diff --git a/src/world/World.php b/src/world/World.php index 4cd7c61f64..5c0233d0d7 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1922,7 +1922,7 @@ class World implements ChunkManager{ $itemParser = LegacyStringToItemParser::getInstance(); foreach($item->getCanDestroy() as $v){ $entry = $itemParser->parse($v); - if($entry->getBlock()->isSameType($target)){ + if($entry->getBlock()->hasSameTypeId($target)){ $canBreak = true; break; } @@ -2077,7 +2077,7 @@ class World implements ChunkManager{ $itemParser = LegacyStringToItemParser::getInstance(); foreach($item->getCanPlaceOn() as $v){ $entry = $itemParser->parse($v); - if($entry->getBlock()->isSameType($blockClicked)){ + if($entry->getBlock()->hasSameTypeId($blockClicked)){ $canPlace = true; break; } diff --git a/src/world/generator/object/Ore.php b/src/world/generator/object/Ore.php index e56ddc457c..533b731752 100644 --- a/src/world/generator/object/Ore.php +++ b/src/world/generator/object/Ore.php @@ -40,7 +40,7 @@ class Ore{ } public function canPlaceObject(ChunkManager $world, int $x, int $y, int $z) : bool{ - return $world->getBlockAt($x, $y, $z)->isSameType($this->type->replaces); + return $world->getBlockAt($x, $y, $z)->hasSameTypeId($this->type->replaces); } public function placeObject(ChunkManager $world, int $x, int $y, int $z) : void{ @@ -80,7 +80,7 @@ class Ore{ $sizeZ = ($zz + 0.5 - $seedZ) / $size; $sizeZ *= $sizeZ; - if(($sizeX + $sizeY + $sizeZ) < 1 && $world->getBlockAt($xx, $yy, $zz)->isSameType($this->type->replaces)){ + if(($sizeX + $sizeY + $sizeZ) < 1 && $world->getBlockAt($xx, $yy, $zz)->hasSameTypeId($this->type->replaces)){ $world->setBlockAt($xx, $yy, $zz, $this->type->material); } } From d4ca566fd0bb683a3932e21eb889ab1f6df4d6fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 20:38:28 +0100 Subject: [PATCH 0895/1858] Move block permutation generation into Block this allows sealing off a whole bunch of internal APIs. --- src/block/Block.php | 48 ++++++++++++++++--------- src/block/RuntimeBlockStateRegistry.php | 31 +--------------- tests/phpunit/block/BlockTest.php | 2 +- 3 files changed, 34 insertions(+), 47 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index d5cd821fde..bb22247234 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -29,6 +29,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; use pocketmine\block\utils\SupportType; +use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\data\runtime\RuntimeDataReader; use pocketmine\data\runtime\RuntimeDataSizeCalculator; @@ -185,14 +186,6 @@ class Block{ return new ItemBlock($normalized); } - final public function getRequiredTypeDataBits() : int{ - return $this->requiredTypeDataBits; - } - - final public function getRequiredStateDataBits() : int{ - return $this->requiredStateDataBits; - } - private function decodeTypeData(int $data) : void{ $reader = new RuntimeDataReader($this->requiredTypeDataBits, $data); @@ -213,10 +206,7 @@ class Block{ } } - /** - * @internal - */ - final public function decodeTypeAndStateData(int $data) : void{ + private function decodeTypeAndStateData(int $data) : void{ $reader = new RuntimeDataReader($this->requiredTypeDataBits + $this->requiredStateDataBits, $data); $this->decodeTypeData($reader->readInt($this->requiredTypeDataBits)); $this->decodeStateData($reader->readInt($this->requiredStateDataBits)); @@ -246,10 +236,7 @@ class Block{ return $writer->getValue(); } - /** - * @internal - */ - final public function computeTypeAndStateData() : int{ + private function computeTypeAndStateData() : int{ $writer = new RuntimeDataWriter($this->requiredTypeDataBits + $this->requiredStateDataBits); $writer->writeInt($this->requiredTypeDataBits, $this->computeTypeData()); $writer->writeInt($this->requiredStateDataBits, $this->computeStateData()); @@ -281,6 +268,35 @@ class Block{ //NOOP } + /** + * Generates copies of this Block in all possible state permutations. + * Every possible combination of known properties (e.g. facing, open/closed, powered/unpowered, on/off) will be + * generated. + * + * @phpstan-return \Generator + */ + public function generateStatePermutations() : \Generator{ + //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 + $bits = $this->requiredTypeDataBits + $this->requiredStateDataBits; + if($bits > Block::INTERNAL_STATE_DATA_BITS){ + throw new \LogicException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); + } + for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ + $v = clone $this; + try{ + $v->decodeTypeAndStateData($stateData); + if($v->computeTypeAndStateData() !== $stateData){ + throw new \LogicException(static::class . "::decodeStateData() accepts invalid state data (returned " . $v->computeTypeAndStateData() . " for input $stateData)"); + } + }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it + continue; + } + + yield $v; + } + } + /** * Called when this block is created, set, or has a neighbouring block update, to re-detect dynamic properties which * are not saved on the world. diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index 080690c28b..bc08c6a5de 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -25,11 +25,9 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; -use pocketmine\data\runtime\InvalidSerializedRuntimeDataException; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\light\LightUpdate; -use function get_class; use function min; /** @@ -82,33 +80,6 @@ class RuntimeBlockStateRegistry{ } } - /** - * Generates all the possible valid blockstates for a given block type. - * - * @phpstan-return \Generator - */ - private static function generateAllStatesForType(Block $block) : \Generator{ - //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 - $bits = $block->getRequiredTypeDataBits() + $block->getRequiredStateDataBits(); - if($bits > Block::INTERNAL_STATE_DATA_BITS){ - throw new \InvalidArgumentException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); - } - for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ - $v = clone $block; - try{ - $v->decodeTypeAndStateData($stateData); - if($v->computeTypeAndStateData() !== $stateData){ - throw new \LogicException(get_class($block) . "::decodeStateData() accepts invalid state data (returned " . $v->computeTypeAndStateData() . " for input $stateData)"); - } - }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it - continue; - } - - yield $v; - } - } - /** * 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. @@ -130,7 +101,7 @@ class RuntimeBlockStateRegistry{ $this->typeIndex[$typeId] = clone $block; - foreach(self::generateAllStatesForType($block) as $v){ + foreach($block->generateStatePermutations() as $v){ $this->fillStaticArrays($v->getStateId(), $v); } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index cf0b674d62..e10ef7fc7a 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -119,7 +119,7 @@ class BlockTest extends TestCase{ $states = $this->blockFactory->getAllKnownStates(); foreach($states as $stateId => $state){ - self::assertArrayHasKey($stateId, $knownStates, "New block state $stateId (" . $state->getTypeId() . ":" . $state->computeTypeAndStateData() . ", " . print_r($state, true) . ") - consistency check may need regenerating"); + self::assertArrayHasKey($stateId, $knownStates, "New block state $stateId (" . print_r($state, true) . ") - consistency check may need regenerating"); self::assertSame($knownStates[$stateId], $state->getName()); } asort($knownStates, SORT_STRING); From edcaeef83136fa18219dd6d36e71568a19093bd5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Apr 2023 21:33:45 +0100 Subject: [PATCH 0896/1858] VanillaBlocks: reduce width of element block registration --- src/block/VanillaBlocks.php | 239 ++++++++++++++++++------------------ 1 file changed, 121 insertions(+), 118 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 31584f6685..86534de835 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1270,124 +1270,127 @@ final class VanillaBlocks{ $instaBreak = new Info(BreakInfo::instant()); self::register("element_zero", new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); - self::register("element_hydrogen", new Element(new BID(Ids::ELEMENT_HYDROGEN), "Hydrogen", $instaBreak, "h", 1, 5)); - self::register("element_helium", new Element(new BID(Ids::ELEMENT_HELIUM), "Helium", $instaBreak, "he", 2, 7)); - self::register("element_lithium", new Element(new BID(Ids::ELEMENT_LITHIUM), "Lithium", $instaBreak, "li", 3, 0)); - self::register("element_beryllium", new Element(new BID(Ids::ELEMENT_BERYLLIUM), "Beryllium", $instaBreak, "be", 4, 1)); - self::register("element_boron", new Element(new BID(Ids::ELEMENT_BORON), "Boron", $instaBreak, "b", 5, 4)); - self::register("element_carbon", new Element(new BID(Ids::ELEMENT_CARBON), "Carbon", $instaBreak, "c", 6, 5)); - self::register("element_nitrogen", new Element(new BID(Ids::ELEMENT_NITROGEN), "Nitrogen", $instaBreak, "n", 7, 5)); - self::register("element_oxygen", new Element(new BID(Ids::ELEMENT_OXYGEN), "Oxygen", $instaBreak, "o", 8, 5)); - self::register("element_fluorine", new Element(new BID(Ids::ELEMENT_FLUORINE), "Fluorine", $instaBreak, "f", 9, 6)); - self::register("element_neon", new Element(new BID(Ids::ELEMENT_NEON), "Neon", $instaBreak, "ne", 10, 7)); - self::register("element_sodium", new Element(new BID(Ids::ELEMENT_SODIUM), "Sodium", $instaBreak, "na", 11, 0)); - self::register("element_magnesium", new Element(new BID(Ids::ELEMENT_MAGNESIUM), "Magnesium", $instaBreak, "mg", 12, 1)); - self::register("element_aluminum", new Element(new BID(Ids::ELEMENT_ALUMINUM), "Aluminum", $instaBreak, "al", 13, 3)); - self::register("element_silicon", new Element(new BID(Ids::ELEMENT_SILICON), "Silicon", $instaBreak, "si", 14, 4)); - self::register("element_phosphorus", new Element(new BID(Ids::ELEMENT_PHOSPHORUS), "Phosphorus", $instaBreak, "p", 15, 5)); - self::register("element_sulfur", new Element(new BID(Ids::ELEMENT_SULFUR), "Sulfur", $instaBreak, "s", 16, 5)); - self::register("element_chlorine", new Element(new BID(Ids::ELEMENT_CHLORINE), "Chlorine", $instaBreak, "cl", 17, 6)); - self::register("element_argon", new Element(new BID(Ids::ELEMENT_ARGON), "Argon", $instaBreak, "ar", 18, 7)); - self::register("element_potassium", new Element(new BID(Ids::ELEMENT_POTASSIUM), "Potassium", $instaBreak, "k", 19, 0)); - self::register("element_calcium", new Element(new BID(Ids::ELEMENT_CALCIUM), "Calcium", $instaBreak, "ca", 20, 1)); - self::register("element_scandium", new Element(new BID(Ids::ELEMENT_SCANDIUM), "Scandium", $instaBreak, "sc", 21, 2)); - self::register("element_titanium", new Element(new BID(Ids::ELEMENT_TITANIUM), "Titanium", $instaBreak, "ti", 22, 2)); - self::register("element_vanadium", new Element(new BID(Ids::ELEMENT_VANADIUM), "Vanadium", $instaBreak, "v", 23, 2)); - self::register("element_chromium", new Element(new BID(Ids::ELEMENT_CHROMIUM), "Chromium", $instaBreak, "cr", 24, 2)); - self::register("element_manganese", new Element(new BID(Ids::ELEMENT_MANGANESE), "Manganese", $instaBreak, "mn", 25, 2)); - self::register("element_iron", new Element(new BID(Ids::ELEMENT_IRON), "Iron", $instaBreak, "fe", 26, 2)); - self::register("element_cobalt", new Element(new BID(Ids::ELEMENT_COBALT), "Cobalt", $instaBreak, "co", 27, 2)); - self::register("element_nickel", new Element(new BID(Ids::ELEMENT_NICKEL), "Nickel", $instaBreak, "ni", 28, 2)); - self::register("element_copper", new Element(new BID(Ids::ELEMENT_COPPER), "Copper", $instaBreak, "cu", 29, 2)); - self::register("element_zinc", new Element(new BID(Ids::ELEMENT_ZINC), "Zinc", $instaBreak, "zn", 30, 2)); - self::register("element_gallium", new Element(new BID(Ids::ELEMENT_GALLIUM), "Gallium", $instaBreak, "ga", 31, 3)); - self::register("element_germanium", new Element(new BID(Ids::ELEMENT_GERMANIUM), "Germanium", $instaBreak, "ge", 32, 4)); - self::register("element_arsenic", new Element(new BID(Ids::ELEMENT_ARSENIC), "Arsenic", $instaBreak, "as", 33, 4)); - self::register("element_selenium", new Element(new BID(Ids::ELEMENT_SELENIUM), "Selenium", $instaBreak, "se", 34, 5)); - self::register("element_bromine", new Element(new BID(Ids::ELEMENT_BROMINE), "Bromine", $instaBreak, "br", 35, 6)); - self::register("element_krypton", new Element(new BID(Ids::ELEMENT_KRYPTON), "Krypton", $instaBreak, "kr", 36, 7)); - self::register("element_rubidium", new Element(new BID(Ids::ELEMENT_RUBIDIUM), "Rubidium", $instaBreak, "rb", 37, 0)); - self::register("element_strontium", new Element(new BID(Ids::ELEMENT_STRONTIUM), "Strontium", $instaBreak, "sr", 38, 1)); - self::register("element_yttrium", new Element(new BID(Ids::ELEMENT_YTTRIUM), "Yttrium", $instaBreak, "y", 39, 2)); - self::register("element_zirconium", new Element(new BID(Ids::ELEMENT_ZIRCONIUM), "Zirconium", $instaBreak, "zr", 40, 2)); - self::register("element_niobium", new Element(new BID(Ids::ELEMENT_NIOBIUM), "Niobium", $instaBreak, "nb", 41, 2)); - self::register("element_molybdenum", new Element(new BID(Ids::ELEMENT_MOLYBDENUM), "Molybdenum", $instaBreak, "mo", 42, 2)); - self::register("element_technetium", new Element(new BID(Ids::ELEMENT_TECHNETIUM), "Technetium", $instaBreak, "tc", 43, 2)); - self::register("element_ruthenium", new Element(new BID(Ids::ELEMENT_RUTHENIUM), "Ruthenium", $instaBreak, "ru", 44, 2)); - self::register("element_rhodium", new Element(new BID(Ids::ELEMENT_RHODIUM), "Rhodium", $instaBreak, "rh", 45, 2)); - self::register("element_palladium", new Element(new BID(Ids::ELEMENT_PALLADIUM), "Palladium", $instaBreak, "pd", 46, 2)); - self::register("element_silver", new Element(new BID(Ids::ELEMENT_SILVER), "Silver", $instaBreak, "ag", 47, 2)); - self::register("element_cadmium", new Element(new BID(Ids::ELEMENT_CADMIUM), "Cadmium", $instaBreak, "cd", 48, 2)); - self::register("element_indium", new Element(new BID(Ids::ELEMENT_INDIUM), "Indium", $instaBreak, "in", 49, 3)); - self::register("element_tin", new Element(new BID(Ids::ELEMENT_TIN), "Tin", $instaBreak, "sn", 50, 3)); - self::register("element_antimony", new Element(new BID(Ids::ELEMENT_ANTIMONY), "Antimony", $instaBreak, "sb", 51, 4)); - self::register("element_tellurium", new Element(new BID(Ids::ELEMENT_TELLURIUM), "Tellurium", $instaBreak, "te", 52, 4)); - self::register("element_iodine", new Element(new BID(Ids::ELEMENT_IODINE), "Iodine", $instaBreak, "i", 53, 6)); - self::register("element_xenon", new Element(new BID(Ids::ELEMENT_XENON), "Xenon", $instaBreak, "xe", 54, 7)); - self::register("element_cesium", new Element(new BID(Ids::ELEMENT_CESIUM), "Cesium", $instaBreak, "cs", 55, 0)); - self::register("element_barium", new Element(new BID(Ids::ELEMENT_BARIUM), "Barium", $instaBreak, "ba", 56, 1)); - self::register("element_lanthanum", new Element(new BID(Ids::ELEMENT_LANTHANUM), "Lanthanum", $instaBreak, "la", 57, 8)); - self::register("element_cerium", new Element(new BID(Ids::ELEMENT_CERIUM), "Cerium", $instaBreak, "ce", 58, 8)); - self::register("element_praseodymium", new Element(new BID(Ids::ELEMENT_PRASEODYMIUM), "Praseodymium", $instaBreak, "pr", 59, 8)); - self::register("element_neodymium", new Element(new BID(Ids::ELEMENT_NEODYMIUM), "Neodymium", $instaBreak, "nd", 60, 8)); - self::register("element_promethium", new Element(new BID(Ids::ELEMENT_PROMETHIUM), "Promethium", $instaBreak, "pm", 61, 8)); - self::register("element_samarium", new Element(new BID(Ids::ELEMENT_SAMARIUM), "Samarium", $instaBreak, "sm", 62, 8)); - self::register("element_europium", new Element(new BID(Ids::ELEMENT_EUROPIUM), "Europium", $instaBreak, "eu", 63, 8)); - self::register("element_gadolinium", new Element(new BID(Ids::ELEMENT_GADOLINIUM), "Gadolinium", $instaBreak, "gd", 64, 8)); - self::register("element_terbium", new Element(new BID(Ids::ELEMENT_TERBIUM), "Terbium", $instaBreak, "tb", 65, 8)); - self::register("element_dysprosium", new Element(new BID(Ids::ELEMENT_DYSPROSIUM), "Dysprosium", $instaBreak, "dy", 66, 8)); - self::register("element_holmium", new Element(new BID(Ids::ELEMENT_HOLMIUM), "Holmium", $instaBreak, "ho", 67, 8)); - self::register("element_erbium", new Element(new BID(Ids::ELEMENT_ERBIUM), "Erbium", $instaBreak, "er", 68, 8)); - self::register("element_thulium", new Element(new BID(Ids::ELEMENT_THULIUM), "Thulium", $instaBreak, "tm", 69, 8)); - self::register("element_ytterbium", new Element(new BID(Ids::ELEMENT_YTTERBIUM), "Ytterbium", $instaBreak, "yb", 70, 8)); - self::register("element_lutetium", new Element(new BID(Ids::ELEMENT_LUTETIUM), "Lutetium", $instaBreak, "lu", 71, 8)); - self::register("element_hafnium", new Element(new BID(Ids::ELEMENT_HAFNIUM), "Hafnium", $instaBreak, "hf", 72, 2)); - self::register("element_tantalum", new Element(new BID(Ids::ELEMENT_TANTALUM), "Tantalum", $instaBreak, "ta", 73, 2)); - self::register("element_tungsten", new Element(new BID(Ids::ELEMENT_TUNGSTEN), "Tungsten", $instaBreak, "w", 74, 2)); - self::register("element_rhenium", new Element(new BID(Ids::ELEMENT_RHENIUM), "Rhenium", $instaBreak, "re", 75, 2)); - self::register("element_osmium", new Element(new BID(Ids::ELEMENT_OSMIUM), "Osmium", $instaBreak, "os", 76, 2)); - self::register("element_iridium", new Element(new BID(Ids::ELEMENT_IRIDIUM), "Iridium", $instaBreak, "ir", 77, 2)); - self::register("element_platinum", new Element(new BID(Ids::ELEMENT_PLATINUM), "Platinum", $instaBreak, "pt", 78, 2)); - self::register("element_gold", new Element(new BID(Ids::ELEMENT_GOLD), "Gold", $instaBreak, "au", 79, 2)); - self::register("element_mercury", new Element(new BID(Ids::ELEMENT_MERCURY), "Mercury", $instaBreak, "hg", 80, 2)); - self::register("element_thallium", new Element(new BID(Ids::ELEMENT_THALLIUM), "Thallium", $instaBreak, "tl", 81, 3)); - self::register("element_lead", new Element(new BID(Ids::ELEMENT_LEAD), "Lead", $instaBreak, "pb", 82, 3)); - self::register("element_bismuth", new Element(new BID(Ids::ELEMENT_BISMUTH), "Bismuth", $instaBreak, "bi", 83, 3)); - self::register("element_polonium", new Element(new BID(Ids::ELEMENT_POLONIUM), "Polonium", $instaBreak, "po", 84, 4)); - self::register("element_astatine", new Element(new BID(Ids::ELEMENT_ASTATINE), "Astatine", $instaBreak, "at", 85, 6)); - self::register("element_radon", new Element(new BID(Ids::ELEMENT_RADON), "Radon", $instaBreak, "rn", 86, 7)); - self::register("element_francium", new Element(new BID(Ids::ELEMENT_FRANCIUM), "Francium", $instaBreak, "fr", 87, 0)); - self::register("element_radium", new Element(new BID(Ids::ELEMENT_RADIUM), "Radium", $instaBreak, "ra", 88, 1)); - self::register("element_actinium", new Element(new BID(Ids::ELEMENT_ACTINIUM), "Actinium", $instaBreak, "ac", 89, 9)); - self::register("element_thorium", new Element(new BID(Ids::ELEMENT_THORIUM), "Thorium", $instaBreak, "th", 90, 9)); - self::register("element_protactinium", new Element(new BID(Ids::ELEMENT_PROTACTINIUM), "Protactinium", $instaBreak, "pa", 91, 9)); - self::register("element_uranium", new Element(new BID(Ids::ELEMENT_URANIUM), "Uranium", $instaBreak, "u", 92, 9)); - self::register("element_neptunium", new Element(new BID(Ids::ELEMENT_NEPTUNIUM), "Neptunium", $instaBreak, "np", 93, 9)); - self::register("element_plutonium", new Element(new BID(Ids::ELEMENT_PLUTONIUM), "Plutonium", $instaBreak, "pu", 94, 9)); - self::register("element_americium", new Element(new BID(Ids::ELEMENT_AMERICIUM), "Americium", $instaBreak, "am", 95, 9)); - self::register("element_curium", new Element(new BID(Ids::ELEMENT_CURIUM), "Curium", $instaBreak, "cm", 96, 9)); - self::register("element_berkelium", new Element(new BID(Ids::ELEMENT_BERKELIUM), "Berkelium", $instaBreak, "bk", 97, 9)); - self::register("element_californium", new Element(new BID(Ids::ELEMENT_CALIFORNIUM), "Californium", $instaBreak, "cf", 98, 9)); - self::register("element_einsteinium", new Element(new BID(Ids::ELEMENT_EINSTEINIUM), "Einsteinium", $instaBreak, "es", 99, 9)); - self::register("element_fermium", new Element(new BID(Ids::ELEMENT_FERMIUM), "Fermium", $instaBreak, "fm", 100, 9)); - self::register("element_mendelevium", new Element(new BID(Ids::ELEMENT_MENDELEVIUM), "Mendelevium", $instaBreak, "md", 101, 9)); - self::register("element_nobelium", new Element(new BID(Ids::ELEMENT_NOBELIUM), "Nobelium", $instaBreak, "no", 102, 9)); - self::register("element_lawrencium", new Element(new BID(Ids::ELEMENT_LAWRENCIUM), "Lawrencium", $instaBreak, "lr", 103, 9)); - self::register("element_rutherfordium", new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM), "Rutherfordium", $instaBreak, "rf", 104, 2)); - self::register("element_dubnium", new Element(new BID(Ids::ELEMENT_DUBNIUM), "Dubnium", $instaBreak, "db", 105, 2)); - self::register("element_seaborgium", new Element(new BID(Ids::ELEMENT_SEABORGIUM), "Seaborgium", $instaBreak, "sg", 106, 2)); - self::register("element_bohrium", new Element(new BID(Ids::ELEMENT_BOHRIUM), "Bohrium", $instaBreak, "bh", 107, 2)); - self::register("element_hassium", new Element(new BID(Ids::ELEMENT_HASSIUM), "Hassium", $instaBreak, "hs", 108, 2)); - self::register("element_meitnerium", new Element(new BID(Ids::ELEMENT_MEITNERIUM), "Meitnerium", $instaBreak, "mt", 109, 2)); - self::register("element_darmstadtium", new Element(new BID(Ids::ELEMENT_DARMSTADTIUM), "Darmstadtium", $instaBreak, "ds", 110, 2)); - self::register("element_roentgenium", new Element(new BID(Ids::ELEMENT_ROENTGENIUM), "Roentgenium", $instaBreak, "rg", 111, 2)); - self::register("element_copernicium", new Element(new BID(Ids::ELEMENT_COPERNICIUM), "Copernicium", $instaBreak, "cn", 112, 2)); - self::register("element_nihonium", new Element(new BID(Ids::ELEMENT_NIHONIUM), "Nihonium", $instaBreak, "nh", 113, 3)); - self::register("element_flerovium", new Element(new BID(Ids::ELEMENT_FLEROVIUM), "Flerovium", $instaBreak, "fl", 114, 3)); - self::register("element_moscovium", new Element(new BID(Ids::ELEMENT_MOSCOVIUM), "Moscovium", $instaBreak, "mc", 115, 3)); - self::register("element_livermorium", new Element(new BID(Ids::ELEMENT_LIVERMORIUM), "Livermorium", $instaBreak, "lv", 116, 3)); - self::register("element_tennessine", new Element(new BID(Ids::ELEMENT_TENNESSINE), "Tennessine", $instaBreak, "ts", 117, 6)); - self::register("element_oganesson", new Element(new BID(Ids::ELEMENT_OGANESSON), "Oganesson", $instaBreak, "og", 118, 7)); + $register = fn(string $name, int $id, string $displayName, string $symbol, int $atomicWeight, int $group) => + self::register("element_$name", new Element(new BID($id), $displayName, $instaBreak, $symbol, $atomicWeight, $group)); + + $register("hydrogen", Ids::ELEMENT_HYDROGEN, "Hydrogen", "h", 1, 5); + $register("helium", Ids::ELEMENT_HELIUM, "Helium", "he", 2, 7); + $register("lithium", Ids::ELEMENT_LITHIUM, "Lithium", "li", 3, 0); + $register("beryllium", Ids::ELEMENT_BERYLLIUM, "Beryllium", "be", 4, 1); + $register("boron", Ids::ELEMENT_BORON, "Boron", "b", 5, 4); + $register("carbon", Ids::ELEMENT_CARBON, "Carbon", "c", 6, 5); + $register("nitrogen", Ids::ELEMENT_NITROGEN, "Nitrogen", "n", 7, 5); + $register("oxygen", Ids::ELEMENT_OXYGEN, "Oxygen", "o", 8, 5); + $register("fluorine", Ids::ELEMENT_FLUORINE, "Fluorine", "f", 9, 6); + $register("neon", Ids::ELEMENT_NEON, "Neon", "ne", 10, 7); + $register("sodium", Ids::ELEMENT_SODIUM, "Sodium", "na", 11, 0); + $register("magnesium", Ids::ELEMENT_MAGNESIUM, "Magnesium", "mg", 12, 1); + $register("aluminum", Ids::ELEMENT_ALUMINUM, "Aluminum", "al", 13, 3); + $register("silicon", Ids::ELEMENT_SILICON, "Silicon", "si", 14, 4); + $register("phosphorus", Ids::ELEMENT_PHOSPHORUS, "Phosphorus", "p", 15, 5); + $register("sulfur", Ids::ELEMENT_SULFUR, "Sulfur", "s", 16, 5); + $register("chlorine", Ids::ELEMENT_CHLORINE, "Chlorine", "cl", 17, 6); + $register("argon", Ids::ELEMENT_ARGON, "Argon", "ar", 18, 7); + $register("potassium", Ids::ELEMENT_POTASSIUM, "Potassium", "k", 19, 0); + $register("calcium", Ids::ELEMENT_CALCIUM, "Calcium", "ca", 20, 1); + $register("scandium", Ids::ELEMENT_SCANDIUM, "Scandium", "sc", 21, 2); + $register("titanium", Ids::ELEMENT_TITANIUM, "Titanium", "ti", 22, 2); + $register("vanadium", Ids::ELEMENT_VANADIUM, "Vanadium", "v", 23, 2); + $register("chromium", Ids::ELEMENT_CHROMIUM, "Chromium", "cr", 24, 2); + $register("manganese", Ids::ELEMENT_MANGANESE, "Manganese", "mn", 25, 2); + $register("iron", Ids::ELEMENT_IRON, "Iron", "fe", 26, 2); + $register("cobalt", Ids::ELEMENT_COBALT, "Cobalt", "co", 27, 2); + $register("nickel", Ids::ELEMENT_NICKEL, "Nickel", "ni", 28, 2); + $register("copper", Ids::ELEMENT_COPPER, "Copper", "cu", 29, 2); + $register("zinc", Ids::ELEMENT_ZINC, "Zinc", "zn", 30, 2); + $register("gallium", Ids::ELEMENT_GALLIUM, "Gallium", "ga", 31, 3); + $register("germanium", Ids::ELEMENT_GERMANIUM, "Germanium", "ge", 32, 4); + $register("arsenic", Ids::ELEMENT_ARSENIC, "Arsenic", "as", 33, 4); + $register("selenium", Ids::ELEMENT_SELENIUM, "Selenium", "se", 34, 5); + $register("bromine", Ids::ELEMENT_BROMINE, "Bromine", "br", 35, 6); + $register("krypton", Ids::ELEMENT_KRYPTON, "Krypton", "kr", 36, 7); + $register("rubidium", Ids::ELEMENT_RUBIDIUM, "Rubidium", "rb", 37, 0); + $register("strontium", Ids::ELEMENT_STRONTIUM, "Strontium", "sr", 38, 1); + $register("yttrium", Ids::ELEMENT_YTTRIUM, "Yttrium", "y", 39, 2); + $register("zirconium", Ids::ELEMENT_ZIRCONIUM, "Zirconium", "zr", 40, 2); + $register("niobium", Ids::ELEMENT_NIOBIUM, "Niobium", "nb", 41, 2); + $register("molybdenum", Ids::ELEMENT_MOLYBDENUM, "Molybdenum", "mo", 42, 2); + $register("technetium", Ids::ELEMENT_TECHNETIUM, "Technetium", "tc", 43, 2); + $register("ruthenium", Ids::ELEMENT_RUTHENIUM, "Ruthenium", "ru", 44, 2); + $register("rhodium", Ids::ELEMENT_RHODIUM, "Rhodium", "rh", 45, 2); + $register("palladium", Ids::ELEMENT_PALLADIUM, "Palladium", "pd", 46, 2); + $register("silver", Ids::ELEMENT_SILVER, "Silver", "ag", 47, 2); + $register("cadmium", Ids::ELEMENT_CADMIUM, "Cadmium", "cd", 48, 2); + $register("indium", Ids::ELEMENT_INDIUM, "Indium", "in", 49, 3); + $register("tin", Ids::ELEMENT_TIN, "Tin", "sn", 50, 3); + $register("antimony", Ids::ELEMENT_ANTIMONY, "Antimony", "sb", 51, 4); + $register("tellurium", Ids::ELEMENT_TELLURIUM, "Tellurium", "te", 52, 4); + $register("iodine", Ids::ELEMENT_IODINE, "Iodine", "i", 53, 6); + $register("xenon", Ids::ELEMENT_XENON, "Xenon", "xe", 54, 7); + $register("cesium", Ids::ELEMENT_CESIUM, "Cesium", "cs", 55, 0); + $register("barium", Ids::ELEMENT_BARIUM, "Barium", "ba", 56, 1); + $register("lanthanum", Ids::ELEMENT_LANTHANUM, "Lanthanum", "la", 57, 8); + $register("cerium", Ids::ELEMENT_CERIUM, "Cerium", "ce", 58, 8); + $register("praseodymium", Ids::ELEMENT_PRASEODYMIUM, "Praseodymium", "pr", 59, 8); + $register("neodymium", Ids::ELEMENT_NEODYMIUM, "Neodymium", "nd", 60, 8); + $register("promethium", Ids::ELEMENT_PROMETHIUM, "Promethium", "pm", 61, 8); + $register("samarium", Ids::ELEMENT_SAMARIUM, "Samarium", "sm", 62, 8); + $register("europium", Ids::ELEMENT_EUROPIUM, "Europium", "eu", 63, 8); + $register("gadolinium", Ids::ELEMENT_GADOLINIUM, "Gadolinium", "gd", 64, 8); + $register("terbium", Ids::ELEMENT_TERBIUM, "Terbium", "tb", 65, 8); + $register("dysprosium", Ids::ELEMENT_DYSPROSIUM, "Dysprosium", "dy", 66, 8); + $register("holmium", Ids::ELEMENT_HOLMIUM, "Holmium", "ho", 67, 8); + $register("erbium", Ids::ELEMENT_ERBIUM, "Erbium", "er", 68, 8); + $register("thulium", Ids::ELEMENT_THULIUM, "Thulium", "tm", 69, 8); + $register("ytterbium", Ids::ELEMENT_YTTERBIUM, "Ytterbium", "yb", 70, 8); + $register("lutetium", Ids::ELEMENT_LUTETIUM, "Lutetium", "lu", 71, 8); + $register("hafnium", Ids::ELEMENT_HAFNIUM, "Hafnium", "hf", 72, 2); + $register("tantalum", Ids::ELEMENT_TANTALUM, "Tantalum", "ta", 73, 2); + $register("tungsten", Ids::ELEMENT_TUNGSTEN, "Tungsten", "w", 74, 2); + $register("rhenium", Ids::ELEMENT_RHENIUM, "Rhenium", "re", 75, 2); + $register("osmium", Ids::ELEMENT_OSMIUM, "Osmium", "os", 76, 2); + $register("iridium", Ids::ELEMENT_IRIDIUM, "Iridium", "ir", 77, 2); + $register("platinum", Ids::ELEMENT_PLATINUM, "Platinum", "pt", 78, 2); + $register("gold", Ids::ELEMENT_GOLD, "Gold", "au", 79, 2); + $register("mercury", Ids::ELEMENT_MERCURY, "Mercury", "hg", 80, 2); + $register("thallium", Ids::ELEMENT_THALLIUM, "Thallium", "tl", 81, 3); + $register("lead", Ids::ELEMENT_LEAD, "Lead", "pb", 82, 3); + $register("bismuth", Ids::ELEMENT_BISMUTH, "Bismuth", "bi", 83, 3); + $register("polonium", Ids::ELEMENT_POLONIUM, "Polonium", "po", 84, 4); + $register("astatine", Ids::ELEMENT_ASTATINE, "Astatine", "at", 85, 6); + $register("radon", Ids::ELEMENT_RADON, "Radon", "rn", 86, 7); + $register("francium", Ids::ELEMENT_FRANCIUM, "Francium", "fr", 87, 0); + $register("radium", Ids::ELEMENT_RADIUM, "Radium", "ra", 88, 1); + $register("actinium", Ids::ELEMENT_ACTINIUM, "Actinium", "ac", 89, 9); + $register("thorium", Ids::ELEMENT_THORIUM, "Thorium", "th", 90, 9); + $register("protactinium", Ids::ELEMENT_PROTACTINIUM, "Protactinium", "pa", 91, 9); + $register("uranium", Ids::ELEMENT_URANIUM, "Uranium", "u", 92, 9); + $register("neptunium", Ids::ELEMENT_NEPTUNIUM, "Neptunium", "np", 93, 9); + $register("plutonium", Ids::ELEMENT_PLUTONIUM, "Plutonium", "pu", 94, 9); + $register("americium", Ids::ELEMENT_AMERICIUM, "Americium", "am", 95, 9); + $register("curium", Ids::ELEMENT_CURIUM, "Curium", "cm", 96, 9); + $register("berkelium", Ids::ELEMENT_BERKELIUM, "Berkelium", "bk", 97, 9); + $register("californium", Ids::ELEMENT_CALIFORNIUM, "Californium", "cf", 98, 9); + $register("einsteinium", Ids::ELEMENT_EINSTEINIUM, "Einsteinium", "es", 99, 9); + $register("fermium", Ids::ELEMENT_FERMIUM, "Fermium", "fm", 100, 9); + $register("mendelevium", Ids::ELEMENT_MENDELEVIUM, "Mendelevium", "md", 101, 9); + $register("nobelium", Ids::ELEMENT_NOBELIUM, "Nobelium", "no", 102, 9); + $register("lawrencium", Ids::ELEMENT_LAWRENCIUM, "Lawrencium", "lr", 103, 9); + $register("rutherfordium", Ids::ELEMENT_RUTHERFORDIUM, "Rutherfordium", "rf", 104, 2); + $register("dubnium", Ids::ELEMENT_DUBNIUM, "Dubnium", "db", 105, 2); + $register("seaborgium", Ids::ELEMENT_SEABORGIUM, "Seaborgium", "sg", 106, 2); + $register("bohrium", Ids::ELEMENT_BOHRIUM, "Bohrium", "bh", 107, 2); + $register("hassium", Ids::ELEMENT_HASSIUM, "Hassium", "hs", 108, 2); + $register("meitnerium", Ids::ELEMENT_MEITNERIUM, "Meitnerium", "mt", 109, 2); + $register("darmstadtium", Ids::ELEMENT_DARMSTADTIUM, "Darmstadtium", "ds", 110, 2); + $register("roentgenium", Ids::ELEMENT_ROENTGENIUM, "Roentgenium", "rg", 111, 2); + $register("copernicium", Ids::ELEMENT_COPERNICIUM, "Copernicium", "cn", 112, 2); + $register("nihonium", Ids::ELEMENT_NIHONIUM, "Nihonium", "nh", 113, 3); + $register("flerovium", Ids::ELEMENT_FLEROVIUM, "Flerovium", "fl", 114, 3); + $register("moscovium", Ids::ELEMENT_MOSCOVIUM, "Moscovium", "mc", 115, 3); + $register("livermorium", Ids::ELEMENT_LIVERMORIUM, "Livermorium", "lv", 116, 3); + $register("tennessine", Ids::ELEMENT_TENNESSINE, "Tennessine", "ts", 117, 6); + $register("oganesson", Ids::ELEMENT_OGANESSON, "Oganesson", "og", 118, 7); } private static function registerOres() : void{ From f86fde064d27decd89c1ede0fbee7466468ef216 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Apr 2023 12:34:34 +0100 Subject: [PATCH 0897/1858] CraftingManager: fixed uninitialized field I'm having deja vu about this ... --- src/crafting/CraftingManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 3b2bd173a4..bb062382a4 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -55,7 +55,7 @@ class CraftingManager{ * @var FurnaceRecipeManager[] * @phpstan-var array */ - protected $furnaceRecipeManagers; + protected $furnaceRecipeManagers = []; /** * @var PotionTypeRecipe[][] From 107b56154b3b75e9269eb002e4b77d75c3596c48 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Apr 2023 13:34:55 +0100 Subject: [PATCH 0898/1858] ItemStackRequestExecutor: fixed stonecutter recipes this uses the same dodgy hack used by CraftingTransaction, which assumes that getResultsFor() does not care about the crafting inputs. While this is currently OK, since none of the currently-implemented recipes care about inputs anyway, it will become a problem when we implement shulker box recipes, so this needs to be addressed. However, it can't be addressed without BC breaks, so this will have to be dealt with in PM5. closes #5715 --- .../mcpe/handler/ItemStackRequestExecutor.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 124606112c..b7f9b16049 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; -use pocketmine\crafting\CraftingGrid; use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\CreateItemAction; @@ -246,13 +245,11 @@ class ItemStackRequestExecutor{ $this->specialTransaction = new CraftingTransaction($this->player, $craftingManager, [], $recipe, $repetitions); - $currentWindow = $this->player->getCurrentWindow(); - if($currentWindow !== null && !($currentWindow instanceof CraftingGrid)){ - throw new ItemStackRequestProcessException("Player's current window is not a crafting grid"); - } - $craftingGrid = $currentWindow ?? $this->player->getCraftingGrid(); - - $craftingResults = $recipe->getResultsFor($craftingGrid); + //TODO: Since the system assumes that crafting can only be done in the crafting grid, we have to give it a + //crafting grid to make the API happy. No implementation of getResultsFor() actually uses the crafting grid + //right now, so this will work, but this will become a problem in the future for things like shulker boxes and + //custom crafting recipes. + $craftingResults = $recipe->getResultsFor($this->player->getCraftingGrid()); foreach($craftingResults as $k => $craftingResult){ $craftingResult->setCount($craftingResult->getCount() * $repetitions); $this->craftingResults[$k] = $craftingResult; From 3ecc980bc4331874852bd14b2720b6703900b90e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Apr 2023 13:42:11 +0100 Subject: [PATCH 0899/1858] =?UTF-8?q?=C3=82InventoryManagerEntry:=20fixed?= =?UTF-8?q?=20incorrect=20PHPDoc=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/mcpe/InventoryManagerEntry.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/InventoryManagerEntry.php b/src/network/mcpe/InventoryManagerEntry.php index ac2a40dfe6..deb2e8e4db 100644 --- a/src/network/mcpe/InventoryManagerEntry.php +++ b/src/network/mcpe/InventoryManagerEntry.php @@ -40,7 +40,7 @@ final class InventoryManagerEntry{ public array $itemStackInfos = []; /** - * @var int[] + * @var ItemStack[] * @phpstan-var array */ public array $pendingSyncs = []; From a4f2b99ed55c97180531a4086bbbfb5df3c56177 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Apr 2023 14:06:29 +0100 Subject: [PATCH 0900/1858] InGamePacketHandler: queue slots for syncing if they appear in requestChangedSlots this is essentially a prediction without the actual predicted item. We have to sync these regardless of what happens. fixes #5708 --- .../mcpe/handler/InGamePacketHandler.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 37f23e158b..12859be46e 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -328,6 +328,9 @@ class InGamePacketHandler extends PacketHandler{ if(count($packet->trData->getActions()) > 50){ throw new PacketHandlingException("Too many actions in inventory transaction"); } + if(count($packet->requestChangedSlots) > 10){ + throw new PacketHandlingException("Too many slot sync requests in inventory transaction"); + } $this->inventoryManager->setCurrentItemStackRequestId($packet->requestId); $this->inventoryManager->addRawPredictedSlotChanges($packet->trData->getActions()); @@ -347,6 +350,21 @@ class InGamePacketHandler extends PacketHandler{ } $this->inventoryManager->syncMismatchedPredictedSlotChanges(); + + //requestChangedSlots asks the server to always send out the contents of the specified slots, even if they + //haven't changed. Handling these is necessary to ensure the client inventory stays in sync if the server + //rejects the transaction. The most common example of this is equipping armor by right-click, which doesn't send + //a legacy prediction action for the destination armor slot. + foreach($packet->requestChangedSlots as $containerInfo){ + $windowId = ItemStackContainerIdTranslator::translate($containerInfo->getContainerId(), $this->inventoryManager->getCurrentWindowId()); + foreach($containerInfo->getChangedSlotIndexes() as $slot){ + $inventoryAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slot); + if($inventoryAndSlot !== null){ //trigger the normal slot sync logic + $this->inventoryManager->onSlotChange($inventoryAndSlot[0], $inventoryAndSlot[1]); + } + } + } + $this->inventoryManager->setCurrentItemStackRequestId(null); return $result; } From db0cf4bb5a8f009259764954ceaebe049b32f3ad Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 14:35:05 +0100 Subject: [PATCH 0901/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 43 +++++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index b57cf9b7ac..5374113119 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.13", + "phpstan/phpstan": "1.10.14", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index d92d16d275..4fe7816471 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d819da2b086b38c4dd2a5028084e251c", + "content-hash": "2f83cd4557d403a0717ecf3734ebcabc", "packages": [ { "name": "adhocore/json-comment", @@ -67,26 +67,25 @@ }, { "name": "brick/math", - "version": "0.10.2", + "version": "0.11.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^9.0", - "vimeo/psalm": "4.25.0" + "vimeo/psalm": "5.0.0" }, "type": "library", "autoload": { @@ -111,7 +110,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.2" + "source": "https://github.com/brick/math/tree/0.11.0" }, "funding": [ { @@ -119,7 +118,7 @@ "type": "github" } ], - "time": "2022-08-10T22:54:19+00:00" + "time": "2023-01-15T23:15:59+00:00" }, { "name": "fgrosse/phpasn1", @@ -994,20 +993,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.3", + "version": "4.7.4", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2" + "reference": "60a4c63ab724854332900504274f6150ff26d286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -1070,7 +1069,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.3" + "source": "https://github.com/ramsey/uuid/tree/4.7.4" }, "funding": [ { @@ -1082,7 +1081,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T18:13:24+00:00" + "time": "2023-04-15T23:01:58+00:00" }, { "name": "symfony/filesystem", @@ -1884,16 +1883,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.13", + "version": "1.10.14", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70" + "reference": "d232901b09e67538e5c86a724be841bea5768a7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f07bf8c6980b81bf9e49d44bd0caf2e737614a70", - "reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d232901b09e67538e5c86a724be841bea5768a7c", + "reference": "d232901b09e67538e5c86a724be841bea5768a7c", "shasum": "" }, "require": { @@ -1942,7 +1941,7 @@ "type": "tidelift" } ], - "time": "2023-04-12T19:29:52+00:00" + "time": "2023-04-19T13:47:27+00:00" }, { "name": "phpstan/phpstan-phpunit", From 87781cff4d49f50f015091edd60ab450affea448 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 14:38:40 +0100 Subject: [PATCH 0902/1858] Update GitHub Actions PHP versions --- .github/workflows/main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c347b84363..77bc552b83 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.16, 8.2.3] + php: [8.0.28, 8.1.18, 8.2.5] steps: - name: Build and prepare PHP cache @@ -32,7 +32,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.16, 8.2.3] + php: [8.0.28, 8.1.18, 8.2.5] steps: - uses: actions/checkout@v3 @@ -71,7 +71,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.16, 8.2.3] + php: [8.0.28, 8.1.18, 8.2.5] steps: - uses: actions/checkout@v3 @@ -110,7 +110,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.16, 8.2.3] + php: [8.0.28, 8.1.18, 8.2.5] steps: - uses: actions/checkout@v3 @@ -151,7 +151,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.16, 8.2.3] + php: [8.0.28, 8.1.18, 8.2.5] steps: - uses: actions/checkout@v3 From 3b09c3a48a7da3051d8dc437dea43ab61866bfa5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 14:40:39 +0100 Subject: [PATCH 0903/1858] actions: updated setup-php-action to pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 --- .github/workflows/main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 77bc552b83..275c0cd78c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Build and prepare PHP cache - uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 + uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 + uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -77,7 +77,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 + uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -118,7 +118,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 + uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -157,7 +157,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@6dd74c145250109942b08fc63cd5118edd2fd256 + uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 with: php-version: ${{ matrix.php }} install-path: "./bin" From eb130f2906321590ef2f02ac1a030aba68291399 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 16:03:33 +0100 Subject: [PATCH 0904/1858] Move primary version to PHP 8.1 8.0 is still supported for now, but won't be updated any longer. --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- build/php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index deb8e9ff09..bc3658fd1b 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -15,7 +15,7 @@ jobs: - name: Setup PHP and tools uses: shivammathur/setup-php@2.24.0 with: - php-version: 8.0 + php-version: 8.1 - name: Restore Composer package cache uses: actions/cache@v3 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index cce7501183..604a69bbaa 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@2.24.0 with: - php-version: 8.0 + php-version: 8.1 - name: Restore Composer package cache uses: actions/cache@v3 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c347b84363..d2d0ed1a0d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -205,7 +205,7 @@ jobs: - name: Setup PHP and tools uses: shivammathur/setup-php@2.24.0 with: - php-version: 8.0 + php-version: 8.1 tools: php-cs-fixer:3.11 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/build/php b/build/php index 9d8807be82..a3c40579ad 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 9d8807be825b3fafd420534f2c29351c1bda6398 +Subproject commit a3c40579ad91246b07053fc2c8f085efd442943a From b162d688a3078d45665830c00270a622d72ddd32 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 16:05:06 +0100 Subject: [PATCH 0905/1858] CI: use php-cs-fixer 3.16 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 275c0cd78c..e3f7124c5d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -206,7 +206,7 @@ jobs: uses: shivammathur/setup-php@2.24.0 with: php-version: 8.0 - tools: php-cs-fixer:3.11 + tools: php-cs-fixer:3.16 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 8102616ff469a44a488bafc11cce20a6b3125372 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 17:05:31 +0100 Subject: [PATCH 0906/1858] Added ticking chunk count to /status closes #5716 --- src/command/defaults/StatusCommand.php | 3 ++- src/world/World.php | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/command/defaults/StatusCommand.php b/src/command/defaults/StatusCommand.php index 7c2884993d..1d7545f0b0 100644 --- a/src/command/defaults/StatusCommand.php +++ b/src/command/defaults/StatusCommand.php @@ -110,7 +110,8 @@ class StatusCommand extends VanillaCommand{ $worldName = $world->getFolderName() !== $world->getDisplayName() ? " (" . $world->getDisplayName() . ")" : ""; $timeColor = $world->getTickRateTime() > 40 ? TextFormat::RED : TextFormat::YELLOW; $sender->sendMessage(TextFormat::GOLD . "World \"{$world->getFolderName()}\"$worldName: " . - TextFormat::RED . number_format(count($world->getLoadedChunks())) . TextFormat::GREEN . " chunks, " . + TextFormat::RED . number_format(count($world->getLoadedChunks())) . TextFormat::GREEN . " loaded chunks, " . + TextFormat::RED . number_format(count($world->getTickingChunks())) . TextFormat::GREEN . " ticking chunks, " . TextFormat::RED . number_format(count($world->getEntities())) . TextFormat::GREEN . " entities. " . "Time $timeColor" . round($world->getTickRateTime(), 2) . "ms" ); diff --git a/src/world/World.php b/src/world/World.php index 607da30cbb..b66e76348b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -104,6 +104,7 @@ use pocketmine\world\utils\SubChunkExplorer; use function abs; use function array_filter; use function array_key_exists; +use function array_keys; use function array_map; use function array_merge; use function array_sum; @@ -1155,6 +1156,16 @@ class World implements ChunkManager{ $this->chunkTickRadius = $radius; } + /** + * Returns a list of chunk position hashes (as returned by World::chunkHash()) which are currently registered for + * ticking. + * + * @return int[] + */ + public function getTickingChunks() : array{ + return array_keys($this->tickingChunks); + } + /** * Instructs the World to tick the specified chunk, for as long as this chunk ticker (or any other chunk ticker) is * registered to it. From 9bfcd39f2a8b3e1ff1afe5323b46c0bc43349e19 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 17:06:52 +0100 Subject: [PATCH 0907/1858] World: improve type info for getTickingChunks() --- src/world/World.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/world/World.php b/src/world/World.php index b66e76348b..3a09be1762 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1161,6 +1161,7 @@ class World implements ChunkManager{ * ticking. * * @return int[] + * @phpstan-return list */ public function getTickingChunks() : array{ return array_keys($this->tickingChunks); From 408616723c1c842eb9c1b52224dced5e5cfb25db Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 22:52:02 +0100 Subject: [PATCH 0908/1858] Changes for 1.19.80 --- composer.json | 8 +-- composer.lock | 50 +++++++++---------- .../mcpe/handler/PreSpawnPacketHandler.php | 1 + 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/composer.json b/composer.json index 5374113119..7650b7f367 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", "netresearch/jsonmapper": "^4.0", - "pocketmine/bedrock-block-upgrade-schema": "~1.1.1+bedrock-1.19.70", - "pocketmine/bedrock-data": "~2.1.1+bedrock-1.19.70", - "pocketmine/bedrock-item-upgrade-schema": "~1.1.0+bedrock-1.19.70", - "pocketmine/bedrock-protocol": "~20.1.1+bedrock-1.19.70", + "pocketmine/bedrock-block-upgrade-schema": "~2.1.0+bedrock-1.19.80", + "pocketmine/bedrock-data": "~2.2.0+bedrock-1.19.80", + "pocketmine/bedrock-item-upgrade-schema": "~1.2.0+bedrock-1.19.80", + "pocketmine/bedrock-protocol": "~21.0.0+bedrock-1.19.80", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 4fe7816471..ee994f84a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2f83cd4557d403a0717ecf3734ebcabc", + "content-hash": "7ca2d4ed0987ac17cf615d67945f5687", "packages": [ { "name": "adhocore/json-comment", @@ -249,16 +249,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "1.1.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "e0540343e649a92126a1d4071ec401a811416c76" + "reference": "1c07ced86be7d185551082441b5a2b9b7fbd6b21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/e0540343e649a92126a1d4071ec401a811416c76", - "reference": "e0540343e649a92126a1d4071ec401a811416c76", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/1c07ced86be7d185551082441b5a2b9b7fbd6b21", + "reference": "1c07ced86be7d185551082441b5a2b9b7fbd6b21", "shasum": "" }, "type": "library", @@ -269,22 +269,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/1.1.1" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/2.1.0" }, - "time": "2023-03-08T23:45:59+00:00" + "time": "2023-04-19T17:58:49+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.1.1+bedrock-1.19.70", + "version": "2.2.0+bedrock-1.19.80", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "cba0567bcb25f987f2712092f8d662056719e82d" + "reference": "33dd83601442b377af42ac91473278243cafd576" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/cba0567bcb25f987f2712092f8d662056719e82d", - "reference": "cba0567bcb25f987f2712092f8d662056719e82d", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/33dd83601442b377af42ac91473278243cafd576", + "reference": "33dd83601442b377af42ac91473278243cafd576", "shasum": "" }, "type": "library", @@ -295,22 +295,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.1.1+bedrock-1.19.70" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.80" }, - "time": "2023-03-14T18:03:19+00:00" + "time": "2023-04-26T20:00:35+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45" + "reference": "dd804c3f2b1e8990434812627e62eb5bde9670a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/aab89a1f121a0c127557a4a0cf981330301c9c45", - "reference": "aab89a1f121a0c127557a4a0cf981330301c9c45", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/dd804c3f2b1e8990434812627e62eb5bde9670a5", + "reference": "dd804c3f2b1e8990434812627e62eb5bde9670a5", "shasum": "" }, "type": "library", @@ -321,22 +321,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.1.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.2.0" }, - "time": "2023-03-08T22:27:13+00:00" + "time": "2023-04-19T18:16:14+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "20.1.2+bedrock-1.19.70", + "version": "21.0.1+bedrock-1.19.80", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "2787c531039b3d92fa3ec92f28b95158dc24b915" + "reference": "981ea2e76e207a25c1361df858c639feba5cf348" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/2787c531039b3d92fa3ec92f28b95158dc24b915", - "reference": "2787c531039b3d92fa3ec92f28b95158dc24b915", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/981ea2e76e207a25c1361df858c639feba5cf348", + "reference": "981ea2e76e207a25c1361df858c639feba5cf348", "shasum": "" }, "require": { @@ -368,9 +368,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/20.1.2+bedrock-1.19.70" + "source": "https://github.com/pmmp/BedrockProtocol/tree/21.0.1+bedrock-1.19.80" }, - "time": "2023-04-10T11:40:32+00:00" + "time": "2023-04-26T21:00:01+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index e914a0a2eb..91263a619c 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -105,6 +105,7 @@ class PreSpawnPacketHandler extends PacketHandler{ sprintf("%s %s", VersionInfo::NAME, VersionInfo::VERSION()->getFullVersion(true)), Uuid::fromString(Uuid::NIL), false, + false, [], 0, GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(), From 0d21e591d1c635a44f34263e9d1fd851ab5706e6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 22:55:05 +0100 Subject: [PATCH 0909/1858] Support sign editing UI in 1.19.80, with APIs to allow plugins to use it this doesn't support editing the rear side of a sign, since the 1.12 format doesn't allow us to represent the rear text, and it would necessitate API breaks to support anyway. However, we can quite trivially support APIs for the sign GUI, which plugins can use to enable editing signs. PocketMine-MP doesn't currently permit this, since it's currently an experimental feature in 1.20, but plugins can simply use Player->openSignEditor() to mimic it. This is, however, a byproduct of the fact that APIs needed to be added in order to facilitate the use of OpenSignPacket in 1.19.80. --- src/block/BaseSign.php | 23 ++++++++++++++ src/block/tile/Sign.php | 30 ++++++++++++++----- src/network/mcpe/NetworkSession.php | 5 ++++ .../mcpe/handler/InGamePacketHandler.php | 2 +- src/player/Player.php | 15 ++++++++++ 5 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index fec71e58d2..402ec1eae7 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -97,6 +97,15 @@ abstract class BaseSign extends Transparent{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } + public function onPostPlace() : void{ + $player = $this->editorEntityRuntimeId !== null ? + $this->position->getWorld()->getEntity($this->editorEntityRuntimeId) : + null; + if($player instanceof Player){ + $player->openSignEditor($this->position); + } + } + /** * Returns an object containing information about the sign text. */ @@ -110,6 +119,19 @@ abstract class BaseSign extends Transparent{ return $this; } + /** + * Sets the runtime entity ID of the player editing this sign. Only this player will be able to edit the sign. + * This is used to prevent multiple players from editing the same sign at the same time, and to prevent players + * from editing signs they didn't place. + */ + public function getEditorEntityRuntimeId() : ?int{ return $this->editorEntityRuntimeId; } + + /** @return $this */ + public function setEditorEntityRuntimeId(?int $editorEntityRuntimeId) : self{ + $this->editorEntityRuntimeId = $editorEntityRuntimeId; + return $this; + } + /** * Called by the player controller (network session) to update the sign text, firing events as appropriate. * @@ -133,6 +155,7 @@ abstract class BaseSign extends Transparent{ $ev->call(); if(!$ev->isCancelled()){ $this->setText($ev->getNewText()); + $this->setEditorEntityRuntimeId(null); $this->position->getWorld()->setBlock($this->position, $this); return true; } diff --git a/src/block/tile/Sign.php b/src/block/tile/Sign.php index 383526bd84..6ee15b53b3 100644 --- a/src/block/tile/Sign.php +++ b/src/block/tile/Sign.php @@ -45,12 +45,18 @@ class Sign extends Spawnable{ public const TAG_TEXT_LINE = "Text%d"; //sprintf()able public const TAG_TEXT_COLOR = "SignTextColor"; public const TAG_GLOWING_TEXT = "IgnoreLighting"; + public const TAG_PERSIST_FORMATTING = "PersistFormatting"; //TAG_Byte /** * This tag is set to indicate that MCPE-117835 has been addressed in whatever version this sign was created. * @see https://bugs.mojang.com/browse/MCPE-117835 */ public const TAG_LEGACY_BUG_RESOLVE = "TextIgnoreLegacyBugResolved"; + public const TAG_FRONT_TEXT = "FrontText"; //TAG_Compound + public const TAG_BACK_TEXT = "BackText"; //TAG_Compound + public const TAG_WAXED = "IsWaxed"; //TAG_Byte + public const TAG_LOCKED_FOR_EDITING_BY = "LockedForEditingBy"; //TAG_Long + /** * @return string[] */ @@ -118,12 +124,22 @@ class Sign extends Spawnable{ } protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ - $nbt->setString(self::TAG_TEXT_BLOB, implode("\n", $this->text->getLines())); - - //the following are not yet used by the server, but needed to roll back any changes to glowing state or colour - //if the client uses dye on the sign - $nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt(0xff_00_00_00)); - $nbt->setByte(self::TAG_GLOWING_TEXT, 0); - $nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1); + $textPolyfill = function(CompoundTag $textTag) : CompoundTag{ + //the following are not yet used by the server, but needed to roll back any changes to glowing state or colour + //if the client uses dye on the sign + return $textTag + ->setInt(self::TAG_TEXT_COLOR, Binary::signInt(0xff_00_00_00)) + ->setByte(self::TAG_GLOWING_TEXT, 0) + ->setByte(self::TAG_PERSIST_FORMATTING, 1); //TODO: not sure what this is used for + }; + $nbt->setTag(self::TAG_FRONT_TEXT, $textPolyfill(CompoundTag::create() + ->setString(self::TAG_TEXT_BLOB, implode("\n", $this->text->getLines())) + )); + //TODO: this is not yet used by the server, but needed to rollback any client-side changes to the back text + $nbt->setTag(self::TAG_BACK_TEXT, $textPolyfill(CompoundTag::create() + ->setString(self::TAG_TEXT_BLOB, "") + )); + $nbt->setByte(self::TAG_WAXED, 0); + $nbt->setLong(self::TAG_LOCKED_FOR_EDITING_BY, $this->editorEntityRuntimeId ?? -1); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7f07fbd77c..bff5875b7b 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -60,6 +60,7 @@ use pocketmine\network\mcpe\protocol\DisconnectPacket; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\NetworkChunkPublisherUpdatePacket; +use pocketmine\network\mcpe\protocol\OpenSignPacket; use pocketmine\network\mcpe\protocol\Packet; use pocketmine\network\mcpe\protocol\PacketDecodeException; use pocketmine\network\mcpe\protocol\PacketPool; @@ -1093,6 +1094,10 @@ class NetworkSession{ $this->sendDataPacket(ToastRequestPacket::create($title, $body)); } + public function onOpenSignEditor(Vector3 $signPosition, bool $frontSide) : void{ + $this->sendDataPacket(OpenSignPacket::create(BlockPosition::fromVector3($signPosition), $frontSide)); + } + public function tick() : void{ if(!$this->isConnected()){ $this->dispose(); diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 12859be46e..732c8817d8 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -748,7 +748,7 @@ class InGamePacketHandler extends PacketHandler{ if(!($nbt instanceof CompoundTag)) throw new AssumptionFailedError("PHPStan should ensure this is a CompoundTag"); //for phpstorm's benefit if($block instanceof BaseSign){ - if(($textBlobTag = $nbt->getTag(Sign::TAG_TEXT_BLOB)) instanceof StringTag){ + if(($textBlobTag = $nbt->getCompoundTag(Sign::TAG_FRONT_TEXT)?->getTag(Sign::TAG_TEXT_BLOB)) instanceof StringTag){ try{ $text = SignText::fromBlob($textBlobTag->getValue()); }catch(\InvalidArgumentException $e){ diff --git a/src/player/Player.php b/src/player/Player.php index 11e7ba3b09..279dd1ebf3 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\player; +use pocketmine\block\BaseSign; use pocketmine\block\Bed; use pocketmine\block\BlockLegacyIds; use pocketmine\block\UnknownBlock; @@ -2626,6 +2627,20 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->permanentWindows = []; } + /** + * Opens the player's sign editor GUI for the sign at the given position. + * TODO: add support for editing the rear side of the sign (not currently supported due to technical limitations) + */ + public function openSignEditor(Vector3 $position) : void{ + $block = $this->getWorld()->getBlock($position); + if($block instanceof BaseSign){ + $this->getWorld()->setBlock($position, $block->setEditorEntityRuntimeId($this->getId())); + $this->getNetworkSession()->onOpenSignEditor($position, true); + }else{ + throw new \InvalidArgumentException("Block at this position is not a sign"); + } + } + use ChunkListenerNoOpTrait { onChunkChanged as private; onChunkUnloaded as private; From 54ae4d0ea2429bfb020aa1fae444c5ac9e3dcafb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 23:15:34 +0100 Subject: [PATCH 0910/1858] Release 4.20.0 --- changelogs/4.20.md | 36 ++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.20.md diff --git a/changelogs/4.20.md b/changelogs/4.20.md new file mode 100644 index 0000000000..357cdaced6 --- /dev/null +++ b/changelogs/4.20.md @@ -0,0 +1,36 @@ +**For Minecraft: Bedrock Edition 1.19.80** + +### Note about API versions +Plugins which don't touch the `pocketmine\network\mcpe` namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +### Interim releases +If you're upgrading from 4.17.x directly to 4.20.x, please also read the following changelogs, as the interim releases contain important changes: + +- [4.18.0](https://github.com/pmmp/PocketMine-MP/blob/4.20.0/changelogs/4.18.md#4180) - major performance improvements, internal network changes, minor API additions +- [4.19.0](https://github.com/pmmp/PocketMine-MP/blob/4.20.0/changelogs/4.19.md#4190) - minor performance improvements, improved timings system, minor API additions + +# 4.20.0 +Released 26th April 2023. + +## General +- Added support for Minecraft: Bedrock Edition 1.19.80. +- Removed support for older versions. + +## Fixes +- Fixed packet processing error when attempting to use a stonecutter. +- Fixed armor slots containing ghost items when cancelling right-click to equip armor. +- Fixed crash in `HandlerList->getListenersByPriority()` when no listeners are registered at the given priority. + +## API +### `pocketmine\block` +- The following API methods have been added: + - `public BaseSign->getEditorEntityRuntimeId() : int` - returns the entity runtime ID of the player currently editing this sign, or `null` if none + - `public BaseSign->setEditorEntityRuntimeId(?int $editorEntityRuntimeId) : $this` - sets the entity runtime ID of the player currently editing this sign + +### `pocketmine\player` +- The following API methods have been added: + - `public Player->openSignEditor(Vector3 $position) : void` - opens the client-side sign editor GUI for the given position diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 75b43e6f22..947b4d2e73 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.19.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.20.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 1d10107024c9af6bb087ebb31f804b82d836c6ca Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 23:15:38 +0100 Subject: [PATCH 0911/1858] 4.20.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 947b4d2e73..8f31f6509a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.20.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From a8dec1adb151d787f7c60a50733decf2674cd6b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 26 Apr 2023 23:30:56 +0100 Subject: [PATCH 0912/1858] PM5-specific changes for 1.19.80 --- .../json/SmithingTransformRecipeData.php | 5 +- src/crafting/json/SmithingTrimRecipeData.php | 43 +++++++++++++++ src/data/bedrock/block/BlockStateNames.php | 2 - .../bedrock/block/BlockStateStringValues.php | 8 --- src/data/bedrock/block/BlockTypeNames.php | 37 +++++++++++-- .../convert/BlockObjectToStateSerializer.php | 49 +++++++++-------- .../convert/BlockStateSerializerHelper.php | 25 ++------- .../BlockStateToObjectDeserializer.php | 53 +++++++++---------- src/world/format/io/data/BedrockWorldData.php | 4 +- tools/generate-bedrock-data-from-packets.php | 15 ++++++ 10 files changed, 152 insertions(+), 89 deletions(-) create mode 100644 src/crafting/json/SmithingTrimRecipeData.php diff --git a/src/crafting/json/SmithingTransformRecipeData.php b/src/crafting/json/SmithingTransformRecipeData.php index 3ad78f48d1..17cdab54b4 100644 --- a/src/crafting/json/SmithingTransformRecipeData.php +++ b/src/crafting/json/SmithingTransformRecipeData.php @@ -25,6 +25,8 @@ namespace pocketmine\crafting\json; final class SmithingTransformRecipeData{ + /** @required */ + public RecipeIngredientData $template; /** @required */ public RecipeIngredientData $input; /** @required */ @@ -34,7 +36,8 @@ final class SmithingTransformRecipeData{ /** @required */ public string $block; - public function __construct(RecipeIngredientData $input, RecipeIngredientData $addition, ItemStackData $output, string $block){ + public function __construct(RecipeIngredientData $template, RecipeIngredientData $input, RecipeIngredientData $addition, ItemStackData $output, string $block){ + $this->template = $template; $this->input = $input; $this->addition = $addition; $this->output = $output; diff --git a/src/crafting/json/SmithingTrimRecipeData.php b/src/crafting/json/SmithingTrimRecipeData.php new file mode 100644 index 0000000000..9e385984b0 --- /dev/null +++ b/src/crafting/json/SmithingTrimRecipeData.php @@ -0,0 +1,43 @@ +template = $template; + $this->input = $input; + $this->addition = $addition; + $this->block = $block; + } +} diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 47838373fc..e241380a03 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -102,10 +102,8 @@ final class BlockStateNames{ public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; public const NEW_LEAF_TYPE = "new_leaf_type"; - public const NEW_LOG_TYPE = "new_log_type"; public const OCCUPIED_BIT = "occupied_bit"; public const OLD_LEAF_TYPE = "old_leaf_type"; - public const OLD_LOG_TYPE = "old_log_type"; public const OPEN_BIT = "open_bit"; public const OUTPUT_LIT_BIT = "output_lit_bit"; public const OUTPUT_SUBTRACT_BIT = "output_subtract_bit"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 128e04d388..ba77cd3873 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -141,19 +141,11 @@ final class BlockStateStringValues{ public const NEW_LEAF_TYPE_ACACIA = "acacia"; public const NEW_LEAF_TYPE_DARK_OAK = "dark_oak"; - public const NEW_LOG_TYPE_ACACIA = "acacia"; - public const NEW_LOG_TYPE_DARK_OAK = "dark_oak"; - public const OLD_LEAF_TYPE_BIRCH = "birch"; public const OLD_LEAF_TYPE_JUNGLE = "jungle"; public const OLD_LEAF_TYPE_OAK = "oak"; public const OLD_LEAF_TYPE_SPRUCE = "spruce"; - public const OLD_LOG_TYPE_BIRCH = "birch"; - public const OLD_LOG_TYPE_JUNGLE = "jungle"; - public const OLD_LOG_TYPE_OAK = "oak"; - public const OLD_LOG_TYPE_SPRUCE = "spruce"; - public const PILLAR_AXIS_X = "x"; public const PILLAR_AXIS_Y = "y"; public const PILLAR_AXIS_Z = "z"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 56526ea9d1..f94b721763 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -33,8 +33,10 @@ final class BlockTypeNames{ public const ACACIA_BUTTON = "minecraft:acacia_button"; public const ACACIA_DOOR = "minecraft:acacia_door"; + public const ACACIA_FENCE = "minecraft:acacia_fence"; public const ACACIA_FENCE_GATE = "minecraft:acacia_fence_gate"; public const ACACIA_HANGING_SIGN = "minecraft:acacia_hanging_sign"; + public const ACACIA_LOG = "minecraft:acacia_log"; public const ACACIA_PRESSURE_PLATE = "minecraft:acacia_pressure_plate"; public const ACACIA_STAIRS = "minecraft:acacia_stairs"; public const ACACIA_STANDING_SIGN = "minecraft:acacia_standing_sign"; @@ -84,8 +86,10 @@ final class BlockTypeNames{ public const BIG_DRIPLEAF = "minecraft:big_dripleaf"; public const BIRCH_BUTTON = "minecraft:birch_button"; public const BIRCH_DOOR = "minecraft:birch_door"; + public const BIRCH_FENCE = "minecraft:birch_fence"; public const BIRCH_FENCE_GATE = "minecraft:birch_fence_gate"; public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; + public const BIRCH_LOG = "minecraft:birch_log"; public const BIRCH_PRESSURE_PLATE = "minecraft:birch_pressure_plate"; public const BIRCH_STAIRS = "minecraft:birch_stairs"; public const BIRCH_STANDING_SIGN = "minecraft:birch_standing_sign"; @@ -123,6 +127,7 @@ final class BlockTypeNames{ public const CACTUS = "minecraft:cactus"; public const CAKE = "minecraft:cake"; public const CALCITE = "minecraft:calcite"; + public const CALIBRATED_SCULK_SENSOR = "minecraft:calibrated_sculk_sensor"; public const CAMERA = "minecraft:camera"; public const CAMPFIRE = "minecraft:campfire"; public const CANDLE = "minecraft:candle"; @@ -139,6 +144,23 @@ final class BlockTypeNames{ public const CHAIN_COMMAND_BLOCK = "minecraft:chain_command_block"; public const CHEMICAL_HEAT = "minecraft:chemical_heat"; public const CHEMISTRY_TABLE = "minecraft:chemistry_table"; + public const CHERRY_BUTTON = "minecraft:cherry_button"; + public const CHERRY_DOOR = "minecraft:cherry_door"; + public const CHERRY_DOUBLE_SLAB = "minecraft:cherry_double_slab"; + public const CHERRY_FENCE = "minecraft:cherry_fence"; + public const CHERRY_FENCE_GATE = "minecraft:cherry_fence_gate"; + public const CHERRY_HANGING_SIGN = "minecraft:cherry_hanging_sign"; + public const CHERRY_LEAVES = "minecraft:cherry_leaves"; + public const CHERRY_LOG = "minecraft:cherry_log"; + public const CHERRY_PLANKS = "minecraft:cherry_planks"; + public const CHERRY_PRESSURE_PLATE = "minecraft:cherry_pressure_plate"; + public const CHERRY_SAPLING = "minecraft:cherry_sapling"; + public const CHERRY_SLAB = "minecraft:cherry_slab"; + public const CHERRY_STAIRS = "minecraft:cherry_stairs"; + public const CHERRY_STANDING_SIGN = "minecraft:cherry_standing_sign"; + public const CHERRY_TRAPDOOR = "minecraft:cherry_trapdoor"; + public const CHERRY_WALL_SIGN = "minecraft:cherry_wall_sign"; + public const CHERRY_WOOD = "minecraft:cherry_wood"; public const CHEST = "minecraft:chest"; public const CHISELED_BOOKSHELF = "minecraft:chiseled_bookshelf"; public const CHISELED_DEEPSLATE = "minecraft:chiseled_deepslate"; @@ -207,8 +229,10 @@ final class BlockTypeNames{ public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; + public const DARK_OAK_FENCE = "minecraft:dark_oak_fence"; public const DARK_OAK_FENCE_GATE = "minecraft:dark_oak_fence_gate"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; + public const DARK_OAK_LOG = "minecraft:dark_oak_log"; public const DARK_OAK_PRESSURE_PLATE = "minecraft:dark_oak_pressure_plate"; public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; @@ -393,7 +417,6 @@ final class BlockTypeNames{ public const EXPOSED_CUT_COPPER_STAIRS = "minecraft:exposed_cut_copper_stairs"; public const EXPOSED_DOUBLE_CUT_COPPER_SLAB = "minecraft:exposed_double_cut_copper_slab"; public const FARMLAND = "minecraft:farmland"; - public const FENCE = "minecraft:fence"; public const FENCE_GATE = "minecraft:fence_gate"; public const FIRE = "minecraft:fire"; public const FLETCHING_TABLE = "minecraft:fletching_table"; @@ -453,8 +476,10 @@ final class BlockTypeNames{ public const JUKEBOX = "minecraft:jukebox"; public const JUNGLE_BUTTON = "minecraft:jungle_button"; public const JUNGLE_DOOR = "minecraft:jungle_door"; + public const JUNGLE_FENCE = "minecraft:jungle_fence"; public const JUNGLE_FENCE_GATE = "minecraft:jungle_fence_gate"; public const JUNGLE_HANGING_SIGN = "minecraft:jungle_hanging_sign"; + public const JUNGLE_LOG = "minecraft:jungle_log"; public const JUNGLE_PRESSURE_PLATE = "minecraft:jungle_pressure_plate"; public const JUNGLE_STAIRS = "minecraft:jungle_stairs"; public const JUNGLE_STANDING_SIGN = "minecraft:jungle_standing_sign"; @@ -494,8 +519,6 @@ final class BlockTypeNames{ public const LIT_REDSTONE_ORE = "minecraft:lit_redstone_ore"; public const LIT_SMOKER = "minecraft:lit_smoker"; public const LODESTONE = "minecraft:lodestone"; - public const LOG = "minecraft:log"; - public const LOG2 = "minecraft:log2"; public const LOOM = "minecraft:loom"; public const MAGENTA_CANDLE = "minecraft:magenta_candle"; public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; @@ -551,7 +574,9 @@ final class BlockTypeNames{ public const NETHERREACTOR = "minecraft:netherreactor"; public const NORMAL_STONE_STAIRS = "minecraft:normal_stone_stairs"; public const NOTEBLOCK = "minecraft:noteblock"; + public const OAK_FENCE = "minecraft:oak_fence"; public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; + public const OAK_LOG = "minecraft:oak_log"; public const OAK_STAIRS = "minecraft:oak_stairs"; public const OBSERVER = "minecraft:observer"; public const OBSIDIAN = "minecraft:obsidian"; @@ -571,6 +596,7 @@ final class BlockTypeNames{ public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; + public const PINK_PETALS = "minecraft:pink_petals"; public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; @@ -682,8 +708,10 @@ final class BlockTypeNames{ public const SPORE_BLOSSOM = "minecraft:spore_blossom"; public const SPRUCE_BUTTON = "minecraft:spruce_button"; public const SPRUCE_DOOR = "minecraft:spruce_door"; + public const SPRUCE_FENCE = "minecraft:spruce_fence"; public const SPRUCE_FENCE_GATE = "minecraft:spruce_fence_gate"; public const SPRUCE_HANGING_SIGN = "minecraft:spruce_hanging_sign"; + public const SPRUCE_LOG = "minecraft:spruce_log"; public const SPRUCE_PRESSURE_PLATE = "minecraft:spruce_pressure_plate"; public const SPRUCE_STAIRS = "minecraft:spruce_stairs"; public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; @@ -711,6 +739,8 @@ final class BlockTypeNames{ public const STRIPPED_ACACIA_LOG = "minecraft:stripped_acacia_log"; public const STRIPPED_BAMBOO_BLOCK = "minecraft:stripped_bamboo_block"; public const STRIPPED_BIRCH_LOG = "minecraft:stripped_birch_log"; + public const STRIPPED_CHERRY_LOG = "minecraft:stripped_cherry_log"; + public const STRIPPED_CHERRY_WOOD = "minecraft:stripped_cherry_wood"; public const STRIPPED_CRIMSON_HYPHAE = "minecraft:stripped_crimson_hyphae"; public const STRIPPED_CRIMSON_STEM = "minecraft:stripped_crimson_stem"; public const STRIPPED_DARK_OAK_LOG = "minecraft:stripped_dark_oak_log"; @@ -723,6 +753,7 @@ final class BlockTypeNames{ public const STRIPPED_WARPED_STEM = "minecraft:stripped_warped_stem"; public const STRUCTURE_BLOCK = "minecraft:structure_block"; public const STRUCTURE_VOID = "minecraft:structure_void"; + public const SUSPICIOUS_GRAVEL = "minecraft:suspicious_gravel"; public const SUSPICIOUS_SAND = "minecraft:suspicious_sand"; public const SWEET_BERRY_BUSH = "minecraft:sweet_berry_bush"; public const TALLGRASS = "minecraft:tallgrass"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 871e478475..cf201ac78a 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -191,6 +191,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->registerCandleSerializers(); $this->registerFlatColorBlockSerializers(); $this->registerCauldronSerializers(); + $this->registerWoodBlockSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); } @@ -226,6 +227,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map($block, fn(Stair $block) => Helper::encodeStairs($block, Writer::create($id))); } + public function mapLog(Wood $block, string $unstrippedId, string $strippedId) : void{ + $this->map($block, fn(Wood $block) => Helper::encodeLog($block, $unstrippedId, $strippedId)); + } + /** * @phpstan-template TBlockType of Block * @phpstan-param TBlockType $blockState @@ -357,6 +362,22 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WATER_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel(), new Writer(Ids::CAULDRON))); } + private function registerWoodBlockSerializers() : void{ + $this->mapSimple(Blocks::ACACIA_FENCE(), Ids::ACACIA_FENCE); + $this->mapSimple(Blocks::BIRCH_FENCE(), Ids::BIRCH_FENCE); + $this->mapSimple(Blocks::DARK_OAK_FENCE(), Ids::DARK_OAK_FENCE); + $this->mapSimple(Blocks::JUNGLE_FENCE(), Ids::JUNGLE_FENCE); + $this->mapSimple(Blocks::OAK_FENCE(), Ids::OAK_FENCE); + $this->mapSimple(Blocks::SPRUCE_FENCE(), Ids::SPRUCE_FENCE); + + $this->mapLog(Blocks::ACACIA_LOG(), Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG); + $this->mapLog(Blocks::BIRCH_LOG(), Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG); + $this->mapLog(Blocks::DARK_OAK_LOG(), Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG); + $this->mapLog(Blocks::JUNGLE_LOG(), Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG); + $this->mapLog(Blocks::OAK_LOG(), Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG); + $this->mapLog(Blocks::SPRUCE_LOG(), Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG); + } + private function registerSimpleSerializers() : void{ $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); @@ -615,11 +636,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ private function registerSerializers() : void{ $this->map(Blocks::ACACIA_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::ACACIA_BUTTON))); $this->map(Blocks::ACACIA_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::ACACIA_DOOR))); - $this->map(Blocks::ACACIA_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::ACACIA_FENCE_GATE))); $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(Blocks::ACACIA_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_ACACIA, Ids::STRIPPED_ACACIA_LOG)); $this->map(Blocks::ACACIA_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_ACACIA)); $this->map(Blocks::ACACIA_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::ACACIA_PRESSURE_PLATE))); @@ -705,11 +723,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); - $this->map(Blocks::BIRCH_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::BIRCH_FENCE_GATE))); $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(Blocks::BIRCH_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_BIRCH, Ids::STRIPPED_BIRCH_LOG)); $this->map(Blocks::BIRCH_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_BIRCH)); $this->map(Blocks::BIRCH_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::BIRCH_PRESSURE_PLATE))); @@ -892,12 +907,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CRIMSON_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CRIMSON_BUTTON))); $this->map(Blocks::CRIMSON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CRIMSON_DOOR))); $this->map(Blocks::CRIMSON_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::CRIMSON_FENCE_GATE))); - $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); + $this->map(Blocks::CRIMSON_HYPHAE(), fn(Wood $block) => Helper::encodeLog($block, Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE)); $this->map(Blocks::CRIMSON_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::CRIMSON_PRESSURE_PLATE))); $this->map(Blocks::CRIMSON_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::CRIMSON_STANDING_SIGN))); $this->mapSlab(Blocks::CRIMSON_SLAB(), Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB); $this->mapStairs(Blocks::CRIMSON_STAIRS(), Ids::CRIMSON_STAIRS); - $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); + $this->map(Blocks::CRIMSON_STEM(), fn(Wood $block) => Helper::encodeLog($block, Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM)); $this->map(Blocks::CRIMSON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::CRIMSON_TRAPDOOR))); $this->map(Blocks::CRIMSON_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::CRIMSON_WALL_SIGN))); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); @@ -906,11 +921,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); $this->map(Blocks::DARK_OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::DARK_OAK_BUTTON))); $this->map(Blocks::DARK_OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::DARK_OAK_DOOR))); - $this->map(Blocks::DARK_OAK_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::DARK_OAK_FENCE_GATE))); $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(Blocks::DARK_OAK_LOG(), fn(Wood $block) => Helper::encodeLog2($block, StringValues::NEW_LOG_TYPE_DARK_OAK, Ids::STRIPPED_DARK_OAK_LOG)); $this->map(Blocks::DARK_OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_DARK_OAK)); $this->map(Blocks::DARK_OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::DARK_OAK_PRESSURE_PLATE))); @@ -1046,11 +1058,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::FRAME)); $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); - $this->map(Blocks::JUNGLE_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::JUNGLE_FENCE_GATE))); $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); - $this->map(Blocks::JUNGLE_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_JUNGLE, Ids::STRIPPED_JUNGLE_LOG)); $this->map(Blocks::JUNGLE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_JUNGLE)); $this->map(Blocks::JUNGLE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::JUNGLE_PRESSURE_PLATE))); @@ -1114,7 +1123,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); $this->map(Blocks::MANGROVE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::MANGROVE_FENCE_GATE))); $this->map(Blocks::MANGROVE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::MANGROVE_LEAVES))); - $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); + $this->map(Blocks::MANGROVE_LOG(), fn(Wood $block) => Helper::encodeLog($block, Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG)); $this->map(Blocks::MANGROVE_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::MANGROVE_PRESSURE_PLATE))); $this->map(Blocks::MANGROVE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::MANGROVE_STANDING_SIGN))); $this->mapSlab(Blocks::MANGROVE_SLAB(), Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB); @@ -1169,11 +1178,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); $this->map(Blocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); - $this->map(Blocks::OAK_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::FENCE_GATE))); $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); - $this->map(Blocks::OAK_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_OAK, Ids::STRIPPED_OAK_LOG)); $this->map(Blocks::OAK_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_OAK)); $this->map(Blocks::OAK_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WOODEN_PRESSURE_PLATE))); @@ -1333,11 +1339,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); $this->map(Blocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); - $this->map(Blocks::SPRUCE_FENCE(), fn() => Writer::create(Ids::FENCE) - ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); - $this->map(Blocks::SPRUCE_LOG(), fn(Wood $block) => Helper::encodeLog1($block, StringValues::OLD_LOG_TYPE_SPRUCE, Ids::STRIPPED_SPRUCE_LOG)); $this->map(Blocks::SPRUCE_PLANKS(), fn() => Writer::create(Ids::PLANKS) ->writeString(StateNames::WOOD_TYPE, StringValues::WOOD_TYPE_SPRUCE)); $this->map(Blocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); @@ -1447,12 +1450,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::WARPED_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::WARPED_BUTTON))); $this->map(Blocks::WARPED_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::WARPED_DOOR))); $this->map(Blocks::WARPED_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::WARPED_FENCE_GATE))); - $this->map(Blocks::WARPED_HYPHAE(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE)); + $this->map(Blocks::WARPED_HYPHAE(), fn(Wood $block) => Helper::encodeLog($block, Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE)); $this->map(Blocks::WARPED_PRESSURE_PLATE(), fn(SimplePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::WARPED_PRESSURE_PLATE))); $this->map(Blocks::WARPED_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::WARPED_STANDING_SIGN))); $this->mapSlab(Blocks::WARPED_SLAB(), Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB); $this->mapStairs(Blocks::WARPED_STAIRS(), Ids::WARPED_STAIRS); - $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeNewLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); + $this->map(Blocks::WARPED_STEM(), fn(Wood $block) => Helper::encodeLog($block, Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM)); $this->map(Blocks::WARPED_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::WARPED_TRAPDOOR))); $this->map(Blocks::WARPED_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WARPED_WALL_SIGN))); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index f449cae8f8..93e840343c 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -168,31 +168,14 @@ final class BlockStateSerializerHelper{ ->writeInt(BlockStateNames::LIQUID_DEPTH, $block->getDecay() | ($block->isFalling() ? 0x8 : 0)); } - private static function encodeLog(Wood $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeLog(Wood $block, string $unstrippedId, string $strippedId) : BlockStateWriter{ + $out = $block->isStripped() ? + BlockStateWriter::create($strippedId) : + BlockStateWriter::create($unstrippedId); return $out ->writePillarAxis($block->getAxis()); } - public static function encodeLog1(Wood $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ - return self::encodeLog($block, $block->isStripped() ? - BlockStateWriter::create($strippedId) : - BlockStateWriter::create(Ids::LOG)->writeString(BlockStateNames::OLD_LOG_TYPE, $unstrippedType)); - } - - public static function encodeLog2(Wood $block, string $unstrippedType, string $strippedId) : BlockStateWriter{ - return self::encodeLog($block, $block->isStripped() ? - BlockStateWriter::create($strippedId) : - BlockStateWriter::create(Ids::LOG2)->writeString(BlockStateNames::NEW_LOG_TYPE, $unstrippedType) - ); - } - - public static function encodeNewLog(Wood $block, string $unstrippedId, string $strippedId) : BlockStateWriter{ - return self::encodeLog($block, $block->isStripped() ? - BlockStateWriter::create($strippedId) : - BlockStateWriter::create($unstrippedId) - ); - } - public static function encodeMushroomBlock(RedMushroomBlock $block, BlockStateWriter $out) : BlockStateWriter{ return $out ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, MushroomBlockTypeIdMap::getInstance()->toId($block->getMushroomBlockType())); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index a6c57937e8..bcea70b22d 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -39,6 +39,7 @@ use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; +use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializeException; @@ -72,6 +73,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->registerCandleDeserializers(); $this->registerFlatColorBlockDeserializers(); $this->registerCauldronDeserializers(); + $this->registerWoodBlockDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -117,6 +119,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map($id, fn(Reader $in) : Stair => Helper::decodeStairs($getBlock(), $in)); } + /** @phpstan-param \Closure() : Wood $getBlock */ + public function mapLog(string $unstrippedId, string $strippedId, \Closure $getBlock) : void{ + $this->map($unstrippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), false, $in)); + $this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), true, $in)); + } + private function registerCandleDeserializers() : void{ $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in)); $dyedCandleDeserializer = fn(DyeColor $color) => fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in); @@ -214,6 +222,22 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::LAVA_CAULDRON, $deserializer); } + private function registerWoodBlockDeserializers() : void{ + $this->mapSimple(Ids::ACACIA_FENCE, fn() => Blocks::ACACIA_FENCE()); + $this->mapSimple(Ids::BIRCH_FENCE, fn() => Blocks::BIRCH_FENCE()); + $this->mapSimple(Ids::DARK_OAK_FENCE, fn() => Blocks::DARK_OAK_FENCE()); + $this->mapSimple(Ids::JUNGLE_FENCE, fn() => Blocks::JUNGLE_FENCE()); + $this->mapSimple(Ids::OAK_FENCE, fn() => Blocks::OAK_FENCE()); + $this->mapSimple(Ids::SPRUCE_FENCE, fn() => Blocks::SPRUCE_FENCE()); + + $this->mapLog(Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG, fn() => Blocks::ACACIA_LOG()); + $this->mapLog(Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG, fn() => Blocks::BIRCH_LOG()); + $this->mapLog(Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG, fn() => Blocks::DARK_OAK_LOG()); + $this->mapLog(Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG, fn() => Blocks::JUNGLE_LOG()); + $this->mapLog(Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG, fn() => Blocks::OAK_LOG()); + $this->mapLog(Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG, fn() => Blocks::SPRUCE_LOG()); + } + private function registerSimpleDeserializers() : void{ $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); @@ -745,17 +769,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::FARMLAND() ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7)); }); - $this->map(Ids::FENCE, function(Reader $in) : Block{ - return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => Blocks::OAK_FENCE(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_FENCE(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_FENCE(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_FENCE(), - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_FENCE(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_FENCE(), - default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodName), - }; - }); $this->map(Ids::FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::OAK_FENCE_GATE(), $in)); $this->map(Ids::FIRE, function(Reader $in) : Block{ return Blocks::FIRE() @@ -890,18 +903,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readHorizontalFacing()) ->setLit(true); }); - $this->map(Ids::LOG, fn(Reader $in) => Helper::decodeLog(match($type = $in->readString(StateNames::OLD_LOG_TYPE)){ - StringValues::OLD_LOG_TYPE_BIRCH => Blocks::BIRCH_LOG(), - StringValues::OLD_LOG_TYPE_JUNGLE => Blocks::JUNGLE_LOG(), - StringValues::OLD_LOG_TYPE_OAK => Blocks::OAK_LOG(), - StringValues::OLD_LOG_TYPE_SPRUCE => Blocks::SPRUCE_LOG(), - default => throw $in->badValueException(StateNames::OLD_LOG_TYPE, $type), - }, false, $in)); - $this->map(Ids::LOG2, fn(Reader $in) => Helper::decodeLog(match($type = $in->readString(StateNames::NEW_LOG_TYPE)){ - StringValues::NEW_LOG_TYPE_ACACIA => Blocks::ACACIA_LOG(), - StringValues::NEW_LOG_TYPE_DARK_OAK => Blocks::DARK_OAK_LOG(), - default => throw $in->badValueException(StateNames::NEW_LOG_TYPE, $type), - }, false, $in)); $this->map(Ids::LOOM, function(Reader $in) : Block{ return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); @@ -1229,16 +1230,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::STONECUTTER() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::STRIPPED_ACACIA_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::ACACIA_LOG(), true, $in)); - $this->map(Ids::STRIPPED_BIRCH_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::BIRCH_LOG(), true, $in)); $this->map(Ids::STRIPPED_CRIMSON_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_HYPHAE(), true, $in)); $this->map(Ids::STRIPPED_CRIMSON_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::CRIMSON_STEM(), true, $in)); - $this->map(Ids::STRIPPED_DARK_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::DARK_OAK_LOG(), true, $in)); - $this->map(Ids::STRIPPED_JUNGLE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::JUNGLE_LOG(), true, $in)); $this->map(Ids::STRIPPED_MANGROVE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_LOG(), true, $in)); $this->map(Ids::STRIPPED_MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(), true, $in)); - $this->map(Ids::STRIPPED_OAK_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::OAK_LOG(), true, $in)); - $this->map(Ids::STRIPPED_SPRUCE_LOG, fn(Reader $in) => Helper::decodeLog(Blocks::SPRUCE_LOG(), true, $in)); $this->map(Ids::STRIPPED_WARPED_HYPHAE, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_HYPHAE(), true, $in)); $this->map(Ids::STRIPPED_WARPED_STEM, fn(Reader $in) => Helper::decodeLog(Blocks::WARPED_STEM(), true, $in)); $this->map(Ids::SWEET_BERRY_BUSH, function(Reader $in) : Block{ diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 82279e734f..c3f0c194c5 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -49,11 +49,11 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 575; + public const CURRENT_STORAGE_NETWORK_VERSION = 582; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 19, //minor - 70, //patch + 80, //patch 0, //revision 0 //is beta ]; diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 7be3ad1abf..2201a9159d 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -31,6 +31,7 @@ use pocketmine\crafting\json\RecipeIngredientData; use pocketmine\crafting\json\ShapedRecipeData; use pocketmine\crafting\json\ShapelessRecipeData; use pocketmine\crafting\json\SmithingTransformRecipeData; +use pocketmine\crafting\json\SmithingTrimRecipeData; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NBT; @@ -62,6 +63,7 @@ use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\ShapedRecipe; use pocketmine\network\mcpe\protocol\types\recipe\ShapelessRecipe; use pocketmine\network\mcpe\protocol\types\recipe\SmithingTransformRecipe; +use pocketmine\network\mcpe\protocol\types\recipe\SmithingTrimRecipe; use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\TagItemDescriptor; use pocketmine\network\PacketHandlingException; @@ -348,6 +350,7 @@ class ParserPacketHandler extends PacketHandler{ private function smithingRecipeToJson(SmithingTransformRecipe $recipe) : SmithingTransformRecipeData{ return new SmithingTransformRecipeData( + $this->recipeIngredientToJson($recipe->getTemplate()), $this->recipeIngredientToJson($recipe->getInput()), $this->recipeIngredientToJson($recipe->getAddition()), $this->itemStackToJson($recipe->getOutput()), @@ -355,6 +358,15 @@ class ParserPacketHandler extends PacketHandler{ ); } + private function smithingTrimRecipeToJson(SmithingTrimRecipe $recipe) : SmithingTrimRecipeData{ + return new SmithingTrimRecipeData( + $this->recipeIngredientToJson($recipe->getTemplate()), + $this->recipeIngredientToJson($recipe->getInput()), + $this->recipeIngredientToJson($recipe->getAddition()), + $recipe->getBlockName() + ); + } + public function handleCraftingData(CraftingDataPacket $packet) : bool{ echo "updating crafting data\n"; @@ -374,6 +386,7 @@ class ParserPacketHandler extends PacketHandler{ CraftingDataPacket::ENTRY_SHAPELESS_CHEMISTRY => "shapeless_chemistry", CraftingDataPacket::ENTRY_SHAPED_CHEMISTRY => "shaped_chemistry", CraftingDataPacket::ENTRY_SMITHING_TRANSFORM => "smithing", + CraftingDataPacket::ENTRY_SMITHING_TRIM => "smithing_trim", ]; if(!isset($typeMap[$entry->getTypeId()])){ throw new \UnexpectedValueException("Unknown recipe type ID " . $entry->getTypeId()); @@ -390,6 +403,8 @@ class ParserPacketHandler extends PacketHandler{ $recipes[$mappedType][] = $this->furnaceRecipeToJson($entry); }elseif($entry instanceof SmithingTransformRecipe){ $recipes[$mappedType][] = $this->smithingRecipeToJson($entry); + }elseif($entry instanceof SmithingTrimRecipe){ + $recipes[$mappedType][] = $this->smithingTrimRecipeToJson($entry); }else{ throw new AssumptionFailedError("Unknown recipe type " . get_class($entry)); } From 5a54d098690d1c46a3dd56382928c75426c055cd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 13:18:28 +0100 Subject: [PATCH 0913/1858] InventoryManager: verify slot existence in locateWindowAndSlot() previously, this would happily return invalid slot IDs, potentially leading to a crash. --- src/network/mcpe/InventoryManager.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index a651b92135..c6d83c65ee 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -205,11 +205,13 @@ class InventoryManager{ if($entry === null){ return null; } + $inventory = $entry->getInventory(); $coreSlotId = $entry->mapNetToCore($netSlotId); - return $coreSlotId !== null ? [$entry->getInventory(), $coreSlotId] : null; + return $coreSlotId !== null && $inventory->slotExists($coreSlotId) ? [$inventory, $coreSlotId] : null; } - if(isset($this->networkIdToInventoryMap[$windowId])){ - return [$this->networkIdToInventoryMap[$windowId], $netSlotId]; + $inventory = $this->networkIdToInventoryMap[$windowId] ?? null; + if($inventory !== null && $inventory->slotExists($netSlotId)){ + return [$inventory, $netSlotId]; } return null; } From 7c19f14cf5d0e55a2d38ec60ae489f8c867969f5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 13:25:08 +0100 Subject: [PATCH 0914/1858] Fixed up offhand handling for ItemStackRequest, fixes #5723 --- .../mcpe/handler/InGamePacketHandler.php | 4 ++-- .../handler/ItemStackContainerIdTranslator.php | 18 ++++++++++++------ .../mcpe/handler/ItemStackRequestExecutor.php | 7 +------ .../mcpe/handler/ItemStackResponseBuilder.php | 6 +----- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 732c8817d8..329bcd6ef8 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -356,8 +356,8 @@ class InGamePacketHandler extends PacketHandler{ //rejects the transaction. The most common example of this is equipping armor by right-click, which doesn't send //a legacy prediction action for the destination armor slot. foreach($packet->requestChangedSlots as $containerInfo){ - $windowId = ItemStackContainerIdTranslator::translate($containerInfo->getContainerId(), $this->inventoryManager->getCurrentWindowId()); - foreach($containerInfo->getChangedSlotIndexes() as $slot){ + foreach($containerInfo->getChangedSlotIndexes() as $netSlot){ + [$windowId, $slot] = ItemStackContainerIdTranslator::translate($containerInfo->getContainerId(), $this->inventoryManager->getCurrentWindowId(), $netSlot); $inventoryAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slot); if($inventoryAndSlot !== null){ //trigger the normal slot sync logic $this->inventoryManager->onSlotChange($inventoryAndSlot[0], $inventoryAndSlot[1]); diff --git a/src/network/mcpe/handler/ItemStackContainerIdTranslator.php b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php index a0ad3b26c7..f9ea9ef5f6 100644 --- a/src/network/mcpe/handler/ItemStackContainerIdTranslator.php +++ b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php @@ -33,15 +33,21 @@ final class ItemStackContainerIdTranslator{ //NOOP } - public static function translate(int $containerInterfaceId, int $currentWindowId) : int{ + /** + * @return int[] + * @phpstan-return array{int, int} + * @throws PacketHandlingException + */ + public static function translate(int $containerInterfaceId, int $currentWindowId, int $slotId) : array{ return match($containerInterfaceId){ - ContainerUIIds::ARMOR => ContainerIds::ARMOR, + ContainerUIIds::ARMOR => [ContainerIds::ARMOR, $slotId], ContainerUIIds::HOTBAR, ContainerUIIds::INVENTORY, - ContainerUIIds::COMBINED_HOTBAR_AND_INVENTORY => ContainerIds::INVENTORY, + ContainerUIIds::COMBINED_HOTBAR_AND_INVENTORY => [ContainerIds::INVENTORY, $slotId], - ContainerUIIds::OFFHAND => ContainerIds::OFFHAND, + //TODO: HACK! The client sends an incorrect slot ID for the offhand as of 1.19.70 (though this doesn't really matter since the offhand has only 1 slot anyway) + ContainerUIIds::OFFHAND => [ContainerIds::OFFHAND, 0], ContainerUIIds::ANVIL_INPUT, ContainerUIIds::ANVIL_MATERIAL, @@ -68,7 +74,7 @@ final class ItemStackContainerIdTranslator{ ContainerUIIds::TRADE2_INGREDIENT1, ContainerUIIds::TRADE2_INGREDIENT2, ContainerUIIds::TRADE_INGREDIENT1, - ContainerUIIds::TRADE_INGREDIENT2 => ContainerIds::UI, + ContainerUIIds::TRADE_INGREDIENT2 => [ContainerIds::UI, $slotId], ContainerUIIds::BARREL, ContainerUIIds::BLAST_FURNACE_INGREDIENT, @@ -80,7 +86,7 @@ final class ItemStackContainerIdTranslator{ ContainerUIIds::FURNACE_RESULT, ContainerUIIds::LEVEL_ENTITY, //chest ContainerUIIds::SHULKER_BOX, - ContainerUIIds::SMOKER_INGREDIENT => $currentWindowId, + ContainerUIIds::SMOKER_INGREDIENT => [$currentWindowId, $slotId], //all preview slots are ignored, since the client shouldn't be modifying those directly diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index b7f9b16049..f9532291c3 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -111,12 +111,7 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ protected function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ - $windowId = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId()); - $slotId = $info->getSlotId(); - if($info->getContainerId() === ContainerUIIds::OFFHAND && $slotId === 1){ - //TODO: HACK! The client sends an incorrect slot ID for the offhand as of 1.19.70 - $slotId = 0; - } + [$windowId, $slotId] = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId(), $info->getSlotId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ throw new ItemStackRequestProcessException("No open inventory matches container UI ID: " . $info->getContainerId() . ", slot ID: " . $info->getSlotId()); diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 2a55c2d95e..09af69f2a3 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -53,11 +53,7 @@ final class ItemStackResponseBuilder{ * @phpstan-return array{Inventory, int} */ private function getInventoryAndSlot(int $containerInterfaceId, int $slotId) : ?array{ - if($containerInterfaceId === ContainerUIIds::OFFHAND && $slotId === 1){ - //TODO: HACK! The client sends an incorrect slot ID for the offhand as of 1.19.70 - $slotId = 0; - } - $windowId = ItemStackContainerIdTranslator::translate($containerInterfaceId, $this->inventoryManager->getCurrentWindowId()); + [$windowId, $slotId] = ItemStackContainerIdTranslator::translate($containerInterfaceId, $this->inventoryManager->getCurrentWindowId(), $slotId); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ return null; From fea820a99e3fba8c91c0dc770fdef502ff8a6517 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 13:31:02 +0100 Subject: [PATCH 0915/1858] Release 4.20.1 --- changelogs/4.20.md | 10 ++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/changelogs/4.20.md b/changelogs/4.20.md index 357cdaced6..d8f4c66b0b 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -34,3 +34,13 @@ Released 26th April 2023. ### `pocketmine\player` - The following API methods have been added: - `public Player->openSignEditor(Vector3 $position) : void` - opens the client-side sign editor GUI for the given position + +# 4.20.1 +Released 27th April 2023. + +## Fixes +- Fixed server crash when firing a bow while holding arrows in the offhand slot. + +## Internals +- `ItemStackContainerIdTranslator::translate()` now requires an additional `int $slotId` parameter and returns `array{int, int}` (translated window ID, translated slot ID) to be used with `InventoryManager->locateWindowAndSlot()`. +- `InventoryManager->locateWindowAndSlot()` now checks if the translated slot actually exists in the requested inventory, and returns `null` if not. Previously, it would return potentially invalid slot IDs without checking them, potentially leading to crashes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8f31f6509a..b2189ed233 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.20.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 2910ffebf4f455baded6dd35574e7a44eb44d627 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 13:31:02 +0100 Subject: [PATCH 0916/1858] 4.20.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b2189ed233..08582cc58a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.20.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 023460db2c2887233190565fd8b1bfae45cbe1fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 14:53:54 +0100 Subject: [PATCH 0917/1858] BaseInventory: fixed internalAddItem() doing useless canStackWith() checks on null items if the item is null, it's never going to stack with anything given to this function, because addItem() already discards null items. --- src/inventory/BaseInventory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index daf41c5799..9968c283ea 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -219,6 +219,7 @@ abstract class BaseInventory implements Inventory{ $item = $this->getItem($i); if($item->isNull()){ $emptySlots[] = $i; + continue; } if($slot->canStackWith($item) && $item->getCount() < $item->getMaxStackSize()){ From 7f6269c432e5341c7ad128c065a3bcda5060cf17 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 16:52:52 +0100 Subject: [PATCH 0918/1858] Introduce and use optimised versions of Inventory->isSlotEmpty() this avoids useless cloning, improving the performance of several functions. --- src/inventory/BaseInventory.php | 26 ++++++++++++++------------ src/inventory/DelegateInventory.php | 4 ++++ src/inventory/SimpleInventory.php | 4 ++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 9968c283ea..d92ee92dbf 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -152,8 +152,8 @@ abstract class BaseInventory implements Inventory{ } public function firstEmpty() : int{ - foreach($this->getContents(true) as $i => $slot){ - if($slot->isNull()){ + for($i = 0, $size = $this->getSize(); $i < $size; $i++){ + if($this->isSlotEmpty($i)){ return $i; } } @@ -172,13 +172,15 @@ abstract class BaseInventory implements Inventory{ public function getAddableItemQuantity(Item $item) : int{ $count = $item->getCount(); for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ - $slot = $this->getItem($i); - if($item->canStackWith($slot)){ - if(($diff = min($slot->getMaxStackSize(), $item->getMaxStackSize()) - $slot->getCount()) > 0){ - $count -= $diff; - } - }elseif($slot->isNull()){ + if($this->isSlotEmpty($i)){ $count -= min($this->getMaxStackSize(), $item->getMaxStackSize()); + }else{ + $slot = $this->getItem($i); + if($item->canStackWith($slot)){ + if(($diff = min($slot->getMaxStackSize(), $item->getMaxStackSize()) - $slot->getCount()) > 0){ + $count -= $diff; + } + } } if($count <= 0){ @@ -216,11 +218,11 @@ abstract class BaseInventory implements Inventory{ $emptySlots = []; for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ - $item = $this->getItem($i); - if($item->isNull()){ + if($this->isSlotEmpty($i)){ $emptySlots[] = $i; continue; } + $item = $this->getItem($i); if($slot->canStackWith($item) && $item->getCount() < $item->getMaxStackSize()){ $amount = min($item->getMaxStackSize() - $item->getCount(), $slot->getCount(), $this->getMaxStackSize()); @@ -273,10 +275,10 @@ abstract class BaseInventory implements Inventory{ } for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ - $item = $this->getItem($i); - if($item->isNull()){ + if($this->isSlotEmpty($i)){ continue; } + $item = $this->getItem($i); foreach($itemSlots as $index => $slot){ if($slot->equals($item, !$slot->hasAnyDamageValue(), $slot->hasNamedTag())){ diff --git a/src/inventory/DelegateInventory.php b/src/inventory/DelegateInventory.php index ba9e5a983e..a211732cf4 100644 --- a/src/inventory/DelegateInventory.php +++ b/src/inventory/DelegateInventory.php @@ -85,6 +85,10 @@ class DelegateInventory extends BaseInventory{ $this->backingInventory->setContents($items); } + public function isSlotEmpty(int $index) : bool{ + return $this->backingInventory->isSlotEmpty($index); + } + protected function onSlotChange(int $index, Item $before) : void{ if($this->backingInventoryChanging){ parent::onSlotChange($index, $before); diff --git a/src/inventory/SimpleInventory.php b/src/inventory/SimpleInventory.php index aae11c84c0..19fbdbb17c 100644 --- a/src/inventory/SimpleInventory.php +++ b/src/inventory/SimpleInventory.php @@ -83,4 +83,8 @@ class SimpleInventory extends BaseInventory{ } } } + + public function isSlotEmpty(int $index) : bool{ + return $this->slots[$index] === null || $this->slots[$index]->isNull(); + } } From 07dc10d6e6a06ccc941627f4eff7c6d982be7244 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Thu, 27 Apr 2023 16:59:29 +0100 Subject: [PATCH 0919/1858] World: improve performance of tickChunks() selection process (#5721) Since light population is required to make a chunk tickable, a chunk may not be tickable for some time if the async workers get backlogged. The previous version of this system only cached the eligibility result if the result was a "yes", but we can also track it when it's a "no", rather than rechecking it every tick. This change should improve performance in factions and similar gamemodes, which involve large maps with sparsely distributed players, where each player likely has an independent, non-overlapping ticking chunk circle. We also ditch TickingChunkEntry in favour of multiple arrays to track the eligibility states. This allows us to avoid rechecking the (even cached) readiness of potentially thousands of chunks. If there are no ticking chunks to recheck, this reduces the cost of the selection process to zero. --- src/world/TickingChunkEntry.php | 37 ---------- src/world/World.php | 116 +++++++++++++++++++------------- 2 files changed, 71 insertions(+), 82 deletions(-) delete mode 100644 src/world/TickingChunkEntry.php diff --git a/src/world/TickingChunkEntry.php b/src/world/TickingChunkEntry.php deleted file mode 100644 index ca965463d5..0000000000 --- a/src/world/TickingChunkEntry.php +++ /dev/null @@ -1,37 +0,0 @@ - ChunkTicker - * @phpstan-var array - */ - public array $tickers = []; - - public bool $ready = false; -} diff --git a/src/world/World.php b/src/world/World.php index 3a09be1762..1803c03f14 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -224,10 +224,25 @@ class World implements ChunkManager{ private array $tickingLoaderCounter = []; /** - * @var TickingChunkEntry[] chunkHash => TickingChunkEntry - * @phpstan-var array + * @var ChunkTicker[][] chunkHash => [spl_object_id => ChunkTicker] + * @phpstan-var array> */ - private array $tickingChunks = []; + private array $registeredTickingChunks = []; + + /** + * Set of chunks which are definitely ready for ticking. + * + * @var int[] + * @phpstan-var array + */ + private array $validTickingChunks = []; + + /** + * Set of chunks which might be ready for ticking. These will be checked at the next tick. + * @var int[] + * @phpstan-var array + */ + private array $recheckTickingChunks = []; /** * @var ChunkLoader[][] chunkHash => [spl_object_id => ChunkLoader] @@ -1157,14 +1172,14 @@ class World implements ChunkManager{ } /** - * Returns a list of chunk position hashes (as returned by World::chunkHash()) which are currently registered for + * Returns a list of chunk position hashes (as returned by World::chunkHash()) which are currently valid for * ticking. * * @return int[] * @phpstan-return list */ public function getTickingChunks() : array{ - return array_keys($this->tickingChunks); + return array_keys($this->validTickingChunks); } /** @@ -1173,11 +1188,8 @@ class World implements ChunkManager{ */ public function registerTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void{ $chunkPosHash = World::chunkHash($chunkX, $chunkZ); - $entry = $this->tickingChunks[$chunkPosHash] ?? null; - if($entry === null){ - $entry = $this->tickingChunks[$chunkPosHash] = new TickingChunkEntry(); - } - $entry->tickers[spl_object_id($ticker)] = $ticker; + $this->registeredTickingChunks[$chunkPosHash][spl_object_id($ticker)] = $ticker; + $this->recheckTickingChunks[$chunkPosHash] = $chunkPosHash; } /** @@ -1187,10 +1199,14 @@ class World implements ChunkManager{ public function unregisterTickingChunk(ChunkTicker $ticker, int $chunkX, int $chunkZ) : void{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $tickerId = spl_object_id($ticker); - if(isset($this->tickingChunks[$chunkHash]->tickers[$tickerId])){ - unset($this->tickingChunks[$chunkHash]->tickers[$tickerId]); - if(count($this->tickingChunks[$chunkHash]->tickers) === 0){ - unset($this->tickingChunks[$chunkHash]); + if(isset($this->registeredTickingChunks[$chunkHash][$tickerId])){ + unset($this->registeredTickingChunks[$chunkHash][$tickerId]); + if(count($this->registeredTickingChunks[$chunkHash]) === 0){ + unset( + $this->registeredTickingChunks[$chunkHash], + $this->recheckTickingChunks[$chunkHash], + $this->validTickingChunks[$chunkHash] + ); } } } @@ -1234,37 +1250,37 @@ class World implements ChunkManager{ } private function tickChunks() : void{ - if($this->chunkTickRadius <= 0 || (count($this->tickingChunks) === 0 && count($this->tickingLoaders) === 0)){ + if($this->chunkTickRadius <= 0 || (count($this->registeredTickingChunks) === 0 && count($this->tickingLoaders) === 0)){ return; } - $this->timings->randomChunkUpdatesChunkSelection->startTiming(); + if(count($this->recheckTickingChunks) > 0 || count($this->tickingLoaders) > 0){ + $this->timings->randomChunkUpdatesChunkSelection->startTiming(); - /** @var bool[] $chunkTickList chunkhash => dummy */ - $chunkTickList = []; + $chunkTickableCache = []; - $chunkTickableCache = []; - - foreach($this->tickingChunks as $hash => $entry){ - if(!$entry->ready){ + foreach($this->recheckTickingChunks as $hash => $_){ World::getXZ($hash, $chunkX, $chunkZ); if($this->isChunkTickable($chunkX, $chunkZ, $chunkTickableCache)){ - $entry->ready = true; - }else{ - //the chunk has been flagged as temporarily not tickable, so we don't want to tick it this time - continue; + $this->validTickingChunks[$hash] = $hash; } } - $chunkTickList[$hash] = true; - } + $this->recheckTickingChunks = []; - //TODO: REMOVE THIS - //backwards compatibility for TickingChunkLoader, although I'm not sure this is really necessary in practice - if(count($this->tickingLoaders) !== 0){ - $this->selectTickableChunksLegacy($chunkTickList, $chunkTickableCache); - } + //TODO: REMOVE THIS - we need a local var to add extra chunks to if we have legacy ticking loaders + //this is copy-on-write, so it won't have any performance impact if there are no legacy ticking loaders + $chunkTickList = $this->validTickingChunks; - $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); + //TODO: REMOVE THIS + //backwards compatibility for TickingChunkLoader, although I'm not sure this is really necessary in practice + if(count($this->tickingLoaders) !== 0){ + $this->selectTickableChunksLegacy($chunkTickList, $chunkTickableCache); + } + + $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); + }else{ + $chunkTickList = $this->validTickingChunks; + } foreach($chunkTickList as $index => $_){ World::getXZ($index, $chunkX, $chunkZ); @@ -1315,16 +1331,23 @@ class World implements ChunkManager{ } /** - * Marks the 3x3 chunks around the specified chunk as not ready to be ticked. This is used to prevent chunk ticking - * while a chunk is being populated, light-populated, or unloaded. - * Each chunk will be rechecked every tick until it is ready to be ticked again. + * Marks the 3x3 square of chunks centered on the specified chunk for chunk ticking eligibility recheck. + * + * This should be used whenever the chunk's eligibility to be ticked is changed. This includes: + * - Loading/unloading the chunk (the chunk may be registered for ticking before it is loaded) + * - Locking/unlocking the chunk (e.g. world population) + * - Light populated state change (i.e. scheduled for light population, or light population completed) + * - Arbitrary chunk replacement (i.e. setChunk() or similar) */ - private function markTickingChunkUnavailable(int $chunkX, int $chunkZ) : void{ + private function markTickingChunkForRecheck(int $chunkX, int $chunkZ) : void{ for($cx = -1; $cx <= 1; ++$cx){ for($cz = -1; $cz <= 1; ++$cz){ $chunkHash = World::chunkHash($chunkX + $cx, $chunkZ + $cz); - if(isset($this->tickingChunks[$chunkHash])){ - $this->tickingChunks[$chunkHash]->ready = false; + unset($this->validTickingChunks[$chunkHash]); + if(isset($this->registeredTickingChunks[$chunkHash])){ + $this->recheckTickingChunks[$chunkHash] = $chunkHash; + }else{ + unset($this->recheckTickingChunks[$chunkHash]); } } } @@ -1335,7 +1358,7 @@ class World implements ChunkManager{ $lightPopulatedState = $this->chunks[$chunkHash]->isLightPopulated(); if($lightPopulatedState === false){ $this->chunks[$chunkHash]->setLightPopulated(null); - $this->markTickingChunkUnavailable($chunkX, $chunkZ); + $this->markTickingChunkForRecheck($chunkX, $chunkZ); $this->workerPool->submitTask(new LightPopulationTask( $this->chunks[$chunkHash], @@ -1359,6 +1382,7 @@ class World implements ChunkManager{ $chunk->getSubChunk($y)->setBlockSkyLightArray($lightArray); } $chunk->setLightPopulated(true); + $this->markTickingChunkForRecheck($chunkX, $chunkZ); } )); } @@ -2403,7 +2427,7 @@ class World implements ChunkManager{ throw new \InvalidArgumentException("Chunk $chunkX $chunkZ is already locked"); } $this->chunkLock[$chunkHash] = $lockId; - $this->markTickingChunkUnavailable($chunkX, $chunkZ); + $this->markTickingChunkForRecheck($chunkX, $chunkZ); } /** @@ -2418,6 +2442,7 @@ class World implements ChunkManager{ $chunkHash = World::chunkHash($chunkX, $chunkZ); if(isset($this->chunkLock[$chunkHash]) && ($lockId === null || $this->chunkLock[$chunkHash] === $lockId)){ unset($this->chunkLock[$chunkHash]); + $this->markTickingChunkForRecheck($chunkX, $chunkZ); return true; } return false; @@ -2469,7 +2494,7 @@ class World implements ChunkManager{ unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); $chunk->setTerrainDirty(); - $this->markTickingChunkUnavailable($chunkX, $chunkZ); //this replacement chunk may not meet the conditions for ticking + $this->markTickingChunkForRecheck($chunkX, $chunkZ); //this replacement chunk may not meet the conditions for ticking if(!$this->isChunkInUse($chunkX, $chunkZ)){ $this->unloadChunkRequest($chunkX, $chunkZ); @@ -2751,6 +2776,7 @@ class World implements ChunkManager{ foreach($this->getChunkListeners($x, $z) as $listener){ $listener->onChunkLoaded($x, $z, $this->chunks[$chunkHash]); } + $this->markTickingChunkForRecheck($x, $z); //tickers may have been registered before the chunk was loaded $this->timings->syncChunkLoad->stopTiming(); @@ -2912,8 +2938,8 @@ class World implements ChunkManager{ unset($this->chunks[$chunkHash]); unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); - unset($this->tickingChunks[$chunkHash]); - $this->markTickingChunkUnavailable($x, $z); + unset($this->registeredTickingChunks[$chunkHash]); + $this->markTickingChunkForRecheck($x, $z); if(array_key_exists($chunkHash, $this->chunkPopulationRequestMap)){ $this->logger->debug("Rejecting population promise for chunk $x $z"); From 709d874204845fb8831b17da29d382643391af0d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 20:27:05 +0100 Subject: [PATCH 0920/1858] BaseInventory: clean up max stack size handling we can safely assume that: - the inventory's max stack size won't change during the operation - two items which stack together have the same max stack size - the item's max stack size won't change during the operation --- src/inventory/BaseInventory.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index d92ee92dbf..a90a4e2b9f 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -171,13 +171,15 @@ abstract class BaseInventory implements Inventory{ public function getAddableItemQuantity(Item $item) : int{ $count = $item->getCount(); + $maxStackSize = min($this->getMaxStackSize(), $item->getMaxStackSize()); + for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ if($this->isSlotEmpty($i)){ - $count -= min($this->getMaxStackSize(), $item->getMaxStackSize()); + $count -= $maxStackSize; }else{ $slot = $this->getItem($i); if($item->canStackWith($slot)){ - if(($diff = min($slot->getMaxStackSize(), $item->getMaxStackSize()) - $slot->getCount()) > 0){ + if(($diff = $maxStackSize - $slot->getCount()) > 0){ $count -= $diff; } } @@ -217,6 +219,8 @@ abstract class BaseInventory implements Inventory{ private function internalAddItem(Item $slot) : Item{ $emptySlots = []; + $maxStackSize = min($this->getMaxStackSize(), $slot->getMaxStackSize()); + for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ if($this->isSlotEmpty($i)){ $emptySlots[] = $i; @@ -224,8 +228,8 @@ abstract class BaseInventory implements Inventory{ } $item = $this->getItem($i); - if($slot->canStackWith($item) && $item->getCount() < $item->getMaxStackSize()){ - $amount = min($item->getMaxStackSize() - $item->getCount(), $slot->getCount(), $this->getMaxStackSize()); + if($slot->canStackWith($item) && $item->getCount() < $maxStackSize){ + $amount = min($maxStackSize - $item->getCount(), $slot->getCount()); if($amount > 0){ $slot->setCount($slot->getCount() - $amount); $item->setCount($item->getCount() + $amount); @@ -239,7 +243,7 @@ abstract class BaseInventory implements Inventory{ if(count($emptySlots) > 0){ foreach($emptySlots as $slotIndex){ - $amount = min($slot->getMaxStackSize(), $slot->getCount(), $this->getMaxStackSize()); + $amount = min($maxStackSize, $slot->getCount()); $slot->setCount($slot->getCount() - $amount); $item = clone $slot; $item->setCount($amount); From 42288805097dae66aeec288030b8767ac5b36c1e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 20:29:02 +0100 Subject: [PATCH 0921/1858] BaseInventory: change dumb variable names in internalAddItem() --- src/inventory/BaseInventory.php | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index a90a4e2b9f..6154bcb900 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -216,25 +216,25 @@ abstract class BaseInventory implements Inventory{ return $returnSlots; } - private function internalAddItem(Item $slot) : Item{ + private function internalAddItem(Item $newItem) : Item{ $emptySlots = []; - $maxStackSize = min($this->getMaxStackSize(), $slot->getMaxStackSize()); + $maxStackSize = min($this->getMaxStackSize(), $newItem->getMaxStackSize()); for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ if($this->isSlotEmpty($i)){ $emptySlots[] = $i; continue; } - $item = $this->getItem($i); + $slotItem = $this->getItem($i); - if($slot->canStackWith($item) && $item->getCount() < $maxStackSize){ - $amount = min($maxStackSize - $item->getCount(), $slot->getCount()); + if($newItem->canStackWith($slotItem) && $slotItem->getCount() < $maxStackSize){ + $amount = min($maxStackSize - $slotItem->getCount(), $newItem->getCount()); if($amount > 0){ - $slot->setCount($slot->getCount() - $amount); - $item->setCount($item->getCount() + $amount); - $this->setItem($i, $item); - if($slot->getCount() <= 0){ + $newItem->setCount($newItem->getCount() - $amount); + $slotItem->setCount($slotItem->getCount() + $amount); + $this->setItem($i, $slotItem); + if($newItem->getCount() <= 0){ break; } } @@ -243,18 +243,18 @@ abstract class BaseInventory implements Inventory{ if(count($emptySlots) > 0){ foreach($emptySlots as $slotIndex){ - $amount = min($maxStackSize, $slot->getCount()); - $slot->setCount($slot->getCount() - $amount); - $item = clone $slot; - $item->setCount($amount); - $this->setItem($slotIndex, $item); - if($slot->getCount() <= 0){ + $amount = min($maxStackSize, $newItem->getCount()); + $newItem->setCount($newItem->getCount() - $amount); + $slotItem = clone $newItem; + $slotItem->setCount($amount); + $this->setItem($slotIndex, $slotItem); + if($newItem->getCount() <= 0){ break; } } } - return $slot; + return $newItem; } public function remove(Item $item) : void{ From eb136e60c8011548e0d84f5def1cc1063e83559e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 21:08:35 +0100 Subject: [PATCH 0922/1858] BaseInventory: added getMatchingItemCount() helper this eliminates the performance issues described by #5719. closes #5719 we may want to consider exposing a public API for this in the future, since it might be useful for plugins. --- src/inventory/BaseInventory.php | 83 ++++++++++++++++++------------- src/inventory/SimpleInventory.php | 5 ++ 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 6154bcb900..433fcbf879 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -108,13 +108,23 @@ abstract class BaseInventory implements Inventory{ $this->onContentChange($oldContents); } + /** + * Helper for utility functions which search the inventory. + * TODO: make this abstract instead of providing a slow default implementation (BC break) + */ + protected function getMatchingItemCount(int $slot, Item $test, bool $checkDamage, bool $checkTags) : int{ + $item = $this->getItem($slot); + return $item->equals($test, $checkDamage, $checkTags) ? $item->getCount() : 0; + } + public function contains(Item $item) : bool{ $count = max(1, $item->getCount()); $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); - foreach($this->getContents() as $i){ - if($item->equals($i, $checkDamage, $checkTags)){ - $count -= $i->getCount(); + for($i = 0, $size = $this->getSize(); $i < $size; $i++){ + $slotCount = $this->getMatchingItemCount($i, $item, $checkDamage, $checkTags); + if($slotCount > 0){ + $count -= $slotCount; if($count <= 0){ return true; } @@ -128,9 +138,9 @@ abstract class BaseInventory implements Inventory{ $slots = []; $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); - foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags)){ - $slots[$index] = $i; + for($i = 0, $size = $this->getSize(); $i < $size; $i++){ + if($this->getMatchingItemCount($i, $item, $checkDamage, $checkTags) > 0){ + $slots[$i] = $this->getItem($i); } } @@ -142,9 +152,10 @@ abstract class BaseInventory implements Inventory{ $checkDamage = $exact || !$item->hasAnyDamageValue(); $checkTags = $exact || $item->hasNamedTag(); - foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags) && ($i->getCount() === $count || (!$exact && $i->getCount() > $count))){ - return $index; + for($i = 0, $size = $this->getSize(); $i < $size; $i++){ + $slotCount = $this->getMatchingItemCount($i, $item, $checkDamage, $checkTags); + if($slotCount > 0 && ($slotCount === $count || (!$exact && $slotCount > $count))){ + return $i; } } @@ -177,11 +188,9 @@ abstract class BaseInventory implements Inventory{ if($this->isSlotEmpty($i)){ $count -= $maxStackSize; }else{ - $slot = $this->getItem($i); - if($item->canStackWith($slot)){ - if(($diff = $maxStackSize - $slot->getCount()) > 0){ - $count -= $diff; - } + $slotCount = $this->getMatchingItemCount($i, $item, true, true); + if($slotCount > 0 && ($diff = $maxStackSize - $slotCount) > 0){ + $count -= $diff; } } @@ -226,12 +235,16 @@ abstract class BaseInventory implements Inventory{ $emptySlots[] = $i; continue; } - $slotItem = $this->getItem($i); + $slotCount = $this->getMatchingItemCount($i, $newItem, true, true); + if($slotCount === 0){ + continue; + } - if($newItem->canStackWith($slotItem) && $slotItem->getCount() < $maxStackSize){ - $amount = min($maxStackSize - $slotItem->getCount(), $newItem->getCount()); + if($slotCount < $maxStackSize){ + $amount = min($maxStackSize - $slotCount, $newItem->getCount()); if($amount > 0){ $newItem->setCount($newItem->getCount() - $amount); + $slotItem = $this->getItem($i); $slotItem->setCount($slotItem->getCount() + $amount); $this->setItem($i, $slotItem); if($newItem->getCount() <= 0){ @@ -261,20 +274,20 @@ abstract class BaseInventory implements Inventory{ $checkDamage = !$item->hasAnyDamageValue(); $checkTags = $item->hasNamedTag(); - foreach($this->getContents() as $index => $i){ - if($item->equals($i, $checkDamage, $checkTags)){ - $this->clear($index); + for($i = 0, $size = $this->getSize(); $i < $size; $i++){ + if($this->getMatchingItemCount($i, $item, $checkDamage, $checkTags) > 0){ + $this->clear($i); } } } public function removeItem(Item ...$slots) : array{ - /** @var Item[] $itemSlots */ + /** @var Item[] $searchItems */ /** @var Item[] $slots */ - $itemSlots = []; + $searchItems = []; foreach($slots as $slot){ if(!$slot->isNull()){ - $itemSlots[] = clone $slot; + $searchItems[] = clone $slot; } } @@ -282,26 +295,28 @@ abstract class BaseInventory implements Inventory{ if($this->isSlotEmpty($i)){ continue; } - $item = $this->getItem($i); - foreach($itemSlots as $index => $slot){ - if($slot->equals($item, !$slot->hasAnyDamageValue(), $slot->hasNamedTag())){ - $amount = min($item->getCount(), $slot->getCount()); - $slot->setCount($slot->getCount() - $amount); - $item->setCount($item->getCount() - $amount); - $this->setItem($i, $item); - if($slot->getCount() <= 0){ - unset($itemSlots[$index]); + foreach($searchItems as $index => $search){ + $slotCount = $this->getMatchingItemCount($i, $search, !$search->hasAnyDamageValue(), $search->hasNamedTag()); + if($slotCount > 0){ + $amount = min($slotCount, $search->getCount()); + $search->setCount($search->getCount() - $amount); + + $slotItem = $this->getItem($i); + $slotItem->setCount($slotItem->getCount() - $amount); + $this->setItem($i, $slotItem); + if($search->getCount() <= 0){ + unset($searchItems[$index]); } } } - if(count($itemSlots) === 0){ + if(count($searchItems) === 0){ break; } } - return $itemSlots; + return $searchItems; } public function clear(int $index) : void{ diff --git a/src/inventory/SimpleInventory.php b/src/inventory/SimpleInventory.php index 19fbdbb17c..c1f352b7b7 100644 --- a/src/inventory/SimpleInventory.php +++ b/src/inventory/SimpleInventory.php @@ -84,6 +84,11 @@ class SimpleInventory extends BaseInventory{ } } + protected function getMatchingItemCount(int $slot, Item $test, bool $checkDamage, bool $checkTags) : int{ + $slotItem = $this->slots[$slot]; + return $slotItem !== null && $slotItem->equals($test, $checkDamage, $checkTags) ? $slotItem->getCount() : 0; + } + public function isSlotEmpty(int $index) : bool{ return $this->slots[$index] === null || $this->slots[$index]->isNull(); } From 73bf5d4b29f6e64edc28aee900614b78a62192bb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 27 Apr 2023 21:17:55 +0100 Subject: [PATCH 0923/1858] DoubleChestInventory: specialize isSlotEmpty() and getMatchingItemCount() --- src/block/inventory/DoubleChestInventory.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/block/inventory/DoubleChestInventory.php b/src/block/inventory/DoubleChestInventory.php index 92c75ef9f1..8c38e190de 100644 --- a/src/block/inventory/DoubleChestInventory.php +++ b/src/block/inventory/DoubleChestInventory.php @@ -85,6 +85,20 @@ class DoubleChestInventory extends BaseInventory implements BlockInventory, Inve $this->right->setContents($rightContents); } + protected function getMatchingItemCount(int $slot, Item $test, bool $checkDamage, bool $checkTags) : int{ + $leftSize = $this->left->getSize(); + return $slot < $leftSize ? + $this->left->getMatchingItemCount($slot, $test, $checkDamage, $checkTags) : + $this->right->getMatchingItemCount($slot - $leftSize, $test, $checkDamage, $checkTags); + } + + public function isSlotEmpty(int $index) : bool{ + $leftSize = $this->left->getSize(); + return $index < $leftSize ? + $this->left->isSlotEmpty($index) : + $this->right->isSlotEmpty($index - $leftSize); + } + protected function getOpenSound() : Sound{ return new ChestOpenSound(); } protected function getCloseSound() : Sound{ return new ChestCloseSound(); } From b70ff325488093f18899ac9935551220334bd4b9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 13:54:40 +0100 Subject: [PATCH 0924/1858] ItemTranslator: Fixed log items not displaying correctly on the client closes #5724 this uses a (potentially bogus) assumption that the lowest mapped meta value associated with an ID is valid. I don't want to break this during a patch release, and this works for now. In the future it would probably make more sense to bypass ItemTranslator entirely, and rely solely on the blockstate returned by RuntimeBlockMapping to fetch the correct ID. This is similar to how we serialize items for saving on disk in PM5. --- src/network/mcpe/convert/ItemTranslator.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 8342db61f2..e3e901e662 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -110,6 +110,12 @@ final class ItemTranslator{ //new item without a fixed legacy ID - we can't handle this right now continue; } + if(isset($complexMappings[$newId]) && $complexMappings[$newId][0] === $intId && $complexMappings[$newId][1] <= $meta){ + //TODO: HACK! Multiple legacy ID/meta pairs can be mapped to the same new ID (see minecraft:log) + //Assume that the first one is the most relevant for now + //However, this could catch fire in the future if this assumption is broken + continue; + } $complexMappings[$newId] = [$intId, (int) $meta]; } } From 869c836e2d932ec84e34556eb855d36a5427b40d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 17:12:52 +0100 Subject: [PATCH 0925/1858] BlockStateUpgradeSchemaUtils: ensure that remapped values are generated in a consistent order this uses lexical order, which isn't ideal for numeric values (1, 10, 2, etc), but it's good enough to ensure that the order is stable. --- .../bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 03019aeab0..b7576b2ef6 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -35,6 +35,7 @@ use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_map; +use function array_values; use function count; use function get_debug_type; use function gettype; @@ -175,6 +176,7 @@ final class BlockStateUpgradeSchemaUtils{ foreach($remappedValues as $oldNew){ $remappedValuesMap[$oldNew->old->toString()] = $oldNew; } + ksort($remappedValuesMap); foreach(Utils::stringifyKeys($dedupTableMap) as $dedupName => $dedupValuesMap){ if(count($remappedValuesMap) !== count($dedupValuesMap)){ @@ -199,7 +201,7 @@ final class BlockStateUpgradeSchemaUtils{ //no match, add the values to the table $newDedupName = $propertyName . "_" . str_pad(strval($counter++), 2, "0", STR_PAD_LEFT); $dedupTableMap[$newDedupName] = $remappedValuesMap; - $dedupTable[$newDedupName] = $remappedValues; + $dedupTable[$newDedupName] = array_values($remappedValuesMap); $dedupMapping[$blockName][$propertyName] = $newDedupName; } } From ff8301b86c9ddf970ea06cbf223db1d4c528d2a5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 17:23:32 +0100 Subject: [PATCH 0926/1858] BlockStateData: fixed outdated version ID --- src/data/bedrock/block/BlockStateData.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index cc04bc31c0..31f2b98c05 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -41,8 +41,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (19 << 16) | //minor - (70 << 8) | //patch - (15); //revision + (80 << 8) | //patch + (11); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; From e2108557abb8503656111b51cd07fa2f1c3cee27 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 17:26:19 +0100 Subject: [PATCH 0927/1858] BlockStateUpgrader: make sure the returned state always has an updated version ID PM itself doesn't require this, but it's useful for tools to know whether to upgrade the schema again (e.g. in testing scenarios). --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index b7fd5a4223..949bd27b12 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -56,8 +56,10 @@ final class BlockStateUpgrader{ public function upgrade(BlockStateData $blockStateData) : BlockStateData{ $version = $blockStateData->getVersion(); + $highestVersion = $version; foreach($this->upgradeSchemas as $schema){ $resultVersion = $schema->getVersionId(); + $highestVersion = max($highestVersion, $resultVersion); if($version > $resultVersion){ //even if this is actually the same version, we have to apply it anyway because mojang are dumb and //didn't always bump the blockstate version when changing it :( @@ -96,6 +98,11 @@ final class BlockStateUpgrader{ } } + if($highestVersion > $version){ + //always update the version number of the blockstate, even if it didn't change - this is needed for + //external tools + $blockStateData = new BlockStateData($blockStateData->getName(), $blockStateData->getStates(), $highestVersion); + } return $blockStateData; } From 75410a541211dc4819f786fcbb4891bf3f7c1394 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 19:31:00 +0100 Subject: [PATCH 0928/1858] BlockStateUpgradeSchemaUtils: sort data before emitting JSON this makes it easier to see what's changing, as well as making the order stable across multiple regenerations. --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index b7576b2ef6..3b247be378 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -31,6 +31,7 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; @@ -42,7 +43,9 @@ use function gettype; use function implode; use function is_object; use function json_decode; +use function json_encode; use function ksort; +use function sort; use function str_pad; use function strval; use const JSON_THROW_ON_ERROR; @@ -170,7 +173,10 @@ final class BlockStateUpgradeSchemaUtils{ $dedupTableMap = []; $counter = 0; - foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $remaps){ + $orderedRemappedValues = $schema->remappedPropertyValues; + ksort($orderedRemappedValues); + foreach(Utils::stringifyKeys($orderedRemappedValues) as $blockName => $remaps){ + ksort($remaps); foreach(Utils::stringifyKeys($remaps) as $propertyName => $remappedValues){ $remappedValuesMap = []; foreach($remappedValues as $oldNew){ @@ -215,6 +221,12 @@ final class BlockStateUpgradeSchemaUtils{ ); } } + ksort($modelTable); + ksort($dedupMapping); + foreach(Utils::stringifyKeys($dedupMapping) as $blockName => $properties){ + ksort($properties); + $dedupMapping[$blockName] = $properties; + } $model->remappedPropertyValuesIndex = $modelTable; $model->remappedPropertyValues = $dedupMapping; @@ -226,26 +238,58 @@ final class BlockStateUpgradeSchemaUtils{ $result->maxVersionMinor = $schema->maxVersionMinor; $result->maxVersionPatch = $schema->maxVersionPatch; $result->maxVersionRevision = $schema->maxVersionRevision; + $result->renamedIds = $schema->renamedIds; + ksort($result->renamedIds); + $result->renamedProperties = $schema->renamedProperties; + ksort($result->renamedProperties); + foreach(Utils::stringifyKeys($result->renamedProperties) as $blockName => $properties){ + ksort($properties); + $result->renamedProperties[$blockName] = $properties; + } + $result->removedProperties = $schema->removedProperties; + ksort($result->removedProperties); + foreach(Utils::stringifyKeys($result->removedProperties) as $blockName => $properties){ + sort($properties); //yes, this is intended to sort(), not ksort() + $result->removedProperties[$blockName] = $properties; + } foreach(Utils::stringifyKeys($schema->addedProperties) as $blockName => $properties){ + $addedProperties = []; foreach(Utils::stringifyKeys($properties) as $propertyName => $propertyValue){ - $result->addedProperties[$blockName][$propertyName] = self::tagToJsonModel($propertyValue); + $addedProperties[$propertyName] = self::tagToJsonModel($propertyValue); } + ksort($addedProperties); + $result->addedProperties[$blockName] = $addedProperties; + } + if(isset($result->addedProperties)){ + ksort($result->addedProperties); } self::buildRemappedValuesIndex($schema, $result); foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ + $keyedRemaps = []; foreach($remaps as $remap){ - $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( + $modelRemap = new BlockStateUpgradeSchemaModelBlockRemap( array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), $remap->newName, array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), ); + $key = json_encode($modelRemap); + if(isset($keyedRemaps[$key])){ + continue; + throw new AssumptionFailedError("Duplicate remap: $key"); + } + $keyedRemaps[$key] = $modelRemap; } + ksort($keyedRemaps); + $result->remappedStates[$oldBlockName] = array_values($keyedRemaps); + } + if(isset($result->remappedStates)){ + ksort($result->remappedStates); } return $result; From 04aabaee5e3a445c1e4bd128859e8acc03827c26 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 19:31:08 +0100 Subject: [PATCH 0929/1858] Fix CS --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 949bd27b12..16c58fb27c 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -28,6 +28,7 @@ use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use function count; use function ksort; +use function max; use const SORT_NUMERIC; final class BlockStateUpgrader{ From a1cd1d7433d158a82cde8c906342a3b31098a293 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 19:35:03 +0100 Subject: [PATCH 0930/1858] ... --- src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 3b247be378..c8dfb6cd83 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -279,9 +279,9 @@ final class BlockStateUpgradeSchemaUtils{ array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), ); $key = json_encode($modelRemap); + assert(!isset($keyedRemaps[$key])); if(isset($keyedRemaps[$key])){ continue; - throw new AssumptionFailedError("Duplicate remap: $key"); } $keyedRemaps[$key] = $modelRemap; } From 2121152b763f6527a486adc16973c091b5cb20bc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 20:03:53 +0100 Subject: [PATCH 0931/1858] Fix CS --- src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index c8dfb6cd83..6af100090b 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -31,12 +31,12 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_map; use function array_values; +use function assert; use function count; use function get_debug_type; use function gettype; From 263e1e9950beb9dc0ac22e8724e438d502c69dc6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 20:05:51 +0100 Subject: [PATCH 0932/1858] Fixed bogus test expectations --- .../data/bedrock/block/upgrade/BlockStateUpgraderTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php index 86ba0f67b0..39013d6159 100644 --- a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php @@ -107,7 +107,8 @@ class BlockStateUpgraderTest extends TestCase{ $stateData = $getStateData(); $upgradedStateData = $this->upgrade($stateData, $getStateData); - self::assertSame($stateData, $upgradedStateData, "Adding a property that already exists with a different value should not alter the state"); + //the object may not be the same due to + self::assertTrue($stateData->equals($upgradedStateData), "Adding a property that already exists with a different value should not alter the state"); } private function prepareRemovePropertySchema(BlockStateUpgradeSchema $schema) : void{ From a1d44de4874539a367588f3e3ecd5da31778e870 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 20:34:06 +0100 Subject: [PATCH 0933/1858] Added support for compressing blockstate remaps using copiedState this significantly reduces the size of schemas when state remaps are used (see pmmp/BedrockBlockUpgradeSchema@85b83b360eec4377e40cc9ab6c6f09d99d109527). in addition, this will likely offer a substantial performance and memory saving when walls get flattened, which will eventually happen. --- .../BlockStateUpgradeSchemaBlockRemap.php | 10 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 5 + .../block/upgrade/BlockStateUpgrader.php | 15 +- ...BlockStateUpgradeSchemaModelBlockRemap.php | 12 +- tools/generate-blockstate-upgrade-schema.php | 134 +++++++++++++++++- 5 files changed, 166 insertions(+), 10 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php index a0659b40ae..7c57e1f1f9 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -27,14 +27,18 @@ use pocketmine\nbt\tag\Tag; final class BlockStateUpgradeSchemaBlockRemap{ /** - * @param Tag[] $oldState - * @param Tag[] $newState + * @param Tag[] $oldState + * @param Tag[] $newState + * @param string[] $copiedState + * * @phpstan-param array $oldState * @phpstan-param array $newState + * @phpstan-param list $copiedState */ public function __construct( public array $oldState, public string $newName, - public array $newState + public array $newState, + public array $copiedState ){} } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 6af100090b..833b2a05a5 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -157,6 +157,7 @@ final class BlockStateUpgradeSchemaUtils{ array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState ?? []), $remap->newName, array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState ?? []), + $remap->copiedState ?? [] ); } } @@ -277,7 +278,11 @@ final class BlockStateUpgradeSchemaUtils{ array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), $remap->newName, array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), + $remap->copiedState ); + if(count($modelRemap->copiedState) === 0){ + unset($modelRemap->copiedState); //avoid polluting the JSON + } $key = json_encode($modelRemap); assert(!isset($keyedRemaps[$key])); if(isset($keyedRemaps[$key])){ diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 16c58fb27c..ab0424a331 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -70,16 +70,23 @@ final class BlockStateUpgrader{ $oldState = $blockStateData->getStates(); if(isset($schema->remappedStates[$oldName])){ foreach($schema->remappedStates[$oldName] as $remap){ - if(count($oldState) !== count($remap->oldState)){ + if(count($remap->oldState) > count($oldState)){ + //match criteria has more requirements than we have state properties continue; //try next state } - foreach(Utils::stringifyKeys($oldState) as $k => $v){ - if(!isset($remap->oldState[$k]) || !$remap->oldState[$k]->equals($v)){ + foreach(Utils::stringifyKeys($remap->oldState) as $k => $v){ + if(!isset($oldState[$k]) || !$oldState[$k]->equals($v)){ continue 2; //try next state } } + $newState = $remap->newState; + foreach($remap->copiedState as $stateName){ + if(isset($oldState[$stateName])){ + $newState[$stateName] = $oldState[$stateName]; + } + } - $blockStateData = new BlockStateData($remap->newName, $remap->newState, $resultVersion); + $blockStateData = new BlockStateData($remap->newName, $newState, $resultVersion); continue 2; //try next schema } } diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index 0991e54690..49b2e0f285 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -43,15 +43,25 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ */ public ?array $newState; + /** + * @var string[] + * @phpstan-var list + * May not be present in older schemas + */ + public array $copiedState; + /** * @param BlockStateUpgradeSchemaModelTag[] $oldState * @param BlockStateUpgradeSchemaModelTag[] $newState + * @param string[] $copiedState * @phpstan-param array $oldState * @phpstan-param array $newState + * @phpstan-param list $copiedState */ - public function __construct(array $oldState, string $newName, array $newState){ + public function __construct(array $oldState, string $newName, array $newState, array $copiedState){ $this->oldState = count($oldState) === 0 ? null : $oldState; $this->newName = $newName; $this->newState = count($newState) === 0 ? null : $newState; + $this->copiedState = $copiedState; } } diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 85d42a35bf..8bb271ddf9 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -33,12 +33,16 @@ use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use function array_key_first; +use function array_merge; +use function array_values; +use function assert; use function count; use function dirname; use function file_put_contents; use function fwrite; use function json_encode; use function ksort; +use function usort; use const JSON_PRETTY_PRINT; use const SORT_STRING; use const STDERR; @@ -177,13 +181,134 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( $oldStates, $new->getName(), - $newStates + $newStates, + [] ); \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; } } } +/** + * Attempts to compress a list of remapped states by looking at which state properties were consistently unchanged. + * This significantly reduces the output size during flattening when the flattened block has many permutations + * (e.g. walls). + * + * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps + * @param BlockStateMapping[] $upgradeTable + * + * @return BlockStateUpgradeSchemaBlockRemap[] + */ +function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ + $unchangedStatesByNewName = []; + + foreach($upgradeTable as $pair){ + if(count($pair->old->getStates()) === 0 || count($pair->new->getStates()) === 0){ + //all states have changed in some way - compression not possible + $unchangedStatesByNewName[$pair->new->getName()] = []; + continue; + } + + $oldStates = $pair->old->getStates(); + $newStates = $pair->new->getStates(); + if(!isset($unchangedStatesByNewName[$pair->new->getName()])){ + //build list of unchanged states for this new ID + $unchangedStatesByNewName[$pair->new->getName()] = []; + foreach(Utils::stringifyKeys($oldStates) as $propertyName => $propertyValue){ + if(isset($newStates[$propertyName]) && $newStates[$propertyName]->equals($propertyValue)){ + $unchangedStatesByNewName[$pair->new->getName()][] = $propertyName; + } + } + }else{ + //we already have a list of stuff that probably didn't change - verify that this is the case, and remove + //any that changed in later states with the same ID + foreach($unchangedStatesByNewName[$pair->new->getName()] as $k => $propertyName){ + if( + !isset($oldStates[$propertyName]) || + !isset($newStates[$propertyName]) || + !$oldStates[$propertyName]->equals($newStates[$propertyName]) + ){ + //this property disappeared or changed its value in another state with the same ID - we can't + //compress this state + unset($unchangedStatesByNewName[$pair->new->getName()][$k]); + } + } + } + } + foreach(Utils::stringifyKeys($unchangedStatesByNewName) as $newName => $unchangedStates){ + ksort($unchangedStates); + $unchangedStatesByNewName[$newName] = $unchangedStates; + } + + $compressedRemaps = []; + + foreach($stateRemaps as $remap){ + $oldState = $remap->oldState; + $newState = $remap->newState; + + if($oldState === null || $newState === null){ + //no unchanged states - no compression possible + assert(!isset($unchangedStatesByNewName[$remap->newName])); + $compressedRemaps[$remap->newName][] = $remap; + continue; + } + + $cleanedOldState = $oldState; + $cleanedNewState = $newState; + + foreach($unchangedStatesByNewName[$remap->newName] as $propertyName){ + unset($cleanedOldState[$propertyName]); + unset($cleanedNewState[$propertyName]); + } + ksort($cleanedOldState); + ksort($cleanedNewState); + + $duplicate = false; + $compressedRemaps[$remap->newName] ??= []; + foreach($compressedRemaps[$remap->newName] as $k => $compressedRemap){ + assert($compressedRemap->oldState !== null && $compressedRemap->newState !== null); + + if( + count($compressedRemap->oldState) !== count($cleanedOldState) || + count($compressedRemap->newState) !== count($cleanedNewState) + ){ + continue; + } + foreach(Utils::stringifyKeys($cleanedOldState) as $propertyName => $propertyValue){ + if(!isset($compressedRemap->oldState[$propertyName]) || !$compressedRemap->oldState[$propertyName]->equals($propertyValue)){ + //different filter value + continue 2; + } + } + foreach(Utils::stringifyKeys($cleanedNewState) as $propertyName => $propertyValue){ + if(!isset($compressedRemap->newState[$propertyName]) || !$compressedRemap->newState[$propertyName]->equals($propertyValue)){ + //different replacement value + continue 2; + } + } + $duplicate = true; + break; + } + if(!$duplicate){ + $compressedRemaps[$remap->newName][] = new BlockStateUpgradeSchemaBlockRemap( + $cleanedOldState, + $remap->newName, + $cleanedNewState, + $unchangedStatesByNewName[$remap->newName] + ); + } + } + + $list = array_merge(...array_values($compressedRemaps)); + + //more specific filters must come before less specific ones, in case of a remap on a certain value which is + //otherwise unchanged + usort($list, function(BlockStateUpgradeSchemaBlockRemap $a, BlockStateUpgradeSchemaBlockRemap $b) : int{ + return count($b->oldState) <=> count($a->oldState); + }); + return $list; +} + /** * @param BlockStateMapping[][] $upgradeTable * @phpstan-param array> $upgradeTable @@ -197,6 +322,7 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad }else{ $logger = \GlobalLogger::get(); $logger->emergency("Mismatched upgraded versions found: $foundVersion and " . $mapping->new->getVersion()); + $logger->emergency("Mismatched old state: " . $mapping->old->toNbt()); $logger->emergency("Mismatched new state: " . $mapping->new->toNbt()); $logger->emergency("This is probably because the game didn't recognize the input blockstate, so it was returned unchanged."); $logger->emergency("This is usually because the block is locked behind an experimental toggle that isn't enabled on the world you used when generating this upgrade table."); @@ -238,12 +364,16 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( $mapping->old->getStates(), $mapping->new->getName(), - $mapping->new->getStates() + $mapping->new->getStates(), + [] ); } } } } + foreach(Utils::stringifyKeys($result->remappedStates) as $oldName => $remap){ + $result->remappedStates[$oldName] = compressRemappedStates($upgradeTable[$oldName], $remap); + } return $result; } From 728e0bc869f93c4d5df1f022db5ff89e8cb9e36d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 20:58:18 +0100 Subject: [PATCH 0934/1858] tools/generate-blockstate-upgrade-schema: allow multi-ID remaps to be processed as regular states if their ID didn't change this allows remappedStates to only deal with stuff that has a different ID, which reduced the size of the 1.12 -> 1.13 schema quite nicely. --- tools/generate-blockstate-upgrade-schema.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 8bb271ddf9..847486a668 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -358,6 +358,15 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); } }else{ + if(isset($newNameFound[$oldName])){ + //some of the states stayed under the same ID - we can process these as normal states + foreach($blockStateMappings as $k => $mapping){ + if($mapping->new->getName() === $oldName){ + processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + unset($blockStateMappings[$k]); + } + } + } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap foreach($blockStateMappings as $mapping){ if(!$mapping->old->equals($mapping->new)){ From 17fe894229c14349841a17c0fe4c7cf545b00203 Mon Sep 17 00:00:00 2001 From: kenzeve <81429197+kenzeve@users.noreply.github.com> Date: Sun, 30 Apr 2023 05:11:07 -0600 Subject: [PATCH 0935/1858] TypeConverter: fixed crash on unknown blockitems (#5729) morton2d_encode is 64-bit function when NBT int tag is 32-bit only, resulting in crash --- src/network/mcpe/convert/TypeConverter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index e4abb42a54..3bbf9c8402 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -188,7 +188,7 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setInt(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeTypeData())); + $nbt->setLong(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeTypeData())); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; } From 5dcd8bf2898b49e43f2cc0e0b35fcabf4de09136 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 13:30:02 +0100 Subject: [PATCH 0936/1858] Bump symfony/filesystem from 5.4.21 to 5.4.23 (#5730) Bumps [symfony/filesystem](https://github.com/symfony/filesystem) from 5.4.21 to 5.4.23. - [Release notes](https://github.com/symfony/filesystem/releases) - [Changelog](https://github.com/symfony/filesystem/blob/6.2/CHANGELOG.md) - [Commits](https://github.com/symfony/filesystem/compare/v5.4.21...v5.4.23) --- updated-dependencies: - dependency-name: symfony/filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index ee994f84a8..bad0235cb7 100644 --- a/composer.lock +++ b/composer.lock @@ -1085,16 +1085,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.21", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" + "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", + "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", "shasum": "" }, "require": { @@ -1129,7 +1129,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.21" + "source": "https://github.com/symfony/filesystem/tree/v5.4.23" }, "funding": [ { @@ -1145,7 +1145,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-03-02T11:38:35+00:00" }, { "name": "symfony/polyfill-ctype", From f04151dbe65a4dce6d844bb674d7cd0716f1ef70 Mon Sep 17 00:00:00 2001 From: Lee Siu San <15855635+leolee3914@users.noreply.github.com> Date: Mon, 1 May 2023 21:08:20 +0800 Subject: [PATCH 0937/1858] README: next-major branch was renamed (#5731) [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f91fdd31d6..fb3a094593 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ * [Building and running from source](BUILDING.md) * [Developer documentation](https://devdoc.pmmp.io) - General documentation for PocketMine-MP plugin developers * [Latest release API documentation](https://apidoc.pmmp.io) - Doxygen API documentation generated for each release - * [Latest bleeding-edge API documentation](https://apidoc-dev.pmmp.io) - Doxygen API documentation generated weekly from `next-major` branch + * [Latest bleeding-edge API documentation](https://apidoc-dev.pmmp.io) - Doxygen API documentation generated weekly from `major-next` branch * [DevTools](https://github.com/pmmp/DevTools/) - Development tools plugin for creating plugins * [ExamplePlugin](https://github.com/pmmp/ExamplePlugin/) - Example plugin demonstrating some basic API features * [Contributing Guidelines](CONTRIBUTING.md) From b3e94ef1dccc7b540057a626122c87f888acda8a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 1 May 2023 14:38:27 +0100 Subject: [PATCH 0938/1858] Chunk: update documentation --- src/world/format/Chunk.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index fd0b83a7b5..1a48205a50 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -88,10 +88,10 @@ class Chunk{ * Returns the internal ID of the blockstate at the given coordinates. * * @param int $x 0-15 - * @param int $y 0-255 + * @param int $y dependent on the height of the world * @param int $z 0-15 * - * @return int bitmap, (id << 4) | meta + * @return int the blockstate ID of the given block */ public function getBlockStateId(int $x, int $y, int $z) : int{ return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBlockStateId($x, $y & SubChunk::COORD_MASK, $z); @@ -111,7 +111,7 @@ class Chunk{ * @param int $x 0-15 * @param int $z 0-15 * - * @return int|null 0-255, or null if there are no blocks in the column + * @return int|null the Y coordinate, or null if there are no blocks in the column */ public function getHighestBlockAt(int $x, int $z) : ?int{ for($y = self::MAX_SUBCHUNK_INDEX; $y >= self::MIN_SUBCHUNK_INDEX; --$y){ @@ -148,9 +148,10 @@ class Chunk{ * Returns the biome ID at the specified X/Z chunk block coordinates * * @param int $x 0-15 + * @param int $y dependent on the height of the world * @param int $z 0-15 * - * @return int 0-255 + * @see BiomeIds */ public function getBiomeId(int $x, int $y, int $z) : int{ return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBiomeArray()->get($x, $y, $z); @@ -160,8 +161,11 @@ class Chunk{ * Sets the biome ID at the specified X/Z chunk block coordinates * * @param int $x 0-15 + * @param int $y dependent on the height of the world * @param int $z 0-15 - * @param int $biomeId 0-255 + * @param int $biomeId A valid biome ID + * + * @see BiomeIds */ public function setBiomeId(int $x, int $y, int $z, int $biomeId) : void{ $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getBiomeArray()->set($x, $y, $z, $biomeId); @@ -213,7 +217,7 @@ class Chunk{ * Returns the tile at the specified chunk block coordinates, or null if no tile exists. * * @param int $x 0-15 - * @param int $y 0-255 + * @param int $y dependent on the height of the world * @param int $z 0-15 */ public function getTile(int $x, int $y, int $z) : ?Tile{ @@ -323,7 +327,7 @@ class Chunk{ * Hashes the given chunk block coordinates into a single integer. * * @param int $x 0-15 - * @param int $y 0-255 + * @param int $y dependent on the height of the world * @param int $z 0-15 */ public static function blockHash(int $x, int $y, int $z) : int{ From 29694c19af6c823e7e5c1ef826427898dd5abf1f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 1 May 2023 14:46:20 +0100 Subject: [PATCH 0939/1858] BlockStateUpgradeSchemaUtils: Use independent suffixes for each property mapping list --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 69 +++++++++++-------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 833b2a05a5..c104b36682 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -34,6 +34,7 @@ use pocketmine\nbt\tag\Tag; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; +use function array_key_last; use function array_map; use function array_values; use function assert; @@ -170,9 +171,7 @@ final class BlockStateUpgradeSchemaUtils{ return; } $dedupMapping = []; - $dedupTable = []; $dedupTableMap = []; - $counter = 0; $orderedRemappedValues = $schema->remappedPropertyValues; ksort($orderedRemappedValues); @@ -185,52 +184,62 @@ final class BlockStateUpgradeSchemaUtils{ } ksort($remappedValuesMap); - foreach(Utils::stringifyKeys($dedupTableMap) as $dedupName => $dedupValuesMap){ - if(count($remappedValuesMap) !== count($dedupValuesMap)){ - continue; - } - - foreach(Utils::stringifyKeys($remappedValuesMap) as $oldHash => $remappedOldNew){ - if( - !isset($dedupValuesMap[$oldHash]) || - !$remappedOldNew->old->equals($dedupValuesMap[$oldHash]->old) || - !$remappedOldNew->new->equals($dedupValuesMap[$oldHash]->new) - ){ - continue 2; + if(isset($dedupTableMap[$propertyName])){ + foreach($dedupTableMap[$propertyName] as $k => $dedupValuesMap){ + if(count($remappedValuesMap) !== count($dedupValuesMap)){ + continue; } - } - //we found a match - $dedupMapping[$blockName][$propertyName] = $dedupName; - continue 2; + foreach(Utils::stringifyKeys($remappedValuesMap) as $oldHash => $remappedOldNew){ + if( + !isset($dedupValuesMap[$oldHash]) || + !$remappedOldNew->old->equals($dedupValuesMap[$oldHash]->old) || + !$remappedOldNew->new->equals($dedupValuesMap[$oldHash]->new) + ){ + continue 2; + } + } + + //we found a match + $dedupMapping[$blockName][$propertyName] = $k; + continue 2; + } } //no match, add the values to the table - $newDedupName = $propertyName . "_" . str_pad(strval($counter++), 2, "0", STR_PAD_LEFT); - $dedupTableMap[$newDedupName] = $remappedValuesMap; - $dedupTable[$newDedupName] = array_values($remappedValuesMap); - $dedupMapping[$blockName][$propertyName] = $newDedupName; + $dedupTableMap[$propertyName][] = $remappedValuesMap; + $dedupMapping[$blockName][$propertyName] = array_key_last($dedupTableMap[$propertyName]); } } $modelTable = []; - foreach(Utils::stringifyKeys($dedupTable) as $dedupName => $valuePairs){ - foreach($valuePairs as $k => $pair){ - $modelTable[$dedupName][$k] = new BlockStateUpgradeSchemaModelValueRemap( - BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->old), - BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->new), - ); + foreach(Utils::stringifyKeys($dedupTableMap) as $propertyName => $mappingSet){ + foreach($mappingSet as $setId => $valuePairs){ + $newDedupName = $propertyName . "_" . str_pad(strval($setId), 2, "0", STR_PAD_LEFT); + foreach($valuePairs as $pair){ + $modelTable[$newDedupName][] = new BlockStateUpgradeSchemaModelValueRemap( + BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->old), + BlockStateUpgradeSchemaUtils::tagToJsonModel($pair->new), + ); + } } } + $modelDedupMapping = []; + foreach(Utils::stringifyKeys($dedupMapping) as $blockName => $properties){ + foreach(Utils::stringifyKeys($properties) as $propertyName => $dedupTableIndex){ + $modelDedupMapping[$blockName][$propertyName] = $propertyName . "_" . str_pad(strval($dedupTableIndex), 2, "0", STR_PAD_LEFT); + } + } + ksort($modelTable); - ksort($dedupMapping); + ksort($modelDedupMapping); foreach(Utils::stringifyKeys($dedupMapping) as $blockName => $properties){ ksort($properties); $dedupMapping[$blockName] = $properties; } $model->remappedPropertyValuesIndex = $modelTable; - $model->remappedPropertyValues = $dedupMapping; + $model->remappedPropertyValues = $modelDedupMapping; } public static function toJsonModel(BlockStateUpgradeSchema $schema) : BlockStateUpgradeSchemaModel{ From 096daef0d0535586274160840d9b2497df43380b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 1 May 2023 16:29:07 +0100 Subject: [PATCH 0940/1858] World: added setDisplayName() this is an obvious use case, and I'm not really sure why it wasn't supported sooner. --- .../world/WorldDisplayNameChangeEvent.php | 48 +++++++++++++++++++ src/world/World.php | 11 +++++ src/world/format/io/WorldData.php | 2 + src/world/format/io/data/BaseNbtWorldData.php | 4 ++ 4 files changed, 65 insertions(+) create mode 100644 src/event/world/WorldDisplayNameChangeEvent.php diff --git a/src/event/world/WorldDisplayNameChangeEvent.php b/src/event/world/WorldDisplayNameChangeEvent.php new file mode 100644 index 0000000000..a3067a1c53 --- /dev/null +++ b/src/event/world/WorldDisplayNameChangeEvent.php @@ -0,0 +1,48 @@ +oldName; + } + + public function getNewName() : string{ + return $this->newName; + } +} diff --git a/src/world/World.php b/src/world/World.php index 52766612f8..f499ccb226 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -51,6 +51,7 @@ use pocketmine\event\world\ChunkLoadEvent; use pocketmine\event\world\ChunkPopulateEvent; use pocketmine\event\world\ChunkUnloadEvent; use pocketmine\event\world\SpawnChangeEvent; +use pocketmine\event\world\WorldDisplayNameChangeEvent; use pocketmine\event\world\WorldParticleEvent; use pocketmine\event\world\WorldSaveEvent; use pocketmine\event\world\WorldSoundEvent; @@ -2971,6 +2972,16 @@ class World implements ChunkManager{ return $this->displayName; } + /** + * Sets the World display name. + */ + public function setDisplayName(string $name) : void{ + (new WorldDisplayNameChangeEvent($this, $this->displayName, $name))->call(); + + $this->displayName = $name; + $this->provider->getWorldData()->setName($name); + } + /** * Returns the World folder name. This will not change at runtime and will be unique to a world per runtime. */ diff --git a/src/world/format/io/WorldData.php b/src/world/format/io/WorldData.php index ba60c1ab8f..18ac9b1bea 100644 --- a/src/world/format/io/WorldData.php +++ b/src/world/format/io/WorldData.php @@ -34,6 +34,8 @@ interface WorldData{ public function getName() : string; + public function setName(string $value) : void; + /** * Returns the generator name */ diff --git a/src/world/format/io/data/BaseNbtWorldData.php b/src/world/format/io/data/BaseNbtWorldData.php index ecd9b483ca..cb3f3eb4bc 100644 --- a/src/world/format/io/data/BaseNbtWorldData.php +++ b/src/world/format/io/data/BaseNbtWorldData.php @@ -116,6 +116,10 @@ abstract class BaseNbtWorldData implements WorldData{ return $this->compoundTag->getString(self::TAG_LEVEL_NAME); } + public function setName(string $value) : void{ + $this->compoundTag->setString(self::TAG_LEVEL_NAME, $value); + } + public function getGenerator() : string{ return $this->compoundTag->getString(self::TAG_GENERATOR_NAME, "DEFAULT"); } From d80f65ae7cdaaa57136e8711745d2ea7029d8189 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 1 May 2023 17:53:08 +0100 Subject: [PATCH 0941/1858] BedrockWorldData: do not load worlds with a newer NetworkVersion than we support often, protocol updates are done without consideration for the current world format version. We don't want to require the world support to be updated at the same time, since this might delay updates. --- src/world/format/io/data/BedrockWorldData.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index c3f0c194c5..48d02cbece 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -156,6 +156,12 @@ class BedrockWorldData extends BaseNbtWorldData{ if($version > self::CURRENT_STORAGE_VERSION){ throw new UnsupportedWorldFormatException("LevelDB world format version $version is currently unsupported"); } + //StorageVersion is rarely updated - instead, the game relies on the NetworkVersion tag, which is synced with + //the network protocol version for that version. + $protocolVersion = $worldData->getInt(self::TAG_NETWORK_VERSION, Limits::INT32_MAX); + if($protocolVersion > self::CURRENT_STORAGE_NETWORK_VERSION){ + throw new UnsupportedWorldFormatException("LevelDB world protocol version $protocolVersion is currently unsupported"); + } return $worldData; } From d0b923484109c1598d3c0af298f5868e8de0ed79 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 1 May 2023 22:29:31 +0100 Subject: [PATCH 0942/1858] SkyLightUpdate: deal with effective light during initial node discovery this allows the propagation stage to ignore effective light, which allows for further optimisations. --- src/world/light/LightUpdate.php | 11 ++--- src/world/light/SkyLightUpdate.php | 75 +++++++++++++++++------------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index d40e68e05c..d4b0213b2e 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -106,9 +106,6 @@ abstract class LightUpdate{ $context->removalQueue->enqueue([$x, $y, $z, $oldLevel]); } } - }elseif($this->getEffectiveLight($x, $y, $z) > 0){ //outside the chunk (e.g. virtual sky light from y=256) - $context->spreadVisited[$blockHash] = true; - $context->spreadQueue->enqueue([$x, $y, $z]); } } return $context; @@ -129,9 +126,6 @@ abstract class LightUpdate{ if($this->subChunkExplorer->moveTo($cx, $cy, $cz) !== SubChunkExplorerStatus::INVALID){ $this->computeRemoveLight($cx, $cy, $cz, $oldAdjacentLight, $context); - }elseif($this->getEffectiveLight($cx, $cy, $cz) > 0 && !isset($context->spreadVisited[$index = World::blockHash($cx, $cy, $cz)])){ - $context->spreadVisited[$index] = true; - $context->spreadQueue->enqueue([$cx, $cy, $cz]); } } } @@ -142,7 +136,10 @@ abstract class LightUpdate{ unset($context->spreadVisited[World::blockHash($x, $y, $z)]); - $newAdjacentLight = $this->getEffectiveLight($x, $y, $z); + if($this->subChunkExplorer->moveTo($x, $y, $z) === SubChunkExplorerStatus::INVALID){ + continue; + } + $newAdjacentLight = $this->getCurrentLightArray()->get($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); if($newAdjacentLight <= 0){ continue; } diff --git a/src/world/light/SkyLightUpdate.php b/src/world/light/SkyLightUpdate.php index 5015634829..783ca11ab8 100644 --- a/src/world/light/SkyLightUpdate.php +++ b/src/world/light/SkyLightUpdate.php @@ -84,16 +84,17 @@ class SkyLightUpdate extends LightUpdate{ $newHeightMap = $oldHeightMap; } - if($newHeightMap > $oldHeightMap){ //Heightmap increase, block placed, remove sky light - for($i = $y; $i >= $oldHeightMap; --$i){ + if($newHeightMap >= $oldHeightMap){ + for($i = $y - 1; $i >= $oldHeightMap; --$i){ $this->setAndUpdateLight($x, $i, $z, 0); //Remove all light beneath, adjacent recalculation will handle the rest. } - }elseif($newHeightMap < $oldHeightMap){ //Heightmap decrease, block changed or removed, add sky light + + //recalculate light for the placed block from its surroundings - this avoids having to check effective light during propagation + $this->setAndUpdateLight($x, $y, $z, max(0, $this->getHighestAdjacentLight($x, $y, $z) - ($this->lightFilters[$source] ?? self::BASE_LIGHT_FILTER))); + }else{ //Heightmap decrease, block changed or removed, add sky light for($i = $y; $i >= $newHeightMap; --$i){ $this->setAndUpdateLight($x, $i, $z, 15); } - }else{ //No heightmap change, block changed "underground" - $this->setAndUpdateLight($x, $y, $z, max(0, $this->getHighestAdjacentLight($x, $y, $z) - ($this->lightFilters[$source] ?? self::BASE_LIGHT_FILTER))); } } @@ -124,35 +125,45 @@ class SkyLightUpdate extends LightUpdate{ for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < Chunk::EDGE_LENGTH; ++$z){ $currentHeight = $chunk->getHeightMap($x, $z); - $maxAdjacentHeight = World::Y_MIN; - if($x !== 0){ - $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x - 1, $z)); - } - if($x !== 15){ - $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x + 1, $z)); - } - if($z !== 0){ - $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x, $z - 1)); - } - if($z !== 15){ - $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x, $z + 1)); - } - /* - * We skip the top two blocks between current height and max adjacent (if there's a difference) because: - * - the block next to the highest adjacent will do nothing during propagation (it's surrounded by 15s) - * - the block below that block will do the same as the node in the highest adjacent - * NOTE: If block opacity becomes direction-aware in the future, the second point will become invalid. - */ - $nodeColumnEnd = max($currentHeight, $maxAdjacentHeight - 2); - - for($y = $currentHeight; $y <= $nodeColumnEnd; $y++){ - $this->setAndUpdateLight($x + $baseX, $y, $z + $baseZ, 15); - $lightSources++; - } - for($y = $nodeColumnEnd + 1, $yMax = $lowestClearSubChunk * SubChunk::EDGE_LENGTH; $y < $yMax; $y++){ + if($currentHeight === World::Y_MAX){ + //this column has a light-filtering block in the top cell - make sure it's lit from above the world + //light from above the world bounds will not be checked during propagation + $y = $currentHeight - 1; if($this->subChunkExplorer->moveTo($x + $baseX, $y, $z + $baseZ) !== SubChunkExplorerStatus::INVALID){ - $this->getCurrentLightArray()->set($x, $y & SubChunk::COORD_MASK, $z, 15); + $block = $this->subChunkExplorer->currentSubChunk->getBlockStateId($x, $y & SubChunk::COORD_MASK, $z); + $this->setAndUpdateLight($x + $baseX, $y, $z + $baseZ, max(0, 15 - ($this->lightFilters[$block] ?? self::BASE_LIGHT_FILTER))); + } + }else{ + $maxAdjacentHeight = World::Y_MIN; + if($x !== 0){ + $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x - 1, $z)); + } + if($x !== 15){ + $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x + 1, $z)); + } + if($z !== 0){ + $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x, $z - 1)); + } + if($z !== 15){ + $maxAdjacentHeight = max($maxAdjacentHeight, $chunk->getHeightMap($x, $z + 1)); + } + + /* + * We skip the top two blocks between current height and max adjacent (if there's a difference) because: + * - the block next to the highest adjacent will do nothing during propagation (it's surrounded by 15s) + * - the block below that block will do the same as the node in the highest adjacent + * NOTE: If block opacity becomes direction-aware in the future, the second point will become invalid. + */ + $nodeColumnEnd = max($currentHeight, $maxAdjacentHeight - 2); + for($y = $currentHeight; $y <= $nodeColumnEnd; $y++){ + $this->setAndUpdateLight($x + $baseX, $y, $z + $baseZ, 15); + $lightSources++; + } + for($y = $nodeColumnEnd + 1, $yMax = $lowestClearSubChunk * SubChunk::EDGE_LENGTH; $y < $yMax; $y++){ + if($this->subChunkExplorer->moveTo($x + $baseX, $y, $z + $baseZ) !== SubChunkExplorerStatus::INVALID){ + $this->getCurrentLightArray()->set($x, $y & SubChunk::COORD_MASK, $z, 15); + } } } } From 3366e1084b74b181cc36676912561f7517c4b386 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 14:05:55 +0100 Subject: [PATCH 0943/1858] LightUpdate: squeeze 10-15% more performance out of propagation we can use SubChunkExplorerStatus to decide whether or not to update the local light array reference. We also dereference some properties into local variables, because dereferencing properties is slow. Indirect property dereferences add an extra performance penalty for every layer. --- src/world/light/LightUpdate.php | 46 +++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index d4b0213b2e..ffbd9b6b44 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -28,6 +28,7 @@ use pocketmine\world\format\SubChunk; use pocketmine\world\utils\SubChunkExplorer; use pocketmine\world\utils\SubChunkExplorerStatus; use pocketmine\world\World; +use function assert; use function max; //TODO: make light updates asynchronous @@ -115,6 +116,9 @@ abstract class LightUpdate{ $context = $this->prepareNodes(); $touched = 0; + $lightArray = null; + $subChunkExplorer = $this->subChunkExplorer; + $subChunkExplorer->invalidate(); while(!$context->removalQueue->isEmpty()){ $touched++; [$x, $y, $z, $oldAdjacentLight] = $context->removalQueue->dequeue(); @@ -124,22 +128,37 @@ abstract class LightUpdate{ $cy = $y + $oy; $cz = $z + $oz; - if($this->subChunkExplorer->moveTo($cx, $cy, $cz) !== SubChunkExplorerStatus::INVALID){ - $this->computeRemoveLight($cx, $cy, $cz, $oldAdjacentLight, $context); + $moveStatus = $subChunkExplorer->moveTo($cx, $cy, $cz); + if($moveStatus === SubChunkExplorerStatus::INVALID){ + continue; } + if($moveStatus === SubChunkExplorerStatus::MOVED){ + $lightArray = $this->getCurrentLightArray(); + } + assert($lightArray !== null); + $this->computeRemoveLight($cx, $cy, $cz, $oldAdjacentLight, $context, $lightArray); } } + $subChunk = null; + $subChunkExplorer->invalidate(); while(!$context->spreadQueue->isEmpty()){ $touched++; [$x, $y, $z] = $context->spreadQueue->dequeue(); unset($context->spreadVisited[World::blockHash($x, $y, $z)]); - if($this->subChunkExplorer->moveTo($x, $y, $z) === SubChunkExplorerStatus::INVALID){ + $moveStatus = $subChunkExplorer->moveTo($x, $y, $z); + if($moveStatus === SubChunkExplorerStatus::INVALID){ continue; } - $newAdjacentLight = $this->getCurrentLightArray()->get($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); + if($moveStatus === SubChunkExplorerStatus::MOVED){ + $subChunk = $subChunkExplorer->currentSubChunk; + $lightArray = $this->getCurrentLightArray(); + } + assert($lightArray !== null); + + $newAdjacentLight = $lightArray->get($x & SubChunk::COORD_MASK, $y & SubChunk::COORD_MASK, $z & SubChunk::COORD_MASK); if($newAdjacentLight <= 0){ continue; } @@ -149,17 +168,23 @@ abstract class LightUpdate{ $cy = $y + $oy; $cz = $z + $oz; - if($this->subChunkExplorer->moveTo($cx, $cy, $cz) !== SubChunkExplorerStatus::INVALID){ - $this->computeSpreadLight($cx, $cy, $cz, $newAdjacentLight, $context); + $moveStatus = $subChunkExplorer->moveTo($cx, $cy, $cz); + if($moveStatus === SubChunkExplorerStatus::INVALID){ + continue; } + if($moveStatus === SubChunkExplorerStatus::MOVED){ + $subChunk = $subChunkExplorer->currentSubChunk; + $lightArray = $this->getCurrentLightArray(); + } + assert($lightArray !== null); + $this->computeSpreadLight($cx, $cy, $cz, $newAdjacentLight, $context, $lightArray, $subChunk); } } return $touched; } - protected function computeRemoveLight(int $x, int $y, int $z, int $oldAdjacentLevel, LightPropagationContext $context) : void{ - $lightArray = $this->getCurrentLightArray(); + protected function computeRemoveLight(int $x, int $y, int $z, int $oldAdjacentLevel, LightPropagationContext $context, LightArray $lightArray) : void{ $lx = $x & SubChunk::COORD_MASK; $ly = $y & SubChunk::COORD_MASK; $lz = $z & SubChunk::COORD_MASK; @@ -182,13 +207,12 @@ abstract class LightUpdate{ } } - protected function computeSpreadLight(int $x, int $y, int $z, int $newAdjacentLevel, LightPropagationContext $context) : void{ - $lightArray = $this->getCurrentLightArray(); + protected function computeSpreadLight(int $x, int $y, int $z, int $newAdjacentLevel, LightPropagationContext $context, LightArray $lightArray, SubChunk $subChunk) : void{ $lx = $x & SubChunk::COORD_MASK; $ly = $y & SubChunk::COORD_MASK; $lz = $z & SubChunk::COORD_MASK; $current = $lightArray->get($lx, $ly, $lz); - $potentialLight = $newAdjacentLevel - ($this->lightFilters[$this->subChunkExplorer->currentSubChunk->getBlockStateId($lx, $ly, $lz)] ?? self::BASE_LIGHT_FILTER); + $potentialLight = $newAdjacentLevel - ($this->lightFilters[$subChunk->getBlockStateId($lx, $ly, $lz)] ?? self::BASE_LIGHT_FILTER); if($current < $potentialLight){ $lightArray->set($lx, $ly, $lz, $potentialLight); From d0d263191db11c2474de88ccb92a205aeb669ea1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 14:21:33 +0100 Subject: [PATCH 0944/1858] Fix build --- src/world/light/LightUpdate.php | 2 +- tests/phpstan/configs/actual-problems.neon | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index ffbd9b6b44..1a82bdcef2 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -176,7 +176,7 @@ abstract class LightUpdate{ $subChunk = $subChunkExplorer->currentSubChunk; $lightArray = $this->getCurrentLightArray(); } - assert($lightArray !== null); + assert($subChunk !== null); $this->computeSpreadLight($cx, $cy, $cz, $newAdjacentLight, $context, $lightArray, $subChunk); } } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 99d24909c3..acbfaef037 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -1160,11 +1160,6 @@ parameters: count: 1 path: ../../../src/world/light/LightPopulationTask.php - - - message: "#^Cannot call method getBlockStateId\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" - count: 1 - path: ../../../src/world/light/LightUpdate.php - - message: "#^Cannot call method getBlockSkyLightArray\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" count: 1 @@ -1172,7 +1167,7 @@ parameters: - message: "#^Cannot call method getBlockStateId\\(\\) on pocketmine\\\\world\\\\format\\\\SubChunk\\|null\\.$#" - count: 1 + count: 2 path: ../../../src/world/light/SkyLightUpdate.php - From f29e2f7110e5490dfb6b0d1639669b100079e787 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 15:41:11 +0100 Subject: [PATCH 0945/1858] WorldProviders now accept Loggers --- src/world/WorldManager.php | 10 ++++++---- src/world/format/io/BaseWorldProvider.php | 3 ++- src/world/format/io/FormatConverter.php | 5 ++--- .../format/io/ReadOnlyWorldProviderManagerEntry.php | 4 ++-- src/world/format/io/WorldProviderManager.php | 8 ++++---- src/world/format/io/WorldProviderManagerEntry.php | 2 +- .../format/io/WritableWorldProviderManagerEntry.php | 6 +++--- src/world/format/io/leveldb/LevelDB.php | 4 ++-- tools/convert-world.php | 2 +- 9 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index 1124d513da..513cb527f7 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -197,7 +197,7 @@ class WorldManager{ $providerClass = array_shift($providers); try{ - $provider = $providerClass->fromPath($path); + $provider = $providerClass->fromPath($path, new \PrefixedLogger($this->server->getLogger(), "World Provider: $name")); }catch(CorruptedWorldException $e){ $this->server->getLogger()->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_level_loadError( $name, @@ -239,8 +239,10 @@ class WorldManager{ } $this->server->getLogger()->notice($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_level_conversion_start($name))); - $converter = new FormatConverter($provider, $this->providerManager->getDefault(), Path::join($this->server->getDataPath(), "backups", "worlds"), $this->server->getLogger()); - $provider = $converter->execute(); + $providerClass = $this->providerManager->getDefault(); + $converter = new FormatConverter($provider, $providerClass, Path::join($this->server->getDataPath(), "backups", "worlds"), $this->server->getLogger()); + $converter->execute(); + $provider = $providerClass->fromPath($path, new \PrefixedLogger($this->server->getLogger(), "World Provider: $name")); $this->server->getLogger()->notice($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_level_conversion_finish($name, $converter->getBackupPath()))); } @@ -270,7 +272,7 @@ class WorldManager{ $path = $this->getWorldPath($name); $providerEntry->generate($path, $name, $options); - $world = new World($this->server, $name, $providerEntry->fromPath($path), $this->server->getAsyncPool()); + $world = new World($this->server, $name, $providerEntry->fromPath($path, new \PrefixedLogger($this->server->getLogger(), "World Provider: $name")), $this->server->getAsyncPool()); $this->worlds[$world->getId()] = $world; $world->setAutoSave($this->autoSave); diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index a1ddb3c8f5..7c881ef84b 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -41,7 +41,8 @@ abstract class BaseWorldProvider implements WorldProvider{ protected BlockStateSerializer $blockStateSerializer; public function __construct( - protected string $path + protected string $path, + protected \Logger $logger ){ if(!file_exists($path)){ throw new WorldException("World does not exist"); diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index 5f93f3a7b8..0a12432da6 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -67,7 +67,7 @@ class FormatConverter{ return $this->backupPath; } - public function execute() : WritableWorldProvider{ + public function execute() : void{ $new = $this->generateNew(); $this->populateLevelData($new->getWorldData()); @@ -91,7 +91,6 @@ class FormatConverter{ } $this->logger->info("Conversion completed"); - return $this->newProvider->fromPath($path); } private function generateNew() : WritableWorldProvider{ @@ -113,7 +112,7 @@ class FormatConverter{ ->setDifficulty($data->getDifficulty()) ); - return $this->newProvider->fromPath($convertedOutput); + return $this->newProvider->fromPath($convertedOutput, $this->logger); } private function populateLevelData(WorldData $data) : void{ diff --git a/src/world/format/io/ReadOnlyWorldProviderManagerEntry.php b/src/world/format/io/ReadOnlyWorldProviderManagerEntry.php index 2bbc11bf3c..b9348179ff 100644 --- a/src/world/format/io/ReadOnlyWorldProviderManagerEntry.php +++ b/src/world/format/io/ReadOnlyWorldProviderManagerEntry.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io; /** - * @phpstan-type FromPath \Closure(string $path) : WorldProvider + * @phpstan-type FromPath \Closure(string $path, \Logger $logger) : WorldProvider */ class ReadOnlyWorldProviderManagerEntry extends WorldProviderManagerEntry{ @@ -36,5 +36,5 @@ class ReadOnlyWorldProviderManagerEntry extends WorldProviderManagerEntry{ parent::__construct($isValid); } - public function fromPath(string $path) : WorldProvider{ return ($this->fromPath)($path); } + public function fromPath(string $path, \Logger $logger) : WorldProvider{ return ($this->fromPath)($path, $logger); } } diff --git a/src/world/format/io/WorldProviderManager.php b/src/world/format/io/WorldProviderManager.php index 45229e213e..8a30bcb575 100644 --- a/src/world/format/io/WorldProviderManager.php +++ b/src/world/format/io/WorldProviderManager.php @@ -41,13 +41,13 @@ final class WorldProviderManager{ private WritableWorldProviderManagerEntry $default; public function __construct(){ - $leveldb = new WritableWorldProviderManagerEntry(\Closure::fromCallable([LevelDB::class, 'isValid']), fn(string $path) => new LevelDB($path), \Closure::fromCallable([LevelDB::class, 'generate'])); + $leveldb = new WritableWorldProviderManagerEntry(\Closure::fromCallable([LevelDB::class, 'isValid']), fn(string $path, \Logger $logger) => new LevelDB($path, $logger), \Closure::fromCallable([LevelDB::class, 'generate'])); $this->default = $leveldb; $this->addProvider($leveldb, "leveldb"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([Anvil::class, 'isValid']), fn(string $path) => new Anvil($path)), "anvil"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([McRegion::class, 'isValid']), fn(string $path) => new McRegion($path)), "mcregion"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([PMAnvil::class, 'isValid']), fn(string $path) => new PMAnvil($path)), "pmanvil"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([Anvil::class, 'isValid']), fn(string $path, \Logger $logger) => new Anvil($path, $logger)), "anvil"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([McRegion::class, 'isValid']), fn(string $path, \Logger $logger) => new McRegion($path, $logger)), "mcregion"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([PMAnvil::class, 'isValid']), fn(string $path, \Logger $logger) => new PMAnvil($path, $logger)), "pmanvil"); } /** diff --git a/src/world/format/io/WorldProviderManagerEntry.php b/src/world/format/io/WorldProviderManagerEntry.php index 96abcd1ea0..c3439fd335 100644 --- a/src/world/format/io/WorldProviderManagerEntry.php +++ b/src/world/format/io/WorldProviderManagerEntry.php @@ -46,5 +46,5 @@ abstract class WorldProviderManagerEntry{ * @throws CorruptedWorldException * @throws UnsupportedWorldFormatException */ - abstract public function fromPath(string $path) : WorldProvider; + abstract public function fromPath(string $path, \Logger $logger) : WorldProvider; } diff --git a/src/world/format/io/WritableWorldProviderManagerEntry.php b/src/world/format/io/WritableWorldProviderManagerEntry.php index 2c5b501edb..873b028317 100644 --- a/src/world/format/io/WritableWorldProviderManagerEntry.php +++ b/src/world/format/io/WritableWorldProviderManagerEntry.php @@ -26,7 +26,7 @@ namespace pocketmine\world\format\io; use pocketmine\world\WorldCreationOptions; /** - * @phpstan-type FromPath \Closure(string $path) : WritableWorldProvider + * @phpstan-type FromPath \Closure(string $path, \Logger $logger) : WritableWorldProvider * @phpstan-type Generate \Closure(string $path, string $name, WorldCreationOptions $options) : void */ final class WritableWorldProviderManagerEntry extends WorldProviderManagerEntry{ @@ -43,8 +43,8 @@ final class WritableWorldProviderManagerEntry extends WorldProviderManagerEntry{ parent::__construct($isValid); } - public function fromPath(string $path) : WritableWorldProvider{ - return ($this->fromPath)($path); + public function fromPath(string $path, \Logger $logger) : WritableWorldProvider{ + return ($this->fromPath)($path, $logger); } /** diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index fa38bf4b83..e6ba569cc0 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -102,9 +102,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ ]); } - public function __construct(string $path){ + public function __construct(string $path, \Logger $logger){ self::checkForLevelDBExtension(); - parent::__construct($path); + parent::__construct($path, $logger); try{ $this->db = self::createDB($path); diff --git a/tools/convert-world.php b/tools/convert-world.php index b079a75425..75483c6af3 100644 --- a/tools/convert-world.php +++ b/tools/convert-world.php @@ -74,7 +74,7 @@ if(count($oldProviderClasses) > 1){ exit(1); } $oldProviderClass = array_shift($oldProviderClasses); -$oldProvider = $oldProviderClass->fromPath($inputPath); +$oldProvider = $oldProviderClass->fromPath($inputPath, new \PrefixedLogger(\GlobalLogger::get(), "Old World Provider")); $converter = new FormatConverter($oldProvider, $writableFormats[$args["format"]], $backupPath, GlobalLogger::get()); $converter->execute(); From 5fcf5e0c4077daf58670175e2ea4c584c9e8bf02 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 16:46:45 +0100 Subject: [PATCH 0946/1858] LevelDB: log more stuff, stop bailing on recoverable errors --- .../block/upgrade/BlockDataUpgrader.php | 21 ++-- .../block/upgrade/BlockIdMetaUpgrader.php | 17 ++- src/world/format/io/leveldb/LevelDB.php | 114 +++++++++++------- 3 files changed, 98 insertions(+), 54 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php index ad73cc98a5..4b6c6abc42 100644 --- a/src/data/bedrock/block/upgrade/BlockDataUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockDataUpgrader.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\data\bedrock\block\BlockTypeNames; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\nbt\tag\CompoundTag; final class BlockDataUpgrader{ @@ -34,25 +34,30 @@ final class BlockDataUpgrader{ private BlockStateUpgrader $blockStateUpgrader ){} - public function upgradeIntIdMeta(int $id, int $meta) : ?BlockStateData{ + /** + * @throws BlockStateDeserializeException + */ + public function upgradeIntIdMeta(int $id, int $meta) : BlockStateData{ return $this->blockIdMetaUpgrader->fromIntIdMeta($id, $meta); } - public function upgradeStringIdMeta(string $id, int $meta) : ?BlockStateData{ + /** + * @throws BlockStateDeserializeException + */ + public function upgradeStringIdMeta(string $id, int $meta) : BlockStateData{ return $this->blockIdMetaUpgrader->fromStringIdMeta($id, $meta); } - public function upgradeBlockStateNbt(CompoundTag $tag) : ?BlockStateData{ + /** + * @throws BlockStateDeserializeException + */ + public function upgradeBlockStateNbt(CompoundTag $tag) : BlockStateData{ if($tag->getTag("name") !== null && $tag->getTag("val") !== null){ //Legacy (pre-1.13) blockstate - upgrade it to a version we understand $id = $tag->getString("name"); $data = $tag->getShort("val"); $blockStateData = $this->upgradeStringIdMeta($id, $data); - if($blockStateData === null){ - //unknown block, invalid ID - $blockStateData = BlockStateData::current(BlockTypeNames::INFO_UPDATE, []); - } }else{ //Modern (post-1.13) blockstate $blockStateData = BlockStateData::fromNbt($tag); diff --git a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php index 972362b86b..1c339bd46c 100644 --- a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; @@ -41,14 +42,22 @@ final class BlockIdMetaUpgrader{ private LegacyBlockIdToStringIdMap $legacyNumericIdMap ){} - public function fromStringIdMeta(string $id, int $meta) : ?BlockStateData{ - return $this->mappingTable[$id][$meta] ?? $this->mappingTable[$id][0] ?? null; + /** + * @throws BlockStateDeserializeException + */ + public function fromStringIdMeta(string $id, int $meta) : BlockStateData{ + return $this->mappingTable[$id][$meta] ?? + $this->mappingTable[$id][0] ?? + throw new BlockStateDeserializeException("Unknown legacy block string ID $id"); } - public function fromIntIdMeta(int $id, int $meta) : ?BlockStateData{ + /** + * @throws BlockStateDeserializeException + */ + public function fromIntIdMeta(int $id, int $meta) : BlockStateData{ $stringId = $this->legacyNumericIdMap->legacyToString($id); if($stringId === null){ - return null; + throw new BlockStateDeserializeException("Unknown legacy block numeric ID $id"); } return $this->fromStringIdMeta($stringId, $meta); } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index e6ba569cc0..a94a710bbb 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -29,7 +29,6 @@ use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; -use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\TreeRoot; use pocketmine\utils\Binary; @@ -144,7 +143,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** * @throws CorruptedChunkException */ - protected function deserializeBlockPalette(BinaryStream $stream) : PalettedBlockArray{ + protected function deserializeBlockPalette(BinaryStream $stream, \Logger $logger) : PalettedBlockArray{ $bitsPerBlock = $stream->getByte() >> 1; try{ @@ -160,25 +159,28 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ for($i = 0; $i < $paletteSize; ++$i){ try{ $offset = $stream->getOffset(); - $blockStateNbt = $nbt->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); - $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); - if($blockStateData === null){ - //upgrading blockstates should always succeed, regardless of whether they've been implemented or not - throw new BlockStateDeserializeException("Invalid or improperly mapped legacy blockstate: " . $blockStateNbt->toString()); - } $stream->setOffset($offset); - - try{ - $palette[] = $this->blockStateDeserializer->deserialize($blockStateData); - }catch(BlockStateDeserializeException){ - //TODO: remember data for unknown states so we can implement them later - //TODO: log this - $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); - } - }catch(NbtException | BlockStateDeserializeException $e){ + }catch(NbtDataException $e){ + //NBT borked, unrecoverable throw new CorruptedChunkException("Invalid blockstate NBT at offset $i in paletted storage: " . $e->getMessage(), 0, $e); } + + //TODO: remember data for unknown states so we can implement them later + try{ + $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + }catch(BlockStateDeserializeException $e){ + //while not ideal, this is not a fatal error + $logger->error("Failed to upgrade blockstate: " . $e->getMessage() . " offset $i in palette, blockstate NBT: " . $blockStateNbt->toString()); + $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); + continue; + } + try{ + $palette[] = $this->blockStateDeserializer->deserialize($blockStateData); + }catch(BlockStateDeserializeException $e){ + $logger->error("Failed to deserialize blockstate: " . $e->getMessage() . " offset $i in palette, blockstate NBT: " . $blockStateNbt->toString()); + $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); + } } //TODO: exceptions @@ -253,7 +255,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ * @return PalettedBlockArray[] * @phpstan-return array */ - private static function deserialize3dBiomes(BinaryStream $stream, int $chunkVersion) : array{ + private static function deserialize3dBiomes(BinaryStream $stream, int $chunkVersion, \Logger $logger) : array{ $previous = null; $result = []; $nextIndex = Chunk::MIN_SUBCHUNK_INDEX; @@ -279,7 +281,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } } if(!$stream->feof()){ - throw new CorruptedChunkException("3D biomes data contains extra unread data"); + //maybe bad output produced by a third-party conversion tool like Chunker + $logger->error("Unexpected trailing data after 3D biomes data"); } return $result; @@ -314,7 +317,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** * @return PalettedBlockArray[] */ - protected function deserializeLegacyExtraData(string $index, int $chunkVersion) : array{ + protected function deserializeLegacyExtraData(string $index, int $chunkVersion, \Logger $logger) : array{ if(($extraRawData = $this->db->get($index . ChunkDataKey::LEGACY_BLOCK_EXTRA_DATA)) === false || $extraRawData === ""){ return []; } @@ -335,12 +338,15 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockId = $value & 0xff; $blockData = ($value >> 8) & 0xf; - $blockStateData = $this->blockDataUpgrader->upgradeIntIdMeta($blockId, $blockData); - if($blockStateData === null){ + try{ + $blockStateData = $this->blockDataUpgrader->upgradeIntIdMeta($blockId, $blockData); + }catch(BlockStateDeserializeException $e){ //TODO: we could preserve this in case it's supported in the future, but this was historically only //used for grass anyway, so we probably don't need to care + $logger->error("Failed to upgrade legacy extra block: " . $e->getMessage() . " ($blockId:$blockData)"); continue; } + //assume this won't throw $blockStateId = $this->blockStateDeserializer->deserialize($blockStateData); if(!isset($extraDataLayers[$ySub])){ @@ -372,8 +378,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ * @phpstan-return array * @throws CorruptedWorldException */ - private function deserializeLegacyTerrainData(string $index, int $chunkVersion) : array{ - $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); + private function deserializeLegacyTerrainData(string $index, int $chunkVersion, \Logger $logger) : array{ + $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion, $logger); $legacyTerrain = $this->db->get($index . ChunkDataKey::LEGACY_TERRAIN); if($legacyTerrain === false){ @@ -396,6 +402,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ }catch(BinaryDataException $e){ throw new CorruptedChunkException($e->getMessage(), 0, $e); } + if(!$binaryStream->feof()){ + $logger->error("Unexpected trailing data in legacy terrain data"); + } $subChunks = []; for($yy = 0; $yy < 8; ++$yy){ @@ -419,18 +428,25 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** * Deserializes a subchunk stored in the legacy non-paletted format used from 1.0 until 1.2.13. */ - private function deserializeNonPalettedSubChunkData(BinaryStream $binaryStream, int $chunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette) : SubChunk{ + private function deserializeNonPalettedSubChunkData(BinaryStream $binaryStream, int $chunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette, \Logger $logger) : SubChunk{ try{ $blocks = $binaryStream->get(4096); $blockData = $binaryStream->get(2048); - - if($chunkVersion < ChunkVersion::v1_1_0){ - $binaryStream->get(4096); //legacy light info, discard it - } }catch(BinaryDataException $e){ throw new CorruptedChunkException($e->getMessage(), 0, $e); } + if($chunkVersion < ChunkVersion::v1_1_0){ + try{ + $binaryStream->get(4096); //legacy light info, discard it + if(!$binaryStream->feof()){ + $logger->error("Unexpected trailing data in legacy subchunk data"); + } + }catch(BinaryDataException $e){ + $logger->error("Failed to read legacy subchunk light info: " . $e->getMessage()); + } + } + $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData)]; if($convertedLegacyExtraData !== null){ $storages[] = $convertedLegacyExtraData; @@ -445,7 +461,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ * @see ChunkDataKey::SUBCHUNK * @throws CorruptedChunkException */ - private function deserializeSubChunkData(BinaryStream $binaryStream, int $chunkVersion, int $subChunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette) : SubChunk{ + private function deserializeSubChunkData(BinaryStream $binaryStream, int $chunkVersion, int $subChunkVersion, ?PalettedBlockArray $convertedLegacyExtraData, PalettedBlockArray $biomePalette, \Logger $logger) : SubChunk{ switch($subChunkVersion){ case SubChunkVersion::CLASSIC: case SubChunkVersion::CLASSIC_BUG_2: //these are all identical to version 0, but vanilla respects these so we should also @@ -454,9 +470,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ case SubChunkVersion::CLASSIC_BUG_5: case SubChunkVersion::CLASSIC_BUG_6: case SubChunkVersion::CLASSIC_BUG_7: - return $this->deserializeNonPalettedSubChunkData($binaryStream, $chunkVersion, $convertedLegacyExtraData, $biomePalette); + return $this->deserializeNonPalettedSubChunkData($binaryStream, $chunkVersion, $convertedLegacyExtraData, $biomePalette, $logger); case SubChunkVersion::PALETTED_SINGLE: - $storages = [$this->deserializeBlockPalette($binaryStream)]; + $storages = [$this->deserializeBlockPalette($binaryStream, $logger)]; if($convertedLegacyExtraData !== null){ $storages[] = $convertedLegacyExtraData; } @@ -473,11 +489,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $storages = []; for($k = 0; $k < $storageCount; ++$k){ - $storages[] = $this->deserializeBlockPalette($binaryStream); + $storages[] = $this->deserializeBlockPalette($binaryStream, $logger); } return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); default: - //TODO: set chunks read-only so the version on disk doesn't get overwritten + //this should never happen - an unsupported chunk appearing in a supported world is a sign of corruption throw new CorruptedChunkException("don't know how to decode LevelDB subchunk format version $subChunkVersion"); } } @@ -499,7 +515,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ * @return SubChunk[] * @phpstan-return array */ - private function deserializeAllSubChunkData(string $index, int $chunkVersion, bool &$hasBeenUpgraded, array $convertedLegacyExtraData, array $biomeArrays) : array{ + private function deserializeAllSubChunkData(string $index, int $chunkVersion, bool &$hasBeenUpgraded, array $convertedLegacyExtraData, array $biomeArrays, \Logger $logger) : array{ $subChunks = []; $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; @@ -518,7 +534,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $hasBeenUpgraded = true; } - $subChunks[$y] = $this->deserializeSubChunkData($binaryStream, $chunkVersion, $subChunkVersion, $convertedLegacyExtraData[$y] ?? null, $biomeArrays[$y]); + $subChunks[$y] = $this->deserializeSubChunkData( + $binaryStream, + $chunkVersion, + $subChunkVersion, + $convertedLegacyExtraData[$y] ?? null, + $biomeArrays[$y], + new \PrefixedLogger($logger, "Subchunk y=$y v$subChunkVersion") + ); } return $subChunks; @@ -530,7 +553,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ * @return PalettedBlockArray[] * @phpstan-return array */ - private function deserializeBiomeData(string $index, int $chunkVersion) : array{ + private function deserializeBiomeData(string $index, int $chunkVersion, \Logger $logger) : array{ $biomeArrays = []; if(($maps2d = $this->db->get($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES)) !== false){ $binaryStream = new BinaryStream($maps2d); @@ -538,6 +561,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ try{ $binaryStream->get(512); //heightmap, discard it $biomes3d = ChunkUtils::extrapolate3DBiomes($binaryStream->get(256)); //never throws + if(!$binaryStream->feof()){ + $logger->error("Unexpected trailing data after 2D biome data"); + } }catch(BinaryDataException $e){ throw new CorruptedChunkException($e->getMessage(), 0, $e); } @@ -549,11 +575,12 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ try{ $binaryStream->get(512); - $biomeArrays = self::deserialize3dBiomes($binaryStream, $chunkVersion); + $biomeArrays = self::deserialize3dBiomes($binaryStream, $chunkVersion, $logger); }catch(BinaryDataException $e){ throw new CorruptedChunkException($e->getMessage(), 0, $e); } }else{ + $logger->error("Missing biome data, using default ocean biome"); for($i = Chunk::MIN_SUBCHUNK_INDEX; $i <= Chunk::MAX_SUBCHUNK_INDEX; ++$i){ $biomeArrays[$i] = new PalettedBlockArray(BiomeIds::OCEAN); //polyfill } @@ -574,6 +601,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return null; } + $logger = new \PrefixedLogger($this->logger, "Loading chunk x=$chunkX z=$chunkZ v$chunkVersion"); + $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; switch($chunkVersion){ @@ -617,14 +646,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ case ChunkVersion::v1_1_0: //TODO: check beds case ChunkVersion::v1_0_0: - $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion); - $biomeArrays = $this->deserializeBiomeData($index, $chunkVersion); - $subChunks = $this->deserializeAllSubChunkData($index, $chunkVersion, $hasBeenUpgraded, $convertedLegacyExtraData, $biomeArrays); + $convertedLegacyExtraData = $this->deserializeLegacyExtraData($index, $chunkVersion, $logger); + $biomeArrays = $this->deserializeBiomeData($index, $chunkVersion, $logger); + $subChunks = $this->deserializeAllSubChunkData($index, $chunkVersion, $hasBeenUpgraded, $convertedLegacyExtraData, $biomeArrays, $logger); break; case ChunkVersion::v0_9_5: case ChunkVersion::v0_9_2: case ChunkVersion::v0_9_0: - $subChunks = $this->deserializeLegacyTerrainData($index, $chunkVersion); + $subChunks = $this->deserializeLegacyTerrainData($index, $chunkVersion, $logger); break; default: throw new CorruptedChunkException("don't know how to decode chunk format version $chunkVersion"); @@ -668,6 +697,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ ); if($hasBeenUpgraded){ + $logger->debug("Flagging chunk as dirty due to upgraded data"); $chunk->setTerrainDirty(); //trigger rewriting chunk to disk if it was converted from an older format } From 4d0cecbac2991b12ee56d9ff6a5400c48c863e30 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 16:47:25 +0100 Subject: [PATCH 0947/1858] RegionWorldProvider: use provider logger instead of global logger --- src/world/format/io/region/RegionWorldProvider.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index ae3afc274d..a5b6f54f7f 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -118,12 +118,11 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ try{ $this->regions[$index] = RegionLoader::loadExisting($path); }catch(CorruptedRegionException $e){ - $logger = \GlobalLogger::get(); - $logger->error("Corrupted region file detected: " . $e->getMessage()); + $this->logger->error("Corrupted region file detected: " . $e->getMessage()); $backupPath = $path . ".bak." . time(); rename($path, $backupPath); - $logger->error("Corrupted region file has been backed up to " . $backupPath); + $this->logger->error("Corrupted region file has been backed up to " . $backupPath); $this->regions[$index] = RegionLoader::createNew($path); } From 6beb80b8fe489b0deb34c1b5ec5e519969a45285 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 May 2023 17:13:31 +0100 Subject: [PATCH 0948/1858] Fixed usages of BlockDataUpgrader which weren't accounting for thrown exceptions --- src/block/tile/FlowerPot.php | 6 +++++- .../bedrock/item/upgrade/ItemDataUpgrader.php | 20 ++++++++++++++----- src/entity/object/FallingBlock.php | 15 +++++++++----- src/world/World.php | 8 +++++--- src/world/format/io/BaseWorldProvider.php | 7 ++++--- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index d6c2c58fb9..3f1d4ff2e6 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -52,7 +52,11 @@ class FlowerPot extends Spawnable{ $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); if(($itemIdTag = $nbt->getTag(self::TAG_ITEM)) instanceof ShortTag && ($itemMetaTag = $nbt->getTag(self::TAG_ITEM_DATA)) instanceof IntTag){ - $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue()); + try{ + $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue()); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Error loading legacy flower pot item data: " . $e->getMessage(), 0, $e); + } }elseif(($plantBlockTag = $nbt->getCompoundTag(self::TAG_PLANT_BLOCK)) !== null){ try{ $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($plantBlockTag); diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 46fce81cea..249b257e27 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item\upgrade; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\data\bedrock\item\SavedItemStackData; @@ -57,7 +58,11 @@ final class ItemDataUpgrader{ */ public function upgradeItemTypeDataString(string $rawNameId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ if(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){ - $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + try{ + $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Failed to deserialize blockstate for legacy blockitem: " . $e->getMessage(), 0, $e); + } }else{ //probably a standard item $blockStateData = null; @@ -124,12 +129,17 @@ final class ItemDataUpgrader{ $blockStateNbt = $tag->getCompoundTag(SavedItemData::TAG_BLOCK); if($blockStateNbt !== null){ - $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + try{ + $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Failed to deserialize blockstate for blockitem: " . $e->getMessage(), 0, $e); + } }elseif(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){ //this is a legacy blockitem represented by ID + meta - $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); - if($blockStateData === null){ - throw new SavedDataLoadingException("Expected a blockstate to be associated with this block"); + try{ + $blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Failed to deserialize blockstate for legacy blockitem: " . $e->getMessage(), 0, $e); } }else{ //probably a standard item diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 0371ec9501..8c2b1d5e6c 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -75,7 +75,11 @@ class FallingBlock extends Entity{ //TODO: 1.8+ save format $blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){ - $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag); + try{ + $blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Invalid falling block blockstate: " . $e->getMessage(), 0, $e); + } }else{ if(($tileIdTag = $nbt->getTag(self::TAG_TILE_ID)) instanceof IntTag){ $blockId = $tileIdTag->getValue(); @@ -86,10 +90,11 @@ class FallingBlock extends Entity{ } $damage = $nbt->getByte(self::TAG_DATA, 0); - $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage); - } - if($blockStateData === null){ - throw new SavedDataLoadingException("Invalid legacy falling block"); + try{ + $blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage); + }catch(BlockStateDeserializeException $e){ + throw new SavedDataLoadingException("Invalid legacy falling block data: " . $e->getMessage(), 0, $e); + } } try{ diff --git a/src/world/World.php b/src/world/World.php index f499ccb226..a9798fb8a4 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -37,6 +37,7 @@ use pocketmine\block\UnknownBlock; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\EntityFactory; @@ -526,9 +527,10 @@ class World implements ChunkManager{ if($item !== null){ $block = $item->getBlock(); }elseif(preg_match("/^-?\d+$/", $name) === 1){ - //TODO: this may throw if the ID/meta was invalid - $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta((int) $name, 0); - if($blockStateData === null){ + //TODO: this is a really sketchy hack - remove this as soon as possible + try{ + $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta((int) $name, 0); + }catch(BlockStateDeserializeException){ continue; } $block = RuntimeBlockStateRegistry::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index 7c881ef84b..a4d8651a67 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -67,9 +67,10 @@ abstract class BaseWorldProvider implements WorldProvider{ $newPalette = []; foreach($palette as $k => $legacyIdMeta){ - $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); - if($newStateData === null){ - //TODO: remember data for unknown states so we can implement them later + //TODO: remember data for unknown states so we can implement them later + try{ + $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); + }catch(BlockStateDeserializeException $e){ $newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData(); } From 5e462db0f8b7eb57e09ec5e5fe719efe2f9d5021 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 13:36:24 +0100 Subject: [PATCH 0949/1858] Move MOTD game mode stringifying to RakLibInterface since this is contextless (there's no way to know the version of the client requesting the MOTD), we can safely assume that this is not going to vary between protocol versions. --- src/network/mcpe/convert/TypeConverter.php | 8 -------- src/network/mcpe/raklib/RakLibInterface.php | 8 ++++++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 3bbf9c8402..634f8ee0cb 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -79,14 +79,6 @@ class TypeConverter{ } } - public function protocolGameModeName(GameMode $gameMode) : string{ - switch($gameMode->id()){ - case GameMode::SURVIVAL()->id(): return "Survival"; - case GameMode::ADVENTURE()->id(): return "Adventure"; - default: return "Creative"; - } - } - public function protocolGameModeToCore(int $gameMode) : ?GameMode{ switch($gameMode){ case ProtocolGameMode::SURVIVAL: diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index f63099e8ab..82d881239b 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe\raklib; use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; @@ -36,6 +35,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; +use pocketmine\player\GameMode; use pocketmine\Server; use pocketmine\snooze\SleeperNotifier; use pocketmine\timings\Timings; @@ -255,7 +255,11 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $info->getMaxPlayerCount(), $this->rakServerId, $this->server->getName(), - TypeConverter::getInstance()->protocolGameModeName($this->server->getGamemode()) + match($this->server->getGamemode()){ + GameMode::SURVIVAL() => "Survival", + GameMode::ADVENTURE() => "Adventure", + default => "Creative" + } ]) . ";" ); } From 01f340985a52b1fb05e677eb9b527e9fb410aad2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 16:33:17 +0100 Subject: [PATCH 0950/1858] Centralize all conversion-related stuff under TypeConverter instead of having singletons for everything, which are a nightmare to manage for multi version --- src/Server.php | 4 +- src/block/tile/FlowerPot.php | 4 +- src/block/tile/ItemFrame.php | 4 +- src/block/tile/Jukebox.php | 4 +- src/block/tile/Lectern.php | 4 +- .../animation/ConsumingItemAnimation.php | 4 +- src/entity/object/FallingBlock.php | 4 +- src/network/mcpe/ChunkRequestTask.php | 8 +-- src/network/mcpe/cache/CraftingDataCache.php | 3 +- .../mcpe/convert/GlobalItemTypeDictionary.php | 45 --------------- src/network/mcpe/convert/ItemTranslator.php | 13 ----- .../mcpe/convert/RuntimeBlockMapping.php | 15 ----- src/network/mcpe/convert/TypeConverter.php | 56 +++++++++++++++---- .../mcpe/handler/PreSpawnPacketHandler.php | 3 +- src/world/World.php | 4 +- src/world/particle/BlockBreakParticle.php | 4 +- src/world/particle/BlockPunchParticle.php | 4 +- src/world/particle/FloatingTextParticle.php | 4 +- src/world/particle/ItemBreakParticle.php | 4 +- src/world/particle/TerrainParticle.php | 4 +- src/world/sound/BlockBreakSound.php | 4 +- src/world/sound/BlockPlaceSound.php | 4 +- src/world/sound/BlockPunchSound.php | 4 +- src/world/sound/EntityLandSound.php | 4 +- src/world/sound/ItemUseOnBlockSound.php | 4 +- .../mcpe/convert/RuntimeBlockMappingTest.php | 3 +- 26 files changed, 88 insertions(+), 130 deletions(-) delete mode 100644 src/network/mcpe/convert/GlobalItemTypeDictionary.php diff --git a/src/Server.php b/src/Server.php index 5bda2976b2..7bc67aa380 100644 --- a/src/Server.php +++ b/src/Server.php @@ -53,7 +53,7 @@ use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\CompressBatchTask; use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\ZlibCompressor; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\encryption\EncryptionContext; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; @@ -1204,7 +1204,7 @@ class Server{ private function startupPrepareNetworkInterfaces() : bool{ $useQuery = $this->configGroup->getConfigBool("enable-query", true); - $packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); + $packetSerializerContext = new PacketSerializerContext(TypeConverter::getInstance()->getItemTypeDictionary()); $packetBroadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster); diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 3f1d4ff2e6..9a05a8cd00 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -33,7 +33,7 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ShortTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\world\format\io\GlobalBlockStateHandlers; /** @@ -95,7 +95,7 @@ class FlowerPot extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setTag(self::TAG_PLANT_BLOCK, RuntimeBlockMapping::getInstance()->toStateData($this->plant->getStateId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->toStateData($this->plant->getStateId())->toNbt()); } } diff --git a/src/block/tile/ItemFrame.php b/src/block/tile/ItemFrame.php index 7482fa0899..faf0ddbb69 100644 --- a/src/block/tile/ItemFrame.php +++ b/src/block/tile/ItemFrame.php @@ -27,7 +27,7 @@ use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\world\World; /** @@ -100,7 +100,7 @@ class ItemFrame extends Spawnable{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); if(!$this->item->isNull()){ - $nbt->setTag(self::TAG_ITEM, ItemTranslator::getInstance()->toNetworkNbt($this->item)); + $nbt->setTag(self::TAG_ITEM, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->item)); } } } diff --git a/src/block/tile/Jukebox.php b/src/block/tile/Jukebox.php index 12dd3c3028..a94072bb19 100644 --- a/src/block/tile/Jukebox.php +++ b/src/block/tile/Jukebox.php @@ -26,7 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\Record; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; class Jukebox extends Spawnable{ private const TAG_RECORD = "RecordItem"; //Item CompoundTag @@ -59,7 +59,7 @@ class Jukebox extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ //this is needed for the note particles to show on the client side if($this->record !== null){ - $nbt->setTag(self::TAG_RECORD, ItemTranslator::getInstance()->toNetworkNbt($this->record)); + $nbt->setTag(self::TAG_RECORD, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->record)); } } } diff --git a/src/block/tile/Lectern.php b/src/block/tile/Lectern.php index f094d23161..37e79b10e6 100644 --- a/src/block/tile/Lectern.php +++ b/src/block/tile/Lectern.php @@ -26,7 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use function count; /** @@ -81,7 +81,7 @@ class Lectern extends Spawnable{ $nbt->setByte(self::TAG_HAS_BOOK, $this->book !== null ? 1 : 0); $nbt->setInt(self::TAG_PAGE, $this->viewedPage); if($this->book !== null){ - $nbt->setTag(self::TAG_BOOK, ItemTranslator::getInstance()->toNetworkNbt($this->book)); + $nbt->setTag(self::TAG_BOOK, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->book)); $nbt->setInt(self::TAG_TOTAL_PAGES, count($this->book->getPages())); } } diff --git a/src/entity/animation/ConsumingItemAnimation.php b/src/entity/animation/ConsumingItemAnimation.php index 99048abcb1..aa6152a57e 100644 --- a/src/entity/animation/ConsumingItemAnimation.php +++ b/src/entity/animation/ConsumingItemAnimation.php @@ -25,7 +25,7 @@ namespace pocketmine\entity\animation; use pocketmine\entity\Human; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ActorEventPacket; use pocketmine\network\mcpe\protocol\types\ActorEvent; @@ -37,7 +37,7 @@ final class ConsumingItemAnimation implements Animation{ ){} public function encode() : array{ - [$netId, $netData] = ItemTranslator::getInstance()->toNetworkId($this->item); + [$netId, $netData] = TypeConverter::getInstance()->getItemTranslator()->toNetworkId($this->item); return [ //TODO: need to check the data values ActorEventPacket::create($this->human->getId(), ActorEvent::EATING_ITEM, ($netId << 16) | $netData) diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 8c2b1d5e6c..10f53fc5df 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -39,7 +39,7 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; @@ -197,7 +197,7 @@ class FallingBlock extends Entity{ protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); - $properties->setInt(EntityMetadataProperties::VARIANT, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId())); + $properties->setInt(EntityMetadataProperties::VARIANT, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId())); } public function getOffsetPosition(Vector3 $vector3) : Vector3{ diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index fe30126ae0..0f8f60fe67 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -25,8 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\Compressor; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelChunkPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; @@ -67,8 +66,9 @@ class ChunkRequestTask extends AsyncTask{ public function onRun() : void{ $chunk = FastChunkSerializer::deserializeTerrain($this->chunk); $subCount = ChunkSerializer::getSubChunkCount($chunk); - $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); - $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); + $converter = TypeConverter::getInstance(); + $encoderContext = new PacketSerializerContext($converter->getItemTypeDictionary()); + $payload = ChunkSerializer::serializeFullChunk($chunk, $converter->getBlockTranslator(), $encoderContext, $this->tiles); $stream = new BinaryStream(); PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload)]); diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 9b70d00c97..e6ac6167b5 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -30,7 +30,6 @@ use pocketmine\crafting\ShapedRecipe; use pocketmine\crafting\ShapelessRecipe; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\CraftingDataPacket; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; @@ -173,7 +172,7 @@ final class CraftingDataCache{ } $potionContainerChangeRecipes = []; - $itemTypeDictionary = GlobalItemTypeDictionary::getInstance()->getDictionary(); + $itemTypeDictionary = TypeConverter::getInstance()->getItemTypeDictionary(); foreach($manager->getPotionContainerChangeRecipes() as $recipe){ $input = $itemTypeDictionary->fromStringId($recipe->getInputItemId()); $ingredient = $converter->coreRecipeIngredientToNet($recipe->getIngredient())->getDescriptor(); diff --git a/src/network/mcpe/convert/GlobalItemTypeDictionary.php b/src/network/mcpe/convert/GlobalItemTypeDictionary.php deleted file mode 100644 index 0369a9e780..0000000000 --- a/src/network/mcpe/convert/GlobalItemTypeDictionary.php +++ /dev/null @@ -1,45 +0,0 @@ -dictionary; } -} diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 13a9bad4f9..6309d774c4 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -32,8 +32,6 @@ use pocketmine\item\Item; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalItemDataHandlers; /** * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. @@ -41,17 +39,6 @@ use pocketmine\world\format\io\GlobalItemDataHandlers; final class ItemTranslator{ public const NO_BLOCK_RUNTIME_ID = 0; - use SingletonTrait; - - private static function make() : self{ - return new self( - GlobalItemTypeDictionary::getInstance()->getDictionary(), - RuntimeBlockMapping::getInstance()->getBlockStateDictionary(), - GlobalItemDataHandlers::getSerializer(), - GlobalItemDataHandlers::getDeserializer() - ); - } - public function __construct( private ItemTypeDictionary $itemTypeDictionary, private BlockStateDictionary $blockStateDictionary, diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 3d8fc831de..4df98f15cc 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -23,22 +23,16 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\Filesystem; -use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalBlockStateHandlers; /** * @internal */ final class RuntimeBlockMapping{ - use SingletonTrait; - /** * @var int[] * @phpstan-var array @@ -49,15 +43,6 @@ final class RuntimeBlockMapping{ private BlockStateData $fallbackStateData; private int $fallbackStateId; - private static function make() : self{ - $canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT); - $metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON); - return new self( - BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), - GlobalBlockStateHandlers::getSerializer() - ); - } - public function __construct( private BlockStateDictionary $blockStateDictionary, private BlockStateSerializer $blockStateSerializer diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 634f8ee0cb..ad9f631eed 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -28,11 +28,13 @@ use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\TagWildcardRecipeIngredient; +use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\network\mcpe\protocol\types\GameMode as ProtocolGameMode; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; @@ -41,7 +43,10 @@ use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\TagItemDescriptor; use pocketmine\player\GameMode; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; +use pocketmine\world\format\io\GlobalBlockStateHandlers; +use pocketmine\world\format\io\GlobalItemDataHandlers; use function get_class; use function morton2d_encode; @@ -52,13 +57,40 @@ class TypeConverter{ private const RECIPE_INPUT_WILDCARD_META = 0x7fff; + private BlockItemIdMap $blockItemIdMap; + private RuntimeBlockMapping $blockTranslator; + private ItemTranslator $itemTranslator; + private ItemTypeDictionary $itemTypeDictionary; private int $shieldRuntimeId; public function __construct(){ //TODO: inject stuff via constructor - $this->shieldRuntimeId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId("minecraft:shield"); + $this->blockItemIdMap = BlockItemIdMap::getInstance(); + + $canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT); + $metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON); + $this->blockTranslator = new RuntimeBlockMapping( + BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), + GlobalBlockStateHandlers::getSerializer() + ); + + $this->itemTypeDictionary = ItemTypeDictionaryFromDataHelper::loadFromString(Filesystem::fileGetContents(BedrockDataFiles::REQUIRED_ITEM_LIST_JSON)); + $this->shieldRuntimeId = $this->itemTypeDictionary->fromStringId("minecraft:shield"); + + $this->itemTranslator = new ItemTranslator( + $this->itemTypeDictionary, + $this->blockTranslator->getBlockStateDictionary(), + GlobalItemDataHandlers::getSerializer(), + GlobalItemDataHandlers::getDeserializer() + ); } + public function getBlockTranslator() : RuntimeBlockMapping{ return $this->blockTranslator; } + + public function getItemTypeDictionary() : ItemTypeDictionary{ return $this->itemTypeDictionary; } + + public function getItemTranslator() : ItemTranslator{ return $this->itemTranslator; } + /** * Returns a client-friendly gamemode of the specified real gamemode * This function takes care of handling gamemodes known to MCPE (as of 1.1.0.3, that includes Survival, Creative and Adventure) @@ -100,14 +132,14 @@ class TypeConverter{ return new ProtocolRecipeIngredient(null, 0); } if($ingredient instanceof MetaWildcardRecipeIngredient){ - $id = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($ingredient->getItemId()); + $id = $this->itemTypeDictionary->fromStringId($ingredient->getItemId()); $meta = self::RECIPE_INPUT_WILDCARD_META; $descriptor = new IntIdMetaItemDescriptor($id, $meta); }elseif($ingredient instanceof ExactRecipeIngredient){ $item = $ingredient->getItem(); - [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId($item); + [$id, $meta, $blockRuntimeId] = $this->itemTranslator->toNetworkId($item); if($blockRuntimeId !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ - $meta = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); + $meta = $this->blockTranslator->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); if($meta === null){ throw new AssumptionFailedError("Every block state should have an associated meta value"); } @@ -133,7 +165,7 @@ class TypeConverter{ } if($descriptor instanceof IntIdMetaItemDescriptor){ - $stringId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($descriptor->getId()); + $stringId = $this->itemTypeDictionary->fromIntId($descriptor->getId()); $meta = $descriptor->getMeta(); }elseif($descriptor instanceof StringIdMetaItemDescriptor){ $stringId = $descriptor->getId(); @@ -147,14 +179,14 @@ class TypeConverter{ } $blockRuntimeId = null; - if(($blockId = BlockItemIdMap::getInstance()->lookupBlockId($stringId)) !== null){ - $blockRuntimeId = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->lookupStateIdFromIdMeta($blockId, $meta); + if(($blockId = $this->blockItemIdMap->lookupBlockId($stringId)) !== null){ + $blockRuntimeId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($blockId, $meta); if($blockRuntimeId !== null){ $meta = 0; } } - $result = ItemTranslator::getInstance()->fromNetworkId( - GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($stringId), + $result = $this->itemTranslator->fromNetworkId( + $this->itemTypeDictionary->fromStringId($stringId), $meta, $blockRuntimeId ?? ItemTranslator::NO_BLOCK_RUNTIME_ID ); @@ -172,11 +204,11 @@ class TypeConverter{ $nbt = clone $nbt; } - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack); + $idMeta = $this->itemTranslator->toNetworkIdQuiet($itemStack); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with //other unmapped items. - [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId(VanillaBlocks::INFO_UPDATE()->asItem()); + [$id, $meta, $blockRuntimeId] = $this->itemTranslator->toNetworkId(VanillaBlocks::INFO_UPDATE()->asItem()); if($nbt === null){ $nbt = new CompoundTag(); } @@ -206,7 +238,7 @@ class TypeConverter{ } $compound = $itemStack->getNbt(); - $itemResult = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); + $itemResult = $this->itemTranslator->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); if($compound !== null){ $compound = clone $compound; diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 91263a619c..0ba686bed0 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\cache\CraftingDataCache; use pocketmine\network\mcpe\cache\StaticPacketCache; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; @@ -108,7 +107,7 @@ class PreSpawnPacketHandler extends PacketHandler{ false, [], 0, - GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(), + TypeConverter::getInstance()->getItemTypeDictionary()->getEntries(), )); $this->session->getLogger()->debug("Sending actor identifiers"); diff --git a/src/world/World.php b/src/world/World.php index a9798fb8a4..a4528f4c20 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -67,7 +67,7 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\BlockActorDataPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; @@ -1062,7 +1062,7 @@ class World implements ChunkManager{ public function createBlockUpdatePackets(array $blocks) : array{ $packets = []; - $blockMapping = RuntimeBlockMapping::getInstance(); + $blockMapping = TypeConverter::getInstance()->getBlockTranslator(); foreach($blocks as $b){ if(!($b instanceof Vector3)){ diff --git a/src/world/particle/BlockBreakParticle.php b/src/world/particle/BlockBreakParticle.php index 98b2eb9c87..b9cec0e781 100644 --- a/src/world/particle/BlockBreakParticle.php +++ b/src/world/particle/BlockBreakParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\LevelEvent; @@ -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->getStateId()), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/particle/BlockPunchParticle.php b/src/world/particle/BlockPunchParticle.php index fe754dc560..c8affffc53 100644 --- a/src/world/particle/BlockPunchParticle.php +++ b/src/world/particle/BlockPunchParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\LevelEvent; @@ -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->getStateId()) | ($this->face << 24), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) | ($this->face << 24), $pos)]; } } diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index e7766470f1..a50aeef3ae 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -26,7 +26,7 @@ namespace pocketmine\world\particle; use pocketmine\block\VanillaBlocks; use pocketmine\entity\Entity; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\AddActorPacket; use pocketmine\network\mcpe\protocol\RemoveActorPacket; use pocketmine\network\mcpe\protocol\types\entity\ByteMetadataProperty; @@ -95,7 +95,7 @@ class FloatingTextParticle implements Particle{ EntityMetadataProperties::BOUNDING_BOX_WIDTH => new FloatMetadataProperty(0.0), EntityMetadataProperties::BOUNDING_BOX_HEIGHT => new FloatMetadataProperty(0.0), EntityMetadataProperties::NAMETAG => new StringMetadataProperty($name), - EntityMetadataProperties::VARIANT => new IntMetadataProperty(RuntimeBlockMapping::getInstance()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), + EntityMetadataProperties::VARIANT => new IntMetadataProperty(TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), EntityMetadataProperties::ALWAYS_SHOW_NAMETAG => new ByteMetadataProperty(1), ]; $p[] = AddActorPacket::create( diff --git a/src/world/particle/ItemBreakParticle.php b/src/world/particle/ItemBreakParticle.php index ac0c5ac4ba..4f8c9ea913 100644 --- a/src/world/particle/ItemBreakParticle.php +++ b/src/world/particle/ItemBreakParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\item\Item; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\ParticleIds; @@ -33,7 +33,7 @@ class ItemBreakParticle implements Particle{ public function __construct(private Item $item){} public function encode(Vector3 $pos) : array{ - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($this->item); + [$id, $meta] = TypeConverter::getInstance()->getItemTranslator()->toNetworkId($this->item); return [LevelEventPacket::standardParticle(ParticleIds::ITEM_BREAK, ($id << 16) | $meta, $pos)]; } } diff --git a/src/world/particle/TerrainParticle.php b/src/world/particle/TerrainParticle.php index 27de04b140..0eb1f04949 100644 --- a/src/world/particle/TerrainParticle.php +++ b/src/world/particle/TerrainParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\ParticleIds; @@ -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->getStateId()), $pos)]; + return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/sound/BlockBreakSound.php b/src/world/sound/BlockBreakSound.php index 4f919a396f..6cdc5471e0 100644 --- a/src/world/sound/BlockBreakSound.php +++ b/src/world/sound/BlockBreakSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -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->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPlaceSound.php b/src/world/sound/BlockPlaceSound.php index 8440dbd470..80704a9572 100644 --- a/src/world/sound/BlockPlaceSound.php +++ b/src/world/sound/BlockPlaceSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -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->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPunchSound.php b/src/world/sound/BlockPunchSound.php index d3898b7347..33754b93ed 100644 --- a/src/world/sound/BlockPunchSound.php +++ b/src/world/sound/BlockPunchSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -40,7 +40,7 @@ class BlockPunchSound implements Sound{ LevelSoundEvent::HIT, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/src/world/sound/EntityLandSound.php b/src/world/sound/EntityLandSound.php index 5457533670..dd23b571fd 100644 --- a/src/world/sound/EntityLandSound.php +++ b/src/world/sound/EntityLandSound.php @@ -26,7 +26,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\entity\Entity; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -43,7 +43,7 @@ class EntityLandSound implements Sound{ return [LevelSoundEventPacket::create( LevelSoundEvent::LAND, $pos, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->blockLandedOn->getStateId()), + TypeConverter::getInstance()->getBlockTranslator()->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 d3483d36b7..4ab7e10a03 100644 --- a/src/world/sound/ItemUseOnBlockSound.php +++ b/src/world/sound/ItemUseOnBlockSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -42,7 +42,7 @@ final class ItemUseOnBlockSound implements Sound{ LevelSoundEvent::ITEM_USE_ON, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php index 9e7287da25..46fb709ab6 100644 --- a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php +++ b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php @@ -32,8 +32,9 @@ class RuntimeBlockMappingTest extends TestCase{ * @doesNotPerformAssertions */ public function testAllBlockStatesSerialize() : void{ + $blockTranslator = TypeConverter::getInstance()->getBlockTranslator(); foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $state){ - RuntimeBlockMapping::getInstance()->toRuntimeId($state->getStateId()); + $blockTranslator->toRuntimeId($state->getStateId()); } } } From 32e6fdd95adbf43d4d08d361fd75eb2c7819751b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 22:18:27 +0100 Subject: [PATCH 0951/1858] Rename RuntimeBlockMapping -> BlockTranslator --- ...ntimeBlockMapping.php => BlockTranslator.php} | 2 +- src/network/mcpe/convert/TypeConverter.php | 6 +++--- src/network/mcpe/serializer/ChunkSerializer.php | 16 ++++++++-------- src/world/World.php | 8 ++++---- ...ckMappingTest.php => BlockTranslatorTest.php} | 2 +- tools/generate-bedrock-data-from-packets.php | 12 ++++++------ 6 files changed, 23 insertions(+), 23 deletions(-) rename src/network/mcpe/convert/{RuntimeBlockMapping.php => BlockTranslator.php} (99%) rename tests/phpunit/network/mcpe/convert/{RuntimeBlockMappingTest.php => BlockTranslatorTest.php} (96%) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/BlockTranslator.php similarity index 99% rename from src/network/mcpe/convert/RuntimeBlockMapping.php rename to src/network/mcpe/convert/BlockTranslator.php index 4df98f15cc..a475109f48 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/BlockTranslator.php @@ -32,7 +32,7 @@ use pocketmine\utils\AssumptionFailedError; /** * @internal */ -final class RuntimeBlockMapping{ +final class BlockTranslator{ /** * @var int[] * @phpstan-var array diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index ad9f631eed..2da58ca145 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -58,7 +58,7 @@ class TypeConverter{ private const RECIPE_INPUT_WILDCARD_META = 0x7fff; private BlockItemIdMap $blockItemIdMap; - private RuntimeBlockMapping $blockTranslator; + private BlockTranslator $blockTranslator; private ItemTranslator $itemTranslator; private ItemTypeDictionary $itemTypeDictionary; private int $shieldRuntimeId; @@ -69,7 +69,7 @@ class TypeConverter{ $canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT); $metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON); - $this->blockTranslator = new RuntimeBlockMapping( + $this->blockTranslator = new BlockTranslator( BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), GlobalBlockStateHandlers::getSerializer() ); @@ -85,7 +85,7 @@ class TypeConverter{ ); } - public function getBlockTranslator() : RuntimeBlockMapping{ return $this->blockTranslator; } + public function getBlockTranslator() : BlockTranslator{ return $this->blockTranslator; } public function getItemTypeDictionary() : ItemTypeDictionary{ return $this->itemTypeDictionary; } diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index 7725878557..88c03ae382 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -27,7 +27,7 @@ use pocketmine\block\tile\Spawnable; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\LegacyBiomeIdToStringIdMap; use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\BlockTranslator; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; @@ -58,13 +58,13 @@ final class ChunkSerializer{ return 0; } - public static function serializeFullChunk(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ + public static function serializeFullChunk(Chunk $chunk, BlockTranslator $blockTranslator, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ $stream = PacketSerializer::encoder($encoderContext); $subChunkCount = self::getSubChunkCount($chunk); $writtenCount = 0; for($y = Chunk::MIN_SUBCHUNK_INDEX; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ - self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream, false); + self::serializeSubChunk($chunk->getSubChunk($y), $blockTranslator, $stream, false); } $biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance(); @@ -84,13 +84,13 @@ final class ChunkSerializer{ return $stream->getBuffer(); } - public static function serializeSubChunk(SubChunk $subChunk, RuntimeBlockMapping $blockMapper, PacketSerializer $stream, bool $persistentBlockStates) : void{ + public static function serializeSubChunk(SubChunk $subChunk, BlockTranslator $blockTranslator, PacketSerializer $stream, bool $persistentBlockStates) : void{ $layers = $subChunk->getBlockLayers(); $stream->putByte(8); //version $stream->putByte(count($layers)); - $blockStateDictionary = $blockMapper->getBlockStateDictionary(); + $blockStateDictionary = $blockTranslator->getBlockStateDictionary(); foreach($layers as $blocks){ $bitsPerBlock = $blocks->getBitsPerBlock(); @@ -109,16 +109,16 @@ final class ChunkSerializer{ $nbtSerializer = new NetworkNbtSerializer(); foreach($palette as $p){ //TODO: introduce a binary cache for this - $state = $blockStateDictionary->getDataFromStateId($blockMapper->toRuntimeId($p)); + $state = $blockStateDictionary->getDataFromStateId($blockTranslator->toRuntimeId($p)); if($state === null){ - $state = $blockMapper->getFallbackStateData(); + $state = $blockTranslator->getFallbackStateData(); } $stream->put($nbtSerializer->write(new TreeRoot($state->toNbt()))); } }else{ foreach($palette as $p){ - $stream->put(Binary::writeUnsignedVarInt($blockMapper->toRuntimeId($p) << 1)); + $stream->put(Binary::writeUnsignedVarInt($blockTranslator->toRuntimeId($p) << 1)); } } } diff --git a/src/world/World.php b/src/world/World.php index a4528f4c20..a965974b7c 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1062,7 +1062,7 @@ class World implements ChunkManager{ public function createBlockUpdatePackets(array $blocks) : array{ $packets = []; - $blockMapping = TypeConverter::getInstance()->getBlockTranslator(); + $blockTranslator = TypeConverter::getInstance()->getBlockTranslator(); foreach($blocks as $b){ if(!($b instanceof Vector3)){ @@ -1074,7 +1074,7 @@ class World implements ChunkManager{ $tile = $this->getTileAt($b->x, $b->y, $b->z); if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){ - $originalStateData = $blockMapping->toStateData($fullBlock->getStateId()); + $originalStateData = $blockTranslator->toStateData($fullBlock->getStateId()); $fakeStateData = new BlockStateData( $originalStateData->getName(), array_merge($originalStateData->getStates(), $fakeStateProperties), @@ -1082,14 +1082,14 @@ class World implements ChunkManager{ ); $packets[] = UpdateBlockPacket::create( $blockPosition, - $blockMapping->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()), + $blockTranslator->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()), UpdateBlockPacket::FLAG_NETWORK, UpdateBlockPacket::DATA_LAYER_NORMAL ); } $packets[] = UpdateBlockPacket::create( $blockPosition, - $blockMapping->toRuntimeId($fullBlock->getStateId()), + $blockTranslator->toRuntimeId($fullBlock->getStateId()), UpdateBlockPacket::FLAG_NETWORK, UpdateBlockPacket::DATA_LAYER_NORMAL ); diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php similarity index 96% rename from tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php rename to tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php index 46fb709ab6..f2dc6cceac 100644 --- a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php +++ b/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php @@ -26,7 +26,7 @@ namespace pocketmine\network\mcpe\convert; use PHPUnit\Framework\TestCase; use pocketmine\block\RuntimeBlockStateRegistry; -class RuntimeBlockMappingTest extends TestCase{ +class BlockTranslatorTest extends TestCase{ /** * @doesNotPerformAssertions diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 2201a9159d..83f6848845 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -39,7 +39,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\BlockStateDictionary; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\BlockTranslator; use pocketmine\network\mcpe\handler\PacketHandler; use pocketmine\network\mcpe\protocol\AvailableActorIdentifiersPacket; use pocketmine\network\mcpe\protocol\BiomeDefinitionListPacket; @@ -109,10 +109,10 @@ require dirname(__DIR__) . '/vendor/autoload.php'; class ParserPacketHandler extends PacketHandler{ public ?ItemTypeDictionary $itemTypeDictionary = null; - private RuntimeBlockMapping $blockMapping; + private BlockTranslator $blockTranslator; public function __construct(private string $bedrockDataPath){ - $this->blockMapping = new RuntimeBlockMapping( + $this->blockTranslator = new BlockTranslator( BlockStateDictionary::loadFromString( Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "canonical_block_states.nbt")), Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "block_state_meta_map.json")), @@ -150,7 +150,7 @@ class ParserPacketHandler extends PacketHandler{ if($meta !== 0){ throw new PacketHandlingException("Unexpected non-zero blockitem meta"); } - $blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null; + $blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null; if($blockState === null){ throw new PacketHandlingException("Unmapped blockstate ID " . $itemStack->getBlockRuntimeId()); } @@ -268,9 +268,9 @@ class ParserPacketHandler extends PacketHandler{ } $meta = $descriptor->getMeta(); if($meta !== 32767){ - $blockStateId = $this->blockMapping->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta); + $blockStateId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta); if($blockStateId !== null){ - $blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($blockStateId); + $blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($blockStateId); if($blockState !== null && count($blockState->getStates()) > 0){ $data->block_states = self::blockStatePropertiesToString($blockState); } From ed021d193d47dadb6bdf00a991a0967f76c1fe5d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 23:11:00 +0100 Subject: [PATCH 0952/1858] BlockTranslator: cut memory usage in half this was achieved by storing binary representations of the blockstates, rather than the original BlockStateData. Due to the insane object:data ratio of Tag objects (40:1 for ByteTag for example), modestly sized NBT can explode in memory footprint. This has been previously seen with the absurd 25 MB footprint on file load. Previously, I attempted to mitigate this by deduplicating tag objects, but this was mitigating a symptom rather than addressing the cause. We don't actually need to keep the NBT around in memory, since we don't actually use it for anything other than matching blockstates. In this case, we can allow the code to be possibly a little slower, since the lookup is anyway slow and the result will be cached. In fact, using encoded ordered states as hash keys significantly improves the speed of lookups for stuff like walls, which have many thousands of states. We keep around generateStateData(), since it's still possible we may need the BlockStateData associated, and it can be easily reconstructed from the binary-encoded representation in BlockStateDictionaryEntry. --- .../mcpe/convert/BlockStateDictionary.php | 46 ++-------------- .../convert/BlockStateDictionaryEntry.php | 55 +++++++++++++++++-- .../mcpe/convert/BlockStateLookupCache.php | 20 ++----- src/network/mcpe/convert/BlockTranslator.php | 4 +- src/network/mcpe/convert/ItemTranslator.php | 2 +- .../mcpe/serializer/ChunkSerializer.php | 2 +- tools/generate-bedrock-data-from-packets.php | 4 +- 7 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 4c6e8aec06..b700382200 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -25,10 +25,6 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\NbtDataException; -use pocketmine\nbt\tag\ByteTag; -use pocketmine\nbt\tag\CompoundTag; -use pocketmine\nbt\tag\IntTag; -use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; @@ -58,7 +54,7 @@ final class BlockStateDictionary{ public function __construct( private array $states ){ - $this->stateDataToStateIdLookupCache = new BlockStateLookupCache(array_map(fn(BlockStateDictionaryEntry $entry) => $entry->getStateData(), $this->states)); + $this->stateDataToStateIdLookupCache = new BlockStateLookupCache($this->states); } /** @@ -71,15 +67,15 @@ final class BlockStateDictionary{ $this->idMetaToStateIdLookupCache = []; foreach($this->states as $i => $state){ - $this->idMetaToStateIdLookupCache[$state->getMeta()][$state->getStateData()->getName()] = $i; + $this->idMetaToStateIdLookupCache[$state->getMeta()][$state->getStateName()] = $i; } } return $this->idMetaToStateIdLookupCache; } - public function getDataFromStateId(int $networkRuntimeId) : ?BlockStateData{ - return ($this->states[$networkRuntimeId] ?? null)?->getStateData(); + public function generateDataFromStateId(int $networkRuntimeId) : ?BlockStateData{ + return ($this->states[$networkRuntimeId] ?? null)?->generateStateData(); } /** @@ -113,33 +109,6 @@ final class BlockStateDictionary{ */ public function getStates() : array{ return $this->states; } - /** - * @param string[] $keyIndex - * @param (ByteTag|StringTag|IntTag)[][] $valueIndex - * @phpstan-param array $keyIndex - * @phpstan-param array> $valueIndex - */ - private static function deduplicateCompound(CompoundTag $tag, array &$keyIndex, array &$valueIndex) : CompoundTag{ - if($tag->count() === 0){ - return $tag; - } - - $newTag = CompoundTag::create(); - foreach($tag as $key => $value){ - $key = $keyIndex[$key] ??= $key; - - if($value instanceof CompoundTag){ - $value = self::deduplicateCompound($value, $keyIndex, $valueIndex); - }elseif($value instanceof ByteTag || $value instanceof IntTag || $value instanceof StringTag){ - $value = $valueIndex[$value->getType()][$value->getValue()] ??= $value; - } - - $newTag->setTag($key, $value); - } - - return $newTag; - } - /** * @return BlockStateData[] * @phpstan-return list @@ -147,13 +116,8 @@ final class BlockStateDictionary{ * @throws NbtDataException */ public static function loadPaletteFromString(string $blockPaletteContents) : array{ - $keyIndex = []; - $valueIndex = []; - return array_map( - function(TreeRoot $root) use (&$keyIndex, &$valueIndex) : BlockStateData{ - return BlockStateData::fromNbt(self::deduplicateCompound($root->mustGetCompoundTag(), $keyIndex, $valueIndex)); - }, + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) ); } diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 53229963bb..746e939773 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -24,15 +24,60 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\tag\Tag; +use pocketmine\nbt\TreeRoot; +use function array_map; +use function count; +use function ksort; +use const SORT_STRING; final class BlockStateDictionaryEntry{ - public function __construct( - private BlockStateData $stateData, - private int $meta - ){} + private string $stateName; + private string $rawStateProperties; - public function getStateData() : BlockStateData{ return $this->stateData; } + public function __construct( + BlockStateData $stateData, + private int $meta + ){ + $this->stateName = $stateData->getName(); + $this->rawStateProperties = self::encodeStateProperties($stateData->getStates()); + } + + public function getStateName() : string{ return $this->stateName; } + + public function getRawStateProperties() : string{ return $this->rawStateProperties; } + + public function generateStateData() : BlockStateData{ + return new BlockStateData( + $this->stateName, + self::decodeStateProperties($this->rawStateProperties), + BlockStateData::CURRENT_VERSION + ); + } public function getMeta() : int{ return $this->meta; } + + /** + * @return Tag[] + */ + public static function decodeStateProperties(string $rawProperties) : array{ + if($rawProperties === ""){ + return []; + } + return array_map(fn(TreeRoot $root) => $root->getTag(), (new LittleEndianNbtSerializer())->readMultiple($rawProperties)); + } + + /** + * @param Tag[] $properties + */ + public static function encodeStateProperties(array $properties) : string{ + if(count($properties) === 0){ + return ""; + } + //TODO: make a more efficient encoding - NBT will do for now, but it's not very compact + ksort($properties, SORT_STRING); + return (new LittleEndianNbtSerializer())->writeMultiple(array_map(fn(Tag $tag) => new TreeRoot($tag), $properties)); + } } diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index 40b08e37d1..cea2c9c572 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -35,7 +35,7 @@ final class BlockStateLookupCache{ /** * @var int[][] - * @phpstan-var array> + * @phpstan-var array> */ private array $nameToNetworkIdsLookup = []; @@ -46,18 +46,18 @@ final class BlockStateLookupCache{ private array $nameToSingleNetworkIdLookup = []; /** - * @param BlockStateData[] $blockStates - * @phpstan-param list $blockStates + * @param BlockStateDictionaryEntry[] $blockStates + * @phpstan-param list $blockStates */ public function __construct(array $blockStates){ foreach($blockStates as $stateId => $stateNbt){ - $this->nameToNetworkIdsLookup[$stateNbt->getName()][$stateId] = $stateNbt; + $this->nameToNetworkIdsLookup[$stateNbt->getStateName()][$stateNbt->getRawStateProperties()] = $stateId; } //setup fast path for stateless blocks foreach(Utils::stringifyKeys($this->nameToNetworkIdsLookup) as $name => $stateIds){ if(count($stateIds) === 1){ - $this->nameToSingleNetworkIdLookup[$name] = array_key_first($stateIds); + $this->nameToSingleNetworkIdLookup[$name] = $stateIds[array_key_first($stateIds)]; } } } @@ -73,14 +73,6 @@ final class BlockStateLookupCache{ return $this->nameToSingleNetworkIdLookup[$name]; } - if(isset($this->nameToNetworkIdsLookup[$name])){ - foreach($this->nameToNetworkIdsLookup[$name] as $stateId => $stateNbt){ - if($stateNbt->equals($data)){ - return $stateId; - } - } - } - - return null; + return $this->nameToNetworkIdsLookup[$name][BlockStateDictionaryEntry::encodeStateProperties($data->getStates())] ?? null; } } diff --git a/src/network/mcpe/convert/BlockTranslator.php b/src/network/mcpe/convert/BlockTranslator.php index a475109f48..d3f07fb303 100644 --- a/src/network/mcpe/convert/BlockTranslator.php +++ b/src/network/mcpe/convert/BlockTranslator.php @@ -51,7 +51,7 @@ final class BlockTranslator{ BlockStateData::current(BlockTypeNames::INFO_UPDATE, []) ) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); //lookup the state data from the dictionary to avoid keeping two copies of the same data around - $this->fallbackStateData = $this->blockStateDictionary->getDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); + $this->fallbackStateData = $this->blockStateDictionary->generateDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); } public function toRuntimeId(int $internalStateId) : int{ @@ -84,7 +84,7 @@ final class BlockTranslator{ //case someone wants to implement multi version). $networkRuntimeId = $this->toRuntimeId($internalStateId); - return $this->blockStateDictionary->getDataFromStateId($networkRuntimeId) ?? throw new AssumptionFailedError("We just looked up this state ID, so it must exist"); + return $this->blockStateDictionary->generateDataFromStateId($networkRuntimeId) ?? throw new AssumptionFailedError("We just looked up this state ID, so it must exist"); } public function getBlockStateDictionary() : BlockStateDictionary{ return $this->blockStateDictionary; } diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 6309d774c4..ea7a64d403 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -107,7 +107,7 @@ final class ItemTranslator{ $blockStateData = null; if($networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID){ - $blockStateData = $this->blockStateDictionary->getDataFromStateId($networkBlockRuntimeId); + $blockStateData = $this->blockStateDictionary->generateDataFromStateId($networkBlockRuntimeId); if($blockStateData === null){ throw new TypeConversionException("Blockstate runtimeID $networkBlockRuntimeId does not correspond to any known blockstate"); } diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index 88c03ae382..84682e114e 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -109,7 +109,7 @@ final class ChunkSerializer{ $nbtSerializer = new NetworkNbtSerializer(); foreach($palette as $p){ //TODO: introduce a binary cache for this - $state = $blockStateDictionary->getDataFromStateId($blockTranslator->toRuntimeId($p)); + $state = $blockStateDictionary->generateDataFromStateId($blockTranslator->toRuntimeId($p)); if($state === null){ $state = $blockTranslator->getFallbackStateData(); } diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 83f6848845..989310e255 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -150,7 +150,7 @@ class ParserPacketHandler extends PacketHandler{ if($meta !== 0){ throw new PacketHandlingException("Unexpected non-zero blockitem meta"); } - $blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null; + $blockState = $this->blockTranslator->getBlockStateDictionary()->generateDataFromStateId($itemStack->getBlockRuntimeId()) ?? null; if($blockState === null){ throw new PacketHandlingException("Unmapped blockstate ID " . $itemStack->getBlockRuntimeId()); } @@ -270,7 +270,7 @@ class ParserPacketHandler extends PacketHandler{ if($meta !== 32767){ $blockStateId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta); if($blockStateId !== null){ - $blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($blockStateId); + $blockState = $this->blockTranslator->getBlockStateDictionary()->generateDataFromStateId($blockStateId); if($blockState !== null && count($blockState->getStates()) > 0){ $data->block_states = self::blockStatePropertiesToString($blockState); } From f9d9cbd0f6fc0bf0bfbeb7c38fc919036e7025ea Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 23:14:53 +0100 Subject: [PATCH 0953/1858] BlockStateDictionary: slash another 14% off memory usage by deduplicating block type names perhaps we could construct a dictionary from BlockTypeNames reflection?? --- src/network/mcpe/convert/BlockStateDictionary.php | 4 +++- src/network/mcpe/convert/BlockStateDictionaryEntry.php | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index b700382200..55dcd2210d 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -130,6 +130,7 @@ final class BlockStateDictionary{ $entries = []; + $uniqueNames = []; foreach(self::loadPaletteFromString($blockPaletteContents) as $i => $state){ $meta = $metaMap[$i] ?? null; if($meta === null){ @@ -138,7 +139,8 @@ final class BlockStateDictionary{ if(!is_int($meta)){ throw new \InvalidArgumentException("Invalid metaMap offset $i, expected int, got " . get_debug_type($meta)); } - $entries[$i] = new BlockStateDictionaryEntry($state, $meta); + $uniqueName = $uniqueNames[$state->getName()] ??= $state->getName(); + $entries[$i] = new BlockStateDictionaryEntry($uniqueName, $state->getStates(), $meta); } return new self($entries); diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 746e939773..994695df25 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -34,15 +34,17 @@ use const SORT_STRING; final class BlockStateDictionaryEntry{ - private string $stateName; private string $rawStateProperties; + /** + * @param Tag[] $stateProperties + */ public function __construct( - BlockStateData $stateData, + private string $stateName, + array $stateProperties, private int $meta ){ - $this->stateName = $stateData->getName(); - $this->rawStateProperties = self::encodeStateProperties($stateData->getStates()); + $this->rawStateProperties = self::encodeStateProperties($stateProperties); } public function getStateName() : string{ return $this->stateName; } From 43fe819862ee9efe9a6842c92ff9b0c40f1224b7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 23:18:06 +0100 Subject: [PATCH 0954/1858] BlockStateDictionary: added a smelly hack that saves another 40 KB this is really diminishing returns at this point... --- src/network/mcpe/convert/BlockStateDictionary.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 55dcd2210d..834390538c 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; @@ -31,6 +32,7 @@ use function array_map; use function get_debug_type; use function is_array; use function is_int; +use function is_string; use function json_decode; use const JSON_THROW_ON_ERROR; @@ -131,6 +133,15 @@ final class BlockStateDictionary{ $entries = []; $uniqueNames = []; + + //this hack allows the internal cache index to use interned strings which are already available in the + //core code anyway, saving around 40 KB of memory + foreach((new \ReflectionClass(BlockTypeNames::class))->getConstants() as $value){ + if(is_string($value)){ + $uniqueNames[$value] = $value; + } + } + foreach(self::loadPaletteFromString($blockPaletteContents) as $i => $state){ $meta = $metaMap[$i] ?? null; if($meta === null){ From d2c37d8bcf2590889da48119ed5fd542038e5ffb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 15:16:18 +0100 Subject: [PATCH 0955/1858] BlockStateLookupCache: avoid allocating useless arrays for blocks with only 1 permutation this saves about 120 KB of memory. --- src/network/mcpe/convert/BlockStateLookupCache.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index cea2c9c572..3cc3708eed 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -58,6 +58,7 @@ final class BlockStateLookupCache{ foreach(Utils::stringifyKeys($this->nameToNetworkIdsLookup) as $name => $stateIds){ if(count($stateIds) === 1){ $this->nameToSingleNetworkIdLookup[$name] = $stateIds[array_key_first($stateIds)]; + unset($this->nameToNetworkIdsLookup[$name]); } } } From 897ba9f2d9df389086efba8c369a7562a01312bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 15:29:27 +0100 Subject: [PATCH 0956/1858] BlockStateLookupCache: combine arrays for stateless and stateful blocks this reduces memory usage by another 20 KB or so. --- .../mcpe/convert/BlockStateLookupCache.php | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php index 3cc3708eed..16cf0ef0e2 100644 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ b/src/network/mcpe/convert/BlockStateLookupCache.php @@ -27,6 +27,8 @@ use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\utils\Utils; use function array_key_first; use function count; +use function is_array; +use function is_int; /** * Facilitates quickly looking up a block's state ID based on its NBT. @@ -34,31 +36,27 @@ use function count; final class BlockStateLookupCache{ /** - * @var int[][] - * @phpstan-var array> + * @var int[][]|int[] + * @phpstan-var array|int> */ private array $nameToNetworkIdsLookup = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $nameToSingleNetworkIdLookup = []; - /** * @param BlockStateDictionaryEntry[] $blockStates * @phpstan-param list $blockStates */ public function __construct(array $blockStates){ + $table = []; foreach($blockStates as $stateId => $stateNbt){ - $this->nameToNetworkIdsLookup[$stateNbt->getStateName()][$stateNbt->getRawStateProperties()] = $stateId; + $table[$stateNbt->getStateName()][$stateNbt->getRawStateProperties()] = $stateId; } //setup fast path for stateless blocks - foreach(Utils::stringifyKeys($this->nameToNetworkIdsLookup) as $name => $stateIds){ + foreach(Utils::stringifyKeys($table) as $name => $stateIds){ if(count($stateIds) === 1){ - $this->nameToSingleNetworkIdLookup[$name] = $stateIds[array_key_first($stateIds)]; - unset($this->nameToNetworkIdsLookup[$name]); + $this->nameToNetworkIdsLookup[$name] = $stateIds[array_key_first($stateIds)]; + }else{ + $this->nameToNetworkIdsLookup[$name] = $stateIds; } } } @@ -70,10 +68,11 @@ final class BlockStateLookupCache{ public function lookupStateId(BlockStateData $data) : ?int{ $name = $data->getName(); - if(isset($this->nameToSingleNetworkIdLookup[$name])){ - return $this->nameToSingleNetworkIdLookup[$name]; - } - - return $this->nameToNetworkIdsLookup[$name][BlockStateDictionaryEntry::encodeStateProperties($data->getStates())] ?? null; + $lookup = $this->nameToNetworkIdsLookup[$name] ?? null; + return match(true){ + $lookup === null => null, + is_int($lookup) => $lookup, + is_array($lookup) => $lookup[BlockStateDictionaryEntry::encodeStateProperties($data->getStates())] ?? null + }; } } From f1417e8dc9160acb20ed194b864954b806efca9b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 16:14:41 +0100 Subject: [PATCH 0957/1858] BlockStateDictionaryEntry: deduplicate encoded states this saves about 500 KB of memory at no cost. --- src/network/mcpe/convert/BlockStateDictionaryEntry.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 994695df25..57cc29c0c3 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -33,6 +33,11 @@ use function ksort; use const SORT_STRING; final class BlockStateDictionaryEntry{ + /** + * @var string[] + * @phpstan-var array + */ + private static array $uniqueRawStates = []; private string $rawStateProperties; @@ -44,7 +49,8 @@ final class BlockStateDictionaryEntry{ array $stateProperties, private int $meta ){ - $this->rawStateProperties = self::encodeStateProperties($stateProperties); + $rawStateProperties = self::encodeStateProperties($stateProperties); + $this->rawStateProperties = self::$uniqueRawStates[$rawStateProperties] ??= $rawStateProperties; } public function getStateName() : string{ return $this->stateName; } From 896dd2ec9da73c9516329a2d12c1e23f7ab6a809 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 16:35:31 +0100 Subject: [PATCH 0958/1858] Boat: use BoatType enum instead of TreeType TreeType really belongs in the generator package. Not all types of tree may have their own boat type (e.g. azalea). We can't use WoodType for this either, because some types of wood also don't have associated boat types (crimson, warped). --- src/item/Boat.php | 12 +++---- src/item/BoatType.php | 70 +++++++++++++++++++++++++++++++++++++++ src/item/VanillaItems.php | 17 +++++----- 3 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 src/item/BoatType.php diff --git a/src/item/Boat.php b/src/item/Boat.php index 1a78b03018..8fd3ea6507 100644 --- a/src/item/Boat.php +++ b/src/item/Boat.php @@ -23,18 +23,16 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\block\utils\TreeType; - class Boat extends Item{ - private TreeType $woodType; + private BoatType $boatType; - public function __construct(ItemIdentifier $identifier, string $name, TreeType $woodType){ + public function __construct(ItemIdentifier $identifier, string $name, BoatType $boatType){ parent::__construct($identifier, $name); - $this->woodType = $woodType; + $this->boatType = $boatType; } - public function getWoodType() : TreeType{ - return $this->woodType; + public function getType() : BoatType{ + return $this->boatType; } public function getFuelTime() : int{ diff --git a/src/item/BoatType.php b/src/item/BoatType.php new file mode 100644 index 0000000000..09816412b5 --- /dev/null +++ b/src/item/BoatType.php @@ -0,0 +1,70 @@ +Enum___construct($enumName); + } + + public function getWoodType() : WoodType{ return $this->woodType; } + + public function getDisplayName() : string{ + return $this->woodType->getDisplayName(); + } +} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 38d7eff9f7..9da73abe92 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\RecordType; -use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\entity\Entity; @@ -539,15 +538,15 @@ final class VanillaItems{ self::register("writable_book", new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); self::register("written_book", new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); - foreach(TreeType::getAll() as $type){ - //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency + foreach(BoatType::getAll() as $type){ + //boat type is static, because different types of wood may have different properties self::register($type->name() . "_boat", new Boat(new IID(match($type){ - TreeType::OAK() => Ids::OAK_BOAT, - TreeType::SPRUCE() => Ids::SPRUCE_BOAT, - TreeType::BIRCH() => Ids::BIRCH_BOAT, - TreeType::JUNGLE() => Ids::JUNGLE_BOAT, - TreeType::ACACIA() => Ids::ACACIA_BOAT, - TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, + BoatType::OAK() => Ids::OAK_BOAT, + BoatType::SPRUCE() => Ids::SPRUCE_BOAT, + BoatType::BIRCH() => Ids::BIRCH_BOAT, + BoatType::JUNGLE() => Ids::JUNGLE_BOAT, + BoatType::ACACIA() => Ids::ACACIA_BOAT, + BoatType::DARK_OAK() => Ids::DARK_OAK_BOAT, default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) }), $type->getDisplayName() . " Boat", $type)); } From 299ff5d9125c740225565784a107ed57a97d9f62 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 16:39:23 +0100 Subject: [PATCH 0959/1858] Register mangrove boat item --- src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php | 1 + src/item/BoatType.php | 2 ++ src/item/ItemTypeIds.php | 3 ++- src/item/VanillaItems.php | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index aafac3b60f..368423911d 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -274,6 +274,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::LEATHER_HELMET, Items::LEATHER_CAP()); $this->map1to1Item(Ids::LEATHER_LEGGINGS, Items::LEATHER_PANTS()); $this->map1to1Item(Ids::MAGMA_CREAM, Items::MAGMA_CREAM()); + $this->map1to1Item(Ids::MANGROVE_BOAT, Items::MANGROVE_BOAT()); $this->map1to1Item(Ids::MANGROVE_SIGN, Items::MANGROVE_SIGN()); $this->map1to1Item(Ids::MELON_SEEDS, Items::MELON_SEEDS()); $this->map1to1Item(Ids::MELON_SLICE, Items::MELON()); diff --git a/src/item/BoatType.php b/src/item/BoatType.php index 09816412b5..5ef0c9255b 100644 --- a/src/item/BoatType.php +++ b/src/item/BoatType.php @@ -36,6 +36,7 @@ use pocketmine\utils\EnumTrait; * @method static BoatType BIRCH() * @method static BoatType DARK_OAK() * @method static BoatType JUNGLE() + * @method static BoatType MANGROVE() * @method static BoatType OAK() * @method static BoatType SPRUCE() */ @@ -52,6 +53,7 @@ final class BoatType{ new self("jungle", WoodType::JUNGLE()), new self("acacia", WoodType::ACACIA()), new self("dark_oak", WoodType::DARK_OAK()), + new self("mangrove", WoodType::MANGROVE()), ); } diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index ddde0d1cbb..f2be016b91 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -300,8 +300,9 @@ final class ItemTypeIds{ public const SUSPICIOUS_STEW = 20261; public const TURTLE_HELMET = 20262; public const MEDICINE = 20263; + public const MANGROVE_BOAT = 20264; - public const FIRST_UNUSED_ITEM_ID = 20264; + public const FIRST_UNUSED_ITEM_ID = 20265; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 9da73abe92..eeaeddc800 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -203,6 +203,7 @@ use pocketmine\world\World; * @method static Armor LEATHER_PANTS() * @method static Armor LEATHER_TUNIC() * @method static Item MAGMA_CREAM() + * @method static Boat MANGROVE_BOAT() * @method static ItemBlockWallOrFloor MANGROVE_SIGN() * @method static Medicine MEDICINE() * @method static Melon MELON() @@ -547,6 +548,7 @@ final class VanillaItems{ BoatType::JUNGLE() => Ids::JUNGLE_BOAT, BoatType::ACACIA() => Ids::ACACIA_BOAT, BoatType::DARK_OAK() => Ids::DARK_OAK_BOAT, + BoatType::MANGROVE() => Ids::MANGROVE_BOAT, default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) }), $type->getDisplayName() . " Boat", $type)); } From 2c81446e5b8b0e3d55eacba9567eecfd2cf4218c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 16:54:10 +0100 Subject: [PATCH 0960/1858] Move TreeType to generator package, added dedicated SaplingType enum TreeType includes a bunch of stuff that don't have regular saplings associated with them, such as mangrove and azalea trees. Mangrove has a dedicated propagule block with different behaviour than the others, and azalea trees are grown from azalea blocks, which are solid and have different behaviour to saplings. We may also want to account for crimson and warped 'trees' in TreeType too, although I'm not sure if those belong there or not. --- src/block/BlockLegacyIdHelper.php | 16 ++--- src/block/Sapling.php | 10 +-- src/block/VanillaBlocks.php | 8 +-- src/block/utils/SaplingType.php | 71 +++++++++++++++++++ src/world/biome/BiomeRegistry.php | 2 +- src/world/biome/ForestBiome.php | 2 +- src/world/biome/TaigaBiome.php | 2 +- src/world/generator/object/TreeFactory.php | 1 - .../generator/object}/TreeType.php | 7 +- src/world/generator/populator/Tree.php | 2 +- 10 files changed, 97 insertions(+), 24 deletions(-) create mode 100644 src/block/utils/SaplingType.php rename src/{block/utils => world/generator/object}/TreeType.php (85%) diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/BlockLegacyIdHelper.php index c7cb2f5d79..6d298ed17f 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/BlockLegacyIdHelper.php @@ -27,7 +27,7 @@ use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\tile\Sign as TileSign; use pocketmine\block\utils\LeavesType; -use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; @@ -124,14 +124,14 @@ final class BlockLegacyIdHelper{ }); } - public static function getSaplingIdentifier(TreeType $treeType) : BID{ + public static function getSaplingIdentifier(SaplingType $treeType) : BID{ return new BID(match($treeType->id()){ - TreeType::OAK()->id() => Ids::OAK_SAPLING, - TreeType::SPRUCE()->id() => Ids::SPRUCE_SAPLING, - TreeType::BIRCH()->id() => Ids::BIRCH_SAPLING, - TreeType::JUNGLE()->id() => Ids::JUNGLE_SAPLING, - TreeType::ACACIA()->id() => Ids::ACACIA_SAPLING, - TreeType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, + SaplingType::OAK()->id() => Ids::OAK_SAPLING, + SaplingType::SPRUCE()->id() => Ids::SPRUCE_SAPLING, + SaplingType::BIRCH()->id() => Ids::BIRCH_SAPLING, + SaplingType::JUNGLE()->id() => Ids::JUNGLE_SAPLING, + SaplingType::ACACIA()->id() => Ids::ACACIA_SAPLING, + SaplingType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, default => throw new AssumptionFailedError("All tree types should be covered") }); } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 838a32ce8c..73ebfeb1f3 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\SaplingType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -39,11 +39,11 @@ use function mt_rand; class Sapling extends Flowable{ protected bool $ready = false; - private TreeType $treeType; + private SaplingType $saplingType; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, TreeType $treeType){ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, SaplingType $saplingType){ parent::__construct($idInfo, $name, $typeInfo); - $this->treeType = $treeType; + $this->saplingType = $saplingType; } protected function describeState(RuntimeDataDescriber $w) : void{ @@ -102,7 +102,7 @@ class Sapling extends Flowable{ private function grow(?Player $player) : bool{ $random = new Random(mt_rand()); - $tree = TreeFactory::get($random, $this->treeType); + $tree = TreeFactory::get($random, $this->saplingType->getTreeType()); $transaction = $tree?->getBlockTransaction($this->position->getWorld(), $this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ(), $random); if($transaction === null){ return false; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 86534de835..ac6325d671 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -55,7 +55,7 @@ use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\LeavesType; -use pocketmine\block\utils\TreeType; +use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; use pocketmine\crafting\FurnaceType; use pocketmine\entity\projectile\Projectile; @@ -1108,9 +1108,9 @@ final class VanillaBlocks{ }); $saplingTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); - foreach(TreeType::getAll() as $treeType){ - $name = $treeType->getDisplayName(); - self::register($treeType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", $saplingTypeInfo, $treeType)); + foreach(SaplingType::getAll() as $saplingType){ + $name = $saplingType->getDisplayName(); + self::register($saplingType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); } foreach(LeavesType::getAll() as $leavesType){ $name = $leavesType->getDisplayName(); diff --git a/src/block/utils/SaplingType.php b/src/block/utils/SaplingType.php new file mode 100644 index 0000000000..516ee1516b --- /dev/null +++ b/src/block/utils/SaplingType.php @@ -0,0 +1,71 @@ +Enum___construct($enumName); + } + + public function getTreeType() : TreeType{ return $this->treeType; } + + public function getDisplayName() : string{ + return $this->treeType->getDisplayName(); + } +} diff --git a/src/world/biome/BiomeRegistry.php b/src/world/biome/BiomeRegistry.php index 470360d4b4..6481842095 100644 --- a/src/world/biome/BiomeRegistry.php +++ b/src/world/biome/BiomeRegistry.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\world\biome; -use pocketmine\block\utils\TreeType; use pocketmine\data\bedrock\BiomeIds; use pocketmine\utils\SingletonTrait; +use pocketmine\world\generator\object\TreeType; final class BiomeRegistry{ use SingletonTrait; diff --git a/src/world/biome/ForestBiome.php b/src/world/biome/ForestBiome.php index f75c303c40..8f80cb474a 100644 --- a/src/world/biome/ForestBiome.php +++ b/src/world/biome/ForestBiome.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\biome; -use pocketmine\block\utils\TreeType; +use pocketmine\world\generator\object\TreeType; use pocketmine\world\generator\populator\TallGrass; use pocketmine\world\generator\populator\Tree; diff --git a/src/world/biome/TaigaBiome.php b/src/world/biome/TaigaBiome.php index b96c69bcc5..cd68c97486 100644 --- a/src/world/biome/TaigaBiome.php +++ b/src/world/biome/TaigaBiome.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\biome; -use pocketmine\block\utils\TreeType; +use pocketmine\world\generator\object\TreeType; use pocketmine\world\generator\populator\TallGrass; use pocketmine\world\generator\populator\Tree; diff --git a/src/world/generator/object/TreeFactory.php b/src/world/generator/object/TreeFactory.php index 741ceacf91..ecab73c797 100644 --- a/src/world/generator/object/TreeFactory.php +++ b/src/world/generator/object/TreeFactory.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\world\generator\object; -use pocketmine\block\utils\TreeType; use pocketmine\utils\Random; final class TreeFactory{ diff --git a/src/block/utils/TreeType.php b/src/world/generator/object/TreeType.php similarity index 85% rename from src/block/utils/TreeType.php rename to src/world/generator/object/TreeType.php index 180f17a47a..1e8bf56e9a 100644 --- a/src/block/utils/TreeType.php +++ b/src/world/generator/object/TreeType.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\block\utils; +namespace pocketmine\world\generator\object; use pocketmine\utils\EnumTrait; @@ -51,7 +51,10 @@ final class TreeType{ new TreeType("birch", "Birch"), new TreeType("jungle", "Jungle"), new TreeType("acacia", "Acacia"), - new TreeType("dark_oak", "Dark Oak") + new TreeType("dark_oak", "Dark Oak"), + //TODO: cherry blossom, mangrove, azalea + //TODO: do crimson and warped "trees" belong here? I'm not sure if they're actually trees or just fungi + //TODO: perhaps huge mushrooms should be here too??? ); } diff --git a/src/world/generator/populator/Tree.php b/src/world/generator/populator/Tree.php index b98af52eec..3e5aef0a77 100644 --- a/src/world/generator/populator/Tree.php +++ b/src/world/generator/populator/Tree.php @@ -25,11 +25,11 @@ namespace pocketmine\world\generator\populator; use pocketmine\block\BlockTypeIds; use pocketmine\block\BlockTypeTags; -use pocketmine\block\utils\TreeType; use pocketmine\utils\Random; use pocketmine\world\ChunkManager; use pocketmine\world\format\Chunk; use pocketmine\world\generator\object\TreeFactory; +use pocketmine\world\generator\object\TreeType; class Tree implements Populator{ private int $randomAmount = 1; From 85372633eb252950d7bf5da14c0f35fc11699ce1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 17:05:22 +0100 Subject: [PATCH 0961/1858] Tidy up BlockLegacyIdHelper stuff I don't plan to make wood-like blocks have a dynamic wood/leaves/sapling type, as it's entirely possible their type properties will continue to diverge in future versions. --- src/block/VanillaBlocks.php | 28 ++++++++-------- ...IdHelper.php => WoodLikeBlockIdHelper.php} | 33 ++++++++++++------- 2 files changed, 36 insertions(+), 25 deletions(-) rename src/block/{BlockLegacyIdHelper.php => WoodLikeBlockIdHelper.php} (88%) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index ac6325d671..cbe3733469 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1110,11 +1110,11 @@ final class VanillaBlocks{ foreach(SaplingType::getAll() as $saplingType){ $name = $saplingType->getDisplayName(); - self::register($saplingType->name() . "_sapling", new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); + self::register($saplingType->name() . "_sapling", new Sapling(WoodLikeBlockIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); } foreach(LeavesType::getAll() as $leavesType){ $name = $leavesType->getDisplayName(); - self::register($leavesType->name() . "_leaves", new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); + self::register($leavesType->name() . "_leaves", new Leaves(WoodLikeBlockIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); } $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); @@ -1234,22 +1234,22 @@ final class VanillaBlocks{ $name = $woodType->getDisplayName(); $idName = fn(string $suffix) => $woodType->name() . "_" . $suffix; - self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), new Wood(BlockLegacyIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); - self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); + self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); + self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); - self::register($idName("planks"), new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); - self::register($idName("fence"), new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); - self::register($idName("slab"), new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); + self::register($idName("planks"), new Planks(WoodLikeBlockIdHelper::getPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); + self::register($idName("fence"), new WoodenFence(WoodLikeBlockIdHelper::getFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); + self::register($idName("slab"), new WoodenSlab(WoodLikeBlockIdHelper::getSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); - self::register($idName("fence_gate"), new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); - self::register($idName("stairs"), new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); - self::register($idName("door"), new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); + self::register($idName("fence_gate"), new FenceGate(WoodLikeBlockIdHelper::getFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); + self::register($idName("stairs"), new WoodenStairs(WoodLikeBlockIdHelper::getStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); + self::register($idName("door"), new WoodenDoor(WoodLikeBlockIdHelper::getDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); - self::register($idName("button"), new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); - self::register($idName("pressure_plate"), new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); - self::register($idName("trapdoor"), new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); + self::register($idName("button"), new WoodenButton(WoodLikeBlockIdHelper::getButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); + self::register($idName("pressure_plate"), new WoodenPressurePlate(WoodLikeBlockIdHelper::getPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); + self::register($idName("trapdoor"), new WoodenTrapdoor(WoodLikeBlockIdHelper::getTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); - [$floorSignId, $wallSignId, $signAsItem] = BlockLegacyIdHelper::getWoodenSignInfo($woodType); + [$floorSignId, $wallSignId, $signAsItem] = WoodLikeBlockIdHelper::getSignInfo($woodType); self::register($idName("sign"), new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); self::register($idName("wall_sign"), new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); } diff --git a/src/block/BlockLegacyIdHelper.php b/src/block/WoodLikeBlockIdHelper.php similarity index 88% rename from src/block/BlockLegacyIdHelper.php rename to src/block/WoodLikeBlockIdHelper.php index 6d298ed17f..a7aacb6498 100644 --- a/src/block/BlockLegacyIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -32,9 +32,20 @@ use pocketmine\block\utils\WoodType; use pocketmine\item\VanillaItems; use pocketmine\utils\AssumptionFailedError; -final class BlockLegacyIdHelper{ +/** + * All wood-like blocks have different IDs for different wood types. + * + * We can't make these dynamic, because some types of wood have different type properties (e.g. crimson and warped planks + * are not flammable, but all other planks are). + * + * In the future, it's entirely within the realm of reason that the other types of wood may differ in other ways, such + * as flammability, hardness, required tool tier, etc. + * Therefore, to stay on the safe side of Mojang, wood-like blocks have static types. This does unfortunately generate + * a lot of ugly code. + */ +final class WoodLikeBlockIdHelper{ - public static function getWoodenPlanksIdentifier(WoodType $type) : BID{ + public static function getPlanksIdentifier(WoodType $type) : BID{ return new BID(match($type->id()){ WoodType::OAK()->id() => Ids::OAK_PLANKS, WoodType::SPRUCE()->id() => Ids::SPRUCE_PLANKS, @@ -49,7 +60,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenFenceIdentifier(WoodType $type) : BID{ + public static function getFenceIdentifier(WoodType $type) : BID{ return new BID(match($type->id()){ WoodType::OAK()->id() => Ids::OAK_FENCE, WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE, @@ -64,7 +75,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenSlabIdentifier(WoodType $type) : BID{ + public static function getSlabIdentifier(WoodType $type) : BID{ return new BID(match($type->id()){ WoodType::OAK()->id() => Ids::OAK_SLAB, WoodType::SPRUCE()->id() => Ids::SPRUCE_SLAB, @@ -140,7 +151,7 @@ final class BlockLegacyIdHelper{ * @return BID[]|\Closure[] * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} */ - public static function getWoodenSignInfo(WoodType $treeType) : array{ + public static function getSignInfo(WoodType $treeType) : array{ switch($treeType->id()){ case WoodType::OAK()->id(): return [ @@ -201,7 +212,7 @@ final class BlockLegacyIdHelper{ throw new AssumptionFailedError("Switch should cover all wood types"); } - public static function getWoodenTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_TRAPDOOR, WoodType::SPRUCE()->id() => Ids::SPRUCE_TRAPDOOR, @@ -216,7 +227,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenButtonIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getButtonIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_BUTTON, WoodType::SPRUCE()->id() => Ids::SPRUCE_BUTTON, @@ -231,7 +242,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_PRESSURE_PLATE, WoodType::SPRUCE()->id() => Ids::SPRUCE_PRESSURE_PLATE, @@ -246,7 +257,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenDoorIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getDoorIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_DOOR, WoodType::SPRUCE()->id() => Ids::SPRUCE_DOOR, @@ -261,7 +272,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_FENCE_GATE, WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE_GATE, @@ -276,7 +287,7 @@ final class BlockLegacyIdHelper{ }); } - public static function getWoodenStairsIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getStairsIdentifier(WoodType $treeType) : BlockIdentifier{ return new BID(match($treeType->id()){ WoodType::OAK()->id() => Ids::OAK_STAIRS, WoodType::SPRUCE()->id() => Ids::SPRUCE_STAIRS, From d8e77c1920ff13ed99edf122518e9bfd5a664117 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 18:47:06 +0100 Subject: [PATCH 0962/1858] Tidy up crafting block registration according to data dumps from bds-mod-mapping, fletching tables have a blast resistance of 12.5, just like the others. --- src/block/VanillaBlocks.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index cbe3733469..5987939774 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -811,7 +811,6 @@ final class VanillaBlocks{ self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new Info(new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1)))); self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new Info(BreakInfo::axe(0.2, null, 15.0)))); self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD())))); - self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", new Info(BreakInfo::axe(2.5)))); self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new Info(BreakInfo::axe(0.2)))); self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); @@ -839,7 +838,6 @@ final class VanillaBlocks{ self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0)))); self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant(), [Tags::FIRE]))); - self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", new Info(BreakInfo::axe(2.5, null, 2.5)))); $flowerTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", $flowerTypeInfo)); @@ -909,7 +907,6 @@ final class VanillaBlocks{ self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", new Info(BreakInfo::indestructible(500.0)))); self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new Info(BreakInfo::axe(2.0)))); self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new Info(new BreakInfo(0.5)))); - self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", new Info(BreakInfo::axe(2.5)))); self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new Info(BreakInfo::axe(1.0)))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", new Info(BreakInfo::instant()))); @@ -1423,6 +1420,9 @@ final class VanillaBlocks{ //TODO: this is the same for all wooden crafting blocks $craftingBlockBreakInfo = new Info(BreakInfo::axe(2.5)); self::register("cartography_table", new CartographyTable(new BID(Ids::CARTOGRAPHY_TABLE), "Cartography Table", $craftingBlockBreakInfo)); + self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", $craftingBlockBreakInfo)); + self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", $craftingBlockBreakInfo)); + self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", $craftingBlockBreakInfo)); self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); } From 22f8623e176e6cff5d87069fc300c191b78c2ceb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 21:06:27 +0100 Subject: [PATCH 0963/1858] Release 4.20.2 --- changelogs/4.20.md | 7 +++++++ src/VersionInfo.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelogs/4.20.md b/changelogs/4.20.md index d8f4c66b0b..4a91ab440e 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -44,3 +44,10 @@ Released 27th April 2023. ## Internals - `ItemStackContainerIdTranslator::translate()` now requires an additional `int $slotId` parameter and returns `array{int, int}` (translated window ID, translated slot ID) to be used with `InventoryManager->locateWindowAndSlot()`. - `InventoryManager->locateWindowAndSlot()` now checks if the translated slot actually exists in the requested inventory, and returns `null` if not. Previously, it would return potentially invalid slot IDs without checking them, potentially leading to crashes. + +# 4.20.2 +Released 4th May 2023. + +## Fixes +- Fixed all types of wooden logs appearing as oak in the inventory. +- Fixed a performance issue in `BaseInventory->canAddItem()` (missing `continue` causing useless logic to run). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 08582cc58a..0307d7845c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.20.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From c09390d20fd10a3e3671195f86d895cf696ce645 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 21:06:30 +0100 Subject: [PATCH 0964/1858] 4.20.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0307d7845c..df44e69827 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.20.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 092d130c963bb2deedc9a10bc178def407b58ef2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 23:01:10 +0100 Subject: [PATCH 0965/1858] RuntimeBlockMapping: borrow a hack from PM5 to reduce memory footprint we can't change the internals of this on a patch release, but this hack provides a 12 MB memory usage reduction, which is very significant. --- .../mcpe/convert/RuntimeBlockMapping.php | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index dd396af9bb..64984c3c18 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -27,7 +27,10 @@ use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; use pocketmine\utils\Filesystem; @@ -53,15 +56,45 @@ final class RuntimeBlockMapping{ ); } + /** + * @param string[] $keyIndex + * @param (ByteTag|StringTag|IntTag)[][] $valueIndex + * @phpstan-param array $keyIndex + * @phpstan-param array> $valueIndex + */ + private static function deduplicateCompound(CompoundTag $tag, array &$keyIndex, array &$valueIndex) : CompoundTag{ + if($tag->count() === 0){ + return $tag; + } + + $newTag = CompoundTag::create(); + foreach($tag as $key => $value){ + $key = $keyIndex[$key] ??= $key; + + if($value instanceof CompoundTag){ + $value = self::deduplicateCompound($value, $keyIndex, $valueIndex); + }elseif($value instanceof ByteTag || $value instanceof IntTag || $value instanceof StringTag){ + $value = $valueIndex[$value->getType()][$value->getValue()] ??= $value; + } + + $newTag->setTag($key, $value); + } + + return $newTag; + } + public function __construct(string $canonicalBlockStatesFile, string $r12ToCurrentBlockMapFile){ $stream = new BinaryStream(Filesystem::fileGetContents($canonicalBlockStatesFile)); $list = []; $nbtReader = new NetworkNbtSerializer(); + + $keyIndex = []; + $valueIndex = []; while(!$stream->feof()){ $offset = $stream->getOffset(); $blockState = $nbtReader->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); $stream->setOffset($offset); - $list[] = $blockState; + $list[] = self::deduplicateCompound($blockState, $keyIndex, $valueIndex); } $this->bedrockKnownStates = $list; From 633e77a34cf9741a48fd9b5f19e3c83d24fdb02b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 May 2023 23:21:54 +0100 Subject: [PATCH 0966/1858] RuntimeBlockMapping: share states CompoundTags if they are the same this allows saving about 4 MB of memory, because there are many blocks which have identical states, although they have different IDs. this relies on a potentially risky assumption that the tags in knownStates won't be modified. If they are modified, the changes will influence all blockstates which share the tag. However, I don't expect this to happen, and the 4 MB memory saving is substantial enough to be worth the risk. --- src/network/mcpe/convert/RuntimeBlockMapping.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 64984c3c18..c2123364b3 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -27,10 +27,12 @@ use pocketmine\block\Block; use pocketmine\block\BlockLegacyIds; use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\LegacyBlockIdToStringIdMap; +use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; +use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\BinaryStream; use pocketmine\utils\Filesystem; @@ -72,7 +74,7 @@ final class RuntimeBlockMapping{ $key = $keyIndex[$key] ??= $key; if($value instanceof CompoundTag){ - $value = self::deduplicateCompound($value, $keyIndex, $valueIndex); + $value = $valueIndex[$value->getType()][(new LittleEndianNbtSerializer())->write(new TreeRoot($value))] ??= self::deduplicateCompound($value, $keyIndex, $valueIndex); }elseif($value instanceof ByteTag || $value instanceof IntTag || $value instanceof StringTag){ $value = $valueIndex[$value->getType()][$value->getValue()] ??= $value; } From 4f32f5e0b71e2dc37d03671bde8ec87f036d4983 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 13:41:06 +0100 Subject: [PATCH 0967/1858] BlockStateDictionaryEntry: encode property names as well as values sadly we need these to reconstruct the state upon deserialization --- src/network/mcpe/convert/BlockStateDictionaryEntry.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 57cc29c0c3..8c6244da58 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -25,9 +25,9 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\nbt\TreeRoot; -use function array_map; use function count; use function ksort; use const SORT_STRING; @@ -74,7 +74,7 @@ final class BlockStateDictionaryEntry{ if($rawProperties === ""){ return []; } - return array_map(fn(TreeRoot $root) => $root->getTag(), (new LittleEndianNbtSerializer())->readMultiple($rawProperties)); + return (new LittleEndianNbtSerializer())->read($rawProperties)->mustGetCompoundTag()->getValue(); } /** @@ -86,6 +86,10 @@ final class BlockStateDictionaryEntry{ } //TODO: make a more efficient encoding - NBT will do for now, but it's not very compact ksort($properties, SORT_STRING); - return (new LittleEndianNbtSerializer())->writeMultiple(array_map(fn(Tag $tag) => new TreeRoot($tag), $properties)); + $tag = new CompoundTag(); + foreach($properties as $k => $v){ + $tag->setTag($k, $v); + } + return (new LittleEndianNbtSerializer())->write(new TreeRoot($tag)); } } From 289ede669d71d20a9842c461e6d9bcb9ddc87a75 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 14:47:23 +0100 Subject: [PATCH 0968/1858] BlockTranslator: use less ambiguous function names --- src/block/tile/FlowerPot.php | 2 +- src/entity/object/FallingBlock.php | 2 +- src/network/mcpe/convert/BlockTranslator.php | 6 +++--- src/network/mcpe/serializer/ChunkSerializer.php | 4 ++-- src/world/World.php | 4 ++-- src/world/particle/BlockBreakParticle.php | 2 +- src/world/particle/BlockPunchParticle.php | 2 +- src/world/particle/FloatingTextParticle.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/network/mcpe/convert/BlockTranslatorTest.php | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 9a05a8cd00..5d114f6631 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -95,7 +95,7 @@ class FlowerPot extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setTag(self::TAG_PLANT_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->toStateData($this->plant->getStateId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkStateData($this->plant->getStateId())->toNbt()); } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 10f53fc5df..9d8af89347 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -197,7 +197,7 @@ class FallingBlock extends Entity{ protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); - $properties->setInt(EntityMetadataProperties::VARIANT, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId())); + $properties->setInt(EntityMetadataProperties::VARIANT, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId())); } public function getOffsetPosition(Vector3 $vector3) : Vector3{ diff --git a/src/network/mcpe/convert/BlockTranslator.php b/src/network/mcpe/convert/BlockTranslator.php index d3f07fb303..a14c89d135 100644 --- a/src/network/mcpe/convert/BlockTranslator.php +++ b/src/network/mcpe/convert/BlockTranslator.php @@ -54,7 +54,7 @@ final class BlockTranslator{ $this->fallbackStateData = $this->blockStateDictionary->generateDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); } - public function toRuntimeId(int $internalStateId) : int{ + public function internalIdToNetworkId(int $internalStateId) : int{ if(isset($this->networkIdCache[$internalStateId])){ return $this->networkIdCache[$internalStateId]; } @@ -78,11 +78,11 @@ final class BlockTranslator{ /** * Looks up the network state data associated with the given internal state ID. */ - public function toStateData(int $internalStateId) : BlockStateData{ + public function internalIdToNetworkStateData(int $internalStateId) : BlockStateData{ //we don't directly use the blockstate serializer here - we can't assume that the network blockstate NBT is the //same as the disk blockstate NBT, in case we decide to have different world version than network version (or in //case someone wants to implement multi version). - $networkRuntimeId = $this->toRuntimeId($internalStateId); + $networkRuntimeId = $this->internalIdToNetworkId($internalStateId); return $this->blockStateDictionary->generateDataFromStateId($networkRuntimeId) ?? throw new AssumptionFailedError("We just looked up this state ID, so it must exist"); } diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index 84682e114e..afda6b7bbc 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -109,7 +109,7 @@ final class ChunkSerializer{ $nbtSerializer = new NetworkNbtSerializer(); foreach($palette as $p){ //TODO: introduce a binary cache for this - $state = $blockStateDictionary->generateDataFromStateId($blockTranslator->toRuntimeId($p)); + $state = $blockStateDictionary->generateDataFromStateId($blockTranslator->internalIdToNetworkId($p)); if($state === null){ $state = $blockTranslator->getFallbackStateData(); } @@ -118,7 +118,7 @@ final class ChunkSerializer{ } }else{ foreach($palette as $p){ - $stream->put(Binary::writeUnsignedVarInt($blockTranslator->toRuntimeId($p) << 1)); + $stream->put(Binary::writeUnsignedVarInt($blockTranslator->internalIdToNetworkId($p) << 1)); } } } diff --git a/src/world/World.php b/src/world/World.php index a965974b7c..8707fc47aa 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1074,7 +1074,7 @@ class World implements ChunkManager{ $tile = $this->getTileAt($b->x, $b->y, $b->z); if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){ - $originalStateData = $blockTranslator->toStateData($fullBlock->getStateId()); + $originalStateData = $blockTranslator->internalIdToNetworkStateData($fullBlock->getStateId()); $fakeStateData = new BlockStateData( $originalStateData->getName(), array_merge($originalStateData->getStates(), $fakeStateProperties), @@ -1089,7 +1089,7 @@ class World implements ChunkManager{ } $packets[] = UpdateBlockPacket::create( $blockPosition, - $blockTranslator->toRuntimeId($fullBlock->getStateId()), + $blockTranslator->internalIdToNetworkId($fullBlock->getStateId()), UpdateBlockPacket::FLAG_NETWORK, UpdateBlockPacket::DATA_LAYER_NORMAL ); diff --git a/src/world/particle/BlockBreakParticle.php b/src/world/particle/BlockBreakParticle.php index b9cec0e781..f3814c5fbf 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, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/particle/BlockPunchParticle.php b/src/world/particle/BlockPunchParticle.php index c8affffc53..74478ca95c 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, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) | ($this->face << 24), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()) | ($this->face << 24), $pos)]; } } diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index a50aeef3ae..e8220d1908 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -95,7 +95,7 @@ class FloatingTextParticle implements Particle{ EntityMetadataProperties::BOUNDING_BOX_WIDTH => new FloatMetadataProperty(0.0), EntityMetadataProperties::BOUNDING_BOX_HEIGHT => new FloatMetadataProperty(0.0), EntityMetadataProperties::NAMETAG => new StringMetadataProperty($name), - EntityMetadataProperties::VARIANT => new IntMetadataProperty(TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), + EntityMetadataProperties::VARIANT => new IntMetadataProperty(TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId(VanillaBlocks::AIR()->getStateId())), EntityMetadataProperties::ALWAYS_SHOW_NAMETAG => new ByteMetadataProperty(1), ]; $p[] = AddActorPacket::create( diff --git a/src/world/particle/TerrainParticle.php b/src/world/particle/TerrainParticle.php index 0eb1f04949..b0ac9debda 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, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; + return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/sound/BlockBreakSound.php b/src/world/sound/BlockBreakSound.php index 6cdc5471e0..ba3ec893ed 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, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPlaceSound.php b/src/world/sound/BlockPlaceSound.php index 80704a9572..5efe8a384c 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, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPunchSound.php b/src/world/sound/BlockPunchSound.php index 33754b93ed..8fee7875b6 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, - TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()) )]; } } diff --git a/src/world/sound/EntityLandSound.php b/src/world/sound/EntityLandSound.php index dd23b571fd..998c5ed02a 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, - TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->blockLandedOn->getStateId()), + TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($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 4ab7e10a03..7daba166e5 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, - TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()) )]; } } diff --git a/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php b/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php index f2dc6cceac..ef8e297c44 100644 --- a/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php +++ b/tests/phpunit/network/mcpe/convert/BlockTranslatorTest.php @@ -34,7 +34,7 @@ class BlockTranslatorTest extends TestCase{ public function testAllBlockStatesSerialize() : void{ $blockTranslator = TypeConverter::getInstance()->getBlockTranslator(); foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $state){ - $blockTranslator->toRuntimeId($state->getStateId()); + $blockTranslator->internalIdToNetworkId($state->getStateId()); } } } From 09e823e304074da2eacccafa4aa8405ff1be9f66 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 14:52:21 +0100 Subject: [PATCH 0969/1858] BlockStateDictionary: remove useless indirection --- .../mcpe/convert/BlockStateDictionary.php | 32 +++++++- .../mcpe/convert/BlockStateLookupCache.php | 78 ------------------- 2 files changed, 29 insertions(+), 81 deletions(-) delete mode 100644 src/network/mcpe/convert/BlockStateLookupCache.php diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 834390538c..e52c7d3d37 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -28,7 +28,10 @@ use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\utils\Utils; +use function array_key_first; use function array_map; +use function count; use function get_debug_type; use function is_array; use function is_int; @@ -40,8 +43,12 @@ use const JSON_THROW_ON_ERROR; * Handles translation of network block runtime IDs into blockstate data, and vice versa */ final class BlockStateDictionary{ + /** + * @var int[][]|int[] + * @phpstan-var array|int> + */ + private array $stateDataToStateIdLookup = []; - private BlockStateLookupCache $stateDataToStateIdLookupCache; /** * @var int[][]|null * @phpstan-var array>|null @@ -56,7 +63,19 @@ final class BlockStateDictionary{ public function __construct( private array $states ){ - $this->stateDataToStateIdLookupCache = new BlockStateLookupCache($this->states); + $table = []; + foreach($this->states as $stateId => $stateNbt){ + $table[$stateNbt->getStateName()][$stateNbt->getRawStateProperties()] = $stateId; + } + + //setup fast path for stateless blocks + foreach(Utils::stringifyKeys($table) as $name => $stateIds){ + if(count($stateIds) === 1){ + $this->stateDataToStateIdLookup[$name] = $stateIds[array_key_first($stateIds)]; + }else{ + $this->stateDataToStateIdLookup[$name] = $stateIds; + } + } } /** @@ -85,7 +104,14 @@ final class BlockStateDictionary{ * Returns null if there were no matches. */ public function lookupStateIdFromData(BlockStateData $data) : ?int{ - return $this->stateDataToStateIdLookupCache->lookupStateId($data); + $name = $data->getName(); + + $lookup = $this->stateDataToStateIdLookup[$name] ?? null; + return match(true){ + $lookup === null => null, + is_int($lookup) => $lookup, + is_array($lookup) => $lookup[BlockStateDictionaryEntry::encodeStateProperties($data->getStates())] ?? null + }; } /** diff --git a/src/network/mcpe/convert/BlockStateLookupCache.php b/src/network/mcpe/convert/BlockStateLookupCache.php deleted file mode 100644 index 16cf0ef0e2..0000000000 --- a/src/network/mcpe/convert/BlockStateLookupCache.php +++ /dev/null @@ -1,78 +0,0 @@ -|int> - */ - private array $nameToNetworkIdsLookup = []; - - /** - * @param BlockStateDictionaryEntry[] $blockStates - * @phpstan-param list $blockStates - */ - public function __construct(array $blockStates){ - $table = []; - foreach($blockStates as $stateId => $stateNbt){ - $table[$stateNbt->getStateName()][$stateNbt->getRawStateProperties()] = $stateId; - } - - //setup fast path for stateless blocks - foreach(Utils::stringifyKeys($table) as $name => $stateIds){ - if(count($stateIds) === 1){ - $this->nameToNetworkIdsLookup[$name] = $stateIds[array_key_first($stateIds)]; - }else{ - $this->nameToNetworkIdsLookup[$name] = $stateIds; - } - } - } - - /** - * Searches for the appropriate state ID which matches the given blockstate NBT. - * Returns null if there were no matches. - */ - public function lookupStateId(BlockStateData $data) : ?int{ - $name = $data->getName(); - - $lookup = $this->nameToNetworkIdsLookup[$name] ?? null; - return match(true){ - $lookup === null => null, - is_int($lookup) => $lookup, - is_array($lookup) => $lookup[BlockStateDictionaryEntry::encodeStateProperties($data->getStates())] ?? null - }; - } -} From f2c6a75145ce62645122ed6055abf1105bce5413 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 15:26:54 +0100 Subject: [PATCH 0970/1858] BlockStateDictionary: reduce memory footprint of id/meta -> state ID lookup by >60% the aim of the game here is to avoid allocating lots of tiny arrays, which have a terrible overhead:useful-data ratio. This reduces the footprint of the mapping from 1.6 MB to 600 KB. --- .../mcpe/convert/BlockStateDictionary.php | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index e52c7d3d37..d20448f95c 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -51,7 +51,7 @@ final class BlockStateDictionary{ /** * @var int[][]|null - * @phpstan-var array>|null + * @phpstan-var array|int>|null */ private ?array $idMetaToStateIdLookupCache = null; @@ -80,15 +80,25 @@ final class BlockStateDictionary{ /** * @return int[][] - * @phpstan-return array> + * @phpstan-return array|int> */ private function getIdMetaToStateIdLookup() : array{ if($this->idMetaToStateIdLookupCache === null){ + $table = []; //TODO: if we ever allow mutating the dictionary, this would need to be rebuilt on modification - $this->idMetaToStateIdLookupCache = []; foreach($this->states as $i => $state){ - $this->idMetaToStateIdLookupCache[$state->getMeta()][$state->getStateName()] = $i; + $table[$state->getStateName()][$state->getMeta()] = $i; + } + + $this->idMetaToStateIdLookupCache = []; + foreach(Utils::stringifyKeys($table) as $name => $metaToStateId){ + //if only one meta value exists + if(count($metaToStateId) === 1){ + $this->idMetaToStateIdLookupCache[$name] = $metaToStateId[array_key_first($metaToStateId)]; + }else{ + $this->idMetaToStateIdLookupCache[$name] = $metaToStateId; + } } } @@ -127,7 +137,12 @@ final class BlockStateDictionary{ * This is used for deserializing crafting recipe inputs. */ public function lookupStateIdFromIdMeta(string $id, int $meta) : ?int{ - return $this->getIdMetaToStateIdLookup()[$meta][$id] ?? null; + $metas = $this->getIdMetaToStateIdLookup()[$id] ?? null; + return match(true){ + $metas === null => null, + is_int($metas) => $metas, + is_array($metas) => $metas[$meta] ?? null + }; } /** From 84a943bcec2d3f79a5edbc4acc345f7c20ab8b9d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 16:06:37 +0100 Subject: [PATCH 0971/1858] BaseInventory: slap a TODO on isSlotEmpty() --- src/inventory/BaseInventory.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 433fcbf879..308850ffd7 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -172,6 +172,10 @@ abstract class BaseInventory implements Inventory{ return -1; } + /** + * TODO: make this abstract and force implementations to implement it properly (BC break) + * This default implementation works, but is slow. + */ public function isSlotEmpty(int $index) : bool{ return $this->getItem($index)->isNull(); } From 02cf5ed388c246e1177e4b3fe07eed0d5a3ac405 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 16:18:03 +0100 Subject: [PATCH 0972/1858] RuntimeBlockMapping: lazy-load NBT blockstates this saves a considerable amount of memory. we don't actually need this state array in PM4 anyway, since we don't support the client-side chunk cache yet. when the time comes to support it, it'll be much more practical to cache binary states and copy bytes anyway, instead of doing it the current way, which is both slow and memory-intensive. Measured footprint change: 9 MB -> 400 KB. --- .../mcpe/convert/RuntimeBlockMapping.php | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index c2123364b3..1ad2c5ff7c 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -48,8 +48,8 @@ final class RuntimeBlockMapping{ private array $legacyToRuntimeMap = []; /** @var int[] */ private array $runtimeToLegacyMap = []; - /** @var CompoundTag[] */ - private array $bedrockKnownStates; + /** @var CompoundTag[]|null */ + private ?array $bedrockKnownStates = null; private static function make() : self{ return new self( @@ -85,25 +85,13 @@ final class RuntimeBlockMapping{ return $newTag; } - public function __construct(string $canonicalBlockStatesFile, string $r12ToCurrentBlockMapFile){ - $stream = new BinaryStream(Filesystem::fileGetContents($canonicalBlockStatesFile)); - $list = []; - $nbtReader = new NetworkNbtSerializer(); + public function __construct( + private string $canonicalBlockStatesFile, + string $r12ToCurrentBlockMapFile + ){ + //do not cache this - we only need it to set up mappings under normal circumstances + $bedrockKnownStates = $this->loadBedrockKnownStates(); - $keyIndex = []; - $valueIndex = []; - while(!$stream->feof()){ - $offset = $stream->getOffset(); - $blockState = $nbtReader->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); - $stream->setOffset($offset); - $list[] = self::deduplicateCompound($blockState, $keyIndex, $valueIndex); - } - $this->bedrockKnownStates = $list; - - $this->setupLegacyMappings($r12ToCurrentBlockMapFile); - } - - private function setupLegacyMappings(string $r12ToCurrentBlockMapFile) : void{ $legacyIdMap = LegacyBlockIdToStringIdMap::getInstance(); /** @var R12ToCurrentBlockMapEntry[] $legacyStateMap */ $legacyStateMap = []; @@ -123,7 +111,7 @@ final class RuntimeBlockMapping{ * @var int[][] $idToStatesMap string id -> int[] list of candidate state indices */ $idToStatesMap = []; - foreach($this->bedrockKnownStates as $k => $state){ + foreach($bedrockKnownStates as $k => $state){ $idToStatesMap[$state->getString("name")][] = $k; } foreach($legacyStateMap as $pair){ @@ -142,7 +130,7 @@ final class RuntimeBlockMapping{ throw new \RuntimeException("Mapped new state does not appear in network table"); } foreach($idToStatesMap[$mappedName] as $k){ - $networkState = $this->bedrockKnownStates[$k]; + $networkState = $bedrockKnownStates[$k]; if($mappedState->equals($networkState)){ $this->registerMapping($k, $id, $data); continue 2; @@ -152,6 +140,25 @@ final class RuntimeBlockMapping{ } } + /** + * @return CompoundTag[] + */ + private function loadBedrockKnownStates() : array{ + $stream = new BinaryStream(Filesystem::fileGetContents($this->canonicalBlockStatesFile)); + $list = []; + $nbtReader = new NetworkNbtSerializer(); + + $keyIndex = []; + $valueIndex = []; + while(!$stream->feof()){ + $offset = $stream->getOffset(); + $blockState = $nbtReader->read($stream->getBuffer(), $offset)->mustGetCompoundTag(); + $stream->setOffset($offset); + $list[] = self::deduplicateCompound($blockState, $keyIndex, $valueIndex); + } + return $list; + } + public function toRuntimeId(int $internalStateId) : int{ return $this->legacyToRuntimeMap[$internalStateId] ?? $this->legacyToRuntimeMap[BlockLegacyIds::INFO_UPDATE << Block::INTERNAL_METADATA_BITS]; } @@ -166,9 +173,14 @@ final class RuntimeBlockMapping{ } /** + * WARNING: This method may load the palette from disk, which is a slow operation. + * Afterwards, it will cache the palette in memory, which requires (in some cases) tens of MB of memory. + * Avoid using this where possible. + * + * @deprecated * @return CompoundTag[] */ public function getBedrockKnownStates() : array{ - return $this->bedrockKnownStates; + return $this->bedrockKnownStates ??= $this->loadBedrockKnownStates(); } } From 8a374df80191e9830f11d5d5db7b13e21da86dbe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 May 2023 17:02:50 +0100 Subject: [PATCH 0973/1858] BlockTranslator: remove useless call to generateDataFromStateId() BlockStateDictionary doesn't retain BlockStateData anymore, so this optimisation is just wasting CPU cycles. --- src/network/mcpe/convert/BlockTranslator.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/network/mcpe/convert/BlockTranslator.php b/src/network/mcpe/convert/BlockTranslator.php index a14c89d135..4113f86ce4 100644 --- a/src/network/mcpe/convert/BlockTranslator.php +++ b/src/network/mcpe/convert/BlockTranslator.php @@ -47,11 +47,9 @@ final class BlockTranslator{ private BlockStateDictionary $blockStateDictionary, private BlockStateSerializer $blockStateSerializer ){ - $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData( - BlockStateData::current(BlockTypeNames::INFO_UPDATE, []) - ) ?? throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); - //lookup the state data from the dictionary to avoid keeping two copies of the same data around - $this->fallbackStateData = $this->blockStateDictionary->generateDataFromStateId($this->fallbackStateId) ?? throw new AssumptionFailedError("We just looked up this state data, so it must exist"); + $this->fallbackStateData = BlockStateData::current(BlockTypeNames::INFO_UPDATE, []); + $this->fallbackStateId = $this->blockStateDictionary->lookupStateIdFromData($this->fallbackStateData) ?? + throw new AssumptionFailedError(BlockTypeNames::INFO_UPDATE . " should always exist"); } public function internalIdToNetworkId(int $internalStateId) : int{ From d04da9b1d8292e8f5b8ca699ba68917d3b3a8f7c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 15:42:52 +0100 Subject: [PATCH 0974/1858] Reuse timings handlers for event handlers of the same events due to direct repeated usage of registerEvent() with closures, we've seen some libraries like muqsit/SimplePacketHandler generate very large timings reports, because a new timings handler gets created every time a plugin registers or unregisters a new packet handler callback. This change fixes the problem by ensuring that any handlers derived from the same function, handling the same event class, will share the same timer. --- src/plugin/PluginManager.php | 4 ++-- src/timings/Timings.php | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index d109b23fac..725c915a1e 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -37,7 +37,7 @@ use pocketmine\permission\DefaultPermissions; use pocketmine\permission\PermissionManager; use pocketmine\permission\PermissionParser; use pocketmine\Server; -use pocketmine\timings\TimingsHandler; +use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; @@ -651,7 +651,7 @@ class PluginManager{ throw new PluginException("Plugin attempted to register event handler " . $handlerName . "() to event " . $event . " while not enabled"); } - $timings = new TimingsHandler($handlerName . "(" . (new \ReflectionClass($event))->getShortName() . ")", group: $plugin->getDescription()->getFullName()); + $timings = Timings::getEventHandlerTimings($event, $handlerName, $plugin->getDescription()->getFullName()); $registeredListener = new RegisteredListener($handler, $priority, $plugin, $handleCancelled, $timings); HandlerListManager::global()->getListFor($event)->register($registeredListener); diff --git a/src/timings/Timings.php b/src/timings/Timings.php index a400a73b4f..74fa40dde5 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -166,6 +166,8 @@ abstract class Timings{ /** @var TimingsHandler[] */ private static array $events = []; + /** @var TimingsHandler[][] */ + private static array $eventHandlers = []; public static function init() : void{ if(self::$initialized){ @@ -336,4 +338,16 @@ abstract class Timings{ return self::$events[$eventClass]; } + + /** + * @phpstan-template TEvent of Event + * @phpstan-param class-string $event + */ + public static function getEventHandlerTimings(string $event, string $handlerName, string $group) : TimingsHandler{ + if(!isset(self::$eventHandlers[$event][$handlerName])){ + self::$eventHandlers[$event][$handlerName] = new TimingsHandler($handlerName . "(" . self::shortenCoreClassName($event, "pocketmine\\event\\") . ")", group: $group); + } + + return self::$eventHandlers[$event][$handlerName]; + } } From 4caa2c7690464d1be77f53294f6644087f8e3e39 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 15:54:11 +0100 Subject: [PATCH 0975/1858] NetworkSession: send FLYING flag on spectator ability layer fixes #5722 I'm not very clear why this works. PM doesn't use real spectator mode yet (we're still using the faux spectator mode PM has had for years, because I haven't yet assessed how real spectator mode will affect stuff like block interactions), so this ability layer shouldn't have any effect. thank you @Alemiz112 --- src/network/mcpe/NetworkSession.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index bff5875b7b..1b90547e7c 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -894,6 +894,12 @@ class NetworkSession{ [ //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), + + //TODO: HACK! In 1.19.80, the client starts falling in our faux spectator mode when it clips into a + //block. I have no idea why this works, since we don't actually use the real spectator mode. + new AbilitiesLayer(AbilitiesLayer::LAYER_SPECTATOR, [ + AbilitiesLayer::ABILITY_FLYING => true, + ], null, null) ] ))); } From fa715a074ab8af61bae4c0b754785d5f91288563 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 16:56:39 +0100 Subject: [PATCH 0976/1858] Fixed TimingsHandler depth not getting reset when timings is disabled When timings was disabled, internalStopTiming is not called, and timer depth is not decremented. If timings is later reenabled, the next call to internalStartTiming will think the timer is already running, and won't generate any new records for the timer. This has led to broken timings reports with missing Full Server Tick entries, amongst other things. --- src/timings/TimingsHandler.php | 5 +++-- src/timings/TimingsRecord.php | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index be4979f15e..9a8234310d 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -111,7 +111,7 @@ class TimingsHandler{ } public static function reload() : void{ - TimingsRecord::clearRecords(); + TimingsRecord::reset(); if(self::$enabled){ self::$timingStart = hrtime(true); } @@ -219,8 +219,9 @@ class TimingsHandler{ /** * @internal */ - public function destroyCycles() : void{ + public function reset() : void{ $this->rootRecord = null; $this->recordsByParent = []; + $this->timingDepth = 0; } } diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index 5254d2e7d0..f09984b5b8 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -42,9 +42,12 @@ final class TimingsRecord{ private static ?self $currentRecord = null; - public static function clearRecords() : void{ + /** + * @internal + */ + public static function reset() : void{ foreach(self::$records as $record){ - $record->handler->destroyCycles(); + $record->handler->reset(); } self::$records = []; self::$currentRecord = null; From 325ffec1be433cd0ad6321044d23f0efd3e6efee Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:01:49 +0100 Subject: [PATCH 0977/1858] Release 4.20.3 --- changelogs/4.20.md | 13 +++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/changelogs/4.20.md b/changelogs/4.20.md index 4a91ab440e..bc8c931b2a 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -51,3 +51,16 @@ Released 4th May 2023. ## Fixes - Fixed all types of wooden logs appearing as oak in the inventory. - Fixed a performance issue in `BaseInventory->canAddItem()` (missing `continue` causing useless logic to run). + +# 4.20.3 +Released 6th May 2023. + +## Improvements +- Reduced memory usage of `RuntimeBlockMapping` from 25 MB to 9 MB. Since every thread has its own copy of the block map, this saves a substantial amount of memory. + +## Fixes +- Fixed players falling through blocks in spectator mode. +- Fixed timings reports getting bloated by prolific usage of `PluginManager->registerEvent()`. + - This was caused by creating a new timings handler for each call, regardless of whether a timer already existed for the given event and callback. +- Fixed `Full Server Tick` and other records being missing from timings reports. + - This was caused by timings handler depth not getting reset when timings was disabled and later re-enabled. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index df44e69827..879ea817c0 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.20.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 3b893961e4414f66686dfbb2a6860043e0235552 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:01:49 +0100 Subject: [PATCH 0978/1858] 4.20.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 879ea817c0..0b72d7f9ef 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.20.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 7cdf6b094655bce88a2c78f75247b0649875e4e4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:29:59 +0100 Subject: [PATCH 0979/1858] Fixed merge error --- src/inventory/SimpleInventory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inventory/SimpleInventory.php b/src/inventory/SimpleInventory.php index 19fd6da34c..4b44326fa1 100644 --- a/src/inventory/SimpleInventory.php +++ b/src/inventory/SimpleInventory.php @@ -86,7 +86,7 @@ class SimpleInventory extends BaseInventory{ protected function getMatchingItemCount(int $slot, Item $test, bool $checkTags) : int{ $slotItem = $this->slots[$slot]; - return $slotItem !== null && $slotItem->equals($test, $checkDamage, $checkTags) ? $slotItem->getCount() : 0; + return $slotItem !== null && $slotItem->equals($test, true, $checkTags) ? $slotItem->getCount() : 0; } public function isSlotEmpty(int $index) : bool{ From e0a6ec0c24281f81d78e23a48f9e303bbd8282cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:47:09 +0100 Subject: [PATCH 0980/1858] Start deglobalizing TypeConverter there's a bunch of places we can't reach with this right now: - particles - sounds - tile NBT - entity metadata - crafting data cache - chunk encoding - world block update encoding this is a work in progress, but ultimately we want to get rid of these singletons entirely. --- src/Server.php | 14 ++++++++------ src/entity/Human.php | 3 ++- src/entity/object/ItemEntity.php | 5 +++-- src/network/mcpe/InventoryManager.php | 13 +++++++------ src/network/mcpe/NetworkSession.php | 5 ++++- .../mcpe/StandardEntityEventBroadcaster.php | 9 +++++---- src/network/mcpe/handler/InGamePacketHandler.php | 4 ++-- .../mcpe/handler/PreSpawnPacketHandler.php | 8 +++++--- src/network/mcpe/raklib/RakLibInterface.php | 15 ++++++++++++++- 9 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/Server.php b/src/Server.php index 7bc67aa380..53c3c05a98 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1174,11 +1174,12 @@ class Server{ bool $useQuery, PacketBroadcaster $packetBroadcaster, EntityEventBroadcaster $entityEventBroadcaster, - PacketSerializerContext $packetSerializerContext + PacketSerializerContext $packetSerializerContext, + TypeConverter $typeConverter ) : bool{ $prettyIp = $ipV6 ? "[$ip]" : $ip; try{ - $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext)); + $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter)); }catch(NetworkInterfaceStartException $e){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_networkStartFailed( $ip, @@ -1204,15 +1205,16 @@ class Server{ private function startupPrepareNetworkInterfaces() : bool{ $useQuery = $this->configGroup->getConfigBool("enable-query", true); - $packetSerializerContext = new PacketSerializerContext(TypeConverter::getInstance()->getItemTypeDictionary()); + $typeConverter = TypeConverter::getInstance(); + $packetSerializerContext = new PacketSerializerContext($typeConverter->getItemTypeDictionary()); $packetBroadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); - $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster); + $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster, $typeConverter); if( - !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext) || + !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) || ( $this->configGroup->getConfigBool("enable-ipv6", true) && - !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext) + !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) ) ){ return false; diff --git a/src/entity/Human.php b/src/entity/Human.php index 38e69724b9..840ae7fc9a 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -474,6 +474,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ $networkSession->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), SkinAdapterSingleton::get()->toSkinData($this->skin))])); } + $typeConverter = $networkSession->getTypeConverter(); $networkSession->sendDataPacket(AddPlayerPacket::create( $this->getUniqueId(), $this->getName(), @@ -484,7 +485,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ $this->location->pitch, $this->location->yaw, $this->location->yaw, //TODO: head yaw - ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($this->getInventory()->getItemInHand())), + ItemStackWrapper::legacy($typeConverter->coreItemStackToNet($this->getInventory()->getItemInHand())), GameMode::SURVIVAL, $this->getAllNetworkData(), new PropertySyncData([], []), diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 81682d3bb5..3c95a9c454 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -285,10 +285,11 @@ class ItemEntity extends Entity{ } protected function sendSpawnPacket(Player $player) : void{ - $player->getNetworkSession()->sendDataPacket(AddItemActorPacket::create( + $networkSession = $player->getNetworkSession(); + $networkSession->sendDataPacket(AddItemActorPacket::create( $this->getId(), //TODO: entity unique ID $this->getId(), - ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($this->getItem())), + ItemStackWrapper::legacy($networkSession->getTypeConverter()->coreItemStackToNet($this->getItem())), $this->location->asVector3(), $this->getMotion(), $this->getAllNetworkData(), diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index fc7c6641f7..d28235821b 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -223,10 +223,11 @@ class InventoryManager{ } public function addTransactionPredictedSlotChanges(InventoryTransaction $tx) : void{ + $typeConverter = $this->session->getTypeConverter(); foreach($tx->getActions() as $action){ if($action instanceof SlotChangeAction){ //TODO: ItemStackRequestExecutor can probably build these predictions with much lower overhead - $itemStack = TypeConverter::getInstance()->coreItemStackToNet($action->getTargetItem()); + $itemStack = $typeConverter->coreItemStackToNet($action->getTargetItem()); $this->addPredictedSlotChange($action->getInventory(), $action->getSlot(), $itemStack); } } @@ -421,7 +422,7 @@ class InventoryManager{ //is cleared before removal. return; } - $currentItem = TypeConverter::getInstance()->coreItemStackToNet($inventory->getItem($slot)); + $currentItem = $this->session->getTypeConverter()->coreItemStackToNet($inventory->getItem($slot)); $clientSideItem = $inventoryEntry->predictions[$slot] ?? null; if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request @@ -497,7 +498,7 @@ class InventoryManager{ $entry->predictions = []; $entry->pendingSyncs = []; $contents = []; - $typeConverter = TypeConverter::getInstance(); + $typeConverter = $this->session->getTypeConverter(); foreach($inventory->getContents(true) as $slot => $item){ $itemStack = $typeConverter->coreItemStackToNet($item); $info = $this->trackItemStack($entry, $slot, $itemStack, null); @@ -532,7 +533,7 @@ class InventoryManager{ } public function syncMismatchedPredictedSlotChanges() : void{ - $typeConverter = TypeConverter::getInstance(); + $typeConverter = $this->session->getTypeConverter(); foreach($this->inventories as $entry){ $inventory = $entry->inventory; foreach($entry->predictions as $slot => $expectedItem){ @@ -595,7 +596,7 @@ class InventoryManager{ $this->session->sendDataPacket(MobEquipmentPacket::create( $this->player->getId(), - new ItemStackWrapper($itemStackInfo->getStackId(), TypeConverter::getInstance()->coreItemStackToNet($playerInventory->getItemInHand())), + new ItemStackWrapper($itemStackInfo->getStackId(), $this->session->getTypeConverter()->coreItemStackToNet($playerInventory->getItemInHand())), $selected, $selected, ContainerIds::INVENTORY @@ -605,7 +606,7 @@ class InventoryManager{ } public function syncCreative() : void{ - $typeConverter = TypeConverter::getInstance(); + $typeConverter = $this->session->getTypeConverter(); $entries = []; if(!$this->player->isSpectator()){ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index abab59825c..60b0efc66c 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -182,6 +182,7 @@ class NetworkSession{ private PacketBroadcaster $broadcaster, private EntityEventBroadcaster $entityEventBroadcaster, private Compressor $compressor, + private TypeConverter $typeConverter, private string $ip, private int $port ){ @@ -538,6 +539,8 @@ class NetworkSession{ return $this->compressor; } + public function getTypeConverter() : TypeConverter{ return $this->typeConverter; } + public function queueCompressed(CompressBatchPromise $payload, bool $immediate = false) : void{ Timings::$playerNetworkSend->startTiming(); try{ @@ -887,7 +890,7 @@ class NetworkSession{ } public function syncGameMode(GameMode $mode, bool $isRollback = false) : void{ - $this->sendDataPacket(SetPlayerGameTypePacket::create(TypeConverter::getInstance()->coreGameModeToProtocol($mode))); + $this->sendDataPacket(SetPlayerGameTypePacket::create($this->typeConverter->coreGameModeToProtocol($mode))); if($this->player !== null){ $this->syncAbilities($this->player); $this->syncAdventureSettings(); //TODO: we might be able to do this with the abilities packet alone diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php index da0fac6efb..30ac628f6e 100644 --- a/src/network/mcpe/StandardEntityEventBroadcaster.php +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -51,7 +51,8 @@ use const SORT_NUMERIC; final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ public function __construct( - private StandardPacketBroadcaster $broadcaster + private StandardPacketBroadcaster $broadcaster, + private TypeConverter $typeConverter ){} /** @@ -103,7 +104,7 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ $inv = $mob->getInventory(); $this->sendDataPacket($recipients, MobEquipmentPacket::create( $mob->getId(), - ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItemInHand())), + ItemStackWrapper::legacy($this->typeConverter->coreItemStackToNet($inv->getItemInHand())), $inv->getHeldItemIndex(), $inv->getHeldItemIndex(), ContainerIds::INVENTORY @@ -114,7 +115,7 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ $inv = $mob->getOffHandInventory(); $this->sendDataPacket($recipients, MobEquipmentPacket::create( $mob->getId(), - ItemStackWrapper::legacy(TypeConverter::getInstance()->coreItemStackToNet($inv->getItem(0))), + ItemStackWrapper::legacy($this->typeConverter->coreItemStackToNet($inv->getItem(0))), 0, 0, ContainerIds::OFFHAND @@ -123,7 +124,7 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ public function onMobArmorChange(array $recipients, Living $mob) : void{ $inv = $mob->getArmorInventory(); - $converter = TypeConverter::getInstance(); + $converter = $this->typeConverter; $this->sendDataPacket($recipients, MobArmorEquipmentPacket::create( $mob->getId(), ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getHelmet())), diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index d8b6caf1f5..a062dfff98 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -443,7 +443,7 @@ class InGamePacketHandler extends PacketHandler{ if($sourceSlotItem->getCount() < $droppedCount){ return false; } - $serverItemStack = TypeConverter::getInstance()->coreItemStackToNet($sourceSlotItem); + $serverItemStack = $this->session->getTypeConverter()->coreItemStackToNet($sourceSlotItem); //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known //itemstack info with the one the client sent. This is costly, but we don't have any other option :( if(!$serverItemStack->equals($clientItemStack)){ @@ -776,7 +776,7 @@ class InGamePacketHandler extends PacketHandler{ } public function handleSetPlayerGameType(SetPlayerGameTypePacket $packet) : bool{ - $gameMode = TypeConverter::getInstance()->protocolGameModeToCore($packet->gamemode); + $gameMode = $this->session->getTypeConverter()->protocolGameModeToCore($packet->gamemode); if($gameMode === null || !$gameMode->equals($this->player->getGamemode())){ //Set this back to default. TODO: handle this properly $this->session->syncGameMode($this->player->getGamemode(), true); diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 0ba686bed0..9e0adf5e14 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -65,11 +65,13 @@ class PreSpawnPacketHandler extends PacketHandler{ $location = $this->player->getLocation(); $world = $location->getWorld(); + $typeConverter = $this->session->getTypeConverter(); + $this->session->getLogger()->debug("Preparing StartGamePacket"); $levelSettings = new LevelSettings(); $levelSettings->seed = -1; $levelSettings->spawnSettings = new SpawnSettings(SpawnSettings::BIOME_TYPE_DEFAULT, "", DimensionIds::OVERWORLD); //TODO: implement this properly - $levelSettings->worldGamemode = TypeConverter::getInstance()->coreGameModeToProtocol($this->server->getGamemode()); + $levelSettings->worldGamemode = $typeConverter->coreGameModeToProtocol($this->server->getGamemode()); $levelSettings->difficulty = $world->getDifficulty(); $levelSettings->spawnPosition = BlockPosition::fromVector3($world->getSpawnLocation()); $levelSettings->hasAchievementsDisabled = true; @@ -86,7 +88,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $this->session->sendDataPacket(StartGamePacket::create( $this->player->getId(), $this->player->getId(), - TypeConverter::getInstance()->coreGameModeToProtocol($this->player->getGamemode()), + $typeConverter->coreGameModeToProtocol($this->player->getGamemode()), $this->player->getOffsetPosition($location), $location->pitch, $location->yaw, @@ -107,7 +109,7 @@ class PreSpawnPacketHandler extends PacketHandler{ false, [], 0, - TypeConverter::getInstance()->getItemTypeDictionary()->getEntries(), + $typeConverter->getItemTypeDictionary()->getEntries(), )); $this->session->getLogger()->debug("Sending actor identifiers"); diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 82d881239b..6a9f0f0b03 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe\raklib; use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; @@ -82,12 +83,23 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private PacketBroadcaster $packetBroadcaster; private EntityEventBroadcaster $entityEventBroadcaster; private PacketSerializerContext $packetSerializerContext; + private TypeConverter $typeConverter; - public function __construct(Server $server, string $ip, int $port, bool $ipV6, PacketBroadcaster $packetBroadcaster, EntityEventBroadcaster $entityEventBroadcaster, PacketSerializerContext $packetSerializerContext){ + public function __construct( + Server $server, + string $ip, + int $port, + bool $ipV6, + PacketBroadcaster $packetBroadcaster, + EntityEventBroadcaster $entityEventBroadcaster, + PacketSerializerContext $packetSerializerContext, + TypeConverter $typeConverter + ){ $this->server = $server; $this->packetBroadcaster = $packetBroadcaster; $this->packetSerializerContext = $packetSerializerContext; $this->entityEventBroadcaster = $entityEventBroadcaster; + $this->typeConverter = $typeConverter; $this->rakServerId = mt_rand(0, PHP_INT_MAX); @@ -183,6 +195,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->packetBroadcaster, $this->entityEventBroadcaster, ZlibCompressor::getInstance(), //TODO: this shouldn't be hardcoded, but we might need the RakNet protocol version to select it + $this->typeConverter, $address, $port ); From ed11fd5a83331a07ef76e4ed1524cfbca8b5fa7b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:51:00 +0100 Subject: [PATCH 0981/1858] CS again... --- src/entity/Human.php | 1 - src/entity/object/ItemEntity.php | 1 - src/network/mcpe/InventoryManager.php | 1 - src/network/mcpe/handler/InGamePacketHandler.php | 1 - src/network/mcpe/handler/PreSpawnPacketHandler.php | 1 - 5 files changed, 5 deletions(-) diff --git a/src/entity/Human.php b/src/entity/Human.php index 840ae7fc9a..7733e995f0 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -47,7 +47,6 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddPlayerPacket; diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 3c95a9c454..6e9fdcdcf3 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -34,7 +34,6 @@ use pocketmine\event\entity\ItemSpawnEvent; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddItemActorPacket; diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index d28235821b..92b3843397 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -40,7 +40,6 @@ use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; use pocketmine\network\mcpe\protocol\ContainerOpenPacket; diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index a062dfff98..d732266971 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -46,7 +46,6 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\convert\SkinAdapterSingleton; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\ActorEventPacket; diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 9e0adf5e14..036f9aed18 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\cache\CraftingDataCache; use pocketmine\network\mcpe\cache\StaticPacketCache; -use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket; From 926f68d8c5d0901337c6e93c4ef055a29a179893 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 17:53:24 +0100 Subject: [PATCH 0982/1858] Move SkinAdapter under TypeConverter, remove SkinAdapterSingleton this is legacy cruft from PM3, which didn't have TypeConverter or SingletonTrait. --- src/entity/Human.php | 8 ++-- src/network/mcpe/NetworkSession.php | 5 +-- .../mcpe/convert/SkinAdapterSingleton.php | 42 ------------------- src/network/mcpe/convert/TypeConverter.php | 10 +++++ .../mcpe/handler/InGamePacketHandler.php | 3 +- .../mcpe/handler/LoginPacketHandler.php | 3 +- 6 files changed, 18 insertions(+), 53 deletions(-) delete mode 100644 src/network/mcpe/convert/SkinAdapterSingleton.php diff --git a/src/entity/Human.php b/src/entity/Human.php index 7733e995f0..ae1aa24649 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -46,7 +46,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\network\mcpe\convert\SkinAdapterSingleton; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\AddPlayerPacket; @@ -166,7 +166,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ */ public function sendSkin(?array $targets = null) : void{ NetworkBroadcastUtils::broadcastPackets($targets ?? $this->hasSpawned, [ - PlayerSkinPacket::create($this->getUniqueId(), "", "", SkinAdapterSingleton::get()->toSkinData($this->skin)) + PlayerSkinPacket::create($this->getUniqueId(), "", "", TypeConverter::getInstance()->getSkinAdapter()->toSkinData($this->skin)) ]); } @@ -469,11 +469,11 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ protected function sendSpawnPacket(Player $player) : void{ $networkSession = $player->getNetworkSession(); + $typeConverter = $networkSession->getTypeConverter(); if(!($this instanceof Player)){ - $networkSession->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), SkinAdapterSingleton::get()->toSkinData($this->skin))])); + $networkSession->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), $typeConverter->getSkinAdapter()->toSkinData($this->skin))])); } - $typeConverter = $networkSession->getTypeConverter(); $networkSession->sendDataPacket(AddPlayerPacket::create( $this->getUniqueId(), $this->getName(), diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 60b0efc66c..6ca258bf3a 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -38,7 +38,6 @@ use pocketmine\network\mcpe\cache\ChunkCache; use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\DecompressionException; -use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\encryption\DecryptionException; use pocketmine\network\mcpe\encryption\EncryptionContext; @@ -1108,12 +1107,12 @@ class NetworkSession{ */ public function syncPlayerList(array $players) : void{ $this->sendDataPacket(PlayerListPacket::add(array_map(function(Player $player) : PlayerListEntry{ - return PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), SkinAdapterSingleton::get()->toSkinData($player->getSkin()), $player->getXuid()); + return PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), TypeConverter::getInstance()->getSkinAdapter()->toSkinData($player->getSkin()), $player->getXuid()); }, $players))); } public function onPlayerAdded(Player $p) : void{ - $this->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($p->getUniqueId(), $p->getId(), $p->getDisplayName(), SkinAdapterSingleton::get()->toSkinData($p->getSkin()), $p->getXuid())])); + $this->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($p->getUniqueId(), $p->getId(), $p->getDisplayName(), TypeConverter::getInstance()->getSkinAdapter()->toSkinData($p->getSkin()), $p->getXuid())])); } public function onPlayerRemoved(Player $p) : void{ diff --git a/src/network/mcpe/convert/SkinAdapterSingleton.php b/src/network/mcpe/convert/SkinAdapterSingleton.php deleted file mode 100644 index db2f7903a7..0000000000 --- a/src/network/mcpe/convert/SkinAdapterSingleton.php +++ /dev/null @@ -1,42 +0,0 @@ -blockItemIdMap = BlockItemIdMap::getInstance(); @@ -83,6 +85,8 @@ class TypeConverter{ GlobalItemDataHandlers::getSerializer(), GlobalItemDataHandlers::getDeserializer() ); + + $this->skinAdapter = new LegacySkinAdapter(); } public function getBlockTranslator() : BlockTranslator{ return $this->blockTranslator; } @@ -91,6 +95,12 @@ class TypeConverter{ public function getItemTranslator() : ItemTranslator{ return $this->itemTranslator; } + public function getSkinAdapter() : SkinAdapter{ return $this->skinAdapter; } + + public function setSkinAdapter(SkinAdapter $skinAdapter) : void{ + $this->skinAdapter = $skinAdapter; + } + /** * Returns a client-friendly gamemode of the specified real gamemode * This function takes care of handling gamemodes known to MCPE (as of 1.1.0.3, that includes Survival, Creative and Adventure) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index d732266971..f49a9b8176 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -45,7 +45,6 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\ActorEventPacket; @@ -837,7 +836,7 @@ class InGamePacketHandler extends PacketHandler{ $this->session->getLogger()->debug("Processing skin change request"); try{ - $skin = SkinAdapterSingleton::get()->fromSkinData($packet->skin); + $skin = $this->session->getTypeConverter()->getSkinAdapter()->fromSkinData($packet->skin); }catch(InvalidSkinException $e){ throw PacketHandlingException::wrap($e, "Invalid skin in PlayerSkinPacket"); } diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index db96023694..a8c3d4d628 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -28,7 +28,6 @@ use pocketmine\event\player\PlayerPreLoginEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\network\mcpe\auth\ProcessLoginTask; -use pocketmine\network\mcpe\convert\SkinAdapterSingleton; use pocketmine\network\mcpe\JwtException; use pocketmine\network\mcpe\JwtUtils; use pocketmine\network\mcpe\NetworkSession; @@ -72,7 +71,7 @@ class LoginPacketHandler extends PacketHandler{ $clientData = $this->parseClientData($packet->clientDataJwt); try{ - $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); + $skin = $this->session->getTypeConverter()->getSkinAdapter()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidSkin()); From aac4f6c0e11ca5bb35dfba0f6543dd08b3ec5fe5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 18:18:05 +0100 Subject: [PATCH 0983/1858] Fixed all game modes allowing flight moral of the story: do not trust that mojang things do what they say they do - the spectator ability layer always applies, regardless of whether the player is actually in spectator mode or not ... --- src/network/mcpe/NetworkSession.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 1b90547e7c..92a992ffb7 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -887,20 +887,26 @@ class NetworkSession{ AbilitiesLayer::ABILITY_PRIVILEGED_BUILDER => false, ]; + $layers = [ + //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! + new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), + ]; + if(!$for->hasBlockCollision()){ + //TODO: HACK! In 1.19.80, the client starts falling in our faux spectator mode when it clips into a + //block. We can't seem to prevent this short of forcing the player to always fly when block collision is + //disabled. Also, for some reason the client always reads flight state from this layer if present, even + //though the player isn't in spectator mode. + + $layers[] = new AbilitiesLayer(AbilitiesLayer::LAYER_SPECTATOR, [ + AbilitiesLayer::ABILITY_FLYING => true, + ], null, null); + } + $this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData( $isOp ? CommandPermissions::OPERATOR : CommandPermissions::NORMAL, $isOp ? PlayerPermissions::OPERATOR : PlayerPermissions::MEMBER, $for->getId(), - [ - //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! - new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), - - //TODO: HACK! In 1.19.80, the client starts falling in our faux spectator mode when it clips into a - //block. I have no idea why this works, since we don't actually use the real spectator mode. - new AbilitiesLayer(AbilitiesLayer::LAYER_SPECTATOR, [ - AbilitiesLayer::ABILITY_FLYING => true, - ], null, null) - ] + $layers ))); } From c3ceeeace712f4eac380b78d1851e7dfb89f557c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 18:20:18 +0100 Subject: [PATCH 0984/1858] Release 4.20.4 --- changelogs/4.20.md | 7 +++++++ src/VersionInfo.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelogs/4.20.md b/changelogs/4.20.md index bc8c931b2a..37a0ef37bc 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -64,3 +64,10 @@ Released 6th May 2023. - This was caused by creating a new timings handler for each call, regardless of whether a timer already existed for the given event and callback. - Fixed `Full Server Tick` and other records being missing from timings reports. - This was caused by timings handler depth not getting reset when timings was disabled and later re-enabled. + +# 4.20.4 +Released 6th May 2023. + +## Fixes +- Fixed players being forced into flight mode in every game mode. + - Moral of the story: do not assume anything in Mojang internals does what its name suggests... diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0b72d7f9ef..60013af1b1 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.20.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 283ff28aa91e107521d1495340f584f1766f3dae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 18:20:19 +0100 Subject: [PATCH 0985/1858] 4.20.5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 60013af1b1..d577d80693 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.20.5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From fdb3a5b121e8064f099ad1d48aa1c0e84103a2df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 7 May 2023 18:29:37 +0100 Subject: [PATCH 0986/1858] Fixed incorrect implementation of peak timings --- src/timings/TimingsHandler.php | 2 +- src/timings/TimingsRecord.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index 9a8234310d..45ce022c99 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -32,7 +32,7 @@ use function implode; use function spl_object_id; class TimingsHandler{ - private const FORMAT_VERSION = 1; + private const FORMAT_VERSION = 2; //peak timings fix private static bool $enabled = false; private static int $timingStart = 0; diff --git a/src/timings/TimingsRecord.php b/src/timings/TimingsRecord.php index f09984b5b8..2e4928d8a6 100644 --- a/src/timings/TimingsRecord.php +++ b/src/timings/TimingsRecord.php @@ -66,9 +66,6 @@ final class TimingsRecord{ if($record->curTickTotal > Server::TARGET_NANOSECONDS_PER_TICK){ $record->violations += (int) floor($record->curTickTotal / Server::TARGET_NANOSECONDS_PER_TICK); } - if($record->curTickTotal > $record->peakTime){ - $record->peakTime = $record->curTickTotal; - } $record->curTickTotal = 0; $record->curCount = 0; $record->ticksActive++; @@ -126,7 +123,7 @@ final class TimingsRecord{ public function getTicksActive() : int{ return $this->ticksActive; } - public function getPeakTime() : float{ return $this->peakTime; } + public function getPeakTime() : int{ return $this->peakTime; } public function startTiming(int $now) : void{ $this->start = $now; @@ -152,6 +149,9 @@ final class TimingsRecord{ ++$this->curCount; ++$this->count; $this->start = 0; + if($diff > $this->peakTime){ + $this->peakTime = $diff; + } } public static function getCurrentRecord() : ?self{ From 6f0eb019d2797155ee6533cce02d016886fd88b9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 7 May 2023 19:28:07 +0100 Subject: [PATCH 0987/1858] ItemIdMetaUpgrader: added some auxiliary methods --- .../bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php | 12 ++++++++++++ src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php index 8a271e4307..0388fd1e7b 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchema.php @@ -41,6 +41,18 @@ final class ItemIdMetaUpgradeSchema{ public function getSchemaId() : int{ return $this->schemaId; } + /** + * @return string[] + * @phpstan-return array + */ + public function getRenamedIds() : array{ return $this->renamedIds; } + + /** + * @return string[][] + * @phpstan-return array> + */ + public function getRemappedMetas() : array{ return $this->remappedMetas; } + public function renameId(string $id) : ?string{ return $this->renamedIds[mb_strtolower($id, 'US-ASCII')] ?? null; } diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php index 8afd28f0e6..96980c92f4 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php @@ -57,6 +57,12 @@ final class ItemIdMetaUpgrader{ ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); } + /** + * @return ItemIdMetaUpgradeSchema[] + * @phpstan-return array + */ + public function getSchemas() : array{ return $this->idMetaUpgradeSchemas; } + /** * @phpstan-return array{string, int} */ From 077fac84bfebc35c0c8cf9d97ad9ae637f1eaca3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 May 2023 16:27:46 +0100 Subject: [PATCH 0988/1858] Added aggregate timers for all world timings this allows timings list view to display totals for these sections. It does make the tree view a bit more annoying in some cases though. --- src/timings/Timings.php | 22 +------------ src/world/World.php | 18 ++++++----- src/world/WorldManager.php | 3 -- src/world/WorldTimings.php | 63 ++++++++++++++++++++++++++------------ 4 files changed, 55 insertions(+), 51 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 74fa40dde5..70a2a03cf9 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -87,14 +87,6 @@ abstract class Timings{ /** @var TimingsHandler */ public static $serverCommand; /** @var TimingsHandler */ - public static $worldLoad; - /** @var TimingsHandler */ - public static $worldSave; - /** @var TimingsHandler */ - public static $population; - /** @var TimingsHandler */ - public static $generationCallback; - /** @var TimingsHandler */ public static $permissibleCalculation; /** @var TimingsHandler */ public static $permissibleCalculationDiff; @@ -111,10 +103,6 @@ abstract class Timings{ /** @var TimingsHandler */ public static $playerCheckNearEntities; - /** @var TimingsHandler */ - public static $tickEntity; - /** @var TimingsHandler */ - public static $tickTileEntity; /** @var TimingsHandler */ public static $entityBaseTick; @@ -203,10 +191,6 @@ abstract class Timings{ self::$playerChunkSend = new TimingsHandler("Player Network Send - Chunks", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); self::$scheduler = new TimingsHandler("Scheduler"); self::$serverCommand = new TimingsHandler("Server Command"); - self::$worldLoad = new TimingsHandler("World Load"); - self::$worldSave = new TimingsHandler("World Save"); - self::$population = new TimingsHandler("World Population"); - self::$generationCallback = new TimingsHandler("World Generation Callback"); self::$permissibleCalculation = new TimingsHandler("Permissible Calculation"); self::$permissibleCalculationDiff = new TimingsHandler("Permissible Calculation - Diff", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); self::$permissibleCalculationCallback = new TimingsHandler("Permissible Calculation - Callbacks", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); @@ -221,9 +205,6 @@ abstract class Timings{ self::$projectileMoveRayTrace = new TimingsHandler("Projectile Movement - Ray Tracing", self::$projectileMove, group: self::GROUP_BREAKDOWN); self::$playerCheckNearEntities = new TimingsHandler("checkNearEntities", group: self::GROUP_BREAKDOWN); - self::$tickEntity = new TimingsHandler("Entity Tick", group: self::GROUP_BREAKDOWN); - self::$tickTileEntity = new TimingsHandler("Block Entity Tick", group: self::GROUP_BREAKDOWN); - self::$entityBaseTick = new TimingsHandler("Entity Base Tick", group: self::GROUP_BREAKDOWN); self::$livingEntityBaseTick = new TimingsHandler("Entity Base Tick - Living", group: self::GROUP_BREAKDOWN); self::$itemEntityBaseTick = new TimingsHandler("Entity Base Tick - ItemEntity", group: self::GROUP_BREAKDOWN); @@ -272,7 +253,7 @@ abstract class Timings{ }else{ $displayName = self::shortenCoreClassName($entity::class, "pocketmine\\entity\\"); } - self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName, self::$tickEntity, group: self::GROUP_BREAKDOWN); + self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName, group: self::GROUP_BREAKDOWN); } return self::$entityTypeTimingMap[$entity::class]; @@ -282,7 +263,6 @@ abstract class Timings{ if(!isset(self::$tileEntityTypeTimingMap[$tile::class])){ self::$tileEntityTypeTimingMap[$tile::class] = new TimingsHandler( "Block Entity Tick - " . self::shortenCoreClassName($tile::class, "pocketmine\\block\\tile\\"), - self::$tickTileEntity, group: self::GROUP_BREAKDOWN ); } diff --git a/src/world/World.php b/src/world/World.php index 1803c03f14..ef62cb9876 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -77,7 +77,6 @@ use pocketmine\promise\PromiseResolver; use pocketmine\scheduler\AsyncPool; use pocketmine\Server; use pocketmine\ServerConfigGroup; -use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Limits; use pocketmine\utils\ReversePriorityQueue; @@ -999,7 +998,6 @@ class World implements ChunkManager{ $this->timings->entityTick->startTiming(); //Update entities that need update - Timings::$tickEntity->startTiming(); foreach($this->updateEntities as $id => $entity){ if($entity->isClosed() || $entity->isFlaggedForDespawn() || !$entity->onUpdate($currentTick)){ unset($this->updateEntities[$id]); @@ -1008,7 +1006,6 @@ class World implements ChunkManager{ $entity->close(); } } - Timings::$tickEntity->stopTiming(); $this->timings->entityTick->stopTiming(); $this->timings->randomChunkUpdates->startTiming(); @@ -1439,10 +1436,15 @@ class World implements ChunkManager{ (new WorldSaveEvent($this))->call(); + $timings = $this->timings->syncDataSave; + $timings->startTiming(); + $this->provider->getWorldData()->setTime($this->time); $this->saveChunks(); $this->provider->getWorldData()->save(); + $timings->stopTiming(); + return true; } @@ -3248,7 +3250,8 @@ class World implements ChunkManager{ private function internalOrderChunkPopulation(int $chunkX, int $chunkZ, ?ChunkLoader $associatedChunkLoader, ?PromiseResolver $resolver) : Promise{ $chunkHash = World::chunkHash($chunkX, $chunkZ); - Timings::$population->startTiming(); + $timings = $this->timings->chunkPopulationOrder; + $timings->startTiming(); try{ for($xx = -1; $xx <= 1; ++$xx){ @@ -3305,7 +3308,7 @@ class World implements ChunkManager{ return $resolver->getPromise(); }finally{ - Timings::$population->stopTiming(); + $timings->stopTiming(); } } @@ -3314,7 +3317,8 @@ class World implements ChunkManager{ * @phpstan-param array $adjacentChunks */ private function generateChunkCallback(ChunkLockId $chunkLockId, int $x, int $z, Chunk $chunk, array $adjacentChunks, ChunkLoader $temporaryChunkLoader) : void{ - Timings::$generationCallback->startTiming(); + $timings = $this->timings->chunkPopulationCompletion; + $timings->startTiming(); $dirtyChunks = 0; for($xx = -1; $xx <= 1; ++$xx){ @@ -3383,7 +3387,7 @@ class World implements ChunkManager{ $this->drainPopulationRequestQueue(); } - Timings::$generationCallback->stopTiming(); + $timings->stopTiming(); } public function doChunkGarbageCollection() : void{ diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index 1124d513da..f056608d75 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -30,7 +30,6 @@ use pocketmine\event\world\WorldUnloadEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\player\ChunkSelector; use pocketmine\Server; -use pocketmine\timings\Timings; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; @@ -391,7 +390,6 @@ class WorldManager{ } private function doAutoSave() : void{ - Timings::$worldSave->startTiming(); foreach($this->worlds as $world){ foreach($world->getPlayers() as $player){ if($player->spawned){ @@ -400,6 +398,5 @@ class WorldManager{ } $world->save(false); } - Timings::$worldSave->stopTiming(); } } diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index 5a51f920b2..97ab70709f 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -38,6 +38,7 @@ class WorldTimings{ public TimingsHandler $randomChunkUpdatesChunkSelection; public TimingsHandler $doChunkGC; public TimingsHandler $entityTick; + public TimingsHandler $tileTick; public TimingsHandler $doTick; public TimingsHandler $syncChunkSend; @@ -48,33 +49,55 @@ class WorldTimings{ public TimingsHandler $syncChunkLoadFixInvalidBlocks; public TimingsHandler $syncChunkLoadEntities; public TimingsHandler $syncChunkLoadTileEntities; + + public TimingsHandler $syncDataSave; public TimingsHandler $syncChunkSave; + public TimingsHandler $chunkPopulationOrder; + public TimingsHandler $chunkPopulationCompletion; + + /** + * @var TimingsHandler[] + * @phpstan-var array + */ + private static array $aggregators = []; + + private static function newTimer(string $worldName, string $timerName) : TimingsHandler{ + $aggregator = self::$aggregators[$timerName] ??= new TimingsHandler("Worlds - $timerName"); //displayed in Minecraft primary table + + //TODO: maybe a dedicated group per world would be better? + return new TimingsHandler("$worldName - $timerName", $aggregator, Timings::GROUP_BREAKDOWN); + } + public function __construct(World $world){ - $name = $world->getFolderName() . " - "; + $name = $world->getFolderName(); - $this->setBlock = new TimingsHandler($name . "setBlock", group: Timings::GROUP_BREAKDOWN); - $this->doBlockLightUpdates = new TimingsHandler($name . "Block Light Updates", group: Timings::GROUP_BREAKDOWN); - $this->doBlockSkyLightUpdates = new TimingsHandler($name . "Sky Light Updates", group: Timings::GROUP_BREAKDOWN); + $this->setBlock = self::newTimer($name, "Set Blocks"); + $this->doBlockLightUpdates = self::newTimer($name, "Block Light Updates"); + $this->doBlockSkyLightUpdates = self::newTimer($name, "Sky Light Updates"); - $this->doChunkUnload = new TimingsHandler($name . "Unload Chunks", group: Timings::GROUP_BREAKDOWN); - $this->scheduledBlockUpdates = new TimingsHandler($name . "Scheduled Block Updates", group: Timings::GROUP_BREAKDOWN); - $this->randomChunkUpdates = new TimingsHandler($name . "Random Chunk Updates", group: Timings::GROUP_BREAKDOWN); - $this->randomChunkUpdatesChunkSelection = new TimingsHandler($name . "Random Chunk Updates - Chunk Selection", group: Timings::GROUP_BREAKDOWN); - $this->doChunkGC = new TimingsHandler($name . "Garbage Collection", group: Timings::GROUP_BREAKDOWN); - $this->entityTick = new TimingsHandler($name . "Tick Entities", group: Timings::GROUP_BREAKDOWN); + $this->doChunkUnload = self::newTimer($name, "Unload Chunks"); + $this->scheduledBlockUpdates = self::newTimer($name, "Scheduled Block Updates"); + $this->randomChunkUpdates = self::newTimer($name, "Random Chunk Updates"); + $this->randomChunkUpdatesChunkSelection = self::newTimer($name, "Random Chunk Updates - Chunk Selection"); + $this->doChunkGC = self::newTimer($name, "Garbage Collection"); + $this->entityTick = self::newTimer($name, "Entity Tick"); + $this->tileTick = self::newTimer($name, "Block Entity Tick"); + $this->doTick = self::newTimer($name, "World Tick"); - Timings::init(); //make sure the timers we want are available - $this->syncChunkSend = new TimingsHandler($name . "Player Send Chunks", Timings::$playerChunkSend, group: Timings::GROUP_BREAKDOWN); - $this->syncChunkSendPrepare = new TimingsHandler($name . "Player Send Chunk Prepare", Timings::$playerChunkSend, group: Timings::GROUP_BREAKDOWN); + $this->syncChunkSend = self::newTimer($name, "Player Send Chunks"); + $this->syncChunkSendPrepare = self::newTimer($name, "Player Send Chunk Prepare"); - $this->syncChunkLoad = new TimingsHandler($name . "Chunk Load", Timings::$worldLoad, group: Timings::GROUP_BREAKDOWN); - $this->syncChunkLoadData = new TimingsHandler($name . "Chunk Load - Data", group: Timings::GROUP_BREAKDOWN); - $this->syncChunkLoadFixInvalidBlocks = new TimingsHandler($name . "Chunk Load - Fix Invalid Blocks", group: Timings::GROUP_BREAKDOWN); - $this->syncChunkLoadEntities = new TimingsHandler($name . "Chunk Load - Entities", group: Timings::GROUP_BREAKDOWN); - $this->syncChunkLoadTileEntities = new TimingsHandler($name . "Chunk Load - TileEntities", group: Timings::GROUP_BREAKDOWN); - $this->syncChunkSave = new TimingsHandler($name . "Chunk Save", Timings::$worldSave, group: Timings::GROUP_BREAKDOWN); + $this->syncChunkLoad = self::newTimer($name, "Chunk Load"); + $this->syncChunkLoadData = self::newTimer($name, "Chunk Load - Data"); + $this->syncChunkLoadFixInvalidBlocks = self::newTimer($name, "Chunk Load - Fix Invalid Blocks"); + $this->syncChunkLoadEntities = self::newTimer($name, "Chunk Load - Entities"); + $this->syncChunkLoadTileEntities = self::newTimer($name, "Chunk Load - Block Entities"); - $this->doTick = new TimingsHandler($name . "World Tick"); + $this->syncDataSave = self::newTimer($name, "Data Save"); + $this->syncChunkSave = self::newTimer($name, "Chunk Save"); + + $this->chunkPopulationOrder = self::newTimer($name, "Chunk Population - Order"); + $this->chunkPopulationCompletion = self::newTimer($name, "Chunk Population - Completion"); } } From d317347a9b4c50283ad0dafd55f82b35eade0538 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 May 2023 16:35:30 +0100 Subject: [PATCH 0989/1858] WorldTimings: remove TODO I tried this, and it didn't really provide any information that the tree table didn't already show. --- src/world/WorldTimings.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index 97ab70709f..5c1a560112 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -65,7 +65,6 @@ class WorldTimings{ private static function newTimer(string $worldName, string $timerName) : TimingsHandler{ $aggregator = self::$aggregators[$timerName] ??= new TimingsHandler("Worlds - $timerName"); //displayed in Minecraft primary table - //TODO: maybe a dedicated group per world would be better? return new TimingsHandler("$worldName - $timerName", $aggregator, Timings::GROUP_BREAKDOWN); } From d834266635daba24eb981e014f02538100ebc792 Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Mon, 8 May 2023 18:38:07 +0200 Subject: [PATCH 0990/1858] BlockGrowEvent: add player information for bonemeal usage (#5596) this is in line with StructureGrowEvent, which also has a similar API. --- src/block/CocoaBlock.php | 6 +++--- src/block/Crops.php | 2 +- src/block/Sugarcane.php | 6 +++--- src/block/SweetBerryBush.php | 2 +- src/event/block/BlockGrowEvent.php | 18 ++++++++++++++++++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index fe4f1736bd..9aa4157b77 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -94,7 +94,7 @@ class CocoaBlock extends Transparent{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ - if($item instanceof Fertilizer && $this->grow()){ + if($item instanceof Fertilizer && $this->grow($player)){ $item->pop(); return true; @@ -119,11 +119,11 @@ class CocoaBlock extends Transparent{ } } - private function grow() : bool{ + private function grow(?Player $player = null) : bool{ if($this->age < self::MAX_AGE){ $block = clone $this; $block->age++; - $ev = new BlockGrowEvent($this, $block); + $ev = new BlockGrowEvent($this, $block, $player); $ev->call(); if(!$ev->isCancelled()){ $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); diff --git a/src/block/Crops.php b/src/block/Crops.php index c1c13bee97..1ed62985d4 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -69,7 +69,7 @@ abstract class Crops extends Flowable{ $block->age = self::MAX_AGE; } - $ev = new BlockGrowEvent($this, $block); + $ev = new BlockGrowEvent($this, $block, $player); $ev->call(); if(!$ev->isCancelled()){ $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 136527e782..b71a8e9eac 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -51,7 +51,7 @@ class Sugarcane extends Flowable{ return $bottom; } - private function grow(Position $pos) : bool{ + private function grow(Position $pos, ?Player $player = null) : bool{ $grew = false; $world = $pos->getWorld(); for($y = 1; $y < 3; ++$y){ @@ -60,7 +60,7 @@ class Sugarcane extends Flowable{ } $b = $world->getBlockAt($pos->x, $pos->y + $y, $pos->z); if($b->getTypeId() === BlockTypeIds::AIR){ - $ev = new BlockGrowEvent($b, VanillaBlocks::SUGARCANE()); + $ev = new BlockGrowEvent($b, VanillaBlocks::SUGARCANE(), $player); $ev->call(); if($ev->isCancelled()){ break; @@ -89,7 +89,7 @@ class Sugarcane extends Flowable{ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer){ - if($this->grow($this->seekToBottom())){ + if($this->grow($this->seekToBottom(), $player)){ $item->pop(); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index c9e9232e72..13e710f405 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -87,7 +87,7 @@ class SweetBerryBush extends Flowable{ $block = clone $this; $block->age++; - $ev = new BlockGrowEvent($this, $block); + $ev = new BlockGrowEvent($this, $block, $player); $ev->call(); if(!$ev->isCancelled()){ diff --git a/src/event/block/BlockGrowEvent.php b/src/event/block/BlockGrowEvent.php index 6a2239a148..c3e070a34b 100644 --- a/src/event/block/BlockGrowEvent.php +++ b/src/event/block/BlockGrowEvent.php @@ -23,9 +23,27 @@ declare(strict_types=1); namespace pocketmine\event\block; +use pocketmine\block\Block; +use pocketmine\player\Player; + /** * Called when plants or crops grow. */ class BlockGrowEvent extends BaseBlockChangeEvent{ + public function __construct( + Block $block, + Block $newState, + private ?Player $player = null, + ){ + parent::__construct($block, $newState); + } + + /** + * It returns the player which grows the crop. + * It returns null when the crop grows by itself. + */ + public function getPlayer() : ?Player{ + return $this->player; + } } From fa719f37d5ced803268c4a08a2eca99469cfb8ed Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 8 May 2023 21:24:23 +0300 Subject: [PATCH 0991/1858] Implement Cave Vines & Glow Berries (#5424) --- src/block/BlockTypeIds.php | 3 +- src/block/CaveVines.php | 191 ++++++++++++++++++ src/block/VanillaBlocks.php | 3 + .../convert/BlockObjectToStateSerializer.php | 12 ++ .../BlockStateToObjectDeserializer.php | 19 ++ .../ItemSerializerDeserializerRegistrar.php | 1 + src/item/GlowBerries.php | 42 ++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 2 + src/item/VanillaItems.php | 2 + src/world/sound/GlowBerriesPickSound.php | 35 ++++ .../block_factory_consistency_check.json | 2 +- .../BlockSerializerDeserializerTest.php | 11 +- 13 files changed, 320 insertions(+), 6 deletions(-) create mode 100644 src/block/CaveVines.php create mode 100644 src/item/GlowBerries.php create mode 100644 src/world/sound/GlowBerriesPickSound.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 63ffb2025d..576d84d5e3 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -713,8 +713,9 @@ final class BlockTypeIds{ public const AZALEA_LEAVES = 10686; public const FLOWERING_AZALEA_LEAVES = 10687; public const REINFORCED_DEEPSLATE = 10688; + public const CAVE_VINES = 10689; - public const FIRST_UNUSED_BLOCK_ID = 10689; + public const FIRST_UNUSED_BLOCK_ID = 10690; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php new file mode 100644 index 0000000000..43109192bf --- /dev/null +++ b/src/block/CaveVines.php @@ -0,0 +1,191 @@ +boundedInt(5, 0, self::MAX_AGE, $this->age); + $w->bool($this->berries); + $w->bool($this->head); + } + + public function hasBerries() : bool{ return $this->berries; } + + /** @return $this */ + public function setBerries(bool $berries) : self{ + $this->berries = $berries; + return $this; + } + + public function isHead() : bool{ return $this->head; } + + /** @return $this */ + public function setHead(bool $head) : self{ + $this->head = $head; + return $this; + } + + public function getAge() : int{ + return $this->age; + } + + /** @return $this */ + public function setAge(int $age) : self{ + if($age < 0 || $age > self::MAX_AGE){ + throw new \InvalidArgumentException("Age must be in range 0-" . self::MAX_AGE); + } + $this->age = $age; + return $this; + } + + public function canClimb() : bool{ + return true; + } + + public function getLightLevel() : int{ + return $this->berries ? 14 : 0; + } + + private function canBeSupportedBy(Block $block) : bool{ + return $block->getSupportType(Facing::DOWN)->equals(SupportType::FULL()) || $block->hasSameTypeId($this); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::UP))){ + return false; + } + $this->age = mt_rand(0, self::MAX_AGE); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($this->berries){ + $this->position->getWorld()->dropItem($this->position, $this->asItem()); + $this->position->getWorld()->addSound($this->position, new GlowBerriesPickSound()); + + $this->position->getWorld()->setBlock($this->position, $this->setBerries(false)); + return true; + } + if($item instanceof Fertilizer){ + $ev = new BlockGrowEvent($this, (clone $this) + ->setBerries(true) + ->setHead(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)) + ); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $item->pop(); + $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); + return true; + } + return false; + } + + public function onRandomTick() : void{ + $head = !$this->getSide(Facing::DOWN)->hasSameTypeId($this); + if($head !== $this->head){ + $this->position->getWorld()->setBlock($this->position, $this->setHead($head)); + } + + if($this->age < self::MAX_AGE && mt_rand(1, 10) === 1){ + $growthPos = $this->position->getSide(Facing::DOWN); + $world = $growthPos->getWorld(); + if($world->isInWorld($growthPos->getFloorX(), $growthPos->getFloorY(), $growthPos->getFloorZ())){ + $block = $world->getBlock($growthPos); + if($block->getTypeId() === BlockTypeIds::AIR){ + $ev = new BlockGrowEvent($block, VanillaBlocks::CAVE_VINES() + ->setAge($this->age + 1) + ->setBerries(mt_rand(1, 9) === 1) + ); + + $ev->call(); + + if(!$ev->isCancelled()){ + $world->setBlock($growthPos, $ev->getNewState()); + } + } + } + } + } + + public function ticksRandomly() : bool{ + return true; + } + + protected function recalculateCollisionBoxes() : array{ + return []; + } + + public function hasEntityCollision() : bool{ + return true; + } + + public function onEntityInside(Entity $entity) : bool{ + $entity->resetFallDistance(); + return false; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return $this->berries ? [$this->asItem()] : []; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + + public function asItem() : Item{ + return VanillaItems::GLOW_BERRIES(); + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 5987939774..a01a0af0e3 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -156,6 +156,7 @@ use function mb_strtolower; * @method static CartographyTable CARTOGRAPHY_TABLE() * @method static CarvedPumpkin CARVED_PUMPKIN() * @method static Cauldron CAULDRON() + * @method static CaveVines CAVE_VINES() * @method static Chain CHAIN() * @method static ChemicalHeat CHEMICAL_HEAT() * @method static Chest CHEST() @@ -1579,6 +1580,8 @@ final class VanillaBlocks{ self::register("cake_with_dyed_candle", new CakeWithDyedCandle(new BID(Ids::CAKE_WITH_DYED_CANDLE), "Cake With Dyed Candle", $cakeBreakInfo)); self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + + self::register("cave_vines", new CaveVines(new BID(Ids::CAVE_VINES), "Cave Vines", new Info(BreakInfo::instant()))); } private static function registerBlocksR18() : void{ diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index cf201ac78a..02869fa75a 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -44,6 +44,7 @@ use pocketmine\block\Candle; use pocketmine\block\Carpet; use pocketmine\block\Carrot; use pocketmine\block\CarvedPumpkin; +use pocketmine\block\CaveVines; use pocketmine\block\Chain; use pocketmine\block\ChemistryTable; use pocketmine\block\Chest; @@ -773,6 +774,17 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CARVED_PUMPKIN) ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::CAVE_VINES(), function(CaveVines $block) : Writer{ + //I have no idea why this only has 3 IDs - there are 4 in Java and 4 visually distinct states in Bedrock + return Writer::create($block->hasBerries() ? + ($block->isHead() ? + Ids::CAVE_VINES_HEAD_WITH_BERRIES : + Ids::CAVE_VINES_BODY_WITH_BERRIES + ) : + Ids::CAVE_VINES + ) + ->writeInt(StateNames::GROWING_PLANT_AGE, $block->getAge()); + }); $this->map(Blocks::CHAIN(), function(Chain $block) : Writer{ return Writer::create(Ids::CHAIN) ->writePillarAxis($block->getAxis()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index bcea70b22d..c669613416 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\Bamboo; use pocketmine\block\Block; +use pocketmine\block\CaveVines; use pocketmine\block\ChorusFlower; use pocketmine\block\Light; use pocketmine\block\Slab; @@ -611,6 +612,24 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CARVED_PUMPKIN() ->setFacing($in->readLegacyHorizontalFacing()); }); + $this->map(Ids::CAVE_VINES, function(Reader $in) : CaveVines{ + return Blocks::CAVE_VINES() + ->setBerries(false) + ->setHead(false) + ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25)); + }); + $this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES, function(Reader $in) : CaveVines{ + return Blocks::CAVE_VINES() + ->setBerries(true) + ->setHead(false) + ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25)); + }); + $this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES, function(Reader $in) : CaveVines{ + return Blocks::CAVE_VINES() + ->setBerries(true) + ->setHead(true) + ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25)); + }); $this->map(Ids::CHAIN, function(Reader $in) : Block{ return Blocks::CHAIN() ->setAxis($in->readPillarAxis()); diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 368423911d..99be4ea68b 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -233,6 +233,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::GHAST_TEAR, Items::GHAST_TEAR()); $this->map1to1Item(Ids::GLASS_BOTTLE, Items::GLASS_BOTTLE()); $this->map1to1Item(Ids::GLISTERING_MELON_SLICE, Items::GLISTERING_MELON()); + $this->map1to1Item(Ids::GLOW_BERRIES, Items::GLOW_BERRIES()); $this->map1to1Item(Ids::GLOW_INK_SAC, Items::GLOW_INK_SAC()); $this->map1to1Item(Ids::GLOWSTONE_DUST, Items::GLOWSTONE_DUST()); $this->map1to1Item(Ids::GOLD_INGOT, Items::GOLD_INGOT()); diff --git a/src/item/GlowBerries.php b/src/item/GlowBerries.php new file mode 100644 index 0000000000..e959b7b9e0 --- /dev/null +++ b/src/item/GlowBerries.php @@ -0,0 +1,42 @@ +registerBlock("carrots", fn() => Blocks::CARROTS()); $result->registerBlock("carved_pumpkin", fn() => Blocks::CARVED_PUMPKIN()); $result->registerBlock("cauldron", fn() => Blocks::CAULDRON()); + $result->registerBlock("cave_vines", fn() => Blocks::CAVE_VINES()); $result->registerBlock("chain", fn() => Blocks::CHAIN()); $result->registerBlock("chemical_heat", fn() => Blocks::CHEMICAL_HEAT()); $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); @@ -1275,6 +1276,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("ghast_tear", fn() => Items::GHAST_TEAR()); $result->register("glass_bottle", fn() => Items::GLASS_BOTTLE()); $result->register("glistering_melon", fn() => Items::GLISTERING_MELON()); + $result->register("glow_berries", fn() => Items::GLOW_BERRIES()); $result->register("glow_ink_sac", fn() => Items::GLOW_INK_SAC()); $result->register("glowstone_dust", fn() => Items::GLOWSTONE_DUST()); $result->register("gold_axe", fn() => Items::GOLDEN_AXE()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index eeaeddc800..7e94dd4494 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -163,6 +163,7 @@ use pocketmine\world\World; * @method static GlassBottle GLASS_BOTTLE() * @method static Item GLISTERING_MELON() * @method static Item GLOWSTONE_DUST() + * @method static GlowBerries GLOW_BERRIES() * @method static Item GLOW_INK_SAC() * @method static GoldenApple GOLDEN_APPLE() * @method static Axe GOLDEN_AXE() @@ -438,6 +439,7 @@ final class VanillaItems{ self::register("ghast_tear", new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); self::register("glistering_melon", new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); + self::register("glow_berries", new GlowBerries(new IID(Ids::GLOW_BERRIES), "Glow Berries")); self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); self::register("glowstone_dust", new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); self::register("gold_ingot", new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); diff --git a/src/world/sound/GlowBerriesPickSound.php b/src/world/sound/GlowBerriesPickSound.php new file mode 100644 index 0000000000..0c76ff75eb --- /dev/null +++ b/src/world/sound/GlowBerriesPickSound.php @@ -0,0 +1,35 @@ +setColor($block->getColor()); }elseif($block instanceof Skull && $newBlock instanceof Skull){ $newBlock->setSkullType($block->getSkullType()); + }elseif($block instanceof CaveVines && $newBlock instanceof CaveVines && !$block->hasBerries()){ + $newBlock->setHead($block->isHead()); } self::assertSame($block->getStateId(), $newBlock->getStateId(), "Mismatch of blockstate for " . $block->getName() . ", " . print_r($block, true) . " vs " . print_r($newBlock, true)); From 1b452f3a8880f3d5f6595c98375401a2641f36ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 May 2023 21:38:58 +0100 Subject: [PATCH 0992/1858] BlockStateToObjectDeserializer: make flat colour block handling less repetetive --- .../BlockStateToObjectDeserializer.php | 151 ++++++++++-------- 1 file changed, 83 insertions(+), 68 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index c669613416..b839ec43f6 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -128,80 +128,95 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ private function registerCandleDeserializers() : void{ $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in)); - $dyedCandleDeserializer = fn(DyeColor $color) => fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in); - $this->map(Ids::BLACK_CANDLE, $dyedCandleDeserializer(DyeColor::BLACK())); - $this->map(Ids::BLUE_CANDLE, $dyedCandleDeserializer(DyeColor::BLUE())); - $this->map(Ids::BROWN_CANDLE, $dyedCandleDeserializer(DyeColor::BROWN())); - $this->map(Ids::CYAN_CANDLE, $dyedCandleDeserializer(DyeColor::CYAN())); - $this->map(Ids::GRAY_CANDLE, $dyedCandleDeserializer(DyeColor::GRAY())); - $this->map(Ids::GREEN_CANDLE, $dyedCandleDeserializer(DyeColor::GREEN())); - $this->map(Ids::LIGHT_BLUE_CANDLE, $dyedCandleDeserializer(DyeColor::LIGHT_BLUE())); - $this->map(Ids::LIGHT_GRAY_CANDLE, $dyedCandleDeserializer(DyeColor::LIGHT_GRAY())); - $this->map(Ids::LIME_CANDLE, $dyedCandleDeserializer(DyeColor::LIME())); - $this->map(Ids::MAGENTA_CANDLE, $dyedCandleDeserializer(DyeColor::MAGENTA())); - $this->map(Ids::ORANGE_CANDLE, $dyedCandleDeserializer(DyeColor::ORANGE())); - $this->map(Ids::PINK_CANDLE, $dyedCandleDeserializer(DyeColor::PINK())); - $this->map(Ids::PURPLE_CANDLE, $dyedCandleDeserializer(DyeColor::PURPLE())); - $this->map(Ids::RED_CANDLE, $dyedCandleDeserializer(DyeColor::RED())); - $this->map(Ids::WHITE_CANDLE, $dyedCandleDeserializer(DyeColor::WHITE())); - $this->map(Ids::YELLOW_CANDLE, $dyedCandleDeserializer(DyeColor::YELLOW())); + foreach([ + Ids::BLACK_CANDLE => DyeColor::BLACK(), + Ids::BLUE_CANDLE => DyeColor::BLUE(), + Ids::BROWN_CANDLE => DyeColor::BROWN(), + Ids::CYAN_CANDLE => DyeColor::CYAN(), + Ids::GRAY_CANDLE => DyeColor::GRAY(), + Ids::GREEN_CANDLE => DyeColor::GREEN(), + Ids::LIGHT_BLUE_CANDLE => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_CANDLE => DyeColor::LIGHT_GRAY(), + Ids::LIME_CANDLE => DyeColor::LIME(), + Ids::MAGENTA_CANDLE => DyeColor::MAGENTA(), + Ids::ORANGE_CANDLE => DyeColor::ORANGE(), + Ids::PINK_CANDLE => DyeColor::PINK(), + Ids::PURPLE_CANDLE => DyeColor::PURPLE(), + Ids::RED_CANDLE => DyeColor::RED(), + Ids::WHITE_CANDLE => DyeColor::WHITE(), + Ids::YELLOW_CANDLE => DyeColor::YELLOW(), + ] as $id => $color){ + $this->map($id, fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in)); + } $this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT))); - $cakeWithDyedCandleDeserializer = fn(DyeColor $color) => fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE() - ->setColor($color) - ->setLit($in->readBool(StateNames::LIT)); - $this->map(Ids::BLACK_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BLACK())); - $this->map(Ids::BLUE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BLUE())); - $this->map(Ids::BROWN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::BROWN())); - $this->map(Ids::CYAN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::CYAN())); - $this->map(Ids::GRAY_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::GRAY())); - $this->map(Ids::GREEN_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::GREEN())); - $this->map(Ids::LIGHT_BLUE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIGHT_BLUE())); - $this->map(Ids::LIGHT_GRAY_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIGHT_GRAY())); - $this->map(Ids::LIME_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::LIME())); - $this->map(Ids::MAGENTA_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::MAGENTA())); - $this->map(Ids::ORANGE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::ORANGE())); - $this->map(Ids::PINK_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::PINK())); - $this->map(Ids::PURPLE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::PURPLE())); - $this->map(Ids::RED_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::RED())); - $this->map(Ids::WHITE_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::WHITE())); - $this->map(Ids::YELLOW_CANDLE_CAKE, $cakeWithDyedCandleDeserializer(DyeColor::YELLOW())); + foreach([ + Ids::BLACK_CANDLE_CAKE => DyeColor::BLACK(), + Ids::BLUE_CANDLE_CAKE => DyeColor::BLUE(), + Ids::BROWN_CANDLE_CAKE => DyeColor::BROWN(), + Ids::CYAN_CANDLE_CAKE => DyeColor::CYAN(), + Ids::GRAY_CANDLE_CAKE => DyeColor::GRAY(), + Ids::GREEN_CANDLE_CAKE => DyeColor::GREEN(), + Ids::LIGHT_BLUE_CANDLE_CAKE => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_CANDLE_CAKE => DyeColor::LIGHT_GRAY(), + Ids::LIME_CANDLE_CAKE => DyeColor::LIME(), + Ids::MAGENTA_CANDLE_CAKE => DyeColor::MAGENTA(), + Ids::ORANGE_CANDLE_CAKE => DyeColor::ORANGE(), + Ids::PINK_CANDLE_CAKE => DyeColor::PINK(), + Ids::PURPLE_CANDLE_CAKE => DyeColor::PURPLE(), + Ids::RED_CANDLE_CAKE => DyeColor::RED(), + Ids::WHITE_CANDLE_CAKE => DyeColor::WHITE(), + Ids::YELLOW_CANDLE_CAKE => DyeColor::YELLOW(), + ] as $id => $color){ + $this->map($id, fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE() + ->setColor($color) + ->setLit($in->readBool(StateNames::LIT)) + ); + } } private function registerFlatColorBlockDeserializers() : void{ - $this->map(Ids::BLACK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLACK(), $in)); - $this->map(Ids::BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BLUE(), $in)); - $this->map(Ids::BROWN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::BROWN(), $in)); - $this->map(Ids::CYAN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::CYAN(), $in)); - $this->map(Ids::GRAY_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GRAY(), $in)); - $this->map(Ids::GREEN_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::GREEN(), $in)); - $this->map(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_BLUE(), $in)); - $this->map(Ids::SILVER_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIGHT_GRAY(), $in)); - $this->map(Ids::LIME_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::LIME(), $in)); - $this->map(Ids::MAGENTA_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::MAGENTA(), $in)); - $this->map(Ids::ORANGE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::ORANGE(), $in)); - $this->map(Ids::PINK_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PINK(), $in)); - $this->map(Ids::PURPLE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::PURPLE(), $in)); - $this->map(Ids::RED_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::RED(), $in)); - $this->map(Ids::WHITE_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::WHITE(), $in)); - $this->map(Ids::YELLOW_GLAZED_TERRACOTTA, fn(Reader $in) => Helper::decodeGlazedTerracotta(DyeColor::YELLOW(), $in)); + foreach([ + Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK(), + Ids::BLUE_GLAZED_TERRACOTTA => DyeColor::BLUE(), + Ids::BROWN_GLAZED_TERRACOTTA => DyeColor::BROWN(), + Ids::CYAN_GLAZED_TERRACOTTA => DyeColor::CYAN(), + Ids::GRAY_GLAZED_TERRACOTTA => DyeColor::GRAY(), + Ids::GREEN_GLAZED_TERRACOTTA => DyeColor::GREEN(), + Ids::LIGHT_BLUE_GLAZED_TERRACOTTA => DyeColor::LIGHT_BLUE(), + Ids::SILVER_GLAZED_TERRACOTTA => DyeColor::LIGHT_GRAY(), + Ids::LIME_GLAZED_TERRACOTTA => DyeColor::LIME(), + Ids::MAGENTA_GLAZED_TERRACOTTA => DyeColor::MAGENTA(), + Ids::ORANGE_GLAZED_TERRACOTTA => DyeColor::ORANGE(), + Ids::PINK_GLAZED_TERRACOTTA => DyeColor::PINK(), + Ids::PURPLE_GLAZED_TERRACOTTA => DyeColor::PURPLE(), + Ids::RED_GLAZED_TERRACOTTA => DyeColor::RED(), + Ids::WHITE_GLAZED_TERRACOTTA => DyeColor::WHITE(), + Ids::YELLOW_GLAZED_TERRACOTTA => DyeColor::YELLOW(), + ] as $id => $color){ + $this->map($id, fn(Reader $in) => Helper::decodeGlazedTerracotta($color, $in)); + } - $this->mapSimple(Ids::BLACK_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BLACK())); - $this->mapSimple(Ids::BLUE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BLUE())); - $this->mapSimple(Ids::BROWN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::BROWN())); - $this->mapSimple(Ids::CYAN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::CYAN())); - $this->mapSimple(Ids::GRAY_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::GRAY())); - $this->mapSimple(Ids::GREEN_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::GREEN())); - $this->mapSimple(Ids::LIGHT_BLUE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIGHT_BLUE())); - $this->mapSimple(Ids::LIGHT_GRAY_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIGHT_GRAY())); - $this->mapSimple(Ids::LIME_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::LIME())); - $this->mapSimple(Ids::MAGENTA_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::MAGENTA())); - $this->mapSimple(Ids::ORANGE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::ORANGE())); - $this->mapSimple(Ids::PINK_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::PINK())); - $this->mapSimple(Ids::PURPLE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::PURPLE())); - $this->mapSimple(Ids::RED_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::RED())); - $this->mapSimple(Ids::WHITE_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::WHITE())); - $this->mapSimple(Ids::YELLOW_WOOL, fn() => Blocks::WOOL()->setColor(DyeColor::YELLOW())); + foreach([ + Ids::BLACK_WOOL => DyeColor::BLACK(), + Ids::BLUE_WOOL => DyeColor::BLUE(), + Ids::BROWN_WOOL => DyeColor::BROWN(), + Ids::CYAN_WOOL => DyeColor::CYAN(), + Ids::GRAY_WOOL => DyeColor::GRAY(), + Ids::GREEN_WOOL => DyeColor::GREEN(), + Ids::LIGHT_BLUE_WOOL => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_WOOL => DyeColor::LIGHT_GRAY(), + Ids::LIME_WOOL => DyeColor::LIME(), + Ids::MAGENTA_WOOL => DyeColor::MAGENTA(), + Ids::ORANGE_WOOL => DyeColor::ORANGE(), + Ids::PINK_WOOL => DyeColor::PINK(), + Ids::PURPLE_WOOL => DyeColor::PURPLE(), + Ids::RED_WOOL => DyeColor::RED(), + Ids::WHITE_WOOL => DyeColor::WHITE(), + Ids::YELLOW_WOOL => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::WOOL()->setColor($color)); + } } private function registerCauldronDeserializers() : void{ From 7b1a1e5a18dbaaa080a9ffabd63c6eae90f44911 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 May 2023 22:16:55 +0100 Subject: [PATCH 0993/1858] BlockStateToObjectDeserializer: remove redundant helper --- .../bedrock/block/convert/BlockStateDeserializerHelper.php | 7 ------- .../block/convert/BlockStateToObjectDeserializer.php | 5 ++++- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 6384a3e942..9de65a94d1 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -165,13 +165,6 @@ final class BlockStateDeserializerHelper{ ->setRotation($in->readBoundedInt(BlockStateNames::GROUND_SIGN_DIRECTION, 0, 15)); } - /** @throws BlockStateDeserializeException */ - public static function decodeGlazedTerracotta(DyeColor $color, BlockStateReader $in) : GlazedTerracotta{ - return VanillaBlocks::GLAZED_TERRACOTTA() - ->setColor($color) - ->setFacing($in->readHorizontalFacing()); - } - public static function decodeItemFrame(ItemFrame $block, BlockStateReader $in) : ItemFrame{ $in->todo(StateNames::ITEM_FRAME_PHOTO_BIT); //TODO: not sure what the point of this is return $block diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index b839ec43f6..2d1fd60909 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -194,7 +194,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ Ids::WHITE_GLAZED_TERRACOTTA => DyeColor::WHITE(), Ids::YELLOW_GLAZED_TERRACOTTA => DyeColor::YELLOW(), ] as $id => $color){ - $this->map($id, fn(Reader $in) => Helper::decodeGlazedTerracotta($color, $in)); + $this->map($id, fn(Reader $in) => Blocks::GLAZED_TERRACOTTA() + ->setColor($color) + ->setFacing($in->readHorizontalFacing()) + ); } foreach([ From 30f1d3e01617748f57d04fa0d2f8b3c276fa19ff Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Wed, 10 May 2023 07:41:25 -0500 Subject: [PATCH 0994/1858] Fix code style (#5740) --- src/data/bedrock/block/convert/BlockStateDeserializerHelper.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 9de65a94d1..fab50717c4 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -35,7 +35,6 @@ use pocketmine\block\Door; use pocketmine\block\FenceGate; use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; -use pocketmine\block\GlazedTerracotta; use pocketmine\block\ItemFrame; use pocketmine\block\Leaves; use pocketmine\block\Liquid; @@ -48,7 +47,6 @@ use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\utils\CopperOxidation; -use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; From 44bc4d8c7caa3e02f6c20c904851eaa68aa1e95b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 15:02:59 +0100 Subject: [PATCH 0995/1858] Bump phpstan/phpstan from 1.10.14 to 1.10.15 (#5741) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.14 to 1.10.15. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.14...1.10.15) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 7650b7f367..630b31c17e 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.10.14", + "phpstan/phpstan": "1.10.15", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index bad0235cb7..9db2f55195 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7ca2d4ed0987ac17cf615d67945f5687", + "content-hash": "a5ffe862f4e6376eaf78593a4bb8aeb6", "packages": [ { "name": "adhocore/json-comment", @@ -1883,16 +1883,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.14", + "version": "1.10.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d232901b09e67538e5c86a724be841bea5768a7c" + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d232901b09e67538e5c86a724be841bea5768a7c", - "reference": "d232901b09e67538e5c86a724be841bea5768a7c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd", + "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd", "shasum": "" }, "require": { @@ -1941,7 +1941,7 @@ "type": "tidelift" } ], - "time": "2023-04-19T13:47:27+00:00" + "time": "2023-05-09T15:28:01+00:00" }, { "name": "phpstan/phpstan-phpunit", From 9d111e13f123b3fefe9fadd6d98c4bdd713bf979 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 15 May 2023 14:58:31 +0100 Subject: [PATCH 0996/1858] CONTRIBUTING: added table of in-house dependencies and which classes, functions or namespaces they contain --- CONTRIBUTING.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 45841fc15a..0f3698d49e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,6 +18,30 @@ Larger contributions like feature additions should be preceded by a [Change Prop ## Other things you'll need - [git](https://git-scm.com/) +## List of `pocketmine` namespaces which are in other repos +PocketMine-MP has several dependencies which are independent from the main server code. Most of them use the `pocketmine` namespace. +Some of these add extra classes to packages which already exist in PocketMine-MP. + +Take a look at the table below if you can't find the class or function you're looking for. + +| Source URL | Namespace, class or function | +|:----------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------| +| [pmmp/BedrockProtocol](https://github.com/pmmp/BedrockProtocol) | `pocketmine\network\mcpe\protocol` | +| [pmmp/BinaryUtils](https://github.com/pmmp/BinaryUtils) | `pocketmine\utils\BinaryDataException`
`pocketmine\utils\BinaryStream`
`pocketmine\utils\Binary` | +| [pmmp/ClassLoader](https://github.com/pmmp/`ClassLoader`) | `BaseClassLoader`
`ClassLoader`
`DynamicClassLoader` | +| [pmmp/Color](https://github.com/pmmp/Color) | `pocketmine\color` | +| [pmmp/ErrorHandler](https://github.com/pmmp/ErrorHandler) | `pocketmine\errorhandler` | +| [pmmp/LogPthreads](https://github.com/pmmp/LogPthreads) | `ThreadedLoggerAttachment`
`ThreadedLogger`
`AttachableThreadedLogger` | +| [pmmp/Log](https://github.com/pmmp/Log) | `AttachableLogger`
`BufferedLogger`
`GlobalLogger`
`LogLevel`
`Logger`
`PrefixedLogger`
`SimpleLogger` | +| [pmmp/Math](https://github.com/pmmp/Math) | `pocketmine\math` | +| [pmmp/NBT](https://github.com/pmmp/NBT) | `pocketmine\nbt` | +| [pmmp/RakLibIpc](https://github.com/pmmp/RakLibIpc) | `raklib\server\ipc` | +| [pmmp/RakLib](https://github.com/pmmp/RakLib) | `raklib` | +| [pmmp/Snooze](https://github.com/pmmp/Snooze) | `pocketmine\snooze` | +| [pmmp/ext-chunkutils2](https://github.com/pmmp/ext-chunkutils2) | `pocketmine\world\format\LightArray`
`pocketmine\world\format\PalettedBlockArray`
`pocketmine\world\format\io\SubChunkConverter` | +| [pmmp/ext-morton](https://github.com/pmmp/ext-morton) | `morton2d_decode`
`morton2d_encode`
`morton3d_decode`
`morton3d_encode` | +| [pmmp/ext-libdeflate](https://github.com/pmmp/ext-libdeflate) | `libdeflate_deflate_compress`
`libdeflate_gzip_compress`
`libdeflate_zlib_compress` | + ## Choosing a target branch PocketMine-MP has three primary branches of development. From ccb22ceb3fa6cf1725d72f181f14b66937e0ce81 Mon Sep 17 00:00:00 2001 From: platz1de <51201131+platz1de@users.noreply.github.com> Date: Tue, 16 May 2023 13:31:30 +0200 Subject: [PATCH 0997/1858] Fix flower pots being marked as pottable (#5747) --- src/block/VanillaBlocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a01a0af0e3..eb909ab92e 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -853,7 +853,7 @@ final class VanillaBlocks{ self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", $flowerTypeInfo)); self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", $flowerTypeInfo)); self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); - self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", $flowerTypeInfo)); + self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::FURNACE())); self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::BLAST_FURNACE())); From 015c668885a0f63cb041569441d6040c40f2694b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 14:07:06 +0100 Subject: [PATCH 0998/1858] Change confusing 'type data' and 'state data' terminology for blocks and items For blocks, we now use 'block-item state' and 'block-only state', which should be much clearer for people implementing custom stuff. 'block-item state', as the name suggests, sticks to the item when the block is acquired as an item. 'block-only state' applies only to the block and is discarded when the block is acquired as an item. 'type data' for items was also renamed, since 'type' is too ambiguous to be anything but super confusing. --- src/block/Anvil.php | 4 +- src/block/Bamboo.php | 2 +- src/block/BambooSapling.php | 2 +- src/block/Barrel.php | 2 +- src/block/Bed.php | 2 +- src/block/Bedrock.php | 2 +- src/block/Bell.php | 2 +- src/block/Block.php | 115 +++++++++--------- src/block/BrewingStand.php | 2 +- src/block/Button.php | 2 +- src/block/Cactus.php | 2 +- src/block/Cake.php | 2 +- src/block/Candle.php | 4 +- src/block/CaveVines.php | 2 +- src/block/ChorusFlower.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/Crops.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/DetectorRail.php | 4 +- src/block/Dirt.php | 2 +- src/block/Door.php | 2 +- src/block/DoublePlant.php | 2 +- src/block/EndPortalFrame.php | 2 +- src/block/Farmland.php | 2 +- src/block/FenceGate.php | 2 +- src/block/FillableCauldron.php | 2 +- src/block/Fire.php | 2 +- src/block/FloorCoralFan.php | 2 +- src/block/Froglight.php | 2 +- src/block/FrostedIce.php | 2 +- src/block/Furnace.php | 2 +- src/block/Hopper.php | 2 +- src/block/ItemFrame.php | 2 +- src/block/Lantern.php | 2 +- src/block/Leaves.php | 2 +- src/block/Lectern.php | 2 +- src/block/Lever.php | 2 +- src/block/Light.php | 2 +- src/block/Liquid.php | 2 +- src/block/NetherPortal.php | 2 +- src/block/NetherVines.php | 2 +- src/block/NetherWartPlant.php | 2 +- src/block/Rail.php | 2 +- src/block/RedMushroomBlock.php | 2 +- src/block/RedstoneComparator.php | 2 +- src/block/RedstoneLamp.php | 2 +- src/block/RedstoneOre.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/RedstoneTorch.php | 4 +- src/block/Sapling.php | 2 +- src/block/SeaPickle.php | 2 +- src/block/ShulkerBox.php | 2 +- src/block/SimplePressurePlate.php | 2 +- src/block/Skull.php | 4 +- src/block/Slab.php | 2 +- src/block/SnowLayer.php | 2 +- src/block/Sponge.php | 2 +- src/block/Stair.php | 2 +- src/block/StraightOnlyRail.php | 2 +- src/block/Sugarcane.php | 2 +- src/block/SweetBerryBush.php | 2 +- src/block/TNT.php | 4 +- src/block/Torch.php | 2 +- src/block/Trapdoor.php | 2 +- src/block/Tripwire.php | 2 +- src/block/TripwireHook.php | 2 +- src/block/UnknownBlock.php | 2 +- src/block/Vine.php | 2 +- src/block/Wall.php | 2 +- src/block/WallCoralFan.php | 2 +- src/block/Wood.php | 2 +- .../AnalogRedstoneSignalEmitterTrait.php | 2 +- src/block/utils/AnyFacingTrait.php | 2 +- src/block/utils/CandleTrait.php | 2 +- src/block/utils/ColoredTrait.php | 4 +- src/block/utils/CopperTrait.php | 2 +- src/block/utils/CoralTypeTrait.php | 4 +- src/block/utils/HorizontalFacingTrait.php | 2 +- src/block/utils/PillarRotationTrait.php | 2 +- .../utils/RailPoweredByRedstoneTrait.php | 4 +- src/block/utils/SignLikeRotationTrait.php | 2 +- src/crafting/CraftingManager.php | 8 +- src/crafting/FurnaceRecipeManager.php | 2 +- src/item/Banner.php | 2 +- src/item/CoralFan.php | 4 +- src/item/Dye.php | 2 +- src/item/Item.php | 14 ++- src/item/ItemBlock.php | 4 +- src/item/Medicine.php | 2 +- src/item/Potion.php | 2 +- src/item/SplashPotion.php | 2 +- src/item/StringToItemParser.php | 4 +- src/item/SuspiciousStew.php | 2 +- src/network/mcpe/convert/TypeConverter.php | 2 +- src/player/Player.php | 6 +- 95 files changed, 178 insertions(+), 171 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index ee8b25e384..de8b6d33cc 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -51,11 +51,11 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index dae8572061..980f4382d1 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -55,7 +55,7 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); $w->bool($this->ready); diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index cfa81519bd..6be42546ab 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ private bool $ready = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 68eda53319..1dce2376b1 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -38,7 +38,7 @@ class Barrel extends Opaque{ protected bool $open = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->open); } diff --git a/src/block/Bed.php b/src/block/Bed.php index 678c8a5429..13b466026b 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -53,7 +53,7 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); $w->bool($this->head); diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 4bca833056..e568986914 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Bedrock extends Opaque{ private bool $burnsForever = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->burnsForever); } diff --git a/src/block/Bell.php b/src/block/Bell.php index f20a031c2e..753d6453d3 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -48,7 +48,7 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); $w->horizontalFacing($this->facing); } diff --git a/src/block/Block.php b/src/block/Block.php index bb22247234..bc76bf9526 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -66,9 +66,9 @@ class Block{ /** @var AxisAlignedBB[]|null */ protected ?array $collisionBoxes = null; - private int $requiredTypeDataBits; - private int $requiredStateDataBits; - private int $defaultStateData; + private int $requiredBlockItemStateDataBits; + private int $requiredBlockOnlyStateDataBits; + private int $defaultBlockOnlyStateData; /** * @param string $name English name of the block type (TODO: implement translations) @@ -80,14 +80,14 @@ class Block{ $this->position = new Position(0, 0, 0, null); $calculator = new RuntimeDataSizeCalculator(); - $this->describeType($calculator); - $this->requiredTypeDataBits = $calculator->getBitsUsed(); + $this->describeBlockItemState($calculator); + $this->requiredBlockItemStateDataBits = $calculator->getBitsUsed(); $calculator = new RuntimeDataSizeCalculator(); - $this->describeState($calculator); - $this->requiredStateDataBits = $calculator->getBitsUsed(); + $this->describeBlockOnlyState($calculator); + $this->requiredBlockOnlyStateDataBits = $calculator->getBitsUsed(); - $this->defaultStateData = $this->computeStateData(); + $this->defaultBlockOnlyStateData = $this->encodeBlockOnlyState(); } public function __clone(){ @@ -111,10 +111,10 @@ class Block{ /** * Returns a type ID that identifies this type of block. This allows comparing basic block types, e.g. wool, stone, - * glass, etc. + * glass, etc. Type ID will not change for a given block type. * - * This does **NOT** include information like facing, open/closed, powered/unpowered, colour, etc. This means that, - * for example, red wool and green wool have the same type ID. + * Information such as colour, powered, open/closed, etc. is **not** included in this ID. + * If you want to get a state ID that includes this information, use {@link Block::getStateId()} instead. * * @see BlockTypeIds */ @@ -129,21 +129,22 @@ class Block{ * blocks in chunks at runtime. * * This usually encodes all properties of the block, such as facing, open/closed, powered/unpowered, colour, etc. - * However, some blocks (such as signs and chests) may store additional properties in an associated "tile" if they + * State ID may change depending on the properties of the block (e.g. a torch facing east will have a different + * state ID to one facing west). + * + * Some blocks (such as signs and chests) may store additional properties in an associated "tile" if they * have too many possible values to be encoded into the state ID. These extra properties are **NOT** included in * this function's result. * - * This ID can be used to later obtain a copy of this block using {@link RuntimeBlockStateRegistry::fromStateId()}. + * This ID can be used to later obtain a copy of the block with the same state properties by using + * {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ - return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeTypeAndStateData(); + return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->encodeFullState(); } /** - * Returns whether the given block has an equivalent type to this one. This compares the type IDs. - * - * Type properties (e.g. colour, skull type, etc.) are not compared. This means that different colours of wool, - * concrete, etc. will all be considered as having the same type. + * Returns whether the given block has the same type ID as this one. */ public function hasSameTypeId(Block $other) : bool{ return $this->getTypeId() === $other->getTypeId(); @@ -151,6 +152,8 @@ class Block{ /** * Returns whether the given block has the same type and properties as this block. + * + * Note: Tile data (e.g. sign text, chest contents) are not compared here. */ public function isSameState(Block $other) : bool{ return $this->getStateId() === $other->getStateId(); @@ -177,69 +180,69 @@ class Block{ /** * Returns the block as an item. - * State information such as facing, powered/unpowered, open/closed, etc., is discarded. - * Type information such as colour, wood type, etc. is preserved. + * Block-only state such as facing, powered/unpowered, open/closed, etc., is discarded. + * Block-item state such as colour, wood type, etc. is preserved. */ public function asItem() : Item{ $normalized = clone $this; - $normalized->decodeStateData($this->defaultStateData); + $normalized->decodeBlockOnlyState($this->defaultBlockOnlyStateData); return new ItemBlock($normalized); } - private function decodeTypeData(int $data) : void{ - $reader = new RuntimeDataReader($this->requiredTypeDataBits, $data); + private function decodeBlockItemState(int $data) : void{ + $reader = new RuntimeDataReader($this->requiredBlockItemStateDataBits, $data); - $this->describeType($reader); + $this->describeBlockItemState($reader); $readBits = $reader->getOffset(); - if($this->requiredTypeDataBits !== $readBits){ - throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were provided, but $readBits were read"); + if($this->requiredBlockItemStateDataBits !== $readBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredBlockItemStateDataBits bits of block-item state data were provided, but $readBits were read"); } } - private function decodeStateData(int $data) : void{ - $reader = new RuntimeDataReader($this->requiredStateDataBits, $data); + private function decodeBlockOnlyState(int $data) : void{ + $reader = new RuntimeDataReader($this->requiredBlockOnlyStateDataBits, $data); - $this->describeState($reader); + $this->describeBlockOnlyState($reader); $readBits = $reader->getOffset(); - if($this->requiredStateDataBits !== $readBits){ - throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were provided, but $readBits were read"); + if($this->requiredBlockOnlyStateDataBits !== $readBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredBlockOnlyStateDataBits bits of block-only state data were provided, but $readBits were read"); } } - private function decodeTypeAndStateData(int $data) : void{ - $reader = new RuntimeDataReader($this->requiredTypeDataBits + $this->requiredStateDataBits, $data); - $this->decodeTypeData($reader->readInt($this->requiredTypeDataBits)); - $this->decodeStateData($reader->readInt($this->requiredStateDataBits)); + private function decodeFullState(int $data) : void{ + $reader = new RuntimeDataReader($this->requiredBlockItemStateDataBits + $this->requiredBlockOnlyStateDataBits, $data); + $this->decodeBlockItemState($reader->readInt($this->requiredBlockItemStateDataBits)); + $this->decodeBlockOnlyState($reader->readInt($this->requiredBlockOnlyStateDataBits)); } - private function computeTypeData() : int{ - $writer = new RuntimeDataWriter($this->requiredTypeDataBits); + private function encodeBlockItemState() : int{ + $writer = new RuntimeDataWriter($this->requiredBlockItemStateDataBits); - $this->describeType($writer); + $this->describeBlockItemState($writer); $writtenBits = $writer->getOffset(); - if($this->requiredTypeDataBits !== $writtenBits){ - throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were expected, but $writtenBits were written"); + if($this->requiredBlockItemStateDataBits !== $writtenBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredBlockItemStateDataBits bits of block-item state data were expected, but $writtenBits were written"); } return $writer->getValue(); } - private function computeStateData() : int{ - $writer = new RuntimeDataWriter($this->requiredStateDataBits); + private function encodeBlockOnlyState() : int{ + $writer = new RuntimeDataWriter($this->requiredBlockOnlyStateDataBits); - $this->describeState($writer); + $this->describeBlockOnlyState($writer); $writtenBits = $writer->getOffset(); - if($this->requiredStateDataBits !== $writtenBits){ - throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were expected, but $writtenBits were written"); + if($this->requiredBlockOnlyStateDataBits !== $writtenBits){ + throw new \LogicException(get_class($this) . ": Exactly $this->requiredBlockOnlyStateDataBits bits of block-only state data were expected, but $writtenBits were written"); } return $writer->getValue(); } - private function computeTypeAndStateData() : int{ - $writer = new RuntimeDataWriter($this->requiredTypeDataBits + $this->requiredStateDataBits); - $writer->writeInt($this->requiredTypeDataBits, $this->computeTypeData()); - $writer->writeInt($this->requiredStateDataBits, $this->computeStateData()); + private function encodeFullState() : int{ + $writer = new RuntimeDataWriter($this->requiredBlockItemStateDataBits + $this->requiredBlockOnlyStateDataBits); + $writer->writeInt($this->requiredBlockItemStateDataBits, $this->encodeBlockItemState()); + $writer->writeInt($this->requiredBlockOnlyStateDataBits, $this->encodeBlockOnlyState()); return $writer->getValue(); } @@ -252,7 +255,7 @@ class Block{ * The method implementation must NOT use conditional logic to determine which properties are written. It must * always write the same properties in the same order, regardless of the current state of the block. */ - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ //NOOP } @@ -264,7 +267,7 @@ class Block{ * The method implementation must NOT use conditional logic to determine which properties are written. It must * always write the same properties in the same order, regardless of the current state of the block. */ - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ //NOOP } @@ -278,16 +281,16 @@ class Block{ public function generateStatePermutations() : \Generator{ //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 - $bits = $this->requiredTypeDataBits + $this->requiredStateDataBits; + $bits = $this->requiredBlockItemStateDataBits + $this->requiredBlockOnlyStateDataBits; if($bits > Block::INTERNAL_STATE_DATA_BITS){ throw new \LogicException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); } for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ $v = clone $this; try{ - $v->decodeTypeAndStateData($stateData); - if($v->computeTypeAndStateData() !== $stateData){ - throw new \LogicException(static::class . "::decodeStateData() accepts invalid state data (returned " . $v->computeTypeAndStateData() . " for input $stateData)"); + $v->decodeFullState($stateData); + if($v->encodeFullState() !== $stateData){ + throw new \LogicException(static::class . "::decodeStateData() accepts invalid state data (returned " . $v->encodeFullState() . " for input $stateData)"); } }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it continue; @@ -732,7 +735,7 @@ class Block{ * @return string */ public function __toString(){ - return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->computeTypeAndStateData() . ")"; + return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->encodeFullState() . ")"; } /** diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 479d207393..497d282d75 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -43,7 +43,7 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->brewingStandSlots($this->slots); } diff --git a/src/block/Button.php b/src/block/Button.php index aa6ca8fa0b..85d1d3e091 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -38,7 +38,7 @@ abstract class Button extends Flowable{ protected bool $pressed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->pressed); } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 3563eded7d..8fff294f6f 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -41,7 +41,7 @@ class Cactus extends Transparent{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 93e51be218..3e26e59b06 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -36,7 +36,7 @@ class Cake extends BaseCake{ protected int $bites = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); } diff --git a/src/block/Candle.php b/src/block/Candle.php index d958152228..5936a08120 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -37,7 +37,7 @@ use pocketmine\world\BlockTransaction; class Candle extends Transparent{ use CandleTrait { - describeState as encodeLitState; + describeBlockOnlyState as encodeLitState; getLightLevel as getBaseLightLevel; } @@ -46,7 +46,7 @@ class Candle extends Transparent{ private int $count = self::MIN_COUNT; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); } diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index 43109192bf..55f73fb655 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -44,7 +44,7 @@ class CaveVines extends Flowable{ protected bool $berries = false; protected bool $head = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(5, 0, self::MAX_AGE, $this->age); $w->bool($this->berries); $w->bool($this->head); diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 2aa65d1f66..5c5077f22a 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -49,7 +49,7 @@ final class ChorusFlower extends Flowable{ private int $age = self::MIN_AGE; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 9aa4157b77..aafce31693 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -46,7 +46,7 @@ class CocoaBlock extends Transparent{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Crops.php b/src/block/Crops.php index 1ed62985d4..8949e663b1 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -38,7 +38,7 @@ abstract class Crops extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 2a55500c66..e1f78aef5b 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -41,7 +41,7 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); $w->bool($this->inverted); } diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index 8af12276b9..3bd791d106 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -28,8 +28,8 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; - protected function describeState(RuntimeDataDescriber $w) : void{ - parent::describeState($w); + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + parent::describeBlockOnlyState($w); $w->bool($this->activated); } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 33f3800d7d..539454b415 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -45,7 +45,7 @@ class Dirt extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); } diff --git a/src/block/Door.php b/src/block/Door.php index d3a2abfb67..06da8e68bb 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -41,7 +41,7 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->hingeRight); diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index cb341adadf..aab6d5b040 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -33,7 +33,7 @@ use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ protected bool $top = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->top); } diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 5a6537d4d7..08c903f117 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -35,7 +35,7 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->eye); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 3d293fa7e3..6fcdcd8bc2 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -37,7 +37,7 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index 7ad96d8421..c22edabc49 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -42,7 +42,7 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->open); $w->bool($this->inWall); diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index b6d9b995e5..84705ea9d5 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -37,7 +37,7 @@ abstract class FillableCauldron extends Transparent{ private int $fillLevel = self::MIN_FILL_LEVEL; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } diff --git a/src/block/Fire.php b/src/block/Fire.php index 6f43322617..9e485fa612 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -39,7 +39,7 @@ class Fire extends BaseFire{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 173c87a08f..efa560467e 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -37,7 +37,7 @@ use function rad2deg; final class FloorCoralFan extends BaseCoral{ private int $axis = Axis::X; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index dcd14c900a..f33fc82613 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -35,7 +35,7 @@ final class Froglight extends SimplePillar{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 5953ce8ae4..ba8c7b5361 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -32,7 +32,7 @@ class FrostedIce extends Ice{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index f830a38355..d943f8cc61 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -46,7 +46,7 @@ class Furnace extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->lit); } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 778e5c2a17..ea000503cb 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,7 +39,7 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 94754910f3..f14720fe42 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -50,7 +50,7 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); $w->bool($this->hasMap); } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index a5d8031dd4..bc50c3cb62 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -43,7 +43,7 @@ class Lantern extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index b83de2dde3..62a30a3e83 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -47,7 +47,7 @@ class Leaves extends Transparent{ $this->leavesType = $leavesType; } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->noDecay); $w->bool($this->checkDecay); } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index ae1df8549c..a80426acff 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -46,7 +46,7 @@ class Lectern extends Transparent{ protected bool $producingSignal = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->producingSignal); } diff --git a/src/block/Lever.php b/src/block/Lever.php index 284a646d9a..5d86ac7d2a 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -44,7 +44,7 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); } diff --git a/src/block/Light.php b/src/block/Light.php index 963c003854..239e1c0485 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -34,7 +34,7 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index ba04510a0d..98f1d56279 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -48,7 +48,7 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); $w->bool($this->still); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 0c507a166f..a2524914ab 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -34,7 +34,7 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalAxis($this->axis); } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index 34ab406c66..adf6117858 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -52,7 +52,7 @@ class NetherVines extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(5, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 787b1f5f86..76de2a4705 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -37,7 +37,7 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/Rail.php b/src/block/Rail.php index 12b47e6ea1..f516902f09 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -34,7 +34,7 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->railShape($this->railShape); } diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 07afbfc217..ecac38e18c 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -36,7 +36,7 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative), //so this information needs to be kept in the type info $w->mushroomBlockType($this->mushroomBlockType); diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 0f8fee840e..2158f1a840 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -44,7 +44,7 @@ class RedstoneComparator extends Flowable{ protected bool $isSubtractMode = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->isSubtractMode); $w->bool($this->powered); diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 1d0ff73451..58098c395e 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -29,7 +29,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->powered); } diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 13cf84205f..74708c2bd5 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -33,7 +33,7 @@ use function mt_rand; class RedstoneOre extends Opaque{ protected bool $lit = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index d1ad17eeb6..d4f1452384 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -43,7 +43,7 @@ class RedstoneRepeater extends Flowable{ protected int $delay = self::MIN_DELAY; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->bool($this->powered); diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index f85c6c07a2..b30c011d4d 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -28,8 +28,8 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ protected bool $lit = true; - protected function describeState(RuntimeDataDescriber $w) : void{ - parent::describeState($w); + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + parent::describeBlockOnlyState($w); $w->bool($this->lit); } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 73ebfeb1f3..b1f255f0d7 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -46,7 +46,7 @@ class Sapling extends Flowable{ $this->saplingType = $saplingType; } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->ready); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index c2955cbaa3..4e667038e0 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -38,7 +38,7 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index e979b09e52..b2f53e0a7d 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -34,7 +34,7 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ //NOOP - we don't read or write facing here, because the tile persists it } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index f4ad37ea44..e4278410d5 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->pressed); } diff --git a/src/block/Skull.php b/src/block/Skull.php index 926c5cc801..6566da733f 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -49,11 +49,11 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->skullType($this->skullType); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Slab.php b/src/block/Slab.php index 265dce6954..cbf5dce189 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -41,7 +41,7 @@ class Slab extends Transparent{ parent::__construct($idInfo, $name . " Slab", $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->slabType($this->slabType); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index ec08620c08..f2425455ce 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -46,7 +46,7 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index 5b283d18b2..915c98ee1b 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class Sponge extends Opaque{ protected bool $wet = false; - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->bool($this->wet); } diff --git a/src/block/Stair.php b/src/block/Stair.php index 971dbc43af..a207467217 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -46,7 +46,7 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $typeInfo); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->upsideDown); } diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index fe3d19b25e..054983dbc9 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -36,7 +36,7 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->straightOnlyRailShape($this->railShape); } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index b71a8e9eac..4cc5989a79 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -38,7 +38,7 @@ class Sugarcane extends Flowable{ protected int $age = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, self::MAX_AGE, $this->age); } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 13e710f405..b75a343ec5 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -45,7 +45,7 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); } diff --git a/src/block/TNT.php b/src/block/TNT.php index d50028f927..a0256bb673 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -45,11 +45,11 @@ 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 describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->bool($this->worksUnderwater); } - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->unstable); } diff --git a/src/block/Torch.php b/src/block/Torch.php index b7bc5136f3..163c0d115c 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -36,7 +36,7 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::DOWN); } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 79e3f0e8f9..d12a922df6 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -40,7 +40,7 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->top); $w->bool($this->open); diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index b8b3e732d4..2ddad2784a 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -33,7 +33,7 @@ class Tripwire extends Flowable{ protected bool $connected = false; protected bool $disarmed = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->triggered); $w->bool($this->suspended); $w->bool($this->connected); diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 2ad6057b8f..3258198252 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -38,7 +38,7 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->connected); $w->bool($this->powered); diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index 4523fd7ec3..a8cbd2d404 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -38,7 +38,7 @@ class UnknownBlock extends Transparent{ $this->stateData = $stateData; } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ //use type instead of state, so we don't lose any information like colour //this might be an improperly registered plugin block $w->int(Block::INTERNAL_STATE_DATA_BITS, $this->stateData); diff --git a/src/block/Vine.php b/src/block/Vine.php index 53d4b1efe1..cc516bbca7 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -39,7 +39,7 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacingFlags($this->faces); } diff --git a/src/block/Wall.php b/src/block/Wall.php index 8b128c525f..30584c92be 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -42,7 +42,7 @@ class Wall extends Transparent{ protected array $connections = []; protected bool $post = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->wallConnections($this->connections); $w->bool($this->post); } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index c7e350c473..432dd5ddba 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/Wood.php b/src/block/Wood.php index 3fbae40dad..127533b989 100644 --- a/src/block/Wood.php +++ b/src/block/Wood.php @@ -38,7 +38,7 @@ class Wood extends Opaque{ private bool $stripped = false; - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->bool($this->stripped); } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 783517dcd0..fe61f652c7 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->signalStrength); } diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 78fdd9bf9e..4805b7b7c5 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -29,7 +29,7 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facing($this->facing); } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 60dd618490..99e164a843 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -39,7 +39,7 @@ use pocketmine\world\sound\FlintSteelSound; trait CandleTrait{ private bool $lit = false; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->lit); } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index b9a14bee12..dab86fb663 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -30,8 +30,8 @@ trait ColoredTrait{ /** @var DyeColor */ private $color; - /** @see Block::describeType() */ - public function describeType(RuntimeDataDescriber $w) : void{ + /** @see Block::describeBlockItemState() */ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 11c0178f9e..5fede94ddd 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -44,7 +44,7 @@ trait CopperTrait{ parent::__construct($identifier, $name, $typeInfo); } - public function describeType(RuntimeDataDescriber $w) : void{ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 4607831c85..5dcd539d43 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -30,8 +30,8 @@ trait CoralTypeTrait{ protected CoralType $coralType; protected bool $dead = false; - /** @see Block::describeType() */ - public function describeType(RuntimeDataDescriber $w) : void{ + /** @see Block::describeBlockItemState() */ + public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->coralType($this->coralType); $w->bool($this->dead); } diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index b1558b154a..a5bd6dcf4d 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -30,7 +30,7 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); } diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index 0fc206a203..3f0117dec1 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -35,7 +35,7 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->axis($this->axis); } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index a95fea253e..05384f6110 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -28,8 +28,8 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; - protected function describeState(RuntimeDataDescriber $w) : void{ - parent::describeState($w); + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + parent::describeBlockOnlyState($w); $w->bool($this->powered); } } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 2fed259106..233c750954 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -30,7 +30,7 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; - protected function describeState(RuntimeDataDescriber $w) : void{ + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedInt(4, 0, 15, $this->rotation); } diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 1b1428b051..4ae32e7699 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -103,7 +103,7 @@ class CraftingManager{ */ public static function sort(Item $i1, Item $i2) : int{ //Use spaceship operator to compare each property, then try the next one if they are equivalent. - ($retval = $i1->getTypeId() <=> $i2->getTypeId()) === 0 && ($retval = $i1->computeTypeData() <=> $i2->computeTypeData()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; + ($retval = $i1->getTypeId() <=> $i2->getTypeId()) === 0 && ($retval = $i1->computeStateData() <=> $i2->computeStateData()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; return $retval; } @@ -142,7 +142,7 @@ class CraftingManager{ foreach($outputs as $o){ //count is not written because the outputs might be from multiple repetitions of a single recipe //this reduces the accuracy of the hash, but it won't matter in most cases. - $result->putVarInt(morton2d_encode($o->getTypeId(), $o->computeTypeData())); + $result->putVarInt(morton2d_encode($o->getTypeId(), $o->computeStateData())); $result->put((new LittleEndianNbtSerializer())->write(new TreeRoot($o->getNamedTag()))); } @@ -283,8 +283,8 @@ class CraftingManager{ } public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ - $inputHash = morton2d_encode($input->getTypeId(), $input->computeTypeData()); - $ingredientHash = morton2d_encode($ingredient->getTypeId(), $ingredient->computeTypeData()); + $inputHash = morton2d_encode($input->getTypeId(), $input->computeStateData()); + $ingredientHash = morton2d_encode($ingredient->getTypeId(), $ingredient->computeStateData()); $cached = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; if($cached !== null){ return $cached; diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index 74e2817b66..951c55681b 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -66,7 +66,7 @@ final class FurnaceRecipeManager{ } public function match(Item $input) : ?FurnaceRecipe{ - $index = morton2d_encode($input->getTypeId(), $input->computeTypeData()); + $index = morton2d_encode($input->getTypeId(), $input->computeStateData()); $simpleRecipe = $this->lookupCache[$index] ?? null; if($simpleRecipe !== null){ return $simpleRecipe; diff --git a/src/item/Banner.php b/src/item/Banner.php index 5de6bd9091..250f2099ef 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -63,7 +63,7 @@ class Banner extends ItemBlockWallOrFloor{ return $this; } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index 7ea31d53de..294eb6d6e2 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -33,7 +33,7 @@ use pocketmine\math\Facing; final class CoralFan extends Item{ use CoralTypeTrait { - describeType as encodeCoralType; + describeBlockItemState as encodeCoralType; } public function __construct(ItemIdentifier $identifier){ @@ -41,7 +41,7 @@ final class CoralFan extends Item{ parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ //this is aliased to ensure a compile error in case the functions in Item or Block start to differ in future //right now we can directly reuse encodeType from CoralTypeTrait, but that might silently stop working if Item //were to be altered. CoralTypeTrait was originally intended for blocks, so it's better not to assume anything. diff --git a/src/item/Dye.php b/src/item/Dye.php index 969c66eeeb..f71b44e3a9 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -34,7 +34,7 @@ class Dye extends Item{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); } diff --git a/src/item/Item.php b/src/item/Item.php index c052331a3b..6fe45fccc9 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -469,13 +469,17 @@ class Item implements \JsonSerializable{ return $this->identifier->getTypeId(); } - final public function computeTypeData() : int{ + final public function computeStateData() : int{ $writer = new RuntimeDataWriter(16); //TODO: max bits should be a constant instead of being hardcoded all over the place - $this->describeType($writer); + $this->describeState($writer); return $writer->getValue(); } - protected function describeType(RuntimeDataDescriber $w) : void{ + /** + * Describes state properties of the item, such as colour, skull type, etc. + * This allows associating basic extra data with the item at runtime in a more efficient format than NBT. + */ + protected function describeState(RuntimeDataDescriber $w) : void{ //NOOP } @@ -627,7 +631,7 @@ class Item implements \JsonSerializable{ */ final public function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{ return $this->getTypeId() === $item->getTypeId() && - $this->computeTypeData() === $item->computeTypeData() && + $this->computeStateData() === $item->computeStateData() && (!$checkCompound || $this->getNamedTag()->equals($item->getNamedTag())); } @@ -646,7 +650,7 @@ class Item implements \JsonSerializable{ } final public function __toString() : string{ - return "Item " . $this->name . " (" . $this->getTypeId() . ":" . $this->computeTypeData() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); + return "Item " . $this->name . " (" . $this->getTypeId() . ":" . $this->computeStateData() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); } /** diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 16c4badf32..fbbe2efeb4 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -39,8 +39,8 @@ final class ItemBlock extends Item{ parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); } - protected function describeType(RuntimeDataDescriber $w) : void{ - $this->block->describeType($w); + protected function describeState(RuntimeDataDescriber $w) : void{ + $this->block->describeBlockItemState($w); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/Medicine.php b/src/item/Medicine.php index 099af6d3ca..a15ac03535 100644 --- a/src/item/Medicine.php +++ b/src/item/Medicine.php @@ -36,7 +36,7 @@ class Medicine extends Item implements ConsumableItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->medicineType($this->medicineType); } diff --git a/src/item/Potion.php b/src/item/Potion.php index 7fcbeaa046..0ef3398666 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -36,7 +36,7 @@ class Potion extends Item implements ConsumableItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index a99d7541d0..c54562f2b0 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -38,7 +38,7 @@ class SplashPotion extends ProjectileItem{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 72bc4d6a99..c2905a40b0 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1540,7 +1540,7 @@ final class StringToItemParser extends StringToTParser{ public function register(string $alias, \Closure $callback) : void{ parent::register($alias, $callback); $item = $callback($alias); - $this->reverseMap[$item->getTypeId()][$item->computeTypeData()][$alias] = true; + $this->reverseMap[$item->getTypeId()][$item->computeStateData()][$alias] = true; } /** @phpstan-param \Closure(string $input) : Block $callback */ @@ -1559,7 +1559,7 @@ final class StringToItemParser extends StringToTParser{ * @phpstan-return list */ public function lookupAliases(Item $item) : array{ - $aliases = $this->reverseMap[$item->getTypeId()][$item->computeTypeData()] ?? []; + $aliases = $this->reverseMap[$item->getTypeId()][$item->computeStateData()] ?? []; return array_keys($aliases); } diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php index 1ecb94d7bc..a2adc0b617 100644 --- a/src/item/SuspiciousStew.php +++ b/src/item/SuspiciousStew.php @@ -34,7 +34,7 @@ class SuspiciousStew extends Food{ parent::__construct($identifier, $name); } - protected function describeType(RuntimeDataDescriber $w) : void{ + protected function describeState(RuntimeDataDescriber $w) : void{ $w->suspiciousStewType($this->suspiciousStewType); } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index b6c7909b6c..6c31f015a7 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -222,7 +222,7 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setLong(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeTypeData())); + $nbt->setLong(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeStateData())); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; } diff --git a/src/player/Player.php b/src/player/Player.php index a858a4f21e..561116cf27 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -687,7 +687,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function getItemCooldownExpiry(Item $item) : int{ $this->checkItemCooldowns(); - return $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] ?? 0; + return $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())] ?? 0; } /** @@ -695,7 +695,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasItemCooldown(Item $item) : bool{ $this->checkItemCooldowns(); - return isset($this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())]); + return isset($this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())]); } /** @@ -704,7 +704,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function resetItemCooldown(Item $item, ?int $ticks = null) : void{ $ticks = $ticks ?? $item->getCooldownTicks(); if($ticks > 0){ - $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] = $this->server->getTick() + $ticks; + $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())] = $this->server->getTick() + $ticks; } } From c9bb4335a1b722c0c2d7fbe1b759ff2656635f1b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 14:14:18 +0100 Subject: [PATCH 0999/1858] Item: added getStateId(), removed state data from public API state data was only used for indexing stuff along with state ID anyway, so it makes more sense to lock it away in here instead. --- src/crafting/CraftingManager.php | 9 ++++----- src/crafting/FurnaceRecipeManager.php | 3 +-- src/item/Item.php | 10 +++++++--- src/item/StringToItemParser.php | 4 ++-- src/network/mcpe/convert/TypeConverter.php | 3 +-- src/player/Player.php | 7 +++---- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 4ae32e7699..74bc2ba102 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -29,7 +29,6 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\BinaryStream; use pocketmine\utils\DestructorCallbackTrait; use pocketmine\utils\ObjectSet; -use function morton2d_encode; use function usort; class CraftingManager{ @@ -103,7 +102,7 @@ class CraftingManager{ */ public static function sort(Item $i1, Item $i2) : int{ //Use spaceship operator to compare each property, then try the next one if they are equivalent. - ($retval = $i1->getTypeId() <=> $i2->getTypeId()) === 0 && ($retval = $i1->computeStateData() <=> $i2->computeStateData()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; + ($retval = $i1->getStateId() <=> $i2->getStateId()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; return $retval; } @@ -142,7 +141,7 @@ class CraftingManager{ foreach($outputs as $o){ //count is not written because the outputs might be from multiple repetitions of a single recipe //this reduces the accuracy of the hash, but it won't matter in most cases. - $result->putVarInt(morton2d_encode($o->getTypeId(), $o->computeStateData())); + $result->putVarInt($o->getStateId()); $result->put((new LittleEndianNbtSerializer())->write(new TreeRoot($o->getNamedTag()))); } @@ -283,8 +282,8 @@ class CraftingManager{ } public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ - $inputHash = morton2d_encode($input->getTypeId(), $input->computeStateData()); - $ingredientHash = morton2d_encode($ingredient->getTypeId(), $ingredient->computeStateData()); + $inputHash = $input->getStateId(); + $ingredientHash = $ingredient->getStateId(); $cached = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; if($cached !== null){ return $cached; diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index 951c55681b..d13465b44a 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -25,7 +25,6 @@ namespace pocketmine\crafting; use pocketmine\item\Item; use pocketmine\utils\ObjectSet; -use function morton2d_encode; final class FurnaceRecipeManager{ /** @var FurnaceRecipe[] */ @@ -66,7 +65,7 @@ final class FurnaceRecipeManager{ } public function match(Item $input) : ?FurnaceRecipe{ - $index = morton2d_encode($input->getTypeId(), $input->computeStateData()); + $index = $input->getStateId(); $simpleRecipe = $this->lookupCache[$index] ?? null; if($simpleRecipe !== null){ return $simpleRecipe; diff --git a/src/item/Item.php b/src/item/Item.php index 6fe45fccc9..35b46cd908 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -55,6 +55,7 @@ use function count; use function gettype; use function hex2bin; use function is_string; +use function morton2d_encode; class Item implements \JsonSerializable{ use ItemEnchantmentHandlingTrait; @@ -469,7 +470,11 @@ class Item implements \JsonSerializable{ return $this->identifier->getTypeId(); } - final public function computeStateData() : int{ + final public function getStateId() : int{ + return morton2d_encode($this->identifier->getTypeId(), $this->computeStateData()); + } + + private function computeStateData() : int{ $writer = new RuntimeDataWriter(16); //TODO: max bits should be a constant instead of being hardcoded all over the place $this->describeState($writer); return $writer->getValue(); @@ -630,8 +635,7 @@ class Item implements \JsonSerializable{ * @param bool $checkCompound Whether to verify that the items' NBT match. */ final public function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{ - return $this->getTypeId() === $item->getTypeId() && - $this->computeStateData() === $item->computeStateData() && + return $this->getStateId() === $item->getStateId() && (!$checkCompound || $this->getNamedTag()->equals($item->getNamedTag())); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c2905a40b0..c98e29719a 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1540,7 +1540,7 @@ final class StringToItemParser extends StringToTParser{ public function register(string $alias, \Closure $callback) : void{ parent::register($alias, $callback); $item = $callback($alias); - $this->reverseMap[$item->getTypeId()][$item->computeStateData()][$alias] = true; + $this->reverseMap[$item->getStateId()][$alias] = true; } /** @phpstan-param \Closure(string $input) : Block $callback */ @@ -1559,7 +1559,7 @@ final class StringToItemParser extends StringToTParser{ * @phpstan-return list */ public function lookupAliases(Item $item) : array{ - $aliases = $this->reverseMap[$item->getTypeId()][$item->computeStateData()] ?? []; + $aliases = $this->reverseMap[$item->getStateId()] ?? []; return array_keys($aliases); } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 6c31f015a7..e01a5a10f5 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -48,7 +48,6 @@ use pocketmine\utils\SingletonTrait; use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\format\io\GlobalItemDataHandlers; use function get_class; -use function morton2d_encode; class TypeConverter{ use SingletonTrait; @@ -222,7 +221,7 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setLong(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeStateData())); + $nbt->setLong(self::PM_ID_TAG, $itemStack->getStateId()); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; } diff --git a/src/player/Player.php b/src/player/Player.php index 561116cf27..1f4237acf7 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -146,7 +146,6 @@ use function max; use function mb_strlen; use function microtime; use function min; -use function morton2d_encode; use function preg_match; use function spl_object_id; use function sqrt; @@ -687,7 +686,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function getItemCooldownExpiry(Item $item) : int{ $this->checkItemCooldowns(); - return $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())] ?? 0; + return $this->usedItemsCooldown[$item->getStateId()] ?? 0; } /** @@ -695,7 +694,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasItemCooldown(Item $item) : bool{ $this->checkItemCooldowns(); - return isset($this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())]); + return isset($this->usedItemsCooldown[$item->getStateId()]); } /** @@ -704,7 +703,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function resetItemCooldown(Item $item, ?int $ticks = null) : void{ $ticks = $ticks ?? $item->getCooldownTicks(); if($ticks > 0){ - $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeStateData())] = $this->server->getTick() + $ticks; + $this->usedItemsCooldown[$item->getStateId()] = $this->server->getTick() + $ticks; } } From a4fea1444a50f2382ba9b8643fb041db781036d0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 14:21:32 +0100 Subject: [PATCH 1000/1858] Remove validateCallableSignature() calls from network hot paths we rely on phpstan for validation of this internally, and plugins shouldn't be calling these methods anyway. this significantly reduces the overhead of CompressBatchPromise. --- src/network/mcpe/NetworkSession.php | 2 -- src/network/mcpe/compression/CompressBatchPromise.php | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 92a992ffb7..dfb2e1aba6 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1000,8 +1000,6 @@ class NetworkSession{ * @phpstan-param \Closure() : void $onCompletion */ public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{ - Utils::validateCallableSignature(function() : void{}, $onCompletion); - $world = $this->player->getLocation()->getWorld(); ChunkCache::getInstance($world, $this->compressor)->request($chunkX, $chunkZ)->onResolve( diff --git a/src/network/mcpe/compression/CompressBatchPromise.php b/src/network/mcpe/compression/CompressBatchPromise.php index 3b8c9680ba..6c8333db67 100644 --- a/src/network/mcpe/compression/CompressBatchPromise.php +++ b/src/network/mcpe/compression/CompressBatchPromise.php @@ -42,9 +42,6 @@ class CompressBatchPromise{ */ public function onResolve(\Closure ...$callbacks) : void{ $this->checkCancelled(); - foreach($callbacks as $callback){ - Utils::validateCallableSignature(function(CompressBatchPromise $promise) : void{}, $callback); - } if($this->result !== null){ foreach($callbacks as $callback){ $callback($this); From 9499e2e5955e92e486a603c00d1df170097e70a2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 14:21:59 +0100 Subject: [PATCH 1001/1858] always the CS... --- src/network/mcpe/NetworkSession.php | 1 - src/network/mcpe/compression/CompressBatchPromise.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index dfb2e1aba6..d87c1b9a84 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -107,7 +107,6 @@ use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; -use pocketmine\utils\Utils; use pocketmine\world\Position; use function array_map; use function array_values; diff --git a/src/network/mcpe/compression/CompressBatchPromise.php b/src/network/mcpe/compression/CompressBatchPromise.php index 6c8333db67..12ac35c604 100644 --- a/src/network/mcpe/compression/CompressBatchPromise.php +++ b/src/network/mcpe/compression/CompressBatchPromise.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\compression; -use pocketmine\utils\Utils; use function array_push; class CompressBatchPromise{ From 599c4284f560ce09aac1cda996743daf9d543aff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 22:54:06 +0100 Subject: [PATCH 1002/1858] Introduce 10 KB threshold for async compression due to the extremely large performance cost of instantiating AsyncTasks, it's usually not worth bothering with async compression except for very large packets. While this large overhead can be significantly reduced by using specialized threads, it's early days in the testing stages for such improvements, and for now, we still have this to deal with. Since async compression is always used prior to player spawn, this change may slightly improve the performance of the pre-join stage of the game. --- resources/pocketmine.yml | 5 ++++- src/Server.php | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/pocketmine.yml b/resources/pocketmine.yml index ac60afe53f..408b5b95b3 100644 --- a/resources/pocketmine.yml +++ b/resources/pocketmine.yml @@ -85,8 +85,11 @@ network: batch-threshold: 256 #Compression level used when sending batched packets. Higher = more CPU, less bandwidth usage compression-level: 6 - #Use AsyncTasks for compression. Adds half/one tick delay, less CPU load on main thread + #Use AsyncTasks for compression during the main game session. Increases latency, but may reduce main thread load async-compression: false + #Threshold for async compression, in bytes. Only packets larger than this will be compressed asynchronously + #Due to large overhead of AsyncTask, async compression isn't worth it except for large packets + async-compression-threshold: 10000 #Experimental. Use UPnP to automatically port forward upnp-forwarding: false #Maximum size in bytes of packets sent over the network (default 1492 bytes). Packets larger than this will be diff --git a/src/Server.php b/src/Server.php index a81b1d74b3..11a2b157a6 100644 --- a/src/Server.php +++ b/src/Server.php @@ -208,6 +208,8 @@ class Server{ private const TICKS_PER_TPS_OVERLOAD_WARNING = 5 * self::TARGET_TICKS_PER_SECOND; private const TICKS_PER_STATS_REPORT = 300 * self::TARGET_TICKS_PER_SECOND; + private const DEFAULT_ASYNC_COMPRESSION_THRESHOLD = 10_000; + private static ?Server $instance = null; private TimeTrackingSleeperHandler $tickSleeper; @@ -266,6 +268,7 @@ class Server{ private Network $network; private bool $networkCompressionAsync = true; + private int $networkCompressionAsyncThreshold = self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD; private Language $language; private bool $forceLanguage = false; @@ -908,6 +911,10 @@ class Server{ ZlibCompressor::setInstance(new ZlibCompressor($netCompressionLevel, $netCompressionThreshold, ZlibCompressor::DEFAULT_MAX_DECOMPRESSION_SIZE)); $this->networkCompressionAsync = $this->configGroup->getPropertyBool("network.async-compression", true); + $this->networkCompressionAsyncThreshold = max( + $this->configGroup->getPropertyInt("network.async-compression-threshold", self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD), + $netCompressionThreshold ?? self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD + ); EncryptionContext::$ENABLED = $this->configGroup->getPropertyBool("network.enable-encryption", true); @@ -1375,7 +1382,7 @@ class Server{ } $promise = new CompressBatchPromise(); - if(!$sync){ + if(!$sync && strlen($buffer) >= $this->networkCompressionAsyncThreshold){ $task = new CompressBatchTask($buffer, $promise, $compressor); $this->asyncPool->submitTask($task); }else{ From 008a022ec16e9d2f7986febcefab26a9b3f3ab51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 23:02:33 +0100 Subject: [PATCH 1003/1858] Players now have finite resources in spectator mode this seems like the logical solution for the block picking issues. --- src/player/Player.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 279dd1ebf3..e8dae37f42 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1191,7 +1191,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * TODO: make this a dynamic ability instead of being hardcoded */ public function hasFiniteResources() : bool{ - return $this->gamemode->equals(GameMode::SURVIVAL()) || $this->gamemode->equals(GameMode::ADVENTURE()); + return !$this->gamemode->equals(GameMode::CREATIVE()); } public function isFireProof() : bool{ @@ -1657,7 +1657,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $ev = new PlayerBlockPickEvent($this, $block, $item); $existingSlot = $this->inventory->first($item); - if($existingSlot === -1 && ($this->hasFiniteResources() || $this->isSpectator())){ + if($existingSlot === -1 && $this->hasFiniteResources()){ $ev->cancel(); } $ev->call(); From 5a0cde49cc80e395a85204f9e9a15dd1884acc1e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 16 May 2023 23:37:58 +0100 Subject: [PATCH 1004/1858] AsyncPool: do not double-check progress updates on finished tasks checkProgressUpdates is called directly before onCompletion, so we only need to call it again if the task isn't finished yet. --- src/scheduler/AsyncPool.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 9029eb5935..99175651db 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -247,7 +247,6 @@ class AsyncPool{ while(!$queue->isEmpty()){ /** @var AsyncTask $task */ $task = $queue->bottom(); - $task->checkProgressUpdates(); if($task->isFinished()){ //make sure the task actually executed before trying to collect $queue->dequeue(); @@ -268,6 +267,7 @@ class AsyncPool{ $task->onCompletion(); } }else{ + $task->checkProgressUpdates(); $more = true; break; //current task is still running, skip to next worker } From 2e5b2eed6eee5885ff3259b40c294e9762e4ce18 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 13:43:28 +0100 Subject: [PATCH 1005/1858] Update composer dependencies --- composer.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index 9db2f55195..a0e4aa8e46 100644 --- a/composer.lock +++ b/composer.lock @@ -2364,16 +2364,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.7", + "version": "9.6.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c993f0d3b0489ffc42ee2fe0bd645af1538a63b2" + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c993f0d3b0489ffc42ee2fe0bd645af1538a63b2", - "reference": "c993f0d3b0489ffc42ee2fe0bd645af1538a63b2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", "shasum": "" }, "require": { @@ -2447,7 +2447,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.7" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" }, "funding": [ { @@ -2463,7 +2463,7 @@ "type": "tidelift" } ], - "time": "2023-04-14T08:58:40+00:00" + "time": "2023-05-11T05:14:45+00:00" }, { "name": "sebastian/cli-parser", @@ -2765,16 +2765,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -2819,7 +2819,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -2827,7 +2827,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", From 043350753b9c93a6a7e508fbaec0744e5d2d4beb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 13:53:57 +0100 Subject: [PATCH 1006/1858] Drop PHP 8.0, 8.1 is now minimum version --- .github/workflows/main.yml | 10 +- .github/workflows/update-php-versions.php | 1 - BUILDING.md | 10 +- build/php | 2 +- composer.json | 4 +- composer.lock | 126 ++++------------------ src/PocketMine.php | 2 +- 7 files changed, 34 insertions(+), 121 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e3a2b16408..da8468a813 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.18, 8.2.5] + php: [8.1.19, 8.2.6] steps: - name: Build and prepare PHP cache @@ -32,7 +32,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.18, 8.2.5] + php: [8.1.19, 8.2.6] steps: - uses: actions/checkout@v3 @@ -71,7 +71,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.18, 8.2.5] + php: [8.1.19, 8.2.6] steps: - uses: actions/checkout@v3 @@ -110,7 +110,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.18, 8.2.5] + php: [8.1.19, 8.2.6] steps: - uses: actions/checkout@v3 @@ -151,7 +151,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.0.28, 8.1.18, 8.2.5] + php: [8.1.19, 8.2.6] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/update-php-versions.php b/.github/workflows/update-php-versions.php index 92e79a6dec..2455ba101a 100644 --- a/.github/workflows/update-php-versions.php +++ b/.github/workflows/update-php-versions.php @@ -22,7 +22,6 @@ declare(strict_types=1); const VERSIONS = [ - "8.0", "8.1", "8.2" ]; diff --git a/BUILDING.md b/BUILDING.md index d6e97e05c7..95197de6bd 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -2,13 +2,13 @@ ## Pre-requisites - A bash shell (git bash is sufficient for Windows) - [`git`](https://git-scm.com) available in your shell -- PHP 8.0 or newer available in your shell +- PHP 8.1 or newer available in your shell - [`composer`](https://getcomposer.org) available in your shell ## Custom PHP binaries Because PocketMine-MP requires several non-standard PHP extensions and configuration, PMMP provides scripts to build custom binaries for running PocketMine-MP, as well as prebuilt binaries. -- [Prebuilt binaries](https://jenkins.pmmp.io/job/PHP-8.0-Aggregate) +- [Prebuilt binaries](https://github.com/pmmp/PHP-Binaries/releases) - [Compile scripts](https://github.com/pmmp/php-build-scripts) are provided as a submodule in the path `build/php` If you use a custom binary, you'll need to replace `composer` usages in this guide with `path/to/your/php path/to/your/composer.phar`. @@ -29,11 +29,5 @@ Run `composer make-server` using your preferred PHP binary. It'll drop a `Pocket You can also use the `--out` option to change the output filename. -There is a bug in PHP that might cause an error which looks like this: -``` -Fatal error: Uncaught BadMethodCallException: unable to create temporary file in PocketMine-MP/build/server-phar.php:119 -``` -You can work around it by setting `ulimit -n` to some bigger number, e.g. `8192`, or by updating your PHP version to at least 8.0.3. - ## Running PocketMine-MP from source code Run `src/PocketMine.php` using your preferred PHP binary. diff --git a/build/php b/build/php index a3c40579ad..07f3d90faa 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a3c40579ad91246b07053fc2c8f085efd442943a +Subproject commit 07f3d90faa1edcbd9c5adc7d17a1bb64a06dc346 diff --git a/composer.json b/composer.json index 630b31c17e..0c1470be3e 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "homepage": "https://pmmp.io", "license": "LGPL-3.0", "require": { - "php": "^8.0", + "php": "^8.1", "php-64bit": "*", "ext-chunkutils2": "^0.3.1", "ext-crypto": "^0.3.1", @@ -77,7 +77,7 @@ }, "config": { "platform": { - "php": "8.0.0" + "php": "8.1.0" }, "sort-packages": true }, diff --git a/composer.lock b/composer.lock index a0e4aa8e46..fa28f6b622 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a5ffe862f4e6376eaf78593a4bb8aeb6", + "content-hash": "ecb1e46a4410fdc7efb7e3dac60b5322", "packages": [ { "name": "adhocore/json-comment", @@ -903,21 +903,20 @@ }, { "name": "ramsey/collection", - "version": "1.3.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", - "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "require-dev": { "captainhook/plugin-composer": "^5.3", @@ -977,7 +976,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.3.0" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -989,7 +988,7 @@ "type": "tidelift" } ], - "time": "2022-12-27T19:12:24+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", @@ -1395,85 +1394,6 @@ ], "time": "2022-11-03T14:55:06+00:00" }, - { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, { "name": "webmozart/assert", "version": "1.11.0", @@ -1587,30 +1507,30 @@ "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.5.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -1637,7 +1557,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -1653,7 +1573,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "myclabs/deep-copy", @@ -3486,7 +3406,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0", + "php": "^8.1", "php-64bit": "*", "ext-chunkutils2": "^0.3.1", "ext-crypto": "^0.3.1", @@ -3515,7 +3435,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "8.0.0" + "php": "8.1.0" }, "plugin-api-version": "2.3.0" } diff --git a/src/PocketMine.php b/src/PocketMine.php index 4b0b644ecb..7b47449d58 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -50,7 +50,7 @@ namespace pocketmine { require_once __DIR__ . '/VersionInfo.php'; - const MIN_PHP_VERSION = "8.0.0"; + const MIN_PHP_VERSION = "8.1.0"; /** * @param string $message From c7dff9ea40519eb8c1f85e47ff2b6e710591fd6c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 14:11:43 +0100 Subject: [PATCH 1007/1858] bootstrap: remove ext-parallel bootstrapping code I have no intention of using parallel, so this code is not necessary. --- src/PocketMine.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index 7b47449d58..c653d33ea7 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -265,9 +265,6 @@ JIT_WARNING exit(1); } } - if(extension_loaded('parallel')){ - \parallel\bootstrap(\pocketmine\COMPOSER_AUTOLOADER_PATH); - } ErrorToExceptionHandler::set(); From 0547383296e17131c23b6a8a827e87a40fffc3d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 15:08:05 +0100 Subject: [PATCH 1008/1858] Update build/php submodule to pmmp/PHP-Binaries@f860ade30acc074a98bbf5ff286f35b5eda10c86 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 07f3d90faa..f860ade30a 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 07f3d90faa1edcbd9c5adc7d17a1bb64a06dc346 +Subproject commit f860ade30acc074a98bbf5ff286f35b5eda10c86 From 9621836e36b9a9bb8c3ce1d339871bd6a07d7cc1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 15:21:49 +0100 Subject: [PATCH 1009/1858] Clean up confusing mess around block and item overriding right now, I don't see an obvious reason to do this. If it turns out I was wrong later on, we can add functionality back, but we can't remove functionality after release. --- src/block/RuntimeBlockStateRegistry.php | 18 ++++++------------ .../convert/BlockObjectToStateSerializer.php | 3 +-- src/data/bedrock/item/ItemDeserializer.php | 3 +++ src/data/bedrock/item/ItemSerializer.php | 3 +-- tests/phpunit/block/BlockTest.php | 9 --------- 5 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index bc08c6a5de..e524fb2627 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -81,22 +81,16 @@ class RuntimeBlockStateRegistry{ } /** - * 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. + * Maps a block type's state permutations to its corresponding state IDs. This is necessary for the block to be + * recognized when fetching it by its state ID from chunks 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 \InvalidArgumentException if something attempted to override an already-registered block without specifying the - * $override parameter. + * @throws \InvalidArgumentException if the desired block type ID is already registered */ - public function register(Block $block, bool $override = false) : void{ + public function register(Block $block) : void{ $typeId = $block->getTypeId(); - if(!$override && isset($this->typeIndex[$typeId])){ - throw new \InvalidArgumentException("Block ID $typeId is already used by another block, and override was not requested"); + if(isset($this->typeIndex[$typeId])){ + throw new \InvalidArgumentException("Block ID $typeId is already used by another block"); } $this->typeIndex[$typeId] = clone $block; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 02869fa75a..fabb525d5b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -210,8 +210,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ */ public function map(Block $block, \Closure $serializer) : void{ if(isset($this->serializers[$block->getTypeId()])){ - //TODO: REMOVE ME - throw new AssumptionFailedError("Registering the same block twice!"); + throw new \InvalidArgumentException("Block type ID " . $block->getTypeId() . " already has a serializer registered"); } $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; } diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index f4f43e3cb8..f7854313fc 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -51,6 +51,9 @@ final class ItemDeserializer{ * @phpstan-param \Closure(Data) : Item $deserializer */ public function map(string $id, \Closure $deserializer) : void{ + if(isset($this->deserializers[$id])){ + throw new \InvalidArgumentException("Deserializer is already assigned for \"$id\""); + } $this->deserializers[$id] = $deserializer; } diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index fbdf2c41b6..0b153c3da2 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -67,8 +67,7 @@ final class ItemSerializer{ public function map(Item $item, \Closure $serializer) : void{ $index = $item->getTypeId(); if(isset($this->itemSerializers[$index])){ - //TODO: REMOVE ME - throw new AssumptionFailedError("Registering the same item twice!"); + throw new \InvalidArgumentException("Item type ID " . $index . " already has a serializer registered"); } $this->itemSerializers[$index][get_class($item)] = $serializer; } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index e10ef7fc7a..81f1c35166 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -49,15 +49,6 @@ class BlockTest extends TestCase{ $this->blockFactory->register($block); } - /** - * Test registering a block deliberately overwriting another block works as expected - */ - public function testDeliberateOverrideBlock() : void{ - $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE), "Cobblestone", new BlockTypeInfo(BlockBreakInfo::instant())); - $this->blockFactory->register($block, true); - self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->fromStateId($block->getStateId())); - } - /** * Test registering a new block which does not yet exist */ From 59ca7b75e172ff7ebab75bfdb23b18fa75016768 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 15:32:38 +0100 Subject: [PATCH 1010/1858] Fixed PHPStan error --- src/item/StringToItemParser.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c98e29719a..a6aea2ae2c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1532,8 +1532,8 @@ final class StringToItemParser extends StringToTParser{ } /** - * @var true[][][] - * @phpstan-var array>> + * @var true[][] + * @phpstan-var array> */ private array $reverseMap = []; From ef40934d24748025d15d9b86acc28fbb82d6de6a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 16:45:32 +0100 Subject: [PATCH 1011/1858] Release 4.21.0 --- changelogs/4.21.md | 71 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +-- 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.21.md diff --git a/changelogs/4.21.md b/changelogs/4.21.md new file mode 100644 index 0000000000..34254d6b2c --- /dev/null +++ b/changelogs/4.21.md @@ -0,0 +1,71 @@ +**For Minecraft: Bedrock Edition 1.19.80** + +### Note about API versions +Plugins which don't touch the `pocketmine\network\mcpe` namespace, and don't use reflection or any internal methods, +will also run on these releases and do not need API bumps. +Plugin developers should **only** update their required API to this version if you need the changes in this build. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +# 4.21.0 +Released 17th May 2023. + +## General +- PHP 8.1 is now required. Most plugins should run without changes, but some might need to be updated due to language-level deprecations. +- Ticking chunk count is now shown separately from loaded chunk count in the `/status` command, providing useful performance information. +- Further improved performance of ticking chunk selection. +- Improved performance of some inventory functions. +- Reduced server memory footprint in most cases by ~9 MB per thread. +- Due to large overhead, async network compression is now only used for packets larger than 10 KB by default. + +## Configuration +- Added the following new `pocketmine.yml` configuration options: + - `network.async-compression-threshold` - minimum size of packet which will be compressed using `AsyncTask` + - Default is 10 KB, which means that very few packets will use async compression in practice. This is because the overhead of compressing async is currently so high that it's not worth it for smaller packets. + +## Timings +- Timings reports no longer include the unused metadata fields `Entities` and `LivingEntities`. +- Timings reports now correctly calculate the peak time of a timer. + - Previously it was incorrectly recorded as the longest time spent in a single tick, rather than the longest time spent in a single activation. + - Timings report version has been bumped to `2` to reflect this change. +- All world-specific timers now have generic aggregate timings, making it much easier to locate performance patterns across all worlds. + +## Gameplay +- Players in spectator mode are no longer able to pick blocks, and now have finite resources similar to survival mode. + +## API +### `pocketmine\world` +- The following API methods have been added: + - `public World->getTickingChunks() : list` - returns a list of chunk position hashes (a la `World::chunkHash()`) which are currently valid for random ticking + +### `pocketmine\inventory` +- The following API methods have been added: + - `protected BaseInventory->getMatchingItemCount(int $slot, Item $test, bool $checkDamage, bool $checkTags) : int` - returns the number of items in the given stack if the content of the slot matches the test item, or zero otherwise + - This should be overridden if directly extending `BaseInventory` to provide a performance-optimised version. A slow default implementation is provided, but it will be removed in the future. + +## Internals +### Entity +- Unused `NameTag` tag is no longer saved for `Human` entities. + +### Inventory +- `BaseInventory` now uses a new internal method `getMatchingItemCount()` to locate items in the inventory without useless cloning. This improves performance of various API methods, such as `addItem()`, `contains()`, and more. +- Specialization of `Inventory->isSlotEmpty()` in `BaseInventory` subclasses has been added to improve performance of some API methods. + +### Network +- `RuntimeBlockMapping` no longer keeps all block palette NBT data in memory. + - This significantly reduces server idle memory footprint. + - For multi-version implementations, this will have a significant impact on memory usage, since a different block palette is often required to support each version. + - NBT will be lazy-loaded into memory and cached if `getBedrockKnownStates()` is called. However, this is not used by PocketMine-MP under normal circumstances. +- Removed unnecessary usage of `Utils::validateCallableSignature()` from some internal network pathways, improving performance. + +### Scheduler +- `AsyncPool` no longer double-checks progress updates on completed tasks. + +### World +- Ticking chunks are now tracked in `World->validTickingChunks` and `World->recheckTickingChunks`. + - This allows avoiding rechecking every ticking chunk for validity during ticking chunk selection, improving performance. + - In some cases, this allows bypassing chunk selection entirely, reducing selection cost to zero. +- Registered but ineligible ticking chunks are no longer rechecked every tick. + - This was causing wasted cycles during async worker backlog. + - The internal system must call `markTickingChunkForRecheck()` whenever a ticking chunk's eligibility for ticking has potentially changed, rather than just when it has changed from a yes to a no. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d577d80693..457baae902 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.5"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.21.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 6186fc0bfe50b06cfbbfd044995234b89cf6cf18 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 16:45:35 +0100 Subject: [PATCH 1012/1858] 4.21.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 457baae902..ea1082c128 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.21.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.21.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From b8abe34904beab1befd3707ac3fa4a9761533b89 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 19:47:42 +0100 Subject: [PATCH 1013/1858] Release 5.0.0-BETA3 --- changelogs/5.0-beta.md | 101 +++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-beta.md b/changelogs/5.0-beta.md index e2e9079b5c..27eef09a06 100644 --- a/changelogs/5.0-beta.md +++ b/changelogs/5.0-beta.md @@ -93,3 +93,104 @@ Released 11th April 2023. ## Internals - Make use of `Item->canStackWith()` instead of `Item->equals()` wherever possible, to make the code more readable. + +# 5.0.0-BETA3 +Released 17th May 2023. + +**This release includes changes from the following releases:** +- [4.19.1](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.19.md#4191) +- [4.19.2](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.19.md#4192) +- [4.19.3](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.19.md#4193) +- [4.20.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.20.md#4200) +- [4.20.1](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.20.md#4201) +- [4.20.2](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.20.md#4202) +- [4.20.3](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.20.md#4203) +- [4.20.4](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.20.md#4204) +- [4.21.0](https://github.com/pmmp/PocketMine-MP/blob/5.0.0-BETA3/changelogs/4.21.md#4210) + +## General +- Improved light propagation performance by 10-15%. + +## Fixes +- Fixed late initialization of coral type in `BaseCoral`. + +## Tools +- `tools/generate-blockstate-upgrade-schema.php` has the following improvements: + - Now generates better errors when inconsistent blockstate versions are encountered. + - Now generates more stable outputs when re-run on the same input. + - Output now uses `copiedState` in `remappedStates` where possible. This significantly reduces the size of the output for blocks with partially flattened states. + +## Gameplay +- The following blocks have been added: + - Cave Vines +- The following items have been added: + - Glow Berries + - Mangrove Boat (incomplete) +- Fixed flower pots being able to be placed inside flower pots. + +## API +### `pocketmine\block` +- The following API methods have been renamed: + - `Block->isSameType()` -> `Block->hasSameTypeId()` + - `Block->describeType()` -> `Block->describeBlockItemState()` + - `Block->describeState()` -> `Block->describeBlockOnlyState()` +- The following API methods have been removed: + - `Block->getRequiredTypeDataBits()` + - `Block->getRequiredStateDataBits()` +- The following API methods have been added: + - `public Block->generateStatePermutations() : \Generator` - yields all possible states this block type can be in (used for `RuntimeBlockStateRegistry`) +- The following API methods have signature changes: + - `Sapling::__construct()` now accepts `SaplingType $saplingType` instead of `TreeType $treeType` + - `RuntimeBlockStateRegistry->register()` no longer accepts an `$override` parameter. +- The following classes have been added: + - `utils\SaplingType` - enum of all sapling types +- `utils\TreeType` has been moved to `pocketmine\world\generator\object` namespace. + +### `pocketmine\data\bedrock\item\upgrade` +- The following API methods have been added: + - `public ItemIdMetaUpgrader->getSchemas() : array` - returns a list of loaded schemas indexed by schema ID + - `public ItemIdMetaUpgradeSchema->getRenamedIds() : array` - returns a map of old ID -> new ID + - `public ItemIdMetaUpgradeSchema->getRemappedMetas() : array>` - returns a map of old ID -> list of old meta -> new ID + +### `pocketmine\event\block` +- The following API methods have been added: + - `public BlockGrowEvent->getPlayer() : ?Player` - returns the player that triggered the block growth, or `null` if it was not triggered by a player +- The following API methods have signature changes: + - `BlockGrowEvent::__construct()` now accepts an optional `?Player $player` parameter. + +### `pocketmine\event\world` +- The following classes have been added: + - `WorldDisplayNameChangeEvent` - called when a world's display name is changed + +### `pocketmine\item` +- `Boat` now uses a new `BoatType` enum instead of `TreeType`. This is because not all tree types have an associated boat type, and some boat types are not made from tree materials (e.g. bamboo raft). + - The following API methods have been removed: + - `Boat->getWoodType()` + - The following API methods have been added: + - `public Boat->getType() : BoatType` + - `public Item->getStateId() : int` - returns an encoded ID containing the item type ID and encoded item state + - The following API methods have been renamed: + - `Item->describeType()` -> `Item->describeState()` + - The following classes have been added: + - `BoatType` - enum of all boat types + - The following API methods have signature changes: + - `BoatType::__construct()` now accepts `BoatType $boatType` instead of `TreeType $woodType`. + +### `pocketmine\world` +- The following API methods have been added: + - `public World->setDisplayName(string $name) : void` + +### `pocketmine\world\format` +- Fixed outdated documentation for various methods of `Chunk`. + +### `pocketmine\world\format\io\data` +- The following API interface requirements have been added: + - `public WorldData->setDisplayName(string $value) : void` + +## Internals +- Reduced global usage in world providers. In the future, we want to have blockstate deserializers etc. injected rather than being global singletons. +- `BlockStateUpgrader` now always updates the blockstate version, even if no changes were made. PM itself doesn't require this, but it's useful for tools to know whether to upgrade the data again (e.g. in testing scenarios). +- `BlockStateDictionary` memory usage is now reduced from 9 MB to 3.5 MB using various techniques, including string reuse and binary-encoded states. +- `RuntimeBlockMapping` has been renamed to `BlockTranslator`. +- Singletons in the `pocketmine\network\mcpe\convert` package have been centralized under `TypeConverter`. In the future, this will be injected where needed, allowing different converters to be used for different sessions (useful for multiversion). +- Overriding of serializers and deserializers of items and blocks is now consistently disallowed. Due to the lack of a good reason to allow overriding built-in blocks and items, this is no longer allowed. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7c1433ee8c..8dca561646 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-BETA3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "beta"; private function __construct(){ From edcf0f840562e63330df6fa31666a5dbf950b89f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 May 2023 19:47:42 +0100 Subject: [PATCH 1014/1858] 5.0.0-BETA4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8dca561646..b89ac4b668 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-BETA3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-BETA4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From db95bf8b9b1c0f31a53fe368e82e6116c8386dec Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Thu, 18 May 2023 15:11:28 +0200 Subject: [PATCH 1015/1858] Caching creative inventory entries (#5703) Due to the high cost of Item::serializeCompoundTag(), it's very costly to rebuild this every time we need it. This is sent during the pre-spawn step, where we need to minimize costs as much as possible. --- src/inventory/CreativeInventory.php | 22 ++++++ src/network/mcpe/InventoryManager.php | 15 +--- .../mcpe/cache/CreativeInventoryCache.php | 69 +++++++++++++++++++ 3 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 src/network/mcpe/cache/CreativeInventoryCache.php diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 7d6754f8c0..8892661a06 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -25,7 +25,9 @@ namespace pocketmine\inventory; use pocketmine\item\Durable; use pocketmine\item\Item; +use pocketmine\utils\DestructorCallbackTrait; use pocketmine\utils\Filesystem; +use pocketmine\utils\ObjectSet; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; @@ -33,11 +35,17 @@ use function json_decode; final class CreativeInventory{ use SingletonTrait; + use DestructorCallbackTrait; /** @var Item[] */ private array $creative = []; + /** @phpstan-var ObjectSet<\Closure() : void> */ + private ObjectSet $contentChangedCallbacks; + private function __construct(){ + $this->contentChangedCallbacks = new ObjectSet(); + $creativeItems = json_decode(Filesystem::fileGetContents(Path::join(\pocketmine\RESOURCE_PATH, "legacy_creativeitems.json")), true); foreach($creativeItems as $data){ @@ -55,6 +63,7 @@ final class CreativeInventory{ */ public function clear() : void{ $this->creative = []; + $this->onContentChange(); } /** @@ -84,6 +93,7 @@ final class CreativeInventory{ */ public function add(Item $item) : void{ $this->creative[] = clone $item; + $this->onContentChange(); } /** @@ -94,10 +104,22 @@ final class CreativeInventory{ $index = $this->getItemIndex($item); if($index !== -1){ unset($this->creative[$index]); + $this->onContentChange(); } } public function contains(Item $item) : bool{ return $this->getItemIndex($item) !== -1; } + + /** @phpstan-return ObjectSet<\Closure() : void> */ + public function getContentChangedCallbacks() : ObjectSet{ + return $this->contentChangedCallbacks; + } + + private function onContentChange() : void{ + foreach($this->contentChangedCallbacks as $callback){ + $callback(); + } + } } diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index c6d83c65ee..38cd986de6 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -37,19 +37,17 @@ use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; -use pocketmine\item\Item; +use pocketmine\network\mcpe\cache\CreativeInventoryCache; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; use pocketmine\network\mcpe\protocol\ContainerOpenPacket; use pocketmine\network\mcpe\protocol\ContainerSetDataPacket; -use pocketmine\network\mcpe\protocol\CreativeContentPacket; use pocketmine\network\mcpe\protocol\InventoryContentPacket; use pocketmine\network\mcpe\protocol\InventorySlotPacket; use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; -use pocketmine\network\mcpe\protocol\types\inventory\CreativeContentEntry; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; @@ -599,16 +597,7 @@ class InventoryManager{ } public function syncCreative() : void{ - $typeConverter = TypeConverter::getInstance(); - - $entries = []; - if(!$this->player->isSpectator()){ - //creative inventory may have holes if items were unregistered - ensure network IDs used are always consistent - foreach(CreativeInventory::getInstance()->getAll() as $k => $item){ - $entries[] = new CreativeContentEntry($k, $typeConverter->coreItemStackToNet($item)); - } - } - $this->session->sendDataPacket(CreativeContentPacket::create($entries)); + $this->session->sendDataPacket(CreativeInventoryCache::getInstance()->getCache(CreativeInventory::getInstance())); } private function newItemStackId() : int{ diff --git a/src/network/mcpe/cache/CreativeInventoryCache.php b/src/network/mcpe/cache/CreativeInventoryCache.php new file mode 100644 index 0000000000..04fc52604c --- /dev/null +++ b/src/network/mcpe/cache/CreativeInventoryCache.php @@ -0,0 +1,69 @@ + + */ + private array $caches = []; + + public function getCache(CreativeInventory $inventory) : CreativeContentPacket{ + $id = spl_object_id($inventory); + if(!isset($this->caches[$id])){ + $inventory->getDestructorCallbacks()->add(function() use ($id) : void{ + unset($this->caches[$id]); + }); + $inventory->getContentChangedCallbacks()->add(function() use ($id) : void{ + unset($this->caches[$id]); + }); + $this->caches[$id] = $this->buildCreativeInventoryCache($inventory); + } + return $this->caches[$id]; + } + + /** + * Rebuild the cache for the given inventory. + */ + private function buildCreativeInventoryCache(CreativeInventory $inventory) : CreativeContentPacket{ + $entries = []; + $typeConverter = TypeConverter::getInstance(); + //creative inventory may have holes if items were unregistered - ensure network IDs used are always consistent + foreach($inventory->getAll() as $k => $item){ + $entries[] = new CreativeContentEntry($k, $typeConverter->coreItemStackToNet($item)); + } + + return CreativeContentPacket::create($entries); + } +} From b8a1b324610703c0e65484de9d081cf96b1fc781 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Thu, 18 May 2023 21:53:37 +0300 Subject: [PATCH 1016/1858] Fixed late property initializing in UnknownBlock (#5755) --- src/block/UnknownBlock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/UnknownBlock.php b/src/block/UnknownBlock.php index a8cbd2d404..97c7c80a44 100644 --- a/src/block/UnknownBlock.php +++ b/src/block/UnknownBlock.php @@ -34,8 +34,8 @@ class UnknownBlock extends Transparent{ private int $stateData; public function __construct(BlockIdentifier $idInfo, BlockTypeInfo $typeInfo, int $stateData){ - parent::__construct($idInfo, "Unknown", $typeInfo); $this->stateData = $stateData; + parent::__construct($idInfo, "Unknown", $typeInfo); } public function describeBlockItemState(RuntimeDataDescriber $w) : void{ From c91aa24daa05c47a69c019152b479316f3634e2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 15:09:24 +0100 Subject: [PATCH 1017/1858] Bump phpunit/phpunit from 9.6.8 to 10.1.3 (#5753) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.8 to 10.1.3. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.1.3/ChangeLog-10.1.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.8...10.1.3) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 582 ++++++++++++++++++++------------------------------ 2 files changed, 230 insertions(+), 354 deletions(-) diff --git a/composer.json b/composer.json index 0c1470be3e..f3754ed1fb 100644 --- a/composer.json +++ b/composer.json @@ -59,7 +59,7 @@ "phpstan/phpstan": "1.10.15", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", - "phpunit/phpunit": "^9.2" + "phpunit/phpunit": "^10.1" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index fa28f6b622..7fd54f9d53 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ecb1e46a4410fdc7efb7e3dac60b5322", + "content-hash": "8cd9901818949493821aaf543667aac4", "packages": [ { "name": "adhocore/json-comment", @@ -1505,76 +1505,6 @@ } ], "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:23:10+00:00" - }, { "name": "myclabs/deep-copy", "version": "1.11.1", @@ -1966,16 +1896,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "10.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "884a0da7f9f46f28b2cb69134217fd810b793974" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974", + "reference": "884a0da7f9f46f28b2cb69134217fd810b793974", "shasum": "" }, "require": { @@ -1983,18 +1913,18 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.15", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -2003,7 +1933,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.1-dev" } }, "autoload": { @@ -2031,7 +1961,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1" }, "funding": [ { @@ -2039,32 +1970,32 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-04-17T12:15:40+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "5647d65443818959172645e7ed999217360654b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", + "reference": "5647d65443818959172645e7ed999217360654b6", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2091,7 +2022,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" }, "funding": [ { @@ -2099,28 +2031,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-05-07T09:13:23+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -2128,7 +2060,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2154,7 +2086,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -2162,32 +2094,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2213,7 +2145,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" }, "funding": [ { @@ -2221,32 +2153,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-02-03T06:56:46+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -2272,7 +2204,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -2280,24 +2212,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.8", + "version": "10.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" + "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2379ebafc1737e71cdc84f402acb6b7f04198b9d", + "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -2307,27 +2238,26 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -2335,7 +2265,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "10.1-dev" } }, "autoload": { @@ -2367,7 +2297,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.3" }, "funding": [ { @@ -2383,32 +2313,32 @@ "type": "tidelift" } ], - "time": "2023-05-11T05:14:45+00:00" + "time": "2023-05-11T05:16:22+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -2431,7 +2361,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" }, "funding": [ { @@ -2439,32 +2369,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -2487,7 +2417,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -2495,32 +2425,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2542,7 +2472,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -2550,34 +2480,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -2616,7 +2548,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" }, "funding": [ { @@ -2624,33 +2556,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-02-03T07:07:16+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2673,7 +2605,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" }, "funding": [ { @@ -2681,33 +2613,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-02-03T06:59:47+00:00" }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -2739,7 +2671,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" }, "funding": [ { @@ -2747,27 +2680,27 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2023-05-01T07:48:21+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -2775,7 +2708,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -2794,7 +2727,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -2802,7 +2735,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" }, "funding": [ { @@ -2810,34 +2744,34 @@ "type": "github" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2023-04-11T05:39:26+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -2879,7 +2813,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" }, "funding": [ { @@ -2887,38 +2821,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-02-03T07:06:49+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "aab257c712de87b90194febd52e4d184551c2d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44", + "reference": "aab257c712de87b90194febd52e4d184551c2d44", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -2943,7 +2874,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" }, "funding": [ { @@ -2951,33 +2882,33 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-02-03T07:07:38+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -3000,7 +2931,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" }, "funding": [ { @@ -3008,34 +2939,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-02-03T07:08:02+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -3057,7 +2988,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -3065,32 +2996,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -3112,7 +3043,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -3120,32 +3051,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -3175,7 +3106,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -3183,87 +3114,32 @@ "type": "github" } ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3286,7 +3162,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -3294,29 +3170,29 @@ "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3339,7 +3215,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -3347,7 +3223,7 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "theseer/tokenizer", From bd6af68f916c60990235177c936acda1ce3a4013 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 19 May 2023 15:13:34 +0100 Subject: [PATCH 1018/1858] Update symfony/filesystem to 6.2.10 --- composer.json | 2 +- composer.lock | 102 +++++--------------------------------------------- 2 files changed, 10 insertions(+), 94 deletions(-) diff --git a/composer.json b/composer.json index f3754ed1fb..46e706133f 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "pocketmine/raklib-ipc": "^0.1.0", "pocketmine/snooze": "^0.3.0", "ramsey/uuid": "^4.1", - "symfony/filesystem": "^5.4", + "symfony/filesystem": "^6.2", "webmozart/path-util": "^2.3" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 7fd54f9d53..0157dc19a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8cd9901818949493821aaf543667aac4", + "content-hash": "e913903f9b2491e95e91e6d7f05e9540", "packages": [ { "name": "adhocore/json-comment", @@ -1084,23 +1084,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.23", + "version": "v6.2.10", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5" + "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/fd588debf7d1bc16a2c84b4b3b71145d9946b894", + "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -1128,7 +1127,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.23" + "source": "https://github.com/symfony/filesystem/tree/v6.2.10" }, "funding": [ { @@ -1144,7 +1143,7 @@ "type": "tidelift" } ], - "time": "2023-03-02T11:38:35+00:00" + "time": "2023-04-18T13:46:08+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1311,89 +1310,6 @@ ], "time": "2022-11-03T14:55:06+00:00" }, - { - "name": "symfony/polyfill-php80", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, { "name": "webmozart/assert", "version": "1.11.0", From 4a3843a881aa0a3c29bf3d522437b3b2cfeacc16 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 19 May 2023 15:40:04 +0100 Subject: [PATCH 1019/1858] WaterCauldron: reduce code repetition --- src/block/WaterCauldron.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index fddccf43bc..276b309ca0 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -108,14 +108,14 @@ final class WaterCauldron extends FillableCauldron{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ - if(($newColor = match($item->getTypeId()){ - ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE()->getRgbValue(), - ItemTypeIds::INK_SAC => DyeColor::BLACK()->getRgbValue(), - ItemTypeIds::COCOA_BEANS => DyeColor::BROWN()->getRgbValue(), - ItemTypeIds::BONE_MEAL => DyeColor::WHITE()->getRgbValue(), - ItemTypeIds::DYE => $item instanceof Dye ? $item->getColor()->getRgbValue() : null, + if(($dyeColor = match($item->getTypeId()){ + ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), + ItemTypeIds::INK_SAC => DyeColor::BLACK(), + ItemTypeIds::COCOA_BEANS => DyeColor::BROWN(), + ItemTypeIds::BONE_MEAL => DyeColor::WHITE(), + ItemTypeIds::DYE => $item instanceof Dye ? $item->getColor() : null, default => null - }) !== null && $newColor->toRGBA() !== $this->customWaterColor?->toRGBA() + }) !== null && ($newColor = $dyeColor->getRgbValue())->toRGBA() !== $this->customWaterColor?->toRGBA() ){ $this->position->getWorld()->setBlock($this->position, $this->setCustomWaterColor($this->customWaterColor === null ? $newColor : Color::mix($this->customWaterColor, $newColor))); $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronAddDyeSound()); From 8454076235e49eddcf18c5a76dcdf6def63fc6b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 19 May 2023 15:45:12 +0100 Subject: [PATCH 1020/1858] WaterCauldron: remove more repeated code --- src/block/WaterCauldron.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index 276b309ca0..6a3c95048f 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -108,6 +108,7 @@ final class WaterCauldron extends FillableCauldron{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + $world = $this->position->getWorld(); if(($dyeColor = match($item->getTypeId()){ ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), ItemTypeIds::INK_SAC => DyeColor::BLACK(), @@ -117,8 +118,8 @@ final class WaterCauldron extends FillableCauldron{ default => null }) !== null && ($newColor = $dyeColor->getRgbValue())->toRGBA() !== $this->customWaterColor?->toRGBA() ){ - $this->position->getWorld()->setBlock($this->position, $this->setCustomWaterColor($this->customWaterColor === null ? $newColor : Color::mix($this->customWaterColor, $newColor))); - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronAddDyeSound()); + $world->setBlock($this->position, $this->setCustomWaterColor($this->customWaterColor === null ? $newColor : Color::mix($this->customWaterColor, $newColor))); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronAddDyeSound()); $item->pop(); }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion @@ -137,13 +138,13 @@ final class WaterCauldron extends FillableCauldron{ default => false } && $item->getCustomColor()?->toRGBA() !== $this->customWaterColor->toRGBA()){ $item->setCustomColor($this->customWaterColor); - $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::DYE_ARMOR_USE_AMOUNT)); - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronDyeItemSound()); + $world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::DYE_ARMOR_USE_AMOUNT)); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronDyeItemSound()); } }elseif($item->getCustomColor() !== null){ $item->clearCustomColor(); - $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_ARMOR_USE_AMOUNT)); - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + $world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_ARMOR_USE_AMOUNT)); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); } }elseif($item instanceof Banner){ $patterns = $item->getPatterns(); @@ -151,8 +152,8 @@ final class WaterCauldron extends FillableCauldron{ array_pop($patterns); $item->setPatterns($patterns); - $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_BANNER_USE_AMOUNT)); - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + $world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_BANNER_USE_AMOUNT)); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); } }elseif(ItemTypeIds::toBlockTypeId($item->getTypeId()) === BlockTypeIds::DYED_SHULKER_BOX){ if($this->customWaterColor === null){ @@ -162,8 +163,8 @@ final class WaterCauldron extends FillableCauldron{ $item->pop(); $returnedItems[] = $newItem; - $this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_SHULKER_BOX_USE_AMOUNT)); - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); + $world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_SHULKER_BOX_USE_AMOUNT)); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new CauldronCleanItemSound()); } }else{ match($item->getTypeId()){ From 8245cfab0ed9e25e9549559e47f3070065c53cad Mon Sep 17 00:00:00 2001 From: BrandPVP <114182697+BrandPVP@users.noreply.github.com> Date: Fri, 19 May 2023 18:18:18 +0300 Subject: [PATCH 1021/1858] PlayerDeathEvent: add ability to set message displayed on the death screen (#5726) --- src/event/player/PlayerDeathEvent.php | 10 ++++++++++ src/player/Player.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/event/player/PlayerDeathEvent.php b/src/event/player/PlayerDeathEvent.php index 132411c584..58a07fb1b5 100644 --- a/src/event/player/PlayerDeathEvent.php +++ b/src/event/player/PlayerDeathEvent.php @@ -39,6 +39,7 @@ class PlayerDeathEvent extends EntityDeathEvent{ protected $player; private Translatable|string $deathMessage; + private Translatable|string $deathScreenMessage; private bool $keepInventory = false; private bool $keepXp = false; @@ -50,6 +51,7 @@ class PlayerDeathEvent extends EntityDeathEvent{ parent::__construct($entity, $drops, $xp); $this->player = $entity; $this->deathMessage = $deathMessage ?? self::deriveMessage($entity->getDisplayName(), $entity->getLastDamageCause()); + $this->deathScreenMessage = $this->deathMessage; } /** @@ -71,6 +73,14 @@ class PlayerDeathEvent extends EntityDeathEvent{ $this->deathMessage = $deathMessage; } + public function getDeathScreenMessage() : Translatable|string{ + return $this->deathScreenMessage; + } + + public function setDeathScreenMessage(Translatable|string $deathScreenMessage) : void{ + $this->deathScreenMessage = $deathScreenMessage; + } + public function getKeepInventory() : bool{ return $this->keepInventory; } diff --git a/src/player/Player.php b/src/player/Player.php index e8dae37f42..2c481f275f 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2344,7 +2344,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->startDeathAnimation(); - $this->getNetworkSession()->onServerDeath($ev->getDeathMessage()); + $this->getNetworkSession()->onServerDeath($ev->getDeathScreenMessage()); } protected function onDeathUpdate(int $tickDiff) : bool{ From e0630fbb256401bb392229eda9f8b8b0a220d034 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 01:29:26 +0100 Subject: [PATCH 1022/1858] pmmpthread support --- .github/workflows/main.yml | 10 +-- composer.json | 8 +- composer.lock | 79 ++++++++++--------- phpstan.neon.dist | 2 +- src/PocketMine.php | 2 +- src/Server.php | 4 +- src/console/ConsoleReaderChildProcess.php | 15 ++-- .../mcpe/raklib/PthreadsChannelReader.php | 5 +- .../mcpe/raklib/PthreadsChannelWriter.php | 5 +- src/network/mcpe/raklib/RakLibInterface.php | 9 ++- src/network/mcpe/raklib/RakLibServer.php | 19 ++--- .../SnoozeAwarePthreadsChannelWriter.php | 5 +- src/scheduler/AsyncPool.php | 9 ++- src/scheduler/AsyncTask.php | 20 +++-- src/scheduler/AsyncWorker.php | 11 +-- src/scheduler/DumpWorkerMemoryTask.php | 10 ++- src/thread/CommonThreadPartsTrait.php | 12 +-- src/thread/NonThreadSafeValue.php | 3 +- src/thread/Thread.php | 6 +- src/thread/ThreadManager.php | 10 ++- src/thread/Worker.php | 7 +- src/utils/MainLogger.php | 14 ++-- src/utils/MainLoggerThread.php | 10 ++- .../stubs/{pthreads.stub => pmmpthread.stub} | 10 ++- 24 files changed, 159 insertions(+), 126 deletions(-) rename tests/phpstan/stubs/{pthreads.stub => pmmpthread.stub} (70%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fa0eccf600..b4a8848827 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Build and prepare PHP cache - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@fa2accea978a84097cf40ecc7d46b2d71f258bd5 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@fa2accea978a84097cf40ecc7d46b2d71f258bd5 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -77,7 +77,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@fa2accea978a84097cf40ecc7d46b2d71f258bd5 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -118,7 +118,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@fa2accea978a84097cf40ecc7d46b2d71f258bd5 with: php-version: ${{ matrix.php }} install-path: "./bin" @@ -157,7 +157,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@fa2accea978a84097cf40ecc7d46b2d71f258bd5 with: php-version: ${{ matrix.php }} install-path: "./bin" diff --git a/composer.json b/composer.json index fb07485736..63d5b0d007 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pthreads": "^5.1", + "ext-pmmpthread": "^6.0", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", @@ -40,17 +40,17 @@ "pocketmine/bedrock-protocol": "~21.0.0+bedrock-1.19.80", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", - "pocketmine/classloader": "^0.3.0", + "pocketmine/classloader": "dev-stable", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", - "pocketmine/log-pthreads": "^0.5.0", + "pocketmine/log-pthreads": "dev-stable", "pocketmine/math": "^0.4.0", "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.15.0", "pocketmine/raklib-ipc": "^0.2.0", - "pocketmine/snooze": "^0.4.0", + "pocketmine/snooze": "dev-master", "ramsey/uuid": "^4.1", "symfony/filesystem": "^5.4" }, diff --git a/composer.lock b/composer.lock index cdcb19063b..4b6e1622f5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8c09886bd34e74a61c3ea1ee2be3b2e9", + "content-hash": "507c2a45350440a7717ed089190fe4f0", "packages": [ { "name": "adhocore/json-comment", @@ -466,32 +466,33 @@ }, { "name": "pocketmine/classloader", - "version": "0.3.0", + "version": "dev-stable", "source": { "type": "git", "url": "https://github.com/pmmp/ClassLoader.git", - "reference": "407caf521186ec1f03024f39031cc681ad491026" + "reference": "e15c9b4d310581d2d2c9bf2794869cb940e011e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/407caf521186ec1f03024f39031cc681ad491026", - "reference": "407caf521186ec1f03024f39031cc681ad491026", + "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/e15c9b4d310581d2d2c9bf2794869cb940e011e1", + "reference": "e15c9b4d310581d2d2c9bf2794869cb940e011e1", "shasum": "" }, "require": { - "ext-pthreads": "^5.0", + "ext-pmmpthread": "^6.0", "ext-reflection": "*", - "php": "^8.0" + "php": "^8.1" }, "conflict": { "pocketmine/spl": "<0.4" }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.10.15", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5" }, + "default-branch": true, "type": "library", "autoload": { "classmap": [ @@ -505,9 +506,9 @@ "description": "Ad-hoc autoloading components used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/ClassLoader/issues", - "source": "https://github.com/pmmp/ClassLoader/tree/0.3.0" + "source": "https://github.com/pmmp/ClassLoader/tree/stable" }, - "time": "2023-01-23T19:46:53+00:00" + "time": "2023-05-19T23:39:02+00:00" }, { "name": "pocketmine/color", @@ -652,21 +653,21 @@ }, { "name": "pocketmine/log-pthreads", - "version": "0.5.0", + "version": "dev-stable", "source": { "type": "git", "url": "https://github.com/pmmp/LogPthreads.git", - "reference": "0ecfea6dcfc9a9f5c86e126ac1661732de5c5666" + "reference": "bb3b5395042d12ec0d7ad5c855fd86eaf12869d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/0ecfea6dcfc9a9f5c86e126ac1661732de5c5666", - "reference": "0ecfea6dcfc9a9f5c86e126ac1661732de5c5666", + "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/bb3b5395042d12ec0d7ad5c855fd86eaf12869d3", + "reference": "bb3b5395042d12ec0d7ad5c855fd86eaf12869d3", "shasum": "" }, "require": { - "ext-pthreads": "^5.0", - "php": "^8.0", + "ext-pmmpthread": "^6.0", + "php": "^8.1", "pocketmine/log": "^0.4.0" }, "conflict": { @@ -674,9 +675,10 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.8.11", + "phpstan/phpstan": "1.10.3", "phpstan/phpstan-strict-rules": "^1.0" }, + "default-branch": true, "type": "library", "autoload": { "classmap": [ @@ -690,9 +692,9 @@ "description": "Logging components specialized for pthreads used by PocketMine-MP and related projects", "support": { "issues": "https://github.com/pmmp/LogPthreads/issues", - "source": "https://github.com/pmmp/LogPthreads/tree/0.5.0" + "source": "https://github.com/pmmp/LogPthreads/tree/stable" }, - "time": "2023-01-23T19:52:12+00:00" + "time": "2023-05-19T23:38:36+00:00" }, { "name": "pocketmine/math", @@ -863,27 +865,28 @@ }, { "name": "pocketmine/snooze", - "version": "0.4.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/pmmp/Snooze.git", - "reference": "6b1d6cc645d674590ff9be2438ac00032f9ee292" + "reference": "3207a201cbb10eebb4a96749678f7adef216bb71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Snooze/zipball/6b1d6cc645d674590ff9be2438ac00032f9ee292", - "reference": "6b1d6cc645d674590ff9be2438ac00032f9ee292", + "url": "https://api.github.com/repos/pmmp/Snooze/zipball/3207a201cbb10eebb4a96749678f7adef216bb71", + "reference": "3207a201cbb10eebb4a96749678f7adef216bb71", "shasum": "" }, "require": { - "ext-pthreads": "^5.0", - "php-64bit": "^8.0" + "ext-pmmpthread": "^6.0", + "php-64bit": "^8.1" }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.9.14", + "phpstan/phpstan": "1.10.3", "phpstan/phpstan-strict-rules": "^1.0" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -897,9 +900,9 @@ "description": "Thread notification management library for code using the pthreads extension", "support": { "issues": "https://github.com/pmmp/Snooze/issues", - "source": "https://github.com/pmmp/Snooze/tree/0.4.0" + "source": "https://github.com/pmmp/Snooze/tree/master" }, - "time": "2023-01-23T19:43:19+00:00" + "time": "2023-05-19T23:38:19+00:00" }, { "name": "ramsey/collection", @@ -1527,16 +1530,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.15.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", "shasum": "" }, "require": { @@ -1577,9 +1580,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-05-19T20:20:00+00:00" }, { "name": "phar-io/manifest", @@ -3293,7 +3296,11 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "pocketmine/classloader": 20, + "pocketmine/log-pthreads": 20, + "pocketmine/snooze": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -3314,7 +3321,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pthreads": "^5.1", + "ext-pmmpthread": "^6.0", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 16b692ec95..b3aeaf4f6d 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -44,7 +44,7 @@ parameters: - tests/phpstan/stubs/JsonMapper.stub - tests/phpstan/stubs/leveldb.stub - tests/phpstan/stubs/phpasn1.stub - - tests/phpstan/stubs/pthreads.stub + - tests/phpstan/stubs/pmmpthread.stub reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings staticReflectionClassNamePatterns: - "#^COM$#" diff --git a/src/PocketMine.php b/src/PocketMine.php index 8bdb55b0dc..c085fa19c4 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -338,7 +338,7 @@ JIT_WARNING $logger->info("Stopping other threads"); $killer = new ServerKiller(8); - $killer->start(PTHREADS_INHERIT_NONE); + $killer->start(); usleep(10000); //Fixes ServerKiller not being able to start on single-core machines if(ThreadManager::getInstance()->stopAll() > 0){ diff --git a/src/Server.php b/src/Server.php index c19553a888..1262bc00ea 100644 --- a/src/Server.php +++ b/src/Server.php @@ -417,7 +417,7 @@ class Server{ return $this->autoloader; } - public function getLogger() : \AttachableThreadedLogger{ + public function getLogger() : \AttachableThreadSafeLogger{ return $this->logger; } @@ -760,7 +760,7 @@ class Server{ public function __construct( private \DynamicClassLoader $autoloader, - private \AttachableThreadedLogger $logger, + private \AttachableThreadSafeLogger $logger, string $dataPath, string $pluginPath ){ diff --git a/src/console/ConsoleReaderChildProcess.php b/src/console/ConsoleReaderChildProcess.php index 3dd2c24c28..c37aaa8c98 100644 --- a/src/console/ConsoleReaderChildProcess.php +++ b/src/console/ConsoleReaderChildProcess.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\console; +use pmmp\thread\Thread as NativeThread; +use pmmp\thread\ThreadSafeArray; use pocketmine\utils\Process; use function cli_set_process_title; use function count; @@ -30,7 +32,6 @@ use function dirname; use function feof; use function fwrite; use function stream_socket_client; -use const PTHREADS_INHERIT_NONE; require dirname(__DIR__, 2) . '/vendor/autoload.php'; @@ -46,14 +47,14 @@ if($socket === false){ throw new \RuntimeException("Failed to connect to server process ($errCode): $errMessage"); } -/** @phpstan-var \ThreadedArray $channel */ -$channel = new \ThreadedArray(); -$thread = new class($channel) extends \Thread{ +/** @phpstan-var ThreadSafeArray $channel */ +$channel = new ThreadSafeArray(); +$thread = new class($channel) extends NativeThread{ /** - * @phpstan-param \ThreadedArray $channel + * @phpstan-param ThreadSafeArray $channel */ public function __construct( - private \ThreadedArray $channel, + private ThreadSafeArray $channel, ){} public function run() : void{ @@ -73,7 +74,7 @@ $thread = new class($channel) extends \Thread{ } }; -$thread->start(PTHREADS_INHERIT_NONE); +$thread->start(NativeThread::INHERIT_NONE); while(!feof($socket)){ $line = $channel->synchronized(function() use ($channel) : ?string{ if(count($channel) === 0){ diff --git a/src/network/mcpe/raklib/PthreadsChannelReader.php b/src/network/mcpe/raklib/PthreadsChannelReader.php index 68c718b0fb..44057c27c8 100644 --- a/src/network/mcpe/raklib/PthreadsChannelReader.php +++ b/src/network/mcpe/raklib/PthreadsChannelReader.php @@ -23,13 +23,14 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pmmp\thread\ThreadSafeArray; use raklib\server\ipc\InterThreadChannelReader; final class PthreadsChannelReader implements InterThreadChannelReader{ /** - * @phpstan-param \ThreadedArray $buffer + * @phpstan-param ThreadSafeArray $buffer */ - public function __construct(private \ThreadedArray $buffer){} + public function __construct(private ThreadSafeArray $buffer){} public function read() : ?string{ return $this->buffer->shift(); diff --git a/src/network/mcpe/raklib/PthreadsChannelWriter.php b/src/network/mcpe/raklib/PthreadsChannelWriter.php index afbeefdd20..a85415d8da 100644 --- a/src/network/mcpe/raklib/PthreadsChannelWriter.php +++ b/src/network/mcpe/raklib/PthreadsChannelWriter.php @@ -23,13 +23,14 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pmmp\thread\ThreadSafeArray; use raklib\server\ipc\InterThreadChannelWriter; final class PthreadsChannelWriter implements InterThreadChannelWriter{ /** - * @phpstan-param \ThreadedArray $buffer + * @phpstan-param ThreadSafeArray $buffer */ - public function __construct(private \ThreadedArray $buffer){} + public function __construct(private ThreadSafeArray $buffer){} public function write(string $str) : void{ $this->buffer[] = $str; diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 6a9f0f0b03..68f02b649c 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pmmp\thread\ThreadSafeArray; use pocketmine\lang\KnownTranslationFactory; use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\mcpe\compression\ZlibCompressor; @@ -105,10 +106,10 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->sleeper = new SleeperNotifier(); - /** @phpstan-var \ThreadedArray $mainToThreadBuffer */ - $mainToThreadBuffer = new \ThreadedArray(); - /** @phpstan-var \ThreadedArray $threadToMainBuffer */ - $threadToMainBuffer = new \ThreadedArray(); + /** @phpstan-var ThreadSafeArray $mainToThreadBuffer */ + $mainToThreadBuffer = new ThreadSafeArray(); + /** @phpstan-var ThreadSafeArray $threadToMainBuffer */ + $threadToMainBuffer = new ThreadSafeArray(); $this->rakLib = new RakLibServer( $this->server->getLogger(), diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index 3238d1b442..3a3cea673a 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pmmp\thread\Thread as NativeThread; +use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; @@ -38,7 +40,6 @@ use function error_get_last; use function gc_enable; use function ini_set; use function register_shutdown_function; -use const PTHREADS_INHERIT_NONE; class RakLibServer extends Thread{ protected bool $cleanShutdown = false; @@ -50,13 +51,13 @@ class RakLibServer extends Thread{ protected NonThreadSafeValue $address; /** - * @phpstan-param \ThreadedArray $mainToThreadBuffer - * @phpstan-param \ThreadedArray $threadToMainBuffer + * @phpstan-param ThreadSafeArray $mainToThreadBuffer + * @phpstan-param ThreadSafeArray $threadToMainBuffer */ public function __construct( - protected \ThreadedLogger $logger, - protected \ThreadedArray $mainToThreadBuffer, - protected \ThreadedArray $threadToMainBuffer, + protected \ThreadSafeLogger $logger, + protected ThreadSafeArray $mainToThreadBuffer, + protected ThreadSafeArray $threadToMainBuffer, InternetAddress $address, protected int $serverId, protected int $maxMtuSize, @@ -88,13 +89,13 @@ class RakLibServer extends Thread{ } private function setCrashInfo(RakLibThreadCrashInfo $info) : void{ - $this->synchronized(function(RakLibThreadCrashInfo $info) : void{ + $this->synchronized(function() use ($info) : void{ $this->crashInfo = new NonThreadSafeValue($info); $this->notify(); - }, $info); + }); } - public function startAndWait(int $options = PTHREADS_INHERIT_NONE) : void{ + public function startAndWait(int $options = NativeThread::INHERIT_NONE) : void{ $this->start($options); $this->synchronized(function() : void{ while(!$this->ready && $this->crashInfo === null){ diff --git a/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php b/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php index 723cb3730e..28f7be2b5e 100644 --- a/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php +++ b/src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php @@ -23,15 +23,16 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\raklib; +use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperNotifier; use raklib\server\ipc\InterThreadChannelWriter; final class SnoozeAwarePthreadsChannelWriter implements InterThreadChannelWriter{ /** - * @phpstan-param \ThreadedArray $buffer + * @phpstan-param ThreadSafeArray $buffer */ public function __construct( - private \ThreadedArray $buffer, + private ThreadSafeArray $buffer, private SleeperNotifier $notifier ){} diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 71dee756a2..e04e58fd15 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use pmmp\thread\Thread as NativeThread; +use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperHandler; use pocketmine\snooze\SleeperNotifier; use pocketmine\utils\Utils; @@ -33,14 +35,13 @@ use function count; use function spl_object_id; use function time; use const PHP_INT_MAX; -use const PTHREADS_INHERIT_INI; /** * Manages general-purpose worker threads used for processing asynchronous tasks, and the tasks submitted to those * workers. */ class AsyncPool{ - private const WORKER_START_OPTIONS = PTHREADS_INHERIT_INI; + private const WORKER_START_OPTIONS = NativeThread::INHERIT_INI | NativeThread::INHERIT_COMMENTS; /** * @var \SplQueue[]|AsyncTask[][] @@ -69,7 +70,7 @@ class AsyncPool{ protected int $size, private int $workerMemoryLimit, private \ClassLoader $classLoader, - private \ThreadedLogger $logger, + private \ThreadSafeLogger $logger, private SleeperHandler $eventLoop ){} @@ -158,7 +159,7 @@ class AsyncPool{ throw new \InvalidArgumentException("Cannot submit the same AsyncTask instance more than once"); } - $task->progressUpdates = new \ThreadedArray(); + $task->progressUpdates = new ThreadSafeArray(); $task->setSubmitted(); $this->getWorker($worker)->stack($task); diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 2194f47dbd..c48097bbc0 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -23,7 +23,11 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use pmmp\thread\Runnable; +use pmmp\thread\Thread as NativeThread; +use pmmp\thread\ThreadSafeArray; use pocketmine\thread\NonThreadSafeValue; +use function assert; use function igbinary_serialize; use function igbinary_unserialize; use function is_null; @@ -54,7 +58,7 @@ use function spl_object_id; * If you want to store non-thread-safe objects to access when the task completes, store them using * {@link AsyncTask::storeLocal}. */ -abstract class AsyncTask extends \ThreadedRunnable{ +abstract class AsyncTask extends Runnable{ /** * @var \ArrayObject|mixed[]|null object hash => mixed data * @phpstan-var \ArrayObject>|null @@ -63,11 +67,8 @@ abstract class AsyncTask extends \ThreadedRunnable{ */ private static ?\ArrayObject $threadLocalStorage = null; - /** @var AsyncWorker|null $worker */ - public $worker = null; - - /** @phpstan-var \ThreadedArray */ - public \ThreadedArray $progressUpdates; + /** @phpstan-var ThreadSafeArray */ + public ThreadSafeArray $progressUpdates; /** @phpstan-var NonThreadSafeValue|string|int|bool|float|null */ private NonThreadSafeValue|string|int|bool|null|float $result = null; @@ -85,12 +86,15 @@ abstract class AsyncTask extends \ThreadedRunnable{ $this->onRun(); }catch(\Throwable $e){ $this->crashed = true; - $this->worker->handleException($e); + + \GlobalLogger::get()->logException($e); } } $this->finished = true; - $this->worker->getNotifier()->wakeupSleeper(); + $worker = NativeThread::getCurrentThread(); + assert($worker instanceof AsyncWorker); + $worker->getNotifier()->wakeupSleeper(); } public function isCrashed() : bool{ diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 0b7087571a..f012b61d32 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use pmmp\thread\Thread as NativeThread; use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\Worker; use function gc_enable; @@ -33,7 +34,7 @@ class AsyncWorker extends Worker{ private static array $store = []; public function __construct( - private \ThreadedLogger $logger, + private \ThreadSafeLogger $logger, private int $id, private int $memoryLimit, private SleeperNotifier $notifier @@ -57,7 +58,7 @@ class AsyncWorker extends Worker{ } } - public function getLogger() : \ThreadedLogger{ + public function getLogger() : \ThreadSafeLogger{ return $this->logger; } @@ -78,7 +79,7 @@ class AsyncWorker extends Worker{ * want to use on this worker thread from multiple AsyncTasks. */ public function saveToThreadStore(string $identifier, mixed $value) : void{ - if(\Thread::getCurrentThread() !== $this){ + if(NativeThread::getCurrentThread() !== $this){ throw new \LogicException("Thread-local data can only be stored in the thread context"); } self::$store[$identifier] = $value; @@ -93,7 +94,7 @@ class AsyncWorker extends Worker{ * Objects stored in this storage may ONLY be retrieved while the task is running. */ public function getFromThreadStore(string $identifier) : mixed{ - if(\Thread::getCurrentThread() !== $this){ + if(NativeThread::getCurrentThread() !== $this){ throw new \LogicException("Thread-local data can only be fetched in the thread context"); } return self::$store[$identifier] ?? null; @@ -103,7 +104,7 @@ class AsyncWorker extends Worker{ * Removes previously-stored mixed data from the worker's thread-local object store. */ public function removeFromThreadStore(string $identifier) : void{ - if(\Thread::getCurrentThread() !== $this){ + if(NativeThread::getCurrentThread() !== $this){ throw new \LogicException("Thread-local data can only be removed in the thread context"); } unset(self::$store[$identifier]); diff --git a/src/scheduler/DumpWorkerMemoryTask.php b/src/scheduler/DumpWorkerMemoryTask.php index b1cf3840c7..5ef787b5b8 100644 --- a/src/scheduler/DumpWorkerMemoryTask.php +++ b/src/scheduler/DumpWorkerMemoryTask.php @@ -23,8 +23,10 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use pmmp\thread\Thread as NativeThread; use pocketmine\MemoryManager; use Symfony\Component\Filesystem\Path; +use function assert; /** * Task used to dump memory from AsyncWorkers @@ -37,12 +39,14 @@ class DumpWorkerMemoryTask extends AsyncTask{ ){} public function onRun() : void{ + $worker = NativeThread::getCurrentThread(); + assert($worker instanceof AsyncWorker); MemoryManager::dumpMemory( - $this->worker, - Path::join($this->outputFolder, "AsyncWorker#" . $this->worker->getAsyncWorkerId()), + $worker, + Path::join($this->outputFolder, "AsyncWorker#" . $worker->getAsyncWorkerId()), $this->maxNesting, $this->maxStringSize, - new \PrefixedLogger($this->worker->getLogger(), "Memory Dump") + new \PrefixedLogger($worker->getLogger(), "Memory Dump") ); } } diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 777acd0097..a2429b056b 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -23,16 +23,17 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\ThreadSafeArray; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\Server; use function error_reporting; trait CommonThreadPartsTrait{ /** - * @var \ThreadedArray|\ClassLoader[]|null - * @phpstan-var \ThreadedArray|null + * @var ThreadSafeArray|\ClassLoader[]|null + * @phpstan-var ThreadSafeArray|null */ - private ?\ThreadedArray $classLoaders = null; + private ?ThreadSafeArray $classLoaders = null; protected ?string $composerAutoloaderPath = null; protected bool $isKilled = false; @@ -55,14 +56,15 @@ trait CommonThreadPartsTrait{ } if($this->classLoaders === null){ - $this->classLoaders = new \ThreadedArray(); + $loaders = $this->classLoaders = new ThreadSafeArray(); }else{ + $loaders = $this->classLoaders; foreach($this->classLoaders as $k => $autoloader){ unset($this->classLoaders[$k]); } } foreach($autoloaders as $autoloader){ - $this->classLoaders[] = $autoloader; + $loaders[] = $autoloader; } } diff --git a/src/thread/NonThreadSafeValue.php b/src/thread/NonThreadSafeValue.php index 9d443b065e..d0c65f4a44 100644 --- a/src/thread/NonThreadSafeValue.php +++ b/src/thread/NonThreadSafeValue.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\ThreadSafe; use function get_debug_type; use function igbinary_serialize; use function igbinary_unserialize; @@ -34,7 +35,7 @@ use function igbinary_unserialize; * * @phpstan-template TValue */ -final class NonThreadSafeValue extends \ThreadedBase{ +final class NonThreadSafeValue extends ThreadSafe{ private string $variable; /** diff --git a/src/thread/Thread.php b/src/thread/Thread.php index 1c73cb1e2f..706f964298 100644 --- a/src/thread/Thread.php +++ b/src/thread/Thread.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\Thread as NativeThread; use pocketmine\scheduler\AsyncTask; -use const PTHREADS_INHERIT_NONE; /** * Specialized Thread class aimed at PocketMine-MP-related usages. It handles setting up autoloading and error handling. @@ -35,10 +35,10 @@ use const PTHREADS_INHERIT_NONE; * CPU. * @see AsyncTask */ -abstract class Thread extends \Thread{ +abstract class Thread extends NativeThread{ use CommonThreadPartsTrait; - public function start(int $options = PTHREADS_INHERIT_NONE) : bool{ + public function start(int $options = NativeThread::INHERIT_NONE) : bool{ //this is intentionally not traitified ThreadManager::getInstance()->add($this); diff --git a/src/thread/ThreadManager.php b/src/thread/ThreadManager.php index a60d9bf9e5..0ec7f1b13c 100644 --- a/src/thread/ThreadManager.php +++ b/src/thread/ThreadManager.php @@ -23,9 +23,11 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\ThreadSafe; +use pmmp\thread\ThreadSafeArray; use function spl_object_id; -class ThreadManager extends \ThreadedBase{ +class ThreadManager extends ThreadSafe{ private static ?self $instance = null; @@ -40,11 +42,11 @@ class ThreadManager extends \ThreadedBase{ return self::$instance; } - /** @phpstan-var \ThreadedArray */ - private \ThreadedArray $threads; + /** @phpstan-var ThreadSafeArray */ + private ThreadSafeArray $threads; private function __construct(){ - $this->threads = new \ThreadedArray(); + $this->threads = new ThreadSafeArray(); } public function add(Worker|Thread $thread) : void{ diff --git a/src/thread/Worker.php b/src/thread/Worker.php index 572da3c678..3bc5cda97a 100644 --- a/src/thread/Worker.php +++ b/src/thread/Worker.php @@ -23,8 +23,9 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\Thread as NativeThread; +use pmmp\thread\Worker as NativeWorker; use pocketmine\scheduler\AsyncTask; -use const PTHREADS_INHERIT_NONE; /** * Specialized Worker class for PocketMine-MP-related use cases. It handles setting up autoloading and error handling. @@ -36,10 +37,10 @@ use const PTHREADS_INHERIT_NONE; * If you want to run tasks on other CPU cores, check out AsyncTask first. * @see AsyncTask */ -abstract class Worker extends \Worker{ +abstract class Worker extends NativeWorker{ use CommonThreadPartsTrait; - public function start(int $options = PTHREADS_INHERIT_NONE) : bool{ + public function start(int $options = NativeThread::INHERIT_NONE) : bool{ //this is intentionally not traitified ThreadManager::getInstance()->add($this); diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index f796155864..8658ff47ee 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -24,14 +24,14 @@ declare(strict_types=1); namespace pocketmine\utils; use LogLevel; +use pmmp\thread\Thread as NativeThread; use pocketmine\thread\Thread; use pocketmine\thread\Worker; use function implode; use function sprintf; use const PHP_EOL; -use const PTHREADS_INHERIT_NONE; -class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ +class MainLogger extends \AttachableThreadSafeLogger implements \BufferedLogger{ protected bool $logDebug; private string $format = TextFormat::AQUA . "[%s] " . TextFormat::RESET . "%s[%s/%s]: %s" . TextFormat::RESET; @@ -52,7 +52,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ $this->timezone = $timezone->getName(); $this->logWriterThread = new MainLoggerThread($logFile); - $this->logWriterThread->start(PTHREADS_INHERIT_NONE); + $this->logWriterThread->start(NativeThread::INHERIT_NONE); } /** @@ -165,7 +165,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ } public function shutdownLogWriterThread() : void{ - if(\Thread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ + if(NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ $this->logWriterThread->shutdown(); }else{ throw new \LogicException("Only the creator thread can shutdown the logger thread"); @@ -175,7 +175,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ protected function send(string $message, string $level, string $prefix, string $color) : void{ $time = new \DateTime('now', new \DateTimeZone($this->timezone)); - $thread = \Thread::getCurrentThread(); + $thread = NativeThread::getCurrentThread(); if($thread === null){ $threadName = $this->mainThreadName . " thread"; }elseif($thread instanceof Thread || $thread instanceof Worker){ @@ -195,7 +195,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ $this->logWriterThread->write($time->format("Y-m-d") . " " . TextFormat::clean($message) . PHP_EOL); /** - * @var \ThreadedLoggerAttachment $attachment + * @var \ThreadSafeLoggerAttachment $attachment */ foreach($this->attachments as $attachment){ $attachment->log($level, $message); @@ -208,7 +208,7 @@ class MainLogger extends \AttachableThreadedLogger implements \BufferedLogger{ } public function __destruct(){ - if(!$this->logWriterThread->isJoined() && \Thread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ + if(!$this->logWriterThread->isJoined() && NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ $this->shutdownLogWriterThread(); } } diff --git a/src/utils/MainLoggerThread.php b/src/utils/MainLoggerThread.php index c7287e3490..548e23a4f1 100644 --- a/src/utils/MainLoggerThread.php +++ b/src/utils/MainLoggerThread.php @@ -23,22 +23,24 @@ declare(strict_types=1); namespace pocketmine\utils; +use pmmp\thread\Thread; +use pmmp\thread\ThreadSafeArray; use function fclose; use function fopen; use function fwrite; use function is_resource; use function touch; -final class MainLoggerThread extends \Thread{ - /** @phpstan-var \ThreadedArray */ - private \ThreadedArray $buffer; +final class MainLoggerThread extends Thread{ + /** @phpstan-var ThreadSafeArray */ + private ThreadSafeArray $buffer; private bool $syncFlush = false; private bool $shutdown = false; public function __construct( private string $logFile ){ - $this->buffer = new \ThreadedArray(); + $this->buffer = new ThreadSafeArray(); touch($this->logFile); } diff --git a/tests/phpstan/stubs/pthreads.stub b/tests/phpstan/stubs/pmmpthread.stub similarity index 70% rename from tests/phpstan/stubs/pthreads.stub rename to tests/phpstan/stubs/pmmpthread.stub index a48fceea02..9fe0a850af 100644 --- a/tests/phpstan/stubs/pthreads.stub +++ b/tests/phpstan/stubs/pmmpthread.stub @@ -1,9 +1,11 @@ */ -abstract class ThreadedBase implements \IteratorAggregate{ +abstract class ThreadSafe implements \IteratorAggregate{ /** * @template TReturn @@ -17,9 +19,9 @@ abstract class ThreadedBase implements \IteratorAggregate{ /** * @template TKey of array-key * @template TValue - * @implements ArrayAccess + * @implements \ArrayAccess */ -final class ThreadedArray extends ThreadedBase implements Countable, ArrayAccess{ +final class ThreadSafeArray extends ThreadSafe implements \Countable, \ArrayAccess{ /** * @return TValue|null @@ -30,4 +32,4 @@ final class ThreadedArray extends ThreadedBase implements Countable, ArrayAccess * @return TValue|null */ public function shift() : mixed{} -} \ No newline at end of file +} From 3116fb8187db2ce17b637266cb6cb74d3d11af25 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 01:47:50 +0100 Subject: [PATCH 1023/1858] ... --- src/PocketMine.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index c085fa19c4..018d8e0bf1 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -103,7 +103,7 @@ namespace pocketmine { "openssl" => "OpenSSL", "pcre" => "PCRE", "phar" => "Phar", - "pthreads" => "pthreads", + "pmmpthread" => "pmmpthread", "reflection" => "Reflection", "sockets" => "Sockets", "spl" => "SPL", @@ -118,12 +118,9 @@ namespace pocketmine { } } - if(($pthreads_version = phpversion("pthreads")) !== false){ - if(substr_count($pthreads_version, ".") < 2){ - $pthreads_version = "0.$pthreads_version"; - } - if(version_compare($pthreads_version, "5.1.0") < 0 || version_compare($pthreads_version, "6.0.0") >= 0){ - $messages[] = "pthreads ^5.0.0 is required, while you have $pthreads_version."; + if(($pmmpthread_version = phpversion("pmmpthread")) !== false){ + if(version_compare($pmmpthread_version, "6.0.0-beta1") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ + $messages[] = "pmmpthread ^6.0.0 is required, while you have $pmmpthread_version."; } } From 9509d7e04db45b33c25d8633666b083e3caaf34f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 01:51:21 +0100 Subject: [PATCH 1024/1858] Scrub PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 25 ------------------ tests/phpstan/configs/phpstan-bugs.neon | 30 ---------------------- 2 files changed, 55 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index acbfaef037..b3e0b44966 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -440,11 +440,6 @@ parameters: count: 3 path: ../../../src/block/tile/Spawnable.php - - - message: "#^Parameter \\#2 \\$replace of function str_replace expects array\\|string, string\\|null given\\.$#" - count: 1 - path: ../../../src/command/Command.php - - message: "#^Cannot call method addParticle\\(\\) on pocketmine\\\\world\\\\World\\|null\\.$#" count: 1 @@ -800,31 +795,11 @@ parameters: count: 1 path: ../../../src/resourcepacks/ZippedResourcePack.php - - - message: "#^Cannot call method getNotifier\\(\\) on pocketmine\\\\scheduler\\\\AsyncWorker\\|null\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncTask.php - - - - message: "#^Cannot call method handleException\\(\\) on pocketmine\\\\scheduler\\\\AsyncWorker\\|null\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncTask.php - - message: "#^Property pocketmine\\\\scheduler\\\\BulkCurlTask\\:\\:\\$operations \\(string\\) does not accept string\\|null\\.$#" count: 1 path: ../../../src/scheduler/BulkCurlTask.php - - - message: "#^Cannot call method getAsyncWorkerId\\(\\) on pocketmine\\\\scheduler\\\\AsyncWorker\\|null\\.$#" - count: 1 - path: ../../../src/scheduler/DumpWorkerMemoryTask.php - - - - message: "#^Cannot call method getLogger\\(\\) on pocketmine\\\\scheduler\\\\AsyncWorker\\|null\\.$#" - count: 1 - path: ../../../src/scheduler/DumpWorkerMemoryTask.php - - message: "#^Cannot call method getNextRun\\(\\) on array\\\\|int\\|pocketmine\\\\scheduler\\\\TaskHandler\\.$#" count: 1 diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index f45f9a643e..42d682f686 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -5,11 +5,6 @@ parameters: count: 1 path: ../../../src/block/BaseBanner.php - - - message: "#^Comparison operation \"\\<\" between int\\<1, max\\> and 1 is always false\\.$#" - count: 1 - path: ../../../src/console/ConsoleCommandSender.php - - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 @@ -35,41 +30,16 @@ parameters: count: 1 path: ../../../src/network/mcpe/raklib/SnoozeAwarePthreadsChannelWriter.php - - - message: "#^Comparison operation \"\\<\" between int\\<1, max\\> and 1 is always false\\.$#" - count: 1 - path: ../../../src/player/Player.php - - message: "#^Dead catch \\- RuntimeException is never thrown in the try block\\.$#" count: 1 path: ../../../src/plugin/PluginManager.php - - - message: "#^Parameter \\#1 \\$work of method Worker\\:\\:stack\\(\\) expects Threaded, pocketmine\\\\scheduler\\\\AsyncTask given\\.$#" - count: 1 - path: ../../../src/scheduler/AsyncPool.php - - message: "#^Static property pocketmine\\\\scheduler\\\\AsyncTask\\:\\:\\$threadLocalStorage \\(ArrayObject\\\\>\\|null\\) does not accept non\\-empty\\-array\\\\>\\|ArrayObject\\\\>\\.$#" count: 1 path: ../../../src/scheduler/AsyncTask.php - - - message: "#^Property pocketmine\\\\thread\\\\Thread\\:\\:\\$classLoaders \\(ThreadedArray\\\\|null\\) does not accept array\\{ClassLoader\\}\\|ThreadedArray\\\\.$#" - count: 1 - path: ../../../src/thread/Thread.php - - - - message: "#^Property pocketmine\\\\thread\\\\Worker\\:\\:\\$classLoaders \\(ThreadedArray\\\\|null\\) does not accept array\\{ClassLoader\\}\\|ThreadedArray\\\\.$#" - count: 1 - path: ../../../src/thread/Worker.php - - - - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 2 - path: ../../../src/world/format/io/region/RegionLoader.php - - message: "#^Casting to int something that's already int\\.$#" count: 1 From 097feba4d538ffe67622f79aaaeec5a21d8f4c45 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 16:57:24 +0100 Subject: [PATCH 1025/1858] Absorb pocketmine/log-pthreads into PM core this was previously part of the abandoned package pocketmine/spl. It had to be separated in the PM3 days, because RakLib depended on it. Since RakLib 0.13, RakLib stopped being dependent on or aware of pthreads, so it no longer depends on any thread-related packages. It's also possible to absorb pocketmine/snooze and pocketmine/classloader back into the core with this in mind. --- composer.json | 1 - composer.lock | 48 +------------- src/Server.php | 5 +- src/network/mcpe/raklib/RakLibServer.php | 3 +- src/scheduler/AsyncPool.php | 3 +- src/scheduler/AsyncWorker.php | 5 +- src/thread/log/AttachableThreadSafeLogger.php | 64 +++++++++++++++++++ src/thread/log/ThreadSafeLogger.php | 30 +++++++++ src/thread/log/ThreadSafeLoggerAttachment.php | 30 +++++++++ src/utils/MainLogger.php | 6 +- 10 files changed, 139 insertions(+), 56 deletions(-) create mode 100644 src/thread/log/AttachableThreadSafeLogger.php create mode 100644 src/thread/log/ThreadSafeLogger.php create mode 100644 src/thread/log/ThreadSafeLoggerAttachment.php diff --git a/composer.json b/composer.json index 63d5b0d007..c8fb559d74 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,6 @@ "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", - "pocketmine/log-pthreads": "dev-stable", "pocketmine/math": "^0.4.0", "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.15.0", diff --git a/composer.lock b/composer.lock index 4b6e1622f5..05d87b634d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "507c2a45350440a7717ed089190fe4f0", + "content-hash": "0dc836612512d87a694945ffb87a4096", "packages": [ { "name": "adhocore/json-comment", @@ -651,51 +651,6 @@ }, "time": "2021-06-18T19:08:09+00:00" }, - { - "name": "pocketmine/log-pthreads", - "version": "dev-stable", - "source": { - "type": "git", - "url": "https://github.com/pmmp/LogPthreads.git", - "reference": "bb3b5395042d12ec0d7ad5c855fd86eaf12869d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pmmp/LogPthreads/zipball/bb3b5395042d12ec0d7ad5c855fd86eaf12869d3", - "reference": "bb3b5395042d12ec0d7ad5c855fd86eaf12869d3", - "shasum": "" - }, - "require": { - "ext-pmmpthread": "^6.0", - "php": "^8.1", - "pocketmine/log": "^0.4.0" - }, - "conflict": { - "pocketmine/spl": "<0.4" - }, - "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.10.3", - "phpstan/phpstan-strict-rules": "^1.0" - }, - "default-branch": true, - "type": "library", - "autoload": { - "classmap": [ - "./src" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "description": "Logging components specialized for pthreads used by PocketMine-MP and related projects", - "support": { - "issues": "https://github.com/pmmp/LogPthreads/issues", - "source": "https://github.com/pmmp/LogPthreads/tree/stable" - }, - "time": "2023-05-19T23:38:36+00:00" - }, { "name": "pocketmine/math", "version": "0.4.3", @@ -3298,7 +3253,6 @@ "minimum-stability": "stable", "stability-flags": { "pocketmine/classloader": 20, - "pocketmine/log-pthreads": 20, "pocketmine/snooze": 20 }, "prefer-stable": false, diff --git a/src/Server.php b/src/Server.php index 1262bc00ea..df419c918e 100644 --- a/src/Server.php +++ b/src/Server.php @@ -92,6 +92,7 @@ use pocketmine\resourcepacks\ResourcePackManager; use pocketmine\scheduler\AsyncPool; use pocketmine\snooze\SleeperHandler; use pocketmine\stats\SendUsageTask; +use pocketmine\thread\log\AttachableThreadSafeLogger; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; use pocketmine\updater\UpdateChecker; @@ -417,7 +418,7 @@ class Server{ return $this->autoloader; } - public function getLogger() : \AttachableThreadSafeLogger{ + public function getLogger() : AttachableThreadSafeLogger{ return $this->logger; } @@ -760,7 +761,7 @@ class Server{ public function __construct( private \DynamicClassLoader $autoloader, - private \AttachableThreadSafeLogger $logger, + private AttachableThreadSafeLogger $logger, string $dataPath, string $pluginPath ){ diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index 3a3cea673a..5d4492f5fb 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe\raklib; use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperNotifier; +use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; use raklib\generic\SocketException; @@ -55,7 +56,7 @@ class RakLibServer extends Thread{ * @phpstan-param ThreadSafeArray $threadToMainBuffer */ public function __construct( - protected \ThreadSafeLogger $logger, + protected ThreadSafeLogger $logger, protected ThreadSafeArray $mainToThreadBuffer, protected ThreadSafeArray $threadToMainBuffer, InternetAddress $address, diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index e04e58fd15..72d8b29e5a 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -27,6 +27,7 @@ use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperHandler; use pocketmine\snooze\SleeperNotifier; +use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\utils\Utils; use function array_keys; use function array_map; @@ -70,7 +71,7 @@ class AsyncPool{ protected int $size, private int $workerMemoryLimit, private \ClassLoader $classLoader, - private \ThreadSafeLogger $logger, + private ThreadSafeLogger $logger, private SleeperHandler $eventLoop ){} diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index f012b61d32..89908ff31a 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -25,6 +25,7 @@ namespace pocketmine\scheduler; use pmmp\thread\Thread as NativeThread; use pocketmine\snooze\SleeperNotifier; +use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\Worker; use function gc_enable; use function ini_set; @@ -34,7 +35,7 @@ class AsyncWorker extends Worker{ private static array $store = []; public function __construct( - private \ThreadSafeLogger $logger, + private ThreadSafeLogger $logger, private int $id, private int $memoryLimit, private SleeperNotifier $notifier @@ -58,7 +59,7 @@ class AsyncWorker extends Worker{ } } - public function getLogger() : \ThreadSafeLogger{ + public function getLogger() : ThreadSafeLogger{ return $this->logger; } diff --git a/src/thread/log/AttachableThreadSafeLogger.php b/src/thread/log/AttachableThreadSafeLogger.php new file mode 100644 index 0000000000..16c06f7ffd --- /dev/null +++ b/src/thread/log/AttachableThreadSafeLogger.php @@ -0,0 +1,64 @@ + + */ + protected ThreadSafeArray $attachments; + + public function __construct(){ + $this->attachments = new ThreadSafeArray(); + } + + public function addAttachment(ThreadSafeLoggerAttachment $attachment) : void{ + $this->attachments[] = $attachment; + } + + public function removeAttachment(ThreadSafeLoggerAttachment $attachment) : void{ + foreach($this->attachments as $i => $a){ + if($attachment === $a){ + unset($this->attachments[$i]); + } + } + } + + public function removeAttachments() : void{ + foreach($this->attachments as $i => $a){ + unset($this->attachments[$i]); + } + } + + /** + * @return ThreadSafeLoggerAttachment[] + */ + public function getAttachments() : array{ + return (array) $this->attachments; + } +} diff --git a/src/thread/log/ThreadSafeLogger.php b/src/thread/log/ThreadSafeLogger.php new file mode 100644 index 0000000000..a937f8f58f --- /dev/null +++ b/src/thread/log/ThreadSafeLogger.php @@ -0,0 +1,30 @@ +logWriterThread->write($time->format("Y-m-d") . " " . TextFormat::clean($message) . PHP_EOL); /** - * @var \ThreadSafeLoggerAttachment $attachment + * @var ThreadSafeLoggerAttachment $attachment */ foreach($this->attachments as $attachment){ $attachment->log($level, $message); From 1cb7846f7c0bf76baaf92a0ccd217078a6a1bb10 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 18:24:10 +0100 Subject: [PATCH 1026/1858] Remove LogPthreads from CONTRIBUTING.md --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f3698d49e..adbf6ad3ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,6 @@ Take a look at the table below if you can't find the class or function you're lo | [pmmp/ClassLoader](https://github.com/pmmp/`ClassLoader`) | `BaseClassLoader`
`ClassLoader`
`DynamicClassLoader` | | [pmmp/Color](https://github.com/pmmp/Color) | `pocketmine\color` | | [pmmp/ErrorHandler](https://github.com/pmmp/ErrorHandler) | `pocketmine\errorhandler` | -| [pmmp/LogPthreads](https://github.com/pmmp/LogPthreads) | `ThreadedLoggerAttachment`
`ThreadedLogger`
`AttachableThreadedLogger` | | [pmmp/Log](https://github.com/pmmp/Log) | `AttachableLogger`
`BufferedLogger`
`GlobalLogger`
`LogLevel`
`Logger`
`PrefixedLogger`
`SimpleLogger` | | [pmmp/Math](https://github.com/pmmp/Math) | `pocketmine\math` | | [pmmp/NBT](https://github.com/pmmp/NBT) | `pocketmine\nbt` | From 5afeeb8f89238cdd6a88a9b367d0b3269c9ec5a9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 18:55:36 +0100 Subject: [PATCH 1027/1858] Remove nonsensical code from block and item serializers At the time when I wrote this code, I was still in the head space of the kind of ID hijacking that PM4 plugins do to override built-in blocks. However, this kind of internal ID reuse makes no sense in PM5, since said IDs are only used in the core itself at runtime to identify types and states. Even if we were to allow overriding block deserializers, overriding serializers makes no sense whatsoever, since the original block would continue to exist and be accessible. There is a case to be made to allow overriding the deserializer, but not for the serializer. --- .../convert/BlockObjectToStateSerializer.php | 22 ++++----- src/data/bedrock/item/ItemSerializer.php | 45 ++++++++----------- 2 files changed, 26 insertions(+), 41 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index fabb525d5b..3680e48067 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -169,7 +169,6 @@ use pocketmine\data\bedrock\block\convert\BlockStateWriter as Writer; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; -use function class_parents; use function get_class; final class BlockObjectToStateSerializer implements BlockStateSerializer{ @@ -177,8 +176,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ * These callables actually accept Block, but for the sake of type completeness, it has to be never, since we can't * describe the bottom type of a type hierarchy only containing Block. * - * @var \Closure[][] - * @phpstan-var array> + * @var \Closure[] + * @phpstan-var array */ private array $serializers = []; @@ -212,7 +211,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ if(isset($this->serializers[$block->getTypeId()])){ throw new \InvalidArgumentException("Block type ID " . $block->getTypeId() . " already has a serializer registered"); } - $this->serializers[$block->getTypeId()][get_class($block)] = $serializer; + $this->serializers[$block->getTypeId()] = $serializer; } public function mapSimple(Block $block, string $id) : void{ @@ -240,21 +239,16 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ public function serializeBlock(Block $blockState) : BlockStateData{ $typeId = $blockState->getTypeId(); - $locatedSerializer = $this->serializers[$typeId][get_class($blockState)] ?? null; - if($locatedSerializer === null){ - foreach(class_parents($blockState) as $parent){ - if(isset($this->serializers[$typeId][$parent])){ - $locatedSerializer = $this->serializers[$typeId][$parent]; - break; - } - } - } - + $locatedSerializer = $this->serializers[$typeId] ?? null; if($locatedSerializer === null){ throw new BlockStateSerializeException("No serializer registered for " . get_class($blockState) . " with type ID $typeId"); } /** + * TODO: there is no guarantee that this type actually matches that of $blockState - a plugin may have stolen + * the type ID of the block (which never makes sense, even in a world where overriding block types is a thing). + * In the future we'll need some way to guarantee that type IDs are never reused (perhaps spl_object_id()?) + * * @var \Closure $serializer * @phpstan-var \Closure(TBlockType) : Writer $serializer */ diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 0b153c3da2..478f9873da 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -33,7 +33,6 @@ use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; -use function class_parents; use function get_class; final class ItemSerializer{ @@ -41,14 +40,14 @@ final class ItemSerializer{ * These callables actually accept Item, but for the sake of type completeness, it has to be never, since we can't * describe the bottom type of a type hierarchy only containing Item. * - * @var \Closure[][] - * @phpstan-var array> + * @var \Closure[] + * @phpstan-var array */ private array $itemSerializers = []; /** * @var \Closure[][] - * @phpstan-var array> + * @phpstan-var array */ private array $blockItemSerializers = []; @@ -69,7 +68,7 @@ final class ItemSerializer{ if(isset($this->itemSerializers[$index])){ throw new \InvalidArgumentException("Item type ID " . $index . " already has a serializer registered"); } - $this->itemSerializers[$index][get_class($item)] = $serializer; + $this->itemSerializers[$index] = $serializer; } /** @@ -82,7 +81,7 @@ final class ItemSerializer{ if(isset($this->blockItemSerializers[$index])){ throw new AssumptionFailedError("Registering the same blockitem twice!"); } - $this->blockItemSerializers[$index][get_class($block)] = $serializer; + $this->blockItemSerializers[$index] = $serializer; } /** @@ -100,21 +99,16 @@ final class ItemSerializer{ }else{ $index = $item->getTypeId(); - $locatedSerializer = $this->itemSerializers[$index][get_class($item)] ?? null; - if($locatedSerializer === null){ - foreach(class_parents($item) as $parent){ - if(isset($this->itemSerializers[$index][$parent])){ - $locatedSerializer = $this->itemSerializers[$index][$parent]; - break; - } - } - } - + $locatedSerializer = $this->itemSerializers[$index] ?? null; if($locatedSerializer === null){ throw new ItemTypeSerializeException("No serializer registered for " . get_class($item) . " ($index) " . $item->getName()); } /** + * TODO: there is no guarantee that this type actually matches that of $item - a plugin may have stolen + * the type ID of the item (which never makes sense, even in a world where overriding item types is a thing). + * In the future we'll need some way to guarantee that type IDs are never reused (perhaps spl_object_id()?) + * * @var \Closure $serializer * @phpstan-var \Closure(TItemType) : Data $serializer */ @@ -156,18 +150,15 @@ final class ItemSerializer{ private function serializeBlockItem(Block $block) : Data{ $index = $block->getTypeId(); - $locatedSerializer = $this->blockItemSerializers[$index][get_class($block)] ?? null; - if($locatedSerializer === null){ - foreach(class_parents($block) as $parent){ - if(isset($this->blockItemSerializers[$index][$parent])){ - $locatedSerializer = $this->blockItemSerializers[$index][$parent]; - break; - } - } - } - + $locatedSerializer = $this->blockItemSerializers[$index] ?? null; if($locatedSerializer !== null){ - /** @phpstan-var \Closure(TBlockType) : Data $serializer */ + /** + * TODO: there is no guarantee that this type actually matches that of $block - a plugin may have stolen + * the type ID of the block (which never makes sense, even in a world where overriding block types is a thing). + * In the future we'll need some way to guarantee that type IDs are never reused (perhaps spl_object_id()?) + * + * @phpstan-var \Closure(TBlockType) : Data $serializer + */ $serializer = $locatedSerializer; $data = $serializer($block); }else{ From 3109a179dbb4ccea702a8f29f484354f5e452176 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 18:56:28 +0100 Subject: [PATCH 1028/1858] ... --- src/data/bedrock/item/ItemSerializer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 478f9873da..d32050d7ce 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -46,7 +46,7 @@ final class ItemSerializer{ private array $itemSerializers = []; /** - * @var \Closure[][] + * @var \Closure[] * @phpstan-var array */ private array $blockItemSerializers = []; From fdb724c646f3cf5fef9f7c664d908a822cf4e2bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 20 May 2023 18:58:59 +0100 Subject: [PATCH 1029/1858] ItemSerializer: change exception type --- src/data/bedrock/item/ItemSerializer.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index d32050d7ce..39aeb7bfb3 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -32,7 +32,6 @@ use pocketmine\item\CoralFan; use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\item\VanillaItems as Items; -use pocketmine\utils\AssumptionFailedError; use function get_class; final class ItemSerializer{ @@ -79,7 +78,7 @@ final class ItemSerializer{ public function mapBlock(Block $block, \Closure $serializer) : void{ $index = $block->getTypeId(); if(isset($this->blockItemSerializers[$index])){ - throw new AssumptionFailedError("Registering the same blockitem twice!"); + throw new \InvalidArgumentException("Block type ID " . $index . " already has a serializer registered"); } $this->blockItemSerializers[$index] = $serializer; } From 9ddac21de094ae4f19a6e45db954eccf7c600002 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 00:13:22 +0100 Subject: [PATCH 1030/1858] Bump shivammathur/setup-php from 2.24.0 to 2.25.1 (#5711) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.24.0 to 2.25.1. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.24.0...2.25.1) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index bc3658fd1b..6377912e4e 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.24.0 + uses: shivammathur/setup-php@2.25.1 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 604a69bbaa..372d89c700 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -18,7 +18,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.24.0 + uses: shivammathur/setup-php@2.25.1 with: php-version: 8.1 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index da8468a813..08adcf7d10 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -203,7 +203,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.24.0 + uses: shivammathur/setup-php@2.25.1 with: php-version: 8.1 tools: php-cs-fixer:3.16 From 69273f3ff72214c4b6250d292f93b321e3c54358 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 21 May 2023 16:37:41 +0100 Subject: [PATCH 1031/1858] AsyncTask::setResult(): permit returning ThreadSafe objects to the main thread this is now supported thanks to the object rescue feature implemented in pthreads 5.1, making returning of thread-safe values from async tasks possible. This needs to be explicitly supported, since otherwise it will attempt to serialize them, which isn't supported anymore. --- src/scheduler/AsyncTask.php | 6 +- tests/phpunit/scheduler/AsyncPoolTest.php | 19 +++++++ .../scheduler/ThreadSafeResultAsyncTask.php | 55 +++++++++++++++++++ 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index c48097bbc0..367957b4e3 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -25,6 +25,7 @@ namespace pocketmine\scheduler; use pmmp\thread\Runnable; use pmmp\thread\Thread as NativeThread; +use pmmp\thread\ThreadSafe; use pmmp\thread\ThreadSafeArray; use pocketmine\thread\NonThreadSafeValue; use function assert; @@ -70,8 +71,7 @@ abstract class AsyncTask extends Runnable{ /** @phpstan-var ThreadSafeArray */ public ThreadSafeArray $progressUpdates; - /** @phpstan-var NonThreadSafeValue|string|int|bool|float|null */ - private NonThreadSafeValue|string|int|bool|null|float $result = null; + private ThreadSafe|string|int|bool|null|float $result = null; private bool $cancelRun = false; private bool $submitted = false; @@ -124,7 +124,7 @@ abstract class AsyncTask extends Runnable{ } public function setResult(mixed $result) : void{ - $this->result = is_scalar($result) || is_null($result) ? $result : new NonThreadSafeValue($result); + $this->result = is_scalar($result) || is_null($result) || $result instanceof ThreadSafe ? $result : new NonThreadSafeValue($result); } public function cancelRun() : void{ diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 9a61c33ffb..436251d9e3 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\scheduler; use PHPUnit\Framework\TestCase; +use pmmp\thread\ThreadSafeArray; +use pocketmine\promise\PromiseResolver; use pocketmine\snooze\SleeperHandler; use pocketmine\utils\MainLogger; use function define; @@ -69,4 +71,21 @@ class AsyncPoolTest extends TestCase{ } self::assertTrue(PublishProgressRaceAsyncTask::$success, "Progress was not reported before task completion"); } + + public function testThreadSafeSetResult() : void{ + $resolver = new PromiseResolver(); + $resolver->getPromise()->onCompletion( + function(ThreadSafeArray $result) : void{ + self::assertCount(1, $result); + self::assertSame(["foo"], (array) $result); + }, + function() : void{ + self::fail("Promise failed"); + } + ); + $this->pool->submitTask(new ThreadSafeResultAsyncTask($resolver)); + while($this->pool->collectTasks()){ + usleep(50 * 1000); + } + } } diff --git a/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php b/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php new file mode 100644 index 0000000000..750c56834d --- /dev/null +++ b/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php @@ -0,0 +1,55 @@ + $promise + */ + public function __construct( + PromiseResolver $promise + ){ + $this->storeLocal(self::TLS_KEY_PROMISE, $promise); + } + + public function onRun() : void{ + //this only works in pthreads 5.1+ and pmmpthread + //in prior versions the ThreadSafe would be destroyed before onCompletion is called + $result = new ThreadSafeArray(); + $result[] = "foo"; + $this->setResult($result); + } + + public function onCompletion() : void{ + /** @var PromiseResolver $promise */ + $promise = $this->fetchLocal(self::TLS_KEY_PROMISE); + $promise->resolve($this->getResult()); + } +} From 815b4e2babe9a2d3ac53f9e73a2f89181b23e7d7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 21 May 2023 16:46:23 +0100 Subject: [PATCH 1032/1858] Fix PHPStan --- tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php b/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php index 750c56834d..791d36d751 100644 --- a/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php +++ b/tests/phpunit/scheduler/ThreadSafeResultAsyncTask.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\scheduler; -use pmmp\thread\ThreadSafe; use pmmp\thread\ThreadSafeArray; use pocketmine\promise\PromiseResolver; @@ -31,7 +30,7 @@ class ThreadSafeResultAsyncTask extends AsyncTask{ private const TLS_KEY_PROMISE = "promise"; /** - * @phpstan-param PromiseResolver $promise + * @phpstan-param PromiseResolver> $promise */ public function __construct( PromiseResolver $promise @@ -48,8 +47,10 @@ class ThreadSafeResultAsyncTask extends AsyncTask{ } public function onCompletion() : void{ - /** @var PromiseResolver $promise */ + /** @var PromiseResolver> $promise */ $promise = $this->fetchLocal(self::TLS_KEY_PROMISE); - $promise->resolve($this->getResult()); + /** @var ThreadSafeArray $result */ + $result = $this->getResult(); + $promise->resolve($result); } } From d2c34615f50824a141b850e320de36d80709d428 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 22 May 2023 22:35:39 +0100 Subject: [PATCH 1033/1858] Update build/php to pmmp/PHP-Binaries@b1d5c0d737be86538bb35e1408cd53a616de5a27 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index f860ade30a..b1d5c0d737 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit f860ade30acc074a98bbf5ff286f35b5eda10c86 +Subproject commit b1d5c0d737be86538bb35e1408cd53a616de5a27 From 4aba9d9725f63b4708a8f04ac3c8c2e222377f74 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 22 May 2023 22:52:43 +0100 Subject: [PATCH 1034/1858] Absorb pocketmine/classloader into the core code the only use for this class is to facilitate random runtime plugin loading, and it's not complete even for that purpose. Since nothing but PM uses pocketmine/classloader anyway, it doesn't make sense to have it outside the core. As with LogPthreads, it's just adding more maintenance work. --- composer.json | 1 - composer.lock | 49 +----- src/PocketMine.php | 3 +- src/Server.php | 5 +- src/plugin/PharPluginLoader.php | 3 +- src/scheduler/AsyncPool.php | 3 +- src/thread/CommonThreadPartsTrait.php | 10 +- src/thread/ThreadSafeClassLoader.php | 182 ++++++++++++++++++++++ tests/phpunit/scheduler/AsyncPoolTest.php | 3 +- 9 files changed, 199 insertions(+), 60 deletions(-) create mode 100644 src/thread/ThreadSafeClassLoader.php diff --git a/composer.json b/composer.json index c8fb559d74..fd47dca93e 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,6 @@ "pocketmine/bedrock-protocol": "~21.0.0+bedrock-1.19.80", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", - "pocketmine/classloader": "dev-stable", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.19.0", diff --git a/composer.lock b/composer.lock index 05d87b634d..a9d1e6d810 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0dc836612512d87a694945ffb87a4096", + "content-hash": "812a98ecf031488987b3216e785fee19", "packages": [ { "name": "adhocore/json-comment", @@ -464,52 +464,6 @@ }, "time": "2020-12-11T01:45:37+00:00" }, - { - "name": "pocketmine/classloader", - "version": "dev-stable", - "source": { - "type": "git", - "url": "https://github.com/pmmp/ClassLoader.git", - "reference": "e15c9b4d310581d2d2c9bf2794869cb940e011e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/e15c9b4d310581d2d2c9bf2794869cb940e011e1", - "reference": "e15c9b4d310581d2d2c9bf2794869cb940e011e1", - "shasum": "" - }, - "require": { - "ext-pmmpthread": "^6.0", - "ext-reflection": "*", - "php": "^8.1" - }, - "conflict": { - "pocketmine/spl": "<0.4" - }, - "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.10.15", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "default-branch": true, - "type": "library", - "autoload": { - "classmap": [ - "./src" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "description": "Ad-hoc autoloading components used by PocketMine-MP", - "support": { - "issues": "https://github.com/pmmp/ClassLoader/issues", - "source": "https://github.com/pmmp/ClassLoader/tree/stable" - }, - "time": "2023-05-19T23:39:02+00:00" - }, { "name": "pocketmine/color", "version": "0.3.1", @@ -3252,7 +3206,6 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "pocketmine/classloader": 20, "pocketmine/snooze": 20 }, "prefer-stable": false, diff --git a/src/PocketMine.php b/src/PocketMine.php index 018d8e0bf1..7003cca85d 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -26,6 +26,7 @@ namespace pocketmine { use Composer\InstalledVersions; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\thread\ThreadManager; + use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\utils\Filesystem; use pocketmine\utils\MainLogger; use pocketmine\utils\Process; @@ -327,7 +328,7 @@ JIT_WARNING /* * We now use the Composer autoloader, but this autoloader is still for loading plugins. */ - $autoloader = new \BaseClassLoader(); + $autoloader = new ThreadSafeClassLoader(); $autoloader->register(false); new Server($autoloader, $logger, $dataPath, $pluginPath); diff --git a/src/Server.php b/src/Server.php index df419c918e..f604c93d7e 100644 --- a/src/Server.php +++ b/src/Server.php @@ -93,6 +93,7 @@ use pocketmine\scheduler\AsyncPool; use pocketmine\snooze\SleeperHandler; use pocketmine\stats\SendUsageTask; use pocketmine\thread\log\AttachableThreadSafeLogger; +use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; use pocketmine\updater\UpdateChecker; @@ -414,7 +415,7 @@ class Server{ return $this->configGroup->getConfigString("motd", self::DEFAULT_SERVER_NAME); } - public function getLoader() : \DynamicClassLoader{ + public function getLoader() : ThreadSafeClassLoader{ return $this->autoloader; } @@ -760,7 +761,7 @@ class Server{ } public function __construct( - private \DynamicClassLoader $autoloader, + private ThreadSafeClassLoader $autoloader, private AttachableThreadSafeLogger $logger, string $dataPath, string $pluginPath diff --git a/src/plugin/PharPluginLoader.php b/src/plugin/PharPluginLoader.php index b812f20c8a..a8dc04804a 100644 --- a/src/plugin/PharPluginLoader.php +++ b/src/plugin/PharPluginLoader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\plugin; +use pocketmine\thread\ThreadSafeClassLoader; use function is_file; use function str_ends_with; @@ -31,7 +32,7 @@ use function str_ends_with; */ class PharPluginLoader implements PluginLoader{ public function __construct( - private \DynamicClassLoader $loader + private ThreadSafeClassLoader $loader ){} public function canLoadPlugin(string $path) : bool{ diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 72d8b29e5a..1ee726765e 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -28,6 +28,7 @@ use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperHandler; use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\log\ThreadSafeLogger; +use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\utils\Utils; use function array_keys; use function array_map; @@ -70,7 +71,7 @@ class AsyncPool{ public function __construct( protected int $size, private int $workerMemoryLimit, - private \ClassLoader $classLoader, + private ThreadSafeClassLoader $classLoader, private ThreadSafeLogger $logger, private SleeperHandler $eventLoop ){} diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index a2429b056b..c35dd77914 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -30,8 +30,8 @@ use function error_reporting; trait CommonThreadPartsTrait{ /** - * @var ThreadSafeArray|\ClassLoader[]|null - * @phpstan-var ThreadSafeArray|null + * @var ThreadSafeArray|ThreadSafeClassLoader[]|null + * @phpstan-var ThreadSafeArray|null */ private ?ThreadSafeArray $classLoaders = null; protected ?string $composerAutoloaderPath = null; @@ -39,14 +39,14 @@ trait CommonThreadPartsTrait{ protected bool $isKilled = false; /** - * @return \ClassLoader[] + * @return ThreadSafeClassLoader[] */ public function getClassLoaders() : ?array{ return $this->classLoaders !== null ? (array) $this->classLoaders : null; } /** - * @param \ClassLoader[] $autoloaders + * @param ThreadSafeClassLoader[] $autoloaders */ public function setClassLoaders(?array $autoloaders = null) : void{ $this->composerAutoloaderPath = \pocketmine\COMPOSER_AUTOLOADER_PATH; @@ -82,7 +82,7 @@ trait CommonThreadPartsTrait{ $autoloaders = $this->classLoaders; if($autoloaders !== null){ foreach($autoloaders as $autoloader){ - /** @var \ClassLoader $autoloader */ + /** @var ThreadSafeClassLoader $autoloader */ $autoloader->register(false); } } diff --git a/src/thread/ThreadSafeClassLoader.php b/src/thread/ThreadSafeClassLoader.php new file mode 100644 index 0000000000..95b983dc1b --- /dev/null +++ b/src/thread/ThreadSafeClassLoader.php @@ -0,0 +1,182 @@ + + */ + private $fallbackLookup; + /** + * @var ThreadSafeArray|string[][] + * @phpstan-var ThreadSafeArray> + */ + private $psr4Lookup; + + public function __construct(){ + $this->fallbackLookup = new ThreadSafeArray(); + $this->psr4Lookup = new ThreadSafeArray(); + } + + protected function normalizePath(string $path) : string{ + $parts = explode("://", $path, 2); + if(count($parts) === 2){ + return $parts[0] . "://" . str_replace('/', DIRECTORY_SEPARATOR, $parts[1]); + } + return str_replace('/', DIRECTORY_SEPARATOR, $parts[0]); + } + + public function addPath(string $namespacePrefix, string $path, bool $prepend = false) : void{ + $path = $this->normalizePath($path); + if($namespacePrefix === '' || $namespacePrefix === '\\'){ + $this->fallbackLookup->synchronized(function() use ($path, $prepend) : void{ + $this->appendOrPrependLookupEntry($this->fallbackLookup, $path, $prepend); + }); + }else{ + $namespacePrefix = trim($namespacePrefix, '\\') . '\\'; + $this->psr4Lookup->synchronized(function() use ($namespacePrefix, $path, $prepend) : void{ + $list = $this->psr4Lookup[$namespacePrefix] ?? null; + if($list === null){ + $list = $this->psr4Lookup[$namespacePrefix] = new ThreadSafeArray(); + } + $this->appendOrPrependLookupEntry($list, $path, $prepend); + }); + } + } + + /** + * @phpstan-param ThreadSafeArray $list + */ + protected function appendOrPrependLookupEntry(ThreadSafeArray $list, string $entry, bool $prepend) : void{ + if($prepend){ + $entries = $this->getAndRemoveLookupEntries($list); + $list[] = $entry; + foreach($entries as $removedEntry){ + $list[] = $removedEntry; + } + }else{ + $list[] = $entry; + } + } + + /** + * @return string[] + * + * @phpstan-param ThreadSafeArray $list + * @phpstan-return list + */ + protected function getAndRemoveLookupEntries(ThreadSafeArray $list) : array{ + $entries = []; + while(($entry = $list->shift()) !== null){ + $entries[] = $entry; + } + return $entries; + } + + public function register(bool $prepend = false) : bool{ + return spl_autoload_register(function(string $name) : void{ + $this->loadClass($name); + }, true, $prepend); + } + + /** + * Called when there is a class to load + */ + public function loadClass(string $name) : bool{ + $path = $this->findClass($name); + if($path !== null){ + include($path); + if(!class_exists($name, false) && !interface_exists($name, false) && !trait_exists($name, false)){ + return false; + } + + if(method_exists($name, "onClassLoaded") && (new \ReflectionClass($name))->getMethod("onClassLoaded")->isStatic()){ + $name::onClassLoaded(); + } + + return true; + } + + return false; + } + + /** + * Returns the path for the class, if any + */ + public function findClass(string $name) : ?string{ + $baseName = str_replace("\\", DIRECTORY_SEPARATOR, $name); + + foreach($this->fallbackLookup as $path){ + $filename = $path . DIRECTORY_SEPARATOR . $baseName . ".php"; + if(file_exists($filename)){ + return $filename; + } + } + + // PSR-4 lookup + $logicalPathPsr4 = $baseName . ".php"; + + return $this->psr4Lookup->synchronized(function() use ($name, $logicalPathPsr4) : ?string{ + $subPath = $name; + while(false !== $lastPos = strrpos($subPath, '\\')){ + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + $lookup = $this->psr4Lookup[$search] ?? null; + if($lookup !== null){ + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach($lookup as $dir){ + if(file_exists($file = $dir . $pathEnd)){ + return $file; + } + } + } + } + return null; + }); + } +} diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 436251d9e3..fd7dc344ac 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -27,6 +27,7 @@ use PHPUnit\Framework\TestCase; use pmmp\thread\ThreadSafeArray; use pocketmine\promise\PromiseResolver; use pocketmine\snooze\SleeperHandler; +use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\utils\MainLogger; use function define; use function dirname; @@ -45,7 +46,7 @@ class AsyncPoolTest extends TestCase{ public function setUp() : void{ @define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php'); $this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"), false, "Main", new \DateTimeZone('UTC')); - $this->pool = new AsyncPool(2, 1024, new \BaseClassLoader(), $this->mainLogger, new SleeperHandler()); + $this->pool = new AsyncPool(2, 1024, new ThreadSafeClassLoader(), $this->mainLogger, new SleeperHandler()); } public function tearDown() : void{ From c66a3a8b3e0340fc0fbb34757855f4b5e42069e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:09:22 +0100 Subject: [PATCH 1035/1858] Update to Snooze 0.5.0 --- composer.json | 2 +- composer.lock | 19 +++++++-------- src/network/mcpe/raklib/RakLibInterface.php | 25 ++++++++++---------- src/network/mcpe/raklib/RakLibServer.php | 6 ++--- src/scheduler/AsyncPool.php | 26 ++++++++++----------- src/scheduler/AsyncWorker.php | 14 +++++++++-- 6 files changed, 48 insertions(+), 44 deletions(-) diff --git a/composer.json b/composer.json index fd47dca93e..392cbd8c68 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,7 @@ "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.15.0", "pocketmine/raklib-ipc": "^0.2.0", - "pocketmine/snooze": "dev-master", + "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "^4.1", "symfony/filesystem": "^5.4" }, diff --git a/composer.lock b/composer.lock index a9d1e6d810..f1b31a9d77 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "812a98ecf031488987b3216e785fee19", + "content-hash": "4bccf431b24bf685b0829ea44e54e806", "packages": [ { "name": "adhocore/json-comment", @@ -774,16 +774,16 @@ }, { "name": "pocketmine/snooze", - "version": "dev-master", + "version": "0.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/Snooze.git", - "reference": "3207a201cbb10eebb4a96749678f7adef216bb71" + "reference": "a86d9ee60ce44755d166d3c7ba4b8b8be8360915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Snooze/zipball/3207a201cbb10eebb4a96749678f7adef216bb71", - "reference": "3207a201cbb10eebb4a96749678f7adef216bb71", + "url": "https://api.github.com/repos/pmmp/Snooze/zipball/a86d9ee60ce44755d166d3c7ba4b8b8be8360915", + "reference": "a86d9ee60ce44755d166d3c7ba4b8b8be8360915", "shasum": "" }, "require": { @@ -795,7 +795,6 @@ "phpstan/phpstan": "1.10.3", "phpstan/phpstan-strict-rules": "^1.0" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -809,9 +808,9 @@ "description": "Thread notification management library for code using the pthreads extension", "support": { "issues": "https://github.com/pmmp/Snooze/issues", - "source": "https://github.com/pmmp/Snooze/tree/master" + "source": "https://github.com/pmmp/Snooze/tree/0.5.0" }, - "time": "2023-05-19T23:38:19+00:00" + "time": "2023-05-22T23:43:01+00:00" }, { "name": "ramsey/collection", @@ -3205,9 +3204,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "pocketmine/snooze": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 68f02b649c..93dff68a2d 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -39,7 +39,6 @@ use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; use pocketmine\player\GameMode; use pocketmine\Server; -use pocketmine\snooze\SleeperNotifier; use pocketmine\timings\Timings; use pocketmine\utils\Utils; use raklib\generic\DisconnectReason; @@ -79,7 +78,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private RakLibToUserThreadMessageReceiver $eventReceiver; private UserToRakLibThreadMessageSender $interface; - private SleeperNotifier $sleeper; + private int $sleeperNotifierId; private PacketBroadcaster $packetBroadcaster; private EntityEventBroadcaster $entityEventBroadcaster; @@ -104,7 +103,15 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->rakServerId = mt_rand(0, PHP_INT_MAX); - $this->sleeper = new SleeperNotifier(); + $sleeperEntry = $this->server->getTickSleeper()->addNotifier(function() : void{ + Timings::$connection->startTiming(); + try{ + while($this->eventReceiver->handle($this)); + }finally{ + Timings::$connection->stopTiming(); + } + }); + $this->sleeperNotifierId = $sleeperEntry->getNotifierId(); /** @phpstan-var ThreadSafeArray $mainToThreadBuffer */ $mainToThreadBuffer = new ThreadSafeArray(); @@ -119,7 +126,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->rakServerId, $this->server->getConfigGroup()->getPropertyInt("network.max-mtu-size", 1492), self::MCPE_RAKNET_PROTOCOL_VERSION, - $this->sleeper + $sleeperEntry ); $this->eventReceiver = new RakLibToUserThreadMessageReceiver( new PthreadsChannelReader($threadToMainBuffer) @@ -130,14 +137,6 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ } public function start() : void{ - $this->server->getTickSleeper()->addNotifier($this->sleeper, function() : void{ - Timings::$connection->startTiming(); - try{ - while($this->eventReceiver->handle($this)); - }finally{ - Timings::$connection->stopTiming(); - } - }); $this->server->getLogger()->debug("Waiting for RakLib to start..."); try{ $this->rakLib->startAndWait(); @@ -182,7 +181,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ } public function shutdown() : void{ - $this->server->getTickSleeper()->removeNotifier($this->sleeper); + $this->server->getTickSleeper()->removeNotifier($this->sleeperNotifierId); $this->rakLib->quit(); } diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index 5d4492f5fb..a3f7c16090 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -25,7 +25,7 @@ namespace pocketmine\network\mcpe\raklib; use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; -use pocketmine\snooze\SleeperNotifier; +use pocketmine\snooze\SleeperHandlerEntry; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; @@ -63,7 +63,7 @@ class RakLibServer extends Thread{ protected int $serverId, protected int $maxMtuSize, protected int $protocolVersion, - protected SleeperNotifier $mainThreadNotifier + protected SleeperHandlerEntry $sleeperEntry ){ $this->mainPath = \pocketmine\PATH; $this->address = new NonThreadSafeValue($address); @@ -133,7 +133,7 @@ class RakLibServer extends Thread{ $this->maxMtuSize, new SimpleProtocolAcceptor($this->protocolVersion), new UserToRakLibThreadMessageReceiver(new PthreadsChannelReader($this->mainToThreadBuffer)), - new RakLibToUserThreadMessageSender(new SnoozeAwarePthreadsChannelWriter($this->threadToMainBuffer, $this->mainThreadNotifier)), + new RakLibToUserThreadMessageSender(new SnoozeAwarePthreadsChannelWriter($this->threadToMainBuffer, $this->sleeperEntry->createNotifier())), new ExceptionTraceCleaner($this->mainPath) ); $this->synchronized(function() : void{ diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 1ee726765e..6a696fd1b2 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -26,7 +26,6 @@ namespace pocketmine\scheduler; use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; use pocketmine\snooze\SleeperHandler; -use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\utils\Utils; @@ -52,8 +51,8 @@ class AsyncPool{ private array $taskQueues = []; /** - * @var AsyncWorker[] - * @phpstan-var array + * @var AsyncPoolWorkerEntry[] + * @phpstan-var array */ private array $workers = []; /** @@ -132,13 +131,12 @@ class AsyncPool{ */ private function getWorker(int $worker) : AsyncWorker{ if(!isset($this->workers[$worker])){ - $notifier = new SleeperNotifier(); - $this->workers[$worker] = new AsyncWorker($this->logger, $worker, $this->workerMemoryLimit, $notifier); - $this->eventLoop->addNotifier($notifier, function() use ($worker) : void{ + $sleeperEntry = $this->eventLoop->addNotifier(function() use ($worker) : void{ $this->collectTasksFromWorker($worker); }); - $this->workers[$worker]->setClassLoaders([$this->classLoader]); - $this->workers[$worker]->start(self::WORKER_START_OPTIONS); + $this->workers[$worker] = new AsyncPoolWorkerEntry(new AsyncWorker($this->logger, $worker, $this->workerMemoryLimit, $sleeperEntry), $sleeperEntry->getNotifierId()); + $this->workers[$worker]->worker->setClassLoaders([$this->classLoader]); + $this->workers[$worker]->worker->start(self::WORKER_START_OPTIONS); $this->taskQueues[$worker] = new \SplQueue(); @@ -147,7 +145,7 @@ class AsyncPool{ } } - return $this->workers[$worker]; + return $this->workers[$worker]->worker; } /** @@ -270,7 +268,7 @@ class AsyncPool{ break; //current task is still running, skip to next worker } } - $this->workers[$worker]->collect(); + $this->workers[$worker]->worker->collect(); return $more; } @@ -289,8 +287,8 @@ class AsyncPool{ $time = time(); foreach($this->taskQueues as $i => $queue){ if((!isset($this->workerLastUsed[$i]) || $this->workerLastUsed[$i] + 300 < $time) && $queue->isEmpty()){ - $this->workers[$i]->quit(); - $this->eventLoop->removeNotifier($this->workers[$i]->getNotifier()); + $this->workers[$i]->worker->quit(); + $this->eventLoop->removeNotifier($this->workers[$i]->sleeperNotifierId); unset($this->workers[$i], $this->taskQueues[$i], $this->workerLastUsed[$i]); $ret++; } @@ -308,8 +306,8 @@ class AsyncPool{ } foreach($this->workers as $worker){ - $worker->quit(); - $this->eventLoop->removeNotifier($worker->getNotifier()); + $worker->worker->quit(); + $this->eventLoop->removeNotifier($worker->sleeperNotifierId); } $this->workers = []; $this->taskQueues = []; diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 89908ff31a..517542495d 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -24,9 +24,11 @@ declare(strict_types=1); namespace pocketmine\scheduler; use pmmp\thread\Thread as NativeThread; +use pocketmine\snooze\SleeperHandlerEntry; use pocketmine\snooze\SleeperNotifier; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\Worker; +use pocketmine\utils\AssumptionFailedError; use function gc_enable; use function ini_set; @@ -34,15 +36,21 @@ class AsyncWorker extends Worker{ /** @var mixed[] */ private static array $store = []; + private const TLS_KEY_NOTIFIER = self::class . "::notifier"; + public function __construct( private ThreadSafeLogger $logger, private int $id, private int $memoryLimit, - private SleeperNotifier $notifier + private SleeperHandlerEntry $sleeperEntry ){} public function getNotifier() : SleeperNotifier{ - return $this->notifier; + $notifier = $this->getFromThreadStore(self::TLS_KEY_NOTIFIER); + if(!$notifier instanceof SleeperNotifier){ + throw new AssumptionFailedError("SleeperNotifier not found in thread-local storage"); + } + return $notifier; } protected function onRun() : void{ @@ -57,6 +65,8 @@ class AsyncWorker extends Worker{ ini_set('memory_limit', '-1'); $this->logger->debug("No memory limit set"); } + + $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); } public function getLogger() : ThreadSafeLogger{ From a7aebed0a03c91566e46eed140ca33755f3817eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:19:03 +0100 Subject: [PATCH 1036/1858] Update DevTools submodule to pmmp/DevTools@aa1586db050d55012e99be52dad5a2ee2cbb6ec7 --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index ff5a4fb830..aa1586db05 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit ff5a4fb83035dc5074162de5ec36185bc11cf9bb +Subproject commit aa1586db050d55012e99be52dad5a2ee2cbb6ec7 From ed64eac76f02c9ab872e8450f28ed04f3174aee9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:21:30 +0100 Subject: [PATCH 1037/1858] ... --- src/scheduler/AsyncPoolWorkerEntry.php | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/scheduler/AsyncPoolWorkerEntry.php diff --git a/src/scheduler/AsyncPoolWorkerEntry.php b/src/scheduler/AsyncPoolWorkerEntry.php new file mode 100644 index 0000000000..ce24126206 --- /dev/null +++ b/src/scheduler/AsyncPoolWorkerEntry.php @@ -0,0 +1,32 @@ + Date: Tue, 23 May 2023 01:31:25 +0100 Subject: [PATCH 1038/1858] Consolidate worker data under AsyncPoolWorkerEntry instead of having a bunch of arrays... this improves the system integrity and makes it less obnoxious to look at --- src/scheduler/AsyncPool.php | 65 ++++++++++---------------- src/scheduler/AsyncPoolWorkerEntry.php | 20 +++++++- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 6a696fd1b2..85a27390a2 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -44,22 +44,11 @@ use const PHP_INT_MAX; class AsyncPool{ private const WORKER_START_OPTIONS = NativeThread::INHERIT_INI | NativeThread::INHERIT_COMMENTS; - /** - * @var \SplQueue[]|AsyncTask[][] - * @phpstan-var array> - */ - private array $taskQueues = []; - /** * @var AsyncPoolWorkerEntry[] * @phpstan-var array */ private array $workers = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $workerLastUsed = []; /** * @var \Closure[] @@ -129,23 +118,21 @@ class AsyncPool{ * Fetches the worker with the specified ID, starting it if it does not exist, and firing any registered worker * start hooks. */ - private function getWorker(int $worker) : AsyncWorker{ - if(!isset($this->workers[$worker])){ - $sleeperEntry = $this->eventLoop->addNotifier(function() use ($worker) : void{ - $this->collectTasksFromWorker($worker); + private function getWorker(int $workerId) : AsyncPoolWorkerEntry{ + if(!isset($this->workers[$workerId])){ + $sleeperEntry = $this->eventLoop->addNotifier(function() use ($workerId) : void{ + $this->collectTasksFromWorker($workerId); }); - $this->workers[$worker] = new AsyncPoolWorkerEntry(new AsyncWorker($this->logger, $worker, $this->workerMemoryLimit, $sleeperEntry), $sleeperEntry->getNotifierId()); - $this->workers[$worker]->worker->setClassLoaders([$this->classLoader]); - $this->workers[$worker]->worker->start(self::WORKER_START_OPTIONS); - - $this->taskQueues[$worker] = new \SplQueue(); + $this->workers[$workerId] = new AsyncPoolWorkerEntry(new AsyncWorker($this->logger, $workerId, $this->workerMemoryLimit, $sleeperEntry), $sleeperEntry->getNotifierId()); + $this->workers[$workerId]->worker->setClassLoaders([$this->classLoader]); + $this->workers[$workerId]->worker->start(self::WORKER_START_OPTIONS); foreach($this->workerStartHooks as $hook){ - $hook($worker); + $hook($workerId); } } - return $this->workers[$worker]->worker; + return $this->workers[$workerId]; } /** @@ -162,9 +149,7 @@ class AsyncPool{ $task->progressUpdates = new ThreadSafeArray(); $task->setSubmitted(); - $this->getWorker($worker)->stack($task); - $this->taskQueues[$worker]->enqueue($task); - $this->workerLastUsed[$worker] = time(); + $this->getWorker($worker)->submit($task); } /** @@ -177,8 +162,8 @@ class AsyncPool{ public function selectWorker() : int{ $worker = null; $minUsage = PHP_INT_MAX; - foreach($this->taskQueues as $i => $queue){ - if(($usage = $queue->count()) < $minUsage){ + foreach($this->workers as $i => $entry){ + if(($usage = $entry->tasks->count()) < $minUsage){ $worker = $i; $minUsage = $usage; if($usage === 0){ @@ -221,13 +206,13 @@ class AsyncPool{ * @return bool whether there are tasks left to be collected */ public function collectTasks() : bool{ - foreach($this->taskQueues as $worker => $queue){ - $this->collectTasksFromWorker($worker); + foreach($this->workers as $workerId => $entry){ + $this->collectTasksFromWorker($workerId); } //we check this in a second loop, because task collection could have caused new tasks to be added to the queues - foreach($this->taskQueues as $queue){ - if(!$queue->isEmpty()){ + foreach($this->workers as $entry){ + if(!$entry->tasks->isEmpty()){ return true; } } @@ -235,10 +220,10 @@ class AsyncPool{ } public function collectTasksFromWorker(int $worker) : bool{ - if(!isset($this->taskQueues[$worker])){ + if(!isset($this->workers[$worker])){ throw new \InvalidArgumentException("No such worker $worker"); } - $queue = $this->taskQueues[$worker]; + $queue = $this->workers[$worker]->tasks; $more = false; while(!$queue->isEmpty()){ /** @var AsyncTask $task */ @@ -279,17 +264,17 @@ class AsyncPool{ * @phpstan-return array */ public function getTaskQueueSizes() : array{ - return array_map(function(\SplQueue $queue) : int{ return $queue->count(); }, $this->taskQueues); + return array_map(function(AsyncPoolWorkerEntry $entry) : int{ return $entry->tasks->count(); }, $this->workers); } public function shutdownUnusedWorkers() : int{ $ret = 0; $time = time(); - foreach($this->taskQueues as $i => $queue){ - if((!isset($this->workerLastUsed[$i]) || $this->workerLastUsed[$i] + 300 < $time) && $queue->isEmpty()){ - $this->workers[$i]->worker->quit(); - $this->eventLoop->removeNotifier($this->workers[$i]->sleeperNotifierId); - unset($this->workers[$i], $this->taskQueues[$i], $this->workerLastUsed[$i]); + foreach($this->workers as $i => $entry){ + if($entry->lastUsed + 300 < $time && $entry->tasks->isEmpty()){ + $entry->worker->quit(); + $this->eventLoop->removeNotifier($entry->sleeperNotifierId); + unset($this->workers[$i]); $ret++; } } @@ -310,7 +295,5 @@ class AsyncPool{ $this->eventLoop->removeNotifier($worker->sleeperNotifierId); } $this->workers = []; - $this->taskQueues = []; - $this->workerLastUsed = []; } } diff --git a/src/scheduler/AsyncPoolWorkerEntry.php b/src/scheduler/AsyncPoolWorkerEntry.php index ce24126206..6f6fdc5d33 100644 --- a/src/scheduler/AsyncPoolWorkerEntry.php +++ b/src/scheduler/AsyncPoolWorkerEntry.php @@ -23,10 +23,28 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use function time; + final class AsyncPoolWorkerEntry{ + public int $lastUsed; + /** + * @var \SplQueue|AsyncTask[] + * @phpstan-var \SplQueue + */ + public \SplQueue $tasks; + public function __construct( public readonly AsyncWorker $worker, public readonly int $sleeperNotifierId - ){} + ){ + $this->lastUsed = time(); + $this->tasks = new \SplQueue(); + } + + public function submit(AsyncTask $task) : void{ + $this->tasks->enqueue($task); + $this->lastUsed = time(); + $this->worker->stack($task); + } } From 9d9c628acd3fa22e2ef5e08c7ed6d94757c0888e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:32:44 +0100 Subject: [PATCH 1039/1858] Mark AsyncPoolWorkerEntry as @internal --- src/scheduler/AsyncPoolWorkerEntry.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/scheduler/AsyncPoolWorkerEntry.php b/src/scheduler/AsyncPoolWorkerEntry.php index 6f6fdc5d33..0c62ab9319 100644 --- a/src/scheduler/AsyncPoolWorkerEntry.php +++ b/src/scheduler/AsyncPoolWorkerEntry.php @@ -25,6 +25,9 @@ namespace pocketmine\scheduler; use function time; +/** + * @internal + */ final class AsyncPoolWorkerEntry{ public int $lastUsed; From 1c691167171fd9310446649e06bcc006c616db2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:52:57 +0100 Subject: [PATCH 1040/1858] Release 5.0.0-BETA4 --- changelogs/5.0-beta.md | 19 +++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/changelogs/5.0-beta.md b/changelogs/5.0-beta.md index 27eef09a06..c100cfefc9 100644 --- a/changelogs/5.0-beta.md +++ b/changelogs/5.0-beta.md @@ -194,3 +194,22 @@ Released 17th May 2023. - `RuntimeBlockMapping` has been renamed to `BlockTranslator`. - Singletons in the `pocketmine\network\mcpe\convert` package have been centralized under `TypeConverter`. In the future, this will be injected where needed, allowing different converters to be used for different sessions (useful for multiversion). - Overriding of serializers and deserializers of items and blocks is now consistently disallowed. Due to the lack of a good reason to allow overriding built-in blocks and items, this is no longer allowed. + +# 5.0.0-BETA4 +Released 23rd May 2023. + +## General +- [`ext-pmmpthread` version 6.0.0](https://github.com/pmmp/ext-pmmpthread/releases/6.0.0) (renamed from `ext-pthreads`) is now required. This version has API changes compared to pthreads v5. Please read the linked changelog for details. +- [`pocketmine/snooze` version 0.5.0](https://github.com/pmmp/Snooze/releases/0.5.0) is now required. +- `pocketmine/classloader` and `pocketmine/log-pthreads` packages have been removed. The relevant classes from these packages are now included in-house in the `pocketmine/thread` namespace. + - `BaseClassLoader` is replaced with `pocketmine\thread\ThreadSafeClassLoader` + - `ThreadedLogger` is replaced by `pocketmine\thread\ThreadSafeLogger` + - `AttachableThreadedLogger` is replaced by `pocketmine\thread\AttachableThreadSafeLogger` + - `ThreadedLoggerAttachment` is replaced by `pocketmine\thread\ThreadSafeLoggerAttachment` + +## Fixes +- Fixed crash on unknown blocks due to late initialization of properties in `UnknownBlock`. + +## API changes +### `pocketmine\scheduler` +- `AsyncTask->setResult()` now works with thread-safe objects. This was previously not possible due to limitations in the `pthreads` extension. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b89ac4b668..f91a871f08 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.0.0-BETA4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "beta"; private function __construct(){ From 2ebf8757c1911fa4e925b7435fa491f32071e5ae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 23 May 2023 01:53:00 +0100 Subject: [PATCH 1041/1858] 5.0.0-BETA5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index f91a871f08..7ac6ec3f97 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-BETA4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.0-BETA5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; private function __construct(){ From 57330a718683b4a9db8469403bd7a66b7951493a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 12:27:12 +0100 Subject: [PATCH 1042/1858] Bump build/php from `f860ade` to `b1d5c0d` (#5760) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `f860ade` to `b1d5c0d`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/f860ade30acc074a98bbf5ff286f35b5eda10c86...b1d5c0d737be86538bb35e1408cd53a616de5a27) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index f860ade30a..b1d5c0d737 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit f860ade30acc074a98bbf5ff286f35b5eda10c86 +Subproject commit b1d5c0d737be86538bb35e1408cd53a616de5a27 From ffe3556be1c8c20218190da184510518694f3234 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 May 2023 16:35:45 +0100 Subject: [PATCH 1043/1858] Block: XOR state data with type ID, improve hash distribution since most blocks have no state data, their lower 8 bits of state data were all zero. This makes state IDs a bit more distributed for minimal cost. I considered flipping these around and using type ID in the lower bits directly, but this worsened distribution for walls. In the worst case, largest number of collisions drops from 11 to 5 with this change, and the number of states with unique hash keys increased from 3518 to 4461 (out of 7638). This is still a long way from perfect, but it's a decent improvement, improving the overall load factor from 1.6 to 1.3. related to #5604 --- src/block/Block.php | 3 ++- src/block/RuntimeBlockStateRegistry.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index bc76bf9526..3ce2dc188e 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -140,7 +140,8 @@ class Block{ * {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ - return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->encodeFullState(); + $typeId = $this->getTypeId(); + return ($typeId << self::INTERNAL_STATE_DATA_BITS) | ($this->encodeFullState() ^ ($typeId & self::INTERNAL_STATE_DATA_MASK)); } /** diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index e524fb2627..78be658bc1 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -123,7 +123,7 @@ class RuntimeBlockStateRegistry{ $block = clone $this->fullList[$stateId]; }else{ $typeId = $stateId >> Block::INTERNAL_STATE_DATA_BITS; - $stateData = $stateId & Block::INTERNAL_STATE_DATA_MASK; + $stateData = ($stateId ^ $typeId) & Block::INTERNAL_STATE_DATA_MASK; $block = new UnknownBlock(new BID($typeId), new BlockTypeInfo(BreakInfo::instant()), $stateData); } From 24e897f813b793c50db054c33d669f4408e23b06 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 May 2023 16:48:34 +0100 Subject: [PATCH 1044/1858] Updated blockstate registry consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 358520a155..0317cfe3ea 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624000],"Acacia Button":[2560256,2560257,2560258,2560259,2560260,2560261,2560264,2560265,2560266,2560267,2560268,2560269],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560768],"Acacia Fence Gate":[2561024,2561025,2561026,2561027,2561028,2561029,2561030,2561031,2561032,2561033,2561034,2561035,2561036,2561037,2561038,2561039],"Acacia Leaves":[2561280,2561281,2561282,2561283],"Acacia Log":[2561536,2561537,2561538,2561539,2561540,2561541],"Acacia Planks":[2561792],"Acacia Pressure Plate":[2562048,2562049],"Acacia Sapling":[2562304,2562305],"Acacia Sign":[2562560,2562561,2562562,2562563,2562564,2562565,2562566,2562567,2562568,2562569,2562570,2562571,2562572,2562573,2562574,2562575],"Acacia Slab":[2562816,2562817,2562818],"Acacia Stairs":[2563072,2563073,2563074,2563075,2563076,2563077,2563078,2563079],"Acacia Trapdoor":[2563328,2563329,2563330,2563331,2563332,2563333,2563334,2563335,2563336,2563337,2563338,2563339,2563340,2563341,2563342,2563343],"Acacia Wall Sign":[2563584,2563585,2563586,2563587],"Acacia Wood":[2563840,2563841,2563842,2563843,2563844,2563845],"Actinium":[2594048],"Activator Rail":[2564096,2564097,2564098,2564099,2564100,2564101,2564104,2564105,2564106,2564107,2564108,2564109],"Air":[2560000],"All Sided Mushroom Stem":[2564352],"Allium":[2564608],"Aluminum":[2594304],"Americium":[2594560],"Amethyst":[2698240],"Ancient Debris":[2698496],"Andesite":[2564864],"Andesite Slab":[2565120,2565121,2565122],"Andesite Stairs":[2565376,2565377,2565378,2565379,2565380,2565381,2565382,2565383],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565696,2565697,2565698,2565699,2565700,2565701,2565702,2565703,2565704,2565705,2565706,2565707,2565708,2565709,2565710,2565711,2565712,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565824,2565825,2565826,2565827,2565828,2565829,2565830,2565831,2565832,2565833,2565834,2565835,2565836,2565837,2565838,2565839,2565840],"Antimony":[2594816],"Anvil":[2565888,2565889,2565890,2565892,2565893,2565894,2565896,2565897,2565898,2565900,2565901,2565902],"Argon":[2595072],"Arsenic":[2595328],"Astatine":[2595584],"Azalea Leaves":[2735616,2735617,2735618,2735619],"Azure Bluet":[2566144],"Bamboo":[2566400,2566401,2566402,2566404,2566405,2566406,2566408,2566409,2566410,2566412,2566413,2566414],"Bamboo Sapling":[2566656,2566657],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595840],"Barrel":[2567168,2567169,2567170,2567171,2567172,2567173,2567176,2567177,2567178,2567179,2567180,2567181],"Barrier":[2567424],"Basalt":[2698752,2698753,2698754],"Beacon":[2567680],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568192,2568193],"Beetroot Block":[2568448,2568449,2568450,2568451,2568452,2568453,2568454,2568455],"Bell":[2568704,2568705,2568706,2568707,2568708,2568709,2568710,2568711,2568712,2568713,2568714,2568715,2568716,2568717,2568718,2568719],"Berkelium":[2596096],"Beryllium":[2596352],"Birch Button":[2568960,2568961,2568962,2568963,2568964,2568965,2568968,2568969,2568970,2568971,2568972,2568973],"Birch Door":[2569216,2569217,2569218,2569219,2569220,2569221,2569222,2569223,2569224,2569225,2569226,2569227,2569228,2569229,2569230,2569231,2569232,2569233,2569234,2569235,2569236,2569237,2569238,2569239,2569240,2569241,2569242,2569243,2569244,2569245,2569246,2569247],"Birch Fence":[2569472],"Birch Fence Gate":[2569728,2569729,2569730,2569731,2569732,2569733,2569734,2569735,2569736,2569737,2569738,2569739,2569740,2569741,2569742,2569743],"Birch Leaves":[2569984,2569985,2569986,2569987],"Birch Log":[2570240,2570241,2570242,2570243,2570244,2570245],"Birch Planks":[2570496],"Birch Pressure Plate":[2570752,2570753],"Birch Sapling":[2571008,2571009],"Birch Sign":[2571264,2571265,2571266,2571267,2571268,2571269,2571270,2571271,2571272,2571273,2571274,2571275,2571276,2571277,2571278,2571279],"Birch Slab":[2571520,2571521,2571522],"Birch Stairs":[2571776,2571777,2571778,2571779,2571780,2571781,2571782,2571783],"Birch Trapdoor":[2572032,2572033,2572034,2572035,2572036,2572037,2572038,2572039,2572040,2572041,2572042,2572043,2572044,2572045,2572046,2572047],"Birch Wall Sign":[2572288,2572289,2572290,2572291],"Birch Wood":[2572544,2572545,2572546,2572547,2572548,2572549],"Bismuth":[2596608],"Blackstone":[2699520],"Blackstone Slab":[2699776,2699777,2699778],"Blackstone Stairs":[2700032,2700033,2700034,2700035,2700036,2700037,2700038,2700039],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700352,2700353,2700354,2700355,2700356,2700357,2700358,2700359,2700360,2700361,2700362,2700363,2700364,2700365,2700366,2700367,2700368,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700480,2700481,2700482,2700483,2700484,2700485,2700486,2700487,2700488,2700489,2700490,2700491,2700492,2700493,2700494,2700495,2700496],"Blast Furnace":[2573056,2573057,2573058,2573059,2573060,2573061,2573062,2573063],"Blue Ice":[2573568],"Blue Orchid":[2573824],"Blue Torch":[2574081,2574082,2574083,2574084,2574085],"Bohrium":[2596864],"Bone Block":[2574336,2574337,2574338],"Bookshelf":[2574592],"Boron":[2597120],"Brewing Stand":[2574848,2574849,2574850,2574851,2574852,2574853,2574854,2574855],"Brick Slab":[2575104,2575105,2575106],"Brick Stairs":[2575360,2575361,2575362,2575363,2575364,2575365,2575366,2575367],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575632,2575633,2575634,2575635,2575636,2575637,2575638,2575639,2575640,2575641,2575642,2575643,2575644,2575645,2575646,2575647,2575648,2575649,2575650,2575651,2575652,2575653,2575654,2575655,2575656,2575657,2575658,2575659,2575660,2575661,2575662,2575663,2575664,2575665,2575666,2575667,2575668,2575669,2575670,2575671,2575672,2575673,2575674,2575675,2575676,2575677,2575678,2575679,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575760,2575761,2575762,2575763,2575764,2575765,2575766,2575767,2575768,2575769,2575770,2575771,2575772,2575773,2575774,2575775,2575776,2575777,2575778,2575779,2575780,2575781,2575782,2575783,2575784,2575785,2575786,2575787,2575788,2575789,2575790,2575791,2575792,2575793,2575794,2575795,2575796,2575797,2575798,2575799,2575800,2575801,2575802,2575803,2575804,2575805,2575806,2575807,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824],"Bricks":[2575872],"Bromine":[2597376],"Brown Mushroom":[2576384],"Brown Mushroom Block":[2576640,2576641,2576642,2576643,2576644,2576645,2576646,2576647,2576648,2576649,2576650],"Cactus":[2576896,2576897,2576898,2576899,2576900,2576901,2576902,2576903,2576904,2576905,2576906,2576907,2576908,2576909,2576910,2576911],"Cadmium":[2597632],"Cake":[2577152,2577153,2577154,2577155,2577156,2577157,2577158],"Cake With Candle":[2729472,2729473],"Cake With Dyed Candle":[2729728,2729729,2729730,2729731,2729732,2729733,2729734,2729735,2729736,2729737,2729738,2729739,2729740,2729741,2729742,2729743,2729744,2729745,2729746,2729747,2729748,2729749,2729750,2729751,2729752,2729753,2729754,2729755,2729756,2729757,2729758,2729759],"Calcite":[2704640],"Calcium":[2597888],"Californium":[2598144],"Candle":[2728960,2728961,2728962,2728963,2728964,2728965,2728966,2728967],"Carbon":[2598400],"Carpet":[2577408,2577409,2577410,2577411,2577412,2577413,2577414,2577415,2577416,2577417,2577418,2577419,2577420,2577421,2577422,2577423],"Carrot Block":[2577664,2577665,2577666,2577667,2577668,2577669,2577670,2577671],"Cartography Table":[2730496],"Carved Pumpkin":[2577920,2577921,2577922,2577923],"Cauldron":[2731520],"Cave Vines":[2736384,2736385,2736386,2736387,2736388,2736389,2736390,2736391,2736392,2736393,2736394,2736395,2736396,2736397,2736398,2736399,2736400,2736401,2736402,2736403,2736404,2736405,2736406,2736407,2736408,2736409,2736416,2736417,2736418,2736419,2736420,2736421,2736422,2736423,2736424,2736425,2736426,2736427,2736428,2736429,2736430,2736431,2736432,2736433,2736434,2736435,2736436,2736437,2736438,2736439,2736440,2736441,2736448,2736449,2736450,2736451,2736452,2736453,2736454,2736455,2736456,2736457,2736458,2736459,2736460,2736461,2736462,2736463,2736464,2736465,2736466,2736467,2736468,2736469,2736470,2736471,2736472,2736473,2736480,2736481,2736482,2736483,2736484,2736485,2736486,2736487,2736488,2736489,2736490,2736491,2736492,2736493,2736494,2736495,2736496,2736497,2736498,2736499,2736500,2736501,2736502,2736503,2736504,2736505],"Cerium":[2598656],"Cesium":[2598912],"Chain":[2734592,2734593,2734594],"Chest":[2578432,2578433,2578434,2578435],"Chiseled Deepslate":[2710016],"Chiseled Nether Bricks":[2710272],"Chiseled Polished Blackstone":[2702080],"Chiseled Quartz Block":[2578688,2578689,2578690],"Chiseled Red Sandstone":[2578944],"Chiseled Sandstone":[2579200],"Chiseled Stone Bricks":[2579456],"Chlorine":[2599168],"Chorus Flower":[2732800,2732801,2732802,2732803,2732804,2732805],"Chorus Plant":[2733056],"Chromium":[2599424],"Clay Block":[2579712],"Coal Block":[2579968],"Coal Ore":[2580224],"Cobalt":[2599680],"Cobbled Deepslate":[2707712],"Cobbled Deepslate Slab":[2707968,2707969,2707970],"Cobbled Deepslate Stairs":[2708224,2708225,2708226,2708227,2708228,2708229,2708230,2708231],"Cobbled Deepslate Wall":[2708480,2708481,2708482,2708483,2708484,2708485,2708486,2708487,2708488,2708489,2708490,2708491,2708492,2708493,2708494,2708495,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708512,2708513,2708514,2708515,2708516,2708517,2708518,2708519,2708520,2708521,2708522,2708523,2708524,2708525,2708526,2708527,2708528,2708529,2708530,2708531,2708532,2708533,2708534,2708535,2708536,2708537,2708538,2708539,2708540,2708541,2708542,2708543,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708608,2708609,2708610,2708611,2708612,2708613,2708614,2708615,2708616,2708617,2708618,2708619,2708620,2708621,2708622,2708623,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708640,2708641,2708642,2708643,2708644,2708645,2708646,2708647,2708648,2708649,2708650,2708651,2708652,2708653,2708654,2708655,2708656,2708657,2708658,2708659,2708660,2708661,2708662,2708663,2708664,2708665,2708666,2708667,2708668,2708669,2708670,2708671,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688],"Cobblestone":[2580480],"Cobblestone Slab":[2580736,2580737,2580738],"Cobblestone Stairs":[2580992,2580993,2580994,2580995,2580996,2580997,2580998,2580999],"Cobblestone Wall":[2581248,2581249,2581250,2581251,2581252,2581253,2581254,2581255,2581256,2581257,2581258,2581259,2581260,2581261,2581262,2581263,2581264,2581265,2581266,2581267,2581268,2581269,2581270,2581271,2581272,2581273,2581274,2581275,2581276,2581277,2581278,2581279,2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581296,2581297,2581298,2581299,2581300,2581301,2581302,2581303,2581304,2581305,2581306,2581307,2581308,2581309,2581310,2581311,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581376,2581377,2581378,2581379,2581380,2581381,2581382,2581383,2581384,2581385,2581386,2581387,2581388,2581389,2581390,2581391,2581392,2581393,2581394,2581395,2581396,2581397,2581398,2581399,2581400,2581401,2581402,2581403,2581404,2581405,2581406,2581407,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581424,2581425,2581426,2581427,2581428,2581429,2581430,2581431,2581432,2581433,2581434,2581435,2581436,2581437,2581438,2581439,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456],"Cobweb":[2581504],"Cocoa Block":[2581760,2581761,2581762,2581763,2581764,2581765,2581766,2581767,2581768,2581769,2581770,2581771],"Compound Creator":[2582016,2582017,2582018,2582019],"Concrete":[2582272,2582273,2582274,2582275,2582276,2582277,2582278,2582279,2582280,2582281,2582282,2582283,2582284,2582285,2582286,2582287],"Concrete Powder":[2582528,2582529,2582530,2582531,2582532,2582533,2582534,2582535,2582536,2582537,2582538,2582539,2582540,2582541,2582542,2582543],"Copernicium":[2600192],"Copper":[2600448],"Copper Block":[2727936,2727937,2727938,2727939,2727940,2727941,2727942,2727943],"Copper Ore":[2724864],"Coral":[2582784,2582785,2582786,2582787,2582788,2582792,2582793,2582794,2582795,2582796],"Coral Block":[2583040,2583041,2583042,2583043,2583044,2583048,2583049,2583050,2583051,2583052],"Coral Fan":[2583296,2583297,2583298,2583299,2583300,2583304,2583305,2583306,2583307,2583308,2583312,2583313,2583314,2583315,2583316,2583320,2583321,2583322,2583323,2583324],"Cornflower":[2583552],"Cracked Deepslate Bricks":[2706176],"Cracked Deepslate Tiles":[2707456],"Cracked Nether Bricks":[2710528],"Cracked Polished Blackstone Bricks":[2703360],"Cracked Stone Bricks":[2583808],"Crafting Table":[2584064],"Crimson Button":[2717184,2717185,2717186,2717187,2717188,2717189,2717192,2717193,2717194,2717195,2717196,2717197],"Crimson Door":[2718720,2718721,2718722,2718723,2718724,2718725,2718726,2718727,2718728,2718729,2718730,2718731,2718732,2718733,2718734,2718735,2718736,2718737,2718738,2718739,2718740,2718741,2718742,2718743,2718744,2718745,2718746,2718747,2718748,2718749,2718750,2718751],"Crimson Fence":[2713344],"Crimson Fence Gate":[2719488,2719489,2719490,2719491,2719492,2719493,2719494,2719495,2719496,2719497,2719498,2719499,2719500,2719501,2719502,2719503],"Crimson Hyphae":[2715648,2715649,2715650,2715651,2715652,2715653],"Crimson Planks":[2712576],"Crimson Pressure Plate":[2717952,2717953],"Crimson Sign":[2721024,2721025,2721026,2721027,2721028,2721029,2721030,2721031,2721032,2721033,2721034,2721035,2721036,2721037,2721038,2721039],"Crimson Slab":[2714112,2714113,2714114],"Crimson Stairs":[2720256,2720257,2720258,2720259,2720260,2720261,2720262,2720263],"Crimson Stem":[2714880,2714881,2714882,2714883,2714884,2714885],"Crimson Trapdoor":[2716416,2716417,2716418,2716419,2716420,2716421,2716422,2716423,2716424,2716425,2716426,2716427,2716428,2716429,2716430,2716431],"Crimson Wall Sign":[2721792,2721793,2721794,2721795],"Crying Obsidian":[2727168],"Curium":[2600704],"Cut Copper Block":[2728192,2728193,2728194,2728195,2728196,2728197,2728198,2728199],"Cut Copper Slab Slab":[2728448,2728449,2728450,2728451,2728452,2728453,2728454,2728455,2728456,2728457,2728458,2728459,2728460,2728461,2728462,2728463,2728464,2728465,2728466,2728467,2728468,2728469,2728470,2728471],"Cut Copper Stairs":[2728704,2728705,2728706,2728707,2728708,2728709,2728710,2728711,2728712,2728713,2728714,2728715,2728716,2728717,2728718,2728719,2728720,2728721,2728722,2728723,2728724,2728725,2728726,2728727,2728728,2728729,2728730,2728731,2728732,2728733,2728734,2728735,2728736,2728737,2728738,2728739,2728740,2728741,2728742,2728743,2728744,2728745,2728746,2728747,2728748,2728749,2728750,2728751,2728752,2728753,2728754,2728755,2728756,2728757,2728758,2728759,2728760,2728761,2728762,2728763,2728764,2728765,2728766,2728767],"Cut Red Sandstone":[2584320],"Cut Red Sandstone Slab":[2584576,2584577,2584578],"Cut Sandstone":[2584832],"Cut Sandstone Slab":[2585088,2585089,2585090],"Dandelion":[2585600],"Dark Oak Button":[2585856,2585857,2585858,2585859,2585860,2585861,2585864,2585865,2585866,2585867,2585868,2585869],"Dark Oak Door":[2586112,2586113,2586114,2586115,2586116,2586117,2586118,2586119,2586120,2586121,2586122,2586123,2586124,2586125,2586126,2586127,2586128,2586129,2586130,2586131,2586132,2586133,2586134,2586135,2586136,2586137,2586138,2586139,2586140,2586141,2586142,2586143],"Dark Oak Fence":[2586368],"Dark Oak Fence Gate":[2586624,2586625,2586626,2586627,2586628,2586629,2586630,2586631,2586632,2586633,2586634,2586635,2586636,2586637,2586638,2586639],"Dark Oak Leaves":[2586880,2586881,2586882,2586883],"Dark Oak Log":[2587136,2587137,2587138,2587139,2587140,2587141],"Dark Oak Planks":[2587392],"Dark Oak Pressure Plate":[2587648,2587649],"Dark Oak Sapling":[2587904,2587905],"Dark Oak Sign":[2588160,2588161,2588162,2588163,2588164,2588165,2588166,2588167,2588168,2588169,2588170,2588171,2588172,2588173,2588174,2588175],"Dark Oak Slab":[2588416,2588417,2588418],"Dark Oak Stairs":[2588672,2588673,2588674,2588675,2588676,2588677,2588678,2588679],"Dark Oak Trapdoor":[2588928,2588929,2588930,2588931,2588932,2588933,2588934,2588935,2588936,2588937,2588938,2588939,2588940,2588941,2588942,2588943],"Dark Oak Wall Sign":[2589184,2589185,2589186,2589187],"Dark Oak Wood":[2589440,2589441,2589442,2589443,2589444,2589445],"Dark Prismarine":[2589696],"Dark Prismarine Slab":[2589952,2589953,2589954],"Dark Prismarine Stairs":[2590208,2590209,2590210,2590211,2590212,2590213,2590214,2590215],"Darmstadtium":[2600960],"Daylight Sensor":[2590464,2590465,2590466,2590467,2590468,2590469,2590470,2590471,2590472,2590473,2590474,2590475,2590476,2590477,2590478,2590479,2590480,2590481,2590482,2590483,2590484,2590485,2590486,2590487,2590488,2590489,2590490,2590491,2590492,2590493,2590494,2590495],"Dead Bush":[2590720],"Deepslate":[2704896,2704897,2704898],"Deepslate Brick Slab":[2705408,2705409,2705410],"Deepslate Brick Stairs":[2705664,2705665,2705666,2705667,2705668,2705669,2705670,2705671],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705936,2705937,2705938,2705939,2705940,2705941,2705942,2705943,2705944,2705945,2705946,2705947,2705948,2705949,2705950,2705951,2705952,2705953,2705954,2705955,2705956,2705957,2705958,2705959,2705960,2705961,2705962,2705963,2705964,2705965,2705966,2705967,2705968,2705969,2705970,2705971,2705972,2705973,2705974,2705975,2705976,2705977,2705978,2705979,2705980,2705981,2705982,2705983,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706064,2706065,2706066,2706067,2706068,2706069,2706070,2706071,2706072,2706073,2706074,2706075,2706076,2706077,2706078,2706079,2706080,2706081,2706082,2706083,2706084,2706085,2706086,2706087,2706088,2706089,2706090,2706091,2706092,2706093,2706094,2706095,2706096,2706097,2706098,2706099,2706100,2706101,2706102,2706103,2706104,2706105,2706106,2706107,2706108,2706109,2706110,2706111,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128],"Deepslate Bricks":[2705152],"Deepslate Coal Ore":[2722816],"Deepslate Copper Ore":[2724608],"Deepslate Diamond Ore":[2723072],"Deepslate Emerald Ore":[2723328],"Deepslate Gold Ore":[2724352],"Deepslate Iron Ore":[2724096],"Deepslate Lapis Lazuli Ore":[2723584],"Deepslate Redstone Ore":[2723840,2723841],"Deepslate Tile Slab":[2706688,2706689,2706690],"Deepslate Tile Stairs":[2706944,2706945,2706946,2706947,2706948,2706949,2706950,2706951],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707216,2707217,2707218,2707219,2707220,2707221,2707222,2707223,2707224,2707225,2707226,2707227,2707228,2707229,2707230,2707231,2707232,2707233,2707234,2707235,2707236,2707237,2707238,2707239,2707240,2707241,2707242,2707243,2707244,2707245,2707246,2707247,2707248,2707249,2707250,2707251,2707252,2707253,2707254,2707255,2707256,2707257,2707258,2707259,2707260,2707261,2707262,2707263,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707344,2707345,2707346,2707347,2707348,2707349,2707350,2707351,2707352,2707353,2707354,2707355,2707356,2707357,2707358,2707359,2707360,2707361,2707362,2707363,2707364,2707365,2707366,2707367,2707368,2707369,2707370,2707371,2707372,2707373,2707374,2707375,2707376,2707377,2707378,2707379,2707380,2707381,2707382,2707383,2707384,2707385,2707386,2707387,2707388,2707389,2707390,2707391,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408],"Deepslate Tiles":[2706432],"Detector Rail":[2590976,2590977,2590978,2590979,2590980,2590981,2590984,2590985,2590986,2590987,2590988,2590989],"Diamond Block":[2591232],"Diamond Ore":[2591488],"Diorite":[2591744],"Diorite Slab":[2592000,2592001,2592002],"Diorite Stairs":[2592256,2592257,2592258,2592259,2592260,2592261,2592262,2592263],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592592,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592720],"Dirt":[2592768,2592769,2592770],"Double Tallgrass":[2593024,2593025],"Dragon Egg":[2593280],"Dried Kelp Block":[2593536],"Dubnium":[2601216],"Dyed Candle":[2729216,2729217,2729218,2729219,2729220,2729221,2729222,2729223,2729224,2729225,2729226,2729227,2729228,2729229,2729230,2729231,2729232,2729233,2729234,2729235,2729236,2729237,2729238,2729239,2729240,2729241,2729242,2729243,2729244,2729245,2729246,2729247,2729248,2729249,2729250,2729251,2729252,2729253,2729254,2729255,2729256,2729257,2729258,2729259,2729260,2729261,2729262,2729263,2729264,2729265,2729266,2729267,2729268,2729269,2729270,2729271,2729272,2729273,2729274,2729275,2729276,2729277,2729278,2729279,2729280,2729281,2729282,2729283,2729284,2729285,2729286,2729287,2729288,2729289,2729290,2729291,2729292,2729293,2729294,2729295,2729296,2729297,2729298,2729299,2729300,2729301,2729302,2729303,2729304,2729305,2729306,2729307,2729308,2729309,2729310,2729311,2729312,2729313,2729314,2729315,2729316,2729317,2729318,2729319,2729320,2729321,2729322,2729323,2729324,2729325,2729326,2729327,2729328,2729329,2729330,2729331,2729332,2729333,2729334,2729335,2729336,2729337,2729338,2729339,2729340,2729341,2729342,2729343],"Dyed Shulker Box":[2593792,2593793,2593794,2593795,2593796,2593797,2593798,2593799,2593800,2593801,2593802,2593803,2593804,2593805,2593806,2593807],"Dysprosium":[2601472],"Einsteinium":[2601728],"Element Constructor":[2599936,2599937,2599938,2599939],"Emerald Block":[2624768],"Emerald Ore":[2625024],"Enchanting Table":[2625280],"End Portal Frame":[2625536,2625537,2625538,2625539,2625540,2625541,2625542,2625543],"End Rod":[2625792,2625793,2625794,2625795,2625796,2625797],"End Stone":[2626048],"End Stone Brick Slab":[2626304,2626305,2626306],"End Stone Brick Stairs":[2626560,2626561,2626562,2626563,2626564,2626565,2626566,2626567],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626880,2626881,2626882,2626883,2626884,2626885,2626886,2626887,2626888,2626889,2626890,2626891,2626892,2626893,2626894,2626895,2626896,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627008,2627009,2627010,2627011,2627012,2627013,2627014,2627015,2627016,2627017,2627018,2627019,2627020,2627021,2627022,2627023,2627024],"End Stone Bricks":[2627072],"Ender Chest":[2627328,2627329,2627330,2627331],"Erbium":[2601984],"Europium":[2602240],"Fake Wooden Slab":[2627584,2627585,2627586],"Farmland":[2627840,2627841,2627842,2627843,2627844,2627845,2627846,2627847],"Fermium":[2602496],"Fern":[2628096],"Fire Block":[2628352,2628353,2628354,2628355,2628356,2628357,2628358,2628359,2628360,2628361,2628362,2628363,2628364,2628365,2628366,2628367],"Flerovium":[2602752],"Fletching Table":[2628608],"Flower Pot":[2628864],"Flowering Azalea Leaves":[2735872,2735873,2735874,2735875],"Fluorine":[2603008],"Francium":[2603264],"Froglight":[2733824,2733825,2733826,2733828,2733829,2733830,2733832,2733833,2733834],"Frosted Ice":[2629120,2629121,2629122,2629123],"Furnace":[2629376,2629377,2629378,2629379,2629380,2629381,2629382,2629383],"Gadolinium":[2603520],"Gallium":[2603776],"Germanium":[2604032],"Gilded Blackstone":[2727424],"Glass":[2629632],"Glass Pane":[2629888],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735104,2735105,2735106,2735107,2735108,2735109,2735112,2735113,2735114,2735115,2735116,2735117],"Glowing Obsidian":[2630144],"Glowstone":[2630400],"Gold":[2604288],"Gold Block":[2630656],"Gold Ore":[2630912],"Granite":[2631168],"Granite Slab":[2631424,2631425,2631426],"Granite Stairs":[2631680,2631681,2631682,2631683,2631684,2631685,2631686,2631687],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632000,2632001,2632002,2632003,2632004,2632005,2632006,2632007,2632008,2632009,2632010,2632011,2632012,2632013,2632014,2632015,2632016,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632128,2632129,2632130,2632131,2632132,2632133,2632134,2632135,2632136,2632137,2632138,2632139,2632140,2632141,2632142,2632143,2632144],"Grass":[2632192],"Grass Path":[2632448],"Gravel":[2632704],"Green Torch":[2633473,2633474,2633475,2633476,2633477],"Hafnium":[2604544],"Hanging Roots":[2730240],"Hardened Clay":[2633728],"Hardened Glass":[2633984],"Hardened Glass Pane":[2634240],"Hassium":[2604800],"Hay Bale":[2634496,2634497,2634498],"Heat Block":[2578176],"Helium":[2605056],"Holmium":[2605312],"Honeycomb Block":[2722560],"Hopper":[2634752,2634754,2634755,2634756,2634757,2634760,2634762,2634763,2634764,2634765],"Hydrogen":[2605568],"Ice":[2635008],"Indium":[2605824],"Infested Chiseled Stone Brick":[2635264],"Infested Cobblestone":[2635520],"Infested Cracked Stone Brick":[2635776],"Infested Mossy Stone Brick":[2636032],"Infested Stone":[2636288],"Infested Stone Brick":[2636544],"Invisible Bedrock":[2637312],"Iodine":[2606080],"Iridium":[2606336],"Iron":[2606592],"Iron Bars":[2637824],"Iron Block":[2637568],"Iron Door":[2638080,2638081,2638082,2638083,2638084,2638085,2638086,2638087,2638088,2638089,2638090,2638091,2638092,2638093,2638094,2638095,2638096,2638097,2638098,2638099,2638100,2638101,2638102,2638103,2638104,2638105,2638106,2638107,2638108,2638109,2638110,2638111],"Iron Ore":[2638336],"Iron Trapdoor":[2638592,2638593,2638594,2638595,2638596,2638597,2638598,2638599,2638600,2638601,2638602,2638603,2638604,2638605,2638606,2638607],"Item Frame":[2638848,2638849,2638850,2638851,2638852,2638853,2638856,2638857,2638858,2638859,2638860,2638861],"Jack o'Lantern":[2647296,2647297,2647298,2647299],"Jukebox":[2639104],"Jungle Button":[2639360,2639361,2639362,2639363,2639364,2639365,2639368,2639369,2639370,2639371,2639372,2639373],"Jungle Door":[2639616,2639617,2639618,2639619,2639620,2639621,2639622,2639623,2639624,2639625,2639626,2639627,2639628,2639629,2639630,2639631,2639632,2639633,2639634,2639635,2639636,2639637,2639638,2639639,2639640,2639641,2639642,2639643,2639644,2639645,2639646,2639647],"Jungle Fence":[2639872],"Jungle Fence Gate":[2640128,2640129,2640130,2640131,2640132,2640133,2640134,2640135,2640136,2640137,2640138,2640139,2640140,2640141,2640142,2640143],"Jungle Leaves":[2640384,2640385,2640386,2640387],"Jungle Log":[2640640,2640641,2640642,2640643,2640644,2640645],"Jungle Planks":[2640896],"Jungle Pressure Plate":[2641152,2641153],"Jungle Sapling":[2641408,2641409],"Jungle Sign":[2641664,2641665,2641666,2641667,2641668,2641669,2641670,2641671,2641672,2641673,2641674,2641675,2641676,2641677,2641678,2641679],"Jungle Slab":[2641920,2641921,2641922],"Jungle Stairs":[2642176,2642177,2642178,2642179,2642180,2642181,2642182,2642183],"Jungle Trapdoor":[2642432,2642433,2642434,2642435,2642436,2642437,2642438,2642439,2642440,2642441,2642442,2642443,2642444,2642445,2642446,2642447],"Jungle Wall Sign":[2642688,2642689,2642690,2642691],"Jungle Wood":[2642944,2642945,2642946,2642947,2642948,2642949],"Krypton":[2606848],"Lab Table":[2643200,2643201,2643202,2643203],"Ladder":[2643456,2643457,2643458,2643459],"Lantern":[2643712,2643713],"Lanthanum":[2607104],"Lapis Lazuli Block":[2643968],"Lapis Lazuli Ore":[2644224],"Large Fern":[2644480,2644481],"Lava":[2644736,2644737,2644738,2644739,2644740,2644741,2644742,2644743,2644744,2644745,2644746,2644747,2644748,2644749,2644750,2644751,2644752,2644753,2644754,2644755,2644756,2644757,2644758,2644759,2644760,2644761,2644762,2644763,2644764,2644765,2644766,2644767],"Lava Cauldron":[2732032,2732033,2732034,2732035,2732036,2732037],"Lawrencium":[2607360],"Lead":[2607616],"Lectern":[2644992,2644993,2644994,2644995,2644996,2644997,2644998,2644999],"Legacy Stonecutter":[2645248],"Lever":[2645504,2645505,2645506,2645507,2645508,2645509,2645510,2645511,2645512,2645513,2645514,2645515,2645516,2645517,2645518,2645519],"Light Block":[2703616,2703617,2703618,2703619,2703620,2703621,2703622,2703623,2703624,2703625,2703626,2703627,2703628,2703629,2703630,2703631],"Lightning Rod":[2727680,2727681,2727682,2727683,2727684,2727685],"Lilac":[2646272,2646273],"Lily Pad":[2646784],"Lily of the Valley":[2646528],"Lithium":[2607872],"Livermorium":[2608128],"Loom":[2647552,2647553,2647554,2647555],"Lutetium":[2608384],"Magma Block":[2648064],"Magnesium":[2608640],"Manganese":[2608896],"Mangrove Button":[2716928,2716929,2716930,2716931,2716932,2716933,2716936,2716937,2716938,2716939,2716940,2716941],"Mangrove Door":[2718464,2718465,2718466,2718467,2718468,2718469,2718470,2718471,2718472,2718473,2718474,2718475,2718476,2718477,2718478,2718479,2718480,2718481,2718482,2718483,2718484,2718485,2718486,2718487,2718488,2718489,2718490,2718491,2718492,2718493,2718494,2718495],"Mangrove Fence":[2713088],"Mangrove Fence Gate":[2719232,2719233,2719234,2719235,2719236,2719237,2719238,2719239,2719240,2719241,2719242,2719243,2719244,2719245,2719246,2719247],"Mangrove Leaves":[2735360,2735361,2735362,2735363],"Mangrove Log":[2714624,2714625,2714626,2714627,2714628,2714629],"Mangrove Planks":[2712320],"Mangrove Pressure Plate":[2717696,2717697],"Mangrove Roots":[2733312],"Mangrove Sign":[2720768,2720769,2720770,2720771,2720772,2720773,2720774,2720775,2720776,2720777,2720778,2720779,2720780,2720781,2720782,2720783],"Mangrove Slab":[2713856,2713857,2713858],"Mangrove Stairs":[2720000,2720001,2720002,2720003,2720004,2720005,2720006,2720007],"Mangrove Trapdoor":[2716160,2716161,2716162,2716163,2716164,2716165,2716166,2716167,2716168,2716169,2716170,2716171,2716172,2716173,2716174,2716175],"Mangrove Wall Sign":[2721536,2721537,2721538,2721539],"Mangrove Wood":[2715392,2715393,2715394,2715395,2715396,2715397],"Material Reducer":[2648320,2648321,2648322,2648323],"Meitnerium":[2609152],"Melon Block":[2648576],"Melon Stem":[2648832,2648833,2648834,2648835,2648836,2648837,2648838,2648839],"Mendelevium":[2609408],"Mercury":[2609664],"Mob Head":[2649096,2649097,2649098,2649099,2649100,2649101,2649104,2649105,2649106,2649107,2649108,2649109,2649112,2649113,2649114,2649115,2649116,2649117,2649120,2649121,2649122,2649123,2649124,2649125,2649128,2649129,2649130,2649131,2649132,2649133],"Molybdenum":[2609920],"Monster Spawner":[2649344],"Moscovium":[2610176],"Mossy Cobblestone":[2649600],"Mossy Cobblestone Slab":[2649856,2649857,2649858],"Mossy Cobblestone Stairs":[2650112,2650113,2650114,2650115,2650116,2650117,2650118,2650119],"Mossy Cobblestone Wall":[2650368,2650369,2650370,2650371,2650372,2650373,2650374,2650375,2650376,2650377,2650378,2650379,2650380,2650381,2650382,2650383,2650384,2650385,2650386,2650387,2650388,2650389,2650390,2650391,2650392,2650393,2650394,2650395,2650396,2650397,2650398,2650399,2650400,2650401,2650402,2650403,2650404,2650405,2650406,2650407,2650408,2650409,2650410,2650411,2650412,2650413,2650414,2650415,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650496,2650497,2650498,2650499,2650500,2650501,2650502,2650503,2650504,2650505,2650506,2650507,2650508,2650509,2650510,2650511,2650512,2650513,2650514,2650515,2650516,2650517,2650518,2650519,2650520,2650521,2650522,2650523,2650524,2650525,2650526,2650527,2650528,2650529,2650530,2650531,2650532,2650533,2650534,2650535,2650536,2650537,2650538,2650539,2650540,2650541,2650542,2650543,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576],"Mossy Stone Brick Slab":[2650624,2650625,2650626],"Mossy Stone Brick Stairs":[2650880,2650881,2650882,2650883,2650884,2650885,2650886,2650887],"Mossy Stone Brick Wall":[2651136,2651137,2651138,2651139,2651140,2651141,2651142,2651143,2651144,2651145,2651146,2651147,2651148,2651149,2651150,2651151,2651152,2651153,2651154,2651155,2651156,2651157,2651158,2651159,2651160,2651161,2651162,2651163,2651164,2651165,2651166,2651167,2651168,2651169,2651170,2651171,2651172,2651173,2651174,2651175,2651176,2651177,2651178,2651179,2651180,2651181,2651182,2651183,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651264,2651265,2651266,2651267,2651268,2651269,2651270,2651271,2651272,2651273,2651274,2651275,2651276,2651277,2651278,2651279,2651280,2651281,2651282,2651283,2651284,2651285,2651286,2651287,2651288,2651289,2651290,2651291,2651292,2651293,2651294,2651295,2651296,2651297,2651298,2651299,2651300,2651301,2651302,2651303,2651304,2651305,2651306,2651307,2651308,2651309,2651310,2651311,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344],"Mossy Stone Bricks":[2651392],"Mud":[2725376],"Mud Brick Slab":[2725888,2725889,2725890],"Mud Brick Stairs":[2726144,2726145,2726146,2726147,2726148,2726149,2726150,2726151],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726464,2726465,2726466,2726467,2726468,2726469,2726470,2726471,2726472,2726473,2726474,2726475,2726476,2726477,2726478,2726479,2726480,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726592,2726593,2726594,2726595,2726596,2726597,2726598,2726599,2726600,2726601,2726602,2726603,2726604,2726605,2726606,2726607,2726608],"Mud Bricks":[2725632],"Muddy Mangrove Roots":[2733568,2733569,2733570],"Mushroom Stem":[2651648],"Mycelium":[2651904],"Neodymium":[2610432],"Neon":[2610688],"Neptunium":[2610944],"Nether Brick Fence":[2652160],"Nether Brick Slab":[2652416,2652417,2652418],"Nether Brick Stairs":[2652672,2652673,2652674,2652675,2652676,2652677,2652678,2652679],"Nether Brick Wall":[2652928,2652929,2652930,2652931,2652932,2652933,2652934,2652935,2652936,2652937,2652938,2652939,2652940,2652941,2652942,2652943,2652944,2652945,2652946,2652947,2652948,2652949,2652950,2652951,2652952,2652953,2652954,2652955,2652956,2652957,2652958,2652959,2652960,2652961,2652962,2652963,2652964,2652965,2652966,2652967,2652968,2652969,2652970,2652971,2652972,2652973,2652974,2652975,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653056,2653057,2653058,2653059,2653060,2653061,2653062,2653063,2653064,2653065,2653066,2653067,2653068,2653069,2653070,2653071,2653072,2653073,2653074,2653075,2653076,2653077,2653078,2653079,2653080,2653081,2653082,2653083,2653084,2653085,2653086,2653087,2653088,2653089,2653090,2653091,2653092,2653093,2653094,2653095,2653096,2653097,2653098,2653099,2653100,2653101,2653102,2653103,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136],"Nether Bricks":[2653184],"Nether Gold Ore":[2725120],"Nether Portal":[2653440,2653441],"Nether Quartz Ore":[2653696],"Nether Reactor Core":[2653952],"Nether Wart":[2654208,2654209,2654210,2654211],"Nether Wart Block":[2654464],"Netherite Block":[2731008],"Netherrack":[2654720],"Nickel":[2611200],"Nihonium":[2611456],"Niobium":[2611712],"Nitrogen":[2611968],"Nobelium":[2612224],"Note Block":[2654976],"Oak Button":[2655232,2655233,2655234,2655235,2655236,2655237,2655240,2655241,2655242,2655243,2655244,2655245],"Oak Door":[2655488,2655489,2655490,2655491,2655492,2655493,2655494,2655495,2655496,2655497,2655498,2655499,2655500,2655501,2655502,2655503,2655504,2655505,2655506,2655507,2655508,2655509,2655510,2655511,2655512,2655513,2655514,2655515,2655516,2655517,2655518,2655519],"Oak Fence":[2655744],"Oak Fence Gate":[2656000,2656001,2656002,2656003,2656004,2656005,2656006,2656007,2656008,2656009,2656010,2656011,2656012,2656013,2656014,2656015],"Oak Leaves":[2656256,2656257,2656258,2656259],"Oak Log":[2656512,2656513,2656514,2656515,2656516,2656517],"Oak Planks":[2656768],"Oak Pressure Plate":[2657024,2657025],"Oak Sapling":[2657280,2657281],"Oak Sign":[2657536,2657537,2657538,2657539,2657540,2657541,2657542,2657543,2657544,2657545,2657546,2657547,2657548,2657549,2657550,2657551],"Oak Slab":[2657792,2657793,2657794],"Oak Stairs":[2658048,2658049,2658050,2658051,2658052,2658053,2658054,2658055],"Oak Trapdoor":[2658304,2658305,2658306,2658307,2658308,2658309,2658310,2658311,2658312,2658313,2658314,2658315,2658316,2658317,2658318,2658319],"Oak Wall Sign":[2658560,2658561,2658562,2658563],"Oak Wood":[2658816,2658817,2658818,2658819,2658820,2658821],"Obsidian":[2659072],"Oganesson":[2612480],"Orange Tulip":[2659584],"Osmium":[2612736],"Oxeye Daisy":[2659840],"Oxygen":[2612992],"Packed Ice":[2660096],"Packed Mud":[2726656],"Palladium":[2613248],"Peony":[2660352,2660353],"Phosphorus":[2613504],"Pink Tulip":[2660864],"Platinum":[2613760],"Plutonium":[2614016],"Podzol":[2661120],"Polished Andesite":[2661376],"Polished Andesite Slab":[2661632,2661633,2661634],"Polished Andesite Stairs":[2661888,2661889,2661890,2661891,2661892,2661893,2661894,2661895],"Polished Basalt":[2699008,2699009,2699010],"Polished Blackstone":[2700544],"Polished Blackstone Brick Slab":[2702592,2702593,2702594],"Polished Blackstone Brick Stairs":[2702848,2702849,2702850,2702851,2702852,2702853,2702854,2702855],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703168,2703169,2703170,2703171,2703172,2703173,2703174,2703175,2703176,2703177,2703178,2703179,2703180,2703181,2703182,2703183,2703184,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703296,2703297,2703298,2703299,2703300,2703301,2703302,2703303,2703304,2703305,2703306,2703307,2703308,2703309,2703310,2703311,2703312],"Polished Blackstone Bricks":[2702336],"Polished Blackstone Button":[2700800,2700801,2700802,2700803,2700804,2700805,2700808,2700809,2700810,2700811,2700812,2700813],"Polished Blackstone Pressure Plate":[2701056,2701057],"Polished Blackstone Slab":[2701312,2701313,2701314],"Polished Blackstone Stairs":[2701568,2701569,2701570,2701571,2701572,2701573,2701574,2701575],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701888,2701889,2701890,2701891,2701892,2701893,2701894,2701895,2701896,2701897,2701898,2701899,2701900,2701901,2701902,2701903,2701904,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702016,2702017,2702018,2702019,2702020,2702021,2702022,2702023,2702024,2702025,2702026,2702027,2702028,2702029,2702030,2702031,2702032],"Polished Deepslate":[2708736],"Polished Deepslate Slab":[2708992,2708993,2708994],"Polished Deepslate Stairs":[2709248,2709249,2709250,2709251,2709252,2709253,2709254,2709255],"Polished Deepslate Wall":[2709504,2709505,2709506,2709507,2709508,2709509,2709510,2709511,2709512,2709513,2709514,2709515,2709516,2709517,2709518,2709519,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709536,2709537,2709538,2709539,2709540,2709541,2709542,2709543,2709544,2709545,2709546,2709547,2709548,2709549,2709550,2709551,2709552,2709553,2709554,2709555,2709556,2709557,2709558,2709559,2709560,2709561,2709562,2709563,2709564,2709565,2709566,2709567,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709632,2709633,2709634,2709635,2709636,2709637,2709638,2709639,2709640,2709641,2709642,2709643,2709644,2709645,2709646,2709647,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709664,2709665,2709666,2709667,2709668,2709669,2709670,2709671,2709672,2709673,2709674,2709675,2709676,2709677,2709678,2709679,2709680,2709681,2709682,2709683,2709684,2709685,2709686,2709687,2709688,2709689,2709690,2709691,2709692,2709693,2709694,2709695,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712],"Polished Diorite":[2662144],"Polished Diorite Slab":[2662400,2662401,2662402],"Polished Diorite Stairs":[2662656,2662657,2662658,2662659,2662660,2662661,2662662,2662663],"Polished Granite":[2662912],"Polished Granite Slab":[2663168,2663169,2663170],"Polished Granite Stairs":[2663424,2663425,2663426,2663427,2663428,2663429,2663430,2663431],"Polonium":[2614272],"Poppy":[2663680],"Potassium":[2614528],"Potato Block":[2663936,2663937,2663938,2663939,2663940,2663941,2663942,2663943],"Potion Cauldron":[2732288,2732289,2732290,2732291,2732292,2732293],"Powered Rail":[2664192,2664193,2664194,2664195,2664196,2664197,2664200,2664201,2664202,2664203,2664204,2664205],"Praseodymium":[2614784],"Prismarine":[2664448],"Prismarine Bricks":[2664704],"Prismarine Bricks Slab":[2664960,2664961,2664962],"Prismarine Bricks Stairs":[2665216,2665217,2665218,2665219,2665220,2665221,2665222,2665223],"Prismarine Slab":[2665472,2665473,2665474],"Prismarine Stairs":[2665728,2665729,2665730,2665731,2665732,2665733,2665734,2665735],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666048,2666049,2666050,2666051,2666052,2666053,2666054,2666055,2666056,2666057,2666058,2666059,2666060,2666061,2666062,2666063,2666064,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666176,2666177,2666178,2666179,2666180,2666181,2666182,2666183,2666184,2666185,2666186,2666187,2666188,2666189,2666190,2666191,2666192],"Promethium":[2615040],"Protactinium":[2615296],"Pumpkin":[2666240],"Pumpkin Stem":[2666496,2666497,2666498,2666499,2666500,2666501,2666502,2666503],"Purple Torch":[2667009,2667010,2667011,2667012,2667013],"Purpur Block":[2667264],"Purpur Pillar":[2667520,2667521,2667522],"Purpur Slab":[2667776,2667777,2667778],"Purpur Stairs":[2668032,2668033,2668034,2668035,2668036,2668037,2668038,2668039],"Quartz Block":[2668288],"Quartz Bricks":[2709760],"Quartz Pillar":[2668544,2668545,2668546],"Quartz Slab":[2668800,2668801,2668802],"Quartz Stairs":[2669056,2669057,2669058,2669059,2669060,2669061,2669062,2669063],"Radium":[2615552],"Radon":[2615808],"Rail":[2669312,2669313,2669314,2669315,2669316,2669317,2669318,2669319,2669320,2669321],"Raw Copper Block":[2703872],"Raw Gold Block":[2704128],"Raw Iron Block":[2704384],"Red Mushroom":[2669824],"Red Mushroom Block":[2670080,2670081,2670082,2670083,2670084,2670085,2670086,2670087,2670088,2670089,2670090],"Red Nether Brick Slab":[2670336,2670337,2670338],"Red Nether Brick Stairs":[2670592,2670593,2670594,2670595,2670596,2670597,2670598,2670599],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670864,2670865,2670866,2670867,2670868,2670869,2670870,2670871,2670872,2670873,2670874,2670875,2670876,2670877,2670878,2670879,2670880,2670881,2670882,2670883,2670884,2670885,2670886,2670887,2670888,2670889,2670890,2670891,2670892,2670893,2670894,2670895,2670896,2670897,2670898,2670899,2670900,2670901,2670902,2670903,2670904,2670905,2670906,2670907,2670908,2670909,2670910,2670911,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670992,2670993,2670994,2670995,2670996,2670997,2670998,2670999,2671000,2671001,2671002,2671003,2671004,2671005,2671006,2671007,2671008,2671009,2671010,2671011,2671012,2671013,2671014,2671015,2671016,2671017,2671018,2671019,2671020,2671021,2671022,2671023,2671024,2671025,2671026,2671027,2671028,2671029,2671030,2671031,2671032,2671033,2671034,2671035,2671036,2671037,2671038,2671039,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056],"Red Nether Bricks":[2671104],"Red Sand":[2671360],"Red Sandstone":[2671616],"Red Sandstone Slab":[2671872,2671873,2671874],"Red Sandstone Stairs":[2672128,2672129,2672130,2672131,2672132,2672133,2672134,2672135],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672400,2672401,2672402,2672403,2672404,2672405,2672406,2672407,2672408,2672409,2672410,2672411,2672412,2672413,2672414,2672415,2672416,2672417,2672418,2672419,2672420,2672421,2672422,2672423,2672424,2672425,2672426,2672427,2672428,2672429,2672430,2672431,2672432,2672433,2672434,2672435,2672436,2672437,2672438,2672439,2672440,2672441,2672442,2672443,2672444,2672445,2672446,2672447,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672528,2672529,2672530,2672531,2672532,2672533,2672534,2672535,2672536,2672537,2672538,2672539,2672540,2672541,2672542,2672543,2672544,2672545,2672546,2672547,2672548,2672549,2672550,2672551,2672552,2672553,2672554,2672555,2672556,2672557,2672558,2672559,2672560,2672561,2672562,2672563,2672564,2672565,2672566,2672567,2672568,2672569,2672570,2672571,2672572,2672573,2672574,2672575,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592],"Red Torch":[2672641,2672642,2672643,2672644,2672645],"Red Tulip":[2672896],"Redstone":[2674688,2674689,2674690,2674691,2674692,2674693,2674694,2674695,2674696,2674697,2674698,2674699,2674700,2674701,2674702,2674703],"Redstone Block":[2673152],"Redstone Comparator":[2673408,2673409,2673410,2673411,2673412,2673413,2673414,2673415,2673416,2673417,2673418,2673419,2673420,2673421,2673422,2673423],"Redstone Lamp":[2673664,2673665],"Redstone Ore":[2673920,2673921],"Redstone Repeater":[2674176,2674177,2674178,2674179,2674180,2674181,2674182,2674183,2674184,2674185,2674186,2674187,2674188,2674189,2674190,2674191,2674192,2674193,2674194,2674195,2674196,2674197,2674198,2674199,2674200,2674201,2674202,2674203,2674204,2674205,2674206,2674207],"Redstone Torch":[2674433,2674434,2674435,2674436,2674437,2674441,2674442,2674443,2674444,2674445],"Reinforced Deepslate":[2736128],"Rhenium":[2616064],"Rhodium":[2616320],"Roentgenium":[2616576],"Rose Bush":[2675200,2675201],"Rubidium":[2616832],"Ruthenium":[2617088],"Rutherfordium":[2617344],"Samarium":[2617600],"Sand":[2675456],"Sandstone":[2675712],"Sandstone Slab":[2675968,2675969,2675970],"Sandstone Stairs":[2676224,2676225,2676226,2676227,2676228,2676229,2676230,2676231],"Sandstone Wall":[2676480,2676481,2676482,2676483,2676484,2676485,2676486,2676487,2676488,2676489,2676490,2676491,2676492,2676493,2676494,2676495,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676512,2676513,2676514,2676515,2676516,2676517,2676518,2676519,2676520,2676521,2676522,2676523,2676524,2676525,2676526,2676527,2676528,2676529,2676530,2676531,2676532,2676533,2676534,2676535,2676536,2676537,2676538,2676539,2676540,2676541,2676542,2676543,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676608,2676609,2676610,2676611,2676612,2676613,2676614,2676615,2676616,2676617,2676618,2676619,2676620,2676621,2676622,2676623,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676640,2676641,2676642,2676643,2676644,2676645,2676646,2676647,2676648,2676649,2676650,2676651,2676652,2676653,2676654,2676655,2676656,2676657,2676658,2676659,2676660,2676661,2676662,2676663,2676664,2676665,2676666,2676667,2676668,2676669,2676670,2676671,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688],"Scandium":[2617856],"Sculk":[2734848],"Sea Lantern":[2676736],"Sea Pickle":[2676992,2676993,2676994,2676995,2676996,2676997,2676998,2676999],"Seaborgium":[2618112],"Selenium":[2618368],"Shroomlight":[2712064],"Shulker Box":[2677248],"Silicon":[2618624],"Silver":[2618880],"Slime Block":[2677504],"Smithing Table":[2730752],"Smoker":[2677760,2677761,2677762,2677763,2677764,2677765,2677766,2677767],"Smooth Basalt":[2699264],"Smooth Quartz Block":[2678016],"Smooth Quartz Slab":[2678272,2678273,2678274],"Smooth Quartz Stairs":[2678528,2678529,2678530,2678531,2678532,2678533,2678534,2678535],"Smooth Red Sandstone":[2678784],"Smooth Red Sandstone Slab":[2679040,2679041,2679042],"Smooth Red Sandstone Stairs":[2679296,2679297,2679298,2679299,2679300,2679301,2679302,2679303],"Smooth Sandstone":[2679552],"Smooth Sandstone Slab":[2679808,2679809,2679810],"Smooth Sandstone Stairs":[2680064,2680065,2680066,2680067,2680068,2680069,2680070,2680071],"Smooth Stone":[2680320],"Smooth Stone Slab":[2680576,2680577,2680578],"Snow Block":[2680832],"Snow Layer":[2681088,2681089,2681090,2681091,2681092,2681093,2681094,2681095],"Sodium":[2619136],"Soul Fire":[2711808],"Soul Lantern":[2711296,2711297],"Soul Sand":[2681344],"Soul Soil":[2711552],"Soul Torch":[2711041,2711042,2711043,2711044,2711045],"Sponge":[2681600,2681601],"Spore Blossom":[2731264],"Spruce Button":[2681856,2681857,2681858,2681859,2681860,2681861,2681864,2681865,2681866,2681867,2681868,2681869],"Spruce Door":[2682112,2682113,2682114,2682115,2682116,2682117,2682118,2682119,2682120,2682121,2682122,2682123,2682124,2682125,2682126,2682127,2682128,2682129,2682130,2682131,2682132,2682133,2682134,2682135,2682136,2682137,2682138,2682139,2682140,2682141,2682142,2682143],"Spruce Fence":[2682368],"Spruce Fence Gate":[2682624,2682625,2682626,2682627,2682628,2682629,2682630,2682631,2682632,2682633,2682634,2682635,2682636,2682637,2682638,2682639],"Spruce Leaves":[2682880,2682881,2682882,2682883],"Spruce Log":[2683136,2683137,2683138,2683139,2683140,2683141],"Spruce Planks":[2683392],"Spruce Pressure Plate":[2683648,2683649],"Spruce Sapling":[2683904,2683905],"Spruce Sign":[2684160,2684161,2684162,2684163,2684164,2684165,2684166,2684167,2684168,2684169,2684170,2684171,2684172,2684173,2684174,2684175],"Spruce Slab":[2684416,2684417,2684418],"Spruce Stairs":[2684672,2684673,2684674,2684675,2684676,2684677,2684678,2684679],"Spruce Trapdoor":[2684928,2684929,2684930,2684931,2684932,2684933,2684934,2684935,2684936,2684937,2684938,2684939,2684940,2684941,2684942,2684943],"Spruce Wall Sign":[2685184,2685185,2685186,2685187],"Spruce Wood":[2685440,2685441,2685442,2685443,2685444,2685445],"Stained Clay":[2685696,2685697,2685698,2685699,2685700,2685701,2685702,2685703,2685704,2685705,2685706,2685707,2685708,2685709,2685710,2685711],"Stained Glass":[2685952,2685953,2685954,2685955,2685956,2685957,2685958,2685959,2685960,2685961,2685962,2685963,2685964,2685965,2685966,2685967],"Stained Glass Pane":[2686208,2686209,2686210,2686211,2686212,2686213,2686214,2686215,2686216,2686217,2686218,2686219,2686220,2686221,2686222,2686223],"Stained Hardened Glass":[2686464,2686465,2686466,2686467,2686468,2686469,2686470,2686471,2686472,2686473,2686474,2686475,2686476,2686477,2686478,2686479],"Stained Hardened Glass Pane":[2686720,2686721,2686722,2686723,2686724,2686725,2686726,2686727,2686728,2686729,2686730,2686731,2686732,2686733,2686734,2686735],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687234],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687824,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687952],"Stone Bricks":[2688000],"Stone Button":[2688256,2688257,2688258,2688259,2688260,2688261,2688264,2688265,2688266,2688267,2688268,2688269],"Stone Pressure Plate":[2688512,2688513],"Stone Slab":[2688768,2688769,2688770],"Stone Stairs":[2689024,2689025,2689026,2689027,2689028,2689029,2689030,2689031],"Stonecutter":[2689280,2689281,2689282,2689283],"Strontium":[2619392],"Sugarcane":[2692608,2692609,2692610,2692611,2692612,2692613,2692614,2692615,2692616,2692617,2692618,2692619,2692620,2692621,2692622,2692623],"Sulfur":[2619648],"Sunflower":[2692864,2692865],"Sweet Berry Bush":[2693120,2693121,2693122,2693123],"TNT":[2693632,2693633,2693634,2693635],"Tall Grass":[2693376],"Tantalum":[2619904],"Technetium":[2620160],"Tellurium":[2620416],"Tennessine":[2620672],"Terbium":[2620928],"Thallium":[2621184],"Thorium":[2621440],"Thulium":[2621696],"Tin":[2621952],"Tinted Glass":[2722304],"Titanium":[2622208],"Torch":[2693889,2693890,2693891,2693892,2693893],"Trapped Chest":[2694144,2694145,2694146,2694147],"Tripwire":[2694400,2694401,2694402,2694403,2694404,2694405,2694406,2694407,2694408,2694409,2694410,2694411,2694412,2694413,2694414,2694415],"Tripwire Hook":[2694656,2694657,2694658,2694659,2694660,2694661,2694662,2694663,2694664,2694665,2694666,2694667,2694668,2694669,2694670,2694671],"Tuff":[2710784],"Tungsten":[2622464],"Twisting Vines":[2734080,2734081,2734082,2734083,2734084,2734085,2734086,2734087,2734088,2734089,2734090,2734091,2734092,2734093,2734094,2734095,2734096,2734097,2734098,2734099,2734100,2734101,2734102,2734103,2734104,2734105],"Underwater Torch":[2694913,2694914,2694915,2694916,2694917],"Uranium":[2622720],"Vanadium":[2622976],"Vines":[2695168,2695169,2695170,2695171,2695172,2695173,2695174,2695175,2695176,2695177,2695178,2695179,2695180,2695181,2695182,2695183],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695684,2695688,2695689,2695690,2695691,2695692,2695696,2695697,2695698,2695699,2695700,2695704,2695705,2695706,2695707,2695708,2695712,2695713,2695714,2695715,2695716,2695720,2695721,2695722,2695723,2695724,2695728,2695729,2695730,2695731,2695732,2695736,2695737,2695738,2695739,2695740],"Warped Button":[2717440,2717441,2717442,2717443,2717444,2717445,2717448,2717449,2717450,2717451,2717452,2717453],"Warped Door":[2718976,2718977,2718978,2718979,2718980,2718981,2718982,2718983,2718984,2718985,2718986,2718987,2718988,2718989,2718990,2718991,2718992,2718993,2718994,2718995,2718996,2718997,2718998,2718999,2719000,2719001,2719002,2719003,2719004,2719005,2719006,2719007],"Warped Fence":[2713600],"Warped Fence Gate":[2719744,2719745,2719746,2719747,2719748,2719749,2719750,2719751,2719752,2719753,2719754,2719755,2719756,2719757,2719758,2719759],"Warped Hyphae":[2715904,2715905,2715906,2715907,2715908,2715909],"Warped Planks":[2712832],"Warped Pressure Plate":[2718208,2718209],"Warped Sign":[2721280,2721281,2721282,2721283,2721284,2721285,2721286,2721287,2721288,2721289,2721290,2721291,2721292,2721293,2721294,2721295],"Warped Slab":[2714368,2714369,2714370],"Warped Stairs":[2720512,2720513,2720514,2720515,2720516,2720517,2720518,2720519],"Warped Stem":[2715136,2715137,2715138,2715139,2715140,2715141],"Warped Trapdoor":[2716672,2716673,2716674,2716675,2716676,2716677,2716678,2716679,2716680,2716681,2716682,2716683,2716684,2716685,2716686,2716687],"Warped Wall Sign":[2722048,2722049,2722050,2722051],"Warped Wart Block":[2726912],"Water":[2695936,2695937,2695938,2695939,2695940,2695941,2695942,2695943,2695944,2695945,2695946,2695947,2695948,2695949,2695950,2695951,2695952,2695953,2695954,2695955,2695956,2695957,2695958,2695959,2695960,2695961,2695962,2695963,2695964,2695965,2695966,2695967],"Water Cauldron":[2731776,2731777,2731778,2731779,2731780,2731781],"Weeping Vines":[2734336,2734337,2734338,2734339,2734340,2734341,2734342,2734343,2734344,2734345,2734346,2734347,2734348,2734349,2734350,2734351,2734352,2734353,2734354,2734355,2734356,2734357,2734358,2734359,2734360,2734361],"Weighted Pressure Plate Heavy":[2696192,2696193,2696194,2696195,2696196,2696197,2696198,2696199,2696200,2696201,2696202,2696203,2696204,2696205,2696206,2696207],"Weighted Pressure Plate Light":[2696448,2696449,2696450,2696451,2696452,2696453,2696454,2696455,2696456,2696457,2696458,2696459,2696460,2696461,2696462,2696463],"Wheat Block":[2696704,2696705,2696706,2696707,2696708,2696709,2696710,2696711],"White Tulip":[2697216],"Wither Rose":[2729984],"Wool":[2697472,2697473,2697474,2697475,2697476,2697477,2697478,2697479,2697480,2697481,2697482,2697483,2697484,2697485,2697486,2697487],"Xenon":[2623232],"Ytterbium":[2623488],"Yttrium":[2623744],"Zinc":[2624256],"Zirconium":[2624512],"ate!upd":[2637056],"reserved6":[2674944],"update!":[2636800]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648936,2648937,2648938,2648939,2648940,2648941,2648942,2648943],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649156,2649157,2649158,2649159,2649160,2649161,2649164,2649165,2649166,2649167,2649184,2649185,2649188,2649189,2649190,2649191,2649200,2649201,2649204,2649205,2649206,2649207,2649208,2649209,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666672,2666673,2666674,2666675,2666676,2666677,2666678,2666679],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From cc77f18ff0e7f1472055d546f2fa01669d91a8da Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 May 2023 17:38:39 +0100 Subject: [PATCH 1045/1858] =?UTF-8?q?=C3=82Block:=20added=20a=20TODO=20for?= =?UTF-8?q?=20getStateId()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/Block.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index 3ce2dc188e..29990bd1c7 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -141,6 +141,11 @@ class Block{ */ public function getStateId() : int{ $typeId = $this->getTypeId(); + //TODO: this XOR mask improves hashtable distribution, but it's only effective if the number of unique block + //type IDs is larger than the number of available state data bits. We should probably hash (e.g. using xxhash) + //the type ID to create a better mask. + //Alternatively, we could hash the whole state ID, but this is currently problematic, since we currently need + //to be able to recover the state data from the state ID because of UnknownBlock. return ($typeId << self::INTERNAL_STATE_DATA_BITS) | ($this->encodeFullState() ^ ($typeId & self::INTERNAL_STATE_DATA_MASK)); } From edafe9d21fd2b72b6baa6cb2c879abd6a263a446 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2023 14:01:21 +0100 Subject: [PATCH 1046/1858] Entity: Rename and document isImmobile() and friends while I could implement server-side ability to disable entity movement, I don't think that's particularly useful. However, the intended function of this (disabling client sided AI) is useful, so it makes more sense to rename it to match its functionality, rather than changing its functionality to match the name. closes #3130 --- src/entity/Entity.php | 26 +++++++++++++++------ src/network/mcpe/NetworkSession.php | 4 ++-- src/world/particle/FloatingTextParticle.php | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 5fd0a433c7..cb7d140da8 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -170,7 +170,7 @@ abstract class Entity{ protected bool $canClimb = false; protected bool $canClimbWalls = false; - protected bool $immobile = false; + protected bool $noClientPredictions = false; protected bool $invisible = false; protected bool $silent = false; @@ -314,12 +314,24 @@ abstract class Entity{ $this->networkPropertiesDirty = true; } - public function isImmobile() : bool{ - return $this->immobile; + /** + * Returns whether clients may predict this entity's behaviour and movement. Used for things like water movement, + * burning, and movement smoothing (interpolation). + */ + public function hasNoClientPredictions() : bool{ + return $this->noClientPredictions; } - public function setImmobile(bool $value = true) : void{ - $this->immobile = $value; + /** + * Things such as movement in water, burning, etc. may be predicted by the client. This is sometimes not desirable, + * since server-side logic may differ from client-side prediction. However, things like movement smoothing + * (interpolation) are also controlled by this, so it should be used with care. + * + * Setting this flag will also disable player movement inputs, but this should not be relied on, as cheat clients + * will be able to bypass it. + */ + public function setNoClientPredictions(bool $value = true) : void{ + $this->noClientPredictions = $value; $this->networkPropertiesDirty = true; } @@ -730,7 +742,7 @@ abstract class Entity{ $wasStill = $this->lastMotion->lengthSquared() == 0.0; if($wasStill !== $still){ //TODO: hack for client-side AI interference: prevent client sided movement when motion is 0 - $this->setImmobile($still); + $this->setNoClientPredictions($still); } if($teleport || $diffPosition > 0.0001 || $diffRotation > 1.0 || (!$wasStill && $still)){ @@ -1651,7 +1663,7 @@ abstract class Entity{ $properties->setGenericFlag(EntityMetadataFlags::CAN_CLIMB, $this->canClimb); $properties->setGenericFlag(EntityMetadataFlags::CAN_SHOW_NAMETAG, $this->nameTagVisible); $properties->setGenericFlag(EntityMetadataFlags::HAS_COLLISION, true); - $properties->setGenericFlag(EntityMetadataFlags::IMMOBILE, $this->immobile); + $properties->setGenericFlag(EntityMetadataFlags::NO_AI, $this->noClientPredictions); $properties->setGenericFlag(EntityMetadataFlags::INVISIBLE, $this->invisible); $properties->setGenericFlag(EntityMetadataFlags::SILENT, $this->silent); $properties->setGenericFlag(EntityMetadataFlags::ONFIRE, $this->isOnFire()); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 2a8505056a..9053dd6b63 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -809,7 +809,7 @@ class NetworkSession{ private function beginSpawnSequence() : void{ $this->setHandler(new PreSpawnPacketHandler($this->server, $this->player, $this, $this->invManager)); - $this->player->setImmobile(); //TODO: HACK: fix client-side falling pre-spawn + $this->player->setNoClientPredictions(); //TODO: HACK: fix client-side falling pre-spawn $this->logger->debug("Waiting for chunk radius request"); } @@ -824,7 +824,7 @@ class NetworkSession{ private function onClientSpawnResponse() : void{ $this->logger->debug("Received spawn response, entering in-game phase"); - $this->player->setImmobile(false); //TODO: HACK: we set this during the spawn sequence to prevent the client sending junk movements + $this->player->setNoClientPredictions(false); //TODO: HACK: we set this during the spawn sequence to prevent the client sending junk movements $this->player->doFirstSpawn(); $this->forceAsyncCompression = false; $this->setHandler(new InGamePacketHandler($this->player, $this, $this->invManager)); diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index e8220d1908..180bb4a412 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -87,7 +87,7 @@ class FloatingTextParticle implements Particle{ $name = $this->title . ($this->text !== "" ? "\n" . $this->text : ""); $actorFlags = ( - 1 << EntityMetadataFlags::IMMOBILE + 1 << EntityMetadataFlags::NO_AI ); $actorMetadata = [ EntityMetadataProperties::FLAGS => new LongMetadataProperty($actorFlags), From bdb0ed0701e4d20b9909e55d964bdcf0d5fd16dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2023 14:52:28 +0100 Subject: [PATCH 1047/1858] Consistently use 'mob head' terminology in the API previously, we were sometimes using 'mob head' and other times 'skull', sometimes even within the same file. --- build/generate-runtime-enum-serializers.php | 4 +-- src/block/{Skull.php => MobHead.php} | 28 +++++++-------- src/block/VanillaBlocks.php | 6 ++-- src/block/tile/{Skull.php => MobHead.php} | 36 +++++++++---------- src/block/tile/TileFactory.php | 2 +- .../utils/{SkullType.php => MobHeadType.php} | 32 ++++++++--------- .../convert/BlockObjectToStateSerializer.php | 4 +-- .../ItemSerializerDeserializerRegistrar.php | 12 +++---- src/data/runtime/RuntimeEnumDescriber.php | 4 +-- .../runtime/RuntimeEnumDeserializerTrait.php | 24 ++++++------- .../runtime/RuntimeEnumSerializerTrait.php | 24 ++++++------- .../RuntimeEnumSizeCalculatorTrait.php | 8 ++--- src/item/StringToItemParser.php | 16 ++++----- tests/phpstan/configs/actual-problems.neon | 8 ++--- .../BlockSerializerDeserializerTest.php | 6 ++-- 15 files changed, 107 insertions(+), 107 deletions(-) rename src/block/{Skull.php => MobHead.php} (85%) rename src/block/tile/{Skull.php => MobHead.php} (69%) rename src/block/utils/{SkullType.php => MobHeadType.php} (71%) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index db1d384ca8..1273e26f82 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -30,8 +30,8 @@ use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; +use pocketmine\block\utils\MobHeadType; use pocketmine\block\utils\MushroomBlockType; -use pocketmine\block\utils\SkullType; use pocketmine\block\utils\SlabType; use pocketmine\item\MedicineType; use pocketmine\item\PotionType; @@ -150,7 +150,7 @@ $enumsUsed = [ LeverFacing::getAll(), MedicineType::getAll(), MushroomBlockType::getAll(), - SkullType::getAll(), + MobHeadType::getAll(), SlabType::getAll(), SuspiciousStewType::getAll(), PotionType::getAll() diff --git a/src/block/Skull.php b/src/block/MobHead.php similarity index 85% rename from src/block/Skull.php rename to src/block/MobHead.php index 6566da733f..1b3f2d88fa 100644 --- a/src/block/Skull.php +++ b/src/block/MobHead.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\tile\Skull as TileSkull; -use pocketmine\block\utils\SkullType; +use pocketmine\block\tile\MobHead as TileMobHead; +use pocketmine\block\utils\MobHeadType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -35,22 +35,22 @@ use pocketmine\world\BlockTransaction; use function assert; use function floor; -class Skull extends Flowable{ +class MobHead extends Flowable{ public const MIN_ROTATION = 0; public const MAX_ROTATION = 15; - protected SkullType $skullType; + protected MobHeadType $mobHeadType; protected int $facing = Facing::NORTH; protected int $rotation = self::MIN_ROTATION; //TODO: split this into floor skull and wall skull handling public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->skullType = SkullType::SKELETON(); //TODO: this should be a parameter + $this->mobHeadType = MobHeadType::SKELETON(); //TODO: this should be a parameter parent::__construct($idInfo, $name, $typeInfo); } public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->skullType($this->skullType); + $w->mobHeadType($this->mobHeadType); } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ @@ -60,8 +60,8 @@ class Skull extends Flowable{ public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); - if($tile instanceof TileSkull){ - $this->skullType = $tile->getSkullType(); + if($tile instanceof TileMobHead){ + $this->mobHeadType = $tile->getMobHeadType(); $this->rotation = $tile->getRotation(); } @@ -72,18 +72,18 @@ class Skull extends Flowable{ parent::writeStateToWorld(); //extra block properties storage hack $tile = $this->position->getWorld()->getTile($this->position); - assert($tile instanceof TileSkull); + assert($tile instanceof TileMobHead); $tile->setRotation($this->rotation); - $tile->setSkullType($this->skullType); + $tile->setMobHeadType($this->mobHeadType); } - public function getSkullType() : SkullType{ - return $this->skullType; + public function getMobHeadType() : MobHeadType{ + return $this->mobHeadType; } /** @return $this */ - public function setSkullType(SkullType $skullType) : self{ - $this->skullType = $skullType; + public function setMobHeadType(MobHeadType $mobHeadType) : self{ + $this->mobHeadType = $mobHeadType; return $this; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index eb909ab92e..ef2ad7c6e1 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -48,11 +48,11 @@ use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\tile\ItemFrame as TileItemFrame; use pocketmine\block\tile\Jukebox as TileJukebox; use pocketmine\block\tile\Lectern as TileLectern; +use pocketmine\block\tile\MobHead as TileMobHead; use pocketmine\block\tile\MonsterSpawner as TileMonsterSpawner; use pocketmine\block\tile\NormalFurnace as TileNormalFurnace; use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; -use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SaplingType; @@ -503,7 +503,7 @@ use function mb_strtolower; * @method static ChemistryTable MATERIAL_REDUCER() * @method static Melon MELON() * @method static MelonStem MELON_STEM() - * @method static Skull MOB_HEAD() + * @method static MobHead MOB_HEAD() * @method static MonsterSpawner MONSTER_SPAWNER() * @method static Opaque MOSSY_COBBLESTONE() * @method static Slab MOSSY_COBBLESTONE_SLAB() @@ -981,7 +981,7 @@ final class VanillaBlocks{ self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new Info(new BreakInfo(0.3)))); self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); - self::register("mob_head", new Skull(new BID(Ids::MOB_HEAD, TileSkull::class), "Mob Head", new Info(new BreakInfo(1.0)))); + self::register("mob_head", new MobHead(new BID(Ids::MOB_HEAD, TileMobHead::class), "Mob Head", new Info(new BreakInfo(1.0)))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", new Info(BreakInfo::instant()))); self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD())))); self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD())))); diff --git a/src/block/tile/Skull.php b/src/block/tile/MobHead.php similarity index 69% rename from src/block/tile/Skull.php rename to src/block/tile/MobHead.php index 92ca7af690..35a82e8347 100644 --- a/src/block/tile/Skull.php +++ b/src/block/tile/MobHead.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block\tile; -use pocketmine\block\utils\SkullType; +use pocketmine\block\utils\MobHeadType; use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; @@ -31,60 +31,60 @@ use pocketmine\world\World; /** * @deprecated - * @see \pocketmine\block\Skull + * @see \pocketmine\block\MobHead */ -class Skull extends Spawnable{ +class MobHead extends Spawnable{ private const TAG_SKULL_TYPE = "SkullType"; //TAG_Byte private const TAG_ROT = "Rot"; //TAG_Byte private const TAG_MOUTH_MOVING = "MouthMoving"; //TAG_Byte private const TAG_MOUTH_TICK_COUNT = "MouthTickCount"; //TAG_Int - private SkullType $skullType; - private int $skullRotation = 0; + private MobHeadType $mobHeadType; + private int $rotation = 0; public function __construct(World $world, Vector3 $pos){ - $this->skullType = SkullType::SKELETON(); + $this->mobHeadType = MobHeadType::SKELETON(); parent::__construct($world, $pos); } public function readSaveData(CompoundTag $nbt) : void{ if(($skullTypeTag = $nbt->getTag(self::TAG_SKULL_TYPE)) instanceof ByteTag){ try{ - $this->skullType = SkullType::fromMagicNumber($skullTypeTag->getValue()); + $this->mobHeadType = MobHeadType::fromMagicNumber($skullTypeTag->getValue()); }catch(\InvalidArgumentException $e){ //bad data, drop it } } $rotation = $nbt->getByte(self::TAG_ROT, 0); if($rotation >= 0 && $rotation <= 15){ - $this->skullRotation = $rotation; + $this->rotation = $rotation; } } protected function writeSaveData(CompoundTag $nbt) : void{ - $nbt->setByte(self::TAG_SKULL_TYPE, $this->skullType->getMagicNumber()); - $nbt->setByte(self::TAG_ROT, $this->skullRotation); + $nbt->setByte(self::TAG_SKULL_TYPE, $this->mobHeadType->getMagicNumber()); + $nbt->setByte(self::TAG_ROT, $this->rotation); } - public function setSkullType(SkullType $type) : void{ - $this->skullType = $type; + public function setMobHeadType(MobHeadType $type) : void{ + $this->mobHeadType = $type; } - public function getSkullType() : SkullType{ - return $this->skullType; + public function getMobHeadType() : MobHeadType{ + return $this->mobHeadType; } public function getRotation() : int{ - return $this->skullRotation; + return $this->rotation; } public function setRotation(int $rotation) : void{ - $this->skullRotation = $rotation; + $this->rotation = $rotation; } protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ - $nbt->setByte(self::TAG_SKULL_TYPE, $this->skullType->getMagicNumber()); - $nbt->setByte(self::TAG_ROT, $this->skullRotation); + $nbt->setByte(self::TAG_SKULL_TYPE, $this->mobHeadType->getMagicNumber()); + $nbt->setByte(self::TAG_ROT, $this->rotation); } } diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index e59ff2ab2b..b3abb1315a 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -75,7 +75,7 @@ final class TileFactory{ $this->register(Sign::class, ["Sign", "minecraft:sign"]); $this->register(Smoker::class, ["Smoker", "minecraft:smoker"]); $this->register(SporeBlossom::class, ["SporeBlossom", "minecraft:spore_blossom"]); - $this->register(Skull::class, ["Skull", "minecraft:skull"]); + $this->register(MobHead::class, ["Skull", "minecraft:skull"]); $this->register(GlowingItemFrame::class, ["GlowItemFrame"]); //TODO: Campfire diff --git a/src/block/utils/SkullType.php b/src/block/utils/MobHeadType.php similarity index 71% rename from src/block/utils/SkullType.php rename to src/block/utils/MobHeadType.php index c2031cde33..3259a0757c 100644 --- a/src/block/utils/SkullType.php +++ b/src/block/utils/MobHeadType.php @@ -31,34 +31,34 @@ use pocketmine\utils\EnumTrait; * @see build/generate-registry-annotations.php * @generate-registry-docblock * - * @method static SkullType CREEPER() - * @method static SkullType DRAGON() - * @method static SkullType PLAYER() - * @method static SkullType SKELETON() - * @method static SkullType WITHER_SKELETON() - * @method static SkullType ZOMBIE() + * @method static MobHeadType CREEPER() + * @method static MobHeadType DRAGON() + * @method static MobHeadType PLAYER() + * @method static MobHeadType SKELETON() + * @method static MobHeadType WITHER_SKELETON() + * @method static MobHeadType ZOMBIE() */ -final class SkullType{ +final class MobHeadType{ use EnumTrait { register as Enum_register; __construct as Enum___construct; } - /** @var SkullType[] */ + /** @var MobHeadType[] */ private static array $numericIdMap = []; protected static function setup() : void{ self::registerAll( - new SkullType("skeleton", "Skeleton Skull", 0), - new SkullType("wither_skeleton", "Wither Skeleton Skull", 1), - new SkullType("zombie", "Zombie Head", 2), - new SkullType("player", "Player Head", 3), - new SkullType("creeper", "Creeper Head", 4), - new SkullType("dragon", "Dragon Head", 5) + new MobHeadType("skeleton", "Skeleton Skull", 0), + new MobHeadType("wither_skeleton", "Wither Skeleton Skull", 1), + new MobHeadType("zombie", "Zombie Head", 2), + new MobHeadType("player", "Player Head", 3), + new MobHeadType("creeper", "Creeper Head", 4), + new MobHeadType("dragon", "Dragon Head", 5) ); } - protected static function register(SkullType $type) : void{ + protected static function register(MobHeadType $type) : void{ self::Enum_register($type); self::$numericIdMap[$type->getMagicNumber()] = $type; } @@ -68,7 +68,7 @@ final class SkullType{ * * @throws \InvalidArgumentException */ - public static function fromMagicNumber(int $magicNumber) : SkullType{ + public static function fromMagicNumber(int $magicNumber) : MobHeadType{ if(!isset(self::$numericIdMap[$magicNumber])){ throw new \InvalidArgumentException("Unknown skull type magic number $magicNumber"); } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 3680e48067..9809eb9583 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -93,6 +93,7 @@ use pocketmine\block\LightningRod; use pocketmine\block\LitPumpkin; use pocketmine\block\Loom; use pocketmine\block\MelonStem; +use pocketmine\block\MobHead; use pocketmine\block\NetherPortal; use pocketmine\block\NetherVines; use pocketmine\block\NetherWartPlant; @@ -112,7 +113,6 @@ use pocketmine\block\Sapling; use pocketmine\block\SeaPickle; use pocketmine\block\SimplePillar; use pocketmine\block\SimplePressurePlate; -use pocketmine\block\Skull; use pocketmine\block\Slab; use pocketmine\block\SnowLayer; use pocketmine\block\Sponge; @@ -1148,7 +1148,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); - $this->map(Blocks::MOB_HEAD(), function(Skull $block) : Writer{ + $this->map(Blocks::MOB_HEAD(), function(MobHead $block) : Writer{ return Writer::create(Ids::SKULL) ->writeFacingWithoutDown($block->getFacing()); }); diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 99be4ea68b..699c7e393e 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -25,9 +25,9 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Bed; use pocketmine\block\Block; -use pocketmine\block\Skull; +use pocketmine\block\MobHead; use pocketmine\block\utils\DyeColor; -use pocketmine\block\utils\SkullType; +use pocketmine\block\utils\MobHeadType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; @@ -444,15 +444,15 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1BlockWithMeta( Ids::SKULL, Blocks::MOB_HEAD(), - function(Skull $block, int $meta) : void{ + function(MobHead $block, int $meta) : void{ try{ - $skullType = SkullType::fromMagicNumber($meta); + $skullType = MobHeadType::fromMagicNumber($meta); }catch(\InvalidArgumentException $e){ throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); } - $block->setSkullType($skullType); + $block->setMobHeadType($skullType); }, - fn(Skull $block) => $block->getSkullType()->getMagicNumber() + fn(MobHead $block) => $block->getMobHeadType()->getMagicNumber() ); } diff --git a/src/data/runtime/RuntimeEnumDescriber.php b/src/data/runtime/RuntimeEnumDescriber.php index dc0083e8ba..643ecd3018 100644 --- a/src/data/runtime/RuntimeEnumDescriber.php +++ b/src/data/runtime/RuntimeEnumDescriber.php @@ -45,12 +45,12 @@ interface RuntimeEnumDescriber{ public function medicineType(\pocketmine\item\MedicineType &$value) : void; + public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void; + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void; public function potionType(\pocketmine\item\PotionType &$value) : void; - public function skullType(\pocketmine\block\utils\SkullType &$value) : void; - public function slabType(\pocketmine\block\utils\SlabType &$value) : void; public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void; diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 278cfc1522..4ad50f06da 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -126,6 +126,18 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ + $value = match($this->readInt(3)){ + 0 => \pocketmine\block\utils\MobHeadType::CREEPER(), + 1 => \pocketmine\block\utils\MobHeadType::DRAGON(), + 2 => \pocketmine\block\utils\MobHeadType::PLAYER(), + 3 => \pocketmine\block\utils\MobHeadType::SKELETON(), + 4 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON(), + 5 => \pocketmine\block\utils\MobHeadType::ZOMBIE(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MobHeadType") + }; + } + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\MushroomBlockType::ALL_CAP(), @@ -191,18 +203,6 @@ trait RuntimeEnumDeserializerTrait{ }; } - public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ - $value = match($this->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 InvalidSerializedRuntimeDataException("Invalid serialized value for SkullType") - }; - } - public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ $value = match($this->readInt(2)){ 0 => \pocketmine\block\utils\SlabType::BOTTOM(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index e3b8a6d2ca..805723ac51 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -126,6 +126,18 @@ trait RuntimeEnumSerializerTrait{ }); } + public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ + $this->writeInt(3, match($value){ + \pocketmine\block\utils\MobHeadType::CREEPER() => 0, + \pocketmine\block\utils\MobHeadType::DRAGON() => 1, + \pocketmine\block\utils\MobHeadType::PLAYER() => 2, + \pocketmine\block\utils\MobHeadType::SKELETON() => 3, + \pocketmine\block\utils\MobHeadType::WITHER_SKELETON() => 4, + \pocketmine\block\utils\MobHeadType::ZOMBIE() => 5, + default => throw new \pocketmine\utils\AssumptionFailedError("All MobHeadType cases should be covered") + }); + } + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $this->writeInt(4, match($value){ \pocketmine\block\utils\MushroomBlockType::ALL_CAP() => 0, @@ -191,18 +203,6 @@ trait RuntimeEnumSerializerTrait{ }); } - public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ - $this->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 function slabType(\pocketmine\block\utils\SlabType &$value) : void{ $this->writeInt(2, match($value){ \pocketmine\block\utils\SlabType::BOTTOM() => 0, diff --git a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php index 25defa2c0a..3c8d189e1c 100644 --- a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php +++ b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php @@ -63,6 +63,10 @@ trait RuntimeEnumSizeCalculatorTrait{ $this->addBits(2); } + public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ + $this->addBits(3); + } + public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $this->addBits(4); } @@ -71,10 +75,6 @@ trait RuntimeEnumSizeCalculatorTrait{ $this->addBits(6); } - public function skullType(\pocketmine\block\utils\SkullType &$value) : void{ - $this->addBits(3); - } - public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ $this->addBits(2); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index a6aea2ae2c..cd5b6d55a5 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -30,7 +30,7 @@ use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; -use pocketmine\block\utils\SkullType; +use pocketmine\block\utils\MobHeadType; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\item\VanillaItems as Items; @@ -264,7 +264,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); - $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::CREEPER())); + $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::CREEPER())); $result->registerBlock("crimson_button", fn() => Blocks::CRIMSON_BUTTON()); $result->registerBlock("crimson_door", fn() => Blocks::CRIMSON_DOOR()); $result->registerBlock("crimson_fence", fn() => Blocks::CRIMSON_FENCE()); @@ -356,7 +356,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("double_wooden_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); $result->registerBlock("double_wooden_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); $result->registerBlock("dragon_egg", fn() => Blocks::DRAGON_EGG()); - $result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::DRAGON())); + $result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::DRAGON())); $result->registerBlock("dried_kelp_block", fn() => Blocks::DRIED_KELP()); $result->registerBlock("dyed_shulker_box", fn() => Blocks::DYED_SHULKER_BOX()); $result->registerBlock("element_0", fn() => Blocks::ELEMENT_ZERO()); @@ -844,7 +844,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); - $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::PLAYER())); + $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER())); $result->registerBlock("podzol", fn() => Blocks::PODZOL()); $result->registerBlock("polished_andesite", fn() => Blocks::POLISHED_ANDESITE()); $result->registerBlock("polished_andesite_slab", fn() => Blocks::POLISHED_ANDESITE_SLAB()); @@ -950,8 +950,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN()); - $result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::SKELETON())); - $result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::SKELETON())); + $result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON())); + $result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON())); $result->registerBlock("skull_block", fn() => Blocks::MOB_HEAD()); $result->registerBlock("slab", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); @@ -1100,7 +1100,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); $result->registerBlock("wither_rose", fn() => Blocks::WITHER_ROSE()); - $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::WITHER_SKELETON())); + $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::WITHER_SKELETON())); $result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false)); $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("wood_door_block", fn() => Blocks::OAK_DOOR()); @@ -1120,7 +1120,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wool", fn() => Blocks::WOOL()); $result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("yellow_flower", fn() => Blocks::DANDELION()); - $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setSkullType(SkullType::ZOMBIE())); + $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::ZOMBIE())); } private static function registerDynamicItems(self $result) : void{ diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index b3e0b44966..c100bce316 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -426,14 +426,14 @@ parameters: path: ../../../src/block/tile/Chest.php - - message: "#^Constant pocketmine\\\\block\\\\tile\\\\Skull\\:\\:TAG_MOUTH_MOVING is unused\\.$#" + message: "#^Constant pocketmine\\\\block\\\\tile\\\\MobHead\\:\\:TAG_MOUTH_MOVING is unused\\.$#" count: 1 - path: ../../../src/block/tile/Skull.php + path: ../../../src/block/tile/MobHead.php - - message: "#^Constant pocketmine\\\\block\\\\tile\\\\Skull\\:\\:TAG_MOUTH_TICK_COUNT is unused\\.$#" + message: "#^Constant pocketmine\\\\block\\\\tile\\\\MobHead\\:\\:TAG_MOUTH_TICK_COUNT is unused\\.$#" count: 1 - path: ../../../src/block/tile/Skull.php + path: ../../../src/block/tile/MobHead.php - message: "#^Parameter \\#2 \\$value of method pocketmine\\\\nbt\\\\tag\\\\CompoundTag\\:\\:setInt\\(\\) expects int, float\\|int given\\.$#" diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index 46f5922b6e..6db39bb48a 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -28,8 +28,8 @@ use pocketmine\block\BaseBanner; use pocketmine\block\Bed; use pocketmine\block\BlockTypeIds; use pocketmine\block\CaveVines; +use pocketmine\block\MobHead; use pocketmine\block\RuntimeBlockStateRegistry; -use pocketmine\block\Skull; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateSerializeException; use function print_r; @@ -72,8 +72,8 @@ final class BlockSerializerDeserializerTest extends TestCase{ ($block instanceof Bed && $newBlock instanceof Bed) ){ $newBlock->setColor($block->getColor()); - }elseif($block instanceof Skull && $newBlock instanceof Skull){ - $newBlock->setSkullType($block->getSkullType()); + }elseif($block instanceof MobHead && $newBlock instanceof MobHead){ + $newBlock->setMobHeadType($block->getMobHeadType()); }elseif($block instanceof CaveVines && $newBlock instanceof CaveVines && !$block->hasBerries()){ $newBlock->setHead($block->isHead()); } From fddab29e87981b53a35a5238cd2a328b1d18a294 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2023 15:47:12 +0100 Subject: [PATCH 1048/1858] Move mob head and note instrument save IDs into pocketmine\data\bedrock to be consistent, these shouldn't be exposed in the API like this... I'm not very happy with the whole 'type ID map' paradigm (particularly its lack of static analysis guarantees), but the most important thing right now is to get this stuff out of the API so that plugin devs don't try and abuse it. We're not going to change the whole system days before PM5 release. --- src/block/tile/MobHead.php | 14 ++-- src/block/utils/MobHeadType.php | 40 ++--------- src/data/bedrock/MobHeadTypeIdMap.php | 68 +++++++++++++++++++ src/data/bedrock/NoteInstrumentIdMap.php | 67 ++++++++++++++++++ .../ItemSerializerDeserializerRegistrar.php | 11 +-- src/world/sound/NoteInstrument.php | 25 ++----- src/world/sound/NoteSound.php | 4 +- 7 files changed, 162 insertions(+), 67 deletions(-) create mode 100644 src/data/bedrock/MobHeadTypeIdMap.php create mode 100644 src/data/bedrock/NoteInstrumentIdMap.php diff --git a/src/block/tile/MobHead.php b/src/block/tile/MobHead.php index 35a82e8347..70a199bf67 100644 --- a/src/block/tile/MobHead.php +++ b/src/block/tile/MobHead.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\block\tile; use pocketmine\block\utils\MobHeadType; +use pocketmine\data\bedrock\MobHeadTypeIdMap; +use pocketmine\data\SavedDataLoadingException; use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; @@ -50,11 +52,11 @@ class MobHead extends Spawnable{ public function readSaveData(CompoundTag $nbt) : void{ if(($skullTypeTag = $nbt->getTag(self::TAG_SKULL_TYPE)) instanceof ByteTag){ - try{ - $this->mobHeadType = MobHeadType::fromMagicNumber($skullTypeTag->getValue()); - }catch(\InvalidArgumentException $e){ - //bad data, drop it + $mobHeadType = MobHeadTypeIdMap::getInstance()->fromId($skullTypeTag->getValue()); + if($mobHeadType === null){ + throw new SavedDataLoadingException("Invalid skull type tag value " . $skullTypeTag->getValue()); } + $this->mobHeadType = $mobHeadType; } $rotation = $nbt->getByte(self::TAG_ROT, 0); if($rotation >= 0 && $rotation <= 15){ @@ -63,7 +65,7 @@ class MobHead extends Spawnable{ } protected function writeSaveData(CompoundTag $nbt) : void{ - $nbt->setByte(self::TAG_SKULL_TYPE, $this->mobHeadType->getMagicNumber()); + $nbt->setByte(self::TAG_SKULL_TYPE, MobHeadTypeIdMap::getInstance()->toId($this->mobHeadType)); $nbt->setByte(self::TAG_ROT, $this->rotation); } @@ -84,7 +86,7 @@ class MobHead extends Spawnable{ } protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ - $nbt->setByte(self::TAG_SKULL_TYPE, $this->mobHeadType->getMagicNumber()); + $nbt->setByte(self::TAG_SKULL_TYPE, MobHeadTypeIdMap::getInstance()->toId($this->mobHeadType)); $nbt->setByte(self::TAG_ROT, $this->rotation); } } diff --git a/src/block/utils/MobHeadType.php b/src/block/utils/MobHeadType.php index 3259a0757c..45d31e9bb0 100644 --- a/src/block/utils/MobHeadType.php +++ b/src/block/utils/MobHeadType.php @@ -40,45 +40,23 @@ use pocketmine\utils\EnumTrait; */ final class MobHeadType{ use EnumTrait { - register as Enum_register; __construct as Enum___construct; } - /** @var MobHeadType[] */ - private static array $numericIdMap = []; - protected static function setup() : void{ self::registerAll( - new MobHeadType("skeleton", "Skeleton Skull", 0), - new MobHeadType("wither_skeleton", "Wither Skeleton Skull", 1), - new MobHeadType("zombie", "Zombie Head", 2), - new MobHeadType("player", "Player Head", 3), - new MobHeadType("creeper", "Creeper Head", 4), - new MobHeadType("dragon", "Dragon Head", 5) + new MobHeadType("skeleton", "Skeleton Skull"), + new MobHeadType("wither_skeleton", "Wither Skeleton Skull"), + new MobHeadType("zombie", "Zombie Head"), + new MobHeadType("player", "Player Head"), + new MobHeadType("creeper", "Creeper Head"), + new MobHeadType("dragon", "Dragon Head") ); } - protected static function register(MobHeadType $type) : void{ - self::Enum_register($type); - self::$numericIdMap[$type->getMagicNumber()] = $type; - } - - /** - * @internal - * - * @throws \InvalidArgumentException - */ - public static function fromMagicNumber(int $magicNumber) : MobHeadType{ - if(!isset(self::$numericIdMap[$magicNumber])){ - throw new \InvalidArgumentException("Unknown skull type magic number $magicNumber"); - } - return self::$numericIdMap[$magicNumber]; - } - private function __construct( string $enumName, - private string $displayName, - private int $magicNumber + private string $displayName ){ $this->Enum___construct($enumName); } @@ -86,8 +64,4 @@ final class MobHeadType{ public function getDisplayName() : string{ return $this->displayName; } - - public function getMagicNumber() : int{ - return $this->magicNumber; - } } diff --git a/src/data/bedrock/MobHeadTypeIdMap.php b/src/data/bedrock/MobHeadTypeIdMap.php new file mode 100644 index 0000000000..9b9fe2c060 --- /dev/null +++ b/src/data/bedrock/MobHeadTypeIdMap.php @@ -0,0 +1,68 @@ + + */ + private array $idToEnum = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $enumToId = []; + + private function __construct(){ + $this->register(0, MobHeadType::SKELETON()); + $this->register(1, MobHeadType::WITHER_SKELETON()); + $this->register(2, MobHeadType::ZOMBIE()); + $this->register(3, MobHeadType::PLAYER()); + $this->register(4, MobHeadType::CREEPER()); + $this->register(5, MobHeadType::DRAGON()); + } + + private function register(int $id, MobHeadType $type) : void{ + $this->idToEnum[$id] = $type; + $this->enumToId[$type->id()] = $id; + } + + public function fromId(int $id) : ?MobHeadType{ + return $this->idToEnum[$id] ?? null; + } + + public function toId(MobHeadType $type) : int{ + if(!isset($this->enumToId[$type->id()])){ + throw new \InvalidArgumentException("Type does not have a mapped ID"); + } + return $this->enumToId[$type->id()]; + } +} diff --git a/src/data/bedrock/NoteInstrumentIdMap.php b/src/data/bedrock/NoteInstrumentIdMap.php new file mode 100644 index 0000000000..b9a6470534 --- /dev/null +++ b/src/data/bedrock/NoteInstrumentIdMap.php @@ -0,0 +1,67 @@ + + */ + private array $idToEnum = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $enumToId = []; + + private function __construct(){ + $this->register(0, NoteInstrument::PIANO()); + $this->register(1, NoteInstrument::BASS_DRUM()); + $this->register(2, NoteInstrument::SNARE()); + $this->register(3, NoteInstrument::CLICKS_AND_STICKS()); + $this->register(4, NoteInstrument::DOUBLE_BASS()); + } + + private function register(int $id, NoteInstrument $instrument) : void{ + $this->idToEnum[$id] = $instrument; + $this->enumToId[$instrument->id()] = $id; + } + + public function fromId(int $id) : ?NoteInstrument{ + return $this->idToEnum[$id] ?? null; + } + + public function toId(NoteInstrument $instrument) : int{ + if(!isset($this->enumToId[$instrument->id()])){ + throw new \InvalidArgumentException("Type does not have a mapped ID"); + } + return $this->enumToId[$instrument->id()]; + } +} diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 699c7e393e..7e2e3bad00 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -27,13 +27,13 @@ use pocketmine\block\Bed; use pocketmine\block\Block; use pocketmine\block\MobHead; use pocketmine\block\utils\DyeColor; -use pocketmine\block\utils\MobHeadType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\MedicineTypeIdMap; +use pocketmine\data\bedrock\MobHeadTypeIdMap; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; use pocketmine\item\Banner; @@ -445,14 +445,9 @@ final class ItemSerializerDeserializerRegistrar{ Ids::SKULL, Blocks::MOB_HEAD(), function(MobHead $block, int $meta) : void{ - try{ - $skullType = MobHeadType::fromMagicNumber($meta); - }catch(\InvalidArgumentException $e){ - throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); - } - $block->setMobHeadType($skullType); + $block->setMobHeadType(MobHeadTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown mob head type ID $meta")); }, - fn(MobHead $block) => $block->getMobHeadType()->getMagicNumber() + fn(MobHead $block) => MobHeadTypeIdMap::getInstance()->toId($block->getMobHeadType()) ); } diff --git a/src/world/sound/NoteInstrument.php b/src/world/sound/NoteInstrument.php index 06053c566f..824f9e3c43 100644 --- a/src/world/sound/NoteInstrument.php +++ b/src/world/sound/NoteInstrument.php @@ -38,28 +38,15 @@ use pocketmine\utils\EnumTrait; * @method static NoteInstrument SNARE() */ final class NoteInstrument{ - use EnumTrait { - __construct as Enum___construct; - } + use EnumTrait; protected static function setup() : void{ self::registerAll( - new self("piano", 0), - new self("bass_drum", 1), - new self("snare", 2), - new self("clicks_and_sticks", 3), - new self("double_bass", 4) + new self("piano"), + new self("bass_drum"), + new self("snare"), + new self("clicks_and_sticks"), + new self("double_bass") ); } - - private function __construct( - string $name, - private int $magicNumber - ){ - $this->Enum___construct($name); - } - - public function getMagicNumber() : int{ - return $this->magicNumber; - } } diff --git a/src/world/sound/NoteSound.php b/src/world/sound/NoteSound.php index b0459bdbea..6082567092 100644 --- a/src/world/sound/NoteSound.php +++ b/src/world/sound/NoteSound.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\sound; +use pocketmine\data\bedrock\NoteInstrumentIdMap; use pocketmine\math\Vector3; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -38,6 +39,7 @@ class NoteSound implements Sound{ } public function encode(Vector3 $pos) : array{ - return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::NOTE, $pos, false, ($this->instrument->getMagicNumber() << 8) | $this->note)]; + $instrumentId = NoteInstrumentIdMap::getInstance()->toId($this->instrument); + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::NOTE, $pos, false, ($instrumentId << 8) | $this->note)]; } } From 06b0fa4d67654926b478996b4643d2c3040ce1fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2023 15:47:35 +0100 Subject: [PATCH 1049/1858] Fix PHPStan --- tests/phpstan/configs/actual-problems.neon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index c100bce316..6f43a99727 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -621,7 +621,7 @@ parameters: path: ../../../src/network/mcpe/NetworkSession.php - - message: "#^Cannot call method setImmobile\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" + message: "#^Cannot call method setNoClientPredictions\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" count: 2 path: ../../../src/network/mcpe/NetworkSession.php From b8ba2d03ba3ec954d948466b471fe92afadf5df1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2023 16:58:06 +0100 Subject: [PATCH 1050/1858] Added new note instruments up to 1.19 1.20 adds extra ones for each type of mob head, but we're not supporting 1.20 yet. --- src/data/bedrock/NoteInstrumentIdMap.php | 11 +++++++++++ src/world/sound/NoteInstrument.php | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/NoteInstrumentIdMap.php b/src/data/bedrock/NoteInstrumentIdMap.php index b9a6470534..0b8a437357 100644 --- a/src/data/bedrock/NoteInstrumentIdMap.php +++ b/src/data/bedrock/NoteInstrumentIdMap.php @@ -47,6 +47,17 @@ final class NoteInstrumentIdMap{ $this->register(2, NoteInstrument::SNARE()); $this->register(3, NoteInstrument::CLICKS_AND_STICKS()); $this->register(4, NoteInstrument::DOUBLE_BASS()); + $this->register(5, NoteInstrument::BELL()); + $this->register(6, NoteInstrument::FLUTE()); + $this->register(7, NoteInstrument::CHIME()); + $this->register(8, NoteInstrument::GUITAR()); + $this->register(9, NoteInstrument::XYLOPHONE()); + $this->register(10, NoteInstrument::IRON_XYLOPHONE()); + $this->register(11, NoteInstrument::COW_BELL()); + $this->register(12, NoteInstrument::DIDGERIDOO()); + $this->register(13, NoteInstrument::BIT()); + $this->register(14, NoteInstrument::BANJO()); + $this->register(15, NoteInstrument::PLING()); } private function register(int $id, NoteInstrument $instrument) : void{ diff --git a/src/world/sound/NoteInstrument.php b/src/world/sound/NoteInstrument.php index 824f9e3c43..87e5d496d9 100644 --- a/src/world/sound/NoteInstrument.php +++ b/src/world/sound/NoteInstrument.php @@ -31,11 +31,22 @@ use pocketmine\utils\EnumTrait; * @see build/generate-registry-annotations.php * @generate-registry-docblock * + * @method static NoteInstrument BANJO() * @method static NoteInstrument BASS_DRUM() + * @method static NoteInstrument BELL() + * @method static NoteInstrument BIT() + * @method static NoteInstrument CHIME() * @method static NoteInstrument CLICKS_AND_STICKS() + * @method static NoteInstrument COW_BELL() + * @method static NoteInstrument DIDGERIDOO() * @method static NoteInstrument DOUBLE_BASS() + * @method static NoteInstrument FLUTE() + * @method static NoteInstrument GUITAR() + * @method static NoteInstrument IRON_XYLOPHONE() * @method static NoteInstrument PIANO() + * @method static NoteInstrument PLING() * @method static NoteInstrument SNARE() + * @method static NoteInstrument XYLOPHONE() */ final class NoteInstrument{ use EnumTrait; @@ -46,7 +57,18 @@ final class NoteInstrument{ new self("bass_drum"), new self("snare"), new self("clicks_and_sticks"), - new self("double_bass") + new self("double_bass"), + new self("bell"), + new self("flute"), + new self("chime"), + new self("guitar"), + new self("xylophone"), + new self("iron_xylophone"), + new self("cow_bell"), + new self("didgeridoo"), + new self("bit"), + new self("banjo"), + new self("pling") ); } } From 473c062b401a6134e5ded0dae498c751f84a7643 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 May 2023 17:28:36 +0100 Subject: [PATCH 1051/1858] Improve documentation for BlockTypeIds and ItemTypeIds --- src/block/BlockTypeIds.php | 11 +++++++---- src/item/ItemTypeIds.php | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 576d84d5e3..5a96485ed7 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -24,11 +24,14 @@ declare(strict_types=1); namespace pocketmine\block; /** - * Enum of all the block runtime IDs used by PocketMine-MP. These IDs are specific to PocketMine-MP and have no - * relevance to any Minecraft vanilla things. + * Every block in {@link VanillaBlocks} has a corresponding constant in this class. These constants can be used to + * identify and compare block types efficiently using {@link Block::getTypeId()}. * - * WARNING: DO NOT STORE THESE IDS. They can and will change without warning. - * They should ONLY be used to IDENTIFY blocks at runtime. + * Type ID is also used internally as part of block state ID, which is used to store blocks and their simple properties + * in a memory-efficient way in chunks at runtime. + * + * WARNING: These are NOT a replacement for Minecraft legacy IDs. Do **NOT** hardcode their values, or store them in + * configs or databases. They will change without warning. */ final class BlockTypeIds{ diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index a7b4611efa..2e6fef9956 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -24,11 +24,11 @@ declare(strict_types=1); namespace pocketmine\item; /** - * Enum of all the item runtime IDs used by PocketMine-MP. These IDs are specific to PocketMine-MP and have no - * relevance to any Minecraft vanilla things. + * Every item in {@link VanillaItems} has a corresponding constant in this class. These constants can be used to + * identify and compare item types efficiently using {@link Item::getTypeId()}. * - * WARNING: DO NOT STORE THESE IDS. They can and will change without warning. - * They should ONLY be used to IDENTIFY items at runtime. + * WARNING: These are NOT a replacement for Minecraft legacy IDs. Do **NOT** hardcode their values, or store them in + * configs or databases. They will change without warning. */ final class ItemTypeIds{ From 9baf59702bf63453d071c92150823e1a0683d025 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 May 2023 18:00:54 +0100 Subject: [PATCH 1052/1858] Stop using insecure UUIDs from non-XBL players closes #4076 I opted for the minimal approach of replacing only UUIDs for non-XBL players, since most servers are using XBL anyway (as they should). --- .../mcpe/handler/LoginPacketHandler.php | 2 +- src/player/PlayerInfo.php | 20 ++++++++++++++++++- src/player/XboxLivePlayerInfo.php | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index a8c3d4d628..e738323e44 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -95,7 +95,7 @@ class LoginPacketHandler extends PacketHandler{ }else{ $playerInfo = new PlayerInfo( $extraData->displayName, - $uuid, + null, //we can't trust UUIDs of non-XBL players - replace this with a server-generated UUID $skin, $clientData->LanguageCode, (array) $clientData diff --git a/src/player/PlayerInfo.php b/src/player/PlayerInfo.php index 9669934353..82736f0f88 100644 --- a/src/player/PlayerInfo.php +++ b/src/player/PlayerInfo.php @@ -25,24 +25,42 @@ namespace pocketmine\player; use pocketmine\entity\Skin; use pocketmine\utils\TextFormat; +use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; /** * Encapsulates data needed to create a player. */ class PlayerInfo{ + /** + * Namespace for server-generated UUIDs for unauthenticated (non-XBL) players. + * This must not be changed. + */ + private const UNAUTHENTICATED_PLAYER_UUID_NS = '6a6424c0-a26f-43b7-8e72-4176d051748d'; + + private UuidInterface $uuid; /** * @param mixed[] $extraData * @phpstan-param array $extraData */ public function __construct( private string $username, - private UuidInterface $uuid, + ?UuidInterface $uuid, private Skin $skin, private string $locale, private array $extraData = [] ){ $this->username = TextFormat::clean($username); + $this->uuid = $uuid ?? self::generateServerAuthoritativeUuid($this->username); + } + + /** + * Generates a UUID based on the player's username. This is used for any non-authenticated player, as we can't + * trust UUIDs sent by unauthenticated players. + */ + public static function generateServerAuthoritativeUuid(string $username) : UuidInterface{ + //TODO: should we be cleaning the username here? + return Uuid::uuid5(self::UNAUTHENTICATED_PLAYER_UUID_NS, TextFormat::clean($username)); } public function getUsername() : string{ diff --git a/src/player/XboxLivePlayerInfo.php b/src/player/XboxLivePlayerInfo.php index 8a17ee7448..1d2bdd0e04 100644 --- a/src/player/XboxLivePlayerInfo.php +++ b/src/player/XboxLivePlayerInfo.php @@ -48,7 +48,7 @@ final class XboxLivePlayerInfo extends PlayerInfo{ public function withoutXboxData() : PlayerInfo{ return new PlayerInfo( $this->getUsername(), - $this->getUuid(), + null, //we can't trust UUIDs of non-XBL players - replace this with a server-generated UUID $this->getSkin(), $this->getLocale(), $this->getExtraData() From 7f1550ef0466571fbfd6193a771f4396e488d786 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 27 May 2023 18:10:55 +0100 Subject: [PATCH 1053/1858] Revert "Stop using insecure UUIDs from non-XBL players" This reverts commit 9baf59702bf63453d071c92150823e1a0683d025. I forgot this is also needed for the player list, and for skin updates to work ... this will need to be revisited --- .../mcpe/handler/LoginPacketHandler.php | 2 +- src/player/PlayerInfo.php | 20 +------------------ src/player/XboxLivePlayerInfo.php | 2 +- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index e738323e44..a8c3d4d628 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -95,7 +95,7 @@ class LoginPacketHandler extends PacketHandler{ }else{ $playerInfo = new PlayerInfo( $extraData->displayName, - null, //we can't trust UUIDs of non-XBL players - replace this with a server-generated UUID + $uuid, $skin, $clientData->LanguageCode, (array) $clientData diff --git a/src/player/PlayerInfo.php b/src/player/PlayerInfo.php index 82736f0f88..9669934353 100644 --- a/src/player/PlayerInfo.php +++ b/src/player/PlayerInfo.php @@ -25,42 +25,24 @@ namespace pocketmine\player; use pocketmine\entity\Skin; use pocketmine\utils\TextFormat; -use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; /** * Encapsulates data needed to create a player. */ class PlayerInfo{ - /** - * Namespace for server-generated UUIDs for unauthenticated (non-XBL) players. - * This must not be changed. - */ - private const UNAUTHENTICATED_PLAYER_UUID_NS = '6a6424c0-a26f-43b7-8e72-4176d051748d'; - - private UuidInterface $uuid; /** * @param mixed[] $extraData * @phpstan-param array $extraData */ public function __construct( private string $username, - ?UuidInterface $uuid, + private UuidInterface $uuid, private Skin $skin, private string $locale, private array $extraData = [] ){ $this->username = TextFormat::clean($username); - $this->uuid = $uuid ?? self::generateServerAuthoritativeUuid($this->username); - } - - /** - * Generates a UUID based on the player's username. This is used for any non-authenticated player, as we can't - * trust UUIDs sent by unauthenticated players. - */ - public static function generateServerAuthoritativeUuid(string $username) : UuidInterface{ - //TODO: should we be cleaning the username here? - return Uuid::uuid5(self::UNAUTHENTICATED_PLAYER_UUID_NS, TextFormat::clean($username)); } public function getUsername() : string{ diff --git a/src/player/XboxLivePlayerInfo.php b/src/player/XboxLivePlayerInfo.php index 1d2bdd0e04..8a17ee7448 100644 --- a/src/player/XboxLivePlayerInfo.php +++ b/src/player/XboxLivePlayerInfo.php @@ -48,7 +48,7 @@ final class XboxLivePlayerInfo extends PlayerInfo{ public function withoutXboxData() : PlayerInfo{ return new PlayerInfo( $this->getUsername(), - null, //we can't trust UUIDs of non-XBL players - replace this with a server-generated UUID + $this->getUuid(), $this->getSkin(), $this->getLocale(), $this->getExtraData() From f5a1a0c9cbe7f2d815069cd43a86bc25f2a60d02 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 16:32:24 +0100 Subject: [PATCH 1054/1858] =?UTF-8?q?=C3=82Insert=20PM=20data=20version=20?= =?UTF-8?q?into=20blockstates,=20chunks,=20entities,=20tiles=20and=20level?= =?UTF-8?q?.dat=20this=20information=20will=20allow=20us=20to=20correct=20?= =?UTF-8?q?for=20any=20bugs=20introduced=20by=20past=20versions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit however, we still need to propagate this information to permit actually using it when loading data. --- src/VersionInfo.php | 15 +++++++++++++++ src/block/tile/Tile.php | 4 +++- src/data/bedrock/block/BlockStateData.php | 7 +++++-- src/data/bedrock/item/SavedItemData.php | 2 ++ .../bedrock/item/upgrade/ItemDataUpgrader.php | 1 + src/entity/Entity.php | 3 +++ src/world/format/io/data/BedrockWorldData.php | 2 ++ src/world/format/io/data/JavaWorldData.php | 3 +++ src/world/format/io/leveldb/ChunkDataKey.php | 4 ++++ src/world/format/io/leveldb/LevelDB.php | 4 ++++ 10 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7ac6ec3f97..39cb18bc50 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -35,6 +35,21 @@ final class VersionInfo{ public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; + /** + * PocketMine-MP-specific version ID for world data. Used to determine what fixes need to be applied to old world + * data (e.g. stuff saved wrongly by past versions). + * This version supplements the Minecraft vanilla world version. + * + * This should be bumped if any **non-Mojang** BC-breaking change or bug fix is made to world save data of any kind + * (entities, tiles, blocks, biomes etc.). For example, if PM accidentally saved a block with its facing value + * swapped, we would bump this, but not if Mojang did the same change. + */ + public const WORLD_DATA_VERSION = 1; + /** + * Name of the NBT tag used to store the world data version. + */ + public const TAG_WORLD_DATA_VERSION = "PMMPDataVersion"; //TAG_Long + private function __construct(){ //NOOP } diff --git a/src/block/tile/Tile.php b/src/block/tile/Tile.php index 7722c32a5f..7b709f6799 100644 --- a/src/block/tile/Tile.php +++ b/src/block/tile/Tile.php @@ -34,6 +34,7 @@ use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; +use pocketmine\VersionInfo; use pocketmine\world\Position; use pocketmine\world\World; use function get_class; @@ -71,7 +72,8 @@ abstract class Tile{ ->setString(self::TAG_ID, TileFactory::getInstance()->getSaveId(get_class($this))) ->setInt(self::TAG_X, $this->position->getFloorX()) ->setInt(self::TAG_Y, $this->position->getFloorY()) - ->setInt(self::TAG_Z, $this->position->getFloorZ()); + ->setInt(self::TAG_Z, $this->position->getFloorZ()) + ->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); $this->writeSaveData($nbt); return $nbt; diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 31f2b98c05..e30836f3b0 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -27,6 +27,7 @@ use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; +use pocketmine\VersionInfo; use function array_keys; use function count; use function implode; @@ -96,12 +97,13 @@ final class BlockStateData{ $name = $nbt->getString(self::TAG_NAME); $states = $nbt->getCompoundTag(self::TAG_STATES) ?? throw new BlockStateDeserializeException("Missing tag \"" . self::TAG_STATES . "\""); $version = $nbt->getInt(self::TAG_VERSION, 0); + //TODO: read version from VersionInfo::TAG_WORLD_DATA_VERSION - we may need it to fix up old blockstates }catch(NbtException $e){ throw new BlockStateDeserializeException($e->getMessage(), 0, $e); } $allKeys = $nbt->getValue(); - unset($allKeys[self::TAG_NAME], $allKeys[self::TAG_STATES], $allKeys[self::TAG_VERSION]); + unset($allKeys[self::TAG_NAME], $allKeys[self::TAG_STATES], $allKeys[self::TAG_VERSION], $allKeys[VersionInfo::TAG_WORLD_DATA_VERSION]); if(count($allKeys) !== 0){ throw new BlockStateDeserializeException("Unexpected extra keys: " . implode(", ", array_keys($allKeys))); } @@ -117,7 +119,8 @@ final class BlockStateData{ return CompoundTag::create() ->setString(self::TAG_NAME, $this->name) ->setInt(self::TAG_VERSION, $this->version) - ->setTag(self::TAG_STATES, $statesTag); + ->setTag(self::TAG_STATES, $statesTag) + ->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); } public function equals(self $that) : bool{ diff --git a/src/data/bedrock/item/SavedItemData.php b/src/data/bedrock/item/SavedItemData.php index fa631e4e7a..87e91732e0 100644 --- a/src/data/bedrock/item/SavedItemData.php +++ b/src/data/bedrock/item/SavedItemData.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\item; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\VersionInfo; final class SavedItemData{ @@ -59,6 +60,7 @@ final class SavedItemData{ if($this->tag !== null){ $result->setTag(self::TAG_TAG, $this->tag); } + $result->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); return $result; } diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index 249b257e27..d7d097de82 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -149,6 +149,7 @@ final class ItemDataUpgrader{ [$newNameId, $newMeta] = $this->idMetaUpgrader->upgrade($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? + //TODO: read version from VersionInfo::TAG_WORLD_DATA_VERSION - we may need it to fix up old items return new SavedItemData($newNameId, $newMeta, $blockStateData, $tag->getCompoundTag(SavedItemData::TAG_TAG)); } diff --git a/src/entity/Entity.php b/src/entity/Entity.php index cb7d140da8..095ab7ab33 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -60,6 +60,7 @@ use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; use pocketmine\utils\Utils; +use pocketmine\VersionInfo; use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\sound\Sound; @@ -489,6 +490,8 @@ abstract class Entity{ $nbt->setShort(self::TAG_FIRE, $this->fireTicks); $nbt->setByte(self::TAG_ON_GROUND, $this->onGround ? 1 : 0); + $nbt->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); + return $nbt; } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 48d02cbece..faef3ab21a 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -33,6 +33,7 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\Binary; use pocketmine\utils\Filesystem; use pocketmine\utils\Limits; +use pocketmine\VersionInfo; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\generator\Flat; @@ -201,6 +202,7 @@ class BedrockWorldData extends BaseNbtWorldData{ $this->compoundTag->setInt(self::TAG_NETWORK_VERSION, self::CURRENT_STORAGE_NETWORK_VERSION); $this->compoundTag->setInt(self::TAG_STORAGE_VERSION, self::CURRENT_STORAGE_VERSION); $this->compoundTag->setTag(self::TAG_LAST_OPENED_WITH_VERSION, new ListTag(array_map(fn(int $v) => new IntTag($v), self::CURRENT_CLIENT_VERSION_TARGET))); + $this->compoundTag->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); $nbt = new LittleEndianNbtSerializer(); $buffer = $nbt->write(new TreeRoot($this->compoundTag)); diff --git a/src/world/format/io/data/JavaWorldData.php b/src/world/format/io/data/JavaWorldData.php index baa2a34fee..b53ad34a58 100644 --- a/src/world/format/io/data/JavaWorldData.php +++ b/src/world/format/io/data/JavaWorldData.php @@ -30,6 +30,7 @@ use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\TreeRoot; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; +use pocketmine\VersionInfo; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\World; @@ -126,6 +127,8 @@ class JavaWorldData extends BaseNbtWorldData{ } public function save() : void{ + $this->compoundTag->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); + $nbt = new BigEndianNbtSerializer(); $buffer = Utils::assumeNotFalse(zlib_encode($nbt->write(new TreeRoot(CompoundTag::create()->setTag(self::TAG_ROOT_DATA, $this->compoundTag))), ZLIB_ENCODING_GZIP)); Filesystem::safeFilePutContents($this->dataPath, $buffer); diff --git a/src/world/format/io/leveldb/ChunkDataKey.php b/src/world/format/io/leveldb/ChunkDataKey.php index 6d1b2980c7..13cfe0bbe6 100644 --- a/src/world/format/io/leveldb/ChunkDataKey.php +++ b/src/world/format/io/leveldb/ChunkDataKey.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\world\format\io\leveldb; +use pocketmine\VersionInfo; + final class ChunkDataKey{ private function __construct(){ //NOOP @@ -50,4 +52,6 @@ final class ChunkDataKey{ public const OLD_VERSION = "\x76"; + public const PM_DATA_VERSION = VersionInfo::TAG_WORLD_DATA_VERSION; + } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index a94a710bbb..61ee88a069 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -34,6 +34,7 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\Binary; use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; +use pocketmine\VersionInfo; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\BaseWorldProvider; use pocketmine\world\format\io\ChunkData; @@ -601,6 +602,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return null; } + //TODO: read PM_DATA_VERSION - we'll need it to fix up old chunks + $logger = new \PrefixedLogger($this->logger, "Loading chunk x=$chunkX z=$chunkZ v$chunkVersion"); $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; @@ -710,6 +713,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $write = new \LevelDBWriteBatch(); $write->put($index . ChunkDataKey::NEW_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); + $write->put($index . ChunkDataKey::PM_DATA_VERSION, Binary::writeLLong(VersionInfo::WORLD_DATA_VERSION)); $chunk = $chunkData->getChunk(); From c10be0f346b5cfc5ea2f3a1e2762ae103f787bc8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:03:39 +0100 Subject: [PATCH 1055/1858] WorldProvider: allow loadChunk() to return additional information about the loaded chunk data this will be needed for dealing with #5733. I don't plan to fix that before 5.0, but we need to make the appropriate BC breaks now, before release. --- src/world/World.php | 10 ++--- src/world/format/io/FormatConverter.php | 7 +-- src/world/format/io/LoadedChunkData.php | 45 +++++++++++++++++++ src/world/format/io/WorldProvider.php | 6 +-- src/world/format/io/leveldb/LevelDB.php | 9 +++- .../io/region/LegacyAnvilChunkTrait.php | 19 +++++--- src/world/format/io/region/McRegion.php | 19 +++++--- .../format/io/region/RegionWorldProvider.php | 6 +-- 8 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 src/world/format/io/LoadedChunkData.php diff --git a/src/world/World.php b/src/world/World.php index 13101d50f5..6942b732ff 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2702,25 +2702,25 @@ class World implements ChunkManager{ $this->timings->syncChunkLoadData->startTiming(); - $chunk = null; + $loadedChunkData = null; try{ - $chunk = $this->provider->loadChunk($x, $z); + $loadedChunkData = $this->provider->loadChunk($x, $z); }catch(CorruptedChunkException $e){ $this->logger->critical("Failed to load chunk x=$x z=$z: " . $e->getMessage()); } $this->timings->syncChunkLoadData->stopTiming(); - if($chunk === null){ + if($loadedChunkData === null){ $this->timings->syncChunkLoad->stopTiming(); return null; } - $this->chunks[$chunkHash] = $chunk->getChunk(); + $this->chunks[$chunkHash] = $loadedChunkData->getData()->getChunk(); unset($this->blockCache[$chunkHash]); - $this->initChunk($x, $z, $chunk); + $this->initChunk($x, $z, $loadedChunkData->getData()); (new ChunkLoadEvent($this, $x, $z, $this->chunks[$chunkHash], false))->call(); diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index 0a12432da6..e318d7c62a 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -140,10 +140,11 @@ class FormatConverter{ $start = microtime(true); $thisRound = $start; - foreach($this->oldProvider->getAllChunks(true, $this->logger) as $coords => $chunk){ + foreach($this->oldProvider->getAllChunks(true, $this->logger) as $coords => $loadedChunkData){ [$chunkX, $chunkZ] = $coords; - $chunk->getChunk()->setTerrainDirty(); - $new->saveChunk($chunkX, $chunkZ, $chunk); + $chunkData = $loadedChunkData->getData(); + $chunkData->getChunk()->setTerrainDirty(); + $new->saveChunk($chunkX, $chunkZ, $chunkData); $counter++; if(($counter % $this->chunksPerProgressUpdate) === 0){ $time = microtime(true); diff --git a/src/world/format/io/LoadedChunkData.php b/src/world/format/io/LoadedChunkData.php new file mode 100644 index 0000000000..bb31a97e19 --- /dev/null +++ b/src/world/format/io/LoadedChunkData.php @@ -0,0 +1,45 @@ +data; } + + public function isUpgraded() : bool{ return $this->upgraded; } + + public function getFixerFlags() : int{ return $this->fixerFlags; } +} diff --git a/src/world/format/io/WorldProvider.php b/src/world/format/io/WorldProvider.php index 3d08df8607..546ca12040 100644 --- a/src/world/format/io/WorldProvider.php +++ b/src/world/format/io/WorldProvider.php @@ -43,7 +43,7 @@ interface WorldProvider{ * * @throws CorruptedChunkException */ - public function loadChunk(int $chunkX, int $chunkZ) : ?ChunkData; + public function loadChunk(int $chunkX, int $chunkZ) : ?LoadedChunkData; /** * Performs garbage collection in the world provider, such as cleaning up regions in Region-based worlds. @@ -63,8 +63,8 @@ interface WorldProvider{ /** * Returns a generator which yields all the chunks in this world. * - * @return \Generator|ChunkData[] - * @phpstan-return \Generator + * @return \Generator|LoadedChunkData[] + * @phpstan-return \Generator * @throws CorruptedChunkException */ public function getAllChunks(bool $skipCorrupted = false, ?\Logger $logger = null) : \Generator; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 61ee88a069..17d0770b33 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -44,6 +44,7 @@ use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\format\io\GlobalBlockStateHandlers; +use pocketmine\world\format\io\LoadedChunkData; use pocketmine\world\format\io\WorldData; use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\format\PalettedBlockArray; @@ -593,7 +594,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ /** * @throws CorruptedChunkException */ - public function loadChunk(int $chunkX, int $chunkZ) : ?ChunkData{ + public function loadChunk(int $chunkX, int $chunkZ) : ?LoadedChunkData{ $index = LevelDB::chunkIndex($chunkX, $chunkZ); $chunkVersion = $this->readVersion($chunkX, $chunkZ); @@ -704,7 +705,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $chunk->setTerrainDirty(); //trigger rewriting chunk to disk if it was converted from an older format } - return new ChunkData($chunk, $entities, $tiles); + return new LoadedChunkData( + data: new ChunkData($chunk, $entities, $tiles), + upgraded: $hasBeenUpgraded, + fixerFlags: LoadedChunkData::FIXER_FLAG_ALL //TODO: fill this by version rather than just setting all flags + ); } public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void{ diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index 05d4b0fb85..84bbb72f7d 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -36,6 +36,7 @@ use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\io\LoadedChunkData; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; use function strlen; @@ -54,7 +55,7 @@ trait LegacyAnvilChunkTrait{ /** * @throws CorruptedChunkException */ - protected function deserializeChunk(string $data) : ?ChunkData{ + protected function deserializeChunk(string $data) : ?LoadedChunkData{ $decompressed = @zlib_decode($data); if($decompressed === false){ throw new CorruptedChunkException("Failed to decompress chunk NBT"); @@ -99,13 +100,17 @@ trait LegacyAnvilChunkTrait{ } } - return new ChunkData( - new Chunk( - $subChunks, - $chunk->getByte("TerrainPopulated", 0) !== 0 + return new LoadedChunkData( + data: new ChunkData( + new Chunk( + $subChunks, + $chunk->getByte("TerrainPopulated", 0) !== 0 + ), + ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], + ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], ), - ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], - ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], + upgraded: true, + fixerFlags: LoadedChunkData::FIXER_FLAG_ALL ); } diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index f911d00432..3ed185b1f4 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -37,6 +37,7 @@ use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\io\LoadedChunkData; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; use function strlen; @@ -46,7 +47,7 @@ class McRegion extends RegionWorldProvider{ /** * @throws CorruptedChunkException */ - protected function deserializeChunk(string $data) : ?ChunkData{ + protected function deserializeChunk(string $data) : ?LoadedChunkData{ $decompressed = @zlib_decode($data); if($decompressed === false){ throw new CorruptedChunkException("Failed to decompress chunk NBT"); @@ -98,13 +99,17 @@ class McRegion extends RegionWorldProvider{ } } - return new ChunkData( - new Chunk( - $subChunks, - $chunk->getByte("TerrainPopulated", 0) !== 0 + return new LoadedChunkData( + data: new ChunkData( + new Chunk( + $subChunks, + $chunk->getByte("TerrainPopulated", 0) !== 0 + ), + ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], + ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], ), - ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], - ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], + upgraded: true, + fixerFlags: LoadedChunkData::FIXER_FLAG_ALL ); } diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index a5b6f54f7f..a4a3055c63 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -28,9 +28,9 @@ use pocketmine\nbt\tag\ByteArrayTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; use pocketmine\world\format\io\BaseWorldProvider; -use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\data\JavaWorldData; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\io\LoadedChunkData; use pocketmine\world\format\io\WorldData; use Symfony\Component\Filesystem\Path; use function assert; @@ -147,7 +147,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ /** * @throws CorruptedChunkException */ - abstract protected function deserializeChunk(string $data) : ?ChunkData; + abstract protected function deserializeChunk(string $data) : ?LoadedChunkData; /** * @return CompoundTag[] @@ -189,7 +189,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ /** * @throws CorruptedChunkException */ - public function loadChunk(int $chunkX, int $chunkZ) : ?ChunkData{ + public function loadChunk(int $chunkX, int $chunkZ) : ?LoadedChunkData{ $regionX = $regionZ = null; self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); assert(is_int($regionX) && is_int($regionZ)); From ce5e663a733d06efad274078febd998d91ad5374 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:22:39 +0100 Subject: [PATCH 1056/1858] Assume chunks are dirty by default having them be clean by default makes no sense. It only makes sense for them to be clean if they were loaded directly from disk without any alterations. Default clean is a footgun. --- src/world/World.php | 8 +++++++- src/world/format/Chunk.php | 2 +- src/world/format/io/leveldb/LevelDB.php | 12 +----------- src/world/generator/PopulationTask.php | 2 -- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 6942b732ff..b6da5e95d0 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2717,7 +2717,13 @@ class World implements ChunkManager{ return null; } - $this->chunks[$chunkHash] = $loadedChunkData->getData()->getChunk(); + $chunk = $loadedChunkData->getData()->getChunk(); + if(!$loadedChunkData->isUpgraded()){ + $chunk->clearTerrainDirtyFlags(); + }else{ + $this->logger->debug("Chunk $x $z has been upgraded, will be saved at the next autosave opportunity"); + } + $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); $this->initChunk($x, $z, $loadedChunkData->getData()); diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 1a48205a50..fdf8089d2a 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -44,7 +44,7 @@ class Chunk{ public const COORD_BIT_SIZE = SubChunk::COORD_BIT_SIZE; public const COORD_MASK = SubChunk::COORD_MASK; - private int $terrainDirtyFlags = 0; + private int $terrainDirtyFlags = ~0; protected ?bool $lightPopulated = false; protected bool $terrainPopulated = false; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 17d0770b33..5f89800cc6 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -695,18 +695,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: tile ticks, biome states (?) - $chunk = new Chunk( - $subChunks, - $terrainPopulated - ); - - if($hasBeenUpgraded){ - $logger->debug("Flagging chunk as dirty due to upgraded data"); - $chunk->setTerrainDirty(); //trigger rewriting chunk to disk if it was converted from an older format - } - return new LoadedChunkData( - data: new ChunkData($chunk, $entities, $tiles), + data: new ChunkData(new Chunk($subChunks, $terrainPopulated), $entities, $tiles), upgraded: $hasBeenUpgraded, fixerFlags: LoadedChunkData::FIXER_FLAG_ALL //TODO: fill this by version rather than just setting all flags ); diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index e7e2b407c4..7e077f141e 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -117,8 +117,6 @@ class PopulationTask extends AsyncTask{ if($chunk === null){ throw new AssumptionFailedError("We just set this chunk, so it must exist"); } - $chunk->setTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS, true); - $chunk->setTerrainDirtyFlag(Chunk::DIRTY_FLAG_BIOMES, true); } return $chunk; } From d57954dff09ce312840866b23bf4a985c6031ad8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:30:04 +0100 Subject: [PATCH 1057/1858] PopulationTask: ensure that unmodified chunks don't get sent back to the main thread for no reason --- src/world/generator/PopulationTask.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index 7e077f141e..8479a79fa7 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -79,7 +79,14 @@ class PopulationTask extends AsyncTask{ /** @var string[] $serialChunks */ $serialChunks = igbinary_unserialize($this->adjacentChunks); $chunks = array_map( - fn(?string $serialized) => $serialized !== null ? FastChunkSerializer::deserializeTerrain($serialized) : null, + function(?string $serialized) : ?Chunk{ + if($serialized === null){ + return null; + } + $chunk = FastChunkSerializer::deserializeTerrain($serialized); + $chunk->clearTerrainDirtyFlags(); //this allows us to avoid sending existing chunks back to the main thread if they haven't changed during generation + return $chunk; + }, $serialChunks ); From a49842278abd6742ec652f954bf9c6f0766a4532 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:44:00 +0100 Subject: [PATCH 1058/1858] WorldProvider subsystem no longer depends on Chunk Instead, it provides the data needed to construct the chunk, which doesn't require the provider to be aware of anywhere near as much logic. --- src/world/World.php | 15 ++++++++----- src/world/format/io/ChunkData.php | 13 ++++++++--- src/world/format/io/FormatConverter.php | 5 ++--- src/world/format/io/WritableWorldProvider.php | 2 +- src/world/format/io/leveldb/LevelDB.php | 22 ++++++++++--------- .../io/region/LegacyAnvilChunkTrait.php | 6 ++--- src/world/format/io/region/McRegion.php | 6 ++--- .../io/region/WritableRegionWorldProvider.php | 2 +- 8 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index b6da5e95d0..b2b6dfac2a 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1400,10 +1400,11 @@ class World implements ChunkManager{ foreach($this->chunks as $chunkHash => $chunk){ self::getXZ($chunkHash, $chunkX, $chunkZ); $this->provider->saveChunk($chunkX, $chunkZ, new ChunkData( - $chunk, + $chunk->getSubChunks(), + $chunk->isPopulated(), array_map(fn(Entity $e) => $e->saveNBT(), array_filter($this->getChunkEntities($chunkX, $chunkZ), fn(Entity $e) => $e->canSaveWithChunk())), array_map(fn(Tile $t) => $t->saveNBT(), $chunk->getTiles()), - )); + ), $chunk->getTerrainDirtyFlags()); $chunk->clearTerrainDirtyFlags(); } }finally{ @@ -2717,7 +2718,8 @@ class World implements ChunkManager{ return null; } - $chunk = $loadedChunkData->getData()->getChunk(); + $chunkData = $loadedChunkData->getData(); + $chunk = new Chunk($chunkData->getSubChunks(), $chunkData->isPopulated()); if(!$loadedChunkData->isUpgraded()){ $chunk->clearTerrainDirtyFlags(); }else{ @@ -2726,7 +2728,7 @@ class World implements ChunkManager{ $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); - $this->initChunk($x, $z, $loadedChunkData->getData()); + $this->initChunk($x, $z, $chunkData); (new ChunkLoadEvent($this, $x, $z, $this->chunks[$chunkHash], false))->call(); @@ -2853,10 +2855,11 @@ class World implements ChunkManager{ $this->timings->syncChunkSave->startTiming(); try{ $this->provider->saveChunk($x, $z, new ChunkData( - $chunk, + $chunk->getSubChunks(), + $chunk->isPopulated(), array_map(fn(Entity $e) => $e->saveNBT(), array_filter($this->getChunkEntities($x, $z), fn(Entity $e) => $e->canSaveWithChunk())), array_map(fn(Tile $t) => $t->saveNBT(), $chunk->getTiles()), - )); + ), $chunk->getTerrainDirtyFlags()); }finally{ $this->timings->syncChunkSave->stopTiming(); } diff --git a/src/world/format/io/ChunkData.php b/src/world/format/io/ChunkData.php index edd28dcbf6..458e001962 100644 --- a/src/world/format/io/ChunkData.php +++ b/src/world/format/io/ChunkData.php @@ -24,21 +24,28 @@ declare(strict_types=1); namespace pocketmine\world\format\io; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\world\format\Chunk; +use pocketmine\world\format\SubChunk; final class ChunkData{ /** + * @param SubChunk[] $subChunks * @param CompoundTag[] $entityNBT * @param CompoundTag[] $tileNBT */ public function __construct( - private Chunk $chunk, + private array $subChunks, + private bool $populated, private array $entityNBT, private array $tileNBT ){} - public function getChunk() : Chunk{ return $this->chunk; } + /** + * @return SubChunk[] + */ + public function getSubChunks() : array{ return $this->subChunks; } + + public function isPopulated() : bool{ return $this->populated; } /** @return CompoundTag[] */ public function getEntityNBT() : array{ return $this->entityNBT; } diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index e318d7c62a..2dcbe398e1 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io; use pocketmine\utils\Filesystem; +use pocketmine\world\format\Chunk; use pocketmine\world\generator\GeneratorManager; use pocketmine\world\generator\normal\Normal; use pocketmine\world\WorldCreationOptions; @@ -142,9 +143,7 @@ class FormatConverter{ $thisRound = $start; foreach($this->oldProvider->getAllChunks(true, $this->logger) as $coords => $loadedChunkData){ [$chunkX, $chunkZ] = $coords; - $chunkData = $loadedChunkData->getData(); - $chunkData->getChunk()->setTerrainDirty(); - $new->saveChunk($chunkX, $chunkZ, $chunkData); + $new->saveChunk($chunkX, $chunkZ, $loadedChunkData->getData(), ~0); $counter++; if(($counter % $this->chunksPerProgressUpdate) === 0){ $time = microtime(true); diff --git a/src/world/format/io/WritableWorldProvider.php b/src/world/format/io/WritableWorldProvider.php index 8ed1b0c094..5c6344b527 100644 --- a/src/world/format/io/WritableWorldProvider.php +++ b/src/world/format/io/WritableWorldProvider.php @@ -27,5 +27,5 @@ interface WritableWorldProvider extends WorldProvider{ /** * Saves a chunk (usually to disk). */ - public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void; + public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData, int $dirtyFlags) : void; } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 5f89800cc6..c0ae51673d 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -290,12 +290,15 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return $result; } - private static function serialize3dBiomes(BinaryStream $stream, Chunk $chunk) : void{ + /** + * @param SubChunk[] $subChunks + */ + private static function serialize3dBiomes(BinaryStream $stream, array $subChunks) : void{ //TODO: the server-side min/max may not coincide with the world storage min/max - we may need additional logic to handle this for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; $y++){ //TODO: is it worth trying to use the previous palette if it's the same as the current one? vanilla supports //this, but it's not clear if it's worth the effort to implement. - self::serializeBiomePalette($stream, $chunk->getSubChunk($y)->getBiomeArray()); + self::serializeBiomePalette($stream, $subChunks[$y]->getBiomeArray()); } } @@ -696,13 +699,13 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: tile ticks, biome states (?) return new LoadedChunkData( - data: new ChunkData(new Chunk($subChunks, $terrainPopulated), $entities, $tiles), + data: new ChunkData($subChunks, $terrainPopulated, $entities, $tiles), upgraded: $hasBeenUpgraded, fixerFlags: LoadedChunkData::FIXER_FLAG_ALL //TODO: fill this by version rather than just setting all flags ); } - public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void{ + public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData, int $dirtyFlags) : void{ $index = LevelDB::chunkIndex($chunkX, $chunkZ); $write = new \LevelDBWriteBatch(); @@ -710,10 +713,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $write->put($index . ChunkDataKey::NEW_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); $write->put($index . ChunkDataKey::PM_DATA_VERSION, Binary::writeLLong(VersionInfo::WORLD_DATA_VERSION)); - $chunk = $chunkData->getChunk(); + $subChunks = $chunkData->getSubChunks(); - if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)){ - $subChunks = $chunk->getSubChunks(); + if(($dirtyFlags & Chunk::DIRTY_FLAG_BLOCKS) !== 0){ foreach($subChunks as $y => $subChunk){ $key = $index . ChunkDataKey::SUBCHUNK . chr($y); @@ -734,16 +736,16 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } } - if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BIOMES)){ + if(($dirtyFlags & Chunk::DIRTY_FLAG_BIOMES) !== 0){ $write->delete($index . ChunkDataKey::HEIGHTMAP_AND_2D_BIOMES); $stream = new BinaryStream(); $stream->put(str_repeat("\x00", 512)); //fake heightmap - self::serialize3dBiomes($stream, $chunk); + self::serialize3dBiomes($stream, $subChunks); $write->put($index . ChunkDataKey::HEIGHTMAP_AND_3D_BIOMES, $stream->getBuffer()); } //TODO: use this properly - $write->put($index . ChunkDataKey::FINALIZATION, chr($chunk->isPopulated() ? self::FINALISATION_DONE : self::FINALISATION_NEEDS_POPULATION)); + $write->put($index . ChunkDataKey::FINALIZATION, chr($chunkData->isPopulated() ? self::FINALISATION_DONE : self::FINALISATION_NEEDS_POPULATION)); $this->writeTags($chunkData->getTileNBT(), $index . ChunkDataKey::BLOCK_ENTITIES, $write); $this->writeTags($chunkData->getEntityNBT(), $index . ChunkDataKey::ENTITIES, $write); diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index 84bbb72f7d..ffb7b585a6 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -102,10 +102,8 @@ trait LegacyAnvilChunkTrait{ return new LoadedChunkData( data: new ChunkData( - new Chunk( - $subChunks, - $chunk->getByte("TerrainPopulated", 0) !== 0 - ), + $subChunks, + $chunk->getByte("TerrainPopulated", 0) !== 0, ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], ), diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 3ed185b1f4..b596e33af1 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -101,10 +101,8 @@ class McRegion extends RegionWorldProvider{ return new LoadedChunkData( data: new ChunkData( - new Chunk( - $subChunks, - $chunk->getByte("TerrainPopulated", 0) !== 0 - ), + $subChunks, + $chunk->getByte("TerrainPopulated", 0) !== 0, ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], ), diff --git a/src/world/format/io/region/WritableRegionWorldProvider.php b/src/world/format/io/region/WritableRegionWorldProvider.php index 56cc2ff710..40353f5f9e 100644 --- a/src/world/format/io/region/WritableRegionWorldProvider.php +++ b/src/world/format/io/region/WritableRegionWorldProvider.php @@ -53,7 +53,7 @@ abstract class WritableRegionWorldProvider extends RegionWorldProvider implement abstract protected function serializeChunk(ChunkData $chunk) : string; - public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void{ + public function saveChunk(int $chunkX, int $chunkZ, ChunkData $chunkData, int $dirtyFlags) : void{ self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); $this->loadRegion($regionX, $regionZ)->writeChunk($chunkX & 0x1f, $chunkZ & 0x1f, $this->serializeChunk($chunkData)); } From 5a9cdef40c4a66d6b59d9fb4428f021030791fc3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:45:19 +0100 Subject: [PATCH 1059/1858] Chunk: added DIRTY_FLAGS_ALL and DIRTY_FLAGS_NONE --- src/world/format/Chunk.php | 11 +++++++---- src/world/format/io/FormatConverter.php | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index fdf8089d2a..1f94ad9d0d 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -36,6 +36,9 @@ class Chunk{ public const DIRTY_FLAG_BLOCKS = 1 << 0; public const DIRTY_FLAG_BIOMES = 1 << 3; + public const DIRTY_FLAGS_ALL = ~0; + public const DIRTY_FLAGS_NONE = 0; + public const MIN_SUBCHUNK_INDEX = -4; public const MAX_SUBCHUNK_INDEX = 19; public const MAX_SUBCHUNKS = self::MAX_SUBCHUNK_INDEX - self::MIN_SUBCHUNK_INDEX + 1; @@ -44,7 +47,7 @@ class Chunk{ public const COORD_BIT_SIZE = SubChunk::COORD_BIT_SIZE; public const COORD_MASK = SubChunk::COORD_MASK; - private int $terrainDirtyFlags = ~0; + private int $terrainDirtyFlags = self::DIRTY_FLAGS_ALL; protected ?bool $lightPopulated = false; protected bool $terrainPopulated = false; @@ -248,7 +251,7 @@ class Chunk{ } public function isTerrainDirty() : bool{ - return $this->terrainDirtyFlags !== 0; + return $this->terrainDirtyFlags !== self::DIRTY_FLAGS_NONE; } public function getTerrainDirtyFlag(int $flag) : bool{ @@ -268,11 +271,11 @@ class Chunk{ } public function setTerrainDirty() : void{ - $this->terrainDirtyFlags = ~0; + $this->terrainDirtyFlags = self::DIRTY_FLAGS_ALL; } public function clearTerrainDirtyFlags() : void{ - $this->terrainDirtyFlags = 0; + $this->terrainDirtyFlags = self::DIRTY_FLAGS_NONE; } public function getSubChunk(int $y) : SubChunk{ diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index 2dcbe398e1..1d485afa21 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -143,7 +143,7 @@ class FormatConverter{ $thisRound = $start; foreach($this->oldProvider->getAllChunks(true, $this->logger) as $coords => $loadedChunkData){ [$chunkX, $chunkZ] = $coords; - $new->saveChunk($chunkX, $chunkZ, $loadedChunkData->getData(), ~0); + $new->saveChunk($chunkX, $chunkZ, $loadedChunkData->getData(), Chunk::DIRTY_FLAGS_ALL); $counter++; if(($counter % $this->chunksPerProgressUpdate) === 0){ $time = microtime(true); From 8744032ab6e19baf4e902e61b39fb7b2f8f73f44 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 18:26:23 +0100 Subject: [PATCH 1060/1858] Fixed empty block handling after blockstate ID XOR change --- src/block/Block.php | 5 +++++ src/world/format/Chunk.php | 7 +++---- src/world/format/io/leveldb/LevelDB.php | 15 +++++++-------- src/world/format/io/region/Anvil.php | 3 +-- .../format/io/region/LegacyAnvilChunkTrait.php | 3 +-- src/world/format/io/region/McRegion.php | 5 ++--- src/world/format/io/region/PMAnvil.php | 3 +-- tests/phpunit/block/BlockTest.php | 5 +++++ 8 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 29990bd1c7..21781d1702 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -58,6 +58,11 @@ class Block{ public const INTERNAL_STATE_DATA_BITS = 8; public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS); + /** + * @internal + */ + public const EMPTY_STATE_ID = (BlockTypeIds::AIR << self::INTERNAL_STATE_DATA_BITS) | (BlockTypeIds::AIR & self::INTERNAL_STATE_DATA_MASK); + protected BlockIdentifier $idInfo; protected string $fallbackName; protected BlockTypeInfo $typeInfo; diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 1f94ad9d0d..e4c877dc91 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -27,7 +27,6 @@ declare(strict_types=1); namespace pocketmine\world\format; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\block\tile\Tile; use pocketmine\data\bedrock\BiomeIds; use function array_map; @@ -71,7 +70,7 @@ class Chunk{ foreach($this->subChunks as $y => $null){ //TODO: we should probably require all subchunks to be provided here - $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], new PalettedBlockArray(BiomeIds::OCEAN)); + $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(Block::EMPTY_STATE_ID, [], new PalettedBlockArray(BiomeIds::OCEAN)); } $val = (self::MAX_SUBCHUNK_INDEX + 1) * SubChunk::EDGE_LENGTH; @@ -293,8 +292,8 @@ class Chunk{ throw new \InvalidArgumentException("Invalid subchunk Y coordinate $y"); } - $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], new PalettedBlockArray(BiomeIds::OCEAN)); - $this->setTerrainDirtyFlag(self::DIRTY_FLAG_BLOCKS, true); + $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(Block::EMPTY_STATE_ID, [], new PalettedBlockArray(BiomeIds::OCEAN)); + $this->terrainDirtyFlags |= self::DIRTY_FLAG_BLOCKS; } /** diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index c0ae51673d..a42d8d53eb 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\nbt\LittleEndianNbtSerializer; @@ -355,7 +354,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockStateId = $this->blockStateDeserializer->deserialize($blockStateData); if(!isset($extraDataLayers[$ySub])){ - $extraDataLayers[$ySub] = new PalettedBlockArray(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS); + $extraDataLayers[$ySub] = new PalettedBlockArray(Block::EMPTY_STATE_ID); } $extraDataLayers[$ySub]->set($x, $y, $z, $blockStateId); } @@ -417,13 +416,13 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if(isset($convertedLegacyExtraData[$yy])){ $storages[] = $convertedLegacyExtraData[$yy]; } - $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, clone $biomes3d); + $subChunks[$yy] = new SubChunk(Block::EMPTY_STATE_ID, $storages, clone $biomes3d); } //make sure extrapolated biomes get filled in correctly for($yy = Chunk::MIN_SUBCHUNK_INDEX; $yy <= Chunk::MAX_SUBCHUNK_INDEX; ++$yy){ if(!isset($subChunks[$yy])){ - $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); + $subChunks[$yy] = new SubChunk(Block::EMPTY_STATE_ID, [], clone $biomes3d); } } @@ -457,7 +456,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $storages[] = $convertedLegacyExtraData; } - return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + return new SubChunk(Block::EMPTY_STATE_ID, $storages, $biomePalette); } /** @@ -481,7 +480,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if($convertedLegacyExtraData !== null){ $storages[] = $convertedLegacyExtraData; } - return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + return new SubChunk(Block::EMPTY_STATE_ID, $storages, $biomePalette); case SubChunkVersion::PALETTED_MULTI: case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: //legacy extradata layers intentionally ignored because they aren't supposed to exist in v8 @@ -496,7 +495,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ for($k = 0; $k < $storageCount; ++$k){ $storages[] = $this->deserializeBlockPalette($binaryStream, $logger); } - return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages, $biomePalette); + return new SubChunk(Block::EMPTY_STATE_ID, $storages, $biomePalette); default: //this should never happen - an unsupported chunk appearing in a supported world is a sign of corruption throw new CorruptedChunkException("don't know how to decode LevelDB subchunk format version $subChunkVersion"); @@ -526,7 +525,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $subChunkKeyOffset = self::hasOffsetCavesAndCliffsSubChunks($chunkVersion) ? self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET : 0; for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ if(($data = $this->db->get($index . ChunkDataKey::SUBCHUNK . chr($y + $subChunkKeyOffset))) === false){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], $biomeArrays[$y]); + $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [], $biomeArrays[$y]); continue; } diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index c1b6b96718..abefc9f255 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; @@ -33,7 +32,7 @@ class Anvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ - return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkYZX( + return new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkYZX( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) )], $biomes3d); diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index ffb7b585a6..ba97d43b5e 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\NbtDataException; @@ -96,7 +95,7 @@ trait LegacyAnvilChunkTrait{ } for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ if(!isset($subChunks[$y])){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); + $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [], clone $biomes3d); } } diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index b596e33af1..878c84df47 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\NbtDataException; @@ -91,11 +90,11 @@ class McRegion extends RegionWorldProvider{ $fullData = self::readFixedSizeByteArray($chunk, "Data", 16384); for($y = 0; $y < 8; ++$y){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)], clone $biomes3d); + $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)], clone $biomes3d); } for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ if(!isset($subChunks[$y])){ - $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [], clone $biomes3d); + $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [], clone $biomes3d); } } diff --git a/src/world/format/io/region/PMAnvil.php b/src/world/format/io/region/PMAnvil.php index 8d31f73bc5..41dc0fa80d 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\format\SubChunk; @@ -37,7 +36,7 @@ class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ - return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkXZY( + return new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkXZY( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) )], $biomes3d); diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 81f1c35166..711b7e51aa 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -119,4 +119,9 @@ class BlockTest extends TestCase{ self::assertSame($name, $states[$k]->getName()); } } + + public function testEmptyStateId() : void{ + $block = $this->blockFactory->fromStateId(Block::EMPTY_STATE_ID); + self::assertInstanceOf(Air::class, $block); + } } From fe2140a71601194a4cf523e610fc5e1132e33d0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 21:36:46 +0100 Subject: [PATCH 1061/1858] Bump shivammathur/setup-php from 2.25.1 to 2.25.2 (#5766) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.25.1 to 2.25.2. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.25.1...2.25.2) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 6377912e4e..5f4e944a8d 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.1 + uses: shivammathur/setup-php@2.25.2 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 372d89c700..ac2e65b2f3 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -18,7 +18,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.25.1 + uses: shivammathur/setup-php@2.25.2 with: php-version: 8.1 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 08adcf7d10..c66ad03b4e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -203,7 +203,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.1 + uses: shivammathur/setup-php@2.25.2 with: php-version: 8.1 tools: php-cs-fixer:3.16 From 691e67018d67be41df65fa0683c93b7a3fd8bdd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 21:36:58 +0100 Subject: [PATCH 1062/1858] Bump phpstan/phpstan-phpunit from 1.3.11 to 1.3.13 (#5772) Bumps [phpstan/phpstan-phpunit](https://github.com/phpstan/phpstan-phpunit) from 1.3.11 to 1.3.13. - [Release notes](https://github.com/phpstan/phpstan-phpunit/releases) - [Commits](https://github.com/phpstan/phpstan-phpunit/compare/1.3.11...1.3.13) --- updated-dependencies: - dependency-name: phpstan/phpstan-phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 7fd54f9d53..6e422f94f6 100644 --- a/composer.lock +++ b/composer.lock @@ -1795,16 +1795,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.11", + "version": "1.3.13", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c" + "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c", - "reference": "9e1b9de6d260461f6e99b6a8f2dbb0bbb98b579c", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d8bdab0218c5eb0964338d24a8511b65e9c94fa5", + "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5", "shasum": "" }, "require": { @@ -1841,9 +1841,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.11" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.13" }, - "time": "2023-03-25T19:42:13+00:00" + "time": "2023-05-26T11:05:59+00:00" }, { "name": "phpstan/phpstan-strict-rules", From ea92a23d0d56ea209d44225be3791e8245ad3e68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 21:37:18 +0100 Subject: [PATCH 1063/1858] Bump build/php from `b1d5c0d` to `f2ece7b` (#5765) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `b1d5c0d` to `f2ece7b`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/b1d5c0d737be86538bb35e1408cd53a616de5a27...f2ece7b30d0364eebf1d79497003cfda1dc41aa8) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index b1d5c0d737..f2ece7b30d 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit b1d5c0d737be86538bb35e1408cd53a616de5a27 +Subproject commit f2ece7b30d0364eebf1d79497003cfda1dc41aa8 From 09668a37d66c6023685a948b7550c918620e98f2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 14:17:09 +0100 Subject: [PATCH 1064/1858] Use fork of JsonMapper to solve cweiske/JsonMapper#210 --- composer.json | 10 ++++++++-- composer.lock | 30 +++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/composer.json b/composer.json index f3754ed1fb..70727ce635 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", - "netresearch/jsonmapper": "^4.0", + "netresearch/jsonmapper": "dev-array-in-string-property-error as 4.2.0", "pocketmine/bedrock-block-upgrade-schema": "~2.1.0+bedrock-1.19.80", "pocketmine/bedrock-data": "~2.2.0+bedrock-1.19.80", "pocketmine/bedrock-item-upgrade-schema": "~1.2.0+bedrock-1.19.80", @@ -93,5 +93,11 @@ "update-translation-apis": [ "@php build/generate-known-translation-apis.php" ] - } + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/dktapps/JsonMapper.git" + } + ] } diff --git a/composer.lock b/composer.lock index 7fd54f9d53..cfefe49b57 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8cd9901818949493821aaf543667aac4", + "content-hash": "6982184bc024b09473e58578eb7ee8bf", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.2.0", + "version": "dev-array-in-string-property-error", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" + "url": "https://github.com/dktapps/jsonmapper.git", + "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", + "url": "https://api.github.com/repos/dktapps/jsonmapper/zipball/4a82d1b98b99d682b660d6caa9b3816b2abc794c", + "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c", "shasum": "" }, "require": { @@ -227,7 +227,6 @@ "JsonMapper": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "OSL-3.0" ], @@ -243,9 +242,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" + "source": "https://github.com/dktapps/jsonmapper/tree/array-in-string-property-error" }, - "time": "2023-04-09T17:37:40+00:00" + "time": "2023-05-30T13:10:31+00:00" }, { "name": "pocketmine/bedrock-block-upgrade-schema", @@ -3276,9 +3275,18 @@ "time": "2021-07-28T10:34:58+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "netresearch/jsonmapper", + "version": "dev-array-in-string-property-error", + "alias": "4.2.0", + "alias_normalized": "4.2.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "netresearch/jsonmapper": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 76749cbaa742151cca838156f50baca5e2eb55c3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 14:30:28 +0100 Subject: [PATCH 1065/1858] Use fork of JsonMapper to solve cweiske/jsonmapper#210 --- composer.json | 10 ++++++++-- composer.lock | 30 +++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/composer.json b/composer.json index 7650b7f367..be734bea44 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", - "netresearch/jsonmapper": "^4.0", + "netresearch/jsonmapper": "dev-array-in-string-property-error as 4.2.0", "pocketmine/bedrock-block-upgrade-schema": "~2.1.0+bedrock-1.19.80", "pocketmine/bedrock-data": "~2.2.0+bedrock-1.19.80", "pocketmine/bedrock-item-upgrade-schema": "~1.2.0+bedrock-1.19.80", @@ -93,5 +93,11 @@ "update-translation-apis": [ "@php build/generate-known-translation-apis.php" ] - } + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/dktapps/JsonMapper.git" + } + ] } diff --git a/composer.lock b/composer.lock index bad0235cb7..c7fff9bccd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7ca2d4ed0987ac17cf615d67945f5687", + "content-hash": "80cc5ebf379cf4f425bf98e10611713e", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.2.0", + "version": "dev-array-in-string-property-error", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" + "url": "https://github.com/dktapps/jsonmapper.git", + "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", + "url": "https://api.github.com/repos/dktapps/jsonmapper/zipball/4a82d1b98b99d682b660d6caa9b3816b2abc794c", + "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c", "shasum": "" }, "require": { @@ -227,7 +227,6 @@ "JsonMapper": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "OSL-3.0" ], @@ -243,9 +242,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" + "source": "https://github.com/dktapps/jsonmapper/tree/array-in-string-property-error" }, - "time": "2023-04-09T17:37:40+00:00" + "time": "2023-05-30T13:10:31+00:00" }, { "name": "pocketmine/bedrock-block-upgrade-schema", @@ -3480,9 +3479,18 @@ "time": "2021-07-28T10:34:58+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "netresearch/jsonmapper", + "version": "dev-array-in-string-property-error", + "alias": "4.2.0", + "alias_normalized": "4.2.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "netresearch/jsonmapper": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From e7bdaa8579889243e236a98af5fdb5240486222d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 14:35:17 +0100 Subject: [PATCH 1066/1858] Release 4.20.5 --- changelogs/4.20.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.20.md b/changelogs/4.20.md index 37a0ef37bc..c767b82205 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -71,3 +71,9 @@ Released 6th May 2023. ## Fixes - Fixed players being forced into flight mode in every game mode. - Moral of the story: do not assume anything in Mojang internals does what its name suggests... + +# 4.20.5 +Released 30th May 2023. + +## Fixes +- Fixed server crash due to a bug in upstream dependency [`netresearch/jsonmapper`](https://github.com/cweiske/JsonMapper). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 60013af1b1..389ab0e2d9 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,7 +31,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.4"; + public const BASE_VERSION = "4.20.5"; public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; From f2df702c67720ac1e178ffe578faeee70aef5819 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 14:42:59 +0100 Subject: [PATCH 1067/1858] Release 4.21.1 --- changelogs/4.21.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.21.md b/changelogs/4.21.md index 34254d6b2c..da4cc78c0a 100644 --- a/changelogs/4.21.md +++ b/changelogs/4.21.md @@ -69,3 +69,9 @@ Released 17th May 2023. - Registered but ineligible ticking chunks are no longer rechecked every tick. - This was causing wasted cycles during async worker backlog. - The internal system must call `markTickingChunkForRecheck()` whenever a ticking chunk's eligibility for ticking has potentially changed, rather than just when it has changed from a yes to a no. + +# 4.21.1 +Released 30th May 2023. + +## Fixes +- Fixed server crash due to a bug in upstream dependency [`netresearch/jsonmapper`](https://github.com/cweiske/JsonMapper). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index ea1082c128..4dd279578f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.21.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From d343db8750449c10a017866156bf3746ca6f0898 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 14:42:59 +0100 Subject: [PATCH 1068/1858] 4.21.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4dd279578f..b6253b5705 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.21.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.21.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 20942b37ebe39b6a4454f71e78a220cd54802d66 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 16:07:01 +0100 Subject: [PATCH 1069/1858] Update composer dependencies --- composer.lock | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index fc950fadd7..7f675943c5 100644 --- a/composer.lock +++ b/composer.lock @@ -506,6 +506,7 @@ "issues": "https://github.com/pmmp/ClassLoader/issues", "source": "https://github.com/pmmp/ClassLoader/tree/0.2.0" }, + "abandoned": "pocketmine/pocketmine-mp", "time": "2021-11-01T20:17:27+00:00" }, { @@ -691,6 +692,7 @@ "issues": "https://github.com/pmmp/LogPthreads/issues", "source": "https://github.com/pmmp/LogPthreads/tree/0.4.0" }, + "abandoned": "pocketmine/pocketmine-mp", "time": "2021-11-01T21:42:09+00:00" }, { @@ -1565,16 +1567,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.15.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", "shasum": "" }, "require": { @@ -1615,9 +1617,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-05-19T20:20:00+00:00" }, { "name": "phar-io/manifest", @@ -1895,16 +1897,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.1", + "version": "10.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "884a0da7f9f46f28b2cb69134217fd810b793974" + "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974", - "reference": "884a0da7f9f46f28b2cb69134217fd810b793974", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/db1497ec8dd382e82c962f7abbe0320e4882ee4e", + "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e", "shasum": "" }, "require": { @@ -1961,7 +1963,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.2" }, "funding": [ { @@ -1969,7 +1971,7 @@ "type": "github" } ], - "time": "2023-04-17T12:15:40+00:00" + "time": "2023-05-22T09:04:27+00:00" }, { "name": "phpunit/php-file-iterator", From 4f4dca7fc05634dca27bad33f70ae08d9be699ae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2023 21:41:25 +0100 Subject: [PATCH 1070/1858] Mark WoodLikeBlockIdHelper as internal --- src/block/WoodLikeBlockIdHelper.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php index a7aacb6498..a4134669ad 100644 --- a/src/block/WoodLikeBlockIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -42,6 +42,8 @@ use pocketmine\utils\AssumptionFailedError; * as flammability, hardness, required tool tier, etc. * Therefore, to stay on the safe side of Mojang, wood-like blocks have static types. This does unfortunately generate * a lot of ugly code. + * + * @internal */ final class WoodLikeBlockIdHelper{ From 3948dc4f752019ced90dbdd0c7cc9863693abca5 Mon Sep 17 00:00:00 2001 From: Muqsit Rayyan Date: Wed, 31 May 2023 18:03:14 +0500 Subject: [PATCH 1071/1858] Remove calls to ReflectionProperty::setAccessible() (#5783) This is a no-op in PHP 8.1 and up. --- src/MemoryManager.php | 6 ------ src/crash/CrashDump.php | 1 - 2 files changed, 7 deletions(-) diff --git a/src/MemoryManager.php b/src/MemoryManager.php index e04c5e857c..1db31615d0 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -316,9 +316,6 @@ class MemoryManager{ continue; } - if(!$property->isPublic()){ - $property->setAccessible(true); - } if(!$property->isInitialized()){ continue; } @@ -442,9 +439,6 @@ class MemoryManager{ continue; } } - if(!$property->isPublic()){ - $property->setAccessible(true); - } if(!$property->isInitialized($object)){ continue; } diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index 388550ac35..d7223eb2f1 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -248,7 +248,6 @@ class CrashDump{ if(file_exists($filePath)){ $reflection = new \ReflectionClass(PluginBase::class); $file = $reflection->getProperty("file"); - $file->setAccessible(true); foreach($this->server->getPluginManager()->getPlugins() as $plugin){ $filePath = Filesystem::cleanPath($file->getValue($plugin)); if(str_starts_with($frameCleanPath, $filePath)){ From 07225df936e061b3779d8a82164aeb83b21b465f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 31 May 2023 21:48:06 +0100 Subject: [PATCH 1072/1858] Block: fixed tile-stored properties sticking to the item in asItem() this was enabling duplication of items, since the dropped item object would contain a Block which still referenced the framed Item. --- src/block/Block.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 21781d1702..f838ca4503 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -73,7 +73,8 @@ class Block{ private int $requiredBlockItemStateDataBits; private int $requiredBlockOnlyStateDataBits; - private int $defaultBlockOnlyStateData; + + private Block $defaultState; /** * @param string $name English name of the block type (TODO: implement translations) @@ -92,7 +93,7 @@ class Block{ $this->describeBlockOnlyState($calculator); $this->requiredBlockOnlyStateDataBits = $calculator->getBitsUsed(); - $this->defaultBlockOnlyStateData = $this->encodeBlockOnlyState(); + $this->defaultState = clone $this; } public function __clone(){ @@ -193,10 +194,11 @@ class Block{ * Returns the block as an item. * Block-only state such as facing, powered/unpowered, open/closed, etc., is discarded. * Block-item state such as colour, wood type, etc. is preserved. + * Complex state properties stored in the tile data (e.g. inventory) are discarded. */ public function asItem() : Item{ - $normalized = clone $this; - $normalized->decodeBlockOnlyState($this->defaultBlockOnlyStateData); + $normalized = clone $this->defaultState; + $normalized->decodeBlockItemState($this->encodeBlockItemState()); return new ItemBlock($normalized); } From 1101f35c171b3fc82fc51af7932f72a0542fd229 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 31 May 2023 22:09:33 +0100 Subject: [PATCH 1073/1858] Update setup-php-action to 2.0.0 this version vastly improves build time by using optimized prebuilts instead of building the binaries on the runner. --- .github/workflows/main.yml | 57 +++++------------------ .github/workflows/update-php-versions.php | 50 -------------------- 2 files changed, 12 insertions(+), 95 deletions(-) delete mode 100644 .github/workflows/update-php-versions.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c66ad03b4e..5469882f70 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,47 +6,26 @@ on: workflow_dispatch: jobs: - build-php: - name: Prepare PHP - runs-on: ${{ matrix.image }} - - strategy: - matrix: - image: [ubuntu-20.04] - php: [8.1.19, 8.2.6] - - steps: - - name: Build and prepare PHP cache - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 - with: - php-version: ${{ matrix.php }} - install-path: "./bin" - pm-version-major: "4" - phpstan: name: PHPStan analysis - needs: build-php runs-on: ${{ matrix.image }} strategy: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.1.19, 8.2.6] + php: ["8.1", "8.2"] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@2.0.0 with: php-version: ${{ matrix.php }} install-path: "./bin" pm-version-major: "4" - - name: Install Composer - run: curl -sS https://getcomposer.org/installer | php - - name: Restore Composer package cache uses: actions/cache@v3 with: @@ -58,34 +37,30 @@ jobs: composer-v2-cache- - name: Install Composer dependencies - run: php composer.phar install --prefer-dist --no-interaction + run: composer install --prefer-dist --no-interaction - name: Run PHPStan run: ./vendor/bin/phpstan analyze --no-progress --memory-limit=2G phpunit: name: PHPUnit tests - needs: build-php runs-on: ${{ matrix.image }} strategy: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.1.19, 8.2.6] + php: ["8.1", "8.2"] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@2.0.0 with: php-version: ${{ matrix.php }} install-path: "./bin" pm-version-major: "4" - - name: Install Composer - run: curl -sS https://getcomposer.org/installer | php - - name: Restore Composer package cache uses: actions/cache@v3 with: @@ -97,20 +72,19 @@ jobs: composer-v2-cache- - name: Install Composer dependencies - run: php composer.phar install --prefer-dist --no-interaction + run: composer install --prefer-dist --no-interaction - name: Run PHPUnit tests run: ./vendor/bin/phpunit --bootstrap vendor/autoload.php --fail-on-warning tests/phpunit integration: name: Integration tests - needs: build-php runs-on: ${{ matrix.image }} strategy: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.1.19, 8.2.6] + php: ["8.1", "8.2"] steps: - uses: actions/checkout@v3 @@ -118,15 +92,12 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@2.0.0 with: php-version: ${{ matrix.php }} install-path: "./bin" pm-version-major: "4" - - name: Install Composer - run: curl -sS https://getcomposer.org/installer | php - - name: Restore Composer package cache uses: actions/cache@v3 with: @@ -138,34 +109,30 @@ jobs: composer-v2-cache- - name: Install Composer dependencies - run: php composer.phar install --no-dev --prefer-dist --no-interaction + run: composer install --no-dev --prefer-dist --no-interaction - name: Run integration tests run: ./tests/travis.sh -t4 codegen: name: Generated Code consistency checks - needs: build-php runs-on: ${{ matrix.image }} strategy: fail-fast: false matrix: image: [ubuntu-20.04] - php: [8.1.19, 8.2.6] + php: ["8.1", "8.2"] steps: - uses: actions/checkout@v3 - name: Setup PHP - uses: pmmp/setup-php-action@c7fb29d83535320922068087c7285bdedbbfa3c2 + uses: pmmp/setup-php-action@2.0.0 with: php-version: ${{ matrix.php }} install-path: "./bin" pm-version-major: "4" - - name: Install Composer - run: curl -sS https://getcomposer.org/installer | php - - name: Restore Composer package cache uses: actions/cache@v3 with: @@ -177,7 +144,7 @@ jobs: composer-v2-cache- - name: Install Composer dependencies - run: php composer.phar install --no-dev --prefer-dist --no-interaction + run: composer install --no-dev --prefer-dist --no-interaction - name: Regenerate registry annotations run: php build/generate-registry-annotations.php src diff --git a/.github/workflows/update-php-versions.php b/.github/workflows/update-php-versions.php deleted file mode 100644 index 2455ba101a..0000000000 --- a/.github/workflows/update-php-versions.php +++ /dev/null @@ -1,50 +0,0 @@ - Date: Wed, 31 May 2023 22:18:25 +0100 Subject: [PATCH 1074/1858] Fix CS --- src/inventory/CreativeInventory.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 746c6b81b0..7502a6785f 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -28,7 +28,6 @@ use pocketmine\crafting\json\ItemStackData; use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\item\Item; use pocketmine\utils\DestructorCallbackTrait; -use pocketmine\utils\Filesystem; use pocketmine\utils\ObjectSet; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; From b72da777eb1cfd5c9a096a1ac1e4e43302fb41e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 13:45:20 +0100 Subject: [PATCH 1075/1858] Bump tests/plugins/DevTools from `a67f9af` to `a2f36e8` (#5785) Bumps [tests/plugins/DevTools](https://github.com/pmmp/DevTools) from `a67f9af` to `a2f36e8`. - [Release notes](https://github.com/pmmp/DevTools/releases) - [Commits](https://github.com/pmmp/DevTools/compare/a67f9af8d6cff1615975c68a9b171a8f09aac0c4...a2f36e8dbf2eb048826f5381f8b5215118eed03c) --- updated-dependencies: - dependency-name: tests/plugins/DevTools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index a67f9af8d6..a2f36e8dbf 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit a67f9af8d6cff1615975c68a9b171a8f09aac0c4 +Subproject commit a2f36e8dbf2eb048826f5381f8b5215118eed03c From 3e87ad281f3d194fdea93e709bc59667da66e3f4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 1 Jun 2023 14:51:04 +0100 Subject: [PATCH 1076/1858] Use tagged fork of netresearch/jsonmapper we need this for it to not be a huge pain in the ass to install PM as a composer dependency, which plugin CIs may do. --- composer.json | 10 +---- composer.lock | 119 ++++++++++++++++++++++++-------------------------- 2 files changed, 59 insertions(+), 70 deletions(-) diff --git a/composer.json b/composer.json index 70727ce635..4bd3a7f462 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "^1.1", "fgrosse/phpasn1": "^2.3", - "netresearch/jsonmapper": "dev-array-in-string-property-error as 4.2.0", + "pocketmine/netresearch-jsonmapper": "~v4.2.999", "pocketmine/bedrock-block-upgrade-schema": "~2.1.0+bedrock-1.19.80", "pocketmine/bedrock-data": "~2.2.0+bedrock-1.19.80", "pocketmine/bedrock-item-upgrade-schema": "~1.2.0+bedrock-1.19.80", @@ -93,11 +93,5 @@ "update-translation-apis": [ "@php build/generate-known-translation-apis.php" ] - }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/dktapps/JsonMapper.git" - } - ] + } } diff --git a/composer.lock b/composer.lock index 7f675943c5..afda5bba13 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6982184bc024b09473e58578eb7ee8bf", + "content-hash": "cae150ae8bac086e74a390a96ad48ac4", "packages": [ { "name": "adhocore/json-comment", @@ -196,56 +196,6 @@ "abandoned": true, "time": "2022-12-19T11:08:26+00:00" }, - { - "name": "netresearch/jsonmapper", - "version": "dev-array-in-string-property-error", - "source": { - "type": "git", - "url": "https://github.com/dktapps/jsonmapper.git", - "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dktapps/jsonmapper/zipball/4a82d1b98b99d682b660d6caa9b3816b2abc794c", - "reference": "4a82d1b98b99d682b660d6caa9b3816b2abc794c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/dktapps/jsonmapper/tree/array-in-string-property-error" - }, - "time": "2023-05-30T13:10:31+00:00" - }, { "name": "pocketmine/bedrock-block-upgrade-schema", "version": "2.1.0", @@ -778,6 +728,60 @@ }, "time": "2023-04-10T11:31:20+00:00" }, + { + "name": "pocketmine/netresearch-jsonmapper", + "version": "v4.2.999", + "source": { + "type": "git", + "url": "https://github.com/pmmp/netresearch-jsonmapper.git", + "reference": "f700806dec756ed825a8200dc2950ead98265956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pmmp/netresearch-jsonmapper/zipball/f700806dec756ed825a8200dc2950ead98265956", + "reference": "f700806dec756ed825a8200dc2950ead98265956", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "replace": { + "netresearch/jsonmapper": "~4.2.0" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Fork of netresearch/jsonmapper with security fixes needed by pocketmine/pocketmine-mp", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/pmmp/netresearch-jsonmapper/tree/v4.2.999" + }, + "time": "2023-06-01T13:43:01+00:00" + }, { "name": "pocketmine/raklib", "version": "0.14.6", @@ -3277,18 +3281,9 @@ "time": "2021-07-28T10:34:58+00:00" } ], - "aliases": [ - { - "package": "netresearch/jsonmapper", - "version": "dev-array-in-string-property-error", - "alias": "4.2.0", - "alias_normalized": "4.2.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "netresearch/jsonmapper": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From b16cc69974d4e805d21e6328ab77c0e17cd7116d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 1 Jun 2023 16:09:49 +0100 Subject: [PATCH 1077/1858] Release 5.0.0 --- changelogs/5.0.md | 777 ++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +- 2 files changed, 780 insertions(+), 3 deletions(-) create mode 100644 changelogs/5.0.md diff --git a/changelogs/5.0.md b/changelogs/5.0.md new file mode 100644 index 0000000000..a1d5b3292d --- /dev/null +++ b/changelogs/5.0.md @@ -0,0 +1,777 @@ +# 5.0.0 +Released 1st June 2023. + +**For Minecraft: Bedrock Edition 1.19.80** + +5.0.0 is a major feature update to PocketMine-MP, including support for Bedrock worlds from 1.13 onwards, a large array of new blocks and items, and various changes to the plugin API. + +It is **not** compatible with plugins written for 4.x.y, and plugins may require code changes to work with it. + +**As this changelog is quite large, its accuracy and completeness cannot be guaranteed.** +Make sure you're looking at the [latest revision](https://github.com/pmmp/PocketMine-MP/blob/stable/changelogs/5.0.md), as it may be amended after release. + +## Core +- Worlds are now saved according to the Bedrock 1.19.80 format. +- Worlds generated by Bedrock from 1.13.0 and up are now supported (previously, only worlds up to 1.12 were supported). +- `/particle` now accepts strings for particle data instead of integers. +- `/particle` no longer accepts integers for block or item IDs. +- The usage of `blockcrack`, `iconcrack` and `blockdust` particle types in `/particle` now follows the same pattern as + other particle types, with the data for each being passed in the `data` parameter instead of being baked into the + particle name. +- Commands are now enabled by default in worlds exported from PocketMine-MP to Bedrock. + +## Build system +- `build/generate-block-serializer-consts.php` has been added to generate `BlockTypeNames`, `BlockStateNames` and `BlockStateStringValues` in the `pocketmine\data\bedrock\block` package. +- `build/generate-item-type-names.php` has been added to generate `ItemTypeNames` in the `pocketmine\data\bedrock\item` package. +- `build/generate-runtime-enum-serializers.php` has been added to generate `RuntimeEnumSerializer`, `RuntimeEnumSerializerTrait`, and `RuntimeEnumSizeCalculatorTrait` in `pocketmine\data\runtime` package. + +## Localization +- Localized disconnect messages are now used in the following cases: + - Server full + - Player not on the server whitelist + - Player on the server ban list + - Invalid skin + - Invalid username + - Kicked using `/kick` + - Banned using `/ban` + - Failure to find a safe spawn position +- Session open, session close and session player name discovery messages are now localized. +- All permissions now have localized descriptions. These are not currently used by PocketMine-MP, but may be useful for plugins. + +## Performance +- Improved performance of dropping block inventory contents when the block is destroyed. +- Improved light propagation performance by 10-15%. +- [`ext-pmmpthread` version 6.0.0](https://github.com/pmmp/ext-pmmpthread/releases/tag/6.0.0) is now used, featuring significant performance improvements for thread-safe objects and various threading use-cases. + +## Tools +- The following tool scripts have been added: + - `generate-block-palette-spec.php` - generates a JSON file with a readable overview of blocks, their state + properties, and their possible values + - `generate-blockstate-upgrade-schema.php` - generates JSON blockstate upgrade schemas like those found + in [BedrockBlockUpgradeSchema](https://github.com/pmmp/BedrockBlockUpgradeSchema) + - `generate-item-upgrade-schema.php` - generates JSON item ID/meta upgrade schemas like those found + in [BedrockItemUpgradeSchema](https://github.com/pmmp/BedrockItemUpgradeSchema) + - `generate-bedrock-data-from-packets.php` - generates various files for [BedrockData](https://github.com/pmmp/BedrockData) + - This script accepts a txt file containing base64-encoded packet dumps. + - This script has been in use for several years, but has only now been open-sourced. + - It's used to generate data such as crafting recipes, creative inventory data, and various other blobs of data needed to support the current version of Minecraft: Bedrock Edition. + +## Gameplay +### Blocks +- Added the following new blocks: + - Amethyst Block + - Ancient Debris + - Azalea Leaves + - Basalt + - Blackstone blocks, slabs, stairs, and walls + - Cakes with Candle & Dyed Candle + - Calcite + - Candle & Dyed Candle + - Cartography Table (not currently usable due to maps not being implemented) + - Cauldron + - Cave Vines + - Chain + - Chiseled Deepslate + - Chiseled Nether Bricks + - Chiseled Polished Blackstone + - Chorus Flower + - Chorus Plant + - Cobbled Deepslate blocks, slabs, stairs, and walls + - Copper Ore + - Copper block (random oxidation not yet implemented) + - Crached Deepslate Tiles + - Cracked Deepslate Bricks + - Cracked Nether Bricks + - Cracked Polished Blackstone Bricks + - Crimson buttons, doors, fences, fence gates, hyphae, planks, pressure plates, signs, slabs, stairs, stems, and trapdoors + - Crying Obsidian + - Cut Copper block, stairs and slabs (random oxidation not yet implemented) + - Deepslate + - Deepslate Bricks blocks, slabs, stairs, and walls + - Deepslate Ores (coal, copper, diamond, emerald, gold, iron, lapis lazuli, redstone) + - Deepslate Tiles blocks, slabs, stairs, and walls + - Flowering Azalea Leaves + - Froglight (pearlescent, verdant, ochre) + - Gilded Blackstone + - Glow Item Frame + - Hanging Roots + - Honeycomb Block + - Light Block + - Lightning Rod + - Mangrove Leaves + - Mangrove Roots + - Mangrove buttons, doors, fences, fence gates, logs, planks, pressure plates, signs, slabs, stairs, trapdoors, and wood + - Mud Bricks blocks, slabs, stairs, and walls + - Muddy Mangrove Roots + - Nether Gold Ore + - Netherite Block + - Polished Basalt + - Polished Blackstone Bricks blocks, slabs, stairs, and walls + - Polished Blackstone blocks, buttons, pressure plates, slabs, stairs, and walls + - Polished Deepslate blocks, slabs, stairs, and walls + - Quartz Bricks + - Reinforced Deepslate + - Rooted Dirt + - Sculk + - Shroomlight + - Smithing Table + - Smooth Basalt + - Soul Fire + - Soul Lantern + - Soul Soil + - Soul Torch + - Spore Blossom + - Tinted Glass + - Tuff + - Twisting Vines + - Warped Wart Block + - Warped buttons, doors, fences, fence gates, hyphae, planks, pressure plates, signs, slabs, stairs, stems, and trapdoors + - Weeping Vines + - Wither Rose +- Added support for basalt generators +- Added support for dyeing sign text and making it glow. +- All-sided logs ("wood", for want of a better name) can now be placed in X, Y, and Z orientations. +- Coral and coral fans now behave correctly when placed out of water (they no longer immediately die). +- Fixed dead bush being able to be placed on some invalid blocks (e.g. stone). +- Fixed lava setting entities on fire for an incorrect duration (Java vs Bedrock inconsistency). +- Fixed sugarcane not being able to be placed on some blocks. +- Iron Ore and Gold Ore now drop Raw Iron and Raw Gold respectively, instead of the ore blocks. +- Item frames can now be placed on the top and bottom of blocks. +- Stripping logs by right-clicking them with an axe is now supported. +- TNT can now be ignited by fire charges. +- Vines can now only be placed on the side of full-cube blocks. +- Walls now connect when placed, following the pre-1.16 logic. (1.16 logic is planned to be implemented, but currently low priority.) +- Anvils are now damaged when they hit the ground after falling. +- Added missing sounds for anvils hitting the ground after falling. +- Anvils now damage entities when they fall on top of them. + +### Items +- Added the following new items: + - Amethyst Shard + - Antidote (from Education Edition) + - Copper Ingot + - Disc Fragment (5) + - Echo Shard + - Elixir (from Education Edition) + - Eye Drops (from Education Edition) + - Fire Charge + - Glow Berries + - Glow Ink Sac + - Honey Bottle + - Honeycomb + - Mangrove Boat (incomplete) + - Music Disc (5) + - Music Disc (Otherside) + - Music Disc (Pigstep) + - Netherite Axe + - Netherite Boots + - Netherite Chestplate + - Netherite Helmet + - Netherite Ingot + - Netherite Leggings + - Netherite Pickaxe + - Netherite Scrap + - Netherite Shovel + - Netherite Sword + - Phantom Membrane + - Raw Copper + - Raw Gold + - Raw Iron + - Spyglass + - Suspicious Stew + - Tonic (from Education Edition) +- Glass bottles can now be filled with water by clicking on a water source block. +- Implemented Swift Sneak enchantment. +- Armour durability is now only reduced when the wearer receives a type of damage that the armour can protect against. +- Bells now ring when hit by a projectile. + +### Worlds +- World height of -64 to 319 is now supported. +- Added support for 3D biomes. This isn't used by PocketMine-MP yet, but is necessary to be able to fully load 1.18 worlds. + +## API +### General +- Union and mixed native parameter, return and property types are now used where appropriate. +- Protected and public properties now use native property types wherever possible. +- Parameter and return typehints have been applied in many places where it wasn't previously possible. + +### Dependencies +- [`ext-pmmpthread` version 6.0.0](https://github.com/pmmp/ext-pmmpthread/releases/6.0.0) (renamed from `ext-pthreads`) is now required. This version features major API changes and improvements. Please read the [upgrading guide](https://github.com/pmmp/ext-pmmpthread/blob/fork/docs/UPGRADING_4.x_to_6.0.md) for details. +- [`pocketmine/snooze` version 0.5.0](https://github.com/pmmp/Snooze/releases/0.5.0) is now required. +- [`pocketmine/raklib` version 0.15.0](https://github.com/pmmp/RakLib/releases/0.15.0) is now required. +- [`pocketmine/raklib-ipc` version 0.2.0](https://github.com/pmmp/RakLibIpc/releases/0.2.0) is now required. +- `pocketmine/classloader` and `pocketmine/log-pthreads` packages have been removed. The relevant classes from these packages are now included in-house in the `pocketmine/thread` namespace. + - `BaseClassLoader` is replaced with `pocketmine\thread\ThreadSafeClassLoader` + - `ThreadedLogger` is replaced by `pocketmine\thread\ThreadSafeLogger` + - `AttachableThreadedLogger` is replaced by `pocketmine\thread\AttachableThreadSafeLogger` + - `ThreadedLoggerAttachment` is replaced by `pocketmine\thread\ThreadSafeLoggerAttachment` +- `webmozart/path-util` has been removed (replaced by [`symfony/filesystem`](https://github.com/symfony/filesystem)). + +### `pocketmine\block` +#### Highlights +- Blocks no longer use internal Minecraft IDs and metadata to identify themselves. All APIs associated with legacy IDs + and meta have been removed. +- A new set of runtime IDs generated from `VanillaBlocks` is used to identify block types. These IDs are defined + in `BlockTypeIds`. + - These new IDs are used for runtime representation of blocks on chunks, and for type comparison purposes. + - Block type IDs are used at **runtime only**. **Do not store them in configs or databases**, as they are subject to + change without warning. + - Block type IDs are **specific to PocketMine-MP** and have no relation to the IDs used by Minecraft. + - Block type IDs cannot be negative + - Block type IDs must not be reused, even if overriding an already defined block +- Block state properties (e.g. facing, colour, etc.) are now represented by PM-specific state data instead of legacy + metadata. The state data consists of: + - Block-item state properties - retained by items when the block is broken (colour, wet/dry, coral type, etc.) - handled by `Block->describeBlockItemState()` + - Block-only state data - discarded when the block is broken (facing direction, lit/unlit, powered/unpowered, etc.) - handled by `Block->describeBlockOnlyState()` +- Chunks now store dynamic state ID derived from the runtime type ID and runtime (PocketMine-MP defined) state data. +- Introduced "type tags" concept, which allows marking certain blocks as having certain behaviours. + - The idea for this system was borrowed from the Minecraft Java tags system. + - It's still in very early concept stage, but is currently used for deciding which types of blocks plants can be placed on without needing to enumerate every single ID in every class, eliminating a bunch of boilerplate code and improving consistency. +- All `Block` descendents now accept `BlockTypeInfo` in the constructor, instead of `BlockBreakInfo`. This allows for future additions without needing to change dozens of overridden constructors. +- `&$returnedItems` reference parameter is now used in some places such as `Block->onInteract()` to enable actions to return items to players without caring about whether they are in creative or anything else. + - This eliminates boilerplate code of deciding whether to set the player's held item or not, as well as automatically dropping any overflow items that don't fit into the inventory. + - This is currently used when filling/emptying cauldrons using buckets or glass bottles. +- Dependency between `RuntimeBlockStateRegistry` (previously `BlockFactory`) and `VanillaBlocks` has been inverted. + - Now, blocks types are defined in `VanillaBlocks` + - `RuntimeBlockStateRegistry` automatically registers states for blocks defined in `VanillaBlocks`. + - Manual registration in `RuntimeBlockStateRegistry` is still required for custom blocks (see section below about registering new blocks). +- `RuntimeBlockStateRegistry` now has only one purpose - to map internal blockstate IDs to `Block` objects when reading blocks from chunks. It should not be used by plugins unless registering new blocks. + - To get a block at runtime, e.g. stone, use `VanillaBlocks::STONE()` + - To load a block from **old** config or database data: + 1. Use `GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta()` to convert it to modern data + 2. Pass the data to `GlobalBlockStateHandlers::getDeserializer()` to get a blockstate ID + 3. Pass the blockstate ID to `RuntimeBlockStateRegistry::fromStateId()` to get a `Block` instance + - Prefer using `StringToItemParser` wherever possible for configs and databases (see `lookupAliases()` and `lookupBlockAliases()`). + +#### Registering new blocks +##### In a plugin +To add a vanilla block in a plugin which isn't yet supported by PocketMine-MP, do the following: + +1. Get a new type ID using `BlockTypeIds::newId()` - _you'll want to keep this in a property somewhere if you want to + compare using `getTypeId()` later_ +2. Set up the block type somewhere - _this can be anywhere you like, e.g. a plugin main class property, but using + a `RegistryTrait` class is recommended - you'll need this later to create new instances of the block_ +3. Register the block in `RuntimeBlockStateRegistry` - _this informs the server of all the block's possible states so + that it can be read from chunks at runtime_ +4. Register a deserializer for the block's Minecraft ID in `BlockStateToObjectDeserializer` - _needed for the block to + be recognized when loaded from disk_ +5. Register a serializer for the block in `BlockObjectToStateSerializer` - _needed for the block to be saved to disk, + and to be sent over the network_ +6. Optionally, register a string alias for the block in `StringToItemParser` - _so that it can be given via `/give`_ + +To see a demo of how to do this in a plugin, see [this example plugin](https://github.com/pmmp/RegisterBlocksDemoPM5). + +Registering custom blocks follows a similar process, but requires additional steps to modify `BlockStateDictionary` +which won't be covered here. +Since this is not currently officially supported by PocketMine-MP, this won't be covered here. + +This is admittedly rather more of a hassle than in PM4, but this system offers significantly more flexibility than the +old system. + +##### As a PocketMine-MP core contribution +To register a new vanilla block into the core, the process is slightly different: + +1. Instead of using `BlockTypeIds::newId()`, add a new constant for the block to `BlockTypeIds` +2. Register the new block in `VanillaBlocks` - `RuntimeBlockStateRegistry` will automagically take notice of all blocks + defined in `VanillaBlocks` +3. Follow steps 4 onwards above + +#### Change list +- The following classes have been removed: + - `BlockIdentifierFlattened` + - `BlockLegacyIdHelper` + - `BlockLegacyIds` + - `BlockLegacyMetadata` + - `utils\BlockDataSerializer` + - `utils\ColorInMetadataTrait` - `utils\ColoredTrait` now implements colour type data serialization uniformly + - `utils\InvalidBlockStateException` - this has been superseded by `pocketmine\data\runtime\InvalidSerializedRuntimeDataException` + - `utils\NormalHorizontalFacingInMetadataTrait` - `utils\HorizontalFacingTrait` now implements facing type data serialization uniformly + - `utils\PillarRotationInMetadataTrait` - `utils\PillarRotationTrait` now implements rotation type data serialization uniformly +- The following classes have been renamed: + - `BlockFactory` -> `RuntimeBlockStateRegistry` - this class is now exclusively used for mapping state IDs to block instances for runtime chunk block reading + - `Skull` -> `MobHead` + - `utils\SkullType` -> `utils\MobHeadType` + - `utils\TreeType` -> `pocketmine\world\generator\object\TreeType` +- The following classes have been added: + - `BaseCake` + - `BaseFire` + - `BlockTypeIds` - list of type IDs, one for each entry in `VanillaBlocks` + - `BlockTypeInfo` + - `BlockTypeTags` + - `CakeWithCandle` + - `CakeWithDyedCandle` + - `Candle` + - `CartographyTable` + - `Chain` + - `CopperOre` + - `CopperSlab` + - `CopperStairs` + - `Copper` + - `DyedCandle` + - `GildedBlackstone` + - `GoldOre` + - `HangingRoots` + - `IronOre` + - `Light` + - `LightningRod` + - `NetherGoldOre` + - `Sculk` + - `SmithingTable` + - `SoulFire` + - `WitherRose` + - `utils\CandleTrait` + - `utils\CopperOxidation` + - `utils\CopperTrait` + - `utils\SaplingType` - enum of all sapling types + - `utils\WallConnectionType` - enum of all possible wall connection types + - `utils\WoodTypeTrait` + - `utils\WoodType` - enum of all possible wood types, used for wood material blocks like planks and logs +- The following API methods have been removed: + - `Block->getId()` - for type comparisons, use `Block->getTypeId()` instead + - `Block->getMeta()` - for state comparisons, use `Block->getStateId()` instead + - `Block->getStateBitmask()` + - `Block->readStateFromData()` + - `Block->writeStateToItemMeta()` + - `Block->writeStateToMeta()` + - `BlockFactory->get()` - see notes above about `RuntimeBlockStateRegistry` + - `BlockIdentifier->getAllBlockIds()` + - `BlockIdentifier->getBlockId()` + - `BlockIdentifier->getItemId()` + - `BlockIdentifier->getVariant()` + - `Door->isPowered()` + - `Door->setPowered()` + - `MobHead->isNoDrops()` (previously `Skull->isNoDrops()`) + - `MobHead->setNoDrops()` (previously `Skull->setNoDrops()`) + - `VanillaBlocks::*_GLAZED_TERRACOTTA()` - use `VanillaBlocks::GLAZED_TERRACOTTA()->setColor(DyeColor::WHATEVER())` instead + - `utils\FallableTrait->getId()` is no longer required + - `utils\FallableTrait->getMeta()` is no longer required + - `utils\MobHeadType->getMagicNumber()` (previously `utils\SkullType->getMagicNumber()`) + - `utils\MobHeadType::fromMagicNumber()` (previously `utils\SkullType::fromMagicNumber()`) +- The following constants have been removed: + - `Block::INTERNAL_METADATA_BITS` + - `Block::INTERNAL_METADATA_MASK` +- The following API methods have been renamed: + - `Block->getFullId()` -> `Block->getStateId()` + - `Block->isSameType()` -> `Block->hasSameTypeId()` + - `MobHead->getSkullType()` -> `MobHead->getMobHeadType()` (previously `Skull->getSkullType()`) + - `MobHead->setSkullType()` -> `MobHead->setMobHeadType()` (previously `Skull->setSkullType()`) +- The following API methods have signature changes: + - `Block->onBreak()` now accepts `array &$returnedItems` reference parameter. + - `Block->onInteract()` now accepts `array &$returnedItems` reference parameter. + - `Block->readStateFromWorld()` now returns `Block` - this allows blocks to replace themselves with a different block entirely based on world conditions. + - `BlockIdentifier->__construct()` now accepts `int $blockTypeId`, and no longer accepts `int $blockId, int $variant, ?int $itemId` + - `ItemFrame->getFacing()` may now return `Facing::UP` and `Facing::DOWN` + - `ItemFrame->setFacing()` now accepts `Facing::UP` and `Facing::DOWN` + - `Leaves->__construct()` now accepts `LeavesType $leavesType` instead of `TreeType $treeType` + - `RuntimeBlockStateRegistry->register()` no longer accepts an `$override` parameter. + - `Sapling::__construct()` now accepts `SaplingType $saplingType` instead of `TreeType $treeType` + - `utils\SignText::__construct()` now accepts two new optional parameters: `?Color $baseColor` and `bool $glowing` + - `utils\SignText::fromBlob()` now accepts two new optional parameters: `?Color $baseColor` and `bool $glowing` +- The following API methods have been added: + - `protected Block->describeBlockOnlyState(RuntimeDataDescriber $w) : void` - describes state properties which are discarded when the block is broken or block-picked, such as facing, powered, etc. + - `public Block->describeBlockItemState(RuntimeDataDescriber $w) : void` - describes state properties which are kept by the item when the block is broken or block-picked, such as dye color + - `public Block->generateStatePermutations() : \Generator` - yields all possible states this block type can be in (used for `RuntimeBlockStateRegistry`) + - `public Block->getTypeTags() : array` + - `public Block->hasTypeTag(string $tag) : bool` + - `public Block->isFireProofAsItem() : bool` + - `public Block->onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void` + - `public BlockIdentifier->getBlockTypeId() : int` - returns the block's type ID according to `BlockTypeIds` + - `public Furnace->getFurnaceType() : utils\FurnaceType` + - `public GlazedTerracotta->getColor() : utils\DyeColor` (from `ColoredTrait`) - this was previously unsupported due to legacy limitations + - `public GlazedTerracotta->setColor(utils\DyeColor $color) : $this` (from `ColoredTrait`) - this was previously unsupported due to legacy limitations + - `public Leaves->getLeavesType() : utils\LeavesType` - returns the type of leaves + - `public Wall->getConnection(int $face) : utils\WallConnectionType` + - `public Wall->getConnections() : array` - returns the wall's connections and their types (see `utils\WallConnectionType`) + - `public Wall->isPost() : bool` + - `public Wall->setConnection(int $face, ?utils\WallConnectionType $type) : $this` + - `public Wall->setConnections()` - sets the wall's connections and their types (see `utils\WallConnectionType`) + - `public Wall->setPost(bool $post) : $this` + - `public Wood->isStripped() : bool` + - `public Wood->setStripped(bool $stripped) : $this` + - `public static BlockBreakInfo::axe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::pickaxe(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::shovel(float $hardness, ?ToolTier $toolTier = null, ?float $blastResistance = null) : BlockBreakInfo` + - `public static BlockBreakInfo::tier(float $hardness, int $toolType, ToolTier $toolTier, ?float $blastResistance = null) : BlockBreakInfo` + - `public tile\Spawnable->getRenderUpdateBugWorkaroundStateProperties(Block $block) : array` - allows spawnable tiles to spoof block state properties to work around client-side rendering bugs without actually changing the block server-side + - `public utils\SignText->getBaseColor() : \pocketmine\color\Color` + - `public utils\SignText->isGlowing() : bool` +- The following classes now use new traits, adding API methods and/or properties: + - `FenceGate` uses `utils\WoodTypeTrait` + - `GlazedTerracotta` uses `utils\ColoredTrait` + - `Planks` uses `utils\WoodTypeTrait` + - `Wood` uses `utils\WoodTypeTrait` + - `WoodenButton` uses `utils\WoodTypeTrait` + - `WoodenDoor` uses `utils\WoodTypeTrait` + - `WoodenFence` uses `utils\WoodTypeTrait` + - `WoodenPressurePlate` uses `utils\WoodTypeTrait` + - `WoodenSlab` uses `utils\WoodTypeTrait` + - `WoodenStairs` uses `utils\WoodTypeTrait` + - `WoodenTrapdoor` uses `utils\WoodTypeTrait` +- The following API interface requirements have been added (BC breaking): + - `public utils\Fallable->getFallDamagePerBlock() : float` (default implementation provided by `utils\FallableTrait`) + - `public utils\Fallable->getLandSound() : ?Sound` (default implementation provided by `utils\FallableTrait`) + - `public utils\Fallable->getMaxFallDamage() : float` (default implementation provided by `utils\FallableTrait`) + - `public utils\Fallable->onHitGround(FallingBlock $blockEntity) : bool` (default implementation provided by `utils\FallableTrait`) + +### `pocketmine\command` +- Command permissions are now always checked by the server when running a command. + - This only affects commands implemented by extending `Command`. Plugins using `PluginBase->onCommand()` are not affected by this change, since they already had permissions checked by the server anyway. + - Previously, direct inheritors of `Command` were responsible for checking permissions, which required developers to duplicate the same code in every command, and opened lots of potential for security vulnerabilities. + - If you want to do something on permission denied (e.g. sending a special message, or audit logging), you can do so by overriding `Command->testPermission()`, instead of baking the code directly into `Command->execute()`. + - If you don't want to use permissions at all, just create a permission with a default of `true` (or belonging to `pocketmine.group.user`) and assign that. +- `SimpleCommandMap` now requires all commands to have a permission set when registered. + - If you actually want to allow everyone to use your command (not advised), you can add a new permission to the `pocketmine.group.user` group, or use `default: true` for `plugin.yml` permissions. +- The following API methods have changed behaviour: + - `Command->testPermissionSilent()` now returns `false` if there are no permissions associated with the command. This is to prevent commands with no permissions being usable by everyone, which has previously been a source of security issues. +- The following API methods have been added: + - `public Command->getPermissions() : list` - returns a list of permissions which grant usage access to this command. A user with one or more of these permissions will be able to invoke the command's `execute()` method + - `public Command->setPermissions(list $permissions) : void` - sets the permissions which grant usage access to this command. This should be used instead of `setPermission()` with `;` separators (which is now deprecated) + +### `pocketmine\crafting` +- JSON models have been updated to reflect updated crafting data format. +- The following enum classes have new members: + - `ShapelessRecipeType` has new members `CARTOGRAPHY` and `SMITHING` +- The following classes have been added: + - `ExactRecipeIngredient` - matches an exact item + - `MetaWildcardRecipeIngredient` - matches an item with the given legacy Minecraft ID, but any metadata value + - `RecipeIngredient` interface + - `TagWildcardRecipeIngredient` - matches an item based on its Minecraft tags, e.g. `minecraft:wooden_tier` +- The following API methods have signature changes: + - `FurnaceRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `FurnaceRecipe->getInput()` now returns `RecipeIngredient` instead of `Item` + - `PotionContainerChangeRecipe->__construct()` now accepts `string, RecipeIngredient, string` (using Minecraft string IDs instead of legacy integers). + - `PotionContainerChangeRecipe->getIngredient()` now returns `RecipeIngredient` instead of `Item`. + - `PotionContainerChangeRecipe->getInputItemId()` now returns `string` (using Minecraft string IDs instead of legacy integers). + - `PotionContainerChangeRecipe->getOutputItemId()` now returns `string` (using Minecraft string IDs instead of legacy integers). + - `PotionTypeRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `PotionTypeRecipe->getIngredient()` now returns `RecipeIngredient` instead of `Item` + - `PotionTypeRecipe->getInput()` now returns `RecipeIngredient` instead of `Item` + - `ShapedRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `ShapedRecipe->getIngredient()` now returns `?RecipeIngredient` instead of `?Item` + - `ShapedRecipe->getIngredientList()` now returns `RecipeIngredient[]` instead of `Item[]` + - `ShapedRecipe->getIngredientMap()` now returns `RecipeIngredient[][]` instead of `Item[][]` + - `ShapelessRecipe->__construct()` `$type` parameter is now mandatory. + - `ShapelessRecipe->__construct()` now accepts `RecipeIngredient` instead of `Item` + - `ShapelessRecipe->getIngredientList()` now returns `RecipeIngredient[]` instead of `Item[]` + +### `pocketmine\data` +- New packages `bedrock\block` and `bedrock\item` have been added. These packages contain all the necessary code for loading and saving Bedrock blocks and items from disk. +- New package `runtime` has been added. This package contains code for serializing runtime data for blocks and items. +- `LegacyToStringBidirectionalIdMap` has been reduced to `LegacyToStringIdMap`. + - Since we never map from string ID to legacy ID, bidirectional mapping is no longer necessary. + - This affects the following subclasses: + - `LegacyBiomeIdToStringIdMap` + - `LegacyBlockIdToStringIdMap` + - `LegacyEntityIdToStringIdMap` + - `LegacyItemIdToStringIdMap` +- The following internal API methods have been added: + - `public LegacyToStringIdMap->add(string $string, int $legacy) : void` - adds a mapping from a custom legacy ID to custom string ID, needed for upgrading old saved data + +### `pocketmine\entity` +- `Entity` now declares new abstract methods which must be implemented by subclasses: + - `public Entity->getInitialDragMultiplier() : float` + - `public Entity->getInitialGravity() : float` +- The following new API methods have been added: + - `public Living->getDisplayName() : string` +- The following API methods have changed signatures: + - `EntityFactory->register()` no longer accepts a `$legacyMcpeSaveId` parameter (now handled by internal conversions instead). +- The following API methods have been renamed: + - `Entity->isImmobile()` -> `Entity->hasNoClientPredictions()` + - `Entity->setImmobile()` -> `Entity->setNoClientPredictions()` +- The following internal fields have been renamed: + - `Entity->immobile` -> `Entity->noClientPredictions` +- The following classes have been removed: + - `EntityLegacyIds` + +### `pocketmine\event` +- The following classes have inheritance changes: + - `block\BlockPlaceEvent` no longer extends `BlockEvent`, and therefore no longer has `getBlock()`. Use `getTransaction()` instead (may contain multiple blocks). +- `BlockFormEvent` now includes information about the block which caused the event. + +- The following new classes have been added: + - `world\WorldDisplayNameChangeEvent` - called when a world's display name is changed +- The following classes have been renamed: + - `entity\ExplosionPrimeEvent` -> `entity\EntityPreExplodeEvent` +- The following API methods have been added: + - `public block\BlockFormEvent->getCausingBlock() : Block` + - `public block\BlockGrowEvent->getPlayer() : ?Player` - returns the player that triggered the block growth, or `null` if it was not triggered by a player + - `public block\BlockPlaceEvent->getTransaction() : BlockTransaction` - returns the transaction containing a list of changed block positions and the blockstates they will be changed to + - `public server\DataPacketSendEvent->setPackets(list $packets) : void` +- The following API methods have changed signatures: + - `block\BlockPlaceEvent->__construct()` now accepts `BlockTransaction $transaction` instead of `Block $blockPlace, Block $blockReplace` + - `entity\EntityPreExplodeEvent->__construct()` has the `$force` parameter renamed to `$radius` + - `entity\EntityPreExplodeEvent->getForce() : float` -> `entity\EntityPreExplodeEvent->getRadius() : float` + - `entity\EntityPreExplodeEvent->setForce(float $force) : void` -> `entity\EntityPreExplodeEvent->setRadius(float $radius) : void` +- The following API methods have been removed: + - `block\BlockPlaceEvent->getBlockReplaced()` - this information is now provided in the `BlockTransaction` object returned by `BlockPlaceEvent->getTransaction()` +- The following new API constants have been added: + - `entity\EntityDamageEvent::CAUSE_FALLING_BLOCK` + - `entity\EntityDamageEvent::MODIFIER_ARMOR_HELMET` + +### `pocketmine\event\player` +- `PlayerPreLoginEvent`, `PlayerDuplicateLoginEvent` and `PlayerKickEvent` now supports setting separate log reasons (disconnect reason) and disconnect screen messages. +- The following classes have been removed: + - `PlayerCommandPreprocessEvent` +- The following API methods have changed signatures: + - `PlayerDuplicateLoginEvent->getDisconnectMessage()` now returns `Translatable|string` instead of `string` + - `PlayerDuplicateLoginEvent->setDisconnectMessage()` now accepts `Translatable|string` instead of `string` + - `PlayerKickEvent->getReason()` now returns `Translatable|string` instead of `string` + - `PlayerKickEvent->setReason()` now accepts `Translatable|string` instead of `string` + - `PlayerLoginEvent->getKickMessage()` now returns `Translatable|string` instead of `string` + - `PlayerLoginEvent->setKickMessage()` now accepts `Translatable|string` instead of `string` + - `PlayerPreLoginEvent->getFinalKickMessage()` now returns `Translatable|string` instead of `string` + - `PlayerPreLoginEvent->getKickMessage()` now returns `Translatable|string|null` instead of `string|null` + - `PlayerPreLoginEvent->setKickFlag()` (previously `setKickReason()`) now accepts `Translatable|string $disconnectReason, Translatable|string|null $disconnectScreenMessage = null` instead of `Translatable|string $message` + - `PlayerPreLoginEvent->setKickReason()` now accepts `Translatable|string` for the `$message` parameter instead of `string` + - `PlayerQuitEvent->getQuitReason()` now returns `Translatable|string` instead of `string` +- The following API methods have been removed: + - `PlayerChatEvent->getFormat()` (use `PlayerChatEvent->getChatFormatter()` instead) + - `PlayerChatEvent->setFormat()` (use `PlayerChatEvent->setChatFormatter()` instead) + - `PlayerDuplicateLoginEvent->getDisconnectMessage()` - replaced by `getDisconnectReason()` and `getDisconnectScreenMessage()` + - `PlayerDuplicateLoginEvent->setDisconnectMessage()` - replaced by `setDisconnectReason()` and `setDisconnectScreenMessage()` + - `PlayerKickEvent->getReason()` - replaced by `getDisconnectReason()` and `getDisconnectScreenMessage()` + - `PlayerKickEvent->setReason()` - replaced by `setDisconnectReason()` and `setDisconnectScreenMessage()` +- The following new API methods have been added: + - `public PlayerChatEvent->getChatFormatter() : \pocketmine\player\chat\ChatFormatter` - returns the chat formatter to be used for this event + - `public PlayerChatEvent->setChatFormatter(\pocketmine\player\chat\ChatFormatter $formatter) : void` - sets the chat formatter to be used for this event + - `public PlayerDeathEvent->getDeathScreenMessage() : Translatable|string` - returns the message to be displayed on the death screen + - `public PlayerDeathEvent->setDeathScreenMessage(Translatable|string $deathScreenMessage) : void` - sets the message to be displayed on the death screen + - `public PlayerDuplicateLoginEvent->getDisconnectReason() : Translatable|string` - returns the reason for the disconnection displayed in the console and server log + - `public PlayerDuplicateLoginEvent->getDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen (the message in `getDisconnectReason()` is used if null is returned) + - `public PlayerDuplicateLoginEvent->setDisconnectReason(Translatable|string $disconnectReason) : void` - sets the reason for the disconnection displayed in the console and server log + - `public PlayerDuplicateLoginEvent->setDisconnectScreenMessage(Translatable|string|null $disconnectScreenMessage) : void` - sets the message to be displayed on the disconnect screen (the message in `setDisconnectReason()` is used if null is passed) + - `public PlayerKickEvent->getDisconnectReason() : Translatable|string` - returns the reason for the disconnection displayed in the console and server log + - `public PlayerKickEvent->getDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen (the message in `getDisconnectReason()` is used if null is returned) + - `public PlayerKickEvent->setDisconnectReason(Translatable|string $disconnectReason) : void` - sets the reason for the disconnection displayed in the console and server log + - `public PlayerKickEvent->setDisconnectScreenMessage(Translatable|string|null $disconnectScreenMessage) : void` - sets the message to be displayed on the disconnect screen (the message in `setDisconnectReason()` is used if null is passed) + - `public PlayerPreLoginEvent->getDisconnectScreenMessage(int $flag) : Translatable|string|null` - returns the message to be displayed on the disconnect screen for the specified kick flag, if set + - `public PlayerPreLoginEvent->getFinalDisconnectScreenMessage() : Translatable|string|null` - returns the message to be displayed on the disconnect screen, taking into account the kick flags set +- The following classes have inheritance changes: + - `PlayerPreLoginEvent` no longer implements `Cancellable`. This caused unexpected behaviour for most plugin devs due to default-ignoring cancelled events, forcing people to usually have to use `@handleCancelled` to handle the event when they wanted to use it. +- The following API constants have been renamed: + - `PlayerPreLoginEvent::KICK_REASON_BANNED` -> `PlayerPreLoginEvent::KICK_FLAG_BANNED` + - `PlayerPreLoginEvent::KICK_REASON_PLUGIN` -> `PlayerPreLoginEvent::KICK_FLAG_PLUGIN` + - `PlayerPreLoginEvent::KICK_REASON_PRIORITY` -> `PlayerPreLoginEvent::KICK_FLAG_PRIORITY` + - `PlayerPreLoginEvent::KICK_REASON_SERVER_FULL` -> `PlayerPreLoginEvent::KICK_FLAG_SERVER_FULL` + - `PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED` -> `PlayerPreLoginEvent::KICK_FLAG_SERVER_WHITELISTED` +- The following API methods have been renamed: + - `PlayerPreLoginEvent->clearAllKickReasons()` -> `PlayerPreLoginEvent->clearAllKickFlags()` + - `PlayerPreLoginEvent->clearKickReason()` -> `PlayerPreLoginEvent->clearKickFlag()` + - `PlayerPreLoginEvent->getFinalKickMessage()` -> `PlayerPreLoginEvent->getFinalDisconnectReason()` (now used for logs only, if a disconnect screen message is set for the highest priority flag) + - `PlayerPreLoginEvent->getKickMessage()` -> `PlayerPreLoginEvent->getDisconnectReason()` (now used for logs only, if a disconnect screen message is set for the flag) + - `PlayerPreLoginEvent->getKickReasons()` -> `PlayerPreLoginEvent->getKickFlags()` + - `PlayerPreLoginEvent->isKickReasonSet()` -> `PlayerPreLoginEvent->isKickFlagSet()` + - `PlayerPreLoginEvent->setKickReason()` -> `PlayerPreLoginEvent->setKickFlag()` + +### `pocketmine\item` +#### Highlights +- `ItemFactory` has been removed. Vanilla item registration is now done via `VanillaItems`. + - To get an item at runtime, e.g. iron ingot, use `VanillaItems::IRON_INGOT()` + - To get a block as an item, e.g. stone, use `VanillaBlocks::STONE()->asItem()` + - To load an item from legacy ID and meta: + 1. Use `GlobalItemDataHandlers::getUpgrader()->upgradeItemTypeDataInt()` to convert the legacy ID and meta to `SavedItemStackData` + 2. Pass the itemstack data to `GlobalItemDataHandlers::getDeserializer()` to get an `Item` instance +- Items no longer use internal Minecraft string IDs and metadata to identify themselves. All APIs associated with legacy + IDs and/or meta have been removed. +- A new set of runtime item IDs generated from `VanillaItems` is now used to identify item types. These IDs are defined + in `ItemTypeIds`. + - These new IDs are primarily intended for type comparison purposes. + - Item type IDs are used at **runtime only**. They should **NOT** be stored in configs or databases, as they are not + guaranteed to remain the same between versions. +- In some cases, items may have additional "type data" which provides extra type information about an item. This + replaces item metadata in some cases. + - Type data may be used to store dynamic type information such as dye colour, potion type, etc. + - Items must have the same type ID **and** type data in order to be stackable. +- Blocks, when represented as items: + - retain their block type data, but not state data (for example, different colours of concrete don't stack, but things + like facing don't affect stackability) + - use the negative of their block type ID (e.g. a block with type ID `1` will have an item type ID of `-1`). +- Durable items (e.g. tools, armour) now use NBT `Damage` tag to store durability (like Minecraft 1.13+), instead of + legacy meta values. +- `&$returnedItems` reference parameter is now used in some places (e.g. `onInteractBlock()`) to enable actions to return items to players without caring about whether they are in creative or anything else. + - This eliminates boilerplate code of deciding whether to set the player's held item or not, as well as automatically dropping any overflow items that don't fit into the inventory. + - This is used for things like filling/emptying buckets and bottles, and equipping armor. +- Blocks which previously had separate items, such as mob heads and beds, no longer do. Their item form can be acquired using `Block->asItem()` in the same way as every other block. This is facilitated by the new serializer system. + +#### Implementing new items +##### In a plugin +This follows a similar process to registering blocks. + +1. Get a new type ID using `ItemTypeIds::newId()` - _you'll want to keep this in a property somewhere if you want to + compare using `getTypeId()` later_ +2. Set up the item type somewhere - _this can be anywhere you like, e.g. a plugin main class property, but using + a `RegistryTrait` class is recommended - you'll need this later to create new instances of the item_ +3. Register a deserializer in `ItemDeserializer` - _needed for the item to be recognized when loaded from disk_ +4. Register a serializer in `ItemSerializer` - _needed for the item to be saved to disk, and to be sent over the + network_ +5. Optionally, register a string alias for the item in `StringToItemParser` - _so that it can be given via `/give`_ + +To see a demo of how to do this in a plugin, see [this example plugin](https://github.com/pmmp/RegisterBlocksDemoPM5). + +Again, it's acknowledged this is rather more cumbersome than it should be, but this is an ongoing process. + +##### As a PocketMine-MP core contribution + +To register a new vanilla item into the core, the process is slightly different: + +1. Instead of using `ItemTypeIds::newId()`, add a new constant for the block to `ItemTypeIds` +2. Register the new item in `VanillaItems` +3. Follow steps 3 onwards from the plugin instructions above + +#### Change list +- `Item` is no longer `json_encode()`-able. + - The original purpose of this was to allow items to be serialized to JSON for crafting data generated from `CraftingDataPacket`. Due to changes in the generation methodology, bypassing `Item`s entirely, this is no longer necessary. + - In addition, `jsonSerialize()` required the item to know about the method by which it will be serialized (since there is no way to inject context), creating a cyclic dependency between the `Item` implementation and its serialization method. + - It's relatively easy to write a replacement method to encode items to JSON as you desire. + - `Item::legacyJsonDeserialize()` (previously `Item::jsonDeserialize()`) is retained to allow loading legacy data, although it may be removed in the future. +- The following classes have been removed: + - `Bed` + - `ItemFactory` + - `ItemIds` + - `Skull` +- The following classes have been added: + - `BoatType` - enum of all boat types + - `CoralFan` + - `HoneyBottle` + - `MedicineType` + - `Medicine` + - `Spyglass` + - `SuspiciousStewType` + - `SuspiciousStew` +- The following API methods have been added: + - `protected Item->describeState(RuntimeDataDescriber $w) : void` + - `public Armor->clearCustomColor() : $this` - clears the custom color of an armor item + - `public ArmorTypeInfo->getToughness() : int` + - `public ArmorTypeInfo->isFireProof() : bool` + - `public Boat->getType() : BoatType` + - `public Dye->setColor(\pocketmine\block\utils\DyeColor $color) : $this` + - `public Item->getStateId() : int` - returns a runtime numeric state ID for comparisons including information such as coral type, dye color, etc. - DO NOT save this to disk or databases + - `public Item->getTypeId() : int` - returns a runtime numeric type ID for comparisons - DO NOT save this to disk or databases + - `public Item->isFireProof() : bool` + - `public ItemIdentifer->getTypeId() : int` + - `public Potion->setType(PotionType $type) : $this` + - `public SplashPotion->setType(PotionType $type) : $this` + - `public StringToItemParser->lookupAliases(Item $item) : list` - returns a list of all registered aliases for the given item + - `public StringToItemParser->lookupBlockAliases(Block $block) : list` - returns a list of all registered aliases for the given block + - `public static ItemIdentifier::fromBlock(Block $block) : self` +- The following API methods have been removed: + - `Boat->getWoodType()` + - `Item->getId()` - for type comparisons, use `Item->getTypeId()` instead + - `Item->getMeta()` - use the item's specific API methods to compare information such as colour, potion type etc. + - `Item->hasAnyDamageValue()` - for meta wildcard recipe ingredients, use `pocketmine\crafting\MetaWildcardRecipeIngredient` instead + - `ItemIdentifier->getId()` + - `ItemIdentifier->getMeta()` +- The following API methods have been renamed: + - `Item::jsonDeserialize()` -> `Item::legacyJsonDeserialize()` +- The following API methods have signature changes: + - `ArmorTypeInfo->__construct()` now accepts optional parameters `int $toughness` and `bool $fireProof` + - `BoatType::__construct()` now accepts `BoatType $boatType` instead of `TreeType $woodType`. + - `Item->onAttackEntity()` now accepts `array &$returnedItems` reference parameter. + - `Item->onClickAir()` now accepts `array &$returnedItems` reference parameter. + - `Item->onDestroyBlock()` now accepts `array &$returnedItems` reference parameter. + - `Item->onInteractBlock()` now accepts `array &$returnedItems` reference parameter. + - `Item->onReleaseUsing()` now accepts `array &$returnedItems` reference parameter. + - `ItemIdentifier->__construct()` no longer accepts a `$variant` parameter, and now expects an item type ID for the ID parameter + - `LegacyStringToItemParser->addMapping()` now accepts a string for ID, instead of an integer +- The following API methods have behaviour changes: + - `Item->equals()`'s `$checkDamage` parameter is now ignored, as tool damage is now stored as an NBT tag. This parameter wasn't removed due to being followed by a second `bool` parameter, which would potentially end up in the wrong place and silently cause bugs in updated plugins. + - `Item->equals()`'s `$checkTags` parameter will now cause tool and armor damage to be checked if true. +- The following enums have new members: + - `ToolTier` has new member `NETHERITE` + +### `pocketmine\network` +- The following API methods have changed signatures: + - `NetworkSessionManager->close()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter. +- The following API methods have changed signatures: + - `query\QueryInfo->getPlayerList()` now returns `list` instead of `list` + - `query\QueryInfo->setPlayerList()` now accepts `list` instead of `list` + +### `pocketmine\player` +- The following API methods have changed signatures: + - `Player->disconnect()` now accepts `Translatable|string` for `$reason` instead of `string` (to allow localized disconnect messages) + - `Player->disconnect()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter, which is the message to be displayed on the disconnect screen (the message in `$reason` is used if null is passed) + - `Player->kick()` now accepts `Translatable|string` for `$reason` instead of `string` (to allow localized kick messages) + - `Player->kick()` now accepts an additional `Translatable|string|null $disconnectScreenMessage` parameter, which is the message to be displayed on the disconnect screen (the message in `$reason` is used if null is passed) + - `Player->sendJukeboxPopup()` now accepts `Translatable|string` instead of `string, string[]` +- The following classes have been removed: + - `PlayerChunkLoader` - deprecated in 4.19.0 (this was technically internal, but never marked as such) + +### `pocketmine\player\chat` +- The following new classes have been added: + - `ChatFormatter` - interface implemented by chat formatters - this is far more powerful than the old API + - `LegacyRawChatFormatter` - implements the same behaviour previously used by `PlayerChatEvent->setFormat()` + - `StandardChatFormatter` - formats chat messages in the vanilla Minecraft style + +### `pocketmine\scheduler` +- `AsyncTask->setResult()` now works with thread-safe objects. This was previously not possible due to limitations in the `pthreads` extension. + +### `pocketmine\world` +- The following API methods have been added: + - `public World->setDisplayName(string $name) : void` +- The following API methods have changed signatures: + - `Explosion->__construct()` has the `$size` parameter renamed to `$radius` +- The following public properties have been renamed: + - `Explosion->size` -> `Explosion->radius` + +### `pocketmine\world\format` +- Chunks are now considered dirty (modified) by default, unless loaded from a `WorldProvider` by `World`. Previously, chunks were considered unmodified by default, which allowed several pathways to bugs. +- The following classes have been added: + - `io\GlobalBlockStateHandlers` - gives access to block data serializer, deserializer, and upgraders + - `io\GlobalItemDataHandlers` - gives access to item data serializer, deserializer, and upgraders + - `io\LoadedChunkData` - represents a chunk loaded from disk, along with information such as whether the chunk was upgraded and what fixes it requires +- The following new API methods have been added: + - `public SubChunk->getBiomeArray() : PalettedBlockArray` +- The following classes have been removed: + - `BiomeArray` - `PalettedBlockArray` is now used for 3D biome data +- The following API methods have changed signatures: + - `Chunk->getBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `Chunk->setBiomeId()` now accepts `int $x, int $y, int $z` instead of `int $x, int $z` + - `Chunk->__construct()` no longer accepts `BiomeArray` as a parameter (contained in each subchunk instead) + - `SubChunk->__construct()` now accepts `int $emptyBlockId, list $blockLayers, PalettedBlockArray $biomes, ?LightArray $blockLight, ?LightArray $skyLight` instead of `int, list, ?LightArray, ?LightArray` + - `io\WorldProvider->loadChunk()` now returns `LoadedChunkData` instead of `ChunkData` + - `io\WorldProvider->getAllChunks()` now yields `LoadedChunkData` instead of `ChunkData` + - `io\ChunkData->__construct()` now accepts `array, bool $populated` instead of `Chunk $chunk` +- The following API methods have been renamed: + - `Chunk->getFullBlock()` -> `Chunk->getBlockStateId()` + - `Chunk->setFullBlock()` -> `Chunk->setBlockStateId()` + - `SubChunk->getFullBlock()` -> `SubChunk->getBlockStateId()` + - `SubChunk->setFullBlock()` -> `SubChunk->setBlockStateId()` +- The following API interface requirements have been added: + - `public io\data\WorldData->setDisplayName(string $value) : void` + +### `pocketmine\world\generator\object` +- The following API methods have been removed: + - `TreeType::fromMagicNumber()` + - `TreeType->getMagicNumber()` + +### `pocketmine\world\sound` +- The following classes have been added: + - `CopperWaxApplySound` + - `CopperWaxRemoveSound` + - `DyeUseSound` + - `InkSacUseSound` +- The following enums have new members: + - `NoteInstrument` has new members `BELL`, `FLUTE`, `CHIME`, `XYLOPHONE`, `IRON_XYLOPHONE`, `COW_BELL`, `DIDGERIDOO`, `BIT`, `BANJO`, `PLING` +- The following API methods have been removed: + - `NoteInstrument::fromMagicNumber()` + - `NoteInstrument->getMagicNumber()` + +## Internals +- All external usages of `KnownTranslationKeys` are now removed. All localized messages are now sent using `Translatable` objects (usually from `KnownTranslationFactory`). +- All usages of NBT keys now use class constants instead of hardcoded strings (except for an occasional overlooked one). +- Built-in commands now declare their names inside the class constructor, rather than accepting them as parameters. This improves code consistency. +- Commands now use an array for permissions internally, instead of a string separated by `;`. +- Make use of `Item->canStackWith()` instead of `Item->equals()` wherever possible, to make the code more readable. +- Moved command timings to `Timings`. +- Overriding of serializers and deserializers of items and blocks is now consistently disallowed. Since overriding stuff is non-cooperative, it doesn't make any sense in plugins, which must coexist with other plugins. If you want to modify the functionality of built-in stuff, you have several alternative options: + - Use existing API (e.g. events, API methods) - most uses of overrides in PM4 and earlier were abuses that could have been done with events + - Submit feature proposals or pull requests for new API to be added (e.g. new events) + - Register completely custom items, and reuse behaviour from the item you want to mimic + - Fork PocketMine-MP and alter the code directly - this way your plugins aren't pretending to be cooperative with other plugins +- `level.dat`, block, item, entity, tile and chunk data are now tagged with a version ID as per `VersionInfo::WORLD_DATA_VERSION`. This allows the server to apply fixes to older worlds if necessary. +- Protocol creative inventory entries are now cached in `CreativeInventoryCache` to improve performance of initial join and game mode changes. +- Singletons in the `pocketmine\network\mcpe\convert` package have been centralized under `TypeConverter`. In the future, this will be injected where needed, allowing different converters to be used for different sessions (useful for multiversion). +- `BlockStateDictionary` memory usage is now reduced from 9 MB to 3.5 MB using various techniques, including string reuse and binary-encoded states. +- `NetworkSession` disconnect APIs now accept `Translatable|string` instead of `string` to allow localized disconnect messages. +- `NetworkSession` disconnect methods have been altered to allow specifying a different disconnect reason and disconnection screen message. +- `RuntimeBlockMapping` has been renamed to `BlockTranslator`. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 39cb18bc50..36f0a883cc 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0-BETA5"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "beta"; + public const BASE_VERSION = "5.0.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; /** * PocketMine-MP-specific version ID for world data. Used to determine what fixes need to be applied to old world From 73e7201acbd765a5b1625c20aa11b977f54eb178 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 1 Jun 2023 16:09:52 +0100 Subject: [PATCH 1078/1858] 5.0.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 36f0a883cc..6f12ff337b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.0.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.0.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From f75bb061ce15d62442c1aa0afb28a071ab83fa5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:03:26 +0100 Subject: [PATCH 1079/1858] Bump tests/plugins/DevTools from `46d2479` to `83f0db3` (#5787) Bumps [tests/plugins/DevTools](https://github.com/pmmp/DevTools) from `46d2479` to `83f0db3`. - [Release notes](https://github.com/pmmp/DevTools/releases) - [Commits](https://github.com/pmmp/DevTools/compare/46d2479b7354355493f72d83125d71f6daeced84...83f0db3f9e0adbf424e32ed81f7730e97b037be9) --- updated-dependencies: - dependency-name: tests/plugins/DevTools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index 46d2479b73..83f0db3f9e 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit 46d2479b7354355493f72d83125d71f6daeced84 +Subproject commit 83f0db3f9e0adbf424e32ed81f7730e97b037be9 From 2c0715ac6e92dbd3b75f0bfe5f1f1b0e0540cd5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:04:27 +0100 Subject: [PATCH 1080/1858] Bump phpunit/phpunit from 10.1.3 to 10.2.0 (#5790) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.1.3 to 10.2.0. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.2.0/ChangeLog-10.2.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.1.3...10.2.0) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index cba7d62189..eb9dc5c018 100644 --- a/composer.lock +++ b/composer.lock @@ -1937,16 +1937,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.1.3", + "version": "10.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d" + "reference": "3aad97fde1f3e490e2b316ba56bc4680310e3c3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2379ebafc1737e71cdc84f402acb6b7f04198b9d", - "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3aad97fde1f3e490e2b316ba56bc4680310e3c3f", + "reference": "3aad97fde1f3e490e2b316ba56bc4680310e3c3f", "shasum": "" }, "require": { @@ -1986,7 +1986,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.2-dev" } }, "autoload": { @@ -2018,7 +2018,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.0" }, "funding": [ { @@ -2034,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T05:16:22+00:00" + "time": "2023-06-02T05:42:13+00:00" }, { "name": "sebastian/cli-parser", From 102fd4d63af34ca7edc5a796de03e05026526e05 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 2 Jun 2023 13:12:22 +0100 Subject: [PATCH 1081/1858] CONTRIBUTING: pmmp/ClassLoader is no longer used by PM5 --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index adbf6ad3ec..6b47a7fad4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,7 +28,6 @@ Take a look at the table below if you can't find the class or function you're lo |:----------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------| | [pmmp/BedrockProtocol](https://github.com/pmmp/BedrockProtocol) | `pocketmine\network\mcpe\protocol` | | [pmmp/BinaryUtils](https://github.com/pmmp/BinaryUtils) | `pocketmine\utils\BinaryDataException`
`pocketmine\utils\BinaryStream`
`pocketmine\utils\Binary` | -| [pmmp/ClassLoader](https://github.com/pmmp/`ClassLoader`) | `BaseClassLoader`
`ClassLoader`
`DynamicClassLoader` | | [pmmp/Color](https://github.com/pmmp/Color) | `pocketmine\color` | | [pmmp/ErrorHandler](https://github.com/pmmp/ErrorHandler) | `pocketmine\errorhandler` | | [pmmp/Log](https://github.com/pmmp/Log) | `AttachableLogger`
`BufferedLogger`
`GlobalLogger`
`LogLevel`
`Logger`
`PrefixedLogger`
`SimpleLogger` | From 6678360c00a19a830d6b9977d82e5b90312797f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 2 Jun 2023 13:34:16 +0100 Subject: [PATCH 1082/1858] Make changelogs less infuriating in PhpStorm --- .idea/codeStyles/Project.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index c3fac9558d..466a1a3a40 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -30,6 +30,13 @@

3!WFjup^C#{pzn6XOzf-mU zDz<#Wd^Q?f2FwB2Jw|FictKfc)B)m1D^US_g=DBQWo(3P>LEu?xlh9VVwEJ*{&+ok zC@P=$iC3omMF?KvCLfB!0ohE0`8?8fMmdW6={QyAw3if&vad%q^y{>8*(sQ0lq_e` zEgMV7(f)Pl{_m;af674OjFJOUgc!Btr<0^Yi)dt{q~dAnBZv7u%^wz<4h4Xv2&L2P zjYC7QRTQ#xxUdGJ$oSnJ8SD4u6X?~jl*=8>l~RdKN3$#%%ES}iI2L%dB+O5xN`Ca< z(jzFJ&1T9JeL?z~`3+o8FEYz;f%P)@)66g3)l#Fmj40UPPl?ns?JuTi!1Bb0y4nQV zj7Sn{u8D0o896&WNv&Q@wnrlqReo7((h&75nnJ95X4Y@aajjA*z`5I#@M7`ZK*rBS zi#lWc4%y76i5edN!-e4)e5T7t6+&veloyI4%SaQBj1^=A zW-J+|j{GCzHWnka&^Qz;7V%4)N(Jo=e%K30c~OG!FGjpLiDUDHIGI6bvmm7p%e!o% zl1#gXZ)~0E{B+q{%~QpFM&728M&B8xEAxeaNJ2c7*;AB_2!dq2z}za$bp$b^kO$#e z4(5m20unqELSA2?Ac6EyQKG2v5q_ar#!;>xx?Wj+SjHE|LMBO4CJDf*FE7b-WIoKx z4S8lhE{o1!wx~!o8D%a-?6_wlua9X{sE*rEw5X|y(M-f2=eFu@n2MpUZj8oD8v438 zn^)b`@2oW5w8Fkxg+DDTbV~dkE6Ap4%j1Eq1;(de1AkDE$qsk256}MM?2N3oVQ;~c zqx0l!m7{|uTFJKi04uAuXX8wN3=pY}FA0&T3%(4xIj=bsiUmDNQ9u&ksWUQ$n)Hsc zyateI61%9dA*xcwt6{oD2ggy?<{wuB#P|?Ef)8YMoD{@Qsvi|;e}^&6Wv9$TDH|Gf zGs*bdI$%y6gYA0$&CWaS1?2`HLHQ9QuL+Ki4LEe8KhU_+8?HYhu2|FpYgc6dvxw_D z|4#PsiuGc@>n78r3jZ4y4At8Wy9YM@EgGSk=4~&f&K3<9G1%Qf?kaWLA<|C(TY9Bi z*mi8xxZy!q_wjP@M*~YvICTq|CeC3;tg4_yX(9XUaaB8(?2r1nKOv{BC#pE-c@MU7 zM?Iyg9hXBxzNDMf)Vb9-=f5e;GHlz z)-Z&WGQWVZt#GxhV1kca0nBeT!lWUF5pikK0i0jLLH;HLrJn{^=s6>Md1#1|hou=J z93r$>X$esR`j8yB$gSTMkmaKeamN_NAe8TTpQXuhVo68Q9Ga30En=WUXX6di10i%4 ziMBfRWJm&j^smB&GePI^aYdsLCf!6OlLT<)uGtS^cR_Vca6)0#E*($$sOrLQVqVZ5 z#N0wb&vrHikyai)MAuJaG9PzX`U7XG0FDWvQ_^26KJ`f1RJH+kt_Wb2NG7b28#1PU z?DHZb{QtU+P|mo2=uP0BxS-y@{YPGIIL7@USPYhHj9*N^;lu(FX1^Yy%-Oa|dCH6pe5aTs%`Bbh&IN?MgZ|r0lRRESqM#|A#xhcjwm5Q%c zbM@wPO;3WZKh~=~58g^;-InYOy*AYKDb8>@D2pVM>r@c9KA09#(w6!rXt_V}MeaFu zWBuOo$M-=Zj_0Sg+qERv&~KI8yvMtrC!3{7hR;ubXz~G%T#=v*Q z6_bGeUAI4aT!XiM%u;=aYr;y6_aeWlzK>TZifmdk69+o4Y1Q+UkQ_Mjm?pcyRSbhJmESAk6CORp8iCheMNW( z8STTS0_M!V6}a93qH}bIetarTfJ9ns<6@@pWId?@2j*Q4()nUK`YQF4^YHP`RpB8( zccKO+bs+uyQ(~pSk@w2f$!QYxVvR>a97SbzT8Y5MSy7&0qG3t}L!@zD?x2cyLEMUs zXHkpx>D8RB6v4lMy#EA5}4{%qJTaw7?340vcC0clf5$>B13sA{ox5iY55|gF(!% zx^rqh1HxaDm02$bP|Uj2>DBHA_n8^)E&PBVqKnL=KT1NWKNjY(QGX!zitDD; z{b^__kSmop^4FwJ1G~QvM9s&=%kVc0el#Y|^CKfY%nzWBkuL~hI8H6_WwAvKjzsNU z%8Q~~_(ZKkESq2&NzsW4i>1AX6(u%HyGN=tCev%G&%P-vPT>~Z0hTOLwBjT!n7O&U z&Yvc_RN8=}lC(~F0dti%8RoAuI;(Y6Qf+~7X_k4wXL@R3&@SUs-GL98q49?V+e%R#2~f zT)tlh;hw3c@XVv4_C@2dWnDd~xOH_fIhkd>{?$rl?IiMpvwEgJBIREx@#nY}6c6Ace^;|z> z+m5gqDba&RE6m=7iP%xoT_~@7*+X;G&N2AM67#a1a*@RWfwf_+e@tZw(ml=-t2Z?9 z+4<$*q)_t@?s4upR=)}8$+#1-C-QP?hYsgyUVQI{8DR$R&vTMi zY@ao>JWZRHV~d_p`K=q?t25a5iBwQKlW|Y3ySC>wZ;aeLXDiQt&WdhYv1wOPUvq5G zZeDkbZQ$SZL1b^?x2%1CyBaq2{;%Z@Y+4#>2JYKyMwHF_&Q5r8msvaXYE9QS43j@y3-qX-BT^@atI&t=XO`j_s`9->1O8{fGPiuAQIh+=ODa~ zql)u9X zB!x(#h@kf3CQJv>iW~1}-HH?96$EfZ2_qtaVcw}r zlSROV3-*&?XG0|zd({J9SHW-{(gxbm?6qimf=ItFC8M{@L|28;vcLgAUJh0Kk4=OO>`t& z6O}V@Ma`7$q|&Tl=8wiB0bY1XAlzbkMGHl(6yxM7>pgJ;l2PKAgp{U^J?77?V`{%N z1G`wwIUOuUh@o@ouj2Q_QN>jd-oY{!S!qbaNc=uZzJ|;a$iJ!%pHTXgn7I)p!RxIM z=a4d&B_mzRzZgF5^7cCW0P;cbC>^~gprs+}4)eczQ3(=({(r-xoPJWFB{Z^T|L8_U zz^2h6K7;{8l8Q08LPFl4BDs*>BQdyWIDwPnFF#i}mIh^-+|{|>p2!lHQza8@44lDI zPoV$2Txc-|QBUODl}Ki8t=tXZ{+o@OEvC*EjTZdMj9sPs6>C@UlySCJc|bN!1J^&hJ3$Sv9yyE^S+IOdHXqhKL^nua+ zN_;F8&2nSy&gqk7A$4j=6zTQxWKLIS2!+0p1y3W}>O$1&=fe#ICMInIy=Y)I;LkRb z$d<`HS@gwP>-I(*wA`vBc_tC_5pWur$}h|@pz!<^huQAg1%OEIwEIl2)TpvWKL7Uq z#1QAT8SF~svw!;goiFK|kJ+9G2;yLGBt~4lqJYH8M zJ-L1e9`RXD3uq`g?lg;~x&Fw4Kz4&NqAVv;aIUP75LZyVD2!6-s2~-AdAzLfn1leU ztblZ)Vx}m9xx6^zIU}(WTDMYBS%*%0QdP5}XjRh=ldi07=_R#R?yFZkkxArTt%94D zd>C$=L;gAXwKgdKv}r8`X2V1TXiyE4s(96n^P(nfO>0eLgUwqJp75=cIV|FB#|XhT zO=q?kwH?=bS~aZ)u=caBPxlXO-8Z88_H8KFnHODG+-5@qE@pXO28Y^!@aR|&c|9FO zzy6$s(6obVsK*Dhet0a&`l^%3u)`6Vq8-y|oG$mB(;&;iU667X2_iEJjGkdNo5D+)|D2=I4TAC?k-#!;Ftn~oX zA6SP#Z;aZGFry3ak1M6v-S<-3vs?GGe6a*23KK=AkIL}-@6T)Gusk_ZrzYJGnnH6t zk2*^Kc%E1)i3;6+h0OpXa^^R%#; z`U(j9dSp1x;G#@~;Ygb42YB=}qV=o`iMAOB1uUy$v^sXg7lvg6S}vmz!wbo;Va?Q8 zxMWCSW{@3O`4HZngj6j*`j_2NsxF$yc_2D<(mQztRc`BK2r4~KtAd&jcM>;o@g{IQ zD%Q*-RIWi7-lL7_><1-%? zW{acH03Hcq2o?^Kw+A>Nl2^S+0uA&k39a@yYvqn6O0Ol1eP}Fi4pkDBUjKS`$9t@v z{szUCwA~_Bw;_JEM1{E6CaDC^iY8Ntze>K|eCkZ2Jtc3oS)XCFIC9)pzQg19mH7!F zdqR)%3kK<`R6EF^4TV$3(;HRBu08<#5exsmo~)o#R1B zd6}ynN4Gx}iO+7J!%l^EvrjeuFYDE2G$4#I^ZR_uAdE=t54Aw?LJeB)Gd(nu&v|Xm zU4JMi8~Xcfq=!fB3+d!hP`G)# zKJ$^ey{aSeev(;+03<`cLU%3|QRI$3`ORoLovww8J42=s7Ni7M6_QcL993b`T^LJ9 zQ(lxkQ`A#T>IQH?Axv$b3gcu2EvSGqXkKi%ZgH-Gp5VSD=bq>RU1hw z;Oj;OSxUZ=^7YmA{W1B$(F@6BMIYy`1XT9XmF~tD!p7BKvCJ~rBvw8sS$`Q~Znth= z6eqJOpMUFlioY({ZPUCtY0p{@OVF=roz-k-Z(r}MwCT8xV2S#+&m4c=_|SAx+q{YV zj-wTcs_N`3I`+IR4WP1*3?@QuhKHzDsq2S3v7CEG7#i~HM?uw9j)SC5faM+=rR+EY zpO;ntS73LdA$L{AnRvAtZ?KtS-R7o=&Xl`S@P6{O$Ib_HS?&((aZ*&Q!j%bn)l&#k+i*Z`wx zUN)bE9}2tMn$x0pGc5A@^mfx40}Fl6QQww-KgteEU@Irk7OE0vnxl?U*K9xfqk+t{ z{WQcMU@l#6HiRU0fB|qjM%d^PaRie4c=Bb=;Nf&|w^InU^I0_RqL0W&_-d4)Px!}V zE`s-siwdB!cblp`{sLw{^&j;@Vx2eb+P-r4y|unx58GDTU4#itesCCZI3Pe}M~nAI zFptB5gHHQ{9Q=U+ua@&og8W#k| zI}V2?kMqJd4vb+2mJmhl^$)WTntU+Cd_LutBA~$urC8fWdCw?8jrD~`GpvBXT3m)% zbSFYv85O^2I4CG;E7Gtk9N(M{s1un%))}XfXjzg809smkNleQ}-DG)7G$P;Kz{my| zrMVTq#8`MCQ#O~$abC>?I6dx=APNlgVeLlKGJeOS7f>i1-%fDq4x)c$(HHa%mY6C( z%qJ_L_%X7SY%g;} zYws}QFcpZ?MNdrX=N+dm5m3?9nae=42;w9AqWr>SJ9D$q56WiW7^L2iv6v*o*StJ| z7{HUY!^$8r=^o}>kqBPh-Dk16g{ZPdC1za_po*Nfs@gQo`8_>;6i4z<4S*$PKiupK zz0|AtceLXFRLYA0SRD`26PN!_*(i*Y`rooqQ5dm;J-LEro?INUQpLR6mC0x_C)L{w zfrb#3OwhyOyl!2zTJByz3QJkproQQW z>Py8NW=%M~R>5_WpA6sYWv5Ea+fqL2l-pHjurZa}Z8qTXqY`>8oEvuIpy10|>fpip zBY-5`qxvQCC>$vfX1{=X=u|Gy*zq1Gzyj4mvy{Co|7%Ec2Aaz+%(lKyvmmv?x7i_I zt(FqaU2AL}T#n{CJn@~M^vr+wH-vA>I<7f8ZdUt0tP6Mix;butWBP1YGn49mjptN8 z^~V0b^!K@dVwzg6Pyh8HZ4Ceqi#)1beb?UfzAbJx@N9lU*^))TLdEszBrc;2C}biw z3dF;4%L#gXu}kGe#1}?lB%7pDAi$WxL-TnQwbL?NW27Pt7(FwBf(&zaUF1Qs?>nYlU~kX^9GrMxU`#CJx-=DKF`}eLMak@b!0E|1dsGUzua*ksY|_jY(&ZHq7L_%! zH%w(@BZ5}tO$B;K6&;<&7FC6gNtNu=l1gze<~8-zS(i+drcu`%BbOUyj=62V^1aKn zVO@0*>TNC$VL21uO;MU|J;W+HYfJJcJ8k)%k!jPmUaw!?{-`H(-U{d09?ylz^P{Ja za#ygwA74(oe}ISxG&o3BxXne1=RnO(1i&jA?v)*Es%WwaR%C zshC*<{!^j%TN3MrZwbq|#npV8Htp4TYd9nCyH`GUvAsW9cD!EaOJ`9rZrP@R^3T3QOsgF^*Nc#tbxfhB`mNd<$T@dX2LB(EHAh&3T2nFuN&;^~@n{b6i|y-_1y zXnQhn>|ygGuZ!by*_=?L!;2UvG8FB&WsV3er&G16DF-s%^4~g8V<#?pkH@}6NhvuQJ7*6 zrbZMPP>MW0uQofK`#h4hT)+ksBcDHRbkN@%&Q%)@<>)u>bgfsTQehc9y6sO+sg>4H z3T6FT?O9y++WKsi>v)@9YUpwN5*R&})@kyC+N(|SgU!*jdPB%yjZ^|4Z*V~vw&bVP zAc9|?sY6H{m$p@?LZC1dIzl|^h?g~K`EcwhTiZU|F*-ZZ`1@|#F(QAU@8cjT@@5gA zs$0+#*qNCq5~;)i?P=7x9MkgS>EVpKT$1j76jfNkeukCpNO7u>A`QKSS%y0(!+QUS zp4Y%gh6itQo{`eYEcazh>nep{EtL8@*%yF)_i9-#;-aw7T6eB?F>pEG8oG_Lt*@Wb<+< z;}<&5LJx#-rbM2tL#L%UEN^B&A}UgIs$vvh`2}Cw{QRziZ^JvQ7I^w|$^6=jZ$YN) zJ@2YwJDbbAgZA?i&$^3~NZg_a%c%xNSo0PxV-!zk?@p}#efKUl{yn?DxAxhPHyRMqjME)0$0CyId)OUB{&! zFnWN-dAfG6rlowlZ{~L9?-9k!o)IsHsA>U&U+u!{Mo8W8NoCQhOGIMb^RL1GQQqfn zUw^ahey!Pe^tWEOm=ACP`aLm*iUnLu5u@^kpb)lnQ{Zm;qIDx5Wd92T1gok&Qq*4v3TWnWU5b9<5Bv79zJH zuB6wymBP7%%P1wFsGD?^RPnAD{r%mj&SZUxUAH+qPvaQ%&1@=2fQ~tEMA2kWGX*5^ zf!m>c?7ir9Y6<2(PsP!w6=g%pXd?mpLaQo&%Um{JSm}%YRw)D^?$I<{%El}pis#aF zoox#ghnJW4dct1kKHh|hIlxc*jV9(Gy($y^oj&c)+L(_Jd=okKWzTi*)p%hx1 zMmUYL#(z6f?UR9R4oO_Er7oh6*^EY3Ijt^wfX{*ZL(xCkX*6!@TXmRpED@Jw)Xo<= ziMUFkXnPfR8%1jUCgg2Gc^&fsN z6|UYXEndwTe@QtpfChzoBdU$tJ1O;1F!P^#touhbVF-^o%qe3FBe9Pr4}-;bfjl}bkqj&^`CxKnT-yxn!e3XZz!0`lQE>GSY|$+ zr_gQ?J-+|>ak=5)UdB`Z)&4@3F(OrWmV5p|u$Mxr0qKXLllX#9i@mu~o; z-qCDHfJTW1{C|a~Zn|Ufp&0v}zaY-_zcGhW29kS#CL*R8cM2jM`-yjgDp3J13*~s1 z)IIjg5-f6b7-|}ZydFmDEl7`|AIpkBQWVEa$|N1ba@ta4EGo!UM6N-qP%Qh_XK*({ zPg21w+JHv4IKhOHZamY@!>l{YNi;=05ENcenv-*Lq#$WOxQv_qc|`yx2k~^IG}jNA znE}wNGE530?(Y~R{L!x&v*Xc&%ETigOe`ebfO1HLGJ3z^ipt5YipuP!XX&A;h9(m$ zmc~iT8=+#weWRE@08fkec!Ygr%~g~EO4Ys5b>_x0P6l)!<2X}n0H2wwz`p5S;!lH zKKrl(@bLB5nPy}@etWfu=>GI--b77Bepwqk`xT;<>nZP&L*n!M&+8Uc*{-VwR>rs6 zp=5BSwIic)=D*tK>_5vPKXor; zV|#-%HW8!_#X)iE0j^MEB>2DVw7mnz5Ag1@sC*x;Bu=QH@-~t;v>V2@6^_xpK@I3t z2s$$npmJkLlO7rN(XB{sw?N{7Phs3C@kF0?2M`xpWEmtiBD942Uw(n&u;CR&8i00) zM?T3)6=_6Ud-;*&qRKH(eu2|<-Xgq29ppUw66>RE3P!pUWR&G{aY))B$7kx2arqMO z>4gY+hK@)Wa66_8Ll|}rMudI1k_wZ|z`3!4NG!;k}U{4{qwL*T4^f=_IH6xuzjI+U-CbCZLA2be*$3&mb0mFeL%Un+LR< zNF2DUdod?*Jlz~fAu-2=&(7r#ifl_VElx+v66D~pmPtrtsK>kfTPgcL7rwB+>11;G z0^>e79BOvpog|oe5E>i0^DU;0FA<^1n%C}#8NdDaRDqk!AnNXVr8HnO_1wwzTj;#`$YLq3$4)C zwf-W^d?%CDAIVDId%m*hk#xK4UB-|z&+GCpKqY(^pJc2Fy*}PMA-XW?CBUXlDR05q z?4*WA@p*S^Z!(Zd_Uuhw++dsq6)1cAzWj4>#JtJSAL)nJ^57PSQiF+}pH>m|9~V2b z$%fCqcN(MA+K`z!>~OpPcBy{H=LBnwZ79L=y0bqR(1?6)zI_b5yFM7IG}NIKx&L{A z(&TC<>hpMabJ{m_oEW-d^Su?0FSz8dz99dH{+&@_dmPeQLUK5Qz#Z=ZJKh;o`pd=07 zW@InJASb;zVC;LVp6<}>qJmLh3vF(YC0&yupJf`E6DJTP}NtSW0q1uK=CHUx8O z+VO6ft2$>%S!?>Qjw@<07_C?u+5{u3s%FtyD8FD<5luF46Z8+Y?3C!?0<~w-wypcB zK{YKWO(*Ov7YQuqlIImVoWt@0N?~h zuNy@XvxBEesFdSp-KIk@lDlDT|T3}mqbhMZi;cK!s_@=km^n?MmAMObr z0peG69Hv9DN3w&FDco>lzI#~2B6^(fZOSxEkrkW)BEZ6=^im>|?`W1CrS$E$45O1p zGP9|g)16;%bH=V#C#U-K7hCn=L|xJ3RgU|JzFmau>wd21^Jt@h<@M)7&2?)K5W+9; z_RMI94H4ypWO+LhcLg#;$9vty9~L*~;GBIsNbtHw1AH&g(MNGN#5;yi_rn(e3~)gW z#3JvGQ1Zp`G~IH7krLwa|MsPByHX+G(D=Q?(t(AejSf;v81AOg@&Xk-rYf|$w~6ZA zKTCFEMDI~|B_!*mcddZveNh50lE79R=gZcWcthno(`03XBeN8BTc+aFX;usML_(1x zJv$ztGJ?bTPe44r8%$s@$McuVjyM&FluK+E-bpKsQOW)hDV3t7qP4k z6AT}t8oDW(r@5!Nuz7i=@d9Cub9&O%G8|g3qh~O5OxN`(-Yrs3EE`Df7u-0nU7IZt@_t@8@uQAuWL?;HounLE7vhLbsr{PZJA)$@^4$5 zPq=K_Jx|;&I-8n}?`Juw_8jDe)&Rw2L`EL)s6{y*{6H`im#EI^%lMCmzV|39*$0&O zX9RHu_eT}A8y@_%L#m#q_B%Q42OWWD?d+w6l#dtv_`oAzL#qG*ILLe6aXy0*3-@!N z&*zbQrJeV0F!bh;^P+Ea_%WIn=$9s@$m{w;dm|P=4U7SDm*n z0)2kA8}eK=cOl-M`@-{r;4#9)LCp3DXV=+?RPthIs&U|#jd{=9Wj!xkrUTJ2sgGn) zCGa)veTmGrk*O|vL4$GrG|omZp6T4A{#0`Y3P~HOsCM_`3v(c=2hpfl11L2xLeLBs zpx$)LunWQ>4R?cy-7f>VQyg4XoD0qi7-dq`9l+ZC1%&N~GMs`YQD(e5*wah>4D}8X z(p4tpUt44ZS1w~r=XWTjQf0+tapQjX$&;Up%L^WF$GK@isL~II`9gN15z@`*URVq% zALG(?R-%E(;%no!zR;H!jWFw@C1{VT6IBF(*|-3K9u`T5FX3qU+4zt7f;^B0NDU6_Owqz_DZ4Wg$F%D=+ z9Y~;;K`XYHi_9&MU6=VxG?*`qMk!O#Nc_4~Jx}pT>-(`xl}xkCPdz+qok-J>x8DSL zPiMXwW=ACJrPQdmzf0ctMt8L~3_!+XpzL;oTc{$WRfvHUIhq@#aa979Iy6C3xg5*@ z`ouLjlEj8FQkC9-K9xruM!CMkwGvtOruM_>{nvq|dbSuo^;O=pkv3h#lNV&Xqcfug za%%GB9zSuGq#$PLoH4(ljJ09UM7cO^&gS#guSaXL!L9+DJ*nhslwV-ihiDasx!yv< zXPd!thVH+!Q*%E5xFf>#+dzX-`iF13Zhd}g{Y~WsKgkc4Fm%3^ku(h=E^t7Q0FVIU zft0}rmRVOM9L_;vQ%Oo6`M5CJjkmDyxFS^2NVZvqoj6_(RGJtFLbqw`gan)!DLWRE zX*>lblSzWo{q1t1h9VkmG9OmZ4zbQvS#hGc%h8@pFQEIP1G?{MmJ@=EI=UOo9aj*j zFe}OI?Pp@hu2>RK&+*WkFU=){CoRhhBD7?L3oEHRDDZ7#VnmNuRb(ni{dG57R_I|` z!H-as!Ax0IpV3`ei||a>Q-ufF9j|W23p%MTO7W9KOd6atH1V?Vw6Y1JaEjkWfh3t4sDc1)yo(-L~osZ7nh{yEbv zta7090U@}ji+BrM*G(hTEPZ?rRG|iZ@yyu(zC?~?S^d>U; z^8!9lQiA05`uW01auq}g&h`yRm3M|33EM^RtpX60#0_6lBM5q%07qFcZ5^-u1biGkktT5$8mW^Fx;2LLgb{ zzL!w@thyHM4Q*k*SKHO-p=^fIC!$E$y z+1FYC5)dw~pvbqAFd@E6VAG?ZI=Yp}od&2@>ES^CenLW#BpqA0f{I{mVh(7JQNdzV zIZrd85`sX_lRl)~ip@QT3#NYgjeR>J7Ps9Fy+n6ei0C~PZ7GR(79*H&0 zMp8M{N^WlJ0Cj`b+_C6rntn1@oC%#o@Wwp0P%e-eNxbosLXko$f(>&&qgMIrOg)(h zz|N}HXxG$|O0h0(NH)sQvqGmWY>w&}PR3{i@^_ZYZNWmRXKL-1(6#ZEzXV?8VG zc(M>(=6bHzZRK9lLKfDt10%lwL*WJOgAFI*zl&jPu|Gh}r`7IU6a4j~z0mi$ma(FP zQSERhHq_#emxtPkVUsVmnCQse`ROLV+Ov7-^K&ar9t$yvX`X+wKwe$|=<{}7ARIE( z$RC9?aVr3e_tuCA*M%GGPxR&!wK?$z=yV9V>@9ULia|?W2)0X$N!ZJ_;jM788lVpP z-Z-cyR_tupG?ow^P>`evEsEk;AiDAK#GFSE8Ffvgy<{De*8UWI1Xyt@Qjo4Vk6D8I zNczXODSH{(j>~(geqjP1(kJrL>CLU{kM{BG2bt&r8L9k3j_%oVX_nuLd-w-i?s*0& zK50ut!X!=0p5oLLAfK7;oPj1K7DQUXTcikFMIaHyxT3_j5lAKJwq<%DrMY-OjaYHc zXmO#vBy)LXZ7=glRZf71Re6a)(6M+0RzGuHogOD^^0J#G24``Xuy}^Yj}gWz z>;9`s>_4#<`8sfq$loq=H{g~IMo>{mA}%$N2_xn~mM_C8==(>j4Y6F|NC5e7qenO7 zLiyJarJSsE$33}J8q>+5k(m;yEd0-B1dOGhGqjM&y%MN-e)z>C~D_ z558PhE|g2mFkZQ_m@hZ0GMH%ldZJxtGL+zro(x`Tv}~{(So(gVQ0E9s_%8eVht^l` zo2I?{g|e;I52pn(RcW>QQOMk6#C_>JTLG<-2c&}Pj207_La}$s>NlTe;gzvvsy$xm zOcwx!&gGd+mJ5jQPg1gH!X0+X@&RyyX?Q(A-SFNVg-ScR!$CW~2#bzXfpJ}a*@1fi8~Ud8%$vu)9Z?9JlB_*x-74a37QBEqsb`ELHv2d zkk^Z;$Y>pslT=m^d3MBD6tAdP<`!zu#z>j*YoxqL(TmieEPUl}(WuBXO=T6ryq*tsPJKk5cna9Qd{*~h9Hrm$Gp8owI| zSv8H*_f|_x`zYCbfzex8wH^>A+15>)NDqJeZJA%&c?sL%zp}qyzn-)2;1338KY~(}eJ>IJ4~`)UvPZ5?>W@D-M{qNvaFIA)Z}p7x z5Cx4+@Sl9>ouoID9-rzrBWM`s^)%v{EIS+rJ)YGjTt z1SpX}QZQ~mmEKha!FOEe;KFqyUUXmdO@SU(8|GA}Pg_nl+RurRID{{;iG3gOMou(^ zuG`N4Jf8QwHuPRy{Mhw$x-O;$ciSCl_jI|>G4<_wQ;tgXC(n!gu0JCm=ZBx4JwxDf z^E-6_tObe0A3=^Y2ANOYDTf4w{$s!vpL- zxR@s7rX;2IgS^Ma(KcSR5(S#ga}qMU z&5AjD6edhf{)=7-#fgy!O!~+DozN%GN+Vk(8BdcQNtFL7D4@txP7^G_{ZD&6iC8p< zF zCv!J%tX05OxzLgEc`L2Kl=xn&FQs~t$A0_RS}N5xtKD@BT{<&mYo*C@V^D;r*_N!s z{pZ!2NId(ktU$B_UN7P=25^y2e8{X&+wHcnop+PM7j~Y=aDHH`R zsPZiiD9hh6x0f<=15h?)yoh3Vh79|F6m`?-TAMq{<>_U`#r8lvgEnP*>*?xrvD!1k zt-kmpnkI6_L&z~kK`G}jA%n<0~+ji0F$fOe23xZu8@jA9P>_JjtQr31{ zn%}8dQPogj$x?~=5@?{0Bxnz#7^Zm`t{?N*scNYA0iU8AYUx*l06;~(X$ecI>dOf8 z*bmw%Nvq?=dA&%iW<2Y$>Sh^YPwSSQ1by4axr%o7=Ccm~yS%-kVb{8`#Zuk*Tk|#U%0@5!ac*ZW5?YiSe(*Bqb$uZN0t{rt_i4K z{&6`(O(x|yQc{q`Ey3FSSU=7)2jI>82UXXT^o3Q9(;R)uyc2ok-cB5f=fVqK7okbw^ZhOKdkd0K3`s$Qa)X1e_Q2} z_I3guzQOGl2QhB>V>bo^`FR{EooO6Q_h95#Wr+xH&;1r(Zy}JO_Moax6Ta*)Lgv4X z!19>(14-nek{x#A<=_N^TEWO@y}g9{yTP2~VVKV^<@@lMw?dd2x6t_ydx-+ zQE`tu5ERW3$xht(OtW1=v5_IJ2=2Hf@*<|~G6fk?2jT)L8i@}*W4fIENZp_kx)6)- z;&&XWZ~oy0DHGu|qzMY_?>P$q3R(hq!kL~cx>d+bHI910>;q@6d-{)8y`+cIA9(`_y1To(ySp2t zq`ON&K#&k-`JVaC#5Z&Phy7c7t>?M#>oPWDUq@zA%ovZ${AE1+7oqs2lRfhZwOF_= zNYM&6J_{+MNCcT}%2DVl`%%t(``?qE{|A7i`fo85(ORqdbyA;>&p*rbr~x5dcFS=W zOmb)-8mUZr^G}Mw2s%zDrg+TV!XQk^T#l4l)7}JTXfH8=`M!9XFyiJzv1{~xe zwE?wn$wi7=QVFScQQrikYfT0F60Cx%KI8-k__Bp8QPHLG1@M_Nyz^DBu?(2|#<+-X zG-4|d=9C9WHEUq@lVrQr<}#EhnAS+I-(-iN&8%~Sy4@Z&!DV`<@miGnH9>^ z=Dpna%EIw~X4hNdnsGam#u*T}8t1I@$e3`1bnMaIp|2>+hdw8(Cl;e+}1; zm?eKfZM^a2*0mhm9bz$JT652QF;DbsPB;v;a$5}_^dDYB{3SO6|FvL6k*n_@=cLE}4= z3CxY<09UVs50c4dGx4B*E~zNB#h z_DJmZo6>@=b_8*@c2fhJyA2bo@#~F4tQh2 zJt(r}JmaCcr?umJX;$@4aN@&&qD6)JcjHJ6TlR>svRn359oJh(vi)pF4if>K z?WhPxZ2Y)P@(15u!Us>O{WP4-+k>1FsM`@FC-Y9Yyy-{lZuOW@n?%Ekr~8lAINMeL zCwnXKGoDECe!oev=i$fKJQBf^Y7BCIvfa3k3^<2*T@!aF{M((BZ~IA~Bt8ed^}O{? z&l18pZF=f_xSW;x6Y9+Su!o^~zw_Z~9q}#9%$fByBiSP$(>~hx0k~8TT-gig7(uk} zvG(Q@F(=0}xJj#D!HhjS(-I-QDoz(krG!WI_@mgz5VrKKcP;uGq3=@C<86b5}0 zA{-0ohNdh1jdzl|t{MftgwuXq|{ zRLV5!Y`-o4I+>|98d2bM|3)u?YqvFdC7xuvoI-T5AHjHItlQ=+4=TgXKQ_935ii9J znpw6Z{kW0R1YGyM$C4(@xm2r}psLyO;srXlRQuy;{8fL5-8d}9intwU4qf%lrs0b%a>V#0o>F^za z7<8sTHN0`+QbD|VXo+!}Nhb1s42o{{0X%{Djv0q8*c4{Me;=Wh@PcJ9f9a2HY@X%C z0u&ywf}!U5VJccjnbCLj7En=tzJ3L+c*{OrYcL5%E1!vu0Zxh^#>XWVC7>}}6$+fR z#mk^3hu_m`Rnk#A^nu`(Hs2!+TRWyvUJWr_miVbu|O1g};jX|$Z znCdrF7+D&ZQdgK-XG+_C@b0#*d>7uxB|qaOK-)R%dg7v}?iT1YtnOidR({?M*>QQ@ zOG}UXx-SCv!LAqkUbbcc(J1}rAo>S^L{6$W0o6`+=Dga`qxy6OHR?1E>`~eZ0O@`` z_fLSw4#-6z&!oT=!M_hP=ASEq-vBzYyv3YUjZv>3 z(tqXcU|0;Pnqw$sqR0@bi0O~W#o}1snOfgs(+sCj+N6fZUv5uE2=Wg?MwRFk;`uZ$ zCAYmh%S#6 zV1?^&WGO$K!-Y6BYkz<+n8qElL8X-%Dw@tyyEClU87Sz+1zl;nKVDxW!av_+1`vtL zhtJmi^)@?CnR;t{c3aCkWQvjYw>Pa@R#6MOk9=<5Pd=cmu$I3rc#3aVBf*AHD1-WZ zWzaYa>W|(&Ka307Ezieibo!s+34`@{QMeAt`~~Fb3<92X7qtV4?3*)#$O7po0zN&% zCzFADk!%=**7%zuTy4ah;v=1HFr^`m|!gkkGv>BSqOOQ<0 zAIQR4tbdS;UpjFt7js9uQFiCYZ5xynG#IDSTfw*>jTL3lPz@FvQtck*#emPEz{R|k z-YV1g2_>vJKh@1LKelufP$cXL8H?*9Ez9znOBuQ=E9bYZ{AwpkzqjK!;vnR>xuL)t+4axI|Gnhq%m{4#zuLwT^yd z4Wo#OdF{6ogA3NHWQ~h?@w!er?>}VxLe_DP;8-+>`r@}_24c<2)=l3z7wx}3$#X9| zSFLezxqGc~ujRq$ajyHlBmtL&JdXa|cva8gy<{_%0dNV};>AMoCvg+miPv-ED=u=F zJTB{-KtQNA${snbQ@3^BZzk<^J;(|Z;)8bIMdMiWsy%wv^`-ALz1velZ zRcJpMq6O*YIPR$1A1cCUZLqUxdV)U>^hw*U*GbvN@6Y^5Cm$}kjl9@j0E#lqZ1=Suv1CK zGsvMB?KAMk+K`U(M<(zQkn9d{o4@qO(2wAqEfH66!tTx(^rwaHODnqDKg+uFCwU9q z{OT3@BLg@5Kmg5c3Ww&(;kgZ+uoeB34`zHW6552&ZOL>H0!J=fMln=$Ip#mqt9Yis z$r^x7BQO}fRT@-g4+i+fh64=vZ?MOEVkl#yNRff0`8@j>P==BC;eRq@0m`uVON(z1 zhok>auUxSUMiVe~JN@Y$Kuh$W=@pJiP8L%@FREI+=}?+f;=c8?_OPT)y-v?(QMdx$ zc3VxKa27h!ZfZ8VVv$uEt$8k2C!F}t{t#=`>(3-(S?P^0)f@~%0*=-@+)HXVx+ajg z>o|fx?Qn|6YIO>PTvB1?N*>6saf2#J$caE?d!GG%ex~SC61orH$CK{5mj{{YWWUe9 zjwEqc5q&w|I*Do`{jJyjKmY?PrNjWzcKtqx7my)eyHl`z3aObQlnzzXFz|*&R|9+= zh8!|K3=y6ce*k_Y4}`N_1caP7i~7M>v2?K^q53?cq41Tzw|vQeVC99wO`B6j5>qtq zgkd})QNeI105A#PABuu_J{!Y=1gzNXg2YYooq{AHe*zi|;|nsNXx`_bPT_m}2|yQz=(!7NltoE>UMVt!wV5m|yemWvL^y?qz>?5lWk@$S_JHZEL$- zoIW-k5}qFfdkxm?EEb8R#kt1=rDfPugJo66PhyrOg)9lBrR8p04CRKyd{z~W>#1dx za6gx=6zYUv%N3gL-kereTLKVSw%YSi`bEQ)-o_OcekGJm-{<|!JI5T%4fCczLCWmH zsMNe2``o|fK+ClM|ZFTYl`7M|9)){R*$oJc&%zW*W*rp;`YdIOTo#L=P((eUxA znFD)CVYs9FIl=xt2U$3{6Nh<>wtPF0LzpeQaPL6xO4EF@S2E7@5;K2Li4lXJ?8%{v=rL%sW!T!{zi>H{x$3ch z(UV^AJXo3n0(z;kpVm~wy5((6x6@KK19%2*{p=G#FI7yKi?M0KHWVg(i;DmP)~H)FJaq?0|DYy2Z%}C-W))00R;_;Zf_5^+T*!0IxLe-v=l9|Ax&4 zTxayZTxYnTpn%Y@P~}MF@R-=p;E=easOY4$umrgD*p%!%-^~25+@kctQvZ^QP?_4= zYCn;tCV!>2wg&XN`p)JSzxIxXZkbN>K9SbJ&XKW+ukF*_vwh!&#;Q3tHe#f9cGem; zx59V#_A3rKw@<$RIQ+R=%6`iptMKPfIusTGRrs}VlpkUoo!YSUMyJ%{qYXAsHCeC! z^Ei&VAyx|EP09nR4TcFo%S(L_p< z`Ei2a1F39QGZve>tK7L<^(3c1t+kfp<&?~e9c@#w8(jwk1VTDNpI)WA+|WP-T==&K zqG;8Bw6)kB4#j*_>CEOkKk2ViJovuW!h0yuFG<+z8Ei&)Zh`A2k|mUb@cZXW%QHQD zk6ZsavkkJ_BS|E$vjOfb?;E`45AMjlP5NKZ_HW4Cv0!Qwo81uG9ZY2E+LrNR;2mM`)*wyUavshVl>6I8M ziQe6Kg;oTUSXHj2oj6Iuls&X}nN9`qAJ&z+Q_N&?3ULE4w+ho@UXvH4r@sb{$Cw96 zxKxYErTsLqeqLIf&+8+?nNL48yHl;PVa>C{QDqKk0!c=LGeg<#4$^!lH4ig_2a`&& zB4L;5GvWyeOZ~$aK?fxOldP=VpIE=FLJa$Yq1=C5=7g+iJGG3gZ5gwyssRC{qS{FK zt!kTC%7)SBRLZ&=7DTMdP*?4>kzh7q$ut}04a>Y65gkvM$+tp@2wM1)-C3%8N*Vi_ zwjyOK+Ygt+Sex(OkFj<%-Hq9H7D4|189k}Lno(kGd!(LdgZv;2O{sVnC4KL(myDLH z=1N<=f#hTo>BAzFgW<%gmRCq@`BJgejG3s}wWg8*%;FNh78m&wS+JVEpio+0>b*wK@G|}>Rp)+c$VQ8Sj7wJ_fQbG3JxH#`v65#v4Y-~1*e!DxI*u7*R>91`%>U>F3WoOrTT;0I|b zLby_fH>o)0HH@GQU~(IzAhn$r^%^_AKU!2oKR*W5)|fJqZywYbg=t(cW5h|2p|OO_ z(n@g(*hqNsu@GL&1ZfRd6EB(dW|KIexhWI|b~_VsE%bhqw6~qe!s+iPU8g9#Sqz7= z{ZiGj0^xsV7w1-Upo~fQpvV-z3MBETgNCsk)8+dpfT1nCE}v4N0MA{qM2s7XW$_(# zYDoz^!QW;n<6Nuni{@>&(aJU_pcySgcO0nhvjp|h#{E*ps-g!Vj)1|`wiX{EG&-pm zWm_o+UNOdsnjyWi@)yf|E7DCfde458Z<~&lw;Xzw&A?vGYoB5N-hN)n{=jF{-}Pik z)zc04()g_B_E_7Z>k-!4zZ)W}f8KLL)Bdpw{jH92KQ@lor-56&@sER;I08S1kXgy? z`(ToE?8IC9iR+j+X2ZuOxVeLRCh^0!>%PJ_P&hJjjsSFY?PfZ=oxsh*B^?w)w|-iR zwxWJg;4K;_R1~KocDhxqf`dilto-wwh$3^{qB?uVuUT_i%|~J*V?} zz*!OQVLa}`vqQ7D$44w)_eLAn4~X4+oQTgc{q>n>@Sk%4su}#W9|GrZZ*-w-vhS2q zv#-y)kqmu&@!H7<*_xq(F6Vv_O;~RfhzI7`6jQFG)LZ<&LklEn817T%4%WH#OxH@2B#-i53qNVM8JBi=pg^A`=CFCrUX!f#`@5@ltOV#KQ^s-EgHZDWz#? z6akpIwqPuYkbAUTT5WS8oo??u{P5BwJDY6;m)dR4c&31f9xS6AkB7AMt^N@5Ul-Qa znOR6^wauRlaoMfRfuhDKYn^#Qi3!mNb5AoUYBabf8S8aW++P1;#5`ZE_Wzl?HkSBl zr#T8#cGHvWwZ|fnDF_9Z*4fU+h^Gy(C9APTYf9&Zux<) z&1Iw7^y%cWpD5;NqbFe2L-&E_Vr4Al(le9q&MtBQPUA^2^Hmh+Bc*|&27ZA14cs&|uuCQOLem&l zib7hQnd;RJkV1)nPFE*V(<}h;E(_yWnVE09aYJJCv+=5$uGEQIwj+D7AB5;lC5>O0 z>?3H{$L+^hxw&E{8+1}p+o+{#9%P8wr@*AS``*$>e!}K7dmb$!ql5+Wc|!$BGyp(R zNWEo&?FI6A6#22oLnWTwxuvBsGJHy4TlHi)RG6-HO<$b*s0_xhm0$oB_cxzc?{sGY z(oLb3rJaq-BGn1#vQ`v>ZlR}@p-d-?OgMm#4;=*P#uvM>&jGqIb$_5$FL%^@?-nDCx3MFPGT8+>yg$V7(j)7I>Y;i--zQqR@Laeh{RskyrPIqGJ8wAa9 zoIOkFazb>sz3%H4&S=Y{5en*$3+LBt1J(IJ@J!aVH(l8{UXQ zJS>5vwkcrKFNCrigCPcpWH;ZP_tPBKdACEsu<0l^%a)g`)C^tfBm)E1eY-Y}1o}OG zBa{Cm?dH+_Fygu5!|od~){ZN9wU2*(Z5d~MVPEC$>%ZCfO40e7G{Ml5p7V2#=gai^ zjmN9=53F9#mOpL)Wn$D@+1rDnuFk*ns9*bL9d`kF?(2P7kJpmXmpM^1Cq@9(%p(jt zQ{@Q?qBt*x-(KD-eu3HbhkyP$2s?4gn*-{H@=gP+r|gJd`)@It{zlcqd2a58c`N0wbhS&*GeKdSOLjCevg!dTMT|Qm4y6bu^<$^HX6cXOwm*`EFrTK6O*2gjAkwk(PxXJSfZj8-yTuq zdIK`a$kcV}qpFr{F&WlWbma6hvz!;Tjb!uddfL?|JA6l zyk#L4!eT!S6d$~h8fSbsr3=YYmd4E(gi~kBO$jPf5%^CM+F<576uA%A6fOCk2lwwlX1E-CxR%?B% zYEg8q1fIw{sa_b38fL zzhIiJNjT0NNPAb+T`Bd4t3cbyZn+)vr&OjuOQOkG7n|82U5SGkV>VQgNKlJPj;dJs zMq_O!&T1jv=)++7?Mt(-u_9qKf)gAgbETSHfv?&wPL~_Www;5>p7}gyl_eA(ia}`rnk0QB7mhbHwB%dHMEgC}~ zJQ5cJU&7-gEN&iq2USJLGZ1s$gAh=;qOK?JL?Tk}=1B>oXrjmbAqb(2B}S{?6_ZCn zruI@fro)MPANkA3QbCAUCkB7-kXlwB#j!w46W!I+i)c>sfZk<$X(Thlcy}Vpix9z^ z4AAql3tya}#2_BU{tzLFCH1H<8kUc~ATP0$ z4!*kgNoERCKVu2HAt)#?80{C)(HPyZvP#w6Kwcu;upC}mv3P!a98IWGGMZlE5)-4M$18oIv)5k$;9il4wy;_*fq^0NJB&nquf zwtmVp?b-o+jCQuM=WWFH%?y<#^6c#w{>5hH8PMmgLs%&(r-xEa0S zI>$HtaN>uyg7~umy`*8gdB*fh4>uQy0A_Nv9mPs_y<}AXM|h1N!}EUk!$+aD!<~x9 zKigxZ50yoHKQt=|ki_&wesp*9Z$^>r1nWb*gnLMh#c=TFAn07pJ+L!p-pJO2utdMR zeWdKby;C27cd_U8nfGUMTyiMkVK?l0MFw>#P(7=XW}%|K{fA~%hFv}Nfh)Uj5yS%87Xs}vBaRfI^wK|Pi`)_ScN7`Ku zi1T=>3Dq;Kz#^QgLuV2J5V!NI_(cw8Low8C`LZn?JRhC9s&0%-uTpgvBX-)O+CbKIJaDdD>)I zy}vnJPWm|Bo%v@_?0m~lUSEjL|NdsBZ2|v-(Bd8UR#KMd*)MKVZw6!}A5Q{Y{0$!@ z+kBv1yjxK7$3`h02qeOu>kT4(L7p3ok3DDrbW8Z#!Q%173n5xAf9E!>hj`&^zEXJ+ zgB_bY&v79H#!yCF&3xx-5F9mn3rkN0FGkn`8!OY>yBnn_A{`yCs;6F%;Ln+25-*`r zvYQ|j*-{X1%Ho>AV%Ixj1SOr*q&4_7%6lN}v|gf~*?Kx+mgTZfUo8B^Q^`C%2sXM{ z<&79&-|Kjl&>XmAKK)Ek^57dUNU>!oDaw*aE-769B*Rdg97=dpS{V4WOb3O`$#|>x z@5;zQbwLC8RricfPDK+#!AT|L_Rgxh4;*Ec?F@h?rdt?HbE+nYa%9TeM5C`m) zSfYq8M>wj=KaP=~=&*gIzfWhGB74s4AkNWcz|rc@N!c(L`Hdg;rG`<)`22{}PQ${1 z|Eud78F_h5gZE|?oC_cPn6G(_5lx)f-z}7Jz0`3A4iGz0R>r2K&tdM)>o&4|&a2#5 z+NYmWIM$mZLema@@32VxSldkzw*9^rXZ3^WAkzKie=AS@I~&8Jl>9ds5U$yb87azx ztS%j|0rbjJ_~h@Fnq$KMPpqnr$-l6wu~`4Yst*0%Sk>NtVO7Uupa$>B|1Yd+A4LUy ziS?3y&rBgTz^bkg+imHkxig;*mr+b)QWraY7jF8vv!AWKVB1^6@k>TzC5c(T$M1+x zD4aXraM1EqTY#Jk8?@i`m*F)drXB8NEHaA5MCxbXg(|C�)#{@6U$p4_F4%oJEq6 z;gDXg7rLbRSAglQVB7oeE3M8qEZ1p9=UdOhN!2q}e_iZPBCkIUzWT!V*|!_n@T)Dc z>&>?@9B(gM{<}Aq-?;TiD+Ramo}REcM!ew$x%+$&`Es&xuBp{PFknIh&lq{~rY{;c#K50aK6xqt-|{zdP!!Vd93KjnVSPvROgaNINX_AP81bkS zSp?Fu#Pbo6UjzyMujQy1XM$* zR{Pt9X(|Q_ed!KvTuRA?u_F^H=AKTNX*QiHvgv)(nnf8fn;ETcu-ks=KAIlTnSeFdS%Efz)Io-!6WiOVMAWmUdU6pVC5b6O__5;am|m2D!M zWmR5~dr6V%LB6tzrfr$H%J!KH#_C>d?bGslin7z%ms}^Ob-n1aN;QK@VW;#9q5Vu% zUqz2=18Go6frz;S8wa2>ov8aJKUV&Eq80=L zYHXg$;SbUz5Kw+r&-;bwf)_WCdijDU#?AG zj7alUd!k5}Z8+vhmyM{hSG-$xL?k_Xp=WC@2R=<`ZhMY#nYY`VE#z&d5p#O??9Dq0 z(Wvd0=zV8h>}2idkO;%}pU9lq9&lDbWq(@NW^n(#)FF4 zhd7|TeA9l5dA(%y^~(+17Yrfj82ekHt2)IEsk?=nN%( zp^%tVV`Gw6yd7-sS)+ZaOvqVXhvgVl5;DWJMM{&RZGX=sG1Q9_1ZoD_0D0Lt8!9XE zg{*#Qbn<|}K3A+ok_mc#${G?4M**+A<@2ILt{cGWA)$rssBD=fx0Br5Ahwn znpAYGXiyo2#JG5jA=KB5&9oh`&H$L_WvS)w=-B=cJO|gg=IOjKA2Q`&V&3ZfkvRHy zPR6eL1z(fdrG*4q7!G6-g+9RI(c@A~#!GV2z(*Hb=0Y@TCKp?Og{fB=^+xhaBr;9= zM$d?(9?u+qD@Sg2`g13Kx>!3jiLKU_Xd~HVw=-Ixtwdvfzl9xXMX=nN z?86}Ov%UbPrPu4Du&hR&VyPU^rVx}ut&Ziq#)Ybi;lzlPc$<|1c?_|N)XxkH)eRGc z6Ti8BtQM_Zo1zh4+c7po9C*gB9$(DA@_SB7@~1K5Y$HbfsVcPC!!?S0rie8-UO(;T zOwbqOLo1o(q}lPL9>N#wvw{lo;S{s zdBgg0lfOgID$er#V?h_~N79m;8>*T^qYk|fc>Ru;W9Iir1kZLeMVNHUFkU#-omyT5 z?|yS0BXjF73h0|j9^)8^AIbUeWYOo0RYV7$6-26B7w<;NA>67YYOiZdp_o@@52RW( zZWgA60XDxW%$2?w1`Bd-5t$e8ho)H6f@Kr)FfXmC^Y+nnrpMhaVzxO-DSS=yM+uJV-%FVRk%W>u`ayY3V_ss&aN|DJ$sjWf1j0wfd0O&y4m}G|fm)m6o^O!Isy~ zTQXJ(9P(jS;r_m3G_9RvV5%7)d=67P3QJU0?I{fG(CzQXtgF9bhY^tN#%e2}9_Gp( zAf9@{^tYW4y7#wB%Dt;>ffSUnn0{|1I_tWcPn+xTPA@xa{SNAU9oOqtcCAQtW!3Gd z7^ilfe<}U_X9y3hEM$H<-NW!w2DKwA$EAIve8JnbW8`6S7bA2<;RIvMT}(3L&Cxn+ zzzR8DJIOzE%08h2nZTbEyY%3glBpZ0pR`r8Y4{dloY5eQ;#lD=JLCVVk;d5SqJPPZ z8~7nfbiX&wYrF6MS|AA#bXqbm>TrUyX?u#`T-9+$Yg{u)%eYzhaNfPy&_Z1QwQ2Y= z^9Co_9dfgmY@ErPk>a?1%a-j&GI(f!J2!AtbnvR@xaivE+#=355I zY&Y=7*?W81u%gg<)LOQFf7ab6)P69q5h-vyS~uxI+4EM>{cz?WQ{b#)g{<@UB#v13 z?SZ=*0F|78ga8YOXE*M|Rk=bBi#D+CzjsvyJzU1U|6{Gx>9ZRJbG(!F^oS^Y_pQns zmRBEksYw{7wcBUMj|_&Y`7Qk2S6^lJ505Cl{@97pWFJ91+bjuLuX!pUF*t|%lqP}* z%)bKCP!JIfdvVak0vOZRo+lg7i4v}32ARxmAtBF*(qv->GZ9m;f`hm1)lURoxlwfZ znSR>R*P){MxmZ!j;#uSJ&&H*U2&cOxxI#B0C}6gUbT0h(9?5WB`gh>LV{1GeJi)9f z2{-X2$!4Y_UFRrCSvQATp2ZUQ5>pZHxeW8su;GRoQyD!X4NHOYJxR^ZE1Z-O3AgVt znd$lDq9IZ$EHjkD>q};fl=5VB z?~0G}{E=%-$My~dLLFO>Ohoz~CO zS`%fTKQ46QJ_z)DQJLY6a8}Wih8GpzetRj^6^F{|?s0u{$X>=e_E_wGd27%}iu@;oqsIr) z)N$1Jxk3Q0FS233z8^Xv{1ya7K_e#s({y+*k_bUxyefnA6rP45P}nM~ zXci>Env_sOb)5cYr9)dxQoLOV;8LFjyAGt9v?3R!izx$mn8NfH?W=tVVKJ>g_VQe& z2iGs!Y~NJX;v6}08SyMHuH(bJAPSk1tVE$>=|Xqg(cqGor6-kRkH@FgI%4i+ z(rq;LO!z?j-rp>zreE0tlb>cQ^0MCj8Txr|niAwnqMNyN{hF|{c{ekxvK6NK#J2qc zTdk^t;Ir&h(>;LjcLA1CblVxWz{if8%+#~ed*7|V7EzFE+T^Rpb(RHx2Rl?*_Pf(JV z69i+8YCpsTIyIi`Eg0aFPEFzYlpr3~!-l}9@xRojIoM$0(VL_3bDJT82-)r7f2vJ^ z>MZu}zKr)@sxt$iIy1J|rK{XT1I5J>%jaN-XA0N)5}Bdo zc3ZJ2{4Yaw>A1Rl@zRRRHA^fP8rLqlDluC>pY8t{ZK~R+^WjCM5tuqR=y(1(Kew{T zN-^w1`!X^tS#EzokN+(KvD>+MOEMl#y=a@0O~*QlE$G8$r*Cw9Lwc!K?(#F0HVcF88ZvM^LL{?N0a|YS3W4J1# zuali^_UG_;nDDuPG`YAVX$V}v(M z-V8)@!zWj!7zDy`#LQ;>P>f1*)i73+U~+CYdyV*@_lp{;Vg9(9#`0mHu3+mKv6Uak z<*JTJuckt82$dkAkByZ*2KzE2v69vJcd_==P)%%KswBBYc+=#^Jz>)XGxYfVRGCKU z`7}cs?xF--!xZXFUC&>8abHHIl~PO*WH8~uzAX9;0JhH;*cdMla;Mwhfr;%51p~7$ zV58>8qN|k@B*_#U6=rxo!C4mPrMfYc##Mr*LMj-^mgmJkBTBJ9qCW9>L52#(y;Ya~h?rDv$@I)LE`_i3OXS6yy$U>8@dx(ANB{52GfKis+> zTiu#%kN~H?h6&NV-EJ5|()wZq->Uu77;@LD-8kk~>rWF58>=;AWPJj)<3ftz_E0~L zH4dnQ*sIUbc{Sb74QR$|-tylZbte$@{k~t#!buBqLf?OgD4*9}09OSAuh-XPN@?<+ zmo=<_+UL{Qlc3X@%7)G7b%#9=IIV#4e2MO&Dk8Y>6_p)u^JIuWM(Q%*2 zdtMi$An;?7xa;nOtN(HQ*TRbb;I%of@$k(CJGd`c$A6W8I_75yLHFx7gnrE%J%wMd zx?^;b@5Fr+x;vij>Ac_fCOz2Y?n*-NTmSW}+9)NoMeA`U|T+#LQl8OV)f zi23xqH-y68*CrZA3KdbLk1!Mx#Jjr1D*`z-~(xB;ZmG=b@s+OZp^1URV=sMFoBzuo65HpMo69f$%hUKp-$bigPKDqA4dx zf=k5*9yx$Y^i!nFdp3;ZeyZ=2zEUwvu`!Wza8$@_(lS~X#3^&ehdj4~Vk~U&x$PgQ zXkBI03hm=mj*O**kjIqK^Wz)jOi1in%ILw9j17Rz7`w+&y0KxV{7s?9!V`Qhl{7SsWVhSb>=z|ZR~)uvTMqog*<8TzAk-#+?20vWYWAfF7+HT!h6tyGWoGl zHT_HsG+F-t8dS_Es2}@ZTtK(CC>$!ibo_9%e)d0^DY|n2;b#Yw04Y0)fe3tddmT;S zLyd+=N^p$4F(FIj5!`mAzt|cN;Z)r=E{QXf%c8c(#pR37YbsLwT$sxDF5%rf`&v_7 zf^w_Zfo8pd-$ff0Rg0AcRVv)xoxG3K>%zw6Z#>nkS6R>-I8H26uXY?ueHA*dtyk*4 zHu`e~uUezWIfum5>fIZo7PzBKAGzvav#-QBAulE{11xampXJYuPsdv=WI;a?%cpKy z%*m_I+Wc8oJEh36ND|7>YSLJ*@?^M6u6-4?Wv(L5Xq~<`+<6sN2aqv4SL5l=1jz^i%Pl$dV}lz?D1$5!m{_qi z|1h+wsAz3fF0Y*&ovtL>1y_;|^q&mXz36RaHT^Vg*5wnnVodeJ*L*hB-`E^&D*Lx7 zDx3S_ttwmK!40Je?{>4Y4bpM)1Kdm8D_c)$iK^P~J7rl}uGhn=I{))qSd_U^;Dbgv$SYuTzHVl<(w9S-C(s%6j2PiNy}sw?jqBZMKZ8%O@LtS zsdwQ4bdaL*(P-u?!u`uul$(t!9{sPHm>pMCde)pTbDP!!37@u_uo!{lVnwVSt!dR` z&W3v(?{vaB#|v&UX4C&A$V`PSOt|bs-u!Xiv{1L@flX%YY}sjd`N1uk+ckl?U(-+0 zhFU-Ny7zk%KR{%oPH*y~=>icD9PnCC{v4*2J;iW+7=4uFcg0f)18tk=ekx735xsPETozvoq4cr4&TN?CD>}M!tk!PUxM=Bal&-?ng}KQw_()Rjh~!9 z$_*0iC5rMbf1)({&z!}*jDk&OHdRc|snZ)vkSCap! zlnSDse|sZL!#M_hey||=iByv-9)|J~+wnK%wpi#((a>>?VDh0*Qq5qUkT-eKL3D3x z(=DQR$089`D|PxEuqOOWeG%5g;tv(W1iz3_(>aC@U2Zd9XtcTDs%&ie9JAR`)?~BM?0tf+puJcj z)#YV@AYor>zxN_poA?y~KS`nwhy*3x&R*<+QfkyKliO8)UZJAN{DbN*%gBnbm_h<~ zr{l?T?X%1!qR%$pdc-lf#~!vD4!%lDX9;z*XdX_Ns5YU$xaa)7(xUqG3%#@Tck%96 zoR)OXm;1}@wXUF#x-(d=_^t1Sudul3sisT5jYq}?s;JbypAAD9B8PL|GxnNI07nHrUIgc|3vT56VKZf< z&||+*G~5!1eu_~^L!1vdmW;(E#OMp+zo}{N#Q@+*e%ygD?_T_Sy^w-fS*;T3o@jgM;gf#QjOeP-N_E8pqBLu;ft-OlWL z1D-|Ocj0wUq91g-iB@YZi=|^WZD+l*l`Zr0W#2p2_la1YDRBjQl?wo+83C1DE~^Le zDgV3|&FH+k2T4(~qzpA7EkBNX1C^!XU(>x4B=fnjmAb=k# zAe8w&yEb3N`4?x|P#{=|JQu8674pro&<7)k1tqYhaj2x9f%u+3{wEXJB#6OiI>04+ zr|~L3ZnxNXe@!9^B4iGo%U3BB(iZtf_qlW-O}jVnoydD+2^sV08UOx7n*_jFo`Enr z$!gX?W=rvw0B4!OUVH}6{ib}q;mZ>&x^*1rQ=6a_iLbtYvonZD`f}1e`QvsMhj#D_ zdAk^k*>#noLAvsW>NnK}8>xasMg=PgOgR3%L@0yP`G}bk70X0c3pFOQohC$0KYTjA z;6T=MuYmLhxz#hngV({g*}?B=eeIsx?xd)O^karc_|1M(*7I<^%lJR4l@|x3orf`A zPwWsLKV$cRIWQ5Bpv_Re*(%CneE5Ty?F~^8!SO|&;ePkG+m!Afg~UT<78l}gfQaHY zu;qs(LuVN9(lB{D@aFU4wij!x2ALG?q`4Za@U_Trw5XF|e#}FRV-mJ0_@TNaM3Yk! z;HQ9s6C?&81M%VMsbc(zLw4 zejXen(uh-a7;^l~SL4bX0!m<-`Q`IGE4%yv7+>Z(QEt_*aY>MY|JxFYIU5L{%MSD8 zx;xI327E+GKIaX%XC%#=R&}~OtHHB2|CpDXc70WqUAO)R zUvJ@7b=bD)5{pJ+fpm9Ci?l4d1q`}7q(lVikj@3t-QC@>=te|JIt3{~N!gF{?U`?m zJ+t3`fdd|X_kCa2d2X0+H}Ad&=4Ih*RGORr&AjYKl-qs`p$8n%2?(t?$SB7Sp4mj@ zbeunR*%W8pm8F%C&wIs#E#Ll2a{8nPXHE5Nkg;3*m!JfG=f$pulf>`EKa-t*)`DWa z&$pgEh~FF#S=?VjEMElQb_da3_3(C|Mfdnl_GjOeg%Tdq_jr+!uT!%K!~WTCkbrra z7F>wTAgFW*Bx-qKY3r2fV8~f8_UnBqOsH%iaYsKIUkMD!Z5qUtb1{_^Ly7X7={PMm zZXbe4VW$HcA*2<#kDRW03C?RmB~?uc^c4}L6nvo3zxjxET9!a^CUi1x6T6hGgMs8E zOt)f#q`gH38mJk?5uE)v(mE1ch*&~~&1npK6eP`pANgDKv!RO&vsP`y+4qD|Vem_d zt!grTTrsCLJROpP*2Rg-S}!n*|12UyNMJ!V9lT3{r4?b9lxK%5 zRYaXUGEOcjkhYbwD^=k+QD$2ovyve#&`qx9f*qW(AYS}rwskVVUm!!Zpy+9>k_!RL z)t78tOdBaqDUHB7qO=%A8)?5DjgYkUT$Ub8JP_X-yCcd$nUID(vU}mo;g?u0Mh}OD-IK5mGvBoU!Km^n3D#4w&#loVQePI%1VrY^`^bK_ zODNaIidk%X9HU(g?+f`Z<32TvXCro+DBAdgu|gNa_2QKCe9Q`&N??&y8}qo1`&w%@=K-4=H= ztb;w#i7nvah*WEL;=)AK*S5?_IX1eFlZ~`cic&1o!dakpRU(Dy&Vx$RNszC$tjcCF zso+lU+E9ey_lCSAsA9Bg`Uz}O3$?1DkA!KgqmIh#r1Pq3jPS|bxjq3u5~BdL^K#R^rVH=# zkOzj0vqIR5P8;P6!~Sya)Pwqk(xr=t=+)T(lC}8B;2-y++CDn5@pxh`6~3V{o^~+x zM9&%2kD#9A)K5Zwjtjtm1N9e`z!!&ijKVnE0{9ZQ1{%{cM1~ijDbnfoMeO-^*EzX% z*!x)&gUtFbQce-+nzO`t6Hm3*73vu{B8ihTbl)*SmUp3P;UZ^dgISVQ>Ji-p_3n1GFe}OQ? zTWjv8;YSXGQJE3OvOQwvj;B*2#w5;XlcR zdN3jC|1twXXDw3hIpF{#Imc9(;#=V~HLiI9S@R8hLTA_NE~D?#kkt01=C6?ge-LGf z|EJ!`X*?_l<=>(R>5~jGI)glwR6IjrBq=#G3K5?_7>f%4(QN+z0MU#2r`P=Z)3HyZcV*MG*k9)GWn&*98o%UK z8~+S@Ja(GAXk0d1^r=7TXKl07vk^c+aWo|HIFnzbw6p^76VhmAl~XRg#C?;S#lXV;0yL0y+YD>^T}9uGRE?ZLsGq&a5i;h(s-VmWmTyF>1x!~ z`=jYN+hvxLLJyZfKja{v5#91Zf$7{osjH#E?+*uK@l}0OMa=ea^Hm;-eW|_Nw@XmH zv~jX>t_0@Flc%cCIxR2h(wj-IBz--hgAleH|6pPr6IVH=6gnE*&0Itfepk_8Fwx*E zJ>s)V7y*>ZRd_uVo#rYz5Jw0oq9ZhQOchA2T1-O~y@gG}g6R~^fH-aQ-cTm5fJx|LSUGALKS`Wl=1alwlq|yJlZH*;DpkXpk!PI?xfmuP0V0l{nuh$zb4ZC^q`MDdpg!E*sFOC zcz}6gXN8SKoFUEk5-TUEXSy)OuFbeOtBbg-1QIVATw3h@@Ndq7W7~U`Ok#7$@By^$ zy9EfPLy-$HC5B8k!2UqTS$fN>`H(odgb);w6?NHyhg`5}`SPy~b7i(iwGh+vxAjvu z9F;X+NxUlSmWplI!y-#8*_+azf83Kgj zM7;!Vc^H{=a$B97aq{bOWFs(1z zwzmHr{(ipSB*3DrccJ2v0|5U1T&((^L_ga0tF2@|-<#(q#<#1a-Ph#3zJI*J|6rm> z{{1}V-H2*}gmxu)MTqdnXrTSeQrtauc7lX|XM6+kh`}at_QhPGLl(7Z#Sh^PL}JRt z;<1r}EIE6a4AYZEgoe=k)__Ps@@O7HN-z|_lQ{;O`Q(8CEN1IifO#V0CM8Ghp@t$n zN009l7D9&|AEqFi2TkskWtG>dSa|{)jhC{3tcSI}}!}A*m2}WF8f>qN=Ad5}@9rx&X8;IkMjTIdk)cDR;e; zvQgf7as@F9U!;>@WC@jY@)lw*wC-3~UH2c*@CY=`E-2PA`CZ$B;|IrQGySjb2pLMjNVGfjqpHbyF6b=lo5_~W=8p&SD6Ix7*5^-TqP)|CD9>5s<|{;U z7-A#YY87cXi9R82EYmE0Q!kxS_B1!CTF;SzB9d*Zvff$=U9VlpG_;wTKkyM}f`e|9 z%@;k3vG%}MHBOIFl`83Wbs{Yv?(0>%rCu&Tgb0Dp33KXeB{Y$ zGm)W^J{a|}{zrPTTro>aj{DmvPLLSIu8%n3@Cn4g2R2;!NLL*-@n)Q z#l+l@O(;l=Vu#JJ;_`>B2cS`0F(sySbP0q6!uuRqqAh&vBF1f{=Viwc7oBY=GdN)<-srg>!2Q!cm(A)vb z342Ieh^hjy9$Qw}@d)cHfK+1xwUGd}tO&Ci>-<2xC9MLux}9}l^50bUf{;K_06VRqClE(}~pa{NZ#b z%1${5i=wRaXfP5RoC;&cz9ZtpC1T9!#bE7l?#GwOsOjT>dUWbX5bJz~zo#eKYv?*7R39by z-?w*+{|!ok`GACvNhMqp1`CP>-wYm7DKe(&4Dy2Dn;|2Tl-V}1q0D^9;D52GWB;+J zXOsYodIPYiU0(kei&_`*|HGmNwkx8834{L+i<+*aK1UR&p5MXsn;SRhwWO1e{o6l~ zPg;{HyD3S#JMP}a&V1Ewjp@Aiy0RJh zVBmWB^nhOQG9A^7GNe1yPKbhXLEAr&&sPwOtDCa{uEOt0r$_Yb%FFhxyVxM~a^$Yx({=lU zxWD^hRt(AxNjRVA#fTkr>J|ZloF2$y2j0FlwvL)^JQ*sNUSe(Bg+4SBTySPmTB#kl zi?{=p=a;JI$Qz)L|48tQDu}<}91TnwovznUQ9`IMxMfcm+@?kUwep2PE58%8@&)h} zoHQC{6j&<-zo>!2>eS1ZJ{MnK+dmQbrcQKrIcch`<~}dNPK~!@B=hL^oFl2>dm&KB zkM3E+i_~BB z*zb0nBp|6UhxHs*bJDdReV8+9$83pQA3km`-fBM)&1LL3r6o2NCm2SpeRWvXuikUi zu` z92D}a2n=bBK;niRHo;+OJdU2ACR9^$f)uI4_?lpr#B~T(Uf<(7=b*_T8r%naRvC(z zxBwRMP`sBmy|gHV?$S)dNdMT7aNcm0?Og24Fxbt&W@IgIHtwMCAa=@36vPw6p@;p2 zn)t$n!x-@x{;{YFC_F0U@jEf)`QV!9*0Nht^TYDb_>p22j-WlsvDp{z z{|aOysBGR~+fBJMxTRoANd1S4JP0gh24N7fzY@;hhzdl*QA+fv*yIBa6FaIf-iwn#U#V76PKI<8$5*r0u-#jBs& z?P`BmWOCa-oKU_9e;|D*xyv`+pTXDZ{+s0Whay$sK&E?Y@ML2so8M3Jp6B<^&JQZy z<6o__<*#f(b9DFm4=n(nrNn!quVQ2c-kj~x`J>7zuG>Cl@GzCfvD>E&rBT;0@j(We zK`h=roi7$o<`$%3RI7u?IO28FK)|z0R}jaI?vIF97-VBq6I=>o^cVfT&lpFIt5guF z$Wpo;WwhwQ2oqUlVgCGDPuC(zk2rVP#Sk=+MM8zl6;ECc5HbnY;A=3v62*}1&MF$Y~@p|miCK2x!}~mry)Tj9lxNULy~l!!-F4jv0N=r z0HLaBKN(a3`9Ns=N!Q=M>G3_NL{!xs7_1dFdAH}wygdX&4ig9rbF;I)8=(r!ArvoM z*8!}AirQ{A3-%C=`q1`S1n4MZKGZoUPQq zl){j3!XO*p28YfW5QwU==Yrb z>xU@E ztTf(-{ryIFM~$r6Vg%#A)MHTALuq}vwiCKFS@x~Zdu|T9H@j}10hu%P#TQe={hx14 zfB){JS8LwG#6p8+d-}{j{?n+C*+f7_HOK#2p{524TScq|?YgSrZ}LVMbJ#D|bgI8zIP-huPyH z!)J9Ct{-JaYReBU1cd&nB}(id;H-9~Nrc81N{6N^R=aQ(g9HN3DrX8(P>Zp#@0+^tc$QU|sn2ahH zatQP(YlqM$)fHF@I)V7Jmve}J`>R&dQzN)9mt~*7SI6;77Puxc$vbGD(ylcPg%!gwK)ONls6&^M<15o zR)(AM#T(FM%^Wm0Rgw-4X_rqKu$)@^MX08u#?}4-Aoy zj&)8=>(3JRBaG+2jgBvK&CITU9a`93E}%I-=e)cekNwDWdu#mb;`f{NezP#+?k5l8 z5aI>SHOe5SyL)|MjcCar=$@v7VhuimiB&pFM+&|jnZVjzpf#YX=%363i{P?_?%;fG z(`ySRm$FiPNW*bhU8&RBQ%{jpm?e&Qm!zI05gztR56(W5@xqhh`&_O)#$%ISN9w~% zd!5JT%}ElGLY0$^*3Bd-Vjt|o+du5gJ~1J6!s>Lp-9$6^RY;IZUp`6P$(I?HhaL8q)EayOg&bi%kQ2R*m#ui1Ql$guRLt=h)7YeH$12*=e{ zzr&*^9n1k+L*Z;XUE(7FdsE@!DU$a>=i4$V&sb3;ZU}ySr8Z{GF=+pFJlm_^ZIpHG zxqnbfYW(G13W{`v%*5B5?FUCk5~Az%NA)$y36L!SsmXOh*T97K}poo0(S#ljuG=@^+58%l-Ka^ zg4EUAYbJIr_3KZcwW0BaXwFLt!O6z6Quj%5y&r_eg98HivTc|h{3F#UW8j5cKS6QnfVQG8Mnv5r z9i~#%)LnG=q@AxN{RunlKVLhD#L|Hk ztWH5LSiy4YF{NlS_Que_Mv2+ZiAUfp^zuw4vm*mhl%|szy1$B)oJ3!i-G%en4CV4i z!o|}P_q39vjIlr6xO~#Ce%c!TSmiWXw_d{95$p<*^_$~1r8hZFId$UANAScWe{(1{ zyp`k3+se+!g zKv|6%Qx$L7Tf#MCnTdTNBHg^WHR(xAQtsMD`@mXDqKdcaPRHLnu~6_O?^Ms`s}rWG zd~REh_fdZ_?>lxxneV$#Hbo=M$e)G$6KR;9?l>IS()V_ap z()T$g7$SlTbUv3epTIBO^&ew@bOId{1q|f|P}tr@+JOF6YoYZcF-yq}LHCuP4yBL4 zG!4JXv@w0cVYjamS;pLA62&;HnCts&cbFlR`=-Pss!ec_$r2h~@JjAyD&g?w0NLEa zBxw9PGZs|jnkf;DT98@pH6ZRKX}Voof=;P!5zJaNo+ZhlNohLS1jXExn%RMbj8wMQx~i?A;bJz6TSuAkfHln847_!0KgXLpk=omI zt!}(_Y!bdd8`VCPFe|L|JZYB%+RoSqngF4x`9#84$z7z3BA`Yd1(*&3) zmh;+vK%>`hFl8h_yY%avQM9Z!xLVg~X8<|}v7H3jK7 z?I&8hIjrS$y8Q_edGJ2zPF9yVYce?b_`BX|t>btapZSjZw4Y~2=;Djh@O{V~a5O`A zHo6}mgrAVm*y4%Fc+rk!4DYrT;%*l4{cg8tVSh1t0&wH}AtH1r*5_SllT!g#W5%Ey z+>2yXyg%628y{dwY)+l+F~q*>61}^gFSV*jz>94W6C}7LHSG~3 zb6gu8dBJF?1Flvf(*)5GA#C}4#FuDg30b(NYzn%{yP43>*#?Dd`nv7%x$wuexN~eu zB1A8Lj}rDkSS%N$RL!8lL|~i}0O+4MLZ+0y0u{b!kvI#Egw#prU8$UdFjMtkDf0*` zp++nu$B*?X>#9Y{XcV5ig6~9fL5`o8>WyV6N;7zm^*QB zxkxktyA?J9Q|UllN=af8m%M}sQg#=Ekr{KGPq+$jCY$r^oGz2;AhdjdD0S^A_dMs?oQsCWdPCI(MFajtb5 zG}W$6XnwEK>0J73|IOWO8Fp9b{?@X^r5Lw2{X@=LH+{KP=jKy~#fGh8Z!m> zJv@Dk==G-}W&)sS`CJoX3&8~w*!hI^8p@v?Yh1tk`(!D92%!!g3==GFgYcom8^OeF zmK&e$Y+G`bP@py@VL1GX48iBQI;Os4ZNnQ_z-w&=v<>2slz8G-7I-$hQhjOmByIqRmeo_JZ#4hdO4%YwY5HFS z)atYLAiK5Q%dd-HGf8)BS;B404vNzQ21TrMwSB@%w7tXOEE2FhKt`A`StXqau&jZSa9v8$+`j~K1Q*)6lLsB_&utoGl)PN_m8Shlb1 z;b_rioYPVnXnaMyJ=nC22Xa*D^z_`&xkPs} zZA?}s?iZ^9&`yk~KBE>i0lfZ;x!0^}1XH@t?i;@G1^N7%69YLaWM`tDp_O;}gYozt zw>3~kZ-Ix|OLWI>>Sy2IFIQ@=etb9Ayk>~eC9~p6T^pA1ZokbB@`F1%Rvg7l!i(7;9zO=(j6%Pk+) zjDb&+<}JzTGo(KKYg!>&>=LY&?oXF#PwvmLgHObN&Lq41 zJw7m}MZO(q&-T6|sriKTRx|FVbHg8lNs$_?mUzKxDIYL*GGQ=lVhHBHrac1Ws8F2! zAxvS&gjeWj{55#^!8s5GO&AW8DTsnf5krDZl7NKwBNNw#lzLbnaaG(W0E5JRcqZJB zk9QiMK z_5+35)*m|uo5Rk*YH4;O#*Jy~6ji-Cxz({jBJj8i56JS9tYm}qHr$WC86!-`@#1NND@0 z=%N}w7VE>&dIO|gOxgmjeq|%?pulk2+JlOCb8+65NYRJ}hAF${p{wo5Vby7b*d^xE zWbUI%+o=Y_1@l>bY?NVon(>kZ`Pko8|HDQ~cp6YmilHn9h`3z;P!uc0#4vE93MAum zU1;IUSBSzOuI=yLcN?9)Ujopo#-F&670$ifq{qwSl)FI1vu|~V~zR)ot z-@7K)nQ=8Sj4lpQmme~Hp$|@?x!#^hqMu8(PxyfmO>H1n+wSk((8b~BMn77vF7NZp z++r=?8yAGJpYq5vi2p8@4Pn4-=U%o4?$REi@1Y!KwwAx!0=-H}FxjRBdhd>!7UXrF z88ZS4HW>NOsteW*Oq*d2pDY+6P%DQST=>zk7^D6DJs86Wj}%`=a5k|4IWz@316)}z zI6hWglHEK}h$eLl_Sy(h5TR>_#i+tpkh)9nP)AO#+Jhjs#&er3?aSm4EZj|dOLNYm z;yS5ojpwmjI+w+Faj=(7gN8kx6TAudCK3EgHaT%5ORpF+TU z4ZD0^jB;FQ@$SQCJI3-l4vx~AyfnK?NMl5KX`B1#p;T8_+Mxm+Q#u!HU2vI8UPqSl zXF9{s`>-vcE`q_9Jh|ms6LSc9b0;3 zJ>A&;^ff)nz=$S*$#}=kg)49bjA$neXWW|rP1A#nj~fC`R^#J+kNQzu5JcKhgo6}L zK!HZ9Pf<6__(HX|g%ve}e<-;I*R`MVmcD)jl3T$yDGG3BQ_myqduLSz-j02Fkx$<^ zM`mgEp5?to=2KM)w@PGrNl>{bweSki{9+?ReK}|I$_L#4>p_nW@~?7lo&U1|I8Pqb zroZa+gEpPXvSHIAA}oKO4Prz`JqSKn`#(Z<9trO*N+8n4J^D`RyqjVNV7LQFhi z3FXU$|HWbolYx8bn#_s7V~P$Y54Cg z&(;I~lvpSdT39?fSq*X)P)e452u7y~@V=~HQ#dbv{+E2y4{7^55|&~dDuYHqmPrmO zJz4Lq=5!$GoiWlgogUOc;4pf(jv7e{V@culV?(TCV=PFcc4-7ZVlurSchrIXJKLs-SW1$ueBSm??AkslFur>{2y#rR=eZbY-`z?#D93S!K!jPnKcz_3F zR`==hwQ@WL*^6r3?B^h)?Eqym81MW}kWr;XM=sF7CECj^U*wKWAqR<@s3XjRiH|{8 z<^~Tn1yO)1bm0HSV>Y2zK-z+aeMAXb07tzx0;v9x7lHg9`49tkPnc5W_jtE*1QMu= zjA{&?+tpWCu4s9Vygr`&TzP6~q^PTGDnAMOyE}YdSYxpe$p2e{`@eil{%en5qUGtd zI7jvKIfFZ;OuQLTnhB6tES%;7l*oh)m69vtP$Ai z<;Nl8S}mti@)p%5p7n<{!;-~2mI7WRh`;auE)s8AV- z#aGGdSa4MtkK@53m)H)r{X(i=;uv4@{xDMfX;!L4dc)6|Vog?qiKX`p3y&3Mt9;Vk zj)_XOZ~tcUx({wxM^H{>8eF=rlUU*>$E4pl?sV1GKX^-0#Q~=7`%>*}cdM#Dt--^| z_&!WGmq(p#q0h7bI^P~_d|OpG9r$MKL-Cz8#}{(`Vcic4y=B!O`gkFm0MklvI3&m* zcp{W`X>LuCBT>f;M&+JD5Jul7m?zJYrKk}>Q^&UH%`_Os5c)LGBi~yj&89z2M$f$9 zX*5&mHatDrVl?3eRChaG<;|jE0tJk`Fj0ZQwh*pkRZz&TwKTnxY!c!*lVX__zWdpZ zMbHYiK4)8;sk5D0jN*NM@Rijc#qLXH@Q+sOZ0tMoebyjoL~(8y3-;H%s5ank`Y2y! zlM`)Z$3~K--nOs!9XxOuXr8%cq(Z5n7>ru^Fj}Tk<&J7!QQq|9MV)#A-sM{{t&hCtI?QZ(;!1RSN(c~ z7a}a zJ!py70HxVc^&p-#8F@*7s_RF1Qv>PETR#j(dXN25YUIi0M2O*|Rk z5}1109`&w4l;~&ugo2D1lvG3JzGv*+ySF5gnI=MIf4<&@x zxY7RS-^~Bbfffi0()*VOT#xTp2xE{ZmXBxXk3?m+oeQfq?+qd%=4QGg$di?Q{Ny8W zplvBf(aA(u=$tc+Ch`b0jeGJHDLxUTT~cL_V)ai-jDlW>Bos_1$VM}~Ug9g#%u}wj zqV9i>`?dOwr`gxCg7R%QBO{*3GPOU5(`EOXu< z4I})c*Rfz;HWb^fm}F4mN{^Sqx3|#s@Tp@Jb9x>)Jo*WMV zq3Aq?1RB*VH@mOp)a@bE%lto=nw|$us(r*f`BLIreauY7@3J`bc26rSeIWN_O+xyi zSSstT^j9$%^wVJ0y?Wp%Jyt5uc9hTUdjAJ1<1Cb$3rOWR8o`rC#I!z_-#^IvhK7C6 z^ZT1yY^00|Z6TDwm@QrpycV$`3w}`3(fovlow(sm$-i%EN~cUl_X#x#vnL#D_1Spz zv#!VAA|H1)<^~GyhRw&I%6*!T6+$oFf-#g`Jcj>96B&o2Kh>R!*HBj4fxNlFETl9E zRMJ4UfP0d@fEA>&kUP{JXr`Fqy(&tz?kWJ^1MoAJ4D(3(V&V-(6lWVT{&i)~wgs;S2gOR8e`7KN1hM?j_|ritJ~Ny=_JfpgeAYBra>VyZjIR+3|X1$Hlz;iQLtXNT=?H zK%hT^G~4rbpRkCZwBQQ7I&Hh+x9A-tL2T9zjR#Ym6Eh{;71Ofi-vQ4w<$%i&?GVHH zF!Ku+*HPb^75*1ILtMYcpDr7)PKq2J@efH(jjK*SE3WuOtKgI&IQ{flW!((*V&3Jv zzQ9J~H-3N%6tYNoJG>auk=L|@X!zbF;@t0pSW)2J9{B#j3vsz>9Q5#{3D+_``uCDU zyPE2X>laWQHQMj|@XhDpk;l4Cv0BSUD5Ls^?-0IKkNH^p@6U+f7+q>R!QFu(o4XEO z!mBjVF@r}oiC_RL61eC&#t+_TKM@2)78xip4>G|p;|U?xxB!nBsM*uB9Ctk6b({(k zIC-Csewgd{<@3eJ>!Oti;q?!;F992*ow`3?d;Z+(!ZPvs^!0q`KiK{|e8}BI!rGOi z_49yr9-oD+>{~d7)UGGOEfox4)G$yST@S<^UV9|e0t*q|3YwG(#gyBB?wS%uB_EIj z5dZ_2nMM#*M*s#)SQ_ej63n(8j?KIvtzg0%G#{CZyM%?(M=)O#%&Ka-{${w39@~{zkay zye5?gBL9#kMNZ%&Q?#AMmdFa`kj;2}jQfQw&1H$OBs@CYS~Z^zBfL|Z!Zjuwpw9j% z4oWKX!fi5`=r=ruRk^jOGQ5>`a7~Fd&G0d5f|+6Sz=78E0>wtxk`t}8OJ~%TuCc-L z)>XIFu&y?_E5nl4NlCSVygs^Gm4!E1WW0JG&RRvB#p9AQuE$^h-z1;^voRtZ2cEk@ zD9aI;figqgPZbk|^UdT;$@t2aO6>d2H$YDQ)b$P%UN8~I z!k(jA3N=F{@t6*7FU0Ro z^@QNrB143`W?r*XP{fW@@^MzXmt)dX72e{d#aRJLXzVX^Fl*w6gR?1`#eY^sPMM7VxOZh6vQnM z>uwvBq(BxKV6PiT6UwE4n2bFFZ5vEO;g8_T((_De8uB8{Os|dJ|HJOLYA3(-xz zFNfPwX?`r6>7d~AXy8F%y6cZp>>MGKgOb9uhmU1CrB$OGCDqEHBGTY!$BEK|l0H$h zNML$YJAAIJfj7QuVvjT}ZT}LS<|B_9W!c0u>L;rxDjS$IBavzc%)Ba^P+V@0n!jj) zEz@3Jc~$dK$YE9EsTHSF{h>T32`v%^RSgP+D5?r6o9S*uO+s)5m7PF_3f@CZ>cHEE z&Et^JkFTIQiXg^!IO`<`6#gMvBI3GXw1kS9kw^Ks=c6Q?>#lvgAE?fl#eX@BO*I7z z4ou6?j`z=quLO_J4qMzQO-Z6Y5uABR7TqwbD)#7-Sqejq;Op!BNVi!bzVB{>`X3~o z&b*!zRkNCql9kv5V)b8?X>iSNjIL$f31Igb!^EI)mM8)4`2}${hE|65 zS4N&|DX278>-=QC9ss*vHL_*?LcMjT-DI_S*T#9ZbuXM#J#IhW7_If7q`2y4wW9s_ znzA-@Rro-0E9T=#Q0T?2@VLN3|F7o;be$JuuZ(>l3+6ndzw-<>I{!!p(@Jt}_iqke z?=kYUoM(X+$;FqKP7>&V@p%7dJ@Q26dN=Dp-o6}<@2`C0`<8DKcLz>> zJHOT*1cyYBNn-rbqt?)%I^CGO1b*5cbPr6JQaD}6L8mh7ccND?j2}+Hf8SBVe67PM z=1-A0os`( z8^Ajg^1{0ZZ|j>32l`or9Mv#Mt4=TT$Et9Uc_u5?9;D5339}_0rf6sL=ULT=(PY{p zp0JS3Y{jS67fmo4+kcY(0xzf2QvQRs=qN7J_ zzG}bN;R({kFe6Ez8zK(lPxe%?mKJcIRYiYV4y@22aJprSqGx=M)of$Fr0rTTgLQ{G zy03uChPSmyttYm+#cX~0ZziSxup;`WUJAk_q6zMg%k2v#U{r=oPj4V1$>`q%CxDSC zkn(xNIGJmKQec@@8N469Gm?z{y2^naqev})-*&zOOMq1^OXBqp$jx-RWG-AtS%* zT-F?)6HB+DKpa<=;UIjD;dN>}X|}Ln+&7r?A&<LUF^>}H)7pv_`BB0U%iTv-5C{1lW-cvHGhznk;T9=~ zR;vZ4$t}YM=43MQbVp_4;tb-6xxR-4S|&1<&wc$Bun9M4zaFd70*lP~wd1OfHW7MKzu6VNlH3A=>IMJn@i@b$!-{}bI{ z%ceNfvjK1yb`Ah{;YL%6Q4lD-WE#O@dGSBNU6zv-N^^808El?)vKK@}(|H=mE3$1b zcV>%Vmh#MDm7GGaOnOO<oYq_U$EO)<84F)pXeM644feO@F zfKmR*dE8GK&&!a@p7iFVH9c%0a!K*eE?at7ReD_+CIx#_IIDx-J)FR)=M#~WE0yO^ z;CMRzLoiL|`o&62wHFdi#=86Q_XK?0?okoXgXS6i?nxuDv*XfXRsx^jFjgoXCPRuo zY*5e!SIt3PYZ$8B#a0kCJZHfm4}@^EKLjD4q|Ab`Ar4LG=JBltb>&yV8DpKT90;84Wjze69jT_ zQDzV$@`;fM>9a(4vXY85Hm5U`Z7^3;NSf4>V?T~QX>Ab$}!U7xiqo-6rBguw6b zyYM4bTG$i%7ay01vT=5bWsoUmHq;vOesz>c3oK1XOB26AWoA<({5To^<7NKeZ5ze^ z0L>A01}ZUPaM$StDlr8D`pr~f!g#qzhydQdyUtK7xa$;vf8#x2Q1;E%uro%a7;3{& z+*S*w5jehPnZbw_%Q!N>bx4D*tK4Lmm@dOPmOzP0nygFKTq&q@#;DiZUAELGX;&-v zagfU-9nIII`B5GO7HbW66JPR$l^d%|PUisBg#X^X*Y*UhCDPYXO_V7o3}bv_Lmxunx)2@;4N+tWXPFEz4RI}PVerul02+Ii$rOfA zuCnIU80Oz$X3-qz*YPp3byA3g7kZ3^PosfK%!CFl-;$U7^+sVbESSA01q?QYpS8_E z&)ooe!JJ|ah8V(^TH!@$_Ku4?=`N$XR+%dVxUDqUjM3+2KTOLzZkunz`Dc9KJnpw zipS|eeHcBho;K+?!(+zwsDXYI3J!u;bq<`~a&-`9mSYF{RHa!?l{98HP%E-jFU*AlWG3aFUhYbr=#K-!eqLRLV9$`nmjCnUtO@#pG@2WGKz=dTlwcjJF z^lCeCsw|X25-Au|Iyq7YisX4@#ahPGbYa1?6Jtu%(vp$(my%2ML|~~S*y8Z5$^bT1_>tEku04#>sG5}b z{qoeO!kp7g%5#myh?VD)7*} z%=>|8e%6ua8|L^OAa+t89C#_k6>=8EnjFgX4WsPI z*hZneqP;?{y6XnnwxUGK*cOh{B(Jgt4|Ij;Z7)f<~6mX9s{cuN7b=@dmqb~a49Us|cQj*>_ zATbpFFePRw#Y!BdFSY9%W9>$5oZv29Y8dC}wL_ZXX(Uyvd=qTiG-E=O&4Z>erxFLN zB96u|BTZfHN~kEPs4}m1BI9Sea)v-+=Hjkpk-9U|wJ1T;Ro`;QS-8mTx+VP4mNb~R+W z#7@7li$>CEPnHxS=;`HikWHRwbgyVs3rXT(;v_Y-`e=3Pz1|KaS588Vd$Bbn0RuT$ zvl@G%;yne*ZZ^G>a}!+Klo3UA&vw(H7nGP`=!N|&m|5&Cfwp%W=b?))g^ws<;7_b zlFIEGmbts2|60|>^fBP9_d|j=$+vf)hk1~iZTUy_7daHPJ2tuK6_JNg-~--t9t(yP zzlju_UN}W4%BA%5yBF|x`674=A546aCMmZ`)#i1!Lm>fwA)hcJqp?ZHltpn!QrIK$ zGE_v{(Y$LOrthJSN4EVT&_p|NA92%nQsl>$ig5YSX=oXQ^&%`%kQ~y@Q+araN<_?3 zkap7bDm-a2jk>@d)a6O$U4}b+U{79W`aRLYAXCXqe);SS3{@)XKsQ=Dr09C=v6TQxRU`m*(vjTq!F?nVa$)x{`q z^{cAc-16)YI`8G6>iSGYtLiBzm}eU%uy>9dVI`SaMd!6_?WLD^kC>bKlx&Y%ci3!C zYgeTzPwS7FG}zQWfKLJE@zR!+5h~GitOu4F>^B!_yeE6%KNg*J{o%TB?12zW)b;&! z)AeJ?N89zlXisop6UKJdcfC+Xbs8**e%mngLfBh+j9i`Nau7LFAr4h&TxIC%n?+_! zh=jPvIOtqzOwI24E69lnKcKo2iNS&%rp#Oc&zzF@>eajk3V@F3;S9LWQGA@_Ueb)s z{O2sk`n>lE|gR42p8Q=#Lwf z;|R|C&*CXSfa8zIdXV4!-A-m~*S&#N?gKpbo8N9lzBeQWx0eL3pVH5~A<%!>4P7u( z7y-99GEdjjJr}~~eup@D^h|`^C=2XCP)o)L58AIWYhnW-O&icyBZBbvF%-4H8Tz#s zBs%`$ZUVvZ(kg}u{{mL#QAEt6M}m%PD`Qb_by*6@8l)1 zDpCV%r8Zayj;K2n2Mki;UOTQBBj$9HEiv`yctA)c~1L!{STT? zFpx?JLNH>`C@aoSp~9qmox!i_FB$cjYeB5{-vg;l6fls&&)2yqfC2-lf`0~5wEyiu z%KJYCQfQ2owu_l4eW3=T?vlO5aDL@~G@bnQTZXsDf)0N%%hsEX=UAk>+po01?o6@j zY2)j3T1;X~$UCv>2l~T~7wg~FEe(8RywQBPtu`JrWZk39^xXP63`^~Yubbxv{kG18 zKu9!`H)I9()xm;6U4-L07qvR^YwyGh#mWTw50jm4cHbekD??v0`FhuT1d-{L4)|Sm zD>JyC{bFpJU4OJy-VTwGa@?K{_l6OiJ+}Q`-mmv`+%*M78T+^c$XDQg8wZ)j8c@4DugD3kR+0n z_iodfUCSyzx^AY-G>nfp)r@Tutbj;m=+bv66u4y9Fjdgwmyq8e!3`%niRg@`=u2(w zrWz4@7A45>9_+kVl}p!2<}yhy{_xfvi7w4FRNOM%@-@+JlAZfbNs9B7Y-!pDwsiW8 zk2MDg$vQA&#d#*!di$i7=mqpi-fYX3g--Cu)-+UDloe&4lJpL>C{OYa$>89&Dk|p& zo|!7E@?+!x45#3JrlJb_nyIRBO7EzwmABxirm`6b^7=x}kE&bA^f7D4y2h%ikj*pg z`F^;I_q42=Qr5K2VrvYxX+rXA+Rd9**hEj8D^HqN1Hsx`CrJ>q{h)?KqSL&Gu*%T*@H`FQO3=PaFbx;UDdRD^KE_L#Rm-6TNTXj7P)}e*x35~$9>M_ zEAV=GIIGJIYC+SqYpkmB?~Yh~9f(VA{DLHMRchYpd}+?tPcRUJ=)U;?G=eNjxF>wPqi zupW5@6`l77QPp7M4;(*O0lnBsG@8cSH&UI3KW=0nc?g^a(6Cm=ufiJZLF}*5cQch$ z?hmPD9)2Kn|DHK>y*XODy&3L)%4YXDBB6NPde?JruN<&uX8gQ=E^;kd=YzvT!OBu5 zjC!c-O>%4ug}~K=7Ch~*@*5O05t9*td4>ur2;EI5&fw08027ep=gj!~$>+~Qu|_u0 z2dDeVk)6XO84IwY0taY9%_9_OMlb^IB&ep&!}&C}&@=b@>BV}Yc#5d72S>zNU)4uZ z#+x$y1gx8-nHVZruv_YpMw<@C@;8SN`-u#{TH{3Zblo6(xEmG$y5)R+8Y=OE;ehLz zSSq9XvwHaV4quS9jh#SlxzfXaNXYK=Yx9s^^>tc2Cff}Xy7 zgno-2k^3)Xt(2u$i^&>=$`k-cbVit}w$(md>U{UR!Ty1-Zlfmn%xhwW(Rq2$FPR^o zzqQ6ZG>P@rAXB$8bFS0^dtt2F?TD_F=^fzIVUrC=!M`jR!TeiWV}P(=WG4-dEplM|^%?EE>5(Bg+`G!SnVR2A*>QIL+X0 zX>Rb7rUzvxyu-d>*rg95r7!lFs;NJ{Wm!R>I45Fc6s435RS1t^_-LGXsF^vxbHqTL zno@wPDXoeW5pBFA*fC9LPT-8UcqQ_hP&46L|#y!F#{qZO-317G?(09VXOmP4_%UjDMa5+3E4WoJnN#EiOChLmI202WS^tra?u8)j_sxDD;wk>XJ zZf6w72XS9fWC;>h=y|n{{?ChYV|~pm9Iitx>r#{sxEsE}X$UJTX#W{voOxpT!(Cpb z?On9IL))GnRCW8`VSMusFZ~)oVeP1G`qSP4+p~g<%GP@a4AJf1m?r8vVP{Y{Th(2E zaEc-XlQy8zB(n64(#zY7jg?RUBn|WcDK{>UIOY2ZGC!fX5$aSH*fB=OA(wG>YUlS* zFIT+ZPpSJ)0K+_NHP^T#iO>64Y3`Gz5fxb0zIkSCAD#vIy-v5Uv>(xUXV_y68nsry z;GNlZ4y}LngZ%yITCVr=cFQ^!nth}KIPCbCJ@&p3t@}LxQQQ#6F}&Lhr?25#k9mWh zu#qsX=()x5w(G;sxW*rCn{J?NzU`OV6`E($WE{6}8t-$ml(=U;n9A zj9f$`7Ia=l^BGNDeH~}>IceTT?*aV^GN3rba}>H9=Ux|DpO$9-b3Cu_Cw$ZO-1X;t zjT&?*wiAt>e(x{VyuM*;>J~;nXU=)-qYuA7srKH@TSMgP?NNx{4#3zUhXsgQUY$5J zbTAeo0o96v?I7~&07RdjAYj;{Y?8@G)-3CRe}x&i9Y+C21kXT^&=%F64d~u+Sd@NBuY5jkpWWPjR@f+Q_M;k z6e=!`D48ru0>^zx4ylVUv#Nr7r1IaOXlzmMSD>4E|Wu*GpDx4|41YJUce4?p zp%fUtm0Q3cC<3=EPCno0b2~wgcGEWLfegumezA{*?4`0!%ae=hRw51ur5d5s6oz-Q zD*1~@$k#oN@YT+n;Y!{izVh>$oMem8nKTnRWCPN{dkX% zle3!n>*Q0NJieZxOv3xUwgUOw*V$$+2@{!bQYF50xE>WJb3d<7t$zG)-ll0u@AxEi zdA>C4=%{Q^IS-!YE9*ua-M&vy_XJ4((D%|C0f=;EAg;!{Z!C)-;n5RB8gHB*f~_P& zDM?_;uo()%#+2bWZZdu0G`!}fa4cGJrhxRZG!$)*J6{k*1E?OKc$@DEVt5v0ra!$I zA~cU>!Ef7+hWoU!lc-D#GDUFd#>Gf*)nIAPJh*8=swjrEo1}panrjgI(PBBHK-oBu zDbn3d)~)!yn`+W00Fxd%VQrDEzjk0D3WbZ@BWFO9u`h?ovuq_EN>-6j5LE$U$B2@V z48_rg$mRK&Odwd4i%)D*OlyD~AXnS8Y(rSr*Di-yY~TbLuWoSw6RM8u_Hp_in3cH7 z+9Behsw{_K+nNrC4Y1+#V5$U2MK8hX%5B3; z7Rm9x2K)9IY>nYBw>HK7T@TnaL*36q4|d{rKbi5m|DZ#hddAVCReIg_|IVdQj+uMm z3IiPQ+s|6lUdtLp8d0l#!&KYn-jSQ+0xidc=kCWq;P?1l6tg z`w6xGlL-FLdjohM<%3G5k`Di7l6aWpKlcXHf~W{ft9hL|FlU9qqN5oB0bF%#dab4) zfaoNmFbl->l%ecTWKgd$kGP;!NEbniY-+=NH%29>e~&t*0i{?#M^2`=d}W~?7}S8y zbeFUdRm(0Cf%kDfQ@0UmmhNsa#a>jvX?I}0U6Y|N(6~PaPV=UU@3Za7lNZT{8m$`f zFM+G$e8ubCHgFhpgxYK}?crxkPh+iTx;+U<{V%g#UX28J3JTt!=+#+`!;*}qoRlXjBGvFBJa zS0F#`t$nwc18Dc>U)|(y4Ggy3=#N?mntF5JTnRwI=%}DVuw|x^5vd4qkWmX%rrn3_ zs5a>;HFQk;o+j}DA<`J^|Z(U>uQ;hs z^Yo;{;wDkcXq%Q>q#6dwhNO8W|HjU+#%}s4ZU4G(H^m94#HG!a+puzMDn=~9hMp)U z&o$7ZOe*}aoFO;53*eRGeP14+CZji%N<+Z=2)*oddZMBd8=&nM2A+wJG+|{;D`^II zGHls8K_(8Z2gdfWyu4xguu@{=6>~Mr4hAEuBNav7m3w5x|> zw*B#G9Il`Aa)MUbu5pa;Xrgf#>G{!Vgd%yfX^sk*w%|0>Pgt>asIht$^!GMCFZu+p z4lf$={c$ByQ#Npe(|$MUwrCzD%=_K)4cIQ(Hcr|t=yg9Ux}&>18}Q9r@2&DKI3k>X z*l_i8DL3p_aMjlj$)>gc*AfSMOHHMn2+v4d|t!|`?8UTzpVEXW)B;;qXR zy++vsZ=qMm4PRrt4qHFg2p+$^Uc)_UMp*aSA0YXPdqNG+_M%WAA}2a-4${BquIoMu z9l_lwtUHMqYJd<549Kv$e!`;5j&I@s-=5~_Zgh!Nus5HU#P^J}$=vA0g6 zkc69{ie7#qUQh`lIo?1>rR>8>IS*!Zg-3bTzY`;xI;ZCCq(m3o7rh&-4FiD^BqVGJ zO7x2m4jwAB#PEIv4(BkHBq~gGehFvenQ)S&0DltXcv^3MnG_pR!Rc_XPAhRN7aTvU0K+ zYGLgP7IYs+N40&`(gvz57)7zWwRPq);Nq#!qM5d^52QYyASiQn? zQrlcTa`l>ypPE7`FljCeB3t?@sLy4}wyQDtB8y%)h=0l@M?Lol0J2wQG40`9bAFMI z2xDX@?FAH}5S|2zP&370cwEEoAX>}R@54p;(i9ShFo+^us>Veok@msV+?Nk%U! zW)ES+w^+u?sNe~K>phS+8&eOw!_6Ya^H-6S)A)Cp=|7KQevZG+QMf$4*0?}%WIZY= z7P0z*!C;8$Kg0gMAVefCyE~OFi6{nP==n(m<6&)jKU2Po0qgQ>D0Cv z^MO|dN-4sEeULGg{mBAc%~OR)=QzzuBsc4Ca!!B}!rB*F%+wR1+h~qtI4I}Dycl5A z8)+|k0~#7Ii|AvA&9*<R@3A7hhHy+^!IJ4du@=61gviEx# z$v7?~!o=~`5`qY2T0T|3IKi+#@!QewtNv+-ED(8l{eoJoHOow&Y~$T;EpW?~nw-6L zTC0O^qSw;Ba`}n&B*9gYK}d7@jw*!FRE8qzh3_v)Z?2fT4PQ24vmNdh|7EcSgpNkh+*CMAu-GtSb$3&|3o7{Pmu(itfWoX_8XCOg`A zmL$HPZKKmg1kO>*3|*5lybPpQ4EZ51BKOTAsd}sm!{{pZi#!A}FmbY6Uj6@-IPJ>ND~RV|`tM z7mHL+Mbco?T#AW3(N|O4o@VH{jp`P2)xR(hy1!nL1k9S&MN|D#k-d^iHq9-|nbVGQ z7v{6}c_8zG0_wx>h>+O4;a-GyB*T5qNgH+j^Ae=aB)Bck4p2yc@rzyz6X*Sy@(PNB z__>+Ry`&!=S^Cj}ST0BKjJ&ye89#P%jL>!}G)zFO-(HQ8cd%Se?OB4o7ZeSeKcxcq z$;g~CJ?_xFiL1%yZ%7gOpBI?wNf8*06UAIe{_euS?EfTuUc>0qOHuvzC-I9WQHn0# z(;2?-EZfvR|BWe;EAL;8K=r>m0ij8P@UDb>F9N8Mdt`WR(p04%1y$X7|S?qp>Q*no-%tJ!; z5c$RE6acZ#gFPS+MN+EsdsSQvh;~X zL3RK%>~@f0%OTpFG@R%we>p4DOq8;#*};a66pQI040yhA!VAcd63)h%V}(%RAq7jp zP*MtkwkA1_j3{;jVVDGsCjO|*U!#{$o;fXh#Ha#YLSl?Jji?CGSf9ovOwj}lx>DPS zhOb&e0jfERVwX_QMI5jkn7()iiOj%6BY2eY8d5R26~LRAYzQ0VkB%2L!z z;f7^i1UWOP21>`%y%=dan9~D@I>{_1^Y*$ck#mQ4$P@6JbaRr0uFKccwdmRv9O+y8=gpd0;ZD(L_}` zH|J#eb2Y$>v|!;x4WA55l43_%d>UwD-J>0>+FrFqs2Y^ zou2HES7+0O`p?CNJ`^{{%LwkbPph6D2Rqfd%C){eA8)5O)l*}$yLx_+{%CpYvAM6E zBeM5p!w3p0a62!EK$ki{xc5a;f+D=RRSzer3*rV7MJVA`5T+gvWk{3m5>_a&`~IdE z)sPGoKUR)Tz9>Ox(Pk){FX47L%>w`CC%9dinHV-QP`{|0V4#UK*EQdfkhwvmPON0e zD^6K;{f>rj9H^_pYo36V6t!HGZi#5u;5n1>){Cel4U%kasbp1Au9)ed2PuUy^cC1k zbIPHIN=b%;TpUh+fuH#|GplvLClmRHv5;Z{~b^7W2Hs2hvurC%rnWi*DLJo z05^a95@Mtt*Y%*cbJh)g#pTqCKs|BRhbH)F+Y65q%)yNFpnuU1k*;zaMnyn%8G?n* zYZ#;D+-Mjl81NPqeKr5~N^*TC>%A;|YB)@r?5%4`QoUWjHf4uj5akC_n`3W>p z8>>#-k)6jC`5^8=pKiy!3RhdO{9ws$H-h(Yo0lN**&fS2d}RDPA?mN=cJYD4$|skyGfr%}0RSuO4J)ORvJ;IjXo*@ox0+|D zG8+z~5GRu;$qlA^o(y50ViYB@6cuZ^fIRZngm{ZkusUe?AXa+=Qb3aG2=<6@u z{=O=nPVb8>>5OoFH(%V{dHko3y`G@`?GNku=%OepcPKJc(~fTmQ1RH zKu`Wr7)7oZf8hhF=0@-MGtrx;wBKf=v!%I8t6Vq78MH39WQIbX0(&!+dp%^LziyW& z7Y%$WeuS-iK3oj1`7Oc8#C=%*_RiQB>1KGt4ILdq8Gw_cjmu9Fcr_7DjsG&iT})Ja z&X+t?#xz2TDA-hisbs)ZkuvhGAOc~sRrM3)YMNRM`|JL~=nKiDEn7(>BJ6mV^mk%xv77Oc4RCmlPQRQF39^4VT#I5i zyKrbc6Zv)jz}9n*PAbw1--tp0g$bL-AycHGfc%os?5+A28X?^J0UR9ji$NmwM&~bN z(xeR|_^Ea-a-^lG7h|xWjxR?K$56Q@c~hg`w}(Plo2FxM4X$BjsQ+M+C^U)=&nXjx zOw5l6@o+JgnA?wui+`}co{@c1=Q^h%ZGiJlv(c`8K_6%S*R+u!Hux@Ip16KjQ@8&$ zV)q_w%ch;b3iHlc%*Ef%f2^(kCGPC^WdiitT&H#tw~YnR(adw&AX)F9tdR18)>>!c zq?IstlZ|SCB|`q(bDuWa(Dh(kCgy%Ot#+;bD5Q_918|;|1WqgY>K=~r$4_O>OV?}K zPphdh?tc`&!5#XwXqNZoM%nc_n0q7WZ1isX&CcL&!^ixt``o5=U&VQG2jLqNyRTnv zH=~rh=zkW1gyHD}p2PpqSiNT2gJ8K14(P+LP0+i3-m)RMm(f=DrTVVB(_dB2!{ohFJe432FOkpq!k~r;xcT_ z_7Hyu2+Ur@MQG5N-7O7E!*hiN(G<~Qq=zc7HCTVTHm89*kWwYaPK>Df_l4s>`|SS= zV{x$Q=KJC{%fm2`kkkIDn;-z77{AJ9U#K316sb)8)*un7dIe;|8D=C7L=%J}T#6Ng z$&4a}XcNKj7C~yBCraFzNE9t+(A3MbR{z8flwjqY0h*P44VIdNn%~BX6|(XDnSQ~2 zi`K5U!CUxNDOaa45HqQ>z%o){z1RTUU{!A$)V`7_WQsVhbjd%@vNA7GnDl!iQKbo` zhg(oBfWWoBQ}`aG8xp`S*X_vhm#M1Pc(yUpq9A{qa5DMsMx&j#Q4firoIpyG5n8jt`5Q zgOx0fWL93kj#@gN!KUTU)ot}+wD0N#L5|-pbXtx-q^nfd+krx7UGY}6Z#aa&CTTL1 zgqI$li6XEyfs`gehZ2FIB#kPR$a26Wtj33siitXfVK{=RVuXsExNAROoqM({;S=9l zYGDk^&B$h~BAl*S1V7nmZ;V`DS$Z_(YwLn|HJ7}27~{Z*!8Ef#Lq$7^?p`&FWciM<8+Qq>p^Lj$pW}=gp#$F7C4O=mlvy> zzk(yqav1|f6fWwDGV7nFHf+pr1r-&krWMwuIf2h(17$_H{627j9i@U0Pu*S=-p?hrkxUsdQ$d;lJgrRvi9Il31w_|{qF&&7IGX$D4 z#YNu@kT~LAOHn#@0--2d+is3vVEYmL?r8^P^`q36o3+d{md(iV+U{qViJFe{wWzvY z6uyZw5=_{v(SZ{!ma{?Ry~>OJCofd4URWZ9hE5K^s;A^3;R4v@tAfU<_%+DjR~6K( zpoxEA%Ys+4jfw!a%rV0;Z+A5#%lxHDP7wv|^SpGd`mb*~u+=YT-l}KwEHPRL*Ug9W zZvorRGeygfS)c?%^O&3NS^KE{ck5LLA@jfvrmvrU8BRUL`y=|RV$1664$$48Jpy!n z9j->m&=Q%WWsYC)l0%Jw?ym6tf)9&9Dz${QC}3O6@zP`i7qlGg@-^w=u4tL_~`S zc6!dy`OP{n3TSe@ktevjd#^~mslHr0gXtC0QmV-0&C1oO;CUR1^5ew_GrJtPguD^{ zwJ;q2<>rU_w$Itd3hUGPj-VM>eTkF*xj%VtbhAbOruFyf2M7|GXt=h}vlU;h;UK;e zXQ*b;CZ2QJAbmkyl(>Q{)(qAVjiq^nZdEQ18vu%7Z^wKv&x7S@=uSr50@JH(DGF_A z!L4{gubsl*kBBm&h+NdcEIX7~qau<_vGM-iJEBy&!?JW-)IJ)r)GtO~CCkLX!yN=N zX|s3mJF5^Rb!{=wFF+@zdT+_w)~2&(UFq3(xUU(rION2sou=nv~@FNBm!T(yu)vxig_y8abv&Q@v#t!%-bV>3o1t5`Xpn+<>#d1_H!uE z%{Uz`M%nJw2)V!4-pc>Vp!~w8@!{^`%}O`9W%M(rF(|LYS^`jUI8FG7k(>%&C@JO` zw7T!(F9d9VXlx1N00hgtjX*yE!u((gRh@i4C}g1RB4ZlK3&&C_TaO?pDcg*E;d@8r zMm^?X6!JCiE;ka=P-Ye`G=zvv4rCKkiOPXsB;>41J^Kz12|T7|d(DSZ!Ch=8O+gF< zlqfVjcg^wbM=cx;Ly73p%`%YCGpvU`{}d5yV-!iH7!{z;2KK|!3aKj6Kj>S!)BTbi9OrMae}eUQE!S zqWQKGwindcKQ9AWa@#2|&sH%JRn>uJU0iiDX=Wwd*iE~5Bc>@03&IQ+ZGY=_fk{o< zk_m2KJEhKMO-DR9+c>V_sU15h;`LA4tcv6@J5IW62fxJ6+k#R2;kaY>6EdW(2X@_- zqZcW$!>J#=5rwlChx#$Ti|cLlML*2@x9q)DAh|>Wl1nah9Q}49Ah{$xG-;ld-#A5~ zx!L%YsrI;GoD;mLD0#O#xxbSCL3RC??vNnt{gnLevFmh|#GlJ~X?mZl*>_fdxEBo@ z-@4LiM1A@-W%)2M_~Siy^2F)~vv*@_B`SZrVcw*S4B_NJ!qr|XBDJL{;hn%~kfO{eWg7z1R23WW190o<+IHNB@D z4}jGHNv7yLkID=jxR5cvzQ1hvik@)NvUiGl_T~9h`n*3?1yHKu#w&(MDfi6hWhe|PtB6j(_VDhzjgC{Gwcs00`Ncj z$J0LL0SRINZs~p>lc6f6?hjLfRKy|rnE1#y0@TDv4U%lw15x(D1-P4pI07ZAQMM3c zvccA2uAz%)zou>Fr5+h6o2~d*a}$E0{RlZNY-(wc|D5X?<$2sp%qMIklXjBs&ocCf!y!`F6F$`Yc*jTU|NzL$zczkY_@=l+$rn zOZ!|T>6{l9Uf1XI57JXdp!9c6zyyh(SMj1^YtPH zJ15L#Maz`FQWoc(beG!BKA$k)LlXPy6@!!edw%bg{hqS_&|E5{xKtRcLK%^z$sNsS zPn?}d)kz6A7Z2{=*TnyP*8W$~9nMC#)hWJTGL}k8LgN2Mg<)C$Kd3N06<_bB|BVVe zn9Wem<-;jp;V-nB$$3)^C&{0bH&e)($YfwschFPH9rskE_lt6-R4>4V)=HCNA$W4O zM6w58w7JD`7`sV)QAsfv_VTA@M>Fe>Ru{O1&*M0?YtY`ApWXh3quM`UkV#E^xLCJ~ zfkln6bK*+*nu}xTAd$f%s!^s&qW`6xB4^Por^K?c}4 zX8hdF$d*>XbiK}kpyd;sz}wwU^=DrAKc8Kf=c~J)2d6r3Z%+HU@xx$Cd>-OckxVn+ z`0b=U+%Bpwf6eWFxFsIs!}R%O9c<(~_^Wio&$wrC$se-(0RV*VZ*zm3MhWr*aOiY4 zeNjyj(?lSq)RexszG><5Elo?NV#@=B+mWnocT{3rQ!>=DylXIKF@l#?+p%1cKs2vQ zlRhY^&hx!Uu~MQtF{L0FW$FbS&G75#`v@0dKpVW;e+~kEk?7 zzvQ4e(L_q1Bn#F;cQoC-=C?(T(~WFNzBgIXa6uFdh|-H{QI;2pX)q1QMDyM=K*cNR z0ouDwQaM?sOM4+`E=O9I6uZA-EUV;tUOp_(>C1?tZheJKBkOa$JS^FE*j_2s_2gw+ z(~o_`TnFmys`V3FhsTZMbk{wf!CY#%c|}Q3t$D*`rMiVEAhWvFEl$6tZSgMxgd7~D zqL}k2qM}7$F4b{4B_9Wz93VS?c=G`LFfS(o zjoalbE9{G_X<`DO>k-+^&g(J7?nj<^wUubsDY>hO>#s`c7E|AU;+oef?lu`HSptyJ z^fFu9pJp@X%2lUThkoWy&1*PUtGwE1xP~5LuHAxhfOC}8x&_U#2DSB3oJ?Rl3BjRl zC;fq0TjXD;z5nJaQU^4m4qz+vC;HUnG;j50_yV%vCHGj)l~o1;zbSD&wX7&xy9iQn|Mx`t2-CIOU2$ z^3J@Hzj-RA%Q-4%J2Tvjn;XAZm20jvR`ulPZ4J@xS34NAPy-W~ZFRMNtBdH&=OeUQ zi7(y{1p_ELr^X$jNK`+MTI{ylV37!7Se!1G$8_0IrWDfNFATg_E2RssaI=jFHXSCj zRZp{Dsc@;}LWBBzC{Sfk7|5E5c@o#+eDw1~-_2=pz=9kh{cYOmYDs1-8G|=}@79p8 z;d8aG0ad`&UVYgxOpVV+%=67N7Lo2AHEoc2c^u4rb~~oYPhImm{X#&Fc=ZkF5^9bY z*V&(UX(*tN>a{@*CPO3FM}Tw5SO!B(hfE1aONWA=kWOYDpv0Dpf@zSgwn7jpMktlY z+V|JPEdn;F3B4giJLnSF<=VV-vYJ?GqZf2Du_DN$((zJ<$vfKev-3rXu%e70?n36d zD7ujf3gh~V;%kAffGuc2F#)`>J7bX4ubb|3g-86TW$fgKvr@Rxr=5#DF#)fjzxFQGAgbRi! zBF%#$nJ6ujKY6MV0cy{o`DXzMtL#xTGh5pQx;Y!_<7MS=Hx#VhNDr)_XVASJ<>-YYKbGl35q#uO!Uo(>;1aF67%E|%s2j!%Q{Y6UL9uHXB4s{y z#$%O#beVWIwHq0IS$pg>g>?nCQ^Xy4O|zpst4*{j;*%uU8r1oH-?aB6h8Fb6KVA3A zbDy|!smj~yebX|l4qSMfxcQP@HVlLWER+pCFWYXWdMdDAn3ywnP*$mgcJ$Z0jN7E{@PN^}S0lKee+wj|eHgLs7sJ%Kojc=v zwGRT*w+;i>CECi5N8j0vhVR{Ew!0qI_kc#!bzV6Pa<|Qn#qxNitU?OR%ZBsAUAMi; zAFc{>{{Vn!;PqEOSfo6tRk5C5L@LA=@_BzwhkO2jDhf7f-pSJ9YgkJsUlQ{?h|tm- zOn8;xRO(GQ<+7gp^0*L8+;GUYf9lV4l@Ej852)o z!9$HZS0;sIh!q8y*@E6&8WafSj4%fp(ci67%+0Fr9e3W6qUlO=(#=MER4}84j=))+ z*+|Td2A$J3(N~y|7r<^KG13dJDiW9g8|Em4Bu5;bkVGP6!8B7prj@XrT#q}zBB(8| zzt)fhLIUjiNE15fiSGwHEqLMt;tVbmD7qeZMFJTWctkM}G7yF>aH*h|k5Qf1B5M=p(TYPZ;YVq;@tHp=>-?jLV|JCA4 zT~ZLB{C`?}P@;Ge&6V0D*58kuNghgmz%?Or+(?AIyRbxTE6h%!>g1>F&;OG8;!IHs{{!=KGi7 zY;OpfG^yxj1fQYrPs!9ZKV%@Scc)@}iOEZ7YNakF?a4C~W`;{u5RR>srXTX!AdQlj z1bf~@nj)0nl#-T7BwrdIxrr)@-kC5tjABa0EP~HHi5g0C{F!0fOf;VA7Ge#s z5E-8IIo5}x?=*dt<~LB?mIbKu?V3FqG$Z7itO|p$53#^vKSPBtFOVr&x+_VqLfWP% z%zKhHTrou9(b6G4l7=KK4cQD8)B*yYq}3Stgdpuw<+s}kw2=d&;lzlH4Dn> zrcs!l-p`~~h1JcJU_wQNPN~AA7h&VC_ez#Y@eaX83R*6SMLl5ryy$ zNYj9{;L=1tX48o%r6Cji2t-=F5C zcO%cM+^bfOpFXU7jQZ0LgkOfkTTz)Ct=mWf6yUG=1!(d4fr+{XjjNIvd0tS?-F`IR zQ!7%uvf=MtX{#;)wH!Y(FY-cqL$4R5g-X*qNjL*uM>X$He;+q3`re(im9qUlOzn6I zJI}`PdtjdL=CXlZ;-eV5S%C#DKDBhJt~*G%ao6uTZ9kuzA0M8DF*jo!<$mu~#=ZV^ zWVYVLaMmB2^ms)g^XFK*{ZLn#>HD1F!#zRw#mt%atssROcIzAXCuLs@o?Hzlkjr-8 z3?k`Wg46=mp)A`^lODH*ZA z4URCG@01t_Tm9rzlA+v1lvs`)VlQgy!q_1N2*p<7)LYY$Ean9m!hr!?DV&r@cK-AW z`$*2MGoSED5vhNUga>M16}4%*mR@=fA@-*NP!uM72%Rm zSlpIE;VLGDq3ADdigYeavEmuvTxhl~s7I2pWHW@2)VIe{C=kARGtBKweIj-4dStBI zlPr({@2;_?^0`u#Lb+_Y&o-LSI`w+l8Jb56Wd?BGa4VXJF^%uE7ib1j>=*T%Hkr}| zQ#XK9*0w-#+}U1V%yE06K>q{9S|_N)si0i3Z&U>$;52{KIWrt$e1Q-nuY+XKnKEN4 zRZi5fF_n8Zq&J!IGHtO|ayiXjJjH$m(|$E$R+Z8a7TN~d$Kiz zbf{!V^z-azUoOEL-=tSoM-wK3&$(#Xf>LK6Hp`5<4MRWPs&6TKT2=b~sXpHPvFvxW z`SI>@=3Or9UH!0;ALI{xkoOf94@H31?uR_TXHJGZAGjL6e5poPet9^GK!(0>>KHs# zM1}%Fs&F#jR;mcvj5`$&FkRY;#Oq-QjOLyV-~PnjH$pAS6M9}4#(&7aBO>XtS(HdD z07BCk8oIk$app*}6mMOC|A>Fy^b3B|64)wzFG<%eAR5VX zi?OE7aduDFUt));j4P;cC!t*DdPzH{4D z{!Ggi1Or6LA*AQxbpS>WK@{&P?0!b40q|KOZzoV=Mm_I`$p5t_b14iD!o0IPAHsV; z;TnLIMMW8ve=Rva&fZdmJHa^~jXT-2e?c>@QLe)Ub+r>hk-8V8~^Y5W#aO3Yp;54;^Q!!6*uGOVWmT zYKhobv5JAT`knqnGVL)Q{#lFu7*6rir8d}Lrcr}HKEC=}aq_2){}O11F(U)l}=kcBTAGrqNMBVMkUVn+(AR<+Q! z?`P2u$E%G>b8Lqz_~%N!@B4|_qC9FfhWwD2mO9h@-@)j&J)ufxxCYF@owDhCX*Z5q zWWA@#5Y~^dr&V&<`}yPd`~B8p#X_w~uK?Sn25ai}Px>u5YsjyILRVgT@Xwcz<+OCldQlkiGw&u=(lA&0_@DX0~HjAp+*{7o06S$*?>JG!iOO zZQtS~D$I+Lb(qR`6W_=&(j4CNBQy(;4hA@h0%izj>4S6&J-{ml8H=0la1 zWzUqARh7U4O4sUOYFk}a(r!~p@pouzbKEWm_P)zUh?Nb>a6p+q6x@th#`)h*EhCj?Y|FEz^FFV z)v*WeMBeEOJZ$v22r@g1qvWW@+Y1cB=boM+lG5$^VGMHI!4XvrKF#cnNw<`QNFyyRlF}X0-5}ka(wzd*-Q8_) zhTqy}UHe>npY=b?Ieufj@AKTZVn1>1@#TMp3}d{75!@pf$IG=7GzcHBCWTr(uf<+Z zzaN-U?=Ze$#$U;bnwl8 zS@)zj@Kak0uW?y_?&IBx+mR^lnpfjG6k?rU6!=gZ5v4 zg^#*%4Mf)Ksk45Gwemj!(nBj7C|{9#|GI(yu=eYA1?vfvwEW2$5zc$oI)7hz7Rf}=kRmK?~^lM5$3n_ z4&R|litThfT;X>H;Q(PDqvl1JwT%fu9HGq5v6u*#{9O6n*+5N@|G!wUePRBR|M^xMMFewV%EdS3|JyrhTD*5CF_94l2%i5M z_DKFOXfiD!zvHzl(|-+nBz^uf?9u%mAg4k%mdfX}yS$*jLy^sj^*plqqDV7RXceHw)Z#c!Wd+TdH-n7>d5PE_SwvX4!26B+=_RStS3=WAf z)&qiR3Whzlg%ti>KlCU2=B-|SNZ()Yr<7-`~={7Cu3`TV%o(tw!c0&!m@EBX{7@JG?_j6 z(eFp5=Oa;3b^wr;(l#~gQQorT*vj5C`iOqse7DGq z{k=_+loQ4VjxYp5lixl4Bv+~GG!*`%qk~-<#x+CGHzLt}1m?ft23~q7str=bd2)dj zD`1PU_W(vbPu%;VgM^2%>MPfkpe?=IRg1glqg%ccO0GL0dy#HiHcn*C>y`NxEr&*RtB;6PJ(&Z?wbMqz zFUhwvg{A9&q>H4pF{k^yXAc0z1j{Shjw%PfJUgjhtN3*adHCz`&mQB6ImA36bT$4O z>(5Ekn~Bz&F7&KFx651Gf9@)RvAoE(-#m3ad@syuM?2o@^&}kc8T_3I{O`mYKGJZ0 z@GtiLk@(KBumcQ9=?Ib4wI}^t9>8hF)d~OVnJ?;l3T)E*PL#jCelOax8M#ot&!b|y zll`WEmjaCV)bjv5jSaM|To{2Pb`Tka^7)h8zCTH>N-#@A78deU7d)D3fFzGG=35H_ zKCpLsov%j#0AuNsDj0^4JaXWFf0KNH>taNTS`i{eC;l~DuXl)`hXIKz@gl;~l$2y4 zx^JPY8eJcc^5v1m0Cz4Yo7J)j`PKP=7@K{x%e6n{RWhGci)y&Nb3Qz!j;sh(tOI*` z27(H-(7sfB0E1^^o#=HeTqTT-?v5top#i4mvFY#Lv zZ8YtP#Q~fVRdjM0O%Aii5Yy!kqv!Lz1(1g3v4b5hM8XR{fxc#6M_V{*h6oAXp(Le` zj_UBMqaOqY4iKF(<0uZ^@0~0*a|C_vR{y+~z9(=Js*HCy?ehEDTttge#WA%u8&71P zcd1y#XE=`Hx@=G4!cryuzvVQL|ILmJTB4{ZqykkbVC;jcqSI96(*uthEE}I(l?#&4 zh-8wo(MCPNIP{o9vNbeakz-Kz{7Y;qSPZq&aBqm(w}C`T`tfC*YO{ef3WKoi=GwF$ zwx~D^Z;2}`r(r6{L#aZaLP4KH%R=u*vGtscVb`!oSp2$LfpU*jg8bXrw`Gt<$D2jQ zGVM6ixJ;!|J}ccuyIR|Cx^t)VdG1M>nZ{MDb#KfdIXJaNH_Ka` z7LLiN(+8pDZdK~yqoj)0En-mCmp>0ODn3AC=;PbaDU;|4;RqS=LO5tN2zWxY*a$?j za>WZK^J9n(!J$*5@}V~_%2j3I+NXNP5i5`ricbc7@CihKE95WWG90VGC6fbHmL%E< zg<-mh#jKDvC&nsfZqfv*Da-BnXzGU&=)9Beqm45_A}qi)i3Q?eOYwTMxF*pDvvj0* zxji*m&=Sow3>q>=4513cA&%f09tEO}1ZgED)hPa! zjM;fmlBro`QIr?^^sYp#P&}@rq}1i`pfs`{^yms#Q;!PZ@N`))2D_t&YDS{K*rx*x zGEir~4CFMZa=GO+s6-w%HKTmLj!}L<#Xi>0t;Pb_hb_5=>DBqZ&ZM&75Pd&1NR1mm zGDJ@=c`*!T=MFDPJwT+AM$4FMxVfm!u@4Zj3m3F9%1%TQso$YZs{wAqV}!L~<_iJ3P^VjWwsOsa8N zvKx33ZJc*mQ&L%V$Nkx`MA*m5FYSyR^?A{wc7=c0JNV>&-AyLyUMkESuYb?zJw?mD zO}xIl`1AZ#F>y<956n01RhGu9n^wMK&JKR{h**%N9DP`dyZv}1IrPfoM0Gjy*J;~b zRLfx*7FO%=ApM)W%htQ`{;Oh{v&ZXdtqIRF{&<5g;y3`_1UXhvv4uPDd4tVyJ^lLo z!EV-@=*OeRr!T*sB^&(lap;)ZIYZjtGWfMjzzTQR`);an>`?jlo0uN=l8^$G5Dk{i7Zut)EL<_+ z+X$NkT7=TfWH{mSB3m0AQ-MOW)h}FoO~iYuTB zK;nukJ*MG(&xpH@Xh)F?IJmxIiWD@x$b*t}Sit&RA$(c5+?t`kBy#qw)WVX%hWUtNs~i)kjnKff_Q?`=ax}9)kb$-~Ne-&~WH_ z2UXVrwWMC7ZXPF38bT}h1%uJibU2*eK>t0FqbW`by2+-^ee}1n3^9MOYmc|c%?k}+ zQqq}WnEIx|$ye{sV>wfbSg6@I{5E^GkbpI$-sd7kr&cVonD;g=rwVN7hhOO49@o}c zFR=xXd_J9TF~2DJSsGo*(c#U$*xu^Is+(l{u$Zct;#fA4#JMd*cMKU^Cg4Yq6Q)x4LHKDYfPcxz=g@TlZX!-ZgHtf!>k=hq9L z$zg}(pH)2&ZuZucuMjQBzZ@LU<9MI{*?Z~r83iTB7lV=^+D{>rA~!_uTmES1a6S*1 z4Y>puhtZZZh=;S~7Hx*{I9?mWg0AOH_GwD#R8Bk4}3GX-fp{fzV(>-1 zY3`Q`^va*v5G>OD9v60VJf_@Kg`&k%x72)rls!LInJFGH?Me;`(v4Hc3tRuJ4A zGQ+yi6w0axzL(gPjYc^h)wbR~TG#jDE2uOq+P1RPuI&=DRc;{xQS6ZZ%!!oNc3LID z?@Q*vj;B~E4n|qL_x7+(nzE|y8!l&diO18WN&+}!k*Y3a+`9Ar=j_+#;y4DJoP95_ z6gm1)>_)4~ZfnpTda1QoLWT&bV`_#woy#T%&;m)Fh6wV2t*~>_uTXl zp0j`AnL=P3<9Vqp@h5mjoqp{2r}kO?&8)nVlK))2Uk2~Yd-6!Wa;xxiUM)6mny!`4 z20V^YpV)~4KCfb&D4DFG{bBV5yLvrl=^*M=cCG*Mi53oS7tgeHo1zUPg0Zmv*AuOu z%S>^w+T_35q5{~)y`jM@`lLk;c>_u0FgjApu^iAAeQRukT3aXUCp=D@*+;FQlnd~ODgd=y4GB^_$`1@=r(E^nEf2CU(l*D z9!ZrFHf3G%wcF@F5opxaYyI38^>d`La;?D^88_48o{g^0-GTQu9PLtfh!kB*IX#Kf zU_2A?S6yFf{cyK~9Pvpv^!kQ;F&1<)qD|gociU9UQRQkm$Tk;Z@2;45V0$3sQ ze*6$<@+3RT-_2e>^kM!i8BiIG{qpOEf6yBO=1snk7k1)Qqz`_?v+6wLChBql*pFeDAf16mY6?XvgMBky@`t7coD|}rP>Ku} z_t3&j(u*Xz zqKQ$?<8O{MEU9glHx2}Nj5e-HTMyPwN-KP<4=^ibZTuds5DGR+)@&`i6=|XMr`;s% z&DX;oXSEL%BX$jche@j1e{7akbe&LPRCaF;r;YXzu>Z@m%xzQ;R0fbb#>d2y%CY_P zD3h_A;dGC%n}B%}sW(Q=U}ZF51&HiT0aR)*g%cOgoDJ|O`+ymh$#%-ZpxDn<&W--z=A6@M<5h0naM*VPUFTnzo&$8&@lcQDMx0;jxY z-)nEOn^uFrw=#Zz$4+cW-6Gk`nc@BBlg;)0S+fpD`ecHoAMKmpl! zf=>BB6DLvrQ`%>UVg^g4Dp1T!iu4mKzWj4fcYhZ0zVHt zy6$~9^PqhYq+}ob$(_Sx#>aP+>bjQfzn*?MpDW7P%Puf(}-X2fks&>L_Kr2EkpETXk4-7D&vX9 zTgdzoil!t(JRr{Vo6HT=g#82J2;zu!?O=AL&QSh7Y&LV)ogvCBly;(U#K~ zZ;CWUb8Z6gtBjTaUfTBr0y5RBqq+P9N+4WvV5fzOt<}t{-+)eg@XTj>-R*$2l-VDGbst1F`*i~}u6+tL?A(~FFSw6;sy^_JKuxa|>!&IvZq7P|y-Ij@o zy5kSDA3txV?4@{u=~cXMf67j}2C0y4t{Ym9MQW7L!tS#eOs2w|PgL&a1!=iM*vw@$ zY9Lb`_C!%yrt}l7lb~sH7@Ma}yjHEWqWfJ}S>2+LMnwyBrnHju8S`;fFR=$p&A)p^ z=>(M7uTFsSmsEWl*Y;r3)}=8Udr*GqX$uFSK{mo+P@KVGbQx8)lm5$8AKhAqw4OPF zrW<4>{7m{$$dRq(ZwWdF#yRHu%C3jQf0=3o(u+3SHC@hT0+ZjB{UB4#(MO__3xa_E z3aXW$FM`T5jbXDS2Z!;^`1Hat^u z%wA68ZzM#cXVkGi-i&B7f9#$W_FA5}*>_xs$U*nC znCC@*51Ge5KwA9O#NFRt*ST8W?H6w>vVOl<;ja|F#?X5sBC(%l((#9U`>E?uV24jSX5Zu+yi{J;XUEsA~t>8NO+Cn@`hS8UP7Y^)j%UC$-( z!j|R)LK-tkYSbBlKBg9&CX3)xp8J%w@)vFr-K!fSXE^Ovj7rsAMCr zkhXMOz@G*`Zm(RMx-(jE+o1FO(-+*-&44}L9aKzV_r&2j;fR#2qUf?g z!GW@LM(1<|!_mq9XM^dF`U2Bt|2(%d6i+nFGnsQqJc=5oOgMCD*dO;?-Oom@mS!}H z?Cn%r$T#zeFn>R!m(95rKQi#W{su5O7s=+y#E5HzAzG;Cs(e#^YxR~vGw&U_+R5Pz z^~?+Elp?*>2E(#OI~n*?;YNzURy^f{pSm0|Ym$fyXfEjdiSJu{jyG3ElGY76A&9lK z7W44nca_v_5_-Ofo$gtn(uTf7OQ+@TOM5V+|$hsf2%I#RrqCzC~UexLQlx zw#e2^+tn9(9YHUDtDGz~f4;N*)B51F^yAYT1G3pi`~CiJPfv8R*&@DvW1phttp190 zU31SVeEj;V$^Ak2pretT{I${_gf4y@n-o0lZ0`+AnP^-LE|f8UY;g-P`G4j79`;;_ z&?o@cOf4sH^Lcy@E{UVSMlh0IlVK38xONORM|ViBl;aEoGO57ky>Ud;sCG;w|1Qcv z6z3xfPP8~CD$Z9?VoU5;aVTS693m{m1cqTc1ebtVzWFUFEucA6>YeS-j+lWTBVEe7 z%uusb<0u`~6kD|TT_%T`ln)tj%PHnkMiAnD!2syt8c|3l=U8s|EXYbj-h!+rBC3!@ z&K_whLtf;ocM|z=nrg+_Kn!b;8}^SOi4e%d1WQbODq+k`SFU9$ii;vHDl4=tDJg6M z)#2y8Q$AhQ1CPjkH7dU~0es&$o27OfpQOC*o^y%CW

1q~<=7s-lVd0aWVnQ*tX9 z@ewy{v8f{!DrEO^b$_%RYhJUpQ4I;pH{TSr+P0qcGqZQ@p_Q?9of3<%b>E5yu=o6G z3GeA6_)0SjHkj)UXe=>QT#PgE?;SA#fxm0`Wwtv~KT&uu@Wcj-)BqNLI>HER9vU|$ z@x*V=LF!0FF5njdD}mR@V;7Tr;St=ta$q$usyuz{Fe8)p{${EuD!*sm#M`i8L81o$ zbMX_lTm;p(WWe&$JNkC9s_u`=^5vLBxx|W#cf{w_7wyma#~ml0->+C7o$#%hV~+Q1 z$7#*<>?F-G3hsz#N4a68ZjHI^VFNvUTAKQ);BHQ(=;L8Z_U@)GxXf1!i7=3bp~MfuqJ*Z){@BckAQn`+M^VdH@}+r^ zEF#D8K{Aoez${)cZg(tA@N=%`y_2y@vZSSzpcQxV&^OGqhB}nD1sWv?DWM-+iftCs z*QW~V`)3zbZR|HzMWm8Wb6dlsqG+veq3`O~7hBqiv?|70TrLh@F3qvab^0!SXB8pf zTy5jOZxgfDfl5XE z>V1R5VuQog!dUB_>UtM4l-<_zc6GZcMc5lt@BaF5cEI>)qTS<{(!Nw1ZcxkT2QuwDQu~~#X}N|z9p!GH=AQS4x%2YstWdis%l7giaD4KiviHu4&Hme z9a?*%Fu7d}v)oX>)Fq9D-86gsxo?UFvmgzKe%M@?`b8hrB3)zbK{o@HG?hNplkcz~ zF`A6l5+@!IOETf&-!Wknb#ru=lxnV*l1*B-x9)5~V%Vx^ z4eTX3Q`!i#R&Uzg@FOuRz@h+=_JFgjBEa z!F+(cXPc7fRr6*NR($hTI`_8VCJ)F^BbAwSVq;eIkaZo`Dj2pxUTtUoVr#q7?>_6m z#p^xq(K2egV4<0Sry1q0d^{`%glbF>4s1Pbz59+1;M9_y7Xw;3zrjEIQsjAgtMcUa zjFz|X>AZD^=v}ur`S<(bB)h*?2MXjKH#n~3x1JQQPZP4g^tP_uUk`jg;Dq>KJoAJ2 zc1Ax3Yc&j*A5x5%AEwJW1_gu?Rsa)+@^QFemFYw1wY$)5Df~&U*O4V$gK!e!B(v4ml?Bk%Xv^PAa_BsY~n7x4v`eJw1dpQ`xdH^1oE2RvP z?S8WNx)h3WAho`Ru|H{Ua#|SfccZ+>rR}Cj1#6{?7+#P>h;<4DLt!deD#p=RMJ_k$ zD51-y*{`s7-1#4+$x>*jlw2ORNrX;|)V^vUxqbMkLstWIr9uy;$!eN!3!<5DQg%{5 zwzyHJn<%@fBxuft?qulhHs=Fnw7d#k1eZ{E-dAN8)d2h)(C#-deMIB|+3BKO1l~i2 zd}>)MoNo}lu;PLY_s4_W+`+V!1abD!{8Mh zfbD;&v}oP<#|6b9>4}PO#br%&VbO-9o`1~&peom0OUv(;yqNXx79t5&r#A>qE1Gu& zoL8F>vi)si81ln6p}a+Tt6hgLwR^jdDv_x?DDXepwgOb;Y3Kg8tV|)^vPNa>)(gdu_$GZH!?T~@7{n%V&QXa>*N|T9BVq}ilTdE2p*(4cBd2o&qBxVI>!FCF zgxUMysZ(-))RN6Q>^?uTG@0i=)37MF=@aB4E)0cK@+2lgE1OInjr> z^lMYze@EtHSA3CTH_1S!mq8Mwh2vWwb{AWM^!MIa-;x9CW2G($Xh0- zPjU{cSME?Htamh+>k$$pV9W)VJe?l*!%VGZsM9VeE`3MD9B%5M?bG5^8U(daV1toj z!i`KiL)ysv&oZjAYeP=f^|7AV*}}Nz_qeRf|Bb=+zmp`9pM2o``~w1m{P{xpf+HfM zzD5Uzg~uc$CWVA0r=>^4Wn^b(<>Y5*6c(nxD=qyNQ&gN*R$lS7N~5H3-vxr#YOn;iG_#nK`x~$|#K3V>YuVT5~ z@A&a8y0*`{k`a`iO;P^BxIddT*q3yHb4NLrT{yQZr9W~aD|D7nbTQ0wIzh+-$xDLg zfVfaqMs2L+rg^T)r113p67Rvhri;_5*Dv04d4X7Ft<`UCSJL{qGVE<_EmwOH`EQWl zdp+E+P1dWQW&ZYXJ&=4^q~*Obm2jt3=iv+PxjAt62+?4~7UumFSvHXAblOF4;B|`= zoAu>)%mukm1j@dcM?xn-mJ5owy}_5~LidI~@M?sifyh)%lwV%H(nbt93PnK;B}^@% z2!39oEe8?UP0oXeTxy39iiN4l2lF2m0fQS9nlBZdk4+RBBSZCI5-q`}O%snp!Ppfq zra82hpkg&d8NOCgbdGGB4UgJ@)HOuPIW@Yrmc5WxB=l0|=% z(BEX>E1qN&&yYIBa6FSvLjVeQfnqAJ;O1y?t@%V2(+iYOpqlh7pD*b!eLbFjCYznD z-)9(^o3rQdTOcQFvq$&r>z#4TJ?-i9o5nin5AIQf?)1aK+IZph#pH&F(YQNbG{B3(*S;bQQ)8V4|G?x%#4 z00w#pZ>qCN6#cuNt$U#& zf>hPvOoRYxu#GJ9hiMNpXjY1XZf%p|s$KGo}SfzHS8A0g~B zUCAC_1o5^x-&Z~Y%k;QK9m~w{%i`iZAMwZKY}WvxLh7pSCwbr^m`WWgZyX0L=$M#m zD!FbTBxC9=5LYX!!PF=%Z!)W4u58D=W`=cR>K<1QjQ-u-F6wXz3WhJ~Z+1@QGfBeXs~$9j21!#RkgTXx<}=alX!$J}b;GbWmmS37QV zeS9_X3-7p}KJsz;AVhVo6Gr2WZ3ItXz@bOfuFsG~ zpH&ZU$Ne*p22qnmZbk~Ps&B`te-GQ~#nu;q0aUcp-d7p6$Nj{#Ou@}`{#Bvv$~ZRR z!_>L)`;#2?sGjp)+_gTiVX_;)9PwWNjZ8yH-F{6YW#ol7ZJOmpvFt=XbQc2wLbAT3 ztltlM9BaR?e!Tgrcr#}WEYH3^t7=1mmzOS51srIwcch^ROn{SwcF*j|Ew7MD@#7VnO}}+gnRH zgH(j%>g#P52}?!OU1)4I`n5U&z0+_8HTprQ-a7dyxKq9KIm0p`y# zx|QtYDbhFNa|I_-GRI$+)n=SU&~xlA#JRiUW)Tzaz4~=9ky$sL0m0c9tCV@OyKt3x zuTdmO^!UaFi6;}HH1hPyJ|H%62AM&M5k~l~?@iOpxBL)BMzTdD==@B8Kik9vg(Cuq)VNrN>@6_?^@9{+%qK9v@ zl75y8y(m(7!K59@q?!5OF~t9K=p-AR9SCAIRN5ig*=fO8=+O7#F;s!!1hiJm4A@5E zei$Us073^7sc=F@`}dZUdE!Bsa*iU+G~eVCSw!EtHgnMRrqF-f96f;2jK**&At?#+ zh$R;4X!@lHy$E=VJzHbO+L^#yQE5;e+BfS=J5xkjtl19w_H*z6>d!iIQKnI^Ro&o) z&JXro&b*6C;YlZ}jSdcfp0f}h>Xo=Hz1vE2<=pb4;tCf?`w(V6Q7s-!$Djkg#iSpt zblTlxj-TdV_3u67SY%e7*4H1fZT_YT_) z6Puac>5ZCeYPlv)>B`IQfmi!K2(}{%ygU%kUzn!7&SKC0b*JvP*pYQlWe4Z(Kj4E< zV7~5d-h8L;dHwSa|I33>uYq?jBA7S15+;-RsW65}dtUNdkOw>}?PmoNniXxhk-plY z40&$GP4$KL^0ToIW5pm9?3fWHF9a)=At&_3W=Ia%Kl>SpBG(X+xuWEdq&~&DRGdA& zJ9THGF4ZP26;M9q$Gs7!-HCV8af2q}JN{Etun7Y3nY`S$)ECu6*=g{esB|*M<8tQs z=Bp3031uIK3bP!j1b0dNp;qRp!4)YMX||7oJq2m6){6_<0)`b}|AtP?MY--Nfl76Y zOoeF$PgF+$EQ$sQ)2V1;B_&+_C8bK8LI~x(i;q5lIFx@>(N;lBQPtHg&r;q`l~!8Z zRkuX~EMpPM$?a-=UkNpRkM)Z2DdVqD3D7%F@!wwsxDiuDil zD0VTdP>FlDsSy3WG8!=bL89hgXFuW`aD|Slnz517M|+>){SNFyHD@{P|66dx2@>29 zoUm`bq*sDGS+&sT0$ZLbL?UUhp^4W{kby~w5s*dX-&5=v7e#n^EiFm#(Rqx|DgSyZ z;s$J)#AQA@GiuOha8HW}E6L4CdcSP=DIeF)J86M6rb^~Kt%ptTy5*%q;fefY+_&aU zK;5(saWHJ!aGJ{)SaEZz`MluoEK+z} zd+m!1ru$B?i7o$Oq|>UV!w zT_7kRJxJf-2_1V)-VUZrcI_7nz;tFZA@L^q8Z&_X_x*elII_npAy3kq+gVR9ejDTr zK0WE8q9V!q`Bkm^AeZ^VTN}RKESL2Dbwmz_Fo*+>A5DRxxDHR^D*77+Skh_PaHtlY z7;MqLq|I5<6bzWy$|^Y2q=u+CuHr!W>q{P=jlwJ|jsarb^fo@&e*@?7u=Ste%Leoz zB{oUE11~7jXF+)1261K)jYA|!!*Jq?{!`~ySsuhIZo*+Uu6`y3p(JR(2UZ}5h_|LI zMAP#fyzV#=b*@`@Tl0;AR;rP5rqpCNveJ=YoskP-i0GUC(tJ}`(bqll!!S8{s3c-? zFU=rcv#g)MWlT)EDeZ{EkYb5pT)OEtJvF0T6lm)saPBbD_sgjkO~sVqeV|oHk&Aw| zk<>vG%n^7HXpGP8k<=W-m5}0Z#uvxgiLuKuWHf3*#hxCPj7dch3%ldVT~W)?(Y?v_Y^wP-l0?iuTqdWn zK9C!*e`bl9FftbC2wxlM`VEqX8qd%Kvb~TF2iCygU0@vrdy{_S3m*Q@Y&Zfl*KAo-7ulKM zt^8yvrP{iADm|m0crTo%ST8Bb{=HAan8UU=!y$6g(-CbyUGu;wNdPnab+<*5tmG}- zN{sAg5ltMMkmY+TJKG@5WLM++K45CV9$RtmpD9+E(ARcB;HhwoykoFEBZvUcEmvHbh z8kInmK_MSdO;U>s(r2G87>m*(<(ZTU0Y(zHEYH@kY=Gv})wDP*fuz2elo)wCUCZ2d*Hl+RBBXZhfHTZ$n^M2-mHb+-pw&vZb z=!%xK`Xk#mxM|%pjl0$8%J07_me@L#fV_whd<5JV!qvKQ~knv)bBp$sIm zw+y*3^8i*&ro3*sCJ)Ynx^^^erfo=uCdspAm>GBbawKXTFscRiK;=cG_BZ#axV6dE z7-Xkx=!eMH+`17(^gqr&Xw)<6CKQkXG7|F1=yt(;8ZfG#*R3?r+xI;0T^3_7Zd}p- znccXWa1FG&Y(9H61MB{IAMY1!T35uD9jCqcSJh9(8rKpa;1=sa7{#~g%uRjJzT0}Tc}4R=y2p4Eea`C&lmm}6TerhZX4~=8){eh1Se?JBy3TvNjoU6}05TGD zbWf%4Y62M`BV%=q+Haa$$2`s=p2$Ql`pBO`FGu*XysoE_)&AUQny%g6?%pe_oOk=P z|GnSlKl}Y~P};%&>%@ut_clNFqpuyp9W^=c_2=(Q*LGfWP6h}_^X(5_6JIvfDG(l# zUZEJj`P}BQf-Ef{{uI9+K#$>rhHxH(~fie>{@F{B$>799w2*w8Q>6d)S6=jN^3 zKx@=>{Z0^670i`SiDoA&xla`1;c%4$RTt>5>ZfSBh~x>~Lf&drH_sou-;+ z8%y`HH@>*6u*Uh_@d2)hN{-}Ls<(#)#p*?B%xYtoS4=;0-!%i*Bd^tbsL2SDXen>n zyGsAX?|}+$*=BP-oz)<=YVBn71f%O7_cq0W=l=_Jo8u;qZQ)pY{x2AUSCYf{G9hF} zszH|15Ll6Bxl6M397Jm{k@XYLL0F+G*88#4BkOqt^XXa3R_D{1Hr=Nv*0x)Vt-_c} z&A+J+HhZ}_NBDyzkWcIIft61TWrdz@n)^SrL|P?24$GWx9PxO+5-q(kUkQ(3_onj_ zy;U)Zwq4?~OyarnK`SnQMx+f<>bCsiPU)>4?x2xr(>rAiM`O z@hbA6@Ck3_LwDjd@q@aO3~Y5&DNSQjpvgvIf~qNIVF7eVRux0LDHi?3*lB^2s0A6Q z8!1qFANUe&ngD6F(VSpS)BfD>zeEi5{`g@Qxpk6jxMQfuDBxW0cT6kZvv!#IsE&I=bV9Lqk{-9b zc0@ET=Xy|aEB$hsonA@x|0R(9-ySj)ao`~XmFxs&39t&8?z)%(rrZ?I@G87fzcSmVBUW}Oyipc5L6;h|nsbYs|4&g77SXVt-_9Z!%! z7)=!_&5kJ5LU&nOEH})nG|0n$4>ZmSC2vuU$K<2I;>WNj?4|Z>nM|GL90>05p1yDS zFrhXU{^@M?yWtaB8M7;sQ3JvXRpPHC&Mur}ZgXj2=5X@~0K3K4QvnYdMxa(}Pc@90 ztK=Qo{Y~UN@FO2JQ`$?F_XxGZh#;ms#pPtON#RUc>6{;co`Z1*Y<_cJ{uqA4O};N8 zU<0?_h5O_wktt%1v;Sl1ot*-UhF`|!fPtjlfqt0Ifnht+$T(uhO+2443& zg=?;VGLR`ePNZ&D#gJUovb<0ak>UJz1e3`E5Nsh?z65mlAwi^%GB13nd>ANwsfV?U z{SYHfwge)Tz9q>>{?UwnDF)Bj87&Fb*@_e#uQ8Dkt+_RccEMxZiQ%Jbrjb!8 zD#}r!S(H?8KV8^E@Ihi?fCWIE8FIt8O7`-irG*&3-Mnxw&JA~;VJM6dx;zj|z;tFL z%a?xo&J%g)>H50@%CAc!ng#)u>l_LP`dlT|&~xOpJo_GEq0iD)-k-9ye! zdO3)@XXMz)fLrD`!1@}4bCg!gldGT6F5*h;r3}F6=+Uh7;VN?LO%kg}uv*Y+XsJaL zYn!kR&Bm&1*3bQy8V47zekSbgM_!nY_1MjvVQ~5Nl<8})+nKipD|~Z$Jx?!Pc%0(? z1gxlTDb=s)Ts`Nf^+wijT=-m=!N26u@tprrZ>Xv=2_%D4(MS1$; zhov$JBS)3N6dovPAh@@i>I4X6;}Oa&2gRl1?t&FPnIiyE{~h(z*?v_J)^>N=dQgb` zTI528$ou#4F#Ffmt5*M0VWAo1j;@=&o+!_|A6NR5_l&*d9R$}N&$|BH4ditEMU2^a zO~is?2uBSQgMYW-qsb5i|6=~tWc$SD%QS;OpilLuFUR`{cO4F$5EVja@7rgwzDFj| zf>MzE6wZ@=`jU7j8GgWR>hf4k`j@!N*v?yjXz6B4)T*FgSh!J_DjL^ zY&6#W9s)F#5N?POOavzNCISmZyEhjLe6_!NZiO4<2NCuq`*ZD5pjb#!W25Fa)IZM; z)4bNhuOE~mcg2ZVBcvu8OP1!fijK5OGk#GiFd(#8P3=0GM>gi#|Ej`);v*i-3)B=T ziB+5k_k1MkUxWcNXf&}9UuxQe!9Il`hZs-iZE{K?S-(MtsO^vsEa;cP@BaGYH}&qI zEp;mBLm`Bnkb-Re6e*qYSg`;3z-C!JqTjHQ)CKA1kl~l1AdDletJ~p9v4okwa-#SV zUtk;(+GlN6o490S#-2ko`j(OA`FTL0OoI-#+Wd4Tpz}bN7r0|xhij>?X$D0vir;*3 z@6EDI-s3tFRPj2U&L)Kwi8~EVdI;g=;@s>>I_RkS?W(K%cXI^s|JzGN2fb7kfFrYj z(zO8)k8dyp1)oAZCbt(xh%86i9h2All>$JeLka*?8p`~RCRvrbD~b#@jK`pcG!#om zDNR!pJJ=UNVlILpd!5a=5}{MN;GU)Dp!E&;psF6SOpIyMxNz3T+l_ zEn0oGTU{6`8k?$y5=LHZgXV~N46g@$`MU;+ zz3FHU;jAWB>6g#P+_atwDLe&kw^ABBPV{x@uJ^eL z)hqSMJkTZXFA(Oj#J+kzNpMn9;0ohu8&acC?ayGd^UNE%Wn-HT1mNx#l6yZr6PWga z5I0Hqp;`6C_+ur~QwF+dTcCLV`9QetL-qw_(~ssm+(sx~$)ItNdmDpc1O=Zsbtpe3 zXkp=>?r#QhxD#$iW8yPT#;^epkASvW3N6Na$KrGp!?1NN{x?t!J$j2=o!(UISDU-k z@V!KZ30hYF;5@4@3X;Dh2u`M0x^$bR*$o4-w99JfUXoGNL7|vWfuIErNJcYcu+g;a zA(5@rxZVm?ObBlb8}8R7zq^h$7_sGC*;p0Ro2l9PsUcajsV4b2h6 zX6_Fjwzvc{x^|5BiO~MJ9>QMUH`&uQ6%{sFM^O2pJH{E<0H~e%B1*jCj`cF`5HJ znGpYRHJvPV#=w*!cVy4>8)1t2nR85@&Y#-mqW!Zbgh2Nw$Gq}S@F7}{@D@G(W)Z=D z6-xVgX278p7eumEY0?(P^mrCaIlPU!|I zQMv}CL_|QOg!TA+dws{=$6o9GALe-Gci;DQo#!7%UzAy8x{pE&&z**TFUA&qyp(na zNvy5V&B3c3b;$U2qAn18Ff?!8bDq{QCS6>-c6xHD^#52s0`d3cH*c2qdkBV}1w#Ja zeD`tgzC8=txHWpXN0)`?^97)A=RevJl|hwz7lOBtC&suWgQ3MAyib)+BJAB)ur)&j zdZ`#J1EG{>`GQts+Z4$C^0coIkuuy71P`&>a>v735jRBzxGv>`v^NA%Y2=KAR%ZiD z(~0yV-36xZ?ec7L0x|O3h~EhZ(Oh`Uu^LkaL@2)$Ib!B8EQE_>XWNHaeFUqih;tDVx06X8eATdH=myP&vNJ%2uBS`^q z$?k)yZq%5Vy|&vzx;&;F(HIv{T+AVmrS|l4Hl?<@kiA8DLa$IKrFEBqSC1`;d73#^ ziXco7Rhxocj0g*w6(L;W(_cXToOR5ARS5T7!y0Oly`YfyxJ@+Gp0_D$CXQ9CN<765 zK9oD5P$u+6T+`E)1umT!#dz6aICHPcjE96;u7E5%i*&J_kNyooQ5*g&;Osf!J+q1| zs#+qPlDHs1i(Q`SKr2wmot`LuP!>C8F3#1ZXyd!J%;2Ay=!DdKmM;ellxm5Qa;YUy z4;w|*80{?h|1?|w4_~hTh)|$%!o5^(Iv7g8q?T)~wJit7qXWKZm%?F793fA@p57Ww z#8a=_^@bLWr7z}O z3(Sr-RY^VioTcTiot(9WI-Pc<&83_mPhD8VEn%z_X5Tm|f<4y+<({l=M$@+AXGQ~WwjVdEPzL1VW7zZma_s}K+sZZC~0T-9Ta>4 zuowOJ7XYNf#e7tr-W-j918$+3Lcj!l5lwG7NzP|Fai{XRRMk@adF92j;DJ^lV?08k z!;NFIlrIk}te*s}s?OMkmRvG@3*ddC%U^Q2B(B1s8DnWxk7Zxindn8c`1NtG(AX_Q z{joE)3_A6H?tS4(cG?UHdW7zHD{`{k8FPNZ@}11VgfVqp|3hrYcf_Z+3=e;)J5T!t z)y*igpHKxmAbFWifr56N)24s`CK+$Tx5S-MmRj8&M5^0~tizgD)l6psP4VRq@-DyE)BaM|2m2MTt?~lI{={wI!Zuwm#X%0)Lp5v! zZmlpv3DXN9Gh!q5)ENpVqm43wqX;Z**`~mj=7J|*S~El_S|4CU(g+@yM4>2(X?b&H zMw!J>HnJy1^3}2=#UamGGsSQokt4mMzhN&_h6;)@M@%YElwiN;q$ecPHOqQ~YVe9a z3D*REO$5sazejBALYvWS`$oWberc4&LiWb<`fa92oOoiERq3)^PH<0$M%pW=Fxz`C zk3&Fd+*^kJ>p`*QgP&}9uHM)2Z|_ZyI0*9cRn%-sbc}2daD<(~;QOH;(h#4b-$t zU^_I=>%6G}D}*lYw&}0GYMQ&F{E}MUrN-K8*aP7+>J{R^LH7h-27fYdJi}FHAWFSQ{9EU2=++;vn)ZHlTXX&XpewxYvHABg zTNu$s-!`sF^9UmLI{=a@)iPdl+P*Nl=E*dFs>P7&X4JkN#Wj6J`A)ueXE*gttNCE_kn1@kEDpLy!9+rd>U=ak6TBp!kNjIy`o7?2&@qw8odsOR z9RNw8grQh3%cDp+A(|Q`;#rOhh5rm=XCA|P&^wSLpU^^m+{}Q- zR3J}#bLuCnpo|rHFhDl48>Ldc4b4&^puOa0Wq}}wU+XF|P4Gv*u}9$Lv4^lHBt`KE z@8GnwD?Ijfi7Xs5r!_}}N?#_S2SbYK(Kw=>0Wt*(I0>=HMJOekQYMC3P@+TOYOi$O z`9Y%T9>`T_2^te4@4^_#R0))&1(QE#7Rz$`sA`=I$2ZI>XZQQ1AIt1%@}MvJ+P;) z$%x$j?g)u5%aNX!rp5x>mZH5Kk6aR(ayMnIBo=*QalLwoKF}puQ6A_$b3q8@-RxS) ztYgjsrceH*RJpWjfmV=+FcR(sGLuNBHatS7@J2XXMNti&oScsW7Pru<{GvG5=Aw%` zc4;;Vo#brc5>8Dsb*d{JCGU$wdPOTuP1E@lgnNl3i}AA{+p+u)Zsm%@Ht2~Hj2S(t z6?x8_9QnSVi;jr@BYv$Ogr33soI8+M5FSZduaX*-Z>C5^E}*llQWC8E4k8~zjkyI_ z`-1|U_1^%=59nV-j-_#ZWz~aQ%|TyGe$9T<-nchkBYAex z*KK2b`CF2}*`z-VJBQm(q+xhCXd8h;D;1E|_gtUd+=5p(%_yL=fnWq$oM(euaNOo8&l zLqKz9`uC-GPR7z*K5eISgGs$M8%cj}|BN0k<^_PB2z!U}P%z50X?}=VNFhBtkMI%@ zKA((&fb664#9#>2g&zKzXDmOIM>Z-iZ0F*&Y4E4F<=YXMyclLtj4R58(GLaQIWbhz zbA@oe5%!`mVf{>k2*_UhP9z?0(QdMO=T>n_H+Y{leGCiDUP5Ys_NUB!`7NOdsS6P} z*>kY)z1Z_$@pIFf#)c^C?T2VU>8}-EmvyK;Wz98BShjd?RqB)e;W6gIex3_f zr9~F+l1;f@l>V?)P8^!;bN1YbGk{9<^h}MU0KjOP@;^wzg;$mA)iZ zwLMr|s*TzDRWwze+2BymE5=pRvZ659I0@b17O+>~`q4au#oX6|92Pd#y2`rcfXpDU z3a;bnlS(Z}COJH?HP3(eHEHacj(L#RYW)$2%?m@!)AN1&{mPH8>$+#sse2dMzqW4) zFsNsT#s3OF&IF+(lhn&@e;{%$FOyS`PYv>D@x3@ z?FgvwMmu|={D*hnCbuoky{4Cs#X3v2s4& zP)t9F!vIFI!zhrROx<@N~#n^ktuwX3n(-xfUuM?|!d(I#}baxU$GB?Y7 zkgLymlviw657D6kkNl1Au)JjW$}<_L!r#{sQ6+7 zcMLN@G*W8RmSXa@OS2K2W2SgBeS<<_#ldMyp#;Z&>SGv5e}x~#ZfjcW4pQmJM@k-V z<70!A6{QP_${pRep@AVWv0u?z#|8M9$U~d}rB9`SzqmiVf|jB?xTYu&??Yn23V_k}r9$E2Q#Q2c=@V0>LVA6gy1q@>V>oO= zqc$o3seqc8AN6n5&kR=mO_BJ~DyikpCULQ3T(%2Q`~@Qscnl&rD%wmyJ^LK*nB9y? z1({JfdCgleVj_pz5FV$RjPWT&^yS`N`*Vw#Jn~TFt$|eRxUy%;Drx$qwl6JpvpiNi zAG4&@y>N~uscJTPUZ!QLQDWPo@v6q4%Li35-F`X5>T{*x>Q{%a?XIG5+&6!CH%fgM z6Ao@kPuJ=^TqsC0MQhAPf_9`?rCwDO&E&)KzUesU*nCdGrq%!0xfQ#}7dM_x(|LI? zU)EN_I@b9Z2KbXyRWvsu{cD|G*vA25kL`hbI!HvCpyTY@$M?Mv_xW93KP_i0A1Gx4 znc(O9*dG*zKRh`lgFGA0c=#B2Rk}NAr;zty>*lh&n{3m+Y~jy(fX26sXrH@^NW$Pp z$f8^RXmI6OYb?R2520kB^&tx()!jzHa823{#J%}LA54cu%!tB2P`+So_i-2}2!ptJ zC_%k=Vc;DPF+*{pzyvvQ{PX3gq6DcMjNL>9Qt=(V$2~2~FsaLS!bF&y9y7{wk(X~@ zy~ax|Ns*D$8_F;he9ZdlEtdOU`ZGC-k@sFui-8Y*U$@Kh#vzo}wp_%WaIPrEN>wkG|MFYo^$SR0rJ(?(tm!qsG_I>5cQJMv{EicQHTP`muRC}OQs__4i zZ6jDoI>A{U7bAg*)`zSP3aHRGS{!4Hel$oui0$eo2m@nHb3c}(7RZ$X^yK2>TW;F9 zr?Dz6!BhQ%c z6d*W48l!{wqVx?zlM>(oWVgr_fKgic^ABK&9`g^mYiRuPATwY4htQph9>9(T?0nYO zxvrz^_0>yU=fh&(kAICmnbdHdm9MI9m=h=3om!YCE*|{y`gKvu*9w=d z$LMWgG?z+fsfM1g7q2x5zUny{YAzbbK5135%;N!Hu1!BKS5pEWa9h_b7UM-W{?$&` zj3xurw=D6cJvMZI#$Rok2|50eg<9~2umcBe|9&3X(BOd-H+C>ZdC}AHqtxPJAfk;$ z_C0_k8QnC31%K!F>`~s^hOSm48` z*W8>Y{%oRvm??Maj2!PlQSZdf_p0st+n>*#btx^H*9H992z8pc+Re%9xjBA=dWXg? zv*%D8SU4Pl99tgl-2nAL)D|mc}ll`s|pp z97A$St`ZBn&$zs;YtnmvW_C952`Zyx!qVeyR`Cj%XMwKt1;pPx?7g~jrW!*^v9b8l z&eZ>+p0f_(s0s9YX{0fK&d7mS3W=U+q;a47ea6A~zh~*4!4wWI_w~cG=>w5qE9CD@ zU^*0m#|DC#4G4^Aa`6~yj#;L$2!CE>C@*DRU*(aT6#Z)2kO)GceXW+|Nq4lUJOCdBtuJZfFo zK6spP=zIutW$w=pjWH`{S2rvwFC?tkE-xY+2S&0mQeW%BSfkGeMYakO71U{J&g_M< zZ!0+zay_x;%JN@HaF)h8_TH42rL;y4)wCgdOxAX-#Bf17&wOL++R-Mt8ahURM``ab zR(0b5YwAEVhe~sQ%VOn=;ntVjiViJ=ra2C3Yo6E(ZC_&mylF!xhqv{+%1J+a{@&j>^`U%!u*{m(FBBzo7i8B6*CZ_5->nB#Rx+bW4{XOyA39phrFZ1j-l2gFdYcjqn3^<4>lW) z#SnHpK0vbomN4~fg{*mo$#h=Rkp-2e(oeZ6sM*zh&%Zs(fP_tO+cwGS6szalSYW>7 z)XsichrFejPL|PRB?MS|&M~VTX4rVylA^pISvTjZ_g{t^Pt^GuDsOwekABy!0dL6r zwqWtU8255)8dgW%G0}ZhUl!cz%c_$m*UT0+GD6)ff3==js*6=`n(-k(;`fngjbu-P zrm5%Q3dCuL_xOhM=SGh*3LU$Y=;(SwkV>BPdbr2;GF+R*gr+R7pQ!JQ9=^zZkotYT z*s!xc{eIW$6f(@l<8<%;`(k<7D~OJ^SocPM$!pW&+M#XJ>+iZST>!FL#s_TFR?&IC zPt4X|yf0LX3L?Z@!_q_;*x9R^50PlQeM2bAB3Z23Gm zYV5FxMwr!mF^*35A|x?2jN+t!oskUI7`C$a5?GbRsN1074*B?S#EAwNep5AVB9^1I zp2W<3b-f5?F1&^beNYX77ID?}Aae!RHswFnfBnwwJH__VtXzUWf z=5DTo$D*|Cm`xtHP9qj3y3dtNoFL-jMRh&#;@fpZ>=5dDehAUsWPdNQ2LH$3z{uP) zeQ{gYhr$)-Jb)#%Hu3Qa0dW}$|BKB(jD_vyGEV7sciIEJRTsbl9zB6UPCp!%NhWM+ zp#c^$i=i1MZ^q`?FT{q;XevzWnG_m1+moN4aWSE>~)@2{JdfDKdeN&c94Hr;*R z6-)T>r;FCR&fi15f&Q>frw;?SKO=vR-klREO#J<`Pds)X61LU*Kn-s6POv^?()xhx zP~$sK<=z`yNYM2l=EKdOUIGl~U^HQRfMV|qu_ZIdJg-KOkR6EgoCQZ4hMA$3sSG#7&xNWiFjBrRA9-ldj^i3K zqfQf3=1YLY=~SD+E;EM=!DdMeSVu^r!<0lC@e{+CVYafWYWmyB847eyF~&pX8Ize~ zEsB|v2vk+^ij&iaib;f3p-+8X$)a(-v8(D$s21v^RZ(xSPL>b99&t@-;(kkKucvCz z2<3=Tu@p?|*RZ_TNloC!peR*EV*qfSa-BWFoai_!9rN`0;=RWW;~Wm0@SJr>3AZxE zv`xZujO7JZiI131;aW}EJ8@-#`xV$vO&ULcKuqnwME>9XIh6nJ?HwK5-U$GFj0q4x z#E|0Ug-IEeES9RxhV99l1lB-?sV@|RB*Em0pilvum`7x?e6DCRf&NhxwQBvYYAWPq z?bKBx+hC@Us&seOJfnJ^3OW)A#{$D#F6TSeALCWFUoux4Em^!P>|S%5^ux&|zh>*% z;h2}djIH4jDSlN4U+DD6U#v52NaXPo`LROoxOo#diOpqL>vev#?nlbg-y6I>5O1f; zWmXsS2X1}r<*+sWiffU?`;U(0NC4f#Uyaj9yG7cLvGh+`VGe{P*9Tw!R(t(a>Z5|u z%H_6?F4jva-9Q5Zd*F_TpZ+&(*gB}SAnS^9g zk7dJgq%lmxuCzg@h{86LERqHdeS{>?cyz?k zFrj9L);fP`Q`>d6^1ZH4kiEKUm^QY$W-?;MzV1+#iW@cvrK)PdOMT-ge4sQ)fOp)8 z%_FZk^adh&F@HPu@sDp&ohb6fYF)?vKeCQkw|Zjt`PWI@p6e6PpF=7G*k}lueZ4FO zS2zFQ?b$7VAD)Voa~GL8cijk%%sfy#2XhM!Lo%dfN3hDe&jx9;K!0xfVy%f#7KNut zxrNwp5(nJg&!_jU0JTvGXFX|7neEBoyrkq0oCR(5kAz=d8Ltz5)|C9zvS>_2Bl1-$ z2lw#`PKZMbp8IE>{&i?RfR9mvHSlVYRjVi(C$fNGw2lVHp6Azn+F8Y7= zq2L1o2$SN(uTgnW#=vnv+_APP&^@7Ecy2uQJDi{R?sACiC(+qBAHL%GjJiy~Z)cOd zk3UzjH$VQ`ij|Ru&B!}R-yDMJ=C;=hA96RALU)~O)$?ZSSpd#2x@PJAzGwW*NC2!) zz$(_SqRS7h8Z$xr1XN(qAu@VM0dmk6S#&5f99nEbz#9d_tt|xbF%=BOD`}|6X$U(2 z>+^xV`oL+Z5VdLLgId%e#!+JUlduAcU~)Nzr{Pg-Qw3N_2XZWegki4%eC$bK6t5>C zvI%5IbmR*6dFEUkuW1OSo=Lb!YeOW2f`+BJeK^7USFC9m62+vq((_`Mct`&t>>V)) z38Ro$FOXpxUs9IwwTQRJVWviBRF-F)kBwO~XL=|fk<~X%My_C{;fo&Sw{3iv8&^yP z6GswH)*-~<*k)6corDq-!f^=Uyy1O`W>@nWzvU-rOjQZ=zRss>$C>bY0Tmc2Q>HY9 zCAYfw)EhLDtWNtqzJg^U8`6~QmS$EFA5{V?>2n{IizJ*6i7r#dvYqwYdtUJOVqYHB zR|-CVo=>)JrL@>F7lr3uh>B_>C$RFLm}O$KiT|c4PUiA_)4_0Ls{gVs0SqpWock34 zLLr9ov6(QjD}ypBiHr!RjSKT+7~Atef6O@+%@Bbn)7_Z#Su+-x4iU__Yu-&G@Y)`g^!>x{+ za;cJSX6r59zfaQCL71r(PIjhwRq3)Lk@#KLT_MXAk&!^B{J~&(?rnOOv0}PGL(~2Y zgZ#Ta0}79$sVa3Z&zi+#hgI%|gRcP#nNH?lXKv*~U=(UJ7$etpen z9Fbo5^TSEk&H3s|%I1T?2@PY;`MwRx!SIKVdKZT_ZC(!~(p10C{XRy%3zDAX1)YvW z6o7S1WW``CH&O(h4y_Qhf3RC@-USmf6gls$FcSSGlL%DDOp{0~LkzPp6wPwXXv~`J z!dUJ?dM2!a1>GGSF@)}1ETHW(#fxC26eSS+YFCOALgUy?lst+HlR>& z*)_Hb=2SKHC`nf5*Xj6jH==NK*(-LQr~%y~+O0$WHmL+}Yg^&!ap#Qhn?46Dq7T9@`l<- zFP{GpR?t?*)dr7hjn-Eejen1-6_4i^3pU8*vLQCy1y7n}pKext zK|ih`u6<@vvBjoQKpP8vlI>omR{At_f||4CdrqBkQ`Dz{YI{9o>$wx%E|Hv7`xl52 z9@z{>aMj<8W3fxu({Hi&>JI11PyZ;&AlBW&z)0X9hGV;4PKDx6gI9p4(5xUFq6zj14;}}3!6*_|TOpW&OIyYS zN(Y4DBt}tc5mZmNOe5(9Ww)X*IjsvrIn>4qWBKrii{gYp;4dC+&l*82C3nCSE<4a} znxupk#T<>nyIdSY)4;BtDmUUiooTLSzL#Z1>i*40kH6$S?)oFue$Zty-+%9wtjC&d z4Ul^w_MH`mxxDjwY#+RjeDLxDM%Y%PLK-hv3&<$d9u-C(jRUYLE6Sk}9I9Lq4pJs% zr8#Ol`}TPWBuCCgg%3KF6(c4lRW(DqY8o)pixoTeK4i&kO?}{-U>JiUCK@LrjwTsOw~Th}Y!MFqrH|2e65TP6zHi`+y6_~w7aU!RFj*;fXosG~m;WYFzzNQu$K`S#jmzBY{n4VQ2au}LZRtJV=*2UDm z&zSU#Eeoh54v*(m`FLQT8DTWP7ouJ`w9M(+eSEw~?}O{P1c}!anYS!@FS1}4`$Ocb z(h!d*%r^AF@Y7}x5%cs`=uh0yZD;nPb_6QNb~_XmAWmh&$aqB&(R{TUJD`W(@$WmL zeJ_XTLTneJYJ__b78@vbm@9cAzE%AuL1eE!2gIOdFHX9CzJ}1<)dvt8`{Rx=@r|D) zUm?2B!xiWPG<#q3-JKRu1c6fUzcPN0ip)oqFAsr#NrvoZ0{%>e0;bqP#^&wyAyseB zpOaW)70rEPzLAFqDpE`|u|9h8+29Tp6JD`C5X~6;TwnTDB#SJZ;2~U> z0E&i)3Sp0crjZYZnBd_J9)YDPxEeu+qErkRiQEnprWCbfWO2+$V!dI^tlF`f#A8Ig zON0Ec2r(_B@+n$$D*NSO`7gz6cv=pdTIJ=@$ z8x(UfV5%pj&Zm}DztyIf)i5IsBOX&Io&${Hl<`ws zU;)SverGC5D)RKVI=&rA z<4UPr?_xYZq8V%ZInm;H@{J%-`ouihOVH&gaHrRbdLCso!%tWXRKG1Eq06U zJRa1_IhRqZOq4SaPNEzqdv!Q^kfzk-@yd?#{$AIr&Cg9xC5hDhi(E;%0deQw=eMJm2qU2=S`_#d74P z+U>7>Isl`QH6cIs2;V{hl`5@&2c^yDglZ}#;Rc48+i>E?7zvRCSYiy(>6ztQ5jdV# z^ihPK?$ZhT?!*)CWGMd-YbXqvSl|e0=I=s;el3BT0Gi%R3W0j zFqU!$08R-3;MDKz&?+Ae^$jTyWT|8?qLsorlugmmugDAfFY`p;E=PGm%mbxOMH(WQ zvsAcxrLrn|fU{Dd>8aXi{ousHaKorlQFUV%vhze!nfr^O=FhxlKNx8U-*Bspv3A)D zf0Co(fi1iOLedq=)gNtJC!Dp--;82;U@P+lyp6{Z*gV|}6S2Gve|)>DduGn;YFqSu z3hM`;!fW;H1oCUu{KVKo0C2if&@cjVm=aLI7CNqn5UO|E4U?Kng^qf=A2(<)_z4P* zvph2ZSN2{h0>I6eavLvP(h!)I`dNLhEbw4(J}z2i&@B55`=Wn=&K;D%UZ;Tj(kD`c z2g5A5FOgZKXc9~exGQ*kftbGk{dL#q zj(x{y16ezef#`5koSoOIF6 zw($l4MPpset5s~Xo@j7ND<=p*JthxV5`jV!!@{T^@vAUWo+Z+2?=s>aj43O* zCZ|y&SW<#jGzA+|l2VJQ;$CQmjLi$<*(j7g*^94{pV)1Q}-tgED{ zxpO>EdR8EqtL9Pu#X_@5>6`u++odw|visDL^cqDZ=SRmwiW$7EU0znL9&ZF{*Rni* zAcjl5ey+B=q2RMlxz;rgIuk7#8npB5_Hv`_6vkbI?4v7kM3wRvxZC9C!H57O?*g)r zC;!g#?~Rr1a-q%OWn5RwVGKE#m*jKBbV5HS|Dogn(ISyiY))g|M)8RK*&_Vh>27h) zAFF9(5B9Pj{HxAu4gjNTEzR!_N$gmL@rKmR@8hJN$Qftpzc&XZk;Zx!J*Z1hp&sL?j)YO^cD4RYxm=(sPL+iXld~Fd9-&9vZ{d z$X1*H* zd72k?tqP+78Bo}0u@6p$kZ*t%&Wd`d;-~rrh)H!rA9K#JO6$aSH8qL?6_3^ssh>U41TU9P z(~O$rk7r+uVjWtiVs5ybH+0mi+n14_JC^MGN(OfhHmaYr?s?{%XcS+p{(LqJHuaQX zUSij}zyF@nheB38(l5iJfz^j2dFT9|kWHhZk5s-}J0C6>HZ-O}oH{tpmRHa?0YTkq zoU9t67RnFNS8yGN6y%;wST*0d@(a#PLB~W=>>B|UUuqUaLN$eQN!I;^Csc3mTxYAK z-dimw?Z*kvyc#?fmj9pb)BoX*{}d3I6QHbN|8Szh1Pm+L|8Sy^fAWX_#);BA{%@RU zs|4~`xpv7UoDO8|{tG8cqsQnye!hc}#bgR_qR&g7e&7p0F43E3RV(67a>P-5oLW-# zIzT^n*du*7XMG@I9p)L?(qy#`_ODeuycsWR%vy@mOkUSP`eS~)`pT_uXSduL{>FoM z{oR|cK*f#>r{&&Yl&*j(!P@Okl%Kq%OYMBSeU7X|rM?smhQmG-KY!nmHCw|?%|=CF zs|uZ~ZHAUB@5fp4HhcBp39wwT)}5sY_Sd|Ao(^jrFV9YDpx&o(gR!IFr+%HdXKK6p z5K)`c=Jb64#cnfU?e@)c9J~v9pxjc~jwWv` zK*(}K4;Z8LhS+E0Sk$~3QN>T#wcgQEViYGL5$F{~vu&7^r0rW&l%%_aGj1w-eR55C zikhm2m^0ZLd zFw~Ngwt%+u`{LE;7ptz{d1$uug?T$5?_+B_k6Qtc_!pkAQ^#dx7q89_k$Nx`B>=H0 z@_yHkehidTr;m?zVu>Zl&F$yVsoii+aOh`(N5`13L0cN~KF(E{!cIeLl=e9laPsXG zG$L_SRqIS1*yEg!GAx224Q0LCZBp6`M|ez*%20TY`d6;|)Wr0f@B)(969NJQl%#=0 z;}oXWB|;SbzGW2ug3A^A2gD_x(2R-pqEYDkfh7y&I3PCt^YB+>O=xDl1z2-{#5CX* z;LhQ0nqnKf)Cryl2R>Rcn7fQ)`$o$1+RM#2uie3eB0tm4!yrIlhW&FhE4~_{m4rcVbCmalFv0e8=MYIxIb^LN(eaLvv7bdHtVRnXbI4*DLuWkDP%uSq zX;)T)qVAccPAW13OS?ve>Wj)^^m-sH8GB1_V3VXfk(^#yUxMaR0qUef z8BdTb`6XS|;Rmi6Bg7bjX&h6Jph6j-ILcQsK4mJ=l(~TQzcVKP|9^Qg-~$3%QLOU5 zdN{CzIjH8UXm86h{Nfq68J5~hD~m1Hg-$)ujW7L^<|kwy#aq2`dc zRLo{~;1@*_(+bYm)u0{!(ST+`4{6>Sz$|_WkL{Dv?;DHj@WrRxWafF9VU+J#T#rT;IYA z1g%26Tw3*6OfyKKzC5jwY7b0_6d>IF7jX%5beWK{9 zJ^p(VSHFb54d%&Az>tuaa@~-5K$3Xpu$9W``jG8K(EVHD{NQt3cY64YUOItOfw1mq zAi=%pb}+=ST>(C~yl5Iqf5~PR%&hOt5JM$6h6rU)6Eh1(HOd@)C$mAni;J0NR-8ob z>rTcMgK5Hus-;B1k_f}o+f6EA_L)uAl;$W&eX%FNoCGn=VsTR2`0_0roSMF6zNW1x zff;b_z0DyG!?eoMoxYZTAGE$~NfriGBftX=QZVRvRT}WZHHf7JPtHR+b}!B=J#&j#)MbEXT9owy<`9(yq9v(AP$8n)uBz z{X=BL(W$WGZpytFQO7ns|IDuZ>0DOXef>9yiSZ*HN{f{BVj^qFU&AYQWr)_* zmLWsz=_v2N9$?yeKeBAo^ss)pS~2!SblQ`Suyu+0@MD{qP1O(4t&mAgukFZvLy=AE z+rOy0@Mn%*-=e?AcL0$yulO{WXF89Jnl~iyfyh~lx_Oka??;<*LD$Lf#YPu(-(-^3 z&eMDoDJ;zY7CBE39=GfO8>#jc5IGNu21=blIC>?{jl>?LU@fb>Pkw)SL)U!@A?yt} z+bF~9xtjgV8-R51#(3&xx$LjB^3*wa@5YFsU?*gyVuDOG5Q654ga__Ta``ZrwY8&9 zEfp|QxynK~PjPVEO&}~PiCFrxPUQCQ(f(@n;ROU8Biab#yY9-oFi#pd#QIV{9QI#d&oc2e?=8DMbOgo*V|YFT$U=gV;!xx%EB z_iGsJ^4I-gU=dWlFv6)9{p9si!t`&ayWEQ6iEs9FG5|hVQyAcr;mMiE0+zg9KG<)w zHR$JaSon=}!yP?Sm;`tG9*ZV_G7X%~*<4c*8?{Mtl|IisfRy1ZR}gs3>x3Ls!=-3c z@Mgl6+;UDY_N1xC{?p+|C2=b>6upD}g;?Qs6x^CoiF>KWtj&^Kfb`!<9$-btTwSgb z^M|4#JVsMXQ$_0U=;@-U4+#*eF{FB}{^OtN$Fi6m)Q0r5t!9dl%#dqr&MYT#xsyC` z6w@lz$#qRJ;{ToG(@?3RNhHgU^NU{A_)b-}R44%Ed<4zv*zxiQ8+pS|og}zx>L!@; zHFl&9D<5@l?{TG^>kS8A61LHJ&+{3KAk&bsj+MIY^XCulYAR>D!{p0xJK~13AFET< zo01JFQY{v&wmk{Ld(!FN`MKhCTf%RN*7)TXm;J9a`tJHb(^2~Bhl|*+xRG~6)edhu z97R6)WjvrI=zD)hG$eg~6&Mxa_os7aJR|QnPm2Go=nQaLkL5Du(GK+y@)(> z=9b^7j|g3W&3fcNS2H?25ejtaa|oD=AfduTe@p_PM{UO8WM-MBA?UtW455tE%7_5g zS7Pch6!8AS5MDSrQ`k$@E46rbqs*NI8qUnoe}wtLlxLkUMpHd5N>ZqFJ3;*GO=tU1 zh6#LmHxt+t3DaJ7lFX&)xh|JPnvRHDro7#tXGwe2m|BwV=u1(S>Bg(K|Ni-2*4zij z3B-P$I)u|YE38y?S=HVw>!2`bz5p=4+$W+@^5Oaf0>#OkB+6{X*_Fz)%_~QxxxNqJ zp@gJ?cM`Rt(^eTYE~?7%rX?zC+Cd4v>f?YKdVP}wzkS6pASGgsb=nTKEc)(FwXU`T zk>c=E`V+`U&esKHbd?R+g|%L+`0>^5 zBv*kFd?P5q|AJ1{^k2nPIq~7#-q!a)7jGSgv2t=629fN*Cn2J^x^Y6b`S@&d7{MS! zi@acP&Lp;@kw_zT4iI2mb$4g8vO`i$fRA`LHvMGvR}&fxTeEpmX)>-ENsaG`*5{`W z)Q=~hw;4SCq+<2Sedbxvd)Fni9SNajk(`enpJ}6kNYQ5Zy;t)ShllO9O~}W1<#n&v zfN75wYm^mpk5c(jDrtPNvsWnN+pcdo&*R9aE@21vf`kTp+Rp zAELe8odutS%Dun`c2wPTF9EU%a$P@Ww`yLlS@MTr2T>Gu60<;~*z_@a8++%dy*^RP?=f#tTlpe>Wp#0#Eny@}zHne8;>) zh{~X>{S3ZF*}S({>~$)B7J%fwiG*$4hk|(Lu}wq=8(Zu}N9IR|hS8z&c=vyK>m1Tx zmygcG-iJw=81{RT9{*l;P{!KH^)bjA%l8cutbwdCwF$#H1|sYqy!LUk>8VKBAk8H~ z6pWglF#Z6-{Pi><+RhBu_duQ<%OwWHNO2p+M0s2ZW7@6|vgNwNIIKx=bAmfWAK8Z= z>kx*c9){5VzLI@jzV(iiJ)IH_Jg+=S^nSZLD32&q39XDe2=c_5^*F)veKpFh4U}a=**^^fo&r zr}&~&I8yJES+Y>p-o<}}BGxDT`&48l2BUFyB!1Sv&ILXEU+03`yMB5k99K~`PAq9$ zDUL$s)$xILNnawPa=LH@Aq#Q_mL39v!BAfu+uwaW73IiGe5u&ZipBi1*VPbf|E`BRGD7sgj>mPi%9-=*MI1Oc`;S; z{m~e&Qt=3mOoqaUUMcs76CW23M^NdAnTA1qK_8gXwLCmhDL4udMV3Cs5W^X>L={1S z0CjcR5fz5m$DQs)p&HAeb0J&!m^n!?#-o@)2GgYdhsM(17=;gH zuop9yW@56KSR!M-1d@7v*YT(flLS>(m{p-_V)m{{);A?k`z6UVozUCMvZ<`F$}t$Y zF3GLHv9&CCNjp)N6N4sETI7khJ6xLUIx$$57pO2%UYuxBSs@4BL6PdlPQrY4j0dJF zeoPNruJQs$1>1_U#B3>0y=be+r&!vQF$$!)yNPJ=VTdBw5 zy@!*wdJTvs$-`T|_5c{j!rusu)l3KMjAyald^%E$8DiQPeYd{kXBTu4Nr{FbqOcie` z)kYF^E8HD+W0}n7kEVT`y|6o9DxKFE$LYp7remTWPAPd=8rx*mQT|P^%3(Ec3Nccm zTI^`Z>0Pma!m0;(6nDqH&3m10Xw;asD-R!Yok)S*|aMjFuzs~+zy8Jqy ze74~G#`>+7#r9DAXN4Ybaku@sl4lP;e^50V9}l*~?m8}ZQSHwRJ}ZN5-1xwUV#%aW z1UkH~wugiJK`E1c&WRO#K%n4A_f3T2qmh8SJ9L4Zq}?L3fSY>4bu5yOlpPV`&(UrY z3hwUEa1uQCf(Rn*sdZojo{V$mJau~;m+Lt3O$5CNsTL^>oCRJyyn zyQI6jQ%Px%l$2C?FYo`}&-*-M?0tWQHO9Ke{LOiu$I&CS6P_1uU6|sTpTfvvTXRdP zsQOYylipQ;5S}2tT~d^3byc#PYDajnE9s=pZ{SM~(@rpdRc1SM{ODkd1#!OCfp-4iHqSaik^VE}l+gCH8$BqW zyBG5*RdpMYmhD+5nJCri0LuI!j{@m+8Mg{c-OBkR?%t!`F}^jnu5l!>+}a63j?D|0 zEQFeWl(PuGc8vetm~TS#;u%<{Vi`cDIcdFRXOxn{Tqabmf7Q-uglPgqzFGU_xXRPb z`blGr-_DDQS>rz^Y~(pEhdq?%`c~f)J=E1Bc%tDVta;;IHm-XTt@^L&(ML9JhHo9+ z3`bM03Q3CnRn$Cqo=EoV%k`+gt^&gbYY632qa^3Aw=0_S4j=ZGI-u;r= z)fR=%gORsK>GR;2guLG&s!~$+qxG#*;k$T`gpvCbKQ8gxMrHpGcZSt#e>6`AJDYE|=oM~JouB@!p7j15XLPeiDsrDQ z`RPy^`iq#X%LiKxiZZr_cst*D0NkIxLWWd;CaMA2^sEXwm_vYxueue$l^?lKaDO9&pK!C6skZreh_e6`0E zj$4QR+g&NzI0IBSk+jjXeWinVVM^)R(Z;oZ$B6&N&5M_FSLb6#lJPm~3s0F*2Vl#` z^0N?FC?yIR^yo9kS&m1rq-~g&5Sfp~h|@3i3AqA=@$)3GaVlUXeWhI;y3q1A6s*zR zgC8x|vCI`~BJSsLHD z>U}BGTl1u*L_A)ibTGTYPTjI!EqsAYD(+?Mv^8kAW?A{()nUK1gy|uH>hk=G|!!wEcMiCXM`g{O$BFWL`c-_SsJ38uWJon(=$&9xW*L6SIcAbU z5YHie8Nv{=$mlbm>4IPgo5x5~-TFr=>Gp3+s7jIV#Ar%=*-AjNz$l0}5dX=LY)Y~} zmTE&NGnnQe0xe26#{4vz(X^Lal&PD!{v87gG`8X85FQYm~-rD zfTqis7ue|4{$Ld6`-^C>q$hEPelLu^W7$W_1tGh~pI<%DgM{ui>anjC@U|U7bydc^>?k)1OPYR z)4~$2H${IcZaUa@LGo9xTu{c@`h$?Ts_k;giL2xL!Ki)fZ_G=FE+oA4s_tKm>|H&G zc=~<4`!wuleP_J3P8x>(M=0#@xUr#OrW2r77Qx)A;nwS;a*+&~OCRctB8Hz2G4%R6 zkFcH0oR9KOK8qd~d?>3OdUF5QOD}!JJ0?2|T=mL9E0>eu5>M(zWgSf3j%yRuU3`6x z_WSV{-lz=MHnBdA#+A@H13`$#);IyV*TsWDGzB0NOwaX<8Q)-Iz%y@F!k4|>SMiU& z36g(As~lL@pp9(W#NZZh+zOSTxs{94P>tS6a*%1-O?Us{xsn~m>A9AG7I`~b?t*)V z+U5WqI_V_U>^bd4GxkETf@g_gjqw?cT}%?0cU{hk0=9CAc~$#W>ou+ySTO-j{Rr2Z z7}k{hQ~aM_j86KlPTeQ(uYJ+E{+taZeFQOQ<;f24LegGS&5N!9igI7C(e1?N&dW!= zALo#>5zt;YBF*6WZ1JrkQ7&};{5|QtJWId=Uc*TC&(K%E5F*?qg-h)3jjHC0odA_0 zjP3E?k(LvL9t{=UHo-C)>VSTY_7~F3#C^FS&8R*ZB3)-f z94FZSi1RFnC*4FNSR4Nr3If?{h@9jVX}Cax6OrRe-(Sa}1u%r@_`@W}0Hu-8Kf)ec zj%r6?P;Z4GDu8Z_=4^iOaVA%^Z@3v9j^~hAqGQaU%{DD9`H-aQdGyE>2?h{$MIKc_ z=@cx`;oVBFdNvZOh#6QEjYlqW)DtRP8Q3?V%IaThJR6@`a57XY8;aW`)~yV&VC0Ux z+^tD&XD{Hj8-AuQ?vh0HFIK{Tj^}}d6s*j-CcVC6FkTIbn9c4mGCo4hrs(Y6AP9qM zd9g&^a2%2_?=SQhu;Ex{Gegb&7z>3YxWxgxg3G!*0SA4@iq7Zw7kT8KEIW@bVrP|6 z2ow@pE|}HBl~Z!PFca1_OGPRYm0IfdXN!%>bQ#L#$~EdVzR*~d{e){Z8HZpJmnCHf zbdso%kcp8otaTtEqKPXuoeuW~KfYCY?xUNq28 zp(O`Y8btIer~Gfe`02I|pr>UYE!LqdH3W*f9|Fq8C@$xUo71-;;X#sds;<-TgFNDk zf6U|EPf~k=9^`K?3L-89LTPm;JG|fjIBooh#$`x!8?`%K=05q++w0~c0uX1J666Wr z?QeWF0uLH6$6pJ_uX)~c+!*?O8%HzoxuGu3@+E1|nxcSLPIrYcx#i@BPS-7%zLiOM z4GYC72La3JuBNzf{;#j;BZUu`iK6(I7Eq$44j4vam6ZUXLlH@$J6@y1cn6CJh+O5K z3EbvGUa0HrBig(=D_(+mKlI zb$kYVNf9fYH*_Z3pW*-|H&o!@b#}Cph;?iz=bQb!6p%R1O>96o$WDzsu+FmvP7S=z z=MVS{)|DL;hvi9MQsv5PHkXn>tn$vLq8n2=6*k0L(_J%aX+Bb0NDLXSn0%+?2I|+8xXr2Vv9ApI*4bf&qnr^rbc{o=~M@#6(SBp+X z-a7wH7yBP>?A+m!epQ5w&wyQ_n*ek`A<$e?Szi)fOL$kz)_?e-H>LlC>j>*SoU#WZ zs4+gJ>!`v13D>0$sY3>mcr0epS$M}(;)Y%2wujG)2C}6?mf#_pB_lphGJ1~4-a@OZ z`T}_YT?`stYsFUlQn@xwuaT%?xL$zRRy);v6jvtA%`Tw9p%thDNXr-6EN}0Ai}HOo z_I25xse7MnYg!kE*h$Uacsf7w4&^)`rrF7OA{K2^yPd+%2HWifH(oC7Dr)(u+;g$6 zG{J7mzd2;_^iU^OBAvz$)bCC0mYd!Z9UZ?ncHHQ*qmoxu6ONq!%mO&goH*|G9jzq~ z9hnCAXWJv)g0v4SZI?cCc;$GjAMX49Ch^s1AcR8GDCjWlLEpEI8`*wOzR~6Q^SotH z!zME&%l?G?=rvRlgLP=#55I<=EV&wlC#6% z&M&t71>NdRu|>{rHYDf_5#SMwOUb!0Y;xenPJ+apCD8_wB{Ez(5`D=s&s^auTBg<; zi3lFI1+PqFt#?CT7p5?z*`FirDw`)NPNnb_kauTnI_>XfQv4LQ3Vds*SZsp46Y^Rv z^pE2AXL9DL)`{se{6j^42(Z%PARwHP{JT&sOmjP6mCO!&5MhNDW&&krSetj4Gx%9(&c`b!ZS+`8Crd|c^f@$j^;R9Q#`EOjhZG_G?(Ih%=-?|tfK3G;un9N911wVhAMIJEC>rd8G-9jtRTB1|e*wxb@F z+4o@eVpaBT#e$m?Bm~fF1}4l0hunxwYKDvQ(|ILXi`sYwk-f24GVo=;hki?$G#ktdT#DAEkb{MKB_#q0%CSsR6iy3{I&<@jZR<<3sRHD zSJ*1~8CP)I+T-!%)dgEL72}{MSDY4E6<14k&mWN7R|IAauD^NAdI>DOzdjaRamKFw0m9kmqq@%9-I9m_G9Kc^N$SvHXb6!uZzhij}aiyzrq<-aC7njH>dh; z3Dg+~3cmk331d@0&Yr`^-+BEHND4SeB&VNVssZ;*aRiziJ_>O;RE0BH5{Dwnj~Wid zV9Zj4iH?j+fYZ!T+(}~3{fQ1FX1H{I%@QjAKp}vm6vV9vEF|X-<;GmFc zLk6&Iz|D!|FQ?g`j3p29KR+y}>OP>6dCBhoWHjZu=8w3nA70;|BC}3Kekkd~n!EBy?(Df2pzCePyHH>~gr& z9wxxi-R|Yn@mo|de7#i%^Uz{hkZr5$EuFG>8)?4ZWR_F#z!{0XR;YNA!}=Q?gB(fpq?q4Vvvw6G}Ee6hEJWPVXgot^w?4-YZhtEy%?catp>Lw1SYRNlTygxCp3CmHzyNaNeg5X($k zitR#KGDOzz**wH=_TqzofabWvAM&E?=mBVVQPu&p6n7$C_YHD!?#OUy8K&G6H^?i6 z#&Fgh_!1Q7M1l)di9pwzvPv-Wl|#O~VUui9;$|&r{m)WX^r*akHT1BiRb=a^DqRMv z>vOM~GMk(PFx5!X=9m3w`BJxB+31_{{)fcj*L$DVlODFjHi_)NPKQ^3Wq*Emf6{(~ z>-DJfpFyKClq+e!2a_OlC4?Bcx{KJb3@y?;#1c zyd%2BZO;81o!Bl0G#|w-h8TdlT~hSIt9p{hUCaebCeF5QLb34(WmaNT%ynFLYiwxV zhz-^Nk(l-{P+T+>bndG*_SfX(UZBAGF9mk@TDd@XUc%6CHS*^gmDEc+w>{E{<>dl@S6G<$iZ%j^`-`sECebiB=HP4 z{+#TJQo_L2b5#GzC#n6H1^15Nm?;fk%BXoEUlztV;5R~h;0j>hrDPi#kfN}_$UnS3 zZvCbzwXd!4ca633TQ`l=_54Di3LTUQ&kz4+&-6b`nbE*|V*;kk!RQUYAUtfvc%fX= zeoQhR!n*#LJl`l<3_uz=g;EA!Q5O1~^IJI2_Ck6Imo@u?O@}y@ATz_*Q zgVj0o8%xspZhudbLqq2xaHW?e0!@_Tj&qLkDW_q3(%l^jy9ay&D-f^qWgD60x7KKS zWmKvr-tN&90vAiMDW})N+6v%GCG^v>zZ|6{5L-{6o3qPjlIEuLhAqY+mWgyYUziAK zDhIS~zoovlf%#$4;&$CQ`HmzJJ-Gf66G1%qQe`zi(cbE`y^$g+_>t!K+oR4!mup<3 z=3l#)IYC|CuxXHNy2BwJ_r(e|@9|?i1twbMZ;+k<(gV$|KuQ3zb%gOOKqc|zgy^^) z`TCm#3Og<21YuypP5E)9JYbB?`r$aeW5}1m)5lj>% z2(e1`uO||;2#LEB^*AjEO^2Ta5KC$T6KxpEp1(yRveP1i2AU6xrHXl~B1-C;%94UK z!-0^6bm}kGjG4j}))SffSJu(#+!4aj8SX8~Oo_oA%?Vi!h$AuCR!XUH%-Oz5(FFOi zORFUi#9UTr3)nLi=i)wSf)HnJ3u{^B0a6)r-UL`Nm4S%+7u~R9j3t5PipDie;vY@h&W*>-`=xputvkF}4sC~# zdO8%p&Xw`mLEjTFY}o)JtTPi-ICS|}PBHPTjK}(jt`AQn5CO3s4~<^`um@YTT(*x; z!#2F%`d8Z70F`?>_Yf?Ks(P47uiUwd-MxHh6l?Gq?>O^XIZwC91yxP&(=_%O)MpN- zgR{@+0ck{0)8OrU5A%pYxW3Ey_`DGp>m4eG)%Bp-Rzlk6or5jpz6)G2l`?(nB=FJGDK*FnEoRsGdy*yZqDme*FteOnTgko+=^ zPMzUqtBMHo*9Dh45rS=x`oet2wKx5Ti?X%f=UO2kzKQaHwT`f8)rEY{>2s-P{D*3x z6CKIX_pl6#grWZQp1|J+XKWamP9YirQ;i8iyn&)v+(pD2?f1tf2lCdm>xOP4=qcO> zwB5-3VW^VuSAaAkixkAzlfxSvY)ULUBfW~q6D$q)A&64IXW)#1s(R%b=L^aDYVx>h z$w-mZzm|c&iwRNnhmn`uh|?N6Md-Qa5pFEV2rI=zp4M(s*McNx2SK7OaUsj z5fjCpgMp&%r}T<2K;%Ure`uC4GngyW?j?d^>x-l%p|PA?Z^RRqKI^ z^nB&-JZJkV-YpvGr|dT@H&nfe5=r%# z7cpd-emD&FT$R71#zZM$+Ei{#5Z5K*v4=4wO|8%Hae(fS)gr`cg@~cg3Oa zSBBU2ZgGMbFs(sC!<>{nZ&vr4zE>VZ^}g6WER#8*^`!y;MtF~<_+j0AF4@`$% ztc&hO(h!p1n2+gDk62%10qsvdXNn4h0oWkxDfz`;TSamL;OE(xa~B97v8%sO!{+W8 ziun(So~5D2G>mJ2tT!AM>tPltQaYC#2D!bVm*dB@hQ)~1ESQDk7?>0!;2`D{BvJsJ ztc9{aIU}oiuKHAhHg6q6lHnVK!er%mYevb}hA}&-b}h|h=}w8BjH&MSDc{pfM{d6- z_|)t(-mX}N^Va?Z$>fXPs z!SMzOrzHV^pV#uns;u9Ny^n9s@=vpG-fa=BY`{S=t!i)HPIHh%y|j^#WiS2_sQ2M?$np_FSpLV@OwPhnCefv)cxizZ3LmY z;qrfQwq1Qk)YrI{hQN748bE1CzWJVO%wr4t39jegIB0W6k|?Lg_9bh_DQj__{lI}` z{D+zTe;A7JZW__UirI;nq@OJzBX)oEMij^yDaI$4nD!Hp z@mMY7}8{m6(pZOJf!BrlTPa7@V8Y%uDzOeFuX26QBzRj0upov-j& z>SN)}v65P=$t>1I^tU>imW=rVNe6Z7@l12s>?J*Qp)Xk`Dhy^t>ifPDRy8_QOr(k? zL2Fyx6@3@5q$-Sj?7sEvFeLq8Z}mvo-?^W6Snu|?pb!`1t~T}cx))Hr_i!|62|nXo zZB22}8_GI-r7ETie)7*I?kV4PszR0-6%H2L-={gOS-lmY6cj@+NO9g4;MD2QF$*;sZ=3#I4oAQjr|Bxj|3lUi7 zKUOF#fJccVVeH7OQ|MS|Y4N7)#PQ+?Pl0c?J+0(7k4r34UStaIB*DFni!vaJpj^r; z!qA`fF_wQUyBEQnKsjZEh>*n2eBBwIMDmf9^oL25CD)n+@&`{IamqKJ3}|PTk0oP+o{{ zyuLFbbKXi30y|dMIH37KYsVlQUYLsXph^X0DPuPq@2T!GK2AYplI zwGXboXM5OcTaD8o3>%Ng8Q*q_O~>pHmmPOtBC4^wish7!38YKx7@aK z2*y_11zZL88~!F}BJQ-W%u($83CH9w37}b?x}3YW_dbobs``C4{C>^rX8O62_tAV& z*6*uhu7^JtXUb0>mY#IeoSn`;x%R>PuoY*tMWyA7n)t~TG1wULTRj}}RWuxVXdR&g zFn;d(otzxkk?EMaF-rS=N#Vh$f(zYTUeP|d{>B)66G{(%7ufP}- zx6lY(kS5kKkf}Te(_umCf$D{?H<(Ns2iwPoHbR|01(MY7^))AOBdDjt5G#WFIh?Ec zpNAWh-Al+m81sZ#9_6ldGz|zO?nYSp2ZqDteQ|+b=Oys#AWIHO{0blp&W9+bcPYpv z21b1Z%>6Po1?fA6m{7O^J#{m=0w|Zpvv1Q8H4mwXt2@UWAuzKEE6F6*#1z%(v1+l5 zD95VD6>cj^Ap94;@qZE3pdd19CYP8<`~M@Vaio(DN@0GpQalYq2qy!EnhO3QIqq1i|LeQ``>Sx;-x$JNz*UgU|!{+L4N+kHkM;IO;0IEz1( zEgeSlGTW7KJDk4>bsk`)56)uC4Bb!#iv$W8Nca`j4GPQInzPzim(NA_6R(+!P z_++&~?>C`sS29n=psSE#BKB3F#VFk3bz;tRpw(mqwRGmQ=6#DXdO?@M8*4_)Z$DnDnDMyW+5+<;T!KhG^gB z0439dmTF70%ie5>UR|WYd-oIcZc$P356zx?)3aJk!B5`LUoU#0(RdFp&QpEZXQ*A1 z_}zS+`Kg~kVby$h<5TvB!?XF-k9e@{;UL;n`psba2GiV-Hj``^szpIAFXtI&sdb*mU*vN9D-rdaKtliG!f?Xv;-Xjzg3tMlP;<51xHikfYa!^37IADg4P@HxFI+MC_96VzYlSlvJkmfzo{OJ?@D zn;59Uu&_I`|Ej^tsz4+ViyMMO1dz*kf=2)$!p95TqDJ9o3J}t^vtDA4G3O!r6TS0( za=f-`9`;sj=RTe-y)#tCc`!W)3y$&fD$slLZ~(=kny{KQPL*Va<~PL=U3dk5mx`#0 z+MN1xmFO>8MdgoqmEC{yFPKKzJ^pG{^zCx#MdK6vMMoQs#(89)2ZP9ONE;dFO#Y)JDAA}BIjnG)5C*t;@s{I=t;%;h6x#?C==GW?T?Y}6V|Lt@x#V@+O-Mg|@)O@6s{Ja)6^KDP!k>#ve$O+yy*uKgy3D=q zI53F%@Uxco&$(d7`A;ry1lzTXRV^fBT|A#Fy?&&h-@7g(9lZ(R>zC|8Pme7e{cyI| zkRQ+_BEV+=7u*lqLMVblHIGoJ&qUH5AVj3hQ6(UzNT-3xpSGLv1L4VZICja>)P(s# z;xY>O0SYqo>W~mc&0HLZg+6Mjvmgz)DS@853>j+-ww|piL)(HhH|mS?^jQN>H^cQ_bw9orvJhrn= z-+oy_dp*Z3-^9WGb$$b#IsSj2J^`MfbREp=ozQO-r z_6=z=LFY?m`h38!MM>@R;Vn=KCeZ8fS5#vhPZe+hZ=Z$*b2bMpc0}`8v5KCO6R+$( zap_c&=3`xz)R)kr+H`JH?N*Y!ks5f>P=Za4y+ISg6!?H@;OK7jz?dkonMX2ge{


$CC3^PX;n0`mc^xWZbrnGQuA_E(nB>Hb#gwpT~@4v!g(#Fw;}|0gEu2_e(p_2Nn#2^V`M3;VX@dOiv)3!xEKYL>Z-y^pf=7Eo-E-XATTh;sX_XZ49F5&aoVCSwi@W$|lZ$isK zVCaO@VSz*B-S;w$$os>>6I>D1fBCy9L_-7p(3Dxg9c!b^7X{}Za9@AeBLYT!?U9Y% zFd`Q4cXQ5`!=@4y=_8v_8%`p7UU)gg3m;3vw{XtKm|>hqO7}(ePAPx=LS7-JN4w>c zNi8Qmm_j8{lSP9}Raq)R*O~Q8saCZmb@R*8>C(uaNCvDgM=w5W%_BL=CE5G6;^^*w z(c_LX>NG(LIuogMG`~_ah<}qpgR&X@5Ai^ed<*?`m7( zy(Nj5#~bi%MlQ%Glv>w6JfW&*UvS4|GZFaoFouKTT$X+)#%Sd@+w&rm2rD-wvM}xK zA+*NoY39n1^XNpD-h(Ym#@*YaB}vEUf4m($(57T@^9_G{z57Yh`o3{U%*!hYGVN|C zcwJFM^>O`HF!T9Eij~nj(j596f6@w*oPgGiY&u+L$+@ARh$gz+U?TO`(*b0<4Rk@& zgb>qU`j!_kkw>}78-W}x=%(P-s=XB;_$GNvg6mvpD~jbu{bn>$`^^lRniR`OyoOuy zc)}uaUmmf((wTWYt(s1OzP6>}6e!}87bNFuhZH38xb0gg8V9lzrfKyE=cc200@s5z zBsCDvpX3d*a4>9Sn=YJJNi8oNBm}bqUmZy2hT>xE(?vXlbJ zGnBE{5(|OPr5V-twlxcudNZ}Hj-us_Uwpyz(UFREREO^sX4}NY00M)g2>==W1Rzm0 z+#t4Sa@oY#q4fhRVO6sC=Z6k>2w2ZPccZhV%XHv8#XftEgy$90jizVAGjRWg%BhQp zRKL0hE_!q_OrrAf9xm@8Jb0em6CCDH)a0UIVw%W<3E-Pn%5&aEg zMu4q?Z#D)2r+!X@2mt=Lj>q_Bb@71A*(o|#fMu=@$Q`=+s0FcHYokZMxw~XHu66(< zsvzd4Jhf;9f1-);jTQ6krp?z?<5$bkqfgwwd3 z^P8L22jSfmG)^JOjQ5cqpyhV#vG16r+I)~?^&{*so%E0Jab8(O>vAlz-@BdW@*kq7 zpWVg1_PBPyiOb47%Nu89{!`2eqyW}&;{i@wusx>pp}Rw^kKVXT4r{-!Q$Y2K^*`0C zq)YK%XNQ^BoJbu$E8xVXoOO5ez2mU|1RE(oYwbv|w*;R*ptfb9 z@C-?W{i;G{mf4UE?Uo{`{6WU;zd>dx6!_Qmpa=R_L|wfQTW&NK%^cZK-MyYspd;mP zqr-jM6hLz~_3;GD6z!ElA1O^t;A2e~QQAT;tx`-VN1Z8lb#Wh;?R1C<5v3e!_ka?9 zH5p2dKh=(Qun39NBagm3{XV(C#|>u@PU-XvM;?P>rKVAD+7u|iDfCH9#6$;*ZR_6b z$qOLGLVc<7sp&(8GG4~UaJa&$1+9mYApbkjUT6vsLxcda8NJJ2n&>G^&Q&G`CjE*` zCuE_C0Bm!xr9(lxgAO+kk51{=i)mPQIE8TN4Z3>1iVvJRSxk|8M=6nm%Q9X#Zg)IQ z*gei z=y{yEEiWH4FV84& zDmEHJb~q=_Z>#sJ^Vx{RaolT7CnF4q_Ej`krB>M7`2B^a*kKj_t0n z=9B&I=W2%!R+j!RkMp#@u0$(B@0Op33qEK`R86gCCjz}uOwS!feqJm@6tAsjt~+f9 zu?((w?I^m_AQ8fop>DhU3)zkaGGuf(#52(o0i+^72LdTq&DU@j{gZJB;IYN)zU{&{ z>qdm&?jA_q&}R}P;LW@l%s}Xr3&Ac$Hwk;Bi=G$A_wMytgz$lfX%y}sW|L^{LTPxA zoNADHq$qDQOozh_aVMIWL}x1o#>g^}VwIc6D3V#XxcdUmvrYVhWX>89-DA_bH}ky! z=!1UDP1#Mg?+BTbbZ(F-%J4iGF2eaF$6738Q=`M29!$tz^vrE_5v+9ND2lTaNDeRx zQ5kfnbKeSJA{FOGK7?A9B+-C$Q>gREUQyJ*!S_d9NbmbT%OjYSS7YyIm)DrQd^Axz zxeD*En?+?~uO0*rk(x1q_e6EmOEPx#UkUYW8;1XW7p*IaR@Q4Jr*Yu#bGBBhtOss! z){9*(b4eOPs7~9*NsJv4d*SKa(lz|-Skiy~h(>oI6X|~eZFSr^dP2;)lTV@xx zlgzd{uOi4U^5}~J*sN;Zq8}Dvh_zkXwb8CAy@s^Hm4b$)dnBqn^Z%Z zV(J>doE0>b!CGkSn)x4|dnpL_p|u&R0@xpMO33CnuWf9IJYvRuFK zzPhYkZ6>weetGW2+GTX>T-|vo>EOMBZhS??+nEMEWuybdW?`_+VcqhhB@RRn@ChPJ zj0XPp9L$&6l4<%=j1()zXu=3R_>oioOhAz6z91FTrUvK1?#6zw*6t;U#Sda$p~Gso zk~}lv4wNp>;SCR#7K6VCA>T7m_&^p5m8%XGl*z@dPWHJYfcTgzm{F8<0s0p__)V}G z75S#Wh=>W6N1xfF_HKEHg^j3>{96)J#d5rL(-Fu%c~oB{r07)PG&xBMyFPq+MAA5)LZN;xvJaP7)Fvg%yz8juwUZY9#gn6FV@+usa6QlIjnWk&s0X7H!yF$k7$&` z^=desog)3qau&H5#(o?8Kw3p9h5*}}UeAIExDmDzrOz0*C*)YI`~B`jGp69910So z*r|JTp>(ARFeSq|?L056{_MQSxJ3{8NQ~nldQmIpWHIFR)5~u!eFwD9MA^v9c;~z+H-~b~2P16E9Rng|pBr}pvKjKb#kOL6 z^UhYP(A)-7!N-+SLCVsfl2bnFZ|bQsA4qYQ0HvvEGgY#(IV!uXlI_Uy(7y3BRJ00E zn$k`hs6ZNB67Wk1+JEA@a&Ll~f<=v$ z4wrpO=N)EmW#=7Z94+S^MrL3ioDePBtYs~MP`eVz5Jm9yoSm;+OiJMyxDv^K2XF3E z&ZBPVw~V*DlCUmoZcEtLJd)@jdCOM7JLX z5r6nD=W5zJ(mXq=n~Lq>Kn^CFvc;373CE{c`Ru9L{_|B4LjtDN33khZ()(YJbKOsz zx_qL@#Cvipwgxc-^g5{Ajuz`38b{hi<4@MQ2MM@T@jcId#?nL|vQ*NtFZTt?^g1&Q zM4h%)6N211eY`H0=iH6lr$2~#ZJ+a4#V|ucH-~-DbmM1LB=$kX8lvO2C;`<(M?xYq z6*BfgXH)3I%@<`aRyB zUeMK!A80+HI2>rRrwSNtZ|cjg>e$Up<7_=9ggCU-&*+_~-0ZeGVE<-~t!zPP75xm_ zS79eT*w?@yA*O)M)qkPu#WjHAKvn(sn~A4~lq-B}l#57abc|1rcyL_sBij_A*!9tc z3iqHG{`g}ef0qf7`|?Xd2{aDAX#v^_J_O|lTaBq9F%_3Nq2~r~CslgO-%cY_QwPl( z@!4qz+tzw(P&)R4#4^X+HzYcbt#6~N@7EsY8kPn6Ij-m2)-nX?ysq1?)*P_J0nvv( zvuQ0H?T65Yn|!7RSA63)kCiB^4>!AlF{Um1kQ5Mp`3Gb6vd>T!y>9ly*m0v?{LqgO z^Yzw~fJU{u{d|ysVfhcnY@P<`M>A0$z?fO#|2i$A?0k2w(8bw$F)3Xo3NU6yLRZCj zu43oI?`cJErfB*8{Ma#idMzROmtR^2_@xXWV$Baw&*Wr|s7N4UecUC1+Op|WnVk0L zN)Z3yH`k|ls4*g5aTkif6fS=F`Wzz}owzeVz0 zK|XEaEb^EwkNmcH;OQ%#XeYQib${?+^j=KN2XlJp8riV0DsQ+TogeTZ$4CHXMZbat z&s>+%tK2E=)!+g_bUr0@!tMBCO$#=I5Xrw7vwC(0&X>(21|2o8YSJzA-zcJ*WX2}9 zYWDKHjCZztUzF&YM5&f4?X zl~K}ywN7MYtPhG!+y;FikHXAX{u(6wwkQV5Jug-#-q54ra$NJ8R_B@yG8X5#*$q5* z{$ALf7PxHz$|>;x02#M6*vfJeSm5chSc|sQ(XMsU$CU z!**}9uN@iY?k8(We57~=nx4zw-xf{Mq`yBqc{apELqbceovkvvA5Dady&0W^jvv}J z=1(*-KaNZG13wmA?c>*dam2~!0v?SdkYf&Jm{-vV5)NR&E z)Ftd=P%%s-vBWfs)!9wZvAW|GSgX zJ0RT?Kr|^SpfFF}PkKx!(^r%gNdHENPDP1DG0C*F1T`IXpQTtP{6UFTvhdvtYfw(n z)h$BqrZ_AvNPTx$(A?0nU6wsUF@rkBs~ioRk{ay=?}K$5@q(#dSHm*y<}q}|e!09B zS(c5XUQAnAyHJ*+3*9raF!3WFT@xcYxF(&|hE_bqq;UPK?!Q#>(1LRrd+9Pa5N4#Ua zlkCpp9C6_;6Qn29zQrBI1UH0>vlwi!bxqe@@%_9bYcIn0+vC|LRVe(YS1K@uYFhZP|Qe zGn|j6Yby$wzIhu`0jQgF1z@?m>iQ#sE!&UtnngFhvLCZJZ{jgaL?f=}b{w+C?M|6_ zhbJp&?6=V^1zo|OdTx-8aV3n(Ou30>-~Ni?R$kEowQHUF3M=>erR?4Dlzs( z-d}q_VCF-_{p_?WYV-%686V{j*QcNK*^pUzNd#@~4`lg95J8Ww-v$;wbUuNYFPXzh zFzMk@!6w+GlD)EZAW%)U0Z|DiCMGlwV0Wd%KDM|CrdYxc;+UdC^YkF5#f1bN2CbAC!NJsvhm1?oY=QG$g~S9u;u}zSe-1%y1|A zt!6$xw+_YAKW8x+a5DI-<`Mm-nS{DlMLGb0WLlWP=mfMMf^KEQ(%6J(4+i#TDJ=-22B6&iQb;?s#xF@xZA2pJFTnL@NlZ#V&iX`Kg8-mnklKC}62-tDMx zxNLfQit|oSBArQWx@V20d?M5(a%ET}=mj;3H!gf2Ub|aFEr(=VDnVJ293UZ=N5-~a z)Z&FF&y^^}jeUbgGp_B_T+ z-kRyQJSiL>bvx1XrRB9E>DP%LM$eWsBa7(H51TFGE14iBim;jgX6jBak=C#~p7As& zQliCGZVvFyK19d?_C3V@WAU^M%zw>~}ZDEOh6BrU4|m#ks!nPJn((5UOAj zLQ)9bj+Q3L?~al0nD2_kiGE2U*GE1d5rVF1U63GSX$_C1U>?qoW0bX~O3*S)VTjR# z?eD}ITfz%%%@cKYQe+AHERu|P7R?Rp69o$coJ|$2Fs&I=z9)G}?K7o+LJgIWw3Y!o z_;~eq{RK&=Wb1tC&Z#eivVAd2@)LAJ_aCL6&y^IB1+cP8#;QK(9+VUpzMCnX^g1{w zj!8T~u4q_oDXq+r0^sLXcLbQ-DjE>~Ui-&Iuqt4)>Xht& z1}Q4vxXRjU+q4y{XJ5Yun77YYrPl46DEq)!j%c)$6$H3-0B3FWw-K z%jawAJJlX%N?2V5aR{iJARX9LuDXHG*w;m>M@nexJ`2RK^83C4KL zWX=Wo^PY{2lYa--E?#M>x^dR6mGf!nHMD+?S;MUU3l7?0_g6hD{>NWPj3VBCEph(# zSkCBLt$x8g$*y7EsLK28a%$@T$JbkURsF5&+jMs~i|+33?odDw=@Mxv>F$=!MYn`> zcT1^+(yh|1$UFJ&arSSVvCq5zhqdNs&gZ%B>-q)zO>a^{@H^k~V_q^#5Hgi8UKqX; z9(q)hb`nJ#pJ^>m61iT|MjEk`w_-G#ruKFMGC4R9bvWC0l_~OXw{oSZ?slN?poJGz zyw-MCKY7xgNz--eLh$Mj@fcm=*m;yV(1a)e1sTmE{`}X}U4uS9x4GN#^0A4;f4y%dz?S;v$Y}}X&;GGR(x_ie^T9iaS zyQRT-HYQ6ua2lneza^cyG<19RAyOA;LSA|+klMILi+F6w7lIQIYc57{$O3OJYLF}C z1LXafCDq4%r8nQU5(CvYNWcjg!VhpIj^qSq6{D(`bBRG+;Sf|2Bstnf)R><%bXT`y z%BpUDX*E02oY5+c94U}^4=ZX35f#}Nc*$=jbN7(&LSB4Hfp6P^VH*_+GQH-d^9Hz* zP=?8nrStUmZ>48`cWQAc?wKvDj4}zNAtpz>DX3O^FhO_f7B(}Pqs?W!vE>?0XbU;z zIX1$n(Hf?_3%Rqo|BrX}pIIm2*(@+*f|oaL{q>- zYN$k0g)W<6FnI8WK9y$-<$G+kgrW3@@%Z3wQ2!9+(l4A@50Q|G1?U&L>Dg?<2cpfDQs`mg2u1ywA_g?(P z9bLM-gAZMX+WcqwOdYJSp=@P(`GFi~w;`ZQVr(7;j(PbpFxWpVk>&!9d0EF66`WjG zCwbdE1dw$CdU>Bc=@2Yc?II^y)_tg_Xq9bA0G|FKdRSu?OK#5mGE08JIVo%D`-t4A z(Hie1^XghYC;8VP>6~1x_)nJ(6>*iVVR)XEJt~cV^`|PIyx5>>p8jgI-;CsBa`S?l z)vu37)@rED^SYq9znnr|+x{8)qo(7#(`Btu(xS05=j|5TI_)1$+4}CJo$7kuhkG`n zK3Mc8L)Z$N3n%&oIvpB8vG(LJF`b$=xc`~Nj=;MDZ9D`S(m2YHV{$g8`ESk`!vA)M zq5@+>k{JM%qR$&DZv(PUJ*{GmTr#Z;3<=NkrM8B`(L_XCM*6W2n}g_hOwViFdFWsg zC}k!vSafLyQ<*^*RAhEn?MYfgu-vyNo6GX*mtz*L4Puc@G?~C1_u+g#XPzvBcI|5c zO0#}ZasptqO^3z*ErNk}oG zlz5$B_el|?nczgaQt)N47&uk5)0Fcu8@G^=4ChutHFop7FYtvsG2jb# zowMRI_Q9c7*O)Fku+=FYpy}54gb>txfZ&2f`50q$jnY)e#gC@J35ObNU~J%MT17I( z;XR;*@9+5Gv{BdDIYeIHhOlH-kBQh`RNte2sW#km|Ig&7r!%|E62Krt06w_ z*!$|n`TGb$1K9Nlh>)&R5#aa28Ka{fI}bkS7`uoi7;5Js(AScY>4le?Jsl!1kUO8? zI}yK}cXxWYLas8VdP_E)7RGCT%911i?*%AhNj1V8~jB zQd~k%+Jy%2vT^*d<2KNYmIg2eW<#m@3sD~N?FR9&=)=VvH(~tRWFRvx-U94JxQHP` zgsjQYJU`836qN^%LJ|?p5G)x+gcaXp>X0MqM38;H1@2HCMg_2mLWPEleo2ni{bNC5 zBt60lkYlg)BgofL@I+=@!J^5MpgXfm;=CczR-R4ha!kC#J`Za zG2&(f@B8-mCLyjF-3T_^#>)Tdg6=5tk+&<^o$F@z;MfQxMyrQd>E&pj9XHvLb|9QS6rZC)0e?a~-tDr8x_d(&6EYu~;^D*ihFO)aYCh??M+xM= z;C+N=qhvy70MT(Mi6$bFWJx*gwhB5Ni-2jrC=9h!dNL`B+sSVZMC3vgbI10elLn+h zWaqa!Pdoo7i#;CgWI7ke$Twy8A+Yn;5Z$gkx799!x1K5SS+tqYW6o*xd*RBgRP_we zfuy=9+o(yEuHqSa?Hm3i#;uW$@)?{mB;IGwmpX-N3>$6dvP~wxaG10+9<5Mj8gQ+n z1;8e8kPCB|w>qQJYS!F3ZI32BXkwX6pTC%j++}Uq5#c%*D`vy)aWv%H`dmwS5wGsT zyW6xEg6t*z4OZEHEIHI;=$npC(iD`hNjmRdW4$CCn=3%Py?J-K0RJ&fvb!VvM?>&y zE~nhWn-hc_F=Vl%uDc7t2IMbJ3H~=b8$3*={`23xhJ#UPQBs^m<~AXeL-Hg=YMfyI zq_M*zhXYIDmbnp$uK8sn6i?F|jM7)qHX|tUPR&DTQUsu(40v)hF(fIY7Li=6OF2>W z5-8@;LN79lJ;Z#Mwh4I>1h$j#h_ax{Y*>r5uoh325D4XFX$A(BN18ru8p{BK9n^<` z$gyR4FWtrSZWq^_jK56XCO>PB;dRF$W3KVUopqk#w|1TUcjwE{f!zdTK8jBai_py|8&x_iGcl6&a3I2>>qqxlJL4! zRgL$oHI2SHpvLjM^haIyUo`gWS}btVjxtvNZ0x>Q#rZ%kEyj+$K&6)OQHf(!y#?YA zt?Lky0VnNFi2P8Oe3)f@cl=Hcm(2ZMCugT%H>jGz&l#U|Z(gpV^gjIktC2%4HbM^5;n}IX3&*C`zPw(tt$sH(nVA;KordTQuQokKCzgn&APF zBu?q=E%#5Hz2ZqzeE3!u(_fB%Ue59$a9qwR+`#b7^K->FEr?@t2rNE(#o_)%(0Tfb zMmtdB?VJUZ#O!=o=JeYY897WmJa0N!JOaQl`#!oJm@3x4flm=Wu~~sp)VAfd-|e-o z4MWxTF^o6>AD9#+<+r`1)>?P`Q8e2&qh9xj$bifs&Q7u#=lwuD0FtEt+5&cM1~@@^N~L-PK8b#KqfuU==rKU?JR4^v9rmv;=vC{z794q&`q zw-sC+6pFxrlA;ezTDY-7m>970UmJplAedj{RrKZX&j#b2`7R&cN3hn-h)Vc+Tku6n~44>gR}@dVRG_jxH`Ae^sIB?q>fwo zGRhH84>=;b3ixMLmGC%?%NyNQ&_&f;>aqZHU zWL}`xF#upDj=_{CnM#&FlQGOL=^*gYiUKPo@lN7aw1oDfilT0b$pqWIk0SS!9xY{dL zn#=+EJ^Hw4b!*-Qt{FcY?oyFyIao#O{j|iq38mUgqIm z?aRZHWd;3DmE=GB`A>+nP{cuIeM9c7K`RtGRbU?3kc~i~maQ3UupEjtCzHHXZls4v zqNU6>F~YSTNoHpv%M#%$8)X-6$}BNjU>waARXgY3y0D$e6OVn45R+D>8>5bDnk7mY z^$bGUY4=OE=JnSQjDd)FW~k$Glzz48bjRl(1|b%swEXXg%vab98r;53eCAkcvpR%o z`hGrXJ&`WD{%A&{8Ke*!kzKt@zy zh%6E?D5;>G%a{RFNySDO5>eVvgo?f)$Z`4twGwT@n0fSLauigTq4@wBTLx0pfjnS` zufny*yd9?nx+5wgJ#ED-{P$6oNgP;4CGkqMl~#$0&poEo^y-A?Pz^0e0Z0D@DbU!{ z4($q<2B7Yxo1{nMWHJ@1lx8D0uvjp7Jcnaad%NOOuHth%ZkuPC0uX6d1ga5QNc7pv zN-uz4Ogl#dLYl0yC~^h#O$p7jS!9z_`dCV1OphwcLi3O8ORFS5zR^Sw-5e zZAJV}d(468KcRzk0IlX|4faFll-W*EOKK+s2uPKmEkB&vw$ssHcVE{{)^_%vveorg z!sR-t_&jeM9mICOti&hKqnM*3v7BAaXIv7U|bCg7WWo7ySQzcOj!t2y3Uwgeu}OIs#c}LZq;ra+)__@ZbZ7 z&Whc5vQlE!|MWSbpwGGV)aT>}eNMZlK4-#z>2tkPrbFPIX64i!L8xAt*7*(| z``A<1HF)GLHsG1HgY-DEyprV0J2&c${+mZ}+5A6RA=&fgN*y)+?_f@0lS(9aQy$dN z&iApo@@;)Cn2XBu8Gp97s{5TYd|mawJuHU_l#IJs_kqV$hG-yBk*ot}_Q6Kz9~DEY za5y8w!gnZcZ5#g7vdpwW$fy--(I;;zAkI{xD3b}|=gcFCQYmyLNy#c^B?y`v&-zmc zxwlJFiR4Kc%p~AQcanApe5_K0d6sulr<6rXji0@UwoVVBjJDEJ*PiA5&Y6Qq=(l8YAECf789NHd)tmdQN}L^fx<}tOIU;m80{GJOz);qP_`_in3L%YZU_F zM#E@mnE2Qzm74gOG|?;dBp_F2#~DYA66YOfY?X1HAZY@=2>MA3_h}*H+@=vRY?!7` z{5cfO6Yvdj@^ebD7$6ltDJ6_6^GWxUxG5vUx5Or$5+bhCEpW`q?Ok|9QN6@TH54X+M6L|MiOd zdiTwg5SQeoOPbaL{lTl=p6iM}Ekzu#Y`;|=2!?Yj#6gjVsI-9Fz{+N@r*Jp|gB|E| z&cc&SnISz8OT!8#1|g{z!lBMfBg?vk5HuI^0Hqq1r%Mn5&jzeQTOXb*cL=loCYn*3 z%r7)g++KpGORp;lj#}*ud_|IiZUt;O-gt> zv`YDDV|eKo51#+!w)BiLj!YRe-if`0;?QnXOc2jAF>Z$%KT1)?qA`hdX@^2=d{|49 zF3lg@G2rc0WgX6wa)-!OB$x0>-GU$!U|^b;5@f;H$5N=w$ecT%mVb+vIiQck6aRD@ z;Pcc3^D!vPbUw*Nri9KO@4I>RR69M$w_F>Z>MZrXC@x}po>1{!)NYS!E2P_88QSZ1 zg-_%wGJ+>@`{L8upX@{#3hsAoY5$;VpP_o>BNFb(TvX16uYD+Le#b1~Y^#+IX@+7b zXh@^-YKOQj7T%Op$jUjS{QHjZpLVi;FsfL1qJ4cyG&zyj*l2#z$+SVS#0(DK?6kr2 ziUgvVW;jQy2t%Rgbcw=Sq8!gaohx72Xd{yjQD_V{ax0rIfO8dG9B+bZy;n-1Vqq?_ z*K^k{a?74jNqtsL+-QS2{GLt5)T|$lu)>2yrd+EyyZFUb6=SV&XT&{O`d33(>n!NA z&h)BPfbN;0H2iwJ)Ma~9W&NA@7_r}Da7{rRrxu|n?z?D&dfV}Lw!-=}0kPRs`vni( zg}ZlkZ(rMgFuxHuD)M|2qVBejHBEkb5K^vFZS(8i#Bo{Cezh*hSSWR^D-a*!Smny0 zbvT~7Al_BvA{daRA8#~_Aa8#Ry`;_pyL7F#JA%eqi@Ab^RM&pAQY8-pO-VIP2?ABMLu8!}6pOmXGaq;T zpubwaF>cnjdI``u@qGd@rYBbPbjNZ@tkcIY7L&ia3jENI4YyNXAM+jK^*ePQ50E3b zEYEk=cB_Pm9ryg{`0d;ahY!g4*R1TEgAbAv++BEDCeFjRoL$Z%Kd+5(1enWndGXkr zfaZ&9op5l9hX8;nyeezlK}nt>Xo`P5?!r*CdWsKE@==^R zw%RYg&l>A~#HePeE?-|VrM+z7v@3q82kNGnY0I|dwUaC6oj}3p_Nf+c)${QY;Re-b z0n>9`@PV>TUW7hhm^4mk?Upo2&NLM-P0tjEIWu&te=mo)d1zmapyYNdL5!+>hxM70 zh)mY&nRev-P)=Z}%?Y^Qsd|-v_u~UTg6{!Be7@YT#PxjNGdzCR0`t-9o&%Tsrg zF6Qv`U40cR>b}b0+9@v9V{u&1bw||wSE|$6c?<}d|2uXUf^|wNZO~6FUI~HpV8Z?Vyj?yYE zi{~JZ&Ma@f&YjthSvL?$tzUqmWH`W)%N_p0kOuwbtt@uP)B34M{>&v)uCoCUz{57N z6-b82%d{g&)S=kcC;(oj6D}PcM)a{QlGC#R(t}dWWrKqG@URtUOOGP-rA^VGZ7$w& znU=V_4VgP8InG9Yn`?1Q(WwhJ!6=Q6@`o}GPl9WNk31dq@~x7=kWP|Evn9#dn54w9 zD+C;})T4MInx1a>g$N7`K)oZI*@$Dsj)L~QT~)pf4|ffa^J4)y-)%mX2Bnl)MI~Af z>K0LD#eimts%GR{oZf;eu~ zlz7rI=ILxz=cm4@1L&L9QVoN?X?xR7LdCPm1qe?` zWiQ{AaLBZ|0uz}Uj$^croEXI{2h zZ;z((Jvt}g`(9=*R=@h%llRVLKCHi3t7~U0G%XqvsZ|wy3D#h7YDI^iAP^K935*g*=C8)Ie2y-#DiRUr{ zyIBa!x3t_eqdi1B=%J3UUh}d|648)-u&!wY%U-5k77)|gn|@$?>(s+ioa?@&U!Lc^ z=QEq1dwIwtsXfH1g)FeJ2NF6a^$?zNqu`i2tTCpvs^CNR85~6ve zW8=kHd{Ir?wspUq*l@X04c7-ZIr_nmS%9s!MK-Crt}}fXh<8|}9UFuxbAXgl@W;=l zIaRfqh9=X_8rl_`D@XS4nm=$^em1IUQ=ASMA9uk)%<8*^KmK^qGpg0M+-$u|?J4P6 zJ?Vu(&aLl38jW>nf~EW5(uw)|H+K}S6h+?%`74vYQN%w7BV%-rW3Hpvp%lDP^cfgi zb%Q&O5q3oMS2Zzq2w{c9G+9gA9{kAfkD1iM!dj^G1srR1Wt+cp5JU19%}`^dhP$3 zTeC_vzuk;10Mn*t{A=ErNpd|CJJkdrl61jYbhnpdx!t}W71<-aonV05zLWMU!KXd9 z^{>c55tF3vAwb~z>{i*X`R><`a{k_GE-)SZRYeT_eXQ1%FnwT~COLia3H{a7<$|7t z1Ot*)fdm>T-Rt0P5El*KZtI!#+@Y8B_M!f4`qXtXt3@YqHEaT!_eh|5FS8k|)kCx| zS8%_w-?J>j8E`H}`EcYV@n=^na2*|_lSrhmY7>J_#LWKeDM|bm(GFyeg4{BaNTV4h z1u>18ZR3pf9|_|vb(<`xnsT~^`v*sao{t2asS01Hb0kXfbVlsgxrLhMP=KQloF>E->OUs+6 zYEOqPVG*I}iN^$~31?Qwiqd7Ig|CojpaGF2!ZtU=tV>HGkwX=}Al<-XFyhy%1Pzp} z_aBC$8NHO%wALEmwbz8RXn|?d-}Cnk9y{!)x@yL2^l9xTj9h#h>SlirJgWive;75= zE!`dFfFejKw@=d(Z9DH|C{+9`NysH3HFqyePV}>iV3KDCe*Qovlf-wMPw)2h3Jy)m zrC`ZseZE|H-lPr5+*Hnb@&bQlsfj#O_G|zrK_Ll;!N2(>|35<~6hu?QHtw`RZBW)z zS8jkR#9)w1rU{=xM-x%`OubQ(>Bdr-VWa5B&y*%Ihz*?hQJbLUIYOw4tL;r?pF)M* zv38a(%5{QeBo66)FYV?_#dFB~Mbj$vD`y%-J15>20yu7a04CdWw&eop`LZkK+Be1_ zHCrRovKhx|oqDrXhy!10`P!*-MIj3AN@RW{W7PpP6c3H1AO-FNGvxi24+}Kf z>1d9$BtLl`rULo`M+i8~2CCWE+ac98h?wR-a0uQzu&P#8scKi(4FLW)!uOchvK{#= zKdSl$$bNkIxR(98a-wX)v3drpQ@Xju<|vtGBjm>$jm;RbW3^o}cg~L8x*Xk(V~`N; zx>zxYQWzj3-DR7`4eP6v8{Cc3yT)EhB z8PvxkUXZhbg@44>h_yn-`{yt(yHl)~J=tZNY!}ikRzZ|T8lECcrrXb?C#4Ty>4f}`%QlVsy?94@|6)+x@w!B%zAdOw^{=FN&-b?z0 z)Rf7t475BZ414~xTzvEKxj{k|7na!?wxrdPOaknlHq@iX^yAJBm#vXjwi_(TKYeFi zlkief;u7aqQ$7dlz0~P}k9;bSLWEobL$lWy5``P^UOb@X@karq^0+XS3xjhZpx}Yw za0Lm&y%sVLg15+|F+=5C+K8lyxuuSV%dXgzrl`9$i@n!CL60LQ6E2n(0LoIiK!UqS zYGqoHROMR!E&RFkInHO;%z&98EzMx!Y0G(aZ{eZ(!42nrs?yhnH$0 z8=VW9s9B}yT&~NEnMl#gF}b62(TrqXbw)e+&JmEHGG>*faUiSw z(#vS0vfL~TZA3j)S9KQ1nP`5v)>f^>R9APd zDNF#ieNj#0F8^xH2N)a(2P}qwW$niSAk}Gf75-iGVL?}I_T$o86$i^V&mSDko6psp zT2{(_yb<}S`Q!NGDJ|Pc$Ht1-ac654m+J@)AUqvkMwTw`wDgZx2#) z0`AoE49@Pq%epG z4caqhSR&}JaN;-`v61IxAvQ@6-dq~Ycwt%keC=pS^=$m`rGA!` z(h=X8?mI`Y5(N;Zakd(%~B0Mn49|W{2?jH|*3D+rl`a zU(OP`XSb<7&X3|$;3hdylu%$skI5e;C;I!*lhdJ&s?0Z}#B`zm6n2TzO>e}hkS~RO zZVw|J01M2dyBHv=47;QY6AQA+S|F>8_ByRh+?o}=f8seDZ+c_NE{0RI+DlGoMo$+Z zcc_TEMdSSYG5KKL3?DUHN&M{Iu$SD4I@1;w_<*EbCRF4T<09#lyW6$LGgqnpRx~w_ z>)$V>|0A+@8uJv{J1}hf5Il(V5*&y!$riF9^}IHIz$`MHh>A`7lz@_p#%J4tA(h@9 zNx(L2B=BJ{SE0nFf$F#8l}s9NTTc8@Ua%R@W$rw+y5l?0hSJ9K%6I57=w)aYASn+D zXvjj$`k~}vp7F~9x$|Yied!!(YA&0i*IFG+YieHloevm1HX&Q2kUM!9Vh1g@H3<4pua?esVpZOlDOLD z`r|wLe3UcY`wJA}fI4s28g5u%TCBcf$DJ+O&+jqbbKVGz#1{&{@)_No%2RsGkbHS# znf^8O_5RvROYKvbTq){TYhAXNy`QmdPx9#e?zW=~$AaJ;2w^m!^vtSk7`!Cp%5nXW zb#{azfC@n%svrzO6Fk_k#^Dt-4=08u7ttcQWfn%(ir?yl(P8OBqrq!2B?R5~U`v5} zLTM|UX~i2Sf&DmBJ8|a0t_Y&eYro;-kJy4_FGXrmO2f-j#DL!dK&Gjh4v5xQZ zs;36WVRhDo>g(FVt?bu1<Qy!y=_{zX}>2e;44t8rH| zFQh0xeq|@m3;k@781KGd%p^bZ&1#B$0mmD=2-M!NpU8?x^DkS!Lw0M0);s=SwmlEQ zH}zhNVyg4r@DTf(yqU}5 z&R<+Re+N*zE}U+0A`t?k*oW|)@6W23KFR*5!zSni^k+A*0}`O*1=TMv+4Q5)=fy^>D9>s+96$9)ubFr_Qw@D_w75VRz-v)WmF(8pD1y8x+MKxP;5vhzQa-JnW zk1By|8Y+uWH73LiS&~{eDl)4+nMFbYo-F=_?4Uc6!!Eu#>7>y>e|qcCuAWCbnyKnQ zMsIT|7!oN7lHq6dnUsA;0?g+|d6K0e8(FIUX(f7j^bLga-70&HB#?kYI4l!F#nW^Z zO~{3B+Y@PBo_20=&)rG06+9fr(|8wwU+{U6Nfa5X8Q5___h0Ufpy8495APWzDB_>` zeA*N5IsB=^SDAqi^F)OiFUn!S`LH z`UkVw3Ye4%FZj12%C!hpp6!%7eC9W7xCaWx-Nbq+V5!b2g#ZO(t?6`j#A|~zvq43A z(wu{1|KZOflJY#mb%Bu|IY)N_fNBm@S8@BE<;Ya4m?DAqRVo3Tg5^d z;x5^HG!4=UonoVS#tWNI1#*03FYi4ZNNbFhzD<#~{9Hy*%gOg47kd3Q+x+oPBd7V- zVtew<^^~~xo2}MjuJ3?@e{-@yeEmowMa7hUvG1C~6^QSDpY!8grdNHygWu)V_uyv34KJ_VLib$z5pt5huq@DzH*OKOuwkxZIQ<_P*XIpGBSgSqZRCBu0yW=k05 z-gKaXxzUUnQ@$@Fi%x+Smc2iuSxYEl3J zlaetwCe`JDolL1L-=QP9s(J#57s-bwV5^!Nec5Un&a0~G>)>8jefT)y@dHOfAR9D1 zIB9>;hUpvs3Y?M683V>8HI$ZMht6NkYXLuAwamI1AFCT!u;A044ovEG@(;6}XkN}( zanW9w8r63{gj90%@&0>X{(n8fA^i?0xT3}faS3vf|9ZAqRK}L7+b!M#eqJa3^Orz*&#rse025NklJc8|5;}X z2UeRa&wTB>o8Yx>x!+}X=)$K)&0(0-itJCs9N)X^QVPRw)&sTtbc|oJj`v5Q-6<{N z!cCi>Yf0C`HMEn#Jkz?2L=wapQ7e>K35#^_c6? z_V^FQWdeYReya0-=aRhEORXi@({&dwy&%>YkOwdhG{XQQI=Sq%hJAlFYKlnyG|$xW zhioFh);BD&x$eItA^y`Kn}h)gx!s7u)wJ6TkFY+Ni=Yf3fnv}}8bZUE>VnOE$RxjP zNplU5ScdZHdT+(g>{fhDfV;Y-OVZY0E(wK9ihUW1!`?U}hf@z}dWKsEflZ#*R@Q#D<25Q%TCfxU zL1s8rj9q%nUs79RcU6OZ_GHxmkThll(R9!#vNc*FvDT0-? zvSRN(x{BuG5o?Y5ENe||Nz#j|y7F_hlzL+AS|H+0-MOemiw3`>EA;-(**x^qkyJ za`wSRs+~&TQcVG>%*d)sH?~sE$q@Y6>gXsnKEl)(9kKk#IMdDY*hKu&M&qPBFn|j3 z+tRsDK_bO*#u@O#+$NkFznxDCep8p97F^GDr>4DdJpaVnr0y{%MEB-$UL*An|AbDx z_{X{DY%OQ?`bHDK!`yMI1JF@m}@R9OH+vDpm#x)=8 zVXyUoNy@hG-aq`?)^(UQg|@xKW`uT9(0dp*(@&-c_JNsU>;QbFrw+^YprQ<#&1=4J z9|n&nem2Pw4*ufVfOZ}i-I(5=1Q+H5ms&5?JGkbrk_5-?CkbjNMexoYr`1iSf6m63 zoW+i3q_7|M=TkZTcs>)KAY6}kHa`6N{>V9hi--vU9m>U5j~KVxpQiu*Cg1MmK_m@< zL9B>{JAwoI^1|P;a8e;ti2>JgGJh{erJVj?2O*F`U@y&XhQiW15C9GA>63<=fRErv56s-+Hsbj897ScYdYM&F>yUAGEC;XHU+VbIeF zyAeJcomgDZQ|~7k5l(T9u?-uf{7ix;c%B>`kZVZ_FES=x=bHFMcZVQRMnzT91;$G~ z9GDrHu)XI~wUbK-*zCuVZQN2T4|bR&a8wuPlG8@pc36ZeC$w75J?iO8*_)y!^gHa| z*L>5xVy20-AXSKUK*Co?|tst#sdDC!g{)RId0ZpSZ_`wtjmTGH)(%@%vdNb-XJ zP@qg_U3+@v>c^CWb@?5|y`WP_hu4kO_v{Vl4TEreI* zTQZm+c0V+cDCI;yn8e#gP#njP=0=wg58G#%C;>}KFC$NMHP6=?*#}TN;rohwKTTB@nRL^b^rCE_k1tM&5VbE2wRj{eD6_6O zI#h%OVPkNh7vpF>{967w{Sjir!YaI{y@w4sfIEJ(3?)b-X>sbW) zsZt+5#+0HJnDUSk==l-L$Xn%}DWL$^jUtwmdeRWSf#1k5ynR=L5>=qO_83m8+IF1}uY{|JIb7Nd_6Lf`Gyr?0;{OZ~c8 zC;!ahz4peLU~D_skzjl$^|fXDt|TsKq*r((#Bdgd{+)xAq#g_Jr07wN?`GaKi|pq| za&{<{=4gWKF@DMYQH|~2j{Sm3N#9@PQu(60HLtgS@AXaAO`eugQ%4gn>J|LqSh95P zyGC*h8@pMzh4kDaZ~*2qIV@BX!dYqBeN_V}V>fG|iDS1rPl;oM+E0I#j^C|c?TmIG z;|>Mf0AccVM$gs9M7NWs0hlI(z9;b)so};QSw#=BCT9qK?)o)5i6r7tV(^1IM1~dc z5Ao=IY(O6q9Vou=jYJh4cGOs-CF?O_y$reqvVKi|gXN+#{7A7Favpeuay=12)85SO4%sz9o%eA2S zk~t{okWB7E0i{S*R^nZobMw)+BwUUfmO`43-Oni|5t|k0 zYbIYARb3|pZ_Y|9Er4Iva4G^4#Rz64qY2a8dH2e$TwTM%34;}`^hN?}jyEbe`T_Fq zxi?GM%J1TL^LuAH?o-zb`=r&G@OVwa};30g@;9g-O}+n7HjsDK4fVa zI5p+K!Pp9qqN2Iyr?MV~g$guOvT20$@#Sxn*h>70p7A)o$bO(0liFp`ey3SjxF~KX zCUiIB#G96n_3;0Cod4H#69kP>u5&-LSJeaXK zTD7VYZ@0n`Q8w(dOp(-$>>MGrzW^4Np=HX0IA0@zW2>1W{_ZaZnwcG1j^bO!2UPwF zy$a#d^OA{6hq(&na!%_PXVFGYLi1&qgMw3&$p0dGguU#v!p&ExzE(7DCEK1TeMjtU z8v3r_@@nK3N4B0*57c>d7-_FxW6l}(*@{z=!;tF5kHUo<-E?Z-YEpi@&3csg!3B|o-IFUG#*Ld<)_q-!$^KUueq zdZd=>xxf1Pq1B5CMN-`7e6O~cx>mC8=K5q4xjP}R@VfU0=AtR$-TT&cpTDKZh5kP` z4GJ+*6_jTw33Qn^!wFw_n}?CEHPA$o28`*j)2C!6!7)RbEfg5CqqJjK>x6Y;8^Gcx zj<3beGDcWcemjBL6H=0dnrB{;tiD`Wf{922T+9%8)PYn@EERfLC0f$O6m>j#1~^?! zmD2Z=1X(AP^Q(@kY8lTRYItT}RF}2-X8)+`!t-FQ>P2F6R2U*stF9e)%6?5hb?tCe z&#WxwSTjP@{Hu-uwYaXsyLr_~27gFQMkaF6m`i4GC+DQSxU92|`?yCfsp|sI>ZBX~ zu=AwxA?1>*4|b4^s~dT{n!C3|^pA6&w=xCS@b!xtu94}4OYTuBV)5Dj$f#UrPVPaI zsi|QC`SEEXzS7~D7ik1dQ~axOd<>!&KQBJvJ1K&WWl z=Jzj7B`>a7I+-Z`HDM(Jd8)fDc)+JuNYT<1fk~%>^V!RBce>k8iChyo%%=WtWU*O* z-jn>-Z6qubFIOc^x!ghl@Nw`~m4AjPCD#8>*x3|>ohx8L*m(wooezRQ*qQjhgq{7L z!p@A8Phn@j-TxhSMm~Pg8Jld}Dg~}I%cV}=?Yz%c)N|6`thUB&;pM8$9)IteyFPz= zMC@Xg=0-j*5GTwtIvlqwN+h0iDn0m;m2Jeak;iNXP68c)Qeonhrc@9!F~&GqlL$tBj7o2F-5Iz4ZJqzS-T81pA?1-jAlJ_Ge&Y|i7YKV0ZcIME3Zp6TAXkkRI`q^Wd!A=bqVKCD&g#e0S z2W8n!d;S7!ngU!8tp&`s=oz!PGw;lRTW`56$JxneHrIoUXiwUE54fED>h7is43Nn7 z3*Eom&E;7g9YP9th0$2vJJZrt$b`K(!Y#Ar>|iP=16n=u4=s-}6E#gEpcSnGZX>VZ z`jzp@krCd(r~unJ&^WJ=Mb-fW1e;7Bnwn!n!$b@Sqwr3$!F<9Zc=KVQ;{``!iP@wh zh_QZ3_=S zRVYD{oaE?ED!$d=ZU**K;fak3V>>~KQ)JiOFrghY8yzH9Bz*pg)F()BiXN6?dx#!o z*RQp26$){75H#l`_#Ab#9{Zd$Dp7U)Do-UCzev`n?Y?Z+f7MO4WZ7%T_03%i2eJ{` z%W(;8HPK+_R6lb4{pQ^NHYg6e`)>O%0fh*HW@5DgfMOb zb53Q$IOKen5Y{0xB;zF+l89NqgW@90N4ls%w4)EXF)=rXmLov~XaFF7;D^e1I6%wP! z7^2~PQiGh;HNm)wmgIaQl-`;F9Ti3$i$2*aEtK=EN{aq1FQLX$*cmRyB4hx5On$G$ zrE>V?c?zT#p^Q66THTUSFRRPKhA59E()6!e_TtZIopI?ynaeV+exqp%(*^id zTIDBsGtbgOzUG*%WO%=gmU$39HVonc9g^rQ5lJ&5o3fqkwg`^zmy3MM*?r01cb|f` zf(sEPDrAW#v|)ssad6@*A>;#=q0h|9O!CR${Q-f~7EO(@vAqQKVILluowDh$R-VUmPm491VlW zF^WeeK?WnR88mB_U@S-Csib0ZMN+H=QkAG=^~W1aC*vtB=P6i|=o538-d6F?FIW>7 z@+{*}IuNkPm5LjQhO>GcO}#Yhf1amW?r2nBKVPOXBAE5{gT6@xe5HN!h! zv+H!cEngd61-`ysIoQ=_IbU52hxiH6dsdg&WE3-bm=Fd?qY^$9&_xkRRCyd`h6YwV zpDq>1Q2${5Zn`GR%=S~^+c?HIz63{|)kd8O9Pe1)DCUUmf9dXQbxy1d?F`WH6a2N4 zn{kq`@uziVL#hn_@zZ5xm(K-1VWoi-zDxei3F@APU>y8YHR!qDB_ z9nvBtGJu4Hq=F#bUD7#pr*wmKgVHs0r%FjT(kLJx-{bp!d!OvR|L2_Y%x|rA-`CZg z5eLG6@c0*zj$6?R6pckFq62-5$?7WU1|Y#gZjvGnG=_2pzsXoWyvXn@ej~))VlHPV zOU{%f!vF?Bfdq!qyp(aswoo`jhAMewU=a_wnmZyD?OXbD+NvHO?2J@5 zc6VY1v@A@BX%HbGQT2602=)4VP!FTJ;b?-Jr@eS5bZ0ntPYG+gkx9YRd&0l$*pL58 z@2p?VwDN2KLjcQph#=0VZWyI-xo(70Oq{PDFA3|SoAOPh{hQir%}<$tc-1etBc^uJo&(yE5Jv!>DJUXU)9dxh`6JzYzMC zF!#=#+2c(jxNe0#tTnBoW7AzDz=`ympN2E$;0Z;W2#jsUk<#64C24?j|6khUs_z4} z)LIawpU1`u*9wq_X{g+6r&;7Qtz>!s5rGB~{(XN5=bAT5D>_9F)8)=ZcUy*VTGt9N zgWC3^3nijYJ~XJb?=ET@JX2ONJ?X<*cH!y1TJ>2qoN6Ic-kBN~w0#RNiF)^jj^hmG_L&Z&<3Foeen#)t6&J4)H zF1J{9*hhL2_)|)=ayhI-%KyXjB_E%c8iYCwJRbS$VXz4XSuV0FV?hcszR-pL!jtI9 zPpnJB2v`XKV2ly_Upz^osX`c@hI-@PIrCV$By!}X@vNyzgc#>9;KyW}%75WhFxQe; zqFAi*h;Av;wiu}D(GSSPJ_qVFfaCm^zSkOMO%4qtTZ>vO^R-CBDbJQ9j}|{WZjMmP ze>;3v2X^~Em%iEo?O_WAN>o~PkD{MxwoaXZ;VMvHpDe*EXY*exADTW_Eto|*{D}dv?O=NJH zJT&sBCN-&LLHclp&Fi(DOb7jl?G#~9oyU}An?PhxMJ zd8;Y{w1*2y48R>m4m=(}OP}FvQ@#CzBdMkf1K{yL(PUQC)A4b_8YW@j4TI2Ua($xF ziL$E|N!GQe-TP%^-?HY%)Z4~S)CaP6{3bjCpTQi~D)QH1f8+(2w2;50`QOKF)m?We zdQ;u!6h1ti=oh2B-8i@qryc@Ey)*c}P*$BJC9WwiAt9@6l+r9H&13Qoa$O7|7#ab~ zD1KhU1Xr7Q%$Q_@xA6Z5B^!@I3+<6)f29tqnem@KWAlW zv4`hPMv2B2EKc%2FSe1axjk~}qjnc|omIv|^w?B(TcFE-$o{qH-FW|b+2tGc#CK1| z+NVtBx7Z$Q*&WzV*F$L~R5v0|z6&qLVIB*uyJ*IGtVB8dxmwJ5#oe@*%9=BJSldej z|Itum+;-Hol_LffxLomu(m-f^UfUC$$U^H_UwI!j)qp@V(#;<+C>-}B`D~Cd+2_Y- z*i`$)>^YordU8#j{#KmkFT9EV{MI~uO-Kb zxz^GKm$k0Z5*6Q_6Cig%c4$Hr;*G(b9#ggW*nVNmLh2&5XL*e`Dq`H$%{(2+YKN?y zeB2SkF{_V@b=;icnH)(G+I3$E$*(f85Yp?}+>2y|XICDRJ|uy;_jkLPh!}~1v2}Sj zGXH!o#tCai<9%U$&iYm@>i0wrgl`Y}w0x@aKivgX6Ts&nAxm<1ypa@Od~;BN+A-iX zV$x_PI~hr%<1)?+Tb>yYMo^065MARlK@%AHQrc_PjYcvM-iAhlZoLZZsm*~8dwofN zE?E$cIQ$Y#J({IJ_LIz)8I8b~$U^VEp5)J!X|+3_q%HRO)`T0 zA5~W|cVzTa$hXrmK3Ziwa-?ufqja57(93c@)+)(v zUk8h6_kkOWZ1O7Oz5K9pa2KG?Ut`1YkfA7}PF9c9c$8-Ra*8U;IdZQgia%qzF#ctv z+{cu!$z{bz?+^A%B0^_C7r8hm^5A2IJ-DFOaf?zOG zt`cMGfJzwKu!_h&`sT=nV#aYiSM>Js$3LAa> z5FBV^W#fvn_*E1em(R86;sB=+o>zI!$ko;k8S@yagp5Bi0n(!<`|TGRe4|)^)42PC zf70o9d*jqov3q{m{}5IYb_DGw@xLKwgm7uP0tQ(@sRZMoDAGc!=+Jx#4y_OrwkD+ z<}l+Rj)Hy$2=QAonovGxdB*UkJEfbkn7=%}#z8y7-$cJ6+ow-tJhddp z_ty>U6I%?7U8pn7fm*?r$JX+Nv46yhG({!vyH?aqj==NmfX`u-8gEGb2+m#*l{Jx3GZa!4Ib!vP@z91LU`chAwM19 zbm;iCu@u&M_gnY08$#;i2uBsj3hKqh9Che|5J#i*GZ58Qq3Iu^DFqLe7vU;QZx>Bq6*WdXmt*0T%+7uXQDr8%ZGA!&?hv`TWk`1#Qzqw=vp`U3YWeK*)K~Wvb%}DFmQ*qIhY4e;t&V?&0yf zXpp@xb??&JdgXt6oAbB*1k2;`h1jk>A_OS=mo&rc%detA!QG4&l<3j^mfc|S7q~_4^(FuAP zzp6%vE*la0ll9Se#z)FF8WYqF^*xrT1N^cL$#UUd&K2G$<>*JG`DA^lusUxffFsTB zmXokwkJH5qphF(UlOmgmhfIU1hkOt!?2Lz1w@GnTGWhJ*G@kS)%{Mk?}BE=4^C zLDGze=VnwHg)pH3%Z$${olyTkjd;GVnD=wbIEzOE`m|`Ea6kEDn;pK)#jRrAPIMKc zn4~N?|1QE*8OHnSi_CQ&3z0KzWd*Orr0g52-7iW(VX%!rdN;6e((P6arP$0LAhT@5 z@=}Gdx#nZrJ(6MMm|j&S$|oH!m8Az;CJLe=4B~xRMbXT-w}M6F@5*Ws5&yr``G4+} zz+hGoggVQnDSsLy9Yz2QX0izkB~e+9mUHrjCWC)zW-@7xMgSuGTs}*CntULd(#hkF zt$s&7k>wSRQkk=vVk#L32wF9iN+w1+7x*-*!zWXvEM|D$5|zzlvu8?RQ)qB#W#Yj@ zAIn#BiC|k!Q|Pq)vPo-lkRHbV`6+L{4lpBC*n01L*t{d*{4l5oD60Ro0tl3gE5Z}po59O)tn2(msbQ{BLcFLUZ5KBKX zE!HT}|4y-RINx9+*PMNecmhcGn9r5le>%+%+XzhFFZVfsU}ePvi}tc`&wRZNhe2mu z%f;?0W@5&x+&@jXS9a&~lZD4)gZVzGSUiw(}c zz7DQE1ycH4IRtg>wGg1OTMeZ?zA}=d_j^Mh!ICp%7>TFOyspPUAa4wvyOdW(mqbKQ z(e_Hvh*zClNFGj1pWoVygQoDBYQLZ%*GPN-L(|(65H7U`dPwDgc)Lt zBeP>~&K+SMXAM&*(tm9q{89cbi3~i~Uy7cM=n>IdHj5WprGo`gv1_G3n!{LD1g5jn z{4j>MNd?gdXKY1C$}d5pfFQCAlK)oN zOCrYIGM_VARr3R;c+`gYfz!eC$>ov*Gyy`zTL2+a3P40-t>lH02rfG+|M{Z`3}!Co zr#%=JW3{~`l79_mgtm?Y6u5m(gA6b9kcJSW^mvCcGso%%|J3U_nUeNqoetojZZ=G| zK(ZD2fKA6iZIUTl5KSpab!t))^IhY#+_xf-#{vS=Dd|`5K7D!f^hgk@irV{guHWbJ z%$LdVs-Ke<-c>^Kwr$E&93H#bPf-EQ%r1#AKrC=@Er_(Sdp&HkK$zPF^h+7zrR{sS zgiOH;>t(UhwE6^@TX@}rEcO~PO5pgKDnap|y;A4Zjz22S-&(!O?~Rf|kSO@jaQyqw zcM#|LM**Y0*KyfXxY*%>?L;8?RHhT4nJqDm{e+|Cb^Lnay6Ov+4u0PEWDcjdMlF_=l68Yq@VJ<#e?77Ib-4ptxLLEBCy!whpSR;kXmUI@^h@mI8>rP-4T{UfNjLO`vlS$sNzWiAN|MMNXqq6 zh{#L=rCT2(+pi%x*d2a+6k!n#x{iDT6+yz8#umfX{Gc34B1cegA^m=uyf}Y-lK)+i zn)q(80YKghfR;VF^Dr!HBc&-TfSa`zit{xDWT`)LSxAmbFA}7d%ro;K3rkKQ2&DBg z?MPZH;F+?xq;|L#@4{}PEJ>1L2m3zqH;|`Wbk1bX3YtGj5K%FodBybKpPBzlbp#Lg zcbYzS% zlj_^v+;ABytFmOEKAEWCwo(SM!^U!RQpseVRD?dSS7Y%^ma^}kV2<}3!-Wc!D}AjR zoSMq-0Ia@E(`5FEdCSX?o71>=ZTQdjzfdN`7<8dOM*n=7=VkCkH~Q^Eh-#?k7|w8V{?Mz9w!*%UwaMY@KrN zzki!_IjNRtzrL#7w8*WINV?y@?kJ}9TKbvV8;B|!3^LK5K_+?%|8gMMfhpJ!hQ~L* z7Gx(Qj2A*o;A(_}Vg0umih@uOLYgx4cPAxJFK02Q&FD(JrTs{b|8m|$MrfruD^|=N zJbie`o+z=R=N?S)Q2zA7Bnc_2!sHj$u0>e!U^|6v7)ox=WSXcmoNmEw(UW1Lzp=w? zTfM)XY8;xhT zt4xRTMvxMC2~q+aPmHY@(?Ci%Zl zo64@Q)(2H-M281;c`THbRed|wKV;2KGat)kyDn9|lnGW0ez|Dhme90X%yit${=o*N zX%EK9-LefotZH8$U`s%~J6BYFgn;y8pd0D1O|9z>4pD74q|K;S7R~$g1dc6sciM^e zipsH{)MUA40E>_cpP4DCa*>g(a15W0tD)WT5o4;-@G$%HdgsxAb}E-)!4e;rQBi58 zi!s+PwimL(yX~hFETr!)Cb@auEn{hFJRAO!|1hRmFZa~DxyYMvLl4JFGHp&-?=Y(v~@HsyDm{TuLNDa6JE2$#Cf{zQt{t8 zfdBdbA|Jm7tjw4M5O{okX&7z{NF|mVbAlXzF))nf55^(lv)s*3(aWe2vcDZGO<+Wc z=f#eM=nxDkB(p!(H{Cxs8%tw&I>qHF@DV?oi~8~o-IYb5fHj6;dq2@Cz*&1#CxkuU z=1qkyJoHnB*5TJU{VslDu@tL?2FqEPnW7M%WI8#%|@AZ z+MDU(2E}9LQ}m{?%tpB$XjZb)oJ?TxjISirZ|Ymd+@I1O|5)JLnl3`mkjPeRIDl7@ zxA|eUU7F1~Dx;J7H3vIwMmz^&S!qi_l@|J2@JD%IECW?5A1coUP_>eN*wv2r`WXm5 zEqGR*iFoWzR>{&@t|b1vTvV=me(Wc5cSfyXvEnZ3f1bcf_a34zHy%v% zTH6R3q4R+VI_x@c4y3?@2 z1-@Et#*pmneT)6nfyNlmh@oJb05J<^lBMEiH%WRzGB*ffL2DmV{dJy9q?wo-7pFTE zl@({ab-rOvGx{TAo^D}Yzmsief5U?AG$I0axGTdfP(3$Lwc;BW!O4S_>+~1K!CVK5 zlH5S|G@OJ9UYu#ZZbgC&rP!BCe(hz2noiJX1++OFqggQpjPQ_ALhdnC@STuH<{f;;mFWf>HOQet_yP0@WNK zP?;r>s>Y_I3k?M^5P>HL$_k(qbgH=O@z|Og%6MqnCLI@FB_5~*nPo_QfeMvy>vC2N zd_!QrvA~9Z6?3;6_+}X9D>!2+;OjQ0PWaF$w1m_GP(31}%I@AHt3+|0t z>wediLw~M!pT9v+4FEM%L}Gbyl+f`&++f2$EZR^^0+|3LNW>%D<{spkSWCL#JYL!6 zE&_et0CKK16v}m}P2Z_N{vvv0_`Q2Ck)LUZ7}pT)zQqSD;pvDm-9Vy`@_6sGrz3ko z4uBRlk$Ivf;?@310tAM;FZNSL!j8WeePMO~<#-HLu zXCY%kaYB~VmY+uwF2h7a(js3U!iR)B4P#;knL_QE#7UFY*I4QDFZc;?W3fz_Sj$3Q z>Jt#Bw_~!3-6*JX93>QH6|wWAzih7LPpHD$CNxnP4$LC>FsZTqT~sGZuTwo4LT|?I z>pAk)i;3?4oP~r>lb}I(1T3a~@%eFK5@?9mk_iQUPsqNxE;QqZ$;A=;YjX|`#i4&$ zX_;Us8$;FR17WW(mQ2i5%8^0mV}Pd6a+^o9yA&&D3coKfopWJU1UBc1KBvaNHs{Pg zJ_pX0e{Igc$d(GTbQ**oO0_bJ?J^i0*CR8;uC_B?d+5GcYD*0TvU%jh$KIdy7C-qf zcgA=J+ka2>{COVpi_~$gCj>i5CTspND6k&M<|wr|8zQ7((&|@SH<+juTqIU2ZMq&b zR4jOz--!yXEEKl&Dw^!h%AdK&5^$p-7v8z%-p%jnvgMkl7G+)179* zzaLI-S#ZOY{6tw{+we6<@pcNICyaFociGMvioDI$4*&Ex-Uh2 zF-Cw2JBTt(cv_}L9NZv)BNfGdrfL8F>-^Le^5WvGVugY73WDU`iW-y$0EmDuY;8)$ z9OPHf5Y#OmNY)OB+8})T>RKV$a=chkQ;j0VRo5Tt%7rj|(8^UY4*v~g^TupypV|rf z;LV#DM%8#)MVZwyYK=?WO^khFaG}c?n$4bEUI(ll{AHK8?khB^ z7d~f$8U=Uf6=}> zS)1zm`RLR)k1X#OhUN1JHdRl8{ahKm9;nRxdJwHRsMI$H5Ts18#DGdYUk{w*^C@h2 z)bO{^{NFNZa0%}^x=jI`xOFOoH#i9EAyZBoXK@Ngcq|`B4QS;N>wI=887?CCpp-0X zVVH&m7}?iSY{v0)6io7{6=-ly?u0PqEd~}6w1LZfP^s6;@uktcu~r1n?hh>eJJtHrLUI*Jy`=Dk zITlfyb0wI(OU8QelGP$BR{|5oX70mW$=7QIJb%PFGDI^9D5|k)01J@?Cb7IU((ftD z7eokzFG|1ur)5$tUC%o-d@r57?MUe`S_au<$%KuJD4RXYIm_C@!8jyB4%2JAf<9d0 z$HvP;_(h7T4DNik+UHCo$z%fcKEtynW9iH_^GfXWtcs$~l4yv~8+Q~6WZgNk4-&Gp zDumu!e#vN{3#~CwjClOw$-Y)4Ym;;T9x+#Fo$2VgxFUDOVm0J@CpD-0u}+)r8O|JL z(}`khz&Cwc%+I_~jd(`6V`#c_%V?^V)z|j?3!vSU3i~CKA*k3vs$PQAFRGah)XbyR zw&X4?<5|ywNFG-=?#GmB8CU{GGxb8E)m5!8Wz+7Yh3C~T-^Hra^{NvkIq%?m{VCLI|4z*A#iX7!=f z5Ke-o{3zOiYeO^q0kzEt;*GTY*vD?A@I+9-Pm?T=A>UTB)f^rOO}Weam=f!{|1niL z^o9vRU1d1&!yEf%=2Qbea`PmU6n2acuZ>%FaP3-eb`qUZ6f8ctRj0G2d6!R>B>NXz ztz`$fc@7lDxzSmnA}4_F!f&P-RyvfwiUvz^r6~4`KIp%M6=$k{VSkku$^m-#1P`X5 z?B{HqS5g(}g;M!ZKl0$oXOeKvQrbFT57T1G{E?O}m^n;2C8gWbI6Gl{#5Jd)`=gGF zt?fq=Slk~`F1&UG)*O59$|fyd&`jAf_qK02U^uL58~=+f+xP0TYr2Bn9yj0WEAl{J zGugi2!xEr^_u|$t)b*L^7}gXVWl(Lvo>44vCmk_4b#G`ppmcqa92OY z|H|%y#V}~RXP&Cm=<~v0QTDGinMP%Zuw(D|;IfOmiThJYUA)iprnwI>pBD#fkKC4> zXU7M>dmwdOv6!YFJzWcYzW-|}n9}e1yC=^|^QyHZx5rX&kcr4f`bo#lW`Mtn=W?M5 zjv#aGAdMJRlJYakG>eh`Tm0APIg?a^6>n*-s-iN_}x;G+rfS05{G`b zmYI7~R1%FyQcG6`%(G|RlHx?`fw*%p2(xxPnKmzq{g5Gw9YEtdpODi*))8zhx{(NE z0x@mrAdJG$$C{@wie*DoyVD*#36tPP&U}8na5##nW5{Dydgudpcn{e`d}x2eI<`}( zG!4g87$=t$o`Gc#S?hZE6D)e1^{GC>U#cOJw)DhNrBE)G>Cg~x#(SWC$m& zg38$_#iCj36+T+J9w6^?qI0R-q`uHb6Y?vH^Sfh2KvWon?o7wiK#Lei$$Lc?ot%S% zP2~VnS5|+=>g)~3V604A1V|5NNXZOPUSsIUiR@AwKzKeD=(a_oNJ~H ziJSdNf5gk|o@fi`VZ@XV_hl9~aw!7c!OMt=q=Ku)Jt_$_3LB0f|p(+zVw z@@gEP55%4k>ITK>zBi8RQe57z^ANTVo)YdIkMdKrBl18Y&AL17s64yAgJ&T$n9~HP6S4NI*6*Kd>&Tn*d~! z(qfL;a-_Xh_L|(^Zx0cBHoVH}YG{aTFh>x*50ibR1jjxv{YrZ*wd|I;*@PM*7Tx4z zO=%zZ_HUC#v9C=g<=^UxicSs5>4>63$Nj)FQ~Ek&40iX82kSPjz#=!?)wH1dEgfgpin=nhOqPF{1T4W{5mzw|cV$ zd^@8TUhEBKyl|mWPQToERjd;7)pV$olQC2h9$F=v!Ua{aoZbMW`@^v+NQWOYo15)| zwZ*Kn@zU3$sUW=$Sd};FiDZZO&F^~~UdL}e#+bXxqojiyB@EP))Y_!sTfJVKH8N7I zu2!MX)Jx3K@}C5!?->v34;Q-~O&2Q{zWyHc$!5NOdiwJ?io5+xo7Sy8w%#wtr2&vC zQJ(sF_@O5xh)JKyG~i_Q&1X7v^7uG`mpst&Y4}KARNTa!Z=77s8W3+(%E|H%y-_CsK_tVnu?i1&DNer`QzP~Fo%L{^873II9_u9#^=0C7Z(Q;k1BFdA64wM%1L;A}~ z^jW6D>|-{|D{}lEC^*VK5(HZV+fBxoirN8+^3ui(uZnVny#u0}&Azw&HI0e%T;+Wf zoJ93lP~*o;fnZ6Bx$Ml@*R)DtGt?ZqXH?z7Sd_`l`J=wTzV(ZK#nI>Q^$7OO<%zn- zEne+nQf**5s`+$*q7Lf&k&4`1_nnxvT}UQkCp}jf`KQfTx3^$%`i`^iGZ8D8j_$0N ztGm35vYh$2NDIeDd1@FM#;Cw_RQGwy7L!o?qCF7{EPc*L9`{mRj8)A0G?a^;EDI1m zM}6Eo<=yzB9^B`v1SdqFV?U8sfAy^Ki>yu3rx_~8?1pb@sLD?kv>CyVxyseD&{X19 zb`!Zz=7ZDdsz0F^A!0CNHy#-~h&5`p{+@sY}@!BXpj27Jjb6fmjYHGFTtmEY|(8@z-?-2S3ANoODPqXiQQ~)vr zyf>GCMEcaE)VLNz zo2BqbRy#lzT#7g!g<)s`zMjr0Y;$%EMGOs&R~;P8EN;Z8-Yn(V=!n1*jDqrDHV?)9 zsv68Rw~hmyk*4+I@qtnmphRi+lF&H?zua2K@F(jhBS;99Yd0czU;2WWe=7vd6paP| z$LyOEC`*80>^lQ6jHyK|44DXVShNJ@@%clHOhANhP{h1H)_pFY<|mX{}Z=II39>bAdl#D zn^hB}U!d0j?HCY^z$W<3i+U4G;Bj>S;>~))32U_5g;l|J$W?NLi;dq%!4#LC037O> zWm9=gCX(3`lgAT9)Kv6t)=LKRq$9pEMOhZSNERR`_1*VM(RVtt5kQcN6Gds`PgWk$*KR2w*%Wj13KzHKnDi0@E zh6dZ4oT-mNyOUP(sruz!?1b~c<|wgzeHJ*JTJm67jqi22FIZ_XX>aTuu#V8~FYTv& z=TWsoo%hNi+xPb9bXd+n_g6xyn%`~NE-gA1KN_7+uFSQ9l%%G%krXdB@knU?+=txP*< zkaSP;3>)LJZK&Qr*>slaVtR3gKwV1-)VKJWIqyA2q(#10>o99phV;EIWQS zKUx<)W6rdlO%#oHE;9A?00pTS9tDJutG5T$BHxij`fP~@ih#<+ivVJOwOE(}l{{U4 zWI@G)*dY20j_ra~H%RyPw5+{(BBzf zGAn_dyOi**65iyqI84_m=?k^X>6bjpsq?y2?}2@)qNQ6YnnWeoh)0*tvdH z%JOwtRI?F#zhq)!Cj> ze8XwoL)r4XJ}&E8^FHh`kZ3<@?!6lN8JAVi@r%fHwS#*t=v6%SR#IH|&2CVkgfP0= zE8&QFi>`b26+n#Q2Fod=-}^PIf6h)CXnyU0<5Ui#3BUj+%3UZ!stMB=5?XA)B@a~T6shoNrHiQy1t7PXJV zrO7z|;P8(C4nGGcS(+Ti9d=sxX2dz=Q)BPr$LXW*e$~5nUCQ!?vn5MR8rSbT; zj2Us)r?rZ+Y$WQ8n-g55514BGH?R4Bs+Inkc=QQa#D!}!dabd5B#caL9UhKLuMT!c z`7a{K#UhEUrZI=Y7&X+nJZJJpQYmYOl82`Ql{0ybCW>0lSSGSK-1W=$2`#6xWgIA! z*#-AsMLsG(X_oz9omuflD{`szgJEio0be-rs2Y$lf2%cD9{zMFS!*$O_FVJ`|^2s^gYjfr{s~WXIL5+4y_>4Pl^mG zZ$3Z2%Z2*go;~gMM<8IL!@QW5iw{I)C|!d+AhQ_;Bd>%R(vtFPt1>esl8r_5$P^Sr z?ucv@Fd{#qD~yJi0rm-~@^3_Pd0jC?L&oJdC7*7jF-EeV&u>KWVd$77h`fd|#U*g< z8z%`!c$y?@aO^WCK}Es&F%zJopw>m{=1}v-h2ob=eZvqrhB=**bPJrKoeW6JjrmLG ziIxO_ii+6DvHkrQTt*PN%Mw6f8amPdro0p|k(ka!-zYn~#j ztUq|i1-knbYGuVZ$>rscPX`C@>qbWKss^*X4$E6R7Y{2NF)}&oswgNq>pyZt9ZI&w zu2Sk@w8If6X&YWplD;DH#*)a~ZZ~g8^dE9n3GOF4dGIw~? zvAJ{jju1kKMTC#W=wsA_vI~~*82rn9J-9q$y#469db|U87p&a?6;;$f#8`33i%(aC z1ylQ%4OQY=Kf;Ohr5=Hy*Y>Gz^IJ7M~J`uh1#&(;hj8PW)3i>nI-y$j>yL~Ym#3pJx!g;OP zx9XqEaLtaaY}mYxzh2P1VGmxs)*mDg4-i-KyM{#Y#71q##q~99CE=%XaN|Jy;|Fe?Z(iA}RPe?1h294Mcx zU1j`)k&I7hz8SyZpM$<$THm^K{J#f%6QsWfeI}h5`mtn5uKzmdZ%zq*n{V8PJ=PQz!{s`0I-dx(4&Ezk*O^X^P^Wzzd>v)? zy^~qjt$MlDopZ-`DWqn#%L?fYW&2ZZC_y~^qY1>yhUHNqo)8?ODDoS@l= zo!V>9Fq}a}n<0SJ_(MS;<>zbqXvT^8)eyFNO}bdLgFQnnEvED$4_-cS`QmM*+fLSi z6>TLd`CT$4)2r`)1PJM}?G!aHoo%@{ujz~Bboo__)48`8O0pnY#wFPaTj{J!KIiN! z!U2fZLwP~YMr@=AOc{Gwt~joM5hy!Tk~@gZ!ImFN6aOi~Qe4S`~*m zFR~Zrt*{>y#V0>d?3HDdA6QkyAD~xMrV_m6EI}@#|54kUVN_X{3>LR~mV!~CSW{A* z@W$EKFMfO)WT@a`9uoy&>$yn7qfh5>#f>XLE z;q~EHV4im~5GFefQ$N4sgAzB1PmNLzX4N+!{mogU0GKqP3}N=jv>c)9$c$od^7!lm zkxciT2B+aC#8lJlpOboj4`C{F*_V<^Pq7K+)CgtXe|clm@#LH2-+ww|&Uc@Ilc(d? z7wxtOZ1-iU$;WOSZUQk^vtAnGO-rdBN7tmF*zW;#)3gsGNi$Iat{tR}mRs`WtEG(OuPx2V+*6N8c`yLh(8cxgfV*vaA@JzkHt5D%un zg$}f&;m0UyGg2;jq&zK9i*>CmJOVeaCp*(zZc2r;+XQ(3_bzD)3^PUl^g3YDXyOdA zmr$T$z$Sab>pGCY*!y>w(Ugz;yG!!a*4t++l!Z}0gJrR+7O^KXqvt4DYx_--lP;fL*QXS?8FIa_Tu_vpDz)`#n}g&pwYl>H zU3P_mtzI^pEc5W2x6Q-7hwxe8Ktj}m+Qc2`bqIrA$Aql6!?90CDw_ltW?*BPnR2agcG4spSK>LaS}5S(@5d^(#O_Uy0T5aQ-O!+|iq%~)p;QemZn!j!@EG;W$sE&0RX=5upGi(z=f` zcih?1{+GxjWqHzZT|Uaw_6G;T+kv!63F|?<%H&1B#9Vgl`7O)k1SfWQQcIs0OvMjv zO4j3NW-AouL*Q@Z3PJ-|o}Mv*N#hGH!AY+3A*6I4=aJ+};7{a>ig!VNx|ww`kr@9& zU<&$59I%>qvo5EV#O(Ozq}r5zPQT&lX!!cPWcmH5fv)exG#2rO8$DJGebaLJ+`Fc7 zjIAn3E|5C*1rFs`^w&hvqf@_@oF<=zes^aryIS!bMEvKcy?H5Oa=e+t_(iswr1E5ES46vE5T`$+knHwW=oN1{K92u-_BP_RDrpY~!Jwj;a+mv(7& z!Bugzsi5wuO$=?r4rJ*^wBpKrr2g&aql8-kUjORh`se&?QOD_b+Bos+u{hd}ONbhP zJa#v{YQJ5x!SA}b5XfCQmLmkLW^}Cm6%rNz5+PX+e8C$EVHQr7)vm=y1G}U;a40%o z5As0>LVGb3kHip9hhdwCL@x}*nAw7n&Cwx>?m_Wl_$C#r;h@-rOq_Re zKJ5dUJR+7eowXnn1EEO#3;y~9k6X=)zG`T9iT!H`6EkLIj=o!mM8t5&~8;LJQb> zQCy@w*JKfRwx(ohY?3k8xIzOQReuWSfZYiTHsTK)~%fljv$v$}*5A~QUZrxvR%fE*Fo|}?t4omUzwRi z0^$;mX9u!L80vWw{~`SJ&$NX`hyfa<`Tt~~AyZT9eNkleuan~eX%a^HJaUZ8c}t#$ zO)WzYo$uqz6kgocOM(WLo^&CXjbMdhi^(iR4K!ko^3u{+34cWDmvd}0MUszrm5nYf z2Z~G!RH}e;=uM3(x)iyXkadr`r6Tbi##akyz1cX9Qbh{gl7JB^JcPmBe({s-1;+By z8@hMh2FOTsde@HYpjf8}qE6>B@@e!s63vw^yRh^p4%~Y;0zFfO3aKdBB2Ri|Mlp`l zJHqMT+N#ImR0I|*SKr(K1-QdxyXFTE7;PMVF66~ldr+FKTK}9z(TGV>Mjj2 z?VBuJwt`7}!_=gtp>8XKR?^Uj6{|@2cc6au%p%;v$Y`qDdb!zpB^+)hZx5-k{uw`G zXax_FuY^GDq|BjG60rDBGr3t(Ejlw{Q2qIEm?Q)!BMI}>51&zVZq}}zGg~Q;$$?0_ z!)7fFCI$>(a0{r1p2?Cx=!oV&KOu$uPm2Y z1L2v|lluD8;1sKs;T4;DxY@GRC_Khu!eBN*e;RI8wFdNDwd|Vxs)vApVEokxXa%%) zwDS-28yQAeUP2BF56#F*f4%hoa?rhCtIKJBmH}wW@p5q^Bfj24_ke zv7}VvYppza3W;aZFbjpIk}(gK&s9caO{HV$r?Rl8!=&BeI3c&=pJUDCGx<_sSX9c8 zin(INlyeAcqLo-Cw+1Xn`J?4xGH)*LmvLzIa=qz543!G3W~G@dQzYE?yYY_}t~IOD zHlo_~4)2@e^@*1H%?>-;rY@|OhA(aO(ADRO*2ditFoQ}S2mj?rpVk|SZxnny>qDtB zvD8#Lxkn2XpQ}x#R{3q4YJYTfllm2PthHDk%lBssR&Mr8V3Ob#3Zcl2Ci&@i|BQ4y zP$;5#Czsovbh7L*F&H3fc9ygGHsU2;EpOX9?f`SxWJUtoe|Nc@j-DMDIPi$m*0I3V z)Z(;Nf}@b*GR8WRLox$kHuhLDvqlM`J32777uiM+4!@gnLpJ=4Z>~7Qx9_E#L0ohtV@_QxoOH+tdXhTs!Yn?K;h~% zC3lEJmF3-f{Z-XW+jjUJgD>PK@q3E~)o87D1p{>*0$bJfb0`$?6){bfOchAB$CW1I zI_-xgnd7<+kQpv)?dFnStag=UMOfigHEEY@HBINz)wO$jRqXX5&sa4LgVOd6@-FSx zXZCPh?GMnq@rio7KPIs?<*TsK+Lp~nlDgLVH2d?A!?JAlj1o6A7W2`g4}W1}xtPINR`{dHA6 zs{&j!_QLf(=yjx7zI|C2{1}W(J+kE@gfp=nSzge(gCnxrx@#;;-Nuw^FFo)py@yc1 z&&uuGGuzUM%W;N4d+(qtv0nJrkDMq|mra0-IS8?eD0OG3QS}-BkK$Rg!T6oyL>`!jcFa zZ^iGyJaL{B3}juF!+c1Qk(1GT9!wAN3?|75MMl)LT1R7M=Z&cWjC90FWTT%wlfiyG zB>+6u0lkEzB#}-_a%rPcsdX+RN+B*n;5NBFszUZXmMYu+=kR5A1Mwpz zUhgLS+-El?d96|Pqy$JwQ(t+G*tj^faz2ot?SNOU3LJ3fMvgee3cwz(4NFid#4)ds ziAJ1@R)-W(s@ZaXAJKM&xtCpVSjo%y&S@7x+^D`(rs!o=W=y+z@c#gcX6ygRs@f|P znyQrYvYXwYC9L@Iu1Y4>ZZV3UsD|lB#V5|HNz>t!8ussON|md+-Q;RDX*+i2&_~Ji z2%@qCV-8lDwei$~FSYjXZ47;GmXJBMU1i=^QJyHzxo~|CQxmWKDrqM-CNE!K`O!fq zclFEgOW=I92J}ETQAvMAz_ZEHV_V-TW+mtxf}AZUZJl|uG8&#%=h4OPbfXMk7!;@s z`b}d`g>1MuzXa```X)E1^6uJ1H}8WnCm%Fh?n6}x{$=0D6kf$4ivHeYL8NK^(0~>4u{5Fm}y{o7< zsznu^4c@S44lqYtoApqbZ}Iw!y-!fgGjRBFiF7yc&W9)N$Z(Tv89pqy)R^@$v5Wko z_tFP2K?8MAS~4sP_j{G`WqgS1n%sK?r2Z-I^L{j2@9#;*Kx|8CYtz+TzZ z2$Oe42+z9Pg>b26Ux2~82;0gTd?02<@2A@ppnmJvcDP5s>oZQ6fS+z$d+_FKMtc}8 z7f|VW@5$NceKm$>gCO8k4MP-8r|8)f*5_b_PD(wS0E3`DhuOXKqQZw^46rUo6Yp%2 zpBn;|)&X{(M;<3&fgbG>D&Gj8Yd@!X0idopQD_6kS`z{nOG%b?)*y%FV|2MavKPU& zo{!V6-`ya4v?KRDnDowO1kdnlA#V))I%fpF&TT~49h8pxn}TZRA@QbAj)C!cVm-w# zz7JC!h#R;0QVSbeUmr*Prgmx<$g8=TAC|+j@pCqRZlNDM^atTOM(R@RaIrkju}c7} zo*s@=dqkJ*ySx;v|FUaJHqEaDxO`VL9{2vxx%9c)iHnB%D$q-K>WlfE`L5A{-5=q# zHR{_)0^^-cdEfPSn_dJXM(ciW{db8Hf6Qmg{VqQc)vDui8*|IKYD|1ScKL8;ylMQW zjagJV0pP#0xpUug8Gil!ZREb_%Y(gjN3fh!z&q`&$7Pz3JLpWzd9(S`s>b8XrmeAE zdHKJqia*$=1d`rcfBx+qrU(3R;=E5&FmN~X`rG!qGI@uB=3!#Qe?~BP?vLAoZU8(z zVCx`Y6FqRp+Ar2RsIevRV8qwrkMEUkpbkmUd3g}KZV(>ackjTPI4Y>@PvF90(7#Ck zF_K_p#o(+KA9Te4Og+RcK_ndSu(#ep25DYb5#Na5fj3?xgx(>(2Sjp0Akc^(;NFW; zF|?)y|DP8Q2WfEkW#}wP*gT2p59s6$^JVPk*>L)XFhB3eQ|6FNJ--f;7}e1@yNXC}o9JPoNQop+vL0de zaO5OuXmJI8nRiU(XiV*WOciZxvtlf=XKZUlY~yTfH%45)V%(Uw-zXeJhY`J|mpC02 z!EBT0SrKh)7M~u)ybl3A=*4-Wzbm@k&@!5Ec9_sh8fVOsxTu)u zK^iaZ9gn^eS9l*cj*;wA5&!2tio++qSr<&Dm;9I1d1Dm3eGlGyu}M(oPC_b6AU;Y! z2Pa*@qplUA>BpiOGlAh~_L!JpE?dKFmiQ9uO1CA+vVzrwzjKaRgCgvlgu%LPaqN}JFM9Ec`iWY?I#Mhtp3&fxbbK`K43JWW zx^qTkG*V1uhT3dKye&G|7JZmIGbI`;%{J2woSE5%oYRKvf0>zYi&(^(1=Gxe_2N`S zXHjB)SFT7aX-Ra}|D;V8LL;15kda(9oTb4^xYBCFV4E#h31-vE7>v${Zp&cV%19*3 zOx4d!kH*Ss%gn{hDiqElHq9!}%$jV-a%@Y>fG0te()C`HEKm8f=|>aSqY3LCa{b6? z9?-M9AH3KBIpMZB>cKfVr99QKH2(48OXlylUg@|o$sVlfy-$$mwRJ@?%|Pi55-|E_-a)dn&hS9N~K?XOATJyOO4x6Ov%eE?8>aO%20aC9LE!! z#>-Em^QcA2l?=*542t_Q%caK&NDZn2$;*pu$}8GSShOlwoGU76OJjUX^;Rnqu_}{9 z%7Dt1X}*;X$7PtuRSLf40OgYMEXh`-D#&tWo={Z)R;{ydYAsu>H(59vT{Xn6T05pX zUKz22ymDZxI&~GNFQ#%Z3xEHi9J?x;0E@Nqv1U{mJe(Cd<{Nk68)`EbuWFYwx>6hM zTOC(bov2*5k5!XaRhMN@12?FzQm)OxYRu-Xr-auXW!B>;m)DGg&X?7iimhCafg%2cEG+o6IlIPb*Hh~vxUlDqe0Xl)oIk%co zGy}0Q;{9M52yNo*ZDVe2vx@EA6jjbAkmAO+e$f(2Z0L8<_Fns1e-#L=AC!rwsd_D= z*1pv=yVYE@1NzizOVQ@g(LwYQ)7IBfbFSR&QVi*NO7^rjq)>)*9l^Q<FJ zO+aJ8JrA+foU_>f*08bhdJ#LT;hMduVi*`=7~2iK*v~k)r@e^dd@@g!C0v9 zyHx2rn&?o>D!ClvIP7SgI2llIs0u2xqx(6~M3nNLqn-ID{U5(3_R0R%<9=?+fkcr3 z{+wRHxB+3xJ`;lOF8e{^(?K}VP@v(Ut^Y9fsbzre_kAU(OQwyc%n+-?5c|*mmyRJ` zhu)8r!@|!vKpZ+Jv6go)DveGj-8X9ye^#SI$J;Je2CW^&VsJbepKa93@%)RZ67j|h z{fEjm$4h_a1V2|qHjGzOBG*wOe-y*$wnL5zrHHO+xwq?={#htXIW{FaHuO}LBR1l1 z+u0%JE%S2>^J=V}ZoIg&zs!F;HFMl}e7yE~yisfd`jbk^Ve;2Wo5$n?-NEpB&4f#w z4Xx_PFC%+RvB`(yv7dAF)6Wo=&&Njm1&+q)!gtcFSi7v8Ey7)Ax~OX_4mekkDw6Xs!P+`TN6Ejrj9l!Y}K@x^GDI&&UklkejV9efzuQ zTuWdPPsZ)Cf?D$lZ|8mXrmk+(QOe&cd*7d&nqe!vK)Gy4%P zP83^{NE6VLlO}cLHhOlU$_QbP#K2q$D(~-xn2GSkM24{Xf9SRR)LrL zp*N`*lt_aeL#dBv)*miTDG}EiVm=gW!vF2`9ucURETobpn>kN6k;Y{BF9lg48a3B+Ww z_%j!PSkn4k?X;E4C9W}<;@MWyHm${G@U9Ms?P8U_jLREC0Y@H~%l^_7Mc4&j#b*LS zi5%KfxKJX)g}11e+d+3R`ir&NGt^~uOo{8oq%^>96IFCHJ&_J_dPu28l1Bgm z>2SlZbV%?k`tS8f)j*^(h2)?Y)Y0MKFTD!0AsEReTcHu}_O=x9l!dl~iE%+@p?`QV zdL!w>S?I#wW4RYaU{#Hp1GvzHrV_-i^)v~kko0x+Q2}2FsTAi6$C6cIy!%o}Ky;<4 z;yMo&U@aV zNApQa2kolsa8b-Eisud3t6J;EZR@-Hm6L1wUAJnQ zg=*<*A){E@BTx^H;#$~S_cczyhUXIpgi%e!5em2JIOE-xK={_W>xx&~_5%rg-hLYK zRM&DfE$Z0yr*7@Mdne)KqHPqd^Q;${M-2P{Pl3{fj_|Ws?-0pyECCMX0C;SKhJ^8I zl*lmd3V}Rjv2ldfn*Mr}Al;vLoHZ8WI>AMN;x1()l>-Z zT(#4!{=MWF^g?w92QCK)@O#(idaQZfzY*9{!w&RXjksBd?zp_&8~l}Fk*9s+lRPqJRJ0cBpy-9^3{`%t1teFoHl6y{PtnR z!G7nAXVZQc705G>mqQdm&%ee#)IS||SrBv`FZ7rMT*I8qx*t$oin|}nAwgKEmjjZ6 z&o^%^dj87pX`m24-_-ZMyu^khpbJS|yPW$UGK@aL54!Ki5(8ygY5v_VOTHj#BBD$d zAPPqIa+WxSocrY?(~$x&kDY>uI%(1P^m^ZTUWT1u7b3GtNn_&ff`|q~vGn26$laPD zv<_PsFLX9Clx3HpVuV}QczR$3p}A<(qi{mMBmxTjJuY-ZAS?Mv*V;0l3=V#bHv8Qckc8@ojvF*9R6$ z{j@=p^3_bRVBDipN>&It)k;DzWmHE~0^{ZNBNyCC0TfwcKc(T@hQ^G5d>NFpaS8_XmvIlx7<+&YoT~V zikT3wbKa8dfjHHIn&{z8?rt3OUj&1hkOW5B|4%QG5dMo^qGC`AaR&p!6!DoDNAW^s zBE{%m@pc`(a6}QW6>zk17XZRaawojU+ZjwD{(!&O>QXY1h$#K4p!oetsl+@@?hn_+ zs_7q{K25f{GHWDC$RKgDYMU$Pk|*MxNNmO^|MsJbc{Lb!+TyDGI)Tl6tqVD# zXTZ_t9bqc~a5f*KRT?) z+pP_EWqUczmp-78i2l?#SsqPcAIa_TxnP?OseVxte{MfH9Y1n*N(c-0`_mORn(ibL z8SqqgovqxTFR77Mi$Y54HP?De?O!;hK=bv_cKO$!e{CoQ!L@icTOn7hdSAmH&(ODn z$hGw7yhys!xBV$LmgzuB!5K+W#0l=S*vwpdU&4fI?h8S5pGYkfKBAEA@yinHGs=_& z5b6nwecS>fi#5{yO8tx_T#_VDKbD>x^6>$fs{P5<@{OLAl4deG=TT{jX$0%93`=UC z{WM$8qxlrg_C2fbI>SmOX?c5J1URqd}*nLt=ofu3woWnI41Zb#bc zIo{VeqFhwNI7&S+OFb)1am2pZ-9P&lZk{~}8@q&XG*3xToKY|6_&LHPo!4qrHU%a^ zTIbSK&e~S0PR^Rn``K%)e;BCXwI8|q)i*uh^K-R5XFYvrzr$x78F))jGC4@_*0gab ziC4RCm?&E4WI6FA-CV6L! znx^P?Yxsu5o}T$e01K*+F=m>s>mg-q1jwZN+tlAu>h5QQB&K0gvmbydwYP{i#m2*{ z_B}X!GA2P(cO(|+e!rqC(cFanIXF<~uHWu_d36hG-I>PbT;@z&A5*3A=6=kZC$q zmM!wz@5a0~JI`iMB)T~FZx|>4_H&nr%NX3&qiTG@Fh#(W4n`uLeeb1c`bvCzp5Fn3 zP_8y#jOcq2aR-CZDWj1{Y}(O|FT9^`Xb{*HrEut-!*B*S(e+9C|HW$tzvth=B+BT2 zs&)3@%-K?8V+kjt}-FH2>zXzcvB2C zOeyfgn^%x6mWQ7XA0!sziBTyqC&COJ;&=qdB43#!_eBlzq|L=411!jY*vN6%&4FBU zHb~<26y9%K#c635b3J+wNse=ayC{I~u$6|H=s(5y1B+=k;X_C3&T*cjg}A8Bp`X%{ z=~@*n*(!UL*-Ur7*P}#oShf-KBxt3g@cd%MEE@j;!%u6>c`sx)CZf6HO4}}m$mX}A ztc&zHV?aBW^Sifd2%}qOl>-wu52D%(V?9OzhP9BftJ)0hR?fk#)%Bq8bW-YP-b2-L zVE351CiruDQVcWF;sa5;@5VyvLmacD@qvcd&O#0nm6Fu|Ul0BlrTm{oAZ?!j#yfJ# ziVCxVaHJ5$RE)+VxiCy3Y4=xwl#L;g(V2vo(JROiNg}-)!?%!6q5K@^p!AtmDFfG1 zy~ZaAq>(T7CYeH6Jxr@uKAFjJ2=Zn2wHm}{G`OumD^m`0y-Hr7I zud^RD_AFn!JKyVuGJhdXkk1uyPMgdf2%pw!-#lJ&iG7)zz7`%hrzsEXk?8h$I6I*7 zy}*_re**8xWs#7I|NZlOhm){B7#UxCECd~`s30_v%)Kw{t&Xf|2r^y9R%i&n9v~)pO|->NDzo@-bH7p88ZoH11%nXS*Sfo5cHVX%l5Gc> z$JeffB3o8-wnTbk*R}2$1fO>w7ma@-Sm^ev?Yv!5!E4>dPp$8MDqFkgLDUs>hM}%K zadz(soHn%Mb+9{kqAb|E^docDG`8`T9f^KkRI*cGQAJJ=F7sLi|pi_w+MbM>T_jM0Bq8pICrlH#zl*crd z1J)q+eSK`jMuyN+&7#Fv;HRw{h4#9Qn$T9urjHZFz*ZOmaB4ep;X!cAbwR~@8<{Ro zC_7dI@18Dk#I$uU=0l**em29#!)CrD_2V8LD$0LjJ0byLh_AMTg*IV82uDycwW7jY zE&@f;W-+RfVIT~H2+i~!kG?OOkdy72#gsuIjT*3zC!B0L7RBWbVtA*@<2D1?+ z)>v5Gml}t)&|55>bE8zxld7o`PgYU1A*$;Ygp=x& z(uGmmp=^`W;mVqYqo-9YMpK?26vWUfAJT_gV{R8GW{05YzD>s5n@pPKzNLSoDzE}f zl*D?s2aq9VMMzePQ7lL?l784tMf-wD3eaOyqDxoz#Vj$9?zgneG%yd|Px&Ip`aWB` zU3g#0`CM-+N41W=qQH-^U4bi#UW80#j-Pz$4On`7xFn^CpQSK@sp_zZO8C*HL{QV9 zQX#$0{ID>~b+xj%AcC#x)quQI*>Y8x@7Y!tHTB`Y@4WV%tRKmst7*V-G_Prl$tnKYcJn8@-6waX-dLS0n+u!{tSv@S?y>#!K(sp+4N;RgY+iEo;9wq zt(`S*J(AZ$Z|GyWT26fZ(s)tWk*E65DGD0;)%kxmm@~+VAt4Zcb{HKZd27VokNLqN zc;GEM)72mma`gYhM#L%ySq6h6k)1pT`7Rl|GwIo4e*C=Lr!hqK<9q+J^V6o$(N2AC0cf;42S)9|E z;542~3giXK+XW3U(*5qtJmT|BPvFxQI!<07`7Ia(H2p_93Lw7*qiF5XqwkC=$S1!|ku6q0QyNvF|CADUy2lK# zB~fkyrKT?qu@Yq}E7b9FZ`t=@dA6xw-Os11VC>_YV-g6GF1*39jo|$rt#WzQl-^Sk z%pGZ~oJL8IiK5TMca}V1T}PWWPsqem>oW(0EA;x1cs8j?4ZSx z@R?kVHkC?&=@pXseddeCzjL{L1FBt!4719IF@&xMMz-Q>`gFex7A6 zuGYn*UTOc5s#|a0U+3~b$Tm``jcG76uE@U3@U<`Iy`jMIVin^GjOw2Fn^B{MVOqSo zE}Kb|@49O|I~MnPdH4dZQS29&Bu|4D!PSrg;tBfdR46ba^e*3 z?Q>@F;asUkx#w{E?-Q;@OoEa(kDj&*E?zfQe<@nG+6Tl*NCJ$!jyI-+)z`WMxHB&{ zk)vMTYS#JtWHro}dy&-!@KauH+aE|wiF)(yj%9y{G!f^xJ0D`+l)wF<8Xo3u^L< zHYm(OJBM^=Vs~(cSk8Wo;yA`R8;b-Hti#=8DFeDau#I%)AHQ!dzs9P{?}uvDhDXO3H%^@^70(_ zjp*{c@3%(>`5c%cHih$)@ZpUOTV1*vtOF|9rPrPk?|N*WZiG z_kFA{leDOzKY{-z_XoV29p{0^^OO1>L~K=VEHs8r?g0V?j#pJobm18$bDHGQ!eD;B z8cc}7aT{ZP$-W+@qIqtlJhAwh*%bOi zb*uo2W9h#BTi`W}jl*joIZ6xa1eDN4?Pb@GOR|nr&}B;yr@)F;aqZxOeap+)-I~6W zn%C=S$k=nj_l63(>BNlJx)iq76~FCMTr0GuE%@*Lr-_QX&qP0ntNoDg6<$$S6i-hb zSLg3MvZ}m>F)ql0i6%$u$S3em-l(k(4Agk8&ZF}31oV^I9I7hjX2)JB|Oz65BbzAs*trGkqc0T76AOV0g6iL#j+-?Rv z)xCx>W~p9Gob6!rxDX^Fp-41=1~NPcd4K}|fJMC(icV_u@9v=Ig-#iKN7h!=so{7CIbr~v<4hbx=4HVayQb0JFgimK)H?Q z>fJAVsToe>P>83dAWKHg147ZJC-BOUrm546abL)Lm$V$pn>I&kBfE>V)Qa#PcQ@Y2 zfgW%#r66LkmEZ-8pw0}5khs%|`)8j|Hj^Q5(a;#r0J5Oe5E>D=MojeiSxoa{)5+8H z4a~_>Lbq}#FE{Q&o8ZsL_-AxP328noow9`K?TV66;3wKbPzkD{uo8ccYXnf+l1@KU zQG*vhH6isqC$m1@9uW%Rs4Np|TH7Rn&Hl3pk^Puo3)Jd>pjdTI)OBWc1)Xz zkM&a3246M{rLyc}BPOn+>q2&osFl!&(zLaFGiafPNp$VVQ1P2*3d1I)q7VQuwDdHN~1_8 z6%EEB;?ip?78T0G(K73x;Nus`^HPfXa*XlzDkgKH=BXZC8BBsdI9V+!x|L4H3I}1m z$t<(UDpU+27teyQPL!$_hl1FkY_e5?$hJSmi`cR0O#7NR6w+!6nyo(s>UE_3(y22U zh~d;<;xGW%tpqwhEuHALS)6PPv1?syBs(ELd}n8LUg`5$X^NB0yk3ip)0c*KK5UOh z)=Ecq>#bbtOa`mCo~vH+0p^O|rzN;&np*v+7S~02lkI-AitH3=^aju}wA^L+BH<|d z`|@Y47X!)Ee2fP>X*jygKyJs6*yYBrFN+)NPk*Aen?*NG{)s)F91q}gYz~VL-tI0h zw9NDX^Il%&XbXZ52yF^N{)VHN1|!cqZ-rroLQJXOh}_eLzBA!B3nwwp*j6h9k&Z_y zMGMhK%Vb8G$I#cYq{eXJqx8lh3|0`te_SOcNDw(!v`FN<%1Gsw#X>HLlg8C9Nm9T9 zStKYEuau-HVL|p%5yc*6zkil!E8*q?3CpM$q*kKJ&y-{`0ni~U`*O{LWC!Wy31i8b z)+QzUS;%b06~<>3YmsQJ>7lUX``F%34=+Y{yog`M6poTOYx2 zTEj@aQ`1aJN6U#ME`fa}xA3XD7#b-n>Ihx(W#??2iK%wf<}AtPQVE8vookp5Qq-#- z*BK^vTpTlAbPE1hL+ZHi@A%O58|k#J_j*-uuwP~idsIVDma?%QM--=VP*1b7VMxR* zr_m2bkkWaC)SlzIk5R>6OX~mb4#1`fVd&UwMi>aMs5XwC_ZpByKM+fbNUNIRvMm#Z z&u(z4_-SjH@;!DSh}NZOG?h`KpR%>7RFQ^{Z+udpZ*L+;IuwglvCKw`NHGbYV5ca8$Wm1k{P1n2wDS73jpY(RJ5h(3np0P z`dz;9Cm-F-NA4*9C!zh)EO1Q@a}a^pr*IkLd)S3``1JgHBWCSrI^dGOG}SKnI;m?U zsOih~>*L$%OL-yHD2nvCLH%2ytHIr{6_T^#<|>sR=y`_R;m1sBBKB}|_zptthuo$M z_P_aY&>QgGp?uTpZ;~!`@X;GMH4ufaVk`8IFq{gst%PCvmZ;9l%=&Vyg zM=2Ht6B9?7#aub+O(uw%po}F-sz=PJ;S;g~*cIv9=x|>%6Jw${FA5NBO7^itQJy*z z$gU!C#F#pCFH{O9d1t$qX2f>*D_t`NlQ9z~Q=c)*xGowwHn#=a_O^J zDvA#EbAasi1012kX4$VZmENWF!2nI!i)o5!XLVfxX)}l1E10M3<0ibdAhXtg1QA zqU&%aMP@(AgGCdTvoOk-eTp&hwq~+vqRNQ!W|DuI@_JO{VzOz56`9k0Saz9Xa*m#P zif@6l;~6qZsiNjF&Gc0qZ>A^JSO8#HlIw}&(40HE=H$oJ|C8RqqGjD_FIN!9f8Zs! zna(O-9K34Zl8f-uf^YZRQ4?xjy9tsTEt^6bCT*+f40%!e zZf^hXDe_gQ?+?RU97T@fHoJUJgk}m}-}T$u9T!L_H2!FV1WuDz!#IVV*J1pd{(yAZ zASFO-tY+VDB0`Ah1@d3q&PyahC$Z}ZzKdttSrv`HJ8)}_**m`5bMgD_*hK&9U-^j= zfO!oK&EIDW8+UtuL?5F+Apc?C#Jf%JKCDgrhRBFP&m`0rO9{p!9i#=|_5pB-x58*R zFc9SxgF_3pLChRsSQDCfSUO-jl1W-R0eGKGFgFN=&I}VXw4bo9A)E_RaQ^}n8VFgO zjSwWH!&HM05H)Fr0zlh%mWl(o8x07`lyn4IhqAPvG^2(X%!$M^1}V9cBGsPh0EY@- z@i}qf@S)(k_g~HhTj-Uh9K8uUfTBvs$>dkyiF+y z4!_u$^}#CiuBg2zR!Vh>;pW7A6r+=9@)>=qR;GjL&NyYRaZ{%ej#4~qvDN} zlxFC$b0l}+f%sMB%=^omh!>O!DQr7Us(sl)Y{v>2viX@PEcXIJ@k6t20>Yl)p1bY_`t#HCExP(aW-&Dmp7nt2GY& z79PhbnqIfm5sbLEt^#vf?{z>Q_$B&>+dMRhUIABDSkq*P?rDCt^C8iChC3vRn6uFR z=wrn)zh0NY_1<{;`uyT#=92X+g+ht|Cmqyo>5Y*>m4ooz+N7KPS~rz};KfE|2)dWr z&wCdzM0oSxg8!}C=Db_<3(40?|Mzj=`SPC3;(!E!%Wcs#{o25QO?wQ_m7X9mpPR!< zbWFeh#Idi)bJkx!-XD#8CHeQue8UF?Q)o-^yvusapPF;DzzO%7WE+H7rC{oZ2J16Z zpcW9C4a0j>Fb_w{t1$CtH<_c4`XEs;l_*Kf0OZjj)Ca0D40%jxNJsCKu+++uy^q7y zK0?6NGsgsiWypOP)s%*Z7*#c-SuNSM4Khp93~`l8(iN#o_A)5G`!Hp_HSqbBWoWls zmaa2sJDbDt@nJ95R;P^#H{c&8bB1e-K1*g~Uglw*{->hKG8C7s%5pjo`LP9ZuJCwe zIhXH1RZUYnYdLbj3szMH9hePVS&>j=S6$n!tW@4KZ%|#^TGY;7U;T)6THe2kCDmA2 z7tK+PtZm2%2nS}@HuLB1*0$K|`<+Rxew%Pq+zdVW-imB$c;0qcMp4&#ZioFr@hFe4 z9{M}W??URKu5_>$Imqmi0z#NW9;nCItfYc5+e*oX1iA$^F{nv&<0 zN=-VClBXD58_-(B&Eas*H1MkVE*jk!@JxugDGF?!ewh}%`N=oUgZ}2zj4$4s<~dS2 zH3E7~nfQ@K?azNlf9Ni_k1iQnpiD1+SC&84GGAFAeiHpp!K03 ztecprBt;#}Sy8OMAW+ks(6*oJr>=Qees{mQgo|o`i4Ti4`W{af7>AxNA{ly~ zrxrJHOK2gHCo2_!~YO#E_bcitgP{$mATz;ZBS3n#8h<8kpKK zinzif0J8K;C@6|3h%{-fgLEc@Or zDb~0%me5#Qj>r66w80)Sxr%_G;5-P!o3S7Fu2li`elF2{FN?}JSwZ~T1w9C*WaQXp zD2wnK9Hk1RZ4np+i(P}GwR;)gYAJz@k`psa{<|7Vs38UrhC+ZO)sKf+8TnRHDM!&I zeaKjh*GhY|vA8!3LtMZeBZ+V*C7;WDadeJ4^}E5q7^9{g^5y$^jx z1pozdDqGIA5WuH$roJrM?B#j_tSs^DU*FeSxuUT@e3z@^ZEwa7*H<&7i%etu_Ael79Bn^Y&;l;OmHle}~J(=)eajnLL=!&%^5a zw|)69&gl|lzej?RA59D1azTqs+1>f!ra}M0(P%#*;opyhVE964!*J&j%`jek2x&El zO}tG*u{{szKy;q`J1XzZql!Y=0^#%uAKD3bqshzQg#uD&WI!HSe6qLj8QZ)Pz z01tcj*TP==6YJi0Ir3;Aw=x%IaEgYG?yro`Cal1;A%`(bFO$GmX9!HT-3RMet^7(h z?I*MT?uHaymh0e~S)SqdDRY)5iaKSMEsl3}UqwTf+*aC0J1bHpnoU`=I6>kS3Z>u! zk4mX6+gZx<01!IAaAgM?`5E2& znkLeA99Yd{DQfFF?ywvh28ch^NR2Y7;Jp_1>}Qb0yW^ApfFj41@zB@3)9xqx;I?I4 z@Hq^j;i@OFl_aWGHBypiE8Fz4zmrJKXp zNSf4-h5)-^T0HZ zAddSK>*i$BoG8VA7!iZ{M|w42t_Qu5+u79eS3iS3I8mn=Yz5P$P=JI@RNCW*u6>us za&$1&T`@2{;Euw!{$>4c4Qdn*{pr5!*a8P$ObG()n`?QuLMPT`w>|yB?%^?iYVS6k z6x4;*zkjX!vyvqm$U|LGp4X00)BJ7Zq`rf`6yKE@Z}{X1Oc@*9*KN5_{i|nSKW<_F?v^DH z(42#Lg$mFJD!Ngp>q0L5OmXO0`Y`Wif`|uA(LP4?Zr3ITpt#Tgc9?t6lbu6ngbGnJ z3#5r*4IUqE3r=68^kg2_XF)`&bZ7y3y(AL!$eNSE_i+F@Hj_l8_R%6P*$g~Y@3~k# z3mZ19L~mHHfG6JGVHbN-NKV+K zF~NvYk@`2wu*Bn4qCJoS@RM{%TIULEpt>hT+@_%L@7cD~hbNqD{QXT{5jHh7~uJaJad8-}}ZAdQN+#0i)w&+Roe3 zkHM^}+;|HaqdB>h@r{!t@cGP+xB~uiVX&P+bKmClP~}7Pzu|37Gz*ri1X_}29a$p zlsuJ|xXUJ+R0J{pF{K#kw~ZV@j8;GvVUbvp4TCn;r&!xoGh==8$-=9`a0HP}k@dBo@U3n5?)v`D+VNJF z&ehdAi2UxZ?)v67^v`|mW6kBs!H4|r5QJx2ZkD%&(rR|}@?u{~&A%(Y$~;K6+(JPS zpE;q)`(5&Ie4<#OKjEi0abFB? z^U5_eYBSr*z+u(8H#Y0-M7Hw))olDwau32ERiFl|U*kX6DND^>a+AL+|EMy6Id=71 zvXQW@S9&(?tXJ6vn+>?)GfRXQ@uaF@ z<#Imz%N#Rp2ag`bMEe(RTyP zqshKi?8GEO4tE&dTj3Q)@HMgQ#FCt66h%rz*o-78nDdRqC94oi_okrOeCkX6OrKf8 zuPUH~k*Z}SZTVe?EweO5Q~9CvyJyrGW2Q!y()%nsJ7J9UZ|cIvbfSB0GIU^46GI~{9Rm#AAq?H!h*C@J;gT%w116+ogAAtfY>$kJ;!4|<0E#@Vlc==qliNb2O>$l{nidIX@^3v&=Oc%FN+G2 zn6;U$(eU<%!|2su^R08HYVq6($X}sJj1uzd`ESz&Ur{Gjs*BSvw|!1se2-Qe_Odd+ z3b|CHShL#XW#!u%h0XvvXiAkX0PfY(g}q{tYjNlbskZvXI@1_;)Aa2=rE;yu6k{j4 zBCU3{%bseE&MVa@Y%13&eDYxL1*FVZ1}duX_L%AF2ANM3 z8)c17sw z*_t;t;A&c|<4*b;=W{Y^+E$xR&SWnJmDs->klLTio*X~av|J%rpLe6bTs!O8{zLPn zzg#P8l#tj|xNne*7WQRmNfdmACqo>| z9?}0!1lJsdhQdx0e4BtIB>eja_p~VX`v_3Fug?oYnd7g< zL>cm$RzNDSrqzvp3jRLCD5Kw~Xwiku8yz>#6OohHRTIC&?fTf7`JFeT`6WEBPx-e3 z7^YpeLun`LVD9{9zc&TtMDJFU8GKy#J?*esw{pqYn-5(Q&)hcsFu?6UKq4mXr!u=a zLew4Cs_K~Ci0AWs{rI)FsBjQ$IHGYLF`-k$^_ccEnVYi*@g58{t;<1{n#ZdNr^^nw zuS#m(KNp^Jo-Wp?p1p5jVupWC5A@Z-?t2;xJ03>+IG$)-Q1dA8OvJE>r~Rblw{XzA z#gX}7{@9>U5Zy2?uFiCT-S8IKO}7NrAHXYu$irhF!XvTQ`6Kxmff!I@&<)ftoaBUX_7DN>w?MLsWG2lL8V9)v4i-3yvI@*mU_tt3uW&x!i?1EgQJgk zRa&D)&qf^pciKnrD2K5O9-=>JY(;&17eM+QHH;4-AQa6#gnUmvPH1T+h8s|WvLy$( z^{}HY-tFM6-O3USI>bzs?NFTO4T<0t$9@16fl-cRp?IM9aPnaql4W_(1g?ZnSrBSA z0UTxKtC;8{e}*B{QSlmwq>v5>javASD&Bwx{;)YazDX}N=1yu~TmWbAQNK0uTpB1m z7;w3!WFjup^C#{pzn6XO zzf-mUDz<#Wd^Q?f2FwB2Jw|FictKfc)B)m1D^US_g=DBQWo(3P>LEu?xlh9VVwEJ* z{&+okC@P=$iC3omMF?KvCLfB!0ohE0`8?8fMmdW6={QyAw3if&vad%q^y{>8*(sQ0 zlq_e`EgMV7(f)Pl{_m;af674OjFJOUgc!Btr<0^Yi)dt{q~dAnBZv7u%^wz<4h4Xv z2&L2PjYC7QRTQ#xxUdGJ$oSnJ8SD4u6X?~jl*=8>l~RdKN3$#%%ES}iI2L%dB+O5x zN`Ca<(jzFJ&1T9JeL?z~`3+o8FEYz;f%P)@)66g3)l#Fmj40UPPl?ns?JuTi!1Bb0 zy4nQVj7Sn{u8D0o896&WNv&Q@wnrlqReo7((h&75nnJ95X4Y@aajjA*z`5I#@M7`Z zK*rBSi#lWc4%y76i5edN!-e4)e5T7t6+&veloyI4%SaQB zj1^=AW-J+|j{GCzHWnka&^Qz;7V%4)N(Jo=e%K30c~OG!FGjpLiDUDHIGI6bvmm7p z%e!o%l1#gXZ)~0E{B+q{%~QpFM&728M&B8xEAxeaNJ2c7*;AB_2!dq2z}za$bp$b^ zkO$#e4(5m20unqELSA2?Ac6EyQKG2v5q_ar#!;>xx?Wj+SjHE|LMBO4CJDf*FE7b- zWIoKx4S8lhE{o1!wx~!o8D%a-?6_wlua9X{sE*rEw5X|y(M-f2=eFu@n2MpUZj8oD z8v438n^)b`@2oW5w8Fkxg+DDTbV~dkE6Ap4%j1Eq1;(de1AkDE$qsk256}MM?2N3o zVQ;~cqx0l!m7{|uTFJKi04uAuXX8wN3=pY}FA0&T3%(4xIj=bsiUmDNQ9u&ksWUQ$ zn)HscyateI61%9dA*xcwt6{oD2ggy?<{wuB#P|?Ef)8YMoD{@Qsvi|;e}^&6Wv9$T zDH|GfGs*bdI$%y6gYA0$&CWaS1?2`HLHQ9QuL+Ki4LEe8KhU_+8?HYhu2|FpYgc6d zvxw_D|4#PsiuGc@>n78r3jZ4y4At8Wy9YM@EgGSk=4~&f&K3<9G1%Qf?kaWLA<|C( zTY9Bi*mi8xxZy!q_wjP@M*~YvICTq|CeC3;tg4_yX(9XUaaB8(?2r1nKOv{BC#pE- zc@MU7M?Iyg9hXBxzNDMf)Vb9-=f5e z;GHlz)-Z&WGQWVZt#GxhV1kca0nBeT!lWUF5pikK0i0jLLH;HLrJn{^=s6>Md1#1| zhou=J93r$>X$esR`j8yB$gSTMkmaKeamN_NAe8TTpQXuhVo68Q9Ga30En=WUXX6di z10i%4iMBfRWJm&j^smB&GePI^aYdsLCf!6OlLT<)uGtS^cR_Vca6)0#E*($$sOrLQ zVqVZ5#N0wb&vrHikyai)MAuJaG9PzX`U7XG0FDWvQ_^26KJ`f1RJH+kt_Wb2NG7b2 z8#1PU?DHZb{QtU+P|mo2=uP0BxS-y@{YPGIIL7@USPYhHj9*N^;lu(FX1^Yy%-Oa|dCH6pe5aTs%`Bbh&IN?MgZ|r0lRRESqM#|A#xhcjw zm5Q%cbM@wPO;3WZKh~=~58g^;-InYOy*AYKDb8>@D2pVM>r@c9KA09#(w6!rXt_V} zMeaFuWBuOo$M-=Zj_0Sg+qERv&~KI8yvMtrC!3{7hR;ubXz~G%T#=v*Q6_bGeUAI4aT!XiM%u;=aYr;y6_aeWlzK>TZifmdk69+o4Y1Q+UkQ_Mjm?pcyRSbhJmESAk6CORp8iCh zeMNW(8STTS0_M!V6}a93qH}bIetarTfJ9ns<6@@pWId?@2j*Q4()nUK`YQF4^YHP` zRpB8(ccKO+bs+uyQ(~pSk@w2f$!QYxVvR>a97SbzT8Y5MSy7&0qG3t}L!@zD?x2cy zLEMUsXHkpx>D8RB6v4lMy#EA5}4{%qJTaw7?340vcC0clf5$>B13sA{ox5iY55| zgF(!%x^rqh1HxaDm02$bP|Uj2>DBHA_n8^)E&PBVqKnL=KT1NWKNjY(QGX!z zitDD;{b^__kSmop^4FwJ1G~QvM9s&=%kVc0el#Y|^CKfY%nzWBkuL~hI8H6_WwAvK zjzsNU%8Q~~_(ZKkESq2&NzsW4i>1AX6(u%HyGN=tCev%G&%P-vPT>~Z0hTOLwBjT! zn7O&U&Yvc_RN8=}lC(~F0dti%8RoAuI;(Y6Qf+~7X_k4wXL@R3&@SUs-GL98q49?V+e% zR#2~fT)tlh;hw3c@XVv4_C@2dWnDd~xOH_fIhkd>{?$rl?IiMpvwEgJBIREx@#nY}6c6Ace z^;|z>+m5gqDba&RE6m=7iP%xoT_~@7*+X;G&N2AM67#a1a*@RWfwf_+e@tZw(ml=- zt2Z?9+4<$*q)_t@?s4upR=)}8$+#1-C-QP?hYsgyUVQI{8DR$R z&vTMiY@ao>JWZRHV~d_p`K=q?t25a5iBwQKlW|Y3ySC>wZ;aeLXDiQt&WdhYv1wOP zUvq5GZeDkbZQ$SZL1b^?x2%1CyBaq2{;%Z@Y+4#>2JYKyMwHF_&Q5r8msvaXYE9QS43j@y3-qX-BT^@atI&t=XO`j_s`9->1O8{fGPiuAQIh+ z=ODa~q zl)u9XB!x(#h@kf3CQJv>iW~1}-HH?96$EfZ2_qta zVcw}rlSROV3-*&?XG0|zd({J9SHW-{(gxbm?6qimf=ItFC8M{@L|28;vcLgAUJh0Kk4=O zO>`t&6O}V@Ma`7$q|&Tl=8wiB0bY1XAlzbkMGHl(6yxM7>pgJ;l2PKAgp{U^J?77? zV`{%N1G`wwIUOuUh@o@ouj2Q_QN>jd-oY{!S!qbaNc=uZzJ|;a$iJ!%pHTXgn7I)p z!RxIM=a4d&B_mzRzZgF5^7cCW0P;cbC>^~gprs+}4)eczQ3(=({(r-xoPJWFB{Z^T z|L8_Uz^2h6K7;{8l8Q08LPFl4BDs*>BQdyWIDwPnFF#i}mIh^-+|{|>p2!lHQza8@ z44lDIPoV$2Txc-|QBUODl}Ki8t=tXZ{+o@OEvC*EjTZdMj9sPs6>C@UlySCJc|bN< zar%dDmF1%2=ZBYy?@FD<-pXWZgY`S@`$p;X7g>!1J^&hJ3$Sv9yyE^S+IOdHXqhKL z^nua+N_;F8&2nSy&gqk7A$4j=6zTQxWKLIS2!+0p1y3W}>O$1&=fe#ICMInIy=Y)I z;LkRb$d<`HS@gwP>-I(*wA`vBc_tC_5pWur$}h|@pz!<^huQAg1%OEIwEIl2)TpvW zKL7Uq#1QAT8SF~svw!;goiFK|kJ+9G2;yLGBt~4lq zJYH8MJ-L1e9`RXD3uq`g?lg;~x&Fw4Kz4&NqAVv;aIUP75LZyVD2!6-s2~-AdAzLf zn1leUtblZ)Vx}m9xx6^zIU}(WTDMYBS%*%0QdP5}XjRh=ldi07=_R#R?yFZkkxArT zt%94Dd>C$=L;gAXwKgdKv}r8`X2V1TXiyE4s(96n^P(nfO>0eLgUwqJp75=cIV|FB z#|XhTO=q?kwH?=bS~aZ)u=caBPxlXO-8Z88_H8KFnHODG+-5@qE@pXO28Y^!@aR|& zc|9FOzy6$s(6obVsK*Dhet0a&`l^%3u)`6Vq8-y|oG$mB(;&;iU667X2_iEJjGkdNo5D+)|D2=I4TAC?k-#!;F ztn~oXA6SP#Z;aZGFry3ak1M6v-S<-3vs?GGe6a*23KK=AkIL}-@6T)Gusk_ZrzYJG znnH6tk2*^Kc%E1)i3;6+h0OpXa^^ zR%#;`U(j9dSp1x;G#@~;Ygb42YB=}qV=o`iMAOB1uUy$v^sXg7lvg6S}vmz!wbo; zVa?Q8xMWCSW{@3O`4HZngj6j*`j_2NsxF$yc_2D<(mQztRc`BK2r4~KtAd&jcM>;o z@g{IQD%Q*-RIWi7-lL7_><1-%?W{acH03Hcq2o?^Kw+A>Nl2^S+0uA&k39a@yYvqn6O0Ol1eP}Fi4pkDBUjKS` z$9t@v{szUCwA~_Bw;_JEM1{E6CaDC^iY8Ntze>K|eCkZ2Jtc3oS)XCFIC9)pzQg19 zmH7!FdqR)%3kK<`R6EF^4TV$3(;HRBu08<#5exsmo~) zo#R1Bd6}ynN4Gx}iO+7J!%l^EvrjeuFYDE2G$4#I^ZR_uAdE=t54Aw?LJeB)Gd(nu z&v|XmU4JMi8~Xcfq=!fB3+d!h zP`G)#KJ$^ey{aSeev(;+03<`cLU%3|QRI$3`ORoLovww8J42=s7Ni7M6_QcL993b` zT^LJ9Q(lxkQ`A#T>IQH?Axv$b3gcu2EvSGqXkKi%ZgH-Gp5VSD=bq> zRU1hw;Oj;OSxUZ=^7YmA{W1B$(F@6BMIYy`1XT9XmF~tD!p7BKvCJ~rBvw8sS$`Q~ zZnth=6eqJOpMUFlioY({ZPUCtY0p{@OVF=roz-k-Z(r}MwCT8xV2S#+&m4c=_|SAx z+q{YVj-wTcs_N`3I`+IR4WP1*3?@QuhKHzDsq2S3v7CEG7#i~HM?uw9j)SC5faM+= zrR+EYpO;ntS73LdA$L{AnRvAtZ?KtS-R7o=&Xl`S@P6{O$Ib_HS?&((aZ*&Q!j%bn)l&#k+i z*Z`wxUN)bE9}2tMn$x0pGc5A@^mfx40}Fl6QQww-KgteEU@Irk7OE0vnxl?U*K9xf zqk+t{{WQcMU@l#6HiRU0fB|qjM%d^PaRie4c=Bb=;Nf&|w^InU^I0_RqL0W&_-d4) zPx!}VE`s-siwdB!cblp`{sLw{^&j;@Vx2eb+P-r4y|unx58GDTU4#itesCCZI3Pe} zM~nAIFptB5gHHQ{9Q=U+ua@&og z8W#k|I}V2?kMqJd4vb+2mJmhl^$)WTntU+Cd_LutBA~$urC8fWdCw?8jrD~`GpvBX zT3m)%bSFYv85O^2I4CG;E7Gtk9N(M{s1un%))}XfXjzg809smkNleQ}-DG)7G$P;K zz{my|rMVTq#8`MCQ#O~$abC>?I6dx=APNlgVeLlKGJeOS7f>i1-%fDq4x)c$(HHa% zmY6C(%qJ_L_%X7S zY%g;}Yws}QFcpZ?MNdrX=N+dm5m3?9nae=42;w9AqWr>SJ9D$q56WiW7^L2iv6v*o z*StJ|7{HUY!^$8r=^o}>kqBPh-Dk16g{ZPdC1za_po*Nfs@gQo`8_>;6i4z<4S*$P zKiupKz0|AtceLXFRLYA0SRD`26PN!_*(i*Y`rooqQ5dm;J-LEro?INUQpLR6mC0x_ zC)L{wfrb#3OwhyOyl!2zTJByz3QJkproQQW>Py8NW=%M~R>5_WpA6sYWv5Ea+fqL2l-pHjurZa}Z8qTXqY`>8oEvuIpy10| z>fpipBY-5`qxvQCC>$vfX1{=X=u|Gy*zq1Gzyj4mvy{Co|7%Ec2Aaz+%(lKyvmmv? zx7i_It(FqaU2AL}T#n{CJn@~M^vr+wH-vA>I<7f8ZdUt0tP6Mix;butWBP1YGn49m zjptN8^~V0b^!K@dVwzg6Pyh8HZ4Ceqi#)1beb?UfzAbJx@N9lU*^))TLdEszBrc;2 zC}biw3dF;4%L#gXu}kGe#1}?lB%7pDAi$WxL-TnQwbL?NW27Pt7(FwBf(&zaUF1Qs?>nYlU~kX^9GrMxU`#CJx-=DKF`}eLMak@b!0E|1dsGUzua*ksY|_jY(&ZHq z7L_%!H%w(@BZ5}tO$B;K6&;<&7FC6gNtNu=l1gze<~8-zS(i+drcu`%BbOUyj=62V z^1aKnVO@0*>TNC$VL21uO;MU|J;W+HYfJJcJ8k)%k!jPmUaw!?{-`H(-U{d09?ylz z^P{Jaa#ygwA74(oe}ISxG&o3BxXne1=RnO(1i&jA?v)*Es%W zwaR%CshC*<{!^j%TN3MrZwbq|#npV8Htp4TYd9nCyH`GUvAsW9cD!EaOJ`9rZrP@R z^3T3QOsgF^*Nc#tbxfhB`mNd<$T@dX2LB(EHAh&3T2nFuN&;^~@n{b6i| zy-_1yXnQhn>|ygGuZ!by*_=?L!;2UvG8FB&WsV3er&G16DF-s%^4~g8V<#?pkH@}6Nhvu zQJ7*6rbZMPP>MW0uQofK`#h4hT)+ksBcDHRbkN@%&Q%)@<>)u>bgfsTQehc9y6sO+ zsg>4H3T6FT?O9y++WKsi>v)@9YUpwN5*R&})@kyC+N(|SgU!*jdPB%yjZ^|4Z*V~v zw&bVPAc9|?sY6H{m$p@?LZC1dIzl|^h?g~K`EcwhTiZU|F*-ZZ`1@|#F(QAU@8cjT z@@5gAs$0+#*qNCq5~;)i?P=7x9MkgS>EVpKT$1j76jfNkeukCpNO7u>A`QKSS%y0( z!+QUSp4Y%gh6itQo{`eYEcazh>nep{EtL8@*%yF)_i9-#;-aw7T6eB?F>pEG8oG_Lt*@ zWb<+<;}<&5LJx#-rbM2tL#L%UEN^B&A}UgIs$vvh`2}Cw{QRziZ^JvQ7I^w|$^6=j zZ$YN)J@2YwJDbbAgZA?i&$^3~NZg_a%c%xNSo0PxV-!zk?@p}#efKUl{yn?DxAxhPHyRMqjME)0$0CyId)O zUB{&!FnWN-dAfG6rlowlZ{~L9?-9k!o)IsHsA>U&U+u!{Mo8W8NoCQhOGIMb^RL1G zQQqfnUw^ahey!Pe^tWEOm=ACP`aLm*iUnLu5u@^kpb)lnQ{Zm;qIDx5Wd92T1gok&Qq*4v3TWnWU5b9<5Bv z79zJHuB6wymBP7%%P1wFsGD?^RPnAD{r%mj&SZUxUAH+qPvaQ%&1@=2fQ~tEMA2kW zGX*5^f!m>c?7ir9Y6<2(PsP!w6=g%pXd?mpLaQo&%Um{JSm}%YRw)D^?$I<{%El}p zis#aFoox#ghnJW4dct1kKHh|hIlxc*jV9(Gy($y^oj&c)+L(_Jd=okKWzTi*) zp%hx1MmUYL#(z6f?UR9R4oO_Er7oh6*^EY3Ijt^wfX{*ZL(xCkX*6!@TXmRpED@Jw z)Xo<=iMUFkXnPfR8%1jUCgg2Gc z^&fsN6|UYXEndwTe@QtpfChzoBdU$tJ1O;1F!P^#touhbVF-^o%q ze3FBe9Pr4}-;bfjl}bkqj&^`CxKnT-yxn!e3XZz!0`lQE>G zSY|$+r_gQ?J-+|>ak=5)UdB`Z)&4@3F(OrWmV5p|u$Mxr0qKXLllX#9i@ zmu~o;-qCDHfJTW1{C|a~Zn|Ufp&0v}zaY-_zcGhW29kS#CL*R8cM2jM`-yjgDp3J1 z3*~s1)IIjg5-f6b7-|}ZydFmDEl7`|AIpkBQWVEa$|N1ba@ta4EGo!UM6N-qP%Qh_ zXK*({Pg21w+JHv4IKhOHZamY@!>l{YNi;=05ENcenv-*Lq#$WOxQv_qc|`yx2k~^I zG}jNAnE}wNGE530?(Y~R{L!x&v*Xc&%ETigOe`ebfO1HLGJ3z^ipt5YipuP!XX&A; zh9(m$mc~iT8=+#weWRE@08fkec!Ygr%~g~EO4Ys5b>_x0P6l)!<2X}n0H2wwz`p5 zS;!lHKKrl(@bLB5nPy}@etWfu=>GI--b77Bepwqk`xT;<>nZP&L*n!M&+8Uc*{-Vw zR>rs6p=5BSwIic)=D*tK>_5vP zKXor;V|#-%HW8!_#X)iE0j^MEB>2DVw7mnz5Ag1@sC*x;Bu=QH@-~t;v>V2@6^_xp zK@I3t2s$$npmJkLlO7rN(XB{sw?N{7Phs3C@kF0?2M`xpWEmtiBD942Uw(n&u;CR& z8i00)M?T3)6=_6Ud-;*&qRKH(eu2|<-Xgq29ppUw66>RE3P!pUWR&G{aY))B$7kx2 zarqMO>4gY+hK@)Wa66_8Ll|}rMudI1k_wZ|z`3!4NG!;k}U{4{qwL*T4^f=_IH6xuzjI+U-CbCZLA2be*$3&mb0mFeL%U zn+LRkfTPgcL7rwB+ z>11;G0^>e79BOvpog|oe5E>i0^DU;0FA<^1n%C}#8NdDaRDqk!AnNXVr8HnO_1wwzTj;#`$YLq z3$4)Cwf-W^d?%CDAIVDId%m*hk#xK4UB-|z&+GCpKqY(^pJc2Fy*}PMA-XW?CBUXl zDR05q?4*WA@p*S^Z!(Zd_Uuhw++dsq6)1cAzWj4>#JtJSAL)nJ^57PSQiF+}pH>m| z9~V2b$%fCqcN(MA+K`z!>~OpPcBy{H=LBnwZ79L=y0bqR(1?6)zI_b5yFM7IG}NIK zx&L{A(&TC<>hpMabJ{m_oEW-d^Su?0FSz8dz99dH{+&@_dmPeQLUK5Qz#Z=ZJKh;o` zpd=07W@InJASb;zVC;LVp6<}>qJmLh3vF(YC0&yupJf`E6DJTP}NtSW0q1uK=C zHUx8O+VO6ft2$>%S!?>Qjw@<07_C?u+5{u3s%FtyD8FD<5luF46Z8+Y?3C!?0<~w- zwypcBK{YKWO(*Ov7YQuqlIImVoWt@ z0N?~huNy@XvxBEesFdSp-KIk@lDlDT|T3}mqbhMZi;cK!s_@=km^n?Mm zAMObr0peG69Hv9DN3w&FDco>lzI#~2B6^(fZOSxEkrkW)BEZ6=^im>|?`W1CrS$E$ z45O1pGP9|g)16;%bH=V#C#U-K7hCn=L|xJ3RgU|JzFmau>wd21^Jt@h<@M)7&2?)K z5W+9;_RMI94H4ypWO+LhcLg#;$9vty9~L*~;GBIsNbtHw1AH&g(MNGN#5;yi_rn(e z3~)gW#3JvGQ1Zp`G~IH7krLwa|MsPByHX+G(D=Q?(t(AejSf;v81AOg@&Xk-rYf|$ zw~6ZAKTCFEMDI~|B_!*mcddZveNh50lE79R=gZcWcthno(`03XBeN8BTc+aFX;usM zL_(1xJv$ztGJ?bTPe44r8%$s@$McuVjyM&FluK+E-bpKsQOW)hDV3t z7qP4k6AT}t8oDW(r@5!Nuz7i=@d9Cub9&O%G8|g3qh~O5OxN`(-Yrs3EE`Df7u-0nU7IZt@_t@8@uQAuWL?;HounLE7vhLbsr{PZJA)$ z@^4$5Pq=K_Jx|;&I-8n}?`Juw_8jDe)&Rw2L`EL)s6{y*{6H`im#EI^%lMCmzV|39 z*$0&OX9RHu_eT}A8y@_%L#m#q_B%Q42OWWD?d+w6l#dtv_`oAzL#qG*ILLe6aXy0* z3-@!N&*zbQrJeV0F!bh;^P+Ea_%WIn=$9s@$m{w;dm|P=4U7 zSDm*n0)2kA8}eK=cOl-M`@-{r;4#9)LCp3DXV=+?RPthIs&U|#jd{=9Wj!xkrUTJ2 zsgGn)CGa)veTmGrk*O|vL4$GrG|omZp6T4A{#0`Y3P~HOsCM_`3v(c=2hpfl11L2x zLeLBspx$)LunWQ>4R?cy-7f>VQyg4XoD0qi7-dq`9l+ZC1%&N~GMs`YQD(e5*wah> z4D}8X(p4tpUt44ZS1w~r=XWTjQf0+tapQjX$&;Up%L^WF$GK@isL~II`9gN15z@`* zURVq%ALG(?R-%E(;%no!zR;H!jWFw@C1{VT6IBF(*|-3K9u`T5FX3qU z+4zt7f;^B0NDU6_Owqz_DZ4Wg$ zF%D=+9Y~;;K`XYHi_9&MU6=VxG?*`qMk!O#Nc_4~Jx}pT>-(`xl}xkCPdz+qok-J> zx8DSLPiMXwW=ACJrPQdmzf0ctMt8L~3_!+XpzL;oTc{$WRfvHUIhq@#aa979Iy6C3 zxg5*@`ouLjlEj8FQkC9-K9xruM!CMkwGvtOruM_>{nvq|dbSuo^;O=pkv3h#lNV&X zqcfuga%%GB9zSuGq#$PLoH4(ljJ09UM7cO^&gS#guSaXL!L9+DJ*nhslwV-ihiDas zx!yv#+dzX-`iF13Zhd}g{Y~WsKgkc4Fm%3^ku(h=E^t7Q z0FVIUft0}rmRVOM9L_;vQ%Oo6`M5CJjkmDyxFS^2NVZvqoj6_(RGJtFLbqw`gan)! zDLWREX*>lblSzWo{q1t1h9VkmG9OmZ4zbQvS#hGc%h8@pFQEIP1G?{MmJ@=EI=UOo z9aj*jFe}OI?Pp@hu2>RK&+*WkFU=){CoRhhBD7?L3oEHRDDZ7#VnmNuRb(ni{dG57 zR_I|`!H-as!Ax0IpV3`ei||a>Q-ufF9j|W23p%MTO7W9KOd6atH1V?Vw6Y1JaEjkWfh3t4sDc1)yo(-L~osZ7nh z{yEbvta7090U@}ji+BrM*G(hTEPZ?rRG|iZ@yyu(zC?~?S z^d>U;^8!9lQiA05`uW01auq}g&h`yRm3M|33EM^RtpX60#0_6lBM5q%07qFcZ5^-u1biGkktT5$8mW^Fx;2 zLLgb{zL!w@thyHM4Q*k*SKHO-p=^fIC z!$E$y+1FYC5)dw~pvbqAFd@E6VAG?ZI=Yp}od&2@>ES^CenLW#BpqA0f{I{mVh(7J zQNdzVIZrd85`sX_lRl)~ip@QT3#NYgjeR>J7Ps9Fy+n6ei0C~PZ7GR(7 z9*H&0Mp8M{N^WlJ0Cj`b+_C6rntn1@oC%#o@Wwp0P%e-eNxbosLXko$f(>&&qgMIr zOg)(hz|N}HXxG$|O0h0(NH)sQvqGmWY>w&}PR3{i@^_ZYZNWmRXKL-1(6#ZEzX zV?8VGc(M>(=6bHzZRK9lLKfDt10%lwL*WJOgAFI*zl&jPu|Gh}r`7IU6a4j~z0mi$ zma(FPQSERhHq_#emxtPkVUsVmnCQse`ROLV+Ov7-^K&ar9t$yvX`X+wKwe$|=<{}7 zARIE($RC9?aVr3e_tuCA*M%GGPxR&!wK?$z=yV9V>@9ULia|?W2)0X$N!ZJ_;jM78 z8lVpP-Z-cyR_tupG?ow^P>`evEsEk;AiDAK#GFSE8Ffvgy<{De*8UWI1Xyt@Qjo4V zk6D8INczXODSH{(j>~(geqjP1(kJrL>CLU{kM{BG2bt&r8L9k3j_%oVX_nuLd-w-i z?s*0&K50ut!X!=0p5oLLAfK7;oPj1K7DQUXTcikFMIaHyxT3_j5lAKJwq<%DrMY-O zjaYHcXmO#vBy)LXZ7=glRZf71Re6a)(6M+0RzGuHogOD^^0J#G24``Xuy}^Y zj}gWz>;9`s>_4#<`8sfq$loq=H{g~IMo>{mA}%$N2_xn~mM_C8==(>j4Y6F|NC5e7 zqenO7LiyJarJSsE$33}J8q>+5k(m;yEd0-B1dOGhGqjM&y%MN-e)z z>C~D_558PhE|g2mFkZQ_m@hZ0GMH%ldZJxtGL+zro(x`Tv}~{(So(gVQ0E9s_%8eV zht^l`o2I?{g|e;I52pn(RcW>QQOMk6#C_>JTLG<-2c&}Pj207_La}$s>NlTe;gzvv zsy$xmOcwx!&gGd+mJ5jQPg1gH!X0+X@&RyyX?Q(A-SFNVg-ScR!$CW~2#bzXfpJ}a*@1fi8~Ud8%$vu)9Z?9JlB_*x-74a37QBEqsb`E zLHv2dkk^Z;$Y>pslT=m^d3MBD6tAdP<`!zu#z>j*YoxqL(TmieEPUl}(WuBXO=T6r zyq*tsPJKk5cna9Qd{*~h9Hrm$Gp z8owI|Sv8H*_f|_x`zYCbfzex8wH^>A+15>)NDqJeZJA%&c?sL%zp}qyzn-)2;1338KY~(}eJ>IJ4~`)UvPZ5?>W@D-M{qNvaFIA) zZ}p7x5Cx4+@Sl9>ouoID9-rzrBWM`s^)%v{EIS+rJ)YGjTt1SpX}QZQ~mmEKha!FOEe;KFqyUUXmdO@SU(8|GA}Pg_nl+RurRID{{;iG3gO zMou(^uG`N4Jf8QwHuPRy{Mhw$x-O;$ciSCl_jI|>G4<_wQ;tgXC(n!gu0JCm=ZBx4 zJwxDf^E-6_tObe0A3=^Y2ANOYDTf4w{$s z!vpL-xR@s7rX;2IgS^Ma(KcSR5(S#g za}qMU&5AjD6edhf{)=7-#fgy!O!~+DozN%GN+Vk(8BdcQNtFL7D4@txP7^G_{ZD&6 ziC8pCv!J%tX05OxzLgEc`L2Kl=xn&FQs~t$A0_RS}N5xtKD@BT{<&mYo*C@V^D;r z*_N!s{pZ!2NId(ktU$B_UN7P=25^y2e8{X&+wHcnop+PM7j~Y=a zDHH`RsPZiiD9hh6x0f<=15h?)yoh3Vh79|F6m`?-TAMq{<>_U`#r8lvgEnP*>*?xr zvD!1kt-kmpnkI6_L&z~kK`G}jA%n<0~+ji0F$fOe23xZu8@jA9P>_Jjt zQr31{n%}8dQPogj$x?~=5@?{0Bxnz#7^Zm`t{?N*scNYA0iU8AYUx*l06;~(X$ecI z>dOf8*bmw%Nvq?=dA&%iW<2Y$>Sh^YPwSSQ1by4axr%o7=Ccm~yS%-kVb{8`#Zuk* zTk|#U%0@5!ac*ZW5?YiSe(*Bqb$uZN0t{r zt_i4K{&6`(O(x|yQc{q`Ey3FSSU=7)2jI>82UXXT^o3Q9(;R)uyc2ok-cB5f=fVqK7okbw^ZhOKdkd0K3`s$Qa)X1 ze_Q2}_I3guzQOGl2QhB>V>bo^`FR{EooO6Q_h95#Wr+xH&;1r(Zy}JO_Moax6Ta*) zLgv4X!19>(14-nek{x#A<=_N^TEWO@y}g9{yTP2~VVKV^<@@lMw?dd2x6t_ydx-+< zU1_qUaBbXrA!qhrkq%676DsP@*6m2cMt|Y~)EMr7zA#LtK+^AJiBv$e<0#BjP#K7J za0dasUzEgsP+79H%P2bK9n!JsLHQE`tu5ERW3$xht(OtW1=v5_IJ2=2Hf@*<|~G6fk?2jT)L8i@}*W4fIENZp_k zx)6)-;&&XWZ~oy0DHGu|qzMY_?>P$q3R(hq!kL~cx>d+bHI910>;q@6d-{)8y`+cI zA9(`_y1To( zySp2tq`ON&K#&k-`JVaC#5Z&Phy7c7t>?M#>oPWDUq@zA%ovZ${AE1+7oqs2lRfhZ zwOF_=NYM&6J_{+MNCcT}%2DVl`%%t(``?qE{|A7i`fo85(ORqdbyA;>&p*rbr~x5d zcFS=WOmb)-8mUZr^G}Mw2s%zDrg+TV!XQk^T#l4l)7}JTXfH8=`M!9XFyiJzv1{~xewE?wn$wi7=QVFScQQrikYfT0F60Cx%KI8-k__Bp8QPHLG1@M_Nyz^DBu?(2| z#<+-XG-4|d=9C9WHEUq@lVrQr<}#EhnAS+I-(-iN&8%~Sy4@Z&!DV`<@miG znH9>^=Dpna%EIw~X4hNdnsGam#u*T}8t1I@$e3`1bnMaIp|2>+hdw8(Cl; ze+}1;m?eKfZM^a2*0mhm9bz$JT652QF;DbsPB;v;a$5}_^dDYB{3SO6|FvL6k*n_@=c zLE}4=3CxY<09UVs50c4dGx4B*E~ zzNB#h_DJmZo6>@=b_8*@c2fhJyA2bo@#~F z4tQh2Jt(r}JmaCcr?umJX;$@4aN@&&qD6)JcjHJ6TlR>svRn359oJh(vi)pF z4if>K?WhPxZ2Y)P@(15u!Us>O{WP4-+k>1FsM`@FC-Y9Yyy-{lZuOW@n?%Ekr~8lA zINMeLCwnXKGoDECe!oev=i$fKJQBf^Y7BCIvfa3k3^<2*T@!aF{M((BZ~IA~Bt8ed z^}O{?&l18pZF=f_xSW;x6Y9+Su!o^~zw_Z~9q}#9%$fByBiSP$(>~hx0k~8TT-gig z7(uk}vG(Q@F(=0}xJj#D!HhjS(-I-QDoz(krG!WI_@mgz5VrKKcP;uGq3=@C<8 z6b5}0A{-0ohNdh1jdzl|t{Mftgw zuXq|{RLV5!Y`-o4I+>|98d2bM|3)u?YqvFdC7xuvoI-T5AHjHItlQ=+4=TgXKQ_93 z5ii9Jnpw6Z{kW0R1YGyM$C4(@xm2r}psLyO;srXlRQuy;{8fL5-8d}9intwU4qf%l zrs0b%a>V#0o z>F^za7<8sTHN0`+QbD|VXo+!}Nhb1s42o{{0X%{Djv0q8*c4{Me;=Wh@PcJ9f9a2H zY@X%C0u&ywf}!U5VJccjnbCLj7En=tzJ3L+c*{OrYcL5%E1!vu0Zxh^#>XWVC7>}} z6$+fR#mk^3hu_m`Rnk#A^nu`(Hs2!+TRWyvUJWr_miVbu|O1g}; zjX|$ZnCdrF7+D&ZQdgK-XG+_C@b0#*d>7uxB|qaOK-)R%dg7v}?iT1YtnOidR({?M z*>QQ@OG}UXx-SCv!LAqkUbbcc(J1}rAo>S^L{6$W0o6`+=Dga`qxy6OHR?1E>`~eZ z0O@``_fLSw4#-6z&!oT=!M_hP=ASEq-vBzYyv3YU zjZv>3(tqXcU|0;Pnqw$sqR0@bi0O~W#o}1snOfgs(+sCj+N6fZUv5uE2=Wg?MwRFk z;`uZ$CAYm zh%S#6V1?^&WGO$K!-Y6BYkz<+n8qElL8X-%Dw@tyyEClU87Sz+1zl;nKVDxW!av_+ z1`vtLhtJmi^)@?CnR;t{c3aCkWQvjYw>Pa@R#6MOk9=<5Pd=cmu$I3rc#3aVBf*AH zD1-WZWzaYa>W|(&Ka307Ezieibo!s+34`@{QMeAt`~~Fb3<92X7qtV4?3*)#$O7po z0zN&%CzFADk!%=**7%zuTy4ah;v=1HFr^`m|!gkkGv>BSq zOOQ<0AIQR4tbdS;UpjFt7js9uQFiCYZ5xynG#IDSTfw*>jTL3lPz@FvQtck*#emPE zz{R|k-YV1g2_>vJKh@1LKelufP$cXL8H?*9Ez9znOBuQ=E9bYZ{AwpkzqjK!;vnR>xuL)t+4axI|Gnhq%m{4#zuL zwT^yd4Wo#OdF{6ogA3NHWQ~h?@w!er?>}VxLe_DP;8-+>`r@}_24c<2)=l3z7wx}3 z$#X9|SFLezxqGc~ujRq$ajyHlBmtL&JdXa|cva8gy<{_%0dNV};>AMoCvg+miPv-E zD=u=FJTB{-KtQNA${snbQ@3^BZzk<^J;(|Z;)8bIMdMiWsy%wv^`-ALz z1velZRcJpMq6O*YIPR$1A1cCUZLqUxdV)U>^hw*U*GbvN@6Y^5Cm$}kjl9@j0E#l< z!{rlL2Dy8~ke-LazIcs_Bt~Yn`Lb*6FROHRqZ1=Suv1CKGsvMB?KAMk+K`U(M<(zQkn9d{o4@qO(2wAqEfH66!tTx(^rwaHODnqDKg+uF zCwU9q{OT3@BLg@5Kmg5c3Ww&(;kgZ+uoeB34`zHW6552&ZOL>H0!J=fMln=$Ip#mq zt9Yis$r^x7BQO}fRT@-g4+i+fh64=vZ?MOEVkl#yNRff0`8@j>P==BC;eRq@0m`uV zON(z1hok>auUxSUMiVe~JN@Y$Kuh$W=@pJiP8L%@FREI+=}?+f;=c8?_OPT)y-v?( zQMdx$c3VxKa27h!ZfZ8VVv$uEt$8k2C!F}t{t#=`>(3-(S?P^0)f@~%0*=-@+)HXV zx+ajg>o|fx?Qn|6YIO>PTvB1?N*>6saf2#J$caE?d!GG%ex~SC61orH$CK{5mj{{Y zWWUe9jwEqc5q&w|I*Do`{jJyjKmY?PrNjWzcKtqx7my)eyHl`z3aObQlnzzXFz|*& zR|9+=h8!|K3=y6ce*k_Y4}`N_1caP7i~7M>v2?K^q53?cq41Tzw|vQeVC99wO`B6j z5>qtqgkd})QNeI105A#PABuu_J{!Y=1gzNXg2YYooq{AHe*zi|;|nsNXx`_bPT_m}2|yQz=(!7NltoE>UMVt!wV5m|yemWvL^y?qz>?5lWk@$S_JH zZEL$-oIW-k5}qFfdkxm?EEb8R#kt1=rDfPugJo66PhyrOg)9lBrR8p04CRKyd{z~W z>#1dxa6gx=6zYUv%N3gL-kereTLKVSw%YSi`bEQ)-o_OcekGJm-{<|!JI5T%4fCcz zLCWmHsMNe2``o|fK+ClM|ZFTYl`7M|9)){R*$oJc&%zW*W*rp;`YdIOTo#L=P( z(eUxAnFD)CVYs9FIl=xt2U$3{6Nh<>wtPF0LzpeQaPL6xO4EF@S2E7@5;K2Li4lXJ?8%{v=rL%sW!T!{zi>H{ zx$3ch(UV^AJXo3n0(z;kpVm~wy5((6x6@KK19%2*{p=G#FI7yKi?M0KHWVg(i;DmP)~H)FJaq?0|DYy2Z%}C-W))00R;_;Zf_5^+T*!0IxLe-v=l9 z|Ax&4TxayZTxYnTpn%Y@P~}MF@R-=p;E=easOY4$umrgD*p%!%-^~25+@kctQvZ^Q zP?_4=YCn;tCV!>2wg&XN`p)JSzxIxXZkbN>K9SbJ&XKW+ukF*_vwh!&#;Q3tHe#f9 zcGem;x59V#_A3rKw@<$RIQ+R=%6`iptMKPfIusTGRrs}VlpkUoo!YSUMyJ%{qYXAs zHCeC!^Ei&VAyx|EP09nR4TcFo%S z(L_p<`Ei2a1F39QGZve>tK7L<^(3c1t+kfp<&?~e9c@#w8(jwk1VTDNpI)WA+|WP- zT==&KqG;8Bw6)kB4#j*_>CEOkKk2ViJovuW!h0yuFG<+z8Ei&)Zh`A2k|mUb@cZXW z%QHQDk6ZsavkkJ_BS|E$vjOfb?;E`45AMjlP5NKZ_HW4Cv0!Qwo81uG9ZY2E+LrNR;2mM`)*wyUavshVl z>6I8MiQe6Kg;oTUSXHj2oj6Iuls&X}nN9`qAJ&z+Q_N&?3ULE4w+ho@UXvH4r@sb{ z$Cw96xKxYErTsLqeqLIf&+8+?nNL48yHl;PVa>C{QDqKk0!c=LGeg<#4$^!lH4ig_ z2a`&&B4L;5GvWyeOZ~$aK?fxOldP=VpIE=FLJa$Yq1=C5=7g+iJGG3gZ5gwyssRC{ zqS{FKt!kTC%7)SBRLZ&=7DTMdP*?4>kzh7q$ut}04a>Y65gkvM$+tp@2wM1)-C3%8 zN*Vi_wjyOK+Ygt+Sex(OkFj<%-Hq9H7D4|189k}Lno(kGd!(LdgZv;2O{sVnC4KL( zmyDLH=1N<=f#hTo>BAzFgW<%gmRCq@`BJgejG3s}wWg8*%;FNh78m&wS+JVEpio+< zn9vpbsL~r>0>b*wK@G|}>Rp)+c$VQ8Sj7wJ_fQbG3JxH#`v65#v4Y-~1*e!DxI*u7*R>91`%>U>F3WoOrTT z;0I|bLby_fH>o)0HH@GQU~(IzAhn$r^%^_AKU!2oKR*W5)|fJqZywYbg=t(cW5h|2 zp|OO_(n@g(*hqNsu@GL&1ZfRd6EB(dW|KIexhWI|b~_VsE%bhqw6~qe!s+iPU8g9# zSqz7={ZiGj0^xsV7w1-Upo~fQpvV-z3MBETgNCsk)8+dpfT1nCE}v4N0MA{qM2s7X zW$_(#YDoz^!QW;n<6Nuni{@>&(aJU_pcySgcO0nhvjp|h#{E*ps-g!Vj)1|`wiX{E zG&-pmWm_o+UNOdsnjyWi@)yf|E7DCfde458Z<~&lw;Xzw&A?vGYoB5N-hN)n{=jF{ z-}Pik)zc04()g_B_E_7Z>k-!4zZ)W}f8KLL)Bdpw{jH92KQ@lor-56&@sER;I08S1 zkXgy?`(ToE?8IC9iR+j+X2ZuOxVeLRCh^0!>%PJ_P&hJjjsSFY?PfZ=oxsh*B^?w) zw|-iRwxWJg;4K;_R1~KocDhxqf`dilto-wwh$3^{qB?uVuUT_i%|~ zJ*V?}z*!OQVLa}`vqQ7D$44w)_eLAn4~X4+oQTgc{q>n>@Sk%4su}#W9|GrZZ*-w- zvhS2qv#-y)kqmu&@!H7<*_xq(F6Vv_O;~RfhzI7`6jQFG)LZ<&LklEn817T%4%WH#OxH@2B#-i53qNVM8JBi=pg^A`=CFCrUX!f#`@5@ltOV#KQ^s-EgHZ zDWz#?6akpIwqPuYkbAUTT5WS8oo??u{P5BwJDY6;m)dR4c&31f9xS6AkB7AMt^N@5 zUl-QanOR6^wauRlaoMfRfuhDKYn^#Qi3!mNb5AoUYBabf8S8aW++P1;#5`ZE_Wzl? zHkSBlr#T8#cGHvWwZ|fnDF_9Z*4fU+h^Gy(C9APTYf9& zZux<)&1Iw7^y%cWpD5;NqbFe2L-&E_Vr4Al(le9q&MtBQPUA^2^Hmh+Bc*|&27ZA1 z4cs&|uuCQO zLem&lib7hQnd;RJkV1)nPFE*V(<}h;E(_yWnVE09aYJJCv+=5$uGEQIwj+D7AB5;l zC5>O0>?3H{$L+^hxw&E{8+1}p+o+{#9%P8wr@*AS``*$>e!}K7dmb$!ql5+Wc|!$B zGyp(RNWEo&?FI6A6#22oLnWTwxuvBsGJHy4TlHi)RG6-HO<$b*s0_xhm0$oB_cxzc z?{sGY(oLb3rJaq-BGn1#vQ`v>ZlR}@p-d-?OgMm#4;=*P#uvM>&jGqIb$_5$FL%^@?-nDCx3MFPGT8+>yg$V7(j)7I>Y;i--zQqR@Laeh{RskyrPIqGJ z8wAa9oIOkFazb>sz3%H4&S=Y{5en*$3+LBt1J(IJ@J!aVH(l z8{UXQJS>5vwkcrKFNCrigCPcpWH;ZP_tPBKdACEsu<0l^%a)g`)C^tfBm)E1eY-Y} z1o}OGBa{Cm?dH+_Fygu5!|od~){ZN9wU2*(Z5d~MVPEC$>%ZCfO40e7G{Ml5p7V2# z=gai^jmN9=53F9#mOpL)Wn$D@+1rDnuFk*ns9*bL9d`kF?(2P7kJpmXmpM^1Cq@9( z%p(jtQ{@Q?qBt*x-(KD-eu3HbhkyP$2s?4gn*-{H@=gP+r|gJd`)@It{zlcqd2a58c`N0wbhS&*GeKdSO zLjCevg!dTMT|Qm4y6bu^<$^HX6cXOwm*`EFrTK6O*2gjAkwk(PxXJSfZj8 z-yTuqdIK`a$kcV}qpFr{F&WlWbma6hvz!;Tjb!uddfL? z|JA6lyk#L4!eT!S6d$~h8fSbsr3=YYmd4E(gi~kBO$jPf5%^CM+F<576uA%A6fOCk2lwwlX1E-Cx zR%?B%YEg8q1fIw{sa_b38fLzhIiJNjT0NNPAb+T`Bd4t3cbyZn+)vr&OjuOQOkG7n|82U5SGkV>VQgNKlJP zj;dJsMq_O!&T1jv=)++7?Mt(-u_9qKf)gAgbETSHfv?&wPL~_Www;5>p7}gyl_eA(ia}`rnk0QB7mhbHwB%dHM zEgC}~JQ5cJU&7-gEN&iq2USJLGZ1s$gAh=;qOK?JL?Tk}=1B>oXrjmbAqb(2B}S{? z6_ZCnruI@fro)MPANkA3QbCAUCkB7-kXlwB#j!w46W!I+i)c>sfZk<$X(Thlcy}Vp zix9z^4AAql3tya}#2_BU{tzLFCH1H<8kUc~ zATP0$4!*kgNoERCKVu2HAt)#?80{C)(HPyZvP#w6Kwcu;upC}mv3P!a98IWGGMZlE5)-4M$18oIv)5k$;9il4wy;_*fq^0NJB z&nqufwtmVp?b-o+jCQuM=WWFH%?y<#^6c#w{>5hH8PMmgLs%&(r- zxEa0SI>$HtaN>uyg7~umy`*8gdB*fh4>uQy0A_Nv9mPs_y<}AXM|h1N!}EUk!$+aD z!<~x9KigxZ50yoHKQt=|ki_&wesp*9Z$^>r1nWb*gnLMh#c=TFAn07pJ+L!p-pJO2 zutdMReWdKby;C27cd_U8nfGUMTyiMkVK?l0MFw>#P(7=XW}%|K{fA~%hFv}Nfh)Uj5yS%87Xs}vBaRfI^wK|Pi`)_Sc zN7`Kui1T=>3Dq;Kz#^QgLuV2J5V!NI_(cw8Low8C`LZn?JRhC9s&0%-uTpgvBX-)O+CbKIJaD zdD>)Iy}vnJPWm|Bo%v@_?0m~lUSEjL|NdsBZ2|v-(Bd8UR#KMd*)MKVZw6!}A5Q{Y z{0$!@+kBv1yjxK7$3`h02qeOu>kT4(L7p3ok3DDrbW8Z#!Q%173n5xAf9E!>hj`&^ zzEXJ+gB_bY&v79H#!yCF&3xx-5F9mn3rkN0FGkn`8!OY>yBnn_A{`yCs;6F%;Ln+2 z5-*`rvYQ|j*-{X1%Ho>AV%Ixj1SOr*q&4_7%6lN}v|gf~*?Kx+mgTZfUo8B^Q^`C% z2sXM{<&79&-|Kjl&>XmAKK)Ek^57dUNU>!oDaw*aE-769B*Rdg97=dpS{V4WOb3O` z$#|>x@5;zQbwLC8RricfPDK+#!AT|L_Rgxh4;*Ec?F@h?rdt?HbE+nYa%9TeM z5C`m)SfYq8M>wj=KaP=~=&*gIzfWhGB74s4AkNWcz|rc@N!c(L`Hdg;rG`<)`22{} zPQ${1|Eud78F_h5gZE|?oC_cPn6G(_5lx)f-z}7Jz0`3A4iGz0R>r2K&tdM)>o&4| z&a2#5+NYmWIM$mZLema@@32VxSldkzw*9^rXZ3^WAkzKie=AS@I~&8Jl>9ds5U$yb z87azxtS%j|0rbjJ_~h@Fnq$KMPpqnr$-l6wu~`4Yst*0%Sk>NtVO7Uupa$>B|1Yd+ zA4LUyiS?3y&rBgTz^bkg+imHkxig;*mr+b)QWraY7jF8vv!AWKVB1^6@k>TzC5c(T z$M1+xD4aXraM1EqTY#Jk8?@i`m*F)drXB8NEHaA5MCxbXg(|C�)#{@6U$p4_F4% zoJEq6;gDXg7rLbRSAglQVB7oeE3M8qEZ1p9=UdOhN!2q}e_iZPBCkIUzWT!V*|!_n z@T)Dc>&>?@9B(gM{<}Aq-?;TiD+Ramo}REcM!ew$x%+$&`Es&xuBp{PFknIh&lq{~rY{;c#K50aK6xqt-|{zdP!!Vd93KjnVSPvROgaNINX_AP z81bkSSp?Fu#Pbo6UjzyMujQy z1XM$*R{Pt9X(|Q_ed!KvTuRA?u_F^H=AKTNX*QiHvgv)(nnf8fn;ETcu-ks=KAIlTnSeFdS%Efz)Io-!6WiOVMAWmUdU6pVC5b6O__5;am| zm2D!MWmR5~dr6V%LB6tzrfr$H%J!KH#_C>d?bGslin7z%ms}^Ob-n1aN;QK@VW;#9 zq5Vu%Uqz2=18Go6frz;S8wa2>ov8aJKUV&E zq80=LYHXg$;SbUz5Kw+r&-;bwf)_WCdijD zU#?AGj7alUd!k5}Z8+vhmyM{hSG-$xL?k_Xp=WC@2R=<`ZhMY#nYY`VE#z&d5p#O? z?9Dq0(Wvd0=zV8h>}2idkO;%}pU9lq9&lDbWq(@NW^n(#)FF4hd7|TeA9l5dA(%y^~(+17Yrfj82ekHt2)IEsk?=nN%(p^%tVV`Gw6yd7-sS)+ZaOvqVXhvgVl5;DWJMM{&RZGX=sG1Q9_1ZoD_0D0Lt z8!9XEg{*#Qbn<|}K3A+ok_mc#${G?4M**+A<@2ILt{cGWA)$rssBD=fx0Br z5AhwnnpAYGXiyo2#JG5jA=KB5&9oh`&H$L_WvS)w=-B=cJO|gg=IOjKA2Q`&V&3Zf zkvRHyPR6eL1z(fdrG*4q7!G6-g+9RI(c@A~#!GV2z(*Hb=0Y@TCKp?Og{fB=^+xha zBr;9=M$d?(9?u+qD@Sg2`g13Kx>!3jiLKU_Xd~HVw=-Ixtwdvfzl9xX zMX=nN?86}Ov%UbPrPu4Du&hR&VyPU^rVx}ut&Ziq#)Ybi;lzlPc$<|1c?_|N)XxkH z)eRGc6Ti8BtQM_Zo1zh4+c7po9C*gB9$(DA@_SB7@~1K5Y$HbfsVcPC!!?S0rie8- zUO(;TOwbqOLo1o(q}lPL9>N#wvw{l zo;S{sdBgg0lfOgID$er#V?h_~N79m;8>*T^qYk|fc>Ru;W9Iir1kZLeMVNHUFkU#- zomyT5?|yS0BXjF73h0|j9^)8^AIbUeWYOo0RYV7$6-26B7w<;NA>67YYOiZdp_o@@ z52RW(ZWgA60XDxW%$2?w1`Bd-5t$e8ho)H6f@Kr)FfXmC^Y+nnrpMhaVzxO-DSS=< zp^RCs>yM+uJV-%FVRk%W>u`ayY3V_ss&aN|DJ$sjWf1j0wfd0O&y4m}G|fm)m6o^O z!Isy~TQXJ(9P(jS;r_m3G_9RvV5%7)d=67P3QJU0?I{fG(CzQXtgF9bhY^tN#%e2} z9_Gp(Af9@{^tYW4y7#wB%Dt;>ffSUnn0{|1I_tWcPn+xTPA@xa{SNAU9oOqtcCAQt zW!3Gd7^ilfe<}U_X9y3hEM$H<-NW!w2DKwA$EAIve8JnbW8`6S7bA2<;RIvMT}(3L z&Cxn+zzR8DJIOzE%08h2nZTbEyY%3glBpZ0pR`r8Y4{dloY5eQ;#lD=JLCVVk;d5S zqJPPZ8~7nfbiX&wYrF6MS|AA#bXqbm>TrUyX?u#`T-9+$Yg{u)%eYzhaNfPy&_Z1Q zwQ2Y=^9Co_9dfgmY@ErPk>a?1%a-j&GI(f!J2!AtbnvR@xaivE+# z=355IY&Y=7*?W81u%gg<)LOQFf7ab6)P69q5h-vyS~uxI+4EM>{cz?WQ{b#)g{<@U zB#v13?SZ=*0F|78ga8YOXE*M|Rk=bBi#D+CzjsvyJzU1U|6{Gx>9ZRJbG(!F^oS^Y z_pQnsmRBEksYw{7wcBUMj|_&Y`7Qk2S6^lJ505Cl{@97pWFJ91+bjuLuX!pUF*t|% zlqP}*%)bKCP!JIfdvVak0vOZRo+lg7i4v}32ARxmAtBF*(qv->GZ9m;f`hm1)lURo zxlwfZnSR>R*P){MxmZ!j;#uSJ&&H*U2&cOxxI#B0C}6gUbT0h(9?5WB`gh>LV{1Ge zJi)9f2{-X2$!4Y_UFRrCSvQATp2ZUQ5>pZHxeW8su;GRoQyD!X4NHOYJxR^ZE1Z-O z3AgVtnd$lDq9IZ$EHjkD>q};f zl=5VB?~0G}{E=%-$My~dLLFO>Oh zoz~COS`%fTKQ46QJ_z)DQJLY6a8}Wih8GpzetRj^6^F{|?s0u{$X>=e_E_wGd27%}iu@;o zqsIr))N$1Jxk3Q0FS233z8^Xv{1ya7K_e#s({y+*k_bUxyefnA6rP45 zP}nM~Xci>Env_sOb)5cYr9)dxQoLOV;8LFjyAGt9v?3R!izx$mn8NfH?W=tVVKJ>g z_VQe&2iGs!Y~NJX;v6}08SyMHuH(bJAPSk1tVE$>=|Xqg(cqGor6-kRkH@Fg zI%4i+(rq;LO!z?j-rp>zreE0tlb>cQ^0MCj8Txr|niAwnqMNyN{hF|{c{ekxvK6NK z#J2qcTdk^t;Ir&h(>;LjcLA1CblVxWz{if8%+#~ed*7|V7EzFE+T^Rpb(RHx2Rl?*_Pf(JV69i+8YCpsTIyIi`Eg0aFPEFzYlpr3~!-l}9@xRojIoM$0(VL_3bDJT82-)r7 zf2vJ^>MZu}zKr)@sxt$iIy1J|rK{XT1I5J>%jaN-XA0N) z5}Bdoc3ZJ2{4Yaw>A1Rl@zRRRHA^fP8rLqlDluC>pY8t{ZK~R+^WjCM5tuqR=y(1( zKew{TN-^w1`!X^tS#EzokN+(KvD>+MOEMl#y=a@0O~*QlE$G8$r*Cw9Lwc!K?(#F0 zHVcF88ZvM^LL{?N0a|YS3 zW4J1#uali^_UG_;nDDuPG`YAVX$ zV}v(M-V8)@!zWj!7zDy`#LQ;>P>f1*)i73+U~+CYdyV*@_lp{;Vg9(9#`0mHu3+mK zv6Uak<*JTJuckt82$dkAkByZ*2KzE2v69vJcd_==P)%%KswBBYc+=#^Jz>)XGxYfV zRGCKU`7}cs?xF--!xZXFUC&>8abHHIl~PO*WH8~uzAX9;0JhH;*cdMla;Mwhfr;%5 z1p~7$V58>8qN|k@B*_#U6=rxo!C4mPrMfYc##Mr*LMj-^mgmJkBTBJ9qCW9>L52#(y;Ya~h?rDv$@I)LE`_i3OXS6yy$U>8@dx(ANB{52Gf zKis+>Tiu#%kN~H?h6&NV-EJ5|()wZq->Uu77;@LD-8kk~>rWF58>=;AWPJj)<3ftz z_E0~LH4dnQ*sIUbc{Sb74QR$|-tylZbte$@{k~t#!buBqLf?OgD4*9}09OSAuh-XP zN@?<+mo=<_+UL{Qlc3X@%7)G7b%#9=IIV#4e2MO&Dk8Y>6_p)u^JIuWM z(Q%*2dtMi$An;?7xa;nOtN(HQ*TRbb;I%of@$k(CJGd`c$A6W8I_75yLHFx7gnrE% zJ%wMdx?^;b@5Fr+x;vij>Ac_fCOz2Y?n*-NTmSW}+9)NoMeA`U|T+#LQl z8OV)fi23xqH-y68*CrZA3KdbLk1!Mx#Jjr1D*`z-~(xB;ZmG=b@s+OZp^1URV=sMFoBzuo65HpMo69f$%hUKp-$bigPKD zqA4dxf=k5*9yx$Y^i!nFdp3;ZeyZ=2zEUwvu`!Wza8$@_(lS~X#3^&ehdj4~Vk~U& zx$PgQXkBI03hm=mj*O**kjIqK^Wz)jOi1in%ILw9j17Rz7`w+&y0KxV{7s?9!V`Qh zl{7SsWVhSb>=z|ZR~)uvTMqog*<8TzAk-#+?20vWYWAfF7+HT!h6ty zGWoGlHT_HsG+F-t8dS_Es2}@ZTtK(CC>$!ibo_9%e)d0^DY|n2;b#Yw04Y0)fe3td zdmT;SLyd+=N^p$4F(FIj5!`mAzt|cN;Z)r=E{QXf%c8c(#pR37YbsLwT$sxDF5%rf z`&v_7f^w_Zfo8pd-$ff0Rg0AcRVv)xoxG3K>%zw6Z#>nkS6R>-I8H26uXY?ueHA*d ztyk*4Hu`e~uUezWIfum5>fIZo7PzBKAGzvav#-QBAulE{11xampXJYuPsdv=WI;a? z%cpKy%*m_I+Wc8oJEh36ND|7>YSLJ*@?^M6u6-4?Wv(L5Xq~<`+<6sN2aqv4SL5l=1jz^i%Pl z$dV}lz?D1$5! zm{_qi|1h+wsAz3fF0Y*&ovtL>1y_;|^q&mXz36RaHT^Vg*5wnnVodeJ*L*hB-`E^& zD*Lx7Dx3S_ttwmK!40Je?{>4Y4bpM)1Kdm8D_c)$iK^P~J7rl}uGhn=I{))qSd_U^;Dbgv$SYuTzHVl<(w9S-C(s%6j2PiNy}sw?jqBZMKZ z8%O@LtSsdwQ4bdaL*(P-u?!u`uul$(t!9{sPHm>pMCde)pTbDP!!37@u_uo!{lVnwVS zt!dR`&W3v(?{vaB#|v&UX4C&A$V`PSOt|bs-u!Xiv{1L@flX%YY}sjd`N1uk+ckl? zU(-+0hFU-Ny7zk%KR{%oPH*y~=>icD9PnCC{v4*2J;iW+7=4uFcg0f)18tk=ekx735xsPETozvoq4cr4&TN?CD>}M!tk!PUxM=Bal&-?ng}KQw_()R zjh~!9$_*0iC5rMbf1)({&z!}*jDk&OHdRc|snZ)vk zSCap!lnSDse|sZL!#M_hey||=iByv-9)|J~+wnK%wpi#((a>>?VDh0*Qq5qUkT-eK zL3D3x(=DQR$089`D|PxEuqOOWeG%5g;tv(W1iz3_(>aC@U2Zd9XtcTDs%&ie9JAR`)?~BM?0tf+ zpuJcj)#YV@AYor>zxN_poA?y~KS`nwhy*3x&R*<+QfkyKliO8)UZJAN{DbN*%gBnb zm_h<~r{l?T?X%1!qR%$pdc-lf#~!vD4!%lDX9;z*XdX_Ns5YU$xaa)7(xUqG3%#@T zck%96oR)OXm;1}@wXUF#x-(d=_^t1Sudul3sisT5jYq}?s;JbypAAD9B8PL|GxnNI07nHrUIgc|3vT56 zVKZf<&||+*G~5!1eu_~^L!1vdmW;(E#OMp+zo}{N#Q@+*e%ygD?_T_Sy^w-fS*;T3o@jgM;gf#QjOeP-N_E8pqBLu;ft z-OlWL1D-|Ocj0wUq91g-iB@YZi=|^WZD+l*l`Zr0W#2p2_la1YDRBjQl?wo+83C1D zE~^LeDgV3|&FH+k2T4(~qzpA7EkBNX1C^!XU(>x4B=fnjm zAb=k#Ae8w&yEb3N`4?x|P#{=|JQu8674pro&<7)k1tqYhaj2x9f%u+3{wEXJB#6Oi zI>04+r|~L3ZnxNXe@!9^B4iGo%U3BB(iZtf_qlW-O}jVnoydD+2^sV08UOx7n*_jF zo`Enr$!gX?W=rvw0B4!OUVH}6{ib}q;mZ>&x^*1rQ=6a_iLbtYvonZD`f}1e`QvsM zhj#D_dAk^k*>#noLAvsW>NnK}8>xasMg=PgOgR3%L@0yP`G}bk70X0c3pFOQohC$0 zKYTjA;6T=MuYmLhxz#hngV({g*}?B=eeIsx?xd)O^karc_|1M(*7I<^%lJR4l@|x3 zorf`APwWsLKV$cRIWQ5Bpv_Re*(%CneE5Ty?F~^8!SO|&;ePkG+m!Afg~UT<78l}g zfQaHYu;qs(LuVN9(lB{D@aFU4wij!x2ALG?q`4Za@U_Trw5XF|e#}FRV-mJ0_@TNa zM3Yk!;HQ9s6C?&81M%VMsbc(zLw4ejXen(uh-a7;^l~SL4bX0!m<-`Q`IGE4%yv7+>Z(QEt_*aY>MY|JxFYIU5L{ z%MSD8x;xI327E+GKIaX%XC%#=R&}~OtHHB2|CpDXc70Wq zUAO)RUvJ@7b=bD)5{pJ+fpm9Ci?l4d1q`}7q(lVikj@3t-QC@>=te|JIt3{~N!gF{ z?U`?mJ+t3`fdd|X_kCa2d2X0+H}Ad&=4Ih*RGORr&AjYKl-qs`p$8n%2?(t?$SB7S zp4mj@beunR*%W8pm8F%C&wIs#E#Ll2a{8nPXHE5Nkg;3*m!JfG=f$pulf>`EKa-t* z)`DWa&$pgEh~FF#S=?VjEMElQb_da3_3(C|Mfdnl_GjOeg%Tdq_jr+!uT!%K!~WTC zkbrra7F>wTAgFW*Bx-qKY3r2fV8~f8_UnBqOsH%iaYsKIUkMD!Z5qUtb1{_^Ly7X7 z={PMmZXbe4VW$HcA*2<#kDRW03C?RmB~?uc^c4}L6nvo3zxjxET9!a^CUi1x6T6hG zgMs8EOt)f#q`gH38mJk?5uE)v(mE1ch*&~~&1npK6eP`pANgDKv!RO&vsP`y+4qD| zVem_dt!grTTrsCLJROpP*2Rg-S}!n*|12UyNMJ!V9lT3{r4?b9 zlxK%5RYaXUGEOcjkhYbwD^=k+QD$2ovyve#&`qx9f*qW(AYS}rwskVVUm!!Zpy+9> zk_!RL)t78tOdBaqDUHB7qO=%A8)?5DjgYkUT$Ub8JP_X-yCcd$nUID(vU}mo;g?u0Mh}OD-IK5mGvBoU!Km^n3D#4w&#loVQePI%1VrY^ z`^bK_ODNaIidk%X9HU(g?+f`Z<32TvXCro+DBAdgu|gNa_2QKCe9Q`&N??&y8}qo1`&w%@=K z-4=H=tb;w#i7nvah*WEL;=)AK*S5?_IX1eFlZ~`cic&1o!dakpRU(Dy&Vx$RNszC$ ztjcCFso+lU+E9ey_lCSAsA9Bg`Uz}O3$?1DkA!KgqmIh#r1Pq3jPS|bxjq3u5~BdL^K#R^ zrVH=#kOzj0vqIR5P8;P6!~Sya)Pwqk(xr=t=+)T(lC}8B;2-y++CDn5@pxh`6~3V{ zo^~+xM9&%2kD#9A)K5Zwjtjtm1N9e`z!!&ijKVnE0{9ZQ1{%{cM1~ijDbnfoMeO-^ z*EzX%*!x)&gUtFbQce-+nzO`t6Hm3*73vu{B8ihTbl)*SmUp3P;UZ^dgISVQ>Ji-p_3n1GF ze}OQ?TWjv8;YSXGQJE3OvOQwvj;B*2#w5;XlcRdN3jC|1twXXDw3hIpF{#Imc9(;#=V~HLiI9S@R8hLTA_NE~D?#kkt01=C6?g ze-LGf|EJ!`X*?_l<=>(R>5~jGI)glwR6IjrBq=#G3K5?_7>f%4(QN+z0MU#2r`P=Z)3HyZcV*MG*k9)GWn&*9 z8o%UK8~+S@Ja(GAXk0d1^r=7TXKl07vk^c+aWo|HIFnzbw6p^76VhmAl~XRg#C?;S#lXV;0yL0y+YD>^T}9uGRE?ZLsGq&a5i;h(s-VmWmTyF z>1x!~`=jYN+hvxLLJyZfKja{v5#91Zf$7{osjH#E?+*uK@l}0OMa=ea^Hm;-eW|_N zw@XmHv~jX>t_0@Flc%cCIxR2h(wj-IBz--hgAleH|6pPr6IVH=6gnE*&0Itfepk_8 zFwx*EJ>s)V7y*>ZRd_uVo#rYz5Jw0oq9ZhQOchA2T1-O~y@gG}g6R~^fH-aQ- zcTm5fJx|LSUGALKS`Wl=1alwlq|yJlZH*;DpkXpk!PI?xfmuP0V0l{nuh$zb4ZC^q`MDdpg!E z*sFOCcz}6gXN8SKoFUEk5-TUEXSy)OuFbeOtBbg-1QIVATw3h@@Ndq7W7~U`Ok#7$ z@By^$y9EfPLy-$HC5B8k!2UqTS$fN>`H(odgb);w6?NHyhg`5}`SPy~b7i(iwGh+v zxAjvu9F;X+NxUlSmWplI!y-#8*_+azf z83KgjM7;!Vc^H{=a$B97aq{bOW zFs(1zwzmHr{(ipSB*3DrccJ2v0|5U1T&((^L_ga0tF2@|-<#(q#<#1a-Ph#3zJI*J z|6rm>{{1}V-H2*}gmxu)MTqdnXrTSeQrtauc7lX|XM6+kh`}at_QhPGLl(7Z#Sh^P zL}JRt;<1r}EIE6a4AYZEgoe=k)__Ps@@O7HN-z|_lQ{;O`Q(8CEN1IifO#V0CM8Gh zp@t$nN009l7D9&|AEqFi2TkskWtG>dSa|{)jhC{3tcSI}}!}A*m2}WF8f>qN=Ad5}@9rx&X8;IkMjTIdk)c zDR;e;vQgf7as@F9U!;>@WC@jY@)lw*wC-3~UH2c*@CY=`E-2PA`CZ$B; z|IrQGySjb2pLMjNVGfjqpHbyF6b=lo5_~W=8p&SD6Ix7*5^-TqP)|CD9>5s z<|{;U7-A#YY87cXi9R82EYmE0Q!kxS_B1!CTF;SzB9d*Zvff$=U9VlpG_;wTKkyM} zf`e|9%@;k3vG%}MHBOIFl`83Wbs{Yv?(0>%rCu&Tgb0Dp33KX zeB{Y$Gm)W^J{a|}{zrPTTro>aj{DmvPLLSIu8%n3@Cn4g2R2;!NLL* z-@n)Q#l+l@O(;l=Vu#JJ;_`>B2cS`0F(sySbP0q6!uuRqqAh&vBF1f{=Viwc7oBY=GdN)<-srg>!2Q!cm z(A)vb342Ieh^hjy9$Qw}@d)cHfK+1xwUGd}tO&Ci>-<2xC9MLux}9}l^50bUf{;K_ z06VRqClE(}~pa z{NZ#b%1${5i=wRaXfP5RoC;&cz9ZtpC1T9!#bE7l?#GwOsOjT>dUWbX5bJz~zo#eKYv?*7 zR39by-?w*+{|!ok`GACvNhMqp1`CP>-wYm7DKe(&4Dy2Dn;|2Tl-V}1q0D^9;D52G zWB;+JXOsYodIPYiU0(kei&_`*|HGmNwkx8834{L+i<+*aK1UR&p5MXsn;SRhwWO1e z{o6l~Pg;{HyD3S#JMP}a&V1Ewjp@Ai zy0RJhVBmWB^nhOQG9A^7GNe1yPKbhXLEAr&&sPwOtDCa{uEOt0r$_Yb%FFhxyVxM~a^$Yx z({=lUxWD^hRt(AxNjRVA#fTkr>J|ZloF2$y2j0FlwvL)^JQ*sNUSe(Bg+4SBTySPm zTB#kli?{=p=a;JI$Qz)L|48tQDu}<}91TnwovznUQ9`IMxMfcm+@?kUwep2PE58%8 z@&)h}oHQC{6j&<-zo>!2>eS1ZJ{MnK+dmQbrcQKrIcch`<~}dNPK~!@B=hL^oFl2> zdm&KBkM3E+ zi_~BB*zb0nBp|6UhxHs*bJDdReV8+9$83pQA3km`-fBM)&1LL3r6o2NCm2SpeRWvX zuikUiu`92D}a2n=bBK;niRHo;+OJdU2ACR9^$f)uI4_?lpr#B~T(Uf<(7=b*_T8r%na zRvC(zxBwRMP`sBmy|gHV?$S)dNdMT7aNcm0?Og24Fxbt&W@IgIHtwMCAa=@36vPw6 zp@;p2n)t$n!x-@x{;{YFC_F0U@jEf)`QV!9*0Nht^TYDb_>p22j-Wls zvDp{z{|aOysBGR~+fBJMxTRoANd1S4JP0gh24N7fzY@;hhzdl*QA+fv*yIBa6FaIf z-iwn#U#V76PKI<8$5*r0u- z#jBs&?P`BmWOCa-oKU_9e;|D*xyv`+pTXDZ{+s0Whay$sK&E?Y@ML2so8M3Jp6B<^ z&JQZy<6o__<*#f(b9DFm4=n(nrNn!quVQ2c-kj~x`J>7zuG>Cl@GzCfvD>E&rBT;0 z@j(WeK`h=roi7$o<`$%3RI7u?IO28FK)|z0R}jaI?vIF97-VBq6I=>o^cVfT&lpFI zt5guF$Wpo;WwhwQ2oqUlVgCGDPuC(zk2rVP#Sk=+MM8zl6;ECc5HbnY;A=3v62*}1&MF$Y~@p|miCK2x!}~mry)Tj9lxNULy~l!!-F4j zv0N=r0HLaBKN(a3`9Ns=N!Q=M>G3_NL{!xs7_1dFdAH}wygdX&4ig9rbF;I)8=(r! zArvoM*8!}AirQ{A3-%C=`q1`S1n4MZKGZ zoUPQql){j3!XO*p28YfW5QwU z==Yrb>xU@EtTf(-{ryIFM~$r6Vg%#A)MHTALuq}vwiCKFS@x~Zdu|T9H@j}10hu%P#TQe= z{hx14fB){JS8LwG#6p8+d-}{j{?n+C*+f7_HOK#2p{524TScq|?YgSrZ}LVMbJ#D|bgI8zIP- zhuPyH!)J9Ct{-JaYReBU1cd&nB}(id;H-9~Nrc81N{6N^R=aQ(g9HN3DrX8(P>Zp#@0+^tc$QU|s zn2ahHatQP(YlqM$)fHF@I)V7Jmve}J`>R&dQzN)9mt~*7SI6;77Puxc$vbGD(ylcPg%!gwK)ONls6&^ zM<15oR)(AM#T(FM%^Wm0Rgw-4X_rqKu$)@^MX08u#?} z4-Aoyj&)8=>(3JRBaG+2jgBvK&CITU9a`93E}%I-=e)cekNwDWdu#mb;`f{NezP#+ z?k5l85aI>SHOe5SyL)|MjcCar=$@v7VhuimiB&pFM+&|jnZVjzpf#YX=%363i{P?_ z?%;fG(`ySRm$FiPNW*bhU8&RBQ%{jpm?e&Qm!zI05gztR56(W5@xqhh`&_O)#$%IS zN9w~%d!5JT%}ElGLY0$^*3Bd-Vjt|o+du5gJ~1J6!s>Lp-9$6^RY;IZUp`6P$(I?HhaL8q)EayOg&bi%kQ2R*m#ui1Ql$guRLt=h)7YeH$1 z2*=e{zr&*^9n1k+L*Z;XUE(7FdsE@!DU$a>=i4$V&sb3;ZU}ySr8Z{GF=+pFJlm_^ zZIpHGxqnbfYW(G13W{`v%*5B5?FUCk5~Az%NA)$y36L!SsmXOh*T97K}poo0(S#ljuG=@^+58% zl-Ka^g4EUAYbJIr_3KZcwW0BaXwFLt!O6z6Quj%5y&r_eg98HivTc|h{3F#UW8j5cKS6QnfVQG8 zMnv5r9i~#%)LnG=q@AxN{RunlKVLhD z#L|HktWH5LSiy4YF{NlS_Que_Mv2+ZiAUfp^zuw4vm*mhl%|szy1$B)oJ3!i-G%en z4CV4i!o|}P_q39vjIlr6xO~#Ce%c!TSmiWXw_d{95$p<*^_$~1r8hZFId$UANAScW ze{(1{yp`k3+ zse+!gKv|6%Qx$L7Tf#MCnTdTNBHg^WHR(xAQtsMD`@mXDqKdcaPRHLnu~6_O?^Ms` zs}rWGd~REh_fdZ_?>lxxneV$#Hbo=M$e)G$6KR;9?l>IS( z)V_ap()T$g7$SlTbUv3epTIBO^&ew@bOId{1q|f|P}tr@+JOF6YoYZcF-yq}LHCuP z4yBL4G!4JXv@w0cVYjamS;pLA62&;HnCts&cbFlR`=-Pss!ec_$r2h~@JjAyD&g?w z0NLEaBxw9PGZs|jnkf;DT98@pH6ZRKX}Voof=;P!5zJaNo+ZhlNohLS1jXExn%RMbj8wMQx~i?A;bJz6TSuAkfHln847_!0KgXLp zk=omIt!}(_Y!bdd8`VCPFe|L|JZYB%+RoSqngF4x`9#84$z7z3BA`Yd1 z(*&3)mh;+vK%>`hFl8h_yY%avQM9Z!xLVg~X8<|}v7 zH3jK7?I&8hIjrS$y8Q_edGJ2zPF9yVYce?b_`BX|t>btapZSjZw4Y~2=;Djh@O{V~ za5O`AHo6}mgrAVm*y4%Fc+rk!4DYrT;%*l4{cg8tVSh1t0&wH}AtH1r*5_SllT!g# zW5%Ey+>2yXyg%628y{dwY)+l+F~q*>61}^gFSV*jz>94W6C}7L zHSG~3b6gu8dBJF?1Flvf(*)5GA#C}4#FuDg30b(NYzn%{yP43>*#?Dd`nv7%x$wue zxN~euB1A8Lj}rDkSS%N$RL!8lL|~i}0O+4MLZ+0y0u{b!kvI#Egw#prU8$UdFjMtk zDf0*`p++nu$B*?X>#9Y{XcV5ig6~9fL5`o8>WyV6N;7z zm^*QBxkxktyA?J9Q|UllN=af8m%M}sQg#=Ekr{KGPq+$jCY$r^oGz2;AhdjdD0S^A_dMs?oQsCWdPCI(MF zajtb5G}W$6XnwEK>0J73|IOWO8Fp9b{?@X^r5Lw2{X@=LH+{KP=jKy~#fGh z8Z!m>Jv@Dk==G-}W&)sS`CJoX3&8~w*!hI^8p@v?Yh1tk`(!D92%!!g3==GFgYcom z8^OeFmK&e$Y+G`bP@py@VL1GX48iBQI;Os4ZNnQ_z-w&=v<>2slz8G-7I-$hQhjOmByIqRmeo_JZ#4hdO4%Yw zY5HFS)atYLAiK5Q%dd-HGf8)BS;B404vNzQ21TrMwSB@%w7tXOEE2FhKt`A`StXqau&jZSa9v8$+`j~K1Q*)6lLsB_&utoGl)PN_m8 zShlb1;b_rioYPVnXnaMyJ=nC22Xa*D^z_`&xkPs}ZA?}s?iZ^9&`yk~KBE>i0lfZ;x!0^}1XH@t?i;@G1^N7%69YLaWM`tDp_O;} zgYoztw>3~kZ-Ix|OLWI>>Sy2IFIQ@=etb9Ayk>~eC9~p6T^pA1ZokbB@`F1%Rvg7l!i(7;9zO=(j6 z%Pk+)jDb&+<}JzTGo(KKYg!>&>=LY&?oXF#PwvmLgHObN z&Lq41Jw7m}MZO(q&-T6|sriKTRx|FVbHg8lNs$_?mUzKxDIYL*GGQ=lVhHBHrac1W zs8F2!AxvS&gjeWj{55#^!8s5GO&AW8DTsnf5krDZl7NKwBNNw#lzLbnaaG(W0E5JR zcqZJBk9QiMK_5+35)*m|uo5Rk*YH4;O#*Jy~6ji-Cxz({jBJj8i5 z6JS9tYm}qHr$WC86!-`@#1 zNND@0=%N}w7VE>&dIO|gOxgmjeq|%?pulk2+JlOCb8+65NYRJ}hAF${p{wo5Vby7b z*d^xEWbUI%+o=Y_1@l>bY?NVon(>kZ`Pko8|HDQ~cp6YmilHn9h`3z;P!uc0#4vE9 z3MAumU1;IUSBSzOuI=yLcN?9)Ujopo#-F&670$ifq{qwSl)FI1vu|~V~ zzR)ot-@7K)nQ=8Sj4lpQmme~Hp$|@?x!#^hqMu8(PxyfmO>H1n+wSk((8b~BMn77v zF7NZp++r=?8yAGJpYq5vi2p8@4Pn4-=U%o4?$REi@1Y!KwwAx!0=-H}FxjRBdhd>! z7UXrF88ZS4HW>NOsteW*Oq*d2pDY+6P%DQST=>zk7^D6DJs86Wj}%`=a5k|4IWz@3 z16)}zI6hWglHEK}h$eLl_Sy(h5TR>_#i+tpkh)9nP)AO#+Jhjs#&er3?aSm4EZj|d zOLNYm;yS5ojpwmjI+w+Faj=(7gN8kx6TAudCK3EgHaT%5ORpF+TU4ZD0^jB;FQ@$SQCJI3-l4vx~AyfnK?NMl5KX`B1#p;T8_+Mxm+Q#u!HU2vI8 zUPqSlXF9{s`>-vcE`q_9Jh|ms6LSc z9b0;3J>A&;^ff)nz=$S*$#}=kg)49bjA$neXWW|rP1A#nj~fC`R^#J+kNQzu5JcKh zgo6}LK!HZ9Pf<6__(HX|g%ve}e<-;I*R`MVmcD)jl3T$yDGG3BQ_myqduLSz-j02F zkx$<^M`mgEp5?to=2KM)w@PGrNl>{bweSki{9+?ReK}|I$_L#4>p_nW@~?7lo&U1| zI8PqbroZa+gEpPXvSHIAA}oKO4Prz`JqSKn`#(Z<9trO*N+8n4J^D`RyqjVNV7 zLQFhi3FXU$|HWbolYx8bn#_s7V~P$ zY54Cg&(;I~lvpSdT39?fSq*X)P)e452u7y~@V=~HQ#dbv{+E2y4{7^55|&~dDuYHq zmPrmOJz4Lq=5!$GoiWlgogUOc;4pf(jv7e{V@culV?(TCV=PFcc4-7ZVlurSchrIX zJKLs-SW1$ueBSm??AkslFur>{2y#rR=eZbY-`z?#D93S!K!jPnK zcz_3FR`==hwQ@WL*^6r3?B^h)?Eqym81MW}kWr;XM=sF7CECj^U*wKWAqR<@s3XjR ziH|{8<^~Tn1yO)1bm0HSV>Y2zK-z+aeMAXb07tzx0;v9x7lHg9`49tkPnc5W_jtE* z1QMu=jA{&?+tpWCu4s9Vygr`&TzP6~q^PTGDnAMOyE}YdSYxpe$p2e{`@eil{%en5 zqUGtdI7jvKIfFZ;OuQLTnhB6tES%;7l*oh)m69vtP$Ai<;Nl8S}mti@)p%5p7n<{!;-~2mI7WRh`;auE) zs8AV-#aGGdSa4MtkK@53m)H)r{X(i=;uv4@{xDMfX;!L4dc)6|Vog?qiKX`p3y&3M zt9;Vkj)_XOZ~tcUx({wxM^H{>8eF=rlUU*>$E4pl?sV1GKX^-0#Q~=7`%>*}cdM#D zt--^|_&!WGmq(p#q0h7bI^P~_d|OpG9r$MKL-Cz8#}{(`Vcic4y=B!O`gkFm0Mklv zI3&m*cp{W`X>LuCBT>f;M&+JD5Jul7m?zJYrKk}>Q^&UH%`_Os5c)LGBi~yj&89z2 zM$f$9X*5&mHatDrVl?3eRChaG<;|jE0tJk`Fj0ZQwh*pkRZz&TwKTnxY!c!*lVX__ zzWdpZMbHYiK4)8;sk5D0jN*NM@Rijc#qLXH@Q+sOZ0tMoebyjoL~(8y3-;H%s5ank z`Y2y!lM`)Z$3~K--nOs!9XxOuXr8%cq(Z5n7>ru^Fj}Tk<&J7!QQq|9MV)#A-sM{{t&hCtI?QZ(;!1R zSN(c~7a}aJ!py70HxVc^&p-#8F@*7s_RF1Qv>PETR#j(dXN25YUIi0M2 zO*|Rk5}1109`&w4l;~&ugo2D1lvG3JzGv*+ySF5gnI=MIf z4<&@xxY7RS-^~Bbfffi0()*VOT#xTp2xE{ZmXBxXk3?m+oeQfq?+qd%=4QGg$di?Q z{Ny8WplvBf(aA(u=$tc+Ch`b0jeGJHDLxUTT~cL_V)ai-jDlW>Bos_1$VM}~Ug9g# z%u}wjqV9i>`?dOwr`gxCg7R%QBO{*3GPOU5(` zEOXu<4I})c*Rfz;HWb^fm}F4mN{^Sqx3|#s@Tp@Jb9x>)J zo*WMVq3Aq?1RB*VH@mOp)a@bE%lto=nw|$us(r*f`BLIreauY7@3J`bc26rSeIWN_ zO+xyiSSstT^j9$%^wVJ0y?Wp%Jyt5uc9hTUdjAJ1<1Cb$3rOWR8o`rC#I!z_-#^Iv zhK7C6^ZT1yY^00|Z6TDwm@QrpycV$`3w}`3(fovlow(sm$-i%EN~cUl_X#x#vnL#D z_1Spzv#!VAA|H1)<^~GyhRw&I%6*!T6+$oFf-#g`Jcj>96B&o2Kh>R!*HBj4fxNlF zETl9ERMJ4UfP0d@fEA>&kUP{JXr`Fqy(&tz?kWJ^1MoAJ4D(3(V&V-(6lWVT{&i)~wgs;S2gOR8e`7KN1hM?j_|ritJ~Ny=_JfpgeAYBra>VyZjIR+3|X1$Hlz;iQLtX zNT=?HK%hT^G~4rbpRkCZwBQQ7I&Hh+x9A-tL2T9zjR#Ym6Eh{;71Ofi-vQ4w<$%i& z?GVHHF!Ku+*HPb^75*1ILtMYcpDr7)PKq2J@efH(jjK*SE3WuOtKgI&IQ{flW!((* zV&3JvzQ9J~H-3N%6tYNoJG>auk=L|@X!zbF;@t0pSW)2J9{B#j3vsz>9Q5#{3D+_` z`uCDUyPE2X>laWQHQMj|@XhDpk;l4Cv0BSUD5Ls^?-0IKkNH^p@6U+f7+q>R!QFu( zo4XEO!mBjVF@r}oiC_RL61eC&#t+_TKM@2)78xip4>G|p;|U?xxB!nBsM*uB9Ctk6 zb({(kIC-Csewgd{<@3eJ>!Oti;q?!;F992*ow`3?d;Z+(!ZPvs^!0q`KiK{|e8}BI z!rGOi_49yr9-oD+>{~d7)UGGOEfox4)G$yST@S<^UV9|e0t*q|3YwG(#gyBB?wS%u zB_EIj5dZ_2nMM#*M*s#)SQ_ej63n(8j?KIvtzg0%G#{CZyM%?(M=)O#%&Ka-{${w3 z9@~ z{zkayye5?gBL9#kMNZ%&Q?#AMmdFa`kj;2}jQfQw&1H$OBs@CYS~Z^zBfL|Z!Zjuw zpw9j%4oWKX!fi5`=r=ruRk^jOGQ5>`a7~Fd&G0d5f|+6Sz=78E0>wtxk`t}8OJ~%T zuCc-L)>XIFu&y?_E5nl4NlCSVygs^Gm4!E1WW0JG&RRvB#p9AQuE$^h-z1;^voRtZ z2cEk@D9aI;figqgPZbk|^UdT;$@t2aO6>d2H$YDQ)b$P% zUN8~I!k(jA3N=F{@t6*7FU0Ro^@QNrB143`W?r*XP{fW@@^MzXmt)dX72e{d#aRJLXzVX^Fl*w6gR?1`#eY^sPMM7VxOZh z6vQnM>uwvBq(BxKV6PiT6UwE4n2bFFZ5vEO;g8_T((_De8uB8{Os|dJ|HJOLYA3(- zxzFNfPwX?`r6>7d~AXy8F%y6cZp>>MGKgOb9uhmU1CrB$OGCDqEHBGTY!$BEK| zl0H$hNML$YJAAIJfj7QuVvjT}ZT}LS<|B_9W!c0u>L;rxDjS$IBavzc%)Ba^P+V@0 zn!jj)Ez@3Jc~$dK$YE9EsTHSF{h>T32`v%^RSgP+D5?r6o9S*uO+s)5m7PF_3f@CZ z>cHEE&Et^JkFTIQiXg^!IO`<`6#gMvBI3GXw1kS9kw^Ks=c6Q?>#lvgAE?fl#eX@B zO*I7z4ou6?j`z=quLO_J4qMzQO-Z6Y5uABR7TqwbD)#7-Sqejq;Op!BNVi!bzVB{> z`X3~o&b*!zRkNCql9kv5V)b8?X>iSNjIL$f31Igb!^EI)mM8)4`2}${ zhE|65S4N&|DX278>-=QC9ss*vHL_*?LcMjT-DI_S*T#9ZbuXM#J#IhW7_If7q`2y4 zwW9s_nzA-@Rro-0E9T=#Q0T?2@VLN3|F7o;be$JuuZ(>l3+6ndzw-<>I{!!p(@Jt} z_iqke?=kYUoM(X+$;FqKP7>&V@p%7dJ@Q26dN=Dp-o6}<@2`C0`<8DK zcLz>>JHOT*1cyYBNn-rbqt?)%I^CGO1b*5cbPr6JQaD}6L8mh7ccND?j2}+Hf8SBV ze67PM=1-A z0os`(8^Ajg^1{0ZZ|j>32l`or9Mv#Mt4=TT$Et9Uc_u5?9;D5339}_0rf6sL=ULT= z(PY{pp0JS3Y{jS67fmo4+kcY(0xzf2QvQRs= zqN7J_zG}bN;R({kFe6Ez8zK(lPxe%?mKJcIRYiYV4y@22aJprSqGx=M)of$Fr0rTT zgLQ{Gy03uChPSmyttYm+#cX~0ZziSxup;`WUJAk_q6zMg%k2v#U{r=oPj4V1$>`q% zCxDSCkn(xNIGJmKQec@@8N469Gm?z{y2^naqev})-*&zOOMq1^OXBqp$jx-RWG- zAtS%*T-F?)6HB+DKpa<=;UIjD;dN>}X|}Ln+&7r?A&<LUF^>}H)7pv_`BB0U%iTv-5C{1lW-cvHGhznk z;T9=~R;vZ4$t}YM=43MQbVp_4 z;tb-6xxR-4S|&1<&wc$Bun9M4zaFd70*lP~wd1OfHW7MKzu6VNlH3A=>IMJn@i@b$!- z{}bI{%ceNfvjK1yb`Ah{;YL%6Q4lD-WE#O@dGSBNU6zv-N^^808El?)vKK@}(|H=m zE3$1bcV>%Vmh#MDm7GGaOnOO<oYq_U$EO)<84F)pXeM644 zfeO@FfKmR*dE8GK&&!a@p7iFVH9c%0a!K*eE?at7ReD_+CIx#_IIDx-J)FR)=M#~W zE0yO^;CMRzLoiL|`o&62wHFdi#=86Q_XK?0?okoXgXS6i?nxuDv*XfXRsx^jFjgoX zCPRuoY*5e!SIt3PYZ$8B#a0kCJZHfm4}@^EKLjD4q|Ab`Ar4LG=JBltb>&yV8DpKT90;84Wjze z69jT_QDzV$@`;fM>9a(4vXY85Hm5U`Z7^3;NSf4>V?T~QX>Ab$}!U7xiqo-6rB zguw6byYM4bTG$i%7ay01vT=5bWsoUmHq;vOesz>c3oK1XOB26AWoA<({5To^<7NKe zZ5ze^0L>A01}ZUPaM$StDlr8D`pr~f!g#qzhydQdyUtK7xa$;vf8#x2Q1;E%uro%a z7;3{&+*S*w5jehPnZbw_%Q!N>bx4D*tK4Lmm@dOPmOzP0nygFKTq&q@#;DiZUAELG zX;&-vagfU-9nIII`B5GO7HbW66JPR$l^d%|PUisBg#X^X*Y*UhCDPYXO_V7o3}bv_Lmxunx)2@;4N+tWXPFEz4RI}PVerul02+Ii z$rOfAuCnIU80Oz$X3-qz*YPp3byA3g7kZ3^PosfK%!CFl-;$U7^+sVbESSA01q?QY zpS8_E&)ooe!JJ|ah8V(^TH!@$_Ku4?=`N$XR+%dVxUDqUjM3+2KTOLzZkunz`Dc9KJnpwipS|eeHcBho;K+?!(+zwsDXYI3J!u;bq<`~a&-`9mSYF{RHa!?l{98HP%E-jF< zpf3Ehp90&cY=9zRI)Xkag1WhNFfVI6YHuWna8RaO3)C}S$rPdw0IeT#Xp}(`5@A38 zkWkV^bhXMh@d`r>U*AlWG3aFUhYbr=#K-!eqLRLV9$`nmjCnUtO@#pG@2WGKz=dTl zwcjJF^lCeCsw|X25-Au|Iyq7YisX4@#ahPGbYa1?6Jtu%(vp$(my%2ML|~~S*y8Z5$^bT1_>tEku04#> zsG5}b{qoeO!kp7g%5#myh?VD)7*}%=>|8e%6ua8|L^OAa+t89C#_k6>=8EnjFgX z4WsPI*hZneqP;?{y6XnnwxUGK*cOh{B(Jgt4|Ij;Z7)f<~6mX9s{cuN7b=@dmqb~a49Us|c zQj*>_ATbpFFePRw#Y!BdFSY9%W9>$5oZv29Y8dC}wL_ZXX(Uyvd=qTiG-E=O&4Z>e zrxFLNB96u|BTZfHN~kEPs4}m1BI9Sea)v-+=Hjkpk-9U|wJ1T;Ro`;QS-8mTx+VP4mN zb~R+W#7@7li$>CEPnHxS=;`HikWHRwbgyVs3rXT(;v_Y-`e=3Pz1|KaS588Vd$Bbn z0RuT$vl@G%;yne*ZZ^G>a}!+Klo3UA&vw(H7nGP`=!N|&m|5&Cfwp%W=b?))g^ws z<;7_blFIEGmbts2|60|>^fBP9_d|j=$+vf)hk1~iZTUy_7daHPJ2tuK6_JNg-~--t z9t(yPzlju_UN}W4%BA%5yBF|x`674=A546aCMmZ`)#i1!Lm>fwA)hcJqp?ZHltpn! zQrIK$GE_v{(Y$LOrthJSN4EVT&_p|NA92%nQsl>$ig5YSX=oXQ^&%`%kQ~y@Q+ara zN<_?3kap7bDm-a2jk>@d)a6O$U4}b+U{79W`aRLYAXCXqe);SS3{@)XKsQ=Dr09C=v6TQxRU`m*(vjTq!F?nVa$ z)x{`q^{cAc-16)YI`8G6>iSGYtLiBzm}eU%uy>9dVI`SaMd!6_?WLD^kC>bKlx&Y% zci3!CYgeTzPwS7FG}zQWfKLJE@zR!+5h~GitOu4F>^B!_yeE6%KNg*J{o%TB?12zW z)b;&!)AeJ?N89zlXisop6UKJdcfC+Xbs8**e%mngLfBh+j9i`Nau7LFAr4h&TxIC% zn?+_!h=jPvIOtqzOwI24E69lnKcKo2iNS&%rp#Oc&zzF@>eajk3V@F3;S9LWQGA@_ zUeb)s{O2sk`n>lE|gR42p8Q z=#Lwf;|R|C&*CXSfa8zIdXV4!-A-m~*S&#N?gKpbo8N9lzBeQWx0eL3pVH5~A<%!> z4P7u(7y-99GEdjjJr}~~eup@D^h|`^C=2XCP)o)L58AIWYhnW-O&icyBZBbvF%-4H z8Tz#sBs%`$ZUVvZ(kg}u{{mL#QAEt6M}m%PD`Qb_by*6 z@8l)1DpCV%r8Zayj;K2n2Mki;UOTQBBj$9HEiv`yctA)c~1L! z{STT?Fpx?JLNH>`C@aoSp~9qmox!i_FB$cjYeB5{-vg;l6fls&&)2yqfC2-lf`0~5 zwEyiu%KJYCQfQ2owu_l4eW3=T?vlO5aDL@~G@bnQTZXsDf)0N%%hsEX=UAk>+po01 z?o6@jY2)j3T1;X~$UCv>2l~T~7wg~FEe(8RywQBPtu`JrWZk39^xXP63`^~Yubbxv z{kG18Ku9!`H)I9()xm;6U4-L07qvR^YwyGh#mWTw50jm4cHbekD??v0`FhuT1d-{L z4)|SmD>JyC{bFpJU4OJy-VTwGa@?K{_l6OiJ+}Q`-mmv`+%*M78T+^c$XDQg8wZ)j8c@4DugD3 zkR+0n_iodfUCSyzx^AY-G>nfp)r@Tutbj;m=+bv66u4y9Fjdgwmyq8e!3`%niRg@` z=u2(wrWz4@7A45>9_+kVl}p!2<}yhy{_xfvi7w4FRNOM%@-@+JlAZfbNs9B7Y-!pD zwsiW8k2MDg$vQA&#d#*!di$i7=mqpi-fYX3g--Cu)-+UDloe&4lJpL>C{OYa$>89& zDk|p&o|!7E@?+!x45#3JrlJb_nyIRBO7EzwmABxirm`6b^7=x}kE&bA^f7D4y2h%i zkj*pg`F^;I_q42=Qr5K2VrvYxX+rXA+Rd9**hEj8D^HqN1Hsx`CrJ>q{h)?KqSL&G zu*%T*@H`FQO3=PaFbx;UDdRD^KE_L#Rm-6TNTXj7P)}e*x35~ z$9>M_EAV=GIIGJIYC+SqYpkmB?~Yh~9f(VA{DLHMRchYpd}+?tPcRUJ=)U;?G=eNjxF z>wPqiupW5@6`l77QPp7M4;(*O0lnBsG@8cSH&UI3KW=0nc?g^a(6Cm=ufiJZLF}*5 zcQch$?hmPD9)2Kn|DHK>y*XODy&3L)%4YXDBB6NPde?JruN<&uX8gQ=E^;kd=YzvT z!OBu5jC!c-O>%4ug}~K=7Ch~*@*5O05t9*td4>ur2;EI5&fw08027ep=gj!~$>+~Q zu|_u02dDeVk)6XO84IwY0taY9%_9_OMlb^IB&ep&!}&C}&@=b@>BV}Yc#5d72S>zN zU)4uZ#+x$y1gx8-nHVZruv_YpMw<@C@;8SN`-u#{TH{3Zblo6(xEmG$y5)R+8Y=OE z;ehLzSSq9XvwHaV4quS9jh#SlxzfXaNXYK=Yx9s^^>tc2Cf zf}Xy7gno-2k^3)Xt(2u$i^&>=$`k-cbVit}w$(md>U{UR!Ty1-Zlfmn%xhwW(Rq2$ zFPR^ozqQ6ZG>P@rAXB$8bFS0^dtt2F?TD_F=^fzIVUrC=!M`jR!TeiWV}P(=WG4-dEplM|^%?EE>5(Bg+`G!SnVR2A*>Q zIL+X0X>Rb7rUzvxyu-d>*rg95r7!lFs;NJ{Wm!R>I45Fc6s435RS1t^_-LGXsF^vx zbHqTLno@wPDXoeW5pBFA*fC9LPT-8UcqQ_hP&46L|#y!F#{qZO-317G?(09VXOmP4_%UjDMa5+3E4WoJnN#EiOChLmI202WS^tra?u8)j_sxDD; zwk>XJZf6w72XS9fWC;>h=y|n{{?ChYV|~pm9Iitx>r#{sxEsE}X$UJTX#W{voOxpT z!(Cpb?On9IL))GnRCW8`VSMusFZ~)oVeP1G`qSP4+p~g<%GP@a4AJf1m?r8vVP{Y{ zTh(2EaEc-XlQy8zB(n64(#zY7jg?RUBn|WcDK{>UIOY2ZGC!fX5$aSH*fB=OA(wG> zYUlS*FIT+ZPpSJ)0K+_NHP^T#iO>64Y3`Gz5fxb0zIkSCAD#vIy-v5Uv>(xUXV_y6 z8nsry;GNlZ4y}LngZ%yITCVr=cFQ^!nth}KIPCbCJ@&p3t@}LxQQQ#6F}&Lhr?25# zk9mWhu#qsX=()x5w(G;sxW*rCn{J?NzU`OV6`E($WE{6}8t-$ml(= zU;n9Aj9f$`7Ia=l^BGNDeH~}>IceTT?*aV^GN3rba}>H9=Ux|DpO$9-b3Cu_Cw$ZO z-1X;tjT&?*wiAt>e(x{VyuM*;>J~;nXU=)-qYuA7srKH@TSMgP?NNx{4#3zUhXsgQ zUY$5JbTAeo0o96v?I7~&07RdjAYj;{Y?8@G)-3CRe}x&i9Y+C21kXT^&=%F64d~u+Sd@NBuY5jkpWWPjR@f+ zQ_M;k6e=!`D48ru0>^zx4ylVUv#Nr7r1IaOXlzmMSD>4E|Wu*GpDx4|41YJU zce4?pp%fUtm0Q3cC<3=EPCno0b2~wgcGEWLfegumezA{*?4`0!%ae=hRw51ur5d5s z6oz-QD*1~@$k#oN@YT+n;Y!{izVh>$oMem8nKTnRWCPN z{dkX%le3!n>*Q0NJieZxOv3xUwgUOw*V$$+2@{!bQYF50xE>WJb3d<7t$zG)-ll0u z@AxEidA>C4=%{Q^IS-!YE9*ua-M&vy_XJ4((D%|C0f=;EAg;!{Z!C)-;n5RB8gHB* zf~_P&DM?_;uo()%#+2bWZZdu0G`!}fa4cGJrhxRZG!$)*J6{k*1E?OKc$@DEVt5v0 zra!$IA~cU>!Ef7+hWoU!lc-D#GDUFd#>Gf*)nIAPJh*8=swjrEo1}panrjgI(PBBH zK-oBuDbn3d)~)!yn`+W00Fxd%VQrDEzjk0D3WbZ@BWFO9u`h?ovuq_EN>-6j5LE$U z$B2@V48_rg$mRK&Odwd4i%)D*OlyD~AXnS8Y(rSr*Di-yY~TbLuWoSw6RM8u_Hp_i zn3cH7+9Behsw{_K+nNrC4Y1+#V5$U2MK8hX z%5B3;7Rm9x2K)9IY>nYBw>HK7T@TnaL*36q4|d{rKbi5m|DZ#hddAVCReIg_|IVdQ zj+uMm3IiPQ+s|6lUdtLp8d0l#!&KYn-jSQ+0xidc=kCWq;P? z1l6tg`w6xGlL-FLdjohM<%3G5k`Di7l6aWpKlcXHf~W{ft9hL|FlU9qqN5oB0bF%# zdab4)faoNmFbl->l%ecTWKgd$kGP;!NEbniY-+=NH%29>e~&t*0i{?#M^2`=d}W~? z7}S8ybeFUdRm(0Cf%kDfQ@0UmmhNsa#a>jvX?I}0U6Y|N(6~PaPV=UU@3Za7lNZT{ z8m$`fFM+G$e8ubCHgFhpgxYK}?crxkPh+iTx;+U<{V%g#UX28J3JTt!=+#+`!;*}q zoRlXjBG zvFBJaS0F#`t$nwc18Dc>U)|(y4Ggy3=#N?mntF5JTnRwI=%}DVuw|x^5vd4qkWmX% zrrn3_s5a>;HFQk;o+j}DA<`J^|Z(U>uQ;hs^Yo;{;wDkcXq%Q>q#6dwhNO8W|HjU+#%}s4ZU4G(H^m94#HG!a+puzMDn=~9 zhMp)U&o$7ZOe*}aoFO;53*eRGeP14+CZji%N<+Z=2)*oddZMBd8=&nM2A+wJG+|{; zD`^IIGHls8K_(8Z2gdfWyu4xguu@{=6>~Mr4hAEuBNav7m3 zw5x|>w*B#G9Il`Aa)MUbu5pa;Xrgf#>G{!Vgd%yfX^sk*w%|0>Pgt>asIht$^!GMC zFZu+p4lf$={c$ByQ#Npe(|$MUwrCzD%=_K)4cIQ(Hcr|t=yg9Ux}&>18}Q9r@2&DK zI3k>X*l_i8DL3p_aMjlj$)>gc*AfSMOHHMn2+v4d|t!|`?8UTzpVEXW)B z;;qXRy++vsZ=qMm4PRrt4qHFg2p+$^Uc)_UMp*aSA0YXPdqNG+_M%WAA}2a-4${Bq zuIoMu9l_lwtUHMqYJd<549Kv$e!`;5j&I@s-=5~_Zgh!Nus5HU#P^J}$= zvA0g6kc69{ie7#qUQh`lIo?1>rR>8>IS*!Zg-3bTzY`;xI;ZCCq(m3o7rh&-4FiD^ zBqVGJO7x2m4jwAB#PEIv4(BkHBq~gGehFvenQ)S&0DltXcv^3MnG_pR!Rc_XPAhRN7aT zvU0K+YGLgP7IYs+N40&`(gvz57)7zWwRPq);Nq#!qM5d^52QYyA zSiQn?QrlcTa`l>ypPE7`FljCeB3t?@sLy4}wyQDtB8y%)h=0l@M?Lol0J2wQG40`9 zbAFMI2xDX@?FAH}5S|2zP&370cwEEoAX>}R@54p;(i9ShFo+^us>Veok@msV+? zNk%U!W)ES+w^+u?sNe~K>phS+8&eOw!_6Ya^H-6S)A)Cp=|7KQevZG+QMf$4*0?}% zWIZY=7P0z*!C;8$Kg0gMAVefCyE~OFi6{nP==n(m<6&)jKU2Po0qgQ z>D0Cv^MO|dN-4sEeULGg{mBAc%~OR)=QzzuBsc4Ca!!B}!rB*F%+wR1+h~qtI4I}D zycl5A8)+|k0~#7Ii|AvA&9*<R@3A7hhHy+^!IJ4du@=61g zviEx#$v7?~!o=~`5`qY2T0T|3IKi+#@!QewtNv+-ED(8l{eoJoHOow&Y~$T;EpW?~ znw-6LTC0O^qSw;Ba`}n&B*9gYK}d7@jw*!FRE8qzh3_v)Z?2fT4PQ24vmNdh|7EcSgpNkh+*CMAu-GtSb$3&|3o7{Pmu(itfWoX_8X zCOg`AmL$HPZKKmg1kO>*3|*5lybPpQ4EZ51BKOTAsd}sm!{{pZi#!A}FmbY6Uj6@-IPJ>ND~R zV|`tM7mHL+Mbco?T#AW3(N|O4o@VH{jp`P2)xR(hy1!nL1k9S&MN|D#k-d^iHq9-| znbVGQ7v{6}c_8zG0_wx>h>+O4;a-GyB*T5qNgH+j^Ae=aB)Bck4p2yc@rzyz6X*Sy z@(PNB__>+Ry`&!=S^Cj}ST0BKjJ&ye89#P%jL>!}G)zFO-(HQ8cd%Se?OB4o7ZeSe zKcxcq$;g~CJ?_xFiL1%yZ%7gOpBI?wNf8*06UAIe{_euS?EfTuUc>0qOHuvzC-I9W zQHn0#(;2?-EZfvR|BWe;EAL;8K=r>m0ij8P@UDb>F9N8Mdt`WR(p04%1y$X7|S?qp>Q*no- z%tJ!;5c$RE6acZ#gFPS+MN+EsdsSQ zvh;~XL3RK%>~@f0%OTpFG@R%we>p4DOq8;#*};a66pQI040yhA!VAcd63)h%V}(%R zAq7jpP*MtkwkA1_j3{;jVVDGsCjO|*U!#{$o;fXh#Ha#YLSl?Jji?CGSf9ovOwj}l zx>DPShOb&e0jfERVwX_QMI5jkn7()iiOj%6BY2eY8d5R26~LRAYzQ0VkB z%2L!z;f7^i1UWOP21>`%y%=dan9~D@I>{_1^Y*$ck#mQ4$P@6JbaRr0uFKccwdmRv9O+y8=gpd0;ZD z(L_}`H|J#eb2Y$>v|!;x4WA55l43_%d>UwD-J>0>+FrF zqs2Y^ou2HES7+0O`p?CNJ`^{{%LwkbPph6D2Rqfd%C){eA8)5O)l*}$yLx_+{%CpY zvAM6EBeM5p!w3p0a62!EK$ki{xc5a;f+D=RRSzer3*rV7MJVA`5T+gvWk{3m5>_a& z`~IdE)sPGoKUR)Tz9>Ox(Pk){FX47L%>w`CC%9dinHV-QP`{|0V4#UK*EQdfkhwvm zPON0eD^6K;{f>rj9H^_pYo36V6t!HGZi#5u;5n1>){Cel4U%kasbp1Au9)ed2PuUy z^cC1kbIPHIN=b%; zTpUh+fuH#|GplvLClmRHv5;Z{~b^7W2Hs2hvurC%rnWi z*DLJo05^a95@Mtt*Y%*cbJh)g#pTqCKs|BRhbH)F+Y65q%)yNFpnuU1k*;zaMnyn% z8G?n*YZ#;D+-Mjl81NPqeKr5~N^*TC>%A;|YB)@r?5%4`QoUWjHf4uj5akC_n z`3W>p8>>#-k)6jC`5^8=pKiy!3RhdO{9ws$H-h(Yo0lN**&fS2d}RDPA?mN=cJYD4 z$|skyGfr%}0RSuO4J)ORvJ;IjXo*@o zx0+|DG8+z~5GRu;$qlA^o(y50ViYB@6cuZ^fIRZngm{ZkusUe?AXa+=Qb3aG2 z=<6@u{=O=nPVb8>>5OoFH(%V{dHko3y`G@`?GNku=%OepcPKJc(~fT zmQ1RHKu`Wr7)7oZf8hhF=0@-MGtrx;wBKf=v!%I8t6Vq78MH39WQIbX0(&!+dp%^L zziyW&7Y%$WeuS-iK3oj1`7Oc8#C=%*_RiQB>1KGt4ILdq8Gw_cjmu9Fcr_7DjsG&i zT})Ja&X+t?#xz2TDA-hisbs)ZkuvhGAOc~sRrM3)YMNRM`|JL~=nKiDEn7(>BJ6m< zAszo%VrZmU-%1eQh6ArbOlaf4?-OZeS_r8ry7+~boLWuaEmIBAaZA$7dCf|+t!f(R zzy}On3TO0BNmMR*@2^wzU7iWLURk~s)iOPClA0VQPMWFBcuA%qfR%mIq_UyKfHSQq zk1IkR6;IZC1wLh$XPfcTJUw2fa!7V$MMYJ!7bCcf$k_r{UqvN&G0rm)cUuy(RHtGx zSJanMt=JY%4vjH3&2GJls|nCK`o_DH@W3ELQzQ>V^mk%xv77Oc4RCmlPQRQF39^4V zT#I5iyKrbc6Zv)jz}9n*PAbw1--tp0g$bL-AycHGfc%os?5+A28X?^J0UR9ji$Nmw zM&~bN(xeR|_^Ea-a-^lG7h|xWjxR?K$56Q@c~hg`w}(Plo2FxM4X$BjsQ+M+C^U)= z&nXjxOw5l6@o+JgnA?wui+`}co{@c1=Q^h%ZGiJlv(c`8K_6%S*R+u!Hux@Ip16Kj zQ@8&$V)q_w%ch;b3iHlc%*Ef%f2^(kCGPC^WdiitT&H#tw~YnR(adw&AX)F9tdR18 z)>>!cq?IstlZ|SCB|`q(bDuWa(Dh(kCgy%Ot#+;bD5Q_918|;|1WqgY>K=~r$4_O> zOV?}KPphdh?tc`&!5#XwXqNZoM%nc_n0q7WZ1isX&CcL&!^ixt``o5=U&VQG2jLqN zyRTnvH=~rh=zkW1gyHD}p2PpqSiNT2gJ8K14(P+LP0+i3-m)RMm(f=DrTVVB(_dB2!{ohFJe432FOkpq!k~r z;xcT__7Hyu2+Ur@MQG5N-7O7E!*hiN(G<~Qq=zc7HCTVTHm89*kWwYaPK>Df_l4s> z`|SS=V{x$Q=KJC{%fm2`kkkIDn;-z77{AJ9U#K316sb)8)*un7dIe;|8D=C7L=%J} zT#6Ng$&4a}XcNKj7C~yBCraFzNE9t+(A3MbR{z8flwjqY0h*P44VIdNn%~BX6|(XD znSQ~2i`K5U!CUxNDOaa45HqQ>z%o){z1RTUU{!A$)V`7_WQsVhbjd%@vNA7GnDl!i zQKbo`hg(oBfWWoBQ}`aG8xp`S*X_vhm#M1Pc(yUpq9A{qa5DMsMx&j#Q4firoIpyG5n8 zjt`5QgOx0fWL93kj#@gN!KUTU)ot}+wD0N#L5|-pbXtx-q^nfd+krx7UGY}6Z#aa& zCTTL1gqI$li6XEyfs`gehZ2FIB#kPR$a26Wtj33siitXfVK{=RVuXsExNAROoqM({ z;S=9lYGDk^&B$h~BAl*S1V7nmZ;V`DS$Z_(YwLn|HJ7}27~{Z*!8Ef#Lq$7^?p`&FWciM<8+Qq>p^Lj$pW}=gp#$F7C4O= zmlvy>zk(yqav1|f6fWwDGV7nFHf+pr1r-&krWMwuIf2h(17$_H{627j9i@U0Pu*S=-p?hrkxUsdQ$d;lJgrRvi9Il31w_|{qF&&7I zGX$D4#YNu@kT~LAOHn#@0--2d+is3vVEYmL?r8^P^`q36o3+d{md(iV+U{qViJFe{ zwWzvY6uyZw5=_{v(SZ{!ma{?Ry~>OJCofd4URWZ9hE5K^s;A^3;R4v@tAfU<_%+Dj zR~6K(poxEA%Ys+4jfw!a%rV0;Z+A5#%lxHDP7wv|^SpGd`mb*~u+=YT-l}KwEHPRL z*Ug9WZvorRGeygfS)c?%^O&3NS^KE{ck5LLA@jfvrmvrU8BRUL`y=|RV$1664$$48 zJpy!n9j->m&=Q%WWsYC)l0%Jw?ym6tf)9&9Dz${QC}3O6@zP`i7qlGg@-^w=u4t zL_~`Sc6!dy`OP{n3TSe@ktevjd#^~mslHr0gXtC0QmV-0&C1oO;CUR1^5ew_GrJtP zguD^{wJ;q2<>rU_w$Itd3hUGPj-VM>eTkF*xj%VtbhAbOruFyf2M7|GXt=h}vlU;h z;UK;eXQ*b;CZ2QJAbmkyl(>Q{)(qAVjiq^nZdEQ18vu%7Z^wKv&x7S@=uSr50@JH( zDGF_A!L4{gubsl*kBBm&h+NdcEIX7~qau<_vGM-iJEBy&!?JW-)IJ)r)GtO~CCkLX z!yN=NX|s3mJF5^Rb!{=wFF+@zdT+_w)~2&(UFq3(xUU(rION2sou=nv~@FNBm!T(yu)vxig_y8abv&Q@v#t!%-bV>3o1t5`Xpn+<>#d1 z_H!uE%{Uz`M%nJw2)V!4-pc>Vp!~w8@!{^`%}O`9W%M(rF(|LYS^`jUI8FG7k(>%& zC@JO`w7T!(F9d9VXlx1N00hgtjX*yE!u((gRh@i4C}g1RB4ZlK3&&C_TaO?pDcg*E z;d@8rMm^?X6!JCiE;ka=P-Ye`G=zvv4rCKkiOPXsB;>41J^Kz12|T7|d(DSZ!Ch=8 zO+gFaKj6Kj>S!)BTbi9OrMae}e zUQE!SqWQKGwindcKQ9AWa@#2|&sH%JRn>uJU0iiDX=Wwd*iE~5Bc>@03&IQ+ZGY=_ zfk{oV_sU15h;`LA4tcv6@J5IW62fxJ6+k#R2;kaY>6EdW( z2X@_-qZcW$!>J#=5rwlChx#$Ti|cLlML*2@x9q)DAh|>Wl1nah9Q}49Ah{$xG-;ld z-#A5~x!L%YsrI;GoD;mLD0#O#xxbSCL3RC??vNnt{gnLevFmh|#GlJ~X?mZl*>_fd zxEBo@-@4LiM1A@-W%)2M_~Siy^2F)~vv*@_B`SZrVcw*S4B_NJ!qr|XBDJL{;hn%~kfO{eWg7z1R23WW190o<+I zHNB@D4}jGHNv7yLkID=jxR5cvzQ1hvik@)NvUiGl_T~9h`n*3?1yHKu#w&(MDfi6hWhe|PtB6j(_VDhzjgC{Gwcs0 z0`Ncj$J0LL0SRINZs~p>lc6f6?hjLfRKy|rnE1#y0@TDv4U%lw15x(D1-P4pI07ZA zQMM3cvccA2uAz%)zou>Fr5+h6o2~d*a}$E0{RlZNY-(wc|D5X?<$2sp%qMIklXjBs&ocCf!y!`F6F$`Yc*jTU|NzL$zczkY_@= zl+$rnOZ!|T>6{l9Uf1XI57JXdp!9c6zyyh(SMj1 z^YtPHJ15L#Maz`FQWoc(beG!BKA$k)LlXPy6@!!edw%bg{hqS_&|E5{xKtRcLK%^z z$sNsSPn?}d)kz6A7Z2{=*TnyP*8W$~9nMC#)hWJTGL}k8LgN2Mg<)C$Kd3N06<_bB z|BVVen9Wem<-;jp;V-nB$$3)^C&{0bH&e)($YfwschFPH9rskE_lt6-R4>4V)=HCN zA$W4OM6w58w7JD`7`sV)QAsfv_VTA@M>Fe>Ru{O1&*M0?YtY`ApWXh3quM`UkV#E^ zxLCJ~fkln6bK*+*nu}xTAd$f%s!^s&qW`6xB4^Por^ zK?c}4X8hdF$d*>XbiK}kpyd;sz}wwU^=DrAKc8Kf=c~J)2d6r3Z%+HU@xx$Cd>-Oc zkxVn+`0b=U+%Bpwf6eWFxFsIs!}R%O9c<(~_^Wio&$wrC$se-(0RV*VZ*zm3MhWr* zaOiY4eNjyj(?lSq)RexszG><5Elo?NV#@=B+mWnocT{3rQ!>=DylXIKF@l#?+p%1c zKs2vQlRhY^&hx!Uu~MQtF{L0FW$FbS&G75#`v@0dKpVW;e+~ zkEk?7zvQ4e(L_q1Bn#F;cQoC-=C?(T(~WFNzBgIXa6uFdh|-H{QI;2pX)q1QMDyM= zK*cNR0ouDwQaM?sOM4+`E=O9I6uZA-EUV;tUOp_(>C1?tZheJKBkOa$JS^FE*j_2s z_2gw+(~o_`TnFmys`V3FhsTZMbk{wf!CY#%c|}Q3t$D*`rMiVEAhWvFEl$6tZSgMx zgd7~DqL}k2qM}7$F4b{4B_9Wz93VS?c=G`L zFfS(ojoalbE9{G_X<`DO>k-+^&g(J7?nj<^wUubsDY>hO>#s`c7E|AU;+oef?lu`H zSptyJ^fFu9pJp@X%2lUThkoWy&1*PUtGwE1xP~5LuHAxhfOC}8x&_U#2DSB3oJ?Rl z3BjRlC;fq0TjXD;z5nJaQU^4m4qz+vC;HUnG;j50_yV%vCHGj)l~o1;zbSD&wX7&xy9iQn|Mx`t2-C zIOU2$^3J@Hzj-RA%Q-4%J2Tvjn;XAZm20jvR`ulPZ4J@xS34NAPy-W~ZFRMNtBdH& z=OeUQi7(y{1p_ELr^X$jNK`+MTI{ylV37!7Se!1G$8_0IrWDfNFATg_E2RssaI=jF zHXSCjRZp{Dsc@;}LWBBzC{Sfk7|5E5c@o#+eDw1~-_2=pz=9kh{cYOmYDs1-8G|=} z@79p8;d8aG0ad`&UVYgxOpVV+%=67N7Lo2AHEoc2c^u4rb~~oYPhImm{X#&Fc=ZkF z5^9bY*V&(UX(*tN>a{@*CPO3FM}Tw5SO!B(hfE1aONWA=kWOYDpv0Dpf@zSgwn7jp zMktlY+V|JPEdn;F3B4giJLnSF<=VV-vYJ?GqZf2Du_DN$((zJ<$vfKev-3rXu%e70 z?n36dD7ujf3gh~V;%kAffGuc2F#)`>J7bX4ubb|3g-86TW$fgKvr@Rxr=5#DF#)fjzxFQGA zgbRi!BF%#$nJ6ujKY6MV0cy{o`DXzMtL#xTGh5pQx;Y!_<7MS=Hx#VhNDr)_XVASJ<>-YYKbGl35q#uO!Uo(>;1aF67%E|%s2j!%Q{Y6UL9uHX zB4s{y#$%O#beVWIwHq0IS$pg>g>?nCQ^Xy4O|zpst4*{j;*%uU8r1oH-?aB6h8Fb6 zKVA3AbDy|!smj~yebX|l4qSMfxcQP@HVlLWER+pCFWYXWdMdDAn3ywnP*$mgcJ$Z0jN7E{@PN^}S0lKee+wj|eHgLs7sJ%K zojc=vwGRT*w+;i>CECi5N8j0vhVR{Ew!0qI_kc#!bzV6Pa<|Qn#qxNitU?OR%ZBsA zUAMi;AFc{>{{Vn!;PqEOSfo6tRk5C5L@LA=@_BzwhkO2jDhf7f-pSJ9YgkJsUlQ{? zh|tm-On8;xRO(GQ<+7gp^0*L8+;GUYf9lV4l@Ej z852)o!9$HZS0;sIh!q8y*@E6&8WafSj4%fp(ci67%+0Fr9e3W6qUlO=(#=MER4}84 zj=))+*+|Td2A$J3(N~y|7r<^KG13dJDiW9g8|Em4Bu5;bkVGP6!8B7prj@XrT#q}z zBB(8|zt)fhLIUjiNE15fiSGwHEqLMt;tVbmD7qeZMFJTWctkM}G7yF>aH*h|k5Qf1B5M=p(TYPZ;YVq;@tHp=>-?jLV z|JCA4T~ZLB{C`?}P@;Ge&6V0D*58kuNghgmz%?Or+(?AIyRbxTE6h%!>g1>F&;OG8;!IHs{{! z=KGi7Y;OpfG^yxj1fQYrPs!9ZKV%@Scc)@}iOEZ7YNakF?a4C~W`;{u5RR>srXTX! zAdQlj1bf~@nj)0nl#-T7BwrdIxrr)@-kC5tjABa0EP~HHi5g0C{F!0fOf;VA z7Ge#s5E-8IIo5}x?=*dt<~LB?mIbKu?V3FqG$Z7itO|p$53#^vKSPBtFOVr&x+_Vq zLfWP%%zKhHTrou9(b6G4l7=KK4cQD8)B*yYq}3Stgdpuw<+s}kw2=d&;lzl zH4Dn>rcs!l-p`~~h1JcJU_wQNPN~AA7h&VC_ez#Y@eaX83R*6SMLl z5ryy$NYj9{;L=1tX48o%r6Cji2t z-=F5CcO%cM+^bfOpFXU7jQZ0LgkOfkTTz)Ct=mWf6yUG=1!(d4fr+{XjjNIvd0tS? z-F`IRQ!7%uvf=MtX{#;)wH!Y(FY-cqL$4R5g-X*qNjL*uM>X$He;+q3`re(im9qUl zOzn6IJI}`PdtjdL=CXlZ;-eV5S%C#DKDBhJt~*G%ao6uTZ9kuzA0M8DF*jo!<$mu~ z#=ZV^WVYVLaMmB2^ms)g^XFK*{ZLn#>HD1F!#zRw#mt%atssROcIzAXCuLs@o?Hzl zkjr-83?k`Wg46=mp)A`^lO zDH*ZA4URCG@01t_Tm9rzlA+v1lvs`)VlQgy!q_1N2*p<7)LYY$Ean9m!hr!?DV&r@ zcK-AW`$*2MGoSED5vhNUga>M16}4%*mR@=fA@-*NP!uM z72%RmSlpIE;VLGDq3ADdigYeavEmuvTxhl~s7I2pWHW@2)VIe{C=kARGtBKweIj-4 zdStBIlPr({@2;_?^0`u#Lb+_Y&o-LSI`w+l8Jb56Wd?BGa4VXJF^%uE7ib1j>=*T% zHkr}|Q#XK9*0w-#+}U1V%yE06K>q{9S|_N)si0i3Z&U>$;52{KIWrt$e1Q-nuY+XK znKEN4RZi5fF_n8Zq&J!IGHtO|ayiXjJjH$m(|$E$R+Z8a7TN~ zd$Kizbf{!V^z-azUoOEL-=tSoM-wK3&$(#Xf>LK6Hp`5<4MRWPs&6TKT2=b~sXpHP zvFvxW`SI>@=3Or9UH!0;ALI{xkoOf94@H31?uR_TXHJGZAGjL6e5poPet9^GK!(0> z>KHs#M1}%Fs&F#jR;mcvj5`$&FkRY;#Oq-QjOLyV-~PnjH$pAS6M9}4#(&7aBO>Xt zS(HdD07BCk8oIk$app*}6mMOC|A>Fy^b3B|64)wzFG<%e zAR5VXi?OE7aduDFUt));j4P;cC!t*DdP zzH{4D{!Ggi1Or6LA*AQxbpS>WK@{&P?0!b40q|KOZzoV=Mm_I`$p5t_b14iD!o0IP zAHsV;;TnLIMMW8ve=Rva&fZdmJHa^~jXT-2e?c>@QLe)Ub+r>hk-8V8~^Y5W#aO3Yp;54;^Q!!6*uG zOVWmTYKhobv5JAT`knqnGVL)Q{#lFu7*6rir8d}Lrcr}HKEC=}aq_2){}O11F(U)l}=kcBTAGrqNMBVMkUVn+(A zR<+Q!?`P2u$E%G>b8Lqz_~%N!@B4|_qC9FfhWwD2mO9h@-@)j&J)ufxxCYF@owDhC zX*Z5qWWA@#5Y~^dr&V&<`}yPd`~B8p#X_w~uK?Sn25ai}Px>u5YsjyILRVgT@Xwcz z<+OCldQlk ziGw&u=(lA&0_@DX0~HjAp+*{7o06S$*?>J zG!iOOZQtS~D$I+Lb(qR`6W_=&(j4CNBQy(;4hA@h0%izj>4S6&J-{ml8H z=0la1WzUqARh7U4O4sUOYFk}a(r!~p@pouzbKEWm_P)zUh?Nb>a6p+q6x@th#`)h*EhCj?Y|FE zz^FFV)v*WeMBeEOJZ$v22r@g1qvWW@+Y1cB=boM+lG5$^VGMHI!4XvrKF#cnNw<`QNFyyRlF}X0-5}ka(wzd* z-Q8_)hTqy}UHe>npY=b?Ieufj@AKTZVn1>1@#TMp3}d{75!@pf$IG=7GzcHBCWTr( zuf<+ZzaN-U?=Ze$#$U; zbnwl8S@)zj@Kak0uW?y_?&IBx+mR^lnpfjG6k?rU6!= zgZ5v4g^#*%4Mf)Ksk45Gwemj!(nBj7C|{9#|GI(yu=eYA1?vfvwEW2$5zc$oI)7hz z7Rf}=kRmK?~^lM z5$3n_4&R|litThfT;X>H;Q(PDqvl1JwT%fu9HGq5v6u*#{9O6n*+5N@|G!wUePRBR|M^xMMFewV%EdS3|JyrhTD*5CF_94l z2%i5M_DKFOXfiD!zvHzl(|-+nBz^uf?9u%mAg4k%mdfX}yS$*jLy^sj^*plqqDV7RXceHw)Z#c!Wd+TdH-n7>d5PE_SwvX4!26B+=_RStS z3=WAf)&qiR3Whzlg%ti>KlCU2=B-|SNZ()Yr<7-`~={7Cu3`TV%o(tw!c0&!m@EBX{7@J zG?_j6(eFp5=Oa;3b^wr;(l#~gQQorT*vj5C`iOqs ze7DGq{k=_+loQ4VjxYp5lixl4Bv+~GG!*`%qk~-<#x+CGHzLt}1m?ft23~q7str=b zd2)djD`1PU_W(vbPu%;VgM^2%>MPfkpe?=IRg1glqg%ccO0GL0dy#HiHcn*C>y`NxEr&*RtB;6PJ(&Z? zwbMqzFUhwvg{A9&q>H4pF{k^yXAc0z1j{Shjw%PfJUgjhtN3*adHCz`&mQB6ImA36 zbT$4O>(5Ekn~Bz&F7&KFx651Gf9@)RvAoE(-#m3ad@syuM?2o@^&}kc8T_3I{O`mY zKGJZ0@GtiLk@(KBumcQ9=?Ib4wI}^t9>8hF)d~OVnJ?;l3T)E*PL#jCelOax8M#ot z&!b|yll`WEmjaCV)bjv5jSaM|To{2Pb`Tka^7)h8zCTH>N-#@A78deU7d)D3fFzGG z=35H_KCpLsov%j#0AuNsDj0^4JaXWFf0KNH>taNTS`i{eC;l~DuXl)`hXIKz@gl;~ zl$2y4x^JPY8eJcc^5v1m0Cz4Yo7J)j`PKP=7@K{x%e6n{RWhGci)y&Nb3Qz!j;sh( ztOI*`27(H-(7sfB0E1^^o#=HeTqTT-?v5top#i4mv zFY#LvZ8YtP#Q~fVRdjM0O%Aii5Yy!kqv!Lz1(1g3v4b5hM8XR{fxc#6M_V{*h6oAX zp(Le`j_UBMqaOqY4iKF(<0uZ^@0~0*a|C_vR{y+~z9(=Js*HCy?ehEDTttge#WA%u z8&71Pcd1y#XE=`Hx@=G4!cryuzvVQL|ILmJTB4{ZqykkbVC;jcqSI96(*uthEE}I( zl?#&4h-8wo(MCPNIP{o9vNbeakz-Kz{7Y;qSPZq&aBqm(w}C`T`tfC*YO{ef3WKoi z=GwF$wx~D^Z;2}`r(r6{L#aZaLP4KH%R=u*vGtscVb`!oSp2$LfpU*jg8bXrw`Gt< z$D2jQGVM6ixJ;!|J}ccuyIR|Cx^t)VdG1M>nZ{MDb#KfdIXJaN zH_Ka`7LLiN(+8pDZdK~yqoj)0En-mCmp>0ODn3AC=;PbaDU;|4;RqS=LO5tN2zWxY z*a$?ja>WZK^J9n(!J$*5@}V~_%2j3I+NXNP5i5`ricbc7@CihKE95WWG90VGC6fbH zmL%Eq>=4513cA&%f09tEO}1ZgED z)hPa!jM;fmlBro`QIr?^^sYp#P&}@rq}1i`pfs`{^yms#Q;!PZ@N`))2D_t&YDS{K z*rx*xGEir~4CFMZa=GO+s6-w%HKTmLj!}L<#Xi>0t;Pb_hb_5=>DBqZ&ZM&75Pd&1 zNR1mmGDJ@=c`*!T=MFDPJwT+AM$4FMxVfm!u@4Zj3m3F9%1%TQso$YZs{wAqV}!L~<_iJ3P^VjWws zOsa8NvKx33ZJc*mQ&L%V$Nkx`MA*m5FYSyR^?A{wc7=c0JNV>&-AyLyUMkESuYb?z zJw?mDO}xIl`1AZ#F>y<956n01RhGu9n^wMK&JKR{h**%N9DP`dyZv}1IrPfoM0Gjy z*J;~bRLfx*7FO%=ApM)W%htQ`{;Oh{v&ZXdtqIRF{&<5g;y3`_1UXhvv4uPDd4tVy zJ^lLo!EV-@=*OeRr!T*sB^&(lap;)ZIYZjtGWfMjzzTQR`);an>`?jlo0uN=l8^$G5Dk{i7Zut) zEL<_++X$NkT7=TfWH{mSB3m0AQ-MOW)h}FoO~iYuTBK;nukJ*MG(&xpH@Xh)F?IJmxIiWD@x$b*t}Sit&RA$(c5+?t`kBy#qw)WVX%hWUtNs~i)kjnKff_Q?`=ax}9)kb$-~Ne- z&~WH_2UXVrwWMC7ZXPF38bT}h1%uJibU2*eK>t0FqbW`by2+-^ee}1n3^9MOYmc|c z%?k}+Qqq}WnEIx|$ye{sV>wfbSg6@I{5E^GkbpI$-sd7kr&cVonD;g=rwVN7hhOO4 z9@o}cFR=xXd_J9TF~2DJSsGo*(c#U$*xu^Is+(l{u$Zct;#fA4#JMd*cMKU^Cg4Yq6Q)x4LHKDYfPcxz=g@TlZX!-ZgHtf!>k z=hq9L$zg}(pH)2&ZuZucuMjQBzZ@LU<9MI{*?Z~r83iTB7lV=^+D{>rA~!_uTmES1 za6S*14Y>puhtZZZh=;S~7Hx*{I9?mWg0AOH_GwD#R8Bk4}3GX-fp{fzV( z>-1Y3`Q`^va*v5G>OD9v60VJf_@Kg`&k%x72)rls!LInJFGH?Me;`(v4Hc3t zRuJ4AGQ+yi6w0axzL(gPjYc^h)wbR~TG#jDE2uOq+P1RPuI&=DRc;{xQS6ZZ%!!oN zc3LID?@Q*vj;B~E4n|qL_x7+(nzE|y8!l&diO18WN&+}!k*Y3a+`9Ar=j_+#;y4DJ zoP95_6gm1)>_)4~ZfnpTda1QoLWT&bV`_#woy#T%&;m)Fh6wV2t*~>_uTXlp0j`AnL=P3<9Vqp@h5mjoqp{2r}kO?&8)nVlK))2Uk2~Yd-6!Wa;xxiUM)6m zny!`420V^YpV)~4KCfb&D4DFG{bBV5yLvrl=^*M=cCG*Mi53oS7tgeHo1zUPg0Zmv z*AuOu%S>^w+T_35q5{~)y`jM@`lLk;c>_u0FgjApu^iAAeQRukT3aXUCp=D@*+;FQlnd~ODgd=y4GB^_$`1@=r(E^nEf2C zU(l*D9!ZrFHf3G%wcF@F5opxaYyI38^>d`La;?D^88_48o{g^0-GTQu9PLtfh!kB* zIX#KfU_2A?S6yFf{cyK~9Pvpv^!kQ;F&1<)qD|gociU9UQRQkm$Tk;Z@2;45V z0$3sQe*6$<@+3RT-_2e>^kM!i8BiIG{qpOEf6yBO=1snk7k1)Qqz`_?v+6wLChBql*pFeDAf16mY6?XvgMBky@`t7coD|}r zP>Ku}_t3&j(u*XzqKQ$?<8O{MEU9glHx2}Nj5e-HTMyPwN-KP<4=^ibZTuds5DGR+)@&`i6=|XM zr`;s%&DX;oXSEL%BX$jche@j1e{7akbe&LPRCaF;r;YXzu>Z@m%xzQ;R0fbb#>d2y z%CY_PD3h_A;dGC%n}B%}sW(Q=U}ZF51&HiT0aR)*g%cOgoDJ|O`+ymh$#%-ZpxDn<&W--z=A6@M<5h0naM*VPUFTnzo&$8&@lcQDMx z0;jxY-)nEOn^uFrw=#Zz$4+cW-6Gk`nc@BBlg;)0S+fpD`ecHoAM zKmpl!f=>BB6DLvrQ`%>UVg^g4Dp1T!iu4mKzWj4fcYhZ z0zVHty6$~9^PqhYq+}ob$(_Sx#>aP+>bjQfzn*?MpDW7P%Puf(}-X2fks&>L_Kr2EkpETXk4-7 zD&vX9Tgdzoil!t(JRr{Vo6HT=g#82J2;zu!?O=AL&QSh7Y&LV)ogvCBly; z(U#K~Z;CWUb8Z6gtBjTaUfTBr0y5RBqq+P9N+4WvV5fzOt<}t{-+)eg@XTj>-R*$2l-VDGbst1F`*i~}u6+tL?A(~FFSw6;sy^_JKuxa|>!&IvZq7P|y z-Ij@oy5kSDA3txV?4@{u=~cXMf67j}2C0y4t{Ym9MQW7L!tS#eOs2w|PgL&a1!=iM z*vw@$Y9Lb`_C!%yrt}l7lb~sH7@Ma}yjHEWqWfJ}S>2+LMnwyBrnHju8S`;fFR=$p z&A)p^=>(M7uTFsSmsEWl*Y;r3)}=8Udr*GqX$uFSK{mo+P@KVGbQx8)lm5$8AKhAq zw4OPFrW<4>{7m{$$dRq(ZwWdF#yRHu%C3jQf0=3o(u+3SHC@hT0+ZjB{UB4#(MO__ z3xa_E3aXW$FM`T5jbXDS2Z!;^`1 zHat^u%wA68ZzM#cXVkGi-i&B7f9#$W_FA5}*>_xs z$U*nCnCC@*51Ge5KwA9O#NFRt*ST8W?H6w>vVOl<;ja|F#?X5sBC(%l((#9U`>E?u zV24jSX5Zu+yi{J;XUEsA~t>8NO+Cn@`hS8UP7Y^)j% zUC$-(!j|R)LK-tkYSbBlKBg9&CX3)xp8J%w@)vFr-K!fSXE^Ovj7r zsAMCrkhXMOz@G*`Zm(RMx-(jE+o1FO(-+*-&44}L9aKzV_r&2j;fR#2 zqUf?g!GW@LM(1<|!_mq9XM^dF`U2Bt|2(%d6i+nFGnsQqJc=5oOgMCD*dO;?-Oom@ zmS!}H?Cn%r$T#zeFn>R!m(95rKQi#W{su5O7s=+y#E5HzAzG;Cs(e#^YxR~vGw&U_ z+R5Pz^~?+Elp?*>2E(#OI~n*?;YNzURy^f{pSm0|Ym$fyXfEjdiSJu{jyG3ElGY76 zA&9lK7W44nca_v_5_-Ofo$gtn(uTf7OQ+@TOM5V+|$hsf2%I#RrqCzC~Ue zxLQlxw#e2^+tn9(9YHUDtDGz~f4;N*)B51F^yAYT1G3pi`~CiJPfv8R*&@DvW1pht ztp190U31SVeEj;V$^Ak2pretT{I${_gf4y@n-o0lZ0`+AnP^-LE|f8UY;g-P`G4j7 z9`;;_&?o@cOf4sH^Lcy@E{UVSMlh0IlVK38xONORM|ViBl;aEoGO57ky>Ud;sCG;w z|1Qcv6z3xfPP8~CD$Z9?VoU5;aVTS693m{m1cqTc1ebtVzWFUFEucA6>YeS-j+lWT zBVEe7%uusb<0u`~6kD|TT_%T`ln)tj%PHnkMiAnD!2syt8c|3l=U8s|EXYbj-h!+r zBC3!@&K_whLtf;ocM|z=nrg+_Kn!b;8}^SOi4e%d1WQbODq+k`SFU9$ii;vHDl4=t zDJg6M)#2y8Q$AhQ1CPjkH7dU~0es&$o27OfpQOC*o^y%CW

1q~<=7s-lVd0aWVn zQ*tX9@ewy{v8f{!DrEO^b$_%RYhJUpQ4I;pH{TSr+P0qcGqZQ@p_Q?9of3<%b>E5y zu=o6G3GeA6_)0SjHkj)UXe=>QT#PgE?;SA#fxm0`Wwtv~KT&uu@Wcj-)BqNLI>HER z9vU|$@x*V=LF!0FF5njdD}mR@V;7Tr;St=ta$q$usyuz{Fe8)p{${EuD!*sm#M`i8 zL81o$bMX_lTm;p(WWe&$JNkC9s_u`=^5vLBxx|W#cf{w_7wyma#~ml0->+C7o$#%h zV~+Q1$7#*<>?F-G3hsz#N4a68ZjHI^VFNvUTAKQ);BHQ(=;L8Z_U@)GxXf1!i7=3bp~MfuqJ*Z){@BckAQn`+M^VdH z@}+r^EF#D8K{Aoez${)cZg(tA@N=%`y_2y@vZSSzpcQxV&^OGqhB}nD1sWv?DWM-+ ziftCs*QW~V`)3zbZR|HzMWm8Wb6dlsqG+veq3`O~7hBqiv?|70TrLh@F3qvab^0!S zXB8pfTy5jOZxgfD zfl5XE>V1R5VuQog!dUB_>UtM4l-<_zc6GZcMc5lt@BaF5cEI>)qTS<{(!Nw1ZcxkT2QuwDQu~~#X}N|z9p!GH=AQS4x%2YstWdis%l7giaD4KiviHu z4&Hme9a?*%Fu7d}v)oX>)Fq9D-86gsxo?UFvmgzKe%M@?`b8hrB3)zbK{o@HG?hNp zlkcz~F`A6l5+@!IOETf&-!Wknb#ru=lxnV*l1*B-x9)5~ zV%Vx^4eTX3Q`!i#R&Uzg@FOuRz@h+=_JF zgjBEa!F+(cXPc7fRr6*NR($hTI`_8VCJ)F^BbAwSVq;eIkaZo`Dj2pxUTtUoVr#q7 z?>_6m#p^xq(K2egV4<0Sry1q0d^{`%glbF>4s1Pbz59+1;M9_y7Xw;3zrjEIQsjAg ztMcUajFz|X>AZD^=v}ur`S<(bB)h*?2MXjKH#n~3x1JQQPZP4g^tP_uUk`jg;Dq>K zJoAJ2c1Ax3Yc&j*A5x5%AEwJW1_gu?Rsa)+@^QFemFYw1wY$)5Df~&U*O4V$gK!e< ziRlCM&@3CpQ5(+vIA*djp5(-Oh%vW=1V%S7&F3W0puK_YG=oTj3_VnfRRMy%T~O-D zUUFlVFwQcn=asVJK_VLwZ{V_VW}868awF2t6oqwHKxRCLGxDd23CTzJ0RbpT{{<|+ z{8=Q!f2$hhQwRE9L(&r6I5Ex|+eAdoGBMXb(4#SEHcIv)lwB?vj8VQ3wlzI7O`eM9 zR|RXeg<#Fw4TkjVd~PvDQ0Ias@afPp>!B(v4ml?Bk%Xv^PAa_BsY~n7x4v`eJw1dpQ`xdH^1o zE2RvP?S8WNx)h3WAho`Ru|H{Ua#|SfccZ+>rR}Cj1#6{?7+#P>h;<4DLt!deD#p=R zMJ_k$D51-y*{`s7-1#4+$x>*jlw2ORNrX;|)V^vUxqbMkLstWIr9uy;$!eN!3!<5D zQg%{5wzyHJn<%@fBxuft?qulhHs=Fnw7d#k1eZ{E-dAN8)d2h)(C#-deMIB|+3BKO z1l~i2d}>)MoNo}lu;PLY_s4_W+`+V!1abD z!{8MhfbD;&v}oP<#|6b9>4}PO#br%&VbO-9o`1~&peom0OUv(;yqNXx79t5&r#A>q zE1Gu&oL8F>vi)si81ln6p}a+Tt6hgLwR^jdDv_x?DDXepwgOb;Y3Kg8tV|)^vPNa> z)(gdu_$GZH!?T~@7{n%V&QXa>*N|T9BVq}ilTdE2p*(4cBd2o&qBxVI z>!FCFgxUMysZ(-))RN6Q>^?uTG@0i=)37MF=@aB4E)0cK@+2lgE1O zInjr>^lMYze@EtHSA3CTH_1S!mq8Mwh2vWwb{AWM^!MIa-;x9CW2G( z$Xh0-PjU{cSME?Htamh+>k$$pV9W)VJe?l*!%VGZsM9VeE`3MD9B%5M?bG5^8U(da zV1toj!i`KiL)ysv&oZjAYeP=f^|7AV*}}Nz_qeRf|Bb=+zmp`9pM2o``~w1m{P{xp zf+HfMzD5Uzg~uc$CWVA0r=>^4Wn^b(<>Y5*6c(nxD=qyNQ&gN*R$lS7N~5H3-vxr#YOn;iG_#nK`x~$|#K3V>Y zuVT5~@A&a8y0*`{k`a`iO;P^BxIddT*q3yHb4NLrT{yQZr9W~aD|D7nbTQ0wIzh+- z$xDLgfVfaqMs2L+rg^T)r113p67Rvhri;_5*Dv04d4X7Ft<`UCSJL{qGVE<_EmwOH z`EQWldp+E+P1dWQW&ZYXJ&=4^q~*Obm2jt3=iv+PxjAt62+?4~7UumFSvHXAblOF4 z;B|`=oAu>)%mukm1j@dcM?xn-mJ5owy}_5~LidI~@M?sifyh)%lwV%H(nbt93PnK; zB}^@%2!39oEe8?UP0oXeTxy39iiN4l2lF2m0fQS9nlBZdk4+RBBSZCI5-q`}O%snp z!Ppfqra82hpkg&d8NOCgbdGGB4UgJ@)HOuPIW@Yrmc5WxB= zl0|=%(BEX>E1qN&&yYIBa6FSvLjVeQfnqAJ;O1y?t@%V2(+iYOpqlh7pD*b!eLbFj zCYznD-)9(^o3rQdTOcQFvq$&r>z#4TJ?-i9o5nin5AIQf?)1aK+IZph#pH&F(YQNbG{B3(*S;bQQ)8V4|G z?x%#400w#pZ>qCN6#cuNt$U#&f>hPvOoRYxu#GJ9hiMNpXjY1XZf%p|s$KGo}SfzHS8 zA0g~BUCAC_1o5^x-&Z~Y%k;QK9m~w{%i`iZAMwZKY}WvxLh7pSCwbr^m`WWgZyX0L z=$M#mD!FbTBxC9=5LYX!!PF=%Z!)W4u58D=W`=cR>K<1QjQ-u-F6wXz3WhJ~Z+1@QGfBeXs~$9j21!#RkgTXx<}=alX!$J}b;GbWmm zS37QVeS9_X3-7p}KJsz;AVhVo6Gr2WZ3ItXz@bOf zuFsG~pH&ZU$Ne*p22qnmZbk~Ps&B`te-GQ~#nu;q0aUcp-d7p6$Nj{#Ou@}`{#Bvv z$~ZRR!_>L)`;#2?sGjp)+_gTiVX_;)9PwWNjZ8yH-F{6YW#ol7ZJOmpvFt=XbQc2w zLbAT3tltlM9BaR?e!Tgrcr#}WEYH3^t7=1mmzOS51srIwcch^ROn{SwcF*j|Ew7MD@#7VnO}} z+gnRHgH(j%>g#P52}?!OU1)4I`n5U&z0+_8HTprQ-a7dyxKq9KIm z0p`y#x|QtYDbhFNa|I_-GRI$+)n=SU&~xlA#JRiUW)Tzaz4~=9ky$sL0m0c9tCV@O zyKt3xuTdmO^!UaFi6;}HH1hPyJ|H%62AM&M5k~l~?@iOpxBL)BMzTdD==@B8Kik9vg(Cuq)VNrN>@6_?^@9{+% zqK9v@l75y8y(m(7!K59@q?!5OF~t9K=p-AR9SCAIRN5ig*=fO8=+O7#F;s!!1hiJm z4A@5Eei$Us073^7sc=F@`}dZUdE!Bsa*iU+G~eVCSw!EtHgnMRrqF-f96f;2jK**& zAt?#+h$R;4X!@lHy$E=VJzHbO+L^#yQE5;e+BfS=J5xkjtl19w_H*z6>d!iIQKnI^ zRo&o)&JXro&b*6C;YlZ}jSdcfp0f}h>Xo=Hz1vE2<=pb4;tCf?`w(V6Q7s-!$Djkg z#iSptblTlxj-TdV_3u67SY%e7*4H1fZT z_YT_)6Puac>5ZCeYPlv)>B`IQfmi!K2(}{%ygU%kUzn!7&SKC0b*JvP*pYQlWe4Z( zKj4EuYq?jBA7S15+;-RsW65}dtUNdkOw>}?PmoNniXxh zk-plY40&$GP4$KL^0ToIW5pm9?3fWHF9a)=At&_3W=Ia%Kl>SpBG(X+xuWEdq&~&D zRGdA&J9THGF4ZP26;M9q$Gs7!-HCV8af2q}JN{Etun7Y3nY`S$)ECu6*=g{esB|*M z<8tQs=Bp3031uIK3bP!j1b0dNp;qRp!4)YMX||7oJq2m6){6_<0)`b}|AtP?MY--N zfl76YOoeF$PgF+$EQ$sQ)2V1;B_&+_C8bK8LI~x(i;q5lIFx@>(N;lBQPtHg&r;q` zl~!8ZRkuX~EMpPM$?a-=UkNpRkM)Z2DdVqD3D7%F@!wwsxD ziuDilD0VTdP>FlDsSy3WG8!=bL89hgXFuW`aD|Slnz517M|+>){SNFyHD@{P|66dx z2@>29oUm`bq*sDGS+&sT0$ZLbL?UUhp^4W{kby~w5s*dX-&5=v7e#n^EiFm#(Rqx| zDgSyZ;s$J)#AQA@GiuOha8HW}E6L4CdcSP=DIeF)J86M6rb^~Kt%ptTy5*%q;fefY z+_&aUK;5(saWHJ!aGJ{)SaEZz`Mluo zEK+z}d+m!1ru$B?i7o$Oq|>UV!wT_7kRJxJf-2_1V)-VUZrcI_7nz;tFZA@L^q8Z&_X_x*elII_npAy3kq+gVR9 zejDTrK0WE8q9V!q`Bkm^AeZ^VTN}RKESL2Dbwmz_Fo*+>A5DRxxDHR^D*77+Skh_P zaHtlY7;MqLq|I5<6bzWy$|^Y2q=u+CuHr!W>q{P=jlwJ|jsarb^fo@&e*@?7u=Ste z%LeozB{oUE11~7jXF+)1261K)jYA|!!*Jq?{!`~ySsuhIZo*+Uu6`y3p(JR(2UZ}5 zh_|LIMAP#fyzV#=b*@`@Tl0;AR;rP5rqpCNveJ=YoskP-i0GUC(tJ}`(bqll!!S8{ zs3c-?FU=rcv#g)MWlT)EDeZ{EkYb5pT)OEtJvF0T6lm)saPBbD_sgjkO~sVqeV|oH zk&Aw|k<>vG%n^7HXpGP8k<=W-m5}0Z#uvxgiLuKuWHf3*#hxCPj7dch3%ldVT~W)?(Y?v_Y^wP-l0?iu zTqdWnK9C!*e`bl9FftbC2wxlM`VEqX8qd%Kvb~TF2iCygU0@vrdy{_S3m*Q@Y&Zfl*KAo- z7ulKMt^8yvrP{iADm|m0crTo%ST8Bb{=HAan8UU=!y$6g(-CbyUGu;wNdPnab+<*5 ztmG}-N{sAg5ltMMkmY+TJKG@5WLM++K45CV9$RtmpD9+E(ARcB;HhwoykoFEBZvUcE zmvHbh8kInmK_MSdO;U>s(r2G87>m*(<(ZTU0Y(zHEYH@kY=Gv})wDP*fuz2elo)wCUCZ2d*Hl+RBBXZhfHTZ$n^M2-mHb+-p zw&vZb=!%xK`Xk#mxM|%pjl0$8%J07_me@L#fV_whd<5JV!qvKQ~knv)bB zp$sImw+y*3^8i*&ro3*sCJ)Ynx^^^erfo=uCdspAm>GBbawKXTFscRiK;=cG_BZ#a zxV6dE7-Xkx=!eMH+`17(^gqr&Xw)<6CKQkXG7|F1=yt(;8ZfG#*R3?r+xI;0T^3_7 zZd}p-nccXWa1FG&Y(9H61MB{IAMY1!T35uD9jCqcSJh9(8rKpa;1=sa7{#~g%uRjJzT0}Tc}4R=y2p4Eea`C&lmm}6TerhZX4~=8){eh1Se?JBy3TvNjoU6} z05TGDbWf%4Y62M`BV%=q+Haa$$2`s=p2$Ql`pBO`FGu*XysoE_)&AUQny%g6?%pe_ zoOk=P|GnSlKl}Y~P};%&>%@ut_clNFqpuyp9W^=c_2=(Q*LGfWP6h}_^X(5_6JIvf zDG(l#UZEJj`P}BQf-Ef{{uI9+K#$>rhHxH(~fie>{@F{B$>799w2*w8Q>6d)S6 z=jN^3Kx@=>{Z0^670i`SiDoA&xla`1;c%4$RTt>5>ZfSBh~x>~Lf&drH_s zou-;+8%y`HH@>*6u*Uh_@d2)hN{-}Ls<(#)#p*?B%xYtoS4=;0-!%i*Bd^tbsL2SD zXen>nyGsAX?|}+$*=BP-oz)<=YVBn71f%O7_cq0W=l=_Jo8u;qZQ)pY{x2AUSCYf{ zG9hF}szH|15Ll6Bxl6M397Jm{k@XYLL0F+G*88#4BkOqt^XXa3R_D{1Hr=Nv*0x)V zt-_c}&A+J+HhZ}_NBDyzkWcIIft61TWrdz@n)^SrL|P?24$GWx9PxO+5-q(kUkQ(3 z_onj_y;U)Zwq4?~OyarnK`SnQMx+f<>bCsiPU)>4?x2xr(>r zAiM`O@hbA6@Ck3_LwDjd@q@aO3~Y5&DNSQjpvgvIf~qNIVF7eVRux0LDHi?3*lB^2 zs0A6Q8!1qFANUe&ngD6F(VSpS)BfD>zeEi5{`g@Qxpk6jxMQfuDBxW0< zUi^{L${HqNn~MHR%ai(fGoY_s9^W2qT$A4!X!;@scJ*PfTsE3?X?WWvp?@JJ?EHVr zc_C`H=IdGA`IckH)U)qfx7L*{_um!H+xEyv?Q_)JD64x{N_ap_I^4OMfXLd@VE|r_ zvStwV!mwtDB)`p9L#1w+i-@DAYcT6kZvv!#IsE&I=bV9Lq zk{-9bc0@ET=Xy|aEB$hsonA@x|0R(9-ySj)ao`~XmFxs&39t&8?z)%(rrZ?I@G87fzcSmVBUW}Oyipc5L6;h|nsbYs|4&g77SXVt-_ z9Z!%!7)=!_&5kJ5LU&nOEH})nG|0n$4>ZmSC2vuU$K<2I;>WNj?4|Z>nM|GL90>05 zp1yDSFrhXU{^@M?yWtaB8M7;sQ3JvXRpPHC&Mur}ZgXj2=5X@~0K3K4QvnYdMxa(} zPc@90tK=Qo{Y~UN@FO2JQ`$?F_XxGZh#;ms#pPtON#RUc>6{;co`Z1*Y<_cJ{uqA4 zO};N8U<0?_h5O_wktt%1v;Sl1ot*-UhF`|!fPtjlfqt0Ifnht+$T(uhO+ z2443&g=?;VGLR`ePNZ&D#gJUovb<0ak>UJz1e3`E5Nsh?z65mlAwi^%GB13nd>ANw zsfV?U{SYHfwge)Tz9q>>{?UwnDF)Bj87&Fb*@_e#uQ8Dkt+_RccEMxZiQ%Jbrjb!< zkj9QzmA9mU@o%~kywhTe-*G~4IM_)-2(8D#}r!S(H?8KV8^E@Ihi?fCWIE8FIt8O7`-irG*&3-Mnxw&JA~;VJM6dx;zj| zz;tFL%a?xo&J%g)>H50@%CAc!ng#)u>l_LP`dlT|&~xOpJo_GEq0iD)-k z-9ye!dO3)@XXMz)fLrD`!1@}4bCg!gldGT6F5*h;r3}F6=+Uh7;VN?LO%kg}uv*Y+ zXsJaLYn!kR&Bm&1*3bQy8V47zekSbgM_!nY_1MjvVQ~5Nl<8})+nKipD|~Z$Jx?!P zc%0(?1gxlTDb=s)Ts`Nf^+wijT=-m=!N26u@tprrZ>Xv=2_%D4( zMS1$;hov$JBS)3N6dovPAh@@i>I4X6;}Oa&2gRl1?t&FPnIiyE{~h(z*?v_J)^>N= zdQgb`TI528$ou#4F#Ffmt5*M0VWAo1j;@=&o+!_|A6NR5_l&*d9R$}N&$|BH4ditE zMU2^aO~is?2uBSQgMYW-qsb5i|6=~tWc$SD%QS;OpilLuFUR`{cO4F$5EVja@7rgw zzDFj|f>MzE6wZ@=`jU7j8GgWR>hf4k`j@!N*v?yjXz6B4)T*FgSh!J z_DjL^Y&6#W9s)F#5N?POOavzNCISmZyEhjLe6_!NZiO4<2NCuq`*ZD5pjb#!W25Fa z)IZM;)4bNhuOE~mcg2ZVBcvu8OP1!fijK5OGk#GiFd(#8P3=0GM>gi#|Ej`);v*i- z3)B=TiB+5k_k1MkUxWcNXf&}9UuxQe!9Il`hZs-iZE{K?S-(MtsO^vsEa;cP@BaGY zH}&qIEp;mBLm`Bnkb-Re6e*qYSg`;3z-C!JqTjHQ)CKA1kl~l1AdDletJ~p9v4okw za-#SVUtk;(+GlN6o490S#-2ko`j(OA`FTL0OoI-#+Wd4Tpz}bN7r0|xhij>?X$D0v zir;*3@6EDI-s3tFRPj2U&L)Kwi8~EVdI;g=;@s>>I_RkS?W(K%cXI^s|JzGN2fb7k zfFrYj(zO8)k8dyp1)oAZCbt(xh%86i9h2All>$JeLka*?8p`~RCRvrbD~b#@jK`pc zG!#omDNR!pJJ=UNVlILpd!5a=5}{MN;GU)Dp!E&;psF6SOpIyMxNz z3T+l_En0oGTU{6`8k?$y5=LHZgXV~N46g@$`MU;+z3FHU;jAWB>6g#P+_atwDLe&kw^ABBPV{x@ zuJ^eL)hqSMJkTZXFA(Oj#J+kzNpMn9;0ohu8&acC?ayGd^UNE%Wn-HT1mNx#l6yZr z6PWga5I0Hqp;`6C_+ur~QwF+dTcCLV`9QetL-qw_(~ssm+(sx~$)ItNdmDpc1O=Zs zbtpe3Xkp=>?r#QhxD#$iW8yPT#;^epkASvW3N6Na$KrGp!?1NN{x?t!J$j2=o!(UI zSDU-k@V!KZ30hYF;5@4@3X;Dh2u`M0x^$bR*$o4-w99JfUXoGNL7|vWfuIErNJcYc zu+g;aA(5@rxZVm?ObBlb8}8R7zq^h$7_sGC*;p0Ro2l9PsUcajsV z4b2h6X6_Fjwzvc{x^|5BiO~MJ9>QMUH`&uQ6%{sFM^O2pJH{E<0H~e%B1*jCj`c zF`5HJnGpYRHJvPV#=w*!cVy4>8)1t2nR85@&Y#-mqW!Zbgh2Nw$Gq}S@F7}{@D@G( zW)Z=D6-xVgX278p7eumEY0?(P^mrCaIl zPU!|IQMv}CL_|QOg!TA+dws{=$6o9GALe-Gci;DQo#!7%UzAy8x{pE&&z**TFUA&q zyp(naNvy5V&B3c3b;$U2qAn18Ff?!8bDq{QCS6>-c6xHD^#52s0`d3cH*c2qdkBV} z1w#JaeD`tgzC8=txHWpXN0)`?^97)A=RevJl|hwz7lOBtC&suWgQ3MAyib)+BJAB) zur)&jdZ`#J1EG{>`GQts+Z4$C^0coIkuuy71P`&>a>v735jRBzxGv>`v^NA%Y2=KA zR%ZiD(~0yV-36xZ?ec7L0x|O3h~EhZ(Oh`Uu^LkaL@2)$Ib!B8EQE_>XWNHaeFUqih;tDVx06X8eATdH=myP&vNJ%2u zBS`^q$?k)yZq%5Vy|&vzx;&;F(HIv{T+AVmrS|l4Hl?<@kiA8DLa$IKrFEBqSC1`; zd73#^iXco7Rhxocj0g*w6(L;W(_cXToOR5ARS5T7!y0Oly`YfyxJ@+Gp0_D$CXQ9C zN<765K9oD5P$u+6T+`E)1umT!#dz6aICHPcjE96;u7E5%i*&J_kNyooQ5*g&;Osf! zJ+q1|s#+qPlDHs1i(Q`SKr2wmot`LuP!>C8F3#1ZXyd!J%;2Ay=!DdKmM;ellxm5Q za;YUy4;w|*80{?h|1?|w4_~hTh)|$%!o5^(Iv7g8q?T)~wJit7qXWKZm%?F793fA@ zp57Ww#8a=_^@bLWr7z}O3(Sr-RY^VioTcTiot(9WI-Pc<&83_mPhD8VEn%z_X5Tm|f<4y+<({l=M$@+A zXGQ~WwjVdEPzL1VW7zZma_s}K+sZZC~0T- z9Ta>4uowOJ7XYNf#e7tr-W-j918$+3Lcj!l5lwG7NzP|Fai{XRRMk@adF92j;DJ^l zV?08k!;NFIlrIk}te*s}s?OMkmRvG@3*ddC%U^Q2B(B1s8DnWxk7Zxindn8c`1NtG z(AX_Q{joE)3_A6H?tS4(cG?UHdW7zHD{`{k8FPNZ@}11VgfVqp|3hrYcf_Z+3=e;) zJ5T!t)y*igpHKxmAbFWifr56N)24s`CK+$Tx5S-MmRj8&M5^0~tizgD)l6psP4VRq@-DyE)BaM|2m2MTt?~lI{={wI!Zuwm#X%0) zLp5v!Zmlpv3DXN9Gh!q5)ENpVqm43wqX;Z**`~mj=7J|*S~El_S|4CU(g+@yM4>2( zX?b&HMw!J>HnJy1^3}2=#UamGGsSQokt4mMzhN&_h6;)@M@%YElwiN;q$ecPHOqQ~ zYVe9a3D*REO$5sazejBALYvWS`$oWberc4&LiWb<`fa92oOoiERq3)^PH<0$M%pW= zFxz`Ck3&Fd+*^kJ>p`*QgP&}9uHM)2Z|_ZyI0*9cRn%-sbc}2daD<(~;QOH;(h# z4b-$tU^_I=>%6G}D}*lYw&}0GYMQ&F{E}MUrN-K8*aP7+>J{R^LH7h-27fYdJi}FHAWFS zQ{9EU2=++;vn)ZHlTXX&XpewxY zvHABgTNu$s-!`sF^9UmLI{=a@)iPdl+P*Nl=E*dFs>P7&X4JkN#Wj6J`A)ueXE*gt ztNCE_kn1@kEDpLy!9+rd>U=ak6TBp!kNjIy`o7?2&@qw8 zodsOR9RNw8grQh3%cDp+A(|Q`;#rOhh5rm=XCA|P&^wSLpU^^m z+{}Q-R3J}#bLuCnpo|rHFhDl48>Ldc4b4&^puOa0Wq}}wU+XF|P4Gv*u}9$Lv4^lH zBt`KE@8GnwD?Ijfi7Xs5r!_}}N?#_S2SbYK(Kw=>0Wt*(I0>=HMJOekQYMC3P@+TO zYOi$O`9Y%T9>`T_2^te4@4^_#R0))&1(QE#7Rz$`sA`=I$2ZI>XZQQ1AIt1%@}Mv zJ+P;)$%x$j?g)u5%aNX!rp5x>mZH5Kk6aR(ayMnIBo=*QalLwoKF}puQ6A_$b3q8@ z-RxS)tYgjsrceH*RJpWjfmV=+FcR(sGLuNBHatS7@J2XXMNti&oScsW7Pru<{GvG5 z=Aw%`c4;;Vo#brc5>8Dsb*d{JCGU$wdPOTuP1E@lgnNl3i}AA{+p+u)Zsm%@Ht2~H zj2S(t6?x8_9QnSVi;jr@BYv$Ogr33soI8+M5FSZduaX*-Z>C5^E}*llQWC8E4k8~z zjkyI_`-1|U_1^%=59nV-j-_#ZWz~aQ%|TyGe$9T<-nchk zBYAex*KK2b`CF2}*`z-VJBQm(q+xhCXd8h;D;1E|_gtUd+=5p(%_yL=fnWq$oM(euaN zOo8&lLqKz9`uC-GPR7z*K5eISgGs$M8%cj}|BN0k<^_PB2z!U}P%z50X?}=VNFhBt zkMI%@KA((&fb664#9#>2g&zKzXDmOIM>Z-iZ0F*&Y4E4F<=YXMyclLtj4R58(GLaQ zIWbhzbA@oe5%!`mVf{>k2*_UhP9z?0(QdMO=T>n_H+Y{leGCiDUP5Ys_NUB!`7NOd zsS6P}*>kY)z1Z_$@pIFf#)c^C?T2VU>8}-EmvyK;Wz98BShjd?RqB)e;W6gI zex3_fr9~F+l1;f@l>V?)P8^!;bN1YbGk{9<^h}MU0KjOP@;^wzg;$ zmA)iZwLMr|s*TzDRWwze+2BymE5=pRvZ659I0@b17O+>~`q4au#oX6|92Pd#y2`rc zfXpDU3a;bnlS(Z}COJH?HP3(eHEHacj(L#RYW)$2%?m@!)AN1&{mPH8>$+#sse2dM zzqW4)FsNsT#s3OF&IF+(lhn&@e;{%$FOyS`PYv> zD@x3@?FgvwMmu|={D*hnCbuoky{4Cs#X3 zv2s4&P)t9F!vIFI!zhrROx<@N~#n^ktuwX3n(-xfUuM?|!d(I#}baxU$ zGB?Y7kgLymlviw657D6kkNl1Au)JjW$}<_L!r#{ zsQ6+7cMLN@G*W8RmSXa@OS2K2W2SgBeS<<_#ldMyp#;Z&>SGv5e}x~#ZfjcW4pQmJ zM@k-V<70!A6{QP_${pRep@AVWv0u?z#|8M9$U~d}rB9`SzqmiVf|jB?xTYu&??Yn23V_k}r9$E2Q#Q2c=@V0>LVA6gy1q@> zV>oO=qc$o3seqc8AN6n5&kR=mO_BJ~DyikpCULQ3T(%2Q`~@Qscnl&rD%wmyJ^LK* znB9y?1({JfdCgleVj_pz5FV$RjPWT&^yS`N`*Vw#Jn~TFt$|eRxUy%;Drx$qwl6Jp zvpiNiAG4&@y>N~uscJTPUZ!QLQDWPo@v6q4%Li35-F`X5>T{*x>Q{%a?XIG5+&6!C zH%fgM6Ao@kPuJ=^TqsC0MQhAPf_9`?rCwDO&E&)KzUesU*nCdGrq%!0xfQ#}7dM_x z(|LI?U)EN_I@b9Z2KbXyRWvsu{cD|G*vA25kL`hbI!HvCpyTY@$M?Mv_xW93KP_i0 zA1Gx4nc(O9*dG*zKRh`lgFGA0c=#B2Rk}NAr;zty>*lh&n{3m+Y~jy(fX26sXrH@^ zNW$Pp$f8^RXmI6OYb?R2520kB^&tx()!jzHa823{#J%}LA54cu%!tB2P`+So_i-2} z2!ptJC_%k=Vc;DPF+*{pzyvvQ{PX3gq6DcMjNL>9Qt=(V$2~2~FsaLS!bF&y9y7{w zk(X~@y~ax|Ns*D$8_F;he9ZdlEtdOU`ZGC-k@sFui-8Y*U$@Kh#vzo}wp_%WaIPrE zN>wkG|MFYo^$SR0rJ(?(tm!qsG_I>5cQJMv{EicQHTP`muRC}OQ zs__4iZ6jDoI>A{U7bAg*)`zSP3aHRGS{!4Hel$oui0$eo2m@nHb3c}(7RZ$X^yK2> zTW;F9r?Dz6! zBhQ%c6d*W48l!{wqVx?zlM>(oWVgr_fKgic^ABK&9`g^mYiRuPATwY4htQph9>9(T z?0nYOxvrz^_0>yU=fh&(kAICmnbdHdm9MI9m=h=3om!YCE*|{y`gKvu z*9w=d$LMWgG?z+fsfM1g7q2x5zUny{YAzbbK5135%;N!Hu1!BKS5pEWa9h_b7UM-W z{?$&`j3xurw=D6cJvMZI#$Rok2|50eg<9~2umcBe|9&3X(BOd-H+C>ZdC}AHqtxPJ zAfk;$_C0_k8QnC31%K!F>`~s^hO zSm48`*W8>Y{%oRvm??Maj2!PlQSZdf_p0st+n>*#btx^H*9H992z8pc+Re%9xjBA= zdWXg?v*%D8SU4Pl99tgl-2nAL)D|mc}ll z`s|pp97A$St`ZBn&$zs;YtnmvW_C952`Zyx!qVeyR`Cj%XMwKt1;pPx?7g~jrW!*^ zv9b8l&eZ>+p0f_(s0s9YX{0fK&d7mS3W=U+q;a47ea6A~zh~*4!4wWI_w~cG=>w5q zE9CD@U^*0m#|DC#4G4^Aa`6~yj#;L$2!CE>C@*DRU*(aT6#Z)2kO)GceXW+|Nq4lUJOCdBtu zJZfFoK6spP=zIutW$w=pjWH`{S2rvwFC?tkE-xY+2S&0mQeW%BSfkGeMYakO71U{J z&g_M%1J+a{@&j>^`U%!u*{m(FBBzo7i8B6*CZ_5->nB#Rx+bW4{XOyA39phrFZ1j-l2gFdYcjqn3^< z4>lW)#SnHpK0vbomN4~fg{*mo$#h=Rkp-2e(oeZ6sM*zh&%Zs(fP_tO+cwGS6szal zSYW>7)XsichrFejPL|PRB?MS|&M~VTX4rVylA^pISvTjZ_g{t^Pt^GuDsOwekABy! z0dL6rwqWtU8255)8dgW%G0}ZhUl!cz%c_$m*UT0+GD6)ff3==js*6=`n(-k(;`fng zjbu-Prm5%Q3dCuL_xOhM=SGh*3LU$Y=;(SwkV>BPdbr2;GF+R*gr+R7pQ!JQ9=^zZ zkotYT*s!xc{eIW$6f(@l<8<%;`(k<7D~OJ^SocPM$!pW&+M#XJ>+iZST>!FL#s_TF zR?&ICPt4X|yf0LX3L?Z@!_q_;*x9R^50PlQeM2bAB3 zZ23GmYV5FxMwr!mF^*35A|x?2jN+t!oskUI7`C$a5?GbRsN1074*B?S#EAwNep5AV zB9^1Ip2W<3b-f5?F1&^beNYX77ID?}Aae!RHswFnfBnwwJH__Vt zXzUWf=5DTo$D*|Cm`xtHP9qj3y3dtNoFL-jMRh&#;@fpZ>=5dDehAUsWPdNQ2LH$3 zz{uP)eQ{gYhr$)-Jb)#%Hu3Qa0dW}$|BKB(jD_vyGEV7sciIEJRTsbl9zB6UPCp!% zNhWM+p#c^$i=i1MZ^q`?FT{q;XevzWnG_m1+moN4aWSE>~)@2{JdfDKdeN&c94 zHr;*R6-)T>r;FCR&fi15f&Q>frw;?SKO=vR-klREO#J<`Pds)X61LU*Kn-s6POv^? z()xhxP~$sK<=z`yNYM2l=EKdOUIGl~U^HQRfMV|qu_ZIdJg-KOkR6EgoCQZ4hMA$3sSG#7&xNWiFjBrRA9-ld zj^i3KqfQf3=1YLY=~SD+E;EM=!DdMeSVu^r!<0lC@e{+CVYafWYWmyB847eyF~&pX z8Ize~EsB|v2vk+^ij&iaib;f3p-+8X$)a(-v8(D$s21v^RZ(xSPL>b99&t@-;(kkK zucvCz2<3=Tu@p?|*RZ_TNloC!peR*EV*qfSa-BWFoai_!9rN`0;=RWW;~Wm0@SJr> z3AZxEv`xZujO7JZiI131;aW}EJ8@-#`xV$vO&ULcKuqnwME>9XIh6nJ?HwK5-U$GF zj0q4x#E|0Ug-IEeES9RxhV99l1lB-?sV@|RB*Em0pilvum`7x?e6DCRf&NhxwQBvY zYAWPq?bKBx+hC@Us&seOJfnJ^3OW)A#{$D#F6TSeALCWFUoux4Em^!P>|S%5^ux&| zzh>*%;h2}djIH4jDSlN4U+DD6U#v52NaXPo`LROoxOo#diOpqL>vev#?nlbg-y6I> z5O1f;WmXsS2X1}r<*+sWiffU?`;U(0NC4f#Uyaj9yG7cLvGh+`VGe{P*9Tw!R(t(a z>Z5|u%H_6?F4jva-9Q5Zd*F_TpZ+&(*gB}SA znS^9gk7dJgq%lmxuCzg@h{86LERqHdeS{>? zcyz?kFrj9L);fP`Q`>d6^1ZH4kiEKUm^QY$W-?;MzV1+#iW@cvrK)PdOMT-ge4sQ) zfOp)8%_FZk^adh&F@HPu@sDp&ohb6fYF)?vKeCQkw|Zjt`PWI@p6e6PpF=7G*k}lu zeZ4FOS2zFQ?b$7VAD)Voa~GL8cijk%%sfy#2XhM!Lo%dfN3hDe&jx9;K!0xfVy%f# z7KNutxrNwp5(nJg&!_jU0JTvGXFX|7neEBoyrkq0oCR(5kAz=d8Ltz5)|C9zvS>_2 zBl1-$2lw#`PKZMbp8IE>{&i?RfR9mvHSlVYRjVi(C$fNGw2lVHp6Azn+ zF8Y7=q2L1o2$SN(uTgnW#=vnv+_APP&^@7Ecy2uQJDi{R?sACiC(+qBAHL%GjJiy~ zZ)cOdk3UzjH$VQ`ij|Ru&B!}R-yDMJ=C;=hA96RALU)~O)$?ZSSpd#2x@PJAzGwW* zNC2!)z$(_SqRS7h8Z$xr1XN(qAu@VM0dmk6S#&5f99nEbz#9d_tt|xbF%=BOD`}|6 zX$U(2>+^xV`oL+Z5VdLLgId%e#!+JUlduAcU~)Nzr{Pg-Qw3N_2XZWegki4%eC$bK z6t5>CvI%5IbmR*6dFEUkuW1OSo=Lb!YeOW2f`+BJeK^7USFC9m62+vq((_`Mct`&t z>>V))38Ro$FOXpxUs9IwwTQRJVWviBRF-F)kBwO~XL=|fk<~X%My_C{;fo&Sw{3iv z8&^yP6GswH)*-~<*k)6corDq-!f^=Uyy1O`W>@nWzvU-rOjQZ=zRss>$C>bY0Tmc2 zQ>HY9CAYfw)EhLDtWNtqzJg^U8`6~QmS$EFA5{V?>2n{IizJ*6i7r#dvYqwYdtUJO zVqYHBR|-CVo=>)JrL@>F7lr3uh>B_>C$RFLm}O$KiT|c4PUiA_)4_0Ls{gVs0SqpW zock34LLr9ov6(QjD}ypBiHr!RjSKT+7~Atef6O@+%@Bbn)7_Z#Su+-x4iU__Yu-&G@Y)`g^ z!>x{+a;cJSX6r59zfaQCL71r(PIjhwRq3)Lk@#KLT_MXAk&!^B{J~&(?rnOOv0}PG zL(~2YgZ#Ta0}79$sVa3Z&zi+#hgI%|gRcP#nNH?lXKv*~U=(UJ7$ zetpen9Fbo5^TSEk&H3s|%I1T?2@PY;`MwRx!SIKVdKZT_ZC(!~(p10C{XRy%3zDAX z1)YvW6o7S1WW``CH&O(h4y_Qhf3RC@-USmf6gls$FcSSGlL%DDOp{0~LkzPp6wPwX zXv~`J!dUJ?dM2!a1>GGSF@)}1ETHW(#fxC26eSS+YFCOALgUy?lst+ zHlR>&*)_Hb=2SKHC`nf5*Xj6jH==NK*(-LQr~%y~+O0$WHmL+}Yg^&!ap#Qhn?46Dq7T9 z@`l<-FP{GpR?t?*)dr7hjn-Eejen1-6_4i^3pU8*vLQCy1y7n} zpKextK|ih`u6<@vvBjoQKpP8vlI>omR{At_f||4CdrqBkQ`Dz{YI{9o>$wx%E|Hv7 z`xl529@z{>aMj<8W3fxu({Hi&>JI11PyZ;&AlBW&z)0X9hGV;4PKDx6gI9p4(5xUFq6zj14;}}3!6*_|TOpW& zOIyYSN(Y4DBt}tc5mZmNOe5(9Ww)X*IjsvrIn>4qWBKrii{gYp;4dC+&l*82C3nCS zE<4a}nxupk#T<>nyIdSY)4;BtDmUUiooTLSzL#Z1>i*40kH6$S?)oFue$Zty-+%9w ztjC&d4Ul^w_MH`mxxDjwY#+RjeDLxDM%Y%PLK-hv3&<$d9u-C(jRUYLE6Sk}9I9Lq z4pJs%r8#Ol`}TPWBuCCgg%3KF6(c4lRW(DqY8o)pixoTeK4i&kO?}{-U>JiUCK@L< zVybGpZzz@O2k^L(8%9|tK{x-XlM6QgRK2EU(F|B7RwZIX+U9Q59N2dw!fHtO9lxuQ zT_GmNdvbSU>rjwTsOw~Th}Y!MFqrH|2e65TP6zHi`+y6_~w7aU!RFj*;fXosG~m;WYFzzNQu$K`S#jmzBY{n4VQ2au}LZRtJV= z*2UDm&zSU#Eeoh54v*(m`FLQT8DTWP7ouJ`w9M(+eSEw~?}O{P1c}!anYS!@FS1}4 z`$Ocb(h!d*%r^AF@Y7}x5%cs`=uh0yZD;nPb_6QNb~_XmAWmh&$aqB&(R{TUJD`W( z@$WmLeJ_XTLTneJYJ__b78@vbm@9cAzE%AuL1eE!2gIOdFHX9CzJ}1<)dvt8`{Rx= z@r|D)Um?2B!xiWPG<#q3-JKRu1c6fUzcPN0ip)oqFAsr#NrvoZ0{%>e0;bqP#^&wy zAyseBpOaW)70rEPzLAFqDpE`|u|9h8+29Tp6JD`C5X~6;TwnTDB#SJZ z;2~U>0E&i)3Sp0crjZYZnBd_J9)YDPxEeu+qErkRiQEnprWCbfWO2+$V!dI^tlF`f z#A8IgON0Ec2r(_B@+n$$D*NSO`7gz6cv=pdT zIJ=@$8x(UfV5%pj&Zm}DztyIf)i5IsBOX&Io&${Hl<`wsU;)SverGC5D)RKV zI=&rA<4UPr?_xYZq8V%ZInm;H@{J%-`ouihOVH&gaHrRbdLCso!%tWXRKG1 zEq06UJRa1_IhRqZOq4SaPNEzqdv!Q^kfzk-@yd?#{$AIr&Cg9xC5hDhi(E;%0deQw=eMJm2qU2=S`_ z#d74P+U>7>Isl`QH6cIs2;V{hl`5@&2c^yDglZ}#;Rc48+i>E?7zvRCSYiy(>6ztQ z5jdV#^ihPK?$ZhT?!*)CWGMd-YbXqvSl|e0=I=s;el3BT0Gi% zR3W0jFqU!$08R-3;MDKz&?+Ae^$jTyWT|8?qLsorlugmmugDAfFY`p;E=PGm%mbxO zMH(WQvsAcxrLrn|fU{Dd>8aXi{ousHaKorlQFUV%vhze!nfr^O=FhxlKNx8U-*Bsp zv3A)Df0Co(fi1iOLedq=)gNtJC!Dp--;82;U@P+lyp6{Z*gV|}6S2Gve|)>DduGn; zYFqSu3hM`;!fW;H1oCUu{KVKo0C2if&@cjVm=aLI7CNqn5UO|E4U?Kng^qf=A2(<) z_z4P*vph2ZSN2{h0>I6eavLvP(h!)I`dNLhEbw4(J}z2i&@B55`=Wn=&K;D%UZ;Tj z(kD`c2g5A5FOgZKXc9~exGQ*kftbGk{dL#qj(x{y16ezef#`5koS zoOIF6w($l4MPpset5s~Xo@j7ND<=p*JthxV5`jV!!@{T^@vAUWo+Z+2?=s>a zj43O*CZ|y&SW<#jGzA+|l2VJQ;$CQmjLi$<*(j7g*^94{pV)1Q}- ztgED{xpO>EdR8EqtL9Pu#X_@5>6`u++odw|visDL^cqDZ=SRmwiW$7EU0znL9&ZF{ z*Rni*Acjl5ey+B=q2RMlxz;rgIuk7#8npB5_Hv`_6vkbI?4v7kM3wRvxZC9C!H57O z?*g)rC;!g#?~Rr1a-q%OWn5RwVGKE#m*jKBbV5HS|Dogn(ISyiY))g|M)8RK*&_Vh z>27h)AFF9(5B9Pj{HxAu4gjNTEzR!_N$gmL@rKmR@8hJN$Qftpzc&XZk;Zx!J*Z1hp&sL?j)YO^cD4RYxm=(sPL+iXld~Fd9-& z9vZ{d$X1*H*d72k?tqP+78Bo}0u@6p$kZ*t%&Wd`d;-~rrh)H!rA9K#JO6$aSH8qL?6_3^ssh>U4 z1TU9P(~O$rk7r+uVjWtiVs5ybH+0mi+n14_JC^MGN(OfhHmaYr?s?{%XcS+p{(LqJ zHuaQXUSij}zyF@nheB38(l5iJfz^j2dFT9|kWHhZk5s-}J0C6>HZ-O}oH{tpmRHa? z0YTkqoU9t67RnFNS8yGN6y%;wST*0d@(a#PLB~W=>>B|UUuqUaLN$eQN!I;^Csc3m zTxYAK-dimw?Z*kvyc#?fmj9pb)BoX*{}d3I6QHbN|8Szh1Pm+L|8Sy^fAWX_#);BA z{%@RUs|4~`xpv7UoDO8|{tG8cqsQnye!hc}#bgR_qR&g7e&7p0F43E3RV(67a>P-5 zoLW-#IzT^n*du*7XMG@I9p)L?(qy#`_ODeuycsWR%vy@mOkUSP`eS~)`pT_uXSduL z{>FoM{oR|cK*f#>r{&&Yl&*j(!P@Okl%Kq%OYMBSeU7X|rM?smhQmG-KY!nmHCw|? z%|=CFs|uZ~ZHAUB@5fp4HhcBp39wwT)}5sY_Sd|Ao(^jrFV9YDpx&o(gR!IFr+%Hd zXKK6p5K)`c=Jb64#cnfU?e@)c9J~v9pxjc~ zjwWv`K*(}K4;Z8LhS+E0Sk$~3QN>T#wcgQEViYGL5$F{~vu&7^r0rW&l%%_aGj1w- zeR55Cikhm2m z^0ZLdFw~Ngwt%+u`{LE;7ptz{d1$uug?T$5?_+B_k6Qtc_!pkAQ^#dx7q89_k$Nx` zB>=H0@_yHkehidTr;m?zVu>Zl&F$yVsoii+aOh`(N5`13L0cN~KF(E{!cIeLl=e9l zaPsXGG$L_SRqIS1*yEg!GAx224Q0LCZBp6`M|ez*%20TY`d6;|)Wr0f@B)(969NJQ zl%#=0;}oXWB|;SbzGW2ug3A^A2gD_x(2R-pqEYDkfh7y&I3PCt^YB+>O=xDl1z2-{ z#5CX*;LhQ0nqnKf)Cryl2R>Rcn7fQ)`$o$1+RM#2uie3eB0tm4!yrIlhW&FhE4~_{ zm4rcVbCmalFv0e8=MYIxIb^LN(eaLvv7bdHtVRnXbI4*DLuWkD zP%uSqX;)T)qVAccPAW13OS?ve>Wj)^^m-sH8GB1_V3VXfk(^#yUxMaR z0qUef8BdTb`6XS|;Rmi6Bg7bjX&h6Jph6j-ILcQsK4mJ=l(~TQzcVKP|9^Qg-~$3% zQLOU5dN{CzIjH8UXm86h{Nfq68J5~hD~m1Hg-$)ujW7L^<|kwy#a zq2`dcRLo{~;1@*_(+bYm)u0{!(ST+`4{6>Sz$|_WkL{Dv?;DHj@WrRxWafF9VU+J#T#r zT;IYA1g%26Tw3*6OfyKKzC5jwY7b0_6

d>IF7jX%5b zeWK{9J^p(VSHFb54d%&Az>tuaa@~-5K$3Xpu$9W``jG8K(EVHD{NQt3cY64YUOItO zfw1mqAi=%pb}+=ST>(C~yl5Iqf5~PR%&hOt5JM$6h6rU)6Eh1(HOd@)C$mAni;J0N zR-8ob>rTcMgK5Hus-;B1k_f}o+f6EA_L)uAl;$W&eX%FNoCGn=VsTR2`0_0roSMF6 zzNW1xff;b_z0DyG!?eoMoxYZTAGE$~NfriGBftX=QZVRvRT}WZHHf7JPtHR+b}!B=J#&j#)MbEXT9owy<`9(yq9v(AP$8 zn)uBz{X=BL(W$WGZpytFQO7ns|IDuZ>0DOXef>9yiSZ*HN{f{BVj^qFU&AYQ zWr)_*mLWsz=_v2N9$?yeKeBAo^ss)pS~2!SblQ`Suyu+0@MD{qP1O(4t&mAgukFZv zLy=AE+rOy0@Mn%*-=e?AcL0$yulO{WXF89Jnl~iyfyh~lx_Oka??;<*LD$Lf#YPu( z-(-^3&eMDoDJ;zY7CBE39=GfO8>#jc5IGNu21=blIC>?{jl>?LU@fb>Pkw)SL)U!@ zA?yt}+bF~9xtjgV8-R51#(3&xx$LjB^3*wa@5YFsU?*gyVuDOG5Q654ga__Ta``Zr zwY8&9Efp|QxynK~PjPVEO&}~PiCFrxPUQCQ(f(@n;ROU8Biab#yY9-oFi#pd#QIV{9QI#d&oc2e?=8DMbOgo*V|YFT$U=gV;! zxx%EB_iGsJ^4I-gU=dWlFv6)9{p9si!t`&ayWEQ6iEs9FG5|hVQyAcr;mMiE0+zg9 zKG<)wHR$JaSon=}!yP?Sm;`tG9*ZV_G7X%~*<4c*8?{Mtl|IisfRy1ZR}gs3>x3Ls z!=-3c@Mgl6+;UDY_N1xC{?p+|C2=b>6upD}g;?Qs6x^CoiF>KWtj&^Kfb`!<9$-bt zTwSgb^M|4#JVsMXQ$_0U=;@-U4+#*eF{FB}{^OtN$Fi6m)Q0r5t!9dl%#dqr&MYT# zxsyC`6w@lz$#qRJ;{ToG(@?3RNhHgU^NU{A_)b-}R44%Ed<4zv*zxiQ8+pS|og}zx z>L!@;HFl&9D<5@l?{TG^>kS8A61LHJ&+{3KAk&bsj+MIY^XCulYAR>D!{p0xJK~13 zAFETnPm2Go=nQaLkL5Du(GK+ zy@)(>=9b^7j|g3W&3fcNS2H?25ejtaa|oD=AfduTe@p_PM{UO8WM-MBA?UtW455tE z%7_5gS7Pch6!8AS5MDSrQ`k$@E46rbqs*NI8qUnoe}wtLlxLkUMpHd5N>ZqFJ3;*G zO=tU1h6#LmHxt+t3DaJ7lFX&)xh|JPnvRHDro7#tXGwe2m|BwV=u1(S>Bg(K|Ni-2 z*4zij3B-P$I)u|YE38y?S=HVw>!2`bz5p=4+$W+@^5Oaf0>#OkB+6{X*_Fz)%_~Qx zxxNqJp@gJ?cM`Rt(^eTYE~?7%rX?zC+Cd4v>f?YKdVP}wzkS6pASGgsb=nTKEc)(F zwXU`Tk>c=E`V+`U&esKHbd?R+g|%L+ z`0>^5Bv*kFd?P5q|AJ1{^k2nPIq~7#-q!a)7jGSgv2t=629fN*Cn2J^x^Y6b`S@&d z7{MS!i@acP&Lp;@kw_zT4iI2mb$4g8vO`i$fRA`LHvMGvR}&fxTeEpmX)>-ENsaG` z*5{`W)Q=~hw;4SCq+<2Sedbxvd)Fni9SNajk(`enpJ}6kNYQ5Zy;t)ShllO9O~}W1 z<#n&vfN75wYm^mpk5c(jDrtPNvsWnN+pcdo&*R9aE@21vf`k zTp+RpAELe8odutS%Dun`c2wPTF9EU%a$P@Ww`yLlS@MTr2T>Gu60<;~*z_@a8++%dy*^RP?=f#tTlpe>Wp#0#Eny@}zHn ze8;>)h{~X>{S3ZF*}S({>~$)B7J%fwiG*$4hk|(Lu}wq=8(Zu}N9IR|hS8z&c=vyK z>m1TxmygcG-iJw=81{RT9{*l;P{!KH^)bjA%l8cutbwdCwF$#H1|sYqy!LUk>8VKB zAk8H~6pWglF#Z6-{Pi><+RhBu_duQ<%OwWHNO2p+M0s2ZW7@6|vgNwNIIKx=bAmfW zAK8Z=>kx*c9){5VzLI@jzV(iiJ)IH_Jg+=S^nSZLD32&q39XDe2=c_5^*F)veKpFh4U}a=**^ z^fo&rr}&~&I8yJES+Y>p-o<}}BGxDT`&48l2BUFyB!1Sv&ILXEU+03`yMB5k99K~` zPAq9$DUL$s)$xILNnawPa=LH@Aq#Q_mL39v!BAfu+uwaW73IiGe5u&ZipBi1*VPbf|E`BRGD7sgj>mPi%9-=*MI1O zc`;S;{m~e&Qt=3mOoqaUUMcs76CW23M^NdAnTA1qK_8gXwLCmhDL4udMV3Cs5W^X> zL={1S0CjcR5fz5m$DQs)p&HAeb0J&!m^n!?#-o@)2GgYdhsM(1 z7=;gHuop9yW@56KSR!M-1d@7v*YT(flLS>(m{p-_V)m{{);A?k`z6UVozUCMvZ<`F z$}t$YF3GLHv9&CCNjp)N6N4sETI7khJ6xLUIx$$57pO2%UYuxBSs@4BL6PdlPQrY4 zj0dJFeoPNruJQs$1>1_U#B3>0y=be+r&!vQF$$!)yNPJ=V zTdBw5y@!*wdJTvs$-`T|_5c{j!rusu)l3KMjAyald^%E$8DiQPeYd{kXBTu4Nr{Fbq zOcie`)kYF^E8HD+W0}n7kEVT`y|6o9DxKFE$LYp7remTWPAPd=8rx*mQT|P^%3(Ec z3NccmTI^`Z>0Pma!m0;(6nDqH&3m10Xw;asD-R!Yok)S*|aMjFuzs~+z zy8Jqye74~G#`>+7#r9DAXN4Ybaku@sl4lP;e^50V9}l*~?m8}ZQSHwRJ}ZN5-1xwU zV#%aW1UkH~wugiJK`E1c&WRO#K%n4A_f3T2qmh8SJ9L4Zq}?L3fSY>4bu5yOlpPV` z&(UrY3hwUEa1uQCf(Rn*sdZojo{V$mJau~;m+Lt3O$5CNsTL^>oC zRJyynyQI6jQ%Px%l$2C?FYo`}&-*-M?0tWQHO9Ke{LOiu$I&CS6P_1uU6|sTpTfvv zTXRdPsQOYylipQ;5S}2tT~d^3byc#PYDajnE9s=pZ{SM~(@rpdRc1SM{ODkd1#!OCfp-4iHqSaik^VE}l+gCH z8$BqWyBG5*RdpMYmhD+5nJCri0LuI!j{@m+8Mg{c-OBkR?%t!`F}^jnu5l!>+}a63 zj?D|0EQFeWl(PuGc8vetm~TS#;u%<{Vi`cDIcdFRXOxn{Tqabmf7Q-uglPgqzFGU_ zxXRPb`blGr-_DDQS>rz^Y~(pEhdq?%`c~f)J=E1Bc%tDVta;;IHm-XTt@^L&(ML9J zhHo9+3`bM03Q3CnRn$Cqo=EoV%k`+gt^&gbYY632qa^3Aw=0_S4j=ZGI z-u;r=)fR=%gORsK>GR;2guLG&s!~$+qxG#*;k$T`gpvCbKQ8gxMrHpGcZSt#e>6`AJDYE|=oM~JouB@!p7j15XLPei zDsrDQ`RPy^`iq#X%LiKxiZZr_cst*D0NkIxLWWd;CaMA2^sEXwm_vYxueue$l^?lKaDO9&pK!C6skZreh_e6`0Ej$4QR+g&NzI0IBSk+jjXeWinVVM^)R(Z;oZ$B6&N&5M_FSLb6#lJPm~3s0F* z2Vl#`^0N?FC?yIR^yo9kS&m1rq-~g&5Sfp~h|@3i3AqA=@$)3GaVlUXeWhI;y3q1A z6s*zRgC8x|vCI`~BJ zSsLHD>U}BGTl1u*L_A)ibTGTYPTjI!EqsAYD(+?Mv^8kAW?A{()nUK1gy|uH>hk=G|!!wEcMiCXM`g{O$BFWL`c-_SsJ38uWJon(=$&9xW*L z6S zIcAbU5YHie8Nv{=$mlbm>4IPgo5x5~-TFr=>Gp3+s7jIV#Ar%=*-AjNz$l0}5dX=L zY)Y~}mTE&NGnnQe0xe26#{4vz(X^Lal&PD!{v87gG`8X85FQY zm~-rDfTqis7ue|4{$Ld6`-^C>q$hEPelLu^W7$W_1tGh~pI<%DgM{ui>anjC@U|U7bydc^>?k) z1OPYR)4~$2H${IcZaUa@LGo9xTu{c@`h$?Ts_k;giL2xL!Ki)fZ_G=FE+oA4s_tKm z>|H&Gc=~<4`!wuleP_J3P8x>(M=0#@xUr#OrW2r77Qx)A;nwS;a*+&~OCRctB8Hz2 zG4%R6kFcH0oR9KOK8qd~d?>3OdUF5QOD}!JJ0?2|T=mL9E0>eu5>M(zWgSf3j%yRu zU3`6x_WSV{-lz=MHnBdA#+A@H13`$#);IyV*TsWDGzB0NOwaX<8Q)-Iz%y@F!k4|> zSMiU&36g(As~lL@pp9(W#NZZh+zOSTxs{94P>tS6a*%1-O?Us{xsn~m>A9AG7I`~b z?t*)V+U5WqI_V_U>^bd4GxkETf@g_gjqw?cT}%?0cU{hk0=9CAc~$#W>ou+ySTO-j z{Rr2Z7}k{hQ~aM_j86KlPTeQ(uYJ+E{+taZeFQOQ<;f24LegGS&5N!9igI7C(e1?N z&dW!=ALo#>5zt;YBF*6WZ1JrkQ7&};{5|QtJWId=Uc*TC&(K%E5F*?qg-h)3jjHC0 zodA_0jP3E?k(LvL9t{=UHo-C)>VSTY_7~F3#C^FS&8R*Z zB3)-f94FZSi1RFnC*4FNSR4Nr3If?{h@9jVX}Cax6OrRe-(Sa}1u%r@_`@W}0Hu-8 zKf)ecj%r6?P;Z4GDu8Z_=4^iOaVA%^Z@3v9j^~hAqGQaU%{DD9`H-aQdGyE>2?h{$ zMIKc_=@cx`;oVBFdNvZOh#6QEjYlqW)DtRP8Q3?V%IaThJR6@`a57XY8;aW`)~yV& zVC0Ux+^tD&XD{Hj8-AuQ?vh0HFIK{Tj^}}d6s*j-CcVC6FkTIbn9c4mGCo4hrs(Y6 zAP9qMd9g&^a2%2_?=SQhu;Ex{Gegb&7z>3YxWxgxg3G!*0SA4@iq7Zw7kT8KEIW@b zVrP|62ow@pE|}HBl~Z!PFca1_OGPRYm0IfdXN!%>bQ#L#$~EdVzR*~d{e){Z8HZpJ zmnCHfbdso%kcp8otaTtEqKPXuoeuW~KfYCY?x zUNq28p(O`Y8btIer~Gfe`02I|pr>UYE!LqdH3W*f9|Fq8C@$xUo71-;;X#sds;<-T zgFNDkf6U|EPf~k=9^`K?3L-89LTPm;JG|fjIBooh#$`x!8?`%K=05q++w0~c0uX1J z666Wr?QeWF0uLH6$6pJ_uX)~c+!*?O8%HzoxuGu3@+E1|nxcSLPIrYcx#i@BPS-7% zzLiOM4GYC72La3JuBNzf{;#j;BZUu`iK6(I7Eq$44j4vam6ZUXLlH@$J6@y1cn6CJ zh+O5K3EbvGUa0HrBig(=D_( z+mKlIb$kYVNf9fYH*_Z3pW*-|H&o!@b#}Cph;?iz=bQb!6p%R1O>96o$WDzsu+Fmv zP7S=z=MVS{)|DL;hvi9MQsv5PHkXn>tn$vLq8n2=6*k0L(_J%aX+Bb0NDLXSn0%+?2I|+8xXr2Vv9ApI*4bf&qnr^rbc{o=~M@#6( zSBp+X-a7wH7yBP>?A+m!epQ5w&wyQ_n*ek`A<$e?Szi)fOL$kz)_?e-H>LlC>j>*S zoU#WZs4+gJ>!`v13D>0$sY3>mcr0epS$M}(;)Y%2wujG)2C}6?mf#_pB_lphGJ1~4 z-a@OZ`T}_YT?`stYsFUlQn@xwuaT%?xL$zRRy);v6jvtA%`Tw9p%thDNXr-6EN}0A zi}HOo_I25xse7MnYg!kE*h$Uacsf7w4&^)`rrF7OA{K2^yPd+%2HWifH(oC7Dr)(u z+;g$6G{J7mzd2;_^iU^OBAvz$)bCC0mYd!Z9UZ?ncHHQ*qmoxu6ONq!%mO&goH*|G z9jzq~9hnCAXWJv)g0v4SZI?cCc;$GjAMX49Ch^s1AcR8GDCjWlLEpEI8`*wOzR~6Q z^SotH!zME&%l?G?=rvRlgLP=#55I<=EV&w zlC#6%&M&t71>NdRu|>{rHYDf_5#SMwOUb!0Y;xenPJ+apCD8_wB{Ez(5`D=s&s^au zTBg<;i3lFI1+PqFt#?CT7p5?z*`FirDw`)NPNnb_kauTnI_>XfQv4LQ3Vds*SZsp4 z6Y^Rv^pE2AXL9DL)`{se{6j^42(Z%PARwHP{JT&sOmjP6mCO!&5MhNDW&&krSetj4Gx%9(&c`b!ZS+`8Crd|c^f@$j^;R9Q#`EOjhZG_G?(Ih%=-?|tfK3G;un9N911wVhAMIJEC>rd8G-9jtRTB1|e* zwxb@F+4o@eVpaBT#e$m?Bm~fF1}4l0hunxwYKDvQ(|ILXi`sYwk-f24GVo=;hki?$G#ktdT#DAEkb{MKB_#q0%CSsR6iy3{I&<@jZR<< z3sRHDSJ*1~8CP)I+T-!%)dgEL72}{MSDY4E6<14k&mWN7R|IAauD^NAdI>DOzdjaR zamKFw0m9kmqq@%9-I9m_G9Kc^N$SvHXb6!uZzhij}aiyzrq<-aC7nj zH>dh;3Dg+~3cmk331d@0&Yr`^-+BEHND4SeB&VNVssZ;*aRiziJ_>O;RE0BH5{Dwn zj~WidV9Zj4iH?j+fYZ!T+(}~3{fQ1FX1H{I%@QjAKp}vm6vV9vEF|X-< z;GmFcLk6&Iz|D!|FQ?g`j3p29KR+y}>OP>6dCBhoWHjZu=8w3nA70;|BC}3Kekkd~n!EBy?(Df2pzCePyHH z>~gr&9wxxi-R|Yn@mo|de7#i%^Uz{hkZr5$EuFG>8)?4ZWR_F#z!{0XR;YNA!}=Q?gB(fpq?q4Vvvw6G}Ee6hEJWPVXgot^w?4-YZhtEy%?catp>Lw1SYRNlTygxCp3CmHzyNaNeg z5X($kitR#KGDOzz**wH=_TqzofabWvAM&E?=mBVVQPu&p6n7$C_YHD!?#OUy8K&G6 zH^?i6#&Fgh_!1Q7M1l)di9pwzvPv-Wl|#O~VUui9;$|&r{m)WX^r*akHT1BiRb=a^ zDqRMv>vOM~GMk(PFx5!X=9m3w`BJxB+31_{{)fcj*L$DVlODFjHi_)NPKQ^3Wq*Em zf6{(~>-DJfpFyKClq+e!2a_OlC4?Bcx{KJb3@y z?;#1cyd%2BZO;81o!Bl0G#|w-h8TdlT~hSIt9p{hUCaebCeF5QLb34(WmaNT%ynFL zYiwxVhz-^Nk(l-{P+T+>bndG*_SfX(UZBAGF9mk@TDd@XUc%6CHS*^gmDEc+w>{E{<>dl@S6G<$iZ%j^`-`sECebi zB=HP4{+#TJQo_L2b5#GzC#n6H1^15Nm?;fk%BXoEUlztV;5R~h;0j>hrDPi#kfN}_ z$UnS3ZvCbzwXd!4ca633TQ`l=_54Di3LTUQ&kz4+&-6b`nbE*|V*;kk!RQUYAUtfv zc%fX=eoQhR!n*#LJl`l<3_uz=g;EA!Q5O1~^IJI2_Ck6Imo@u?O@}y@A zTz_*QgVj0o8%xspZhudbLqq2xaHW?e0!@_Tj&qLkDW_q3(%l^jy9ay&D-f^qWgD60 zx7KKSWmKvr-tN&90vAiMDW})N+6v%GCG^v>zZ|6{5L-{6o3qPjlIEuLhAqY+mWgyY zUziAKDhIS~zoovlf%#$4;&$CQ`HmzJJ-Gf66G1%qQe`zi(cbE`y^$g+_>t!K+oR4! zmup<3=3l#)IYC|CuxXHNy2BwJ_r(e|@9|?i1twbMZ;+k<(gV$|KuQ3zb%gOOKqc|z zgy^^)`TCm#3Og<21YuypP5E)9JYbB?`r$aeW5}1m) z5lj>%2(e1`uO||;2#LEB^*AjEO^2Ta5KC$T6KxpEp1(yRveP1i2AU6xrHXl~B1-C; z%94UK!-0^6bm}kGjG4j}))SffSJu(#+!4aj8SX8~Oo_oA%?Vi!h$AuCR!XUH%-Oz5 z(FFOiORFUi#9UTr3)nLi=i)wSf)HnJ3u{^B0a6)r-UL`Nm4S%+7u~R9j3t5PipDie;vY@h&W*>-`=xputvkF} z4sC~#dO8%p&Xw`mLEjTFY}o)JtTPi-ICS|}PBHPTjK}(jt`AQn5CO3s4~<^`um@YT zT(*x;!#2F%`d8Z70F`?>_Yf?Ks(P47uiUwd-MxHh6l?Gq?>O^XIZwC91yxP&(=_%O z)MpN-gR{@+0ck{0)8OrU5A%pYxW3Ey_`DGp>m4eG)%Bp-Rzlk6or5jpz6)G2l`?(nB=FJGDK*FnEoRsGdy*yZqDme*FteOnTg zko+=^PMzUqtBMHo*9Dh45rS=x`oet2wKx5Ti?X%f=UO2kzKQaHwT`f8)rEY{>2s-P z{D*3x6CKIX_pl6#grWZQp1|J+XKWamP9YirQ;i8iyn&)v+(pD2?f1tf2lCdm>xOP4 z=qcO>wB5-3VW^VuSAaAkixkAzlfxSvY)ULUBfW~q6D$q)A&64IXW)#1s(R%b=L^aD zYVx>h$w-mZzm|c&iwRNnhmn`uh|?N6Md-Qa5pFEV2rI=zp4M(s*McNx2SK7 zOaUsj5fjCpgMp&%r}T<2K;%Ure`uC4GngyW?j?d^>x-l%p|PA?Z^R zRqKI^^nB&-JZJkV-YpvGr|dT@H&nfe z5=r%#7cpd-emD&FT$R71#zZM$+Ei{#5Z5K*v4=4wO|8%Hae(fS)gr`cg@~ zcg3OaSBBU2ZgGMbFs(sC!<>{nZ&vr4zE>VZ^}g6WER#8*^`!y;MtF~<_+j0AF z4@`$%tc&hO(h!p1n2+gDk62%10qsvdXNn4h0oWkxDfz`;TSamL;OE(xa~B97v8%sO z!{+W8iun(So~5D2G>mJ2tT!AM>tPltQaYC#2D!bVm*dB@hQ)~1ESQDk7?>0!;2`D{ zBvJsJtc9{aIU}oiuKHAhHg6q6lHnVK!er%mYevb}hA}&-b}h|h=}w8BjH&MSDc{pf zM{d6-_|)t(-mX}N^Va?Z$ z>fXPs!SMzOrzHV^pV#uns;u9Ny^n9s@=vpG-fa=BY`{S=t!i)HPIHh%y|j^#WiS2_sQ2M?$np_FSpLV@OwPhnCefv)cxiz zZ3LmY;qrfQwq1Qk)YrI{hQN748bE1CzWJVO%wr4t39jegIB0W6k|?Lg_9bh_DQj__ z{lI}`{D+zTe;A7JZW__UirI;nq@OJzBX)oEMij^yDaI$4 znD!Hp@mMY7}8{m6(pZOJf!BrlTPa7@V8Y%uDzOeFuX26QBzRj0up zov-j&>SN)}v65P=$t>1I^tU>imW=rVNe6Z7@l12s>?J*Qp)Xk`Dhy^t>ifPDRy8_Q zOr(k?L2Fyx6@3@5q$-Sj?7sEvFeLq8Z}mvo-?^W6Snu|?pb!`1t~T}cx))Hr_i!|6 z2|nXoZB22}8_GI-r7ETie)7*I?kV4PszR0-6%H2L-={gOS-lmY6cj@+NO9g4;MD2QF$*;sZ=3#I4oAQjr|Bxj| z3lUi7KUOF#fJccVVeH7OQ|MS|Y4N7)#PQ+?Pl0c?J+0(7k4r34UStaIB*DFni!vaJ zpj^r;!qA`fF_wQUyBEQnKsjZEh>*n2eBBwIMDmf9^oL25CD)n+@&`{IamqKJ3}|PTk0o zP+o{{yuLFbbKXi30y|dMIH37KYsVlQUYLsXph^X0DPuPq@2T!GK2 zAYplIwGXboXM5OcTaD8o3>%Ng8Q*q_O~>pHmmPOtBC4^wish7!38YK zx7@aK2*y_11zZL88~!F}BJQ-W%u($83CH9w37}b?x}3YW_dbobs``C4{C>^rX8O62 z_tAV&*6*uhu7^JtXUb0>mY#IeoSn`;x%R>PuoY*tMWyA7n)t~TG1wULTRj}}RWuxV zXdR&gFn;d(otzxkk?EMaF-rS=N#Vh$f(zYTUeP|d{>B)66G{(%7 zufP}-x6lY(kS5kKkf}Te(_umCf$D{?H<(Ns2iwPoHbR|01(MY7^))AOBdDjt5G#WF zIh?EcpNAWh-Al+m81sZ#9_6ldGz|zO?nYSp2ZqDteQ|+b=Oys#AWIHO{0blp&W9+b zcPYpv21b1Z%>6Po1?fA6m{7O^J#{m=0w|Zpvv1Q8H4mwXt2@UWAuzKEE6F6*#1z%( zv1+l5D95VD6>cj^Ap94;@qZE3pdd19CYP8<`~M@Vaio(DN@0GpQalYq2qy!EnhO3QIqq1i|LeQ``>Sx;-x$JNz*UgU|!{+L4N+kHkM;IO;0 zIEz1(EgeSlGTW7KJDk4>bsk`)56)uC4Bb!#iv$W8Nca`j4GPQInzPzim(NA_6 zR(+!P_++&~?>C`sS29n=psSE#BKB3F#VFk3bz;tRpw(mqwRGmQ=6#DXdO?@M8*4_)Z$DnDnDMyW+5+<;T!K zhG^gB0439dmTF70%ie5>UR|WYd-oIcZc$P356zx?)3aJk!B5`LUoU#0(RdFp&QpEZ zXQ*A1_}zS+`Kg~kVby$h<5TvB!?XF-k9e@{;UL;n`psba2GiV-Hj``^szpIAFXtI&sdb*mU*vN9D-rdaKtliG!f?Xv;-Xjzg3tMlP;<51xHikfYa!^37IADg4P@HxFI+MC_96VzYlSlvJkmfzo{ zOJ?@Dn;59Uu&_I`|Ej^tsz4+ViyMMO1dz*kf=2)$!p95TqDJ9o3J}t^vtDA4G3O!r z6TS0(a=f-`9`;sj=RTe-y)#tCc`!W)3y$&fD$slLZ~(=kny{KQPL*Va<~PL=U3dk5 zmx`#0+MN1xmFO>8MdgoqmEC{yFPKKzJ^pG{^zCx#MdK6vMMoQs#(89)2ZP9ONE;dF zO#Y)JDAA}BIjnG)5C*t;@s{I=t;%;h6x#?C==GW?T?Y}6V|Lt@x#V@+O-Mg|@)O@6s{Ja)6^KDP!k>#ve$O+yy*uKg zy3D=qI53F%@Uxco&$(d7`A;ry1lzTXRV^fBT|A#Fy?&&h-@7g(9lZ(R>zC|8Pme7e z{cyI|kRQ+_BEV+=7u*lqLMVblHIGoJ&qUH5AVj3hQ6(UzNT-3xpSGLv1L4VZICja> z)P(s#;xY>O0SYqo>W~mc&0HLZg+6Mjvmgz)DS@853>j+-ww|piL)(HhH|mS?^jQN>H^cQ_bw9orv zJhrn=-+oy_dp*Z3-^9WGb$$b#IsSj2J^`MfbREp=o zzQO-r_6=z=LFY?m`h38!MM>@R;Vn=KCeZ8fS5#vhPZe+hZ=Z$*b2bMpc0}`8v5KCO z6R+$(ap_c&=3`xz)R)kr+H`JH?N*Y!ks5f>P=Za4y+ISg6!?H@;OK7jz?dkonMX2g ze{$CC3^PX;n0`mc^xWZbrnGQuA_E(nB>Hb#gwpT~@4v!g(#Fw;}|0gEu2_e(p_2Nn#2^V`M3;VX@dOiv)3!xEKYL>Z-y^pf=7Eo-E-XATTh;sX_XZ49F5&aoVCSwi@W$|l zZ$isKVCaO@VSz*B-S;w$$os>>6I>D1fBCy9L_-7p(3Dxg9c!b^7X{}Za9@AeBLYT! z?U9Y%Fd`Q4cXQ5`!=@4y=_8v_8%`p7UU)gg3m;3vw{XtKm|>hqO7}(ePAPx=LS7-J zN4w>cNi8Qmm_j8{lSP9}Raq)R*O~Q8saCZmb@R*8>C(uaNCvDgM=w5W%_BL=CE5G6 z;^^*w(c_LX>NG(LIuogMG`~_ah<}qpgR&X@5Ai^ed<* z?`m7(y(Nj5#~bi%MlQ%Glv>w6JfW&*UvS4|GZFaoFouKTT$X+)#%Sd@+w&rm2rD-w zvM}xKA+*NoY39n1^XNpD-h(Ym#@*YaB}vEUf4m($(57T@^9_G{z57Yh`o3{U%*!hY zGVN|CcwJFM^>O`HF!T9Eij~nj(j596f6@w*oPgGiY&u+L$+@ARh$gz+U?TO`(*b0< z4Rk@&gb>qU`j!_kkw>}78-W}x=%(P-s=XB;_$GNvg6mvpD~jbu{bn>$`^^lRniR`O zyoOuyc)}uaUmmf((wTWYt(s1OzP6>}6e!}87bNFuhZH38xb0gg8V9lzrfKyE=cc20 z0@s5zBsCDvpX3d*a4>9Sn=YJJNi8oNBm}bqUmZy2hT>xE(?vXlbJGnBE{5(|OPr5V-twlxcudNZ}Hj-us_Uwpyz(UFREREO^sX4}NY00M)g2>==W z1Rzm0+#t4Sa@oY#q4fhRVO6sC=Z6k>2w2ZPccZhV%XHv8#XftEgy$90jizVAGjRWg z%BhQpRKL0hE_!q_OrrAf9xm@8Jb0em6CCDH)a0UIVw%W<3E-Pn% z5&aEgMu4q?Z#D)2r+!X@2mt=Lj>q_Bb@71A*(o|#fMu=@$Q`=+s0FcHYokZMxw~XH zu66(^P8L22jSfmG)^JOjQ5cqpyhV#vG16r+I)~?^&{*so%E0Jab8(O>vAlz-@BdW z@*kq7pWVg1_PBPyiOb47%Nu89{!`2eqyW}&;{i@wusx>pp}Rw^kKVXT4r{-!Q$Y2K z^*`0Cq)YK%XNQ^BoJbu$E8xVXoOO5ez2mU|1RE(oYwbv|w*;R* zptfb9@C-?W{i;G{mf4UE?Uo{`{6WU;zd>dx6!_Qmpa=R_L|wfQTW&NK%^cZK-MyYs zpd;mPqr-jM6hLz~_3;GD6z!ElA1O^t;A2e~QQAT;tx`-VN1Z8lb#Wh;?R1C<5v3e! z_ka?9H5p2dKh=(Qun39NBagm3{XV(C#|>u@PU-XvM;?P>rKVAD+7u|iDfCH9#6$;* zZR_6b$qOLGLVc<7sp&(8GG4~UaJa&$1+9mYApbkjUT6vsLxcda8NJJ2n&>G^&Q&G` zCjE*`CuE_C0Bm!xr9(lxgAO+kk51{=i)mPQIE8TN4Z3>1iVvJRSxk|8M=6nm%Q9X# zZg)IQ*gei=y{yEEiWH4FV84&DmEHJb~q=_Z>#sJ^Vx{RaolT7CnF4q_Ej`krB>M7`2B^a*kK zj_t0n=9B&I=W2%!R+j!RkMp#@u0$(B@0Op33qEK`R86gCCjz}uOwS!feqJm@6tAsj zt~+f9u?((w?I^m_AQ8fop>DhU3)zkaGGuf(#52(o0i+^72LdTq&DU@j{gZJB;IYN) zzU{&{>qdm&?jA_q&}R}P;LW@l%s}Xr3&Ac$Hwk;Bi=G$A_wMytgz$lfX%y}sW|L^{ zLTPxAoNADHq$qDQOozh_aVMIWL}x1o#>g^}VwIc6D3V#XxcdUmvrYVhWX>89-DA_b zH}ky!=!1UDP1#Mg?+BTbbZ(F-%J4iGF2eaF$6738Q=`M29!$tz^vrE_5v+9ND2lTa zNDeRxQ5kfnbKeSJA{FOGK7?A9B+-C$Q>gREUQyJ*!S_d9NbmbT%OjYSS7YyIm)DrQ zd^AxzxeD*En?+?~uO0*rk(x1q_e6EmOEPx#UkUYW8;1XW7p*IaR@Q4Jr*Yu#bGBBh ztOss!){9*(b4eOPs7~9*NsJv4d*SKa(lz|-Skiy~h(>oI6X|~eZFSr^dP2;)l zTV@xxlgzd{uOi4U^5}~J*sN;Zq8}Dvh_zkXwb8CAy@s^Hm4b$)dnBq zn^Z%ZV(J>doE0>b!CGkSn)x4|dnpL_p|u&R0@xpMO33CnuWf9IJY zvRuFKzPhYkZ6>weetGW2+GTX>T-|vo>EOMBZhS??+nEMEWuybdW?`_+VcqhhB@RRn z@ChPJj0XPp9L$&6l4<%=j1()zXu=3R_>oioOhAz6z91FTrUvK1?#6zw*6t;U#Sda$ zp~Gsok~}lv4wNp>;SCR#7K6VCA>T7m_&^p5m8%XGl*z@dPWHJYfcTgzm{F8<0s0p_ z_)V}G75S#Wh=>W6N1xfF_HKEHg^j3>{96)J#d5rL(-Fu%c~oB{r07)PG&xBMyFPq+MAA5)LZN;xvJaP7)Fvg%yz8juwUZY9#gn6FV@+usa6QlIjnWk&s0X7H!yF$ zk7$&`^=desog)3qau&H5#(o?8Kw3p9h5*}}UeAIExDmDzrOz0*C*)YI`~ zB`jGp69 z910So*r|JTp>(ARFeSq|?L056{_MQSxJ3{8NQ~nldQmIpWHIFR)5~u!eFwD9MA^v9c;< zB~l!ezzan1Sw6=;IB%2I&5TU5G-V=~z+H-~b~2P16E9Rng|pBr}pvKjKb z#kOL6^UhYP(A)-7!N-+SLCVsfl2bnFZ|bQsA4qYQ0HvvEGgY#(IV!uXlI_Uy(7y3B zRJ00En$k`hs6ZNB67Wk1+JEA@a&Ll~ zf<=v$4wrpO=N)EmW#=7Z94+S^MrL3ioDePBtYs~MP`eVz5Jm9yoSm;+OiJMyxDv^K z2XF3E&ZBPVw~V*DlCUmoZcEtLJd)@jdCO zM7JLX5r6nD=W5zJ(mXq=n~Lq>Kn^CFvc;373CE{c`Ru9L{_|B4LjtDN33khZ()(YJ zbKOszx_qL@#Cvipwgxc-^g5{Ajuz`38b{hi<4@MQ2MM@T@jcId#?nL|vQ*NtFZTt? z^g1&QM4h%)6N211eY`H0=iH6lr$2~#ZJ+a4#V|ucH-~-DbmM1LB=$kX8lvO2C;`<( zM?xYq6*BfgXH)3I%@< z`aRyBUeMK!A80+HI2>rRrwSNtZ|cjg>e$Up<7_=9ggCU-&*+_~-0ZeGVE<-~t!zPP z75xm_S79eT*w?@yA*O)M)qkPu#WjHAKvn(sn~A4~lq-B}l#57abc|1rcyL_sBij_A z*!9tc3iqHG{`g}ef0qf7`|?Xd2{aDAX#v^_J_O|lTaBq9F%_3Nq2~r~CslgO-%cY_ zQwPl(@!4qz+tzw(P&)R4#4^X+HzYcbt#6~N@7EsY8kPn6Ij-m2)-nX?ysq1?)*P_J z0nvv(vuQ0H?T65Yn|!7RSA63)kCiB^4>!AlF{Um1kQ5Mp`3Gb6vd>T!y>9ly*m0v? z{LqgO^Yzw~fJU{u{d|ysVfhcnY@P<`M>A0$z?fO#|2i$A?0k2w(8bw$F)3Xo3NU6y zLRZCju43oI?`cJErfB*8{Ma#idMzROmtR^2_@xXWV$Baw&*Wr|s7N4UecUC1+Op|W znVk0LN)Z3yH`k|ls4*g5aTkif6fS=F`Wzz}ow zzeVz0K|XEaEb^EwkNmcH;OQ%#XeYQib${?+^j=KN2XlJp8riV0DsQ+TogeTZ$4CHX zMZbat&s>+%tK2E=)!+g_bUr0@!tMBCO$#=I5Xrw7vwC(0&X>(21|2o8YSJzA-zcJ* zWX2}9YWDKHjCZztUzF&YM5 z&f4?Xl~K}ywN7MYtPhG!+y;FikHXAX{u(6wwkQV5Jug-#-q54ra$NJ8R_B@yG8X5# z*$q5*{$ALf7PxHz$|>;x02#M6*vfJeSm5chSc|sQ(XMsU$CU!**}9uN@iY?k8(We57~=nx4zw-xf{Mq`yBqc{apELqbceovkvvA5Dady&0W^ zjvv}J=1(*-KaNZG13wmA?c>*dam2~!0v?SdkYf&Jm{-vV5 z)NR&E)Ftd=P%%s-vBWfs)!9wZvAW z|GSgXJ0RT?Kr|^SpfFF}PkKx!(^r%gNdHENPDP1DG0C*F1T`IXpQTtP{6UFTvhdvt zYfw(n)h$BqrZ_AvNPTx$(A?0nU6wsUF@rkBs~ioRk{ay=?}K$5@q(#dSHm*y<}q}| ze!09BS(c5XUQAnAyHJ*+3*9raF!3WFT@xcYxF(&|hE_bqq;UPK?!Q#>(1LRrd+9Pa5 zN4#UalkCpp9C6_;6Qn29zQrBI1UH0>vlwi!bxqe@@%_9bYcIn0+vC|LRVe(YS1K@uYFh zZP|QeGn|j6Yby$wzIhu`0jQgF1z@?m>iQ#sE!&UtnngFhvLCZJZ{jgaL?f=}b{w+C z?M|6_hbJp&?6=V^1zo|OdTx-8aV3n(Ou30>-~Ni?R$kEowQHUF3M=>erR?4 zDlzs(-d}q_VCF-_{p_?WYV-%686V{j*QcNK*^pUzNd#@~4`lg95J8Ww-v$;wbUuNY zFPXzhFzMk@!6w+GlD)EZAW%)U0Z|DiCMGlwV0Wd%KDM|CrdYxc;+UdC^YkF5#f1b< zIc{KKNcF+K;)f`Puj4W?kuYIGLe;5qu_JN2CbAC!NJsvhm1?oY=QG$g~S9u;u}zSe-1 z%y1|At!6$xw+_YAKW8x+a5DI-<`Mm-nS{DlMLGb0WLlWP=mfMMf^KEQ(%6J(4+i#T zDJ=-22B6&iQb;?s#xF@xZA2pJFTnL@NlZ#V&iX`Kg8-mnklKC}62 z-tDMxxNLfQit|oSBArQWx@V20d?M5(a%ET}=mj;3H!gf2Ub|aFEr(=VDnVJ293UZ= zN5-~a)Z&FF&y^^}jeUbgGp z_B_T+-kRyQJSiL>bvx1XrRB9E>DP%LM$eWsBa7(H51TFGE14iBim;jgX6jBak=C#~ zp7As&QliCGZVvFyK19d?_C3V@WAU^M%zw>~}ZDEOh6BrU4|m#ks!nPJn(( z5UOAjLQ)9bj+Q3L?~al0nD2_kiGE2U*GE1d5rVF1U63GSX$_C1U>?qoW0bX~O3*S) zVTjR#?eD}ITfz%%%@cKYQe+AHERu|P7R?Rp69o$coJ|$2Fs&I=z9)G}?K7o+LJgIW zw3Y!o_;~eq{RK&=Wb1tC&Z#eivVAd2@)LAJ_aCL6&y^IB1+cP8#;QK(9+VUpzMCnX z^g1{wj!8T~u4q_oDXq+r0^sLXcLbQ-DjE>~Ui-&Iuqt4) z>Xht&1}Q4vxXRjU+q4y{XJ5Yun77YYrPl46DEq)!j%c)$6$H3-0B3 zFWw-K%jawAJJlX%N?2V5aR{iJARX9LuDXHG*w;m>M@nexJ`2RK^8 z3C4KLWX=Wo^PY{2lYa--E?#M>x^dR6mGf!nHMD+?S;MUU3l7?0_g6hD{>NWPj3VBC zEph(#SkCBLt$x8g$*y7EsLK28a%$@T$JbkURsF5&+jMs~i|+33?odDw=@Mxv>F$=! zMYn`>cT1^+(yh|1$UFJ&arSSVvCq5zhqdNs&gZ%B>-q)zO>a^{@H^k~V_q^#5Hgi8 zUKqX;9(q)hb`nJ#pJ^>m61iT|MjEk`w_-G#ruKFMGC4R9bvWC0l_~OXw{oSZ?slN? zpoJGzyw-MCKY7xgNz--eLh$Mj@fcm=*m;yV(1a)e1sTmE{`}X}U4uS9x4GN#^0A4;f4y%dz?S;v$Y}}X&;GGR(x_ie^ zT9iaSyQRT-HYQ6ua2lneza^cyG<19RAyOA;LSA|+klMILi+F6w7lIQIYc57{$O3OJ zYLF}C1LXafCDq4%r8nQU5(CvYNWcjg!VhpIj^qSq6{D(`bBRG+;Sf|2Bstnf)R><% zbXT`y%BpUDX*E02oY5+c94U}^4=ZX35f#}Nc*$=jbN7(&LSB4Hfp6P^VH*_+GQH-d z^9Hz*P=?8nrStUmZ>48`cWQAc?wKvDj4}zNAtpz>DX3O^FhO_f7B(}Pqs?W!vE>?0 zXbU;zIX1$n(Hf?_3%Rqo|BrX}pIIm2*(@+*f|oaL{q>-YN$k0g)W<6FnI8WK9y$-<$G+kgrW3@@%Z3wQ2!9+(l4A@50Q|G1?U&L>Dg?<2cpfDQs`mg2u1ywA z_g?(P9bLM-gAZMX+WcqwOdYJSp=@P(`GFi~w;`ZQVr(7;j(PbpFxWpVk>&!9d0EF6 z6`WjGCwbdE1dw$CdU>Bc=@2Yc?II^y)_tg_Xq9bA0G|FKdRSu?OK#5mGE08JIVo%D z`-t4A(Hie1^XghYC;8VP>6~1x_)nJ(6>*iVVR)XEJt~cV^`|PIyx5>>p8jgI-;CsB za`S?l)vu37)@rED^SYq9znnr|+x{8)qo(7#(`Btu(xS05=j|5TI_)1$+4}CJo$7ku zhkG`nK3Mc8L)Z$N3n%&oIvpB8vG(LJF`b$=xc`~Nj=;MDZ9D`S(m2YHV{$g8`ESk` z!vA)Mq5@+>k{JM%qR$&DZv(PUJ*{GmTr#Z;3<=NkrM8B`(L_XCM*6W2n}g_hOwViF zdFWsgC}k!vSafLyQ<*^*RAhEn?MYfgu-vyNo6GX*mtz*L4Puc@G?~C1_u+g#XPzvB zcI|5cO0#}ZasptqO^3z*Er zNk}oGlz5$B_el|?nczgaQt)N47&uk5)0Fcu8@G^=4ChutHFop7FYtvs zG2jb#owMRI_Q9c7*O)Fku+=FYpy}54gb>txfZ&2f`50q$jnY)e#gC@J35ObNU~J%M zT17I(;XR;*@9+5Gv{BdDIYeIHhOlH-kBQh`RNte2sW#km|Ig&7r!%|E62Kr zt06w_*!$|n`TGb$1K9Nlh>)&R5#aa28Ka{fI}bkS7`uoi7;5Js(AScY>4le?Jsl!1 zkUO8?I}yK}cXxWYLas8VdP_E)7RGCT%911i?*%AhNj1 zV8~jBQd~k%+Jy%2vT^*d<2KNYmIg2eW<#m@3sD~N?FR9&=)=VvH(~tRWFRvx-U94J zxQHP`gsjQYJU`836qN^%LJ|?p5G)x+gcaXp>X0MqM38;H1@2HCMg_2mLWPEleo2ni z{bNC5Bt60lkYlg)BgofL@I+=@!J^5MpgXfm;=CczR-R4ha!kC#J`ZaG2&(f@B8-mCLyjF-3T_^#>)Tdg6=5tk+&<^o$F@z;MfQxMyrQd>E&pj9XHvLb|9QS6rZC)0e?a~-tDr8x_d(&6EYu~;^D*ihFO)aYCh?? zM+xM=;C+N=qhvy70MT(Mi6$bFWJx*gwhB5Ni-2jrC=9h!dNL`B+sSVZMC3vgbI10e zlLn+hWaqa!Pdoo7i#;CgWI7ke$Twy8A+Yn;5Z$gkx799!x1K5SS+tqYW6o*xd*RBg zRP_wefuy=9+o(yEuHqSa?Hm3i#;uW$@)?{mB;IGwmpX-N3>$6dvP~wxaG10+9<5Mj z8gQ+n1;8e8kPCB|w>qQJYS!F3ZI32BXkwX6pTC%j++}Uq5#c%*D`vy)aWv%H`dmwS z5wGsTyW6xEg6t*z4OZEHEIHI;=$npC(iD`hNjmRdW4$CCn=3%Py?J-K0RJ&fvb!Vv zM?>&yE~nhWn-hc_F=Vl%uDc7t2IMbJ3H~=b8$3*={`23xhJ#UPQBs^m<~AXeL-Hg= zYMfyIq_M*zhXYIDmbnp$uK8sn6i?F|jM7)qHX|tUPR&DTQUsu(40v)hF(fIY7Li=6 zOF2>W5-8@;LN79lJ;Z#Mwh4I>1h$j#h_ax{Y*>r5uoh325D4XFX$A(BN18ru8p{BK z9n^<`$gyR4FWtrSZWq^_jK56XCO>PB;dRF$W3KVUopqk#w|1TUcjwE{f!zdTK8jBai_py|8&x_iGcl6&a3I2>>qqx zlJL4!RgL$oHI2SHpvLjM^haIyUo`gWS}btVjxtvNZ0x>Q#rZ%kEyj+$K&6)OQHf(! zy#?YAt?Lky0VnNFi2P8Oe3)f@cl=Hcm(2ZMCugT%H>jGz&l#U|Z(gpV^gjIktC2%4HbM^5;n}IX3&*C`zPw(tt$sH(nVA;KordTQuQokKCzg zn&APFBu?q=E%#5Hz2ZqzeE3!u(_fB%Ue59$a9qwR+`#b7^K->FEr?@t2rNE(#o_)% z(0TfbMmtdB?VJUZ#O!=o=JeYY897WmJa0N!JOaQl`#!oJm@3x4flm=Wu~~sp)VAfd z-|e-o4MWxTF^o6>AD9#+<+r`1)>?P`Q8e2&qh9xj$bifs&Q7u#=lwuD0FtEt+5&cM1~@@^N~L-PK8b#KqfuU==rKU?JR4^v9rmv;=vC{z79 z4q&`qw-sC+6pFxrlA;ezTDY-7m>970UmJplAedj{RrKZX&j#b2`7R&cN3hn-h)Vc+Tku6n~44>gR}@dVRG_jxH`Ae^sIB? zq>fwoGRhH84>=;b3ixMLmGC%?%NyNQ&_&f;> zaqZHUWL}`xF#upDj=_{CnM#&FlQGOL=^*gYiUKPo@lN7aw1oDfilT0b$pqWIk0SS!9 zxY{dLn#=+EJ^Hw4b!*-Qt{FcY?oyFyIao#O{j|iq38m zUgqIm?aRZHWd;3DmE=GB`A>+nP{cuIeM9c7K`RtGRbU?3kc~i~maQ3UupEjtCzHHX zZls4vqNU6>F~YSTNoHpv%M#%$8)X-6$}BNjU>waARXgY3y0D$e6OVn45R+D>8>5bD znk7mY^$bGUY4=OE=JnSQjDd)FW~k$Glzz48bjRl(1|b%swEXXg%vab98r;53eCAkc zvpR%o`hGrXJ&`WD{%A&{8Ke*!kz zKt@zyh%6E?D5;>G%a{RFNySDO5>eVvgo?f)$Z`4twGwT@n0fSLauigTq4@wBTLx0p zfjnS`ufny*yd9?nx+5wgJ#ED-{P$6oNgP;4CGkqMl~#$0&poEo^y-A?Pz^0e0Z0D@ zDbU!{4($q<2B7Yxo1{nMWHJ@1lx8D0uvjp7Jcnaad%NOOuHth%ZkuPC0uX6d1ga5Q zNc7pvN-uz4Ogl#dLYl0yC~^h#O$p7jS!9z_`dCV1OphwcLi3O8ORFS5 zzR^ zSw-5eZAJV}d(468KcRzk0IlX|4faFll-W*EOKK+s2uPKmEkB&vw$ssHcVE{{)^_%v zveorg!sR-t_&jeM9mICOti&hKqnM*3v7BAaXIv7U|bCg7WWo7ySQzcOj!t2y3Uwgeu}OIs#c}LZq;ra+)__ z@ZbZ7&Whc5vQlE!|MWSbpwGGV)aT>}eNMZlK4-#z>2tkPrbFPIX64i!L8x zAt z*7*(|``A<1HF)GLHsG1HgY-DEyprV0J2&c${+mZ}+5A6RA=&fgN*y)+?_f@0lS(9a zQy$dN&iApo@@;)Cn2XBu8Gp97s{5TYd|mawJuHU_l#IJs_kqV$hG-yBk*ot}_Q6Kz z9~DEYa5y8w!gnZcZ5#g7vdpwW$fy--(I;;zAkI{xD3b}|=gcFCQYmyLNy#c^B?y`v z&-zmcxwlJFiR4Kc%p~AQcanApe5_K0d6sulr<6rXji0@UwoVVBjJDEJ*PiA5&Y6Qq=(l8YAECf789NHd)tmdQN}L^fx<}tOIU;m80{GJOz);qP_`_in3L% zYZU_FM#E@mnE2Qzm74gOG|?;dBp_F2#~DYA66YOfY?X1HAZY@=2>MA3_h}*H+@=vR zY?!7`{5cfO6Yvdj@^ebD7$6ltDJ6_6^GWxUxG5vUx5Or$5+bhCEpW`q?Ok|9QN6@TH54X+M6L z|MiOddiTwg5SQeoOPbaL{lTl=p6iM}Ekzu#Y`;|=2!?Yj#6gjVsI-9Fz{+N@r*Jp| zgB|E|&cc&SnISz8OT!8#1|g{z!lBMfBg?vk5HuI^0Hqq1r%Mn5&jzeQTOXb*cL=lo zCYn*3%r7)g++KpGORp;lj#}*ud_|IiZUt; zO-gt>v`YDDV|eKo51#+!w)BiLj!YRe-if`0;?QnXOc2jAF>Z$%KT1)?qA`hdX@^2= zd{|49F3lg@G2rc0WgX6wa)-!OB$x0>-GU$!U|^b;5@f;H$5N=w$ecT%mVb+vIiQck z6aRD@;Pcc3^D!vPbUw*Nri9KO@4I>RR69M$w_F>Z>MZrXC@x}po>1{!)NYS!E2P_8 z8QSZ1g-_%wGJ+>@`{L8upX@{#3hsAoY5$;VpP_o>BNFb(TvX16uYD+Le#b1~Y^#+I zX@+7bXh@^-YKOQj7T%Op$jUjS{QHjZpLVi;FsfL1qJ4cyG&zyj*l2#z$+SVS#0(DK z?6kr2iUgvVW;jQy2t%Rgbcw=Sq8!gaohx72Xd{yjQD_V{ax0rIfO8dG9B+bZy;n-1 zVqq?_*K^k{a?74jNqtsL+-QS2{GLt5)T|$lu)>2yrd+EyyZFUb6=SV&XT&{O`d33( z>n!NA&h)BPfbN;0H2iwJ)Ma~9W&NA@7_r}Da7{rRrxu|n?z?D&dfV}Lw!-=}0kPRs z`vni(g}ZlkZ(rMgFuxHuD)M|2qVBejHBEkb5K^vFZS(8i#Bo{Cezh*hSSWR^D-a*! zSmny0bvT~7Al_BvA{daRA8#~_Aa8#Ry`;_pyL7F#JA%eqi@Ab^RM&pAQY8-pO-VIP2?ABMLu8!}6pOmX zGaq;TpubwaF>cnjdI``u@qGd@rYBbPbjNZ@tkcIY7L&ia3jENI4YyNXAM+jK^*ePQ z50E3bEYEk=cB_Pm9ryg{`0d;ahY!g4*R1TEgAbAv++BEDCeFjRoL$Z%Kd+5(1enWn zdGXkrfaZ&9op5l9hX8;nyeezlK}nt>Xo`P5?!r*CdWsKE@==^Rw%RYg&l>A~#HePeE?-|VrM+z7v@3q82kNGnY0I|dwUaC6oj}3p_Nf+c)${QY z;Re-b0n>9`@PV>TUW7hhm^4mk?Upo2&NLM-P0tjEIWu&te=mo)d1zmapyYNdL5!+> zhxM70h)mY&nRev-P)=Z}%?Y^Qsd|-v_u~UTg6{!Be7@YT#PxjNGdzCR0`t-9o& z%TsrgF6Qv`U40cR>b}b0+9@v9V{u&1bw||wSE|$6c?<}d|2uXUf^|wNZO~6FUI~HpV8Z?Vy zj?yYEi{~JZ&Ma@f&YjthSvL?$tzUqmWH`W)%N_p0kOuwbtt@uP)B34M{>&v)uCoCU zz{57N6-b82%d{g&)S=kcC;(oj6D}PcM)a{QlGC#R(t}dWWrKqG@URtUOOGP-rA^VG zZ7$w&nU=V_4VgP8InG9Yn`?1Q(WwhJ!6=Q6@`o}GPl9WNk31dq@~x7=kWP|Evn9#d zn54w9D+C;})T4MInx1a>g$N7`K)oZI*@$Dsj)L~QT~)pf4|ffa^J4)y-)%mX2Bnl) zMI~Af>K0LD#eimts%GR{oZf;eu~lz7rI=ILxz=cm4@1L&L9QVoN?X?xR7LdCPm1qe?`WiQ{AaLBZ|0uz}Uj$^croE zXI{2hZ;z((Jvt}g`(9=*R=@h%llRVLKCHi3t7~U0G%XqvsZ|wy3D#h7YDI^iAP^K935*g*=C8)Ie2y-#D ziRUr{yIBa!x3t_eqdi1B=%J3UUh}d|648)-u&!wY%U-5k77)|gn|@$?>(s+ioa?@& zU!Lc^=QEq1dwIwtsXfH1g)FeJ2NF6a^$?zNqu`i2tTCpvs^CNR8 z5~6veW8=kHd{Ir?wspUq*l@X04c7-ZIr_nmS%9s!MK-Crt}}fXh<8|}9UFuxbAXgl z@W;=lIaRfqh9=X_8rl_`D@XS4nm=$^em1IUQ=ASMA9uk)%<8*^KmK^qGpg0M+-$u| z?J4P6J?Vu(&aLl38jW>nf~EW5(uw)|H+K}S6h+?%`74vYQN%w7BV%-rW3Hpvp%lDP z^cfgib%Q&O5q3oMS2Zzq2w{c9G+9gA9{kAfkD1iM!dj^G1srR1Wt+cp5JU19%}`^ zdhP$3TeC_vzuk;10Mn*t{A=ErNpd|CJJkdrl61jYbhnpdx!t}W71<-aonV05zLWMU z!KXd9^{>c55tF3vAwb~z>{i*X`R><`a{k_GE-)SZRYeT_eXQ1%FnwT~COLia3H{a7 z<$|7t1Ot*)fdm>T-Rt0P5El*KZtI!#+@Y8B_M!f4`qXtXt3@YqHEaT!_eh|5FS8k| z)kCx|S8%_w-?J>j8E`H}`EcYV@n=^na2*|_lSrhmY7>J_#LWKeDM|bm(GFyeg4{Ba zNTV4h1u>18ZR3pf9|_|vb(<`xnsT~^`v*sao{t2asS01Hb0kXfbVlsgxrLhMP=KQloF>E-> zOUs+6YEOqPVG*I}iN^$~31?Qwiqd7Ig|CojpaGF2!ZtU=tV>HGkwX=}Al<-XFyhy% z1Pzp}_aBC$8NHO%wALEmwbz8RXn|?d-}Cnk9y{!)x@yL2^l9xTj9h#h>SlirJgWiv ze;75=E!`dFfFejKw@=d(Z9DH|C{+9`NysH3HFqyePV}>iV3KDCe*Qovlf-wMPw)2h z3Jy)mrC`ZseZE|H-lPr5+*Hnb@&bQlsfj#O_G|zrK_Ll;!N2(>|35<~6hu?QHtw`R zZBW)zS8jkR#9)w1rU{=xM-x%`OubQ(>Bdr-VWa5B&y*%Ihz*?hQJbLUIYOw4tL;r? zpF)M*v38a(%5{QeBo66)FYV?_#dFB~Mbj$vD`y%-J15>20yu7a04CdWw&eop`LZkK z+Be1_HCrRovKhx|oqDrXhy!10`P!*-MIj3AN@RW{W7PpP6c3H1AO-FNGvxi2 z4+}Kf>1d9$BtLl`rULo`M+i8~2CCWE+ac98h?wR-a0uQzu&P#8scKi(4FLW)!uOch zvK{#=KdSl$$bNkIxR(98a-wX)v3drpQ@Xju<|vtGBjm>$jm;RbW3^o}cg~L8x*Xk( zV~`N;x>zxYQWzj3-DR7`4eP6v8{Cc3y zT)EhB8PvxkUXZhbg@44>h_yn-`{yt(yHl)~J=tZNY!}ikRzZ|T8lECcrrXb?C#4Ty>4f}`%QlVsy?94@|6)+x@w!B%zAdOw^{=FN& z-b?z0)Rf7t475BZ414~xTzvEKxj{k|7na!?wxrdPOaknlHq@iX^yAJBm#vXjwi_(T zKYeFilkief;u7aqQ$7dlz0~P}k9;bSLWEobL$lWy5``P^UOb@X@karq^0+XS3xjhZ zpx}Ywa0Lm&y%sVLg15+|F+=5C+K8lyxuuSV%dXgzrl`9$i@n!CL60LQ6E2n(0LoIi zK!UqSYGqoHROMR!E&RFkInHO;%z&98EzMx!Y0G(aZ{eZ(!42nrs?y zhnH$08=VW9s9B}yT&~NEnMl#gF}b62(TrqXbw)e+&JmEHGG>*f zaUiSw(#vS0vfL~TZA3j)S9KQ1nP`5v)>f^> zR9APdDNF#ieNj#0F8^xH2N)a(2P}qwW$niSAk}Gf75-iGVL?}I_T$o86$i^V&mSDk zo6pspT2{(_yb<}S`Q!NGDJ|Pc$Ht1-ac654m+J@)AUqvkMwTw`wDg zZx2#)0`AoE49@P zq%epG4caqhSR&}JaN;-`v61IxAvQ@6-dq~Ycwt%keC=pS^=$m` zrGA!`(h=X8?mI`Y5(N;Zakd(%~B0Mn49|W{2?jH|*3D z+rl`aU(OP`XSb<7&X3|$;3hdylu%$skI5e;C;I!*lhdJ&s?0Z}#B`zm6n2TzO>e}h zkS~ROZVw|J01M2dyBHv=47;QY6AQA+S|F>8_ByRh+?o}=f8seDZ+c_NE{0RI+DlGo zMo$+Zcc_TEMdSSYG5KKL3?DUHN&M{Iu$SD4I@1;w_<*EbCRF4T<09#lyW6$LGgqnp zRx~w_>)$V>|0A+@8uJv{J1}hf5Il(V5*&y!$riF9^}IHIz$`MHh>A`7lz@_p#%J4t zA(h@9Nx(L2B=BJ{SE0nFf$F#8l}s9NTTc8@Ua%R@W$rw+y5l?0hSJ9K%6I57=w)aY zASn+DXvjj$`k~}vp7F~9x$|Yied!!(YA&0i*IFG+YieHloevm1HX&Q2kUM!9Vh1g@H3<4pua?esVpZO zlDOLD`r|wLe3UcY`wJA}fI4s28g5u%TCBcf$DJ+O&+jqbbKVGz#1{&{@)_No%2RsG zkbHS#nf^8O_5RvROYKvbTq){TYhAXNy`QmdPx9#e?zW=~$AaJ;2w^m!^vtSk7`!Cp z%5nXWb#{azfC@n%svrzO6Fk_k#^Dt-4=08u7ttcQWfn%(ir?yl(P8OBqrq!2B?R5~ zU`v5}LTM|UX~i2Sf&DmBJ8|a0t_Y&eYro;-kJy4_FGXrmO2f-j#DL!dK&Gjh4v5x< zy1Iw+?+qKDK&C5jWe}|+LTfV{hcKITQZs;36WVRhDo>g(FVt?bu1<Qy!y=_{zX}>2e;44 zt8rH|FQh0xeq|@m3;k@781KGd%p^bZ&1#B$0mmD=2-M!NpU8?x^DkS!Lw0M0);s=S zwmlEQH}zhNVyg4r@DTf(yqU}5&R<+Re+N*zE}U+0A`t?k*oW|)@6W23KFR*5!zSni^k+A*0}`O*1=TMv+4Q5)=fy^>D9>s+96$9)ubFr_Qw@D_w75VRz-v)WmF(8pD1y8x+MKxP;5vhzQ za-JnWk1By|8Y+uWH73LiS&~{eDl)4+nMFbYo-F=_?4Uc6!!Eu#>7>y>e|qcCuAWCb znyKnQMsIT|7!oN7lHq6dnUsA;0?g+|d6K0e8(FIUX(f7j^bLga-70&HB#?kYI4l!F z#nW^ZO~{3B+Y@PBo_20=&)rG06+9fr(|8wwU+{U6Nfa5X8Q5___h0Ufpy8495APWz zDB_>`eA*N5IsB=^SDAqi^F)OiFUn z!S`LH`UkVw3Ye4%FZj12%C!hpp6!%7eC9W7xCaWx-Nbq+V5!b2g#ZO(t?6`j#A|~z zvq43A(wu{1|KZOflJY#mb%Bu|IY)N_fNBm@S8@BE<;Ya4m?DAqRVo3 zTg5^d;x5^HG!4=UonoVS#tWNI1#*03FYi4ZNNbFhzD<#~{9Hy*%gOg47kd3Q+x+oP zBd7V-Vtew<^^~~xo2}MjuJ3?@e{-@yeEmowMa7hUvG1C~6^QSDpY!8grdNHygWu)V z_uyv34KJ_VLib$z5pt5huq@DzH*OKOuwkxZIQ<_P*XIpGBSgSqZRCBu0y zW=k05-gKaXxzUUnQ@$@Fi%x+Smc2iuSx zYEl3JlaetwCe`JDolL1L-=QP9s(J#57s-bwV5^!Nec5Un&a0~G>)>8jefT)y@dHOf zAR9D1IB9>;hUpvs3Y?M683V>8HI$ZMht6NkYXLuAwamI1AFCT!u;A044ovEG@(;6} zXkN}(anW9w8r63{gj90%@&0>X{(n8fA^i?0xT3}faS3vf|9ZAqRK}L7+b!M#eqJa< zE=0W|>3^Orz*&#rse025NklJc8 z|5;}X2UeRa&wTB>o8Yx>x!+}X=)$K)&0(0-itJCs9N)X^QVPRw)&sTtbc|oJj`v5Q z-6<{N!cCi>Yf0C`HMEn#Jkz?2L=wapQ7e>K35# z^_c6?_V^FQWdeYReya0-=aRhEORXi@({&dwy&%>YkOwdhG{XQQI=Sq%hJAlFYKlny zG|$xWhioFh);BD&x$eItA^y`Kn}h)gx!s7u)wJ6TkFY+Ni=Yf3fnv}}8bZUE>VnOE z$RxjPNplU5ScdZHdT+(g>{fhDfV;Y-OVZY0E(wK9ihUW1!`?U}hf@z}dWKsEflZ#*R@Q#D<25Q% zTCfxUL1s8rj9q%nUs79RcU6OZ_GHxmkThll(R9!#vNc*Fv zDT0-?vSRN(x{BuG5o?Y5ENe||Nz#j|y7F_hlzL+AS|H+0-MOemiw3`>EA;-(**x z^qkyJa`wSRs+~&TQcVG>%*d)sH?~sE$q@Y6>gXsnKEl)(9kKk#IMdDY*hKu&M&qPB zFn|j3+tRsDK_bO*#u@O#+$NkFznxDCep8p97F^GDr>4DdJpaVnr0y{%MEB-$UL*An z|AbDx_{X{DY%OQ?`bHDK!`yMI1JF@m}@R9OH+vDpm z#x)=8VXyUoNy@hG-aq`?)^(UQg|@xKW`uT9(0dp*(@&-c_JNsU>;QbFrw+^YprQ<# z&1=4J9|n&nem2Pw4*ufVfOZ}i-I(5=1Q+H5ms&5?JGkbrk_5-?CkbjNMexoYr`1iS zf6m63oW+i3q_7|M=TkZTcs>)KAY6}kHa`6N{>V9hi--vU9m>U5j~KVxpQiu*Cg1Mm zK_m@{JAwoI^1|P;a8e;ti2>JgGJh{erJVj?2O*F`U@y&XhQiW15C9GA>63<=fRErv56s-+Hsbj897ScYdYM&F>yUAGEC;XHU+ zVbIeFyAeJcomgDZQ|~7k5l(T9u?-uf{7ix;c%B>`kZVZ_FES=x=bHFMcZVQRMnzT9 z1;$G~9GDrHu)XI~wUbK-*zCuVZQN2T4|bR&a8wuPlG8@pc36ZeC$w75J?iO8*_)y! z^gHa|*L>5xVy20-AXSKUK*Co?|tst#sdDC!g{)RId0ZpSZ_`wtjmTGH)(%@%vd zNb-XJP@qg_U3+@v>c^CWb@?5|y`WP_hu4kO_v{Vl4TEreI*TQZm+c0V+cDCI;yn8e#gP#njP=0=wg58G#%C;>}KFC$NMHP6=?*#}TN;rohwKTTB@nRL^b^rCE_k1tM&5VbE2wRj{e zD6_6OI#h%OVPkNh7vpF>{967w{Sjir!YaI{y@w4sfIEJ(3?)b-X z>sbW)sZt+5#+0HJnDUSk==l-L$Xn%}DWL$^jUtwmdeRWSf#1k5ynR=L5>=qO_83m8 z+IF1}uY{|JIb7Nd_6Lf`Gyr?0;{ zOZ~c8C;!ahz4peLU~D_skzjl$^|fXDt|TsKq*r((#Bdgd{+)xAq#g_Jr07wN?`GaK zi|pq|a&{<{=4gWKF@DMYQH|~2j{Sm3N#9@PQu(60HLtgS@AXaAO`eugQ%4gn>J|Lq zSh95PyGC*h8@pMzh4kDaZ~*2qIV@BX!dYqBeN_V}V>fG|iDS1rPl;oM+E0I#j^C|c z?TmIG;|>Mf0AccVM$gs9M7NWs0hlI(z9;b)so};QSw#=BCT9qK?)o)5i6r7tV(^1I zM1~dc5Ao=IY(O6q9Vou=jYJh4cGOs-CF?O_y$reqvVKi|gXN+#{7A7Favpeuay=12)85SO4%sz9o z%eA2Sk~t{okWB7E0i{S*R^nZobMw)+BwUUfmO`43-Oni|5t|k0YbIYARb3|pZ_Y|9Er4Iva4G^4#Rz64qY2a8dH2e$TwTM%34;}`^hN?}jyEbe z`T_Fqxi?GM%J1TL^LuAH?o-zb`=r&G@OVwa};30g@;9g-O}+n7HjsD zK4fVaI5p+K!Pp9qqN2Iyr?MV~g$guOvT20$@#Sxn*h>70p7A)o$bO(0liFp`ey3Sj zxF~KXCUiIB#G96n_3;0Cod4H#69kP>u5&-LS zJeaXKTD7VYZ@0n`Q8w(dOp(-$>>MGrzW^4Np=HX0IA0@zW2>1W{_ZaZnwcG1j^bO! z2UPwFy$a#d^OA{6hq(&na!%_PXVFGYLi1&qgMw3&$p0dGguU#v!p&ExzE(7DCEK1T zeMjtU8v3r_@@nK3N4B0*57c>d7-_FxW6 zl}(*@{z=!;tF5kHUo<-E?Z-YEpi@&3csg!3B|o-IFUG#*Ld<)_q-!$^ zKUueqdZd=>xxf1Pq1B5CMN-`7e6O~cx>mC8=K5q4xjP}R@VfU0=AtR$-TT&cpTDKZ zh5kP`4GJ+*6_jTw33Qn^!wFw_n}?CEHPA$o28`*j)2C!6!7)RbEfg5CqqJjK>x6Y; z8^Gcxj<3beGDcWcemjBL6H=0dnrB{;tiD`Wf{922T+9%8)PYn@EERfLC0f$O6m>j# z1~^?!mD2Z=1X(AP^Q(@kY8lTRYItT}RF}2-X8)+`!t-FQ>P2F6R2U*stF9e)%6?5h zb?tCe&#WxwSTjP@{Hu-uwYaXsyLr_~27gFQMkaF6m`i4GC+DQSxU92|`?yCfsp|sI z>ZBX~u=AwxA?1>*4|b4^s~dT{n!C3|^pA6&w=xCS@b!xtu94}4OYTuBV)5Dj$f#Ur zPVPaIsi|QC`SEEXzS7~D7ik1dQ~axOd<>!&KQBJvJ1 zK&WWl=Jzj7B`>a7I+-Z`HDM(Jd8)fDc)+JuNYT<1fk~%>^V!RBce>k8iChyo%%=Wt zWU*O*-jn>-Z6qubFIOc^x!ghl@Nw`~m4AjPCD#8>*x3|>ohx8L*m(wooezRQ*qQjh zgq{7L!p@A8Phn@j-TxhSMm~Pg8Jld}Dg~}I%cV}=?Yz%c)N|6`thUB&;pM8$9)Ite zyFPz=MC@Xg=0-j*5GTwtIvlqwN+h0iDn0m;m2Jeak;iNXP68c)Qeonhrc@9!F~&GqlL$tBj7o2F-5Iz4ZJqzS-T81pA?1-j zAlJ_Ge&Y|i7YKV0ZcIME3Zp6TAXkkRI`q^Wd!A=bqVKCD& zg#e0S2W8n!d;S7!ngU!8tp&`s=oz!PGw;lRTW`56$JxneHrIoUXiwUE54fED>h7is z43Nn73*Eom&E;7g9YP9th0$2vJJZrt$b`K(!Y#Ar>|iP=16n=u4=s-}6E#gEpcSnG zZX>VZ`jzp@krCd(r~unJ&^WJ=Mb-fW1e;7Bnwn!n!$b@Sqwr3$!F<9Zc=KVQ;{``! ziP@whh_Q zZ3_=SRVYD{oaE?ED!$d=ZU**K;fak3V>>~KQ)JiOFrghY8yzH9Bz*pg)F()BiXN6? zdx#!o*RQp26$){75H#l`_#Ab#9{Zd$Dp7U)Do-UCzev`n?Y?Z+f7MO4WZ7%T_03%i z2eJ{`%W(;8HPK+_R6lb4{pQ^NHYg6e`)>O%0fh*HW@5D zgfMObb53Q$IOKen5Y{0xB;zF+l89NqgW@90N4ls%w4)EXF)=rXmLov~XaFF7;D^e1I z6%wP!7^2~PQiGh;HNm)wmgIaQl-`;F9Ti3$i$2*aEtK=EN{aq1FQLX$*cmRyB4hx5 zOn$G$rE>V?c?zT#p^Q66THTUSFRRPKhA59E()6!e_TtZIopI?ynaeV+exqp% z(*^idTIDBsGtbgOzUG*%WO%=gmU$39HVonc9g^rQ5lJ&5o3fqkwg`^zmy3MM*?r01 zcb|f`f(sEPDrAW#v|)ssad6@*A>;#=q0h|9O!CR${Q-f~7EO(@vAqQKVILluowDh$R-VUmPm4 z91VlWF^WeeK?WnR88mB_U@S-Csib0ZMN+H=QkAG=^~W1aC*vtB=P6i|=o538-d6F? zFIW>7@+{*}IuNkPm5LjQhO>GcO}#Yhf1amW?r2nBKVPOXBAE5{gT6@xe5 zHN!h!v+H!cEngd61-`ysIoQ=_IbU52hxiH6dsdg&WE3-bm=Fd?qY^$9&_xkRRCyd` zh6YwVpDq>1Q2${5Zn`GR%=S~^+c?HIz63{|)kd8O9Pe1)DCUUmf9dXQbxy1d?F`WH z6a2N4n{kq`@uziVL#hn_@zZ5xm(K-1VWoi-zDxei3F@APU>y8YHR z!qDB_9nvBtGJu4Hq=F#bUD7#pr*wmKgVHs0r%FjT(kLJx-{bp!d!OvR|L2_Y%x|rA z-`CZg5eLG6@c0*zj$6?R6pckFq62-5$?7WU1|Y#gZjvGnG=_2pzsXoWyvXn@ej~)) zVlHPVOU{%f!vF?Bfdq!qyp(aswoo`jhAMewU=a_wnmZyD?OXbD+NvHO z?2J@5c6VY1v@A@BX%HbGQT2602=)4VP!FTJ;b?-Jr@eS5bZ0ntPYG+gkx9YRd&0l$ z*pL58@2p?VwDN2KLjcQph#=0VZWyI-xo(70Oq{PDFA3|SoAOPh{hQir%}<$tc-1etBc^uJo&(yE5Jv!>DJUXU)9dxh`6J zzYzMCF!#=#+2c(jxNe0#tTnBoW7AzDz=`ympN2E$;0Z;W2#jsUk<#64C24?j|6khU zs_z4})LIawpU1`u*9wq_X{g+6r&;7Qtz>!s5rGB~{(XN5=bAT5D>_9F)8)=ZcUy*V zTGt9NgWC3^3nijYJ~XJb?=ET@JX2ONJ?X<*cH!y1TJ>2qoN6Ic-kBN~w0#RNiF)^jj^hmG_L&Z&<3Foeen#)t6 z&J4)HF1J{9*hhL2_)|)=ayhI-%KyXjB_E%c8iYCwJRbS$VXz4XSuV0FV?hcszR-pL z!jtI9PpnJB2v`XKV2ly_Upz^osX`c@hI-@PIrCV$By!}X@vNyzgc#>9;KyW}%75Wh zFxQe;qFAi*h;Av;wiu}D(GSSPJ_qVFfaCm^zSkOMO%4qtTZ>vO^R-CBDbJQ9j}|{W zZjMmPe>;3v2X^~Em%iEo?O_WAN>o~PkD{MxwoaXZ;VMvHpDe*EXY*exADTW_Eto|*{D}dv? zO=NJHJT&sBCN-&LLHclp&Fi(DOb7jl?G#~9oyU}An? zPhxMJd8;Y{w1*2y48R>m4m=(}OP}FvQ@#CzBdMkf1K{yL(PUQC)A4b_8YW@j4TI2U za($xFiL$E|N!GQe-TP%^-?HY%)Z4~S)CaP6{3bjCpTQi~D)QH1f8+(2w2;50`QOKF z)m?WedQ;u!6h1ti=oh2B-8i@qryc@Ey)*c}P*$BJC9WwiAt9@6l+r9H&13Qoa$O7| z7#ab~D1KhU1Xr7Q%$Q_@xA6Z5B^!@I3+<6)f29tqnem@ zKWAlWv4`hPMv2B2EKc%2FSe1axjk~}qjnc|omIv|^w?B(TcFE-$o{qH-FW|b+2tGc z#CK1|+NVtBx7Z$Q*&WzV*F$L~R5v0|z6&qLVIB*uyJ*IGtVB8dxmwJ5#oe@*%9=BJ zSldej|Itum+;-Hol_LffxLomu(m-f^UfUC$$U^H_UwI!j)qp@V(#;<+C>-}B`D~Cd z+2_Y-*i`$)>^YordU8#j{#KmkFT9EV{MI~ zuO-Kbxz^GKm$k0Z5*6Q_6Cig%c4$Hr;*G(b9#ggW*nVNmLh2&5XL*e`Dq`H$%{(2+ zYKN?yeB2SkF{_V@b=;icnH)(G+I3$E$*(f85Yp?}+>2y|XICDRJ|uy;_jkLPh!}~1 zv2}SjGXH!o#tCai<9%U$&iYm@>i0wrgl`Y}w0x@aKivgX6Ts&nAxm<1ypa@Od~;BN z+A-iXV$x_PI~hr%<1)?+Tb>yYMo^065MARlK@%AHQrc_PjYcvM-iAhlZoLZZsm*~8 zdwofNE?E$cIQ$Y#J({IJ_LIz)8I8b~$U^VEp5)J!X|+3_q%HR zO)`T0A5~W|cVzTa$hXrmK3Ziwa-?ufqja57(93c@ z)+)(vUk8h6_kkOWZ1O7Oz5K9pa2KG?Ut`1YkfA7}PF9c9c$8-Ra*8U;IdZQgia%qz zF#ctv+{cu!$z{bz?+^A%B0^_C7r8hm^5A2IJ-DFOaf?zOGt`cMGfJzwKu!_h&`sT=nV#aYiSM>Js$ z3LAa>5FBV^W#fvn_*E1em(R86;sB=+o>zI!$ko;k8S@yagp5Bi0n(!<`|TGRe4|)^ z)42PCf70o9d*jqov3q{m{}5IYb_DGw@xLKwgm7uP0tQ(@sRZMoDAGc!=+Jx#4y_O zrwkD+<}l+Rj)Hy$2=QAonovGxdB*UkJEfbkn7=%}#z8y7-$cJ6+ow-t zJhddp_ty>U6I%?7U8pn7fm*?r$JX+Nv46yhG({!vyH?aqj==NmfX`u-8gEGb2+m#*l{Jx3GZa!4Ib!vP@z91LU`ch zAwM19bm;iCu@u&M_gnY08$#;i2uBsj3hKqh9Che|5J#i*GZ58Qq3Iu^DFqLe7vU;QZx>Bq6*WdXmt*0T%+7uXQDr8%ZGA!&?hv`TWk`1#Qzqw=vp`U3YWeK*)K~Wvb%}DFmQ*qIhY4e;t&V z?&0yfXpp@xb??&JdgXt6oAbB*1k2;`h1jk>A_OS=mo&rc%detA!QG4&l<3j^mfc|S7q~_4^ z(FuAPzp6%vE*la0ll9Se#z)FF8WYqF^*xrT1N^cL$#UUd&K2G$<>*JG`DA^lusUxf zfFsTBmXokwkJH5qphF(UlOmgmhfIU1hkOt!?2Lz1w@GnTGWhJ*G@kS)%{Mk?}B zE=4^CLDGze=VnwHg)pH3%Z$${olyTkjd;GVnD=wbIEzOE`m|`Ea6kEDn;pK)#jRrA zPIMKcn4~N?|1QE*8OHnSi_CQ&3z0KzWd*Orr0g52-7iW(VX%!rdN;6e((P6arP$0L zAhT@5@=}Gdx#nZrJ(6MMm|j&S$|oH!m8Az;CJLe=4B~xRMbXT-w}M6F@5*Ws5&yr` z`G4+}z+hGoggVQnDSsLy9Yz2QX0izkB~e+9mUHrjCWC)zW-@7xMgSuGTs}*CntULd z(#hkFt$s&7k>wSRQkk=vVk#L32wF9iN+w1+7x*-*!zWXvEM|D$5|zzlvu8?RQ)qB# zW#Yj@AIn#BiC|k!Q|Pq)vPo-lkRHbV`6+L{4lpBC*n01L*t{d*{4l5oD60Ro0tl3gE5Z}po59O)tn2(msbQ{BLcFLUZ z5KBKXE!HT}|4y-RINx9+*PMNecmhcGn9r5le>%+%+XzhFFZVfsU}ePvi}tc`&wRZN zhe2mu%f;?0W@5&x+&@jXS9a&~lZD4)gZVzGSUiw(}cz7DQE1ycH4IRtg>wGg1OTMeZ?zA}=d_j^Mh!ICp%7>TFOyspPUAa4wvyOdW( zmqbKQ(e_Hvh*zClNFGj1pWoVygQoDBYQLZ%*GPN-L(|(65H7U`dPwD zgc)LtBeP>~&K+SMXAM&*(tm9q{89cbi3~i~Uy7cM=n>IdHj5WprGo`gv1_G3n!{LD z1g5jn{4j>MNd?gdXKY1C$}d5pfFQCAlK)oNOCrYIGM_VARr3R;c+`gYfz!eC$>ov*Gyy`zTL2+a3P40-t>lH02rfG+|M{Z` z3}!Cor#%=JW3{~`l79_mgtm?Y6u5m(gA6b9kcJSW^mvCcGso%%|J3U_nUeNqoetoj zZZ=G|K(ZD2fKA6iZIUTl5KSpab!t))^IhY#+_xf-#{vS=Dd|`5K7D!f^hgk@irV{g zuHWbJ%$LdVs-Ke<-c>^Kwr$E&93H#bPf-EQ%r1#AKrC=@Er_(Sdp&HkK$zPF^h+7z zrR{sSgiOH;>t(UhwE6^@TX@}rEcO~PO5pgKDnap|y;A4Zjz22S-&(!O?~Rf|kSO@j zaQyqwcM#|LM**Y0*KyfXxY*%>?L;8?RHhT4nJqDm{e+|Cb^Lnay6Ov+4u0PEWDcjdMlF_=l68Yq@VJ<#e?77Ib-4ptxLLEBCy!whpSR;kXmUI@^h@mI8>rP-4T{UfNjLO`vlS$sNzWiAN|MM zNXqq6h{#L=rCT2(+pi%x*d2a+6k!n#x{iDT6+yz8#umfX{Gc34B1cegA^m=uyf}Y- zlK)+in)q(80YKghfR;VF^Dr!HBc&-TfSa`zit{xDWT`)LSxAmbFA}7d%ro;K3rkKQ z2&DBg?MPZH;F+?xq;|L#@4{}PEJ>1L2m3zqH;|`Wbk1bX3YtGj5K%FodBybKpPBzl zbp#LgcbYzS%lj_^v+;ABytFmOEKAEWCwo(SM!^U!RQpseVRD?dSS7Y%^ma^}kV2<}3!-Wc! zD}AjRoSMq-0Ia@E(`5FEdCSX?o71>=ZTQdjzfdN`7<8dOM*n=7=VkCkH~Q^Eh-#?k7|w8V{?Mz9w!*%UwaM zY@KrNzki!_IjNRtzrL#7w8*WINV?y@?kJ}9TKbvV8;B|!3^LK5K_+?%|8gMMfhpJ! zhQ~L*7Gx(Qj2A*o;A(_}Vg0umih@uOLYgx4cPAxJFK02Q&FD(JrTs{b|8m|$Mrfru zD^|=NJbie`o+z=R=N?S)Q2zA7Bnc_2!sHj$u0>e!U^|6v7)ox=WSXcmoNmEw(UW1L zzp=w?TfM)XY8;xhTt4xRTMvxMC2~q+aPmHY@(?Ci%Zlo64@Q)(2H-M281;c`THbRed|wKV;2KGat)kyDn9|lnGW0ez|Dhme90X%yit$ z{=o*NX%EK9-LefotZH8$U`s%~J6BYFgn;y8pd0D1O|9z>4pD74q|K;S7R~$g1dc6s zciM^eipsH{)MUA40E>_cpP4DCa*>g(a15W0tD)WT5o4;-@G$%HdgsxAb}E-)!4e;r zQBi58i!s+PwimL(yX~hFETr!)Cb@auEn{hFJRAO!|1hRmFZa~DxyYMvLl4JFGHp&-?=Y(v~@HsyDm{TuLNDa6JE2$#Cf{z zQt{t8fdBdbA|Jm7tjw4M5O{okX&7z{NF|mVbAlXzF))nf55^(lv)s*3(aWe2vcDZG zO<+Wc=f#eM=nxDkB(p!(H{Cxs8%tw&I>qHF@DV?oi~8~o-IYb5fHj6;dq2@Cz*&1# zCxkuU=1qkyJoHnB*5TJU{VslDu@tL?2FqEPnW7M%WI8# z%|@AZ+MDU(2E}9LQ}m{?%tpB$XjZb)oJ?TxjISirZ|Ymd+@I1O|5)JLnl3`mkjPeR zIDl7@xA|eUU7F1~Dx;J7H3vIwMmz^&S!qi_l@|J2@JD%IECW?5A1coUP_>eN*wv2r z`WXm5EqGR*iFoWzR>{&@t|b1vTvV=me(Wc5cSfyXvEnZ3f1bcf_a34z zHy%v%TH6R3q4R+VI_x@c4 zy3?@21-@Et#*pmneT)6nfyNlmh@oJb05J<^lBMEiH%WRzGB*ffL2DmV{dJy9q?wo- z7pFTEl@({ab-rOvGx{TAo^D}Yzmsief5U?AG$I0axGTdfP(3$Lwc;BW!O4S_>+~1K z!CVK5lH5S|G@OJ9UYu#ZZbgC&rP!BCe(hz2noiJX1++OFqggQpjPQ_ALhdnC@STuH<{f;;mFWf>HOQet_yP z0@WNKP?;r>s>Y_I3k?M^5P>HL$_k(qbgH=O@z|Og%6MqnCLI@FB_5~*nPo_QfeMvy z>vC2Nd_!QrvA~9Z6?3;6_+}X9D>!2+;OjQ0PWaF$w1m_GP(31}%I@AHt3+|0t>wediLw~M!pT9v+4FEM%L}Gbyl+f`&++f2$EZR^^0+|3LNW>%D<{spkSWCL# zJYL!6E&_et0CKK16v}m}P2Z_N{vvv0_`Q2Ck)LUZ7}pT)zQqSD;pvDm-9Vy`@_6sG zrz3ko4uBRlk$Ivf;?@310tAM;FZNSL!j8WeePMO~< z#-HLuXCY%kaYB~VmY+uwF2h7a(js3U!iR)B4P#;knL_QE#7UFY*I4QDFZc;?W3fz_ zSj$3Q>Jt#Bw_~!3-6*JX93>QH6|wWAzih7LPpHD$CNxnP4$LC>FsZTqT~sGZuTwo4 zLT|?I>pAk)i;3?4oP~r>lb}I(1T3a~@%eFK5@?9mk_iQUPsqNxE;QqZ$;A=;YjX|` z#i4&$X_;Us8$;FR17WW(mQ2i5%8^0mV}Pd6a+^o9yA&&D3coKfopWJU1UBc1KBvaN zHs{PgJ_pX0e{Igc$d(GTbQ**oO0_bJ?J^i0*CR8;uC_B?d+5GcYD*0TvU%jh$KIdy z7C-qfcgA=J+ka2>{COVpi_~$gCj>i5CTspND6k&M<|wr|8zQ7((&|@SH<+juTqIU2 zZMq&bR4jOz--!yXEEKl&Dw^!h%AdK&5^$p-7v8z%-p%jnvgMkl7G+ z)179*zaLI-S#ZOY{6tw{+we6<@pcNICyaFociGMvioDI$4*&E zx-Uh2F-Cw2JBTt(cv_}L9NZv)BNfGdrfL8F>-^Le^5WvGVugY73WDU`iW-y$0EmDu zY;8)$9OPHf5Y#OmNY)OB+8})T>RKV$a=chkQ;j0VRo5Tt%7rj|(8^UY4*v~g^Tupy zpV|rf;LV#DM%8#)MVZwyYK=?WO^khFaG}c?n$4bEUI(ll{AHK8 z?khB^7d~f$8U=Uf6=}>S)1zm`RLR)k1X#OhUN1JHdRl8{ahKm9;nRxdJwHRsMI$H5Ts18#DGdYUk{w* z^C@h2)bO{^{NFNZa0%}^x=jI`xOFOoH#i9EAyZBoXK@Ngcq|`B4QS;N>wI=887?CC zpp-0XVVH&m7}?iSY{v0)6io7{6=-ly?u0PqEd~}6w1LZfP^s6;@uktcu~r1n?hh>eJJtHrLUI*J zy`=DkITlfyb0wI(OU8QelGP$BR{|5oX70mW$=7QIJb%PFGDI^9D5|k)01J@?Cb7IU z((ftD7eokzFG|1ur)5$tUC%o-d@r57?MUe`S_au<$%KuJD4RXYIm_C@!8jyB4%2JA zf<9d0$HvP;_(h7T4DNik+UHCo$z%fcKEtynW9iH_^GfXWtcs$~l4yv~8+Q~6WZgNk z4-&GpDumu!e#vN{3#~CwjClOw$-Y)4Ym;;T9x+#Fo$2VgxFUDOVm0J@CpD-0u}+)r z8O|JL(}`khz&Cwc%+I_~jd(`6V`#c_%V?^V)z|j?3!vSU3i~CKA*k3vs$PQAFRGah z)XbyRw&X4?<5|ywNFG-=?#GmB8CU{GGxb8E)m5!8Wz+7Yh3C~T-^Hra^{NvkIq%?m{VCLI|4z*A#i zX7!=f5Ke-o{3zOiYeO^q0kzEt;*GTY*vD?A@I+9-Pm?T=A>UTB)f^rOO}Weam=f!{ z|1niL^o9vRU1d1&!yEf%=2Qbea`PmU6n2acuZ>%FaP3-eb`qUZ6f8ctRj0G2d6!R> zB>NXztz`$fc@7lDxzSmnA}4_F!f&P-RyvfwiUvz^r6~4`KIp%M6=$k{VSkku$^m-# z1P`X5?B{HqS5g(}g;M!ZKl0$oXOeKvQrbFT57T1G{E?O}m^n;2C8gWbI6Gl{#5Jd) z`=gGFt?fq=Slk~`F1&UG)*O59$|fyd&`jAf_qK02U^uL58~=+f+xP0TYr2Bn9yj0W zEAl{JGugi2!xEr^_u|$t)b*L^7}gXVWl(Lvo>44vCmk_4b#G`ppmcq za92OY|H|%y#V}~RXP&Cm=<~v0QTDGinMP%Zuw(D|;IfOmiThJYUA)iprnwI>pBD#f zkKC4>XU7M>dmwdOv6!YFJzWcYzW-|}n9}e1yC=^|^QyHZx5rX&kcr4f`bo#lW`Mtn z=W?M5jv#aGAdMJRlJYakG>eh`Tm0APIg?a^6>n*-s-iN_}x;G+rfS0 z5{G`bmYI7~R1%FyQcG6`%(G|RlHx?`fw*%p2(xxPnKmzq{g5Gw9YEtdpODi*))8zh zx{(NE0x@mrAdJG$$C{@wie*DoyVD*#36tPP&U}8na5##nW5{Dydgudpcn{e`d}x2e zI<`}(G!4g87$=t$o`Gc#S?hZE6D)e1^{GC>U#cOJw)DhNrBE)G>Cg~x#(S zWC$m&g38$_#iCj36+T+J9w6^?qI0R-q`uHb6Y?vH^Sfh2KvWon?o7wiK#Lei$$Lc? zot%S%P2~VnS5|+=>g)~3V604A1V|5NNXZOPUSsIUiR@AwKzKeD=(a_ zoNJ~HiJSdNf5gk|o@fi`VZ@XV_hl9~aw!7c!OMt=q=Ku)Jt_$_3LB0f|p z(+zVw@@gEP55%4k>ITK>zBi8RQe57z^ANTVo)YdIkMdKrBl18Y&AL17s64yAgJ&T$n9~HP6S4NI*6*Kd>&T zn*d~!(qfL;a-_Xh_L|(^Zx0cBHoVH}YG{aTFh>x*50ibR1jjxv{YrZ*wd|I;*@PM* z7Tx4zO=%zZ_HUC#v9C=g<=^UxicSs5>4>63$Nj)FQ~Ek&40iX82kSPjz#=!?)wH1dEgfgpin=nhOqPF{1T4W{5mz zw|cV$d^@8TUhEBKyl|mWPQToERjd;7)pV$olQC2h9$F=v!Ua{aoZbMW`@^v+NQWOY zo15)|wZ*Kn@zU3$sUW=$Sd};FiDZZO&F^~~UdL}e#+bXxqojiyB@EP))Y_!sTfJVK zH8N7Iu2!MX)Jx3K@}C5!?->v34;Q-~O&2Q{zWyHc$!5NOdiwJ?io5+xo7Sy8w%#wt zr2&vCQJ(sF_@O5xh)JKyG~i_Q&1X7v^7uG`mpst&Y4}KARNTa!Z=77s8W3+(%E|H%y-_CsK_tVnu?i1&DNer`QzP~Fo%L{^873II9_u9#^=0C7Z(Q;k1BFdA64wM%1 zL;A}~^jW6D>|-{|D{}lEC^*VK5(HZV+fBxoirN8+^3ui(uZnVny#u0}&Azw&HI0e% zT;+WfoJ93lP~*o;fnZ6Bx$Ml@*R)DtGt?ZqXH?z7Sd_`l`J=wTzV(ZK#nI>Q^$7OO z<%zn-Ene+nQf**5s`+$*q7Lf&k&4`1_nnxvT}UQkCp}jf`KQfTx3^$%`i`^iGZ8D8 zj_$0NtGm35vYh$2NDIeDd1@FM#;Cw_RQGwy7L!o?qCF7{EPc*L9`{mRj8)A0G?a^; zEDI1mM}6Eo<=yzB9^B`v1SdqFV?U8sfAy^Ki>yu3rx_~8?1pb@sLD?kv>CyVxyseD z&{X19b`!Zz=7ZDdsz0F^A!0CNHy#-~h&5`p{+@sY}@!BXpj27Jjb6fmjYHGFTtmEY|(8@z-?-2S3ANoODPqXiQ zQ~)vryf>GCMEcaE z)VLNzo2BqbRy#lzT#7g!g<)s`zMjr0Y;$%EMGOs&R~;P8EN;Z8-Yn(V=!n1*jDqrD zHV?)9sv68Rw~hmyk*4+I@qtnmphRi+lF&H?zua2K@F(jhBS;99Yd0czU;2WWe=7vd z6paP|$LyOEC`*80>^lQ6jHyK|44DXVShNJ@@%clHOhANhP{h1H)_pFY<|mX{}Z=II39>b zAdl#Dn^hB}U!d0j?HCY^z$W<3i+U4G;Bj>S;>~))32U_5g;l|J$W?NLi;dq%!4#LC z037O>Wm9=gCX(3`lgAT9)Kv6t)=LKRq$9pEMOhZSNERR`_1*VM(RVtt5kQcN6Gds`PgWk$*KR2w*%Wj13KzHKn zDi0@Eh6dZ4oT-mNyOUP(sruz!?1b~c<|wgzeHJ*JTJm67jqi22FIZ_XX>aTuu#V8~ zFYTv&=TWsoo%hNi+xPb9bXd+n_g6xyn%`~NE-gA1KN_7+uFSQ9l%%G%krXdB@knU? z+= ztxP*)LJZK&Qr*>slaVtR3gKwV1-)VKJWIqyA2q(#10>o99phV; zEIWQSKUx<)W6rdlO%#oHE;9A?00pTS9tDJutG5T$BHxij`fP~@ih#<+ivVJOwOE(} zl{{U4WI@G)*dY20j_ra~H%RyPw5+{ z(BBzfGAn_dyOi**65iyqI84_m=?k^X>6bjpsq?y2?}2@)qNQ6YnnWeoh)0 z*tvdH%JOwtRI?F#zhq)!Cj>e8XwoL)r4XJ}&E8^FHh`kZ3<@?!6lN8JAVi@r%fHwS#*t=v6%SR#IH|&2CVk zgfP0=E8&QFi>`b26+n#Q2Fod=-}^PIf6h)CXnyU0<5Ui#3BUj+%3UZ!stMB=5?XA)B@a~T6shoNrHiQy1t z7PXJVrO7z|;P8(C4nGGcS(+Ti9d=sxX2dz=Q)BPr$LXW*e$~5nUCQ!?vn5MR8 zrSbT;j2Us)r?rZ+Y$WQ8n-g55514BGH?R4Bs+Inkc=QQa#D!}!dabd5B#caL9UhKL zuMT!c`7a{K#UhEUrZI=Y7&X+nJZJJpQYmYOl82`Ql{0ybCW>0lSSGSK-1W=$2`#6x zWgIA!*#-AsMLsG(X_oz9omuflD{`szgJEio0be-rs2Y$lf2%cD9{zMFS!*$O_FVJ`|^2s^gYjfr{s~WXIL5+4 zy_>4 zPl^mGZ$3Z2%Z2*go;~gMM<8IL!@QW5iw{I)C|!d+AhQ_;Bd>%R(vtFPt1>esl8r_5 z$P^Sr?ucv@Fd{#qD~yJi0rm-~@^3_Pd0jC?L&oJdC7*7jF-EeV&u>KWVd$77h`fd| z#U*g<8z%`!c$y?@aO^WCK}Es&F%zJopw>m{=1}v-h2ob=eZvqrhB=**bPJrKoeW6J zjrmLGiIxO_ii+6DvHkrQTt*PN%Mw6f8amPdro0p|k(ka!-z zYn~#jtUq|i1-knbYGuVZ$>rscPX`C@>qbWKss^*X4$E6R7Y{2NF)}&oswgNq>pyZt z9ZI&wu2Sk@w8If6X&YWplD;DH#*)a~ZZ~g8^dE9n3GOF4d zGIw~?vAJ{jju1kKMTC#W=wsA_vI~~*82rn9J-9q$y#469db|U87p&a?6;;$f#8`33 zi%(aC1ylQ%4OQY=Kf;Ohr5=Hy*Y>Gz^IJ7M~J`uh1#&(;hj8PW)3i>nI-y$j>yL~Ym#3pJx z!g;OPx9XqEaLtaaY}mYxzh2P1VGmxs)*mDg4-i-KyM{#Y#71q##q~99CE=%XaN|Jy;|Fe?Z(iA}RPe?1h2 z94McxU1j`)k&I7hz8SyZpM$<$THm^K{J#f%6QsWfeI}h5`mtn5uKzmdZ%zq*n{V8PJ=PQz!{s`0I-dx(4&Ezk*O^X^P^Wzz zd>v)?y^~qjt$MlDopZ-`DWqn#%L?fYW&2ZZC_y~^qY1>yhUHNqo)8?ODD zoS@l=o!V>9Fq}a}n<0SJ_(MS;<>zbqXvT^8)eyFNO}bdLgFQnnEvED$4_-cS`QmM* z+fLSi6>TLd`CT$4)2r`)1PJM}?G!aHoo%@{ujz~Bboo__)48`8O0pnY#wFPaTj{J! zKIiN!!U2fZLwP~YMr@=AOc{Gwt~joM5hy!Tk~@gZ!ImFN6aOi~Qe4 zS`~*mFR~Zrt*{>y#V0>d?3HDdA6QkyAD~xMrV_m6EI}@#|54kUVN_X{3>LR~mV!~C zSW{A*@W$EKFMfO)WT@a`9uoy&>$yn7qfh5># zf>XLE;q~EHV4im~5GFefQ$N4sgAzB1PmNLzX4N+!{mogU0GKqP3}N=jv>c)9$c$od z^7!lmkxciT2B+aC#8lJlpOboj4`C{F*_V<^Pq7K+)CgtXe|clm@#LH2-+ww|&Uc@I zlc(d?7wxtOZ1-iU$;WOSZUQk^vtAnGO-rdBN7tmF*zW;#)3gsGNi$Iat{tR}mRs`WtEG(OuPx2V+*6N8c`yLh(8cxgfV*vaA@JzkHt z5D%ung$}f&;m0UyGg2;jq&zK9i*>CmJOVeaCp*(zZc2r;+XQ(3_bzD)3^PUl^g3YD zXyOdAmr$T$z$Sab>pGCY*!y>w(Ugz;yG!!a*4t++l!Z}0gJrR+7O^KXqvt4DYx_--lP;fL*QXS?8FIa_Tu_vpDz)`#n}g&p zwYl>HU3P_mtzI^pEc5W2x6Q-7hwxe8Ktj}m+Qc2`bqIrA$Aql6!?90CDw_ltW?*BP znR2agcG4spSK>LaS}5S(@5d^ z(#O_Uy0T5aQ-O!+|iq%~)p;QemZn!j!@EG;W$sE&0RX=5upGi z(z=f`cih?1{+GxjWqHzZT|Uaw_6G;T+kv!63F|?<%H&1B#9Vgl`7O)k1SfWQQcIs0 zOvMjvO4j3NW-AouL*Q@Z3PJ-|o}Mv*N#hGH!AY+3A*6I4=aJ+};7{a>ig!VNx|ww` zkr@9&U<&$59I%>qvo5EV#O(Ozq}r5zPQT&lX!!cPWcmH5fv)exG#2rO8$DJGebaLJ z+`Fc7jIAn3E|5C*1rFs`^w&hvqf@_@oF<=zes^aryIS!bMEvKcy?H5Oa=e+t_(iswr1E5ES46vE5T`$+knHwW=oN1{K92u-_BP_RDrpY~!Jwj;a+ zmv(7&!Bugzsi5wuO$=?r4rJ*^wBpKrr2g&aql8-kUjORh`se&?QOD_b+Bos+u{hd} zONbhPJa#v{YQJ5x!SA}b5XfCQmLmkLW^}Cm6%rNz5+PX+e8C$EVHQr7)vm=y1G}U; za40%o5As0>LVGb3kHip9hhdwCL@x}*nAw7n&Cwx>?m_Wl_$C#r;h@-r zOq_ReKJ5dUJR+7eowXnn1EEO#3;y~9k6X=)zG`T9iT!H`6EkLIj=o!mM8t5&~8; zLJQb>QCy@w*JKfRwx(ohY?3k8xIzOQReuWSfZYiTHsTK)~%fljv$v$}*5A~QUZrxvR%fE*Fo|}?t4om zUzwRi0^$;mX9u!L80vWw{~`SJ&$NX`hyfa<`Tt~~AyZT9eNkleuan~eX%a^HJaUZ8 zc}t#$O)WzYo$uqz6kgocOM(WLo^&CXjbMdhi^(iR4K!ko^3u{+34cWDmvd}0MUszr zm5nYf2Z~G!RH}e;=uM3(x)iyXkadr`r6Tbi##akyz1cX9Qbh{gl7JB^JcPmBe({s- z1;+By8@hMh2FOTsde@HYpjf8}qE6>B@@e!s63vw^yRh^p4%~Y;0zFfO3aKdBB2Ri| zMlp`lJHqMT+N - - + +
A highly customisable, open source server software for Minecraft: Bedrock Edition written in PHP From 0939301938ccb3f5641c372007bf08f839e7c0b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 13:40:30 +0100 Subject: [PATCH 1127/1858] Bump docker/build-push-action from 4.0.0 to 4.1.0 (#5823) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 918ec2cb11..02342bbfd2 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v4.0.0 + uses: docker/build-push-action@v4.1.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.0.0 + uses: docker/build-push-action@v4.1.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.0.0 + uses: docker/build-push-action@v4.1.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.0.0 + uses: docker/build-push-action@v4.1.0 with: push: true context: ./pocketmine-mp From 39a6a9ee70f3bf2d98286c08ff8379ea265db1a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 13:40:48 +0100 Subject: [PATCH 1128/1858] Bump phpunit/phpunit from 10.2.1 to 10.2.2 (#5824) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.2.1 to 10.2.2. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.2.2/ChangeLog-10.2.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.2.1...10.2.2) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index db08576b8e..f44963cba3 100644 --- a/composer.lock +++ b/composer.lock @@ -1937,16 +1937,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.1", + "version": "10.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "599b33294350e8f51163119d5670512f98b0490d" + "reference": "1ab521b24b88b88310c40c26c0cc4a94ba40ff95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/599b33294350e8f51163119d5670512f98b0490d", - "reference": "599b33294350e8f51163119d5670512f98b0490d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1ab521b24b88b88310c40c26c0cc4a94ba40ff95", + "reference": "1ab521b24b88b88310c40c26c0cc4a94ba40ff95", "shasum": "" }, "require": { @@ -2018,7 +2018,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.2" }, "funding": [ { @@ -2034,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2023-06-05T05:15:51+00:00" + "time": "2023-06-11T06:15:20+00:00" }, { "name": "sebastian/cli-parser", From ff0199cdf832b276bd774adb70a89a1e4b2ede5f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 13 Jun 2023 18:02:56 +0100 Subject: [PATCH 1129/1858] Fixed blue candle being missing from the creative inventory this coincidentally fixes mangrove doors being tagged with unwanted blockstate runtime IDs. Their items client-side are not actually blockitems, so the client doesn't expect them to have blockstate IDs attached. This reduces the chaos in the creative inventory slightly (for some reason the client responds to this stuff by putting random creative items in the wrong places), but the mess is still substantial and I don't know what caused the rest of it. closes #5818 technically we shouldn't be breaking BC of internals signatures in a patch release, but it's internals, and that's an unwritten rule anyway. In any case, no one is likely to be affected. --- composer.lock | 12 ++++++------ src/data/bedrock/item/ItemSerializer.php | 1 + src/network/mcpe/convert/ItemTranslator.php | 16 ++++++++++------ src/network/mcpe/convert/TypeConverter.php | 7 ++++--- tools/generate-bedrock-data-from-packets.php | 11 +++++++++-- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/composer.lock b/composer.lock index f44963cba3..e27182c1c4 100644 --- a/composer.lock +++ b/composer.lock @@ -224,16 +224,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "2.3.0+bedrock-1.20.0", + "version": "2.3.1+bedrock-1.20.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9" + "reference": "fb89ccdc039252462d8d068a769635e24151b7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9", - "reference": "b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/fb89ccdc039252462d8d068a769635e24151b7e2", + "reference": "fb89ccdc039252462d8d068a769635e24151b7e2", "shasum": "" }, "type": "library", @@ -244,9 +244,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockData/tree/2.3.1+bedrock-1.20.0" }, - "time": "2023-06-07T19:06:47+00:00" + "time": "2023-06-13T16:42:09+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 39aeb7bfb3..845d5bc5ff 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -177,6 +177,7 @@ final class ItemSerializer{ throw new ItemTypeSerializeException($e->getMessage(), 0, $e); } + //TODO: this really ought to throw if there's no blockitem ID $itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName()) ?? $blockStateData->getName(); return new Data($itemNameId, 0, $blockStateData); diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index ea7a64d403..2c5ad0607f 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; @@ -37,18 +38,19 @@ use pocketmine\utils\AssumptionFailedError; * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. */ final class ItemTranslator{ - public const NO_BLOCK_RUNTIME_ID = 0; + public const NO_BLOCK_RUNTIME_ID = 0; //this is technically a valid block runtime ID, but is used to represent "no block" (derp mojang) public function __construct( private ItemTypeDictionary $itemTypeDictionary, private BlockStateDictionary $blockStateDictionary, private ItemSerializer $itemSerializer, - private ItemDeserializer $itemDeserializer + private ItemDeserializer $itemDeserializer, + private BlockItemIdMap $blockItemIdMap ){} /** * @return int[]|null - * @phpstan-return array{int, int, int}|null + * @phpstan-return array{int, int, ?int}|null */ public function toNetworkIdQuiet(Item $item) : ?array{ try{ @@ -60,7 +62,7 @@ final class ItemTranslator{ /** * @return int[] - * @phpstan-return array{int, int, int} + * @phpstan-return array{int, int, ?int} * * @throws ItemTypeSerializeException */ @@ -78,7 +80,7 @@ final class ItemTranslator{ throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); } }else{ - $blockRuntimeId = self::NO_BLOCK_RUNTIME_ID; //this is technically a valid block runtime ID, but is used to represent "no block" (derp mojang) + $blockRuntimeId = null; } return [$numericId, $itemData->getMeta(), $blockRuntimeId]; @@ -106,11 +108,13 @@ final class ItemTranslator{ } $blockStateData = null; - if($networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID){ + if($this->blockItemIdMap->lookupBlockId($stringId) !== null){ $blockStateData = $this->blockStateDictionary->generateDataFromStateId($networkBlockRuntimeId); if($blockStateData === null){ throw new TypeConversionException("Blockstate runtimeID $networkBlockRuntimeId does not correspond to any known blockstate"); } + }elseif($networkBlockRuntimeId !== self::NO_BLOCK_RUNTIME_ID){ + throw new TypeConversionException("Item $stringId is not a blockitem, but runtime ID $networkBlockRuntimeId was provided"); } try{ diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index e01a5a10f5..94f476e9ca 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -82,7 +82,8 @@ class TypeConverter{ $this->itemTypeDictionary, $this->blockTranslator->getBlockStateDictionary(), GlobalItemDataHandlers::getSerializer(), - GlobalItemDataHandlers::getDeserializer() + GlobalItemDataHandlers::getDeserializer(), + $this->blockItemIdMap ); $this->skinAdapter = new LegacySkinAdapter(); @@ -147,7 +148,7 @@ class TypeConverter{ }elseif($ingredient instanceof ExactRecipeIngredient){ $item = $ingredient->getItem(); [$id, $meta, $blockRuntimeId] = $this->itemTranslator->toNetworkId($item); - if($blockRuntimeId !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ + if($blockRuntimeId !== null){ $meta = $this->blockTranslator->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); if($meta === null){ throw new AssumptionFailedError("Every block state should have an associated meta value"); @@ -230,7 +231,7 @@ class TypeConverter{ $id, $meta, $itemStack->getCount(), - $blockRuntimeId, + $blockRuntimeId ?? ItemTranslator::NO_BLOCK_RUNTIME_ID, $nbt, [], [], diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 989310e255..a8ea6554b2 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -33,6 +33,7 @@ use pocketmine\crafting\json\ShapelessRecipeData; use pocketmine\crafting\json\SmithingTransformRecipeData; use pocketmine\crafting\json\SmithingTrimRecipeData; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; @@ -40,6 +41,7 @@ use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\network\mcpe\convert\BlockTranslator; +use pocketmine\network\mcpe\convert\ItemTranslator; use pocketmine\network\mcpe\handler\PacketHandler; use pocketmine\network\mcpe\protocol\AvailableActorIdentifiersPacket; use pocketmine\network\mcpe\protocol\BiomeDefinitionListPacket; @@ -110,6 +112,7 @@ class ParserPacketHandler extends PacketHandler{ public ?ItemTypeDictionary $itemTypeDictionary = null; private BlockTranslator $blockTranslator; + private BlockItemIdMap $blockItemIdMap; public function __construct(private string $bedrockDataPath){ $this->blockTranslator = new BlockTranslator( @@ -119,6 +122,7 @@ class ParserPacketHandler extends PacketHandler{ ), GlobalBlockStateHandlers::getSerializer() ); + $this->blockItemIdMap = BlockItemIdMap::getInstance(); } private static function blockStatePropertiesToString(BlockStateData $blockStateData) : string{ @@ -136,7 +140,8 @@ class ParserPacketHandler extends PacketHandler{ if($this->itemTypeDictionary === null){ throw new PacketHandlingException("Can't process item yet; haven't received item type dictionary"); } - $data = new ItemStackData($this->itemTypeDictionary->fromIntId($itemStack->getId())); + $itemStringId = $this->itemTypeDictionary->fromIntId($itemStack->getId()); + $data = new ItemStackData($itemStringId); if($itemStack->getCount() !== 1){ $data->count = $itemStack->getCount(); @@ -146,7 +151,7 @@ class ParserPacketHandler extends PacketHandler{ if($meta === 32767){ $meta = 0; //kick wildcard magic bullshit } - if($itemStack->getBlockRuntimeId() !== 0){ + if($this->blockItemIdMap->lookupBlockId($itemStringId) !== null){ if($meta !== 0){ throw new PacketHandlingException("Unexpected non-zero blockitem meta"); } @@ -159,6 +164,8 @@ class ParserPacketHandler extends PacketHandler{ if(count($stateProperties) > 0){ $data->block_states = self::blockStatePropertiesToString($blockState); } + }elseif($itemStack->getBlockRuntimeId() !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ + throw new PacketHandlingException("Non-blockitems should have a zero block runtime ID"); }elseif($meta !== 0){ $data->meta = $meta; } From 288ebfa08a32f175a1c06bf795ba6691397f96c3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 13 Jun 2023 18:15:47 +0100 Subject: [PATCH 1130/1858] Fixed a bunch of item IDs being missing these items were all pretending to be blockitems when I dumped data, and I wasn't aware that they'd been omitted. --- build/generate-item-type-names.php | 8 +++++--- src/data/bedrock/item/ItemTypeNames.php | 13 +++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/build/generate-item-type-names.php b/build/generate-item-type-names.php index 2cbc07c2d7..d0b1186995 100644 --- a/build/generate-item-type-names.php +++ b/build/generate-item-type-names.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\build\generate_item_serializer_ids; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\network\mcpe\convert\ItemTypeDictionaryFromDataHelper; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; @@ -45,10 +46,10 @@ function constifyMcId(string $id) : string{ return strtoupper(explode(":", $id, 2)[1]); } -function generateItemIds(ItemTypeDictionary $dictionary) : void{ +function generateItemIds(ItemTypeDictionary $dictionary, BlockItemIdMap $blockItemIdMap) : void{ $ids = []; foreach($dictionary->getEntries() as $entry){ - if($entry->getNumericId() < 256){ //blockitems are serialized via BlockStateSerializer + if($entry->getStringId() === "minecraft:air" || $blockItemIdMap->lookupBlockId($entry->getStringId()) !== null){ //blockitems are serialized via BlockStateSerializer continue; } $ids[$entry->getStringId()] = $entry->getStringId(); @@ -92,6 +93,7 @@ if($raw === false){ } $dictionary = ItemTypeDictionaryFromDataHelper::loadFromString($raw); -generateItemIds($dictionary); +$blockItemIdMap = BlockItemIdMap::getInstance(); +generateItemIds($dictionary, $blockItemIdMap); echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index ff25fdad33..8dcbe0bda9 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -30,6 +30,7 @@ final class ItemTypeNames{ public const ACACIA_BOAT = "minecraft:acacia_boat"; public const ACACIA_CHEST_BOAT = "minecraft:acacia_chest_boat"; public const ACACIA_DOOR = "minecraft:acacia_door"; + public const ACACIA_HANGING_SIGN = "minecraft:acacia_hanging_sign"; public const ACACIA_SIGN = "minecraft:acacia_sign"; public const AGENT_SPAWN_EGG = "minecraft:agent_spawn_egg"; public const ALLAY_SPAWN_EGG = "minecraft:allay_spawn_egg"; @@ -45,6 +46,8 @@ final class ItemTypeNames{ public const BAKED_POTATO = "minecraft:baked_potato"; public const BALLOON = "minecraft:balloon"; public const BAMBOO_CHEST_RAFT = "minecraft:bamboo_chest_raft"; + public const BAMBOO_DOOR = "minecraft:bamboo_door"; + public const BAMBOO_HANGING_SIGN = "minecraft:bamboo_hanging_sign"; public const BAMBOO_RAFT = "minecraft:bamboo_raft"; public const BAMBOO_SIGN = "minecraft:bamboo_sign"; public const BANNER = "minecraft:banner"; @@ -59,6 +62,7 @@ final class ItemTypeNames{ public const BIRCH_BOAT = "minecraft:birch_boat"; public const BIRCH_CHEST_BOAT = "minecraft:birch_chest_boat"; public const BIRCH_DOOR = "minecraft:birch_door"; + public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; public const BIRCH_SIGN = "minecraft:birch_sign"; public const BLACK_DYE = "minecraft:black_dye"; public const BLADE_POTTERY_SHERD = "minecraft:blade_pottery_sherd"; @@ -100,6 +104,8 @@ final class ItemTypeNames{ public const CHARCOAL = "minecraft:charcoal"; public const CHERRY_BOAT = "minecraft:cherry_boat"; public const CHERRY_CHEST_BOAT = "minecraft:cherry_chest_boat"; + public const CHERRY_DOOR = "minecraft:cherry_door"; + public const CHERRY_HANGING_SIGN = "minecraft:cherry_hanging_sign"; public const CHERRY_SIGN = "minecraft:cherry_sign"; public const CHEST_BOAT = "minecraft:chest_boat"; public const CHEST_MINECART = "minecraft:chest_minecart"; @@ -132,6 +138,7 @@ final class ItemTypeNames{ public const CREEPER_BANNER_PATTERN = "minecraft:creeper_banner_pattern"; public const CREEPER_SPAWN_EGG = "minecraft:creeper_spawn_egg"; public const CRIMSON_DOOR = "minecraft:crimson_door"; + public const CRIMSON_HANGING_SIGN = "minecraft:crimson_hanging_sign"; public const CRIMSON_SIGN = "minecraft:crimson_sign"; public const CROSSBOW = "minecraft:crossbow"; public const CYAN_DYE = "minecraft:cyan_dye"; @@ -139,6 +146,7 @@ final class ItemTypeNames{ public const DARK_OAK_BOAT = "minecraft:dark_oak_boat"; public const DARK_OAK_CHEST_BOAT = "minecraft:dark_oak_chest_boat"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; + public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; public const DIAMOND = "minecraft:diamond"; public const DIAMOND_AXE = "minecraft:diamond_axe"; @@ -256,6 +264,7 @@ final class ItemTypeNames{ public const JUNGLE_BOAT = "minecraft:jungle_boat"; public const JUNGLE_CHEST_BOAT = "minecraft:jungle_chest_boat"; public const JUNGLE_DOOR = "minecraft:jungle_door"; + public const JUNGLE_HANGING_SIGN = "minecraft:jungle_hanging_sign"; public const JUNGLE_SIGN = "minecraft:jungle_sign"; public const KELP = "minecraft:kelp"; public const LAPIS_LAZULI = "minecraft:lapis_lazuli"; @@ -281,6 +290,7 @@ final class ItemTypeNames{ public const MANGROVE_BOAT = "minecraft:mangrove_boat"; public const MANGROVE_CHEST_BOAT = "minecraft:mangrove_chest_boat"; public const MANGROVE_DOOR = "minecraft:mangrove_door"; + public const MANGROVE_HANGING_SIGN = "minecraft:mangrove_hanging_sign"; public const MANGROVE_SIGN = "minecraft:mangrove_sign"; public const MEDICINE = "minecraft:medicine"; public const MELON_SEEDS = "minecraft:melon_seeds"; @@ -331,6 +341,7 @@ final class ItemTypeNames{ public const NPC_SPAWN_EGG = "minecraft:npc_spawn_egg"; public const OAK_BOAT = "minecraft:oak_boat"; public const OAK_CHEST_BOAT = "minecraft:oak_chest_boat"; + public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; public const OAK_SIGN = "minecraft:oak_sign"; public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg"; public const ORANGE_DYE = "minecraft:orange_dye"; @@ -420,6 +431,7 @@ final class ItemTypeNames{ public const SPRUCE_BOAT = "minecraft:spruce_boat"; public const SPRUCE_CHEST_BOAT = "minecraft:spruce_chest_boat"; public const SPRUCE_DOOR = "minecraft:spruce_door"; + public const SPRUCE_HANGING_SIGN = "minecraft:spruce_hanging_sign"; public const SPRUCE_SIGN = "minecraft:spruce_sign"; public const SPYGLASS = "minecraft:spyglass"; public const SQUID_SPAWN_EGG = "minecraft:squid_spawn_egg"; @@ -458,6 +470,7 @@ final class ItemTypeNames{ public const WARDEN_SPAWN_EGG = "minecraft:warden_spawn_egg"; public const WARPED_DOOR = "minecraft:warped_door"; public const WARPED_FUNGUS_ON_A_STICK = "minecraft:warped_fungus_on_a_stick"; + public const WARPED_HANGING_SIGN = "minecraft:warped_hanging_sign"; public const WARPED_SIGN = "minecraft:warped_sign"; public const WATER_BUCKET = "minecraft:water_bucket"; public const WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:wayfinder_armor_trim_smithing_template"; From 8f48f8a59626b42ba35dcf47f79130c416781a52 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 13 Jun 2023 18:18:08 +0100 Subject: [PATCH 1131/1858] Added missing cherry door item, closes #5817 --- src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index cf486d9db0..6f557ddb13 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -135,6 +135,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::CAKE, Blocks::CAKE()); $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON()); $this->map1to1Block(Ids::CHAIN, Blocks::CHAIN()); + $this->map1to1Block(Ids::CHERRY_DOOR, Blocks::CHERRY_DOOR()); $this->map1to1Block(Ids::COMPARATOR, Blocks::REDSTONE_COMPARATOR()); $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR()); $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR()); From bccda4fe44a68dcdd4999c103503e0ba60b2f5d2 Mon Sep 17 00:00:00 2001 From: ace Date: Mon, 19 Jun 2023 19:07:49 +0800 Subject: [PATCH 1132/1858] Implement Piglin Head (#5839) --- src/block/utils/MobHeadType.php | 4 +++- src/data/bedrock/MobHeadTypeIdMap.php | 1 + src/data/runtime/RuntimeEnumDeserializerTrait.php | 9 +++++---- src/data/runtime/RuntimeEnumSerializerTrait.php | 9 +++++---- src/item/StringToItemParser.php | 1 + tests/phpunit/block/block_factory_consistency_check.json | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/block/utils/MobHeadType.php b/src/block/utils/MobHeadType.php index 45d31e9bb0..391b668209 100644 --- a/src/block/utils/MobHeadType.php +++ b/src/block/utils/MobHeadType.php @@ -33,6 +33,7 @@ use pocketmine\utils\EnumTrait; * * @method static MobHeadType CREEPER() * @method static MobHeadType DRAGON() + * @method static MobHeadType PIGLIN() * @method static MobHeadType PLAYER() * @method static MobHeadType SKELETON() * @method static MobHeadType WITHER_SKELETON() @@ -50,7 +51,8 @@ final class MobHeadType{ new MobHeadType("zombie", "Zombie Head"), new MobHeadType("player", "Player Head"), new MobHeadType("creeper", "Creeper Head"), - new MobHeadType("dragon", "Dragon Head") + new MobHeadType("dragon", "Dragon Head"), + new MobHeadType("piglin", "Piglin Head") ); } diff --git a/src/data/bedrock/MobHeadTypeIdMap.php b/src/data/bedrock/MobHeadTypeIdMap.php index 9b9fe2c060..99213fa46c 100644 --- a/src/data/bedrock/MobHeadTypeIdMap.php +++ b/src/data/bedrock/MobHeadTypeIdMap.php @@ -48,6 +48,7 @@ final class MobHeadTypeIdMap{ $this->register(3, MobHeadType::PLAYER()); $this->register(4, MobHeadType::CREEPER()); $this->register(5, MobHeadType::DRAGON()); + $this->register(6, MobHeadType::PIGLIN()); } private function register(int $id, MobHeadType $type) : void{ diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 4ad50f06da..c4864a7e7b 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -130,10 +130,11 @@ trait RuntimeEnumDeserializerTrait{ $value = match($this->readInt(3)){ 0 => \pocketmine\block\utils\MobHeadType::CREEPER(), 1 => \pocketmine\block\utils\MobHeadType::DRAGON(), - 2 => \pocketmine\block\utils\MobHeadType::PLAYER(), - 3 => \pocketmine\block\utils\MobHeadType::SKELETON(), - 4 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON(), - 5 => \pocketmine\block\utils\MobHeadType::ZOMBIE(), + 2 => \pocketmine\block\utils\MobHeadType::PIGLIN(), + 3 => \pocketmine\block\utils\MobHeadType::PLAYER(), + 4 => \pocketmine\block\utils\MobHeadType::SKELETON(), + 5 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON(), + 6 => \pocketmine\block\utils\MobHeadType::ZOMBIE(), default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MobHeadType") }; } diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 805723ac51..fd65ffb42b 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -130,10 +130,11 @@ trait RuntimeEnumSerializerTrait{ $this->writeInt(3, match($value){ \pocketmine\block\utils\MobHeadType::CREEPER() => 0, \pocketmine\block\utils\MobHeadType::DRAGON() => 1, - \pocketmine\block\utils\MobHeadType::PLAYER() => 2, - \pocketmine\block\utils\MobHeadType::SKELETON() => 3, - \pocketmine\block\utils\MobHeadType::WITHER_SKELETON() => 4, - \pocketmine\block\utils\MobHeadType::ZOMBIE() => 5, + \pocketmine\block\utils\MobHeadType::PIGLIN() => 2, + \pocketmine\block\utils\MobHeadType::PLAYER() => 3, + \pocketmine\block\utils\MobHeadType::SKELETON() => 4, + \pocketmine\block\utils\MobHeadType::WITHER_SKELETON() => 5, + \pocketmine\block\utils\MobHeadType::ZOMBIE() => 6, default => throw new \pocketmine\utils\AssumptionFailedError("All MobHeadType cases should be covered") }); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 4bd761f591..431c051a30 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -843,6 +843,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("packed_mud", fn() => Blocks::PACKED_MUD()); $result->registerBlock("peony", fn() => Blocks::PEONY()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); + $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN())); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER())); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index fcad077cf6..46838b8530 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648936,2648937,2648938,2648939,2648940,2648941,2648942,2648943],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649156,2649157,2649158,2649159,2649160,2649161,2649164,2649165,2649166,2649167,2649184,2649185,2649188,2649189,2649190,2649191,2649200,2649201,2649204,2649205,2649206,2649207,2649208,2649209,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666672,2666673,2666674,2666675,2666676,2666677,2666678,2666679],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648936,2648937,2648938,2648939,2648940,2648941,2648942,2648943],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666672,2666673,2666674,2666675,2666676,2666677,2666678,2666679],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From eb9f804781a8b5d319691877c2fca3b55131a2fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Jun 2023 12:22:50 +0100 Subject: [PATCH 1133/1858] =?UTF-8?q?=C3=82BedrockWorldData:=20throw=20les?= =?UTF-8?q?s=20confusing=20errors=20on=20missing=20version=20tags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/world/format/io/data/BedrockWorldData.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 3a24e9a11c..317ebd6801 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -43,6 +43,7 @@ use pocketmine\world\WorldCreationOptions; use Symfony\Component\Filesystem\Path; use function array_map; use function file_put_contents; +use function sprintf; use function strlen; use function substr; use function time; @@ -154,12 +155,18 @@ class BedrockWorldData extends BaseNbtWorldData{ } $version = $worldData->getInt(self::TAG_STORAGE_VERSION, Limits::INT32_MAX); + if($version === Limits::INT32_MAX){ + throw new CorruptedWorldException(sprintf("Missing '%s' tag in level.dat", self::TAG_STORAGE_VERSION)); + } if($version > self::CURRENT_STORAGE_VERSION){ throw new UnsupportedWorldFormatException("LevelDB world format version $version is currently unsupported"); } //StorageVersion is rarely updated - instead, the game relies on the NetworkVersion tag, which is synced with //the network protocol version for that version. $protocolVersion = $worldData->getInt(self::TAG_NETWORK_VERSION, Limits::INT32_MAX); + if($protocolVersion === Limits::INT32_MAX){ + throw new CorruptedWorldException(sprintf("Missing '%s' tag in level.dat", self::TAG_NETWORK_VERSION)); + } if($protocolVersion > self::CURRENT_STORAGE_NETWORK_VERSION){ throw new UnsupportedWorldFormatException("LevelDB world protocol version $protocolVersion is currently unsupported"); } From be8cca1d55d3e50972e6a2dee86214dbe0ebf930 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 15:25:26 +0100 Subject: [PATCH 1134/1858] Bump docker/build-push-action from 4.1.0 to 4.1.1 (#5834) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 02342bbfd2..c6a5a8ed2a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.0 + uses: docker/build-push-action@v4.1.1 with: push: true context: ./pocketmine-mp From 774f92435a5b2fc78de62bc7e676dafd1ed90ab3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 20 Jun 2023 12:34:16 +0100 Subject: [PATCH 1135/1858] StringToItemParser: added underwater_tnt alias --- src/item/StringToItemParser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 431c051a30..4771ff7868 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1066,6 +1066,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("tuff", fn() => Blocks::TUFF()); $result->registerBlock("twisting_vines", fn() => Blocks::TWISTING_VINES()); + $result->registerBlock("underwater_tnt", fn() => Blocks::TNT()->setWorksUnderwater(true)); $result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH()); $result->registerBlock("undyed_shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("unlit_redstone_torch", fn() => Blocks::REDSTONE_TORCH()); From 64e09525f32a0968faee1416dce95ff26e553d3a Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Tue, 20 Jun 2023 13:38:45 +0200 Subject: [PATCH 1136/1858] Added timings for AsyncTask completion handlers, progress updates and error handlers (#5798) closes #5749 --- src/scheduler/AsyncPool.php | 19 +++++++++--- src/timings/Timings.php | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 6125c62cec..4cbe0889e9 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -27,6 +27,7 @@ use pmmp\thread\Thread as NativeThread; use pocketmine\snooze\SleeperHandler; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\ThreadSafeClassLoader; +use pocketmine\timings\Timings; use pocketmine\utils\Utils; use function array_keys; use function array_map; @@ -231,7 +232,9 @@ class AsyncPool{ if($task->isCrashed()){ $this->logger->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed"); - $task->onError(); + Timings::getAsyncTaskErrorTimings($task)->time(function() use ($task) : void{ + $task->onError(); + }); }elseif(!$task->hasCancelledRun()){ /* * It's possible for a task to submit a progress update and then finish before the progress @@ -242,11 +245,13 @@ class AsyncPool{ * lost. Thus, it's necessary to do one last check here to make sure all progress updates have * been consumed before completing. */ - $task->checkProgressUpdates(); - $task->onCompletion(); + $this->checkTaskProgressUpdates($task); + Timings::getAsyncTaskCompletionTimings($task)->time(function() use ($task) : void{ + $task->onCompletion(); + }); } }else{ - $task->checkProgressUpdates(); + $this->checkTaskProgressUpdates($task); $more = true; break; //current task is still running, skip to next worker } @@ -294,4 +299,10 @@ class AsyncPool{ } $this->workers = []; } + + private function checkTaskProgressUpdates(AsyncTask $task) : void{ + Timings::getAsyncTaskProgressUpdateTimings($task)->time(function() use ($task) : void{ + $task->checkProgressUpdates(); + }); + } } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index aa05ffb2e1..0d8a256dea 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -29,6 +29,7 @@ use pocketmine\event\Event; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\player\Player; +use pocketmine\scheduler\AsyncTask; use pocketmine\scheduler\TaskHandler; use function get_class; use function str_starts_with; @@ -115,6 +116,17 @@ abstract class Timings{ /** @var TimingsHandler[][] */ private static array $eventHandlers = []; + private static TimingsHandler $asyncTaskProgressUpdateParent; + private static TimingsHandler $asyncTaskCompletionParent; + private static TimingsHandler $asyncTaskErrorParent; + + /** @var TimingsHandler[] */ + private static array $asyncTaskProgressUpdate = []; + /** @var TimingsHandler[] */ + private static array $asyncTaskCompletion = []; + /** @var TimingsHandler[] */ + private static array $asyncTaskError = []; + public static function init() : void{ if(self::$initialized){ return; @@ -168,7 +180,11 @@ abstract class Timings{ self::$itemEntityBaseTick = new TimingsHandler("Entity Base Tick - ItemEntity", group: self::GROUP_BREAKDOWN); self::$schedulerSync = new TimingsHandler("Scheduler - Sync Tasks", group: self::GROUP_BREAKDOWN); + self::$schedulerAsync = new TimingsHandler("Scheduler - Async Tasks", group: self::GROUP_BREAKDOWN); + self::$asyncTaskProgressUpdateParent = new TimingsHandler("Async Tasks - Progress Updates", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); + self::$asyncTaskCompletionParent = new TimingsHandler("Async Tasks - Completion Handlers", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); + self::$asyncTaskErrorParent = new TimingsHandler("Async Tasks - Error Handlers", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); self::$playerCommand = new TimingsHandler("Player Command", group: self::GROUP_BREAKDOWN); self::$craftingDataCacheRebuild = new TimingsHandler("Build CraftingDataPacket Cache", group: self::GROUP_BREAKDOWN); @@ -299,4 +315,46 @@ abstract class Timings{ return self::$eventHandlers[$event][$handlerName]; } + + public static function getAsyncTaskProgressUpdateTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + $taskClass = $task::class; + if(!isset(self::$asyncTaskProgressUpdate[$taskClass])){ + self::init(); + self::$asyncTaskProgressUpdate[$taskClass] = new TimingsHandler( + "AsyncTask - " . self::shortenCoreClassName($taskClass, "pocketmine\\") . " - Progress Updates", + self::$asyncTaskProgressUpdateParent, + $group + ); + } + + return self::$asyncTaskProgressUpdate[$taskClass]; + } + + public static function getAsyncTaskCompletionTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + $taskClass = $task::class; + if(!isset(self::$asyncTaskCompletion[$taskClass])){ + self::init(); + self::$asyncTaskCompletion[$taskClass] = new TimingsHandler( + "AsyncTask - " . self::shortenCoreClassName($taskClass, "pocketmine\\") . " - Completion Handler", + self::$asyncTaskCompletionParent, + $group + ); + } + + return self::$asyncTaskCompletion[$taskClass]; + } + + public static function getAsyncTaskErrorTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + $taskClass = $task::class; + if(!isset(self::$asyncTaskError[$taskClass])){ + self::init(); + self::$asyncTaskError[$taskClass] = new TimingsHandler( + "AsyncTask - " . self::shortenCoreClassName($taskClass, "pocketmine\\") . " - Error Handler", + self::$asyncTaskErrorParent, + $group + ); + } + + return self::$asyncTaskError[$taskClass]; + } } From ad3f85470103557bedfa4e5b6c0c9d783c3e34dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 20 Jun 2023 12:59:16 +0100 Subject: [PATCH 1137/1858] Register aliases for new cherry wood blocks --- src/item/StringToItemParser.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 4771ff7868..46b37e3aec 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -208,6 +208,19 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cauldron", fn() => Blocks::CAULDRON()); $result->registerBlock("cave_vines", fn() => Blocks::CAVE_VINES()); $result->registerBlock("chain", fn() => Blocks::CHAIN()); + $result->registerBlock("cherry_button", fn() => Blocks::CHERRY_BUTTON()); + $result->registerBlock("cherry_door", fn() => Blocks::CHERRY_DOOR()); + $result->registerBlock("cherry_fence", fn() => Blocks::CHERRY_FENCE()); + $result->registerBlock("cherry_fence_gate", fn() => Blocks::CHERRY_FENCE_GATE()); + $result->registerBlock("cherry_leaves", fn() => Blocks::CHERRY_LEAVES()); + $result->registerBlock("cherry_log", fn() => Blocks::CHERRY_LOG()); + $result->registerBlock("cherry_planks", fn() => Blocks::CHERRY_PLANKS()); + $result->registerBlock("cherry_pressure_plate", fn() => Blocks::CHERRY_PRESSURE_PLATE()); + $result->registerBlock("cherry_sign", fn() => Blocks::CHERRY_SIGN()); + $result->registerBlock("cherry_slab", fn() => Blocks::CHERRY_SLAB()); + $result->registerBlock("cherry_stairs", fn() => Blocks::CHERRY_STAIRS()); + $result->registerBlock("cherry_trapdoor", fn() => Blocks::CHERRY_TRAPDOOR()); + $result->registerBlock("cherry_wood", fn() => Blocks::CHERRY_WOOD()); $result->registerBlock("chemical_heat", fn() => Blocks::CHEMICAL_HEAT()); $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); From 391732f00c589e9df243de97e1719dda1ae3fdc6 Mon Sep 17 00:00:00 2001 From: Artem Vasyagin <58974140+Lunarelly@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:29:48 +0300 Subject: [PATCH 1138/1858] Fix `Player->setGamemode()` doc comment (#5848) this has been outdated likely since the 1.3 alpha days. --- src/player/Player.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/player/Player.php b/src/player/Player.php index 3083538be6..11dabf7db6 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1129,7 +1129,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } /** - * Sets the gamemode, and if needed, kicks the Player. + * Sets the provided gamemode. */ public function setGamemode(GameMode $gm) : bool{ if($this->gamemode->equals($gm)){ From 9d0d60afd1312e4bf83b173d3964165590b41723 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 21 Jun 2023 15:36:48 +0100 Subject: [PATCH 1139/1858] BlockPlaceEvent: ensure that getPosition() is always correct since BlockTransaction was designed to be World-agnostic, it can't position() any blocks, since Position requires a World. This workaround is the best we can do for now; however, it would probably be wise to deprecate getTransaction() in favour of a dedicated getBlocks() method which takes care of this, as BlockPlaceEvent is currently quite obnoxious to use. --- src/event/block/BlockPlaceEvent.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/event/block/BlockPlaceEvent.php b/src/event/block/BlockPlaceEvent.php index b92569fc16..3572cb5e09 100644 --- a/src/event/block/BlockPlaceEvent.php +++ b/src/event/block/BlockPlaceEvent.php @@ -43,7 +43,12 @@ class BlockPlaceEvent extends Event implements Cancellable{ protected BlockTransaction $transaction, protected Block $blockAgainst, protected Item $item - ){} + ){ + $world = $this->blockAgainst->getPosition()->getWorld(); + foreach($this->transaction->getBlocks() as [$x, $y, $z, $block]){ + $block->position($world, $x, $y, $z); + } + } /** * Returns the player who is placing the block. From 6f82942c640c851ab6b98586adee1f311cbc6a99 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 21 Jun 2023 16:57:39 +0100 Subject: [PATCH 1140/1858] Block: document onInteract() clickVector --- src/block/Block.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/block/Block.php b/src/block/Block.php index f2268aed93..b4203e6b6b 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -467,7 +467,8 @@ class Block{ /** * Do actions when interacted by Item. Returns if it has done anything * - * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) + * @param Vector3 $clickVector Exact position where the click occurred, relative to the block's integer position + * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ return false; From 8dedbb747108c45b7534b8ac6f05e8464ee8eb22 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 21 Jun 2023 16:59:14 +0100 Subject: [PATCH 1141/1858] World: clamp clickVector components from 0-1 this ensures that #5827 won't randomly start crashing if clients give bad values. --- src/world/World.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/world/World.php b/src/world/World.php index b2b6dfac2a..deb03ef6dd 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2032,6 +2032,12 @@ class World implements ChunkManager{ if($clickVector === null){ $clickVector = new Vector3(0.0, 0.0, 0.0); + }else{ + $clickVector = new Vector3( + min(1.0, max(0.0, $clickVector->x)), + min(1.0, max(0.0, $clickVector->y)), + min(1.0, max(0.0, $clickVector->z)) + ); } if(!$this->isInWorld($blockReplace->getPosition()->x, $blockReplace->getPosition()->y, $blockReplace->getPosition()->z)){ From 0240d35c05875d41c425c0cfef32c1663d7fc534 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 22 Jun 2023 13:29:36 +0100 Subject: [PATCH 1142/1858] AsyncTask and AsyncPool no longer tolerate uncaught errors in tasks Since task execution depends on tasks executing sequentially on a particular worker in some cases (e.g. PopulationTask must be preceded by GeneratorRegisterTask), it doesn't make sense to continue task execution if an error occurs. Moreover, a task crashing may render the whole server unstable, as it leaves the server in an undefined state. This is the same kind of problem we fixed with scheduled tasks in PM3. In versions past, pthreads was unreliable enough that random tasks would crash without an obvious reason, forcing us to accommodate this. I still don't know the origin or frequency of said issues, but I think it's time to rip the band-aid off and solve these problems for real. --- composer.json | 2 +- src/PocketMine.php | 4 ++-- src/network/mcpe/ChunkRequestTask.php | 18 +------------- src/network/mcpe/cache/ChunkCache.php | 9 +------ src/scheduler/AsyncPool.php | 34 +++++++++++++++++++++++---- src/scheduler/AsyncTask.php | 19 ++++++--------- src/scheduler/AsyncWorker.php | 5 ++++ 7 files changed, 46 insertions(+), 45 deletions(-) diff --git a/composer.json b/composer.json index 09501a7bad..1bfe3f0f1c 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.1", + "ext-pmmpthread": "^6.0.4", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/src/PocketMine.php b/src/PocketMine.php index d5d2f73280..27445a3cf9 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -120,8 +120,8 @@ namespace pocketmine { } if(($pmmpthread_version = phpversion("pmmpthread")) !== false){ - if(version_compare($pmmpthread_version, "6.0.1") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ - $messages[] = "pmmpthread ^6.0.1 is required, while you have $pmmpthread_version."; + if(version_compare($pmmpthread_version, "6.0.4") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ + $messages[] = "pmmpthread ^6.0.4 is required, while you have $pmmpthread_version."; } } diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 0f8f60fe67..87a4553c3e 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -39,7 +39,6 @@ use pocketmine\world\format\io\FastChunkSerializer; class ChunkRequestTask extends AsyncTask{ private const TLS_KEY_PROMISE = "promise"; - private const TLS_KEY_ERROR_HOOK = "errorHook"; protected string $chunk; protected int $chunkX; @@ -48,10 +47,7 @@ class ChunkRequestTask extends AsyncTask{ protected NonThreadSafeValue $compressor; private string $tiles; - /** - * @phpstan-param (\Closure() : void)|null $onError - */ - public function __construct(int $chunkX, int $chunkZ, Chunk $chunk, CompressBatchPromise $promise, Compressor $compressor, ?\Closure $onError = null){ + public function __construct(int $chunkX, int $chunkZ, Chunk $chunk, CompressBatchPromise $promise, Compressor $compressor){ $this->compressor = new NonThreadSafeValue($compressor); $this->chunk = FastChunkSerializer::serializeTerrain($chunk); @@ -60,7 +56,6 @@ class ChunkRequestTask extends AsyncTask{ $this->tiles = ChunkSerializer::serializeTiles($chunk); $this->storeLocal(self::TLS_KEY_PROMISE, $promise); - $this->storeLocal(self::TLS_KEY_ERROR_HOOK, $onError); } public function onRun() : void{ @@ -75,17 +70,6 @@ class ChunkRequestTask extends AsyncTask{ $this->setResult($this->compressor->deserialize()->compress($stream->getBuffer())); } - public function onError() : void{ - /** - * @var \Closure|null $hook - * @phpstan-var (\Closure() : void)|null $hook - */ - $hook = $this->fetchLocal(self::TLS_KEY_ERROR_HOOK); - if($hook !== null){ - $hook(); - } - } - public function onCompletion() : void{ /** @var CompressBatchPromise $promise */ $promise = $this->fetchLocal(self::TLS_KEY_PROMISE); diff --git a/src/network/mcpe/cache/ChunkCache.php b/src/network/mcpe/cache/ChunkCache.php index 15b6969456..9c12a3bb3f 100644 --- a/src/network/mcpe/cache/ChunkCache.php +++ b/src/network/mcpe/cache/ChunkCache.php @@ -118,14 +118,7 @@ class ChunkCache implements ChunkListener{ $chunkZ, $chunk, $this->caches[$chunkHash], - $this->compressor, - function() use ($chunkHash, $chunkX, $chunkZ) : void{ - $this->world->getLogger()->error("Failed preparing chunk $chunkX $chunkZ, retrying"); - - if(isset($this->caches[$chunkHash])){ - $this->restartPendingRequest($chunkX, $chunkZ); - } - } + $this->compressor ) ); diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 4cbe0889e9..a326bc87f9 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -28,11 +28,13 @@ use pocketmine\snooze\SleeperHandler; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\timings\Timings; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use function array_keys; use function array_map; use function assert; use function count; +use function get_class; use function spl_object_id; use function time; use const PHP_INT_MAX; @@ -130,6 +132,8 @@ class AsyncPool{ foreach($this->workerStartHooks as $hook){ $hook($workerId); } + }else{ + $this->checkCrashedWorker($workerId, null); } return $this->workers[$workerId]; @@ -198,6 +202,28 @@ class AsyncPool{ return $worker; } + private function checkCrashedWorker(int $workerId, ?AsyncTask $crashedTask) : void{ + $entry = $this->workers[$workerId]; + if($entry->worker->isTerminated()){ + if($crashedTask === null){ + foreach($entry->tasks as $task){ + if($task->isTerminated()){ + $crashedTask = $task; + break; + }elseif(!$task->isFinished()){ + break; + } + } + } + if($crashedTask !== null){ + $message = "Worker $workerId crashed while running task " . get_class($crashedTask) . "#" . spl_object_id($crashedTask); + }else{ + $message = "Worker $workerId crashed for unknown reason"; + } + throw new \RuntimeException($message); + } + } + /** * Collects finished and/or crashed tasks from the workers, firing their on-completion hooks where appropriate. * @@ -230,11 +256,9 @@ class AsyncPool{ if($task->isFinished()){ //make sure the task actually executed before trying to collect $queue->dequeue(); - if($task->isCrashed()){ - $this->logger->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed"); - Timings::getAsyncTaskErrorTimings($task)->time(function() use ($task) : void{ - $task->onError(); - }); + if($task->isTerminated()){ + $this->checkCrashedWorker($worker, $task); + throw new AssumptionFailedError("checkCrashedWorker() should have thrown an exception, making this unreachable"); }elseif(!$task->hasCancelledRun()){ /* * It's possible for a task to submit a progress update and then finish before the progress diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 6d43ac5c80..754eaf65dc 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -75,20 +75,13 @@ abstract class AsyncTask extends Runnable{ private bool $cancelRun = false; private bool $submitted = false; - private bool $crashed = false; private bool $finished = false; public function run() : void{ $this->result = null; if(!$this->cancelRun){ - try{ - $this->onRun(); - }catch(\Throwable $e){ - $this->crashed = true; - - \GlobalLogger::get()->logException($e); - } + $this->onRun(); } $this->finished = true; @@ -97,8 +90,11 @@ abstract class AsyncTask extends Runnable{ $worker->getNotifier()->wakeupSleeper(); } + /** + * @deprecated + */ public function isCrashed() : bool{ - return $this->crashed || $this->isTerminated(); + return $this->isTerminated(); } /** @@ -106,7 +102,7 @@ abstract class AsyncTask extends Runnable{ * because it is not true prior to task execution. */ public function isFinished() : bool{ - return $this->finished || $this->isCrashed(); + return $this->finished || $this->isTerminated(); } public function hasResult() : bool{ @@ -195,8 +191,7 @@ abstract class AsyncTask extends Runnable{ } /** - * Called from the main thread when the async task experiences an error during onRun(). Use this for things like - * promise rejection. + * @deprecated No longer used */ public function onError() : void{ diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 517542495d..19a19b1022 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -31,6 +31,7 @@ use pocketmine\thread\Worker; use pocketmine\utils\AssumptionFailedError; use function gc_enable; use function ini_set; +use function set_exception_handler; class AsyncWorker extends Worker{ /** @var mixed[] */ @@ -67,6 +68,10 @@ class AsyncWorker extends Worker{ } $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); + + set_exception_handler(function(\Throwable $e){ + $this->logger->logException($e); + }); } public function getLogger() : ThreadSafeLogger{ From 36f52f1ade4d36b959c746665bb2443158ccafdb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 22 Jun 2023 13:58:48 +0100 Subject: [PATCH 1143/1858] AsyncTask: remove ArrayObject hack this is no longer a concern with pmmpthread + PHP 8.1 and up. The behaviour that caused statics to be inherited was caused by bugs in PHP 8.0 and below, which have now been fixed. --- src/scheduler/AsyncTask.php | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 754eaf65dc..9d69bda5b7 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -61,12 +61,12 @@ use function spl_object_id; */ abstract class AsyncTask extends Runnable{ /** - * @var \ArrayObject|mixed[]|null object hash => mixed data - * @phpstan-var \ArrayObject>|null + * @var mixed[][] object hash => mixed data + * @phpstan-var array> * - * Used to store objects which are only needed on one thread and should not be serialized. + * Used to store thread-local data to be used by onCompletion(). */ - private static ?\ArrayObject $threadLocalStorage = null; + private static array $threadLocalStorage = []; /** @phpstan-var ThreadSafeArray|null */ private ?ThreadSafeArray $progressUpdates = null; @@ -212,15 +212,6 @@ abstract class AsyncTask extends Runnable{ * from. */ protected function storeLocal(string $key, mixed $complexData) : void{ - if(self::$threadLocalStorage === null){ - /* - * It's necessary to use an object (not array) here because pthreads is stupid. Non-default array statics - * will be inherited when task classes are copied to the worker thread, which would cause unwanted - * inheritance of primitive thread-locals, which we really don't want for various reasons. - * It won't try to inherit objects though, so this is the easiest solution. - */ - self::$threadLocalStorage = new \ArrayObject(); - } self::$threadLocalStorage[spl_object_id($this)][$key] = $complexData; } @@ -236,7 +227,7 @@ abstract class AsyncTask extends Runnable{ */ protected function fetchLocal(string $key){ $id = spl_object_id($this); - if(self::$threadLocalStorage === null || !isset(self::$threadLocalStorage[$id][$key])){ + if(!isset(self::$threadLocalStorage[$id][$key])){ throw new \InvalidArgumentException("No matching thread-local data found on this thread"); } @@ -245,12 +236,7 @@ abstract class AsyncTask extends Runnable{ final public function __destruct(){ $this->reallyDestruct(); - if(self::$threadLocalStorage !== null && isset(self::$threadLocalStorage[$h = spl_object_id($this)])){ - unset(self::$threadLocalStorage[$h]); - if(self::$threadLocalStorage->count() === 0){ - self::$threadLocalStorage = null; - } - } + unset(self::$threadLocalStorage[spl_object_id($this)]); } /** From 881451c40cf3ea0acc6b76a4f1386c5da7d27b52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:00:59 +0100 Subject: [PATCH 1144/1858] Bump build/php from `8cb2a2b` to `2a21c57` (#5856) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `8cb2a2b` to `2a21c57`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/8cb2a2b2181fd42192665985696ea157aa4f731e...2a21c579007a8fd7244f9faad498cd1c8c33004c) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 8cb2a2b218..2a21c57900 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 8cb2a2b2181fd42192665985696ea157aa4f731e +Subproject commit 2a21c579007a8fd7244f9faad498cd1c8c33004c From c06763c59bbdc3249a46ae10dddc544187f4054d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 23 Jun 2023 12:55:47 +0100 Subject: [PATCH 1145/1858] Fixed crash in CakeWithCandle when block-picking --- src/block/CakeWithCandle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/CakeWithCandle.php b/src/block/CakeWithCandle.php index 187442cd98..4479faee10 100644 --- a/src/block/CakeWithCandle.php +++ b/src/block/CakeWithCandle.php @@ -64,7 +64,7 @@ class CakeWithCandle extends BaseCake{ } public function getPickedItem(bool $addUserData = false) : Item{ - return VanillaBlocks::CAKE()->getPickedItem($addUserData); + return VanillaBlocks::CAKE()->asItem(); } public function getResidue() : Block{ From b8788c55c58effd04f5d8774ae04dd1656813abb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Jun 2023 16:14:28 +0100 Subject: [PATCH 1146/1858] tools/generate-blockstate-upgrade-schema: improve property remapping checks this is now able to determine which properties were renamed and/or changed when multiple renames occurred in a single version. This also fixes unrelated properties being considered mapped to each other when there was only one property in the old and new state (e.g. mapped_type and deprecated for hay_bale in 1.10). Now, these are properly considered as unrelated. --- tools/generate-blockstate-upgrade-schema.php | 281 ++++++++++++------- 1 file changed, 184 insertions(+), 97 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 847486a668..691f608fad 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -28,18 +28,26 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; +use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\tag\Tag; +use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; +use function array_filter; use function array_key_first; +use function array_keys; +use function array_map; use function array_merge; +use function array_shift; use function array_values; use function assert; use function count; use function dirname; use function file_put_contents; use function fwrite; +use function implode; use function json_encode; use function ksort; use function usort; @@ -56,9 +64,22 @@ class BlockStateMapping{ ){} } +/** + * @param Tag[] $properties + * @phpstan-param array $properties + */ +function encodeOrderedProperties(array $properties) : string{ + ksort($properties, SORT_STRING); + return implode("", array_map(fn(Tag $tag) => encodeProperty($tag), array_values($properties))); +} + +function encodeProperty(Tag $tag) : string{ + return (new LittleEndianNbtSerializer())->write(new TreeRoot($tag)); +} + /** * @return BlockStateMapping[][] - * @phpstan-return array> + * @phpstan-return array> */ function loadUpgradeTable(string $file, bool $reverse) : array{ $contents = Filesystem::fileGetContents($file); @@ -72,7 +93,7 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ $old = BlockStateData::fromNbt($reverse ? $newTag : $oldTag); $new = BlockStateData::fromNbt($reverse ? $oldTag : $newTag); - $result[$old->getName()][] = new BlockStateMapping( + $result[$old->getName()][encodeOrderedProperties($old->getStates())] = new BlockStateMapping( $old, $new ); @@ -82,111 +103,176 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ } /** - * @param true[] $removedPropertiesCache - * @param Tag[][] $remappedPropertyValuesCache - * @phpstan-param array $removedPropertiesCache - * @phpstan-param array> $remappedPropertyValuesCache + * @param BlockStateData[] $states + * @phpstan-param array $states + * + * @return Tag[][] + * @phpstan-return array> */ -function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgradeSchema $result, array &$removedPropertiesCache, array &$remappedPropertyValuesCache) : void{ +function buildStateGroupSchema(array $states) : ?array{ + $first = $states[array_key_first($states)]; - //new and old IDs are the same; compare states - $oldName = $old->getName(); + $properties = []; + foreach(Utils::stringifyKeys($first->getStates()) as $propertyName => $propertyValue){ + $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; + } + foreach($states as $state){ + if(count($state->getStates()) !== count($properties)){ + return null; + } + foreach(Utils::stringifyKeys($state->getStates()) as $propertyName => $propertyValue){ + if(!isset($properties[$propertyName])){ + return null; + } + $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; + } + } - $oldStates = $old->getStates(); - $newStates = $new->getStates(); + return $properties; +} - $propertyRemoved = []; - $propertyAdded = []; - foreach(Utils::stringifyKeys($oldStates) as $propertyName => $oldProperty){ - $newProperty = $new->getState($propertyName); - if($newProperty === null){ - $propertyRemoved[$propertyName] = $oldProperty; - }elseif(!$newProperty->equals($oldProperty)){ - if(!isset($remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()])){ - $result->remappedPropertyValues[$oldName][$propertyName][] = new BlockStateUpgradeSchemaValueRemap( - $oldProperty, - $newProperty - ); - $remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()] = $newProperty; +/** + * @param BlockStateMapping[] $upgradeTable + * @phpstan-param array $upgradeTable + */ +function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgradeSchema $result) : bool{ + $newProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->new, $upgradeTable)); + if($newProperties === null){ + \GlobalLogger::get()->warning("New states for $oldName don't all have the same set of properties - processing as remaps instead"); + return false; + } + $oldProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->old, $upgradeTable)); + if($oldProperties === null){ + //TODO: not sure if this is actually required - we may be able to apply some transformations even if the states are not consistent + //however, this should never normally occur anyway + \GlobalLogger::get()->warning("Old states for $oldName don't all have the same set of properties - processing as remaps instead"); + return false; + } + + $remappedPropertyValues = []; + $addedProperties = []; + $removedProperties = []; + $renamedProperties = []; + + foreach(Utils::stringifyKeys($newProperties) as $newPropertyName => $newPropertyValues){ + if(count($newPropertyValues) === 1){ + $newPropertyValue = $newPropertyValues[array_key_first($newPropertyValues)]; + if(isset($oldProperties[$newPropertyName])){ + //all the old values for this property were mapped to the same new value + //it would be more space-efficient to represent this as a remove+add, but we can't guarantee that the + //removal of the old value will be done before the addition of the new value + foreach($oldProperties[$newPropertyName] as $oldPropertyValue){ + $remappedPropertyValues[$newPropertyName][encodeProperty($oldPropertyValue)] = $newPropertyValue; + } + }else{ + //this property has no relation to any property value in any of the old states - it's a new property + $addedProperties[$newPropertyName] = $newPropertyValue; } } } - foreach(Utils::stringifyKeys($newStates) as $propertyName => $value){ - if($old->getState($propertyName) === null){ - $propertyAdded[$propertyName] = $value; - } - } - - if(count($propertyAdded) === 0 && count($propertyRemoved) === 0){ - return; - } - if(count($propertyAdded) === 1 && count($propertyRemoved) === 1){ - $propertyOldName = array_key_first($propertyRemoved); - $propertyNewName = array_key_first($propertyAdded); - - $propertyOldValue = $propertyRemoved[$propertyOldName]; - $propertyNewValue = $propertyAdded[$propertyNewName]; - - $existingPropertyValueMap = $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] ?? null; - if($propertyOldName !== $propertyNewName){ - if(!$propertyOldValue->equals($propertyNewValue) && $existingPropertyValueMap === null){ - \GlobalLogger::get()->warning("warning: guessing that $oldName has $propertyOldName renamed to $propertyNewName with a value map of $propertyOldValue mapped to $propertyNewValue");; - } - //this is a guess; it might not be reliable if the value changed as well - //this will probably never be an issue, but it might rear its ugly head in the future - $result->renamedProperties[$oldName][$propertyOldName] = $propertyNewName; - } - if(!$propertyOldValue->equals($propertyNewValue)){ - $mapped = true; - if($existingPropertyValueMap !== null && !$existingPropertyValueMap->equals($propertyNewValue)){ - if($existingPropertyValueMap->equals($propertyOldValue)){ - \GlobalLogger::get()->warning("warning: guessing that the value $propertyOldValue of $propertyNewValue did not change");; - $mapped = false; - }else{ - \GlobalLogger::get()->warning("warning: mismatch of new value for $propertyNewName for $oldName: $propertyOldValue seen mapped to $propertyNewValue and $existingPropertyValueMap");; + foreach(Utils::stringifyKeys($oldProperties) as $oldPropertyName => $oldPropertyValues){ + $mappingsContainingOldValue = []; + foreach($upgradeTable as $mapping){ + $mappingOldValue = $mapping->old->getState($oldPropertyName) ?? throw new AssumptionFailedError("This should never happen"); + foreach($oldPropertyValues as $oldPropertyValue){ + if($mappingOldValue->equals($oldPropertyValue)){ + $mappingsContainingOldValue[encodeProperty($oldPropertyValue)][] = $mapping; + break; } } - if($mapped && !isset($remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()])){ - //value remap - $result->remappedPropertyValues[$oldName][$propertyOldName][] = new BlockStateUpgradeSchemaValueRemap( - $propertyRemoved[$propertyOldName], - $propertyAdded[$propertyNewName] - ); - $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; - } - }elseif($existingPropertyValueMap !== null){ - \GlobalLogger::get()->warning("warning: multiple values found for value $propertyOldValue of $propertyNewName on block $oldName, guessing it did not change");; - $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; } - }else{ - if(count($propertyAdded) !== 0 && count($propertyRemoved) === 0){ - foreach(Utils::stringifyKeys($propertyAdded) as $propertyAddedName => $propertyAddedValue){ - $existingDefault = $result->addedProperties[$oldName][$propertyAddedName] ?? null; - if($existingDefault !== null && !$existingDefault->equals($propertyAddedValue)){ - throw new \UnexpectedValueException("Ambiguous default value for added property $propertyAddedName on block $oldName"); - } - $result->addedProperties[$oldName][$propertyAddedName] = $propertyAddedValue; + $candidateNewPropertyNames = []; + //foreach mappings by unique value, compute the diff across all the states in the list + foreach(Utils::stringifyKeys($mappingsContainingOldValue) as $rawOldValue => $mappingList){ + $first = array_shift($mappingList); + foreach(Utils::stringifyKeys($first->new->getStates()) as $newPropertyName => $newPropertyValue){ + if(isset($addedProperties[$newPropertyName])){ + //this property was already determined to be unrelated to any old property + continue; + } + foreach($mappingList as $pair){ + if(!($pair->new->getState($newPropertyName)?->equals($newPropertyValue) ?? false)){ + //if the new property is different with an unchanged old value, + //the property may be influenced by multiple old properties, or be unrelated entirely + continue 2; + } + } + $candidateNewPropertyNames[$newPropertyName][$rawOldValue] = $newPropertyValue; } - }elseif(count($propertyRemoved) !== 0 && count($propertyAdded) === 0){ - foreach(Utils::stringifyKeys($propertyRemoved) as $propertyRemovedName => $propertyRemovedValue){ - if(!isset($removedPropertiesCache[$propertyRemovedName])){ - //to avoid having useless keys in the output - $result->removedProperties[$oldName][] = $propertyRemovedName; - $removedPropertiesCache[$propertyRemovedName] = $propertyRemovedName; + } + + if(count($candidateNewPropertyNames) === 0){ + $removedProperties[$oldPropertyName] = $oldPropertyName; + }elseif(count($candidateNewPropertyNames) === 1){ + $newPropertyName = array_key_first($candidateNewPropertyNames); + $newPropertyValues = $candidateNewPropertyNames[$newPropertyName]; + + if($oldPropertyName !== $newPropertyName){ + $renamedProperties[$oldPropertyName] = $newPropertyName; + } + + foreach(Utils::stringifyKeys($newPropertyValues) as $rawOldValue => $newPropertyValue){ + if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ + $remappedPropertyValues[$oldPropertyName][$rawOldValue] = $newPropertyValue; } } }else{ - $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( - $oldStates, - $new->getName(), - $newStates, - [] - ); - \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; + $split = true; + if(isset($candidateNewPropertyNames[$oldPropertyName])){ + //In 1.10, direction wasn't changed at all, but not all state permutations were present in the palette, + //making it appear that door_hinge_bit was correlated with direction. + //If a new property is present with the same name and values as an old property, we can assume that + //the property was unchanged, and that any extra matches properties are probably unrelated. + $changedValues = false; + foreach(Utils::stringifyKeys($candidateNewPropertyNames[$oldPropertyName]) as $rawOldValue => $newPropertyValue){ + if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ + //if any of the new values are different, we may be dealing with a property being split into + //multiple new properties - hand this off to the remap handler + $changedValues = true; + break; + } + } + if(!$changedValues){ + $split = false; + } + } + if($split){ + \GlobalLogger::get()->warning( + "Multiple new properties (" . (implode(", ", array_keys($candidateNewPropertyNames))) . ") are correlated with $oldName property $oldPropertyName, processing as remaps instead" + ); + return false; + }else{ + //is it safe to ignore the rest? + } } } + + //finally, write the results to the schema + + if(count($remappedPropertyValues) !== 0){ + foreach(Utils::stringifyKeys($remappedPropertyValues) as $oldPropertyName => $propertyValues){ + foreach(Utils::stringifyKeys($propertyValues) as $rawOldValue => $newPropertyValue){ + $oldPropertyValue = $oldProperties[$oldPropertyName][$rawOldValue]; + $result->remappedPropertyValues[$oldName][$oldPropertyName][] = new BlockStateUpgradeSchemaValueRemap( + $oldPropertyValue, + $newPropertyValue + ); + } + } + } + if(count($addedProperties) !== 0){ + $result->addedProperties[$oldName] = $addedProperties; + } + if(count($removedProperties) !== 0){ + $result->removedProperties[$oldName] = array_values($removedProperties); + } + if(count($renamedProperties) !== 0){ + $result->renamedProperties[$oldName] = $renamedProperties; + } + + return true; } /** @@ -196,8 +282,11 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad * * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps * @param BlockStateMapping[] $upgradeTable + * @phpstan-param list $stateRemaps + * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] + * @phpstan-return list */ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ $unchangedStatesByNewName = []; @@ -311,7 +400,7 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array /** * @param BlockStateMapping[][] $upgradeTable - * @phpstan-param array> $upgradeTable + * @phpstan-param array> $upgradeTable */ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgradeSchema{ $foundVersion = -1; @@ -343,8 +432,6 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad foreach(Utils::stringifyKeys($upgradeTable) as $oldName => $blockStateMappings){ $newNameFound = []; - $removedPropertiesCache = []; - $remappedPropertyValuesCache = []; foreach($blockStateMappings as $mapping){ $newName = $mapping->new->getName(); $newNameFound[$newName] = true; @@ -354,15 +441,15 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad if($newName !== $oldName){ $result->renamedIds[$oldName] = array_key_first($newNameFound); } - foreach($blockStateMappings as $mapping){ - processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + if(!processStateGroup($oldName, $blockStateMappings, $result)){ + throw new \RuntimeException("States with the same ID should be fully consistent"); } }else{ if(isset($newNameFound[$oldName])){ //some of the states stayed under the same ID - we can process these as normal states - foreach($blockStateMappings as $k => $mapping){ - if($mapping->new->getName() === $oldName){ - processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + $stateGroup = array_filter($blockStateMappings, fn(BlockStateMapping $m) => $m->new->getName() === $oldName); + if(processStateGroup($oldName, $stateGroup, $result)){ + foreach(Utils::stringifyKeys($stateGroup) as $k => $mapping){ unset($blockStateMappings[$k]); } } From ad67fb729138c7b1e27e9bb0be604463d136b5de Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Jun 2023 16:22:29 +0100 Subject: [PATCH 1147/1858] BlockStateUpgradeSchemaModelBlockRemap: added missing @required tag --- .../upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index 49b2e0f285..d37a72fb8a 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -40,6 +40,7 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ /** * @var BlockStateUpgradeSchemaModelTag[]|null * @phpstan-var array|null + * @required */ public ?array $newState; From 470a3e1a3acfeb3f524e47082160ab6461b2474f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Jun 2023 12:40:17 +0100 Subject: [PATCH 1148/1858] tools/generate-blockstate-upgrade-schema: reduce dependencies for generating blockstate mappings --- tools/generate-blockstate-upgrade-schema.php | 53 ++++++++------------ 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 691f608fad..70591fa282 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -280,15 +280,13 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra * This significantly reduces the output size during flattening when the flattened block has many permutations * (e.g. walls). * - * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps - * @param BlockStateMapping[] $upgradeTable - * @phpstan-param list $stateRemaps + * @param BlockStateMapping[] $upgradeTable * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] * @phpstan-return list */ -function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ +function processRemappedStates(array $upgradeTable) : array{ $unchangedStatesByNewName = []; foreach($upgradeTable as $pair){ @@ -331,21 +329,26 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array $compressedRemaps = []; - foreach($stateRemaps as $remap){ - $oldState = $remap->oldState; - $newState = $remap->newState; + foreach($upgradeTable as $remap){ + $oldState = $remap->old->getStates(); + $newState = $remap->new->getStates(); - if($oldState === null || $newState === null){ - //no unchanged states - no compression possible - assert(!isset($unchangedStatesByNewName[$remap->newName])); - $compressedRemaps[$remap->newName][] = $remap; + if(count($oldState) === 0 || count($newState) === 0){ + //all states have changed in some way - compression not possible + assert(!isset($unchangedStatesByNewName[$remap->new->getName()])); + $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $oldState, + $remap->new->getName(), + $newState, + [] + ); continue; } $cleanedOldState = $oldState; $cleanedNewState = $newState; - foreach($unchangedStatesByNewName[$remap->newName] as $propertyName){ + foreach($unchangedStatesByNewName[$remap->new->getName()] as $propertyName){ unset($cleanedOldState[$propertyName]); unset($cleanedNewState[$propertyName]); } @@ -353,10 +356,8 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array ksort($cleanedNewState); $duplicate = false; - $compressedRemaps[$remap->newName] ??= []; - foreach($compressedRemaps[$remap->newName] as $k => $compressedRemap){ - assert($compressedRemap->oldState !== null && $compressedRemap->newState !== null); - + $compressedRemaps[$remap->new->getName()] ??= []; + foreach($compressedRemaps[$remap->new->getName()] as $k => $compressedRemap){ if( count($compressedRemap->oldState) !== count($cleanedOldState) || count($compressedRemap->newState) !== count($cleanedNewState) @@ -379,11 +380,11 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array break; } if(!$duplicate){ - $compressedRemaps[$remap->newName][] = new BlockStateUpgradeSchemaBlockRemap( + $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( $cleanedOldState, - $remap->newName, + $remap->new->getName(), $cleanedNewState, - $unchangedStatesByNewName[$remap->newName] + $unchangedStatesByNewName[$remap->new->getName()] ); } } @@ -455,21 +456,9 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad } } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap - foreach($blockStateMappings as $mapping){ - if(!$mapping->old->equals($mapping->new)){ - $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $mapping->old->getStates(), - $mapping->new->getName(), - $mapping->new->getStates(), - [] - ); - } - } + $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); } } - foreach(Utils::stringifyKeys($result->remappedStates) as $oldName => $remap){ - $result->remappedStates[$oldName] = compressRemappedStates($upgradeTable[$oldName], $remap); - } return $result; } From 74d219dcb6a57788d453e3c865479148ea333902 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Jun 2023 16:07:23 +0100 Subject: [PATCH 1149/1858] Revert "tools/generate-blockstate-upgrade-schema: reduce dependencies for generating blockstate mappings" This reverts commit 470a3e1a3acfeb3f524e47082160ab6461b2474f. This changes behaviour, so it needs to target minor-next. --- tools/generate-blockstate-upgrade-schema.php | 53 ++++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 70591fa282..691f608fad 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -280,13 +280,15 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra * This significantly reduces the output size during flattening when the flattened block has many permutations * (e.g. walls). * - * @param BlockStateMapping[] $upgradeTable + * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps + * @param BlockStateMapping[] $upgradeTable + * @phpstan-param list $stateRemaps * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] * @phpstan-return list */ -function processRemappedStates(array $upgradeTable) : array{ +function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ $unchangedStatesByNewName = []; foreach($upgradeTable as $pair){ @@ -329,26 +331,21 @@ function processRemappedStates(array $upgradeTable) : array{ $compressedRemaps = []; - foreach($upgradeTable as $remap){ - $oldState = $remap->old->getStates(); - $newState = $remap->new->getStates(); + foreach($stateRemaps as $remap){ + $oldState = $remap->oldState; + $newState = $remap->newState; - if(count($oldState) === 0 || count($newState) === 0){ - //all states have changed in some way - compression not possible - assert(!isset($unchangedStatesByNewName[$remap->new->getName()])); - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $oldState, - $remap->new->getName(), - $newState, - [] - ); + if($oldState === null || $newState === null){ + //no unchanged states - no compression possible + assert(!isset($unchangedStatesByNewName[$remap->newName])); + $compressedRemaps[$remap->newName][] = $remap; continue; } $cleanedOldState = $oldState; $cleanedNewState = $newState; - foreach($unchangedStatesByNewName[$remap->new->getName()] as $propertyName){ + foreach($unchangedStatesByNewName[$remap->newName] as $propertyName){ unset($cleanedOldState[$propertyName]); unset($cleanedNewState[$propertyName]); } @@ -356,8 +353,10 @@ function processRemappedStates(array $upgradeTable) : array{ ksort($cleanedNewState); $duplicate = false; - $compressedRemaps[$remap->new->getName()] ??= []; - foreach($compressedRemaps[$remap->new->getName()] as $k => $compressedRemap){ + $compressedRemaps[$remap->newName] ??= []; + foreach($compressedRemaps[$remap->newName] as $k => $compressedRemap){ + assert($compressedRemap->oldState !== null && $compressedRemap->newState !== null); + if( count($compressedRemap->oldState) !== count($cleanedOldState) || count($compressedRemap->newState) !== count($cleanedNewState) @@ -380,11 +379,11 @@ function processRemappedStates(array $upgradeTable) : array{ break; } if(!$duplicate){ - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $compressedRemaps[$remap->newName][] = new BlockStateUpgradeSchemaBlockRemap( $cleanedOldState, - $remap->new->getName(), + $remap->newName, $cleanedNewState, - $unchangedStatesByNewName[$remap->new->getName()] + $unchangedStatesByNewName[$remap->newName] ); } } @@ -456,9 +455,21 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad } } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap - $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); + foreach($blockStateMappings as $mapping){ + if(!$mapping->old->equals($mapping->new)){ + $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $mapping->old->getStates(), + $mapping->new->getName(), + $mapping->new->getStates(), + [] + ); + } + } } } + foreach(Utils::stringifyKeys($result->remappedStates) as $oldName => $remap){ + $result->remappedStates[$oldName] = compressRemappedStates($upgradeTable[$oldName], $remap); + } return $result; } From 2b40c1a5be515e05b98e1d3b36735730a8d9a1a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Jun 2023 16:07:52 +0100 Subject: [PATCH 1150/1858] Revert "tools/generate-blockstate-upgrade-schema: improve property remapping checks" This reverts commit b8788c55c58effd04f5d8774ae04dd1656813abb. This changes behaviour, so it needs to target minor-next. --- tools/generate-blockstate-upgrade-schema.php | 279 +++++++------------ 1 file changed, 96 insertions(+), 183 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 691f608fad..847486a668 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -28,26 +28,18 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; -use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\tag\Tag; -use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; -use function array_filter; use function array_key_first; -use function array_keys; -use function array_map; use function array_merge; -use function array_shift; use function array_values; use function assert; use function count; use function dirname; use function file_put_contents; use function fwrite; -use function implode; use function json_encode; use function ksort; use function usort; @@ -64,22 +56,9 @@ class BlockStateMapping{ ){} } -/** - * @param Tag[] $properties - * @phpstan-param array $properties - */ -function encodeOrderedProperties(array $properties) : string{ - ksort($properties, SORT_STRING); - return implode("", array_map(fn(Tag $tag) => encodeProperty($tag), array_values($properties))); -} - -function encodeProperty(Tag $tag) : string{ - return (new LittleEndianNbtSerializer())->write(new TreeRoot($tag)); -} - /** * @return BlockStateMapping[][] - * @phpstan-return array> + * @phpstan-return array> */ function loadUpgradeTable(string $file, bool $reverse) : array{ $contents = Filesystem::fileGetContents($file); @@ -93,7 +72,7 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ $old = BlockStateData::fromNbt($reverse ? $newTag : $oldTag); $new = BlockStateData::fromNbt($reverse ? $oldTag : $newTag); - $result[$old->getName()][encodeOrderedProperties($old->getStates())] = new BlockStateMapping( + $result[$old->getName()][] = new BlockStateMapping( $old, $new ); @@ -103,176 +82,111 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ } /** - * @param BlockStateData[] $states - * @phpstan-param array $states - * - * @return Tag[][] - * @phpstan-return array> + * @param true[] $removedPropertiesCache + * @param Tag[][] $remappedPropertyValuesCache + * @phpstan-param array $removedPropertiesCache + * @phpstan-param array> $remappedPropertyValuesCache */ -function buildStateGroupSchema(array $states) : ?array{ - $first = $states[array_key_first($states)]; +function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgradeSchema $result, array &$removedPropertiesCache, array &$remappedPropertyValuesCache) : void{ - $properties = []; - foreach(Utils::stringifyKeys($first->getStates()) as $propertyName => $propertyValue){ - $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; - } - foreach($states as $state){ - if(count($state->getStates()) !== count($properties)){ - return null; - } - foreach(Utils::stringifyKeys($state->getStates()) as $propertyName => $propertyValue){ - if(!isset($properties[$propertyName])){ - return null; - } - $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; - } - } + //new and old IDs are the same; compare states + $oldName = $old->getName(); - return $properties; -} + $oldStates = $old->getStates(); + $newStates = $new->getStates(); -/** - * @param BlockStateMapping[] $upgradeTable - * @phpstan-param array $upgradeTable - */ -function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgradeSchema $result) : bool{ - $newProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->new, $upgradeTable)); - if($newProperties === null){ - \GlobalLogger::get()->warning("New states for $oldName don't all have the same set of properties - processing as remaps instead"); - return false; - } - $oldProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->old, $upgradeTable)); - if($oldProperties === null){ - //TODO: not sure if this is actually required - we may be able to apply some transformations even if the states are not consistent - //however, this should never normally occur anyway - \GlobalLogger::get()->warning("Old states for $oldName don't all have the same set of properties - processing as remaps instead"); - return false; - } - - $remappedPropertyValues = []; - $addedProperties = []; - $removedProperties = []; - $renamedProperties = []; - - foreach(Utils::stringifyKeys($newProperties) as $newPropertyName => $newPropertyValues){ - if(count($newPropertyValues) === 1){ - $newPropertyValue = $newPropertyValues[array_key_first($newPropertyValues)]; - if(isset($oldProperties[$newPropertyName])){ - //all the old values for this property were mapped to the same new value - //it would be more space-efficient to represent this as a remove+add, but we can't guarantee that the - //removal of the old value will be done before the addition of the new value - foreach($oldProperties[$newPropertyName] as $oldPropertyValue){ - $remappedPropertyValues[$newPropertyName][encodeProperty($oldPropertyValue)] = $newPropertyValue; - } - }else{ - //this property has no relation to any property value in any of the old states - it's a new property - $addedProperties[$newPropertyName] = $newPropertyValue; + $propertyRemoved = []; + $propertyAdded = []; + foreach(Utils::stringifyKeys($oldStates) as $propertyName => $oldProperty){ + $newProperty = $new->getState($propertyName); + if($newProperty === null){ + $propertyRemoved[$propertyName] = $oldProperty; + }elseif(!$newProperty->equals($oldProperty)){ + if(!isset($remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()])){ + $result->remappedPropertyValues[$oldName][$propertyName][] = new BlockStateUpgradeSchemaValueRemap( + $oldProperty, + $newProperty + ); + $remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()] = $newProperty; } } } - foreach(Utils::stringifyKeys($oldProperties) as $oldPropertyName => $oldPropertyValues){ - $mappingsContainingOldValue = []; - foreach($upgradeTable as $mapping){ - $mappingOldValue = $mapping->old->getState($oldPropertyName) ?? throw new AssumptionFailedError("This should never happen"); - foreach($oldPropertyValues as $oldPropertyValue){ - if($mappingOldValue->equals($oldPropertyValue)){ - $mappingsContainingOldValue[encodeProperty($oldPropertyValue)][] = $mapping; - break; + foreach(Utils::stringifyKeys($newStates) as $propertyName => $value){ + if($old->getState($propertyName) === null){ + $propertyAdded[$propertyName] = $value; + } + } + + if(count($propertyAdded) === 0 && count($propertyRemoved) === 0){ + return; + } + if(count($propertyAdded) === 1 && count($propertyRemoved) === 1){ + $propertyOldName = array_key_first($propertyRemoved); + $propertyNewName = array_key_first($propertyAdded); + + $propertyOldValue = $propertyRemoved[$propertyOldName]; + $propertyNewValue = $propertyAdded[$propertyNewName]; + + $existingPropertyValueMap = $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] ?? null; + if($propertyOldName !== $propertyNewName){ + if(!$propertyOldValue->equals($propertyNewValue) && $existingPropertyValueMap === null){ + \GlobalLogger::get()->warning("warning: guessing that $oldName has $propertyOldName renamed to $propertyNewName with a value map of $propertyOldValue mapped to $propertyNewValue");; + } + //this is a guess; it might not be reliable if the value changed as well + //this will probably never be an issue, but it might rear its ugly head in the future + $result->renamedProperties[$oldName][$propertyOldName] = $propertyNewName; + } + if(!$propertyOldValue->equals($propertyNewValue)){ + $mapped = true; + if($existingPropertyValueMap !== null && !$existingPropertyValueMap->equals($propertyNewValue)){ + if($existingPropertyValueMap->equals($propertyOldValue)){ + \GlobalLogger::get()->warning("warning: guessing that the value $propertyOldValue of $propertyNewValue did not change");; + $mapped = false; + }else{ + \GlobalLogger::get()->warning("warning: mismatch of new value for $propertyNewName for $oldName: $propertyOldValue seen mapped to $propertyNewValue and $existingPropertyValueMap");; } } - } - - $candidateNewPropertyNames = []; - //foreach mappings by unique value, compute the diff across all the states in the list - foreach(Utils::stringifyKeys($mappingsContainingOldValue) as $rawOldValue => $mappingList){ - $first = array_shift($mappingList); - foreach(Utils::stringifyKeys($first->new->getStates()) as $newPropertyName => $newPropertyValue){ - if(isset($addedProperties[$newPropertyName])){ - //this property was already determined to be unrelated to any old property - continue; - } - foreach($mappingList as $pair){ - if(!($pair->new->getState($newPropertyName)?->equals($newPropertyValue) ?? false)){ - //if the new property is different with an unchanged old value, - //the property may be influenced by multiple old properties, or be unrelated entirely - continue 2; - } - } - $candidateNewPropertyNames[$newPropertyName][$rawOldValue] = $newPropertyValue; + if($mapped && !isset($remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()])){ + //value remap + $result->remappedPropertyValues[$oldName][$propertyOldName][] = new BlockStateUpgradeSchemaValueRemap( + $propertyRemoved[$propertyOldName], + $propertyAdded[$propertyNewName] + ); + $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; } + }elseif($existingPropertyValueMap !== null){ + \GlobalLogger::get()->warning("warning: multiple values found for value $propertyOldValue of $propertyNewName on block $oldName, guessing it did not change");; + $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; } + }else{ + if(count($propertyAdded) !== 0 && count($propertyRemoved) === 0){ + foreach(Utils::stringifyKeys($propertyAdded) as $propertyAddedName => $propertyAddedValue){ + $existingDefault = $result->addedProperties[$oldName][$propertyAddedName] ?? null; + if($existingDefault !== null && !$existingDefault->equals($propertyAddedValue)){ + throw new \UnexpectedValueException("Ambiguous default value for added property $propertyAddedName on block $oldName"); + } - if(count($candidateNewPropertyNames) === 0){ - $removedProperties[$oldPropertyName] = $oldPropertyName; - }elseif(count($candidateNewPropertyNames) === 1){ - $newPropertyName = array_key_first($candidateNewPropertyNames); - $newPropertyValues = $candidateNewPropertyNames[$newPropertyName]; - - if($oldPropertyName !== $newPropertyName){ - $renamedProperties[$oldPropertyName] = $newPropertyName; + $result->addedProperties[$oldName][$propertyAddedName] = $propertyAddedValue; } - - foreach(Utils::stringifyKeys($newPropertyValues) as $rawOldValue => $newPropertyValue){ - if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ - $remappedPropertyValues[$oldPropertyName][$rawOldValue] = $newPropertyValue; + }elseif(count($propertyRemoved) !== 0 && count($propertyAdded) === 0){ + foreach(Utils::stringifyKeys($propertyRemoved) as $propertyRemovedName => $propertyRemovedValue){ + if(!isset($removedPropertiesCache[$propertyRemovedName])){ + //to avoid having useless keys in the output + $result->removedProperties[$oldName][] = $propertyRemovedName; + $removedPropertiesCache[$propertyRemovedName] = $propertyRemovedName; } } }else{ - $split = true; - if(isset($candidateNewPropertyNames[$oldPropertyName])){ - //In 1.10, direction wasn't changed at all, but not all state permutations were present in the palette, - //making it appear that door_hinge_bit was correlated with direction. - //If a new property is present with the same name and values as an old property, we can assume that - //the property was unchanged, and that any extra matches properties are probably unrelated. - $changedValues = false; - foreach(Utils::stringifyKeys($candidateNewPropertyNames[$oldPropertyName]) as $rawOldValue => $newPropertyValue){ - if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ - //if any of the new values are different, we may be dealing with a property being split into - //multiple new properties - hand this off to the remap handler - $changedValues = true; - break; - } - } - if(!$changedValues){ - $split = false; - } - } - if($split){ - \GlobalLogger::get()->warning( - "Multiple new properties (" . (implode(", ", array_keys($candidateNewPropertyNames))) . ") are correlated with $oldName property $oldPropertyName, processing as remaps instead" - ); - return false; - }else{ - //is it safe to ignore the rest? - } + $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( + $oldStates, + $new->getName(), + $newStates, + [] + ); + \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; } } - - //finally, write the results to the schema - - if(count($remappedPropertyValues) !== 0){ - foreach(Utils::stringifyKeys($remappedPropertyValues) as $oldPropertyName => $propertyValues){ - foreach(Utils::stringifyKeys($propertyValues) as $rawOldValue => $newPropertyValue){ - $oldPropertyValue = $oldProperties[$oldPropertyName][$rawOldValue]; - $result->remappedPropertyValues[$oldName][$oldPropertyName][] = new BlockStateUpgradeSchemaValueRemap( - $oldPropertyValue, - $newPropertyValue - ); - } - } - } - if(count($addedProperties) !== 0){ - $result->addedProperties[$oldName] = $addedProperties; - } - if(count($removedProperties) !== 0){ - $result->removedProperties[$oldName] = array_values($removedProperties); - } - if(count($renamedProperties) !== 0){ - $result->renamedProperties[$oldName] = $renamedProperties; - } - - return true; } /** @@ -282,11 +196,8 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra * * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps * @param BlockStateMapping[] $upgradeTable - * @phpstan-param list $stateRemaps - * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] - * @phpstan-return list */ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ $unchangedStatesByNewName = []; @@ -400,7 +311,7 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array /** * @param BlockStateMapping[][] $upgradeTable - * @phpstan-param array> $upgradeTable + * @phpstan-param array> $upgradeTable */ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgradeSchema{ $foundVersion = -1; @@ -432,6 +343,8 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad foreach(Utils::stringifyKeys($upgradeTable) as $oldName => $blockStateMappings){ $newNameFound = []; + $removedPropertiesCache = []; + $remappedPropertyValuesCache = []; foreach($blockStateMappings as $mapping){ $newName = $mapping->new->getName(); $newNameFound[$newName] = true; @@ -441,15 +354,15 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad if($newName !== $oldName){ $result->renamedIds[$oldName] = array_key_first($newNameFound); } - if(!processStateGroup($oldName, $blockStateMappings, $result)){ - throw new \RuntimeException("States with the same ID should be fully consistent"); + foreach($blockStateMappings as $mapping){ + processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); } }else{ if(isset($newNameFound[$oldName])){ //some of the states stayed under the same ID - we can process these as normal states - $stateGroup = array_filter($blockStateMappings, fn(BlockStateMapping $m) => $m->new->getName() === $oldName); - if(processStateGroup($oldName, $stateGroup, $result)){ - foreach(Utils::stringifyKeys($stateGroup) as $k => $mapping){ + foreach($blockStateMappings as $k => $mapping){ + if($mapping->new->getName() === $oldName){ + processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); unset($blockStateMappings[$k]); } } From 0b0b72f596104b0ceb867845ab71a17245570e9f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 24 Jun 2023 16:14:28 +0100 Subject: [PATCH 1151/1858] Reapply b8788c55c: tools/generate-blockstate-upgrade-schema: improve property remapping checks this is now able to determine which properties were renamed and/or changed when multiple renames occurred in a single version. This also fixes unrelated properties being considered mapped to each other when there was only one property in the old and new state (e.g. mapped_type and deprecated for hay_bale in 1.10). Now, these are properly considered as unrelated. --- tools/generate-blockstate-upgrade-schema.php | 281 ++++++++++++------- 1 file changed, 184 insertions(+), 97 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 847486a668..691f608fad 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -28,18 +28,26 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; +use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\tag\Tag; +use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; +use function array_filter; use function array_key_first; +use function array_keys; +use function array_map; use function array_merge; +use function array_shift; use function array_values; use function assert; use function count; use function dirname; use function file_put_contents; use function fwrite; +use function implode; use function json_encode; use function ksort; use function usort; @@ -56,9 +64,22 @@ class BlockStateMapping{ ){} } +/** + * @param Tag[] $properties + * @phpstan-param array $properties + */ +function encodeOrderedProperties(array $properties) : string{ + ksort($properties, SORT_STRING); + return implode("", array_map(fn(Tag $tag) => encodeProperty($tag), array_values($properties))); +} + +function encodeProperty(Tag $tag) : string{ + return (new LittleEndianNbtSerializer())->write(new TreeRoot($tag)); +} + /** * @return BlockStateMapping[][] - * @phpstan-return array> + * @phpstan-return array> */ function loadUpgradeTable(string $file, bool $reverse) : array{ $contents = Filesystem::fileGetContents($file); @@ -72,7 +93,7 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ $old = BlockStateData::fromNbt($reverse ? $newTag : $oldTag); $new = BlockStateData::fromNbt($reverse ? $oldTag : $newTag); - $result[$old->getName()][] = new BlockStateMapping( + $result[$old->getName()][encodeOrderedProperties($old->getStates())] = new BlockStateMapping( $old, $new ); @@ -82,111 +103,176 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ } /** - * @param true[] $removedPropertiesCache - * @param Tag[][] $remappedPropertyValuesCache - * @phpstan-param array $removedPropertiesCache - * @phpstan-param array> $remappedPropertyValuesCache + * @param BlockStateData[] $states + * @phpstan-param array $states + * + * @return Tag[][] + * @phpstan-return array> */ -function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgradeSchema $result, array &$removedPropertiesCache, array &$remappedPropertyValuesCache) : void{ +function buildStateGroupSchema(array $states) : ?array{ + $first = $states[array_key_first($states)]; - //new and old IDs are the same; compare states - $oldName = $old->getName(); + $properties = []; + foreach(Utils::stringifyKeys($first->getStates()) as $propertyName => $propertyValue){ + $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; + } + foreach($states as $state){ + if(count($state->getStates()) !== count($properties)){ + return null; + } + foreach(Utils::stringifyKeys($state->getStates()) as $propertyName => $propertyValue){ + if(!isset($properties[$propertyName])){ + return null; + } + $properties[$propertyName][encodeProperty($propertyValue)] = $propertyValue; + } + } - $oldStates = $old->getStates(); - $newStates = $new->getStates(); + return $properties; +} - $propertyRemoved = []; - $propertyAdded = []; - foreach(Utils::stringifyKeys($oldStates) as $propertyName => $oldProperty){ - $newProperty = $new->getState($propertyName); - if($newProperty === null){ - $propertyRemoved[$propertyName] = $oldProperty; - }elseif(!$newProperty->equals($oldProperty)){ - if(!isset($remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()])){ - $result->remappedPropertyValues[$oldName][$propertyName][] = new BlockStateUpgradeSchemaValueRemap( - $oldProperty, - $newProperty - ); - $remappedPropertyValuesCache[$propertyName][$oldProperty->getValue()] = $newProperty; +/** + * @param BlockStateMapping[] $upgradeTable + * @phpstan-param array $upgradeTable + */ +function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgradeSchema $result) : bool{ + $newProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->new, $upgradeTable)); + if($newProperties === null){ + \GlobalLogger::get()->warning("New states for $oldName don't all have the same set of properties - processing as remaps instead"); + return false; + } + $oldProperties = buildStateGroupSchema(array_map(fn(BlockStateMapping $m) => $m->old, $upgradeTable)); + if($oldProperties === null){ + //TODO: not sure if this is actually required - we may be able to apply some transformations even if the states are not consistent + //however, this should never normally occur anyway + \GlobalLogger::get()->warning("Old states for $oldName don't all have the same set of properties - processing as remaps instead"); + return false; + } + + $remappedPropertyValues = []; + $addedProperties = []; + $removedProperties = []; + $renamedProperties = []; + + foreach(Utils::stringifyKeys($newProperties) as $newPropertyName => $newPropertyValues){ + if(count($newPropertyValues) === 1){ + $newPropertyValue = $newPropertyValues[array_key_first($newPropertyValues)]; + if(isset($oldProperties[$newPropertyName])){ + //all the old values for this property were mapped to the same new value + //it would be more space-efficient to represent this as a remove+add, but we can't guarantee that the + //removal of the old value will be done before the addition of the new value + foreach($oldProperties[$newPropertyName] as $oldPropertyValue){ + $remappedPropertyValues[$newPropertyName][encodeProperty($oldPropertyValue)] = $newPropertyValue; + } + }else{ + //this property has no relation to any property value in any of the old states - it's a new property + $addedProperties[$newPropertyName] = $newPropertyValue; } } } - foreach(Utils::stringifyKeys($newStates) as $propertyName => $value){ - if($old->getState($propertyName) === null){ - $propertyAdded[$propertyName] = $value; - } - } - - if(count($propertyAdded) === 0 && count($propertyRemoved) === 0){ - return; - } - if(count($propertyAdded) === 1 && count($propertyRemoved) === 1){ - $propertyOldName = array_key_first($propertyRemoved); - $propertyNewName = array_key_first($propertyAdded); - - $propertyOldValue = $propertyRemoved[$propertyOldName]; - $propertyNewValue = $propertyAdded[$propertyNewName]; - - $existingPropertyValueMap = $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] ?? null; - if($propertyOldName !== $propertyNewName){ - if(!$propertyOldValue->equals($propertyNewValue) && $existingPropertyValueMap === null){ - \GlobalLogger::get()->warning("warning: guessing that $oldName has $propertyOldName renamed to $propertyNewName with a value map of $propertyOldValue mapped to $propertyNewValue");; - } - //this is a guess; it might not be reliable if the value changed as well - //this will probably never be an issue, but it might rear its ugly head in the future - $result->renamedProperties[$oldName][$propertyOldName] = $propertyNewName; - } - if(!$propertyOldValue->equals($propertyNewValue)){ - $mapped = true; - if($existingPropertyValueMap !== null && !$existingPropertyValueMap->equals($propertyNewValue)){ - if($existingPropertyValueMap->equals($propertyOldValue)){ - \GlobalLogger::get()->warning("warning: guessing that the value $propertyOldValue of $propertyNewValue did not change");; - $mapped = false; - }else{ - \GlobalLogger::get()->warning("warning: mismatch of new value for $propertyNewName for $oldName: $propertyOldValue seen mapped to $propertyNewValue and $existingPropertyValueMap");; + foreach(Utils::stringifyKeys($oldProperties) as $oldPropertyName => $oldPropertyValues){ + $mappingsContainingOldValue = []; + foreach($upgradeTable as $mapping){ + $mappingOldValue = $mapping->old->getState($oldPropertyName) ?? throw new AssumptionFailedError("This should never happen"); + foreach($oldPropertyValues as $oldPropertyValue){ + if($mappingOldValue->equals($oldPropertyValue)){ + $mappingsContainingOldValue[encodeProperty($oldPropertyValue)][] = $mapping; + break; } } - if($mapped && !isset($remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()])){ - //value remap - $result->remappedPropertyValues[$oldName][$propertyOldName][] = new BlockStateUpgradeSchemaValueRemap( - $propertyRemoved[$propertyOldName], - $propertyAdded[$propertyNewName] - ); - $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; - } - }elseif($existingPropertyValueMap !== null){ - \GlobalLogger::get()->warning("warning: multiple values found for value $propertyOldValue of $propertyNewName on block $oldName, guessing it did not change");; - $remappedPropertyValuesCache[$propertyOldName][$propertyOldValue->getValue()] = $propertyNewValue; } - }else{ - if(count($propertyAdded) !== 0 && count($propertyRemoved) === 0){ - foreach(Utils::stringifyKeys($propertyAdded) as $propertyAddedName => $propertyAddedValue){ - $existingDefault = $result->addedProperties[$oldName][$propertyAddedName] ?? null; - if($existingDefault !== null && !$existingDefault->equals($propertyAddedValue)){ - throw new \UnexpectedValueException("Ambiguous default value for added property $propertyAddedName on block $oldName"); - } - $result->addedProperties[$oldName][$propertyAddedName] = $propertyAddedValue; + $candidateNewPropertyNames = []; + //foreach mappings by unique value, compute the diff across all the states in the list + foreach(Utils::stringifyKeys($mappingsContainingOldValue) as $rawOldValue => $mappingList){ + $first = array_shift($mappingList); + foreach(Utils::stringifyKeys($first->new->getStates()) as $newPropertyName => $newPropertyValue){ + if(isset($addedProperties[$newPropertyName])){ + //this property was already determined to be unrelated to any old property + continue; + } + foreach($mappingList as $pair){ + if(!($pair->new->getState($newPropertyName)?->equals($newPropertyValue) ?? false)){ + //if the new property is different with an unchanged old value, + //the property may be influenced by multiple old properties, or be unrelated entirely + continue 2; + } + } + $candidateNewPropertyNames[$newPropertyName][$rawOldValue] = $newPropertyValue; } - }elseif(count($propertyRemoved) !== 0 && count($propertyAdded) === 0){ - foreach(Utils::stringifyKeys($propertyRemoved) as $propertyRemovedName => $propertyRemovedValue){ - if(!isset($removedPropertiesCache[$propertyRemovedName])){ - //to avoid having useless keys in the output - $result->removedProperties[$oldName][] = $propertyRemovedName; - $removedPropertiesCache[$propertyRemovedName] = $propertyRemovedName; + } + + if(count($candidateNewPropertyNames) === 0){ + $removedProperties[$oldPropertyName] = $oldPropertyName; + }elseif(count($candidateNewPropertyNames) === 1){ + $newPropertyName = array_key_first($candidateNewPropertyNames); + $newPropertyValues = $candidateNewPropertyNames[$newPropertyName]; + + if($oldPropertyName !== $newPropertyName){ + $renamedProperties[$oldPropertyName] = $newPropertyName; + } + + foreach(Utils::stringifyKeys($newPropertyValues) as $rawOldValue => $newPropertyValue){ + if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ + $remappedPropertyValues[$oldPropertyName][$rawOldValue] = $newPropertyValue; } } }else{ - $result->remappedStates[$oldName][] = new BlockStateUpgradeSchemaBlockRemap( - $oldStates, - $new->getName(), - $newStates, - [] - ); - \GlobalLogger::get()->warning("warning: multiple properties added and removed for $oldName; added full state remap");; + $split = true; + if(isset($candidateNewPropertyNames[$oldPropertyName])){ + //In 1.10, direction wasn't changed at all, but not all state permutations were present in the palette, + //making it appear that door_hinge_bit was correlated with direction. + //If a new property is present with the same name and values as an old property, we can assume that + //the property was unchanged, and that any extra matches properties are probably unrelated. + $changedValues = false; + foreach(Utils::stringifyKeys($candidateNewPropertyNames[$oldPropertyName]) as $rawOldValue => $newPropertyValue){ + if(!$newPropertyValue->equals($oldPropertyValues[$rawOldValue])){ + //if any of the new values are different, we may be dealing with a property being split into + //multiple new properties - hand this off to the remap handler + $changedValues = true; + break; + } + } + if(!$changedValues){ + $split = false; + } + } + if($split){ + \GlobalLogger::get()->warning( + "Multiple new properties (" . (implode(", ", array_keys($candidateNewPropertyNames))) . ") are correlated with $oldName property $oldPropertyName, processing as remaps instead" + ); + return false; + }else{ + //is it safe to ignore the rest? + } } } + + //finally, write the results to the schema + + if(count($remappedPropertyValues) !== 0){ + foreach(Utils::stringifyKeys($remappedPropertyValues) as $oldPropertyName => $propertyValues){ + foreach(Utils::stringifyKeys($propertyValues) as $rawOldValue => $newPropertyValue){ + $oldPropertyValue = $oldProperties[$oldPropertyName][$rawOldValue]; + $result->remappedPropertyValues[$oldName][$oldPropertyName][] = new BlockStateUpgradeSchemaValueRemap( + $oldPropertyValue, + $newPropertyValue + ); + } + } + } + if(count($addedProperties) !== 0){ + $result->addedProperties[$oldName] = $addedProperties; + } + if(count($removedProperties) !== 0){ + $result->removedProperties[$oldName] = array_values($removedProperties); + } + if(count($renamedProperties) !== 0){ + $result->renamedProperties[$oldName] = $renamedProperties; + } + + return true; } /** @@ -196,8 +282,11 @@ function processState(BlockStateData $old, BlockStateData $new, BlockStateUpgrad * * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps * @param BlockStateMapping[] $upgradeTable + * @phpstan-param list $stateRemaps + * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] + * @phpstan-return list */ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ $unchangedStatesByNewName = []; @@ -311,7 +400,7 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array /** * @param BlockStateMapping[][] $upgradeTable - * @phpstan-param array> $upgradeTable + * @phpstan-param array> $upgradeTable */ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgradeSchema{ $foundVersion = -1; @@ -343,8 +432,6 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad foreach(Utils::stringifyKeys($upgradeTable) as $oldName => $blockStateMappings){ $newNameFound = []; - $removedPropertiesCache = []; - $remappedPropertyValuesCache = []; foreach($blockStateMappings as $mapping){ $newName = $mapping->new->getName(); $newNameFound[$newName] = true; @@ -354,15 +441,15 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad if($newName !== $oldName){ $result->renamedIds[$oldName] = array_key_first($newNameFound); } - foreach($blockStateMappings as $mapping){ - processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + if(!processStateGroup($oldName, $blockStateMappings, $result)){ + throw new \RuntimeException("States with the same ID should be fully consistent"); } }else{ if(isset($newNameFound[$oldName])){ //some of the states stayed under the same ID - we can process these as normal states - foreach($blockStateMappings as $k => $mapping){ - if($mapping->new->getName() === $oldName){ - processState($mapping->old, $mapping->new, $result, $removedPropertiesCache, $remappedPropertyValuesCache); + $stateGroup = array_filter($blockStateMappings, fn(BlockStateMapping $m) => $m->new->getName() === $oldName); + if(processStateGroup($oldName, $stateGroup, $result)){ + foreach(Utils::stringifyKeys($stateGroup) as $k => $mapping){ unset($blockStateMappings[$k]); } } From 882d50b14e5b81b9b99e31801191985ad19a1a99 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Jun 2023 12:40:17 +0100 Subject: [PATCH 1152/1858] Reapply 470a3e1a3: tools/generate-blockstate-upgrade-schema: reduce dependencies for generating blockstate mappings --- tools/generate-blockstate-upgrade-schema.php | 53 ++++++++------------ 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 691f608fad..70591fa282 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -280,15 +280,13 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra * This significantly reduces the output size during flattening when the flattened block has many permutations * (e.g. walls). * - * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps - * @param BlockStateMapping[] $upgradeTable - * @phpstan-param list $stateRemaps + * @param BlockStateMapping[] $upgradeTable * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] * @phpstan-return list */ -function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ +function processRemappedStates(array $upgradeTable) : array{ $unchangedStatesByNewName = []; foreach($upgradeTable as $pair){ @@ -331,21 +329,26 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array $compressedRemaps = []; - foreach($stateRemaps as $remap){ - $oldState = $remap->oldState; - $newState = $remap->newState; + foreach($upgradeTable as $remap){ + $oldState = $remap->old->getStates(); + $newState = $remap->new->getStates(); - if($oldState === null || $newState === null){ - //no unchanged states - no compression possible - assert(!isset($unchangedStatesByNewName[$remap->newName])); - $compressedRemaps[$remap->newName][] = $remap; + if(count($oldState) === 0 || count($newState) === 0){ + //all states have changed in some way - compression not possible + assert(!isset($unchangedStatesByNewName[$remap->new->getName()])); + $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $oldState, + $remap->new->getName(), + $newState, + [] + ); continue; } $cleanedOldState = $oldState; $cleanedNewState = $newState; - foreach($unchangedStatesByNewName[$remap->newName] as $propertyName){ + foreach($unchangedStatesByNewName[$remap->new->getName()] as $propertyName){ unset($cleanedOldState[$propertyName]); unset($cleanedNewState[$propertyName]); } @@ -353,10 +356,8 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array ksort($cleanedNewState); $duplicate = false; - $compressedRemaps[$remap->newName] ??= []; - foreach($compressedRemaps[$remap->newName] as $k => $compressedRemap){ - assert($compressedRemap->oldState !== null && $compressedRemap->newState !== null); - + $compressedRemaps[$remap->new->getName()] ??= []; + foreach($compressedRemaps[$remap->new->getName()] as $k => $compressedRemap){ if( count($compressedRemap->oldState) !== count($cleanedOldState) || count($compressedRemap->newState) !== count($cleanedNewState) @@ -379,11 +380,11 @@ function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array break; } if(!$duplicate){ - $compressedRemaps[$remap->newName][] = new BlockStateUpgradeSchemaBlockRemap( + $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( $cleanedOldState, - $remap->newName, + $remap->new->getName(), $cleanedNewState, - $unchangedStatesByNewName[$remap->newName] + $unchangedStatesByNewName[$remap->new->getName()] ); } } @@ -455,21 +456,9 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad } } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap - foreach($blockStateMappings as $mapping){ - if(!$mapping->old->equals($mapping->new)){ - $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $mapping->old->getStates(), - $mapping->new->getName(), - $mapping->new->getStates(), - [] - ); - } - } + $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); } } - foreach(Utils::stringifyKeys($result->remappedStates) as $oldName => $remap){ - $result->remappedStates[$oldName] = compressRemappedStates($upgradeTable[$oldName], $remap); - } return $result; } From c165670e0a065e2f6aa67d9bddd8d46b74dca6f3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Jun 2023 16:17:00 +0100 Subject: [PATCH 1153/1858] Added support for using and generating blockstate upgrade schemas using newFlattenedName rules see pmmp/BedrockBlockUpgradeSchema@f426fccbee17f1a54c776b85df371e12333134d8 --- .../BlockStateUpgradeSchemaBlockRemap.php | 40 +++++- .../BlockStateUpgradeSchemaFlattenedName.php | 39 +++++ .../upgrade/BlockStateUpgradeSchemaUtils.php | 31 +++- .../block/upgrade/BlockStateUpgrader.php | 19 ++- ...BlockStateUpgradeSchemaModelBlockRemap.php | 18 ++- ...ckStateUpgradeSchemaModelFlattenedName.php | 40 ++++++ tools/generate-blockstate-upgrade-schema.php | 135 +++++++++++------- 7 files changed, 264 insertions(+), 58 deletions(-) create mode 100644 src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php create mode 100644 src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php index 7c57e1f1f9..611ad04e25 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -24,6 +24,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\Utils; +use function array_diff; +use function count; final class BlockStateUpgradeSchemaBlockRemap{ /** @@ -37,8 +40,43 @@ final class BlockStateUpgradeSchemaBlockRemap{ */ public function __construct( public array $oldState, - public string $newName, + public string|BlockStateUpgradeSchemaFlattenedName $newName, public array $newState, public array $copiedState ){} + + public function equals(self $that) : bool{ + $sameName = $this->newName === $that->newName || + ( + $this->newName instanceof BlockStateUpgradeSchemaFlattenedName && + $that->newName instanceof BlockStateUpgradeSchemaFlattenedName && + $this->newName->equals($that->newName) + ); + if(!$sameName){ + return false; + } + + if( + count($this->oldState) !== count($that->oldState) || + count($this->newState) !== count($that->newState) || + count($this->copiedState) !== count($that->copiedState) || + count(array_diff($this->copiedState, $that->copiedState)) !== 0 + ){ + return false; + } + foreach(Utils::stringifyKeys($this->oldState) as $propertyName => $propertyValue){ + if(!isset($that->oldState[$propertyName]) || !$that->oldState[$propertyName]->equals($propertyValue)){ + //different filter value + return false; + } + } + foreach(Utils::stringifyKeys($this->newState) as $propertyName => $propertyValue){ + if(!isset($that->newState[$propertyName]) || !$that->newState[$propertyName]->equals($propertyValue)){ + //different replacement value + return false; + } + } + + return true; + } } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php new file mode 100644 index 0000000000..d9cbc780e9 --- /dev/null +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php @@ -0,0 +1,39 @@ +prefix === $that->prefix && + $this->flattenedProperty === $that->flattenedProperty && + $this->suffix === $that->suffix; + } +} diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index c104b36682..82e7771349 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModel; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelFlattenedName; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelTag; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; use pocketmine\nbt\tag\ByteTag; @@ -43,12 +44,14 @@ use function get_debug_type; use function gettype; use function implode; use function is_object; +use function is_string; use function json_decode; use function json_encode; use function ksort; use function sort; use function str_pad; use function strval; +use function usort; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; use const STR_PAD_LEFT; @@ -154,9 +157,17 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ foreach($remaps as $remap){ + if(isset($remap->newName) === isset($remap->newFlattenedName)){ + throw new \UnexpectedValueException("Expected exactly one of 'newName' or 'newFlattenedName' properties to be set"); + } + $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaBlockRemap( array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState ?? []), - $remap->newName, + $remap->newName ?? new BlockStateUpgradeSchemaFlattenedName( + $remap->newFlattenedName->prefix, + $remap->newFlattenedName->flattenedProperty, + $remap->newFlattenedName->suffix + ), array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState ?? []), $remap->copiedState ?? [] ); @@ -285,7 +296,13 @@ final class BlockStateUpgradeSchemaUtils{ foreach($remaps as $remap){ $modelRemap = new BlockStateUpgradeSchemaModelBlockRemap( array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), - $remap->newName, + is_string($remap->newName) ? + $remap->newName : + new BlockStateUpgradeSchemaModelFlattenedName( + $remap->newName->prefix, + $remap->newName->flattenedProperty, + $remap->newName->suffix + ), array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), $remap->copiedState ); @@ -299,7 +316,15 @@ final class BlockStateUpgradeSchemaUtils{ } $keyedRemaps[$key] = $modelRemap; } - ksort($keyedRemaps); + usort($keyedRemaps, function(BlockStateUpgradeSchemaModelBlockRemap $a, BlockStateUpgradeSchemaModelBlockRemap $b) : int{ + //remaps with more specific criteria must come first + $filterSizeCompare = count($b->oldState ?? []) <=> count($a->oldState ?? []); + if($filterSizeCompare !== 0){ + return $filterSizeCompare; + } + //remaps with the same number of criteria should be sorted alphabetically, but this is not strictly necessary + return json_encode($a->oldState ?? []) <=> json_encode($b->oldState ?? []); + }); $result->remappedStates[$oldBlockName] = array_values($keyedRemaps); } if(isset($result->remappedStates)){ diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index ab0424a331..5c84cd383c 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -24,11 +24,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use function count; +use function is_string; use function ksort; use function max; +use function sprintf; use const SORT_NUMERIC; final class BlockStateUpgrader{ @@ -79,6 +82,20 @@ final class BlockStateUpgrader{ continue 2; //try next state } } + + if(is_string($remap->newName)){ + $newName = $remap->newName; + }else{ + $flattenedValue = $oldState[$remap->newName->flattenedProperty]; + if($flattenedValue instanceof StringTag){ + $newName = sprintf("%s%s%s", $remap->newName->prefix, $flattenedValue->getValue(), $remap->newName->suffix); + unset($oldState[$remap->newName->flattenedProperty]); + }else{ + //flattened property is not a TAG_String, so this transformation is not applicable + continue; + } + } + $newState = $remap->newState; foreach($remap->copiedState as $stateName){ if(isset($oldState[$stateName])){ @@ -86,7 +103,7 @@ final class BlockStateUpgrader{ } } - $blockStateData = new BlockStateData($remap->newName, $newState, $resultVersion); + $blockStateData = new BlockStateData($newName, $newState, $resultVersion); continue 2; //try next schema } } diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index d37a72fb8a..0f518479e5 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -34,8 +34,16 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ */ public ?array $oldState; - /** @required */ + /** + * Either this or newFlattenedName must be present + * Due to technical limitations of jsonmapper, we can't use a union type here + */ public string $newName; + /** + * Either this or newName must be present + * Due to technical limitations of jsonmapper, we can't use a union type here + */ + public BlockStateUpgradeSchemaModelFlattenedName $newFlattenedName; /** * @var BlockStateUpgradeSchemaModelTag[]|null @@ -59,9 +67,13 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ * @phpstan-param array $newState * @phpstan-param list $copiedState */ - public function __construct(array $oldState, string $newName, array $newState, array $copiedState){ + public function __construct(array $oldState, string|BlockStateUpgradeSchemaModelFlattenedName $newNameRule, array $newState, array $copiedState){ $this->oldState = count($oldState) === 0 ? null : $oldState; - $this->newName = $newName; + if($newNameRule instanceof BlockStateUpgradeSchemaModelFlattenedName){ + $this->newFlattenedName = $newNameRule; + }else{ + $this->newName = $newNameRule; + } $this->newState = count($newState) === 0 ? null : $newState; $this->copiedState = $copiedState; } diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php new file mode 100644 index 0000000000..4508d9a3be --- /dev/null +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php @@ -0,0 +1,40 @@ +prefix = $prefix; + $this->flattenedProperty = $flattenedProperty; + $this->suffix = $suffix; + } +} diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 70591fa282..f247d61129 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -26,9 +26,11 @@ namespace pocketmine\tools\generate_blockstate_upgrade_schema; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenedName; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; @@ -39,12 +41,11 @@ use function array_filter; use function array_key_first; use function array_keys; use function array_map; -use function array_merge; use function array_shift; use function array_values; -use function assert; use function count; use function dirname; +use function explode; use function file_put_contents; use function fwrite; use function implode; @@ -291,7 +292,7 @@ function processRemappedStates(array $upgradeTable) : array{ foreach($upgradeTable as $pair){ if(count($pair->old->getStates()) === 0 || count($pair->new->getStates()) === 0){ - //all states have changed in some way - compression not possible + //all states have changed in some way - no states are copied over $unchangedStatesByNewName[$pair->new->getName()] = []; continue; } @@ -327,76 +328,110 @@ function processRemappedStates(array $upgradeTable) : array{ $unchangedStatesByNewName[$newName] = $unchangedStates; } - $compressedRemaps = []; + $flattenedProperties = []; + $notFlattenedProperties = []; + $notFlattenedPropertyValues = []; + foreach($upgradeTable as $pair){ + foreach(Utils::stringifyKeys($pair->old->getStates()) as $propertyName => $propertyValue){ + if(isset($notFlattenedProperties[$propertyName])){ + continue; + } + if(!$propertyValue instanceof StringTag){ + $notFlattenedProperties[$propertyName] = true; + continue; + } + $rawValue = $propertyValue->getValue(); + if($rawValue === ""){ + $notFlattenedProperties[$propertyName] = true; + continue; + } + $parts = explode($rawValue, $pair->new->getName(), 2); + if(count($parts) !== 2){ + //the new name does not contain the property value, but it may still be able to be flattened in other cases + $notFlattenedPropertyValues[$propertyName][$rawValue] = $rawValue; + continue; + } + [$prefix, $suffix] = $parts; - foreach($upgradeTable as $remap){ - $oldState = $remap->old->getStates(); - $newState = $remap->new->getStates(); - - if(count($oldState) === 0 || count($newState) === 0){ - //all states have changed in some way - compression not possible - assert(!isset($unchangedStatesByNewName[$remap->new->getName()])); - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $oldState, - $remap->new->getName(), - $newState, - [] + $filter = $pair->old->getStates(); + foreach($unchangedStatesByNewName[$pair->new->getName()] as $unchangedPropertyName){ + unset($filter[$unchangedPropertyName]); + } + unset($filter[$propertyName]); + $rawFilter = encodeOrderedProperties($filter); + $flattenRule = new BlockStateUpgradeSchemaFlattenedName( + prefix: $prefix, + flattenedProperty: $propertyName, + suffix: $suffix ); - continue; + if(!isset($flattenedProperties[$propertyName][$rawFilter])){ + $flattenedProperties[$propertyName][$rawFilter] = $flattenRule; + }elseif(!$flattenRule->equals($flattenedProperties[$propertyName][$rawFilter])){ + $notFlattenedProperties[$propertyName] = true; + } } + } + foreach(Utils::stringifyKeys($notFlattenedProperties) as $propertyName => $_){ + unset($flattenedProperties[$propertyName]); + } + + ksort($flattenedProperties, SORT_STRING); + $flattenProperty = array_key_first($flattenedProperties); + + $list = []; + + foreach($upgradeTable as $pair){ + $oldState = $pair->old->getStates(); + $newState = $pair->new->getStates(); $cleanedOldState = $oldState; $cleanedNewState = $newState; + $newName = $pair->new->getName(); - foreach($unchangedStatesByNewName[$remap->new->getName()] as $propertyName){ + foreach($unchangedStatesByNewName[$newName] as $propertyName){ unset($cleanedOldState[$propertyName]); unset($cleanedNewState[$propertyName]); } ksort($cleanedOldState); ksort($cleanedNewState); - - $duplicate = false; - $compressedRemaps[$remap->new->getName()] ??= []; - foreach($compressedRemaps[$remap->new->getName()] as $k => $compressedRemap){ - if( - count($compressedRemap->oldState) !== count($cleanedOldState) || - count($compressedRemap->newState) !== count($cleanedNewState) - ){ - continue; + $flattened = false; + if($flattenProperty !== null){ + $flattenedValue = $cleanedOldState[$flattenProperty] ?? null; + if(!$flattenedValue instanceof StringTag){ + throw new AssumptionFailedError("This should always be a TAG_String"); } - foreach(Utils::stringifyKeys($cleanedOldState) as $propertyName => $propertyValue){ - if(!isset($compressedRemap->oldState[$propertyName]) || !$compressedRemap->oldState[$propertyName]->equals($propertyValue)){ - //different filter value - continue 2; - } + if(!isset($notFlattenedPropertyValues[$flattenProperty][$flattenedValue->getValue()])){ + unset($cleanedOldState[$flattenProperty]); + $flattened = true; } - foreach(Utils::stringifyKeys($cleanedNewState) as $propertyName => $propertyValue){ - if(!isset($compressedRemap->newState[$propertyName]) || !$compressedRemap->newState[$propertyName]->equals($propertyValue)){ - //different replacement value - continue 2; - } - } - $duplicate = true; - break; } - if(!$duplicate){ - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $cleanedOldState, - $remap->new->getName(), - $cleanedNewState, - $unchangedStatesByNewName[$remap->new->getName()] - ); + $rawOldState = encodeOrderedProperties($cleanedOldState); + $newNameRule = $flattenProperty !== null && $flattened ? + $flattenedProperties[$flattenProperty][$rawOldState] ?? throw new AssumptionFailedError("This should always be set") : + $newName; + + $remap = new BlockStateUpgradeSchemaBlockRemap( + $cleanedOldState, + $newNameRule, + $cleanedNewState, + $unchangedStatesByNewName[$pair->new->getName()] + ); + + $existing = $list[$rawOldState] ?? null; + if($existing === null || $existing->equals($remap)){ + $list[$rawOldState] = $remap; + }else{ + //match criteria is borked + throw new AssumptionFailedError("Match criteria resulted in two ambiguous remaps"); } } - $list = array_merge(...array_values($compressedRemaps)); - //more specific filters must come before less specific ones, in case of a remap on a certain value which is //otherwise unchanged usort($list, function(BlockStateUpgradeSchemaBlockRemap $a, BlockStateUpgradeSchemaBlockRemap $b) : int{ return count($b->oldState) <=> count($a->oldState); }); - return $list; + return array_values($list); } /** From f4dab17a1b5c39a1ddb2769be4b2186eecc9b235 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 10:29:14 +0100 Subject: [PATCH 1154/1858] Added deprecation notices --- .github/workflows/draft-release.yml | 2 ++ src/Server.php | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index ac2e65b2f3..edb8bae639 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -84,3 +84,5 @@ jobs: **For Minecraft: Bedrock Edition ${{ steps.get-pm-version.outputs.MCPE_VERSION }}** Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}${{ steps.get-pm-version.outputs.CHANGELOG_SUFFIX }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. + + :warning: **4.x is now deprecated. Please read https://github.com/pmmp/PocketMine-MP/issues/5784 for details, and prepare to upgrade to 5.x.** diff --git a/src/Server.php b/src/Server.php index 11a2b157a6..d4aba82824 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1054,6 +1054,11 @@ class Server{ $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_defaultGameMode($this->getGamemode()->getTranslatableName()))); $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_donate(TextFormat::AQUA . "https://patreon.com/pocketminemp" . TextFormat::RESET))); + + $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning1("4.x", "5.0"))); + $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning2("4.x", "2023-09-01"))); + $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning3("https://github.com/pmmp/PocketMine-MP/issues/5784"))); + $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_startFinished(strval(round(microtime(true) - $this->startTime, 3))))); $forwarder = new BroadcastLoggerForwarder($this, $this->logger, $this->language); From 249ef9c534656e4286e5fffb6ff60705dc424414 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 11:41:04 +0100 Subject: [PATCH 1155/1858] ProcessLoginTask: remove old key expiry since we don't have a hard date for this, and I've already made one wrong educated guess, I'd rather not have another massive outage. A security update will have to be made to remove the old key as soon as the new one is rolled. This is not ideal, but it's the least disruptive option. --- src/network/mcpe/auth/ProcessLoginTask.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 8d65f62c21..2da3b5fae6 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -38,9 +38,21 @@ use function time; class ProcessLoginTask extends AsyncTask{ private const TLS_KEY_ON_COMPLETION = "completion"; + /** + * Old Mojang root auth key. This was used since the introduction of Xbox Live authentication in 0.15.0. + * This key is expected to be replaced by the key below in the future, but this has not yet happened as of + * 2023-07-01. + * Ideally we would place a time expiry on this key, but since Mojang have not given a hard date for the key change, + * and one bad guess has already caused a major outage, we can't do this. + * TODO: This needs to be removed as soon as the new key is deployed by Mojang's authentication servers. + */ public const MOJANG_OLD_ROOT_PUBLIC_KEY = "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V"; - public const MOJANG_OLD_KEY_EXPIRY = 1688169600; //2023-07-01 00:00:00 UTC - there is no official date for the changeover to the new key, so this is a guess + /** + * New Mojang root auth key. Mojang notified third-party developers of this change prior to the release of 1.20.0. + * Expectations were that this would be used starting a "couple of weeks" after the release, but as of 2023-07-01, + * it has not yet been deployed. + */ public const MOJANG_ROOT_PUBLIC_KEY = "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAECRXueJeTDqNRRgJi/vlRufByu/2G0i2Ebt6YMar5QX/R0DIIyrJMcUpruK4QveTfJSTp3Shlq4Gk34cD/4GUWwkv0DVuzeuB+tXija7HBxii03NHDbPAD0AKnLr2wdAp"; private const CLOCK_DRIFT_MAX = 60; @@ -154,7 +166,7 @@ class ProcessLoginTask extends AsyncTask{ throw new VerifyLoginException($e->getMessage(), 0, $e); } - if($headers->x5u === self::MOJANG_ROOT_PUBLIC_KEY || (time() < self::MOJANG_OLD_KEY_EXPIRY && $headers->x5u === self::MOJANG_OLD_ROOT_PUBLIC_KEY)){ + if($headers->x5u === self::MOJANG_ROOT_PUBLIC_KEY || $headers->x5u === self::MOJANG_OLD_ROOT_PUBLIC_KEY){ $this->authenticated = true; //we're signed into xbox live } From c86c9b3ead1cc0df84bc4ddd102148012f6a2e84 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 11:43:36 +0100 Subject: [PATCH 1156/1858] Update Composer dependencies --- composer.lock | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/composer.lock b/composer.lock index 2bed1c3243..27343a0c66 100644 --- a/composer.lock +++ b/composer.lock @@ -224,16 +224,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "2.3.0+bedrock-1.20.0", + "version": "2.3.1+bedrock-1.20.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9" + "reference": "fb89ccdc039252462d8d068a769635e24151b7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9", - "reference": "b3dd3f4b8e3b6759c5d84de6ec85bb20b668c3a9", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/fb89ccdc039252462d8d068a769635e24151b7e2", + "reference": "fb89ccdc039252462d8d068a769635e24151b7e2", "shasum": "" }, "type": "library", @@ -244,9 +244,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockData/tree/2.3.1+bedrock-1.20.0" }, - "time": "2023-06-07T19:06:47+00:00" + "time": "2023-06-13T16:42:09+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -1089,16 +1089,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.23", + "version": "v5.4.25", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5" + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "shasum": "" }, "require": { @@ -1133,7 +1133,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.23" + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" }, "funding": [ { @@ -1149,7 +1149,7 @@ "type": "tidelift" } ], - "time": "2023-03-02T11:38:35+00:00" + "time": "2023-05-31T13:04:02+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1571,16 +1571,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.5", + "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" + "reference": "19526a33fb561ef417e822e85f08a00db4059c17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", "shasum": "" }, "require": { @@ -1621,9 +1621,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" }, - "time": "2023-05-19T20:20:00+00:00" + "time": "2023-06-25T14:52:30+00:00" }, { "name": "phar-io/manifest", @@ -2221,16 +2221,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.1.3", + "version": "10.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d" + "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2379ebafc1737e71cdc84f402acb6b7f04198b9d", - "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35c8cac1734ede2ae354a6644f7088356ff5b08e", + "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e", "shasum": "" }, "require": { @@ -2270,7 +2270,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.2-dev" } }, "autoload": { @@ -2302,7 +2302,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.3" }, "funding": [ { @@ -2318,7 +2318,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T05:16:22+00:00" + "time": "2023-06-30T06:17:38+00:00" }, { "name": "sebastian/cli-parser", From e61796b146b2b4f59dafceb3563eeb0732db38ff Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 11:49:44 +0100 Subject: [PATCH 1157/1858] Composer: do not allow automatic minor dependency updates manual intervention should always be used here, since we need to present a consistent API to plugins. --- composer.json | 8 ++++---- composer.lock | 38 +++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 09501a7bad..8359b55ba7 100644 --- a/composer.json +++ b/composer.json @@ -31,8 +31,8 @@ "ext-zip": "*", "ext-zlib": ">=1.2.11", "composer-runtime-api": "^2.0", - "adhocore/json-comment": "^1.1", - "fgrosse/phpasn1": "^2.3", + "adhocore/json-comment": "~1.2.0", + "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.999", "pocketmine/bedrock-block-upgrade-schema": "~2.2.0+bedrock-1.20.0", "pocketmine/bedrock-data": "~2.3.0+bedrock-1.20.0", @@ -49,8 +49,8 @@ "pocketmine/raklib": "^0.15.0", "pocketmine/raklib-ipc": "^0.2.0", "pocketmine/snooze": "^0.5.0", - "ramsey/uuid": "^4.1", - "symfony/filesystem": "^6.2" + "ramsey/uuid": "~4.7.0", + "symfony/filesystem": "~6.2.0" }, "require-dev": { "phpstan/phpstan": "1.10.16", diff --git a/composer.lock b/composer.lock index e27182c1c4..c3aa53e98d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5483e35c09044ab9d989cec8fdf4a399", + "content-hash": "3b102702eabc31fd8b2651db6c259397", "packages": [ { "name": "adhocore/json-comment", @@ -998,16 +998,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.2.10", + "version": "v6.2.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894" + "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/fd588debf7d1bc16a2c84b4b3b71145d9946b894", - "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b0818e7203e53540f2a5c9a5017d97897df1e9bb", + "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb", "shasum": "" }, "require": { @@ -1041,7 +1041,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.10" + "source": "https://github.com/symfony/filesystem/tree/v6.2.12" }, "funding": [ { @@ -1057,7 +1057,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-06-01T08:29:37+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1287,16 +1287,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.5", + "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" + "reference": "19526a33fb561ef417e822e85f08a00db4059c17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", "shasum": "" }, "require": { @@ -1337,9 +1337,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" }, - "time": "2023-05-19T20:20:00+00:00" + "time": "2023-06-25T14:52:30+00:00" }, { "name": "phar-io/manifest", @@ -1937,16 +1937,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.2", + "version": "10.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1ab521b24b88b88310c40c26c0cc4a94ba40ff95" + "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1ab521b24b88b88310c40c26c0cc4a94ba40ff95", - "reference": "1ab521b24b88b88310c40c26c0cc4a94ba40ff95", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35c8cac1734ede2ae354a6644f7088356ff5b08e", + "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e", "shasum": "" }, "require": { @@ -2018,7 +2018,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.3" }, "funding": [ { @@ -2034,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2023-06-11T06:15:20+00:00" + "time": "2023-06-30T06:17:38+00:00" }, { "name": "sebastian/cli-parser", From 321972b87b36bced53fb40f4a5fbd76d2d0e21ec Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 11:57:13 +0100 Subject: [PATCH 1158/1858] Composer: do not allow automatic minor dependency updates manual intervention should always be used here, since we need to present a consistent API to plugins. --- composer.json | 10 +++++----- composer.lock | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index f80e2aad69..028af15bd1 100644 --- a/composer.json +++ b/composer.json @@ -31,8 +31,8 @@ "ext-zip": "*", "ext-zlib": ">=1.2.11", "composer-runtime-api": "^2.0", - "adhocore/json-comment": "^1.1", - "fgrosse/phpasn1": "^2.3", + "adhocore/json-comment": "~1.2.0", + "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.999", "pocketmine/bedrock-block-upgrade-schema": "~2.2.0+bedrock-1.20.0", "pocketmine/bedrock-data": "~2.3.0+bedrock-1.20.0", @@ -51,9 +51,9 @@ "pocketmine/raklib": "^0.14.2", "pocketmine/raklib-ipc": "^0.1.0", "pocketmine/snooze": "^0.3.0", - "ramsey/uuid": "^4.1", - "symfony/filesystem": "^5.4", - "webmozart/path-util": "^2.3" + "ramsey/uuid": "~4.7.0", + "symfony/filesystem": "~5.4.0", + "webmozart/path-util": "~2.3.0" }, "require-dev": { "phpstan/phpstan": "1.10.15", diff --git a/composer.lock b/composer.lock index 27343a0c66..64b63f866b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fcfde015c4c61d0a422234b5858b98a7", + "content-hash": "01dabd17488f8f5a5ac5c65b9eb8eea4", "packages": [ { "name": "adhocore/json-comment", From 1698eac6dc9dcecbe3c3ef6e23154ece0aabc875 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 12:04:59 +0100 Subject: [PATCH 1159/1858] Release 4.22.2 --- changelogs/4.22.md | 14 ++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/changelogs/4.22.md b/changelogs/4.22.md index 9f38e53b6b..9df65fbf98 100644 --- a/changelogs/4.22.md +++ b/changelogs/4.22.md @@ -32,3 +32,17 @@ Released 9th June 2023. - The original client bug has still not been fixed, meaning a new workaround was needed, but no perfect solution could be found. - The new workaround involves broadcasting teleport movements as regular movements, which causes unwanted interpolation between the old and new positions, but otherwise works correctly. This solution is not ideal, but it is the best we can do for now. - See issues [#4394](https://github.com/pmmp/PocketMine-MP/issues/4394) and [#5810](https://github.com/pmmp/PocketMine-MP/issues/5810) for more details. + +# 4.22.2 +Released 1st July 2023. + +## Changes +- Added obsoletion warnings to the server log at the end of the startup sequence. + +## Fixes +- Fixed players being disconnected en masse with "Not authenticated" messages. + - This occurred due to a check intended to disable the old authentication key after July 1st. + - We expected that the new key would have been deployed by Mojang by now, but it seems like that has not yet happened. + - Due to the lack of a hard date for the key changeover, we guessed that July 1st would be a safe bet, but this appears to have backfired. + - This version will accept both old and new keys indefinitely. + - A security release will be published to remove the old key after the transition occurs. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 3d719e3b50..7d3e92073e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.22.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From bbabccfc89d688c47dff1fcf08cc39166ea7b3c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 12:04:59 +0100 Subject: [PATCH 1160/1858] 4.22.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7d3e92073e..7cb5ff4d3f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.22.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.22.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 2278275505a7f9d768027673e699e6199575c8bc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 12:18:10 +0100 Subject: [PATCH 1161/1858] Release 5.1.3 --- changelogs/5.1.md | 22 ++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/changelogs/5.1.md b/changelogs/5.1.md index 6b00f56245..b6b39bc189 100644 --- a/changelogs/5.1.md +++ b/changelogs/5.1.md @@ -28,3 +28,25 @@ Released 9th June 2023. - [4.22.1](https://github.com/pmmp/PocketMine-MP/blob/4.22.1/changelogs/4.22.md#4221) - Teleportation client bug workarounds This release contains no other changes. + +# 5.1.3 +Released 1st July 2023. + +**This release includes changes from the following releases:** +- [4.22.2](https://github.com/pmmp/PocketMine-MP/blob/4.22.2/changelogs/4.22.md#4222) - Authentication time bomb fix + +## General +- Updated logos to new RGB-style logo. Thanks to @MrCakeSlayer and @HBIDamian for their efforts. +- Improved error messages generated by the world system when some version tags are missing from `level.dat` in Bedrock worlds. +- Outsourced Composer dependencies now only receive patch updates automatically (pinned using the `~` constraint). + - Minor and major updates now require manually updating `composer.json`, to ensure that the plugin API is not broken by libraries getting randomly updated from one patch release to the next. + +## Documentation +- Updated doc comment for `Player->setGamemode()` to remove outdated information. +- Added documentation for the `$clickVector` parameter of `Block->onInteract()` to specify that it is relative to the block's position. +- Added missing `@required` tag for `BlockStateUpgradeSchemaModelBlockRemap->newState`. + +### Fixes +- Fixed blue candles not appearing in the creative inventory. +- Fixed server crash when block-picking candle cakes. +- `World->useItemOn()` now ensures that the `$clickVector` components are always in the range of 0-1. Previously, any invalid values were accepted, potentially leading to a crash. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 3b9260f714..fd60fb686e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.1.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 41281db6a5e5c736f6b62b2c211d055ba19b58e4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 12:18:13 +0100 Subject: [PATCH 1162/1858] 5.1.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index fd60fb686e..f5a791db4a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.1.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.1.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From b78c18ad2d0a002029af93190a76b7a201a873a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 12:23:19 +0100 Subject: [PATCH 1163/1858] changelog: fix header size :( [ci skip] --- changelogs/5.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/5.1.md b/changelogs/5.1.md index b6b39bc189..9ef8e7b9b8 100644 --- a/changelogs/5.1.md +++ b/changelogs/5.1.md @@ -46,7 +46,7 @@ Released 1st July 2023. - Added documentation for the `$clickVector` parameter of `Block->onInteract()` to specify that it is relative to the block's position. - Added missing `@required` tag for `BlockStateUpgradeSchemaModelBlockRemap->newState`. -### Fixes +## Fixes - Fixed blue candles not appearing in the creative inventory. - Fixed server crash when block-picking candle cakes. - `World->useItemOn()` now ensures that the `$clickVector` components are always in the range of 0-1. Previously, any invalid values were accepted, potentially leading to a crash. From f8e6f036affaaca135103556bd2c7f15a943d29b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 13:24:50 +0100 Subject: [PATCH 1164/1858] AsyncPoolTest: added failing test case for AsyncTask::__destruct() reentrancy bug --- tests/phpunit/scheduler/AsyncPoolTest.php | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 9a61c33ffb..42c301be37 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -69,4 +69,36 @@ class AsyncPoolTest extends TestCase{ } self::assertTrue(PublishProgressRaceAsyncTask::$success, "Progress was not reported before task completion"); } + + /** + * This test ensures that the fix for an exotic AsyncTask::__destruct() reentrancy bug has not regressed. + * + * Due to an unset() in the function body, other AsyncTask::__destruct() calls could be triggered during + * an AsyncTask's destruction. If done in the wrong way, this could lead to a crash. + * + * @doesNotPerformAssertions This test is checking for a crash condition, not a specific output. + */ + public function testTaskDestructorReentrancy() : void{ + $this->pool->submitTask(new class extends AsyncTask{ + public function __construct(){ + $this->storeLocal("task", new class extends AsyncTask{ + + public function __construct(){ + $this->storeLocal("dummy", 1); + } + + public function onRun() : void{ + //dummy + } + }); + } + + public function onRun() : void{ + //dummy + } + }); + while($this->pool->collectTasks()){ + usleep(50 * 1000); + } + } } From 70dd9c737101dd2c6b5fd337e2226d3eb1bb571f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Jul 2023 13:27:32 +0100 Subject: [PATCH 1165/1858] AsyncTask: fixed reentrancy bug tested by f8e6f036affaaca135103556bd2c7f15a943d29b --- src/scheduler/AsyncTask.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 831753f4d1..c81557572f 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -252,9 +252,15 @@ abstract class AsyncTask extends \Threaded{ final public function __destruct(){ $this->reallyDestruct(); if(self::$threadLocalStorage !== null && isset(self::$threadLocalStorage[$h = spl_object_id($this)])){ - unset(self::$threadLocalStorage[$h]); - if(self::$threadLocalStorage->count() === 0){ + //Beware changing this code! + //This code may cause the GC to be triggered, causing destruction of other AsyncTasks (which may or may not + //have been indirectly referenced by the TLS). + //This may cause the code to be re-entered from a different context unexpectedly, causing a crash if handled + //incorrectly. + if(self::$threadLocalStorage->count() === 1){ self::$threadLocalStorage = null; + }else{ + unset(self::$threadLocalStorage[$h]); } } } From 644b417d2c1dcf6f7953f8d35e3419734eb420fa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Jul 2023 14:05:17 +0100 Subject: [PATCH 1166/1858] BlockStateData: added auxiliary toVanillaNbt() helper method toNbt() adds PM version metadata, which might not always be desired. --- src/data/bedrock/block/BlockStateData.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 00240832d5..ec62fa67e4 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -111,7 +111,10 @@ final class BlockStateData{ return new self($name, $states->getValue(), $version); } - public function toNbt() : CompoundTag{ + /** + * Encodes the blockstate as a TAG_Compound, exactly as it would be in vanilla Bedrock. + */ + public function toVanillaNbt() : CompoundTag{ $statesTag = CompoundTag::create(); foreach(Utils::stringifyKeys($this->states) as $key => $value){ $statesTag->setTag($key, $value); @@ -119,7 +122,15 @@ final class BlockStateData{ return CompoundTag::create() ->setString(self::TAG_NAME, $this->name) ->setInt(self::TAG_VERSION, $this->version) - ->setTag(self::TAG_STATES, $statesTag) + ->setTag(self::TAG_STATES, $statesTag); + } + + /** + * Encodes the blockstate as a TAG_Compound, but with extra PM-specific metadata, used for fixing bugs in old saved + * data. This should be used for anything saved to disk. + */ + public function toNbt() : CompoundTag{ + return $this->toVanillaNbt() ->setLong(VersionInfo::TAG_WORLD_DATA_VERSION, VersionInfo::WORLD_DATA_VERSION); } From 3abd592b1fbb3651c70dd9515c038c3359cbea72 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 3 Jul 2023 18:07:51 +0100 Subject: [PATCH 1167/1858] Update to pmmp/BedrockBlockUpgradeSchema@3.0.0 --- composer.json | 2 +- composer.lock | 16 ++++++++-------- src/world/format/io/GlobalBlockStateHandlers.php | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 5a9a68d508..75cc519b05 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.999", - "pocketmine/bedrock-block-upgrade-schema": "~2.2.0+bedrock-1.20.0", + "pocketmine/bedrock-block-upgrade-schema": "~3.0.0", "pocketmine/bedrock-data": "~2.3.0+bedrock-1.20.0", "pocketmine/bedrock-item-upgrade-schema": "~1.3.0+bedrock-1.20.0", "pocketmine/bedrock-protocol": "~22.0.0+bedrock-1.20.0", diff --git a/composer.lock b/composer.lock index c3aa53e98d..b327641272 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3b102702eabc31fd8b2651db6c259397", + "content-hash": "ff0fa864a7853011bf4620d870c47ac7", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "2.2.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5" + "reference": "8b72c47109e174ac7f17c3ac546748f8e49a5fdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5", - "reference": "79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/8b72c47109e174ac7f17c3ac546748f8e49a5fdf", + "reference": "8b72c47109e174ac7f17c3ac546748f8e49a5fdf", "shasum": "" }, "type": "library", @@ -218,9 +218,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/2.2.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.0.0" }, - "time": "2023-05-04T21:49:36+00:00" + "time": "2023-07-03T16:35:44+00:00" }, { "name": "pocketmine/bedrock-data", @@ -3020,7 +3020,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.1", + "ext-pmmpthread": "^6.0.4", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index ed162c8cae..c1d3934cf3 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -70,7 +70,7 @@ final class GlobalBlockStateHandlers{ BlockIdMetaUpgrader::loadFromString( Filesystem::fileGetContents(Path::join( BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, - '1.12.0_to_1.18.10_blockstate_map.bin' + 'id_meta_to_nbt/1.12.0.bin' )), LegacyBlockIdToStringIdMap::getInstance(), $blockStateUpgrader From 6cbb03bf9bf0203e85ea8219c130aa56151d426a Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 3 Jul 2023 18:18:30 +0100 Subject: [PATCH 1168/1858] README: change title of discussion section [ci skip] I've always hated the way the / looks here --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ded0895bae..9f8c6a326a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - [Docker image](https://github.com/pmmp/PocketMine-MP/pkgs/container/pocketmine-mp) - [Plugin repository](https://poggit.pmmp.io/plugins) -## Discussion/Help +## Community & Support - [Forums](https://forums.pmmp.io/) - [Discord](https://discord.gg/bmSAZBG) - [StackOverflow](https://stackoverflow.com/tags/pocketmine) From a34514c6a1a2f9f5a89d7de69381a8b9c97970fc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 4 Jul 2023 15:55:55 +0100 Subject: [PATCH 1169/1858] RuntimeDataDescriber: document that this is a sealed interface --- src/data/runtime/RuntimeDataDescriber.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 6be781a0f1..36822a6f39 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -27,6 +27,14 @@ use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Facing; +/** + * Interface implemented by {@link RuntimeDataReader}, {@link RuntimeDataWriter} and {@link RuntimeDataSizeCalculator}. + * Used to describe the structure of runtime data to an implementation. + * + * This interface should be considered **sealed**. + * You may use it as a type for parameters and return values, but it should not be implemented outside of this package. + * New methods may be added without warning. + */ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function int(int $bits, int &$value) : void; From e6de9a70a211e1c2f4472dc2c4a0155ba0ffa5b2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 4 Jul 2023 15:58:09 +0100 Subject: [PATCH 1170/1858] Release 5.2.0 --- changelogs/5.2.md | 71 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 changelogs/5.2.md diff --git a/changelogs/5.2.md b/changelogs/5.2.md new file mode 100644 index 0000000000..7581c5e368 --- /dev/null +++ b/changelogs/5.2.md @@ -0,0 +1,71 @@ +# 5.2.0 +Released 4th July 2023. + +**For Minecraft: Bedrock Edition 1.20.0** + +This is a minor technical update, including changes to AsyncTask error handling and support for BedrockBlockUpgradeSchema version 3.0.0. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## Core +- [BedrockBlockUpgradeSchema version 3.0.0]() is now supported. +- [`ext-pmmpthread` version 6.0.4]() is now required (bug fixes required to support technical changes in this release). + +## Performance +- Improved performance of `AsyncPool->submitTask()` and `AsyncPool->submitTaskToWorker()`. +- Added new timings for `AsyncTask->onProgressUpdate()` and `AsyncTask->onCompletion()`. + +## Gameplay +### Blocks +- Added the following new blocks: + - Cherry Button + - Cherry Door + - Cherry Fence + - Cherry Fence Gate + - Cherry Leaves + - Cherry Log + - Cherry Planks + - Cherry Pressure Plate + - Cherry Sign + - Cherry Slab + - Cherry Stairs + - Cherry Trapdoor + - Cherry Wood + - Glow Lichen + - Piglin Head + +## Tools +- `generate-block-upgrade-schema.php` now supports generating schemas a la BedrockBlockUpgradeSchema version 3.0.0, using `newFlattenedName` to reduce schema size. +- Improved property remapping detection in `generate-block-upgrade-schema.php`. It now detects related properties with more confidence (even when multiple properties were change), and no longer considers unrelated properties as mapped (e.g. `mapped_type` and `deprecated` in 1.9->1.10). + +## API +### `pocketmine\data\bedrock\block` +- The following new API methods have been added: + - `public BlockStateData->toVanillaNbt() : CompoundTag` - returns the NBT for the blockstate without any PMMP extra metadata (`toNbt()` will normally include a `PMMPDataVersion` tag). + +### `pocketmine\data\runtime` +- The following new API methods have been added: + - `public RuntimeDataDescriber->facingFlags(list $faces) : void` + +### `pocketmine\scheduler` +- `AsyncTask->onRun()` no longer tolerates uncaught exceptions. + - This means that any uncaught exceptions thrown from `AsyncTask->onRun()` will now crash the worker thread, and by extension, the server. + - This change makes it easier to debug errors by detecting them earlier. +- The following API methods have been deprecated: + - `AsyncTask->onError()` + +## Internals +- `AsyncTask->progressUpdates` is now lazily initialized when a task publishes a progress update. + - This was previously not possible due to technical limitations of the `ext-pmmpthread` extension. + - This change improves performance of `AsyncPool->submitTask()` and `AsyncPool->submitTaskToWorker()`, as well as reducing the amount of work needed to check for progress updates on tick. +- Errors in `AsyncWorker` now cascade and crash the whole server. + - This makes it easier to debug errors by detecting them earlier. + - This includes all types of unexpected errors, such as OOM, uncaught exceptions, etc. + - This change is not expected to affect normal server operation, as worker threads are not expected to crash under normal circumstances. +- `AsyncTask::$threadLocalStorage` now uses a plain `array` instead of `ArrayObject`. The `ArrayObject` was a workaround for `ext-pthreads` to prevent thread-locals getting copied to the worker thread, and is no longer necessary. +- Regenerated `pocketmine\data\bedrock\item\ItemTypeNames` for Bedrock 1.20 (BC breaking, some item names have changed). +- Fixed `build/generate-item-type-names.php` not including some newer blockitems, such as doors and hanging signs. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 33af08c080..a3b0324f7e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.2.0"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From f0d5647aa213b348853225776e866c39e13a6be3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 4 Jul 2023 15:58:09 +0100 Subject: [PATCH 1171/1858] 5.2.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a3b0324f7e..2e9a6b75b0 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.2.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.2.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8f217ca6e01a31f39a07452f37142d0e94a7cbeb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 4 Jul 2023 16:12:01 +0100 Subject: [PATCH 1172/1858] Fixed borked changelog links --- changelogs/5.2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changelogs/5.2.md b/changelogs/5.2.md index 7581c5e368..5795a027a2 100644 --- a/changelogs/5.2.md +++ b/changelogs/5.2.md @@ -12,8 +12,8 @@ Do not update plugin minimum API versions unless you need new features added in Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. ## Core -- [BedrockBlockUpgradeSchema version 3.0.0]() is now supported. -- [`ext-pmmpthread` version 6.0.4]() is now required (bug fixes required to support technical changes in this release). +- [BedrockBlockUpgradeSchema version 3.0.0](https://github.com/pmmp/BedrockBlockUpgradeSchema/releases/tag/3.0.0) is now supported. +- [`ext-pmmpthread` version 6.0.4](https://github.com/pmmp/ext-pmmpthread/releases/tag/6.0.4) is now required (bug fixes required to support technical changes in this release). ## Performance - Improved performance of `AsyncPool->submitTask()` and `AsyncPool->submitTaskToWorker()`. From c01d2dc7181d8e2c98115c19d85759ab990860da Mon Sep 17 00:00:00 2001 From: BrandPVP <114182697+BrandPVP@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:08:13 +0300 Subject: [PATCH 1173/1858] CreativeInventory per Player (#5694) --- .../transaction/action/CreateItemAction.php | 3 +-- src/network/mcpe/InventoryManager.php | 3 +-- .../mcpe/handler/ItemStackRequestExecutor.php | 3 +-- src/player/Player.php | 22 +++++++++++++++++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/inventory/transaction/action/CreateItemAction.php b/src/inventory/transaction/action/CreateItemAction.php index 99605bf963..3ebda69004 100644 --- a/src/inventory/transaction/action/CreateItemAction.php +++ b/src/inventory/transaction/action/CreateItemAction.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\inventory\transaction\action; -use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\transaction\TransactionValidationException; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -43,7 +42,7 @@ class CreateItemAction extends InventoryAction{ if($source->hasFiniteResources()){ throw new TransactionValidationException("Player has finite resources, cannot create items"); } - if(!CreativeInventory::getInstance()->contains($this->sourceItem)){ + if(!$source->getCreativeInventory()->contains($this->sourceItem)){ throw new TransactionValidationException("Creative inventory does not contain requested item"); } } diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index bdd3a892df..a94dbe946e 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -35,7 +35,6 @@ use pocketmine\block\inventory\LoomInventory; use pocketmine\block\inventory\SmithingTableInventory; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\crafting\FurnaceType; -use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; @@ -603,7 +602,7 @@ class InventoryManager{ } public function syncCreative() : void{ - $this->session->sendDataPacket(CreativeInventoryCache::getInstance()->getCache(CreativeInventory::getInstance())); + $this->session->sendDataPacket(CreativeInventoryCache::getInstance()->getCache($this->player->getCreativeInventory())); } private function newItemStackId() : int{ diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index f9532291c3..10787f84be 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; -use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; @@ -327,7 +326,7 @@ class ItemStackRequestExecutor{ $this->builder->addAction(new DestroyItemAction($destroyed)); }elseif($action instanceof CreativeCreateStackRequestAction){ - $item = CreativeInventory::getInstance()->getItem($action->getCreativeItemId()); + $item = $this->player->getCreativeInventory()->getItem($action->getCreativeItemId()); if($item === null){ throw new ItemStackRequestProcessException("No such creative item index: " . $action->getCreativeItemId()); } diff --git a/src/player/Player.php b/src/player/Player.php index 11dabf7db6..4a13654d71 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -80,6 +80,7 @@ use pocketmine\event\player\PlayerViewDistanceChangeEvent; use pocketmine\form\Form; use pocketmine\form\FormValidationException; use pocketmine\inventory\CallbackInventoryListener; +use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\PlayerCraftingInventory; use pocketmine\inventory\PlayerCursorInventory; @@ -217,6 +218,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected array $permanentWindows = []; protected PlayerCursorInventory $cursorInventory; protected PlayerCraftingInventory $craftingGrid; + protected CreativeInventory $creativeInventory; protected int $messageCounter = 2; @@ -307,6 +309,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->uuid = $this->playerInfo->getUuid(); $this->xuid = $this->playerInfo instanceof XboxLivePlayerInfo ? $this->playerInfo->getXuid() : ""; + $this->creativeInventory = CreativeInventory::getInstance(); + $rootPermissions = [DefaultPermissions::ROOT_USER => true]; if($this->server->isOp($this->username)){ $rootPermissions[DefaultPermissions::ROOT_OPERATOR] = true; @@ -2532,6 +2536,24 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return $this->craftingGrid; } + /** + * Returns the creative inventory shown to the player. + * Unless changed by a plugin, this is usually the same for all players. + */ + public function getCreativeInventory() : CreativeInventory{ + return $this->creativeInventory; + } + + /** + * To set a custom creative inventory, you need to make a clone of a CreativeInventory instance. + */ + public function setCreativeInventory(CreativeInventory $inventory) : void{ + $this->creativeInventory = $inventory; + if($this->spawned && $this->isConnected()){ + $this->getNetworkSession()->getInvManager()?->syncCreative(); + } + } + /** * @internal Called to clean up crafting grid and cursor inventory when it is detected that the player closed their * inventory. From 0c250a2ef09627b48aa52302f6cc7e1f2afb70ea Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 12:53:29 +0100 Subject: [PATCH 1174/1858] InGamePacketHandler: fixed inconsistent handling of invalid data in BlockActorDataPacket --- .../mcpe/handler/InGamePacketHandler.php | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 329bcd6ef8..3ea3e0ad9d 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -113,9 +113,9 @@ use pocketmine\utils\TextFormat; use pocketmine\utils\Utils; use pocketmine\world\format\Chunk; use function array_push; -use function base64_encode; use function count; use function fmod; +use function get_debug_type; use function implode; use function in_array; use function is_bool; @@ -748,27 +748,32 @@ class InGamePacketHandler extends PacketHandler{ if(!($nbt instanceof CompoundTag)) throw new AssumptionFailedError("PHPStan should ensure this is a CompoundTag"); //for phpstorm's benefit if($block instanceof BaseSign){ - if(($textBlobTag = $nbt->getCompoundTag(Sign::TAG_FRONT_TEXT)?->getTag(Sign::TAG_TEXT_BLOB)) instanceof StringTag){ - try{ - $text = SignText::fromBlob($textBlobTag->getValue()); - }catch(\InvalidArgumentException $e){ - throw PacketHandlingException::wrap($e, "Invalid sign text update"); - } - - try{ - if(!$block->updateText($this->player, $text)){ - foreach($this->player->getWorld()->createBlockUpdatePackets([$pos]) as $updatePacket){ - $this->session->sendDataPacket($updatePacket); - } - } - }catch(\UnexpectedValueException $e){ - throw PacketHandlingException::wrap($e); - } - - return true; + $frontTextTag = $nbt->getTag(Sign::TAG_FRONT_TEXT); + if(!$frontTextTag instanceof CompoundTag){ + throw new PacketHandlingException("Invalid tag type " . get_debug_type($frontTextTag) . " for tag \"" . Sign::TAG_FRONT_TEXT . "\" in sign update data"); + } + $textBlobTag = $frontTextTag->getTag(Sign::TAG_TEXT_BLOB); + if(!$textBlobTag instanceof StringTag){ + throw new PacketHandlingException("Invalid tag type " . get_debug_type($textBlobTag) . " for tag \"" . Sign::TAG_TEXT_BLOB . "\" in sign update data"); } - $this->session->getLogger()->debug("Invalid sign update data: " . base64_encode($packet->nbt->getEncodedNbt())); + try{ + $text = SignText::fromBlob($textBlobTag->getValue()); + }catch(\InvalidArgumentException $e){ + throw PacketHandlingException::wrap($e, "Invalid sign text update"); + } + + try{ + if(!$block->updateText($this->player, $text)){ + foreach($this->player->getWorld()->createBlockUpdatePackets([$pos]) as $updatePacket){ + $this->session->sendDataPacket($updatePacket); + } + } + }catch(\UnexpectedValueException $e){ + throw PacketHandlingException::wrap($e); + } + + return true; } return false; From aacc00a911c62ad3d37958f459a027d1ccbcf815 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 15:10:35 +0100 Subject: [PATCH 1175/1858] update-updater-api: do not allow multiple jobs to run simultaneously this would result in git conflicts if multiple releases are made at the same time closes #5814 --- .github/workflows/update-updater-api.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index d3a4001360..7a695306be 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -8,6 +8,7 @@ on: jobs: build: runs-on: ubuntu-latest + concurrency: update-updater-api # only one job can run at a time, to avoid git conflicts when updating the repository steps: - name: Install jq From 8ebcdb452dac95cf727f6b515bd10ea0505215bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 16:01:38 +0100 Subject: [PATCH 1176/1858] Release 4.22.3 --- changelogs/4.22.md | 10 ++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/changelogs/4.22.md b/changelogs/4.22.md index 9df65fbf98..10c4ddea3d 100644 --- a/changelogs/4.22.md +++ b/changelogs/4.22.md @@ -46,3 +46,13 @@ Released 1st July 2023. - Due to the lack of a hard date for the key changeover, we guessed that July 1st would be a safe bet, but this appears to have backfired. - This version will accept both old and new keys indefinitely. - A security release will be published to remove the old key after the transition occurs. + +# 4.22.3 +Released 11th July 2023. + +## Fixes +- Fixed mishandling of NBT leading to a server crash when editing signs. +- Fixed an edge case crash that could occur in `AsyncTask->__destruct()` when thread-local storage referenced other `AsyncTask` objects. + +## Internals +- Added a concurrency lock to prevent the `update-updater-api` GitHub Action from running for multiple releases at the same time (which would have caused one of them to fail due to git conflicts). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7cb5ff4d3f..8c34fac25f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.22.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From cfd9950b020f962b4af05ed989e93877dcf4a0d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 16:01:42 +0100 Subject: [PATCH 1177/1858] 4.22.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8c34fac25f..a47fd8a7e5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.22.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.22.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 200e5f940c39ea17a1a16c6afe4b191df15896dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 16:04:42 +0100 Subject: [PATCH 1178/1858] Release 5.2.1 --- changelogs/5.2.md | 8 ++++++++ src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/changelogs/5.2.md b/changelogs/5.2.md index 5795a027a2..75f31a076a 100644 --- a/changelogs/5.2.md +++ b/changelogs/5.2.md @@ -69,3 +69,11 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - `AsyncTask::$threadLocalStorage` now uses a plain `array` instead of `ArrayObject`. The `ArrayObject` was a workaround for `ext-pthreads` to prevent thread-locals getting copied to the worker thread, and is no longer necessary. - Regenerated `pocketmine\data\bedrock\item\ItemTypeNames` for Bedrock 1.20 (BC breaking, some item names have changed). - Fixed `build/generate-item-type-names.php` not including some newer blockitems, such as doors and hanging signs. + +# 5.2.1 +Released 11th July 2023. + +**This release includes changes from the following releases:** +- [4.22.3](https://github.com/pmmp/PocketMine-MP/blob/4.22.3/changelogs/4.22.md#4223) - Fixes for some crash issues + +This release contains no other changes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2e9a6b75b0..3cebf3e659 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.2.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 93d3f439bfdbb37aeb33f110b8c14b6191316ca2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Jul 2023 16:04:43 +0100 Subject: [PATCH 1179/1858] 5.2.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 3cebf3e659..a679305985 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.2.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.2.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From f7977c9668b4e3fc03f1973c4c4ba37c0b665236 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 12:10:09 +0100 Subject: [PATCH 1180/1858] Update build/php submodule to pmmp/PHP-Binaries@16378ffcc39036cf4905d32ce845b2c831db4331 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index f2ece7b30d..16378ffcc3 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit f2ece7b30d0364eebf1d79497003cfda1dc41aa8 +Subproject commit 16378ffcc39036cf4905d32ce845b2c831db4331 From f2193d1ba7f0e58cbd6740cb554d95ee530355d4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 13:23:47 +0100 Subject: [PATCH 1181/1858] 1.20.10 --- composer.json | 8 ++--- composer.lock | 50 ++++++++++++++--------------- src/network/mcpe/NetworkSession.php | 6 ++-- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/composer.json b/composer.json index 028af15bd1..4e3d99392e 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.999", - "pocketmine/bedrock-block-upgrade-schema": "~2.2.0+bedrock-1.20.0", - "pocketmine/bedrock-data": "~2.3.0+bedrock-1.20.0", - "pocketmine/bedrock-item-upgrade-schema": "~1.3.0+bedrock-1.20.0", - "pocketmine/bedrock-protocol": "~22.0.0+bedrock-1.20.0", + "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", + "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", + "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", + "pocketmine/bedrock-protocol": "~23.0.0+bedrock-1.20.10", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 64b63f866b..9c6d13de08 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "01dabd17488f8f5a5ac5c65b9eb8eea4", + "content-hash": "390992e13478ee71580805f5f7d293a2", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "2.2.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5" + "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5", - "reference": "79bb3ad542ef19e828fdf1fa6adc54f1fa4b3bb5", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/6d4ae416043337946a22fc31e8065ca2c21f472d", + "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d", "shasum": "" }, "type": "library", @@ -218,22 +218,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/2.2.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.1.0" }, - "time": "2023-05-04T21:49:36+00:00" + "time": "2023-07-12T12:05:36+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.3.1+bedrock-1.20.0", + "version": "2.4.0+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "fb89ccdc039252462d8d068a769635e24151b7e2" + "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/fb89ccdc039252462d8d068a769635e24151b7e2", - "reference": "fb89ccdc039252462d8d068a769635e24151b7e2", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/f98bd1cae46d2920058acf3b23c0bedeac79f4ab", + "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab", "shasum": "" }, "type": "library", @@ -244,22 +244,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.3.1+bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.10" }, - "time": "2023-06-13T16:42:09+00:00" + "time": "2023-07-12T11:51:54+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "b16c59cfae08833f180dd82f88de7c1f43bc67c9" + "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/b16c59cfae08833f180dd82f88de7c1f43bc67c9", - "reference": "b16c59cfae08833f180dd82f88de7c1f43bc67c9", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/60d199afe5e371fd189b21d685ec1fed6ba54230", + "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.3.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.4.0" }, - "time": "2023-05-18T15:34:32+00:00" + "time": "2023-07-12T12:08:37+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "22.0.0+bedrock-1.20.0", + "version": "23.0.0+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "ceff28a0bd5d248f37fb97be3e836d536e37526e" + "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ceff28a0bd5d248f37fb97be3e836d536e37526e", - "reference": "ceff28a0bd5d248f37fb97be3e836d536e37526e", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cfaafdc02cca882a50773d6c02ebfeb622614e2", + "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/22.0.0+bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.0+bedrock-1.20.10" }, - "time": "2023-06-07T19:22:05+00:00" + "time": "2023-07-12T12:19:40+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index d87c1b9a84..79118f1fa2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -84,6 +84,7 @@ use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\command\CommandData; use pocketmine\network\mcpe\protocol\types\command\CommandEnum; +use pocketmine\network\mcpe\protocol\types\command\CommandOverload; use pocketmine\network\mcpe\protocol\types\command\CommandParameter; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; use pocketmine\network\mcpe\protocol\types\DimensionIds; @@ -949,8 +950,9 @@ class NetworkSession{ 0, $aliasObj, [ - [CommandParameter::standard("args", AvailableCommandsPacket::ARG_TYPE_RAWTEXT, 0, true)] - ] + new CommandOverload(chaining: false, parameters: [CommandParameter::standard("args", AvailableCommandsPacket::ARG_TYPE_RAWTEXT, 0, true)]) + ], + chainedSubCommandData: [] ); $commandData[$command->getLabel()] = $data; From b7210755a7f23dc2db8a887d886b845544108541 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 13:39:39 +0100 Subject: [PATCH 1182/1858] 1.20.10 --- build/generate-block-serializer-consts.php | 4 +- composer.json | 8 +-- composer.lock | 50 +++++++++--------- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 3 +- .../bedrock/block/BlockStateStringValues.php | 15 ++++-- src/data/bedrock/block/BlockTypeNames.php | 34 +++++++++++- .../convert/BlockObjectToStateSerializer.php | 48 ++++++++++++++--- .../block/convert/BlockStateReader.php | 12 ++--- .../BlockStateToObjectDeserializer.php | 52 +++++++++++++++---- .../block/convert/BlockStateWriter.php | 10 ++-- src/data/bedrock/item/ItemTypeNames.php | 2 + src/network/mcpe/NetworkSession.php | 6 ++- src/world/format/io/data/BedrockWorldData.php | 4 +- 14 files changed, 180 insertions(+), 72 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 4cc8cfcb62..89cdcbe316 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -139,7 +139,7 @@ function generateBlockStateNames(BlockPaletteReport $data) : void{ fwrite($output, generateClassHeader(BlockStateNames::class)); foreach(Utils::stringifyKeys($data->seenStateValues) as $state => $values){ - $constName = mb_strtoupper(preg_replace("/^minecraft:/", "", $state) ?? throw new AssumptionFailedError("This regex is not invalid"), 'US-ASCII'); + $constName = mb_strtoupper(preg_replace("/^minecraft:/", "mc_", $state) ?? throw new AssumptionFailedError("This regex is not invalid"), 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$state\";\n"); } @@ -159,7 +159,7 @@ function generateBlockStringValues(BlockPaletteReport $data) : void{ continue; } $anyWritten = true; - $constName = mb_strtoupper(preg_replace("/^minecraft:/", "", $stateName) . "_" . $value, 'US-ASCII'); + $constName = mb_strtoupper(preg_replace("/^minecraft:/", "mc_", $stateName) . "_" . $value, 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$value\";\n"); } if($anyWritten){ diff --git a/composer.json b/composer.json index 75cc519b05..03b8c51772 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.999", - "pocketmine/bedrock-block-upgrade-schema": "~3.0.0", - "pocketmine/bedrock-data": "~2.3.0+bedrock-1.20.0", - "pocketmine/bedrock-item-upgrade-schema": "~1.3.0+bedrock-1.20.0", - "pocketmine/bedrock-protocol": "~22.0.0+bedrock-1.20.0", + "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", + "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", + "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", + "pocketmine/bedrock-protocol": "~23.0.0+bedrock-1.20.10", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index b327641272..b8a2ac39a2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ff0fa864a7853011bf4620d870c47ac7", + "content-hash": "e0c0208b3fc3d1b20fef20d2fc43fc90", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "8b72c47109e174ac7f17c3ac546748f8e49a5fdf" + "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/8b72c47109e174ac7f17c3ac546748f8e49a5fdf", - "reference": "8b72c47109e174ac7f17c3ac546748f8e49a5fdf", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/6d4ae416043337946a22fc31e8065ca2c21f472d", + "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d", "shasum": "" }, "type": "library", @@ -218,22 +218,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.0.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.1.0" }, - "time": "2023-07-03T16:35:44+00:00" + "time": "2023-07-12T12:05:36+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.3.1+bedrock-1.20.0", + "version": "2.4.0+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "fb89ccdc039252462d8d068a769635e24151b7e2" + "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/fb89ccdc039252462d8d068a769635e24151b7e2", - "reference": "fb89ccdc039252462d8d068a769635e24151b7e2", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/f98bd1cae46d2920058acf3b23c0bedeac79f4ab", + "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab", "shasum": "" }, "type": "library", @@ -244,22 +244,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.3.1+bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.10" }, - "time": "2023-06-13T16:42:09+00:00" + "time": "2023-07-12T11:51:54+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "b16c59cfae08833f180dd82f88de7c1f43bc67c9" + "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/b16c59cfae08833f180dd82f88de7c1f43bc67c9", - "reference": "b16c59cfae08833f180dd82f88de7c1f43bc67c9", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/60d199afe5e371fd189b21d685ec1fed6ba54230", + "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.3.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.4.0" }, - "time": "2023-05-18T15:34:32+00:00" + "time": "2023-07-12T12:08:37+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "22.0.0+bedrock-1.20.0", + "version": "23.0.0+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "ceff28a0bd5d248f37fb97be3e836d536e37526e" + "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ceff28a0bd5d248f37fb97be3e836d536e37526e", - "reference": "ceff28a0bd5d248f37fb97be3e836d536e37526e", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cfaafdc02cca882a50773d6c02ebfeb622614e2", + "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/22.0.0+bedrock-1.20.0" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.0+bedrock-1.20.10" }, - "time": "2023-06-07T19:22:05+00:00" + "time": "2023-07-12T12:19:40+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index ec62fa67e4..f7b7612509 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (0 << 8) | //patch - (33); //revision + (10 << 8) | //patch + (32); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index fe38ff0730..f38ba78e99 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -98,7 +98,8 @@ final class BlockStateNames{ public const LEVER_DIRECTION = "lever_direction"; public const LIQUID_DEPTH = "liquid_depth"; public const LIT = "lit"; - public const CARDINAL_DIRECTION = "minecraft:cardinal_direction"; + public const MC_CARDINAL_DIRECTION = "minecraft:cardinal_direction"; + public const MC_FACING_DIRECTION = "minecraft:facing_direction"; public const MOISTURIZED_AMOUNT = "moisturized_amount"; public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index ca3ef73ba6..5834b2df49 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -131,10 +131,17 @@ final class BlockStateStringValues{ public const LEVER_DIRECTION_UP_NORTH_SOUTH = "up_north_south"; public const LEVER_DIRECTION_WEST = "west"; - public const CARDINAL_DIRECTION_EAST = "east"; - public const CARDINAL_DIRECTION_NORTH = "north"; - public const CARDINAL_DIRECTION_SOUTH = "south"; - public const CARDINAL_DIRECTION_WEST = "west"; + public const MC_CARDINAL_DIRECTION_EAST = "east"; + public const MC_CARDINAL_DIRECTION_NORTH = "north"; + public const MC_CARDINAL_DIRECTION_SOUTH = "south"; + public const MC_CARDINAL_DIRECTION_WEST = "west"; + + public const MC_FACING_DIRECTION_DOWN = "down"; + public const MC_FACING_DIRECTION_EAST = "east"; + public const MC_FACING_DIRECTION_NORTH = "north"; + public const MC_FACING_DIRECTION_SOUTH = "south"; + public const MC_FACING_DIRECTION_UP = "up"; + public const MC_FACING_DIRECTION_WEST = "west"; public const MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK = "chiseled_stone_brick"; public const MONSTER_EGG_STONE_TYPE_COBBLESTONE = "cobblestone"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index d8f6884af4..48b1c29f0f 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -98,7 +98,9 @@ final class BlockTypeNames{ public const BLACK_CANDLE = "minecraft:black_candle"; public const BLACK_CANDLE_CAKE = "minecraft:black_candle_cake"; public const BLACK_CARPET = "minecraft:black_carpet"; + public const BLACK_CONCRETE = "minecraft:black_concrete"; public const BLACK_GLAZED_TERRACOTTA = "minecraft:black_glazed_terracotta"; + public const BLACK_SHULKER_BOX = "minecraft:black_shulker_box"; public const BLACK_WOOL = "minecraft:black_wool"; public const BLACKSTONE = "minecraft:blackstone"; public const BLACKSTONE_DOUBLE_SLAB = "minecraft:blackstone_double_slab"; @@ -109,8 +111,10 @@ final class BlockTypeNames{ public const BLUE_CANDLE = "minecraft:blue_candle"; public const BLUE_CANDLE_CAKE = "minecraft:blue_candle_cake"; public const BLUE_CARPET = "minecraft:blue_carpet"; + public const BLUE_CONCRETE = "minecraft:blue_concrete"; public const BLUE_GLAZED_TERRACOTTA = "minecraft:blue_glazed_terracotta"; public const BLUE_ICE = "minecraft:blue_ice"; + public const BLUE_SHULKER_BOX = "minecraft:blue_shulker_box"; public const BLUE_WOOL = "minecraft:blue_wool"; public const BONE_BLOCK = "minecraft:bone_block"; public const BOOKSHELF = "minecraft:bookshelf"; @@ -122,9 +126,11 @@ final class BlockTypeNames{ public const BROWN_CANDLE = "minecraft:brown_candle"; public const BROWN_CANDLE_CAKE = "minecraft:brown_candle_cake"; public const BROWN_CARPET = "minecraft:brown_carpet"; + public const BROWN_CONCRETE = "minecraft:brown_concrete"; public const BROWN_GLAZED_TERRACOTTA = "minecraft:brown_glazed_terracotta"; public const BROWN_MUSHROOM = "minecraft:brown_mushroom"; public const BROWN_MUSHROOM_BLOCK = "minecraft:brown_mushroom_block"; + public const BROWN_SHULKER_BOX = "minecraft:brown_shulker_box"; public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; public const BUBBLE_CORAL = "minecraft:bubble_coral"; @@ -188,7 +194,6 @@ final class BlockTypeNames{ public const COLORED_TORCH_RG = "minecraft:colored_torch_rg"; public const COMMAND_BLOCK = "minecraft:command_block"; public const COMPOSTER = "minecraft:composter"; - public const CONCRETE = "minecraft:concrete"; public const CONCRETE_POWDER = "minecraft:concrete_powder"; public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; @@ -229,7 +234,9 @@ final class BlockTypeNames{ public const CYAN_CANDLE = "minecraft:cyan_candle"; public const CYAN_CANDLE_CAKE = "minecraft:cyan_candle_cake"; public const CYAN_CARPET = "minecraft:cyan_carpet"; + public const CYAN_CONCRETE = "minecraft:cyan_concrete"; public const CYAN_GLAZED_TERRACOTTA = "minecraft:cyan_glazed_terracotta"; + public const CYAN_SHULKER_BOX = "minecraft:cyan_shulker_box"; public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; @@ -455,12 +462,16 @@ final class BlockTypeNames{ public const GRAY_CANDLE = "minecraft:gray_candle"; public const GRAY_CANDLE_CAKE = "minecraft:gray_candle_cake"; public const GRAY_CARPET = "minecraft:gray_carpet"; + public const GRAY_CONCRETE = "minecraft:gray_concrete"; public const GRAY_GLAZED_TERRACOTTA = "minecraft:gray_glazed_terracotta"; + public const GRAY_SHULKER_BOX = "minecraft:gray_shulker_box"; public const GRAY_WOOL = "minecraft:gray_wool"; public const GREEN_CANDLE = "minecraft:green_candle"; public const GREEN_CANDLE_CAKE = "minecraft:green_candle_cake"; public const GREEN_CARPET = "minecraft:green_carpet"; + public const GREEN_CONCRETE = "minecraft:green_concrete"; public const GREEN_GLAZED_TERRACOTTA = "minecraft:green_glazed_terracotta"; + public const GREEN_SHULKER_BOX = "minecraft:green_shulker_box"; public const GREEN_WOOL = "minecraft:green_wool"; public const GRINDSTONE = "minecraft:grindstone"; public const HANGING_ROOTS = "minecraft:hanging_roots"; @@ -513,18 +524,24 @@ final class BlockTypeNames{ public const LIGHT_BLUE_CANDLE = "minecraft:light_blue_candle"; public const LIGHT_BLUE_CANDLE_CAKE = "minecraft:light_blue_candle_cake"; public const LIGHT_BLUE_CARPET = "minecraft:light_blue_carpet"; + public const LIGHT_BLUE_CONCRETE = "minecraft:light_blue_concrete"; public const LIGHT_BLUE_GLAZED_TERRACOTTA = "minecraft:light_blue_glazed_terracotta"; + public const LIGHT_BLUE_SHULKER_BOX = "minecraft:light_blue_shulker_box"; public const LIGHT_BLUE_WOOL = "minecraft:light_blue_wool"; public const LIGHT_GRAY_CANDLE = "minecraft:light_gray_candle"; public const LIGHT_GRAY_CANDLE_CAKE = "minecraft:light_gray_candle_cake"; public const LIGHT_GRAY_CARPET = "minecraft:light_gray_carpet"; + public const LIGHT_GRAY_CONCRETE = "minecraft:light_gray_concrete"; + public const LIGHT_GRAY_SHULKER_BOX = "minecraft:light_gray_shulker_box"; public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; public const LIME_CANDLE = "minecraft:lime_candle"; public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; public const LIME_CARPET = "minecraft:lime_carpet"; + public const LIME_CONCRETE = "minecraft:lime_concrete"; public const LIME_GLAZED_TERRACOTTA = "minecraft:lime_glazed_terracotta"; + public const LIME_SHULKER_BOX = "minecraft:lime_shulker_box"; public const LIME_WOOL = "minecraft:lime_wool"; public const LIT_BLAST_FURNACE = "minecraft:lit_blast_furnace"; public const LIT_DEEPSLATE_REDSTONE_ORE = "minecraft:lit_deepslate_redstone_ore"; @@ -538,7 +555,9 @@ final class BlockTypeNames{ public const MAGENTA_CANDLE = "minecraft:magenta_candle"; public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; public const MAGENTA_CARPET = "minecraft:magenta_carpet"; + public const MAGENTA_CONCRETE = "minecraft:magenta_concrete"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; + public const MAGENTA_SHULKER_BOX = "minecraft:magenta_shulker_box"; public const MAGENTA_WOOL = "minecraft:magenta_wool"; public const MAGMA = "minecraft:magma"; public const MANGROVE_BUTTON = "minecraft:mangrove_button"; @@ -600,7 +619,9 @@ final class BlockTypeNames{ public const ORANGE_CANDLE = "minecraft:orange_candle"; public const ORANGE_CANDLE_CAKE = "minecraft:orange_candle_cake"; public const ORANGE_CARPET = "minecraft:orange_carpet"; + public const ORANGE_CONCRETE = "minecraft:orange_concrete"; public const ORANGE_GLAZED_TERRACOTTA = "minecraft:orange_glazed_terracotta"; + public const ORANGE_SHULKER_BOX = "minecraft:orange_shulker_box"; public const ORANGE_WOOL = "minecraft:orange_wool"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; public const OXIDIZED_CUT_COPPER = "minecraft:oxidized_cut_copper"; @@ -613,8 +634,10 @@ final class BlockTypeNames{ public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_CARPET = "minecraft:pink_carpet"; + public const PINK_CONCRETE = "minecraft:pink_concrete"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; public const PINK_PETALS = "minecraft:pink_petals"; + public const PINK_SHULKER_BOX = "minecraft:pink_shulker_box"; public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; @@ -657,7 +680,9 @@ final class BlockTypeNames{ public const PURPLE_CANDLE = "minecraft:purple_candle"; public const PURPLE_CANDLE_CAKE = "minecraft:purple_candle_cake"; public const PURPLE_CARPET = "minecraft:purple_carpet"; + public const PURPLE_CONCRETE = "minecraft:purple_concrete"; public const PURPLE_GLAZED_TERRACOTTA = "minecraft:purple_glazed_terracotta"; + public const PURPLE_SHULKER_BOX = "minecraft:purple_shulker_box"; public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; public const PURPUR_STAIRS = "minecraft:purpur_stairs"; @@ -672,6 +697,7 @@ final class BlockTypeNames{ public const RED_CANDLE = "minecraft:red_candle"; public const RED_CANDLE_CAKE = "minecraft:red_candle_cake"; public const RED_CARPET = "minecraft:red_carpet"; + public const RED_CONCRETE = "minecraft:red_concrete"; public const RED_FLOWER = "minecraft:red_flower"; public const RED_GLAZED_TERRACOTTA = "minecraft:red_glazed_terracotta"; public const RED_MUSHROOM = "minecraft:red_mushroom"; @@ -680,6 +706,7 @@ final class BlockTypeNames{ public const RED_NETHER_BRICK_STAIRS = "minecraft:red_nether_brick_stairs"; public const RED_SANDSTONE = "minecraft:red_sandstone"; public const RED_SANDSTONE_STAIRS = "minecraft:red_sandstone_stairs"; + public const RED_SHULKER_BOX = "minecraft:red_shulker_box"; public const RED_WOOL = "minecraft:red_wool"; public const REDSTONE_BLOCK = "minecraft:redstone_block"; public const REDSTONE_LAMP = "minecraft:redstone_lamp"; @@ -705,7 +732,6 @@ final class BlockTypeNames{ public const SEA_PICKLE = "minecraft:sea_pickle"; public const SEAGRASS = "minecraft:seagrass"; public const SHROOMLIGHT = "minecraft:shroomlight"; - public const SHULKER_BOX = "minecraft:shulker_box"; public const SILVER_GLAZED_TERRACOTTA = "minecraft:silver_glazed_terracotta"; public const SKULL = "minecraft:skull"; public const SLIME = "minecraft:slime"; @@ -856,7 +882,9 @@ final class BlockTypeNames{ public const WHITE_CANDLE = "minecraft:white_candle"; public const WHITE_CANDLE_CAKE = "minecraft:white_candle_cake"; public const WHITE_CARPET = "minecraft:white_carpet"; + public const WHITE_CONCRETE = "minecraft:white_concrete"; public const WHITE_GLAZED_TERRACOTTA = "minecraft:white_glazed_terracotta"; + public const WHITE_SHULKER_BOX = "minecraft:white_shulker_box"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; public const WOOD = "minecraft:wood"; @@ -867,7 +895,9 @@ final class BlockTypeNames{ public const YELLOW_CANDLE = "minecraft:yellow_candle"; public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; public const YELLOW_CARPET = "minecraft:yellow_carpet"; + public const YELLOW_CONCRETE = "minecraft:yellow_concrete"; public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; + public const YELLOW_SHULKER_BOX = "minecraft:yellow_shulker_box"; public const YELLOW_WOOL = "minecraft:yellow_wool"; } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 7daddeeb0d..0ba6496dda 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -370,6 +370,46 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ DyeColor::YELLOW() => Ids::YELLOW_CARPET, default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) })); + + $this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_SHULKER_BOX, + DyeColor::BLUE() => Ids::BLUE_SHULKER_BOX, + DyeColor::BROWN() => Ids::BROWN_SHULKER_BOX, + DyeColor::CYAN() => Ids::CYAN_SHULKER_BOX, + DyeColor::GRAY() => Ids::GRAY_SHULKER_BOX, + DyeColor::GREEN() => Ids::GREEN_SHULKER_BOX, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_SHULKER_BOX, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_SHULKER_BOX, + DyeColor::LIME() => Ids::LIME_SHULKER_BOX, + DyeColor::MAGENTA() => Ids::MAGENTA_SHULKER_BOX, + DyeColor::ORANGE() => Ids::ORANGE_SHULKER_BOX, + DyeColor::PINK() => Ids::PINK_SHULKER_BOX, + DyeColor::PURPLE() => Ids::PURPLE_SHULKER_BOX, + DyeColor::RED() => Ids::RED_SHULKER_BOX, + DyeColor::WHITE() => Ids::WHITE_SHULKER_BOX, + DyeColor::YELLOW() => Ids::YELLOW_SHULKER_BOX, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + + $this->map(Blocks::CONCRETE(), fn(Concrete $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_CONCRETE, + DyeColor::BLUE() => Ids::BLUE_CONCRETE, + DyeColor::BROWN() => Ids::BROWN_CONCRETE, + DyeColor::CYAN() => Ids::CYAN_CONCRETE, + DyeColor::GRAY() => Ids::GRAY_CONCRETE, + DyeColor::GREEN() => Ids::GREEN_CONCRETE, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CONCRETE, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CONCRETE, + DyeColor::LIME() => Ids::LIME_CONCRETE, + DyeColor::MAGENTA() => Ids::MAGENTA_CONCRETE, + DyeColor::ORANGE() => Ids::ORANGE_CONCRETE, + DyeColor::PINK() => Ids::PINK_CONCRETE, + DyeColor::PURPLE() => Ids::PURPLE_CONCRETE, + DyeColor::RED() => Ids::RED_CONCRETE, + DyeColor::WHITE() => Ids::WHITE_CONCRETE, + DyeColor::YELLOW() => Ids::YELLOW_CONCRETE, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); } private function registerFlatCoralSerializers() : void{ @@ -1066,10 +1106,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::CONCRETE(), function(Concrete $block) : Writer{ - return Writer::create(Ids::CONCRETE) - ->writeColor($block->getColor()); - }); $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ return Writer::create(Ids::CONCRETE_POWDER) ->writeColor($block->getColor()); @@ -1136,10 +1172,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(Blocks::DYED_SHULKER_BOX(), function(DyedShulkerBox $block) : Writer{ - return Writer::create(Ids::SHULKER_BOX) - ->writeColor($block->getColor()); - }); $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index ff33ddcf70..09dab0f2c6 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -214,12 +214,12 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function readCardinalHorizontalFacing() : int{ - return match($raw = $this->readString(BlockStateNames::CARDINAL_DIRECTION)){ - StringValues::CARDINAL_DIRECTION_NORTH => Facing::NORTH, - StringValues::CARDINAL_DIRECTION_SOUTH => Facing::SOUTH, - StringValues::CARDINAL_DIRECTION_WEST => Facing::WEST, - StringValues::CARDINAL_DIRECTION_EAST => Facing::EAST, - default => throw $this->badValueException(BlockStateNames::CARDINAL_DIRECTION, $raw) + return match($raw = $this->readString(BlockStateNames::MC_CARDINAL_DIRECTION)){ + StringValues::MC_CARDINAL_DIRECTION_NORTH => Facing::NORTH, + StringValues::MC_CARDINAL_DIRECTION_SOUTH => Facing::SOUTH, + StringValues::MC_CARDINAL_DIRECTION_WEST => Facing::WEST, + StringValues::MC_CARDINAL_DIRECTION_EAST => Facing::EAST, + default => throw $this->badValueException(BlockStateNames::MC_CARDINAL_DIRECTION, $raw) }; } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 9e41452cde..65b896523a 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -244,6 +244,48 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::CARPET()->setColor($color)); } + + foreach([ + Ids::BLACK_SHULKER_BOX => DyeColor::BLACK(), + Ids::BLUE_SHULKER_BOX => DyeColor::BLUE(), + Ids::BROWN_SHULKER_BOX => DyeColor::BROWN(), + Ids::CYAN_SHULKER_BOX => DyeColor::CYAN(), + Ids::GRAY_SHULKER_BOX => DyeColor::GRAY(), + Ids::GREEN_SHULKER_BOX => DyeColor::GREEN(), + Ids::LIGHT_BLUE_SHULKER_BOX => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_SHULKER_BOX => DyeColor::LIGHT_GRAY(), + Ids::LIME_SHULKER_BOX => DyeColor::LIME(), + Ids::MAGENTA_SHULKER_BOX => DyeColor::MAGENTA(), + Ids::ORANGE_SHULKER_BOX => DyeColor::ORANGE(), + Ids::PINK_SHULKER_BOX => DyeColor::PINK(), + Ids::PURPLE_SHULKER_BOX => DyeColor::PURPLE(), + Ids::RED_SHULKER_BOX => DyeColor::RED(), + Ids::WHITE_SHULKER_BOX => DyeColor::WHITE(), + Ids::YELLOW_SHULKER_BOX => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); + } + + foreach([ + Ids::BLACK_CONCRETE => DyeColor::BLACK(), + Ids::BLUE_CONCRETE => DyeColor::BLUE(), + Ids::BROWN_CONCRETE => DyeColor::BROWN(), + Ids::CYAN_CONCRETE => DyeColor::CYAN(), + Ids::GRAY_CONCRETE => DyeColor::GRAY(), + Ids::GREEN_CONCRETE => DyeColor::GREEN(), + Ids::LIGHT_BLUE_CONCRETE => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_CONCRETE => DyeColor::LIGHT_GRAY(), + Ids::LIME_CONCRETE => DyeColor::LIME(), + Ids::MAGENTA_CONCRETE => DyeColor::MAGENTA(), + Ids::ORANGE_CONCRETE => DyeColor::ORANGE(), + Ids::PINK_CONCRETE => DyeColor::PINK(), + Ids::PURPLE_CONCRETE => DyeColor::PURPLE(), + Ids::RED_CONCRETE => DyeColor::RED(), + Ids::WHITE_CONCRETE => DyeColor::WHITE(), + Ids::YELLOW_CONCRETE => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::CONCRETE()->setColor($color)); + } } private function registerFlatCoralDeserializers() : void{ @@ -875,10 +917,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); }); - $this->map(Ids::CONCRETE, function(Reader $in) : Block{ - return Blocks::CONCRETE() - ->setColor($in->readColor()); - }); $this->map(Ids::CONCRETE_POWDER, function(Reader $in) : Block{ return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); @@ -1162,7 +1200,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS()); $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS()); $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ - $in->ignored(StateNames::CARDINAL_DIRECTION); //obsolete + $in->ignored(StateNames::MC_CARDINAL_DIRECTION); //obsolete return Blocks::PUMPKIN(); }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); @@ -1285,10 +1323,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::SHULKER_BOX, function(Reader $in) : Block{ - return Blocks::DYED_SHULKER_BOX() - ->setColor($in->readColor()); - }); $this->map(Ids::SKULL, function(Reader $in) : Block{ return Blocks::MOB_HEAD() ->setFacing($in->readFacingWithoutDown()); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 1d1428373a..2e2d8daae4 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -170,11 +170,11 @@ final class BlockStateWriter{ * @return $this */ public function writeCardinalHorizontalFacing(int $value) : self{ - return $this->writeString(BlockStateNames::CARDINAL_DIRECTION, match($value){ - Facing::SOUTH => StringValues::CARDINAL_DIRECTION_SOUTH, - Facing::WEST => StringValues::CARDINAL_DIRECTION_WEST, - Facing::NORTH => StringValues::CARDINAL_DIRECTION_NORTH, - Facing::EAST => StringValues::CARDINAL_DIRECTION_EAST, + return $this->writeString(BlockStateNames::MC_CARDINAL_DIRECTION, match($value){ + Facing::SOUTH => StringValues::MC_CARDINAL_DIRECTION_SOUTH, + Facing::WEST => StringValues::MC_CARDINAL_DIRECTION_WEST, + Facing::NORTH => StringValues::MC_CARDINAL_DIRECTION_NORTH, + Facing::EAST => StringValues::MC_CARDINAL_DIRECTION_EAST, default => throw new BlockStateSerializeException("Invalid horizontal facing $value") }); } diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 8dcbe0bda9..e0e3820e4c 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -124,6 +124,7 @@ final class ItemTypeNames{ public const COMPARATOR = "minecraft:comparator"; public const COMPASS = "minecraft:compass"; public const COMPOUND = "minecraft:compound"; + public const CONCRETE = "minecraft:concrete"; public const COOKED_BEEF = "minecraft:cooked_beef"; public const COOKED_CHICKEN = "minecraft:cooked_chicken"; public const COOKED_COD = "minecraft:cooked_cod"; @@ -405,6 +406,7 @@ final class ItemTypeNames{ public const SHEEP_SPAWN_EGG = "minecraft:sheep_spawn_egg"; public const SHELTER_POTTERY_SHERD = "minecraft:shelter_pottery_sherd"; public const SHIELD = "minecraft:shield"; + public const SHULKER_BOX = "minecraft:shulker_box"; public const SHULKER_SHELL = "minecraft:shulker_shell"; public const SHULKER_SPAWN_EGG = "minecraft:shulker_spawn_egg"; public const SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:silence_armor_trim_smithing_template"; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 9053dd6b63..b10e7f25ae 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -83,6 +83,7 @@ use pocketmine\network\mcpe\protocol\types\AbilitiesLayer; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\command\CommandData; use pocketmine\network\mcpe\protocol\types\command\CommandEnum; +use pocketmine\network\mcpe\protocol\types\command\CommandOverload; use pocketmine\network\mcpe\protocol\types\command\CommandParameter; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; use pocketmine\network\mcpe\protocol\types\DimensionIds; @@ -985,8 +986,9 @@ class NetworkSession{ 0, $aliasObj, [ - [CommandParameter::standard("args", AvailableCommandsPacket::ARG_TYPE_RAWTEXT, 0, true)] - ] + new CommandOverload(chaining: false, parameters: [CommandParameter::standard("args", AvailableCommandsPacket::ARG_TYPE_RAWTEXT, 0, true)]) + ], + chainedSubCommandData: [] ); $commandData[$command->getLabel()] = $data; diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 317ebd6801..f4e26257b8 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,11 +51,11 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 589; + public const CURRENT_STORAGE_NETWORK_VERSION = 594; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 0, //patch + 10, //patch 1, //revision 0 //is beta ]; From e903da8998bf0ba90ddd6306840a36d27adef176 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 13:44:16 +0100 Subject: [PATCH 1183/1858] Release 4.23.0 --- changelogs/4.23.md | 19 +++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.23.md diff --git a/changelogs/4.23.md b/changelogs/4.23.md new file mode 100644 index 0000000000..6a5c5d49a6 --- /dev/null +++ b/changelogs/4.23.md @@ -0,0 +1,19 @@ +# 4.23.0 +Released 12th July 2023. + +**For Minecraft: Bedrock Edition 1.20.10** + +This is a support release for Minecraft: Bedrock Edition 1.20.10. + +**Plugin compatibility:** Plugins for previous 4.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.10. +- Removed support for older versions. + +## Fixes +- Fixed Docker image build failure due to outdated `build/php` submodule. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a47fd8a7e5..4c1a3bf861 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.22.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.23.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 7e0b5cf73d8c42b8714fb4010cb3270d344eb0d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 13:44:16 +0100 Subject: [PATCH 1184/1858] 4.23.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4c1a3bf861..96ee4b01c6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From d630b3af7bbdd5754dedd1ca4dd6e486fd3012ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 14:07:58 +0100 Subject: [PATCH 1185/1858] Release 5.3.0 --- changelogs/5.3.md | 23 +++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.3.md diff --git a/changelogs/5.3.md b/changelogs/5.3.md new file mode 100644 index 0000000000..c575cf01b5 --- /dev/null +++ b/changelogs/5.3.md @@ -0,0 +1,23 @@ +# 5.3.0 +Released 12th July 2023. + +**For Minecraft: Bedrock Edition 1.20.10** + +This is a support release for Minecraft: Bedrock Edition 1.20.10. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## Interim releases +If you're upgrading directly from 5.1.x to 5.3.x, please also read the following changelogs, as the interim releases contain important changes: +- [5.2.0](https://github.com/pmmp/PocketMine-MP/blob/5.2.0/changelogs/5.2.md#520) + +## Included releases +**This release includes changes from the following releases:** +- [4.23.0](https://github.com/pmmp/PocketMine-MP/blob/4.23.0/changelogs/4.23.md#4230) - Support for Minecraft: Bedrock Edition 1.20.10 + +## Internals +- `BlockTypeNames`, `BlockStateNames`, `BlockStateStringValues` and `ItemTypeNames` in the `pocketmine\data\bedrock` package have BC-breaking changes to accommodate Bedrock 1.20.10. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a679305985..5b90e276fb 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.2.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.3.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From d4716ef457b49eec380a4a89da3c9e5f2ba086de Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2023 14:08:08 +0100 Subject: [PATCH 1186/1858] 5.3.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5b90e276fb..40e83b5d21 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.3.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From d2f4ba74c6879e408e105eb66a7e15abc01ef821 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jul 2023 12:59:43 +0100 Subject: [PATCH 1187/1858] Updated build/php submodule to pmmp/PHP-Binaries@e0c918d1379465964acefd562d9e48f87cfc2c9e --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 16378ffcc3..e0c918d137 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 16378ffcc39036cf4905d32ce845b2c831db4331 +Subproject commit e0c918d1379465964acefd562d9e48f87cfc2c9e From 7132ac0ad30c42105d903084249838f9ce3f29e1 Mon Sep 17 00:00:00 2001 From: ace Date: Thu, 13 Jul 2023 20:22:01 +0800 Subject: [PATCH 1188/1858] Implemented strong slowness potion (#5888) --- src/data/bedrock/PotionTypeIdMap.php | 1 + src/data/bedrock/PotionTypeIds.php | 1 + .../runtime/RuntimeEnumDeserializerTrait.php | 21 ++++++++++--------- .../runtime/RuntimeEnumSerializerTrait.php | 21 ++++++++++--------- src/item/PotionType.php | 4 ++++ src/item/StringToItemParser.php | 2 ++ 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/data/bedrock/PotionTypeIdMap.php b/src/data/bedrock/PotionTypeIdMap.php index 2e6fef3cc8..8194f24a26 100644 --- a/src/data/bedrock/PotionTypeIdMap.php +++ b/src/data/bedrock/PotionTypeIdMap.php @@ -84,6 +84,7 @@ final class PotionTypeIdMap{ $this->register(PotionTypeIds::STRONG_TURTLE_MASTER, PotionType::STRONG_TURTLE_MASTER()); $this->register(PotionTypeIds::SLOW_FALLING, PotionType::SLOW_FALLING()); $this->register(PotionTypeIds::LONG_SLOW_FALLING, PotionType::LONG_SLOW_FALLING()); + $this->register(PotionTypeIds::STRONG_SLOWNESS, PotionType::STRONG_SLOWNESS()); } private function register(int $id, PotionType $type) : void{ diff --git a/src/data/bedrock/PotionTypeIds.php b/src/data/bedrock/PotionTypeIds.php index aa69461cef..f2d82f39f5 100644 --- a/src/data/bedrock/PotionTypeIds.php +++ b/src/data/bedrock/PotionTypeIds.php @@ -66,4 +66,5 @@ final class PotionTypeIds{ public const STRONG_TURTLE_MASTER = 39; public const SLOW_FALLING = 40; public const LONG_SLOW_FALLING = 41; + public const STRONG_SLOWNESS = 42; } diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index c4864a7e7b..4774304a9b 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -190,16 +190,17 @@ trait RuntimeEnumDeserializerTrait{ 29 => \pocketmine\item\PotionType::STRONG_LEAPING(), 30 => \pocketmine\item\PotionType::STRONG_POISON(), 31 => \pocketmine\item\PotionType::STRONG_REGENERATION(), - 32 => \pocketmine\item\PotionType::STRONG_STRENGTH(), - 33 => \pocketmine\item\PotionType::STRONG_SWIFTNESS(), - 34 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER(), - 35 => \pocketmine\item\PotionType::SWIFTNESS(), - 36 => \pocketmine\item\PotionType::THICK(), - 37 => \pocketmine\item\PotionType::TURTLE_MASTER(), - 38 => \pocketmine\item\PotionType::WATER(), - 39 => \pocketmine\item\PotionType::WATER_BREATHING(), - 40 => \pocketmine\item\PotionType::WEAKNESS(), - 41 => \pocketmine\item\PotionType::WITHER(), + 32 => \pocketmine\item\PotionType::STRONG_SLOWNESS(), + 33 => \pocketmine\item\PotionType::STRONG_STRENGTH(), + 34 => \pocketmine\item\PotionType::STRONG_SWIFTNESS(), + 35 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER(), + 36 => \pocketmine\item\PotionType::SWIFTNESS(), + 37 => \pocketmine\item\PotionType::THICK(), + 38 => \pocketmine\item\PotionType::TURTLE_MASTER(), + 39 => \pocketmine\item\PotionType::WATER(), + 40 => \pocketmine\item\PotionType::WATER_BREATHING(), + 41 => \pocketmine\item\PotionType::WEAKNESS(), + 42 => \pocketmine\item\PotionType::WITHER(), default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for PotionType") }; } diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index fd65ffb42b..c570046c67 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -190,16 +190,17 @@ trait RuntimeEnumSerializerTrait{ \pocketmine\item\PotionType::STRONG_LEAPING() => 29, \pocketmine\item\PotionType::STRONG_POISON() => 30, \pocketmine\item\PotionType::STRONG_REGENERATION() => 31, - \pocketmine\item\PotionType::STRONG_STRENGTH() => 32, - \pocketmine\item\PotionType::STRONG_SWIFTNESS() => 33, - \pocketmine\item\PotionType::STRONG_TURTLE_MASTER() => 34, - \pocketmine\item\PotionType::SWIFTNESS() => 35, - \pocketmine\item\PotionType::THICK() => 36, - \pocketmine\item\PotionType::TURTLE_MASTER() => 37, - \pocketmine\item\PotionType::WATER() => 38, - \pocketmine\item\PotionType::WATER_BREATHING() => 39, - \pocketmine\item\PotionType::WEAKNESS() => 40, - \pocketmine\item\PotionType::WITHER() => 41, + \pocketmine\item\PotionType::STRONG_SLOWNESS() => 32, + \pocketmine\item\PotionType::STRONG_STRENGTH() => 33, + \pocketmine\item\PotionType::STRONG_SWIFTNESS() => 34, + \pocketmine\item\PotionType::STRONG_TURTLE_MASTER() => 35, + \pocketmine\item\PotionType::SWIFTNESS() => 36, + \pocketmine\item\PotionType::THICK() => 37, + \pocketmine\item\PotionType::TURTLE_MASTER() => 38, + \pocketmine\item\PotionType::WATER() => 39, + \pocketmine\item\PotionType::WATER_BREATHING() => 40, + \pocketmine\item\PotionType::WEAKNESS() => 41, + \pocketmine\item\PotionType::WITHER() => 42, default => throw new \pocketmine\utils\AssumptionFailedError("All PotionType cases should be covered") }); } diff --git a/src/item/PotionType.php b/src/item/PotionType.php index 7ec0f38761..e7feb0b8ec 100644 --- a/src/item/PotionType.php +++ b/src/item/PotionType.php @@ -65,6 +65,7 @@ use pocketmine\utils\EnumTrait; * @method static PotionType STRONG_LEAPING() * @method static PotionType STRONG_POISON() * @method static PotionType STRONG_REGENERATION() + * @method static PotionType STRONG_SLOWNESS() * @method static PotionType STRONG_STRENGTH() * @method static PotionType STRONG_SWIFTNESS() * @method static PotionType STRONG_TURTLE_MASTER() @@ -201,6 +202,9 @@ final class PotionType{ ]), new self("long_slow_falling", "Long Slow Falling", fn() => [ //TODO + ]), + new self("strong_slowness", "Strong Slowness", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 3) ]) ); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 46b37e3aec..e5e5252e16 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1506,6 +1506,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("strong_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_POISON())); $result->register("strong_regeneration_potion", fn() => Items::POTION()->setType(PotionType::STRONG_REGENERATION())); $result->register("strong_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_REGENERATION())); + $result->register("strong_slowness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SLOWNESS())); + $result->register("strong_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SLOWNESS())); $result->register("strong_strength_potion", fn() => Items::POTION()->setType(PotionType::STRONG_STRENGTH())); $result->register("strong_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_STRENGTH())); $result->register("strong_swiftness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SWIFTNESS())); From 259cc305df109c134fa36dde44655599e238d804 Mon Sep 17 00:00:00 2001 From: jasonw_4331 Date: Thu, 13 Jul 2023 08:36:53 -0400 Subject: [PATCH 1189/1858] Implement 1.20.10 short sneaking (#5892) --- src/entity/Living.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/entity/Living.php b/src/entity/Living.php index 29a8ceae8f..2cf5d40532 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -217,6 +217,7 @@ abstract class Living extends Entity{ public function setSneaking(bool $value = true) : void{ $this->sneaking = $value; $this->networkPropertiesDirty = true; + $this->recalculateSize(); } public function isSprinting() : bool{ @@ -258,6 +259,8 @@ abstract class Living extends Entity{ if($this->isSwimming() || $this->isGliding()){ $width = $size->getWidth(); $this->setSize((new EntitySizeInfo($width, $width, $width * 0.9))->scale($this->getScale())); + }elseif($this->isSneaking()){ + $this->setSize((new EntitySizeInfo(3 / 4 * $size->getHeight(), $size->getWidth(), 3 / 4 * $size->getEyeHeight()))->scale($this->getScale())); }else{ $this->setSize($size->scale($this->getScale())); } From dca752c72f8daeb669dacebf67b0e093cbe366c4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jul 2023 14:50:02 +0100 Subject: [PATCH 1190/1858] Stem: implement facing property fixes #5858 technically speaking, the sideways states for non-fully-grown stems shouldn't exist, but they do in Bedrock, and changing this code to split non-fully-grown stems from fully grown ones would likely require BC breaks. This was the minimum necessary to achieve the desired functionality. --- src/block/Stem.php | 30 +++++++++++++++++-- .../convert/BlockStateDeserializerHelper.php | 9 ++++-- .../convert/BlockStateSerializerHelper.php | 6 +++- .../block_factory_consistency_check.json | 2 +- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/block/Stem.php b/src/block/Stem.php index 5f06a46cb1..b0d49b28e1 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -30,11 +31,34 @@ use function array_rand; use function mt_rand; abstract class Stem extends Crops{ + protected int $facing = Facing::UP; + + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + parent::describeBlockOnlyState($w); + $w->facingExcept($this->facing, Facing::DOWN); + } + + public function getFacing() : int{ return $this->facing; } + + /** @return $this */ + public function setFacing(int $facing) : self{ + if($facing === Facing::DOWN){ + throw new \InvalidArgumentException("DOWN is not a valid facing for this block"); + } + $this->facing = $facing; + return $this; + } abstract protected function getPlant() : Block; + public function onNearbyBlockChange() : void{ + if($this->facing !== Facing::UP && !$this->getSide($this->facing)->hasSameTypeId($this->getPlant())){ + $this->position->getWorld()->setBlock($this->position, $this->setFacing(Facing::UP)); + } + } + public function onRandomTick() : void{ - if(mt_rand(0, 2) === 1){ + if($this->facing === Facing::UP && mt_rand(0, 2) === 1){ $world = $this->position->getWorld(); if($this->age < self::MAX_AGE){ $block = clone $this; @@ -52,11 +76,13 @@ abstract class Stem extends Crops{ } } - $side = $this->getSide(Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]); + $facing = Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]; + $side = $this->getSide($facing); if($side->getTypeId() === BlockTypeIds::AIR && $side->getSide(Facing::DOWN)->hasTypeTag(BlockTypeTags::DIRT)){ $ev = new BlockGrowEvent($side, $grow); $ev->call(); if(!$ev->isCancelled()){ + $world->setBlock($this->position, $this->setFacing($facing)); $world->setBlock($side->position, $ev->getNewState()); } } diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index fab50717c4..8018d71b89 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -236,9 +236,12 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeStem(Stem $block, BlockStateReader $in) : Stem{ - //TODO: our stems don't support facings yet (facing_direction) - $in->todo(BlockStateNames::FACING_DIRECTION); - return self::decodeCrops($block, $in); + //In PM, we use Facing::UP to indicate that the stem is not attached to a pumpkin/melon, since this makes the + //most intuitive sense (the stem is pointing at the sky). However, Bedrock uses the DOWN state for this, which + //is absurd, and I refuse to make our API similarly absurd. + $facing = $in->readFacingWithoutUp(); + return self::decodeCrops($block, $in) + ->setFacing($facing === Facing::DOWN ? Facing::UP : $facing); } /** @throws BlockStateDeserializeException */ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 7fc15fce6c..97fa5532fb 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -223,8 +223,12 @@ final class BlockStateSerializerHelper{ } public static function encodeStem(Stem $block, BlockStateWriter $out) : BlockStateWriter{ + //In PM, we use Facing::UP to indicate that the stem is not attached to a pumpkin/melon, since this makes the + //most intuitive sense (the stem is pointing at the sky). However, Bedrock uses the DOWN state for this, which + //is absurd, and I refuse to make our API similarly absurd. + $facing = $block->getFacing(); return self::encodeCrops($block, $out) - ->writeHorizontalFacing(Facing::NORTH); //TODO: PM impl doesn't support this yet + ->writeFacingWithoutUp($facing === Facing::UP ? Facing::DOWN : $facing); } public static function encodeStone(string $type) : BlockStateWriter{ diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 46838b8530..e0d1bca1de 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648936,2648937,2648938,2648939,2648940,2648941,2648942,2648943],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666672,2666673,2666674,2666675,2666676,2666677,2666678,2666679],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From 2a11762e61b9072e85a64070133cb8abdfb8cb2e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 11:54:05 +0100 Subject: [PATCH 1191/1858] Update JsonMapper dependency --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 4e3d99392e..e3c8d3e1f8 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", - "pocketmine/netresearch-jsonmapper": "~v4.2.999", + "pocketmine/netresearch-jsonmapper": "~v4.2.1000", "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", diff --git a/composer.lock b/composer.lock index 9c6d13de08..340191f85c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "390992e13478ee71580805f5f7d293a2", + "content-hash": "4524eed9bd1a33e650413fbf41382e20", "packages": [ { "name": "adhocore/json-comment", @@ -730,16 +730,16 @@ }, { "name": "pocketmine/netresearch-jsonmapper", - "version": "v4.2.999", + "version": "v4.2.1000", "source": { "type": "git", "url": "https://github.com/pmmp/netresearch-jsonmapper.git", - "reference": "f700806dec756ed825a8200dc2950ead98265956" + "reference": "078764e869e9b732f97206ec9363480a77c35532" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/netresearch-jsonmapper/zipball/f700806dec756ed825a8200dc2950ead98265956", - "reference": "f700806dec756ed825a8200dc2950ead98265956", + "url": "https://api.github.com/repos/pmmp/netresearch-jsonmapper/zipball/078764e869e9b732f97206ec9363480a77c35532", + "reference": "078764e869e9b732f97206ec9363480a77c35532", "shasum": "" }, "require": { @@ -778,9 +778,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/pmmp/netresearch-jsonmapper/tree/v4.2.999" + "source": "https://github.com/pmmp/netresearch-jsonmapper/tree/v4.2.1000" }, - "time": "2023-06-01T13:43:01+00:00" + "time": "2023-07-14T10:44:14+00:00" }, { "name": "pocketmine/raklib", From 4e646d19a4a1e0d082bd4d1f5a58ae0182a268d9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 11:55:47 +0100 Subject: [PATCH 1192/1858] Harden login EC key validation --- src/network/mcpe/JwtUtils.php | 12 ++++++++++++ src/network/mcpe/auth/ProcessLoginTask.php | 10 ++++++++-- src/network/mcpe/encryption/EncryptionUtils.php | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/JwtUtils.php b/src/network/mcpe/JwtUtils.php index 12d21974dd..a3cebbd730 100644 --- a/src/network/mcpe/JwtUtils.php +++ b/src/network/mcpe/JwtUtils.php @@ -61,6 +61,7 @@ use const OPENSSL_ALGO_SHA384; use const STR_PAD_LEFT; final class JwtUtils{ + public const BEDROCK_SIGNING_KEY_CURVE_NAME = "secp384r1"; /** * @return string[] @@ -203,6 +204,17 @@ final class JwtUtils{ if($signingKeyOpenSSL === false){ throw new JwtException("OpenSSL failed to parse key: " . openssl_error_string()); } + $details = openssl_pkey_get_details($signingKeyOpenSSL); + if($details === false){ + throw new JwtException("OpenSSL failed to get details from key: " . openssl_error_string()); + } + if(!isset($details['ec']['curve_name'])){ + throw new JwtException("Expected an EC key"); + } + $curve = $details['ec']['curve_name']; + if($curve !== self::BEDROCK_SIGNING_KEY_CURVE_NAME){ + throw new JwtException("Key must belong to curve " . self::BEDROCK_SIGNING_KEY_CURVE_NAME . ", got $curve"); + } return $signingKeyOpenSSL; } } diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 2da3b5fae6..dc7a402243 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -32,7 +32,6 @@ use pocketmine\scheduler\AsyncTask; use function base64_decode; use function igbinary_serialize; use function igbinary_unserialize; -use function openssl_error_string; use function time; class ProcessLoginTask extends AsyncTask{ @@ -156,7 +155,8 @@ class ProcessLoginTask extends AsyncTask{ try{ $signingKeyOpenSSL = JwtUtils::parseDerPublicKey($headerDerKey); }catch(JwtException $e){ - throw new VerifyLoginException("Invalid JWT public key: " . openssl_error_string()); + //TODO: we shouldn't be showing this internal information to the client + throw new VerifyLoginException("Invalid JWT public key: " . $e->getMessage(), null, 0, $e); } try{ if(!JwtUtils::verify($jwt, $signingKeyOpenSSL)){ @@ -196,6 +196,12 @@ class ProcessLoginTask extends AsyncTask{ if($identityPublicKey === false){ throw new VerifyLoginException("Invalid identityPublicKey: base64 error decoding"); } + try{ + //verify key format and parameters + JwtUtils::parseDerPublicKey($identityPublicKey); + }catch(JwtException $e){ + throw new VerifyLoginException("Invalid identityPublicKey: " . $e->getMessage(), null, 0, $e); + } $currentPublicKey = $identityPublicKey; //if there are further links, the next link should be signed with this } } diff --git a/src/network/mcpe/encryption/EncryptionUtils.php b/src/network/mcpe/encryption/EncryptionUtils.php index 920c54a7ef..4ad9ceb31c 100644 --- a/src/network/mcpe/encryption/EncryptionUtils.php +++ b/src/network/mcpe/encryption/EncryptionUtils.php @@ -33,6 +33,7 @@ use function hex2bin; use function openssl_digest; use function openssl_error_string; use function openssl_pkey_derive; +use function openssl_pkey_get_details; use function str_pad; use const STR_PAD_LEFT; @@ -42,7 +43,20 @@ final class EncryptionUtils{ //NOOP } + private static function validateKey(\OpenSSLAsymmetricKey $key) : void{ + $keyDetails = Utils::assumeNotFalse(openssl_pkey_get_details($key)); + if(!isset($keyDetails["ec"]["curve_name"])){ + throw new \InvalidArgumentException("Key must be an EC key"); + } + $curveName = $keyDetails["ec"]["curve_name"]; + if($curveName !== JwtUtils::BEDROCK_SIGNING_KEY_CURVE_NAME){ + throw new \InvalidArgumentException("Key must belong to the " . JwtUtils::BEDROCK_SIGNING_KEY_CURVE_NAME . " elliptic curve, got $curveName"); + } + } + public static function generateSharedSecret(\OpenSSLAsymmetricKey $localPriv, \OpenSSLAsymmetricKey $remotePub) : \GMP{ + self::validateKey($localPriv); + self::validateKey($remotePub); $hexSecret = openssl_pkey_derive($remotePub, $localPriv, 48); if($hexSecret === false){ throw new \InvalidArgumentException("Failed to derive shared secret: " . openssl_error_string()); From 2709dd359c02269e491e1b406fcaf7ac7e34b0de Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 12:37:50 +0100 Subject: [PATCH 1193/1858] ProcessLoginTask: fixed backport errors --- src/network/mcpe/auth/ProcessLoginTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index dc7a402243..da88e40933 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -156,7 +156,7 @@ class ProcessLoginTask extends AsyncTask{ $signingKeyOpenSSL = JwtUtils::parseDerPublicKey($headerDerKey); }catch(JwtException $e){ //TODO: we shouldn't be showing this internal information to the client - throw new VerifyLoginException("Invalid JWT public key: " . $e->getMessage(), null, 0, $e); + throw new VerifyLoginException("Invalid JWT public key: " . $e->getMessage(), 0, $e); } try{ if(!JwtUtils::verify($jwt, $signingKeyOpenSSL)){ @@ -200,7 +200,7 @@ class ProcessLoginTask extends AsyncTask{ //verify key format and parameters JwtUtils::parseDerPublicKey($identityPublicKey); }catch(JwtException $e){ - throw new VerifyLoginException("Invalid identityPublicKey: " . $e->getMessage(), null, 0, $e); + throw new VerifyLoginException("Invalid identityPublicKey: " . $e->getMessage(), 0, $e); } $currentPublicKey = $identityPublicKey; //if there are further links, the next link should be signed with this } From 935df620066f5f9b812ba09ffe372fadc26d9722 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 13:06:26 +0100 Subject: [PATCH 1194/1858] Release 4.23.1 --- changelogs/4.23.md | 7 +++++++ src/VersionInfo.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index 6a5c5d49a6..c87364d679 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -17,3 +17,10 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Fixed Docker image build failure due to outdated `build/php` submodule. + +# 4.23.1 +Released 14th July 2023. + +## Fixes +- Hardened validation of JWT signing keys in `LoginPacket`. +- Fixed server crash due to a bug in upstream dependency [`netresearch/jsonmapper`](https://github.com/cweiske/JsonMapper). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 96ee4b01c6..ad1514eb5e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 86bd6777a30ea29dfe5c814dcfd7287e277b2ec9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 13:06:26 +0100 Subject: [PATCH 1195/1858] 4.23.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index ad1514eb5e..c15758af11 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From f7c08dedee761dd5068eb7818bd73ae8736c2f6a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 14 Jul 2023 13:08:58 +0100 Subject: [PATCH 1196/1858] 5.3.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2efc577d5f..4c6553e275 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.3.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8c8794ec71279e395caa76d2b6fa751c0f903aa1 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:41:46 -0500 Subject: [PATCH 1197/1858] Allow use ConsumingItemAnimation with Living entities (#5897) --- src/entity/animation/ConsumingItemAnimation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/entity/animation/ConsumingItemAnimation.php b/src/entity/animation/ConsumingItemAnimation.php index aa6152a57e..49c8a0a516 100644 --- a/src/entity/animation/ConsumingItemAnimation.php +++ b/src/entity/animation/ConsumingItemAnimation.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\entity\animation; -use pocketmine\entity\Human; +use pocketmine\entity\Living; use pocketmine\item\Item; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ActorEventPacket; @@ -32,7 +32,7 @@ use pocketmine\network\mcpe\protocol\types\ActorEvent; final class ConsumingItemAnimation implements Animation{ public function __construct( - private Human $human, //TODO: maybe this can be expanded to more than just player entities? + private Living $entity, private Item $item ){} @@ -40,7 +40,7 @@ final class ConsumingItemAnimation implements Animation{ [$netId, $netData] = TypeConverter::getInstance()->getItemTranslator()->toNetworkId($this->item); return [ //TODO: need to check the data values - ActorEventPacket::create($this->human->getId(), ActorEvent::EATING_ITEM, ($netId << 16) | $netData) + ActorEventPacket::create($this->entity->getId(), ActorEvent::EATING_ITEM, ($netId << 16) | $netData) ]; } } From 45d1ce9bb880f0dbc8cd64ba7bd693b61bed026c Mon Sep 17 00:00:00 2001 From: Wertzui123 <46199283+Wertzui123@users.noreply.github.com> Date: Fri, 14 Jul 2023 18:42:19 +0200 Subject: [PATCH 1198/1858] Don't mention enchantments in generic StringToTParser doc-comment (#5894) --- src/utils/StringToTParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/StringToTParser.php b/src/utils/StringToTParser.php index f87db71737..0166e2a284 100644 --- a/src/utils/StringToTParser.php +++ b/src/utils/StringToTParser.php @@ -59,7 +59,7 @@ abstract class StringToTParser{ } /** - * Tries to parse the specified string into an enchantment. + * Tries to parse the specified string into a corresponding instance of T. * @phpstan-return T|null */ public function parse(string $input){ From 0c1bfb058afae74dc7c06a5328576db54ded36c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 17:45:36 +0100 Subject: [PATCH 1199/1858] Bump phpunit/phpunit from 10.2.3 to 10.2.5 (#5898) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.2.3 to 10.2.5. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.2.5/ChangeLog-10.2.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.2.3...10.2.5) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 9b9c02c92c..e005f6ca76 100644 --- a/composer.lock +++ b/composer.lock @@ -1937,16 +1937,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.3", + "version": "10.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e" + "reference": "15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35c8cac1734ede2ae354a6644f7088356ff5b08e", - "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd", + "reference": "15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd", "shasum": "" }, "require": { @@ -2018,7 +2018,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.5" }, "funding": [ { @@ -2034,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2023-06-30T06:17:38+00:00" + "time": "2023-07-14T04:18:47+00:00" }, { "name": "sebastian/cli-parser", From fb6a7d279f41035043c8221af86abde9ced3a046 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Mon, 17 Jul 2023 12:13:45 +0200 Subject: [PATCH 1200/1858] Implement fortune enchantment (#5757) --- src/block/Beetroot.php | 4 +- src/block/Carrot.php | 4 +- src/block/CoalOre.php | 3 +- src/block/CopperOre.php | 5 +- src/block/DiamondOre.php | 3 +- src/block/DoubleTallGrass.php | 7 +- src/block/EmeraldOre.php | 3 +- src/block/GildedBlackstone.php | 3 +- src/block/Glowstone.php | 5 +- src/block/Gravel.php | 4 +- src/block/LapisOre.php | 3 +- src/block/Leaves.php | 11 +- src/block/Melon.php | 5 +- src/block/NetherGoldOre.php | 4 +- src/block/NetherQuartzOre.php | 3 +- src/block/NetherVines.php | 3 +- src/block/NetherWartPlant.php | 3 +- src/block/Potato.php | 4 +- src/block/RedstoneOre.php | 3 +- src/block/SeaLantern.php | 4 +- src/block/SweetBerryBush.php | 16 +- src/block/TallGrass.php | 11 +- src/block/Wheat.php | 4 +- src/block/utils/FortuneDropHelper.php | 150 ++++++++++++++++++ src/data/bedrock/EnchantmentIdMap.php | 1 + .../enchantment/StringToEnchantmentParser.php | 1 + src/item/enchantment/VanillaEnchantments.php | 2 + 27 files changed, 220 insertions(+), 49 deletions(-) create mode 100644 src/block/utils/FortuneDropHelper.php diff --git a/src/block/Beetroot.php b/src/block/Beetroot.php index b87a841ea2..cf92fdda20 100644 --- a/src/block/Beetroot.php +++ b/src/block/Beetroot.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; class Beetroot extends Crops{ @@ -33,7 +33,7 @@ class Beetroot extends Crops{ if($this->age >= self::MAX_AGE){ return [ VanillaItems::BEETROOT(), - VanillaItems::BEETROOT_SEEDS()->setCount(mt_rand(0, 3)) + VanillaItems::BEETROOT_SEEDS()->setCount(FortuneDropHelper::binomial($item, 0)) ]; } diff --git a/src/block/Carrot.php b/src/block/Carrot.php index 895b0a37db..7d8947afaf 100644 --- a/src/block/Carrot.php +++ b/src/block/Carrot.php @@ -23,15 +23,15 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; class Carrot extends Crops{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::CARROT()->setCount($this->age >= self::MAX_AGE ? mt_rand(1, 4) : 1) + VanillaItems::CARROT()->setCount($this->age >= self::MAX_AGE ? FortuneDropHelper::binomial($item, 1) : 1) ]; } diff --git a/src/block/CoalOre.php b/src/block/CoalOre.php index 47a0e255d2..19032b011a 100644 --- a/src/block/CoalOre.php +++ b/src/block/CoalOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,7 @@ class CoalOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::COAL() + VanillaItems::COAL()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1)) ]; } diff --git a/src/block/CopperOre.php b/src/block/CopperOre.php index ad02cc50f9..3b8ef12a02 100644 --- a/src/block/CopperOre.php +++ b/src/block/CopperOre.php @@ -23,13 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; final class CopperOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ - return [VanillaItems::RAW_COPPER()]; + return [ + VanillaItems::RAW_COPPER()->setCount(FortuneDropHelper::weighted($item, min: 2, maxBase: 5)), + ]; } public function isAffectedBySilkTouch() : bool{ return true; } diff --git a/src/block/DiamondOre.php b/src/block/DiamondOre.php index 8407bdf15e..b0486dcfb4 100644 --- a/src/block/DiamondOre.php +++ b/src/block/DiamondOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,7 @@ class DiamondOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::DIAMOND() + VanillaItems::DIAMOND()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1)) ]; } diff --git a/src/block/DoubleTallGrass.php b/src/block/DoubleTallGrass.php index fc37442f5e..e90f2ec615 100644 --- a/src/block/DoubleTallGrass.php +++ b/src/block/DoubleTallGrass.php @@ -23,9 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; -use function mt_rand; class DoubleTallGrass extends DoublePlant{ @@ -34,8 +33,8 @@ class DoubleTallGrass extends DoublePlant{ } public function getDropsForIncompatibleTool(Item $item) : array{ - if($this->top && mt_rand(0, 7) === 0){ - return [VanillaItems::WHEAT_SEEDS()]; + if($this->top){ + return FortuneDropHelper::grass($item); } return []; } diff --git a/src/block/EmeraldOre.php b/src/block/EmeraldOre.php index 6e997223db..8e5d96191b 100644 --- a/src/block/EmeraldOre.php +++ b/src/block/EmeraldOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,7 @@ class EmeraldOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::EMERALD() + VanillaItems::EMERALD()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1)) ]; } diff --git a/src/block/GildedBlackstone.php b/src/block/GildedBlackstone.php index e01d6bfdc7..75c822f8e0 100644 --- a/src/block/GildedBlackstone.php +++ b/src/block/GildedBlackstone.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -30,7 +31,7 @@ use function mt_rand; final class GildedBlackstone extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ - if(mt_rand(1, 10) === 1){ + if(FortuneDropHelper::bonusChanceDivisor($item, 10, 3)){ return [VanillaItems::GOLD_NUGGET()->setCount(mt_rand(2, 5))]; } diff --git a/src/block/Glowstone.php b/src/block/Glowstone.php index 3b567aa5b3..1fead9abef 100644 --- a/src/block/Glowstone.php +++ b/src/block/Glowstone.php @@ -23,9 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; +use function min; class Glowstone extends Transparent{ @@ -35,7 +36,7 @@ class Glowstone extends Transparent{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::GLOWSTONE_DUST()->setCount(mt_rand(2, 4)) + VanillaItems::GLOWSTONE_DUST()->setCount(min(4, FortuneDropHelper::discrete($item, 2, 4))) ]; } diff --git a/src/block/Gravel.php b/src/block/Gravel.php index 4bff2208ff..6445ce30eb 100644 --- a/src/block/Gravel.php +++ b/src/block/Gravel.php @@ -25,15 +25,15 @@ namespace pocketmine\block; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; class Gravel extends Opaque implements Fallable{ use FallableTrait; public function getDropsForCompatibleTool(Item $item) : array{ - if(mt_rand(1, 10) === 1){ + if(FortuneDropHelper::bonusChanceDivisor($item, 10, 3)){ return [ VanillaItems::FLINT() ]; diff --git a/src/block/LapisOre.php b/src/block/LapisOre.php index 656b0a8951..ce54321a48 100644 --- a/src/block/LapisOre.php +++ b/src/block/LapisOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,7 @@ class LapisOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::LAPIS_LAZULI()->setCount(mt_rand(4, 8)) + VanillaItems::LAPIS_LAZULI()->setCount(FortuneDropHelper::weighted($item, min: 4, maxBase: 9)) ]; } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index dc5e9ce80e..2351904544 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -138,7 +139,8 @@ class Leaves extends Transparent{ } $drops = []; - if(mt_rand(1, 20) === 1){ //Saplings + if(FortuneDropHelper::bonusChanceDivisor($item, 20, 4)){ //Saplings + // TODO: according to the wiki, the jungle saplings have a different drop rate $sapling = (match($this->leavesType){ LeavesType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), LeavesType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), @@ -155,10 +157,13 @@ class Leaves extends Transparent{ $drops[] = $sapling; } } - if(($this->leavesType->equals(LeavesType::OAK()) || $this->leavesType->equals(LeavesType::DARK_OAK())) && mt_rand(1, 200) === 1){ //Apples + if( + ($this->leavesType->equals(LeavesType::OAK()) || $this->leavesType->equals(LeavesType::DARK_OAK())) && + FortuneDropHelper::bonusChanceDivisor($item, 200, 20) + ){ //Apples $drops[] = VanillaItems::APPLE(); } - if(mt_rand(1, 50) === 1){ + if(FortuneDropHelper::bonusChanceDivisor($item, 50, 5)){ $drops[] = VanillaItems::STICK()->setCount(mt_rand(1, 2)); } diff --git a/src/block/Melon.php b/src/block/Melon.php index 42d54c0ab2..4a32332e11 100644 --- a/src/block/Melon.php +++ b/src/block/Melon.php @@ -23,15 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; +use function min; class Melon extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::MELON()->setCount(mt_rand(3, 7)) + VanillaItems::MELON()->setCount(min(9, FortuneDropHelper::discrete($item, 3, 7))) ]; } diff --git a/src/block/NetherGoldOre.php b/src/block/NetherGoldOre.php index 7782f4fc45..fd6745df43 100644 --- a/src/block/NetherGoldOre.php +++ b/src/block/NetherGoldOre.php @@ -23,14 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; final class NetherGoldOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ - return [VanillaItems::GOLD_NUGGET()->setCount(mt_rand(2, 6))]; + return [VanillaItems::GOLD_NUGGET()->setCount(FortuneDropHelper::weighted($item, min: 2, maxBase: 6))]; } public function isAffectedBySilkTouch() : bool{ return true; } diff --git a/src/block/NetherQuartzOre.php b/src/block/NetherQuartzOre.php index c2ab20491b..0981974ee7 100644 --- a/src/block/NetherQuartzOre.php +++ b/src/block/NetherQuartzOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,7 @@ class NetherQuartzOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::NETHER_QUARTZ() + VanillaItems::NETHER_QUARTZ()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1)) ]; } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index adf6117858..ac075f6675 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; @@ -179,7 +180,7 @@ class NetherVines extends Flowable{ } public function getDropsForCompatibleTool(Item $item) : array{ - if(($item->getBlockToolType() & BlockToolType::SHEARS) !== 0 || mt_rand(1, 3) === 1){ + if(($item->getBlockToolType() & BlockToolType::SHEARS) !== 0 || FortuneDropHelper::bonusChanceFixed($item, 1 / 3, 2 / 9)){ return [$this->asItem()]; } return []; diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 76de2a4705..6a8fe1f7a2 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; @@ -85,7 +86,7 @@ class NetherWartPlant extends Flowable{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - $this->asItem()->setCount($this->age === self::MAX_AGE ? mt_rand(2, 4) : 1) + $this->asItem()->setCount($this->age === self::MAX_AGE ? FortuneDropHelper::discrete($item, 2, 4) : 1) ]; } } diff --git a/src/block/Potato.php b/src/block/Potato.php index 47d39f6126..4d1bbf9790 100644 --- a/src/block/Potato.php +++ b/src/block/Potato.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use function mt_rand; @@ -31,7 +32,8 @@ class Potato extends Crops{ public function getDropsForCompatibleTool(Item $item) : array{ $result = [ - VanillaItems::POTATO()->setCount($this->age >= self::MAX_AGE ? mt_rand(1, 5) : 1) + //min/max would be 2-5 in Java + VanillaItems::POTATO()->setCount($this->age >= self::MAX_AGE ? FortuneDropHelper::binomial($item, 1) : 1) ]; if($this->age >= self::MAX_AGE && mt_rand(0, 49) === 0){ $result[] = VanillaItems::POISONOUS_POTATO(); diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 74708c2bd5..75f5063eef 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -81,7 +82,7 @@ class RedstoneOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::REDSTONE_DUST()->setCount(mt_rand(4, 5)) + VanillaItems::REDSTONE_DUST()->setCount(FortuneDropHelper::discrete($item, 4, 5)) ]; } diff --git a/src/block/SeaLantern.php b/src/block/SeaLantern.php index 27ed73f0df..ff0c97d733 100644 --- a/src/block/SeaLantern.php +++ b/src/block/SeaLantern.php @@ -23,8 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; +use function min; class SeaLantern extends Transparent{ @@ -34,7 +36,7 @@ class SeaLantern extends Transparent{ public function getDropsForCompatibleTool(Item $item) : array{ return [ - VanillaItems::PRISMARINE_CRYSTALS()->setCount(3) + VanillaItems::PRISMARINE_CRYSTALS()->setCount(min(5, FortuneDropHelper::discrete($item, 2, 3))) ]; } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index b75a343ec5..5ead39390b 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; @@ -108,13 +109,14 @@ class SweetBerryBush extends Flowable{ } public function getDropsForCompatibleTool(Item $item) : array{ - if(($dropAmount = $this->getBerryDropAmount()) > 0){ - return [ - $this->asItem()->setCount($dropAmount) - ]; - } - - return []; + $count = match($this->age){ + self::STAGE_MATURE => FortuneDropHelper::discrete($item, 2, 3), + self::STAGE_BUSH_SOME_BERRIES => FortuneDropHelper::discrete($item, 1, 2), + default => 0 + }; + return [ + $this->asItem()->setCount($count) + ]; } public function onNearbyBlockChange() : void{ diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index e8f533325a..019b911bc2 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -23,13 +23,12 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use function mt_rand; class TallGrass extends Flowable{ @@ -56,13 +55,7 @@ class TallGrass extends Flowable{ } public function getDropsForIncompatibleTool(Item $item) : array{ - if(mt_rand(0, 15) === 0){ - return [ - VanillaItems::WHEAT_SEEDS() - ]; - } - - return []; + return FortuneDropHelper::grass($item); } public function getFlameEncouragement() : int{ diff --git a/src/block/Wheat.php b/src/block/Wheat.php index 15701c9760..92f155f766 100644 --- a/src/block/Wheat.php +++ b/src/block/Wheat.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; -use function mt_rand; class Wheat extends Crops{ @@ -33,7 +33,7 @@ class Wheat extends Crops{ if($this->age >= self::MAX_AGE){ return [ VanillaItems::WHEAT(), - VanillaItems::WHEAT_SEEDS()->setCount(mt_rand(0, 3)) + VanillaItems::WHEAT_SEEDS()->setCount(FortuneDropHelper::binomial($item, 0)) ]; }else{ return [ diff --git a/src/block/utils/FortuneDropHelper.php b/src/block/utils/FortuneDropHelper.php new file mode 100644 index 0000000000..4bce36138a --- /dev/null +++ b/src/block/utils/FortuneDropHelper.php @@ -0,0 +1,150 @@ +getEnchantmentLevel(VanillaEnchantments::FORTUNE()); + + return mt_rand($min, + $fortuneLevel > 0 && mt_rand() / mt_getrandmax() > 2 / ($fortuneLevel + 2) ? + $maxBase * ($fortuneLevel + 1) : + $maxBase + ); + } + + /** + * Increases the drop amount according to a binomial distribution. The function will roll maxBase+level times, and add 1 + * if a random number between 0-1 is less than the given probability. Each level of fortune adds one extra roll. + * + * As many as maxBase+level items can be dropped. This applies even if the fortune level is 0. + * + * @param float $chance The chance of adding 1 to the amount for each roll, must be in the range 0-1 + * @param int $min Minimum amount + * @param int $minRolls Number of rolls if fortune level is 0, added to fortune level to calculate total rolls + * + * @return int the number of items to drop + */ + public static function binomial(Item $usedItem, int $min, int $minRolls = 3, float $chance = 4 / 7) : int{ + $fortuneLevel = $usedItem->getEnchantmentLevel(VanillaEnchantments::FORTUNE()); + + $count = $min; + $rolls = $minRolls + $fortuneLevel; + for($i = 0; $i < $rolls; ++$i){ + if(mt_rand() / mt_getrandmax() < $chance){ + ++$count; + } + } + + return $count; + } + + /** + * Grass have a fixed chance to drop wheat seed. + * Fortune level increases the maximum number of seeds that can be dropped. + * A discrete uniform distribution is used to determine the number of seeds dropped. + * + * TODO: I'm not sure this really belongs here, but it's preferable not to duplicate this code between grass and + * tall grass. + * + * @return Item[] + */ + public static function grass(Item $usedItem) : array{ + if(FortuneDropHelper::bonusChanceDivisor($usedItem, 8, 2)){ + return [ + VanillaItems::WHEAT_SEEDS() + ]; + } + + return []; + } + + /** + * Adds the fortune level to the base max and picks a random number between the minimim and adjusted maximum. + * Each amount in the range has an equal chance of being picked. + * + * @param int $maxBase Maximum base amount, as if the fortune level was 0 + * + * @return int the number of items to drop + */ + public static function discrete(Item $usedItem, int $min, int $maxBase) : int{ + if($maxBase < $min){ + throw new \InvalidArgumentException("Minimum base drop amount must be less than or equal to maximum base drop amount"); + } + + $max = $maxBase + $usedItem->getEnchantmentLevel(VanillaEnchantments::FORTUNE()); + return mt_rand($min, $max); + } + + /** + * Calculates a chance of getting an extra bonus drop by reducing the chance divisor by a given amount per fortune + * level. + * + * @param int $divisorBase The number to divide 1 by to get the chance, as if the fortune level was 0 + * @param int $divisorSubtractPerLevel The amount to subtract from the divisor for each level of fortune + * + * @return bool whether the bonus drop should be added + */ + public static function bonusChanceDivisor(Item $usedItem, int $divisorBase, int $divisorSubtractPerLevel) : bool{ + $fortuneLevel = $usedItem->getEnchantmentLevel(VanillaEnchantments::FORTUNE()); + return mt_rand(1, max(1, $divisorBase - ($fortuneLevel * $divisorSubtractPerLevel))) === 1; + } + + /** + * Calculates a chance of getting an extra bonus drop by increasing the chance by a fixed amount per fortune level. + * + * @param float $chanceBase The base chance of getting a bonus drop, as if the fortune level was 0 + * @param float $addedChancePerLevel The amount to add to the chance for each level of fortune + */ + public static function bonusChanceFixed(Item $usedItem, float $chanceBase, float $addedChancePerLevel) : bool{ + $fortuneLevel = $usedItem->getEnchantmentLevel(VanillaEnchantments::FORTUNE()); + $chance = min(1, $chanceBase + ($fortuneLevel * $addedChancePerLevel)); + return mt_rand() / mt_getrandmax() < $chance; + } +} diff --git a/src/data/bedrock/EnchantmentIdMap.php b/src/data/bedrock/EnchantmentIdMap.php index d7f436fa38..1d974ed6e9 100644 --- a/src/data/bedrock/EnchantmentIdMap.php +++ b/src/data/bedrock/EnchantmentIdMap.php @@ -62,6 +62,7 @@ final class EnchantmentIdMap{ $this->register(EnchantmentIds::FIRE_ASPECT, VanillaEnchantments::FIRE_ASPECT()); $this->register(EnchantmentIds::EFFICIENCY, VanillaEnchantments::EFFICIENCY()); + $this->register(EnchantmentIds::FORTUNE, VanillaEnchantments::FORTUNE()); $this->register(EnchantmentIds::SILK_TOUCH, VanillaEnchantments::SILK_TOUCH()); $this->register(EnchantmentIds::UNBREAKING, VanillaEnchantments::UNBREAKING()); diff --git a/src/item/enchantment/StringToEnchantmentParser.php b/src/item/enchantment/StringToEnchantmentParser.php index e76e716424..cd57eb203a 100644 --- a/src/item/enchantment/StringToEnchantmentParser.php +++ b/src/item/enchantment/StringToEnchantmentParser.php @@ -43,6 +43,7 @@ final class StringToEnchantmentParser extends StringToTParser{ $result->register("fire_aspect", fn() => VanillaEnchantments::FIRE_ASPECT()); $result->register("fire_protection", fn() => VanillaEnchantments::FIRE_PROTECTION()); $result->register("flame", fn() => VanillaEnchantments::FLAME()); + $result->register("fortune", fn() => VanillaEnchantments::FORTUNE()); $result->register("infinity", fn() => VanillaEnchantments::INFINITY()); $result->register("knockback", fn() => VanillaEnchantments::KNOCKBACK()); $result->register("mending", fn() => VanillaEnchantments::MENDING()); diff --git a/src/item/enchantment/VanillaEnchantments.php b/src/item/enchantment/VanillaEnchantments.php index 2be5eed71e..ac2f5c57e5 100644 --- a/src/item/enchantment/VanillaEnchantments.php +++ b/src/item/enchantment/VanillaEnchantments.php @@ -39,6 +39,7 @@ use pocketmine\utils\RegistryTrait; * @method static FireAspectEnchantment FIRE_ASPECT() * @method static ProtectionEnchantment FIRE_PROTECTION() * @method static Enchantment FLAME() + * @method static Enchantment FORTUNE() * @method static Enchantment INFINITY() * @method static KnockbackEnchantment KNOCKBACK() * @method static Enchantment MENDING() @@ -85,6 +86,7 @@ final class VanillaEnchantments{ self::register("FIRE_ASPECT", new FireAspectEnchantment(KnownTranslationFactory::enchantment_fire(), Rarity::RARE, ItemFlags::SWORD, ItemFlags::NONE, 2)); self::register("EFFICIENCY", new Enchantment(KnownTranslationFactory::enchantment_digging(), Rarity::COMMON, ItemFlags::DIG, ItemFlags::SHEARS, 5)); + self::register("FORTUNE", new Enchantment(KnownTranslationFactory::enchantment_lootBonusDigger(), Rarity::RARE, ItemFlags::DIG, ItemFlags::NONE, 3)); self::register("SILK_TOUCH", new Enchantment(KnownTranslationFactory::enchantment_untouching(), Rarity::MYTHIC, ItemFlags::DIG, ItemFlags::SHEARS, 1)); self::register("UNBREAKING", new Enchantment(KnownTranslationFactory::enchantment_durability(), Rarity::UNCOMMON, ItemFlags::DIG | ItemFlags::ARMOR | ItemFlags::FISHING_ROD | ItemFlags::BOW, ItemFlags::TOOL | ItemFlags::CARROT_STICK | ItemFlags::ELYTRA, 3)); From 83d11c7429a9bc961c052e6d0a10a0ea9638b154 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 17 Jul 2023 18:30:52 +0300 Subject: [PATCH 1201/1858] Implemented Big & Small dripleaf (#5835) --- build/generate-runtime-enum-serializers.php | 2 + src/block/BaseBigDripleaf.php | 136 ++++++++++++++ src/block/BigDripleafHead.php | 132 ++++++++++++++ src/block/BigDripleafStem.php | 41 +++++ src/block/BlockTypeIds.php | 5 +- src/block/SmallDripleaf.php | 170 ++++++++++++++++++ src/block/VanillaBlocks.php | 7 + src/block/utils/DripleafState.php | 65 +++++++ .../convert/BlockObjectToStateSerializer.php | 27 +++ .../BlockStateToObjectDeserializer.php | 22 +++ src/data/runtime/RuntimeEnumDescriber.php | 2 + .../runtime/RuntimeEnumDeserializerTrait.php | 10 ++ .../runtime/RuntimeEnumSerializerTrait.php | 10 ++ .../RuntimeEnumSizeCalculatorTrait.php | 4 + src/item/StringToItemParser.php | 2 + src/world/sound/DripleafTiltDownSound.php | 35 ++++ src/world/sound/DripleafTiltUpSound.php | 35 ++++ .../block_factory_consistency_check.json | 2 +- 18 files changed, 705 insertions(+), 2 deletions(-) create mode 100644 src/block/BaseBigDripleaf.php create mode 100644 src/block/BigDripleafHead.php create mode 100644 src/block/BigDripleafStem.php create mode 100644 src/block/SmallDripleaf.php create mode 100644 src/block/utils/DripleafState.php create mode 100644 src/world/sound/DripleafTiltDownSound.php create mode 100644 src/world/sound/DripleafTiltUpSound.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 1273e26f82..805ed18e12 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -27,6 +27,7 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; +use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; @@ -145,6 +146,7 @@ $enumsUsed = [ CopperOxidation::getAll(), CoralType::getAll(), DirtType::getAll(), + DripleafState::getAll(), DyeColor::getAll(), FroglightType::getAll(), LeverFacing::getAll(), diff --git a/src/block/BaseBigDripleaf.php b/src/block/BaseBigDripleaf.php new file mode 100644 index 0000000000..dcd81af0ab --- /dev/null +++ b/src/block/BaseBigDripleaf.php @@ -0,0 +1,136 @@ +isHead() === $head) || + $block->getTypeId() === BlockTypeIds::CLAY || + $block->hasTypeTag(BlockTypeTags::DIRT) || + $block->hasTypeTag(BlockTypeTags::MUD); + } + + public function onNearbyBlockChange() : void{ + if( + (!$this->isHead() && !$this->getSide(Facing::UP) instanceof BaseBigDripleaf) || + !$this->canBeSupportedBy($this->getSide(Facing::DOWN), false) + ){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + $block = $blockReplace->getSide(Facing::DOWN); + if(!$this->canBeSupportedBy($block, true)){ + return false; + } + if($player !== null){ + $this->facing = Facing::opposite($player->getHorizontalFacing()); + } + if($block instanceof BaseBigDripleaf){ + $this->facing = $block->getFacing(); + $tx->addBlock($block->getPosition(), VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($this->facing)); + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer && $this->grow($player)){ + $item->pop(); + return true; + } + return false; + } + + private function seekToHead() : ?BaseBigDripleaf{ + if($this->isHead()){ + return $this; + } + $step = 1; + while(($next = $this->getSide(Facing::UP, $step)) instanceof BaseBigDripleaf){ + if($next->isHead()){ + return $next; + } + $step++; + } + return null; + } + + private function grow(?Player $player) : bool{ + $head = $this->seekToHead(); + if($head === null){ + return false; + } + $pos = $head->getPosition(); + $up = $pos->up(); + $world = $pos->getWorld(); + if( + !$world->isInWorld($up->getFloorX(), $up->getFloorY(), $up->getFloorZ()) || + $world->getBlock($up)->getTypeId() !== BlockTypeIds::AIR + ){ + return false; + } + + $tx = new BlockTransaction($world); + + $tx->addBlock($pos, VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($head->getFacing())); + $tx->addBlock($up, VanillaBlocks::BIG_DRIPLEAF_HEAD()->setFacing($head->getFacing())); + + $ev = new StructureGrowEvent($head, $tx, $player); + $ev->call(); + + if(!$ev->isCancelled()){ + return $tx->apply(); + } + return false; + } + + public function getFlameEncouragement() : int{ + return 15; + } + + public function getFlammability() : int{ + return 100; + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } +} diff --git a/src/block/BigDripleafHead.php b/src/block/BigDripleafHead.php new file mode 100644 index 0000000000..d5bd226ca1 --- /dev/null +++ b/src/block/BigDripleafHead.php @@ -0,0 +1,132 @@ +leafState = DripleafState::STABLE(); + parent::__construct($idInfo, $name, $typeInfo); + } + + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + parent::describeBlockOnlyState($w); + $w->dripleafState($this->leafState); + } + + protected function isHead() : bool{ + return true; + } + + public function getLeafState() : DripleafState{ + return $this->leafState; + } + + /** @return $this */ + public function setLeafState(DripleafState $leafState) : self{ + $this->leafState = $leafState; + return $this; + } + + public function hasEntityCollision() : bool{ + return true; + } + + private function setTiltAndScheduleTick(DripleafState $tilt) : void{ + $this->position->getWorld()->setBlock($this->position, $this->setLeafState($tilt)); + $delay = $tilt->getScheduledUpdateDelayTicks(); + if($delay !== null){ + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, $delay); + } + } + + private function getLeafTopOffset() : float{ + return match($this->leafState){ + DripleafState::STABLE(), DripleafState::UNSTABLE() => 1 / 16, + DripleafState::PARTIAL_TILT() => 3 / 16, + default => 0 + }; + } + + public function onEntityInside(Entity $entity) : bool{ + if(!$entity instanceof Projectile && $this->leafState->equals(DripleafState::STABLE())){ + //the entity must be standing on top of the leaf - do not collapse if the entity is standing underneath + $intersection = AxisAlignedBB::one() + ->offset($this->position->x, $this->position->y, $this->position->z) + ->trim(Facing::DOWN, 1 - $this->getLeafTopOffset()); + if($entity->getBoundingBox()->intersectsWith($intersection)){ + $this->setTiltAndScheduleTick(DripleafState::UNSTABLE()); + return false; + } + } + return true; + } + + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + if(!$this->leafState->equals(DripleafState::FULL_TILT())){ + $this->setTiltAndScheduleTick(DripleafState::FULL_TILT()); + $this->position->getWorld()->addSound($this->position, new DripleafTiltDownSound()); + } + } + + public function onScheduledUpdate() : void{ + if(!$this->leafState->equals(DripleafState::STABLE())){ + if($this->leafState->equals(DripleafState::FULL_TILT())){ + $this->position->getWorld()->setBlock($this->position, $this->setLeafState(DripleafState::STABLE())); + $this->position->getWorld()->addSound($this->position, new DripleafTiltUpSound()); + }else{ + $this->setTiltAndScheduleTick(match($this->leafState->id()){ + DripleafState::UNSTABLE()->id() => DripleafState::PARTIAL_TILT(), + DripleafState::PARTIAL_TILT()->id() => DripleafState::FULL_TILT(), + default => throw new AssumptionFailedError("All types should be covered") + }); + $this->position->getWorld()->addSound($this->position, new DripleafTiltDownSound()); + } + } + } + + protected function recalculateCollisionBoxes() : array{ + if(!$this->leafState->equals(DripleafState::FULL_TILT())){ + return [ + AxisAlignedBB::one() + ->trim(Facing::DOWN, 11 / 16) + ->trim(Facing::UP, $this->getLeafTopOffset()) + ]; + } + return []; + } +} diff --git a/src/block/BigDripleafStem.php b/src/block/BigDripleafStem.php new file mode 100644 index 0000000000..d44c47ccbe --- /dev/null +++ b/src/block/BigDripleafStem.php @@ -0,0 +1,41 @@ +asItem(); + } +} diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index b48a1ed03c..fe2101e1fb 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -733,8 +733,11 @@ final class BlockTypeIds{ public const CHERRY_TRAPDOOR = 10703; public const CHERRY_WALL_SIGN = 10704; public const CHERRY_WOOD = 10705; + public const SMALL_DRIPLEAF = 10706; + public const BIG_DRIPLEAF_HEAD = 10707; + public const BIG_DRIPLEAF_STEM = 10708; - public const FIRST_UNUSED_BLOCK_ID = 10706; + public const FIRST_UNUSED_BLOCK_ID = 10709; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/SmallDripleaf.php b/src/block/SmallDripleaf.php new file mode 100644 index 0000000000..e08e6f6e98 --- /dev/null +++ b/src/block/SmallDripleaf.php @@ -0,0 +1,170 @@ +horizontalFacing($this->facing); + $w->bool($this->top); + } + + public function isTop() : bool{ + return $this->top; + } + + /** @return $this */ + public function setTop(bool $top) : self{ + $this->top = $top; + return $this; + } + + private function canBeSupportedBy(Block $block) : bool{ + //TODO: Moss + //TODO: Small Dripleaf also can be placed on dirt, coarse dirt, farmland, grass blocks, + // podzol, rooted dirt, mycelium, and mud if these blocks are underwater (needs waterlogging) + return $block->getTypeId() === BlockTypeIds::CLAY; + } + + public function onNearbyBlockChange() : void{ + if(!$this->top && !$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + $this->position->getWorld()->useBreakOn($this->position); + return; + } + $face = $this->top ? Facing::DOWN : Facing::UP; + if(!$this->getSide($face)->hasSameTypeId($this)){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + $block = $blockReplace->getSide(Facing::UP); + if($block->getTypeId() !== BlockTypeIds::AIR || !$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + return false; + } + if($player !== null){ + $this->facing = Facing::opposite($player->getHorizontalFacing()); + } + + $tx->addBlock($block->getPosition(), VanillaBlocks::SMALL_DRIPLEAF() + ->setFacing($this->facing) + ->setTop(true) + ); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer && $this->grow($player)){ + $item->pop(); + return true; + } + return false; + } + + private function canGrowTo(Position $pos) : bool{ + $world = $pos->getWorld(); + if(!$world->isInWorld($pos->getFloorX(), $pos->getFloorY(), $pos->getFloorZ())){ + return false; + } + $block = $world->getBlock($pos); + return $block->hasSameTypeId($this) || $block->getTypeId() === BlockTypeIds::AIR; + } + + private function grow(?Player $player) : bool{ + $bottomBlock = $this->top ? $this->getSide(Facing::DOWN) : $this; + if(!$this->hasSameTypeId($bottomBlock)){ + return false; + } + $world = $this->position->getWorld(); + $tx = new BlockTransaction($world); + $height = mt_rand(2, 5); + $grown = 0; + for($i = 0; $i < $height; $i++){ + $pos = $bottomBlock->getSide(Facing::UP, $i)->getPosition(); + if(!$this->canGrowTo($pos)){ + break; + } + $block = ++$grown < $height && $this->canGrowTo($pos->getSide(Facing::UP)) ? + VanillaBlocks::BIG_DRIPLEAF_STEM() : + VanillaBlocks::BIG_DRIPLEAF_HEAD(); + $tx->addBlock($pos, $block->setFacing($this->facing)); + } + if($grown > 1){ + $ev = new StructureGrowEvent($bottomBlock, $tx, $player); + $ev->call(); + if(!$ev->isCancelled()){ + return $tx->apply(); + } + } + + return false; + } + + public function getAffectedBlocks() : array{ + $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); + if($other->hasSameTypeId($this)){ + return [$this, $other]; + } + return parent::getAffectedBlocks(); + } + + public function getDropsForCompatibleTool(Item $item) : array{ + if(!$this->top){ + return [$this->asItem()]; + } + return []; + } + + public function getFlameEncouragement() : int{ + return 15; + } + + public function getFlammability() : int{ + return 100; + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } + + protected function recalculateCollisionBoxes() : array{ + return []; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a45e18a1e9..9f2996abd6 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -113,6 +113,8 @@ use function mb_strtolower; * @method static Bedrock BEDROCK() * @method static Beetroot BEETROOTS() * @method static Bell BELL() + * @method static BigDripleafHead BIG_DRIPLEAF_HEAD() + * @method static BigDripleafStem BIG_DRIPLEAF_STEM() * @method static WoodenButton BIRCH_BUTTON() * @method static WoodenDoor BIRCH_DOOR() * @method static WoodenFence BIRCH_FENCE() @@ -658,6 +660,7 @@ use function mb_strtolower; * @method static Opaque SHROOMLIGHT() * @method static ShulkerBox SHULKER_BOX() * @method static Slime SLIME() + * @method static SmallDripleaf SMALL_DRIPLEAF() * @method static SmithingTable SMITHING_TABLE() * @method static Furnace SMOKER() * @method static Opaque SMOOTH_BASALT() @@ -1598,6 +1601,10 @@ final class VanillaBlocks{ self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("cave_vines", new CaveVines(new BID(Ids::CAVE_VINES), "Cave Vines", new Info(BreakInfo::instant()))); + + self::register("small_dripleaf", new SmallDripleaf(new BID(Ids::SMALL_DRIPLEAF), "Small Dripleaf", new Info(BreakInfo::instant(BlockToolType::SHEARS, toolHarvestLevel: 1)))); + self::register("big_dripleaf_head", new BigDripleafHead(new BID(Ids::BIG_DRIPLEAF_HEAD), "Big Dripleaf", new Info(BreakInfo::instant()))); + self::register("big_dripleaf_stem", new BigDripleafStem(new BID(Ids::BIG_DRIPLEAF_STEM), "Big Dripleaf Stem", new Info(BreakInfo::instant()))); } private static function registerBlocksR18() : void{ diff --git a/src/block/utils/DripleafState.php b/src/block/utils/DripleafState.php new file mode 100644 index 0000000000..3c2e20a13e --- /dev/null +++ b/src/block/utils/DripleafState.php @@ -0,0 +1,65 @@ +Enum___construct($enumName); + } + + public function getScheduledUpdateDelayTicks() : ?int{ + return $this->scheduledUpdateDelayTicks; + } + +} diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 0ba6496dda..8ec9a1ddc7 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -31,6 +31,8 @@ use pocketmine\block\Barrel; use pocketmine\block\Bed; use pocketmine\block\Beetroot; use pocketmine\block\Bell; +use pocketmine\block\BigDripleafHead; +use pocketmine\block\BigDripleafStem; use pocketmine\block\Block; use pocketmine\block\BoneBlock; use pocketmine\block\BrewingStand; @@ -115,6 +117,7 @@ use pocketmine\block\SeaPickle; use pocketmine\block\SimplePillar; use pocketmine\block\SimplePressurePlate; use pocketmine\block\Slab; +use pocketmine\block\SmallDripleaf; use pocketmine\block\SnowLayer; use pocketmine\block\Sponge; use pocketmine\block\StainedGlass; @@ -138,6 +141,7 @@ use pocketmine\block\UnderwaterTorch; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; +use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; @@ -958,6 +962,24 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::BIG_DRIPLEAF_HEAD(), function(BigDripleafHead $block) : Writer{ + return Writer::create(Ids::BIG_DRIPLEAF) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeString(StateNames::BIG_DRIPLEAF_TILT, match($block->getLeafState()->id()){ + DripleafState::STABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_NONE, + DripleafState::UNSTABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_UNSTABLE, + DripleafState::PARTIAL_TILT()->id() => StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT, + DripleafState::FULL_TILT()->id() => StringValues::BIG_DRIPLEAF_TILT_FULL_TILT, + default => throw new BlockStateSerializeException("Invalid Dripleaf tilt type " . $block->getLeafState()->name()) + }) + ->writeBool(StateNames::BIG_DRIPLEAF_HEAD, true); + }); + $this->map(Blocks::BIG_DRIPLEAF_STEM(), function(BigDripleafStem $block) : Writer{ + return Writer::create(Ids::BIG_DRIPLEAF) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeString(StateNames::BIG_DRIPLEAF_TILT, StringValues::BIG_DRIPLEAF_TILT_NONE) + ->writeBool(StateNames::BIG_DRIPLEAF_HEAD, false); + }); $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); $this->mapSlab(Blocks::BLACKSTONE_SLAB(), Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); @@ -1454,6 +1476,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) ->writeInt(StateNames::CLUSTER_COUNT, $block->getCount() - 1); }); + $this->map(Blocks::SMALL_DRIPLEAF(), function(SmallDripleaf $block) : Writer{ + return Writer::create(Ids::SMALL_DRIPLEAF_BLOCK) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); + }); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 65b896523a..08c9b5914c 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -35,6 +35,7 @@ use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; +use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; @@ -826,6 +827,22 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readLegacyHorizontalFacing()) ->setAttachmentType($in->readBellAttachmentType()); }); + $this->map(Ids::BIG_DRIPLEAF, function(Reader $in) : Block{ + if($in->readBool(StateNames::BIG_DRIPLEAF_HEAD)){ + return Blocks::BIG_DRIPLEAF_HEAD() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setLeafState(match($type = $in->readString(StateNames::BIG_DRIPLEAF_TILT)){ + StringValues::BIG_DRIPLEAF_TILT_NONE => DripleafState::STABLE(), + StringValues::BIG_DRIPLEAF_TILT_UNSTABLE => DripleafState::UNSTABLE(), + StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT => DripleafState::PARTIAL_TILT(), + StringValues::BIG_DRIPLEAF_TILT_FULL_TILT => DripleafState::FULL_TILT(), + default => throw $in->badValueException(StateNames::BIG_DRIPLEAF_TILT, $type), + }); + }else{ + $in->ignored(StateNames::BIG_DRIPLEAF_TILT); + return Blocks::BIG_DRIPLEAF_STEM()->setFacing($in->readLegacyHorizontalFacing()); + } + }); $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS()); $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); @@ -1332,6 +1349,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readHorizontalFacing()) ->setLit(false); }); + $this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(Reader $in) : Block{ + return Blocks::SMALL_DRIPLEAF() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); + }); $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS()); $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS()); diff --git a/src/data/runtime/RuntimeEnumDescriber.php b/src/data/runtime/RuntimeEnumDescriber.php index 643ecd3018..7103017f75 100644 --- a/src/data/runtime/RuntimeEnumDescriber.php +++ b/src/data/runtime/RuntimeEnumDescriber.php @@ -37,6 +37,8 @@ interface RuntimeEnumDescriber{ public function dirtType(\pocketmine\block\utils\DirtType &$value) : void; + public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void; + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void; public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void; diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 4774304a9b..7d80a6f547 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -71,6 +71,16 @@ trait RuntimeEnumDeserializerTrait{ }; } + public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ + $value = match($this->readInt(2)){ + 0 => \pocketmine\block\utils\DripleafState::FULL_TILT(), + 1 => \pocketmine\block\utils\DripleafState::PARTIAL_TILT(), + 2 => \pocketmine\block\utils\DripleafState::STABLE(), + 3 => \pocketmine\block\utils\DripleafState::UNSTABLE(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DripleafState") + }; + } + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $value = match($this->readInt(4)){ 0 => \pocketmine\block\utils\DyeColor::BLACK(), diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index c570046c67..8c3d671181 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -71,6 +71,16 @@ trait RuntimeEnumSerializerTrait{ }); } + public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ + $this->writeInt(2, match($value){ + \pocketmine\block\utils\DripleafState::FULL_TILT() => 0, + \pocketmine\block\utils\DripleafState::PARTIAL_TILT() => 1, + \pocketmine\block\utils\DripleafState::STABLE() => 2, + \pocketmine\block\utils\DripleafState::UNSTABLE() => 3, + default => throw new \pocketmine\utils\AssumptionFailedError("All DripleafState cases should be covered") + }); + } + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $this->writeInt(4, match($value){ \pocketmine\block\utils\DyeColor::BLACK() => 0, diff --git a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php index 3c8d189e1c..2ab62f03e6 100644 --- a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php +++ b/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php @@ -47,6 +47,10 @@ trait RuntimeEnumSizeCalculatorTrait{ $this->addBits(2); } + public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ + $this->addBits(2); + } + public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $this->addBits(4); } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index e5e5252e16..ea9923c219 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -155,6 +155,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("beetroot_block", fn() => Blocks::BEETROOTS()); $result->registerBlock("beetroots", fn() => Blocks::BEETROOTS()); $result->registerBlock("bell", fn() => Blocks::BELL()); + $result->registerBlock("big_dripleaf", fn() => Blocks::BIG_DRIPLEAF_HEAD()); $result->registerBlock("birch_button", fn() => Blocks::BIRCH_BUTTON()); $result->registerBlock("birch_door", fn() => Blocks::BIRCH_DOOR()); $result->registerBlock("birch_door_block", fn() => Blocks::BIRCH_DOOR()); @@ -972,6 +973,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slime", fn() => Blocks::SLIME()); $result->registerBlock("slime_block", fn() => Blocks::SLIME()); + $result->registerBlock("small_dripleaf", fn() => Blocks::SMALL_DRIPLEAF()); $result->registerBlock("smoker", fn() => Blocks::SMOKER()); $result->registerBlock("smooth_basalt", fn() => Blocks::SMOOTH_BASALT()); $result->registerBlock("smooth_quartz", fn() => Blocks::SMOOTH_QUARTZ()); diff --git a/src/world/sound/DripleafTiltDownSound.php b/src/world/sound/DripleafTiltDownSound.php new file mode 100644 index 0000000000..1366f1b715 --- /dev/null +++ b/src/world/sound/DripleafTiltDownSound.php @@ -0,0 +1,35 @@ + Date: Tue, 18 Jul 2023 11:34:13 +0100 Subject: [PATCH 1202/1858] Bump phpunit/phpunit from 10.2.5 to 10.2.6 (#5909) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.2.5 to 10.2.6. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.2.6/ChangeLog-10.2.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.2.5...10.2.6) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index e005f6ca76..9ada650152 100644 --- a/composer.lock +++ b/composer.lock @@ -1937,16 +1937,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.5", + "version": "10.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd" + "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd", - "reference": "15a89f123d8ca9c1e1598d6d87a56a8bf28c72cd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", "shasum": "" }, "require": { @@ -2018,7 +2018,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" }, "funding": [ { @@ -2034,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2023-07-14T04:18:47+00:00" + "time": "2023-07-17T12:08:28+00:00" }, { "name": "sebastian/cli-parser", From e23806d417fd5db23424ca51507c7e05d3adcfbc Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 18 Jul 2023 14:31:20 +0300 Subject: [PATCH 1203/1858] Stem: fixed supporting block check issue (#5907) This bug was introduced in https://github.com/pmmp/PocketMine-MP/commit/dca752c72f8daeb669dacebf67b0e093cbe366c4 --- src/block/Stem.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/block/Stem.php b/src/block/Stem.php index b0d49b28e1..252b28aebc 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -55,6 +55,7 @@ abstract class Stem extends Crops{ if($this->facing !== Facing::UP && !$this->getSide($this->facing)->hasSameTypeId($this->getPlant())){ $this->position->getWorld()->setBlock($this->position, $this->setFacing(Facing::UP)); } + parent::onNearbyBlockChange(); } public function onRandomTick() : void{ From a74ab756bd67edde77828a618e2dea05ae0f2748 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 12:45:30 +0100 Subject: [PATCH 1204/1858] AsyncTask: strip out task cancellation functionality closes #5854 Cancelling task runs doesn't make any sense. - It breaks sequential task execution - later tasks might depend on state from earlier tasks - It doesn't actually cancel the task - at best, it prevents it from running, but cannot interrupt it (though interrupting a task does not make sense either) We don't use this "feature" in the core anymore since 22b5e5db5e822ac94ed3978ea75bbadcfa8e7f4f, as this was causing unexpected behaviour for plugins anyway, along with the occasional shutdown crash due to inconsistent worker states. --- src/scheduler/AsyncPool.php | 2 +- src/scheduler/AsyncTask.php | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index a326bc87f9..7540294efd 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -259,7 +259,7 @@ class AsyncPool{ if($task->isTerminated()){ $this->checkCrashedWorker($worker, $task); throw new AssumptionFailedError("checkCrashedWorker() should have thrown an exception, making this unreachable"); - }elseif(!$task->hasCancelledRun()){ + }else{ /* * It's possible for a task to submit a progress update and then finish before the progress * update is detected by the parent thread, so here we consume any missed updates. diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 9d69bda5b7..ba5cc424c5 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -72,17 +72,14 @@ abstract class AsyncTask extends Runnable{ private ?ThreadSafeArray $progressUpdates = null; private ThreadSafe|string|int|bool|null|float $result = null; - private bool $cancelRun = false; - private bool $submitted = false; + private bool $submitted = false; private bool $finished = false; public function run() : void{ $this->result = null; - if(!$this->cancelRun){ - $this->onRun(); - } + $this->onRun(); $this->finished = true; $worker = NativeThread::getCurrentThread(); @@ -123,12 +120,18 @@ abstract class AsyncTask extends Runnable{ $this->result = is_scalar($result) || is_null($result) || $result instanceof ThreadSafe ? $result : new NonThreadSafeValue($result); } + /** + * @deprecated + */ public function cancelRun() : void{ - $this->cancelRun = true; + //NOOP } + /** + * @deprecated + */ public function hasCancelledRun() : bool{ - return $this->cancelRun; + return false; } public function setSubmitted() : void{ From 0051b3479743371ce10256fc6d9d7cc1a6eda3e2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 12:58:07 +0100 Subject: [PATCH 1205/1858] Living: fixed turtle helmet being non-removable and spamming inventory updates closes #5786 --- src/entity/Living.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index 29a8ceae8f..5aeea98e52 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -637,9 +637,12 @@ abstract class Living extends Entity{ } foreach($this->armorInventory->getContents() as $index => $item){ + $oldItem = clone $item; if($item->onTickWorn($this)){ $hasUpdate = true; - $this->armorInventory->setItem($index, $item); + if(!$item->equalsExact($oldItem)){ + $this->armorInventory->setItem($index, $item); + } } } } From c053742f5d6ad6270462764d6a30df6226042903 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 13:04:11 +0100 Subject: [PATCH 1206/1858] Living: avoid updates of non-armor slots and armor slots which took no damage this was also updating empty slots ... --- src/entity/Living.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index 5aeea98e52..de433cd120 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -484,14 +484,16 @@ abstract class Living extends Entity{ public function damageArmor(float $damage) : void{ $durabilityRemoved = (int) max(floor($damage / 4), 1); - $armor = $this->armorInventory->getContents(true); - foreach($armor as $item){ + $armor = $this->armorInventory->getContents(); + foreach($armor as $slotId => $item){ if($item instanceof Armor){ + $oldItem = clone $item; $this->damageItem($item, $durabilityRemoved); + if(!$item->equalsExact($oldItem)){ + $this->armorInventory->setItem($slotId, $item); + } } } - - $this->armorInventory->setContents($armor); } private function damageItem(Durable $item, int $durabilityRemoved) : void{ From c6110be051e49784a8c5daf89afd3b899b45a95c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 22:12:33 +0100 Subject: [PATCH 1207/1858] Update BedrockProtocol dependency --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 340191f85c..81c81e27c9 100644 --- a/composer.lock +++ b/composer.lock @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.0+bedrock-1.20.10", + "version": "23.0.1+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2" + "reference": "db48400736799cc3833a2644a02e308992a98fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cfaafdc02cca882a50773d6c02ebfeb622614e2", - "reference": "0cfaafdc02cca882a50773d6c02ebfeb622614e2", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/db48400736799cc3833a2644a02e308992a98fa8", + "reference": "db48400736799cc3833a2644a02e308992a98fa8", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.0+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.1+bedrock-1.20.10" }, - "time": "2023-07-12T12:19:40+00:00" + "time": "2023-07-18T21:07:24+00:00" }, { "name": "pocketmine/binaryutils", From 20b7e8d702fefb90831aae312b5312b237e40cbe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 22:14:23 +0100 Subject: [PATCH 1208/1858] Release 4.23.2 --- changelogs/4.23.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index c87364d679..d51413e824 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -24,3 +24,9 @@ Released 14th July 2023. ## Fixes - Hardened validation of JWT signing keys in `LoginPacket`. - Fixed server crash due to a bug in upstream dependency [`netresearch/jsonmapper`](https://github.com/cweiske/JsonMapper). + +# 4.23.2 +Released 18th July 2023. + +## Fixes +- Fixed login errors due to a new `sandboxId` field appearing in the Xbox Live authentication data in `LoginPacket`. All clients, regardless of version, are affected by this change. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c15758af11..c2bfacea2f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From cff4a8d2bc009b04339200e4dc93ecc3e6a013e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 22:14:24 +0100 Subject: [PATCH 1209/1858] 4.23.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c2bfacea2f..5ef12e2c46 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 69abd5eb532b850c031b0d5529993edd2e591c83 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 22:18:39 +0100 Subject: [PATCH 1210/1858] Release 5.3.2 --- changelogs/5.3.md | 16 ++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/changelogs/5.3.md b/changelogs/5.3.md index 0a776a11ed..3dfd035de5 100644 --- a/changelogs/5.3.md +++ b/changelogs/5.3.md @@ -31,3 +31,19 @@ Released 14th July 2023. ## General - Updated `build/php` submodule to pmmp/PHP-Binaries@e0c918d1379465964acefd562d9e48f87cfc2c9e. + +# 5.3.2 +Released 18th July 2023. + +## Included releases +**This release includes changes from the following releases:** +- [4.23.2](https://github.com/pmmp/PocketMine-MP/blob/4.23.2/changelogs/4.23.md#4232) - Fix for `sandboxId`-related login errors + +## Documentation +- Fixed documentation error in `StringToTParser`. + +## Fixes +- Fixed turtle helmet not being able to be unequipped. + +## Internals +- Armor pieces are no longer set back into the armor inventory if no change was made. This reduces the number of slot updates sent to clients, as well as avoiding unnecessary updates for armor pieces which have Unbreaking enchantments. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4c6553e275..57c3d71866 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.3.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From f38aee1fc515328331bbd87d4349b867171263fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 18 Jul 2023 22:18:39 +0100 Subject: [PATCH 1211/1858] 5.3.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 57c3d71866..7cbd05735d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.3.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 4637aae6210d0a2bb3be6679ef0f649dcf4616f3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 11:43:09 +0100 Subject: [PATCH 1212/1858] Living: do not apply noDamageTicks to suicide damage suicide damage is a voluntary damage source, which noDamageTicks is intended to prevent getting damaged while the player gets their bearings after (re)spawning. --- src/entity/Living.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index de433cd120..e615e4148f 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -504,7 +504,7 @@ abstract class Living extends Entity{ } public function attack(EntityDamageEvent $source) : void{ - if($this->noDamageTicks > 0){ + if($this->noDamageTicks > 0 && $source->getCause() !== EntityDamageEvent::CAUSE_SUICIDE){ $source->cancel(); } From 8414c78969ff76a25f0f86b360b62097be89c5c1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 11:49:52 +0100 Subject: [PATCH 1213/1858] Fixed netherite items burning in lava --- src/entity/Entity.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index cc76479120..092fcc0fc4 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -519,7 +519,12 @@ abstract class Entity{ } public function attack(EntityDamageEvent $source) : void{ - if($this->isFireProof() && ($source->getCause() === EntityDamageEvent::CAUSE_FIRE || $source->getCause() === EntityDamageEvent::CAUSE_FIRE_TICK)){ + if($this->isFireProof() && ( + $source->getCause() === EntityDamageEvent::CAUSE_FIRE || + $source->getCause() === EntityDamageEvent::CAUSE_FIRE_TICK || + $source->getCause() === EntityDamageEvent::CAUSE_LAVA + ) + ){ $source->cancel(); } $source->call(); From 763241b11ff74de0b29c9adfcbcd5263accb4277 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 12:32:00 +0100 Subject: [PATCH 1214/1858] Fixed burning animations for fireproof entities creative players are not technically fireproof; they just don't take any damage from fire --- src/entity/Entity.php | 15 +++++++++------ src/player/Player.php | 8 ++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 092fcc0fc4..8a406924e6 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -691,8 +691,10 @@ abstract class Entity{ if($fireTicks < 0 || $fireTicks > 0x7fff){ throw new \InvalidArgumentException("Fire ticks must be in range 0 ... " . 0x7fff . ", got $fireTicks"); } - $this->fireTicks = $fireTicks; - $this->networkPropertiesDirty = true; + if(!$this->isFireProof()){ + $this->fireTicks = $fireTicks; + $this->networkPropertiesDirty = true; + } } public function extinguish() : void{ @@ -705,12 +707,13 @@ abstract class Entity{ } protected function doOnFireTick(int $tickDiff = 1) : bool{ - if($this->isFireProof() && $this->fireTicks > 1){ - $this->fireTicks = 1; - }else{ - $this->fireTicks -= $tickDiff; + if($this->isFireProof() && $this->isOnFire()){ + $this->extinguish(); + return false; } + $this->fireTicks -= $tickDiff; + if(($this->fireTicks % 20 === 0) || $tickDiff > 20){ $this->dealFireDamage(); } diff --git a/src/player/Player.php b/src/player/Player.php index 11dabf7db6..ccce2d45ee 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1195,10 +1195,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return !$this->gamemode->equals(GameMode::CREATIVE()); } - public function isFireProof() : bool{ - return $this->isCreative(); - } - public function getDrops() : array{ if($this->hasFiniteResources()){ return parent::getDrops(); @@ -1436,6 +1432,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->entityBaseTick($tickDiff); Timings::$entityBaseTick->stopTiming(); + if($this->isCreative() && $this->fireTicks > 1){ + $this->fireTicks = 1; + } + if(!$this->isSpectator() && $this->isAlive()){ Timings::$playerCheckNearEntities->startTiming(); $this->checkNearEntities(); From 537721fe7d845bd369fe456ae0f28fc40e8ff4ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 13:34:42 +0100 Subject: [PATCH 1215/1858] Replace Closure::fromCallable() usages with first-class callables PHP 8.1 <3 --- src/block/Liquid.php | 2 +- src/crafting/CraftingManagerFromDataHelper.php | 11 ++++------- src/network/mcpe/InventoryManager.php | 2 +- src/network/mcpe/NetworkSession.php | 4 ++-- src/world/World.php | 6 +++--- src/world/format/io/WorldProviderManager.php | 8 ++++---- .../phpstan/rules/UnsafeForeachArrayOfStringRule.php | 2 +- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 98f1d56279..a56f666a2c 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -312,7 +312,7 @@ abstract class Liquid extends Transparent{ } if($adjacentDecay <= self::MAX_DECAY){ - $calculator = new MinimumCostFlowCalculator($world, $this->getFlowDecayPerBlock(), \Closure::fromCallable([$this, 'canFlowInto'])); + $calculator = new MinimumCostFlowCalculator($world, $this->getFlowDecayPerBlock(), $this->canFlowInto(...)); foreach($calculator->getOptimalFlowDirections($this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ()) as $facing){ $this->flowIntoBlock($world->getBlock($this->position->getSide($facing)), $adjacentDecay, false); } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 0a28ca328f..812ff83e0a 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -209,9 +209,6 @@ final class CraftingManagerFromDataHelper{ public static function make(string $directoryPath) : CraftingManager{ $result = new CraftingManager(); - $ingredientDeserializerFunc = \Closure::fromCallable([self::class, "deserializeIngredient"]); - $itemDeserializerFunc = \Closure::fromCallable([self::class, 'deserializeItemStack']); - foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'shapeless_crafting.json'), ShapelessRecipeData::class) as $recipe){ $recipeType = match($recipe->block){ "crafting_table" => ShapelessRecipeType::CRAFTING(), @@ -225,7 +222,7 @@ final class CraftingManagerFromDataHelper{ } $inputs = []; foreach($recipe->input as $inputData){ - $input = $ingredientDeserializerFunc($inputData); + $input = self::deserializeIngredient($inputData); if($input === null){ //unknown input item continue 2; } @@ -233,7 +230,7 @@ final class CraftingManagerFromDataHelper{ } $outputs = []; foreach($recipe->output as $outputData){ - $output = $itemDeserializerFunc($outputData); + $output = self::deserializeItemStack($outputData); if($output === null){ //unknown output item continue 2; } @@ -251,7 +248,7 @@ final class CraftingManagerFromDataHelper{ } $inputs = []; foreach(Utils::stringifyKeys($recipe->input) as $symbol => $inputData){ - $input = $ingredientDeserializerFunc($inputData); + $input = self::deserializeIngredient($inputData); if($input === null){ //unknown input item continue 2; } @@ -259,7 +256,7 @@ final class CraftingManagerFromDataHelper{ } $outputs = []; foreach($recipe->output as $outputData){ - $output = $itemDeserializerFunc($outputData); + $output = self::deserializeItemStack($outputData); if($output === null){ //unknown output item continue 2; } diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index a94dbe946e..316abfd3eb 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -108,7 +108,7 @@ class InventoryManager{ private NetworkSession $session ){ $this->containerOpenCallbacks = new ObjectSet(); - $this->containerOpenCallbacks->add(\Closure::fromCallable([self::class, 'createContainerOpen'])); + $this->containerOpenCallbacks->add(self::createContainerOpen(...)); $this->add(ContainerIds::INVENTORY, $this->player->getInventory()); $this->add(ContainerIds::OFFHAND, $this->player->getOffHandInventory()); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index b10e7f25ae..252db34cff 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -225,13 +225,13 @@ class NetworkSession{ $this->logger->setPrefix($this->getLogPrefix()); $this->manager->markLoginReceived($this); }, - \Closure::fromCallable([$this, "setAuthenticationStatus"]) + $this->setAuthenticationStatus(...) )); } protected function createPlayer() : void{ $this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion( - \Closure::fromCallable([$this, 'onPlayerCreated']), + $this->onPlayerCreated(...), function() : void{ //TODO: this should never actually occur... right? $this->logger->error("Failed to create player"); diff --git a/src/world/World.php b/src/world/World.php index deb03ef6dd..f556d2e1f2 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1610,7 +1610,7 @@ class World implements ChunkManager{ * the current weather and time of day. */ public function getHighestAdjacentFullLightAt(int $x, int $y, int $z) : int{ - return $this->getHighestAdjacentLight($x, $y, $z, \Closure::fromCallable([$this, 'getFullLightAt'])); + return $this->getHighestAdjacentLight($x, $y, $z, $this->getFullLightAt(...)); } /** @@ -1706,7 +1706,7 @@ class World implements ChunkManager{ * Returns the highest potential level of sky light in the positions adjacent to the specified block coordinates. */ public function getHighestAdjacentPotentialBlockSkyLight(int $x, int $y, int $z) : int{ - return $this->getHighestAdjacentLight($x, $y, $z, \Closure::fromCallable([$this, 'getPotentialBlockSkyLightAt'])); + return $this->getHighestAdjacentLight($x, $y, $z, $this->getPotentialBlockSkyLightAt(...)); } /** @@ -1721,7 +1721,7 @@ class World implements ChunkManager{ * Returns the highest block light level available in the positions adjacent to the specified block coordinates. */ public function getHighestAdjacentBlockLight(int $x, int $y, int $z) : int{ - return $this->getHighestAdjacentLight($x, $y, $z, \Closure::fromCallable([$this, 'getBlockLightAt'])); + return $this->getHighestAdjacentLight($x, $y, $z, $this->getBlockLightAt(...)); } private function executeQueuedLightUpdates() : void{ diff --git a/src/world/format/io/WorldProviderManager.php b/src/world/format/io/WorldProviderManager.php index 8a30bcb575..1767c539a7 100644 --- a/src/world/format/io/WorldProviderManager.php +++ b/src/world/format/io/WorldProviderManager.php @@ -41,13 +41,13 @@ final class WorldProviderManager{ private WritableWorldProviderManagerEntry $default; public function __construct(){ - $leveldb = new WritableWorldProviderManagerEntry(\Closure::fromCallable([LevelDB::class, 'isValid']), fn(string $path, \Logger $logger) => new LevelDB($path, $logger), \Closure::fromCallable([LevelDB::class, 'generate'])); + $leveldb = new WritableWorldProviderManagerEntry(LevelDB::isValid(...), fn(string $path, \Logger $logger) => new LevelDB($path, $logger), LevelDB::generate(...)); $this->default = $leveldb; $this->addProvider($leveldb, "leveldb"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([Anvil::class, 'isValid']), fn(string $path, \Logger $logger) => new Anvil($path, $logger)), "anvil"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([McRegion::class, 'isValid']), fn(string $path, \Logger $logger) => new McRegion($path, $logger)), "mcregion"); - $this->addProvider(new ReadOnlyWorldProviderManagerEntry(\Closure::fromCallable([PMAnvil::class, 'isValid']), fn(string $path, \Logger $logger) => new PMAnvil($path, $logger)), "pmanvil"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(Anvil::isValid(...), fn(string $path, \Logger $logger) => new Anvil($path, $logger)), "anvil"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(McRegion::isValid(...), fn(string $path, \Logger $logger) => new McRegion($path, $logger)), "mcregion"); + $this->addProvider(new ReadOnlyWorldProviderManagerEntry(PMAnvil::isValid(...), fn(string $path, \Logger $logger) => new PMAnvil($path, $logger)), "pmanvil"); } /** diff --git a/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php b/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php index d53baa3651..e42d329275 100644 --- a/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php +++ b/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php @@ -78,7 +78,7 @@ final class UnsafeForeachArrayOfStringRule implements Rule{ return $type; }); if($hasCastableKeyTypes && !$expectsIntKeyTypes){ - $func = \Closure::fromCallable([Utils::class, 'stringifyKeys']); + $func = Utils::stringifyKeys(...); return [ RuleErrorBuilder::message(sprintf( "Unsafe foreach on array with key type %s (they might be casted to int).", From 914dd90b3d2fb60b87cbd5f8b0fdeb1264c1173f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 13:56:48 +0100 Subject: [PATCH 1216/1858] Use first-class closures in more places --- src/Server.php | 2 +- src/network/mcpe/InventoryManager.php | 4 +--- src/network/mcpe/NetworkSession.php | 10 +++------- src/network/mcpe/cache/CraftingDataCache.php | 12 +++--------- src/utils/RegistryTrait.php | 4 +--- 5 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/Server.php b/src/Server.php index f604c93d7e..530b8d4691 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1009,7 +1009,7 @@ class Server{ $this->playerDataProvider = new DatFilePlayerDataProvider(Path::join($this->dataPath, "players")); - register_shutdown_function([$this, "crashDump"]); + register_shutdown_function($this->crashDump(...)); $loadErrorCount = 0; $this->pluginManager->loadPlugins($this->pluginPath, $loadErrorCount); diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 316abfd3eb..254eff9107 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -116,9 +116,7 @@ class InventoryManager{ $this->addComplex(UIInventorySlotOffset::CURSOR, $this->player->getCursorInventory()); $this->addComplex(UIInventorySlotOffset::CRAFTING2X2_INPUT, $this->player->getCraftingGrid()); - $this->player->getInventory()->getHeldItemIndexChangeListeners()->add(function() : void{ - $this->syncSelectedHotbarSlot(); - }); + $this->player->getInventory()->getHeldItemIndexChangeListeners()->add($this->syncSelectedHotbarSlot(...)); } private function associateIdWithInventory(int $id, Inventory $inventory) : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 252db34cff..dbd857b0ff 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -197,7 +197,7 @@ class NetworkSession{ $this->setHandler(new SessionStartPacketHandler( $this, - fn() => $this->onSessionStartSuccess() + $this->onSessionStartSuccess(...) )); $this->manager->add($this); @@ -787,9 +787,7 @@ class NetworkSession{ $this->cipher = EncryptionContext::fakeGCM($encryptionKey); - $this->setHandler(new HandshakePacketHandler(function() : void{ - $this->onServerLoginSuccess(); - })); + $this->setHandler(new HandshakePacketHandler($this->onServerLoginSuccess(...))); $this->logger->debug("Enabled encryption"); })); }else{ @@ -818,9 +816,7 @@ class NetworkSession{ public function notifyTerrainReady() : void{ $this->logger->debug("Sending spawn notification, waiting for spawn response"); $this->sendDataPacket(PlayStatusPacket::create(PlayStatusPacket::PLAYER_SPAWN)); - $this->setHandler(new SpawnResponsePacketHandler(function() : void{ - $this->onClientSpawnResponse(); - })); + $this->setHandler(new SpawnResponsePacketHandler($this->onClientSpawnResponse(...))); } private function onClientSpawnResponse() : void{ diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index e6ac6167b5..58aa94a88c 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -95,12 +95,8 @@ final class CraftingDataCache{ $recipesWithTypeIds[] = new ProtocolShapelessRecipe( CraftingDataPacket::ENTRY_SHAPELESS, Binary::writeInt($index), - array_map(function(RecipeIngredient $item) use ($converter) : ProtocolRecipeIngredient{ - return $converter->coreRecipeIngredientToNet($item); - }, $recipe->getIngredientList()), - array_map(function(Item $item) use ($converter) : ItemStack{ - return $converter->coreItemStackToNet($item); - }, $recipe->getResults()), + array_map($converter->coreRecipeIngredientToNet(...), $recipe->getIngredientList()), + array_map($converter->coreItemStackToNet(...), $recipe->getResults()), $nullUUID, $typeTag, 50, @@ -118,9 +114,7 @@ final class CraftingDataCache{ CraftingDataPacket::ENTRY_SHAPED, Binary::writeInt($index), $inputs, - array_map(function(Item $item) use ($converter) : ItemStack{ - return $converter->coreItemStackToNet($item); - }, $recipe->getResults()), + array_map($converter->coreItemStackToNet(...), $recipe->getResults()), $nullUUID, CraftingRecipeBlockName::CRAFTING_TABLE, 50, diff --git a/src/utils/RegistryTrait.php b/src/utils/RegistryTrait.php index f8ffc11438..573f4737f1 100644 --- a/src/utils/RegistryTrait.php +++ b/src/utils/RegistryTrait.php @@ -121,8 +121,6 @@ trait RegistryTrait{ */ private static function _registryGetAll() : array{ self::checkInit(); - return array_map(function(object $o) : object{ - return self::preprocessMember($o); - }, self::$members); + return array_map(self::preprocessMember(...), self::$members); } } From 3c34841dfc351f9ce795c71866538c7e26964f62 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 14:00:35 +0100 Subject: [PATCH 1217/1858] CS --- src/network/mcpe/cache/CraftingDataCache.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 58aa94a88c..aa70c7d35c 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -25,21 +25,17 @@ namespace pocketmine\network\mcpe\cache; use pocketmine\crafting\CraftingManager; use pocketmine\crafting\FurnaceType; -use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\ShapedRecipe; use pocketmine\crafting\ShapelessRecipe; use pocketmine\crafting\ShapelessRecipeType; -use pocketmine\item\Item; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\CraftingDataPacket; -use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\recipe\CraftingRecipeBlockName; use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipe as ProtocolFurnaceRecipe; use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipeBlockName; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\PotionContainerChangeRecipe as ProtocolPotionContainerChangeRecipe; use pocketmine\network\mcpe\protocol\types\recipe\PotionTypeRecipe as ProtocolPotionTypeRecipe; -use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient as ProtocolRecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\ShapedRecipe as ProtocolShapedRecipe; use pocketmine\network\mcpe\protocol\types\recipe\ShapelessRecipe as ProtocolShapelessRecipe; use pocketmine\timings\Timings; From 6c59912ed59fb5ef22d7bd2d19d8e8447140da88 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 15:19:33 +0100 Subject: [PATCH 1218/1858] LevelDB: workaround 0 bpb palettes with a length prefix this was caused by a plugin overriding the world provider. related: - https://github.com/pmmp/PocketMine-MP/issues/5911 - https://github.com/Refaltor77/CustomItemAPI/issues/68 fixes #5911 --- src/world/format/io/leveldb/LevelDB.php | 31 ++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index a42d8d53eb..6f6c99d80b 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -27,6 +27,7 @@ use pocketmine\block\Block; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\NBT; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\TreeRoot; @@ -155,7 +156,35 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $nbt = new LittleEndianNbtSerializer(); $palette = []; - $paletteSize = $bitsPerBlock === 0 ? 1 : $stream->getLInt(); + if($bitsPerBlock === 0){ + $paletteSize = 1; + /* + * Due to code copy-paste in a public plugin, some PM4 worlds have 0 bpb palettes with a length prefix. + * This is invalid and does not happen in vanilla. + * These palettes were accepted by PM4 despite being invalid, but PM5 considered them corrupt, causing loss + * of data. Since many users were affected by this, a workaround is therefore necessary to allow PM5 to read + * these worlds without data loss. + * + * References: + * - https://github.com/Refaltor77/CustomItemAPI/issues/68 + * - https://github.com/pmmp/PocketMine-MP/issues/5911 + */ + $offset = $stream->getOffset(); + $byte1 = $stream->getByte(); + $stream->setOffset($offset); //reset offset + + if($byte1 !== NBT::TAG_Compound){ //normally the first byte would be the NBT of the blockstate + $susLength = $stream->getLInt(); + if($susLength !== 1){ //make sure the data isn't complete garbage + throw new CorruptedChunkException("CustomItemAPI borked 0 bpb palette should always have a length of 1"); + } + $logger->error("Unexpected palette size for 0 bpb palette"); + }else{ + $logger->debug("Normal 0 bpb palette found :)"); + } + }else{ + $paletteSize = $stream->getLInt(); + } for($i = 0; $i < $paletteSize; ++$i){ try{ From 82b75e0ccbb87837c0f571050ffd4e806b631afa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 15:21:47 +0100 Subject: [PATCH 1219/1858] LevelDB: Remove happy debug message --- src/world/format/io/leveldb/LevelDB.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 6f6c99d80b..40a93ba9e0 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -179,8 +179,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ throw new CorruptedChunkException("CustomItemAPI borked 0 bpb palette should always have a length of 1"); } $logger->error("Unexpected palette size for 0 bpb palette"); - }else{ - $logger->debug("Normal 0 bpb palette found :)"); } }else{ $paletteSize = $stream->getLInt(); From 1b9c2821948d724b0a00ee7364056ef9a35dc84c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 16:29:14 +0100 Subject: [PATCH 1220/1858] LevelDB: tolerate incorrect number of biome palettes, as long as there are enough for each real subchunk modern versions save 24 exactly, but previous versions saved more. We don't use the excess, so it's not a problem if they are missing, but this is nonetheless non-compliant with vanilla. --- src/world/format/io/leveldb/LevelDB.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 40a93ba9e0..5fb104feb8 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -304,6 +304,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if($nextIndex <= Chunk::MAX_SUBCHUNK_INDEX){ //older versions wrote additional superfluous biome palettes $result[$nextIndex++] = $decoded; } + if($stream->feof() && $nextIndex >= Chunk::MAX_SUBCHUNK_INDEX){ + //not enough padding biome arrays for the given version - this is non-critical since we discard the excess anyway, but this should be logged + $logger->error("Wrong number of 3D biome palettes: expected $expectedCount, but got " . ($i + 1) . " - this is not a problem, but may indicate a corrupted chunk"); + break; + } }catch(BinaryDataException $e){ throw new CorruptedChunkException("Failed to deserialize biome palette $i: " . $e->getMessage(), 0, $e); } From b33a9690e975df0e50a9615619e638106785c778 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 16:30:13 +0100 Subject: [PATCH 1221/1858] LevelDB: simplify condition --- src/world/format/io/leveldb/LevelDB.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 5fb104feb8..2cb5fc42cd 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -303,8 +303,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $previous = $decoded; if($nextIndex <= Chunk::MAX_SUBCHUNK_INDEX){ //older versions wrote additional superfluous biome palettes $result[$nextIndex++] = $decoded; - } - if($stream->feof() && $nextIndex >= Chunk::MAX_SUBCHUNK_INDEX){ + }elseif($stream->feof()){ //not enough padding biome arrays for the given version - this is non-critical since we discard the excess anyway, but this should be logged $logger->error("Wrong number of 3D biome palettes: expected $expectedCount, but got " . ($i + 1) . " - this is not a problem, but may indicate a corrupted chunk"); break; From 86810c5e1c11ccc60e7bdc0565c5d943f30465a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 19 Jul 2023 16:31:10 +0100 Subject: [PATCH 1222/1858] LevelDB: clearer error message --- src/world/format/io/leveldb/LevelDB.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 2cb5fc42cd..3d4f577a1a 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -305,7 +305,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $result[$nextIndex++] = $decoded; }elseif($stream->feof()){ //not enough padding biome arrays for the given version - this is non-critical since we discard the excess anyway, but this should be logged - $logger->error("Wrong number of 3D biome palettes: expected $expectedCount, but got " . ($i + 1) . " - this is not a problem, but may indicate a corrupted chunk"); + $logger->error("Wrong number of 3D biome palettes for this chunk version: expected $expectedCount, but got " . ($i + 1) . " - this is not a problem, but may indicate a corrupted chunk"); break; } }catch(BinaryDataException $e){ From 24d979bd08e15202a05e3c2ae9420142d1a285f5 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 19 Jul 2023 16:33:16 +0100 Subject: [PATCH 1223/1858] Fixed /kill not properly killing the player under certain conditions, closes #4680 (#5919) This occurs if the player had very high levels of Health Boost or other weird modifications. It doesn't really make sense to apply damage modifiers to suicide anyway. Really I'm doubtful that suicide should even be considered a damage type (perhaps we should add an EntitySuicideEvent), but that's a discussion for another time. --- src/command/defaults/KillCommand.php | 2 +- src/entity/Living.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index e58234ead3..fbc7436902 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -53,7 +53,7 @@ class KillCommand extends VanillaCommand{ return true; } - $player->attack(new EntityDamageEvent($player, EntityDamageEvent::CAUSE_SUICIDE, 1000)); + $player->attack(new EntityDamageEvent($player, EntityDamageEvent::CAUSE_SUICIDE, $player->getHealth())); if($player === $sender){ $sender->sendMessage(KnownTranslationFactory::commands_kill_successful($sender->getName())); }else{ diff --git a/src/entity/Living.php b/src/entity/Living.php index e615e4148f..c6fdf34a79 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -517,7 +517,9 @@ abstract class Living extends Entity{ $source->cancel(); } - $this->applyDamageModifiers($source); + if($source->getCause() !== EntityDamageEvent::CAUSE_SUICIDE){ + $this->applyDamageModifiers($source); + } if($source instanceof EntityDamageByEntityEvent && ( $source->getCause() === EntityDamageEvent::CAUSE_BLOCK_EXPLOSION || From 777a90193268bc28d05fba81100db272997a0904 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:37:33 +0100 Subject: [PATCH 1224/1858] Bump shivammathur/setup-php from 2.25.2 to 2.25.4 (#5829) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.25.2 to 2.25.4. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.25.2...2.25.4) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 5f4e944a8d..5275c445b9 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.2 + uses: shivammathur/setup-php@2.25.4 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index ac2e65b2f3..b5376f3bad 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -18,7 +18,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.25.2 + uses: shivammathur/setup-php@2.25.4 with: php-version: 8.1 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f83a2e5970..60e513d80a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -173,7 +173,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.2 + uses: shivammathur/setup-php@2.25.4 with: php-version: 8.1 tools: php-cs-fixer:3.17 From 4517948297f1edcf5d4a3db95b841c002d944aec Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:12:05 -0500 Subject: [PATCH 1225/1858] FrostedIce: Remove non-Bedrock melting behaviour (#5486) --- src/block/FrostedIce.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index ba8c7b5361..38c552a954 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -48,12 +48,7 @@ class FrostedIce extends Ice{ } public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - if(!$this->checkAdjacentBlocks(2)){ - $world->useBreakOn($this->position); - }else{ - $world->scheduleDelayedBlockUpdate($this->position, mt_rand(20, 40)); - } + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(20, 40)); } public function onRandomTick() : void{ From 5e7f18cbcf2240c3dac6c6dccd91c9bbda5a380a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 20 Jul 2023 16:20:34 +0100 Subject: [PATCH 1226/1858] StandardEntityEventBroadcaster: suppress client-side emote messages if users want these, they can broadcast them themselves using Server::broadcastMessage(), which will also record the message in the server log like chat closes #5669 --- src/network/mcpe/StandardEntityEventBroadcaster.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php index 9996b354bb..1600227226 100644 --- a/src/network/mcpe/StandardEntityEventBroadcaster.php +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -138,6 +138,6 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ } public function onEmote(array $recipients, Human $from, string $emoteId) : void{ - $this->sendDataPacket($recipients, EmotePacket::create($from->getId(), $emoteId, "", "", EmotePacket::FLAG_SERVER)); + $this->sendDataPacket($recipients, EmotePacket::create($from->getId(), $emoteId, "", "", EmotePacket::FLAG_SERVER | EmotePacket::FLAG_MUTE_ANNOUNCEMENT)); } } From 6ea7fd7d6b7cb8219f7ffb54d15c8ddf2632d6e0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 20 Jul 2023 16:36:25 +0100 Subject: [PATCH 1227/1858] ShulkerBox: do not offer support for other blocks --- src/block/ShulkerBox.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index de8cefeb80..49de988cd6 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\utils\AnyFacingTrait; +use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -103,4 +104,8 @@ class ShulkerBox extends Opaque{ return true; } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE(); + } } From 4bdd6410db2636fb521c155eced5c385014e2ead Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 20 Jul 2023 17:00:32 +0100 Subject: [PATCH 1228/1858] Fire: fixed support requirements closes #5599 --- src/block/Fire.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/block/Fire.php b/src/block/Fire.php index 648724529f..0f2f7c876c 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\entity\projectile\Arrow; use pocketmine\event\block\BlockBurnEvent; @@ -99,9 +100,13 @@ class Fire extends Flowable{ return []; } + private function canBeSupportedBy(Block $block) : bool{ + return $block->getSupportType(Facing::UP)->equals(SupportType::FULL()); + } + public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); - if($this->getSide(Facing::DOWN)->isTransparent() && !$this->hasAdjacentFlammableBlocks()){ + if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN)) && !$this->hasAdjacentFlammableBlocks()){ $world->setBlock($this->position, VanillaBlocks::AIR()); }else{ $world->scheduleDelayedBlockUpdate($this->position, mt_rand(30, 40)); From 9b43ddecbd77e5ff750ed305eb7d0433a3bca6cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 20 Jul 2023 17:10:39 +0100 Subject: [PATCH 1229/1858] Drop usages of Process:kill() with subprocesses parameter we don't need this any more with console reader improvements, and this was not working correctly anyway. closes #5234 --- src/PocketMine.php | 2 +- src/Server.php | 6 +++--- src/console/ConsoleReaderChildProcess.php | 2 +- src/utils/Process.php | 5 ++++- src/utils/ServerKiller.php | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index c653d33ea7..cbab95c859 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -343,7 +343,7 @@ JIT_WARNING if(ThreadManager::getInstance()->stopAll() > 0){ $logger->debug("Some threads could not be stopped, performing a force-kill"); - Process::kill(Process::pid(), true); + Process::kill(Process::pid()); } }while(false); diff --git a/src/Server.php b/src/Server.php index d4aba82824..d1f7ea4b9d 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1446,7 +1446,7 @@ class Server{ private function forceShutdownExit() : void{ $this->forceShutdown(); - Process::kill(Process::pid(), true); + Process::kill(Process::pid()); } public function forceShutdown() : void{ @@ -1514,7 +1514,7 @@ class Server{ }catch(\Throwable $e){ $this->logger->logException($e); $this->logger->emergency("Crashed while crashing, killing process"); - @Process::kill(Process::pid(), true); + @Process::kill(Process::pid()); } } @@ -1668,7 +1668,7 @@ class Server{ echo "--- Waiting $spacing seconds to throttle automatic restart (you can kill the process safely now) ---" . PHP_EOL; sleep($spacing); } - @Process::kill(Process::pid(), true); + @Process::kill(Process::pid()); exit(1); } diff --git a/src/console/ConsoleReaderChildProcess.php b/src/console/ConsoleReaderChildProcess.php index 2d4e3fc56f..20a3e5bf16 100644 --- a/src/console/ConsoleReaderChildProcess.php +++ b/src/console/ConsoleReaderChildProcess.php @@ -90,4 +90,4 @@ while(!feof($socket)){ //For simplicity's sake, we don't bother with a graceful shutdown here. //The parent process would normally forcibly terminate the child process anyway, so we only reach this point if the //parent process was terminated forcibly and didn't clean up after itself. -Process::kill(Process::pid(), false); +Process::kill(Process::pid()); diff --git a/src/utils/Process.php b/src/utils/Process.php index 96169b34f1..c4dd848d54 100644 --- a/src/utils/Process.php +++ b/src/utils/Process.php @@ -125,7 +125,10 @@ final class Process{ return count(ThreadManager::getInstance()->getAll()) + 2; //MainLogger + Main Thread } - public static function kill(int $pid, bool $subprocesses) : void{ + /** + * @param bool $subprocesses @deprecated + */ + public static function kill(int $pid, bool $subprocesses = false) : void{ $logger = \GlobalLogger::get(); if($logger instanceof MainLogger){ $logger->syncFlushBuffer(); diff --git a/src/utils/ServerKiller.php b/src/utils/ServerKiller.php index 1739643d0a..b7f415528d 100644 --- a/src/utils/ServerKiller.php +++ b/src/utils/ServerKiller.php @@ -49,7 +49,7 @@ class ServerKiller extends Thread{ }); if(time() - $start >= $this->time){ echo "\nTook too long to stop, server was killed forcefully!\n"; - @Process::kill(Process::pid(), true); + @Process::kill(Process::pid()); } } From d65d8c33566bc8e77413c68005b6135926c47df4 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Fri, 21 Jul 2023 04:34:34 -0500 Subject: [PATCH 1230/1858] Fix typo in documentation of `ChunkSelector:selectChunks()` (#5924) --- src/player/ChunkSelector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/player/ChunkSelector.php b/src/player/ChunkSelector.php index feb1b25e21..14d6b2888b 100644 --- a/src/player/ChunkSelector.php +++ b/src/player/ChunkSelector.php @@ -30,7 +30,7 @@ use const M_SQRT2; final class ChunkSelector{ /** - * @preturn \Generator|int[] + * @return \Generator|int[] * @phpstan-return \Generator */ public function selectChunks(int $radius, int $centerX, int $centerZ) : \Generator{ From 5899f2fc1d39175ce7bf0672cc6c09514779b5f2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Jul 2023 15:02:25 +0100 Subject: [PATCH 1231/1858] Block: introduce new methods to reduce support type boilerplate checks this switches from a 'can be supported by' concept to a 'can stay at this position' paradigm, which requires way less boilerplate code. there may be further improvements we can make from here, such as adding traits, but this is a good first step. --- src/block/BaseRail.php | 4 ++-- src/block/Bed.php | 8 ++++---- src/block/Bell.php | 20 ++++++++++---------- src/block/Block.php | 5 +++++ src/block/Button.php | 8 ++++---- src/block/Candle.php | 3 +-- src/block/CaveVines.php | 8 ++++---- src/block/Coral.php | 8 ++++---- src/block/Door.php | 9 ++++----- src/block/FloorCoralFan.php | 8 ++++---- src/block/FlowerPot.php | 8 ++++---- src/block/GlowLichen.php | 4 ++-- src/block/ItemFrame.php | 8 ++++---- src/block/Ladder.php | 8 ++++---- src/block/Lantern.php | 11 ++++++----- src/block/Lever.php | 9 ++++----- src/block/NetherVines.php | 13 +++++-------- src/block/PressurePlate.php | 8 ++++---- src/block/RedstoneComparator.php | 8 ++++---- src/block/RedstoneRepeater.php | 8 ++++---- src/block/RedstoneWire.php | 8 ++++---- src/block/SnowLayer.php | 6 +++--- src/block/SporeBlossom.php | 8 ++++---- src/block/Torch.php | 17 +++++++---------- src/block/WallCoralFan.php | 8 ++++---- 25 files changed, 105 insertions(+), 108 deletions(-) diff --git a/src/block/BaseRail.php b/src/block/BaseRail.php index 971beffac7..0bcb2f340b 100644 --- a/src/block/BaseRail.php +++ b/src/block/BaseRail.php @@ -38,7 +38,7 @@ use function in_array; abstract class BaseRail extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace->getSide(Facing::DOWN)->getSupportType(Facing::UP)->hasEdgeSupport()){ + if($blockReplace->getAdjacentSupportType(Facing::DOWN)->hasEdgeSupport()){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -222,7 +222,7 @@ abstract class BaseRail extends Flowable{ public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); - if(!$this->getSide(Facing::DOWN)->getSupportType(Facing::UP)->hasEdgeSupport()){ + if(!$this->getAdjacentSupportType(Facing::DOWN)->hasEdgeSupport()){ $world->useBreakOn($this->position); }else{ foreach($this->getCurrentShapeConnections() as $connection){ diff --git a/src/block/Bed.php b/src/block/Bed.php index 13b466026b..312b21cd12 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -177,11 +177,11 @@ class Bed extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ $this->facing = $player !== null ? $player->getHorizontalFacing() : Facing::NORTH; $next = $this->getSide($this->getOtherHalfSide()); - if($next->canBeReplaced() && $this->canBeSupportedBy($next->getSide(Facing::DOWN))){ + if($next->canBeReplaced() && $this->canBeSupportedAt($next)){ $nextState = clone $this; $nextState->head = true; $tx->addBlock($blockReplace->position, $this)->addBlock($next->position, $nextState); @@ -208,8 +208,8 @@ class Bed extends Transparent{ return parent::getAffectedBlocks(); } - private function canBeSupportedBy(Block $block) : bool{ - return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block) : bool{ + return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); } public function getMaxStackSize() : int{ return 1; } diff --git a/src/block/Bell.php b/src/block/Bell.php index 753d6453d3..0e2941d8e1 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -87,13 +87,13 @@ final class Bell extends Transparent{ return $this; } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return !$block->getSupportType($face)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return !$block->getAdjacentSupportType($face)->equals(SupportType::NONE()); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($face === Facing::UP){ - if(!$this->canBeSupportedBy($tx->fetchBlock($this->position->down()), Facing::UP)){ + if(!$this->canBeSupportedAt($blockReplace, Facing::DOWN)){ return false; } if($player !== null){ @@ -101,18 +101,18 @@ final class Bell extends Transparent{ } $this->setAttachmentType(BellAttachmentType::FLOOR()); }elseif($face === Facing::DOWN){ - if(!$this->canBeSupportedBy($tx->fetchBlock($this->position->up()), Facing::DOWN)){ + if(!$this->canBeSupportedAt($blockReplace, Facing::UP)){ return false; } $this->setAttachmentType(BellAttachmentType::CEILING()); }else{ $this->setFacing($face); - if($this->canBeSupportedBy($tx->fetchBlock($this->position->getSide(Facing::opposite($face))), $face)){ + if($this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ $this->setAttachmentType(BellAttachmentType::ONE_WALL()); }else{ return false; } - if($this->canBeSupportedBy($tx->fetchBlock($this->position->getSide($face)), Facing::opposite($face))){ + if($this->canBeSupportedAt($blockReplace, $face)){ $this->setAttachmentType(BellAttachmentType::TWO_WALLS()); } } @@ -121,10 +121,10 @@ final class Bell extends Transparent{ public function onNearbyBlockChange() : void{ if( - ($this->attachmentType->equals(BellAttachmentType::CEILING()) && !$this->canBeSupportedBy($this->getSide(Facing::UP), Facing::DOWN)) || - ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && !$this->canBeSupportedBy($this->getSide(Facing::DOWN), Facing::UP)) || - ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) && !$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing)) || - ($this->attachmentType->equals(BellAttachmentType::TWO_WALLS()) && (!$this->canBeSupportedBy($this->getSide($this->facing), Facing::opposite($this->facing)) || !$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing))) + ($this->attachmentType->equals(BellAttachmentType::CEILING()) && !$this->canBeSupportedAt($this, Facing::UP)) || + ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && !$this->canBeSupportedAt($this, Facing::DOWN)) || + ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) && !$this->canBeSupportedAt($this, Facing::opposite($this->facing))) || + ($this->attachmentType->equals(BellAttachmentType::TWO_WALLS()) && (!$this->canBeSupportedAt($this, $this->facing) || !$this->canBeSupportedAt($this, Facing::opposite($this->facing)))) ){ $this->position->getWorld()->useBreakOn($this->position); } diff --git a/src/block/Block.php b/src/block/Block.php index b4203e6b6b..0e045792f9 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -41,6 +41,7 @@ use pocketmine\item\Item; use pocketmine\item\ItemBlock; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; +use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; @@ -863,6 +864,10 @@ class Block{ return SupportType::FULL(); } + protected function getAdjacentSupportType(int $facing) : SupportType{ + return $this->getSide($facing)->getSupportType(Facing::opposite($facing)); + } + public function isFullCube() : bool{ $bb = $this->getCollisionBoxes(); diff --git a/src/block/Button.php b/src/block/Button.php index 85d1d3e091..73bd1d556b 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -52,7 +52,7 @@ abstract class Button extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ + if($this->canBeSupportedAt($blockReplace, $face)){ $this->facing = $face; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -83,12 +83,12 @@ abstract class Button extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing)){ + if(!$this->canBeSupportedAt($this, $this->facing)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $support, int $face) : bool{ - return $support->getSupportType($face)->hasCenterSupport(); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $block->getAdjacentSupportType(Facing::opposite($face))->hasCenterSupport(); } } diff --git a/src/block/Candle.php b/src/block/Candle.php index 5936a08120..7009acef61 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -104,8 +104,7 @@ class Candle extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $blockReplace->getSide(Facing::DOWN); - if(!$down->getSupportType(Facing::UP)->hasCenterSupport()){ + if(!$blockReplace->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport()){ return false; } $existing = $this->getCandleIfCompatibleType($blockReplace); diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index 55f73fb655..e56b8b720b 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -87,18 +87,18 @@ class CaveVines extends Flowable{ return $this->berries ? 14 : 0; } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::DOWN)->equals(SupportType::FULL()) || $block->hasSameTypeId($this); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::UP)->equals(SupportType::FULL()) || $block->hasSameTypeId($this); } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::UP))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } $this->age = mt_rand(0, self::MAX_AGE); diff --git a/src/block/Coral.php b/src/block/Coral.php index b621a3ab0d..837a818574 100644 --- a/src/block/Coral.php +++ b/src/block/Coral.php @@ -32,7 +32,7 @@ use pocketmine\world\BlockTransaction; final class Coral extends BaseCoral{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($tx->fetchBlock($blockReplace->getPosition()->down()))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); @@ -40,14 +40,14 @@ final class Coral extends BaseCoral{ public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); - if(!$this->canBeSupportedBy($world->getBlock($this->position->down()))){ + if(!$this->canBeSupportedAt($this)){ $world->useBreakOn($this->position); }else{ parent::onNearbyBlockChange(); } } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->hasCenterSupport(); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } } diff --git a/src/block/Door.php b/src/block/Door.php index 06da8e68bb..a03427d5ad 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -106,7 +106,7 @@ class Door extends Transparent{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN)) && !$this->getSide(Facing::DOWN) instanceof Door){ //Replace with common break method + if(!$this->canBeSupportedAt($this) && !$this->getSide(Facing::DOWN) instanceof Door){ //Replace with common break method $this->position->getWorld()->useBreakOn($this->position); //this will delete both halves if they exist } } @@ -114,8 +114,7 @@ class Door extends Transparent{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($face === Facing::UP){ $blockUp = $this->getSide(Facing::UP); - $blockDown = $this->getSide(Facing::DOWN); - if(!$blockUp->canBeReplaced() || !$this->canBeSupportedBy($blockDown)){ + if(!$blockUp->canBeReplaced() || !$this->canBeSupportedAt($blockReplace)){ return false; } @@ -172,7 +171,7 @@ class Door extends Transparent{ return parent::getAffectedBlocks(); } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->hasEdgeSupport(); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasEdgeSupport(); } } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index efa560467e..a267a03857 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -53,7 +53,7 @@ final class FloorCoralFan extends BaseCoral{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($tx->fetchBlock($blockReplace->getPosition()->down()))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } if($player !== null){ @@ -75,15 +75,15 @@ final class FloorCoralFan extends BaseCoral{ public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); - if(!$this->canBeSupportedBy($world->getBlock($this->position->down()))){ + if(!$this->canBeSupportedAt($this)){ $world->useBreakOn($this->position); }else{ parent::onNearbyBlockChange(); } } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->hasCenterSupport(); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } public function asItem() : Item{ diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index 1c85ea0d85..4e4dbfa6e1 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -90,7 +90,7 @@ class FlowerPot extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } @@ -98,13 +98,13 @@ class FlowerPot extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->hasCenterSupport(); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/GlowLichen.php b/src/block/GlowLichen.php index d1baaa7d24..39ce512a69 100644 --- a/src/block/GlowLichen.php +++ b/src/block/GlowLichen.php @@ -121,7 +121,7 @@ class GlowLichen extends Transparent{ $changed = false; foreach($this->faces as $face){ - if(!$this->getSide($face)->getSupportType(Facing::opposite($face))->equals(SupportType::FULL())){ + if(!$this->getAdjacentSupportType($face)->equals(SupportType::FULL())){ unset($this->faces[$face]); $changed = true; } @@ -275,7 +275,7 @@ class GlowLichen extends Transparent{ private function getAvailableFaces() : array{ $faces = []; foreach(Facing::ALL as $face){ - if(!$this->hasFace($face) && $this->getSide($face)->getSupportType(Facing::opposite($face))->equals(SupportType::FULL())){ + if(!$this->hasFace($face) && $this->getAdjacentSupportType($face)->equals(SupportType::FULL())){ $faces[$face] = $face; } } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index f14720fe42..21bc5c20ad 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -163,18 +163,18 @@ class ItemFrame extends Flowable{ return true; } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return !$block->getSupportType($face)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return !$block->getAdjacentSupportType($face)->equals(SupportType::NONE()); } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing)){ + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing))){ $this->position->getWorld()->useBreakOn($this->position); } } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ + if(!$this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ return false; } diff --git a/src/block/Ladder.php b/src/block/Ladder.php index 66e5f28cdd..83adada828 100644 --- a/src/block/Ladder.php +++ b/src/block/Ladder.php @@ -70,7 +70,7 @@ class Ladder extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face) && Facing::axis($face) !== Axis::Y){ + if($this->canBeSupportedAt($blockReplace, Facing::opposite($face)) && Facing::axis($face) !== Axis::Y){ $this->facing = $face; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -79,12 +79,12 @@ class Ladder extends Transparent{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::opposite($this->facing)), $this->facing)){ //Replace with common break method + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing))){ //Replace with common break method $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return $block->getSupportType($face)->equals(SupportType::FULL()); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $block->getAdjacentSupportType($face)->equals(SupportType::FULL()); } } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index bc50c3cb62..8ebc8ba2ca 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -77,22 +77,23 @@ class Lantern extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::UP), Facing::DOWN) && !$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN), Facing::UP)){ + $downSupport = $this->canBeSupportedAt($blockReplace, Facing::DOWN); + if(!$downSupport && !$this->canBeSupportedAt($blockReplace, Facing::UP)){ return false; } - $this->hanging = ($face === Facing::DOWN || !$this->canBeSupportedBy($this->position->getWorld()->getBlock($blockReplace->getPosition()->down()), Facing::UP)); + $this->hanging = $face === Facing::DOWN || !$downSupport; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onNearbyBlockChange() : void{ $face = $this->hanging ? Facing::UP : Facing::DOWN; - if(!$this->canBeSupportedBy($this->getSide($face), Facing::opposite($face))){ + if(!$this->canBeSupportedAt($this, $face)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return $block->getSupportType($face)->hasCenterSupport(); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $block->getAdjacentSupportType($face)->hasCenterSupport(); } } diff --git a/src/block/Lever.php b/src/block/Lever.php index 5d86ac7d2a..e4b8c0811d 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -66,7 +66,7 @@ class Lever extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ + if(!$this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ return false; } @@ -90,8 +90,7 @@ class Lever extends Flowable{ } public function onNearbyBlockChange() : void{ - $facing = $this->facing->getFacing(); - if(!$this->canBeSupportedBy($this->getSide(Facing::opposite($facing)), $facing)){ + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing->getFacing()))){ $this->position->getWorld()->useBreakOn($this->position); } } @@ -107,8 +106,8 @@ class Lever extends Flowable{ return true; } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return $block->getSupportType($face)->hasCenterSupport(); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $block->getAdjacentSupportType($face)->hasCenterSupport(); } //TODO diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index ac075f6675..c78000fa1e 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -83,16 +83,13 @@ class NetherVines extends Flowable{ return true; } - private function getSupportFace() : int{ - return Facing::opposite($this->growthFace); - } - - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType($this->getSupportFace())->hasCenterSupport() || $block->hasSameTypeId($this); + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::opposite($this->growthFace)); + return $supportBlock->getSupportType($this->growthFace)->hasCenterSupport() || $supportBlock->hasSameTypeId($this); } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide($this->getSupportFace()))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } @@ -109,7 +106,7 @@ class NetherVines extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide($this->getSupportFace()))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } $this->age = mt_rand(0, self::MAX_AGE - 1); diff --git a/src/block/PressurePlate.php b/src/block/PressurePlate.php index 7f9403b742..4df0bf927d 100644 --- a/src/block/PressurePlate.php +++ b/src/block/PressurePlate.php @@ -45,18 +45,18 @@ abstract class PressurePlate extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } return false; } - private function canBeSupportedBy(Block $block) : bool{ - return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block) : bool{ + return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 2158f1a840..8b436020b7 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -85,7 +85,7 @@ class RedstoneComparator extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ if($player !== null){ $this->facing = Facing::opposite($player->getHorizontalFacing()); } @@ -102,13 +102,13 @@ class RedstoneComparator extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block) : bool{ - return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block) : bool{ + return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); } //TODO: redstone functionality diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index d4f1452384..518eeb9e5e 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -68,7 +68,7 @@ class RedstoneRepeater extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ if($player !== null){ $this->facing = Facing::opposite($player->getHorizontalFacing()); } @@ -88,13 +88,13 @@ class RedstoneRepeater extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block) : bool{ - return !$block->getSupportType(Facing::UP)->equals(SupportType::NONE()); + private function canBeSupportedAt(Block $block) : bool{ + return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); } //TODO: redstone functionality diff --git a/src/block/RedstoneWire.php b/src/block/RedstoneWire.php index 022672b5da..167365f56e 100644 --- a/src/block/RedstoneWire.php +++ b/src/block/RedstoneWire.php @@ -35,7 +35,7 @@ class RedstoneWire extends Flowable{ use AnalogRedstoneSignalEmitterTrait; public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } return false; @@ -49,13 +49,13 @@ class RedstoneWire extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->hasCenterSupport(); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } public function asItem() : Item{ diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index f2425455ce..f561c8ff52 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -80,8 +80,8 @@ class SnowLayer extends Flowable implements Fallable{ return SupportType::NONE(); } - private function canBeSupportedBy(Block $b) : bool{ - return $b->getSupportType(Facing::UP)->equals(SupportType::FULL()); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::FULL()); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ @@ -91,7 +91,7 @@ class SnowLayer extends Flowable implements Fallable{ } $this->layers = $blockReplace->layers + 1; } - if($this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ + if($this->canBeSupportedAt($blockReplace)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/SporeBlossom.php b/src/block/SporeBlossom.php index 73e31edf20..9099321780 100644 --- a/src/block/SporeBlossom.php +++ b/src/block/SporeBlossom.php @@ -32,12 +32,12 @@ use pocketmine\world\BlockTransaction; final class SporeBlossom extends Flowable{ - private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::DOWN)->equals(SupportType::FULL()); + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::UP)->equals(SupportType::FULL()); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::UP))){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } @@ -45,7 +45,7 @@ final class SporeBlossom extends Flowable{ } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } diff --git a/src/block/Torch.php b/src/block/Torch.php index 163c0d115c..66b62bc19a 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; -use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -56,15 +55,13 @@ class Torch extends Flowable{ } public function onNearbyBlockChange() : void{ - $face = Facing::opposite($this->facing); - - if(!$this->canBeSupportedBy($this->getSide($face), $this->facing)){ + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing))){ $this->position->getWorld()->useBreakOn($this->position); } } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($face !== Facing::DOWN && $this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ + if($face !== Facing::DOWN && $this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ $this->facing = $face; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); }else{ @@ -75,8 +72,7 @@ class Torch extends Flowable{ Facing::EAST, Facing::DOWN ] as $side){ - $block = $this->getSide($side); - if($this->canBeSupportedBy($block, Facing::opposite($side))){ + if($this->canBeSupportedAt($blockReplace, $side)){ $this->facing = Facing::opposite($side); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -85,8 +81,9 @@ class Torch extends Flowable{ return false; } - private function canBeSupportedBy(Block $support, int $face) : bool{ - return ($face === Facing::UP && $support->getSupportType($face)->hasCenterSupport()) || - (Facing::axis($face) !== Axis::Y && $support->getSupportType($face)->equals(SupportType::FULL())); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $face === Facing::DOWN ? + $block->getAdjacentSupportType($face)->hasCenterSupport() : + $block->getAdjacentSupportType($face)->equals(SupportType::FULL()); } } diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 432dd5ddba..f9dece1cd6 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -42,7 +42,7 @@ final class WallCoralFan extends BaseCoral{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $axis = Facing::axis($face); - if(($axis !== Axis::X && $axis !== Axis::Z) || !$this->canBeSupportedBy($blockReplace->getSide(Facing::opposite($face)), $face)){ + if(($axis !== Axis::X && $axis !== Axis::Z) || !$this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ return false; } $this->facing = $face; @@ -54,15 +54,15 @@ final class WallCoralFan extends BaseCoral{ public function onNearbyBlockChange() : void{ $world = $this->position->getWorld(); - if(!$this->canBeSupportedBy($world->getBlock($this->position->getSide(Facing::opposite($this->facing))), $this->facing)){ + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing))){ $world->useBreakOn($this->position); }else{ parent::onNearbyBlockChange(); } } - private function canBeSupportedBy(Block $block, int $face) : bool{ - return $block->getSupportType($face)->hasCenterSupport(); + private function canBeSupportedAt(Block $block, int $face) : bool{ + return $block->getAdjacentSupportType($face)->hasCenterSupport(); } public function asItem() : Item{ From 2779f92828de5214f73d4df151effa1d97466deb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 21 Jul 2023 15:29:33 +0100 Subject: [PATCH 1232/1858] Bell: clean up code --- src/block/Bell.php | 55 ++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/block/Bell.php b/src/block/Bell.php index 0e2941d8e1..3f15d6909d 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -35,6 +35,7 @@ use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\sound\BellRingSound; @@ -92,41 +93,39 @@ final class Bell extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ + return false; + } if($face === Facing::UP){ - if(!$this->canBeSupportedAt($blockReplace, Facing::DOWN)){ - return false; - } if($player !== null){ $this->setFacing(Facing::opposite($player->getHorizontalFacing())); } $this->setAttachmentType(BellAttachmentType::FLOOR()); }elseif($face === Facing::DOWN){ - if(!$this->canBeSupportedAt($blockReplace, Facing::UP)){ - return false; - } $this->setAttachmentType(BellAttachmentType::CEILING()); }else{ $this->setFacing($face); - if($this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ - $this->setAttachmentType(BellAttachmentType::ONE_WALL()); - }else{ - return false; - } - if($this->canBeSupportedAt($blockReplace, $face)){ - $this->setAttachmentType(BellAttachmentType::TWO_WALLS()); - } + $this->setAttachmentType( + $this->canBeSupportedAt($blockReplace, $face) ? + BellAttachmentType::TWO_WALLS() : + BellAttachmentType::ONE_WALL() + ); } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onNearbyBlockChange() : void{ - if( - ($this->attachmentType->equals(BellAttachmentType::CEILING()) && !$this->canBeSupportedAt($this, Facing::UP)) || - ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && !$this->canBeSupportedAt($this, Facing::DOWN)) || - ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) && !$this->canBeSupportedAt($this, Facing::opposite($this->facing))) || - ($this->attachmentType->equals(BellAttachmentType::TWO_WALLS()) && (!$this->canBeSupportedAt($this, $this->facing) || !$this->canBeSupportedAt($this, Facing::opposite($this->facing)))) - ){ - $this->position->getWorld()->useBreakOn($this->position); + foreach(match($this->attachmentType){ + BellAttachmentType::CEILING() => [Facing::UP], + BellAttachmentType::FLOOR() => [Facing::DOWN], + BellAttachmentType::ONE_WALL() => [Facing::opposite($this->facing)], + BellAttachmentType::TWO_WALLS() => [$this->facing, Facing::opposite($this->facing)], + default => throw new AssumptionFailedError("All cases of BellAttachmentType must be handled") + } as $supportBlockDirection){ + if(!$this->canBeSupportedAt($this, $supportBlockDirection)){ + $this->position->getWorld()->useBreakOn($this->position); + break; + } } } @@ -159,13 +158,11 @@ final class Bell extends Transparent{ } private function isValidFaceToRing(int $faceHit) : bool{ - return ( - $this->attachmentType->equals(BellAttachmentType::CEILING()) || - ($this->attachmentType->equals(BellAttachmentType::FLOOR()) && Facing::axis($faceHit) === Facing::axis($this->facing)) || - ( - ($this->attachmentType->equals(BellAttachmentType::ONE_WALL()) || $this->attachmentType->equals(BellAttachmentType::TWO_WALLS())) && - ($faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true)) - ) - ); + return match($this->attachmentType){ + BellAttachmentType::CEILING() => true, + BellAttachmentType::FLOOR() => Facing::axis($faceHit) === Facing::axis($this->facing), + BellAttachmentType::ONE_WALL(), BellAttachmentType::TWO_WALLS() => $faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true), + default => throw new AssumptionFailedError("All cases of BellAttachmentType must be handled") + }; } } From cdf72563f4b483ef657bdb29aa107d38d1883b7e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 11:58:50 +0100 Subject: [PATCH 1233/1858] Update composer dependencies --- composer.lock | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index 81c81e27c9..cae00386da 100644 --- a/composer.lock +++ b/composer.lock @@ -2221,16 +2221,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.3", + "version": "10.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e" + "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35c8cac1734ede2ae354a6644f7088356ff5b08e", - "reference": "35c8cac1734ede2ae354a6644f7088356ff5b08e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", "shasum": "" }, "require": { @@ -2302,7 +2302,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" }, "funding": [ { @@ -2318,7 +2318,7 @@ "type": "tidelift" } ], - "time": "2023-06-30T06:17:38+00:00" + "time": "2023-07-17T12:08:28+00:00" }, { "name": "sebastian/cli-parser", @@ -2830,16 +2830,16 @@ }, { "name": "sebastian/global-state", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "aab257c712de87b90194febd52e4d184551c2d44" + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44", - "reference": "aab257c712de87b90194febd52e4d184551c2d44", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", "shasum": "" }, "require": { @@ -2879,7 +2879,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" }, "funding": [ { @@ -2887,7 +2888,7 @@ "type": "github" } ], - "time": "2023-02-03T07:07:38+00:00" + "time": "2023-07-19T07:19:23+00:00" }, { "name": "sebastian/lines-of-code", From 70dd8732e2955245f3c1a2a47befcaebf93f0bc9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 11:59:11 +0100 Subject: [PATCH 1234/1858] Update build/php to pmmp/PHP-Binaries@46604f2f6a07e3f68a82e4f4d7efdd45629b101e --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 16378ffcc3..46604f2f6a 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 16378ffcc39036cf4905d32ce845b2c831db4331 +Subproject commit 46604f2f6a07e3f68a82e4f4d7efdd45629b101e From 43770313ba08a7fb021536a2bc892c2228724c5a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 12:07:32 +0100 Subject: [PATCH 1235/1858] Update symfony/filesystem to 6.3.x --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 4589d73a17..ea312ac147 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,7 @@ "pocketmine/raklib-ipc": "^0.2.0", "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "~4.7.0", - "symfony/filesystem": "~6.2.0" + "symfony/filesystem": "~6.3.0" }, "require-dev": { "phpstan/phpstan": "1.10.16", diff --git a/composer.lock b/composer.lock index a82393a891..53807f312e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ee46ec27f8dfc8c767527b7776fe9992", + "content-hash": "74166e6c2f09b356c83a951efef349f2", "packages": [ { "name": "adhocore/json-comment", @@ -998,16 +998,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.2.12", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b0818e7203e53540f2a5c9a5017d97897df1e9bb", - "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -1041,7 +1041,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.12" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -1057,7 +1057,7 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:29:37+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/polyfill-ctype", From 4eb9dacd3cc219eeaff0c9cbda80683e3c02d9ba Mon Sep 17 00:00:00 2001 From: dohwi <78037515+dohwi@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:16:56 +0900 Subject: [PATCH 1236/1858] Remove unnecessary HorizontalFacingTrait (#5930) FacingOppositePlacingPlayerTrait already includes HorizontalFacingTrait, so we don't need to include it twice. --- src/block/CarvedPumpkin.php | 2 -- src/block/ChemistryTable.php | 2 -- src/block/Chest.php | 2 -- src/block/EndPortalFrame.php | 2 -- src/block/EnderChest.php | 2 -- src/block/Furnace.php | 2 -- src/block/GlazedTerracotta.php | 2 -- src/block/Lectern.php | 2 -- src/block/Loom.php | 2 -- src/block/Stonecutter.php | 2 -- 10 files changed, 20 deletions(-) diff --git a/src/block/CarvedPumpkin.php b/src/block/CarvedPumpkin.php index 5fc73d0889..98f3c2307a 100644 --- a/src/block/CarvedPumpkin.php +++ b/src/block/CarvedPumpkin.php @@ -24,9 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; class CarvedPumpkin extends Opaque{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; } diff --git a/src/block/ChemistryTable.php b/src/block/ChemistryTable.php index 27fb636746..058e402883 100644 --- a/src/block/ChemistryTable.php +++ b/src/block/ChemistryTable.php @@ -24,14 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; final class ChemistryTable extends Opaque{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ //TODO diff --git a/src/block/Chest.php b/src/block/Chest.php index 45c1905058..270c696c33 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\item\Item; @@ -36,7 +35,6 @@ use pocketmine\player\Player; class Chest extends Transparent{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; /** * @return AxisAlignedBB[] diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 08c903f117..612cf3723c 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -24,14 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; class EndPortalFrame extends Opaque{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; protected bool $eye = false; diff --git a/src/block/EnderChest.php b/src/block/EnderChest.php index 68c2805f9a..26596eac94 100644 --- a/src/block/EnderChest.php +++ b/src/block/EnderChest.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\inventory\EnderChestInventory; use pocketmine\block\tile\EnderChest as TileEnderChest; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -36,7 +35,6 @@ use pocketmine\player\Player; class EnderChest extends Transparent{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; public function getLightLevel() : int{ return 7; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index d943f8cc61..fbff73c939 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -35,7 +34,6 @@ use function mt_rand; class Furnace extends Opaque{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; protected FurnaceType $furnaceType; diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index 5568703c23..b49347aef0 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -26,12 +26,10 @@ namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; class GlazedTerracotta extends Opaque{ use ColoredTrait; use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ $this->color = DyeColor::BLACK(); diff --git a/src/block/Lectern.php b/src/block/Lectern.php index a80426acff..d9f07d22b9 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Lectern as TileLectern; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -39,7 +38,6 @@ use function count; class Lectern extends Transparent{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; protected int $viewedPage = 0; protected ?WritableBookBase $book = null; diff --git a/src/block/Loom.php b/src/block/Loom.php index a10b577232..d3dd4f3c76 100644 --- a/src/block/Loom.php +++ b/src/block/Loom.php @@ -25,14 +25,12 @@ namespace pocketmine\block; use pocketmine\block\inventory\LoomInventory; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; final class Loom extends Opaque{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ diff --git a/src/block/Stonecutter.php b/src/block/Stonecutter.php index 7736381e43..eb7dc68c26 100644 --- a/src/block/Stonecutter.php +++ b/src/block/Stonecutter.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -35,7 +34,6 @@ use pocketmine\player\Player; class Stonecutter extends Transparent{ use FacesOppositePlacingPlayerTrait; - use HorizontalFacingTrait; public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player !== null){ From b078e01b65a9a45386ff23633d927362ea9c58a4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 13:35:32 +0100 Subject: [PATCH 1237/1858] JwtUtils: handle DER <-> raw signature conversion in-house, drop fgrosse/phpasn1 dependency normally I would hesitate to reinvent the wheel, but we only need a tiny subset of the ASN.1 spec which is trivial to implement by itself. I'd rather this than depend on another library that could introduce security vulnerabilities (I'm looking at you, jsonmapper). closes #5935 --- composer.json | 1 - composer.lock | 78 +------------------- src/network/mcpe/JwtUtils.php | 131 ++++++++++++++++++++++------------ 3 files changed, 85 insertions(+), 125 deletions(-) diff --git a/composer.json b/composer.json index ea312ac147..608c88459c 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,6 @@ "ext-zlib": ">=1.2.11", "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", - "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", diff --git a/composer.lock b/composer.lock index 53807f312e..2a4521d262 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "74166e6c2f09b356c83a951efef349f2", + "content-hash": "fa059375785ed5b842af30c6b99c572f", "packages": [ { "name": "adhocore/json-comment", @@ -120,82 +120,6 @@ ], "time": "2023-01-15T23:15:59+00:00" }, - { - "name": "fgrosse/phpasn1", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/fgrosse/PHPASN1.git", - "reference": "42060ed45344789fb9f21f9f1864fc47b9e3507b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/42060ed45344789fb9f21f9f1864fc47b9e3507b", - "reference": "42060ed45344789fb9f21f9f1864fc47b9e3507b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "~2.0", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "suggest": { - "ext-bcmath": "BCmath is the fallback extension for big integer calculations", - "ext-curl": "For loading OID information from the web if they have not bee defined statically", - "ext-gmp": "GMP is the preferred extension for big integer calculations", - "phpseclib/bcmath_compat": "BCmath polyfill for servers where neither GMP nor BCmath is available" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "FG\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Friedrich Große", - "email": "friedrich.grosse@gmail.com", - "homepage": "https://github.com/FGrosse", - "role": "Author" - }, - { - "name": "All contributors", - "homepage": "https://github.com/FGrosse/PHPASN1/contributors" - } - ], - "description": "A PHP Framework that allows you to encode and decode arbitrary ASN.1 structures using the ITU-T X.690 Encoding Rules.", - "homepage": "https://github.com/FGrosse/PHPASN1", - "keywords": [ - "DER", - "asn.1", - "asn1", - "ber", - "binary", - "decoding", - "encoding", - "x.509", - "x.690", - "x509", - "x690" - ], - "support": { - "issues": "https://github.com/fgrosse/PHPASN1/issues", - "source": "https://github.com/fgrosse/PHPASN1/tree/v2.5.0" - }, - "abandoned": true, - "time": "2022-12-19T11:08:26+00:00" - }, { "name": "pocketmine/bedrock-block-upgrade-schema", "version": "3.1.0", diff --git a/src/network/mcpe/JwtUtils.php b/src/network/mcpe/JwtUtils.php index a3cebbd730..259a602d48 100644 --- a/src/network/mcpe/JwtUtils.php +++ b/src/network/mcpe/JwtUtils.php @@ -23,28 +23,26 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; -use FG\ASN1\Exception\ParserException; -use FG\ASN1\Universal\Integer; -use FG\ASN1\Universal\Sequence; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\BinaryStream; use pocketmine\utils\Utils; use function base64_decode; use function base64_encode; +use function bin2hex; +use function chr; use function count; use function explode; -use function gmp_export; -use function gmp_import; -use function gmp_init; -use function gmp_strval; use function is_array; use function json_decode; use function json_encode; use function json_last_error_msg; +use function ltrim; use function openssl_error_string; use function openssl_pkey_get_details; use function openssl_pkey_get_public; use function openssl_sign; use function openssl_verify; +use function ord; use function preg_match; use function rtrim; use function sprintf; @@ -54,8 +52,7 @@ use function str_replace; use function str_split; use function strlen; use function strtr; -use const GMP_BIG_ENDIAN; -use const GMP_MSW_FIRST; +use function substr; use const JSON_THROW_ON_ERROR; use const OPENSSL_ALGO_SHA384; use const STR_PAD_LEFT; @@ -63,6 +60,12 @@ use const STR_PAD_LEFT; final class JwtUtils{ public const BEDROCK_SIGNING_KEY_CURVE_NAME = "secp384r1"; + private const ASN1_INTEGER_TAG = "\x02"; + private const ASN1_SEQUENCE_TAG = "\x30"; + + private const SIGNATURE_PART_LENGTH = 48; + private const SIGNATURE_ALGORITHM = OPENSSL_ALGO_SHA384; + /** * @return string[] * @phpstan-return array{string, string, string} @@ -98,30 +101,84 @@ final class JwtUtils{ return [$header, $body, $signature]; } + private static function signaturePartToAsn1(string $part) : string{ + if(strlen($part) !== self::SIGNATURE_PART_LENGTH){ + throw new JwtException("R and S for a SHA384 signature must each be exactly 48 bytes, but have " . strlen($part) . " bytes"); + } + $part = ltrim($part, "\x00"); + if(ord($part[0]) >= 128){ + //ASN.1 integers with a leading 1 bit are considered negative - add a leading 0 byte to prevent this + //ECDSA signature R and S values are always positive + $part = "\x00" . $part; + } + + //we can assume the length is 1 byte here - if it were larger than 127, more complex logic would be needed + return self::ASN1_INTEGER_TAG . chr(strlen($part)) . $part; + } + + private static function rawSignatureToDer(string $rawSignature) : string{ + if(strlen($rawSignature) !== self::SIGNATURE_PART_LENGTH * 2){ + throw new JwtException("JWT signature has unexpected length, expected 96, got " . strlen($rawSignature)); + } + + [$rString, $sString] = str_split($rawSignature, self::SIGNATURE_PART_LENGTH); + $sequence = self::signaturePartToAsn1($rString) . self::signaturePartToAsn1($sString); + + //we can assume the length is 1 byte here - if it were larger than 127, more complex logic would be needed + return self::ASN1_SEQUENCE_TAG . chr(strlen($sequence)) . $sequence; + } + + private static function signaturePartFromAsn1(BinaryStream $stream) : string{ + $prefix = $stream->get(1); + if($prefix !== self::ASN1_INTEGER_TAG){ + throw new \InvalidArgumentException("Expected an ASN.1 INTEGER tag, got " . bin2hex($prefix)); + } + //we can assume the length is 1 byte here - if it were larger than 127, more complex logic would be needed + $length = $stream->getByte(); + if($length > self::SIGNATURE_PART_LENGTH + 1){ //each part may have an extra leading 0 byte to prevent it being interpreted as a negative number + throw new \InvalidArgumentException("Expected at most 49 bytes for signature R or S, got $length"); + } + $part = $stream->get($length); + return str_pad(ltrim($part, "\x00"), self::SIGNATURE_PART_LENGTH, "\x00", STR_PAD_LEFT); + } + + private static function rawSignatureFromDer(string $derSignature) : string{ + if($derSignature[0] !== self::ASN1_SEQUENCE_TAG){ + throw new \InvalidArgumentException("Invalid DER signature, expected ASN.1 SEQUENCE tag, got " . bin2hex($derSignature[0])); + } + + //we can assume the length is 1 byte here - if it were larger than 127, more complex logic would be needed + $length = ord($derSignature[1]); + $parts = substr($derSignature, 2, $length); + if(strlen($parts) !== $length){ + throw new \InvalidArgumentException("Invalid DER signature, expected $length sequence bytes, got " . strlen($parts)); + } + + $stream = new BinaryStream($parts); + $rRaw = self::signaturePartFromAsn1($stream); + $sRaw = self::signaturePartFromAsn1($stream); + + if(!$stream->feof()){ + throw new \InvalidArgumentException("Invalid DER signature, unexpected trailing sequence data"); + } + + return $rRaw . $sRaw; + } + /** * @throws JwtException */ public static function verify(string $jwt, \OpenSSLAsymmetricKey $signingKey) : bool{ [$header, $body, $signature] = self::split($jwt); - $plainSignature = self::b64UrlDecode($signature); - if(strlen($plainSignature) !== 96){ - throw new JwtException("JWT signature has unexpected length, expected 96, got " . strlen($plainSignature)); - } - - [$rString, $sString] = str_split($plainSignature, 48); - $convert = fn(string $str) => gmp_strval(gmp_import($str, 1, GMP_BIG_ENDIAN | GMP_MSW_FIRST), 10); - - $sequence = new Sequence( - new Integer($convert($rString)), - new Integer($convert($sString)) - ); + $rawSignature = self::b64UrlDecode($signature); + $derSignature = self::rawSignatureToDer($rawSignature); $v = openssl_verify( $header . '.' . $body, - $sequence->getBinary(), + $derSignature, $signingKey, - OPENSSL_ALGO_SHA384 + self::SIGNATURE_ALGORITHM ); switch($v){ case 0: return false; @@ -140,33 +197,13 @@ final class JwtUtils{ openssl_sign( $jwtBody, - $rawDerSig, + $derSignature, $signingKey, - OPENSSL_ALGO_SHA384 + self::SIGNATURE_ALGORITHM ); - try{ - $asnObject = Sequence::fromBinary($rawDerSig); - }catch(ParserException $e){ - throw new AssumptionFailedError("Failed to parse OpenSSL signature: " . $e->getMessage(), 0, $e); - } - if(count($asnObject) !== 2){ - throw new AssumptionFailedError("OpenSSL produced invalid signature, expected exactly 2 parts"); - } - [$r, $s] = [$asnObject[0], $asnObject[1]]; - if(!($r instanceof Integer) || !($s instanceof Integer)){ - throw new AssumptionFailedError("OpenSSL produced invalid signature, expected 2 INTEGER parts"); - } - $rString = $r->getContent(); - $sString = $s->getContent(); - - $toBinary = fn($str) => str_pad( - gmp_export(gmp_init($str, 10), 1, GMP_BIG_ENDIAN | GMP_MSW_FIRST), - 48, - "\x00", - STR_PAD_LEFT - ); - $jwtSig = JwtUtils::b64UrlEncode($toBinary($rString) . $toBinary($sString)); + $rawSignature = self::rawSignatureFromDer($derSignature); + $jwtSig = self::b64UrlEncode($rawSignature); return "$jwtBody.$jwtSig"; } From 2a4909d328db8f7b71e47835f23f9072f6814c6b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 16:44:01 +0100 Subject: [PATCH 1238/1858] Fixed missing handling for some ContainerUIIds SMITHING_TABLE_TEMPLATE is new in 1.20 HORSE_EQUIP was always present, but somehow got overlooked when building up that big ugly switch table --- composer.json | 2 +- composer.lock | 14 +++++++------- .../handler/ItemStackContainerIdTranslator.php | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index e3c8d3e1f8..999ad29c94 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", - "pocketmine/bedrock-protocol": "~23.0.0+bedrock-1.20.10", + "pocketmine/bedrock-protocol": "~23.0.2+bedrock-1.20.10", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index cae00386da..4c90391e47 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4524eed9bd1a33e650413fbf41382e20", + "content-hash": "2acf1299aa8b354c44495ae048aa8893", "packages": [ { "name": "adhocore/json-comment", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.1+bedrock-1.20.10", + "version": "23.0.2+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "db48400736799cc3833a2644a02e308992a98fa8" + "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/db48400736799cc3833a2644a02e308992a98fa8", - "reference": "db48400736799cc3833a2644a02e308992a98fa8", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", + "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.1+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.2+bedrock-1.20.10" }, - "time": "2023-07-18T21:07:24+00:00" + "time": "2023-07-24T15:35:36+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/ItemStackContainerIdTranslator.php b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php index f9ea9ef5f6..e9356dd73b 100644 --- a/src/network/mcpe/handler/ItemStackContainerIdTranslator.php +++ b/src/network/mcpe/handler/ItemStackContainerIdTranslator.php @@ -70,6 +70,7 @@ final class ItemStackContainerIdTranslator{ ContainerUIIds::MATERIAL_REDUCER_OUTPUT, ContainerUIIds::SMITHING_TABLE_INPUT, ContainerUIIds::SMITHING_TABLE_MATERIAL, + ContainerUIIds::SMITHING_TABLE_TEMPLATE, ContainerUIIds::STONECUTTER_INPUT, ContainerUIIds::TRADE2_INGREDIENT1, ContainerUIIds::TRADE2_INGREDIENT2, @@ -84,6 +85,7 @@ final class ItemStackContainerIdTranslator{ ContainerUIIds::FURNACE_FUEL, ContainerUIIds::FURNACE_INGREDIENT, ContainerUIIds::FURNACE_RESULT, + ContainerUIIds::HORSE_EQUIP, ContainerUIIds::LEVEL_ENTITY, //chest ContainerUIIds::SHULKER_BOX, ContainerUIIds::SMOKER_INGREDIENT => [$currentWindowId, $slotId], From 948875b0257ff3542878f660daa74661ee0b9b81 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 16:59:45 +0100 Subject: [PATCH 1239/1858] Release 4.23.3 --- changelogs/4.23.md | 13 +++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index d51413e824..6cd261ba13 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -30,3 +30,16 @@ Released 18th July 2023. ## Fixes - Fixed login errors due to a new `sandboxId` field appearing in the Xbox Live authentication data in `LoginPacket`. All clients, regardless of version, are affected by this change. + +# 4.23.3 +Released 24th July 2023. + +## Documentation +- Fixed typo in `ChunkSelector::selectChunks()` documentation. + +## Fixes +- Fixed the server not stopping properly during crash conditions on *nix platforms. +- Fixed `HORSE_EQUIP` and `SMITHING_TABLE_TEMPLATE` container UI types not being handled by `ItemStackContainerIdTranslator`. This bug prevented plugins from implementing missing inventory types. +- Player emotes no longer broadcast messages to other players. This was unintended behaviour caused by a client-side behavioural change. +- Shulker boxes no longer support the placement of torches or other similar blocks. +- Fire can now be placed on upper slabs and the top of upside-down stairs. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5ef12e2c46..1025e0721e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 1c611a03e6c8afb2da57147f41225646cdd2f8e0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 16:59:48 +0100 Subject: [PATCH 1240/1858] 4.23.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1025e0721e..490300ff5f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From a1f34a460bd8206c552935ed5170f2ad85cefc37 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 17:29:56 +0100 Subject: [PATCH 1241/1858] Release 5.3.3 --- changelogs/5.3.md | 23 +++++++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/changelogs/5.3.md b/changelogs/5.3.md index 3dfd035de5..173e73cb85 100644 --- a/changelogs/5.3.md +++ b/changelogs/5.3.md @@ -47,3 +47,26 @@ Released 18th July 2023. ## Internals - Armor pieces are no longer set back into the armor inventory if no change was made. This reduces the number of slot updates sent to clients, as well as avoiding unnecessary updates for armor pieces which have Unbreaking enchantments. + +# 5.3.3 +Released 24th July 2023. + +## Included releases +**This release includes changes from the following releases:** +- [4.23.3](https://github.com/pmmp/PocketMine-MP/blob/4.23.3/changelogs/4.23.md#4233) - Various bug fixes + +## Fixes +- Added a workaround for PM4 worlds with chunks corrupted by [Refaltor77/CustomItemAPI](https://github.com/Refaltor77/CustomItemAPI). + - While this was not the fault of PocketMine-MP itself, a significant number of users were affected by this problem. + - This error was not detected by PM4 due to missing validation of certain data which should not have existed in 1.12. + - An error will now be logged when this corruption is detected, but the affected chunks should otherwise load normally. +- Relaxed validation of expected 3D biome array counts per chunk in LevelDB worlds. + - Vanilla Bedrock currently saves 24 palettes (and only 24 are required), but it saved 25, 32, or 64 biome palettes per chunk in older versions. + - Core validation for these padding biomes was very strict, enforcing exact compliance with vanilla. + - Since only 24 palettes are actually required, the remaining palettes may now be omitted irrespective of the chunk version. + - An error will still be logged when this mistake is detected, but the affected chunks will otherwise load normally. +- Fixed `/kill` not working on players who had (re)spawned in the 3 seconds immediately after (re)spawning (due to `noDamageTicks`). +- Fixed `/kill` not working correctly for players with high levels of Health Boost or other health-altering effects. +- Fixed netherite items being destroyed by lava. +- Fireproof entities no longer display the burning animation when in fire or lava. This does not apply to creative players, who are immortal rather than being fireproof. +- Fixed frosted ice melting in certain conditions which didn't match vanilla Bedrock. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7cbd05735d..3887af7dc6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.3.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 486d4099dfc4445834f6a1f89e71e69c3cd90dcf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 24 Jul 2023 17:29:59 +0100 Subject: [PATCH 1242/1858] 5.3.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 3887af7dc6..578f9de2d2 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.3.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 6086ef667ce2b145545c14871e671d172030229a Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 25 Jul 2023 16:50:28 +0300 Subject: [PATCH 1243/1858] Added handling for attack-air action (#5912) --- src/event/player/PlayerMissedSwingEvent.php | 39 +++++++++++++++++++ .../mcpe/handler/InGamePacketHandler.php | 3 ++ src/player/Player.php | 13 +++++++ 3 files changed, 55 insertions(+) create mode 100644 src/event/player/PlayerMissedSwingEvent.php diff --git a/src/event/player/PlayerMissedSwingEvent.php b/src/event/player/PlayerMissedSwingEvent.php new file mode 100644 index 0000000000..3157f62d13 --- /dev/null +++ b/src/event/player/PlayerMissedSwingEvent.php @@ -0,0 +1,39 @@ +player = $player; + } +} diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 22eb919358..729b5b51be 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -236,6 +236,9 @@ class InGamePacketHandler extends PacketHandler{ if($packet->hasFlag(PlayerAuthInputFlags::START_JUMPING)){ $this->player->jump(); } + if($packet->hasFlag(PlayerAuthInputFlags::MISSED_SWING)){ + $this->player->missSwing(); + } } if(!$this->forceMoveSync && $hasMoved){ diff --git a/src/player/Player.php b/src/player/Player.php index f8d4923f0f..9b6c321e86 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -66,6 +66,7 @@ use pocketmine\event\player\PlayerItemUseEvent; use pocketmine\event\player\PlayerJoinEvent; use pocketmine\event\player\PlayerJumpEvent; use pocketmine\event\player\PlayerKickEvent; +use pocketmine\event\player\PlayerMissedSwingEvent; use pocketmine\event\player\PlayerMoveEvent; use pocketmine\event\player\PlayerPostChunkSendEvent; use pocketmine\event\player\PlayerQuitEvent; @@ -1894,6 +1895,18 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return true; } + /** + * Performs actions associated with the attack action (left-click) without a target entity. + * Under normal circumstances, this will play the no-damage attack sound and nothing else. + */ + public function missSwing() : void{ + $ev = new PlayerMissedSwingEvent($this); + $ev->call(); + if(!$ev->isCancelled()){ + $this->broadcastSound(new EntityAttackNoDamageSound()); + } + } + /** * Interacts with the given entity using the currently-held item. */ From bbdcab727726225dca6d353ed4dc48815cd90b8e Mon Sep 17 00:00:00 2001 From: rasu3n Date: Wed, 26 Jul 2023 18:04:36 +0900 Subject: [PATCH 1244/1858] Player: Added animation to missSwing() (#5942) --- src/player/Player.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/player/Player.php b/src/player/Player.php index 9b6c321e86..292ab98b3f 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1897,13 +1897,14 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ /** * Performs actions associated with the attack action (left-click) without a target entity. - * Under normal circumstances, this will play the no-damage attack sound and nothing else. + * Under normal circumstances, this will just play the no-damage attack sound and the arm-swing animation. */ public function missSwing() : void{ $ev = new PlayerMissedSwingEvent($this); $ev->call(); if(!$ev->isCancelled()){ $this->broadcastSound(new EntityAttackNoDamageSound()); + $this->broadcastAnimation(new ArmSwingAnimation($this), $this->getViewers()); } } From 82a5ea9ed3d4aab82e7389b50c550c9ea4aa80b4 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 26 Jul 2023 16:26:03 +0100 Subject: [PATCH 1245/1858] Allow thread errors and their traces to be properly recorded in crashdumps (#5910) until now, any thread crash would show as a generic crash since we aren't able to get the trace from the crashed thread directly. This uses some dirty tricks to export a partially serialized stack trace to the main thread, where it can be written into a crashdump. This enables us to see proper crash information for async tasks in the crash archive (finally!!!) as well as being able to capture RakLib errors properly. --- src/Server.php | 38 +++++-- src/crash/CrashDump.php | 15 +-- src/crash/CrashDumpData.php | 2 + src/crash/CrashDumpRenderer.php | 1 + src/network/mcpe/raklib/RakLibInterface.php | 3 +- src/network/mcpe/raklib/RakLibServer.php | 101 ++++++------------ .../mcpe/raklib/RakLibThreadCrashInfo.php | 61 ----------- src/scheduler/AsyncPool.php | 14 ++- src/scheduler/AsyncWorker.php | 12 +-- src/thread/CommonThreadPartsTrait.php | 41 +++++++ src/thread/ThreadCrashException.php | 38 +++++++ src/thread/ThreadCrashInfo.php | 89 +++++++++++++++ src/thread/ThreadCrashInfoFrame.php | 41 +++++++ src/utils/Utils.php | 25 +++++ tests/phpstan/configs/actual-problems.neon | 10 ++ 15 files changed, 329 insertions(+), 162 deletions(-) delete mode 100644 src/network/mcpe/raklib/RakLibThreadCrashInfo.php create mode 100644 src/thread/ThreadCrashException.php create mode 100644 src/thread/ThreadCrashInfo.php create mode 100644 src/thread/ThreadCrashInfoFrame.php diff --git a/src/Server.php b/src/Server.php index e8f2d2726d..148c93b8ee 100644 --- a/src/Server.php +++ b/src/Server.php @@ -93,6 +93,7 @@ use pocketmine\scheduler\AsyncPool; use pocketmine\snooze\SleeperHandler; use pocketmine\stats\SendUsageTask; use pocketmine\thread\log\AttachableThreadSafeLogger; +use pocketmine\thread\ThreadCrashException; use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; @@ -1516,23 +1517,38 @@ class Server{ $trace = $e->getTrace(); } - $errstr = $e->getMessage(); - $errfile = $e->getFile(); - $errline = $e->getLine(); + //If this is a thread crash, this logs where the exception came from on the main thread, as opposed to the + //crashed thread. This is intentional, and might be useful for debugging + //Assume that the thread already logged the original exception with the correct stack trace + $this->logger->logException($e, $trace); + + if($e instanceof ThreadCrashException){ + $info = $e->getCrashInfo(); + $type = $info->getType(); + $errstr = $info->getMessage(); + $errfile = $info->getFile(); + $errline = $info->getLine(); + $printableTrace = $info->getTrace(); + $thread = $info->getThreadName(); + }else{ + $type = get_class($e); + $errstr = $e->getMessage(); + $errfile = $e->getFile(); + $errline = $e->getLine(); + $printableTrace = Utils::printableTraceWithMetadata($trace); + $thread = "Main"; + } $errstr = preg_replace('/\s+/', ' ', trim($errstr)); - $errfile = Filesystem::cleanPath($errfile); - - $this->logger->logException($e, $trace); - $lastError = [ - "type" => get_class($e), + "type" => $type, "message" => $errstr, - "fullFile" => $e->getFile(), - "file" => $errfile, + "fullFile" => $errfile, + "file" => Filesystem::cleanPath($errfile), "line" => $errline, - "trace" => $trace + "trace" => $printableTrace, + "thread" => $thread ]; global $lastExceptionError, $lastError; diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index d7223eb2f1..40af53fd02 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -29,11 +29,13 @@ use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\plugin\PluginBase; use pocketmine\plugin\PluginManager; use pocketmine\Server; +use pocketmine\thread\ThreadCrashInfoFrame; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use pocketmine\VersionInfo; use Symfony\Component\Filesystem\Path; +use function array_map; use function base64_encode; use function error_get_last; use function file; @@ -186,7 +188,7 @@ class CrashDump{ if($error === null){ throw new \RuntimeException("Crash error information missing - did something use exit()?"); } - $error["trace"] = Utils::currentTrace(3); //Skipping CrashDump->baseCrash, CrashDump->construct, Server->crashDump + $error["trace"] = Utils::printableTrace(Utils::currentTrace(3)); //Skipping CrashDump->baseCrash, CrashDump->construct, Server->crashDump $error["fullFile"] = $error["file"]; $error["file"] = Filesystem::cleanPath($error["file"]); try{ @@ -201,9 +203,6 @@ class CrashDump{ $error["message"] = mb_scrub($error["message"], 'UTF-8'); if(isset($lastError)){ - if(isset($lastError["trace"])){ - $lastError["trace"] = Utils::printableTrace($lastError["trace"]); - } $this->data->lastError = $lastError; $this->data->lastError["message"] = mb_scrub($this->data->lastError["message"], 'UTF-8'); } @@ -215,10 +214,11 @@ class CrashDump{ $this->data->plugin_involvement = self::PLUGIN_INVOLVEMENT_NONE; if(!$this->determinePluginFromFile($error["fullFile"], true)){ //fatal errors won't leave any stack trace foreach($error["trace"] as $frame){ - if(!isset($frame["file"])){ + $frameFile = $frame->getFile(); + if($frameFile === null){ continue; //PHP core } - if($this->determinePluginFromFile($frame["file"], false)){ + if($this->determinePluginFromFile($frameFile, false)){ break; } } @@ -233,7 +233,8 @@ class CrashDump{ } } - $this->data->trace = Utils::printableTrace($error["trace"]); + $this->data->trace = array_map(array: $error["trace"], callback: fn(ThreadCrashInfoFrame $frame) => $frame->getPrintableFrame()); + $this->data->thread = $error["thread"]; } private function determinePluginFromFile(string $filePath, bool $crashFrame) : bool{ diff --git a/src/crash/CrashDumpData.php b/src/crash/CrashDumpData.php index 0f5358be5c..b71e6f405b 100644 --- a/src/crash/CrashDumpData.php +++ b/src/crash/CrashDumpData.php @@ -37,6 +37,8 @@ final class CrashDumpData implements \JsonSerializable{ /** @var mixed[] */ public array $error; + public string $thread; + public string $plugin_involvement; public string $plugin = ""; diff --git a/src/crash/CrashDumpRenderer.php b/src/crash/CrashDumpRenderer.php index 2858f43ec1..617dcb7aba 100644 --- a/src/crash/CrashDumpRenderer.php +++ b/src/crash/CrashDumpRenderer.php @@ -64,6 +64,7 @@ final class CrashDumpRenderer{ $this->addLine(); + $this->addLine("Thread: " . $this->data->thread); $this->addLine("Error: " . $this->data->error["message"]); $this->addLine("File: " . $this->data->error["file"]); $this->addLine("Line: " . $this->data->error["line"]); diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 93dff68a2d..4bf8ffb15f 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -39,6 +39,7 @@ use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; use pocketmine\player\GameMode; use pocketmine\Server; +use pocketmine\thread\ThreadCrashException; use pocketmine\timings\Timings; use pocketmine\utils\Utils; use raklib\generic\DisconnectReason; @@ -154,7 +155,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ if(!$this->rakLib->isRunning()){ $e = $this->rakLib->getCrashInfo(); if($e !== null){ - throw new \RuntimeException("RakLib crashed: " . $e->makePrettyMessage()); + throw new ThreadCrashException("RakLib crashed", $e); } throw new \Exception("RakLib Thread crashed without crash information"); } diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index a3f7c16090..e59b6971fe 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -29,6 +29,7 @@ use pocketmine\snooze\SleeperHandlerEntry; use pocketmine\thread\log\ThreadSafeLogger; use pocketmine\thread\NonThreadSafeValue; use pocketmine\thread\Thread; +use pocketmine\thread\ThreadCrashException; use raklib\generic\SocketException; use raklib\server\ipc\RakLibToUserThreadMessageSender; use raklib\server\ipc\UserToRakLibThreadMessageReceiver; @@ -37,17 +38,12 @@ use raklib\server\ServerSocket; use raklib\server\SimpleProtocolAcceptor; use raklib\utils\ExceptionTraceCleaner; use raklib\utils\InternetAddress; -use function error_get_last; use function gc_enable; use function ini_set; -use function register_shutdown_function; class RakLibServer extends Thread{ - protected bool $cleanShutdown = false; protected bool $ready = false; protected string $mainPath; - /** @phpstan-var NonThreadSafeValue|null */ - public ?NonThreadSafeValue $crashInfo = null; /** @phpstan-var NonThreadSafeValue */ protected NonThreadSafeValue $address; @@ -69,86 +65,51 @@ class RakLibServer extends Thread{ $this->address = new NonThreadSafeValue($address); } - /** - * @return void - */ - public function shutdownHandler(){ - if($this->cleanShutdown !== true && $this->crashInfo === null){ - $error = error_get_last(); - - if($error !== null){ - $this->logger->emergency("Fatal error: " . $error["message"] . " in " . $error["file"] . " on line " . $error["line"]); - $this->setCrashInfo(RakLibThreadCrashInfo::fromLastErrorInfo($error)); - }else{ - $this->logger->emergency("RakLib shutdown unexpectedly"); - } - } - } - - public function getCrashInfo() : ?RakLibThreadCrashInfo{ - return $this->crashInfo?->deserialize(); - } - - private function setCrashInfo(RakLibThreadCrashInfo $info) : void{ - $this->synchronized(function() use ($info) : void{ - $this->crashInfo = new NonThreadSafeValue($info); - $this->notify(); - }); - } - public function startAndWait(int $options = NativeThread::INHERIT_NONE) : void{ $this->start($options); $this->synchronized(function() : void{ - while(!$this->ready && $this->crashInfo === null){ + while(!$this->ready && $this->getCrashInfo() === null){ $this->wait(); } - $crashInfo = $this->crashInfo?->deserialize(); + $crashInfo = $this->getCrashInfo(); if($crashInfo !== null){ - if($crashInfo->getClass() === SocketException::class){ + if($crashInfo->getType() === SocketException::class){ throw new SocketException($crashInfo->getMessage()); } - throw new \RuntimeException("RakLib failed to start: " . $crashInfo->makePrettyMessage()); + throw new ThreadCrashException("RakLib failed to start", $crashInfo); } }); } protected function onRun() : void{ - try{ - gc_enable(); - ini_set("display_errors", '1'); - ini_set("display_startup_errors", '1'); + gc_enable(); + ini_set("display_errors", '1'); + ini_set("display_startup_errors", '1'); - register_shutdown_function([$this, "shutdownHandler"]); - - try{ - $socket = new ServerSocket($this->address->deserialize()); - }catch(SocketException $e){ - $this->setCrashInfo(RakLibThreadCrashInfo::fromThrowable($e)); - return; - } - $manager = new Server( - $this->serverId, - $this->logger, - $socket, - $this->maxMtuSize, - new SimpleProtocolAcceptor($this->protocolVersion), - new UserToRakLibThreadMessageReceiver(new PthreadsChannelReader($this->mainToThreadBuffer)), - new RakLibToUserThreadMessageSender(new SnoozeAwarePthreadsChannelWriter($this->threadToMainBuffer, $this->sleeperEntry->createNotifier())), - new ExceptionTraceCleaner($this->mainPath) - ); - $this->synchronized(function() : void{ - $this->ready = true; - $this->notify(); - }); - while(!$this->isKilled){ - $manager->tickProcessor(); - } - $manager->waitShutdown(); - $this->cleanShutdown = true; - }catch(\Throwable $e){ - $this->setCrashInfo(RakLibThreadCrashInfo::fromThrowable($e)); - $this->logger->logException($e); + $socket = new ServerSocket($this->address->deserialize()); + $manager = new Server( + $this->serverId, + $this->logger, + $socket, + $this->maxMtuSize, + new SimpleProtocolAcceptor($this->protocolVersion), + new UserToRakLibThreadMessageReceiver(new PthreadsChannelReader($this->mainToThreadBuffer)), + new RakLibToUserThreadMessageSender(new SnoozeAwarePthreadsChannelWriter($this->threadToMainBuffer, $this->sleeperEntry->createNotifier())), + new ExceptionTraceCleaner($this->mainPath) + ); + $this->synchronized(function() : void{ + $this->ready = true; + $this->notify(); + }); + while(!$this->isKilled){ + $manager->tickProcessor(); } + $manager->waitShutdown(); + } + + protected function onUncaughtException(\Throwable $e) : void{ + parent::onUncaughtException($e); + $this->logger->logException($e); } public function getThreadName() : string{ diff --git a/src/network/mcpe/raklib/RakLibThreadCrashInfo.php b/src/network/mcpe/raklib/RakLibThreadCrashInfo.php deleted file mode 100644 index 60e04b4b4e..0000000000 --- a/src/network/mcpe/raklib/RakLibThreadCrashInfo.php +++ /dev/null @@ -1,61 +0,0 @@ -getMessage(), $e->getFile(), $e->getLine()); - } - - /** - * @phpstan-param array{message: string, file: string, line: int} $info - */ - public static function fromLastErrorInfo(array $info) : self{ - return new self(null, $info["message"], $info["file"], $info["line"]); - } - - public function getClass() : ?string{ return $this->class; } - - public function getMessage() : string{ return $this->message; } - - public function getFile() : string{ return $this->file; } - - public function getLine() : int{ return $this->line; } - - public function makePrettyMessage() : string{ - return sprintf("%s: \"%s\" in %s on line %d", $this->class ?? "Fatal error", $this->message, Filesystem::cleanPath($this->file), $this->line); - } -} diff --git a/src/scheduler/AsyncPool.php b/src/scheduler/AsyncPool.php index 7540294efd..bb79df507f 100644 --- a/src/scheduler/AsyncPool.php +++ b/src/scheduler/AsyncPool.php @@ -26,6 +26,7 @@ namespace pocketmine\scheduler; use pmmp\thread\Thread as NativeThread; use pocketmine\snooze\SleeperHandler; use pocketmine\thread\log\ThreadSafeLogger; +use pocketmine\thread\ThreadCrashException; use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; @@ -215,12 +216,17 @@ class AsyncPool{ } } } - if($crashedTask !== null){ - $message = "Worker $workerId crashed while running task " . get_class($crashedTask) . "#" . spl_object_id($crashedTask); + $info = $entry->worker->getCrashInfo(); + if($info !== null){ + if($crashedTask !== null){ + $message = "Worker $workerId crashed while running task " . get_class($crashedTask) . "#" . spl_object_id($crashedTask); + }else{ + $message = "Worker $workerId crashed while doing unknown work"; + } + throw new ThreadCrashException($message, $info); }else{ - $message = "Worker $workerId crashed for unknown reason"; + throw new \RuntimeException("Worker $workerId crashed for unknown reason"); } - throw new \RuntimeException($message); } } diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 19a19b1022..b26afc29b4 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -31,7 +31,6 @@ use pocketmine\thread\Worker; use pocketmine\utils\AssumptionFailedError; use function gc_enable; use function ini_set; -use function set_exception_handler; class AsyncWorker extends Worker{ /** @var mixed[] */ @@ -68,20 +67,17 @@ class AsyncWorker extends Worker{ } $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); + } - set_exception_handler(function(\Throwable $e){ - $this->logger->logException($e); - }); + protected function onUncaughtException(\Throwable $e) : void{ + parent::onUncaughtException($e); + $this->logger->logException($e); } public function getLogger() : ThreadSafeLogger{ return $this->logger; } - public function handleException(\Throwable $e) : void{ - $this->logger->logException($e); - } - public function getThreadName() : string{ return "AsyncWorker#" . $this->id; } diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index c35dd77914..340ce554d9 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -26,7 +26,10 @@ namespace pocketmine\thread; use pmmp\thread\ThreadSafeArray; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\Server; +use function error_get_last; use function error_reporting; +use function register_shutdown_function; +use function set_exception_handler; trait CommonThreadPartsTrait{ /** @@ -38,6 +41,8 @@ trait CommonThreadPartsTrait{ protected bool $isKilled = false; + private ?ThreadCrashInfo $crashInfo = null; + /** * @return ThreadSafeClassLoader[] */ @@ -88,12 +93,48 @@ trait CommonThreadPartsTrait{ } } + public function getCrashInfo() : ?ThreadCrashInfo{ return $this->crashInfo; } + final public function run() : void{ error_reporting(-1); $this->registerClassLoaders(); //set this after the autoloader is registered ErrorToExceptionHandler::set(); + + //this permits adding extra functionality to the exception and shutdown handlers via overriding + set_exception_handler($this->onUncaughtException(...)); + register_shutdown_function($this->onShutdown(...)); + $this->onRun(); + $this->isKilled = true; + } + + /** + * Called by set_exception_handler() when an uncaught exception is thrown. + */ + protected function onUncaughtException(\Throwable $e) : void{ + $this->synchronized(function() use ($e) : void{ + $this->crashInfo = ThreadCrashInfo::fromThrowable($e, $this->getThreadName()); + }); + } + + /** + * Called by register_shutdown_function() when the thread shuts down. This may be because of a benign shutdown, or + * because of a fatal error. Use isKilled to determine which. + */ + protected function onShutdown() : void{ + $this->synchronized(function() : void{ + if(!$this->isKilled && $this->crashInfo === null){ + $last = error_get_last(); + if($last !== null){ + //fatal error + $this->crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); + }else{ + //probably misused exit() + $this->crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); + } + } + }); } /** diff --git a/src/thread/ThreadCrashException.php b/src/thread/ThreadCrashException.php new file mode 100644 index 0000000000..0eba379344 --- /dev/null +++ b/src/thread/ThreadCrashException.php @@ -0,0 +1,38 @@ +crashInfo = $crashInfo; + } + + public function getCrashInfo() : ThreadCrashInfo{ + return $this->crashInfo; + } +} diff --git a/src/thread/ThreadCrashInfo.php b/src/thread/ThreadCrashInfo.php new file mode 100644 index 0000000000..66aae927a8 --- /dev/null +++ b/src/thread/ThreadCrashInfo.php @@ -0,0 +1,89 @@ + */ + private ThreadSafeArray $trace; + + /** + * @param ThreadCrashInfoFrame[] $trace + */ + public function __construct( + private string $type, + private string $message, + private string $file, + private int $line, + array $trace, + private string $threadName + ){ + $this->trace = ThreadSafeArray::fromArray($trace); + } + + public static function fromThrowable(\Throwable $e, string $threadName) : self{ + return new self(get_class($e), $e->getMessage(), $e->getFile(), $e->getLine(), Utils::printableTraceWithMetadata($e->getTrace()), $threadName); + } + + /** + * @phpstan-param array{type: int, message: string, file: string, line: int} $info + */ + public static function fromLastErrorInfo(array $info, string $threadName) : self{ + try{ + $class = ErrorTypeToStringMap::get($info["type"]); + }catch(\InvalidArgumentException){ + $class = "Unknown error type (" . $info["type"] . ")"; + } + return new self($class, $info["message"], $info["file"], $info["line"], Utils::printableTraceWithMetadata(Utils::currentTrace()), $threadName); + } + + public function getType() : string{ return $this->type; } + + public function getMessage() : string{ return $this->message; } + + public function getFile() : string{ return $this->file; } + + public function getLine() : int{ return $this->line; } + + /** + * @return ThreadCrashInfoFrame[] + */ + public function getTrace() : array{ + return (array) $this->trace; + } + + public function getThreadName() : string{ return $this->threadName; } + + public function makePrettyMessage() : string{ + return sprintf("%s: \"%s\" in \"%s\" on line %d", $this->type ?? "Fatal error", $this->message, Filesystem::cleanPath($this->file), $this->line); + } +} diff --git a/src/thread/ThreadCrashInfoFrame.php b/src/thread/ThreadCrashInfoFrame.php new file mode 100644 index 0000000000..27f470387c --- /dev/null +++ b/src/thread/ThreadCrashInfoFrame.php @@ -0,0 +1,41 @@ +printableFrame; } + + public function getFile() : ?string{ return $this->file; } + + public function getLine() : int{ return $this->line; } +} diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 11548e193b..f5ec5f8e4a 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -31,6 +31,7 @@ use DaveRandom\CallbackValidator\CallbackType; use pocketmine\entity\Location; use pocketmine\errorhandler\ErrorTypeToStringMap; use pocketmine\math\Vector3; +use pocketmine\thread\ThreadCrashInfoFrame; use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; use function array_combine; @@ -469,6 +470,30 @@ final class Utils{ return $messages; } + /** + * Similar to {@link Utils::printableTrace()}, but associates metadata such as file and line number with each frame. + * This is used to transmit thread-safe information about crash traces to the main thread when a thread crashes. + * + * @param mixed[][] $rawTrace + * @phpstan-param list> $rawTrace + * + * @return ThreadCrashInfoFrame[] + */ + public static function printableTraceWithMetadata(array $rawTrace, int $maxStringLength = 80) : array{ + $printableTrace = self::printableTrace($rawTrace, $maxStringLength); + $safeTrace = []; + foreach($printableTrace as $frameId => $printableFrame){ + $rawFrame = $rawTrace[$frameId]; + $safeTrace[$frameId] = new ThreadCrashInfoFrame( + $printableFrame, + $rawFrame["file"] ?? "unknown", + $rawFrame["line"] ?? 0 + ); + } + + return $safeTrace; + } + /** * @return mixed[][] * @phpstan-return list> diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 27e8811534..75118cc934 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -845,6 +845,16 @@ parameters: count: 1 path: ../../../src/utils/Utils.php + - + message: "#^Parameter \\#2 \\$file of class pocketmine\\\\thread\\\\ThreadCrashInfoFrame constructor expects string\\|null, mixed given\\.$#" + count: 1 + path: ../../../src/utils/Utils.php + + - + message: "#^Parameter \\#3 \\$line of class pocketmine\\\\thread\\\\ThreadCrashInfoFrame constructor expects int, mixed given\\.$#" + count: 1 + path: ../../../src/utils/Utils.php + - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 From a45763328bdb6703304ac97dd5164665e5ab180e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Jul 2023 12:36:46 +0100 Subject: [PATCH 1246/1858] Added constants for default knockback force and vertical limit --- src/entity/Living.php | 13 ++++++++++++- src/event/entity/EntityDamageByEntityEvent.php | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index d1fbf4b8e1..1b5b582da9 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -80,6 +80,17 @@ use const M_PI; abstract class Living extends Entity{ protected const DEFAULT_BREATH_TICKS = 300; + /** + * The default knockback multiplier when an entity is hit by another entity. + * Larger values knock the entity back with increased velocity. + */ + public const DEFAULT_KNOCKBACK_FORCE = 0.4; + /** + * Limit of an entity's vertical knockback velocity when hit by another entity. Without this limit, the entity + * may be knocked far up into the air with large knockback forces. + */ + public const DEFAULT_KNOCKBACK_VERTICAL_LIMIT = 0.4; + private const TAG_LEGACY_HEALTH = "HealF"; //TAG_Float private const TAG_HEALTH = "Health"; //TAG_Float private const TAG_BREATH_TICKS = "Air"; //TAG_Short @@ -567,7 +578,7 @@ abstract class Living extends Entity{ $this->broadcastAnimation(new HurtAnimation($this)); } - public function knockBack(float $x, float $z, float $force = 0.4, ?float $verticalLimit = 0.4) : void{ + public function knockBack(float $x, float $z, float $force = self::DEFAULT_KNOCKBACK_FORCE, ?float $verticalLimit = self::DEFAULT_KNOCKBACK_VERTICAL_LIMIT) : void{ $f = sqrt($x * $x + $z * $z); if($f <= 0){ return; diff --git a/src/event/entity/EntityDamageByEntityEvent.php b/src/event/entity/EntityDamageByEntityEvent.php index 6264375bb6..11214a3e06 100644 --- a/src/event/entity/EntityDamageByEntityEvent.php +++ b/src/event/entity/EntityDamageByEntityEvent.php @@ -36,7 +36,7 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{ /** * @param float[] $modifiers */ - public function __construct(Entity $damager, Entity $entity, int $cause, float $damage, array $modifiers = [], private float $knockBack = 0.4){ + public function __construct(Entity $damager, Entity $entity, int $cause, float $damage, array $modifiers = [], private float $knockBack = Living::DEFAULT_KNOCKBACK_FORCE){ $this->damagerEntityId = $damager->getId(); parent::__construct($entity, $cause, $damage, $modifiers); $this->addAttackerModifiers($damager); From c972e657418d29b66f53f42e82e65a47b8a7a10f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Jul 2023 12:41:27 +0100 Subject: [PATCH 1247/1858] EntityDamageByEntityEvent: document methods --- src/event/entity/EntityDamageByEntityEvent.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/event/entity/EntityDamageByEntityEvent.php b/src/event/entity/EntityDamageByEntityEvent.php index 11214a3e06..b8eb95def4 100644 --- a/src/event/entity/EntityDamageByEntityEvent.php +++ b/src/event/entity/EntityDamageByEntityEvent.php @@ -62,10 +62,20 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{ return $this->getEntity()->getWorld()->getServer()->getWorldManager()->findEntity($this->damagerEntityId); } + /** + * Returns the force with which the victim will be knocked back from the attacking entity. + * + * @see Living::DEFAULT_KNOCKBACK_FORCE + */ public function getKnockBack() : float{ return $this->knockBack; } + /** + * Sets the force with which the victim will be knocked back from the attacking entity. + * Larger values will knock the victim back further. + * Negative values will pull the victim towards the attacker. + */ public function setKnockBack(float $knockBack) : void{ $this->knockBack = $knockBack; } From 5ec3f4655fe30a63827570877875b0f50c42901c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Jul 2023 12:52:15 +0100 Subject: [PATCH 1248/1858] EntityDamageByEntityEvent: added APIs to get and set vertical knockback limits this was requested and PR'd as far back as 2020 (see #3782). Since no issue was filed about this, it became forgotten until #5946. However, #5946 overcomplicates the solution to the problem, and breaks BC without an obvious reason. --- src/entity/Living.php | 4 +-- .../entity/EntityDamageByEntityEvent.php | 28 ++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index 1b5b582da9..4d5e10cb36 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -557,14 +557,14 @@ abstract class Living extends Entity{ $e = $source->getChild(); if($e !== null){ $motion = $e->getMotion(); - $this->knockBack($motion->x, $motion->z, $source->getKnockBack()); + $this->knockBack($motion->x, $motion->z, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); } }elseif($source instanceof EntityDamageByEntityEvent){ $e = $source->getDamager(); if($e !== null){ $deltaX = $this->location->x - $e->location->x; $deltaZ = $this->location->z - $e->location->z; - $this->knockBack($deltaX, $deltaZ, $source->getKnockBack()); + $this->knockBack($deltaX, $deltaZ, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); } } diff --git a/src/event/entity/EntityDamageByEntityEvent.php b/src/event/entity/EntityDamageByEntityEvent.php index b8eb95def4..5ef6c4b8e9 100644 --- a/src/event/entity/EntityDamageByEntityEvent.php +++ b/src/event/entity/EntityDamageByEntityEvent.php @@ -36,7 +36,15 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{ /** * @param float[] $modifiers */ - public function __construct(Entity $damager, Entity $entity, int $cause, float $damage, array $modifiers = [], private float $knockBack = Living::DEFAULT_KNOCKBACK_FORCE){ + public function __construct( + Entity $damager, + Entity $entity, + int $cause, + float $damage, + array $modifiers = [], + private float $knockBack = Living::DEFAULT_KNOCKBACK_FORCE, + private float $verticalKnockBackLimit = Living::DEFAULT_KNOCKBACK_VERTICAL_LIMIT + ){ $this->damagerEntityId = $damager->getId(); parent::__construct($entity, $cause, $damage, $modifiers); $this->addAttackerModifiers($damager); @@ -79,4 +87,22 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{ public function setKnockBack(float $knockBack) : void{ $this->knockBack = $knockBack; } + + /** + * Returns the maximum upwards velocity the victim may have after being knocked back. + * This ensures that the victim doesn't fly up into the sky when high levels of knockback are applied. + * + * @see Living::DEFAULT_KNOCKBACK_VERTICAL_LIMIT + */ + public function getVerticalKnockBackLimit() : float{ + return $this->verticalKnockBackLimit; + } + + /** + * Sets the maximum upwards velocity the victim may have after being knocked back. + * Larger values will allow the victim to fly higher if the knockback force is also large. + */ + public function setVerticalKnockBackLimit(float $verticalKnockBackLimit) : void{ + $this->verticalKnockBackLimit = $verticalKnockBackLimit; + } } From 9b2a7b43c2985ba46a759d272dd5f3157a39d7f1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Jul 2023 16:06:29 +0100 Subject: [PATCH 1249/1858] ItemEntity: fixed O(n^2) performance issue when many of the same unstackable item are in the same place this produced a 40% performance improvement in a simulation with 800 item entities. If the items were all different, then this would still be a problem. However, many of the same unstackable items occupying the same space is a problem for SkyBlock farms, so this should improve performance for SkyBlock quite a bit. --- src/entity/object/ItemEntity.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 6e9fdcdcf3..90eeece67c 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -123,7 +123,7 @@ class ItemEntity extends Entity{ } } - if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ + if($this->hasMovementUpdate() && $this->isMergeCandidate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ $mergeable = [$this]; //in case the merge target ends up not being this $mergeTarget = $this; foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ @@ -165,12 +165,19 @@ class ItemEntity extends Entity{ } } + private function isMergeCandidate() : bool{ + return $this->pickupDelay !== self::NEVER_DESPAWN && $this->item->getCount() < $this->item->getMaxStackSize(); + } + /** * Returns whether this item entity can merge with the given one. */ public function isMergeable(ItemEntity $entity) : bool{ + if(!$this->isMergeCandidate() || !$entity->isMergeCandidate()){ + return false; + } $item = $entity->item; - return $entity !== $this && $entity->pickupDelay !== self::NEVER_DESPAWN && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize(); + return $entity !== $this && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize(); } /** From befd3637f69a40939ff5398e7d2597ff35f7ac7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:13:51 +0100 Subject: [PATCH 1250/1858] Bump shivammathur/setup-php from 2.25.4 to 2.25.5 (#5951) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.25.4 to 2.25.5. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.25.4...2.25.5) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 5275c445b9..a8282f542a 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.4 + uses: shivammathur/setup-php@2.25.5 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index b5376f3bad..5b76a9d053 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -18,7 +18,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.25.4 + uses: shivammathur/setup-php@2.25.5 with: php-version: 8.1 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 60e513d80a..022e0ab3a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -173,7 +173,7 @@ jobs: - uses: actions/checkout@v3 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.4 + uses: shivammathur/setup-php@2.25.5 with: php-version: 8.1 tools: php-cs-fixer:3.17 From eb53b795d53164c6a29a98af2726835317005df1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Jul 2023 16:06:29 +0100 Subject: [PATCH 1251/1858] ItemEntity: fixed O(n^2) performance issue when many of the same unstackable item are in the same place this produced a 40% performance improvement in a simulation with 800 item entities. If the items were all different, then this would still be a problem. However, many of the same unstackable items occupying the same space is a problem for SkyBlock farms, so this should improve performance for SkyBlock quite a bit. --- src/entity/object/ItemEntity.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index d28d70773d..233b541122 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -131,7 +131,7 @@ class ItemEntity extends Entity{ } } - if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ + if($this->hasMovementUpdate() && $this->isMergeCandidate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ $mergeable = [$this]; //in case the merge target ends up not being this $mergeTarget = $this; foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ @@ -173,12 +173,19 @@ class ItemEntity extends Entity{ } } + private function isMergeCandidate() : bool{ + return $this->pickupDelay !== self::NEVER_DESPAWN && $this->item->getCount() < $this->item->getMaxStackSize(); + } + /** * Returns whether this item entity can merge with the given one. */ public function isMergeable(ItemEntity $entity) : bool{ + if(!$this->isMergeCandidate() || !$entity->isMergeCandidate()){ + return false; + } $item = $entity->item; - return $entity !== $this && $entity->pickupDelay !== self::NEVER_DESPAWN && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize(); + return $entity !== $this && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize(); } /** From 49a9da147bc99db0a00f8d8551e941fc02ff0fe8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 11:12:41 +0100 Subject: [PATCH 1252/1858] Release 4.23.4 --- changelogs/4.23.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index 6cd261ba13..031eaa1cc4 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -43,3 +43,9 @@ Released 24th July 2023. - Player emotes no longer broadcast messages to other players. This was unintended behaviour caused by a client-side behavioural change. - Shulker boxes no longer support the placement of torches or other similar blocks. - Fire can now be placed on upper slabs and the top of upside-down stairs. + +# 4.23.4 +Released 1st August 2023. + +## Fixes +- Fixed exponentially increasing lag when many hundreds of non-mergeable dropped items occupied the same space. This disproportionately affected SkyBlock servers due to large cactus farms using water to collect items together. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 490300ff5f..458707c83c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From e9e5923639ab578d691980126cf093627681affe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 11:12:52 +0100 Subject: [PATCH 1253/1858] 4.23.5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 458707c83c..3109b3b1b4 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From cd8219d9fd6d5385a6e3f3791ceff99fa8fccc1f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 11:16:50 +0100 Subject: [PATCH 1254/1858] Release 5.3.4 --- changelogs/5.3.md | 9 +++++++++ src/VersionInfo.php | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelogs/5.3.md b/changelogs/5.3.md index 173e73cb85..7d789165d6 100644 --- a/changelogs/5.3.md +++ b/changelogs/5.3.md @@ -70,3 +70,12 @@ Released 24th July 2023. - Fixed netherite items being destroyed by lava. - Fireproof entities no longer display the burning animation when in fire or lava. This does not apply to creative players, who are immortal rather than being fireproof. - Fixed frosted ice melting in certain conditions which didn't match vanilla Bedrock. + +# 5.3.4 +Released 1st August 2023. + +## Included releases +This release includes changes from the following releases: +- [4.23.4](https://github.com/pmmp/PocketMine-MP/blob/4.23.4/changelogs/4.23.md#4234) - Item entity lag fix + +This release contains no other significant changes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 578f9de2d2..38fc2e0e49 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.3.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 774eb3e72b5bcf9872f8325f976d4a0bc2df73cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 11:16:51 +0100 Subject: [PATCH 1255/1858] 5.3.5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 38fc2e0e49..9c7b0f4f1e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.3.5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 46f24b165af164cc834c8e96d43d1052c4c198df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 12:21:39 +0100 Subject: [PATCH 1256/1858] Rename PlayerMissedSwingEvent -> PlayerMissSwingEvent all the other events are present tense, so it doesn't make sense for this one to be past tense. --- .../{PlayerMissedSwingEvent.php => PlayerMissSwingEvent.php} | 2 +- src/player/Player.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/event/player/{PlayerMissedSwingEvent.php => PlayerMissSwingEvent.php} (93%) diff --git a/src/event/player/PlayerMissedSwingEvent.php b/src/event/player/PlayerMissSwingEvent.php similarity index 93% rename from src/event/player/PlayerMissedSwingEvent.php rename to src/event/player/PlayerMissSwingEvent.php index 3157f62d13..2f7ffda9cf 100644 --- a/src/event/player/PlayerMissedSwingEvent.php +++ b/src/event/player/PlayerMissSwingEvent.php @@ -30,7 +30,7 @@ use pocketmine\player\Player; /** * Called when a player attempts to perform the attack action (left-click) without a target entity. */ -class PlayerMissedSwingEvent extends PlayerEvent implements Cancellable{ +class PlayerMissSwingEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; public function __construct(Player $player){ diff --git a/src/player/Player.php b/src/player/Player.php index 292ab98b3f..f624852426 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -66,7 +66,7 @@ use pocketmine\event\player\PlayerItemUseEvent; use pocketmine\event\player\PlayerJoinEvent; use pocketmine\event\player\PlayerJumpEvent; use pocketmine\event\player\PlayerKickEvent; -use pocketmine\event\player\PlayerMissedSwingEvent; +use pocketmine\event\player\PlayerMissSwingEvent; use pocketmine\event\player\PlayerMoveEvent; use pocketmine\event\player\PlayerPostChunkSendEvent; use pocketmine\event\player\PlayerQuitEvent; @@ -1900,7 +1900,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * Under normal circumstances, this will just play the no-damage attack sound and the arm-swing animation. */ public function missSwing() : void{ - $ev = new PlayerMissedSwingEvent($this); + $ev = new PlayerMissSwingEvent($this); $ev->call(); if(!$ev->isCancelled()){ $this->broadcastSound(new EntityAttackNoDamageSound()); From 0a90a5928a86552003a3dcbceb2c019b0d2ccaa8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 12:33:36 +0100 Subject: [PATCH 1257/1858] Added TallGrassTrait, remove weirdly specific logic from FortuneDropHelper this needs to be dealt with before release otherwise we'll be stuck with FortuneDropHelper::grass() this is the obvious solution and should have been done some time ago - stuff like flammability was already a problem for double tall grass anyway --- src/block/DoubleTallGrass.php | 7 +++- src/block/TallGrass.php | 19 +--------- src/block/utils/FortuneDropHelper.php | 21 ----------- src/block/utils/TallGrassTrait.php | 54 +++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 40 deletions(-) create mode 100644 src/block/utils/TallGrassTrait.php diff --git a/src/block/DoubleTallGrass.php b/src/block/DoubleTallGrass.php index e90f2ec615..42a6fb4dca 100644 --- a/src/block/DoubleTallGrass.php +++ b/src/block/DoubleTallGrass.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\FortuneDropHelper; +use pocketmine\block\utils\TallGrassTrait; use pocketmine\item\Item; class DoubleTallGrass extends DoublePlant{ + use TallGrassTrait { + getDropsForIncompatibleTool as traitGetDropsForIncompatibleTool; + } public function canBeReplaced() : bool{ return true; @@ -34,7 +37,7 @@ class DoubleTallGrass extends DoublePlant{ public function getDropsForIncompatibleTool(Item $item) : array{ if($this->top){ - return FortuneDropHelper::grass($item); + return $this->traitGetDropsForIncompatibleTool($item); } return []; } diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index 019b911bc2..d8c34b0010 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\FortuneDropHelper; +use pocketmine\block\utils\TallGrassTrait; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -31,10 +31,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class TallGrass extends Flowable{ - - public function canBeReplaced() : bool{ - return true; - } + use TallGrassTrait; private function canBeSupportedBy(Block $block) : bool{ return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); @@ -53,16 +50,4 @@ class TallGrass extends Flowable{ $this->position->getWorld()->useBreakOn($this->position); } } - - public function getDropsForIncompatibleTool(Item $item) : array{ - return FortuneDropHelper::grass($item); - } - - public function getFlameEncouragement() : int{ - return 60; - } - - public function getFlammability() : int{ - return 100; - } } diff --git a/src/block/utils/FortuneDropHelper.php b/src/block/utils/FortuneDropHelper.php index 4bce36138a..4cf9b0249d 100644 --- a/src/block/utils/FortuneDropHelper.php +++ b/src/block/utils/FortuneDropHelper.php @@ -25,7 +25,6 @@ namespace pocketmine\block\utils; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; -use pocketmine\item\VanillaItems; use function max; use function min; use function mt_getrandmax; @@ -85,26 +84,6 @@ final class FortuneDropHelper{ return $count; } - /** - * Grass have a fixed chance to drop wheat seed. - * Fortune level increases the maximum number of seeds that can be dropped. - * A discrete uniform distribution is used to determine the number of seeds dropped. - * - * TODO: I'm not sure this really belongs here, but it's preferable not to duplicate this code between grass and - * tall grass. - * - * @return Item[] - */ - public static function grass(Item $usedItem) : array{ - if(FortuneDropHelper::bonusChanceDivisor($usedItem, 8, 2)){ - return [ - VanillaItems::WHEAT_SEEDS() - ]; - } - - return []; - } - /** * Adds the fortune level to the base max and picks a random number between the minimim and adjusted maximum. * Each amount in the range has an equal chance of being picked. diff --git a/src/block/utils/TallGrassTrait.php b/src/block/utils/TallGrassTrait.php new file mode 100644 index 0000000000..88fc36e127 --- /dev/null +++ b/src/block/utils/TallGrassTrait.php @@ -0,0 +1,54 @@ + Date: Tue, 1 Aug 2023 12:46:53 +0100 Subject: [PATCH 1258/1858] Release 5.4.0 --- changelogs/5.4.md | 83 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +-- 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.4.md diff --git a/changelogs/5.4.md b/changelogs/5.4.md new file mode 100644 index 0000000000..a40fdfcea3 --- /dev/null +++ b/changelogs/5.4.md @@ -0,0 +1,83 @@ +# 5.4.0 +Released 1st August 2023. + +**For Minecraft: Bedrock Edition 1.20.10** + +This is a minor feature update, including a handful of new gameplay features, new plugin APIs and improvements to error reporting. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Improved error reporting for async task and thread crashes. +- Players may now have different creative inventories. + +## Gameplay +### General +- Added support for 1.5-block height sneaking. +- Fixed missing player arm swing and sounds when punching the air. + +### Blocks +- Implemented the following new blocks: + - Big Dripleaf Head + - Big Dripleaf Stem + - Small Dripleaf +- Acacia saplings now grow into acacia trees. +- Fixed melon and pumpkin stems not attaching to the correct block when growing. +- Various blocks now drop more items when mined with a compatible tool enchanted with Fortune. + +### Items +- Implemented Strong Slowness potion. +- Implemented Fortune enchantment. + +## API +### `pocketmine\block` +- The following new classes have been added: + - `utils\FortuneDropHelper` - utility methods for calculating the drop counts for Fortune-affected blocks +- The following new API methods have been added: + - `protected Block->getAdjacentSupportType(int $facing) : utils\SupportType` - returns the type of support provided by the block in the given direction on the adjacent face + +### `pocketmine\entity` +- The following new API constants have been added: + - `Living::DEFAULT_KNOCKBACK_FORCE` + - `Living::DEFAULT_KNOCKBACK_VERTICAL_LIMIT` + +### `pocketmine\entity\animation` +- `ConsumingItemAnimation` now accepts `Living` instances instead of just `Human`. + +### `pocketmine\event` +- The following new classes have been added: + - `PlayerMissSwingEvent` - called when the player attempts the attack action (left click on desktop) without any target + - This is possible thanks to the introduction of new flags in `PlayerAuthInputPacket` in Bedrock 1.20.10 +- The following new API methods have been added: + - `public EntityDamageByEntityEvent->getVerticalKnockBackLimit() : float` + - `public EntityDamageByEntityEvent->setVerticalKnockBackLimit(float $verticalKnockBackLimit) : void` - sets the max vertical velocity that can result from the victim being knocked back + +### `pocketmine\player` +- The following new API methods have been added: + - `public Player->getCreativeInventory() : pocketmine\inventory\CreativeInventory` + - `public Player->setCreativeInventory(pocketmine\inventory\CreativeInventory $inventory) : void` + - `public Player->missSwing() : void` - performs actions associated with the attack action when there is no target (see `PlayerMissSwingEvent`) + +### `pocketmine\scheduler` +- Cancellation functionality has been removed from `AsyncTask`, as it didn't make any sense and wasn't used by anything for what it was intended for. + - It broke sequential task execution - later tasks might depend on state from earlier tasks + - It didn't actually cancel the task anyway - at best, it prevented it from running, but couldn't interrupt it (though interrupting a task does not make sense either) +- The following API methods have been deprecated, and their functionality has been removed: + - `AsyncTask->hasCancelledRun()` + - `AsyncTask->cancelRun()` + +## Internals +- Uncaught exceptions and fatal errors in `AsyncTask`, threads extending `pocketmine\thread\Thread`, and `pocketmine\thread\Worker` are now recorded in crashdumps, making it significantly easier to debug errors in these areas. +- JWT signature DER <-> raw conversions are now handled in-house using code in `JwtUtils` + - Due to the simplicity of the conversion and only requiring a tiny subset of the ASN.1 spec, it didn't make much sense to introduce another dependency. + - `fgrosse/phpasn1` is no longer required. This package was abandoned by its author and only used by PocketMine-MP for this one purpose. +- Various usages of `Closure::fromCallable()` have been replaced by PHP 8.1 first-class callable syntax. +- Blocks requiring support shifted to a "can be supported at" model, rather than "can be supported by". + - This model reduces repeated logic when placing and performing nearby block updates (no need to hardcode facing everywhere). + - In addition, this change facilitates the use of the newly introduced `Block->getAdjacentSupportType()` API method, reducing boilerplate support-type checking code. +- Bell block code has been simplified and cleaned up. +- `TallGrass` and `DoubleTallGrass` now use a shared `TallGrassTrait` to reduce code duplication. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9c7b0f4f1e..1ad9f2bf7c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.3.5"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.4.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 53de55dcde472eb293fb853574f1b4a74120a3bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 12:46:56 +0100 Subject: [PATCH 1259/1858] 5.4.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1ad9f2bf7c..0b40f80e46 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.4.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 26086372107283aad399fb0613d1c284561398be Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 17:37:49 +0100 Subject: [PATCH 1260/1858] HandlerListManager: track RegisteredListenerCache directly This change improves the performance of calling an event with 0 handlers by about 10% with no other changes. Since we have to access the list eventually anyway, we can cut out some unnecessary work by returning the handlers from the cache directly, instead of fetching the HandlerList for no reason. This also improves the performance of Event::hasHandlers() by about 40%, which is pretty significant (120 ns -> 80 ns). --- src/event/Event.php | 6 +++--- src/event/HandlerList.php | 6 ++---- src/event/HandlerListManager.php | 25 ++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/event/Event.php b/src/event/Event.php index 49652fcc60..21b8ae36a5 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -55,11 +55,11 @@ abstract class Event{ $timings = Timings::getEventTimings($this); $timings->startTiming(); - $handlerList = HandlerListManager::global()->getListFor(get_class($this)); + $handlers = HandlerListManager::global()->getHandlersFor(static::class); ++self::$eventCallDepth; try{ - foreach($handlerList->getListenerList() as $registration){ + foreach($handlers as $registration){ $registration->callEvent($this); } }finally{ @@ -75,6 +75,6 @@ abstract class Event{ * Usage: SomeEventClass::hasHandlers() */ public static function hasHandlers() : bool{ - return count(HandlerListManager::global()->getListFor(static::class)->getListenerList()) > 0; + return count(HandlerListManager::global()->getHandlersFor(static::class)) > 0; } } diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 37811e9592..74eedf3a4a 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -33,8 +33,6 @@ class HandlerList{ /** @var RegisteredListener[][] */ private array $handlerSlots = []; - private RegisteredListenerCache $handlerCache; - /** @var RegisteredListenerCache[] */ private array $affectedHandlerCaches = []; @@ -44,9 +42,9 @@ class HandlerList{ */ public function __construct( private string $class, - private ?HandlerList $parentList + private ?HandlerList $parentList, + private RegisteredListenerCache $handlerCache = new RegisteredListenerCache() ){ - $this->handlerCache = new RegisteredListenerCache(); for($list = $this; $list !== null; $list = $list->parentList){ $list->affectedHandlerCaches[spl_object_id($this->handlerCache)] = $this->handlerCache; } diff --git a/src/event/HandlerListManager.php b/src/event/HandlerListManager.php index ab94674cfa..047632f548 100644 --- a/src/event/HandlerListManager.php +++ b/src/event/HandlerListManager.php @@ -36,6 +36,11 @@ class HandlerListManager{ /** @var HandlerList[] classname => HandlerList */ private array $allLists = []; + /** + * @var RegisteredListenerCache[] event class name => cache + * @phpstan-var array, RegisteredListenerCache> + */ + private array $handlerCaches = []; /** * Unregisters all the listeners @@ -98,7 +103,25 @@ class HandlerListManager{ } $parent = self::resolveNearestHandleableParent($class); - return $this->allLists[$event] = new HandlerList($event, $parent !== null ? $this->getListFor($parent->getName()) : null); + $cache = new RegisteredListenerCache(); + $this->handlerCaches[$event] = $cache; + return $this->allLists[$event] = new HandlerList( + $event, + parentList: $parent !== null ? $this->getListFor($parent->getName()) : null, + handlerCache: $cache + ); + } + + /** + * @phpstan-template TEvent of Event + * @phpstan-param class-string $event + * + * @return RegisteredListener[] + */ + public function getHandlersFor(string $event) : array{ + $cache = $this->handlerCaches[$event] ?? null; + //getListFor() will populate the cache for the next call + return $cache?->list ?? $this->getListFor($event)->getListenerList(); } /** From 0b86fafafbb8630543ff8d6c35645e42f76721e9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 1 Aug 2023 17:41:53 +0100 Subject: [PATCH 1261/1858] Hot path optimisation for DataPacketSendEvent --- src/network/mcpe/NetworkSession.php | 14 +++++++++----- src/network/mcpe/StandardPacketBroadcaster.php | 12 +++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 894b1434bf..100d9c989e 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -464,12 +464,16 @@ class NetworkSession{ $timings = Timings::getSendDataPacketTimings($packet); $timings->startTiming(); try{ - $ev = new DataPacketSendEvent([$this], [$packet]); - $ev->call(); - if($ev->isCancelled()){ - return false; + if(DataPacketSendEvent::hasHandlers()){ + $ev = new DataPacketSendEvent([$this], [$packet]); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $packets = $ev->getPackets(); + }else{ + $packets = [$packet]; } - $packets = $ev->getPackets(); foreach($packets as $evPacket){ $this->addToSendBuffer(self::encodePacketTimed(PacketSerializer::encoder($this->packetSerializerContext), $evPacket)); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 9de3d214af..c200859fdd 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -44,12 +44,14 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ public function broadcastPackets(array $recipients, array $packets) : void{ //TODO: this shouldn't really be called here, since the broadcaster might be replaced by an alternative //implementation that doesn't fire events - $ev = new DataPacketSendEvent($recipients, $packets); - $ev->call(); - if($ev->isCancelled()){ - return; + if(DataPacketSendEvent::hasHandlers()){ + $ev = new DataPacketSendEvent($recipients, $packets); + $ev->call(); + if($ev->isCancelled()){ + return; + } + $packets = $ev->getPackets(); } - $packets = $ev->getPackets(); $compressors = []; From bb0e648276f9180fd7f14dd98d831b41f19b7b18 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 2 Aug 2023 13:36:54 +0100 Subject: [PATCH 1262/1858] Fixed BlockDeathEvent usages showing an oldState which is already dead --- src/block/BaseCoral.php | 2 +- src/block/CoralBlock.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index 0912a85bae..3568dccc57 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -51,7 +51,7 @@ abstract class BaseCoral extends Transparent{ //TODO: check water inside the block itself (not supported on the API yet) if(!$hasWater){ - $ev = new BlockDeathEvent($this, $this->setDead(true)); + $ev = new BlockDeathEvent($this, (clone $this)->setDead(true)); $ev->call(); if(!$ev->isCancelled()){ $world->setBlock($this->position, $ev->getNewState()); diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index 0718112eb9..d9787178db 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -78,7 +78,7 @@ final class CoralBlock extends Opaque{ } } if(!$hasWater){ - $ev = new BlockDeathEvent($this, $this->setDead(true)); + $ev = new BlockDeathEvent($this, (clone $this)->setDead(true)); $ev->call(); if(!$ev->isCancelled()){ $world->setBlock($this->position, $ev->getNewState()); From 82f87cc2dac70b0dd74a26534f7e04fef88ce3a3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 2 Aug 2023 13:40:12 +0100 Subject: [PATCH 1263/1858] Reduce repeated block-change-event related code the new helper code reveals even more repetition, but this is at least consistent now. --- src/block/BaseCoral.php | 8 +- src/block/Cactus.php | 9 +-- src/block/CaveVines.php | 26 ++---- src/block/CocoaBlock.php | 9 +-- src/block/ConcretePowder.php | 8 +- src/block/CoralBlock.php | 8 +- src/block/Crops.php | 14 +--- src/block/Fire.php | 11 +-- src/block/FrostedIce.php | 8 +- src/block/GlowLichen.php | 11 +-- src/block/Grass.php | 14 +--- src/block/Ice.php | 8 +- src/block/Liquid.php | 10 +-- src/block/Mycelium.php | 8 +- src/block/NetherWartPlant.php | 8 +- src/block/SnowLayer.php | 8 +- src/block/Stem.php | 15 +--- src/block/Sugarcane.php | 10 +-- src/block/SweetBerryBush.php | 16 +--- src/block/utils/BlockEventHelper.php | 115 +++++++++++++++++++++++++++ 20 files changed, 166 insertions(+), 158 deletions(-) create mode 100644 src/block/utils/BlockEventHelper.php diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index 73b2c48d67..3a6acd5d15 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\utils\SupportType; -use pocketmine\event\block\BlockDeathEvent; use pocketmine\item\Item; use function mt_rand; @@ -46,11 +46,7 @@ abstract class BaseCoral extends Transparent{ public function onScheduledUpdate() : void{ if(!$this->dead && !$this->isCoveredWithWater()){ - $ev = new BlockDeathEvent($this, $this->setDead(true)); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::die($this, (clone $this)->setDead(true)); } } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 8fff294f6f..0176d17bd6 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\item\Item; @@ -111,12 +111,7 @@ class Cactus extends Transparent{ } $b = $world->getBlockAt($this->position->x, $this->position->y + $y, $this->position->z); if($b->getTypeId() === BlockTypeIds::AIR){ - $ev = new BlockGrowEvent($b, VanillaBlocks::CACTUS()); - $ev->call(); - if($ev->isCancelled()){ - break; - } - $world->setBlock($b->position, $ev->getNewState()); + BlockEventHelper::grow($b, VanillaBlocks::CACTUS(), null); }else{ break; } diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index e56b8b720b..6ff934881d 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -114,16 +114,12 @@ class CaveVines extends Flowable{ return true; } if($item instanceof Fertilizer){ - $ev = new BlockGrowEvent($this, (clone $this) + $newState = (clone $this) ->setBerries(true) - ->setHead(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)) - ); - $ev->call(); - if($ev->isCancelled()){ - return false; + ->setHead(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)); + if(BlockEventHelper::grow($this, $newState, $player)){ + $item->pop(); } - $item->pop(); - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); return true; } return false; @@ -141,16 +137,10 @@ class CaveVines extends Flowable{ if($world->isInWorld($growthPos->getFloorX(), $growthPos->getFloorY(), $growthPos->getFloorZ())){ $block = $world->getBlock($growthPos); if($block->getTypeId() === BlockTypeIds::AIR){ - $ev = new BlockGrowEvent($block, VanillaBlocks::CAVE_VINES() + $newState = VanillaBlocks::CAVE_VINES() ->setAge($this->age + 1) - ->setBerries(mt_rand(1, 9) === 1) - ); - - $ev->call(); - - if(!$ev->isCancelled()){ - $world->setBlock($growthPos, $ev->getNewState()); - } + ->setBerries(mt_rand(1, 9) === 1); + BlockEventHelper::grow($block, $newState, null); } } } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index aafce31693..69f94eaf6f 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -123,12 +123,7 @@ class CocoaBlock extends Transparent{ if($this->age < self::MAX_AGE){ $block = clone $this; $block->age++; - $ev = new BlockGrowEvent($this, $block, $player); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - return true; - } + return BlockEventHelper::grow($this, $block, $player); } return false; } diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index 02fa31adbe..635d3ff2cf 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; -use pocketmine\event\block\BlockFormEvent; use pocketmine\math\Facing; class ConcretePowder extends Opaque implements Fallable{ @@ -43,11 +43,7 @@ class ConcretePowder extends Opaque implements Fallable{ public function onNearbyBlockChange() : void{ if(($water = $this->getAdjacentWater()) !== null){ - $ev = new BlockFormEvent($this, VanillaBlocks::CONCRETE()->setColor($this->color), $water); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::form($this, VanillaBlocks::CONCRETE()->setColor($this->color), $water); }else{ $this->startFalling(); } diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index b902465617..3aaf5b7528 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; -use pocketmine\event\block\BlockDeathEvent; use pocketmine\item\Item; use function mt_rand; @@ -55,11 +55,7 @@ final class CoralBlock extends Opaque{ } } if(!$hasWater){ - $ev = new BlockDeathEvent($this, $this->setDead(true)); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::die($this, (clone $this)->setDead(true)); } } } diff --git a/src/block/Crops.php b/src/block/Crops.php index 8949e663b1..d6e84c4243 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -68,11 +68,7 @@ abstract class Crops extends Flowable{ if($block->age > self::MAX_AGE){ $block->age = self::MAX_AGE; } - - $ev = new BlockGrowEvent($this, $block, $player); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); + if(BlockEventHelper::grow($this, $block, $player)){ $item->pop(); } @@ -96,11 +92,7 @@ abstract class Crops extends Flowable{ if($this->age < self::MAX_AGE && mt_rand(0, 2) === 1){ $block = clone $this; ++$block->age; - $ev = new BlockGrowEvent($this, $block); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::grow($this, $block, null); } } } diff --git a/src/block/Fire.php b/src/block/Fire.php index 0a3b2e3e37..a39ef6b9cc 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockBurnEvent; -use pocketmine\event\block\BlockSpreadEvent; use pocketmine\math\Facing; use pocketmine\world\format\Chunk; use pocketmine\world\World; @@ -225,13 +225,6 @@ class Fire extends BaseFire{ } private function spreadBlock(Block $block, Block $newState) : bool{ - $ev = new BlockSpreadEvent($block, $this, $newState); - $ev->call(); - if(!$ev->isCancelled()){ - $block->position->getWorld()->setBlock($block->position, $ev->getNewState()); - return true; - } - - return false; + return BlockEventHelper::spread($block, $newState, $this); } } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 38c552a954..039fe49f36 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockMeltEvent; use function mt_rand; class FrostedIce extends Ice{ @@ -97,11 +97,7 @@ class FrostedIce extends Ice{ private function tryMelt() : bool{ $world = $this->position->getWorld(); if($this->age >= self::MAX_AGE){ - $ev = new BlockMeltEvent($this, VanillaBlocks::WATER()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::melt($this, VanillaBlocks::WATER()); return true; } diff --git a/src/block/GlowLichen.php b/src/block/GlowLichen.php index 39ce512a69..84dec29ce9 100644 --- a/src/block/GlowLichen.php +++ b/src/block/GlowLichen.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -166,14 +166,7 @@ class GlowLichen extends Transparent{ return false; } - $ev = new BlockSpreadEvent($replacedBlock, $this, $replacementBlock); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($replacedBlock->getPosition(), $ev->getNewState()); - return true; - } - - return false; + return BlockEventHelper::spread($replacedBlock, $replacementBlock, $this); } /** diff --git a/src/block/Grass.php b/src/block/Grass.php index 54975d0460..709dc6a9de 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\DirtType; -use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Hoe; use pocketmine\item\Item; @@ -58,11 +58,7 @@ class Grass extends Opaque{ $lightAbove = $world->getFullLightAt($this->position->x, $this->position->y + 1, $this->position->z); if($lightAbove < 4 && $world->getBlockAt($this->position->x, $this->position->y + 1, $this->position->z)->getLightFilter() >= 2){ //grass dies - $ev = new BlockSpreadEvent($this, $this, VanillaBlocks::DIRT()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState(), false); - } + BlockEventHelper::spread($this, VanillaBlocks::DIRT(), $this); }elseif($lightAbove >= 9){ //try grass spread for($i = 0; $i < 4; ++$i){ @@ -80,11 +76,7 @@ class Grass extends Opaque{ continue; } - $ev = new BlockSpreadEvent($b, $this, VanillaBlocks::GRASS()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($b->position, $ev->getNewState(), false); - } + BlockEventHelper::spread($b, VanillaBlocks::GRASS(), $this); } } } diff --git a/src/block/Ice.php b/src/block/Ice.php index 41f60e3f9d..ca0302f906 100644 --- a/src/block/Ice.php +++ b/src/block/Ice.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\event\block\BlockMeltEvent; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\player\Player; @@ -53,11 +53,7 @@ class Ice extends Transparent{ public function onRandomTick() : void{ $world = $this->position->getWorld(); if($world->getHighestAdjacentBlockLight($this->position->x, $this->position->y, $this->position->z) >= 12){ - $ev = new BlockMeltEvent($this, VanillaBlocks::WATER()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::melt($this, VanillaBlocks::WATER()); } } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index a56f666a2c..e102540ecf 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\MinimumCostFlowCalculator; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; -use pocketmine\event\block\BlockFormEvent; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -363,12 +363,8 @@ abstract class Liquid extends Transparent{ } protected function liquidCollide(Block $cause, Block $result) : bool{ - $ev = new BlockFormEvent($this, $result, $cause); - $ev->call(); - if(!$ev->isCancelled()){ - $world = $this->position->getWorld(); - $world->setBlock($this->position, $ev->getNewState()); - $world->addSound($this->position->add(0.5, 0.5, 0.5), new FizzSound(2.6 + (lcg_value() - lcg_value()) * 0.8)); + if(BlockEventHelper::form($this, $result, $cause)){ + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new FizzSound(2.6 + (lcg_value() - lcg_value()) * 0.8)); } return true; } diff --git a/src/block/Mycelium.php b/src/block/Mycelium.php index c87f893678..08b0b3e750 100644 --- a/src/block/Mycelium.php +++ b/src/block/Mycelium.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\DirtType; -use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Item; use pocketmine\math\Facing; use function mt_rand; @@ -54,11 +54,7 @@ class Mycelium extends Opaque{ $block = $world->getBlockAt($x, $y, $z); if($block instanceof Dirt && $block->getDirtType()->equals(DirtType::NORMAL())){ if($block->getSide(Facing::UP) instanceof Transparent){ - $ev = new BlockSpreadEvent($block, $this, VanillaBlocks::MYCELIUM()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($block->position, $ev->getNewState()); - } + BlockEventHelper::spread($block, VanillaBlocks::MYCELIUM(), $this); } } } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 6a8fe1f7a2..d7e5874417 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -76,11 +76,7 @@ class NetherWartPlant extends Flowable{ if($this->age < self::MAX_AGE && mt_rand(0, 10) === 0){ //Still growing $block = clone $this; $block->age++; - $ev = new BlockGrowEvent($this, $block); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::grow($this, $block, null); } } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index f561c8ff52..05fc884213 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockMeltEvent; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; @@ -105,11 +105,7 @@ class SnowLayer extends Flowable implements Fallable{ public function onRandomTick() : void{ $world = $this->position->getWorld(); if($world->getBlockLightAt($this->position->x, $this->position->y, $this->position->z) >= 12){ - $ev = new BlockMeltEvent($this, VanillaBlocks::AIR()); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::melt($this, VanillaBlocks::AIR()); } } diff --git a/src/block/Stem.php b/src/block/Stem.php index 252b28aebc..7223572dd4 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; use function array_rand; @@ -64,11 +64,7 @@ abstract class Stem extends Crops{ if($this->age < self::MAX_AGE){ $block = clone $this; ++$block->age; - $ev = new BlockGrowEvent($this, $block); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::grow($this, $block, null); }else{ $grow = $this->getPlant(); foreach(Facing::HORIZONTAL as $side){ @@ -80,12 +76,7 @@ abstract class Stem extends Crops{ $facing = Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]; $side = $this->getSide($facing); if($side->getTypeId() === BlockTypeIds::AIR && $side->getSide(Facing::DOWN)->hasTypeTag(BlockTypeTags::DIRT)){ - $ev = new BlockGrowEvent($side, $grow); - $ev->call(); - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $this->setFacing($facing)); - $world->setBlock($side->position, $ev->getNewState()); - } + BlockEventHelper::grow($side, $grow, null); } } } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 4cc5989a79..3757e45772 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -60,13 +60,11 @@ class Sugarcane extends Flowable{ } $b = $world->getBlockAt($pos->x, $pos->y + $y, $pos->z); if($b->getTypeId() === BlockTypeIds::AIR){ - $ev = new BlockGrowEvent($b, VanillaBlocks::SUGARCANE(), $player); - $ev->call(); - if($ev->isCancelled()){ + if(BlockEventHelper::grow($b, VanillaBlocks::SUGARCANE(), $player)){ + $grew = true; + }else{ break; } - $world->setBlock($b->position, $ev->getNewState()); - $grew = true; }elseif(!$b->hasSameTypeId($this)){ break; } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 5ead39390b..ef1169df53 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; -use pocketmine\event\block\BlockGrowEvent; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -87,15 +87,9 @@ class SweetBerryBush extends Flowable{ if($this->age < self::STAGE_MATURE && $item instanceof Fertilizer){ $block = clone $this; $block->age++; - - $ev = new BlockGrowEvent($this, $block, $player); - $ev->call(); - - if(!$ev->isCancelled()){ - $world->setBlock($this->position, $ev->getNewState()); + if(BlockEventHelper::grow($this, $block, $player)){ $item->pop(); } - }elseif(($dropAmount = $this->getBerryDropAmount()) > 0){ $world->setBlock($this->position, $this->setAge(self::STAGE_BUSH_NO_BERRIES)); $world->dropItem($this->position, $this->asItem()->setCount($dropAmount)); @@ -133,11 +127,7 @@ class SweetBerryBush extends Flowable{ if($this->age < self::STAGE_MATURE && mt_rand(0, 2) === 1){ $block = clone $this; ++$block->age; - $ev = new BlockGrowEvent($this, $block); - $ev->call(); - if(!$ev->isCancelled()){ - $this->position->getWorld()->setBlock($this->position, $ev->getNewState()); - } + BlockEventHelper::grow($this, $block, null); } } diff --git a/src/block/utils/BlockEventHelper.php b/src/block/utils/BlockEventHelper.php new file mode 100644 index 0000000000..fc9b06d13c --- /dev/null +++ b/src/block/utils/BlockEventHelper.php @@ -0,0 +1,115 @@ +call(); + if($ev->isCancelled()){ + return false; + } + $newState = $ev->getNewState(); + } + + $position = $oldState->getPosition(); + $position->getWorld()->setBlock($position, $newState); + return true; + } + + public static function spread(Block $oldState, Block $newState, Block $source) : bool{ + if(BlockSpreadEvent::hasHandlers()){ + $ev = new BlockSpreadEvent($oldState, $source, $newState); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $newState = $ev->getNewState(); + } + + $position = $oldState->getPosition(); + $position->getWorld()->setBlock($position, $newState); + return true; + } + + public static function form(Block $oldState, Block $newState, Block $cause) : bool{ + if(BlockFormEvent::hasHandlers()){ + $ev = new BlockFormEvent($oldState, $newState, $cause); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $newState = $ev->getNewState(); + } + + $position = $oldState->getPosition(); + $position->getWorld()->setBlock($position, $newState); + return true; + } + + public static function melt(Block $oldState, Block $newState) : bool{ + if(BlockMeltEvent::hasHandlers()){ + $ev = new BlockMeltEvent($oldState, $newState); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $newState = $ev->getNewState(); + } + + $position = $oldState->getPosition(); + $position->getWorld()->setBlock($position, $newState); + return true; + } + + public static function die(Block $oldState, Block $newState) : bool{ + if(BlockDeathEvent::hasHandlers()){ + $ev = new BlockDeathEvent($oldState, $newState); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $newState = $ev->getNewState(); + } + + $position = $oldState->getPosition(); + $position->getWorld()->setBlock($position, $newState); + return true; + } +} From d88c3d8ced493213ebfdf3f47bd7db8cfaaf3f3e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 2 Aug 2023 13:43:36 +0100 Subject: [PATCH 1264/1858] Fixed coral block killing itself when calling getDropsForCompatibleTool() this might be called by plugins without actually breaking the block, in which case the block will glitch. --- src/block/CoralBlock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index d9787178db..97400e2766 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -88,7 +88,7 @@ final class CoralBlock extends Opaque{ } public function getDropsForCompatibleTool(Item $item) : array{ - return [$this->setDead(true)->asItem()]; + return [(clone $this)->setDead(true)->asItem()]; } public function isAffectedBySilkTouch() : bool{ From 1a2c10e844aa330e5ca99800669313f3deaa4657 Mon Sep 17 00:00:00 2001 From: jasonw_4331 Date: Wed, 2 Aug 2023 13:05:16 -0400 Subject: [PATCH 1265/1858] World: Fixed getSafeSpawn() not accepting seed positions below y=1 (#5955) this should have been changed during the introduction of y=-64 minimum world height, but it got missed. --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index f556d2e1f2..b09304742d 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2951,7 +2951,7 @@ class World implements ChunkManager{ * @throws WorldException if the terrain is not generated */ public function getSafeSpawn(?Vector3 $spawn = null) : Position{ - if(!($spawn instanceof Vector3) || $spawn->y < 1){ + if(!($spawn instanceof Vector3) || $spawn->y <= $this->minY){ $spawn = $this->getSpawnLocation(); } From 81941ae9e5dbbcfccedafc31f6acf3a258873b45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 18:05:30 +0100 Subject: [PATCH 1266/1858] Bump phpunit/phpunit from 10.2.6 to 10.2.7 (#5957) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.2.6 to 10.2.7. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.2.7/ChangeLog-10.2.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.2.6...10.2.7) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index a97b576eeb..8d65486e77 100644 --- a/composer.lock +++ b/composer.lock @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.2", + "version": "10.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e" + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/db1497ec8dd382e82c962f7abbe0320e4882ee4e", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-05-22T09:04:27+00:00" + "time": "2023-07-26T13:45:28+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1861,16 +1861,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.6", + "version": "10.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" + "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a215d9ee8bac1733796e4ddff3306811f14414e5", + "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5", "shasum": "" }, "require": { @@ -1895,7 +1895,7 @@ "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -1942,7 +1942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.7" }, "funding": [ { @@ -1958,7 +1958,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T12:08:28+00:00" + "time": "2023-08-02T06:46:08+00:00" }, { "name": "sebastian/cli-parser", From c91c8c2f9e915e3ba67216cf77c76cb59de9bda8 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Thu, 3 Aug 2023 14:51:51 +0100 Subject: [PATCH 1267/1858] Improving performance of small moving entities (e.g. dropped items) (#5954) * World: cache block AABBs directly in the world this removes some indirection when fetching the AABBs, and also allows the AABB cache to live longer than the block cache. In local testing this showed a 10-20% performance improvement, but it was difficult to properly measure. * World: eliminate padding block checks in getCollisionBoxes() this substantially improves the function's performance for small entities. The padding of 1 block in each direction was previously necessary to account for blocks like fences, which might have an AABB larger than the cell containing them. However, by tracking this information in the collisionBoxCache directly, we can avoid the need to check this at the expense of slightly more complex code. This reduces the number of blocks checked for a moving item entity from 27-64 all the way down to 1-8, which is a major improvement. Locally, this change allowed me to simulate 2100 item entities without lag, compared with 1500 on the previous commit. --- src/world/World.php | 79 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index f556d2e1f2..4f266022f1 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -200,6 +200,11 @@ class World implements ChunkManager{ * @phpstan-var array> */ private array $blockCache = []; + /** + * @var AxisAlignedBB[][][] chunkHash => [relativeBlockHash => AxisAlignedBB[]] + * @phpstan-var array>> + */ + private array $blockCollisionBoxCache = []; private int $sendTimeTicker = 0; @@ -646,6 +651,7 @@ class World implements ChunkManager{ $this->provider->close(); $this->blockCache = []; + $this->blockCollisionBoxCache = []; $this->unloaded = true; } @@ -1117,6 +1123,7 @@ class World implements ChunkManager{ public function clearCache(bool $force = false) : void{ if($force){ $this->blockCache = []; + $this->blockCollisionBoxCache = []; }else{ $count = 0; foreach($this->blockCache as $list){ @@ -1126,6 +1133,16 @@ class World implements ChunkManager{ break; } } + + $count = 0; + foreach($this->blockCollisionBoxCache as $list){ + $count += count($list); + if($count > 2048){ + //TODO: Is this really the best logic? + $this->blockCollisionBoxCache = []; + break; + } + } } } @@ -1491,25 +1508,53 @@ class World implements ChunkManager{ return $collides; } + /** + * Returns a list of all block AABBs which overlap the full block area at the given coordinates. + * This checks a padding of 1 block around the coordinates to account for oversized AABBs of blocks like fences. + * Larger AABBs (>= 2 blocks on any axis) are not accounted for. + * + * @return AxisAlignedBB[] + */ + private function getCollisionBoxesForCell(int $x, int $y, int $z) : array{ + $block = $this->getBlockAt($x, $y, $z); + $boxes = $block->getCollisionBoxes(); + + $cellBB = AxisAlignedBB::one()->offset($x, $y, $z); + foreach(Facing::ALL as $facing){ + $extraBoxes = $block->getSide($facing)->getCollisionBoxes(); + foreach($extraBoxes as $extraBox){ + if($extraBox->intersectsWith($cellBB)){ + $boxes[] = $extraBox; + } + } + } + + return $boxes; + } + /** * @return AxisAlignedBB[] * @phpstan-return list */ public function getCollisionBoxes(Entity $entity, AxisAlignedBB $bb, bool $entities = true) : array{ - $minX = (int) floor($bb->minX - 1); - $minY = (int) floor($bb->minY - 1); - $minZ = (int) floor($bb->minZ - 1); - $maxX = (int) floor($bb->maxX + 1); - $maxY = (int) floor($bb->maxY + 1); - $maxZ = (int) floor($bb->maxZ + 1); + $minX = (int) floor($bb->minX); + $minY = (int) floor($bb->minY); + $minZ = (int) floor($bb->minZ); + $maxX = (int) floor($bb->maxX); + $maxY = (int) floor($bb->maxY); + $maxZ = (int) floor($bb->maxZ); $collides = []; for($z = $minZ; $z <= $maxZ; ++$z){ for($x = $minX; $x <= $maxX; ++$x){ + $chunkPosHash = World::chunkHash($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE); for($y = $minY; $y <= $maxY; ++$y){ - $block = $this->getBlockAt($x, $y, $z); - foreach($block->getCollisionBoxes() as $blockBB){ + $relativeBlockHash = World::chunkBlockHash($x, $y, $z); + + $boxes = $this->blockCollisionBoxCache[$chunkPosHash][$relativeBlockHash] ??= $this->getCollisionBoxesForCell($x, $y, $z); + + foreach($boxes as $blockBB){ if($blockBB->intersectsWith($bb)){ $collides[] = $blockBB; } @@ -1858,6 +1903,21 @@ class World implements ChunkManager{ $relativeBlockHash = World::chunkBlockHash($x, $y, $z); unset($this->blockCache[$chunkHash][$relativeBlockHash]); + unset($this->blockCollisionBoxCache[$chunkHash][$relativeBlockHash]); + //blocks like fences have collision boxes that reach into neighbouring blocks, so we need to invalidate the + //caches for those blocks as well + foreach([ + [0, 0, 1], + [0, 0, -1], + [0, 1, 0], + [0, -1, 0], + [1, 0, 0], + [-1, 0, 0] + ] as [$offsetX, $offsetY, $offsetZ]){ + $sideChunkPosHash = World::chunkHash(($x + $offsetX) >> Chunk::COORD_BIT_SIZE, ($z + $offsetZ) >> Chunk::COORD_BIT_SIZE); + $sideChunkBlockHash = World::chunkBlockHash($x + $offsetX, $y + $offsetY, $z + $offsetZ); + unset($this->blockCollisionBoxCache[$sideChunkPosHash][$sideChunkBlockHash]); + } if(!isset($this->changedBlocks[$chunkHash])){ $this->changedBlocks[$chunkHash] = []; @@ -2454,6 +2514,7 @@ class World implements ChunkManager{ $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); + unset($this->blockCollisionBoxCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); $chunk->setTerrainDirty(); $this->markTickingChunkForRecheck($chunkX, $chunkZ); //this replacement chunk may not meet the conditions for ticking @@ -2733,6 +2794,7 @@ class World implements ChunkManager{ } $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); + unset($this->blockCollisionBoxCache[$chunkHash]); $this->initChunk($x, $z, $chunkData); @@ -2887,6 +2949,7 @@ class World implements ChunkManager{ unset($this->chunks[$chunkHash]); unset($this->blockCache[$chunkHash]); + unset($this->blockCollisionBoxCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); unset($this->registeredTickingChunks[$chunkHash]); $this->markTickingChunkForRecheck($x, $z); From 6ac45526f9b58a068d0be0ffd9fa1bce771f8eb5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 3 Aug 2023 16:46:16 +0100 Subject: [PATCH 1268/1858] Use new features in pocketmine/math 1.0.0 --- composer.json | 2 +- composer.lock | 58 ++++++++++++++++----------------- src/block/MobHead.php | 17 +++++----- src/world/World.php | 9 +---- src/world/light/LightUpdate.php | 16 +++------ 5 files changed, 44 insertions(+), 58 deletions(-) diff --git a/composer.json b/composer.json index 5cb32d2ac6..f191086ca7 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "pocketmine/errorhandler": "^0.6.0", "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", - "pocketmine/math": "^0.4.0", + "pocketmine/math": "~1.0.0", "pocketmine/nbt": "^0.3.2", "pocketmine/raklib": "^0.15.0", "pocketmine/raklib-ipc": "^0.2.0", diff --git a/composer.lock b/composer.lock index a97b576eeb..40bdcb23d3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ccd20e7656bc05ec2acd8e28aad9fcf2", + "content-hash": "63ecdcea88960659a6977300a0ea79b3", "packages": [ { "name": "adhocore/json-comment", @@ -200,16 +200,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.2+bedrock-1.20.10", + "version": "23.0.3+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd" + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e4157c7af3f91e1b08fe21be171eb73dad7029e9", + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9", "shasum": "" }, "require": { @@ -218,8 +218,8 @@ "php": "^8.0", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", - "pocketmine/math": "^0.3.0 || ^0.4.0", - "pocketmine/nbt": "^0.3.0", + "pocketmine/math": "^0.3.0 || ^0.4.0 || ^1.0.0", + "pocketmine/nbt": "^0.3.0 || ^1.0.0", "ramsey/uuid": "^4.1" }, "require-dev": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.2+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.3+bedrock-1.20.10" }, - "time": "2023-07-24T15:35:36+00:00" + "time": "2023-08-03T15:30:52+00:00" }, { "name": "pocketmine/binaryutils", @@ -480,16 +480,16 @@ }, { "name": "pocketmine/math", - "version": "0.4.3", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/Math.git", - "reference": "47a243d320b01c8099d65309967934c188111549" + "reference": "dc132d93595b32e9f210d78b3c8d43c662a5edbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Math/zipball/47a243d320b01c8099d65309967934c188111549", - "reference": "47a243d320b01c8099d65309967934c188111549", + "url": "https://api.github.com/repos/pmmp/Math/zipball/dc132d93595b32e9f210d78b3c8d43c662a5edbf", + "reference": "dc132d93595b32e9f210d78b3c8d43c662a5edbf", "shasum": "" }, "require": { @@ -498,7 +498,7 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.8.2", + "phpstan/phpstan": "~1.10.3", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^8.5 || ^9.5" }, @@ -515,9 +515,9 @@ "description": "PHP library containing math related code used in PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Math/issues", - "source": "https://github.com/pmmp/Math/tree/0.4.3" + "source": "https://github.com/pmmp/Math/tree/1.0.0" }, - "time": "2022-08-25T18:43:37+00:00" + "time": "2023-08-03T12:56:33+00:00" }, { "name": "pocketmine/nbt", @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.2", + "version": "10.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e" + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/db1497ec8dd382e82c962f7abbe0320e4882ee4e", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-05-22T09:04:27+00:00" + "time": "2023-07-26T13:45:28+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1861,16 +1861,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.6", + "version": "10.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" + "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a215d9ee8bac1733796e4ddff3306811f14414e5", + "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5", "shasum": "" }, "require": { @@ -1895,7 +1895,7 @@ "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -1942,7 +1942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.7" }, "funding": [ { @@ -1958,7 +1958,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T12:08:28+00:00" + "time": "2023-08-02T06:46:08+00:00" }, { "name": "sebastian/cli-parser", diff --git a/src/block/MobHead.php b/src/block/MobHead.php index 1b3f2d88fa..96cd1cf344 100644 --- a/src/block/MobHead.php +++ b/src/block/MobHead.php @@ -113,14 +113,15 @@ class MobHead extends Flowable{ * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ - $collisionBox = AxisAlignedBB::one()->contract(0.25, 0, 0.25)->trim(Facing::UP, 0.5); - return match($this->facing){ - Facing::NORTH => [$collisionBox->offset(0, 0.25, 0.25)], - Facing::SOUTH => [$collisionBox->offset(0, 0.25, -0.25)], - Facing::WEST => [$collisionBox->offset(0.25, 0.25, 0)], - Facing::EAST => [$collisionBox->offset(-0.25, 0.25, 0)], - default => [$collisionBox] - }; + $collisionBox = AxisAlignedBB::one() + ->contract(0.25, 0, 0.25) + ->trim(Facing::UP, 0.5); + if($this->facing !== Facing::UP){ + $collisionBox = $collisionBox + ->offsetTowards(Facing::opposite($this->facing), 0.25) + ->offsetTowards(Facing::UP, 0.25); + } + return [$collisionBox]; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/world/World.php b/src/world/World.php index 4f266022f1..49025b9481 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1906,14 +1906,7 @@ class World implements ChunkManager{ unset($this->blockCollisionBoxCache[$chunkHash][$relativeBlockHash]); //blocks like fences have collision boxes that reach into neighbouring blocks, so we need to invalidate the //caches for those blocks as well - foreach([ - [0, 0, 1], - [0, 0, -1], - [0, 1, 0], - [0, -1, 0], - [1, 0, 0], - [-1, 0, 0] - ] as [$offsetX, $offsetY, $offsetZ]){ + foreach(Facing::OFFSET as [$offsetX, $offsetY, $offsetZ]){ $sideChunkPosHash = World::chunkHash(($x + $offsetX) >> Chunk::COORD_BIT_SIZE, ($z + $offsetZ) >> Chunk::COORD_BIT_SIZE); $sideChunkBlockHash = World::chunkBlockHash($x + $offsetX, $y + $offsetY, $z + $offsetZ); unset($this->blockCollisionBoxCache[$sideChunkPosHash][$sideChunkBlockHash]); diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index 1a82bdcef2..58ac0a9dcb 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\light; +use pocketmine\math\Facing; use pocketmine\world\format\LightArray; use pocketmine\world\format\SubChunk; use pocketmine\world\utils\SubChunkExplorer; @@ -33,15 +34,6 @@ use function max; //TODO: make light updates asynchronous abstract class LightUpdate{ - private const ADJACENTS = [ - [ 1, 0, 0], - [-1, 0, 0], - [ 0, 1, 0], - [ 0, -1, 0], - [ 0, 0, 1], - [ 0, 0, -1] - ]; - public const BASE_LIGHT_FILTER = 1; /** @@ -78,7 +70,7 @@ abstract class LightUpdate{ protected function getHighestAdjacentLight(int $x, int $y, int $z) : int{ $adjacent = 0; - foreach(self::ADJACENTS as [$ox, $oy, $oz]){ + foreach(Facing::OFFSET as [$ox, $oy, $oz]){ if(($adjacent = max($adjacent, $this->getEffectiveLight($x + $ox, $y + $oy, $z + $oz))) === 15){ break; } @@ -123,7 +115,7 @@ abstract class LightUpdate{ $touched++; [$x, $y, $z, $oldAdjacentLight] = $context->removalQueue->dequeue(); - foreach(self::ADJACENTS as [$ox, $oy, $oz]){ + foreach(Facing::OFFSET as [$ox, $oy, $oz]){ $cx = $x + $ox; $cy = $y + $oy; $cz = $z + $oz; @@ -163,7 +155,7 @@ abstract class LightUpdate{ continue; } - foreach(self::ADJACENTS as [$ox, $oy, $oz]){ + foreach(Facing::OFFSET as [$ox, $oy, $oz]){ $cx = $x + $ox; $cy = $y + $oy; $cz = $z + $oz; From 1cf508abdbda46ab178da7637aaeb0b892e401ac Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 3 Aug 2023 16:51:09 +0100 Subject: [PATCH 1269/1858] World: use Facing::OFFSET in getHighestAdjacentLight() --- src/world/World.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 49025b9481..4d6cad154a 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1727,14 +1727,10 @@ class World implements ChunkManager{ */ private function getHighestAdjacentLight(int $x, int $y, int $z, \Closure $lightGetter) : int{ $max = 0; - foreach([ - [$x + 1, $y, $z], - [$x - 1, $y, $z], - [$x, $y + 1, $z], - [$x, $y - 1, $z], - [$x, $y, $z + 1], - [$x, $y, $z - 1] - ] as [$x1, $y1, $z1]){ + foreach(Facing::OFFSET as [$offsetX, $offsetY, $offsetZ]){ + $x1 = $x + $offsetX; + $y1 = $y + $offsetY; + $z1 = $z + $offsetZ; if( !$this->isInWorld($x1, $y1, $z1) || ($chunk = $this->getChunk($x1 >> Chunk::COORD_BIT_SIZE, $z1 >> Chunk::COORD_BIT_SIZE)) === null || From 35a28300f6c4a83153087cca54bfe2ffa7d9c185 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 7 Aug 2023 13:47:29 +0300 Subject: [PATCH 1270/1858] Podzol should be affected by silk touch (#5969) --- src/block/Podzol.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/Podzol.php b/src/block/Podzol.php index 4eb720573d..33285cc0ed 100644 --- a/src/block/Podzol.php +++ b/src/block/Podzol.php @@ -27,6 +27,10 @@ use pocketmine\item\Item; class Podzol extends Opaque{ + public function isAffectedBySilkTouch() : bool{ + return true; + } + public function getDropsForCompatibleTool(Item $item) : array{ return [ VanillaBlocks::DIRT()->asItem() From 515f8eae4ca2b7b0a3e9251904dfe0f3f688a777 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Aug 2023 17:05:45 +0100 Subject: [PATCH 1271/1858] =?UTF-8?q?=C3=82ResourcePackManager:=20allow=20?= =?UTF-8?q?setting=20force=5Fresources=20from=20a=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/resourcepacks/ResourcePackManager.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/resourcepacks/ResourcePackManager.php b/src/resourcepacks/ResourcePackManager.php index 6429ac06bb..2df6750def 100644 --- a/src/resourcepacks/ResourcePackManager.php +++ b/src/resourcepacks/ResourcePackManager.php @@ -154,6 +154,13 @@ class ResourcePackManager{ return $this->serverForceResources; } + /** + * Sets whether players must accept resource packs in order to join. + */ + public function setResourcePacksRequired(bool $value) : void{ + $this->serverForceResources = $value; + } + /** * Returns an array of resource packs in use, sorted in order of priority. * @return ResourcePack[] From 2e58387a437848e68ccbf76062492dbb83c830d6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 14:55:53 +0100 Subject: [PATCH 1272/1858] Fixed thread error capture fail in shutdown function the shutdown handler currently isn't called until join(), which sets isKilled to true and stops the error information from being recorded. --- src/thread/CommonThreadPartsTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 340ce554d9..e7429be9bf 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -124,7 +124,7 @@ trait CommonThreadPartsTrait{ */ protected function onShutdown() : void{ $this->synchronized(function() : void{ - if(!$this->isKilled && $this->crashInfo === null){ + if($this->isTerminated() && $this->crashInfo === null){ $last = error_get_last(); if($last !== null){ //fatal error From 2559d1719f531242a3d010406a4747d74a7239c0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 14:56:54 +0100 Subject: [PATCH 1273/1858] All pocketmine\thread\Thread now log uncaught exceptions and fatal errors by default --- src/network/mcpe/raklib/RakLibServer.php | 6 +----- src/scheduler/AsyncWorker.php | 5 ----- src/thread/CommonThreadPartsTrait.php | 16 ++++++++++++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index e59b6971fe..e2d6d9a669 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -85,6 +85,7 @@ class RakLibServer extends Thread{ gc_enable(); ini_set("display_errors", '1'); ini_set("display_startup_errors", '1'); + \GlobalLogger::set($this->logger); $socket = new ServerSocket($this->address->deserialize()); $manager = new Server( @@ -107,11 +108,6 @@ class RakLibServer extends Thread{ $manager->waitShutdown(); } - protected function onUncaughtException(\Throwable $e) : void{ - parent::onUncaughtException($e); - $this->logger->logException($e); - } - public function getThreadName() : string{ return "RakLib"; } diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index b26afc29b4..919e3eedcf 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -69,11 +69,6 @@ class AsyncWorker extends Worker{ $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); } - protected function onUncaughtException(\Throwable $e) : void{ - parent::onUncaughtException($e); - $this->logger->logException($e); - } - public function getLogger() : ThreadSafeLogger{ return $this->logger; } diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index e7429be9bf..f5cd8fe0a7 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -115,6 +115,7 @@ trait CommonThreadPartsTrait{ protected function onUncaughtException(\Throwable $e) : void{ $this->synchronized(function() use ($e) : void{ $this->crashInfo = ThreadCrashInfo::fromThrowable($e, $this->getThreadName()); + \GlobalLogger::get()->logException($e); }); } @@ -128,11 +129,22 @@ trait CommonThreadPartsTrait{ $last = error_get_last(); if($last !== null){ //fatal error - $this->crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); + $crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); }else{ //probably misused exit() - $this->crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); + $crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); } + $this->crashInfo = $crashInfo; + + $lines = []; + //mimic exception printed format + $lines[] = "Fatal error: " . $crashInfo->makePrettyMessage(); + $lines[] = "--- Stack trace ---"; + foreach($crashInfo->getTrace() as $frame){ + $lines[] = " " . $frame->getPrintableFrame(); + } + $lines[] = "--- End of fatal error information ---"; + \GlobalLogger::get()->critical(implode("\n", $lines)); } }); } From 710177ceb5a0a72e9b442331b5b102614ec48335 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 15:10:31 +0100 Subject: [PATCH 1274/1858] CS this mistake actually hasn't happened for a while --- src/thread/CommonThreadPartsTrait.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index f5cd8fe0a7..de2ecbde81 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -28,6 +28,7 @@ use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\Server; use function error_get_last; use function error_reporting; +use function implode; use function register_shutdown_function; use function set_exception_handler; From c1638ffaabfb8ffad41e530532f7a131db30a8e8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 17:08:13 +0100 Subject: [PATCH 1275/1858] Ban foreach by-reference at the PHPStan level --- phpstan.neon.dist | 1 + src/permission/PermissionManager.php | 6 +-- .../rules/DisallowForeachByReferenceRule.php | 53 +++++++++++++++++++ .../block/regenerate_consistency_check.php | 4 +- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 tests/phpstan/rules/DisallowForeachByReferenceRule.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index b3aeaf4f6d..1d72511f7c 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -11,6 +11,7 @@ includes: rules: - pocketmine\phpstan\rules\DisallowEnumComparisonRule + - pocketmine\phpstan\rules\DisallowForeachByReferenceRule - pocketmine\phpstan\rules\UnsafeForeachArrayOfStringRule # - pocketmine\phpstan\rules\ThreadedSupportedTypesRule diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index b7e622934f..2d83248874 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -81,9 +81,9 @@ class PermissionManager{ } public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ - foreach($this->permSubs as $permission => &$subs){ - unset($subs[spl_object_id($permissible)]); - if(count($subs) === 0){ + foreach($this->permSubs as $permission => $subs){ + unset($this->permSubs[$permission][spl_object_id($permissible)]); + if(count($this->permSubs[$permission]) === 0){ unset($this->permSubs[$permission]); } } diff --git a/tests/phpstan/rules/DisallowForeachByReferenceRule.php b/tests/phpstan/rules/DisallowForeachByReferenceRule.php new file mode 100644 index 0000000000..79124d3283 --- /dev/null +++ b/tests/phpstan/rules/DisallowForeachByReferenceRule.php @@ -0,0 +1,53 @@ + + */ +final class DisallowForeachByReferenceRule implements Rule{ + + public function getNodeType() : string{ + return Foreach_::class; + } + + public function processNode(Node $node, Scope $scope) : array{ + /** @var Foreach_ $node */ + if($node->byRef){ + return [ + RuleErrorBuilder::message("Foreach by-reference is not allowed, because it has surprising behaviour.") + ->tip("If the value variable is used outside of the foreach construct (e.g. in a second foreach), the iterable's contents will be unexpectedly altered.") + ->build() + ]; + } + + return []; + } +} diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index 9930c54f0c..ac8a1ad9de 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -24,6 +24,7 @@ declare(strict_types=1); use pocketmine\block\Block; use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Utils; require dirname(__DIR__, 3) . '/vendor/autoload.php'; @@ -91,8 +92,9 @@ foreach($new as $stateId => $name){ $newTable[$name][] = $stateId; } ksort($newTable, SORT_STRING); -foreach($newTable as &$stateIds){ +foreach(Utils::stringifyKeys($newTable) as $name => $stateIds){ sort($stateIds, SORT_NUMERIC); + $newTable[$name] = $stateIds; } file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( From 514fc1ebb5b182c367ac16d3a94bf4594d62d56b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 17:33:16 +0100 Subject: [PATCH 1276/1858] Bump phpunit/phpunit from 10.2.7 to 10.3.1 (#5965) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.2.7 to 10.3.1. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.3.1/ChangeLog-10.3.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.2.7...10.3.1) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 8d65486e77..0e4d424691 100644 --- a/composer.lock +++ b/composer.lock @@ -1861,16 +1861,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.7", + "version": "10.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5" + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a215d9ee8bac1733796e4ddff3306811f14414e5", - "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804", + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804", "shasum": "" }, "require": { @@ -1910,7 +1910,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.2-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -1942,7 +1942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.7" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1" }, "funding": [ { @@ -1958,7 +1958,7 @@ "type": "tidelift" } ], - "time": "2023-08-02T06:46:08+00:00" + "time": "2023-08-04T06:48:08+00:00" }, { "name": "sebastian/cli-parser", From 2c74124e2ea9cd419e65a6495c555cca3b9bc806 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 17:43:01 +0100 Subject: [PATCH 1277/1858] Update composer dependencies --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 0e4d424691..bdecdb5ed2 100644 --- a/composer.lock +++ b/composer.lock @@ -200,16 +200,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.2+bedrock-1.20.10", + "version": "23.0.3+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd" + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e4157c7af3f91e1b08fe21be171eb73dad7029e9", + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9", "shasum": "" }, "require": { @@ -218,8 +218,8 @@ "php": "^8.0", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", - "pocketmine/math": "^0.3.0 || ^0.4.0", - "pocketmine/nbt": "^0.3.0", + "pocketmine/math": "^0.3.0 || ^0.4.0 || ^1.0.0", + "pocketmine/nbt": "^0.3.0 || ^1.0.0", "ramsey/uuid": "^4.1" }, "require-dev": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.2+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.3+bedrock-1.20.10" }, - "time": "2023-07-24T15:35:36+00:00" + "time": "2023-08-03T15:30:52+00:00" }, { "name": "pocketmine/binaryutils", From 9c1ab943bc8b2bba6179a04390b40adfc867357f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 17:43:31 +0100 Subject: [PATCH 1278/1858] Bump ext-pmmpthread min version to 6.0.7 --- composer.json | 2 +- src/PocketMine.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 5cb32d2ac6..75f68f89d6 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.4", + "ext-pmmpthread": "^6.0.7", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/src/PocketMine.php b/src/PocketMine.php index 2c8ab06dee..4c2ff32a73 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -120,8 +120,8 @@ namespace pocketmine { } if(($pmmpthread_version = phpversion("pmmpthread")) !== false){ - if(version_compare($pmmpthread_version, "6.0.4") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ - $messages[] = "pmmpthread ^6.0.4 is required, while you have $pmmpthread_version."; + if(version_compare($pmmpthread_version, "6.0.7") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ + $messages[] = "pmmpthread ^6.0.7 is required, while you have $pmmpthread_version."; } } From dd79d4c463a2190d0ae38b0be562595a4deb7e95 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 17:44:13 +0100 Subject: [PATCH 1279/1858] Updated build/php submodule to pmmp/PHP-Binaries@ed0bc4d2afafd00f9ee92823c6b1bd66789ce4f2 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 46604f2f6a..ed0bc4d2af 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 46604f2f6a07e3f68a82e4f4d7efdd45629b101e +Subproject commit ed0bc4d2afafd00f9ee92823c6b1bd66789ce4f2 From b45b4b5edf52e891b820ea2881cab03f13cc4226 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 18:27:07 +0100 Subject: [PATCH 1280/1858] Update translations --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index bdecdb5ed2..c96739b253 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ccd20e7656bc05ec2acd8e28aad9fcf2", + "content-hash": "27b30e0ed071ba0e6733545a695c3586", "packages": [ { "name": "adhocore/json-comment", @@ -416,16 +416,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.19.5", + "version": "2.19.6", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d" + "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", - "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", + "url": "https://api.github.com/repos/pmmp/Language/zipball/93e473e20e7f4515ecf45c5ef0f9155b9247a86e", + "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e", "shasum": "" }, "type": "library", @@ -433,9 +433,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.19.5" + "source": "https://github.com/pmmp/Language/tree/2.19.6" }, - "time": "2023-03-19T16:45:15+00:00" + "time": "2023-08-08T16:53:23+00:00" }, { "name": "pocketmine/log", @@ -2945,7 +2945,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.4", + "ext-pmmpthread": "^6.0.7", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", From ebcd6a0bb2c030d352df1025bc1418a443f25855 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 18:29:49 +0100 Subject: [PATCH 1281/1858] CraftItemEvent: fixed inputs and outputs not being cloned --- src/event/inventory/CraftItemEvent.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/event/inventory/CraftItemEvent.php b/src/event/inventory/CraftItemEvent.php index 64f285f155..35409f8286 100644 --- a/src/event/inventory/CraftItemEvent.php +++ b/src/event/inventory/CraftItemEvent.php @@ -30,6 +30,7 @@ use pocketmine\event\Event; use pocketmine\inventory\transaction\CraftingTransaction; use pocketmine\item\Item; use pocketmine\player\Player; +use pocketmine\utils\Utils; class CraftItemEvent extends Event implements Cancellable{ use CancellableTrait; @@ -74,7 +75,7 @@ class CraftItemEvent extends Event implements Cancellable{ * @return Item[] */ public function getInputs() : array{ - return $this->inputs; + return Utils::cloneObjectArray($this->inputs); } /** @@ -83,7 +84,7 @@ class CraftItemEvent extends Event implements Cancellable{ * @return Item[] */ public function getOutputs() : array{ - return $this->outputs; + return Utils::cloneObjectArray($this->outputs); } public function getPlayer() : Player{ From b8a4ca45e40f8c242d63bd7de51bcf8294fca2b5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 18:41:06 +0100 Subject: [PATCH 1282/1858] Release 5.4.1 --- changelogs/5.4.md | 16 ++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/changelogs/5.4.md b/changelogs/5.4.md index a40fdfcea3..8e77f7eb04 100644 --- a/changelogs/5.4.md +++ b/changelogs/5.4.md @@ -81,3 +81,19 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - In addition, this change facilitates the use of the newly introduced `Block->getAdjacentSupportType()` API method, reducing boilerplate support-type checking code. - Bell block code has been simplified and cleaned up. - `TallGrass` and `DoubleTallGrass` now use a shared `TallGrassTrait` to reduce code duplication. + +# 5.4.1 +Released 8th August 2023. + +## General +- Updated translation data to [pmmp/Language 2.19.6](https://github.com/pmmp/Language/releases/tag/2.19.6). +- [`ext-pmmpthread` 6.0.7](https://github.com/pmmp/ext-pmmpthread/releases/tag/6.0.7) is now required (needed for bug fixes). + +## Fixes +- Fixed Podzol not dropping itself when mined with Silk Touch. +- Fixed `World->getSafeSpawn()` not accepting positions below `y=0` (world height limit change). +- Fixed `pocketmine\thread\Thread` and `pocketmine\thread\Worker` instances not logging any information when they crash. +- Fixed `CraftItemEvent` not cloning returned items. + +## Internals +- Foreach by-reference is now disallowed via a custom PHPStan rule. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0b40f80e46..f2436e100a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.4.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 662f2495e94b4d84793fb2022b249d8edb38d7f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 18:41:09 +0100 Subject: [PATCH 1283/1858] 5.4.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index f2436e100a..29d744d5d5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.4.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 77dfbc4e234147aa263bf4efcd8c4edcdef0a31c Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:33:33 +0300 Subject: [PATCH 1284/1858] Implemented pink petals (#5940) --- src/block/BlockTypeIds.php | 3 +- src/block/PinkPetals.php | 119 ++++++++++++++++++ src/block/VanillaBlocks.php | 2 + .../convert/BlockObjectToStateSerializer.php | 6 + .../BlockStateToObjectDeserializer.php | 8 ++ src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 7 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/block/PinkPetals.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index fe2101e1fb..dc86490c33 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -736,8 +736,9 @@ final class BlockTypeIds{ public const SMALL_DRIPLEAF = 10706; public const BIG_DRIPLEAF_HEAD = 10707; public const BIG_DRIPLEAF_STEM = 10708; + public const PINK_PETALS = 10709; - public const FIRST_UNUSED_BLOCK_ID = 10709; + public const FIRST_UNUSED_BLOCK_ID = 10710; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/PinkPetals.php b/src/block/PinkPetals.php new file mode 100644 index 0000000000..9271e7ddc6 --- /dev/null +++ b/src/block/PinkPetals.php @@ -0,0 +1,119 @@ +horizontalFacing($this->facing); + $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + } + + public function getCount() : int{ + return $this->count; + } + + /** @return $this */ + public function setCount(int $count) : self{ + if($count < self::MIN_COUNT || $count > self::MAX_COUNT){ + throw new \InvalidArgumentException("Count must be in range " . self::MIN_COUNT . " ... " . self::MAX_COUNT); + } + $this->count = $count; + return $this; + } + + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + //TODO: Moss block + return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedAt($this)){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ + return ($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT) || parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedAt($this)){ + return false; + } + if($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT){ + $this->count = $blockReplace->getCount() + 1; + $this->facing = $blockReplace->getFacing(); + }elseif($player !== null){ + $this->facing = Facing::opposite($player->getHorizontalFacing()); + } + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer){ + $grew = false; + if($this->count < self::MAX_COUNT){ + $grew = BlockEventHelper::grow($this, (clone $this)->setCount($this->count + 1), $player); + }else{ + $this->position->getWorld()->dropItem($this->position->add(0, 0.5, 0), $this->asItem()); + $grew = true; + } + if($grew){ + $item->pop(); + return true; + } + } + return false; + } + + public function getFlameEncouragement() : int{ + return 60; + } + + public function getFlammability() : int{ + return 100; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [$this->asItem()->setCount($this->count)]; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 9f2996abd6..d733b06c2b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -573,6 +573,7 @@ use function mb_strtolower; * @method static PackedIce PACKED_ICE() * @method static Opaque PACKED_MUD() * @method static DoublePlant PEONY() + * @method static PinkPetals PINK_PETALS() * @method static Flower PINK_TULIP() * @method static Podzol PODZOL() * @method static Opaque POLISHED_ANDESITE() @@ -840,6 +841,7 @@ final class VanillaBlocks{ self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", new Info(BreakInfo::instant()))); self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", new Info(BreakInfo::instant()))); self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", new Info(BreakInfo::instant()))); + self::register("pink_petals", new PinkPetals(new BID(Ids::PINK_PETALS), "Pink Petals", new Info(BreakInfo::instant()))); self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())))); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 8ec9a1ddc7..6ffc1c55df 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -100,6 +100,7 @@ use pocketmine\block\MobHead; use pocketmine\block\NetherPortal; use pocketmine\block\NetherVines; use pocketmine\block\NetherWartPlant; +use pocketmine\block\PinkPetals; use pocketmine\block\Potato; use pocketmine\block\PoweredRail; use pocketmine\block\PumpkinStem; @@ -1364,6 +1365,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::PINK_PETALS(), function(PinkPetals $block) : Writer{ + return Writer::create(Ids::PINK_PETALS) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeInt(StateNames::GROWTH, $block->getCount() - 1); + }); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 08c9b5914c..f6b8699a94 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -28,6 +28,7 @@ use pocketmine\block\Block; use pocketmine\block\CaveVines; use pocketmine\block\ChorusFlower; use pocketmine\block\Light; +use pocketmine\block\PinkPetals; use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; @@ -1175,6 +1176,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT())->setAxis($in->readPillarAxis())); + $this->map(Ids::PINK_PETALS, function(Reader $in) : Block{ + //Pink petals only uses 0-3, but GROWTH state can go up to 7 + $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); + return Blocks::PINK_PETALS() + ->setFacing($in->readLegacyHorizontalFacing()) + ->setCount(min($growth + 1, PinkPetals::MAX_COUNT)); + }); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); $this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ return Blocks::POLISHED_BASALT() diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index ea9923c219..c8be97cadf 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -856,6 +856,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("packed_ice", fn() => Blocks::PACKED_ICE()); $result->registerBlock("packed_mud", fn() => Blocks::PACKED_MUD()); $result->registerBlock("peony", fn() => Blocks::PEONY()); + $result->registerBlock("pink_petals", fn() => Blocks::PINK_PETALS()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN())); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 2e9fa0555f..c120105649 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From f4a06605b174315ed1c5413a94c8b8d3f19ae60d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 11:42:08 +0100 Subject: [PATCH 1285/1858] Cake: only accept candle when no slices have been taken otherwise, cake slices can be regenerated using candle --- src/block/Cake.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Cake.php b/src/block/Cake.php index 3e26e59b06..81dc7e6e90 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -64,7 +64,7 @@ class Cake extends BaseCake{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ - if($item instanceof ItemBlock){ + if($this->bites === 0 && $item instanceof ItemBlock){ $block = $item->getBlock(); $resultBlock = null; if($block->getTypeId() === BlockTypeIds::CANDLE){ From 735d9a5bf4891a23d65d0c765275d361178bdb67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 12:04:02 +0100 Subject: [PATCH 1286/1858] CandleTrait: allow candle to be lit by fire charges --- src/block/utils/CandleTrait.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 99e164a843..58a7443a3c 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -33,6 +33,7 @@ use pocketmine\item\ItemTypeIds; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\world\sound\BlazeShootSound; use pocketmine\world\sound\FireExtinguishSound; use pocketmine\world\sound\FlintSteelSound; @@ -57,12 +58,16 @@ trait CandleTrait{ /** @see Block::onInteract() */ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ - if($item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ + if($item->getTypeId() === ItemTypeIds::FIRE_CHARGE || $item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ if($this->lit){ return true; } if($item instanceof Durable){ $item->applyDamage(1); + }elseif($item->getTypeId() === ItemTypeIds::FIRE_CHARGE){ + $item->pop(); + //TODO: not sure if this is intentional, but it's what Bedrock currently does as of 1.20.10 + $this->position->getWorld()->addSound($this->position, new BlazeShootSound()); } $this->position->getWorld()->addSound($this->position, new FlintSteelSound()); $this->position->getWorld()->setBlock($this->position, $this->setLit(true)); From 59c88fe7f714abb88f2d472bf41d15478d43d4e7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 12:21:09 +0100 Subject: [PATCH 1287/1858] Added WorldDifficultyChangeEvent --- .../world/WorldDifficultyChangeEvent.php | 44 +++++++++++++++++++ src/world/World.php | 2 + 2 files changed, 46 insertions(+) create mode 100644 src/event/world/WorldDifficultyChangeEvent.php diff --git a/src/event/world/WorldDifficultyChangeEvent.php b/src/event/world/WorldDifficultyChangeEvent.php new file mode 100644 index 0000000000..90cee376a5 --- /dev/null +++ b/src/event/world/WorldDifficultyChangeEvent.php @@ -0,0 +1,44 @@ +oldDifficulty; } + + public function getNewDifficulty() : int{ return $this->newDifficulty; } +} diff --git a/src/world/World.php b/src/world/World.php index 7d9311c70d..934ff6690e 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -52,6 +52,7 @@ use pocketmine\event\world\ChunkLoadEvent; use pocketmine\event\world\ChunkPopulateEvent; use pocketmine\event\world\ChunkUnloadEvent; use pocketmine\event\world\SpawnChangeEvent; +use pocketmine\event\world\WorldDifficultyChangeEvent; use pocketmine\event\world\WorldDisplayNameChangeEvent; use pocketmine\event\world\WorldParticleEvent; use pocketmine\event\world\WorldSaveEvent; @@ -3127,6 +3128,7 @@ class World implements ChunkManager{ if($difficulty < 0 || $difficulty > 3){ throw new \InvalidArgumentException("Invalid difficulty level $difficulty"); } + (new WorldDifficultyChangeEvent($this, $this->getDifficulty(), $difficulty))->call(); $this->provider->getWorldData()->setDifficulty($difficulty); foreach($this->players as $player){ From a5d8ef7a6c5ad93a385de8d3be92eef29e812494 Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:33:25 +0200 Subject: [PATCH 1288/1858] Add FarmlandHydrationChangeEvent (#5916) --- src/block/Farmland.php | 17 ++++-- .../block/FarmlandHydrationChangeEvent.php | 59 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/event/block/FarmlandHydrationChangeEvent.php diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 6fcdcd8bc2..2dd795eecc 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -26,6 +26,7 @@ namespace pocketmine\block; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; +use pocketmine\event\block\FarmlandHydrationChangeEvent; use pocketmine\event\entity\EntityTrampleFarmlandEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -73,14 +74,22 @@ class Farmland extends Transparent{ $world = $this->position->getWorld(); if(!$this->canHydrate()){ if($this->wetness > 0){ - $this->wetness--; - $world->setBlock($this->position, $this, false); + $event = new FarmlandHydrationChangeEvent($this, $this->wetness, $this->wetness - 1); + $event->call(); + if(!$event->isCancelled()){ + $this->wetness = $event->getNewHydration(); + $world->setBlock($this->position, $this, false); + } }else{ $world->setBlock($this->position, VanillaBlocks::DIRT()); } }elseif($this->wetness < self::MAX_WETNESS){ - $this->wetness = self::MAX_WETNESS; - $world->setBlock($this->position, $this, false); + $event = new FarmlandHydrationChangeEvent($this, $this->wetness, self::MAX_WETNESS); + $event->call(); + if(!$event->isCancelled()){ + $this->wetness = $event->getNewHydration(); + $world->setBlock($this->position, $this, false); + } } } diff --git a/src/event/block/FarmlandHydrationChangeEvent.php b/src/event/block/FarmlandHydrationChangeEvent.php new file mode 100644 index 0000000000..4df5c1a4ef --- /dev/null +++ b/src/event/block/FarmlandHydrationChangeEvent.php @@ -0,0 +1,59 @@ +oldHydration; + } + + public function getNewHydration() : int{ + return $this->newHydration; + } + + public function setNewHydration(int $hydration) : void{ + if($hydration < 0 || $hydration > Farmland::MAX_WETNESS){ + throw new \InvalidArgumentException("Hydration must be in range 0 ... " . Farmland::MAX_WETNESS); + } + $this->newHydration = $hydration; + } +} From b4c5f5d58dcbd28d76d9a89b4d0e1346cd97e2d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 13:28:05 +0100 Subject: [PATCH 1289/1858] PluginBase: fixed resource leak all this time we've been harping at plugin devs to fix their own leaks, and here's one right under our noses that no one spotted for 10 years ... this leak is rather common, since it will occur whenever a plugin attempts to save a resource which already exists in the data folder. This bug was introduced in 2014 by commit 63288346814b7b827f1f7cc7a16419af43bd0bfa. --- src/plugin/PluginBase.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index c8f3e1c399..23a98b943d 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -226,19 +226,19 @@ abstract class PluginBase implements Plugin, CommandExecutor{ return false; } + $out = Path::join($this->dataFolder, $filename); + if(file_exists($out) && !$replace){ + return false; + } + if(($resource = $this->getResource($filename)) === null){ return false; } - $out = Path::join($this->dataFolder, $filename); if(!file_exists(dirname($out))){ mkdir(dirname($out), 0755, true); } - if(file_exists($out) && !$replace){ - return false; - } - $fp = fopen($out, "wb"); if($fp === false) throw new AssumptionFailedError("fopen() should not fail with wb flags"); From 2711ab4f00fa14700b9edad325e677ea1cad2bbc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 13:49:19 +0100 Subject: [PATCH 1290/1858] Update composer dependencies --- composer.lock | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/composer.lock b/composer.lock index 4c90391e47..6315dfefa4 100644 --- a/composer.lock +++ b/composer.lock @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.2+bedrock-1.20.10", + "version": "23.0.3+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd" + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", - "reference": "69a309a2dd7dcf3ec8c316385b866397e8c2cbfd", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e4157c7af3f91e1b08fe21be171eb73dad7029e9", + "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9", "shasum": "" }, "require": { @@ -294,8 +294,8 @@ "php": "^8.0", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", - "pocketmine/math": "^0.3.0 || ^0.4.0", - "pocketmine/nbt": "^0.3.0", + "pocketmine/math": "^0.3.0 || ^0.4.0 || ^1.0.0", + "pocketmine/nbt": "^0.3.0 || ^1.0.0", "ramsey/uuid": "^4.1" }, "require-dev": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.2+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.3+bedrock-1.20.10" }, - "time": "2023-07-24T15:35:36+00:00" + "time": "2023-08-03T15:30:52+00:00" }, { "name": "pocketmine/binaryutils", @@ -538,16 +538,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.19.5", + "version": "2.19.6", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d" + "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", - "reference": "71af5f9bd23b4e4bad8920dac7f4fe08e5205f7d", + "url": "https://api.github.com/repos/pmmp/Language/zipball/93e473e20e7f4515ecf45c5ef0f9155b9247a86e", + "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e", "shasum": "" }, "type": "library", @@ -555,9 +555,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.19.5" + "source": "https://github.com/pmmp/Language/tree/2.19.6" }, - "time": "2023-03-19T16:45:15+00:00" + "time": "2023-08-08T16:53:23+00:00" }, { "name": "pocketmine/log", @@ -1901,16 +1901,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.2", + "version": "10.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e" + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/db1497ec8dd382e82c962f7abbe0320e4882ee4e", - "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", "shasum": "" }, "require": { @@ -1967,7 +1967,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" }, "funding": [ { @@ -1975,7 +1975,7 @@ "type": "github" } ], - "time": "2023-05-22T09:04:27+00:00" + "time": "2023-07-26T13:45:28+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2221,16 +2221,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.6", + "version": "10.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804", + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804", "shasum": "" }, "require": { @@ -2255,7 +2255,7 @@ "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -2270,7 +2270,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.2-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -2302,7 +2302,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1" }, "funding": [ { @@ -2318,7 +2318,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T12:08:28+00:00" + "time": "2023-08-04T06:48:08+00:00" }, { "name": "sebastian/cli-parser", From f7279b66723dcc90caa54a2c48bbe5bbda674ff6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 13:56:19 +0100 Subject: [PATCH 1291/1858] Release 4.23.5 --- changelogs/4.23.md | 11 +++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index 031eaa1cc4..750261e4b0 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -49,3 +49,14 @@ Released 1st August 2023. ## Fixes - Fixed exponentially increasing lag when many hundreds of non-mergeable dropped items occupied the same space. This disproportionately affected SkyBlock servers due to large cactus farms using water to collect items together. + +# 4.23.5 +Released 9th August 2023. + +## General +- Updated translation data to [pmmp/Language 2.19.6](https://github.com/pmmp/Language/releases/tag/2.19.6). + +## Fixes +- Fixed `PluginBase->saveResource()` leaking file resources when the data file already exists in the plugin's data folder. This bug existed since 2014 and was only discovered recently. +- Fixed coral blocks becoming dead after calling `getDropsForCompatibleTool()` on them. +- Fixed `BlockDeathEvent->getOldState()` returning a block which is already dead. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 3109b3b1b4..1afe9bfa70 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.5"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From aa3f4f254564919f27ba460eeb6761e862eea435 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 13:56:19 +0100 Subject: [PATCH 1292/1858] 4.23.6 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1afe9bfa70..efcfdaaf1c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.5"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.6"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 2d5c9e64ce6790bf323b1f2d607a25ce6fc35020 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 14:04:57 +0100 Subject: [PATCH 1293/1858] Release 5.4.2 --- changelogs/5.4.md | 10 ++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/changelogs/5.4.md b/changelogs/5.4.md index 8e77f7eb04..a830337f3c 100644 --- a/changelogs/5.4.md +++ b/changelogs/5.4.md @@ -97,3 +97,13 @@ Released 8th August 2023. ## Internals - Foreach by-reference is now disallowed via a custom PHPStan rule. + +# 5.4.2 +Released 9th August 2023. + +## Included releases +- [4.23.5](https://github.com/pmmp/PocketMine-MP/releases/tag/4.23.5) - Minor bug fixes + +## Fixes +- Fixed cake accepting candle placement when slices have already been eaten. +- Fixed fire charges not lighting candles. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 29d744d5d5..64bf5b3085 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.4.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From e27121a43796e02a67dfa0b4b271fc5e6e58dfeb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 14:04:57 +0100 Subject: [PATCH 1294/1858] 5.4.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 64bf5b3085..bec9638ea1 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.4.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From b86b389fc5461959ece8135b4cc90ffdcbc5bd31 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 15:33:02 +0100 Subject: [PATCH 1295/1858] changelog: fix link [ci skip] this is not technically wrong, but it's inconsistent with other changelogs --- changelogs/5.4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/5.4.md b/changelogs/5.4.md index a830337f3c..bdaec51cb2 100644 --- a/changelogs/5.4.md +++ b/changelogs/5.4.md @@ -102,7 +102,7 @@ Released 8th August 2023. Released 9th August 2023. ## Included releases -- [4.23.5](https://github.com/pmmp/PocketMine-MP/releases/tag/4.23.5) - Minor bug fixes +- [4.23.5](https://github.com/pmmp/PocketMine-MP/blob/4.23.5/changelogs/4.23.md#4235) - Minor bug fixes ## Fixes - Fixed cake accepting candle placement when slices have already been eaten. From 447f061566c733272cf3653f29215e066678f18f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 15:45:15 +0100 Subject: [PATCH 1296/1858] Use Event::hasHandlers() for a few more hot events --- src/block/Fire.php | 10 +++++++--- src/block/Leaves.php | 11 ++++++++--- src/world/World.php | 15 +++++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/block/Fire.php b/src/block/Fire.php index a39ef6b9cc..11378b82b0 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -145,9 +145,13 @@ class Fire extends BaseFire{ private function burnBlock(Block $block, int $chanceBound) : void{ if(mt_rand(0, $chanceBound) < $block->getFlammability()){ - $ev = new BlockBurnEvent($block, $this); - $ev->call(); - if(!$ev->isCancelled()){ + $cancelled = false; + if(BlockBurnEvent::hasHandlers()){ + $ev = new BlockBurnEvent($block, $this); + $ev->call(); + $cancelled = $ev->isCancelled(); + } + if(!$cancelled){ $block->onIncinerate(); $world = $this->position->getWorld(); diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 2351904544..b1839dca6b 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -116,10 +116,15 @@ class Leaves extends Transparent{ public function onRandomTick() : void{ if(!$this->noDecay && $this->checkDecay){ - $ev = new LeavesDecayEvent($this); - $ev->call(); + $cancelled = false; + if(LeavesDecayEvent::hasHandlers()){ + $ev = new LeavesDecayEvent($this); + $ev->call(); + $cancelled = $ev->isCancelled(); + } + $world = $this->position->getWorld(); - if($ev->isCancelled() || $this->findLog($this->position)){ + if($cancelled || $this->findLog($this->position)){ $this->checkDecay = false; $world->setBlock($this->position, $this, false); }else{ diff --git a/src/world/World.php b/src/world/World.php index 934ff6690e..3ff5632cb8 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -972,14 +972,17 @@ class World implements ChunkManager{ $block = $replacement; } - $ev = new BlockUpdateEvent($block); - $ev->call(); - if(!$ev->isCancelled()){ - foreach($this->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z)) as $entity){ - $entity->onNearbyBlockChange(); + if(BlockUpdateEvent::hasHandlers()){ + $ev = new BlockUpdateEvent($block); + $ev->call(); + if($ev->isCancelled()){ + continue; } - $block->onNearbyBlockChange(); } + foreach($this->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z)) as $entity){ + $entity->onNearbyBlockChange(); + } + $block->onNearbyBlockChange(); } $this->timings->scheduledBlockUpdates->stopTiming(); From 97700636c6692f65afd2f4f91e3bede7fe7ed45b Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 9 Aug 2023 16:09:16 +0100 Subject: [PATCH 1297/1858] PluginBase: added getResourceFolder() and getResourcePath(), deprecate getResource() (#5961) This is a step towards #5958. While it's not actually necessary to add these functions (since people could just use getFile() . "/resources/whatever.yml" instead), this helps preserve the convention of using the `resources` folder, which might be helpful for external tools. As an example: stream_get_contents($this->getResource("lang/eng.ini")); (which is actually incorrect, since it leaks a resource) can now be replaced by file_get_contents($this->getResourcePath("lang/eng.ini")); quite trivially. getResourceFolder() can be used with scandir() to enumerate resources instead of using getResources(), although getResources() still provides utility in the relativized resource paths. --- src/plugin/PluginBase.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index c8f3e1c399..e4270de009 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -50,6 +50,8 @@ use const DIRECTORY_SEPARATOR; abstract class PluginBase implements Plugin, CommandExecutor{ private bool $isEnabled = false; + private string $resourceFolder; + private ?Config $config = null; private string $configFile; @@ -67,6 +69,8 @@ abstract class PluginBase implements Plugin, CommandExecutor{ $this->dataFolder = rtrim($dataFolder, "/" . DIRECTORY_SEPARATOR) . "/"; //TODO: this is accessed externally via reflection, not unused $this->file = rtrim($file, "/" . DIRECTORY_SEPARATOR) . "/"; + $this->resourceFolder = Path::join($this->file, "resources") . "/"; + $this->configFile = Path::join($this->dataFolder, "config.yml"); $prefix = $this->getDescription()->getPrefix(); @@ -209,6 +213,27 @@ abstract class PluginBase implements Plugin, CommandExecutor{ } /** + * Returns the path to the folder where the plugin's embedded resource files are usually located. + * Note: This is NOT the same as the data folder. The files in this folder should be considered read-only. + */ + public function getResourceFolder() : string{ + return $this->resourceFolder; + } + + /** + * Returns the full path to a data file in the plugin's resources folder. + * This path can be used with standard PHP functions like fopen() or file_get_contents(). + * + * Note: Any path returned by this function should be considered READ-ONLY. + */ + public function getResourcePath(string $filename) : string{ + return Path::join($this->getResourceFolder(), $filename); + } + + /** + * @deprecated Prefer using standard PHP functions with {@link PluginBase::getResourcePath()}, like + * file_get_contents() or fopen(). + * * Gets an embedded resource on the plugin file. * WARNING: You must close the resource given using fclose() * From 37f2dafae1701bc840f5a57185a6b38f0cf8b72c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 9 Aug 2023 16:16:11 +0100 Subject: [PATCH 1298/1858] PluginBase: make saveResource() use copy() instead of overengineered streams garbage --- src/plugin/PluginBase.php | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index 6ef4748cf9..1b537a11c9 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -30,19 +30,16 @@ use pocketmine\command\PluginCommand; use pocketmine\lang\KnownTranslationFactory; use pocketmine\scheduler\TaskScheduler; use pocketmine\Server; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Config; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; +use function copy; use function count; use function dirname; -use function fclose; use function file_exists; -use function fopen; use function mkdir; use function rtrim; use function str_contains; -use function stream_copy_to_stream; use function strtolower; use function trim; use const DIRECTORY_SEPARATOR; @@ -251,26 +248,21 @@ abstract class PluginBase implements Plugin, CommandExecutor{ return false; } - $out = Path::join($this->dataFolder, $filename); - if(file_exists($out) && !$replace){ + $source = Path::join($this->resourceFolder, $filename); + if(!file_exists($source)){ return false; } - if(($resource = $this->getResource($filename)) === null){ + $destination = Path::join($this->dataFolder, $filename); + if(file_exists($destination) && !$replace){ return false; } - if(!file_exists(dirname($out))){ - mkdir(dirname($out), 0755, true); + if(!file_exists(dirname($destination))){ + mkdir(dirname($destination), 0755, true); } - $fp = fopen($out, "wb"); - if($fp === false) throw new AssumptionFailedError("fopen() should not fail with wb flags"); - - $ret = stream_copy_to_stream($resource, $fp) > 0; - fclose($fp); - fclose($resource); - return $ret; + return copy($source, $destination); } /** From f03e708f64ce8cc2d2dc7f379b127d4d990c6a5f Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Thu, 10 Aug 2023 10:42:58 +0200 Subject: [PATCH 1299/1858] Fix chorus not working if the destination would be below y=0 (#5979) --- src/item/ChorusFruit.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/item/ChorusFruit.php b/src/item/ChorusFruit.php index 80f99d5d81..c12724d7ca 100644 --- a/src/item/ChorusFruit.php +++ b/src/item/ChorusFruit.php @@ -56,15 +56,17 @@ class ChorusFruit extends Food{ $maxY = $minY + 16; $maxZ = $minZ + 16; + $worldMinY = $world->getMinY(); + for($attempts = 0; $attempts < 16; ++$attempts){ $x = mt_rand($minX, $maxX); $y = mt_rand($minY, $maxY); $z = mt_rand($minZ, $maxZ); - while($y >= 0 && !$world->getBlockAt($x, $y, $z)->isSolid()){ + while($y >= $worldMinY && !$world->getBlockAt($x, $y, $z)->isSolid()){ $y--; } - if($y < 0){ + if($y < $worldMinY){ continue; } From e48b5b2ec0891b0c360d562c54bebd14fa55c86c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Aug 2023 13:07:03 +0100 Subject: [PATCH 1300/1858] GeneratorManager: allow aliasing existing generators --- src/world/generator/GeneratorManager.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/world/generator/GeneratorManager.php b/src/world/generator/GeneratorManager.php index 180450b72a..291ea91de0 100644 --- a/src/world/generator/GeneratorManager.php +++ b/src/world/generator/GeneratorManager.php @@ -52,9 +52,9 @@ final class GeneratorManager{ } }); $this->addGenerator(Normal::class, "normal", fn() => null); - $this->addGenerator(Normal::class, "default", fn() => null); - $this->addGenerator(Nether::class, "hell", fn() => null); + $this->addAlias("normal", "default"); $this->addGenerator(Nether::class, "nether", fn() => null); + $this->addAlias("nether", "hell"); } /** @@ -80,6 +80,22 @@ final class GeneratorManager{ $this->list[$name] = new GeneratorManagerEntry($class, $presetValidator); } + /** + * Aliases an already-registered generator name to another name. Useful if you want to map a generator name to an + * existing generator without having to replicate the parameters. + */ + public function addAlias(string $name, string $alias) : void{ + $name = strtolower($name); + $alias = strtolower($alias); + if(!isset($this->list[$name])){ + throw new \InvalidArgumentException("Alias \"$name\" is not assigned"); + } + if(isset($this->list[$alias])){ + throw new \InvalidArgumentException("Alias \"$alias\" is already assigned"); + } + $this->list[$alias] = $this->list[$name]; + } + /** * Returns a list of names for registered generators. * From 91d5a3ddfebbfb6824f5cb3faf3e55c6983a90cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 10 Aug 2023 16:06:25 +0100 Subject: [PATCH 1301/1858] PotionCauldron: fixed setPotionItem() not validating the given item we should probably remove this API and have enums for potion container and type tbh... this API was a mistake --- src/block/PotionCauldron.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/block/PotionCauldron.php b/src/block/PotionCauldron.php index b8259fbc35..ca91664e4e 100644 --- a/src/block/PotionCauldron.php +++ b/src/block/PotionCauldron.php @@ -63,6 +63,14 @@ final class PotionCauldron extends FillableCauldron{ /** @return $this */ public function setPotionItem(?Item $potionItem) : self{ + if($potionItem !== null && !match($potionItem->getTypeId()){ + ItemTypeIds::POTION, + ItemTypeIds::SPLASH_POTION, + ItemTypeIds::LINGERING_POTION => true, + default => false, + }){ + throw new \InvalidArgumentException("Item must be a POTION, SPLASH_POTION or LINGERING_POTION"); + } $this->potionItem = $potionItem !== null ? (clone $potionItem)->setCount(1) : null; return $this; } From af9ae445fc26a3ab66f92a7aa927a534392c7cbe Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Thu, 10 Aug 2023 19:42:32 +0300 Subject: [PATCH 1302/1858] Fix cake drops (#5985) closes #5984 --- src/block/Cake.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/Cake.php b/src/block/Cake.php index 81dc7e6e90..5d4e3cfcae 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -83,6 +83,10 @@ class Cake extends BaseCake{ return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); } + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } + public function getResidue() : Block{ $clone = clone $this; $clone->bites++; From 983aa79a0b0d1f64fcc66db5d8d88f651f1e3a83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:30:51 +0100 Subject: [PATCH 1303/1858] Bump build/php from `ed0bc4d` to `a053f65` (#5993) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `ed0bc4d` to `a053f65`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/ed0bc4d2afafd00f9ee92823c6b1bd66789ce4f2...a053f65e1897e432478229071383fe1ba16032c3) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index ed0bc4d2af..a053f65e18 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit ed0bc4d2afafd00f9ee92823c6b1bd66789ce4f2 +Subproject commit a053f65e1897e432478229071383fe1ba16032c3 From 4c25d38b44596f4ded444bb7c7aac9e098aff8fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 12:05:23 +0100 Subject: [PATCH 1304/1858] Bump phpunit/phpunit from 10.3.1 to 10.3.2 (#5995) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.3.1 to 10.3.2. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.3.2/ChangeLog-10.3.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.3.1...10.3.2) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/composer.lock b/composer.lock index c96739b253..c864786f33 100644 --- a/composer.lock +++ b/composer.lock @@ -1211,16 +1211,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.16.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -1261,9 +1261,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -1861,16 +1861,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.1", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804" + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804", - "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", "shasum": "" }, "require": { @@ -1942,7 +1942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" }, "funding": [ { @@ -1958,7 +1958,7 @@ "type": "tidelift" } ], - "time": "2023-08-04T06:48:08+00:00" + "time": "2023-08-15T05:34:23+00:00" }, { "name": "sebastian/cli-parser", @@ -2129,16 +2129,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { @@ -2149,7 +2149,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { @@ -2193,7 +2193,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -2201,7 +2202,7 @@ "type": "github" } ], - "time": "2023-02-03T07:07:16+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", From 39867b97c5026cc8d09724eec51f85216c98763b Mon Sep 17 00:00:00 2001 From: S3v3Nice <49648416+S3v3Nice@users.noreply.github.com> Date: Tue, 15 Aug 2023 19:28:26 +0300 Subject: [PATCH 1305/1858] Implement enchanting using enchanting tables (#5953) Co-authored-by: Dylan K. Taylor --- src/block/Block.php | 16 ++ src/block/BlockTypeInfo.php | 17 +- src/block/VanillaBlocks.php | 5 +- src/block/inventory/EnchantInventory.php | 45 ++++ .../ItemSerializerDeserializerRegistrar.php | 1 + src/entity/Human.php | 16 +- .../PlayerEnchantOptionsRequestEvent.php | 75 ++++++ src/event/player/PlayerItemEnchantEvent.php | 85 ++++++ .../transaction/EnchantTransaction.php | 132 ++++++++++ src/item/Armor.php | 15 +- src/item/ArmorMaterial.php | 42 +++ src/item/ArmorTypeInfo.php | 13 +- src/item/EnchantedBook.php | 30 +++ src/item/Item.php | 28 +- src/item/ItemBlock.php | 2 +- src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 1 + src/item/TieredTool.php | 11 +- src/item/ToolTier.php | 25 +- src/item/VanillaArmorMaterials.php | 73 ++++++ src/item/VanillaItems.php | 129 ++++----- .../AvailableEnchantmentRegistry.php | 211 +++++++++++++++ src/item/enchantment/EnchantOption.php | 66 +++++ src/item/enchantment/Enchantment.php | 66 ++++- src/item/enchantment/EnchantmentHelper.php | 217 +++++++++++++++ .../IncompatibleEnchantmentGroups.php | 34 +++ .../IncompatibleEnchantmentRegistry.php | 94 +++++++ .../ItemEnchantmentTagRegistry.php | 190 ++++++++++++++ src/item/enchantment/ItemEnchantmentTags.php | 57 ++++ src/item/enchantment/ItemFlags.php | 3 +- .../enchantment/ProtectionEnchantment.php | 9 +- src/item/enchantment/VanillaEnchantments.php | 247 +++++++++++++++--- src/network/mcpe/InventoryManager.php | 47 ++++ .../mcpe/handler/ItemStackRequestExecutor.php | 15 +- 34 files changed, 1892 insertions(+), 128 deletions(-) create mode 100644 src/event/player/PlayerEnchantOptionsRequestEvent.php create mode 100644 src/event/player/PlayerItemEnchantEvent.php create mode 100644 src/inventory/transaction/EnchantTransaction.php create mode 100644 src/item/ArmorMaterial.php create mode 100644 src/item/EnchantedBook.php create mode 100644 src/item/VanillaArmorMaterials.php create mode 100644 src/item/enchantment/AvailableEnchantmentRegistry.php create mode 100644 src/item/enchantment/EnchantOption.php create mode 100644 src/item/enchantment/EnchantmentHelper.php create mode 100644 src/item/enchantment/IncompatibleEnchantmentGroups.php create mode 100644 src/item/enchantment/IncompatibleEnchantmentRegistry.php create mode 100644 src/item/enchantment/ItemEnchantmentTagRegistry.php create mode 100644 src/item/enchantment/ItemEnchantmentTags.php diff --git a/src/block/Block.php b/src/block/Block.php index 0e045792f9..9f61982ff7 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -36,6 +36,9 @@ use pocketmine\data\runtime\RuntimeDataSizeCalculator; use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\projectile\Projectile; +use pocketmine\item\enchantment\AvailableEnchantmentRegistry; +use pocketmine\item\enchantment\ItemEnchantmentTagRegistry; +use pocketmine\item\enchantment\ItemEnchantmentTags; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\ItemBlock; @@ -422,6 +425,19 @@ class Block{ return $this->typeInfo->getBreakInfo(); } + /** + * Returns tags that represent the type of item being enchanted and are used to determine + * what enchantments can be applied to the item of this block during in-game enchanting (enchanting table, anvil, fishing, etc.). + * @see ItemEnchantmentTags + * @see ItemEnchantmentTagRegistry + * @see AvailableEnchantmentRegistry + * + * @return string[] + */ + public function getEnchantmentTags() : array{ + return $this->typeInfo->getEnchantmentTags(); + } + /** * Do the actions needed so the block is broken with the Item * diff --git a/src/block/BlockTypeInfo.php b/src/block/BlockTypeInfo.php index eb6b89ad1a..a1424ef3cf 100644 --- a/src/block/BlockTypeInfo.php +++ b/src/block/BlockTypeInfo.php @@ -35,10 +35,12 @@ final class BlockTypeInfo{ /** * @param string[] $typeTags + * @param string[] $enchantmentTags */ public function __construct( private BlockBreakInfo $breakInfo, - array $typeTags = [] + array $typeTags = [], + private array $enchantmentTags = [] ){ $this->typeTags = array_fill_keys($typeTags, true); } @@ -49,4 +51,17 @@ final class BlockTypeInfo{ public function getTypeTags() : array{ return array_keys($this->typeTags); } public function hasTypeTag(string $tag) : bool{ return isset($this->typeTags[$tag]); } + + /** + * Returns tags that represent the type of item being enchanted and are used to determine + * what enchantments can be applied to the item of this block during in-game enchanting (enchanting table, anvil, fishing, etc.). + * @see ItemEnchantmentTags + * @see ItemEnchantmentTagRegistry + * @see AvailableEnchantmentRegistry + * + * @return string[] + */ + public function getEnchantmentTags() : array{ + return $this->enchantmentTags; + } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index d733b06c2b..cb612031f4 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -59,6 +59,7 @@ use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; use pocketmine\crafting\FurnaceType; use pocketmine\entity\projectile\Projectile; +use pocketmine\item\enchantment\ItemEnchantmentTags as EnchantmentTags; use pocketmine\item\Item; use pocketmine\item\ToolTier; use pocketmine\math\Facing; @@ -966,7 +967,7 @@ final class VanillaBlocks{ $pumpkinBreakInfo = new Info(BreakInfo::axe(1.0)); self::register("pumpkin", new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); - self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", $pumpkinBreakInfo)); + self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", new Info(BreakInfo::axe(1.0), enchantmentTags: [EnchantmentTags::MASK]))); self::register("lit_pumpkin", new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", new Info(BreakInfo::instant()))); @@ -1002,7 +1003,7 @@ final class VanillaBlocks{ self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new Info(new BreakInfo(0.3)))); self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); - self::register("mob_head", new MobHead(new BID(Ids::MOB_HEAD, TileMobHead::class), "Mob Head", new Info(new BreakInfo(1.0)))); + self::register("mob_head", new MobHead(new BID(Ids::MOB_HEAD, TileMobHead::class), "Mob Head", new Info(new BreakInfo(1.0), enchantmentTags: [EnchantmentTags::MASK]))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", new Info(BreakInfo::instant()))); self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD())))); self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD())))); diff --git a/src/block/inventory/EnchantInventory.php b/src/block/inventory/EnchantInventory.php index 2c682d134b..5d7e452595 100644 --- a/src/block/inventory/EnchantInventory.php +++ b/src/block/inventory/EnchantInventory.php @@ -23,9 +23,15 @@ declare(strict_types=1); namespace pocketmine\block\inventory; +use pocketmine\event\player\PlayerEnchantOptionsRequestEvent; use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\TemporaryInventory; +use pocketmine\item\enchantment\EnchantmentHelper as Helper; +use pocketmine\item\enchantment\EnchantOption; +use pocketmine\item\Item; use pocketmine\world\Position; +use function array_values; +use function count; class EnchantInventory extends SimpleInventory implements BlockInventory, TemporaryInventory{ use BlockInventoryTrait; @@ -33,8 +39,47 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor public const SLOT_INPUT = 0; public const SLOT_LAPIS = 1; + /** @var EnchantOption[] $options */ + private array $options = []; + public function __construct(Position $holder){ $this->holder = $holder; parent::__construct(2); } + + protected function onSlotChange(int $index, Item $before) : void{ + if($index === self::SLOT_INPUT){ + foreach($this->viewers as $viewer){ + $this->options = []; + $item = $this->getInput(); + $options = Helper::getEnchantOptions($this->holder, $item, $viewer->getEnchantmentSeed()); + + $event = new PlayerEnchantOptionsRequestEvent($viewer, $this, $options); + $event->call(); + if(!$event->isCancelled() && count($event->getOptions()) > 0){ + $this->options = array_values($event->getOptions()); + $viewer->getNetworkSession()->getInvManager()?->syncEnchantingTableOptions($this->options); + } + } + } + + parent::onSlotChange($index, $before); + } + + public function getInput() : Item{ + return $this->getItem(self::SLOT_INPUT); + } + + public function getLapis() : Item{ + return $this->getItem(self::SLOT_LAPIS); + } + + public function getOutput(int $optionId) : ?Item{ + $option = $this->getOption($optionId); + return $option === null ? null : Helper::enchantItem($this->getInput(), $option->getEnchantments()); + } + + public function getOption(int $optionId) : ?EnchantOption{ + return $this->options[$optionId] ?? null; + } } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 6f557ddb13..ccf430b9cc 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -223,6 +223,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::ECHO_SHARD, Items::ECHO_SHARD()); $this->map1to1Item(Ids::EGG, Items::EGG()); $this->map1to1Item(Ids::EMERALD, Items::EMERALD()); + $this->map1to1Item(Ids::ENCHANTED_BOOK, Items::ENCHANTED_BOOK()); $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE()); $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL()); $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE()); diff --git a/src/entity/Human.php b/src/entity/Human.php index ae1aa24649..30142b91dc 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -76,7 +76,7 @@ use function array_key_exists; use function array_merge; use function array_values; use function min; -use function random_int; +use function mt_rand; class Human extends Living implements ProjectileSource, InventoryHolder{ @@ -211,6 +211,18 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ return $this->xpManager; } + public function getEnchantmentSeed() : int{ + return $this->xpSeed; + } + + public function setEnchantmentSeed(int $seed) : void{ + $this->xpSeed = $seed; + } + + public function generateEnchantmentSeed() : int{ + return mt_rand(Limits::INT32_MIN, Limits::INT32_MAX); + } + public function getXpDropAmount() : int{ //this causes some XP to be lost on death when above level 1 (by design), dropping at most enough points for //about 7.5 levels of XP. @@ -334,7 +346,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ if(($xpSeedTag = $nbt->getTag(self::TAG_XP_SEED)) instanceof IntTag){ $this->xpSeed = $xpSeedTag->getValue(); }else{ - $this->xpSeed = random_int(Limits::INT32_MIN, Limits::INT32_MAX); + $this->xpSeed = $this->generateEnchantmentSeed(); } } diff --git a/src/event/player/PlayerEnchantOptionsRequestEvent.php b/src/event/player/PlayerEnchantOptionsRequestEvent.php new file mode 100644 index 0000000000..d0448bfd8e --- /dev/null +++ b/src/event/player/PlayerEnchantOptionsRequestEvent.php @@ -0,0 +1,75 @@ +player = $player; + } + + public function getEnchantInventory() : EnchantInventory{ + return $this->enchantInventory; + } + + /** + * @return EnchantOption[] + */ + public function getOptions() : array{ + return $this->options; + } + + /** + * @param EnchantOption[] $options + */ + public function setOptions(array $options) : void{ + Utils::validateArrayValueType($options, function(EnchantOption $_) : void{ }); + if(($optionCount = count($options)) > 3){ + throw new \LogicException("The maximum number of options for an enchanting table is 3, but $optionCount have been passed"); + } + + $this->options = $options; + } +} diff --git a/src/event/player/PlayerItemEnchantEvent.php b/src/event/player/PlayerItemEnchantEvent.php new file mode 100644 index 0000000000..9974ab40a2 --- /dev/null +++ b/src/event/player/PlayerItemEnchantEvent.php @@ -0,0 +1,85 @@ +player = $player; + } + + /** + * Returns the inventory transaction involved in this enchant event. + */ + public function getTransaction() : EnchantTransaction{ + return $this->transaction; + } + + /** + * Returns the enchantment option used. + */ + public function getOption() : EnchantOption{ + return $this->option; + } + + /** + * Returns the item to be enchanted. + */ + public function getInputItem() : Item{ + return clone $this->inputItem; + } + + /** + * Returns the enchanted item. + */ + public function getOutputItem() : Item{ + return clone $this->outputItem; + } + + /** + * Returns the number of XP levels and lapis that will be subtracted after enchanting + * if the player is not in creative mode. + */ + public function getCost() : int{ + return $this->cost; + } +} diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantTransaction.php new file mode 100644 index 0000000000..f3760e479a --- /dev/null +++ b/src/inventory/transaction/EnchantTransaction.php @@ -0,0 +1,132 @@ +inputItem === null || $this->outputItem === null){ + throw new AssumptionFailedError("Expected that inputItem and outputItem are not null before validating output"); + } + + $enchantedInput = EnchantmentHelper::enchantItem($this->inputItem, $this->option->getEnchantments()); + if(!$this->outputItem->equalsExact($enchantedInput)){ + throw new TransactionValidationException("Invalid output item"); + } + } + + private function validateFiniteResources(int $lapisSpent) : void{ + if($lapisSpent !== $this->cost){ + throw new TransactionValidationException("Expected the amount of lapis lazuli spent to be $this->cost, but received $lapisSpent"); + } + + $xpLevel = $this->source->getXpManager()->getXpLevel(); + $requiredXpLevel = $this->option->getRequiredXpLevel(); + + if($xpLevel < $requiredXpLevel){ + throw new TransactionValidationException("Player's XP level $xpLevel is less than the required XP level $requiredXpLevel"); + } + if($xpLevel < $this->cost){ + throw new TransactionValidationException("Player's XP level $xpLevel is less than the XP level cost $this->cost"); + } + } + + public function validate() : void{ + if(count($this->actions) < 1){ + throw new TransactionValidationException("Transaction must have at least one action to be executable"); + } + + /** @var Item[] $inputs */ + $inputs = []; + /** @var Item[] $outputs */ + $outputs = []; + $this->matchItems($outputs, $inputs); + + $lapisSpent = 0; + foreach($inputs as $input){ + if($input->getTypeId() === ItemTypeIds::LAPIS_LAZULI){ + $lapisSpent = $input->getCount(); + }else{ + if($this->inputItem !== null){ + throw new TransactionValidationException("Received more than 1 items to enchant"); + } + $this->inputItem = $input; + } + } + + if($this->inputItem === null){ + throw new TransactionValidationException("No item to enchant received"); + } + + if(($outputCount = count($outputs)) !== 1){ + throw new TransactionValidationException("Expected 1 output item, but received $outputCount"); + } + $this->outputItem = $outputs[0]; + + $this->validateOutput(); + + if($this->source->hasFiniteResources()){ + $this->validateFiniteResources($lapisSpent); + } + } + + public function execute() : void{ + parent::execute(); + + if($this->source->hasFiniteResources()){ + $this->source->getXpManager()->subtractXpLevels($this->cost); + } + $this->source->setEnchantmentSeed($this->source->generateEnchantmentSeed()); + } + + protected function callExecuteEvent() : bool{ + if($this->inputItem === null || $this->outputItem === null){ + throw new AssumptionFailedError("Expected that inputItem and outputItem are not null before executing the event"); + } + + $event = new PlayerItemEnchantEvent($this->source, $this, $this->option, $this->inputItem, $this->outputItem, $this->cost); + $event->call(); + return !$event->isCancelled(); + } +} diff --git a/src/item/Armor.php b/src/item/Armor.php index 6fb538cd60..e52732caf6 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -44,8 +44,11 @@ class Armor extends Durable{ protected ?Color $customColor = null; - public function __construct(ItemIdentifier $identifier, string $name, ArmorTypeInfo $info){ - parent::__construct($identifier, $name); + /** + * @param string[] $enchantmentTags + */ + public function __construct(ItemIdentifier $identifier, string $name, ArmorTypeInfo $info, array $enchantmentTags = []){ + parent::__construct($identifier, $name, $enchantmentTags); $this->armorInfo = $info; } @@ -72,6 +75,14 @@ class Armor extends Durable{ return $this->armorInfo->isFireProof(); } + public function getMaterial() : ArmorMaterial{ + return $this->armorInfo->getMaterial(); + } + + public function getEnchantability() : int{ + return $this->armorInfo->getMaterial()->getEnchantability(); + } + /** * Returns the dyed colour of this armour piece. This generally only applies to leather armour. */ diff --git a/src/item/ArmorMaterial.php b/src/item/ArmorMaterial.php new file mode 100644 index 0000000000..c7915bacce --- /dev/null +++ b/src/item/ArmorMaterial.php @@ -0,0 +1,42 @@ +enchantability; + } +} diff --git a/src/item/ArmorTypeInfo.php b/src/item/ArmorTypeInfo.php index 580b73df33..dbb4ed06df 100644 --- a/src/item/ArmorTypeInfo.php +++ b/src/item/ArmorTypeInfo.php @@ -24,13 +24,18 @@ declare(strict_types=1); namespace pocketmine\item; class ArmorTypeInfo{ + private ArmorMaterial $material; + public function __construct( private int $defensePoints, private int $maxDurability, private int $armorSlot, private int $toughness = 0, - private bool $fireProof = false - ){} + private bool $fireProof = false, + ?ArmorMaterial $material = null + ){ + $this->material = $material ?? VanillaArmorMaterials::LEATHER(); + } public function getDefensePoints() : int{ return $this->defensePoints; @@ -51,4 +56,8 @@ class ArmorTypeInfo{ public function isFireProof() : bool{ return $this->fireProof; } + + public function getMaterial() : ArmorMaterial{ + return $this->material; + } } diff --git a/src/item/EnchantedBook.php b/src/item/EnchantedBook.php new file mode 100644 index 0000000000..5660de6f60 --- /dev/null +++ b/src/item/EnchantedBook.php @@ -0,0 +1,30 @@ +nbt = new CompoundTag(); } @@ -455,6 +458,29 @@ class Item implements \JsonSerializable{ return $this->name; } + /** + * Returns tags that represent the type of item being enchanted and are used to determine + * what enchantments can be applied to this item during in-game enchanting (enchanting table, anvil, fishing, etc.). + * @see ItemEnchantmentTags + * @see ItemEnchantmentTagRegistry + * @see AvailableEnchantmentRegistry + * + * @return string[] + */ + public function getEnchantmentTags() : array{ + return $this->enchantmentTags; + } + + /** + * Returns the value that defines how enchantable the item is. + * + * The higher an item's enchantability is, the more likely it will be to gain high-level enchantments + * or multiple enchantments upon being enchanted in an enchanting table. + */ + public function getEnchantability() : int{ + return 1; + } + final public function canBePlaced() : bool{ return $this->getBlock()->canBePlaced(); } diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index fbbe2efeb4..11bcb58d37 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -36,7 +36,7 @@ final class ItemBlock extends Item{ public function __construct( private Block $block ){ - parent::__construct(ItemIdentifier::fromBlock($block), $block->getName()); + parent::__construct(ItemIdentifier::fromBlock($block), $block->getName(), $block->getEnchantmentTags()); } protected function describeState(RuntimeDataDescriber $w) : void{ diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index f37426c56a..8233397666 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -303,8 +303,9 @@ final class ItemTypeIds{ public const MANGROVE_BOAT = 20264; public const GLOW_BERRIES = 20265; public const CHERRY_SIGN = 20266; + public const ENCHANTED_BOOK = 20267; - public const FIRST_UNUSED_ITEM_ID = 20267; + public const FIRST_UNUSED_ITEM_ID = 20268; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index c8be97cadf..d482e4bef9 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1277,6 +1277,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("egg", fn() => Items::EGG()); $result->register("elixir", fn() => Items::MEDICINE()->setType(MedicineType::ELIXIR())); $result->register("emerald", fn() => Items::EMERALD()); + $result->register("enchanted_book", fn() => Items::ENCHANTED_BOOK()); $result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("ender_pearl", fn() => Items::ENDER_PEARL()); diff --git a/src/item/TieredTool.php b/src/item/TieredTool.php index e7d4f22015..dc00aebcf8 100644 --- a/src/item/TieredTool.php +++ b/src/item/TieredTool.php @@ -26,8 +26,11 @@ namespace pocketmine\item; abstract class TieredTool extends Tool{ protected ToolTier $tier; - public function __construct(ItemIdentifier $identifier, string $name, ToolTier $tier){ - parent::__construct($identifier, $name); + /** + * @param string[] $enchantmentTags + */ + public function __construct(ItemIdentifier $identifier, string $name, ToolTier $tier, array $enchantmentTags = []){ + parent::__construct($identifier, $name, $enchantmentTags); $this->tier = $tier; } @@ -43,6 +46,10 @@ abstract class TieredTool extends Tool{ return $this->tier->getBaseEfficiency(); } + public function getEnchantability() : int{ + return $this->tier->getEnchantability(); + } + public function getFuelTime() : int{ if($this->tier->equals(ToolTier::WOOD())){ return 200; diff --git a/src/item/ToolTier.php b/src/item/ToolTier.php index 231e233c33..4ca910c0bb 100644 --- a/src/item/ToolTier.php +++ b/src/item/ToolTier.php @@ -45,12 +45,12 @@ final class ToolTier{ protected static function setup() : void{ self::registerAll( - new self("wood", 1, 60, 5, 2), - new self("gold", 2, 33, 5, 12), - new self("stone", 3, 132, 6, 4), - new self("iron", 4, 251, 7, 6), - new self("diamond", 5, 1562, 8, 8), - new self("netherite", 6, 2032, 9, 9) + new self("wood", 1, 60, 5, 2, 15), + new self("gold", 2, 33, 5, 12, 22), + new self("stone", 3, 132, 6, 4, 5), + new self("iron", 4, 251, 7, 6, 14), + new self("diamond", 5, 1562, 8, 8, 10), + new self("netherite", 6, 2032, 9, 9, 15) ); } @@ -59,7 +59,8 @@ final class ToolTier{ private int $harvestLevel, private int $maxDurability, private int $baseAttackPoints, - private int $baseEfficiency + private int $baseEfficiency, + private int $enchantability ){ $this->Enum___construct($name); } @@ -79,4 +80,14 @@ final class ToolTier{ public function getBaseEfficiency() : int{ return $this->baseEfficiency; } + + /** + * Returns the value that defines how enchantable the item is. + * + * The higher an item's enchantability is, the more likely it will be to gain high-level enchantments + * or multiple enchantments upon being enchanted in an enchanting table. + */ + public function getEnchantability() : int{ + return $this->enchantability; + } } diff --git a/src/item/VanillaArmorMaterials.php b/src/item/VanillaArmorMaterials.php new file mode 100644 index 0000000000..ab2909bce3 --- /dev/null +++ b/src/item/VanillaArmorMaterials.php @@ -0,0 +1,73 @@ + + */ + public static function getAll() : array{ + // phpstan doesn't support generic traits yet :( + /** @var ArmorMaterial[] $result */ + $result = self::_registryGetAll(); + return $result; + } + + protected static function setup() : void{ + self::register("leather", new ArmorMaterial(15)); + self::register("chainmail", new ArmorMaterial(12)); + self::register("iron", new ArmorMaterial(9)); + self::register("turtle", new ArmorMaterial(9)); + self::register("gold", new ArmorMaterial(25)); + self::register("diamond", new ArmorMaterial(10)); + self::register("netherite", new ArmorMaterial(15)); + } +} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index b7c32ebc11..07ba398d58 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\RecordType; -use pocketmine\block\VanillaBlocks; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\entity\Entity; use pocketmine\entity\Location; @@ -32,8 +31,10 @@ use pocketmine\entity\Squid; use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\inventory\ArmorInventory; +use pocketmine\item\enchantment\ItemEnchantmentTags as EnchantmentTags; use pocketmine\item\ItemIdentifier as IID; use pocketmine\item\ItemTypeIds as Ids; +use pocketmine\item\VanillaArmorMaterials as ArmorMaterials; use pocketmine\math\Vector3; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\CloningRegistryTrait; @@ -151,6 +152,7 @@ use pocketmine\world\World; * @method static Item ECHO_SHARD() * @method static Egg EGG() * @method static Item EMERALD() + * @method static EnchantedBook ENCHANTED_BOOK() * @method static GoldenAppleEnchanted ENCHANTED_GOLDEN_APPLE() * @method static EnderPearl ENDER_PEARL() * @method static ExperienceBottle EXPERIENCE_BOTTLE() @@ -337,7 +339,7 @@ final class VanillaItems{ self::registerSpawnEggs(); self::registerTierToolItems(); - self::register("air", VanillaBlocks::AIR()->asItem()->setCount(0)); + self::register("air", Blocks::AIR()->asItem()->setCount(0)); self::register("acacia_sign", new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); self::register("amethyst_shard", new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); @@ -355,8 +357,8 @@ final class VanillaItems{ self::register("bleach", new Item(new IID(Ids::BLEACH), "Bleach")); self::register("bone", new Item(new IID(Ids::BONE), "Bone")); self::register("bone_meal", new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); - self::register("book", new Book(new IID(Ids::BOOK), "Book")); - self::register("bow", new Bow(new IID(Ids::BOW), "Bow")); + self::register("book", new Book(new IID(Ids::BOOK), "Book", [EnchantmentTags::ALL])); + self::register("bow", new Bow(new IID(Ids::BOW), "Bow", [EnchantmentTags::BOW])); self::register("bowl", new Bowl(new IID(Ids::BOWL), "Bowl")); self::register("bread", new Bread(new IID(Ids::BREAD), "Bread")); self::register("brick", new Item(new IID(Ids::BRICK), "Brick")); @@ -408,7 +410,7 @@ final class VanillaItems{ self::register("clownfish", new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); self::register("coal", new Coal(new IID(Ids::COAL), "Coal")); self::register("cocoa_beans", new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); - self::register("compass", new Compass(new IID(Ids::COMPASS), "Compass")); + self::register("compass", new Compass(new IID(Ids::COMPASS), "Compass", [EnchantmentTags::COMPASS])); self::register("cooked_chicken", new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); self::register("cooked_fish", new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); self::register("cooked_mutton", new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); @@ -429,15 +431,16 @@ final class VanillaItems{ self::register("echo_shard", new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); self::register("emerald", new Item(new IID(Ids::EMERALD), "Emerald")); + self::register("enchanted_book", new EnchantedBook(new IID(Ids::ENCHANTED_BOOK), "Enchanted Book")); self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); self::register("feather", new Item(new IID(Ids::FEATHER), "Feather")); self::register("fermented_spider_eye", new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); self::register("fire_charge", new FireCharge(new IID(Ids::FIRE_CHARGE), "Fire Charge")); - self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); + self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod", [EnchantmentTags::FISHING_ROD])); self::register("flint", new Item(new IID(Ids::FLINT), "Flint")); - self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); + self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel", [EnchantmentTags::FLINT_AND_STEEL])); self::register("ghast_tear", new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); self::register("glistering_melon", new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); @@ -521,7 +524,7 @@ final class VanillaItems{ self::register("redstone_dust", new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); self::register("rotten_flesh", new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); - self::register("shears", new Shears(new IID(Ids::SHEARS), "Shears")); + self::register("shears", new Shears(new IID(Ids::SHEARS), "Shears", [EnchantmentTags::SHEARS])); self::register("shulker_shell", new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); self::register("slimeball", new Item(new IID(Ids::SLIMEBALL), "Slimeball")); self::register("snowball", new Snowball(new IID(Ids::SNOWBALL), "Snowball")); @@ -577,67 +580,67 @@ final class VanillaItems{ } private static function registerTierToolItems() : void{ - self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); - self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); - self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); - self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE())); - self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); - self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); - self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); - self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); - self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); - self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE())); - self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); - self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); - self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); - self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); - self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); - self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE())); - self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); - self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); - self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); - self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); - self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); - self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE())); - self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); - self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); - self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); - self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); - self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); - self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE())); - self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); - self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); + self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND(), [EnchantmentTags::AXE])); + self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD(), [EnchantmentTags::AXE])); + self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON(), [EnchantmentTags::AXE])); + self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE(), [EnchantmentTags::AXE])); + self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE(), [EnchantmentTags::AXE])); + self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD(), [EnchantmentTags::AXE])); + self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND(), [EnchantmentTags::HOE])); + self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD(), [EnchantmentTags::HOE])); + self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON(), [EnchantmentTags::HOE])); + self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE(), [EnchantmentTags::HOE])); + self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE(), [EnchantmentTags::HOE])); + self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD(), [EnchantmentTags::HOE])); + self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND(), [EnchantmentTags::PICKAXE])); + self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD(), [EnchantmentTags::PICKAXE])); + self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON(), [EnchantmentTags::PICKAXE])); + self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE(), [EnchantmentTags::PICKAXE])); + self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE(), [EnchantmentTags::PICKAXE])); + self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD(), [EnchantmentTags::PICKAXE])); + self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND(), [EnchantmentTags::SHOVEL])); + self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD(), [EnchantmentTags::SHOVEL])); + self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON(), [EnchantmentTags::SHOVEL])); + self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE(), [EnchantmentTags::SHOVEL])); + self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE(), [EnchantmentTags::SHOVEL])); + self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD(), [EnchantmentTags::SHOVEL])); + self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND(), [EnchantmentTags::SWORD])); + self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD(), [EnchantmentTags::SWORD])); + self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON(), [EnchantmentTags::SWORD])); + self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE(), [EnchantmentTags::SWORD])); + self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE(), [EnchantmentTags::SWORD])); + self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD(), [EnchantmentTags::SWORD])); } private static function registerArmorItems() : void{ - self::register("chainmail_boots", new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET, 2))); - self::register("golden_boots", new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); - self::register("iron_boots", new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); - self::register("leather_boots", new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); - self::register("netherite_boots", new Armor(new IID(Ids::NETHERITE_BOOTS), "Netherite Boots", new ArmorTypeInfo(3, 482, ArmorInventory::SLOT_FEET, 3, true))); + self::register("chainmail_boots", new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::BOOTS])); + self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::BOOTS])); + self::register("golden_boots", new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET, material: ArmorMaterials::GOLD()), [EnchantmentTags::BOOTS])); + self::register("iron_boots", new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::IRON()), [EnchantmentTags::BOOTS])); + self::register("leather_boots", new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET, material: ArmorMaterials::LEATHER()), [EnchantmentTags::BOOTS])); + self::register("netherite_boots", new Armor(new IID(Ids::NETHERITE_BOOTS), "Netherite Boots", new ArmorTypeInfo(3, 482, ArmorInventory::SLOT_FEET, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::BOOTS])); - self::register("chainmail_chestplate", new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST, 2))); - self::register("golden_chestplate", new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); - self::register("iron_chestplate", new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); - self::register("leather_tunic", new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); - self::register("netherite_chestplate", new Armor(new IID(Ids::NETHERITE_CHESTPLATE), "Netherite Chestplate", new ArmorTypeInfo(8, 593, ArmorInventory::SLOT_CHEST, 3, true))); + self::register("chainmail_chestplate", new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::CHESTPLATE])); + self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::CHESTPLATE])); + self::register("golden_chestplate", new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::GOLD()), [EnchantmentTags::CHESTPLATE])); + self::register("iron_chestplate", new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::IRON()), [EnchantmentTags::CHESTPLATE])); + self::register("leather_tunic", new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::LEATHER()), [EnchantmentTags::CHESTPLATE])); + self::register("netherite_chestplate", new Armor(new IID(Ids::NETHERITE_CHESTPLATE), "Netherite Chestplate", new ArmorTypeInfo(8, 593, ArmorInventory::SLOT_CHEST, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::CHESTPLATE])); - self::register("chainmail_helmet", new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD, 2))); - self::register("golden_helmet", new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); - self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); - self::register("netherite_helmet", new Armor(new IID(Ids::NETHERITE_HELMET), "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true))); - self::register("turtle_helmet", new TurtleHelmet(new IID(Ids::TURTLE_HELMET), "Turtle Shell", new ArmorTypeInfo(2, 276, ArmorInventory::SLOT_HEAD))); + self::register("chainmail_helmet", new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::HELMET])); + self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::HELMET])); + self::register("golden_helmet", new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::GOLD()), [EnchantmentTags::HELMET])); + self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::IRON()), [EnchantmentTags::HELMET])); + self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::LEATHER()), [EnchantmentTags::HELMET])); + self::register("netherite_helmet", new Armor(new IID(Ids::NETHERITE_HELMET), "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::HELMET])); + self::register("turtle_helmet", new TurtleHelmet(new IID(Ids::TURTLE_HELMET), "Turtle Shell", new ArmorTypeInfo(2, 276, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::TURTLE()), [EnchantmentTags::HELMET])); - self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2))); - self::register("golden_leggings", new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); - self::register("iron_leggings", new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); - self::register("leather_pants", new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); - self::register("netherite_leggings", new Armor(new IID(Ids::NETHERITE_LEGGINGS), "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true))); + self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::LEGGINGS])); + self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::LEGGINGS])); + self::register("golden_leggings", new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::GOLD()), [EnchantmentTags::LEGGINGS])); + self::register("iron_leggings", new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::IRON()), [EnchantmentTags::LEGGINGS])); + self::register("leather_pants", new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::LEATHER()), [EnchantmentTags::LEGGINGS])); + self::register("netherite_leggings", new Armor(new IID(Ids::NETHERITE_LEGGINGS), "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::LEGGINGS])); } } diff --git a/src/item/enchantment/AvailableEnchantmentRegistry.php b/src/item/enchantment/AvailableEnchantmentRegistry.php new file mode 100644 index 0000000000..af8484049a --- /dev/null +++ b/src/item/enchantment/AvailableEnchantmentRegistry.php @@ -0,0 +1,211 @@ +register(Enchantments::PROTECTION(), [Tags::ARMOR], []); + $this->register(Enchantments::FIRE_PROTECTION(), [Tags::ARMOR], []); + $this->register(Enchantments::FEATHER_FALLING(), [Tags::BOOTS], []); + $this->register(Enchantments::BLAST_PROTECTION(), [Tags::ARMOR], []); + $this->register(Enchantments::PROJECTILE_PROTECTION(), [Tags::ARMOR], []); + $this->register(Enchantments::THORNS(), [Tags::CHESTPLATE], [Tags::HELMET, Tags::LEGGINGS, Tags::BOOTS]); + $this->register(Enchantments::RESPIRATION(), [Tags::HELMET], []); + $this->register(Enchantments::SHARPNESS(), [Tags::SWORD, Tags::AXE], []); + $this->register(Enchantments::KNOCKBACK(), [Tags::SWORD], []); + $this->register(Enchantments::FIRE_ASPECT(), [Tags::SWORD], []); + $this->register(Enchantments::EFFICIENCY(), [Tags::DIG_TOOLS], [Tags::SHEARS]); + $this->register(Enchantments::FORTUNE(), [Tags::DIG_TOOLS], []); + $this->register(Enchantments::SILK_TOUCH(), [Tags::DIG_TOOLS], [Tags::SHEARS]); + $this->register( + Enchantments::UNBREAKING(), + [Tags::ARMOR, Tags::WEAPONS, Tags::FISHING_ROD], + [Tags::SHEARS, Tags::FLINT_AND_STEEL, Tags::SHIELD, Tags::CARROT_ON_STICK, Tags::ELYTRA, Tags::BRUSH] + ); + $this->register(Enchantments::POWER(), [Tags::BOW], []); + $this->register(Enchantments::PUNCH(), [Tags::BOW], []); + $this->register(Enchantments::FLAME(), [Tags::BOW], []); + $this->register(Enchantments::INFINITY(), [Tags::BOW], []); + $this->register( + Enchantments::MENDING(), + [], + [Tags::ARMOR, Tags::WEAPONS, Tags::FISHING_ROD, + Tags::SHEARS, Tags::FLINT_AND_STEEL, Tags::SHIELD, Tags::CARROT_ON_STICK, Tags::ELYTRA, Tags::BRUSH] + ); + $this->register(Enchantments::VANISHING(), [], [Tags::ALL]); + $this->register(Enchantments::SWIFT_SNEAK(), [], [Tags::LEGGINGS]); + } + + /** + * @param string[] $primaryItemTags + * @param string[] $secondaryItemTags + */ + public function register(Enchantment $enchantment, array $primaryItemTags, array $secondaryItemTags) : void{ + $this->enchantments[spl_object_id($enchantment)] = $enchantment; + $this->setPrimaryItemTags($enchantment, $primaryItemTags); + $this->setSecondaryItemTags($enchantment, $secondaryItemTags); + } + + public function unregister(Enchantment $enchantment) : void{ + unset($this->enchantments[spl_object_id($enchantment)]); + unset($this->primaryItemTags[spl_object_id($enchantment)]); + unset($this->secondaryItemTags[spl_object_id($enchantment)]); + } + + public function unregisterAll() : void{ + $this->enchantments = []; + $this->primaryItemTags = []; + $this->secondaryItemTags = []; + } + + public function isRegistered(Enchantment $enchantment) : bool{ + return isset($this->enchantments[spl_object_id($enchantment)]); + } + + /** + * Returns primary compatibility tags for the specified enchantment. + * + * An item matching at least one of these tags (or its descendents) can be: + * - Offered this enchantment in an enchanting table + * - Enchanted by any means allowed by secondary tags + * + * @return string[] + */ + public function getPrimaryItemTags(Enchantment $enchantment) : array{ + return $this->primaryItemTags[spl_object_id($enchantment)] ?? []; + } + + /** + * @param string[] $tags + */ + public function setPrimaryItemTags(Enchantment $enchantment, array $tags) : void{ + if(!$this->isRegistered($enchantment)){ + throw new \LogicException("Cannot set primary item tags for non-registered enchantment"); + } + $this->primaryItemTags[spl_object_id($enchantment)] = array_values($tags); + } + + /** + * Returns secondary compatibility tags for the specified enchantment. + * + * An item matching at least one of these tags (or its descendents) can be: + * - Combined with an enchanted book with this enchantment in an anvil + * - Obtained as loot with this enchantment, e.g. fishing, treasure chests, mob equipment, etc. + * + * @return string[] + */ + public function getSecondaryItemTags(Enchantment $enchantment) : array{ + return $this->secondaryItemTags[spl_object_id($enchantment)] ?? []; + } + + /** + * @param string[] $tags + */ + public function setSecondaryItemTags(Enchantment $enchantment, array $tags) : void{ + if(!$this->isRegistered($enchantment)){ + throw new \LogicException("Cannot set secondary item tags for non-registered enchantment"); + } + $this->secondaryItemTags[spl_object_id($enchantment)] = array_values($tags); + } + + /** + * Returns enchantments that can be applied to the specified item in an enchanting table (primary only). + * + * @return Enchantment[] + */ + public function getPrimaryEnchantmentsForItem(Item $item) : array{ + $itemTags = $item->getEnchantmentTags(); + if(count($itemTags) === 0 || $item->hasEnchantments()){ + return []; + } + + return array_filter( + $this->enchantments, + fn(Enchantment $e) => TagRegistry::getInstance()->isTagArrayIntersection($this->getPrimaryItemTags($e), $itemTags) + ); + } + + /** + * Returns all available enchantments compatible with the item. + * + * Warning: not suitable for obtaining enchantments for an enchanting table + * (use {@link AvailableEnchantmentRegistry::getPrimaryEnchantmentsForItem()} for that). + * + * @return Enchantment[] + */ + public function getAllEnchantmentsForItem(Item $item) : array{ + if(count($item->getEnchantmentTags()) === 0){ + return []; + } + + return array_filter( + $this->enchantments, + fn(Enchantment $enchantment) => $this->isAvailableForItem($enchantment, $item) + ); + } + + /** + * Returns whether the specified enchantment can be applied to the particular item. + * + * Warning: not suitable for checking the availability of enchantment for an enchanting table. + */ + public function isAvailableForItem(Enchantment $enchantment, Item $item) : bool{ + $itemTags = $item->getEnchantmentTags(); + $tagRegistry = TagRegistry::getInstance(); + + return $tagRegistry->isTagArrayIntersection($this->getPrimaryItemTags($enchantment), $itemTags) || + $tagRegistry->isTagArrayIntersection($this->getSecondaryItemTags($enchantment), $itemTags); + } + + /** + * @return Enchantment[] + */ + public function getAll() : array{ + return $this->enchantments; + } +} diff --git a/src/item/enchantment/EnchantOption.php b/src/item/enchantment/EnchantOption.php new file mode 100644 index 0000000000..b1c3a7af5a --- /dev/null +++ b/src/item/enchantment/EnchantOption.php @@ -0,0 +1,66 @@ +requiredXpLevel; + } + + /** + * Returns the name that will be translated to the 'Standard Galactic Alphabet' client-side. + * This can be any arbitrary text string, since the vanilla client cannot read the text anyway. + * Example: 'bless creature range free'. + */ + public function getDisplayName() : string{ + return $this->displayName; + } + + /** + * Returns the enchantments that will be applied to the item when this option is clicked. + * + * @return EnchantmentInstance[] + */ + public function getEnchantments() : array{ + return $this->enchantments; + } +} diff --git a/src/item/enchantment/Enchantment.php b/src/item/enchantment/Enchantment.php index c53dfab7c0..22c0cdb015 100644 --- a/src/item/enchantment/Enchantment.php +++ b/src/item/enchantment/Enchantment.php @@ -23,9 +23,13 @@ declare(strict_types=1); namespace pocketmine\item\enchantment; +use DaveRandom\CallbackValidator\CallbackType; +use DaveRandom\CallbackValidator\ParameterType; +use DaveRandom\CallbackValidator\ReturnType; use pocketmine\lang\Translatable; use pocketmine\utils\NotCloneable; use pocketmine\utils\NotSerializable; +use pocketmine\utils\Utils; /** * Manages enchantment type data. @@ -34,13 +38,32 @@ class Enchantment{ use NotCloneable; use NotSerializable; + /** @var \Closure(int $level) : int $minEnchantingPower */ + private \Closure $minEnchantingPower; + + /** + * @phpstan-param null|(\Closure(int $level) : int) $minEnchantingPower + * + * @param int $primaryItemFlags @deprecated + * @param int $secondaryItemFlags @deprecated + * @param int $enchantingPowerRange Value used to calculate the maximum enchanting power (minEnchantingPower + enchantingPowerRange) + */ public function __construct( private Translatable|string $name, private int $rarity, private int $primaryItemFlags, private int $secondaryItemFlags, - private int $maxLevel - ){} + private int $maxLevel, + ?\Closure $minEnchantingPower = null, + private int $enchantingPowerRange = 50 + ){ + $this->minEnchantingPower = $minEnchantingPower ?? fn(int $level) : int => 1; + + Utils::validateCallableSignature(new CallbackType( + new ReturnType("int"), + new ParameterType("level", "int") + ), $this->minEnchantingPower); + } /** * Returns a translation key for this enchantment's name. @@ -58,6 +81,8 @@ class Enchantment{ /** * Returns a bitset indicating what item types can have this item applied from an enchanting table. + * + * @deprecated */ public function getPrimaryItemFlags() : int{ return $this->primaryItemFlags; @@ -66,6 +91,8 @@ class Enchantment{ /** * Returns a bitset indicating what item types cannot have this item applied from an enchanting table, but can from * an anvil. + * + * @deprecated */ public function getSecondaryItemFlags() : int{ return $this->secondaryItemFlags; @@ -73,6 +100,8 @@ class Enchantment{ /** * Returns whether this enchantment can apply to the item type from an enchanting table. + * + * @deprecated */ public function hasPrimaryItemType(int $flag) : bool{ return ($this->primaryItemFlags & $flag) !== 0; @@ -80,6 +109,8 @@ class Enchantment{ /** * Returns whether this enchantment can apply to the item type from an anvil, if it is not a primary item. + * + * @deprecated */ public function hasSecondaryItemType(int $flag) : bool{ return ($this->secondaryItemFlags & $flag) !== 0; @@ -92,5 +123,34 @@ class Enchantment{ return $this->maxLevel; } - //TODO: methods for min/max XP cost bounds based on enchantment level (not needed yet - enchanting is client-side) + /** + * Returns whether this enchantment can be applied to the item along with the given enchantment. + */ + public function isCompatibleWith(Enchantment $other) : bool{ + return IncompatibleEnchantmentRegistry::getInstance()->areCompatible($this, $other); + } + + /** + * Returns the minimum enchanting power value required for the particular level of the enchantment + * to be available in an enchanting table. + * + * Enchanting power is a random value based on the number of bookshelves around an enchanting table + * and the enchantability of the item being enchanted. It is only used when determining the available + * enchantments for the enchantment options. + */ + public function getMinEnchantingPower(int $level) : int{ + return ($this->minEnchantingPower)($level); + } + + /** + * Returns the maximum enchanting power value allowed for the particular level of the enchantment + * to be available in an enchanting table. + * + * Enchanting power is a random value based on the number of bookshelves around an enchanting table + * and the enchantability of the item being enchanted. It is only used when determining the available + * enchantments for the enchantment options. + */ + public function getMaxEnchantingPower(int $level) : int{ + return $this->getMinEnchantingPower($level) + $this->enchantingPowerRange; + } } diff --git a/src/item/enchantment/EnchantmentHelper.php b/src/item/enchantment/EnchantmentHelper.php new file mode 100644 index 0000000000..bd4b689633 --- /dev/null +++ b/src/item/enchantment/EnchantmentHelper.php @@ -0,0 +1,217 @@ +getTypeId() === ItemTypeIds::BOOK ? Items::ENCHANTED_BOOK() : clone $item; + + foreach($enchantments as $enchantment){ + $resultItem->addEnchantment($enchantment); + } + + return $resultItem; + } + + /** + * @return EnchantOption[] + */ + public static function getEnchantOptions(Position $tablePos, Item $input, int $seed) : array{ + if($input->isNull() || $input->hasEnchantments()){ + return []; + } + + $random = new Random($seed); + + $bookshelfCount = self::countBookshelves($tablePos); + $baseRequiredLevel = $random->nextRange(1, 8) + ($bookshelfCount >> 1) + $random->nextRange(0, $bookshelfCount); + $topRequiredLevel = (int) floor(max($baseRequiredLevel / 3, 1)); + $middleRequiredLevel = (int) floor($baseRequiredLevel * 2 / 3 + 1); + $bottomRequiredLevel = max($baseRequiredLevel, $bookshelfCount * 2); + + return [ + self::createEnchantOption($random, $input, $topRequiredLevel), + self::createEnchantOption($random, $input, $middleRequiredLevel), + self::createEnchantOption($random, $input, $bottomRequiredLevel), + ]; + } + + private static function countBookshelves(Position $tablePos) : int{ + $bookshelfCount = 0; + $world = $tablePos->getWorld(); + + for($x = -2; $x <= 2; $x++){ + for($z = -2; $z <= 2; $z++){ + // We only check blocks at a distance of 2 blocks from the enchanting table + if(abs($x) !== 2 && abs($z) !== 2){ + continue; + } + + // Ensure the space between the bookshelf stack at this X/Z and the enchanting table is empty + for($y = 0; $y <= 1; $y++){ + // Calculate the coordinates of the space between the bookshelf and the enchanting table + $spaceX = max(min($x, 1), -1); + $spaceZ = max(min($z, 1), -1); + $spaceBlock = $world->getBlock($tablePos->add($spaceX, $y, $spaceZ)); + if($spaceBlock->getTypeId() !== BlockTypeIds::AIR){ + continue 2; + } + } + + // Finally, check the number of bookshelves at the current position + for($y = 0; $y <= 1; $y++){ + $block = $world->getBlock($tablePos->add($x, $y, $z)); + if($block->getTypeId() === BlockTypeIds::BOOKSHELF){ + $bookshelfCount++; + if($bookshelfCount === self::MAX_BOOKSHELF_COUNT){ + return $bookshelfCount; + } + } + } + } + } + + return $bookshelfCount; + } + + private static function createEnchantOption(Random $random, Item $inputItem, int $requiredXpLevel) : EnchantOption{ + $enchantingPower = $requiredXpLevel; + + $enchantability = $inputItem->getEnchantability(); + $enchantingPower = $enchantingPower + $random->nextRange(0, $enchantability >> 2) + $random->nextRange(0, $enchantability >> 2) + 1; + // Random bonus for enchanting power between 0.85 and 1.15 + $bonus = 1 + ($random->nextFloat() + $random->nextFloat() - 1) * 0.15; + $enchantingPower = (int) round($enchantingPower * $bonus); + + $resultEnchantments = []; + $availableEnchantments = self::getAvailableEnchantments($enchantingPower, $inputItem); + + $lastEnchantment = self::getRandomWeightedEnchantment($random, $availableEnchantments); + if($lastEnchantment !== null){ + $resultEnchantments[] = $lastEnchantment; + + // With probability (power + 1) / 50, continue adding enchantments + while($random->nextFloat() <= ($enchantingPower + 1) / 50){ + // Remove from the list of available enchantments anything that conflicts + // with previously-chosen enchantments + $availableEnchantments = array_filter( + $availableEnchantments, + function(EnchantmentInstance $e) use ($lastEnchantment){ + return $e->getType() !== $lastEnchantment->getType() && + $e->getType()->isCompatibleWith($lastEnchantment->getType()); + } + ); + + $lastEnchantment = self::getRandomWeightedEnchantment($random, $availableEnchantments); + if($lastEnchantment === null){ + break; + } + + $resultEnchantments[] = $lastEnchantment; + $enchantingPower >>= 1; + } + } + + return new EnchantOption($requiredXpLevel, self::getRandomOptionName($random), $resultEnchantments); + } + + /** + * @return EnchantmentInstance[] + */ + private static function getAvailableEnchantments(int $enchantingPower, Item $item) : array{ + $list = []; + + foreach(EnchantmentRegistry::getInstance()->getPrimaryEnchantmentsForItem($item) as $enchantment){ + for($lvl = $enchantment->getMaxLevel(); $lvl > 0; $lvl--){ + if($enchantingPower >= $enchantment->getMinEnchantingPower($lvl) && + $enchantingPower <= $enchantment->getMaxEnchantingPower($lvl) + ){ + $list[] = new EnchantmentInstance($enchantment, $lvl); + break; + } + } + } + + return $list; + } + + /** + * @param EnchantmentInstance[] $enchantments + */ + private static function getRandomWeightedEnchantment(Random $random, array $enchantments) : ?EnchantmentInstance{ + if(count($enchantments) === 0){ + return null; + } + + $totalWeight = 0; + foreach($enchantments as $enchantment){ + $totalWeight += $enchantment->getType()->getRarity(); + } + + $result = null; + $randomWeight = $random->nextRange(1, $totalWeight); + + foreach($enchantments as $enchantment){ + $randomWeight -= $enchantment->getType()->getRarity(); + + if($randomWeight <= 0){ + $result = $enchantment; + break; + } + } + + return $result; + } + + private static function getRandomOptionName(Random $random) : string{ + $name = ""; + for($i = $random->nextRange(5, 15); $i > 0; $i--){ + $name .= chr($random->nextRange(ord("a"), ord("z"))); + } + + return $name; + } +} diff --git a/src/item/enchantment/IncompatibleEnchantmentGroups.php b/src/item/enchantment/IncompatibleEnchantmentGroups.php new file mode 100644 index 0000000000..ed1141beea --- /dev/null +++ b/src/item/enchantment/IncompatibleEnchantmentGroups.php @@ -0,0 +1,34 @@ +> + * @var true[][] + */ + private array $incompatibilityMap = []; + + private function __construct(){ + $this->register(Groups::PROTECTION, [Enchantments::PROTECTION(), Enchantments::FIRE_PROTECTION(), Enchantments::BLAST_PROTECTION(), Enchantments::PROJECTILE_PROTECTION()]); + $this->register(Groups::BOW_INFINITE, [Enchantments::INFINITY(), Enchantments::MENDING()]); + $this->register(Groups::DIG_DROP, [Enchantments::FORTUNE(), Enchantments::SILK_TOUCH()]); + } + + /** + * Register incompatibility for an enchantment group. + * + * All enchantments belonging to the same group are incompatible with each other, + * i.e. they cannot be added together on the same item. + * + * @param Enchantment[] $enchantments + */ + public function register(string $tag, array $enchantments) : void{ + foreach($enchantments as $enchantment){ + $this->incompatibilityMap[spl_object_id($enchantment)][$tag] = true; + } + } + + /** + * Unregister incompatibility for some enchantments of a particular group. + * + * @param Enchantment[] $enchantments + */ + public function unregister(string $tag, array $enchantments) : void{ + foreach($enchantments as $enchantment){ + unset($this->incompatibilityMap[spl_object_id($enchantment)][$tag]); + } + } + + /** + * Unregister incompatibility for all enchantments of a particular group. + */ + public function unregisterAll(string $tag) : void{ + foreach($this->incompatibilityMap as $id => $tags){ + unset($this->incompatibilityMap[$id][$tag]); + } + } + + /** + * Returns whether two enchantments can be applied to the same item. + */ + public function areCompatible(Enchantment $first, Enchantment $second) : bool{ + $firstIncompatibilities = $this->incompatibilityMap[spl_object_id($first)] ?? []; + $secondIncompatibilities = $this->incompatibilityMap[spl_object_id($second)] ?? []; + return count(array_intersect_key($firstIncompatibilities, $secondIncompatibilities)) === 0; + } +} diff --git a/src/item/enchantment/ItemEnchantmentTagRegistry.php b/src/item/enchantment/ItemEnchantmentTagRegistry.php new file mode 100644 index 0000000000..9c607f9d28 --- /dev/null +++ b/src/item/enchantment/ItemEnchantmentTagRegistry.php @@ -0,0 +1,190 @@ +> + * @var string[][] + */ + private array $tagMap = []; + + private function __construct(){ + $this->register(Tags::ARMOR, [Tags::HELMET, Tags::CHESTPLATE, Tags::LEGGINGS, Tags::BOOTS]); + $this->register(Tags::SHIELD); + $this->register(Tags::SWORD); + $this->register(Tags::TRIDENT); + $this->register(Tags::BOW); + $this->register(Tags::CROSSBOW); + $this->register(Tags::SHEARS); + $this->register(Tags::FLINT_AND_STEEL); + $this->register(Tags::DIG_TOOLS, [Tags::AXE, Tags::PICKAXE, Tags::SHOVEL, Tags::HOE]); + $this->register(Tags::FISHING_ROD); + $this->register(Tags::CARROT_ON_STICK); + $this->register(Tags::COMPASS); + $this->register(Tags::MASK); + $this->register(Tags::ELYTRA); + $this->register(Tags::BRUSH); + $this->register(Tags::WEAPONS, [ + Tags::SWORD, + Tags::TRIDENT, + Tags::BOW, + Tags::CROSSBOW, + Tags::DIG_TOOLS, + ]); + } + + /** + * Register tag and its nested tags. + * + * @param string[] $nestedTags + */ + public function register(string $tag, array $nestedTags = []) : void{ + $this->assertNotInternalTag($tag); + + foreach($nestedTags as $nestedTag){ + if(!isset($this->tagMap[$nestedTag])){ + $this->register($nestedTag); + } + $this->tagMap[$tag][] = $nestedTag; + } + + if(!isset($this->tagMap[$tag])){ + $this->tagMap[$tag] = []; + $this->tagMap[Tags::ALL][] = $tag; + } + } + + public function unregister(string $tag) : void{ + if(!isset($this->tagMap[$tag])){ + return; + } + $this->assertNotInternalTag($tag); + + unset($this->tagMap[$tag]); + + foreach(Utils::stringifyKeys($this->tagMap) as $key => $nestedTags){ + if(($nestedKey = array_search($tag, $nestedTags, true)) !== false){ + unset($this->tagMap[$key][$nestedKey]); + } + } + } + + /** + * Remove specified nested tags. + * + * @param string[] $nestedTags + */ + public function removeNested(string $tag, array $nestedTags) : void{ + $this->assertNotInternalTag($tag); + $this->tagMap[$tag] = array_diff($this->tagMap[$tag], $nestedTags); + } + + /** + * Returns nested tags of a particular tag. + * + * @return string[] + */ + public function getNested(string $tag) : array{ + return $this->tagMap[$tag] ?? []; + } + + /** + * @param string[] $firstTags + * @param string[] $secondTags + */ + public function isTagArrayIntersection(array $firstTags, array $secondTags) : bool{ + if(count($firstTags) === 0 || count($secondTags) === 0){ + return false; + } + + $firstLeafTags = $this->getLeafTagsForArray($firstTags); + $secondLeafTags = $this->getLeafTagsForArray($secondTags); + + return count(array_intersect($firstLeafTags, $secondLeafTags)) !== 0; + } + + /** + * Returns all tags that are recursively nested within each tag in the array and do not have any nested tags. + * + * @param string[] $tags + * + * @return string[] + */ + private function getLeafTagsForArray(array $tags) : array{ + $leafTagArrays = []; + foreach($tags as $tag){ + $leafTagArrays[] = $this->getLeafTags($tag); + } + return array_unique(array_merge(...$leafTagArrays)); + } + + /** + * Returns all tags that are recursively nested within the given tag and do not have any nested tags. + * + * @return string[] + */ + private function getLeafTags(string $tag) : array{ + $result = []; + $tagsToHandle = [$tag]; + + while(count($tagsToHandle) !== 0){ + $currentTag = array_shift($tagsToHandle); + $nestedTags = $this->getNested($currentTag); + + if(count($nestedTags) === 0){ + $result[] = $currentTag; + }else{ + $tagsToHandle = array_merge($tagsToHandle, $nestedTags); + } + } + + return $result; + } + + private function assertNotInternalTag(string $tag) : void{ + if($tag === Tags::ALL){ + throw new \InvalidArgumentException( + "Cannot perform any operations on the internal item enchantment tag '$tag'" + ); + } + } +} diff --git a/src/item/enchantment/ItemEnchantmentTags.php b/src/item/enchantment/ItemEnchantmentTags.php new file mode 100644 index 0000000000..485cb5d0c1 --- /dev/null +++ b/src/item/enchantment/ItemEnchantmentTags.php @@ -0,0 +1,57 @@ +typeModifier = $typeModifier; if($applicableDamageTypes !== null){ diff --git a/src/item/enchantment/VanillaEnchantments.php b/src/item/enchantment/VanillaEnchantments.php index ac2f5c57e5..779098c770 100644 --- a/src/item/enchantment/VanillaEnchantments.php +++ b/src/item/enchantment/VanillaEnchantments.php @@ -59,47 +59,224 @@ final class VanillaEnchantments{ use RegistryTrait; protected static function setup() : void{ - self::register("PROTECTION", new ProtectionEnchantment(KnownTranslationFactory::enchantment_protect_all(), Rarity::COMMON, ItemFlags::ARMOR, ItemFlags::NONE, 4, 0.75, null)); - self::register("FIRE_PROTECTION", new ProtectionEnchantment(KnownTranslationFactory::enchantment_protect_fire(), Rarity::UNCOMMON, ItemFlags::ARMOR, ItemFlags::NONE, 4, 1.25, [ - EntityDamageEvent::CAUSE_FIRE, - EntityDamageEvent::CAUSE_FIRE_TICK, - EntityDamageEvent::CAUSE_LAVA - //TODO: check fireballs - ])); - self::register("FEATHER_FALLING", new ProtectionEnchantment(KnownTranslationFactory::enchantment_protect_fall(), Rarity::UNCOMMON, ItemFlags::FEET, ItemFlags::NONE, 4, 2.5, [ - EntityDamageEvent::CAUSE_FALL - ])); - self::register("BLAST_PROTECTION", new ProtectionEnchantment(KnownTranslationFactory::enchantment_protect_explosion(), Rarity::RARE, ItemFlags::ARMOR, ItemFlags::NONE, 4, 1.5, [ - EntityDamageEvent::CAUSE_BLOCK_EXPLOSION, - EntityDamageEvent::CAUSE_ENTITY_EXPLOSION - ])); - self::register("PROJECTILE_PROTECTION", new ProtectionEnchantment(KnownTranslationFactory::enchantment_protect_projectile(), Rarity::UNCOMMON, ItemFlags::ARMOR, ItemFlags::NONE, 4, 1.5, [ - EntityDamageEvent::CAUSE_PROJECTILE - ])); - self::register("THORNS", new Enchantment(KnownTranslationFactory::enchantment_thorns(), Rarity::MYTHIC, ItemFlags::TORSO, ItemFlags::HEAD | ItemFlags::LEGS | ItemFlags::FEET, 3)); - self::register("RESPIRATION", new Enchantment(KnownTranslationFactory::enchantment_oxygen(), Rarity::RARE, ItemFlags::HEAD, ItemFlags::NONE, 3)); + self::register("PROTECTION", new ProtectionEnchantment( + KnownTranslationFactory::enchantment_protect_all(), + Rarity::COMMON, + 0, + 0, + 4, + 0.75, + null, + fn(int $level) : int => 11 * ($level - 1) + 1, + 20 + )); + self::register("FIRE_PROTECTION", new ProtectionEnchantment( + KnownTranslationFactory::enchantment_protect_fire(), + Rarity::UNCOMMON, + 0, + 0, + 4, + 1.25, + [ + EntityDamageEvent::CAUSE_FIRE, + EntityDamageEvent::CAUSE_FIRE_TICK, + EntityDamageEvent::CAUSE_LAVA + //TODO: check fireballs + ], + fn(int $level) : int => 8 * ($level - 1) + 10, + 12 + )); + self::register("FEATHER_FALLING", new ProtectionEnchantment( + KnownTranslationFactory::enchantment_protect_fall(), + Rarity::UNCOMMON, + 0, + 0, + 4, + 2.5, + [ + EntityDamageEvent::CAUSE_FALL + ], + fn(int $level) : int => 6 * ($level - 1) + 5, + 10 + )); + self::register("BLAST_PROTECTION", new ProtectionEnchantment( + KnownTranslationFactory::enchantment_protect_explosion(), + Rarity::RARE, + 0, + 0, + 4, + 1.5, + [ + EntityDamageEvent::CAUSE_BLOCK_EXPLOSION, + EntityDamageEvent::CAUSE_ENTITY_EXPLOSION + ], + fn(int $level) : int => 8 * ($level - 1) + 5, + 12 + )); + self::register("PROJECTILE_PROTECTION", new ProtectionEnchantment( + KnownTranslationFactory::enchantment_protect_projectile(), + Rarity::UNCOMMON, + 0, + 0, + 4, + 1.5, + [ + EntityDamageEvent::CAUSE_PROJECTILE + ], + fn(int $level) : int => 6 * ($level - 1) + 3, + 15 + )); + self::register("THORNS", new Enchantment( + KnownTranslationFactory::enchantment_thorns(), + Rarity::MYTHIC, + 0, + 0, + 3, + fn(int $level) : int => 20 * ($level - 1) + 10, + 50 + )); + self::register("RESPIRATION", new Enchantment( + KnownTranslationFactory::enchantment_oxygen(), + Rarity::RARE, + 0, + 0, + 3, + fn(int $level) : int => 10 * $level, + 30 + )); - self::register("SHARPNESS", new SharpnessEnchantment(KnownTranslationFactory::enchantment_damage_all(), Rarity::COMMON, ItemFlags::SWORD, ItemFlags::AXE, 5)); - //TODO: smite, bane of arthropods (these don't make sense now because their applicable mobs don't exist yet) + self::register("SHARPNESS", new SharpnessEnchantment( + KnownTranslationFactory::enchantment_damage_all(), + Rarity::COMMON, + 0, + 0, + 5, + fn(int $level) : int => 11 * ($level - 1) + 1, + 20 + )); + self::register("KNOCKBACK", new KnockbackEnchantment( + KnownTranslationFactory::enchantment_knockback(), + Rarity::UNCOMMON, + 0, + 0, + 2, + fn(int $level) : int => 20 * ($level - 1) + 5, + 50 + )); + self::register("FIRE_ASPECT", new FireAspectEnchantment( + KnownTranslationFactory::enchantment_fire(), + Rarity::RARE, + 0, + 0, + 2, + fn(int $level) : int => 20 * ($level - 1) + 10, + 50 + )); + //TODO: smite, bane of arthropods, looting (these don't make sense now because their applicable mobs don't exist yet) - self::register("KNOCKBACK", new KnockbackEnchantment(KnownTranslationFactory::enchantment_knockback(), Rarity::UNCOMMON, ItemFlags::SWORD, ItemFlags::NONE, 2)); - self::register("FIRE_ASPECT", new FireAspectEnchantment(KnownTranslationFactory::enchantment_fire(), Rarity::RARE, ItemFlags::SWORD, ItemFlags::NONE, 2)); + self::register("EFFICIENCY", new Enchantment( + KnownTranslationFactory::enchantment_digging(), + Rarity::COMMON, + 0, + 0, + 5, + fn(int $level) : int => 10 * ($level - 1) + 1, + 50 + )); + self::register("FORTUNE", new Enchantment( + KnownTranslationFactory::enchantment_lootBonusDigger(), + Rarity::RARE, + 0, + 0, + 3, + fn(int $level) : int => 9 * ($level - 1) + 15, + 50 + )); + self::register("SILK_TOUCH", new Enchantment( + KnownTranslationFactory::enchantment_untouching(), + Rarity::MYTHIC, + 0, + 0, + 1, + fn(int $level) : int => 15, + 50 + )); + self::register("UNBREAKING", new Enchantment( + KnownTranslationFactory::enchantment_durability(), + Rarity::UNCOMMON, + 0, + 0, + 3, + fn(int $level) : int => 8 * ($level - 1) + 5, + 50 + )); - self::register("EFFICIENCY", new Enchantment(KnownTranslationFactory::enchantment_digging(), Rarity::COMMON, ItemFlags::DIG, ItemFlags::SHEARS, 5)); - self::register("FORTUNE", new Enchantment(KnownTranslationFactory::enchantment_lootBonusDigger(), Rarity::RARE, ItemFlags::DIG, ItemFlags::NONE, 3)); - self::register("SILK_TOUCH", new Enchantment(KnownTranslationFactory::enchantment_untouching(), Rarity::MYTHIC, ItemFlags::DIG, ItemFlags::SHEARS, 1)); - self::register("UNBREAKING", new Enchantment(KnownTranslationFactory::enchantment_durability(), Rarity::UNCOMMON, ItemFlags::DIG | ItemFlags::ARMOR | ItemFlags::FISHING_ROD | ItemFlags::BOW, ItemFlags::TOOL | ItemFlags::CARROT_STICK | ItemFlags::ELYTRA, 3)); + self::register("POWER", new Enchantment( + KnownTranslationFactory::enchantment_arrowDamage(), + Rarity::COMMON, + 0, + 0, + 5, + fn(int $level) : int => 10 * ($level - 1) + 1, + 15 + )); + self::register("PUNCH", new Enchantment( + KnownTranslationFactory::enchantment_arrowKnockback(), + Rarity::RARE, + 0, + 0, + 2, + fn(int $level) : int => 20 * ($level - 1) + 12, + 25 + )); + self::register("FLAME", new Enchantment( + KnownTranslationFactory::enchantment_arrowFire(), + Rarity::RARE, + 0, + 0, + 1, + fn(int $level) : int => 20, + 30 + )); + self::register("INFINITY", new Enchantment( + KnownTranslationFactory::enchantment_arrowInfinite(), + Rarity::MYTHIC, + 0, + 0, + 1, + fn(int $level) : int => 20, + 30 + )); - self::register("POWER", new Enchantment(KnownTranslationFactory::enchantment_arrowDamage(), Rarity::COMMON, ItemFlags::BOW, ItemFlags::NONE, 5)); - self::register("PUNCH", new Enchantment(KnownTranslationFactory::enchantment_arrowKnockback(), Rarity::RARE, ItemFlags::BOW, ItemFlags::NONE, 2)); - self::register("FLAME", new Enchantment(KnownTranslationFactory::enchantment_arrowFire(), Rarity::RARE, ItemFlags::BOW, ItemFlags::NONE, 1)); - self::register("INFINITY", new Enchantment(KnownTranslationFactory::enchantment_arrowInfinite(), Rarity::MYTHIC, ItemFlags::BOW, ItemFlags::NONE, 1)); + self::register("MENDING", new Enchantment( + KnownTranslationFactory::enchantment_mending(), + Rarity::RARE, + 0, + 0, + 1, + fn(int $level) : int => 25, + 50 + )); - self::register("MENDING", new Enchantment(KnownTranslationFactory::enchantment_mending(), Rarity::RARE, ItemFlags::NONE, ItemFlags::ALL, 1)); + self::register("VANISHING", new Enchantment( + KnownTranslationFactory::enchantment_curse_vanishing(), + Rarity::MYTHIC, + 0, + 0, + 1, + fn(int $level) : int => 25, + 25 + )); - self::register("VANISHING", new Enchantment(KnownTranslationFactory::enchantment_curse_vanishing(), Rarity::MYTHIC, ItemFlags::NONE, ItemFlags::ALL, 1)); - - self::register("SWIFT_SNEAK", new Enchantment(KnownTranslationFactory::enchantment_swift_sneak(), Rarity::MYTHIC, ItemFlags::NONE, ItemFlags::LEGS, 3)); + self::register("SWIFT_SNEAK", new Enchantment( + KnownTranslationFactory::enchantment_swift_sneak(), + Rarity::MYTHIC, + 0, + 0, + 3, + fn(int $level) : int => 10 * $level, + 5 + )); } protected static function register(string $name, Enchantment $member) : void{ diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 254eff9107..bd925a5c00 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -35,9 +35,12 @@ use pocketmine\block\inventory\LoomInventory; use pocketmine\block\inventory\SmithingTableInventory; use pocketmine\block\inventory\StonecutterInventory; use pocketmine\crafting\FurnaceType; +use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; +use pocketmine\item\enchantment\EnchantmentInstance; +use pocketmine\item\enchantment\EnchantOption; use pocketmine\network\mcpe\cache\CreativeInventoryCache; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; @@ -46,7 +49,10 @@ use pocketmine\network\mcpe\protocol\ContainerSetDataPacket; use pocketmine\network\mcpe\protocol\InventoryContentPacket; use pocketmine\network\mcpe\protocol\InventorySlotPacket; use pocketmine\network\mcpe\protocol\MobEquipmentPacket; +use pocketmine\network\mcpe\protocol\PlayerEnchantOptionsPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; +use pocketmine\network\mcpe\protocol\types\Enchant; +use pocketmine\network\mcpe\protocol\types\EnchantOption as ProtocolEnchantOption; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; @@ -58,6 +64,7 @@ use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\ObjectSet; use function array_keys; +use function array_map; use function array_search; use function count; use function get_class; @@ -103,6 +110,12 @@ class InventoryManager{ private bool $fullSyncRequested = false; + /** @var int[] network recipe ID => enchanting table option index */ + private array $enchantingTableOptions = []; + //TODO: this should be based on the total number of crafting recipes - if there are ever 100k recipes, this will + //conflict with regular recipes + private int $nextEnchantingTableOptionId = 100000; + public function __construct( private Player $player, private NetworkSession $session @@ -382,6 +395,7 @@ class InventoryManager{ throw new AssumptionFailedError("We should not have opened a new window while a window was waiting to be closed"); } $this->pendingCloseWindowId = $this->lastInventoryNetworkId; + $this->enchantingTableOptions = []; } } @@ -603,6 +617,39 @@ class InventoryManager{ $this->session->sendDataPacket(CreativeInventoryCache::getInstance()->getCache($this->player->getCreativeInventory())); } + /** + * @param EnchantOption[] $options + */ + public function syncEnchantingTableOptions(array $options) : void{ + $protocolOptions = []; + + foreach($options as $index => $option){ + $optionId = $this->nextEnchantingTableOptionId++; + $this->enchantingTableOptions[$optionId] = $index; + + $protocolEnchantments = array_map( + fn(EnchantmentInstance $e) => new Enchant(EnchantmentIdMap::getInstance()->toId($e->getType()), $e->getLevel()), + $option->getEnchantments() + ); + // We don't pay attention to the $slotFlags, $heldActivatedEnchantments and $selfActivatedEnchantments + // as everything works fine without them (perhaps these values are used somehow in the BDS). + $protocolOptions[] = new ProtocolEnchantOption( + $option->getRequiredXpLevel(), + 0, $protocolEnchantments, + [], + [], + $option->getDisplayName(), + $optionId + ); + } + + $this->session->sendDataPacket(PlayerEnchantOptionsPacket::create($protocolOptions)); + } + + public function getEnchantingTableOptionIndex(int $recipeId) : ?int{ + return $this->enchantingTableOptions[$recipeId] ?? null; + } + private function newItemStackId() : int{ return $this->nextItemStackId++; } diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 10787f84be..8273068ab2 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -23,11 +23,13 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; +use pocketmine\block\inventory\EnchantInventory; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; +use pocketmine\inventory\transaction\EnchantTransaction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionBuilder; use pocketmine\inventory\transaction\TransactionBuilderInventory; @@ -287,7 +289,7 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ private function assertDoingCrafting() : void{ - if(!$this->specialTransaction instanceof CraftingTransaction){ + if(!$this->specialTransaction instanceof CraftingTransaction && !$this->specialTransaction instanceof EnchantTransaction){ if($this->specialTransaction === null){ throw new ItemStackRequestProcessException("Expected CraftRecipe or CraftRecipeAuto action to precede this action"); }else{ @@ -333,7 +335,16 @@ class ItemStackRequestExecutor{ $this->setNextCreatedItem($item, true); }elseif($action instanceof CraftRecipeStackRequestAction){ - $this->beginCrafting($action->getRecipeId(), 1); + $window = $this->player->getCurrentWindow(); + if($window instanceof EnchantInventory){ + $optionId = $this->inventoryManager->getEnchantingTableOptionIndex($action->getRecipeId()); + if($optionId !== null && ($option = $window->getOption($optionId)) !== null){ + $this->specialTransaction = new EnchantTransaction($this->player, $option, $optionId + 1); + $this->setNextCreatedItem($window->getOutput($optionId)); + } + }else{ + $this->beginCrafting($action->getRecipeId(), 1); + } }elseif($action instanceof CraftRecipeAutoStackRequestAction){ $this->beginCrafting($action->getRecipeId(), $action->getRepetitions()); }elseif($action instanceof CraftingConsumeInputStackRequestAction){ From 5afbb9d8072db2984899faf832d5c4e54ea1c7cd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 15 Aug 2023 19:10:03 +0100 Subject: [PATCH 1306/1858] Allow enchanted books to be enchanted if an enchanted book is obtained via /give without enchantments, it should be able to receive enchantments in an enchanting table, exactly the same as regular books. --- src/item/VanillaItems.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 07ba398d58..a5d50c9db3 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -431,7 +431,7 @@ final class VanillaItems{ self::register("echo_shard", new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); self::register("emerald", new Item(new IID(Ids::EMERALD), "Emerald")); - self::register("enchanted_book", new EnchantedBook(new IID(Ids::ENCHANTED_BOOK), "Enchanted Book")); + self::register("enchanted_book", new EnchantedBook(new IID(Ids::ENCHANTED_BOOK), "Enchanted Book", [EnchantmentTags::ALL])); self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); From f516c3c50203555ce34b2049bf43fa78e0793f5c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 15 Aug 2023 19:10:48 +0100 Subject: [PATCH 1307/1858] EnchantCommand: ensure that books are turned into enchanted book items --- src/command/defaults/EnchantCommand.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 583bd59ec9..189931b99b 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -25,6 +25,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; +use pocketmine\item\enchantment\EnchantmentHelper; use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; @@ -76,8 +77,9 @@ class EnchantCommand extends VanillaCommand{ } } - $item->addEnchantment(new EnchantmentInstance($enchantment, $level)); - $player->getInventory()->setItemInHand($item); + //this is necessary to deal with enchanted books, which are a different item type than regular books + $enchantedItem = EnchantmentHelper::enchantItem($item, [new EnchantmentInstance($enchantment, $level)]); + $player->getInventory()->setItemInHand($enchantedItem); self::broadcastCommandMessage($sender, KnownTranslationFactory::commands_enchant_success($player->getName())); return true; From b65b7a7f7497bc8e284eaedacbce61bd59c9ff88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 09:38:16 +0100 Subject: [PATCH 1308/1858] Bump tests/plugins/DevTools from `83f0db3` to `411fd5b` (#5998) Bumps [tests/plugins/DevTools](https://github.com/pmmp/DevTools) from `83f0db3` to `411fd5b`. - [Release notes](https://github.com/pmmp/DevTools/releases) - [Commits](https://github.com/pmmp/DevTools/compare/83f0db3f9e0adbf424e32ed81f7730e97b037be9...411fd5bdc002edd82cf1ea658d170bb814d59483) --- updated-dependencies: - dependency-name: tests/plugins/DevTools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index 83f0db3f9e..411fd5bdc0 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit 83f0db3f9e0adbf424e32ed81f7730e97b037be9 +Subproject commit 411fd5bdc002edd82cf1ea658d170bb814d59483 From e323c5dd76fa022af1c8be6d7ad82d4b9ccdd34a Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 16 Aug 2023 13:00:23 +0100 Subject: [PATCH 1309/1858] Implement pressure plate activation logic and events (#5991) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #5936 This implements all of the basic activation logic for pressure plates. It also introduces a PressurePlateUpdateEvent, which is called in pulses when entities are standing on top of the plate and when it deactivates. Deactivation can be detected by checking if the list of activating entities is empty. --------- Co-authored-by: Javier León <58715544+JavierLeon9966@users.noreply.github.com> --- src/block/PressurePlate.php | 105 +++++++++++++++++- src/block/SimplePressurePlate.php | 16 +++ src/block/StonePressurePlate.php | 7 ++ src/block/VanillaBlocks.php | 20 +++- src/block/WeightedPressurePlate.php | 35 +++++- src/block/WeightedPressurePlateHeavy.php | 3 + src/block/WeightedPressurePlateLight.php | 3 + src/block/WoodenPressurePlate.php | 12 ++ src/event/block/PressurePlateUpdateEvent.php | 53 +++++++++ .../sound/PressurePlateActivateSound.php | 46 ++++++++ .../sound/PressurePlateDeactivateSound.php | 46 ++++++++ 11 files changed, 340 insertions(+), 6 deletions(-) create mode 100644 src/event/block/PressurePlateUpdateEvent.php create mode 100644 src/world/sound/PressurePlateActivateSound.php create mode 100644 src/world/sound/PressurePlateDeactivateSound.php diff --git a/src/block/PressurePlate.php b/src/block/PressurePlate.php index 4df0bf927d..d67433a750 100644 --- a/src/block/PressurePlate.php +++ b/src/block/PressurePlate.php @@ -24,14 +24,33 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SupportType; +use pocketmine\entity\Entity; +use pocketmine\event\block\PressurePlateUpdateEvent; use pocketmine\item\Item; +use pocketmine\math\Axis; +use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use pocketmine\world\sound\PressurePlateActivateSound; +use pocketmine\world\sound\PressurePlateDeactivateSound; +use function count; abstract class PressurePlate extends Transparent{ + private readonly int $deactivationDelayTicks; + + public function __construct( + BlockIdentifier $idInfo, + string $name, + BlockTypeInfo $typeInfo, + int $deactivationDelayTicks = 20 //TODO: make this mandatory in PM6 + ){ + parent::__construct($idInfo, $name, $typeInfo); + $this->deactivationDelayTicks = $deactivationDelayTicks; + } + public function isSolid() : bool{ return false; } @@ -61,5 +80,89 @@ abstract class PressurePlate extends Transparent{ } } - //TODO + public function hasEntityCollision() : bool{ + return true; + } + + public function onEntityInside(Entity $entity) : bool{ + if(!$this->hasOutputSignal()){ + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, 0); + } + return true; + } + + /** + * Returns the AABB that entities must intersect to activate the pressure plate. + * Note that this is not the same as the collision box (pressure plate doesn't have one), nor the visual bounding + * box. The activation area has a height of 0.25 blocks. + */ + protected function getActivationBox() : AxisAlignedBB{ + return AxisAlignedBB::one() + ->squash(Axis::X, 1 / 8) + ->squash(Axis::Z, 1 / 8) + ->trim(Facing::UP, 3 / 4) + ->offset($this->position->x, $this->position->y, $this->position->z); + } + + /** + * TODO: make this abstract in PM6 + */ + protected function hasOutputSignal() : bool{ + return false; + } + + /** + * TODO: make this abstract in PM6 + * + * @param Entity[] $entities + * + * @return mixed[] + * @phpstan-return array{Block, ?bool} + */ + protected function calculatePlateState(array $entities) : array{ + return [$this, null]; + } + + /** + * Filters entities which don't affect the pressure plate state from the given list. + * + * @param Entity[] $entities + * @return Entity[] + */ + protected function filterIrrelevantEntities(array $entities) : array{ + return $entities; + } + + public function onScheduledUpdate() : void{ + $world = $this->position->getWorld(); + + $intersectionAABB = $this->getActivationBox(); + $activatingEntities = $this->filterIrrelevantEntities($world->getNearbyEntities($intersectionAABB)); + + //if an irrelevant entity is inside the full cube space of the pressure plate but not activating the plate, + //it will cause scheduled updates on the plate every tick. We don't want to fire events in this case if the + //plate is already deactivated. + if(count($activatingEntities) > 0 || $this->hasOutputSignal()){ + [$newState, $pressedChange] = $this->calculatePlateState($activatingEntities); + + //always call this, in case there are new entities on the plate + if(PressurePlateUpdateEvent::hasHandlers()){ + $ev = new PressurePlateUpdateEvent($this, $newState, $activatingEntities); + $ev->call(); + $newState = $ev->isCancelled() ? null : $ev->getNewState(); + } + if($newState !== null){ + $world->setBlock($this->position, $newState); + if($pressedChange !== null){ + $world->addSound($this->position, $pressedChange ? + new PressurePlateActivateSound($this) : + new PressurePlateDeactivateSound($this) + ); + } + } + if($pressedChange ?? $this->hasOutputSignal()){ + $world->scheduleDelayedBlockUpdate($this->position, $this->deactivationDelayTicks); + } + } + } } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index e4278410d5..3429b9b5da 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\data\runtime\RuntimeDataDescriber; +use function count; abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; @@ -39,4 +40,19 @@ abstract class SimplePressurePlate extends PressurePlate{ $this->pressed = $pressed; return $this; } + + protected function hasOutputSignal() : bool{ + return $this->pressed; + } + + protected function calculatePlateState(array $entities) : array{ + $newPressed = count($entities) > 0; + if($newPressed === $this->pressed){ + return [$this, null]; + } + return [ + (clone $this)->setPressed($newPressed), + $newPressed + ]; + } } diff --git a/src/block/StonePressurePlate.php b/src/block/StonePressurePlate.php index 626e6d8851..5ddc5a5993 100644 --- a/src/block/StonePressurePlate.php +++ b/src/block/StonePressurePlate.php @@ -23,6 +23,13 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\entity\Entity; +use pocketmine\entity\Living; +use function array_filter; + class StonePressurePlate extends SimplePressurePlate{ + protected function filterIrrelevantEntities(array $entities) : array{ + return array_filter($entities, fn(Entity $e) => $e instanceof Living); //TODO: armor stands should activate stone plates too + } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index cb612031f4..a41c3985b6 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1114,8 +1114,20 @@ final class VanillaBlocks{ self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", new Info(BreakInfo::instant()))); $weightedPressurePlateBreakInfo = new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())); - self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); - self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); + self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy( + new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), + "Weighted Pressure Plate Heavy", + $weightedPressurePlateBreakInfo, + deactivationDelayTicks: 10, + signalStrengthFactor: 0.1 + )); + self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight( + new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), + "Weighted Pressure Plate Light", + $weightedPressurePlateBreakInfo, + deactivationDelayTicks: 10, + signalStrengthFactor: 1.0 + )); self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", new Info(BreakInfo::instant()))); $leavesBreakInfo = new Info(new class(0.2, ToolType::HOE) extends BreakInfo{ @@ -1266,7 +1278,7 @@ final class VanillaBlocks{ self::register($idName("door"), new WoodenDoor(WoodLikeBlockIdHelper::getDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); self::register($idName("button"), new WoodenButton(WoodLikeBlockIdHelper::getButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); - self::register($idName("pressure_plate"), new WoodenPressurePlate(WoodLikeBlockIdHelper::getPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType)); + self::register($idName("pressure_plate"), new WoodenPressurePlate(WoodLikeBlockIdHelper::getPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType, 20)); self::register($idName("trapdoor"), new WoodenTrapdoor(WoodLikeBlockIdHelper::getTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); [$floorSignId, $wallSignId, $signAsItem] = WoodLikeBlockIdHelper::getSignInfo($woodType); @@ -1491,7 +1503,7 @@ final class VanillaBlocks{ $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new Info(BreakInfo::pickaxe(0.5)))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())), 20)); self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); diff --git a/src/block/WeightedPressurePlate.php b/src/block/WeightedPressurePlate.php index bdfae50824..726b31f6ba 100644 --- a/src/block/WeightedPressurePlate.php +++ b/src/block/WeightedPressurePlate.php @@ -24,7 +24,40 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; +use function ceil; +use function count; +use function max; +use function min; -abstract class WeightedPressurePlate extends PressurePlate{ +class WeightedPressurePlate extends PressurePlate{ use AnalogRedstoneSignalEmitterTrait; + + private readonly float $signalStrengthFactor; + + /** + * @param float $signalStrengthFactor Number of entities on the plate is divided by this value to get signal strength + */ + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, int $deactivationDelayTicks, float $signalStrengthFactor = 1.0){ + parent::__construct($idInfo, $name, $typeInfo, $deactivationDelayTicks); + $this->signalStrengthFactor = $signalStrengthFactor; + } + + protected function hasOutputSignal() : bool{ + return $this->signalStrength > 0; + } + + protected function calculatePlateState(array $entities) : array{ + $newSignalStrength = min(15, max(0, + (int) ceil(count($entities) * $this->signalStrengthFactor) + )); + if($newSignalStrength === $this->signalStrength){ + return [$this, null]; + } + $wasActive = $this->signalStrength !== 0; + $isActive = $newSignalStrength !== 0; + return [ + (clone $this)->setOutputSignalStrength($newSignalStrength), + $wasActive !== $isActive ? $isActive : null + ]; + } } diff --git a/src/block/WeightedPressurePlateHeavy.php b/src/block/WeightedPressurePlateHeavy.php index 390297436f..9a8d1c31b9 100644 --- a/src/block/WeightedPressurePlateHeavy.php +++ b/src/block/WeightedPressurePlateHeavy.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +/** + * @deprecated + */ class WeightedPressurePlateHeavy extends WeightedPressurePlate{ } diff --git a/src/block/WeightedPressurePlateLight.php b/src/block/WeightedPressurePlateLight.php index 458c07e1a0..85c13d438c 100644 --- a/src/block/WeightedPressurePlateLight.php +++ b/src/block/WeightedPressurePlateLight.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +/** + * @deprecated + */ class WeightedPressurePlateLight extends WeightedPressurePlate{ } diff --git a/src/block/WoodenPressurePlate.php b/src/block/WoodenPressurePlate.php index baaf44c2c9..a629c2f1c7 100644 --- a/src/block/WoodenPressurePlate.php +++ b/src/block/WoodenPressurePlate.php @@ -23,11 +23,23 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\WoodType; use pocketmine\block\utils\WoodTypeTrait; class WoodenPressurePlate extends SimplePressurePlate{ use WoodTypeTrait; + public function __construct( + BlockIdentifier $idInfo, + string $name, + BlockTypeInfo $typeInfo, + WoodType $woodType, + int $deactivationDelayTicks = 20 //TODO: make this mandatory in PM6 + ){ + $this->woodType = $woodType; + parent::__construct($idInfo, $name, $typeInfo, $deactivationDelayTicks); + } + public function getFuelTime() : int{ return 300; } diff --git a/src/event/block/PressurePlateUpdateEvent.php b/src/event/block/PressurePlateUpdateEvent.php new file mode 100644 index 0000000000..485a3a6bea --- /dev/null +++ b/src/event/block/PressurePlateUpdateEvent.php @@ -0,0 +1,53 @@ +activatingEntities; } +} diff --git a/src/world/sound/PressurePlateActivateSound.php b/src/world/sound/PressurePlateActivateSound.php new file mode 100644 index 0000000000..fac24e285c --- /dev/null +++ b/src/world/sound/PressurePlateActivateSound.php @@ -0,0 +1,46 @@ +getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()) + )]; + } +} diff --git a/src/world/sound/PressurePlateDeactivateSound.php b/src/world/sound/PressurePlateDeactivateSound.php new file mode 100644 index 0000000000..895bb8b8a0 --- /dev/null +++ b/src/world/sound/PressurePlateDeactivateSound.php @@ -0,0 +1,46 @@ +getBlockTranslator()->internalIdToNetworkId($this->block->getStateId()) + )]; + } +} From beaca8bb6df5fe0d88b5ba77d5b5279b0f7222be Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 16 Aug 2023 14:51:47 +0100 Subject: [PATCH 1310/1858] EnchantTransaction: fixed XP level costs when minimum level is less than the XP cost this can happen and happens in vanilla too. In these cases, as much of the XP cost as possible is deducted. --- src/inventory/transaction/EnchantTransaction.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantTransaction.php index f3760e479a..3d9fd7e061 100644 --- a/src/inventory/transaction/EnchantTransaction.php +++ b/src/inventory/transaction/EnchantTransaction.php @@ -56,6 +56,15 @@ class EnchantTransaction extends InventoryTransaction{ } } + /** + * The selected option might be available to a player who has enough XP levels to meet the option's minimum level, + * but not enough to pay the full cost (e.g. option costs 3 levels but requires only 1 to use). As much XP as + * possible is spent in these cases. + */ + private function getAdjustedXpCost() : int{ + return min($this->cost, $this->source->getXpManager()->getXpLevel()); + } + private function validateFiniteResources(int $lapisSpent) : void{ if($lapisSpent !== $this->cost){ throw new TransactionValidationException("Expected the amount of lapis lazuli spent to be $this->cost, but received $lapisSpent"); @@ -63,12 +72,13 @@ class EnchantTransaction extends InventoryTransaction{ $xpLevel = $this->source->getXpManager()->getXpLevel(); $requiredXpLevel = $this->option->getRequiredXpLevel(); + $actualCost = $this->getAdjustedXpCost(); if($xpLevel < $requiredXpLevel){ throw new TransactionValidationException("Player's XP level $xpLevel is less than the required XP level $requiredXpLevel"); } - if($xpLevel < $this->cost){ - throw new TransactionValidationException("Player's XP level $xpLevel is less than the XP level cost $this->cost"); + if($xpLevel < $actualCost){ + throw new TransactionValidationException("Player's XP level $xpLevel is less than the XP level cost $actualCost"); } } @@ -115,7 +125,7 @@ class EnchantTransaction extends InventoryTransaction{ parent::execute(); if($this->source->hasFiniteResources()){ - $this->source->getXpManager()->subtractXpLevels($this->cost); + $this->source->getXpManager()->subtractXpLevels($this->getAdjustedXpCost()); } $this->source->setEnchantmentSeed($this->source->generateEnchantmentSeed()); } From 9f09acc07933d037af9c1f1f683ca0f3cd6a6215 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 18 Aug 2023 12:27:27 +0100 Subject: [PATCH 1311/1858] Workaround for slot IDs not changing client side when old item == new item this is a really dumb bug and seems similar to the armor bug I fixed a while ago. fixes #5987 it's unlikely that #5727 will be solved by this, but one can hope... --- src/network/mcpe/InventoryManager.php | 73 ++++++++++++++++++--------- 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index c6d83c65ee..9982ad8d3a 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -59,6 +59,7 @@ use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\ObjectSet; +use function array_fill_keys; use function array_keys; use function array_search; use function count; @@ -429,6 +430,50 @@ class InventoryManager{ unset($inventoryEntry->predictions[$slot]); } + private function sendInventorySlotPackets(int $windowId, int $netSlot, ItemStackWrapper $itemStackWrapper) : void{ + /* + * TODO: HACK! + * As of 1.20.12, the client ignores change of itemstackID in some cases when the old item == the new item. + * Notably, this happens with armor, offhand and enchanting tables, but not with main inventory. + * While we could track the items previously sent to the client, that's a waste of memory and would + * cost performance. Instead, clear the slot(s) first, then send the new item(s). + * The network cost of doing this is fortunately minimal, as an air itemstack is only 1 byte. + */ + if($itemStackWrapper->getStackId() !== 0){ + $this->session->sendDataPacket(InventorySlotPacket::create( + $windowId, + $netSlot, + new ItemStackWrapper(0, ItemStack::null()) + )); + } + //now send the real contents + $this->session->sendDataPacket(InventorySlotPacket::create( + $windowId, + $netSlot, + $itemStackWrapper + )); + } + + /** + * @param ItemStackWrapper[] $itemStackWrappers + */ + private function sendInventoryContentPackets(int $windowId, array $itemStackWrappers) : void{ + /* + * TODO: HACK! + * As of 1.20.12, the client ignores change of itemstackID in some cases when the old item == the new item. + * Notably, this happens with armor, offhand and enchanting tables, but not with main inventory. + * While we could track the items previously sent to the client, that's a waste of memory and would + * cost performance. Instead, clear the slot(s) first, then send the new item(s). + * The network cost of doing this is fortunately minimal, as an air itemstack is only 1 byte. + */ + $this->session->sendDataPacket(InventoryContentPacket::create( + $windowId, + array_fill_keys(array_keys($itemStackWrappers), new ItemStackWrapper(0, ItemStack::null())) + )); + //now send the real contents + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers)); + } + public function syncSlot(Inventory $inventory, int $slot, ItemStack $itemStack) : void{ $entry = $this->inventories[spl_object_id($inventory)] ?? null; if($entry === null){ @@ -453,24 +498,9 @@ class InventoryManager{ //This can cause a lot of problems (totems, arrows, and more...). //The workaround is to send an InventoryContentPacket instead //BDS (Bedrock Dedicated Server) also seems to work this way. - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, [$itemStackWrapper])); + $this->sendInventoryContentPackets($windowId, [$itemStackWrapper]); }else{ - if($windowId === ContainerIds::ARMOR){ - //TODO: HACK! - //When right-clicking to equip armour, the client predicts the content of the armour slot, but - //doesn't report it in the transaction packet. The server then sends an InventorySlotPacket to - //the client, assuming the slot changed for some other reason, since there is no prediction for - //the slot. - //However, later requests involving that itemstack will refer to the request ID in which the - //armour was equipped, instead of the stack ID provided by the server in the outgoing - //InventorySlotPacket. (Perhaps because the item is already the same as the client actually - //predicted, but didn't tell us?) - //We work around this bug by setting the slot to air and then back to the correct item. In - //theory, setting a different count and then back again (or changing any other property) would - //also work, but this is simpler. - $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, new ItemStackWrapper(0, ItemStack::null()))); - } - $this->session->sendDataPacket(InventorySlotPacket::create($windowId, $netSlot, $itemStackWrapper)); + $this->sendInventorySlotPackets($windowId, $netSlot, $itemStackWrapper); } unset($entry->predictions[$slot], $entry->pendingSyncs[$slot]); } @@ -497,20 +527,17 @@ class InventoryManager{ $info = $this->trackItemStack($entry, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $itemStack); } + $clearSlotWrapper = new ItemStackWrapper(0, ItemStack::null()); if($entry->complexSlotMap !== null){ foreach($contents as $slotId => $info){ $packetSlot = $entry->complexSlotMap->mapCoreToNet($slotId) ?? null; if($packetSlot === null){ continue; } - $this->session->sendDataPacket(InventorySlotPacket::create( - $windowId, - $packetSlot, - $info - )); + $this->sendInventorySlotPackets($windowId, $packetSlot, $info); } }else{ - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $contents)); + $this->sendInventoryContentPackets($windowId, $contents); } } } From b2414b4c29f54543fe2a0e1b3ecbf7bc580fdbab Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 18 Aug 2023 12:33:07 +0100 Subject: [PATCH 1312/1858] EnchantTransaction: cleanup XP cost checking logic --- .../transaction/EnchantTransaction.php | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantTransaction.php index 3d9fd7e061..5ea8a997f8 100644 --- a/src/inventory/transaction/EnchantTransaction.php +++ b/src/inventory/transaction/EnchantTransaction.php @@ -31,6 +31,7 @@ use pocketmine\item\ItemTypeIds; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use function count; +use function min; class EnchantTransaction extends InventoryTransaction{ @@ -56,15 +57,6 @@ class EnchantTransaction extends InventoryTransaction{ } } - /** - * The selected option might be available to a player who has enough XP levels to meet the option's minimum level, - * but not enough to pay the full cost (e.g. option costs 3 levels but requires only 1 to use). As much XP as - * possible is spent in these cases. - */ - private function getAdjustedXpCost() : int{ - return min($this->cost, $this->source->getXpManager()->getXpLevel()); - } - private function validateFiniteResources(int $lapisSpent) : void{ if($lapisSpent !== $this->cost){ throw new TransactionValidationException("Expected the amount of lapis lazuli spent to be $this->cost, but received $lapisSpent"); @@ -72,14 +64,12 @@ class EnchantTransaction extends InventoryTransaction{ $xpLevel = $this->source->getXpManager()->getXpLevel(); $requiredXpLevel = $this->option->getRequiredXpLevel(); - $actualCost = $this->getAdjustedXpCost(); if($xpLevel < $requiredXpLevel){ throw new TransactionValidationException("Player's XP level $xpLevel is less than the required XP level $requiredXpLevel"); } - if($xpLevel < $actualCost){ - throw new TransactionValidationException("Player's XP level $xpLevel is less than the XP level cost $actualCost"); - } + //XP level cost is intentionally not checked here, as the required level may be lower than the cost, allowing + //the option to be used with less XP than the cost - in this case, as much XP as possible will be deducted. } public function validate() : void{ @@ -125,7 +115,9 @@ class EnchantTransaction extends InventoryTransaction{ parent::execute(); if($this->source->hasFiniteResources()){ - $this->source->getXpManager()->subtractXpLevels($this->getAdjustedXpCost()); + //If the required XP level is less than the XP cost, the option can be selected with less XP than the cost. + //In this case, as much XP as possible will be taken. + $this->source->getXpManager()->subtractXpLevels(min($this->cost, $this->source->getXpManager()->getXpLevel())); } $this->source->setEnchantmentSeed($this->source->generateEnchantmentSeed()); } From 18ca3a37d92e2dcb7731bd08aa21e16bc06f4ee2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 14:51:54 +0100 Subject: [PATCH 1313/1858] CrashDump: fixed crashdump generation failure on fatal error closes #6007 --- src/crash/CrashDump.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index 40af53fd02..ded1e5d88a 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -199,6 +199,7 @@ class CrashDump{ if(($pos = strpos($error["message"], "\n")) !== false){ $error["message"] = substr($error["message"], 0, $pos); } + $error["thread"] = "Main"; } $error["message"] = mb_scrub($error["message"], 'UTF-8'); From 8572311bf4022aa445d2ff398f9a0bd94c781492 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 14:57:13 +0100 Subject: [PATCH 1314/1858] Remove dead PHPStan stub closes #6003 --- phpstan.neon.dist | 1 - tests/phpstan/stubs/phpasn1.stub | 22 ---------------------- 2 files changed, 23 deletions(-) delete mode 100644 tests/phpstan/stubs/phpasn1.stub diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 1d72511f7c..581bf41ec5 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -44,7 +44,6 @@ parameters: stubFiles: - tests/phpstan/stubs/JsonMapper.stub - tests/phpstan/stubs/leveldb.stub - - tests/phpstan/stubs/phpasn1.stub - tests/phpstan/stubs/pmmpthread.stub reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings staticReflectionClassNamePatterns: diff --git a/tests/phpstan/stubs/phpasn1.stub b/tests/phpstan/stubs/phpasn1.stub deleted file mode 100644 index b459289efb..0000000000 --- a/tests/phpstan/stubs/phpasn1.stub +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace FG\ASN1\Universal; - -class Integer -{ - /** - * @param int|string $value - */ - public function __construct($value){} - - /** @return int|string */ - public function getContent(){} -} From 7f78ec0a32de88f09bf0234cc5ba99b6b71cad95 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 16:05:59 +0100 Subject: [PATCH 1315/1858] Include PHP binary URLs in GitHub releases and build info --- .github/workflows/discord-release-embed.php | 22 ++++++++++++++++++--- .github/workflows/draft-release.yml | 21 ++++++++++++++++++-- build/generate-build-info-json.php | 7 ++++--- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/.github/workflows/discord-release-embed.php b/.github/workflows/discord-release-embed.php index 9bcb41bc8c..5acffdf2e1 100644 --- a/.github/workflows/discord-release-embed.php +++ b/.github/workflows/discord-release-embed.php @@ -18,7 +18,12 @@ require dirname(__DIR__, 2) . '/vendor/autoload.php'; /** * @phpstan-return array */ -function generateDiscordEmbed(string $version, string $channel, string $description, string $detailsUrl, string $sourceUrl, string $pharDownloadUrl, string $buildLogUrl, int $newsPingRoleId) : array{ +function generateDiscordEmbed(string $version, string $channel, string $description, string $detailsUrl, string $sourceUrl, string $pharDownloadUrl, string $buildLogUrl, int $newsPingRoleId, ?string $phpDownloadUrl) : array{ + if($phpDownloadUrl !== null){ + $phpEmbedLink = " | [PHP Binaries]($phpDownloadUrl)"; + }else{ + $phpEmbedLink = ""; + } return [ "content" => "<@&$newsPingRoleId> New PocketMine-MP release: $version ($channel)", "embeds" => [ @@ -27,7 +32,7 @@ function generateDiscordEmbed(string $version, string $channel, string $descript "description" => << $detailsUrl, "color" => $channel === "stable" ? 0x57ab5a : 0xc69026 @@ -84,10 +89,21 @@ $detailsUrl = $buildInfoJson["details_url"]; $sourceUrl = $buildInfoJson["source_url"]; $pharDownloadUrl = $buildInfoJson["download_url"]; $buildLogUrl = $buildInfoJson["build_log_url"]; +$phpBinaryUrl = $buildInfoJson["php_download_url"] ?? null; $description = $releaseInfoJson["body"]; -$discordPayload = generateDiscordEmbed($buildInfoJson["base_version"], $buildInfoJson["channel"], $description, $detailsUrl, $sourceUrl, $pharDownloadUrl, $buildLogUrl, (int) $newsPingRoleId); +$discordPayload = generateDiscordEmbed( + $buildInfoJson["base_version"], + $buildInfoJson["channel"], + $description, + $detailsUrl, + $sourceUrl, + $pharDownloadUrl, + $buildLogUrl, + (int) $newsPingRoleId, + $phpBinaryUrl +); $response = Internet::postURL( $hookURL, diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index edb8bae639..aa6fd885d0 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -11,6 +11,8 @@ jobs: runs-on: ubuntu-20.04 strategy: fail-fast: false + matrix: + php-version: [8.1] steps: - uses: actions/checkout@v3 @@ -20,7 +22,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@2.25.2 with: - php-version: 8.1 + php-version: ${{ matrix.php-version }} - name: Restore Composer package cache uses: actions/cache@v3 @@ -58,8 +60,21 @@ jobs: echo CHANGELOG_SUFFIX=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') >> $GITHUB_OUTPUT echo PRERELEASE=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "false" : "true";') >> $GITHUB_OUTPUT + - name: Generate PHP binary download URL + id: php-binary-url + run: | + echo PHP_BINARY_URL="${{ github.server_url }}/${{ github.repository_owner }}/PHP-Binaries/releases/tag/php-${{ matrix.php-version }}-latest" >> $GITHUB_OUTPUT + - name: Generate build info - run: php build/generate-build-info-json.php ${{ github.sha }} ${{ steps.get-pm-version.outputs.PM_VERSION }} ${{ github.repository }} ${{ steps.build-number.outputs.BUILD_NUMBER }} ${{ github.run_id }} > build_info.json + run: | + php build/generate-build-info-json.php \ + ${{ github.sha }} \ + ${{ steps.get-pm-version.outputs.PM_VERSION }} \ + ${{ github.repository }} \ + ${{ steps.build-number.outputs.BUILD_NUMBER }} \ + ${{ github.run_id }} \ + ${{ steps.php-binary-url.outputs.PHP_BINARY_URL }} \ + > build_info.json - name: Upload release artifacts uses: actions/upload-artifact@v3 @@ -85,4 +100,6 @@ jobs: Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}${{ steps.get-pm-version.outputs.CHANGELOG_SUFFIX }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. + :information_source: Download the recommended PHP binary [here](${{ steps.php-binary-url.outputs.PHP_BINARY_URL }}). + :warning: **4.x is now deprecated. Please read https://github.com/pmmp/PocketMine-MP/issues/5784 for details, and prepare to upgrade to 5.x.** diff --git a/build/generate-build-info-json.php b/build/generate-build-info-json.php index f0ffe7df87..b29d1c7285 100644 --- a/build/generate-build-info-json.php +++ b/build/generate-build-info-json.php @@ -23,13 +23,13 @@ declare(strict_types=1); require dirname(__DIR__) . '/vendor/autoload.php'; -if(count($argv) !== 6){ - fwrite(STDERR, "required args: \n"); +if(count($argv) !== 7){ + fwrite(STDERR, "required args: \n"); exit(1); } echo json_encode([ - "php_version" => sprintf("%d.%d", PHP_MAJOR_VERSION, PHP_MINOR_VERSION), + "php_version" => sprintf("%d.%d", PHP_MAJOR_VERSION, PHP_MINOR_VERSION), //deprecated "base_version" => \pocketmine\VersionInfo::BASE_VERSION, "build" => (int) $argv[4], "is_dev" => \pocketmine\VersionInfo::IS_DEVELOPMENT_BUILD, @@ -41,4 +41,5 @@ echo json_encode([ "download_url" => "https://github.com/$argv[3]/releases/download/$argv[2]/PocketMine-MP.phar", "source_url" => "https://github.com/$argv[3]/tree/$argv[2]", "build_log_url" => "https://github.com/$argv[3]/actions/runs/$argv[5]", + "php_download_url" => $argv[6], ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR) . "\n"; From d44e0e87d0106ff003de830a1296974cbd13e8ee Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 16:14:43 +0100 Subject: [PATCH 1316/1858] BaseSign: implement sign editing this was originally submitted by #6000, but considering the overcomplicated PR and the triviality of the feature, I figured it would be quicker to do it myself instead of having a bunch of back-and-forth bikeshedding over it. --- src/block/BaseSign.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 7f65b59f42..abb10dffed 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -159,20 +159,25 @@ abstract class BaseSign extends Transparent{ }; if($dyeColor !== null){ $color = $dyeColor->equals(DyeColor::BLACK()) ? new Color(0, 0, 0) : $dyeColor->getRgbValue(); - if($color->toARGB() === $this->text->getBaseColor()->toARGB()){ - return false; - } - - if($this->doSignChange(new SignText($this->text->getLines(), $color, $this->text->isGlowing()), $player, $item)){ + if( + $color->toARGB() !== $this->text->getBaseColor()->toARGB() && + $this->doSignChange(new SignText($this->text->getLines(), $color, $this->text->isGlowing()), $player, $item) + ){ $this->position->getWorld()->addSound($this->position, new DyeUseSound()); return true; } - }elseif($item->getTypeId() === ItemTypeIds::INK_SAC){ - return $this->changeSignGlowingState(false, $player, $item); - }elseif($item->getTypeId() === ItemTypeIds::GLOW_INK_SAC){ - return $this->changeSignGlowingState(true, $player, $item); + }elseif(match($item->getTypeId()){ + ItemTypeIds::INK_SAC => $this->changeSignGlowingState(false, $player, $item), + ItemTypeIds::GLOW_INK_SAC => $this->changeSignGlowingState(true, $player, $item), + default => false + }){ + return true; } - return false; + + //TODO: editor should not open for waxed signs + $player->openSignEditor($this->position); + + return true; } /** @@ -217,7 +222,7 @@ abstract class BaseSign extends Transparent{ } $ev = new SignChangeEvent($this, $author, new SignText(array_map(function(string $line) : string{ return TextFormat::clean($line, false); - }, $text->getLines()))); + }, $text->getLines()), $this->text->getBaseColor(), $this->text->isGlowing())); if($this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){ $ev->cancel(); } From 22778583cf8108a1007f741f86815f9d181d520a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 16:28:17 +0100 Subject: [PATCH 1317/1858] Sign: implement waxing using honeycomb --- src/block/BaseSign.php | 35 +++++++++++++++++++++++++++++++++-- src/block/tile/Sign.php | 10 +++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index abb10dffed..a3556054bf 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -49,6 +49,8 @@ abstract class BaseSign extends Transparent{ use WoodTypeTrait; protected SignText $text; + private bool $waxed = false; + protected ?int $editorEntityRuntimeId = null; /** @var \Closure() : Item */ @@ -69,6 +71,7 @@ abstract class BaseSign extends Transparent{ $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileSign){ $this->text = $tile->getText(); + $this->waxed = $tile->isWaxed(); $this->editorEntityRuntimeId = $tile->getEditorEntityRuntimeId(); } @@ -80,6 +83,7 @@ abstract class BaseSign extends Transparent{ $tile = $this->position->getWorld()->getTile($this->position); assert($tile instanceof TileSign); $tile->setText($this->text); + $tile->setWaxed($this->waxed); $tile->setEditorEntityRuntimeId($this->editorEntityRuntimeId); } @@ -147,10 +151,26 @@ abstract class BaseSign extends Transparent{ return false; } + private function wax(Player $player, Item $item) : bool{ + if($this->waxed){ + return false; + } + + $this->waxed = true; + $this->position->getWorld()->setBlock($this->position, $this); + $item->pop(); + + return true; + } + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player === null){ return false; } + if($this->waxed){ + return true; + } + $dyeColor = $item instanceof Dye ? $item->getColor() : match($item->getTypeId()){ ItemTypeIds::BONE_MEAL => DyeColor::WHITE(), ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), @@ -169,12 +189,12 @@ abstract class BaseSign extends Transparent{ }elseif(match($item->getTypeId()){ ItemTypeIds::INK_SAC => $this->changeSignGlowingState(false, $player, $item), ItemTypeIds::GLOW_INK_SAC => $this->changeSignGlowingState(true, $player, $item), + ItemTypeIds::HONEYCOMB => $this->wax($player, $item), default => false }){ return true; } - //TODO: editor should not open for waxed signs $player->openSignEditor($this->position); return true; @@ -193,6 +213,17 @@ abstract class BaseSign extends Transparent{ return $this; } + /** + * Returns whether the sign has been waxed using a honeycomb. If true, the sign cannot be edited by a player. + */ + public function isWaxed() : bool{ return $this->waxed; } + + /** @return $this */ + public function setWaxed(bool $waxed) : self{ + $this->waxed = $waxed; + return $this; + } + /** * Sets the runtime entity ID of the player editing this sign. Only this player will be able to edit the sign. * This is used to prevent multiple players from editing the same sign at the same time, and to prevent players @@ -223,7 +254,7 @@ abstract class BaseSign extends Transparent{ $ev = new SignChangeEvent($this, $author, new SignText(array_map(function(string $line) : string{ return TextFormat::clean($line, false); }, $text->getLines()), $this->text->getBaseColor(), $this->text->isGlowing())); - if($this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){ + if($this->waxed || $this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){ $ev->cancel(); } $ev->call(); diff --git a/src/block/tile/Sign.php b/src/block/tile/Sign.php index 047c547034..d5d314ee31 100644 --- a/src/block/tile/Sign.php +++ b/src/block/tile/Sign.php @@ -68,6 +68,8 @@ class Sign extends Spawnable{ } protected SignText $text; + private bool $waxed = false; + protected ?int $editorEntityRuntimeId = null; public function __construct(World $world, Vector3 $pos){ @@ -101,6 +103,7 @@ class Sign extends Spawnable{ } $this->text = new SignText($text); } + $this->waxed = $nbt->getByte(self::TAG_WAXED, 0) !== 0; } protected function writeSaveData(CompoundTag $nbt) : void{ @@ -113,6 +116,7 @@ class Sign extends Spawnable{ $nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB())); $nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0); $nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1); + $nbt->setByte(self::TAG_WAXED, $this->waxed ? 1 : 0); } public function getText() : SignText{ @@ -123,6 +127,10 @@ class Sign extends Spawnable{ $this->text = $text; } + public function isWaxed() : bool{ return $this->waxed; } + + public function setWaxed(bool $waxed) : void{ $this->waxed = $waxed; } + /** * Returns the entity runtime ID of the player who placed this sign. Only the player whose entity ID matches this * one may edit the sign text. @@ -153,7 +161,7 @@ class Sign extends Spawnable{ ->setByte(self::TAG_GLOWING_TEXT, 0) ->setByte(self::TAG_PERSIST_FORMATTING, 1) ); - $nbt->setByte(self::TAG_WAXED, 0); + $nbt->setByte(self::TAG_WAXED, $this->waxed ? 1 : 0); $nbt->setLong(self::TAG_LOCKED_FOR_EDITING_BY, $this->editorEntityRuntimeId ?? -1); } } From cd6abbe0bb3ffbfa2c1797db2971e98593305c38 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 16:30:16 +0100 Subject: [PATCH 1318/1858] BaseSign: remove redundant condition --- src/block/BaseSign.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index a3556054bf..d7a22f3b8a 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -254,7 +254,7 @@ abstract class BaseSign extends Transparent{ $ev = new SignChangeEvent($this, $author, new SignText(array_map(function(string $line) : string{ return TextFormat::clean($line, false); }, $text->getLines()), $this->text->getBaseColor(), $this->text->isGlowing())); - if($this->waxed || $this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){ + if($this->waxed || $this->editorEntityRuntimeId !== $author->getId()){ $ev->cancel(); } $ev->call(); From 9d4c37fc3ab28b0ef2097c4044e45543d0065095 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 18:26:47 +0100 Subject: [PATCH 1319/1858] Release 4.23.6 --- changelogs/4.23.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.23.md b/changelogs/4.23.md index 750261e4b0..317b6b458d 100644 --- a/changelogs/4.23.md +++ b/changelogs/4.23.md @@ -60,3 +60,9 @@ Released 9th August 2023. - Fixed `PluginBase->saveResource()` leaking file resources when the data file already exists in the plugin's data folder. This bug existed since 2014 and was only discovered recently. - Fixed coral blocks becoming dead after calling `getDropsForCompatibleTool()` on them. - Fixed `BlockDeathEvent->getOldState()` returning a block which is already dead. + +# 4.23.6 +Released 21st August 2023. + +## Fixes +- Added a workaround for armor and other inventories not working correctly after inventory sync. This is caused by a client bug. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index efcfdaaf1c..a2ff7cf93f 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.23.6"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 7aaef8cb89cddf1c01438d92c4f1aeb24b97297c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 18:26:50 +0100 Subject: [PATCH 1320/1858] 4.23.7 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a2ff7cf93f..905c168241 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.6"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.23.7"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From e852a4382116705d7558fd808f1b388666b0c0cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 18:31:45 +0100 Subject: [PATCH 1321/1858] Release 5.4.3 --- changelogs/5.4.md | 12 ++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelogs/5.4.md b/changelogs/5.4.md index bdaec51cb2..7dd95a657a 100644 --- a/changelogs/5.4.md +++ b/changelogs/5.4.md @@ -107,3 +107,15 @@ Released 9th August 2023. ## Fixes - Fixed cake accepting candle placement when slices have already been eaten. - Fixed fire charges not lighting candles. + +# 5.4.3 +Released 21st August 2023. + +## Included releases +- [4.23.6](https://github.com/pmmp/PocketMine-MP/blob/4.23.6/changelogs/4.23.md#4236) - Armor inventory client bug workaround + +## Fixes +- Fixed crashdumps not generating correctly on fatal errors. +- Fixed `PotionCauldron::setPotionItem()` not validating the item type. +- Fixed chorus fruit not considering teleport destinations below y=0. +- Fixed cake dropping itself when mined. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index bec9638ea1..82bc2d46e9 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.4.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 4cc858829f9b952b8e6df717f8ead42a6c02c88b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 21 Aug 2023 18:31:45 +0100 Subject: [PATCH 1322/1858] 5.4.4 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 82bc2d46e9..c9109487b7 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.3"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.4.4"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From d03e4d17ec79e29745e8b94ee8b6f0da9f52e9cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 14:26:17 +0100 Subject: [PATCH 1323/1858] Use hasHandlers() for events in player movement processing pathway this should offer a minor performance improvement. --- src/entity/HungerManager.php | 16 ++++++++++------ src/player/Player.php | 20 +++++++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/entity/HungerManager.php b/src/entity/HungerManager.php index 304dcd30b4..a318558918 100644 --- a/src/entity/HungerManager.php +++ b/src/entity/HungerManager.php @@ -133,14 +133,18 @@ class HungerManager{ if(!$this->enabled){ return 0; } - $ev = new PlayerExhaustEvent($this->entity, $amount, $cause); - $ev->call(); - if($ev->isCancelled()){ - return 0.0; + $evAmount = $amount; + if(PlayerExhaustEvent::hasHandlers()){ + $ev = new PlayerExhaustEvent($this->entity, $amount, $cause); + $ev->call(); + if($ev->isCancelled()){ + return 0.0; + } + $evAmount = $ev->getAmount(); } $exhaustion = $this->getExhaustion(); - $exhaustion += $ev->getAmount(); + $exhaustion += $evAmount; while($exhaustion >= 4.0){ $exhaustion -= 4.0; @@ -159,7 +163,7 @@ class HungerManager{ } $this->setExhaustion($exhaustion); - return $ev->getAmount(); + return $evAmount; } public function getFoodTickTimer() : int{ diff --git a/src/player/Player.php b/src/player/Player.php index f624852426..d34a357ee6 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1330,18 +1330,20 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $deltaAngle = abs($this->lastLocation->yaw - $to->yaw) + abs($this->lastLocation->pitch - $to->pitch); if($delta > 0.0001 || $deltaAngle > 1.0){ - $ev = new PlayerMoveEvent($this, $from, $to); + if(PlayerMoveEvent::hasHandlers()){ + $ev = new PlayerMoveEvent($this, $from, $to); - $ev->call(); + $ev->call(); - if($ev->isCancelled()){ - $this->revertMovement($from); - return; - } + if($ev->isCancelled()){ + $this->revertMovement($from); + return; + } - if($to->distanceSquared($ev->getTo()) > 0.01){ //If plugins modify the destination - $this->teleport($ev->getTo()); - return; + if($to->distanceSquared($ev->getTo()) > 0.01){ //If plugins modify the destination + $this->teleport($ev->getTo()); + return; + } } $this->lastLocation = $to; From f4d5605de13f3f67179d4d144710e98abc556376 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 14:35:53 +0100 Subject: [PATCH 1324/1858] Use hasHandlers() on more warm-hot events --- src/world/World.php | 56 ++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 3ff5632cb8..d917a3e821 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -694,16 +694,19 @@ class World implements ChunkManager{ */ public function addSound(Vector3 $pos, Sound $sound, ?array $players = null) : void{ $players ??= $this->getViewersForPosition($pos); - $ev = new WorldSoundEvent($this, $sound, $pos, $players); - $ev->call(); + if(WorldSoundEvent::hasHandlers()){ + $ev = new WorldSoundEvent($this, $sound, $pos, $players); + $ev->call(); + if($ev->isCancelled()){ + return; + } - if($ev->isCancelled()){ - return; + $sound = $ev->getSound(); + $players = $ev->getRecipients(); } - $pk = $ev->getSound()->encode($pos); - $players = $ev->getRecipients(); + $pk = $sound->encode($pos); if(count($pk) > 0){ if($players === $this->getViewersForPosition($pos)){ foreach($pk as $e){ @@ -720,23 +723,26 @@ class World implements ChunkManager{ */ public function addParticle(Vector3 $pos, Particle $particle, ?array $players = null) : void{ $players ??= $this->getViewersForPosition($pos); - $ev = new WorldParticleEvent($this, $particle, $pos, $players); - $ev->call(); + if(WorldParticleEvent::hasHandlers()){ + $ev = new WorldParticleEvent($this, $particle, $pos, $players); + $ev->call(); + if($ev->isCancelled()){ + return; + } - if($ev->isCancelled()){ - return; + $particle = $ev->getParticle(); + $players = $ev->getRecipients(); } - $pk = $ev->getParticle()->encode($pos); - $players = $ev->getRecipients(); + $pk = $particle->encode($pos); if(count($pk) > 0){ if($players === $this->getViewersForPosition($pos)){ foreach($pk as $e){ $this->broadcastPacketToViewers($pos, $e); } }else{ - NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $ev->getRecipients()), $pk); + NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $players), $pk); } } } @@ -2517,7 +2523,9 @@ class World implements ChunkManager{ } if($oldChunk === null){ - (new ChunkLoadEvent($this, $chunkX, $chunkZ, $chunk, true))->call(); + if(ChunkLoadEvent::hasHandlers()){ + (new ChunkLoadEvent($this, $chunkX, $chunkZ, $chunk, true))->call(); + } foreach($this->getChunkListeners($chunkX, $chunkZ) as $listener){ $listener->onChunkLoaded($chunkX, $chunkZ, $chunk); @@ -2791,7 +2799,9 @@ class World implements ChunkManager{ $this->initChunk($x, $z, $chunkData); - (new ChunkLoadEvent($this, $x, $z, $this->chunks[$chunkHash], false))->call(); + if(ChunkLoadEvent::hasHandlers()){ + (new ChunkLoadEvent($this, $x, $z, $this->chunks[$chunkHash], false))->call(); + } if(!$this->isChunkInUse($x, $z)){ $this->logger->debug("Newly loaded chunk $x $z has no loaders registered, will be unloaded at next available opportunity"); @@ -2904,12 +2914,14 @@ class World implements ChunkManager{ $chunk = $this->chunks[$chunkHash] ?? null; if($chunk !== null){ - $ev = new ChunkUnloadEvent($this, $x, $z, $chunk); - $ev->call(); - if($ev->isCancelled()){ - $this->timings->doChunkUnload->stopTiming(); + if(ChunkUnloadEvent::hasHandlers()){ + $ev = new ChunkUnloadEvent($this, $x, $z, $chunk); + $ev->call(); + if($ev->isCancelled()){ + $this->timings->doChunkUnload->stopTiming(); - return false; + return false; + } } if($trySave && $this->getAutoSave()){ @@ -3366,7 +3378,9 @@ class World implements ChunkManager{ } if(($oldChunk === null || !$oldChunk->isPopulated()) && $chunk->isPopulated()){ - (new ChunkPopulateEvent($this, $x, $z, $chunk))->call(); + if(ChunkPopulateEvent::hasHandlers()){ + (new ChunkPopulateEvent($this, $x, $z, $chunk))->call(); + } foreach($this->getChunkListeners($x, $z) as $listener){ $listener->onChunkPopulated($x, $z, $chunk); From df96e023dcd2fc887bcc7d06f5ce958788840ce6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 14:42:50 +0100 Subject: [PATCH 1325/1858] Require pocketmine/nbt 1.0.0 --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 5a875d218a..5f59f64d53 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", - "pocketmine/nbt": "^0.3.2", + "pocketmine/nbt": "~1.0.0", "pocketmine/raklib": "^0.15.0", "pocketmine/raklib-ipc": "^0.2.0", "pocketmine/snooze": "^0.5.0", diff --git a/composer.lock b/composer.lock index d908bca41e..c5f2018d14 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d51c1adf069760587b6d36f9c4a5db3", + "content-hash": "9237955fd97ba7c1697d80314fa9ad6f", "packages": [ { "name": "adhocore/json-comment", @@ -521,16 +521,16 @@ }, { "name": "pocketmine/nbt", - "version": "0.3.4", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/NBT.git", - "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda" + "reference": "20540271cb59e04672cb163dca73366f207974f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/NBT/zipball/62c02464c6708b2467c1e1a2af01af09d5114eda", - "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda", + "url": "https://api.github.com/repos/pmmp/NBT/zipball/20540271cb59e04672cb163dca73366f207974f1", + "reference": "20540271cb59e04672cb163dca73366f207974f1", "shasum": "" }, "require": { @@ -540,7 +540,7 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.10.3", + "phpstan/phpstan": "1.10.25", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -557,9 +557,9 @@ "description": "PHP library for working with Named Binary Tags", "support": { "issues": "https://github.com/pmmp/NBT/issues", - "source": "https://github.com/pmmp/NBT/tree/0.3.4" + "source": "https://github.com/pmmp/NBT/tree/1.0.0" }, - "time": "2023-04-10T11:31:20+00:00" + "time": "2023-07-14T13:01:49+00:00" }, { "name": "pocketmine/netresearch-jsonmapper", From 20a41b00bacda8514e97fc48bc786edc5595d534 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 15:24:29 +0100 Subject: [PATCH 1326/1858] StringToTParser: added registerAlias() --- src/utils/StringToTParser.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/utils/StringToTParser.php b/src/utils/StringToTParser.php index 0166e2a284..d98153ac15 100644 --- a/src/utils/StringToTParser.php +++ b/src/utils/StringToTParser.php @@ -58,6 +58,21 @@ abstract class StringToTParser{ $this->callbackMap[$this->reprocess($alias)] = $callback; } + /** + * Registers a new alias for an existing known alias. + */ + public function registerAlias(string $existing, string $alias) : void{ + $existingKey = $this->reprocess($existing); + if(!isset($this->callbackMap[$existingKey])){ + throw new \InvalidArgumentException("Cannot register new alias for unknown existing alias \"$existing\""); + } + $newKey = $this->reprocess($alias); + if(isset($this->callbackMap[$newKey])){ + throw new \InvalidArgumentException("Alias \"$newKey\" is already registered"); + } + $this->callbackMap[$newKey] = $this->callbackMap[$existingKey]; + } + /** * Tries to parse the specified string into a corresponding instance of T. * @phpstan-return T|null From 29fdc8b08d38ae153a932bb2820045ee37b61538 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 15:49:31 +0100 Subject: [PATCH 1327/1858] Private constructor for EnchantmentHelper --- src/item/enchantment/EnchantmentHelper.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/item/enchantment/EnchantmentHelper.php b/src/item/enchantment/EnchantmentHelper.php index bd4b689633..a427eb4a4b 100644 --- a/src/item/enchantment/EnchantmentHelper.php +++ b/src/item/enchantment/EnchantmentHelper.php @@ -43,6 +43,10 @@ use function round; final class EnchantmentHelper{ private const MAX_BOOKSHELF_COUNT = 15; + private function __construct(){ + //NOOP + } + /** * @param EnchantmentInstance[] $enchantments */ From d942748203c27546be6f37ec8818aa8cb40916b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 15:52:49 +0100 Subject: [PATCH 1328/1858] Move enchanting seed generation to EnchantmentHelper --- src/entity/Human.php | 9 ++++----- src/inventory/transaction/EnchantTransaction.php | 2 +- src/item/enchantment/EnchantmentHelper.php | 9 +++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/entity/Human.php b/src/entity/Human.php index 30142b91dc..7ee729655a 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -37,6 +37,7 @@ use pocketmine\inventory\InventoryHolder; use pocketmine\inventory\PlayerEnderInventory; use pocketmine\inventory\PlayerInventory; use pocketmine\inventory\PlayerOffHandInventory; +use pocketmine\item\enchantment\EnchantmentHelper; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\Totem; @@ -66,7 +67,6 @@ use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; use pocketmine\network\mcpe\protocol\UpdateAbilitiesPacket; use pocketmine\player\Player; -use pocketmine\utils\Limits; use pocketmine\world\sound\TotemUseSound; use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; @@ -76,7 +76,6 @@ use function array_key_exists; use function array_merge; use function array_values; use function min; -use function mt_rand; class Human extends Living implements ProjectileSource, InventoryHolder{ @@ -219,8 +218,8 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ $this->xpSeed = $seed; } - public function generateEnchantmentSeed() : int{ - return mt_rand(Limits::INT32_MIN, Limits::INT32_MAX); + public function regenerateEnchantmentSeed() : void{ + $this->xpSeed = EnchantmentHelper::generateSeed(); } public function getXpDropAmount() : int{ @@ -346,7 +345,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ if(($xpSeedTag = $nbt->getTag(self::TAG_XP_SEED)) instanceof IntTag){ $this->xpSeed = $xpSeedTag->getValue(); }else{ - $this->xpSeed = $this->generateEnchantmentSeed(); + $this->xpSeed = EnchantmentHelper::generateSeed(); } } diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantTransaction.php index 5ea8a997f8..7ddcd36c2b 100644 --- a/src/inventory/transaction/EnchantTransaction.php +++ b/src/inventory/transaction/EnchantTransaction.php @@ -119,7 +119,7 @@ class EnchantTransaction extends InventoryTransaction{ //In this case, as much XP as possible will be taken. $this->source->getXpManager()->subtractXpLevels(min($this->cost, $this->source->getXpManager()->getXpLevel())); } - $this->source->setEnchantmentSeed($this->source->generateEnchantmentSeed()); + $this->source->regenerateEnchantmentSeed(); } protected function callExecuteEvent() : bool{ diff --git a/src/item/enchantment/EnchantmentHelper.php b/src/item/enchantment/EnchantmentHelper.php index a427eb4a4b..c1e0af5bd9 100644 --- a/src/item/enchantment/EnchantmentHelper.php +++ b/src/item/enchantment/EnchantmentHelper.php @@ -28,6 +28,7 @@ use pocketmine\item\enchantment\AvailableEnchantmentRegistry as EnchantmentRegis use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; use pocketmine\item\VanillaItems as Items; +use pocketmine\utils\Limits; use pocketmine\utils\Random; use pocketmine\world\Position; use function abs; @@ -37,6 +38,7 @@ use function count; use function floor; use function max; use function min; +use function mt_rand; use function ord; use function round; @@ -47,6 +49,13 @@ final class EnchantmentHelper{ //NOOP } + /** + * Generates a new random seed for enchant option randomization. + */ + public static function generateSeed() : int{ + return mt_rand(Limits::INT32_MIN, Limits::INT32_MAX); + } + /** * @param EnchantmentInstance[] $enchantments */ From bf668c0f6ce7f1c3923cf862de30e783e4549607 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 16:07:02 +0100 Subject: [PATCH 1329/1858] Rename EnchantHelper related stuff Perhaps this and EnchantOption should be called EnchantingHelper and EnchantingOption respectively. The terminology used is rather inconsistent, but 'enchantment' definitely isn't the right word here. --- src/block/inventory/EnchantInventory.php | 4 ++-- src/command/defaults/EnchantCommand.php | 4 ++-- src/entity/Human.php | 6 +++--- src/inventory/transaction/EnchantTransaction.php | 4 ++-- .../{EnchantmentHelper.php => EnchantHelper.php} | 7 +++++-- 5 files changed, 14 insertions(+), 11 deletions(-) rename src/item/enchantment/{EnchantmentHelper.php => EnchantHelper.php} (97%) diff --git a/src/block/inventory/EnchantInventory.php b/src/block/inventory/EnchantInventory.php index 5d7e452595..7b79ef21c5 100644 --- a/src/block/inventory/EnchantInventory.php +++ b/src/block/inventory/EnchantInventory.php @@ -26,7 +26,7 @@ namespace pocketmine\block\inventory; use pocketmine\event\player\PlayerEnchantOptionsRequestEvent; use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\TemporaryInventory; -use pocketmine\item\enchantment\EnchantmentHelper as Helper; +use pocketmine\item\enchantment\EnchantHelper as Helper; use pocketmine\item\enchantment\EnchantOption; use pocketmine\item\Item; use pocketmine\world\Position; @@ -52,7 +52,7 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor foreach($this->viewers as $viewer){ $this->options = []; $item = $this->getInput(); - $options = Helper::getEnchantOptions($this->holder, $item, $viewer->getEnchantmentSeed()); + $options = Helper::generateOptions($this->holder, $item, $viewer->getEnchantmentSeed()); $event = new PlayerEnchantOptionsRequestEvent($viewer, $this, $options); $event->call(); diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 189931b99b..ea1ead1954 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -25,7 +25,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; -use pocketmine\item\enchantment\EnchantmentHelper; +use pocketmine\item\enchantment\EnchantHelper; use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; @@ -78,7 +78,7 @@ class EnchantCommand extends VanillaCommand{ } //this is necessary to deal with enchanted books, which are a different item type than regular books - $enchantedItem = EnchantmentHelper::enchantItem($item, [new EnchantmentInstance($enchantment, $level)]); + $enchantedItem = EnchantHelper::enchantItem($item, [new EnchantmentInstance($enchantment, $level)]); $player->getInventory()->setItemInHand($enchantedItem); self::broadcastCommandMessage($sender, KnownTranslationFactory::commands_enchant_success($player->getName())); diff --git a/src/entity/Human.php b/src/entity/Human.php index 7ee729655a..01da0cf9a9 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -37,7 +37,7 @@ use pocketmine\inventory\InventoryHolder; use pocketmine\inventory\PlayerEnderInventory; use pocketmine\inventory\PlayerInventory; use pocketmine\inventory\PlayerOffHandInventory; -use pocketmine\item\enchantment\EnchantmentHelper; +use pocketmine\item\enchantment\EnchantHelper; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\Totem; @@ -219,7 +219,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } public function regenerateEnchantmentSeed() : void{ - $this->xpSeed = EnchantmentHelper::generateSeed(); + $this->xpSeed = EnchantHelper::generateSeed(); } public function getXpDropAmount() : int{ @@ -345,7 +345,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ if(($xpSeedTag = $nbt->getTag(self::TAG_XP_SEED)) instanceof IntTag){ $this->xpSeed = $xpSeedTag->getValue(); }else{ - $this->xpSeed = EnchantmentHelper::generateSeed(); + $this->xpSeed = EnchantHelper::generateSeed(); } } diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantTransaction.php index 7ddcd36c2b..01e8043ec8 100644 --- a/src/inventory/transaction/EnchantTransaction.php +++ b/src/inventory/transaction/EnchantTransaction.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\inventory\transaction; use pocketmine\event\player\PlayerItemEnchantEvent; -use pocketmine\item\enchantment\EnchantmentHelper; +use pocketmine\item\enchantment\EnchantHelper; use pocketmine\item\enchantment\EnchantOption; use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; @@ -51,7 +51,7 @@ class EnchantTransaction extends InventoryTransaction{ throw new AssumptionFailedError("Expected that inputItem and outputItem are not null before validating output"); } - $enchantedInput = EnchantmentHelper::enchantItem($this->inputItem, $this->option->getEnchantments()); + $enchantedInput = EnchantHelper::enchantItem($this->inputItem, $this->option->getEnchantments()); if(!$this->outputItem->equalsExact($enchantedInput)){ throw new TransactionValidationException("Invalid output item"); } diff --git a/src/item/enchantment/EnchantmentHelper.php b/src/item/enchantment/EnchantHelper.php similarity index 97% rename from src/item/enchantment/EnchantmentHelper.php rename to src/item/enchantment/EnchantHelper.php index c1e0af5bd9..23ac11ddbd 100644 --- a/src/item/enchantment/EnchantmentHelper.php +++ b/src/item/enchantment/EnchantHelper.php @@ -42,7 +42,10 @@ use function mt_rand; use function ord; use function round; -final class EnchantmentHelper{ +/** + * Helper methods used for enchanting using the enchanting table. + */ +final class EnchantHelper{ private const MAX_BOOKSHELF_COUNT = 15; private function __construct(){ @@ -72,7 +75,7 @@ final class EnchantmentHelper{ /** * @return EnchantOption[] */ - public static function getEnchantOptions(Position $tablePos, Item $input, int $seed) : array{ + public static function generateOptions(Position $tablePos, Item $input, int $seed) : array{ if($input->isNull() || $input->hasEnchantments()){ return []; } From 1504fdca248b72c2f842cf62c9351f916fdf8baf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 16:14:17 +0100 Subject: [PATCH 1330/1858] Use 'enchanting' terminology 'enchant' just didn't feel right, being a verb. All these things pertain to the act of enchanting. This is now also consistent with CraftingTransaction etc. The ship already sailed on EnchantInventory, which will have to be renamed at a later datte. However, that was already inconsistent with 'enchanting table', so that's the odd one out here. --- src/block/inventory/EnchantInventory.php | 12 ++++++------ src/command/defaults/EnchantCommand.php | 4 ++-- src/entity/Human.php | 6 +++--- ...=> PlayerEnchantingOptionsRequestEvent.php} | 18 +++++++++--------- src/event/player/PlayerItemEnchantEvent.php | 12 ++++++------ ...ansaction.php => EnchantingTransaction.php} | 10 +++++----- ...{EnchantHelper.php => EnchantingHelper.php} | 14 +++++++------- ...{EnchantOption.php => EnchantingOption.php} | 2 +- src/network/mcpe/InventoryManager.php | 4 ++-- .../mcpe/handler/ItemStackRequestExecutor.php | 6 +++--- 10 files changed, 44 insertions(+), 44 deletions(-) rename src/event/player/{PlayerEnchantOptionsRequestEvent.php => PlayerEnchantingOptionsRequestEvent.php} (78%) rename src/inventory/transaction/{EnchantTransaction.php => EnchantingTransaction.php} (93%) rename src/item/enchantment/{EnchantHelper.php => EnchantingHelper.php} (93%) rename src/item/enchantment/{EnchantOption.php => EnchantingOption.php} (98%) diff --git a/src/block/inventory/EnchantInventory.php b/src/block/inventory/EnchantInventory.php index 7b79ef21c5..b726dbedf3 100644 --- a/src/block/inventory/EnchantInventory.php +++ b/src/block/inventory/EnchantInventory.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\inventory; -use pocketmine\event\player\PlayerEnchantOptionsRequestEvent; +use pocketmine\event\player\PlayerEnchantingOptionsRequestEvent; use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\TemporaryInventory; -use pocketmine\item\enchantment\EnchantHelper as Helper; -use pocketmine\item\enchantment\EnchantOption; +use pocketmine\item\enchantment\EnchantingHelper as Helper; +use pocketmine\item\enchantment\EnchantingOption; use pocketmine\item\Item; use pocketmine\world\Position; use function array_values; @@ -39,7 +39,7 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor public const SLOT_INPUT = 0; public const SLOT_LAPIS = 1; - /** @var EnchantOption[] $options */ + /** @var EnchantingOption[] $options */ private array $options = []; public function __construct(Position $holder){ @@ -54,7 +54,7 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor $item = $this->getInput(); $options = Helper::generateOptions($this->holder, $item, $viewer->getEnchantmentSeed()); - $event = new PlayerEnchantOptionsRequestEvent($viewer, $this, $options); + $event = new PlayerEnchantingOptionsRequestEvent($viewer, $this, $options); $event->call(); if(!$event->isCancelled() && count($event->getOptions()) > 0){ $this->options = array_values($event->getOptions()); @@ -79,7 +79,7 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor return $option === null ? null : Helper::enchantItem($this->getInput(), $option->getEnchantments()); } - public function getOption(int $optionId) : ?EnchantOption{ + public function getOption(int $optionId) : ?EnchantingOption{ return $this->options[$optionId] ?? null; } } diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index ea1ead1954..191a146b03 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -25,7 +25,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; -use pocketmine\item\enchantment\EnchantHelper; +use pocketmine\item\enchantment\EnchantingHelper; use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; @@ -78,7 +78,7 @@ class EnchantCommand extends VanillaCommand{ } //this is necessary to deal with enchanted books, which are a different item type than regular books - $enchantedItem = EnchantHelper::enchantItem($item, [new EnchantmentInstance($enchantment, $level)]); + $enchantedItem = EnchantingHelper::enchantItem($item, [new EnchantmentInstance($enchantment, $level)]); $player->getInventory()->setItemInHand($enchantedItem); self::broadcastCommandMessage($sender, KnownTranslationFactory::commands_enchant_success($player->getName())); diff --git a/src/entity/Human.php b/src/entity/Human.php index 01da0cf9a9..f2c4c7a740 100644 --- a/src/entity/Human.php +++ b/src/entity/Human.php @@ -37,7 +37,7 @@ use pocketmine\inventory\InventoryHolder; use pocketmine\inventory\PlayerEnderInventory; use pocketmine\inventory\PlayerInventory; use pocketmine\inventory\PlayerOffHandInventory; -use pocketmine\item\enchantment\EnchantHelper; +use pocketmine\item\enchantment\EnchantingHelper; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\Totem; @@ -219,7 +219,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ } public function regenerateEnchantmentSeed() : void{ - $this->xpSeed = EnchantHelper::generateSeed(); + $this->xpSeed = EnchantingHelper::generateSeed(); } public function getXpDropAmount() : int{ @@ -345,7 +345,7 @@ class Human extends Living implements ProjectileSource, InventoryHolder{ if(($xpSeedTag = $nbt->getTag(self::TAG_XP_SEED)) instanceof IntTag){ $this->xpSeed = $xpSeedTag->getValue(); }else{ - $this->xpSeed = EnchantHelper::generateSeed(); + $this->xpSeed = EnchantingHelper::generateSeed(); } } diff --git a/src/event/player/PlayerEnchantOptionsRequestEvent.php b/src/event/player/PlayerEnchantingOptionsRequestEvent.php similarity index 78% rename from src/event/player/PlayerEnchantOptionsRequestEvent.php rename to src/event/player/PlayerEnchantingOptionsRequestEvent.php index d0448bfd8e..833185f760 100644 --- a/src/event/player/PlayerEnchantOptionsRequestEvent.php +++ b/src/event/player/PlayerEnchantingOptionsRequestEvent.php @@ -27,7 +27,7 @@ use pocketmine\block\inventory\EnchantInventory; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; use pocketmine\event\Event; -use pocketmine\item\enchantment\EnchantOption; +use pocketmine\item\enchantment\EnchantingOption; use pocketmine\player\Player; use pocketmine\utils\Utils; use function count; @@ -36,36 +36,36 @@ use function count; * Called when a player inserts an item into an enchanting table's input slot. * The options provided by the event will be shown on the enchanting table menu. */ -class PlayerEnchantOptionsRequestEvent extends PlayerEvent implements Cancellable{ +class PlayerEnchantingOptionsRequestEvent extends PlayerEvent implements Cancellable{ use CancellableTrait; /** - * @param EnchantOption[] $options + * @param EnchantingOption[] $options */ public function __construct( Player $player, - private readonly EnchantInventory $enchantInventory, + private readonly EnchantInventory $inventory, private array $options ){ $this->player = $player; } - public function getEnchantInventory() : EnchantInventory{ - return $this->enchantInventory; + public function getInventory() : EnchantInventory{ + return $this->inventory; } /** - * @return EnchantOption[] + * @return EnchantingOption[] */ public function getOptions() : array{ return $this->options; } /** - * @param EnchantOption[] $options + * @param EnchantingOption[] $options */ public function setOptions(array $options) : void{ - Utils::validateArrayValueType($options, function(EnchantOption $_) : void{ }); + Utils::validateArrayValueType($options, function(EnchantingOption $_) : void{ }); if(($optionCount = count($options)) > 3){ throw new \LogicException("The maximum number of options for an enchanting table is 3, but $optionCount have been passed"); } diff --git a/src/event/player/PlayerItemEnchantEvent.php b/src/event/player/PlayerItemEnchantEvent.php index 9974ab40a2..76151384d3 100644 --- a/src/event/player/PlayerItemEnchantEvent.php +++ b/src/event/player/PlayerItemEnchantEvent.php @@ -25,8 +25,8 @@ namespace pocketmine\event\player; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; -use pocketmine\inventory\transaction\EnchantTransaction; -use pocketmine\item\enchantment\EnchantOption; +use pocketmine\inventory\transaction\EnchantingTransaction; +use pocketmine\item\enchantment\EnchantingOption; use pocketmine\item\Item; use pocketmine\player\Player; @@ -38,8 +38,8 @@ class PlayerItemEnchantEvent extends PlayerEvent implements Cancellable{ public function __construct( Player $player, - private readonly EnchantTransaction $transaction, - private readonly EnchantOption $option, + private readonly EnchantingTransaction $transaction, + private readonly EnchantingOption $option, private readonly Item $inputItem, private readonly Item $outputItem, private readonly int $cost @@ -50,14 +50,14 @@ class PlayerItemEnchantEvent extends PlayerEvent implements Cancellable{ /** * Returns the inventory transaction involved in this enchant event. */ - public function getTransaction() : EnchantTransaction{ + public function getTransaction() : EnchantingTransaction{ return $this->transaction; } /** * Returns the enchantment option used. */ - public function getOption() : EnchantOption{ + public function getOption() : EnchantingOption{ return $this->option; } diff --git a/src/inventory/transaction/EnchantTransaction.php b/src/inventory/transaction/EnchantingTransaction.php similarity index 93% rename from src/inventory/transaction/EnchantTransaction.php rename to src/inventory/transaction/EnchantingTransaction.php index 01e8043ec8..d00df97e21 100644 --- a/src/inventory/transaction/EnchantTransaction.php +++ b/src/inventory/transaction/EnchantingTransaction.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace pocketmine\inventory\transaction; use pocketmine\event\player\PlayerItemEnchantEvent; -use pocketmine\item\enchantment\EnchantHelper; -use pocketmine\item\enchantment\EnchantOption; +use pocketmine\item\enchantment\EnchantingHelper; +use pocketmine\item\enchantment\EnchantingOption; use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; use pocketmine\player\Player; @@ -33,14 +33,14 @@ use pocketmine\utils\AssumptionFailedError; use function count; use function min; -class EnchantTransaction extends InventoryTransaction{ +class EnchantingTransaction extends InventoryTransaction{ private ?Item $inputItem = null; private ?Item $outputItem = null; public function __construct( Player $source, - private readonly EnchantOption $option, + private readonly EnchantingOption $option, private readonly int $cost ){ parent::__construct($source); @@ -51,7 +51,7 @@ class EnchantTransaction extends InventoryTransaction{ throw new AssumptionFailedError("Expected that inputItem and outputItem are not null before validating output"); } - $enchantedInput = EnchantHelper::enchantItem($this->inputItem, $this->option->getEnchantments()); + $enchantedInput = EnchantingHelper::enchantItem($this->inputItem, $this->option->getEnchantments()); if(!$this->outputItem->equalsExact($enchantedInput)){ throw new TransactionValidationException("Invalid output item"); } diff --git a/src/item/enchantment/EnchantHelper.php b/src/item/enchantment/EnchantingHelper.php similarity index 93% rename from src/item/enchantment/EnchantHelper.php rename to src/item/enchantment/EnchantingHelper.php index 23ac11ddbd..fb4e8f27ce 100644 --- a/src/item/enchantment/EnchantHelper.php +++ b/src/item/enchantment/EnchantingHelper.php @@ -45,7 +45,7 @@ use function round; /** * Helper methods used for enchanting using the enchanting table. */ -final class EnchantHelper{ +final class EnchantingHelper{ private const MAX_BOOKSHELF_COUNT = 15; private function __construct(){ @@ -73,7 +73,7 @@ final class EnchantHelper{ } /** - * @return EnchantOption[] + * @return EnchantingOption[] */ public static function generateOptions(Position $tablePos, Item $input, int $seed) : array{ if($input->isNull() || $input->hasEnchantments()){ @@ -89,9 +89,9 @@ final class EnchantHelper{ $bottomRequiredLevel = max($baseRequiredLevel, $bookshelfCount * 2); return [ - self::createEnchantOption($random, $input, $topRequiredLevel), - self::createEnchantOption($random, $input, $middleRequiredLevel), - self::createEnchantOption($random, $input, $bottomRequiredLevel), + self::createOption($random, $input, $topRequiredLevel), + self::createOption($random, $input, $middleRequiredLevel), + self::createOption($random, $input, $bottomRequiredLevel), ]; } @@ -133,7 +133,7 @@ final class EnchantHelper{ return $bookshelfCount; } - private static function createEnchantOption(Random $random, Item $inputItem, int $requiredXpLevel) : EnchantOption{ + private static function createOption(Random $random, Item $inputItem, int $requiredXpLevel) : EnchantingOption{ $enchantingPower = $requiredXpLevel; $enchantability = $inputItem->getEnchantability(); @@ -171,7 +171,7 @@ final class EnchantHelper{ } } - return new EnchantOption($requiredXpLevel, self::getRandomOptionName($random), $resultEnchantments); + return new EnchantingOption($requiredXpLevel, self::getRandomOptionName($random), $resultEnchantments); } /** diff --git a/src/item/enchantment/EnchantOption.php b/src/item/enchantment/EnchantingOption.php similarity index 98% rename from src/item/enchantment/EnchantOption.php rename to src/item/enchantment/EnchantingOption.php index b1c3a7af5a..2bedb0cc41 100644 --- a/src/item/enchantment/EnchantOption.php +++ b/src/item/enchantment/EnchantingOption.php @@ -27,7 +27,7 @@ namespace pocketmine\item\enchantment; * Represents an option on the enchanting table menu. * If selected, all the enchantments in the option will be applied to the item. */ -class EnchantOption{ +class EnchantingOption{ /** * @param EnchantmentInstance[] $enchantments diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 8bdce489a3..ebbd711468 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -39,8 +39,8 @@ use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\inventory\Inventory; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\inventory\transaction\InventoryTransaction; +use pocketmine\item\enchantment\EnchantingOption; use pocketmine\item\enchantment\EnchantmentInstance; -use pocketmine\item\enchantment\EnchantOption; use pocketmine\network\mcpe\cache\CreativeInventoryCache; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; @@ -645,7 +645,7 @@ class InventoryManager{ } /** - * @param EnchantOption[] $options + * @param EnchantingOption[] $options */ public function syncEnchantingTableOptions(array $options) : void{ $protocolOptions = []; diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 8273068ab2..a36ae9f405 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -29,7 +29,7 @@ use pocketmine\inventory\transaction\action\CreateItemAction; use pocketmine\inventory\transaction\action\DestroyItemAction; use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\CraftingTransaction; -use pocketmine\inventory\transaction\EnchantTransaction; +use pocketmine\inventory\transaction\EnchantingTransaction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionBuilder; use pocketmine\inventory\transaction\TransactionBuilderInventory; @@ -289,7 +289,7 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ private function assertDoingCrafting() : void{ - if(!$this->specialTransaction instanceof CraftingTransaction && !$this->specialTransaction instanceof EnchantTransaction){ + if(!$this->specialTransaction instanceof CraftingTransaction && !$this->specialTransaction instanceof EnchantingTransaction){ if($this->specialTransaction === null){ throw new ItemStackRequestProcessException("Expected CraftRecipe or CraftRecipeAuto action to precede this action"); }else{ @@ -339,7 +339,7 @@ class ItemStackRequestExecutor{ if($window instanceof EnchantInventory){ $optionId = $this->inventoryManager->getEnchantingTableOptionIndex($action->getRecipeId()); if($optionId !== null && ($option = $window->getOption($optionId)) !== null){ - $this->specialTransaction = new EnchantTransaction($this->player, $option, $optionId + 1); + $this->specialTransaction = new EnchantingTransaction($this->player, $option, $optionId + 1); $this->setNextCreatedItem($window->getOutput($optionId)); } }else{ From 998fcf20dba652991b9d194f5217b6a02d155472 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 16:52:22 +0100 Subject: [PATCH 1331/1858] Remove useless Cancellable from PressurePlateUpdateEvent --- src/event/block/PressurePlateUpdateEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/block/PressurePlateUpdateEvent.php b/src/event/block/PressurePlateUpdateEvent.php index 485a3a6bea..eefade9353 100644 --- a/src/event/block/PressurePlateUpdateEvent.php +++ b/src/event/block/PressurePlateUpdateEvent.php @@ -31,7 +31,7 @@ use pocketmine\event\Cancellable; * Called whenever the list of entities on a pressure plate changes. * Depending on the type of pressure plate, this might turn on/off its signal, or change the signal strength. */ -final class PressurePlateUpdateEvent extends BaseBlockChangeEvent implements Cancellable{ +final class PressurePlateUpdateEvent extends BaseBlockChangeEvent{ /** * @param Entity[] $activatingEntities */ From f4e1c31dcf4dccb9b7c517e4540ed2edd9f249c0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 16:52:47 +0100 Subject: [PATCH 1332/1858] Change some weird constant names --- src/item/enchantment/AvailableEnchantmentRegistry.php | 6 +++--- src/item/enchantment/IncompatibleEnchantmentGroups.php | 2 +- src/item/enchantment/IncompatibleEnchantmentRegistry.php | 2 +- src/item/enchantment/ItemEnchantmentTagRegistry.php | 4 ++-- src/item/enchantment/ItemEnchantmentTags.php | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/item/enchantment/AvailableEnchantmentRegistry.php b/src/item/enchantment/AvailableEnchantmentRegistry.php index af8484049a..2c6f421ede 100644 --- a/src/item/enchantment/AvailableEnchantmentRegistry.php +++ b/src/item/enchantment/AvailableEnchantmentRegistry.php @@ -59,9 +59,9 @@ final class AvailableEnchantmentRegistry{ $this->register(Enchantments::SHARPNESS(), [Tags::SWORD, Tags::AXE], []); $this->register(Enchantments::KNOCKBACK(), [Tags::SWORD], []); $this->register(Enchantments::FIRE_ASPECT(), [Tags::SWORD], []); - $this->register(Enchantments::EFFICIENCY(), [Tags::DIG_TOOLS], [Tags::SHEARS]); - $this->register(Enchantments::FORTUNE(), [Tags::DIG_TOOLS], []); - $this->register(Enchantments::SILK_TOUCH(), [Tags::DIG_TOOLS], [Tags::SHEARS]); + $this->register(Enchantments::EFFICIENCY(), [Tags::BLOCK_TOOLS], [Tags::SHEARS]); + $this->register(Enchantments::FORTUNE(), [Tags::BLOCK_TOOLS], []); + $this->register(Enchantments::SILK_TOUCH(), [Tags::BLOCK_TOOLS], [Tags::SHEARS]); $this->register( Enchantments::UNBREAKING(), [Tags::ARMOR, Tags::WEAPONS, Tags::FISHING_ROD], diff --git a/src/item/enchantment/IncompatibleEnchantmentGroups.php b/src/item/enchantment/IncompatibleEnchantmentGroups.php index ed1141beea..74574562c5 100644 --- a/src/item/enchantment/IncompatibleEnchantmentGroups.php +++ b/src/item/enchantment/IncompatibleEnchantmentGroups.php @@ -30,5 +30,5 @@ namespace pocketmine\item\enchantment; final class IncompatibleEnchantmentGroups{ public const PROTECTION = "protection"; public const BOW_INFINITE = "bow_infinite"; - public const DIG_DROP = "dig_drop"; + public const BLOCK_DROPS = "block_drops"; } diff --git a/src/item/enchantment/IncompatibleEnchantmentRegistry.php b/src/item/enchantment/IncompatibleEnchantmentRegistry.php index 8dce4777e1..629a159709 100644 --- a/src/item/enchantment/IncompatibleEnchantmentRegistry.php +++ b/src/item/enchantment/IncompatibleEnchantmentRegistry.php @@ -46,7 +46,7 @@ final class IncompatibleEnchantmentRegistry{ private function __construct(){ $this->register(Groups::PROTECTION, [Enchantments::PROTECTION(), Enchantments::FIRE_PROTECTION(), Enchantments::BLAST_PROTECTION(), Enchantments::PROJECTILE_PROTECTION()]); $this->register(Groups::BOW_INFINITE, [Enchantments::INFINITY(), Enchantments::MENDING()]); - $this->register(Groups::DIG_DROP, [Enchantments::FORTUNE(), Enchantments::SILK_TOUCH()]); + $this->register(Groups::BLOCK_DROPS, [Enchantments::FORTUNE(), Enchantments::SILK_TOUCH()]); } /** diff --git a/src/item/enchantment/ItemEnchantmentTagRegistry.php b/src/item/enchantment/ItemEnchantmentTagRegistry.php index 9c607f9d28..210cd8e864 100644 --- a/src/item/enchantment/ItemEnchantmentTagRegistry.php +++ b/src/item/enchantment/ItemEnchantmentTagRegistry.php @@ -56,7 +56,7 @@ final class ItemEnchantmentTagRegistry{ $this->register(Tags::CROSSBOW); $this->register(Tags::SHEARS); $this->register(Tags::FLINT_AND_STEEL); - $this->register(Tags::DIG_TOOLS, [Tags::AXE, Tags::PICKAXE, Tags::SHOVEL, Tags::HOE]); + $this->register(Tags::BLOCK_TOOLS, [Tags::AXE, Tags::PICKAXE, Tags::SHOVEL, Tags::HOE]); $this->register(Tags::FISHING_ROD); $this->register(Tags::CARROT_ON_STICK); $this->register(Tags::COMPASS); @@ -68,7 +68,7 @@ final class ItemEnchantmentTagRegistry{ Tags::TRIDENT, Tags::BOW, Tags::CROSSBOW, - Tags::DIG_TOOLS, + Tags::BLOCK_TOOLS, ]); } diff --git a/src/item/enchantment/ItemEnchantmentTags.php b/src/item/enchantment/ItemEnchantmentTags.php index 485cb5d0c1..50abf8db3b 100644 --- a/src/item/enchantment/ItemEnchantmentTags.php +++ b/src/item/enchantment/ItemEnchantmentTags.php @@ -42,7 +42,7 @@ final class ItemEnchantmentTags{ public const CROSSBOW = "crossbow"; public const SHEARS = "shears"; public const FLINT_AND_STEEL = "flint_and_steel"; - public const DIG_TOOLS = "dig_tools"; + public const BLOCK_TOOLS = "block_tools"; public const AXE = "axe"; public const PICKAXE = "pickaxe"; public const SHOVEL = "shovel"; From 923f7561fbcebed82955df80ed76a6ee6e384345 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 16:53:09 +0100 Subject: [PATCH 1333/1858] Enchantment: added @see tags to @deprecated methods --- src/item/enchantment/Enchantment.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/item/enchantment/Enchantment.php b/src/item/enchantment/Enchantment.php index 22c0cdb015..948f4648bc 100644 --- a/src/item/enchantment/Enchantment.php +++ b/src/item/enchantment/Enchantment.php @@ -83,6 +83,7 @@ class Enchantment{ * Returns a bitset indicating what item types can have this item applied from an enchanting table. * * @deprecated + * @see AvailableEnchantmentRegistry::getPrimaryItemTags() */ public function getPrimaryItemFlags() : int{ return $this->primaryItemFlags; @@ -93,6 +94,7 @@ class Enchantment{ * an anvil. * * @deprecated + * @see AvailableEnchantmentRegistry::getSecondaryItemTags() */ public function getSecondaryItemFlags() : int{ return $this->secondaryItemFlags; @@ -102,6 +104,7 @@ class Enchantment{ * Returns whether this enchantment can apply to the item type from an enchanting table. * * @deprecated + * @see AvailableEnchantmentRegistry */ public function hasPrimaryItemType(int $flag) : bool{ return ($this->primaryItemFlags & $flag) !== 0; @@ -111,6 +114,7 @@ class Enchantment{ * Returns whether this enchantment can apply to the item type from an anvil, if it is not a primary item. * * @deprecated + * @see AvailableEnchantmentRegistry */ public function hasSecondaryItemType(int $flag) : bool{ return ($this->secondaryItemFlags & $flag) !== 0; From 8814d06dfd0ce9702c784c95aff1adb87349f985 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 17:00:18 +0100 Subject: [PATCH 1334/1858] Fix CS --- src/event/block/PressurePlateUpdateEvent.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/event/block/PressurePlateUpdateEvent.php b/src/event/block/PressurePlateUpdateEvent.php index eefade9353..e6f2e92ba4 100644 --- a/src/event/block/PressurePlateUpdateEvent.php +++ b/src/event/block/PressurePlateUpdateEvent.php @@ -25,7 +25,6 @@ namespace pocketmine\event\block; use pocketmine\block\Block; use pocketmine\entity\Entity; -use pocketmine\event\Cancellable; /** * Called whenever the list of entities on a pressure plate changes. From c8100480ac494562fff12bbe905d73be109e1f12 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 17:09:34 +0100 Subject: [PATCH 1335/1858] Release 5.5.0-BETA1 --- changelogs/5.5-beta.md | 156 +++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +- 2 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 changelogs/5.5-beta.md diff --git a/changelogs/5.5-beta.md b/changelogs/5.5-beta.md new file mode 100644 index 0000000000..efd1c822cd --- /dev/null +++ b/changelogs/5.5-beta.md @@ -0,0 +1,156 @@ +# 5.5.0-BETA1 +Released 23rd August 2023. + +**For Minecraft: Bedrock Edition 1.20.0** + +This is a minor feature release, including performance improvements, new API methods, and new gameplay features. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## Dependencies +- Updated `pocketmine/math` dependency to [`1.0.0`](https://github.com/pmmp/Math/releases/tag/1.0.0). +- Updated `pocketmine/nbt` dependency to [`1.0.0`](https://github.com/pmmp/NBT/releases/tag/1.0.0). + +## Performance +- Some events are now no longer fired if no handlers are registered. + - This improves performance by avoiding unnecessary object allocations and function calls. + - Events such as `DataPacketReceiveEvent`, `DataPacketSendEvent` and `PlayerMoveEvent` are optimized away almost completely by this change, offering some much-needed performance gains. +- Significantly improved performance of small moving entities, such as dropped items. + - This was achieved by a combination of changes, which together improved observed performance with 2000 item entities moving in water by 30-40%. + - The benefit of this will be most noticeable in SkyBlock servers, where large cactus farms can generate thousands of dropped items. +- `World->getCollisionBoxes()` now uses an improved search method, which reduces the work done by the function by almost 90% for small entities. + - This improves performance of collision detection for small entities, such as dropped items. + +## Gameplay +### General +- Implemented enchanting using an enchanting table (yes, finally!) + - Thanks to [@S3v3Nice](https://github.com/S3v3Nice) for investing lots of time and effort into developing this. + - Since this feature is quite complex, it's possible there may be bugs. Please be vigilant and report any issues you find. + +### Blocks +- The following new blocks have been implemented: + - Pink Petals +- Pressure plates are now functional, in the sense that they react when entities stand on them and perform the correct logic. + - Note that since redstone is not yet implemented, pressure plates do not activate any redstone devices, similar to buttons and levers. +- Signs can now be edited by right-clicking them. +- Signs can now be waxed using a honeycomb, which prevents them from being edited. + +### Items +- The following new items have been implemented: + - Enchanted Book + +## API +### `pocketmine\block` +- The following new API methods have been added: + - `public Block->getEnchantmentTags() : list` returns a list of strings indicating which types of enchantment can be applied to the block when in item form + - `public BlockTypeInfo->getEnchantmentTags() : list` + - `protected PressurePlate->getActivationBox() : AxisAlignedBB` - returns the AABB entities must intersect with in order to activate the pressure plate (not the same as the visual shape) + - `protected PressurePlate->hasOutputSignal() : bool` - returns whether the pressure plate has an output signal - this should be implemented by subclasses + - `protected PressurePlate->calculatePlateState() : array{Block, ?bool}` - returns the state the pressure plate will change to if the given list of entities are standing on it, and a bool indicating whether the plate activated or deactivated this tick + - `protected PressurePlate->filterIrrelevantEntities(list $entities) : list` - returns the given list filtered of entities that don't affect the plate's state (e.g. dropped items don't affect stone pressure plates) + - `public BaseSign->isWaxed() : bool` + - `public BaseSign->setWaxed(bool $waxed) : $this` + - `public inventory\EnchantInventory->getInput() : Item` + - `public inventory\EnchantInventory->getLapis() : Item` + - `public inventory\EnchantInventory->getOutput(int $optionId) : ?Item` - returns the item that would be produced if the input item was enchanted with the selected option, or `null` if the option is invalid + - `public inventory\EnchantInventory->getOption(int $optionId) : EnchantOption` - returns the enchanting option at the given index +- The following API methods have signature changes: + - `BlockTypeInfo->__construct()` now accepts an optional `list $enchantmentTags` parameter + - `PressurePlate->__construct()` now accepts an optional `int $deactivationDelayTicks` parameter + - `WeightedPressurePlate->__construct()` now accepts optional `int $deactivationDelayTicks` and `float $signalStrengthFactor` parameters + - `SimplePressurePlate->__construct()` now accepts an optional `int $deactivationDelayTicks` parameter +- The following new classes have been added: + - `PinkPetals` + - `utils\BlockEventHelper` - provides helper methods for calling block-related events +- The following classes have been deprecated: + - `WeightedPressurePlateLight` + - `WeightedPressurePlateHeavy` + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Human->getEnchantmentSeed() : int` - returns the current seed used to randomize options shown on the enchanting table for this human + - `public Human->setEnchantmentSeed(int $seed) : void` + - `public Human->regenerateEnchantmentSeed() : void` - returns a new randomly generated seed which can be set with `setEnchantmentSeed()` + +### `pocketmine\event` +- The following new classes have been added: + - `block\FarmlandHydrationChangeEvent` - called when farmland is hydrated or dehydrated + - `block\PressurePlateUpdateEvent` - called when a pressure plate is activated or changes its power output + - `player\PlayerEnchantingOptionsRequestEvent` - called when a player puts an item to be enchanted into an enchanting table, to allow plugins to modify the enchanting options shown + - `player\PlayerItemEnchantEvent` - called when a player enchants an item in an enchanting table + - `world\WorldDifficultyChangeEvent` - called when a world's difficulty is changed +- The following new API methods have been added: + - `public static Event::hasHandlers() : bool` - returns whether the event class has any registered handlers - used like `SomeEvent::hasHandlers()` + - `public HandlerListManager->getHandlersFor(class-string $event) : list` - returns a list of all registered listeners for the given event class, using cache if available + +### `pocketmine\inventory\transaction` +- The following new classes have been added: + - `EnchantingTransaction` - used when a player enchants an item in an enchanting table + +### `pocketmine\item` +- The following new API methods have been added: + - `public Armor->getMaterial() : ArmorMaterial` - returns an object containing properties shared by all items of the same armor material + - `public ArmorTypeInfo->getMaterial() : ArmorMaterial` + - `public Item->getEnchantability() : int` - returns the enchantability value of the item - higher values increase the chance of more powerful enchantments being offered by an enchanting table + - `public Item->getEnchantmentTags() : list` - returns a list of strings indicating which types of enchantment can be applied to the item + - `public ToolTier->getEnchantability() : int` +- The following API methods have signature changes: + - `Item->__construct()` now accepts an optional `list $enchantmentTags` parameter + - `ArmorTypeInfo->__construct()` now accepts an optional `?ArmorMaterial $material` parameter +- The following new classes have been added: + - `ArmorMaterial` - container for shared armor properties + - `VanillaArmorMaterials` - all vanilla armor materials + - `EnchantedBook` - represents an enchanted book item + +### `pocketmine\item\enchantment` +- The following new classes have been added: + - `AvailableEnchantmentRegistry` - enchantments to be displayed on the enchanting table are selected from here - custom enchantments may be added + - `EnchantingHelper` - static class containing various helper methods for enchanting tables + - `EnchantingOption` - represents an option on the enchanting table menu + - `IncompatibleEnchantmentGroups` - list of constants naming groups of enchantments that are incompatible with each other - custom enchantments may be added using these group names to make them incompatible with existing enchantments in the same group + - `IncompatibleEnchantmentRegistry` - manages which enchantments are considered incompatible with each other - custom enchantments may be added using existing group names to make them incompatible with existing enchantments in the same group, or to entirely new groups + - `ItemEnchantmentTagRegistry` - manages item enchantment compatibility tags and which tags include which other tags + - `ItemEnchantmentTags` - list of constants naming item types for enchantment compatibility checks +- The following classes have been deprecated + - `ItemFlags` +- The following API methods have been added: + - `public Enchantment->isCompatibleWith(Enchantment $other) : bool` + - `public Enchantment->getMinEnchantingPower()` - returns the minimum enchanting power (derived from enchantability and number of bookshelves) needed to allow this enchantment to show on the enchanting table with a given level + - `public Enchantment->getMaxEnchantingPower()` - upper limit of enchanting power for this enchantment to be offered on the enchanting table with a given level +- The following API methods have signature changes: + - `Enchantment->__construct()` now accepts optional `(\Closure(int $level) : int)|null $minEnchantingPower` and `int $enchantingPowerRange` parameters + - `Enchantment->__construct()` parameters `$primaryItemFlags` and `$secondaryItemFlags` are now deprecated and no longer used + - `ProtectionEnchantment->__construct()` has extra parameters to reflect `Enchantment->__construct()` changes +- The following API methods have been deprecated: + - `Enchantment->getPrimaryItemFlags()` - use API methods provided by `AvailableEnchantmentRegistry` instead + - `Enchantment->getSecondaryItemFlags()` - use API methods provided by `AvailableEnchantmentRegistry` instead + - `Enchantment->hasPrimaryItemType()` + - `Enchantment->hasSecondaryItemType()` + +### `pocketmine\plugin` +- The following new API methods have been added: + - `public PluginBase->getResourcePath(string $filename) : string` - returns a URI to an embedded resource file that can be used with `file_get_contents()` and similar functions + - `public PluginBase->getResourceFolder() : string` - returns a URI to the plugin's folder of embedded resources +- The following API methods have been deprecated: + - `PluginBase->getResource()` - prefer using `getResourcePath()` with `file_get_contents()` or other PHP built-in functions instead + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setResourcePacksRequired(bool $value) : void` - sets whether players must accept resource packs in order to join + +### `pocketmine\world\generator` +- The following new API methods have been added: + - `public GeneratorManager->addAlias(string $name, string $alias) : void` - allows registering a generator alias without copying the generator registration parameters + +### `pocketmine\world\sound` +- The following new classes have been added: +- `PressurePlateActivateSound` +- `PressurePlateDeactivateSound` + +### `pocketmine\utils` +- The following new API methods have been added: + - `public StringToTParser->registerAlias(string $existing, string $alias) : void` - allows registering a string alias without copying registration parameters diff --git a/src/VersionInfo.php b/src/VersionInfo.php index bec9638ea1..80d6ecaf6d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.3"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "stable"; + public const BASE_VERSION = "5.5.0-BETA1"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "beta"; /** * PocketMine-MP-specific version ID for world data. Used to determine what fixes need to be applied to old world From ce53a221a5cd0c735206b5084a0ee08bba480ced Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 17:09:34 +0100 Subject: [PATCH 1336/1858] 5.5.0-BETA2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 80d6ecaf6d..f792fe0a40 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.5.0-BETA1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.5.0-BETA2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "beta"; /** From c7a311c17a8ec25ae31ca0ec7cb81602714cfc3b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2023 17:14:56 +0100 Subject: [PATCH 1337/1858] COPILOT --- changelogs/5.5-beta.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/5.5-beta.md b/changelogs/5.5-beta.md index efd1c822cd..84153c2796 100644 --- a/changelogs/5.5-beta.md +++ b/changelogs/5.5-beta.md @@ -1,7 +1,7 @@ # 5.5.0-BETA1 Released 23rd August 2023. -**For Minecraft: Bedrock Edition 1.20.0** +**For Minecraft: Bedrock Edition 1.20.10** This is a minor feature release, including performance improvements, new API methods, and new gameplay features. From f2b710c083799e0dcd7e04d95545f6f8c5f2c116 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:31:31 +0100 Subject: [PATCH 1338/1858] Bump build/php from `a053f65` to `d75f83e` (#6017) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `a053f65` to `d75f83e`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/a053f65e1897e432478229071383fe1ba16032c3...d75f83e7ef784d6581310901800a47d179602e94) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index a053f65e18..d75f83e7ef 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a053f65e1897e432478229071383fe1ba16032c3 +Subproject commit d75f83e7ef784d6581310901800a47d179602e94 From 09c9dfb576cec5ff4029c31f8cb77d57c4095246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 09:43:05 +0100 Subject: [PATCH 1339/1858] Bump build/php from `d75f83e` to `8884039` (#6018) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `d75f83e` to `8884039`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/d75f83e7ef784d6581310901800a47d179602e94...8884039bee1db64acca83edd57ed5e25d69287b9) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index d75f83e7ef..8884039bee 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit d75f83e7ef784d6581310901800a47d179602e94 +Subproject commit 8884039bee1db64acca83edd57ed5e25d69287b9 From 1a18e32011ad5c9f554afd8ff2042986d8ec8ac8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 09:43:31 +0100 Subject: [PATCH 1340/1858] Bump ncipollo/release-action from 1.12.0 to 1.13.0 (#6019) Bumps [ncipollo/release-action](https://github.com/ncipollo/release-action) from 1.12.0 to 1.13.0. - [Release notes](https://github.com/ncipollo/release-action/releases) - [Commits](https://github.com/ncipollo/release-action/compare/v1.12.0...v1.13.0) --- updated-dependencies: - dependency-name: ncipollo/release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/draft-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index d135d0cc4e..7dc9f08b15 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -86,7 +86,7 @@ jobs: ${{ github.workspace }}/build_info.json - name: Create draft release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.13.0 with: artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json commit: ${{ github.sha }} From b56f1b679ea49aab81222e08a7d36f97d95a895e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 12:30:54 +0100 Subject: [PATCH 1341/1858] Deduplicate a bunch of repeated type ID map code --- build/php | 2 +- src/data/bedrock/DyeColorIdMap.php | 27 ++----- src/data/bedrock/EffectIdMap.php | 34 +------- src/data/bedrock/EnchantmentIdMap.php | 31 +------- src/data/bedrock/IntSaveIdMapTrait.php | 82 ++++++++++++++++++++ src/data/bedrock/MedicineTypeIdMap.php | 30 +------ src/data/bedrock/MobHeadTypeIdMap.php | 30 +------ src/data/bedrock/MushroomBlockTypeIdMap.php | 29 +------ src/data/bedrock/NoteInstrumentIdMap.php | 30 +------ src/data/bedrock/PotionTypeIdMap.php | 30 +------ src/data/bedrock/SuspiciousStewTypeIdMap.php | 30 +------ 11 files changed, 104 insertions(+), 251 deletions(-) create mode 100644 src/data/bedrock/IntSaveIdMapTrait.php diff --git a/build/php b/build/php index a053f65e18..9f984a1dc1 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a053f65e1897e432478229071383fe1ba16032c3 +Subproject commit 9f984a1dc154603a27543ecdcebc6d6a5871f425 diff --git a/src/data/bedrock/DyeColorIdMap.php b/src/data/bedrock/DyeColorIdMap.php index 35db72c3e7..0d10edad56 100644 --- a/src/data/bedrock/DyeColorIdMap.php +++ b/src/data/bedrock/DyeColorIdMap.php @@ -29,18 +29,10 @@ use pocketmine\utils\SingletonTrait; final class DyeColorIdMap{ use SingletonTrait; - - /** - * @var DyeColor[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait { + register as registerInt; + } /** * @var DyeColor[] @@ -74,16 +66,11 @@ final class DyeColorIdMap{ } private function register(int $id, string $itemId, DyeColor $color) : void{ - $this->idToEnum[$id] = $color; - $this->enumToId[$color->id()] = $id; + $this->registerInt($id, $color); $this->itemIdToEnum[$itemId] = $color; $this->enumToItemId[$color->id()] = $itemId; } - public function toId(DyeColor $color) : int{ - return $this->enumToId[$color->id()]; //TODO: is it possible for this to be missing? - } - public function toInvertedId(DyeColor $color) : int{ return ~$this->toId($color) & 0xf; } @@ -92,10 +79,6 @@ final class DyeColorIdMap{ return $this->enumToItemId[$color->id()]; } - public function fromId(int $id) : ?DyeColor{ - return $this->idToEnum[$id] ?? null; - } - public function fromInvertedId(int $id) : ?DyeColor{ return $this->fromId(~$id & 0xf); } diff --git a/src/data/bedrock/EffectIdMap.php b/src/data/bedrock/EffectIdMap.php index 6dce86d9b9..6efa10b417 100644 --- a/src/data/bedrock/EffectIdMap.php +++ b/src/data/bedrock/EffectIdMap.php @@ -31,18 +31,8 @@ use function spl_object_id; final class EffectIdMap{ use SingletonTrait; - - /** - * @var Effect[] - * @phpstan-var array - */ - private array $idToEffect = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $effectToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(EffectIds::SPEED, VanillaEffects::SPEED()); @@ -76,24 +66,4 @@ final class EffectIdMap{ //TODO: VILLAGE_HERO $this->register(EffectIds::DARKNESS, VanillaEffects::DARKNESS()); } - - //TODO: not a big fan of the code duplication here :( - - public function register(int $mcpeId, Effect $effect) : void{ - $this->idToEffect[$mcpeId] = $effect; - $this->effectToId[spl_object_id($effect)] = $mcpeId; - } - - public function fromId(int $id) : ?Effect{ - //we might not have all the effect IDs registered - return $this->idToEffect[$id] ?? null; - } - - public function toId(Effect $effect) : int{ - if(!array_key_exists(spl_object_id($effect), $this->effectToId)){ - //this should never happen, so we treat it as an exceptional condition - throw new \InvalidArgumentException("Effect does not have a mapped ID"); - } - return $this->effectToId[spl_object_id($effect)]; - } } diff --git a/src/data/bedrock/EnchantmentIdMap.php b/src/data/bedrock/EnchantmentIdMap.php index 1d974ed6e9..c06080e3eb 100644 --- a/src/data/bedrock/EnchantmentIdMap.php +++ b/src/data/bedrock/EnchantmentIdMap.php @@ -34,17 +34,8 @@ use function spl_object_id; */ final class EnchantmentIdMap{ use SingletonTrait; - - /** - * @var Enchantment[] - * @phpstan-var array - */ - private array $idToEnch = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $enchToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(EnchantmentIds::PROTECTION, VanillaEnchantments::PROTECTION()); @@ -77,22 +68,4 @@ final class EnchantmentIdMap{ $this->register(EnchantmentIds::SWIFT_SNEAK, VanillaEnchantments::SWIFT_SNEAK()); } - - public function register(int $mcpeId, Enchantment $enchantment) : void{ - $this->idToEnch[$mcpeId] = $enchantment; - $this->enchToId[spl_object_id($enchantment)] = $mcpeId; - } - - public function fromId(int $id) : ?Enchantment{ - //we might not have all the enchantment IDs registered - return $this->idToEnch[$id] ?? null; - } - - public function toId(Enchantment $enchantment) : int{ - if(!array_key_exists(spl_object_id($enchantment), $this->enchToId)){ - //this should never happen, so we treat it as an exceptional condition - throw new \InvalidArgumentException("Enchantment does not have a mapped ID"); - } - return $this->enchToId[spl_object_id($enchantment)]; - } } diff --git a/src/data/bedrock/IntSaveIdMapTrait.php b/src/data/bedrock/IntSaveIdMapTrait.php new file mode 100644 index 0000000000..041dfa9e6d --- /dev/null +++ b/src/data/bedrock/IntSaveIdMapTrait.php @@ -0,0 +1,82 @@ + + */ + private array $idToEnum = []; + + /** + * @var int[] + * @phpstan-var array + */ + private array $enumToId = []; + + /** + * @phpstan-param TObject $enum + */ + protected function getRuntimeId(object $enum) : int{ + //this is fine for enums and non-cloning object registries + return spl_object_id($enum); + } + + /** + * @phpstan-param TObject $enum + */ + public function register(int $saveId, object $enum) : void{ + $this->idToEnum[$saveId] = $enum; + $this->enumToId[$this->getRuntimeId($enum)] = $saveId; + } + + /** + * @phpstan-return TObject|null + */ + public function fromId(int $id) : ?object{ + //we might not have all the effect IDs registered + return $this->idToEnum[$id] ?? null; + } + + /** + * @phpstan-param TObject $enum + */ + public function toId(object $enum) : int{ + $runtimeId = $this->getRuntimeId($enum); + if(!array_key_exists($runtimeId, $this->enumToId)){ + //this should never happen, so we treat it as an exceptional condition + throw new \InvalidArgumentException("Object does not have a mapped save ID"); + } + return $this->enumToId[$runtimeId]; + } +} diff --git a/src/data/bedrock/MedicineTypeIdMap.php b/src/data/bedrock/MedicineTypeIdMap.php index a85dbb7a8e..2d9deb3802 100644 --- a/src/data/bedrock/MedicineTypeIdMap.php +++ b/src/data/bedrock/MedicineTypeIdMap.php @@ -28,18 +28,8 @@ use pocketmine\utils\SingletonTrait; final class MedicineTypeIdMap{ use SingletonTrait; - - /** - * @var MedicineType[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(MedicineTypeIds::ANTIDOTE, MedicineType::ANTIDOTE()); @@ -47,20 +37,4 @@ final class MedicineTypeIdMap{ $this->register(MedicineTypeIds::EYE_DROPS, MedicineType::EYE_DROPS()); $this->register(MedicineTypeIds::TONIC, MedicineType::TONIC()); } - - private function register(int $id, MedicineType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?MedicineType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(MedicineType $type) : int{ - if(!isset($this->enumToId[$type->id()])){ - throw new \InvalidArgumentException("Type does not have a mapped ID"); - } - return $this->enumToId[$type->id()]; - } } diff --git a/src/data/bedrock/MobHeadTypeIdMap.php b/src/data/bedrock/MobHeadTypeIdMap.php index 99213fa46c..b99b1097bc 100644 --- a/src/data/bedrock/MobHeadTypeIdMap.php +++ b/src/data/bedrock/MobHeadTypeIdMap.php @@ -28,18 +28,8 @@ use pocketmine\utils\SingletonTrait; final class MobHeadTypeIdMap{ use SingletonTrait; - - /** - * @var MobHeadType[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(0, MobHeadType::SKELETON()); @@ -50,20 +40,4 @@ final class MobHeadTypeIdMap{ $this->register(5, MobHeadType::DRAGON()); $this->register(6, MobHeadType::PIGLIN()); } - - private function register(int $id, MobHeadType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?MobHeadType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(MobHeadType $type) : int{ - if(!isset($this->enumToId[$type->id()])){ - throw new \InvalidArgumentException("Type does not have a mapped ID"); - } - return $this->enumToId[$type->id()]; - } } diff --git a/src/data/bedrock/MushroomBlockTypeIdMap.php b/src/data/bedrock/MushroomBlockTypeIdMap.php index 2eec175499..5e195ebb28 100644 --- a/src/data/bedrock/MushroomBlockTypeIdMap.php +++ b/src/data/bedrock/MushroomBlockTypeIdMap.php @@ -30,17 +30,8 @@ use function array_key_exists; final class MushroomBlockTypeIdMap{ use SingletonTrait; - - /** - * @var MushroomBlockType[] - * @phpstan-var array - */ - private array $idToEnum = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; public function __construct(){ $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_PORES, MushroomBlockType::PORES()); @@ -55,20 +46,4 @@ final class MushroomBlockTypeIdMap{ $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, MushroomBlockType::CAP_SOUTHEAST()); $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_CAP, MushroomBlockType::ALL_CAP()); } - - public function register(int $id, MushroomBlockType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?MushroomBlockType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(MushroomBlockType $type) : int{ - if(!array_key_exists($type->id(), $this->enumToId)){ - throw new \InvalidArgumentException("Mushroom block type does not have a mapped ID"); //this should never happen - } - return $this->enumToId[$type->id()]; - } } diff --git a/src/data/bedrock/NoteInstrumentIdMap.php b/src/data/bedrock/NoteInstrumentIdMap.php index 0b8a437357..22d7e5cb1a 100644 --- a/src/data/bedrock/NoteInstrumentIdMap.php +++ b/src/data/bedrock/NoteInstrumentIdMap.php @@ -28,18 +28,8 @@ use pocketmine\world\sound\NoteInstrument; final class NoteInstrumentIdMap{ use SingletonTrait; - - /** - * @var NoteInstrument[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(0, NoteInstrument::PIANO()); @@ -59,20 +49,4 @@ final class NoteInstrumentIdMap{ $this->register(14, NoteInstrument::BANJO()); $this->register(15, NoteInstrument::PLING()); } - - private function register(int $id, NoteInstrument $instrument) : void{ - $this->idToEnum[$id] = $instrument; - $this->enumToId[$instrument->id()] = $id; - } - - public function fromId(int $id) : ?NoteInstrument{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(NoteInstrument $instrument) : int{ - if(!isset($this->enumToId[$instrument->id()])){ - throw new \InvalidArgumentException("Type does not have a mapped ID"); - } - return $this->enumToId[$instrument->id()]; - } } diff --git a/src/data/bedrock/PotionTypeIdMap.php b/src/data/bedrock/PotionTypeIdMap.php index 8194f24a26..3e9858217c 100644 --- a/src/data/bedrock/PotionTypeIdMap.php +++ b/src/data/bedrock/PotionTypeIdMap.php @@ -28,18 +28,8 @@ use pocketmine\utils\SingletonTrait; final class PotionTypeIdMap{ use SingletonTrait; - - /** - * @var PotionType[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(PotionTypeIds::WATER, PotionType::WATER()); @@ -86,20 +76,4 @@ final class PotionTypeIdMap{ $this->register(PotionTypeIds::LONG_SLOW_FALLING, PotionType::LONG_SLOW_FALLING()); $this->register(PotionTypeIds::STRONG_SLOWNESS, PotionType::STRONG_SLOWNESS()); } - - private function register(int $id, PotionType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?PotionType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(PotionType $type) : int{ - if(!isset($this->enumToId[$type->id()])){ - throw new \InvalidArgumentException("Type does not have a mapped ID"); - } - return $this->enumToId[$type->id()]; - } } diff --git a/src/data/bedrock/SuspiciousStewTypeIdMap.php b/src/data/bedrock/SuspiciousStewTypeIdMap.php index 1dc86abf19..37d1215173 100644 --- a/src/data/bedrock/SuspiciousStewTypeIdMap.php +++ b/src/data/bedrock/SuspiciousStewTypeIdMap.php @@ -28,18 +28,8 @@ use pocketmine\utils\SingletonTrait; final class SuspiciousStewTypeIdMap{ use SingletonTrait; - - /** - * @var SuspiciousStewType[] - * @phpstan-var array - */ - private array $idToEnum = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; + /** @phpstan-use IntSaveIdMapTrait */ + use IntSaveIdMapTrait; private function __construct(){ $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY()); @@ -53,20 +43,4 @@ final class SuspiciousStewTypeIdMap{ $this->register(SuspiciousStewTypeIds::OXEYE_DAISY, SuspiciousStewType::OXEYE_DAISY()); $this->register(SuspiciousStewTypeIds::WITHER_ROSE, SuspiciousStewType::WITHER_ROSE()); } - - private function register(int $id, SuspiciousStewType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?SuspiciousStewType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(SuspiciousStewType $type) : int{ - if(!isset($this->enumToId[$type->id()])){ - throw new \InvalidArgumentException("Type does not have a mapped ID"); - } - return $this->enumToId[$type->id()]; - } } From d1a7c1d4539e465b6acf5d84fa949c6b6d2a5968 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 12:49:39 +0100 Subject: [PATCH 1342/1858] Constify server.properties references --- src/Server.php | 88 +++++++++---------- src/ServerProperties.php | 50 +++++++++++ .../defaults/DefaultGamemodeCommand.php | 3 +- src/command/defaults/DifficultyCommand.php | 3 +- src/command/defaults/WhitelistCommand.php | 5 +- src/player/Player.php | 3 +- 6 files changed, 103 insertions(+), 49 deletions(-) create mode 100644 src/ServerProperties.php diff --git a/src/Server.php b/src/Server.php index 148c93b8ee..77d2ae393f 100644 --- a/src/Server.php +++ b/src/Server.php @@ -357,15 +357,15 @@ class Server{ } public function getPort() : int{ - return $this->configGroup->getConfigInt("server-port", self::DEFAULT_PORT_IPV4); + return $this->configGroup->getConfigInt(ServerProperties::SERVER_PORT_IPV4, self::DEFAULT_PORT_IPV4); } public function getPortV6() : int{ - return $this->configGroup->getConfigInt("server-portv6", self::DEFAULT_PORT_IPV6); + return $this->configGroup->getConfigInt(ServerProperties::SERVER_PORT_IPV6, self::DEFAULT_PORT_IPV6); } public function getViewDistance() : int{ - return max(2, $this->configGroup->getConfigInt("view-distance", self::DEFAULT_MAX_VIEW_DISTANCE)); + return max(2, $this->configGroup->getConfigInt(ServerProperties::VIEW_DISTANCE, self::DEFAULT_MAX_VIEW_DISTANCE)); } /** @@ -376,12 +376,12 @@ class Server{ } public function getIp() : string{ - $str = $this->configGroup->getConfigString("server-ip"); + $str = $this->configGroup->getConfigString(ServerProperties::SERVER_IPV4); return $str !== "" ? $str : "0.0.0.0"; } public function getIpV6() : string{ - $str = $this->configGroup->getConfigString("server-ipv6"); + $str = $this->configGroup->getConfigString(ServerProperties::SERVER_IPV6); return $str !== "" ? $str : "::"; } @@ -390,30 +390,30 @@ class Server{ } public function getGamemode() : GameMode{ - return GameMode::fromString($this->configGroup->getConfigString("gamemode", GameMode::SURVIVAL()->name())) ?? GameMode::SURVIVAL(); + return GameMode::fromString($this->configGroup->getConfigString(ServerProperties::GAME_MODE, GameMode::SURVIVAL()->name())) ?? GameMode::SURVIVAL(); } public function getForceGamemode() : bool{ - return $this->configGroup->getConfigBool("force-gamemode", false); + return $this->configGroup->getConfigBool(ServerProperties::FORCE_GAME_MODE, false); } /** * Returns Server global difficulty. Note that this may be overridden in individual worlds. */ public function getDifficulty() : int{ - return $this->configGroup->getConfigInt("difficulty", World::DIFFICULTY_NORMAL); + return $this->configGroup->getConfigInt(ServerProperties::DIFFICULTY, World::DIFFICULTY_NORMAL); } public function hasWhitelist() : bool{ - return $this->configGroup->getConfigBool("white-list", false); + return $this->configGroup->getConfigBool(ServerProperties::WHITELIST, false); } public function isHardcore() : bool{ - return $this->configGroup->getConfigBool("hardcore", false); + return $this->configGroup->getConfigBool(ServerProperties::HARDCORE, false); } public function getMotd() : string{ - return $this->configGroup->getConfigString("motd", self::DEFAULT_SERVER_NAME); + return $this->configGroup->getConfigString(ServerProperties::MOTD, self::DEFAULT_SERVER_NAME); } public function getLoader() : ThreadSafeClassLoader{ @@ -811,26 +811,26 @@ class Server{ $this->configGroup = new ServerConfigGroup( new Config($pocketmineYmlPath, Config::YAML, []), new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES, [ - "motd" => self::DEFAULT_SERVER_NAME, - "server-port" => self::DEFAULT_PORT_IPV4, - "server-portv6" => self::DEFAULT_PORT_IPV6, - "enable-ipv6" => true, - "white-list" => false, - "max-players" => self::DEFAULT_MAX_PLAYERS, - "gamemode" => GameMode::SURVIVAL()->name(), - "force-gamemode" => false, - "hardcore" => false, - "pvp" => true, - "difficulty" => World::DIFFICULTY_NORMAL, - "generator-settings" => "", - "level-name" => "world", - "level-seed" => "", - "level-type" => "DEFAULT", - "enable-query" => true, - "auto-save" => true, - "view-distance" => self::DEFAULT_MAX_VIEW_DISTANCE, - "xbox-auth" => true, - "language" => "eng" + ServerProperties::MOTD => self::DEFAULT_SERVER_NAME, + ServerProperties::SERVER_PORT_IPV4 => self::DEFAULT_PORT_IPV4, + ServerProperties::SERVER_PORT_IPV6 => self::DEFAULT_PORT_IPV6, + ServerProperties::ENABLE_IPV6 => true, + ServerProperties::WHITELIST => false, + ServerProperties::MAX_PLAYERS => self::DEFAULT_MAX_PLAYERS, + ServerProperties::GAME_MODE => GameMode::SURVIVAL()->name(), + ServerProperties::FORCE_GAME_MODE => false, + ServerProperties::HARDCORE => false, + ServerProperties::PVP => true, + ServerProperties::DIFFICULTY => World::DIFFICULTY_NORMAL, + ServerProperties::DEFAULT_WORLD_GENERATOR_SETTINGS => "", + ServerProperties::DEFAULT_WORLD_NAME => "world", + ServerProperties::DEFAULT_WORLD_SEED => "", + ServerProperties::DEFAULT_WORLD_GENERATOR => "DEFAULT", + ServerProperties::ENABLE_QUERY => true, + ServerProperties::AUTO_SAVE => true, + ServerProperties::VIEW_DISTANCE => self::DEFAULT_MAX_VIEW_DISTANCE, + ServerProperties::XBOX_AUTH => true, + ServerProperties::LANGUAGE => "eng" ]) ); @@ -840,7 +840,7 @@ class Server{ } $this->forceLanguage = $this->configGroup->getPropertyBool("settings.force-language", false); - $selectedLang = $this->configGroup->getConfigString("language", $this->configGroup->getPropertyString("settings.language", Language::FALLBACK_LANGUAGE)); + $selectedLang = $this->configGroup->getConfigString(ServerProperties::LANGUAGE, $this->configGroup->getPropertyString("settings.language", Language::FALLBACK_LANGUAGE)); try{ $this->language = new Language($selectedLang); }catch(LanguageNotFoundException $e){ @@ -932,9 +932,9 @@ class Server{ $this->banByIP = new BanList($bannedIpsTxt); $this->banByIP->load(); - $this->maxPlayers = $this->configGroup->getConfigInt("max-players", self::DEFAULT_MAX_PLAYERS); + $this->maxPlayers = $this->configGroup->getConfigInt(ServerProperties::MAX_PLAYERS, self::DEFAULT_MAX_PLAYERS); - $this->onlineMode = $this->configGroup->getConfigBool("xbox-auth", true); + $this->onlineMode = $this->configGroup->getConfigBool(ServerProperties::XBOX_AUTH, true); if($this->onlineMode){ $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_auth_enabled())); }else{ @@ -943,8 +943,8 @@ class Server{ $this->logger->warning($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_authProperty_disabled())); } - if($this->configGroup->getConfigBool("hardcore", false) && $this->getDifficulty() < World::DIFFICULTY_HARD){ - $this->configGroup->setConfigInt("difficulty", World::DIFFICULTY_HARD); + if($this->configGroup->getConfigBool(ServerProperties::HARDCORE, false) && $this->getDifficulty() < World::DIFFICULTY_HARD){ + $this->configGroup->setConfigInt(ServerProperties::DIFFICULTY, World::DIFFICULTY_HARD); } @cli_set_process_title($this->getName() . " " . $this->getPocketMineVersion()); @@ -1001,7 +1001,7 @@ class Server{ } $this->worldManager = new WorldManager($this, Path::join($this->dataPath, "worlds"), $providerManager); - $this->worldManager->setAutoSave($this->configGroup->getConfigBool("auto-save", $this->worldManager->getAutoSave())); + $this->worldManager->setAutoSave($this->configGroup->getConfigBool(ServerProperties::AUTO_SAVE, $this->worldManager->getAutoSave())); $this->worldManager->setAutoSaveInterval($this->configGroup->getPropertyInt("ticks-per.autosave", $this->worldManager->getAutoSaveInterval())); $this->updater = new UpdateChecker($this, $this->configGroup->getPropertyString("auto-updater.host", "update.pmmp.io")); @@ -1136,11 +1136,11 @@ class Server{ } if($this->worldManager->getDefaultWorld() === null){ - $default = $this->configGroup->getConfigString("level-name", "world"); + $default = $this->configGroup->getConfigString(ServerProperties::DEFAULT_WORLD_NAME, "world"); if(trim($default) == ""){ $this->getLogger()->warning("level-name cannot be null, using default"); $default = "world"; - $this->configGroup->setConfigString("level-name", "world"); + $this->configGroup->setConfigString(ServerProperties::DEFAULT_WORLD_NAME, "world"); } if(!$this->worldManager->loadWorld($default, true)){ if($this->worldManager->isWorldGenerated($default)){ @@ -1148,8 +1148,8 @@ class Server{ return false; } - $generatorName = $this->configGroup->getConfigString("level-type"); - $generatorOptions = $this->configGroup->getConfigString("generator-settings"); + $generatorName = $this->configGroup->getConfigString(ServerProperties::DEFAULT_WORLD_GENERATOR); + $generatorOptions = $this->configGroup->getConfigString(ServerProperties::DEFAULT_WORLD_GENERATOR_SETTINGS); $generatorClass = $getGenerator($generatorName, $generatorOptions, $default); if($generatorClass === null){ @@ -1159,7 +1159,7 @@ class Server{ $creationOptions = WorldCreationOptions::create() ->setGeneratorClass($generatorClass) ->setGeneratorOptions($generatorOptions); - $convertedSeed = Generator::convertSeed($this->configGroup->getConfigString("level-seed")); + $convertedSeed = Generator::convertSeed($this->configGroup->getConfigString(ServerProperties::DEFAULT_WORLD_SEED)); if($convertedSeed !== null){ $creationOptions->setSeed($convertedSeed); } @@ -1213,7 +1213,7 @@ class Server{ } private function startupPrepareNetworkInterfaces() : bool{ - $useQuery = $this->configGroup->getConfigBool("enable-query", true); + $useQuery = $this->configGroup->getConfigBool(ServerProperties::ENABLE_QUERY, true); $typeConverter = TypeConverter::getInstance(); $packetSerializerContext = new PacketSerializerContext($typeConverter->getItemTypeDictionary()); @@ -1223,7 +1223,7 @@ class Server{ if( !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) || ( - $this->configGroup->getConfigBool("enable-ipv6", true) && + $this->configGroup->getConfigBool(ServerProperties::ENABLE_IPV6, true) && !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) ) ){ diff --git a/src/ServerProperties.php b/src/ServerProperties.php new file mode 100644 index 0000000000..884ff4f67f --- /dev/null +++ b/src/ServerProperties.php @@ -0,0 +1,50 @@ +getServer()->getConfigGroup()->setConfigString("gamemode", $gameMode->name()); + $sender->getServer()->getConfigGroup()->setConfigString(ServerProperties::GAME_MODE, $gameMode->name()); $sender->sendMessage(KnownTranslationFactory::commands_defaultgamemode_success($gameMode->getTranslatableName())); return true; } diff --git a/src/command/defaults/DifficultyCommand.php b/src/command/defaults/DifficultyCommand.php index 98eb3be3bc..dee75e025e 100644 --- a/src/command/defaults/DifficultyCommand.php +++ b/src/command/defaults/DifficultyCommand.php @@ -28,6 +28,7 @@ use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; +use pocketmine\ServerProperties; use pocketmine\world\World; use function count; @@ -54,7 +55,7 @@ class DifficultyCommand extends VanillaCommand{ } if($difficulty !== -1){ - $sender->getServer()->getConfigGroup()->setConfigInt("difficulty", $difficulty); + $sender->getServer()->getConfigGroup()->setConfigInt(ServerProperties::DIFFICULTY, $difficulty); //TODO: add per-world support foreach($sender->getServer()->getWorldManager()->getWorlds() as $world){ diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index 65860aefae..fdf01ff562 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -30,6 +30,7 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\Player; use pocketmine\Server; +use pocketmine\ServerProperties; use function count; use function implode; use function sort; @@ -71,7 +72,7 @@ class WhitelistCommand extends VanillaCommand{ case "on": if($this->testPermission($sender, DefaultPermissionNames::COMMAND_WHITELIST_ENABLE)){ $server = $sender->getServer(); - $server->getConfigGroup()->setConfigBool("white-list", true); + $server->getConfigGroup()->setConfigBool(ServerProperties::WHITELIST, true); $this->kickNonWhitelistedPlayers($server); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_whitelist_enabled()); } @@ -79,7 +80,7 @@ class WhitelistCommand extends VanillaCommand{ return true; case "off": if($this->testPermission($sender, DefaultPermissionNames::COMMAND_WHITELIST_DISABLE)){ - $sender->getServer()->getConfigGroup()->setConfigBool("white-list", false); + $sender->getServer()->getConfigGroup()->setConfigBool(ServerProperties::WHITELIST, false); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_whitelist_disabled()); } diff --git a/src/player/Player.php b/src/player/Player.php index d34a357ee6..33f9e16f4a 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -119,6 +119,7 @@ use pocketmine\permission\PermissibleBase; use pocketmine\permission\PermissibleDelegateTrait; use pocketmine\player\chat\StandardChatFormatter; use pocketmine\Server; +use pocketmine\ServerProperties; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\TextFormat; @@ -1844,7 +1845,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if(!$this->canInteract($entity->getLocation(), self::MAX_REACH_DISTANCE_ENTITY_INTERACTION)){ $this->logger->debug("Cancelled attack of entity " . $entity->getId() . " due to not currently being interactable"); $ev->cancel(); - }elseif($this->isSpectator() || ($entity instanceof Player && !$this->server->getConfigGroup()->getConfigBool("pvp"))){ + }elseif($this->isSpectator() || ($entity instanceof Player && !$this->server->getConfigGroup()->getConfigBool(ServerProperties::PVP))){ $ev->cancel(); } From 506d8d10642e1c6af64b39788cba129f406ee499 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 12:49:56 +0100 Subject: [PATCH 1343/1858] CS --- src/data/bedrock/EffectIdMap.php | 2 -- src/data/bedrock/EnchantmentIdMap.php | 2 -- src/data/bedrock/IntSaveIdMapTrait.php | 1 - src/data/bedrock/MushroomBlockTypeIdMap.php | 1 - 4 files changed, 6 deletions(-) diff --git a/src/data/bedrock/EffectIdMap.php b/src/data/bedrock/EffectIdMap.php index 6efa10b417..cadd8c397c 100644 --- a/src/data/bedrock/EffectIdMap.php +++ b/src/data/bedrock/EffectIdMap.php @@ -26,8 +26,6 @@ namespace pocketmine\data\bedrock; use pocketmine\entity\effect\Effect; use pocketmine\entity\effect\VanillaEffects; use pocketmine\utils\SingletonTrait; -use function array_key_exists; -use function spl_object_id; final class EffectIdMap{ use SingletonTrait; diff --git a/src/data/bedrock/EnchantmentIdMap.php b/src/data/bedrock/EnchantmentIdMap.php index c06080e3eb..ae2460cfeb 100644 --- a/src/data/bedrock/EnchantmentIdMap.php +++ b/src/data/bedrock/EnchantmentIdMap.php @@ -26,8 +26,6 @@ namespace pocketmine\data\bedrock; use pocketmine\item\enchantment\Enchantment; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\utils\SingletonTrait; -use function array_key_exists; -use function spl_object_id; /** * Handles translation of internal enchantment types to and from Minecraft: Bedrock IDs. diff --git a/src/data/bedrock/IntSaveIdMapTrait.php b/src/data/bedrock/IntSaveIdMapTrait.php index 041dfa9e6d..cf1631fd5f 100644 --- a/src/data/bedrock/IntSaveIdMapTrait.php +++ b/src/data/bedrock/IntSaveIdMapTrait.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; -use function abs; use function array_key_exists; use function spl_object_id; diff --git a/src/data/bedrock/MushroomBlockTypeIdMap.php b/src/data/bedrock/MushroomBlockTypeIdMap.php index 5e195ebb28..927b52c769 100644 --- a/src/data/bedrock/MushroomBlockTypeIdMap.php +++ b/src/data/bedrock/MushroomBlockTypeIdMap.php @@ -26,7 +26,6 @@ namespace pocketmine\data\bedrock; use pocketmine\block\utils\MushroomBlockType; use pocketmine\data\bedrock\block\BlockLegacyMetadata as LegacyMeta; use pocketmine\utils\SingletonTrait; -use function array_key_exists; final class MushroomBlockTypeIdMap{ use SingletonTrait; From 31d8cc1cb556c9a95960e56de0fffbef13833b72 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 13:23:38 +0100 Subject: [PATCH 1344/1858] Generate and use constants for pocketmine.yml constant names a couple of usages of properties that no longer exist couldn't be migrated. in addition, this revealed a couple of dead properties in the default file. this is not an ideal solution (I'd much rather model the configs using classes and map them) but in the absence of a good and reliable library to do that, this is the next best thing. --- .github/workflows/main.yml | 3 + ...enerate-pocketmine-yml-property-consts.php | 76 +++++++++++++ src/MemoryManager.php | 29 ++--- src/Server.php | 59 +++++----- src/YmlServerProperties.php | 107 ++++++++++++++++++ src/command/defaults/TimingsCommand.php | 3 +- src/crash/CrashDump.php | 7 +- src/network/mcpe/NetworkSession.php | 3 +- src/network/mcpe/raklib/RakLibInterface.php | 3 +- src/network/query/QueryInfo.php | 3 +- src/player/Player.php | 7 +- src/stats/SendUsageTask.php | 3 +- src/updater/UpdateChecker.php | 7 +- src/world/World.php | 9 +- 14 files changed, 258 insertions(+), 61 deletions(-) create mode 100644 build/generate-pocketmine-yml-property-consts.php create mode 100644 src/YmlServerProperties.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 022e0ab3a2..a888d42541 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -158,6 +158,9 @@ jobs: - name: Regenerate BedrockData available files constants run: php build/generate-bedrockdata-path-consts.php + - name: Regenerate YmlServerProperties constants + run: php build/generate-pocketmine-yml-property-consts.php + - name: Verify code is unchanged run: | git diff diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php new file mode 100644 index 0000000000..b0e79519aa --- /dev/null +++ b/build/generate-pocketmine-yml-property-consts.php @@ -0,0 +1,76 @@ + $constants + * @phpstan-param-out array $constants + */ +function collectProperties(string $prefix, array $properties, array &$constants) : void{ + foreach($properties as $propertyName => $property){ + $fullPropertyName = ($prefix !== "" ? $prefix . "." : "") . $propertyName; + + $constName = str_replace([".", "-"], "_", strtoupper($fullPropertyName)); + $constants[$constName] = $fullPropertyName; + + if(is_array($property)){ + collectProperties($fullPropertyName, $property, $constants); + } + } +} + +collectProperties("", $defaultConfig, $constants); +ksort($constants, SORT_STRING); + +$file = fopen(dirname(__DIR__) . '/src/YmlServerProperties.php', 'wb'); +if($file === false){ + fwrite(STDERR, "Failed to open output file\n"); + exit(1); +} +fwrite($file, " $propertyName){ + fwrite($file, "\tpublic const $constName = '$propertyName';\n"); +} +fwrite($file, "}\n"); + +fclose($file); + +echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 0e8502ff88..053498e7e3 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -30,6 +30,7 @@ use pocketmine\scheduler\GarbageCollectionTask; use pocketmine\timings\Timings; use pocketmine\utils\Process; use pocketmine\utils\Utils; +use pocketmine\YmlServerProperties as Yml; use Symfony\Component\Filesystem\Path; use function arsort; use function count; @@ -109,7 +110,7 @@ class MemoryManager{ } private function init(ServerConfigGroup $config) : void{ - $this->memoryLimit = $config->getPropertyInt("memory.main-limit", 0) * 1024 * 1024; + $this->memoryLimit = $config->getPropertyInt(Yml::MEMORY_MAIN_LIMIT, 0) * 1024 * 1024; $defaultMemory = 1024; @@ -127,7 +128,7 @@ class MemoryManager{ } } - $hardLimit = $config->getPropertyInt("memory.main-hard-limit", $defaultMemory); + $hardLimit = $config->getPropertyInt(Yml::MEMORY_MAIN_HARD_LIMIT, $defaultMemory); if($hardLimit <= 0){ ini_set("memory_limit", '-1'); @@ -135,22 +136,22 @@ class MemoryManager{ ini_set("memory_limit", $hardLimit . "M"); } - $this->globalMemoryLimit = $config->getPropertyInt("memory.global-limit", 0) * 1024 * 1024; - $this->checkRate = $config->getPropertyInt("memory.check-rate", self::DEFAULT_CHECK_RATE); - $this->continuousTrigger = $config->getPropertyBool("memory.continuous-trigger", true); - $this->continuousTriggerRate = $config->getPropertyInt("memory.continuous-trigger-rate", self::DEFAULT_CONTINUOUS_TRIGGER_RATE); + $this->globalMemoryLimit = $config->getPropertyInt(Yml::MEMORY_GLOBAL_LIMIT, 0) * 1024 * 1024; + $this->checkRate = $config->getPropertyInt(Yml::MEMORY_CHECK_RATE, self::DEFAULT_CHECK_RATE); + $this->continuousTrigger = $config->getPropertyBool(Yml::MEMORY_CONTINUOUS_TRIGGER, true); + $this->continuousTriggerRate = $config->getPropertyInt(Yml::MEMORY_CONTINUOUS_TRIGGER_RATE, self::DEFAULT_CONTINUOUS_TRIGGER_RATE); - $this->garbageCollectionPeriod = $config->getPropertyInt("memory.garbage-collection.period", self::DEFAULT_TICKS_PER_GC); - $this->garbageCollectionTrigger = $config->getPropertyBool("memory.garbage-collection.low-memory-trigger", true); - $this->garbageCollectionAsync = $config->getPropertyBool("memory.garbage-collection.collect-async-worker", true); + $this->garbageCollectionPeriod = $config->getPropertyInt(Yml::MEMORY_GARBAGE_COLLECTION_PERIOD, self::DEFAULT_TICKS_PER_GC); + $this->garbageCollectionTrigger = $config->getPropertyBool(Yml::MEMORY_GARBAGE_COLLECTION_LOW_MEMORY_TRIGGER, true); + $this->garbageCollectionAsync = $config->getPropertyBool(Yml::MEMORY_GARBAGE_COLLECTION_COLLECT_ASYNC_WORKER, true); - $this->lowMemChunkRadiusOverride = $config->getPropertyInt("memory.max-chunks.chunk-radius", 4); - $this->lowMemChunkGC = $config->getPropertyBool("memory.max-chunks.trigger-chunk-collect", true); + $this->lowMemChunkRadiusOverride = $config->getPropertyInt(Yml::MEMORY_MAX_CHUNKS_CHUNK_RADIUS, 4); + $this->lowMemChunkGC = $config->getPropertyBool(Yml::MEMORY_MAX_CHUNKS_TRIGGER_CHUNK_COLLECT, true); - $this->lowMemDisableChunkCache = $config->getPropertyBool("memory.world-caches.disable-chunk-cache", true); - $this->lowMemClearWorldCache = $config->getPropertyBool("memory.world-caches.low-memory-trigger", true); + $this->lowMemDisableChunkCache = $config->getPropertyBool(Yml::MEMORY_WORLD_CACHES_DISABLE_CHUNK_CACHE, true); + $this->lowMemClearWorldCache = $config->getPropertyBool(Yml::MEMORY_WORLD_CACHES_LOW_MEMORY_TRIGGER, true); - $this->dumpWorkers = $config->getPropertyBool("memory.memory-dump.dump-async-worker", true); + $this->dumpWorkers = $config->getPropertyBool(Yml::MEMORY_MEMORY_DUMP_DUMP_ASYNC_WORKER, true); gc_enable(); } diff --git a/src/Server.php b/src/Server.php index 77d2ae393f..00951c10a5 100644 --- a/src/Server.php +++ b/src/Server.php @@ -120,6 +120,7 @@ use pocketmine\world\Position; use pocketmine\world\World; use pocketmine\world\WorldCreationOptions; use pocketmine\world\WorldManager; +use pocketmine\YmlServerProperties as Yml; use Ramsey\Uuid\UuidInterface; use Symfony\Component\Filesystem\Path; use function array_fill; @@ -496,7 +497,7 @@ class Server{ } public function shouldSavePlayerData() : bool{ - return $this->configGroup->getPropertyBool("player.save-player-data", true); + return $this->configGroup->getPropertyBool(Yml::PLAYER_SAVE_PLAYER_DATA, true); } public function getOfflinePlayer(string $name) : Player|OfflinePlayer|null{ @@ -736,7 +737,7 @@ class Server{ * @return string[][] */ public function getCommandAliases() : array{ - $section = $this->configGroup->getProperty("aliases"); + $section = $this->configGroup->getProperty(YmlServerProperties::ALIASES); $result = []; if(is_array($section)){ foreach($section as $key => $value){ @@ -834,12 +835,12 @@ class Server{ ]) ); - $debugLogLevel = $this->configGroup->getPropertyInt("debug.level", 1); + $debugLogLevel = $this->configGroup->getPropertyInt(Yml::DEBUG_LEVEL, 1); if($this->logger instanceof MainLogger){ $this->logger->setLogDebug($debugLogLevel > 1); } - $this->forceLanguage = $this->configGroup->getPropertyBool("settings.force-language", false); + $this->forceLanguage = $this->configGroup->getPropertyBool(Yml::SETTINGS_FORCE_LANGUAGE, false); $selectedLang = $this->configGroup->getConfigString(ServerProperties::LANGUAGE, $this->configGroup->getPropertyString("settings.language", Language::FALLBACK_LANGUAGE)); try{ $this->language = new Language($selectedLang); @@ -856,11 +857,11 @@ class Server{ $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::language_selected($this->getLanguage()->getName(), $this->getLanguage()->getLang()))); if(VersionInfo::IS_DEVELOPMENT_BUILD){ - if(!$this->configGroup->getPropertyBool("settings.enable-dev-builds", false)){ + if(!$this->configGroup->getPropertyBool(Yml::SETTINGS_ENABLE_DEV_BUILDS, false)){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error1(VersionInfo::NAME))); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error2())); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error3())); - $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error4("settings.enable-dev-builds"))); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error4(YmlServerProperties::SETTINGS_ENABLE_DEV_BUILDS))); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error5("https://github.com/pmmp/PocketMine-MP/releases"))); $this->forceShutdownExit(); @@ -878,7 +879,7 @@ class Server{ $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_start(TextFormat::AQUA . $this->getVersion() . TextFormat::RESET))); - if(($poolSize = $this->configGroup->getPropertyString("settings.async-workers", "auto")) === "auto"){ + if(($poolSize = $this->configGroup->getPropertyString(Yml::SETTINGS_ASYNC_WORKERS, "auto")) === "auto"){ $poolSize = 2; $processors = Utils::getCoreCount() - 2; @@ -889,32 +890,32 @@ class Server{ $poolSize = max(1, (int) $poolSize); } - $this->asyncPool = new AsyncPool($poolSize, max(-1, $this->configGroup->getPropertyInt("memory.async-worker-hard-limit", 256)), $this->autoloader, $this->logger, $this->tickSleeper); + $this->asyncPool = new AsyncPool($poolSize, max(-1, $this->configGroup->getPropertyInt(Yml::MEMORY_ASYNC_WORKER_HARD_LIMIT, 256)), $this->autoloader, $this->logger, $this->tickSleeper); $netCompressionThreshold = -1; - if($this->configGroup->getPropertyInt("network.batch-threshold", 256) >= 0){ - $netCompressionThreshold = $this->configGroup->getPropertyInt("network.batch-threshold", 256); + if($this->configGroup->getPropertyInt(Yml::NETWORK_BATCH_THRESHOLD, 256) >= 0){ + $netCompressionThreshold = $this->configGroup->getPropertyInt(Yml::NETWORK_BATCH_THRESHOLD, 256); } if($netCompressionThreshold < 0){ $netCompressionThreshold = null; } - $netCompressionLevel = $this->configGroup->getPropertyInt("network.compression-level", 6); + $netCompressionLevel = $this->configGroup->getPropertyInt(Yml::NETWORK_COMPRESSION_LEVEL, 6); if($netCompressionLevel < 1 || $netCompressionLevel > 9){ $this->logger->warning("Invalid network compression level $netCompressionLevel set, setting to default 6"); $netCompressionLevel = 6; } ZlibCompressor::setInstance(new ZlibCompressor($netCompressionLevel, $netCompressionThreshold, ZlibCompressor::DEFAULT_MAX_DECOMPRESSION_SIZE)); - $this->networkCompressionAsync = $this->configGroup->getPropertyBool("network.async-compression", true); + $this->networkCompressionAsync = $this->configGroup->getPropertyBool(Yml::NETWORK_ASYNC_COMPRESSION, true); $this->networkCompressionAsyncThreshold = max( - $this->configGroup->getPropertyInt("network.async-compression-threshold", self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD), + $this->configGroup->getPropertyInt(Yml::NETWORK_ASYNC_COMPRESSION_THRESHOLD, self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD), $netCompressionThreshold ?? self::DEFAULT_ASYNC_COMPRESSION_THRESHOLD ); - EncryptionContext::$ENABLED = $this->configGroup->getPropertyBool("network.enable-encryption", true); + EncryptionContext::$ENABLED = $this->configGroup->getPropertyBool(Yml::NETWORK_ENABLE_ENCRYPTION, true); - $this->doTitleTick = $this->configGroup->getPropertyBool("console.title-tick", true) && Terminal::hasFormattingCodes(); + $this->doTitleTick = $this->configGroup->getPropertyBool(Yml::CONSOLE_TITLE_TICK, true) && Terminal::hasFormattingCodes(); $this->operators = new Config(Path::join($this->dataPath, "ops.txt"), Config::ENUM); $this->whitelist = new Config(Path::join($this->dataPath, "white-list.txt"), Config::ENUM); @@ -963,8 +964,8 @@ class Server{ ))); $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_license($this->getName()))); - TimingsHandler::setEnabled($this->configGroup->getPropertyBool("settings.enable-profiling", false)); - $this->profilingTickRate = $this->configGroup->getPropertyInt("settings.profile-report-trigger", self::TARGET_TICKS_PER_SECOND); + TimingsHandler::setEnabled($this->configGroup->getPropertyBool(Yml::SETTINGS_ENABLE_PROFILING, false)); + $this->profilingTickRate = $this->configGroup->getPropertyInt(Yml::SETTINGS_PROFILE_REPORT_TRIGGER, self::TARGET_TICKS_PER_SECOND); DefaultPermissions::registerCorePermissions(); @@ -986,13 +987,13 @@ class Server{ $this->forceShutdownExit(); return; } - $this->pluginManager = new PluginManager($this, $this->configGroup->getPropertyBool("plugins.legacy-data-dir", true) ? null : Path::join($this->getDataPath(), "plugin_data"), $pluginGraylist); + $this->pluginManager = new PluginManager($this, $this->configGroup->getPropertyBool(Yml::PLUGINS_LEGACY_DATA_DIR, true) ? null : Path::join($this->getDataPath(), "plugin_data"), $pluginGraylist); $this->pluginManager->registerInterface(new PharPluginLoader($this->autoloader)); $this->pluginManager->registerInterface(new ScriptPluginLoader()); $providerManager = new WorldProviderManager(); if( - ($format = $providerManager->getProviderByName($formatName = $this->configGroup->getPropertyString("level-settings.default-format", ""))) !== null && + ($format = $providerManager->getProviderByName($formatName = $this->configGroup->getPropertyString(Yml::LEVEL_SETTINGS_DEFAULT_FORMAT, ""))) !== null && $format instanceof WritableWorldProviderManagerEntry ){ $providerManager->setDefault($format); @@ -1002,9 +1003,9 @@ class Server{ $this->worldManager = new WorldManager($this, Path::join($this->dataPath, "worlds"), $providerManager); $this->worldManager->setAutoSave($this->configGroup->getConfigBool(ServerProperties::AUTO_SAVE, $this->worldManager->getAutoSave())); - $this->worldManager->setAutoSaveInterval($this->configGroup->getPropertyInt("ticks-per.autosave", $this->worldManager->getAutoSaveInterval())); + $this->worldManager->setAutoSaveInterval($this->configGroup->getPropertyInt(Yml::TICKS_PER_AUTOSAVE, $this->worldManager->getAutoSaveInterval())); - $this->updater = new UpdateChecker($this, $this->configGroup->getPropertyString("auto-updater.host", "update.pmmp.io")); + $this->updater = new UpdateChecker($this, $this->configGroup->getPropertyString(Yml::AUTO_UPDATER_HOST, "update.pmmp.io")); $this->queryInfo = new QueryInfo($this); @@ -1041,7 +1042,7 @@ class Server{ return; } - if($this->configGroup->getPropertyBool("anonymous-statistics.enabled", true)){ + if($this->configGroup->getPropertyBool(Yml::ANONYMOUS_STATISTICS_ENABLED, true)){ $this->sendUsageTicker = self::TICKS_PER_STATS_REPORT; $this->sendUsage(SendUsageTask::TYPE_OPEN); } @@ -1057,7 +1058,7 @@ class Server{ $this->subscribeToBroadcastChannel(self::BROADCAST_CHANNEL_USERS, $forwarder); //TODO: move console parts to a separate component - if($this->configGroup->getPropertyBool("console.enable-input", true)){ + if($this->configGroup->getPropertyBool(Yml::CONSOLE_ENABLE_INPUT, true)){ $this->console = new ConsoleReaderChildProcessDaemon($this->logger); } @@ -1092,7 +1093,7 @@ class Server{ $anyWorldFailedToLoad = false; - foreach((array) $this->configGroup->getProperty("worlds", []) as $name => $options){ + foreach((array) $this->configGroup->getProperty(Yml::WORLDS, []) as $name => $options){ if($options === null){ $options = []; }elseif(!is_array($options)){ @@ -1238,7 +1239,7 @@ class Server{ $this->network->blockAddress($entry->getName(), -1); } - if($this->configGroup->getPropertyBool("network.upnp-forwarding", false)){ + if($this->configGroup->getPropertyBool(Yml::NETWORK_UPNP_FORWARDING, false)){ $this->network->registerInterface(new UPnPNetworkInterface($this->logger, Internet::getInternalIP(), $this->getPort())); } @@ -1458,7 +1459,7 @@ class Server{ } if(isset($this->network)){ - $this->network->getSessionManager()->close($this->configGroup->getPropertyString("settings.shutdown-message", "Server closed")); + $this->network->getSessionManager()->close($this->configGroup->getPropertyString(YmlServerProperties::SETTINGS_SHUTDOWN_MESSAGE, "Server closed")); } if(isset($this->worldManager)){ @@ -1595,7 +1596,7 @@ class Server{ $this->logger->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_crash_submit($crashDumpPath))); - if($this->configGroup->getPropertyBool("auto-report.enabled", true)){ + if($this->configGroup->getPropertyBool(Yml::AUTO_REPORT_ENABLED, true)){ $report = true; $stamp = Path::join($this->getDataPath(), "crashdumps", ".last_crash"); @@ -1625,7 +1626,7 @@ class Server{ } if($report){ - $url = ($this->configGroup->getPropertyBool("auto-report.use-https", true) ? "https" : "http") . "://" . $this->configGroup->getPropertyString("auto-report.host", "crash.pmmp.io") . "/submit/api"; + $url = ($this->configGroup->getPropertyBool(Yml::AUTO_REPORT_USE_HTTPS, true) ? "https" : "http") . "://" . $this->configGroup->getPropertyString(Yml::AUTO_REPORT_HOST, "crash.pmmp.io") . "/submit/api"; $postUrlError = "Unknown error"; $reply = Internet::postURL($url, [ "report" => "yes", @@ -1736,7 +1737,7 @@ class Server{ } public function sendUsage(int $type = SendUsageTask::TYPE_STATUS) : void{ - if($this->configGroup->getPropertyBool("anonymous-statistics.enabled", true)){ + if($this->configGroup->getPropertyBool(Yml::ANONYMOUS_STATISTICS_ENABLED, true)){ $this->asyncPool->submitTask(new SendUsageTask($this, $type, $this->uniquePlayers)); } $this->uniquePlayers = []; diff --git a/src/YmlServerProperties.php b/src/YmlServerProperties.php new file mode 100644 index 0000000000..920f0797ad --- /dev/null +++ b/src/YmlServerProperties.php @@ -0,0 +1,107 @@ +getServer()->getConfigGroup()->getPropertyString("timings.host", "timings.pmmp.io"); + $host = $sender->getServer()->getConfigGroup()->getPropertyString(YmlServerProperties::TIMINGS_HOST, "timings.pmmp.io"); $sender->getServer()->getAsyncPool()->submitTask(new BulkCurlTask( [new BulkCurlTaskOperation( diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index ded1e5d88a..9d2eb39e9d 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -34,6 +34,7 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use pocketmine\VersionInfo; +use pocketmine\YmlServerProperties; use Symfony\Component\Filesystem\Path; use function array_map; use function base64_encode; @@ -152,7 +153,7 @@ class CrashDump{ private function extraData() : void{ global $argv; - if($this->server->getConfigGroup()->getPropertyBool("auto-report.send-settings", true)){ + if($this->server->getConfigGroup()->getPropertyBool(YmlServerProperties::AUTO_REPORT_SEND_SETTINGS, true)){ $this->data->parameters = (array) $argv; if(($serverDotProperties = @file_get_contents(Path::join($this->server->getDataPath(), "server.properties"))) !== false){ $this->data->serverDotProperties = preg_replace("#^rcon\\.password=(.*)$#m", "rcon.password=******", $serverDotProperties) ?? throw new AssumptionFailedError("Pattern is valid"); @@ -170,7 +171,7 @@ class CrashDump{ $this->data->jit_mode = Utils::getOpcacheJitMode(); - if($this->server->getConfigGroup()->getPropertyBool("auto-report.send-phpinfo", true)){ + if($this->server->getConfigGroup()->getPropertyBool(YmlServerProperties::AUTO_REPORT_SEND_PHPINFO, true)){ ob_start(); phpinfo(); $this->data->phpinfo = ob_get_contents(); // @phpstan-ignore-line @@ -225,7 +226,7 @@ class CrashDump{ } } - if($this->server->getConfigGroup()->getPropertyBool("auto-report.send-code", true) && file_exists($error["fullFile"])){ + if($this->server->getConfigGroup()->getPropertyBool(YmlServerProperties::AUTO_REPORT_SEND_CODE, true) && file_exists($error["fullFile"])){ $file = @file($error["fullFile"], FILE_IGNORE_NEW_LINES); if($file !== false){ for($l = max(0, $error["line"] - 10); $l < $error["line"] + 10 && isset($file[$l]); ++$l){ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 100d9c989e..5b65ca1b5f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -108,6 +108,7 @@ use pocketmine\utils\BinaryStream; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; use pocketmine\world\Position; +use pocketmine\YmlServerProperties; use function array_map; use function array_values; use function base64_encode; @@ -740,7 +741,7 @@ class NetworkSession{ } $this->logger->debug("Xbox Live authenticated: " . ($this->authenticated ? "YES" : "NO")); - $checkXUID = $this->server->getConfigGroup()->getPropertyBool("player.verify-xuid", true); + $checkXUID = $this->server->getConfigGroup()->getPropertyBool(YmlServerProperties::PLAYER_VERIFY_XUID, true); $myXUID = $this->info instanceof XboxLivePlayerInfo ? $this->info->getXuid() : ""; $kickForXUIDMismatch = function(string $xuid) use ($checkXUID, $myXUID) : bool{ if($checkXUID && $myXUID !== $xuid){ diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 4bf8ffb15f..759a992e80 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -42,6 +42,7 @@ use pocketmine\Server; use pocketmine\thread\ThreadCrashException; use pocketmine\timings\Timings; use pocketmine\utils\Utils; +use pocketmine\YmlServerProperties; use raklib\generic\DisconnectReason; use raklib\generic\SocketException; use raklib\protocol\EncapsulatedPacket; @@ -125,7 +126,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $threadToMainBuffer, new InternetAddress($ip, $port, $ipV6 ? 6 : 4), $this->rakServerId, - $this->server->getConfigGroup()->getPropertyInt("network.max-mtu-size", 1492), + $this->server->getConfigGroup()->getPropertyInt(YmlServerProperties::NETWORK_MAX_MTU_SIZE, 1492), self::MCPE_RAKNET_PROTOCOL_VERSION, $sleeperEntry ); diff --git a/src/network/query/QueryInfo.php b/src/network/query/QueryInfo.php index 2d36ac7e6e..cdb1c66dbe 100644 --- a/src/network/query/QueryInfo.php +++ b/src/network/query/QueryInfo.php @@ -29,6 +29,7 @@ use pocketmine\plugin\Plugin; use pocketmine\Server; use pocketmine\utils\Binary; use pocketmine\utils\Utils; +use pocketmine\YmlServerProperties; use function array_map; use function chr; use function count; @@ -66,7 +67,7 @@ final class QueryInfo{ public function __construct(Server $server){ $this->serverName = $server->getMotd(); - $this->listPlugins = $server->getConfigGroup()->getPropertyBool("settings.query-plugins", true); + $this->listPlugins = $server->getConfigGroup()->getPropertyBool(YmlServerProperties::SETTINGS_QUERY_PLUGINS, true); $this->plugins = $server->getPluginManager()->getPlugins(); $this->players = array_map(fn(Player $p) => $p->getName(), $server->getOnlinePlayers()); diff --git a/src/player/Player.php b/src/player/Player.php index 33f9e16f4a..2059613ad0 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -135,6 +135,7 @@ use pocketmine\world\sound\FireExtinguishSound; use pocketmine\world\sound\ItemBreakSound; use pocketmine\world\sound\Sound; use pocketmine\world\World; +use pocketmine\YmlServerProperties; use Ramsey\Uuid\UuidInterface; use function abs; use function array_filter; @@ -318,8 +319,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $rootPermissions[DefaultPermissions::ROOT_OPERATOR] = true; } $this->perm = new PermissibleBase($rootPermissions); - $this->chunksPerTick = $this->server->getConfigGroup()->getPropertyInt("chunk-sending.per-tick", 4); - $this->spawnThreshold = (int) (($this->server->getConfigGroup()->getPropertyInt("chunk-sending.spawn-radius", 4) ** 2) * M_PI); + $this->chunksPerTick = $this->server->getConfigGroup()->getPropertyInt(YmlServerProperties::CHUNK_SENDING_PER_TICK, 4); + $this->spawnThreshold = (int) (($this->server->getConfigGroup()->getPropertyInt(YmlServerProperties::CHUNK_SENDING_SPAWN_RADIUS, 4) ** 2) * M_PI); $this->chunkSelector = new ChunkSelector(); $this->chunkLoader = new class implements ChunkLoader{}; @@ -584,7 +585,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->viewDistance = $newViewDistance; - $this->spawnThreshold = (int) (min($this->viewDistance, $this->server->getConfigGroup()->getPropertyInt("chunk-sending.spawn-radius", 4)) ** 2 * M_PI); + $this->spawnThreshold = (int) (min($this->viewDistance, $this->server->getConfigGroup()->getPropertyInt(YmlServerProperties::CHUNK_SENDING_SPAWN_RADIUS, 4)) ** 2 * M_PI); $this->nextChunkOrderRun = 0; diff --git a/src/stats/SendUsageTask.php b/src/stats/SendUsageTask.php index 08c17c73a8..d218774b5f 100644 --- a/src/stats/SendUsageTask.php +++ b/src/stats/SendUsageTask.php @@ -31,6 +31,7 @@ use pocketmine\utils\Internet; use pocketmine\utils\Process; use pocketmine\utils\Utils; use pocketmine\VersionInfo; +use pocketmine\YmlServerProperties; use Ramsey\Uuid\Uuid; use function array_map; use function array_values; @@ -57,7 +58,7 @@ class SendUsageTask extends AsyncTask{ * @phpstan-param array $playerList */ public function __construct(Server $server, int $type, array $playerList = []){ - $endpoint = "http://" . $server->getConfigGroup()->getPropertyString("anonymous-statistics.host", "stats.pocketmine.net") . "/"; + $endpoint = "http://" . $server->getConfigGroup()->getPropertyString(YmlServerProperties::ANONYMOUS_STATISTICS_HOST, "stats.pocketmine.net") . "/"; $data = []; $data["uniqueServerId"] = $server->getServerUniqueId()->toString(); diff --git a/src/updater/UpdateChecker.php b/src/updater/UpdateChecker.php index ddb0f4d669..4a3ee34446 100644 --- a/src/updater/UpdateChecker.php +++ b/src/updater/UpdateChecker.php @@ -27,6 +27,7 @@ use pocketmine\event\server\UpdateNotifyEvent; use pocketmine\Server; use pocketmine\utils\VersionString; use pocketmine\VersionInfo; +use pocketmine\YmlServerProperties; use function date; use function strtolower; use function ucfirst; @@ -43,7 +44,7 @@ class UpdateChecker{ $this->logger = new \PrefixedLogger($server->getLogger(), "Update Checker"); $this->endpoint = "http://$endpoint/api/"; - if($server->getConfigGroup()->getPropertyBool("auto-updater.enabled", true)){ + if($server->getConfigGroup()->getPropertyBool(YmlServerProperties::AUTO_UPDATER_ENABLED, true)){ $this->doCheck(); } } @@ -59,7 +60,7 @@ class UpdateChecker{ $this->checkUpdate($updateInfo); if($this->hasUpdate()){ (new UpdateNotifyEvent($this))->call(); - if($this->server->getConfigGroup()->getPropertyBool("auto-updater.on-update.warn-console", true)){ + if($this->server->getConfigGroup()->getPropertyBool(YmlServerProperties::AUTO_UPDATER_ON_UPDATE_WARN_CONSOLE, true)){ $this->showConsoleUpdate(); } }else{ @@ -157,7 +158,7 @@ class UpdateChecker{ * Returns the channel used for update checking (stable, beta, dev) */ public function getChannel() : string{ - return strtolower($this->server->getConfigGroup()->getPropertyString("auto-updater.preferred-channel", "stable")); + return strtolower($this->server->getConfigGroup()->getPropertyString(YmlServerProperties::AUTO_UPDATER_PREFERRED_CHANNEL, "stable")); } /** diff --git a/src/world/World.php b/src/world/World.php index d917a3e821..903cc60e2b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -104,6 +104,7 @@ use pocketmine\world\particle\Particle; use pocketmine\world\sound\BlockPlaceSound; use pocketmine\world\sound\Sound; use pocketmine\world\utils\SubChunkExplorer; +use pocketmine\YmlServerProperties; use function abs; use function array_filter; use function array_key_exists; @@ -513,14 +514,14 @@ class World implements ChunkManager{ $this->time = $this->provider->getWorldData()->getTime(); $cfg = $this->server->getConfigGroup(); - $this->chunkTickRadius = min($this->server->getViewDistance(), max(0, $cfg->getPropertyInt("chunk-ticking.tick-radius", 4))); + $this->chunkTickRadius = min($this->server->getViewDistance(), max(0, $cfg->getPropertyInt(YmlServerProperties::CHUNK_TICKING_TICK_RADIUS, 4))); if($cfg->getPropertyInt("chunk-ticking.per-tick", 40) <= 0){ //TODO: this needs l10n $this->logger->warning("\"chunk-ticking.per-tick\" setting is deprecated, but you've used it to disable chunk ticking. Set \"chunk-ticking.tick-radius\" to 0 in \"pocketmine.yml\" instead."); $this->chunkTickRadius = 0; } - $this->tickedBlocksPerSubchunkPerTick = $cfg->getPropertyInt("chunk-ticking.blocks-per-subchunk-per-tick", self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK); - $this->maxConcurrentChunkPopulationTasks = $cfg->getPropertyInt("chunk-generation.population-queue-size", 2); + $this->tickedBlocksPerSubchunkPerTick = $cfg->getPropertyInt(YmlServerProperties::CHUNK_TICKING_BLOCKS_PER_SUBCHUNK_PER_TICK, self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK); + $this->maxConcurrentChunkPopulationTasks = $cfg->getPropertyInt(YmlServerProperties::CHUNK_GENERATION_POPULATION_QUEUE_SIZE, 2); $this->initRandomTickBlocksFromConfig($cfg); @@ -541,7 +542,7 @@ class World implements ChunkManager{ private function initRandomTickBlocksFromConfig(ServerConfigGroup $cfg) : void{ $dontTickBlocks = []; $parser = StringToItemParser::getInstance(); - foreach($cfg->getProperty("chunk-ticking.disable-block-ticking", []) as $name){ + foreach($cfg->getProperty(YmlServerProperties::CHUNK_TICKING_DISABLE_BLOCK_TICKING, []) as $name){ $name = (string) $name; $item = $parser->parse($name); if($item !== null){ From 2912e7ca2962495aaf7e0d2e54fa13b572186055 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 13:27:07 +0100 Subject: [PATCH 1345/1858] ... --- ...enerate-pocketmine-yml-property-consts.php | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php index b0e79519aa..93d6239182 100644 --- a/build/generate-pocketmine-yml-property-consts.php +++ b/build/generate-pocketmine-yml-property-consts.php @@ -62,9 +62,34 @@ if($file === false){ fwrite(STDERR, "Failed to open output file\n"); exit(1); } -fwrite($file, " $propertyName){ fwrite($file, "\tpublic const $constName = '$propertyName';\n"); From 4a0a538278edbb375d228093c3947d7a208d817d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 13:27:40 +0100 Subject: [PATCH 1346/1858] CS --- build/generate-pocketmine-yml-property-consts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php index 93d6239182..23d1de04a8 100644 --- a/build/generate-pocketmine-yml-property-consts.php +++ b/build/generate-pocketmine-yml-property-consts.php @@ -36,7 +36,7 @@ if(!is_array($defaultConfig)){ $constants = []; /** - * @param mixed[] $properties + * @param mixed[] $properties * @param string[] $constants * @phpstan-param array $constants * @phpstan-param-out array $constants From 9fdb6ba5aa4df65a78684db2c8d10fc3d8a9f7b4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 25 Aug 2023 14:02:49 +0100 Subject: [PATCH 1347/1858] Mark some new things as internal --- build/generate-pocketmine-yml-property-consts.php | 10 ++++++++++ src/ServerProperties.php | 4 ++++ src/YmlServerProperties.php | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php index 23d1de04a8..90342a75fc 100644 --- a/build/generate-pocketmine-yml-property-consts.php +++ b/build/generate-pocketmine-yml-property-consts.php @@ -90,6 +90,16 @@ HEADER fwrite($file, "declare(strict_types=1);\n\n"); fwrite($file, "namespace pocketmine;\n\n"); +fwrite($file, <<<'DOC' +/** + * @internal + * Constants for all properties available in pocketmine.yml. + * This is generated by build/generate-pocketmine-yml-property-consts.php. + * Do not edit this file manually. + */ + +DOC +); fwrite($file, "final class YmlServerProperties{\n"); foreach(Utils::stringifyKeys($constants) as $constName => $propertyName){ fwrite($file, "\tpublic const $constName = '$propertyName';\n"); diff --git a/src/ServerProperties.php b/src/ServerProperties.php index 884ff4f67f..aad26d2424 100644 --- a/src/ServerProperties.php +++ b/src/ServerProperties.php @@ -23,6 +23,10 @@ declare(strict_types=1); namespace pocketmine; +/** + * @internal + * Constants for all properties available in server.properties. + */ final class ServerProperties{ public const AUTO_SAVE = "auto-save"; diff --git a/src/YmlServerProperties.php b/src/YmlServerProperties.php index 920f0797ad..7d088b13c3 100644 --- a/src/YmlServerProperties.php +++ b/src/YmlServerProperties.php @@ -23,6 +23,12 @@ declare(strict_types=1); namespace pocketmine; +/** + * @internal + * Constants for all properties available in pocketmine.yml. + * This is generated by build/generate-pocketmine-yml-property-consts.php. + * Do not edit this file manually. + */ final class YmlServerProperties{ public const ALIASES = 'aliases'; public const ANONYMOUS_STATISTICS = 'anonymous-statistics'; From 19e3d339f6c119fb30b49e2a502b69882fee310f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AD=E3=82=89=E3=81=B2=E3=81=8B=E3=81=A0?= Date: Tue, 29 Aug 2023 19:43:21 +0900 Subject: [PATCH 1348/1858] InGamePacketHandler: subtract from raw position before rounding it (#6022) This allows better compensation for floating point errors introduced by the subtraction of the 1.62 height offset. For example, if the player is at y=7 exactly, their Y coordinate will be reported as 8.62, which, because of floating point errors, will be something like `8.619999999`. Subtracting `1.62` from this (really something like `1.62000000000005...`) leads to the calculated Y coordinate being slightly below 7. Rounding after subtracting this offset allows this to be rounded to 7 sharp. Similar errors appear in various other coordinates. --- src/network/mcpe/handler/InGamePacketHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 729b5b51be..30841d8060 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -201,7 +201,7 @@ class InGamePacketHandler extends PacketHandler{ } $hasMoved = $this->lastPlayerAuthInputPosition === null || !$this->lastPlayerAuthInputPosition->equals($rawPos); - $newPos = $rawPos->round(4)->subtract(0, 1.62, 0); + $newPos = $rawPos->subtract(0, 1.62, 0)->round(4); if($this->forceMoveSync && $hasMoved){ $curPos = $this->player->getLocation(); From 540f088edaaa24adb604d165ebcfbd7ed2c51f1d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Sep 2023 20:51:45 +0100 Subject: [PATCH 1349/1858] tools/generate-bedrock-data-from-packets: make duplicate reporting less spammy --- tools/generate-bedrock-data-from-packets.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index a8ea6554b2..ab8a28ced0 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -440,17 +440,22 @@ class ParserPacketHandler extends PacketHandler{ //how the data is ordered doesn't matter as long as it's reproducible foreach($recipes as $_type => $entries){ $_sortedRecipes = []; + $_seen = []; foreach($entries as $entry){ $entry = self::sort($entry); $_key = json_encode($entry); - while(isset($_sortedRecipes[$_key])){ - echo "warning: duplicated $_type recipe: $_key\n"; - $_key .= "a"; - } - $_sortedRecipes[$_key] = $entry; + $duplicates = $_seen[$_key] ??= 0; + $_seen[$_key]++; + $suffix = chr(ord("a") + $duplicates); + $_sortedRecipes[$_key . $suffix] = $entry; } ksort($_sortedRecipes, SORT_STRING); $recipes[$_type] = array_values($_sortedRecipes); + foreach($_seen as $_key => $_seenCount){ + if($_seenCount > 1){ + fwrite(STDERR, "warning: $_type recipe $_key was seen $_seenCount times\n"); + } + } } ksort($recipes, SORT_STRING); From ce044783952d17f273f003fb9b2a89a23365719e Mon Sep 17 00:00:00 2001 From: Jonathan B <45127993+Crasher508@users.noreply.github.com> Date: Wed, 6 Sep 2023 09:15:27 +0200 Subject: [PATCH 1350/1858] Fix SmithingTableInventory size (#6035) Since 1.20 SmithingTable has a new Template slot, size is now 3 Fix debug error from InventoryManager --- src/block/inventory/SmithingTableInventory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/inventory/SmithingTableInventory.php b/src/block/inventory/SmithingTableInventory.php index a01b80cad0..2f67ac9d2d 100644 --- a/src/block/inventory/SmithingTableInventory.php +++ b/src/block/inventory/SmithingTableInventory.php @@ -32,6 +32,6 @@ final class SmithingTableInventory extends SimpleInventory implements BlockInven public function __construct(Position $holder){ $this->holder = $holder; - parent::__construct(2); + parent::__construct(3); } } From a91ca999feede9bb05195ee3baf886efceafab42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 08:32:33 +0100 Subject: [PATCH 1351/1858] Bump actions/checkout from 3 to 4 (#6032) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 2 +- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 10 +++++----- .github/workflows/update-updater-api.yml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index c6a5a8ed2a..fefc06c0a9 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -28,7 +28,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Clone pmmp/PocketMine-Docker repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: pmmp/PocketMine-Docker fetch-depth: 1 diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index a8282f542a..a749229380 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP and tools uses: shivammathur/setup-php@2.25.5 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 7dc9f08b15..4cf78f57ef 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -15,7 +15,7 @@ jobs: php-version: [8.1] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 022e0ab3a2..81a0eeb788 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: php: ["8.1", "8.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP uses: pmmp/setup-php-action@2.0.0 @@ -52,7 +52,7 @@ jobs: php: ["8.1", "8.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP uses: pmmp/setup-php-action@2.0.0 @@ -87,7 +87,7 @@ jobs: php: ["8.1", "8.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true @@ -124,7 +124,7 @@ jobs: php: ["8.1", "8.2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP uses: pmmp/setup-php-action@2.0.0 @@ -170,7 +170,7 @@ jobs: fail-fast: false steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP and tools uses: shivammathur/setup-php@2.25.5 diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml index 7a695306be..3f42062fdb 100644 --- a/.github/workflows/update-updater-api.yml +++ b/.github/workflows/update-updater-api.yml @@ -14,7 +14,7 @@ jobs: - name: Install jq run: sudo apt update && sudo apt install jq -y - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/update.pmmp.io ssh-key: ${{ secrets.UPDATE_PMMP_IO_DEPLOY_KEY }} From 0920c76a35952505f67d75e4f12dab7b96da013e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 08:37:05 +0100 Subject: [PATCH 1352/1858] Bump build/php from `8884039` to `3331f8c` (#6031) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `8884039` to `3331f8c`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/8884039bee1db64acca83edd57ed5e25d69287b9...3331f8c0d50075eee250ac4b3a8517a12186137a) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 8884039bee..3331f8c0d5 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 8884039bee1db64acca83edd57ed5e25d69287b9 +Subproject commit 3331f8c0d50075eee250ac4b3a8517a12186137a From a7c806d54975c675e971296c79615d642c6e1d06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:24:23 +0100 Subject: [PATCH 1353/1858] Bump phpunit/phpunit from 10.3.2 to 10.3.3 (#6033) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.3.2 to 10.3.3. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.3.3/ChangeLog-10.3.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.3.2...10.3.3) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 75 ++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/composer.lock b/composer.lock index c864786f33..0c348da810 100644 --- a/composer.lock +++ b/composer.lock @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.3", + "version": "10.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" }, "funding": [ { @@ -1615,20 +1615,20 @@ "type": "github" } ], - "time": "2023-07-26T13:45:28+00:00" + "time": "2023-08-31T14:04:38+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5647d65443818959172645e7ed999217360654b6" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", - "reference": "5647d65443818959172645e7ed999217360654b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -1668,7 +1668,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -1676,7 +1676,7 @@ "type": "github" } ], - "time": "2023-05-07T09:13:23+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -1743,16 +1743,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -1790,7 +1790,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -1798,7 +1799,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -1861,16 +1862,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.2", + "version": "10.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", "shasum": "" }, "require": { @@ -1942,7 +1943,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" }, "funding": [ { @@ -1958,7 +1959,7 @@ "type": "tidelift" } ], - "time": "2023-08-15T05:34:23+00:00" + "time": "2023-09-05T04:34:51+00:00" }, { "name": "sebastian/cli-parser", @@ -2206,16 +2207,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", "shasum": "" }, "require": { @@ -2251,7 +2252,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" }, "funding": [ { @@ -2259,7 +2261,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-08-31T09:55:53+00:00" }, { "name": "sebastian/diff", @@ -2533,16 +2535,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -2578,7 +2580,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -2586,7 +2589,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", From 67f399b238afa06091f8bd72759f052b728b55e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:24:41 +0100 Subject: [PATCH 1354/1858] Bump phpstan/phpstan-phpunit from 1.3.13 to 1.3.14 (#6021) Bumps [phpstan/phpstan-phpunit](https://github.com/phpstan/phpstan-phpunit) from 1.3.13 to 1.3.14. - [Release notes](https://github.com/phpstan/phpstan-phpunit/releases) - [Commits](https://github.com/phpstan/phpstan-phpunit/compare/1.3.13...1.3.14) --- updated-dependencies: - dependency-name: phpstan/phpstan-phpunit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 0c348da810..9e3fedec8d 100644 --- a/composer.lock +++ b/composer.lock @@ -1440,16 +1440,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.13", + "version": "1.3.14", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5" + "reference": "614acc10c522e319639bf38b0698a4a566665f04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d8bdab0218c5eb0964338d24a8511b65e9c94fa5", - "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/614acc10c522e319639bf38b0698a4a566665f04", + "reference": "614acc10c522e319639bf38b0698a4a566665f04", "shasum": "" }, "require": { @@ -1462,7 +1462,7 @@ "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^9.5" }, "type": "phpstan-extension", @@ -1486,9 +1486,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.13" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.14" }, - "time": "2023-05-26T11:05:59+00:00" + "time": "2023-08-25T09:46:39+00:00" }, { "name": "phpstan/phpstan-strict-rules", From e95a920fb812595d7326fd09af61e1081d07276c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 10:49:54 +0100 Subject: [PATCH 1355/1858] Update composer dependencies --- composer.lock | 174 ++++++++++++++++++++++++++------------------------ 1 file changed, 89 insertions(+), 85 deletions(-) diff --git a/composer.lock b/composer.lock index 6315dfefa4..9634a6575b 100644 --- a/composer.lock +++ b/composer.lock @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.3+bedrock-1.20.10", + "version": "23.0.4+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9" + "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e4157c7af3f91e1b08fe21be171eb73dad7029e9", - "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ae0d8f4d49506674b7ff622f7c81ce241dc49adb", + "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb", "shasum": "" }, "require": { @@ -299,7 +299,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.7", + "phpstan/phpstan": "1.10.33", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.3+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.4+bedrock-1.20.10" }, - "time": "2023-08-03T15:30:52+00:00" + "time": "2023-09-06T07:36:44+00:00" }, { "name": "pocketmine/binaryutils", @@ -1153,16 +1153,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -1177,7 +1177,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1215,7 +1215,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -1231,20 +1231,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -1259,7 +1259,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1298,7 +1298,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -1314,20 +1314,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -1336,7 +1336,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1381,7 +1381,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -1397,7 +1397,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "webmozart/assert", @@ -1571,16 +1571,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.16.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -1621,9 +1621,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -1800,16 +1800,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.13", + "version": "1.3.14", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5" + "reference": "614acc10c522e319639bf38b0698a4a566665f04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d8bdab0218c5eb0964338d24a8511b65e9c94fa5", - "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/614acc10c522e319639bf38b0698a4a566665f04", + "reference": "614acc10c522e319639bf38b0698a4a566665f04", "shasum": "" }, "require": { @@ -1822,7 +1822,7 @@ "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^9.5" }, "type": "phpstan-extension", @@ -1846,9 +1846,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.13" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.14" }, - "time": "2023-05-26T11:05:59+00:00" + "time": "2023-08-25T09:46:39+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -1901,16 +1901,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.3", + "version": "10.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", "shasum": "" }, "require": { @@ -1967,7 +1967,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" }, "funding": [ { @@ -1975,20 +1975,20 @@ "type": "github" } ], - "time": "2023-07-26T13:45:28+00:00" + "time": "2023-08-31T14:04:38+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5647d65443818959172645e7ed999217360654b6" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", - "reference": "5647d65443818959172645e7ed999217360654b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -2028,7 +2028,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -2036,7 +2036,7 @@ "type": "github" } ], - "time": "2023-05-07T09:13:23+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -2103,16 +2103,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -2150,7 +2150,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -2158,7 +2159,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -2221,16 +2222,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.1", + "version": "10.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804" + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804", - "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", "shasum": "" }, "require": { @@ -2302,7 +2303,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" }, "funding": [ { @@ -2318,7 +2319,7 @@ "type": "tidelift" } ], - "time": "2023-08-04T06:48:08+00:00" + "time": "2023-09-05T04:34:51+00:00" }, { "name": "sebastian/cli-parser", @@ -2489,16 +2490,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { @@ -2509,7 +2510,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { @@ -2553,7 +2554,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -2561,20 +2563,20 @@ "type": "github" } ], - "time": "2023-02-03T07:07:16+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", "shasum": "" }, "require": { @@ -2610,7 +2612,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" }, "funding": [ { @@ -2618,7 +2621,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-08-31T09:55:53+00:00" }, { "name": "sebastian/diff", @@ -2892,16 +2895,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -2937,7 +2940,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -2945,7 +2949,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", @@ -3319,5 +3323,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From b1ab69ac6c14e2f00bbac95187eee6a2dbd31fcc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 10:51:22 +0100 Subject: [PATCH 1356/1858] Updated build/php submodule to pmmp/PHP-Binaries@3331f8c0d50075eee250ac4b3a8517a12186137a --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 46604f2f6a..3331f8c0d5 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 46604f2f6a07e3f68a82e4f4d7efdd45629b101e +Subproject commit 3331f8c0d50075eee250ac4b3a8517a12186137a From 857c2edc2c1787b3dd60b30a4a0a1de3479f11fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 10:58:41 +0100 Subject: [PATCH 1357/1858] Server: update obsoletion notice with new announcement and cutoff date --- src/Server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Server.php b/src/Server.php index d1f7ea4b9d..ff5503e3dd 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1056,8 +1056,8 @@ class Server{ $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_donate(TextFormat::AQUA . "https://patreon.com/pocketminemp" . TextFormat::RESET))); $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning1("4.x", "5.0"))); - $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning2("4.x", "2023-09-01"))); - $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning3("https://github.com/pmmp/PocketMine-MP/issues/5784"))); + $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning2("4.x", "2024-01-01"))); + $this->logger->alert($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_obsolete_warning3("https://github.com/pmmp/PocketMine-MP/issues/6036"))); $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_startFinished(strval(round(microtime(true) - $this->startTime, 3))))); From be4e091d40aa77bff925ac7a4549a385eaba83f9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:03:15 +0100 Subject: [PATCH 1358/1858] Update draft release notice --- .github/workflows/draft-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index aa6fd885d0..b63d356350 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -102,4 +102,4 @@ jobs: :information_source: Download the recommended PHP binary [here](${{ steps.php-binary-url.outputs.PHP_BINARY_URL }}). - :warning: **4.x is now deprecated. Please read https://github.com/pmmp/PocketMine-MP/issues/5784 for details, and prepare to upgrade to 5.x.** + :skull: **4.x is now obsolete and may stop getting updates at any time. Please read https://github.com/pmmp/PocketMine-MP/issues/6036 for details.** From a0c7587b68c0dade28834dd824de0408b25a806d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:09:28 +0100 Subject: [PATCH 1359/1858] Update composer dependencies --- composer.lock | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/composer.lock b/composer.lock index 9e3fedec8d..52700d9fd0 100644 --- a/composer.lock +++ b/composer.lock @@ -200,16 +200,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.3+bedrock-1.20.10", + "version": "23.0.4+bedrock-1.20.10", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9" + "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e4157c7af3f91e1b08fe21be171eb73dad7029e9", - "reference": "e4157c7af3f91e1b08fe21be171eb73dad7029e9", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ae0d8f4d49506674b7ff622f7c81ce241dc49adb", + "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb", "shasum": "" }, "require": { @@ -223,7 +223,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.7", + "phpstan/phpstan": "1.10.33", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5" @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.3+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.4+bedrock-1.20.10" }, - "time": "2023-08-03T15:30:52+00:00" + "time": "2023-09-06T07:36:44+00:00" }, { "name": "pocketmine/binaryutils", @@ -985,16 +985,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -1009,7 +1009,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1047,7 +1047,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -1063,20 +1063,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -1091,7 +1091,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1130,7 +1130,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -1146,7 +1146,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" } ], "packages-dev": [ @@ -2963,5 +2963,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 690ee4c574e6d696103780ebef42b30b701c82d5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:24:08 +0100 Subject: [PATCH 1360/1858] CrashDump: fixed empty elements in lastError trace as shown by #6010 --- src/crash/CrashDump.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index ded1e5d88a..741a88ca6b 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -206,6 +206,7 @@ class CrashDump{ if(isset($lastError)){ $this->data->lastError = $lastError; $this->data->lastError["message"] = mb_scrub($this->data->lastError["message"], 'UTF-8'); + $this->data->lastError["trace"] = array_map(array: $lastError["trace"], callback: fn(ThreadCrashInfoFrame $frame) => $frame->getPrintableFrame()); } $this->data->error = $error; From b160b87e249c05de684e291f609572a1ad3cbee7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:34:03 +0100 Subject: [PATCH 1361/1858] Server: stop discriminating against crashes caused by folder plugins these are the de facto standard, which means that a lot of crashes aren't getting reported from servers with folder plugins. --- src/Server.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Server.php b/src/Server.php index 148c93b8ee..fb8a2bb6ea 100644 --- a/src/Server.php +++ b/src/Server.php @@ -80,7 +80,6 @@ use pocketmine\player\PlayerDataProvider; use pocketmine\player\PlayerDataSaveException; use pocketmine\player\PlayerInfo; use pocketmine\plugin\PharPluginLoader; -use pocketmine\plugin\Plugin; use pocketmine\plugin\PluginEnableOrder; use pocketmine\plugin\PluginGraylist; use pocketmine\plugin\PluginManager; @@ -1606,15 +1605,6 @@ class Server{ } @touch($stamp); //update file timestamp - $plugin = $dump->getData()->plugin; - if($plugin !== ""){ - $p = $this->pluginManager->getPlugin($plugin); - if($p instanceof Plugin && !($p->getPluginLoader() instanceof PharPluginLoader)){ - $this->logger->debug("Not sending crashdump due to caused by non-phar plugin"); - $report = false; - } - } - if($dump->getData()->error["type"] === \ParseError::class){ $report = false; } From 6aab07debdb235adeb3df76c6cbca7be96699007 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:53:01 +0100 Subject: [PATCH 1362/1858] Release 5.4.4 --- changelogs/5.4.md | 12 ++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelogs/5.4.md b/changelogs/5.4.md index 7dd95a657a..43f6096207 100644 --- a/changelogs/5.4.md +++ b/changelogs/5.4.md @@ -119,3 +119,15 @@ Released 21st August 2023. - Fixed `PotionCauldron::setPotionItem()` not validating the item type. - Fixed chorus fruit not considering teleport destinations below y=0. - Fixed cake dropping itself when mined. + +# 5.4.4 +Released 6th September 2023. + +## General +- Crashdumps caused by non-phar plugins are now submitted to the Crash Archive, the same as other plugins. Previously, non-phar plugin crashes would not be submitted, causing maintainers to potentially miss important issues. + +## Fixes +- Fixed player Y coordinates sometimes being slightly below the top of the block they were standing on (floating point error due to subtracting eye height). +- Fixed template slot of smithing tables not accepting any items. +- `tools/generate-bedrock-data-from-packets.php` is now significantly less spammy when warning about duplicated recipes. +- Fixed empty stack traces in `lastError` data of crashdumps. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c9109487b7..80828048db 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.4.4"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 73a44d50eeac48dbebd913f9c52312f7f7b56439 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 11:53:04 +0100 Subject: [PATCH 1363/1858] 5.4.5 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 80828048db..c523d3d950 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.4.4"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.4.5"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From ec1cd5967dc0e4eab1a6bcb263b1f798df47fc66 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 12:12:11 +0100 Subject: [PATCH 1364/1858] Added private constructors for new internal classes --- build/generate-pocketmine-yml-property-consts.php | 9 +++++++++ src/ServerProperties.php | 4 ++++ src/YmlServerProperties.php | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php index 90342a75fc..dcc574f8ab 100644 --- a/build/generate-pocketmine-yml-property-consts.php +++ b/build/generate-pocketmine-yml-property-consts.php @@ -101,6 +101,15 @@ fwrite($file, <<<'DOC' DOC ); fwrite($file, "final class YmlServerProperties{\n"); +fwrite($file, <<<'CONSTRUCTOR' + + private function __construct(){ + //NOOP + } + + +CONSTRUCTOR +); foreach(Utils::stringifyKeys($constants) as $constName => $propertyName){ fwrite($file, "\tpublic const $constName = '$propertyName';\n"); } diff --git a/src/ServerProperties.php b/src/ServerProperties.php index aad26d2424..ddbbd81340 100644 --- a/src/ServerProperties.php +++ b/src/ServerProperties.php @@ -29,6 +29,10 @@ namespace pocketmine; */ final class ServerProperties{ + private function __construct(){ + //NOOP + } + public const AUTO_SAVE = "auto-save"; public const DEFAULT_WORLD_GENERATOR = "level-type"; public const DEFAULT_WORLD_GENERATOR_SETTINGS = "generator-settings"; diff --git a/src/YmlServerProperties.php b/src/YmlServerProperties.php index 7d088b13c3..9bd203eef8 100644 --- a/src/YmlServerProperties.php +++ b/src/YmlServerProperties.php @@ -30,6 +30,11 @@ namespace pocketmine; * Do not edit this file manually. */ final class YmlServerProperties{ + + private function __construct(){ + //NOOP + } + public const ALIASES = 'aliases'; public const ANONYMOUS_STATISTICS = 'anonymous-statistics'; public const ANONYMOUS_STATISTICS_ENABLED = 'anonymous-statistics.enabled'; From c8d357f4eb360b632df47a0c7ec93ddb1a89a995 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 12:13:26 +0100 Subject: [PATCH 1365/1858] Release 5.5.0 --- changelogs/5.5.md | 162 ++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 +- 2 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 changelogs/5.5.md diff --git a/changelogs/5.5.md b/changelogs/5.5.md new file mode 100644 index 0000000000..750e211290 --- /dev/null +++ b/changelogs/5.5.md @@ -0,0 +1,162 @@ +# 5.5.0 +Released 6th September 2023. + +**For Minecraft: Bedrock Edition 1.20.10** + +This is a minor feature release, including performance improvements, new API methods, and new gameplay features. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## Dependencies +- Updated `pocketmine/math` dependency to [`1.0.0`](https://github.com/pmmp/Math/releases/tag/1.0.0). +- Updated `pocketmine/nbt` dependency to [`1.0.0`](https://github.com/pmmp/NBT/releases/tag/1.0.0). + +## Performance +- Some events are now no longer fired if no handlers are registered. + - This improves performance by avoiding unnecessary object allocations and function calls. + - Events such as `DataPacketReceiveEvent`, `DataPacketSendEvent` and `PlayerMoveEvent` are optimized away almost completely by this change, offering some much-needed performance gains. +- Significantly improved performance of small moving entities, such as dropped items. + - This was achieved by a combination of changes, which together improved observed performance with 2000 item entities moving in water by 30-40%. + - The benefit of this will be most noticeable in SkyBlock servers, where large cactus farms can generate thousands of dropped items. +- `World->getCollisionBoxes()` now uses an improved search method, which reduces the work done by the function by almost 90% for small entities. + - This improves performance of collision detection for small entities, such as dropped items. + +## Gameplay +### General +- Implemented enchanting using an enchanting table (yes, finally!) + - Thanks to [@S3v3Nice](https://github.com/S3v3Nice) for investing lots of time and effort into developing this. + - Since this feature is quite complex, it's possible there may be bugs. Please be vigilant and report any issues you find. + +### Blocks +- The following new blocks have been implemented: + - Pink Petals +- Pressure plates are now functional, in the sense that they react when entities stand on them and perform the correct logic. + - Note that since redstone is not yet implemented, pressure plates do not activate any redstone devices, similar to buttons and levers. +- Signs can now be edited by right-clicking them. +- Signs can now be waxed using a honeycomb, which prevents them from being edited. + +### Items +- The following new items have been implemented: + - Enchanted Book + +## API +### `pocketmine\block` +- The following new API methods have been added: + - `public Block->getEnchantmentTags() : list` returns a list of strings indicating which types of enchantment can be applied to the block when in item form + - `public BlockTypeInfo->getEnchantmentTags() : list` + - `protected PressurePlate->getActivationBox() : AxisAlignedBB` - returns the AABB entities must intersect with in order to activate the pressure plate (not the same as the visual shape) + - `protected PressurePlate->hasOutputSignal() : bool` - returns whether the pressure plate has an output signal - this should be implemented by subclasses + - `protected PressurePlate->calculatePlateState() : array{Block, ?bool}` - returns the state the pressure plate will change to if the given list of entities are standing on it, and a bool indicating whether the plate activated or deactivated this tick + - `protected PressurePlate->filterIrrelevantEntities(list $entities) : list` - returns the given list filtered of entities that don't affect the plate's state (e.g. dropped items don't affect stone pressure plates) + - `public BaseSign->isWaxed() : bool` + - `public BaseSign->setWaxed(bool $waxed) : $this` + - `public inventory\EnchantInventory->getInput() : Item` + - `public inventory\EnchantInventory->getLapis() : Item` + - `public inventory\EnchantInventory->getOutput(int $optionId) : ?Item` - returns the item that would be produced if the input item was enchanted with the selected option, or `null` if the option is invalid + - `public inventory\EnchantInventory->getOption(int $optionId) : EnchantOption` - returns the enchanting option at the given index +- The following API methods have signature changes: + - `BlockTypeInfo->__construct()` now accepts an optional `list $enchantmentTags` parameter + - `PressurePlate->__construct()` now accepts an optional `int $deactivationDelayTicks` parameter + - `WeightedPressurePlate->__construct()` now accepts optional `int $deactivationDelayTicks` and `float $signalStrengthFactor` parameters + - `SimplePressurePlate->__construct()` now accepts an optional `int $deactivationDelayTicks` parameter +- The following new classes have been added: + - `PinkPetals` + - `utils\BlockEventHelper` - provides helper methods for calling block-related events +- The following classes have been deprecated: + - `WeightedPressurePlateLight` + - `WeightedPressurePlateHeavy` + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Human->getEnchantmentSeed() : int` - returns the current seed used to randomize options shown on the enchanting table for this human + - `public Human->setEnchantmentSeed(int $seed) : void` + - `public Human->regenerateEnchantmentSeed() : void` - returns a new randomly generated seed which can be set with `setEnchantmentSeed()` + +### `pocketmine\event` +- The following new classes have been added: + - `block\FarmlandHydrationChangeEvent` - called when farmland is hydrated or dehydrated + - `block\PressurePlateUpdateEvent` - called when a pressure plate is activated or changes its power output + - `player\PlayerEnchantingOptionsRequestEvent` - called when a player puts an item to be enchanted into an enchanting table, to allow plugins to modify the enchanting options shown + - `player\PlayerItemEnchantEvent` - called when a player enchants an item in an enchanting table + - `world\WorldDifficultyChangeEvent` - called when a world's difficulty is changed +- The following new API methods have been added: + - `public static Event::hasHandlers() : bool` - returns whether the event class has any registered handlers - used like `SomeEvent::hasHandlers()` + - `public HandlerListManager->getHandlersFor(class-string $event) : list` - returns a list of all registered listeners for the given event class, using cache if available + +### `pocketmine\inventory\transaction` +- The following new classes have been added: + - `EnchantingTransaction` - used when a player enchants an item in an enchanting table + +### `pocketmine\item` +- The following new API methods have been added: + - `public Armor->getMaterial() : ArmorMaterial` - returns an object containing properties shared by all items of the same armor material + - `public ArmorTypeInfo->getMaterial() : ArmorMaterial` + - `public Item->getEnchantability() : int` - returns the enchantability value of the item - higher values increase the chance of more powerful enchantments being offered by an enchanting table + - `public Item->getEnchantmentTags() : list` - returns a list of strings indicating which types of enchantment can be applied to the item + - `public ToolTier->getEnchantability() : int` +- The following API methods have signature changes: + - `Item->__construct()` now accepts an optional `list $enchantmentTags` parameter + - `ArmorTypeInfo->__construct()` now accepts an optional `?ArmorMaterial $material` parameter +- The following new classes have been added: + - `ArmorMaterial` - container for shared armor properties + - `VanillaArmorMaterials` - all vanilla armor materials + - `EnchantedBook` - represents an enchanted book item + +### `pocketmine\item\enchantment` +- The following new classes have been added: + - `AvailableEnchantmentRegistry` - enchantments to be displayed on the enchanting table are selected from here - custom enchantments may be added + - `EnchantingHelper` - static class containing various helper methods for enchanting tables + - `EnchantingOption` - represents an option on the enchanting table menu + - `IncompatibleEnchantmentGroups` - list of constants naming groups of enchantments that are incompatible with each other - custom enchantments may be added using these group names to make them incompatible with existing enchantments in the same group + - `IncompatibleEnchantmentRegistry` - manages which enchantments are considered incompatible with each other - custom enchantments may be added using existing group names to make them incompatible with existing enchantments in the same group, or to entirely new groups + - `ItemEnchantmentTagRegistry` - manages item enchantment compatibility tags and which tags include which other tags + - `ItemEnchantmentTags` - list of constants naming item types for enchantment compatibility checks +- The following classes have been deprecated + - `ItemFlags` +- The following API methods have been added: + - `public Enchantment->isCompatibleWith(Enchantment $other) : bool` + - `public Enchantment->getMinEnchantingPower()` - returns the minimum enchanting power (derived from enchantability and number of bookshelves) needed to allow this enchantment to show on the enchanting table with a given level + - `public Enchantment->getMaxEnchantingPower()` - upper limit of enchanting power for this enchantment to be offered on the enchanting table with a given level +- The following API methods have signature changes: + - `Enchantment->__construct()` now accepts optional `(\Closure(int $level) : int)|null $minEnchantingPower` and `int $enchantingPowerRange` parameters + - `Enchantment->__construct()` parameters `$primaryItemFlags` and `$secondaryItemFlags` are now deprecated and no longer used + - `ProtectionEnchantment->__construct()` has extra parameters to reflect `Enchantment->__construct()` changes +- The following API methods have been deprecated: + - `Enchantment->getPrimaryItemFlags()` - use API methods provided by `AvailableEnchantmentRegistry` instead + - `Enchantment->getSecondaryItemFlags()` - use API methods provided by `AvailableEnchantmentRegistry` instead + - `Enchantment->hasPrimaryItemType()` + - `Enchantment->hasSecondaryItemType()` + +### `pocketmine\plugin` +- The following new API methods have been added: + - `public PluginBase->getResourcePath(string $filename) : string` - returns a URI to an embedded resource file that can be used with `file_get_contents()` and similar functions + - `public PluginBase->getResourceFolder() : string` - returns a URI to the plugin's folder of embedded resources +- The following API methods have been deprecated: + - `PluginBase->getResource()` - prefer using `getResourcePath()` with `file_get_contents()` or other PHP built-in functions instead + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setResourcePacksRequired(bool $value) : void` - sets whether players must accept resource packs in order to join + +### `pocketmine\world\generator` +- The following new API methods have been added: + - `public GeneratorManager->addAlias(string $name, string $alias) : void` - allows registering a generator alias without copying the generator registration parameters + +### `pocketmine\world\sound` +- The following new classes have been added: +- `PressurePlateActivateSound` +- `PressurePlateDeactivateSound` + +### `pocketmine\utils` +- The following new API methods have been added: + - `public StringToTParser->registerAlias(string $existing, string $alias) : void` - allows registering a string alias without copying registration parameters + +## Internals +- Various `TypeIdMap` classes in the `pocketmine\data\bedrock` package now use the new `IntSaveIdMapTrait` to reduce code duplication. +- Added a new `ServerProperties` class containing constants for all known `server.properties` keys. +- Added a new `YmlServerProperties` class containing generated constants for all known `pocketmine.yml` keys. These keys can be used with `Config->getNested()`. + diff --git a/src/VersionInfo.php b/src/VersionInfo.php index f792fe0a40..2037c5d06a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.5.0-BETA2"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "beta"; + public const BASE_VERSION = "5.5.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; /** * PocketMine-MP-specific version ID for world data. Used to determine what fixes need to be applied to old world From 79acc4fed4930b43bbd6e0ae3d692dc05c1d577e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 12:13:26 +0100 Subject: [PATCH 1366/1858] 5.5.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2037c5d06a..18f03233db 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.5.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.5.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From fe94379a937b8a194b3cdf820cd7d890c213878b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2023 12:56:47 +0100 Subject: [PATCH 1367/1858] Fixed connection requirements for fences, glass, bars and walls these connect to the back faces of stairs and to glass, for example. --- src/block/Fence.php | 2 +- src/block/Thin.php | 2 +- src/block/Wall.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/Fence.php b/src/block/Fence.php index 7180b38ea2..b57e81ded5 100644 --- a/src/block/Fence.php +++ b/src/block/Fence.php @@ -42,7 +42,7 @@ class Fence extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); - if($block instanceof static || $block instanceof FenceGate || ($block->isSolid() && !$block->isTransparent())){ + if($block instanceof static || $block instanceof FenceGate || $block->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ $this->connections[$facing] = true; }else{ unset($this->connections[$facing]); diff --git a/src/block/Thin.php b/src/block/Thin.php index 8de39f4ea8..2b89b4beed 100644 --- a/src/block/Thin.php +++ b/src/block/Thin.php @@ -41,7 +41,7 @@ class Thin extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $side = $this->getSide($facing); - if($side instanceof Thin || $side instanceof Wall || $side->isFullCube()){ + if($side instanceof Thin || $side instanceof Wall || $side->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ $this->connections[$facing] = true; }else{ unset($this->connections[$facing]); diff --git a/src/block/Wall.php b/src/block/Wall.php index 30584c92be..87ee0b1bdb 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -101,7 +101,7 @@ class Wall extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); - if($block instanceof static || $block instanceof FenceGate || $block instanceof Thin || ($block->isSolid() && !$block->isTransparent())){ + if($block instanceof static || $block instanceof FenceGate || $block instanceof Thin || $block->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ if(!isset($this->connections[$facing])){ $this->connections[$facing] = WallConnectionType::SHORT(); $changed++; From ae564e445dba4124f6539289b266297aa0fda577 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 17:20:52 +0100 Subject: [PATCH 1368/1858] Start migrating EnumTrait enums to PHP 8.1 native enums --- src/block/Anvil.php | 2 +- src/block/Bamboo.php | 2 +- src/block/BaseBanner.php | 2 +- src/block/BaseBigDripleaf.php | 2 +- src/block/BaseCake.php | 2 +- src/block/BaseCoral.php | 8 +- src/block/BaseSign.php | 2 +- src/block/Bed.php | 4 +- src/block/Bell.php | 42 +-- src/block/BigDripleafHead.php | 34 +- src/block/Block.php | 2 +- src/block/BrewingStand.php | 13 +- src/block/Cactus.php | 2 +- src/block/Candle.php | 2 +- src/block/Cauldron.php | 2 +- src/block/CaveVines.php | 4 +- src/block/Chain.php | 2 +- src/block/Chest.php | 2 +- src/block/CocoaBlock.php | 4 +- src/block/CopperStairs.php | 6 - src/block/CoralBlock.php | 6 - src/block/DaylightSensor.php | 2 +- src/block/Dirt.php | 13 +- src/block/Door.php | 2 +- src/block/DragonEgg.php | 2 +- src/block/EnchantingTable.php | 2 +- src/block/EnderChest.php | 2 +- src/block/Fence.php | 4 +- src/block/FenceGate.php | 2 +- src/block/FillableCauldron.php | 2 +- src/block/Fire.php | 2 +- src/block/Flowable.php | 2 +- src/block/Froglight.php | 7 +- src/block/GlowLichen.php | 8 +- src/block/Grass.php | 2 +- src/block/Hopper.php | 6 +- src/block/ItemFrame.php | 2 +- src/block/Ladder.php | 4 +- src/block/Lantern.php | 2 +- src/block/Leaves.php | 23 +- src/block/Lectern.php | 2 +- src/block/Lever.php | 19 +- src/block/Liquid.php | 2 +- src/block/MobHead.php | 7 +- src/block/MonsterSpawner.php | 2 +- src/block/Mycelium.php | 2 +- src/block/NetherPortal.php | 2 +- src/block/NetherVines.php | 2 +- src/block/PressurePlate.php | 4 +- src/block/RedMushroomBlock.php | 11 +- src/block/RedstoneComparator.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/SeaPickle.php | 2 +- src/block/ShulkerBox.php | 2 +- src/block/Slab.php | 35 +- src/block/SmallDripleaf.php | 2 +- src/block/SnowLayer.php | 6 +- src/block/SporeBlossom.php | 2 +- src/block/Stair.php | 31 +- src/block/Stonecutter.php | 2 +- src/block/Thin.php | 4 +- src/block/Torch.php | 2 +- src/block/Trapdoor.php | 2 +- src/block/VanillaBlocks.php | 13 +- src/block/Wall.php | 6 +- src/block/WoodLikeBlockIdHelper.php | 313 +++++++++--------- src/block/tile/MobHead.php | 9 +- src/block/utils/BannerPatternType.php | 92 +++-- src/block/utils/BellAttachmentType.php | 24 +- src/block/utils/BrewingStandSlot.php | 36 +- src/block/utils/CopperOxidation.php | 49 +-- src/block/utils/CopperTrait.php | 9 +- src/block/utils/CoralType.php | 43 +-- src/block/utils/CoralTypeTrait.php | 2 +- src/block/utils/DirtType.php | 22 +- src/block/utils/DripleafState.php | 41 +-- src/block/utils/FroglightType.php | 22 +- src/block/utils/LeavesType.php | 59 ++-- src/block/utils/LeverFacing.php | 47 ++- src/block/utils/MobHeadType.php | 49 ++- src/block/utils/MushroomBlockType.php | 38 +-- src/block/utils/SaplingType.php | 50 ++- src/block/utils/SlabType.php | 22 +- src/block/utils/StairShape.php | 26 +- src/block/utils/SupportType.php | 28 +- src/block/utils/WallConnectionType.php | 20 +- src/block/utils/WoodType.php | 73 ++-- .../CraftingManagerFromDataHelper.php | 8 +- src/crafting/ShapelessRecipeType.php | 24 +- src/data/bedrock/BannerPatternTypeIdMap.php | 86 ++--- src/data/bedrock/MobHeadTypeIdMap.php | 14 +- src/data/bedrock/MushroomBlockTypeIdMap.php | 22 +- src/data/bedrock/NoteInstrumentIdMap.php | 32 +- .../convert/BlockObjectToStateSerializer.php | 75 ++--- .../block/convert/BlockStateReader.php | 24 +- .../convert/BlockStateSerializerHelper.php | 14 +- .../BlockStateToObjectDeserializer.php | 134 ++++---- .../block/convert/BlockStateWriter.php | 53 ++- src/data/runtime/RuntimeDataReader.php | 13 +- .../runtime/RuntimeDataSizeCalculator.php | 2 +- src/data/runtime/RuntimeDataWriter.php | 15 +- src/item/Armor.php | 2 +- src/item/BoatType.php | 51 ++- src/item/Bow.php | 8 +- src/item/Bucket.php | 8 +- src/item/CoralFan.php | 2 - src/item/FireCharge.php | 4 +- src/item/FlintSteel.php | 4 +- src/item/GlassBottle.php | 4 +- src/item/Item.php | 6 +- src/item/ItemUseResult.php | 22 +- src/item/LiquidBucket.php | 6 +- src/item/PaintingItem.php | 6 +- src/item/ProjectileItem.php | 4 +- src/item/SpawnEgg.php | 2 +- src/item/StringToItemParser.php | 65 ++-- src/item/VanillaItems.php | 21 +- src/network/mcpe/NetworkSession.php | 2 +- src/network/mcpe/cache/CraftingDataCache.php | 11 +- src/player/Player.php | 24 +- src/player/UsedChunkStatus.php | 24 +- src/utils/EnumTrait.php | 3 + src/utils/LegacyEnumShimTrait.php | 92 +++++ src/world/World.php | 4 +- src/world/biome/BiomeRegistry.php | 2 +- src/world/biome/ForestBiome.php | 4 +- src/world/biome/TaigaBiome.php | 2 +- src/world/generator/object/TreeFactory.php | 30 +- src/world/generator/object/TreeType.php | 53 ++- src/world/generator/populator/Tree.php | 2 +- src/world/sound/NoteInstrument.php | 48 ++- 131 files changed, 1157 insertions(+), 1349 deletions(-) create mode 100644 src/utils/LegacyEnumShimTrait.php diff --git a/src/block/Anvil.php b/src/block/Anvil.php index de8b6d33cc..b4677e075d 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -78,7 +78,7 @@ class Anvil extends Transparent implements Fallable{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 980f4382d1..e4aaa4af77 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -95,7 +95,7 @@ class Bamboo extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } private static function getOffsetSeed(int $x, int $y, int $z) : int{ diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index fdfad3b095..932a09b10f 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -111,7 +111,7 @@ abstract class BaseBanner extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } private function canBeSupportedBy(Block $block) : bool{ diff --git a/src/block/BaseBigDripleaf.php b/src/block/BaseBigDripleaf.php index dcd81af0ab..b2547447c2 100644 --- a/src/block/BaseBigDripleaf.php +++ b/src/block/BaseBigDripleaf.php @@ -131,6 +131,6 @@ abstract class BaseBigDripleaf extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/BaseCake.php b/src/block/BaseCake.php index 21fd6336a0..4c1d0e4a35 100644 --- a/src/block/BaseCake.php +++ b/src/block/BaseCake.php @@ -36,7 +36,7 @@ use pocketmine\world\BlockTransaction; abstract class BaseCake extends Transparent implements FoodSource{ public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/BaseCoral.php b/src/block/BaseCoral.php index 3a6acd5d15..b9c595a97d 100644 --- a/src/block/BaseCoral.php +++ b/src/block/BaseCoral.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; -use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -33,11 +32,6 @@ use function mt_rand; abstract class BaseCoral extends Transparent{ use CoralTypeTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->coralType = CoralType::TUBE(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function onNearbyBlockChange() : void{ if(!$this->dead){ $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(40, 200)); @@ -78,6 +72,6 @@ abstract class BaseCoral extends Transparent{ protected function recalculateCollisionBoxes() : array{ return []; } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index d7a22f3b8a..1b0ae89383 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -103,7 +103,7 @@ abstract class BaseSign extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } abstract protected function getSupportingFace() : int; diff --git a/src/block/Bed.php b/src/block/Bed.php index 312b21cd12..74543f78e4 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -87,7 +87,7 @@ class Bed extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function isHeadPart() : bool{ @@ -209,7 +209,7 @@ class Bed extends Transparent{ } private function canBeSupportedAt(Block $block) : bool{ - return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } public function getMaxStackSize() : int{ return 1; } diff --git a/src/block/Bell.php b/src/block/Bell.php index 3f15d6909d..e91082a267 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -35,19 +35,13 @@ use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\sound\BellRingSound; final class Bell extends Transparent{ use HorizontalFacingTrait; - private BellAttachmentType $attachmentType; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->attachmentType = BellAttachmentType::FLOOR(); - parent::__construct($idInfo, $name, $typeInfo); - } + private BellAttachmentType $attachmentType = BellAttachmentType::FLOOR; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bellAttachmentType($this->attachmentType); @@ -55,12 +49,12 @@ final class Bell extends Transparent{ } protected function recalculateCollisionBoxes() : array{ - if($this->attachmentType->equals(BellAttachmentType::FLOOR())){ + if($this->attachmentType === BellAttachmentType::FLOOR){ return [ AxisAlignedBB::one()->squash(Facing::axis($this->facing), 1 / 4)->trim(Facing::UP, 3 / 16) ]; } - if($this->attachmentType->equals(BellAttachmentType::CEILING())){ + if($this->attachmentType === BellAttachmentType::CEILING){ return [ AxisAlignedBB::one()->contract(1 / 4, 0, 1 / 4)->trim(Facing::DOWN, 1 / 4) ]; @@ -72,12 +66,12 @@ final class Bell extends Transparent{ ->trim(Facing::DOWN, 1 / 4); return [ - $this->attachmentType->equals(BellAttachmentType::ONE_WALL()) ? $box->trim($this->facing, 3 / 16) : $box + $this->attachmentType === BellAttachmentType::ONE_WALL ? $box->trim($this->facing, 3 / 16) : $box ]; } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function getAttachmentType() : BellAttachmentType{ return $this->attachmentType; } @@ -89,7 +83,7 @@ final class Bell extends Transparent{ } private function canBeSupportedAt(Block $block, int $face) : bool{ - return !$block->getAdjacentSupportType($face)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType($face) !== SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ @@ -100,15 +94,15 @@ final class Bell extends Transparent{ if($player !== null){ $this->setFacing(Facing::opposite($player->getHorizontalFacing())); } - $this->setAttachmentType(BellAttachmentType::FLOOR()); + $this->setAttachmentType(BellAttachmentType::FLOOR); }elseif($face === Facing::DOWN){ - $this->setAttachmentType(BellAttachmentType::CEILING()); + $this->setAttachmentType(BellAttachmentType::CEILING); }else{ $this->setFacing($face); $this->setAttachmentType( $this->canBeSupportedAt($blockReplace, $face) ? - BellAttachmentType::TWO_WALLS() : - BellAttachmentType::ONE_WALL() + BellAttachmentType::TWO_WALLS : + BellAttachmentType::ONE_WALL ); } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); @@ -116,11 +110,10 @@ final class Bell extends Transparent{ public function onNearbyBlockChange() : void{ foreach(match($this->attachmentType){ - BellAttachmentType::CEILING() => [Facing::UP], - BellAttachmentType::FLOOR() => [Facing::DOWN], - BellAttachmentType::ONE_WALL() => [Facing::opposite($this->facing)], - BellAttachmentType::TWO_WALLS() => [$this->facing, Facing::opposite($this->facing)], - default => throw new AssumptionFailedError("All cases of BellAttachmentType must be handled") + BellAttachmentType::CEILING => [Facing::UP], + BellAttachmentType::FLOOR => [Facing::DOWN], + BellAttachmentType::ONE_WALL => [Facing::opposite($this->facing)], + BellAttachmentType::TWO_WALLS => [$this->facing, Facing::opposite($this->facing)] } as $supportBlockDirection){ if(!$this->canBeSupportedAt($this, $supportBlockDirection)){ $this->position->getWorld()->useBreakOn($this->position); @@ -159,10 +152,9 @@ final class Bell extends Transparent{ private function isValidFaceToRing(int $faceHit) : bool{ return match($this->attachmentType){ - BellAttachmentType::CEILING() => true, - BellAttachmentType::FLOOR() => Facing::axis($faceHit) === Facing::axis($this->facing), - BellAttachmentType::ONE_WALL(), BellAttachmentType::TWO_WALLS() => $faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true), - default => throw new AssumptionFailedError("All cases of BellAttachmentType must be handled") + BellAttachmentType::CEILING => true, + BellAttachmentType::FLOOR => Facing::axis($faceHit) === Facing::axis($this->facing), + BellAttachmentType::ONE_WALL, BellAttachmentType::TWO_WALLS => $faceHit === Facing::rotateY($this->facing, false) || $faceHit === Facing::rotateY($this->facing, true), }; } } diff --git a/src/block/BigDripleafHead.php b/src/block/BigDripleafHead.php index d5bd226ca1..d6f057270c 100644 --- a/src/block/BigDripleafHead.php +++ b/src/block/BigDripleafHead.php @@ -36,12 +36,7 @@ use pocketmine\world\sound\DripleafTiltUpSound; class BigDripleafHead extends BaseBigDripleaf{ - protected DripleafState $leafState; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->leafState = DripleafState::STABLE(); - parent::__construct($idInfo, $name, $typeInfo); - } + protected DripleafState $leafState = DripleafState::STABLE; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ parent::describeBlockOnlyState($w); @@ -76,20 +71,20 @@ class BigDripleafHead extends BaseBigDripleaf{ private function getLeafTopOffset() : float{ return match($this->leafState){ - DripleafState::STABLE(), DripleafState::UNSTABLE() => 1 / 16, - DripleafState::PARTIAL_TILT() => 3 / 16, + DripleafState::STABLE, DripleafState::UNSTABLE => 1 / 16, + DripleafState::PARTIAL_TILT => 3 / 16, default => 0 }; } public function onEntityInside(Entity $entity) : bool{ - if(!$entity instanceof Projectile && $this->leafState->equals(DripleafState::STABLE())){ + if(!$entity instanceof Projectile && $this->leafState === DripleafState::STABLE){ //the entity must be standing on top of the leaf - do not collapse if the entity is standing underneath $intersection = AxisAlignedBB::one() ->offset($this->position->x, $this->position->y, $this->position->z) ->trim(Facing::DOWN, 1 - $this->getLeafTopOffset()); if($entity->getBoundingBox()->intersectsWith($intersection)){ - $this->setTiltAndScheduleTick(DripleafState::UNSTABLE()); + $this->setTiltAndScheduleTick(DripleafState::UNSTABLE); return false; } } @@ -97,22 +92,21 @@ class BigDripleafHead extends BaseBigDripleaf{ } public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ - if(!$this->leafState->equals(DripleafState::FULL_TILT())){ - $this->setTiltAndScheduleTick(DripleafState::FULL_TILT()); + if($this->leafState !== DripleafState::FULL_TILT){ + $this->setTiltAndScheduleTick(DripleafState::FULL_TILT); $this->position->getWorld()->addSound($this->position, new DripleafTiltDownSound()); } } public function onScheduledUpdate() : void{ - if(!$this->leafState->equals(DripleafState::STABLE())){ - if($this->leafState->equals(DripleafState::FULL_TILT())){ - $this->position->getWorld()->setBlock($this->position, $this->setLeafState(DripleafState::STABLE())); + if($this->leafState !== DripleafState::STABLE){ + if($this->leafState === DripleafState::FULL_TILT){ + $this->position->getWorld()->setBlock($this->position, $this->setLeafState(DripleafState::STABLE)); $this->position->getWorld()->addSound($this->position, new DripleafTiltUpSound()); }else{ - $this->setTiltAndScheduleTick(match($this->leafState->id()){ - DripleafState::UNSTABLE()->id() => DripleafState::PARTIAL_TILT(), - DripleafState::PARTIAL_TILT()->id() => DripleafState::FULL_TILT(), - default => throw new AssumptionFailedError("All types should be covered") + $this->setTiltAndScheduleTick(match($this->leafState){ + DripleafState::UNSTABLE => DripleafState::PARTIAL_TILT, + DripleafState::PARTIAL_TILT => DripleafState::FULL_TILT, }); $this->position->getWorld()->addSound($this->position, new DripleafTiltDownSound()); } @@ -120,7 +114,7 @@ class BigDripleafHead extends BaseBigDripleaf{ } protected function recalculateCollisionBoxes() : array{ - if(!$this->leafState->equals(DripleafState::FULL_TILT())){ + if($this->leafState !== DripleafState::FULL_TILT){ return [ AxisAlignedBB::one() ->trim(Facing::DOWN, 11 / 16) diff --git a/src/block/Block.php b/src/block/Block.php index 9f61982ff7..7d01ce7ef1 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -877,7 +877,7 @@ class Block{ * blocks placed on the given face can be supported by this block. */ public function getSupportType(int $facing) : SupportType{ - return SupportType::FULL(); + return SupportType::FULL; } protected function getAdjacentSupportType(int $facing) : SupportType{ diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 497d282d75..c59ea352bb 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -34,6 +34,7 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use function array_key_exists; +use function spl_object_id; class BrewingStand extends Transparent{ @@ -61,18 +62,18 @@ class BrewingStand extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function hasSlot(BrewingStandSlot $slot) : bool{ - return array_key_exists($slot->id(), $this->slots); + return array_key_exists(spl_object_id($slot), $this->slots); } public function setSlot(BrewingStandSlot $slot, bool $occupied) : self{ if($occupied){ - $this->slots[$slot->id()] = $slot; + $this->slots[spl_object_id($slot)] = $slot; }else{ - unset($this->slots[$slot->id()]); + unset($this->slots[spl_object_id($slot)]); } return $this; } @@ -89,7 +90,7 @@ class BrewingStand extends Transparent{ public function setSlots(array $slots) : self{ $this->slots = []; foreach($slots as $slot){ - $this->slots[$slot->id()] = $slot; + $this->slots[spl_object_id($slot)] = $slot; } return $this; } @@ -114,7 +115,7 @@ class BrewingStand extends Transparent{ } $changed = false; - foreach(BrewingStandSlot::getAll() as $slot){ + foreach(BrewingStandSlot::cases() as $slot){ $occupied = !$brewing->getInventory()->isSlotEmpty($slot->getSlotNumber()); if($occupied !== $this->hasSlot($slot)){ $this->setSlot($slot, $occupied); diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 0176d17bd6..81d94474b1 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -69,7 +69,7 @@ class Cactus extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onEntityInside(Entity $entity) : bool{ diff --git a/src/block/Candle.php b/src/block/Candle.php index 7009acef61..afcf5bb457 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -91,7 +91,7 @@ class Candle extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } protected function getCandleIfCompatibleType(Block $block) : ?Candle{ diff --git a/src/block/Cauldron.php b/src/block/Cauldron.php index da1a938b29..fd04077b89 100644 --- a/src/block/Cauldron.php +++ b/src/block/Cauldron.php @@ -61,7 +61,7 @@ final class Cauldron extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return $facing === Facing::UP ? SupportType::EDGE() : SupportType::NONE(); + return $facing === Facing::UP ? SupportType::EDGE : SupportType::NONE; } /** diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index 6ff934881d..18e820bfa7 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -88,7 +88,7 @@ class CaveVines extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - return $block->getAdjacentSupportType(Facing::UP)->equals(SupportType::FULL()) || $block->hasSameTypeId($this); + return $block->getAdjacentSupportType(Facing::UP) === SupportType::FULL || $block->hasSameTypeId($this); } public function onNearbyBlockChange() : void{ @@ -176,6 +176,6 @@ class CaveVines extends Flowable{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Chain.php b/src/block/Chain.php index fa8ffd1e82..e9cc2c9be8 100644 --- a/src/block/Chain.php +++ b/src/block/Chain.php @@ -33,7 +33,7 @@ final class Chain extends Transparent{ use PillarRotationTrait; public function getSupportType(int $facing) : SupportType{ - return $this->axis === Axis::Y && Facing::axis($facing) === Axis::Y ? SupportType::CENTER() : SupportType::NONE(); + return $this->axis === Axis::Y && Facing::axis($facing) === Axis::Y ? SupportType::CENTER : SupportType::NONE; } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Chest.php b/src/block/Chest.php index 270c696c33..dca21576aa 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -45,7 +45,7 @@ class Chest extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onPostPlace() : void{ diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 69f94eaf6f..fcd9f4e0f4 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -77,11 +77,11 @@ class CocoaBlock extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } private function canAttachTo(Block $block) : bool{ - return $block instanceof Wood && $block->getWoodType()->equals(WoodType::JUNGLE()); + return $block instanceof Wood && $block->getWoodType() === WoodType::JUNGLE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/CopperStairs.php b/src/block/CopperStairs.php index fe52616ce9..b16d49ec1e 100644 --- a/src/block/CopperStairs.php +++ b/src/block/CopperStairs.php @@ -23,14 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CopperTrait; class CopperStairs extends Stair{ use CopperTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->oxidation = CopperOxidation::NONE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index 5ce58f413d..3e7ca8224f 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; -use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\item\Item; use function mt_rand; @@ -32,11 +31,6 @@ use function mt_rand; final class CoralBlock extends Opaque{ use CoralTypeTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->coralType = CoralType::TUBE(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function onNearbyBlockChange() : void{ if(!$this->dead){ $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(40, 200)); diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index e1f78aef5b..0c0ec88202 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -70,7 +70,7 @@ class DaylightSensor extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 539454b415..738577296c 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -38,12 +38,7 @@ use pocketmine\world\sound\ItemUseOnBlockSound; use pocketmine\world\sound\WaterSplashSound; class Dirt extends Opaque{ - protected DirtType $dirtType; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->dirtType = DirtType::NORMAL(); - parent::__construct($idInfo, $name, $typeInfo); - } + protected DirtType $dirtType = DirtType::NORMAL; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->dirtType($this->dirtType); @@ -62,16 +57,16 @@ class Dirt extends Opaque{ if($face === Facing::UP && $item instanceof Hoe){ $item->applyDamage(1); - $newBlock = $this->dirtType->equals(DirtType::NORMAL()) ? VanillaBlocks::FARMLAND() : VanillaBlocks::DIRT(); + $newBlock = $this->dirtType === DirtType::NORMAL ? VanillaBlocks::FARMLAND() : VanillaBlocks::DIRT(); $center = $this->position->add(0.5, 0.5, 0.5); $world->addSound($center, new ItemUseOnBlockSound($newBlock)); $world->setBlock($this->position, $newBlock); - if($this->dirtType->equals(DirtType::ROOTED())){ + if($this->dirtType === DirtType::ROOTED){ $world->dropItem($center, VanillaBlocks::HANGING_ROOTS()->asItem()); } return true; - }elseif($this->dirtType->equals(DirtType::ROOTED()) && $item instanceof Fertilizer){ + }elseif($this->dirtType === DirtType::ROOTED && $item instanceof Fertilizer){ $down = $this->getSide(Facing::DOWN); if($down->getTypeId() !== BlockTypeIds::AIR){ return true; diff --git a/src/block/Door.php b/src/block/Door.php index a03427d5ad..c97c5bb1e9 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -102,7 +102,7 @@ class Door extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onNearbyBlockChange() : void{ diff --git a/src/block/DragonEgg.php b/src/block/DragonEgg.php index 98809152d6..d76a910585 100644 --- a/src/block/DragonEgg.php +++ b/src/block/DragonEgg.php @@ -82,6 +82,6 @@ class DragonEgg extends Transparent implements Fallable{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/EnchantingTable.php b/src/block/EnchantingTable.php index f80d52d124..6a6c936b22 100644 --- a/src/block/EnchantingTable.php +++ b/src/block/EnchantingTable.php @@ -41,7 +41,7 @@ class EnchantingTable extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/EnderChest.php b/src/block/EnderChest.php index 26596eac94..9004f7c79f 100644 --- a/src/block/EnderChest.php +++ b/src/block/EnderChest.php @@ -49,7 +49,7 @@ class EnderChest extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/Fence.php b/src/block/Fence.php index b57e81ded5..4fa571b675 100644 --- a/src/block/Fence.php +++ b/src/block/Fence.php @@ -42,7 +42,7 @@ class Fence extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); - if($block instanceof static || $block instanceof FenceGate || $block->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ + if($block instanceof static || $block instanceof FenceGate || $block->getSupportType(Facing::opposite($facing)) === SupportType::FULL){ $this->connections[$facing] = true; }else{ unset($this->connections[$facing]); @@ -98,6 +98,6 @@ class Fence extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return Facing::axis($facing) === Axis::Y ? SupportType::CENTER() : SupportType::NONE(); + return Facing::axis($facing) === Axis::Y ? SupportType::CENTER : SupportType::NONE; } } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index c22edabc49..7354564495 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -72,7 +72,7 @@ class FenceGate extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } private function checkInWall() : bool{ diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index 84705ea9d5..6c9b2940b8 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -64,7 +64,7 @@ abstract class FillableCauldron extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return $facing === Facing::UP ? SupportType::EDGE() : SupportType::NONE(); + return $facing === Facing::UP ? SupportType::EDGE : SupportType::NONE; } protected function withFillLevel(int $fillLevel) : Block{ diff --git a/src/block/Fire.php b/src/block/Fire.php index 11378b82b0..fbe765432e 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -60,7 +60,7 @@ class Fire extends BaseFire{ } private function canBeSupportedBy(Block $block) : bool{ - return $block->getSupportType(Facing::UP)->equals(SupportType::FULL()); + return $block->getSupportType(Facing::UP) === SupportType::FULL; } public function onNearbyBlockChange() : void{ diff --git a/src/block/Flowable.php b/src/block/Flowable.php index 2b4e8a02bd..795fe27561 100644 --- a/src/block/Flowable.php +++ b/src/block/Flowable.php @@ -48,6 +48,6 @@ abstract class Flowable extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index f33fc82613..2c54b830a3 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -28,12 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; final class Froglight extends SimplePillar{ - private FroglightType $froglightType; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->froglightType = FroglightType::OCHRE(); - parent::__construct($idInfo, $name, $typeInfo); - } + private FroglightType $froglightType = FroglightType::OCHRE; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->froglightType($this->froglightType); diff --git a/src/block/GlowLichen.php b/src/block/GlowLichen.php index 84dec29ce9..de66ccad76 100644 --- a/src/block/GlowLichen.php +++ b/src/block/GlowLichen.php @@ -95,7 +95,7 @@ class GlowLichen extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function canBeReplaced() : bool{ @@ -121,7 +121,7 @@ class GlowLichen extends Transparent{ $changed = false; foreach($this->faces as $face){ - if(!$this->getAdjacentSupportType($face)->equals(SupportType::FULL())){ + if($this->getAdjacentSupportType($face) !== SupportType::FULL){ unset($this->faces[$face]); $changed = true; } @@ -156,7 +156,7 @@ class GlowLichen extends Transparent{ $supportBlock = $world->getBlock($replacePos->getSide($spreadFace)); $supportFace = Facing::opposite($spreadFace); - if(!$supportBlock->getSupportType($supportFace)->equals(SupportType::FULL())){ + if($supportBlock->getSupportType($supportFace) !== SupportType::FULL){ return false; } @@ -268,7 +268,7 @@ class GlowLichen extends Transparent{ private function getAvailableFaces() : array{ $faces = []; foreach(Facing::ALL as $face){ - if(!$this->hasFace($face) && $this->getAdjacentSupportType($face)->equals(SupportType::FULL())){ + if(!$this->hasFace($face) && $this->getAdjacentSupportType($face) === SupportType::FULL){ $faces[$face] = $face; } } diff --git a/src/block/Grass.php b/src/block/Grass.php index 709dc6a9de..db2f8b922b 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -69,7 +69,7 @@ class Grass extends Opaque{ $b = $world->getBlockAt($x, $y, $z); if( !($b instanceof Dirt) || - !$b->getDirtType()->equals(DirtType::NORMAL()) || + $b->getDirtType() !== DirtType::NORMAL || $world->getFullLightAt($x, $y + 1, $z) < 4 || $world->getBlockAt($x, $y + 1, $z)->getLightFilter() >= 2 ){ diff --git a/src/block/Hopper.php b/src/block/Hopper.php index ea000503cb..0d823674b2 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -68,9 +68,9 @@ class Hopper extends Transparent{ public function getSupportType(int $facing) : SupportType{ return match($facing){ - Facing::UP => SupportType::FULL(), - Facing::DOWN => $this->facing === Facing::DOWN ? SupportType::CENTER() : SupportType::NONE(), - default => SupportType::NONE() + Facing::UP => SupportType::FULL, + Facing::DOWN => $this->facing === Facing::DOWN ? SupportType::CENTER : SupportType::NONE, + default => SupportType::NONE }; } diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 21bc5c20ad..b5b6093c49 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -164,7 +164,7 @@ class ItemFrame extends Flowable{ } private function canBeSupportedAt(Block $block, int $face) : bool{ - return !$block->getAdjacentSupportType($face)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType($face) !== SupportType::NONE; } public function onNearbyBlockChange() : void{ diff --git a/src/block/Ladder.php b/src/block/Ladder.php index 83adada828..58f133f6ec 100644 --- a/src/block/Ladder.php +++ b/src/block/Ladder.php @@ -66,7 +66,7 @@ class Ladder extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ @@ -85,6 +85,6 @@ class Ladder extends Transparent{ } private function canBeSupportedAt(Block $block, int $face) : bool{ - return $block->getAdjacentSupportType($face)->equals(SupportType::FULL()); + return $block->getAdjacentSupportType($face) === SupportType::FULL; } } diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 8ebc8ba2ca..e9cbcc3fe9 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -73,7 +73,7 @@ class Lantern extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/Leaves.php b/src/block/Leaves.php index b1839dca6b..ac1ffb94aa 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -147,23 +147,22 @@ class Leaves extends Transparent{ if(FortuneDropHelper::bonusChanceDivisor($item, 20, 4)){ //Saplings // TODO: according to the wiki, the jungle saplings have a different drop rate $sapling = (match($this->leavesType){ - LeavesType::ACACIA() => VanillaBlocks::ACACIA_SAPLING(), - LeavesType::BIRCH() => VanillaBlocks::BIRCH_SAPLING(), - LeavesType::DARK_OAK() => VanillaBlocks::DARK_OAK_SAPLING(), - LeavesType::JUNGLE() => VanillaBlocks::JUNGLE_SAPLING(), - LeavesType::OAK() => VanillaBlocks::OAK_SAPLING(), - LeavesType::SPRUCE() => VanillaBlocks::SPRUCE_SAPLING(), - LeavesType::MANGROVE(), //TODO: mangrove propagule - LeavesType::AZALEA(), LeavesType::FLOWERING_AZALEA() => null, //TODO: azalea - LeavesType::CHERRY() => null, //TODO: cherry - default => throw new AssumptionFailedError("Unreachable") + LeavesType::ACACIA => VanillaBlocks::ACACIA_SAPLING(), + LeavesType::BIRCH => VanillaBlocks::BIRCH_SAPLING(), + LeavesType::DARK_OAK => VanillaBlocks::DARK_OAK_SAPLING(), + LeavesType::JUNGLE => VanillaBlocks::JUNGLE_SAPLING(), + LeavesType::OAK => VanillaBlocks::OAK_SAPLING(), + LeavesType::SPRUCE => VanillaBlocks::SPRUCE_SAPLING(), + LeavesType::MANGROVE, //TODO: mangrove propagule + LeavesType::AZALEA, LeavesType::FLOWERING_AZALEA => null, //TODO: azalea + LeavesType::CHERRY => null, //TODO: cherry })?->asItem(); if($sapling !== null){ $drops[] = $sapling; } } if( - ($this->leavesType->equals(LeavesType::OAK()) || $this->leavesType->equals(LeavesType::DARK_OAK())) && + ($this->leavesType === LeavesType::OAK || $this->leavesType === LeavesType::DARK_OAK) && FortuneDropHelper::bonusChanceDivisor($item, 200, 20) ){ //Apples $drops[] = VanillaItems::APPLE(); @@ -188,6 +187,6 @@ class Leaves extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index d9f07d22b9..03880b3c5f 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -87,7 +87,7 @@ class Lectern extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function isProducingSignal() : bool{ return $this->producingSignal; } diff --git a/src/block/Lever.php b/src/block/Lever.php index e4b8c0811d..01aa892455 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -36,14 +36,9 @@ use pocketmine\world\sound\RedstonePowerOffSound; use pocketmine\world\sound\RedstonePowerOnSound; class Lever extends Flowable{ - protected LeverFacing $facing; + protected LeverFacing $facing = LeverFacing::UP_AXIS_X; protected bool $activated = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->facing = LeverFacing::UP_AXIS_X(); - parent::__construct($idInfo, $name, $typeInfo); - } - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->leverFacing($this->facing); $w->bool($this->activated); @@ -77,12 +72,12 @@ class Lever extends Flowable{ return $x; }; $this->facing = match($face){ - Facing::DOWN => $selectUpDownPos(LeverFacing::DOWN_AXIS_X(), LeverFacing::DOWN_AXIS_Z()), - Facing::UP => $selectUpDownPos(LeverFacing::UP_AXIS_X(), LeverFacing::UP_AXIS_Z()), - Facing::NORTH => LeverFacing::NORTH(), - Facing::SOUTH => LeverFacing::SOUTH(), - Facing::WEST => LeverFacing::WEST(), - Facing::EAST => LeverFacing::EAST(), + Facing::DOWN => $selectUpDownPos(LeverFacing::DOWN_AXIS_X, LeverFacing::DOWN_AXIS_Z), + Facing::UP => $selectUpDownPos(LeverFacing::UP_AXIS_X, LeverFacing::UP_AXIS_Z), + Facing::NORTH => LeverFacing::NORTH, + Facing::SOUTH => LeverFacing::SOUTH, + Facing::WEST => LeverFacing::WEST, + Facing::EAST => LeverFacing::EAST, default => throw new AssumptionFailedError("Bad facing value"), }; diff --git a/src/block/Liquid.php b/src/block/Liquid.php index e102540ecf..2299f7d71b 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -97,7 +97,7 @@ abstract class Liquid extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function getDropsForCompatibleTool(Item $item) : array{ diff --git a/src/block/MobHead.php b/src/block/MobHead.php index 96cd1cf344..125bafe8b1 100644 --- a/src/block/MobHead.php +++ b/src/block/MobHead.php @@ -39,16 +39,11 @@ class MobHead extends Flowable{ public const MIN_ROTATION = 0; public const MAX_ROTATION = 15; - protected MobHeadType $mobHeadType; + protected MobHeadType $mobHeadType = MobHeadType::SKELETON; protected int $facing = Facing::NORTH; protected int $rotation = self::MIN_ROTATION; //TODO: split this into floor skull and wall skull handling - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->mobHeadType = MobHeadType::SKELETON(); //TODO: this should be a parameter - parent::__construct($idInfo, $name, $typeInfo); - } - public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->mobHeadType($this->mobHeadType); } diff --git a/src/block/MonsterSpawner.php b/src/block/MonsterSpawner.php index 129da33946..5cbe80e0a8 100644 --- a/src/block/MonsterSpawner.php +++ b/src/block/MonsterSpawner.php @@ -42,6 +42,6 @@ class MonsterSpawner extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Mycelium.php b/src/block/Mycelium.php index 08b0b3e750..05b63d9bff 100644 --- a/src/block/Mycelium.php +++ b/src/block/Mycelium.php @@ -52,7 +52,7 @@ class Mycelium extends Opaque{ $z = mt_rand($this->position->z - 1, $this->position->z + 1); $world = $this->position->getWorld(); $block = $world->getBlockAt($x, $y, $z); - if($block instanceof Dirt && $block->getDirtType()->equals(DirtType::NORMAL())){ + if($block instanceof Dirt && $block->getDirtType() === DirtType::NORMAL){ if($block->getSide(Facing::UP) instanceof Transparent){ BlockEventHelper::spread($block, VanillaBlocks::MYCELIUM(), $this); } diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index a2524914ab..6a45fb7a0a 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -70,7 +70,7 @@ class NetherPortal extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function getDrops(Item $item) : array{ diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index c78000fa1e..968a9b92eb 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -184,6 +184,6 @@ class NetherVines extends Flowable{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/PressurePlate.php b/src/block/PressurePlate.php index d67433a750..ae2a936bb5 100644 --- a/src/block/PressurePlate.php +++ b/src/block/PressurePlate.php @@ -60,7 +60,7 @@ abstract class PressurePlate extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ @@ -71,7 +71,7 @@ abstract class PressurePlate extends Transparent{ } private function canBeSupportedAt(Block $block) : bool{ - return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } public function onNearbyBlockChange() : void{ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index ecac38e18c..cf368a30aa 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -29,12 +29,7 @@ use pocketmine\item\Item; use function mt_rand; class RedMushroomBlock extends Opaque{ - protected MushroomBlockType $mushroomBlockType; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->mushroomBlockType = MushroomBlockType::ALL_CAP(); - parent::__construct($idInfo, $name, $typeInfo); - } + protected MushroomBlockType $mushroomBlockType = MushroomBlockType::ALL_CAP; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative), @@ -61,10 +56,10 @@ class RedMushroomBlock extends Opaque{ } public function getSilkTouchDrops(Item $item) : array{ - return [(clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP())->asItem()]; + return [(clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP)->asItem()]; } public function getPickedItem(bool $addUserData = false) : Item{ - return (clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP())->asItem(); + return (clone $this)->setMushroomBlockType(MushroomBlockType::ALL_CAP)->asItem(); } } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 8b436020b7..5a22c6bf8e 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -108,7 +108,7 @@ class RedstoneComparator extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } //TODO: redstone functionality diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 518eeb9e5e..848c9aa895 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -94,7 +94,7 @@ class RedstoneRepeater extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - return !$block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::NONE()); + return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } //TODO: redstone functionality diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 4e667038e0..62662f9cf7 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -78,7 +78,7 @@ class SeaPickle extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index 821e022f4a..d557401eec 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -113,6 +113,6 @@ class ShulkerBox extends Opaque{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Slab.php b/src/block/Slab.php index cbf5dce189..bdf2bb5eb0 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -34,10 +34,9 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Slab extends Transparent{ - protected SlabType $slabType; + protected SlabType $slabType = SlabType::BOTTOM; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->slabType = SlabType::BOTTOM(); parent::__construct($idInfo, $name . " Slab", $typeInfo); } @@ -46,7 +45,7 @@ class Slab extends Transparent{ } public function isTransparent() : bool{ - return !$this->slabType->equals(SlabType::DOUBLE()); + return $this->slabType !== SlabType::DOUBLE; } /** @@ -69,8 +68,8 @@ class Slab extends Transparent{ return true; } - if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->hasSameTypeId($this)){ - if($blockReplace->slabType->equals(SlabType::TOP())){ //Trying to combine with top slab + if($blockReplace instanceof Slab && $blockReplace->slabType !== SlabType::DOUBLE && $blockReplace->hasSameTypeId($this)){ + if($blockReplace->slabType === SlabType::TOP){ //Trying to combine with top slab return $clickVector->y <= 0.5 || (!$isClickedBlock && $face === Facing::UP); }else{ return $clickVector->y >= 0.5 || (!$isClickedBlock && $face === Facing::DOWN); @@ -81,14 +80,14 @@ class Slab extends Transparent{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace instanceof Slab && !$blockReplace->slabType->equals(SlabType::DOUBLE()) && $blockReplace->hasSameTypeId($this) && ( - ($blockReplace->slabType->equals(SlabType::TOP()) && ($clickVector->y <= 0.5 || $face === Facing::UP)) || - ($blockReplace->slabType->equals(SlabType::BOTTOM()) && ($clickVector->y >= 0.5 || $face === Facing::DOWN)) + if($blockReplace instanceof Slab && $blockReplace->slabType !== SlabType::DOUBLE && $blockReplace->hasSameTypeId($this) && ( + ($blockReplace->slabType === SlabType::TOP && ($clickVector->y <= 0.5 || $face === Facing::UP)) || + ($blockReplace->slabType === SlabType::BOTTOM && ($clickVector->y >= 0.5 || $face === Facing::DOWN)) )){ //Clicked in empty half of existing slab - $this->slabType = SlabType::DOUBLE(); + $this->slabType = SlabType::DOUBLE; }else{ - $this->slabType = (($face !== Facing::UP && $clickVector->y > 0.5) || $face === Facing::DOWN) ? SlabType::TOP() : SlabType::BOTTOM(); + $this->slabType = (($face !== Facing::UP && $clickVector->y > 0.5) || $face === Facing::DOWN) ? SlabType::TOP : SlabType::BOTTOM; } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); @@ -98,22 +97,22 @@ class Slab extends Transparent{ * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ - if($this->slabType->equals(SlabType::DOUBLE())){ + if($this->slabType === SlabType::DOUBLE){ return [AxisAlignedBB::one()]; } - return [AxisAlignedBB::one()->trim($this->slabType->equals(SlabType::TOP()) ? Facing::DOWN : Facing::UP, 0.5)]; + return [AxisAlignedBB::one()->trim($this->slabType === SlabType::TOP ? Facing::DOWN : Facing::UP, 0.5)]; } public function getSupportType(int $facing) : SupportType{ - if($this->slabType->equals(SlabType::DOUBLE())){ - return SupportType::FULL(); - }elseif(($facing === Facing::UP && $this->slabType->equals(SlabType::TOP())) || ($facing === Facing::DOWN && $this->slabType->equals(SlabType::BOTTOM()))){ - return SupportType::FULL(); + if($this->slabType === SlabType::DOUBLE){ + return SupportType::FULL; + }elseif(($facing === Facing::UP && $this->slabType === SlabType::TOP) || ($facing === Facing::DOWN && $this->slabType === SlabType::BOTTOM)){ + return SupportType::FULL; } - return SupportType::NONE(); + return SupportType::NONE; } public function getDropsForCompatibleTool(Item $item) : array{ - return [$this->asItem()->setCount($this->slabType->equals(SlabType::DOUBLE()) ? 2 : 1)]; + return [$this->asItem()->setCount($this->slabType === SlabType::DOUBLE ? 2 : 1)]; } } diff --git a/src/block/SmallDripleaf.php b/src/block/SmallDripleaf.php index e08e6f6e98..ad23608bf1 100644 --- a/src/block/SmallDripleaf.php +++ b/src/block/SmallDripleaf.php @@ -161,7 +161,7 @@ class SmallDripleaf extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 05fc884213..fd7258d914 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -75,13 +75,13 @@ class SnowLayer extends Flowable implements Fallable{ public function getSupportType(int $facing) : SupportType{ if(!$this->canBeReplaced()){ - return SupportType::FULL(); + return SupportType::FULL; } - return SupportType::NONE(); + return SupportType::NONE; } private function canBeSupportedAt(Block $block) : bool{ - return $block->getAdjacentSupportType(Facing::DOWN)->equals(SupportType::FULL()); + return $block->getAdjacentSupportType(Facing::DOWN) === SupportType::FULL; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/SporeBlossom.php b/src/block/SporeBlossom.php index 9099321780..dbb4b71fc9 100644 --- a/src/block/SporeBlossom.php +++ b/src/block/SporeBlossom.php @@ -33,7 +33,7 @@ use pocketmine\world\BlockTransaction; final class SporeBlossom extends Flowable{ private function canBeSupportedAt(Block $block) : bool{ - return $block->getAdjacentSupportType(Facing::UP)->equals(SupportType::FULL()); + return $block->getAdjacentSupportType(Facing::UP) === SupportType::FULL; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/Stair.php b/src/block/Stair.php index a207467217..25d1da8d99 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -39,12 +39,7 @@ class Stair extends Transparent{ use HorizontalFacingTrait; protected bool $upsideDown = false; - protected StairShape $shape; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->shape = StairShape::STRAIGHT(); - parent::__construct($idInfo, $name, $typeInfo); - } + protected StairShape $shape = StairShape::STRAIGHT; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); @@ -56,11 +51,11 @@ class Stair extends Transparent{ $clockwise = Facing::rotateY($this->facing, true); if(($backFacing = $this->getPossibleCornerFacing(false)) !== null){ - $this->shape = $backFacing === $clockwise ? StairShape::OUTER_RIGHT() : StairShape::OUTER_LEFT(); + $this->shape = $backFacing === $clockwise ? StairShape::OUTER_RIGHT : StairShape::OUTER_LEFT; }elseif(($frontFacing = $this->getPossibleCornerFacing(true)) !== null){ - $this->shape = $frontFacing === $clockwise ? StairShape::INNER_RIGHT() : StairShape::INNER_LEFT(); + $this->shape = $frontFacing === $clockwise ? StairShape::INNER_RIGHT : StairShape::INNER_LEFT; }else{ - $this->shape = StairShape::STRAIGHT(); + $this->shape = StairShape::STRAIGHT; } return $this; @@ -92,14 +87,14 @@ class Stair extends Transparent{ ->trim(Facing::opposite($topStepFace), 0.5) ->trim(Facing::opposite($this->facing), 0.5); - if($this->shape->equals(StairShape::OUTER_LEFT()) || $this->shape->equals(StairShape::OUTER_RIGHT())){ - $topStep->trim(Facing::rotateY($this->facing, $this->shape->equals(StairShape::OUTER_LEFT())), 0.5); - }elseif($this->shape->equals(StairShape::INNER_LEFT()) || $this->shape->equals(StairShape::INNER_RIGHT())){ + if($this->shape === StairShape::OUTER_LEFT || $this->shape === StairShape::OUTER_RIGHT){ + $topStep->trim(Facing::rotateY($this->facing, $this->shape === StairShape::OUTER_LEFT), 0.5); + }elseif($this->shape === StairShape::INNER_LEFT || $this->shape === StairShape::INNER_RIGHT){ //add an extra cube $bbs[] = AxisAlignedBB::one() ->trim(Facing::opposite($topStepFace), 0.5) ->trim($this->facing, 0.5) //avoid overlapping with main step - ->trim(Facing::rotateY($this->facing, $this->shape->equals(StairShape::INNER_LEFT())), 0.5); + ->trim(Facing::rotateY($this->facing, $this->shape === StairShape::INNER_LEFT), 0.5); } $bbs[] = $topStep; @@ -111,13 +106,13 @@ class Stair extends Transparent{ if( $facing === Facing::UP && $this->isUpsideDown() || $facing === Facing::DOWN && !$this->isUpsideDown() || - ($facing === $this->facing && !$this->shape->equals(StairShape::OUTER_LEFT()) && !$this->shape->equals(StairShape::OUTER_RIGHT())) || - ($facing === Facing::rotate($this->facing, Axis::Y, false) && $this->shape->equals(StairShape::INNER_LEFT())) || - ($facing === Facing::rotate($this->facing, Axis::Y, true) && $this->shape->equals(StairShape::INNER_RIGHT())) + ($facing === $this->facing && $this->shape !== StairShape::OUTER_LEFT && $this->shape !== StairShape::OUTER_RIGHT) || + ($facing === Facing::rotate($this->facing, Axis::Y, false) && $this->shape === StairShape::INNER_LEFT) || + ($facing === Facing::rotate($this->facing, Axis::Y, true) && $this->shape === StairShape::INNER_RIGHT) ){ - return SupportType::FULL(); + return SupportType::FULL; } - return SupportType::NONE(); + return SupportType::NONE; } private function getPossibleCornerFacing(bool $oppositeFacing) : ?int{ diff --git a/src/block/Stonecutter.php b/src/block/Stonecutter.php index eb7dc68c26..30c19d25dc 100644 --- a/src/block/Stonecutter.php +++ b/src/block/Stonecutter.php @@ -47,6 +47,6 @@ class Stonecutter extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Thin.php b/src/block/Thin.php index 2b89b4beed..bf82c3e584 100644 --- a/src/block/Thin.php +++ b/src/block/Thin.php @@ -41,7 +41,7 @@ class Thin extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $side = $this->getSide($facing); - if($side instanceof Thin || $side instanceof Wall || $side->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ + if($side instanceof Thin || $side instanceof Wall || $side->getSupportType(Facing::opposite($facing)) === SupportType::FULL){ $this->connections[$facing] = true; }else{ unset($this->connections[$facing]); @@ -90,6 +90,6 @@ class Thin extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } } diff --git a/src/block/Torch.php b/src/block/Torch.php index 66b62bc19a..aee4da32aa 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -84,6 +84,6 @@ class Torch extends Flowable{ private function canBeSupportedAt(Block $block, int $face) : bool{ return $face === Facing::DOWN ? $block->getAdjacentSupportType($face)->hasCenterSupport() : - $block->getAdjacentSupportType($face)->equals(SupportType::FULL()); + $block->getAdjacentSupportType($face) === SupportType::FULL; } } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index d12a922df6..20b6af2abd 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -70,7 +70,7 @@ class Trapdoor extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE(); + return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index a41c3985b6..c6b878d2fe 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -68,6 +68,7 @@ use pocketmine\utils\CloningRegistryTrait; use pocketmine\world\sound\AmethystBlockChimeSound; use pocketmine\world\sound\BlockPunchSound; use function mb_strtolower; +use function strtolower; /** * This doc-block is generated automatically, do not modify it manually. @@ -1140,13 +1141,13 @@ final class VanillaBlocks{ }); $saplingTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); - foreach(SaplingType::getAll() as $saplingType){ + foreach(SaplingType::cases() as $saplingType){ $name = $saplingType->getDisplayName(); - self::register($saplingType->name() . "_sapling", new Sapling(WoodLikeBlockIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); + self::register(strtolower($saplingType->name) . "_sapling", new Sapling(WoodLikeBlockIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); } - foreach(LeavesType::getAll() as $leavesType){ + foreach(LeavesType::cases() as $leavesType){ $name = $leavesType->getDisplayName(); - self::register($leavesType->name() . "_leaves", new Leaves(WoodLikeBlockIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); + self::register(strtolower($leavesType->name) . "_leaves", new Leaves(WoodLikeBlockIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); } $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); @@ -1262,9 +1263,9 @@ final class VanillaBlocks{ $woodenButtonBreakInfo = new Info(BreakInfo::axe(0.5)); $woodenPressurePlateBreakInfo = new Info(BreakInfo::axe(0.5)); - foreach(WoodType::getAll() as $woodType){ + foreach(WoodType::cases() as $woodType){ $name = $woodType->getDisplayName(); - $idName = fn(string $suffix) => $woodType->name() . "_" . $suffix; + $idName = fn(string $suffix) => strtolower($woodType->name) . "_" . $suffix; self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); diff --git a/src/block/Wall.php b/src/block/Wall.php index 87ee0b1bdb..520ced8eb0 100644 --- a/src/block/Wall.php +++ b/src/block/Wall.php @@ -101,9 +101,9 @@ class Wall extends Transparent{ foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); - if($block instanceof static || $block instanceof FenceGate || $block instanceof Thin || $block->getSupportType(Facing::opposite($facing))->equals(SupportType::FULL())){ + if($block instanceof static || $block instanceof FenceGate || $block instanceof Thin || $block->getSupportType(Facing::opposite($facing)) === SupportType::FULL){ if(!isset($this->connections[$facing])){ - $this->connections[$facing] = WallConnectionType::SHORT(); + $this->connections[$facing] = WallConnectionType::SHORT; $changed++; } }elseif(isset($this->connections[$facing])){ @@ -152,6 +152,6 @@ class Wall extends Transparent{ } public function getSupportType(int $facing) : SupportType{ - return Facing::axis($facing) === Axis::Y ? SupportType::CENTER() : SupportType::NONE(); + return Facing::axis($facing) === Axis::Y ? SupportType::CENTER : SupportType::NONE; } } diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php index f4cddb53b8..add1d54c0c 100644 --- a/src/block/WoodLikeBlockIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -48,110 +48,103 @@ use pocketmine\utils\AssumptionFailedError; final class WoodLikeBlockIdHelper{ public static function getPlanksIdentifier(WoodType $type) : BID{ - return new BID(match($type->id()){ - WoodType::OAK()->id() => Ids::OAK_PLANKS, - WoodType::SPRUCE()->id() => Ids::SPRUCE_PLANKS, - WoodType::BIRCH()->id() => Ids::BIRCH_PLANKS, - WoodType::JUNGLE()->id() => Ids::JUNGLE_PLANKS, - WoodType::ACACIA()->id() => Ids::ACACIA_PLANKS, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_PLANKS, - WoodType::MANGROVE()->id() => Ids::MANGROVE_PLANKS, - WoodType::CRIMSON()->id() => Ids::CRIMSON_PLANKS, - WoodType::WARPED()->id() => Ids::WARPED_PLANKS, - WoodType::CHERRY()->id() => Ids::CHERRY_PLANKS, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($type){ + WoodType::OAK => Ids::OAK_PLANKS, + WoodType::SPRUCE => Ids::SPRUCE_PLANKS, + WoodType::BIRCH => Ids::BIRCH_PLANKS, + WoodType::JUNGLE => Ids::JUNGLE_PLANKS, + WoodType::ACACIA => Ids::ACACIA_PLANKS, + WoodType::DARK_OAK => Ids::DARK_OAK_PLANKS, + WoodType::MANGROVE => Ids::MANGROVE_PLANKS, + WoodType::CRIMSON => Ids::CRIMSON_PLANKS, + WoodType::WARPED => Ids::WARPED_PLANKS, + WoodType::CHERRY => Ids::CHERRY_PLANKS, }); } public static function getFenceIdentifier(WoodType $type) : BID{ - return new BID(match($type->id()){ - WoodType::OAK()->id() => Ids::OAK_FENCE, - WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE, - WoodType::BIRCH()->id() => Ids::BIRCH_FENCE, - WoodType::JUNGLE()->id() => Ids::JUNGLE_FENCE, - WoodType::ACACIA()->id() => Ids::ACACIA_FENCE, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE, - WoodType::MANGROVE()->id() => Ids::MANGROVE_FENCE, - WoodType::CRIMSON()->id() => Ids::CRIMSON_FENCE, - WoodType::WARPED()->id() => Ids::WARPED_FENCE, - WoodType::CHERRY()->id() => Ids::CHERRY_FENCE, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($type){ + WoodType::OAK => Ids::OAK_FENCE, + WoodType::SPRUCE => Ids::SPRUCE_FENCE, + WoodType::BIRCH => Ids::BIRCH_FENCE, + WoodType::JUNGLE => Ids::JUNGLE_FENCE, + WoodType::ACACIA => Ids::ACACIA_FENCE, + WoodType::DARK_OAK => Ids::DARK_OAK_FENCE, + WoodType::MANGROVE => Ids::MANGROVE_FENCE, + WoodType::CRIMSON => Ids::CRIMSON_FENCE, + WoodType::WARPED => Ids::WARPED_FENCE, + WoodType::CHERRY => Ids::CHERRY_FENCE, }); } public static function getSlabIdentifier(WoodType $type) : BID{ - return new BID(match($type->id()){ - WoodType::OAK()->id() => Ids::OAK_SLAB, - WoodType::SPRUCE()->id() => Ids::SPRUCE_SLAB, - WoodType::BIRCH()->id() => Ids::BIRCH_SLAB, - WoodType::JUNGLE()->id() => Ids::JUNGLE_SLAB, - WoodType::ACACIA()->id() => Ids::ACACIA_SLAB, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_SLAB, - WoodType::MANGROVE()->id() => Ids::MANGROVE_SLAB, - WoodType::CRIMSON()->id() => Ids::CRIMSON_SLAB, - WoodType::WARPED()->id() => Ids::WARPED_SLAB, - WoodType::CHERRY()->id() => Ids::CHERRY_SLAB, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($type){ + WoodType::OAK => Ids::OAK_SLAB, + WoodType::SPRUCE => Ids::SPRUCE_SLAB, + WoodType::BIRCH => Ids::BIRCH_SLAB, + WoodType::JUNGLE => Ids::JUNGLE_SLAB, + WoodType::ACACIA => Ids::ACACIA_SLAB, + WoodType::DARK_OAK => Ids::DARK_OAK_SLAB, + WoodType::MANGROVE => Ids::MANGROVE_SLAB, + WoodType::CRIMSON => Ids::CRIMSON_SLAB, + WoodType::WARPED => Ids::WARPED_SLAB, + WoodType::CHERRY => Ids::CHERRY_SLAB, }); } public static function getLogIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_LOG, - WoodType::SPRUCE()->id() => Ids::SPRUCE_LOG, - WoodType::BIRCH()->id() => Ids::BIRCH_LOG, - WoodType::JUNGLE()->id() => Ids::JUNGLE_LOG, - WoodType::ACACIA()->id() => Ids::ACACIA_LOG, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_LOG, - WoodType::MANGROVE()->id() => Ids::MANGROVE_LOG, - WoodType::CRIMSON()->id() => Ids::CRIMSON_STEM, - WoodType::WARPED()->id() => Ids::WARPED_STEM, - WoodType::CHERRY()->id() => Ids::CHERRY_LOG, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_LOG, + WoodType::SPRUCE => Ids::SPRUCE_LOG, + WoodType::BIRCH => Ids::BIRCH_LOG, + WoodType::JUNGLE => Ids::JUNGLE_LOG, + WoodType::ACACIA => Ids::ACACIA_LOG, + WoodType::DARK_OAK => Ids::DARK_OAK_LOG, + WoodType::MANGROVE => Ids::MANGROVE_LOG, + WoodType::CRIMSON => Ids::CRIMSON_STEM, + WoodType::WARPED => Ids::WARPED_STEM, + WoodType::CHERRY => Ids::CHERRY_LOG, }); } public static function getAllSidedLogIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_WOOD, - WoodType::SPRUCE()->id() => Ids::SPRUCE_WOOD, - WoodType::BIRCH()->id() => Ids::BIRCH_WOOD, - WoodType::JUNGLE()->id() => Ids::JUNGLE_WOOD, - WoodType::ACACIA()->id() => Ids::ACACIA_WOOD, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_WOOD, - WoodType::MANGROVE()->id() => Ids::MANGROVE_WOOD, - WoodType::CRIMSON()->id() => Ids::CRIMSON_HYPHAE, - WoodType::WARPED()->id() => Ids::WARPED_HYPHAE, - WoodType::CHERRY()->id() => Ids::CHERRY_WOOD, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_WOOD, + WoodType::SPRUCE => Ids::SPRUCE_WOOD, + WoodType::BIRCH => Ids::BIRCH_WOOD, + WoodType::JUNGLE => Ids::JUNGLE_WOOD, + WoodType::ACACIA => Ids::ACACIA_WOOD, + WoodType::DARK_OAK => Ids::DARK_OAK_WOOD, + WoodType::MANGROVE => Ids::MANGROVE_WOOD, + WoodType::CRIMSON => Ids::CRIMSON_HYPHAE, + WoodType::WARPED => Ids::WARPED_HYPHAE, + WoodType::CHERRY => Ids::CHERRY_WOOD, }); } public static function getLeavesIdentifier(LeavesType $leavesType) : BID{ - return new BID(match($leavesType->id()){ - LeavesType::OAK()->id() => Ids::OAK_LEAVES, - LeavesType::SPRUCE()->id() => Ids::SPRUCE_LEAVES, - LeavesType::BIRCH()->id() => Ids::BIRCH_LEAVES, - LeavesType::JUNGLE()->id() => Ids::JUNGLE_LEAVES, - LeavesType::ACACIA()->id() => Ids::ACACIA_LEAVES, - LeavesType::DARK_OAK()->id() => Ids::DARK_OAK_LEAVES, - LeavesType::MANGROVE()->id() => Ids::MANGROVE_LEAVES, - LeavesType::AZALEA()->id() => Ids::AZALEA_LEAVES, - LeavesType::FLOWERING_AZALEA()->id() => Ids::FLOWERING_AZALEA_LEAVES, - LeavesType::CHERRY()->id() => Ids::CHERRY_LEAVES, - default => throw new AssumptionFailedError("All leaves types should be covered") + return new BID(match($leavesType){ + LeavesType::OAK => Ids::OAK_LEAVES, + LeavesType::SPRUCE => Ids::SPRUCE_LEAVES, + LeavesType::BIRCH => Ids::BIRCH_LEAVES, + LeavesType::JUNGLE => Ids::JUNGLE_LEAVES, + LeavesType::ACACIA => Ids::ACACIA_LEAVES, + LeavesType::DARK_OAK => Ids::DARK_OAK_LEAVES, + LeavesType::MANGROVE => Ids::MANGROVE_LEAVES, + LeavesType::AZALEA => Ids::AZALEA_LEAVES, + LeavesType::FLOWERING_AZALEA => Ids::FLOWERING_AZALEA_LEAVES, + LeavesType::CHERRY => Ids::CHERRY_LEAVES, }); } public static function getSaplingIdentifier(SaplingType $treeType) : BID{ - return new BID(match($treeType->id()){ - SaplingType::OAK()->id() => Ids::OAK_SAPLING, - SaplingType::SPRUCE()->id() => Ids::SPRUCE_SAPLING, - SaplingType::BIRCH()->id() => Ids::BIRCH_SAPLING, - SaplingType::JUNGLE()->id() => Ids::JUNGLE_SAPLING, - SaplingType::ACACIA()->id() => Ids::ACACIA_SAPLING, - SaplingType::DARK_OAK()->id() => Ids::DARK_OAK_SAPLING, - default => throw new AssumptionFailedError("All tree types should be covered") + return new BID(match($treeType){ + SaplingType::OAK => Ids::OAK_SAPLING, + SaplingType::SPRUCE => Ids::SPRUCE_SAPLING, + SaplingType::BIRCH => Ids::BIRCH_SAPLING, + SaplingType::JUNGLE => Ids::JUNGLE_SAPLING, + SaplingType::ACACIA => Ids::ACACIA_SAPLING, + SaplingType::DARK_OAK => Ids::DARK_OAK_SAPLING, }); } @@ -160,62 +153,62 @@ final class WoodLikeBlockIdHelper{ * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} */ public static function getSignInfo(WoodType $treeType) : array{ - switch($treeType->id()){ - case WoodType::OAK()->id(): + switch($treeType){ + case WoodType::OAK: return [ new BID(Ids::OAK_SIGN, TileSign::class), new BID(Ids::OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::OAK_SIGN() ]; - case WoodType::SPRUCE()->id(): + case WoodType::SPRUCE: return [ new BID(Ids::SPRUCE_SIGN, TileSign::class), new BID(Ids::SPRUCE_WALL_SIGN, TileSign::class), fn() => VanillaItems::SPRUCE_SIGN() ]; - case WoodType::BIRCH()->id(): + case WoodType::BIRCH: return [ new BID(Ids::BIRCH_SIGN, TileSign::class), new BID(Ids::BIRCH_WALL_SIGN, TileSign::class), fn() => VanillaItems::BIRCH_SIGN() ]; - case WoodType::JUNGLE()->id(): + case WoodType::JUNGLE: return [ new BID(Ids::JUNGLE_SIGN, TileSign::class), new BID(Ids::JUNGLE_WALL_SIGN, TileSign::class), fn() => VanillaItems::JUNGLE_SIGN() ]; - case WoodType::ACACIA()->id(): + case WoodType::ACACIA: return [ new BID(Ids::ACACIA_SIGN, TileSign::class), new BID(Ids::ACACIA_WALL_SIGN, TileSign::class), fn() => VanillaItems::ACACIA_SIGN() ]; - case WoodType::DARK_OAK()->id(): + case WoodType::DARK_OAK: return [ new BID(Ids::DARK_OAK_SIGN, TileSign::class), new BID(Ids::DARK_OAK_WALL_SIGN, TileSign::class), fn() => VanillaItems::DARK_OAK_SIGN() ]; - case WoodType::MANGROVE()->id(): + case WoodType::MANGROVE: return [ new BID(Ids::MANGROVE_SIGN, TileSign::class), new BID(Ids::MANGROVE_WALL_SIGN, TileSign::class), fn() => VanillaItems::MANGROVE_SIGN() ]; - case WoodType::CRIMSON()->id(): + case WoodType::CRIMSON: return [ new BID(Ids::CRIMSON_SIGN, TileSign::class), new BID(Ids::CRIMSON_WALL_SIGN, TileSign::class), fn() => VanillaItems::CRIMSON_SIGN() ]; - case WoodType::WARPED()->id(): + case WoodType::WARPED: return [ new BID(Ids::WARPED_SIGN, TileSign::class), new BID(Ids::WARPED_WALL_SIGN, TileSign::class), fn() => VanillaItems::WARPED_SIGN() ]; - case WoodType::CHERRY()->id(): + case WoodType::CHERRY: return [ new BID(Ids::CHERRY_SIGN, TileSign::class), new BID(Ids::CHERRY_WALL_SIGN, TileSign::class), @@ -226,98 +219,92 @@ final class WoodLikeBlockIdHelper{ } public static function getTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_TRAPDOOR, - WoodType::SPRUCE()->id() => Ids::SPRUCE_TRAPDOOR, - WoodType::BIRCH()->id() => Ids::BIRCH_TRAPDOOR, - WoodType::JUNGLE()->id() => Ids::JUNGLE_TRAPDOOR, - WoodType::ACACIA()->id() => Ids::ACACIA_TRAPDOOR, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_TRAPDOOR, - WoodType::MANGROVE()->id() => Ids::MANGROVE_TRAPDOOR, - WoodType::CRIMSON()->id() => Ids::CRIMSON_TRAPDOOR, - WoodType::WARPED()->id() => Ids::WARPED_TRAPDOOR, - WoodType::CHERRY()->id() => Ids::CHERRY_TRAPDOOR, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_TRAPDOOR, + WoodType::SPRUCE => Ids::SPRUCE_TRAPDOOR, + WoodType::BIRCH => Ids::BIRCH_TRAPDOOR, + WoodType::JUNGLE => Ids::JUNGLE_TRAPDOOR, + WoodType::ACACIA => Ids::ACACIA_TRAPDOOR, + WoodType::DARK_OAK => Ids::DARK_OAK_TRAPDOOR, + WoodType::MANGROVE => Ids::MANGROVE_TRAPDOOR, + WoodType::CRIMSON => Ids::CRIMSON_TRAPDOOR, + WoodType::WARPED => Ids::WARPED_TRAPDOOR, + WoodType::CHERRY => Ids::CHERRY_TRAPDOOR, }); } public static function getButtonIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_BUTTON, - WoodType::SPRUCE()->id() => Ids::SPRUCE_BUTTON, - WoodType::BIRCH()->id() => Ids::BIRCH_BUTTON, - WoodType::JUNGLE()->id() => Ids::JUNGLE_BUTTON, - WoodType::ACACIA()->id() => Ids::ACACIA_BUTTON, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_BUTTON, - WoodType::MANGROVE()->id() => Ids::MANGROVE_BUTTON, - WoodType::CRIMSON()->id() => Ids::CRIMSON_BUTTON, - WoodType::WARPED()->id() => Ids::WARPED_BUTTON, - WoodType::CHERRY()->id() => Ids::CHERRY_BUTTON, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_BUTTON, + WoodType::SPRUCE => Ids::SPRUCE_BUTTON, + WoodType::BIRCH => Ids::BIRCH_BUTTON, + WoodType::JUNGLE => Ids::JUNGLE_BUTTON, + WoodType::ACACIA => Ids::ACACIA_BUTTON, + WoodType::DARK_OAK => Ids::DARK_OAK_BUTTON, + WoodType::MANGROVE => Ids::MANGROVE_BUTTON, + WoodType::CRIMSON => Ids::CRIMSON_BUTTON, + WoodType::WARPED => Ids::WARPED_BUTTON, + WoodType::CHERRY => Ids::CHERRY_BUTTON, }); } public static function getPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_PRESSURE_PLATE, - WoodType::SPRUCE()->id() => Ids::SPRUCE_PRESSURE_PLATE, - WoodType::BIRCH()->id() => Ids::BIRCH_PRESSURE_PLATE, - WoodType::JUNGLE()->id() => Ids::JUNGLE_PRESSURE_PLATE, - WoodType::ACACIA()->id() => Ids::ACACIA_PRESSURE_PLATE, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_PRESSURE_PLATE, - WoodType::MANGROVE()->id() => Ids::MANGROVE_PRESSURE_PLATE, - WoodType::CRIMSON()->id() => Ids::CRIMSON_PRESSURE_PLATE, - WoodType::WARPED()->id() => Ids::WARPED_PRESSURE_PLATE, - WoodType::CHERRY()->id() => Ids::CHERRY_PRESSURE_PLATE, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_PRESSURE_PLATE, + WoodType::SPRUCE => Ids::SPRUCE_PRESSURE_PLATE, + WoodType::BIRCH => Ids::BIRCH_PRESSURE_PLATE, + WoodType::JUNGLE => Ids::JUNGLE_PRESSURE_PLATE, + WoodType::ACACIA => Ids::ACACIA_PRESSURE_PLATE, + WoodType::DARK_OAK => Ids::DARK_OAK_PRESSURE_PLATE, + WoodType::MANGROVE => Ids::MANGROVE_PRESSURE_PLATE, + WoodType::CRIMSON => Ids::CRIMSON_PRESSURE_PLATE, + WoodType::WARPED => Ids::WARPED_PRESSURE_PLATE, + WoodType::CHERRY => Ids::CHERRY_PRESSURE_PLATE, }); } public static function getDoorIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_DOOR, - WoodType::SPRUCE()->id() => Ids::SPRUCE_DOOR, - WoodType::BIRCH()->id() => Ids::BIRCH_DOOR, - WoodType::JUNGLE()->id() => Ids::JUNGLE_DOOR, - WoodType::ACACIA()->id() => Ids::ACACIA_DOOR, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_DOOR, - WoodType::MANGROVE()->id() => Ids::MANGROVE_DOOR, - WoodType::CRIMSON()->id() => Ids::CRIMSON_DOOR, - WoodType::WARPED()->id() => Ids::WARPED_DOOR, - WoodType::CHERRY()->id() => Ids::CHERRY_DOOR, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_DOOR, + WoodType::SPRUCE => Ids::SPRUCE_DOOR, + WoodType::BIRCH => Ids::BIRCH_DOOR, + WoodType::JUNGLE => Ids::JUNGLE_DOOR, + WoodType::ACACIA => Ids::ACACIA_DOOR, + WoodType::DARK_OAK => Ids::DARK_OAK_DOOR, + WoodType::MANGROVE => Ids::MANGROVE_DOOR, + WoodType::CRIMSON => Ids::CRIMSON_DOOR, + WoodType::WARPED => Ids::WARPED_DOOR, + WoodType::CHERRY => Ids::CHERRY_DOOR, }); } public static function getFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_FENCE_GATE, - WoodType::SPRUCE()->id() => Ids::SPRUCE_FENCE_GATE, - WoodType::BIRCH()->id() => Ids::BIRCH_FENCE_GATE, - WoodType::JUNGLE()->id() => Ids::JUNGLE_FENCE_GATE, - WoodType::ACACIA()->id() => Ids::ACACIA_FENCE_GATE, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_FENCE_GATE, - WoodType::MANGROVE()->id() => Ids::MANGROVE_FENCE_GATE, - WoodType::CRIMSON()->id() => Ids::CRIMSON_FENCE_GATE, - WoodType::WARPED()->id() => Ids::WARPED_FENCE_GATE, - WoodType::CHERRY()->id() => Ids::CHERRY_FENCE_GATE, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_FENCE_GATE, + WoodType::SPRUCE => Ids::SPRUCE_FENCE_GATE, + WoodType::BIRCH => Ids::BIRCH_FENCE_GATE, + WoodType::JUNGLE => Ids::JUNGLE_FENCE_GATE, + WoodType::ACACIA => Ids::ACACIA_FENCE_GATE, + WoodType::DARK_OAK => Ids::DARK_OAK_FENCE_GATE, + WoodType::MANGROVE => Ids::MANGROVE_FENCE_GATE, + WoodType::CRIMSON => Ids::CRIMSON_FENCE_GATE, + WoodType::WARPED => Ids::WARPED_FENCE_GATE, + WoodType::CHERRY => Ids::CHERRY_FENCE_GATE, }); } public static function getStairsIdentifier(WoodType $treeType) : BlockIdentifier{ - return new BID(match($treeType->id()){ - WoodType::OAK()->id() => Ids::OAK_STAIRS, - WoodType::SPRUCE()->id() => Ids::SPRUCE_STAIRS, - WoodType::BIRCH()->id() => Ids::BIRCH_STAIRS, - WoodType::JUNGLE()->id() => Ids::JUNGLE_STAIRS, - WoodType::ACACIA()->id() => Ids::ACACIA_STAIRS, - WoodType::DARK_OAK()->id() => Ids::DARK_OAK_STAIRS, - WoodType::MANGROVE()->id() => Ids::MANGROVE_STAIRS, - WoodType::CRIMSON()->id() => Ids::CRIMSON_STAIRS, - WoodType::WARPED()->id() => Ids::WARPED_STAIRS, - WoodType::CHERRY()->id() => Ids::CHERRY_STAIRS, - default => throw new AssumptionFailedError("All wood types should be covered") + return new BID(match($treeType){ + WoodType::OAK => Ids::OAK_STAIRS, + WoodType::SPRUCE => Ids::SPRUCE_STAIRS, + WoodType::BIRCH => Ids::BIRCH_STAIRS, + WoodType::JUNGLE => Ids::JUNGLE_STAIRS, + WoodType::ACACIA => Ids::ACACIA_STAIRS, + WoodType::DARK_OAK => Ids::DARK_OAK_STAIRS, + WoodType::MANGROVE => Ids::MANGROVE_STAIRS, + WoodType::CRIMSON => Ids::CRIMSON_STAIRS, + WoodType::WARPED => Ids::WARPED_STAIRS, + WoodType::CHERRY => Ids::CHERRY_STAIRS, }); } } diff --git a/src/block/tile/MobHead.php b/src/block/tile/MobHead.php index 70a199bf67..be7c0ac2bc 100644 --- a/src/block/tile/MobHead.php +++ b/src/block/tile/MobHead.php @@ -26,10 +26,8 @@ namespace pocketmine\block\tile; use pocketmine\block\utils\MobHeadType; use pocketmine\data\bedrock\MobHeadTypeIdMap; use pocketmine\data\SavedDataLoadingException; -use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\world\World; /** * @deprecated @@ -42,14 +40,9 @@ class MobHead extends Spawnable{ private const TAG_MOUTH_MOVING = "MouthMoving"; //TAG_Byte private const TAG_MOUTH_TICK_COUNT = "MouthTickCount"; //TAG_Int - private MobHeadType $mobHeadType; + private MobHeadType $mobHeadType = MobHeadType::SKELETON; private int $rotation = 0; - public function __construct(World $world, Vector3 $pos){ - $this->mobHeadType = MobHeadType::SKELETON(); - parent::__construct($world, $pos); - } - public function readSaveData(CompoundTag $nbt) : void{ if(($skullTypeTag = $nbt->getTag(self::TAG_SKULL_TYPE)) instanceof ByteTag){ $mobHeadType = MobHeadTypeIdMap::getInstance()->fromId($skullTypeTag->getValue()); diff --git a/src/block/utils/BannerPatternType.php b/src/block/utils/BannerPatternType.php index 85b0640591..083fada1b3 100644 --- a/src/block/utils/BannerPatternType.php +++ b/src/block/utils/BannerPatternType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static BannerPatternType BORDER() * @method static BannerPatternType BRICKS() @@ -70,49 +68,45 @@ use pocketmine\utils\EnumTrait; * @method static BannerPatternType TRIANGLE_BOTTOM() * @method static BannerPatternType TRIANGLE_TOP() */ -final class BannerPatternType{ - use EnumTrait; +enum BannerPatternType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("border"), - new self("bricks"), - new self("circle"), - new self("creeper"), - new self("cross"), - new self("curly_border"), - new self("diagonal_left"), - new self("diagonal_right"), - new self("diagonal_up_left"), - new self("diagonal_up_right"), - new self("flower"), - new self("gradient"), - new self("gradient_up"), - new self("half_horizontal"), - new self("half_horizontal_bottom"), - new self("half_vertical"), - new self("half_vertical_right"), - new self("mojang"), - new self("rhombus"), - new self("skull"), - new self("small_stripes"), - new self("square_bottom_left"), - new self("square_bottom_right"), - new self("square_top_left"), - new self("square_top_right"), - new self("straight_cross"), - new self("stripe_bottom"), - new self("stripe_center"), - new self("stripe_downleft"), - new self("stripe_downright"), - new self("stripe_left"), - new self("stripe_middle"), - new self("stripe_right"), - new self("stripe_top"), - new self("triangle_bottom"), - new self("triangle_top"), - new self("triangles_bottom"), - new self("triangles_top") - ); - } + case BORDER; + case BRICKS; + case CIRCLE; + case CREEPER; + case CROSS; + case CURLY_BORDER; + case DIAGONAL_LEFT; + case DIAGONAL_RIGHT; + case DIAGONAL_UP_LEFT; + case DIAGONAL_UP_RIGHT; + case FLOWER; + case GRADIENT; + case GRADIENT_UP; + case HALF_HORIZONTAL; + case HALF_HORIZONTAL_BOTTOM; + case HALF_VERTICAL; + case HALF_VERTICAL_RIGHT; + case MOJANG; + case RHOMBUS; + case SKULL; + case SMALL_STRIPES; + case SQUARE_BOTTOM_LEFT; + case SQUARE_BOTTOM_RIGHT; + case SQUARE_TOP_LEFT; + case SQUARE_TOP_RIGHT; + case STRAIGHT_CROSS; + case STRIPE_BOTTOM; + case STRIPE_CENTER; + case STRIPE_DOWNLEFT; + case STRIPE_DOWNRIGHT; + case STRIPE_LEFT; + case STRIPE_MIDDLE; + case STRIPE_RIGHT; + case STRIPE_TOP; + case TRIANGLE_BOTTOM; + case TRIANGLE_TOP; + case TRIANGLES_BOTTOM; + case TRIANGLES_TOP; } diff --git a/src/block/utils/BellAttachmentType.php b/src/block/utils/BellAttachmentType.php index 963257031b..29b88a2c40 100644 --- a/src/block/utils/BellAttachmentType.php +++ b/src/block/utils/BellAttachmentType.php @@ -23,28 +23,22 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static BellAttachmentType CEILING() * @method static BellAttachmentType FLOOR() * @method static BellAttachmentType ONE_WALL() * @method static BellAttachmentType TWO_WALLS() */ -final class BellAttachmentType{ - use EnumTrait; +enum BellAttachmentType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("ceiling"), - new self("floor"), - new self("one_wall"), - new self("two_walls") - ); - } + case CEILING; + case FLOOR; + case ONE_WALL; + case TWO_WALLS; } diff --git a/src/block/utils/BrewingStandSlot.php b/src/block/utils/BrewingStandSlot.php index faeeaa7c4a..21500b1c97 100644 --- a/src/block/utils/BrewingStandSlot.php +++ b/src/block/utils/BrewingStandSlot.php @@ -24,37 +24,31 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\inventory\BrewingStandInventory; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static BrewingStandSlot EAST() * @method static BrewingStandSlot NORTHWEST() * @method static BrewingStandSlot SOUTHWEST() */ -final class BrewingStandSlot{ - use EnumTrait { - __construct as Enum___construct; - } +enum BrewingStandSlot{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("east", BrewingStandInventory::SLOT_BOTTLE_LEFT), - new self("northwest", BrewingStandInventory::SLOT_BOTTLE_MIDDLE), - new self("southwest", BrewingStandInventory::SLOT_BOTTLE_RIGHT) - ); - } - - private function __construct(string $enumName, private int $slotNumber){ - $this->Enum___construct($enumName); - } + case EAST; + case NORTHWEST; + case SOUTHWEST; /** * Returns the brewing stand inventory slot number associated with this visual slot. */ - public function getSlotNumber() : int{ return $this->slotNumber; } + public function getSlotNumber() : int{ + return match($this){ + self::EAST => BrewingStandInventory::SLOT_BOTTLE_LEFT, + self::NORTHWEST => BrewingStandInventory::SLOT_BOTTLE_MIDDLE, + self::SOUTHWEST => BrewingStandInventory::SLOT_BOTTLE_RIGHT + }; + } } diff --git a/src/block/utils/CopperOxidation.php b/src/block/utils/CopperOxidation.php index 8278819a79..ba9abeaed3 100644 --- a/src/block/utils/CopperOxidation.php +++ b/src/block/utils/CopperOxidation.php @@ -23,57 +23,30 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static CopperOxidation EXPOSED() * @method static CopperOxidation NONE() * @method static CopperOxidation OXIDIZED() * @method static CopperOxidation WEATHERED() */ -final class CopperOxidation{ - use EnumTrait { - __construct as Enum___construct; - register as Enum_register; - } +enum CopperOxidation : int{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("none", 0), - new self("exposed", 1), - new self("weathered", 2), - new self("oxidized", 3) - ); - } - - protected static function register(self $member) : void{ - self::Enum_register($member); - self::$levelMap[$member->value] = $member; - } - - /** - * @var self[] - * @phpstan-var array - */ - private static array $levelMap = []; - - private function __construct( - string $name, - private int $value - ){ - $this->Enum___construct($name); - } + case NONE = 0; + case EXPOSED = 1; + case WEATHERED = 2; + case OXIDIZED = 3; public function getPrevious() : ?self{ - return self::$levelMap[$this->value - 1] ?? null; + return self::tryFrom($this->value - 1); } public function getNext() : ?self{ - return self::$levelMap[$this->value + 1] ?? null; + return self::tryFrom($this->value + 1); } } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index 5fede94ddd..f0d708821f 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\block\BlockIdentifier; -use pocketmine\block\BlockTypeInfo; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Axe; use pocketmine\item\Item; @@ -36,14 +34,9 @@ use pocketmine\world\sound\CopperWaxRemoveSound; use pocketmine\world\sound\ScrapeSound; trait CopperTrait{ - private CopperOxidation $oxidation; + private CopperOxidation $oxidation = CopperOxidation::NONE; private bool $waxed = false; - public function __construct(BlockIdentifier $identifier, string $name, BlockTypeInfo $typeInfo){ - $this->oxidation = CopperOxidation::NONE(); - parent::__construct($identifier, $name, $typeInfo); - } - public function describeBlockItemState(RuntimeDataDescriber $w) : void{ $w->copperOxidation($this->oxidation); $w->bool($this->waxed); diff --git a/src/block/utils/CoralType.php b/src/block/utils/CoralType.php index 5a4d88fa9c..cba3e8ddee 100644 --- a/src/block/utils/CoralType.php +++ b/src/block/utils/CoralType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static CoralType BRAIN() * @method static CoralType BUBBLE() @@ -37,27 +35,22 @@ use pocketmine\utils\EnumTrait; * @method static CoralType HORN() * @method static CoralType TUBE() */ -final class CoralType{ - use EnumTrait { - __construct as Enum___construct; - } +enum CoralType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("tube", "Tube"), - new self("brain", "Brain"), - new self("bubble", "Bubble"), - new self("fire", "Fire"), - new self("horn", "Horn"), - ); - } + case TUBE; + case BRAIN; + case BUBBLE; + case FIRE; + case HORN; - private function __construct( - string $name, - private string $displayName - ){ - $this->Enum___construct($name); + public function getDisplayName() : string{ + return match($this){ + self::TUBE => "Tube", + self::BRAIN => "Brain", + self::BUBBLE => "Bubble", + self::FIRE => "Fire", + self::HORN => "Horn", + }; } - - public function getDisplayName() : string{ return $this->displayName; } } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index 5dcd539d43..fcd7dbf246 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -27,7 +27,7 @@ use pocketmine\block\Block; use pocketmine\data\runtime\RuntimeDataDescriber; trait CoralTypeTrait{ - protected CoralType $coralType; + protected CoralType $coralType = CoralType::TUBE; protected bool $dead = false; /** @see Block::describeBlockItemState() */ diff --git a/src/block/utils/DirtType.php b/src/block/utils/DirtType.php index 536268676d..9bed30d1c5 100644 --- a/src/block/utils/DirtType.php +++ b/src/block/utils/DirtType.php @@ -23,26 +23,20 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static DirtType COARSE() * @method static DirtType NORMAL() * @method static DirtType ROOTED() */ -final class DirtType{ - use EnumTrait; +enum DirtType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("normal"), - new self("coarse"), - new self("rooted") - ); - } + case NORMAL; + case COARSE; + case ROOTED; } diff --git a/src/block/utils/DripleafState.php b/src/block/utils/DripleafState.php index 3c2e20a13e..4b0cedce7e 100644 --- a/src/block/utils/DripleafState.php +++ b/src/block/utils/DripleafState.php @@ -23,43 +23,30 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static DripleafState FULL_TILT() * @method static DripleafState PARTIAL_TILT() * @method static DripleafState STABLE() * @method static DripleafState UNSTABLE() */ -final class DripleafState{ - use EnumTrait { - register as Enum_register; - __construct as Enum___construct; - } +enum DripleafState{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("stable", null), - new self("unstable", 10), - new self("partial_tilt", 10), - new self("full_tilt", 100) - ); - } - - private function __construct( - string $enumName, - private ?int $scheduledUpdateDelayTicks - ){ - $this->Enum___construct($enumName); - } + case STABLE; + case UNSTABLE; + case PARTIAL_TILT; + case FULL_TILT; public function getScheduledUpdateDelayTicks() : ?int{ - return $this->scheduledUpdateDelayTicks; + return match($this){ + self::STABLE => null, + self::UNSTABLE, self::PARTIAL_TILT => 10, + self::FULL_TILT => 100, + }; } - } diff --git a/src/block/utils/FroglightType.php b/src/block/utils/FroglightType.php index f6b9c1d13f..ab20d31ac5 100644 --- a/src/block/utils/FroglightType.php +++ b/src/block/utils/FroglightType.php @@ -23,26 +23,20 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static FroglightType OCHRE() * @method static FroglightType PEARLESCENT() * @method static FroglightType VERDANT() */ -final class FroglightType{ - use EnumTrait; +enum FroglightType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("ochre"), - new self("pearlescent"), - new self("verdant") - ); - } + case OCHRE; + case PEARLESCENT; + case VERDANT; } diff --git a/src/block/utils/LeavesType.php b/src/block/utils/LeavesType.php index ecb2a1fd94..975551ad6d 100644 --- a/src/block/utils/LeavesType.php +++ b/src/block/utils/LeavesType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static LeavesType ACACIA() * @method static LeavesType AZALEA() @@ -42,35 +40,32 @@ use pocketmine\utils\EnumTrait; * @method static LeavesType OAK() * @method static LeavesType SPRUCE() */ -final class LeavesType{ - use EnumTrait { - register as Enum_register; - __construct as Enum___construct; - } +enum LeavesType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("oak", "Oak"), - new self("spruce", "Spruce"), - new self("birch", "Birch"), - new self("jungle", "Jungle"), - new self("acacia", "Acacia"), - new self("dark_oak", "Dark Oak"), - new self("mangrove", "Mangrove"), - new self("azalea", "Azalea"), - new self("flowering_azalea", "Flowering Azalea"), - new self("cherry", "Cherry") - ); - } - - private function __construct( - string $enumName, - private string $displayName - ){ - $this->Enum___construct($enumName); - } + case OAK; + case SPRUCE; + case BIRCH; + case JUNGLE; + case ACACIA; + case DARK_OAK; + case MANGROVE; + case AZALEA; + case FLOWERING_AZALEA; + case CHERRY; public function getDisplayName() : string{ - return $this->displayName; + return match($this){ + self::OAK => "Oak", + self::SPRUCE => "Spruce", + self::BIRCH => "Birch", + self::JUNGLE => "Jungle", + self::ACACIA => "Acacia", + self::DARK_OAK => "Dark Oak", + self::MANGROVE => "Mangrove", + self::AZALEA => "Azalea", + self::FLOWERING_AZALEA => "Flowering Azalea", + self::CHERRY => "Cherry" + }; } } diff --git a/src/block/utils/LeverFacing.php b/src/block/utils/LeverFacing.php index 99eeb88d30..1af92d6c4c 100644 --- a/src/block/utils/LeverFacing.php +++ b/src/block/utils/LeverFacing.php @@ -24,13 +24,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\math\Facing; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static LeverFacing DOWN_AXIS_X() * @method static LeverFacing DOWN_AXIS_Z() @@ -41,27 +39,26 @@ use pocketmine\utils\EnumTrait; * @method static LeverFacing UP_AXIS_Z() * @method static LeverFacing WEST() */ -final class LeverFacing{ - use EnumTrait { - __construct as Enum___construct; - } +enum LeverFacing{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("up_axis_x", Facing::UP), - new self("up_axis_z", Facing::UP), - new self("down_axis_x", Facing::DOWN), - new self("down_axis_z", Facing::DOWN), - new self("north", Facing::NORTH), - new self("east", Facing::EAST), - new self("south", Facing::SOUTH), - new self("west", Facing::WEST), - ); - } + case UP_AXIS_X; + case UP_AXIS_Z; + case DOWN_AXIS_X; + case DOWN_AXIS_Z; + case NORTH; + case EAST; + case SOUTH; + case WEST; - private function __construct(string $enumName, private int $facing){ - $this->Enum___construct($enumName); + public function getFacing() : int{ + return match($this){ + self::UP_AXIS_X, self::UP_AXIS_Z => Facing::UP, + self::DOWN_AXIS_X, self::DOWN_AXIS_Z => Facing::DOWN, + self::NORTH => Facing::NORTH, + self::EAST => Facing::EAST, + self::SOUTH => Facing::SOUTH, + self::WEST => Facing::WEST, + }; } - - public function getFacing() : int{ return $this->facing; } } diff --git a/src/block/utils/MobHeadType.php b/src/block/utils/MobHeadType.php index 391b668209..af1fe1c4c2 100644 --- a/src/block/utils/MobHeadType.php +++ b/src/block/utils/MobHeadType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static MobHeadType CREEPER() * @method static MobHeadType DRAGON() @@ -39,31 +37,26 @@ use pocketmine\utils\EnumTrait; * @method static MobHeadType WITHER_SKELETON() * @method static MobHeadType ZOMBIE() */ -final class MobHeadType{ - use EnumTrait { - __construct as Enum___construct; - } +enum MobHeadType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new MobHeadType("skeleton", "Skeleton Skull"), - new MobHeadType("wither_skeleton", "Wither Skeleton Skull"), - new MobHeadType("zombie", "Zombie Head"), - new MobHeadType("player", "Player Head"), - new MobHeadType("creeper", "Creeper Head"), - new MobHeadType("dragon", "Dragon Head"), - new MobHeadType("piglin", "Piglin Head") - ); - } - - private function __construct( - string $enumName, - private string $displayName - ){ - $this->Enum___construct($enumName); - } + case SKELETON; + case WITHER_SKELETON; + case ZOMBIE; + case PLAYER; + case CREEPER; + case DRAGON; + case PIGLIN; public function getDisplayName() : string{ - return $this->displayName; + return match($this){ + self::SKELETON => "Skeleton Skull", + self::WITHER_SKELETON => "Wither Skeleton Skull", + self::ZOMBIE => "Zombie Head", + self::PLAYER => "Player Head", + self::CREEPER => "Creeper Head", + self::DRAGON => "Dragon Head", + self::PIGLIN => "Piglin Head" + }; } } diff --git a/src/block/utils/MushroomBlockType.php b/src/block/utils/MushroomBlockType.php index 7f001d13da..6bc499b236 100644 --- a/src/block/utils/MushroomBlockType.php +++ b/src/block/utils/MushroomBlockType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static MushroomBlockType ALL_CAP() * @method static MushroomBlockType CAP_EAST() @@ -43,22 +41,18 @@ use pocketmine\utils\EnumTrait; * @method static MushroomBlockType CAP_WEST() * @method static MushroomBlockType PORES() */ -final class MushroomBlockType{ - use EnumTrait; +enum MushroomBlockType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("PORES"), - new self("CAP_NORTHWEST"), - new self("CAP_NORTH"), - new self("CAP_NORTHEAST"), - new self("CAP_WEST"), - new self("CAP_MIDDLE"), - new self("CAP_EAST"), - new self("CAP_SOUTHWEST"), - new self("CAP_SOUTH"), - new self("CAP_SOUTHEAST"), - new self("ALL_CAP") - ); - } + case PORES; + case CAP_NORTHWEST; + case CAP_NORTH; + case CAP_NORTHEAST; + case CAP_WEST; + case CAP_MIDDLE; + case CAP_EAST; + case CAP_SOUTHWEST; + case CAP_SOUTH; + case CAP_SOUTHEAST; + case ALL_CAP; } diff --git a/src/block/utils/SaplingType.php b/src/block/utils/SaplingType.php index 516ee1516b..9fe87936cd 100644 --- a/src/block/utils/SaplingType.php +++ b/src/block/utils/SaplingType.php @@ -23,14 +23,12 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; use pocketmine\world\generator\object\TreeType; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static SaplingType ACACIA() * @method static SaplingType BIRCH() @@ -39,33 +37,29 @@ use pocketmine\world\generator\object\TreeType; * @method static SaplingType OAK() * @method static SaplingType SPRUCE() */ -final class SaplingType{ - use EnumTrait { - __construct as Enum___construct; - } +enum SaplingType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("oak", TreeType::OAK()), - new self("spruce", TreeType::SPRUCE()), - new self("birch", TreeType::BIRCH()), - new self("jungle", TreeType::JUNGLE()), - new self("acacia", TreeType::ACACIA()), - new self("dark_oak", TreeType::DARK_OAK()), - //TODO: cherry - ); - } + case OAK; + case SPRUCE; + case BIRCH; + case JUNGLE; + case ACACIA; + case DARK_OAK; + //TODO: cherry - private function __construct( - string $enumName, - private TreeType $treeType, - ){ - $this->Enum___construct($enumName); + public function getTreeType() : TreeType{ + return match($this){ + self::OAK => TreeType::OAK, + self::SPRUCE => TreeType::SPRUCE, + self::BIRCH => TreeType::BIRCH, + self::JUNGLE => TreeType::JUNGLE, + self::ACACIA => TreeType::ACACIA, + self::DARK_OAK => TreeType::DARK_OAK, + }; } - public function getTreeType() : TreeType{ return $this->treeType; } - public function getDisplayName() : string{ - return $this->treeType->getDisplayName(); + return $this->getTreeType()->getDisplayName(); } } diff --git a/src/block/utils/SlabType.php b/src/block/utils/SlabType.php index 1da1b3e5a3..90f3e09535 100644 --- a/src/block/utils/SlabType.php +++ b/src/block/utils/SlabType.php @@ -23,26 +23,20 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static SlabType BOTTOM() * @method static SlabType DOUBLE() * @method static SlabType TOP() */ -final class SlabType{ - use EnumTrait; +enum SlabType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("bottom"), - new self("top"), - new self("double") - ); - } + case BOTTOM; + case TOP; + case DOUBLE; } diff --git a/src/block/utils/StairShape.php b/src/block/utils/StairShape.php index c98aec8fba..b89b9adbb2 100644 --- a/src/block/utils/StairShape.php +++ b/src/block/utils/StairShape.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static StairShape INNER_LEFT() * @method static StairShape INNER_RIGHT() @@ -37,16 +35,12 @@ use pocketmine\utils\EnumTrait; * @method static StairShape OUTER_RIGHT() * @method static StairShape STRAIGHT() */ -final class StairShape{ - use EnumTrait; +enum StairShape{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("straight"), - new self("inner_left"), - new self("inner_right"), - new self("outer_left"), - new self("outer_right") - ); - } + case STRAIGHT; + case INNER_LEFT; + case INNER_RIGHT; + case OUTER_LEFT; + case OUTER_RIGHT; } diff --git a/src/block/utils/SupportType.php b/src/block/utils/SupportType.php index b4480bf57f..9513d86401 100644 --- a/src/block/utils/SupportType.php +++ b/src/block/utils/SupportType.php @@ -23,36 +23,30 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static SupportType CENTER() * @method static SupportType EDGE() * @method static SupportType FULL() * @method static SupportType NONE() */ -final class SupportType{ - use EnumTrait; +enum SupportType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("full"), - new self("center"), - new self("edge"), - new self("none") - ); - } + case FULL; + case CENTER; + case EDGE; + case NONE; public function hasEdgeSupport() : bool{ - return $this->equals(self::EDGE()) || $this->equals(self::FULL()); + return $this === self::EDGE || $this === self::FULL; } public function hasCenterSupport() : bool{ - return $this->equals(self::CENTER()) || $this->equals(self::FULL()); + return $this === self::CENTER || $this === self::FULL; } } diff --git a/src/block/utils/WallConnectionType.php b/src/block/utils/WallConnectionType.php index 11765ab33c..1d4c8d1524 100644 --- a/src/block/utils/WallConnectionType.php +++ b/src/block/utils/WallConnectionType.php @@ -23,24 +23,18 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static WallConnectionType SHORT() * @method static WallConnectionType TALL() */ -final class WallConnectionType{ - use EnumTrait; +enum WallConnectionType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("short"), - new self("tall") - ); - } + case SHORT; + case TALL; } diff --git a/src/block/utils/WoodType.php b/src/block/utils/WoodType.php index b9d96561b9..f6195b9f90 100644 --- a/src/block/utils/WoodType.php +++ b/src/block/utils/WoodType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static WoodType ACACIA() * @method static WoodType BIRCH() @@ -42,41 +40,44 @@ use pocketmine\utils\EnumTrait; * @method static WoodType SPRUCE() * @method static WoodType WARPED() */ -final class WoodType{ - use EnumTrait { - __construct as private Enum___construct; +enum WoodType{ + use LegacyEnumShimTrait; + + case OAK; + case SPRUCE; + case BIRCH; + case JUNGLE; + case ACACIA; + case DARK_OAK; + case MANGROVE; + case CRIMSON; + case WARPED; + case CHERRY; + + public function getDisplayName() : string{ + return match($this){ + self::OAK => "Oak", + self::SPRUCE => "Spruce", + self::BIRCH => "Birch", + self::JUNGLE => "Jungle", + self::ACACIA => "Acacia", + self::DARK_OAK => "Dark Oak", + self::MANGROVE => "Mangrove", + self::CRIMSON => "Crimson", + self::WARPED => "Warped", + self::CHERRY => "Cherry", + }; } - protected static function setup() : void{ - self::registerAll( - new self("oak", "Oak", true), - new self("spruce", "Spruce", true), - new self("birch", "Birch", true), - new self("jungle", "Jungle", true), - new self("acacia", "Acacia", true), - new self("dark_oak", "Dark Oak", true), - new self("mangrove", "Mangrove", true), - new self("crimson", "Crimson", false, "Stem", "Hyphae"), - new self("warped", "Warped", false, "Stem", "Hyphae"), - new self("cherry", "Cherry", true), - ); + public function isFlammable() : bool{ + return $this !== self::CRIMSON && $this !== self::WARPED; } - private function __construct( - string $enumName, - private string $displayName, - private bool $flammable, - private ?string $standardLogSuffix = null, - private ?string $allSidedLogSuffix = null, - ){ - $this->Enum___construct($enumName); + public function getStandardLogSuffix() : ?string{ + return $this === self::CRIMSON || $this === self::WARPED ? "Stem" : null; } - public function getDisplayName() : string{ return $this->displayName; } - - public function isFlammable() : bool{ return $this->flammable; } - - public function getStandardLogSuffix() : ?string{ return $this->standardLogSuffix; } - - public function getAllSidedLogSuffix() : ?string{ return $this->allSidedLogSuffix; } + public function getAllSidedLogSuffix() : ?string{ + return $this === self::CRIMSON || $this === self::WARPED ? "Hyphae" : null; + } } diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 812ff83e0a..0c861255b4 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -211,10 +211,10 @@ final class CraftingManagerFromDataHelper{ foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'shapeless_crafting.json'), ShapelessRecipeData::class) as $recipe){ $recipeType = match($recipe->block){ - "crafting_table" => ShapelessRecipeType::CRAFTING(), - "stonecutter" => ShapelessRecipeType::STONECUTTER(), - "smithing_table" => ShapelessRecipeType::SMITHING(), - "cartography_table" => ShapelessRecipeType::CARTOGRAPHY(), + "crafting_table" => ShapelessRecipeType::CRAFTING, + "stonecutter" => ShapelessRecipeType::STONECUTTER, + "smithing_table" => ShapelessRecipeType::SMITHING, + "cartography_table" => ShapelessRecipeType::CARTOGRAPHY, default => null }; if($recipeType === null){ diff --git a/src/crafting/ShapelessRecipeType.php b/src/crafting/ShapelessRecipeType.php index b115c22f49..4f4624a4bf 100644 --- a/src/crafting/ShapelessRecipeType.php +++ b/src/crafting/ShapelessRecipeType.php @@ -23,28 +23,22 @@ declare(strict_types=1); namespace pocketmine\crafting; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static ShapelessRecipeType CARTOGRAPHY() * @method static ShapelessRecipeType CRAFTING() * @method static ShapelessRecipeType SMITHING() * @method static ShapelessRecipeType STONECUTTER() */ -final class ShapelessRecipeType{ - use EnumTrait; +enum ShapelessRecipeType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("crafting"), - new self("stonecutter"), - new self("smithing"), - new self("cartography") - ); - } + case CRAFTING; + case STONECUTTER; + case SMITHING; + case CARTOGRAPHY; } diff --git a/src/data/bedrock/BannerPatternTypeIdMap.php b/src/data/bedrock/BannerPatternTypeIdMap.php index 293f8ec387..064844e199 100644 --- a/src/data/bedrock/BannerPatternTypeIdMap.php +++ b/src/data/bedrock/BannerPatternTypeIdMap.php @@ -26,6 +26,7 @@ namespace pocketmine\data\bedrock; use pocketmine\block\utils\BannerPatternType; use pocketmine\utils\SingletonTrait; use function array_key_exists; +use function spl_object_id; final class BannerPatternTypeIdMap{ use SingletonTrait; @@ -42,49 +43,49 @@ final class BannerPatternTypeIdMap{ private array $enumToId = []; public function __construct(){ - $this->register("bo", BannerPatternType::BORDER()); - $this->register("bri", BannerPatternType::BRICKS()); - $this->register("mc", BannerPatternType::CIRCLE()); - $this->register("cre", BannerPatternType::CREEPER()); - $this->register("cr", BannerPatternType::CROSS()); - $this->register("cbo", BannerPatternType::CURLY_BORDER()); - $this->register("lud", BannerPatternType::DIAGONAL_LEFT()); - $this->register("rd", BannerPatternType::DIAGONAL_RIGHT()); - $this->register("ld", BannerPatternType::DIAGONAL_UP_LEFT()); - $this->register("rud", BannerPatternType::DIAGONAL_UP_RIGHT()); - $this->register("flo", BannerPatternType::FLOWER()); - $this->register("gra", BannerPatternType::GRADIENT()); - $this->register("gru", BannerPatternType::GRADIENT_UP()); - $this->register("hh", BannerPatternType::HALF_HORIZONTAL()); - $this->register("hhb", BannerPatternType::HALF_HORIZONTAL_BOTTOM()); - $this->register("vh", BannerPatternType::HALF_VERTICAL()); - $this->register("vhr", BannerPatternType::HALF_VERTICAL_RIGHT()); - $this->register("moj", BannerPatternType::MOJANG()); - $this->register("mr", BannerPatternType::RHOMBUS()); - $this->register("sku", BannerPatternType::SKULL()); - $this->register("ss", BannerPatternType::SMALL_STRIPES()); - $this->register("bl", BannerPatternType::SQUARE_BOTTOM_LEFT()); - $this->register("br", BannerPatternType::SQUARE_BOTTOM_RIGHT()); - $this->register("tl", BannerPatternType::SQUARE_TOP_LEFT()); - $this->register("tr", BannerPatternType::SQUARE_TOP_RIGHT()); - $this->register("sc", BannerPatternType::STRAIGHT_CROSS()); - $this->register("bs", BannerPatternType::STRIPE_BOTTOM()); - $this->register("cs", BannerPatternType::STRIPE_CENTER()); - $this->register("dls", BannerPatternType::STRIPE_DOWNLEFT()); - $this->register("drs", BannerPatternType::STRIPE_DOWNRIGHT()); - $this->register("ls", BannerPatternType::STRIPE_LEFT()); - $this->register("ms", BannerPatternType::STRIPE_MIDDLE()); - $this->register("rs", BannerPatternType::STRIPE_RIGHT()); - $this->register("ts", BannerPatternType::STRIPE_TOP()); - $this->register("bt", BannerPatternType::TRIANGLE_BOTTOM()); - $this->register("tt", BannerPatternType::TRIANGLE_TOP()); - $this->register("bts", BannerPatternType::TRIANGLES_BOTTOM()); - $this->register("tts", BannerPatternType::TRIANGLES_TOP()); + $this->register("bo", BannerPatternType::BORDER); + $this->register("bri", BannerPatternType::BRICKS); + $this->register("mc", BannerPatternType::CIRCLE); + $this->register("cre", BannerPatternType::CREEPER); + $this->register("cr", BannerPatternType::CROSS); + $this->register("cbo", BannerPatternType::CURLY_BORDER); + $this->register("lud", BannerPatternType::DIAGONAL_LEFT); + $this->register("rd", BannerPatternType::DIAGONAL_RIGHT); + $this->register("ld", BannerPatternType::DIAGONAL_UP_LEFT); + $this->register("rud", BannerPatternType::DIAGONAL_UP_RIGHT); + $this->register("flo", BannerPatternType::FLOWER); + $this->register("gra", BannerPatternType::GRADIENT); + $this->register("gru", BannerPatternType::GRADIENT_UP); + $this->register("hh", BannerPatternType::HALF_HORIZONTAL); + $this->register("hhb", BannerPatternType::HALF_HORIZONTAL_BOTTOM); + $this->register("vh", BannerPatternType::HALF_VERTICAL); + $this->register("vhr", BannerPatternType::HALF_VERTICAL_RIGHT); + $this->register("moj", BannerPatternType::MOJANG); + $this->register("mr", BannerPatternType::RHOMBUS); + $this->register("sku", BannerPatternType::SKULL); + $this->register("ss", BannerPatternType::SMALL_STRIPES); + $this->register("bl", BannerPatternType::SQUARE_BOTTOM_LEFT); + $this->register("br", BannerPatternType::SQUARE_BOTTOM_RIGHT); + $this->register("tl", BannerPatternType::SQUARE_TOP_LEFT); + $this->register("tr", BannerPatternType::SQUARE_TOP_RIGHT); + $this->register("sc", BannerPatternType::STRAIGHT_CROSS); + $this->register("bs", BannerPatternType::STRIPE_BOTTOM); + $this->register("cs", BannerPatternType::STRIPE_CENTER); + $this->register("dls", BannerPatternType::STRIPE_DOWNLEFT); + $this->register("drs", BannerPatternType::STRIPE_DOWNRIGHT); + $this->register("ls", BannerPatternType::STRIPE_LEFT); + $this->register("ms", BannerPatternType::STRIPE_MIDDLE); + $this->register("rs", BannerPatternType::STRIPE_RIGHT); + $this->register("ts", BannerPatternType::STRIPE_TOP); + $this->register("bt", BannerPatternType::TRIANGLE_BOTTOM); + $this->register("tt", BannerPatternType::TRIANGLE_TOP); + $this->register("bts", BannerPatternType::TRIANGLES_BOTTOM); + $this->register("tts", BannerPatternType::TRIANGLES_TOP); } public function register(string $stringId, BannerPatternType $type) : void{ $this->idToEnum[$stringId] = $type; - $this->enumToId[$type->id()] = $stringId; + $this->enumToId[spl_object_id($type)] = $stringId; } public function fromId(string $id) : ?BannerPatternType{ @@ -92,9 +93,10 @@ final class BannerPatternTypeIdMap{ } public function toId(BannerPatternType $type) : string{ - if(!array_key_exists($type->id(), $this->enumToId)){ - throw new \InvalidArgumentException("Missing mapping for banner pattern type " . $type->name()); + $k = spl_object_id($type); + if(!array_key_exists($k, $this->enumToId)){ + throw new \InvalidArgumentException("Missing mapping for banner pattern type " . $type->name); } - return $this->enumToId[$type->id()]; + return $this->enumToId[$k]; } } diff --git a/src/data/bedrock/MobHeadTypeIdMap.php b/src/data/bedrock/MobHeadTypeIdMap.php index b99b1097bc..ec678b1924 100644 --- a/src/data/bedrock/MobHeadTypeIdMap.php +++ b/src/data/bedrock/MobHeadTypeIdMap.php @@ -32,12 +32,12 @@ final class MobHeadTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(0, MobHeadType::SKELETON()); - $this->register(1, MobHeadType::WITHER_SKELETON()); - $this->register(2, MobHeadType::ZOMBIE()); - $this->register(3, MobHeadType::PLAYER()); - $this->register(4, MobHeadType::CREEPER()); - $this->register(5, MobHeadType::DRAGON()); - $this->register(6, MobHeadType::PIGLIN()); + $this->register(0, MobHeadType::SKELETON); + $this->register(1, MobHeadType::WITHER_SKELETON); + $this->register(2, MobHeadType::ZOMBIE); + $this->register(3, MobHeadType::PLAYER); + $this->register(4, MobHeadType::CREEPER); + $this->register(5, MobHeadType::DRAGON); + $this->register(6, MobHeadType::PIGLIN); } } diff --git a/src/data/bedrock/MushroomBlockTypeIdMap.php b/src/data/bedrock/MushroomBlockTypeIdMap.php index 927b52c769..92edef4b23 100644 --- a/src/data/bedrock/MushroomBlockTypeIdMap.php +++ b/src/data/bedrock/MushroomBlockTypeIdMap.php @@ -33,16 +33,16 @@ final class MushroomBlockTypeIdMap{ use IntSaveIdMapTrait; public function __construct(){ - $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_PORES, MushroomBlockType::PORES()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER, MushroomBlockType::CAP_NORTHWEST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTH_SIDE, MushroomBlockType::CAP_NORTH()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHEAST_CORNER, MushroomBlockType::CAP_NORTHEAST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_WEST_SIDE, MushroomBlockType::CAP_WEST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_TOP_ONLY, MushroomBlockType::CAP_MIDDLE()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_EAST_SIDE, MushroomBlockType::CAP_EAST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHWEST_CORNER, MushroomBlockType::CAP_SOUTHWEST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTH_SIDE, MushroomBlockType::CAP_SOUTH()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, MushroomBlockType::CAP_SOUTHEAST()); - $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_CAP, MushroomBlockType::ALL_CAP()); + $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_PORES, MushroomBlockType::PORES); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER, MushroomBlockType::CAP_NORTHWEST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTH_SIDE, MushroomBlockType::CAP_NORTH); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHEAST_CORNER, MushroomBlockType::CAP_NORTHEAST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_WEST_SIDE, MushroomBlockType::CAP_WEST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_TOP_ONLY, MushroomBlockType::CAP_MIDDLE); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_EAST_SIDE, MushroomBlockType::CAP_EAST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHWEST_CORNER, MushroomBlockType::CAP_SOUTHWEST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTH_SIDE, MushroomBlockType::CAP_SOUTH); + $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, MushroomBlockType::CAP_SOUTHEAST); + $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_CAP, MushroomBlockType::ALL_CAP); } } diff --git a/src/data/bedrock/NoteInstrumentIdMap.php b/src/data/bedrock/NoteInstrumentIdMap.php index 22d7e5cb1a..e721b881d2 100644 --- a/src/data/bedrock/NoteInstrumentIdMap.php +++ b/src/data/bedrock/NoteInstrumentIdMap.php @@ -32,21 +32,21 @@ final class NoteInstrumentIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(0, NoteInstrument::PIANO()); - $this->register(1, NoteInstrument::BASS_DRUM()); - $this->register(2, NoteInstrument::SNARE()); - $this->register(3, NoteInstrument::CLICKS_AND_STICKS()); - $this->register(4, NoteInstrument::DOUBLE_BASS()); - $this->register(5, NoteInstrument::BELL()); - $this->register(6, NoteInstrument::FLUTE()); - $this->register(7, NoteInstrument::CHIME()); - $this->register(8, NoteInstrument::GUITAR()); - $this->register(9, NoteInstrument::XYLOPHONE()); - $this->register(10, NoteInstrument::IRON_XYLOPHONE()); - $this->register(11, NoteInstrument::COW_BELL()); - $this->register(12, NoteInstrument::DIDGERIDOO()); - $this->register(13, NoteInstrument::BIT()); - $this->register(14, NoteInstrument::BANJO()); - $this->register(15, NoteInstrument::PLING()); + $this->register(0, NoteInstrument::PIANO); + $this->register(1, NoteInstrument::BASS_DRUM); + $this->register(2, NoteInstrument::SNARE); + $this->register(3, NoteInstrument::CLICKS_AND_STICKS); + $this->register(4, NoteInstrument::DOUBLE_BASS); + $this->register(5, NoteInstrument::BELL); + $this->register(6, NoteInstrument::FLUTE); + $this->register(7, NoteInstrument::CHIME); + $this->register(8, NoteInstrument::GUITAR); + $this->register(9, NoteInstrument::XYLOPHONE); + $this->register(10, NoteInstrument::IRON_XYLOPHONE); + $this->register(11, NoteInstrument::COW_BELL); + $this->register(12, NoteInstrument::DIDGERIDOO); + $this->register(13, NoteInstrument::BIT); + $this->register(14, NoteInstrument::BANJO); + $this->register(15, NoteInstrument::PLING); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 6ffc1c55df..28a6864feb 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -419,13 +419,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ private function registerFlatCoralSerializers() : void{ $this->map(Blocks::CORAL(), fn(Coral $block) => Writer::create( - match($coralType = $block->getCoralType()){ - CoralType::BRAIN() => $block->isDead() ? Ids::DEAD_BRAIN_CORAL : Ids::BRAIN_CORAL, - CoralType::BUBBLE() => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL : Ids::BUBBLE_CORAL, - CoralType::FIRE() => $block->isDead() ? Ids::DEAD_FIRE_CORAL : Ids::FIRE_CORAL, - CoralType::HORN() => $block->isDead() ? Ids::DEAD_HORN_CORAL : Ids::HORN_CORAL, - CoralType::TUBE() => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL, - default => throw new AssumptionFailedError("Unhandled coral type " . $coralType->name()) + match($block->getCoralType()){ + CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL : Ids::BRAIN_CORAL, + CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL : Ids::BUBBLE_CORAL, + CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL : Ids::FIRE_CORAL, + CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL : Ids::HORN_CORAL, + CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL, } )); } @@ -966,12 +965,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIG_DRIPLEAF_HEAD(), function(BigDripleafHead $block) : Writer{ return Writer::create(Ids::BIG_DRIPLEAF) ->writeLegacyHorizontalFacing($block->getFacing()) - ->writeString(StateNames::BIG_DRIPLEAF_TILT, match($block->getLeafState()->id()){ - DripleafState::STABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_NONE, - DripleafState::UNSTABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_UNSTABLE, - DripleafState::PARTIAL_TILT()->id() => StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT, - DripleafState::FULL_TILT()->id() => StringValues::BIG_DRIPLEAF_TILT_FULL_TILT, - default => throw new BlockStateSerializeException("Invalid Dripleaf tilt type " . $block->getLeafState()->name()) + ->writeString(StateNames::BIG_DRIPLEAF_TILT, match($block->getLeafState()){ + DripleafState::STABLE => StringValues::BIG_DRIPLEAF_TILT_NONE, + DripleafState::UNSTABLE => StringValues::BIG_DRIPLEAF_TILT_UNSTABLE, + DripleafState::PARTIAL_TILT => StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT, + DripleafState::FULL_TILT => StringValues::BIG_DRIPLEAF_TILT_FULL_TILT, }) ->writeBool(StateNames::BIG_DRIPLEAF_HEAD, true); }); @@ -995,9 +993,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BREWING_STAND(), function(BrewingStand $block) : Writer{ return Writer::create(Ids::BREWING_STAND) - ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST())) - ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST())) - ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST())); + ->writeBool(StateNames::BREWING_STAND_SLOT_A_BIT, $block->hasSlot(BrewingStandSlot::EAST)) + ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST)) + ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST)); }); $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); @@ -1184,14 +1182,14 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ $dirtType = $block->getDirtType(); - if($dirtType->equals(DirtType::ROOTED())){ + if($dirtType === DirtType::ROOTED){ return new Writer(Ids::DIRT_WITH_ROOTS); } return Writer::create(Ids::DIRT) ->writeString(StateNames::DIRT_TYPE, match($dirtType){ - DirtType::COARSE() => StringValues::DIRT_TYPE_COARSE, - DirtType::NORMAL() => StringValues::DIRT_TYPE_NORMAL, - default => throw new AssumptionFailedError("Unhandled dirt type " . $dirtType->name()) + DirtType::COARSE => StringValues::DIRT_TYPE_COARSE, + DirtType::NORMAL => StringValues::DIRT_TYPE_NORMAL, + //ROOTED was already checked above }); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); @@ -1229,10 +1227,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::FROGLIGHT(), function(Froglight $block){ return Writer::create(match($block->getFroglightType()){ - FroglightType::OCHRE() => Ids::OCHRE_FROGLIGHT, - FroglightType::PEARLESCENT() => Ids::PEARLESCENT_FROGLIGHT, - FroglightType::VERDANT() => Ids::VERDANT_FROGLIGHT, - default => throw new AssumptionFailedError("Unhandled froglight type " . $block->getFroglightType()->name()) + FroglightType::OCHRE => Ids::OCHRE_FROGLIGHT, + FroglightType::PEARLESCENT => Ids::PEARLESCENT_FROGLIGHT, + FroglightType::VERDANT => Ids::VERDANT_FROGLIGHT, }) ->writePillarAxis($block->getAxis()); }); @@ -1296,16 +1293,15 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::LEVER(), function(Lever $block) : Writer{ return Writer::create(Ids::LEVER) ->writeBool(StateNames::OPEN_BIT, $block->isActivated()) - ->writeString(StateNames::LEVER_DIRECTION, match($block->getFacing()->id()){ - LeverFacing::DOWN_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, - LeverFacing::DOWN_AXIS_X()->id() => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, - LeverFacing::UP_AXIS_Z()->id() => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, - LeverFacing::UP_AXIS_X()->id() => StringValues::LEVER_DIRECTION_UP_EAST_WEST, - LeverFacing::NORTH()->id() => StringValues::LEVER_DIRECTION_NORTH, - LeverFacing::SOUTH()->id() => StringValues::LEVER_DIRECTION_SOUTH, - LeverFacing::WEST()->id() => StringValues::LEVER_DIRECTION_WEST, - LeverFacing::EAST()->id() => StringValues::LEVER_DIRECTION_EAST, - default => throw new BlockStateSerializeException("Invalid Lever facing " . $block->getFacing()->name()), + ->writeString(StateNames::LEVER_DIRECTION, match($block->getFacing()){ + LeverFacing::DOWN_AXIS_Z => StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH, + LeverFacing::DOWN_AXIS_X => StringValues::LEVER_DIRECTION_DOWN_EAST_WEST, + LeverFacing::UP_AXIS_Z => StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH, + LeverFacing::UP_AXIS_X => StringValues::LEVER_DIRECTION_UP_EAST_WEST, + LeverFacing::NORTH => StringValues::LEVER_DIRECTION_NORTH, + LeverFacing::SOUTH => StringValues::LEVER_DIRECTION_SOUTH, + LeverFacing::WEST => StringValues::LEVER_DIRECTION_WEST, + LeverFacing::EAST => StringValues::LEVER_DIRECTION_EAST, }); }); $this->map(Blocks::LIGHT(), function(Light $block) : Writer{ @@ -1606,13 +1602,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::WALL_CORAL_FAN(), function(WallCoralFan $block) : Writer{ $coralType = $block->getCoralType(); - return Writer::create(match($coralType->id()){ - CoralType::TUBE()->id(), CoralType::BRAIN()->id() => Ids::CORAL_FAN_HANG, - CoralType::BUBBLE()->id(), CoralType::FIRE()->id() => Ids::CORAL_FAN_HANG2, - CoralType::HORN()->id() => Ids::CORAL_FAN_HANG3, - default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()), + return Writer::create(match($coralType){ + CoralType::TUBE, CoralType::BRAIN => Ids::CORAL_FAN_HANG, + CoralType::BUBBLE, CoralType::FIRE => Ids::CORAL_FAN_HANG2, + CoralType::HORN => Ids::CORAL_FAN_HANG3, }) - ->writeBool(StateNames::CORAL_HANG_TYPE_BIT, $coralType->equals(CoralType::BRAIN()) || $coralType->equals(CoralType::FIRE())) + ->writeBool(StateNames::CORAL_HANG_TYPE_BIT, $coralType === CoralType::BRAIN || $coralType === CoralType::FIRE) ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralFacing($block->getFacing()); }); diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 09dab0f2c6..42022016e2 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -293,7 +293,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readSlabPosition() : SlabType{ - return $this->readBool(BlockStateNames::TOP_SLOT_BIT) ? SlabType::TOP() : SlabType::BOTTOM(); + return $this->readBool(BlockStateNames::TOP_SLOT_BIT) ? SlabType::TOP : SlabType::BOTTOM; } /** @@ -316,11 +316,11 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readCoralType() : CoralType{ return match($type = $this->readString(BlockStateNames::CORAL_COLOR)){ - StringValues::CORAL_COLOR_BLUE => CoralType::TUBE(), - StringValues::CORAL_COLOR_PINK => CoralType::BRAIN(), - StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE(), - StringValues::CORAL_COLOR_RED => CoralType::FIRE(), - StringValues::CORAL_COLOR_YELLOW => CoralType::HORN(), + StringValues::CORAL_COLOR_BLUE => CoralType::TUBE, + StringValues::CORAL_COLOR_PINK => CoralType::BRAIN, + StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE, + StringValues::CORAL_COLOR_RED => CoralType::FIRE, + StringValues::CORAL_COLOR_YELLOW => CoralType::HORN, default => throw $this->badValueException(BlockStateNames::CORAL_COLOR, $type), }; } @@ -328,10 +328,10 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBellAttachmentType() : BellAttachmentType{ return match($type = $this->readString(BlockStateNames::ATTACHMENT)){ - StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING(), - StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR(), - StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL(), - StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS(), + StringValues::ATTACHMENT_HANGING => BellAttachmentType::CEILING, + StringValues::ATTACHMENT_STANDING => BellAttachmentType::FLOOR, + StringValues::ATTACHMENT_SIDE => BellAttachmentType::ONE_WALL, + StringValues::ATTACHMENT_MULTIPLE => BellAttachmentType::TWO_WALLS, default => throw $this->badValueException(BlockStateNames::ATTACHMENT, $type), }; } @@ -343,8 +343,8 @@ final class BlockStateReader{ //we need to find a better way to auto-generate the constant names when they are reused //for now, using these constants is better than nothing since it still gives static analysability StringValues::WALL_CONNECTION_TYPE_EAST_NONE => null, - StringValues::WALL_CONNECTION_TYPE_EAST_SHORT => WallConnectionType::SHORT(), - StringValues::WALL_CONNECTION_TYPE_EAST_TALL => WallConnectionType::TALL(), + StringValues::WALL_CONNECTION_TYPE_EAST_SHORT => WallConnectionType::SHORT, + StringValues::WALL_CONNECTION_TYPE_EAST_TALL => WallConnectionType::TALL, default => throw $this->badValueException($name, $type), }; } diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 97fa5532fb..08bf11c369 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -54,7 +54,6 @@ use pocketmine\data\bedrock\block\BlockTypeNames as Ids; use pocketmine\data\bedrock\block\convert\BlockStateWriter as Writer; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Facing; -use pocketmine\utils\AssumptionFailedError; final class BlockStateSerializerHelper{ @@ -101,11 +100,10 @@ final class BlockStateSerializerHelper{ public static function selectCopperId(CopperOxidation $oxidation, string $noneId, string $exposedId, string $weatheredId, string $oxidizedId) : string{ return match($oxidation){ - CopperOxidation::NONE() => $noneId, - CopperOxidation::EXPOSED() => $exposedId, - CopperOxidation::WEATHERED() => $weatheredId, - CopperOxidation::OXIDIZED() => $oxidizedId, - default => throw new AssumptionFailedError("Unhandled copper oxidation " . $oxidation->name()) + CopperOxidation::NONE => $noneId, + CopperOxidation::EXPOSED => $exposedId, + CopperOxidation::WEATHERED => $weatheredId, + CopperOxidation::OXIDIZED => $oxidizedId, }; } @@ -210,10 +208,10 @@ final class BlockStateSerializerHelper{ public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ $slabType = $block->getSlabType(); - return BlockStateWriter::create($slabType->equals(SlabType::DOUBLE()) ? $doubleId : $singleId) + return BlockStateWriter::create($slabType === SlabType::DOUBLE ? $doubleId : $singleId) //this is (intentionally) also written for double slabs (as zero) to maintain bug parity with MCPE - ->writeBool(BlockStateNames::TOP_SLOT_BIT, $slabType->equals(SlabType::TOP())); + ->writeBool(BlockStateNames::TOP_SLOT_BIT, $slabType === SlabType::TOP); } public static function encodeStairs(Stair $block, BlockStateWriter $out) : BlockStateWriter{ diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index f6b8699a94..ff6b27a289 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -114,7 +114,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map($singleId, fn(Reader $in) : Slab => $getBlock($in)->setSlabType($in->readSlabPosition())); $this->map($doubleId, function(Reader $in) use ($getBlock) : Slab{ $in->ignored(StateNames::TOP_SLOT_BIT); - return $getBlock($in)->setSlabType(SlabType::DOUBLE()); + return $getBlock($in)->setSlabType(SlabType::DOUBLE); }); } @@ -292,20 +292,20 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ private function registerFlatCoralDeserializers() : void{ foreach([ - Ids::BRAIN_CORAL => CoralType::BRAIN(), - Ids::BUBBLE_CORAL => CoralType::BUBBLE(), - Ids::FIRE_CORAL => CoralType::FIRE(), - Ids::HORN_CORAL => CoralType::HORN(), - Ids::TUBE_CORAL => CoralType::TUBE(), + Ids::BRAIN_CORAL => CoralType::BRAIN, + Ids::BUBBLE_CORAL => CoralType::BUBBLE, + Ids::FIRE_CORAL => CoralType::FIRE, + Ids::HORN_CORAL => CoralType::HORN, + Ids::TUBE_CORAL => CoralType::TUBE, ] as $id => $coralType){ $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(false)); } foreach([ - Ids::DEAD_BRAIN_CORAL => CoralType::BRAIN(), - Ids::DEAD_BUBBLE_CORAL => CoralType::BUBBLE(), - Ids::DEAD_FIRE_CORAL => CoralType::FIRE(), - Ids::DEAD_HORN_CORAL => CoralType::HORN(), - Ids::DEAD_TUBE_CORAL => CoralType::TUBE(), + Ids::DEAD_BRAIN_CORAL => CoralType::BRAIN, + Ids::DEAD_BUBBLE_CORAL => CoralType::BUBBLE, + Ids::DEAD_FIRE_CORAL => CoralType::FIRE, + Ids::DEAD_HORN_CORAL => CoralType::HORN, + Ids::DEAD_TUBE_CORAL => CoralType::TUBE, ] as $id => $coralType){ $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(true)); } @@ -833,10 +833,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::BIG_DRIPLEAF_HEAD() ->setFacing($in->readLegacyHorizontalFacing()) ->setLeafState(match($type = $in->readString(StateNames::BIG_DRIPLEAF_TILT)){ - StringValues::BIG_DRIPLEAF_TILT_NONE => DripleafState::STABLE(), - StringValues::BIG_DRIPLEAF_TILT_UNSTABLE => DripleafState::UNSTABLE(), - StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT => DripleafState::PARTIAL_TILT(), - StringValues::BIG_DRIPLEAF_TILT_FULL_TILT => DripleafState::FULL_TILT(), + StringValues::BIG_DRIPLEAF_TILT_NONE => DripleafState::STABLE, + StringValues::BIG_DRIPLEAF_TILT_UNSTABLE => DripleafState::UNSTABLE, + StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT => DripleafState::PARTIAL_TILT, + StringValues::BIG_DRIPLEAF_TILT_FULL_TILT => DripleafState::FULL_TILT, default => throw $in->badValueException(StateNames::BIG_DRIPLEAF_TILT, $type), }); }else{ @@ -858,9 +858,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::BREWING_STAND, function(Reader $in) : Block{ return Blocks::BREWING_STAND() - ->setSlot(BrewingStandSlot::EAST(), $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT)) - ->setSlot(BrewingStandSlot::SOUTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) - ->setSlot(BrewingStandSlot::NORTHWEST(), $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); + ->setSlot(BrewingStandSlot::EAST, $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT)) + ->setSlot(BrewingStandSlot::SOUTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) + ->setSlot(BrewingStandSlot::NORTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); }); $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); @@ -939,10 +939,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CONCRETE_POWDER() ->setColor($in->readColor()); }); - $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE())); - $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); - $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); - $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); + $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE)); + $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); + $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); + $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ return Blocks::CORAL_BLOCK() ->setCoralType($in->readCoralType()) @@ -953,13 +953,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::CORAL_FAN_DEAD, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) ->setDead(true)); $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN() : CoralType::TUBE())); + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN : CoralType::TUBE)); $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE() : CoralType::BUBBLE())); + ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE : CoralType::BUBBLE)); $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ $in->ignored(StateNames::CORAL_HANG_TYPE_BIT); //the game always writes this, even though it's not used return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType(CoralType::HORN()); + ->setCoralType(CoralType::HORN); }); $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS()); $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) @@ -986,12 +986,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::DIRT, function(Reader $in) : Block{ return Blocks::DIRT() ->setDirtType(match($value = $in->readString(StateNames::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => DirtType::NORMAL(), - StringValues::DIRT_TYPE_COARSE => DirtType::COARSE(), + StringValues::DIRT_TYPE_NORMAL => DirtType::NORMAL, + StringValues::DIRT_TYPE_COARSE => DirtType::COARSE, default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), }); }); - $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); + $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), @@ -1017,10 +1017,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::ENDER_CHEST() ->setFacing($in->readHorizontalFacing()); }); - $this->map(Ids::EXPOSED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::EXPOSED())); - $this->map(Ids::EXPOSED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED())); - $this->mapSlab(Ids::EXPOSED_CUT_COPPER_SLAB, Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED())); - $this->mapStairs(Ids::EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED())); + $this->map(Ids::EXPOSED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::EXPOSED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED)); + $this->mapSlab(Ids::EXPOSED_CUT_COPPER_SLAB, Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED)); + $this->mapStairs(Ids::EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED)); $this->map(Ids::FARMLAND, function(Reader $in) : Block{ return Blocks::FARMLAND() ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7)); @@ -1091,14 +1091,14 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LEVER() ->setActivated($in->readBool(StateNames::OPEN_BIT)) ->setFacing(match($value = $in->readString(StateNames::LEVER_DIRECTION)){ - StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z(), - StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X(), - StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z(), - StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X(), - StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH(), - StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH(), - StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST(), - StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST(), + StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z, + StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X, + StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z, + StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X, + StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH, + StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH, + StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST, + StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST, default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value), }); }); @@ -1170,12 +1170,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); - $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE())->setAxis($in->readPillarAxis())); - $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); - $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); - $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); - $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); - $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT())->setAxis($in->readPillarAxis())); + $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE)->setAxis($in->readPillarAxis())); + $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED)); + $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED)); + $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED)); + $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT)->setAxis($in->readPillarAxis())); $this->map(Ids::PINK_PETALS, function(Reader $in) : Block{ //Pink petals only uses 0-3, but GROWTH state can go up to 7 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); @@ -1493,7 +1493,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::UNPOWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in)); $this->map(Ids::UNPOWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in) ->setPowered(false)); - $this->map(Ids::VERDANT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::VERDANT())->setAxis($in->readPillarAxis())); + $this->map(Ids::VERDANT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::VERDANT)->setAxis($in->readPillarAxis())); $this->map(Ids::VINE, function(Reader $in) : Block{ $vineDirectionFlags = $in->readBoundedInt(StateNames::VINE_DIRECTION_BITS, 0, 15); return Blocks::VINES() @@ -1507,26 +1507,26 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readHorizontalFacing()); }); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); - $this->map(Ids::WAXED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::NONE())); - $this->map(Ids::WAXED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); - $this->mapSlab(Ids::WAXED_CUT_COPPER_SLAB, Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); - $this->mapStairs(Ids::WAXED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); - $this->map(Ids::WAXED_EXPOSED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::EXPOSED())); - $this->map(Ids::WAXED_EXPOSED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED())); - $this->mapSlab(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED())); - $this->mapStairs(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED())); - $this->map(Ids::WAXED_OXIDIZED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED())); - $this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED())); - $this->mapSlab(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED())); - $this->mapStairs(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED())); - $this->map(Ids::WAXED_WEATHERED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::WEATHERED())); - $this->map(Ids::WAXED_WEATHERED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); - $this->mapSlab(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); - $this->mapStairs(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); - $this->map(Ids::WEATHERED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::WEATHERED())); - $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED())); - $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED())); - $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED())); + $this->map(Ids::WAXED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::NONE)); + $this->map(Ids::WAXED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); + $this->mapSlab(Ids::WAXED_CUT_COPPER_SLAB, Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); + $this->mapStairs(Ids::WAXED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); + $this->map(Ids::WAXED_EXPOSED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::WAXED_EXPOSED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED)); + $this->mapSlab(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED)); + $this->mapStairs(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED)); + $this->map(Ids::WAXED_OXIDIZED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED)); + $this->mapSlab(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED)); + $this->mapStairs(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED)); + $this->map(Ids::WAXED_WEATHERED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WAXED_WEATHERED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED)); + $this->mapSlab(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED)); + $this->mapStairs(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED)); + $this->map(Ids::WEATHERED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED)); + $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED)); + $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED)); $this->map(Ids::WEEPING_VINES, function(Reader $in) : Block{ return Blocks::WEEPING_VINES() ->setAge($in->readBoundedInt(StateNames::WEEPING_VINES_AGE, 0, 25)); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 2e2d8daae4..7c7274f2fb 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -246,10 +246,10 @@ final class BlockStateWriter{ /** @return $this */ public function writeSlabPosition(SlabType $slabType) : self{ - $this->writeBool(BlockStateNames::TOP_SLOT_BIT, match($slabType->id()){ - SlabType::TOP()->id() => true, - SlabType::BOTTOM()->id() => false, - default => throw new BlockStateSerializeException("Invalid slab type " . $slabType->name()) + $this->writeBool(BlockStateNames::TOP_SLOT_BIT, match($slabType){ + SlabType::TOP => true, + SlabType::BOTTOM => false, + default => throw new BlockStateSerializeException("Invalid slab type " . $slabType->name) }); return $this; } @@ -270,39 +270,37 @@ final class BlockStateWriter{ /** @return $this */ public function writeLegacyWoodType(WoodType $treeType) : self{ - $this->writeString(BlockStateNames::WOOD_TYPE, match($treeType->id()){ - WoodType::OAK()->id() => StringValues::WOOD_TYPE_OAK, - WoodType::SPRUCE()->id() => StringValues::WOOD_TYPE_SPRUCE, - WoodType::BIRCH()->id() => StringValues::WOOD_TYPE_BIRCH, - WoodType::JUNGLE()->id() => StringValues::WOOD_TYPE_JUNGLE, - WoodType::ACACIA()->id() => StringValues::WOOD_TYPE_ACACIA, - WoodType::DARK_OAK()->id() => StringValues::WOOD_TYPE_DARK_OAK, - default => throw new BlockStateSerializeException("Invalid Wood type " . $treeType->name()) + $this->writeString(BlockStateNames::WOOD_TYPE, match($treeType){ + WoodType::OAK => StringValues::WOOD_TYPE_OAK, + WoodType::SPRUCE => StringValues::WOOD_TYPE_SPRUCE, + WoodType::BIRCH => StringValues::WOOD_TYPE_BIRCH, + WoodType::JUNGLE => StringValues::WOOD_TYPE_JUNGLE, + WoodType::ACACIA => StringValues::WOOD_TYPE_ACACIA, + WoodType::DARK_OAK => StringValues::WOOD_TYPE_DARK_OAK, + default => throw new BlockStateSerializeException("Invalid legacy wood type " . $treeType->name) }); return $this; } /** @return $this */ public function writeCoralType(CoralType $coralType) : self{ - $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType->id()){ - CoralType::TUBE()->id() => StringValues::CORAL_COLOR_BLUE, - CoralType::BRAIN()->id() => StringValues::CORAL_COLOR_PINK, - CoralType::BUBBLE()->id() => StringValues::CORAL_COLOR_PURPLE, - CoralType::FIRE()->id() => StringValues::CORAL_COLOR_RED, - CoralType::HORN()->id() => StringValues::CORAL_COLOR_YELLOW, - default => throw new BlockStateSerializeException("Invalid Coral type " . $coralType->name()) + $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType){ + CoralType::TUBE => StringValues::CORAL_COLOR_BLUE, + CoralType::BRAIN => StringValues::CORAL_COLOR_PINK, + CoralType::BUBBLE => StringValues::CORAL_COLOR_PURPLE, + CoralType::FIRE => StringValues::CORAL_COLOR_RED, + CoralType::HORN => StringValues::CORAL_COLOR_YELLOW, }); return $this; } /** @return $this */ public function writeBellAttachmentType(BellAttachmentType $attachmentType) : self{ - $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType->id()){ - BellAttachmentType::FLOOR()->id() => StringValues::ATTACHMENT_STANDING, - BellAttachmentType::CEILING()->id() => StringValues::ATTACHMENT_HANGING, - BellAttachmentType::ONE_WALL()->id() => StringValues::ATTACHMENT_SIDE, - BellAttachmentType::TWO_WALLS()->id() => StringValues::ATTACHMENT_MULTIPLE, - default => throw new BlockStateSerializeException("Invalid Bell attachment type " . $attachmentType->name()) + $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType){ + BellAttachmentType::FLOOR => StringValues::ATTACHMENT_STANDING, + BellAttachmentType::CEILING => StringValues::ATTACHMENT_HANGING, + BellAttachmentType::ONE_WALL => StringValues::ATTACHMENT_SIDE, + BellAttachmentType::TWO_WALLS => StringValues::ATTACHMENT_MULTIPLE, }); return $this; } @@ -311,9 +309,8 @@ final class BlockStateWriter{ public function writeWallConnectionType(string $name, ?WallConnectionType $wallConnectionType) : self{ $this->writeString($name, match($wallConnectionType){ null => StringValues::WALL_CONNECTION_TYPE_EAST_NONE, - WallConnectionType::SHORT() => StringValues::WALL_CONNECTION_TYPE_EAST_SHORT, - WallConnectionType::TALL() => StringValues::WALL_CONNECTION_TYPE_EAST_TALL, - default => throw new BlockStateSerializeException("Invalid Wall connection type " . $wallConnectionType->name()) + WallConnectionType::SHORT => StringValues::WALL_CONNECTION_TYPE_EAST_SHORT, + WallConnectionType::TALL => StringValues::WALL_CONNECTION_TYPE_EAST_TALL, }); return $this; } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 8b0a4b30cd..1677cea360 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -30,6 +30,7 @@ use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; use function intdiv; +use function spl_object_id; final class RuntimeDataReader implements RuntimeDataDescriber{ use RuntimeEnumDeserializerTrait; @@ -165,8 +166,8 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $type = intdiv($packed, (3 ** $offset)) % 3; if($type !== 0){ $result[$facing] = match($type){ - 1 => WallConnectionType::SHORT(), - 2 => WallConnectionType::TALL(), + 1 => WallConnectionType::SHORT, + 2 => WallConnectionType::TALL, default => throw new AssumptionFailedError("Unreachable") }; } @@ -182,13 +183,9 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ */ public function brewingStandSlots(array &$slots) : void{ $result = []; - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ + foreach(BrewingStandSlot::cases() as $member){ if($this->readBool()){ - $result[$member->id()] = $member; + $result[spl_object_id($member)] = $member; } } diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 87eec2ba84..352e8e1a1c 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -85,7 +85,7 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ } public function brewingStandSlots(array &$slots) : void{ - $this->addBits(count(BrewingStandSlot::getAll())); + $this->addBits(count(BrewingStandSlot::cases())); } public function railShape(int &$railShape) : void{ diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index e302967383..3a5855a25a 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -27,8 +27,8 @@ use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\utils\AssumptionFailedError; use function array_flip; +use function spl_object_id; final class RuntimeDataWriter implements RuntimeDataDescriber{ use RuntimeEnumSerializerTrait; @@ -148,9 +148,8 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ foreach(Facing::HORIZONTAL as $facing){ $packed += match($connections[$facing] ?? null){ null => 0, - WallConnectionType::SHORT() => 1, - WallConnectionType::TALL() => 2, - default => throw new AssumptionFailedError("Unreachable") + WallConnectionType::SHORT => 1, + WallConnectionType::TALL => 2, } * (3 ** $offset); $offset++; } @@ -162,12 +161,8 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ * @phpstan-param array $slots */ public function brewingStandSlots(array &$slots) : void{ - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ - $this->writeBool(isset($slots[$member->id()])); + foreach(BrewingStandSlot::cases() as $member){ + $this->writeBool(isset($slots[spl_object_id($member)])); } } diff --git a/src/item/Armor.php b/src/item/Armor.php index e52732caf6..e9667a8a89 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -150,7 +150,7 @@ class Armor extends Durable{ //if the stack size was bigger than 1 (usually won't happen, but might be caused by plugins) $returnedItems[] = $thisCopy; } - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } protected function deserializeCompoundTag(CompoundTag $tag) : void{ diff --git a/src/item/BoatType.php b/src/item/BoatType.php index 5ef0c9255b..518a1324e7 100644 --- a/src/item/BoatType.php +++ b/src/item/BoatType.php @@ -24,13 +24,11 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\WoodType; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static BoatType ACACIA() * @method static BoatType BIRCH() @@ -40,33 +38,30 @@ use pocketmine\utils\EnumTrait; * @method static BoatType OAK() * @method static BoatType SPRUCE() */ -final class BoatType{ - use EnumTrait { - __construct as Enum___construct; - } +enum BoatType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("oak", WoodType::OAK()), - new self("spruce", WoodType::SPRUCE()), - new self("birch", WoodType::BIRCH()), - new self("jungle", WoodType::JUNGLE()), - new self("acacia", WoodType::ACACIA()), - new self("dark_oak", WoodType::DARK_OAK()), - new self("mangrove", WoodType::MANGROVE()), - ); - } + case OAK; + case SPRUCE; + case BIRCH; + case JUNGLE; + case ACACIA; + case DARK_OAK; + case MANGROVE; - private function __construct( - string $enumName, - private WoodType $woodType, - ){ - $this->Enum___construct($enumName); + public function getWoodType() : WoodType{ + return match($this){ + self::OAK => WoodType::OAK, + self::SPRUCE => WoodType::SPRUCE, + self::BIRCH => WoodType::BIRCH, + self::JUNGLE => WoodType::JUNGLE, + self::ACACIA => WoodType::ACACIA, + self::DARK_OAK => WoodType::DARK_OAK, + self::MANGROVE => WoodType::MANGROVE, + }; } - public function getWoodType() : WoodType{ return $this->woodType; } - public function getDisplayName() : string{ - return $this->woodType->getDisplayName(); + return $this->getWoodType()->getDisplayName(); } } diff --git a/src/item/Bow.php b/src/item/Bow.php index 3c1320f037..1b25312a8e 100644 --- a/src/item/Bow.php +++ b/src/item/Bow.php @@ -53,7 +53,7 @@ class Bow extends Tool implements Releasable{ }; if($player->hasFiniteResources() && $inventory === null){ - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } $location = $player->getLocation(); @@ -95,7 +95,7 @@ class Bow extends Tool implements Releasable{ if($ev->isCancelled()){ $entity->flagForDespawn(); - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } $entity->setMotion($entity->getMotion()->multiply($ev->getForce())); @@ -105,7 +105,7 @@ class Bow extends Tool implements Releasable{ $projectileEv->call(); if($projectileEv->isCancelled()){ $ev->getProjectile()->flagForDespawn(); - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } $ev->getProjectile()->spawnToAll(); @@ -121,7 +121,7 @@ class Bow extends Tool implements Releasable{ $this->applyDamage(1); } - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } public function canStartUsingItem(Player $player) : bool{ diff --git a/src/item/Bucket.php b/src/item/Bucket.php index b788a30226..ee69a0a8a5 100644 --- a/src/item/Bucket.php +++ b/src/item/Bucket.php @@ -49,7 +49,7 @@ class Bucket extends Item{ default => null }; if($resultItem === null){ - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } $ev = new PlayerBucketFillEvent($player, $blockReplace, $face, $this, $resultItem); @@ -60,12 +60,12 @@ class Bucket extends Item{ $this->pop(); $returnedItems[] = $ev->getItem(); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } } diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index 294eb6d6e2..7fdfc9114b 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; -use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -37,7 +36,6 @@ final class CoralFan extends Item{ } public function __construct(ItemIdentifier $identifier){ - $this->coralType = CoralType::TUBE(); parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } diff --git a/src/item/FireCharge.php b/src/item/FireCharge.php index 20e7e4f89e..a612e0897d 100644 --- a/src/item/FireCharge.php +++ b/src/item/FireCharge.php @@ -40,9 +40,9 @@ class FireCharge extends Item{ $this->pop(); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } } diff --git a/src/item/FlintSteel.php b/src/item/FlintSteel.php index 0ff2e754cd..3e694eb0db 100644 --- a/src/item/FlintSteel.php +++ b/src/item/FlintSteel.php @@ -40,10 +40,10 @@ class FlintSteel extends Tool{ $this->applyDamage(1); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } public function getMaxDurability() : int{ diff --git a/src/item/GlassBottle.php b/src/item/GlassBottle.php index bda6d132eb..135ba32335 100644 --- a/src/item/GlassBottle.php +++ b/src/item/GlassBottle.php @@ -35,9 +35,9 @@ class GlassBottle extends Item{ $this->pop(); $returnedItems[] = VanillaItems::POTION()->setType(PotionType::WATER()); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } } diff --git a/src/item/Item.php b/src/item/Item.php index 775a82d756..1a74345b55 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -588,7 +588,7 @@ class Item implements \JsonSerializable{ * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } /** @@ -598,7 +598,7 @@ class Item implements \JsonSerializable{ * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ public function onClickAir(Player $player, Vector3 $directionVector, array &$returnedItems) : ItemUseResult{ - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } /** @@ -608,7 +608,7 @@ class Item implements \JsonSerializable{ * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) */ public function onReleaseUsing(Player $player, array &$returnedItems) : ItemUseResult{ - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } /** diff --git a/src/item/ItemUseResult.php b/src/item/ItemUseResult.php index ff78b94e43..e3fbe10fb4 100644 --- a/src/item/ItemUseResult.php +++ b/src/item/ItemUseResult.php @@ -23,26 +23,20 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static ItemUseResult FAIL() * @method static ItemUseResult NONE() * @method static ItemUseResult SUCCESS() */ -final class ItemUseResult{ - use EnumTrait; +enum ItemUseResult{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("none"), - new self("fail"), - new self("success") - ); - } + case NONE; + case FAIL; + case SUCCESS; } diff --git a/src/item/LiquidBucket.php b/src/item/LiquidBucket.php index 740f79b116..eb2cb18ed9 100644 --- a/src/item/LiquidBucket.php +++ b/src/item/LiquidBucket.php @@ -56,7 +56,7 @@ class LiquidBucket extends Item{ public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if(!$blockReplace->canBeReplaced()){ - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } //TODO: move this to generic placement logic @@ -70,10 +70,10 @@ class LiquidBucket extends Item{ $this->pop(); $returnedItems[] = $ev->getItem(); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } public function getLiquid() : Liquid{ diff --git a/src/item/PaintingItem.php b/src/item/PaintingItem.php index f3821d0b26..a83c8dba8f 100644 --- a/src/item/PaintingItem.php +++ b/src/item/PaintingItem.php @@ -39,7 +39,7 @@ class PaintingItem extends Item{ public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if(Facing::axis($face) === Axis::Y){ - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } $motives = []; @@ -67,7 +67,7 @@ class PaintingItem extends Item{ } if(count($motives) === 0){ //No space available - return ItemUseResult::NONE(); + return ItemUseResult::NONE; } /** @var PaintingMotive $motive */ @@ -81,6 +81,6 @@ class PaintingItem extends Item{ $entity->spawnToAll(); $player->getWorld()->addSound($replacePos->add(0.5, 0.5, 0.5), new PaintingPlaceSound()); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } } diff --git a/src/item/ProjectileItem.php b/src/item/ProjectileItem.php index 8056af505a..47c4583e04 100644 --- a/src/item/ProjectileItem.php +++ b/src/item/ProjectileItem.php @@ -46,7 +46,7 @@ abstract class ProjectileItem extends Item{ $projectileEv->call(); if($projectileEv->isCancelled()){ $projectile->flagForDespawn(); - return ItemUseResult::FAIL(); + return ItemUseResult::FAIL; } $projectile->spawnToAll(); @@ -55,6 +55,6 @@ abstract class ProjectileItem extends Item{ $this->pop(); - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } } diff --git a/src/item/SpawnEgg.php b/src/item/SpawnEgg.php index 1147a951dd..51dcceebd2 100644 --- a/src/item/SpawnEgg.php +++ b/src/item/SpawnEgg.php @@ -43,6 +43,6 @@ abstract class SpawnEgg extends Item{ $this->pop(); $entity->spawnToAll(); //TODO: what if the entity was marked for deletion? - return ItemUseResult::SUCCESS(); + return ItemUseResult::SUCCESS; } } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d482e4bef9..296dd03415 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -37,6 +37,7 @@ use pocketmine\item\VanillaItems as Items; use pocketmine\utils\SingletonTrait; use pocketmine\utils\StringToTParser; use function array_keys; +use function strtolower; /** * Handles parsing items from strings. This is used to interpret names from the /give command (and others). @@ -77,8 +78,8 @@ final class StringToItemParser extends StringToTParser{ $register("shulker_box", fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); } - foreach(CoralType::getAll() as $coralType){ - $register = fn(string $name, \Closure $callback) => $result->registerBlock($coralType->name() . "_" . $name, $callback); + foreach(CoralType::cases() as $coralType){ + $register = fn(string $name, \Closure $callback) => $result->registerBlock(strtolower($coralType->name) . "_" . $name, $callback); $register("coral", fn() => Blocks::CORAL()->setCoralType($coralType)); $register("coral_block", fn() => Blocks::CORAL_BLOCK()->setCoralType($coralType)); //wall and floor coral fans are the same item @@ -90,8 +91,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("light_block_$i", fn() => Blocks::LIGHT()->setLightLevel($i)); } - foreach(CopperOxidation::getAll() as $oxidation){ - $oxPrefix = $oxidation->equals(CopperOxidation::NONE()) ? "" : $oxidation->name() . "_"; + foreach(CopperOxidation::cases() as $oxidation){ + $oxPrefix = $oxidation === CopperOxidation::NONE ? "" : strtolower($oxidation->name) . "_"; foreach(["" => false, "waxed_" => true] as $waxedPrefix => $waxed){ $register = fn(string $name, \Closure $callback) => $result->registerBlock($waxedPrefix . $oxPrefix . $name, $callback); @@ -102,8 +103,8 @@ final class StringToItemParser extends StringToTParser{ } } - foreach(FroglightType::getAll() as $froglightType){ - $result->registerBlock($froglightType->name() . "_froglight", fn() => Blocks::FROGLIGHT()->setFroglightType($froglightType)); + foreach(FroglightType::cases() as $froglightType){ + $result->registerBlock(strtolower($froglightType->name) . "_froglight", fn() => Blocks::FROGLIGHT()->setFroglightType($froglightType)); } } @@ -238,7 +239,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("clay_block", fn() => Blocks::CLAY()); $result->registerBlock("coal_block", fn() => Blocks::COAL()); $result->registerBlock("coal_ore", fn() => Blocks::COAL_ORE()); - $result->registerBlock("coarse_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE())); + $result->registerBlock("coarse_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE)); $result->registerBlock("cobble", fn() => Blocks::COBBLESTONE()); $result->registerBlock("cobble_stairs", fn() => Blocks::COBBLESTONE_STAIRS()); $result->registerBlock("cobble_wall", fn() => Blocks::COBBLESTONE_WALL()); @@ -267,10 +268,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("coral", fn() => Blocks::CORAL()); $result->registerBlock("coral_block", fn() => Blocks::CORAL_BLOCK()); $result->registerBlock("coral_fan", fn() => Blocks::CORAL_FAN()); - $result->registerBlock("coral_fan_dead", fn() => Blocks::CORAL_FAN()->setCoralType(CoralType::TUBE())->setDead(true)); + $result->registerBlock("coral_fan_dead", fn() => Blocks::CORAL_FAN()->setCoralType(CoralType::TUBE)->setDead(true)); $result->registerBlock("coral_fan_hang", fn() => Blocks::WALL_CORAL_FAN()); - $result->registerBlock("coral_fan_hang2", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::BUBBLE())); - $result->registerBlock("coral_fan_hang3", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::HORN())); + $result->registerBlock("coral_fan_hang2", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::BUBBLE)); + $result->registerBlock("coral_fan_hang3", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::HORN)); $result->registerBlock("cornflower", fn() => Blocks::CORNFLOWER()); $result->registerBlock("cracked_deepslate_bricks", fn() => Blocks::CRACKED_DEEPSLATE_BRICKS()); $result->registerBlock("cracked_deepslate_tiles", fn() => Blocks::CRACKED_DEEPSLATE_TILES()); @@ -278,7 +279,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS()); $result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE()); - $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::CREEPER())); + $result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::CREEPER)); $result->registerBlock("crimson_button", fn() => Blocks::CRIMSON_BUTTON()); $result->registerBlock("crimson_door", fn() => Blocks::CRIMSON_DOOR()); $result->registerBlock("crimson_fence", fn() => Blocks::CRIMSON_FENCE()); @@ -353,24 +354,24 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("diorite_slab", fn() => Blocks::DIORITE_SLAB()); $result->registerBlock("diorite_stairs", fn() => Blocks::DIORITE_STAIRS()); $result->registerBlock("diorite_wall", fn() => Blocks::DIORITE_WALL()); - $result->registerBlock("dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL())); - $result->registerBlock("dirt_with_roots", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); + $result->registerBlock("dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL)); + $result->registerBlock("dirt_with_roots", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); $result->registerBlock("door_block", fn() => Blocks::OAK_DOOR()); $result->registerBlock("double_plant", fn() => Blocks::SUNFLOWER()); - $result->registerBlock("double_red_sandstone_slab", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_slabs", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_stone_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_stone_slab2", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_stone_slab3", fn() => Blocks::END_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_stone_slab4", fn() => Blocks::MOSSY_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE())); + $result->registerBlock("double_red_sandstone_slab", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_slabs", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_stone_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_stone_slab2", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_stone_slab3", fn() => Blocks::END_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_stone_slab4", fn() => Blocks::MOSSY_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE)); $result->registerBlock("double_tallgrass", fn() => Blocks::DOUBLE_TALLGRASS()); - $result->registerBlock("double_wood_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_wood_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_wooden_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); - $result->registerBlock("double_wooden_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE())); + $result->registerBlock("double_wood_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_wood_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_wooden_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE)); + $result->registerBlock("double_wooden_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE)); $result->registerBlock("dragon_egg", fn() => Blocks::DRAGON_EGG()); - $result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::DRAGON())); + $result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::DRAGON)); $result->registerBlock("dried_kelp_block", fn() => Blocks::DRIED_KELP()); $result->registerBlock("dyed_shulker_box", fn() => Blocks::DYED_SHULKER_BOX()); $result->registerBlock("element_0", fn() => Blocks::ELEMENT_ZERO()); @@ -858,10 +859,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("peony", fn() => Blocks::PEONY()); $result->registerBlock("pink_petals", fn() => Blocks::PINK_PETALS()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); - $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN())); + $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN)); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); - $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER())); + $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER)); $result->registerBlock("podzol", fn() => Blocks::PODZOL()); $result->registerBlock("polished_andesite", fn() => Blocks::POLISHED_ANDESITE()); $result->registerBlock("polished_andesite_slab", fn() => Blocks::POLISHED_ANDESITE_SLAB()); @@ -950,7 +951,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("repeater", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("repeater_block", fn() => Blocks::REDSTONE_REPEATER()); $result->registerBlock("reserved6", fn() => Blocks::RESERVED6()); - $result->registerBlock("rooted_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED())); + $result->registerBlock("rooted_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); $result->registerBlock("rose", fn() => Blocks::POPPY()); $result->registerBlock("rose_bush", fn() => Blocks::ROSE_BUSH()); $result->registerBlock("sand", fn() => Blocks::SAND()); @@ -967,8 +968,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX()); $result->registerBlock("sign", fn() => Blocks::OAK_SIGN()); $result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN()); - $result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON())); - $result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON())); + $result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON)); + $result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON)); $result->registerBlock("skull_block", fn() => Blocks::MOB_HEAD()); $result->registerBlock("slab", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); @@ -1119,7 +1120,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wheat_block", fn() => Blocks::WHEAT()); $result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP()); $result->registerBlock("wither_rose", fn() => Blocks::WITHER_ROSE()); - $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::WITHER_SKELETON())); + $result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::WITHER_SKELETON)); $result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false)); $result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("wood_door_block", fn() => Blocks::OAK_DOOR()); @@ -1139,7 +1140,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("wool", fn() => Blocks::WOOL()); $result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE()); $result->registerBlock("yellow_flower", fn() => Blocks::DANDELION()); - $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::ZOMBIE())); + $result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::ZOMBIE)); } private static function registerDynamicItems(self $result) : void{ diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index a5d50c9db3..d76452f973 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -36,9 +36,9 @@ use pocketmine\item\ItemIdentifier as IID; use pocketmine\item\ItemTypeIds as Ids; use pocketmine\item\VanillaArmorMaterials as ArmorMaterials; use pocketmine\math\Vector3; -use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\CloningRegistryTrait; use pocketmine\world\World; +use function strtolower; /** * This doc-block is generated automatically, do not modify it manually. @@ -546,17 +546,16 @@ final class VanillaItems{ self::register("writable_book", new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); self::register("written_book", new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); - foreach(BoatType::getAll() as $type){ + foreach(BoatType::cases() as $type){ //boat type is static, because different types of wood may have different properties - self::register($type->name() . "_boat", new Boat(new IID(match($type){ - BoatType::OAK() => Ids::OAK_BOAT, - BoatType::SPRUCE() => Ids::SPRUCE_BOAT, - BoatType::BIRCH() => Ids::BIRCH_BOAT, - BoatType::JUNGLE() => Ids::JUNGLE_BOAT, - BoatType::ACACIA() => Ids::ACACIA_BOAT, - BoatType::DARK_OAK() => Ids::DARK_OAK_BOAT, - BoatType::MANGROVE() => Ids::MANGROVE_BOAT, - default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) + self::register(strtolower($type->name) . "_boat", new Boat(new IID(match($type){ + BoatType::OAK => Ids::OAK_BOAT, + BoatType::SPRUCE => Ids::SPRUCE_BOAT, + BoatType::BIRCH => Ids::BIRCH_BOAT, + BoatType::JUNGLE => Ids::JUNGLE_BOAT, + BoatType::ACACIA => Ids::ACACIA_BOAT, + BoatType::DARK_OAK => Ids::DARK_OAK_BOAT, + BoatType::MANGROVE => Ids::MANGROVE_BOAT, }), $type->getDisplayName() . " Boat", $type)); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 5b65ca1b5f..d0a4c000a3 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1069,7 +1069,7 @@ class NetworkSession{ $this->logger->debug("Tried to send no-longer-active chunk $chunkX $chunkZ in world " . $world->getFolderName()); return; } - if(!$status->equals(UsedChunkStatus::REQUESTED_SENDING())){ + if($status !== UsedChunkStatus::REQUESTED_SENDING){ //TODO: make this an error //this could be triggered due to the shitty way that chunk resends are handled //right now - not because of the spammy re-requesting, but because the chunk status reverts diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index aa70c7d35c..0b18cd53d7 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -81,12 +81,11 @@ final class CraftingDataCache{ foreach($manager->getCraftingRecipeIndex() as $index => $recipe){ if($recipe instanceof ShapelessRecipe){ - $typeTag = match($recipe->getType()->id()){ - ShapelessRecipeType::CRAFTING()->id() => CraftingRecipeBlockName::CRAFTING_TABLE, - ShapelessRecipeType::STONECUTTER()->id() => CraftingRecipeBlockName::STONECUTTER, - ShapelessRecipeType::CARTOGRAPHY()->id() => CraftingRecipeBlockName::CARTOGRAPHY_TABLE, - ShapelessRecipeType::SMITHING()->id() => CraftingRecipeBlockName::SMITHING_TABLE, - default => throw new AssumptionFailedError("Unreachable"), + $typeTag = match($recipe->getType()){ + ShapelessRecipeType::CRAFTING => CraftingRecipeBlockName::CRAFTING_TABLE, + ShapelessRecipeType::STONECUTTER => CraftingRecipeBlockName::STONECUTTER, + ShapelessRecipeType::CARTOGRAPHY => CraftingRecipeBlockName::CARTOGRAPHY_TABLE, + ShapelessRecipeType::SMITHING => CraftingRecipeBlockName::SMITHING_TABLE, }; $recipesWithTypeIds[] = new ProtocolShapelessRecipe( CraftingDataPacket::ENTRY_SHAPELESS, diff --git a/src/player/Player.php b/src/player/Player.php index 2059613ad0..06d1c31035 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -331,7 +331,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $zSpawnChunk = $spawnLocation->getFloorZ() >> Chunk::COORD_BIT_SIZE; $world->registerChunkLoader($this->chunkLoader, $xSpawnChunk, $zSpawnChunk, true); $world->registerChunkListener($this, $xSpawnChunk, $zSpawnChunk); - $this->usedChunks[World::chunkHash($xSpawnChunk, $zSpawnChunk)] = UsedChunkStatus::NEEDED(); + $this->usedChunks[World::chunkHash($xSpawnChunk, $zSpawnChunk)] = UsedChunkStatus::NEEDED; parent::__construct($spawnLocation, $this->playerInfo->getSkin(), $namedtag); } @@ -768,7 +768,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected function spawnEntitiesOnAllChunks() : void{ foreach($this->usedChunks as $chunkHash => $status){ - if($status->equals(UsedChunkStatus::SENT())){ + if($status === UsedChunkStatus::SENT){ World::getXZ($chunkHash, $chunkX, $chunkZ); $this->spawnEntitiesOnChunk($chunkX, $chunkZ); } @@ -810,7 +810,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ ++$count; - $this->usedChunks[$index] = UsedChunkStatus::REQUESTED_GENERATION(); + $this->usedChunks[$index] = UsedChunkStatus::REQUESTED_GENERATION; $this->activeChunkGenerationRequests[$index] = true; unset($this->loadQueue[$index]); $this->getWorld()->registerChunkLoader($this->chunkLoader, $X, $Z, true); @@ -824,17 +824,17 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if(!$this->isConnected() || !isset($this->usedChunks[$index]) || $world !== $this->getWorld()){ return; } - if(!$this->usedChunks[$index]->equals(UsedChunkStatus::REQUESTED_GENERATION())){ + if($this->usedChunks[$index] !== UsedChunkStatus::REQUESTED_GENERATION){ //We may have previously requested this, decided we didn't want it, and then decided we did want //it again, all before the generation request got executed. In that case, the promise would have //multiple callbacks for this player. In that case, only the first one matters. return; } unset($this->activeChunkGenerationRequests[$index]); - $this->usedChunks[$index] = UsedChunkStatus::REQUESTED_SENDING(); + $this->usedChunks[$index] = UsedChunkStatus::REQUESTED_SENDING; $this->getNetworkSession()->startUsingChunk($X, $Z, function() use ($X, $Z, $index) : void{ - $this->usedChunks[$index] = UsedChunkStatus::SENT(); + $this->usedChunks[$index] = UsedChunkStatus::SENT; if($this->spawnChunkLoadCount === -1){ $this->spawnEntitiesOnChunk($X, $Z); }elseif($this->spawnChunkLoadCount++ === $this->spawnThreshold){ @@ -951,7 +951,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->location->getFloorX() >> Chunk::COORD_BIT_SIZE, $this->location->getFloorZ() >> Chunk::COORD_BIT_SIZE ) as $radius => $hash){ - if(!isset($this->usedChunks[$hash]) || $this->usedChunks[$hash]->equals(UsedChunkStatus::NEEDED())){ + if(!isset($this->usedChunks[$hash]) || $this->usedChunks[$hash] === UsedChunkStatus::NEEDED){ $newOrder[$hash] = true; } if($radius < $tickingChunkRadius){ @@ -1005,7 +1005,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasReceivedChunk(int $chunkX, int $chunkZ) : bool{ $status = $this->usedChunks[World::chunkHash($chunkX, $chunkZ)] ?? null; - return $status !== null && $status->equals(UsedChunkStatus::SENT()); + return $status === UsedChunkStatus::SENT; } /** @@ -1612,7 +1612,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $returnedItems = []; $result = $item->onClickAir($this, $directionVector, $returnedItems); - if($result->equals(ItemUseResult::FAIL())){ + if($result === ItemUseResult::FAIL){ return false; } @@ -1672,7 +1672,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $returnedItems = []; $result = $item->onReleaseUsing($this, $returnedItems); - if($result->equals(ItemUseResult::SUCCESS())){ + if($result === ItemUseResult::SUCCESS){ $this->resetItemCooldown($item); $this->returnItemsFromAction($oldItem, $item, $returnedItems); return true; @@ -2694,8 +2694,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function onChunkChanged(int $chunkX, int $chunkZ, Chunk $chunk) : void{ $status = $this->usedChunks[$hash = World::chunkHash($chunkX, $chunkZ)] ?? null; - if($status !== null && $status->equals(UsedChunkStatus::SENT())){ - $this->usedChunks[$hash] = UsedChunkStatus::NEEDED(); + if($status === UsedChunkStatus::SENT){ + $this->usedChunks[$hash] = UsedChunkStatus::NEEDED; $this->nextChunkOrderRun = 0; } } diff --git a/src/player/UsedChunkStatus.php b/src/player/UsedChunkStatus.php index 69e249a24d..dda41fe7e7 100644 --- a/src/player/UsedChunkStatus.php +++ b/src/player/UsedChunkStatus.php @@ -23,28 +23,22 @@ declare(strict_types=1); namespace pocketmine\player; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static UsedChunkStatus NEEDED() * @method static UsedChunkStatus REQUESTED_GENERATION() * @method static UsedChunkStatus REQUESTED_SENDING() * @method static UsedChunkStatus SENT() */ -final class UsedChunkStatus{ - use EnumTrait; +enum UsedChunkStatus{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("NEEDED"), - new self("REQUESTED_GENERATION"), - new self("REQUESTED_SENDING"), - new self("SENT") - ); - } + case NEEDED; + case REQUESTED_GENERATION; + case REQUESTED_SENDING; + case SENT; } diff --git a/src/utils/EnumTrait.php b/src/utils/EnumTrait.php index ba0a4fcf24..ee1bd4e350 100644 --- a/src/utils/EnumTrait.php +++ b/src/utils/EnumTrait.php @@ -29,6 +29,9 @@ namespace pocketmine\utils; * * Classes using this trait need to include \@method tags in their class docblock for every enum member. * Alternatively, just put \@generate-registry-docblock in the docblock and run tools/generate-registry-annotations.php + * + * @deprecated Use native PHP 8.1 enums instead. Use {@link LegacyEnumShimTrait} if you need to provide backwards + * compatible EnumTrait-like API for migrated enums. */ trait EnumTrait{ use RegistryTrait; diff --git a/src/utils/LegacyEnumShimTrait.php b/src/utils/LegacyEnumShimTrait.php new file mode 100644 index 0000000000..4bb3587ab9 --- /dev/null +++ b/src/utils/LegacyEnumShimTrait.php @@ -0,0 +1,92 @@ + 0){ + throw new \ArgumentCountError("Expected exactly 0 arguments, " . count($arguments) . " passed"); + } + return self::getAll()[mb_strtoupper($name)]; + } + + /** + * Returns a list of all cases, indexed by name. + * + * @return self[] + * @phpstan-return array + */ + public static function getAll() : array{ + /** @var array|null $result */ + static $result = null; + if($result === null){ + $result = []; + foreach(self::cases() as $case){ + $result[mb_strtoupper($case->name)] = $case; + } + } + return $result; + } + + /** + * Shim for {@link \UnitEnum::name}. + * + * @deprecated Use the native enum's name property instead. + */ + public function name() : string{ + return $this->name; + } + + /** + * Alias of spl_object_id($this). + * + * @deprecated + */ + public function id() : int{ + return spl_object_id($this); + } + + /** + * Returns whether the two objects are equivalent. + * + * @deprecated Native enums can be safely compared with ===. + */ + public function equals(self $other) : bool{ + return $this === $other; + } +} diff --git a/src/world/World.php b/src/world/World.php index 903cc60e2b..2ff2b5b2ea 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2127,8 +2127,8 @@ class World implements ChunkManager{ } $result = $item->onInteractBlock($player, $blockReplace, $blockClicked, $face, $clickVector, $returnedItems); - if(!$result->equals(ItemUseResult::NONE())){ - return $result->equals(ItemUseResult::SUCCESS()); + if($result !== ItemUseResult::NONE){ + return $result === ItemUseResult::SUCCESS; } }else{ return false; diff --git a/src/world/biome/BiomeRegistry.php b/src/world/biome/BiomeRegistry.php index 6481842095..1af60fcd59 100644 --- a/src/world/biome/BiomeRegistry.php +++ b/src/world/biome/BiomeRegistry.php @@ -54,7 +54,7 @@ final class BiomeRegistry{ $this->register(BiomeIds::EXTREME_HILLS_EDGE, new SmallMountainsBiome()); - $this->register(BiomeIds::BIRCH_FOREST, new ForestBiome(TreeType::BIRCH())); + $this->register(BiomeIds::BIRCH_FOREST, new ForestBiome(TreeType::BIRCH)); } public function register(int $id, Biome $biome) : void{ diff --git a/src/world/biome/ForestBiome.php b/src/world/biome/ForestBiome.php index 8f80cb474a..94d3e567cc 100644 --- a/src/world/biome/ForestBiome.php +++ b/src/world/biome/ForestBiome.php @@ -33,7 +33,7 @@ class ForestBiome extends GrassyBiome{ public function __construct(?TreeType $type = null){ parent::__construct(); - $this->type = $type ?? TreeType::OAK(); + $this->type = $type ?? TreeType::OAK; $trees = new Tree($type); $trees->setBaseAmount(5); @@ -46,7 +46,7 @@ class ForestBiome extends GrassyBiome{ $this->setElevation(63, 81); - if($this->type->equals(TreeType::BIRCH())){ + if($this->type === TreeType::BIRCH){ $this->temperature = 0.6; $this->rainfall = 0.5; }else{ diff --git a/src/world/biome/TaigaBiome.php b/src/world/biome/TaigaBiome.php index cd68c97486..979ca66ec2 100644 --- a/src/world/biome/TaigaBiome.php +++ b/src/world/biome/TaigaBiome.php @@ -32,7 +32,7 @@ class TaigaBiome extends SnowyBiome{ public function __construct(){ parent::__construct(); - $trees = new Tree(TreeType::SPRUCE()); + $trees = new Tree(TreeType::SPRUCE); $trees->setBaseAmount(10); $this->addPopulator($trees); diff --git a/src/world/generator/object/TreeFactory.php b/src/world/generator/object/TreeFactory.php index 1d95a77b19..d1f3dbebb3 100644 --- a/src/world/generator/object/TreeFactory.php +++ b/src/world/generator/object/TreeFactory.php @@ -31,27 +31,13 @@ final class TreeFactory{ * @param TreeType|null $type default oak */ public static function get(Random $random, ?TreeType $type = null) : ?Tree{ - $type = $type ?? TreeType::OAK(); - if($type->equals(TreeType::SPRUCE())){ - return new SpruceTree(); - }elseif($type->equals(TreeType::BIRCH())){ - if($random->nextBoundedInt(39) === 0){ - return new BirchTree(true); - }else{ - return new BirchTree(); - } - }elseif($type->equals(TreeType::JUNGLE())){ - return new JungleTree(); - }elseif($type->equals(TreeType::OAK())){ //default - return new OakTree(); - /*if($random->nextRange(0, 9) === 0){ - $tree = new BigTree(); - }else{*/ - - //} - }elseif($type->equals(TreeType::ACACIA())){ - return new AcaciaTree(); - } - return null; + return match($type){ + null, TreeType::OAK => new OakTree(), //TODO: big oak has a 1/10 chance + TreeType::SPRUCE => new SpruceTree(), + TreeType::JUNGLE => new JungleTree(), + TreeType::ACACIA => new AcaciaTree(), + TreeType::BIRCH => new BirchTree($random->nextBoundedInt(39) === 0), + default => null, + }; } } diff --git a/src/world/generator/object/TreeType.php b/src/world/generator/object/TreeType.php index 1e8bf56e9a..d4d62946a5 100644 --- a/src/world/generator/object/TreeType.php +++ b/src/world/generator/object/TreeType.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\world\generator\object; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static TreeType ACACIA() * @method static TreeType BIRCH() @@ -38,34 +36,27 @@ use pocketmine\utils\EnumTrait; * @method static TreeType OAK() * @method static TreeType SPRUCE() */ -final class TreeType{ - use EnumTrait { - register as Enum_register; - __construct as Enum___construct; - } +enum TreeType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new TreeType("oak", "Oak"), - new TreeType("spruce", "Spruce"), - new TreeType("birch", "Birch"), - new TreeType("jungle", "Jungle"), - new TreeType("acacia", "Acacia"), - new TreeType("dark_oak", "Dark Oak"), - //TODO: cherry blossom, mangrove, azalea - //TODO: do crimson and warped "trees" belong here? I'm not sure if they're actually trees or just fungi - //TODO: perhaps huge mushrooms should be here too??? - ); - } - - private function __construct( - string $enumName, - private string $displayName - ){ - $this->Enum___construct($enumName); - } + case OAK; + case SPRUCE; + case BIRCH; + case JUNGLE; + case ACACIA; + case DARK_OAK; + //TODO: cherry blossom, mangrove, azalea + //TODO: do crimson and warped "trees" belong here? I'm not sure if they're actually trees or just fungi + //TODO: perhaps huge mushrooms should be here too??? public function getDisplayName() : string{ - return $this->displayName; + return match($this){ + self::OAK => "Oak", + self::SPRUCE => "Spruce", + self::BIRCH => "Birch", + self::JUNGLE => "Jungle", + self::ACACIA => "Acacia", + self::DARK_OAK => "Dark Oak", + }; } } diff --git a/src/world/generator/populator/Tree.php b/src/world/generator/populator/Tree.php index 3e5aef0a77..e470c46f0b 100644 --- a/src/world/generator/populator/Tree.php +++ b/src/world/generator/populator/Tree.php @@ -40,7 +40,7 @@ class Tree implements Populator{ * @param TreeType|null $type default oak */ public function __construct(?TreeType $type = null){ - $this->type = $type ?? TreeType::OAK(); + $this->type = $type ?? TreeType::OAK; } public function setRandomAmount(int $amount) : void{ diff --git a/src/world/sound/NoteInstrument.php b/src/world/sound/NoteInstrument.php index 87e5d496d9..a91d52cf70 100644 --- a/src/world/sound/NoteInstrument.php +++ b/src/world/sound/NoteInstrument.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace pocketmine\world\sound; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static NoteInstrument BANJO() * @method static NoteInstrument BASS_DRUM() @@ -48,27 +46,23 @@ use pocketmine\utils\EnumTrait; * @method static NoteInstrument SNARE() * @method static NoteInstrument XYLOPHONE() */ -final class NoteInstrument{ - use EnumTrait; +enum NoteInstrument{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("piano"), - new self("bass_drum"), - new self("snare"), - new self("clicks_and_sticks"), - new self("double_bass"), - new self("bell"), - new self("flute"), - new self("chime"), - new self("guitar"), - new self("xylophone"), - new self("iron_xylophone"), - new self("cow_bell"), - new self("didgeridoo"), - new self("bit"), - new self("banjo"), - new self("pling") - ); - } + case PIANO; + case BASS_DRUM; + case SNARE; + case CLICKS_AND_STICKS; + case DOUBLE_BASS; + case BELL; + case FLUTE; + case CHIME; + case GUITAR; + case XYLOPHONE; + case IRON_XYLOPHONE; + case COW_BELL; + case DIDGERIDOO; + case BIT; + case BANJO; + case PLING; } From 94d98fb5c4d190b80d968a746cb8e16ac2a13be1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 19:32:45 +0100 Subject: [PATCH 1369/1858] Migrate all but two remaining legacy enums to native PHP 8.1 enums --- src/block/BaseBanner.php | 5 - src/block/BaseSign.php | 8 +- src/block/Bed.php | 7 +- src/block/CakeWithDyedCandle.php | 2 +- src/block/Carpet.php | 5 - src/block/Cauldron.php | 2 +- src/block/Concrete.php | 5 - src/block/ConcretePowder.php | 5 - src/block/Dirt.php | 2 +- src/block/DyedCandle.php | 7 +- src/block/DyedShulkerBox.php | 5 - src/block/GlazedTerracotta.php | 5 - src/block/StainedGlass.php | 5 - src/block/StainedGlassPane.php | 5 - src/block/StainedHardenedClay.php | 5 - src/block/StainedHardenedGlass.php | 5 - src/block/StainedHardenedGlassPane.php | 5 - src/block/VanillaBlocks.php | 176 +++++----- src/block/WaterCauldron.php | 12 +- src/block/Wool.php | 5 - src/block/tile/Banner.php | 11 +- src/block/tile/Bed.php | 9 +- src/block/tile/BlastFurnace.php | 2 +- src/block/tile/NormalFurnace.php | 2 +- src/block/tile/Smoker.php | 2 +- src/block/utils/ColoredTrait.php | 2 +- src/block/utils/DyeColor.php | 95 +++-- src/block/utils/RecordType.php | 90 +++-- src/crafting/CraftingManager.php | 7 +- .../CraftingManagerFromDataHelper.php | 6 +- src/crafting/FurnaceType.php | 49 +-- src/data/bedrock/DyeColorIdMap.php | 37 +- src/data/bedrock/MedicineTypeIdMap.php | 8 +- src/data/bedrock/PotionTypeIdMap.php | 86 ++--- src/data/bedrock/SuspiciousStewTypeIdMap.php | 20 +- .../convert/BlockObjectToStateSerializer.php | 241 +++++++------ .../block/convert/BlockStateReader.php | 32 +- .../BlockStateToObjectDeserializer.php | 224 ++++++------ .../block/convert/BlockStateWriter.php | 35 +- .../ItemSerializerDeserializerRegistrar.php | 2 +- src/entity/projectile/SplashPotion.php | 2 +- src/item/Banner.php | 9 +- src/item/Dye.php | 7 +- src/item/GlassBottle.php | 2 +- src/item/Medicine.php | 7 +- src/item/MedicineType.php | 51 ++- src/item/Potion.php | 7 +- src/item/PotionType.php | 326 ++++++++++-------- src/item/SplashPotion.php | 7 +- src/item/StringToItemParser.php | 192 +++++------ src/item/SuspiciousStew.php | 7 +- src/item/SuspiciousStewType.php | 81 ++--- src/item/TieredTool.php | 4 +- src/item/ToolTier.php | 65 ++-- src/item/VanillaItems.php | 90 ++--- src/network/mcpe/InventoryManager.php | 9 +- src/network/mcpe/cache/CraftingDataCache.php | 11 +- 57 files changed, 1027 insertions(+), 1086 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 932a09b10f..bfa0c85e9b 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -48,11 +48,6 @@ abstract class BaseBanner extends Transparent{ */ protected array $patterns = []; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::BLACK(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function readStateFromWorld() : Block{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index 1b0ae89383..407ab1ada1 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -172,13 +172,13 @@ abstract class BaseSign extends Transparent{ } $dyeColor = $item instanceof Dye ? $item->getColor() : match($item->getTypeId()){ - ItemTypeIds::BONE_MEAL => DyeColor::WHITE(), - ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), - ItemTypeIds::COCOA_BEANS => DyeColor::BROWN(), + ItemTypeIds::BONE_MEAL => DyeColor::WHITE, + ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE, + ItemTypeIds::COCOA_BEANS => DyeColor::BROWN, default => null }; if($dyeColor !== null){ - $color = $dyeColor->equals(DyeColor::BLACK()) ? new Color(0, 0, 0) : $dyeColor->getRgbValue(); + $color = $dyeColor === DyeColor::BLACK ? new Color(0, 0, 0) : $dyeColor->getRgbValue(); if( $color->toARGB() !== $this->text->getBaseColor()->toARGB() && $this->doSignChange(new SignText($this->text->getLines(), $color, $this->text->isGlowing()), $player, $item) diff --git a/src/block/Bed.php b/src/block/Bed.php index 74543f78e4..d4dca17d62 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -48,11 +48,6 @@ class Bed extends Transparent{ protected bool $occupied = false; protected bool $head = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::RED(); - parent::__construct($idInfo, $name, $typeInfo); - } - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->bool($this->occupied); @@ -65,6 +60,8 @@ class Bed extends Transparent{ $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileBed){ $this->color = $tile->getColor(); + }else{ + $this->color = DyeColor::RED; //legacy pre-1.1 beds don't have tiles } return $this; diff --git a/src/block/CakeWithDyedCandle.php b/src/block/CakeWithDyedCandle.php index e01ad3e1b9..0dff358e16 100644 --- a/src/block/CakeWithDyedCandle.php +++ b/src/block/CakeWithDyedCandle.php @@ -30,7 +30,7 @@ class CakeWithDyedCandle extends CakeWithCandle{ use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); + $this->color = DyeColor::WHITE; parent::__construct($idInfo, $name, $typeInfo); } diff --git a/src/block/Carpet.php b/src/block/Carpet.php index c979571ebf..f59e042638 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -35,11 +35,6 @@ use pocketmine\world\BlockTransaction; class Carpet extends Flowable{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function isSolid() : bool{ return true; } diff --git a/src/block/Cauldron.php b/src/block/Cauldron.php index fd04077b89..772583a5af 100644 --- a/src/block/Cauldron.php +++ b/src/block/Cauldron.php @@ -83,7 +83,7 @@ final class Cauldron extends Transparent{ }elseif($item->getTypeId() === ItemTypeIds::POWDER_SNOW_BUCKET){ //TODO: powder snow cauldron }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion - if($item->getType()->equals(PotionType::WATER())){ + if($item->getType() === PotionType::WATER){ $this->fill(WaterCauldron::WATER_BOTTLE_FILL_AMOUNT, VanillaBlocks::WATER_CAULDRON(), $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); }else{ $this->fill(PotionCauldron::POTION_FILL_AMOUNT, VanillaBlocks::POTION_CAULDRON()->setPotionItem($item), $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); diff --git a/src/block/Concrete.php b/src/block/Concrete.php index cb8ee3b529..f78408f566 100644 --- a/src/block/Concrete.php +++ b/src/block/Concrete.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; class Concrete extends Opaque{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index 635d3ff2cf..dc16ce9d4b 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -36,11 +36,6 @@ class ConcretePowder extends Opaque implements Fallable{ onNearbyBlockChange as protected startFalling; } - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function onNearbyBlockChange() : void{ if(($water = $this->getAdjacentWater()) !== null){ BlockEventHelper::form($this, VanillaBlocks::CONCRETE()->setColor($this->color), $water); diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 738577296c..6f3d62e7f8 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -75,7 +75,7 @@ class Dirt extends Opaque{ $item->pop(); $world->setBlock($down->position, VanillaBlocks::HANGING_ROOTS()); //TODO: bonemeal particles, growth sounds - }elseif(($item instanceof Potion || $item instanceof SplashPotion) && $item->getType()->equals(PotionType::WATER())){ + }elseif(($item instanceof Potion || $item instanceof SplashPotion) && $item->getType() === PotionType::WATER){ $item->pop(); $world->setBlock($this->position, VanillaBlocks::MUD()); $world->addSound($this->position, new WaterSplashSound(0.5)); diff --git a/src/block/DyedCandle.php b/src/block/DyedCandle.php index 55d76e4066..756a1fc133 100644 --- a/src/block/DyedCandle.php +++ b/src/block/DyedCandle.php @@ -29,14 +29,9 @@ use pocketmine\block\utils\DyeColor; class DyedCandle extends Candle{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } - protected function getCandleIfCompatibleType(Block $block) : ?Candle{ $result = parent::getCandleIfCompatibleType($block); //different coloured candles can't be combined in the same block - return $result instanceof DyedCandle && $result->color->equals($this->color) ? $result : null; + return $result instanceof DyedCandle && $result->color === $this->color ? $result : null; } } diff --git a/src/block/DyedShulkerBox.php b/src/block/DyedShulkerBox.php index 196ee02822..862caf197e 100644 --- a/src/block/DyedShulkerBox.php +++ b/src/block/DyedShulkerBox.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class DyedShulkerBox extends ShulkerBox{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index b49347aef0..7d82e2efe5 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -30,9 +30,4 @@ use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; class GlazedTerracotta extends Opaque{ use ColoredTrait; use FacesOppositePlacingPlayerTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::BLACK(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/StainedGlass.php b/src/block/StainedGlass.php index 5b4b6a883c..013fdd6c52 100644 --- a/src/block/StainedGlass.php +++ b/src/block/StainedGlass.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class StainedGlass extends Glass{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/StainedGlassPane.php b/src/block/StainedGlassPane.php index 2a592395dd..4a2724aa89 100644 --- a/src/block/StainedGlassPane.php +++ b/src/block/StainedGlassPane.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class StainedGlassPane extends GlassPane{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/StainedHardenedClay.php b/src/block/StainedHardenedClay.php index 1a9d68737b..c30a6fe0e8 100644 --- a/src/block/StainedHardenedClay.php +++ b/src/block/StainedHardenedClay.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedClay extends HardenedClay{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/StainedHardenedGlass.php b/src/block/StainedHardenedGlass.php index 85d5fcec0f..07d021e168 100644 --- a/src/block/StainedHardenedGlass.php +++ b/src/block/StainedHardenedGlass.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedGlass extends HardenedGlass{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/StainedHardenedGlassPane.php b/src/block/StainedHardenedGlassPane.php index 4a61f9778b..81f29e9af6 100644 --- a/src/block/StainedHardenedGlassPane.php +++ b/src/block/StainedHardenedGlassPane.php @@ -28,9 +28,4 @@ use pocketmine\block\utils\DyeColor; final class StainedHardenedGlassPane extends HardenedGlassPane{ use ColoredTrait; - - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index c6b878d2fe..196816b304 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -783,7 +783,7 @@ final class VanillaBlocks{ $railBreakInfo = new Info(new BlockBreakInfo(0.7)); self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); self::register("air", new Air(new BID(Ids::AIR), "Air", new Info(BreakInfo::indestructible(-1.0)))); - self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0)))); + self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new Info(new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SWORD){ @@ -804,13 +804,13 @@ final class VanillaBlocks{ self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", new Info(BreakInfo::indestructible()))); self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", new Info(BreakInfo::instant()))); - self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); + self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new Info(BreakInfo::pickaxe(2.8)))); - self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD())))); + self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD)))); self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new Info(BreakInfo::axe(1.5)))); - self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); + self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); - $bricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $bricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); @@ -822,9 +822,9 @@ final class VanillaBlocks{ $chestBreakInfo = new Info(BreakInfo::axe(2.5)); self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new Info(BreakInfo::shovel(0.6)))); - self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0)))); + self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); - $cobblestoneBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $cobblestoneBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); @@ -832,12 +832,12 @@ final class VanillaBlocks{ self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new Info(new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1)))); self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new Info(BreakInfo::axe(0.2, null, 15.0)))); - self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD())))); + self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD)))); self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new Info(BreakInfo::axe(0.2)))); self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); - self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0)))); + self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", new Info(BreakInfo::instant()))); self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", new Info(BreakInfo::instant()))); @@ -846,19 +846,19 @@ final class VanillaBlocks{ self::register("pink_petals", new PinkPetals(new BID(Ids::PINK_PETALS), "Pink Petals", new Info(BreakInfo::instant()))); self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())))); + self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new Info(new BreakInfo(0.5, ToolType::NONE, 0, 12.5)))); - self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON(), 30.0)))); - self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 6000.0)))); + self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); + self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", new Info(BreakInfo::indestructible()))); self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", new Info(BreakInfo::instant()))); - self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 45.0)))); + self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 45.0)))); - $endBrickBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD(), 4.0)); + $endBrickBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD, 4.0)); self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); - self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD(), 3000.0)))); + self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD, 3000.0)))); self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant(), [Tags::FIRE]))); @@ -877,31 +877,31 @@ final class VanillaBlocks{ self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::FURNACE())); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::BLAST_FURNACE())); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())), FurnaceType::SMOKER())); + self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::FURNACE)); + self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::BLAST_FURNACE)); + self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::SMOKER)); $glassBreakInfo = new Info(new BreakInfo(0.3)); self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new Info(BreakInfo::pickaxe(10.0, ToolTier::DIAMOND(), 50.0)))); + self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new Info(BreakInfo::pickaxe(10.0, ToolTier::DIAMOND, 50.0)))); self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new Info(BreakInfo::pickaxe(0.3)))); self::register("glow_lichen", new GlowLichen(new BID(Ids::GLOW_LICHEN), "Glow Lichen", new Info(BreakInfo::axe(0.2, null, 0.2)))); - self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON(), 30.0)))); + self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON, 30.0)))); $grassBreakInfo = BreakInfo::shovel(0.6); self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", new Info($grassBreakInfo, [Tags::DIRT]))); self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", new Info($grassBreakInfo))); self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new Info(BreakInfo::shovel(0.6)))); - $hardenedClayBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0)); + $hardenedClayBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD, 21.0)); self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new Info(new BreakInfo(10.0)); self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new Info(new BreakInfo(0.5)))); - self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD(), 15.0)))); + self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 15.0)))); self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new Info(BreakInfo::pickaxe(0.5)))); $updateBlockBreakInfo = new Info(new BreakInfo(1.0)); @@ -909,10 +909,10 @@ final class VanillaBlocks{ self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", new Info(BreakInfo::indestructible()))); - $ironBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::STONE(), 30.0)); + $ironBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::STONE, 30.0)); self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); - $ironDoorBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 25.0)); + $ironDoorBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 25.0)); self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); @@ -923,21 +923,21 @@ final class VanillaBlocks{ self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", new Info(BreakInfo::axe(0.8)))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new Info(BreakInfo::axe(0.4)))); - $lanternBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())); + $lanternBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)); self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); - self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE())))); + self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE)))); self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", new Info(BreakInfo::indestructible(500.0)))); self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new Info(BreakInfo::axe(2.0)))); self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new Info(new BreakInfo(0.5)))); - self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); + self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new Info(BreakInfo::axe(1.0)))); self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", new Info(BreakInfo::instant()))); - self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); + self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); - $netherBrickBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $netherBrickBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); @@ -947,18 +947,18 @@ final class VanillaBlocks{ self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", new Info(BreakInfo::indestructible(0.0)))); - self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())))); + self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", new Info(BreakInfo::instant()))); - self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new Info(BreakInfo::pickaxe(0.4, ToolTier::WOOD())))); + self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new Info(BreakInfo::pickaxe(0.4, ToolTier::WOOD)))); self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new Info(BreakInfo::axe(0.8)))); - self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND(), 6000.0)))); + self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND, 6000.0)))); self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new Info(BreakInfo::pickaxe(0.5)))); self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", new Info(BreakInfo::instant()))); self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); - $prismarineBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); + $prismarineBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); @@ -973,12 +973,12 @@ final class VanillaBlocks{ self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", new Info(BreakInfo::instant()))); - $purpurBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); + $purpurBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); - $quartzBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); + $quartzBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD)); self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); @@ -990,7 +990,7 @@ final class VanillaBlocks{ self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); - self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD(), 30.0)))); + self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", new Info(BreakInfo::instant()))); self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new Info(new BreakInfo(0.3)))); self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", new Info(BreakInfo::instant()))); @@ -1006,14 +1006,14 @@ final class VanillaBlocks{ self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); self::register("mob_head", new MobHead(new BID(Ids::MOB_HEAD, TileMobHead::class), "Mob Head", new Info(new BreakInfo(1.0), enchantmentTags: [EnchantmentTags::MASK]))); self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", new Info(BreakInfo::instant()))); - self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD())))); - self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD())))); + self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD)))); + self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD)))); self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new Info(BreakInfo::shovel(0.5)))); self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new Info(new BreakInfo(0.6, ToolType::HOE)))); $shulkerBoxBreakInfo = new Info(BreakInfo::pickaxe(2)); self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); - $stoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); + $stoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); self::register( "stone", $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ @@ -1058,10 +1058,10 @@ final class VanillaBlocks{ self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new Info(BreakInfo::pickaxe(0.5)))); self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new Info(BreakInfo::pickaxe(3.5)))); - self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())))); + self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); //TODO: in the future this won't be the same for all the types - $stoneSlabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $stoneSlabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); @@ -1093,7 +1093,7 @@ final class VanillaBlocks{ self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); - self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD())))); + self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)))); self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", new Info(BreakInfo::instant()))); self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", new Info(BreakInfo::instant()))); self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", new Info(BreakInfo::instant()))); @@ -1114,7 +1114,7 @@ final class VanillaBlocks{ self::register("water", new Water(new BID(Ids::WATER), "Water", new Info(BreakInfo::indestructible(500.0)))); self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", new Info(BreakInfo::instant()))); - $weightedPressurePlateBreakInfo = new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())); + $weightedPressurePlateBreakInfo = new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)); self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy( new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), "Weighted Pressure Plate Heavy", @@ -1150,7 +1150,7 @@ final class VanillaBlocks{ self::register(strtolower($leavesType->name) . "_leaves", new Leaves(WoodLikeBlockIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); } - $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD())); + $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD)); self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); @@ -1165,7 +1165,7 @@ final class VanillaBlocks{ self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); - self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new Info(BreakInfo::pickaxe(1.4, ToolTier::WOOD())))); + self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new Info(BreakInfo::pickaxe(1.4, ToolTier::WOOD)))); self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); @@ -1173,7 +1173,7 @@ final class VanillaBlocks{ self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new Info(new BreakInfo(0.1)))); - self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new Info(BreakInfo::pickaxe(1.8, ToolTier::WOOD())))); + self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new Info(BreakInfo::pickaxe(1.8, ToolTier::WOOD)))); self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new Info(BreakInfo::shovel(0.5)))); self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new Info(new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ @@ -1187,7 +1187,7 @@ final class VanillaBlocks{ }))); //TODO: in the future these won't all have the same hardness; they only do now because of the old metadata crap - $wallBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $wallBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); @@ -1205,7 +1205,7 @@ final class VanillaBlocks{ self::registerElements(); - $chemistryTableBreakInfo = new Info(BreakInfo::pickaxe(2.5, ToolTier::WOOD())); + $chemistryTableBreakInfo = new Info(BreakInfo::pickaxe(2.5, ToolTier::WOOD)); self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); @@ -1428,26 +1428,26 @@ final class VanillaBlocks{ private static function registerOres() : void{ $stoneOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(3.0, $toolTier)); - self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD()))); - self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - self::register("emerald_ore", new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - self::register("gold_ore", new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON()))); - self::register("iron_ore", new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE()))); - self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON()))); + self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD))); + self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("emerald_ore", new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("gold_ore", new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("iron_ore", new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON))); $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(4.5, $toolTier)); - self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD()))); - self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - self::register("deepslate_emerald_ore", new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - self::register("deepslate_gold_ore", new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); - self::register("deepslate_iron_ore", new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE()))); - self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON()))); + self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD))); + self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_emerald_ore", new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_gold_ore", new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_iron_ore", new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON))); - $netherrackOreBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD())); + $netherrackOreBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)); self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); } @@ -1479,20 +1479,20 @@ final class VanillaBlocks{ private static function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones - $slabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $slabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND(), 3600.0)))); - $netheriteBreakInfo = new Info(BreakInfo::pickaxe(50, ToolTier::DIAMOND(), 3600.0)); + self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND, 3600.0)))); + $netheriteBreakInfo = new Info(BreakInfo::pickaxe(50, ToolTier::DIAMOND, 3600.0)); self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); - $basaltBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD(), 21.0)); + $basaltBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD, 21.0)); self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); - $blackstoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)); + $blackstoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); @@ -1504,7 +1504,7 @@ final class VanillaBlocks{ $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new Info(BreakInfo::pickaxe(0.5)))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD())), 20)); + self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)), 20)); self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); @@ -1528,33 +1528,33 @@ final class VanillaBlocks{ }); self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); - self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND(), 6000.0))) extends Opaque{ + self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND, 6000.0))) extends Opaque{ public function getLightLevel() : int{ return 10;} }); self::register("twisting_vines", new NetherVines(new BID(Ids::TWISTING_VINES), "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); self::register("weeping_vines", new NetherVines(new BID(Ids::WEEPING_VINES), "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); - self::register("chain", new Chain(new BID(Ids::CHAIN), "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD())))); + self::register("chain", new Chain(new BID(Ids::CHAIN), "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); } private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD()))) extends Opaque{ + self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD))) extends Opaque{ public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ $this->position->getWorld()->addSound($this->position, new AmethystBlockChimeSound()); $this->position->getWorld()->addSound($this->position, new BlockPunchSound($this)); } }); - self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD())))); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD(), 30.0)))); + self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD)))); + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)))); - self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0)))); - self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON(), 30.0)))); - self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE(), 30.0)))); + self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); + self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON, 30.0)))); + self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); - $deepslateBreakInfo = new Info(BreakInfo::pickaxe(3, ToolTier::WOOD(), 18.0)); + $deepslateBreakInfo = new Info(BreakInfo::pickaxe(3, ToolTier::WOOD, 18.0)); self::register("deepslate", new class(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo) extends SimplePillar{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLED_DEEPSLATE()->asItem()]; @@ -1566,29 +1566,29 @@ final class VanillaBlocks{ }); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)))); + self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)))); - $deepslateBrickBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); + $deepslateBrickBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); - $deepslateTilesBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); + $deepslateTilesBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); - $cobbledDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); + $cobbledDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); - $polishedDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD(), 18.0)); + $polishedDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); @@ -1597,7 +1597,7 @@ final class VanillaBlocks{ self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new Info(new BreakInfo(0.3)))); //blast resistance should be 30 if we were matched with java :( - $copperBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE(), 18.0)); + $copperBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE, 18.0)); self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); @@ -1631,7 +1631,7 @@ final class VanillaBlocks{ self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new Info(BreakInfo::shovel(0.5), [Tags::MUD]))); self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new Info(BreakInfo::pickaxe(1.0, null, 15.0)))); - $mudBricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD(), 30.0)); + $mudBricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); @@ -1640,7 +1640,7 @@ final class VanillaBlocks{ } private static function registerCauldronBlocks() : void{ - $cauldronBreakInfo = new Info(BreakInfo::pickaxe(2, ToolTier::WOOD())); + $cauldronBreakInfo = new Info(BreakInfo::pickaxe(2, ToolTier::WOOD)); self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); diff --git a/src/block/WaterCauldron.php b/src/block/WaterCauldron.php index 6a3c95048f..e470aa6cb8 100644 --- a/src/block/WaterCauldron.php +++ b/src/block/WaterCauldron.php @@ -110,10 +110,10 @@ final class WaterCauldron extends FillableCauldron{ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $world = $this->position->getWorld(); if(($dyeColor = match($item->getTypeId()){ - ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(), - ItemTypeIds::INK_SAC => DyeColor::BLACK(), - ItemTypeIds::COCOA_BEANS => DyeColor::BROWN(), - ItemTypeIds::BONE_MEAL => DyeColor::WHITE(), + ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE, + ItemTypeIds::INK_SAC => DyeColor::BLACK, + ItemTypeIds::COCOA_BEANS => DyeColor::BROWN, + ItemTypeIds::BONE_MEAL => DyeColor::WHITE, ItemTypeIds::DYE => $item instanceof Dye ? $item->getColor() : null, default => null }) !== null && ($newColor = $dyeColor->getRgbValue())->toRGBA() !== $this->customWaterColor?->toRGBA() @@ -123,7 +123,7 @@ final class WaterCauldron extends FillableCauldron{ $item->pop(); }elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion - if($item->getType()->equals(PotionType::WATER())){ + if($item->getType() === PotionType::WATER){ $this->setCustomWaterColor(null)->addFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::GLASS_BOTTLE(), $returnedItems); }else{ $this->mix($item, VanillaItems::GLASS_BOTTLE(), $returnedItems); @@ -170,7 +170,7 @@ final class WaterCauldron extends FillableCauldron{ match($item->getTypeId()){ ItemTypeIds::WATER_BUCKET => $this->setCustomWaterColor(null)->addFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::BUCKET(), $returnedItems), ItemTypeIds::BUCKET => $this->removeFillLevels(self::MAX_FILL_LEVEL, $item, VanillaItems::WATER_BUCKET(), $returnedItems), - ItemTypeIds::GLASS_BOTTLE => $this->removeFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::POTION()->setType(PotionType::WATER()), $returnedItems), + ItemTypeIds::GLASS_BOTTLE => $this->removeFillLevels(self::WATER_BOTTLE_FILL_AMOUNT, $item, VanillaItems::POTION()->setType(PotionType::WATER), $returnedItems), ItemTypeIds::LAVA_BUCKET, ItemTypeIds::POWDER_SNOW_BUCKET => $this->mix($item, VanillaItems::BUCKET(), $returnedItems), default => null }; diff --git a/src/block/Wool.php b/src/block/Wool.php index 2cc2b75358..49a7751fa0 100644 --- a/src/block/Wool.php +++ b/src/block/Wool.php @@ -29,11 +29,6 @@ use pocketmine\block\utils\DyeColor; class Wool extends Opaque{ use ColoredTrait; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ - $this->color = DyeColor::WHITE(); - parent::__construct($idInfo, $name, $typeInfo); - } - public function getFlameEncouragement() : int{ return 30; } diff --git a/src/block/tile/Banner.php b/src/block/tile/Banner.php index 191d4c8a52..60e35661f6 100644 --- a/src/block/tile/Banner.php +++ b/src/block/tile/Banner.php @@ -44,7 +44,7 @@ class Banner extends Spawnable{ public const TAG_PATTERN_COLOR = "Color"; public const TAG_PATTERN_NAME = "Pattern"; - private DyeColor $baseColor; + private DyeColor $baseColor = DyeColor::BLACK; /** * @var BannerPatternLayer[] @@ -52,11 +52,6 @@ class Banner extends Spawnable{ */ private array $patterns = []; - public function __construct(World $world, Vector3 $pos){ - $this->baseColor = DyeColor::BLACK(); - parent::__construct($world, $pos); - } - public function readSaveData(CompoundTag $nbt) : void{ $colorIdMap = DyeColorIdMap::getInstance(); if( @@ -65,7 +60,7 @@ class Banner extends Spawnable{ ){ $this->baseColor = $baseColor; }else{ - $this->baseColor = DyeColor::BLACK(); //TODO: this should be an error + $this->baseColor = DyeColor::BLACK; //TODO: this should be an error } $patternTypeIdMap = BannerPatternTypeIdMap::getInstance(); @@ -74,7 +69,7 @@ class Banner extends Spawnable{ if($patterns !== null){ /** @var CompoundTag $pattern */ foreach($patterns as $pattern){ - $patternColor = $colorIdMap->fromInvertedId($pattern->getInt(self::TAG_PATTERN_COLOR)) ?? DyeColor::BLACK(); //TODO: missing pattern colour should be an error + $patternColor = $colorIdMap->fromInvertedId($pattern->getInt(self::TAG_PATTERN_COLOR)) ?? DyeColor::BLACK; //TODO: missing pattern colour should be an error $patternType = $patternTypeIdMap->fromId($pattern->getString(self::TAG_PATTERN_NAME)); if($patternType === null){ continue; //TODO: this should be an error, but right now we don't have the setup to deal with it diff --git a/src/block/tile/Bed.php b/src/block/tile/Bed.php index 847bcca1fd..deb6de153d 100644 --- a/src/block/tile/Bed.php +++ b/src/block/tile/Bed.php @@ -33,12 +33,7 @@ use pocketmine\world\World; class Bed extends Spawnable{ public const TAG_COLOR = "color"; - private DyeColor $color; - - public function __construct(World $world, Vector3 $pos){ - $this->color = DyeColor::RED(); - parent::__construct($world, $pos); - } + private DyeColor $color = DyeColor::RED; public function getColor() : DyeColor{ return $this->color; @@ -55,7 +50,7 @@ class Bed extends Spawnable{ ){ $this->color = $color; }else{ - $this->color = DyeColor::RED(); //TODO: this should be an error, but we don't have the systems to handle it yet + $this->color = DyeColor::RED; //TODO: this should be an error, but we don't have the systems to handle it yet } } diff --git a/src/block/tile/BlastFurnace.php b/src/block/tile/BlastFurnace.php index e6e23c88c3..1356e32bf4 100644 --- a/src/block/tile/BlastFurnace.php +++ b/src/block/tile/BlastFurnace.php @@ -27,6 +27,6 @@ use pocketmine\crafting\FurnaceType; class BlastFurnace extends Furnace{ public function getFurnaceType() : FurnaceType{ - return FurnaceType::BLAST_FURNACE(); + return FurnaceType::BLAST_FURNACE; } } diff --git a/src/block/tile/NormalFurnace.php b/src/block/tile/NormalFurnace.php index 9580920e20..6aa61b8ce7 100644 --- a/src/block/tile/NormalFurnace.php +++ b/src/block/tile/NormalFurnace.php @@ -27,6 +27,6 @@ use pocketmine\crafting\FurnaceType; class NormalFurnace extends Furnace{ public function getFurnaceType() : FurnaceType{ - return FurnaceType::FURNACE(); + return FurnaceType::FURNACE; } } diff --git a/src/block/tile/Smoker.php b/src/block/tile/Smoker.php index 4b5a017336..824eeedd28 100644 --- a/src/block/tile/Smoker.php +++ b/src/block/tile/Smoker.php @@ -27,6 +27,6 @@ use pocketmine\crafting\FurnaceType; class Smoker extends Furnace{ public function getFurnaceType() : FurnaceType{ - return FurnaceType::SMOKER(); + return FurnaceType::SMOKER; } } diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index dab86fb663..11e98167e4 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -28,7 +28,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; trait ColoredTrait{ /** @var DyeColor */ - private $color; + private $color = DyeColor::WHITE; /** @see Block::describeBlockItemState() */ public function describeBlockItemState(RuntimeDataDescriber $w) : void{ diff --git a/src/block/utils/DyeColor.php b/src/block/utils/DyeColor.php index 81c51618a0..5b205eda5e 100644 --- a/src/block/utils/DyeColor.php +++ b/src/block/utils/DyeColor.php @@ -24,13 +24,12 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\color\Color; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; +use function spl_object_id; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static DyeColor BLACK() * @method static DyeColor BLUE() @@ -48,46 +47,70 @@ use pocketmine\utils\EnumTrait; * @method static DyeColor RED() * @method static DyeColor WHITE() * @method static DyeColor YELLOW() + * + * @phpstan-type TMetadata array{0: string, 1: Color} */ -final class DyeColor{ - use EnumTrait { - __construct as Enum___construct; +enum DyeColor{ + use LegacyEnumShimTrait; + + case WHITE; + case ORANGE; + case MAGENTA; + case LIGHT_BLUE; + case YELLOW; + case LIME; + case PINK; + case GRAY; + case LIGHT_GRAY; + case CYAN; + case PURPLE; + case BLUE; + case BROWN; + case GREEN; + case RED; + case BLACK; + + /** + * This function exists only to permit the use of named arguments and to make the code easier to read in PhpStorm. + * + * @phpstan-return TMetadata + */ + private static function meta(string $displayName, Color $rgbValue) : array{ + return [$displayName, $rgbValue]; } - protected static function setup() : void{ - self::registerAll( - new DyeColor("white", "White", new Color(0xf0, 0xf0, 0xf0)), - new DyeColor("orange", "Orange", new Color(0xf9, 0x80, 0x1d)), - new DyeColor("magenta", "Magenta", new Color(0xc7, 0x4e, 0xbd)), - new DyeColor("light_blue", "Light Blue", new Color(0x3a, 0xb3, 0xda)), - new DyeColor("yellow", "Yellow", new Color(0xfe, 0xd8, 0x3d)), - new DyeColor("lime", "Lime", new Color(0x80, 0xc7, 0x1f)), - new DyeColor("pink", "Pink", new Color(0xf3, 0x8b, 0xaa)), - new DyeColor("gray", "Gray", new Color(0x47, 0x4f, 0x52)), - new DyeColor("light_gray", "Light Gray", new Color(0x9d, 0x9d, 0x97)), - new DyeColor("cyan", "Cyan", new Color(0x16, 0x9c, 0x9c)), - new DyeColor("purple", "Purple", new Color(0x89, 0x32, 0xb8)), - new DyeColor("blue", "Blue", new Color(0x3c, 0x44, 0xaa)), - new DyeColor("brown", "Brown", new Color(0x83, 0x54, 0x32)), - new DyeColor("green", "Green", new Color(0x5e, 0x7c, 0x16)), - new DyeColor("red", "Red", new Color(0xb0, 0x2e, 0x26)), - new DyeColor("black", "Black", new Color(0x1d, 0x1d, 0x21)) - ); - } + /** + * @phpstan-return TMetadata + */ + private function getMetadata() : array{ + /** @phpstan-var array $cache */ + static $cache = []; - private function __construct( - string $enumName, - private string $displayName, - private Color $rgbValue - ){ - $this->Enum___construct($enumName); + return $cache[spl_object_id($this)] ??= match($this){ + self::WHITE => self::meta("White", new Color(0xf0, 0xf0, 0xf0)), + self::ORANGE => self::meta("Orange", new Color(0xf9, 0x80, 0x1d)), + self::MAGENTA => self::meta("Magenta", new Color(0xc7, 0x4e, 0xbd)), + self::LIGHT_BLUE => self::meta("Light Blue", new Color(0x3a, 0xb3, 0xda)), + self::YELLOW => self::meta("Yellow", new Color(0xfe, 0xd8, 0x3d)), + self::LIME => self::meta("Lime", new Color(0x80, 0xc7, 0x1f)), + self::PINK => self::meta("Pink", new Color(0xf3, 0x8b, 0xaa)), + self::GRAY => self::meta("Gray", new Color(0x47, 0x4f, 0x52)), + self::LIGHT_GRAY => self::meta("Light Gray", new Color(0x9d, 0x9d, 0x97)), + self::CYAN => self::meta("Cyan", new Color(0x16, 0x9c, 0x9c)), + self::PURPLE => self::meta("Purple", new Color(0x89, 0x32, 0xb8)), + self::BLUE => self::meta("Blue", new Color(0x3c, 0x44, 0xaa)), + self::BROWN => self::meta("Brown", new Color(0x83, 0x54, 0x32)), + self::GREEN => self::meta("Green", new Color(0x5e, 0x7c, 0x16)), + self::RED => self::meta("Red", new Color(0xb0, 0x2e, 0x26)), + self::BLACK => self::meta("Black", new Color(0x1d, 0x1d, 0x21)), + }; } public function getDisplayName() : string{ - return $this->displayName; + return $this->getMetadata()[0]; } public function getRgbValue() : Color{ - return $this->rgbValue; + return $this->getMetadata()[1]; } } diff --git a/src/block/utils/RecordType.php b/src/block/utils/RecordType.php index 9b0ab580fc..e63cee9204 100644 --- a/src/block/utils/RecordType.php +++ b/src/block/utils/RecordType.php @@ -26,13 +26,12 @@ namespace pocketmine\block\utils; use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; +use function spl_object_id; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static RecordType DISK_11() * @method static RecordType DISK_13() @@ -49,48 +48,63 @@ use pocketmine\utils\EnumTrait; * @method static RecordType DISK_STRAD() * @method static RecordType DISK_WAIT() * @method static RecordType DISK_WARD() + * + * @phpstan-type TMetadata array{0: string, 1: LevelSoundEvent::*, 2: Translatable} */ -final class RecordType{ - use EnumTrait { - __construct as Enum___construct; - } +enum RecordType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new RecordType("disk_13", "C418 - 13", LevelSoundEvent::RECORD_13, KnownTranslationFactory::item_record_13_desc()), - new RecordType("disk_5", "Samuel Åberg - 5", LevelSoundEvent::RECORD_5, KnownTranslationFactory::item_record_5_desc()), - new RecordType("disk_cat", "C418 - cat", LevelSoundEvent::RECORD_CAT, KnownTranslationFactory::item_record_cat_desc()), - new RecordType("disk_blocks", "C418 - blocks", LevelSoundEvent::RECORD_BLOCKS, KnownTranslationFactory::item_record_blocks_desc()), - new RecordType("disk_chirp", "C418 - chirp", LevelSoundEvent::RECORD_CHIRP, KnownTranslationFactory::item_record_chirp_desc()), - new RecordType("disk_far", "C418 - far", LevelSoundEvent::RECORD_FAR, KnownTranslationFactory::item_record_far_desc()), - new RecordType("disk_mall", "C418 - mall", LevelSoundEvent::RECORD_MALL, KnownTranslationFactory::item_record_mall_desc()), - new RecordType("disk_mellohi", "C418 - mellohi", LevelSoundEvent::RECORD_MELLOHI, KnownTranslationFactory::item_record_mellohi_desc()), - new RecordType("disk_otherside", "Lena Raine - otherside", LevelSoundEvent::RECORD_OTHERSIDE, KnownTranslationFactory::item_record_otherside_desc()), - new RecordType("disk_pigstep", "Lena Raine - Pigstep", LevelSoundEvent::RECORD_PIGSTEP, KnownTranslationFactory::item_record_pigstep_desc()), - new RecordType("disk_stal", "C418 - stal", LevelSoundEvent::RECORD_STAL, KnownTranslationFactory::item_record_stal_desc()), - new RecordType("disk_strad", "C418 - strad", LevelSoundEvent::RECORD_STRAD, KnownTranslationFactory::item_record_strad_desc()), - new RecordType("disk_ward", "C418 - ward", LevelSoundEvent::RECORD_WARD, KnownTranslationFactory::item_record_ward_desc()), - new RecordType("disk_11", "C418 - 11", LevelSoundEvent::RECORD_11, KnownTranslationFactory::item_record_11_desc()), - new RecordType("disk_wait", "C418 - wait", LevelSoundEvent::RECORD_WAIT, KnownTranslationFactory::item_record_wait_desc()) - ); - } + case DISK_13; + case DISK_5; + case DISK_CAT; + case DISK_BLOCKS; + case DISK_CHIRP; + case DISK_FAR; + case DISK_MALL; + case DISK_MELLOHI; + case DISK_OTHERSIDE; + case DISK_PIGSTEP; + case DISK_STAL; + case DISK_STRAD; + case DISK_WARD; + case DISK_11; + case DISK_WAIT; - private function __construct( - string $enumName, - private string $soundName, - private int $soundId, - private Translatable $translatableName - ){ - $this->Enum___construct($enumName); + /** + * @phpstan-return TMetadata + */ + private function getMetadata() : array{ + /** @phpstan-var array $cache */ + static $cache = []; + + return $cache[spl_object_id($this)] ??= match($this){ + self::DISK_13 => ["C418 - 13", LevelSoundEvent::RECORD_13, KnownTranslationFactory::item_record_13_desc()], + self::DISK_5 => ["Samuel Åberg - 5", LevelSoundEvent::RECORD_5, KnownTranslationFactory::item_record_5_desc()], + self::DISK_CAT => ["C418 - cat", LevelSoundEvent::RECORD_CAT, KnownTranslationFactory::item_record_cat_desc()], + self::DISK_BLOCKS => ["C418 - blocks", LevelSoundEvent::RECORD_BLOCKS, KnownTranslationFactory::item_record_blocks_desc()], + self::DISK_CHIRP => ["C418 - chirp", LevelSoundEvent::RECORD_CHIRP, KnownTranslationFactory::item_record_chirp_desc()], + self::DISK_FAR => ["C418 - far", LevelSoundEvent::RECORD_FAR, KnownTranslationFactory::item_record_far_desc()], + self::DISK_MALL => ["C418 - mall", LevelSoundEvent::RECORD_MALL, KnownTranslationFactory::item_record_mall_desc()], + self::DISK_MELLOHI => ["C418 - mellohi", LevelSoundEvent::RECORD_MELLOHI, KnownTranslationFactory::item_record_mellohi_desc()], + self::DISK_OTHERSIDE => ["Lena Raine - otherside", LevelSoundEvent::RECORD_OTHERSIDE, KnownTranslationFactory::item_record_otherside_desc()], + self::DISK_PIGSTEP => ["Lena Raine - Pigstep", LevelSoundEvent::RECORD_PIGSTEP, KnownTranslationFactory::item_record_pigstep_desc()], + self::DISK_STAL => ["C418 - stal", LevelSoundEvent::RECORD_STAL, KnownTranslationFactory::item_record_stal_desc()], + self::DISK_STRAD => ["C418 - strad", LevelSoundEvent::RECORD_STRAD, KnownTranslationFactory::item_record_strad_desc()], + self::DISK_WARD => ["C418 - ward", LevelSoundEvent::RECORD_WARD, KnownTranslationFactory::item_record_ward_desc()], + self::DISK_11 => ["C418 - 11", LevelSoundEvent::RECORD_11, KnownTranslationFactory::item_record_11_desc()], + self::DISK_WAIT => ["C418 - wait", LevelSoundEvent::RECORD_WAIT, KnownTranslationFactory::item_record_wait_desc()] + }; } public function getSoundName() : string{ - return $this->soundName; + return $this->getMetadata()[0]; } public function getSoundId() : int{ - return $this->soundId; + return $this->getMetadata()[1]; } - public function getTranslatableName() : Translatable{ return $this->translatableName; } + public function getTranslatableName() : Translatable{ + return $this->getMetadata()[2]; + } } diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 74bc2ba102..c7c0b10c64 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -29,6 +29,7 @@ use pocketmine\nbt\TreeRoot; use pocketmine\utils\BinaryStream; use pocketmine\utils\DestructorCallbackTrait; use pocketmine\utils\ObjectSet; +use function spl_object_id; use function usort; class CraftingManager{ @@ -80,8 +81,8 @@ class CraftingManager{ public function __construct(){ $this->recipeRegisteredCallbacks = new ObjectSet(); - foreach(FurnaceType::getAll() as $furnaceType){ - $this->furnaceRecipeManagers[$furnaceType->id()] = new FurnaceRecipeManager(); + foreach(FurnaceType::cases() as $furnaceType){ + $this->furnaceRecipeManagers[spl_object_id($furnaceType)] = new FurnaceRecipeManager(); } $recipeRegisteredCallbacks = $this->recipeRegisteredCallbacks; @@ -177,7 +178,7 @@ class CraftingManager{ } public function getFurnaceRecipeManager(FurnaceType $furnaceType) : FurnaceRecipeManager{ - return $this->furnaceRecipeManagers[$furnaceType->id()]; + return $this->furnaceRecipeManagers[spl_object_id($furnaceType)]; } /** diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 0c861255b4..8315f2b3b3 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -270,9 +270,9 @@ final class CraftingManagerFromDataHelper{ } foreach(self::loadJsonArrayOfObjectsFile(Path::join($directoryPath, 'smelting.json'), FurnaceRecipeData::class) as $recipe){ $furnaceType = match ($recipe->block){ - "furnace" => FurnaceType::FURNACE(), - "blast_furnace" => FurnaceType::BLAST_FURNACE(), - "smoker" => FurnaceType::SMOKER(), + "furnace" => FurnaceType::FURNACE, + "blast_furnace" => FurnaceType::BLAST_FURNACE, + "smoker" => FurnaceType::SMOKER, //TODO: campfire default => null }; diff --git a/src/crafting/FurnaceType.php b/src/crafting/FurnaceType.php index 649ff4484d..0ce5b72cea 100644 --- a/src/crafting/FurnaceType.php +++ b/src/crafting/FurnaceType.php @@ -23,40 +23,45 @@ declare(strict_types=1); namespace pocketmine\crafting; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; use pocketmine\world\sound\BlastFurnaceSound; use pocketmine\world\sound\FurnaceSound; use pocketmine\world\sound\SmokerSound; use pocketmine\world\sound\Sound; +use function spl_object_id; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static FurnaceType BLAST_FURNACE() * @method static FurnaceType FURNACE() * @method static FurnaceType SMOKER() + * + * @phpstan-type TMetadata array{0: int, 1: Sound} */ -final class FurnaceType{ - use EnumTrait { - __construct as Enum___construct; +enum FurnaceType{ + use LegacyEnumShimTrait; + + case FURNACE; + case BLAST_FURNACE; + case SMOKER; + + /** + * @phpstan-return TMetadata + */ + private function getMetadata() : array{ + /** @phpstan-var array $cache */ + static $cache = []; + + return $cache[spl_object_id($this)] ??= match($this){ + self::FURNACE => [200, new FurnaceSound()], + self::BLAST_FURNACE => [100, new BlastFurnaceSound()], + self::SMOKER => [100, new SmokerSound()], + }; } - protected static function setup() : void{ - self::registerAll( - new self("furnace", 200, new FurnaceSound()), - new self("blast_furnace", 100, new BlastFurnaceSound()), - new self("smoker", 100, new SmokerSound()), - ); - } + public function getCookDurationTicks() : int{ return $this->getMetadata()[0]; } - private function __construct(string $enumName, private int $cookDurationTicks, private Sound $cookSound){ - $this->Enum___construct($enumName); - } - - public function getCookDurationTicks() : int{ return $this->cookDurationTicks; } - - public function getCookSound() : Sound{ return $this->cookSound; } + public function getCookSound() : Sound{ return $this->getMetadata()[1]; } } diff --git a/src/data/bedrock/DyeColorIdMap.php b/src/data/bedrock/DyeColorIdMap.php index 0d10edad56..a360e4f910 100644 --- a/src/data/bedrock/DyeColorIdMap.php +++ b/src/data/bedrock/DyeColorIdMap.php @@ -26,6 +26,7 @@ namespace pocketmine\data\bedrock; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\utils\SingletonTrait; +use function spl_object_id; final class DyeColorIdMap{ use SingletonTrait; @@ -47,28 +48,28 @@ final class DyeColorIdMap{ private array $enumToItemId = []; private function __construct(){ - $this->register(0, ItemTypeNames::WHITE_DYE, DyeColor::WHITE()); - $this->register(1, ItemTypeNames::ORANGE_DYE, DyeColor::ORANGE()); - $this->register(2, ItemTypeNames::MAGENTA_DYE, DyeColor::MAGENTA()); - $this->register(3, ItemTypeNames::LIGHT_BLUE_DYE, DyeColor::LIGHT_BLUE()); - $this->register(4, ItemTypeNames::YELLOW_DYE, DyeColor::YELLOW()); - $this->register(5, ItemTypeNames::LIME_DYE, DyeColor::LIME()); - $this->register(6, ItemTypeNames::PINK_DYE, DyeColor::PINK()); - $this->register(7, ItemTypeNames::GRAY_DYE, DyeColor::GRAY()); - $this->register(8, ItemTypeNames::LIGHT_GRAY_DYE, DyeColor::LIGHT_GRAY()); - $this->register(9, ItemTypeNames::CYAN_DYE, DyeColor::CYAN()); - $this->register(10, ItemTypeNames::PURPLE_DYE, DyeColor::PURPLE()); - $this->register(11, ItemTypeNames::BLUE_DYE, DyeColor::BLUE()); - $this->register(12, ItemTypeNames::BROWN_DYE, DyeColor::BROWN()); - $this->register(13, ItemTypeNames::GREEN_DYE, DyeColor::GREEN()); - $this->register(14, ItemTypeNames::RED_DYE, DyeColor::RED()); - $this->register(15, ItemTypeNames::BLACK_DYE, DyeColor::BLACK()); + $this->register(0, ItemTypeNames::WHITE_DYE, DyeColor::WHITE); + $this->register(1, ItemTypeNames::ORANGE_DYE, DyeColor::ORANGE); + $this->register(2, ItemTypeNames::MAGENTA_DYE, DyeColor::MAGENTA); + $this->register(3, ItemTypeNames::LIGHT_BLUE_DYE, DyeColor::LIGHT_BLUE); + $this->register(4, ItemTypeNames::YELLOW_DYE, DyeColor::YELLOW); + $this->register(5, ItemTypeNames::LIME_DYE, DyeColor::LIME); + $this->register(6, ItemTypeNames::PINK_DYE, DyeColor::PINK); + $this->register(7, ItemTypeNames::GRAY_DYE, DyeColor::GRAY); + $this->register(8, ItemTypeNames::LIGHT_GRAY_DYE, DyeColor::LIGHT_GRAY); + $this->register(9, ItemTypeNames::CYAN_DYE, DyeColor::CYAN); + $this->register(10, ItemTypeNames::PURPLE_DYE, DyeColor::PURPLE); + $this->register(11, ItemTypeNames::BLUE_DYE, DyeColor::BLUE); + $this->register(12, ItemTypeNames::BROWN_DYE, DyeColor::BROWN); + $this->register(13, ItemTypeNames::GREEN_DYE, DyeColor::GREEN); + $this->register(14, ItemTypeNames::RED_DYE, DyeColor::RED); + $this->register(15, ItemTypeNames::BLACK_DYE, DyeColor::BLACK); } private function register(int $id, string $itemId, DyeColor $color) : void{ $this->registerInt($id, $color); $this->itemIdToEnum[$itemId] = $color; - $this->enumToItemId[$color->id()] = $itemId; + $this->enumToItemId[spl_object_id($color)] = $itemId; } public function toInvertedId(DyeColor $color) : int{ @@ -76,7 +77,7 @@ final class DyeColorIdMap{ } public function toItemId(DyeColor $color) : string{ - return $this->enumToItemId[$color->id()]; + return $this->enumToItemId[spl_object_id($color)]; } public function fromInvertedId(int $id) : ?DyeColor{ diff --git a/src/data/bedrock/MedicineTypeIdMap.php b/src/data/bedrock/MedicineTypeIdMap.php index 2d9deb3802..00d1f27a86 100644 --- a/src/data/bedrock/MedicineTypeIdMap.php +++ b/src/data/bedrock/MedicineTypeIdMap.php @@ -32,9 +32,9 @@ final class MedicineTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(MedicineTypeIds::ANTIDOTE, MedicineType::ANTIDOTE()); - $this->register(MedicineTypeIds::ELIXIR, MedicineType::ELIXIR()); - $this->register(MedicineTypeIds::EYE_DROPS, MedicineType::EYE_DROPS()); - $this->register(MedicineTypeIds::TONIC, MedicineType::TONIC()); + $this->register(MedicineTypeIds::ANTIDOTE, MedicineType::ANTIDOTE); + $this->register(MedicineTypeIds::ELIXIR, MedicineType::ELIXIR); + $this->register(MedicineTypeIds::EYE_DROPS, MedicineType::EYE_DROPS); + $this->register(MedicineTypeIds::TONIC, MedicineType::TONIC); } } diff --git a/src/data/bedrock/PotionTypeIdMap.php b/src/data/bedrock/PotionTypeIdMap.php index 3e9858217c..3fef20f68c 100644 --- a/src/data/bedrock/PotionTypeIdMap.php +++ b/src/data/bedrock/PotionTypeIdMap.php @@ -32,48 +32,48 @@ final class PotionTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(PotionTypeIds::WATER, PotionType::WATER()); - $this->register(PotionTypeIds::MUNDANE, PotionType::MUNDANE()); - $this->register(PotionTypeIds::LONG_MUNDANE, PotionType::LONG_MUNDANE()); - $this->register(PotionTypeIds::THICK, PotionType::THICK()); - $this->register(PotionTypeIds::AWKWARD, PotionType::AWKWARD()); - $this->register(PotionTypeIds::NIGHT_VISION, PotionType::NIGHT_VISION()); - $this->register(PotionTypeIds::LONG_NIGHT_VISION, PotionType::LONG_NIGHT_VISION()); - $this->register(PotionTypeIds::INVISIBILITY, PotionType::INVISIBILITY()); - $this->register(PotionTypeIds::LONG_INVISIBILITY, PotionType::LONG_INVISIBILITY()); - $this->register(PotionTypeIds::LEAPING, PotionType::LEAPING()); - $this->register(PotionTypeIds::LONG_LEAPING, PotionType::LONG_LEAPING()); - $this->register(PotionTypeIds::STRONG_LEAPING, PotionType::STRONG_LEAPING()); - $this->register(PotionTypeIds::FIRE_RESISTANCE, PotionType::FIRE_RESISTANCE()); - $this->register(PotionTypeIds::LONG_FIRE_RESISTANCE, PotionType::LONG_FIRE_RESISTANCE()); - $this->register(PotionTypeIds::SWIFTNESS, PotionType::SWIFTNESS()); - $this->register(PotionTypeIds::LONG_SWIFTNESS, PotionType::LONG_SWIFTNESS()); - $this->register(PotionTypeIds::STRONG_SWIFTNESS, PotionType::STRONG_SWIFTNESS()); - $this->register(PotionTypeIds::SLOWNESS, PotionType::SLOWNESS()); - $this->register(PotionTypeIds::LONG_SLOWNESS, PotionType::LONG_SLOWNESS()); - $this->register(PotionTypeIds::WATER_BREATHING, PotionType::WATER_BREATHING()); - $this->register(PotionTypeIds::LONG_WATER_BREATHING, PotionType::LONG_WATER_BREATHING()); - $this->register(PotionTypeIds::HEALING, PotionType::HEALING()); - $this->register(PotionTypeIds::STRONG_HEALING, PotionType::STRONG_HEALING()); - $this->register(PotionTypeIds::HARMING, PotionType::HARMING()); - $this->register(PotionTypeIds::STRONG_HARMING, PotionType::STRONG_HARMING()); - $this->register(PotionTypeIds::POISON, PotionType::POISON()); - $this->register(PotionTypeIds::LONG_POISON, PotionType::LONG_POISON()); - $this->register(PotionTypeIds::STRONG_POISON, PotionType::STRONG_POISON()); - $this->register(PotionTypeIds::REGENERATION, PotionType::REGENERATION()); - $this->register(PotionTypeIds::LONG_REGENERATION, PotionType::LONG_REGENERATION()); - $this->register(PotionTypeIds::STRONG_REGENERATION, PotionType::STRONG_REGENERATION()); - $this->register(PotionTypeIds::STRENGTH, PotionType::STRENGTH()); - $this->register(PotionTypeIds::LONG_STRENGTH, PotionType::LONG_STRENGTH()); - $this->register(PotionTypeIds::STRONG_STRENGTH, PotionType::STRONG_STRENGTH()); - $this->register(PotionTypeIds::WEAKNESS, PotionType::WEAKNESS()); - $this->register(PotionTypeIds::LONG_WEAKNESS, PotionType::LONG_WEAKNESS()); - $this->register(PotionTypeIds::WITHER, PotionType::WITHER()); - $this->register(PotionTypeIds::TURTLE_MASTER, PotionType::TURTLE_MASTER()); - $this->register(PotionTypeIds::LONG_TURTLE_MASTER, PotionType::LONG_TURTLE_MASTER()); - $this->register(PotionTypeIds::STRONG_TURTLE_MASTER, PotionType::STRONG_TURTLE_MASTER()); - $this->register(PotionTypeIds::SLOW_FALLING, PotionType::SLOW_FALLING()); - $this->register(PotionTypeIds::LONG_SLOW_FALLING, PotionType::LONG_SLOW_FALLING()); - $this->register(PotionTypeIds::STRONG_SLOWNESS, PotionType::STRONG_SLOWNESS()); + $this->register(PotionTypeIds::WATER, PotionType::WATER); + $this->register(PotionTypeIds::MUNDANE, PotionType::MUNDANE); + $this->register(PotionTypeIds::LONG_MUNDANE, PotionType::LONG_MUNDANE); + $this->register(PotionTypeIds::THICK, PotionType::THICK); + $this->register(PotionTypeIds::AWKWARD, PotionType::AWKWARD); + $this->register(PotionTypeIds::NIGHT_VISION, PotionType::NIGHT_VISION); + $this->register(PotionTypeIds::LONG_NIGHT_VISION, PotionType::LONG_NIGHT_VISION); + $this->register(PotionTypeIds::INVISIBILITY, PotionType::INVISIBILITY); + $this->register(PotionTypeIds::LONG_INVISIBILITY, PotionType::LONG_INVISIBILITY); + $this->register(PotionTypeIds::LEAPING, PotionType::LEAPING); + $this->register(PotionTypeIds::LONG_LEAPING, PotionType::LONG_LEAPING); + $this->register(PotionTypeIds::STRONG_LEAPING, PotionType::STRONG_LEAPING); + $this->register(PotionTypeIds::FIRE_RESISTANCE, PotionType::FIRE_RESISTANCE); + $this->register(PotionTypeIds::LONG_FIRE_RESISTANCE, PotionType::LONG_FIRE_RESISTANCE); + $this->register(PotionTypeIds::SWIFTNESS, PotionType::SWIFTNESS); + $this->register(PotionTypeIds::LONG_SWIFTNESS, PotionType::LONG_SWIFTNESS); + $this->register(PotionTypeIds::STRONG_SWIFTNESS, PotionType::STRONG_SWIFTNESS); + $this->register(PotionTypeIds::SLOWNESS, PotionType::SLOWNESS); + $this->register(PotionTypeIds::LONG_SLOWNESS, PotionType::LONG_SLOWNESS); + $this->register(PotionTypeIds::WATER_BREATHING, PotionType::WATER_BREATHING); + $this->register(PotionTypeIds::LONG_WATER_BREATHING, PotionType::LONG_WATER_BREATHING); + $this->register(PotionTypeIds::HEALING, PotionType::HEALING); + $this->register(PotionTypeIds::STRONG_HEALING, PotionType::STRONG_HEALING); + $this->register(PotionTypeIds::HARMING, PotionType::HARMING); + $this->register(PotionTypeIds::STRONG_HARMING, PotionType::STRONG_HARMING); + $this->register(PotionTypeIds::POISON, PotionType::POISON); + $this->register(PotionTypeIds::LONG_POISON, PotionType::LONG_POISON); + $this->register(PotionTypeIds::STRONG_POISON, PotionType::STRONG_POISON); + $this->register(PotionTypeIds::REGENERATION, PotionType::REGENERATION); + $this->register(PotionTypeIds::LONG_REGENERATION, PotionType::LONG_REGENERATION); + $this->register(PotionTypeIds::STRONG_REGENERATION, PotionType::STRONG_REGENERATION); + $this->register(PotionTypeIds::STRENGTH, PotionType::STRENGTH); + $this->register(PotionTypeIds::LONG_STRENGTH, PotionType::LONG_STRENGTH); + $this->register(PotionTypeIds::STRONG_STRENGTH, PotionType::STRONG_STRENGTH); + $this->register(PotionTypeIds::WEAKNESS, PotionType::WEAKNESS); + $this->register(PotionTypeIds::LONG_WEAKNESS, PotionType::LONG_WEAKNESS); + $this->register(PotionTypeIds::WITHER, PotionType::WITHER); + $this->register(PotionTypeIds::TURTLE_MASTER, PotionType::TURTLE_MASTER); + $this->register(PotionTypeIds::LONG_TURTLE_MASTER, PotionType::LONG_TURTLE_MASTER); + $this->register(PotionTypeIds::STRONG_TURTLE_MASTER, PotionType::STRONG_TURTLE_MASTER); + $this->register(PotionTypeIds::SLOW_FALLING, PotionType::SLOW_FALLING); + $this->register(PotionTypeIds::LONG_SLOW_FALLING, PotionType::LONG_SLOW_FALLING); + $this->register(PotionTypeIds::STRONG_SLOWNESS, PotionType::STRONG_SLOWNESS); } } diff --git a/src/data/bedrock/SuspiciousStewTypeIdMap.php b/src/data/bedrock/SuspiciousStewTypeIdMap.php index 37d1215173..c4de4b742d 100644 --- a/src/data/bedrock/SuspiciousStewTypeIdMap.php +++ b/src/data/bedrock/SuspiciousStewTypeIdMap.php @@ -32,15 +32,15 @@ final class SuspiciousStewTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY()); - $this->register(SuspiciousStewTypeIds::CORNFLOWER, SuspiciousStewType::CORNFLOWER()); - $this->register(SuspiciousStewTypeIds::TULIP, SuspiciousStewType::TULIP()); - $this->register(SuspiciousStewTypeIds::AZURE_BLUET, SuspiciousStewType::AZURE_BLUET()); - $this->register(SuspiciousStewTypeIds::LILY_OF_THE_VALLEY, SuspiciousStewType::LILY_OF_THE_VALLEY()); - $this->register(SuspiciousStewTypeIds::DANDELION, SuspiciousStewType::DANDELION()); - $this->register(SuspiciousStewTypeIds::BLUE_ORCHID, SuspiciousStewType::BLUE_ORCHID()); - $this->register(SuspiciousStewTypeIds::ALLIUM, SuspiciousStewType::ALLIUM()); - $this->register(SuspiciousStewTypeIds::OXEYE_DAISY, SuspiciousStewType::OXEYE_DAISY()); - $this->register(SuspiciousStewTypeIds::WITHER_ROSE, SuspiciousStewType::WITHER_ROSE()); + $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY); + $this->register(SuspiciousStewTypeIds::CORNFLOWER, SuspiciousStewType::CORNFLOWER); + $this->register(SuspiciousStewTypeIds::TULIP, SuspiciousStewType::TULIP); + $this->register(SuspiciousStewTypeIds::AZURE_BLUET, SuspiciousStewType::AZURE_BLUET); + $this->register(SuspiciousStewTypeIds::LILY_OF_THE_VALLEY, SuspiciousStewType::LILY_OF_THE_VALLEY); + $this->register(SuspiciousStewTypeIds::DANDELION, SuspiciousStewType::DANDELION); + $this->register(SuspiciousStewTypeIds::BLUE_ORCHID, SuspiciousStewType::BLUE_ORCHID); + $this->register(SuspiciousStewTypeIds::ALLIUM, SuspiciousStewType::ALLIUM); + $this->register(SuspiciousStewTypeIds::OXEYE_DAISY, SuspiciousStewType::OXEYE_DAISY); + $this->register(SuspiciousStewTypeIds::WITHER_ROSE, SuspiciousStewType::WITHER_ROSE); } } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 28a6864feb..7c2e08ceb4 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -271,149 +271,142 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ private function registerCandleSerializers() : void{ $this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE))); $this->map(Blocks::DYED_CANDLE(), fn(DyedCandle $block) => Helper::encodeCandle($block, new Writer(match($block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_CANDLE, - DyeColor::BLUE() => Ids::BLUE_CANDLE, - DyeColor::BROWN() => Ids::BROWN_CANDLE, - DyeColor::CYAN() => Ids::CYAN_CANDLE, - DyeColor::GRAY() => Ids::GRAY_CANDLE, - DyeColor::GREEN() => Ids::GREEN_CANDLE, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CANDLE, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CANDLE, - DyeColor::LIME() => Ids::LIME_CANDLE, - DyeColor::MAGENTA() => Ids::MAGENTA_CANDLE, - DyeColor::ORANGE() => Ids::ORANGE_CANDLE, - DyeColor::PINK() => Ids::PINK_CANDLE, - DyeColor::PURPLE() => Ids::PURPLE_CANDLE, - DyeColor::RED() => Ids::RED_CANDLE, - DyeColor::WHITE() => Ids::WHITE_CANDLE, - DyeColor::YELLOW() => Ids::YELLOW_CANDLE, - default => throw new AssumptionFailedError("Unhandled DyeColor " . $block->getColor()->name()) + DyeColor::BLACK => Ids::BLACK_CANDLE, + DyeColor::BLUE => Ids::BLUE_CANDLE, + DyeColor::BROWN => Ids::BROWN_CANDLE, + DyeColor::CYAN => Ids::CYAN_CANDLE, + DyeColor::GRAY => Ids::GRAY_CANDLE, + DyeColor::GREEN => Ids::GREEN_CANDLE, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE, + DyeColor::LIME => Ids::LIME_CANDLE, + DyeColor::MAGENTA => Ids::MAGENTA_CANDLE, + DyeColor::ORANGE => Ids::ORANGE_CANDLE, + DyeColor::PINK => Ids::PINK_CANDLE, + DyeColor::PURPLE => Ids::PURPLE_CANDLE, + DyeColor::RED => Ids::RED_CANDLE, + DyeColor::WHITE => Ids::WHITE_CANDLE, + DyeColor::YELLOW => Ids::YELLOW_CANDLE, }))); $this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE) ->writeBool(StateNames::LIT, $block->isLit())); $this->map(Blocks::CAKE_WITH_DYED_CANDLE(), fn(CakeWithDyedCandle $block) => Writer::create(match($block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_CANDLE_CAKE, - DyeColor::BLUE() => Ids::BLUE_CANDLE_CAKE, - DyeColor::BROWN() => Ids::BROWN_CANDLE_CAKE, - DyeColor::CYAN() => Ids::CYAN_CANDLE_CAKE, - DyeColor::GRAY() => Ids::GRAY_CANDLE_CAKE, - DyeColor::GREEN() => Ids::GREEN_CANDLE_CAKE, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CANDLE_CAKE, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CANDLE_CAKE, - DyeColor::LIME() => Ids::LIME_CANDLE_CAKE, - DyeColor::MAGENTA() => Ids::MAGENTA_CANDLE_CAKE, - DyeColor::ORANGE() => Ids::ORANGE_CANDLE_CAKE, - DyeColor::PINK() => Ids::PINK_CANDLE_CAKE, - DyeColor::PURPLE() => Ids::PURPLE_CANDLE_CAKE, - DyeColor::RED() => Ids::RED_CANDLE_CAKE, - DyeColor::WHITE() => Ids::WHITE_CANDLE_CAKE, - DyeColor::YELLOW() => Ids::YELLOW_CANDLE_CAKE, - default => throw new AssumptionFailedError("Unhandled DyeColor " . $block->getColor()->name()) + DyeColor::BLACK => Ids::BLACK_CANDLE_CAKE, + DyeColor::BLUE => Ids::BLUE_CANDLE_CAKE, + DyeColor::BROWN => Ids::BROWN_CANDLE_CAKE, + DyeColor::CYAN => Ids::CYAN_CANDLE_CAKE, + DyeColor::GRAY => Ids::GRAY_CANDLE_CAKE, + DyeColor::GREEN => Ids::GREEN_CANDLE_CAKE, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE_CAKE, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE_CAKE, + DyeColor::LIME => Ids::LIME_CANDLE_CAKE, + DyeColor::MAGENTA => Ids::MAGENTA_CANDLE_CAKE, + DyeColor::ORANGE => Ids::ORANGE_CANDLE_CAKE, + DyeColor::PINK => Ids::PINK_CANDLE_CAKE, + DyeColor::PURPLE => Ids::PURPLE_CANDLE_CAKE, + DyeColor::RED => Ids::RED_CANDLE_CAKE, + DyeColor::WHITE => Ids::WHITE_CANDLE_CAKE, + DyeColor::YELLOW => Ids::YELLOW_CANDLE_CAKE, })->writeBool(StateNames::LIT, $block->isLit())); } public function registerFlatColorBlockSerializers() : void{ $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ - return Writer::create(match($color = $block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_GLAZED_TERRACOTTA, - DyeColor::BLUE() => Ids::BLUE_GLAZED_TERRACOTTA, - DyeColor::BROWN() => Ids::BROWN_GLAZED_TERRACOTTA, - DyeColor::CYAN() => Ids::CYAN_GLAZED_TERRACOTTA, - DyeColor::GRAY() => Ids::GRAY_GLAZED_TERRACOTTA, - DyeColor::GREEN() => Ids::GREEN_GLAZED_TERRACOTTA, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, - DyeColor::LIGHT_GRAY() => Ids::SILVER_GLAZED_TERRACOTTA, - DyeColor::LIME() => Ids::LIME_GLAZED_TERRACOTTA, - DyeColor::MAGENTA() => Ids::MAGENTA_GLAZED_TERRACOTTA, - DyeColor::ORANGE() => Ids::ORANGE_GLAZED_TERRACOTTA, - DyeColor::PINK() => Ids::PINK_GLAZED_TERRACOTTA, - DyeColor::PURPLE() => Ids::PURPLE_GLAZED_TERRACOTTA, - DyeColor::RED() => Ids::RED_GLAZED_TERRACOTTA, - DyeColor::WHITE() => Ids::WHITE_GLAZED_TERRACOTTA, - DyeColor::YELLOW() => Ids::YELLOW_GLAZED_TERRACOTTA, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + return Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::BLACK_GLAZED_TERRACOTTA, + DyeColor::BLUE => Ids::BLUE_GLAZED_TERRACOTTA, + DyeColor::BROWN => Ids::BROWN_GLAZED_TERRACOTTA, + DyeColor::CYAN => Ids::CYAN_GLAZED_TERRACOTTA, + DyeColor::GRAY => Ids::GRAY_GLAZED_TERRACOTTA, + DyeColor::GREEN => Ids::GREEN_GLAZED_TERRACOTTA, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, + DyeColor::LIGHT_GRAY => Ids::SILVER_GLAZED_TERRACOTTA, + DyeColor::LIME => Ids::LIME_GLAZED_TERRACOTTA, + DyeColor::MAGENTA => Ids::MAGENTA_GLAZED_TERRACOTTA, + DyeColor::ORANGE => Ids::ORANGE_GLAZED_TERRACOTTA, + DyeColor::PINK => Ids::PINK_GLAZED_TERRACOTTA, + DyeColor::PURPLE => Ids::PURPLE_GLAZED_TERRACOTTA, + DyeColor::RED => Ids::RED_GLAZED_TERRACOTTA, + DyeColor::WHITE => Ids::WHITE_GLAZED_TERRACOTTA, + DyeColor::YELLOW => Ids::YELLOW_GLAZED_TERRACOTTA, }) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::WOOL(), fn(Wool $block) => Writer::create(match($color = $block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_WOOL, - DyeColor::BLUE() => Ids::BLUE_WOOL, - DyeColor::BROWN() => Ids::BROWN_WOOL, - DyeColor::CYAN() => Ids::CYAN_WOOL, - DyeColor::GRAY() => Ids::GRAY_WOOL, - DyeColor::GREEN() => Ids::GREEN_WOOL, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_WOOL, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_WOOL, - DyeColor::LIME() => Ids::LIME_WOOL, - DyeColor::MAGENTA() => Ids::MAGENTA_WOOL, - DyeColor::ORANGE() => Ids::ORANGE_WOOL, - DyeColor::PINK() => Ids::PINK_WOOL, - DyeColor::PURPLE() => Ids::PURPLE_WOOL, - DyeColor::RED() => Ids::RED_WOOL, - DyeColor::WHITE() => Ids::WHITE_WOOL, - DyeColor::YELLOW() => Ids::YELLOW_WOOL, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + $this->map(Blocks::WOOL(), fn(Wool $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::BLACK_WOOL, + DyeColor::BLUE => Ids::BLUE_WOOL, + DyeColor::BROWN => Ids::BROWN_WOOL, + DyeColor::CYAN => Ids::CYAN_WOOL, + DyeColor::GRAY => Ids::GRAY_WOOL, + DyeColor::GREEN => Ids::GREEN_WOOL, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_WOOL, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_WOOL, + DyeColor::LIME => Ids::LIME_WOOL, + DyeColor::MAGENTA => Ids::MAGENTA_WOOL, + DyeColor::ORANGE => Ids::ORANGE_WOOL, + DyeColor::PINK => Ids::PINK_WOOL, + DyeColor::PURPLE => Ids::PURPLE_WOOL, + DyeColor::RED => Ids::RED_WOOL, + DyeColor::WHITE => Ids::WHITE_WOOL, + DyeColor::YELLOW => Ids::YELLOW_WOOL, })); - $this->map(Blocks::CARPET(), fn(Carpet $block) => Writer::create(match($color = $block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_CARPET, - DyeColor::BLUE() => Ids::BLUE_CARPET, - DyeColor::BROWN() => Ids::BROWN_CARPET, - DyeColor::CYAN() => Ids::CYAN_CARPET, - DyeColor::GRAY() => Ids::GRAY_CARPET, - DyeColor::GREEN() => Ids::GREEN_CARPET, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CARPET, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CARPET, - DyeColor::LIME() => Ids::LIME_CARPET, - DyeColor::MAGENTA() => Ids::MAGENTA_CARPET, - DyeColor::ORANGE() => Ids::ORANGE_CARPET, - DyeColor::PINK() => Ids::PINK_CARPET, - DyeColor::PURPLE() => Ids::PURPLE_CARPET, - DyeColor::RED() => Ids::RED_CARPET, - DyeColor::WHITE() => Ids::WHITE_CARPET, - DyeColor::YELLOW() => Ids::YELLOW_CARPET, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + $this->map(Blocks::CARPET(), fn(Carpet $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::BLACK_CARPET, + DyeColor::BLUE => Ids::BLUE_CARPET, + DyeColor::BROWN => Ids::BROWN_CARPET, + DyeColor::CYAN => Ids::CYAN_CARPET, + DyeColor::GRAY => Ids::GRAY_CARPET, + DyeColor::GREEN => Ids::GREEN_CARPET, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CARPET, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CARPET, + DyeColor::LIME => Ids::LIME_CARPET, + DyeColor::MAGENTA => Ids::MAGENTA_CARPET, + DyeColor::ORANGE => Ids::ORANGE_CARPET, + DyeColor::PINK => Ids::PINK_CARPET, + DyeColor::PURPLE => Ids::PURPLE_CARPET, + DyeColor::RED => Ids::RED_CARPET, + DyeColor::WHITE => Ids::WHITE_CARPET, + DyeColor::YELLOW => Ids::YELLOW_CARPET, })); - $this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => Writer::create(match($color = $block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_SHULKER_BOX, - DyeColor::BLUE() => Ids::BLUE_SHULKER_BOX, - DyeColor::BROWN() => Ids::BROWN_SHULKER_BOX, - DyeColor::CYAN() => Ids::CYAN_SHULKER_BOX, - DyeColor::GRAY() => Ids::GRAY_SHULKER_BOX, - DyeColor::GREEN() => Ids::GREEN_SHULKER_BOX, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_SHULKER_BOX, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_SHULKER_BOX, - DyeColor::LIME() => Ids::LIME_SHULKER_BOX, - DyeColor::MAGENTA() => Ids::MAGENTA_SHULKER_BOX, - DyeColor::ORANGE() => Ids::ORANGE_SHULKER_BOX, - DyeColor::PINK() => Ids::PINK_SHULKER_BOX, - DyeColor::PURPLE() => Ids::PURPLE_SHULKER_BOX, - DyeColor::RED() => Ids::RED_SHULKER_BOX, - DyeColor::WHITE() => Ids::WHITE_SHULKER_BOX, - DyeColor::YELLOW() => Ids::YELLOW_SHULKER_BOX, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + $this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::BLACK_SHULKER_BOX, + DyeColor::BLUE => Ids::BLUE_SHULKER_BOX, + DyeColor::BROWN => Ids::BROWN_SHULKER_BOX, + DyeColor::CYAN => Ids::CYAN_SHULKER_BOX, + DyeColor::GRAY => Ids::GRAY_SHULKER_BOX, + DyeColor::GREEN => Ids::GREEN_SHULKER_BOX, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_SHULKER_BOX, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_SHULKER_BOX, + DyeColor::LIME => Ids::LIME_SHULKER_BOX, + DyeColor::MAGENTA => Ids::MAGENTA_SHULKER_BOX, + DyeColor::ORANGE => Ids::ORANGE_SHULKER_BOX, + DyeColor::PINK => Ids::PINK_SHULKER_BOX, + DyeColor::PURPLE => Ids::PURPLE_SHULKER_BOX, + DyeColor::RED => Ids::RED_SHULKER_BOX, + DyeColor::WHITE => Ids::WHITE_SHULKER_BOX, + DyeColor::YELLOW => Ids::YELLOW_SHULKER_BOX, })); - $this->map(Blocks::CONCRETE(), fn(Concrete $block) => Writer::create(match($color = $block->getColor()){ - DyeColor::BLACK() => Ids::BLACK_CONCRETE, - DyeColor::BLUE() => Ids::BLUE_CONCRETE, - DyeColor::BROWN() => Ids::BROWN_CONCRETE, - DyeColor::CYAN() => Ids::CYAN_CONCRETE, - DyeColor::GRAY() => Ids::GRAY_CONCRETE, - DyeColor::GREEN() => Ids::GREEN_CONCRETE, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CONCRETE, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CONCRETE, - DyeColor::LIME() => Ids::LIME_CONCRETE, - DyeColor::MAGENTA() => Ids::MAGENTA_CONCRETE, - DyeColor::ORANGE() => Ids::ORANGE_CONCRETE, - DyeColor::PINK() => Ids::PINK_CONCRETE, - DyeColor::PURPLE() => Ids::PURPLE_CONCRETE, - DyeColor::RED() => Ids::RED_CONCRETE, - DyeColor::WHITE() => Ids::WHITE_CONCRETE, - DyeColor::YELLOW() => Ids::YELLOW_CONCRETE, - default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + $this->map(Blocks::CONCRETE(), fn(Concrete $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::BLACK_CONCRETE, + DyeColor::BLUE => Ids::BLUE_CONCRETE, + DyeColor::BROWN => Ids::BROWN_CONCRETE, + DyeColor::CYAN => Ids::CYAN_CONCRETE, + DyeColor::GRAY => Ids::GRAY_CONCRETE, + DyeColor::GREEN => Ids::GREEN_CONCRETE, + DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CONCRETE, + DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CONCRETE, + DyeColor::LIME => Ids::LIME_CONCRETE, + DyeColor::MAGENTA => Ids::MAGENTA_CONCRETE, + DyeColor::ORANGE => Ids::ORANGE_CONCRETE, + DyeColor::PINK => Ids::PINK_CONCRETE, + DyeColor::PURPLE => Ids::PURPLE_CONCRETE, + DyeColor::RED => Ids::RED_CONCRETE, + DyeColor::WHITE => Ids::WHITE_CONCRETE, + DyeColor::YELLOW => Ids::YELLOW_CONCRETE, })); } diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 42022016e2..183b4a7b34 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -227,22 +227,22 @@ final class BlockStateReader{ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow return match($color = $this->readString(BlockStateNames::COLOR)){ - StringValues::COLOR_BLACK => DyeColor::BLACK(), - StringValues::COLOR_BLUE => DyeColor::BLUE(), - StringValues::COLOR_BROWN => DyeColor::BROWN(), - StringValues::COLOR_CYAN => DyeColor::CYAN(), - StringValues::COLOR_GRAY => DyeColor::GRAY(), - StringValues::COLOR_GREEN => DyeColor::GREEN(), - StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE(), - StringValues::COLOR_LIME => DyeColor::LIME(), - StringValues::COLOR_MAGENTA => DyeColor::MAGENTA(), - StringValues::COLOR_ORANGE => DyeColor::ORANGE(), - StringValues::COLOR_PINK => DyeColor::PINK(), - StringValues::COLOR_PURPLE => DyeColor::PURPLE(), - StringValues::COLOR_RED => DyeColor::RED(), - StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY(), - StringValues::COLOR_WHITE => DyeColor::WHITE(), - StringValues::COLOR_YELLOW => DyeColor::YELLOW(), + StringValues::COLOR_BLACK => DyeColor::BLACK, + StringValues::COLOR_BLUE => DyeColor::BLUE, + StringValues::COLOR_BROWN => DyeColor::BROWN, + StringValues::COLOR_CYAN => DyeColor::CYAN, + StringValues::COLOR_GRAY => DyeColor::GRAY, + StringValues::COLOR_GREEN => DyeColor::GREEN, + StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE, + StringValues::COLOR_LIME => DyeColor::LIME, + StringValues::COLOR_MAGENTA => DyeColor::MAGENTA, + StringValues::COLOR_ORANGE => DyeColor::ORANGE, + StringValues::COLOR_PINK => DyeColor::PINK, + StringValues::COLOR_PURPLE => DyeColor::PURPLE, + StringValues::COLOR_RED => DyeColor::RED, + StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY, + StringValues::COLOR_WHITE => DyeColor::WHITE, + StringValues::COLOR_YELLOW => DyeColor::YELLOW, default => throw $this->badValueException(BlockStateNames::COLOR, $color), }; } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index ff6b27a289..02db75be9d 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -134,44 +134,44 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ private function registerCandleDeserializers() : void{ $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in)); foreach([ - Ids::BLACK_CANDLE => DyeColor::BLACK(), - Ids::BLUE_CANDLE => DyeColor::BLUE(), - Ids::BROWN_CANDLE => DyeColor::BROWN(), - Ids::CYAN_CANDLE => DyeColor::CYAN(), - Ids::GRAY_CANDLE => DyeColor::GRAY(), - Ids::GREEN_CANDLE => DyeColor::GREEN(), - Ids::LIGHT_BLUE_CANDLE => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_CANDLE => DyeColor::LIGHT_GRAY(), - Ids::LIME_CANDLE => DyeColor::LIME(), - Ids::MAGENTA_CANDLE => DyeColor::MAGENTA(), - Ids::ORANGE_CANDLE => DyeColor::ORANGE(), - Ids::PINK_CANDLE => DyeColor::PINK(), - Ids::PURPLE_CANDLE => DyeColor::PURPLE(), - Ids::RED_CANDLE => DyeColor::RED(), - Ids::WHITE_CANDLE => DyeColor::WHITE(), - Ids::YELLOW_CANDLE => DyeColor::YELLOW(), + Ids::BLACK_CANDLE => DyeColor::BLACK, + Ids::BLUE_CANDLE => DyeColor::BLUE, + Ids::BROWN_CANDLE => DyeColor::BROWN, + Ids::CYAN_CANDLE => DyeColor::CYAN, + Ids::GRAY_CANDLE => DyeColor::GRAY, + Ids::GREEN_CANDLE => DyeColor::GREEN, + Ids::LIGHT_BLUE_CANDLE => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_CANDLE => DyeColor::LIGHT_GRAY, + Ids::LIME_CANDLE => DyeColor::LIME, + Ids::MAGENTA_CANDLE => DyeColor::MAGENTA, + Ids::ORANGE_CANDLE => DyeColor::ORANGE, + Ids::PINK_CANDLE => DyeColor::PINK, + Ids::PURPLE_CANDLE => DyeColor::PURPLE, + Ids::RED_CANDLE => DyeColor::RED, + Ids::WHITE_CANDLE => DyeColor::WHITE, + Ids::YELLOW_CANDLE => DyeColor::YELLOW, ] as $id => $color){ $this->map($id, fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in)); } $this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT))); foreach([ - Ids::BLACK_CANDLE_CAKE => DyeColor::BLACK(), - Ids::BLUE_CANDLE_CAKE => DyeColor::BLUE(), - Ids::BROWN_CANDLE_CAKE => DyeColor::BROWN(), - Ids::CYAN_CANDLE_CAKE => DyeColor::CYAN(), - Ids::GRAY_CANDLE_CAKE => DyeColor::GRAY(), - Ids::GREEN_CANDLE_CAKE => DyeColor::GREEN(), - Ids::LIGHT_BLUE_CANDLE_CAKE => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_CANDLE_CAKE => DyeColor::LIGHT_GRAY(), - Ids::LIME_CANDLE_CAKE => DyeColor::LIME(), - Ids::MAGENTA_CANDLE_CAKE => DyeColor::MAGENTA(), - Ids::ORANGE_CANDLE_CAKE => DyeColor::ORANGE(), - Ids::PINK_CANDLE_CAKE => DyeColor::PINK(), - Ids::PURPLE_CANDLE_CAKE => DyeColor::PURPLE(), - Ids::RED_CANDLE_CAKE => DyeColor::RED(), - Ids::WHITE_CANDLE_CAKE => DyeColor::WHITE(), - Ids::YELLOW_CANDLE_CAKE => DyeColor::YELLOW(), + Ids::BLACK_CANDLE_CAKE => DyeColor::BLACK, + Ids::BLUE_CANDLE_CAKE => DyeColor::BLUE, + Ids::BROWN_CANDLE_CAKE => DyeColor::BROWN, + Ids::CYAN_CANDLE_CAKE => DyeColor::CYAN, + Ids::GRAY_CANDLE_CAKE => DyeColor::GRAY, + Ids::GREEN_CANDLE_CAKE => DyeColor::GREEN, + Ids::LIGHT_BLUE_CANDLE_CAKE => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_CANDLE_CAKE => DyeColor::LIGHT_GRAY, + Ids::LIME_CANDLE_CAKE => DyeColor::LIME, + Ids::MAGENTA_CANDLE_CAKE => DyeColor::MAGENTA, + Ids::ORANGE_CANDLE_CAKE => DyeColor::ORANGE, + Ids::PINK_CANDLE_CAKE => DyeColor::PINK, + Ids::PURPLE_CANDLE_CAKE => DyeColor::PURPLE, + Ids::RED_CANDLE_CAKE => DyeColor::RED, + Ids::WHITE_CANDLE_CAKE => DyeColor::WHITE, + Ids::YELLOW_CANDLE_CAKE => DyeColor::YELLOW, ] as $id => $color){ $this->map($id, fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE() ->setColor($color) @@ -182,22 +182,22 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ private function registerFlatColorBlockDeserializers() : void{ foreach([ - Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK(), - Ids::BLUE_GLAZED_TERRACOTTA => DyeColor::BLUE(), - Ids::BROWN_GLAZED_TERRACOTTA => DyeColor::BROWN(), - Ids::CYAN_GLAZED_TERRACOTTA => DyeColor::CYAN(), - Ids::GRAY_GLAZED_TERRACOTTA => DyeColor::GRAY(), - Ids::GREEN_GLAZED_TERRACOTTA => DyeColor::GREEN(), - Ids::LIGHT_BLUE_GLAZED_TERRACOTTA => DyeColor::LIGHT_BLUE(), - Ids::SILVER_GLAZED_TERRACOTTA => DyeColor::LIGHT_GRAY(), - Ids::LIME_GLAZED_TERRACOTTA => DyeColor::LIME(), - Ids::MAGENTA_GLAZED_TERRACOTTA => DyeColor::MAGENTA(), - Ids::ORANGE_GLAZED_TERRACOTTA => DyeColor::ORANGE(), - Ids::PINK_GLAZED_TERRACOTTA => DyeColor::PINK(), - Ids::PURPLE_GLAZED_TERRACOTTA => DyeColor::PURPLE(), - Ids::RED_GLAZED_TERRACOTTA => DyeColor::RED(), - Ids::WHITE_GLAZED_TERRACOTTA => DyeColor::WHITE(), - Ids::YELLOW_GLAZED_TERRACOTTA => DyeColor::YELLOW(), + Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK, + Ids::BLUE_GLAZED_TERRACOTTA => DyeColor::BLUE, + Ids::BROWN_GLAZED_TERRACOTTA => DyeColor::BROWN, + Ids::CYAN_GLAZED_TERRACOTTA => DyeColor::CYAN, + Ids::GRAY_GLAZED_TERRACOTTA => DyeColor::GRAY, + Ids::GREEN_GLAZED_TERRACOTTA => DyeColor::GREEN, + Ids::LIGHT_BLUE_GLAZED_TERRACOTTA => DyeColor::LIGHT_BLUE, + Ids::SILVER_GLAZED_TERRACOTTA => DyeColor::LIGHT_GRAY, + Ids::LIME_GLAZED_TERRACOTTA => DyeColor::LIME, + Ids::MAGENTA_GLAZED_TERRACOTTA => DyeColor::MAGENTA, + Ids::ORANGE_GLAZED_TERRACOTTA => DyeColor::ORANGE, + Ids::PINK_GLAZED_TERRACOTTA => DyeColor::PINK, + Ids::PURPLE_GLAZED_TERRACOTTA => DyeColor::PURPLE, + Ids::RED_GLAZED_TERRACOTTA => DyeColor::RED, + Ids::WHITE_GLAZED_TERRACOTTA => DyeColor::WHITE, + Ids::YELLOW_GLAZED_TERRACOTTA => DyeColor::YELLOW, ] as $id => $color){ $this->map($id, fn(Reader $in) => Blocks::GLAZED_TERRACOTTA() ->setColor($color) @@ -206,85 +206,85 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } foreach([ - Ids::BLACK_WOOL => DyeColor::BLACK(), - Ids::BLUE_WOOL => DyeColor::BLUE(), - Ids::BROWN_WOOL => DyeColor::BROWN(), - Ids::CYAN_WOOL => DyeColor::CYAN(), - Ids::GRAY_WOOL => DyeColor::GRAY(), - Ids::GREEN_WOOL => DyeColor::GREEN(), - Ids::LIGHT_BLUE_WOOL => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_WOOL => DyeColor::LIGHT_GRAY(), - Ids::LIME_WOOL => DyeColor::LIME(), - Ids::MAGENTA_WOOL => DyeColor::MAGENTA(), - Ids::ORANGE_WOOL => DyeColor::ORANGE(), - Ids::PINK_WOOL => DyeColor::PINK(), - Ids::PURPLE_WOOL => DyeColor::PURPLE(), - Ids::RED_WOOL => DyeColor::RED(), - Ids::WHITE_WOOL => DyeColor::WHITE(), - Ids::YELLOW_WOOL => DyeColor::YELLOW(), + Ids::BLACK_WOOL => DyeColor::BLACK, + Ids::BLUE_WOOL => DyeColor::BLUE, + Ids::BROWN_WOOL => DyeColor::BROWN, + Ids::CYAN_WOOL => DyeColor::CYAN, + Ids::GRAY_WOOL => DyeColor::GRAY, + Ids::GREEN_WOOL => DyeColor::GREEN, + Ids::LIGHT_BLUE_WOOL => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_WOOL => DyeColor::LIGHT_GRAY, + Ids::LIME_WOOL => DyeColor::LIME, + Ids::MAGENTA_WOOL => DyeColor::MAGENTA, + Ids::ORANGE_WOOL => DyeColor::ORANGE, + Ids::PINK_WOOL => DyeColor::PINK, + Ids::PURPLE_WOOL => DyeColor::PURPLE, + Ids::RED_WOOL => DyeColor::RED, + Ids::WHITE_WOOL => DyeColor::WHITE, + Ids::YELLOW_WOOL => DyeColor::YELLOW, ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::WOOL()->setColor($color)); } foreach([ - Ids::BLACK_CARPET => DyeColor::BLACK(), - Ids::BLUE_CARPET => DyeColor::BLUE(), - Ids::BROWN_CARPET => DyeColor::BROWN(), - Ids::CYAN_CARPET => DyeColor::CYAN(), - Ids::GRAY_CARPET => DyeColor::GRAY(), - Ids::GREEN_CARPET => DyeColor::GREEN(), - Ids::LIGHT_BLUE_CARPET => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_CARPET => DyeColor::LIGHT_GRAY(), - Ids::LIME_CARPET => DyeColor::LIME(), - Ids::MAGENTA_CARPET => DyeColor::MAGENTA(), - Ids::ORANGE_CARPET => DyeColor::ORANGE(), - Ids::PINK_CARPET => DyeColor::PINK(), - Ids::PURPLE_CARPET => DyeColor::PURPLE(), - Ids::RED_CARPET => DyeColor::RED(), - Ids::WHITE_CARPET => DyeColor::WHITE(), - Ids::YELLOW_CARPET => DyeColor::YELLOW(), + Ids::BLACK_CARPET => DyeColor::BLACK, + Ids::BLUE_CARPET => DyeColor::BLUE, + Ids::BROWN_CARPET => DyeColor::BROWN, + Ids::CYAN_CARPET => DyeColor::CYAN, + Ids::GRAY_CARPET => DyeColor::GRAY, + Ids::GREEN_CARPET => DyeColor::GREEN, + Ids::LIGHT_BLUE_CARPET => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_CARPET => DyeColor::LIGHT_GRAY, + Ids::LIME_CARPET => DyeColor::LIME, + Ids::MAGENTA_CARPET => DyeColor::MAGENTA, + Ids::ORANGE_CARPET => DyeColor::ORANGE, + Ids::PINK_CARPET => DyeColor::PINK, + Ids::PURPLE_CARPET => DyeColor::PURPLE, + Ids::RED_CARPET => DyeColor::RED, + Ids::WHITE_CARPET => DyeColor::WHITE, + Ids::YELLOW_CARPET => DyeColor::YELLOW, ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::CARPET()->setColor($color)); } foreach([ - Ids::BLACK_SHULKER_BOX => DyeColor::BLACK(), - Ids::BLUE_SHULKER_BOX => DyeColor::BLUE(), - Ids::BROWN_SHULKER_BOX => DyeColor::BROWN(), - Ids::CYAN_SHULKER_BOX => DyeColor::CYAN(), - Ids::GRAY_SHULKER_BOX => DyeColor::GRAY(), - Ids::GREEN_SHULKER_BOX => DyeColor::GREEN(), - Ids::LIGHT_BLUE_SHULKER_BOX => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_SHULKER_BOX => DyeColor::LIGHT_GRAY(), - Ids::LIME_SHULKER_BOX => DyeColor::LIME(), - Ids::MAGENTA_SHULKER_BOX => DyeColor::MAGENTA(), - Ids::ORANGE_SHULKER_BOX => DyeColor::ORANGE(), - Ids::PINK_SHULKER_BOX => DyeColor::PINK(), - Ids::PURPLE_SHULKER_BOX => DyeColor::PURPLE(), - Ids::RED_SHULKER_BOX => DyeColor::RED(), - Ids::WHITE_SHULKER_BOX => DyeColor::WHITE(), - Ids::YELLOW_SHULKER_BOX => DyeColor::YELLOW(), + Ids::BLACK_SHULKER_BOX => DyeColor::BLACK, + Ids::BLUE_SHULKER_BOX => DyeColor::BLUE, + Ids::BROWN_SHULKER_BOX => DyeColor::BROWN, + Ids::CYAN_SHULKER_BOX => DyeColor::CYAN, + Ids::GRAY_SHULKER_BOX => DyeColor::GRAY, + Ids::GREEN_SHULKER_BOX => DyeColor::GREEN, + Ids::LIGHT_BLUE_SHULKER_BOX => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_SHULKER_BOX => DyeColor::LIGHT_GRAY, + Ids::LIME_SHULKER_BOX => DyeColor::LIME, + Ids::MAGENTA_SHULKER_BOX => DyeColor::MAGENTA, + Ids::ORANGE_SHULKER_BOX => DyeColor::ORANGE, + Ids::PINK_SHULKER_BOX => DyeColor::PINK, + Ids::PURPLE_SHULKER_BOX => DyeColor::PURPLE, + Ids::RED_SHULKER_BOX => DyeColor::RED, + Ids::WHITE_SHULKER_BOX => DyeColor::WHITE, + Ids::YELLOW_SHULKER_BOX => DyeColor::YELLOW, ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::DYED_SHULKER_BOX()->setColor($color)); } foreach([ - Ids::BLACK_CONCRETE => DyeColor::BLACK(), - Ids::BLUE_CONCRETE => DyeColor::BLUE(), - Ids::BROWN_CONCRETE => DyeColor::BROWN(), - Ids::CYAN_CONCRETE => DyeColor::CYAN(), - Ids::GRAY_CONCRETE => DyeColor::GRAY(), - Ids::GREEN_CONCRETE => DyeColor::GREEN(), - Ids::LIGHT_BLUE_CONCRETE => DyeColor::LIGHT_BLUE(), - Ids::LIGHT_GRAY_CONCRETE => DyeColor::LIGHT_GRAY(), - Ids::LIME_CONCRETE => DyeColor::LIME(), - Ids::MAGENTA_CONCRETE => DyeColor::MAGENTA(), - Ids::ORANGE_CONCRETE => DyeColor::ORANGE(), - Ids::PINK_CONCRETE => DyeColor::PINK(), - Ids::PURPLE_CONCRETE => DyeColor::PURPLE(), - Ids::RED_CONCRETE => DyeColor::RED(), - Ids::WHITE_CONCRETE => DyeColor::WHITE(), - Ids::YELLOW_CONCRETE => DyeColor::YELLOW(), + Ids::BLACK_CONCRETE => DyeColor::BLACK, + Ids::BLUE_CONCRETE => DyeColor::BLUE, + Ids::BROWN_CONCRETE => DyeColor::BROWN, + Ids::CYAN_CONCRETE => DyeColor::CYAN, + Ids::GRAY_CONCRETE => DyeColor::GRAY, + Ids::GREEN_CONCRETE => DyeColor::GREEN, + Ids::LIGHT_BLUE_CONCRETE => DyeColor::LIGHT_BLUE, + Ids::LIGHT_GRAY_CONCRETE => DyeColor::LIGHT_GRAY, + Ids::LIME_CONCRETE => DyeColor::LIME, + Ids::MAGENTA_CONCRETE => DyeColor::MAGENTA, + Ids::ORANGE_CONCRETE => DyeColor::ORANGE, + Ids::PINK_CONCRETE => DyeColor::PINK, + Ids::PURPLE_CONCRETE => DyeColor::PURPLE, + Ids::RED_CONCRETE => DyeColor::RED, + Ids::WHITE_CONCRETE => DyeColor::WHITE, + Ids::YELLOW_CONCRETE => DyeColor::YELLOW, ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::CONCRETE()->setColor($color)); } diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 7c7274f2fb..7a1aecf1b2 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -181,24 +181,23 @@ final class BlockStateWriter{ /** @return $this */ public function writeColor(DyeColor $color) : self{ - $this->writeString(BlockStateNames::COLOR, match($color->id()){ - DyeColor::BLACK()->id() => StringValues::COLOR_BLACK, - DyeColor::BLUE()->id() => StringValues::COLOR_BLUE, - DyeColor::BROWN()->id() => StringValues::COLOR_BROWN, - DyeColor::CYAN()->id() => StringValues::COLOR_CYAN, - DyeColor::GRAY()->id() => StringValues::COLOR_GRAY, - DyeColor::GREEN()->id() => StringValues::COLOR_GREEN, - DyeColor::LIGHT_BLUE()->id() => StringValues::COLOR_LIGHT_BLUE, - DyeColor::LIGHT_GRAY()->id() => StringValues::COLOR_SILVER, - DyeColor::LIME()->id() => StringValues::COLOR_LIME, - DyeColor::MAGENTA()->id() => StringValues::COLOR_MAGENTA, - DyeColor::ORANGE()->id() => StringValues::COLOR_ORANGE, - DyeColor::PINK()->id() => StringValues::COLOR_PINK, - DyeColor::PURPLE()->id() => StringValues::COLOR_PURPLE, - DyeColor::RED()->id() => StringValues::COLOR_RED, - DyeColor::WHITE()->id() => StringValues::COLOR_WHITE, - DyeColor::YELLOW()->id() => StringValues::COLOR_YELLOW, - default => throw new BlockStateSerializeException("Invalid Color " . $color->name()) + $this->writeString(BlockStateNames::COLOR, match($color){ + DyeColor::BLACK => StringValues::COLOR_BLACK, + DyeColor::BLUE => StringValues::COLOR_BLUE, + DyeColor::BROWN => StringValues::COLOR_BROWN, + DyeColor::CYAN => StringValues::COLOR_CYAN, + DyeColor::GRAY => StringValues::COLOR_GRAY, + DyeColor::GREEN => StringValues::COLOR_GREEN, + DyeColor::LIGHT_BLUE => StringValues::COLOR_LIGHT_BLUE, + DyeColor::LIGHT_GRAY => StringValues::COLOR_SILVER, + DyeColor::LIME => StringValues::COLOR_LIME, + DyeColor::MAGENTA => StringValues::COLOR_MAGENTA, + DyeColor::ORANGE => StringValues::COLOR_ORANGE, + DyeColor::PINK => StringValues::COLOR_PINK, + DyeColor::PURPLE => StringValues::COLOR_PURPLE, + DyeColor::RED => StringValues::COLOR_RED, + DyeColor::WHITE => StringValues::COLOR_WHITE, + DyeColor::YELLOW => StringValues::COLOR_YELLOW, }); return $this; } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index ccf430b9cc..dd506526d6 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -510,7 +510,7 @@ final class ItemSerializerDeserializerRegistrar{ * complex to implement in a generic way. */ private function registerMiscItemMappings() : void{ - foreach(DyeColor::getAll() as $color){ + foreach(DyeColor::cases() as $color){ $id = DyeColorIdMap::getInstance()->toItemId($color); $this->deserializer?->map($id, fn() => Items::DYE()->setColor($color)); } diff --git a/src/entity/projectile/SplashPotion.php b/src/entity/projectile/SplashPotion.php index 17e4d8af71..f4635cad77 100644 --- a/src/entity/projectile/SplashPotion.php +++ b/src/entity/projectile/SplashPotion.php @@ -129,7 +129,7 @@ class SplashPotion extends Throwable{ }else{ //TODO: lingering potions } - }elseif($event instanceof ProjectileHitBlockEvent && $this->getPotionType()->equals(PotionType::WATER())){ + }elseif($event instanceof ProjectileHitBlockEvent && $this->getPotionType() === PotionType::WATER){ $blockIn = $event->getBlockHit()->getSide($event->getRayTraceResult()->getHitFace()); if($blockIn->hasTypeTag(BlockTypeTags::FIRE)){ diff --git a/src/item/Banner.php b/src/item/Banner.php index 250f2099ef..92ec4041ff 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -40,7 +40,7 @@ class Banner extends ItemBlockWallOrFloor{ public const TAG_PATTERN_COLOR = TileBanner::TAG_PATTERN_COLOR; public const TAG_PATTERN_NAME = TileBanner::TAG_PATTERN_NAME; - private DyeColor $color; + private DyeColor $color = DyeColor::BLACK; /** * @var BannerPatternLayer[] @@ -48,11 +48,6 @@ class Banner extends ItemBlockWallOrFloor{ */ private array $patterns = []; - public function __construct(ItemIdentifier $identifier, Block $floorVariant, Block $wallVariant){ - parent::__construct($identifier, $floorVariant, $wallVariant); - $this->color = DyeColor::BLACK(); - } - public function getColor() : DyeColor{ return $this->color; } @@ -102,7 +97,7 @@ class Banner extends ItemBlockWallOrFloor{ if($patterns !== null && $patterns->getTagType() === NBT::TAG_Compound){ /** @var CompoundTag $t */ foreach($patterns as $t){ - $patternColor = $colorIdMap->fromInvertedId($t->getInt(self::TAG_PATTERN_COLOR)) ?? DyeColor::BLACK(); //TODO: missing pattern colour should be an error + $patternColor = $colorIdMap->fromInvertedId($t->getInt(self::TAG_PATTERN_COLOR)) ?? DyeColor::BLACK; //TODO: missing pattern colour should be an error $patternType = $patternIdMap->fromId($t->getString(self::TAG_PATTERN_NAME)); if($patternType === null){ continue; //TODO: this should be an error diff --git a/src/item/Dye.php b/src/item/Dye.php index f71b44e3a9..6fd3f6dcb9 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -27,12 +27,7 @@ use pocketmine\block\utils\DyeColor; use pocketmine\data\runtime\RuntimeDataDescriber; class Dye extends Item{ - private DyeColor $color; - - public function __construct(ItemIdentifier $identifier, string $name){ - $this->color = DyeColor::BLACK(); - parent::__construct($identifier, $name); - } + private DyeColor $color = DyeColor::BLACK; protected function describeState(RuntimeDataDescriber $w) : void{ $w->dyeColor($this->color); diff --git a/src/item/GlassBottle.php b/src/item/GlassBottle.php index 135ba32335..c638b109f7 100644 --- a/src/item/GlassBottle.php +++ b/src/item/GlassBottle.php @@ -33,7 +33,7 @@ class GlassBottle extends Item{ public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ if($blockClicked->getTypeId() === BlockTypeIds::WATER){ $this->pop(); - $returnedItems[] = VanillaItems::POTION()->setType(PotionType::WATER()); + $returnedItems[] = VanillaItems::POTION()->setType(PotionType::WATER); return ItemUseResult::SUCCESS; } diff --git a/src/item/Medicine.php b/src/item/Medicine.php index a15ac03535..1df7484149 100644 --- a/src/item/Medicine.php +++ b/src/item/Medicine.php @@ -29,12 +29,7 @@ use pocketmine\player\Player; class Medicine extends Item implements ConsumableItem{ - private MedicineType $medicineType; - - public function __construct(ItemIdentifier $identifier, string $name){ - $this->medicineType = MedicineType::EYE_DROPS(); - parent::__construct($identifier, $name); - } + private MedicineType $medicineType = MedicineType::EYE_DROPS; protected function describeState(RuntimeDataDescriber $w) : void{ $w->medicineType($this->medicineType); diff --git a/src/item/MedicineType.php b/src/item/MedicineType.php index f7ce2b816d..ea99bb75dc 100644 --- a/src/item/MedicineType.php +++ b/src/item/MedicineType.php @@ -25,42 +25,39 @@ namespace pocketmine\item; use pocketmine\entity\effect\Effect; use pocketmine\entity\effect\VanillaEffects; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static MedicineType ANTIDOTE() * @method static MedicineType ELIXIR() * @method static MedicineType EYE_DROPS() * @method static MedicineType TONIC() */ -final class MedicineType{ - use EnumTrait { - __construct as Enum___construct; +enum MedicineType{ + use LegacyEnumShimTrait; + + case ANTIDOTE; + case ELIXIR; + case EYE_DROPS; + case TONIC; + + /** + * @phpstan-return array{0: string, 1: Effect} + */ + private function getMetadata() : array{ + //cache not required here - VanillaEffects always returns the same object + return match($this){ + self::ANTIDOTE => ['Antidote', VanillaEffects::POISON()], + self::ELIXIR => ['Elixir', VanillaEffects::WEAKNESS()], + self::EYE_DROPS => ['Eye Drops', VanillaEffects::BLINDNESS()], + self::TONIC => ['Tonic', VanillaEffects::NAUSEA()] + }; } - protected static function setup() : void{ - self::registerAll( - new self('antidote', 'Antidote', VanillaEffects::POISON()), - new self('elixir', 'Elixir', VanillaEffects::WEAKNESS()), - new self('eye_drops', 'Eye Drops', VanillaEffects::BLINDNESS()), - new self('tonic', 'Tonic', VanillaEffects::NAUSEA()) - ); - } + public function getDisplayName() : string{ return $this->getMetadata()[0]; } - private function __construct( - string $enumName, - private string $displayName, - private Effect $curedEffect - ){ - $this->Enum___construct($enumName); - } - - public function getDisplayName() : string{ return $this->displayName; } - - public function getCuredEffect() : Effect{ return $this->curedEffect; } + public function getCuredEffect() : Effect{ return $this->getMetadata()[1]; } } diff --git a/src/item/Potion.php b/src/item/Potion.php index 0ef3398666..597430242a 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -29,12 +29,7 @@ use pocketmine\player\Player; class Potion extends Item implements ConsumableItem{ - private PotionType $potionType; - - public function __construct(ItemIdentifier $identifier, string $name){ - $this->potionType = PotionType::WATER(); - parent::__construct($identifier, $name); - } + private PotionType $potionType = PotionType::WATER; protected function describeState(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); diff --git a/src/item/PotionType.php b/src/item/PotionType.php index e7feb0b8ec..3f4773e6de 100644 --- a/src/item/PotionType.php +++ b/src/item/PotionType.php @@ -25,13 +25,12 @@ namespace pocketmine\item; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\effect\VanillaEffects; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; +use function spl_object_id; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static PotionType AWKWARD() * @method static PotionType FIRE_RESISTANCE() @@ -76,157 +75,196 @@ use pocketmine\utils\EnumTrait; * @method static PotionType WATER_BREATHING() * @method static PotionType WEAKNESS() * @method static PotionType WITHER() + * + * @phpstan-type TMetadata array{0: string, 1: \Closure() : list} */ -final class PotionType{ - use EnumTrait { - __construct as Enum___construct; - } +enum PotionType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("water", "Water", fn() => []), - new self("mundane", "Mundane", fn() => []), - new self("long_mundane", "Long Mundane", fn() => []), - new self("thick", "Thick", fn() => []), - new self("awkward", "Awkward", fn() => []), - new self("night_vision", "Night Vision", fn() => [ - new EffectInstance(VanillaEffects::NIGHT_VISION(), 3600) - ]), - new self("long_night_vision", "Long Night Vision", fn() => [ - new EffectInstance(VanillaEffects::NIGHT_VISION(), 9600) - ]), - new self("invisibility", "Invisibility", fn() => [ - new EffectInstance(VanillaEffects::INVISIBILITY(), 3600) - ]), - new self("long_invisibility", "Long Invisibility", fn() => [ - new EffectInstance(VanillaEffects::INVISIBILITY(), 9600) - ]), - new self("leaping", "Leaping", fn() => [ - new EffectInstance(VanillaEffects::JUMP_BOOST(), 3600) - ]), - new self("long_leaping", "Long Leaping", fn() => [ - new EffectInstance(VanillaEffects::JUMP_BOOST(), 9600) - ]), - new self("strong_leaping", "Strong Leaping", fn() => [ - new EffectInstance(VanillaEffects::JUMP_BOOST(), 1800, 1) - ]), - new self("fire_resistance", "Fire Resistance", fn() => [ - new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 3600) - ]), - new self("long_fire_resistance", "Long Fire Resistance", fn() => [ - new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 9600) - ]), - new self("swiftness", "Swiftness", fn() => [ - new EffectInstance(VanillaEffects::SPEED(), 3600) - ]), - new self("long_swiftness", "Long Swiftness", fn() => [ - new EffectInstance(VanillaEffects::SPEED(), 9600) - ]), - new self("strong_swiftness", "Strong Swiftness", fn() => [ - new EffectInstance(VanillaEffects::SPEED(), 1800, 1) - ]), - new self("slowness", "Slowness", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 1800) - ]), - new self("long_slowness", "Long Slowness", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 4800) - ]), - new self("water_breathing", "Water Breathing", fn() => [ - new EffectInstance(VanillaEffects::WATER_BREATHING(), 3600) - ]), - new self("long_water_breathing", "Long Water Breathing", fn() => [ - new EffectInstance(VanillaEffects::WATER_BREATHING(), 9600) - ]), - new self("healing", "Healing", fn() => [ - new EffectInstance(VanillaEffects::INSTANT_HEALTH()) - ]), - new self("strong_healing", "Strong Healing", fn() => [ - new EffectInstance(VanillaEffects::INSTANT_HEALTH(), null, 1) - ]), - new self("harming", "Harming", fn() => [ - new EffectInstance(VanillaEffects::INSTANT_DAMAGE()) - ]), - new self("strong_harming", "Strong Harming", fn() => [ - new EffectInstance(VanillaEffects::INSTANT_DAMAGE(), null, 1) - ]), - new self("poison", "Poison", fn() => [ - new EffectInstance(VanillaEffects::POISON(), 900) - ]), - new self("long_poison", "Long Poison", fn() => [ - new EffectInstance(VanillaEffects::POISON(), 2400) - ]), - new self("strong_poison", "Strong Poison", fn() => [ - new EffectInstance(VanillaEffects::POISON(), 440, 1) - ]), - new self("regeneration", "Regeneration", fn() => [ - new EffectInstance(VanillaEffects::REGENERATION(), 900) - ]), - new self("long_regeneration", "Long Regeneration", fn() => [ - new EffectInstance(VanillaEffects::REGENERATION(), 2400) - ]), - new self("strong_regeneration", "Strong Regeneration", fn() => [ - new EffectInstance(VanillaEffects::REGENERATION(), 440, 1) - ]), - new self("strength", "Strength", fn() => [ - new EffectInstance(VanillaEffects::STRENGTH(), 3600) - ]), - new self("long_strength", "Long Strength", fn() => [ - new EffectInstance(VanillaEffects::STRENGTH(), 9600) - ]), - new self("strong_strength", "Strong Strength", fn() => [ - new EffectInstance(VanillaEffects::STRENGTH(), 1800, 1) - ]), - new self("weakness", "Weakness", fn() => [ - new EffectInstance(VanillaEffects::WEAKNESS(), 1800) - ]), - new self("long_weakness", "Long Weakness", fn() => [ - new EffectInstance(VanillaEffects::WEAKNESS(), 4800) - ]), - new self("wither", "Wither", fn() => [ - new EffectInstance(VanillaEffects::WITHER(), 800, 1) - ]), - new self("turtle_master", "Turtle Master", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 3), - new EffectInstance(VanillaEffects::RESISTANCE(), 20 * 20, 2), - ]), - new self("long_turtle_master", "Long Turtle Master", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 40 * 20, 3), - new EffectInstance(VanillaEffects::RESISTANCE(), 40 * 20, 2), - ]), - new self("strong_turtle_master", "Strong Turtle Master", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 5), - new EffectInstance(VanillaEffects::RESISTANCE(), 20 * 20, 3), - ]), - new self("slow_falling", "Slow Falling", fn() => [ - //TODO - ]), - new self("long_slow_falling", "Long Slow Falling", fn() => [ - //TODO - ]), - new self("strong_slowness", "Strong Slowness", fn() => [ - new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 3) - ]) - ); - } + case WATER; + case MUNDANE; + case LONG_MUNDANE; + case THICK; + case AWKWARD; + case NIGHT_VISION; + case LONG_NIGHT_VISION; + case INVISIBILITY; + case LONG_INVISIBILITY; + case LEAPING; + case LONG_LEAPING; + case STRONG_LEAPING; + case FIRE_RESISTANCE; + case LONG_FIRE_RESISTANCE; + case SWIFTNESS; + case LONG_SWIFTNESS; + case STRONG_SWIFTNESS; + case SLOWNESS; + case LONG_SLOWNESS; + case WATER_BREATHING; + case LONG_WATER_BREATHING; + case HEALING; + case STRONG_HEALING; + case HARMING; + case STRONG_HARMING; + case POISON; + case LONG_POISON; + case STRONG_POISON; + case REGENERATION; + case LONG_REGENERATION; + case STRONG_REGENERATION; + case STRENGTH; + case LONG_STRENGTH; + case STRONG_STRENGTH; + case WEAKNESS; + case LONG_WEAKNESS; + case WITHER; + case TURTLE_MASTER; + case LONG_TURTLE_MASTER; + case STRONG_TURTLE_MASTER; + case SLOW_FALLING; + case LONG_SLOW_FALLING; + case STRONG_SLOWNESS; /** - * @phpstan-param \Closure() : list $effectsGetter + * @phpstan-return TMetadata */ - private function __construct( - string $enumName, - private string $displayName, - private \Closure $effectsGetter - ){ - $this->Enum___construct($enumName); + private function getMetadata() : array{ + /** @phpstan-var array $cache */ + static $cache = []; + + return $cache[spl_object_id($this)] ??= match($this){ + self::WATER => ["Water", fn() => []], + self::MUNDANE => ["Mundane", fn() => []], + self::LONG_MUNDANE => ["Long Mundane", fn() => []], + self::THICK => ["Thick", fn() => []], + self::AWKWARD => ["Awkward", fn() => []], + self::NIGHT_VISION => ["Night Vision", fn() => [ + new EffectInstance(VanillaEffects::NIGHT_VISION(), 3600) + ]], + self::LONG_NIGHT_VISION => ["Long Night Vision", fn() => [ + new EffectInstance(VanillaEffects::NIGHT_VISION(), 9600) + ]], + self::INVISIBILITY => ["Invisibility", fn() => [ + new EffectInstance(VanillaEffects::INVISIBILITY(), 3600) + ]], + self::LONG_INVISIBILITY => ["Long Invisibility", fn() => [ + new EffectInstance(VanillaEffects::INVISIBILITY(), 9600) + ]], + self::LEAPING => ["Leaping", fn() => [ + new EffectInstance(VanillaEffects::JUMP_BOOST(), 3600) + ]], + self::LONG_LEAPING => ["Long Leaping", fn() => [ + new EffectInstance(VanillaEffects::JUMP_BOOST(), 9600) + ]], + self::STRONG_LEAPING => ["Strong Leaping", fn() => [ + new EffectInstance(VanillaEffects::JUMP_BOOST(), 1800, 1) + ]], + self::FIRE_RESISTANCE => ["Fire Resistance", fn() => [ + new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 3600) + ]], + self::LONG_FIRE_RESISTANCE => ["Long Fire Resistance", fn() => [ + new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 9600) + ]], + self::SWIFTNESS => ["Swiftness", fn() => [ + new EffectInstance(VanillaEffects::SPEED(), 3600) + ]], + self::LONG_SWIFTNESS => ["Long Swiftness", fn() => [ + new EffectInstance(VanillaEffects::SPEED(), 9600) + ]], + self::STRONG_SWIFTNESS => ["Strong Swiftness", fn() => [ + new EffectInstance(VanillaEffects::SPEED(), 1800, 1) + ]], + self::SLOWNESS => ["Slowness", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 1800) + ]], + self::LONG_SLOWNESS => ["Long Slowness", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 4800) + ]], + self::WATER_BREATHING => ["Water Breathing", fn() => [ + new EffectInstance(VanillaEffects::WATER_BREATHING(), 3600) + ]], + self::LONG_WATER_BREATHING => ["Long Water Breathing", fn() => [ + new EffectInstance(VanillaEffects::WATER_BREATHING(), 9600) + ]], + self::HEALING => ["Healing", fn() => [ + new EffectInstance(VanillaEffects::INSTANT_HEALTH()) + ]], + self::STRONG_HEALING => ["Strong Healing", fn() => [ + new EffectInstance(VanillaEffects::INSTANT_HEALTH(), null, 1) + ]], + self::HARMING => ["Harming", fn() => [ + new EffectInstance(VanillaEffects::INSTANT_DAMAGE()) + ]], + self::STRONG_HARMING => ["Strong Harming", fn() => [ + new EffectInstance(VanillaEffects::INSTANT_DAMAGE(), null, 1) + ]], + self::POISON => ["Poison", fn() => [ + new EffectInstance(VanillaEffects::POISON(), 900) + ]], + self::LONG_POISON => ["Long Poison", fn() => [ + new EffectInstance(VanillaEffects::POISON(), 2400) + ]], + self::STRONG_POISON => ["Strong Poison", fn() => [ + new EffectInstance(VanillaEffects::POISON(), 440, 1) + ]], + self::REGENERATION => ["Regeneration", fn() => [ + new EffectInstance(VanillaEffects::REGENERATION(), 900) + ]], + self::LONG_REGENERATION => ["Long Regeneration", fn() => [ + new EffectInstance(VanillaEffects::REGENERATION(), 2400) + ]], + self::STRONG_REGENERATION => ["Strong Regeneration", fn() => [ + new EffectInstance(VanillaEffects::REGENERATION(), 440, 1) + ]], + self::STRENGTH => ["Strength", fn() => [ + new EffectInstance(VanillaEffects::STRENGTH(), 3600) + ]], + self::LONG_STRENGTH => ["Long Strength", fn() => [ + new EffectInstance(VanillaEffects::STRENGTH(), 9600) + ]], + self::STRONG_STRENGTH => ["Strong Strength", fn() => [ + new EffectInstance(VanillaEffects::STRENGTH(), 1800, 1) + ]], + self::WEAKNESS => ["Weakness", fn() => [ + new EffectInstance(VanillaEffects::WEAKNESS(), 1800) + ]], + self::LONG_WEAKNESS => ["Long Weakness", fn() => [ + new EffectInstance(VanillaEffects::WEAKNESS(), 4800) + ]], + self::WITHER => ["Wither", fn() => [ + new EffectInstance(VanillaEffects::WITHER(), 800, 1) + ]], + self::TURTLE_MASTER => ["Turtle Master", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 3), + new EffectInstance(VanillaEffects::RESISTANCE(), 20 * 20, 2), + ]], + self::LONG_TURTLE_MASTER => ["Long Turtle Master", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 40 * 20, 3), + new EffectInstance(VanillaEffects::RESISTANCE(), 40 * 20, 2), + ]], + self::STRONG_TURTLE_MASTER => ["Strong Turtle Master", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 5), + new EffectInstance(VanillaEffects::RESISTANCE(), 20 * 20, 3), + ]], + self::SLOW_FALLING => ["Slow Falling", fn() => [ + //TODO + ]], + self::LONG_SLOW_FALLING => ["Long Slow Falling", fn() => [ + //TODO + ]], + self::STRONG_SLOWNESS => ["Strong Slowness", fn() => [ + new EffectInstance(VanillaEffects::SLOWNESS(), 20 * 20, 3) + ]] + }; } - public function getDisplayName() : string{ return $this->displayName; } + public function getDisplayName() : string{ return $this->getMetadata()[0]; } /** * @return EffectInstance[] * @phpstan-return list */ public function getEffects() : array{ - return ($this->effectsGetter)(); + return ($this->getMetadata()[1])(); } } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index c54562f2b0..8c18fd54c0 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -31,12 +31,7 @@ use pocketmine\player\Player; class SplashPotion extends ProjectileItem{ - private PotionType $potionType; - - public function __construct(ItemIdentifier $identifier, string $name){ - $this->potionType = PotionType::WATER(); - parent::__construct($identifier, $name); - } + private PotionType $potionType = PotionType::WATER; protected function describeState(RuntimeDataDescriber $w) : void{ $w->potionType($this->potionType); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 296dd03415..f4ebcaad24 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -59,8 +59,8 @@ final class StringToItemParser extends StringToTParser{ } private static function registerDynamicBlocks(self $result) : void{ - foreach(DyeColor::getAll() as $color){ - $register = fn(string $name, \Closure $callback) => $result->registerBlock($color->name() . "_" . $name, $callback); + foreach(DyeColor::cases() as $color){ + $register = fn(string $name, \Closure $callback) => $result->registerBlock(strtolower($color->name) . "_" . $name, $callback); //wall and floor banner are the same item $register("banner", fn() => Blocks::BANNER()->setColor($color)); $register("bed", fn() => Blocks::BED()->setColor($color)); @@ -1144,13 +1144,13 @@ final class StringToItemParser extends StringToTParser{ } private static function registerDynamicItems(self $result) : void{ - foreach(DyeColor::getAll() as $color){ - $prefix = fn(string $name) => $color->name() . "_" . $name; + foreach(DyeColor::cases() as $color){ + $prefix = fn(string $name) => strtolower($color->name) . "_" . $name; $result->register($prefix("dye"), fn() => Items::DYE()->setColor($color)); } - foreach(SuspiciousStewType::getAll() as $suspiciousStewType){ - $prefix = fn(string $name) => $suspiciousStewType->name() . "_" . $name; + foreach(SuspiciousStewType::cases() as $suspiciousStewType){ + $prefix = fn(string $name) => strtolower($suspiciousStewType->name) . "_" . $name; $result->register($prefix("suspicious_stew"), fn() => Items::SUSPICIOUS_STEW()->setType($suspiciousStewType)); } @@ -1160,13 +1160,13 @@ final class StringToItemParser extends StringToTParser{ $result->register("acacia_boat", fn() => Items::ACACIA_BOAT()); $result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD()); - $result->register("antidote", fn() => Items::MEDICINE()->setType(MedicineType::ANTIDOTE())); + $result->register("antidote", fn() => Items::MEDICINE()->setType(MedicineType::ANTIDOTE)); $result->register("apple", fn() => Items::APPLE()); $result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("arrow", fn() => Items::ARROW()); - $result->register("awkward_potion", fn() => Items::POTION()->setType(PotionType::AWKWARD())); - $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD())); + $result->register("awkward_potion", fn() => Items::POTION()->setType(PotionType::AWKWARD)); + $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD)); $result->register("baked_potato", fn() => Items::BAKED_POTATO()); $result->register("baked_potatoes", fn() => Items::BAKED_POTATO()); $result->register("beef", fn() => Items::RAW_BEEF()); @@ -1276,19 +1276,19 @@ final class StringToItemParser extends StringToTParser{ $result->register("dye", fn() => Items::INK_SAC()); $result->register("echo_shard", fn() => Items::ECHO_SHARD()); $result->register("egg", fn() => Items::EGG()); - $result->register("elixir", fn() => Items::MEDICINE()->setType(MedicineType::ELIXIR())); + $result->register("elixir", fn() => Items::MEDICINE()->setType(MedicineType::ELIXIR)); $result->register("emerald", fn() => Items::EMERALD()); $result->register("enchanted_book", fn() => Items::ENCHANTED_BOOK()); $result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("ender_pearl", fn() => Items::ENDER_PEARL()); $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); - $result->register("eye_drops", fn() => Items::MEDICINE()->setType(MedicineType::EYE_DROPS())); + $result->register("eye_drops", fn() => Items::MEDICINE()->setType(MedicineType::EYE_DROPS)); $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); $result->register("fire_charge", fn() => Items::FIRE_CHARGE()); - $result->register("fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::FIRE_RESISTANCE())); - $result->register("fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::FIRE_RESISTANCE())); + $result->register("fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::FIRE_RESISTANCE)); + $result->register("fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::FIRE_RESISTANCE)); $result->register("fish", fn() => Items::RAW_FISH()); $result->register("fishing_rod", fn() => Items::FISHING_ROD()); $result->register("flint", fn() => Items::FLINT()); @@ -1324,16 +1324,16 @@ final class StringToItemParser extends StringToTParser{ $result->register("golden_shovel", fn() => Items::GOLDEN_SHOVEL()); $result->register("golden_sword", fn() => Items::GOLDEN_SWORD()); $result->register("gunpowder", fn() => Items::GUNPOWDER()); - $result->register("harming_potion", fn() => Items::POTION()->setType(PotionType::HARMING())); - $result->register("harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HARMING())); - $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING())); - $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING())); + $result->register("harming_potion", fn() => Items::POTION()->setType(PotionType::HARMING)); + $result->register("harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HARMING)); + $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING)); + $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING)); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); $result->register("honey_bottle", fn() => Items::HONEY_BOTTLE()); $result->register("honeycomb", fn() => Items::HONEYCOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); - $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY())); - $result->register("invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::INVISIBILITY())); + $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY)); + $result->register("invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::INVISIBILITY)); $result->register("iron_axe", fn() => Items::IRON_AXE()); $result->register("iron_boots", fn() => Items::IRON_BOOTS()); $result->register("iron_chestplate", fn() => Items::IRON_CHESTPLATE()); @@ -1348,8 +1348,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("jungle_boat", fn() => Items::JUNGLE_BOAT()); $result->register("lapis_lazuli", fn() => Items::LAPIS_LAZULI()); $result->register("lava_bucket", fn() => Items::LAVA_BUCKET()); - $result->register("leaping_potion", fn() => Items::POTION()->setType(PotionType::LEAPING())); - $result->register("leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LEAPING())); + $result->register("leaping_potion", fn() => Items::POTION()->setType(PotionType::LEAPING)); + $result->register("leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LEAPING)); $result->register("leather", fn() => Items::LEATHER()); $result->register("leather_boots", fn() => Items::LEATHER_BOOTS()); $result->register("leather_cap", fn() => Items::LEATHER_CAP()); @@ -1358,42 +1358,42 @@ final class StringToItemParser extends StringToTParser{ $result->register("leather_leggings", fn() => Items::LEATHER_PANTS()); $result->register("leather_pants", fn() => Items::LEATHER_PANTS()); $result->register("leather_tunic", fn() => Items::LEATHER_TUNIC()); - $result->register("long_fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); - $result->register("long_fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_FIRE_RESISTANCE())); - $result->register("long_invisibility_potion", fn() => Items::POTION()->setType(PotionType::LONG_INVISIBILITY())); - $result->register("long_invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_INVISIBILITY())); - $result->register("long_leaping_potion", fn() => Items::POTION()->setType(PotionType::LONG_LEAPING())); - $result->register("long_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_LEAPING())); - $result->register("long_mundane_potion", fn() => Items::POTION()->setType(PotionType::LONG_MUNDANE())); - $result->register("long_mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_MUNDANE())); - $result->register("long_night_vision_potion", fn() => Items::POTION()->setType(PotionType::LONG_NIGHT_VISION())); - $result->register("long_night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_NIGHT_VISION())); - $result->register("long_poison_potion", fn() => Items::POTION()->setType(PotionType::LONG_POISON())); - $result->register("long_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_POISON())); - $result->register("long_regeneration_potion", fn() => Items::POTION()->setType(PotionType::LONG_REGENERATION())); - $result->register("long_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_REGENERATION())); - $result->register("long_slow_falling_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOW_FALLING())); - $result->register("long_slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOW_FALLING())); - $result->register("long_slowness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOWNESS())); - $result->register("long_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOWNESS())); - $result->register("long_strength_potion", fn() => Items::POTION()->setType(PotionType::LONG_STRENGTH())); - $result->register("long_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_STRENGTH())); - $result->register("long_swiftness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SWIFTNESS())); - $result->register("long_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SWIFTNESS())); - $result->register("long_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::LONG_TURTLE_MASTER())); - $result->register("long_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_TURTLE_MASTER())); - $result->register("long_water_breathing_potion", fn() => Items::POTION()->setType(PotionType::LONG_WATER_BREATHING())); - $result->register("long_water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WATER_BREATHING())); - $result->register("long_weakness_potion", fn() => Items::POTION()->setType(PotionType::LONG_WEAKNESS())); - $result->register("long_weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WEAKNESS())); + $result->register("long_fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::LONG_FIRE_RESISTANCE)); + $result->register("long_fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_FIRE_RESISTANCE)); + $result->register("long_invisibility_potion", fn() => Items::POTION()->setType(PotionType::LONG_INVISIBILITY)); + $result->register("long_invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_INVISIBILITY)); + $result->register("long_leaping_potion", fn() => Items::POTION()->setType(PotionType::LONG_LEAPING)); + $result->register("long_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_LEAPING)); + $result->register("long_mundane_potion", fn() => Items::POTION()->setType(PotionType::LONG_MUNDANE)); + $result->register("long_mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_MUNDANE)); + $result->register("long_night_vision_potion", fn() => Items::POTION()->setType(PotionType::LONG_NIGHT_VISION)); + $result->register("long_night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_NIGHT_VISION)); + $result->register("long_poison_potion", fn() => Items::POTION()->setType(PotionType::LONG_POISON)); + $result->register("long_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_POISON)); + $result->register("long_regeneration_potion", fn() => Items::POTION()->setType(PotionType::LONG_REGENERATION)); + $result->register("long_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_REGENERATION)); + $result->register("long_slow_falling_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOW_FALLING)); + $result->register("long_slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOW_FALLING)); + $result->register("long_slowness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOWNESS)); + $result->register("long_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOWNESS)); + $result->register("long_strength_potion", fn() => Items::POTION()->setType(PotionType::LONG_STRENGTH)); + $result->register("long_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_STRENGTH)); + $result->register("long_swiftness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SWIFTNESS)); + $result->register("long_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SWIFTNESS)); + $result->register("long_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::LONG_TURTLE_MASTER)); + $result->register("long_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_TURTLE_MASTER)); + $result->register("long_water_breathing_potion", fn() => Items::POTION()->setType(PotionType::LONG_WATER_BREATHING)); + $result->register("long_water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WATER_BREATHING)); + $result->register("long_weakness_potion", fn() => Items::POTION()->setType(PotionType::LONG_WEAKNESS)); + $result->register("long_weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WEAKNESS)); $result->register("magma_cream", fn() => Items::MAGMA_CREAM()); $result->register("melon", fn() => Items::MELON()); $result->register("melon_seeds", fn() => Items::MELON_SEEDS()); $result->register("melon_slice", fn() => Items::MELON()); $result->register("milk_bucket", fn() => Items::MILK_BUCKET()); $result->register("minecart", fn() => Items::MINECART()); - $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE())); - $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE())); + $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE)); + $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE)); $result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW()); $result->register("mutton", fn() => Items::RAW_MUTTON()); $result->register("mutton_cooked", fn() => Items::COOKED_MUTTON()); @@ -1417,14 +1417,14 @@ final class StringToItemParser extends StringToTParser{ $result->register("netherite_shovel", fn() => Items::NETHERITE_SHOVEL()); $result->register("netherite_sword", fn() => Items::NETHERITE_SWORD()); $result->register("netherstar", fn() => Items::NETHER_STAR()); - $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION())); - $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION())); + $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION)); + $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION)); $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); $result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE()); - $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON())); - $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON())); + $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON)); + $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON)); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); $result->register("popped_chorus_fruit", fn() => Items::POPPED_CHORUS_FRUIT()); $result->register("porkchop", fn() => Items::RAW_PORKCHOP()); @@ -1469,8 +1469,8 @@ final class StringToItemParser extends StringToTParser{ $result->register("record_ward", fn() => Items::RECORD_WARD()); $result->register("redstone", fn() => Items::REDSTONE_DUST()); $result->register("redstone_dust", fn() => Items::REDSTONE_DUST()); - $result->register("regeneration_potion", fn() => Items::POTION()->setType(PotionType::REGENERATION())); - $result->register("regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::REGENERATION())); + $result->register("regeneration_potion", fn() => Items::POTION()->setType(PotionType::REGENERATION)); + $result->register("regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::REGENERATION)); $result->register("rotten_flesh", fn() => Items::ROTTEN_FLESH()); $result->register("salmon", fn() => Items::RAW_SALMON()); $result->register("scute", fn() => Items::SCUTE()); @@ -1479,10 +1479,10 @@ final class StringToItemParser extends StringToTParser{ $result->register("shulker_shell", fn() => Items::SHULKER_SHELL()); $result->register("slime_ball", fn() => Items::SLIMEBALL()); $result->register("slimeball", fn() => Items::SLIMEBALL()); - $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING())); - $result->register("slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOW_FALLING())); - $result->register("slowness_potion", fn() => Items::POTION()->setType(PotionType::SLOWNESS())); - $result->register("slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOWNESS())); + $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING)); + $result->register("slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOW_FALLING)); + $result->register("slowness_potion", fn() => Items::POTION()->setType(PotionType::SLOWNESS)); + $result->register("slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOWNESS)); $result->register("snowball", fn() => Items::SNOWBALL()); $result->register("speckled_melon", fn() => Items::GLISTERING_MELON()); $result->register("spider_eye", fn() => Items::SPIDER_EYE()); @@ -1498,52 +1498,52 @@ final class StringToItemParser extends StringToTParser{ $result->register("stone_pickaxe", fn() => Items::STONE_PICKAXE()); $result->register("stone_shovel", fn() => Items::STONE_SHOVEL()); $result->register("stone_sword", fn() => Items::STONE_SWORD()); - $result->register("strength_potion", fn() => Items::POTION()->setType(PotionType::STRENGTH())); - $result->register("strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRENGTH())); + $result->register("strength_potion", fn() => Items::POTION()->setType(PotionType::STRENGTH)); + $result->register("strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRENGTH)); $result->register("string", fn() => Items::STRING()); - $result->register("strong_harming_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HARMING())); - $result->register("strong_harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HARMING())); - $result->register("strong_healing_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HEALING())); - $result->register("strong_healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HEALING())); - $result->register("strong_leaping_potion", fn() => Items::POTION()->setType(PotionType::STRONG_LEAPING())); - $result->register("strong_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_LEAPING())); - $result->register("strong_poison_potion", fn() => Items::POTION()->setType(PotionType::STRONG_POISON())); - $result->register("strong_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_POISON())); - $result->register("strong_regeneration_potion", fn() => Items::POTION()->setType(PotionType::STRONG_REGENERATION())); - $result->register("strong_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_REGENERATION())); - $result->register("strong_slowness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SLOWNESS())); - $result->register("strong_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SLOWNESS())); - $result->register("strong_strength_potion", fn() => Items::POTION()->setType(PotionType::STRONG_STRENGTH())); - $result->register("strong_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_STRENGTH())); - $result->register("strong_swiftness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SWIFTNESS())); - $result->register("strong_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SWIFTNESS())); - $result->register("strong_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); - $result->register("strong_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_TURTLE_MASTER())); + $result->register("strong_harming_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HARMING)); + $result->register("strong_harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HARMING)); + $result->register("strong_healing_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HEALING)); + $result->register("strong_healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HEALING)); + $result->register("strong_leaping_potion", fn() => Items::POTION()->setType(PotionType::STRONG_LEAPING)); + $result->register("strong_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_LEAPING)); + $result->register("strong_poison_potion", fn() => Items::POTION()->setType(PotionType::STRONG_POISON)); + $result->register("strong_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_POISON)); + $result->register("strong_regeneration_potion", fn() => Items::POTION()->setType(PotionType::STRONG_REGENERATION)); + $result->register("strong_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_REGENERATION)); + $result->register("strong_slowness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SLOWNESS)); + $result->register("strong_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SLOWNESS)); + $result->register("strong_strength_potion", fn() => Items::POTION()->setType(PotionType::STRONG_STRENGTH)); + $result->register("strong_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_STRENGTH)); + $result->register("strong_swiftness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SWIFTNESS)); + $result->register("strong_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SWIFTNESS)); + $result->register("strong_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::STRONG_TURTLE_MASTER)); + $result->register("strong_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_TURTLE_MASTER)); $result->register("sugar", fn() => Items::SUGAR()); $result->register("suspicious_stew", fn() => Items::SUSPICIOUS_STEW()); $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); - $result->register("swiftness_potion", fn() => Items::POTION()->setType(PotionType::SWIFTNESS())); - $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS())); - $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK())); - $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK())); - $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC())); + $result->register("swiftness_potion", fn() => Items::POTION()->setType(PotionType::SWIFTNESS)); + $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS)); + $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK)); + $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK)); + $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC)); $result->register("totem", fn() => Items::TOTEM()); $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); - $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER())); - $result->register("turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::TURTLE_MASTER())); + $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER)); + $result->register("turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::TURTLE_MASTER)); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); $result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG()); - $result->register("water_breathing_potion", fn() => Items::POTION()->setType(PotionType::WATER_BREATHING())); - $result->register("water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER_BREATHING())); + $result->register("water_breathing_potion", fn() => Items::POTION()->setType(PotionType::WATER_BREATHING)); + $result->register("water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER_BREATHING)); $result->register("water_bucket", fn() => Items::WATER_BUCKET()); - $result->register("water_potion", fn() => Items::POTION()->setType(PotionType::WATER())); - $result->register("water_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER())); - $result->register("weakness_potion", fn() => Items::POTION()->setType(PotionType::WEAKNESS())); - $result->register("weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WEAKNESS())); + $result->register("water_potion", fn() => Items::POTION()->setType(PotionType::WATER)); + $result->register("water_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER)); + $result->register("weakness_potion", fn() => Items::POTION()->setType(PotionType::WEAKNESS)); + $result->register("weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WEAKNESS)); $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); - $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER())); - $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER())); + $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER)); + $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER)); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); $result->register("wooden_pickaxe", fn() => Items::WOODEN_PICKAXE()); diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php index a2adc0b617..8d7c2ff3ac 100644 --- a/src/item/SuspiciousStew.php +++ b/src/item/SuspiciousStew.php @@ -27,12 +27,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; class SuspiciousStew extends Food{ - private SuspiciousStewType $suspiciousStewType; - - public function __construct(ItemIdentifier $identifier, string $name){ - $this->suspiciousStewType = SuspiciousStewType::POPPY(); - parent::__construct($identifier, $name); - } + private SuspiciousStewType $suspiciousStewType = SuspiciousStewType::POPPY; protected function describeState(RuntimeDataDescriber $w) : void{ $w->suspiciousStewType($this->suspiciousStewType); diff --git a/src/item/SuspiciousStewType.php b/src/item/SuspiciousStewType.php index 27209b5731..d53b82a3fa 100644 --- a/src/item/SuspiciousStewType.php +++ b/src/item/SuspiciousStewType.php @@ -25,13 +25,11 @@ namespace pocketmine\item; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\effect\VanillaEffects; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static SuspiciousStewType ALLIUM() * @method static SuspiciousStewType AZURE_BLUET() @@ -44,61 +42,36 @@ use pocketmine\utils\EnumTrait; * @method static SuspiciousStewType TULIP() * @method static SuspiciousStewType WITHER_ROSE() */ -final class SuspiciousStewType{ - use EnumTrait { - __construct as Enum___construct; - } +enum SuspiciousStewType{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("poppy", fn() => [ - new EffectInstance(VanillaEffects::NIGHT_VISION(), 80) - ]), - new self("cornflower", fn() => [ - new EffectInstance(VanillaEffects::JUMP_BOOST(), 80) - ]), - new self("tulip", fn() => [ - new EffectInstance(VanillaEffects::WEAKNESS(), 140) - ]), - new self("azure_bluet", fn() => [ - new EffectInstance(VanillaEffects::BLINDNESS(), 120) - ]), - new self("lily_of_the_valley", fn() => [ - new EffectInstance(VanillaEffects::POISON(), 200) - ]), - new self("dandelion", fn() => [ - new EffectInstance(VanillaEffects::SATURATION(), 6) - ]), - new self("blue_orchid", fn() => [ - new EffectInstance(VanillaEffects::SATURATION(), 6) - ]), - new self("allium", fn() => [ - new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 40) - ]), - new self("oxeye_daisy", fn() => [ - new EffectInstance(VanillaEffects::REGENERATION(), 120) - ]), - new self("wither_rose", fn() => [ - new EffectInstance(VanillaEffects::WITHER(), 120) - ]) - ); - } - - /** - * @phpstan-param \Closure() : list $effectsGetter - */ - private function __construct( - string $enumName, - private \Closure $effectsGetter - ){ - $this->Enum___construct($enumName); - } + case POPPY; + case CORNFLOWER; + case TULIP; + case AZURE_BLUET; + case LILY_OF_THE_VALLEY; + case DANDELION; + case BLUE_ORCHID; + case ALLIUM; + case OXEYE_DAISY; + case WITHER_ROSE; /** * @return EffectInstance[] * @phpstan-return list */ public function getEffects() : array{ - return ($this->effectsGetter)(); + return match($this){ + self::POPPY => [new EffectInstance(VanillaEffects::NIGHT_VISION(), 80)], + self::CORNFLOWER => [new EffectInstance(VanillaEffects::JUMP_BOOST(), 80)], + self::TULIP => [new EffectInstance(VanillaEffects::WEAKNESS(), 140)], + self::AZURE_BLUET => [new EffectInstance(VanillaEffects::BLINDNESS(), 120)], + self::LILY_OF_THE_VALLEY => [new EffectInstance(VanillaEffects::POISON(), 200)], + self::DANDELION, + self::BLUE_ORCHID => [new EffectInstance(VanillaEffects::SATURATION(), 6)], + self::ALLIUM => [new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 40)], + self::OXEYE_DAISY => [new EffectInstance(VanillaEffects::REGENERATION(), 120)], + self::WITHER_ROSE => [new EffectInstance(VanillaEffects::WITHER(), 120)] + }; } } diff --git a/src/item/TieredTool.php b/src/item/TieredTool.php index dc00aebcf8..20b40bbcb4 100644 --- a/src/item/TieredTool.php +++ b/src/item/TieredTool.php @@ -51,7 +51,7 @@ abstract class TieredTool extends Tool{ } public function getFuelTime() : int{ - if($this->tier->equals(ToolTier::WOOD())){ + if($this->tier === ToolTier::WOOD){ return 200; } @@ -59,6 +59,6 @@ abstract class TieredTool extends Tool{ } public function isFireProof() : bool{ - return $this->tier->equals(ToolTier::NETHERITE()); + return $this->tier === ToolTier::NETHERITE; } } diff --git a/src/item/ToolTier.php b/src/item/ToolTier.php index 4ca910c0bb..6c7161c338 100644 --- a/src/item/ToolTier.php +++ b/src/item/ToolTier.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; /** * This doc-block is generated automatically, do not modify it manually. @@ -37,48 +37,55 @@ use pocketmine\utils\EnumTrait; * @method static ToolTier NETHERITE() * @method static ToolTier STONE() * @method static ToolTier WOOD() + * + * @phpstan-type TMetadata array{0: int, 1: int, 2: int, 3: int, 4: int} */ -final class ToolTier{ - use EnumTrait { - __construct as Enum___construct; +enum ToolTier{ + use LegacyEnumShimTrait; + + case WOOD; + case GOLD; + case STONE; + case IRON; + case DIAMOND; + case NETHERITE; + + /** + * This function exists only to permit the use of named arguments and to make the code easier to read in PhpStorm. + * @phpstan-return TMetadata + */ + private static function meta(int $harvestLevel, int $maxDurability, int $baseAttackPoints, int $baseEfficiency, int $enchantability) : array{ + return [$harvestLevel, $maxDurability, $baseAttackPoints, $baseEfficiency, $enchantability]; } - protected static function setup() : void{ - self::registerAll( - new self("wood", 1, 60, 5, 2, 15), - new self("gold", 2, 33, 5, 12, 22), - new self("stone", 3, 132, 6, 4, 5), - new self("iron", 4, 251, 7, 6, 14), - new self("diamond", 5, 1562, 8, 8, 10), - new self("netherite", 6, 2032, 9, 9, 15) - ); - } - - private function __construct( - string $name, - private int $harvestLevel, - private int $maxDurability, - private int $baseAttackPoints, - private int $baseEfficiency, - private int $enchantability - ){ - $this->Enum___construct($name); + /** + * @phpstan-return TMetadata + */ + private function getMetadata() : array{ + return match($this){ + self::WOOD => self::meta(1, 60, 5, 2, 15), + self::GOLD => self::meta(2, 33, 5, 12, 22), + self::STONE => self::meta(3, 132, 6, 4, 5), + self::IRON => self::meta(4, 251, 7, 6, 14), + self::DIAMOND => self::meta(5, 1562, 8, 8, 10), + self::NETHERITE => self::meta(6, 2032, 9, 9, 15) + }; } public function getHarvestLevel() : int{ - return $this->harvestLevel; + return $this->getMetadata()[0]; } public function getMaxDurability() : int{ - return $this->maxDurability; + return $this->getMetadata()[1]; } public function getBaseAttackPoints() : int{ - return $this->baseAttackPoints; + return $this->getMetadata()[2]; } public function getBaseEfficiency() : int{ - return $this->baseEfficiency; + return $this->getMetadata()[3]; } /** @@ -88,6 +95,6 @@ final class ToolTier{ * or multiple enchantments upon being enchanted in an enchanting table. */ public function getEnchantability() : int{ - return $this->enchantability; + return $this->getMetadata()[4]; } } diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index d76452f973..f4f0b19a20 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -506,21 +506,21 @@ final class VanillaItems{ self::register("raw_porkchop", new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); self::register("raw_rabbit", new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); self::register("raw_salmon", new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); - self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); - self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); - self::register("record_5", new Record(new IID(Ids::RECORD_5), RecordType::DISK_5(), "Record 5")); - self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); - self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); - self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); - self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); - self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); - self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); - self::register("record_otherside", new Record(new IID(Ids::RECORD_OTHERSIDE), RecordType::DISK_OTHERSIDE(), "Record Otherside")); - self::register("record_pigstep", new Record(new IID(Ids::RECORD_PIGSTEP), RecordType::DISK_PIGSTEP(), "Record Pigstep")); - self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); - self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); - self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); - self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); + self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11, "Record 11")); + self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13, "Record 13")); + self::register("record_5", new Record(new IID(Ids::RECORD_5), RecordType::DISK_5, "Record 5")); + self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS, "Record Blocks")); + self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT, "Record Cat")); + self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP, "Record Chirp")); + self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR, "Record Far")); + self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL, "Record Mall")); + self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI, "Record Mellohi")); + self::register("record_otherside", new Record(new IID(Ids::RECORD_OTHERSIDE), RecordType::DISK_OTHERSIDE, "Record Otherside")); + self::register("record_pigstep", new Record(new IID(Ids::RECORD_PIGSTEP), RecordType::DISK_PIGSTEP, "Record Pigstep")); + self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL, "Record Stal")); + self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD, "Record Strad")); + self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT, "Record Wait")); + self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD, "Record Ward")); self::register("redstone_dust", new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); self::register("rotten_flesh", new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); @@ -579,36 +579,36 @@ final class VanillaItems{ } private static function registerTierToolItems() : void{ - self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND(), [EnchantmentTags::AXE])); - self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD(), [EnchantmentTags::AXE])); - self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON(), [EnchantmentTags::AXE])); - self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE(), [EnchantmentTags::AXE])); - self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE(), [EnchantmentTags::AXE])); - self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD(), [EnchantmentTags::AXE])); - self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND(), [EnchantmentTags::HOE])); - self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD(), [EnchantmentTags::HOE])); - self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON(), [EnchantmentTags::HOE])); - self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE(), [EnchantmentTags::HOE])); - self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE(), [EnchantmentTags::HOE])); - self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD(), [EnchantmentTags::HOE])); - self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND(), [EnchantmentTags::PICKAXE])); - self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD(), [EnchantmentTags::PICKAXE])); - self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON(), [EnchantmentTags::PICKAXE])); - self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE(), [EnchantmentTags::PICKAXE])); - self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE(), [EnchantmentTags::PICKAXE])); - self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD(), [EnchantmentTags::PICKAXE])); - self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND(), [EnchantmentTags::SHOVEL])); - self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD(), [EnchantmentTags::SHOVEL])); - self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON(), [EnchantmentTags::SHOVEL])); - self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE(), [EnchantmentTags::SHOVEL])); - self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE(), [EnchantmentTags::SHOVEL])); - self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD(), [EnchantmentTags::SHOVEL])); - self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND(), [EnchantmentTags::SWORD])); - self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD(), [EnchantmentTags::SWORD])); - self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON(), [EnchantmentTags::SWORD])); - self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE(), [EnchantmentTags::SWORD])); - self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE(), [EnchantmentTags::SWORD])); - self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD(), [EnchantmentTags::SWORD])); + self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND, [EnchantmentTags::AXE])); + self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD, [EnchantmentTags::AXE])); + self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON, [EnchantmentTags::AXE])); + self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE, [EnchantmentTags::AXE])); + self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE, [EnchantmentTags::AXE])); + self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD, [EnchantmentTags::AXE])); + self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND, [EnchantmentTags::HOE])); + self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD, [EnchantmentTags::HOE])); + self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON, [EnchantmentTags::HOE])); + self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE, [EnchantmentTags::HOE])); + self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE, [EnchantmentTags::HOE])); + self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD, [EnchantmentTags::HOE])); + self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND, [EnchantmentTags::PICKAXE])); + self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD, [EnchantmentTags::PICKAXE])); + self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON, [EnchantmentTags::PICKAXE])); + self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE, [EnchantmentTags::PICKAXE])); + self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE, [EnchantmentTags::PICKAXE])); + self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD, [EnchantmentTags::PICKAXE])); + self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND, [EnchantmentTags::SHOVEL])); + self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD, [EnchantmentTags::SHOVEL])); + self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON, [EnchantmentTags::SHOVEL])); + self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE, [EnchantmentTags::SHOVEL])); + self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE, [EnchantmentTags::SHOVEL])); + self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD, [EnchantmentTags::SHOVEL])); + self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND, [EnchantmentTags::SWORD])); + self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD, [EnchantmentTags::SWORD])); + self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON, [EnchantmentTags::SWORD])); + self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE, [EnchantmentTags::SWORD])); + self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE, [EnchantmentTags::SWORD])); + self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD, [EnchantmentTags::SWORD])); } private static function registerArmorItems() : void{ diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index ebbd711468..938b5c82c2 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -352,11 +352,10 @@ class InventoryManager{ $blockPosition = BlockPosition::fromVector3($inv->getHolder()); $windowType = match(true){ $inv instanceof LoomInventory => WindowTypes::LOOM, - $inv instanceof FurnaceInventory => match($inv->getFurnaceType()->id()){ - FurnaceType::FURNACE()->id() => WindowTypes::FURNACE, - FurnaceType::BLAST_FURNACE()->id() => WindowTypes::BLAST_FURNACE, - FurnaceType::SMOKER()->id() => WindowTypes::SMOKER, - default => throw new AssumptionFailedError("Unreachable") + $inv instanceof FurnaceInventory => match($inv->getFurnaceType()){ + FurnaceType::FURNACE => WindowTypes::FURNACE, + FurnaceType::BLAST_FURNACE => WindowTypes::BLAST_FURNACE, + FurnaceType::SMOKER => WindowTypes::SMOKER, }, $inv instanceof EnchantInventory => WindowTypes::ENCHANTMENT, $inv instanceof BrewingStandInventory => WindowTypes::BREWING_STAND, diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 0b18cd53d7..1d4023b41e 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -120,12 +120,11 @@ final class CraftingDataCache{ } } - foreach(FurnaceType::getAll() as $furnaceType){ - $typeTag = match($furnaceType->id()){ - FurnaceType::FURNACE()->id() => FurnaceRecipeBlockName::FURNACE, - FurnaceType::BLAST_FURNACE()->id() => FurnaceRecipeBlockName::BLAST_FURNACE, - FurnaceType::SMOKER()->id() => FurnaceRecipeBlockName::SMOKER, - default => throw new AssumptionFailedError("Unreachable"), + foreach(FurnaceType::cases() as $furnaceType){ + $typeTag = match($furnaceType){ + FurnaceType::FURNACE => FurnaceRecipeBlockName::FURNACE, + FurnaceType::BLAST_FURNACE => FurnaceRecipeBlockName::BLAST_FURNACE, + FurnaceType::SMOKER => FurnaceRecipeBlockName::SMOKER, }; foreach($manager->getFurnaceRecipeManager($furnaceType)->getAll() as $recipe){ $input = $converter->coreRecipeIngredientToNet($recipe->getInput())->getDescriptor(); From b50efbc15a022696888c336bc8b215942f89f8fb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 19:38:01 +0100 Subject: [PATCH 1370/1858] Fix CS --- src/block/BaseBanner.php | 1 - src/block/BigDripleafHead.php | 1 - src/block/Carpet.php | 1 - src/block/Concrete.php | 1 - src/block/ConcretePowder.php | 1 - src/block/DyedCandle.php | 1 - src/block/DyedShulkerBox.php | 1 - src/block/GlazedTerracotta.php | 1 - src/block/Leaves.php | 1 - src/block/StainedGlass.php | 1 - src/block/StainedGlassPane.php | 1 - src/block/StainedHardenedClay.php | 1 - src/block/StainedHardenedGlass.php | 1 - src/block/StainedHardenedGlassPane.php | 1 - src/block/Wool.php | 1 - src/block/tile/Banner.php | 2 -- src/block/tile/Bed.php | 2 -- src/item/Banner.php | 1 - 18 files changed, 20 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index bfa0c85e9b..c2bbaf737a 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SupportType; use pocketmine\item\Banner as ItemBanner; use pocketmine\item\Item; diff --git a/src/block/BigDripleafHead.php b/src/block/BigDripleafHead.php index d6f057270c..cb64423d35 100644 --- a/src/block/BigDripleafHead.php +++ b/src/block/BigDripleafHead.php @@ -30,7 +30,6 @@ use pocketmine\entity\projectile\Projectile; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\sound\DripleafTiltDownSound; use pocketmine\world\sound\DripleafTiltUpSound; diff --git a/src/block/Carpet.php b/src/block/Carpet.php index f59e042638..74f07a801f 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; diff --git a/src/block/Concrete.php b/src/block/Concrete.php index f78408f566..fae6f8e2f8 100644 --- a/src/block/Concrete.php +++ b/src/block/Concrete.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; class Concrete extends Opaque{ use ColoredTrait; diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index dc16ce9d4b..59f14bc722 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\math\Facing; diff --git a/src/block/DyedCandle.php b/src/block/DyedCandle.php index 756a1fc133..a495e8d003 100644 --- a/src/block/DyedCandle.php +++ b/src/block/DyedCandle.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; class DyedCandle extends Candle{ use ColoredTrait; diff --git a/src/block/DyedShulkerBox.php b/src/block/DyedShulkerBox.php index 862caf197e..5eae9237e4 100644 --- a/src/block/DyedShulkerBox.php +++ b/src/block/DyedShulkerBox.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class DyedShulkerBox extends ShulkerBox{ use ColoredTrait; diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index 7d82e2efe5..15b3254e5d 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; class GlazedTerracotta extends Opaque{ diff --git a/src/block/Leaves.php b/src/block/Leaves.php index ac1ffb94aa..b28a3832e3 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -33,7 +33,6 @@ use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\World; use function mt_rand; diff --git a/src/block/StainedGlass.php b/src/block/StainedGlass.php index 013fdd6c52..bc0d848770 100644 --- a/src/block/StainedGlass.php +++ b/src/block/StainedGlass.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class StainedGlass extends Glass{ use ColoredTrait; diff --git a/src/block/StainedGlassPane.php b/src/block/StainedGlassPane.php index 4a2724aa89..18ecfdee0e 100644 --- a/src/block/StainedGlassPane.php +++ b/src/block/StainedGlassPane.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class StainedGlassPane extends GlassPane{ use ColoredTrait; diff --git a/src/block/StainedHardenedClay.php b/src/block/StainedHardenedClay.php index c30a6fe0e8..2c2c01ba3a 100644 --- a/src/block/StainedHardenedClay.php +++ b/src/block/StainedHardenedClay.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class StainedHardenedClay extends HardenedClay{ use ColoredTrait; diff --git a/src/block/StainedHardenedGlass.php b/src/block/StainedHardenedGlass.php index 07d021e168..cc609a49a9 100644 --- a/src/block/StainedHardenedGlass.php +++ b/src/block/StainedHardenedGlass.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class StainedHardenedGlass extends HardenedGlass{ use ColoredTrait; diff --git a/src/block/StainedHardenedGlassPane.php b/src/block/StainedHardenedGlassPane.php index 81f29e9af6..63dbe1f776 100644 --- a/src/block/StainedHardenedGlassPane.php +++ b/src/block/StainedHardenedGlassPane.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; final class StainedHardenedGlassPane extends HardenedGlassPane{ use ColoredTrait; diff --git a/src/block/Wool.php b/src/block/Wool.php index 49a7751fa0..0b008ac042 100644 --- a/src/block/Wool.php +++ b/src/block/Wool.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\block\utils\DyeColor; class Wool extends Opaque{ use ColoredTrait; diff --git a/src/block/tile/Banner.php b/src/block/tile/Banner.php index 60e35661f6..08a560707b 100644 --- a/src/block/tile/Banner.php +++ b/src/block/tile/Banner.php @@ -27,11 +27,9 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ListTag; -use pocketmine\world\World; /** * @deprecated diff --git a/src/block/tile/Bed.php b/src/block/tile/Bed.php index deb6de153d..17a0c8d9d3 100644 --- a/src/block/tile/Bed.php +++ b/src/block/tile/Bed.php @@ -25,10 +25,8 @@ namespace pocketmine\block\tile; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\world\World; class Bed extends Spawnable{ public const TAG_COLOR = "color"; diff --git a/src/item/Banner.php b/src/item/Banner.php index 92ec4041ff..db54e97666 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\block\Block; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; From c16881831158482c3a3aa0d1cab2beff5d9eb65a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 19:39:13 +0100 Subject: [PATCH 1371/1858] missed one --- src/data/bedrock/block/convert/BlockObjectToStateSerializer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 7c2e08ceb4..eb51b9b0b3 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -174,7 +174,6 @@ use pocketmine\data\bedrock\block\convert\BlockStateSerializerHelper as Helper; use pocketmine\data\bedrock\block\convert\BlockStateWriter as Writer; use pocketmine\math\Axis; use pocketmine\math\Facing; -use pocketmine\utils\AssumptionFailedError; use function get_class; final class BlockObjectToStateSerializer implements BlockStateSerializer{ From 6887fcd5904658eef490dda8370eb1061e2394db Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 19:40:14 +0100 Subject: [PATCH 1372/1858] RuntimeEnum(De)SerializerTrait no longer uses legacy accessors for enum members --- build/generate-runtime-enum-serializers.php | 38 +-- .../runtime/RuntimeEnumDeserializerTrait.php | 250 +++++++++--------- .../runtime/RuntimeEnumSerializerTrait.php | 250 +++++++++--------- 3 files changed, 269 insertions(+), 269 deletions(-) diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php index 805ed18e12..d822fa5398 100644 --- a/build/generate-runtime-enum-serializers.php +++ b/build/generate-runtime-enum-serializers.php @@ -38,7 +38,6 @@ use pocketmine\item\MedicineType; use pocketmine\item\PotionType; use pocketmine\item\SuspiciousStewType; use function array_key_first; -use function array_keys; use function array_map; use function ceil; use function count; @@ -50,6 +49,7 @@ use function lcfirst; use function log; use function ob_get_clean; use function ob_start; +use function usort; use const SORT_STRING; require dirname(__DIR__) . '/vendor/autoload.php'; @@ -130,32 +130,32 @@ function getBitsRequired(array $members) : int{ } /** - * @param object[] $members - * @phpstan-param array $members + * @param \UnitEnum[] $members + * @phpstan-param list<\UnitEnum> $members * * @return string[] * @phpstan-return list */ function stringifyEnumMembers(array $members, string $enumClass) : array{ - ksort($members, SORT_STRING); - return array_map(fn(string $enumCaseName) => "\\$enumClass::$enumCaseName()", array_keys($members)); + usort($members, fn(\UnitEnum $a, \UnitEnum $b) => $a->name <=> $b->name); + return array_map(fn(\UnitEnum $case) => "\\$enumClass::$case->name", $members); } $enumsUsed = [ - BellAttachmentType::getAll(), - CopperOxidation::getAll(), - CoralType::getAll(), - DirtType::getAll(), - DripleafState::getAll(), - DyeColor::getAll(), - FroglightType::getAll(), - LeverFacing::getAll(), - MedicineType::getAll(), - MushroomBlockType::getAll(), - MobHeadType::getAll(), - SlabType::getAll(), - SuspiciousStewType::getAll(), - PotionType::getAll() + BellAttachmentType::cases(), + CopperOxidation::cases(), + CoralType::cases(), + DirtType::cases(), + DripleafState::cases(), + DyeColor::cases(), + FroglightType::cases(), + LeverFacing::cases(), + MedicineType::cases(), + MushroomBlockType::cases(), + MobHeadType::cases(), + SlabType::cases(), + SuspiciousStewType::cases(), + PotionType::cases() ]; $readerFuncs = [ diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php index 7d80a6f547..aa0c1bd7b0 100644 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ b/src/data/runtime/RuntimeEnumDeserializerTrait.php @@ -33,209 +33,209 @@ trait RuntimeEnumDeserializerTrait{ public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ $value = match($this->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(), + 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 InvalidSerializedRuntimeDataException("Invalid serialized value for BellAttachmentType") }; } public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED(), - 1 => \pocketmine\block\utils\CopperOxidation::NONE(), - 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED(), - 3 => \pocketmine\block\utils\CopperOxidation::WEATHERED(), + 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED, + 1 => \pocketmine\block\utils\CopperOxidation::NONE, + 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED, + 3 => \pocketmine\block\utils\CopperOxidation::WEATHERED, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for CopperOxidation") }; } public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ $value = match($this->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(), + 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 InvalidSerializedRuntimeDataException("Invalid serialized value for CoralType") }; } public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\DirtType::COARSE(), - 1 => \pocketmine\block\utils\DirtType::NORMAL(), - 2 => \pocketmine\block\utils\DirtType::ROOTED(), + 0 => \pocketmine\block\utils\DirtType::COARSE, + 1 => \pocketmine\block\utils\DirtType::NORMAL, + 2 => \pocketmine\block\utils\DirtType::ROOTED, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DirtType") }; } public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\DripleafState::FULL_TILT(), - 1 => \pocketmine\block\utils\DripleafState::PARTIAL_TILT(), - 2 => \pocketmine\block\utils\DripleafState::STABLE(), - 3 => \pocketmine\block\utils\DripleafState::UNSTABLE(), + 0 => \pocketmine\block\utils\DripleafState::FULL_TILT, + 1 => \pocketmine\block\utils\DripleafState::PARTIAL_TILT, + 2 => \pocketmine\block\utils\DripleafState::STABLE, + 3 => \pocketmine\block\utils\DripleafState::UNSTABLE, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DripleafState") }; } public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $value = match($this->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(), + 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 InvalidSerializedRuntimeDataException("Invalid serialized value for DyeColor") }; } public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\FroglightType::OCHRE(), - 1 => \pocketmine\block\utils\FroglightType::PEARLESCENT(), - 2 => \pocketmine\block\utils\FroglightType::VERDANT(), + 0 => \pocketmine\block\utils\FroglightType::OCHRE, + 1 => \pocketmine\block\utils\FroglightType::PEARLESCENT, + 2 => \pocketmine\block\utils\FroglightType::VERDANT, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for FroglightType") }; } public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ $value = match($this->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(), + 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 InvalidSerializedRuntimeDataException("Invalid serialized value for LeverFacing") }; } public function medicineType(\pocketmine\item\MedicineType &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\item\MedicineType::ANTIDOTE(), - 1 => \pocketmine\item\MedicineType::ELIXIR(), - 2 => \pocketmine\item\MedicineType::EYE_DROPS(), - 3 => \pocketmine\item\MedicineType::TONIC(), + 0 => \pocketmine\item\MedicineType::ANTIDOTE, + 1 => \pocketmine\item\MedicineType::ELIXIR, + 2 => \pocketmine\item\MedicineType::EYE_DROPS, + 3 => \pocketmine\item\MedicineType::TONIC, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MedicineType") }; } public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ $value = match($this->readInt(3)){ - 0 => \pocketmine\block\utils\MobHeadType::CREEPER(), - 1 => \pocketmine\block\utils\MobHeadType::DRAGON(), - 2 => \pocketmine\block\utils\MobHeadType::PIGLIN(), - 3 => \pocketmine\block\utils\MobHeadType::PLAYER(), - 4 => \pocketmine\block\utils\MobHeadType::SKELETON(), - 5 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON(), - 6 => \pocketmine\block\utils\MobHeadType::ZOMBIE(), + 0 => \pocketmine\block\utils\MobHeadType::CREEPER, + 1 => \pocketmine\block\utils\MobHeadType::DRAGON, + 2 => \pocketmine\block\utils\MobHeadType::PIGLIN, + 3 => \pocketmine\block\utils\MobHeadType::PLAYER, + 4 => \pocketmine\block\utils\MobHeadType::SKELETON, + 5 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON, + 6 => \pocketmine\block\utils\MobHeadType::ZOMBIE, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MobHeadType") }; } public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $value = match($this->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(), + 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 InvalidSerializedRuntimeDataException("Invalid serialized value for MushroomBlockType") }; } public function potionType(\pocketmine\item\PotionType &$value) : void{ $value = match($this->readInt(6)){ - 0 => \pocketmine\item\PotionType::AWKWARD(), - 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE(), - 2 => \pocketmine\item\PotionType::HARMING(), - 3 => \pocketmine\item\PotionType::HEALING(), - 4 => \pocketmine\item\PotionType::INVISIBILITY(), - 5 => \pocketmine\item\PotionType::LEAPING(), - 6 => \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE(), - 7 => \pocketmine\item\PotionType::LONG_INVISIBILITY(), - 8 => \pocketmine\item\PotionType::LONG_LEAPING(), - 9 => \pocketmine\item\PotionType::LONG_MUNDANE(), - 10 => \pocketmine\item\PotionType::LONG_NIGHT_VISION(), - 11 => \pocketmine\item\PotionType::LONG_POISON(), - 12 => \pocketmine\item\PotionType::LONG_REGENERATION(), - 13 => \pocketmine\item\PotionType::LONG_SLOWNESS(), - 14 => \pocketmine\item\PotionType::LONG_SLOW_FALLING(), - 15 => \pocketmine\item\PotionType::LONG_STRENGTH(), - 16 => \pocketmine\item\PotionType::LONG_SWIFTNESS(), - 17 => \pocketmine\item\PotionType::LONG_TURTLE_MASTER(), - 18 => \pocketmine\item\PotionType::LONG_WATER_BREATHING(), - 19 => \pocketmine\item\PotionType::LONG_WEAKNESS(), - 20 => \pocketmine\item\PotionType::MUNDANE(), - 21 => \pocketmine\item\PotionType::NIGHT_VISION(), - 22 => \pocketmine\item\PotionType::POISON(), - 23 => \pocketmine\item\PotionType::REGENERATION(), - 24 => \pocketmine\item\PotionType::SLOWNESS(), - 25 => \pocketmine\item\PotionType::SLOW_FALLING(), - 26 => \pocketmine\item\PotionType::STRENGTH(), - 27 => \pocketmine\item\PotionType::STRONG_HARMING(), - 28 => \pocketmine\item\PotionType::STRONG_HEALING(), - 29 => \pocketmine\item\PotionType::STRONG_LEAPING(), - 30 => \pocketmine\item\PotionType::STRONG_POISON(), - 31 => \pocketmine\item\PotionType::STRONG_REGENERATION(), - 32 => \pocketmine\item\PotionType::STRONG_SLOWNESS(), - 33 => \pocketmine\item\PotionType::STRONG_STRENGTH(), - 34 => \pocketmine\item\PotionType::STRONG_SWIFTNESS(), - 35 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER(), - 36 => \pocketmine\item\PotionType::SWIFTNESS(), - 37 => \pocketmine\item\PotionType::THICK(), - 38 => \pocketmine\item\PotionType::TURTLE_MASTER(), - 39 => \pocketmine\item\PotionType::WATER(), - 40 => \pocketmine\item\PotionType::WATER_BREATHING(), - 41 => \pocketmine\item\PotionType::WEAKNESS(), - 42 => \pocketmine\item\PotionType::WITHER(), + 0 => \pocketmine\item\PotionType::AWKWARD, + 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE, + 2 => \pocketmine\item\PotionType::HARMING, + 3 => \pocketmine\item\PotionType::HEALING, + 4 => \pocketmine\item\PotionType::INVISIBILITY, + 5 => \pocketmine\item\PotionType::LEAPING, + 6 => \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE, + 7 => \pocketmine\item\PotionType::LONG_INVISIBILITY, + 8 => \pocketmine\item\PotionType::LONG_LEAPING, + 9 => \pocketmine\item\PotionType::LONG_MUNDANE, + 10 => \pocketmine\item\PotionType::LONG_NIGHT_VISION, + 11 => \pocketmine\item\PotionType::LONG_POISON, + 12 => \pocketmine\item\PotionType::LONG_REGENERATION, + 13 => \pocketmine\item\PotionType::LONG_SLOWNESS, + 14 => \pocketmine\item\PotionType::LONG_SLOW_FALLING, + 15 => \pocketmine\item\PotionType::LONG_STRENGTH, + 16 => \pocketmine\item\PotionType::LONG_SWIFTNESS, + 17 => \pocketmine\item\PotionType::LONG_TURTLE_MASTER, + 18 => \pocketmine\item\PotionType::LONG_WATER_BREATHING, + 19 => \pocketmine\item\PotionType::LONG_WEAKNESS, + 20 => \pocketmine\item\PotionType::MUNDANE, + 21 => \pocketmine\item\PotionType::NIGHT_VISION, + 22 => \pocketmine\item\PotionType::POISON, + 23 => \pocketmine\item\PotionType::REGENERATION, + 24 => \pocketmine\item\PotionType::SLOWNESS, + 25 => \pocketmine\item\PotionType::SLOW_FALLING, + 26 => \pocketmine\item\PotionType::STRENGTH, + 27 => \pocketmine\item\PotionType::STRONG_HARMING, + 28 => \pocketmine\item\PotionType::STRONG_HEALING, + 29 => \pocketmine\item\PotionType::STRONG_LEAPING, + 30 => \pocketmine\item\PotionType::STRONG_POISON, + 31 => \pocketmine\item\PotionType::STRONG_REGENERATION, + 32 => \pocketmine\item\PotionType::STRONG_SLOWNESS, + 33 => \pocketmine\item\PotionType::STRONG_STRENGTH, + 34 => \pocketmine\item\PotionType::STRONG_SWIFTNESS, + 35 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER, + 36 => \pocketmine\item\PotionType::SWIFTNESS, + 37 => \pocketmine\item\PotionType::THICK, + 38 => \pocketmine\item\PotionType::TURTLE_MASTER, + 39 => \pocketmine\item\PotionType::WATER, + 40 => \pocketmine\item\PotionType::WATER_BREATHING, + 41 => \pocketmine\item\PotionType::WEAKNESS, + 42 => \pocketmine\item\PotionType::WITHER, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for PotionType") }; } public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\SlabType::BOTTOM(), - 1 => \pocketmine\block\utils\SlabType::DOUBLE(), - 2 => \pocketmine\block\utils\SlabType::TOP(), + 0 => \pocketmine\block\utils\SlabType::BOTTOM, + 1 => \pocketmine\block\utils\SlabType::DOUBLE, + 2 => \pocketmine\block\utils\SlabType::TOP, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for SlabType") }; } public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ $value = match($this->readInt(4)){ - 0 => \pocketmine\item\SuspiciousStewType::ALLIUM(), - 1 => \pocketmine\item\SuspiciousStewType::AZURE_BLUET(), - 2 => \pocketmine\item\SuspiciousStewType::BLUE_ORCHID(), - 3 => \pocketmine\item\SuspiciousStewType::CORNFLOWER(), - 4 => \pocketmine\item\SuspiciousStewType::DANDELION(), - 5 => \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY(), - 6 => \pocketmine\item\SuspiciousStewType::OXEYE_DAISY(), - 7 => \pocketmine\item\SuspiciousStewType::POPPY(), - 8 => \pocketmine\item\SuspiciousStewType::TULIP(), - 9 => \pocketmine\item\SuspiciousStewType::WITHER_ROSE(), + 0 => \pocketmine\item\SuspiciousStewType::ALLIUM, + 1 => \pocketmine\item\SuspiciousStewType::AZURE_BLUET, + 2 => \pocketmine\item\SuspiciousStewType::BLUE_ORCHID, + 3 => \pocketmine\item\SuspiciousStewType::CORNFLOWER, + 4 => \pocketmine\item\SuspiciousStewType::DANDELION, + 5 => \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY, + 6 => \pocketmine\item\SuspiciousStewType::OXEYE_DAISY, + 7 => \pocketmine\item\SuspiciousStewType::POPPY, + 8 => \pocketmine\item\SuspiciousStewType::TULIP, + 9 => \pocketmine\item\SuspiciousStewType::WITHER_ROSE, default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for SuspiciousStewType") }; } diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php index 8c3d671181..12a205a9ec 100644 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ b/src/data/runtime/RuntimeEnumSerializerTrait.php @@ -33,209 +33,209 @@ trait RuntimeEnumSerializerTrait{ public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ $this->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, + \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") }); } public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\block\utils\CopperOxidation::EXPOSED() => 0, - \pocketmine\block\utils\CopperOxidation::NONE() => 1, - \pocketmine\block\utils\CopperOxidation::OXIDIZED() => 2, - \pocketmine\block\utils\CopperOxidation::WEATHERED() => 3, + \pocketmine\block\utils\CopperOxidation::EXPOSED => 0, + \pocketmine\block\utils\CopperOxidation::NONE => 1, + \pocketmine\block\utils\CopperOxidation::OXIDIZED => 2, + \pocketmine\block\utils\CopperOxidation::WEATHERED => 3, default => throw new \pocketmine\utils\AssumptionFailedError("All CopperOxidation cases should be covered") }); } public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ $this->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, + \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 function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\block\utils\DirtType::COARSE() => 0, - \pocketmine\block\utils\DirtType::NORMAL() => 1, - \pocketmine\block\utils\DirtType::ROOTED() => 2, + \pocketmine\block\utils\DirtType::COARSE => 0, + \pocketmine\block\utils\DirtType::NORMAL => 1, + \pocketmine\block\utils\DirtType::ROOTED => 2, default => throw new \pocketmine\utils\AssumptionFailedError("All DirtType cases should be covered") }); } public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\block\utils\DripleafState::FULL_TILT() => 0, - \pocketmine\block\utils\DripleafState::PARTIAL_TILT() => 1, - \pocketmine\block\utils\DripleafState::STABLE() => 2, - \pocketmine\block\utils\DripleafState::UNSTABLE() => 3, + \pocketmine\block\utils\DripleafState::FULL_TILT => 0, + \pocketmine\block\utils\DripleafState::PARTIAL_TILT => 1, + \pocketmine\block\utils\DripleafState::STABLE => 2, + \pocketmine\block\utils\DripleafState::UNSTABLE => 3, default => throw new \pocketmine\utils\AssumptionFailedError("All DripleafState cases should be covered") }); } public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ $this->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, + \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 function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\block\utils\FroglightType::OCHRE() => 0, - \pocketmine\block\utils\FroglightType::PEARLESCENT() => 1, - \pocketmine\block\utils\FroglightType::VERDANT() => 2, + \pocketmine\block\utils\FroglightType::OCHRE => 0, + \pocketmine\block\utils\FroglightType::PEARLESCENT => 1, + \pocketmine\block\utils\FroglightType::VERDANT => 2, default => throw new \pocketmine\utils\AssumptionFailedError("All FroglightType cases should be covered") }); } public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ $this->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, + \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 function medicineType(\pocketmine\item\MedicineType &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\item\MedicineType::ANTIDOTE() => 0, - \pocketmine\item\MedicineType::ELIXIR() => 1, - \pocketmine\item\MedicineType::EYE_DROPS() => 2, - \pocketmine\item\MedicineType::TONIC() => 3, + \pocketmine\item\MedicineType::ANTIDOTE => 0, + \pocketmine\item\MedicineType::ELIXIR => 1, + \pocketmine\item\MedicineType::EYE_DROPS => 2, + \pocketmine\item\MedicineType::TONIC => 3, default => throw new \pocketmine\utils\AssumptionFailedError("All MedicineType cases should be covered") }); } public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ $this->writeInt(3, match($value){ - \pocketmine\block\utils\MobHeadType::CREEPER() => 0, - \pocketmine\block\utils\MobHeadType::DRAGON() => 1, - \pocketmine\block\utils\MobHeadType::PIGLIN() => 2, - \pocketmine\block\utils\MobHeadType::PLAYER() => 3, - \pocketmine\block\utils\MobHeadType::SKELETON() => 4, - \pocketmine\block\utils\MobHeadType::WITHER_SKELETON() => 5, - \pocketmine\block\utils\MobHeadType::ZOMBIE() => 6, + \pocketmine\block\utils\MobHeadType::CREEPER => 0, + \pocketmine\block\utils\MobHeadType::DRAGON => 1, + \pocketmine\block\utils\MobHeadType::PIGLIN => 2, + \pocketmine\block\utils\MobHeadType::PLAYER => 3, + \pocketmine\block\utils\MobHeadType::SKELETON => 4, + \pocketmine\block\utils\MobHeadType::WITHER_SKELETON => 5, + \pocketmine\block\utils\MobHeadType::ZOMBIE => 6, default => throw new \pocketmine\utils\AssumptionFailedError("All MobHeadType cases should be covered") }); } public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ $this->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, + \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 function potionType(\pocketmine\item\PotionType &$value) : void{ $this->writeInt(6, match($value){ - \pocketmine\item\PotionType::AWKWARD() => 0, - \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, - \pocketmine\item\PotionType::HARMING() => 2, - \pocketmine\item\PotionType::HEALING() => 3, - \pocketmine\item\PotionType::INVISIBILITY() => 4, - \pocketmine\item\PotionType::LEAPING() => 5, - \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE() => 6, - \pocketmine\item\PotionType::LONG_INVISIBILITY() => 7, - \pocketmine\item\PotionType::LONG_LEAPING() => 8, - \pocketmine\item\PotionType::LONG_MUNDANE() => 9, - \pocketmine\item\PotionType::LONG_NIGHT_VISION() => 10, - \pocketmine\item\PotionType::LONG_POISON() => 11, - \pocketmine\item\PotionType::LONG_REGENERATION() => 12, - \pocketmine\item\PotionType::LONG_SLOWNESS() => 13, - \pocketmine\item\PotionType::LONG_SLOW_FALLING() => 14, - \pocketmine\item\PotionType::LONG_STRENGTH() => 15, - \pocketmine\item\PotionType::LONG_SWIFTNESS() => 16, - \pocketmine\item\PotionType::LONG_TURTLE_MASTER() => 17, - \pocketmine\item\PotionType::LONG_WATER_BREATHING() => 18, - \pocketmine\item\PotionType::LONG_WEAKNESS() => 19, - \pocketmine\item\PotionType::MUNDANE() => 20, - \pocketmine\item\PotionType::NIGHT_VISION() => 21, - \pocketmine\item\PotionType::POISON() => 22, - \pocketmine\item\PotionType::REGENERATION() => 23, - \pocketmine\item\PotionType::SLOWNESS() => 24, - \pocketmine\item\PotionType::SLOW_FALLING() => 25, - \pocketmine\item\PotionType::STRENGTH() => 26, - \pocketmine\item\PotionType::STRONG_HARMING() => 27, - \pocketmine\item\PotionType::STRONG_HEALING() => 28, - \pocketmine\item\PotionType::STRONG_LEAPING() => 29, - \pocketmine\item\PotionType::STRONG_POISON() => 30, - \pocketmine\item\PotionType::STRONG_REGENERATION() => 31, - \pocketmine\item\PotionType::STRONG_SLOWNESS() => 32, - \pocketmine\item\PotionType::STRONG_STRENGTH() => 33, - \pocketmine\item\PotionType::STRONG_SWIFTNESS() => 34, - \pocketmine\item\PotionType::STRONG_TURTLE_MASTER() => 35, - \pocketmine\item\PotionType::SWIFTNESS() => 36, - \pocketmine\item\PotionType::THICK() => 37, - \pocketmine\item\PotionType::TURTLE_MASTER() => 38, - \pocketmine\item\PotionType::WATER() => 39, - \pocketmine\item\PotionType::WATER_BREATHING() => 40, - \pocketmine\item\PotionType::WEAKNESS() => 41, - \pocketmine\item\PotionType::WITHER() => 42, + \pocketmine\item\PotionType::AWKWARD => 0, + \pocketmine\item\PotionType::FIRE_RESISTANCE => 1, + \pocketmine\item\PotionType::HARMING => 2, + \pocketmine\item\PotionType::HEALING => 3, + \pocketmine\item\PotionType::INVISIBILITY => 4, + \pocketmine\item\PotionType::LEAPING => 5, + \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE => 6, + \pocketmine\item\PotionType::LONG_INVISIBILITY => 7, + \pocketmine\item\PotionType::LONG_LEAPING => 8, + \pocketmine\item\PotionType::LONG_MUNDANE => 9, + \pocketmine\item\PotionType::LONG_NIGHT_VISION => 10, + \pocketmine\item\PotionType::LONG_POISON => 11, + \pocketmine\item\PotionType::LONG_REGENERATION => 12, + \pocketmine\item\PotionType::LONG_SLOWNESS => 13, + \pocketmine\item\PotionType::LONG_SLOW_FALLING => 14, + \pocketmine\item\PotionType::LONG_STRENGTH => 15, + \pocketmine\item\PotionType::LONG_SWIFTNESS => 16, + \pocketmine\item\PotionType::LONG_TURTLE_MASTER => 17, + \pocketmine\item\PotionType::LONG_WATER_BREATHING => 18, + \pocketmine\item\PotionType::LONG_WEAKNESS => 19, + \pocketmine\item\PotionType::MUNDANE => 20, + \pocketmine\item\PotionType::NIGHT_VISION => 21, + \pocketmine\item\PotionType::POISON => 22, + \pocketmine\item\PotionType::REGENERATION => 23, + \pocketmine\item\PotionType::SLOWNESS => 24, + \pocketmine\item\PotionType::SLOW_FALLING => 25, + \pocketmine\item\PotionType::STRENGTH => 26, + \pocketmine\item\PotionType::STRONG_HARMING => 27, + \pocketmine\item\PotionType::STRONG_HEALING => 28, + \pocketmine\item\PotionType::STRONG_LEAPING => 29, + \pocketmine\item\PotionType::STRONG_POISON => 30, + \pocketmine\item\PotionType::STRONG_REGENERATION => 31, + \pocketmine\item\PotionType::STRONG_SLOWNESS => 32, + \pocketmine\item\PotionType::STRONG_STRENGTH => 33, + \pocketmine\item\PotionType::STRONG_SWIFTNESS => 34, + \pocketmine\item\PotionType::STRONG_TURTLE_MASTER => 35, + \pocketmine\item\PotionType::SWIFTNESS => 36, + \pocketmine\item\PotionType::THICK => 37, + \pocketmine\item\PotionType::TURTLE_MASTER => 38, + \pocketmine\item\PotionType::WATER => 39, + \pocketmine\item\PotionType::WATER_BREATHING => 40, + \pocketmine\item\PotionType::WEAKNESS => 41, + \pocketmine\item\PotionType::WITHER => 42, default => throw new \pocketmine\utils\AssumptionFailedError("All PotionType cases should be covered") }); } public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ $this->writeInt(2, match($value){ - \pocketmine\block\utils\SlabType::BOTTOM() => 0, - \pocketmine\block\utils\SlabType::DOUBLE() => 1, - \pocketmine\block\utils\SlabType::TOP() => 2, + \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 function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ $this->writeInt(4, match($value){ - \pocketmine\item\SuspiciousStewType::ALLIUM() => 0, - \pocketmine\item\SuspiciousStewType::AZURE_BLUET() => 1, - \pocketmine\item\SuspiciousStewType::BLUE_ORCHID() => 2, - \pocketmine\item\SuspiciousStewType::CORNFLOWER() => 3, - \pocketmine\item\SuspiciousStewType::DANDELION() => 4, - \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY() => 5, - \pocketmine\item\SuspiciousStewType::OXEYE_DAISY() => 6, - \pocketmine\item\SuspiciousStewType::POPPY() => 7, - \pocketmine\item\SuspiciousStewType::TULIP() => 8, - \pocketmine\item\SuspiciousStewType::WITHER_ROSE() => 9, + \pocketmine\item\SuspiciousStewType::ALLIUM => 0, + \pocketmine\item\SuspiciousStewType::AZURE_BLUET => 1, + \pocketmine\item\SuspiciousStewType::BLUE_ORCHID => 2, + \pocketmine\item\SuspiciousStewType::CORNFLOWER => 3, + \pocketmine\item\SuspiciousStewType::DANDELION => 4, + \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY => 5, + \pocketmine\item\SuspiciousStewType::OXEYE_DAISY => 6, + \pocketmine\item\SuspiciousStewType::POPPY => 7, + \pocketmine\item\SuspiciousStewType::TULIP => 8, + \pocketmine\item\SuspiciousStewType::WITHER_ROSE => 9, default => throw new \pocketmine\utils\AssumptionFailedError("All SuspiciousStewType cases should be covered") }); } From 7dcd2592d4dd5d59dbd38069b859f57a14fcd895 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Thu, 7 Sep 2023 20:07:14 +0100 Subject: [PATCH 1373/1858] RuntimeDataDescriber: Support dynamically describing arbitrary enums (#6039) Previously, we were using codegen to support describing a fixed set of enums. Instead, we implement an enum() function, allowing any native PHP enum to be described. All enums used in runtime data have been migrated to native PHP 8.1 enums in minor-next to facilitate this. This implementation: - is faster (in extreme cases by 40x, such as with PotionType) - requires way less code - does not require a build step - is way more flexible This fixes #5877, increasing the range of stuff that plugins are now able to do. EnumTrait enums are not supported, as it's easier and cleaner to just support native enums. Most core EnumTrait enums have been migrated to native enums by now to facilitate this. --- .github/workflows/main.yml | 3 - build/generate-runtime-enum-serializers.php | 265 ------------------ src/block/Bell.php | 2 +- src/block/BigDripleafHead.php | 2 +- src/block/Dirt.php | 2 +- src/block/Froglight.php | 2 +- src/block/Lever.php | 2 +- src/block/MobHead.php | 2 +- src/block/RedMushroomBlock.php | 2 +- src/block/Slab.php | 2 +- src/block/utils/ColoredTrait.php | 2 +- src/block/utils/CopperTrait.php | 2 +- src/block/utils/CoralTypeTrait.php | 2 +- ...hp => LegacyRuntimeEnumDescriberTrait.php} | 42 +-- src/data/runtime/RuntimeDataDescriber.php | 6 + src/data/runtime/RuntimeDataReader.php | 14 +- .../runtime/RuntimeDataSizeCalculator.php | 7 +- src/data/runtime/RuntimeDataWriter.php | 7 +- src/data/runtime/RuntimeEnumDescriber.php | 5 +- .../runtime/RuntimeEnumDeserializerTrait.php | 243 ---------------- src/data/runtime/RuntimeEnumMetadata.php | 114 ++++++++ .../runtime/RuntimeEnumSerializerTrait.php | 243 ---------------- src/item/Banner.php | 2 +- src/item/Dye.php | 2 +- src/item/Medicine.php | 2 +- src/item/Potion.php | 2 +- src/item/SplashPotion.php | 2 +- src/item/SuspiciousStew.php | 2 +- 28 files changed, 188 insertions(+), 795 deletions(-) delete mode 100644 build/generate-runtime-enum-serializers.php rename src/data/runtime/{RuntimeEnumSizeCalculatorTrait.php => LegacyRuntimeEnumDescriberTrait.php} (74%) delete mode 100644 src/data/runtime/RuntimeEnumDeserializerTrait.php create mode 100644 src/data/runtime/RuntimeEnumMetadata.php delete mode 100644 src/data/runtime/RuntimeEnumSerializerTrait.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f9046017ce..5414deabcb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -152,9 +152,6 @@ jobs: - name: Regenerate KnownTranslation APIs run: php build/generate-known-translation-apis.php - - name: Regenerate RuntimeEnum(De)serializer - run: php build/generate-runtime-enum-serializers.php - - name: Regenerate BedrockData available files constants run: php build/generate-bedrockdata-path-consts.php diff --git a/build/generate-runtime-enum-serializers.php b/build/generate-runtime-enum-serializers.php deleted file mode 100644 index d822fa5398..0000000000 --- a/build/generate-runtime-enum-serializers.php +++ /dev/null @@ -1,265 +0,0 @@ - $memberNames - * - * @return string[] - * @phpstan-return list - */ -function buildWriterFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string $functionName) : array{ - $bits = getBitsRequired($memberNames); - $lines = []; - - $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; - $lines[] = "\t\$this->writeInt($bits, match(\$value){"; - - foreach($memberNames as $key => $memberName){ - $lines[] = "\t\t$memberName => $key,"; - } - $lines[] = "\t\tdefault => throw new \pocketmine\utils\AssumptionFailedError(\"All $virtualTypeName cases should be covered\")"; - $lines[] = "\t});"; - $lines[] = "}"; - - return $lines; -} - -/** - * @param string[] $memberNames - * @phpstan-param list $memberNames - * - * @return string[] - * @phpstan-return list - */ -function buildReaderFunc(string $virtualTypeName, string $nativeTypeName, array $memberNames, string $functionName) : array{ - $bits = getBitsRequired($memberNames); - $lines = []; - - $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; - $lines[] = "\t\$value = match(\$this->readInt($bits)){"; - - foreach($memberNames as $key => $memberName){ - $lines[] = "\t\t$key => $memberName,"; - } - $lines[] = "\t\tdefault => throw new InvalidSerializedRuntimeDataException(\"Invalid serialized value for $virtualTypeName\")"; - $lines[] = "\t};"; - $lines[] = "}"; - - return $lines; -} - -function buildInterfaceFunc(string $nativeTypeName, string $functionName) : string{ - return "public function $functionName(\\$nativeTypeName &\$value) : void;"; -} - -/** - * @param string[] $memberNames - * @phpstan-param list $memberNames - * - * @return string[] - * @phpstan-return list - */ -function buildSizeCalculationFunc(string $nativeTypeName, string $functionName, array $memberNames) : array{ - $lines = []; - $lines[] = "public function $functionName(\\$nativeTypeName &\$value) : void{"; - $lines[] = "\t\$this->addBits(" . getBitsRequired($memberNames) . ");"; - $lines[] = "}"; - - return $lines; -} - -/** - * @param mixed[] $members - */ -function getBitsRequired(array $members) : int{ - return (int) ceil(log(count($members), 2)); -} - -/** - * @param \UnitEnum[] $members - * @phpstan-param list<\UnitEnum> $members - * - * @return string[] - * @phpstan-return list - */ -function stringifyEnumMembers(array $members, string $enumClass) : array{ - usort($members, fn(\UnitEnum $a, \UnitEnum $b) => $a->name <=> $b->name); - return array_map(fn(\UnitEnum $case) => "\\$enumClass::$case->name", $members); -} - -$enumsUsed = [ - BellAttachmentType::cases(), - CopperOxidation::cases(), - CoralType::cases(), - DirtType::cases(), - DripleafState::cases(), - DyeColor::cases(), - FroglightType::cases(), - LeverFacing::cases(), - MedicineType::cases(), - MushroomBlockType::cases(), - MobHeadType::cases(), - SlabType::cases(), - SuspiciousStewType::cases(), - PotionType::cases() -]; - -$readerFuncs = [ - "" => [ - "abstract protected function readInt(int \$bits) : int;" - ] -]; -$writerFuncs = [ - "" => [ - "abstract protected function writeInt(int \$bits, int \$value) : void;" - ] -]; -$interfaceFuncs = []; -$sizeCalculationFuncs = [ - "" => [ - "abstract protected function addBits(int \$bits) : void;" - ] -]; - -foreach($enumsUsed as $enumMembers){ - if(count($enumMembers) === 0){ - throw new \InvalidArgumentException("Enum members cannot be empty"); - } - $reflect = new \ReflectionClass($enumMembers[array_key_first($enumMembers)]); - $virtualTypeName = $reflect->getShortName(); - $nativeTypeName = $reflect->getName(); - $functionName = lcfirst($virtualTypeName); - - $stringifiedMembers = stringifyEnumMembers($enumMembers, $nativeTypeName); - $writerFuncs[$functionName] = buildWriterFunc( - $virtualTypeName, - $nativeTypeName, - $stringifiedMembers, - $functionName - ); - $readerFuncs[$functionName] = buildReaderFunc( - $virtualTypeName, - $nativeTypeName, - $stringifiedMembers, - $functionName - ); - $interfaceFuncs[$functionName] = [buildInterfaceFunc( - $nativeTypeName, - $functionName - )]; - $sizeCalculationFuncs[$functionName] = buildSizeCalculationFunc( - $nativeTypeName, - $functionName, - $stringifiedMembers - ); -} - -/** - * @param string[][] $functions - * @phpstan-param array> $functions - */ -function printFunctions(array $functions, string $className, string $classType) : void{ - ksort($functions, SORT_STRING); - - ob_start(); - - echo <<<'HEADER' - "\t" . implode("\n\t", $functionLines), $functions)); - echo "\n\n}\n"; - - file_put_contents(dirname(__DIR__) . '/src/data/runtime/' . $className . '.php', ob_get_clean()); -} - -printFunctions($writerFuncs, "RuntimeEnumSerializerTrait", "trait"); -printFunctions($readerFuncs, "RuntimeEnumDeserializerTrait", "trait"); -printFunctions($interfaceFuncs, "RuntimeEnumDescriber", "interface"); -printFunctions($sizeCalculationFuncs, "RuntimeEnumSizeCalculatorTrait", "trait"); - -echo "Done. Don't forget to run CS fixup after generating code.\n"; diff --git a/src/block/Bell.php b/src/block/Bell.php index e91082a267..ec033cef87 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -44,7 +44,7 @@ final class Bell extends Transparent{ private BellAttachmentType $attachmentType = BellAttachmentType::FLOOR; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->bellAttachmentType($this->attachmentType); + $w->enum($this->attachmentType); $w->horizontalFacing($this->facing); } diff --git a/src/block/BigDripleafHead.php b/src/block/BigDripleafHead.php index cb64423d35..a9b87bf7f7 100644 --- a/src/block/BigDripleafHead.php +++ b/src/block/BigDripleafHead.php @@ -39,7 +39,7 @@ class BigDripleafHead extends BaseBigDripleaf{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ parent::describeBlockOnlyState($w); - $w->dripleafState($this->leafState); + $w->enum($this->leafState); } protected function isHead() : bool{ diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 6f3d62e7f8..b3a3c6090b 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -41,7 +41,7 @@ class Dirt extends Opaque{ protected DirtType $dirtType = DirtType::NORMAL; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->dirtType($this->dirtType); + $w->enum($this->dirtType); } public function getDirtType() : DirtType{ return $this->dirtType; } diff --git a/src/block/Froglight.php b/src/block/Froglight.php index 2c54b830a3..562b33f174 100644 --- a/src/block/Froglight.php +++ b/src/block/Froglight.php @@ -31,7 +31,7 @@ final class Froglight extends SimplePillar{ private FroglightType $froglightType = FroglightType::OCHRE; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->froglightType($this->froglightType); + $w->enum($this->froglightType); } public function getFroglightType() : FroglightType{ return $this->froglightType; } diff --git a/src/block/Lever.php b/src/block/Lever.php index 01aa892455..d2b98efc34 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -40,7 +40,7 @@ class Lever extends Flowable{ protected bool $activated = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->leverFacing($this->facing); + $w->enum($this->facing); $w->bool($this->activated); } diff --git a/src/block/MobHead.php b/src/block/MobHead.php index 125bafe8b1..f4e945841d 100644 --- a/src/block/MobHead.php +++ b/src/block/MobHead.php @@ -45,7 +45,7 @@ class MobHead extends Flowable{ protected int $rotation = self::MIN_ROTATION; //TODO: split this into floor skull and wall skull handling public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->mobHeadType($this->mobHeadType); + $w->enum($this->mobHeadType); } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index cf368a30aa..0a7cb30f25 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -34,7 +34,7 @@ class RedMushroomBlock extends Opaque{ public function describeBlockItemState(RuntimeDataDescriber $w) : void{ //these blocks always drop as all-cap, but may exist in other forms in the inventory (particularly creative), //so this information needs to be kept in the type info - $w->mushroomBlockType($this->mushroomBlockType); + $w->enum($this->mushroomBlockType); } public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; } diff --git a/src/block/Slab.php b/src/block/Slab.php index bdf2bb5eb0..6000bec39e 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -41,7 +41,7 @@ class Slab extends Transparent{ } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->slabType($this->slabType); + $w->enum($this->slabType); } public function isTransparent() : bool{ diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 11e98167e4..2ecd58e203 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -32,7 +32,7 @@ trait ColoredTrait{ /** @see Block::describeBlockItemState() */ public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->dyeColor($this->color); + $w->enum($this->color); } public function getColor() : DyeColor{ return $this->color; } diff --git a/src/block/utils/CopperTrait.php b/src/block/utils/CopperTrait.php index f0d708821f..5ad8aa82d1 100644 --- a/src/block/utils/CopperTrait.php +++ b/src/block/utils/CopperTrait.php @@ -38,7 +38,7 @@ trait CopperTrait{ private bool $waxed = false; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->copperOxidation($this->oxidation); + $w->enum($this->oxidation); $w->bool($this->waxed); } diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index fcd7dbf246..a335bf9ecc 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -32,7 +32,7 @@ trait CoralTypeTrait{ /** @see Block::describeBlockItemState() */ public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->coralType($this->coralType); + $w->enum($this->coralType); $w->bool($this->dead); } diff --git a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php b/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php similarity index 74% rename from src/data/runtime/RuntimeEnumSizeCalculatorTrait.php rename to src/data/runtime/LegacyRuntimeEnumDescriberTrait.php index 2ab62f03e6..dd35fabfbf 100644 --- a/src/data/runtime/RuntimeEnumSizeCalculatorTrait.php +++ b/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php @@ -24,67 +24,71 @@ declare(strict_types=1); namespace pocketmine\data\runtime; /** - * This class is auto-generated. Do not edit it manually. - * @see build/generate-runtime-enum-serializers.php + * Provides backwards-compatible shims for the old codegen'd enum describer methods. + * This is kept for plugin backwards compatibility, but these functions should not be used in new code. + * @deprecated */ -trait RuntimeEnumSizeCalculatorTrait{ +trait LegacyRuntimeEnumDescriberTrait{ - abstract protected function addBits(int $bits) : void; + /** + * @phpstan-template T of \UnitEnum + * @phpstan-param T $case + */ + abstract protected function enum(\UnitEnum &$case) : void; public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ - $this->addBits(3); + $this->enum($value); } public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ - $this->addBits(4); + $this->enum($value); } public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ - $this->addBits(3); + $this->enum($value); } public function medicineType(\pocketmine\item\MedicineType &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ - $this->addBits(3); + $this->enum($value); } public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ - $this->addBits(4); + $this->enum($value); } public function potionType(\pocketmine\item\PotionType &$value) : void{ - $this->addBits(6); + $this->enum($value); } public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ - $this->addBits(2); + $this->enum($value); } public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ - $this->addBits(4); + $this->enum($value); } - } diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 36822a6f39..2d8c52ec29 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -77,4 +77,10 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function railShape(int &$railShape) : void; public function straightOnlyRailShape(int &$railShape) : void; + + /** + * @phpstan-template T of \UnitEnum + * @phpstan-param T $case + */ + public function enum(\UnitEnum &$case) : void; } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 1677cea360..9b64450733 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -29,11 +29,12 @@ use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; +use function get_class; use function intdiv; use function spl_object_id; final class RuntimeDataReader implements RuntimeDataDescriber{ - use RuntimeEnumDeserializerTrait; + use LegacyRuntimeEnumDescriberTrait; private int $offset = 0; @@ -210,5 +211,16 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $railShape = $result; } + public function enum(\UnitEnum &$case) : void{ + $metadata = RuntimeEnumMetadata::from($case); + $raw = $this->readInt($metadata->bits); + $result = $metadata->intToEnum($raw); + if($result === null){ + throw new InvalidSerializedRuntimeDataException("Invalid serialized value $raw for " . get_class($case)); + } + + $case = $result; + } + public function getOffset() : int{ return $this->offset; } } diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 352e8e1a1c..82e3602135 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -28,7 +28,7 @@ use pocketmine\math\Facing; use function count; final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ - use RuntimeEnumSizeCalculatorTrait; + use LegacyRuntimeEnumDescriberTrait; private int $bits = 0; @@ -95,4 +95,9 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ public function straightOnlyRailShape(int &$railShape) : void{ $this->addBits(3); } + + public function enum(\UnitEnum &$case) : void{ + $metadata = RuntimeEnumMetadata::from($case); + $this->addBits($metadata->bits); + } } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index 3a5855a25a..9e78875ea0 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -31,7 +31,7 @@ use function array_flip; use function spl_object_id; final class RuntimeDataWriter implements RuntimeDataDescriber{ - use RuntimeEnumSerializerTrait; + use LegacyRuntimeEnumDescriberTrait; private int $value = 0; private int $offset = 0; @@ -174,6 +174,11 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ $this->int(3, $railShape); } + public function enum(\UnitEnum &$case) : void{ + $metadata = RuntimeEnumMetadata::from($case); + $this->writeInt($metadata->bits, $metadata->enumToInt($case)); + } + public function getValue() : int{ return $this->value; } public function getOffset() : int{ return $this->offset; } diff --git a/src/data/runtime/RuntimeEnumDescriber.php b/src/data/runtime/RuntimeEnumDescriber.php index 7103017f75..79550d041b 100644 --- a/src/data/runtime/RuntimeEnumDescriber.php +++ b/src/data/runtime/RuntimeEnumDescriber.php @@ -24,8 +24,9 @@ declare(strict_types=1); namespace pocketmine\data\runtime; /** - * This class is auto-generated. Do not edit it manually. - * @see build/generate-runtime-enum-serializers.php + * Provides backwards-compatible shims for the old codegen'd enum describer methods. + * This is kept for plugin backwards compatibility, but these functions should not be used in new code. + * @deprecated */ interface RuntimeEnumDescriber{ diff --git a/src/data/runtime/RuntimeEnumDeserializerTrait.php b/src/data/runtime/RuntimeEnumDeserializerTrait.php deleted file mode 100644 index aa0c1bd7b0..0000000000 --- a/src/data/runtime/RuntimeEnumDeserializerTrait.php +++ /dev/null @@ -1,243 +0,0 @@ -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 InvalidSerializedRuntimeDataException("Invalid serialized value for BellAttachmentType") - }; - } - - public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\CopperOxidation::EXPOSED, - 1 => \pocketmine\block\utils\CopperOxidation::NONE, - 2 => \pocketmine\block\utils\CopperOxidation::OXIDIZED, - 3 => \pocketmine\block\utils\CopperOxidation::WEATHERED, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for CopperOxidation") - }; - } - - public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ - $value = match($this->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 InvalidSerializedRuntimeDataException("Invalid serialized value for CoralType") - }; - } - - public function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\DirtType::COARSE, - 1 => \pocketmine\block\utils\DirtType::NORMAL, - 2 => \pocketmine\block\utils\DirtType::ROOTED, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DirtType") - }; - } - - public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\DripleafState::FULL_TILT, - 1 => \pocketmine\block\utils\DripleafState::PARTIAL_TILT, - 2 => \pocketmine\block\utils\DripleafState::STABLE, - 3 => \pocketmine\block\utils\DripleafState::UNSTABLE, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for DripleafState") - }; - } - - public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ - $value = match($this->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 InvalidSerializedRuntimeDataException("Invalid serialized value for DyeColor") - }; - } - - public function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\FroglightType::OCHRE, - 1 => \pocketmine\block\utils\FroglightType::PEARLESCENT, - 2 => \pocketmine\block\utils\FroglightType::VERDANT, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for FroglightType") - }; - } - - public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ - $value = match($this->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 InvalidSerializedRuntimeDataException("Invalid serialized value for LeverFacing") - }; - } - - public function medicineType(\pocketmine\item\MedicineType &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\item\MedicineType::ANTIDOTE, - 1 => \pocketmine\item\MedicineType::ELIXIR, - 2 => \pocketmine\item\MedicineType::EYE_DROPS, - 3 => \pocketmine\item\MedicineType::TONIC, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MedicineType") - }; - } - - public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ - $value = match($this->readInt(3)){ - 0 => \pocketmine\block\utils\MobHeadType::CREEPER, - 1 => \pocketmine\block\utils\MobHeadType::DRAGON, - 2 => \pocketmine\block\utils\MobHeadType::PIGLIN, - 3 => \pocketmine\block\utils\MobHeadType::PLAYER, - 4 => \pocketmine\block\utils\MobHeadType::SKELETON, - 5 => \pocketmine\block\utils\MobHeadType::WITHER_SKELETON, - 6 => \pocketmine\block\utils\MobHeadType::ZOMBIE, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for MobHeadType") - }; - } - - public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ - $value = match($this->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 InvalidSerializedRuntimeDataException("Invalid serialized value for MushroomBlockType") - }; - } - - public function potionType(\pocketmine\item\PotionType &$value) : void{ - $value = match($this->readInt(6)){ - 0 => \pocketmine\item\PotionType::AWKWARD, - 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE, - 2 => \pocketmine\item\PotionType::HARMING, - 3 => \pocketmine\item\PotionType::HEALING, - 4 => \pocketmine\item\PotionType::INVISIBILITY, - 5 => \pocketmine\item\PotionType::LEAPING, - 6 => \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE, - 7 => \pocketmine\item\PotionType::LONG_INVISIBILITY, - 8 => \pocketmine\item\PotionType::LONG_LEAPING, - 9 => \pocketmine\item\PotionType::LONG_MUNDANE, - 10 => \pocketmine\item\PotionType::LONG_NIGHT_VISION, - 11 => \pocketmine\item\PotionType::LONG_POISON, - 12 => \pocketmine\item\PotionType::LONG_REGENERATION, - 13 => \pocketmine\item\PotionType::LONG_SLOWNESS, - 14 => \pocketmine\item\PotionType::LONG_SLOW_FALLING, - 15 => \pocketmine\item\PotionType::LONG_STRENGTH, - 16 => \pocketmine\item\PotionType::LONG_SWIFTNESS, - 17 => \pocketmine\item\PotionType::LONG_TURTLE_MASTER, - 18 => \pocketmine\item\PotionType::LONG_WATER_BREATHING, - 19 => \pocketmine\item\PotionType::LONG_WEAKNESS, - 20 => \pocketmine\item\PotionType::MUNDANE, - 21 => \pocketmine\item\PotionType::NIGHT_VISION, - 22 => \pocketmine\item\PotionType::POISON, - 23 => \pocketmine\item\PotionType::REGENERATION, - 24 => \pocketmine\item\PotionType::SLOWNESS, - 25 => \pocketmine\item\PotionType::SLOW_FALLING, - 26 => \pocketmine\item\PotionType::STRENGTH, - 27 => \pocketmine\item\PotionType::STRONG_HARMING, - 28 => \pocketmine\item\PotionType::STRONG_HEALING, - 29 => \pocketmine\item\PotionType::STRONG_LEAPING, - 30 => \pocketmine\item\PotionType::STRONG_POISON, - 31 => \pocketmine\item\PotionType::STRONG_REGENERATION, - 32 => \pocketmine\item\PotionType::STRONG_SLOWNESS, - 33 => \pocketmine\item\PotionType::STRONG_STRENGTH, - 34 => \pocketmine\item\PotionType::STRONG_SWIFTNESS, - 35 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER, - 36 => \pocketmine\item\PotionType::SWIFTNESS, - 37 => \pocketmine\item\PotionType::THICK, - 38 => \pocketmine\item\PotionType::TURTLE_MASTER, - 39 => \pocketmine\item\PotionType::WATER, - 40 => \pocketmine\item\PotionType::WATER_BREATHING, - 41 => \pocketmine\item\PotionType::WEAKNESS, - 42 => \pocketmine\item\PotionType::WITHER, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for PotionType") - }; - } - - public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ - $value = match($this->readInt(2)){ - 0 => \pocketmine\block\utils\SlabType::BOTTOM, - 1 => \pocketmine\block\utils\SlabType::DOUBLE, - 2 => \pocketmine\block\utils\SlabType::TOP, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for SlabType") - }; - } - - public function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ - $value = match($this->readInt(4)){ - 0 => \pocketmine\item\SuspiciousStewType::ALLIUM, - 1 => \pocketmine\item\SuspiciousStewType::AZURE_BLUET, - 2 => \pocketmine\item\SuspiciousStewType::BLUE_ORCHID, - 3 => \pocketmine\item\SuspiciousStewType::CORNFLOWER, - 4 => \pocketmine\item\SuspiciousStewType::DANDELION, - 5 => \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY, - 6 => \pocketmine\item\SuspiciousStewType::OXEYE_DAISY, - 7 => \pocketmine\item\SuspiciousStewType::POPPY, - 8 => \pocketmine\item\SuspiciousStewType::TULIP, - 9 => \pocketmine\item\SuspiciousStewType::WITHER_ROSE, - default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for SuspiciousStewType") - }; - } - -} diff --git a/src/data/runtime/RuntimeEnumMetadata.php b/src/data/runtime/RuntimeEnumMetadata.php new file mode 100644 index 0000000000..261b7a1bc3 --- /dev/null +++ b/src/data/runtime/RuntimeEnumMetadata.php @@ -0,0 +1,114 @@ + + */ + private readonly array $intToEnum; + /** + * @var int[] + * @phpstan-var array + */ + private readonly array $enumToInt; + + /** + * @param \UnitEnum[] $members + * @phpstan-param list $members + */ + public function __construct( + array $members + ){ + usort($members, fn(\UnitEnum $a, \UnitEnum $b) => $a->name <=> $b->name); //sort by name to ensure consistent ordering (and thus consistent bit assignments) + + $this->bits = (int) ceil(log(count($members), 2)); + $this->intToEnum = array_values($members); + + $reversed = []; + foreach($this->intToEnum as $int => $enum){ + $reversed[spl_object_id($enum)] = $int; + } + + $this->enumToInt = $reversed; + } + + /** + * @phpstan-return T|null + */ + public function intToEnum(int $value) : ?object{ + return $this->intToEnum[$value] ?? null; + } + + /** + * @phpstan-param T $enum + */ + public function enumToInt(object $enum) : int{ + return $this->enumToInt[spl_object_id($enum)]; + } + + /** + * @var self[] + * @phpstan-var array + */ + private static array $cache = []; + + /** + * @phpstan-template TEnum of \UnitEnum + * @phpstan-param TEnum $case + * + * @phpstan-return self + */ + public static function from(\UnitEnum $case) : self{ + $class = $case::class; + /** @phpstan-var self|null $metadata */ + $metadata = self::$cache[$class] ?? null; + if($metadata === null){ + /** + * PHPStan can't infer this correctly :( https://github.com/phpstan/phpstan/issues/7162 + * @phpstan-var list $cases + */ + $cases = $case::cases(); + self::$cache[$class] = $metadata = new self($cases); + } + + return $metadata; + } +} diff --git a/src/data/runtime/RuntimeEnumSerializerTrait.php b/src/data/runtime/RuntimeEnumSerializerTrait.php deleted file mode 100644 index 12a205a9ec..0000000000 --- a/src/data/runtime/RuntimeEnumSerializerTrait.php +++ /dev/null @@ -1,243 +0,0 @@ -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") - }); - } - - public function copperOxidation(\pocketmine\block\utils\CopperOxidation &$value) : void{ - $this->writeInt(2, match($value){ - \pocketmine\block\utils\CopperOxidation::EXPOSED => 0, - \pocketmine\block\utils\CopperOxidation::NONE => 1, - \pocketmine\block\utils\CopperOxidation::OXIDIZED => 2, - \pocketmine\block\utils\CopperOxidation::WEATHERED => 3, - default => throw new \pocketmine\utils\AssumptionFailedError("All CopperOxidation cases should be covered") - }); - } - - public function coralType(\pocketmine\block\utils\CoralType &$value) : void{ - $this->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 function dirtType(\pocketmine\block\utils\DirtType &$value) : void{ - $this->writeInt(2, match($value){ - \pocketmine\block\utils\DirtType::COARSE => 0, - \pocketmine\block\utils\DirtType::NORMAL => 1, - \pocketmine\block\utils\DirtType::ROOTED => 2, - default => throw new \pocketmine\utils\AssumptionFailedError("All DirtType cases should be covered") - }); - } - - public function dripleafState(\pocketmine\block\utils\DripleafState &$value) : void{ - $this->writeInt(2, match($value){ - \pocketmine\block\utils\DripleafState::FULL_TILT => 0, - \pocketmine\block\utils\DripleafState::PARTIAL_TILT => 1, - \pocketmine\block\utils\DripleafState::STABLE => 2, - \pocketmine\block\utils\DripleafState::UNSTABLE => 3, - default => throw new \pocketmine\utils\AssumptionFailedError("All DripleafState cases should be covered") - }); - } - - public function dyeColor(\pocketmine\block\utils\DyeColor &$value) : void{ - $this->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 function froglightType(\pocketmine\block\utils\FroglightType &$value) : void{ - $this->writeInt(2, match($value){ - \pocketmine\block\utils\FroglightType::OCHRE => 0, - \pocketmine\block\utils\FroglightType::PEARLESCENT => 1, - \pocketmine\block\utils\FroglightType::VERDANT => 2, - default => throw new \pocketmine\utils\AssumptionFailedError("All FroglightType cases should be covered") - }); - } - - public function leverFacing(\pocketmine\block\utils\LeverFacing &$value) : void{ - $this->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 function medicineType(\pocketmine\item\MedicineType &$value) : void{ - $this->writeInt(2, match($value){ - \pocketmine\item\MedicineType::ANTIDOTE => 0, - \pocketmine\item\MedicineType::ELIXIR => 1, - \pocketmine\item\MedicineType::EYE_DROPS => 2, - \pocketmine\item\MedicineType::TONIC => 3, - default => throw new \pocketmine\utils\AssumptionFailedError("All MedicineType cases should be covered") - }); - } - - public function mobHeadType(\pocketmine\block\utils\MobHeadType &$value) : void{ - $this->writeInt(3, match($value){ - \pocketmine\block\utils\MobHeadType::CREEPER => 0, - \pocketmine\block\utils\MobHeadType::DRAGON => 1, - \pocketmine\block\utils\MobHeadType::PIGLIN => 2, - \pocketmine\block\utils\MobHeadType::PLAYER => 3, - \pocketmine\block\utils\MobHeadType::SKELETON => 4, - \pocketmine\block\utils\MobHeadType::WITHER_SKELETON => 5, - \pocketmine\block\utils\MobHeadType::ZOMBIE => 6, - default => throw new \pocketmine\utils\AssumptionFailedError("All MobHeadType cases should be covered") - }); - } - - public function mushroomBlockType(\pocketmine\block\utils\MushroomBlockType &$value) : void{ - $this->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 function potionType(\pocketmine\item\PotionType &$value) : void{ - $this->writeInt(6, match($value){ - \pocketmine\item\PotionType::AWKWARD => 0, - \pocketmine\item\PotionType::FIRE_RESISTANCE => 1, - \pocketmine\item\PotionType::HARMING => 2, - \pocketmine\item\PotionType::HEALING => 3, - \pocketmine\item\PotionType::INVISIBILITY => 4, - \pocketmine\item\PotionType::LEAPING => 5, - \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE => 6, - \pocketmine\item\PotionType::LONG_INVISIBILITY => 7, - \pocketmine\item\PotionType::LONG_LEAPING => 8, - \pocketmine\item\PotionType::LONG_MUNDANE => 9, - \pocketmine\item\PotionType::LONG_NIGHT_VISION => 10, - \pocketmine\item\PotionType::LONG_POISON => 11, - \pocketmine\item\PotionType::LONG_REGENERATION => 12, - \pocketmine\item\PotionType::LONG_SLOWNESS => 13, - \pocketmine\item\PotionType::LONG_SLOW_FALLING => 14, - \pocketmine\item\PotionType::LONG_STRENGTH => 15, - \pocketmine\item\PotionType::LONG_SWIFTNESS => 16, - \pocketmine\item\PotionType::LONG_TURTLE_MASTER => 17, - \pocketmine\item\PotionType::LONG_WATER_BREATHING => 18, - \pocketmine\item\PotionType::LONG_WEAKNESS => 19, - \pocketmine\item\PotionType::MUNDANE => 20, - \pocketmine\item\PotionType::NIGHT_VISION => 21, - \pocketmine\item\PotionType::POISON => 22, - \pocketmine\item\PotionType::REGENERATION => 23, - \pocketmine\item\PotionType::SLOWNESS => 24, - \pocketmine\item\PotionType::SLOW_FALLING => 25, - \pocketmine\item\PotionType::STRENGTH => 26, - \pocketmine\item\PotionType::STRONG_HARMING => 27, - \pocketmine\item\PotionType::STRONG_HEALING => 28, - \pocketmine\item\PotionType::STRONG_LEAPING => 29, - \pocketmine\item\PotionType::STRONG_POISON => 30, - \pocketmine\item\PotionType::STRONG_REGENERATION => 31, - \pocketmine\item\PotionType::STRONG_SLOWNESS => 32, - \pocketmine\item\PotionType::STRONG_STRENGTH => 33, - \pocketmine\item\PotionType::STRONG_SWIFTNESS => 34, - \pocketmine\item\PotionType::STRONG_TURTLE_MASTER => 35, - \pocketmine\item\PotionType::SWIFTNESS => 36, - \pocketmine\item\PotionType::THICK => 37, - \pocketmine\item\PotionType::TURTLE_MASTER => 38, - \pocketmine\item\PotionType::WATER => 39, - \pocketmine\item\PotionType::WATER_BREATHING => 40, - \pocketmine\item\PotionType::WEAKNESS => 41, - \pocketmine\item\PotionType::WITHER => 42, - default => throw new \pocketmine\utils\AssumptionFailedError("All PotionType cases should be covered") - }); - } - - public function slabType(\pocketmine\block\utils\SlabType &$value) : void{ - $this->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 function suspiciousStewType(\pocketmine\item\SuspiciousStewType &$value) : void{ - $this->writeInt(4, match($value){ - \pocketmine\item\SuspiciousStewType::ALLIUM => 0, - \pocketmine\item\SuspiciousStewType::AZURE_BLUET => 1, - \pocketmine\item\SuspiciousStewType::BLUE_ORCHID => 2, - \pocketmine\item\SuspiciousStewType::CORNFLOWER => 3, - \pocketmine\item\SuspiciousStewType::DANDELION => 4, - \pocketmine\item\SuspiciousStewType::LILY_OF_THE_VALLEY => 5, - \pocketmine\item\SuspiciousStewType::OXEYE_DAISY => 6, - \pocketmine\item\SuspiciousStewType::POPPY => 7, - \pocketmine\item\SuspiciousStewType::TULIP => 8, - \pocketmine\item\SuspiciousStewType::WITHER_ROSE => 9, - default => throw new \pocketmine\utils\AssumptionFailedError("All SuspiciousStewType cases should be covered") - }); - } - -} diff --git a/src/item/Banner.php b/src/item/Banner.php index db54e97666..2fc53f5ae6 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -58,7 +58,7 @@ class Banner extends ItemBlockWallOrFloor{ } protected function describeState(RuntimeDataDescriber $w) : void{ - $w->dyeColor($this->color); + $w->enum($this->color); } /** diff --git a/src/item/Dye.php b/src/item/Dye.php index 6fd3f6dcb9..9fdfb96710 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -30,7 +30,7 @@ class Dye extends Item{ private DyeColor $color = DyeColor::BLACK; protected function describeState(RuntimeDataDescriber $w) : void{ - $w->dyeColor($this->color); + $w->enum($this->color); } public function getColor() : DyeColor{ diff --git a/src/item/Medicine.php b/src/item/Medicine.php index 1df7484149..bd2f724649 100644 --- a/src/item/Medicine.php +++ b/src/item/Medicine.php @@ -32,7 +32,7 @@ class Medicine extends Item implements ConsumableItem{ private MedicineType $medicineType = MedicineType::EYE_DROPS; protected function describeState(RuntimeDataDescriber $w) : void{ - $w->medicineType($this->medicineType); + $w->enum($this->medicineType); } public function getType() : MedicineType{ return $this->medicineType; } diff --git a/src/item/Potion.php b/src/item/Potion.php index 597430242a..41b0f634a8 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -32,7 +32,7 @@ class Potion extends Item implements ConsumableItem{ private PotionType $potionType = PotionType::WATER; protected function describeState(RuntimeDataDescriber $w) : void{ - $w->potionType($this->potionType); + $w->enum($this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index 8c18fd54c0..e1c9167ac3 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -34,7 +34,7 @@ class SplashPotion extends ProjectileItem{ private PotionType $potionType = PotionType::WATER; protected function describeState(RuntimeDataDescriber $w) : void{ - $w->potionType($this->potionType); + $w->enum($this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SuspiciousStew.php b/src/item/SuspiciousStew.php index 8d7c2ff3ac..7d1d30cc09 100644 --- a/src/item/SuspiciousStew.php +++ b/src/item/SuspiciousStew.php @@ -30,7 +30,7 @@ class SuspiciousStew extends Food{ private SuspiciousStewType $suspiciousStewType = SuspiciousStewType::POPPY; protected function describeState(RuntimeDataDescriber $w) : void{ - $w->suspiciousStewType($this->suspiciousStewType); + $w->enum($this->suspiciousStewType); } public function getType() : SuspiciousStewType{ return $this->suspiciousStewType; } From 58278f22f31e4b45b518d0122e81231932762ee8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 20:30:45 +0100 Subject: [PATCH 1374/1858] Remove deprecated API usages from tests --- tests/phpunit/block/BrewingStandTest.php | 6 +++--- tests/phpunit/data/bedrock/DyeColorIdMapTest.php | 4 ++-- tests/phpunit/item/BannerTest.php | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/phpunit/block/BrewingStandTest.php b/tests/phpunit/block/BrewingStandTest.php index b3363b98cd..aa175c740d 100644 --- a/tests/phpunit/block/BrewingStandTest.php +++ b/tests/phpunit/block/BrewingStandTest.php @@ -34,9 +34,9 @@ class BrewingStandTest extends TestCase{ * @phpstan-return \Generator}, void, void> */ public static function slotsProvider() : \Generator{ - yield [array_values(BrewingStandSlot::getAll())]; - yield [[BrewingStandSlot::EAST()]]; - yield [[BrewingStandSlot::EAST(), BrewingStandSlot::NORTHWEST()]]; + yield [BrewingStandSlot::cases()]; + yield [[BrewingStandSlot::EAST]]; + yield [[BrewingStandSlot::EAST, BrewingStandSlot::NORTHWEST]]; } /** diff --git a/tests/phpunit/data/bedrock/DyeColorIdMapTest.php b/tests/phpunit/data/bedrock/DyeColorIdMapTest.php index b5561019fa..a3ca6db25c 100644 --- a/tests/phpunit/data/bedrock/DyeColorIdMapTest.php +++ b/tests/phpunit/data/bedrock/DyeColorIdMapTest.php @@ -29,10 +29,10 @@ use pocketmine\block\utils\DyeColor; class DyeColorIdMapTest extends TestCase{ public function testAllColorsMapped() : void{ - foreach(DyeColor::getAll() as $color){ + foreach(DyeColor::cases() as $color){ $id = DyeColorIdMap::getInstance()->toId($color); $color2 = DyeColorIdMap::getInstance()->fromId($id); - self::assertTrue($color2 !== null && $color->equals($color2)); + self::assertTrue($color === $color2); } } } diff --git a/tests/phpunit/item/BannerTest.php b/tests/phpunit/item/BannerTest.php index c555031a09..797ca60fca 100644 --- a/tests/phpunit/item/BannerTest.php +++ b/tests/phpunit/item/BannerTest.php @@ -36,7 +36,7 @@ final class BannerTest extends TestCase{ $item = VanillaBlocks::BANNER()->asItem(); assert($item instanceof Banner); $item->setPatterns([ - new BannerPatternLayer(BannerPatternType::FLOWER(), DyeColor::RED()) + new BannerPatternLayer(BannerPatternType::FLOWER, DyeColor::RED) ]); $data = $item->nbtSerialize(); @@ -45,6 +45,6 @@ final class BannerTest extends TestCase{ self::assertInstanceOf(Banner::class, $item2); $patterns = $item2->getPatterns(); self::assertCount(1, $patterns); - self::assertTrue(BannerPatternType::FLOWER()->equals($patterns[0]->getType())); + self::assertTrue(BannerPatternType::FLOWER === $patterns[0]->getType()); } } From 07194e38840e9ea8546e1df3f2176662a4b55a9a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 7 Sep 2023 20:33:30 +0100 Subject: [PATCH 1375/1858] CS again --- tests/phpunit/block/BrewingStandTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/phpunit/block/BrewingStandTest.php b/tests/phpunit/block/BrewingStandTest.php index aa175c740d..85cdd90e11 100644 --- a/tests/phpunit/block/BrewingStandTest.php +++ b/tests/phpunit/block/BrewingStandTest.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use PHPUnit\Framework\TestCase; use pocketmine\block\utils\BrewingStandSlot; -use function array_values; use function count; class BrewingStandTest extends TestCase{ From 14f2368454914a4fe53e135336281ce595b3573d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 10:02:50 +0100 Subject: [PATCH 1376/1858] =?UTF-8?q?ToolTier:=20remove=20legacy=20EnumTra?= =?UTF-8?q?it=20annotations=20and=20doc=20comment=20info=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/item/ToolTier.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/item/ToolTier.php b/src/item/ToolTier.php index 6c7161c338..8469bc7e5f 100644 --- a/src/item/ToolTier.php +++ b/src/item/ToolTier.php @@ -26,10 +26,8 @@ namespace pocketmine\item; use pocketmine\utils\LegacyEnumShimTrait; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static ToolTier DIAMOND() * @method static ToolTier GOLD() From 7ce33d9375d90ee0d05e2d23a897b802eafa0da2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 10:34:12 +0100 Subject: [PATCH 1377/1858] Migrate final remaining EnumTrait users to native enums --- src/Server.php | 12 +-- src/block/DragonEgg.php | 2 +- .../defaults/DefaultGamemodeCommand.php | 3 +- src/command/defaults/GamemodeCommand.php | 4 +- src/crash/CrashDump.php | 2 +- src/data/java/GameModeIdMap.php | 18 ++-- src/network/mcpe/convert/TypeConverter.php | 38 +++------ .../mcpe/handler/InGamePacketHandler.php | 2 +- src/network/mcpe/raklib/RakLibInterface.php | 4 +- src/network/query/QueryInfo.php | 2 +- src/player/GameMode.php | 85 ++++++++++--------- src/player/Player.php | 16 ++-- src/plugin/PluginDescription.php | 2 +- src/plugin/PluginEnableOrder.php | 69 ++++++--------- src/wizard/SetupWizard.php | 6 +- 15 files changed, 124 insertions(+), 141 deletions(-) diff --git a/src/Server.php b/src/Server.php index 2f1e9a53bd..59a6ec645f 100644 --- a/src/Server.php +++ b/src/Server.php @@ -390,7 +390,7 @@ class Server{ } public function getGamemode() : GameMode{ - return GameMode::fromString($this->configGroup->getConfigString(ServerProperties::GAME_MODE, GameMode::SURVIVAL()->name())) ?? GameMode::SURVIVAL(); + return GameMode::fromString($this->configGroup->getConfigString(ServerProperties::GAME_MODE)) ?? GameMode::SURVIVAL; } public function getForceGamemode() : bool{ @@ -817,7 +817,7 @@ class Server{ ServerProperties::ENABLE_IPV6 => true, ServerProperties::WHITELIST => false, ServerProperties::MAX_PLAYERS => self::DEFAULT_MAX_PLAYERS, - ServerProperties::GAME_MODE => GameMode::SURVIVAL()->name(), + ServerProperties::GAME_MODE => GameMode::SURVIVAL->name, //TODO: this probably shouldn't use the enum name directly ServerProperties::FORCE_GAME_MODE => false, ServerProperties::HARDCORE => false, ServerProperties::PVP => true, @@ -1019,7 +1019,7 @@ class Server{ $this->forceShutdownExit(); return; } - if(!$this->enablePlugins(PluginEnableOrder::STARTUP())){ + if(!$this->enablePlugins(PluginEnableOrder::STARTUP)){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_plugin_someEnableErrors())); $this->forceShutdownExit(); return; @@ -1030,7 +1030,7 @@ class Server{ return; } - if(!$this->enablePlugins(PluginEnableOrder::POSTWORLD())){ + if(!$this->enablePlugins(PluginEnableOrder::POSTWORLD)){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_plugin_someEnableErrors())); $this->forceShutdownExit(); return; @@ -1385,14 +1385,14 @@ class Server{ public function enablePlugins(PluginEnableOrder $type) : bool{ $allSuccess = true; foreach($this->pluginManager->getPlugins() as $plugin){ - if(!$plugin->isEnabled() && $plugin->getDescription()->getOrder()->equals($type)){ + if(!$plugin->isEnabled() && $plugin->getDescription()->getOrder() === $type){ if(!$this->pluginManager->enablePlugin($plugin)){ $allSuccess = false; } } } - if($type->equals(PluginEnableOrder::POSTWORLD())){ + if($type === PluginEnableOrder::POSTWORLD){ $this->commandMap->registerServerAliases(); } diff --git a/src/block/DragonEgg.php b/src/block/DragonEgg.php index d76a910585..10fec63946 100644 --- a/src/block/DragonEgg.php +++ b/src/block/DragonEgg.php @@ -50,7 +50,7 @@ class DragonEgg extends Transparent implements Fallable{ } public function onAttack(Item $item, int $face, ?Player $player = null) : bool{ - if($player !== null && !$player->getGamemode()->equals(GameMode::CREATIVE())){ + if($player !== null && $player->getGamemode() !== GameMode::CREATIVE){ $this->teleport(); return true; } diff --git a/src/command/defaults/DefaultGamemodeCommand.php b/src/command/defaults/DefaultGamemodeCommand.php index bac98e6783..d3030eb27b 100644 --- a/src/command/defaults/DefaultGamemodeCommand.php +++ b/src/command/defaults/DefaultGamemodeCommand.php @@ -53,7 +53,8 @@ class DefaultGamemodeCommand extends VanillaCommand{ return true; } - $sender->getServer()->getConfigGroup()->setConfigString(ServerProperties::GAME_MODE, $gameMode->name()); + //TODO: this probably shouldn't use the enum name directly + $sender->getServer()->getConfigGroup()->setConfigString(ServerProperties::GAME_MODE, $gameMode->name); $sender->sendMessage(KnownTranslationFactory::commands_defaultgamemode_success($gameMode->getTranslatableName())); return true; } diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 86ca8e9df6..666626a692 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -61,13 +61,13 @@ class GamemodeCommand extends VanillaCommand{ return true; } - if($target->getGamemode()->equals($gameMode)){ + if($target->getGamemode() === $gameMode){ $sender->sendMessage(KnownTranslationFactory::pocketmine_command_gamemode_failure($target->getName())); return true; } $target->setGamemode($gameMode); - if(!$gameMode->equals($target->getGamemode())){ + if($gameMode !== $target->getGamemode()){ $sender->sendMessage(KnownTranslationFactory::pocketmine_command_gamemode_failure($target->getName())); }else{ if($target === $sender){ diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index b0e58fd166..1a558b499d 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -143,7 +143,7 @@ class CrashDump{ depends: $d->getDepend(), softDepends: $d->getSoftDepend(), main: $d->getMain(), - load: mb_strtoupper($d->getOrder()->name()), + load: mb_strtoupper($d->getOrder()->name), website: $d->getWebsite() ); } diff --git a/src/data/java/GameModeIdMap.php b/src/data/java/GameModeIdMap.php index 348749b51f..41258dd66e 100644 --- a/src/data/java/GameModeIdMap.php +++ b/src/data/java/GameModeIdMap.php @@ -26,6 +26,7 @@ namespace pocketmine\data\java; use pocketmine\player\GameMode; use pocketmine\utils\SingletonTrait; use function array_key_exists; +use function spl_object_id; final class GameModeIdMap{ use SingletonTrait; @@ -43,15 +44,15 @@ final class GameModeIdMap{ private array $enumToId = []; public function __construct(){ - $this->register(0, GameMode::SURVIVAL()); - $this->register(1, GameMode::CREATIVE()); - $this->register(2, GameMode::ADVENTURE()); - $this->register(3, GameMode::SPECTATOR()); + $this->register(0, GameMode::SURVIVAL); + $this->register(1, GameMode::CREATIVE); + $this->register(2, GameMode::ADVENTURE); + $this->register(3, GameMode::SPECTATOR); } private function register(int $id, GameMode $type) : void{ $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; + $this->enumToId[spl_object_id($type)] = $id; } public function fromId(int $id) : ?GameMode{ @@ -59,9 +60,10 @@ final class GameModeIdMap{ } public function toId(GameMode $type) : int{ - if(!array_key_exists($type->id(), $this->enumToId)){ - throw new \InvalidArgumentException("Game mode does not have a mapped ID"); //this should never happen + $k = spl_object_id($type); + if(!array_key_exists($k, $this->enumToId)){ + throw new \InvalidArgumentException("Game mode $type->name does not have a mapped ID"); //this should never happen } - return $this->enumToId[$type->id()]; + return $this->enumToId[$k]; } } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 94f476e9ca..53ce6e98a8 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -108,33 +108,23 @@ class TypeConverter{ * @internal */ public function coreGameModeToProtocol(GameMode $gamemode) : int{ - switch($gamemode->id()){ - case GameMode::SURVIVAL()->id(): - return ProtocolGameMode::SURVIVAL; - case GameMode::CREATIVE()->id(): - case GameMode::SPECTATOR()->id(): - return ProtocolGameMode::CREATIVE; - case GameMode::ADVENTURE()->id(): - return ProtocolGameMode::ADVENTURE; - default: - throw new AssumptionFailedError("Unknown game mode"); - } + return match($gamemode){ + GameMode::SURVIVAL => ProtocolGameMode::SURVIVAL, + //TODO: native spectator support + GameMode::CREATIVE, GameMode::SPECTATOR => ProtocolGameMode::CREATIVE, + GameMode::ADVENTURE => ProtocolGameMode::ADVENTURE, + }; } public function protocolGameModeToCore(int $gameMode) : ?GameMode{ - switch($gameMode){ - case ProtocolGameMode::SURVIVAL: - return GameMode::SURVIVAL(); - case ProtocolGameMode::CREATIVE: - return GameMode::CREATIVE(); - case ProtocolGameMode::ADVENTURE: - return GameMode::ADVENTURE(); - case ProtocolGameMode::CREATIVE_VIEWER: - case ProtocolGameMode::SURVIVAL_VIEWER: - return GameMode::SPECTATOR(); - default: - return null; - } + return match($gameMode){ + ProtocolGameMode::SURVIVAL => GameMode::SURVIVAL, + ProtocolGameMode::CREATIVE => GameMode::CREATIVE, + ProtocolGameMode::ADVENTURE => GameMode::ADVENTURE, + ProtocolGameMode::SURVIVAL_VIEWER, ProtocolGameMode::CREATIVE_VIEWER => GameMode::SPECTATOR, + //TODO: native spectator support + default => null, + }; } public function coreRecipeIngredientToNet(?RecipeIngredient $ingredient) : ProtocolRecipeIngredient{ diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 30841d8060..84ea10d360 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -783,7 +783,7 @@ class InGamePacketHandler extends PacketHandler{ public function handleSetPlayerGameType(SetPlayerGameTypePacket $packet) : bool{ $gameMode = $this->session->getTypeConverter()->protocolGameModeToCore($packet->gamemode); - if($gameMode === null || !$gameMode->equals($this->player->getGamemode())){ + if($gameMode !== $this->player->getGamemode()){ //Set this back to default. TODO: handle this properly $this->session->syncGameMode($this->player->getGamemode(), true); } diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 759a992e80..d189cf0fd3 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -271,8 +271,8 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->rakServerId, $this->server->getName(), match($this->server->getGamemode()){ - GameMode::SURVIVAL() => "Survival", - GameMode::ADVENTURE() => "Adventure", + GameMode::SURVIVAL => "Survival", + GameMode::ADVENTURE => "Adventure", default => "Creative" } ]) . ";" diff --git a/src/network/query/QueryInfo.php b/src/network/query/QueryInfo.php index cdb1c66dbe..0bf5b4f65e 100644 --- a/src/network/query/QueryInfo.php +++ b/src/network/query/QueryInfo.php @@ -71,7 +71,7 @@ final class QueryInfo{ $this->plugins = $server->getPluginManager()->getPlugins(); $this->players = array_map(fn(Player $p) => $p->getName(), $server->getOnlinePlayers()); - $this->gametype = ($server->getGamemode()->equals(GameMode::SURVIVAL()) || $server->getGamemode()->equals(GameMode::ADVENTURE())) ? "SMP" : "CMP"; + $this->gametype = ($server->getGamemode() === GameMode::SURVIVAL || $server->getGamemode() === GameMode::ADVENTURE) ? "SMP" : "CMP"; $this->version = $server->getVersion(); $this->server_engine = $server->getName() . " " . $server->getPocketMineVersion(); $world = $server->getWorldManager()->getDefaultWorld(); diff --git a/src/player/GameMode.php b/src/player/GameMode.php index 0fc60ece46..519cbbe8ae 100644 --- a/src/player/GameMode.php +++ b/src/player/GameMode.php @@ -25,73 +25,76 @@ namespace pocketmine\player; use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; use function mb_strtolower; +use function spl_object_id; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static GameMode ADVENTURE() * @method static GameMode CREATIVE() * @method static GameMode SPECTATOR() * @method static GameMode SURVIVAL() + * + * @phpstan-type TMetadata array{0: string, 1: Translatable, 2: list} */ -final class GameMode{ - use EnumTrait { - __construct as Enum___construct; - register as Enum_register; - } +enum GameMode{ + use LegacyEnumShimTrait; - /** @var self[] */ - protected static array $aliasMap = []; - - protected static function setup() : void{ - self::registerAll( - new self("survival", "Survival", KnownTranslationFactory::gameMode_survival(), ["survival", "s", "0"]), - new self("creative", "Creative", KnownTranslationFactory::gameMode_creative(), ["creative", "c", "1"]), - new self("adventure", "Adventure", KnownTranslationFactory::gameMode_adventure(), ["adventure", "a", "2"]), - new self("spectator", "Spectator", KnownTranslationFactory::gameMode_spectator(), ["spectator", "v", "view", "3"]) - ); - } - - protected static function register(self $member) : void{ - self::Enum_register($member); - foreach($member->getAliases() as $alias){ - self::$aliasMap[mb_strtolower($alias)] = $member; - } - } + case SURVIVAL; + case CREATIVE; + case ADVENTURE; + case SPECTATOR; public static function fromString(string $str) : ?self{ - self::checkInit(); - return self::$aliasMap[mb_strtolower($str)] ?? null; + /** + * @var self[]|null $aliasMap + * @phpstan-var array|null $aliasMap + */ + static $aliasMap = null; + + if($aliasMap === null){ + $aliasMap = []; + foreach(self::cases() as $case){ + foreach($case->getAliases() as $alias){ + $aliasMap[$alias] = $case; + } + } + } + + return $aliasMap[mb_strtolower($str)] ?? null; } /** - * @param string[] $aliases + * @phpstan-return TMetadata */ - private function __construct( - string $enumName, - private string $englishName, - private Translatable $translatableName, - private array $aliases = [] - ){ - $this->Enum___construct($enumName); + private function getMetadata() : array{ + /** @phpstan-var array $cache */ + static $cache = []; + + return $cache[spl_object_id($this)] ??= match($this){ + self::SURVIVAL => ["Survival", KnownTranslationFactory::gameMode_survival(), ["survival", "s", "0"]], + self::CREATIVE => ["Creative", KnownTranslationFactory::gameMode_creative(), ["creative", "c", "1"]], + self::ADVENTURE => ["Adventure", KnownTranslationFactory::gameMode_adventure(), ["adventure", "a", "2"]], + self::SPECTATOR => ["Spectator", KnownTranslationFactory::gameMode_spectator(), ["spectator", "v", "view", "3"]] + }; } public function getEnglishName() : string{ - return $this->englishName; + return $this->getMetadata()[0]; } - public function getTranslatableName() : Translatable{ return $this->translatableName; } + public function getTranslatableName() : Translatable{ + return $this->getMetadata()[1]; + } /** * @return string[] */ public function getAliases() : array{ - return $this->aliases; + return $this->getMetadata()[2]; } //TODO: ability sets per gamemode diff --git a/src/player/Player.php b/src/player/Player.php index 06d1c31035..0afa0bffe3 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -372,7 +372,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->lastPlayed = $nbt->getLong(self::TAG_LAST_PLAYED, $now); if(!$this->server->getForceGamemode() && ($gameModeTag = $nbt->getTag(self::TAG_GAME_MODE)) instanceof IntTag){ - $this->internalSetGameMode(GameModeIdMap::getInstance()->fromId($gameModeTag->getValue()) ?? GameMode::SURVIVAL()); //TODO: bad hack here to avoid crashes on corrupted data + $this->internalSetGameMode(GameModeIdMap::getInstance()->fromId($gameModeTag->getValue()) ?? GameMode::SURVIVAL); //TODO: bad hack here to avoid crashes on corrupted data }else{ $this->internalSetGameMode($this->server->getGamemode()); } @@ -1113,7 +1113,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected function internalSetGameMode(GameMode $gameMode) : void{ $this->gamemode = $gameMode; - $this->allowFlight = $this->gamemode->equals(GameMode::CREATIVE()); + $this->allowFlight = $this->gamemode === GameMode::CREATIVE; $this->hungerManager->setEnabled($this->isSurvival()); if($this->isSpectator()){ @@ -1139,7 +1139,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * Sets the provided gamemode. */ public function setGamemode(GameMode $gm) : bool{ - if($this->gamemode->equals($gm)){ + if($this->gamemode === $gm){ return false; } @@ -1168,7 +1168,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @param bool $literal whether a literal check should be performed */ public function isSurvival(bool $literal = false) : bool{ - return $this->gamemode->equals(GameMode::SURVIVAL()) || (!$literal && $this->gamemode->equals(GameMode::ADVENTURE())); + return $this->gamemode === GameMode::SURVIVAL || (!$literal && $this->gamemode === GameMode::ADVENTURE); } /** @@ -1178,7 +1178,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @param bool $literal whether a literal check should be performed */ public function isCreative(bool $literal = false) : bool{ - return $this->gamemode->equals(GameMode::CREATIVE()) || (!$literal && $this->gamemode->equals(GameMode::SPECTATOR())); + return $this->gamemode === GameMode::CREATIVE || (!$literal && $this->gamemode === GameMode::SPECTATOR); } /** @@ -1188,18 +1188,18 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ * @param bool $literal whether a literal check should be performed */ public function isAdventure(bool $literal = false) : bool{ - return $this->gamemode->equals(GameMode::ADVENTURE()) || (!$literal && $this->gamemode->equals(GameMode::SPECTATOR())); + return $this->gamemode === GameMode::ADVENTURE || (!$literal && $this->gamemode === GameMode::SPECTATOR); } public function isSpectator() : bool{ - return $this->gamemode->equals(GameMode::SPECTATOR()); + return $this->gamemode === GameMode::SPECTATOR; } /** * TODO: make this a dynamic ability instead of being hardcoded */ public function hasFiniteResources() : bool{ - return !$this->gamemode->equals(GameMode::CREATIVE()); + return $this->gamemode !== GameMode::CREATIVE; } public function getDrops() : array{ diff --git a/src/plugin/PluginDescription.php b/src/plugin/PluginDescription.php index 9fc562af91..72f0add7fd 100644 --- a/src/plugin/PluginDescription.php +++ b/src/plugin/PluginDescription.php @@ -203,7 +203,7 @@ class PluginDescription{ } $this->order = $order; }else{ - $this->order = PluginEnableOrder::POSTWORLD(); + $this->order = PluginEnableOrder::POSTWORLD; } $this->authors = []; diff --git a/src/plugin/PluginEnableOrder.php b/src/plugin/PluginEnableOrder.php index 5e6255a16e..c942ea33f9 100644 --- a/src/plugin/PluginEnableOrder.php +++ b/src/plugin/PluginEnableOrder.php @@ -23,63 +23,48 @@ declare(strict_types=1); namespace pocketmine\plugin; -use pocketmine\utils\EnumTrait; +use pocketmine\utils\LegacyEnumShimTrait; use function mb_strtolower; /** - * This doc-block is generated automatically, do not modify it manually. - * This must be regenerated whenever registry members are added, removed or changed. - * @see build/generate-registry-annotations.php - * @generate-registry-docblock + * TODO: These tags need to be removed once we get rid of LegacyEnumShimTrait (PM6) + * These are retained for backwards compatibility only. * * @method static PluginEnableOrder POSTWORLD() * @method static PluginEnableOrder STARTUP() */ -final class PluginEnableOrder{ - use EnumTrait { - __construct as Enum___construct; - register as Enum_register; - } +enum PluginEnableOrder{ + use LegacyEnumShimTrait; - protected static function setup() : void{ - self::registerAll( - new self("startup", ["startup"]), - new self("postworld", ["postworld"]) - ); - } - - /** - * @var self[] - * @phpstan-var array - */ - private static array $aliasMap = []; - - protected static function register(self $member) : void{ - self::Enum_register($member); - foreach($member->getAliases() as $alias){ - self::$aliasMap[mb_strtolower($alias)] = $member; - } - } + case STARTUP; + case POSTWORLD; public static function fromString(string $name) : ?self{ - self::checkInit(); - return self::$aliasMap[mb_strtolower($name)] ?? null; - } + /** + * @var self[]|null $aliasMap + * @phpstan-var array|null $aliasMap + */ + static $aliasMap = null; - /** - * @param string[] $aliases - * @phpstan-param list $aliases - */ - private function __construct( - string $enumName, - private array $aliases - ){ - $this->Enum___construct($enumName); + if($aliasMap === null){ + $aliasMap = []; + foreach(self::cases() as $case){ + foreach($case->getAliases() as $alias){ + $aliasMap[$alias] = $case; + } + } + } + return $aliasMap[mb_strtolower($name)] ?? null; } /** * @return string[] * @phpstan-return list */ - public function getAliases() : array{ return $this->aliases; } + public function getAliases() : array{ + return match($this){ + self::STARTUP => ["startup"], + self::POSTWORLD => ["postworld"] + }; + } } diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index c9170bd8dd..8c19060801 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -165,9 +165,11 @@ LICENSE; $this->message($this->lang->translate(KnownTranslationFactory::gamemode_info())); do{ - $gamemode = GameModeIdMap::getInstance()->fromId((int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), (string) GameModeIdMap::getInstance()->toId(GameMode::SURVIVAL()))); + //TODO: drop the usage of internal Mojang IDs for this - we really just need a set of options to choose from + $gamemode = GameModeIdMap::getInstance()->fromId((int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), (string) GameModeIdMap::getInstance()->toId(GameMode::SURVIVAL))); }while($gamemode === null); - $config->set("gamemode", $gamemode->name()); + //TODO: this probably shouldn't use the enum name directly + $config->set("gamemode", $gamemode->name); $config->set("max-players", (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) self::DEFAULT_PLAYERS)); From aa916b2c49dd322d0c0b434698b2105ee8b4936e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 11:17:47 +0100 Subject: [PATCH 1378/1858] WoodLikeBlockIdHelper: reduce obnoxious code --- src/block/WoodLikeBlockIdHelper.php | 80 ++++++----------------------- 1 file changed, 17 insertions(+), 63 deletions(-) diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php index add1d54c0c..3569bd0db0 100644 --- a/src/block/WoodLikeBlockIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -153,69 +153,23 @@ final class WoodLikeBlockIdHelper{ * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} */ public static function getSignInfo(WoodType $treeType) : array{ - switch($treeType){ - case WoodType::OAK: - return [ - new BID(Ids::OAK_SIGN, TileSign::class), - new BID(Ids::OAK_WALL_SIGN, TileSign::class), - fn() => VanillaItems::OAK_SIGN() - ]; - case WoodType::SPRUCE: - return [ - new BID(Ids::SPRUCE_SIGN, TileSign::class), - new BID(Ids::SPRUCE_WALL_SIGN, TileSign::class), - fn() => VanillaItems::SPRUCE_SIGN() - ]; - case WoodType::BIRCH: - return [ - new BID(Ids::BIRCH_SIGN, TileSign::class), - new BID(Ids::BIRCH_WALL_SIGN, TileSign::class), - fn() => VanillaItems::BIRCH_SIGN() - ]; - case WoodType::JUNGLE: - return [ - new BID(Ids::JUNGLE_SIGN, TileSign::class), - new BID(Ids::JUNGLE_WALL_SIGN, TileSign::class), - fn() => VanillaItems::JUNGLE_SIGN() - ]; - case WoodType::ACACIA: - return [ - new BID(Ids::ACACIA_SIGN, TileSign::class), - new BID(Ids::ACACIA_WALL_SIGN, TileSign::class), - fn() => VanillaItems::ACACIA_SIGN() - ]; - case WoodType::DARK_OAK: - return [ - new BID(Ids::DARK_OAK_SIGN, TileSign::class), - new BID(Ids::DARK_OAK_WALL_SIGN, TileSign::class), - fn() => VanillaItems::DARK_OAK_SIGN() - ]; - case WoodType::MANGROVE: - return [ - new BID(Ids::MANGROVE_SIGN, TileSign::class), - new BID(Ids::MANGROVE_WALL_SIGN, TileSign::class), - fn() => VanillaItems::MANGROVE_SIGN() - ]; - case WoodType::CRIMSON: - return [ - new BID(Ids::CRIMSON_SIGN, TileSign::class), - new BID(Ids::CRIMSON_WALL_SIGN, TileSign::class), - fn() => VanillaItems::CRIMSON_SIGN() - ]; - case WoodType::WARPED: - return [ - new BID(Ids::WARPED_SIGN, TileSign::class), - new BID(Ids::WARPED_WALL_SIGN, TileSign::class), - fn() => VanillaItems::WARPED_SIGN() - ]; - case WoodType::CHERRY: - return [ - new BID(Ids::CHERRY_SIGN, TileSign::class), - new BID(Ids::CHERRY_WALL_SIGN, TileSign::class), - fn() => VanillaItems::CHERRY_SIGN() - ]; - } - throw new AssumptionFailedError("Switch should cover all wood types"); + $make = fn(int $floorId, int $wallId, \Closure $getItem) => [ + new BID($floorId, TileSign::class), + new BID($wallId, TileSign::class), + $getItem + ]; + return match($treeType){ + WoodType::OAK => $make(Ids::OAK_SIGN, Ids::OAK_WALL_SIGN, fn() => VanillaItems::OAK_SIGN()), + WoodType::SPRUCE => $make(Ids::SPRUCE_SIGN, Ids::SPRUCE_WALL_SIGN, fn() => VanillaItems::SPRUCE_SIGN()), + WoodType::BIRCH => $make(Ids::BIRCH_SIGN, Ids::BIRCH_WALL_SIGN, fn() => VanillaItems::BIRCH_SIGN()), + WoodType::JUNGLE => $make(Ids::JUNGLE_SIGN, Ids::JUNGLE_WALL_SIGN, fn() => VanillaItems::JUNGLE_SIGN()), + WoodType::ACACIA => $make(Ids::ACACIA_SIGN, Ids::ACACIA_WALL_SIGN, fn() => VanillaItems::ACACIA_SIGN()), + WoodType::DARK_OAK => $make(Ids::DARK_OAK_SIGN, Ids::DARK_OAK_WALL_SIGN, fn() => VanillaItems::DARK_OAK_SIGN()), + WoodType::MANGROVE => $make(Ids::MANGROVE_SIGN, Ids::MANGROVE_WALL_SIGN, fn() => VanillaItems::MANGROVE_SIGN()), + WoodType::CRIMSON => $make(Ids::CRIMSON_SIGN, Ids::CRIMSON_WALL_SIGN, fn() => VanillaItems::CRIMSON_SIGN()), + WoodType::WARPED => $make(Ids::WARPED_SIGN, Ids::WARPED_WALL_SIGN, fn() => VanillaItems::WARPED_SIGN()), + WoodType::CHERRY => $make(Ids::CHERRY_SIGN, Ids::CHERRY_WALL_SIGN, fn() => VanillaItems::CHERRY_SIGN()), + }; } public static function getTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ From d3ab516ba491e35d2aa189ffd9049822a36fe751 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 11:26:58 +0100 Subject: [PATCH 1379/1858] CS --- src/block/WoodLikeBlockIdHelper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php index 3569bd0db0..5f668608a8 100644 --- a/src/block/WoodLikeBlockIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -30,7 +30,6 @@ use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; use pocketmine\item\VanillaItems; -use pocketmine\utils\AssumptionFailedError; /** * All wood-like blocks have different IDs for different wood types. From a5aeabd83662ad9bd52dd83650b4a9684df23383 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 12:16:16 +0100 Subject: [PATCH 1380/1858] RegistryTrait: fixed mishandling of self::$members Since PHPStan doesn't warn about potential nulls on untyped properties, this flew under the radar. --- src/utils/RegistryTrait.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils/RegistryTrait.php b/src/utils/RegistryTrait.php index 573f4737f1..2071f4c07c 100644 --- a/src/utils/RegistryTrait.php +++ b/src/utils/RegistryTrait.php @@ -37,8 +37,8 @@ use function preg_match; */ trait RegistryTrait{ /** - * @var object[] - * @phpstan-var array + * @var object[]|null + * @phpstan-var array|null */ private static $members = null; @@ -54,6 +54,9 @@ trait RegistryTrait{ * @throws \InvalidArgumentException */ private static function _registryRegister(string $name, object $member) : void{ + if(self::$members === null){ + throw new AssumptionFailedError("Cannot register members outside of " . self::class . "::setup()"); + } self::verifyName($name); $upperName = mb_strtoupper($name); if(isset(self::$members[$upperName])){ @@ -86,6 +89,9 @@ trait RegistryTrait{ */ private static function _registryFromString(string $name) : object{ self::checkInit(); + if(self::$members === null){ + throw new AssumptionFailedError(self::class . "::checkInit() did not initialize self::\$members correctly"); + } $upperName = mb_strtoupper($name); if(!isset(self::$members[$upperName])){ throw new \InvalidArgumentException("No such registry member: " . self::class . "::" . $upperName); @@ -121,6 +127,6 @@ trait RegistryTrait{ */ private static function _registryGetAll() : array{ self::checkInit(); - return array_map(self::preprocessMember(...), self::$members); + return array_map(self::preprocessMember(...), self::$members ?? throw new AssumptionFailedError(self::class . "::checkInit() did not initialize self::\$members correctly")); } } From 03ecc98a24cb7d1a985d9400f2c33b9d0216e04a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 12:16:45 +0100 Subject: [PATCH 1381/1858] HangingRoots: fixed support conditions --- src/block/HangingRoots.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/block/HangingRoots.php b/src/block/HangingRoots.php index cd85bcea79..b5ddf7f602 100644 --- a/src/block/HangingRoots.php +++ b/src/block/HangingRoots.php @@ -32,19 +32,19 @@ use pocketmine\world\BlockTransaction; final class HangingRoots extends Flowable{ - private function canBeSupportedBy(Block $block) : bool{ - return $block->isSolid(); //TODO: not sure if this is the correct logic + private function canBeSupportedAt(Block $block) : bool{ + return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); //weird I know, but they can be placed on the bottom of fences } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$blockReplace->getSide(Facing::UP)->isSolid()){ + if(!$this->canBeSupportedAt($blockReplace)){ return false; } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::UP))){ + if(!$this->canBeSupportedAt($this)){ $this->position->getWorld()->useBreakOn($this->position); } } From 0e87ee1e0e9d8a259e6e8b8b28325cc29b998162 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 12:22:00 +0100 Subject: [PATCH 1382/1858] =?UTF-8?q?=C3=82HangingRoots:=20fixed=20incorre?= =?UTF-8?q?ct=20support=20face?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/HangingRoots.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/HangingRoots.php b/src/block/HangingRoots.php index b5ddf7f602..0e03f4468f 100644 --- a/src/block/HangingRoots.php +++ b/src/block/HangingRoots.php @@ -33,7 +33,7 @@ use pocketmine\world\BlockTransaction; final class HangingRoots extends Flowable{ private function canBeSupportedAt(Block $block) : bool{ - return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); //weird I know, but they can be placed on the bottom of fences + return $block->getAdjacentSupportType(Facing::UP)->hasCenterSupport(); //weird I know, but they can be placed on the bottom of fences } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ From d60fca0a1c33ace9d158335fb9c5a9d7c08540c1 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 8 Sep 2023 13:25:26 +0200 Subject: [PATCH 1383/1858] Age blocks logic moved into dedicated trait (#5962) --- src/block/Cactus.php | 21 ++----------- src/block/CaveVines.php | 17 ++-------- src/block/ChorusFlower.php | 24 +++------------ src/block/CocoaBlock.php | 15 ++------- src/block/Crops.php | 28 +++++------------ src/block/Fire.php | 21 ++----------- src/block/FrostedIce.php | 21 ++----------- src/block/NetherVines.php | 24 ++------------- src/block/NetherWartPlant.php | 21 ++----------- src/block/Sugarcane.php | 21 ++----------- src/block/SweetBerryBush.php | 22 +++---------- src/block/utils/AgeableTrait.php | 53 ++++++++++++++++++++++++++++++++ 12 files changed, 92 insertions(+), 196 deletions(-) create mode 100644 src/block/utils/AgeableTrait.php diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 81d94474b1..046affe723 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageEvent; @@ -37,25 +37,10 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Cactus extends Transparent{ + use AgeableTrait; + public const MAX_AGE = 15; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function hasEntityCollision() : bool{ return true; } diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index 18e820bfa7..5f9c4c610d 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -38,9 +39,10 @@ use pocketmine\world\sound\GlowBerriesPickSound; use function mt_rand; class CaveVines extends Flowable{ + use AgeableTrait; + public const MAX_AGE = 25; - protected int $age = 0; protected bool $berries = false; protected bool $head = false; @@ -66,19 +68,6 @@ class CaveVines extends Flowable{ return $this; } - public function getAge() : int{ - return $this->age; - } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0-" . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function canClimb() : bool{ return true; } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 5c5077f22a..74366a68eb 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\block\utils\AgeableTrait; use pocketmine\entity\projectile\Projectile; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Item; @@ -39,31 +39,17 @@ use pocketmine\world\sound\ChorusFlowerDieSound; use pocketmine\world\sound\ChorusFlowerGrowSound; use pocketmine\world\World; use function array_rand; +use function min; use function mt_rand; final class ChorusFlower extends Flowable{ + use AgeableTrait; + public const MIN_AGE = 0; public const MAX_AGE = 5; private const MAX_STEM_HEIGHT = 5; - private int $age = self::MIN_AGE; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, self::MIN_AGE, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < self::MIN_AGE || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in the range " . self::MIN_AGE . " ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - protected function recalculateCollisionBoxes() : array{ return [AxisAlignedBB::one()]; } @@ -181,7 +167,7 @@ final class ChorusFlower extends Flowable{ if($tx === null){ $tx = new BlockTransaction($this->position->getWorld()); } - $tx->addBlock($this->position->getSide($facing), (clone $this)->setAge($this->getAge() + $ageChange)); + $tx->addBlock($this->position->getSide($facing), (clone $this)->setAge(min(self::MAX_AGE, $this->getAge() + $ageChange))); return $tx; } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index fcd9f4e0f4..a765142496 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; @@ -41,27 +42,15 @@ use function mt_rand; class CocoaBlock extends Transparent{ use HorizontalFacingTrait; + use AgeableTrait; public const MAX_AGE = 2; - protected int $age = 0; - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->boundedInt(2, 0, self::MAX_AGE, $this->age); } - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - /** * @return AxisAlignedBB[] */ diff --git a/src/block/Crops.php b/src/block/Crops.php index d6e84c4243..87966f1dbe 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -34,25 +34,10 @@ use pocketmine\world\BlockTransaction; use function mt_rand; abstract class Crops extends Flowable{ + use AgeableTrait; + public const MAX_AGE = 7; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($blockReplace->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); @@ -64,10 +49,11 @@ abstract class Crops extends Flowable{ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($this->age < self::MAX_AGE && $item instanceof Fertilizer){ $block = clone $this; - $block->age += mt_rand(2, 5); - if($block->age > self::MAX_AGE){ - $block->age = self::MAX_AGE; + $tempAge = $block->age + mt_rand(2, 5); + if($tempAge > self::MAX_AGE){ + $tempAge = self::MAX_AGE; } + $block->age = $tempAge; if(BlockEventHelper::grow($this, $block, $player)){ $item->pop(); } diff --git a/src/block/Fire.php b/src/block/Fire.php index fbe765432e..5487c34ede 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\BlockBurnEvent; use pocketmine\math\Facing; use pocketmine\world\format\Chunk; @@ -36,25 +36,10 @@ use function min; use function mt_rand; class Fire extends BaseFire{ + use AgeableTrait; + public const MAX_AGE = 15; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - protected function getFireDamage() : int{ return 1; } diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 039fe49f36..3e85923067 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,30 +23,15 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; use function mt_rand; class FrostedIce extends Ice{ + use AgeableTrait; + public const MAX_AGE = 3; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function onNearbyBlockChange() : void{ $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, mt_rand(20, 40)); } diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index 968a9b92eb..ac04e05e31 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\FortuneDropHelper; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -41,36 +41,18 @@ use function mt_rand; * This class is used for Weeping & Twisting vines, because they have same behaviour */ class NetherVines extends Flowable{ + use AgeableTrait; + public const MAX_AGE = 25; /** Direction the vine grows towards. */ private int $growthFace; - protected int $age = 0; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, int $growthFace){ $this->growthFace = $growthFace; parent::__construct($idInfo, $name, $typeInfo); } - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(5, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ - return $this->age; - } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0-" . self::MAX_AGE); - } - - $this->age = $age; - return $this; - } - public function isAffectedBySilkTouch() : bool{ return true; } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index d7e5874417..b6c1d847d7 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -34,25 +34,10 @@ use pocketmine\world\BlockTransaction; use function mt_rand; class NetherWartPlant extends Flowable{ + use AgeableTrait; + public const MAX_AGE = 3; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, 0, self::MAX_AGE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ..." . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); if($down->getTypeId() === BlockTypeIds::SOUL_SAND){ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 3757e45772..d2abe2c954 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -34,14 +34,10 @@ use pocketmine\world\BlockTransaction; use pocketmine\world\Position; class Sugarcane extends Flowable{ + use AgeableTrait; + public const MAX_AGE = 15; - protected int $age = 0; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, self::MAX_AGE, $this->age); - } - private function seekToBottom() : Position{ $world = $this->position->getWorld(); $bottom = $this->position; @@ -74,17 +70,6 @@ class Sugarcane extends Flowable{ return $grew; } - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < 0 || $age > self::MAX_AGE){ - throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); - } - $this->age = $age; - return $this; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item instanceof Fertilizer){ if($this->grow($this->seekToBottom(), $player)){ diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index ef1169df53..bd3cf28710 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityDamageByBlockEvent; @@ -39,27 +39,13 @@ use pocketmine\world\BlockTransaction; use function mt_rand; class SweetBerryBush extends Flowable{ + use AgeableTrait; + public const STAGE_SAPLING = 0; public const STAGE_BUSH_NO_BERRIES = 1; public const STAGE_BUSH_SOME_BERRIES = 2; public const STAGE_MATURE = 3; - - protected int $age = self::STAGE_SAPLING; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE, $this->age); - } - - public function getAge() : int{ return $this->age; } - - /** @return $this */ - public function setAge(int $age) : self{ - if($age < self::STAGE_SAPLING || $age > self::STAGE_MATURE){ - throw new \InvalidArgumentException("Age must be in range 0-3"); - } - $this->age = $age; - return $this; - } + public const MAX_AGE = self::STAGE_MATURE; public function getBerryDropAmount() : int{ if($this->age === self::STAGE_MATURE){ diff --git a/src/block/utils/AgeableTrait.php b/src/block/utils/AgeableTrait.php new file mode 100644 index 0000000000..6ef1ce826e --- /dev/null +++ b/src/block/utils/AgeableTrait.php @@ -0,0 +1,53 @@ +boundedInt((int) ceil(log(self::MAX_AGE, 2)), 0, self::MAX_AGE, $this->age); + } + + public function getAge() : int{ return $this->age; } + + /** + * @return $this + */ + public function setAge(int $age) : self{ + if($age < 0 || $age > self::MAX_AGE){ + throw new \InvalidArgumentException("Age must be in range 0 ... " . self::MAX_AGE); + } + $this->age = $age; + return $this; + } +} From d7f69c5e2484ce6b52266e7ed4d0dfb2523be194 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 12:47:46 +0100 Subject: [PATCH 1384/1858] CaveVines: fixed incorrect support condition --- src/block/CaveVines.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index 6ff934881d..ce8fdd9708 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -88,7 +88,8 @@ class CaveVines extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - return $block->getAdjacentSupportType(Facing::UP)->equals(SupportType::FULL()) || $block->hasSameTypeId($this); + $supportBlock = $block->getSide(Facing::UP); + return $supportBlock->getSupportType(Facing::DOWN)->equals(SupportType::FULL()) || $supportBlock->hasSameTypeId($this); } public function onNearbyBlockChange() : void{ From 904b0acfff97f4ecf2187c66c820ef97aa7aa2a7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 15:11:59 +0100 Subject: [PATCH 1385/1858] SetupWizard: replace hardcoded config keys --- src/wizard/SetupWizard.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index 8c19060801..f068b39086 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -34,6 +34,7 @@ use pocketmine\lang\LanguageNotFoundException; use pocketmine\lang\Translatable; use pocketmine\player\GameMode; use pocketmine\Server; +use pocketmine\ServerProperties; use pocketmine\utils\Config; use pocketmine\utils\Internet; use pocketmine\utils\InternetException; @@ -91,7 +92,7 @@ class SetupWizard{ //this has to happen here to prevent user avoiding agreeing to license $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); - $config->set("language", $lang); + $config->set(ServerProperties::LANGUAGE, $lang); $config->save(); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::skip_installer()), "n", "y/N")) === "y"){ @@ -154,13 +155,12 @@ LICENSE; private function generateBaseConfig() : void{ $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); - $config->set("motd", ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), self::DEFAULT_NAME))); - $config->set("server-name", $name); + $config->set(ServerProperties::MOTD, ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), self::DEFAULT_NAME))); $this->message($this->lang->translate(KnownTranslationFactory::port_warning())); - $config->set("server-port", $this->askPort(KnownTranslationFactory::server_port_v4(), Server::DEFAULT_PORT_IPV4)); - $config->set("server-portv6", $this->askPort(KnownTranslationFactory::server_port_v6(), Server::DEFAULT_PORT_IPV6)); + $config->set(ServerProperties::SERVER_PORT_IPV4, $this->askPort(KnownTranslationFactory::server_port_v4(), Server::DEFAULT_PORT_IPV4)); + $config->set(ServerProperties::SERVER_PORT_IPV6, $this->askPort(KnownTranslationFactory::server_port_v6(), Server::DEFAULT_PORT_IPV6)); $this->message($this->lang->translate(KnownTranslationFactory::gamemode_info())); @@ -169,11 +169,11 @@ LICENSE; $gamemode = GameModeIdMap::getInstance()->fromId((int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), (string) GameModeIdMap::getInstance()->toId(GameMode::SURVIVAL))); }while($gamemode === null); //TODO: this probably shouldn't use the enum name directly - $config->set("gamemode", $gamemode->name); + $config->set(ServerProperties::GAME_MODE, $gamemode->name); - $config->set("max-players", (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) self::DEFAULT_PLAYERS)); + $config->set(ServerProperties::MAX_PLAYERS, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) self::DEFAULT_PLAYERS)); - $config->set("view-distance", (int) $this->getInput($this->lang->translate(KnownTranslationFactory::view_distance()), (string) Server::DEFAULT_MAX_VIEW_DISTANCE)); + $config->set(ServerProperties::VIEW_DISTANCE, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::view_distance()), (string) Server::DEFAULT_MAX_VIEW_DISTANCE)); $config->save(); } @@ -195,9 +195,9 @@ LICENSE; $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::whitelist_enable()), "n", "y/N")) === "y"){ $this->error($this->lang->translate(KnownTranslationFactory::whitelist_warning())); - $config->set("white-list", true); + $config->set(ServerProperties::WHITELIST, true); }else{ - $config->set("white-list", false); + $config->set(ServerProperties::WHITELIST, false); } $config->save(); } @@ -207,9 +207,9 @@ LICENSE; $this->error($this->lang->translate(KnownTranslationFactory::query_warning1())); $this->error($this->lang->translate(KnownTranslationFactory::query_warning2())); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::query_disable()), "n", "y/N")) === "y"){ - $config->set("enable-query", false); + $config->set(ServerProperties::ENABLE_QUERY, false); }else{ - $config->set("enable-query", true); + $config->set(ServerProperties::ENABLE_QUERY, true); } $config->save(); From 33a0fb90619be01be256fafec92b20fac8bcd1f6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 15:14:51 +0100 Subject: [PATCH 1386/1858] SetupWizard: clean up crusty code that loads server.properties 3 times --- src/wizard/SetupWizard.php | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index f068b39086..0d779c9ba1 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -102,10 +102,12 @@ class SetupWizard{ $this->writeLine(); $this->welcome(); - $this->generateBaseConfig(); - $this->generateUserFiles(); - $this->networkFunctions(); + $this->generateBaseConfig($config); + $this->generateUserFiles($config); + $this->networkFunctions($config); + $config->save(); + $this->printIpDetails(); $this->endWizard(); @@ -152,9 +154,7 @@ LICENSE; } } - private function generateBaseConfig() : void{ - $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); - + private function generateBaseConfig(Config $config) : void{ $config->set(ServerProperties::MOTD, ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), self::DEFAULT_NAME))); $this->message($this->lang->translate(KnownTranslationFactory::port_warning())); @@ -174,11 +174,9 @@ LICENSE; $config->set(ServerProperties::MAX_PLAYERS, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) self::DEFAULT_PLAYERS)); $config->set(ServerProperties::VIEW_DISTANCE, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::view_distance()), (string) Server::DEFAULT_MAX_VIEW_DISTANCE)); - - $config->save(); } - private function generateUserFiles() : void{ + private function generateUserFiles(Config $config) : void{ $this->message($this->lang->translate(KnownTranslationFactory::op_info())); $op = strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::op_who()), "")); @@ -192,18 +190,15 @@ LICENSE; $this->message($this->lang->translate(KnownTranslationFactory::whitelist_info())); - $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::whitelist_enable()), "n", "y/N")) === "y"){ $this->error($this->lang->translate(KnownTranslationFactory::whitelist_warning())); $config->set(ServerProperties::WHITELIST, true); }else{ $config->set(ServerProperties::WHITELIST, false); } - $config->save(); } - private function networkFunctions() : void{ - $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); + private function networkFunctions(Config $config) : void{ $this->error($this->lang->translate(KnownTranslationFactory::query_warning1())); $this->error($this->lang->translate(KnownTranslationFactory::query_warning2())); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::query_disable()), "n", "y/N")) === "y"){ @@ -211,8 +206,6 @@ LICENSE; }else{ $config->set(ServerProperties::ENABLE_QUERY, true); } - - $config->save(); } private function printIpDetails() : void{ From 999eab0c8436211adffb323e7047701e0d1ee420 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 15:43:36 +0100 Subject: [PATCH 1387/1858] SetupWizard: use Server constants directly --- src/wizard/SetupWizard.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index 0d779c9ba1..94158c16b7 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -49,8 +49,11 @@ use const PHP_EOL; use const STDIN; class SetupWizard{ + /** @deprecated */ public const DEFAULT_NAME = Server::DEFAULT_SERVER_NAME; + /** @deprecated */ public const DEFAULT_PORT = Server::DEFAULT_PORT_IPV4; + /** @deprecated */ public const DEFAULT_PLAYERS = Server::DEFAULT_MAX_PLAYERS; private Language $lang; @@ -155,7 +158,7 @@ LICENSE; } private function generateBaseConfig(Config $config) : void{ - $config->set(ServerProperties::MOTD, ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), self::DEFAULT_NAME))); + $config->set(ServerProperties::MOTD, ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), Server::DEFAULT_SERVER_NAME))); $this->message($this->lang->translate(KnownTranslationFactory::port_warning())); @@ -171,7 +174,7 @@ LICENSE; //TODO: this probably shouldn't use the enum name directly $config->set(ServerProperties::GAME_MODE, $gamemode->name); - $config->set(ServerProperties::MAX_PLAYERS, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) self::DEFAULT_PLAYERS)); + $config->set(ServerProperties::MAX_PLAYERS, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) Server::DEFAULT_MAX_PLAYERS)); $config->set(ServerProperties::VIEW_DISTANCE, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::view_distance()), (string) Server::DEFAULT_MAX_VIEW_DISTANCE)); } From 2a528b4afb31566fd726bda29f1b2f44dc9747bc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 16:15:07 +0100 Subject: [PATCH 1388/1858] SetupWizard: stop depending on Java gamemode IDs for option selection --- src/wizard/SetupWizard.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wizard/SetupWizard.php b/src/wizard/SetupWizard.php index 94158c16b7..0f1a99f4b3 100644 --- a/src/wizard/SetupWizard.php +++ b/src/wizard/SetupWizard.php @@ -27,7 +27,6 @@ declare(strict_types=1); */ namespace pocketmine\wizard; -use pocketmine\data\java\GameModeIdMap; use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Language; use pocketmine\lang\LanguageNotFoundException; @@ -168,8 +167,12 @@ LICENSE; $this->message($this->lang->translate(KnownTranslationFactory::gamemode_info())); do{ - //TODO: drop the usage of internal Mojang IDs for this - we really just need a set of options to choose from - $gamemode = GameModeIdMap::getInstance()->fromId((int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), (string) GameModeIdMap::getInstance()->toId(GameMode::SURVIVAL))); + $input = (int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), "0"); + $gamemode = match($input){ + 0 => GameMode::SURVIVAL, + 1 => GameMode::CREATIVE, + default => null + }; }while($gamemode === null); //TODO: this probably shouldn't use the enum name directly $config->set(ServerProperties::GAME_MODE, $gamemode->name); From efafc2c6cac353585707d6ac8340097f2754ca3b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 16:41:06 +0100 Subject: [PATCH 1389/1858] DeadBush: updated support requirements since 1.20 they can now be placed on grass and mud. --- src/block/DeadBush.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/block/DeadBush.php b/src/block/DeadBush.php index 4565332a36..b265e76117 100644 --- a/src/block/DeadBush.php +++ b/src/block/DeadBush.php @@ -66,13 +66,19 @@ class DeadBush extends Flowable{ } private function canBeSupportedBy(Block $block) : bool{ - $blockId = $block->getTypeId(); - return $blockId === BlockTypeIds::SAND - || $blockId === BlockTypeIds::RED_SAND - || $blockId === BlockTypeIds::PODZOL - || $blockId === BlockTypeIds::MYCELIUM - || $blockId === BlockTypeIds::DIRT - || $blockId === BlockTypeIds::HARDENED_CLAY - || $blockId === BlockTypeIds::STAINED_CLAY; + return + $block->hasTypeTag(BlockTypeTags::SAND) || + $block->hasTypeTag(BlockTypeTags::MUD) || + match($block->getTypeId()){ + //can't use DIRT tag here because it includes farmland + BlockTypeIds::PODZOL, + BlockTypeIds::MYCELIUM, + BlockTypeIds::DIRT, + BlockTypeIds::GRASS, + BlockTypeIds::HARDENED_CLAY, + BlockTypeIds::STAINED_CLAY => true, + //TODO: moss block + default => false, + }; } } From b293d7bf1fb9c3cb11343144c18312781267e7bc Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 8 Sep 2023 17:19:06 +0100 Subject: [PATCH 1390/1858] Static support trait (#6044) Added StaticSupportTrait for blocks which require unconditional support dynamic support requirements, such as those presented by item frames and torches, are not included. in addition, double blocks, such as tallgrass, small dripleaf and doors, do not cooperate well with this, so they are also not included. some blocks which could be migrated (such as chorus plant) were skipped due to unresolved problems. --- src/block/Bamboo.php | 22 ++++------ src/block/BambooSapling.php | 29 +++++-------- src/block/BaseCake.php | 18 ++------ src/block/Cactus.php | 45 ++++++-------------- src/block/Carpet.php | 21 ++-------- src/block/CaveVines.php | 11 +---- src/block/ChorusFlower.php | 21 ++-------- src/block/Coral.php | 22 +--------- src/block/Crops.php | 17 ++------ src/block/DeadBush.php | 41 +++++++----------- src/block/FloorCoralFan.php | 15 ++----- src/block/Flower.php | 23 +++-------- src/block/FlowerPot.php | 17 +------- src/block/HangingRoots.php | 18 +------- src/block/NetherVines.php | 11 +---- src/block/NetherWartPlant.php | 20 ++------- src/block/PinkPetals.php | 15 +++---- src/block/PressurePlate.php | 19 +-------- src/block/RedstoneComparator.php | 18 +++----- src/block/RedstoneRepeater.php | 18 +++----- src/block/RedstoneWire.php | 18 +------- src/block/Sapling.php | 21 +++------- src/block/SporeBlossom.php | 20 +-------- src/block/Sugarcane.php | 35 ++++++++-------- src/block/SweetBerryBush.php | 20 ++++----- src/block/TallGrass.php | 25 +++-------- src/block/WaterLily.php | 26 ++++-------- src/block/WitherRose.php | 28 ++++--------- src/block/utils/StaticSupportTrait.php | 57 ++++++++++++++++++++++++++ 29 files changed, 211 insertions(+), 460 deletions(-) create mode 100644 src/block/utils/StaticSupportTrait.php diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index e4aaa4af77..255cd28574 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; @@ -46,6 +47,7 @@ use function mt_rand; use const PHP_INT_MAX; class Bamboo extends Transparent{ + use StaticSupportTrait; public const NO_LEAVES = 0; public const SMALL_LEAVES = 1; @@ -120,12 +122,14 @@ class Bamboo extends Transparent{ return new Vector3($retX, 0, $retZ); } - private function canBeSupportedBy(Block $block) : bool{ + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); return - $block->getTypeId() === BlockTypeIds::GRAVEL || - $block->hasTypeTag(BlockTypeTags::DIRT) || - $block->hasTypeTag(BlockTypeTags::MUD) || - $block->hasTypeTag(BlockTypeTags::SAND); + $supportBlock->hasSameTypeId($this) || + $supportBlock->getTypeId() === BlockTypeIds::GRAVEL || + $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || + $supportBlock->hasTypeTag(BlockTypeTags::MUD) || + $supportBlock->hasTypeTag(BlockTypeTags::SAND); } private function seekToTop() : Bamboo{ @@ -153,14 +157,6 @@ class Bamboo extends Transparent{ return false; } - public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - $below = $world->getBlock($this->position->down()); - if(!$this->canBeSupportedBy($below) && !$below->hasSameTypeId($this)){ - $world->useBreakOn($this->position); - } - } - private function grow(int $maxHeight, int $growAmount, ?Player $player) : bool{ $world = $this->position->getWorld(); if(!$world->getBlock($this->position->up())->canBeReplaced()){ diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index 6be42546ab..67c8a24e0b 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -23,17 +23,21 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\item\VanillaItems; +use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ + use StaticSupportTrait; + private bool $ready = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ @@ -48,19 +52,13 @@ final class BambooSapling extends Flowable{ return $this; } - private function canBeSupportedBy(Block $block) : bool{ + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); return - $block->getTypeId() === BlockTypeIds::GRAVEL || - $block->hasTypeTag(BlockTypeTags::DIRT) || - $block->hasTypeTag(BlockTypeTags::MUD) || - $block->hasTypeTag(BlockTypeTags::SAND); - } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->position->getWorld()->getBlock($blockReplace->position->down()))){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + $supportBlock->getTypeId() === BlockTypeIds::GRAVEL || + $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || + $supportBlock->hasTypeTag(BlockTypeTags::MUD) || + $supportBlock->hasTypeTag(BlockTypeTags::SAND); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -73,13 +71,6 @@ final class BambooSapling extends Flowable{ return false; } - public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - if(!$this->canBeSupportedBy($world->getBlock($this->position->down()))){ - $world->useBreakOn($this->position); - } - } - private function grow(?Player $player) : bool{ $world = $this->position->getWorld(); if(!$world->getBlock($this->position->up())->canBeReplaced()){ diff --git a/src/block/BaseCake.php b/src/block/BaseCake.php index 4c1d0e4a35..4b39038402 100644 --- a/src/block/BaseCake.php +++ b/src/block/BaseCake.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\FoodSource; @@ -31,27 +32,16 @@ use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; abstract class BaseCake extends Transparent implements FoodSource{ + use StaticSupportTrait; public function getSupportType(int $facing) : SupportType{ return SupportType::NONE; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() !== BlockTypeIds::AIR){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ //Replace with common break method - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::AIR; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 046affe723..ae64c8e64c 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -25,19 +25,17 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageEvent; -use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class Cactus extends Transparent{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 15; @@ -63,23 +61,18 @@ class Cactus extends Transparent{ return true; } - private function canBeSupportedBy(Block $block) : bool{ - return $block->hasSameTypeId($this) || $block->hasTypeTag(BlockTypeTags::SAND); - } - - public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - $world->useBreakOn($this->position); - }else{ - foreach(Facing::HORIZONTAL as $side){ - $b = $this->getSide($side); - if($b->isSolid()){ - $world->useBreakOn($this->position); - break; - } + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + if(!$supportBlock->hasSameTypeId($this) && !$supportBlock->hasTypeTag(BlockTypeTags::SAND)){ + return false; + } + foreach(Facing::HORIZONTAL as $side){ + if($block->getSide($side)->isSolid()){ + return false; } } + + return true; } public function ticksRandomly() : bool{ @@ -109,18 +102,4 @@ class Cactus extends Transparent{ } } } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - foreach(Facing::HORIZONTAL as $side){ - if($this->getSide($side)->isSolid()){ - return false; - } - } - - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } } diff --git a/src/block/Carpet.php b/src/block/Carpet.php index 74f07a801f..1ee7240c51 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -24,15 +24,13 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\ColoredTrait; -use pocketmine\item\Item; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class Carpet extends Flowable{ use ColoredTrait; + use StaticSupportTrait; public function isSolid() : bool{ return true; @@ -45,19 +43,8 @@ class Carpet extends Flowable{ return [AxisAlignedBB::one()->trim(Facing::UP, 15 / 16)]; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() !== BlockTypeIds::AIR){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::AIR){ - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::AIR; } public function getFlameEncouragement() : int{ diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index b1f82c7018..bc42a6788b 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Entity; @@ -40,6 +41,7 @@ use function mt_rand; class CaveVines extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 25; @@ -81,16 +83,7 @@ class CaveVines extends Flowable{ return $supportBlock->getSupportType(Facing::DOWN) === SupportType::FULL || $supportBlock->hasSameTypeId($this); } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } $this->age = mt_rand(0, self::MAX_AGE); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 74366a68eb..03f34dd072 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -24,17 +24,15 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\entity\projectile\Projectile; use pocketmine\event\block\StructureGrowEvent; -use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; use pocketmine\math\Vector3; -use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use pocketmine\world\Position; use pocketmine\world\sound\ChorusFlowerDieSound; use pocketmine\world\sound\ChorusFlowerGrowSound; use pocketmine\world\World; @@ -44,6 +42,7 @@ use function mt_rand; final class ChorusFlower extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MIN_AGE = 0; public const MAX_AGE = 5; @@ -54,7 +53,8 @@ final class ChorusFlower extends Flowable{ return [AxisAlignedBB::one()]; } - private function canBeSupportedAt(Position $position) : bool{ + private function canBeSupportedAt(Block $block) : bool{ + $position = $block->getPosition(); $world = $position->getWorld(); $down = $world->getBlock($position->down()); @@ -79,19 +79,6 @@ final class ChorusFlower extends Flowable{ return $plantAdjacent; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace->getPosition())){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this->position)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ $this->position->getWorld()->useBreakOn($this->position); } diff --git a/src/block/Coral.php b/src/block/Coral.php index 837a818574..96c6d4fe0e 100644 --- a/src/block/Coral.php +++ b/src/block/Coral.php @@ -23,29 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\item\Item; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; final class Coral extends BaseCoral{ - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - if(!$this->canBeSupportedAt($this)){ - $world->useBreakOn($this->position); - }else{ - parent::onNearbyBlockChange(); - } - } + use StaticSupportTrait; private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); diff --git a/src/block/Crops.php b/src/block/Crops.php index 87966f1dbe..e47e63be81 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -25,25 +25,22 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use function mt_rand; abstract class Crops extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 7; - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND; } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -64,12 +61,6 @@ abstract class Crops extends Flowable{ return false; } - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::FARMLAND){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function ticksRandomly() : bool{ return true; } diff --git a/src/block/DeadBush.php b/src/block/DeadBush.php index 4565332a36..53220af0f0 100644 --- a/src/block/DeadBush.php +++ b/src/block/DeadBush.php @@ -23,29 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use function mt_rand; class DeadBush extends Flowable{ - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - $this->position->getWorld()->useBreakOn($this->position); - } - } + use StaticSupportTrait; public function getDropsForIncompatibleTool(Item $item) : array{ return [ @@ -65,14 +50,18 @@ class DeadBush extends Flowable{ return 100; } - private function canBeSupportedBy(Block $block) : bool{ - $blockId = $block->getTypeId(); - return $blockId === BlockTypeIds::SAND - || $blockId === BlockTypeIds::RED_SAND - || $blockId === BlockTypeIds::PODZOL - || $blockId === BlockTypeIds::MYCELIUM - || $blockId === BlockTypeIds::DIRT - || $blockId === BlockTypeIds::HARDENED_CLAY - || $blockId === BlockTypeIds::STAINED_CLAY; + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + //TODO: can we use tags here? + return match($supportBlock->getTypeId()){ + BlockTypeIds::SAND, + BlockTypeIds::RED_SAND, + BlockTypeIds::PODZOL, + BlockTypeIds::MYCELIUM, + BlockTypeIds::DIRT, + BlockTypeIds::HARDENED_CLAY, + BlockTypeIds::STAINED_CLAY => true, + default => false + }; } } diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index a267a03857..81ea88186b 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\item\VanillaItems; @@ -35,6 +36,8 @@ use function atan2; use function rad2deg; final class FloorCoralFan extends BaseCoral{ + use StaticSupportTrait; + private int $axis = Axis::X; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ @@ -53,9 +56,6 @@ final class FloorCoralFan extends BaseCoral{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } if($player !== null){ $playerBlockPos = $player->getPosition()->floor(); $directionVector = $blockReplace->getPosition()->subtractVector($playerBlockPos)->normalize(); @@ -73,15 +73,6 @@ final class FloorCoralFan extends BaseCoral{ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } - public function onNearbyBlockChange() : void{ - $world = $this->position->getWorld(); - if(!$this->canBeSupportedAt($this)){ - $world->useBreakOn($this->position); - }else{ - parent::onNearbyBlockChange(); - } - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } diff --git a/src/block/Flower.php b/src/block/Flower.php index fca5dd98fd..ef79813fe2 100644 --- a/src/block/Flower.php +++ b/src/block/Flower.php @@ -23,28 +23,15 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\item\Item; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class Flower extends Flowable{ + use StaticSupportTrait; - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - $down = $this->getSide(Facing::DOWN); - if(!$down->hasTypeTag(BlockTypeTags::DIRT) && !$down->hasTypeTag(BlockTypeTags::MUD)){ - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD); } public function getFlameEncouragement() : int{ diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index 4e4dbfa6e1..fb3e78d82a 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -24,15 +24,16 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\FlowerPot as TileFlowerPot; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use function assert; class FlowerPot extends Flowable{ + use StaticSupportTrait; protected ?Block $plant = null; @@ -89,20 +90,6 @@ class FlowerPot extends Flowable{ return [AxisAlignedBB::one()->contract(3 / 16, 0, 3 / 16)->trim(Facing::UP, 5 / 8)]; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } - - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } diff --git a/src/block/HangingRoots.php b/src/block/HangingRoots.php index 0e03f4468f..9c7bfd0960 100644 --- a/src/block/HangingRoots.php +++ b/src/block/HangingRoots.php @@ -23,32 +23,18 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; final class HangingRoots extends Flowable{ + use StaticSupportTrait; private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::UP)->hasCenterSupport(); //weird I know, but they can be placed on the bottom of fences } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function getDropsForIncompatibleTool(Item $item) : array{ if($item->hasEnchantment(VanillaEnchantments::SILK_TOUCH())){ return $this->getDropsForCompatibleTool($item); diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index ac04e05e31..dba86d2595 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\FortuneDropHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\event\block\StructureGrowEvent; @@ -42,6 +43,7 @@ use function mt_rand; */ class NetherVines extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 25; @@ -70,12 +72,6 @@ class NetherVines extends Flowable{ return $supportBlock->getSupportType($this->growthFace)->hasCenterSupport() || $supportBlock->hasSameTypeId($this); } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - /** * Returns the block at the end of the vine structure furthest from the supporting block. */ @@ -88,9 +84,6 @@ class NetherVines extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } $this->age = mt_rand(0, self::MAX_AGE - 1); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index b6c1d847d7..17aa9c4f8c 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -26,31 +26,19 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Item; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use function mt_rand; class NetherWartPlant extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 3; - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->getTypeId() === BlockTypeIds::SOUL_SAND){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if($this->getSide(Facing::DOWN)->getTypeId() !== BlockTypeIds::SOUL_SAND){ - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::SOUL_SAND; } public function ticksRandomly() : bool{ diff --git a/src/block/PinkPetals.php b/src/block/PinkPetals.php index 9271e7ddc6..5f11302065 100644 --- a/src/block/PinkPetals.php +++ b/src/block/PinkPetals.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\HorizontalFacingTrait; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -35,6 +36,9 @@ use pocketmine\world\BlockTransaction; class PinkPetals extends Flowable{ use HorizontalFacingTrait; + use StaticSupportTrait { + canBePlacedAt as supportedWhenPlacedAt; + } public const MIN_COUNT = 1; public const MAX_COUNT = 4; @@ -65,20 +69,11 @@ class PinkPetals extends Flowable{ return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD); } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ - return ($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT) || parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + return ($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT) || $this->supportedWhenPlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($this)){ - return false; - } if($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT){ $this->count = $blockReplace->getCount() + 1; $this->facing = $blockReplace->getFacing(); diff --git a/src/block/PressurePlate.php b/src/block/PressurePlate.php index ae2a936bb5..1dd4b50d97 100644 --- a/src/block/PressurePlate.php +++ b/src/block/PressurePlate.php @@ -23,21 +23,19 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\event\block\PressurePlateUpdateEvent; -use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use pocketmine\world\sound\PressurePlateActivateSound; use pocketmine\world\sound\PressurePlateDeactivateSound; use function count; abstract class PressurePlate extends Transparent{ + use StaticSupportTrait; private readonly int $deactivationDelayTicks; @@ -63,23 +61,10 @@ abstract class PressurePlate extends Transparent{ return SupportType::NONE; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedAt($blockReplace)){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - return false; - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function hasEntityCollision() : bool{ return true; } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index 5a22c6bf8e..ee63a77a99 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -27,6 +27,7 @@ use pocketmine\block\tile\Comparator; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -41,6 +42,7 @@ class RedstoneComparator extends Flowable{ use HorizontalFacingTrait; use AnalogRedstoneSignalEmitterTrait; use PoweredByRedstoneTrait; + use StaticSupportTrait; protected bool $isSubtractMode = false; @@ -85,14 +87,10 @@ class RedstoneComparator extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedAt($blockReplace)){ - if($player !== null){ - $this->facing = Facing::opposite($player->getHorizontalFacing()); - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + if($player !== null){ + $this->facing = Facing::opposite($player->getHorizontalFacing()); } - - return false; + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -101,12 +99,6 @@ class RedstoneComparator extends Flowable{ return true; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 848c9aa895..1306456d44 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -37,6 +38,7 @@ use pocketmine\world\BlockTransaction; class RedstoneRepeater extends Flowable{ use HorizontalFacingTrait; use PoweredByRedstoneTrait; + use StaticSupportTrait; public const MIN_DELAY = 1; public const MAX_DELAY = 4; @@ -68,15 +70,11 @@ class RedstoneRepeater extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedAt($blockReplace)){ - if($player !== null){ - $this->facing = Facing::opposite($player->getHorizontalFacing()); - } - - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + if($player !== null){ + $this->facing = Facing::opposite($player->getHorizontalFacing()); } - return false; + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -87,12 +85,6 @@ class RedstoneRepeater extends Flowable{ return true; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN) !== SupportType::NONE; } diff --git a/src/block/RedstoneWire.php b/src/block/RedstoneWire.php index 167365f56e..a2d293fca0 100644 --- a/src/block/RedstoneWire.php +++ b/src/block/RedstoneWire.php @@ -24,22 +24,14 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class RedstoneWire extends Flowable{ use AnalogRedstoneSignalEmitterTrait; - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedAt($blockReplace)){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - return false; - } + use StaticSupportTrait; public function readStateFromWorld() : Block{ parent::readStateFromWorld(); @@ -48,12 +40,6 @@ class RedstoneWire extends Flowable{ return $this; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::DOWN)->hasCenterSupport(); } diff --git a/src/block/Sapling.php b/src/block/Sapling.php index b1f255f0d7..b3fdf59af6 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\SaplingType; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -32,11 +33,12 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\utils\Random; -use pocketmine\world\BlockTransaction; use pocketmine\world\generator\object\TreeFactory; use function mt_rand; class Sapling extends Flowable{ + use StaticSupportTrait; + protected bool $ready = false; private SaplingType $saplingType; @@ -58,13 +60,9 @@ class Sapling extends Flowable{ return $this; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); - if($down->hasTypeTag(BlockTypeTags::DIRT) || $down->hasTypeTag(BlockTypeTags::MUD)){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -77,13 +75,6 @@ class Sapling extends Flowable{ return false; } - public function onNearbyBlockChange() : void{ - $down = $this->getSide(Facing::DOWN); - if(!$down->hasTypeTag(BlockTypeTags::DIRT) && !$down->hasTypeTag(BlockTypeTags::MUD)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function ticksRandomly() : bool{ return true; } diff --git a/src/block/SporeBlossom.php b/src/block/SporeBlossom.php index dbb4b71fc9..3ca5fa1f20 100644 --- a/src/block/SporeBlossom.php +++ b/src/block/SporeBlossom.php @@ -23,30 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\SupportType; -use pocketmine\item\Item; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; final class SporeBlossom extends Flowable{ + use StaticSupportTrait; private function canBeSupportedAt(Block $block) : bool{ return $block->getAdjacentSupportType(Facing::UP) === SupportType::FULL; } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedAt($blockReplace)){ - return false; - } - - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedAt($this)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } } diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index d2abe2c954..97b4aee9c1 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -35,6 +36,7 @@ use pocketmine\world\Position; class Sugarcane extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const MAX_AGE = 15; @@ -82,18 +84,12 @@ class Sugarcane extends Flowable{ return false; } - private function canBeSupportedBy(Block $block) : bool{ - return - $block->hasTypeTag(BlockTypeTags::MUD) || - $block->hasTypeTag(BlockTypeTags::DIRT) || - $block->hasTypeTag(BlockTypeTags::SAND); - } - - public function onNearbyBlockChange() : void{ - $down = $this->getSide(Facing::DOWN); - if(!$down->hasSameTypeId($this) && !$this->canBeSupportedBy($down)){ - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + return $supportBlock->hasSameTypeId($this) || + $supportBlock->hasTypeTag(BlockTypeTags::MUD) || + $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || + $supportBlock->hasTypeTag(BlockTypeTags::SAND); } public function ticksRandomly() : bool{ @@ -112,15 +108,16 @@ class Sugarcane extends Flowable{ } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $down = $this->getSide(Facing::DOWN); + $down = $blockReplace->getSide(Facing::DOWN); if($down->hasSameTypeId($this)){ return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - }elseif($this->canBeSupportedBy($down)){ - foreach(Facing::HORIZONTAL as $side){ - $sideBlock = $down->getSide($side); - if($sideBlock instanceof Water || $sideBlock instanceof FrostedIce){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } + } + + //support criteria are checked by FixedSupportTrait, but this part applies to placement only + foreach(Facing::HORIZONTAL as $side){ + $sideBlock = $down->getSide($side); + if($sideBlock instanceof Water || $sideBlock instanceof FrostedIce){ + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } } diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index bd3cf28710..c34df3de51 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -26,6 +26,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\FortuneDropHelper; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityDamageByBlockEvent; @@ -35,11 +36,11 @@ use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use function mt_rand; class SweetBerryBush extends Flowable{ use AgeableTrait; + use StaticSupportTrait; public const STAGE_SAPLING = 0; public const STAGE_BUSH_NO_BERRIES = 1; @@ -56,16 +57,17 @@ class SweetBerryBush extends Flowable{ return 0; } + /** + * @deprecated + */ protected function canBeSupportedBy(Block $block) : bool{ return $block->getTypeId() !== BlockTypeIds::FARMLAND && //bedrock-specific thing (bug?) ($block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD)); } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + return $this->canBeSupportedBy($supportBlock); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ @@ -99,12 +101,6 @@ class SweetBerryBush extends Flowable{ ]; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function ticksRandomly() : bool{ return true; } diff --git a/src/block/TallGrass.php b/src/block/TallGrass.php index d8c34b0010..459751c4e9 100644 --- a/src/block/TallGrass.php +++ b/src/block/TallGrass.php @@ -23,31 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\block\utils\TallGrassTrait; -use pocketmine\item\Item; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class TallGrass extends Flowable{ use TallGrassTrait; + use StaticSupportTrait; - private function canBeSupportedBy(Block $block) : bool{ - return $block->hasTypeTag(BlockTypeTags::DIRT) || $block->hasTypeTag(BlockTypeTags::MUD); - } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - return false; - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ //Replace with common break method - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); + return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD); } } diff --git a/src/block/WaterLily.php b/src/block/WaterLily.php index 8263330f64..5dfb0d74a1 100644 --- a/src/block/WaterLily.php +++ b/src/block/WaterLily.php @@ -23,14 +23,15 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\item\Item; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class WaterLily extends Flowable{ + use StaticSupportTrait { + canBePlacedAt as supportedWhenPlacedAt; + } /** * @return AxisAlignedBB[] @@ -40,23 +41,10 @@ class WaterLily extends Flowable{ } public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ - return !$blockReplace instanceof Water && parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + return !$blockReplace instanceof Water && $this->supportedWhenPlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); } - private function canBeSupportedBy(Block $block) : bool{ - return $block instanceof Water; - } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - $this->position->getWorld()->useBreakOn($this->position); - } + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN) instanceof Water; } } diff --git a/src/block/WitherRose.php b/src/block/WitherRose.php index 696b261150..8c0977b375 100644 --- a/src/block/WitherRose.php +++ b/src/block/WitherRose.php @@ -23,23 +23,22 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\effect\VanillaEffects; use pocketmine\entity\Entity; use pocketmine\entity\Living; -use pocketmine\item\Item; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; class WitherRose extends Flowable{ + use StaticSupportTrait; - private function canBeSupportedBy(Block $block) : bool{ + private function canBeSupportedAt(Block $block) : bool{ + $supportBlock = $block->getSide(Facing::DOWN); return - $block->hasTypeTag(BlockTypeTags::DIRT) || - $block->hasTypeTag(BlockTypeTags::MUD) || - match($block->getTypeId()){ + $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || + $supportBlock->hasTypeTag(BlockTypeTags::MUD) || + match($supportBlock->getTypeId()){ BlockTypeIds::NETHERRACK, BlockTypeIds::SOUL_SAND, BlockTypeIds::SOUL_SOIL => true, @@ -47,19 +46,6 @@ class WitherRose extends Flowable{ }; } - public function onNearbyBlockChange() : void{ - if(!$this->canBeSupportedBy($this->getSide(Facing::DOWN))){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canBeSupportedBy($blockReplace->getSide(Facing::DOWN))){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - public function hasEntityCollision() : bool{ return true; } public function onEntityInside(Entity $entity) : bool{ diff --git a/src/block/utils/StaticSupportTrait.php b/src/block/utils/StaticSupportTrait.php new file mode 100644 index 0000000000..0e40230cc6 --- /dev/null +++ b/src/block/utils/StaticSupportTrait.php @@ -0,0 +1,57 @@ +canBeSupportedAt($blockReplace) && parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + } + + /** + * @see Block::onNearbyBlockChange() + */ + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedAt($this)){ + $this->position->getWorld()->useBreakOn($this->position); + }else{ + parent::onNearbyBlockChange(); + } + } +} From 537e194161949565b3cd5bf41f9307ca07aabbd4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 17:33:32 +0100 Subject: [PATCH 1391/1858] ChorusPlant: make use of StaticSupportTrait --- src/block/ChorusPlant.php | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/block/ChorusPlant.php b/src/block/ChorusPlant.php index f7642bd048..0813ab80ad 100644 --- a/src/block/ChorusPlant.php +++ b/src/block/ChorusPlant.php @@ -23,18 +23,16 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; -use pocketmine\math\Vector3; -use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; -use pocketmine\world\Position; use function mt_rand; final class ChorusPlant extends Flowable{ + use StaticSupportTrait; protected function recalculateCollisionBoxes() : array{ $bb = AxisAlignedBB::one(); @@ -52,7 +50,8 @@ final class ChorusPlant extends Flowable{ return $block->hasSameTypeId($this) || $block->getTypeId() === BlockTypeIds::END_STONE; } - private function canStay(Position $position) : bool{ + private function canBeSupportedAt(Block $block) : bool{ + $position = $block->getPosition(); $world = $position->getWorld(); $down = $world->getBlock($position->down()); @@ -79,19 +78,6 @@ final class ChorusPlant extends Flowable{ return false; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if(!$this->canStay($blockReplace->getPosition())){ - return false; - } - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - if(!$this->canStay($this->position)){ - $this->position->getWorld()->useBreakOn($this->position); - } - } - public function getDropsForCompatibleTool(Item $item) : array{ if(mt_rand(0, 1) === 1){ return [VanillaItems::CHORUS_FRUIT()]; From e9169cfa676847599aed0b6c1365b3016dde8558 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 8 Sep 2023 17:34:47 +0100 Subject: [PATCH 1392/1858] ChorusPlant: change stupid code --- src/block/ChorusPlant.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/block/ChorusPlant.php b/src/block/ChorusPlant.php index 0813ab80ad..e3cc8de9d0 100644 --- a/src/block/ChorusPlant.php +++ b/src/block/ChorusPlant.php @@ -71,11 +71,7 @@ final class ChorusPlant extends Flowable{ } } - if($this->canBeSupportedBy($down)){ - return true; - } - - return false; + return $this->canBeSupportedBy($down); } public function getDropsForCompatibleTool(Item $item) : array{ From 540476365fd105eb54e40582c0716d19bd95e11d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 18:14:59 +0100 Subject: [PATCH 1393/1858] Updated for 1.20.30 release --- composer.json | 10 +-- composer.lock | 68 +++++++++---------- .../mcpe/handler/InGamePacketHandler.php | 24 +------ .../handler/ResourcePacksPacketHandler.php | 2 +- 4 files changed, 43 insertions(+), 61 deletions(-) diff --git a/composer.json b/composer.json index 999ad29c94..96715ef8f8 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", - "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", - "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", - "pocketmine/bedrock-protocol": "~23.0.2+bedrock-1.20.10", + "pocketmine/bedrock-block-upgrade-schema": "~3.2.0+bedrock-1.20.30", + "pocketmine/bedrock-data": "~2.5.0+bedrock-1.20.30", + "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", + "pocketmine/bedrock-protocol": "~24.0.0+bedrock-1.20.30", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", @@ -47,7 +47,7 @@ "pocketmine/log": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0", "pocketmine/math": "^0.4.0", - "pocketmine/nbt": "^0.3.2", + "pocketmine/nbt": "~1.0.0", "pocketmine/raklib": "^0.14.2", "pocketmine/raklib-ipc": "^0.1.0", "pocketmine/snooze": "^0.3.0", diff --git a/composer.lock b/composer.lock index 9634a6575b..8679a0810d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2acf1299aa8b354c44495ae048aa8893", + "content-hash": "dc69846ccf19272d45811712f038f167", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d" + "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/6d4ae416043337946a22fc31e8065ca2c21f472d", - "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/874e1c0c9b7b620744d08b59c78354fe9f028dfa", + "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa", "shasum": "" }, "type": "library", @@ -218,22 +218,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.1.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.2.0" }, - "time": "2023-07-12T12:05:36+00:00" + "time": "2023-09-20T17:03:43+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.4.0+bedrock-1.20.10", + "version": "2.5.0+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab" + "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/f98bd1cae46d2920058acf3b23c0bedeac79f4ab", - "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", + "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", "shasum": "" }, "type": "library", @@ -244,22 +244,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.30" }, - "time": "2023-07-12T11:51:54+00:00" + "time": "2023-09-20T16:34:21+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230" + "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/60d199afe5e371fd189b21d685ec1fed6ba54230", - "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", + "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", "shasum": "" }, "type": "library", @@ -270,32 +270,32 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.4.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.5.0" }, - "time": "2023-07-12T12:08:37+00:00" + "time": "2023-09-01T19:58:57+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.4+bedrock-1.20.10", + "version": "24.0.0+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb" + "reference": "38a516274aa6641b0da38011af35a5587fc87895" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ae0d8f4d49506674b7ff622f7c81ce241dc49adb", - "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/38a516274aa6641b0da38011af35a5587fc87895", + "reference": "38a516274aa6641b0da38011af35a5587fc87895", "shasum": "" }, "require": { "ext-json": "*", "netresearch/jsonmapper": "^4.0", - "php": "^8.0", + "php": "^8.1", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", "pocketmine/math": "^0.3.0 || ^0.4.0 || ^1.0.0", - "pocketmine/nbt": "^0.3.0 || ^1.0.0", + "pocketmine/nbt": "^1.0.0", "ramsey/uuid": "^4.1" }, "require-dev": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.4+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/24.0.0+bedrock-1.20.30" }, - "time": "2023-09-06T07:36:44+00:00" + "time": "2023-09-20T16:57:53+00:00" }, { "name": "pocketmine/binaryutils", @@ -688,16 +688,16 @@ }, { "name": "pocketmine/nbt", - "version": "0.3.4", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/NBT.git", - "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda" + "reference": "20540271cb59e04672cb163dca73366f207974f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/NBT/zipball/62c02464c6708b2467c1e1a2af01af09d5114eda", - "reference": "62c02464c6708b2467c1e1a2af01af09d5114eda", + "url": "https://api.github.com/repos/pmmp/NBT/zipball/20540271cb59e04672cb163dca73366f207974f1", + "reference": "20540271cb59e04672cb163dca73366f207974f1", "shasum": "" }, "require": { @@ -707,7 +707,7 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.10.3", + "phpstan/phpstan": "1.10.25", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -724,9 +724,9 @@ "description": "PHP library for working with Named Binary Tags", "support": { "issues": "https://github.com/pmmp/NBT/issues", - "source": "https://github.com/pmmp/NBT/tree/0.3.4" + "source": "https://github.com/pmmp/NBT/tree/1.0.0" }, - "time": "2023-04-10T11:31:20+00:00" + "time": "2023-07-14T13:01:49+00:00" }, { "name": "pocketmine/netresearch-jsonmapper", diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 3ea3e0ad9d..27b2f1de55 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -81,7 +81,6 @@ use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket; use pocketmine\network\mcpe\protocol\PlayerHotbarPacket; use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\PlayerSkinPacket; -use pocketmine\network\mcpe\protocol\RequestAbilityPacket; use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket; use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket; use pocketmine\network\mcpe\protocol\SetActorMotionPacket; @@ -118,7 +117,6 @@ use function fmod; use function get_debug_type; use function implode; use function in_array; -use function is_bool; use function is_infinite; use function is_nan; use function json_decode; @@ -229,11 +227,13 @@ class InGamePacketHandler extends PacketHandler{ $sprinting = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SPRINTING, PlayerAuthInputFlags::STOP_SPRINTING); $swimming = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SWIMMING, PlayerAuthInputFlags::STOP_SWIMMING); $gliding = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_GLIDING, PlayerAuthInputFlags::STOP_GLIDING); + $flying = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_FLYING, PlayerAuthInputFlags::STOP_FLYING); $mismatch = ($sneaking !== null && !$this->player->toggleSneak($sneaking)) | ($sprinting !== null && !$this->player->toggleSprint($sprinting)) | ($swimming !== null && !$this->player->toggleSwim($swimming)) | - ($gliding !== null && !$this->player->toggleGlide($gliding)); + ($gliding !== null && !$this->player->toggleGlide($gliding)) | + ($flying !== null && !$this->player->toggleFlight($flying)); if((bool) $mismatch){ $this->player->sendData([$this->player]); } @@ -1034,22 +1034,4 @@ class InGamePacketHandler extends PacketHandler{ $this->player->emote($packet->getEmoteId()); return true; } - - public function handleRequestAbility(RequestAbilityPacket $packet) : bool{ - if($packet->getAbilityId() === RequestAbilityPacket::ABILITY_FLYING){ - $isFlying = $packet->getAbilityValue(); - if(!is_bool($isFlying)){ - throw new PacketHandlingException("Flying ability should always have a bool value"); - } - if($isFlying !== $this->player->isFlying()){ - if(!$this->player->toggleFlight($isFlying)){ - $this->session->syncAbilities($this->player); - } - } - - return true; - } - - return false; - } } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index d1ba857240..7b301ddc22 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -80,7 +80,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ ); }, $this->resourcePackManager->getResourceStack()); //TODO: support forcing server packs - $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false)); + $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false, [])); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); } From 6553852d99d8a6efb0d45fad2084b14a13ea4535 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 18:33:07 +0100 Subject: [PATCH 1394/1858] Updated for 1.20.30 release --- composer.json | 8 +- composer.lock | 54 ++++---- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 3 +- .../bedrock/block/BlockStateStringValues.php | 10 ++ src/data/bedrock/block/BlockTypeNames.php | 68 +++++++++- .../convert/BlockObjectToStateSerializer.php | 114 ++++++++++++---- .../convert/BlockStateDeserializerHelper.php | 4 +- .../block/convert/BlockStateReader.php | 6 +- .../convert/BlockStateSerializerHelper.php | 5 +- .../BlockStateToObjectDeserializer.php | 128 ++++++++++++++---- .../block/convert/BlockStateWriter.php | 6 +- src/data/bedrock/item/ItemTypeNames.php | 4 + .../mcpe/handler/InGamePacketHandler.php | 24 +--- .../handler/ResourcePacksPacketHandler.php | 2 +- src/world/format/io/data/BedrockWorldData.php | 6 +- 16 files changed, 319 insertions(+), 127 deletions(-) diff --git a/composer.json b/composer.json index 5f59f64d53..cebcd1b825 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.1.0+bedrock-1.20.10", - "pocketmine/bedrock-data": "~2.4.0+bedrock-1.20.10", - "pocketmine/bedrock-item-upgrade-schema": "~1.4.0+bedrock-1.20.10", - "pocketmine/bedrock-protocol": "~23.0.2+bedrock-1.20.10", + "pocketmine/bedrock-block-upgrade-schema": "~3.2.0+bedrock-1.20.30", + "pocketmine/bedrock-data": "~2.5.0+bedrock-1.20.30", + "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", + "pocketmine/bedrock-protocol": "~24.0.0+bedrock-1.20.30", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index f412fa9d79..25d2d890d5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9237955fd97ba7c1697d80314fa9ad6f", + "content-hash": "5249e8bab61f885ce205fda0fc7e9aa9", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d" + "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/6d4ae416043337946a22fc31e8065ca2c21f472d", - "reference": "6d4ae416043337946a22fc31e8065ca2c21f472d", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/874e1c0c9b7b620744d08b59c78354fe9f028dfa", + "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.1.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.2.0" }, - "time": "2023-07-12T12:05:36+00:00" + "time": "2023-09-20T17:03:43+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.4.0+bedrock-1.20.10", + "version": "2.5.0+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab" + "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/f98bd1cae46d2920058acf3b23c0bedeac79f4ab", - "reference": "f98bd1cae46d2920058acf3b23c0bedeac79f4ab", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", + "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", "shasum": "" }, "type": "library", @@ -168,22 +168,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.30" }, - "time": "2023-07-12T11:51:54+00:00" + "time": "2023-09-20T16:34:21+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230" + "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/60d199afe5e371fd189b21d685ec1fed6ba54230", - "reference": "60d199afe5e371fd189b21d685ec1fed6ba54230", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", + "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", "shasum": "" }, "type": "library", @@ -194,32 +194,32 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.4.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.5.0" }, - "time": "2023-07-12T12:08:37+00:00" + "time": "2023-09-01T19:58:57+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "23.0.4+bedrock-1.20.10", + "version": "24.0.0+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb" + "reference": "38a516274aa6641b0da38011af35a5587fc87895" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/ae0d8f4d49506674b7ff622f7c81ce241dc49adb", - "reference": "ae0d8f4d49506674b7ff622f7c81ce241dc49adb", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/38a516274aa6641b0da38011af35a5587fc87895", + "reference": "38a516274aa6641b0da38011af35a5587fc87895", "shasum": "" }, "require": { "ext-json": "*", "netresearch/jsonmapper": "^4.0", - "php": "^8.0", + "php": "^8.1", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", "pocketmine/math": "^0.3.0 || ^0.4.0 || ^1.0.0", - "pocketmine/nbt": "^0.3.0 || ^1.0.0", + "pocketmine/nbt": "^1.0.0", "ramsey/uuid": "^4.1" }, "require-dev": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/23.0.4+bedrock-1.20.10" + "source": "https://github.com/pmmp/BedrockProtocol/tree/24.0.0+bedrock-1.20.30" }, - "time": "2023-09-06T07:36:44+00:00" + "time": "2023-09-20T16:57:53+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index f7b7612509..c5712cf6c7 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (10 << 8) | //patch - (32); //revision + (30 << 8) | //patch + (50); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index f38ba78e99..0e1b29e272 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -98,8 +98,10 @@ final class BlockStateNames{ public const LEVER_DIRECTION = "lever_direction"; public const LIQUID_DEPTH = "liquid_depth"; public const LIT = "lit"; + public const MC_BLOCK_FACE = "minecraft:block_face"; public const MC_CARDINAL_DIRECTION = "minecraft:cardinal_direction"; public const MC_FACING_DIRECTION = "minecraft:facing_direction"; + public const MC_VERTICAL_HALF = "minecraft:vertical_half"; public const MOISTURIZED_AMOUNT = "moisturized_amount"; public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; @@ -141,7 +143,6 @@ final class BlockStateNames{ public const SUSPENDED_BIT = "suspended_bit"; public const TALL_GRASS_TYPE = "tall_grass_type"; public const TOGGLE_BIT = "toggle_bit"; - public const TOP_SLOT_BIT = "top_slot_bit"; public const TORCH_FACING_DIRECTION = "torch_facing_direction"; public const TRIGGERED_BIT = "triggered_bit"; public const TURTLE_EGG_COUNT = "turtle_egg_count"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 5834b2df49..712ff70797 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -131,6 +131,13 @@ final class BlockStateStringValues{ public const LEVER_DIRECTION_UP_NORTH_SOUTH = "up_north_south"; public const LEVER_DIRECTION_WEST = "west"; + public const MC_BLOCK_FACE_DOWN = "down"; + public const MC_BLOCK_FACE_EAST = "east"; + public const MC_BLOCK_FACE_NORTH = "north"; + public const MC_BLOCK_FACE_SOUTH = "south"; + public const MC_BLOCK_FACE_UP = "up"; + public const MC_BLOCK_FACE_WEST = "west"; + public const MC_CARDINAL_DIRECTION_EAST = "east"; public const MC_CARDINAL_DIRECTION_NORTH = "north"; public const MC_CARDINAL_DIRECTION_SOUTH = "south"; @@ -143,6 +150,9 @@ final class BlockStateStringValues{ public const MC_FACING_DIRECTION_UP = "up"; public const MC_FACING_DIRECTION_WEST = "west"; + public const MC_VERTICAL_HALF_BOTTOM = "bottom"; + public const MC_VERTICAL_HALF_TOP = "top"; + public const MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK = "chiseled_stone_brick"; public const MONSTER_EGG_STONE_TYPE_COBBLESTONE = "cobblestone"; public const MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK = "cracked_stone_brick"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 48b1c29f0f..0fa1060492 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -99,8 +99,12 @@ final class BlockTypeNames{ public const BLACK_CANDLE_CAKE = "minecraft:black_candle_cake"; public const BLACK_CARPET = "minecraft:black_carpet"; public const BLACK_CONCRETE = "minecraft:black_concrete"; + public const BLACK_CONCRETE_POWDER = "minecraft:black_concrete_powder"; public const BLACK_GLAZED_TERRACOTTA = "minecraft:black_glazed_terracotta"; public const BLACK_SHULKER_BOX = "minecraft:black_shulker_box"; + public const BLACK_STAINED_GLASS = "minecraft:black_stained_glass"; + public const BLACK_STAINED_GLASS_PANE = "minecraft:black_stained_glass_pane"; + public const BLACK_TERRACOTTA = "minecraft:black_terracotta"; public const BLACK_WOOL = "minecraft:black_wool"; public const BLACKSTONE = "minecraft:blackstone"; public const BLACKSTONE_DOUBLE_SLAB = "minecraft:blackstone_double_slab"; @@ -112,9 +116,13 @@ final class BlockTypeNames{ public const BLUE_CANDLE_CAKE = "minecraft:blue_candle_cake"; public const BLUE_CARPET = "minecraft:blue_carpet"; public const BLUE_CONCRETE = "minecraft:blue_concrete"; + public const BLUE_CONCRETE_POWDER = "minecraft:blue_concrete_powder"; public const BLUE_GLAZED_TERRACOTTA = "minecraft:blue_glazed_terracotta"; public const BLUE_ICE = "minecraft:blue_ice"; public const BLUE_SHULKER_BOX = "minecraft:blue_shulker_box"; + public const BLUE_STAINED_GLASS = "minecraft:blue_stained_glass"; + public const BLUE_STAINED_GLASS_PANE = "minecraft:blue_stained_glass_pane"; + public const BLUE_TERRACOTTA = "minecraft:blue_terracotta"; public const BLUE_WOOL = "minecraft:blue_wool"; public const BONE_BLOCK = "minecraft:bone_block"; public const BOOKSHELF = "minecraft:bookshelf"; @@ -127,10 +135,14 @@ final class BlockTypeNames{ public const BROWN_CANDLE_CAKE = "minecraft:brown_candle_cake"; public const BROWN_CARPET = "minecraft:brown_carpet"; public const BROWN_CONCRETE = "minecraft:brown_concrete"; + public const BROWN_CONCRETE_POWDER = "minecraft:brown_concrete_powder"; public const BROWN_GLAZED_TERRACOTTA = "minecraft:brown_glazed_terracotta"; public const BROWN_MUSHROOM = "minecraft:brown_mushroom"; public const BROWN_MUSHROOM_BLOCK = "minecraft:brown_mushroom_block"; public const BROWN_SHULKER_BOX = "minecraft:brown_shulker_box"; + public const BROWN_STAINED_GLASS = "minecraft:brown_stained_glass"; + public const BROWN_STAINED_GLASS_PANE = "minecraft:brown_stained_glass_pane"; + public const BROWN_TERRACOTTA = "minecraft:brown_terracotta"; public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; public const BUBBLE_CORAL = "minecraft:bubble_coral"; @@ -194,7 +206,6 @@ final class BlockTypeNames{ public const COLORED_TORCH_RG = "minecraft:colored_torch_rg"; public const COMMAND_BLOCK = "minecraft:command_block"; public const COMPOSTER = "minecraft:composter"; - public const CONCRETE_POWDER = "minecraft:concrete_powder"; public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; public const COPPER_ORE = "minecraft:copper_ore"; @@ -235,8 +246,12 @@ final class BlockTypeNames{ public const CYAN_CANDLE_CAKE = "minecraft:cyan_candle_cake"; public const CYAN_CARPET = "minecraft:cyan_carpet"; public const CYAN_CONCRETE = "minecraft:cyan_concrete"; + public const CYAN_CONCRETE_POWDER = "minecraft:cyan_concrete_powder"; public const CYAN_GLAZED_TERRACOTTA = "minecraft:cyan_glazed_terracotta"; public const CYAN_SHULKER_BOX = "minecraft:cyan_shulker_box"; + public const CYAN_STAINED_GLASS = "minecraft:cyan_stained_glass"; + public const CYAN_STAINED_GLASS_PANE = "minecraft:cyan_stained_glass_pane"; + public const CYAN_TERRACOTTA = "minecraft:cyan_terracotta"; public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; @@ -463,15 +478,23 @@ final class BlockTypeNames{ public const GRAY_CANDLE_CAKE = "minecraft:gray_candle_cake"; public const GRAY_CARPET = "minecraft:gray_carpet"; public const GRAY_CONCRETE = "minecraft:gray_concrete"; + public const GRAY_CONCRETE_POWDER = "minecraft:gray_concrete_powder"; public const GRAY_GLAZED_TERRACOTTA = "minecraft:gray_glazed_terracotta"; public const GRAY_SHULKER_BOX = "minecraft:gray_shulker_box"; + public const GRAY_STAINED_GLASS = "minecraft:gray_stained_glass"; + public const GRAY_STAINED_GLASS_PANE = "minecraft:gray_stained_glass_pane"; + public const GRAY_TERRACOTTA = "minecraft:gray_terracotta"; public const GRAY_WOOL = "minecraft:gray_wool"; public const GREEN_CANDLE = "minecraft:green_candle"; public const GREEN_CANDLE_CAKE = "minecraft:green_candle_cake"; public const GREEN_CARPET = "minecraft:green_carpet"; public const GREEN_CONCRETE = "minecraft:green_concrete"; + public const GREEN_CONCRETE_POWDER = "minecraft:green_concrete_powder"; public const GREEN_GLAZED_TERRACOTTA = "minecraft:green_glazed_terracotta"; public const GREEN_SHULKER_BOX = "minecraft:green_shulker_box"; + public const GREEN_STAINED_GLASS = "minecraft:green_stained_glass"; + public const GREEN_STAINED_GLASS_PANE = "minecraft:green_stained_glass_pane"; + public const GREEN_TERRACOTTA = "minecraft:green_terracotta"; public const GREEN_WOOL = "minecraft:green_wool"; public const GRINDSTONE = "minecraft:grindstone"; public const HANGING_ROOTS = "minecraft:hanging_roots"; @@ -525,14 +548,22 @@ final class BlockTypeNames{ public const LIGHT_BLUE_CANDLE_CAKE = "minecraft:light_blue_candle_cake"; public const LIGHT_BLUE_CARPET = "minecraft:light_blue_carpet"; public const LIGHT_BLUE_CONCRETE = "minecraft:light_blue_concrete"; + public const LIGHT_BLUE_CONCRETE_POWDER = "minecraft:light_blue_concrete_powder"; public const LIGHT_BLUE_GLAZED_TERRACOTTA = "minecraft:light_blue_glazed_terracotta"; public const LIGHT_BLUE_SHULKER_BOX = "minecraft:light_blue_shulker_box"; + public const LIGHT_BLUE_STAINED_GLASS = "minecraft:light_blue_stained_glass"; + public const LIGHT_BLUE_STAINED_GLASS_PANE = "minecraft:light_blue_stained_glass_pane"; + public const LIGHT_BLUE_TERRACOTTA = "minecraft:light_blue_terracotta"; public const LIGHT_BLUE_WOOL = "minecraft:light_blue_wool"; public const LIGHT_GRAY_CANDLE = "minecraft:light_gray_candle"; public const LIGHT_GRAY_CANDLE_CAKE = "minecraft:light_gray_candle_cake"; public const LIGHT_GRAY_CARPET = "minecraft:light_gray_carpet"; public const LIGHT_GRAY_CONCRETE = "minecraft:light_gray_concrete"; + public const LIGHT_GRAY_CONCRETE_POWDER = "minecraft:light_gray_concrete_powder"; public const LIGHT_GRAY_SHULKER_BOX = "minecraft:light_gray_shulker_box"; + public const LIGHT_GRAY_STAINED_GLASS = "minecraft:light_gray_stained_glass"; + public const LIGHT_GRAY_STAINED_GLASS_PANE = "minecraft:light_gray_stained_glass_pane"; + public const LIGHT_GRAY_TERRACOTTA = "minecraft:light_gray_terracotta"; public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; @@ -540,8 +571,12 @@ final class BlockTypeNames{ public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; public const LIME_CARPET = "minecraft:lime_carpet"; public const LIME_CONCRETE = "minecraft:lime_concrete"; + public const LIME_CONCRETE_POWDER = "minecraft:lime_concrete_powder"; public const LIME_GLAZED_TERRACOTTA = "minecraft:lime_glazed_terracotta"; public const LIME_SHULKER_BOX = "minecraft:lime_shulker_box"; + public const LIME_STAINED_GLASS = "minecraft:lime_stained_glass"; + public const LIME_STAINED_GLASS_PANE = "minecraft:lime_stained_glass_pane"; + public const LIME_TERRACOTTA = "minecraft:lime_terracotta"; public const LIME_WOOL = "minecraft:lime_wool"; public const LIT_BLAST_FURNACE = "minecraft:lit_blast_furnace"; public const LIT_DEEPSLATE_REDSTONE_ORE = "minecraft:lit_deepslate_redstone_ore"; @@ -556,8 +591,12 @@ final class BlockTypeNames{ public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; public const MAGENTA_CARPET = "minecraft:magenta_carpet"; public const MAGENTA_CONCRETE = "minecraft:magenta_concrete"; + public const MAGENTA_CONCRETE_POWDER = "minecraft:magenta_concrete_powder"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; public const MAGENTA_SHULKER_BOX = "minecraft:magenta_shulker_box"; + public const MAGENTA_STAINED_GLASS = "minecraft:magenta_stained_glass"; + public const MAGENTA_STAINED_GLASS_PANE = "minecraft:magenta_stained_glass_pane"; + public const MAGENTA_TERRACOTTA = "minecraft:magenta_terracotta"; public const MAGENTA_WOOL = "minecraft:magenta_wool"; public const MAGMA = "minecraft:magma"; public const MANGROVE_BUTTON = "minecraft:mangrove_button"; @@ -620,8 +659,12 @@ final class BlockTypeNames{ public const ORANGE_CANDLE_CAKE = "minecraft:orange_candle_cake"; public const ORANGE_CARPET = "minecraft:orange_carpet"; public const ORANGE_CONCRETE = "minecraft:orange_concrete"; + public const ORANGE_CONCRETE_POWDER = "minecraft:orange_concrete_powder"; public const ORANGE_GLAZED_TERRACOTTA = "minecraft:orange_glazed_terracotta"; public const ORANGE_SHULKER_BOX = "minecraft:orange_shulker_box"; + public const ORANGE_STAINED_GLASS = "minecraft:orange_stained_glass"; + public const ORANGE_STAINED_GLASS_PANE = "minecraft:orange_stained_glass_pane"; + public const ORANGE_TERRACOTTA = "minecraft:orange_terracotta"; public const ORANGE_WOOL = "minecraft:orange_wool"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; public const OXIDIZED_CUT_COPPER = "minecraft:oxidized_cut_copper"; @@ -635,9 +678,13 @@ final class BlockTypeNames{ public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_CARPET = "minecraft:pink_carpet"; public const PINK_CONCRETE = "minecraft:pink_concrete"; + public const PINK_CONCRETE_POWDER = "minecraft:pink_concrete_powder"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; public const PINK_PETALS = "minecraft:pink_petals"; public const PINK_SHULKER_BOX = "minecraft:pink_shulker_box"; + public const PINK_STAINED_GLASS = "minecraft:pink_stained_glass"; + public const PINK_STAINED_GLASS_PANE = "minecraft:pink_stained_glass_pane"; + public const PINK_TERRACOTTA = "minecraft:pink_terracotta"; public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; @@ -681,8 +728,12 @@ final class BlockTypeNames{ public const PURPLE_CANDLE_CAKE = "minecraft:purple_candle_cake"; public const PURPLE_CARPET = "minecraft:purple_carpet"; public const PURPLE_CONCRETE = "minecraft:purple_concrete"; + public const PURPLE_CONCRETE_POWDER = "minecraft:purple_concrete_powder"; public const PURPLE_GLAZED_TERRACOTTA = "minecraft:purple_glazed_terracotta"; public const PURPLE_SHULKER_BOX = "minecraft:purple_shulker_box"; + public const PURPLE_STAINED_GLASS = "minecraft:purple_stained_glass"; + public const PURPLE_STAINED_GLASS_PANE = "minecraft:purple_stained_glass_pane"; + public const PURPLE_TERRACOTTA = "minecraft:purple_terracotta"; public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; public const PURPUR_STAIRS = "minecraft:purpur_stairs"; @@ -698,6 +749,7 @@ final class BlockTypeNames{ public const RED_CANDLE_CAKE = "minecraft:red_candle_cake"; public const RED_CARPET = "minecraft:red_carpet"; public const RED_CONCRETE = "minecraft:red_concrete"; + public const RED_CONCRETE_POWDER = "minecraft:red_concrete_powder"; public const RED_FLOWER = "minecraft:red_flower"; public const RED_GLAZED_TERRACOTTA = "minecraft:red_glazed_terracotta"; public const RED_MUSHROOM = "minecraft:red_mushroom"; @@ -707,6 +759,9 @@ final class BlockTypeNames{ public const RED_SANDSTONE = "minecraft:red_sandstone"; public const RED_SANDSTONE_STAIRS = "minecraft:red_sandstone_stairs"; public const RED_SHULKER_BOX = "minecraft:red_shulker_box"; + public const RED_STAINED_GLASS = "minecraft:red_stained_glass"; + public const RED_STAINED_GLASS_PANE = "minecraft:red_stained_glass_pane"; + public const RED_TERRACOTTA = "minecraft:red_terracotta"; public const RED_WOOL = "minecraft:red_wool"; public const REDSTONE_BLOCK = "minecraft:redstone_block"; public const REDSTONE_LAMP = "minecraft:redstone_lamp"; @@ -766,9 +821,6 @@ final class BlockTypeNames{ public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; public const SPRUCE_TRAPDOOR = "minecraft:spruce_trapdoor"; public const SPRUCE_WALL_SIGN = "minecraft:spruce_wall_sign"; - public const STAINED_GLASS = "minecraft:stained_glass"; - public const STAINED_GLASS_PANE = "minecraft:stained_glass_pane"; - public const STAINED_HARDENED_CLAY = "minecraft:stained_hardened_clay"; public const STANDING_BANNER = "minecraft:standing_banner"; public const STANDING_SIGN = "minecraft:standing_sign"; public const STICKY_PISTON = "minecraft:sticky_piston"; @@ -883,8 +935,12 @@ final class BlockTypeNames{ public const WHITE_CANDLE_CAKE = "minecraft:white_candle_cake"; public const WHITE_CARPET = "minecraft:white_carpet"; public const WHITE_CONCRETE = "minecraft:white_concrete"; + public const WHITE_CONCRETE_POWDER = "minecraft:white_concrete_powder"; public const WHITE_GLAZED_TERRACOTTA = "minecraft:white_glazed_terracotta"; public const WHITE_SHULKER_BOX = "minecraft:white_shulker_box"; + public const WHITE_STAINED_GLASS = "minecraft:white_stained_glass"; + public const WHITE_STAINED_GLASS_PANE = "minecraft:white_stained_glass_pane"; + public const WHITE_TERRACOTTA = "minecraft:white_terracotta"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; public const WOOD = "minecraft:wood"; @@ -896,8 +952,12 @@ final class BlockTypeNames{ public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; public const YELLOW_CARPET = "minecraft:yellow_carpet"; public const YELLOW_CONCRETE = "minecraft:yellow_concrete"; + public const YELLOW_CONCRETE_POWDER = "minecraft:yellow_concrete_powder"; public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; public const YELLOW_SHULKER_BOX = "minecraft:yellow_shulker_box"; + public const YELLOW_STAINED_GLASS = "minecraft:yellow_stained_glass"; + public const YELLOW_STAINED_GLASS_PANE = "minecraft:yellow_stained_glass_pane"; + public const YELLOW_TERRACOTTA = "minecraft:yellow_terracotta"; public const YELLOW_WOOL = "minecraft:yellow_wool"; } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 6ffc1c55df..cf3535097e 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -415,6 +415,86 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ DyeColor::YELLOW() => Ids::YELLOW_CONCRETE, default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) })); + + $this->map(Blocks::CONCRETE_POWDER(), fn(ConcretePowder $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_CONCRETE_POWDER, + DyeColor::BLUE() => Ids::BLUE_CONCRETE_POWDER, + DyeColor::BROWN() => Ids::BROWN_CONCRETE_POWDER, + DyeColor::CYAN() => Ids::CYAN_CONCRETE_POWDER, + DyeColor::GRAY() => Ids::GRAY_CONCRETE_POWDER, + DyeColor::GREEN() => Ids::GREEN_CONCRETE_POWDER, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CONCRETE_POWDER, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CONCRETE_POWDER, + DyeColor::LIME() => Ids::LIME_CONCRETE_POWDER, + DyeColor::MAGENTA() => Ids::MAGENTA_CONCRETE_POWDER, + DyeColor::ORANGE() => Ids::ORANGE_CONCRETE_POWDER, + DyeColor::PINK() => Ids::PINK_CONCRETE_POWDER, + DyeColor::PURPLE() => Ids::PURPLE_CONCRETE_POWDER, + DyeColor::RED() => Ids::RED_CONCRETE_POWDER, + DyeColor::WHITE() => Ids::WHITE_CONCRETE_POWDER, + DyeColor::YELLOW() => Ids::YELLOW_CONCRETE_POWDER, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + + $this->map(Blocks::STAINED_CLAY(), fn(StainedHardenedClay $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_TERRACOTTA, + DyeColor::BLUE() => Ids::BLUE_TERRACOTTA, + DyeColor::BROWN() => Ids::BROWN_TERRACOTTA, + DyeColor::CYAN() => Ids::CYAN_TERRACOTTA, + DyeColor::GRAY() => Ids::GRAY_TERRACOTTA, + DyeColor::GREEN() => Ids::GREEN_TERRACOTTA, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_TERRACOTTA, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_TERRACOTTA, + DyeColor::LIME() => Ids::LIME_TERRACOTTA, + DyeColor::MAGENTA() => Ids::MAGENTA_TERRACOTTA, + DyeColor::ORANGE() => Ids::ORANGE_TERRACOTTA, + DyeColor::PINK() => Ids::PINK_TERRACOTTA, + DyeColor::PURPLE() => Ids::PURPLE_TERRACOTTA, + DyeColor::RED() => Ids::RED_TERRACOTTA, + DyeColor::WHITE() => Ids::WHITE_TERRACOTTA, + DyeColor::YELLOW() => Ids::YELLOW_TERRACOTTA, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + + $this->map(Blocks::STAINED_GLASS(), fn(StainedGlass $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_STAINED_GLASS, + DyeColor::BLUE() => Ids::BLUE_STAINED_GLASS, + DyeColor::BROWN() => Ids::BROWN_STAINED_GLASS, + DyeColor::CYAN() => Ids::CYAN_STAINED_GLASS, + DyeColor::GRAY() => Ids::GRAY_STAINED_GLASS, + DyeColor::GREEN() => Ids::GREEN_STAINED_GLASS, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_STAINED_GLASS, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_STAINED_GLASS, + DyeColor::LIME() => Ids::LIME_STAINED_GLASS, + DyeColor::MAGENTA() => Ids::MAGENTA_STAINED_GLASS, + DyeColor::ORANGE() => Ids::ORANGE_STAINED_GLASS, + DyeColor::PINK() => Ids::PINK_STAINED_GLASS, + DyeColor::PURPLE() => Ids::PURPLE_STAINED_GLASS, + DyeColor::RED() => Ids::RED_STAINED_GLASS, + DyeColor::WHITE() => Ids::WHITE_STAINED_GLASS, + DyeColor::YELLOW() => Ids::YELLOW_STAINED_GLASS, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + + $this->map(Blocks::STAINED_GLASS_PANE(), fn(StainedGlassPane $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_STAINED_GLASS_PANE, + DyeColor::BLUE() => Ids::BLUE_STAINED_GLASS_PANE, + DyeColor::BROWN() => Ids::BROWN_STAINED_GLASS_PANE, + DyeColor::CYAN() => Ids::CYAN_STAINED_GLASS_PANE, + DyeColor::GRAY() => Ids::GRAY_STAINED_GLASS_PANE, + DyeColor::GREEN() => Ids::GREEN_STAINED_GLASS_PANE, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_STAINED_GLASS_PANE, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_STAINED_GLASS_PANE, + DyeColor::LIME() => Ids::LIME_STAINED_GLASS_PANE, + DyeColor::MAGENTA() => Ids::MAGENTA_STAINED_GLASS_PANE, + DyeColor::ORANGE() => Ids::ORANGE_STAINED_GLASS_PANE, + DyeColor::PINK() => Ids::PINK_STAINED_GLASS_PANE, + DyeColor::PURPLE() => Ids::PURPLE_STAINED_GLASS_PANE, + DyeColor::RED() => Ids::RED_STAINED_GLASS_PANE, + DyeColor::WHITE() => Ids::WHITE_STAINED_GLASS_PANE, + DyeColor::YELLOW() => Ids::YELLOW_STAINED_GLASS_PANE, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); } private function registerFlatCoralSerializers() : void{ @@ -905,7 +985,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); $this->map(Blocks::ANVIL(), function(Anvil $block) : Writer{ return Writer::create(Ids::ANVIL) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeString(StateNames::DAMAGE, match($damage = $block->getDamage()){ 0 => StringValues::DAMAGE_UNDAMAGED, 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, @@ -965,7 +1045,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BIG_DRIPLEAF_HEAD(), function(BigDripleafHead $block) : Writer{ return Writer::create(Ids::BIG_DRIPLEAF) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeString(StateNames::BIG_DRIPLEAF_TILT, match($block->getLeafState()->id()){ DripleafState::STABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_NONE, DripleafState::UNSTABLE()->id() => StringValues::BIG_DRIPLEAF_TILT_UNSTABLE, @@ -977,7 +1057,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BIG_DRIPLEAF_STEM(), function(BigDripleafStem $block) : Writer{ return Writer::create(Ids::BIG_DRIPLEAF) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeString(StateNames::BIG_DRIPLEAF_TILT, StringValues::BIG_DRIPLEAF_TILT_NONE) ->writeBool(StateNames::BIG_DRIPLEAF_HEAD, false); }); @@ -1129,10 +1209,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::CONCRETE_POWDER(), function(ConcretePowder $block) : Writer{ - return Writer::create(Ids::CONCRETE_POWDER) - ->writeColor($block->getColor()); - }); $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ return Writer::create(Ids::CORAL_BLOCK) ->writeBool(StateNames::DEAD_BIT, $block->isDead()) @@ -1203,7 +1279,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::END_PORTAL_FRAME(), function(EndPortalFrame $block) : Writer{ return Writer::create(Ids::END_PORTAL_FRAME) ->writeBool(StateNames::END_PORTAL_EYE_BIT, $block->hasEye()) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::END_ROD(), function(EndRod $block) : Writer{ return Writer::create(Ids::END_ROD) @@ -1291,7 +1367,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::LECTERN(), function(Lectern $block) : Writer{ return Writer::create(Ids::LECTERN) ->writeBool(StateNames::POWERED_BIT, $block->isProducingSignal()) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::LEVER(), function(Lever $block) : Writer{ return Writer::create(Ids::LEVER) @@ -1367,7 +1443,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::PINK_PETALS(), function(PinkPetals $block) : Writer{ return Writer::create(Ids::PINK_PETALS) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeInt(StateNames::GROWTH, $block->getCount() - 1); }); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); @@ -1441,13 +1517,13 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create($block->isPowered() ? Ids::POWERED_COMPARATOR : Ids::UNPOWERED_COMPARATOR) ->writeBool(StateNames::OUTPUT_LIT_BIT, $block->isPowered()) ->writeBool(StateNames::OUTPUT_SUBTRACT_BIT, $block->isSubtractMode()) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::REDSTONE_LAMP(), fn(RedstoneLamp $block) => new Writer($block->isPowered() ? Ids::LIT_REDSTONE_LAMP : Ids::REDSTONE_LAMP)); $this->map(Blocks::REDSTONE_ORE(), fn(RedstoneOre $block) => new Writer($block->isLit() ? Ids::LIT_REDSTONE_ORE : Ids::REDSTONE_ORE)); $this->map(Blocks::REDSTONE_REPEATER(), function(RedstoneRepeater $block) : Writer{ return Writer::create($block->isPowered() ? Ids::POWERED_REPEATER : Ids::UNPOWERED_REPEATER) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeInt(StateNames::REPEATER_DELAY, $block->getDelay() - 1); }); $this->map(Blocks::REDSTONE_TORCH(), function(RedstoneTorch $block) : Writer{ @@ -1484,7 +1560,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::SMALL_DRIPLEAF(), function(SmallDripleaf $block) : Writer{ return Writer::create(Ids::SMALL_DRIPLEAF_BLOCK) - ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeCardinalHorizontalFacing($block->getFacing()) ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); }); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); @@ -1520,18 +1596,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); }); $this->map(Blocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); - $this->map(Blocks::STAINED_CLAY(), function(StainedHardenedClay $block) : Writer{ - return Writer::create(Ids::STAINED_HARDENED_CLAY) - ->writeColor($block->getColor()); - }); - $this->map(Blocks::STAINED_GLASS(), function(StainedGlass $block) : Writer{ - return Writer::create(Ids::STAINED_GLASS) - ->writeColor($block->getColor()); - }); - $this->map(Blocks::STAINED_GLASS_PANE(), function(StainedGlassPane $block) : Writer{ - return Writer::create(Ids::STAINED_GLASS_PANE) - ->writeColor($block->getColor()); - }); $this->map(Blocks::STAINED_HARDENED_GLASS(), function(StainedHardenedGlass $block) : Writer{ return Writer::create(Ids::HARD_STAINED_GLASS) ->writeColor($block->getColor()); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 8018d71b89..b929f68005 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -93,7 +93,7 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeComparator(RedstoneComparator $block, BlockStateReader $in) : RedstoneComparator{ return $block - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setPowered($in->readBool(BlockStateNames::OUTPUT_LIT_BIT)) ->setSubtractMode($in->readBool(BlockStateNames::OUTPUT_SUBTRACT_BIT)); } @@ -216,7 +216,7 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeRepeater(RedstoneRepeater $block, BlockStateReader $in) : RedstoneRepeater{ return $block - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setDelay($in->readBoundedInt(BlockStateNames::REPEATER_DELAY, 0, 3) + 1); } diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 09dab0f2c6..33718a686f 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -293,7 +293,11 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readSlabPosition() : SlabType{ - return $this->readBool(BlockStateNames::TOP_SLOT_BIT) ? SlabType::TOP() : SlabType::BOTTOM(); + return match($rawValue = $this->readString(BlockStateNames::MC_VERTICAL_HALF)){ + StringValues::MC_VERTICAL_HALF_BOTTOM => SlabType::BOTTOM(), + StringValues::MC_VERTICAL_HALF_TOP => SlabType::TOP(), + default => throw $this->badValueException(BlockStateNames::MC_VERTICAL_HALF, $rawValue, "Invalid slab position"), + }; } /** diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 97fa5532fb..bd9c2937d6 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -137,7 +137,7 @@ final class BlockStateSerializerHelper{ public static function encodeFurnace(Furnace $block, string $unlitId, string $litId) : BlockStateWriter{ return BlockStateWriter::create($block->isLit() ? $litId : $unlitId) - ->writeHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); } public static function encodeItemFrame(ItemFrame $block, string $id) : BlockStateWriter{ @@ -211,9 +211,8 @@ final class BlockStateSerializerHelper{ public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ $slabType = $block->getSlabType(); return BlockStateWriter::create($slabType->equals(SlabType::DOUBLE()) ? $doubleId : $singleId) - //this is (intentionally) also written for double slabs (as zero) to maintain bug parity with MCPE - ->writeBool(BlockStateNames::TOP_SLOT_BIT, $slabType->equals(SlabType::TOP())); + ->writeSlabPosition($slabType->equals(SlabType::DOUBLE()) ? SlabType::BOTTOM() : $slabType); } public static function encodeStairs(Stair $block, BlockStateWriter $out) : BlockStateWriter{ diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index f6b8699a94..ce39c2739c 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -113,7 +113,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ public function mapSlab(string $singleId, string $doubleId, \Closure $getBlock) : void{ $this->map($singleId, fn(Reader $in) : Slab => $getBlock($in)->setSlabType($in->readSlabPosition())); $this->map($doubleId, function(Reader $in) use ($getBlock) : Slab{ - $in->ignored(StateNames::TOP_SLOT_BIT); + $in->ignored(StateNames::MC_VERTICAL_HALF); return $getBlock($in)->setSlabType(SlabType::DOUBLE()); }); } @@ -288,6 +288,90 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::CONCRETE()->setColor($color)); } + + foreach([ + Ids::BLACK_CONCRETE_POWDER => DyeColor::BLACK(), + Ids::BLUE_CONCRETE_POWDER => DyeColor::BLUE(), + Ids::BROWN_CONCRETE_POWDER => DyeColor::BROWN(), + Ids::CYAN_CONCRETE_POWDER => DyeColor::CYAN(), + Ids::GRAY_CONCRETE_POWDER => DyeColor::GRAY(), + Ids::GREEN_CONCRETE_POWDER => DyeColor::GREEN(), + Ids::LIGHT_BLUE_CONCRETE_POWDER => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_CONCRETE_POWDER => DyeColor::LIGHT_GRAY(), + Ids::LIME_CONCRETE_POWDER => DyeColor::LIME(), + Ids::MAGENTA_CONCRETE_POWDER => DyeColor::MAGENTA(), + Ids::ORANGE_CONCRETE_POWDER => DyeColor::ORANGE(), + Ids::PINK_CONCRETE_POWDER => DyeColor::PINK(), + Ids::PURPLE_CONCRETE_POWDER => DyeColor::PURPLE(), + Ids::RED_CONCRETE_POWDER => DyeColor::RED(), + Ids::WHITE_CONCRETE_POWDER => DyeColor::WHITE(), + Ids::YELLOW_CONCRETE_POWDER => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::CONCRETE_POWDER()->setColor($color)); + } + + foreach([ + Ids::BLACK_TERRACOTTA => DyeColor::BLACK(), + Ids::BLUE_TERRACOTTA => DyeColor::BLUE(), + Ids::BROWN_TERRACOTTA => DyeColor::BROWN(), + Ids::CYAN_TERRACOTTA => DyeColor::CYAN(), + Ids::GRAY_TERRACOTTA => DyeColor::GRAY(), + Ids::GREEN_TERRACOTTA => DyeColor::GREEN(), + Ids::LIGHT_BLUE_TERRACOTTA => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_TERRACOTTA => DyeColor::LIGHT_GRAY(), + Ids::LIME_TERRACOTTA => DyeColor::LIME(), + Ids::MAGENTA_TERRACOTTA => DyeColor::MAGENTA(), + Ids::ORANGE_TERRACOTTA => DyeColor::ORANGE(), + Ids::PINK_TERRACOTTA => DyeColor::PINK(), + Ids::PURPLE_TERRACOTTA => DyeColor::PURPLE(), + Ids::RED_TERRACOTTA => DyeColor::RED(), + Ids::WHITE_TERRACOTTA => DyeColor::WHITE(), + Ids::YELLOW_TERRACOTTA => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::STAINED_CLAY()->setColor($color)); + } + + foreach([ + Ids::BLACK_STAINED_GLASS => DyeColor::BLACK(), + Ids::BLUE_STAINED_GLASS => DyeColor::BLUE(), + Ids::BROWN_STAINED_GLASS => DyeColor::BROWN(), + Ids::CYAN_STAINED_GLASS => DyeColor::CYAN(), + Ids::GRAY_STAINED_GLASS => DyeColor::GRAY(), + Ids::GREEN_STAINED_GLASS => DyeColor::GREEN(), + Ids::LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY(), + Ids::LIME_STAINED_GLASS => DyeColor::LIME(), + Ids::MAGENTA_STAINED_GLASS => DyeColor::MAGENTA(), + Ids::ORANGE_STAINED_GLASS => DyeColor::ORANGE(), + Ids::PINK_STAINED_GLASS => DyeColor::PINK(), + Ids::PURPLE_STAINED_GLASS => DyeColor::PURPLE(), + Ids::RED_STAINED_GLASS => DyeColor::RED(), + Ids::WHITE_STAINED_GLASS => DyeColor::WHITE(), + Ids::YELLOW_STAINED_GLASS => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::STAINED_GLASS()->setColor($color)); + } + + foreach([ + Ids::BLACK_STAINED_GLASS_PANE => DyeColor::BLACK(), + Ids::BLUE_STAINED_GLASS_PANE => DyeColor::BLUE(), + Ids::BROWN_STAINED_GLASS_PANE => DyeColor::BROWN(), + Ids::CYAN_STAINED_GLASS_PANE => DyeColor::CYAN(), + Ids::GRAY_STAINED_GLASS_PANE => DyeColor::GRAY(), + Ids::GREEN_STAINED_GLASS_PANE => DyeColor::GREEN(), + Ids::LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY(), + Ids::LIME_STAINED_GLASS_PANE => DyeColor::LIME(), + Ids::MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA(), + Ids::ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE(), + Ids::PINK_STAINED_GLASS_PANE => DyeColor::PINK(), + Ids::PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE(), + Ids::RED_STAINED_GLASS_PANE => DyeColor::RED(), + Ids::WHITE_STAINED_GLASS_PANE => DyeColor::WHITE(), + Ids::YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::STAINED_GLASS_PANE()->setColor($color)); + } } private function registerFlatCoralDeserializers() : void{ @@ -781,7 +865,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ StringValues::DAMAGE_BROKEN => 0, default => throw $in->badValueException(StateNames::DAMAGE, $value), }) - ->setFacing($in->readLegacyHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::BAMBOO, function(Reader $in) : Block{ return Blocks::BAMBOO() @@ -831,7 +915,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::BIG_DRIPLEAF, function(Reader $in) : Block{ if($in->readBool(StateNames::BIG_DRIPLEAF_HEAD)){ return Blocks::BIG_DRIPLEAF_HEAD() - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLeafState(match($type = $in->readString(StateNames::BIG_DRIPLEAF_TILT)){ StringValues::BIG_DRIPLEAF_TILT_NONE => DripleafState::STABLE(), StringValues::BIG_DRIPLEAF_TILT_UNSTABLE => DripleafState::UNSTABLE(), @@ -841,7 +925,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); }else{ $in->ignored(StateNames::BIG_DRIPLEAF_TILT); - return Blocks::BIG_DRIPLEAF_STEM()->setFacing($in->readLegacyHorizontalFacing()); + return Blocks::BIG_DRIPLEAF_STEM()->setFacing($in->readCardinalHorizontalFacing()); } }); $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB()); @@ -849,7 +933,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in)); $this->map(Ids::BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(false); }); $this->map(Ids::BONE_BLOCK, function(Reader $in) : Block{ @@ -935,10 +1019,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); }); - $this->map(Ids::CONCRETE_POWDER, function(Reader $in) : Block{ - return Blocks::CONCRETE_POWDER() - ->setColor($in->readColor()); - }); $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE())); $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); @@ -1007,7 +1087,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() ->setEye($in->readBool(StateNames::END_PORTAL_EYE_BIT)) - ->setFacing($in->readLegacyHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::END_ROD, function(Reader $in) : Block{ return Blocks::END_ROD() @@ -1042,7 +1122,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::FURNACE, function(Reader $in) : Block{ return Blocks::FURNACE() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(false); }); $this->map(Ids::GLOW_LICHEN, fn(Reader $in) => Blocks::GLOW_LICHEN()->setFaces($in->readFacingFlags())); @@ -1084,7 +1164,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in)); $this->map(Ids::LECTERN, function(Reader $in) : Block{ return Blocks::LECTERN() - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setProducingSignal($in->readBool(StateNames::POWERED_BIT)); }); $this->map(Ids::LEVER, function(Reader $in) : Block{ @@ -1113,13 +1193,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in)); $this->map(Ids::LIT_BLAST_FURNACE, function(Reader $in) : Block{ return Blocks::BLAST_FURNACE() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(true); }); $this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(true)); $this->map(Ids::LIT_FURNACE, function(Reader $in) : Block{ return Blocks::FURNACE() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(true); }); $this->map(Ids::LIT_PUMPKIN, function(Reader $in) : Block{ @@ -1136,7 +1216,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::LIT_SMOKER, function(Reader $in) : Block{ return Blocks::SMOKER() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(true); }); $this->map(Ids::LOOM, function(Reader $in) : Block{ @@ -1180,7 +1260,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ //Pink petals only uses 0-3, but GROWTH state can go up to 7 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); return Blocks::PINK_PETALS() - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setCount(min($growth + 1, PinkPetals::MAX_COUNT)); }); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); @@ -1354,12 +1434,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::SMOKER, function(Reader $in) : Block{ return Blocks::SMOKER() - ->setFacing($in->readHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(false); }); $this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(Reader $in) : Block{ return Blocks::SMALL_DRIPLEAF() - ->setFacing($in->readLegacyHorizontalFacing()) + ->setFacing($in->readCardinalHorizontalFacing()) ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); @@ -1388,18 +1468,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ default => throw $in->badValueException(StateNames::SPONGE_TYPE, $type), }); }); - $this->map(Ids::STAINED_GLASS, function(Reader $in) : Block{ - return Blocks::STAINED_GLASS() - ->setColor($in->readColor()); - }); - $this->map(Ids::STAINED_GLASS_PANE, function(Reader $in) : Block{ - return Blocks::STAINED_GLASS_PANE() - ->setColor($in->readColor()); - }); - $this->map(Ids::STAINED_HARDENED_CLAY, function(Reader $in) : Block{ - return Blocks::STAINED_CLAY() - ->setColor($in->readColor()); - }); $this->map(Ids::STANDING_BANNER, function(Reader $in) : Block{ return Blocks::BANNER() ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15)); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 2e2d8daae4..6b77a80e14 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -246,9 +246,9 @@ final class BlockStateWriter{ /** @return $this */ public function writeSlabPosition(SlabType $slabType) : self{ - $this->writeBool(BlockStateNames::TOP_SLOT_BIT, match($slabType->id()){ - SlabType::TOP()->id() => true, - SlabType::BOTTOM()->id() => false, + $this->writeString(BlockStateNames::MC_VERTICAL_HALF, match($slabType->id()){ + SlabType::TOP()->id() => StringValues::MC_VERTICAL_HALF_TOP, + SlabType::BOTTOM()->id() => StringValues::MC_VERTICAL_HALF_BOTTOM, default => throw new BlockStateSerializeException("Invalid slab type " . $slabType->name()) }); return $this; diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index e0e3820e4c..85f01106a6 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -125,6 +125,7 @@ final class ItemTypeNames{ public const COMPASS = "minecraft:compass"; public const COMPOUND = "minecraft:compound"; public const CONCRETE = "minecraft:concrete"; + public const CONCRETE_POWDER = "minecraft:concrete_powder"; public const COOKED_BEEF = "minecraft:cooked_beef"; public const COOKED_CHICKEN = "minecraft:cooked_chicken"; public const COOKED_COD = "minecraft:cooked_cod"; @@ -437,6 +438,9 @@ final class ItemTypeNames{ public const SPRUCE_SIGN = "minecraft:spruce_sign"; public const SPYGLASS = "minecraft:spyglass"; public const SQUID_SPAWN_EGG = "minecraft:squid_spawn_egg"; + public const STAINED_GLASS = "minecraft:stained_glass"; + public const STAINED_GLASS_PANE = "minecraft:stained_glass_pane"; + public const STAINED_HARDENED_CLAY = "minecraft:stained_hardened_clay"; public const STICK = "minecraft:stick"; public const STONE_AXE = "minecraft:stone_axe"; public const STONE_HOE = "minecraft:stone_hoe"; diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 30841d8060..9a477d9296 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -79,7 +79,6 @@ use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket; use pocketmine\network\mcpe\protocol\PlayerHotbarPacket; use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\PlayerSkinPacket; -use pocketmine\network\mcpe\protocol\RequestAbilityPacket; use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket; use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket; use pocketmine\network\mcpe\protocol\SetActorMotionPacket; @@ -116,7 +115,6 @@ use function fmod; use function get_debug_type; use function implode; use function in_array; -use function is_bool; use function is_infinite; use function is_nan; use function json_decode; @@ -224,11 +222,13 @@ class InGamePacketHandler extends PacketHandler{ $sprinting = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SPRINTING, PlayerAuthInputFlags::STOP_SPRINTING); $swimming = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SWIMMING, PlayerAuthInputFlags::STOP_SWIMMING); $gliding = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_GLIDING, PlayerAuthInputFlags::STOP_GLIDING); + $flying = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_FLYING, PlayerAuthInputFlags::STOP_FLYING); $mismatch = ($sneaking !== null && !$this->player->toggleSneak($sneaking)) | ($sprinting !== null && !$this->player->toggleSprint($sprinting)) | ($swimming !== null && !$this->player->toggleSwim($swimming)) | - ($gliding !== null && !$this->player->toggleGlide($gliding)); + ($gliding !== null && !$this->player->toggleGlide($gliding)) | + ($flying !== null && !$this->player->toggleFlight($flying)); if((bool) $mismatch){ $this->player->sendData([$this->player]); } @@ -1032,22 +1032,4 @@ class InGamePacketHandler extends PacketHandler{ $this->player->emote($packet->getEmoteId()); return true; } - - public function handleRequestAbility(RequestAbilityPacket $packet) : bool{ - if($packet->getAbilityId() === RequestAbilityPacket::ABILITY_FLYING){ - $isFlying = $packet->getAbilityValue(); - if(!is_bool($isFlying)){ - throw new PacketHandlingException("Flying ability should always have a bool value"); - } - if($isFlying !== $this->player->isFlying()){ - if(!$this->player->toggleFlight($isFlying)){ - $this->session->syncAbilities($this->player); - } - } - - return true; - } - - return false; - } } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 7438fe47c1..08ce53efe2 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -80,7 +80,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ ); }, $this->resourcePackManager->getResourceStack()); //TODO: support forcing server packs - $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false)); + $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false, [])); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index f4e26257b8..20b1210f98 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 594; + public const CURRENT_STORAGE_NETWORK_VERSION = 618; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 10, //patch - 1, //revision + 30, //patch + 2, //revision 0 //is beta ]; From a85814d0c904712fe106e373f7b06c3c3c1239cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 18:40:07 +0100 Subject: [PATCH 1395/1858] Release 4.24.0 --- changelogs/4.24.md | 17 +++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.24.md diff --git a/changelogs/4.24.md b/changelogs/4.24.md new file mode 100644 index 0000000000..2d28e90649 --- /dev/null +++ b/changelogs/4.24.md @@ -0,0 +1,17 @@ +# 4.24.0 +Released 20th September 2023. + +**For Minecraft: Bedrock Edition 1.20.30** + +This is a support release for Minecraft: Bedrock Edition 1.20.30. + +**Plugin compatibility:** Plugins for previous 4.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.30. +- Removed support for older versions. +- Updated 4.x obsoletion message. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 905c168241..5bdbe267fb 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.23.7"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.24.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 914eb62e947fcda06bb421e721ae8c6dcaea5dde Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 18:40:07 +0100 Subject: [PATCH 1396/1858] 4.24.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5bdbe267fb..7f9ef2bbe3 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.24.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.24.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From f485f7fb469e034799e387d1b7124091caea2ef2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 18:57:36 +0100 Subject: [PATCH 1397/1858] Updated composer dependencies --- composer.lock | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/composer.lock b/composer.lock index 25d2d890d5..4e3658bd9a 100644 --- a/composer.lock +++ b/composer.lock @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.4", + "version": "10.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-08-31T14:04:38+00:00" + "time": "2023-09-19T04:59:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1862,16 +1862,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.3", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -1885,7 +1885,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -1895,7 +1895,7 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", + "sebastian/exporter": "^5.1", "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", @@ -1943,7 +1943,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -1959,7 +1959,7 @@ "type": "tidelift" } ], - "time": "2023-09-05T04:34:51+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "sebastian/cli-parser", @@ -2396,16 +2396,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", "shasum": "" }, "require": { @@ -2461,7 +2461,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" }, "funding": [ { @@ -2469,7 +2470,7 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-18T07:15:37+00:00" }, { "name": "sebastian/global-state", From 338bb3fe6d70f093fc8dc01d1d3c3b4b3656fcf8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 19:00:51 +0100 Subject: [PATCH 1398/1858] Release 5.6.0 --- changelogs/5.6.md | 20 ++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.6.md diff --git a/changelogs/5.6.md b/changelogs/5.6.md new file mode 100644 index 0000000000..d4914f527f --- /dev/null +++ b/changelogs/5.6.md @@ -0,0 +1,20 @@ +# 5.6.0 +Released 20th September 2023. + +**For Minecraft: Bedrock Edition 1.20.30** + +This is a support release for Minecraft: Bedrock Edition 1.20.30. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.30. +- Removed support for older versions. + +## Fixes +- Fixed support conditions for hanging roots, cave vines and dead bushes. +- Fixed connection conditions for fences, glass panes, iron bars, and walls. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 18f03233db..482c55e023 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.5.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.6.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 5eca90d47870c1ff5f2fde3af3e92bcd1b0bf274 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 19:00:51 +0100 Subject: [PATCH 1399/1858] 5.6.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 482c55e023..38854ac9c5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.6.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.6.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 3f7abf29a82ec0e81386d7d519133f8fe1f278dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 19:42:21 +0100 Subject: [PATCH 1400/1858] Added PHPStan rule to flag usages of legacy enum accessors provided by LegacyEnumShimTrait closes #6061 --- phpstan.neon.dist | 1 + .../rules/DeprecatedLegacyEnumAccessRule.php | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 581bf41ec5..2fde67d6ca 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -10,6 +10,7 @@ includes: - vendor/phpstan/phpstan-strict-rules/rules.neon rules: + - pocketmine\phpstan\rules\DeprecatedLegacyEnumAccessRule - pocketmine\phpstan\rules\DisallowEnumComparisonRule - pocketmine\phpstan\rules\DisallowForeachByReferenceRule - pocketmine\phpstan\rules\UnsafeForeachArrayOfStringRule diff --git a/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php b/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php new file mode 100644 index 0000000000..2f17e69140 --- /dev/null +++ b/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php @@ -0,0 +1,78 @@ + + */ +final class DeprecatedLegacyEnumAccessRule implements Rule{ + + public function getNodeType() : string{ + return StaticCall::class; + } + + public function processNode(Node $node, Scope $scope) : array{ + /** @var StaticCall $node */ + if(!$node->name instanceof Node\Identifier){ + return []; + } + $caseName = $node->name->name; + $classType = $node->class instanceof Node\Name ? + $scope->resolveTypeByName($node->class) : + $scope->getType($node->class); + + if(!$classType instanceof TypeWithClassName){ + return []; + } + + $reflection = $classType->getClassReflection(); + if($reflection === null || !$reflection->hasTraitUse(LegacyEnumShimTrait::class) || !$reflection->implementsInterface(\UnitEnum::class)){ + return []; + } + + if(!$reflection->hasNativeMethod($caseName)){ + return [ + RuleErrorBuilder::message(sprintf( + 'Use of legacy enum case accessor %s::%s().', + $reflection->getName(), + $caseName + ))->tip(sprintf( + 'Access the enum constant directly instead (remove the brackets), e.g. %s::%s', + $reflection->getName(), + $caseName + ))->build() + ]; + } + + return []; + } +} From 3906600d44c326940fcca2f7da4843611cdd400a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Sep 2023 19:44:53 +0100 Subject: [PATCH 1401/1858] Fix CS --- tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php b/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php index 2f17e69140..4fa7670224 100644 --- a/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php +++ b/tests/phpstan/rules/DeprecatedLegacyEnumAccessRule.php @@ -30,6 +30,7 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\TypeWithClassName; use pocketmine\utils\LegacyEnumShimTrait; +use function sprintf; /** * @phpstan-implements Rule From 912fd3f5c61e880d192a7e4dbd2c8f4cc740e959 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Sep 2023 13:22:14 +0100 Subject: [PATCH 1402/1858] PHPStan 1.10.35, plus workarounds --- composer.json | 2 +- composer.lock | 12 ++++++------ src/MemoryManager.php | 2 +- tests/phpstan/configs/actual-problems.neon | 10 ---------- tests/phpstan/configs/php-bugs.neon | 9 +++++++-- tests/phpstan/configs/phpstan-bugs.neon | 5 +++++ 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 96715ef8f8..10f10e6cae 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "~2.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.15", + "phpstan/phpstan": "1.10.35", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.1" diff --git a/composer.lock b/composer.lock index 8679a0810d..acf98a172e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dc69846ccf19272d45811712f038f167", + "content-hash": "544d6f936592b418497d61fec8058656", "packages": [ { "name": "adhocore/json-comment", @@ -1738,16 +1738,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.15", + "version": "1.10.35", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd" + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd", - "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", "shasum": "" }, "require": { @@ -1796,7 +1796,7 @@ "type": "tidelift" } ], - "time": "2023-05-09T15:28:01+00:00" + "time": "2023-09-19T15:27:56+00:00" }, { "name": "phpstan/phpstan-phpunit", diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 1db31615d0..13cf769a40 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -361,7 +361,7 @@ class MemoryManager{ '_SESSION' => true ]; - foreach(Utils::stringifyKeys($GLOBALS) as $varName => $value){ + foreach($GLOBALS as $varName => $value){ if(isset($ignoredGlobals[$varName])){ continue; } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 8e28edaa51..6982302082 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -1315,16 +1315,6 @@ parameters: count: 1 path: ../../phpunit/block/regenerate_consistency_check.php - - - message: "#^Property pocketmine\\\\event\\\\HandlerListManagerTest\\:\\:\\$isValidFunc \\(Closure\\(ReflectionClass\\\\)\\: bool\\) does not accept Closure\\|null\\.$#" - count: 1 - path: ../../phpunit/event/HandlerListManagerTest.php - - - - message: "#^Property pocketmine\\\\event\\\\HandlerListManagerTest\\:\\:\\$resolveParentFunc \\(Closure\\(ReflectionClass\\\\)\\: ReflectionClass\\\\|null\\) does not accept Closure\\|null\\.$#" - count: 1 - path: ../../phpunit/event/HandlerListManagerTest.php - - message: "#^Parameter \\#1 \\$logFile of class pocketmine\\\\utils\\\\MainLogger constructor expects string, string\\|false given\\.$#" count: 1 diff --git a/tests/phpstan/configs/php-bugs.neon b/tests/phpstan/configs/php-bugs.neon index 4475ec4684..13a42a53bb 100644 --- a/tests/phpstan/configs/php-bugs.neon +++ b/tests/phpstan/configs/php-bugs.neon @@ -1,6 +1,11 @@ parameters: ignoreErrors: - - message: "#^Property pocketmine\\\\network\\\\mcpe\\\\handler\\\\StupidJsonDecodeTest\\:\\:\\$stupidJsonDecodeFunc \\(Closure\\(string, bool\\=\\)\\: mixed\\) does not accept Closure\\|null\\.$#" + message: "#^Property pocketmine\\\\event\\\\HandlerListManagerTest\\:\\:\\$isValidFunc \\(Closure\\(ReflectionClass\\\\)\\: bool\\) does not accept Closure\\|null\\.$#" count: 1 - path: ../../phpunit/network/mcpe/handler/StupidJsonDecodeTest.php + path: ../../phpunit/event/HandlerListManagerTest.php + + - + message: "#^Property pocketmine\\\\event\\\\HandlerListManagerTest\\:\\:\\$resolveParentFunc \\(Closure\\(ReflectionClass\\\\)\\: \\(ReflectionClass\\\\|null\\)\\) does not accept Closure\\|null\\.$#" + count: 1 + path: ../../phpunit/event/HandlerListManagerTest.php diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 99cf2aaa76..62f945fc77 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -10,6 +10,11 @@ parameters: count: 1 path: ../../../src/entity/projectile/Projectile.php + - + message: "#^Match arm comparison between 1\\|2\\|3\\|4 and 0 is always false\\.$#" + count: 1 + path: ../../../src/network/mcpe/handler/InGamePacketHandler.php + - message: "#^Match arm comparison between 4 and 4 is always true\\.$#" count: 1 From 7a2cfa92b637ddc5d297ea9c2299b8f23f487d42 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Sep 2023 13:23:09 +0100 Subject: [PATCH 1403/1858] Update composer dependencies --- composer.lock | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/composer.lock b/composer.lock index acf98a172e..81f584bde7 100644 --- a/composer.lock +++ b/composer.lock @@ -1901,16 +1901,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.4", + "version": "10.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", "shasum": "" }, "require": { @@ -1967,7 +1967,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" }, "funding": [ { @@ -1975,7 +1975,7 @@ "type": "github" } ], - "time": "2023-08-31T14:04:38+00:00" + "time": "2023-09-19T04:59:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2222,16 +2222,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.3", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -2245,7 +2245,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -2255,7 +2255,7 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", + "sebastian/exporter": "^5.1", "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", @@ -2303,7 +2303,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -2319,7 +2319,7 @@ "type": "tidelift" } ], - "time": "2023-09-05T04:34:51+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "sebastian/cli-parser", @@ -2756,16 +2756,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", "shasum": "" }, "require": { @@ -2821,7 +2821,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" }, "funding": [ { @@ -2829,7 +2830,7 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-18T07:15:37+00:00" }, { "name": "sebastian/global-state", From ee6d551729e4dda6bf18105aa9ce3e1db9cb91d9 Mon Sep 17 00:00:00 2001 From: Tobias Grether Date: Thu, 21 Sep 2023 15:48:50 +0200 Subject: [PATCH 1404/1858] Include TitleID in PlayerInfo extraData (#6054) --- src/network/mcpe/handler/LoginPacketHandler.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index a8c3d4d628..9ac82bc5fe 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -83,6 +83,9 @@ class LoginPacketHandler extends PacketHandler{ throw new PacketHandlingException("Invalid login UUID"); } $uuid = Uuid::fromString($extraData->identity); + $arrClientData = (array) $clientData; + $arrClientData["TitleID"] = $extraData->titleId; + if($extraData->XUID !== ""){ $playerInfo = new XboxLivePlayerInfo( $extraData->XUID, @@ -90,7 +93,7 @@ class LoginPacketHandler extends PacketHandler{ $uuid, $skin, $clientData->LanguageCode, - (array) $clientData + $arrClientData ); }else{ $playerInfo = new PlayerInfo( @@ -98,7 +101,7 @@ class LoginPacketHandler extends PacketHandler{ $uuid, $skin, $clientData->LanguageCode, - (array) $clientData + $arrClientData ); } ($this->playerInfoConsumer)($playerInfo); From dd2e6ea33fafe40b9ea0910257dc703419bbaf56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 14:49:38 +0100 Subject: [PATCH 1405/1858] Bump shivammathur/setup-php from 2.25.5 to 2.26.0 (#6055) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.25.5 to 2.26.0. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.25.5...2.26.0) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index a749229380..94b7bb99d0 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.5 + uses: shivammathur/setup-php@2.26.0 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 4cf78f57ef..f7026c6468 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.25.5 + uses: shivammathur/setup-php@2.26.0 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f9046017ce..c511fb815f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -176,7 +176,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.25.5 + uses: shivammathur/setup-php@2.26.0 with: php-version: 8.1 tools: php-cs-fixer:3.17 From 77566db76681f366603141f81c5a812626528a3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 14:50:17 +0100 Subject: [PATCH 1406/1858] Bump docker/build-push-action from 4.1.1 to 5.0.0 (#6051) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.1 to 5.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4.1.1...v5.0.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index fefc06c0a9..597d842318 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: push: true context: ./pocketmine-mp From f151047b5ec6b9699c20ab11533e030fbd15a4c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 14:50:40 +0100 Subject: [PATCH 1407/1858] Bump docker/login-action from 2 to 3 (#6050) Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 597d842318..392f1953ec 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -15,13 +15,13 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} From c028bb9055c28aa9e64349fc42cd341d4a2e930c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 14:50:57 +0100 Subject: [PATCH 1408/1858] Bump docker/setup-buildx-action from 2 to 3 (#6049) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 392f1953ec..406bff36c0 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub uses: docker/login-action@v3 From c3bca9e172144ce8e968897ba8b1a5b69f539c23 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 12:36:57 +0100 Subject: [PATCH 1409/1858] tools/generate-bedrock-data-from-packets: fixed interpreting item metadata as blockstates when the item ID could be interpreted as a block ID this broke crafting recipes which accepted skulls as inputs, as well as nether wart and bed recipes. --- tools/generate-bedrock-data-from-packets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index ab8a28ced0..7316b3f867 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -276,7 +276,7 @@ class ParserPacketHandler extends PacketHandler{ $meta = $descriptor->getMeta(); if($meta !== 32767){ $blockStateId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta); - if($blockStateId !== null){ + if($this->blockItemIdMap->lookupBlockId($data->name) !== null && $blockStateId !== null){ $blockState = $this->blockTranslator->getBlockStateDictionary()->generateDataFromStateId($blockStateId); if($blockState !== null && count($blockState->getStates()) > 0){ $data->block_states = self::blockStatePropertiesToString($blockState); From 6ec340359b1bdb00b1213c9d31a9c4d8a24a7532 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 13:07:46 +0100 Subject: [PATCH 1410/1858] Implemented crimson and warped roots --- src/block/BlockTypeIds.php | 4 +- src/block/NetherRoots.php | 39 +++++++++++++++++++ src/block/VanillaBlocks.php | 6 +++ .../convert/BlockObjectToStateSerializer.php | 2 + .../BlockStateToObjectDeserializer.php | 2 + src/item/StringToItemParser.php | 2 + .../block_factory_consistency_check.json | 2 +- 7 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/block/NetherRoots.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index dc86490c33..fb53e60b3b 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -737,8 +737,10 @@ final class BlockTypeIds{ public const BIG_DRIPLEAF_HEAD = 10707; public const BIG_DRIPLEAF_STEM = 10708; public const PINK_PETALS = 10709; + public const CRIMSON_ROOTS = 10710; + public const WARPED_ROOTS = 10711; - public const FIRST_UNUSED_BLOCK_ID = 10710; + public const FIRST_UNUSED_BLOCK_ID = 10712; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/NetherRoots.php b/src/block/NetherRoots.php new file mode 100644 index 0000000000..5c39b8bec3 --- /dev/null +++ b/src/block/NetherRoots.php @@ -0,0 +1,39 @@ +getSide(Facing::DOWN); + return + $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || + $supportBlock->hasTypeTag(BlockTypeTags::MUD); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 196816b304..9008d77d07 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -222,6 +222,7 @@ use function strtolower; * @method static Wood CRIMSON_HYPHAE() * @method static Planks CRIMSON_PLANKS() * @method static WoodenPressurePlate CRIMSON_PRESSURE_PLATE() + * @method static NetherRoots CRIMSON_ROOTS() * @method static FloorSign CRIMSON_SIGN() * @method static WoodenSlab CRIMSON_SLAB() * @method static WoodenStairs CRIMSON_STAIRS() @@ -740,6 +741,7 @@ use function strtolower; * @method static Wood WARPED_HYPHAE() * @method static Planks WARPED_PLANKS() * @method static WoodenPressurePlate WARPED_PRESSURE_PLATE() + * @method static NetherRoots WARPED_ROOTS() * @method static FloorSign WARPED_SIGN() * @method static WoodenSlab WARPED_SLAB() * @method static WoodenStairs WARPED_STAIRS() @@ -1535,6 +1537,10 @@ final class VanillaBlocks{ self::register("twisting_vines", new NetherVines(new BID(Ids::TWISTING_VINES), "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); self::register("weeping_vines", new NetherVines(new BID(Ids::WEEPING_VINES), "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); + $netherRootsInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); + self::register("crimson_roots", new NetherRoots(new BID(Ids::CRIMSON_ROOTS), "Crimson Roots", $netherRootsInfo)); + self::register("warped_roots", new NetherRoots(new BID(Ids::WARPED_ROOTS), "Warped Roots", $netherRootsInfo)); + self::register("chain", new Chain(new BID(Ids::CHAIN), "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 08753ded1d..6596e90db0 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -737,6 +737,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CRACKED_NETHER_BRICKS(), Ids::CRACKED_NETHER_BRICKS); $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); + $this->mapSimple(Blocks::CRIMSON_ROOTS(), Ids::CRIMSON_ROOTS); $this->mapSimple(Blocks::CRYING_OBSIDIAN(), Ids::CRYING_OBSIDIAN); $this->mapSimple(Blocks::DANDELION(), Ids::YELLOW_FLOWER); $this->mapSimple(Blocks::DEAD_BUSH(), Ids::DEADBUSH); @@ -953,6 +954,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); + $this->mapSimple(Blocks::WARPED_ROOTS(), Ids::WARPED_ROOTS); $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index c26fe4986f..5071f9e498 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -629,6 +629,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); $this->mapSimple(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); $this->mapSimple(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); + $this->mapSimple(Ids::CRIMSON_ROOTS, fn() => Blocks::CRIMSON_ROOTS()); $this->mapSimple(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); $this->mapSimple(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); $this->mapSimple(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); @@ -843,6 +844,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF()); $this->mapSimple(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); $this->mapSimple(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); + $this->mapSimple(Ids::WARPED_ROOTS, fn() => Blocks::WARPED_ROOTS()); $this->mapSimple(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB()); $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index f4ebcaad24..1db7cd1431 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -287,6 +287,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(false)); $result->registerBlock("crimson_planks", fn() => Blocks::CRIMSON_PLANKS()); $result->registerBlock("crimson_pressure_plate", fn() => Blocks::CRIMSON_PRESSURE_PLATE()); + $result->registerBlock("crimson_roots", fn() => Blocks::CRIMSON_ROOTS()); $result->registerBlock("crimson_sign", fn() => Blocks::CRIMSON_SIGN()); $result->registerBlock("crimson_slab", fn() => Blocks::CRIMSON_SLAB()); $result->registerBlock("crimson_stairs", fn() => Blocks::CRIMSON_STAIRS()); @@ -1104,6 +1105,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(false)); $result->registerBlock("warped_planks", fn() => Blocks::WARPED_PLANKS()); $result->registerBlock("warped_pressure_plate", fn() => Blocks::WARPED_PRESSURE_PLATE()); + $result->registerBlock("warped_roots", fn() => Blocks::WARPED_ROOTS()); $result->registerBlock("warped_sign", fn() => Blocks::WARPED_SIGN()); $result->registerBlock("warped_slab", fn() => Blocks::WARPED_SLAB()); $result->registerBlock("warped_stairs", fn() => Blocks::WARPED_STAIRS()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index c120105649..83dcb08338 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From 4f13e446a1f78f7969e21693d60fb88779633fcc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 13:18:02 +0100 Subject: [PATCH 1411/1858] StringToItemParser: clean up hardcoded potion aliases these were needed in PM4, but the type is dynamic in PM5. --- src/item/StringToItemParser.php | 93 +++------------------------------ 1 file changed, 7 insertions(+), 86 deletions(-) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 1db7cd1431..31796570ae 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1156,6 +1156,13 @@ final class StringToItemParser extends StringToTParser{ $result->register($prefix("suspicious_stew"), fn() => Items::SUSPICIOUS_STEW()->setType($suspiciousStewType)); } + + foreach(PotionType::cases() as $potionType){ + $prefix = fn(string $name) => strtolower($potionType->name) . "_" . $name; + + $result->register($prefix("potion"), fn() => Items::POTION()->setType($potionType)); + $result->register($prefix("splash_potion"), fn() => Items::SPLASH_POTION()->setType($potionType)); + } } private static function registerItems(self $result) : void{ @@ -1167,8 +1174,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("arrow", fn() => Items::ARROW()); - $result->register("awkward_potion", fn() => Items::POTION()->setType(PotionType::AWKWARD)); - $result->register("awkward_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::AWKWARD)); $result->register("baked_potato", fn() => Items::BAKED_POTATO()); $result->register("baked_potatoes", fn() => Items::BAKED_POTATO()); $result->register("beef", fn() => Items::RAW_BEEF()); @@ -1289,8 +1294,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); $result->register("fire_charge", fn() => Items::FIRE_CHARGE()); - $result->register("fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::FIRE_RESISTANCE)); - $result->register("fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::FIRE_RESISTANCE)); $result->register("fish", fn() => Items::RAW_FISH()); $result->register("fishing_rod", fn() => Items::FISHING_ROD()); $result->register("flint", fn() => Items::FLINT()); @@ -1326,16 +1329,10 @@ final class StringToItemParser extends StringToTParser{ $result->register("golden_shovel", fn() => Items::GOLDEN_SHOVEL()); $result->register("golden_sword", fn() => Items::GOLDEN_SWORD()); $result->register("gunpowder", fn() => Items::GUNPOWDER()); - $result->register("harming_potion", fn() => Items::POTION()->setType(PotionType::HARMING)); - $result->register("harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HARMING)); - $result->register("healing_potion", fn() => Items::POTION()->setType(PotionType::HEALING)); - $result->register("healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::HEALING)); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); $result->register("honey_bottle", fn() => Items::HONEY_BOTTLE()); $result->register("honeycomb", fn() => Items::HONEYCOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); - $result->register("invisibility_potion", fn() => Items::POTION()->setType(PotionType::INVISIBILITY)); - $result->register("invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::INVISIBILITY)); $result->register("iron_axe", fn() => Items::IRON_AXE()); $result->register("iron_boots", fn() => Items::IRON_BOOTS()); $result->register("iron_chestplate", fn() => Items::IRON_CHESTPLATE()); @@ -1350,8 +1347,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("jungle_boat", fn() => Items::JUNGLE_BOAT()); $result->register("lapis_lazuli", fn() => Items::LAPIS_LAZULI()); $result->register("lava_bucket", fn() => Items::LAVA_BUCKET()); - $result->register("leaping_potion", fn() => Items::POTION()->setType(PotionType::LEAPING)); - $result->register("leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LEAPING)); $result->register("leather", fn() => Items::LEATHER()); $result->register("leather_boots", fn() => Items::LEATHER_BOOTS()); $result->register("leather_cap", fn() => Items::LEATHER_CAP()); @@ -1360,42 +1355,12 @@ final class StringToItemParser extends StringToTParser{ $result->register("leather_leggings", fn() => Items::LEATHER_PANTS()); $result->register("leather_pants", fn() => Items::LEATHER_PANTS()); $result->register("leather_tunic", fn() => Items::LEATHER_TUNIC()); - $result->register("long_fire_resistance_potion", fn() => Items::POTION()->setType(PotionType::LONG_FIRE_RESISTANCE)); - $result->register("long_fire_resistance_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_FIRE_RESISTANCE)); - $result->register("long_invisibility_potion", fn() => Items::POTION()->setType(PotionType::LONG_INVISIBILITY)); - $result->register("long_invisibility_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_INVISIBILITY)); - $result->register("long_leaping_potion", fn() => Items::POTION()->setType(PotionType::LONG_LEAPING)); - $result->register("long_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_LEAPING)); - $result->register("long_mundane_potion", fn() => Items::POTION()->setType(PotionType::LONG_MUNDANE)); - $result->register("long_mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_MUNDANE)); - $result->register("long_night_vision_potion", fn() => Items::POTION()->setType(PotionType::LONG_NIGHT_VISION)); - $result->register("long_night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_NIGHT_VISION)); - $result->register("long_poison_potion", fn() => Items::POTION()->setType(PotionType::LONG_POISON)); - $result->register("long_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_POISON)); - $result->register("long_regeneration_potion", fn() => Items::POTION()->setType(PotionType::LONG_REGENERATION)); - $result->register("long_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_REGENERATION)); - $result->register("long_slow_falling_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOW_FALLING)); - $result->register("long_slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOW_FALLING)); - $result->register("long_slowness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SLOWNESS)); - $result->register("long_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SLOWNESS)); - $result->register("long_strength_potion", fn() => Items::POTION()->setType(PotionType::LONG_STRENGTH)); - $result->register("long_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_STRENGTH)); - $result->register("long_swiftness_potion", fn() => Items::POTION()->setType(PotionType::LONG_SWIFTNESS)); - $result->register("long_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_SWIFTNESS)); - $result->register("long_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::LONG_TURTLE_MASTER)); - $result->register("long_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_TURTLE_MASTER)); - $result->register("long_water_breathing_potion", fn() => Items::POTION()->setType(PotionType::LONG_WATER_BREATHING)); - $result->register("long_water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WATER_BREATHING)); - $result->register("long_weakness_potion", fn() => Items::POTION()->setType(PotionType::LONG_WEAKNESS)); - $result->register("long_weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::LONG_WEAKNESS)); $result->register("magma_cream", fn() => Items::MAGMA_CREAM()); $result->register("melon", fn() => Items::MELON()); $result->register("melon_seeds", fn() => Items::MELON_SEEDS()); $result->register("melon_slice", fn() => Items::MELON()); $result->register("milk_bucket", fn() => Items::MILK_BUCKET()); $result->register("minecart", fn() => Items::MINECART()); - $result->register("mundane_potion", fn() => Items::POTION()->setType(PotionType::MUNDANE)); - $result->register("mundane_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::MUNDANE)); $result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW()); $result->register("mutton", fn() => Items::RAW_MUTTON()); $result->register("mutton_cooked", fn() => Items::COOKED_MUTTON()); @@ -1419,14 +1384,10 @@ final class StringToItemParser extends StringToTParser{ $result->register("netherite_shovel", fn() => Items::NETHERITE_SHOVEL()); $result->register("netherite_sword", fn() => Items::NETHERITE_SWORD()); $result->register("netherstar", fn() => Items::NETHER_STAR()); - $result->register("night_vision_potion", fn() => Items::POTION()->setType(PotionType::NIGHT_VISION)); - $result->register("night_vision_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::NIGHT_VISION)); $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); $result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE()); - $result->register("poison_potion", fn() => Items::POTION()->setType(PotionType::POISON)); - $result->register("poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::POISON)); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); $result->register("popped_chorus_fruit", fn() => Items::POPPED_CHORUS_FRUIT()); $result->register("porkchop", fn() => Items::RAW_PORKCHOP()); @@ -1471,8 +1432,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("record_ward", fn() => Items::RECORD_WARD()); $result->register("redstone", fn() => Items::REDSTONE_DUST()); $result->register("redstone_dust", fn() => Items::REDSTONE_DUST()); - $result->register("regeneration_potion", fn() => Items::POTION()->setType(PotionType::REGENERATION)); - $result->register("regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::REGENERATION)); $result->register("rotten_flesh", fn() => Items::ROTTEN_FLESH()); $result->register("salmon", fn() => Items::RAW_SALMON()); $result->register("scute", fn() => Items::SCUTE()); @@ -1481,10 +1440,6 @@ final class StringToItemParser extends StringToTParser{ $result->register("shulker_shell", fn() => Items::SHULKER_SHELL()); $result->register("slime_ball", fn() => Items::SLIMEBALL()); $result->register("slimeball", fn() => Items::SLIMEBALL()); - $result->register("slow_falling_potion", fn() => Items::POTION()->setType(PotionType::SLOW_FALLING)); - $result->register("slow_falling_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOW_FALLING)); - $result->register("slowness_potion", fn() => Items::POTION()->setType(PotionType::SLOWNESS)); - $result->register("slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SLOWNESS)); $result->register("snowball", fn() => Items::SNOWBALL()); $result->register("speckled_melon", fn() => Items::GLISTERING_MELON()); $result->register("spider_eye", fn() => Items::SPIDER_EYE()); @@ -1500,52 +1455,18 @@ final class StringToItemParser extends StringToTParser{ $result->register("stone_pickaxe", fn() => Items::STONE_PICKAXE()); $result->register("stone_shovel", fn() => Items::STONE_SHOVEL()); $result->register("stone_sword", fn() => Items::STONE_SWORD()); - $result->register("strength_potion", fn() => Items::POTION()->setType(PotionType::STRENGTH)); - $result->register("strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRENGTH)); $result->register("string", fn() => Items::STRING()); - $result->register("strong_harming_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HARMING)); - $result->register("strong_harming_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HARMING)); - $result->register("strong_healing_potion", fn() => Items::POTION()->setType(PotionType::STRONG_HEALING)); - $result->register("strong_healing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_HEALING)); - $result->register("strong_leaping_potion", fn() => Items::POTION()->setType(PotionType::STRONG_LEAPING)); - $result->register("strong_leaping_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_LEAPING)); - $result->register("strong_poison_potion", fn() => Items::POTION()->setType(PotionType::STRONG_POISON)); - $result->register("strong_poison_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_POISON)); - $result->register("strong_regeneration_potion", fn() => Items::POTION()->setType(PotionType::STRONG_REGENERATION)); - $result->register("strong_regeneration_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_REGENERATION)); - $result->register("strong_slowness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SLOWNESS)); - $result->register("strong_slowness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SLOWNESS)); - $result->register("strong_strength_potion", fn() => Items::POTION()->setType(PotionType::STRONG_STRENGTH)); - $result->register("strong_strength_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_STRENGTH)); - $result->register("strong_swiftness_potion", fn() => Items::POTION()->setType(PotionType::STRONG_SWIFTNESS)); - $result->register("strong_swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_SWIFTNESS)); - $result->register("strong_turtle_master_potion", fn() => Items::POTION()->setType(PotionType::STRONG_TURTLE_MASTER)); - $result->register("strong_turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::STRONG_TURTLE_MASTER)); $result->register("sugar", fn() => Items::SUGAR()); $result->register("suspicious_stew", fn() => Items::SUSPICIOUS_STEW()); $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); - $result->register("swiftness_potion", fn() => Items::POTION()->setType(PotionType::SWIFTNESS)); - $result->register("swiftness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::SWIFTNESS)); - $result->register("thick_potion", fn() => Items::POTION()->setType(PotionType::THICK)); - $result->register("thick_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::THICK)); $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC)); $result->register("totem", fn() => Items::TOTEM()); $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); - $result->register("turtle_master_potion", fn() => Items::POTION()->setType(PotionType::TURTLE_MASTER)); - $result->register("turtle_master_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::TURTLE_MASTER)); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); $result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG()); - $result->register("water_breathing_potion", fn() => Items::POTION()->setType(PotionType::WATER_BREATHING)); - $result->register("water_breathing_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER_BREATHING)); $result->register("water_bucket", fn() => Items::WATER_BUCKET()); - $result->register("water_potion", fn() => Items::POTION()->setType(PotionType::WATER)); - $result->register("water_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WATER)); - $result->register("weakness_potion", fn() => Items::POTION()->setType(PotionType::WEAKNESS)); - $result->register("weakness_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WEAKNESS)); $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); - $result->register("wither_potion", fn() => Items::POTION()->setType(PotionType::WITHER)); - $result->register("wither_splash_potion", fn() => Items::SPLASH_POTION()->setType(PotionType::WITHER)); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); $result->register("wooden_pickaxe", fn() => Items::WOODEN_PICKAXE()); From 8f804f6f342e650156767372bac2d42b55297361 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 14:57:06 +0100 Subject: [PATCH 1412/1858] World: discard tiles on load if they aren't the correct type or no tile is expected in many instances, remnants of improperly removed blocks from PM3 have been causing problems, such as flower pot tiles where there are no flower pots. this change might break some plugins which are using tiles for custom purposes, but this is a misuse that was never supported properly in the first place. --- src/world/World.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index 903cc60e2b..1103ae8f9e 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2873,7 +2873,15 @@ class World implements ChunkManager{ }elseif($this->getTile($tilePosition) !== null){ $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Another tile is already at that position"); }else{ - $this->addTile($tile); + $block = $this->getBlockAt($tilePosition->getFloorX(), $tilePosition->getFloorY(), $tilePosition->getFloorZ()); + $expectedClass = $block->getIdInfo()->getTileClass(); + if($expectedClass === null){ + $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Block at that position (" . $block->getName() . ") does not expect a tile"); + }elseif(!($tile instanceof $expectedClass)){ + $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Tile is of wrong type (expected $expectedClass but have " . get_class($tile) . ")"); + }else{ + $this->addTile($tile); + } } } From 56d70390864ea1d232f8f309d81f76ef03bb1e73 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 17:02:37 +0100 Subject: [PATCH 1413/1858] Implemented budding amethyst and amethyst clusters --- src/block/AmethystCluster.php | 133 ++++++++++++++++++ src/block/BlockTypeIds.php | 4 +- src/block/BuddingAmethyst.php | 67 +++++++++ src/block/VanillaBlocks.php | 13 +- src/block/utils/AmethystTrait.php | 40 ++++++ .../convert/BlockObjectToStateSerializer.php | 12 ++ .../block/convert/BlockStateReader.php | 13 ++ .../BlockStateToObjectDeserializer.php | 22 +++ .../block/convert/BlockStateWriter.php | 14 ++ src/item/StringToItemParser.php | 6 + .../block_factory_consistency_check.json | 2 +- 11 files changed, 318 insertions(+), 8 deletions(-) create mode 100644 src/block/AmethystCluster.php create mode 100644 src/block/BuddingAmethyst.php create mode 100644 src/block/utils/AmethystTrait.php diff --git a/src/block/AmethystCluster.php b/src/block/AmethystCluster.php new file mode 100644 index 0000000000..5e23d44631 --- /dev/null +++ b/src/block/AmethystCluster.php @@ -0,0 +1,133 @@ +boundedInt(2, self::STAGE_SMALL_BUD, self::STAGE_CLUSTER, $this->stage); + } + + public function getStage() : int{ return $this->stage; } + + public function setStage(int $stage) : self{ + if($stage < self::STAGE_SMALL_BUD || $stage > self::STAGE_CLUSTER){ + throw new \InvalidArgumentException("Size must be in range " . self::STAGE_SMALL_BUD . " ... " . self::STAGE_CLUSTER); + } + $this->stage = $stage; + return $this; + } + + public function getLightLevel() : int{ + return match($this->stage){ + self::STAGE_SMALL_BUD => 1, + self::STAGE_MEDIUM_BUD => 2, + self::STAGE_LARGE_BUD => 4, + self::STAGE_CLUSTER => 5, + default => throw new AssumptionFailedError("Invalid stage $this->stage"), + }; + } + + protected function recalculateCollisionBoxes() : array{ + $myAxis = Facing::axis($this->facing); + + $box = AxisAlignedBB::one(); + foreach([Axis::Y, Axis::Z, Axis::X] as $axis){ + if($axis === $myAxis){ + continue; + } + $box->squash($axis, $this->stage === self::STAGE_SMALL_BUD ? 4 / 16 : 3 / 16); + } + $box->trim($this->facing, 1 - ($this->stage === self::STAGE_CLUSTER ? 7 / 16 : ($this->stage + 3) / 16)); + + return [$box]; + } + + private function canBeSupportedAt(Block $block, int $facing) : bool{ + return $block->getAdjacentSupportType($facing) === SupportType::FULL; + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if(!$this->canBeSupportedAt($blockReplace, Facing::opposite($face))){ + return false; + } + + $this->facing = $face; + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + if(!$this->canBeSupportedAt($this, Facing::opposite($this->facing))){ + $this->position->getWorld()->useBreakOn($this->position); + } + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + if($this->stage === self::STAGE_CLUSTER){ + return [VanillaItems::AMETHYST_SHARD()->setCount(FortuneDropHelper::weighted($item, min: 4, maxBase: 4))]; + } + + return []; + } + + public function getDropsForIncompatibleTool(Item $item) : array{ + if($this->stage === self::STAGE_CLUSTER){ + return [VanillaItems::AMETHYST_SHARD()->setCount(FortuneDropHelper::weighted($item, min: 2, maxBase: 2))]; + } + + return []; + } +} diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index fb53e60b3b..e6995b78ba 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -562,10 +562,10 @@ final class BlockTypeIds{ public const WEIGHTED_PRESSURE_PLATE_HEAVY = 10532; public const WEIGHTED_PRESSURE_PLATE_LIGHT = 10533; public const WHEAT = 10534; - + public const BUDDING_AMETHYST = 10535; public const WHITE_TULIP = 10536; public const WOOL = 10537; - + public const AMETHYST_CLUSTER = 10538; public const GLAZED_TERRACOTTA = 10539; public const AMETHYST = 10540; public const ANCIENT_DEBRIS = 10541; diff --git a/src/block/BuddingAmethyst.php b/src/block/BuddingAmethyst.php new file mode 100644 index 0000000000..717c0b1a29 --- /dev/null +++ b/src/block/BuddingAmethyst.php @@ -0,0 +1,67 @@ +getSide($face); + //TODO: amethyst buds can spawn in water - we need waterlogging support for this + + $newStage = null; + + if($adjacent->getTypeId() === BlockTypeIds::AIR){ + $newStage = AmethystCluster::STAGE_SMALL_BUD; + }elseif( + $adjacent->getTypeId() === BlockTypeIds::AMETHYST_CLUSTER && + $adjacent instanceof AmethystCluster && + $adjacent->getStage() < AmethystCluster::STAGE_CLUSTER && + $adjacent->getFacing() === $face + ){ + $newStage = $adjacent->getStage() + 1; + } + if($newStage !== null){ + BlockEventHelper::grow($adjacent, VanillaBlocks::AMETHYST_CLUSTER()->setStage($newStage)->setFacing($face), null); + } + } + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 9008d77d07..2f1bfe2655 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -54,6 +54,7 @@ use pocketmine\block\tile\NormalFurnace as TileNormalFurnace; use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\tile\Smoker as TileSmoker; +use pocketmine\block\utils\AmethystTrait; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; @@ -96,6 +97,7 @@ use function strtolower; * @method static Flower ALLIUM() * @method static MushroomStem ALL_SIDED_MUSHROOM_STEM() * @method static Opaque AMETHYST() + * @method static AmethystCluster AMETHYST_CLUSTER() * @method static Opaque ANCIENT_DEBRIS() * @method static Opaque ANDESITE() * @method static Slab ANDESITE_SLAB() @@ -149,6 +151,7 @@ use function strtolower; * @method static Wall BRICK_WALL() * @method static BrownMushroom BROWN_MUSHROOM() * @method static BrownMushroomBlock BROWN_MUSHROOM_BLOCK() + * @method static BuddingAmethyst BUDDING_AMETHYST() * @method static Cactus CACTUS() * @method static Cake CAKE() * @method static CakeWithCandle CAKE_WITH_CANDLE() @@ -1546,12 +1549,12 @@ final class VanillaBlocks{ private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock - self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD))) extends Opaque{ - public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ - $this->position->getWorld()->addSound($this->position, new AmethystBlockChimeSound()); - $this->position->getWorld()->addSound($this->position, new BlockPunchSound($this)); - } + $amethystInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD)); + self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", $amethystInfo) extends Opaque{ + use AmethystTrait; }); + self::register("budding_amethyst", new BuddingAmethyst(new BID(Ids::BUDDING_AMETHYST), "Budding Amethyst", $amethystInfo)); + self::register("amethyst_cluster", new AmethystCluster(new BID(Ids::AMETHYST_CLUSTER), "Amethyst Cluster", $amethystInfo)); self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD)))); self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)))); diff --git a/src/block/utils/AmethystTrait.php b/src/block/utils/AmethystTrait.php new file mode 100644 index 0000000000..e581d3517d --- /dev/null +++ b/src/block/utils/AmethystTrait.php @@ -0,0 +1,40 @@ +position->getWorld()->addSound($this->position, new AmethystBlockChimeSound()); + $this->position->getWorld()->addSound($this->position, new BlockPunchSound($this)); + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 6596e90db0..086d055d05 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\ActivatorRail; +use pocketmine\block\AmethystCluster; use pocketmine\block\Anvil; use pocketmine\block\Bamboo; use pocketmine\block\BambooSapling; @@ -718,6 +719,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::BOOKSHELF(), Ids::BOOKSHELF); $this->mapSimple(Blocks::BRICKS(), Ids::BRICK_BLOCK); $this->mapSimple(Blocks::BROWN_MUSHROOM(), Ids::BROWN_MUSHROOM); + $this->mapSimple(Blocks::BUDDING_AMETHYST(), Ids::BUDDING_AMETHYST); $this->mapSimple(Blocks::CALCITE(), Ids::CALCITE); $this->mapSimple(Blocks::CARTOGRAPHY_TABLE(), Ids::CARTOGRAPHY_TABLE); $this->mapSimple(Blocks::CHEMICAL_HEAT(), Ids::CHEMICAL_HEAT); @@ -968,6 +970,16 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); + $this->map(Blocks::AMETHYST_CLUSTER(), fn(AmethystCluster $block) => Writer::create( + match($stage = $block->getStage()){ + AmethystCluster::STAGE_SMALL_BUD => Ids::SMALL_AMETHYST_BUD, + AmethystCluster::STAGE_MEDIUM_BUD => Ids::MEDIUM_AMETHYST_BUD, + AmethystCluster::STAGE_LARGE_BUD => Ids::LARGE_AMETHYST_BUD, + AmethystCluster::STAGE_CLUSTER => Ids::AMETHYST_CLUSTER, + default => throw new BlockStateSerializeException("Invalid Amethyst Cluster stage $stage"), + }) + ->writeBlockFace($block->getFacing()) + ); $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index ebfe1c50ed..6bb0c8bf81 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -135,6 +135,19 @@ final class BlockStateReader{ ]); } + /** @throws BlockStateDeserializeException */ + public function readBlockFace() : int{ + return match($raw = $this->readString(BlockStateNames::MC_BLOCK_FACE)){ + StringValues::MC_BLOCK_FACE_DOWN => Facing::DOWN, + StringValues::MC_BLOCK_FACE_UP => Facing::UP, + StringValues::MC_BLOCK_FACE_NORTH => Facing::NORTH, + StringValues::MC_BLOCK_FACE_SOUTH => Facing::SOUTH, + StringValues::MC_BLOCK_FACE_WEST => Facing::WEST, + StringValues::MC_BLOCK_FACE_EAST => Facing::EAST, + default => throw $this->badValueException(BlockStateNames::MC_BLOCK_FACE, $raw) + }; + } + /** * @return int[] * @phpstan-return array diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 5071f9e498..c01d06eb80 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; +use pocketmine\block\AmethystCluster; use pocketmine\block\Bamboo; use pocketmine\block\Block; use pocketmine\block\CaveVines; @@ -611,6 +612,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF()); $this->mapSimple(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS()); $this->mapSimple(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM()); + $this->mapSimple(Ids::BUDDING_AMETHYST, fn() => Blocks::BUDDING_AMETHYST()); $this->mapSimple(Ids::CALCITE, fn() => Blocks::CALCITE()); $this->mapSimple(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE()); $this->mapSimple(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT()); @@ -857,6 +859,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); + $this->map(Ids::AMETHYST_CLUSTER, function(Reader $in) : Block{ + return Blocks::AMETHYST_CLUSTER() + ->setStage(AmethystCluster::STAGE_CLUSTER) + ->setFacing($in->readBlockFace()); + }); $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); $this->map(Ids::ANVIL, function(Reader $in) : Block{ return Blocks::ANVIL() @@ -1163,6 +1170,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LANTERN() ->setHanging($in->readBool(StateNames::HANGING)); }); + $this->map(Ids::LARGE_AMETHYST_BUD, function(Reader $in) : Block{ + return Blocks::AMETHYST_CLUSTER() + ->setStage(AmethystCluster::STAGE_LARGE_BUD) + ->setFacing($in->readBlockFace()); + }); $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in)); $this->map(Ids::LECTERN, function(Reader $in) : Block{ return Blocks::LECTERN() @@ -1225,6 +1237,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); }); + $this->map(Ids::MEDIUM_AMETHYST_BUD, function(Reader $in) : Block{ + return Blocks::AMETHYST_CLUSTER() + ->setStage(AmethystCluster::STAGE_MEDIUM_BUD) + ->setFacing($in->readBlockFace()); + }); $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); $this->map(Ids::MONSTER_EGG, function(Reader $in) : Block{ return match($type = $in->readString(StateNames::MONSTER_EGG_STONE_TYPE)){ @@ -1439,6 +1456,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readCardinalHorizontalFacing()) ->setLit(false); }); + $this->map(Ids::SMALL_AMETHYST_BUD, function(Reader $in) : Block{ + return Blocks::AMETHYST_CLUSTER() + ->setStage(AmethystCluster::STAGE_SMALL_BUD) + ->setFacing($in->readBlockFace()); + }); $this->map(Ids::SMALL_DRIPLEAF_BLOCK, function(Reader $in) : Block{ return Blocks::SMALL_DRIPLEAF() ->setFacing($in->readCardinalHorizontalFacing()) diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index f7884a7f04..f5f34fff65 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -90,6 +90,20 @@ final class BlockStateWriter{ return $this; } + /** @return $this */ + public function writeBlockFace(int $value) : self{ + $this->writeString(BlockStateNames::MC_BLOCK_FACE, match($value){ + Facing::DOWN => StringValues::MC_BLOCK_FACE_DOWN, + Facing::UP => StringValues::MC_BLOCK_FACE_UP, + Facing::NORTH => StringValues::MC_BLOCK_FACE_NORTH, + Facing::SOUTH => StringValues::MC_BLOCK_FACE_SOUTH, + Facing::WEST => StringValues::MC_BLOCK_FACE_WEST, + Facing::EAST => StringValues::MC_BLOCK_FACE_EAST, + default => throw new BlockStateSerializeException("Invalid Facing $value") + }); + return $this; + } + /** * @param int[] $faces * @phpstan-param array $faces diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 31796570ae..3ab97c3147 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\block\AmethystCluster; use pocketmine\block\Block; use pocketmine\block\Light; use pocketmine\block\utils\CopperOxidation; @@ -134,6 +135,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("all_sided_mushroom_stem", fn() => Blocks::ALL_SIDED_MUSHROOM_STEM()); $result->registerBlock("allium", fn() => Blocks::ALLIUM()); $result->registerBlock("amethyst_block", fn() => Blocks::AMETHYST()); + $result->registerBlock("amethyst_cluster", fn() => Blocks::AMETHYST_CLUSTER()); $result->registerBlock("ancient_debris", fn() => Blocks::ANCIENT_DEBRIS()); $result->registerBlock("andesite", fn() => Blocks::ANDESITE()); $result->registerBlock("andesite_slab", fn() => Blocks::ANDESITE_SLAB()); @@ -196,6 +198,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("bricks_block", fn() => Blocks::BRICKS()); $result->registerBlock("brown_mushroom", fn() => Blocks::BROWN_MUSHROOM()); $result->registerBlock("brown_mushroom_block", fn() => Blocks::BROWN_MUSHROOM_BLOCK()); + $result->registerBlock("budding_amethyst", fn() => Blocks::BUDDING_AMETHYST()); $result->registerBlock("burning_furnace", fn() => Blocks::FURNACE()); $result->registerBlock("bush", fn() => Blocks::DEAD_BUSH()); $result->registerBlock("cactus", fn() => Blocks::CACTUS()); @@ -744,6 +747,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("lapis_lazuli_block", fn() => Blocks::LAPIS_LAZULI()); $result->registerBlock("lapis_lazuli_ore", fn() => Blocks::LAPIS_LAZULI_ORE()); $result->registerBlock("lapis_ore", fn() => Blocks::LAPIS_LAZULI_ORE()); + $result->registerBlock("large_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_LARGE_BUD)); $result->registerBlock("large_fern", fn() => Blocks::LARGE_FERN()); $result->registerBlock("lava", fn() => Blocks::LAVA()); $result->registerBlock("leave", fn() => Blocks::OAK_LEAVES()); @@ -786,6 +790,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("mangrove_trapdoor", fn() => Blocks::MANGROVE_TRAPDOOR()); $result->registerBlock("mangrove_wood", fn() => Blocks::MANGROVE_WOOD()->setStripped(false)); $result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER()); + $result->registerBlock("medium_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_MEDIUM_BUD)); $result->registerBlock("melon_block", fn() => Blocks::MELON()); $result->registerBlock("melon_stem", fn() => Blocks::MELON_STEM()); $result->registerBlock("mob_head", fn() => Blocks::MOB_HEAD()); @@ -976,6 +981,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB()); $result->registerBlock("slime", fn() => Blocks::SLIME()); $result->registerBlock("slime_block", fn() => Blocks::SLIME()); + $result->registerBlock("small_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_SMALL_BUD)); $result->registerBlock("small_dripleaf", fn() => Blocks::SMALL_DRIPLEAF()); $result->registerBlock("smoker", fn() => Blocks::SMOKER()); $result->registerBlock("smooth_basalt", fn() => Blocks::SMOOTH_BASALT()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 83dcb08338..1b093c4505 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From a6b030f2b3a5bf6256363839343b8af3c2593ab2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Sep 2023 17:07:02 +0100 Subject: [PATCH 1414/1858] =?UTF-8?q?Fix=20CS=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/BuddingAmethyst.php | 1 + src/block/VanillaBlocks.php | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/block/BuddingAmethyst.php b/src/block/BuddingAmethyst.php index 717c0b1a29..215a038f98 100644 --- a/src/block/BuddingAmethyst.php +++ b/src/block/BuddingAmethyst.php @@ -27,6 +27,7 @@ use pocketmine\block\utils\AmethystTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\item\Item; use pocketmine\math\Facing; +use function array_rand; use function mt_rand; final class BuddingAmethyst extends Opaque{ diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 2f1bfe2655..95bf7a4298 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -59,15 +59,11 @@ use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SaplingType; use pocketmine\block\utils\WoodType; use pocketmine\crafting\FurnaceType; -use pocketmine\entity\projectile\Projectile; use pocketmine\item\enchantment\ItemEnchantmentTags as EnchantmentTags; use pocketmine\item\Item; use pocketmine\item\ToolTier; use pocketmine\math\Facing; -use pocketmine\math\RayTraceResult; use pocketmine\utils\CloningRegistryTrait; -use pocketmine\world\sound\AmethystBlockChimeSound; -use pocketmine\world\sound\BlockPunchSound; use function mb_strtolower; use function strtolower; From ff89d4d0556b9096c6a335457275991b37ed687c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 28 Sep 2023 14:55:55 +0100 Subject: [PATCH 1415/1858] Updated composer dependencies --- composer.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/composer.lock b/composer.lock index 70bceb5ed7..ed1be07d06 100644 --- a/composer.lock +++ b/composer.lock @@ -148,16 +148,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "2.5.0+bedrock-1.20.30", + "version": "2.5.1+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9" + "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", - "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/8f9d96047a731c37b18b28c2bfcdfa2705bb303f", + "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f", "shasum": "" }, "type": "library", @@ -168,9 +168,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockData/tree/2.5.1+bedrock-1.20.30" }, - "time": "2023-09-20T16:34:21+00:00" + "time": "2023-09-27T11:40:15+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -2207,16 +2207,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", "shasum": "" }, "require": { @@ -2229,7 +2229,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.1-dev" } }, "autoload": { @@ -2253,7 +2253,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" }, "funding": [ { @@ -2261,7 +2261,7 @@ "type": "github" } ], - "time": "2023-08-31T09:55:53+00:00" + "time": "2023-09-28T11:50:59+00:00" }, { "name": "sebastian/diff", @@ -2396,16 +2396,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { @@ -2419,7 +2419,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -2462,7 +2462,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -2470,7 +2470,7 @@ "type": "github" } ], - "time": "2023-09-18T07:15:37+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", From d94391af57f7791ee793306d1c525a792dd88daa Mon Sep 17 00:00:00 2001 From: HimmelKreis4865 <51092444+HimmelKreis4865@users.noreply.github.com> Date: Thu, 28 Sep 2023 16:56:46 +0200 Subject: [PATCH 1416/1858] Implement Chiseled Bookshelf (#5827) --- src/block/BlockTypeIds.php | 3 +- src/block/ChiseledBookshelf.php | 133 ++++++++++++++++++ src/block/VanillaBlocks.php | 3 + src/block/tile/ChiseledBookshelf.php | 58 ++++++++ src/block/tile/TileFactory.php | 1 + src/block/utils/ChiseledBookshelfSlot.php | 53 +++++++ .../convert/BlockObjectToStateSerializer.php | 10 ++ .../BlockStateToObjectDeserializer.php | 13 ++ src/data/runtime/RuntimeDataDescriber.php | 7 + src/data/runtime/RuntimeDataReader.php | 15 ++ .../runtime/RuntimeDataSizeCalculator.php | 5 + src/data/runtime/RuntimeDataWriter.php | 11 ++ src/item/StringToItemParser.php | 1 + .../block_factory_consistency_check.json | 2 +- 14 files changed, 313 insertions(+), 2 deletions(-) create mode 100644 src/block/ChiseledBookshelf.php create mode 100644 src/block/tile/ChiseledBookshelf.php create mode 100644 src/block/utils/ChiseledBookshelfSlot.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index e6995b78ba..f694af279a 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -739,8 +739,9 @@ final class BlockTypeIds{ public const PINK_PETALS = 10709; public const CRIMSON_ROOTS = 10710; public const WARPED_ROOTS = 10711; + public const CHISELED_BOOKSHELF = 10712; - public const FIRST_UNUSED_BLOCK_ID = 10712; + public const FIRST_UNUSED_BLOCK_ID = 10713; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php new file mode 100644 index 0000000000..d62f262daa --- /dev/null +++ b/src/block/ChiseledBookshelf.php @@ -0,0 +1,133 @@ + + */ + private array $slots = []; + + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + $w->horizontalFacing($this->facing); + $w->chiseledBookshelfSlots($this->slots); + } + + /** + * Returns whether the given slot is displayed as occupied. + * This doesn't guarantee that there is or isn't a book in the bookshelf's inventory. + */ + public function hasSlot(ChiseledBookshelfSlot $slot) : bool{ + return isset($this->slots[spl_object_id($slot)]); + } + + /** + * Sets whether the given slot is displayed as occupied. + * + * This doesn't modify the bookshelf's inventory, so you can use this to make invisible + * books or display books that aren't actually in the bookshelf. + * + * To modify the contents of the bookshelf inventory, access the tile inventory. + * + * @return $this + */ + public function setSlot(ChiseledBookshelfSlot $slot, bool $occupied) : self{ + if($occupied){ + $this->slots[spl_object_id($slot)] = $slot; + }else{ + unset($this->slots[spl_object_id($slot)]); + } + return $this; + } + + /** + * Returns which slots of the bookshelf are displayed as occupied. + * As above, these values do not necessarily reflect the contents of the bookshelf inventory, + * although they usually will unless modified by plugins. + * + * @return ChiseledBookshelfSlot[] + * @phpstan-return array + */ + public function getSlots() : array{ + return $this->slots; + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($face !== $this->facing){ + return false; + } + + $slot = ChiseledBookshelfSlot::fromBlockFaceCoordinates( + Facing::axis($face) === Axis::X ? $clickVector->getZ() : $clickVector->getX(), + $clickVector->y + ); + $tile = $this->position->getWorld()->getTile($this->position); + if(!$tile instanceof TileChiseledBookshelf){ + return false; + } + + $inventory = $tile->getInventory(); + if(!$inventory->isSlotEmpty($slot->value)){ + $returnedItems[] = $inventory->getItem($slot->value); + $inventory->clear($slot->value); + $this->setSlot($slot, false); + }elseif($item instanceof WritableBookBase || $item instanceof Book || $item instanceof EnchantedBook){ + //TODO: type tags like blocks would be better for this + $inventory->setItem($slot->value, $item); + $this->setSlot($slot, true); + }else{ + return true; + } + + $this->position->getWorld()->setBlock($this->position, $this); + return true; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return []; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 95bf7a4298..4657b79b5f 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -38,6 +38,7 @@ use pocketmine\block\tile\BlastFurnace as TileBlastFurnace; use pocketmine\block\tile\BrewingStand as TileBrewingStand; use pocketmine\block\tile\Cauldron as TileCauldron; use pocketmine\block\tile\Chest as TileChest; +use pocketmine\block\tile\ChiseledBookshelf as TileChiseledBookshelf; use pocketmine\block\tile\Comparator as TileComparator; use pocketmine\block\tile\DaylightSensor as TileDaylightSensor; use pocketmine\block\tile\EnchantTable as TileEnchantingTable; @@ -177,6 +178,7 @@ use function strtolower; * @method static WallSign CHERRY_WALL_SIGN() * @method static Wood CHERRY_WOOD() * @method static Chest CHEST() + * @method static ChiseledBookshelf CHISELED_BOOKSHELF() * @method static Opaque CHISELED_DEEPSLATE() * @method static Opaque CHISELED_NETHER_BRICKS() * @method static Opaque CHISELED_POLISHED_BLACKSTONE() @@ -809,6 +811,7 @@ final class VanillaBlocks{ self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new Info(BreakInfo::pickaxe(2.8)))); self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD)))); self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new Info(BreakInfo::axe(1.5)))); + self::register("chiseled_bookshelf", new ChiseledBookshelf(new BID(Ids::CHISELED_BOOKSHELF, TileChiseledBookshelf::class), "Chiseled Bookshelf", new Info(BreakInfo::axe(1.5)))); self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); $bricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); diff --git a/src/block/tile/ChiseledBookshelf.php b/src/block/tile/ChiseledBookshelf.php new file mode 100644 index 0000000000..adfdae814b --- /dev/null +++ b/src/block/tile/ChiseledBookshelf.php @@ -0,0 +1,58 @@ +inventory = new SimpleInventory(count(ChiseledBookshelfSlot::cases())); + } + + public function getInventory() : SimpleInventory{ + return $this->inventory; + } + + public function getRealInventory() : SimpleInventory{ + return $this->inventory; + } + + public function readSaveData(CompoundTag $nbt) : void{ + $this->loadItems($nbt); + } + + public function writeSaveData(CompoundTag $nbt) : void{ + $this->saveItems($nbt); + } +} diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index b3abb1315a..6e87b72acb 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -59,6 +59,7 @@ final class TileFactory{ $this->register(BrewingStand::class, ["BrewingStand", "minecraft:brewing_stand"]); $this->register(Cauldron::class, ["Cauldron", "minecraft:cauldron"]); $this->register(Chest::class, ["Chest", "minecraft:chest"]); + $this->register(ChiseledBookshelf::class, ["ChiseledBookshelf", "minecraft:chiseled_bookshelf"]); $this->register(Comparator::class, ["Comparator", "minecraft:comparator"]); $this->register(DaylightSensor::class, ["DaylightDetector", "minecraft:daylight_detector"]); $this->register(EnchantTable::class, ["EnchantTable", "minecraft:enchanting_table"]); diff --git a/src/block/utils/ChiseledBookshelfSlot.php b/src/block/utils/ChiseledBookshelfSlot.php new file mode 100644 index 0000000000..b5a676bed2 --- /dev/null +++ b/src/block/utils/ChiseledBookshelfSlot.php @@ -0,0 +1,53 @@ + 1){ + throw new \InvalidArgumentException("X must be between 0 and 1, got $x"); + } + if($y < 0 || $y > 1){ + throw new \InvalidArgumentException("Y must be between 0 and 1, got $y"); + } + + $slot = ($y < 0.5 ? self::SLOTS_PER_SHELF : 0) + match(true){ + //we can't use simple maths here as the action is aligned to the 16x16 pixel grid :( + $x < 6 / 16 => 0, + $x < 11 / 16 => 1, + default => 2 + }; + + return self::from($slot); + } +} diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 086d055d05..54e77d2ebe 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -51,6 +51,7 @@ use pocketmine\block\CaveVines; use pocketmine\block\Chain; use pocketmine\block\ChemistryTable; use pocketmine\block\Chest; +use pocketmine\block\ChiseledBookshelf; use pocketmine\block\ChorusFlower; use pocketmine\block\CocoaBlock; use pocketmine\block\Concrete; @@ -1115,6 +1116,15 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CHEST) ->writeHorizontalFacing($block->getFacing()); }); + $this->map(Blocks::CHISELED_BOOKSHELF(), function(ChiseledBookshelf $block) : Writer{ + $flags = 0; + foreach($block->getSlots() as $slot){ + $flags |= 1 << $slot->value; + } + return Writer::create(Ids::CHISELED_BOOKSHELF) + ->writeLegacyHorizontalFacing($block->getFacing()) + ->writeInt(StateNames::BOOKS_STORED, $flags); + }); $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index c01d06eb80..3198a60d43 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -34,6 +34,7 @@ use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\DirtType; @@ -992,6 +993,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CHAIN() ->setAxis($in->readPillarAxis()); }); + $this->map(Ids::CHISELED_BOOKSHELF, function(Reader $in) : Block{ + $block = Blocks::CHISELED_BOOKSHELF() + ->setFacing($in->readLegacyHorizontalFacing()); + + //we don't use API constant for bounds here as the data bounds might be different to what we support internally + $flags = $in->readBoundedInt(StateNames::BOOKS_STORED, 0, (1 << 6) - 1); + foreach(ChiseledBookshelfSlot::cases() as $slot){ + $block->setSlot($slot, ($flags & (1 << $slot->value)) !== 0); + } + + return $block; + }); $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 2d8c52ec29..f2828c217c 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Facing; @@ -78,6 +79,12 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function straightOnlyRailShape(int &$railShape) : void; + /** + * @param ChiseledBookshelfSlot[] $slots + * @phpstan-param array $slots + */ + public function chiseledBookshelfSlots(array &$slots) : void; + /** * @phpstan-template T of \UnitEnum * @phpstan-param T $case diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 9b64450733..a3bd0863c3 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; @@ -211,6 +212,20 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $railShape = $result; } + /** + * @param ChiseledBookshelfSlot[] $slots + * @phpstan-param array $slots + */ + public function chiseledBookshelfSlots(array &$slots) : void{ + $result = []; + foreach(ChiseledBookshelfSlot::cases() as $member){ + if($this->readBool()){ + $result[spl_object_id($member)] = $member; + } + } + $slots = $result; + } + public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $raw = $this->readInt($metadata->bits); diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 82e3602135..da9d1a9560 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\math\Facing; use function count; @@ -96,6 +97,10 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ $this->addBits(3); } + public function chiseledBookshelfSlots(array &$slots) : void{ + $this->addBits(count(ChiseledBookshelfSlot::cases())); + } + public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $this->addBits($metadata->bits); diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index 9e78875ea0..184c52a0ae 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -174,6 +175,16 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ $this->int(3, $railShape); } + /** + * @param ChiseledBookshelfSlot[] $slots + * @phpstan-param array $slots + */ + public function chiseledBookshelfSlots(array &$slots) : void{ + foreach(ChiseledBookshelfSlot::cases() as $member){ + $this->writeBool(isset($slots[spl_object_id($member)])); + } + } + public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $this->writeInt($metadata->bits, $metadata->enumToInt($case)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 3ab97c3147..ca8e9180f4 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -230,6 +230,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR()); $result->registerBlock("chest", fn() => Blocks::CHEST()); $result->registerBlock("chipped_anvil", fn() => Blocks::ANVIL()->setDamage(1)); + $result->registerBlock("chiseled_bookshelf", fn() => Blocks::CHISELED_BOOKSHELF()); $result->registerBlock("chiseled_deepslate", fn() => Blocks::CHISELED_DEEPSLATE()); $result->registerBlock("chiseled_nether_bricks", fn() => Blocks::CHISELED_NETHER_BRICKS()); $result->registerBlock("chiseled_polished_blackstone", fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 1b093c4505..a93536482e 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From 4b9d170954cda865e82e14cc22a6be2e75225a3c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 28 Sep 2023 16:06:17 +0100 Subject: [PATCH 1417/1858] RuntimeDataDescriber: added dynamic method for reading and writing enum sets this was previously only needed for brewing stands, but it's now become needed for chiselled bookshelves too. --- src/block/BrewingStand.php | 2 +- src/block/ChiseledBookshelf.php | 2 +- src/data/runtime/RuntimeDataDescriber.php | 18 ++++++---- src/data/runtime/RuntimeDataReader.php | 35 +++++++------------ .../runtime/RuntimeDataSizeCalculator.php | 8 ++--- src/data/runtime/RuntimeDataWriter.php | 22 +++++------- 6 files changed, 40 insertions(+), 47 deletions(-) diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index c59ea352bb..0396931649 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -45,7 +45,7 @@ class BrewingStand extends Transparent{ protected array $slots = []; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->brewingStandSlots($this->slots); + $w->enumSet($this->slots, BrewingStandSlot::cases()); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php index d62f262daa..ab1b4ddb34 100644 --- a/src/block/ChiseledBookshelf.php +++ b/src/block/ChiseledBookshelf.php @@ -50,7 +50,7 @@ class ChiseledBookshelf extends Opaque{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); - $w->chiseledBookshelfSlots($this->slots); + $w->enumSet($this->slots, ChiseledBookshelfSlot::cases()); } /** diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index f2828c217c..af2e797840 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -72,6 +72,8 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ /** * @param BrewingStandSlot[] $slots * @phpstan-param array $slots + * + * @deprecated Use {@link enumSet()} instead. */ public function brewingStandSlots(array &$slots) : void; @@ -79,15 +81,19 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function straightOnlyRailShape(int &$railShape) : void; - /** - * @param ChiseledBookshelfSlot[] $slots - * @phpstan-param array $slots - */ - public function chiseledBookshelfSlots(array &$slots) : void; - /** * @phpstan-template T of \UnitEnum * @phpstan-param T $case */ public function enum(\UnitEnum &$case) : void; + + /** + * @param \UnitEnum[] &$set + * @param \UnitEnum[] $allCases + * + * @phpstan-template T of \UnitEnum + * @phpstan-param array &$set + * @phpstan-param array $allCases + */ + public function enumSet(array &$set, array $allCases) : void; } diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index a3bd0863c3..039493fe39 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -182,16 +182,11 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ /** * @param BrewingStandSlot[] $slots * @phpstan-param array $slots + * + * @deprecated Use {@link enumSet()} instead. */ public function brewingStandSlots(array &$slots) : void{ - $result = []; - foreach(BrewingStandSlot::cases() as $member){ - if($this->readBool()){ - $result[spl_object_id($member)] = $member; - } - } - - $slots = $result; + $this->enumSet($slots, BrewingStandSlot::cases()); } public function railShape(int &$railShape) : void{ @@ -212,20 +207,6 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $railShape = $result; } - /** - * @param ChiseledBookshelfSlot[] $slots - * @phpstan-param array $slots - */ - public function chiseledBookshelfSlots(array &$slots) : void{ - $result = []; - foreach(ChiseledBookshelfSlot::cases() as $member){ - if($this->readBool()){ - $result[spl_object_id($member)] = $member; - } - } - $slots = $result; - } - public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $raw = $this->readInt($metadata->bits); @@ -237,5 +218,15 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $case = $result; } + public function enumSet(array &$set, array $allCases) : void{ + $result = []; + foreach($allCases as $case){ + if($this->readBool()){ + $result[spl_object_id($case)] = $case; + } + } + $set = $result; + } + public function getOffset() : int{ return $this->offset; } } diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index da9d1a9560..ecf075a458 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -97,12 +97,12 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ $this->addBits(3); } - public function chiseledBookshelfSlots(array &$slots) : void{ - $this->addBits(count(ChiseledBookshelfSlot::cases())); - } - public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $this->addBits($metadata->bits); } + + public function enumSet(array &$set, array $allCases) : void{ + $this->addBits(count($allCases)); + } } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index 184c52a0ae..b6995806f4 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -160,11 +160,11 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ /** * @param BrewingStandSlot[] $slots * @phpstan-param array $slots + * + * @deprecated Use {@link enumSet()} instead. */ public function brewingStandSlots(array &$slots) : void{ - foreach(BrewingStandSlot::cases() as $member){ - $this->writeBool(isset($slots[spl_object_id($member)])); - } + $this->enumSet($slots, BrewingStandSlot::cases()); } public function railShape(int &$railShape) : void{ @@ -175,21 +175,17 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ $this->int(3, $railShape); } - /** - * @param ChiseledBookshelfSlot[] $slots - * @phpstan-param array $slots - */ - public function chiseledBookshelfSlots(array &$slots) : void{ - foreach(ChiseledBookshelfSlot::cases() as $member){ - $this->writeBool(isset($slots[spl_object_id($member)])); - } - } - public function enum(\UnitEnum &$case) : void{ $metadata = RuntimeEnumMetadata::from($case); $this->writeInt($metadata->bits, $metadata->enumToInt($case)); } + public function enumSet(array &$set, array $allCases) : void{ + foreach($allCases as $case){ + $this->writeBool(isset($set[spl_object_id($case)])); + } + } + public function getValue() : int{ return $this->value; } public function getOffset() : int{ return $this->offset; } From 78cc5ba6358d84780aa57f10e22ada367c920c3e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 28 Sep 2023 16:06:38 +0100 Subject: [PATCH 1418/1858] CS again --- src/data/runtime/RuntimeDataDescriber.php | 1 - src/data/runtime/RuntimeDataReader.php | 1 - src/data/runtime/RuntimeDataSizeCalculator.php | 1 - src/data/runtime/RuntimeDataWriter.php | 1 - 4 files changed, 4 deletions(-) diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index af2e797840..8eba38a1de 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; -use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Facing; diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 039493fe39..e4ccc892d4 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; -use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index ecf075a458..28ddaa673b 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; -use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\math\Facing; use function count; diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index b6995806f4..5224b34177 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; -use pocketmine\block\utils\ChiseledBookshelfSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; From 31cd096b4b10f6ce7391a6e23cadf0e7913864b0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 28 Sep 2023 17:13:33 +0100 Subject: [PATCH 1419/1858] Implement torchflower, its seeds and its crop --- src/block/BlockTypeIds.php | 4 +- src/block/TorchflowerCrop.php | 90 +++++++++++++++++++ src/block/VanillaBlocks.php | 4 + .../convert/BlockObjectToStateSerializer.php | 6 ++ .../BlockStateToObjectDeserializer.php | 6 ++ .../ItemSerializerDeserializerRegistrar.php | 1 + src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 2 + src/item/TorchflowerSeeds.php | 34 +++++++ src/item/VanillaItems.php | 2 + .../block_factory_consistency_check.json | 2 +- 11 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/block/TorchflowerCrop.php create mode 100644 src/item/TorchflowerSeeds.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index f694af279a..df9868a343 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -740,8 +740,10 @@ final class BlockTypeIds{ public const CRIMSON_ROOTS = 10710; public const WARPED_ROOTS = 10711; public const CHISELED_BOOKSHELF = 10712; + public const TORCHFLOWER = 10713; + public const TORCHFLOWER_CROP = 10714; - public const FIRST_UNUSED_BLOCK_ID = 10713; + public const FIRST_UNUSED_BLOCK_ID = 10715; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/TorchflowerCrop.php b/src/block/TorchflowerCrop.php new file mode 100644 index 0000000000..75efe142b2 --- /dev/null +++ b/src/block/TorchflowerCrop.php @@ -0,0 +1,90 @@ +bool($this->ready); + } + + public function isReady() : bool{ return $this->ready; } + + public function setReady(bool $ready) : self{ + $this->ready = $ready; + return $this; + } + + private function canBeSupportedAt(Block $block) : bool{ + return $block->getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND; + } + + private function getNextState() : Block{ + if($this->ready){ + return VanillaBlocks::TORCHFLOWER(); + }else{ + return VanillaBlocks::TORCHFLOWER_CROP()->setReady(true); + } + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer){ + if(BlockEventHelper::grow($this, $this->getNextState(), $player)){ + $item->pop(); + } + + return true; + } + + return false; + } + + public function ticksRandomly() : bool{ + return true; + } + + public function onRandomTick() : void{ + if(mt_rand(0, 2) === 1){ + BlockEventHelper::grow($this, $this->getNextState(), null); + } + } + + public function asItem() : Item{ + return VanillaItems::TORCHFLOWER_SEEDS(); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 4657b79b5f..43d72ccf0b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -726,6 +726,8 @@ use function strtolower; * @method static TintedGlass TINTED_GLASS() * @method static TNT TNT() * @method static Torch TORCH() + * @method static Flower TORCHFLOWER() + * @method static TorchflowerCrop TORCHFLOWER_CROP() * @method static TrappedChest TRAPPED_CHEST() * @method static Tripwire TRIPWIRE() * @method static TripwireHook TRIPWIRE_HOOK() @@ -879,6 +881,8 @@ final class VanillaBlocks{ self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", $flowerTypeInfo)); self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", $flowerTypeInfo)); self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); + self::register("torchflower", new Flower(new BID(Ids::TORCHFLOWER), "Torchflower", $flowerTypeInfo)); + self::register("torchflower_crop", new TorchflowerCrop(new BID(Ids::TORCHFLOWER_CROP), "Torchflower Crop", new Info(BreakInfo::instant()))); self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::FURNACE)); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 54e77d2ebe..fb0003363a 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -136,6 +136,7 @@ use pocketmine\block\Sugarcane; use pocketmine\block\SweetBerryBush; use pocketmine\block\TNT; use pocketmine\block\Torch; +use pocketmine\block\TorchflowerCrop; use pocketmine\block\Trapdoor; use pocketmine\block\TrappedChest; use pocketmine\block\Tripwire; @@ -955,6 +956,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); $this->mapSimple(Blocks::SPORE_BLOSSOM(), Ids::SPORE_BLOSSOM); $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); + $this->mapSimple(Blocks::TORCHFLOWER(), Ids::TORCHFLOWER); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); $this->mapSimple(Blocks::WARPED_ROOTS(), Ids::WARPED_ROOTS); @@ -1643,6 +1645,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::TORCH) ->writeTorchFacing($block->getFacing()); }); + $this->map(Blocks::TORCHFLOWER_CROP(), function(TorchflowerCrop $block){ + return Writer::create(Ids::TORCHFLOWER_CROP) + ->writeInt(StateNames::GROWTH, $block->isReady() ? 1 : 0); + }); $this->map(Blocks::TRAPPED_CHEST(), function(TrappedChest $block) : Writer{ return Writer::create(Ids::TRAPPED_CHEST) ->writeHorizontalFacing($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 3198a60d43..be466de3fe 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -844,6 +844,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); + $this->mapSimple(Ids::TORCHFLOWER, fn() => Blocks::TORCHFLOWER()); $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF()); $this->mapSimple(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); $this->mapSimple(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); @@ -1565,6 +1566,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::TORCH() ->setFacing($in->readTorchFacing()); }); + $this->map(Ids::TORCHFLOWER_CROP, function(Reader $in) : Block{ + return Blocks::TORCHFLOWER_CROP() + //this property can have values 0-7, but only 0-1 are valid + ->setReady($in->readBoundedInt(StateNames::GROWTH, 0, 7) !== 0); + }); $this->map(Ids::TRAPPED_CHEST, function(Reader $in) : Block{ return Blocks::TRAPPED_CHEST() ->setFacing($in->readHorizontalFacing()); diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index dd506526d6..be628d071c 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -359,6 +359,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::STRING, Items::STRING()); $this->map1to1Item(Ids::SUGAR, Items::SUGAR()); $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES()); + $this->map1to1Item(Ids::TORCHFLOWER_SEEDS, Items::TORCHFLOWER_SEEDS()); $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM()); $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH()); $this->map1to1Item(Ids::TURTLE_HELMET, Items::TURTLE_HELMET()); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 8233397666..4c2f0a1ec3 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -304,8 +304,9 @@ final class ItemTypeIds{ public const GLOW_BERRIES = 20265; public const CHERRY_SIGN = 20266; public const ENCHANTED_BOOK = 20267; + public const TORCHFLOWER_SEEDS = 20268; - public const FIRST_UNUSED_ITEM_ID = 20268; + public const FIRST_UNUSED_ITEM_ID = 20269; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index ca8e9180f4..2e05ddc6ef 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1082,6 +1082,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("tinted_glass", fn() => Blocks::TINTED_GLASS()); $result->registerBlock("tnt", fn() => Blocks::TNT()); $result->registerBlock("torch", fn() => Blocks::TORCH()); + $result->registerBlock("torchflower", fn() => Blocks::TORCHFLOWER()); $result->registerBlock("trapdoor", fn() => Blocks::OAK_TRAPDOOR()); $result->registerBlock("trapped_chest", fn() => Blocks::TRAPPED_CHEST()); $result->registerBlock("trip_wire", fn() => Blocks::TRIPWIRE()); @@ -1467,6 +1468,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("suspicious_stew", fn() => Items::SUSPICIOUS_STEW()); $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC)); + $result->register("torchflower_seeds", fn() => Items::TORCHFLOWER_SEEDS()); $result->register("totem", fn() => Items::TOTEM()); $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); diff --git a/src/item/TorchflowerSeeds.php b/src/item/TorchflowerSeeds.php new file mode 100644 index 0000000000..123af35a09 --- /dev/null +++ b/src/item/TorchflowerSeeds.php @@ -0,0 +1,34 @@ + Date: Fri, 29 Sep 2023 12:05:39 +0100 Subject: [PATCH 1420/1858] AgeableTrait: fixed incorrect number of bits the original method breaks if MAX_AGE is 0 or any power of 2. --- src/block/utils/AgeableTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/utils/AgeableTrait.php b/src/block/utils/AgeableTrait.php index 6ef1ce826e..90e0e2bcb0 100644 --- a/src/block/utils/AgeableTrait.php +++ b/src/block/utils/AgeableTrait.php @@ -35,7 +35,7 @@ trait AgeableTrait{ protected int $age = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt((int) ceil(log(self::MAX_AGE, 2)), 0, self::MAX_AGE, $this->age); + $w->boundedInt(((int) log(self::MAX_AGE, 2)) + 1, 0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } From 628d77f8d7bb996b9c541bc5e83e32ea2b97cd7b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:30:52 +0100 Subject: [PATCH 1421/1858] =?UTF-8?q?Implemented=20pitcher=20plants,=20cro?= =?UTF-8?q?ps=20and=20pods=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/BlockTypeIds.php | 5 +- src/block/DoublePitcherCrop.php | 110 ++++++++++++++++++ src/block/PitcherCrop.php | 105 +++++++++++++++++ src/block/VanillaBlocks.php | 6 + .../convert/BlockObjectToStateSerializer.php | 16 +++ .../BlockStateToObjectDeserializer.php | 18 +++ .../ItemSerializerDeserializerRegistrar.php | 1 + 7 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 src/block/DoublePitcherCrop.php create mode 100644 src/block/PitcherCrop.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index df9868a343..dec31eff11 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -742,8 +742,11 @@ final class BlockTypeIds{ public const CHISELED_BOOKSHELF = 10712; public const TORCHFLOWER = 10713; public const TORCHFLOWER_CROP = 10714; + public const PITCHER_PLANT = 10715; + public const PITCHER_CROP = 10716; + public const DOUBLE_PITCHER_CROP = 10717; - public const FIRST_UNUSED_BLOCK_ID = 10715; + public const FIRST_UNUSED_BLOCK_ID = 10718; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/DoublePitcherCrop.php b/src/block/DoublePitcherCrop.php new file mode 100644 index 0000000000..06bcf5fb0a --- /dev/null +++ b/src/block/DoublePitcherCrop.php @@ -0,0 +1,110 @@ +describeAge($w); + } + + protected function recalculateCollisionBoxes() : array{ + if($this->top){ + return []; + } + + //the pod exists only in the bottom half of the plant + return [ + AxisAlignedBB::one() + ->trim(Facing::UP, 11 / 16) + ->squash(Axis::X, 3 / 16) + ->squash(Axis::Z, 3 / 16) + ->extend(Facing::DOWN, 1 / 16) //presumably this is to correct for farmland being 15/16 of a block tall + ]; + } + + private function grow(?Player $player) : bool{ + if($this->age >= self::MAX_AGE){ + return false; + } + + $bottom = $this->top ? $this->getSide(Facing::DOWN) : $this; + $top = $this->top ? $this : $this->getSide(Facing::UP); + if($top->getTypeId() !== BlockTypeIds::AIR && !$top->hasSameTypeId($this)){ + return false; + } + + $newState = (clone $this)->setAge($this->age + 1); + + $tx = new BlockTransaction($this->position->getWorld()); + $tx->addBlock($bottom->position, (clone $newState)->setTop(false)); + $tx->addBlock($top->position, (clone $newState)->setTop(true)); + + $ev = new StructureGrowEvent($bottom, $tx, $player); + $ev->call(); + + return !$ev->isCancelled() && $tx->apply(); + + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer && $this->grow($player)){ + $item->pop(); + return true; + } + + return false; + } + + public function ticksRandomly() : bool{ + return true; + } + + public function onRandomTick() : void{ + //TODO: the growth speed is influenced by farmland and nearby crops + //only the bottom half of the plant can grow randomly + if(mt_rand(0, 2) === 0 && !$this->top){ + $this->grow(null); + } + } +} diff --git a/src/block/PitcherCrop.php b/src/block/PitcherCrop.php new file mode 100644 index 0000000000..2d9a021620 --- /dev/null +++ b/src/block/PitcherCrop.php @@ -0,0 +1,105 @@ +getSide(Facing::DOWN)->getTypeId() === BlockTypeIds::FARMLAND; + } + + protected function recalculateCollisionBoxes() : array{ + $widthTrim = $this->age === 0 ? 5 : 3; + $heightTrim = $this->age === 0 ? 13 : 11; + return [ + AxisAlignedBB::one() + ->trim(Facing::UP, $heightTrim / 16) + ->squash(Axis::X, $widthTrim / 16) + ->squash(Axis::Z, $widthTrim / 16) + ->extend(Facing::DOWN, 1 / 16) //presumably this is to correct for farmland being 15/16 of a block tall + ]; + } + + private function grow(?Player $player) : bool{ + if($this->age > self::MAX_AGE){ + return false; + } + + if($this->age === self::MAX_AGE){ + $up = $this->getSide(Facing::UP); + if($up->getTypeId() !== BlockTypeIds::AIR){ + return false; + } + + $tx = new BlockTransaction($this->position->getWorld()); + $tx->addBlock($this->position, VanillaBlocks::DOUBLE_PITCHER_CROP()->setTop(false)); + $tx->addBlock($this->position->up(), VanillaBlocks::DOUBLE_PITCHER_CROP()->setTop(true)); + + $ev = new StructureGrowEvent($this, $tx, $player); + $ev->call(); + + return !$ev->isCancelled() && $tx->apply(); + } + + return BlockEventHelper::grow($this, (clone $this)->setAge($this->age + 1), $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($item instanceof Fertilizer && $this->grow($player)){ + $item->pop(); + return true; + } + + return false; + } + + public function ticksRandomly() : bool{ + return true; + } + + public function onRandomTick() : void{ + //TODO: the growth speed is influenced by farmland and nearby crops + if(mt_rand(0, 2) === 0){ + $this->grow(null); + } + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 43d72ccf0b..8349f70c06 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -284,6 +284,7 @@ use function strtolower; * @method static Stair DIORITE_STAIRS() * @method static Wall DIORITE_WALL() * @method static Dirt DIRT() + * @method static DoublePitcherCrop DOUBLE_PITCHER_CROP() * @method static DoubleTallGrass DOUBLE_TALLGRASS() * @method static DragonEgg DRAGON_EGG() * @method static DriedKelp DRIED_KELP() @@ -579,6 +580,8 @@ use function strtolower; * @method static DoublePlant PEONY() * @method static PinkPetals PINK_PETALS() * @method static Flower PINK_TULIP() + * @method static PitcherCrop PITCHER_CROP() + * @method static DoublePlant PITCHER_PLANT() * @method static Podzol PODZOL() * @method static Opaque POLISHED_ANDESITE() * @method static Slab POLISHED_ANDESITE_SLAB() @@ -852,6 +855,9 @@ final class VanillaBlocks{ self::register("pink_petals", new PinkPetals(new BID(Ids::PINK_PETALS), "Pink Petals", new Info(BreakInfo::instant()))); self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("pitcher_plant", new DoublePlant(new BID(Ids::PITCHER_PLANT), "Pitcher Plant", new Info(BreakInfo::instant()))); + self::register("pitcher_crop", new PitcherCrop(new BID(Ids::PITCHER_CROP), "Pitcher Crop", new Info(BreakInfo::instant()))); + self::register("double_pitcher_crop", new DoublePitcherCrop(new BID(Ids::DOUBLE_PITCHER_CROP), "Double Pitcher Crop", new Info(BreakInfo::instant()))); self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new Info(new BreakInfo(0.5, ToolType::NONE, 0, 12.5)))); self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index fb0003363a..ee15fb800a 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -65,6 +65,7 @@ use pocketmine\block\DaylightSensor; use pocketmine\block\DetectorRail; use pocketmine\block\Dirt; use pocketmine\block\Door; +use pocketmine\block\DoublePitcherCrop; use pocketmine\block\DoublePlant; use pocketmine\block\DoubleTallGrass; use pocketmine\block\DyedCandle; @@ -103,6 +104,7 @@ use pocketmine\block\NetherPortal; use pocketmine\block\NetherVines; use pocketmine\block\NetherWartPlant; use pocketmine\block\PinkPetals; +use pocketmine\block\PitcherCrop; use pocketmine\block\Potato; use pocketmine\block\PoweredRail; use pocketmine\block\PumpkinStem; @@ -1457,6 +1459,20 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::GROWTH, $block->getCount() - 1); }); $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); + $this->map(Blocks::PITCHER_PLANT(), function(DoublePlant $block) : Writer{ + return Writer::create(Ids::PITCHER_PLANT) + ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); + }); + $this->map(Blocks::PITCHER_CROP(), function(PitcherCrop $block) : Writer{ + return Writer::create(Ids::PITCHER_CROP) + ->writeInt(StateNames::GROWTH, $block->getAge()) + ->writeBool(StateNames::UPPER_BLOCK_BIT, false); + }); + $this->map(Blocks::DOUBLE_PITCHER_CROP(), function(DoublePitcherCrop $block) : Writer{ + return Writer::create(Ids::PITCHER_CROP) + ->writeInt(StateNames::GROWTH, $block->getAge() + 1 + PitcherCrop::MAX_AGE) + ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); + }); $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index be466de3fe..df19250d03 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -28,8 +28,10 @@ use pocketmine\block\Bamboo; use pocketmine\block\Block; use pocketmine\block\CaveVines; use pocketmine\block\ChorusFlower; +use pocketmine\block\DoublePitcherCrop; use pocketmine\block\Light; use pocketmine\block\PinkPetals; +use pocketmine\block\PitcherCrop; use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\SweetBerryBush; @@ -1296,6 +1298,22 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readCardinalHorizontalFacing()) ->setCount(min($growth + 1, PinkPetals::MAX_COUNT)); }); + $this->map(Ids::PITCHER_CROP, function(Reader $in) : Block{ + $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); + $top = $in->readBool(StateNames::UPPER_BLOCK_BIT); + if($growth <= PitcherCrop::MAX_AGE){ + //top pitcher crop with age 0-2 is an invalid state + //only the bottom half should exist in this case + return $top ? Blocks::AIR() : Blocks::PITCHER_CROP()->setAge($growth); + } + return Blocks::DOUBLE_PITCHER_CROP() + ->setAge(min($growth - PitcherCrop::MAX_AGE - 1, DoublePitcherCrop::MAX_AGE)) + ->setTop($top); + }); + $this->map(Ids::PITCHER_PLANT, function(Reader $in) : Block{ + return Blocks::PITCHER_PLANT() + ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); + }); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); $this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ return Blocks::POLISHED_BASALT() diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index be628d071c..6bb3a56b34 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -147,6 +147,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR()); $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR()); $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART()); + $this->map1to1Block(Ids::PITCHER_POD, Blocks::PITCHER_CROP()); $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER()); $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR()); $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE()); From eac056479249b1b2ed191a285b0d928cbd6edae0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:31:11 +0100 Subject: [PATCH 1422/1858] Fix CS --- src/block/utils/AgeableTrait.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/utils/AgeableTrait.php b/src/block/utils/AgeableTrait.php index 90e0e2bcb0..8e2793e817 100644 --- a/src/block/utils/AgeableTrait.php +++ b/src/block/utils/AgeableTrait.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\data\runtime\RuntimeDataDescriber; -use function ceil; use function log; /** From ca69f08da085bb47d6ad116d895aeb599bde3115 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:44:27 +0100 Subject: [PATCH 1423/1858] ChorusFlower: move ticksRandomly() to a more appropriate place --- src/block/ChorusFlower.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 03f34dd072..2dcf4bb701 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -83,8 +83,6 @@ final class ChorusFlower extends Flowable{ $this->position->getWorld()->useBreakOn($this->position); } - public function ticksRandomly() : bool{ return $this->age < self::MAX_AGE; } - /** * @phpstan-return array{int, bool} */ @@ -159,6 +157,8 @@ final class ChorusFlower extends Flowable{ return $tx; } + public function ticksRandomly() : bool{ return $this->age < self::MAX_AGE; } + public function onRandomTick() : void{ $world = $this->position->getWorld(); From 390cc3060a9183ceac9cea07a3c7801c8b9d68eb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:45:37 +0100 Subject: [PATCH 1424/1858] Disable random ticking for some blocks depending on their states we don't need to waste CPU time attempting to tick fully grown crops. --- src/block/CocoaBlock.php | 2 +- src/block/Crops.php | 2 +- src/block/DoublePitcherCrop.php | 2 +- src/block/Leaves.php | 2 +- src/block/NetherVines.php | 8 ++++---- src/block/NetherWartPlant.php | 2 +- src/block/RedstoneOre.php | 2 +- src/block/SweetBerryBush.php | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index a765142496..25c53b23aa 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -99,7 +99,7 @@ class CocoaBlock extends Transparent{ } public function ticksRandomly() : bool{ - return true; + return $this->age < self::MAX_AGE; } public function onRandomTick() : void{ diff --git a/src/block/Crops.php b/src/block/Crops.php index e47e63be81..350268863d 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -62,7 +62,7 @@ abstract class Crops extends Flowable{ } public function ticksRandomly() : bool{ - return true; + return $this->age < self::MAX_AGE; } public function onRandomTick() : void{ diff --git a/src/block/DoublePitcherCrop.php b/src/block/DoublePitcherCrop.php index 06bcf5fb0a..db700a625e 100644 --- a/src/block/DoublePitcherCrop.php +++ b/src/block/DoublePitcherCrop.php @@ -97,7 +97,7 @@ final class DoublePitcherCrop extends DoublePlant{ } public function ticksRandomly() : bool{ - return true; + return $this->age < self::MAX_AGE && !$this->top; } public function onRandomTick() : void{ diff --git a/src/block/Leaves.php b/src/block/Leaves.php index b28a3832e3..0aa3557a41 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -110,7 +110,7 @@ class Leaves extends Transparent{ } public function ticksRandomly() : bool{ - return true; + return !$this->noDecay && $this->checkDecay; } public function onRandomTick() : void{ diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index dba86d2595..3a03697400 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -59,10 +59,6 @@ class NetherVines extends Flowable{ return true; } - public function ticksRandomly() : bool{ - return true; - } - public function canClimb() : bool{ return true; } @@ -98,6 +94,10 @@ class NetherVines extends Flowable{ return false; } + public function ticksRandomly() : bool{ + return $this->age < self::MAX_AGE; + } + public function onRandomTick() : void{ if(mt_rand(1, 10) === 1 && $this->age < self::MAX_AGE){ if($this->getSide($this->growthFace)->canBeReplaced()){ diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 17aa9c4f8c..34e6fd57ec 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -42,7 +42,7 @@ class NetherWartPlant extends Flowable{ } public function ticksRandomly() : bool{ - return true; + return $this->age < self::MAX_AGE; } public function onRandomTick() : void{ diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 75f5063eef..9e537bd279 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -70,7 +70,7 @@ class RedstoneOre extends Opaque{ } public function ticksRandomly() : bool{ - return true; + return $this->lit; } public function onRandomTick() : void{ diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index c34df3de51..a0a26ef6e3 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -102,7 +102,7 @@ class SweetBerryBush extends Flowable{ } public function ticksRandomly() : bool{ - return true; + return $this->age < self::STAGE_MATURE; } public function onRandomTick() : void{ From 55cc5a66511049cacc6a164c2a9a97097c6686a4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:45:55 +0100 Subject: [PATCH 1425/1858] NetherVines: optimize condition order --- src/block/NetherVines.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index 3a03697400..eb459a0f1e 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -99,7 +99,7 @@ class NetherVines extends Flowable{ } public function onRandomTick() : void{ - if(mt_rand(1, 10) === 1 && $this->age < self::MAX_AGE){ + if($this->age < self::MAX_AGE && mt_rand(1, 10) === 1){ if($this->getSide($this->growthFace)->canBeReplaced()){ $this->grow(null); } From 006f78c0a7b4f820f14bc2d761b9f5ed9363415c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 29 Sep 2023 12:57:39 +0100 Subject: [PATCH 1426/1858] Updated block consistency check --- tests/phpunit/block/block_factory_consistency_check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 37193807f4..219736a676 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Torchflower":[2742745],"Torchflower Crop":[2743002,2743003],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Pitcher Crop":[2743772,2743773,2743774,2743775],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Pitcher Crop":[2743516,2743517,2743518],"Pitcher Plant":[2743258,2743259],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Torchflower":[2742745],"Torchflower Crop":[2743002,2743003],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file From ed4088755f88b1850a5bef8162d974cfdc453f39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 22:23:13 +0100 Subject: [PATCH 1427/1858] Bump phpstan/phpstan from 1.10.35 to 1.10.37 (#6073) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.35 to 1.10.37. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.35...1.10.37) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 22170ea28b..f9dbd49bf4 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.35", + "phpstan/phpstan": "1.10.37", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.1" diff --git a/composer.lock b/composer.lock index ed1be07d06..49762516c0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2028bfaf32594237de07fc60f68df728", + "content-hash": "bf893b5c8fb69fefd80ff276d15304df", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.35", + "version": "1.10.37", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" + "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/058ba07e92f744d4dcf6061ae75283d0c6456f2e", + "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T15:27:56+00:00" + "time": "2023-10-02T16:18:37+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 94a17f59d2fdc59ac4ebd38ad2561dfd82fbeb29 Mon Sep 17 00:00:00 2001 From: Doge Date: Sun, 8 Oct 2023 21:25:19 +0300 Subject: [PATCH 1428/1858] fix(Entity): `broadcastSound()` not firing `WorldSoundEvent` (#6069) --- src/entity/Entity.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 8a406924e6..7e4d7cbdef 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1686,7 +1686,7 @@ abstract class Entity{ */ public function broadcastSound(Sound $sound, ?array $targets = null) : void{ if(!$this->silent){ - NetworkBroadcastUtils::broadcastPackets($targets ?? $this->getViewers(), $sound->encode($this->location)); + $this->getWorld()->addSound($this->location->asVector3(), $sound, $targets ?? $this->getViewers()); } } From ee26d6d570a29797d57ea1dddcc5d7a7ff129a76 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Oct 2023 17:06:02 +0100 Subject: [PATCH 1429/1858] LightUpdate: avoid trying to propagate light into nodes with higher light levels Track which direction the current node's light came from, and don't check it again when we check the current node's adjacent blocks. e.g. if this node was the eastern neighbour of a light source, we don't need to check this node's western neighbour, as we already know it has a higher light level than our own. This improves performance of basic light spread in a void by about 6%, which isn't a huge amount, but it's something. I've yet to explore whether light removal could also benefit from this change. --- src/world/light/LightPropagationContext.php | 4 ++-- src/world/light/LightUpdate.php | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/world/light/LightPropagationContext.php b/src/world/light/LightPropagationContext.php index 637535344e..c3d45b3c63 100644 --- a/src/world/light/LightPropagationContext.php +++ b/src/world/light/LightPropagationContext.php @@ -28,8 +28,8 @@ final class LightPropagationContext{ /** @phpstan-var \SplQueue */ public \SplQueue $spreadQueue; /** - * @var true[] - * @phpstan-var array + * @var int[]|true[] + * @phpstan-var array */ public array $spreadVisited = []; diff --git a/src/world/light/LightUpdate.php b/src/world/light/LightUpdate.php index 58ac0a9dcb..b7455c6cc3 100644 --- a/src/world/light/LightUpdate.php +++ b/src/world/light/LightUpdate.php @@ -137,6 +137,7 @@ abstract class LightUpdate{ while(!$context->spreadQueue->isEmpty()){ $touched++; [$x, $y, $z] = $context->spreadQueue->dequeue(); + $from = $context->spreadVisited[World::blockHash($x, $y, $z)]; unset($context->spreadVisited[World::blockHash($x, $y, $z)]); @@ -155,7 +156,11 @@ abstract class LightUpdate{ continue; } - foreach(Facing::OFFSET as [$ox, $oy, $oz]){ + foreach(Facing::OFFSET as $side => [$ox, $oy, $oz]){ + if($from === $side){ + //don't check the side that this node received its initial light from + continue; + } $cx = $x + $ox; $cy = $y + $oy; $cz = $z + $oz; @@ -169,7 +174,7 @@ abstract class LightUpdate{ $lightArray = $this->getCurrentLightArray(); } assert($subChunk !== null); - $this->computeSpreadLight($cx, $cy, $cz, $newAdjacentLight, $context, $lightArray, $subChunk); + $this->computeSpreadLight($cx, $cy, $cz, $newAdjacentLight, $context, $lightArray, $subChunk, $side); } } @@ -199,7 +204,7 @@ abstract class LightUpdate{ } } - protected function computeSpreadLight(int $x, int $y, int $z, int $newAdjacentLevel, LightPropagationContext $context, LightArray $lightArray, SubChunk $subChunk) : void{ + protected function computeSpreadLight(int $x, int $y, int $z, int $newAdjacentLevel, LightPropagationContext $context, LightArray $lightArray, SubChunk $subChunk, int $side) : void{ $lx = $x & SubChunk::COORD_MASK; $ly = $y & SubChunk::COORD_MASK; $lz = $z & SubChunk::COORD_MASK; @@ -210,7 +215,11 @@ abstract class LightUpdate{ $lightArray->set($lx, $ly, $lz, $potentialLight); if(!isset($context->spreadVisited[$index = World::blockHash($x, $y, $z)]) && $potentialLight > 1){ - $context->spreadVisited[$index] = true; + //Track where this node was lit from, to avoid checking the source again when we propagate from here + //TODO: In the future it might be worth tracking more than one adjacent source face in case multiple + //nodes try to light the same node. However, this is a rare case since the vast majority of calls are + //basic propagation with only one source anyway. + $context->spreadVisited[$index] = Facing::opposite($side); $context->spreadQueue->enqueue([$x, $y, $z]); } } From 7e42a03db386331773994e02c541a72fff505e61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 17:15:50 +0100 Subject: [PATCH 1430/1858] Bump phpstan/phpstan from 1.10.37 to 1.10.38 (#6081) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.37 to 1.10.38. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.37...1.10.38) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index f9dbd49bf4..5d4e687c3d 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.37", + "phpstan/phpstan": "1.10.38", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.1" diff --git a/composer.lock b/composer.lock index 49762516c0..356347b955 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bf893b5c8fb69fefd80ff276d15304df", + "content-hash": "33bdb06a73fbfe9e9b61bced1476db45", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.37", + "version": "1.10.38", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e" + "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/058ba07e92f744d4dcf6061ae75283d0c6456f2e", - "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", + "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-10-02T16:18:37+00:00" + "time": "2023-10-06T14:19:14+00:00" }, { "name": "phpstan/phpstan-phpunit", From 9facb983277f9297b5f75126627d06f56b6375f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 17:16:15 +0100 Subject: [PATCH 1431/1858] Bump phpunit/phpunit from 10.3.5 to 10.4.1 (#6082) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.3.5 to 10.4.1. - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.4.1/ChangeLog-10.4.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.3.5...10.4.1) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index 356347b955..7b4f1b6d6c 100644 --- a/composer.lock +++ b/composer.lock @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.6", + "version": "10.1.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364" + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-09-19T04:59:03+00:00" + "time": "2023-10-04T15:34:17+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1862,16 +1862,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.5", + "version": "10.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/62bd7af13d282deeb95650077d28ba3600ca321c", + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c", "shasum": "" }, "require": { @@ -1911,7 +1911,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-main": "10.4-dev" } }, "autoload": { @@ -1943,7 +1943,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.1" }, "funding": [ { @@ -1959,7 +1959,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:42:37+00:00" + "time": "2023-10-08T05:01:11+00:00" }, { "name": "sebastian/cli-parser", From 660e2b817350eff22d559e4dff1aaf4dedf71718 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Oct 2023 18:22:28 +0100 Subject: [PATCH 1432/1858] Update build/php to pmmp/php-build-scripts@a34e48e7da753b633ffaa4a4f9516eae4bb97baa --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 3331f8c0d5..a34e48e7da 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 3331f8c0d50075eee250ac4b3a8517a12186137a +Subproject commit a34e48e7da753b633ffaa4a4f9516eae4bb97baa From 2d697c5f0415a94b79d1bb8b924672398b002c69 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Oct 2023 18:27:20 +0100 Subject: [PATCH 1433/1858] A random change that Composer 2.6 wanted to make --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 7b4f1b6d6c..24506fff6c 100644 --- a/composer.lock +++ b/composer.lock @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From c9163a1505fa071c8356c9df5dc3c98b73f7b3a4 Mon Sep 17 00:00:00 2001 From: ace Date: Tue, 10 Oct 2023 17:59:39 +0800 Subject: [PATCH 1434/1858] ChiseledBookshelf: Fix duplication bug (#6086) Also fixes being able to put more than 1 book in the slot --- src/block/ChiseledBookshelf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php index ab1b4ddb34..0a8100b8b3 100644 --- a/src/block/ChiseledBookshelf.php +++ b/src/block/ChiseledBookshelf.php @@ -113,7 +113,7 @@ class ChiseledBookshelf extends Opaque{ $this->setSlot($slot, false); }elseif($item instanceof WritableBookBase || $item instanceof Book || $item instanceof EnchantedBook){ //TODO: type tags like blocks would be better for this - $inventory->setItem($slot->value, $item); + $inventory->setItem($slot->value, $item->pop()); $this->setSlot($slot, true); }else{ return true; From 8b52a5cd9eb6bcacb06ed914bd8e44dae05a7efd Mon Sep 17 00:00:00 2001 From: ace Date: Tue, 10 Oct 2023 19:35:50 +0800 Subject: [PATCH 1435/1858] Fix book placed in wrong slot in Chiseled Bookshelf (#6085) --- src/block/ChiseledBookshelf.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php index 0a8100b8b3..021ed58e99 100644 --- a/src/block/ChiseledBookshelf.php +++ b/src/block/ChiseledBookshelf.php @@ -97,8 +97,9 @@ class ChiseledBookshelf extends Opaque{ return false; } + $x = Facing::axis($face) === Axis::X ? $clickVector->getZ() : $clickVector->getX(); $slot = ChiseledBookshelfSlot::fromBlockFaceCoordinates( - Facing::axis($face) === Axis::X ? $clickVector->getZ() : $clickVector->getX(), + Facing::isPositive(Facing::rotateY($face, true)) ? 1 - $x : $x, $clickVector->y ); $tile = $this->position->getWorld()->getTile($this->position); From 7d200247f88a849d471138cb339955d196beb36e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 Oct 2023 12:45:11 +0100 Subject: [PATCH 1436/1858] Cactus: do not update if only age changed I'd prefer a smarter solution for this that automatically disables updates depending on which type of property was changed, but for now, this will significantly improve the performance of cactus farms. The newly placed cactus block at the top cannot have updates disabled, though, since it needs to check its surroundings in case it grew into a space with a solid block next to it. Thanks @KingOfTurkey38 for bringing this to light. --- src/block/Cactus.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/Cactus.php b/src/block/Cactus.php index 0176d17bd6..bb8a7cd40a 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -117,10 +117,10 @@ class Cactus extends Transparent{ } } $this->age = 0; - $world->setBlock($this->position, $this); + $world->setBlock($this->position, $this, update: false); }else{ ++$this->age; - $world->setBlock($this->position, $this); + $world->setBlock($this->position, $this, update: false); } } } From 128eb500ebee5163583b84640a9c4f28c0218d42 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 13 Oct 2023 17:35:15 +0100 Subject: [PATCH 1437/1858] World: specialize nearby entity updating for block updates this slashes the cost of checking this with no entities by 50%, which should be the common case for farms and such. once factoring in other things, this translates into a real-world performance gain of about 15% for block updates. --- src/world/World.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 2ff2b5b2ea..965214c148 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -986,8 +986,11 @@ class World implements ChunkManager{ continue; } } - foreach($this->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z)) as $entity){ - $entity->onNearbyBlockChange(); + $cellAABB = AxisAlignedBB::one()->offset($x, $y, $z); + foreach($this->getChunkEntities($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE) as $entity){ + if($entity->getBoundingBox()->intersectsWith($cellAABB)){ + $entity->onNearbyBlockChange(); + } } $block->onNearbyBlockChange(); } From 538b698a00501a649606d2f9de18b62c4e207a51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 14 Oct 2023 19:43:46 +0100 Subject: [PATCH 1438/1858] Revert "World: specialize nearby entity updating for block updates" This reverts commit 128eb500ebee5163583b84640a9c4f28c0218d42. This breaks when entities in neighbouring chunks overlap into the current chunk without actually being tracked by it. Perhaps it might be worth having entities tracked by all chunks their AABB touches in the future, so that we don't have to check padding chunks and waste CPU time. --- src/world/World.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 965214c148..2ff2b5b2ea 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -986,11 +986,8 @@ class World implements ChunkManager{ continue; } } - $cellAABB = AxisAlignedBB::one()->offset($x, $y, $z); - foreach($this->getChunkEntities($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE) as $entity){ - if($entity->getBoundingBox()->intersectsWith($cellAABB)){ - $entity->onNearbyBlockChange(); - } + foreach($this->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z)) as $entity){ + $entity->onNearbyBlockChange(); } $block->onNearbyBlockChange(); } From 1da7e3586bc59d256c365f4f6d18037ca853b7c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 16 Oct 2023 20:45:44 +0100 Subject: [PATCH 1439/1858] Updated composer dependencies --- composer.json | 2 +- composer.lock | 90 +++++++++++++++++++++++++-------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/composer.json b/composer.json index 10f10e6cae..4b485f30d3 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "~2.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.35", + "phpstan/phpstan": "1.10.38", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.1" diff --git a/composer.lock b/composer.lock index 81f584bde7..084f2f551f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "544d6f936592b418497d61fec8058656", + "content-hash": "c8e65401c1bbfdae28c7a9069df35963", "packages": [ { "name": "adhocore/json-comment", @@ -224,16 +224,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "2.5.0+bedrock-1.20.30", + "version": "2.5.1+bedrock-1.20.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9" + "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", - "reference": "e920209393a8bf6cb15fb40c3f3149aaf8e1a2b9", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/8f9d96047a731c37b18b28c2bfcdfa2705bb303f", + "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f", "shasum": "" }, "type": "library", @@ -244,9 +244,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockData/tree/2.5.1+bedrock-1.20.30" }, - "time": "2023-09-20T16:34:21+00:00" + "time": "2023-09-27T11:40:15+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -1738,16 +1738,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.35", + "version": "1.10.38", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" + "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", + "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", "shasum": "" }, "require": { @@ -1796,20 +1796,20 @@ "type": "tidelift" } ], - "time": "2023-09-19T15:27:56+00:00" + "time": "2023-10-06T14:19:14+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.14", + "version": "1.3.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "614acc10c522e319639bf38b0698a4a566665f04" + "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/614acc10c522e319639bf38b0698a4a566665f04", - "reference": "614acc10c522e319639bf38b0698a4a566665f04", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/70ecacc64fe8090d8d2a33db5a51fe8e88acd93a", + "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a", "shasum": "" }, "require": { @@ -1846,9 +1846,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.14" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.15" }, - "time": "2023-08-25T09:46:39+00:00" + "time": "2023-10-09T18:58:39+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -1901,16 +1901,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.6", + "version": "10.1.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364" + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", "shasum": "" }, "require": { @@ -1967,7 +1967,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" }, "funding": [ { @@ -1975,7 +1975,7 @@ "type": "github" } ], - "time": "2023-09-19T04:59:03+00:00" + "time": "2023-10-04T15:34:17+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2222,16 +2222,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.5", + "version": "10.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/62bd7af13d282deeb95650077d28ba3600ca321c", + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c", "shasum": "" }, "require": { @@ -2271,7 +2271,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-main": "10.4-dev" } }, "autoload": { @@ -2303,7 +2303,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.1" }, "funding": [ { @@ -2319,7 +2319,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:42:37+00:00" + "time": "2023-10-08T05:01:11+00:00" }, { "name": "sebastian/cli-parser", @@ -2567,16 +2567,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", "shasum": "" }, "require": { @@ -2589,7 +2589,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.1-dev" } }, "autoload": { @@ -2613,7 +2613,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" }, "funding": [ { @@ -2621,7 +2621,7 @@ "type": "github" } ], - "time": "2023-08-31T09:55:53+00:00" + "time": "2023-09-28T11:50:59+00:00" }, { "name": "sebastian/diff", @@ -2756,16 +2756,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { @@ -2779,7 +2779,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -2822,7 +2822,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -2830,7 +2830,7 @@ "type": "github" } ], - "time": "2023-09-18T07:15:37+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", From edea793a9849550ee7d8b99c9594a10d6b391ac5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 16 Oct 2023 21:25:53 +0100 Subject: [PATCH 1440/1858] Downgrade PHPUnit to 10.3 until sebastianbergmann/phpunit#5539 is fixed --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 4b485f30d3..752779c2d0 100644 --- a/composer.json +++ b/composer.json @@ -59,7 +59,7 @@ "phpstan/phpstan": "1.10.38", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 084f2f551f..95bfc94abc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c8e65401c1bbfdae28c7a9069df35963", + "content-hash": "4f353f6d6fedade4ebfa82aa34f9cb21", "packages": [ { "name": "adhocore/json-comment", @@ -2222,16 +2222,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.4.1", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "62bd7af13d282deeb95650077d28ba3600ca321c" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/62bd7af13d282deeb95650077d28ba3600ca321c", - "reference": "62bd7af13d282deeb95650077d28ba3600ca321c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -2271,7 +2271,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -2303,7 +2303,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -2319,7 +2319,7 @@ "type": "tidelift" } ], - "time": "2023-10-08T05:01:11+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "sebastian/cli-parser", From 82d6fc3890b785e5da74e7ea54d79180b7325052 Mon Sep 17 00:00:00 2001 From: ace Date: Tue, 17 Oct 2023 18:10:36 +0800 Subject: [PATCH 1441/1858] Fix loading of Chiseled Bookshelf tile from vanilla world (#6084) Co-authored-by: Dylan T --- src/block/tile/ChiseledBookshelf.php | 59 ++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/block/tile/ChiseledBookshelf.php b/src/block/tile/ChiseledBookshelf.php index adfdae814b..f9d61e7eb6 100644 --- a/src/block/tile/ChiseledBookshelf.php +++ b/src/block/tile/ChiseledBookshelf.php @@ -24,9 +24,16 @@ declare(strict_types=1); namespace pocketmine\block\tile; use pocketmine\block\utils\ChiseledBookshelfSlot; +use pocketmine\data\bedrock\item\SavedItemData; +use pocketmine\data\bedrock\item\SavedItemStackData; +use pocketmine\data\SavedDataLoadingException; use pocketmine\inventory\SimpleInventory; +use pocketmine\item\Item; use pocketmine\math\Vector3; +use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\ListTag; +use pocketmine\nbt\tag\StringTag; use pocketmine\world\World; use function count; @@ -55,4 +62,56 @@ class ChiseledBookshelf extends Tile implements Container{ public function writeSaveData(CompoundTag $nbt) : void{ $this->saveItems($nbt); } + + protected function loadItems(CompoundTag $tag) : void{ + if(($inventoryTag = $tag->getTag(Container::TAG_ITEMS)) instanceof ListTag && $inventoryTag->getTagType() === NBT::TAG_Compound){ + $inventory = $this->getRealInventory(); + $listeners = $inventory->getListeners()->toArray(); + $inventory->getListeners()->remove(...$listeners); //prevent any events being fired by initialization + + $newContents = []; + /** @var CompoundTag $itemNBT */ + foreach($inventoryTag as $slot => $itemNBT){ + try{ + $count = $itemNBT->getByte(SavedItemStackData::TAG_COUNT); + if($count === 0){ + continue; + } + $newContents[$slot] = Item::nbtDeserialize($itemNBT); + }catch(SavedDataLoadingException $e){ + //TODO: not the best solution + \GlobalLogger::get()->logException($e); + continue; + } + } + $inventory->setContents($newContents); + + $inventory->getListeners()->add(...$listeners); + } + + if(($lockTag = $tag->getTag(Container::TAG_LOCK)) instanceof StringTag){ + $this->lock = $lockTag->getValue(); + } + } + + protected function saveItems(CompoundTag $tag) : void{ + $items = []; + foreach($this->getRealInventory()->getContents(true) as $slot => $item){ + if($item->isNull()){ + $items[$slot] = CompoundTag::create() + ->setByte(SavedItemStackData::TAG_COUNT, 0) + ->setShort(SavedItemData::TAG_DAMAGE, 0) + ->setString(SavedItemData::TAG_NAME, "") + ->setByte(SavedItemStackData::TAG_WAS_PICKED_UP, 0); + }else{ + $items[$slot] = $item->nbtSerialize(); + } + } + + $tag->setTag(Container::TAG_ITEMS, new ListTag($items, NBT::TAG_Compound)); + + if($this->lock !== null){ + $tag->setString(Container::TAG_LOCK, $this->lock); + } + } } From b0936a50c11215d5d6928070996deb4425b43e4a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Oct 2023 11:28:58 +0100 Subject: [PATCH 1442/1858] Block: split generateStatePermutations into type and state parts this makes it marginally faster, since we can skip all permutations containing invalid type data. I measured a performance improvement of about 20% across all blocks. In addition, this makes it easier to locate where a problem is coming from if invalid inputs are accepted. --- src/block/Block.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 7d01ce7ef1..be154ec7b3 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -304,18 +304,32 @@ class Block{ if($bits > Block::INTERNAL_STATE_DATA_BITS){ throw new \LogicException("Block state data cannot use more than " . Block::INTERNAL_STATE_DATA_BITS . " bits"); } - for($stateData = 0; $stateData < (1 << $bits); ++$stateData){ - $v = clone $this; + for($blockItemStateData = 0; $blockItemStateData < (1 << $this->requiredBlockItemStateDataBits); ++$blockItemStateData){ + $withType = clone $this; try{ - $v->decodeFullState($stateData); - if($v->encodeFullState() !== $stateData){ - throw new \LogicException(static::class . "::decodeStateData() accepts invalid state data (returned " . $v->encodeFullState() . " for input $stateData)"); + $withType->decodeBlockItemState($blockItemStateData); + $encoded = $withType->encodeBlockItemState(); + if($encoded !== $blockItemStateData){ + throw new \LogicException(static::class . "::decodeBlockItemState() accepts invalid inputs (returned $encoded for input $blockItemStateData)"); } }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it continue; } - yield $v; + for($blockOnlyStateData = 0; $blockOnlyStateData < (1 << $this->requiredBlockOnlyStateDataBits); ++$blockOnlyStateData){ + $withState = clone $withType; + try{ + $withState->decodeBlockOnlyState($blockOnlyStateData); + $encoded = $withState->encodeBlockOnlyState(); + if($encoded !== $blockOnlyStateData){ + throw new \LogicException(static::class . "::decodeBlockOnlyState() accepts invalid inputs (returned $encoded for input $blockOnlyStateData)"); + } + }catch(InvalidSerializedRuntimeDataException){ //invalid property combination, leave it + continue; + } + + yield $withState; + } } } From 18b711aca8f93e8a44e33ff3bf8f483c60c34383 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Oct 2023 11:34:02 +0100 Subject: [PATCH 1443/1858] Apparently this function is no longer needed --- src/block/Block.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index be154ec7b3..55737bbd61 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -228,12 +228,6 @@ class Block{ } } - private function decodeFullState(int $data) : void{ - $reader = new RuntimeDataReader($this->requiredBlockItemStateDataBits + $this->requiredBlockOnlyStateDataBits, $data); - $this->decodeBlockItemState($reader->readInt($this->requiredBlockItemStateDataBits)); - $this->decodeBlockOnlyState($reader->readInt($this->requiredBlockOnlyStateDataBits)); - } - private function encodeBlockItemState() : int{ $writer = new RuntimeDataWriter($this->requiredBlockItemStateDataBits); From d0d16cdeb73656b5ed1c46e0246f3b3fa7f4e29d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Oct 2023 12:03:43 +0100 Subject: [PATCH 1444/1858] RuntimeDataDescriber: Introduce boundedIntAuto, replacing boundedInt closes #6096 boundedIntAuto automatically calculates the correct number of bits to use based on the given bounds. The bounds must be constant, of course. --- src/block/AmethystCluster.php | 2 +- src/block/Anvil.php | 2 +- src/block/Bamboo.php | 2 +- src/block/Cake.php | 2 +- src/block/Candle.php | 2 +- src/block/CaveVines.php | 2 +- src/block/CocoaBlock.php | 2 +- src/block/DaylightSensor.php | 2 +- src/block/Farmland.php | 2 +- src/block/FillableCauldron.php | 2 +- src/block/Light.php | 2 +- src/block/Liquid.php | 2 +- src/block/PinkPetals.php | 2 +- src/block/RedstoneRepeater.php | 2 +- src/block/SeaPickle.php | 2 +- src/block/SnowLayer.php | 2 +- src/block/utils/AgeableTrait.php | 3 +-- .../AnalogRedstoneSignalEmitterTrait.php | 2 +- src/block/utils/SignLikeRotationTrait.php | 2 +- src/data/runtime/RuntimeDataDescriber.php | 9 ++++++++ src/data/runtime/RuntimeDataReader.php | 22 +++++++++++++++---- .../runtime/RuntimeDataSizeCalculator.php | 15 ++++++++++++- src/data/runtime/RuntimeDataWriter.php | 22 +++++++++++++++---- 23 files changed, 78 insertions(+), 29 deletions(-) diff --git a/src/block/AmethystCluster.php b/src/block/AmethystCluster.php index 5e23d44631..639490456a 100644 --- a/src/block/AmethystCluster.php +++ b/src/block/AmethystCluster.php @@ -50,7 +50,7 @@ final class AmethystCluster extends Transparent{ private int $stage = self::STAGE_CLUSTER; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, self::STAGE_SMALL_BUD, self::STAGE_CLUSTER, $this->stage); + $w->boundedIntAuto(self::STAGE_SMALL_BUD, self::STAGE_CLUSTER, $this->stage); } public function getStage() : int{ return $this->stage; } diff --git a/src/block/Anvil.php b/src/block/Anvil.php index b4677e075d..916c390ef6 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -52,7 +52,7 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); + $w->boundedIntAuto(self::UNDAMAGED, self::VERY_DAMAGED, $this->damage); } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 255cd28574..5df71f6968 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -58,7 +58,7 @@ class Bamboo extends Transparent{ protected int $leafSize = self::NO_LEAVES; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); + $w->boundedIntAuto(self::NO_LEAVES, self::LARGE_LEAVES, $this->leafSize); $w->bool($this->thick); $w->bool($this->ready); } diff --git a/src/block/Cake.php b/src/block/Cake.php index 5d4e3cfcae..073fc62ac9 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -37,7 +37,7 @@ class Cake extends BaseCake{ protected int $bites = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, 0, self::MAX_BITES, $this->bites); + $w->boundedIntAuto(0, self::MAX_BITES, $this->bites); } /** diff --git a/src/block/Candle.php b/src/block/Candle.php index afcf5bb457..7f22641e11 100644 --- a/src/block/Candle.php +++ b/src/block/Candle.php @@ -48,7 +48,7 @@ class Candle extends Transparent{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $this->encodeLitState($w); - $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + $w->boundedIntAuto(self::MIN_COUNT, self::MAX_COUNT, $this->count); } public function getCount() : int{ return $this->count; } diff --git a/src/block/CaveVines.php b/src/block/CaveVines.php index bc42a6788b..daa973507f 100644 --- a/src/block/CaveVines.php +++ b/src/block/CaveVines.php @@ -49,7 +49,7 @@ class CaveVines extends Flowable{ protected bool $head = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(5, 0, self::MAX_AGE, $this->age); + $w->boundedIntAuto(0, self::MAX_AGE, $this->age); $w->bool($this->berries); $w->bool($this->head); } diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 25c53b23aa..5cec4b933a 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -48,7 +48,7 @@ class CocoaBlock extends Transparent{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); - $w->boundedInt(2, 0, self::MAX_AGE, $this->age); + $w->boundedIntAuto(0, self::MAX_AGE, $this->age); } /** diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index 0c0ec88202..4141a2b7ed 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -42,7 +42,7 @@ class DaylightSensor extends Transparent{ protected bool $inverted = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, 15, $this->signalStrength); + $w->boundedIntAuto(0, 15, $this->signalStrength); $w->bool($this->inverted); } diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 2dd795eecc..70a6eeba78 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -39,7 +39,7 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, 0, self::MAX_WETNESS, $this->wetness); + $w->boundedIntAuto(0, self::MAX_WETNESS, $this->wetness); } public function getWetness() : int{ return $this->wetness; } diff --git a/src/block/FillableCauldron.php b/src/block/FillableCauldron.php index 6c9b2940b8..ceef352996 100644 --- a/src/block/FillableCauldron.php +++ b/src/block/FillableCauldron.php @@ -38,7 +38,7 @@ abstract class FillableCauldron extends Transparent{ private int $fillLevel = self::MIN_FILL_LEVEL; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); + $w->boundedIntAuto(self::MIN_FILL_LEVEL, self::MAX_FILL_LEVEL, $this->fillLevel); } public function getFillLevel() : int{ return $this->fillLevel; } diff --git a/src/block/Light.php b/src/block/Light.php index 239e1c0485..29a3a8dfca 100644 --- a/src/block/Light.php +++ b/src/block/Light.php @@ -35,7 +35,7 @@ final class Light extends Flowable{ private int $level = self::MAX_LIGHT_LEVEL; public function describeBlockItemState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); + $w->boundedIntAuto(self::MIN_LIGHT_LEVEL, self::MAX_LIGHT_LEVEL, $this->level); } public function getLightLevel() : int{ return $this->level; } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 2299f7d71b..9a9e49af4d 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -49,7 +49,7 @@ abstract class Liquid extends Transparent{ protected bool $still = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, 0, self::MAX_DECAY, $this->decay); + $w->boundedIntAuto(0, self::MAX_DECAY, $this->decay); $w->bool($this->falling); $w->bool($this->still); } diff --git a/src/block/PinkPetals.php b/src/block/PinkPetals.php index 5f11302065..872798df05 100644 --- a/src/block/PinkPetals.php +++ b/src/block/PinkPetals.php @@ -47,7 +47,7 @@ class PinkPetals extends Flowable{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); - $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + $w->boundedIntAuto(self::MIN_COUNT, self::MAX_COUNT, $this->count); } public function getCount() : int{ diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 1306456d44..7e6e73da84 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -47,7 +47,7 @@ class RedstoneRepeater extends Flowable{ protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); - $w->boundedInt(2, self::MIN_DELAY, self::MAX_DELAY, $this->delay); + $w->boundedIntAuto(self::MIN_DELAY, self::MAX_DELAY, $this->delay); $w->bool($this->powered); } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 62662f9cf7..627af9bacc 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -39,7 +39,7 @@ class SeaPickle extends Transparent{ protected bool $underwater = false; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(2, self::MIN_COUNT, self::MAX_COUNT, $this->count); + $w->boundedIntAuto(self::MIN_COUNT, self::MAX_COUNT, $this->count); $w->bool($this->underwater); } diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index fd7258d914..cca8424a98 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -47,7 +47,7 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(3, self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); + $w->boundedIntAuto(self::MIN_LAYERS, self::MAX_LAYERS, $this->layers); } public function getLayers() : int{ return $this->layers; } diff --git a/src/block/utils/AgeableTrait.php b/src/block/utils/AgeableTrait.php index 8e2793e817..dc1369c876 100644 --- a/src/block/utils/AgeableTrait.php +++ b/src/block/utils/AgeableTrait.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\data\runtime\RuntimeDataDescriber; -use function log; /** * This trait is used for blocks that have an age property. @@ -34,7 +33,7 @@ trait AgeableTrait{ protected int $age = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(((int) log(self::MAX_AGE, 2)) + 1, 0, self::MAX_AGE, $this->age); + $w->boundedIntAuto(0, self::MAX_AGE, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index fe61f652c7..4b86946436 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -29,7 +29,7 @@ trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, 15, $this->signalStrength); + $w->boundedIntAuto(0, 15, $this->signalStrength); } public function getOutputSignalStrength() : int{ return $this->signalStrength; } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index 233c750954..36b2dce3fa 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -31,7 +31,7 @@ trait SignLikeRotationTrait{ private $rotation = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->boundedInt(4, 0, 15, $this->rotation); + $w->boundedIntAuto(0, 15, $this->rotation); } public function getRotation() : int{ return $this->rotation; } diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 8eba38a1de..04217f5df5 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -38,8 +38,17 @@ use pocketmine\math\Facing; interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function int(int $bits, int &$value) : void; + /** + * @deprecated Use {@link RuntimeDataDescriber::boundedIntAuto()} instead. + */ public function boundedInt(int $bits, int $min, int $max, int &$value) : void; + /** + * Same as boundedInt() but automatically calculates the required number of bits from the range. + * The range bounds must be constant. + */ + public function boundedIntAuto(int $min, int $max, int &$value) : void; + public function bool(bool &$value) : void; public function horizontalFacing(int &$facing) : void; diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index e4ccc892d4..84239f4113 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -31,6 +31,7 @@ use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; use function get_class; use function intdiv; +use function log; use function spl_object_id; final class RuntimeDataReader implements RuntimeDataDescriber{ @@ -58,7 +59,20 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $value = $this->readInt($bits); } - protected function readBoundedInt(int $bits, int $min, int $max) : int{ + /** + * @deprecated Use {@link self::boundedIntAuto()} instead. + */ + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + $offset = $this->offset; + $this->boundedIntAuto($min, $max, $value); + $actualBits = $this->offset - $offset; + if($this->offset !== $offset + $bits){ + throw new \InvalidArgumentException("Bits should be $actualBits for the given bounds, but received $bits. Use boundedIntAuto() for automatic bits calculation."); + } + } + + private function readBoundedIntAuto(int $min, int $max) : int{ + $bits = ((int) log($max - $min, 2)) + 1; $result = $this->readInt($bits) + $min; if($result < $min || $result > $max){ throw new InvalidSerializedRuntimeDataException("Value is outside the range $min - $max"); @@ -66,8 +80,8 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ return $result; } - public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ - $value = $this->readBoundedInt($bits, $min, $max); + public function boundedIntAuto(int $min, int $max, int &$value) : void{ + $value = $this->readBoundedIntAuto($min, $max); } protected function readBool() : bool{ @@ -162,7 +176,7 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ public function wallConnections(array &$connections) : void{ $result = []; $offset = 0; - $packed = $this->readBoundedInt(7, 0, (3 ** 4) - 1); + $packed = $this->readBoundedIntAuto(0, (3 ** 4) - 1); foreach(Facing::HORIZONTAL as $facing){ $type = intdiv($packed, (3 ** $offset)) % 3; if($type !== 0){ diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 28ddaa673b..18c703cb83 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -26,6 +26,7 @@ namespace pocketmine\data\runtime; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\math\Facing; use function count; +use function log; final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ use LegacyRuntimeEnumDescriberTrait; @@ -44,8 +45,20 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ $this->addBits($bits); } + /** + * @deprecated Use {@link self::boundedIntAuto()} instead. + */ public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ - $this->addBits($bits); + $currentBits = $this->bits; + $this->boundedIntAuto($min, $max, $value); + $actualBits = $this->bits - $currentBits; + if($actualBits !== $bits){ + throw new \InvalidArgumentException("Bits should be $actualBits for the given bounds, but received $bits. Use boundedIntAuto() for automatic bits calculation."); + } + } + + public function boundedIntAuto(int $min, int $max, int &$value) : void{ + $this->addBits(((int) log($max - $min, 2)) + 1); } public function bool(bool &$value) : void{ diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index 5224b34177..0fbdd869f3 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -28,6 +28,7 @@ use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use function array_flip; +use function log; use function spl_object_id; final class RuntimeDataWriter implements RuntimeDataDescriber{ @@ -56,15 +57,28 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ $this->writeInt($bits, $value); } - protected function writeBoundedInt(int $bits, int $min, int $max, int $value) : void{ + /** + * @deprecated Use {@link self::boundedIntAuto()} instead. + */ + public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ + $offset = $this->offset; + $this->writeBoundedIntAuto($min, $max, $value); + $actualBits = $this->offset - $offset; + if($actualBits !== $bits){ + throw new \InvalidArgumentException("Bits should be $actualBits for the given bounds, but received $bits. Use boundedIntAuto() for automatic bits calculation."); + } + } + + private function writeBoundedIntAuto(int $min, int $max, int $value) : void{ if($value < $min || $value > $max){ throw new \InvalidArgumentException("Value $value is outside the range $min - $max"); } + $bits = ((int) log($max - $min, 2)) + 1; $this->writeInt($bits, $value - $min); } - public function boundedInt(int $bits, int $min, int $max, int &$value) : void{ - $this->writeBoundedInt($bits, $min, $max, $value); + public function boundedIntAuto(int $min, int $max, int &$value) : void{ + $this->writeBoundedIntAuto($min, $max, $value); } protected function writeBool(bool $value) : void{ @@ -153,7 +167,7 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ } * (3 ** $offset); $offset++; } - $this->writeBoundedInt(7, 0, (3 ** 4) - 1, $packed); + $this->writeBoundedIntAuto(0, (3 ** 4) - 1, $packed); } /** From 224a69b11af4b37e46cd38b53b3018fa88b40429 Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:22:20 +0200 Subject: [PATCH 1445/1858] Sign can be a fuel (#6095) --- src/block/BaseSign.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/BaseSign.php b/src/block/BaseSign.php index d7a22f3b8a..2c9f8cda2e 100644 --- a/src/block/BaseSign.php +++ b/src/block/BaseSign.php @@ -271,4 +271,8 @@ abstract class BaseSign extends Transparent{ public function asItem() : Item{ return ($this->asItemCallback)(); } + + public function getFuelTime() : int{ + return $this->woodType->isFlammable() ? 200 : 0; + } } From 63fcf9879ad7589c078dc8ffab81cd97286d46f5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Oct 2023 15:20:31 +0100 Subject: [PATCH 1446/1858] Block: Use xxhash'd XOR mask to improve state data lower bits distribution xxhash is generally well known for its hash key properties, so this is a suitable use case. We XOR the state data with a partial hash of xxh3(typeID), which provides sufficient hash distribution regardless of the size of state data. The previous method started to break down as the number of bits exceeded the number of significant bits of type ID (about 10 currently). As well as being better for hash distribution regardless of state data size, this also reduces the load factor of RuntimeBlockRegistry to 1.08 (previously around 1.24), which is a nice bonus. --- src/block/Block.php | 34 ++++++++++++++----- tests/phpunit/block/BlockTest.php | 9 +++++ .../block_factory_consistency_check.json | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 55737bbd61..a81b152117 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -50,12 +50,14 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Binary; use pocketmine\world\BlockTransaction; use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\World; use function count; use function get_class; +use function hash; use const PHP_INT_MAX; class Block{ @@ -64,8 +66,10 @@ class Block{ /** * @internal + * Hardcoded int is `Binary::readLong(hash('xxh3', Binary::writeLLong(BlockTypeIds::AIR), binary: true))` + * TODO: it would be much easier if we could just make this 0 or some other easy value */ - public const EMPTY_STATE_ID = (BlockTypeIds::AIR << self::INTERNAL_STATE_DATA_BITS) | (BlockTypeIds::AIR & self::INTERNAL_STATE_DATA_MASK); + public const EMPTY_STATE_ID = (BlockTypeIds::AIR << self::INTERNAL_STATE_DATA_BITS) | (-7482769108513497636 & self::INTERNAL_STATE_DATA_MASK); protected BlockIdentifier $idInfo; protected string $fallbackName; @@ -80,6 +84,23 @@ class Block{ private Block $defaultState; + private int $stateIdXorMask; + + /** + * Computes the mask to be XOR'd with the state data. + * This is to improve distribution of the state data bits, which occupy the least significant bits of the state ID. + * Improved distribution improves PHP array performance when using the state ID as a key, as PHP arrays use some of + * the lower bits of integer keys directly without hashing. + * + * The type ID is included in the XOR mask. This is not necessary to improve distribution, but it reduces the number + * of operations required to compute the state ID (micro optimization). + */ + public static function computeStateIdXorMask(int $typeId) : int{ + return + $typeId << self::INTERNAL_STATE_DATA_BITS | + (Binary::readLong(hash('xxh3', Binary::writeLLong($typeId), binary: true)) & self::INTERNAL_STATE_DATA_MASK); + } + /** * @param string $name English name of the block type (TODO: implement translations) */ @@ -97,6 +118,9 @@ class Block{ $this->describeBlockOnlyState($calculator); $this->requiredBlockOnlyStateDataBits = $calculator->getBitsUsed(); + $this->stateIdXorMask = self::computeStateIdXorMask($idInfo->getBlockTypeId()); + + //this must be done last, otherwise the defaultState could have uninitialized fields $defaultState = clone $this; $this->defaultState = $defaultState; $defaultState->defaultState = $defaultState; @@ -152,13 +176,7 @@ class Block{ * {@link RuntimeBlockStateRegistry::fromStateId()}. */ public function getStateId() : int{ - $typeId = $this->getTypeId(); - //TODO: this XOR mask improves hashtable distribution, but it's only effective if the number of unique block - //type IDs is larger than the number of available state data bits. We should probably hash (e.g. using xxhash) - //the type ID to create a better mask. - //Alternatively, we could hash the whole state ID, but this is currently problematic, since we currently need - //to be able to recover the state data from the state ID because of UnknownBlock. - return ($typeId << self::INTERNAL_STATE_DATA_BITS) | ($this->encodeFullState() ^ ($typeId & self::INTERNAL_STATE_DATA_MASK)); + return $this->encodeFullState() ^ $this->stateIdXorMask; } /** diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 3b84b8021f..f876bf402d 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -28,6 +28,7 @@ use function asort; use function file_get_contents; use function is_array; use function json_decode; +use function log; use function print_r; use const SORT_STRING; @@ -125,6 +126,14 @@ class BlockTest extends TestCase{ self::assertInstanceOf(Air::class, $block); } + public function testStateDataSizeNotTooLarge() : void{ + $typeIdBitsMin = ((int) log(BlockTypeIds::FIRST_UNUSED_BLOCK_ID, 2)) + 1; + + $typeIdBitsMin++; //for custom blocks + + self::assertLessThanOrEqual(32, Block::INTERNAL_STATE_DATA_BITS + $typeIdBitsMin, "State data size cannot be larger than " . (32 - $typeIdBitsMin) . " bits (need at least $typeIdBitsMin bits for block type ID)"); + } + public function testAsItemFromItem() : void{ $block = VanillaBlocks::FLOWER_POT(); $item = $block->asItem(); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 219736a676..4a4c82b1ec 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624010],"Acacia Button":[2560272,2560273,2560274,2560275,2560276,2560277,2560280,2560281,2560282,2560283,2560284,2560285],"Acacia Door":[2560512,2560513,2560514,2560515,2560516,2560517,2560518,2560519,2560520,2560521,2560522,2560523,2560524,2560525,2560526,2560527,2560528,2560529,2560530,2560531,2560532,2560533,2560534,2560535,2560536,2560537,2560538,2560539,2560540,2560541,2560542,2560543],"Acacia Fence":[2560787],"Acacia Fence Gate":[2561040,2561041,2561042,2561043,2561044,2561045,2561046,2561047,2561048,2561049,2561050,2561051,2561052,2561053,2561054,2561055],"Acacia Leaves":[2561300,2561301,2561302,2561303],"Acacia Log":[2561554,2561555,2561556,2561557,2561558,2561559],"Acacia Planks":[2561815],"Acacia Pressure Plate":[2562072,2562073],"Acacia Sapling":[2562328,2562329],"Acacia Sign":[2562576,2562577,2562578,2562579,2562580,2562581,2562582,2562583,2562584,2562585,2562586,2562587,2562588,2562589,2562590,2562591],"Acacia Slab":[2562841,2562842,2562843],"Acacia Stairs":[2563096,2563097,2563098,2563099,2563100,2563101,2563102,2563103],"Acacia Trapdoor":[2563344,2563345,2563346,2563347,2563348,2563349,2563350,2563351,2563352,2563353,2563354,2563355,2563356,2563357,2563358,2563359],"Acacia Wall Sign":[2563612,2563613,2563614,2563615],"Acacia Wood":[2563866,2563867,2563868,2563869,2563870,2563871],"Actinium":[2594197],"Activator Rail":[2564128,2564129,2564130,2564131,2564132,2564133,2564136,2564137,2564138,2564139,2564140,2564141],"Air":[2560016],"All Sided Mushroom Stem":[2564385],"Allium":[2564642],"Aluminum":[2594454],"Americium":[2594711],"Amethyst":[2698284],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697784,2697785,2697786,2697787,2697788,2697789,2697790,2697791],"Ancient Debris":[2698541],"Andesite":[2564899],"Andesite Slab":[2565156,2565157,2565158],"Andesite Stairs":[2565408,2565409,2565410,2565411,2565412,2565413,2565414,2565415],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565648,2565649,2565650,2565651,2565652,2565653,2565654,2565655,2565656,2565657,2565658,2565659,2565660,2565661,2565662,2565663,2565664,2565665,2565666,2565667,2565668,2565669,2565670,2565671,2565672,2565673,2565674,2565675,2565676,2565677,2565678,2565679,2565680,2565681,2565682,2565683,2565684,2565685,2565686,2565687,2565688,2565689,2565690,2565691,2565692,2565693,2565694,2565695,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565750,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565776,2565777,2565778,2565779,2565780,2565781,2565782,2565783,2565784,2565785,2565786,2565787,2565788,2565789,2565790,2565791,2565792,2565793,2565794,2565795,2565796,2565797,2565798,2565799,2565800,2565801,2565802,2565803,2565804,2565805,2565806,2565807,2565808,2565809,2565810,2565811,2565812,2565813,2565814,2565815,2565816,2565817,2565818,2565819,2565820,2565821,2565822,2565823,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565878],"Antimony":[2594968],"Anvil":[2565921,2565922,2565923,2565925,2565926,2565927,2565929,2565930,2565931,2565933,2565934,2565935],"Argon":[2595225],"Arsenic":[2595482],"Astatine":[2595739],"Azalea Leaves":[2735804,2735805,2735806,2735807],"Azure Bluet":[2566184],"Bamboo":[2566432,2566433,2566435,2566436,2566437,2566439,2566440,2566441,2566443,2566444,2566445,2566447],"Bamboo Sapling":[2566698,2566699],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595996],"Barrel":[2567200,2567201,2567204,2567205,2567206,2567207,2567208,2567209,2567212,2567213,2567214,2567215],"Barrier":[2567469],"Basalt":[2698796,2698798,2698799],"Beacon":[2567726],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568240,2568241],"Beetroot Block":[2568496,2568497,2568498,2568499,2568500,2568501,2568502,2568503],"Bell":[2568752,2568753,2568754,2568755,2568756,2568757,2568758,2568759,2568760,2568761,2568762,2568763,2568764,2568765,2568766,2568767],"Berkelium":[2596253],"Beryllium":[2596510],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741460,2741461,2741462,2741463],"Birch Button":[2569008,2569009,2569010,2569011,2569014,2569015,2569016,2569017,2569018,2569019,2569022,2569023],"Birch Door":[2569248,2569249,2569250,2569251,2569252,2569253,2569254,2569255,2569256,2569257,2569258,2569259,2569260,2569261,2569262,2569263,2569264,2569265,2569266,2569267,2569268,2569269,2569270,2569271,2569272,2569273,2569274,2569275,2569276,2569277,2569278,2569279],"Birch Fence":[2569525],"Birch Fence Gate":[2569776,2569777,2569778,2569779,2569780,2569781,2569782,2569783,2569784,2569785,2569786,2569787,2569788,2569789,2569790,2569791],"Birch Leaves":[2570036,2570037,2570038,2570039],"Birch Log":[2570296,2570297,2570298,2570299,2570300,2570301],"Birch Planks":[2570553],"Birch Pressure Plate":[2570810,2570811],"Birch Sapling":[2571066,2571067],"Birch Sign":[2571312,2571313,2571314,2571315,2571316,2571317,2571318,2571319,2571320,2571321,2571322,2571323,2571324,2571325,2571326,2571327],"Birch Slab":[2571580,2571581,2571583],"Birch Stairs":[2571832,2571833,2571834,2571835,2571836,2571837,2571838,2571839],"Birch Trapdoor":[2572080,2572081,2572082,2572083,2572084,2572085,2572086,2572087,2572088,2572089,2572090,2572091,2572092,2572093,2572094,2572095],"Birch Wall Sign":[2572352,2572353,2572354,2572355],"Birch Wood":[2572608,2572609,2572610,2572611,2572612,2572613],"Bismuth":[2596767],"Blackstone":[2699569],"Blackstone Slab":[2699824,2699826,2699827],"Blackstone Stairs":[2700080,2700081,2700082,2700083,2700084,2700085,2700086,2700087],"Blackstone Wall":[2700288,2700289,2700290,2700291,2700292,2700293,2700294,2700295,2700296,2700297,2700298,2700299,2700300,2700301,2700302,2700303,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700320,2700321,2700322,2700323,2700324,2700325,2700326,2700327,2700328,2700329,2700330,2700331,2700332,2700333,2700334,2700335,2700336,2700337,2700338,2700339,2700340,2700341,2700342,2700343,2700344,2700345,2700346,2700347,2700348,2700349,2700350,2700351,2700388,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700416,2700417,2700418,2700419,2700420,2700421,2700422,2700423,2700424,2700425,2700426,2700427,2700428,2700429,2700430,2700431,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700448,2700449,2700450,2700451,2700452,2700453,2700454,2700455,2700456,2700457,2700458,2700459,2700460,2700461,2700462,2700463,2700464,2700465,2700466,2700467,2700468,2700469,2700470,2700471,2700472,2700473,2700474,2700475,2700476,2700477,2700478,2700479,2700516,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573120,2573121,2573122,2573123,2573124,2573125,2573126,2573127],"Blue Ice":[2573637],"Blue Orchid":[2573894],"Blue Torch":[2574146,2574147,2574148,2574149,2574150],"Bohrium":[2597024],"Bone Block":[2574408,2574409,2574410],"Bookshelf":[2574665],"Boron":[2597281],"Brewing Stand":[2574920,2574921,2574922,2574923,2574924,2574925,2574926,2574927],"Brick Slab":[2575177,2575178,2575179],"Brick Stairs":[2575432,2575433,2575434,2575435,2575436,2575437,2575438,2575439],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575645,2575680,2575681,2575682,2575683,2575684,2575685,2575686,2575687,2575688,2575689,2575690,2575691,2575692,2575693,2575694,2575695,2575696,2575697,2575698,2575699,2575700,2575701,2575702,2575703,2575704,2575705,2575706,2575707,2575708,2575709,2575710,2575711,2575712,2575713,2575714,2575715,2575716,2575717,2575718,2575719,2575720,2575721,2575722,2575723,2575724,2575725,2575726,2575727,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575773,2575808,2575809,2575810,2575811,2575812,2575813,2575814,2575815,2575816,2575817,2575818,2575819,2575820,2575821,2575822,2575823,2575824,2575825,2575826,2575827,2575828,2575829,2575830,2575831,2575832,2575833,2575834,2575835,2575836,2575837,2575838,2575839,2575840,2575841,2575842,2575843,2575844,2575845,2575846,2575847,2575848,2575849,2575850,2575851,2575852,2575853,2575854,2575855,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575950],"Bromine":[2597538],"Brown Mushroom":[2576464],"Brown Mushroom Block":[2576720,2576721,2576722,2576723,2576724,2576725,2576726,2576727,2576728,2576729,2576731],"Budding Amethyst":[2696999],"Cactus":[2576976,2576977,2576978,2576979,2576980,2576981,2576982,2576983,2576984,2576985,2576986,2576987,2576988,2576989,2576990,2576991],"Cadmium":[2597795],"Cake":[2577232,2577233,2577234,2577235,2577237,2577238,2577239],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729888,2729889,2729890,2729891,2729892,2729893,2729894,2729895,2729896,2729897,2729898,2729899,2729900,2729901,2729902,2729903,2729904,2729905,2729906,2729907,2729908,2729909,2729910,2729911,2729912,2729913,2729914,2729915,2729916,2729917,2729918,2729919],"Calcite":[2704709],"Calcium":[2598052],"Californium":[2598309],"Candle":[2729120,2729121,2729122,2729123,2729124,2729125,2729126,2729127],"Carbon":[2598566],"Carpet":[2577488,2577489,2577490,2577491,2577492,2577493,2577494,2577495,2577496,2577497,2577498,2577499,2577500,2577501,2577502,2577503],"Carrot Block":[2577744,2577745,2577746,2577747,2577748,2577749,2577750,2577751],"Cartography Table":[2730666],"Carved Pumpkin":[2578004,2578005,2578006,2578007],"Cauldron":[2731694],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736528,2736529,2736530,2736531,2736532,2736533,2736534,2736535,2736536,2736537,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736560,2736561,2736562,2736563,2736564,2736565,2736566,2736567,2736568,2736569,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736592,2736593,2736594,2736595,2736596,2736597,2736598,2736599,2736600,2736601,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736624,2736625,2736626,2736627,2736628,2736629,2736630,2736631,2736632,2736633],"Cerium":[2598823],"Cesium":[2599080],"Chain":[2734776,2734778,2734779],"Cherry Button":[2737088,2737089,2737090,2737091,2737094,2737095,2737096,2737097,2737098,2737099,2737102,2737103],"Cherry Door":[2737344,2737345,2737346,2737347,2737348,2737349,2737350,2737351,2737352,2737353,2737354,2737355,2737356,2737357,2737358,2737359,2737360,2737361,2737362,2737363,2737364,2737365,2737366,2737367,2737368,2737369,2737370,2737371,2737372,2737373,2737374,2737375],"Cherry Fence":[2737605],"Cherry Fence Gate":[2737856,2737857,2737858,2737859,2737860,2737861,2737862,2737863,2737864,2737865,2737866,2737867,2737868,2737869,2737870,2737871],"Cherry Leaves":[2738116,2738117,2738118,2738119],"Cherry Log":[2738376,2738377,2738378,2738379,2738380,2738381],"Cherry Planks":[2738633],"Cherry Pressure Plate":[2738890,2738891],"Cherry Sign":[2739392,2739393,2739394,2739395,2739396,2739397,2739398,2739399,2739400,2739401,2739402,2739403,2739404,2739405,2739406,2739407],"Cherry Slab":[2739660,2739661,2739663],"Cherry Stairs":[2739912,2739913,2739914,2739915,2739916,2739917,2739918,2739919],"Cherry Trapdoor":[2740160,2740161,2740162,2740163,2740164,2740165,2740166,2740167,2740168,2740169,2740170,2740171,2740172,2740173,2740174,2740175],"Cherry Wall Sign":[2740432,2740433,2740434,2740435],"Cherry Wood":[2740688,2740689,2740690,2740691,2740692,2740693],"Chest":[2578520,2578521,2578522,2578523],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710106],"Chiseled Nether Bricks":[2710363],"Chiseled Polished Blackstone":[2702139],"Chiseled Quartz Block":[2578776,2578777,2578779],"Chiseled Red Sandstone":[2579034],"Chiseled Sandstone":[2579291],"Chiseled Stone Bricks":[2579548],"Chlorine":[2599337],"Chorus Flower":[2732976,2732977,2732978,2732979,2732982,2732983],"Chorus Plant":[2733236],"Chromium":[2599594],"Clay Block":[2579805],"Coal Block":[2580062],"Coal Ore":[2580319],"Cobalt":[2599851],"Cobbled Deepslate":[2707793],"Cobbled Deepslate Slab":[2708048,2708050,2708051],"Cobbled Deepslate Stairs":[2708304,2708305,2708306,2708307,2708308,2708309,2708310,2708311],"Cobbled Deepslate Wall":[2708484,2708496,2708497,2708498,2708499,2708500,2708501,2708502,2708503,2708504,2708505,2708506,2708507,2708508,2708509,2708510,2708511,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708612,2708624,2708625,2708626,2708627,2708628,2708629,2708630,2708631,2708632,2708633,2708634,2708635,2708636,2708637,2708638,2708639,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580576],"Cobblestone Slab":[2580832,2580833,2580835],"Cobblestone Stairs":[2581088,2581089,2581090,2581091,2581092,2581093,2581094,2581095],"Cobblestone Wall":[2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581299,2581312,2581313,2581314,2581315,2581316,2581317,2581318,2581319,2581320,2581321,2581322,2581323,2581324,2581325,2581326,2581327,2581328,2581329,2581330,2581331,2581332,2581333,2581334,2581335,2581336,2581337,2581338,2581339,2581340,2581341,2581342,2581343,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581360,2581361,2581362,2581363,2581364,2581365,2581366,2581367,2581368,2581369,2581370,2581371,2581372,2581373,2581374,2581375,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581427,2581440,2581441,2581442,2581443,2581444,2581445,2581446,2581447,2581448,2581449,2581450,2581451,2581452,2581453,2581454,2581455,2581456,2581457,2581458,2581459,2581460,2581461,2581462,2581463,2581464,2581465,2581466,2581467,2581468,2581469,2581470,2581471,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581488,2581489,2581490,2581491,2581492,2581493,2581494,2581495,2581496,2581497,2581498,2581499,2581500,2581501,2581502,2581503],"Cobweb":[2581604],"Cocoa Block":[2581856,2581857,2581858,2581859,2581860,2581861,2581862,2581863,2581868,2581869,2581870,2581871],"Compound Creator":[2582116,2582117,2582118,2582119],"Concrete":[2582368,2582369,2582370,2582371,2582372,2582373,2582374,2582375,2582376,2582377,2582378,2582379,2582380,2582381,2582382,2582383],"Concrete Powder":[2582624,2582625,2582626,2582627,2582628,2582629,2582630,2582631,2582632,2582633,2582634,2582635,2582636,2582637,2582638,2582639],"Copernicium":[2600365],"Copper":[2600622],"Copper Block":[2728096,2728097,2728098,2728099,2728100,2728101,2728102,2728103],"Copper Ore":[2725012],"Coral":[2582880,2582881,2582882,2582883,2582885,2582888,2582889,2582890,2582891,2582893],"Coral Block":[2583136,2583137,2583138,2583139,2583142,2583144,2583145,2583146,2583147,2583150],"Coral Fan":[2583392,2583393,2583394,2583395,2583399,2583400,2583401,2583402,2583403,2583407,2583408,2583409,2583410,2583411,2583415,2583416,2583417,2583418,2583419,2583423],"Cornflower":[2583660],"Cracked Deepslate Bricks":[2706251],"Cracked Deepslate Tiles":[2707536],"Cracked Nether Bricks":[2710620],"Cracked Polished Blackstone Bricks":[2703424],"Cracked Stone Bricks":[2583917],"Crafting Table":[2584174],"Crimson Button":[2717298,2717299,2717300,2717301,2717302,2717303,2717306,2717307,2717308,2717309,2717310,2717311],"Crimson Door":[2718816,2718817,2718818,2718819,2718820,2718821,2718822,2718823,2718824,2718825,2718826,2718827,2718828,2718829,2718830,2718831,2718832,2718833,2718834,2718835,2718836,2718837,2718838,2718839,2718840,2718841,2718842,2718843,2718844,2718845,2718846,2718847],"Crimson Fence":[2713447],"Crimson Fence Gate":[2719600,2719601,2719602,2719603,2719604,2719605,2719606,2719607,2719608,2719609,2719610,2719611,2719612,2719613,2719614,2719615],"Crimson Hyphae":[2715760,2715761,2715762,2715763,2715764,2715765],"Crimson Planks":[2712676],"Crimson Pressure Plate":[2718072,2718073],"Crimson Roots":[2741974],"Crimson Sign":[2721152,2721153,2721154,2721155,2721156,2721157,2721158,2721159,2721160,2721161,2721162,2721163,2721164,2721165,2721166,2721167],"Crimson Slab":[2714216,2714218,2714219],"Crimson Stairs":[2720384,2720385,2720386,2720387,2720388,2720389,2720390,2720391],"Crimson Stem":[2714984,2714985,2714988,2714989,2714990,2714991],"Crimson Trapdoor":[2716528,2716529,2716530,2716531,2716532,2716533,2716534,2716535,2716536,2716537,2716538,2716539,2716540,2716541,2716542,2716543],"Crimson Wall Sign":[2721928,2721929,2721930,2721931],"Crying Obsidian":[2727325],"Curium":[2600879],"Cut Copper Block":[2728352,2728353,2728354,2728355,2728356,2728357,2728358,2728359],"Cut Copper Slab Slab":[2728608,2728609,2728610,2728611,2728612,2728613,2728614,2728615,2728616,2728617,2728618,2728619,2728620,2728621,2728622,2728623,2728624,2728625,2728626,2728627,2728628,2728629,2728630,2728631],"Cut Copper Stairs":[2728832,2728833,2728834,2728835,2728836,2728837,2728838,2728839,2728840,2728841,2728842,2728843,2728844,2728845,2728846,2728847,2728848,2728849,2728850,2728851,2728852,2728853,2728854,2728855,2728856,2728857,2728858,2728859,2728860,2728861,2728862,2728863,2728864,2728865,2728866,2728867,2728868,2728869,2728870,2728871,2728872,2728873,2728874,2728875,2728876,2728877,2728878,2728879,2728880,2728881,2728882,2728883,2728884,2728885,2728886,2728887,2728888,2728889,2728890,2728891,2728892,2728893,2728894,2728895],"Cut Red Sandstone":[2584431],"Cut Red Sandstone Slab":[2584688,2584689,2584690],"Cut Sandstone":[2584945],"Cut Sandstone Slab":[2585200,2585202,2585203],"Dandelion":[2585716],"Dark Oak Button":[2585968,2585969,2585972,2585973,2585974,2585975,2585976,2585977,2585980,2585981,2585982,2585983],"Dark Oak Door":[2586208,2586209,2586210,2586211,2586212,2586213,2586214,2586215,2586216,2586217,2586218,2586219,2586220,2586221,2586222,2586223,2586224,2586225,2586226,2586227,2586228,2586229,2586230,2586231,2586232,2586233,2586234,2586235,2586236,2586237,2586238,2586239],"Dark Oak Fence":[2586487],"Dark Oak Fence Gate":[2586736,2586737,2586738,2586739,2586740,2586741,2586742,2586743,2586744,2586745,2586746,2586747,2586748,2586749,2586750,2586751],"Dark Oak Leaves":[2587000,2587001,2587002,2587003],"Dark Oak Log":[2587256,2587257,2587258,2587259,2587262,2587263],"Dark Oak Planks":[2587515],"Dark Oak Pressure Plate":[2587772,2587773],"Dark Oak Sapling":[2588028,2588029],"Dark Oak Sign":[2588272,2588273,2588274,2588275,2588276,2588277,2588278,2588279,2588280,2588281,2588282,2588283,2588284,2588285,2588286,2588287],"Dark Oak Slab":[2588541,2588542,2588543],"Dark Oak Stairs":[2588800,2588801,2588802,2588803,2588804,2588805,2588806,2588807],"Dark Oak Trapdoor":[2589056,2589057,2589058,2589059,2589060,2589061,2589062,2589063,2589064,2589065,2589066,2589067,2589068,2589069,2589070,2589071],"Dark Oak Wall Sign":[2589312,2589313,2589314,2589315],"Dark Oak Wood":[2589568,2589569,2589570,2589571,2589574,2589575],"Dark Prismarine":[2589828],"Dark Prismarine Slab":[2590084,2590085,2590087],"Dark Prismarine Stairs":[2590336,2590337,2590338,2590339,2590340,2590341,2590342,2590343],"Darmstadtium":[2601136],"Daylight Sensor":[2590592,2590593,2590594,2590595,2590596,2590597,2590598,2590599,2590600,2590601,2590602,2590603,2590604,2590605,2590606,2590607,2590608,2590609,2590610,2590611,2590612,2590613,2590614,2590615,2590616,2590617,2590618,2590619,2590620,2590621,2590622,2590623],"Dead Bush":[2590856],"Deepslate":[2704964,2704966,2704967],"Deepslate Brick Slab":[2705480,2705481,2705482],"Deepslate Brick Stairs":[2705736,2705737,2705738,2705739,2705740,2705741,2705742,2705743],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705946,2705984,2705985,2705986,2705987,2705988,2705989,2705990,2705991,2705992,2705993,2705994,2705995,2705996,2705997,2705998,2705999,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706016,2706017,2706018,2706019,2706020,2706021,2706022,2706023,2706024,2706025,2706026,2706027,2706028,2706029,2706030,2706031,2706032,2706033,2706034,2706035,2706036,2706037,2706038,2706039,2706040,2706041,2706042,2706043,2706044,2706045,2706046,2706047,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706074,2706112,2706113,2706114,2706115,2706116,2706117,2706118,2706119,2706120,2706121,2706122,2706123,2706124,2706125,2706126,2706127,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143,2706144,2706145,2706146,2706147,2706148,2706149,2706150,2706151,2706152,2706153,2706154,2706155,2706156,2706157,2706158,2706159,2706160,2706161,2706162,2706163,2706164,2706165,2706166,2706167,2706168,2706169,2706170,2706171,2706172,2706173,2706174,2706175],"Deepslate Bricks":[2705223],"Deepslate Coal Ore":[2722956],"Deepslate Copper Ore":[2724755],"Deepslate Diamond Ore":[2723213],"Deepslate Emerald Ore":[2723470],"Deepslate Gold Ore":[2724498],"Deepslate Iron Ore":[2724241],"Deepslate Lapis Lazuli Ore":[2723727],"Deepslate Redstone Ore":[2723984,2723985],"Deepslate Tile Slab":[2706764,2706765,2706767],"Deepslate Tile Stairs":[2707016,2707017,2707018,2707019,2707020,2707021,2707022,2707023],"Deepslate Tile Wall":[2707200,2707201,2707202,2707203,2707204,2707205,2707206,2707207,2707208,2707209,2707210,2707211,2707212,2707213,2707214,2707215,2707231,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707328,2707329,2707330,2707331,2707332,2707333,2707334,2707335,2707336,2707337,2707338,2707339,2707340,2707341,2707342,2707343,2707359,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706508],"Detector Rail":[2591104,2591105,2591106,2591107,2591108,2591109,2591112,2591113,2591114,2591115,2591116,2591117],"Diamond Block":[2591370],"Diamond Ore":[2591627],"Diorite":[2591884],"Diorite Slab":[2592140,2592141,2592143],"Diorite Stairs":[2592392,2592393,2592394,2592395,2592396,2592397,2592398,2592399],"Diorite Wall":[2592512,2592513,2592514,2592515,2592516,2592517,2592518,2592519,2592520,2592521,2592522,2592523,2592524,2592525,2592526,2592527,2592528,2592529,2592530,2592531,2592532,2592533,2592534,2592535,2592536,2592537,2592538,2592539,2592540,2592541,2592542,2592543,2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592560,2592561,2592562,2592563,2592564,2592565,2592566,2592567,2592568,2592569,2592570,2592571,2592572,2592573,2592574,2592575,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592607,2592640,2592641,2592642,2592643,2592644,2592645,2592646,2592647,2592648,2592649,2592650,2592651,2592652,2592653,2592654,2592655,2592656,2592657,2592658,2592659,2592660,2592661,2592662,2592663,2592664,2592665,2592666,2592667,2592668,2592669,2592670,2592671,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592688,2592689,2592690,2592691,2592692,2592693,2592694,2592695,2592696,2592697,2592698,2592699,2592700,2592701,2592702,2592703,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592735],"Dirt":[2592912,2592913,2592914],"Double Pitcher Crop":[2743772,2743773,2743774,2743775],"Double Tallgrass":[2593168,2593169],"Dragon Egg":[2593426],"Dried Kelp Block":[2593683],"Dubnium":[2601393],"Dyed Candle":[2729344,2729345,2729346,2729347,2729348,2729349,2729350,2729351,2729352,2729353,2729354,2729355,2729356,2729357,2729358,2729359,2729360,2729361,2729362,2729363,2729364,2729365,2729366,2729367,2729368,2729369,2729370,2729371,2729372,2729373,2729374,2729375,2729376,2729377,2729378,2729379,2729380,2729381,2729382,2729383,2729384,2729385,2729386,2729387,2729388,2729389,2729390,2729391,2729392,2729393,2729394,2729395,2729396,2729397,2729398,2729399,2729400,2729401,2729402,2729403,2729404,2729405,2729406,2729407,2729408,2729409,2729410,2729411,2729412,2729413,2729414,2729415,2729416,2729417,2729418,2729419,2729420,2729421,2729422,2729423,2729424,2729425,2729426,2729427,2729428,2729429,2729430,2729431,2729432,2729433,2729434,2729435,2729436,2729437,2729438,2729439,2729440,2729441,2729442,2729443,2729444,2729445,2729446,2729447,2729448,2729449,2729450,2729451,2729452,2729453,2729454,2729455,2729456,2729457,2729458,2729459,2729460,2729461,2729462,2729463,2729464,2729465,2729466,2729467,2729468,2729469,2729470,2729471],"Dyed Shulker Box":[2593936,2593937,2593938,2593939,2593940,2593941,2593942,2593943,2593944,2593945,2593946,2593947,2593948,2593949,2593950,2593951],"Dysprosium":[2601650],"Einsteinium":[2601907],"Element Constructor":[2600108,2600109,2600110,2600111],"Emerald Block":[2624781],"Emerald Ore":[2625038],"Enchanting Table":[2625295],"End Portal Frame":[2625552,2625553,2625554,2625555,2625556,2625557,2625558,2625559],"End Rod":[2625808,2625809,2625810,2625811,2625812,2625813],"End Stone":[2626066],"End Stone Brick Slab":[2626321,2626322,2626323],"End Stone Brick Stairs":[2626576,2626577,2626578,2626579,2626580,2626581,2626582,2626583],"End Stone Brick Wall":[2626816,2626817,2626818,2626819,2626820,2626821,2626822,2626823,2626824,2626825,2626826,2626827,2626828,2626829,2626830,2626831,2626832,2626833,2626834,2626835,2626836,2626837,2626838,2626839,2626840,2626841,2626842,2626843,2626844,2626845,2626846,2626847,2626848,2626849,2626850,2626851,2626852,2626853,2626854,2626855,2626856,2626857,2626858,2626859,2626860,2626861,2626862,2626863,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626885,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626944,2626945,2626946,2626947,2626948,2626949,2626950,2626951,2626952,2626953,2626954,2626955,2626956,2626957,2626958,2626959,2626960,2626961,2626962,2626963,2626964,2626965,2626966,2626967,2626968,2626969,2626970,2626971,2626972,2626973,2626974,2626975,2626976,2626977,2626978,2626979,2626980,2626981,2626982,2626983,2626984,2626985,2626986,2626987,2626988,2626989,2626990,2626991,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627013,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039],"End Stone Bricks":[2627094],"Ender Chest":[2627348,2627349,2627350,2627351],"Erbium":[2602164],"Europium":[2602421],"Fake Wooden Slab":[2627608,2627609,2627610],"Farmland":[2627864,2627865,2627866,2627867,2627868,2627869,2627870,2627871],"Fermium":[2602678],"Fern":[2628122],"Fire Block":[2628368,2628369,2628370,2628371,2628372,2628373,2628374,2628375,2628376,2628377,2628378,2628379,2628380,2628381,2628382,2628383],"Flerovium":[2602935],"Fletching Table":[2628636],"Flower Pot":[2628893],"Flowering Azalea Leaves":[2736060,2736061,2736062,2736063],"Fluorine":[2603192],"Francium":[2603449],"Froglight":[2734001,2734002,2734003,2734005,2734006,2734007,2734013,2734014,2734015],"Frosted Ice":[2629148,2629149,2629150,2629151],"Furnace":[2629400,2629401,2629402,2629403,2629404,2629405,2629406,2629407],"Gadolinium":[2603706],"Gallium":[2603963],"Germanium":[2604220],"Gilded Blackstone":[2727582],"Glass":[2629664],"Glass Pane":[2629921],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735280,2735281,2735284,2735285,2735286,2735287,2735288,2735289,2735292,2735293,2735294,2735295],"Glow Lichen":[2736832,2736833,2736834,2736835,2736836,2736837,2736838,2736839,2736840,2736841,2736842,2736843,2736844,2736845,2736846,2736847,2736848,2736849,2736850,2736851,2736852,2736853,2736854,2736855,2736856,2736857,2736858,2736859,2736860,2736861,2736862,2736863,2736864,2736865,2736866,2736867,2736868,2736869,2736870,2736871,2736872,2736873,2736874,2736875,2736876,2736877,2736878,2736879,2736880,2736881,2736882,2736883,2736884,2736885,2736886,2736887,2736888,2736889,2736890,2736891,2736892,2736893,2736894,2736895],"Glowing Obsidian":[2630178],"Glowstone":[2630435],"Gold":[2604477],"Gold Block":[2630692],"Gold Ore":[2630949],"Granite":[2631206],"Granite Slab":[2631461,2631462,2631463],"Granite Stairs":[2631720,2631721,2631722,2631723,2631724,2631725,2631726,2631727],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632057,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632185],"Grass":[2632234],"Grass Path":[2632491],"Gravel":[2632748],"Green Torch":[2633514,2633515,2633516,2633517,2633518],"Hafnium":[2604734],"Hanging Roots":[2730409],"Hardened Clay":[2633776],"Hardened Glass":[2634033],"Hardened Glass Pane":[2634290],"Hassium":[2604991],"Hay Bale":[2634545,2634546,2634547],"Heat Block":[2578263],"Helium":[2605248],"Holmium":[2605505],"Honeycomb Block":[2722699],"Hopper":[2634800,2634801,2634804,2634806,2634807,2634808,2634809,2634812,2634814,2634815],"Hydrogen":[2605762],"Ice":[2635061],"Indium":[2606019],"Infested Chiseled Stone Brick":[2635318],"Infested Cobblestone":[2635575],"Infested Cracked Stone Brick":[2635832],"Infested Mossy Stone Brick":[2636089],"Infested Stone":[2636346],"Infested Stone Brick":[2636603],"Invisible Bedrock":[2637374],"Iodine":[2606276],"Iridium":[2606533],"Iron":[2606790],"Iron Bars":[2637888],"Iron Block":[2637631],"Iron Door":[2638144,2638145,2638146,2638147,2638148,2638149,2638150,2638151,2638152,2638153,2638154,2638155,2638156,2638157,2638158,2638159,2638160,2638161,2638162,2638163,2638164,2638165,2638166,2638167,2638168,2638169,2638170,2638171,2638172,2638173,2638174,2638175],"Iron Ore":[2638402],"Iron Trapdoor":[2638656,2638657,2638658,2638659,2638660,2638661,2638662,2638663,2638664,2638665,2638666,2638667,2638668,2638669,2638670,2638671],"Item Frame":[2638912,2638913,2638916,2638917,2638918,2638919,2638920,2638921,2638924,2638925,2638926,2638927],"Jack o'Lantern":[2647396,2647397,2647398,2647399],"Jukebox":[2639173],"Jungle Button":[2639426,2639427,2639428,2639429,2639430,2639431,2639434,2639435,2639436,2639437,2639438,2639439],"Jungle Door":[2639680,2639681,2639682,2639683,2639684,2639685,2639686,2639687,2639688,2639689,2639690,2639691,2639692,2639693,2639694,2639695,2639696,2639697,2639698,2639699,2639700,2639701,2639702,2639703,2639704,2639705,2639706,2639707,2639708,2639709,2639710,2639711],"Jungle Fence":[2639944],"Jungle Fence Gate":[2640192,2640193,2640194,2640195,2640196,2640197,2640198,2640199,2640200,2640201,2640202,2640203,2640204,2640205,2640206,2640207],"Jungle Leaves":[2640456,2640457,2640458,2640459],"Jungle Log":[2640712,2640713,2640714,2640715,2640718,2640719],"Jungle Planks":[2640972],"Jungle Pressure Plate":[2641228,2641229],"Jungle Sapling":[2641486,2641487],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642000,2642001,2642002],"Jungle Stairs":[2642256,2642257,2642258,2642259,2642260,2642261,2642262,2642263],"Jungle Trapdoor":[2642512,2642513,2642514,2642515,2642516,2642517,2642518,2642519,2642520,2642521,2642522,2642523,2642524,2642525,2642526,2642527],"Jungle Wall Sign":[2642768,2642769,2642770,2642771],"Jungle Wood":[2643024,2643025,2643028,2643029,2643030,2643031],"Krypton":[2607047],"Lab Table":[2643284,2643285,2643286,2643287],"Ladder":[2643540,2643541,2643542,2643543],"Lantern":[2643798,2643799],"Lanthanum":[2607304],"Lapis Lazuli Block":[2644056],"Lapis Lazuli Ore":[2644313],"Large Fern":[2644570,2644571],"Lava":[2644800,2644801,2644802,2644803,2644804,2644805,2644806,2644807,2644808,2644809,2644810,2644811,2644812,2644813,2644814,2644815,2644816,2644817,2644818,2644819,2644820,2644821,2644822,2644823,2644824,2644825,2644826,2644827,2644828,2644829,2644830,2644831],"Lava Cauldron":[2732208,2732209,2732210,2732211,2732212,2732213],"Lawrencium":[2607561],"Lead":[2607818],"Lectern":[2645080,2645081,2645082,2645083,2645084,2645085,2645086,2645087],"Legacy Stonecutter":[2645341],"Lever":[2645584,2645585,2645586,2645587,2645588,2645589,2645590,2645591,2645592,2645593,2645594,2645595,2645596,2645597,2645598,2645599],"Light Block":[2703680,2703681,2703682,2703683,2703684,2703685,2703686,2703687,2703688,2703689,2703690,2703691,2703692,2703693,2703694,2703695],"Lightning Rod":[2727834,2727835,2727836,2727837,2727838,2727839],"Lilac":[2646368,2646369],"Lily Pad":[2646883],"Lily of the Valley":[2646626],"Lithium":[2608075],"Livermorium":[2608332],"Loom":[2647652,2647653,2647654,2647655],"Lutetium":[2608589],"Magma Block":[2648168],"Magnesium":[2608846],"Manganese":[2609103],"Mangrove Button":[2717040,2717041,2717044,2717045,2717046,2717047,2717048,2717049,2717052,2717053,2717054,2717055],"Mangrove Door":[2718560,2718561,2718562,2718563,2718564,2718565,2718566,2718567,2718568,2718569,2718570,2718571,2718572,2718573,2718574,2718575,2718576,2718577,2718578,2718579,2718580,2718581,2718582,2718583,2718584,2718585,2718586,2718587,2718588,2718589,2718590,2718591],"Mangrove Fence":[2713190],"Mangrove Fence Gate":[2719344,2719345,2719346,2719347,2719348,2719349,2719350,2719351,2719352,2719353,2719354,2719355,2719356,2719357,2719358,2719359],"Mangrove Leaves":[2735548,2735549,2735550,2735551],"Mangrove Log":[2714728,2714729,2714732,2714733,2714734,2714735],"Mangrove Planks":[2712419],"Mangrove Pressure Plate":[2717816,2717817],"Mangrove Roots":[2733493],"Mangrove Sign":[2720896,2720897,2720898,2720899,2720900,2720901,2720902,2720903,2720904,2720905,2720906,2720907,2720908,2720909,2720910,2720911],"Mangrove Slab":[2713960,2713961,2713963],"Mangrove Stairs":[2720128,2720129,2720130,2720131,2720132,2720133,2720134,2720135],"Mangrove Trapdoor":[2716272,2716273,2716274,2716275,2716276,2716277,2716278,2716279,2716280,2716281,2716282,2716283,2716284,2716285,2716286,2716287],"Mangrove Wall Sign":[2721668,2721669,2721670,2721671],"Mangrove Wood":[2715498,2715499,2715500,2715501,2715502,2715503],"Material Reducer":[2648424,2648425,2648426,2648427],"Meitnerium":[2609360],"Melon Block":[2648682],"Melon Stem":[2648896,2648897,2648898,2648899,2648900,2648901,2648902,2648903,2648904,2648905,2648906,2648907,2648908,2648909,2648910,2648911,2648928,2648929,2648930,2648931,2648932,2648933,2648934,2648935,2648944,2648945,2648946,2648947,2648948,2648949,2648950,2648951,2648952,2648953,2648954,2648955,2648956,2648957,2648958,2648959],"Mendelevium":[2609617],"Mercury":[2609874],"Mob Head":[2649152,2649153,2649154,2649156,2649157,2649158,2649159,2649160,2649161,2649162,2649164,2649165,2649166,2649167,2649184,2649185,2649186,2649188,2649189,2649190,2649191,2649200,2649201,2649202,2649204,2649205,2649206,2649207,2649208,2649209,2649210,2649212,2649213,2649214,2649215],"Molybdenum":[2610131],"Monster Spawner":[2649453],"Moscovium":[2610388],"Mossy Cobblestone":[2649710],"Mossy Cobblestone Slab":[2649965,2649966,2649967],"Mossy Cobblestone Stairs":[2650224,2650225,2650226,2650227,2650228,2650229,2650230,2650231],"Mossy Cobblestone Wall":[2650401,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650448,2650449,2650450,2650451,2650452,2650453,2650454,2650455,2650456,2650457,2650458,2650459,2650460,2650461,2650462,2650463,2650464,2650465,2650466,2650467,2650468,2650469,2650470,2650471,2650472,2650473,2650474,2650475,2650476,2650477,2650478,2650479,2650480,2650481,2650482,2650483,2650484,2650485,2650486,2650487,2650488,2650489,2650490,2650491,2650492,2650493,2650494,2650495,2650529,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650576,2650577,2650578,2650579,2650580,2650581,2650582,2650583,2650584,2650585,2650586,2650587,2650588,2650589,2650590,2650591,2650592,2650593,2650594,2650595,2650596,2650597,2650598,2650599,2650600,2650601,2650602,2650603,2650604,2650605,2650606,2650607,2650608,2650609,2650610,2650611,2650612,2650613,2650614,2650615,2650616,2650617,2650618,2650619,2650620,2650621,2650622,2650623],"Mossy Stone Brick Slab":[2650736,2650738,2650739],"Mossy Stone Brick Stairs":[2650992,2650993,2650994,2650995,2650996,2650997,2650998,2650999],"Mossy Stone Brick Wall":[2651172,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651300,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651509],"Mud":[2725526],"Mud Brick Slab":[2726040,2726041,2726042],"Mud Brick Stairs":[2726296,2726297,2726298,2726299,2726300,2726301,2726302,2726303],"Mud Brick Wall":[2726400,2726401,2726402,2726403,2726404,2726405,2726406,2726407,2726408,2726409,2726410,2726411,2726412,2726413,2726414,2726415,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726432,2726433,2726434,2726435,2726436,2726437,2726438,2726439,2726440,2726441,2726442,2726443,2726444,2726445,2726446,2726447,2726448,2726449,2726450,2726451,2726452,2726453,2726454,2726455,2726456,2726457,2726458,2726459,2726460,2726461,2726462,2726463,2726474,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726528,2726529,2726530,2726531,2726532,2726533,2726534,2726535,2726536,2726537,2726538,2726539,2726540,2726541,2726542,2726543,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726560,2726561,2726562,2726563,2726564,2726565,2726566,2726567,2726568,2726569,2726570,2726571,2726572,2726573,2726574,2726575,2726576,2726577,2726578,2726579,2726580,2726581,2726582,2726583,2726584,2726585,2726586,2726587,2726588,2726589,2726590,2726591,2726602,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623],"Mud Bricks":[2725783],"Muddy Mangrove Roots":[2733748,2733750,2733751],"Mushroom Stem":[2651766],"Mycelium":[2652023],"Neodymium":[2610645],"Neon":[2610902],"Neptunium":[2611159],"Nether Brick Fence":[2652280],"Nether Brick Slab":[2652536,2652537,2652539],"Nether Brick Stairs":[2652792,2652793,2652794,2652795,2652796,2652797,2652798,2652799],"Nether Brick Wall":[2652971,2652976,2652977,2652978,2652979,2652980,2652981,2652982,2652983,2652984,2652985,2652986,2652987,2652988,2652989,2652990,2652991,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653099,2653104,2653105,2653106,2653107,2653108,2653109,2653110,2653111,2653112,2653113,2653114,2653115,2653116,2653117,2653118,2653119,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653308],"Nether Gold Ore":[2725269],"Nether Portal":[2653564,2653565],"Nether Quartz Ore":[2653822],"Nether Reactor Core":[2654079],"Nether Wart":[2654336,2654337,2654338,2654339],"Nether Wart Block":[2654593],"Netherite Block":[2731180],"Netherrack":[2654850],"Nickel":[2611416],"Nihonium":[2611673],"Niobium":[2611930],"Nitrogen":[2612187],"Nobelium":[2612444],"Note Block":[2655107],"Oak Button":[2655360,2655361,2655364,2655365,2655366,2655367,2655368,2655369,2655372,2655373,2655374,2655375],"Oak Door":[2655616,2655617,2655618,2655619,2655620,2655621,2655622,2655623,2655624,2655625,2655626,2655627,2655628,2655629,2655630,2655631,2655632,2655633,2655634,2655635,2655636,2655637,2655638,2655639,2655640,2655641,2655642,2655643,2655644,2655645,2655646,2655647],"Oak Fence":[2655878],"Oak Fence Gate":[2656128,2656129,2656130,2656131,2656132,2656133,2656134,2656135,2656136,2656137,2656138,2656139,2656140,2656141,2656142,2656143],"Oak Leaves":[2656392,2656393,2656394,2656395],"Oak Log":[2656648,2656649,2656650,2656651,2656652,2656653],"Oak Planks":[2656906],"Oak Pressure Plate":[2657162,2657163],"Oak Sapling":[2657420,2657421],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2657932,2657934,2657935],"Oak Stairs":[2658184,2658185,2658186,2658187,2658188,2658189,2658190,2658191],"Oak Trapdoor":[2658448,2658449,2658450,2658451,2658452,2658453,2658454,2658455,2658456,2658457,2658458,2658459,2658460,2658461,2658462,2658463],"Oak Wall Sign":[2658704,2658705,2658706,2658707],"Oak Wood":[2658960,2658961,2658962,2658963,2658966,2658967],"Obsidian":[2659219],"Oganesson":[2612701],"Orange Tulip":[2659733],"Osmium":[2612958],"Oxeye Daisy":[2659990],"Oxygen":[2613215],"Packed Ice":[2660247],"Packed Mud":[2726811],"Palladium":[2613472],"Peony":[2660504,2660505],"Phosphorus":[2613729],"Pink Petals":[2741712,2741713,2741714,2741715,2741716,2741717,2741718,2741719,2741720,2741721,2741722,2741723,2741724,2741725,2741726,2741727],"Pink Tulip":[2661018],"Pitcher Crop":[2743516,2743517,2743518],"Pitcher Plant":[2743258,2743259],"Platinum":[2613986],"Plutonium":[2614243],"Podzol":[2661275],"Polished Andesite":[2661532],"Polished Andesite Slab":[2661788,2661789,2661791],"Polished Andesite Stairs":[2662040,2662041,2662042,2662043,2662044,2662045,2662046,2662047],"Polished Basalt":[2699053,2699054,2699055],"Polished Blackstone":[2700597],"Polished Blackstone Brick Slab":[2702652,2702653,2702655],"Polished Blackstone Brick Stairs":[2702904,2702905,2702906,2702907,2702908,2702909,2702910,2702911],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703215,2703216,2703217,2703218,2703219,2703220,2703221,2703222,2703223,2703224,2703225,2703226,2703227,2703228,2703229,2703230,2703231,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703343,2703344,2703345,2703346,2703347,2703348,2703349,2703350,2703351,2703352,2703353,2703354,2703355,2703356,2703357,2703358,2703359],"Polished Blackstone Bricks":[2702396],"Polished Blackstone Button":[2700850,2700851,2700852,2700853,2700854,2700855,2700858,2700859,2700860,2700861,2700862,2700863],"Polished Blackstone Pressure Plate":[2701110,2701111],"Polished Blackstone Slab":[2701368,2701369,2701370],"Polished Blackstone Stairs":[2701624,2701625,2701626,2701627,2701628,2701629,2701630,2701631],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701930,2701936,2701937,2701938,2701939,2701940,2701941,2701942,2701943,2701944,2701945,2701946,2701947,2701948,2701949,2701950,2701951,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702058,2702064,2702065,2702066,2702067,2702068,2702069,2702070,2702071,2702072,2702073,2702074,2702075,2702076,2702077,2702078,2702079],"Polished Deepslate":[2708821],"Polished Deepslate Slab":[2709076,2709078,2709079],"Polished Deepslate Stairs":[2709328,2709329,2709330,2709331,2709332,2709333,2709334,2709335],"Polished Deepslate Wall":[2709512,2709520,2709521,2709522,2709523,2709524,2709525,2709526,2709527,2709528,2709529,2709530,2709531,2709532,2709533,2709534,2709535,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709640,2709648,2709649,2709650,2709651,2709652,2709653,2709654,2709655,2709656,2709657,2709658,2709659,2709660,2709661,2709662,2709663,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662303],"Polished Diorite Slab":[2662560,2662561,2662562],"Polished Diorite Stairs":[2662816,2662817,2662818,2662819,2662820,2662821,2662822,2662823],"Polished Granite":[2663074],"Polished Granite Slab":[2663329,2663330,2663331],"Polished Granite Stairs":[2663584,2663585,2663586,2663587,2663588,2663589,2663590,2663591],"Polonium":[2614500],"Poppy":[2663845],"Potassium":[2614757],"Potato Block":[2664096,2664097,2664098,2664099,2664100,2664101,2664102,2664103],"Potion Cauldron":[2732464,2732465,2732466,2732467,2732468,2732469],"Powered Rail":[2664354,2664355,2664356,2664357,2664358,2664359,2664362,2664363,2664364,2664365,2664366,2664367],"Praseodymium":[2615014],"Prismarine":[2664616],"Prismarine Bricks":[2664873],"Prismarine Bricks Slab":[2665128,2665130,2665131],"Prismarine Bricks Stairs":[2665384,2665385,2665386,2665387,2665388,2665389,2665390,2665391],"Prismarine Slab":[2665644,2665645,2665646],"Prismarine Stairs":[2665896,2665897,2665898,2665899,2665900,2665901,2665902,2665903],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666080,2666081,2666082,2666083,2666084,2666085,2666086,2666087,2666088,2666089,2666090,2666091,2666092,2666093,2666094,2666095,2666110,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666208,2666209,2666210,2666211,2666212,2666213,2666214,2666215,2666216,2666217,2666218,2666219,2666220,2666221,2666222,2666223,2666238],"Promethium":[2615271],"Protactinium":[2615528],"Pumpkin":[2666415],"Pumpkin Stem":[2666640,2666641,2666642,2666643,2666644,2666645,2666646,2666647,2666648,2666649,2666650,2666651,2666652,2666653,2666654,2666655,2666656,2666657,2666658,2666659,2666660,2666661,2666662,2666663,2666664,2666665,2666666,2666667,2666668,2666669,2666670,2666671,2666680,2666681,2666682,2666683,2666684,2666685,2666686,2666687],"Purple Torch":[2667184,2667185,2667187,2667190,2667191],"Purpur Block":[2667443],"Purpur Pillar":[2667700,2667701,2667702],"Purpur Slab":[2667956,2667957,2667959],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668471],"Quartz Bricks":[2709849],"Quartz Pillar":[2668728,2668729,2668730],"Quartz Slab":[2668984,2668985,2668987],"Quartz Stairs":[2669240,2669241,2669242,2669243,2669244,2669245,2669246,2669247],"Radium":[2615785],"Radon":[2616042],"Rail":[2669490,2669491,2669496,2669497,2669498,2669499,2669500,2669501,2669502,2669503],"Raw Copper Block":[2703938],"Raw Gold Block":[2704195],"Raw Iron Block":[2704452],"Red Mushroom":[2670013],"Red Mushroom Block":[2670260,2670262,2670263,2670264,2670265,2670266,2670267,2670268,2670269,2670270,2670271],"Red Nether Brick Slab":[2670525,2670526,2670527],"Red Nether Brick Stairs":[2670784,2670785,2670786,2670787,2670788,2670789,2670790,2670791],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670865,2670912,2670913,2670914,2670915,2670916,2670917,2670918,2670919,2670920,2670921,2670922,2670923,2670924,2670925,2670926,2670927,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670944,2670945,2670946,2670947,2670948,2670949,2670950,2670951,2670952,2670953,2670954,2670955,2670956,2670957,2670958,2670959,2670960,2670961,2670962,2670963,2670964,2670965,2670966,2670967,2670968,2670969,2670970,2670971,2670972,2670973,2670974,2670975,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670993,2671040,2671041,2671042,2671043,2671044,2671045,2671046,2671047,2671048,2671049,2671050,2671051,2671052,2671053,2671054,2671055,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071,2671072,2671073,2671074,2671075,2671076,2671077,2671078,2671079,2671080,2671081,2671082,2671083,2671084,2671085,2671086,2671087,2671088,2671089,2671090,2671091,2671092,2671093,2671094,2671095,2671096,2671097,2671098,2671099,2671100,2671101,2671102,2671103],"Red Nether Bricks":[2671298],"Red Sand":[2671555],"Red Sandstone":[2671812],"Red Sandstone Slab":[2672068,2672069,2672071],"Red Sandstone Stairs":[2672320,2672321,2672322,2672323,2672324,2672325,2672326,2672327],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672407,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672535,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672841,2672842,2672843,2672844,2672845],"Red Tulip":[2673097],"Redstone":[2674896,2674897,2674898,2674899,2674900,2674901,2674902,2674903,2674904,2674905,2674906,2674907,2674908,2674909,2674910,2674911],"Redstone Block":[2673354],"Redstone Comparator":[2673600,2673601,2673602,2673603,2673604,2673605,2673606,2673607,2673608,2673609,2673610,2673611,2673612,2673613,2673614,2673615],"Redstone Lamp":[2673868,2673869],"Redstone Ore":[2674124,2674125],"Redstone Repeater":[2674368,2674369,2674370,2674371,2674372,2674373,2674374,2674375,2674376,2674377,2674378,2674379,2674380,2674381,2674382,2674383,2674384,2674385,2674386,2674387,2674388,2674389,2674390,2674391,2674392,2674393,2674394,2674395,2674396,2674397,2674398,2674399],"Redstone Torch":[2674626,2674627,2674628,2674629,2674630,2674634,2674635,2674636,2674637,2674638],"Reinforced Deepslate":[2736320],"Rhenium":[2616299],"Rhodium":[2616556],"Roentgenium":[2616813],"Rose Bush":[2675410,2675411],"Rubidium":[2617070],"Ruthenium":[2617327],"Rutherfordium":[2617584],"Samarium":[2617841],"Sand":[2675667],"Sandstone":[2675924],"Sandstone Slab":[2676180,2676181,2676183],"Sandstone Stairs":[2676432,2676433,2676434,2676435,2676436,2676437,2676438,2676439],"Sandstone Wall":[2676487,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676560,2676561,2676562,2676563,2676564,2676565,2676566,2676567,2676568,2676569,2676570,2676571,2676572,2676573,2676574,2676575,2676576,2676577,2676578,2676579,2676580,2676581,2676582,2676583,2676584,2676585,2676586,2676587,2676588,2676589,2676590,2676591,2676592,2676593,2676594,2676595,2676596,2676597,2676598,2676599,2676600,2676601,2676602,2676603,2676604,2676605,2676606,2676607,2676615,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676688,2676689,2676690,2676691,2676692,2676693,2676694,2676695,2676696,2676697,2676698,2676699,2676700,2676701,2676702,2676703,2676704,2676705,2676706,2676707,2676708,2676709,2676710,2676711,2676712,2676713,2676714,2676715,2676716,2676717,2676718,2676719,2676720,2676721,2676722,2676723,2676724,2676725,2676726,2676727,2676728,2676729,2676730,2676731,2676732,2676733,2676734,2676735],"Scandium":[2618098],"Sculk":[2735035],"Sea Lantern":[2676952],"Sea Pickle":[2677208,2677209,2677210,2677211,2677212,2677213,2677214,2677215],"Seaborgium":[2618355],"Selenium":[2618612],"Shroomlight":[2712162],"Shulker Box":[2677466],"Silicon":[2618869],"Silver":[2619126],"Slime Block":[2677723],"Small Dripleaf":[2740944,2740945,2740946,2740947,2740948,2740949,2740950,2740951],"Smithing Table":[2730923],"Smoker":[2677976,2677977,2677978,2677979,2677980,2677981,2677982,2677983],"Smooth Basalt":[2699312],"Smooth Quartz Block":[2678237],"Smooth Quartz Slab":[2678492,2678494,2678495],"Smooth Quartz Stairs":[2678744,2678745,2678746,2678747,2678748,2678749,2678750,2678751],"Smooth Red Sandstone":[2679008],"Smooth Red Sandstone Slab":[2679264,2679265,2679267],"Smooth Red Sandstone Stairs":[2679520,2679521,2679522,2679523,2679524,2679525,2679526,2679527],"Smooth Sandstone":[2679779],"Smooth Sandstone Slab":[2680036,2680037,2680038],"Smooth Sandstone Stairs":[2680288,2680289,2680290,2680291,2680292,2680293,2680294,2680295],"Smooth Stone":[2680550],"Smooth Stone Slab":[2680805,2680806,2680807],"Snow Block":[2681064],"Snow Layer":[2681320,2681321,2681322,2681323,2681324,2681325,2681326,2681327],"Sodium":[2619383],"Soul Fire":[2711905],"Soul Lantern":[2711390,2711391],"Soul Sand":[2681578],"Soul Soil":[2711648],"Soul Torch":[2711130,2711131,2711132,2711133,2711135],"Sponge":[2681834,2681835],"Spore Blossom":[2731437],"Spruce Button":[2682080,2682081,2682084,2682085,2682086,2682087,2682088,2682089,2682092,2682093,2682094,2682095],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682606],"Spruce Fence Gate":[2682848,2682849,2682850,2682851,2682852,2682853,2682854,2682855,2682856,2682857,2682858,2682859,2682860,2682861,2682862,2682863],"Spruce Leaves":[2683120,2683121,2683122,2683123],"Spruce Log":[2683376,2683377,2683378,2683379,2683380,2683381],"Spruce Planks":[2683634],"Spruce Pressure Plate":[2683890,2683891],"Spruce Sapling":[2684148,2684149],"Spruce Sign":[2684400,2684401,2684402,2684403,2684404,2684405,2684406,2684407,2684408,2684409,2684410,2684411,2684412,2684413,2684414,2684415],"Spruce Slab":[2684660,2684662,2684663],"Spruce Stairs":[2684912,2684913,2684914,2684915,2684916,2684917,2684918,2684919],"Spruce Trapdoor":[2685168,2685169,2685170,2685171,2685172,2685173,2685174,2685175,2685176,2685177,2685178,2685179,2685180,2685181,2685182,2685183],"Spruce Wall Sign":[2685432,2685433,2685434,2685435],"Spruce Wood":[2685688,2685689,2685690,2685691,2685694,2685695],"Stained Clay":[2685936,2685937,2685938,2685939,2685940,2685941,2685942,2685943,2685944,2685945,2685946,2685947,2685948,2685949,2685950,2685951],"Stained Glass":[2686192,2686193,2686194,2686195,2686196,2686197,2686198,2686199,2686200,2686201,2686202,2686203,2686204,2686205,2686206,2686207],"Stained Glass Pane":[2686448,2686449,2686450,2686451,2686452,2686453,2686454,2686455,2686456,2686457,2686458,2686459,2686460,2686461,2686462,2686463],"Stained Hardened Glass":[2686704,2686705,2686706,2686707,2686708,2686709,2686710,2686711,2686712,2686713,2686714,2686715,2686716,2686717,2686718,2686719],"Stained Hardened Glass Pane":[2686960,2686961,2686962,2686963,2686964,2686965,2686966,2686967,2686968,2686969,2686970,2686971,2686972,2686973,2686974,2686975],"Stone":[2686976],"Stone Brick Slab":[2687232,2687233,2687235],"Stone Brick Stairs":[2687488,2687489,2687490,2687491,2687492,2687493,2687494,2687495],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687760,2687761,2687762,2687763,2687764,2687765,2687766,2687767,2687768,2687769,2687770,2687771,2687772,2687773,2687774,2687775,2687776,2687777,2687778,2687779,2687780,2687781,2687782,2687783,2687784,2687785,2687786,2687787,2687788,2687789,2687790,2687791,2687792,2687793,2687794,2687795,2687796,2687797,2687798,2687799,2687800,2687801,2687802,2687803,2687804,2687805,2687806,2687807,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687827,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687888,2687889,2687890,2687891,2687892,2687893,2687894,2687895,2687896,2687897,2687898,2687899,2687900,2687901,2687902,2687903,2687904,2687905,2687906,2687907,2687908,2687909,2687910,2687911,2687912,2687913,2687914,2687915,2687916,2687917,2687918,2687919,2687920,2687921,2687922,2687923,2687924,2687925,2687926,2687927,2687928,2687929,2687930,2687931,2687932,2687933,2687934,2687935,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687955],"Stone Bricks":[2688004],"Stone Button":[2688256,2688257,2688260,2688261,2688262,2688263,2688264,2688265,2688268,2688269,2688270,2688271],"Stone Pressure Plate":[2688518,2688519],"Stone Slab":[2688773,2688774,2688775],"Stone Stairs":[2689032,2689033,2689034,2689035,2689036,2689037,2689038,2689039],"Stonecutter":[2689288,2689289,2689290,2689291],"Strontium":[2619640],"Sugarcane":[2692624,2692625,2692626,2692627,2692628,2692629,2692630,2692631,2692632,2692633,2692634,2692635,2692636,2692637,2692638,2692639],"Sulfur":[2619897],"Sunflower":[2692886,2692887],"Sweet Berry Bush":[2693144,2693145,2693146,2693147],"TNT":[2693656,2693657,2693658,2693659],"Tall Grass":[2693401],"Tantalum":[2620154],"Technetium":[2620411],"Tellurium":[2620668],"Tennessine":[2620925],"Terbium":[2621182],"Thallium":[2621439],"Thorium":[2621440],"Thulium":[2621697],"Tin":[2621954],"Tinted Glass":[2722442],"Titanium":[2622211],"Torch":[2693912,2693913,2693914,2693918,2693919],"Torchflower":[2742745],"Torchflower Crop":[2743002,2743003],"Trapped Chest":[2694172,2694173,2694174,2694175],"Tripwire":[2694416,2694417,2694418,2694419,2694420,2694421,2694422,2694423,2694424,2694425,2694426,2694427,2694428,2694429,2694430,2694431],"Tripwire Hook":[2694672,2694673,2694674,2694675,2694676,2694677,2694678,2694679,2694680,2694681,2694682,2694683,2694684,2694685,2694686,2694687],"Tuff":[2710877],"Tungsten":[2622468],"Twisting Vines":[2734240,2734241,2734248,2734249,2734250,2734251,2734252,2734253,2734254,2734255,2734256,2734257,2734258,2734259,2734260,2734261,2734262,2734263,2734264,2734265,2734266,2734267,2734268,2734269,2734270,2734271],"Underwater Torch":[2694938,2694939,2694940,2694941,2694942],"Uranium":[2622725],"Vanadium":[2622982],"Vines":[2695200,2695201,2695202,2695203,2695204,2695205,2695206,2695207,2695208,2695209,2695210,2695211,2695212,2695213,2695214,2695215],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695680,2695681,2695682,2695683,2695686,2695688,2695689,2695690,2695691,2695694,2695696,2695697,2695698,2695699,2695702,2695704,2695705,2695706,2695707,2695710,2695712,2695713,2695714,2695715,2695718,2695720,2695721,2695722,2695723,2695726,2695728,2695729,2695730,2695731,2695734,2695736,2695737,2695738,2695739,2695742],"Warped Button":[2717554,2717555,2717556,2717557,2717558,2717559,2717562,2717563,2717564,2717565,2717566,2717567],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713704],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716016,2716017,2716018,2716019,2716020,2716021],"Warped Planks":[2712933],"Warped Pressure Plate":[2718330,2718331],"Warped Roots":[2742231],"Warped Sign":[2721408,2721409,2721410,2721411,2721412,2721413,2721414,2721415,2721416,2721417,2721418,2721419,2721420,2721421,2721422,2721423],"Warped Slab":[2714473,2714474,2714475],"Warped Stairs":[2720640,2720641,2720642,2720643,2720644,2720645,2720646,2720647],"Warped Stem":[2715242,2715243,2715244,2715245,2715246,2715247],"Warped Trapdoor":[2716784,2716785,2716786,2716787,2716788,2716789,2716790,2716791,2716792,2716793,2716794,2716795,2716796,2716797,2716798,2716799],"Warped Wall Sign":[2722184,2722185,2722186,2722187],"Warped Wart Block":[2727068],"Water":[2695968,2695969,2695970,2695971,2695972,2695973,2695974,2695975,2695976,2695977,2695978,2695979,2695980,2695981,2695982,2695983,2695984,2695985,2695986,2695987,2695988,2695989,2695990,2695991,2695992,2695993,2695994,2695995,2695996,2695997,2695998,2695999],"Water Cauldron":[2731946,2731947,2731948,2731949,2731950,2731951],"Weeping Vines":[2734496,2734497,2734504,2734505,2734506,2734507,2734508,2734509,2734510,2734511,2734512,2734513,2734514,2734515,2734516,2734517,2734518,2734519,2734520,2734521,2734522,2734523,2734524,2734525,2734526,2734527],"Weighted Pressure Plate Heavy":[2696224,2696225,2696226,2696227,2696228,2696229,2696230,2696231,2696232,2696233,2696234,2696235,2696236,2696237,2696238,2696239],"Weighted Pressure Plate Light":[2696480,2696481,2696482,2696483,2696484,2696485,2696486,2696487,2696488,2696489,2696490,2696491,2696492,2696493,2696494,2696495],"Wheat Block":[2696736,2696737,2696738,2696739,2696740,2696741,2696742,2696743],"White Tulip":[2697256],"Wither Rose":[2730152],"Wool":[2697504,2697505,2697506,2697507,2697508,2697509,2697510,2697511,2697512,2697513,2697514,2697515,2697516,2697517,2697518,2697519],"Xenon":[2623239],"Ytterbium":[2623496],"Yttrium":[2623753],"Zinc":[2624267],"Zirconium":[2624524],"ate!upd":[2637117],"reserved6":[2675153],"update!":[2636860]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[2624113],"Acacia Button":[2560272,2560273,2560276,2560277,2560278,2560279,2560280,2560281,2560284,2560285,2560286,2560287],"Acacia Door":[2560704,2560705,2560706,2560707,2560708,2560709,2560710,2560711,2560712,2560713,2560714,2560715,2560716,2560717,2560718,2560719,2560720,2560721,2560722,2560723,2560724,2560725,2560726,2560727,2560728,2560729,2560730,2560731,2560732,2560733,2560734,2560735],"Acacia Fence":[2561017],"Acacia Fence Gate":[2561136,2561137,2561138,2561139,2561140,2561141,2561142,2561143,2561144,2561145,2561146,2561147,2561148,2561149,2561150,2561151],"Acacia Leaves":[2561444,2561445,2561446,2561447],"Acacia Log":[2561576,2561577,2561578,2561579,2561582,2561583],"Acacia Planks":[2561834],"Acacia Pressure Plate":[2562296,2562297],"Acacia Sapling":[2562386,2562387],"Acacia Sign":[2562560,2562561,2562562,2562563,2562564,2562565,2562566,2562567,2562568,2562569,2562570,2562571,2562572,2562573,2562574,2562575],"Acacia Slab":[2562836,2562837,2562838],"Acacia Stairs":[2563176,2563177,2563178,2563179,2563180,2563181,2563182,2563183],"Acacia Trapdoor":[2563456,2563457,2563458,2563459,2563460,2563461,2563462,2563463,2563464,2563465,2563466,2563467,2563468,2563469,2563470,2563471],"Acacia Wall Sign":[2563768,2563769,2563770,2563771],"Acacia Wood":[2563984,2563985,2563986,2563987,2563988,2563989],"Actinium":[2594209],"Activator Rail":[2564338,2564339,2564340,2564341,2564342,2564343,2564346,2564347,2564348,2564349,2564350,2564351],"Air":[2560220],"All Sided Mushroom Stem":[2564457],"Allium":[2564668],"Aluminum":[2594489],"Americium":[2594724],"Amethyst":[2698349],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697776,2697777,2697778,2697779,2697780,2697781,2697782,2697783],"Ancient Debris":[2698682],"Andesite":[2564865],"Andesite Slab":[2565208,2565210,2565211],"Andesite Stairs":[2565528,2565529,2565530,2565531,2565532,2565533,2565534,2565535],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565654,2565696,2565697,2565698,2565699,2565700,2565701,2565702,2565703,2565704,2565705,2565706,2565707,2565708,2565709,2565710,2565711,2565712,2565713,2565714,2565715,2565716,2565717,2565718,2565719,2565720,2565721,2565722,2565723,2565724,2565725,2565726,2565727,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565744,2565745,2565746,2565747,2565748,2565749,2565750,2565751,2565752,2565753,2565754,2565755,2565756,2565757,2565758,2565759,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565782,2565824,2565825,2565826,2565827,2565828,2565829,2565830,2565831,2565832,2565833,2565834,2565835,2565836,2565837,2565838,2565839,2565840,2565841,2565842,2565843,2565844,2565845,2565846,2565847,2565848,2565849,2565850,2565851,2565852,2565853,2565854,2565855,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565872,2565873,2565874,2565875,2565876,2565877,2565878,2565879,2565880,2565881,2565882,2565883,2565884,2565885,2565886,2565887],"Antimony":[2595005],"Anvil":[2565936,2565937,2565939,2565940,2565941,2565943,2565944,2565945,2565947,2565948,2565949,2565951],"Argon":[2595322],"Arsenic":[2595370],"Astatine":[2595621],"Azalea Leaves":[2735748,2735749,2735750,2735751],"Azure Bluet":[2566231],"Bamboo":[2566465,2566466,2566467,2566469,2566470,2566471,2566473,2566474,2566475,2566477,2566478,2566479],"Bamboo Sapling":[2566668,2566669],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595884],"Barrel":[2567344,2567345,2567346,2567347,2567350,2567351,2567352,2567353,2567354,2567355,2567358,2567359],"Barrier":[2567542],"Basalt":[2698760,2698761,2698762],"Beacon":[2567785],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568196,2568197],"Beetroot Block":[2568656,2568657,2568658,2568659,2568660,2568661,2568662,2568663],"Bell":[2568768,2568769,2568770,2568771,2568772,2568773,2568774,2568775,2568776,2568777,2568778,2568779,2568780,2568781,2568782,2568783],"Berkelium":[2596102],"Beryllium":[2596419],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741448,2741449,2741450,2741451],"Birch Button":[2568992,2568993,2568994,2568995,2568998,2568999,2569000,2569001,2569002,2569003,2569006,2569007],"Birch Door":[2569312,2569313,2569314,2569315,2569316,2569317,2569318,2569319,2569320,2569321,2569322,2569323,2569324,2569325,2569326,2569327,2569328,2569329,2569330,2569331,2569332,2569333,2569334,2569335,2569336,2569337,2569338,2569339,2569340,2569341,2569342,2569343],"Birch Fence":[2569526],"Birch Fence Gate":[2569904,2569905,2569906,2569907,2569908,2569909,2569910,2569911,2569912,2569913,2569914,2569915,2569916,2569917,2569918,2569919],"Birch Leaves":[2570200,2570201,2570202,2570203],"Birch Log":[2570432,2570433,2570436,2570437,2570438,2570439],"Birch Planks":[2570714],"Birch Pressure Plate":[2570946,2570947],"Birch Sapling":[2571148,2571149],"Birch Sign":[2571408,2571409,2571410,2571411,2571412,2571413,2571414,2571415,2571416,2571417,2571418,2571419,2571420,2571421,2571422,2571423],"Birch Slab":[2571532,2571533,2571534],"Birch Stairs":[2571880,2571881,2571882,2571883,2571884,2571885,2571886,2571887],"Birch Trapdoor":[2572272,2572273,2572274,2572275,2572276,2572277,2572278,2572279,2572280,2572281,2572282,2572283,2572284,2572285,2572286,2572287],"Birch Wall Sign":[2572492,2572493,2572494,2572495],"Birch Wood":[2572762,2572763,2572764,2572765,2572766,2572767],"Bismuth":[2596655],"Blackstone":[2699667],"Blackstone Slab":[2699812,2699814,2699815],"Blackstone Stairs":[2700040,2700041,2700042,2700043,2700044,2700045,2700046,2700047],"Blackstone Wall":[2700290,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700352,2700353,2700354,2700355,2700356,2700357,2700358,2700359,2700360,2700361,2700362,2700363,2700364,2700365,2700366,2700367,2700368,2700369,2700370,2700371,2700372,2700373,2700374,2700375,2700376,2700377,2700378,2700379,2700380,2700381,2700382,2700383,2700384,2700385,2700386,2700387,2700388,2700389,2700390,2700391,2700392,2700393,2700394,2700395,2700396,2700397,2700398,2700399,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700418,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700480,2700481,2700482,2700483,2700484,2700485,2700486,2700487,2700488,2700489,2700490,2700491,2700492,2700493,2700494,2700495,2700496,2700497,2700498,2700499,2700500,2700501,2700502,2700503,2700504,2700505,2700506,2700507,2700508,2700509,2700510,2700511,2700512,2700513,2700514,2700515,2700516,2700517,2700518,2700519,2700520,2700521,2700522,2700523,2700524,2700525,2700526,2700527,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573168,2573169,2573170,2573171,2573172,2573173,2573174,2573175],"Blue Ice":[2573619],"Blue Orchid":[2574037],"Blue Torch":[2574128,2574129,2574133,2574134,2574135],"Bohrium":[2596992],"Bone Block":[2574452,2574453,2574455],"Bookshelf":[2574696],"Boron":[2597121],"Brewing Stand":[2574960,2574961,2574962,2574963,2574964,2574965,2574966,2574967],"Brick Slab":[2575184,2575185,2575187],"Brick Stairs":[2575608,2575609,2575610,2575611,2575612,2575613,2575614,2575615],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575632,2575633,2575634,2575635,2575636,2575637,2575638,2575639,2575640,2575641,2575642,2575643,2575644,2575645,2575646,2575647,2575648,2575649,2575650,2575651,2575652,2575653,2575654,2575655,2575656,2575657,2575658,2575659,2575660,2575661,2575662,2575663,2575664,2575665,2575666,2575667,2575668,2575669,2575670,2575671,2575672,2575673,2575674,2575675,2575676,2575677,2575678,2575679,2575717,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575760,2575761,2575762,2575763,2575764,2575765,2575766,2575767,2575768,2575769,2575770,2575771,2575772,2575773,2575774,2575775,2575776,2575777,2575778,2575779,2575780,2575781,2575782,2575783,2575784,2575785,2575786,2575787,2575788,2575789,2575790,2575791,2575792,2575793,2575794,2575795,2575796,2575797,2575798,2575799,2575800,2575801,2575802,2575803,2575804,2575805,2575806,2575807,2575845,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575954],"Bromine":[2597549],"Brown Mushroom":[2576600],"Brown Mushroom Block":[2576784,2576785,2576786,2576787,2576788,2576789,2576790,2576791,2576796,2576797,2576799],"Budding Amethyst":[2697080],"Cactus":[2577088,2577089,2577090,2577091,2577092,2577093,2577094,2577095,2577096,2577097,2577098,2577099,2577100,2577101,2577102,2577103],"Cadmium":[2597701],"Cake":[2577240,2577241,2577242,2577243,2577244,2577245,2577246],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729856,2729857,2729858,2729859,2729860,2729861,2729862,2729863,2729864,2729865,2729866,2729867,2729868,2729869,2729870,2729871,2729872,2729873,2729874,2729875,2729876,2729877,2729878,2729879,2729880,2729881,2729882,2729883,2729884,2729885,2729886,2729887],"Calcite":[2704877],"Calcium":[2597941],"Californium":[2598331],"Candle":[2729200,2729201,2729202,2729203,2729204,2729205,2729206,2729207],"Carbon":[2598640],"Carpet":[2577424,2577425,2577426,2577427,2577428,2577429,2577430,2577431,2577432,2577433,2577434,2577435,2577436,2577437,2577438,2577439],"Carrot Block":[2577824,2577825,2577826,2577827,2577828,2577829,2577830,2577831],"Cartography Table":[2730733],"Carved Pumpkin":[2578164,2578165,2578166,2578167],"Cauldron":[2731561],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736532,2736533,2736536,2736537,2736538,2736539,2736540,2736541,2736542,2736543,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736564,2736565,2736568,2736569,2736570,2736571,2736572,2736573,2736574,2736575,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736596,2736597,2736600,2736601,2736602,2736603,2736604,2736605,2736606,2736607,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736628,2736629,2736632,2736633,2736634,2736635,2736636,2736637,2736638,2736639],"Cerium":[2598839],"Cesium":[2599158],"Chain":[2734637,2734638,2734639],"Cherry Button":[2737042,2737043,2737044,2737045,2737046,2737047,2737050,2737051,2737052,2737053,2737054,2737055],"Cherry Door":[2737216,2737217,2737218,2737219,2737220,2737221,2737222,2737223,2737224,2737225,2737226,2737227,2737228,2737229,2737230,2737231,2737232,2737233,2737234,2737235,2737236,2737237,2737238,2737239,2737240,2737241,2737242,2737243,2737244,2737245,2737246,2737247],"Cherry Fence":[2737525],"Cherry Fence Gate":[2737744,2737745,2737746,2737747,2737748,2737749,2737750,2737751,2737752,2737753,2737754,2737755,2737756,2737757,2737758,2737759],"Cherry Leaves":[2737948,2737949,2737950,2737951],"Cherry Log":[2738296,2738297,2738298,2738299,2738302,2738303],"Cherry Planks":[2738452],"Cherry Pressure Plate":[2738928,2738929],"Cherry Sign":[2739264,2739265,2739266,2739267,2739268,2739269,2739270,2739271,2739272,2739273,2739274,2739275,2739276,2739277,2739278,2739279],"Cherry Slab":[2739648,2739649,2739651],"Cherry Stairs":[2739904,2739905,2739906,2739907,2739908,2739909,2739910,2739911],"Cherry Trapdoor":[2740192,2740193,2740194,2740195,2740196,2740197,2740198,2740199,2740200,2740201,2740202,2740203,2740204,2740205,2740206,2740207],"Cherry Wall Sign":[2740252,2740253,2740254,2740255],"Cherry Wood":[2740648,2740649,2740652,2740653,2740654,2740655],"Chest":[2578568,2578569,2578570,2578571],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710178],"Chiseled Nether Bricks":[2710490],"Chiseled Polished Blackstone":[2702198],"Chiseled Quartz Block":[2578820,2578822,2578823],"Chiseled Red Sandstone":[2579100],"Chiseled Sandstone":[2579423],"Chiseled Stone Bricks":[2579586],"Chlorine":[2599314],"Chorus Flower":[2732968,2732969,2732972,2732973,2732974,2732975],"Chorus Plant":[2733195],"Chromium":[2599618],"Clay Block":[2579928],"Coal Block":[2580113],"Coal Ore":[2580456],"Cobalt":[2599759],"Cobbled Deepslate":[2707954],"Cobbled Deepslate Slab":[2708012,2708014,2708015],"Cobbled Deepslate Stairs":[2708408,2708409,2708410,2708411,2708412,2708413,2708414,2708415],"Cobbled Deepslate Wall":[2708517,2708528,2708529,2708530,2708531,2708532,2708533,2708534,2708535,2708536,2708537,2708538,2708539,2708540,2708541,2708542,2708543,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708645,2708656,2708657,2708658,2708659,2708660,2708661,2708662,2708663,2708664,2708665,2708666,2708667,2708668,2708669,2708670,2708671,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580494],"Cobblestone Slab":[2580816,2580818,2580819],"Cobblestone Stairs":[2581008,2581009,2581010,2581011,2581012,2581013,2581014,2581015],"Cobblestone Wall":[2581248,2581249,2581250,2581251,2581252,2581253,2581254,2581255,2581256,2581257,2581258,2581259,2581260,2581261,2581262,2581263,2581264,2581265,2581266,2581267,2581268,2581269,2581270,2581271,2581272,2581273,2581274,2581275,2581276,2581277,2581278,2581279,2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581296,2581297,2581298,2581299,2581300,2581301,2581302,2581303,2581304,2581305,2581306,2581307,2581308,2581309,2581310,2581311,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581363,2581376,2581377,2581378,2581379,2581380,2581381,2581382,2581383,2581384,2581385,2581386,2581387,2581388,2581389,2581390,2581391,2581392,2581393,2581394,2581395,2581396,2581397,2581398,2581399,2581400,2581401,2581402,2581403,2581404,2581405,2581406,2581407,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581424,2581425,2581426,2581427,2581428,2581429,2581430,2581431,2581432,2581433,2581434,2581435,2581436,2581437,2581438,2581439,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581491],"Cobweb":[2581680],"Cocoa Block":[2581936,2581937,2581938,2581939,2581940,2581941,2581942,2581943,2581944,2581945,2581946,2581947],"Compound Creator":[2582064,2582065,2582066,2582067],"Concrete":[2582272,2582273,2582274,2582275,2582276,2582277,2582278,2582279,2582280,2582281,2582282,2582283,2582284,2582285,2582286,2582287],"Concrete Powder":[2582576,2582577,2582578,2582579,2582580,2582581,2582582,2582583,2582584,2582585,2582586,2582587,2582588,2582589,2582590,2582591],"Copernicium":[2600444],"Copper":[2600600],"Copper Block":[2727976,2727977,2727978,2727979,2727980,2727981,2727982,2727983],"Copper Ore":[2724945],"Coral":[2582850,2582852,2582853,2582854,2582855,2582858,2582860,2582861,2582862,2582863],"Coral Block":[2583185,2583188,2583189,2583190,2583191,2583193,2583196,2583197,2583198,2583199],"Coral Fan":[2583523,2583524,2583525,2583526,2583527,2583531,2583532,2583533,2583534,2583535,2583539,2583540,2583541,2583542,2583543,2583547,2583548,2583549,2583550,2583551],"Cornflower":[2583696],"Cracked Deepslate Bricks":[2706413],"Cracked Deepslate Tiles":[2707692],"Cracked Nether Bricks":[2710722],"Cracked Polished Blackstone Bricks":[2703370],"Cracked Stone Bricks":[2584050],"Crafting Table":[2584268],"Crimson Button":[2717232,2717233,2717234,2717235,2717238,2717239,2717240,2717241,2717242,2717243,2717246,2717247],"Crimson Door":[2718784,2718785,2718786,2718787,2718788,2718789,2718790,2718791,2718792,2718793,2718794,2718795,2718796,2718797,2718798,2718799,2718800,2718801,2718802,2718803,2718804,2718805,2718806,2718807,2718808,2718809,2718810,2718811,2718812,2718813,2718814,2718815],"Crimson Fence":[2713497],"Crimson Fence Gate":[2719536,2719537,2719538,2719539,2719540,2719541,2719542,2719543,2719544,2719545,2719546,2719547,2719548,2719549,2719550,2719551],"Crimson Hyphae":[2715840,2715841,2715844,2715845,2715846,2715847],"Crimson Planks":[2712775],"Crimson Pressure Plate":[2717972,2717973],"Crimson Roots":[2741901],"Crimson Sign":[2721120,2721121,2721122,2721123,2721124,2721125,2721126,2721127,2721128,2721129,2721130,2721131,2721132,2721133,2721134,2721135],"Crimson Slab":[2714352,2714353,2714354],"Crimson Stairs":[2720312,2720313,2720314,2720315,2720316,2720317,2720318,2720319],"Crimson Stem":[2714970,2714971,2714972,2714973,2714974,2714975],"Crimson Trapdoor":[2716640,2716641,2716642,2716643,2716644,2716645,2716646,2716647,2716648,2716649,2716650,2716651,2716652,2716653,2716654,2716655],"Crimson Wall Sign":[2721840,2721841,2721842,2721843],"Crying Obsidian":[2727325],"Curium":[2600713],"Cut Copper Block":[2728328,2728329,2728330,2728331,2728332,2728333,2728334,2728335],"Cut Copper Slab Slab":[2728584,2728585,2728586,2728587,2728588,2728589,2728590,2728591,2728592,2728593,2728594,2728595,2728596,2728597,2728598,2728599,2728600,2728601,2728602,2728603,2728604,2728605,2728606,2728607],"Cut Copper Stairs":[2728896,2728897,2728898,2728899,2728900,2728901,2728902,2728903,2728904,2728905,2728906,2728907,2728908,2728909,2728910,2728911,2728912,2728913,2728914,2728915,2728916,2728917,2728918,2728919,2728920,2728921,2728922,2728923,2728924,2728925,2728926,2728927,2728928,2728929,2728930,2728931,2728932,2728933,2728934,2728935,2728936,2728937,2728938,2728939,2728940,2728941,2728942,2728943,2728944,2728945,2728946,2728947,2728948,2728949,2728950,2728951,2728952,2728953,2728954,2728955,2728956,2728957,2728958,2728959],"Cut Red Sandstone":[2584380],"Cut Red Sandstone Slab":[2584708,2584709,2584711],"Cut Sandstone":[2585059],"Cut Sandstone Slab":[2585332,2585333,2585334],"Dandelion":[2585688],"Dark Oak Button":[2586096,2586097,2586098,2586099,2586102,2586103,2586104,2586105,2586106,2586107,2586110,2586111],"Dark Oak Door":[2586336,2586337,2586338,2586339,2586340,2586341,2586342,2586343,2586344,2586345,2586346,2586347,2586348,2586349,2586350,2586351,2586352,2586353,2586354,2586355,2586356,2586357,2586358,2586359,2586360,2586361,2586362,2586363,2586364,2586365,2586366,2586367],"Dark Oak Fence":[2586561],"Dark Oak Fence Gate":[2586816,2586817,2586818,2586819,2586820,2586821,2586822,2586823,2586824,2586825,2586826,2586827,2586828,2586829,2586830,2586831],"Dark Oak Leaves":[2587056,2587057,2587058,2587059],"Dark Oak Log":[2587344,2587345,2587348,2587349,2587350,2587351],"Dark Oak Planks":[2587602],"Dark Oak Pressure Plate":[2587678,2587679],"Dark Oak Sapling":[2587910,2587911],"Dark Oak Sign":[2588384,2588385,2588386,2588387,2588388,2588389,2588390,2588391,2588392,2588393,2588394,2588395,2588396,2588397,2588398,2588399],"Dark Oak Slab":[2588624,2588625,2588626],"Dark Oak Stairs":[2588848,2588849,2588850,2588851,2588852,2588853,2588854,2588855],"Dark Oak Trapdoor":[2588992,2588993,2588994,2588995,2588996,2588997,2588998,2588999,2589000,2589001,2589002,2589003,2589004,2589005,2589006,2589007],"Dark Oak Wall Sign":[2589400,2589401,2589402,2589403],"Dark Oak Wood":[2589634,2589635,2589636,2589637,2589638,2589639],"Dark Prismarine":[2589812],"Dark Prismarine Slab":[2590000,2590002,2590003],"Dark Prismarine Stairs":[2590368,2590369,2590370,2590371,2590372,2590373,2590374,2590375],"Darmstadtium":[2601036],"Daylight Sensor":[2590656,2590657,2590658,2590659,2590660,2590661,2590662,2590663,2590664,2590665,2590666,2590667,2590668,2590669,2590670,2590671,2590672,2590673,2590674,2590675,2590676,2590677,2590678,2590679,2590680,2590681,2590682,2590683,2590684,2590685,2590686,2590687],"Dead Bush":[2590793],"Deepslate":[2705088,2705089,2705091],"Deepslate Brick Slab":[2705500,2705501,2705502],"Deepslate Brick Stairs":[2705720,2705721,2705722,2705723,2705724,2705725,2705726,2705727],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705936,2705937,2705938,2705939,2705940,2705941,2705942,2705943,2705944,2705945,2705946,2705947,2705948,2705949,2705950,2705951,2705952,2705953,2705954,2705955,2705956,2705957,2705958,2705959,2705960,2705961,2705962,2705963,2705964,2705965,2705966,2705967,2705968,2705969,2705970,2705971,2705972,2705973,2705974,2705975,2705976,2705977,2705978,2705979,2705980,2705981,2705982,2705983,2705985,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706064,2706065,2706066,2706067,2706068,2706069,2706070,2706071,2706072,2706073,2706074,2706075,2706076,2706077,2706078,2706079,2706080,2706081,2706082,2706083,2706084,2706085,2706086,2706087,2706088,2706089,2706090,2706091,2706092,2706093,2706094,2706095,2706096,2706097,2706098,2706099,2706100,2706101,2706102,2706103,2706104,2706105,2706106,2706107,2706108,2706109,2706110,2706111,2706113,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143],"Deepslate Bricks":[2705385],"Deepslate Coal Ore":[2722829],"Deepslate Copper Ore":[2724725],"Deepslate Diamond Ore":[2723295],"Deepslate Emerald Ore":[2723497],"Deepslate Gold Ore":[2724424],"Deepslate Iron Ore":[2724301],"Deepslate Lapis Lazuli Ore":[2723822],"Deepslate Redstone Ore":[2723924,2723925],"Deepslate Tile Slab":[2706876,2706877,2706879],"Deepslate Tile Stairs":[2707184,2707185,2707186,2707187,2707188,2707189,2707190,2707191],"Deepslate Tile Wall":[2707232,2707233,2707234,2707235,2707236,2707237,2707238,2707239,2707240,2707241,2707242,2707243,2707244,2707245,2707246,2707247,2707250,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707360,2707361,2707362,2707363,2707364,2707365,2707366,2707367,2707368,2707369,2707370,2707371,2707372,2707373,2707374,2707375,2707378,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706669],"Detector Rail":[2591152,2591153,2591154,2591155,2591158,2591159,2591160,2591161,2591162,2591163,2591166,2591167],"Diamond Block":[2591282],"Diamond Ore":[2591690],"Diorite":[2591871],"Diorite Slab":[2592189,2592190,2592191],"Diorite Stairs":[2592432,2592433,2592434,2592435,2592436,2592437,2592438,2592439],"Diorite Wall":[2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592561,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592592,2592593,2592594,2592595,2592596,2592597,2592598,2592599,2592600,2592601,2592602,2592603,2592604,2592605,2592606,2592607,2592608,2592609,2592610,2592611,2592612,2592613,2592614,2592615,2592616,2592617,2592618,2592619,2592620,2592621,2592622,2592623,2592624,2592625,2592626,2592627,2592628,2592629,2592630,2592631,2592632,2592633,2592634,2592635,2592636,2592637,2592638,2592639,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592689,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592720,2592721,2592722,2592723,2592724,2592725,2592726,2592727,2592728,2592729,2592730,2592731,2592732,2592733,2592734,2592735,2592736,2592737,2592738,2592739,2592740,2592741,2592742,2592743,2592744,2592745,2592746,2592747,2592748,2592749,2592750,2592751,2592752,2592753,2592754,2592755,2592756,2592757,2592758,2592759,2592760,2592761,2592762,2592763,2592764,2592765,2592766,2592767],"Dirt":[2592872,2592873,2592875],"Double Pitcher Crop":[2743664,2743665,2743666,2743667],"Double Tallgrass":[2593222,2593223],"Dragon Egg":[2593308],"Dried Kelp Block":[2593640],"Dubnium":[2601238],"Dyed Candle":[2729216,2729217,2729218,2729219,2729220,2729221,2729222,2729223,2729224,2729225,2729226,2729227,2729228,2729229,2729230,2729231,2729232,2729233,2729234,2729235,2729236,2729237,2729238,2729239,2729240,2729241,2729242,2729243,2729244,2729245,2729246,2729247,2729248,2729249,2729250,2729251,2729252,2729253,2729254,2729255,2729256,2729257,2729258,2729259,2729260,2729261,2729262,2729263,2729264,2729265,2729266,2729267,2729268,2729269,2729270,2729271,2729272,2729273,2729274,2729275,2729276,2729277,2729278,2729279,2729280,2729281,2729282,2729283,2729284,2729285,2729286,2729287,2729288,2729289,2729290,2729291,2729292,2729293,2729294,2729295,2729296,2729297,2729298,2729299,2729300,2729301,2729302,2729303,2729304,2729305,2729306,2729307,2729308,2729309,2729310,2729311,2729312,2729313,2729314,2729315,2729316,2729317,2729318,2729319,2729320,2729321,2729322,2729323,2729324,2729325,2729326,2729327,2729328,2729329,2729330,2729331,2729332,2729333,2729334,2729335,2729336,2729337,2729338,2729339,2729340,2729341,2729342,2729343],"Dyed Shulker Box":[2594016,2594017,2594018,2594019,2594020,2594021,2594022,2594023,2594024,2594025,2594026,2594027,2594028,2594029,2594030,2594031],"Dysprosium":[2601517],"Einsteinium":[2601881],"Element Constructor":[2600032,2600033,2600034,2600035],"Emerald Block":[2624812],"Emerald Ore":[2625136],"Enchanting Table":[2625512],"End Portal Frame":[2625616,2625617,2625618,2625619,2625620,2625621,2625622,2625623],"End Rod":[2625944,2625945,2625946,2625947,2625950,2625951],"End Stone":[2626067],"End Stone Brick Slab":[2626456,2626457,2626459],"End Stone Brick Stairs":[2626744,2626745,2626746,2626747,2626748,2626749,2626750,2626751],"End Stone Brick Wall":[2626853,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626880,2626881,2626882,2626883,2626884,2626885,2626886,2626887,2626888,2626889,2626890,2626891,2626892,2626893,2626894,2626895,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626912,2626913,2626914,2626915,2626916,2626917,2626918,2626919,2626920,2626921,2626922,2626923,2626924,2626925,2626926,2626927,2626928,2626929,2626930,2626931,2626932,2626933,2626934,2626935,2626936,2626937,2626938,2626939,2626940,2626941,2626942,2626943,2626981,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627008,2627009,2627010,2627011,2627012,2627013,2627014,2627015,2627016,2627017,2627018,2627019,2627020,2627021,2627022,2627023,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039,2627040,2627041,2627042,2627043,2627044,2627045,2627046,2627047,2627048,2627049,2627050,2627051,2627052,2627053,2627054,2627055,2627056,2627057,2627058,2627059,2627060,2627061,2627062,2627063,2627064,2627065,2627066,2627067,2627068,2627069,2627070,2627071],"End Stone Bricks":[2627290],"Ender Chest":[2627340,2627341,2627342,2627343],"Erbium":[2602113],"Europium":[2602268],"Fake Wooden Slab":[2627665,2627666,2627667],"Farmland":[2627976,2627977,2627978,2627979,2627980,2627981,2627982,2627983],"Fermium":[2602504],"Fern":[2628125],"Fire Block":[2628464,2628465,2628466,2628467,2628468,2628469,2628470,2628471,2628472,2628473,2628474,2628475,2628476,2628477,2628478,2628479],"Flerovium":[2602826],"Fletching Table":[2628783],"Flower Pot":[2628913],"Flowering Azalea Leaves":[2736040,2736041,2736042,2736043],"Fluorine":[2603060],"Francium":[2603433],"Froglight":[2733953,2733954,2733955,2733957,2733958,2733959,2733961,2733962,2733963],"Frosted Ice":[2629188,2629189,2629190,2629191],"Furnace":[2629600,2629601,2629602,2629603,2629604,2629605,2629606,2629607],"Gadolinium":[2603633],"Gallium":[2603945],"Germanium":[2604261],"Gilded Blackstone":[2727654],"Glass":[2629881],"Glass Pane":[2630089],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735312,2735313,2735316,2735317,2735318,2735319,2735320,2735321,2735324,2735325,2735326,2735327],"Glow Lichen":[2736768,2736769,2736770,2736771,2736772,2736773,2736774,2736775,2736776,2736777,2736778,2736779,2736780,2736781,2736782,2736783,2736784,2736785,2736786,2736787,2736788,2736789,2736790,2736791,2736792,2736793,2736794,2736795,2736796,2736797,2736798,2736799,2736800,2736801,2736802,2736803,2736804,2736805,2736806,2736807,2736808,2736809,2736810,2736811,2736812,2736813,2736814,2736815,2736816,2736817,2736818,2736819,2736820,2736821,2736822,2736823,2736824,2736825,2736826,2736827,2736828,2736829,2736830,2736831],"Glowing Obsidian":[2630228],"Glowstone":[2630568],"Gold":[2604408],"Gold Block":[2630824],"Gold Ore":[2631090],"Granite":[2631318],"Granite Slab":[2631496,2631497,2631498],"Granite Stairs":[2631752,2631753,2631754,2631755,2631756,2631757,2631758,2631759],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632063,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632191],"Grass":[2632262],"Grass Path":[2632655],"Gravel":[2632760],"Green Torch":[2633657,2633658,2633659,2633660,2633661],"Hafnium":[2604728],"Hanging Roots":[2730490],"Hardened Clay":[2633814],"Hardened Glass":[2634187],"Hardened Glass Pane":[2634294],"Hassium":[2604858],"Hay Bale":[2634740,2634741,2634742],"Heat Block":[2578246],"Helium":[2605056],"Holmium":[2605555],"Honeycomb Block":[2722683],"Hopper":[2634976,2634977,2634981,2634982,2634983,2634984,2634985,2634989,2634990,2634991],"Hydrogen":[2605678],"Ice":[2635248],"Indium":[2606007],"Infested Chiseled Stone Brick":[2635303],"Infested Cobblestone":[2635729],"Infested Cracked Stone Brick":[2635915],"Infested Mossy Stone Brick":[2636099],"Infested Stone":[2636356],"Infested Stone Brick":[2636550],"Invisible Bedrock":[2637471],"Iodine":[2606214],"Iridium":[2606518],"Iron":[2606636],"Iron Bars":[2637842],"Iron Block":[2637750],"Iron Door":[2638208,2638209,2638210,2638211,2638212,2638213,2638214,2638215,2638216,2638217,2638218,2638219,2638220,2638221,2638222,2638223,2638224,2638225,2638226,2638227,2638228,2638229,2638230,2638231,2638232,2638233,2638234,2638235,2638236,2638237,2638238,2638239],"Iron Ore":[2638449],"Iron Trapdoor":[2638608,2638609,2638610,2638611,2638612,2638613,2638614,2638615,2638616,2638617,2638618,2638619,2638620,2638621,2638622,2638623],"Item Frame":[2638992,2638993,2638994,2638995,2638996,2638997,2639000,2639001,2639002,2639003,2639004,2639005],"Jack o'Lantern":[2647344,2647345,2647346,2647347],"Jukebox":[2639329],"Jungle Button":[2639456,2639457,2639458,2639459,2639460,2639461,2639464,2639465,2639466,2639467,2639468,2639469],"Jungle Door":[2639744,2639745,2639746,2639747,2639748,2639749,2639750,2639751,2639752,2639753,2639754,2639755,2639756,2639757,2639758,2639759,2639760,2639761,2639762,2639763,2639764,2639765,2639766,2639767,2639768,2639769,2639770,2639771,2639772,2639773,2639774,2639775],"Jungle Fence":[2639966],"Jungle Fence Gate":[2640224,2640225,2640226,2640227,2640228,2640229,2640230,2640231,2640232,2640233,2640234,2640235,2640236,2640237,2640238,2640239],"Jungle Leaves":[2640436,2640437,2640438,2640439],"Jungle Log":[2640640,2640641,2640642,2640643,2640646,2640647],"Jungle Planks":[2641093],"Jungle Pressure Plate":[2641284,2641285],"Jungle Sapling":[2641438,2641439],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642024,2642025,2642026],"Jungle Stairs":[2642424,2642425,2642426,2642427,2642428,2642429,2642430,2642431],"Jungle Trapdoor":[2642448,2642449,2642450,2642451,2642452,2642453,2642454,2642455,2642456,2642457,2642458,2642459,2642460,2642461,2642462,2642463],"Jungle Wall Sign":[2642740,2642741,2642742,2642743],"Jungle Wood":[2643080,2643081,2643084,2643085,2643086,2643087],"Krypton":[2606951],"Lab Table":[2643440,2643441,2643442,2643443],"Ladder":[2643512,2643513,2643514,2643515],"Lantern":[2643756,2643757],"Lanthanum":[2607257],"Lapis Lazuli Block":[2644008],"Lapis Lazuli Ore":[2644357],"Large Fern":[2644516,2644517],"Lava":[2644960,2644961,2644962,2644963,2644964,2644965,2644966,2644967,2644968,2644969,2644970,2644971,2644972,2644973,2644974,2644975,2644976,2644977,2644978,2644979,2644980,2644981,2644982,2644983,2644984,2644985,2644986,2644987,2644988,2644989,2644990,2644991],"Lava Cauldron":[2732152,2732153,2732154,2732155,2732156,2732157],"Lawrencium":[2607523],"Lead":[2607716],"Lectern":[2645160,2645161,2645162,2645163,2645164,2645165,2645166,2645167],"Legacy Stonecutter":[2645272],"Lever":[2645712,2645713,2645714,2645715,2645716,2645717,2645718,2645719,2645720,2645721,2645722,2645723,2645724,2645725,2645726,2645727],"Light Block":[2703840,2703841,2703842,2703843,2703844,2703845,2703846,2703847,2703848,2703849,2703850,2703851,2703852,2703853,2703854,2703855],"Lightning Rod":[2727810,2727811,2727812,2727813,2727814,2727815],"Lilac":[2646394,2646395],"Lily Pad":[2646943],"Lily of the Valley":[2646752],"Lithium":[2608039],"Livermorium":[2608214],"Loom":[2647644,2647645,2647646,2647647],"Lutetium":[2608593],"Magma Block":[2648248],"Magnesium":[2608675],"Manganese":[2608998],"Mangrove Button":[2717056,2717057,2717058,2717059,2717062,2717063,2717064,2717065,2717066,2717067,2717070,2717071],"Mangrove Door":[2718464,2718465,2718466,2718467,2718468,2718469,2718470,2718471,2718472,2718473,2718474,2718475,2718476,2718477,2718478,2718479,2718480,2718481,2718482,2718483,2718484,2718485,2718486,2718487,2718488,2718489,2718490,2718491,2718492,2718493,2718494,2718495],"Mangrove Fence":[2713251],"Mangrove Fence Gate":[2719264,2719265,2719266,2719267,2719268,2719269,2719270,2719271,2719272,2719273,2719274,2719275,2719276,2719277,2719278,2719279],"Mangrove Leaves":[2735556,2735557,2735558,2735559],"Mangrove Log":[2714648,2714649,2714650,2714651,2714654,2714655],"Mangrove Planks":[2712331],"Mangrove Pressure Plate":[2717754,2717755],"Mangrove Roots":[2733326],"Mangrove Sign":[2720800,2720801,2720802,2720803,2720804,2720805,2720806,2720807,2720808,2720809,2720810,2720811,2720812,2720813,2720814,2720815],"Mangrove Slab":[2713985,2713986,2713987],"Mangrove Stairs":[2720112,2720113,2720114,2720115,2720116,2720117,2720118,2720119],"Mangrove Trapdoor":[2716208,2716209,2716210,2716211,2716212,2716213,2716214,2716215,2716216,2716217,2716218,2716219,2716220,2716221,2716222,2716223],"Mangrove Wall Sign":[2721696,2721697,2721698,2721699],"Mangrove Wood":[2715402,2715403,2715404,2715405,2715406,2715407],"Material Reducer":[2648480,2648481,2648482,2648483],"Meitnerium":[2609245],"Melon Block":[2648739],"Melon Stem":[2648832,2648833,2648834,2648835,2648836,2648837,2648838,2648839,2648840,2648841,2648842,2648843,2648844,2648845,2648846,2648847,2648864,2648865,2648866,2648867,2648868,2648869,2648870,2648871,2648880,2648881,2648882,2648883,2648884,2648885,2648886,2648887,2648888,2648889,2648890,2648891,2648892,2648893,2648894,2648895],"Mendelevium":[2609489],"Mercury":[2609777],"Mob Head":[2649216,2649217,2649218,2649219,2649221,2649222,2649223,2649224,2649225,2649226,2649227,2649229,2649230,2649231,2649248,2649249,2649250,2649251,2649253,2649254,2649255,2649264,2649265,2649266,2649267,2649269,2649270,2649271,2649272,2649273,2649274,2649275,2649277,2649278,2649279],"Molybdenum":[2610097],"Monster Spawner":[2649402],"Moscovium":[2610378],"Mossy Cobblestone":[2649741],"Mossy Cobblestone Slab":[2650036,2650038,2650039],"Mossy Cobblestone Stairs":[2650248,2650249,2650250,2650251,2650252,2650253,2650254,2650255],"Mossy Cobblestone Wall":[2650368,2650369,2650370,2650371,2650372,2650373,2650374,2650375,2650376,2650377,2650378,2650379,2650380,2650381,2650382,2650383,2650384,2650385,2650386,2650387,2650388,2650389,2650390,2650391,2650392,2650393,2650394,2650395,2650396,2650397,2650398,2650399,2650400,2650401,2650402,2650403,2650404,2650405,2650406,2650407,2650408,2650409,2650410,2650411,2650412,2650413,2650414,2650415,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650450,2650496,2650497,2650498,2650499,2650500,2650501,2650502,2650503,2650504,2650505,2650506,2650507,2650508,2650509,2650510,2650511,2650512,2650513,2650514,2650515,2650516,2650517,2650518,2650519,2650520,2650521,2650522,2650523,2650524,2650525,2650526,2650527,2650528,2650529,2650530,2650531,2650532,2650533,2650534,2650535,2650536,2650537,2650538,2650539,2650540,2650541,2650542,2650543,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650578],"Mossy Stone Brick Slab":[2650856,2650857,2650859],"Mossy Stone Brick Stairs":[2650912,2650913,2650914,2650915,2650916,2650917,2650918,2650919],"Mossy Stone Brick Wall":[2651171,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651299,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651617],"Mud":[2725428],"Mud Brick Slab":[2726120,2726122,2726123],"Mud Brick Stairs":[2726152,2726153,2726154,2726155,2726156,2726157,2726158,2726159],"Mud Brick Wall":[2726414,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726464,2726465,2726466,2726467,2726468,2726469,2726470,2726471,2726472,2726473,2726474,2726475,2726476,2726477,2726478,2726479,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726496,2726497,2726498,2726499,2726500,2726501,2726502,2726503,2726504,2726505,2726506,2726507,2726508,2726509,2726510,2726511,2726512,2726513,2726514,2726515,2726516,2726517,2726518,2726519,2726520,2726521,2726522,2726523,2726524,2726525,2726526,2726527,2726542,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726592,2726593,2726594,2726595,2726596,2726597,2726598,2726599,2726600,2726601,2726602,2726603,2726604,2726605,2726606,2726607,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623,2726624,2726625,2726626,2726627,2726628,2726629,2726630,2726631,2726632,2726633,2726634,2726635,2726636,2726637,2726638,2726639,2726640,2726641,2726642,2726643,2726644,2726645,2726646,2726647,2726648,2726649,2726650,2726651,2726652,2726653,2726654,2726655],"Mud Bricks":[2725644],"Muddy Mangrove Roots":[2733661,2733662,2733663],"Mushroom Stem":[2651775],"Mycelium":[2651923],"Neodymium":[2610514],"Neon":[2610826],"Neptunium":[2610990],"Nether Brick Fence":[2652231],"Nether Brick Slab":[2652416,2652417,2652419],"Nether Brick Stairs":[2652728,2652729,2652730,2652731,2652732,2652733,2652734,2652735],"Nether Brick Wall":[2652960,2652961,2652962,2652963,2652964,2652965,2652966,2652967,2652968,2652969,2652970,2652971,2652972,2652973,2652974,2652975,2652976,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653088,2653089,2653090,2653091,2653092,2653093,2653094,2653095,2653096,2653097,2653098,2653099,2653100,2653101,2653102,2653103,2653104,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653384],"Nether Gold Ore":[2725267],"Nether Portal":[2653688,2653689],"Nether Quartz Ore":[2653911],"Nether Reactor Core":[2654168],"Nether Wart":[2654340,2654341,2654342,2654343],"Nether Wart Block":[2654551],"Netherite Block":[2731038],"Netherrack":[2654902],"Nickel":[2611380],"Nihonium":[2611595],"Niobium":[2611854],"Nitrogen":[2612104],"Nobelium":[2612380],"Note Block":[2655190],"Oak Button":[2655248,2655249,2655252,2655253,2655254,2655255,2655256,2655257,2655260,2655261,2655262,2655263],"Oak Door":[2655488,2655489,2655490,2655491,2655492,2655493,2655494,2655495,2655496,2655497,2655498,2655499,2655500,2655501,2655502,2655503,2655504,2655505,2655506,2655507,2655508,2655509,2655510,2655511,2655512,2655513,2655514,2655515,2655516,2655517,2655518,2655519],"Oak Fence":[2655762],"Oak Fence Gate":[2656048,2656049,2656050,2656051,2656052,2656053,2656054,2656055,2656056,2656057,2656058,2656059,2656060,2656061,2656062,2656063],"Oak Leaves":[2656456,2656457,2656458,2656459],"Oak Log":[2656744,2656745,2656748,2656749,2656750,2656751],"Oak Planks":[2656848],"Oak Pressure Plate":[2657232,2657233],"Oak Sapling":[2657502,2657503],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2658037,2658038,2658039],"Oak Stairs":[2658136,2658137,2658138,2658139,2658140,2658141,2658142,2658143],"Oak Trapdoor":[2658352,2658353,2658354,2658355,2658356,2658357,2658358,2658359,2658360,2658361,2658362,2658363,2658364,2658365,2658366,2658367],"Oak Wall Sign":[2658632,2658633,2658634,2658635],"Oak Wood":[2658906,2658907,2658908,2658909,2658910,2658911],"Obsidian":[2659231],"Oganesson":[2612732],"Orange Tulip":[2659739],"Osmium":[2612890],"Oxeye Daisy":[2659907],"Oxygen":[2613005],"Packed Ice":[2660280],"Packed Mud":[2726845],"Palladium":[2613267],"Peony":[2660372,2660373],"Phosphorus":[2613733],"Pink Petals":[2741648,2741649,2741650,2741651,2741652,2741653,2741654,2741655,2741656,2741657,2741658,2741659,2741660,2741661,2741662,2741663],"Pink Tulip":[2660949],"Pitcher Crop":[2743389,2743390,2743391],"Pitcher Plant":[2743082,2743083],"Platinum":[2613891],"Plutonium":[2614020],"Podzol":[2661333],"Polished Andesite":[2661619],"Polished Andesite Slab":[2661708,2661709,2661711],"Polished Andesite Stairs":[2661936,2661937,2661938,2661939,2661940,2661941,2661942,2661943],"Polished Basalt":[2699104,2699106,2699107],"Polished Blackstone":[2700544],"Polished Blackstone Brick Slab":[2702664,2702665,2702666],"Polished Blackstone Brick Stairs":[2703056,2703057,2703058,2703059,2703060,2703061,2703062,2703063],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703168,2703184,2703185,2703186,2703187,2703188,2703189,2703190,2703191,2703192,2703193,2703194,2703195,2703196,2703197,2703198,2703199,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703296,2703312,2703313,2703314,2703315,2703316,2703317,2703318,2703319,2703320,2703321,2703322,2703323,2703324,2703325,2703326,2703327],"Polished Blackstone Bricks":[2702454],"Polished Blackstone Button":[2701040,2701041,2701042,2701043,2701044,2701045,2701048,2701049,2701050,2701051,2701052,2701053],"Polished Blackstone Pressure Plate":[2701220,2701221],"Polished Blackstone Slab":[2701428,2701429,2701430],"Polished Blackstone Stairs":[2701744,2701745,2701746,2701747,2701748,2701749,2701750,2701751],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701893,2701904,2701905,2701906,2701907,2701908,2701909,2701910,2701911,2701912,2701913,2701914,2701915,2701916,2701917,2701918,2701919,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702021,2702032,2702033,2702034,2702035,2702036,2702037,2702038,2702039,2702040,2702041,2702042,2702043,2702044,2702045,2702046,2702047],"Polished Deepslate":[2708955],"Polished Deepslate Slab":[2709068,2709070,2709071],"Polished Deepslate Stairs":[2709296,2709297,2709298,2709299,2709300,2709301,2709302,2709303],"Polished Deepslate Wall":[2709548,2709552,2709553,2709554,2709555,2709556,2709557,2709558,2709559,2709560,2709561,2709562,2709563,2709564,2709565,2709566,2709567,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709676,2709680,2709681,2709682,2709683,2709684,2709685,2709686,2709687,2709688,2709689,2709690,2709691,2709692,2709693,2709694,2709695,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662301],"Polished Diorite Slab":[2662512,2662514,2662515],"Polished Diorite Stairs":[2662736,2662737,2662738,2662739,2662740,2662741,2662742,2662743],"Polished Granite":[2663058],"Polished Granite Slab":[2663312,2663313,2663315],"Polished Granite Stairs":[2663568,2663569,2663570,2663571,2663572,2663573,2663574,2663575],"Polonium":[2614482],"Poppy":[2663844],"Potassium":[2614731],"Potato Block":[2664136,2664137,2664138,2664139,2664140,2664141,2664142,2664143],"Potion Cauldron":[2732432,2732433,2732434,2732435,2732436,2732437],"Powered Rail":[2664336,2664337,2664338,2664339,2664342,2664343,2664344,2664345,2664346,2664347,2664350,2664351],"Praseodymium":[2614802],"Prismarine":[2664586],"Prismarine Bricks":[2664928],"Prismarine Bricks Slab":[2665044,2665046,2665047],"Prismarine Bricks Stairs":[2665456,2665457,2665458,2665459,2665460,2665461,2665462,2665463],"Prismarine Slab":[2665496,2665497,2665499],"Prismarine Stairs":[2665944,2665945,2665946,2665947,2665948,2665949,2665950,2665951],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666086,2666096,2666097,2666098,2666099,2666100,2666101,2666102,2666103,2666104,2666105,2666106,2666107,2666108,2666109,2666110,2666111,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666214,2666224,2666225,2666226,2666227,2666228,2666229,2666230,2666231,2666232,2666233,2666234,2666235,2666236,2666237,2666238,2666239],"Promethium":[2615041],"Protactinium":[2615321],"Pumpkin":[2666408],"Pumpkin Stem":[2666704,2666705,2666706,2666707,2666708,2666709,2666710,2666711,2666712,2666713,2666714,2666715,2666716,2666717,2666718,2666719,2666720,2666721,2666722,2666723,2666724,2666725,2666726,2666727,2666728,2666729,2666730,2666731,2666732,2666733,2666734,2666735,2666736,2666737,2666738,2666739,2666740,2666741,2666742,2666743],"Purple Torch":[2667018,2667019,2667020,2667021,2667022],"Purpur Block":[2667467],"Purpur Pillar":[2667649,2667650,2667651],"Purpur Slab":[2667944,2667945,2667946],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668351],"Quartz Bricks":[2709837],"Quartz Pillar":[2668756,2668757,2668759],"Quartz Slab":[2668896,2668897,2668899],"Quartz Stairs":[2669256,2669257,2669258,2669259,2669260,2669261,2669262,2669263],"Radium":[2615578],"Radon":[2615978],"Rail":[2669510,2669511,2669512,2669513,2669514,2669515,2669516,2669517,2669518,2669519],"Raw Copper Block":[2703999],"Raw Gold Block":[2704169],"Raw Iron Block":[2704423],"Red Mushroom":[2670074],"Red Mushroom Block":[2670289,2670290,2670291,2670296,2670297,2670298,2670299,2670300,2670301,2670302,2670303],"Red Nether Brick Slab":[2670564,2670566,2670567],"Red Nether Brick Stairs":[2670728,2670729,2670730,2670731,2670732,2670733,2670734,2670735],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670864,2670865,2670866,2670867,2670868,2670869,2670870,2670871,2670872,2670873,2670874,2670875,2670876,2670877,2670878,2670879,2670880,2670881,2670882,2670883,2670884,2670885,2670886,2670887,2670888,2670889,2670890,2670891,2670892,2670893,2670894,2670895,2670896,2670897,2670898,2670899,2670900,2670901,2670902,2670903,2670904,2670905,2670906,2670907,2670908,2670909,2670910,2670911,2670912,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670992,2670993,2670994,2670995,2670996,2670997,2670998,2670999,2671000,2671001,2671002,2671003,2671004,2671005,2671006,2671007,2671008,2671009,2671010,2671011,2671012,2671013,2671014,2671015,2671016,2671017,2671018,2671019,2671020,2671021,2671022,2671023,2671024,2671025,2671026,2671027,2671028,2671029,2671030,2671031,2671032,2671033,2671034,2671035,2671036,2671037,2671038,2671039,2671040,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071],"Red Nether Bricks":[2671192],"Red Sand":[2671467],"Red Sandstone":[2671858],"Red Sandstone Slab":[2671948,2671949,2671950],"Red Sandstone Stairs":[2672360,2672361,2672362,2672363,2672364,2672365,2672366,2672367],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672415,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672543,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672754,2672755,2672756,2672757,2672759],"Red Tulip":[2673099],"Redstone":[2674800,2674801,2674802,2674803,2674804,2674805,2674806,2674807,2674808,2674809,2674810,2674811,2674812,2674813,2674814,2674815],"Redstone Block":[2673334],"Redstone Comparator":[2673536,2673537,2673538,2673539,2673540,2673541,2673542,2673543,2673544,2673545,2673546,2673547,2673548,2673549,2673550,2673551],"Redstone Lamp":[2673716,2673717],"Redstone Ore":[2674064,2674065],"Redstone Repeater":[2674208,2674209,2674210,2674211,2674212,2674213,2674214,2674215,2674216,2674217,2674218,2674219,2674220,2674221,2674222,2674223,2674224,2674225,2674226,2674227,2674228,2674229,2674230,2674231,2674232,2674233,2674234,2674235,2674236,2674237,2674238,2674239],"Redstone Torch":[2674449,2674450,2674451,2674452,2674453,2674457,2674458,2674459,2674460,2674461],"Reinforced Deepslate":[2736204],"Rhenium":[2616206],"Rhodium":[2616344],"Roentgenium":[2616649],"Rose Bush":[2675240,2675241],"Rubidium":[2617054],"Ruthenium":[2617239],"Rutherfordium":[2617506],"Samarium":[2617838],"Sand":[2675615],"Sandstone":[2675846],"Sandstone Slab":[2676069,2676070,2676071],"Sandstone Stairs":[2676280,2676281,2676282,2676283,2676284,2676285,2676286,2676287],"Sandstone Wall":[2676480,2676481,2676482,2676483,2676484,2676485,2676486,2676487,2676488,2676489,2676490,2676491,2676492,2676493,2676494,2676495,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676512,2676513,2676514,2676515,2676516,2676517,2676518,2676519,2676520,2676521,2676522,2676523,2676524,2676525,2676526,2676527,2676528,2676529,2676530,2676531,2676532,2676533,2676534,2676535,2676536,2676537,2676538,2676539,2676540,2676541,2676542,2676543,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676567,2676608,2676609,2676610,2676611,2676612,2676613,2676614,2676615,2676616,2676617,2676618,2676619,2676620,2676621,2676622,2676623,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676640,2676641,2676642,2676643,2676644,2676645,2676646,2676647,2676648,2676649,2676650,2676651,2676652,2676653,2676654,2676655,2676656,2676657,2676658,2676659,2676660,2676661,2676662,2676663,2676664,2676665,2676666,2676667,2676668,2676669,2676670,2676671,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676695],"Scandium":[2618051],"Sculk":[2735063],"Sea Lantern":[2676975],"Sea Pickle":[2677120,2677121,2677122,2677123,2677124,2677125,2677126,2677127],"Seaborgium":[2618158],"Selenium":[2618595],"Shroomlight":[2712156],"Shulker Box":[2677267],"Silicon":[2618823],"Silver":[2618883],"Slime Block":[2677570],"Small Dripleaf":[2740888,2740889,2740890,2740891,2740892,2740893,2740894,2740895],"Smithing Table":[2730807],"Smoker":[2677856,2677857,2677858,2677859,2677860,2677861,2677862,2677863],"Smooth Basalt":[2699389],"Smooth Quartz Block":[2678217],"Smooth Quartz Slab":[2678360,2678361,2678362],"Smooth Quartz Stairs":[2678528,2678529,2678530,2678531,2678532,2678533,2678534,2678535],"Smooth Red Sandstone":[2678812],"Smooth Red Sandstone Slab":[2679085,2679086,2679087],"Smooth Red Sandstone Stairs":[2679320,2679321,2679322,2679323,2679324,2679325,2679326,2679327],"Smooth Sandstone":[2679586],"Smooth Sandstone Slab":[2679961,2679962,2679963],"Smooth Sandstone Stairs":[2680304,2680305,2680306,2680307,2680308,2680309,2680310,2680311],"Smooth Stone":[2680534],"Smooth Stone Slab":[2680648,2680649,2680651],"Snow Block":[2681036],"Snow Layer":[2681096,2681097,2681098,2681099,2681100,2681101,2681102,2681103],"Sodium":[2619314],"Soul Fire":[2711944],"Soul Lantern":[2711536,2711537],"Soul Sand":[2681478],"Soul Soil":[2711638],"Soul Torch":[2711144,2711145,2711148,2711150,2711151],"Sponge":[2681812,2681813],"Spore Blossom":[2731516],"Spruce Button":[2681904,2681905,2681906,2681907,2681908,2681909,2681912,2681913,2681914,2681915,2681916,2681917],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682543],"Spruce Fence Gate":[2682864,2682865,2682866,2682867,2682868,2682869,2682870,2682871,2682872,2682873,2682874,2682875,2682876,2682877,2682878,2682879],"Spruce Leaves":[2682984,2682985,2682986,2682987],"Spruce Log":[2683256,2683257,2683260,2683261,2683262,2683263],"Spruce Planks":[2683538],"Spruce Pressure Plate":[2683658,2683659],"Spruce Sapling":[2683996,2683997],"Spruce Sign":[2684304,2684305,2684306,2684307,2684308,2684309,2684310,2684311,2684312,2684313,2684314,2684315,2684316,2684317,2684318,2684319],"Spruce Slab":[2684648,2684649,2684650],"Spruce Stairs":[2684752,2684753,2684754,2684755,2684756,2684757,2684758,2684759],"Spruce Trapdoor":[2684976,2684977,2684978,2684979,2684980,2684981,2684982,2684983,2684984,2684985,2684986,2684987,2684988,2684989,2684990,2684991],"Spruce Wall Sign":[2685424,2685425,2685426,2685427],"Spruce Wood":[2685552,2685553,2685554,2685555,2685558,2685559],"Stained Clay":[2685760,2685761,2685762,2685763,2685764,2685765,2685766,2685767,2685768,2685769,2685770,2685771,2685772,2685773,2685774,2685775],"Stained Glass":[2686128,2686129,2686130,2686131,2686132,2686133,2686134,2686135,2686136,2686137,2686138,2686139,2686140,2686141,2686142,2686143],"Stained Glass Pane":[2686336,2686337,2686338,2686339,2686340,2686341,2686342,2686343,2686344,2686345,2686346,2686347,2686348,2686349,2686350,2686351],"Stained Hardened Glass":[2686480,2686481,2686482,2686483,2686484,2686485,2686486,2686487,2686488,2686489,2686490,2686491,2686492,2686493,2686494,2686495],"Stained Hardened Glass Pane":[2686816,2686817,2686818,2686819,2686820,2686821,2686822,2686823,2686824,2686825,2686826,2686827,2686828,2686829,2686830,2686831],"Stone":[2687220],"Stone Brick Slab":[2687324,2687325,2687326],"Stone Brick Stairs":[2687576,2687577,2687578,2687579,2687580,2687581,2687582,2687583],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687773,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687824,2687825,2687826,2687827,2687828,2687829,2687830,2687831,2687832,2687833,2687834,2687835,2687836,2687837,2687838,2687839,2687840,2687841,2687842,2687843,2687844,2687845,2687846,2687847,2687848,2687849,2687850,2687851,2687852,2687853,2687854,2687855,2687856,2687857,2687858,2687859,2687860,2687861,2687862,2687863,2687864,2687865,2687866,2687867,2687868,2687869,2687870,2687871,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687901,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687952,2687953,2687954,2687955,2687956,2687957,2687958,2687959,2687960,2687961,2687962,2687963,2687964,2687965,2687966,2687967,2687968,2687969,2687970,2687971,2687972,2687973,2687974,2687975,2687976,2687977,2687978,2687979,2687980,2687981,2687982,2687983,2687984,2687985,2687986,2687987,2687988,2687989,2687990,2687991,2687992,2687993,2687994,2687995,2687996,2687997,2687998,2687999],"Stone Bricks":[2688134],"Stone Button":[2688384,2688385,2688386,2688387,2688390,2688391,2688392,2688393,2688394,2688395,2688398,2688399],"Stone Pressure Plate":[2688516,2688517],"Stone Slab":[2688849,2688850,2688851],"Stone Stairs":[2689024,2689025,2689026,2689027,2689028,2689029,2689030,2689031],"Stonecutter":[2689512,2689513,2689514,2689515],"Strontium":[2619420],"Sugarcane":[2692608,2692609,2692610,2692611,2692612,2692613,2692614,2692615,2692616,2692617,2692618,2692619,2692620,2692621,2692622,2692623],"Sulfur":[2619764],"Sunflower":[2692922,2692923],"Sweet Berry Bush":[2693156,2693157,2693158,2693159],"TNT":[2693812,2693813,2693814,2693815],"Tall Grass":[2693586],"Tantalum":[2620091],"Technetium":[2620391],"Tellurium":[2620512],"Tennessine":[2620797],"Terbium":[2621111],"Thallium":[2621248],"Thorium":[2621635],"Thulium":[2621706],"Tin":[2621963],"Tinted Glass":[2722326],"Titanium":[2622431],"Torch":[2694042,2694043,2694044,2694045,2694047],"Torchflower":[2742639],"Torchflower Crop":[2743028,2743029],"Trapped Chest":[2694232,2694233,2694234,2694235],"Tripwire":[2694640,2694641,2694642,2694643,2694644,2694645,2694646,2694647,2694648,2694649,2694650,2694651,2694652,2694653,2694654,2694655],"Tripwire Hook":[2694880,2694881,2694882,2694883,2694884,2694885,2694886,2694887,2694888,2694889,2694890,2694891,2694892,2694893,2694894,2694895],"Tuff":[2710882],"Tungsten":[2622683],"Twisting Vines":[2734080,2734081,2734082,2734083,2734084,2734085,2734086,2734087,2734088,2734089,2734090,2734091,2734092,2734093,2734094,2734095,2734096,2734097,2734104,2734105,2734106,2734107,2734108,2734109,2734110,2734111],"Underwater Torch":[2695096,2695097,2695100,2695102,2695103],"Uranium":[2622970],"Vanadium":[2623035],"Vines":[2695168,2695169,2695170,2695171,2695172,2695173,2695174,2695175,2695176,2695177,2695178,2695179,2695180,2695181,2695182,2695183],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695744,2695748,2695749,2695750,2695751,2695752,2695756,2695757,2695758,2695759,2695760,2695764,2695765,2695766,2695767,2695768,2695772,2695773,2695774,2695775,2695776,2695780,2695781,2695782,2695783,2695784,2695788,2695789,2695790,2695791,2695792,2695796,2695797,2695798,2695799,2695800,2695804,2695805,2695806,2695807],"Warped Button":[2717680,2717681,2717684,2717685,2717686,2717687,2717688,2717689,2717692,2717693,2717694,2717695],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713754],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716136,2716137,2716140,2716141,2716142,2716143],"Warped Planks":[2712965],"Warped Pressure Plate":[2718280,2718281],"Warped Roots":[2742193],"Warped Sign":[2721328,2721329,2721330,2721331,2721332,2721333,2721334,2721335,2721336,2721337,2721338,2721339,2721340,2721341,2721342,2721343],"Warped Slab":[2714460,2714462,2714463],"Warped Stairs":[2720552,2720553,2720554,2720555,2720556,2720557,2720558,2720559],"Warped Stem":[2715288,2715289,2715292,2715293,2715294,2715295],"Warped Trapdoor":[2716816,2716817,2716818,2716819,2716820,2716821,2716822,2716823,2716824,2716825,2716826,2716827,2716828,2716829,2716830,2716831],"Warped Wall Sign":[2722096,2722097,2722098,2722099],"Warped Wart Block":[2726917],"Water":[2696032,2696033,2696034,2696035,2696036,2696037,2696038,2696039,2696040,2696041,2696042,2696043,2696044,2696045,2696046,2696047,2696048,2696049,2696050,2696051,2696052,2696053,2696054,2696055,2696056,2696057,2696058,2696059,2696060,2696061,2696062,2696063],"Water Cauldron":[2731792,2731793,2731794,2731795,2731798,2731799],"Weeping Vines":[2734464,2734465,2734466,2734467,2734468,2734469,2734470,2734471,2734472,2734473,2734474,2734475,2734476,2734477,2734478,2734479,2734480,2734481,2734482,2734483,2734484,2734485,2734486,2734487,2734494,2734495],"Weighted Pressure Plate Heavy":[2696432,2696433,2696434,2696435,2696436,2696437,2696438,2696439,2696440,2696441,2696442,2696443,2696444,2696445,2696446,2696447],"Weighted Pressure Plate Light":[2696512,2696513,2696514,2696515,2696516,2696517,2696518,2696519,2696520,2696521,2696522,2696523,2696524,2696525,2696526,2696527],"Wheat Block":[2696832,2696833,2696834,2696835,2696836,2696837,2696838,2696839],"White Tulip":[2697468],"Wither Rose":[2730127],"Wool":[2697712,2697713,2697714,2697715,2697716,2697717,2697718,2697719,2697720,2697721,2697722,2697723,2697724,2697725,2697726,2697727],"Xenon":[2623487],"Ytterbium":[2623729],"Yttrium":[2623770],"Zinc":[2624344],"Zirconium":[2624538],"ate!upd":[2637070],"reserved6":[2675188],"update!":[2636948]},"stateDataBits":8} \ No newline at end of file From 7f3de835e4c53faf11cbfce4ead42cbbfbe4bb03 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Oct 2023 15:23:39 +0100 Subject: [PATCH 1447/1858] Block: private internal function --- src/block/Block.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Block.php b/src/block/Block.php index a81b152117..a8b370cc7c 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -95,7 +95,7 @@ class Block{ * The type ID is included in the XOR mask. This is not necessary to improve distribution, but it reduces the number * of operations required to compute the state ID (micro optimization). */ - public static function computeStateIdXorMask(int $typeId) : int{ + private static function computeStateIdXorMask(int $typeId) : int{ return $typeId << self::INTERNAL_STATE_DATA_BITS | (Binary::readLong(hash('xxh3', Binary::writeLLong($typeId), binary: true)) & self::INTERNAL_STATE_DATA_MASK); From 48dcf0e32c75067b187864de372b9a76548f46c4 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Tue, 17 Oct 2023 16:25:13 +0100 Subject: [PATCH 1448/1858] Farmland: Remember relative location of nearby water in blockstate data (#6090) Farmland can end up scanning up to 162 blocks looking for water in the worst case. This is obviously not great for huge farms where there are thousands of blocks of the stuff. In most farms, the water won't be moved, and nor will the farmland. This means that we can avoid this costly search on random updates. This PR implements a cache using blockstate data (only possible in PM5) which stores an index mapping to a coordinate offset where water was previously found by this farmland block. This allows the farmland to avoid water searching entirely in most cases. This is a colossal improvement as compared to scanning the whole 9x2x9 area every time, which, on average, scans about 40 blocks to find water if the water is at the same Y coordinate. In real terms this translates into about a 8x performance improvement for farmland (see timings below). --- src/block/Block.php | 2 +- src/block/Farmland.php | 88 +++++++++++++++++-- .../block_factory_consistency_check.json | 2 +- .../BlockSerializerDeserializerTest.php | 3 + 4 files changed, 86 insertions(+), 9 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index a8b370cc7c..189c0419dc 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -61,7 +61,7 @@ use function hash; use const PHP_INT_MAX; class Block{ - public const INTERNAL_STATE_DATA_BITS = 8; + public const INTERNAL_STATE_DATA_BITS = 11; public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS); /** diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 70a6eeba78..c2694dd831 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -31,15 +31,40 @@ use pocketmine\event\entity\EntityTrampleFarmlandEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; +use function intdiv; use function lcg_value; class Farmland extends Transparent{ public const MAX_WETNESS = 7; + private const WATER_SEARCH_HORIZONTAL_LENGTH = 9; + + private const WATER_SEARCH_VERTICAL_LENGTH = 2; + + private const WATER_POSITION_INDEX_UNKNOWN = -1; + /** Total possible options for water X/Z indexes */ + private const WATER_POSITION_INDICES_TOTAL = (self::WATER_SEARCH_HORIZONTAL_LENGTH ** 2) * 2; + protected int $wetness = 0; //"moisture" blockstate property in PC + /** + * Cached value indicating the relative coordinates of the most recently found water block. + * + * If this is set to a non-unknown value, the farmland block will check the relative coordinates indicated by + * this value for water, before searching the entire 9x2x9 grid around the farmland. This significantly benefits + * hydrating or fully hydrated farmland, avoiding the need for costly searches on every random tick. + * + * If the coordinates indicated don't contain water, the full 9x2x9 volume will be searched as before. A new index + * will be recorded if water is found, otherwise it will be set to unknown and future searches will search the full + * 9x2x9 volume again. + * + * This property is not exposed to the API or saved on disk. It is only used by PocketMine-MP at runtime as a cache. + */ + private int $waterPositionIndex = self::WATER_POSITION_INDEX_UNKNOWN; + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->boundedIntAuto(0, self::MAX_WETNESS, $this->wetness); + $w->boundedIntAuto(-1, self::WATER_POSITION_INDICES_TOTAL - 1, $this->waterPositionIndex); } public function getWetness() : int{ return $this->wetness; } @@ -53,6 +78,22 @@ class Farmland extends Transparent{ return $this; } + /** + * @internal + */ + public function getWaterPositionIndex() : int{ return $this->waterPositionIndex; } + + /** + * @internal + */ + public function setWaterPositionIndex(int $waterPositionIndex) : self{ + if($waterPositionIndex < -1 || $waterPositionIndex >= self::WATER_POSITION_INDICES_TOTAL){ + throw new \InvalidArgumentException("Water XZ index must be in range -1 ... " . (self::WATER_POSITION_INDICES_TOTAL - 1)); + } + $this->waterPositionIndex = $waterPositionIndex; + return $this; + } + /** * @return AxisAlignedBB[] */ @@ -72,6 +113,11 @@ class Farmland extends Transparent{ public function onRandomTick() : void{ $world = $this->position->getWorld(); + + //this property may be updated by canHydrate() - track this so we know if we need to set the block again + $oldWaterPositionIndex = $this->waterPositionIndex; + $changed = false; + if(!$this->canHydrate()){ if($this->wetness > 0){ $event = new FarmlandHydrationChangeEvent($this, $this->wetness, $this->wetness - 1); @@ -79,9 +125,11 @@ class Farmland extends Transparent{ if(!$event->isCancelled()){ $this->wetness = $event->getNewHydration(); $world->setBlock($this->position, $this, false); + $changed = true; } }else{ $world->setBlock($this->position, VanillaBlocks::DIRT()); + $changed = true; } }elseif($this->wetness < self::MAX_WETNESS){ $event = new FarmlandHydrationChangeEvent($this, $this->wetness, self::MAX_WETNESS); @@ -89,8 +137,14 @@ class Farmland extends Transparent{ if(!$event->isCancelled()){ $this->wetness = $event->getNewHydration(); $world->setBlock($this->position, $this, false); + $changed = true; } } + + if(!$changed && $oldWaterPositionIndex !== $this->waterPositionIndex){ + //ensure the water square index is saved regardless of whether anything else happened + $world->setBlock($this->position, $this, false); + } } public function onEntityLand(Entity $entity) : ?float{ @@ -105,19 +159,39 @@ class Farmland extends Transparent{ } protected function canHydrate() : bool{ - //TODO: check rain - $start = $this->position->add(-4, 0, -4); - $end = $this->position->add(4, 1, 4); - for($y = $start->y; $y <= $end->y; ++$y){ - for($z = $start->z; $z <= $end->z; ++$z){ - for($x = $start->x; $x <= $end->x; ++$x){ - if($this->position->getWorld()->getBlockAt($x, $y, $z) instanceof Water){ + $world = $this->position->getWorld(); + + $startX = $this->position->getFloorX() - (int) (self::WATER_SEARCH_HORIZONTAL_LENGTH / 2); + $startY = $this->position->getFloorY(); + $startZ = $this->position->getFloorZ() - (int) (self::WATER_SEARCH_HORIZONTAL_LENGTH / 2); + + if($this->waterPositionIndex !== self::WATER_POSITION_INDEX_UNKNOWN){ + $raw = $this->waterPositionIndex; + $x = $raw % self::WATER_SEARCH_HORIZONTAL_LENGTH; + $raw = intdiv($raw, self::WATER_SEARCH_HORIZONTAL_LENGTH); + $z = $raw % self::WATER_SEARCH_HORIZONTAL_LENGTH; + $raw = intdiv($raw, self::WATER_SEARCH_HORIZONTAL_LENGTH); + $y = $raw % self::WATER_SEARCH_VERTICAL_LENGTH; + + if($world->getBlockAt($startX + $x, $startY + $y, $startZ + $z) instanceof Water){ + return true; + } + } + + //no water found at cached position - search the whole area + //y will increment after x/z have been exhausted, as usually water will be at the same Y as the farmland + for($y = 0; $y < self::WATER_SEARCH_VERTICAL_LENGTH; $y++){ + for($x = 0; $x < self::WATER_SEARCH_HORIZONTAL_LENGTH; $x++){ + for($z = 0; $z < self::WATER_SEARCH_HORIZONTAL_LENGTH; $z++){ + if($world->getBlockAt($startX + $x, $startY + $y, $startZ + $z) instanceof Water){ + $this->waterPositionIndex = $x + ($z * self::WATER_SEARCH_HORIZONTAL_LENGTH) + ($y * self::WATER_SEARCH_HORIZONTAL_LENGTH ** 2); return true; } } } } + $this->waterPositionIndex = self::WATER_POSITION_INDEX_UNKNOWN; return false; } diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 4a4c82b1ec..9e68daf0c4 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"???":[2624113],"Acacia Button":[2560272,2560273,2560276,2560277,2560278,2560279,2560280,2560281,2560284,2560285,2560286,2560287],"Acacia Door":[2560704,2560705,2560706,2560707,2560708,2560709,2560710,2560711,2560712,2560713,2560714,2560715,2560716,2560717,2560718,2560719,2560720,2560721,2560722,2560723,2560724,2560725,2560726,2560727,2560728,2560729,2560730,2560731,2560732,2560733,2560734,2560735],"Acacia Fence":[2561017],"Acacia Fence Gate":[2561136,2561137,2561138,2561139,2561140,2561141,2561142,2561143,2561144,2561145,2561146,2561147,2561148,2561149,2561150,2561151],"Acacia Leaves":[2561444,2561445,2561446,2561447],"Acacia Log":[2561576,2561577,2561578,2561579,2561582,2561583],"Acacia Planks":[2561834],"Acacia Pressure Plate":[2562296,2562297],"Acacia Sapling":[2562386,2562387],"Acacia Sign":[2562560,2562561,2562562,2562563,2562564,2562565,2562566,2562567,2562568,2562569,2562570,2562571,2562572,2562573,2562574,2562575],"Acacia Slab":[2562836,2562837,2562838],"Acacia Stairs":[2563176,2563177,2563178,2563179,2563180,2563181,2563182,2563183],"Acacia Trapdoor":[2563456,2563457,2563458,2563459,2563460,2563461,2563462,2563463,2563464,2563465,2563466,2563467,2563468,2563469,2563470,2563471],"Acacia Wall Sign":[2563768,2563769,2563770,2563771],"Acacia Wood":[2563984,2563985,2563986,2563987,2563988,2563989],"Actinium":[2594209],"Activator Rail":[2564338,2564339,2564340,2564341,2564342,2564343,2564346,2564347,2564348,2564349,2564350,2564351],"Air":[2560220],"All Sided Mushroom Stem":[2564457],"Allium":[2564668],"Aluminum":[2594489],"Americium":[2594724],"Amethyst":[2698349],"Amethyst Cluster":[2697760,2697761,2697762,2697763,2697764,2697765,2697766,2697767,2697768,2697769,2697770,2697771,2697772,2697773,2697774,2697775,2697776,2697777,2697778,2697779,2697780,2697781,2697782,2697783],"Ancient Debris":[2698682],"Andesite":[2564865],"Andesite Slab":[2565208,2565210,2565211],"Andesite Stairs":[2565528,2565529,2565530,2565531,2565532,2565533,2565534,2565535],"Andesite Wall":[2565632,2565633,2565634,2565635,2565636,2565637,2565638,2565639,2565640,2565641,2565642,2565643,2565644,2565645,2565646,2565647,2565654,2565696,2565697,2565698,2565699,2565700,2565701,2565702,2565703,2565704,2565705,2565706,2565707,2565708,2565709,2565710,2565711,2565712,2565713,2565714,2565715,2565716,2565717,2565718,2565719,2565720,2565721,2565722,2565723,2565724,2565725,2565726,2565727,2565728,2565729,2565730,2565731,2565732,2565733,2565734,2565735,2565736,2565737,2565738,2565739,2565740,2565741,2565742,2565743,2565744,2565745,2565746,2565747,2565748,2565749,2565750,2565751,2565752,2565753,2565754,2565755,2565756,2565757,2565758,2565759,2565760,2565761,2565762,2565763,2565764,2565765,2565766,2565767,2565768,2565769,2565770,2565771,2565772,2565773,2565774,2565775,2565782,2565824,2565825,2565826,2565827,2565828,2565829,2565830,2565831,2565832,2565833,2565834,2565835,2565836,2565837,2565838,2565839,2565840,2565841,2565842,2565843,2565844,2565845,2565846,2565847,2565848,2565849,2565850,2565851,2565852,2565853,2565854,2565855,2565856,2565857,2565858,2565859,2565860,2565861,2565862,2565863,2565864,2565865,2565866,2565867,2565868,2565869,2565870,2565871,2565872,2565873,2565874,2565875,2565876,2565877,2565878,2565879,2565880,2565881,2565882,2565883,2565884,2565885,2565886,2565887],"Antimony":[2595005],"Anvil":[2565936,2565937,2565939,2565940,2565941,2565943,2565944,2565945,2565947,2565948,2565949,2565951],"Argon":[2595322],"Arsenic":[2595370],"Astatine":[2595621],"Azalea Leaves":[2735748,2735749,2735750,2735751],"Azure Bluet":[2566231],"Bamboo":[2566465,2566466,2566467,2566469,2566470,2566471,2566473,2566474,2566475,2566477,2566478,2566479],"Bamboo Sapling":[2566668,2566669],"Banner":[2566912,2566913,2566914,2566915,2566916,2566917,2566918,2566919,2566920,2566921,2566922,2566923,2566924,2566925,2566926,2566927,2566928,2566929,2566930,2566931,2566932,2566933,2566934,2566935,2566936,2566937,2566938,2566939,2566940,2566941,2566942,2566943,2566944,2566945,2566946,2566947,2566948,2566949,2566950,2566951,2566952,2566953,2566954,2566955,2566956,2566957,2566958,2566959,2566960,2566961,2566962,2566963,2566964,2566965,2566966,2566967,2566968,2566969,2566970,2566971,2566972,2566973,2566974,2566975,2566976,2566977,2566978,2566979,2566980,2566981,2566982,2566983,2566984,2566985,2566986,2566987,2566988,2566989,2566990,2566991,2566992,2566993,2566994,2566995,2566996,2566997,2566998,2566999,2567000,2567001,2567002,2567003,2567004,2567005,2567006,2567007,2567008,2567009,2567010,2567011,2567012,2567013,2567014,2567015,2567016,2567017,2567018,2567019,2567020,2567021,2567022,2567023,2567024,2567025,2567026,2567027,2567028,2567029,2567030,2567031,2567032,2567033,2567034,2567035,2567036,2567037,2567038,2567039,2567040,2567041,2567042,2567043,2567044,2567045,2567046,2567047,2567048,2567049,2567050,2567051,2567052,2567053,2567054,2567055,2567056,2567057,2567058,2567059,2567060,2567061,2567062,2567063,2567064,2567065,2567066,2567067,2567068,2567069,2567070,2567071,2567072,2567073,2567074,2567075,2567076,2567077,2567078,2567079,2567080,2567081,2567082,2567083,2567084,2567085,2567086,2567087,2567088,2567089,2567090,2567091,2567092,2567093,2567094,2567095,2567096,2567097,2567098,2567099,2567100,2567101,2567102,2567103,2567104,2567105,2567106,2567107,2567108,2567109,2567110,2567111,2567112,2567113,2567114,2567115,2567116,2567117,2567118,2567119,2567120,2567121,2567122,2567123,2567124,2567125,2567126,2567127,2567128,2567129,2567130,2567131,2567132,2567133,2567134,2567135,2567136,2567137,2567138,2567139,2567140,2567141,2567142,2567143,2567144,2567145,2567146,2567147,2567148,2567149,2567150,2567151,2567152,2567153,2567154,2567155,2567156,2567157,2567158,2567159,2567160,2567161,2567162,2567163,2567164,2567165,2567166,2567167],"Barium":[2595884],"Barrel":[2567344,2567345,2567346,2567347,2567350,2567351,2567352,2567353,2567354,2567355,2567358,2567359],"Barrier":[2567542],"Basalt":[2698760,2698761,2698762],"Beacon":[2567785],"Bed Block":[2567936,2567937,2567938,2567939,2567940,2567941,2567942,2567943,2567944,2567945,2567946,2567947,2567948,2567949,2567950,2567951,2567952,2567953,2567954,2567955,2567956,2567957,2567958,2567959,2567960,2567961,2567962,2567963,2567964,2567965,2567966,2567967,2567968,2567969,2567970,2567971,2567972,2567973,2567974,2567975,2567976,2567977,2567978,2567979,2567980,2567981,2567982,2567983,2567984,2567985,2567986,2567987,2567988,2567989,2567990,2567991,2567992,2567993,2567994,2567995,2567996,2567997,2567998,2567999,2568000,2568001,2568002,2568003,2568004,2568005,2568006,2568007,2568008,2568009,2568010,2568011,2568012,2568013,2568014,2568015,2568016,2568017,2568018,2568019,2568020,2568021,2568022,2568023,2568024,2568025,2568026,2568027,2568028,2568029,2568030,2568031,2568032,2568033,2568034,2568035,2568036,2568037,2568038,2568039,2568040,2568041,2568042,2568043,2568044,2568045,2568046,2568047,2568048,2568049,2568050,2568051,2568052,2568053,2568054,2568055,2568056,2568057,2568058,2568059,2568060,2568061,2568062,2568063,2568064,2568065,2568066,2568067,2568068,2568069,2568070,2568071,2568072,2568073,2568074,2568075,2568076,2568077,2568078,2568079,2568080,2568081,2568082,2568083,2568084,2568085,2568086,2568087,2568088,2568089,2568090,2568091,2568092,2568093,2568094,2568095,2568096,2568097,2568098,2568099,2568100,2568101,2568102,2568103,2568104,2568105,2568106,2568107,2568108,2568109,2568110,2568111,2568112,2568113,2568114,2568115,2568116,2568117,2568118,2568119,2568120,2568121,2568122,2568123,2568124,2568125,2568126,2568127,2568128,2568129,2568130,2568131,2568132,2568133,2568134,2568135,2568136,2568137,2568138,2568139,2568140,2568141,2568142,2568143,2568144,2568145,2568146,2568147,2568148,2568149,2568150,2568151,2568152,2568153,2568154,2568155,2568156,2568157,2568158,2568159,2568160,2568161,2568162,2568163,2568164,2568165,2568166,2568167,2568168,2568169,2568170,2568171,2568172,2568173,2568174,2568175,2568176,2568177,2568178,2568179,2568180,2568181,2568182,2568183,2568184,2568185,2568186,2568187,2568188,2568189,2568190,2568191],"Bedrock":[2568196,2568197],"Beetroot Block":[2568656,2568657,2568658,2568659,2568660,2568661,2568662,2568663],"Bell":[2568768,2568769,2568770,2568771,2568772,2568773,2568774,2568775,2568776,2568777,2568778,2568779,2568780,2568781,2568782,2568783],"Berkelium":[2596102],"Beryllium":[2596419],"Big Dripleaf":[2741200,2741201,2741202,2741203,2741204,2741205,2741206,2741207,2741208,2741209,2741210,2741211,2741212,2741213,2741214,2741215],"Big Dripleaf Stem":[2741448,2741449,2741450,2741451],"Birch Button":[2568992,2568993,2568994,2568995,2568998,2568999,2569000,2569001,2569002,2569003,2569006,2569007],"Birch Door":[2569312,2569313,2569314,2569315,2569316,2569317,2569318,2569319,2569320,2569321,2569322,2569323,2569324,2569325,2569326,2569327,2569328,2569329,2569330,2569331,2569332,2569333,2569334,2569335,2569336,2569337,2569338,2569339,2569340,2569341,2569342,2569343],"Birch Fence":[2569526],"Birch Fence Gate":[2569904,2569905,2569906,2569907,2569908,2569909,2569910,2569911,2569912,2569913,2569914,2569915,2569916,2569917,2569918,2569919],"Birch Leaves":[2570200,2570201,2570202,2570203],"Birch Log":[2570432,2570433,2570436,2570437,2570438,2570439],"Birch Planks":[2570714],"Birch Pressure Plate":[2570946,2570947],"Birch Sapling":[2571148,2571149],"Birch Sign":[2571408,2571409,2571410,2571411,2571412,2571413,2571414,2571415,2571416,2571417,2571418,2571419,2571420,2571421,2571422,2571423],"Birch Slab":[2571532,2571533,2571534],"Birch Stairs":[2571880,2571881,2571882,2571883,2571884,2571885,2571886,2571887],"Birch Trapdoor":[2572272,2572273,2572274,2572275,2572276,2572277,2572278,2572279,2572280,2572281,2572282,2572283,2572284,2572285,2572286,2572287],"Birch Wall Sign":[2572492,2572493,2572494,2572495],"Birch Wood":[2572762,2572763,2572764,2572765,2572766,2572767],"Bismuth":[2596655],"Blackstone":[2699667],"Blackstone Slab":[2699812,2699814,2699815],"Blackstone Stairs":[2700040,2700041,2700042,2700043,2700044,2700045,2700046,2700047],"Blackstone Wall":[2700290,2700304,2700305,2700306,2700307,2700308,2700309,2700310,2700311,2700312,2700313,2700314,2700315,2700316,2700317,2700318,2700319,2700352,2700353,2700354,2700355,2700356,2700357,2700358,2700359,2700360,2700361,2700362,2700363,2700364,2700365,2700366,2700367,2700368,2700369,2700370,2700371,2700372,2700373,2700374,2700375,2700376,2700377,2700378,2700379,2700380,2700381,2700382,2700383,2700384,2700385,2700386,2700387,2700388,2700389,2700390,2700391,2700392,2700393,2700394,2700395,2700396,2700397,2700398,2700399,2700400,2700401,2700402,2700403,2700404,2700405,2700406,2700407,2700408,2700409,2700410,2700411,2700412,2700413,2700414,2700415,2700418,2700432,2700433,2700434,2700435,2700436,2700437,2700438,2700439,2700440,2700441,2700442,2700443,2700444,2700445,2700446,2700447,2700480,2700481,2700482,2700483,2700484,2700485,2700486,2700487,2700488,2700489,2700490,2700491,2700492,2700493,2700494,2700495,2700496,2700497,2700498,2700499,2700500,2700501,2700502,2700503,2700504,2700505,2700506,2700507,2700508,2700509,2700510,2700511,2700512,2700513,2700514,2700515,2700516,2700517,2700518,2700519,2700520,2700521,2700522,2700523,2700524,2700525,2700526,2700527,2700528,2700529,2700530,2700531,2700532,2700533,2700534,2700535,2700536,2700537,2700538,2700539,2700540,2700541,2700542,2700543],"Blast Furnace":[2573168,2573169,2573170,2573171,2573172,2573173,2573174,2573175],"Blue Ice":[2573619],"Blue Orchid":[2574037],"Blue Torch":[2574128,2574129,2574133,2574134,2574135],"Bohrium":[2596992],"Bone Block":[2574452,2574453,2574455],"Bookshelf":[2574696],"Boron":[2597121],"Brewing Stand":[2574960,2574961,2574962,2574963,2574964,2574965,2574966,2574967],"Brick Slab":[2575184,2575185,2575187],"Brick Stairs":[2575608,2575609,2575610,2575611,2575612,2575613,2575614,2575615],"Brick Wall":[2575616,2575617,2575618,2575619,2575620,2575621,2575622,2575623,2575624,2575625,2575626,2575627,2575628,2575629,2575630,2575631,2575632,2575633,2575634,2575635,2575636,2575637,2575638,2575639,2575640,2575641,2575642,2575643,2575644,2575645,2575646,2575647,2575648,2575649,2575650,2575651,2575652,2575653,2575654,2575655,2575656,2575657,2575658,2575659,2575660,2575661,2575662,2575663,2575664,2575665,2575666,2575667,2575668,2575669,2575670,2575671,2575672,2575673,2575674,2575675,2575676,2575677,2575678,2575679,2575717,2575728,2575729,2575730,2575731,2575732,2575733,2575734,2575735,2575736,2575737,2575738,2575739,2575740,2575741,2575742,2575743,2575744,2575745,2575746,2575747,2575748,2575749,2575750,2575751,2575752,2575753,2575754,2575755,2575756,2575757,2575758,2575759,2575760,2575761,2575762,2575763,2575764,2575765,2575766,2575767,2575768,2575769,2575770,2575771,2575772,2575773,2575774,2575775,2575776,2575777,2575778,2575779,2575780,2575781,2575782,2575783,2575784,2575785,2575786,2575787,2575788,2575789,2575790,2575791,2575792,2575793,2575794,2575795,2575796,2575797,2575798,2575799,2575800,2575801,2575802,2575803,2575804,2575805,2575806,2575807,2575845,2575856,2575857,2575858,2575859,2575860,2575861,2575862,2575863,2575864,2575865,2575866,2575867,2575868,2575869,2575870,2575871],"Bricks":[2575954],"Bromine":[2597549],"Brown Mushroom":[2576600],"Brown Mushroom Block":[2576784,2576785,2576786,2576787,2576788,2576789,2576790,2576791,2576796,2576797,2576799],"Budding Amethyst":[2697080],"Cactus":[2577088,2577089,2577090,2577091,2577092,2577093,2577094,2577095,2577096,2577097,2577098,2577099,2577100,2577101,2577102,2577103],"Cadmium":[2597701],"Cake":[2577240,2577241,2577242,2577243,2577244,2577245,2577246],"Cake With Candle":[2729638,2729639],"Cake With Dyed Candle":[2729856,2729857,2729858,2729859,2729860,2729861,2729862,2729863,2729864,2729865,2729866,2729867,2729868,2729869,2729870,2729871,2729872,2729873,2729874,2729875,2729876,2729877,2729878,2729879,2729880,2729881,2729882,2729883,2729884,2729885,2729886,2729887],"Calcite":[2704877],"Calcium":[2597941],"Californium":[2598331],"Candle":[2729200,2729201,2729202,2729203,2729204,2729205,2729206,2729207],"Carbon":[2598640],"Carpet":[2577424,2577425,2577426,2577427,2577428,2577429,2577430,2577431,2577432,2577433,2577434,2577435,2577436,2577437,2577438,2577439],"Carrot Block":[2577824,2577825,2577826,2577827,2577828,2577829,2577830,2577831],"Cartography Table":[2730733],"Carved Pumpkin":[2578164,2578165,2578166,2578167],"Cauldron":[2731561],"Cave Vines":[2736512,2736513,2736514,2736515,2736516,2736517,2736518,2736519,2736520,2736521,2736522,2736523,2736524,2736525,2736526,2736527,2736532,2736533,2736536,2736537,2736538,2736539,2736540,2736541,2736542,2736543,2736544,2736545,2736546,2736547,2736548,2736549,2736550,2736551,2736552,2736553,2736554,2736555,2736556,2736557,2736558,2736559,2736564,2736565,2736568,2736569,2736570,2736571,2736572,2736573,2736574,2736575,2736576,2736577,2736578,2736579,2736580,2736581,2736582,2736583,2736584,2736585,2736586,2736587,2736588,2736589,2736590,2736591,2736596,2736597,2736600,2736601,2736602,2736603,2736604,2736605,2736606,2736607,2736608,2736609,2736610,2736611,2736612,2736613,2736614,2736615,2736616,2736617,2736618,2736619,2736620,2736621,2736622,2736623,2736628,2736629,2736632,2736633,2736634,2736635,2736636,2736637,2736638,2736639],"Cerium":[2598839],"Cesium":[2599158],"Chain":[2734637,2734638,2734639],"Cherry Button":[2737042,2737043,2737044,2737045,2737046,2737047,2737050,2737051,2737052,2737053,2737054,2737055],"Cherry Door":[2737216,2737217,2737218,2737219,2737220,2737221,2737222,2737223,2737224,2737225,2737226,2737227,2737228,2737229,2737230,2737231,2737232,2737233,2737234,2737235,2737236,2737237,2737238,2737239,2737240,2737241,2737242,2737243,2737244,2737245,2737246,2737247],"Cherry Fence":[2737525],"Cherry Fence Gate":[2737744,2737745,2737746,2737747,2737748,2737749,2737750,2737751,2737752,2737753,2737754,2737755,2737756,2737757,2737758,2737759],"Cherry Leaves":[2737948,2737949,2737950,2737951],"Cherry Log":[2738296,2738297,2738298,2738299,2738302,2738303],"Cherry Planks":[2738452],"Cherry Pressure Plate":[2738928,2738929],"Cherry Sign":[2739264,2739265,2739266,2739267,2739268,2739269,2739270,2739271,2739272,2739273,2739274,2739275,2739276,2739277,2739278,2739279],"Cherry Slab":[2739648,2739649,2739651],"Cherry Stairs":[2739904,2739905,2739906,2739907,2739908,2739909,2739910,2739911],"Cherry Trapdoor":[2740192,2740193,2740194,2740195,2740196,2740197,2740198,2740199,2740200,2740201,2740202,2740203,2740204,2740205,2740206,2740207],"Cherry Wall Sign":[2740252,2740253,2740254,2740255],"Cherry Wood":[2740648,2740649,2740652,2740653,2740654,2740655],"Chest":[2578568,2578569,2578570,2578571],"Chiseled Bookshelf":[2742272,2742273,2742274,2742275,2742276,2742277,2742278,2742279,2742280,2742281,2742282,2742283,2742284,2742285,2742286,2742287,2742288,2742289,2742290,2742291,2742292,2742293,2742294,2742295,2742296,2742297,2742298,2742299,2742300,2742301,2742302,2742303,2742304,2742305,2742306,2742307,2742308,2742309,2742310,2742311,2742312,2742313,2742314,2742315,2742316,2742317,2742318,2742319,2742320,2742321,2742322,2742323,2742324,2742325,2742326,2742327,2742328,2742329,2742330,2742331,2742332,2742333,2742334,2742335,2742336,2742337,2742338,2742339,2742340,2742341,2742342,2742343,2742344,2742345,2742346,2742347,2742348,2742349,2742350,2742351,2742352,2742353,2742354,2742355,2742356,2742357,2742358,2742359,2742360,2742361,2742362,2742363,2742364,2742365,2742366,2742367,2742368,2742369,2742370,2742371,2742372,2742373,2742374,2742375,2742376,2742377,2742378,2742379,2742380,2742381,2742382,2742383,2742384,2742385,2742386,2742387,2742388,2742389,2742390,2742391,2742392,2742393,2742394,2742395,2742396,2742397,2742398,2742399,2742400,2742401,2742402,2742403,2742404,2742405,2742406,2742407,2742408,2742409,2742410,2742411,2742412,2742413,2742414,2742415,2742416,2742417,2742418,2742419,2742420,2742421,2742422,2742423,2742424,2742425,2742426,2742427,2742428,2742429,2742430,2742431,2742432,2742433,2742434,2742435,2742436,2742437,2742438,2742439,2742440,2742441,2742442,2742443,2742444,2742445,2742446,2742447,2742448,2742449,2742450,2742451,2742452,2742453,2742454,2742455,2742456,2742457,2742458,2742459,2742460,2742461,2742462,2742463,2742464,2742465,2742466,2742467,2742468,2742469,2742470,2742471,2742472,2742473,2742474,2742475,2742476,2742477,2742478,2742479,2742480,2742481,2742482,2742483,2742484,2742485,2742486,2742487,2742488,2742489,2742490,2742491,2742492,2742493,2742494,2742495,2742496,2742497,2742498,2742499,2742500,2742501,2742502,2742503,2742504,2742505,2742506,2742507,2742508,2742509,2742510,2742511,2742512,2742513,2742514,2742515,2742516,2742517,2742518,2742519,2742520,2742521,2742522,2742523,2742524,2742525,2742526,2742527],"Chiseled Deepslate":[2710178],"Chiseled Nether Bricks":[2710490],"Chiseled Polished Blackstone":[2702198],"Chiseled Quartz Block":[2578820,2578822,2578823],"Chiseled Red Sandstone":[2579100],"Chiseled Sandstone":[2579423],"Chiseled Stone Bricks":[2579586],"Chlorine":[2599314],"Chorus Flower":[2732968,2732969,2732972,2732973,2732974,2732975],"Chorus Plant":[2733195],"Chromium":[2599618],"Clay Block":[2579928],"Coal Block":[2580113],"Coal Ore":[2580456],"Cobalt":[2599759],"Cobbled Deepslate":[2707954],"Cobbled Deepslate Slab":[2708012,2708014,2708015],"Cobbled Deepslate Stairs":[2708408,2708409,2708410,2708411,2708412,2708413,2708414,2708415],"Cobbled Deepslate Wall":[2708517,2708528,2708529,2708530,2708531,2708532,2708533,2708534,2708535,2708536,2708537,2708538,2708539,2708540,2708541,2708542,2708543,2708544,2708545,2708546,2708547,2708548,2708549,2708550,2708551,2708552,2708553,2708554,2708555,2708556,2708557,2708558,2708559,2708560,2708561,2708562,2708563,2708564,2708565,2708566,2708567,2708568,2708569,2708570,2708571,2708572,2708573,2708574,2708575,2708576,2708577,2708578,2708579,2708580,2708581,2708582,2708583,2708584,2708585,2708586,2708587,2708588,2708589,2708590,2708591,2708592,2708593,2708594,2708595,2708596,2708597,2708598,2708599,2708600,2708601,2708602,2708603,2708604,2708605,2708606,2708607,2708645,2708656,2708657,2708658,2708659,2708660,2708661,2708662,2708663,2708664,2708665,2708666,2708667,2708668,2708669,2708670,2708671,2708672,2708673,2708674,2708675,2708676,2708677,2708678,2708679,2708680,2708681,2708682,2708683,2708684,2708685,2708686,2708687,2708688,2708689,2708690,2708691,2708692,2708693,2708694,2708695,2708696,2708697,2708698,2708699,2708700,2708701,2708702,2708703,2708704,2708705,2708706,2708707,2708708,2708709,2708710,2708711,2708712,2708713,2708714,2708715,2708716,2708717,2708718,2708719,2708720,2708721,2708722,2708723,2708724,2708725,2708726,2708727,2708728,2708729,2708730,2708731,2708732,2708733,2708734,2708735],"Cobblestone":[2580494],"Cobblestone Slab":[2580816,2580818,2580819],"Cobblestone Stairs":[2581008,2581009,2581010,2581011,2581012,2581013,2581014,2581015],"Cobblestone Wall":[2581248,2581249,2581250,2581251,2581252,2581253,2581254,2581255,2581256,2581257,2581258,2581259,2581260,2581261,2581262,2581263,2581264,2581265,2581266,2581267,2581268,2581269,2581270,2581271,2581272,2581273,2581274,2581275,2581276,2581277,2581278,2581279,2581280,2581281,2581282,2581283,2581284,2581285,2581286,2581287,2581288,2581289,2581290,2581291,2581292,2581293,2581294,2581295,2581296,2581297,2581298,2581299,2581300,2581301,2581302,2581303,2581304,2581305,2581306,2581307,2581308,2581309,2581310,2581311,2581344,2581345,2581346,2581347,2581348,2581349,2581350,2581351,2581352,2581353,2581354,2581355,2581356,2581357,2581358,2581359,2581363,2581376,2581377,2581378,2581379,2581380,2581381,2581382,2581383,2581384,2581385,2581386,2581387,2581388,2581389,2581390,2581391,2581392,2581393,2581394,2581395,2581396,2581397,2581398,2581399,2581400,2581401,2581402,2581403,2581404,2581405,2581406,2581407,2581408,2581409,2581410,2581411,2581412,2581413,2581414,2581415,2581416,2581417,2581418,2581419,2581420,2581421,2581422,2581423,2581424,2581425,2581426,2581427,2581428,2581429,2581430,2581431,2581432,2581433,2581434,2581435,2581436,2581437,2581438,2581439,2581472,2581473,2581474,2581475,2581476,2581477,2581478,2581479,2581480,2581481,2581482,2581483,2581484,2581485,2581486,2581487,2581491],"Cobweb":[2581680],"Cocoa Block":[2581936,2581937,2581938,2581939,2581940,2581941,2581942,2581943,2581944,2581945,2581946,2581947],"Compound Creator":[2582064,2582065,2582066,2582067],"Concrete":[2582272,2582273,2582274,2582275,2582276,2582277,2582278,2582279,2582280,2582281,2582282,2582283,2582284,2582285,2582286,2582287],"Concrete Powder":[2582576,2582577,2582578,2582579,2582580,2582581,2582582,2582583,2582584,2582585,2582586,2582587,2582588,2582589,2582590,2582591],"Copernicium":[2600444],"Copper":[2600600],"Copper Block":[2727976,2727977,2727978,2727979,2727980,2727981,2727982,2727983],"Copper Ore":[2724945],"Coral":[2582850,2582852,2582853,2582854,2582855,2582858,2582860,2582861,2582862,2582863],"Coral Block":[2583185,2583188,2583189,2583190,2583191,2583193,2583196,2583197,2583198,2583199],"Coral Fan":[2583523,2583524,2583525,2583526,2583527,2583531,2583532,2583533,2583534,2583535,2583539,2583540,2583541,2583542,2583543,2583547,2583548,2583549,2583550,2583551],"Cornflower":[2583696],"Cracked Deepslate Bricks":[2706413],"Cracked Deepslate Tiles":[2707692],"Cracked Nether Bricks":[2710722],"Cracked Polished Blackstone Bricks":[2703370],"Cracked Stone Bricks":[2584050],"Crafting Table":[2584268],"Crimson Button":[2717232,2717233,2717234,2717235,2717238,2717239,2717240,2717241,2717242,2717243,2717246,2717247],"Crimson Door":[2718784,2718785,2718786,2718787,2718788,2718789,2718790,2718791,2718792,2718793,2718794,2718795,2718796,2718797,2718798,2718799,2718800,2718801,2718802,2718803,2718804,2718805,2718806,2718807,2718808,2718809,2718810,2718811,2718812,2718813,2718814,2718815],"Crimson Fence":[2713497],"Crimson Fence Gate":[2719536,2719537,2719538,2719539,2719540,2719541,2719542,2719543,2719544,2719545,2719546,2719547,2719548,2719549,2719550,2719551],"Crimson Hyphae":[2715840,2715841,2715844,2715845,2715846,2715847],"Crimson Planks":[2712775],"Crimson Pressure Plate":[2717972,2717973],"Crimson Roots":[2741901],"Crimson Sign":[2721120,2721121,2721122,2721123,2721124,2721125,2721126,2721127,2721128,2721129,2721130,2721131,2721132,2721133,2721134,2721135],"Crimson Slab":[2714352,2714353,2714354],"Crimson Stairs":[2720312,2720313,2720314,2720315,2720316,2720317,2720318,2720319],"Crimson Stem":[2714970,2714971,2714972,2714973,2714974,2714975],"Crimson Trapdoor":[2716640,2716641,2716642,2716643,2716644,2716645,2716646,2716647,2716648,2716649,2716650,2716651,2716652,2716653,2716654,2716655],"Crimson Wall Sign":[2721840,2721841,2721842,2721843],"Crying Obsidian":[2727325],"Curium":[2600713],"Cut Copper Block":[2728328,2728329,2728330,2728331,2728332,2728333,2728334,2728335],"Cut Copper Slab Slab":[2728584,2728585,2728586,2728587,2728588,2728589,2728590,2728591,2728592,2728593,2728594,2728595,2728596,2728597,2728598,2728599,2728600,2728601,2728602,2728603,2728604,2728605,2728606,2728607],"Cut Copper Stairs":[2728896,2728897,2728898,2728899,2728900,2728901,2728902,2728903,2728904,2728905,2728906,2728907,2728908,2728909,2728910,2728911,2728912,2728913,2728914,2728915,2728916,2728917,2728918,2728919,2728920,2728921,2728922,2728923,2728924,2728925,2728926,2728927,2728928,2728929,2728930,2728931,2728932,2728933,2728934,2728935,2728936,2728937,2728938,2728939,2728940,2728941,2728942,2728943,2728944,2728945,2728946,2728947,2728948,2728949,2728950,2728951,2728952,2728953,2728954,2728955,2728956,2728957,2728958,2728959],"Cut Red Sandstone":[2584380],"Cut Red Sandstone Slab":[2584708,2584709,2584711],"Cut Sandstone":[2585059],"Cut Sandstone Slab":[2585332,2585333,2585334],"Dandelion":[2585688],"Dark Oak Button":[2586096,2586097,2586098,2586099,2586102,2586103,2586104,2586105,2586106,2586107,2586110,2586111],"Dark Oak Door":[2586336,2586337,2586338,2586339,2586340,2586341,2586342,2586343,2586344,2586345,2586346,2586347,2586348,2586349,2586350,2586351,2586352,2586353,2586354,2586355,2586356,2586357,2586358,2586359,2586360,2586361,2586362,2586363,2586364,2586365,2586366,2586367],"Dark Oak Fence":[2586561],"Dark Oak Fence Gate":[2586816,2586817,2586818,2586819,2586820,2586821,2586822,2586823,2586824,2586825,2586826,2586827,2586828,2586829,2586830,2586831],"Dark Oak Leaves":[2587056,2587057,2587058,2587059],"Dark Oak Log":[2587344,2587345,2587348,2587349,2587350,2587351],"Dark Oak Planks":[2587602],"Dark Oak Pressure Plate":[2587678,2587679],"Dark Oak Sapling":[2587910,2587911],"Dark Oak Sign":[2588384,2588385,2588386,2588387,2588388,2588389,2588390,2588391,2588392,2588393,2588394,2588395,2588396,2588397,2588398,2588399],"Dark Oak Slab":[2588624,2588625,2588626],"Dark Oak Stairs":[2588848,2588849,2588850,2588851,2588852,2588853,2588854,2588855],"Dark Oak Trapdoor":[2588992,2588993,2588994,2588995,2588996,2588997,2588998,2588999,2589000,2589001,2589002,2589003,2589004,2589005,2589006,2589007],"Dark Oak Wall Sign":[2589400,2589401,2589402,2589403],"Dark Oak Wood":[2589634,2589635,2589636,2589637,2589638,2589639],"Dark Prismarine":[2589812],"Dark Prismarine Slab":[2590000,2590002,2590003],"Dark Prismarine Stairs":[2590368,2590369,2590370,2590371,2590372,2590373,2590374,2590375],"Darmstadtium":[2601036],"Daylight Sensor":[2590656,2590657,2590658,2590659,2590660,2590661,2590662,2590663,2590664,2590665,2590666,2590667,2590668,2590669,2590670,2590671,2590672,2590673,2590674,2590675,2590676,2590677,2590678,2590679,2590680,2590681,2590682,2590683,2590684,2590685,2590686,2590687],"Dead Bush":[2590793],"Deepslate":[2705088,2705089,2705091],"Deepslate Brick Slab":[2705500,2705501,2705502],"Deepslate Brick Stairs":[2705720,2705721,2705722,2705723,2705724,2705725,2705726,2705727],"Deepslate Brick Wall":[2705920,2705921,2705922,2705923,2705924,2705925,2705926,2705927,2705928,2705929,2705930,2705931,2705932,2705933,2705934,2705935,2705936,2705937,2705938,2705939,2705940,2705941,2705942,2705943,2705944,2705945,2705946,2705947,2705948,2705949,2705950,2705951,2705952,2705953,2705954,2705955,2705956,2705957,2705958,2705959,2705960,2705961,2705962,2705963,2705964,2705965,2705966,2705967,2705968,2705969,2705970,2705971,2705972,2705973,2705974,2705975,2705976,2705977,2705978,2705979,2705980,2705981,2705982,2705983,2705985,2706000,2706001,2706002,2706003,2706004,2706005,2706006,2706007,2706008,2706009,2706010,2706011,2706012,2706013,2706014,2706015,2706048,2706049,2706050,2706051,2706052,2706053,2706054,2706055,2706056,2706057,2706058,2706059,2706060,2706061,2706062,2706063,2706064,2706065,2706066,2706067,2706068,2706069,2706070,2706071,2706072,2706073,2706074,2706075,2706076,2706077,2706078,2706079,2706080,2706081,2706082,2706083,2706084,2706085,2706086,2706087,2706088,2706089,2706090,2706091,2706092,2706093,2706094,2706095,2706096,2706097,2706098,2706099,2706100,2706101,2706102,2706103,2706104,2706105,2706106,2706107,2706108,2706109,2706110,2706111,2706113,2706128,2706129,2706130,2706131,2706132,2706133,2706134,2706135,2706136,2706137,2706138,2706139,2706140,2706141,2706142,2706143],"Deepslate Bricks":[2705385],"Deepslate Coal Ore":[2722829],"Deepslate Copper Ore":[2724725],"Deepslate Diamond Ore":[2723295],"Deepslate Emerald Ore":[2723497],"Deepslate Gold Ore":[2724424],"Deepslate Iron Ore":[2724301],"Deepslate Lapis Lazuli Ore":[2723822],"Deepslate Redstone Ore":[2723924,2723925],"Deepslate Tile Slab":[2706876,2706877,2706879],"Deepslate Tile Stairs":[2707184,2707185,2707186,2707187,2707188,2707189,2707190,2707191],"Deepslate Tile Wall":[2707232,2707233,2707234,2707235,2707236,2707237,2707238,2707239,2707240,2707241,2707242,2707243,2707244,2707245,2707246,2707247,2707250,2707264,2707265,2707266,2707267,2707268,2707269,2707270,2707271,2707272,2707273,2707274,2707275,2707276,2707277,2707278,2707279,2707280,2707281,2707282,2707283,2707284,2707285,2707286,2707287,2707288,2707289,2707290,2707291,2707292,2707293,2707294,2707295,2707296,2707297,2707298,2707299,2707300,2707301,2707302,2707303,2707304,2707305,2707306,2707307,2707308,2707309,2707310,2707311,2707312,2707313,2707314,2707315,2707316,2707317,2707318,2707319,2707320,2707321,2707322,2707323,2707324,2707325,2707326,2707327,2707360,2707361,2707362,2707363,2707364,2707365,2707366,2707367,2707368,2707369,2707370,2707371,2707372,2707373,2707374,2707375,2707378,2707392,2707393,2707394,2707395,2707396,2707397,2707398,2707399,2707400,2707401,2707402,2707403,2707404,2707405,2707406,2707407,2707408,2707409,2707410,2707411,2707412,2707413,2707414,2707415,2707416,2707417,2707418,2707419,2707420,2707421,2707422,2707423,2707424,2707425,2707426,2707427,2707428,2707429,2707430,2707431,2707432,2707433,2707434,2707435,2707436,2707437,2707438,2707439,2707440,2707441,2707442,2707443,2707444,2707445,2707446,2707447,2707448,2707449,2707450,2707451,2707452,2707453,2707454,2707455],"Deepslate Tiles":[2706669],"Detector Rail":[2591152,2591153,2591154,2591155,2591158,2591159,2591160,2591161,2591162,2591163,2591166,2591167],"Diamond Block":[2591282],"Diamond Ore":[2591690],"Diorite":[2591871],"Diorite Slab":[2592189,2592190,2592191],"Diorite Stairs":[2592432,2592433,2592434,2592435,2592436,2592437,2592438,2592439],"Diorite Wall":[2592544,2592545,2592546,2592547,2592548,2592549,2592550,2592551,2592552,2592553,2592554,2592555,2592556,2592557,2592558,2592559,2592561,2592576,2592577,2592578,2592579,2592580,2592581,2592582,2592583,2592584,2592585,2592586,2592587,2592588,2592589,2592590,2592591,2592592,2592593,2592594,2592595,2592596,2592597,2592598,2592599,2592600,2592601,2592602,2592603,2592604,2592605,2592606,2592607,2592608,2592609,2592610,2592611,2592612,2592613,2592614,2592615,2592616,2592617,2592618,2592619,2592620,2592621,2592622,2592623,2592624,2592625,2592626,2592627,2592628,2592629,2592630,2592631,2592632,2592633,2592634,2592635,2592636,2592637,2592638,2592639,2592672,2592673,2592674,2592675,2592676,2592677,2592678,2592679,2592680,2592681,2592682,2592683,2592684,2592685,2592686,2592687,2592689,2592704,2592705,2592706,2592707,2592708,2592709,2592710,2592711,2592712,2592713,2592714,2592715,2592716,2592717,2592718,2592719,2592720,2592721,2592722,2592723,2592724,2592725,2592726,2592727,2592728,2592729,2592730,2592731,2592732,2592733,2592734,2592735,2592736,2592737,2592738,2592739,2592740,2592741,2592742,2592743,2592744,2592745,2592746,2592747,2592748,2592749,2592750,2592751,2592752,2592753,2592754,2592755,2592756,2592757,2592758,2592759,2592760,2592761,2592762,2592763,2592764,2592765,2592766,2592767],"Dirt":[2592872,2592873,2592875],"Double Pitcher Crop":[2743664,2743665,2743666,2743667],"Double Tallgrass":[2593222,2593223],"Dragon Egg":[2593308],"Dried Kelp Block":[2593640],"Dubnium":[2601238],"Dyed Candle":[2729216,2729217,2729218,2729219,2729220,2729221,2729222,2729223,2729224,2729225,2729226,2729227,2729228,2729229,2729230,2729231,2729232,2729233,2729234,2729235,2729236,2729237,2729238,2729239,2729240,2729241,2729242,2729243,2729244,2729245,2729246,2729247,2729248,2729249,2729250,2729251,2729252,2729253,2729254,2729255,2729256,2729257,2729258,2729259,2729260,2729261,2729262,2729263,2729264,2729265,2729266,2729267,2729268,2729269,2729270,2729271,2729272,2729273,2729274,2729275,2729276,2729277,2729278,2729279,2729280,2729281,2729282,2729283,2729284,2729285,2729286,2729287,2729288,2729289,2729290,2729291,2729292,2729293,2729294,2729295,2729296,2729297,2729298,2729299,2729300,2729301,2729302,2729303,2729304,2729305,2729306,2729307,2729308,2729309,2729310,2729311,2729312,2729313,2729314,2729315,2729316,2729317,2729318,2729319,2729320,2729321,2729322,2729323,2729324,2729325,2729326,2729327,2729328,2729329,2729330,2729331,2729332,2729333,2729334,2729335,2729336,2729337,2729338,2729339,2729340,2729341,2729342,2729343],"Dyed Shulker Box":[2594016,2594017,2594018,2594019,2594020,2594021,2594022,2594023,2594024,2594025,2594026,2594027,2594028,2594029,2594030,2594031],"Dysprosium":[2601517],"Einsteinium":[2601881],"Element Constructor":[2600032,2600033,2600034,2600035],"Emerald Block":[2624812],"Emerald Ore":[2625136],"Enchanting Table":[2625512],"End Portal Frame":[2625616,2625617,2625618,2625619,2625620,2625621,2625622,2625623],"End Rod":[2625944,2625945,2625946,2625947,2625950,2625951],"End Stone":[2626067],"End Stone Brick Slab":[2626456,2626457,2626459],"End Stone Brick Stairs":[2626744,2626745,2626746,2626747,2626748,2626749,2626750,2626751],"End Stone Brick Wall":[2626853,2626864,2626865,2626866,2626867,2626868,2626869,2626870,2626871,2626872,2626873,2626874,2626875,2626876,2626877,2626878,2626879,2626880,2626881,2626882,2626883,2626884,2626885,2626886,2626887,2626888,2626889,2626890,2626891,2626892,2626893,2626894,2626895,2626896,2626897,2626898,2626899,2626900,2626901,2626902,2626903,2626904,2626905,2626906,2626907,2626908,2626909,2626910,2626911,2626912,2626913,2626914,2626915,2626916,2626917,2626918,2626919,2626920,2626921,2626922,2626923,2626924,2626925,2626926,2626927,2626928,2626929,2626930,2626931,2626932,2626933,2626934,2626935,2626936,2626937,2626938,2626939,2626940,2626941,2626942,2626943,2626981,2626992,2626993,2626994,2626995,2626996,2626997,2626998,2626999,2627000,2627001,2627002,2627003,2627004,2627005,2627006,2627007,2627008,2627009,2627010,2627011,2627012,2627013,2627014,2627015,2627016,2627017,2627018,2627019,2627020,2627021,2627022,2627023,2627024,2627025,2627026,2627027,2627028,2627029,2627030,2627031,2627032,2627033,2627034,2627035,2627036,2627037,2627038,2627039,2627040,2627041,2627042,2627043,2627044,2627045,2627046,2627047,2627048,2627049,2627050,2627051,2627052,2627053,2627054,2627055,2627056,2627057,2627058,2627059,2627060,2627061,2627062,2627063,2627064,2627065,2627066,2627067,2627068,2627069,2627070,2627071],"End Stone Bricks":[2627290],"Ender Chest":[2627340,2627341,2627342,2627343],"Erbium":[2602113],"Europium":[2602268],"Fake Wooden Slab":[2627665,2627666,2627667],"Farmland":[2627976,2627977,2627978,2627979,2627980,2627981,2627982,2627983],"Fermium":[2602504],"Fern":[2628125],"Fire Block":[2628464,2628465,2628466,2628467,2628468,2628469,2628470,2628471,2628472,2628473,2628474,2628475,2628476,2628477,2628478,2628479],"Flerovium":[2602826],"Fletching Table":[2628783],"Flower Pot":[2628913],"Flowering Azalea Leaves":[2736040,2736041,2736042,2736043],"Fluorine":[2603060],"Francium":[2603433],"Froglight":[2733953,2733954,2733955,2733957,2733958,2733959,2733961,2733962,2733963],"Frosted Ice":[2629188,2629189,2629190,2629191],"Furnace":[2629600,2629601,2629602,2629603,2629604,2629605,2629606,2629607],"Gadolinium":[2603633],"Gallium":[2603945],"Germanium":[2604261],"Gilded Blackstone":[2727654],"Glass":[2629881],"Glass Pane":[2630089],"Glazed Terracotta":[2697984,2697985,2697986,2697987,2697988,2697989,2697990,2697991,2697992,2697993,2697994,2697995,2697996,2697997,2697998,2697999,2698000,2698001,2698002,2698003,2698004,2698005,2698006,2698007,2698008,2698009,2698010,2698011,2698012,2698013,2698014,2698015,2698016,2698017,2698018,2698019,2698020,2698021,2698022,2698023,2698024,2698025,2698026,2698027,2698028,2698029,2698030,2698031,2698032,2698033,2698034,2698035,2698036,2698037,2698038,2698039,2698040,2698041,2698042,2698043,2698044,2698045,2698046,2698047],"Glow Item Frame":[2735312,2735313,2735316,2735317,2735318,2735319,2735320,2735321,2735324,2735325,2735326,2735327],"Glow Lichen":[2736768,2736769,2736770,2736771,2736772,2736773,2736774,2736775,2736776,2736777,2736778,2736779,2736780,2736781,2736782,2736783,2736784,2736785,2736786,2736787,2736788,2736789,2736790,2736791,2736792,2736793,2736794,2736795,2736796,2736797,2736798,2736799,2736800,2736801,2736802,2736803,2736804,2736805,2736806,2736807,2736808,2736809,2736810,2736811,2736812,2736813,2736814,2736815,2736816,2736817,2736818,2736819,2736820,2736821,2736822,2736823,2736824,2736825,2736826,2736827,2736828,2736829,2736830,2736831],"Glowing Obsidian":[2630228],"Glowstone":[2630568],"Gold":[2604408],"Gold Block":[2630824],"Gold Ore":[2631090],"Granite":[2631318],"Granite Slab":[2631496,2631497,2631498],"Granite Stairs":[2631752,2631753,2631754,2631755,2631756,2631757,2631758,2631759],"Granite Wall":[2631936,2631937,2631938,2631939,2631940,2631941,2631942,2631943,2631944,2631945,2631946,2631947,2631948,2631949,2631950,2631951,2631952,2631953,2631954,2631955,2631956,2631957,2631958,2631959,2631960,2631961,2631962,2631963,2631964,2631965,2631966,2631967,2631968,2631969,2631970,2631971,2631972,2631973,2631974,2631975,2631976,2631977,2631978,2631979,2631980,2631981,2631982,2631983,2631984,2631985,2631986,2631987,2631988,2631989,2631990,2631991,2631992,2631993,2631994,2631995,2631996,2631997,2631998,2631999,2632032,2632033,2632034,2632035,2632036,2632037,2632038,2632039,2632040,2632041,2632042,2632043,2632044,2632045,2632046,2632047,2632063,2632064,2632065,2632066,2632067,2632068,2632069,2632070,2632071,2632072,2632073,2632074,2632075,2632076,2632077,2632078,2632079,2632080,2632081,2632082,2632083,2632084,2632085,2632086,2632087,2632088,2632089,2632090,2632091,2632092,2632093,2632094,2632095,2632096,2632097,2632098,2632099,2632100,2632101,2632102,2632103,2632104,2632105,2632106,2632107,2632108,2632109,2632110,2632111,2632112,2632113,2632114,2632115,2632116,2632117,2632118,2632119,2632120,2632121,2632122,2632123,2632124,2632125,2632126,2632127,2632160,2632161,2632162,2632163,2632164,2632165,2632166,2632167,2632168,2632169,2632170,2632171,2632172,2632173,2632174,2632175,2632191],"Grass":[2632262],"Grass Path":[2632655],"Gravel":[2632760],"Green Torch":[2633657,2633658,2633659,2633660,2633661],"Hafnium":[2604728],"Hanging Roots":[2730490],"Hardened Clay":[2633814],"Hardened Glass":[2634187],"Hardened Glass Pane":[2634294],"Hassium":[2604858],"Hay Bale":[2634740,2634741,2634742],"Heat Block":[2578246],"Helium":[2605056],"Holmium":[2605555],"Honeycomb Block":[2722683],"Hopper":[2634976,2634977,2634981,2634982,2634983,2634984,2634985,2634989,2634990,2634991],"Hydrogen":[2605678],"Ice":[2635248],"Indium":[2606007],"Infested Chiseled Stone Brick":[2635303],"Infested Cobblestone":[2635729],"Infested Cracked Stone Brick":[2635915],"Infested Mossy Stone Brick":[2636099],"Infested Stone":[2636356],"Infested Stone Brick":[2636550],"Invisible Bedrock":[2637471],"Iodine":[2606214],"Iridium":[2606518],"Iron":[2606636],"Iron Bars":[2637842],"Iron Block":[2637750],"Iron Door":[2638208,2638209,2638210,2638211,2638212,2638213,2638214,2638215,2638216,2638217,2638218,2638219,2638220,2638221,2638222,2638223,2638224,2638225,2638226,2638227,2638228,2638229,2638230,2638231,2638232,2638233,2638234,2638235,2638236,2638237,2638238,2638239],"Iron Ore":[2638449],"Iron Trapdoor":[2638608,2638609,2638610,2638611,2638612,2638613,2638614,2638615,2638616,2638617,2638618,2638619,2638620,2638621,2638622,2638623],"Item Frame":[2638992,2638993,2638994,2638995,2638996,2638997,2639000,2639001,2639002,2639003,2639004,2639005],"Jack o'Lantern":[2647344,2647345,2647346,2647347],"Jukebox":[2639329],"Jungle Button":[2639456,2639457,2639458,2639459,2639460,2639461,2639464,2639465,2639466,2639467,2639468,2639469],"Jungle Door":[2639744,2639745,2639746,2639747,2639748,2639749,2639750,2639751,2639752,2639753,2639754,2639755,2639756,2639757,2639758,2639759,2639760,2639761,2639762,2639763,2639764,2639765,2639766,2639767,2639768,2639769,2639770,2639771,2639772,2639773,2639774,2639775],"Jungle Fence":[2639966],"Jungle Fence Gate":[2640224,2640225,2640226,2640227,2640228,2640229,2640230,2640231,2640232,2640233,2640234,2640235,2640236,2640237,2640238,2640239],"Jungle Leaves":[2640436,2640437,2640438,2640439],"Jungle Log":[2640640,2640641,2640642,2640643,2640646,2640647],"Jungle Planks":[2641093],"Jungle Pressure Plate":[2641284,2641285],"Jungle Sapling":[2641438,2641439],"Jungle Sign":[2641728,2641729,2641730,2641731,2641732,2641733,2641734,2641735,2641736,2641737,2641738,2641739,2641740,2641741,2641742,2641743],"Jungle Slab":[2642024,2642025,2642026],"Jungle Stairs":[2642424,2642425,2642426,2642427,2642428,2642429,2642430,2642431],"Jungle Trapdoor":[2642448,2642449,2642450,2642451,2642452,2642453,2642454,2642455,2642456,2642457,2642458,2642459,2642460,2642461,2642462,2642463],"Jungle Wall Sign":[2642740,2642741,2642742,2642743],"Jungle Wood":[2643080,2643081,2643084,2643085,2643086,2643087],"Krypton":[2606951],"Lab Table":[2643440,2643441,2643442,2643443],"Ladder":[2643512,2643513,2643514,2643515],"Lantern":[2643756,2643757],"Lanthanum":[2607257],"Lapis Lazuli Block":[2644008],"Lapis Lazuli Ore":[2644357],"Large Fern":[2644516,2644517],"Lava":[2644960,2644961,2644962,2644963,2644964,2644965,2644966,2644967,2644968,2644969,2644970,2644971,2644972,2644973,2644974,2644975,2644976,2644977,2644978,2644979,2644980,2644981,2644982,2644983,2644984,2644985,2644986,2644987,2644988,2644989,2644990,2644991],"Lava Cauldron":[2732152,2732153,2732154,2732155,2732156,2732157],"Lawrencium":[2607523],"Lead":[2607716],"Lectern":[2645160,2645161,2645162,2645163,2645164,2645165,2645166,2645167],"Legacy Stonecutter":[2645272],"Lever":[2645712,2645713,2645714,2645715,2645716,2645717,2645718,2645719,2645720,2645721,2645722,2645723,2645724,2645725,2645726,2645727],"Light Block":[2703840,2703841,2703842,2703843,2703844,2703845,2703846,2703847,2703848,2703849,2703850,2703851,2703852,2703853,2703854,2703855],"Lightning Rod":[2727810,2727811,2727812,2727813,2727814,2727815],"Lilac":[2646394,2646395],"Lily Pad":[2646943],"Lily of the Valley":[2646752],"Lithium":[2608039],"Livermorium":[2608214],"Loom":[2647644,2647645,2647646,2647647],"Lutetium":[2608593],"Magma Block":[2648248],"Magnesium":[2608675],"Manganese":[2608998],"Mangrove Button":[2717056,2717057,2717058,2717059,2717062,2717063,2717064,2717065,2717066,2717067,2717070,2717071],"Mangrove Door":[2718464,2718465,2718466,2718467,2718468,2718469,2718470,2718471,2718472,2718473,2718474,2718475,2718476,2718477,2718478,2718479,2718480,2718481,2718482,2718483,2718484,2718485,2718486,2718487,2718488,2718489,2718490,2718491,2718492,2718493,2718494,2718495],"Mangrove Fence":[2713251],"Mangrove Fence Gate":[2719264,2719265,2719266,2719267,2719268,2719269,2719270,2719271,2719272,2719273,2719274,2719275,2719276,2719277,2719278,2719279],"Mangrove Leaves":[2735556,2735557,2735558,2735559],"Mangrove Log":[2714648,2714649,2714650,2714651,2714654,2714655],"Mangrove Planks":[2712331],"Mangrove Pressure Plate":[2717754,2717755],"Mangrove Roots":[2733326],"Mangrove Sign":[2720800,2720801,2720802,2720803,2720804,2720805,2720806,2720807,2720808,2720809,2720810,2720811,2720812,2720813,2720814,2720815],"Mangrove Slab":[2713985,2713986,2713987],"Mangrove Stairs":[2720112,2720113,2720114,2720115,2720116,2720117,2720118,2720119],"Mangrove Trapdoor":[2716208,2716209,2716210,2716211,2716212,2716213,2716214,2716215,2716216,2716217,2716218,2716219,2716220,2716221,2716222,2716223],"Mangrove Wall Sign":[2721696,2721697,2721698,2721699],"Mangrove Wood":[2715402,2715403,2715404,2715405,2715406,2715407],"Material Reducer":[2648480,2648481,2648482,2648483],"Meitnerium":[2609245],"Melon Block":[2648739],"Melon Stem":[2648832,2648833,2648834,2648835,2648836,2648837,2648838,2648839,2648840,2648841,2648842,2648843,2648844,2648845,2648846,2648847,2648864,2648865,2648866,2648867,2648868,2648869,2648870,2648871,2648880,2648881,2648882,2648883,2648884,2648885,2648886,2648887,2648888,2648889,2648890,2648891,2648892,2648893,2648894,2648895],"Mendelevium":[2609489],"Mercury":[2609777],"Mob Head":[2649216,2649217,2649218,2649219,2649221,2649222,2649223,2649224,2649225,2649226,2649227,2649229,2649230,2649231,2649248,2649249,2649250,2649251,2649253,2649254,2649255,2649264,2649265,2649266,2649267,2649269,2649270,2649271,2649272,2649273,2649274,2649275,2649277,2649278,2649279],"Molybdenum":[2610097],"Monster Spawner":[2649402],"Moscovium":[2610378],"Mossy Cobblestone":[2649741],"Mossy Cobblestone Slab":[2650036,2650038,2650039],"Mossy Cobblestone Stairs":[2650248,2650249,2650250,2650251,2650252,2650253,2650254,2650255],"Mossy Cobblestone Wall":[2650368,2650369,2650370,2650371,2650372,2650373,2650374,2650375,2650376,2650377,2650378,2650379,2650380,2650381,2650382,2650383,2650384,2650385,2650386,2650387,2650388,2650389,2650390,2650391,2650392,2650393,2650394,2650395,2650396,2650397,2650398,2650399,2650400,2650401,2650402,2650403,2650404,2650405,2650406,2650407,2650408,2650409,2650410,2650411,2650412,2650413,2650414,2650415,2650416,2650417,2650418,2650419,2650420,2650421,2650422,2650423,2650424,2650425,2650426,2650427,2650428,2650429,2650430,2650431,2650432,2650433,2650434,2650435,2650436,2650437,2650438,2650439,2650440,2650441,2650442,2650443,2650444,2650445,2650446,2650447,2650450,2650496,2650497,2650498,2650499,2650500,2650501,2650502,2650503,2650504,2650505,2650506,2650507,2650508,2650509,2650510,2650511,2650512,2650513,2650514,2650515,2650516,2650517,2650518,2650519,2650520,2650521,2650522,2650523,2650524,2650525,2650526,2650527,2650528,2650529,2650530,2650531,2650532,2650533,2650534,2650535,2650536,2650537,2650538,2650539,2650540,2650541,2650542,2650543,2650544,2650545,2650546,2650547,2650548,2650549,2650550,2650551,2650552,2650553,2650554,2650555,2650556,2650557,2650558,2650559,2650560,2650561,2650562,2650563,2650564,2650565,2650566,2650567,2650568,2650569,2650570,2650571,2650572,2650573,2650574,2650575,2650578],"Mossy Stone Brick Slab":[2650856,2650857,2650859],"Mossy Stone Brick Stairs":[2650912,2650913,2650914,2650915,2650916,2650917,2650918,2650919],"Mossy Stone Brick Wall":[2651171,2651184,2651185,2651186,2651187,2651188,2651189,2651190,2651191,2651192,2651193,2651194,2651195,2651196,2651197,2651198,2651199,2651200,2651201,2651202,2651203,2651204,2651205,2651206,2651207,2651208,2651209,2651210,2651211,2651212,2651213,2651214,2651215,2651216,2651217,2651218,2651219,2651220,2651221,2651222,2651223,2651224,2651225,2651226,2651227,2651228,2651229,2651230,2651231,2651232,2651233,2651234,2651235,2651236,2651237,2651238,2651239,2651240,2651241,2651242,2651243,2651244,2651245,2651246,2651247,2651248,2651249,2651250,2651251,2651252,2651253,2651254,2651255,2651256,2651257,2651258,2651259,2651260,2651261,2651262,2651263,2651299,2651312,2651313,2651314,2651315,2651316,2651317,2651318,2651319,2651320,2651321,2651322,2651323,2651324,2651325,2651326,2651327,2651328,2651329,2651330,2651331,2651332,2651333,2651334,2651335,2651336,2651337,2651338,2651339,2651340,2651341,2651342,2651343,2651344,2651345,2651346,2651347,2651348,2651349,2651350,2651351,2651352,2651353,2651354,2651355,2651356,2651357,2651358,2651359,2651360,2651361,2651362,2651363,2651364,2651365,2651366,2651367,2651368,2651369,2651370,2651371,2651372,2651373,2651374,2651375,2651376,2651377,2651378,2651379,2651380,2651381,2651382,2651383,2651384,2651385,2651386,2651387,2651388,2651389,2651390,2651391],"Mossy Stone Bricks":[2651617],"Mud":[2725428],"Mud Brick Slab":[2726120,2726122,2726123],"Mud Brick Stairs":[2726152,2726153,2726154,2726155,2726156,2726157,2726158,2726159],"Mud Brick Wall":[2726414,2726416,2726417,2726418,2726419,2726420,2726421,2726422,2726423,2726424,2726425,2726426,2726427,2726428,2726429,2726430,2726431,2726464,2726465,2726466,2726467,2726468,2726469,2726470,2726471,2726472,2726473,2726474,2726475,2726476,2726477,2726478,2726479,2726480,2726481,2726482,2726483,2726484,2726485,2726486,2726487,2726488,2726489,2726490,2726491,2726492,2726493,2726494,2726495,2726496,2726497,2726498,2726499,2726500,2726501,2726502,2726503,2726504,2726505,2726506,2726507,2726508,2726509,2726510,2726511,2726512,2726513,2726514,2726515,2726516,2726517,2726518,2726519,2726520,2726521,2726522,2726523,2726524,2726525,2726526,2726527,2726542,2726544,2726545,2726546,2726547,2726548,2726549,2726550,2726551,2726552,2726553,2726554,2726555,2726556,2726557,2726558,2726559,2726592,2726593,2726594,2726595,2726596,2726597,2726598,2726599,2726600,2726601,2726602,2726603,2726604,2726605,2726606,2726607,2726608,2726609,2726610,2726611,2726612,2726613,2726614,2726615,2726616,2726617,2726618,2726619,2726620,2726621,2726622,2726623,2726624,2726625,2726626,2726627,2726628,2726629,2726630,2726631,2726632,2726633,2726634,2726635,2726636,2726637,2726638,2726639,2726640,2726641,2726642,2726643,2726644,2726645,2726646,2726647,2726648,2726649,2726650,2726651,2726652,2726653,2726654,2726655],"Mud Bricks":[2725644],"Muddy Mangrove Roots":[2733661,2733662,2733663],"Mushroom Stem":[2651775],"Mycelium":[2651923],"Neodymium":[2610514],"Neon":[2610826],"Neptunium":[2610990],"Nether Brick Fence":[2652231],"Nether Brick Slab":[2652416,2652417,2652419],"Nether Brick Stairs":[2652728,2652729,2652730,2652731,2652732,2652733,2652734,2652735],"Nether Brick Wall":[2652960,2652961,2652962,2652963,2652964,2652965,2652966,2652967,2652968,2652969,2652970,2652971,2652972,2652973,2652974,2652975,2652976,2652992,2652993,2652994,2652995,2652996,2652997,2652998,2652999,2653000,2653001,2653002,2653003,2653004,2653005,2653006,2653007,2653008,2653009,2653010,2653011,2653012,2653013,2653014,2653015,2653016,2653017,2653018,2653019,2653020,2653021,2653022,2653023,2653024,2653025,2653026,2653027,2653028,2653029,2653030,2653031,2653032,2653033,2653034,2653035,2653036,2653037,2653038,2653039,2653040,2653041,2653042,2653043,2653044,2653045,2653046,2653047,2653048,2653049,2653050,2653051,2653052,2653053,2653054,2653055,2653088,2653089,2653090,2653091,2653092,2653093,2653094,2653095,2653096,2653097,2653098,2653099,2653100,2653101,2653102,2653103,2653104,2653120,2653121,2653122,2653123,2653124,2653125,2653126,2653127,2653128,2653129,2653130,2653131,2653132,2653133,2653134,2653135,2653136,2653137,2653138,2653139,2653140,2653141,2653142,2653143,2653144,2653145,2653146,2653147,2653148,2653149,2653150,2653151,2653152,2653153,2653154,2653155,2653156,2653157,2653158,2653159,2653160,2653161,2653162,2653163,2653164,2653165,2653166,2653167,2653168,2653169,2653170,2653171,2653172,2653173,2653174,2653175,2653176,2653177,2653178,2653179,2653180,2653181,2653182,2653183],"Nether Bricks":[2653384],"Nether Gold Ore":[2725267],"Nether Portal":[2653688,2653689],"Nether Quartz Ore":[2653911],"Nether Reactor Core":[2654168],"Nether Wart":[2654340,2654341,2654342,2654343],"Nether Wart Block":[2654551],"Netherite Block":[2731038],"Netherrack":[2654902],"Nickel":[2611380],"Nihonium":[2611595],"Niobium":[2611854],"Nitrogen":[2612104],"Nobelium":[2612380],"Note Block":[2655190],"Oak Button":[2655248,2655249,2655252,2655253,2655254,2655255,2655256,2655257,2655260,2655261,2655262,2655263],"Oak Door":[2655488,2655489,2655490,2655491,2655492,2655493,2655494,2655495,2655496,2655497,2655498,2655499,2655500,2655501,2655502,2655503,2655504,2655505,2655506,2655507,2655508,2655509,2655510,2655511,2655512,2655513,2655514,2655515,2655516,2655517,2655518,2655519],"Oak Fence":[2655762],"Oak Fence Gate":[2656048,2656049,2656050,2656051,2656052,2656053,2656054,2656055,2656056,2656057,2656058,2656059,2656060,2656061,2656062,2656063],"Oak Leaves":[2656456,2656457,2656458,2656459],"Oak Log":[2656744,2656745,2656748,2656749,2656750,2656751],"Oak Planks":[2656848],"Oak Pressure Plate":[2657232,2657233],"Oak Sapling":[2657502,2657503],"Oak Sign":[2657664,2657665,2657666,2657667,2657668,2657669,2657670,2657671,2657672,2657673,2657674,2657675,2657676,2657677,2657678,2657679],"Oak Slab":[2658037,2658038,2658039],"Oak Stairs":[2658136,2658137,2658138,2658139,2658140,2658141,2658142,2658143],"Oak Trapdoor":[2658352,2658353,2658354,2658355,2658356,2658357,2658358,2658359,2658360,2658361,2658362,2658363,2658364,2658365,2658366,2658367],"Oak Wall Sign":[2658632,2658633,2658634,2658635],"Oak Wood":[2658906,2658907,2658908,2658909,2658910,2658911],"Obsidian":[2659231],"Oganesson":[2612732],"Orange Tulip":[2659739],"Osmium":[2612890],"Oxeye Daisy":[2659907],"Oxygen":[2613005],"Packed Ice":[2660280],"Packed Mud":[2726845],"Palladium":[2613267],"Peony":[2660372,2660373],"Phosphorus":[2613733],"Pink Petals":[2741648,2741649,2741650,2741651,2741652,2741653,2741654,2741655,2741656,2741657,2741658,2741659,2741660,2741661,2741662,2741663],"Pink Tulip":[2660949],"Pitcher Crop":[2743389,2743390,2743391],"Pitcher Plant":[2743082,2743083],"Platinum":[2613891],"Plutonium":[2614020],"Podzol":[2661333],"Polished Andesite":[2661619],"Polished Andesite Slab":[2661708,2661709,2661711],"Polished Andesite Stairs":[2661936,2661937,2661938,2661939,2661940,2661941,2661942,2661943],"Polished Basalt":[2699104,2699106,2699107],"Polished Blackstone":[2700544],"Polished Blackstone Brick Slab":[2702664,2702665,2702666],"Polished Blackstone Brick Stairs":[2703056,2703057,2703058,2703059,2703060,2703061,2703062,2703063],"Polished Blackstone Brick Wall":[2703104,2703105,2703106,2703107,2703108,2703109,2703110,2703111,2703112,2703113,2703114,2703115,2703116,2703117,2703118,2703119,2703120,2703121,2703122,2703123,2703124,2703125,2703126,2703127,2703128,2703129,2703130,2703131,2703132,2703133,2703134,2703135,2703136,2703137,2703138,2703139,2703140,2703141,2703142,2703143,2703144,2703145,2703146,2703147,2703148,2703149,2703150,2703151,2703152,2703153,2703154,2703155,2703156,2703157,2703158,2703159,2703160,2703161,2703162,2703163,2703164,2703165,2703166,2703167,2703168,2703184,2703185,2703186,2703187,2703188,2703189,2703190,2703191,2703192,2703193,2703194,2703195,2703196,2703197,2703198,2703199,2703232,2703233,2703234,2703235,2703236,2703237,2703238,2703239,2703240,2703241,2703242,2703243,2703244,2703245,2703246,2703247,2703248,2703249,2703250,2703251,2703252,2703253,2703254,2703255,2703256,2703257,2703258,2703259,2703260,2703261,2703262,2703263,2703264,2703265,2703266,2703267,2703268,2703269,2703270,2703271,2703272,2703273,2703274,2703275,2703276,2703277,2703278,2703279,2703280,2703281,2703282,2703283,2703284,2703285,2703286,2703287,2703288,2703289,2703290,2703291,2703292,2703293,2703294,2703295,2703296,2703312,2703313,2703314,2703315,2703316,2703317,2703318,2703319,2703320,2703321,2703322,2703323,2703324,2703325,2703326,2703327],"Polished Blackstone Bricks":[2702454],"Polished Blackstone Button":[2701040,2701041,2701042,2701043,2701044,2701045,2701048,2701049,2701050,2701051,2701052,2701053],"Polished Blackstone Pressure Plate":[2701220,2701221],"Polished Blackstone Slab":[2701428,2701429,2701430],"Polished Blackstone Stairs":[2701744,2701745,2701746,2701747,2701748,2701749,2701750,2701751],"Polished Blackstone Wall":[2701824,2701825,2701826,2701827,2701828,2701829,2701830,2701831,2701832,2701833,2701834,2701835,2701836,2701837,2701838,2701839,2701840,2701841,2701842,2701843,2701844,2701845,2701846,2701847,2701848,2701849,2701850,2701851,2701852,2701853,2701854,2701855,2701856,2701857,2701858,2701859,2701860,2701861,2701862,2701863,2701864,2701865,2701866,2701867,2701868,2701869,2701870,2701871,2701872,2701873,2701874,2701875,2701876,2701877,2701878,2701879,2701880,2701881,2701882,2701883,2701884,2701885,2701886,2701887,2701893,2701904,2701905,2701906,2701907,2701908,2701909,2701910,2701911,2701912,2701913,2701914,2701915,2701916,2701917,2701918,2701919,2701952,2701953,2701954,2701955,2701956,2701957,2701958,2701959,2701960,2701961,2701962,2701963,2701964,2701965,2701966,2701967,2701968,2701969,2701970,2701971,2701972,2701973,2701974,2701975,2701976,2701977,2701978,2701979,2701980,2701981,2701982,2701983,2701984,2701985,2701986,2701987,2701988,2701989,2701990,2701991,2701992,2701993,2701994,2701995,2701996,2701997,2701998,2701999,2702000,2702001,2702002,2702003,2702004,2702005,2702006,2702007,2702008,2702009,2702010,2702011,2702012,2702013,2702014,2702015,2702021,2702032,2702033,2702034,2702035,2702036,2702037,2702038,2702039,2702040,2702041,2702042,2702043,2702044,2702045,2702046,2702047],"Polished Deepslate":[2708955],"Polished Deepslate Slab":[2709068,2709070,2709071],"Polished Deepslate Stairs":[2709296,2709297,2709298,2709299,2709300,2709301,2709302,2709303],"Polished Deepslate Wall":[2709548,2709552,2709553,2709554,2709555,2709556,2709557,2709558,2709559,2709560,2709561,2709562,2709563,2709564,2709565,2709566,2709567,2709568,2709569,2709570,2709571,2709572,2709573,2709574,2709575,2709576,2709577,2709578,2709579,2709580,2709581,2709582,2709583,2709584,2709585,2709586,2709587,2709588,2709589,2709590,2709591,2709592,2709593,2709594,2709595,2709596,2709597,2709598,2709599,2709600,2709601,2709602,2709603,2709604,2709605,2709606,2709607,2709608,2709609,2709610,2709611,2709612,2709613,2709614,2709615,2709616,2709617,2709618,2709619,2709620,2709621,2709622,2709623,2709624,2709625,2709626,2709627,2709628,2709629,2709630,2709631,2709676,2709680,2709681,2709682,2709683,2709684,2709685,2709686,2709687,2709688,2709689,2709690,2709691,2709692,2709693,2709694,2709695,2709696,2709697,2709698,2709699,2709700,2709701,2709702,2709703,2709704,2709705,2709706,2709707,2709708,2709709,2709710,2709711,2709712,2709713,2709714,2709715,2709716,2709717,2709718,2709719,2709720,2709721,2709722,2709723,2709724,2709725,2709726,2709727,2709728,2709729,2709730,2709731,2709732,2709733,2709734,2709735,2709736,2709737,2709738,2709739,2709740,2709741,2709742,2709743,2709744,2709745,2709746,2709747,2709748,2709749,2709750,2709751,2709752,2709753,2709754,2709755,2709756,2709757,2709758,2709759],"Polished Diorite":[2662301],"Polished Diorite Slab":[2662512,2662514,2662515],"Polished Diorite Stairs":[2662736,2662737,2662738,2662739,2662740,2662741,2662742,2662743],"Polished Granite":[2663058],"Polished Granite Slab":[2663312,2663313,2663315],"Polished Granite Stairs":[2663568,2663569,2663570,2663571,2663572,2663573,2663574,2663575],"Polonium":[2614482],"Poppy":[2663844],"Potassium":[2614731],"Potato Block":[2664136,2664137,2664138,2664139,2664140,2664141,2664142,2664143],"Potion Cauldron":[2732432,2732433,2732434,2732435,2732436,2732437],"Powered Rail":[2664336,2664337,2664338,2664339,2664342,2664343,2664344,2664345,2664346,2664347,2664350,2664351],"Praseodymium":[2614802],"Prismarine":[2664586],"Prismarine Bricks":[2664928],"Prismarine Bricks Slab":[2665044,2665046,2665047],"Prismarine Bricks Stairs":[2665456,2665457,2665458,2665459,2665460,2665461,2665462,2665463],"Prismarine Slab":[2665496,2665497,2665499],"Prismarine Stairs":[2665944,2665945,2665946,2665947,2665948,2665949,2665950,2665951],"Prismarine Wall":[2665984,2665985,2665986,2665987,2665988,2665989,2665990,2665991,2665992,2665993,2665994,2665995,2665996,2665997,2665998,2665999,2666000,2666001,2666002,2666003,2666004,2666005,2666006,2666007,2666008,2666009,2666010,2666011,2666012,2666013,2666014,2666015,2666016,2666017,2666018,2666019,2666020,2666021,2666022,2666023,2666024,2666025,2666026,2666027,2666028,2666029,2666030,2666031,2666032,2666033,2666034,2666035,2666036,2666037,2666038,2666039,2666040,2666041,2666042,2666043,2666044,2666045,2666046,2666047,2666086,2666096,2666097,2666098,2666099,2666100,2666101,2666102,2666103,2666104,2666105,2666106,2666107,2666108,2666109,2666110,2666111,2666112,2666113,2666114,2666115,2666116,2666117,2666118,2666119,2666120,2666121,2666122,2666123,2666124,2666125,2666126,2666127,2666128,2666129,2666130,2666131,2666132,2666133,2666134,2666135,2666136,2666137,2666138,2666139,2666140,2666141,2666142,2666143,2666144,2666145,2666146,2666147,2666148,2666149,2666150,2666151,2666152,2666153,2666154,2666155,2666156,2666157,2666158,2666159,2666160,2666161,2666162,2666163,2666164,2666165,2666166,2666167,2666168,2666169,2666170,2666171,2666172,2666173,2666174,2666175,2666214,2666224,2666225,2666226,2666227,2666228,2666229,2666230,2666231,2666232,2666233,2666234,2666235,2666236,2666237,2666238,2666239],"Promethium":[2615041],"Protactinium":[2615321],"Pumpkin":[2666408],"Pumpkin Stem":[2666704,2666705,2666706,2666707,2666708,2666709,2666710,2666711,2666712,2666713,2666714,2666715,2666716,2666717,2666718,2666719,2666720,2666721,2666722,2666723,2666724,2666725,2666726,2666727,2666728,2666729,2666730,2666731,2666732,2666733,2666734,2666735,2666736,2666737,2666738,2666739,2666740,2666741,2666742,2666743],"Purple Torch":[2667018,2667019,2667020,2667021,2667022],"Purpur Block":[2667467],"Purpur Pillar":[2667649,2667650,2667651],"Purpur Slab":[2667944,2667945,2667946],"Purpur Stairs":[2668208,2668209,2668210,2668211,2668212,2668213,2668214,2668215],"Quartz Block":[2668351],"Quartz Bricks":[2709837],"Quartz Pillar":[2668756,2668757,2668759],"Quartz Slab":[2668896,2668897,2668899],"Quartz Stairs":[2669256,2669257,2669258,2669259,2669260,2669261,2669262,2669263],"Radium":[2615578],"Radon":[2615978],"Rail":[2669510,2669511,2669512,2669513,2669514,2669515,2669516,2669517,2669518,2669519],"Raw Copper Block":[2703999],"Raw Gold Block":[2704169],"Raw Iron Block":[2704423],"Red Mushroom":[2670074],"Red Mushroom Block":[2670289,2670290,2670291,2670296,2670297,2670298,2670299,2670300,2670301,2670302,2670303],"Red Nether Brick Slab":[2670564,2670566,2670567],"Red Nether Brick Stairs":[2670728,2670729,2670730,2670731,2670732,2670733,2670734,2670735],"Red Nether Brick Wall":[2670848,2670849,2670850,2670851,2670852,2670853,2670854,2670855,2670856,2670857,2670858,2670859,2670860,2670861,2670862,2670863,2670864,2670865,2670866,2670867,2670868,2670869,2670870,2670871,2670872,2670873,2670874,2670875,2670876,2670877,2670878,2670879,2670880,2670881,2670882,2670883,2670884,2670885,2670886,2670887,2670888,2670889,2670890,2670891,2670892,2670893,2670894,2670895,2670896,2670897,2670898,2670899,2670900,2670901,2670902,2670903,2670904,2670905,2670906,2670907,2670908,2670909,2670910,2670911,2670912,2670928,2670929,2670930,2670931,2670932,2670933,2670934,2670935,2670936,2670937,2670938,2670939,2670940,2670941,2670942,2670943,2670976,2670977,2670978,2670979,2670980,2670981,2670982,2670983,2670984,2670985,2670986,2670987,2670988,2670989,2670990,2670991,2670992,2670993,2670994,2670995,2670996,2670997,2670998,2670999,2671000,2671001,2671002,2671003,2671004,2671005,2671006,2671007,2671008,2671009,2671010,2671011,2671012,2671013,2671014,2671015,2671016,2671017,2671018,2671019,2671020,2671021,2671022,2671023,2671024,2671025,2671026,2671027,2671028,2671029,2671030,2671031,2671032,2671033,2671034,2671035,2671036,2671037,2671038,2671039,2671040,2671056,2671057,2671058,2671059,2671060,2671061,2671062,2671063,2671064,2671065,2671066,2671067,2671068,2671069,2671070,2671071],"Red Nether Bricks":[2671192],"Red Sand":[2671467],"Red Sandstone":[2671858],"Red Sandstone Slab":[2671948,2671949,2671950],"Red Sandstone Stairs":[2672360,2672361,2672362,2672363,2672364,2672365,2672366,2672367],"Red Sandstone Wall":[2672384,2672385,2672386,2672387,2672388,2672389,2672390,2672391,2672392,2672393,2672394,2672395,2672396,2672397,2672398,2672399,2672415,2672448,2672449,2672450,2672451,2672452,2672453,2672454,2672455,2672456,2672457,2672458,2672459,2672460,2672461,2672462,2672463,2672464,2672465,2672466,2672467,2672468,2672469,2672470,2672471,2672472,2672473,2672474,2672475,2672476,2672477,2672478,2672479,2672480,2672481,2672482,2672483,2672484,2672485,2672486,2672487,2672488,2672489,2672490,2672491,2672492,2672493,2672494,2672495,2672496,2672497,2672498,2672499,2672500,2672501,2672502,2672503,2672504,2672505,2672506,2672507,2672508,2672509,2672510,2672511,2672512,2672513,2672514,2672515,2672516,2672517,2672518,2672519,2672520,2672521,2672522,2672523,2672524,2672525,2672526,2672527,2672543,2672576,2672577,2672578,2672579,2672580,2672581,2672582,2672583,2672584,2672585,2672586,2672587,2672588,2672589,2672590,2672591,2672592,2672593,2672594,2672595,2672596,2672597,2672598,2672599,2672600,2672601,2672602,2672603,2672604,2672605,2672606,2672607,2672608,2672609,2672610,2672611,2672612,2672613,2672614,2672615,2672616,2672617,2672618,2672619,2672620,2672621,2672622,2672623,2672624,2672625,2672626,2672627,2672628,2672629,2672630,2672631,2672632,2672633,2672634,2672635,2672636,2672637,2672638,2672639],"Red Torch":[2672754,2672755,2672756,2672757,2672759],"Red Tulip":[2673099],"Redstone":[2674800,2674801,2674802,2674803,2674804,2674805,2674806,2674807,2674808,2674809,2674810,2674811,2674812,2674813,2674814,2674815],"Redstone Block":[2673334],"Redstone Comparator":[2673536,2673537,2673538,2673539,2673540,2673541,2673542,2673543,2673544,2673545,2673546,2673547,2673548,2673549,2673550,2673551],"Redstone Lamp":[2673716,2673717],"Redstone Ore":[2674064,2674065],"Redstone Repeater":[2674208,2674209,2674210,2674211,2674212,2674213,2674214,2674215,2674216,2674217,2674218,2674219,2674220,2674221,2674222,2674223,2674224,2674225,2674226,2674227,2674228,2674229,2674230,2674231,2674232,2674233,2674234,2674235,2674236,2674237,2674238,2674239],"Redstone Torch":[2674449,2674450,2674451,2674452,2674453,2674457,2674458,2674459,2674460,2674461],"Reinforced Deepslate":[2736204],"Rhenium":[2616206],"Rhodium":[2616344],"Roentgenium":[2616649],"Rose Bush":[2675240,2675241],"Rubidium":[2617054],"Ruthenium":[2617239],"Rutherfordium":[2617506],"Samarium":[2617838],"Sand":[2675615],"Sandstone":[2675846],"Sandstone Slab":[2676069,2676070,2676071],"Sandstone Stairs":[2676280,2676281,2676282,2676283,2676284,2676285,2676286,2676287],"Sandstone Wall":[2676480,2676481,2676482,2676483,2676484,2676485,2676486,2676487,2676488,2676489,2676490,2676491,2676492,2676493,2676494,2676495,2676496,2676497,2676498,2676499,2676500,2676501,2676502,2676503,2676504,2676505,2676506,2676507,2676508,2676509,2676510,2676511,2676512,2676513,2676514,2676515,2676516,2676517,2676518,2676519,2676520,2676521,2676522,2676523,2676524,2676525,2676526,2676527,2676528,2676529,2676530,2676531,2676532,2676533,2676534,2676535,2676536,2676537,2676538,2676539,2676540,2676541,2676542,2676543,2676544,2676545,2676546,2676547,2676548,2676549,2676550,2676551,2676552,2676553,2676554,2676555,2676556,2676557,2676558,2676559,2676567,2676608,2676609,2676610,2676611,2676612,2676613,2676614,2676615,2676616,2676617,2676618,2676619,2676620,2676621,2676622,2676623,2676624,2676625,2676626,2676627,2676628,2676629,2676630,2676631,2676632,2676633,2676634,2676635,2676636,2676637,2676638,2676639,2676640,2676641,2676642,2676643,2676644,2676645,2676646,2676647,2676648,2676649,2676650,2676651,2676652,2676653,2676654,2676655,2676656,2676657,2676658,2676659,2676660,2676661,2676662,2676663,2676664,2676665,2676666,2676667,2676668,2676669,2676670,2676671,2676672,2676673,2676674,2676675,2676676,2676677,2676678,2676679,2676680,2676681,2676682,2676683,2676684,2676685,2676686,2676687,2676695],"Scandium":[2618051],"Sculk":[2735063],"Sea Lantern":[2676975],"Sea Pickle":[2677120,2677121,2677122,2677123,2677124,2677125,2677126,2677127],"Seaborgium":[2618158],"Selenium":[2618595],"Shroomlight":[2712156],"Shulker Box":[2677267],"Silicon":[2618823],"Silver":[2618883],"Slime Block":[2677570],"Small Dripleaf":[2740888,2740889,2740890,2740891,2740892,2740893,2740894,2740895],"Smithing Table":[2730807],"Smoker":[2677856,2677857,2677858,2677859,2677860,2677861,2677862,2677863],"Smooth Basalt":[2699389],"Smooth Quartz Block":[2678217],"Smooth Quartz Slab":[2678360,2678361,2678362],"Smooth Quartz Stairs":[2678528,2678529,2678530,2678531,2678532,2678533,2678534,2678535],"Smooth Red Sandstone":[2678812],"Smooth Red Sandstone Slab":[2679085,2679086,2679087],"Smooth Red Sandstone Stairs":[2679320,2679321,2679322,2679323,2679324,2679325,2679326,2679327],"Smooth Sandstone":[2679586],"Smooth Sandstone Slab":[2679961,2679962,2679963],"Smooth Sandstone Stairs":[2680304,2680305,2680306,2680307,2680308,2680309,2680310,2680311],"Smooth Stone":[2680534],"Smooth Stone Slab":[2680648,2680649,2680651],"Snow Block":[2681036],"Snow Layer":[2681096,2681097,2681098,2681099,2681100,2681101,2681102,2681103],"Sodium":[2619314],"Soul Fire":[2711944],"Soul Lantern":[2711536,2711537],"Soul Sand":[2681478],"Soul Soil":[2711638],"Soul Torch":[2711144,2711145,2711148,2711150,2711151],"Sponge":[2681812,2681813],"Spore Blossom":[2731516],"Spruce Button":[2681904,2681905,2681906,2681907,2681908,2681909,2681912,2681913,2681914,2681915,2681916,2681917],"Spruce Door":[2682336,2682337,2682338,2682339,2682340,2682341,2682342,2682343,2682344,2682345,2682346,2682347,2682348,2682349,2682350,2682351,2682352,2682353,2682354,2682355,2682356,2682357,2682358,2682359,2682360,2682361,2682362,2682363,2682364,2682365,2682366,2682367],"Spruce Fence":[2682543],"Spruce Fence Gate":[2682864,2682865,2682866,2682867,2682868,2682869,2682870,2682871,2682872,2682873,2682874,2682875,2682876,2682877,2682878,2682879],"Spruce Leaves":[2682984,2682985,2682986,2682987],"Spruce Log":[2683256,2683257,2683260,2683261,2683262,2683263],"Spruce Planks":[2683538],"Spruce Pressure Plate":[2683658,2683659],"Spruce Sapling":[2683996,2683997],"Spruce Sign":[2684304,2684305,2684306,2684307,2684308,2684309,2684310,2684311,2684312,2684313,2684314,2684315,2684316,2684317,2684318,2684319],"Spruce Slab":[2684648,2684649,2684650],"Spruce Stairs":[2684752,2684753,2684754,2684755,2684756,2684757,2684758,2684759],"Spruce Trapdoor":[2684976,2684977,2684978,2684979,2684980,2684981,2684982,2684983,2684984,2684985,2684986,2684987,2684988,2684989,2684990,2684991],"Spruce Wall Sign":[2685424,2685425,2685426,2685427],"Spruce Wood":[2685552,2685553,2685554,2685555,2685558,2685559],"Stained Clay":[2685760,2685761,2685762,2685763,2685764,2685765,2685766,2685767,2685768,2685769,2685770,2685771,2685772,2685773,2685774,2685775],"Stained Glass":[2686128,2686129,2686130,2686131,2686132,2686133,2686134,2686135,2686136,2686137,2686138,2686139,2686140,2686141,2686142,2686143],"Stained Glass Pane":[2686336,2686337,2686338,2686339,2686340,2686341,2686342,2686343,2686344,2686345,2686346,2686347,2686348,2686349,2686350,2686351],"Stained Hardened Glass":[2686480,2686481,2686482,2686483,2686484,2686485,2686486,2686487,2686488,2686489,2686490,2686491,2686492,2686493,2686494,2686495],"Stained Hardened Glass Pane":[2686816,2686817,2686818,2686819,2686820,2686821,2686822,2686823,2686824,2686825,2686826,2686827,2686828,2686829,2686830,2686831],"Stone":[2687220],"Stone Brick Slab":[2687324,2687325,2687326],"Stone Brick Stairs":[2687576,2687577,2687578,2687579,2687580,2687581,2687582,2687583],"Stone Brick Wall":[2687744,2687745,2687746,2687747,2687748,2687749,2687750,2687751,2687752,2687753,2687754,2687755,2687756,2687757,2687758,2687759,2687773,2687808,2687809,2687810,2687811,2687812,2687813,2687814,2687815,2687816,2687817,2687818,2687819,2687820,2687821,2687822,2687823,2687824,2687825,2687826,2687827,2687828,2687829,2687830,2687831,2687832,2687833,2687834,2687835,2687836,2687837,2687838,2687839,2687840,2687841,2687842,2687843,2687844,2687845,2687846,2687847,2687848,2687849,2687850,2687851,2687852,2687853,2687854,2687855,2687856,2687857,2687858,2687859,2687860,2687861,2687862,2687863,2687864,2687865,2687866,2687867,2687868,2687869,2687870,2687871,2687872,2687873,2687874,2687875,2687876,2687877,2687878,2687879,2687880,2687881,2687882,2687883,2687884,2687885,2687886,2687887,2687901,2687936,2687937,2687938,2687939,2687940,2687941,2687942,2687943,2687944,2687945,2687946,2687947,2687948,2687949,2687950,2687951,2687952,2687953,2687954,2687955,2687956,2687957,2687958,2687959,2687960,2687961,2687962,2687963,2687964,2687965,2687966,2687967,2687968,2687969,2687970,2687971,2687972,2687973,2687974,2687975,2687976,2687977,2687978,2687979,2687980,2687981,2687982,2687983,2687984,2687985,2687986,2687987,2687988,2687989,2687990,2687991,2687992,2687993,2687994,2687995,2687996,2687997,2687998,2687999],"Stone Bricks":[2688134],"Stone Button":[2688384,2688385,2688386,2688387,2688390,2688391,2688392,2688393,2688394,2688395,2688398,2688399],"Stone Pressure Plate":[2688516,2688517],"Stone Slab":[2688849,2688850,2688851],"Stone Stairs":[2689024,2689025,2689026,2689027,2689028,2689029,2689030,2689031],"Stonecutter":[2689512,2689513,2689514,2689515],"Strontium":[2619420],"Sugarcane":[2692608,2692609,2692610,2692611,2692612,2692613,2692614,2692615,2692616,2692617,2692618,2692619,2692620,2692621,2692622,2692623],"Sulfur":[2619764],"Sunflower":[2692922,2692923],"Sweet Berry Bush":[2693156,2693157,2693158,2693159],"TNT":[2693812,2693813,2693814,2693815],"Tall Grass":[2693586],"Tantalum":[2620091],"Technetium":[2620391],"Tellurium":[2620512],"Tennessine":[2620797],"Terbium":[2621111],"Thallium":[2621248],"Thorium":[2621635],"Thulium":[2621706],"Tin":[2621963],"Tinted Glass":[2722326],"Titanium":[2622431],"Torch":[2694042,2694043,2694044,2694045,2694047],"Torchflower":[2742639],"Torchflower Crop":[2743028,2743029],"Trapped Chest":[2694232,2694233,2694234,2694235],"Tripwire":[2694640,2694641,2694642,2694643,2694644,2694645,2694646,2694647,2694648,2694649,2694650,2694651,2694652,2694653,2694654,2694655],"Tripwire Hook":[2694880,2694881,2694882,2694883,2694884,2694885,2694886,2694887,2694888,2694889,2694890,2694891,2694892,2694893,2694894,2694895],"Tuff":[2710882],"Tungsten":[2622683],"Twisting Vines":[2734080,2734081,2734082,2734083,2734084,2734085,2734086,2734087,2734088,2734089,2734090,2734091,2734092,2734093,2734094,2734095,2734096,2734097,2734104,2734105,2734106,2734107,2734108,2734109,2734110,2734111],"Underwater Torch":[2695096,2695097,2695100,2695102,2695103],"Uranium":[2622970],"Vanadium":[2623035],"Vines":[2695168,2695169,2695170,2695171,2695172,2695173,2695174,2695175,2695176,2695177,2695178,2695179,2695180,2695181,2695182,2695183],"Wall Banner":[2695424,2695425,2695426,2695427,2695428,2695429,2695430,2695431,2695432,2695433,2695434,2695435,2695436,2695437,2695438,2695439,2695440,2695441,2695442,2695443,2695444,2695445,2695446,2695447,2695448,2695449,2695450,2695451,2695452,2695453,2695454,2695455,2695456,2695457,2695458,2695459,2695460,2695461,2695462,2695463,2695464,2695465,2695466,2695467,2695468,2695469,2695470,2695471,2695472,2695473,2695474,2695475,2695476,2695477,2695478,2695479,2695480,2695481,2695482,2695483,2695484,2695485,2695486,2695487],"Wall Coral Fan":[2695744,2695748,2695749,2695750,2695751,2695752,2695756,2695757,2695758,2695759,2695760,2695764,2695765,2695766,2695767,2695768,2695772,2695773,2695774,2695775,2695776,2695780,2695781,2695782,2695783,2695784,2695788,2695789,2695790,2695791,2695792,2695796,2695797,2695798,2695799,2695800,2695804,2695805,2695806,2695807],"Warped Button":[2717680,2717681,2717684,2717685,2717686,2717687,2717688,2717689,2717692,2717693,2717694,2717695],"Warped Door":[2719072,2719073,2719074,2719075,2719076,2719077,2719078,2719079,2719080,2719081,2719082,2719083,2719084,2719085,2719086,2719087,2719088,2719089,2719090,2719091,2719092,2719093,2719094,2719095,2719096,2719097,2719098,2719099,2719100,2719101,2719102,2719103],"Warped Fence":[2713754],"Warped Fence Gate":[2719872,2719873,2719874,2719875,2719876,2719877,2719878,2719879,2719880,2719881,2719882,2719883,2719884,2719885,2719886,2719887],"Warped Hyphae":[2716136,2716137,2716140,2716141,2716142,2716143],"Warped Planks":[2712965],"Warped Pressure Plate":[2718280,2718281],"Warped Roots":[2742193],"Warped Sign":[2721328,2721329,2721330,2721331,2721332,2721333,2721334,2721335,2721336,2721337,2721338,2721339,2721340,2721341,2721342,2721343],"Warped Slab":[2714460,2714462,2714463],"Warped Stairs":[2720552,2720553,2720554,2720555,2720556,2720557,2720558,2720559],"Warped Stem":[2715288,2715289,2715292,2715293,2715294,2715295],"Warped Trapdoor":[2716816,2716817,2716818,2716819,2716820,2716821,2716822,2716823,2716824,2716825,2716826,2716827,2716828,2716829,2716830,2716831],"Warped Wall Sign":[2722096,2722097,2722098,2722099],"Warped Wart Block":[2726917],"Water":[2696032,2696033,2696034,2696035,2696036,2696037,2696038,2696039,2696040,2696041,2696042,2696043,2696044,2696045,2696046,2696047,2696048,2696049,2696050,2696051,2696052,2696053,2696054,2696055,2696056,2696057,2696058,2696059,2696060,2696061,2696062,2696063],"Water Cauldron":[2731792,2731793,2731794,2731795,2731798,2731799],"Weeping Vines":[2734464,2734465,2734466,2734467,2734468,2734469,2734470,2734471,2734472,2734473,2734474,2734475,2734476,2734477,2734478,2734479,2734480,2734481,2734482,2734483,2734484,2734485,2734486,2734487,2734494,2734495],"Weighted Pressure Plate Heavy":[2696432,2696433,2696434,2696435,2696436,2696437,2696438,2696439,2696440,2696441,2696442,2696443,2696444,2696445,2696446,2696447],"Weighted Pressure Plate Light":[2696512,2696513,2696514,2696515,2696516,2696517,2696518,2696519,2696520,2696521,2696522,2696523,2696524,2696525,2696526,2696527],"Wheat Block":[2696832,2696833,2696834,2696835,2696836,2696837,2696838,2696839],"White Tulip":[2697468],"Wither Rose":[2730127],"Wool":[2697712,2697713,2697714,2697715,2697716,2697717,2697718,2697719,2697720,2697721,2697722,2697723,2697724,2697725,2697726,2697727],"Xenon":[2623487],"Ytterbium":[2623729],"Yttrium":[2623770],"Zinc":[2624344],"Zirconium":[2624538],"ate!upd":[2637070],"reserved6":[2675188],"update!":[2636948]},"stateDataBits":8} \ No newline at end of file +{"knownStates":{"???":[20992881],"Acacia Button":[20482064,20482065,20482068,20482069,20482070,20482071,20482072,20482073,20482076,20482077,20482078,20482079],"Acacia Door":[20484288,20484289,20484290,20484291,20484292,20484293,20484294,20484295,20484296,20484297,20484298,20484299,20484300,20484301,20484302,20484303,20484304,20484305,20484306,20484307,20484308,20484309,20484310,20484311,20484312,20484313,20484314,20484315,20484316,20484317,20484318,20484319],"Acacia Fence":[20487161],"Acacia Fence Gate":[20489840,20489841,20489842,20489843,20489844,20489845,20489846,20489847,20489848,20489849,20489850,20489851,20489852,20489853,20489854,20489855],"Acacia Leaves":[20490916,20490917,20490918,20490919],"Acacia Log":[20492840,20492841,20492842,20492843,20492846,20492847],"Acacia Planks":[20496170],"Acacia Pressure Plate":[20497912,20497913],"Acacia Sapling":[20499538,20499539],"Acacia Sign":[20502272,20502273,20502274,20502275,20502276,20502277,20502278,20502279,20502280,20502281,20502282,20502283,20502284,20502285,20502286,20502287],"Acacia Slab":[20502804,20502805,20502806],"Acacia Stairs":[20504680,20504681,20504682,20504683,20504684,20504685,20504686,20504687],"Acacia Trapdoor":[20508544,20508545,20508546,20508547,20508548,20508549,20508550,20508551,20508552,20508553,20508554,20508555,20508556,20508557,20508558,20508559],"Acacia Wall Sign":[20508856,20508857,20508858,20508859],"Acacia Wood":[20511120,20511121,20511122,20511123,20511124,20511125],"Actinium":[20754337],"Activator Rail":[20513778,20513779,20513780,20513781,20513782,20513783,20513786,20513787,20513788,20513789,20513790,20513791],"Air":[20481500],"All Sided Mushroom Stem":[20515945],"Allium":[20517436],"Aluminum":[20756409],"Americium":[20756900],"Amethyst":[21587565],"Amethyst Cluster":[21582624,21582625,21582626,21582627,21582628,21582629,21582630,21582631,21582632,21582633,21582634,21582635,21582636,21582637,21582638,21582639,21582640,21582641,21582642,21582643,21582644,21582645,21582646,21582647],"Ancient Debris":[21589690],"Andesite":[20520193],"Andesite Slab":[20521816,20521818,20521819],"Andesite Stairs":[20523416,20523417,20523418,20523419,20523420,20523421,20523422,20523423],"Andesite Wall":[20525824,20525825,20525826,20525827,20525828,20525829,20525830,20525831,20525832,20525833,20525834,20525835,20525836,20525837,20525838,20525839,20525846,20525888,20525889,20525890,20525891,20525892,20525893,20525894,20525895,20525896,20525897,20525898,20525899,20525900,20525901,20525902,20525903,20525904,20525905,20525906,20525907,20525908,20525909,20525910,20525911,20525912,20525913,20525914,20525915,20525916,20525917,20525918,20525919,20525920,20525921,20525922,20525923,20525924,20525925,20525926,20525927,20525928,20525929,20525930,20525931,20525932,20525933,20525934,20525935,20525936,20525937,20525938,20525939,20525940,20525941,20525942,20525943,20525944,20525945,20525946,20525947,20525948,20525949,20525950,20525951,20525952,20525953,20525954,20525955,20525956,20525957,20525958,20525959,20525960,20525961,20525962,20525963,20525964,20525965,20525966,20525967,20525974,20526016,20526017,20526018,20526019,20526020,20526021,20526022,20526023,20526024,20526025,20526026,20526027,20526028,20526029,20526030,20526031,20526032,20526033,20526034,20526035,20526036,20526037,20526038,20526039,20526040,20526041,20526042,20526043,20526044,20526045,20526046,20526047,20526048,20526049,20526050,20526051,20526052,20526053,20526054,20526055,20526056,20526057,20526058,20526059,20526060,20526061,20526062,20526063,20526064,20526065,20526066,20526067,20526068,20526069,20526070,20526071,20526072,20526073,20526074,20526075,20526076,20526077,20526078,20526079],"Antimony":[20760253],"Anvil":[20528176,20528177,20528179,20528180,20528181,20528183,20528184,20528185,20528187,20528188,20528189,20528191],"Argon":[20760826],"Arsenic":[20763178],"Astatine":[20766501],"Azalea Leaves":[21886340,21886341,21886342,21886343],"Azure Bluet":[20531031],"Bamboo":[20531777,20531778,20531779,20531781,20531782,20531783,20531785,20531786,20531787,20531789,20531790,20531791],"Bamboo Sapling":[20533516,20533517],"Banner":[20535808,20535809,20535810,20535811,20535812,20535813,20535814,20535815,20535816,20535817,20535818,20535819,20535820,20535821,20535822,20535823,20535824,20535825,20535826,20535827,20535828,20535829,20535830,20535831,20535832,20535833,20535834,20535835,20535836,20535837,20535838,20535839,20535840,20535841,20535842,20535843,20535844,20535845,20535846,20535847,20535848,20535849,20535850,20535851,20535852,20535853,20535854,20535855,20535856,20535857,20535858,20535859,20535860,20535861,20535862,20535863,20535864,20535865,20535866,20535867,20535868,20535869,20535870,20535871,20535872,20535873,20535874,20535875,20535876,20535877,20535878,20535879,20535880,20535881,20535882,20535883,20535884,20535885,20535886,20535887,20535888,20535889,20535890,20535891,20535892,20535893,20535894,20535895,20535896,20535897,20535898,20535899,20535900,20535901,20535902,20535903,20535904,20535905,20535906,20535907,20535908,20535909,20535910,20535911,20535912,20535913,20535914,20535915,20535916,20535917,20535918,20535919,20535920,20535921,20535922,20535923,20535924,20535925,20535926,20535927,20535928,20535929,20535930,20535931,20535932,20535933,20535934,20535935,20535936,20535937,20535938,20535939,20535940,20535941,20535942,20535943,20535944,20535945,20535946,20535947,20535948,20535949,20535950,20535951,20535952,20535953,20535954,20535955,20535956,20535957,20535958,20535959,20535960,20535961,20535962,20535963,20535964,20535965,20535966,20535967,20535968,20535969,20535970,20535971,20535972,20535973,20535974,20535975,20535976,20535977,20535978,20535979,20535980,20535981,20535982,20535983,20535984,20535985,20535986,20535987,20535988,20535989,20535990,20535991,20535992,20535993,20535994,20535995,20535996,20535997,20535998,20535999,20536000,20536001,20536002,20536003,20536004,20536005,20536006,20536007,20536008,20536009,20536010,20536011,20536012,20536013,20536014,20536015,20536016,20536017,20536018,20536019,20536020,20536021,20536022,20536023,20536024,20536025,20536026,20536027,20536028,20536029,20536030,20536031,20536032,20536033,20536034,20536035,20536036,20536037,20536038,20536039,20536040,20536041,20536042,20536043,20536044,20536045,20536046,20536047,20536048,20536049,20536050,20536051,20536052,20536053,20536054,20536055,20536056,20536057,20536058,20536059,20536060,20536061,20536062,20536063],"Barium":[20767788],"Barrel":[20538288,20538289,20538290,20538291,20538294,20538295,20538296,20538297,20538298,20538299,20538302,20538303],"Barrier":[20541302],"Basalt":[21591048,21591049,21591050],"Beacon":[20541801],"Bed Block":[20545280,20545281,20545282,20545283,20545284,20545285,20545286,20545287,20545288,20545289,20545290,20545291,20545292,20545293,20545294,20545295,20545296,20545297,20545298,20545299,20545300,20545301,20545302,20545303,20545304,20545305,20545306,20545307,20545308,20545309,20545310,20545311,20545312,20545313,20545314,20545315,20545316,20545317,20545318,20545319,20545320,20545321,20545322,20545323,20545324,20545325,20545326,20545327,20545328,20545329,20545330,20545331,20545332,20545333,20545334,20545335,20545336,20545337,20545338,20545339,20545340,20545341,20545342,20545343,20545344,20545345,20545346,20545347,20545348,20545349,20545350,20545351,20545352,20545353,20545354,20545355,20545356,20545357,20545358,20545359,20545360,20545361,20545362,20545363,20545364,20545365,20545366,20545367,20545368,20545369,20545370,20545371,20545372,20545373,20545374,20545375,20545376,20545377,20545378,20545379,20545380,20545381,20545382,20545383,20545384,20545385,20545386,20545387,20545388,20545389,20545390,20545391,20545392,20545393,20545394,20545395,20545396,20545397,20545398,20545399,20545400,20545401,20545402,20545403,20545404,20545405,20545406,20545407,20545408,20545409,20545410,20545411,20545412,20545413,20545414,20545415,20545416,20545417,20545418,20545419,20545420,20545421,20545422,20545423,20545424,20545425,20545426,20545427,20545428,20545429,20545430,20545431,20545432,20545433,20545434,20545435,20545436,20545437,20545438,20545439,20545440,20545441,20545442,20545443,20545444,20545445,20545446,20545447,20545448,20545449,20545450,20545451,20545452,20545453,20545454,20545455,20545456,20545457,20545458,20545459,20545460,20545461,20545462,20545463,20545464,20545465,20545466,20545467,20545468,20545469,20545470,20545471,20545472,20545473,20545474,20545475,20545476,20545477,20545478,20545479,20545480,20545481,20545482,20545483,20545484,20545485,20545486,20545487,20545488,20545489,20545490,20545491,20545492,20545493,20545494,20545495,20545496,20545497,20545498,20545499,20545500,20545501,20545502,20545503,20545504,20545505,20545506,20545507,20545508,20545509,20545510,20545511,20545512,20545513,20545514,20545515,20545516,20545517,20545518,20545519,20545520,20545521,20545522,20545523,20545524,20545525,20545526,20545527,20545528,20545529,20545530,20545531,20545532,20545533,20545534,20545535],"Bedrock":[20545540,20545541],"Beetroot Block":[20549328,20549329,20549330,20549331,20549332,20549333,20549334,20549335],"Bell":[20551488,20551489,20551490,20551491,20551492,20551493,20551494,20551495,20551496,20551497,20551498,20551499,20551500,20551501,20551502,20551503],"Berkelium":[20768774],"Beryllium":[20771395],"Big Dripleaf":[21929936,21929937,21929938,21929939,21929940,21929941,21929942,21929943,21929944,21929945,21929946,21929947,21929948,21929949,21929950,21929951],"Big Dripleaf Stem":[21931976,21931977,21931978,21931979],"Birch Button":[20552224,20552225,20552226,20552227,20552230,20552231,20552232,20552233,20552234,20552235,20552238,20552239],"Birch Door":[20554848,20554849,20554850,20554851,20554852,20554853,20554854,20554855,20554856,20554857,20554858,20554859,20554860,20554861,20554862,20554863,20554864,20554865,20554866,20554867,20554868,20554869,20554870,20554871,20554872,20554873,20554874,20554875,20554876,20554877,20554878,20554879],"Birch Fence":[20557622],"Birch Fence Gate":[20559792,20559793,20559794,20559795,20559796,20559797,20559798,20559799,20559800,20559801,20559802,20559803,20559804,20559805,20559806,20559807],"Birch Leaves":[20560344,20560345,20560346,20560347],"Birch Log":[20563648,20563649,20563652,20563653,20563654,20563655],"Birch Planks":[20564186],"Birch Pressure Plate":[20567746,20567747],"Birch Sapling":[20568972,20568973],"Birch Sign":[20571536,20571537,20571538,20571539,20571540,20571541,20571542,20571543,20571544,20571545,20571546,20571547,20571548,20571549,20571550,20571551],"Birch Slab":[20573196,20573197,20573198],"Birch Stairs":[20575080,20575081,20575082,20575083,20575084,20575085,20575086,20575087],"Birch Trapdoor":[20577008,20577009,20577010,20577011,20577012,20577013,20577014,20577015,20577016,20577017,20577018,20577019,20577020,20577021,20577022,20577023],"Birch Wall Sign":[20579020,20579021,20579022,20579023],"Birch Wood":[20580826,20580827,20580828,20580829,20580830,20580831],"Bismuth":[20773935],"Blackstone":[21596307],"Blackstone Slab":[21599012,21599014,21599015],"Blackstone Stairs":[21601800,21601801,21601802,21601803,21601804,21601805,21601806,21601807],"Blackstone Wall":[21604098,21604112,21604113,21604114,21604115,21604116,21604117,21604118,21604119,21604120,21604121,21604122,21604123,21604124,21604125,21604126,21604127,21604160,21604161,21604162,21604163,21604164,21604165,21604166,21604167,21604168,21604169,21604170,21604171,21604172,21604173,21604174,21604175,21604176,21604177,21604178,21604179,21604180,21604181,21604182,21604183,21604184,21604185,21604186,21604187,21604188,21604189,21604190,21604191,21604192,21604193,21604194,21604195,21604196,21604197,21604198,21604199,21604200,21604201,21604202,21604203,21604204,21604205,21604206,21604207,21604208,21604209,21604210,21604211,21604212,21604213,21604214,21604215,21604216,21604217,21604218,21604219,21604220,21604221,21604222,21604223,21604226,21604240,21604241,21604242,21604243,21604244,21604245,21604246,21604247,21604248,21604249,21604250,21604251,21604252,21604253,21604254,21604255,21604288,21604289,21604290,21604291,21604292,21604293,21604294,21604295,21604296,21604297,21604298,21604299,21604300,21604301,21604302,21604303,21604304,21604305,21604306,21604307,21604308,21604309,21604310,21604311,21604312,21604313,21604314,21604315,21604316,21604317,21604318,21604319,21604320,21604321,21604322,21604323,21604324,21604325,21604326,21604327,21604328,21604329,21604330,21604331,21604332,21604333,21604334,21604335,21604336,21604337,21604338,21604339,21604340,21604341,21604342,21604343,21604344,21604345,21604346,21604347,21604348,21604349,21604350,21604351],"Blast Furnace":[20585328,20585329,20585330,20585331,20585332,20585333,20585334,20585335],"Blue Ice":[20588595],"Blue Orchid":[20591829],"Blue Torch":[20593968,20593969,20593973,20593974,20593975],"Bohrium":[20775552],"Bone Block":[20596340,20596341,20596343],"Bookshelf":[20597864],"Boron":[20777985],"Brewing Stand":[20600176,20600177,20600178,20600179,20600180,20600181,20600182,20600183],"Brick Slab":[20601168,20601169,20601171],"Brick Stairs":[20604408,20604409,20604410,20604411,20604412,20604413,20604414,20604415],"Brick Wall":[20605952,20605953,20605954,20605955,20605956,20605957,20605958,20605959,20605960,20605961,20605962,20605963,20605964,20605965,20605966,20605967,20605968,20605969,20605970,20605971,20605972,20605973,20605974,20605975,20605976,20605977,20605978,20605979,20605980,20605981,20605982,20605983,20605984,20605985,20605986,20605987,20605988,20605989,20605990,20605991,20605992,20605993,20605994,20605995,20605996,20605997,20605998,20605999,20606000,20606001,20606002,20606003,20606004,20606005,20606006,20606007,20606008,20606009,20606010,20606011,20606012,20606013,20606014,20606015,20606053,20606064,20606065,20606066,20606067,20606068,20606069,20606070,20606071,20606072,20606073,20606074,20606075,20606076,20606077,20606078,20606079,20606080,20606081,20606082,20606083,20606084,20606085,20606086,20606087,20606088,20606089,20606090,20606091,20606092,20606093,20606094,20606095,20606096,20606097,20606098,20606099,20606100,20606101,20606102,20606103,20606104,20606105,20606106,20606107,20606108,20606109,20606110,20606111,20606112,20606113,20606114,20606115,20606116,20606117,20606118,20606119,20606120,20606121,20606122,20606123,20606124,20606125,20606126,20606127,20606128,20606129,20606130,20606131,20606132,20606133,20606134,20606135,20606136,20606137,20606138,20606139,20606140,20606141,20606142,20606143,20606181,20606192,20606193,20606194,20606195,20606196,20606197,20606198,20606199,20606200,20606201,20606202,20606203,20606204,20606205,20606206,20606207],"Bricks":[20608594],"Bromine":[20779949],"Brown Mushroom":[20613080],"Brown Mushroom Block":[20614032,20614033,20614034,20614035,20614036,20614037,20614038,20614039,20614044,20614045,20614047],"Budding Amethyst":[21577592],"Cactus":[20616384,20616385,20616386,20616387,20616388,20616389,20616390,20616391,20616392,20616393,20616394,20616395,20616396,20616397,20616398,20616399],"Cadmium":[20781893],"Cake":[20618584,20618585,20618586,20618587,20618588,20618589,20618590],"Cake With Candle":[21837222,21837223],"Cake With Dyed Candle":[21839232,21839233,21839234,21839235,21839236,21839237,21839238,21839239,21839240,21839241,21839242,21839243,21839244,21839245,21839246,21839247,21839248,21839249,21839250,21839251,21839252,21839253,21839254,21839255,21839256,21839257,21839258,21839259,21839260,21839261,21839262,21839263],"Calcite":[21638381],"Calcium":[20783925],"Californium":[20787131],"Candle":[21832176,21832177,21832178,21832179,21832180,21832181,21832182,21832183],"Carbon":[20789232],"Carpet":[20619280,20619281,20619282,20619283,20619284,20619285,20619286,20619287,20619288,20619289,20619290,20619291,20619292,20619293,20619294,20619295],"Carrot Block":[20622752,20622753,20622754,20622755,20622756,20622757,20622758,20622759],"Cartography Table":[21845741],"Carved Pumpkin":[20624628,20624629,20624630,20624631],"Cauldron":[21852969],"Cave Vines":[21892224,21892225,21892226,21892227,21892228,21892229,21892230,21892231,21892232,21892233,21892234,21892235,21892236,21892237,21892238,21892239,21892244,21892245,21892248,21892249,21892250,21892251,21892252,21892253,21892254,21892255,21892256,21892257,21892258,21892259,21892260,21892261,21892262,21892263,21892264,21892265,21892266,21892267,21892268,21892269,21892270,21892271,21892276,21892277,21892280,21892281,21892282,21892283,21892284,21892285,21892286,21892287,21892288,21892289,21892290,21892291,21892292,21892293,21892294,21892295,21892296,21892297,21892298,21892299,21892300,21892301,21892302,21892303,21892308,21892309,21892312,21892313,21892314,21892315,21892316,21892317,21892318,21892319,21892320,21892321,21892322,21892323,21892324,21892325,21892326,21892327,21892328,21892329,21892330,21892331,21892332,21892333,21892334,21892335,21892340,21892341,21892344,21892345,21892346,21892347,21892348,21892349,21892350,21892351],"Cerium":[20789431],"Cesium":[20791798],"Chain":[21878573,21878574,21878575],"Cherry Button":[21895570,21895571,21895572,21895573,21895574,21895575,21895578,21895579,21895580,21895581,21895582,21895583],"Cherry Door":[21898304,21898305,21898306,21898307,21898308,21898309,21898310,21898311,21898312,21898313,21898314,21898315,21898316,21898317,21898318,21898319,21898320,21898321,21898322,21898323,21898324,21898325,21898326,21898327,21898328,21898329,21898330,21898331,21898332,21898333,21898334,21898335],"Cherry Fence":[21900661],"Cherry Fence Gate":[21901904,21901905,21901906,21901907,21901908,21901909,21901910,21901911,21901912,21901913,21901914,21901915,21901916,21901917,21901918,21901919],"Cherry Leaves":[21904412,21904413,21904414,21904415],"Cherry Log":[21905784,21905785,21905786,21905787,21905790,21905791],"Cherry Planks":[21908756],"Cherry Pressure Plate":[21911536,21911537],"Cherry Sign":[21914944,21914945,21914946,21914947,21914948,21914949,21914950,21914951,21914952,21914953,21914954,21914955,21914956,21914957,21914958,21914959],"Cherry Slab":[21917632,21917633,21917635],"Cherry Stairs":[21918912,21918913,21918914,21918915,21918916,21918917,21918918,21918919],"Cherry Trapdoor":[21919968,21919969,21919970,21919971,21919972,21919973,21919974,21919975,21919976,21919977,21919978,21919979,21919980,21919981,21919982,21919983],"Cherry Wall Sign":[21923100,21923101,21923102,21923103],"Cherry Wood":[21924008,21924009,21924012,21924013,21924014,21924015],"Chest":[20628872,20628873,20628874,20628875],"Chiseled Bookshelf":[21938176,21938177,21938178,21938179,21938180,21938181,21938182,21938183,21938184,21938185,21938186,21938187,21938188,21938189,21938190,21938191,21938192,21938193,21938194,21938195,21938196,21938197,21938198,21938199,21938200,21938201,21938202,21938203,21938204,21938205,21938206,21938207,21938208,21938209,21938210,21938211,21938212,21938213,21938214,21938215,21938216,21938217,21938218,21938219,21938220,21938221,21938222,21938223,21938224,21938225,21938226,21938227,21938228,21938229,21938230,21938231,21938232,21938233,21938234,21938235,21938236,21938237,21938238,21938239,21938240,21938241,21938242,21938243,21938244,21938245,21938246,21938247,21938248,21938249,21938250,21938251,21938252,21938253,21938254,21938255,21938256,21938257,21938258,21938259,21938260,21938261,21938262,21938263,21938264,21938265,21938266,21938267,21938268,21938269,21938270,21938271,21938272,21938273,21938274,21938275,21938276,21938277,21938278,21938279,21938280,21938281,21938282,21938283,21938284,21938285,21938286,21938287,21938288,21938289,21938290,21938291,21938292,21938293,21938294,21938295,21938296,21938297,21938298,21938299,21938300,21938301,21938302,21938303,21938304,21938305,21938306,21938307,21938308,21938309,21938310,21938311,21938312,21938313,21938314,21938315,21938316,21938317,21938318,21938319,21938320,21938321,21938322,21938323,21938324,21938325,21938326,21938327,21938328,21938329,21938330,21938331,21938332,21938333,21938334,21938335,21938336,21938337,21938338,21938339,21938340,21938341,21938342,21938343,21938344,21938345,21938346,21938347,21938348,21938349,21938350,21938351,21938352,21938353,21938354,21938355,21938356,21938357,21938358,21938359,21938360,21938361,21938362,21938363,21938364,21938365,21938366,21938367,21938368,21938369,21938370,21938371,21938372,21938373,21938374,21938375,21938376,21938377,21938378,21938379,21938380,21938381,21938382,21938383,21938384,21938385,21938386,21938387,21938388,21938389,21938390,21938391,21938392,21938393,21938394,21938395,21938396,21938397,21938398,21938399,21938400,21938401,21938402,21938403,21938404,21938405,21938406,21938407,21938408,21938409,21938410,21938411,21938412,21938413,21938414,21938415,21938416,21938417,21938418,21938419,21938420,21938421,21938422,21938423,21938424,21938425,21938426,21938427,21938428,21938429,21938430,21938431],"Chiseled Deepslate":[21680290],"Chiseled Nether Bricks":[21682906],"Chiseled Polished Blackstone":[21618038],"Chiseled Quartz Block":[20630148,20630150,20630151],"Chiseled Red Sandstone":[20633244],"Chiseled Sandstone":[20635615],"Chiseled Stone Bricks":[20636034],"Chlorine":[20794258],"Chorus Flower":[21864360,21864361,21864364,21864365,21864366,21864367],"Chorus Plant":[21866123],"Chromium":[20797122],"Clay Block":[20639448],"Coal Block":[20641681],"Coal Ore":[20642280],"Cobalt":[20799311],"Cobbled Deepslate":[21662962],"Cobbled Deepslate Slab":[21665324,21665326,21665327],"Cobbled Deepslate Stairs":[21666232,21666233,21666234,21666235,21666236,21666237,21666238,21666239],"Cobbled Deepslate Wall":[21668389,21668400,21668401,21668402,21668403,21668404,21668405,21668406,21668407,21668408,21668409,21668410,21668411,21668412,21668413,21668414,21668415,21668416,21668417,21668418,21668419,21668420,21668421,21668422,21668423,21668424,21668425,21668426,21668427,21668428,21668429,21668430,21668431,21668432,21668433,21668434,21668435,21668436,21668437,21668438,21668439,21668440,21668441,21668442,21668443,21668444,21668445,21668446,21668447,21668448,21668449,21668450,21668451,21668452,21668453,21668454,21668455,21668456,21668457,21668458,21668459,21668460,21668461,21668462,21668463,21668464,21668465,21668466,21668467,21668468,21668469,21668470,21668471,21668472,21668473,21668474,21668475,21668476,21668477,21668478,21668479,21668517,21668528,21668529,21668530,21668531,21668532,21668533,21668534,21668535,21668536,21668537,21668538,21668539,21668540,21668541,21668542,21668543,21668544,21668545,21668546,21668547,21668548,21668549,21668550,21668551,21668552,21668553,21668554,21668555,21668556,21668557,21668558,21668559,21668560,21668561,21668562,21668563,21668564,21668565,21668566,21668567,21668568,21668569,21668570,21668571,21668572,21668573,21668574,21668575,21668576,21668577,21668578,21668579,21668580,21668581,21668582,21668583,21668584,21668585,21668586,21668587,21668588,21668589,21668590,21668591,21668592,21668593,21668594,21668595,21668596,21668597,21668598,21668599,21668600,21668601,21668602,21668603,21668604,21668605,21668606,21668607],"Cobblestone":[20645646],"Cobblestone Slab":[20647760,20647762,20647763],"Cobblestone Stairs":[20648720,20648721,20648722,20648723,20648724,20648725,20648726,20648727],"Cobblestone Wall":[20649984,20649985,20649986,20649987,20649988,20649989,20649990,20649991,20649992,20649993,20649994,20649995,20649996,20649997,20649998,20649999,20650000,20650001,20650002,20650003,20650004,20650005,20650006,20650007,20650008,20650009,20650010,20650011,20650012,20650013,20650014,20650015,20650016,20650017,20650018,20650019,20650020,20650021,20650022,20650023,20650024,20650025,20650026,20650027,20650028,20650029,20650030,20650031,20650032,20650033,20650034,20650035,20650036,20650037,20650038,20650039,20650040,20650041,20650042,20650043,20650044,20650045,20650046,20650047,20650080,20650081,20650082,20650083,20650084,20650085,20650086,20650087,20650088,20650089,20650090,20650091,20650092,20650093,20650094,20650095,20650099,20650112,20650113,20650114,20650115,20650116,20650117,20650118,20650119,20650120,20650121,20650122,20650123,20650124,20650125,20650126,20650127,20650128,20650129,20650130,20650131,20650132,20650133,20650134,20650135,20650136,20650137,20650138,20650139,20650140,20650141,20650142,20650143,20650144,20650145,20650146,20650147,20650148,20650149,20650150,20650151,20650152,20650153,20650154,20650155,20650156,20650157,20650158,20650159,20650160,20650161,20650162,20650163,20650164,20650165,20650166,20650167,20650168,20650169,20650170,20650171,20650172,20650173,20650174,20650175,20650208,20650209,20650210,20650211,20650212,20650213,20650214,20650215,20650216,20650217,20650218,20650219,20650220,20650221,20650222,20650223,20650227],"Cobweb":[20652464],"Cocoa Block":[20655024,20655025,20655026,20655027,20655028,20655029,20655030,20655031,20655032,20655033,20655034,20655035],"Compound Creator":[20656176,20656177,20656178,20656179],"Concrete":[20659968,20659969,20659970,20659971,20659972,20659973,20659974,20659975,20659976,20659977,20659978,20659979,20659980,20659981,20659982,20659983],"Concrete Powder":[20661296,20661297,20661298,20661299,20661300,20661301,20661302,20661303,20661304,20661305,20661306,20661307,20661308,20661309,20661310,20661311],"Copernicium":[20802812],"Copper":[20804760],"Copper Block":[21823528,21823529,21823530,21823531,21823532,21823533,21823534,21823535],"Copper Ore":[21798993],"Coral":[20663618,20663620,20663621,20663622,20663623,20663626,20663628,20663629,20663630,20663631],"Coral Block":[20664465,20664468,20664469,20664470,20664471,20664473,20664476,20664477,20664478,20664479],"Coral Fan":[20668131,20668132,20668133,20668134,20668135,20668139,20668140,20668141,20668142,20668143,20668147,20668148,20668149,20668150,20668151,20668155,20668156,20668157,20668158,20668159],"Cornflower":[20670352],"Cracked Deepslate Bricks":[21650157],"Cracked Deepslate Tiles":[21661164],"Cracked Nether Bricks":[21685186],"Cracked Polished Blackstone Bricks":[21628426],"Cracked Stone Bricks":[20670706],"Crafting Table":[20672716],"Crimson Button":[21737520,21737521,21737522,21737523,21737526,21737527,21737528,21737529,21737530,21737531,21737534,21737535],"Crimson Door":[21751360,21751361,21751362,21751363,21751364,21751365,21751366,21751367,21751368,21751369,21751370,21751371,21751372,21751373,21751374,21751375,21751376,21751377,21751378,21751379,21751380,21751381,21751382,21751383,21751384,21751385,21751386,21751387,21751388,21751389,21751390,21751391],"Crimson Fence":[21707929],"Crimson Fence Gate":[21757232,21757233,21757234,21757235,21757236,21757237,21757238,21757239,21757240,21757241,21757242,21757243,21757244,21757245,21757246,21757247],"Crimson Hyphae":[21726912,21726913,21726916,21726917,21726918,21726919],"Crimson Planks":[21701319],"Crimson Pressure Plate":[21745172,21745173],"Crimson Roots":[21934477],"Crimson Sign":[21769568,21769569,21769570,21769571,21769572,21769573,21769574,21769575,21769576,21769577,21769578,21769579,21769580,21769581,21769582,21769583],"Crimson Slab":[21714416,21714417,21714418],"Crimson Stairs":[21763896,21763897,21763898,21763899,21763900,21763901,21763902,21763903],"Crimson Stem":[21719642,21719643,21719644,21719645,21719646,21719647],"Crimson Trapdoor":[21733344,21733345,21733346,21733347,21733348,21733349,21733350,21733351,21733352,21733353,21733354,21733355,21733356,21733357,21733358,21733359],"Crimson Wall Sign":[21774384,21774385,21774386,21774387],"Crying Obsidian":[21818013],"Curium":[20805897],"Cut Copper Block":[21827208,21827209,21827210,21827211,21827212,21827213,21827214,21827215],"Cut Copper Slab Slab":[21827976,21827977,21827978,21827979,21827980,21827981,21827982,21827983,21827984,21827985,21827986,21827987,21827988,21827989,21827990,21827991,21827992,21827993,21827994,21827995,21827996,21827997,21827998,21827999],"Cut Copper Stairs":[21830080,21830081,21830082,21830083,21830084,21830085,21830086,21830087,21830088,21830089,21830090,21830091,21830092,21830093,21830094,21830095,21830096,21830097,21830098,21830099,21830100,21830101,21830102,21830103,21830104,21830105,21830106,21830107,21830108,21830109,21830110,21830111,21830112,21830113,21830114,21830115,21830116,21830117,21830118,21830119,21830120,21830121,21830122,21830123,21830124,21830125,21830126,21830127,21830128,21830129,21830130,21830131,21830132,21830133,21830134,21830135,21830136,21830137,21830138,21830139,21830140,21830141,21830142,21830143],"Cut Red Sandstone":[20674620],"Cut Red Sandstone Slab":[20676996,20676997,20676999],"Cut Sandstone":[20679139],"Cut Sandstone Slab":[20681972,20681973,20681974],"Dandelion":[20686168],"Dark Oak Button":[20688624,20688625,20688626,20688627,20688630,20688631,20688632,20688633,20688634,20688635,20688638,20688639],"Dark Oak Door":[20690144,20690145,20690146,20690147,20690148,20690149,20690150,20690151,20690152,20690153,20690154,20690155,20690156,20690157,20690158,20690159,20690160,20690161,20690162,20690163,20690164,20690165,20690166,20690167,20690168,20690169,20690170,20690171,20690172,20690173,20690174,20690175],"Dark Oak Fence":[20692929],"Dark Oak Fence Gate":[20694464,20694465,20694466,20694467,20694468,20694469,20694470,20694471,20694472,20694473,20694474,20694475,20694476,20694477,20694478,20694479],"Dark Oak Leaves":[20696240,20696241,20696242,20696243],"Dark Oak Log":[20698832,20698833,20698836,20698837,20698838,20698839],"Dark Oak Planks":[20699858],"Dark Oak Pressure Plate":[20701726,20701727],"Dark Oak Sapling":[20704518,20704519],"Dark Oak Sign":[20705760,20705761,20705762,20705763,20705764,20705765,20705766,20705767,20705768,20705769,20705770,20705771,20705772,20705773,20705774,20705775],"Dark Oak Slab":[20708816,20708817,20708818],"Dark Oak Stairs":[20711344,20711345,20711346,20711347,20711348,20711349,20711350,20711351],"Dark Oak Trapdoor":[20713024,20713025,20713026,20713027,20713028,20713029,20713030,20713031,20713032,20713033,20713034,20713035,20713036,20713037,20713038,20713039],"Dark Oak Wall Sign":[20715224,20715225,20715226,20715227],"Dark Oak Wood":[20716738,20716739,20716740,20716741,20716742,20716743],"Dark Prismarine":[20719220],"Dark Prismarine Slab":[20721200,20721202,20721203],"Dark Prismarine Stairs":[20722592,20722593,20722594,20722595,20722596,20722597,20722598,20722599],"Darmstadtium":[20809292],"Daylight Sensor":[20724416,20724417,20724418,20724419,20724420,20724421,20724422,20724423,20724424,20724425,20724426,20724427,20724428,20724429,20724430,20724431,20724432,20724433,20724434,20724435,20724436,20724437,20724438,20724439,20724440,20724441,20724442,20724443,20724444,20724445,20724446,20724447],"Dead Bush":[20727625],"Deepslate":[21640384,21640385,21640387],"Deepslate Brick Slab":[21644892,21644893,21644894],"Deepslate Brick Stairs":[21646904,21646905,21646906,21646907,21646908,21646909,21646910,21646911],"Deepslate Brick Wall":[21649152,21649153,21649154,21649155,21649156,21649157,21649158,21649159,21649160,21649161,21649162,21649163,21649164,21649165,21649166,21649167,21649168,21649169,21649170,21649171,21649172,21649173,21649174,21649175,21649176,21649177,21649178,21649179,21649180,21649181,21649182,21649183,21649184,21649185,21649186,21649187,21649188,21649189,21649190,21649191,21649192,21649193,21649194,21649195,21649196,21649197,21649198,21649199,21649200,21649201,21649202,21649203,21649204,21649205,21649206,21649207,21649208,21649209,21649210,21649211,21649212,21649213,21649214,21649215,21649217,21649232,21649233,21649234,21649235,21649236,21649237,21649238,21649239,21649240,21649241,21649242,21649243,21649244,21649245,21649246,21649247,21649280,21649281,21649282,21649283,21649284,21649285,21649286,21649287,21649288,21649289,21649290,21649291,21649292,21649293,21649294,21649295,21649296,21649297,21649298,21649299,21649300,21649301,21649302,21649303,21649304,21649305,21649306,21649307,21649308,21649309,21649310,21649311,21649312,21649313,21649314,21649315,21649316,21649317,21649318,21649319,21649320,21649321,21649322,21649323,21649324,21649325,21649326,21649327,21649328,21649329,21649330,21649331,21649332,21649333,21649334,21649335,21649336,21649337,21649338,21649339,21649340,21649341,21649342,21649343,21649345,21649360,21649361,21649362,21649363,21649364,21649365,21649366,21649367,21649368,21649369,21649370,21649371,21649372,21649373,21649374,21649375],"Deepslate Bricks":[21642473],"Deepslate Coal Ore":[21783821],"Deepslate Copper Ore":[21797493],"Deepslate Diamond Ore":[21785055],"Deepslate Emerald Ore":[21788073],"Deepslate Gold Ore":[21795656],"Deepslate Iron Ore":[21794765],"Deepslate Lapis Lazuli Ore":[21788910],"Deepslate Redstone Ore":[21791572,21791573],"Deepslate Tile Slab":[21655484,21655485,21655487],"Deepslate Tile Stairs":[21657328,21657329,21657330,21657331,21657332,21657333,21657334,21657335],"Deepslate Tile Wall":[21658912,21658913,21658914,21658915,21658916,21658917,21658918,21658919,21658920,21658921,21658922,21658923,21658924,21658925,21658926,21658927,21658930,21658944,21658945,21658946,21658947,21658948,21658949,21658950,21658951,21658952,21658953,21658954,21658955,21658956,21658957,21658958,21658959,21658960,21658961,21658962,21658963,21658964,21658965,21658966,21658967,21658968,21658969,21658970,21658971,21658972,21658973,21658974,21658975,21658976,21658977,21658978,21658979,21658980,21658981,21658982,21658983,21658984,21658985,21658986,21658987,21658988,21658989,21658990,21658991,21658992,21658993,21658994,21658995,21658996,21658997,21658998,21658999,21659000,21659001,21659002,21659003,21659004,21659005,21659006,21659007,21659040,21659041,21659042,21659043,21659044,21659045,21659046,21659047,21659048,21659049,21659050,21659051,21659052,21659053,21659054,21659055,21659058,21659072,21659073,21659074,21659075,21659076,21659077,21659078,21659079,21659080,21659081,21659082,21659083,21659084,21659085,21659086,21659087,21659088,21659089,21659090,21659091,21659092,21659093,21659094,21659095,21659096,21659097,21659098,21659099,21659100,21659101,21659102,21659103,21659104,21659105,21659106,21659107,21659108,21659109,21659110,21659111,21659112,21659113,21659114,21659115,21659116,21659117,21659118,21659119,21659120,21659121,21659122,21659123,21659124,21659125,21659126,21659127,21659128,21659129,21659130,21659131,21659132,21659133,21659134,21659135],"Deepslate Tiles":[21652461],"Detector Rail":[20728240,20728241,20728242,20728243,20728246,20728247,20728248,20728249,20728250,20728251,20728254,20728255],"Diamond Block":[20730418],"Diamond Ore":[20733642],"Diorite":[20734079],"Diorite Slab":[20737469,20737470,20737471],"Diorite Stairs":[20739504,20739505,20739506,20739507,20739508,20739509,20739510,20739511],"Diorite Wall":[20741920,20741921,20741922,20741923,20741924,20741925,20741926,20741927,20741928,20741929,20741930,20741931,20741932,20741933,20741934,20741935,20741937,20741952,20741953,20741954,20741955,20741956,20741957,20741958,20741959,20741960,20741961,20741962,20741963,20741964,20741965,20741966,20741967,20741968,20741969,20741970,20741971,20741972,20741973,20741974,20741975,20741976,20741977,20741978,20741979,20741980,20741981,20741982,20741983,20741984,20741985,20741986,20741987,20741988,20741989,20741990,20741991,20741992,20741993,20741994,20741995,20741996,20741997,20741998,20741999,20742000,20742001,20742002,20742003,20742004,20742005,20742006,20742007,20742008,20742009,20742010,20742011,20742012,20742013,20742014,20742015,20742048,20742049,20742050,20742051,20742052,20742053,20742054,20742055,20742056,20742057,20742058,20742059,20742060,20742061,20742062,20742063,20742065,20742080,20742081,20742082,20742083,20742084,20742085,20742086,20742087,20742088,20742089,20742090,20742091,20742092,20742093,20742094,20742095,20742096,20742097,20742098,20742099,20742100,20742101,20742102,20742103,20742104,20742105,20742106,20742107,20742108,20742109,20742110,20742111,20742112,20742113,20742114,20742115,20742116,20742117,20742118,20742119,20742120,20742121,20742122,20742123,20742124,20742125,20742126,20742127,20742128,20742129,20742130,20742131,20742132,20742133,20742134,20742135,20742136,20742137,20742138,20742139,20742140,20742141,20742142,20742143],"Dirt":[20742760,20742761,20742763],"Double Pitcher Crop":[21950064,21950065,21950066,21950067],"Double Tallgrass":[20744902,20744903],"Dragon Egg":[20747804],"Dried Kelp Block":[20749160],"Dubnium":[20811286],"Dyed Candle":[21834240,21834241,21834242,21834243,21834244,21834245,21834246,21834247,21834248,21834249,21834250,21834251,21834252,21834253,21834254,21834255,21834256,21834257,21834258,21834259,21834260,21834261,21834262,21834263,21834264,21834265,21834266,21834267,21834268,21834269,21834270,21834271,21834272,21834273,21834274,21834275,21834276,21834277,21834278,21834279,21834280,21834281,21834282,21834283,21834284,21834285,21834286,21834287,21834288,21834289,21834290,21834291,21834292,21834293,21834294,21834295,21834296,21834297,21834298,21834299,21834300,21834301,21834302,21834303,21834304,21834305,21834306,21834307,21834308,21834309,21834310,21834311,21834312,21834313,21834314,21834315,21834316,21834317,21834318,21834319,21834320,21834321,21834322,21834323,21834324,21834325,21834326,21834327,21834328,21834329,21834330,21834331,21834332,21834333,21834334,21834335,21834336,21834337,21834338,21834339,21834340,21834341,21834342,21834343,21834344,21834345,21834346,21834347,21834348,21834349,21834350,21834351,21834352,21834353,21834354,21834355,21834356,21834357,21834358,21834359,21834360,21834361,21834362,21834363,21834364,21834365,21834366,21834367],"Dyed Shulker Box":[20750816,20750817,20750818,20750819,20750820,20750821,20750822,20750823,20750824,20750825,20750826,20750827,20750828,20750829,20750830,20750831],"Dysprosium":[20812845],"Einsteinium":[20813977],"Element Constructor":[20799584,20799585,20799586,20799587],"Emerald Block":[20998956],"Emerald Ore":[21001840],"Enchanting Table":[21002728],"End Portal Frame":[21005904,21005905,21005906,21005907,21005908,21005909,21005910,21005911],"End Rod":[21006744,21006745,21006746,21006747,21006750,21006751],"End Stone":[21010195],"End Stone Brick Slab":[21011608,21011609,21011611],"End Stone Brick Stairs":[21014200,21014201,21014202,21014203,21014204,21014205,21014206,21014207],"End Stone Brick Wall":[21015589,21015600,21015601,21015602,21015603,21015604,21015605,21015606,21015607,21015608,21015609,21015610,21015611,21015612,21015613,21015614,21015615,21015616,21015617,21015618,21015619,21015620,21015621,21015622,21015623,21015624,21015625,21015626,21015627,21015628,21015629,21015630,21015631,21015632,21015633,21015634,21015635,21015636,21015637,21015638,21015639,21015640,21015641,21015642,21015643,21015644,21015645,21015646,21015647,21015648,21015649,21015650,21015651,21015652,21015653,21015654,21015655,21015656,21015657,21015658,21015659,21015660,21015661,21015662,21015663,21015664,21015665,21015666,21015667,21015668,21015669,21015670,21015671,21015672,21015673,21015674,21015675,21015676,21015677,21015678,21015679,21015717,21015728,21015729,21015730,21015731,21015732,21015733,21015734,21015735,21015736,21015737,21015738,21015739,21015740,21015741,21015742,21015743,21015744,21015745,21015746,21015747,21015748,21015749,21015750,21015751,21015752,21015753,21015754,21015755,21015756,21015757,21015758,21015759,21015760,21015761,21015762,21015763,21015764,21015765,21015766,21015767,21015768,21015769,21015770,21015771,21015772,21015773,21015774,21015775,21015776,21015777,21015778,21015779,21015780,21015781,21015782,21015783,21015784,21015785,21015786,21015787,21015788,21015789,21015790,21015791,21015792,21015793,21015794,21015795,21015796,21015797,21015798,21015799,21015800,21015801,21015802,21015803,21015804,21015805,21015806,21015807],"End Stone Bricks":[21017562],"Ender Chest":[21019660,21019661,21019662,21019663],"Erbium":[20817537],"Europium":[20819484],"Fake Wooden Slab":[21021009,21021010,21021011],"Farmland":[21022720,21022721,21022722,21022723,21022724,21022725,21022726,21022727,21022728,21022729,21022730,21022731,21022732,21022733,21022734,21022735,21022736,21022737,21022738,21022739,21022740,21022741,21022742,21022743,21022744,21022745,21022746,21022747,21022748,21022749,21022750,21022751,21022752,21022753,21022754,21022755,21022756,21022757,21022758,21022759,21022760,21022761,21022762,21022763,21022764,21022765,21022766,21022767,21022768,21022769,21022770,21022771,21022772,21022773,21022774,21022775,21022776,21022777,21022778,21022779,21022780,21022781,21022782,21022783,21022784,21022785,21022786,21022787,21022788,21022789,21022790,21022791,21022792,21022793,21022794,21022795,21022796,21022797,21022798,21022799,21022800,21022801,21022802,21022803,21022804,21022805,21022806,21022807,21022808,21022809,21022810,21022811,21022812,21022813,21022814,21022815,21022816,21022817,21022818,21022819,21022820,21022821,21022822,21022823,21022824,21022825,21022826,21022827,21022828,21022829,21022830,21022831,21022832,21022833,21022834,21022835,21022836,21022837,21022838,21022839,21022840,21022841,21022842,21022843,21022844,21022845,21022846,21022847,21022848,21022849,21022850,21022851,21022852,21022853,21022854,21022855,21022856,21022857,21022858,21022859,21022860,21022861,21022862,21022863,21022864,21022865,21022866,21022867,21022868,21022869,21022870,21022871,21022872,21022873,21022874,21022875,21022876,21022877,21022878,21022879,21022880,21022881,21022882,21022883,21022884,21022885,21022886,21022887,21022888,21022889,21022890,21022891,21022892,21022893,21022894,21022895,21022896,21022897,21022898,21022899,21022900,21022901,21022902,21022903,21022904,21022905,21022906,21022907,21022908,21022909,21022910,21022911,21022912,21022913,21022914,21022915,21022916,21022917,21022918,21022919,21022920,21022921,21022922,21022923,21022924,21022925,21022926,21022927,21022928,21022929,21022930,21022931,21022932,21022933,21022934,21022935,21022936,21022937,21022938,21022939,21022940,21022941,21022942,21022943,21022944,21022945,21022946,21022947,21022948,21022949,21022950,21022951,21022952,21022953,21022954,21022955,21022956,21022957,21022958,21022959,21022960,21022961,21022962,21022963,21022964,21022965,21022966,21022967,21022968,21022969,21022970,21022971,21022972,21022973,21022974,21022975,21022976,21022977,21022978,21022979,21022980,21022981,21022982,21022983,21022984,21022985,21022986,21022987,21022988,21022989,21022990,21022991,21022992,21022993,21022994,21022995,21022996,21022997,21022998,21022999,21023000,21023001,21023002,21023003,21023004,21023005,21023006,21023007,21023008,21023009,21023010,21023011,21023012,21023013,21023014,21023015,21023016,21023017,21023018,21023019,21023020,21023021,21023022,21023023,21023024,21023025,21023026,21023027,21023028,21023029,21023030,21023031,21023032,21023033,21023034,21023035,21023036,21023037,21023038,21023039,21023040,21023041,21023042,21023043,21023044,21023045,21023046,21023047,21023048,21023049,21023050,21023051,21023052,21023053,21023054,21023055,21023056,21023057,21023058,21023059,21023060,21023061,21023062,21023063,21023064,21023065,21023066,21023067,21023068,21023069,21023070,21023071,21023072,21023073,21023074,21023075,21023076,21023077,21023078,21023079,21023080,21023081,21023082,21023083,21023084,21023085,21023086,21023087,21023088,21023089,21023090,21023091,21023092,21023093,21023094,21023095,21023096,21023097,21023098,21023099,21023100,21023101,21023102,21023103,21023104,21023105,21023106,21023107,21023108,21023109,21023110,21023111,21023112,21023113,21023114,21023115,21023116,21023117,21023118,21023119,21023120,21023121,21023122,21023123,21023124,21023125,21023126,21023127,21023128,21023129,21023130,21023131,21023132,21023133,21023134,21023135,21023136,21023137,21023138,21023139,21023140,21023141,21023142,21023143,21023144,21023145,21023146,21023147,21023148,21023149,21023150,21023151,21023152,21023153,21023154,21023155,21023156,21023157,21023158,21023159,21023160,21023161,21023162,21023163,21023164,21023165,21023166,21023167,21023168,21023169,21023170,21023171,21023172,21023173,21023174,21023175,21023176,21023177,21023178,21023179,21023180,21023181,21023182,21023183,21023184,21023185,21023186,21023187,21023188,21023189,21023190,21023191,21023192,21023193,21023194,21023195,21023196,21023197,21023198,21023199,21023200,21023201,21023202,21023203,21023204,21023205,21023206,21023207,21023208,21023209,21023210,21023211,21023212,21023213,21023214,21023215,21023216,21023217,21023218,21023219,21023220,21023221,21023222,21023223,21023224,21023225,21023226,21023227,21023228,21023229,21023230,21023231,21023232,21023233,21023234,21023235,21023236,21023237,21023238,21023239,21023240,21023241,21023242,21023243,21023244,21023245,21023246,21023247,21023248,21023249,21023250,21023251,21023252,21023253,21023254,21023255,21023256,21023257,21023258,21023259,21023260,21023261,21023262,21023263,21023264,21023265,21023266,21023267,21023268,21023269,21023270,21023271,21023272,21023273,21023274,21023275,21023276,21023277,21023278,21023279,21023280,21023281,21023282,21023283,21023284,21023285,21023286,21023287,21023288,21023289,21023290,21023291,21023292,21023293,21023294,21023295,21023296,21023297,21023298,21023299,21023300,21023301,21023302,21023303,21023304,21023305,21023306,21023307,21023308,21023309,21023310,21023311,21023312,21023313,21023314,21023315,21023316,21023317,21023318,21023319,21023320,21023321,21023322,21023323,21023324,21023325,21023326,21023327,21023328,21023329,21023330,21023331,21023332,21023333,21023334,21023335,21023336,21023337,21023338,21023339,21023340,21023341,21023342,21023343,21023344,21023345,21023346,21023347,21023348,21023349,21023350,21023351,21023352,21023353,21023354,21023355,21023356,21023357,21023358,21023359,21023360,21023361,21023362,21023363,21023364,21023365,21023366,21023367,21023368,21023369,21023370,21023371,21023372,21023373,21023374,21023375,21023376,21023377,21023378,21023379,21023380,21023381,21023382,21023383,21023384,21023385,21023386,21023387,21023388,21023389,21023390,21023391,21023392,21023393,21023394,21023395,21023396,21023397,21023398,21023399,21023400,21023401,21023402,21023403,21023404,21023405,21023406,21023407,21023408,21023409,21023410,21023411,21023412,21023413,21023414,21023415,21023416,21023417,21023418,21023419,21023420,21023421,21023422,21023423,21023424,21023425,21023426,21023427,21023428,21023429,21023430,21023431,21023432,21023433,21023434,21023435,21023436,21023437,21023438,21023439,21023440,21023441,21023442,21023443,21023444,21023445,21023446,21023447,21023448,21023449,21023450,21023451,21023452,21023453,21023454,21023455,21023456,21023457,21023458,21023459,21023460,21023461,21023462,21023463,21023464,21023465,21023466,21023467,21023468,21023469,21023470,21023471,21023472,21023473,21023474,21023475,21023476,21023477,21023478,21023479,21023480,21023481,21023482,21023483,21023484,21023485,21023486,21023487,21023488,21023489,21023490,21023491,21023492,21023493,21023494,21023495,21023496,21023497,21023498,21023499,21023500,21023501,21023502,21023503,21023504,21023505,21023506,21023507,21023508,21023509,21023510,21023511,21023512,21023513,21023514,21023515,21023516,21023517,21023518,21023519,21023520,21023521,21023522,21023523,21023524,21023525,21023526,21023527,21023528,21023529,21023530,21023531,21023532,21023533,21023534,21023535,21023536,21023537,21023538,21023539,21023540,21023541,21023542,21023543,21023544,21023545,21023546,21023547,21023548,21023549,21023550,21023551,21023552,21023553,21023554,21023555,21023556,21023557,21023558,21023559,21023560,21023561,21023562,21023563,21023564,21023565,21023566,21023567,21023568,21023569,21023570,21023571,21023572,21023573,21023574,21023575,21023576,21023577,21023578,21023579,21023580,21023581,21023582,21023583,21023584,21023585,21023586,21023587,21023588,21023589,21023590,21023591,21023592,21023593,21023594,21023595,21023596,21023597,21023598,21023599,21023600,21023601,21023602,21023603,21023604,21023605,21023606,21023607,21023608,21023609,21023610,21023611,21023612,21023613,21023614,21023615,21023616,21023617,21023618,21023619,21023620,21023621,21023622,21023623,21023624,21023625,21023626,21023627,21023628,21023629,21023630,21023631,21023632,21023633,21023634,21023635,21023636,21023637,21023638,21023639,21023640,21023641,21023642,21023643,21023644,21023645,21023646,21023647,21023648,21023649,21023650,21023651,21023652,21023653,21023654,21023655,21023656,21023657,21023658,21023659,21023660,21023661,21023662,21023663,21023664,21023665,21023666,21023667,21023668,21023669,21023670,21023671,21023672,21023673,21023674,21023675,21023676,21023677,21023678,21023679,21023680,21023681,21023682,21023683,21023684,21023685,21023686,21023687,21023688,21023689,21023690,21023691,21023692,21023693,21023694,21023695,21023696,21023697,21023698,21023699,21023700,21023701,21023702,21023703,21023704,21023705,21023706,21023707,21023708,21023709,21023710,21023711,21023712,21023713,21023714,21023715,21023716,21023717,21023718,21023719,21023720,21023721,21023722,21023723,21023724,21023725,21023726,21023727,21023728,21023729,21023730,21023731,21023732,21023733,21023734,21023735,21023736,21023737,21023738,21023739,21023740,21023741,21023742,21023743,21024256,21024257,21024258,21024259,21024260,21024261,21024262,21024263,21024264,21024265,21024266,21024267,21024268,21024269,21024270,21024271,21024272,21024273,21024274,21024275,21024276,21024277,21024278,21024279,21024280,21024281,21024282,21024283,21024284,21024285,21024286,21024287,21024288,21024289,21024290,21024291,21024292,21024293,21024294,21024295,21024296,21024297,21024298,21024299,21024300,21024301,21024302,21024303,21024304,21024305,21024306,21024307,21024308,21024309,21024310,21024311,21024312,21024313,21024314,21024315,21024316,21024317,21024318,21024319,21024320,21024321,21024322,21024323,21024324,21024325,21024326,21024327,21024328,21024329,21024330,21024331,21024332,21024333,21024334,21024335,21024336,21024337,21024338,21024339,21024340,21024341,21024342,21024343,21024344,21024345,21024346,21024347,21024348,21024349,21024350,21024351,21024352,21024353,21024354,21024355,21024356,21024357,21024358,21024359,21024360,21024361,21024362,21024363,21024364,21024365,21024366,21024367,21024368,21024369,21024370,21024371,21024372,21024373,21024374,21024375,21024376,21024377,21024378,21024379,21024380,21024381,21024382,21024383,21024384,21024385,21024386,21024387,21024388,21024389,21024390,21024391,21024392,21024393,21024394,21024395,21024396,21024397,21024398,21024399,21024400,21024401,21024402,21024403,21024404,21024405,21024406,21024407,21024408,21024409,21024410,21024411,21024412,21024413,21024414,21024415,21024416,21024417,21024418,21024419,21024420,21024421,21024422,21024423,21024424,21024425,21024426,21024427,21024428,21024429,21024430,21024431,21024432,21024433,21024434,21024435,21024436,21024437,21024438,21024439,21024440,21024441,21024442,21024443,21024444,21024445,21024446,21024447,21024448,21024449,21024450,21024451,21024452,21024453,21024454,21024455,21024456,21024457,21024458,21024459,21024460,21024461,21024462,21024463,21024464,21024465,21024466,21024467,21024468,21024469,21024470,21024471,21024472,21024473,21024474,21024475,21024476,21024477,21024478,21024479,21024480,21024481,21024482,21024483,21024484,21024485,21024486,21024487,21024488,21024489,21024490,21024491,21024492,21024493,21024494,21024495,21024496,21024497,21024498,21024499,21024500,21024501,21024502,21024503,21024504,21024505,21024506,21024507,21024508,21024509,21024510,21024511,21024640,21024641,21024642,21024643,21024644,21024645,21024646,21024647,21024648,21024649,21024650,21024651,21024652,21024653,21024654,21024655,21024664,21024665,21024666,21024667,21024668,21024669,21024670,21024671],"Fermium":[20821256],"Fern":[21026077],"Fire Block":[21027184,21027185,21027186,21027187,21027188,21027189,21027190,21027191,21027192,21027193,21027194,21027195,21027196,21027197,21027198,21027199],"Flerovium":[20823370],"Fletching Table":[21030063],"Flower Pot":[21031217],"Flowering Azalea Leaves":[21888168,21888169,21888170,21888171],"Fluorine":[20824372],"Francium":[20827305],"Froglight":[21872001,21872002,21872003,21872005,21872006,21872007,21872009,21872010,21872011],"Frosted Ice":[21034052,21034053,21034054,21034055],"Furnace":[21036512,21036513,21036514,21036515,21036516,21036517,21036518,21036519],"Gadolinium":[20828273],"Gallium":[20832169],"Germanium":[20833509],"Gilded Blackstone":[21820646],"Glass":[21038329],"Glass Pane":[21040585],"Glazed Terracotta":[21585152,21585153,21585154,21585155,21585156,21585157,21585158,21585159,21585160,21585161,21585162,21585163,21585164,21585165,21585166,21585167,21585168,21585169,21585170,21585171,21585172,21585173,21585174,21585175,21585176,21585177,21585178,21585179,21585180,21585181,21585182,21585183,21585184,21585185,21585186,21585187,21585188,21585189,21585190,21585191,21585192,21585193,21585194,21585195,21585196,21585197,21585198,21585199,21585200,21585201,21585202,21585203,21585204,21585205,21585206,21585207,21585208,21585209,21585210,21585211,21585212,21585213,21585214,21585215],"Glow Item Frame":[21881552,21881553,21881556,21881557,21881558,21881559,21881560,21881561,21881564,21881565,21881566,21881567],"Glow Lichen":[21893760,21893761,21893762,21893763,21893764,21893765,21893766,21893767,21893768,21893769,21893770,21893771,21893772,21893773,21893774,21893775,21893776,21893777,21893778,21893779,21893780,21893781,21893782,21893783,21893784,21893785,21893786,21893787,21893788,21893789,21893790,21893791,21893792,21893793,21893794,21893795,21893796,21893797,21893798,21893799,21893800,21893801,21893802,21893803,21893804,21893805,21893806,21893807,21893808,21893809,21893810,21893811,21893812,21893813,21893814,21893815,21893816,21893817,21893818,21893819,21893820,21893821,21893822,21893823],"Glowing Obsidian":[21043028],"Glowstone":[21043624],"Gold":[20835704],"Gold Block":[21046696],"Gold Ore":[21049010],"Granite":[21049750],"Granite Slab":[21053256,21053257,21053258],"Granite Stairs":[21054536,21054537,21054538,21054539,21054540,21054541,21054542,21054543],"Granite Wall":[21055488,21055489,21055490,21055491,21055492,21055493,21055494,21055495,21055496,21055497,21055498,21055499,21055500,21055501,21055502,21055503,21055504,21055505,21055506,21055507,21055508,21055509,21055510,21055511,21055512,21055513,21055514,21055515,21055516,21055517,21055518,21055519,21055520,21055521,21055522,21055523,21055524,21055525,21055526,21055527,21055528,21055529,21055530,21055531,21055532,21055533,21055534,21055535,21055536,21055537,21055538,21055539,21055540,21055541,21055542,21055543,21055544,21055545,21055546,21055547,21055548,21055549,21055550,21055551,21055584,21055585,21055586,21055587,21055588,21055589,21055590,21055591,21055592,21055593,21055594,21055595,21055596,21055597,21055598,21055599,21055615,21055616,21055617,21055618,21055619,21055620,21055621,21055622,21055623,21055624,21055625,21055626,21055627,21055628,21055629,21055630,21055631,21055632,21055633,21055634,21055635,21055636,21055637,21055638,21055639,21055640,21055641,21055642,21055643,21055644,21055645,21055646,21055647,21055648,21055649,21055650,21055651,21055652,21055653,21055654,21055655,21055656,21055657,21055658,21055659,21055660,21055661,21055662,21055663,21055664,21055665,21055666,21055667,21055668,21055669,21055670,21055671,21055672,21055673,21055674,21055675,21055676,21055677,21055678,21055679,21055712,21055713,21055714,21055715,21055716,21055717,21055718,21055719,21055720,21055721,21055722,21055723,21055724,21055725,21055726,21055727,21055743],"Grass":[21058118],"Grass Path":[21061327],"Gravel":[21062456],"Green Torch":[21068985,21068986,21068987,21068988,21068989],"Hafnium":[20837560],"Hanging Roots":[21842426],"Hardened Clay":[21071190],"Hardened Glass":[21072075],"Hardened Glass Pane":[21075766],"Hassium":[20839994],"Hay Bale":[21077748,21077749,21077750],"Heat Block":[20625734],"Helium":[20840704],"Holmium":[20842739],"Honeycomb Block":[21782395],"Hopper":[21079520,21079521,21079525,21079526,21079527,21079528,21079529,21079533,21079534,21079535],"Hydrogen":[20844910],"Ice":[21080304],"Indium":[20848311],"Infested Chiseled Stone Brick":[21083943],"Infested Cobblestone":[21085393],"Infested Cracked Stone Brick":[21087627],"Infested Mossy Stone Brick":[21088835],"Infested Stone":[21091396],"Infested Stone Brick":[21092358],"Invisible Bedrock":[21100447],"Iodine":[20850310],"Iridium":[20851638],"Iron":[20854572],"Iron Bars":[21104146],"Iron Block":[21101750],"Iron Door":[21105792,21105793,21105794,21105795,21105796,21105797,21105798,21105799,21105800,21105801,21105802,21105803,21105804,21105805,21105806,21105807,21105808,21105809,21105810,21105811,21105812,21105813,21105814,21105815,21105816,21105817,21105818,21105819,21105820,21105821,21105822,21105823],"Iron Ore":[21107313],"Iron Trapdoor":[21109264,21109265,21109266,21109267,21109268,21109269,21109270,21109271,21109272,21109273,21109274,21109275,21109276,21109277,21109278,21109279],"Item Frame":[21111952,21111953,21111954,21111955,21111956,21111957,21111960,21111961,21111962,21111963,21111964,21111965],"Jack o'Lantern":[21179952,21179953,21179954,21179955],"Jukebox":[21113057],"Jungle Button":[21115488,21115489,21115490,21115491,21115492,21115493,21115496,21115497,21115498,21115499,21115500,21115501],"Jungle Door":[21117568,21117569,21117570,21117571,21117572,21117573,21117574,21117575,21117576,21117577,21117578,21117579,21117580,21117581,21117582,21117583,21117584,21117585,21117586,21117587,21117588,21117589,21117590,21117591,21117592,21117593,21117594,21117595,21117596,21117597,21117598,21117599],"Jungle Fence":[21119582],"Jungle Fence Gate":[21122144,21122145,21122146,21122147,21122148,21122149,21122150,21122151,21122152,21122153,21122154,21122155,21122156,21122157,21122158,21122159],"Jungle Leaves":[21124916,21124917,21124918,21124919],"Jungle Log":[21126656,21126657,21126658,21126659,21126662,21126663],"Jungle Planks":[21127877],"Jungle Pressure Plate":[21130628,21130629],"Jungle Sapling":[21132062,21132063],"Jungle Sign":[21134400,21134401,21134402,21134403,21134404,21134405,21134406,21134407,21134408,21134409,21134410,21134411,21134412,21134413,21134414,21134415],"Jungle Slab":[21135720,21135721,21135722],"Jungle Stairs":[21137656,21137657,21137658,21137659,21137660,21137661,21137662,21137663],"Jungle Trapdoor":[21139728,21139729,21139730,21139731,21139732,21139733,21139734,21139735,21139736,21139737,21139738,21139739,21139740,21139741,21139742,21139743],"Jungle Wall Sign":[21143348,21143349,21143350,21143351],"Jungle Wood":[21145480,21145481,21145484,21145485,21145486,21145487],"Krypton":[20856167],"Lab Table":[21146608,21146609,21146610,21146611],"Ladder":[21148984,21148985,21148986,21148987],"Lantern":[21149740,21149741],"Lanthanum":[20858521],"Lapis Lazuli Block":[21152040],"Lapis Lazuli Ore":[21154437],"Large Fern":[21156644,21156645],"Lava":[21159648,21159649,21159650,21159651,21159652,21159653,21159654,21159655,21159656,21159657,21159658,21159659,21159660,21159661,21159662,21159663,21159664,21159665,21159666,21159667,21159668,21159669,21159670,21159671,21159672,21159673,21159674,21159675,21159676,21159677,21159678,21159679],"Lava Cauldron":[21857912,21857913,21857914,21857915,21857916,21857917],"Lawrencium":[20860323],"Lead":[20861284],"Lectern":[21160360,21160361,21160362,21160363,21160364,21160365,21160366,21160367],"Legacy Stonecutter":[21162264],"Lever":[21165776,21165777,21165778,21165779,21165780,21165781,21165782,21165783,21165784,21165785,21165786,21165787,21165788,21165789,21165790,21165791],"Light Block":[21629408,21629409,21629410,21629411,21629412,21629413,21629414,21629415,21629416,21629417,21629418,21629419,21629420,21629421,21629422,21629423],"Lightning Rod":[21821570,21821571,21821572,21821573,21821574,21821575],"Lilac":[21171834,21171835],"Lily Pad":[21174431],"Lily of the Valley":[21173216],"Lithium":[20863911],"Livermorium":[20865878],"Loom":[21182044,21182045,21182046,21182047],"Lutetium":[20867537],"Magma Block":[21186488],"Magnesium":[20869155],"Manganese":[20872294],"Mangrove Button":[21735552,21735553,21735554,21735555,21735558,21735559,21735560,21735561,21735562,21735563,21735566,21735567],"Mangrove Door":[21749248,21749249,21749250,21749251,21749252,21749253,21749254,21749255,21749256,21749257,21749258,21749259,21749260,21749261,21749262,21749263,21749264,21749265,21749266,21749267,21749268,21749269,21749270,21749271,21749272,21749273,21749274,21749275,21749276,21749277,21749278,21749279],"Mangrove Fence":[21706659],"Mangrove Fence Gate":[21755424,21755425,21755426,21755427,21755428,21755429,21755430,21755431,21755432,21755433,21755434,21755435,21755436,21755437,21755438,21755439],"Mangrove Leaves":[21884612,21884613,21884614,21884615],"Mangrove Log":[21717272,21717273,21717274,21717275,21717278,21717279],"Mangrove Planks":[21700363],"Mangrove Pressure Plate":[21742138,21742139],"Mangrove Roots":[21868046],"Mangrove Sign":[21766688,21766689,21766690,21766691,21766692,21766693,21766694,21766695,21766696,21766697,21766698,21766699,21766700,21766701,21766702,21766703],"Mangrove Slab":[21711233,21711234,21711235],"Mangrove Stairs":[21760624,21760625,21760626,21760627,21760628,21760629,21760630,21760631],"Mangrove Trapdoor":[21729584,21729585,21729586,21729587,21729588,21729589,21729590,21729591,21729592,21729593,21729594,21729595,21729596,21729597,21729598,21729599],"Mangrove Wall Sign":[21774240,21774241,21774242,21774243],"Mangrove Wood":[21723914,21723915,21723916,21723917,21723918,21723919],"Material Reducer":[21187744,21187745,21187746,21187747],"Meitnerium":[20874589],"Melon Block":[21189795],"Melon Stem":[21190912,21190913,21190914,21190915,21190916,21190917,21190918,21190919,21190920,21190921,21190922,21190923,21190924,21190925,21190926,21190927,21190944,21190945,21190946,21190947,21190948,21190949,21190950,21190951,21190960,21190961,21190962,21190963,21190964,21190965,21190966,21190967,21190968,21190969,21190970,21190971,21190972,21190973,21190974,21190975],"Mendelevium":[20876625],"Mercury":[20877937],"Mob Head":[21193344,21193345,21193346,21193347,21193349,21193350,21193351,21193352,21193353,21193354,21193355,21193357,21193358,21193359,21193376,21193377,21193378,21193379,21193381,21193382,21193383,21193392,21193393,21193394,21193395,21193397,21193398,21193399,21193400,21193401,21193402,21193403,21193405,21193406,21193407],"Molybdenum":[20879537],"Monster Spawner":[21195322],"Moscovium":[20883402],"Mossy Cobblestone":[21197453],"Mossy Cobblestone Slab":[21200052,21200054,21200055],"Mossy Cobblestone Stairs":[21202568,21202569,21202570,21202571,21202572,21202573,21202574,21202575],"Mossy Cobblestone Wall":[21204224,21204225,21204226,21204227,21204228,21204229,21204230,21204231,21204232,21204233,21204234,21204235,21204236,21204237,21204238,21204239,21204240,21204241,21204242,21204243,21204244,21204245,21204246,21204247,21204248,21204249,21204250,21204251,21204252,21204253,21204254,21204255,21204256,21204257,21204258,21204259,21204260,21204261,21204262,21204263,21204264,21204265,21204266,21204267,21204268,21204269,21204270,21204271,21204272,21204273,21204274,21204275,21204276,21204277,21204278,21204279,21204280,21204281,21204282,21204283,21204284,21204285,21204286,21204287,21204288,21204289,21204290,21204291,21204292,21204293,21204294,21204295,21204296,21204297,21204298,21204299,21204300,21204301,21204302,21204303,21204306,21204352,21204353,21204354,21204355,21204356,21204357,21204358,21204359,21204360,21204361,21204362,21204363,21204364,21204365,21204366,21204367,21204368,21204369,21204370,21204371,21204372,21204373,21204374,21204375,21204376,21204377,21204378,21204379,21204380,21204381,21204382,21204383,21204384,21204385,21204386,21204387,21204388,21204389,21204390,21204391,21204392,21204393,21204394,21204395,21204396,21204397,21204398,21204399,21204400,21204401,21204402,21204403,21204404,21204405,21204406,21204407,21204408,21204409,21204410,21204411,21204412,21204413,21204414,21204415,21204416,21204417,21204418,21204419,21204420,21204421,21204422,21204423,21204424,21204425,21204426,21204427,21204428,21204429,21204430,21204431,21204434],"Mossy Stone Brick Slab":[21205992,21205993,21205995],"Mossy Stone Brick Stairs":[21207584,21207585,21207586,21207587,21207588,21207589,21207590,21207591],"Mossy Stone Brick Wall":[21210147,21210160,21210161,21210162,21210163,21210164,21210165,21210166,21210167,21210168,21210169,21210170,21210171,21210172,21210173,21210174,21210175,21210176,21210177,21210178,21210179,21210180,21210181,21210182,21210183,21210184,21210185,21210186,21210187,21210188,21210189,21210190,21210191,21210192,21210193,21210194,21210195,21210196,21210197,21210198,21210199,21210200,21210201,21210202,21210203,21210204,21210205,21210206,21210207,21210208,21210209,21210210,21210211,21210212,21210213,21210214,21210215,21210216,21210217,21210218,21210219,21210220,21210221,21210222,21210223,21210224,21210225,21210226,21210227,21210228,21210229,21210230,21210231,21210232,21210233,21210234,21210235,21210236,21210237,21210238,21210239,21210275,21210288,21210289,21210290,21210291,21210292,21210293,21210294,21210295,21210296,21210297,21210298,21210299,21210300,21210301,21210302,21210303,21210304,21210305,21210306,21210307,21210308,21210309,21210310,21210311,21210312,21210313,21210314,21210315,21210316,21210317,21210318,21210319,21210320,21210321,21210322,21210323,21210324,21210325,21210326,21210327,21210328,21210329,21210330,21210331,21210332,21210333,21210334,21210335,21210336,21210337,21210338,21210339,21210340,21210341,21210342,21210343,21210344,21210345,21210346,21210347,21210348,21210349,21210350,21210351,21210352,21210353,21210354,21210355,21210356,21210357,21210358,21210359,21210360,21210361,21210362,21210363,21210364,21210365,21210366,21210367],"Mossy Stone Bricks":[21212641],"Mud":[21804596],"Mud Brick Slab":[21807848,21807850,21807851],"Mud Brick Stairs":[21810184,21810185,21810186,21810187,21810188,21810189,21810190,21810191],"Mud Brick Wall":[21812238,21812240,21812241,21812242,21812243,21812244,21812245,21812246,21812247,21812248,21812249,21812250,21812251,21812252,21812253,21812254,21812255,21812288,21812289,21812290,21812291,21812292,21812293,21812294,21812295,21812296,21812297,21812298,21812299,21812300,21812301,21812302,21812303,21812304,21812305,21812306,21812307,21812308,21812309,21812310,21812311,21812312,21812313,21812314,21812315,21812316,21812317,21812318,21812319,21812320,21812321,21812322,21812323,21812324,21812325,21812326,21812327,21812328,21812329,21812330,21812331,21812332,21812333,21812334,21812335,21812336,21812337,21812338,21812339,21812340,21812341,21812342,21812343,21812344,21812345,21812346,21812347,21812348,21812349,21812350,21812351,21812366,21812368,21812369,21812370,21812371,21812372,21812373,21812374,21812375,21812376,21812377,21812378,21812379,21812380,21812381,21812382,21812383,21812416,21812417,21812418,21812419,21812420,21812421,21812422,21812423,21812424,21812425,21812426,21812427,21812428,21812429,21812430,21812431,21812432,21812433,21812434,21812435,21812436,21812437,21812438,21812439,21812440,21812441,21812442,21812443,21812444,21812445,21812446,21812447,21812448,21812449,21812450,21812451,21812452,21812453,21812454,21812455,21812456,21812457,21812458,21812459,21812460,21812461,21812462,21812463,21812464,21812465,21812466,21812467,21812468,21812469,21812470,21812471,21812472,21812473,21812474,21812475,21812476,21812477,21812478,21812479],"Mud Bricks":[21805580],"Muddy Mangrove Roots":[21870173,21870174,21870175],"Mushroom Stem":[21214847],"Mycelium":[21215507],"Neodymium":[20883794],"Neon":[20887178],"Neptunium":[20888366],"Nether Brick Fence":[21219143],"Nether Brick Slab":[21219584,21219585,21219587],"Nether Brick Stairs":[21222456,21222457,21222458,21222459,21222460,21222461,21222462,21222463],"Nether Brick Wall":[21223712,21223713,21223714,21223715,21223716,21223717,21223718,21223719,21223720,21223721,21223722,21223723,21223724,21223725,21223726,21223727,21223728,21223744,21223745,21223746,21223747,21223748,21223749,21223750,21223751,21223752,21223753,21223754,21223755,21223756,21223757,21223758,21223759,21223760,21223761,21223762,21223763,21223764,21223765,21223766,21223767,21223768,21223769,21223770,21223771,21223772,21223773,21223774,21223775,21223776,21223777,21223778,21223779,21223780,21223781,21223782,21223783,21223784,21223785,21223786,21223787,21223788,21223789,21223790,21223791,21223792,21223793,21223794,21223795,21223796,21223797,21223798,21223799,21223800,21223801,21223802,21223803,21223804,21223805,21223806,21223807,21223840,21223841,21223842,21223843,21223844,21223845,21223846,21223847,21223848,21223849,21223850,21223851,21223852,21223853,21223854,21223855,21223856,21223872,21223873,21223874,21223875,21223876,21223877,21223878,21223879,21223880,21223881,21223882,21223883,21223884,21223885,21223886,21223887,21223888,21223889,21223890,21223891,21223892,21223893,21223894,21223895,21223896,21223897,21223898,21223899,21223900,21223901,21223902,21223903,21223904,21223905,21223906,21223907,21223908,21223909,21223910,21223911,21223912,21223913,21223914,21223915,21223916,21223917,21223918,21223919,21223920,21223921,21223922,21223923,21223924,21223925,21223926,21223927,21223928,21223929,21223930,21223931,21223932,21223933,21223934,21223935],"Nether Bricks":[21225672],"Nether Gold Ore":[21801107],"Nether Portal":[21229304,21229305],"Nether Quartz Ore":[21230807],"Nether Reactor Core":[21233112],"Nether Wart":[21235588,21235589,21235590,21235591],"Nether Wart Block":[21237079],"Netherite Block":[21848862],"Netherrack":[21239734],"Nickel":[20891060],"Nihonium":[20892811],"Niobium":[20895630],"Nitrogen":[20897160],"Nobelium":[20898460],"Note Block":[21241302],"Oak Button":[21243152,21243153,21243156,21243157,21243158,21243159,21243160,21243161,21243164,21243165,21243166,21243167],"Oak Door":[21245696,21245697,21245698,21245699,21245700,21245701,21245702,21245703,21245704,21245705,21245706,21245707,21245708,21245709,21245710,21245711,21245712,21245713,21245714,21245715,21245716,21245717,21245718,21245719,21245720,21245721,21245722,21245723,21245724,21245725,21245726,21245727],"Oak Fence":[21247506],"Oak Fence Gate":[21248560,21248561,21248562,21248563,21248564,21248565,21248566,21248567,21248568,21248569,21248570,21248571,21248572,21248573,21248574,21248575],"Oak Leaves":[21250248,21250249,21250250,21250251],"Oak Log":[21253352,21253353,21253356,21253357,21253358,21253359],"Oak Planks":[21255504],"Oak Pressure Plate":[21257680,21257681],"Oak Sapling":[21258462,21258463],"Oak Sign":[21262208,21262209,21262210,21262211,21262212,21262213,21262214,21262215,21262216,21262217,21262218,21262219,21262220,21262221,21262222,21262223],"Oak Slab":[21264373,21264374,21264375],"Oak Stairs":[21264984,21264985,21264986,21264987,21264988,21264989,21264990,21264991],"Oak Trapdoor":[21267760,21267761,21267762,21267763,21267764,21267765,21267766,21267767,21267768,21267769,21267770,21267771,21267772,21267773,21267774,21267775],"Oak Wall Sign":[21270344,21270345,21270346,21270347],"Oak Wood":[21272410,21272411,21272412,21272413,21272414,21272415],"Obsidian":[21273247],"Oganesson":[20901372],"Orange Tulip":[21278363],"Osmium":[20902298],"Oxeye Daisy":[21280579],"Oxygen":[20904205],"Packed Ice":[21282488],"Packed Mud":[21814973],"Palladium":[20907027],"Peony":[21283348,21283349],"Phosphorus":[20908773],"Pink Petals":[21933456,21933457,21933458,21933459,21933460,21933461,21933462,21933463,21933464,21933465,21933466,21933467,21933468,21933469,21933470,21933471],"Pink Tulip":[21286997],"Pitcher Crop":[21947997,21947998,21947999],"Pitcher Plant":[21945642,21945643],"Platinum":[20911235],"Plutonium":[20912900],"Podzol":[21290197],"Polished Andesite":[21292531],"Polished Andesite Slab":[21294924,21294925,21294927],"Polished Andesite Stairs":[21295920,21295921,21295922,21295923,21295924,21295925,21295926,21295927],"Polished Basalt":[21592160,21592162,21592163],"Polished Blackstone":[21605632],"Polished Blackstone Brick Slab":[21622088,21622089,21622090],"Polished Blackstone Brick Stairs":[21622992,21622993,21622994,21622995,21622996,21622997,21622998,21622999],"Polished Blackstone Brick Wall":[21624832,21624833,21624834,21624835,21624836,21624837,21624838,21624839,21624840,21624841,21624842,21624843,21624844,21624845,21624846,21624847,21624848,21624849,21624850,21624851,21624852,21624853,21624854,21624855,21624856,21624857,21624858,21624859,21624860,21624861,21624862,21624863,21624864,21624865,21624866,21624867,21624868,21624869,21624870,21624871,21624872,21624873,21624874,21624875,21624876,21624877,21624878,21624879,21624880,21624881,21624882,21624883,21624884,21624885,21624886,21624887,21624888,21624889,21624890,21624891,21624892,21624893,21624894,21624895,21624896,21624912,21624913,21624914,21624915,21624916,21624917,21624918,21624919,21624920,21624921,21624922,21624923,21624924,21624925,21624926,21624927,21624960,21624961,21624962,21624963,21624964,21624965,21624966,21624967,21624968,21624969,21624970,21624971,21624972,21624973,21624974,21624975,21624976,21624977,21624978,21624979,21624980,21624981,21624982,21624983,21624984,21624985,21624986,21624987,21624988,21624989,21624990,21624991,21624992,21624993,21624994,21624995,21624996,21624997,21624998,21624999,21625000,21625001,21625002,21625003,21625004,21625005,21625006,21625007,21625008,21625009,21625010,21625011,21625012,21625013,21625014,21625015,21625016,21625017,21625018,21625019,21625020,21625021,21625022,21625023,21625024,21625040,21625041,21625042,21625043,21625044,21625045,21625046,21625047,21625048,21625049,21625050,21625051,21625052,21625053,21625054,21625055],"Polished Blackstone Bricks":[21619830],"Polished Blackstone Button":[21607152,21607153,21607154,21607155,21607156,21607157,21607160,21607161,21607162,21607163,21607164,21607165],"Polished Blackstone Pressure Plate":[21609892,21609893],"Polished Blackstone Slab":[21611892,21611893,21611894],"Polished Blackstone Stairs":[21614000,21614001,21614002,21614003,21614004,21614005,21614006,21614007],"Polished Blackstone Wall":[21614848,21614849,21614850,21614851,21614852,21614853,21614854,21614855,21614856,21614857,21614858,21614859,21614860,21614861,21614862,21614863,21614864,21614865,21614866,21614867,21614868,21614869,21614870,21614871,21614872,21614873,21614874,21614875,21614876,21614877,21614878,21614879,21614880,21614881,21614882,21614883,21614884,21614885,21614886,21614887,21614888,21614889,21614890,21614891,21614892,21614893,21614894,21614895,21614896,21614897,21614898,21614899,21614900,21614901,21614902,21614903,21614904,21614905,21614906,21614907,21614908,21614909,21614910,21614911,21614917,21614928,21614929,21614930,21614931,21614932,21614933,21614934,21614935,21614936,21614937,21614938,21614939,21614940,21614941,21614942,21614943,21614976,21614977,21614978,21614979,21614980,21614981,21614982,21614983,21614984,21614985,21614986,21614987,21614988,21614989,21614990,21614991,21614992,21614993,21614994,21614995,21614996,21614997,21614998,21614999,21615000,21615001,21615002,21615003,21615004,21615005,21615006,21615007,21615008,21615009,21615010,21615011,21615012,21615013,21615014,21615015,21615016,21615017,21615018,21615019,21615020,21615021,21615022,21615023,21615024,21615025,21615026,21615027,21615028,21615029,21615030,21615031,21615032,21615033,21615034,21615035,21615036,21615037,21615038,21615039,21615045,21615056,21615057,21615058,21615059,21615060,21615061,21615062,21615063,21615064,21615065,21615066,21615067,21615068,21615069,21615070,21615071],"Polished Deepslate":[21670363],"Polished Deepslate Slab":[21672268,21672270,21672271],"Polished Deepslate Stairs":[21674288,21674289,21674290,21674291,21674292,21674293,21674294,21674295],"Polished Deepslate Wall":[21676076,21676080,21676081,21676082,21676083,21676084,21676085,21676086,21676087,21676088,21676089,21676090,21676091,21676092,21676093,21676094,21676095,21676096,21676097,21676098,21676099,21676100,21676101,21676102,21676103,21676104,21676105,21676106,21676107,21676108,21676109,21676110,21676111,21676112,21676113,21676114,21676115,21676116,21676117,21676118,21676119,21676120,21676121,21676122,21676123,21676124,21676125,21676126,21676127,21676128,21676129,21676130,21676131,21676132,21676133,21676134,21676135,21676136,21676137,21676138,21676139,21676140,21676141,21676142,21676143,21676144,21676145,21676146,21676147,21676148,21676149,21676150,21676151,21676152,21676153,21676154,21676155,21676156,21676157,21676158,21676159,21676204,21676208,21676209,21676210,21676211,21676212,21676213,21676214,21676215,21676216,21676217,21676218,21676219,21676220,21676221,21676222,21676223,21676224,21676225,21676226,21676227,21676228,21676229,21676230,21676231,21676232,21676233,21676234,21676235,21676236,21676237,21676238,21676239,21676240,21676241,21676242,21676243,21676244,21676245,21676246,21676247,21676248,21676249,21676250,21676251,21676252,21676253,21676254,21676255,21676256,21676257,21676258,21676259,21676260,21676261,21676262,21676263,21676264,21676265,21676266,21676267,21676268,21676269,21676270,21676271,21676272,21676273,21676274,21676275,21676276,21676277,21676278,21676279,21676280,21676281,21676282,21676283,21676284,21676285,21676286,21676287],"Polished Diorite":[21298589],"Polished Diorite Slab":[21299568,21299570,21299571],"Polished Diorite Stairs":[21301328,21301329,21301330,21301331,21301332,21301333,21301334,21301335],"Polished Granite":[21304978],"Polished Granite Slab":[21307024,21307025,21307027],"Polished Granite Stairs":[21307536,21307537,21307538,21307539,21307540,21307541,21307542,21307543],"Polonium":[20915922],"Poppy":[21310628],"Potassium":[20916939],"Potato Block":[21312968,21312969,21312970,21312971,21312972,21312973,21312974,21312975],"Potion Cauldron":[21859216,21859217,21859218,21859219,21859220,21859221],"Powered Rail":[21313936,21313937,21313938,21313939,21313942,21313943,21313944,21313945,21313946,21313947,21313950,21313951],"Praseodymium":[20918290],"Prismarine":[21317514],"Prismarine Bricks":[21318880],"Prismarine Bricks Slab":[21319764,21319766,21319767],"Prismarine Bricks Stairs":[21322480,21322481,21322482,21322483,21322484,21322485,21322486,21322487],"Prismarine Slab":[21324568,21324569,21324571],"Prismarine Stairs":[21327832,21327833,21327834,21327835,21327836,21327837,21327838,21327839],"Prismarine Wall":[21327872,21327873,21327874,21327875,21327876,21327877,21327878,21327879,21327880,21327881,21327882,21327883,21327884,21327885,21327886,21327887,21327888,21327889,21327890,21327891,21327892,21327893,21327894,21327895,21327896,21327897,21327898,21327899,21327900,21327901,21327902,21327903,21327904,21327905,21327906,21327907,21327908,21327909,21327910,21327911,21327912,21327913,21327914,21327915,21327916,21327917,21327918,21327919,21327920,21327921,21327922,21327923,21327924,21327925,21327926,21327927,21327928,21327929,21327930,21327931,21327932,21327933,21327934,21327935,21327974,21327984,21327985,21327986,21327987,21327988,21327989,21327990,21327991,21327992,21327993,21327994,21327995,21327996,21327997,21327998,21327999,21328000,21328001,21328002,21328003,21328004,21328005,21328006,21328007,21328008,21328009,21328010,21328011,21328012,21328013,21328014,21328015,21328016,21328017,21328018,21328019,21328020,21328021,21328022,21328023,21328024,21328025,21328026,21328027,21328028,21328029,21328030,21328031,21328032,21328033,21328034,21328035,21328036,21328037,21328038,21328039,21328040,21328041,21328042,21328043,21328044,21328045,21328046,21328047,21328048,21328049,21328050,21328051,21328052,21328053,21328054,21328055,21328056,21328057,21328058,21328059,21328060,21328061,21328062,21328063,21328102,21328112,21328113,21328114,21328115,21328116,21328117,21328118,21328119,21328120,21328121,21328122,21328123,21328124,21328125,21328126,21328127],"Promethium":[20920321],"Protactinium":[20923161],"Pumpkin":[21331624],"Pumpkin Stem":[21333968,21333969,21333970,21333971,21333972,21333973,21333974,21333975,21333976,21333977,21333978,21333979,21333980,21333981,21333982,21333983,21333984,21333985,21333986,21333987,21333988,21333989,21333990,21333991,21333992,21333993,21333994,21333995,21333996,21333997,21333998,21333999,21334000,21334001,21334002,21334003,21334004,21334005,21334006,21334007],"Purple Torch":[21337610,21337611,21337612,21337613,21337614],"Purpur Block":[21338315],"Purpur Pillar":[21340545,21340546,21340547],"Purpur Slab":[21344168,21344169,21344170],"Purpur Stairs":[21344432,21344433,21344434,21344435,21344436,21344437,21344438,21344439],"Quartz Block":[21347391],"Quartz Bricks":[21678669],"Quartz Pillar":[21348820,21348821,21348823],"Quartz Slab":[21351776,21351777,21351779],"Quartz Stairs":[21352904,21352905,21352906,21352907,21352908,21352909,21352910,21352911],"Radium":[20925466],"Radon":[20927914],"Rail":[21356230,21356231,21356232,21356233,21356234,21356235,21356236,21356237,21356238,21356239],"Raw Copper Block":[21632127],"Raw Gold Block":[21634601],"Raw Iron Block":[21635367],"Red Mushroom":[21359866],"Red Mushroom Block":[21361105,21361106,21361107,21361112,21361113,21361114,21361115,21361116,21361117,21361118,21361119],"Red Nether Brick Slab":[21363940,21363942,21363943],"Red Nether Brick Stairs":[21365640,21365641,21365642,21365643,21365644,21365645,21365646,21365647],"Red Nether Brick Wall":[21367808,21367809,21367810,21367811,21367812,21367813,21367814,21367815,21367816,21367817,21367818,21367819,21367820,21367821,21367822,21367823,21367824,21367825,21367826,21367827,21367828,21367829,21367830,21367831,21367832,21367833,21367834,21367835,21367836,21367837,21367838,21367839,21367840,21367841,21367842,21367843,21367844,21367845,21367846,21367847,21367848,21367849,21367850,21367851,21367852,21367853,21367854,21367855,21367856,21367857,21367858,21367859,21367860,21367861,21367862,21367863,21367864,21367865,21367866,21367867,21367868,21367869,21367870,21367871,21367872,21367888,21367889,21367890,21367891,21367892,21367893,21367894,21367895,21367896,21367897,21367898,21367899,21367900,21367901,21367902,21367903,21367936,21367937,21367938,21367939,21367940,21367941,21367942,21367943,21367944,21367945,21367946,21367947,21367948,21367949,21367950,21367951,21367952,21367953,21367954,21367955,21367956,21367957,21367958,21367959,21367960,21367961,21367962,21367963,21367964,21367965,21367966,21367967,21367968,21367969,21367970,21367971,21367972,21367973,21367974,21367975,21367976,21367977,21367978,21367979,21367980,21367981,21367982,21367983,21367984,21367985,21367986,21367987,21367988,21367989,21367990,21367991,21367992,21367993,21367994,21367995,21367996,21367997,21367998,21367999,21368000,21368016,21368017,21368018,21368019,21368020,21368021,21368022,21368023,21368024,21368025,21368026,21368027,21368028,21368029,21368030,21368031],"Red Nether Bricks":[21368920],"Red Sand":[21371243],"Red Sandstone":[21373682],"Red Sandstone Slab":[21375308,21375309,21375310],"Red Sandstone Stairs":[21377256,21377257,21377258,21377259,21377260,21377261,21377262,21377263],"Red Sandstone Wall":[21380352,21380353,21380354,21380355,21380356,21380357,21380358,21380359,21380360,21380361,21380362,21380363,21380364,21380365,21380366,21380367,21380383,21380416,21380417,21380418,21380419,21380420,21380421,21380422,21380423,21380424,21380425,21380426,21380427,21380428,21380429,21380430,21380431,21380432,21380433,21380434,21380435,21380436,21380437,21380438,21380439,21380440,21380441,21380442,21380443,21380444,21380445,21380446,21380447,21380448,21380449,21380450,21380451,21380452,21380453,21380454,21380455,21380456,21380457,21380458,21380459,21380460,21380461,21380462,21380463,21380464,21380465,21380466,21380467,21380468,21380469,21380470,21380471,21380472,21380473,21380474,21380475,21380476,21380477,21380478,21380479,21380480,21380481,21380482,21380483,21380484,21380485,21380486,21380487,21380488,21380489,21380490,21380491,21380492,21380493,21380494,21380495,21380511,21380544,21380545,21380546,21380547,21380548,21380549,21380550,21380551,21380552,21380553,21380554,21380555,21380556,21380557,21380558,21380559,21380560,21380561,21380562,21380563,21380564,21380565,21380566,21380567,21380568,21380569,21380570,21380571,21380572,21380573,21380574,21380575,21380576,21380577,21380578,21380579,21380580,21380581,21380582,21380583,21380584,21380585,21380586,21380587,21380588,21380589,21380590,21380591,21380592,21380593,21380594,21380595,21380596,21380597,21380598,21380599,21380600,21380601,21380602,21380603,21380604,21380605,21380606,21380607],"Red Torch":[21381490,21381491,21381492,21381493,21381495],"Red Tulip":[21384139],"Redstone":[21397872,21397873,21397874,21397875,21397876,21397877,21397878,21397879,21397880,21397881,21397882,21397883,21397884,21397885,21397886,21397887],"Redstone Block":[21385654],"Redstone Comparator":[21388928,21388929,21388930,21388931,21388932,21388933,21388934,21388935,21388936,21388937,21388938,21388939,21388940,21388941,21388942,21388943],"Redstone Lamp":[21390644,21390645],"Redstone Ore":[21392016,21392017],"Redstone Repeater":[21394976,21394977,21394978,21394979,21394980,21394981,21394982,21394983,21394984,21394985,21394986,21394987,21394988,21394989,21394990,21394991,21394992,21394993,21394994,21394995,21394996,21394997,21394998,21394999,21395000,21395001,21395002,21395003,21395004,21395005,21395006,21395007],"Redstone Torch":[21396497,21396498,21396499,21396500,21396501,21396505,21396506,21396507,21396508,21396509],"Reinforced Deepslate":[21889612],"Rhenium":[20930190],"Rhodium":[20931608],"Roentgenium":[20934217],"Rose Bush":[21402408,21402409],"Rubidium":[20936670],"Ruthenium":[20937111],"Rutherfordium":[20939938],"Samarium":[20942830],"Sand":[21405599],"Sandstone":[21406854],"Sandstone Slab":[21408357,21408358,21408359],"Sandstone Stairs":[21410360,21410361,21410362,21410363,21410364,21410365,21410366,21410367],"Sandstone Wall":[21413632,21413633,21413634,21413635,21413636,21413637,21413638,21413639,21413640,21413641,21413642,21413643,21413644,21413645,21413646,21413647,21413648,21413649,21413650,21413651,21413652,21413653,21413654,21413655,21413656,21413657,21413658,21413659,21413660,21413661,21413662,21413663,21413664,21413665,21413666,21413667,21413668,21413669,21413670,21413671,21413672,21413673,21413674,21413675,21413676,21413677,21413678,21413679,21413680,21413681,21413682,21413683,21413684,21413685,21413686,21413687,21413688,21413689,21413690,21413691,21413692,21413693,21413694,21413695,21413696,21413697,21413698,21413699,21413700,21413701,21413702,21413703,21413704,21413705,21413706,21413707,21413708,21413709,21413710,21413711,21413719,21413760,21413761,21413762,21413763,21413764,21413765,21413766,21413767,21413768,21413769,21413770,21413771,21413772,21413773,21413774,21413775,21413776,21413777,21413778,21413779,21413780,21413781,21413782,21413783,21413784,21413785,21413786,21413787,21413788,21413789,21413790,21413791,21413792,21413793,21413794,21413795,21413796,21413797,21413798,21413799,21413800,21413801,21413802,21413803,21413804,21413805,21413806,21413807,21413808,21413809,21413810,21413811,21413812,21413813,21413814,21413815,21413816,21413817,21413818,21413819,21413820,21413821,21413822,21413823,21413824,21413825,21413826,21413827,21413828,21413829,21413830,21413831,21413832,21413833,21413834,21413835,21413836,21413837,21413838,21413839,21413847],"Scandium":[20944835],"Sculk":[21880279],"Sea Lantern":[21415151],"Sea Pickle":[21417344,21417345,21417346,21417347,21417348,21417349,21417350,21417351],"Seaborgium":[20946478],"Selenium":[20948963],"Shroomlight":[21696604],"Shulker Box":[21418259],"Silicon":[20949447],"Silver":[20952835],"Slime Block":[21421890],"Small Dripleaf":[21927576,21927577,21927578,21927579,21927580,21927581,21927582,21927583],"Smithing Table":[21847863],"Smoker":[21423456,21423457,21423458,21423459,21423460,21423461,21423462,21423463],"Smooth Basalt":[21595261],"Smooth Quartz Block":[21425097],"Smooth Quartz Slab":[21428056,21428057,21428058],"Smooth Quartz Stairs":[21429504,21429505,21429506,21429507,21429508,21429509,21429510,21429511],"Smooth Red Sandstone":[21431324],"Smooth Red Sandstone Slab":[21432877,21432878,21432879],"Smooth Red Sandstone Stairs":[21436184,21436185,21436186,21436187,21436188,21436189,21436190,21436191],"Smooth Sandstone":[21438242],"Smooth Sandstone Slab":[21439385,21439386,21439387],"Smooth Sandstone Stairs":[21440752,21440753,21440754,21440755,21440756,21440757,21440758,21440759],"Smooth Stone":[21444566],"Smooth Stone Slab":[21446216,21446217,21446219],"Snow Block":[21448652],"Snow Layer":[21449736,21449737,21449738,21449739,21449740,21449741,21449742,21449743],"Sodium":[20953522],"Soul Fire":[21696136],"Soul Lantern":[21692144,21692145],"Soul Sand":[21451142],"Soul Soil":[21693270],"Soul Torch":[21689448,21689449,21689452,21689454,21689455],"Sponge":[21454292,21454293],"Spore Blossom":[21852156],"Spruce Button":[21456688,21456689,21456690,21456691,21456692,21456693,21456696,21456697,21456698,21456699,21456700,21456701],"Spruce Door":[21458400,21458401,21458402,21458403,21458404,21458405,21458406,21458407,21458408,21458409,21458410,21458411,21458412,21458413,21458414,21458415,21458416,21458417,21458418,21458419,21458420,21458421,21458422,21458423,21458424,21458425,21458426,21458427,21458428,21458429,21458430,21458431],"Spruce Fence":[21459375],"Spruce Fence Gate":[21462512,21462513,21462514,21462515,21462516,21462517,21462518,21462519,21462520,21462521,21462522,21462523,21462524,21462525,21462526,21462527],"Spruce Leaves":[21463656,21463657,21463658,21463659],"Spruce Log":[21465720,21465721,21465724,21465725,21465726,21465727],"Spruce Planks":[21468562],"Spruce Pressure Plate":[21469450,21469451],"Spruce Sapling":[21472860,21472861],"Spruce Sign":[21473424,21473425,21473426,21473427,21473428,21473429,21473430,21473431,21473432,21473433,21473434,21473435,21473436,21473437,21473438,21473439],"Spruce Slab":[21475816,21475817,21475818],"Spruce Stairs":[21477456,21477457,21477458,21477459,21477460,21477461,21477462,21477463],"Spruce Trapdoor":[21481008,21481009,21481010,21481011,21481012,21481013,21481014,21481015,21481016,21481017,21481018,21481019,21481020,21481021,21481022,21481023],"Spruce Wall Sign":[21483504,21483505,21483506,21483507],"Spruce Wood":[21484912,21484913,21484914,21484915,21484918,21484919],"Stained Clay":[21486144,21486145,21486146,21486147,21486148,21486149,21486150,21486151,21486152,21486153,21486154,21486155,21486156,21486157,21486158,21486159],"Stained Glass":[21489584,21489585,21489586,21489587,21489588,21489589,21489590,21489591,21489592,21489593,21489594,21489595,21489596,21489597,21489598,21489599],"Stained Glass Pane":[21489792,21489793,21489794,21489795,21489796,21489797,21489798,21489799,21489800,21489801,21489802,21489803,21489804,21489805,21489806,21489807],"Stained Hardened Glass":[21491728,21491729,21491730,21491731,21491732,21491733,21491734,21491735,21491736,21491737,21491738,21491739,21491740,21491741,21491742,21491743],"Stained Hardened Glass Pane":[21495136,21495137,21495138,21495139,21495140,21495141,21495142,21495143,21495144,21495145,21495146,21495147,21495148,21495149,21495150,21495151],"Stone":[21496052],"Stone Brick Slab":[21498972,21498973,21498974],"Stone Brick Stairs":[21500248,21500249,21500250,21500251,21500252,21500253,21500254,21500255],"Stone Brick Wall":[21503744,21503745,21503746,21503747,21503748,21503749,21503750,21503751,21503752,21503753,21503754,21503755,21503756,21503757,21503758,21503759,21503773,21503808,21503809,21503810,21503811,21503812,21503813,21503814,21503815,21503816,21503817,21503818,21503819,21503820,21503821,21503822,21503823,21503824,21503825,21503826,21503827,21503828,21503829,21503830,21503831,21503832,21503833,21503834,21503835,21503836,21503837,21503838,21503839,21503840,21503841,21503842,21503843,21503844,21503845,21503846,21503847,21503848,21503849,21503850,21503851,21503852,21503853,21503854,21503855,21503856,21503857,21503858,21503859,21503860,21503861,21503862,21503863,21503864,21503865,21503866,21503867,21503868,21503869,21503870,21503871,21503872,21503873,21503874,21503875,21503876,21503877,21503878,21503879,21503880,21503881,21503882,21503883,21503884,21503885,21503886,21503887,21503901,21503936,21503937,21503938,21503939,21503940,21503941,21503942,21503943,21503944,21503945,21503946,21503947,21503948,21503949,21503950,21503951,21503952,21503953,21503954,21503955,21503956,21503957,21503958,21503959,21503960,21503961,21503962,21503963,21503964,21503965,21503966,21503967,21503968,21503969,21503970,21503971,21503972,21503973,21503974,21503975,21503976,21503977,21503978,21503979,21503980,21503981,21503982,21503983,21503984,21503985,21503986,21503987,21503988,21503989,21503990,21503991,21503992,21503993,21503994,21503995,21503996,21503997,21503998,21503999],"Stone Bricks":[21505414],"Stone Button":[21507712,21507713,21507714,21507715,21507718,21507719,21507720,21507721,21507722,21507723,21507726,21507727],"Stone Pressure Plate":[21508356,21508357],"Stone Slab":[21512017,21512018,21512019],"Stone Stairs":[21512192,21512193,21512194,21512195,21512196,21512197,21512198,21512199],"Stonecutter":[21514984,21514985,21514986,21514987],"Strontium":[20955164],"Sugarcane":[21542656,21542657,21542658,21542659,21542660,21542661,21542662,21542663,21542664,21542665,21542666,21542667,21542668,21542669,21542670,21542671],"Sulfur":[20958068],"Sunflower":[21544506,21544507],"Sweet Berry Bush":[21545764,21545765,21545766,21545767],"TNT":[21550004,21550005,21550006,21550007],"Tall Grass":[21547986],"Tantalum":[20959931],"Technetium":[20962279],"Tellurium":[20964192],"Tennessine":[20965501],"Terbium":[20968631],"Thallium":[20971328],"Thorium":[20973507],"Thulium":[20974346],"Tin":[20976139],"Tinted Glass":[21779734],"Titanium":[20978911],"Torch":[21551770,21551771,21551772,21551773,21551775],"Torchflower":[21940847],"Torchflower Crop":[21943796,21943797],"Trapped Chest":[21553240,21553241,21553242,21553243],"Tripwire":[21556976,21556977,21556978,21556979,21556980,21556981,21556982,21556983,21556984,21556985,21556986,21556987,21556988,21556989,21556990,21556991],"Tripwire Hook":[21559008,21559009,21559010,21559011,21559012,21559013,21559014,21559015,21559016,21559017,21559018,21559019,21559020,21559021,21559022,21559023],"Tuff":[21688162],"Tungsten":[20981723],"Twisting Vines":[21873664,21873665,21873666,21873667,21873668,21873669,21873670,21873671,21873672,21873673,21873674,21873675,21873676,21873677,21873678,21873679,21873680,21873681,21873688,21873689,21873690,21873691,21873692,21873693,21873694,21873695],"Underwater Torch":[21560248,21560249,21560252,21560254,21560255],"Uranium":[20982778],"Vanadium":[20984123],"Vines":[21562368,21562369,21562370,21562371,21562372,21562373,21562374,21562375,21562376,21562377,21562378,21562379,21562380,21562381,21562382,21562383],"Wall Banner":[21564672,21564673,21564674,21564675,21564676,21564677,21564678,21564679,21564680,21564681,21564682,21564683,21564684,21564685,21564686,21564687,21564688,21564689,21564690,21564691,21564692,21564693,21564694,21564695,21564696,21564697,21564698,21564699,21564700,21564701,21564702,21564703,21564704,21564705,21564706,21564707,21564708,21564709,21564710,21564711,21564712,21564713,21564714,21564715,21564716,21564717,21564718,21564719,21564720,21564721,21564722,21564723,21564724,21564725,21564726,21564727,21564728,21564729,21564730,21564731,21564732,21564733,21564734,21564735],"Wall Coral Fan":[21567296,21567300,21567301,21567302,21567303,21567304,21567308,21567309,21567310,21567311,21567312,21567316,21567317,21567318,21567319,21567320,21567324,21567325,21567326,21567327,21567328,21567332,21567333,21567334,21567335,21567336,21567340,21567341,21567342,21567343,21567344,21567348,21567349,21567350,21567351,21567352,21567356,21567357,21567358,21567359],"Warped Button":[21741552,21741553,21741556,21741557,21741558,21741559,21741560,21741561,21741564,21741565,21741566,21741567],"Warped Door":[21752672,21752673,21752674,21752675,21752676,21752677,21752678,21752679,21752680,21752681,21752682,21752683,21752684,21752685,21752686,21752687,21752688,21752689,21752690,21752691,21752692,21752693,21752694,21752695,21752696,21752697,21752698,21752699,21752700,21752701,21752702,21752703],"Warped Fence":[21709978],"Warped Fence Gate":[21759616,21759617,21759618,21759619,21759620,21759621,21759622,21759623,21759624,21759625,21759626,21759627,21759628,21759629,21759630,21759631],"Warped Hyphae":[21727976,21727977,21727980,21727981,21727982,21727983],"Warped Planks":[21703045],"Warped Pressure Plate":[21747528,21747529],"Warped Roots":[21938097],"Warped Sign":[21771312,21771313,21771314,21771315,21771316,21771317,21771318,21771319,21771320,21771321,21771322,21771323,21771324,21771325,21771326,21771327],"Warped Slab":[21715036,21715038,21715039],"Warped Stairs":[21765928,21765929,21765930,21765931,21765932,21765933,21765934,21765935],"Warped Stem":[21721496,21721497,21721500,21721501,21721502,21721503],"Warped Trapdoor":[21734544,21734545,21734546,21734547,21734548,21734549,21734550,21734551,21734552,21734553,21734554,21734555,21734556,21734557,21734558,21734559],"Warped Wall Sign":[21777200,21777201,21777202,21777203],"Warped Wart Block":[21815813],"Water":[21568608,21568609,21568610,21568611,21568612,21568613,21568614,21568615,21568616,21568617,21568618,21568619,21568620,21568621,21568622,21568623,21568624,21568625,21568626,21568627,21568628,21568629,21568630,21568631,21568632,21568633,21568634,21568635,21568636,21568637,21568638,21568639],"Water Cauldron":[21854480,21854481,21854482,21854483,21854486,21854487],"Weeping Vines":[21875072,21875073,21875074,21875075,21875076,21875077,21875078,21875079,21875080,21875081,21875082,21875083,21875084,21875085,21875086,21875087,21875088,21875089,21875090,21875091,21875092,21875093,21875094,21875095,21875102,21875103],"Weighted Pressure Plate Heavy":[21570544,21570545,21570546,21570547,21570548,21570549,21570550,21570551,21570552,21570553,21570554,21570555,21570556,21570557,21570558,21570559],"Weighted Pressure Plate Light":[21572160,21572161,21572162,21572163,21572164,21572165,21572166,21572167,21572168,21572169,21572170,21572171,21572172,21572173,21572174,21572175],"Wheat Block":[21575552,21575553,21575554,21575555,21575556,21575557,21575558,21575559],"White Tulip":[21578492],"Wither Rose":[21841807],"Wool":[21580784,21580785,21580786,21580787,21580788,21580789,21580790,21580791,21580792,21580793,21580794,21580795,21580796,21580797,21580798,21580799],"Xenon":[20987135],"Ytterbium":[20989425],"Yttrium":[20991002],"Zinc":[20995928],"Zirconium":[20996890],"ate!upd":[21097998],"reserved6":[21399796],"update!":[21096340]},"stateDataBits":11} \ No newline at end of file diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index 6db39bb48a..a47a9b155a 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -28,6 +28,7 @@ use pocketmine\block\BaseBanner; use pocketmine\block\Bed; use pocketmine\block\BlockTypeIds; use pocketmine\block\CaveVines; +use pocketmine\block\Farmland; use pocketmine\block\MobHead; use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\data\bedrock\block\BlockStateDeserializeException; @@ -76,6 +77,8 @@ final class BlockSerializerDeserializerTest extends TestCase{ $newBlock->setMobHeadType($block->getMobHeadType()); }elseif($block instanceof CaveVines && $newBlock instanceof CaveVines && !$block->hasBerries()){ $newBlock->setHead($block->isHead()); + }elseif($block instanceof Farmland && $newBlock instanceof Farmland){ + $block->setWaterPositionIndex($newBlock->getWaterPositionIndex()); } self::assertSame($block->getStateId(), $newBlock->getStateId(), "Mismatch of blockstate for " . $block->getName() . ", " . print_r($block, true) . " vs " . print_r($newBlock, true)); From c14eb63f9b8cf734fc7c75b624af55d90822851f Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:30:35 +0200 Subject: [PATCH 1449/1858] Wooden Button can be a fuel (#6099) --- src/block/WoodenButton.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/WoodenButton.php b/src/block/WoodenButton.php index d1123ec2d6..7ba8a7af0d 100644 --- a/src/block/WoodenButton.php +++ b/src/block/WoodenButton.php @@ -35,4 +35,8 @@ class WoodenButton extends Button{ public function hasEntityCollision() : bool{ return false; //TODO: arrows activate wooden buttons } + + public function getFuelTime() : int{ + return $this->woodType->isFlammable() ? 100 : 0; + } } From 7b5c30bc2c0c9bcc3654df239c2e1918a61a3ce5 Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Tue, 17 Oct 2023 23:10:08 +0200 Subject: [PATCH 1450/1858] WoodenDoor can be a fuel (#6101) --- src/block/WoodenDoor.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/WoodenDoor.php b/src/block/WoodenDoor.php index e398812cd0..96f349e496 100644 --- a/src/block/WoodenDoor.php +++ b/src/block/WoodenDoor.php @@ -27,4 +27,8 @@ use pocketmine\block\utils\WoodTypeTrait; class WoodenDoor extends Door{ use WoodTypeTrait; + + public function getFuelTime() : int{ + return $this->woodType->isFlammable() ? 200 : 0; + } } From 932116fa524e4cf553834583c9c6ab479501a09a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 18 Oct 2023 10:22:37 +0100 Subject: [PATCH 1451/1858] Server: re-added @see reference that somehow got deleted this is useful when clicking through references in the call stack. --- src/Server.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Server.php b/src/Server.php index 2f1e9a53bd..9adc8e794e 100644 --- a/src/Server.php +++ b/src/Server.php @@ -570,6 +570,7 @@ class Server{ $playerPromiseResolver = new PromiseResolver(); $createPlayer = function(Location $location) use ($playerPromiseResolver, $class, $session, $playerInfo, $authenticated, $offlinePlayerData) : void{ + /** @see Player::__construct() */ $player = new $class($this, $session, $playerInfo, $authenticated, $location, $offlinePlayerData); if(!$player->hasPlayedBefore()){ $player->onGround = true; //TODO: this hack is needed for new players in-air ticks - they don't get detected as on-ground until they move From b4d55e4384e8f63b64db23a4fad8d1cb9da1d320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Le=C3=B3n?= <58715544+JavierLeon9966@users.noreply.github.com> Date: Wed, 18 Oct 2023 06:40:01 -0300 Subject: [PATCH 1452/1858] Fixed dirt and grass block interactions when clicking on sides other than the top (#6071) --- src/block/Dirt.php | 7 ++++++- src/block/Grass.php | 29 ++++++++++++++++------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 539454b415..fd6dc9d097 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -59,7 +59,12 @@ class Dirt extends Opaque{ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $world = $this->position->getWorld(); - if($face === Facing::UP && $item instanceof Hoe){ + if($face !== Facing::DOWN && $item instanceof Hoe){ + $up = $this->getSide(Facing::UP); + if($up->getTypeId() !== BlockTypeIds::AIR){ + return true; + } + $item->applyDamage(1); $newBlock = $this->dirtType->equals(DirtType::NORMAL()) ? VanillaBlocks::FARMLAND() : VanillaBlocks::DIRT(); diff --git a/src/block/Grass.php b/src/block/Grass.php index 709dc6a9de..f3fd96a340 100644 --- a/src/block/Grass.php +++ b/src/block/Grass.php @@ -82,7 +82,7 @@ class Grass extends Opaque{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ - if($face !== Facing::UP){ + if($this->getSide(Facing::UP)->getTypeId() !== BlockTypeIds::AIR){ return false; } $world = $this->position->getWorld(); @@ -91,20 +91,23 @@ class Grass extends Opaque{ TallGrassObject::growGrass($world, $this->position, new Random(mt_rand()), 8, 2); return true; - }elseif($item instanceof Hoe){ - $item->applyDamage(1); - $newBlock = VanillaBlocks::FARMLAND(); - $world->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); - $world->setBlock($this->position, $newBlock); + } + if($face !== Facing::DOWN){ + if($item instanceof Hoe){ + $item->applyDamage(1); + $newBlock = VanillaBlocks::FARMLAND(); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); + $world->setBlock($this->position, $newBlock); - return true; - }elseif($item instanceof Shovel && $this->getSide(Facing::UP)->getTypeId() === BlockTypeIds::AIR){ - $item->applyDamage(1); - $newBlock = VanillaBlocks::GRASS_PATH(); - $world->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); - $world->setBlock($this->position, $newBlock); + return true; + }elseif($item instanceof Shovel){ + $item->applyDamage(1); + $newBlock = VanillaBlocks::GRASS_PATH(); + $world->addSound($this->position->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock)); + $world->setBlock($this->position, $newBlock); - return true; + return true; + } } return false; From b3390458b42772e3ca0ba20c240d102597871b35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:58:27 +0100 Subject: [PATCH 1453/1858] Bump phpstan/phpstan from 1.10.38 to 1.10.39 (#6103) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.38 to 1.10.39. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.38...1.10.39) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 61c5d06648..6b73c15554 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.38", + "phpstan/phpstan": "1.10.39", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 061eb245b9..92f4d02853 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2282bf7835c1ced757460b083813e092", + "content-hash": "6c48ad06b67c3aa3890f004b197d17bc", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.38", + "version": "1.10.39", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T14:19:14+00:00" + "time": "2023-10-17T15:46:26+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From c7a358a56fbb78473e11e0e611d85d1ee34524ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 12:52:02 +0100 Subject: [PATCH 1454/1858] World: extract getBlockCollisionBoxes() from getCollisionBoxes() closes #6104 This function has been a footgun for anyone using it, since it also returns entity AABBs by default. In all core use cases, this functionality was disabled, and we were paying a needless (admittedly micro) performance penalty for passing the extra useless argument and useless condition check. --- src/entity/Entity.php | 6 +++--- src/world/World.php | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 7e4d7cbdef..d26a06d92b 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -842,7 +842,7 @@ abstract class Entity{ protected function checkObstruction(float $x, float $y, float $z) : bool{ $world = $this->getWorld(); - if(count($world->getCollisionBoxes($this, $this->getBoundingBox(), false)) === 0){ + if(count($world->getBlockCollisionBoxes($this->boundingBox)) === 0){ return false; } @@ -1144,7 +1144,7 @@ abstract class Entity{ assert(abs($dx) <= 20 && abs($dy) <= 20 && abs($dz) <= 20, "Movement distance is excessive: dx=$dx, dy=$dy, dz=$dz"); - $list = $this->getWorld()->getCollisionBoxes($this, $moveBB->addCoord($dx, $dy, $dz), false); + $list = $this->getWorld()->getBlockCollisionBoxes($moveBB->addCoord($dx, $dy, $dz)); foreach($list as $bb){ $dy = $bb->calculateYOffset($moveBB, $dy); @@ -1176,7 +1176,7 @@ abstract class Entity{ $stepBB = clone $this->boundingBox; - $list = $this->getWorld()->getCollisionBoxes($this, $stepBB->addCoord($dx, $dy, $dz), false); + $list = $this->getWorld()->getBlockCollisionBoxes($stepBB->addCoord($dx, $dy, $dz)); foreach($list as $bb){ $dy = $bb->calculateYOffset($stepBB, $dy); } diff --git a/src/world/World.php b/src/world/World.php index c0d3438ee6..c2236b9815 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1526,7 +1526,7 @@ class World implements ChunkManager{ * * @return AxisAlignedBB[] */ - private function getCollisionBoxesForCell(int $x, int $y, int $z) : array{ + private function getBlockCollisionBoxesForCell(int $x, int $y, int $z) : array{ $block = $this->getBlockAt($x, $y, $z); $boxes = $block->getCollisionBoxes(); @@ -1547,7 +1547,7 @@ class World implements ChunkManager{ * @return AxisAlignedBB[] * @phpstan-return list */ - public function getCollisionBoxes(Entity $entity, AxisAlignedBB $bb, bool $entities = true) : array{ + public function getBlockCollisionBoxes(AxisAlignedBB $bb) : array{ $minX = (int) floor($bb->minX); $minY = (int) floor($bb->minY); $minZ = (int) floor($bb->minZ); @@ -1563,7 +1563,7 @@ class World implements ChunkManager{ for($y = $minY; $y <= $maxY; ++$y){ $relativeBlockHash = World::chunkBlockHash($x, $y, $z); - $boxes = $this->blockCollisionBoxCache[$chunkPosHash][$relativeBlockHash] ??= $this->getCollisionBoxesForCell($x, $y, $z); + $boxes = $this->blockCollisionBoxCache[$chunkPosHash][$relativeBlockHash] ??= $this->getBlockCollisionBoxesForCell($x, $y, $z); foreach($boxes as $blockBB){ if($blockBB->intersectsWith($bb)){ @@ -1574,6 +1574,19 @@ class World implements ChunkManager{ } } + return $collides; + } + + /** + * @deprecated Use {@link World::getBlockCollisionBoxes()} instead (alongside {@link World::getCollidingEntities()} + * if entity collision boxes are also required). + * + * @return AxisAlignedBB[] + * @phpstan-return list + */ + public function getCollisionBoxes(Entity $entity, AxisAlignedBB $bb, bool $entities = true) : array{ + $collides = $this->getBlockCollisionBoxes($bb); + if($entities){ foreach($this->getCollidingEntities($bb->expandedCopy(0.25, 0.25, 0.25), $entity) as $ent){ $collides[] = clone $ent->boundingBox; From ccd2cdd324ca7413b7a0975fd016f097b30c61a9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 13:13:46 +0100 Subject: [PATCH 1455/1858] World: improve performance of calculating non-cached AABBs for a cell Avoiding getSide() improved the performance by 2x ... --- src/world/World.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index c2236b9815..d017fedcd6 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1531,8 +1531,8 @@ class World implements ChunkManager{ $boxes = $block->getCollisionBoxes(); $cellBB = AxisAlignedBB::one()->offset($x, $y, $z); - foreach(Facing::ALL as $facing){ - $extraBoxes = $block->getSide($facing)->getCollisionBoxes(); + foreach(Facing::OFFSET as [$dx, $dy, $dz]){ + $extraBoxes = $this->getBlockAt($x + $dx, $y + $dy, $z + $dz)->getCollisionBoxes(); foreach($extraBoxes as $extraBox){ if($extraBox->intersectsWith($cellBB)){ $boxes[] = $extraBox; From 6a3ec70c72e79603b2cc618269461204fd578f2b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 13:25:32 +0100 Subject: [PATCH 1456/1858] =?UTF-8?q?=C3=82Block:=20use=20Facing::OFFSET?= =?UTF-8?q?=20in=20getSide()=20instead=20of=20the=20comically=20inefficien?= =?UTF-8?q?t=20getBlock()=20+=20throwaway=20Position->getSide()=20This=20i?= =?UTF-8?q?mproved=20the=20function's=20performance=20by=202.3x.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/Block.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 189c0419dc..011d81c4f0 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -747,8 +747,14 @@ class Block{ * @return Block */ public function getSide(int $side, int $step = 1){ - if($this->position->isValid()){ - return $this->position->getWorld()->getBlock($this->position->getSide($side, $step)); + $position = $this->position; + if($position->isValid()){ + [$dx, $dy, $dz] = Facing::OFFSET[$side] ?? throw new \InvalidArgumentException("Unknown side $side"); + return $position->getWorld()->getBlockAt( + $position->x + ($dx * $step), + $position->y + ($dy * $step), + $position->z + ($dz * $step) + ); } throw new \LogicException("Block does not have a valid world"); From 19a17921845570c77296ada7779db16af1abfddf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 13:27:44 +0100 Subject: [PATCH 1457/1858] Fixed behavioural change on invalid Facing introduced by previous commit while this shouldn't be given invalid facings anyway, Vector3::getSide() accepts them and just returns itself. --- src/block/Block.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Block.php b/src/block/Block.php index 011d81c4f0..ee1f9500b9 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -749,7 +749,7 @@ class Block{ public function getSide(int $side, int $step = 1){ $position = $this->position; if($position->isValid()){ - [$dx, $dy, $dz] = Facing::OFFSET[$side] ?? throw new \InvalidArgumentException("Unknown side $side"); + [$dx, $dy, $dz] = Facing::OFFSET[$side] ?? [0, 0, 0]; return $position->getWorld()->getBlockAt( $position->x + ($dx * $step), $position->y + ($dy * $step), From 114f444ec3574669952ee6b5148d6695a2175e49 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 13:28:40 +0100 Subject: [PATCH 1458/1858] Update PHPStan baseline --- tests/phpstan/configs/actual-problems.neon | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 070858e804..80aed8226f 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -45,11 +45,26 @@ parameters: count: 1 path: ../../../src/VersionInfo.php + - + message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/Block.php + + - + message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/Block.php + - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\format\\\\Chunk\\:\\:setBlockStateId\\(\\) expects int, float\\|int given\\.$#" count: 1 path: ../../../src/block/Block.php + - + message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/Block.php + - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" count: 1 From f868c1d8c634f67d4ac346c9a512d4b5d3d1c033 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 16:38:34 +0100 Subject: [PATCH 1459/1858] Liquid: Update legacy code with Facing::OFFSET --- src/block/Liquid.php | 13 +++------ src/block/utils/MinimumCostFlowCalculator.php | 29 +++++-------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 9a9e49af4d..142aed2610 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -170,16 +170,11 @@ abstract class Liquid extends Transparent{ $world = $this->position->getWorld(); foreach(Facing::HORIZONTAL as $j){ - $x = $this->position->x; - $y = $this->position->y; - $z = $this->position->z; + [$dx, $dy, $dz] = Facing::OFFSET[$j]; - match($j){ - Facing::WEST => --$x, - Facing::EAST => ++$x, - Facing::NORTH => --$z, - Facing::SOUTH => ++$z - }; + $x = $this->position->x + $dx; + $y = $this->position->y + $dy; + $z = $this->position->z + $dz; $sideBlock = $world->getBlockAt($x, $y, $z); $blockDecay = $this->getEffectiveFlowDecay($sideBlock); diff --git a/src/block/utils/MinimumCostFlowCalculator.php b/src/block/utils/MinimumCostFlowCalculator.php index 84b003bbd1..a690a74870 100644 --- a/src/block/utils/MinimumCostFlowCalculator.php +++ b/src/block/utils/MinimumCostFlowCalculator.php @@ -58,17 +58,10 @@ final class MinimumCostFlowCalculator{ if($j === $originOpposite || $j === $lastOpposite){ continue; } - - $x = $blockX; - $y = $blockY; - $z = $blockZ; - - match($j){ - Facing::WEST => --$x, - Facing::EAST => ++$x, - Facing::NORTH => --$z, - Facing::SOUTH => ++$z - }; + [$dx, $dy, $dz] = Facing::OFFSET[$j]; + $x = $blockX + $dx; + $y = $blockY + $dy; + $z = $blockZ + $dz; if(!isset($this->flowCostVisited[$hash = World::blockHash($x, $y, $z)])){ if(!$this->world->isInWorld($x, $y, $z) || !$this->canFlowInto($this->world->getBlockAt($x, $y, $z))){ @@ -109,16 +102,10 @@ final class MinimumCostFlowCalculator{ $flowCost = array_fill_keys(Facing::HORIZONTAL, 1000); $maxCost = intdiv(4, $this->flowDecayPerBlock); foreach(Facing::HORIZONTAL as $j){ - $x = $originX; - $y = $originY; - $z = $originZ; - - match($j){ - Facing::WEST => --$x, - Facing::EAST => ++$x, - Facing::NORTH => --$z, - Facing::SOUTH => ++$z - }; + [$dx, $dy, $dz] = Facing::OFFSET[$j]; + $x = $originX + $dx; + $y = $originY + $dy; + $z = $originZ + $dz; if(!$this->world->isInWorld($x, $y, $z) || !$this->canFlowInto($this->world->getBlockAt($x, $y, $z))){ $this->flowCostVisited[World::blockHash($x, $y, $z)] = self::BLOCKED; From 73659318f602c553ef8f96e52f8f8b9129452463 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 16:46:36 +0100 Subject: [PATCH 1460/1858] World: Avoid unnecessary Vector3 usages in neighbour block update scheduling The old code was allocating 6 Vector3s which were all immediately discarded. In addition, we didn't need to take the performance hit of reading Vector3 properties when we could have just passed integers directly. The real performance difference of this is likely to be close to zero, but it's still worth doing. --- src/world/World.php | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index d017fedcd6..8c8ba82c89 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1455,9 +1455,9 @@ class World implements ChunkManager{ $this->scheduledBlockUpdateQueue->insert(new Vector3((int) $pos->x, (int) $pos->y, (int) $pos->z), $delay + $this->server->getTick()); } - private function tryAddToNeighbourUpdateQueue(Vector3 $pos) : void{ - if($this->isInWorld($pos->x, $pos->y, $pos->z)){ - $hash = World::blockHash($pos->x, $pos->y, $pos->z); + private function tryAddToNeighbourUpdateQueue(int $x, int $y, int $z) : void{ + if($this->isInWorld($x, $y, $z)){ + $hash = World::blockHash($x, $y, $z); if(!isset($this->neighbourBlockUpdateQueueIndex[$hash])){ $this->neighbourBlockUpdateQueue->enqueue($hash); $this->neighbourBlockUpdateQueueIndex[$hash] = true; @@ -1465,17 +1465,28 @@ class World implements ChunkManager{ } } + /** + * Identical to {@link World::notifyNeighbourBlockUpdate()}, but without the Vector3 requirement. We don't want or + * need Vector3 in the places where this is called. + * + * TODO: make this the primary method in PM6 + */ + private function internalNotifyNeighbourBlockUpdate(int $x, int $y, int $z) : void{ + $this->tryAddToNeighbourUpdateQueue($x, $y, $z); + foreach(Facing::OFFSET as [$dx, $dy, $dz]){ + $this->tryAddToNeighbourUpdateQueue($x + $dx, $y + $dy, $z + $dz); + } + } + /** * Notify the blocks at and around the position that the block at the position may have changed. * This will cause onNearbyBlockChange() to be called for these blocks. + * TODO: Accept plain integers in PM6 - the Vector3 requirement is an unnecessary inconvenience * * @see Block::onNearbyBlockChange() */ public function notifyNeighbourBlockUpdate(Vector3 $pos) : void{ - $this->tryAddToNeighbourUpdateQueue($pos); - foreach($pos->sides() as $side){ - $this->tryAddToNeighbourUpdateQueue($side); - } + $this->internalNotifyNeighbourBlockUpdate($pos->getFloorX(), $pos->getFloorY(), $pos->getFloorZ()); } /** @@ -1943,7 +1954,7 @@ class World implements ChunkManager{ if($update){ $this->updateAllLight($x, $y, $z); - $this->notifyNeighbourBlockUpdate($pos); + $this->internalNotifyNeighbourBlockUpdate($x, $y, $z); } $this->timings->setBlock->stopTiming(); From f1440324a7753e4d01afa456c9c9cc78f7f3d3a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 16:56:15 +0100 Subject: [PATCH 1461/1858] Update PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 27 +++++----------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 80aed8226f..f5d93af845 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -155,21 +155,6 @@ parameters: count: 1 path: ../../../src/block/DragonEgg.php - - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/block/Farmland.php - - - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/block/Farmland.php - - - - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/block/Farmland.php - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -952,12 +937,12 @@ parameters: - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - message: "#^Parameter \\#1 \\$x of static method pocketmine\\\\world\\\\World\\:\\:blockHash\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - @@ -982,12 +967,12 @@ parameters: - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - message: "#^Parameter \\#2 \\$y of static method pocketmine\\\\world\\\\World\\:\\:blockHash\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - @@ -1017,12 +1002,12 @@ parameters: - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - message: "#^Parameter \\#3 \\$z of static method pocketmine\\\\world\\\\World\\:\\:blockHash\\(\\) expects int, float\\|int given\\.$#" - count: 3 + count: 2 path: ../../../src/world/World.php - From ada37899aa063365157def8b508b20dcf50d7507 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 17:02:22 +0100 Subject: [PATCH 1462/1858] Liquid: improve code legibility and fix a bunch of PHPStan errors --- src/block/Liquid.php | 27 +++++++++++++--------- tests/phpstan/configs/actual-problems.neon | 6 ++--- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 142aed2610..640af37526 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -255,13 +255,17 @@ abstract class Liquid extends Transparent{ $world = $this->position->getWorld(); + $x = $this->position->getFloorX(); + $y = $this->position->getFloorY(); + $z = $this->position->getFloorZ(); + if(!$this->isSource()){ $smallestFlowDecay = -100; $this->adjacentSources = 0; - $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($this->position->x, $this->position->y, $this->position->z - 1), $smallestFlowDecay); - $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($this->position->x, $this->position->y, $this->position->z + 1), $smallestFlowDecay); - $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($this->position->x - 1, $this->position->y, $this->position->z), $smallestFlowDecay); - $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($this->position->x + 1, $this->position->y, $this->position->z), $smallestFlowDecay); + $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($x, $y, $z - 1), $smallestFlowDecay); + $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($x, $y, $z + 1), $smallestFlowDecay); + $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($x - 1, $y, $z), $smallestFlowDecay); + $smallestFlowDecay = $this->getSmallestFlowDecay($world->getBlockAt($x + 1, $y, $z), $smallestFlowDecay); $newDecay = $smallestFlowDecay + $multiplier; $falling = false; @@ -270,13 +274,13 @@ abstract class Liquid extends Transparent{ $newDecay = -1; } - if($this->getEffectiveFlowDecay($world->getBlockAt($this->position->x, $this->position->y + 1, $this->position->z)) >= 0){ + if($this->getEffectiveFlowDecay($world->getBlockAt($x, $y + 1, $z)) >= 0){ $falling = true; } $minAdjacentSources = $this->getMinAdjacentSourcesToFormSource(); if($minAdjacentSources !== null && $this->adjacentSources >= $minAdjacentSources){ - $bottomBlock = $world->getBlockAt($this->position->x, $this->position->y - 1, $this->position->z); + $bottomBlock = $world->getBlockAt($x, $y - 1, $z); if($bottomBlock->isSolid() || ($bottomBlock instanceof Liquid && $bottomBlock->hasSameTypeId($this) && $bottomBlock->isSource())){ $newDecay = 0; $falling = false; @@ -285,17 +289,17 @@ abstract class Liquid extends Transparent{ if($falling !== $this->falling || (!$falling && $newDecay !== $this->decay)){ if(!$falling && $newDecay < 0){ - $world->setBlock($this->position, VanillaBlocks::AIR()); + $world->setBlockAt($x, $y, $z, VanillaBlocks::AIR()); return; } $this->falling = $falling; $this->decay = $falling ? 0 : $newDecay; - $world->setBlock($this->position, $this); //local block update will cause an update to be scheduled + $world->setBlockAt($x, $y, $z, $this); //local block update will cause an update to be scheduled } } - $bottomBlock = $world->getBlockAt($this->position->x, $this->position->y - 1, $this->position->z); + $bottomBlock = $world->getBlockAt($x, $y - 1, $z); $this->flowIntoBlock($bottomBlock, 0, true); @@ -308,8 +312,9 @@ abstract class Liquid extends Transparent{ if($adjacentDecay <= self::MAX_DECAY){ $calculator = new MinimumCostFlowCalculator($world, $this->getFlowDecayPerBlock(), $this->canFlowInto(...)); - foreach($calculator->getOptimalFlowDirections($this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ()) as $facing){ - $this->flowIntoBlock($world->getBlock($this->position->getSide($facing)), $adjacentDecay, false); + foreach($calculator->getOptimalFlowDirections($x, $y, $z) as $facing){ + [$dx, $dy, $dz] = Facing::OFFSET[$facing]; + $this->flowIntoBlock($world->getBlockAt($x + $dx, $y + $dy, $z + $dz), $adjacentDecay, false); } } } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index f5d93af845..5763c43672 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -287,7 +287,7 @@ parameters: - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 11 + count: 4 path: ../../../src/block/Liquid.php - @@ -297,7 +297,7 @@ parameters: - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 11 + count: 4 path: ../../../src/block/Liquid.php - @@ -307,7 +307,7 @@ parameters: - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 11 + count: 4 path: ../../../src/block/Liquid.php - From 9474324f757c0089b6a4f425871f63dc53b359bf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 17:02:40 +0100 Subject: [PATCH 1463/1858] Liquid: simplify code --- src/block/Liquid.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 640af37526..3a84728ae3 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -188,17 +188,17 @@ abstract class Liquid extends Transparent{ if($blockDecay >= 0){ $realDecay = $blockDecay - ($decay - 8); - $vX += ($x - $this->position->x) * $realDecay; - $vY += ($y - $this->position->y) * $realDecay; - $vZ += ($z - $this->position->z) * $realDecay; + $vX += $dx * $realDecay; + $vY += $dy * $realDecay; + $vZ += $dz * $realDecay; } continue; }else{ $realDecay = $blockDecay - $decay; - $vX += ($x - $this->position->x) * $realDecay; - $vY += ($y - $this->position->y) * $realDecay; - $vZ += ($z - $this->position->z) * $realDecay; + $vX += $dx * $realDecay; + $vY += $dy * $realDecay; + $vZ += $dz * $realDecay; } } From dbb5a32a969b9dd989eff331b45c2c5bca5c8f32 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 19 Oct 2023 17:09:13 +0100 Subject: [PATCH 1464/1858] Liquid: eliminate unnecessary Position allocations and getSide() calls --- src/block/Liquid.php | 20 ++++++++++++-------- tests/phpstan/configs/actual-problems.neon | 15 --------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 3a84728ae3..6404cf9081 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -165,6 +165,10 @@ abstract class Liquid extends Transparent{ $vX = $vY = $vZ = 0; + $x = $this->position->getFloorX(); + $y = $this->position->getFloorY(); + $z = $this->position->getFloorZ(); + $decay = $this->getEffectiveFlowDecay($this); $world = $this->position->getWorld(); @@ -172,11 +176,11 @@ abstract class Liquid extends Transparent{ foreach(Facing::HORIZONTAL as $j){ [$dx, $dy, $dz] = Facing::OFFSET[$j]; - $x = $this->position->x + $dx; - $y = $this->position->y + $dy; - $z = $this->position->z + $dz; + $sideX = $x + $dx; + $sideY = $y + $dy; + $sideZ = $z + $dz; - $sideBlock = $world->getBlockAt($x, $y, $z); + $sideBlock = $world->getBlockAt($sideX, $sideY, $sideZ); $blockDecay = $this->getEffectiveFlowDecay($sideBlock); if($blockDecay < 0){ @@ -184,7 +188,7 @@ abstract class Liquid extends Transparent{ continue; } - $blockDecay = $this->getEffectiveFlowDecay($world->getBlockAt($x, $y - 1, $z)); + $blockDecay = $this->getEffectiveFlowDecay($world->getBlockAt($sideX, $sideY - 1, $sideZ)); if($blockDecay >= 0){ $realDecay = $blockDecay - ($decay - 8); @@ -206,10 +210,10 @@ abstract class Liquid extends Transparent{ if($this->falling){ foreach(Facing::HORIZONTAL as $facing){ - $pos = $this->position->getSide($facing); + [$dx, $dy, $dz] = Facing::OFFSET[$facing]; if( - !$this->canFlowInto($world->getBlockAt($pos->x, $pos->y, $pos->z)) || - !$this->canFlowInto($world->getBlockAt($pos->x, $pos->y + 1, $pos->z)) + !$this->canFlowInto($world->getBlockAt($x + $dx, $y + $dy, $z + $dz)) || + !$this->canFlowInto($world->getBlockAt($x + $dx, $y + $dy + 1, $z + $dz)) ){ $vector = $vector->normalize()->add(0, -6, 0); break; diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 5763c43672..a9d3a96a2e 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -285,31 +285,16 @@ parameters: count: 1 path: ../../../src/block/Leaves.php - - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 4 - path: ../../../src/block/Liquid.php - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" count: 1 path: ../../../src/block/Liquid.php - - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 4 - path: ../../../src/block/Liquid.php - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" count: 1 path: ../../../src/block/Liquid.php - - - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 4 - path: ../../../src/block/Liquid.php - - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:isInWorld\\(\\) expects int, float\\|int given\\.$#" count: 1 From 7dd3a70d2ea218d5e4f480697fcaa1426446f44e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 10:16:49 +0100 Subject: [PATCH 1465/1858] Revert "World: discard tiles on load if they aren't the correct type or no tile is expected" This reverts commit 8f804f6f342e650156767372bac2d42b55297361. This change is too disruptive, since popular plugins like ExtendedBlocks and ExtendedBlocksConverter relied on custom tiles. Deleting them at this stage would prevent these plugins from working, making it impossible to upgrade old data. An alternative solution to this problem will need to be developed. --- src/world/World.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 1103ae8f9e..903cc60e2b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2873,15 +2873,7 @@ class World implements ChunkManager{ }elseif($this->getTile($tilePosition) !== null){ $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Another tile is already at that position"); }else{ - $block = $this->getBlockAt($tilePosition->getFloorX(), $tilePosition->getFloorY(), $tilePosition->getFloorZ()); - $expectedClass = $block->getIdInfo()->getTileClass(); - if($expectedClass === null){ - $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Block at that position (" . $block->getName() . ") does not expect a tile"); - }elseif(!($tile instanceof $expectedClass)){ - $logger->error("Cannot add tile at x=$tilePosition->x,y=$tilePosition->y,z=$tilePosition->z: Tile is of wrong type (expected $expectedClass but have " . get_class($tile) . ")"); - }else{ - $this->addTile($tile); - } + $this->addTile($tile); } } From 8fa5c7cdab4ae09b2259ea062938593d871574a7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 10:28:46 +0100 Subject: [PATCH 1466/1858] World: do not apply fake state properties from tile if the block doesn't expect this tile type This was causing a variety of crashes due to incorrect tiles, presumably from PM3 worlds. --- src/world/World.php | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 903cc60e2b..8265aa3841 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1102,19 +1102,22 @@ class World implements ChunkManager{ $blockPosition = BlockPosition::fromVector3($b); $tile = $this->getTileAt($b->x, $b->y, $b->z); - if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){ - $originalStateData = $blockTranslator->internalIdToNetworkStateData($fullBlock->getStateId()); - $fakeStateData = new BlockStateData( - $originalStateData->getName(), - array_merge($originalStateData->getStates(), $fakeStateProperties), - $originalStateData->getVersion() - ); - $packets[] = UpdateBlockPacket::create( - $blockPosition, - $blockTranslator->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()), - UpdateBlockPacket::FLAG_NETWORK, - UpdateBlockPacket::DATA_LAYER_NORMAL - ); + if($tile instanceof Spawnable){ + $expectedClass = $fullBlock->getIdInfo()->getTileClass(); + if($expectedClass !== null && $tile instanceof $expectedClass && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){ + $originalStateData = $blockTranslator->internalIdToNetworkStateData($fullBlock->getStateId()); + $fakeStateData = new BlockStateData( + $originalStateData->getName(), + array_merge($originalStateData->getStates(), $fakeStateProperties), + $originalStateData->getVersion() + ); + $packets[] = UpdateBlockPacket::create( + $blockPosition, + $blockTranslator->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()), + UpdateBlockPacket::FLAG_NETWORK, + UpdateBlockPacket::DATA_LAYER_NORMAL + ); + } } $packets[] = UpdateBlockPacket::create( $blockPosition, From decc18830217d89127c4d0c1ad1bf53550b3709e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 10:30:50 +0100 Subject: [PATCH 1467/1858] Release 5.6.1 --- changelogs/5.6.md | 14 ++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/changelogs/5.6.md b/changelogs/5.6.md index d4914f527f..257289a4a8 100644 --- a/changelogs/5.6.md +++ b/changelogs/5.6.md @@ -18,3 +18,17 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Fixed support conditions for hanging roots, cave vines and dead bushes. - Fixed connection conditions for fences, glass panes, iron bars, and walls. + +# 5.6.1 +Released 20th October 2023. + +## Performance +- Improved performance of cactus growth by disabling neighbour updates when only the age property was updated. While this isn't a perfect solution, it provides significant performance gains for servers with large cactus farms. + +## Fixes +- Fixed `tools/generate-bedrock-data-from-packets.php` incorrectly interpreting network meta as blockstates in some cases (broken crafting recipes). +- Fixed crafting recipes involving beds, skulls and some other items not working correctly (incorrectly interpreted data). +- Fixed crashes when flower pot or cauldron blockentities exist in places where they shouldn't (leftovers from upgraded PM3 worlds). +- Fixed `Entity->broadcastSound()` not firing `WorldSoundEvent` (bypassing internal sound system). +- Fixed wooden signs, buttons and doors not being able to be used as furnace fuel. +- Fixed bone meal and tools only working when used on the top side of dirt and grass. Bone meal now works from any side, and tools work on any side except the bottom. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 38854ac9c5..37703b32d6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.6.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 1c5d3b43be265e0e1e78465bf93a49a5e1364a08 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 10:30:50 +0100 Subject: [PATCH 1468/1858] 5.6.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 37703b32d6..9088094a24 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.6.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.6.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From eb935ca80f7098a0e711bc1dbb78b44ab59e3420 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 11:20:30 +0100 Subject: [PATCH 1469/1858] =?UTF-8?q?=C3=82Leaves:=20use=20a=20constant=20?= =?UTF-8?q?for=20max=20distance=20from=20wood?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/block/Leaves.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 0aa3557a41..7fe9eae74f 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -38,6 +38,8 @@ use pocketmine\world\World; use function mt_rand; class Leaves extends Transparent{ + private const MAX_LOG_DISTANCE = 4; + protected LeavesType $leavesType; //immutable for now protected bool $noDecay = false; protected bool $checkDecay = false; @@ -91,7 +93,7 @@ class Leaves extends Transparent{ return true; } - if($block instanceof Leaves && $distance <= 4){ + if($block instanceof Leaves && $distance <= self::MAX_LOG_DISTANCE){ foreach(Facing::ALL as $side){ if($this->findLog($pos->getSide($side), $visited, $distance + 1)){ return true; From 450ad4220211405238adb0e6e05e649bc041dc31 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 11:37:58 +0100 Subject: [PATCH 1470/1858] Added some new recommendations to CONTRIBUTING.md --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6b47a7fad4..a17d291663 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -117,6 +117,19 @@ It's your responsibility to ensure your code matches the formatting and styling If you use PhpStorm, a `Project` code style is provided, which you can use to automatically format new code. You can also use [`php-cs-fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to format your code. +#### Use `final` and `private` wherever possible +- Changing from `private` to `protected` or `final` to non-`final` doesn't break backwards compatibility, but the opposite does. +- `private` and `final` also enable certain performance optimizations which are otherwise not possible. +- `private` members can be freely changed, added and removed in the future, so it's ideal for internal functions. Abusing `protected` makes internal improvements inconvenient. +- "Let's leave it protected/public in case someone needs it for ... idk what" is **not a valid reason to expose things**. If there isn't a clear reason for something to be accessible from the outside, don't expose it. +- **This is a lesson learned through years of experience.** You may not like it, but it's for the best. + +#### Immutable things are almost always preferred +- Do not add unnecessary setters or public writable properties to classes. As above, "Let's leave it in case someone needs it" is **not a valid reason to expose things**. +- Mutable classes and properties are unpredictable, since code has no way to know if the object it's working with might be randomly modified by another part of the code. This makes it harder to maintain code and debug issues. +- Most classes exist only to hold some data. These are called "data transfer objects" (DTOs). These types of classes should pretty much always be immutable. +- Make use of `final`, `private` and `readonly` modifiers. + ### Recommendations - **Do not edit code directly on github.com.** We recommend learning how to use [`git`](https://git-scm.com). `git` allows you to "clone" a repository onto your computer, so that you can make changes using an IDE. From e4888d71028feb604b330b7a14c6b178bb97dec9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 12:12:14 +0100 Subject: [PATCH 1471/1858] =?UTF-8?q?=C3=82CONTRIBUTING.md:=20restructure,?= =?UTF-8?q?=20reword=20and=20reorganize=20[ci=20skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 92 ++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a17d291663..3490542c5b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,58 +88,58 @@ Depending on the changes, maintainers might ask you to make changes to the PR to ### Requirements The following are required as a minimum for pull requests. PRs that don't meet these requirements will be declined unless updated to meet them. -#### Licensing -PocketMine-MP is licensed under [LGPLv3 license](LICENSE). -By proposing a pull request, you agree to your code being distributed within PocketMine-MP under the same license. -If you take code from other projects, that code MUST be licensed under an LGPL-compatible license. - -#### PRs should be about exactly ONE thing -If you want to make multiple changes, those changes should each be contributed as separate pull requests. **DO NOT** mix unrelated changes. - -#### PRs must not include unnecessary/unrelated changes -Do not include changes which aren't strictly necessary. This makes it harder to review a PR, because the code diff becomes larger and harder to review. -This means: -- don't reformat or rearrange existing code -- don't change things that aren't related to the PR's objective -- don't rewrite existing code just to make it "look nicer" -- don't change PhpDocs to native types in code you didn't write - -#### Tests must be provided -Where possible, PHPUnit tests should be written for new or changed code. -If that's not possible (e.g. for in-game functionality), the code must be tested manually and details of the tests done must be provided. -**Simply saying "Tested" is not acceptable** and will lead to your PR being declined. - -#### Comments and documentation must be written in American English -English is the shared languages of all current maintainers. - -#### Code must be in the PocketMine-MP style -It's your responsibility to ensure your code matches the formatting and styling of the rest of the code. -If you use PhpStorm, a `Project` code style is provided, which you can use to automatically format new code. -You can also use [`php-cs-fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to format your code. - -#### Use `final` and `private` wherever possible -- Changing from `private` to `protected` or `final` to non-`final` doesn't break backwards compatibility, but the opposite does. -- `private` and `final` also enable certain performance optimizations which are otherwise not possible. -- `private` members can be freely changed, added and removed in the future, so it's ideal for internal functions. Abusing `protected` makes internal improvements inconvenient. -- "Let's leave it protected/public in case someone needs it for ... idk what" is **not a valid reason to expose things**. If there isn't a clear reason for something to be accessible from the outside, don't expose it. -- **This is a lesson learned through years of experience.** You may not like it, but it's for the best. - -#### Immutable things are almost always preferred -- Do not add unnecessary setters or public writable properties to classes. As above, "Let's leave it in case someone needs it" is **not a valid reason to expose things**. -- Mutable classes and properties are unpredictable, since code has no way to know if the object it's working with might be randomly modified by another part of the code. This makes it harder to maintain code and debug issues. -- Most classes exist only to hold some data. These are called "data transfer objects" (DTOs). These types of classes should pretty much always be immutable. -- Make use of `final`, `private` and `readonly` modifiers. +- **All code must be licensed under the [LGPLv3 license](LICENSE)** as per PocketMine-MP's own license, or a compatible license. + - By proposing a pull request, you agree to your code being distributed within PocketMine-MP under the same license. + - If you take code from other projects, that code MUST be licensed under an LGPL-compatible license. +- **PRs should be about ONE thing** + - If you want to make multiple changes, those changes should each be contributed as separate pull requests. **DO NOT** mix unrelated changes. + - **Do not include unnecessary changes.** This makes the code diff larger and more noisy, making it harder to review. + - Don't change things that aren't related to the PR's objective + - Don't reformat or rearrange existing code without a good reason related to the PR's objective + - Don't rewrite existing code just to make it "look nicer" + - Don't change PhpDocs to native types in code you didn't write, unless that's the objective of the PR +- **Test code changes, and tell us what tests have been done.** + - Where possible, PHPUnit tests should be written for new or changed code. If that's not possible (e.g. for in-game functionality), the code must be tested manually and details of the tests done must be provided. + - **Simply saying "Tested" is not acceptable** and could lead to your PR being declined. +- **Code, comments and documentation must be written in American English.** English is the shared languages of all current maintainers. +- **Code must be in the PocketMine-MP style.** + - It's your responsibility to ensure your code matches the formatting and styling of the rest of the code. + - If you use PhpStorm, a `Project` code style is provided, which you can use to automatically format new code. + - You can also use [`php-cs-fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to format your code. +- **Use `final` and `private` wherever possible**. + - Changing from `private` to `protected` or `final` to non-`final` doesn't break backwards compatibility, but the opposite does. + - `private` and `final` also enable certain performance optimizations which are otherwise not possible. + - `private` members can be freely changed, added and removed in the future, so it's ideal for internal functions. Abusing `protected` makes internal improvements inconvenient. + - "Let's leave it protected/public in case someone needs it for ... idk what" is **not a valid reason to expose things**. If there isn't a clear reason for something to be accessible from the outside, don't expose it. + - **This is a lesson learned through years of experience.** You may not like it, but it's for the best. +- **Immutable things are almost always preferred.** + - Do not add unnecessary setters or public writable properties to classes. As above, "Let's leave it in case someone needs it" is **not a valid reason to expose things**. + - Mutable classes and properties are unpredictable, since code has no way to know if the object it's working with might be randomly modified by another part of the code. This makes it harder to maintain code and debug issues. + - Most classes exist only to hold some data. These are called "data transfer objects" (DTOs). These types of classes should pretty much always be immutable. + - Make use of `final`, `private` and `readonly` modifiers. ### Recommendations - +- **Be patient.** Reviewing pull requests takes a lot of time and energy, and maintainers are often unavailable or busy. Your PR might not receive attention for a while. + - Remember, PRs with small diffs are much easier to review. Small PRs are generally reviewed and merged much faster than large ones. +- **Start small.** Try fixing minor bugs or doing something isolated (e.g. adding a new block or item) before attempting larger changes. + - This helps you get familiar with the codebase, the contribution process, and the expectations of maintainers. + - Check out the [issues page]() for something that you could tackle without too much effort. +- **Do not copy-paste other people's code**. Many PRs involve discussion about the changes, and changes are often requested by reviewers. If you don't understand the code you're copy-pasting, your PR is likely to fail. - **Do not edit code directly on github.com.** We recommend learning how to use [`git`](https://git-scm.com). `git` allows you to "clone" a repository onto your computer, so that you can make changes using an IDE. - **Use an IDE, not a text editor.** We recommend PhpStorm or VSCode. +- **Do not make large pull requests without an RFC.** + - Large changes should be discussed beforehand using the [RFC / Change Proposal](#rfcs--change-proposals) process. + - Large changes are much harder to review, and are more likely to be declined if maintainers don't have a good idea what you're trying to do in advance. - **Create a new branch on your fork for each pull request.** This allows you to use the same fork to make multiple pull requests at the same time. +- **Make your PR diff as small as possible.** Smaller PRs are **much more likely** to be accepted, as they are easier to review. + - Avoid moving code around in files if possible. + - Don't make random CS changes. This makes the diff noisier and harder to review. - **Use descriptive commit titles.** You can see an example [here](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). -- **Do not include multiple unrelated changes in one commit.** An atomic style for commits is preferred - this means that changes included in a commit should be part of a single distinct change set. See [this link](https://www.freshconsulting.com/atomic-commits/) for more information on atomic commits. See the [documentation on `git add`](https://git-scm.com/docs/git-add) for information on how to isolate local changes for committing. -- **Your pull request will be checked and discussed in due time.** Since the team is scattered all around the world, your PR may not receive any attention for some time. -- **Do not make large pull requests without an RFC.** Large changes should be discussed beforehand using the [RFC / Change Proposal](#rfcs--change-proposals) process. Large changes are much harder to review and are more likely to be declined if maintainers don't have a good idea what you're trying to do in advance. -- **Do not copy-paste code**. There are potential license issues implicit with copy-pasting, and copy-paste usually indicates a lack of understanding of the actual code. Copy-pasted code is obvious a mile off and **any PR like this is likely to be closed**. If you want to use somebody else's code from a Git repository, **use [GIT's cherry-pick feature](https://git-scm.com/docs/git-cherry-pick)** to cherry-pick the commit. +- **Split unrelated changes into multiple commits.** + - An atomic style for commits is preferred - this means that changes included in a commit should be part of a single distinct change set. + - If you need to use "and" or "multiple changes" in your commit message, the commit probably needs to be split up. There are exceptions, but this is a good rule of thumb. + - See [this link](https://www.freshconsulting.com/atomic-commits/) for more information on atomic commits. + - See the [documentation on `git add -i` or `git add -p`](https://git-scm.com/docs/git-add) for information on how to split up local changes for committing. **Thanks for contributing to PocketMine-MP!** From 1f461977d442cccb2ce02613b1e1b9f9a2539342 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 17:28:19 +0100 Subject: [PATCH 1472/1858] Block: Avoid useless Vector3 allocations in getHorizontalSides and getAllSides --- src/block/Block.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index ee1f9500b9..0bbb8d370d 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -768,8 +768,14 @@ class Block{ */ public function getHorizontalSides() : \Generator{ $world = $this->position->getWorld(); - foreach($this->position->sidesAroundAxis(Axis::Y) as $vector3){ - yield $world->getBlock($vector3); + foreach(Facing::HORIZONTAL as $facing){ + [$dx, $dy, $dz] = Facing::OFFSET[$facing]; + //TODO: yield Facing as the key? + yield $world->getBlockAt( + $this->position->x + $dx, + $this->position->y + $dy, + $this->position->z + $dz + ); } } @@ -781,8 +787,13 @@ class Block{ */ public function getAllSides() : \Generator{ $world = $this->position->getWorld(); - foreach($this->position->sides() as $vector3){ - yield $world->getBlock($vector3); + foreach(Facing::OFFSET as [$dx, $dy, $dz]){ + //TODO: yield Facing as the key? + yield $world->getBlockAt( + $this->position->x + $dx, + $this->position->y + $dy, + $this->position->z + $dz + ); } } From 8e17aed4f44a1a7116530508823ac6b41e00c31e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 20 Oct 2023 17:43:04 +0100 Subject: [PATCH 1473/1858] Fix build --- src/block/Block.php | 1 - tests/phpstan/configs/actual-problems.neon | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 0bbb8d370d..5d87db8797 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -42,7 +42,6 @@ use pocketmine\item\enchantment\ItemEnchantmentTags; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\item\Item; use pocketmine\item\ItemBlock; -use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\RayTraceResult; diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index a9d3a96a2e..cf7e9b02f9 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -47,12 +47,12 @@ parameters: - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 + count: 3 path: ../../../src/block/Block.php - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 + count: 3 path: ../../../src/block/Block.php - @@ -62,7 +62,7 @@ parameters: - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getBlockAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 + count: 3 path: ../../../src/block/Block.php - From 73b1fba53c49c83ee987f6ce84743e87fb0eb065 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 11:46:08 +0100 Subject: [PATCH 1474/1858] Fixed Promise calling rejection handler given after being successfully resolved closes #6110 this is a weird use case, but it should work nonetheless. --- src/promise/Promise.php | 11 +++++-- src/promise/PromiseResolver.php | 8 ++--- src/promise/PromiseSharedData.php | 6 ++-- tests/phpunit/promise/PromiseTest.php | 42 +++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 tests/phpunit/promise/PromiseTest.php diff --git a/src/promise/Promise.php b/src/promise/Promise.php index e7188197c7..bafec09797 100644 --- a/src/promise/Promise.php +++ b/src/promise/Promise.php @@ -41,8 +41,11 @@ final class Promise{ * @phpstan-param \Closure() : void $onFailure */ public function onCompletion(\Closure $onSuccess, \Closure $onFailure) : void{ - if($this->shared->resolved){ - $this->shared->result === null ? $onFailure() : $onSuccess($this->shared->result); + $state = $this->shared->state; + if($state === true){ + $onSuccess($this->shared->result); + }elseif($state === false){ + $onFailure(); }else{ $this->shared->onSuccess[spl_object_id($onSuccess)] = $onSuccess; $this->shared->onFailure[spl_object_id($onFailure)] = $onFailure; @@ -50,6 +53,8 @@ final class Promise{ } public function isResolved() : bool{ - return $this->shared->resolved; + //TODO: perhaps this should return true when rejected? currently there's no way to tell if a promise was + //rejected or just hasn't been resolved yet + return $this->shared->state === true; } } diff --git a/src/promise/PromiseResolver.php b/src/promise/PromiseResolver.php index 97b181d0b2..2019f261d0 100644 --- a/src/promise/PromiseResolver.php +++ b/src/promise/PromiseResolver.php @@ -41,10 +41,10 @@ final class PromiseResolver{ * @phpstan-param TValue $value */ public function resolve(mixed $value) : void{ - if($this->shared->resolved){ + if($this->shared->state !== null){ throw new \LogicException("Promise has already been resolved/rejected"); } - $this->shared->resolved = true; + $this->shared->state = true; $this->shared->result = $value; foreach($this->shared->onSuccess as $c){ $c($value); @@ -54,10 +54,10 @@ final class PromiseResolver{ } public function reject() : void{ - if($this->shared->resolved){ + if($this->shared->state !== null){ throw new \LogicException("Promise has already been resolved/rejected"); } - $this->shared->resolved = true; + $this->shared->state = false; foreach($this->shared->onFailure as $c){ $c(); } diff --git a/src/promise/PromiseSharedData.php b/src/promise/PromiseSharedData.php index be667eadb4..8bc2691f46 100644 --- a/src/promise/PromiseSharedData.php +++ b/src/promise/PromiseSharedData.php @@ -41,8 +41,8 @@ final class PromiseSharedData{ */ public array $onFailure = []; - public bool $resolved = false; + public ?bool $state = null; - /** @phpstan-var TValue|null */ - public mixed $result = null; + /** @phpstan-var TValue */ + public mixed $result; } diff --git a/tests/phpunit/promise/PromiseTest.php b/tests/phpunit/promise/PromiseTest.php new file mode 100644 index 0000000000..7198f4f619 --- /dev/null +++ b/tests/phpunit/promise/PromiseTest.php @@ -0,0 +1,42 @@ +resolve(null); + $resolver->getPromise()->onCompletion( + function(mixed $value) : void{ + self::assertNull($value); + }, + function() : void{ + self::fail("Promise should not be rejected"); + } + ); + } +} From 41c5f6356547427c53e73b63ffad101eddbe5f2b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 12:17:41 +0100 Subject: [PATCH 1475/1858] World: remove dead code --- src/world/World.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 8c8ba82c89..391c1fe240 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -973,11 +973,6 @@ class World implements ChunkManager{ } $block = $this->getBlockAt($x, $y, $z); - $replacement = $block->readStateFromWorld(); //for blocks like fences, force recalculation of connected AABBs - if($replacement !== $block){ - $replacement->position($this, $x, $y, $z); - $block = $replacement; - } if(BlockUpdateEvent::hasHandlers()){ $ev = new BlockUpdateEvent($block); From 9fcc9f433829c1f35716857e0861b50dae915618 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 12:24:02 +0100 Subject: [PATCH 1476/1858] StringToItemParser: added missing blocks closes #6108 --- src/item/StringToItemParser.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d482e4bef9..50e34744dd 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -205,6 +205,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("carpet", fn() => Blocks::CARPET()); $result->registerBlock("carrot_block", fn() => Blocks::CARROTS()); $result->registerBlock("carrots", fn() => Blocks::CARROTS()); + $result->registerBlock("cartography_table", fn() => Blocks::CARTOGRAPHY_TABLE()); $result->registerBlock("carved_pumpkin", fn() => Blocks::CARVED_PUMPKIN()); $result->registerBlock("cauldron", fn() => Blocks::CAULDRON()); $result->registerBlock("cave_vines", fn() => Blocks::CAVE_VINES()); @@ -975,6 +976,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("slime", fn() => Blocks::SLIME()); $result->registerBlock("slime_block", fn() => Blocks::SLIME()); $result->registerBlock("small_dripleaf", fn() => Blocks::SMALL_DRIPLEAF()); + $result->registerBlock("smithing_table", fn() => Blocks::SMITHING_TABLE()); $result->registerBlock("smoker", fn() => Blocks::SMOKER()); $result->registerBlock("smooth_basalt", fn() => Blocks::SMOOTH_BASALT()); $result->registerBlock("smooth_quartz", fn() => Blocks::SMOOTH_QUARTZ()); @@ -1047,6 +1049,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("stripped_acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(true)); $result->registerBlock("stripped_birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(true)); $result->registerBlock("stripped_birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(true)); + $result->registerBlock("stripped_cherry_log", fn() => Blocks::CHERRY_LOG()->setStripped(true)); + $result->registerBlock("stripped_cherry_wood", fn() => Blocks::CHERRY_WOOD()->setStripped(true)); $result->registerBlock("stripped_crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(true)); $result->registerBlock("stripped_crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(true)); $result->registerBlock("stripped_dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(true)); From af432c1a7f07ac1a6d4ad6ab35cd823aabd821cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 12:33:36 +0100 Subject: [PATCH 1477/1858] Give neighbour block updates its own timer this way we aren't conflating them with scheduled updates, which are usually caused by e.g. water --- src/world/World.php | 6 +++--- src/world/WorldTimings.php | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 391c1fe240..61aedf8d5b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -948,9 +948,7 @@ class World implements ChunkManager{ $this->providerGarbageCollectionTicker = 0; } - //Do block updates $this->timings->scheduledBlockUpdates->startTiming(); - //Delayed updates while($this->scheduledBlockUpdateQueue->count() > 0 && $this->scheduledBlockUpdateQueue->current()["priority"] <= $currentTick){ /** @var Vector3 $vec */ @@ -962,7 +960,9 @@ class World implements ChunkManager{ $block = $this->getBlock($vec); $block->onScheduledUpdate(); } + $this->timings->scheduledBlockUpdates->stopTiming(); + $this->timings->neighbourBlockUpdates->startTiming(); //Normal updates while($this->neighbourBlockUpdateQueue->count() > 0){ $index = $this->neighbourBlockUpdateQueue->dequeue(); @@ -987,7 +987,7 @@ class World implements ChunkManager{ $block->onNearbyBlockChange(); } - $this->timings->scheduledBlockUpdates->stopTiming(); + $this->timings->neighbourBlockUpdates->stopTiming(); $this->timings->entityTick->startTiming(); //Update entities that need update diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index 5c1a560112..2d3a2090c9 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -34,6 +34,7 @@ class WorldTimings{ public TimingsHandler $doChunkUnload; public TimingsHandler $scheduledBlockUpdates; + public TimingsHandler $neighbourBlockUpdates; public TimingsHandler $randomChunkUpdates; public TimingsHandler $randomChunkUpdatesChunkSelection; public TimingsHandler $doChunkGC; @@ -77,6 +78,7 @@ class WorldTimings{ $this->doChunkUnload = self::newTimer($name, "Unload Chunks"); $this->scheduledBlockUpdates = self::newTimer($name, "Scheduled Block Updates"); + $this->neighbourBlockUpdates = self::newTimer($name, "Neighbour Block Updates"); $this->randomChunkUpdates = self::newTimer($name, "Random Chunk Updates"); $this->randomChunkUpdatesChunkSelection = self::newTimer($name, "Random Chunk Updates - Chunk Selection"); $this->doChunkGC = self::newTimer($name, "Garbage Collection"); From f655eda3b3239d6fbd8186a839308c15b4734fcb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 16:05:13 +0100 Subject: [PATCH 1478/1858] Player: bypass slow function call for some reason the isSpectator() call here can take upwards of 2 microseconds, for no obvious reason. Subsequent calls are much faster, so I think there's some weird cache thing going on here. --- src/player/Player.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/player/Player.php b/src/player/Player.php index 0afa0bffe3..0ee9d7dc2a 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1219,7 +1219,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } protected function checkGroundState(float $wantedX, float $wantedY, float $wantedZ, float $dx, float $dy, float $dz) : void{ - if($this->isSpectator()){ + if($this->gamemode === GameMode::SPECTATOR){ $this->onGround = false; }else{ $bb = clone $this->boundingBox; From d637370b8346df86a2f5fc349f1bcaeb91a1d7d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 23 Oct 2023 17:38:04 +0100 Subject: [PATCH 1479/1858] Wipe internal block AABB cache only for specific blocks that need it the vast majority of blocks don't need this cache erasing, so it's costing performance for no good reason. --- src/block/Block.php | 9 +++------ src/block/Door.php | 2 ++ src/block/Fence.php | 2 ++ src/block/Stair.php | 2 ++ src/block/Thin.php | 2 ++ 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index 5d87db8797..a1d553b9d1 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -346,17 +346,13 @@ class Block{ /** * Called when this block is created, set, or has a neighbouring block update, to re-detect dynamic properties which - * are not saved on the world. - * - * Clears any cached precomputed objects, such as bounding boxes. Remove any outdated precomputed things such as - * AABBs and force recalculation. + * are not saved in the blockstate ID. + * If any such properties are updated, don't forget to clear things like AABB caches if necessary. * * A replacement block may be returned. This is useful if the block type changed due to reading of world data (e.g. * data from a block entity). */ public function readStateFromWorld() : Block{ - $this->collisionBoxes = null; - return $this; } @@ -596,6 +592,7 @@ class Block{ */ final public function position(World $world, int $x, int $y, int $z) : void{ $this->position = new Position($x, $y, $z, $world); + $this->collisionBoxes = null; } /** diff --git a/src/block/Door.php b/src/block/Door.php index c97c5bb1e9..82ddaab518 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -51,6 +51,8 @@ class Door extends Transparent{ public function readStateFromWorld() : Block{ parent::readStateFromWorld(); + $this->collisionBoxes = null; + //copy door properties from other half $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); if($other instanceof Door && $other->hasSameTypeId($this)){ diff --git a/src/block/Fence.php b/src/block/Fence.php index 4fa571b675..30caaa4cfc 100644 --- a/src/block/Fence.php +++ b/src/block/Fence.php @@ -40,6 +40,8 @@ class Fence extends Transparent{ public function readStateFromWorld() : Block{ parent::readStateFromWorld(); + $this->collisionBoxes = null; + foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); if($block instanceof static || $block instanceof FenceGate || $block->getSupportType(Facing::opposite($facing)) === SupportType::FULL){ diff --git a/src/block/Stair.php b/src/block/Stair.php index 25d1da8d99..1acaac9628 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -49,6 +49,8 @@ class Stair extends Transparent{ public function readStateFromWorld() : Block{ parent::readStateFromWorld(); + $this->collisionBoxes = null; + $clockwise = Facing::rotateY($this->facing, true); if(($backFacing = $this->getPossibleCornerFacing(false)) !== null){ $this->shape = $backFacing === $clockwise ? StairShape::OUTER_RIGHT : StairShape::OUTER_LEFT; diff --git a/src/block/Thin.php b/src/block/Thin.php index bf82c3e584..dde2d7d847 100644 --- a/src/block/Thin.php +++ b/src/block/Thin.php @@ -39,6 +39,8 @@ class Thin extends Transparent{ public function readStateFromWorld() : Block{ parent::readStateFromWorld(); + $this->collisionBoxes = null; + foreach(Facing::HORIZONTAL as $facing){ $side = $this->getSide($facing); if($side instanceof Thin || $side instanceof Wall || $side->getSupportType(Facing::opposite($facing)) === SupportType::FULL){ From 53a740433f4aa3233476fe42046ed508cf851a2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:32:59 +0100 Subject: [PATCH 1480/1858] Changes for 1.20.40 --- composer.json | 6 +-- composer.lock | 40 +++++++++---------- src/data/bedrock/block/BlockStateData.php | 4 +- .../convert/BlockObjectToStateSerializer.php | 8 ++-- .../BlockStateToObjectDeserializer.php | 8 ++-- src/network/mcpe/NetworkSession.php | 2 +- src/world/format/io/data/BedrockWorldData.php | 6 +-- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/composer.json b/composer.json index 6b73c15554..1775f4e4dd 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.2.0+bedrock-1.20.30", - "pocketmine/bedrock-data": "~2.5.0+bedrock-1.20.30", + "pocketmine/bedrock-block-upgrade-schema": "~3.3.0+bedrock-1.20.40", + "pocketmine/bedrock-data": "~2.6.0+bedrock-1.20.40", "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", - "pocketmine/bedrock-protocol": "~24.0.0+bedrock-1.20.30", + "pocketmine/bedrock-protocol": "~25.0.0+bedrock-1.20.40", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 92f4d02853..cdb41d563e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6c48ad06b67c3aa3890f004b197d17bc", + "content-hash": "feefde772166966ee8065e613fe9a56e", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.2.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa" + "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/874e1c0c9b7b620744d08b59c78354fe9f028dfa", - "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ee46b9367af262bbddd9f122d4d5b5b495b892e7", + "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.2.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.3.0" }, - "time": "2023-09-20T17:03:43+00:00" + "time": "2023-10-16T16:11:02+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.5.1+bedrock-1.20.30", + "version": "2.6.0+bedrock-1.20.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f" + "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/8f9d96047a731c37b18b28c2bfcdfa2705bb303f", - "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/37e780d28b470230bda3579b04cb50d406e3fbe6", + "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6", "shasum": "" }, "type": "library", @@ -168,9 +168,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.5.1+bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.40" }, - "time": "2023-09-27T11:40:15+00:00" + "time": "2023-10-26T10:39:13+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -200,16 +200,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "24.0.0+bedrock-1.20.30", + "version": "25.0.0+bedrock-1.20.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "38a516274aa6641b0da38011af35a5587fc87895" + "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/38a516274aa6641b0da38011af35a5587fc87895", - "reference": "38a516274aa6641b0da38011af35a5587fc87895", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69c36c96f6835e93fc278071aa2bb9829abe5cf8", + "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8", "shasum": "" }, "require": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/24.0.0+bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockProtocol/tree/25.0.0+bedrock-1.20.40" }, - "time": "2023-09-20T16:57:53+00:00" + "time": "2023-10-26T11:03:10+00:00" }, { "name": "pocketmine/binaryutils", @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index c5712cf6c7..54f13ba560 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (30 << 8) | //patch - (50); //revision + (40 << 8) | //patch + (3); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index cf3535097e..0f64fb17b2 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -1113,7 +1113,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::CHEST(), function(Chest $block) : Writer{ return Writer::create(Ids::CHEST) - ->writeHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); @@ -1274,7 +1274,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) - ->writeHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::END_PORTAL_FRAME(), function(EndPortalFrame $block) : Writer{ return Writer::create(Ids::END_PORTAL_FRAME) @@ -1606,7 +1606,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) - ->writeHorizontalFacing($block->getFacing())); + ->writeCardinalHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); $this->mapStairs(Blocks::STONE_BRICK_STAIRS(), Ids::STONE_BRICK_STAIRS); @@ -1637,7 +1637,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::TRAPPED_CHEST(), function(TrappedChest $block) : Writer{ return Writer::create(Ids::TRAPPED_CHEST) - ->writeHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::TRIPWIRE(), function(Tripwire $block) : Writer{ return Writer::create(Ids::TRIP_WIRE) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index ce39c2739c..e54ce95eeb 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -994,7 +994,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::CHEST, function(Reader $in) : Block{ return Blocks::CHEST() - ->setFacing($in->readHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::CHORUS_FLOWER, function(Reader $in) : Block{ return Blocks::CHORUS_FLOWER() @@ -1095,7 +1095,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::ENDER_CHEST, function(Reader $in) : Block{ return Blocks::ENDER_CHEST() - ->setFacing($in->readHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::EXPOSED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::EXPOSED())); $this->map(Ids::EXPOSED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED())); @@ -1504,7 +1504,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ return Blocks::STONECUTTER() - ->setFacing($in->readHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::SWEET_BERRY_BUSH, function(Reader $in) : Block{ //berry bush only wants 0-3, but it can be bigger in MCPE due to misuse of GROWTH state which goes up to 7 @@ -1530,7 +1530,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::TRAPPED_CHEST, function(Reader $in) : Block{ return Blocks::TRAPPED_CHEST() - ->setFacing($in->readHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::TRIP_WIRE, function(Reader $in) : Block{ return Blocks::TRIPWIRE() diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 5b65ca1b5f..30d802f60a 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -642,7 +642,7 @@ class NetworkSession{ }else{ $translated = $message; } - $this->sendDataPacket(DisconnectPacket::create($translated)); + $this->sendDataPacket(DisconnectPacket::create(0, $translated)); } /** diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 20b1210f98..d92576f21a 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 618; + public const CURRENT_STORAGE_NETWORK_VERSION = 622; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 30, //patch - 2, //revision + 40, //patch + 1, //revision 0 //is beta ]; From 1aaaadb909f81c1bf138572bbf037cc9c36fe0cf Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:36:12 +0100 Subject: [PATCH 1481/1858] 1.20.40 changes (PM4) --- composer.json | 6 ++--- composer.lock | 38 ++++++++++++++--------------- src/network/mcpe/NetworkSession.php | 4 +-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/composer.json b/composer.json index 752779c2d0..87ced0afef 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.2.0+bedrock-1.20.30", - "pocketmine/bedrock-data": "~2.5.0+bedrock-1.20.30", + "pocketmine/bedrock-block-upgrade-schema": "~3.3.0+bedrock-1.20.40", + "pocketmine/bedrock-data": "~2.6.0+bedrock-1.20.40", "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", - "pocketmine/bedrock-protocol": "~24.0.0+bedrock-1.20.30", + "pocketmine/bedrock-protocol": "~25.0.0+bedrock-1.20.40", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 95bfc94abc..9c8438dde1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4f353f6d6fedade4ebfa82aa34f9cb21", + "content-hash": "ab3d7c1e3d9dfd8ff86584dcdba244a1", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.2.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa" + "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/874e1c0c9b7b620744d08b59c78354fe9f028dfa", - "reference": "874e1c0c9b7b620744d08b59c78354fe9f028dfa", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ee46b9367af262bbddd9f122d4d5b5b495b892e7", + "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7", "shasum": "" }, "type": "library", @@ -218,22 +218,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.2.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.3.0" }, - "time": "2023-09-20T17:03:43+00:00" + "time": "2023-10-16T16:11:02+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.5.1+bedrock-1.20.30", + "version": "2.6.0+bedrock-1.20.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f" + "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/8f9d96047a731c37b18b28c2bfcdfa2705bb303f", - "reference": "8f9d96047a731c37b18b28c2bfcdfa2705bb303f", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/37e780d28b470230bda3579b04cb50d406e3fbe6", + "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6", "shasum": "" }, "type": "library", @@ -244,9 +244,9 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/2.5.1+bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.40" }, - "time": "2023-09-27T11:40:15+00:00" + "time": "2023-10-26T10:39:13+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", @@ -276,16 +276,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "24.0.0+bedrock-1.20.30", + "version": "25.0.0+bedrock-1.20.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "38a516274aa6641b0da38011af35a5587fc87895" + "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/38a516274aa6641b0da38011af35a5587fc87895", - "reference": "38a516274aa6641b0da38011af35a5587fc87895", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69c36c96f6835e93fc278071aa2bb9829abe5cf8", + "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8", "shasum": "" }, "require": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/24.0.0+bedrock-1.20.30" + "source": "https://github.com/pmmp/BedrockProtocol/tree/25.0.0+bedrock-1.20.40" }, - "time": "2023-09-20T16:57:53+00:00" + "time": "2023-10-26T11:03:10+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 79118f1fa2..f23e50dbd5 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -622,7 +622,7 @@ class NetworkSession{ public function disconnect(string $reason, bool $notify = true) : void{ $this->tryDisconnect(function() use ($reason, $notify) : void{ if($notify){ - $this->sendDataPacket(DisconnectPacket::create($reason)); + $this->sendDataPacket(DisconnectPacket::create(0, $reason)); } if($this->player !== null){ $this->player->onPostDisconnect($reason, null); @@ -647,7 +647,7 @@ class NetworkSession{ */ public function onPlayerDestroyed(string $reason) : void{ $this->tryDisconnect(function() use ($reason) : void{ - $this->sendDataPacket(DisconnectPacket::create($reason)); + $this->sendDataPacket(DisconnectPacket::create(0, $reason)); }, $reason); } From a2e6e2e5b9bf1ab18614e4fe2796c33fee0754f5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:39:45 +0100 Subject: [PATCH 1482/1858] Update PHPStan --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 87ced0afef..807ee01249 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "~2.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.38", + "phpstan/phpstan": "1.10.39", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 9c8438dde1..6905e35979 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ab3d7c1e3d9dfd8ff86584dcdba244a1", + "content-hash": "7eb82ff7bbf49b2524db4136819bac35", "packages": [ { "name": "adhocore/json-comment", @@ -1738,16 +1738,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.38", + "version": "1.10.39", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", "shasum": "" }, "require": { @@ -1796,7 +1796,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T14:19:14+00:00" + "time": "2023-10-17T15:46:26+00:00" }, { "name": "phpstan/phpstan-phpunit", From f3f22ba48ba0001c5fdf1c0c5d9187f25cd5e5f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:43:16 +0100 Subject: [PATCH 1483/1858] Release 4.25.0 --- changelogs/4.25.md | 16 ++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.25.md diff --git a/changelogs/4.25.md b/changelogs/4.25.md new file mode 100644 index 0000000000..032c09ce8f --- /dev/null +++ b/changelogs/4.25.md @@ -0,0 +1,16 @@ +# 4.25.0 +Released 26th October 2023. + +**For Minecraft: Bedrock Edition 1.20.40** + +This is a support release for Minecraft: Bedrock Edition 1.20.40. + +**Plugin compatibility:** Plugins for previous 4.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.40. +- Removed support for older versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7f9ef2bbe3..7fbc11e101 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.24.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.25.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From fb586cc562e399200ff63471bfe4d6c179540038 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:43:16 +0100 Subject: [PATCH 1484/1858] 4.25.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7fbc11e101..a825efe60b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.25.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.25.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 22b9e70372ff1c766a7c90af7ef1ecdcc6d920d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:51:45 +0100 Subject: [PATCH 1485/1858] Release 5.7.0 --- changelogs/5.7.md | 20 ++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.7.md diff --git a/changelogs/5.7.md b/changelogs/5.7.md new file mode 100644 index 0000000000..65830c2204 --- /dev/null +++ b/changelogs/5.7.md @@ -0,0 +1,20 @@ +# 5.7.0 +Released 26th October 2023. + +**For Minecraft: Bedrock Edition 1.20.40** + +This is a support release for Minecraft: Bedrock Edition 1.20.40. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.40. +- Removed support for older versions. + +## Fixes +- Fixed `cartography_table`, `smithing_table`, `stripped_cherry_log` and `stripped_cherry_wood` not working in `StringToItemParser`. +- Fixed `Promise::onCompletion()` always calling the reject handler if the promise was already completed. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9088094a24..ce45594107 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.6.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.7.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 0b2fc8482761db987ecf13cbe680ee39c0bb7ede Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Oct 2023 12:51:45 +0100 Subject: [PATCH 1486/1858] 5.7.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index ce45594107..e6cae5059c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.7.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.7.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 34bb86d2bf135dbe1d5ac412252c46d3608166e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:26:30 +0000 Subject: [PATCH 1487/1858] Bump phpstan/phpstan-strict-rules from 1.5.1 to 1.5.2 (#6125) Bumps [phpstan/phpstan-strict-rules](https://github.com/phpstan/phpstan-strict-rules) from 1.5.1 to 1.5.2. - [Release notes](https://github.com/phpstan/phpstan-strict-rules/releases) - [Commits](https://github.com/phpstan/phpstan-strict-rules/compare/1.5.1...1.5.2) --- updated-dependencies: - dependency-name: phpstan/phpstan-strict-rules dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index cdb41d563e..64a6141665 100644 --- a/composer.lock +++ b/composer.lock @@ -1492,21 +1492,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6" + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/7a50e9662ee9f3942e4aaaf3d603653f60282542", + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.10.34" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -1535,9 +1535,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.2" }, - "time": "2023-03-29T14:47:40+00:00" + "time": "2023-10-30T14:35:06+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 14025710559ea4bdd22cf2c07e9dff66b40eb6b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:26:46 +0000 Subject: [PATCH 1488/1858] Bump phpstan/phpstan from 1.10.39 to 1.10.40 (#6126) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.39 to 1.10.40. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.39...1.10.40) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 1775f4e4dd..2f0b687302 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39", + "phpstan/phpstan": "1.10.40", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 64a6141665..4c9588263c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "feefde772166966ee8065e613fe9a56e", + "content-hash": "ca499c3c5acafac837f7384ecdae136e", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.39", + "version": "1.10.40", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" + "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/93c84b5bf7669920d823631e39904d69b9c7dc5d", + "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T15:46:26+00:00" + "time": "2023-10-30T14:48:31+00:00" }, { "name": "phpstan/phpstan-phpunit", From 9eb2a46942c806ed1115517e5056653781595a68 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 15:53:37 +0000 Subject: [PATCH 1489/1858] World: remove useless isChunkLoaded checks getChunkEntities() will return an empty array if the chunk isn't loaded anyway, so this is just wasting CPU cycles. --- src/world/World.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 1ecbe20a9c..4ff930dd18 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2292,9 +2292,6 @@ class World implements ChunkManager{ for($x = $minX; $x <= $maxX; ++$x){ for($z = $minZ; $z <= $maxZ; ++$z){ - if(!$this->isChunkLoaded($x, $z)){ - continue; - } foreach($this->getChunkEntities($x, $z) as $ent){ if($ent !== $entity && $ent->boundingBox->intersectsWith($bb)){ $nearby[] = $ent; @@ -2335,9 +2332,6 @@ class World implements ChunkManager{ for($x = $minX; $x <= $maxX; ++$x){ for($z = $minZ; $z <= $maxZ; ++$z){ - if(!$this->isChunkLoaded($x, $z)){ - continue; - } foreach($this->getChunkEntities($x, $z) as $entity){ if(!($entity instanceof $entityType) || $entity->isFlaggedForDespawn() || (!$includeDead && !$entity->isAlive())){ continue; From 0093732d498273d49fe68f9377c3c173f2cae186 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 16:13:28 +0000 Subject: [PATCH 1490/1858] PermissionManager: fixed non-reentrant-safe permission unsubscribing during unset(), the destructors for other objects with cyclic references can get triggered, resulting in the functions being reentered before the count() call. This leads to a crash because the offset no longer exists. Instead, we check if only the given PermissibleInternal is present, and clean everything up with a single unset instead of two. This could also have been solved by adding extra isset() checks before checking the counts, but this way seemed more elegant. This is similar to an issue with AsyncTask thread-local storage a few months ago, which was also caused by GC reentrancy. closes #6119 --- src/permission/PermissionManager.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index 2d83248874..1291ba86bf 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -72,19 +72,21 @@ class PermissionManager{ } public function unsubscribeFromPermission(string $permission, PermissibleInternal $permissible) : void{ - if(isset($this->permSubs[$permission])){ - unset($this->permSubs[$permission][spl_object_id($permissible)]); - if(count($this->permSubs[$permission]) === 0){ + if(isset($this->permSubs[$permission][spl_object_id($permissible)])){ + if(count($this->permSubs[$permission]) === 1){ unset($this->permSubs[$permission]); + }else{ + unset($this->permSubs[$permission][spl_object_id($permissible)]); } } } public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ foreach($this->permSubs as $permission => $subs){ - unset($this->permSubs[$permission][spl_object_id($permissible)]); - if(count($this->permSubs[$permission]) === 0){ + if(count($subs) === 1 && isset($subs[spl_object_id($permissible)])){ unset($this->permSubs[$permission]); + }else{ + unset($this->permSubs[$permission][spl_object_id($permissible)]); } } } From e6e2c54ec95b3382b85665ac14a906ecf0873184 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 16:28:59 +0000 Subject: [PATCH 1491/1858] Fixed various reentrant-unsafe 2D array element unsets (similar to previous commit) this pattern was used in various places --- src/Server.php | 5 +++-- src/plugin/PluginManager.php | 9 ++++++--- src/world/World.php | 27 ++++++++++++++++----------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Server.php b/src/Server.php index 9adc8e794e..dad61f48c9 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1259,9 +1259,10 @@ class Server{ */ public function unsubscribeFromBroadcastChannel(string $channelId, CommandSender $subscriber) : void{ if(isset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)])){ - unset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)]); - if(count($this->broadcastSubscribers[$channelId]) === 0){ + if(count($this->broadcastSubscribers[$channelId]) === 1){ unset($this->broadcastSubscribers[$channelId]); + }else{ + unset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)]); } } } diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 67ca8cc374..301c668547 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -510,9 +510,12 @@ class PluginManager{ unset($this->enabledPlugins[$plugin->getDescription()->getName()]); foreach(Utils::stringifyKeys($this->pluginDependents) as $dependency => $dependentList){ - unset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()]); - if(count($this->pluginDependents[$dependency]) === 0){ - unset($this->pluginDependents[$dependency]); + if(isset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()])){ + if(count($this->pluginDependents[$dependency]) === 1){ + unset($this->pluginDependents[$dependency]); + }else{ + unset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()]); + } } } diff --git a/src/world/World.php b/src/world/World.php index 8265aa3841..e705124f3d 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -826,14 +826,15 @@ class World implements ChunkManager{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $loaderId = spl_object_id($loader); if(isset($this->chunkLoaders[$chunkHash][$loaderId])){ - unset($this->chunkLoaders[$chunkHash][$loaderId]); - if(count($this->chunkLoaders[$chunkHash]) === 0){ + if(count($this->chunkLoaders[$chunkHash]) === 1){ unset($this->chunkLoaders[$chunkHash]); $this->unloadChunkRequest($chunkX, $chunkZ, true); if(isset($this->chunkPopulationRequestMap[$chunkHash]) && !isset($this->activeChunkPopulationTasks[$chunkHash])){ $this->chunkPopulationRequestMap[$chunkHash]->reject(); unset($this->chunkPopulationRequestMap[$chunkHash]); } + }else{ + unset($this->chunkLoaders[$chunkHash][$loaderId]); } } } @@ -861,11 +862,12 @@ class World implements ChunkManager{ public function unregisterChunkListener(ChunkListener $listener, int $chunkX, int $chunkZ) : void{ $hash = World::chunkHash($chunkX, $chunkZ); if(isset($this->chunkListeners[$hash])){ - unset($this->chunkListeners[$hash][spl_object_id($listener)]); - unset($this->playerChunkListeners[$hash][spl_object_id($listener)]); - if(count($this->chunkListeners[$hash]) === 0){ + if(count($this->chunkListeners[$hash]) === 1){ unset($this->chunkListeners[$hash]); unset($this->playerChunkListeners[$hash]); + }else{ + unset($this->chunkListeners[$hash][spl_object_id($listener)]); + unset($this->playerChunkListeners[$hash][spl_object_id($listener)]); } } } @@ -1224,13 +1226,14 @@ class World implements ChunkManager{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $tickerId = spl_object_id($ticker); if(isset($this->registeredTickingChunks[$chunkHash][$tickerId])){ - unset($this->registeredTickingChunks[$chunkHash][$tickerId]); - if(count($this->registeredTickingChunks[$chunkHash]) === 0){ + if(count($this->registeredTickingChunks[$chunkHash]) === 1){ unset( $this->registeredTickingChunks[$chunkHash], $this->recheckTickingChunks[$chunkHash], $this->validTickingChunks[$chunkHash] ); + }else{ + unset($this->registeredTickingChunks[$chunkHash][$tickerId]); } } } @@ -2645,9 +2648,10 @@ class World implements ChunkManager{ $pos = $this->entityLastKnownPositions[$entity->getId()]; $chunkHash = World::chunkHash($pos->getFloorX() >> Chunk::COORD_BIT_SIZE, $pos->getFloorZ() >> Chunk::COORD_BIT_SIZE); if(isset($this->entitiesByChunk[$chunkHash][$entity->getId()])){ - unset($this->entitiesByChunk[$chunkHash][$entity->getId()]); - if(count($this->entitiesByChunk[$chunkHash]) === 0){ + if(count($this->entitiesByChunk[$chunkHash]) === 1){ unset($this->entitiesByChunk[$chunkHash]); + }else{ + unset($this->entitiesByChunk[$chunkHash][$entity->getId()]); } } unset($this->entityLastKnownPositions[$entity->getId()]); @@ -2680,9 +2684,10 @@ class World implements ChunkManager{ if($oldChunkX !== $newChunkX || $oldChunkZ !== $newChunkZ){ $oldChunkHash = World::chunkHash($oldChunkX, $oldChunkZ); if(isset($this->entitiesByChunk[$oldChunkHash][$entity->getId()])){ - unset($this->entitiesByChunk[$oldChunkHash][$entity->getId()]); - if(count($this->entitiesByChunk[$oldChunkHash]) === 0){ + if(count($this->entitiesByChunk[$oldChunkHash]) === 1){ unset($this->entitiesByChunk[$oldChunkHash]); + }else{ + unset($this->entitiesByChunk[$oldChunkHash][$entity->getId()]); } } From 2c17f82eb89adcbcaf58dcaf122dc62b73bb9f9a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 16:37:46 +0000 Subject: [PATCH 1492/1858] Release 5.7.1 --- changelogs/5.7.md | 7 +++++++ src/VersionInfo.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelogs/5.7.md b/changelogs/5.7.md index 65830c2204..9134f299e2 100644 --- a/changelogs/5.7.md +++ b/changelogs/5.7.md @@ -18,3 +18,10 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Fixed `cartography_table`, `smithing_table`, `stripped_cherry_log` and `stripped_cherry_wood` not working in `StringToItemParser`. - Fixed `Promise::onCompletion()` always calling the reject handler if the promise was already completed. + +# 5.7.1 +Released 1st November 2023. + +## Fixes +- Fixed non-reentrant-safe code in `PermissionManager` and various other subscriber subsystems. + - These issues caused server crashes when deleting a subscriber indirectly triggered the deletion of other subscribers (e.g. due to the GC activating in `unset()`). diff --git a/src/VersionInfo.php b/src/VersionInfo.php index e6cae5059c..2033dc9dad 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.7.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 55f3477ed99c55c0c1582dcfbd298cb1cd90f9c5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 16:37:46 +0000 Subject: [PATCH 1493/1858] 5.7.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 2033dc9dad..365411cc2e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.7.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.7.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From e20c031aa1c7b64c40fddf1e4858e939bd7d441a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 17:49:53 +0000 Subject: [PATCH 1494/1858] Release 5.8.0 --- changelogs/5.8.md | 114 ++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +- 2 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.8.md diff --git a/changelogs/5.8.md b/changelogs/5.8.md new file mode 100644 index 0000000000..48f333cd1b --- /dev/null +++ b/changelogs/5.8.md @@ -0,0 +1,114 @@ +# 5.8.0 +Released 1st November 2023. + +**For Minecraft: Bedrock Edition 1.20.40** + +This is a minor feature release, including new gameplay features, various performance improvements to internal `World` and `Block` systems, and changes to the API. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Neighbour block updates now have a separate timer for timings. Previously, these were counted under `Scheduled Block Updates`, which was misleading. + +## Performance +- `LightUpdate` now avoids attempting to propagate back in the same direction the light came from. This produces a small performance improvement of around 6% in light propagation. +- Improved worst-case (non-cached) performance of `World::getCollisionBlocks()` (and its successor `World::getBlockCollisionBlocks()`). + - While 5.5.0 introduced caching at the `World` level for AABBs, the cache was rarely useful due to entity and player movement being too unpredictable. This meant that most users saw a performance degradation with lots of moving entities, except in specific situations. + - Performance for fetching non-cached AABBs for a cell is now improved by 2x. Overall performance benefit to a server depends on the number of entities and players. +- Added cache for hydrated farmland blocks to remember the last known location of nearby water. + - If nearby water sources are not changed, this cache allows hydrated farmland to completely avoid checking up to 161 nearby blocks for water after the first check. + - Tests with large wheat farms showed a 25% performance improvement in overall server performance compared to previous 5.x versions. +- Migrated various internal enums to native PHP 8.1 enums. Bypassing magic `__callStatic()` accessors improved performance in many areas, although it's hard to quantify the exact benefit. +- Made use of `Facing::OFFSET` constant in various places to avoid unnecessary `Vector3` and `Position` object allocations. Many pathways benefit from this, including neighbour block updates (due to faster `Block::getSide()` and less useless objects). +- Avoided clearing block AABB caches except when strictly necessary. Previously, the cache was wiped every time blocks were read from the world, making them mostly useless. +- Avoided random updates on blocks which have reached their final state, such as fully-grown crops. This produces a minimal performance improvement. +- Removed useless checks in some `World` hot paths. + +## API +### General +- All enums have been migrated to native PHP 8.1 enums. + - For now, the old APIs and accessors are still usable (via `LegacyEnumShimTrait`), but these will be removed in the next major release. + - `EnumTrait` has been deprecated, and will be removed in the next major release. + - Migration for most plugin developers will simply involve deleting `()` from the end of enum case usages, which is a trivial change and also improves performance. + - Plugin usages of `EnumTrait` are encouraged to move to native enums, optionally using `LegacyEnumShimTrait` to provide backwards compatibility. + - See [this code](https://github.com/pmmp/PocketMine-MP/blob/9832fe899f13a8ea47cc9d73de7088f7775a12f5/src/block/utils/DyeColor.php#L85-L107) for an example of how to associate properties with enum cases (since native enums don't support this directly). + - Thanks to improvements in `RuntimeDataDescriber`, any native enum can now be used as a custom block's state property. + +### `pocketmine\block` +- The following classes have been added: + - `utils\AgeableTrait` - used by blocks which have an age property, such as crops + - `utils\StaticSupportTrait` - used by blocks which have the same support requirements regardless of their state, such as crops + +### `pocketmine\data\runtime` +- The following API methods have been added: + - `public RuntimeDataDescriber->boundedIntAuto(int $min, int $max, int &$value) : void` - similar to `boundedInt()`, but automatically calculates the needed number of bits based on the given min/max + - `public RuntimeDataDescriber->enum(T extends \UnitEnum &$case) : void` - describes any native PHP 8.1 enum case + - `public RuntimeDataDescriber->enumSet(array &$set, array $allCases) : void` - describes a set of enum cases (similar to bitflags) +- The following API methods have been deprecated: + - `RuntimeDataDescriber->bellAttachmentType()` - use `enum()` instead + - `RuntimeDataDescriber->boundedInt()` - use `boundedIntAuto()` instead + - `RuntimeDataDescriber->brewingStandSlots()` - use `enumSet()` instead + - `RuntimeDataDescriber->copperOxidation()` - use `enum()` instead + - `RuntimeDataDescriber->coralType()` - use `enum()` instead + - `RuntimeDataDescriber->dirtType()` - use `enum()` instead + - `RuntimeDataDescriber->dripleafState()` - use `enum()` instead + - `RuntimeDataDescriber->dyeColor()` - use `enum()` instead + - `RuntimeDataDescriber->froglightType()` - use `enum()` instead + - `RuntimeDataDescriber->leverFacing()` - use `enum()` instead + - `RuntimeDataDescriber->medicineType()` - use `enum()` instead + - `RuntimeDataDescriber->mobHeadType()` - use `enum()` instead + - `RuntimeDataDescriber->mushroomBlockType()` - use `enum()` instead + - `RuntimeDataDescriber->potionType()` - use `enum()` instead + - `RuntimeDataDescriber->slabType()` - use `enum()` instead + - `RuntimeDataDescriber->suspiciousStewType()` - use `enum()` instead + +### `pocketmine\player` +- `TitleID` is now included in `PlayerInfo` metadata for plugin consumption. + +### `pocketmine\world` +- The following API methods have been added: + - `public World->getBlockCollisionBoxes(AxisAlignedBB $bb) : list` - similar to `getCollisionBoxes` but exclusively for blocks, avoiding the need for conditionally useless parameters +- The following API methods have been deprecated: + - `World->getCollisionBoxes()` - use `getBlockCollisionBoxes()` instead (alongside `getCollidingEntities()` if entity collision boxes are also required) + +### `pocketmine\utils` +- The following classes have been deprecated: + - `EnumTrait` - use native PHP 8.1 enums instead +- The following classes have been added: + - `LegacyEnumShimTrait` - can be `use`d by native PHP 8.1 enums to provide the same API as `EnumTrait` + +## Gameplay +### Blocks +- Implemented the following blocks: + - Amethyst + - Amethyst Cluster + - Chiseled Bookshelf + - Crimson Roots + - Pitcher Crop + - Pitcher Plant + - Torchflower + - Torchflower Crop + - Warped Roots + +### Items +- Implemented the following items: + - Pitcher Pod + - Torchflower Seeds + +## Internals +- `Farmland` block now has an extra property (`waterPositionIndex`) stored in its blockstate ID to track the position of nearby water. This property is not saved to disk, and is only used for caching. +- The format of internal blockstate ID has been updated. + - The lower `11` bits are now reserved for state data (previously `8` bits). This increase facilitates the new cache for `Farmland` blocks. + - The state data bits are now XOR'd with the `xxh3` of the block's type ID, instead of being directly XOR'd with the type ID. + - This XOR improves the distribution of the lower bits of the blockstate ID, which is important for hashtable indexing to minimize collisions. + - Previously, the lower bits were XOR'd with the type ID directly, but the effectiveness of this reduced as more state data bits were added. + - `xxh3` produces consistently good results for this purpose regardless of the number of state data bits allocated. + - Hash collisions with blockstate IDs are reduced by 50% with this change, which is a happy side effect. + - This is backwards-incompatible, so anyone saving internal blockstate IDs on disk or in a DB will be burned by this change (though they shouldn't have been doing that anyway). +- Removed code generation step for `RuntimeDataDescriber` enum serialization. All described enums now use PHP 8.1 native enums, which can be described without codegen using `RuntimeDataDescriber->enum()`. +- Added `DeprecatedLegacyEnumAccessRule` custom PHPStan rule to flag legacy `EnumTrait` case accessors. +- Cleaned up remaining hardcoded `Config` keys in `SetupWizard`. These usages now use auto-generated constants like the rest of the codebase. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 365411cc2e..de6d3003e9 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.7.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.8.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 68c6b87678d87e9ff8fa74c1a522daee3ca541d0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 17:49:56 +0000 Subject: [PATCH 1495/1858] 5.8.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index de6d3003e9..fd39bd3a82 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.8.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.8.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 75a39491be5a807f35286de025afa0a56faf1efb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 17:55:22 +0000 Subject: [PATCH 1496/1858] Release 5.8.1 --- changelogs/5.8.md | 5 +++++ src/VersionInfo.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/changelogs/5.8.md b/changelogs/5.8.md index 48f333cd1b..0e712a092a 100644 --- a/changelogs/5.8.md +++ b/changelogs/5.8.md @@ -1,6 +1,11 @@ # 5.8.0 Released 1st November 2023. +**Borked release, forgot to merge branches.** + +# 5.8.1 +Released 1st November 2023. + **For Minecraft: Bedrock Edition 1.20.40** This is a minor feature release, including new gameplay features, various performance improvements to internal `World` and `Block` systems, and changes to the API. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index fd39bd3a82..4c754d428a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.8.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 07dff9c9e80bce3884cf9c5341d7cf43b781a598 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 17:55:23 +0000 Subject: [PATCH 1497/1858] 5.8.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4c754d428a..e24d434944 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.8.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.8.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8aaa6dd176d7c55c187424cf8ea58b377b98fbd0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Nov 2023 14:47:55 +0000 Subject: [PATCH 1498/1858] Stem: do not disable ticking when the stem is not attached to a pumpkin fixes #6131 --- src/block/Stem.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/Stem.php b/src/block/Stem.php index 7223572dd4..73864ff694 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -58,6 +58,10 @@ abstract class Stem extends Crops{ parent::onNearbyBlockChange(); } + public function ticksRandomly() : bool{ + return $this->age < self::MAX_AGE || $this->facing === Facing::UP; + } + public function onRandomTick() : void{ if($this->facing === Facing::UP && mt_rand(0, 2) === 1){ $world = $this->position->getWorld(); From 1e4a1565bb7aca234f24460b9725d00d0ce998b8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Nov 2023 14:48:45 +0000 Subject: [PATCH 1499/1858] Stem: fixed not attaching to grown pumpkin/melon no idea how this got missed ... --- src/block/Stem.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/block/Stem.php b/src/block/Stem.php index 73864ff694..d7bf8a51a6 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -80,7 +80,9 @@ abstract class Stem extends Crops{ $facing = Facing::HORIZONTAL[array_rand(Facing::HORIZONTAL)]; $side = $this->getSide($facing); if($side->getTypeId() === BlockTypeIds::AIR && $side->getSide(Facing::DOWN)->hasTypeTag(BlockTypeTags::DIRT)){ - BlockEventHelper::grow($side, $grow, null); + if(BlockEventHelper::grow($side, $grow, null)){ + $this->position->getWorld()->setBlock($this->position, $this->setFacing($facing)); + } } } } From 109673382d213222fcf18b0d08ae18b73a3e1e51 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Nov 2023 15:16:11 +0000 Subject: [PATCH 1500/1858] Implemented modifiers for crop growth speed closes #6070 there are some unresolved questions about the growth speed of beetroots, pitcher plants and torchflower crops, but that's a topic for another commit. this change also doesn't account for the light levels. --- src/block/Crops.php | 3 +- src/block/DoublePitcherCrop.php | 5 +- src/block/PitcherCrop.php | 5 +- src/block/Stem.php | 3 +- src/block/TorchflowerCrop.php | 4 +- src/block/utils/CropGrowthHelper.php | 105 +++++++++++++++++++++++++++ 6 files changed, 115 insertions(+), 10 deletions(-) create mode 100644 src/block/utils/CropGrowthHelper.php diff --git a/src/block/Crops.php b/src/block/Crops.php index 350268863d..e90ac62367 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\CropGrowthHelper; use pocketmine\block\utils\StaticSupportTrait; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -66,7 +67,7 @@ abstract class Crops extends Flowable{ } public function onRandomTick() : void{ - if($this->age < self::MAX_AGE && mt_rand(0, 2) === 1){ + if($this->age < self::MAX_AGE && CropGrowthHelper::canGrow($this)){ $block = clone $this; ++$block->age; BlockEventHelper::grow($this, $block, null); diff --git a/src/block/DoublePitcherCrop.php b/src/block/DoublePitcherCrop.php index db700a625e..e34dd1bafe 100644 --- a/src/block/DoublePitcherCrop.php +++ b/src/block/DoublePitcherCrop.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; +use pocketmine\block\utils\CropGrowthHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -34,7 +35,6 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use function mt_rand; final class DoublePitcherCrop extends DoublePlant{ use AgeableTrait { @@ -101,9 +101,8 @@ final class DoublePitcherCrop extends DoublePlant{ } public function onRandomTick() : void{ - //TODO: the growth speed is influenced by farmland and nearby crops //only the bottom half of the plant can grow randomly - if(mt_rand(0, 2) === 0 && !$this->top){ + if(CropGrowthHelper::canGrow($this) && !$this->top){ $this->grow(null); } } diff --git a/src/block/PitcherCrop.php b/src/block/PitcherCrop.php index 2d9a021620..e0b9af3d27 100644 --- a/src/block/PitcherCrop.php +++ b/src/block/PitcherCrop.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\CropGrowthHelper; use pocketmine\block\utils\StaticSupportTrait; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -35,7 +36,6 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use function mt_rand; final class PitcherCrop extends Flowable{ use AgeableTrait; @@ -97,8 +97,7 @@ final class PitcherCrop extends Flowable{ } public function onRandomTick() : void{ - //TODO: the growth speed is influenced by farmland and nearby crops - if(mt_rand(0, 2) === 0){ + if(CropGrowthHelper::canGrow($this)){ $this->grow(null); } } diff --git a/src/block/Stem.php b/src/block/Stem.php index d7bf8a51a6..2ac95aa3f1 100644 --- a/src/block/Stem.php +++ b/src/block/Stem.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\CropGrowthHelper; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -63,7 +64,7 @@ abstract class Stem extends Crops{ } public function onRandomTick() : void{ - if($this->facing === Facing::UP && mt_rand(0, 2) === 1){ + if($this->facing === Facing::UP && CropGrowthHelper::canGrow($this)){ $world = $this->position->getWorld(); if($this->age < self::MAX_AGE){ $block = clone $this; diff --git a/src/block/TorchflowerCrop.php b/src/block/TorchflowerCrop.php index 75efe142b2..033b08552e 100644 --- a/src/block/TorchflowerCrop.php +++ b/src/block/TorchflowerCrop.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\CropGrowthHelper; use pocketmine\block\utils\StaticSupportTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; @@ -32,7 +33,6 @@ use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use function mt_rand; final class TorchflowerCrop extends Flowable{ use StaticSupportTrait; @@ -79,7 +79,7 @@ final class TorchflowerCrop extends Flowable{ } public function onRandomTick() : void{ - if(mt_rand(0, 2) === 1){ + if(CropGrowthHelper::canGrow($this)){ BlockEventHelper::grow($this, $this->getNextState(), null); } } diff --git a/src/block/utils/CropGrowthHelper.php b/src/block/utils/CropGrowthHelper.php new file mode 100644 index 0000000000..2f2cc1ed3b --- /dev/null +++ b/src/block/utils/CropGrowthHelper.php @@ -0,0 +1,105 @@ +getPosition(); + + $world = $position->getWorld(); + $baseX = $position->getFloorX(); + $baseY = $position->getFloorY(); + $baseZ = $position->getFloorZ(); + + $farmland = $world->getBlockAt($baseX, $baseY - 1, $baseZ); + + if($farmland instanceof Farmland){ + $result += $farmland->getWetness() > 0 ? self::ON_HYDRATED_FARMLAND_BONUS : self::ON_DRY_FARMLAND_BONUS; + } + + $xRow = false; + $zRow = false; + $diagonalRow = false; + for($x = -1; $x <= 1; $x++){ + for($z = -1; $z <= 1; $z++){ + if($x === 0 && $z === 0){ + continue; + } + $nextFarmland = $world->getBlockAt($baseX + $x, $baseY - 1, $baseZ + $z); + + if($nextFarmland instanceof Farmland){ + $result += $nextFarmland->getWetness() > 0 ? self::ADJACENT_HYDRATED_FARMLAND_BONUS : self::ADJACENT_DRY_FARMLAND_BONUS; + } + + $nextCrop = $world->getBlockAt($baseX + $x, $baseY, $baseZ + $z); + if($nextCrop->hasSameTypeId($block)){ + match(0){ + $x => $xRow = true, + $z => $zRow = true, + default => $diagonalRow = true, + }; + } + } + } + + //crops can be arranged in rows, but the rows must not cross and must be spaced apart by at least one block + if(($xRow && $zRow) || $diagonalRow){ + $result /= self::IMPROPER_ARRANGEMENT_DIVISOR; + } + + return $result; + } + + public static function canGrow(Block $block) : bool{ + //while it may be tempting to use mt_rand(0, 25) < multiplier, this would make crops grow a bit faster than + //vanilla in most cases due to the remainder of 25 / multiplier not being discarded + return mt_rand(0, (int) (25 / self::calculateMultiplier($block))) === 0; + } +} From a6b36d6c3cc83c4d02320d332c7dfbbeba0d34dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Nov 2023 15:32:22 +0000 Subject: [PATCH 1501/1858] CropGrowthHelper: avoid unnecessary checks --- src/block/utils/CropGrowthHelper.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/block/utils/CropGrowthHelper.php b/src/block/utils/CropGrowthHelper.php index 2f2cc1ed3b..446c00887f 100644 --- a/src/block/utils/CropGrowthHelper.php +++ b/src/block/utils/CropGrowthHelper.php @@ -66,7 +66,8 @@ final class CropGrowthHelper{ $xRow = false; $zRow = false; - $diagonalRow = false; + $improperArrangement = false; + for($x = -1; $x <= 1; $x++){ for($z = -1; $z <= 1; $z++){ if($x === 0 && $z === 0){ @@ -74,23 +75,27 @@ final class CropGrowthHelper{ } $nextFarmland = $world->getBlockAt($baseX + $x, $baseY - 1, $baseZ + $z); - if($nextFarmland instanceof Farmland){ - $result += $nextFarmland->getWetness() > 0 ? self::ADJACENT_HYDRATED_FARMLAND_BONUS : self::ADJACENT_DRY_FARMLAND_BONUS; + if(!$nextFarmland instanceof Farmland){ + continue; } - $nextCrop = $world->getBlockAt($baseX + $x, $baseY, $baseZ + $z); - if($nextCrop->hasSameTypeId($block)){ - match(0){ - $x => $xRow = true, - $z => $zRow = true, - default => $diagonalRow = true, - }; + $result += $nextFarmland->getWetness() > 0 ? self::ADJACENT_HYDRATED_FARMLAND_BONUS : self::ADJACENT_DRY_FARMLAND_BONUS; + + if(!$improperArrangement){ + $nextCrop = $world->getBlockAt($baseX + $x, $baseY, $baseZ + $z); + if($nextCrop->hasSameTypeId($block)){ + match(0){ + $x => $zRow ? $improperArrangement = true : $xRow = true, + $z => $xRow ? $improperArrangement = true : $zRow = true, + default => $improperArrangement = true, + }; + } } } } //crops can be arranged in rows, but the rows must not cross and must be spaced apart by at least one block - if(($xRow && $zRow) || $diagonalRow){ + if($improperArrangement){ $result /= self::IMPROPER_ARRANGEMENT_DIVISOR; } From d3b7861d1ac81e5c7e9542961529d1e147742906 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Nov 2023 16:15:57 +0000 Subject: [PATCH 1502/1858] Constify bootstrap options --- src/BootstrapOptions.php | 48 ++++++++++++++++++++++++++++++++++++++++ src/PocketMine.php | 12 +++++----- 2 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 src/BootstrapOptions.php diff --git a/src/BootstrapOptions.php b/src/BootstrapOptions.php new file mode 100644 index 0000000000..879c502a69 --- /dev/null +++ b/src/BootstrapOptions.php @@ -0,0 +1,48 @@ +run()){ $exitCode = -1; From 3385087c569744e314b9171ab87629488fd54371 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sat, 4 Nov 2023 13:57:53 +0300 Subject: [PATCH 1503/1858] Fix Iron & Gold ores not affected by fortune (#6134) --- src/block/GoldOre.php | 3 ++- src/block/IronOre.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/block/GoldOre.php b/src/block/GoldOre.php index ae26d8b4e2..75374c1b05 100644 --- a/src/block/GoldOre.php +++ b/src/block/GoldOre.php @@ -23,13 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; final class GoldOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ - return [VanillaItems::RAW_GOLD()]; + return [VanillaItems::RAW_GOLD()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1))]; } public function isAffectedBySilkTouch() : bool{ return true; } diff --git a/src/block/IronOre.php b/src/block/IronOre.php index 8d7e9bd3f5..11c8cc2995 100644 --- a/src/block/IronOre.php +++ b/src/block/IronOre.php @@ -23,13 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\FortuneDropHelper; use pocketmine\item\Item; use pocketmine\item\VanillaItems; final class IronOre extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ - return [VanillaItems::RAW_IRON()]; + return [VanillaItems::RAW_IRON()->setCount(FortuneDropHelper::weighted($item, min: 1, maxBase: 1))]; } public function isAffectedBySilkTouch() : bool{ return true; } From 1055b7580a54f67ef5a18ef0af702f07e755088c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:00:06 +0000 Subject: [PATCH 1504/1858] Bump phpstan/phpstan from 1.10.40 to 1.10.41 (#6139) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.40 to 1.10.41. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.40...1.10.41) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 2f0b687302..c7bfd7d27f 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.40", + "phpstan/phpstan": "1.10.41", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 4c9588263c..2888a32912 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ca499c3c5acafac837f7384ecdae136e", + "content-hash": "5c19f4766fd04be0cbd38d9f4681864e", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.40", + "version": "1.10.41", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d" + "reference": "c6174523c2a69231df55bdc65b61655e72876d76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/93c84b5bf7669920d823631e39904d69b9c7dc5d", - "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6174523c2a69231df55bdc65b61655e72876d76", + "reference": "c6174523c2a69231df55bdc65b61655e72876d76", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-10-30T14:48:31+00:00" + "time": "2023-11-05T12:57:57+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -2964,5 +2964,5 @@ "platform-overrides": { "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 9fc9609694c1b10ee468a01b657667f0efe62eb3 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 6 Nov 2023 18:01:43 +0300 Subject: [PATCH 1505/1858] Fix ancient debris not being fireproof (#6138) --- src/block/VanillaBlocks.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 8349f70c06..67a77c183b 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -1495,7 +1495,9 @@ final class VanillaBlocks{ //for some reason, slabs have weird hardness like the legacy ones $slabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("ancient_debris", new Opaque(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND, 3600.0)))); + self::register("ancient_debris", new class(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND, 3600.0))) extends Opaque{ + public function isFireProofAsItem() : bool{ return true; } + }); $netheriteBreakInfo = new Info(BreakInfo::pickaxe(50, ToolTier::DIAMOND, 3600.0)); self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } From 457660235e69668b0c92b484e619c7ed2082cd5e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Nov 2023 16:02:57 +0000 Subject: [PATCH 1506/1858] Crops must have access to a light level of at least 9 --- src/block/utils/CropGrowthHelper.php | 12 ++++++++- src/world/World.php | 38 ++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/block/utils/CropGrowthHelper.php b/src/block/utils/CropGrowthHelper.php index 446c00887f..b5fc31362f 100644 --- a/src/block/utils/CropGrowthHelper.php +++ b/src/block/utils/CropGrowthHelper.php @@ -36,6 +36,8 @@ final class CropGrowthHelper{ private const IMPROPER_ARRANGEMENT_DIVISOR = 2; + private const MIN_LIGHT_LEVEL = 9; + private function __construct(){ //NOOP } @@ -102,9 +104,17 @@ final class CropGrowthHelper{ return $result; } + public static function hasEnoughLight(Block $block, int $minLevel = self::MIN_LIGHT_LEVEL) : bool{ + $position = $block->getPosition(); + $world = $position->getWorld(); + + //crop growth is not affected by time of day since 1.11 or so + return $world->getPotentialLight($position) >= $minLevel; + } + public static function canGrow(Block $block) : bool{ //while it may be tempting to use mt_rand(0, 25) < multiplier, this would make crops grow a bit faster than //vanilla in most cases due to the remainder of 25 / multiplier not being discarded - return mt_rand(0, (int) (25 / self::calculateMultiplier($block))) === 0; + return mt_rand(0, (int) (25 / self::calculateMultiplier($block))) === 0 && self::hasEnoughLight($block); } } diff --git a/src/world/World.php b/src/world/World.php index 3e11312721..59b02be1ab 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1666,16 +1666,16 @@ class World implements ChunkManager{ } /** - * Returns the highest available level of any type of light at the given coordinates, adjusted for the current - * weather and time of day. + * Returns the highest level of any type of light at the given coordinates, adjusted for the current weather and + * time of day. */ public function getFullLight(Vector3 $pos) : int{ return $this->getFullLightAt($pos->x, $pos->y, $pos->z); } /** - * Returns the highest available level of any type of light at the given coordinates, adjusted for the current - * weather and time of day. + * Returns the highest level of any type of light at the given coordinates, adjusted for the current weather and + * time of day. */ public function getFullLightAt(int $x, int $y, int $z) : int{ $skyLight = $this->getRealBlockSkyLightAt($x, $y, $z); @@ -1687,18 +1687,40 @@ class World implements ChunkManager{ } /** - * Returns the highest available level of any type of light at, or adjacent to, the given coordinates, adjusted for - * the current weather and time of day. + * Returns the highest level of any type of light at, or adjacent to, the given coordinates, adjusted for the + * current weather and time of day. */ public function getHighestAdjacentFullLightAt(int $x, int $y, int $z) : int{ return $this->getHighestAdjacentLight($x, $y, $z, $this->getFullLightAt(...)); } + /** + * Returns the highest potential level of any type of light at the target coordinates. + * This is not affected by weather or time of day. + */ + public function getPotentialLight(Vector3 $pos) : int{ + return $this->getPotentialLightAt($pos->x, $pos->y, $pos->z); + } + + /** + * Returns the highest potential level of any type of light at the target coordinates. + * This is not affected by weather or time of day. + */ + public function getPotentialLightAt(int $x, int $y, int $z) : int{ + return max($this->getPotentialBlockSkyLightAt($x, $y, $z), $this->getBlockLightAt($x, $y, $z)); + } + + /** + * Returns the highest potential level of any type of light at, or adjacent to, the given coordinates. + * This is not affected by weather or time of day. + */ + public function getHighestAdjacentPotentialLightAt(int $x, int $y, int $z) : int{ + return $this->getHighestAdjacentLight($x, $y, $z, $this->getPotentialLightAt(...)); + } + /** * Returns the highest potential level of sky light at the target coordinates, regardless of the time of day or * weather conditions. - * You usually don't want to use this for vanilla gameplay logic; prefer the real sky light instead. - * @see World::getRealBlockSkyLightAt() * * @return int 0-15 */ From bbe66e8e0982d9c0efc47d991fad7ad89ac5a661 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Nov 2023 17:04:39 +0000 Subject: [PATCH 1507/1858] Block: Improve performance of encodeFullState() if there's no state data to encode, we can avoid useless calls and object allocations. For the best cases (blocks which don't use state data at all) this improves the performance of getStateId() by more than 10x. Blocks which use one or the other benefit by a smaller but still significant margin. --- src/block/Block.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index a1d553b9d1..b2847bb358 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -270,11 +270,22 @@ class Block{ } private function encodeFullState() : int{ - $writer = new RuntimeDataWriter($this->requiredBlockItemStateDataBits + $this->requiredBlockOnlyStateDataBits); - $writer->writeInt($this->requiredBlockItemStateDataBits, $this->encodeBlockItemState()); - $writer->writeInt($this->requiredBlockOnlyStateDataBits, $this->encodeBlockOnlyState()); + $blockItemBits = $this->requiredBlockItemStateDataBits; + $blockOnlyBits = $this->requiredBlockOnlyStateDataBits; - return $writer->getValue(); + if($blockOnlyBits === 0 && $blockItemBits === 0){ + return 0; + } + + $result = 0; + if($blockItemBits > 0){ + $result |= $this->encodeBlockItemState(); + } + if($blockOnlyBits > 0){ + $result |= $this->encodeBlockOnlyState() << $blockItemBits; + } + + return $result; } /** From d09af2e30da6b393dfeb47f1e5cd2f2f5417f5bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 6 Nov 2023 17:15:17 +0000 Subject: [PATCH 1508/1858] World: don't assume that random Vector3 are int vectors we can safely assume this for blocks (though the type info doesn't reflect it) but this is not safe to assume for random APIs that might be used by plugins. --- src/block/utils/CropGrowthHelper.php | 2 +- src/world/World.php | 10 ++++++-- tests/phpstan/configs/actual-problems.neon | 30 +++++++++++----------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/block/utils/CropGrowthHelper.php b/src/block/utils/CropGrowthHelper.php index b5fc31362f..e85b0b82d3 100644 --- a/src/block/utils/CropGrowthHelper.php +++ b/src/block/utils/CropGrowthHelper.php @@ -109,7 +109,7 @@ final class CropGrowthHelper{ $world = $position->getWorld(); //crop growth is not affected by time of day since 1.11 or so - return $world->getPotentialLight($position) >= $minLevel; + return $world->getPotentialLightAt($position->x, $position->y, $position->z) >= $minLevel; } public static function canGrow(Block $block) : bool{ diff --git a/src/world/World.php b/src/world/World.php index 59b02be1ab..f554479c9b 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1670,7 +1670,10 @@ class World implements ChunkManager{ * time of day. */ public function getFullLight(Vector3 $pos) : int{ - return $this->getFullLightAt($pos->x, $pos->y, $pos->z); + $floorX = $pos->getFloorX(); + $floorY = $pos->getFloorY(); + $floorZ = $pos->getFloorZ(); + return $this->getFullLightAt($floorX, $floorY, $floorZ); } /** @@ -1699,7 +1702,10 @@ class World implements ChunkManager{ * This is not affected by weather or time of day. */ public function getPotentialLight(Vector3 $pos) : int{ - return $this->getPotentialLightAt($pos->x, $pos->y, $pos->z); + $floorX = $pos->getFloorX(); + $floorY = $pos->getFloorY(); + $floorZ = $pos->getFloorZ(); + return $this->getPotentialLightAt($floorX, $floorY, $floorZ); } /** diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index cf7e9b02f9..1e5d83dda9 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -425,6 +425,21 @@ parameters: count: 3 path: ../../../src/block/tile/Spawnable.php + - + message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getPotentialLightAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/utils/CropGrowthHelper.php + + - + message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getPotentialLightAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/utils/CropGrowthHelper.php + + - + message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getPotentialLightAt\\(\\) expects int, float\\|int given\\.$#" + count: 1 + path: ../../../src/block/utils/CropGrowthHelper.php + - message: "#^Cannot call method addParticle\\(\\) on pocketmine\\\\world\\\\World\\|null\\.$#" count: 1 @@ -910,11 +925,6 @@ parameters: count: 1 path: ../../../src/world/World.php - - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getFullLightAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/world/World.php - - message: "#^Parameter \\#1 \\$x of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -940,11 +950,6 @@ parameters: count: 1 path: ../../../src/world/World.php - - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getFullLightAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/world/World.php - - message: "#^Parameter \\#2 \\$y of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -975,11 +980,6 @@ parameters: count: 1 path: ../../../src/world/World.php - - - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getFullLightAt\\(\\) expects int, float\\|int given\\.$#" - count: 1 - path: ../../../src/world/World.php - - message: "#^Parameter \\#3 \\$z of method pocketmine\\\\world\\\\World\\:\\:getTileAt\\(\\) expects int, float\\|int given\\.$#" count: 1 From 6b5c4059396baaa990e033f4f29e2173796507cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:06:43 +0000 Subject: [PATCH 1509/1858] Bump shivammathur/setup-php from 2.26.0 to 2.27.1 (#6142) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.26.0 to 2.27.1. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.26.0...2.27.1) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 94b7bb99d0..f731130981 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.26.0 + uses: shivammathur/setup-php@2.27.1 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index f7026c6468..03bfedc898 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.26.0 + uses: shivammathur/setup-php@2.27.1 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1fd1731a2f..c57cecb841 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -173,7 +173,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.26.0 + uses: shivammathur/setup-php@2.27.1 with: php-version: 8.1 tools: php-cs-fixer:3.17 From 8ccaf907d1dfca4459d01a5fa7694d8938156995 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Nov 2023 15:18:46 +0000 Subject: [PATCH 1510/1858] tools/generate-blockstate-upgrade-schema: do not optimize state remaps with unchanged IDs processRemappedStates() needs to know about the full set of states to generate reliable mappings. Without it, it may generate flattening rules or state matching criteria that unintentionally match states that it's not aware of. Sadly, this does make some schemas bigger, but it's for the best. --- tools/generate-blockstate-upgrade-schema.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index f247d61129..dfb8f6066b 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -37,7 +37,6 @@ use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; -use function array_filter; use function array_key_first; use function array_keys; use function array_map; @@ -481,16 +480,9 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad throw new \RuntimeException("States with the same ID should be fully consistent"); } }else{ - if(isset($newNameFound[$oldName])){ - //some of the states stayed under the same ID - we can process these as normal states - $stateGroup = array_filter($blockStateMappings, fn(BlockStateMapping $m) => $m->new->getName() === $oldName); - if(processStateGroup($oldName, $stateGroup, $result)){ - foreach(Utils::stringifyKeys($stateGroup) as $k => $mapping){ - unset($blockStateMappings[$k]); - } - } - } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap + //even if some of the states stay under the same ID, the compression techniques used by this function + //implicitly rely on knowing the full set of old states and their new transformations $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); } } From 5f3a2a5096fc2302512274cae1b64c523fd299f2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 8 Nov 2023 18:52:22 +0000 Subject: [PATCH 1511/1858] BlockStateUpgrader: fixed undefined array key when flattening a block whose new ID is the same as the old this came up during 1.20.50 testing, where minecraft:stone[stone_type=stone] continues to have an ID minecraft:stone without the stone_type property. This could have appeared in other ways, such as with an invalid legacy blockstate. --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 5c84cd383c..582039305c 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -86,7 +86,7 @@ final class BlockStateUpgrader{ if(is_string($remap->newName)){ $newName = $remap->newName; }else{ - $flattenedValue = $oldState[$remap->newName->flattenedProperty]; + $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; if($flattenedValue instanceof StringTag){ $newName = sprintf("%s%s%s", $remap->newName->prefix, $flattenedValue->getValue(), $remap->newName->suffix); unset($oldState[$remap->newName->flattenedProperty]); From c1ed182112313d4545accb50735e0ef5d6da0bab Mon Sep 17 00:00:00 2001 From: ace Date: Thu, 9 Nov 2023 22:22:37 +0800 Subject: [PATCH 1512/1858] Fix loading of sign text from vanilla world (#6122) --- src/block/tile/Sign.php | 56 +++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/block/tile/Sign.php b/src/block/tile/Sign.php index d5d314ee31..2ced414ff9 100644 --- a/src/block/tile/Sign.php +++ b/src/block/tile/Sign.php @@ -77,22 +77,30 @@ class Sign extends Spawnable{ parent::__construct($world, $pos); } + private function readTextTag(CompoundTag $nbt, bool $lightingBugResolved) : void{ + $baseColor = new Color(0, 0, 0); + $glowingText = false; + if(($baseColorTag = $nbt->getTag(self::TAG_TEXT_COLOR)) instanceof IntTag){ + $baseColor = Color::fromARGB(Binary::unsignInt($baseColorTag->getValue())); + } + if($lightingBugResolved && ($glowingTextTag = $nbt->getTag(self::TAG_GLOWING_TEXT)) instanceof ByteTag){ + //both of these must be 1 - if only one is set, it's a leftover from 1.16.210 experimental features + //see https://bugs.mojang.com/browse/MCPE-117835 + $glowingText = $glowingTextTag->getValue() !== 0; + } + $this->text = SignText::fromBlob(mb_scrub($nbt->getString(self::TAG_TEXT_BLOB), 'UTF-8'), $baseColor, $glowingText); + } + public function readSaveData(CompoundTag $nbt) : void{ - if(($textBlobTag = $nbt->getTag(self::TAG_TEXT_BLOB)) instanceof StringTag){ //MCPE 1.2 save format - $baseColor = new Color(0, 0, 0); - $glowingText = false; - if(($baseColorTag = $nbt->getTag(self::TAG_TEXT_COLOR)) instanceof IntTag){ - $baseColor = Color::fromARGB(Binary::unsignInt($baseColorTag->getValue())); + $frontTextTag = $nbt->getTag(self::TAG_FRONT_TEXT); + if($frontTextTag instanceof CompoundTag){ + $this->readTextTag($frontTextTag, true); + }elseif($nbt->getTag(self::TAG_TEXT_BLOB) instanceof StringTag){ //MCPE 1.2 save format + $lightingBugResolved = false; + if(($lightingBugResolvedTag = $nbt->getTag(self::TAG_LEGACY_BUG_RESOLVE)) instanceof ByteTag){ + $lightingBugResolved = $lightingBugResolvedTag->getValue() !== 0; } - if( - ($glowingTextTag = $nbt->getTag(self::TAG_GLOWING_TEXT)) instanceof ByteTag && - ($lightingBugResolvedTag = $nbt->getTag(self::TAG_LEGACY_BUG_RESOLVE)) instanceof ByteTag - ){ - //both of these must be 1 - if only one is set, it's a leftover from 1.16.210 experimental features - //see https://bugs.mojang.com/browse/MCPE-117835 - $glowingText = $glowingTextTag->getValue() !== 0 && $lightingBugResolvedTag->getValue() !== 0; - } - $this->text = SignText::fromBlob(mb_scrub($textBlobTag->getValue(), 'UTF-8'), $baseColor, $glowingText); + $this->readTextTag($nbt, $lightingBugResolved); }else{ $text = []; for($i = 0; $i < SignText::LINE_COUNT; ++$i){ @@ -107,15 +115,19 @@ class Sign extends Spawnable{ } protected function writeSaveData(CompoundTag $nbt) : void{ - $nbt->setString(self::TAG_TEXT_BLOB, implode("\n", $this->text->getLines())); + $nbt->setTag(self::TAG_FRONT_TEXT, CompoundTag::create() + ->setString(self::TAG_TEXT_BLOB, implode("\n", $this->text->getLines())) + ->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB())) + ->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0) + ->setByte(self::TAG_PERSIST_FORMATTING, 1) + ); + $nbt->setTag(self::TAG_BACK_TEXT, CompoundTag::create() + ->setString(self::TAG_TEXT_BLOB, "") + ->setInt(self::TAG_TEXT_COLOR, Binary::signInt(0xff_00_00_00)) + ->setByte(self::TAG_GLOWING_TEXT, 0) + ->setByte(self::TAG_PERSIST_FORMATTING, 1) + ); - for($i = 0; $i < SignText::LINE_COUNT; ++$i){ //Backwards-compatibility - $textKey = sprintf(self::TAG_TEXT_LINE, $i + 1); - $nbt->setString($textKey, $this->text->getLine($i)); - } - $nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB())); - $nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0); - $nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1); $nbt->setByte(self::TAG_WAXED, $this->waxed ? 1 : 0); } From 4103631bc10cf20e5dda5e2e85e63cccd9d848f0 Mon Sep 17 00:00:00 2001 From: pandaa-be <135014092+pandaa-be@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:25:49 +0100 Subject: [PATCH 1513/1858] Added Smithing Template items (#6132) --- .../ItemSerializerDeserializerRegistrar.php | 17 +++++++++ src/item/ItemTypeIds.php | 19 +++++++++- src/item/StringToItemParser.php | 17 +++++++++ src/item/VanillaItems.php | 38 +++++++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 6bb3a56b34..a2bed6ee11 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -193,6 +193,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::CLAY_BALL, Items::CLAY()); $this->map1to1Item(Ids::CLOCK, Items::CLOCK()); $this->map1to1Item(Ids::COAL, Items::COAL()); + $this->map1to1Item(Ids::COAST_ARMOR_TRIM_SMITHING_TEMPLATE, Items::COAST_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::COCOA_BEANS, Items::COCOA_BEANS()); $this->map1to1Item(Ids::COD, Items::RAW_FISH()); $this->map1to1Item(Ids::COMPASS, Items::COMPASS()); @@ -221,6 +222,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::DISC_FRAGMENT_5, Items::DISC_FRAGMENT_5()); $this->map1to1Item(Ids::DRAGON_BREATH, Items::DRAGON_BREATH()); $this->map1to1Item(Ids::DRIED_KELP, Items::DRIED_KELP()); + $this->map1to1Item(Ids::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::ECHO_SHARD, Items::ECHO_SHARD()); $this->map1to1Item(Ids::EGG, Items::EGG()); $this->map1to1Item(Ids::EMERALD, Items::EMERALD()); @@ -228,6 +230,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE()); $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL()); $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE()); + $this->map1to1Item(Ids::EYE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::FEATHER, Items::FEATHER()); $this->map1to1Item(Ids::FERMENTED_SPIDER_EYE, Items::FERMENTED_SPIDER_EYE()); $this->map1to1Item(Ids::FIRE_CHARGE, Items::FIRE_CHARGE()); @@ -257,6 +260,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::HEART_OF_THE_SEA, Items::HEART_OF_THE_SEA()); $this->map1to1Item(Ids::HONEY_BOTTLE, Items::HONEY_BOTTLE()); $this->map1to1Item(Ids::HONEYCOMB, Items::HONEYCOMB()); + $this->map1to1Item(Ids::HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::INK_SAC, Items::INK_SAC()); $this->map1to1Item(Ids::IRON_AXE, Items::IRON_AXE()); $this->map1to1Item(Ids::IRON_BOOTS, Items::IRON_BOOTS()); @@ -316,6 +320,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::NETHERITE_SCRAP, Items::NETHERITE_SCRAP()); $this->map1to1Item(Ids::NETHERITE_SHOVEL, Items::NETHERITE_SHOVEL()); $this->map1to1Item(Ids::NETHERITE_SWORD, Items::NETHERITE_SWORD()); + $this->map1to1Item(Ids::NETHERITE_UPGRADE_SMITHING_TEMPLATE, Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::OAK_BOAT, Items::OAK_BOAT()); $this->map1to1Item(Ids::OAK_SIGN, Items::OAK_SIGN()); $this->map1to1Item(Ids::PAINTING, Items::PAINTING()); @@ -335,18 +340,25 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::RABBIT_FOOT, Items::RABBIT_FOOT()); $this->map1to1Item(Ids::RABBIT_HIDE, Items::RABBIT_HIDE()); $this->map1to1Item(Ids::RABBIT_STEW, Items::RABBIT_STEW()); + $this->map1to1Item(Ids::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::RAW_COPPER, Items::RAW_COPPER()); $this->map1to1Item(Ids::RAW_GOLD, Items::RAW_GOLD()); $this->map1to1Item(Ids::RAW_IRON, Items::RAW_IRON()); $this->map1to1Item(Ids::REDSTONE, Items::REDSTONE_DUST()); + $this->map1to1Item(Ids::RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Items::RIB_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::ROTTEN_FLESH, Items::ROTTEN_FLESH()); $this->map1to1Item(Ids::SALMON, Items::RAW_SALMON()); $this->map1to1Item(Ids::SCUTE, Items::SCUTE()); + $this->map1to1Item(Ids::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE()); + $this->map1to1Item(Ids::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SHEARS, Items::SHEARS()); $this->map1to1Item(Ids::SHULKER_SHELL, Items::SHULKER_SHELL()); + $this->map1to1Item(Ids::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SLIME_BALL, Items::SLIMEBALL()); + $this->map1to1Item(Ids::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SNOWBALL, Items::SNOWBALL()); $this->map1to1Item(Ids::SPIDER_EYE, Items::SPIDER_EYE()); + $this->map1to1Item(Ids::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SPRUCE_BOAT, Items::SPRUCE_BOAT()); $this->map1to1Item(Ids::SPRUCE_SIGN, Items::SPRUCE_SIGN()); $this->map1to1Item(Ids::SPYGLASS, Items::SPYGLASS()); @@ -361,14 +373,19 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::SUGAR, Items::SUGAR()); $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES()); $this->map1to1Item(Ids::TORCHFLOWER_SEEDS, Items::TORCHFLOWER_SEEDS()); + $this->map1to1Item(Ids::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM()); $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH()); $this->map1to1Item(Ids::TURTLE_HELMET, Items::TURTLE_HELMET()); + $this->map1to1Item(Ids::VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Items::VEX_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG()); + $this->map1to1Item(Ids::WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN()); $this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET()); + $this->map1to1Item(Ids::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::WHEAT, Items::WHEAT()); $this->map1to1Item(Ids::WHEAT_SEEDS, Items::WHEAT_SEEDS()); + $this->map1to1Item(Ids::WILD_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WILD_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::WOODEN_AXE, Items::WOODEN_AXE()); $this->map1to1Item(Ids::WOODEN_HOE, Items::WOODEN_HOE()); $this->map1to1Item(Ids::WOODEN_PICKAXE, Items::WOODEN_PICKAXE()); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 4c2f0a1ec3..451d25a59d 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -305,8 +305,25 @@ final class ItemTypeIds{ public const CHERRY_SIGN = 20266; public const ENCHANTED_BOOK = 20267; public const TORCHFLOWER_SEEDS = 20268; + public const NETHERITE_UPGRADE_SMITHING_TEMPLATE = 20269; + public const SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE = 20270; + public const VEX_ARMOR_TRIM_SMITHING_TEMPLATE = 20271; + public const WILD_ARMOR_TRIM_SMITHING_TEMPLATE = 20272; + public const COAST_ARMOR_TRIM_SMITHING_TEMPLATE = 20273; + public const DUNE_ARMOR_TRIM_SMITHING_TEMPLATE = 20274; + public const WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE = 20275; + public const RAISER_ARMOR_TRIM_SMITHING_TEMPLATE = 20276; + public const SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE = 20277; + public const HOST_ARMOR_TRIM_SMITHING_TEMPLATE = 20278; + public const WARD_ARMOR_TRIM_SMITHING_TEMPLATE = 20279; + public const SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE = 20280; + public const TIDE_ARMOR_TRIM_SMITHING_TEMPLATE = 20281; + public const SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE = 20282; + public const RIB_ARMOR_TRIM_SMITHING_TEMPLATE = 20283; + public const EYE_ARMOR_TRIM_SMITHING_TEMPLATE = 20284; + public const SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE = 20285; - public const FIRST_UNUSED_ITEM_ID = 20269; + public const FIRST_UNUSED_ITEM_ID = 20286; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d4f2426216..8d78fcf953 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1264,6 +1264,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("clown_fish", fn() => Items::CLOWNFISH()); $result->register("clownfish", fn() => Items::CLOWNFISH()); $result->register("coal", fn() => Items::COAL()); + $result->register("coast_armor_trim_smithing_template", fn() => Items::COAST_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("cocoa_beans", fn() => Items::COCOA_BEANS()); $result->register("cod", fn() => Items::RAW_FISH()); $result->register("compass", fn() => Items::COMPASS()); @@ -1292,6 +1293,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("disc_fragment_5", fn() => Items::DISC_FRAGMENT_5()); $result->register("dragon_breath", fn() => Items::DRAGON_BREATH()); $result->register("dried_kelp", fn() => Items::DRIED_KELP()); + $result->register("dune_armor_trim_smithing_template", fn() => Items::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("dye", fn() => Items::INK_SAC()); $result->register("echo_shard", fn() => Items::ECHO_SHARD()); $result->register("egg", fn() => Items::EGG()); @@ -1302,6 +1304,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("ender_pearl", fn() => Items::ENDER_PEARL()); $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); + $result->register("eye_armor_trim_smithing_template", fn() => Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("eye_drops", fn() => Items::MEDICINE()->setType(MedicineType::EYE_DROPS)); $result->register("feather", fn() => Items::FEATHER()); $result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE()); @@ -1343,6 +1346,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("gunpowder", fn() => Items::GUNPOWDER()); $result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA()); $result->register("honey_bottle", fn() => Items::HONEY_BOTTLE()); + $result->register("host_armor_trim_smithing_template", fn() => Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("honeycomb", fn() => Items::HONEYCOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); $result->register("iron_axe", fn() => Items::IRON_AXE()); @@ -1396,6 +1400,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("netherite_shovel", fn() => Items::NETHERITE_SHOVEL()); $result->register("netherite_sword", fn() => Items::NETHERITE_SWORD()); $result->register("netherstar", fn() => Items::NETHER_STAR()); + $result->register("netherite_upgrade_smithing_template", fn() => Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE()); $result->register("oak_boat", fn() => Items::OAK_BOAT()); $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); @@ -1416,6 +1421,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("rabbit_foot", fn() => Items::RABBIT_FOOT()); $result->register("rabbit_hide", fn() => Items::RABBIT_HIDE()); $result->register("rabbit_stew", fn() => Items::RABBIT_STEW()); + $result->register("raiser_armor_trim_smithing_template", fn() => Items::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("raw_beef", fn() => Items::RAW_BEEF()); $result->register("raw_cod", fn() => Items::RAW_FISH()); $result->register("raw_copper", fn() => Items::RAW_COPPER()); @@ -1444,17 +1450,23 @@ final class StringToItemParser extends StringToTParser{ $result->register("record_ward", fn() => Items::RECORD_WARD()); $result->register("redstone", fn() => Items::REDSTONE_DUST()); $result->register("redstone_dust", fn() => Items::REDSTONE_DUST()); + $result->register("rib_armor_trim_smithing_template", fn() => Items::RIB_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("rotten_flesh", fn() => Items::ROTTEN_FLESH()); $result->register("salmon", fn() => Items::RAW_SALMON()); $result->register("scute", fn() => Items::SCUTE()); + $result->register("sentry_armor_trim_smithing_template", fn() => Items::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE()); + $result->register("shaper_armor_trim_smithing_template", fn() => Items::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("seeds", fn() => Items::WHEAT_SEEDS()); $result->register("shears", fn() => Items::SHEARS()); $result->register("shulker_shell", fn() => Items::SHULKER_SHELL()); + $result->register("silence_armor_trim_smithing_template", fn() => Items::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("slime_ball", fn() => Items::SLIMEBALL()); + $result->register("snout_armor_trim_smithing_template", fn() => Items::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("slimeball", fn() => Items::SLIMEBALL()); $result->register("snowball", fn() => Items::SNOWBALL()); $result->register("speckled_melon", fn() => Items::GLISTERING_MELON()); $result->register("spider_eye", fn() => Items::SPIDER_EYE()); + $result->register("spire_armor_trim_smithing_template", fn() => Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("splash_potion", fn() => Items::SPLASH_POTION()); $result->register("spruce_boat", fn() => Items::SPRUCE_BOAT()); $result->register("spyglass", fn() => Items::SPYGLASS()); @@ -1473,13 +1485,18 @@ final class StringToItemParser extends StringToTParser{ $result->register("sweet_berries", fn() => Items::SWEET_BERRIES()); $result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC)); $result->register("torchflower_seeds", fn() => Items::TORCHFLOWER_SEEDS()); + $result->register("tide_armor_trim_smithing_template", fn() => Items::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("totem", fn() => Items::TOTEM()); $result->register("turtle_helmet", fn() => Items::TURTLE_HELMET()); + $result->register("vex_armor_trim_smithing_template", fn() => Items::VEX_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("turtle_shell_piece", fn() => Items::SCUTE()); $result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG()); + $result->register("ward_armor_trim_smithing_template", fn() => Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("water_bucket", fn() => Items::WATER_BUCKET()); + $result->register("wayfinder_armor_trim_smithing_template", fn() => Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("wheat", fn() => Items::WHEAT()); $result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS()); + $result->register("wild_armor_trim_smithing_template", fn() => Items::WILD_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("wooden_axe", fn() => Items::WOODEN_AXE()); $result->register("wooden_hoe", fn() => Items::WOODEN_HOE()); $result->register("wooden_pickaxe", fn() => Items::WOODEN_PICKAXE()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index e07d4161b2..5f4f60f8e0 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -121,6 +121,7 @@ use function strtolower; * @method static Clock CLOCK() * @method static Clownfish CLOWNFISH() * @method static Coal COAL() + * @method static Item COAST_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static CocoaBeans COCOA_BEANS() * @method static Compass COMPASS() * @method static CookedChicken COOKED_CHICKEN() @@ -148,6 +149,7 @@ use function strtolower; * @method static Item DISC_FRAGMENT_5() * @method static Item DRAGON_BREATH() * @method static DriedKelp DRIED_KELP() + * @method static Item DUNE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Dye DYE() * @method static Item ECHO_SHARD() * @method static Egg EGG() @@ -156,6 +158,7 @@ use function strtolower; * @method static GoldenAppleEnchanted ENCHANTED_GOLDEN_APPLE() * @method static EnderPearl ENDER_PEARL() * @method static ExperienceBottle EXPERIENCE_BOTTLE() + * @method static Item EYE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Item FEATHER() * @method static Item FERMENTED_SPIDER_EYE() * @method static FireCharge FIRE_CHARGE() @@ -185,6 +188,7 @@ use function strtolower; * @method static Item HEART_OF_THE_SEA() * @method static Item HONEYCOMB() * @method static HoneyBottle HONEY_BOTTLE() + * @method static Item HOST_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Item INK_SAC() * @method static Axe IRON_AXE() * @method static Armor IRON_BOOTS() @@ -227,6 +231,7 @@ use function strtolower; * @method static Item NETHERITE_SCRAP() * @method static Shovel NETHERITE_SHOVEL() * @method static Sword NETHERITE_SWORD() + * @method static Item NETHERITE_UPGRADE_SMITHING_TEMPLATE() * @method static Item NETHER_BRICK() * @method static Item NETHER_QUARTZ() * @method static Item NETHER_STAR() @@ -247,6 +252,7 @@ use function strtolower; * @method static Item RABBIT_FOOT() * @method static Item RABBIT_HIDE() * @method static RabbitStew RABBIT_STEW() + * @method static Item RAISER_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static RawBeef RAW_BEEF() * @method static RawChicken RAW_CHICKEN() * @method static Item RAW_COPPER() @@ -273,13 +279,19 @@ use function strtolower; * @method static Record RECORD_WAIT() * @method static Record RECORD_WARD() * @method static Redstone REDSTONE_DUST() + * @method static Item RIB_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static RottenFlesh ROTTEN_FLESH() * @method static Item SCUTE() + * @method static Item SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE() + * @method static Item SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Shears SHEARS() * @method static Item SHULKER_SHELL() + * @method static Item SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Item SLIMEBALL() + * @method static Item SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Snowball SNOWBALL() * @method static SpiderEye SPIDER_EYE() + * @method static Item SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static SplashPotion SPLASH_POTION() * @method static Boat SPRUCE_BOAT() * @method static ItemBlockWallOrFloor SPRUCE_SIGN() @@ -296,14 +308,19 @@ use function strtolower; * @method static Item SUGAR() * @method static SuspiciousStew SUSPICIOUS_STEW() * @method static SweetBerries SWEET_BERRIES() + * @method static Item TIDE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static TorchflowerSeeds TORCHFLOWER_SEEDS() * @method static Totem TOTEM() * @method static TurtleHelmet TURTLE_HELMET() + * @method static Item VEX_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static SpawnEgg VILLAGER_SPAWN_EGG() + * @method static Item WARD_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static ItemBlockWallOrFloor WARPED_SIGN() * @method static LiquidBucket WATER_BUCKET() + * @method static Item WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Item WHEAT() * @method static WheatSeeds WHEAT_SEEDS() + * @method static Item WILD_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Axe WOODEN_AXE() * @method static Hoe WOODEN_HOE() * @method static Pickaxe WOODEN_PICKAXE() @@ -339,6 +356,7 @@ final class VanillaItems{ self::registerArmorItems(); self::registerSpawnEggs(); self::registerTierToolItems(); + self::registerSmithingTemplates(); self::register("air", Blocks::AIR()->asItem()->setCount(0)); @@ -644,4 +662,24 @@ final class VanillaItems{ self::register("netherite_leggings", new Armor(new IID(Ids::NETHERITE_LEGGINGS), "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::LEGGINGS])); } + private static function registerSmithingTemplates() : void{ + self::register("netherite_upgrade_smithing_template", new Item(new IID(Ids::NETHERITE_UPGRADE_SMITHING_TEMPLATE), "Netherite Upgrade Smithing Template")); + self::register("coast_armor_trim_smithing_template", new Item(new IID(Ids::COAST_ARMOR_TRIM_SMITHING_TEMPLATE), "Coast Armor Trim Smithing Template")); + self::register("dune_armor_trim_smithing_template", new Item(new IID(Ids::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE), "Dune Armor Trim Smithing Template")); + self::register("eye_armor_trim_smithing_template", new Item(new IID(Ids::EYE_ARMOR_TRIM_SMITHING_TEMPLATE), "Eye Armor Trim Smithing Template")); + self::register("host_armor_trim_smithing_template", new Item(new IID(Ids::HOST_ARMOR_TRIM_SMITHING_TEMPLATE), "Host Armor Trim Smithing Template")); + self::register("raiser_armor_trim_smithing_template", new Item(new IID(Ids::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE), "Raiser Armor Trim Smithing Template")); + self::register("rib_armor_trim_smithing_template", new Item(new IID(Ids::RIB_ARMOR_TRIM_SMITHING_TEMPLATE), "Rib Armor Trim Smithing Template")); + self::register("sentry_armor_trim_smithing_template", new Item(new IID(Ids::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE), "Sentry Armor Trim Smithing Template")); + self::register("shaper_armor_trim_smithing_template", new Item(new IID(Ids::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE), "Shaper Armor Trim Smithing Template")); + self::register("silence_armor_trim_smithing_template", new Item(new IID(Ids::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE), "Silence Armor Trim Smithing Template")); + self::register("snout_armor_trim_smithing_template", new Item(new IID(Ids::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE), "Snout Armor Trim Smithing Template")); + self::register("spire_armor_trim_smithing_template", new Item(new IID(Ids::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE), "Spire Armor Trim Smithing Template")); + self::register("tide_armor_trim_smithing_template", new Item(new IID(Ids::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE), "Tide Armor Trim Smithing Template")); + self::register("vex_armor_trim_smithing_template", new Item(new IID(Ids::VEX_ARMOR_TRIM_SMITHING_TEMPLATE), "Vex Armor Trim Smithing Template")); + self::register("ward_armor_trim_smithing_template", new Item(new IID(Ids::WARD_ARMOR_TRIM_SMITHING_TEMPLATE), "Ward Armor Trim Smithing Template")); + self::register("wayfinder_armor_trim_smithing_template", new Item(new IID(Ids::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE), "Wayfinder Armor Trim Smithing Template")); + self::register("wild_armor_trim_smithing_template", new Item(new IID(Ids::WILD_ARMOR_TRIM_SMITHING_TEMPLATE), "Wild Armor Trim Smithing Template")); + } + } From e3700cab50555984d50356ffd9fdba41ed521766 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 18:05:07 +0000 Subject: [PATCH 1514/1858] ZlibCompressor: use libdeflate for level 0 compression this is supported since libdeflate 1.15 and ext-libdeflate 0.2.0. Everyone should be using these versions by now anyway, and if they aren't, they should update. libdeflate's level 0 compression is over 20 times faster than zlib, so this is a nice performance improvement. --- src/PocketMine.php | 7 +++++++ src/network/mcpe/compression/ZlibCompressor.php | 15 +++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index 4c2ff32a73..296c21a897 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -144,6 +144,13 @@ namespace pocketmine { $messages[] = "chunkutils2 ^$wantedVersionMin is required, while you have $chunkutils2_version."; } + if(($libdeflate_version = phpversion("libdeflate")) !== false){ + //make sure level 0 compression is available + if(version_compare($libdeflate_version, "0.2.0") < 0 || version_compare($libdeflate_version, "0.3.0") >= 0){ + $messages[] = "php-libdeflate ^0.2.0 is required, while you have $libdeflate_version."; + } + } + if(extension_loaded("pocketmine")){ $messages[] = "The native PocketMine extension is no longer supported."; } diff --git a/src/network/mcpe/compression/ZlibCompressor.php b/src/network/mcpe/compression/ZlibCompressor.php index 317a64451f..066ba876a7 100644 --- a/src/network/mcpe/compression/ZlibCompressor.php +++ b/src/network/mcpe/compression/ZlibCompressor.php @@ -67,17 +67,12 @@ final class ZlibCompressor implements Compressor{ return $result; } - private static function zlib_encode(string $data, int $level) : string{ - return Utils::assumeNotFalse(zlib_encode($data, ZLIB_ENCODING_RAW, $level), "ZLIB compression failed"); - } - public function compress(string $payload) : string{ $compressible = $this->minCompressionSize !== null && strlen($payload) >= $this->minCompressionSize; - if(function_exists('libdeflate_deflate_compress')){ - return $compressible ? - libdeflate_deflate_compress($payload, $this->level) : - self::zlib_encode($payload, 0); - } - return self::zlib_encode($payload, $compressible ? $this->level : 0); + $level = $compressible ? $this->level : 0; + + return function_exists('libdeflate_deflate_compress') ? + libdeflate_deflate_compress($payload, $level) : + Utils::assumeNotFalse(zlib_encode($payload, ZLIB_ENCODING_RAW, $level), "ZLIB compression failed"); } } From 08f9873c320d70da996cff276bf1a2cc9ba36aae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 18:30:03 +0000 Subject: [PATCH 1515/1858] Update build/php submodule to pmmp/PHP-Binaries@3c3c483baac5cb90dff057dfff4388b1dc3f217c --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index a34e48e7da..3c3c483baa 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a34e48e7da753b633ffaa4a4f9516eae4bb97baa +Subproject commit 3c3c483baac5cb90dff057dfff4388b1dc3f217c From c3c81b09e828ccb143dbeb26cd650b7daaa29afa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 18:51:17 +0000 Subject: [PATCH 1516/1858] Release 5.8.2 --- changelogs/5.8.md | 19 +++++++++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/changelogs/5.8.md b/changelogs/5.8.md index 0e712a092a..7ae64742c8 100644 --- a/changelogs/5.8.md +++ b/changelogs/5.8.md @@ -117,3 +117,22 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - Removed code generation step for `RuntimeDataDescriber` enum serialization. All described enums now use PHP 8.1 native enums, which can be described without codegen using `RuntimeDataDescriber->enum()`. - Added `DeprecatedLegacyEnumAccessRule` custom PHPStan rule to flag legacy `EnumTrait` case accessors. - Cleaned up remaining hardcoded `Config` keys in `SetupWizard`. These usages now use auto-generated constants like the rest of the codebase. + +# 5.8.2 +Released 9th November 2023. + +## Performance +- Improved performance of small packet zero-compression (unintended use of slow zlib compressor instead of fast libdeflate one). + - This affected the majority of outbound packets, as most packets are below the 256-byte threshold for compression. + - This faster method is over 20x faster than the old method, producing noticeable performance gains for large servers. + +## Fixes +- Fixed melons and pumpkins not growing. +- Fixed melon and pumpkin stems not attaching to the grown melon/pumpkin. +- Fixed iron and gold ores not being affected by the Fortune enchantment. +- Fixed ancient debris burning in lava. +- Fixed sign (front) text loading from vanilla world saves (back text is not yet supported). + +## Internals +- Removed bogus optimization from `tools/generate-blockstate-upgrade-schema.php` that could cause incorrect `remappedStates` generation when some of the states stayed under the old ID. +- Fixed possible crash in `BlockStateUpgrader` name flattening rule handling with invalid blockstate NBT data. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index e24d434944..8c18ab6a67 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.8.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 93699024da47e55b8e2cbe93aa67c2ce792de348 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 18:51:20 +0000 Subject: [PATCH 1517/1858] 5.8.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8c18ab6a67..e0f4ca4f38 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.8.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.8.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 269b3d89a29628443091d0ffe2a71e73b8e6f6a6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 19:03:12 +0000 Subject: [PATCH 1518/1858] Update build/php submodule to pmmp/PHP-Binaries@39885cf24826773bc3a0e8134e04a2032e97f477 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 3c3c483baa..39885cf248 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 3c3c483baac5cb90dff057dfff4388b1dc3f217c +Subproject commit 39885cf24826773bc3a0e8134e04a2032e97f477 From 7a4cf8ef688eef9d342b47cc7e5e4bc7320dbce3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 19:04:53 +0000 Subject: [PATCH 1519/1858] Prepare for PHP 8.2 as primary version --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 4 ++-- BUILDING.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index f731130981..ad30aa4f22 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -15,7 +15,7 @@ jobs: - name: Setup PHP and tools uses: shivammathur/setup-php@2.27.1 with: - php-version: 8.1 + php-version: 8.2 - name: Restore Composer package cache uses: actions/cache@v3 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 03bfedc898..d4f68ee0b5 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-version: [8.1] + php-version: [8.2] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c57cecb841..8bf6fd7d62 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -175,8 +175,8 @@ jobs: - name: Setup PHP and tools uses: shivammathur/setup-php@2.27.1 with: - php-version: 8.1 - tools: php-cs-fixer:3.17 + php-version: 8.2 + tools: php-cs-fixer:3.38 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/BUILDING.md b/BUILDING.md index 95197de6bd..986f098e2e 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -2,7 +2,7 @@ ## Pre-requisites - A bash shell (git bash is sufficient for Windows) - [`git`](https://git-scm.com) available in your shell -- PHP 8.1 or newer available in your shell +- PHP 8.2 or newer available in your shell - [`composer`](https://getcomposer.org) available in your shell ## Custom PHP binaries From c44758f36cad5ce33d6bbbcea6e43d97aeff6371 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 10 Nov 2023 15:26:02 +0000 Subject: [PATCH 1520/1858] StringToItemParser: added pitcher_plant and pitcher_pod it seems a bit weird to map pitcher_pod to PITCHER_CROP(). Perhaps this wasn't implemented correctly. --- src/item/StringToItemParser.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index d4f2426216..14c93cb5ea 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -868,6 +868,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("pink_petals", fn() => Blocks::PINK_PETALS()); $result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN)); + $result->registerBlock("pitcher_plant", fn() => Blocks::PITCHER_PLANT()); + $result->registerBlock("pitcher_pod", fn() => Blocks::PITCHER_CROP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER)); From 22b10e4cb0d47ef39588066e61ec144a6c23c42e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 10 Nov 2023 15:36:35 +0000 Subject: [PATCH 1521/1858] Timings: Stop using BREAKDOWN group with tree timings, the breakdown is actually pretty annoying, since it makes it hard to find a timer in the aggregate lists. --- src/timings/Timings.php | 85 ++++++++++++++++------------------ src/timings/TimingsHandler.php | 2 +- src/world/WorldTimings.php | 2 +- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 0d8a256dea..61a8bbc927 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -35,6 +35,7 @@ use function get_class; use function str_starts_with; abstract class Timings{ + public const GROUP_MINECRAFT = "Minecraft"; public const GROUP_BREAKDOWN = "Minecraft - Breakdown"; private static bool $initialized = false; @@ -134,8 +135,8 @@ abstract class Timings{ self::$initialized = true; self::$fullTick = new TimingsHandler("Full Server Tick"); - self::$serverTick = new TimingsHandler("Server Tick Update Cycle", self::$fullTick, group: self::GROUP_BREAKDOWN); - self::$serverInterrupts = new TimingsHandler("Server Mid-Tick Processing", self::$fullTick, group: self::GROUP_BREAKDOWN); + self::$serverTick = new TimingsHandler("Server Tick Update Cycle", self::$fullTick); + self::$serverInterrupts = new TimingsHandler("Server Mid-Tick Processing", self::$fullTick); self::$memoryManager = new TimingsHandler("Memory Manager"); self::$garbageCollector = new TimingsHandler("Garbage Collector", self::$memoryManager); self::$titleTick = new TimingsHandler("Console Title Tick"); @@ -143,51 +144,51 @@ abstract class Timings{ self::$connection = new TimingsHandler("Connection Handler"); self::$playerNetworkSend = new TimingsHandler("Player Network Send", self::$connection); - self::$playerNetworkSendCompress = new TimingsHandler("Player Network Send - Compression", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); - self::$playerNetworkSendCompressBroadcast = new TimingsHandler("Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress, group: self::GROUP_BREAKDOWN); - self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler("Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress, group: self::GROUP_BREAKDOWN); - self::$playerNetworkSendEncrypt = new TimingsHandler("Player Network Send - Encryption", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); - self::$playerNetworkSendInventorySync = new TimingsHandler("Player Network Send - Inventory Sync", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); - self::$playerNetworkSendPreSpawnGameData = new TimingsHandler("Player Network Send - Pre-Spawn Game Data", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$playerNetworkSendCompress = new TimingsHandler("Player Network Send - Compression", self::$playerNetworkSend); + self::$playerNetworkSendCompressBroadcast = new TimingsHandler("Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress); + self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler("Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress); + self::$playerNetworkSendEncrypt = new TimingsHandler("Player Network Send - Encryption", self::$playerNetworkSend); + self::$playerNetworkSendInventorySync = new TimingsHandler("Player Network Send - Inventory Sync", self::$playerNetworkSend); + self::$playerNetworkSendPreSpawnGameData = new TimingsHandler("Player Network Send - Pre-Spawn Game Data", self::$playerNetworkSend); self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection); - self::$playerNetworkReceiveDecompress = new TimingsHandler("Player Network Receive - Decompression", self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); - self::$playerNetworkReceiveDecrypt = new TimingsHandler("Player Network Receive - Decryption", self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); + self::$playerNetworkReceiveDecompress = new TimingsHandler("Player Network Receive - Decompression", self::$playerNetworkReceive); + self::$playerNetworkReceiveDecrypt = new TimingsHandler("Player Network Receive - Decryption", self::$playerNetworkReceive); - self::$broadcastPackets = new TimingsHandler("Broadcast Packets", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$broadcastPackets = new TimingsHandler("Broadcast Packets", self::$playerNetworkSend); self::$playerMove = new TimingsHandler("Player Movement"); self::$playerChunkOrder = new TimingsHandler("Player Order Chunks"); - self::$playerChunkSend = new TimingsHandler("Player Network Send - Chunks", self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$playerChunkSend = new TimingsHandler("Player Network Send - Chunks", self::$playerNetworkSend); self::$scheduler = new TimingsHandler("Scheduler"); self::$serverCommand = new TimingsHandler("Server Command"); self::$permissibleCalculation = new TimingsHandler("Permissible Calculation"); - self::$permissibleCalculationDiff = new TimingsHandler("Permissible Calculation - Diff", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); - self::$permissibleCalculationCallback = new TimingsHandler("Permissible Calculation - Callbacks", self::$permissibleCalculation, group: self::GROUP_BREAKDOWN); + self::$permissibleCalculationDiff = new TimingsHandler("Permissible Calculation - Diff", self::$permissibleCalculation); + self::$permissibleCalculationCallback = new TimingsHandler("Permissible Calculation - Callbacks", self::$permissibleCalculation); self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load"); self::$syncPlayerDataSave = new TimingsHandler("Player Data Save"); - self::$entityMove = new TimingsHandler("Entity Movement", group: self::GROUP_BREAKDOWN); - self::$entityMoveCollision = new TimingsHandler("Entity Movement - Collision Checks", self::$entityMove, group: self::GROUP_BREAKDOWN); + self::$entityMove = new TimingsHandler("Entity Movement"); + self::$entityMoveCollision = new TimingsHandler("Entity Movement - Collision Checks", self::$entityMove); - self::$projectileMove = new TimingsHandler("Projectile Movement", self::$entityMove, group: self::GROUP_BREAKDOWN); - self::$projectileMoveRayTrace = new TimingsHandler("Projectile Movement - Ray Tracing", self::$projectileMove, group: self::GROUP_BREAKDOWN); + self::$projectileMove = new TimingsHandler("Projectile Movement", self::$entityMove); + self::$projectileMoveRayTrace = new TimingsHandler("Projectile Movement - Ray Tracing", self::$projectileMove); - self::$playerCheckNearEntities = new TimingsHandler("checkNearEntities", group: self::GROUP_BREAKDOWN); - self::$entityBaseTick = new TimingsHandler("Entity Base Tick", group: self::GROUP_BREAKDOWN); - self::$livingEntityBaseTick = new TimingsHandler("Entity Base Tick - Living", group: self::GROUP_BREAKDOWN); - self::$itemEntityBaseTick = new TimingsHandler("Entity Base Tick - ItemEntity", group: self::GROUP_BREAKDOWN); + self::$playerCheckNearEntities = new TimingsHandler("checkNearEntities"); + self::$entityBaseTick = new TimingsHandler("Entity Base Tick"); + self::$livingEntityBaseTick = new TimingsHandler("Entity Base Tick - Living"); + self::$itemEntityBaseTick = new TimingsHandler("Entity Base Tick - ItemEntity"); - self::$schedulerSync = new TimingsHandler("Scheduler - Sync Tasks", group: self::GROUP_BREAKDOWN); + self::$schedulerSync = new TimingsHandler("Scheduler - Sync Tasks"); - self::$schedulerAsync = new TimingsHandler("Scheduler - Async Tasks", group: self::GROUP_BREAKDOWN); - self::$asyncTaskProgressUpdateParent = new TimingsHandler("Async Tasks - Progress Updates", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); - self::$asyncTaskCompletionParent = new TimingsHandler("Async Tasks - Completion Handlers", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); - self::$asyncTaskErrorParent = new TimingsHandler("Async Tasks - Error Handlers", self::$schedulerAsync, group: self::GROUP_BREAKDOWN); + self::$schedulerAsync = new TimingsHandler("Scheduler - Async Tasks"); + self::$asyncTaskProgressUpdateParent = new TimingsHandler("Async Tasks - Progress Updates", self::$schedulerAsync); + self::$asyncTaskCompletionParent = new TimingsHandler("Async Tasks - Completion Handlers", self::$schedulerAsync); + self::$asyncTaskErrorParent = new TimingsHandler("Async Tasks - Error Handlers", self::$schedulerAsync); - self::$playerCommand = new TimingsHandler("Player Command", group: self::GROUP_BREAKDOWN); - self::$craftingDataCacheRebuild = new TimingsHandler("Build CraftingDataPacket Cache", group: self::GROUP_BREAKDOWN); + self::$playerCommand = new TimingsHandler("Player Command"); + self::$craftingDataCacheRebuild = new TimingsHandler("Build CraftingDataPacket Cache"); } @@ -229,7 +230,7 @@ abstract class Timings{ }else{ $displayName = self::shortenCoreClassName($entity::class, "pocketmine\\entity\\"); } - self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName, group: self::GROUP_BREAKDOWN); + self::$entityTypeTimingMap[$entity::class] = new TimingsHandler("Entity Tick - " . $displayName); } return self::$entityTypeTimingMap[$entity::class]; @@ -239,8 +240,7 @@ abstract class Timings{ self::init(); if(!isset(self::$tileEntityTypeTimingMap[$tile::class])){ self::$tileEntityTypeTimingMap[$tile::class] = new TimingsHandler( - "Block Entity Tick - " . self::shortenCoreClassName($tile::class, "pocketmine\\block\\tile\\"), - group: self::GROUP_BREAKDOWN + "Block Entity Tick - " . self::shortenCoreClassName($tile::class, "pocketmine\\block\\tile\\") ); } @@ -250,7 +250,7 @@ abstract class Timings{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ self::init(); if(!isset(self::$packetReceiveTimingMap[$pk::class])){ - self::$packetReceiveTimingMap[$pk::class] = new TimingsHandler("Receive - " . $pk->getName(), self::$playerNetworkReceive, group: self::GROUP_BREAKDOWN); + self::$packetReceiveTimingMap[$pk::class] = new TimingsHandler("Receive - " . $pk->getName(), self::$playerNetworkReceive); } return self::$packetReceiveTimingMap[$pk::class]; @@ -259,31 +259,28 @@ abstract class Timings{ public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ return self::$packetDecodeTimingMap[$pk::class] ??= new TimingsHandler( "Decode - " . $pk->getName(), - self::getReceiveDataPacketTimings($pk), - group: self::GROUP_BREAKDOWN + self::getReceiveDataPacketTimings($pk) ); } public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ return self::$packetHandleTimingMap[$pk::class] ??= new TimingsHandler( "Handler - " . $pk->getName(), - self::getReceiveDataPacketTimings($pk), - group: self::GROUP_BREAKDOWN + self::getReceiveDataPacketTimings($pk) ); } public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ return self::$packetEncodeTimingMap[$pk::class] ??= new TimingsHandler( "Encode - " . $pk->getName(), - self::getSendDataPacketTimings($pk), - group: self::GROUP_BREAKDOWN + self::getSendDataPacketTimings($pk) ); } public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ self::init(); if(!isset(self::$packetSendTimingMap[$pk::class])){ - self::$packetSendTimingMap[$pk::class] = new TimingsHandler("Send - " . $pk->getName(), self::$playerNetworkSend, group: self::GROUP_BREAKDOWN); + self::$packetSendTimingMap[$pk::class] = new TimingsHandler("Send - " . $pk->getName(), self::$playerNetworkSend); } return self::$packetSendTimingMap[$pk::class]; @@ -292,7 +289,7 @@ abstract class Timings{ public static function getCommandDispatchTimings(string $commandName) : TimingsHandler{ self::init(); - return self::$commandTimingMap[$commandName] ??= new TimingsHandler("Command - " . $commandName, group: self::GROUP_BREAKDOWN); + return self::$commandTimingMap[$commandName] ??= new TimingsHandler("Command - " . $commandName); } public static function getEventTimings(Event $event) : TimingsHandler{ @@ -316,7 +313,7 @@ abstract class Timings{ return self::$eventHandlers[$event][$handlerName]; } - public static function getAsyncTaskProgressUpdateTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + public static function getAsyncTaskProgressUpdateTimings(AsyncTask $task, string $group = self::GROUP_MINECRAFT) : TimingsHandler{ $taskClass = $task::class; if(!isset(self::$asyncTaskProgressUpdate[$taskClass])){ self::init(); @@ -330,7 +327,7 @@ abstract class Timings{ return self::$asyncTaskProgressUpdate[$taskClass]; } - public static function getAsyncTaskCompletionTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + public static function getAsyncTaskCompletionTimings(AsyncTask $task, string $group = self::GROUP_MINECRAFT) : TimingsHandler{ $taskClass = $task::class; if(!isset(self::$asyncTaskCompletion[$taskClass])){ self::init(); @@ -344,7 +341,7 @@ abstract class Timings{ return self::$asyncTaskCompletion[$taskClass]; } - public static function getAsyncTaskErrorTimings(AsyncTask $task, string $group = self::GROUP_BREAKDOWN) : TimingsHandler{ + public static function getAsyncTaskErrorTimings(AsyncTask $task, string $group = self::GROUP_MINECRAFT) : TimingsHandler{ $taskClass = $task::class; if(!isset(self::$asyncTaskError[$taskClass])){ self::init(); diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index ba6c3cfea2..574dd6d2b8 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -120,7 +120,7 @@ class TimingsHandler{ public function __construct( private string $name, private ?TimingsHandler $parent = null, - private string $group = "Minecraft" + private string $group = Timings::GROUP_MINECRAFT ){} public function getName() : string{ return $this->name; } diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index 2d3a2090c9..191dee7781 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -66,7 +66,7 @@ class WorldTimings{ private static function newTimer(string $worldName, string $timerName) : TimingsHandler{ $aggregator = self::$aggregators[$timerName] ??= new TimingsHandler("Worlds - $timerName"); //displayed in Minecraft primary table - return new TimingsHandler("$worldName - $timerName", $aggregator, Timings::GROUP_BREAKDOWN); + return new TimingsHandler("$worldName - $timerName", $aggregator); } public function __construct(World $world){ From 58ea94bab8b2644cf60d5804075b976e1fd9f65a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 10 Nov 2023 15:41:17 +0000 Subject: [PATCH 1522/1858] ... --- src/world/WorldTimings.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/world/WorldTimings.php b/src/world/WorldTimings.php index 191dee7781..9a43828c2a 100644 --- a/src/world/WorldTimings.php +++ b/src/world/WorldTimings.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\world; -use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; class WorldTimings{ From c2189bc2df5fd6e2477b63698e341db4adf03ce5 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 10 Nov 2023 16:16:49 +0000 Subject: [PATCH 1523/1858] Update README.md [ci skip] --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 9f8c6a326a..bbecbe72b0 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,25 @@ GitHub release (latest by SemVer)

+## What is this? +PocketMine-MP is a highly customisable server software for Minecraft: Bedrock Edition, built from scratch in PHP, with over 10 years of history. + +If you're looking to create a Minecraft: Bedrock server with **custom functionality**, look no further. + +- 🧩 **Powerful plugin API** - extend and customise gameplay as you see fit +- 🗺️ **Rich ecosystem** and **large developer community** - find plugins easily and learn to develop your own +- 🌐 **Multi-world support** - offer a more varied game experience to players without transferring them to other server nodes +- 🏎️ **Performance** - get 100+ players onto one server (depending on hardware and plugins) +- ⤴️ **Continuously updated** - new Minecraft versions are usually supported within days + +## :x: PocketMine-MP is NOT a vanilla Minecraft server software. +**It is poorly suited to hosting vanilla survival servers.** +It doesn't have many features from the vanilla game, such as vanilla world generation, redstone, mob AI, and various other things. + +If you just want to play **vanilla survival multiplayer**, consider using the [official Minecraft: Bedrock server software](https://minecraft.net/download/server/bedrock) instead of PocketMine-MP. + +If that's not an option for you, you may be able to add some of PocketMine-MP's missing features using plugins from [Poggit](https://poggit.pmmp.io/plugins), or write plugins to implement them yourself. + ## Getting started - [Documentation](http://pmmp.readthedocs.org/) - [Installation instructions](https://pmmp.readthedocs.io/en/rtfd/installation.html) From bd43ff657952349859aaf24d576791ce69ae0fc4 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 10 Nov 2023 16:27:57 +0000 Subject: [PATCH 1524/1858] Update README.md [ci skip] --- README.md | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bbecbe72b0..b9e2e18887 100644 --- a/README.md +++ b/README.md @@ -39,31 +39,42 @@ If you just want to play **vanilla survival multiplayer**, consider using the [o If that's not an option for you, you may be able to add some of PocketMine-MP's missing features using plugins from [Poggit](https://poggit.pmmp.io/plugins), or write plugins to implement them yourself. -## Getting started +## Getting Started - [Documentation](http://pmmp.readthedocs.org/) - [Installation instructions](https://pmmp.readthedocs.io/en/rtfd/installation.html) - [Docker image](https://github.com/pmmp/PocketMine-MP/pkgs/container/pocketmine-mp) - [Plugin repository](https://poggit.pmmp.io/plugins) ## Community & Support -- [Forums](https://forums.pmmp.io/) -- [Discord](https://discord.gg/bmSAZBG) -- [StackOverflow](https://stackoverflow.com/tags/pocketmine) +Join our [Discord](https://discord.gg/bmSAZBG) server to chat with other users and developers. + +You can also post questions on [StackOverflow](https://stackoverflow.com/tags/pocketmine) under the tag `pocketmine`. + +## Developing Plugins +If you want to write your own plugins, the following resources may be useful. +Don't forget you can always ask our community if you need help. -## For developers - * [Building and running from source](BUILDING.md) * [Developer documentation](https://devdoc.pmmp.io) - General documentation for PocketMine-MP plugin developers * [Latest release API documentation](https://apidoc.pmmp.io) - Doxygen API documentation generated for each release * [Latest bleeding-edge API documentation](https://apidoc-dev.pmmp.io) - Doxygen API documentation generated weekly from `major-next` branch * [DevTools](https://github.com/pmmp/DevTools/) - Development tools plugin for creating plugins * [ExamplePlugin](https://github.com/pmmp/ExamplePlugin/) - Example plugin demonstrating some basic API features + +## Contributing to PocketMine-MP +PocketMine-MP accepts community contributions! The following resources will be useful if you want to contribute to PocketMine-MP. + * [Building and running PocketMine-MP from source](BUILDING.md) * [Contributing Guidelines](CONTRIBUTING.md) ## Donate -- Bitcoin Cash (BCH): `qq3r46hn6ljnhnqnfwxt5pg3g447eq9jhvw5ddfear` +PocketMine-MP is free, but it requires a lot of time and effort from unpaid volunteers to develop. Donations enable us to keep delivering support for new versions and adding features your players love. + +You can support development using the following methods: + +- [Patreon](https://www.patreon.com/pocketminemp) - Bitcoin (BTC): `171u8K9e4FtU6j3e5sqNoxKUgEw9qWQdRV` - Stellar Lumens (XLM): `GAAC5WZ33HCTE3BFJFZJXONMEIBNHFLBXM2HJVAZHXXPYA3HP5XPPS7T` -- [Patreon](https://www.patreon.com/pocketminemp) + +Thanks for your support! ## Licensing information This project is licensed under LGPL-3.0. Please see the [LICENSE](/LICENSE) file for details. From 77590fb63a2ba159af49d491a1cae3b803b261f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Nov 2023 11:12:00 +0000 Subject: [PATCH 1525/1858] Server: fixed prepareBatch() not being marked as internal --- src/Server.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Server.php b/src/Server.php index 6b3a91543a..f4d4a09580 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1356,6 +1356,7 @@ class Server{ } /** + * @internal * Broadcasts a list of packets in a batch to a list of players * * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). From 0ad6429fee1e85febf6b0f24afd4ff83c240d697 Mon Sep 17 00:00:00 2001 From: Amir Muazzam Date: Mon, 13 Nov 2023 19:15:07 +0800 Subject: [PATCH 1526/1858] Fix RegistryTrait documentation (#6153) --- src/utils/EnumTrait.php | 2 +- src/utils/RegistryTrait.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/EnumTrait.php b/src/utils/EnumTrait.php index ee1bd4e350..7427e69f49 100644 --- a/src/utils/EnumTrait.php +++ b/src/utils/EnumTrait.php @@ -28,7 +28,7 @@ namespace pocketmine\utils; * __callStatic(). * * Classes using this trait need to include \@method tags in their class docblock for every enum member. - * Alternatively, just put \@generate-registry-docblock in the docblock and run tools/generate-registry-annotations.php + * Alternatively, just put \@generate-registry-docblock in the docblock and run build/generate-registry-annotations.php * * @deprecated Use native PHP 8.1 enums instead. Use {@link LegacyEnumShimTrait} if you need to provide backwards * compatible EnumTrait-like API for migrated enums. diff --git a/src/utils/RegistryTrait.php b/src/utils/RegistryTrait.php index 2071f4c07c..cf231bf21f 100644 --- a/src/utils/RegistryTrait.php +++ b/src/utils/RegistryTrait.php @@ -33,7 +33,7 @@ use function preg_match; * These faux constants are exposed in static class methods, which are handled using __callStatic(). * * Classes using this trait need to include \@method tags in their class docblock for every faux constant. - * Alternatively, just put \@generate-registry-docblock in the docblock and run tools/generate-registry-annotations.php + * Alternatively, just put \@generate-registry-docblock in the docblock and run build/generate-registry-annotations.php */ trait RegistryTrait{ /** From e525699dd4d1135558c168e7b5fe70d6aea150f4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 Nov 2023 11:35:39 +0000 Subject: [PATCH 1527/1858] TimeTrackingSleeperHandler: record time spent in each Snooze handler --- src/TimeTrackingSleeperHandler.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/TimeTrackingSleeperHandler.php b/src/TimeTrackingSleeperHandler.php index 970d85ce08..827ad370eb 100644 --- a/src/TimeTrackingSleeperHandler.php +++ b/src/TimeTrackingSleeperHandler.php @@ -24,7 +24,9 @@ declare(strict_types=1); namespace pocketmine; use pocketmine\snooze\SleeperHandler; +use pocketmine\snooze\SleeperHandlerEntry; use pocketmine\timings\TimingsHandler; +use pocketmine\utils\Utils; use function hrtime; /** @@ -35,12 +37,29 @@ final class TimeTrackingSleeperHandler extends SleeperHandler{ private int $notificationProcessingTimeNs = 0; + /** + * @var TimingsHandler[] + * @phpstan-var array + */ + private static array $handlerTimings = []; + public function __construct( private TimingsHandler $timings ){ parent::__construct(); } + public function addNotifier(\Closure $handler) : SleeperHandlerEntry{ + $name = Utils::getNiceClosureName($handler); + $timings = self::$handlerTimings[$name] ??= new TimingsHandler("Snooze Handler: " . $name, $this->timings); + + return parent::addNotifier(function() use ($timings, $handler) : void{ + $timings->startTiming(); + $handler(); + $timings->stopTiming(); + }); + } + /** * Returns the time in nanoseconds spent processing notifications since the last reset. */ From dd98e4aaed3731f0d23447d52825b9100826523f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Nov 2023 12:47:33 +0000 Subject: [PATCH 1528/1858] block: clean up unnecessary getter usages with the assistance of a custom phpstan rule this inconsistent mess has been bothering me for a long time --- src/block/Bamboo.php | 2 +- src/block/Barrel.php | 8 ++++---- src/block/BaseBigDripleaf.php | 10 +++++----- src/block/Bed.php | 2 +- src/block/ChiseledBookshelf.php | 2 +- src/block/ChorusFlower.php | 4 ++-- src/block/ChorusPlant.php | 2 +- src/block/Farmland.php | 2 +- src/block/Fire.php | 2 +- src/block/FloorCoralFan.php | 2 +- src/block/Jukebox.php | 6 +++--- src/block/NetherVines.php | 4 ++-- src/block/PinkPetals.php | 8 ++++---- src/block/RedMushroom.php | 2 +- src/block/SmallDripleaf.php | 4 ++-- src/block/Stair.php | 4 ++-- src/block/inventory/AnimatedBlockInventoryTrait.php | 8 ++++---- src/block/tile/Chest.php | 2 +- 18 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 5df71f6968..9f605bca69 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -173,7 +173,7 @@ class Bamboo extends Transparent{ $newHeight = $height + $growAmount; $stemBlock = (clone $this)->setReady(false)->setLeafSize(self::NO_LEAVES); - if($newHeight >= 4 && !$stemBlock->isThick()){ //don't change it to false if height is less, because it might have been chopped + if($newHeight >= 4 && !$stemBlock->thick){ //don't change it to false if height is less, because it might have been chopped $stemBlock = $stemBlock->setThick(true); } $smallLeavesBlock = (clone $stemBlock)->setLeafSize(self::SMALL_LEAVES); diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 1dce2376b1..0f0499ab93 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -55,12 +55,12 @@ class Barrel extends Opaque{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($player !== null){ - if(abs($player->getPosition()->getX() - $this->position->getX()) < 2 && abs($player->getPosition()->getZ() - $this->position->getZ()) < 2){ - $y = $player->getEyePos()->getY(); + if(abs($player->getPosition()->x - $this->position->x) < 2 && abs($player->getPosition()->z - $this->position->z) < 2){ + $y = $player->getEyePos()->y; - if($y - $this->position->getY() > 2){ + if($y - $this->position->y > 2){ $this->facing = Facing::UP; - }elseif($this->position->getY() - $y > 0){ + }elseif($this->position->y - $y > 0){ $this->facing = Facing::DOWN; }else{ $this->facing = Facing::opposite($player->getHorizontalFacing()); diff --git a/src/block/BaseBigDripleaf.php b/src/block/BaseBigDripleaf.php index b2547447c2..f0ff59cf08 100644 --- a/src/block/BaseBigDripleaf.php +++ b/src/block/BaseBigDripleaf.php @@ -65,8 +65,8 @@ abstract class BaseBigDripleaf extends Transparent{ $this->facing = Facing::opposite($player->getHorizontalFacing()); } if($block instanceof BaseBigDripleaf){ - $this->facing = $block->getFacing(); - $tx->addBlock($block->getPosition(), VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($this->facing)); + $this->facing = $block->facing; + $tx->addBlock($block->position, VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($this->facing)); } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -98,7 +98,7 @@ abstract class BaseBigDripleaf extends Transparent{ if($head === null){ return false; } - $pos = $head->getPosition(); + $pos = $head->position; $up = $pos->up(); $world = $pos->getWorld(); if( @@ -110,8 +110,8 @@ abstract class BaseBigDripleaf extends Transparent{ $tx = new BlockTransaction($world); - $tx->addBlock($pos, VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($head->getFacing())); - $tx->addBlock($up, VanillaBlocks::BIG_DRIPLEAF_HEAD()->setFacing($head->getFacing())); + $tx->addBlock($pos, VanillaBlocks::BIG_DRIPLEAF_STEM()->setFacing($head->facing)); + $tx->addBlock($up, VanillaBlocks::BIG_DRIPLEAF_HEAD()->setFacing($head->facing)); $ev = new StructureGrowEvent($head, $tx, $player); $ev->call(); diff --git a/src/block/Bed.php b/src/block/Bed.php index d4dca17d62..8efbdfe017 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -145,7 +145,7 @@ class Bed extends Transparent{ $b = ($this->isHeadPart() ? $this : $other); - if($b->isOccupied()){ + if($b->occupied){ $player->sendMessage(KnownTranslationFactory::tile_bed_occupied()->prefix(TextFormat::GRAY)); return true; diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php index 021ed58e99..89340a8f39 100644 --- a/src/block/ChiseledBookshelf.php +++ b/src/block/ChiseledBookshelf.php @@ -97,7 +97,7 @@ class ChiseledBookshelf extends Opaque{ return false; } - $x = Facing::axis($face) === Axis::X ? $clickVector->getZ() : $clickVector->getX(); + $x = Facing::axis($face) === Axis::X ? $clickVector->z : $clickVector->x; $slot = ChiseledBookshelfSlot::fromBlockFaceCoordinates( Facing::isPositive(Facing::rotateY($face, true)) ? 1 - $x : $x, $clickVector->y diff --git a/src/block/ChorusFlower.php b/src/block/ChorusFlower.php index 2dcf4bb701..cc3c606d92 100644 --- a/src/block/ChorusFlower.php +++ b/src/block/ChorusFlower.php @@ -54,7 +54,7 @@ final class ChorusFlower extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - $position = $block->getPosition(); + $position = $block->position; $world = $position->getWorld(); $down = $world->getBlock($position->down()); @@ -152,7 +152,7 @@ final class ChorusFlower extends Flowable{ if($tx === null){ $tx = new BlockTransaction($this->position->getWorld()); } - $tx->addBlock($this->position->getSide($facing), (clone $this)->setAge(min(self::MAX_AGE, $this->getAge() + $ageChange))); + $tx->addBlock($this->position->getSide($facing), (clone $this)->setAge(min(self::MAX_AGE, $this->age + $ageChange))); return $tx; } diff --git a/src/block/ChorusPlant.php b/src/block/ChorusPlant.php index e3cc8de9d0..9013f68256 100644 --- a/src/block/ChorusPlant.php +++ b/src/block/ChorusPlant.php @@ -51,7 +51,7 @@ final class ChorusPlant extends Flowable{ } private function canBeSupportedAt(Block $block) : bool{ - $position = $block->getPosition(); + $position = $block->position; $world = $position->getWorld(); $down = $world->getBlock($position->down()); diff --git a/src/block/Farmland.php b/src/block/Farmland.php index c2694dd831..a17a220f0b 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -152,7 +152,7 @@ class Farmland extends Transparent{ $ev = new EntityTrampleFarmlandEvent($entity, $this); $ev->call(); if(!$ev->isCancelled()){ - $this->getPosition()->getWorld()->setBlock($this->getPosition(), VanillaBlocks::DIRT()); + $this->position->getWorld()->setBlock($this->position, VanillaBlocks::DIRT()); } } return null; diff --git a/src/block/Fire.php b/src/block/Fire.php index 5487c34ede..35a7a696c6 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -140,7 +140,7 @@ class Fire extends BaseFire{ $block->onIncinerate(); $world = $this->position->getWorld(); - if($world->getBlock($block->getPosition())->isSameState($block)){ + if($world->getBlock($block->position)->isSameState($block)){ $spreadedFire = false; if(mt_rand(0, $this->age + 9) < 5){ //TODO: check rain $fire = clone $this; diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 81ea88186b..5b74d08aff 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -58,7 +58,7 @@ final class FloorCoralFan extends BaseCoral{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($player !== null){ $playerBlockPos = $player->getPosition()->floor(); - $directionVector = $blockReplace->getPosition()->subtractVector($playerBlockPos)->normalize(); + $directionVector = $blockReplace->position->subtractVector($playerBlockPos)->normalize(); $angle = rad2deg(atan2($directionVector->getZ(), $directionVector->getX())); if($angle <= 45 || 315 <= $angle || (135 <= $angle && $angle <= 225)){ diff --git a/src/block/Jukebox.php b/src/block/Jukebox.php index 20c3cab613..a61dd06dbe 100644 --- a/src/block/Jukebox.php +++ b/src/block/Jukebox.php @@ -61,7 +61,7 @@ class Jukebox extends Opaque{ public function ejectRecord() : void{ if($this->record !== null){ - $this->getPosition()->getWorld()->dropItem($this->getPosition()->add(0.5, 1, 0.5), $this->record); + $this->position->getWorld()->dropItem($this->position->add(0.5, 1, 0.5), $this->record); $this->record = null; $this->stopSound(); } @@ -76,12 +76,12 @@ class Jukebox extends Opaque{ public function startSound() : void{ if($this->record !== null){ - $this->getPosition()->getWorld()->addSound($this->getPosition(), new RecordSound($this->record->getRecordType())); + $this->position->getWorld()->addSound($this->position, new RecordSound($this->record->getRecordType())); } } public function stopSound() : void{ - $this->getPosition()->getWorld()->addSound($this->getPosition(), new RecordStopSound()); + $this->position->getWorld()->addSound($this->position, new RecordStopSound()); } public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{ diff --git a/src/block/NetherVines.php b/src/block/NetherVines.php index eb459a0f1e..e8729c00f0 100644 --- a/src/block/NetherVines.php +++ b/src/block/NetherVines.php @@ -108,8 +108,8 @@ class NetherVines extends Flowable{ private function grow(?Player $player, int $growthAmount = 1) : bool{ $top = $this->seekToTip(); - $age = $top->getAge(); - $pos = $top->getPosition(); + $age = $top->age; + $pos = $top->position; $world = $pos->getWorld(); $changedBlocks = 0; diff --git a/src/block/PinkPetals.php b/src/block/PinkPetals.php index 872798df05..17bc4c50a6 100644 --- a/src/block/PinkPetals.php +++ b/src/block/PinkPetals.php @@ -70,13 +70,13 @@ class PinkPetals extends Flowable{ } public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ - return ($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT) || $this->supportedWhenPlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + return ($blockReplace instanceof PinkPetals && $blockReplace->count < self::MAX_COUNT) || $this->supportedWhenPlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - if($blockReplace instanceof PinkPetals && $blockReplace->getCount() < self::MAX_COUNT){ - $this->count = $blockReplace->getCount() + 1; - $this->facing = $blockReplace->getFacing(); + if($blockReplace instanceof PinkPetals && $blockReplace->count < self::MAX_COUNT){ + $this->count = $blockReplace->count + 1; + $this->facing = $blockReplace->facing; }elseif($player !== null){ $this->facing = Facing::opposite($player->getHorizontalFacing()); } diff --git a/src/block/RedMushroom.php b/src/block/RedMushroom.php index 553957fe6c..81ab940f53 100644 --- a/src/block/RedMushroom.php +++ b/src/block/RedMushroom.php @@ -43,7 +43,7 @@ class RedMushroom extends Flowable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $down = $this->getSide(Facing::DOWN); - $position = $this->getPosition(); + $position = $this->position; $lightLevel = $position->getWorld()->getFullLightAt($position->x, $position->y, $position->z); $downId = $down->getTypeId(); //TODO: nylium support diff --git a/src/block/SmallDripleaf.php b/src/block/SmallDripleaf.php index ad23608bf1..d192e43db7 100644 --- a/src/block/SmallDripleaf.php +++ b/src/block/SmallDripleaf.php @@ -83,7 +83,7 @@ class SmallDripleaf extends Transparent{ $this->facing = Facing::opposite($player->getHorizontalFacing()); } - $tx->addBlock($block->getPosition(), VanillaBlocks::SMALL_DRIPLEAF() + $tx->addBlock($block->position, VanillaBlocks::SMALL_DRIPLEAF() ->setFacing($this->facing) ->setTop(true) ); @@ -117,7 +117,7 @@ class SmallDripleaf extends Transparent{ $height = mt_rand(2, 5); $grown = 0; for($i = 0; $i < $height; $i++){ - $pos = $bottomBlock->getSide(Facing::UP, $i)->getPosition(); + $pos = $bottomBlock->getSide(Facing::UP, $i)->position; if(!$this->canGrowTo($pos)){ break; } diff --git a/src/block/Stair.php b/src/block/Stair.php index 1acaac9628..d66a9ce5cf 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -106,8 +106,8 @@ class Stair extends Transparent{ public function getSupportType(int $facing) : SupportType{ if( - $facing === Facing::UP && $this->isUpsideDown() || - $facing === Facing::DOWN && !$this->isUpsideDown() || + $facing === Facing::UP && $this->upsideDown || + $facing === Facing::DOWN && !$this->upsideDown || ($facing === $this->facing && $this->shape !== StairShape::OUTER_LEFT && $this->shape !== StairShape::OUTER_RIGHT) || ($facing === Facing::rotate($this->facing, Axis::Y, false) && $this->shape === StairShape::INNER_LEFT) || ($facing === Facing::rotate($this->facing, Axis::Y, true) && $this->shape === StairShape::INNER_RIGHT) diff --git a/src/block/inventory/AnimatedBlockInventoryTrait.php b/src/block/inventory/AnimatedBlockInventoryTrait.php index a9965190cd..8720c985b1 100644 --- a/src/block/inventory/AnimatedBlockInventoryTrait.php +++ b/src/block/inventory/AnimatedBlockInventoryTrait.php @@ -47,20 +47,20 @@ trait AnimatedBlockInventoryTrait{ public function onOpen(Player $who) : void{ parent::onOpen($who); - if($this->getHolder()->isValid() && $this->getViewerCount() === 1){ + if($this->holder->isValid() && $this->getViewerCount() === 1){ //TODO: this crap really shouldn't be managed by the inventory $this->animateBlock(true); - $this->getHolder()->getWorld()->addSound($this->getHolder()->add(0.5, 0.5, 0.5), $this->getOpenSound()); + $this->holder->getWorld()->addSound($this->holder->add(0.5, 0.5, 0.5), $this->getOpenSound()); } } abstract protected function animateBlock(bool $isOpen) : void; public function onClose(Player $who) : void{ - if($this->getHolder()->isValid() && $this->getViewerCount() === 1){ + if($this->holder->isValid() && $this->getViewerCount() === 1){ //TODO: this crap really shouldn't be managed by the inventory $this->animateBlock(false); - $this->getHolder()->getWorld()->addSound($this->getHolder()->add(0.5, 0.5, 0.5), $this->getCloseSound()); + $this->holder->getWorld()->addSound($this->holder->add(0.5, 0.5, 0.5), $this->getCloseSound()); } parent::onClose($who); } diff --git a/src/block/tile/Chest.php b/src/block/tile/Chest.php index 46d97191b3..4f97eed234 100644 --- a/src/block/tile/Chest.php +++ b/src/block/tile/Chest.php @@ -139,7 +139,7 @@ class Chest extends Spawnable implements Container, Nameable{ if($pair->doubleInventory !== null){ $this->doubleInventory = $pair->doubleInventory; }else{ - if(($pair->getPosition()->x + ($pair->getPosition()->z << 15)) > ($this->position->x + ($this->position->z << 15))){ //Order them correctly + if(($pair->position->x + ($pair->position->z << 15)) > ($this->position->x + ($this->position->z << 15))){ //Order them correctly $this->doubleInventory = $pair->doubleInventory = new DoubleChestInventory($pair->inventory, $this->inventory); }else{ $this->doubleInventory = $pair->doubleInventory = new DoubleChestInventory($this->inventory, $pair->inventory); From e5c96faa4b51b91e32fb9ff764ec85611d20e7c0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Nov 2023 12:59:05 +0000 Subject: [PATCH 1529/1858] Server: clean up inconsistent getter vs property access usages --- src/Server.php | 78 +++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/Server.php b/src/Server.php index f4d4a09580..dcadf4ce7b 100644 --- a/src/Server.php +++ b/src/Server.php @@ -523,7 +523,7 @@ class Server{ return $this->playerDataProvider->loadData($name); }catch(PlayerDataLoadException $e){ $this->logger->debug("Failed to load player data for $name: " . $e->getMessage()); - $this->logger->error($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_data_playerCorrupted($name))); + $this->logger->error($this->language->translate(KnownTranslationFactory::pocketmine_data_playerCorrupted($name))); return null; } }); @@ -542,7 +542,7 @@ class Server{ try{ $this->playerDataProvider->saveData($name, $ev->getSaveData()); }catch(PlayerDataSaveException $e){ - $this->logger->critical($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_data_saveError($name, $e->getMessage()))); + $this->logger->critical($this->language->translate(KnownTranslationFactory::pocketmine_data_saveError($name, $e->getMessage()))); $this->logger->logException($e); } }); @@ -854,7 +854,7 @@ class Server{ } } - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::language_selected($this->getLanguage()->getName(), $this->getLanguage()->getLang()))); + $this->logger->info($this->language->translate(KnownTranslationFactory::language_selected($this->language->getName(), $this->language->getLang()))); if(VersionInfo::IS_DEVELOPMENT_BUILD){ if(!$this->configGroup->getPropertyBool(Yml::SETTINGS_ENABLE_DEV_BUILDS, false)){ @@ -877,7 +877,7 @@ class Server{ $this->memoryManager = new MemoryManager($this); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_start(TextFormat::AQUA . $this->getVersion() . TextFormat::RESET))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_start(TextFormat::AQUA . $this->getVersion() . TextFormat::RESET))); if(($poolSize = $this->configGroup->getPropertyString(Yml::SETTINGS_ASYNC_WORKERS, "auto")) === "auto"){ $poolSize = 2; @@ -937,11 +937,11 @@ class Server{ $this->onlineMode = $this->configGroup->getConfigBool(ServerProperties::XBOX_AUTH, true); if($this->onlineMode){ - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_auth_enabled())); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_auth_enabled())); }else{ - $this->logger->warning($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_auth_disabled())); - $this->logger->warning($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_authWarning())); - $this->logger->warning($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_authProperty_disabled())); + $this->logger->warning($this->language->translate(KnownTranslationFactory::pocketmine_server_auth_disabled())); + $this->logger->warning($this->language->translate(KnownTranslationFactory::pocketmine_server_authWarning())); + $this->logger->warning($this->language->translate(KnownTranslationFactory::pocketmine_server_authProperty_disabled())); } if($this->configGroup->getConfigBool(ServerProperties::HARDCORE, false) && $this->getDifficulty() < World::DIFFICULTY_HARD){ @@ -952,17 +952,17 @@ class Server{ $this->serverID = Utils::getMachineUniqueId($this->getIp() . $this->getPort()); - $this->getLogger()->debug("Server unique id: " . $this->getServerUniqueId()); - $this->getLogger()->debug("Machine unique id: " . Utils::getMachineUniqueId()); + $this->logger->debug("Server unique id: " . $this->getServerUniqueId()); + $this->logger->debug("Machine unique id: " . Utils::getMachineUniqueId()); $this->network = new Network($this->logger); $this->network->setName($this->getMotd()); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_info( + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_info( $this->getName(), (VersionInfo::IS_DEVELOPMENT_BUILD ? TextFormat::YELLOW : "") . $this->getPocketMineVersion() . TextFormat::RESET ))); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_license($this->getName()))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_license($this->getName()))); TimingsHandler::setEnabled($this->configGroup->getPropertyBool(Yml::SETTINGS_ENABLE_PROFILING, false)); $this->profilingTickRate = $this->configGroup->getPropertyInt(Yml::SETTINGS_PROFILE_REPORT_TRIGGER, self::TARGET_TICKS_PER_SECOND); @@ -973,7 +973,7 @@ class Server{ $this->craftingManager = CraftingManagerFromDataHelper::make(Path::join(\pocketmine\BEDROCK_DATA_PATH, "recipes")); - $this->resourceManager = new ResourcePackManager(Path::join($this->getDataPath(), "resource_packs"), $this->logger); + $this->resourceManager = new ResourcePackManager(Path::join($this->dataPath, "resource_packs"), $this->logger); $pluginGraylist = null; $graylistFile = Path::join($this->dataPath, "plugin_list.yml"); @@ -987,7 +987,7 @@ class Server{ $this->forceShutdownExit(); return; } - $this->pluginManager = new PluginManager($this, $this->configGroup->getPropertyBool(Yml::PLUGINS_LEGACY_DATA_DIR, true) ? null : Path::join($this->getDataPath(), "plugin_data"), $pluginGraylist); + $this->pluginManager = new PluginManager($this, $this->configGroup->getPropertyBool(Yml::PLUGINS_LEGACY_DATA_DIR, true) ? null : Path::join($this->dataPath, "plugin_data"), $pluginGraylist); $this->pluginManager->registerInterface(new PharPluginLoader($this->autoloader)); $this->pluginManager->registerInterface(new ScriptPluginLoader()); @@ -1049,9 +1049,9 @@ class Server{ $this->configGroup->save(); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_defaultGameMode($this->getGamemode()->getTranslatableName()))); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_donate(TextFormat::AQUA . "https://patreon.com/pocketminemp" . TextFormat::RESET))); - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_startFinished(strval(round(microtime(true) - $this->startTime, 3))))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_defaultGameMode($this->getGamemode()->getTranslatableName()))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_donate(TextFormat::AQUA . "https://patreon.com/pocketminemp" . TextFormat::RESET))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_startFinished(strval(round(microtime(true) - $this->startTime, 3))))); $forwarder = new BroadcastLoggerForwarder($this, $this->logger, $this->language); $this->subscribeToBroadcastChannel(self::BROADCAST_CHANNEL_ADMINISTRATIVE, $forwarder); @@ -1139,13 +1139,13 @@ class Server{ if($this->worldManager->getDefaultWorld() === null){ $default = $this->configGroup->getConfigString(ServerProperties::DEFAULT_WORLD_NAME, "world"); if(trim($default) == ""){ - $this->getLogger()->warning("level-name cannot be null, using default"); + $this->logger->warning("level-name cannot be null, using default"); $default = "world"; $this->configGroup->setConfigString(ServerProperties::DEFAULT_WORLD_NAME, "world"); } if(!$this->worldManager->loadWorld($default, true)){ if($this->worldManager->isWorldGenerated($default)){ - $this->getLogger()->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_level_defaultError())); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_level_defaultError())); return false; } @@ -1154,7 +1154,7 @@ class Server{ $generatorClass = $getGenerator($generatorName, $generatorOptions, $default); if($generatorClass === null){ - $this->getLogger()->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_level_defaultError())); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_level_defaultError())); return false; } $creationOptions = WorldCreationOptions::create() @@ -1200,7 +1200,7 @@ class Server{ return false; } if($rakLibRegistered){ - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_networkStart($prettyIp, (string) $port))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_networkStart($prettyIp, (string) $port))); } if($useQuery){ if(!$rakLibRegistered){ @@ -1208,7 +1208,7 @@ class Server{ //if it's not registered we need to make sure Query still works $this->network->registerInterface(new DedicatedQueryNetworkInterface($ip, $port, $ipV6, new \PrefixedLogger($this->logger, "Dedicated Query Interface"))); } - $this->logger->info($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_query_running($prettyIp, (string) $port))); + $this->logger->info($this->language->translate(KnownTranslationFactory::pocketmine_server_query_running($prettyIp, (string) $port))); } return true; } @@ -1456,7 +1456,7 @@ class Server{ $this->shutdown(); if(isset($this->pluginManager)){ - $this->getLogger()->debug("Disabling all plugins"); + $this->logger->debug("Disabling all plugins"); $this->pluginManager->disablePlugins(); } @@ -1465,34 +1465,34 @@ class Server{ } if(isset($this->worldManager)){ - $this->getLogger()->debug("Unloading all worlds"); + $this->logger->debug("Unloading all worlds"); foreach($this->worldManager->getWorlds() as $world){ $this->worldManager->unloadWorld($world, true); } } - $this->getLogger()->debug("Removing event handlers"); + $this->logger->debug("Removing event handlers"); HandlerListManager::global()->unregisterAll(); if(isset($this->asyncPool)){ - $this->getLogger()->debug("Shutting down async task worker pool"); + $this->logger->debug("Shutting down async task worker pool"); $this->asyncPool->shutdown(); } if(isset($this->configGroup)){ - $this->getLogger()->debug("Saving properties"); + $this->logger->debug("Saving properties"); $this->configGroup->save(); } if($this->console !== null){ - $this->getLogger()->debug("Closing console"); + $this->logger->debug("Closing console"); $this->console->quit(); } if(isset($this->network)){ - $this->getLogger()->debug("Stopping network interfaces"); + $this->logger->debug("Stopping network interfaces"); foreach($this->network->getInterfaces() as $interface){ - $this->getLogger()->debug("Stopping network interface " . get_class($interface)); + $this->logger->debug("Stopping network interface " . get_class($interface)); $this->network->unregisterInterface($interface); } } @@ -1560,7 +1560,7 @@ class Server{ } private function writeCrashDumpFile(CrashDump $dump) : string{ - $crashFolder = Path::join($this->getDataPath(), "crashdumps"); + $crashFolder = Path::join($this->dataPath, "crashdumps"); if(!is_dir($crashFolder)){ mkdir($crashFolder); } @@ -1591,17 +1591,17 @@ class Server{ ini_set("error_reporting", '0'); ini_set("memory_limit", '-1'); //Fix error dump not dumped on memory problems try{ - $this->logger->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_crash_create())); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_crash_create())); $dump = new CrashDump($this, $this->pluginManager ?? null); $crashDumpPath = $this->writeCrashDumpFile($dump); - $this->logger->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_crash_submit($crashDumpPath))); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_crash_submit($crashDumpPath))); if($this->configGroup->getPropertyBool(Yml::AUTO_REPORT_ENABLED, true)){ $report = true; - $stamp = Path::join($this->getDataPath(), "crashdumps", ".last_crash"); + $stamp = Path::join($this->dataPath, "crashdumps", ".last_crash"); $crashInterval = 120; //2 minutes if(($lastReportTime = @filemtime($stamp)) !== false && $lastReportTime + $crashInterval >= time()){ $report = false; @@ -1632,7 +1632,7 @@ class Server{ if(isset($data->crashId) && is_int($data->crashId) && isset($data->crashUrl) && is_string($data->crashUrl)){ $reportId = $data->crashId; $reportUrl = $data->crashUrl; - $this->logger->emergency($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_crash_archive($reportUrl, (string) $reportId))); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_crash_archive($reportUrl, (string) $reportId))); }elseif(isset($data->error) && is_string($data->error)){ $this->logger->emergency("Automatic crash report submission failed: $data->error"); }else{ @@ -1646,7 +1646,7 @@ class Server{ }catch(\Throwable $e){ $this->logger->logException($e); try{ - $this->logger->critical($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_crash_error($e->getMessage()))); + $this->logger->critical($this->language->translate(KnownTranslationFactory::pocketmine_crash_error($e->getMessage()))); }catch(\Throwable $e){} } @@ -1764,7 +1764,7 @@ class Server{ echo "\x1b]0;" . $this->getName() . " " . $this->getPocketMineVersion() . - " | Online $online/" . $this->getMaxPlayers() . + " | Online $online/" . $this->maxPlayers . ($connecting > 0 ? " (+$connecting connecting)" : "") . " | Memory " . $usage . " | U " . round($bandwidthStats->getSend()->getAverageBytes() / 1024, 2) . @@ -1829,10 +1829,10 @@ class Server{ } if(($this->tickCounter % self::TICKS_PER_TPS_OVERLOAD_WARNING) === 0 && $this->getTicksPerSecondAverage() < self::TPS_OVERLOAD_WARNING_THRESHOLD){ - $this->logger->warning($this->getLanguage()->translate(KnownTranslationFactory::pocketmine_server_tickOverload())); + $this->logger->warning($this->language->translate(KnownTranslationFactory::pocketmine_server_tickOverload())); } - $this->getMemoryManager()->check(); + $this->memoryManager->check(); if($this->console !== null){ Timings::$serverCommand->startTiming(); From 13f34a500cd6efdebaed7557c6b3b6d4d07584a6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Nov 2023 12:59:38 +0000 Subject: [PATCH 1530/1858] PluginBase: clean up inconsistent getter vs property access usages --- src/plugin/PluginBase.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index 1b537a11c9..47ed3add3f 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -70,7 +70,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ $this->configFile = Path::join($this->dataFolder, "config.yml"); - $prefix = $this->getDescription()->getPrefix(); + $prefix = $this->description->getPrefix(); $this->logger = new PluginLogger($server->getLogger(), $prefix !== "" ? $prefix : $this->getName()); $this->scheduler = new TaskScheduler($this->getFullName()); @@ -145,14 +145,14 @@ abstract class PluginBase implements Plugin, CommandExecutor{ private function registerYamlCommands() : void{ $pluginCmds = []; - foreach(Utils::stringifyKeys($this->getDescription()->getCommands()) as $key => $data){ + foreach(Utils::stringifyKeys($this->description->getCommands()) as $key => $data){ if(str_contains($key, ":")){ - $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_commandError($key, $this->getDescription()->getFullName(), ":"))); + $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_commandError($key, $this->description->getFullName(), ":"))); continue; } $newCmd = new PluginCommand($key, $this, $this); - if(($description = $data->getDescription()) !== null){ + if(($description = $data->description) !== null){ $newCmd->setDescription($description); } @@ -163,7 +163,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ $aliasList = []; foreach($data->getAliases() as $alias){ if(str_contains($alias, ":")){ - $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_aliasError($alias, $this->getDescription()->getFullName(), ":"))); + $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_aliasError($alias, $this->description->getFullName(), ":"))); continue; } $aliasList[] = $alias; @@ -181,7 +181,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ } if(count($pluginCmds) > 0){ - $this->server->getCommandMap()->registerAll($this->getDescription()->getName(), $pluginCmds); + $this->server->getCommandMap()->registerAll($this->description->getName(), $pluginCmds); } } @@ -190,9 +190,9 @@ abstract class PluginBase implements Plugin, CommandExecutor{ * @phpstan-return (Command&PluginOwned)|null */ public function getCommand(string $name){ - $command = $this->getServer()->getPluginCommand($name); + $command = $this->server->getPluginCommand($name); if($command === null || $command->getOwningPlugin() !== $this){ - $command = $this->getServer()->getPluginCommand(strtolower($this->description->getName()) . ":" . $name); + $command = $this->server->getPluginCommand(strtolower($this->description->getName()) . ":" . $name); } if($command instanceof PluginOwned && $command->getOwningPlugin() === $this){ From 69f197dbecff1923cdcc95376ca6e73fe68ae38a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 14 Nov 2023 13:04:14 +0000 Subject: [PATCH 1531/1858] PluginBase: fixed erroneous replacement --- src/plugin/PluginBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index 47ed3add3f..da2eae824d 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -152,7 +152,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ } $newCmd = new PluginCommand($key, $this, $this); - if(($description = $data->description) !== null){ + if(($description = $data->getDescription()) !== null){ $newCmd->setDescription($description); } From 8f107e785b2ef942c35b2ef7deb71b15e1093e2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 17:06:23 +0000 Subject: [PATCH 1532/1858] Bump dessant/support-requests from 3 to 4 (#6160) Bumps [dessant/support-requests](https://github.com/dessant/support-requests) from 3 to 4. - [Release notes](https://github.com/dessant/support-requests/releases) - [Changelog](https://github.com/dessant/support-requests/blob/main/CHANGELOG.md) - [Commits](https://github.com/dessant/support-requests/compare/v3...v4) --- updated-dependencies: - dependency-name: dessant/support-requests dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/support.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/support.yml b/.github/workflows/support.yml index fe726dfef1..68da365cb5 100644 --- a/.github/workflows/support.yml +++ b/.github/workflows/support.yml @@ -8,7 +8,7 @@ jobs: support: runs-on: ubuntu-latest steps: - - uses: dessant/support-requests@v3 + - uses: dessant/support-requests@v4 with: github-token: ${{ github.token }} support-label: "Support request" From 886ed60e6aa6033022aa2e6ad64082024e28e99e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 09:39:26 +0000 Subject: [PATCH 1533/1858] Bump build/php from `3c3c483` to `19f2ee6` (#6163) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `3c3c483` to `19f2ee6`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/3c3c483baac5cb90dff057dfff4388b1dc3f217c...19f2ee6d3356db9185d341431904cd7c1dffad8c) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 3c3c483baa..19f2ee6d33 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 3c3c483baac5cb90dff057dfff4388b1dc3f217c +Subproject commit 19f2ee6d3356db9185d341431904cd7c1dffad8c From e9c5846a06aad79416288f30cfa88c98510ac436 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Nov 2023 10:06:43 +0000 Subject: [PATCH 1534/1858] World: simplify condition --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index f554479c9b..47c569d727 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2623,7 +2623,7 @@ class World implements ChunkManager{ public function isChunkPopulated(int $x, int $z) : bool{ $chunk = $this->loadChunk($x, $z); - return $chunk !== null ? $chunk->isPopulated() : false; + return $chunk !== null && $chunk->isPopulated(); } /** From 89fbb3fd0df9996ba134b871b27a313a7d430a9a Mon Sep 17 00:00:00 2001 From: ace Date: Thu, 16 Nov 2023 18:16:29 +0800 Subject: [PATCH 1535/1858] Fix loading of Item Frame item rotation (#6123) --- src/block/tile/ItemFrame.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/block/tile/ItemFrame.php b/src/block/tile/ItemFrame.php index faf0ddbb69..7d003770e6 100644 --- a/src/block/tile/ItemFrame.php +++ b/src/block/tile/ItemFrame.php @@ -27,6 +27,7 @@ use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\FloatTag; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\world\World; @@ -52,13 +53,17 @@ class ItemFrame extends Spawnable{ if(($itemTag = $nbt->getCompoundTag(self::TAG_ITEM)) !== null){ $this->item = Item::nbtDeserialize($itemTag); } - $this->itemRotation = $nbt->getByte(self::TAG_ITEM_ROTATION, $this->itemRotation); + if($nbt->getTag(self::TAG_ITEM_ROTATION) instanceof FloatTag){ + $this->itemRotation = (int) ($nbt->getFloat(self::TAG_ITEM_ROTATION, $this->itemRotation * 45) / 45); + } else { + $this->itemRotation = $nbt->getByte(self::TAG_ITEM_ROTATION, $this->itemRotation); + } $this->itemDropChance = $nbt->getFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); } protected function writeSaveData(CompoundTag $nbt) : void{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); - $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); + $nbt->setFloat(self::TAG_ITEM_ROTATION, $this->itemRotation * 45); if(!$this->item->isNull()){ $nbt->setTag(self::TAG_ITEM, $this->item->nbtSerialize()); } @@ -98,7 +103,7 @@ class ItemFrame extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); - $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); + $nbt->setFloat(self::TAG_ITEM_ROTATION, $this->itemRotation * 45); if(!$this->item->isNull()){ $nbt->setTag(self::TAG_ITEM, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->item)); } From a25597ca304cc9ce978ae93ed89f45c3747a2031 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 12:01:19 +0000 Subject: [PATCH 1536/1858] Server: updated documentation for prepareBatch() --- src/Server.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Server.php b/src/Server.php index f4d4a09580..63eee3b2ad 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1357,7 +1357,14 @@ class Server{ /** * @internal - * Broadcasts a list of packets in a batch to a list of players + * Promises to compress the given batch buffer using the selected compressor, optionally on a separate thread. + * + * If the buffer is smaller than the batch-threshold (usually 256), the buffer will be compressed at level 0 if supported + * by the compressor. This means that the payload will be wrapped with the appropriate header and footer, but not + * actually compressed. + * + * If the buffer is larger than the async-compression-threshold (usually 10,000), the buffer may be compressed in + * a separate thread (if available). * * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). */ From bc07778434d34c4cf01a5159794ae0a2c33a8b00 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 12:35:42 +0000 Subject: [PATCH 1537/1858] Avoid unnecessary CompressBatchPromise allocations for sync-prepared batches Sync-prepared batches account for the vast majority of outbound packets. Avoiding these useless objects further reduces the overhead of zero-compressed packets, as the creation of these objects is a significant part of the overhead for these cases. closes #6157 --- src/Server.php | 9 +-- src/network/mcpe/NetworkSession.php | 79 +++++++++++-------- .../mcpe/StandardPacketBroadcaster.php | 4 +- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/Server.php b/src/Server.php index c490d7837e..48f641947d 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1368,7 +1368,7 @@ class Server{ * * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). */ - public function prepareBatch(string $buffer, Compressor $compressor, ?bool $sync = null, ?TimingsHandler $timings = null) : CompressBatchPromise{ + public function prepareBatch(string $buffer, Compressor $compressor, ?bool $sync = null, ?TimingsHandler $timings = null) : CompressBatchPromise|string{ $timings ??= Timings::$playerNetworkSendCompress; try{ $timings->startTiming(); @@ -1378,15 +1378,14 @@ class Server{ $sync = !$this->networkCompressionAsync || $threshold === null || strlen($buffer) < $threshold; } - $promise = new CompressBatchPromise(); if(!$sync && strlen($buffer) >= $this->networkCompressionAsyncThreshold){ + $promise = new CompressBatchPromise(); $task = new CompressBatchTask($buffer, $promise, $compressor); $this->asyncPool->submitTask($task); - }else{ - $promise->resolve($compressor->compress($buffer)); + return $promise; } - return $promise; + return $compressor->compress($buffer); }finally{ $timings->stopTiming(); } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 4f01526364..a930cfa555 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -117,6 +117,7 @@ use function count; use function get_class; use function implode; use function in_array; +use function is_string; use function json_encode; use function random_bytes; use function str_split; @@ -158,8 +159,8 @@ class NetworkSession{ private array $sendBuffer = []; /** - * @var \SplQueue|CompressBatchPromise[] - * @phpstan-var \SplQueue + * @var \SplQueue|CompressBatchPromise[]|string[] + * @phpstan-var \SplQueue */ private \SplQueue $compressedQueue; private bool $forceAsyncCompression = true; @@ -525,13 +526,12 @@ class NetworkSession{ PacketBatch::encodeRaw($stream, $this->sendBuffer); if($this->enableCompression){ - $promise = $this->server->prepareBatch($stream->getBuffer(), $this->compressor, $syncMode, Timings::$playerNetworkSendCompressSessionBuffer); + $batch = $this->server->prepareBatch($stream->getBuffer(), $this->compressor, $syncMode, Timings::$playerNetworkSendCompressSessionBuffer); }else{ - $promise = new CompressBatchPromise(); - $promise->resolve($stream->getBuffer()); + $batch = $stream->getBuffer(); } $this->sendBuffer = []; - $this->queueCompressedNoBufferFlush($promise, $immediate); + $this->queueCompressedNoBufferFlush($batch, $immediate); }finally{ Timings::$playerNetworkSend->stopTiming(); } @@ -550,7 +550,7 @@ class NetworkSession{ public function getTypeConverter() : TypeConverter{ return $this->typeConverter; } - public function queueCompressed(CompressBatchPromise $payload, bool $immediate = false) : void{ + public function queueCompressed(CompressBatchPromise|string $payload, bool $immediate = false) : void{ Timings::$playerNetworkSend->startTiming(); try{ $this->flushSendBuffer($immediate); //Maintain ordering if possible @@ -560,36 +560,25 @@ class NetworkSession{ } } - private function queueCompressedNoBufferFlush(CompressBatchPromise $payload, bool $immediate = false) : void{ + private function queueCompressedNoBufferFlush(CompressBatchPromise|string $batch, bool $immediate = false) : void{ Timings::$playerNetworkSend->startTiming(); try{ - if($immediate){ + if(is_string($batch)){ + if($immediate){ + //Skips all queues + $this->sendEncoded($batch, true); + }else{ + $this->compressedQueue->enqueue($batch); + $this->flushCompressedQueue(); + } + }elseif($immediate){ //Skips all queues - $this->sendEncoded($payload->getResult(), true); + $this->sendEncoded($batch->getResult(), true); }else{ - $this->compressedQueue->enqueue($payload); - $payload->onResolve(function(CompressBatchPromise $payload) : void{ - if($this->connected && $this->compressedQueue->bottom() === $payload){ - Timings::$playerNetworkSend->startTiming(); - try{ - $this->compressedQueue->dequeue(); //result unused - $this->sendEncoded($payload->getResult()); - - while(!$this->compressedQueue->isEmpty()){ - /** @var CompressBatchPromise $current */ - $current = $this->compressedQueue->bottom(); - if($current->hasResult()){ - $this->compressedQueue->dequeue(); - - $this->sendEncoded($current->getResult()); - }else{ - //can't send any more queued until this one is ready - break; - } - } - }finally{ - Timings::$playerNetworkSend->stopTiming(); - } + $this->compressedQueue->enqueue($batch); + $batch->onResolve(function() : void{ + if($this->connected){ + $this->flushCompressedQueue(); } }); } @@ -598,6 +587,30 @@ class NetworkSession{ } } + private function flushCompressedQueue() : void{ + Timings::$playerNetworkSend->startTiming(); + try{ + while(!$this->compressedQueue->isEmpty()){ + /** @var CompressBatchPromise|string $current */ + $current = $this->compressedQueue->bottom(); + if(is_string($current)){ + $this->compressedQueue->dequeue(); + $this->sendEncoded($current); + + }elseif($current->hasResult()){ + $this->compressedQueue->dequeue(); + $this->sendEncoded($current->getResult()); + + }else{ + //can't send any more queued until this one is ready + break; + } + } + }finally{ + Timings::$playerNetworkSend->stopTiming(); + } + } + private function sendEncoded(string $payload, bool $immediate = false) : void{ if($this->cipher !== null){ Timings::$playerNetworkSendEncrypt->startTiming(); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index c200859fdd..1de6f80fe8 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -88,9 +88,9 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ PacketBatch::encodeRaw($stream, $packetBuffers); $batchBuffer = $stream->getBuffer(); - $promise = $this->server->prepareBatch($batchBuffer, $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); + $batch = $this->server->prepareBatch($batchBuffer, $compressor, timings: Timings::$playerNetworkSendCompressBroadcast); foreach($compressorTargets as $target){ - $target->queueCompressed($promise); + $target->queueCompressed($batch); } }else{ foreach($compressorTargets as $target){ From 67ad2bad175916372f9883a73188f120e66f6415 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 13:24:06 +0000 Subject: [PATCH 1538/1858] World: fixed edge case that could lead to crash during block update sending --- src/world/World.php | 6 +++++- tests/phpstan/configs/actual-problems.neon | 5 ----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 3e11312721..7ebcbfdd1a 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1016,8 +1016,12 @@ class World implements ChunkManager{ continue; } World::getXZ($index, $chunkX, $chunkZ); + if(!$this->isChunkLoaded($chunkX, $chunkZ)){ + //a previous chunk may have caused this one to be unloaded by a ChunkListener + continue; + } if(count($blocks) > 512){ - $chunk = $this->getChunk($chunkX, $chunkZ); + $chunk = $this->getChunk($chunkX, $chunkZ) ?? throw new AssumptionFailedError("We already checked that the chunk is loaded"); foreach($this->getChunkPlayers($chunkX, $chunkZ) as $p){ $p->onChunkChanged($chunkX, $chunkZ, $chunk); } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index cf7e9b02f9..aaf4c0ab14 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -960,11 +960,6 @@ parameters: count: 2 path: ../../../src/world/World.php - - - message: "#^Parameter \\#3 \\$chunk of method pocketmine\\\\player\\\\Player\\:\\:onChunkChanged\\(\\) expects pocketmine\\\\world\\\\format\\\\Chunk, pocketmine\\\\world\\\\format\\\\Chunk\\|null given\\.$#" - count: 1 - path: ../../../src/world/World.php - - message: "#^Parameter \\#3 \\$y of method pocketmine\\\\block\\\\Block\\:\\:position\\(\\) expects int, float\\|int given\\.$#" count: 2 From 0f620fad94a6db83e87746ce37baa1657f76caf0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 13:30:44 +0000 Subject: [PATCH 1539/1858] ChunkCache: inline unnecessary function --- src/network/mcpe/cache/ChunkCache.php | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/network/mcpe/cache/ChunkCache.php b/src/network/mcpe/cache/ChunkCache.php index 9c12a3bb3f..71010a041c 100644 --- a/src/network/mcpe/cache/ChunkCache.php +++ b/src/network/mcpe/cache/ChunkCache.php @@ -136,32 +136,19 @@ class ChunkCache implements ChunkListener{ return $existing !== null; } - /** - * Restarts an async request for an unresolved chunk. - * - * @throws \InvalidArgumentException - */ - private function restartPendingRequest(int $chunkX, int $chunkZ) : void{ - $chunkHash = World::chunkHash($chunkX, $chunkZ); - $existing = $this->caches[$chunkHash] ?? null; - if($existing === null || $existing->hasResult()){ - throw new \InvalidArgumentException("Restart can only be applied to unresolved promises"); - } - $existing->cancel(); - unset($this->caches[$chunkHash]); - - $this->request($chunkX, $chunkZ)->onResolve(...$existing->getResolveCallbacks()); - } - /** * @throws \InvalidArgumentException */ private function destroyOrRestart(int $chunkX, int $chunkZ) : void{ - $cache = $this->caches[World::chunkHash($chunkX, $chunkZ)] ?? null; + $chunkPosHash = World::chunkHash($chunkX, $chunkZ); + $cache = $this->caches[$chunkPosHash] ?? null; if($cache !== null){ if(!$cache->hasResult()){ //some requesters are waiting for this chunk, so their request needs to be fulfilled - $this->restartPendingRequest($chunkX, $chunkZ); + $cache->cancel(); + unset($this->caches[$chunkPosHash]); + + $this->request($chunkX, $chunkZ)->onResolve(...$cache->getResolveCallbacks()); }else{ //dump the cache, it'll be regenerated the next time it's requested $this->destroy($chunkX, $chunkZ); From fbcf4649eb77355731096ff0706385b7466a85dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 13:58:41 +0000 Subject: [PATCH 1540/1858] Avoid unnecessary Entity::getWorld() calls in loops --- src/entity/projectile/Projectile.php | 7 ++++--- src/entity/projectile/Snowball.php | 3 ++- src/player/Player.php | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 0507ebdb62..55950b6a6d 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -173,8 +173,9 @@ abstract class Projectile extends Entity{ $entityHit = null; $hitResult = null; + $world = $this->getWorld(); foreach(VoxelRayTrace::betweenPoints($start, $end) as $vector3){ - $block = $this->getWorld()->getBlockAt($vector3->x, $vector3->y, $vector3->z); + $block = $world->getBlockAt($vector3->x, $vector3->y, $vector3->z); $blockHitResult = $this->calculateInterceptWithBlock($block, $start, $end); if($blockHitResult !== null){ @@ -188,7 +189,7 @@ abstract class Projectile extends Entity{ $entityDistance = PHP_INT_MAX; $newDiff = $end->subtractVector($start); - foreach($this->getWorld()->getCollidingEntities($this->boundingBox->addCoord($newDiff->x, $newDiff->y, $newDiff->z)->expand(1, 1, 1), $this) as $entity){ + foreach($world->getCollidingEntities($this->boundingBox->addCoord($newDiff->x, $newDiff->y, $newDiff->z)->expand(1, 1, 1), $this) as $entity){ if($entity->getId() === $this->getOwningEntityId() && $this->ticksLived < 5){ continue; } @@ -256,7 +257,7 @@ abstract class Projectile extends Entity{ ); } - $this->getWorld()->onEntityMoved($this); + $world->onEntityMoved($this); $this->checkBlockIntersections(); Timings::$projectileMove->stopTiming(); diff --git a/src/entity/projectile/Snowball.php b/src/entity/projectile/Snowball.php index cf9d7c6894..30a0ba6e25 100644 --- a/src/entity/projectile/Snowball.php +++ b/src/entity/projectile/Snowball.php @@ -31,8 +31,9 @@ class Snowball extends Throwable{ public static function getNetworkTypeId() : string{ return EntityIds::SNOWBALL; } protected function onHit(ProjectileHitEvent $event) : void{ + $world = $this->getWorld(); for($i = 0; $i < 6; ++$i){ - $this->getWorld()->addParticle($this->location, new SnowballPoofParticle()); + $world->addParticle($this->location, new SnowballPoofParticle()); } } } diff --git a/src/player/Player.php b/src/player/Player.php index 0ee9d7dc2a..92e15ddd38 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -813,13 +813,13 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->usedChunks[$index] = UsedChunkStatus::REQUESTED_GENERATION; $this->activeChunkGenerationRequests[$index] = true; unset($this->loadQueue[$index]); - $this->getWorld()->registerChunkLoader($this->chunkLoader, $X, $Z, true); - $this->getWorld()->registerChunkListener($this, $X, $Z); + $world->registerChunkLoader($this->chunkLoader, $X, $Z, true); + $world->registerChunkListener($this, $X, $Z); if(isset($this->tickingChunks[$index])){ - $this->getWorld()->registerTickingChunk($this->chunkTicker, $X, $Z); + $world->registerTickingChunk($this->chunkTicker, $X, $Z); } - $this->getWorld()->requestChunkPopulation($X, $Z, $this->chunkLoader)->onCompletion( + $world->requestChunkPopulation($X, $Z, $this->chunkLoader)->onCompletion( function() use ($X, $Z, $index, $world) : void{ if(!$this->isConnected() || !isset($this->usedChunks[$index]) || $world !== $this->getWorld()){ return; From a1748a92ca9edb5f6b305526241ceff282a4e381 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Nov 2023 14:00:25 +0000 Subject: [PATCH 1541/1858] Avoid unnecessary TypeConverter::getInstance() calls we already have it available within these contexts --- src/network/mcpe/NetworkSession.php | 4 ++-- src/network/mcpe/cache/CraftingDataCache.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index a930cfa555..16baee0aee 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1131,12 +1131,12 @@ class NetworkSession{ */ public function syncPlayerList(array $players) : void{ $this->sendDataPacket(PlayerListPacket::add(array_map(function(Player $player) : PlayerListEntry{ - return PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), TypeConverter::getInstance()->getSkinAdapter()->toSkinData($player->getSkin()), $player->getXuid()); + return PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), $this->typeConverter->getSkinAdapter()->toSkinData($player->getSkin()), $player->getXuid()); }, $players))); } public function onPlayerAdded(Player $p) : void{ - $this->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($p->getUniqueId(), $p->getId(), $p->getDisplayName(), TypeConverter::getInstance()->getSkinAdapter()->toSkinData($p->getSkin()), $p->getXuid())])); + $this->sendDataPacket(PlayerListPacket::add([PlayerListEntry::createAdditionEntry($p->getUniqueId(), $p->getId(), $p->getDisplayName(), $this->typeConverter->getSkinAdapter()->toSkinData($p->getSkin()), $p->getXuid())])); } public function onPlayerRemoved(Player $p) : void{ diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 1d4023b41e..1aa64c5970 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -160,7 +160,7 @@ final class CraftingDataCache{ } $potionContainerChangeRecipes = []; - $itemTypeDictionary = TypeConverter::getInstance()->getItemTypeDictionary(); + $itemTypeDictionary = $converter->getItemTypeDictionary(); foreach($manager->getPotionContainerChangeRecipes() as $recipe){ $input = $itemTypeDictionary->fromStringId($recipe->getInputItemId()); $ingredient = $converter->coreRecipeIngredientToNet($recipe->getIngredient())->getDescriptor(); From 06e2d36294ca6d35ff32de9fe60fdb80d50cf8ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:06:32 +0000 Subject: [PATCH 1542/1858] Bump build/php from `19f2ee6` to `6b4c9c7` (#6171) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `19f2ee6` to `6b4c9c7`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/19f2ee6d3356db9185d341431904cd7c1dffad8c...6b4c9c76bdb54de7ac0db0f867db6d35f27e7faa) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 19f2ee6d33..6b4c9c76bd 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 19f2ee6d3356db9185d341431904cd7c1dffad8c +Subproject commit 6b4c9c76bdb54de7ac0db0f867db6d35f27e7faa From c1f0f13d5a3d52feb8b5a5716d556c8fc3cc6497 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Nov 2023 16:29:11 +0000 Subject: [PATCH 1543/1858] Add PHP 8.3 to test matrix --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c57cecb841..1b2cfb9bb5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: ["8.1", "8.2"] + php: ["8.1", "8.2", "8.3"] steps: - uses: actions/checkout@v4 @@ -49,7 +49,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: ["8.1", "8.2"] + php: ["8.1", "8.2", "8.3"] steps: - uses: actions/checkout@v4 @@ -84,7 +84,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: ["8.1", "8.2"] + php: ["8.1", "8.2", "8.3"] steps: - uses: actions/checkout@v4 @@ -121,7 +121,7 @@ jobs: fail-fast: false matrix: image: [ubuntu-20.04] - php: ["8.1", "8.2"] + php: ["8.1", "8.2", "8.3"] steps: - uses: actions/checkout@v4 From 233c8b746d214af1fadef46468cc987f63634155 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:31:18 +0000 Subject: [PATCH 1544/1858] Bump phpstan/phpstan from 1.10.41 to 1.10.44 (#6172) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.41 to 1.10.44. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.41...1.10.44) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index c7bfd7d27f..0a56a7cafa 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.41", + "phpstan/phpstan": "1.10.44", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 2888a32912..87309aec9b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5c19f4766fd04be0cbd38d9f4681864e", + "content-hash": "b50d8b28bd221791bf6e8c949e15416f", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.41", + "version": "1.10.44", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "c6174523c2a69231df55bdc65b61655e72876d76" + "reference": "bf84367c53a23f759513985c54ffe0d0c249825b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6174523c2a69231df55bdc65b61655e72876d76", - "reference": "c6174523c2a69231df55bdc65b61655e72876d76", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bf84367c53a23f759513985c54ffe0d0c249825b", + "reference": "bf84367c53a23f759513985c54ffe0d0c249825b", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-11-05T12:57:57+00:00" + "time": "2023-11-21T16:30:46+00:00" }, { "name": "phpstan/phpstan-phpunit", From d51475dc72e515438455eca1b0330c8ecb47795a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:31:34 +0000 Subject: [PATCH 1545/1858] Bump docker/build-push-action from 5.0.0 to 5.1.0 (#6169) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5.0.0...v5.1.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 406bff36c0..a8ec707dad 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v5.0.0 + uses: docker/build-push-action@v5.1.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.0.0 + uses: docker/build-push-action@v5.1.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.0.0 + uses: docker/build-push-action@v5.1.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.0.0 + uses: docker/build-push-action@v5.1.0 with: push: true context: ./pocketmine-mp From bc11894f0aa4f7bb2188650891776f7baeae6c07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:01:36 +0000 Subject: [PATCH 1546/1858] Bump build/php from `6b4c9c7` to `b0ffbdb` (#6178) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `6b4c9c7` to `b0ffbdb`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/6b4c9c76bdb54de7ac0db0f867db6d35f27e7faa...b0ffbdbe33cdfbb84b4214b7d516fdfbd34a13b5) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 6b4c9c76bd..b0ffbdbe33 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 6b4c9c76bdb54de7ac0db0f867db6d35f27e7faa +Subproject commit b0ffbdbe33cdfbb84b4214b7d516fdfbd34a13b5 From d596dc571da70079f3dc00631adac8ab81fb6ba4 Mon Sep 17 00:00:00 2001 From: ace Date: Mon, 27 Nov 2023 22:46:20 +0800 Subject: [PATCH 1547/1858] Fix pitcher pod wrongly registered as a block (#6162) --- src/block/DoublePitcherCrop.php | 11 ++++++ src/block/PitcherCrop.php | 5 +++ .../ItemSerializerDeserializerRegistrar.php | 2 +- src/item/ItemTypeIds.php | 3 +- src/item/PitcherPod.php | 34 +++++++++++++++++++ src/item/StringToItemParser.php | 2 +- src/item/VanillaItems.php | 2 ++ 7 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/item/PitcherPod.php diff --git a/src/block/DoublePitcherCrop.php b/src/block/DoublePitcherCrop.php index e34dd1bafe..1233ed05d7 100644 --- a/src/block/DoublePitcherCrop.php +++ b/src/block/DoublePitcherCrop.php @@ -29,6 +29,7 @@ use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -106,4 +107,14 @@ final class DoublePitcherCrop extends DoublePlant{ $this->grow(null); } } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [ + $this->age >= self::MAX_AGE ? VanillaBlocks::PITCHER_PLANT()->asItem() : VanillaItems::PITCHER_POD() + ]; + } + + public function asItem() : Item{ + return VanillaItems::PITCHER_POD(); + } } diff --git a/src/block/PitcherCrop.php b/src/block/PitcherCrop.php index e0b9af3d27..d41aed284d 100644 --- a/src/block/PitcherCrop.php +++ b/src/block/PitcherCrop.php @@ -30,6 +30,7 @@ use pocketmine\block\utils\StaticSupportTrait; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -101,4 +102,8 @@ final class PitcherCrop extends Flowable{ $this->grow(null); } } + + public function asItem() : Item{ + return VanillaItems::PITCHER_POD(); + } } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index a2bed6ee11..0c6dadc462 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -147,7 +147,6 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR()); $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR()); $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART()); - $this->map1to1Block(Ids::PITCHER_POD, Blocks::PITCHER_CROP()); $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER()); $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR()); $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE()); @@ -326,6 +325,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::PAINTING, Items::PAINTING()); $this->map1to1Item(Ids::PAPER, Items::PAPER()); $this->map1to1Item(Ids::PHANTOM_MEMBRANE, Items::PHANTOM_MEMBRANE()); + $this->map1to1Item(Ids::PITCHER_POD, Items::PITCHER_POD()); $this->map1to1Item(Ids::POISONOUS_POTATO, Items::POISONOUS_POTATO()); $this->map1to1Item(Ids::POPPED_CHORUS_FRUIT, Items::POPPED_CHORUS_FRUIT()); $this->map1to1Item(Ids::PORKCHOP, Items::RAW_PORKCHOP()); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 451d25a59d..bf688118bc 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -322,8 +322,9 @@ final class ItemTypeIds{ public const RIB_ARMOR_TRIM_SMITHING_TEMPLATE = 20283; public const EYE_ARMOR_TRIM_SMITHING_TEMPLATE = 20284; public const SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE = 20285; + public const PITCHER_POD = 20286; - public const FIRST_UNUSED_ITEM_ID = 20286; + public const FIRST_UNUSED_ITEM_ID = 20287; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/PitcherPod.php b/src/item/PitcherPod.php new file mode 100644 index 0000000000..be9393515d --- /dev/null +++ b/src/item/PitcherPod.php @@ -0,0 +1,34 @@ +registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP()); $result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN)); $result->registerBlock("pitcher_plant", fn() => Blocks::PITCHER_PLANT()); - $result->registerBlock("pitcher_pod", fn() => Blocks::PITCHER_CROP()); $result->registerBlock("plank", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("planks", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER)); @@ -1407,6 +1406,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("painting", fn() => Items::PAINTING()); $result->register("paper", fn() => Items::PAPER()); $result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE()); + $result->register("pitcher_pod", fn() => Items::PITCHER_POD()); $result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO()); $result->register("popped_chorus_fruit", fn() => Items::POPPED_CHORUS_FRUIT()); $result->register("porkchop", fn() => Items::RAW_PORKCHOP()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 5f4f60f8e0..f9aca9a767 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -240,6 +240,7 @@ use function strtolower; * @method static PaintingItem PAINTING() * @method static Item PAPER() * @method static Item PHANTOM_MEMBRANE() + * @method static PitcherPod PITCHER_POD() * @method static PoisonousPotato POISONOUS_POTATO() * @method static Item POPPED_CHORUS_FRUIT() * @method static Potato POTATO() @@ -503,6 +504,7 @@ final class VanillaItems{ self::register("painting", new PaintingItem(new IID(Ids::PAINTING), "Painting")); self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); self::register("phantom_membrane", new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); + self::register("pitcher_pod", new PitcherPod(new IID(Ids::PITCHER_POD), "Pitcher Pod")); self::register("poisonous_potato", new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); self::register("popped_chorus_fruit", new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); self::register("potato", new Potato(new IID(Ids::POTATO), "Potato")); From b2df405cc0355dcffe202bc4040fae316940d427 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Nov 2023 16:31:59 +0000 Subject: [PATCH 1548/1858] NetworkSession: Send less information to clients on error disconnects in particular, the information from VerifyLoginTask shouldn't be sent to clients, as it could contain sensitive information. This change only affects disconnection screens. The server log shows the same amount of information as before (though formatted differently in some cases). --- src/network/mcpe/NetworkSession.php | 20 ++++++++++++++----- .../mcpe/handler/LoginPacketHandler.php | 6 ++++-- .../handler/ResourcePacksPacketHandler.php | 6 ++++-- src/network/mcpe/raklib/RakLibInterface.php | 7 +++++-- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 16baee0aee..1a4c85255e 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -236,8 +236,10 @@ class NetworkSession{ $this->onPlayerCreated(...), function() : void{ //TODO: this should never actually occur... right? - $this->logger->error("Failed to create player"); - $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal()); + $this->disconnectWithError( + reason: "Failed to create player", + disconnectScreenMessage: KnownTranslationFactory::pocketmine_disconnect_error_internal() + ); } ); } @@ -675,8 +677,13 @@ class NetworkSession{ }, $reason); } - public function disconnectWithError(Translatable|string $reason) : void{ - $this->disconnect(KnownTranslationFactory::pocketmine_disconnect_error($reason, implode("-", str_split(bin2hex(random_bytes(6)), 4)))); + public function disconnectWithError(Translatable|string $reason, Translatable|string|null $disconnectScreenMessage = null) : void{ + $errorId = implode("-", str_split(bin2hex(random_bytes(6)), 4)); + + $this->disconnect( + reason: KnownTranslationFactory::pocketmine_disconnect_error($reason, $errorId)->prefix(TextFormat::RED), + disconnectScreenMessage: KnownTranslationFactory::pocketmine_disconnect_error($disconnectScreenMessage ?? $reason, $errorId), + ); } public function disconnectIncompatibleProtocol(int $protocolVersion) : void{ @@ -735,7 +742,10 @@ class NetworkSession{ } if($error !== null){ - $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error)); + $this->disconnectWithError( + reason: KnownTranslationFactory::pocketmine_disconnect_invalidSession($error), + disconnectScreenMessage: KnownTranslationFactory::pocketmine_disconnect_error_authentication() + ); return; } diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 9ac82bc5fe..26e2bf0283 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -73,8 +73,10 @@ class LoginPacketHandler extends PacketHandler{ try{ $skin = $this->session->getTypeConverter()->getSkinAdapter()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); }catch(\InvalidArgumentException | InvalidSkinException $e){ - $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); - $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidSkin()); + $this->session->disconnectWithError( + reason: "Invalid skin: " . $e->getMessage(), + disconnectScreenMessage: KnownTranslationFactory::disconnectionScreen_invalidSkin() + ); return true; } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 08ce53efe2..3d413ee5a1 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -85,8 +85,10 @@ class ResourcePacksPacketHandler extends PacketHandler{ } private function disconnectWithError(string $error) : void{ - $this->session->getLogger()->error("Error downloading resource packs: " . $error); - $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_resourcePack()); + $this->session->disconnectWithError( + reason: "Error downloading resource packs: " . $error, + disconnectScreenMessage: KnownTranslationFactory::disconnectionScreen_resourcePack() + ); } public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{ diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index d189cf0fd3..17aa87e839 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -219,11 +219,14 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $session->handleEncoded($buf); }catch(PacketHandlingException $e){ $logger = $session->getLogger(); - $logger->error("Bad packet: " . $e->getMessage()); + $session->disconnectWithError( + reason: "Bad packet: " . $e->getMessage(), + disconnectScreenMessage: KnownTranslationFactory::pocketmine_disconnect_error_badPacket() + ); //intentionally doesn't use logException, we don't want spammy packet error traces to appear in release mode $logger->debug(implode("\n", Utils::printableExceptionInfo($e))); - $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_badPacket()); + $this->interface->blockAddress($address, 5); }catch(\Throwable $e){ //record the name of the player who caused the crash, to make it easier to find the reproducing steps From 239f9ed83ac0d53728456bc0e7f7bfa8d0d9c143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:32:42 +0000 Subject: [PATCH 1549/1858] Bump shivammathur/setup-php from 2.27.1 to 2.28.0 (#6179) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.27.1 to 2.28.0. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.27.1...2.28.0) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index f731130981..3487dfb215 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.27.1 + uses: shivammathur/setup-php@2.28.0 with: php-version: 8.1 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 03bfedc898..0ee55a50e9 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.27.1 + uses: shivammathur/setup-php@2.28.0 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1b2cfb9bb5..b5e07399a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -173,7 +173,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.27.1 + uses: shivammathur/setup-php@2.28.0 with: php-version: 8.1 tools: php-cs-fixer:3.17 From 0984aa670d5c04e4714853dbf738f51bfa4f39e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:33:04 +0000 Subject: [PATCH 1550/1858] Bump phpstan/phpstan from 1.10.44 to 1.10.46 (#6182) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.44 to 1.10.46. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.44...1.10.46) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 0a56a7cafa..201f30f71b 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.44", + "phpstan/phpstan": "1.10.46", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 87309aec9b..40e56d90e3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b50d8b28bd221791bf6e8c949e15416f", + "content-hash": "780ac4d9e381292b0a6b01dbe9fcdd07", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.44", + "version": "1.10.46", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "bf84367c53a23f759513985c54ffe0d0c249825b" + "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bf84367c53a23f759513985c54ffe0d0c249825b", - "reference": "bf84367c53a23f759513985c54ffe0d0c249825b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", + "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T16:30:46+00:00" + "time": "2023-11-28T14:57:26+00:00" }, { "name": "phpstan/phpstan-phpunit", From bd659484539621c6d3f7c4326fb6eb810933e962 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 13:29:40 +0000 Subject: [PATCH 1551/1858] Bump phpstan/phpstan from 1.10.46 to 1.10.47 (#6189) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.46 to 1.10.47. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.46...1.10.47) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 201f30f71b..d8565b55a1 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.46", + "phpstan/phpstan": "1.10.47", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 40e56d90e3..d093646f89 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "780ac4d9e381292b0a6b01dbe9fcdd07", + "content-hash": "60e8d1f289b202a21321d35ae2375e19", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.46", + "version": "1.10.47", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70" + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-11-28T14:57:26+00:00" + "time": "2023-12-01T15:19:17+00:00" }, { "name": "phpstan/phpstan-phpunit", From 2420dee8be087da00dc9f3522de6d6838cf9d5cf Mon Sep 17 00:00:00 2001 From: TheNewHEROBRINE Date: Wed, 6 Dec 2023 14:40:09 +0100 Subject: [PATCH 1552/1858] AsyncTask: Fix retrieval of null data from the thread-local storage (#6176) --- src/scheduler/AsyncTask.php | 3 ++- tests/phpunit/scheduler/AsyncPoolTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index ba5cc424c5..b4c3ce20db 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -28,6 +28,7 @@ use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafe; use pmmp\thread\ThreadSafeArray; use pocketmine\thread\NonThreadSafeValue; +use function array_key_exists; use function assert; use function igbinary_serialize; use function igbinary_unserialize; @@ -230,7 +231,7 @@ abstract class AsyncTask extends Runnable{ */ protected function fetchLocal(string $key){ $id = spl_object_id($this); - if(!isset(self::$threadLocalStorage[$id][$key])){ + if(!isset(self::$threadLocalStorage[$id]) || !array_key_exists($key, self::$threadLocalStorage[$id])){ throw new \InvalidArgumentException("No matching thread-local data found on this thread"); } diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index a8a15146e1..54c8ccafda 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -121,4 +121,23 @@ class AsyncPoolTest extends TestCase{ usleep(50 * 1000); } } + + public function testNullComplexDataFetch() : void{ + $this->pool->submitTask(new class extends AsyncTask{ + public function __construct(){ + $this->storeLocal("null", null); + } + + public function onRun() : void{ + //dummy + } + + public function onCompletion() : void{ + AsyncPoolTest::assertNull($this->fetchLocal("null")); + } + }); + while($this->pool->collectTasks()){ + usleep(50 * 1000); + } + } } From 15574ec99a7a3e1c34c63b4f206502de825b164e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:28:14 +0000 Subject: [PATCH 1553/1858] Update composer dependencies --- composer.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/composer.lock b/composer.lock index d093646f89..611fa0aac5 100644 --- a/composer.lock +++ b/composer.lock @@ -830,16 +830,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -906,7 +906,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -918,7 +918,7 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "symfony/filesystem", @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.7", + "version": "10.1.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-10-04T15:34:17+00:00" + "time": "2023-11-23T12:23:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2878,16 +2878,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -2916,7 +2916,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -2924,7 +2924,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], From 25cca1b63f6ebf50c2918833b1d3ada6e368078a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:29:23 +0000 Subject: [PATCH 1554/1858] Changes for 1.20.50 --- composer.json | 8 +-- composer.lock | 54 +++++++------- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 3 +- .../bedrock/block/BlockStateStringValues.php | 21 +++--- src/data/bedrock/block/BlockTypeNames.php | 70 ++++++++++++++++++- .../convert/BlockObjectToStateSerializer.php | 50 ++++++------- .../convert/BlockStateSerializerHelper.php | 5 -- .../BlockStateToObjectDeserializer.php | 37 ++++------ src/data/bedrock/item/ItemTypeNames.php | 10 +++ .../mcpe/handler/InGamePacketHandler.php | 5 -- 11 files changed, 162 insertions(+), 105 deletions(-) diff --git a/composer.json b/composer.json index d8565b55a1..1a19711e90 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.3.0+bedrock-1.20.40", - "pocketmine/bedrock-data": "~2.6.0+bedrock-1.20.40", - "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", - "pocketmine/bedrock-protocol": "~25.0.0+bedrock-1.20.40", + "pocketmine/bedrock-block-upgrade-schema": "~3.4.0+bedrock-1.20.50", + "pocketmine/bedrock-data": "~2.7.0+bedrock-1.20.50", + "pocketmine/bedrock-item-upgrade-schema": "~1.6.0+bedrock-1.20.50", + "pocketmine/bedrock-protocol": "~26.0.0+bedrock-1.20.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 611fa0aac5..cc7af15d81 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "60e8d1f289b202a21321d35ae2375e19", + "content-hash": "828ee775e4e3548ef3fb0d9690ca2f44", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7" + "reference": "9872eb37f15080b19c2b7861085e549c48dda92d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ee46b9367af262bbddd9f122d4d5b5b495b892e7", - "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/9872eb37f15080b19c2b7861085e549c48dda92d", + "reference": "9872eb37f15080b19c2b7861085e549c48dda92d", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.3.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.4.0" }, - "time": "2023-10-16T16:11:02+00:00" + "time": "2023-11-08T15:22:06+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.6.0+bedrock-1.20.40", + "version": "2.7.0+bedrock-1.20.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6" + "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/37e780d28b470230bda3579b04cb50d406e3fbe6", - "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/36f975dfca7520b7d36b0b39429f274464c9bc13", + "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13", "shasum": "" }, "type": "library", @@ -168,22 +168,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.40" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.50" }, - "time": "2023-10-26T10:39:13+00:00" + "time": "2023-12-06T13:59:08+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93" + "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", - "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/d374e5fd8302977675dcd2a42733abd3ee476ca1", + "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1", "shasum": "" }, "type": "library", @@ -194,22 +194,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.5.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.6.0" }, - "time": "2023-09-01T19:58:57+00:00" + "time": "2023-11-08T18:12:14+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "25.0.0+bedrock-1.20.40", + "version": "26.0.0+bedrock-1.20.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8" + "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69c36c96f6835e93fc278071aa2bb9829abe5cf8", - "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/f278a0b6d4fa1e2e0408a125f323a3118b1968df", + "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df", "shasum": "" }, "require": { @@ -223,10 +223,10 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.33", + "phpstan/phpstan": "1.10.39", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5 || ^10.0" }, "type": "library", "autoload": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/25.0.0+bedrock-1.20.40" + "source": "https://github.com/pmmp/BedrockProtocol/tree/26.0.0+bedrock-1.20.50" }, - "time": "2023-10-26T11:03:10+00:00" + "time": "2023-12-06T14:08:37+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 54f13ba560..1417fa0144 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (40 << 8) | //patch - (3); //revision + (50 << 8) | //patch + (1); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 0e1b29e272..9b28e936d8 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -66,6 +66,7 @@ final class BlockStateNames{ public const CORAL_HANG_TYPE_BIT = "coral_hang_type_bit"; public const COVERED_BIT = "covered_bit"; public const CRACKED_STATE = "cracked_state"; + public const CRAFTING = "crafting"; public const DAMAGE = "damage"; public const DEAD_BIT = "dead_bit"; public const DEPRECATED = "deprecated"; @@ -109,6 +110,7 @@ final class BlockStateNames{ public const OCCUPIED_BIT = "occupied_bit"; public const OLD_LEAF_TYPE = "old_leaf_type"; public const OPEN_BIT = "open_bit"; + public const ORIENTATION = "orientation"; public const OUTPUT_LIT_BIT = "output_lit_bit"; public const OUTPUT_SUBTRACT_BIT = "output_subtract_bit"; public const PERSISTENT_BIT = "persistent_bit"; @@ -136,7 +138,6 @@ final class BlockStateNames{ public const STONE_SLAB_TYPE_2 = "stone_slab_type_2"; public const STONE_SLAB_TYPE_3 = "stone_slab_type_3"; public const STONE_SLAB_TYPE_4 = "stone_slab_type_4"; - public const STONE_TYPE = "stone_type"; public const STRIPPED_BIT = "stripped_bit"; public const STRUCTURE_BLOCK_TYPE = "structure_block_type"; public const STRUCTURE_VOID_TYPE = "structure_void_type"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 712ff70797..4a05fa33e9 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -168,6 +168,19 @@ final class BlockStateStringValues{ public const OLD_LEAF_TYPE_OAK = "oak"; public const OLD_LEAF_TYPE_SPRUCE = "spruce"; + public const ORIENTATION_DOWN_EAST = "down_east"; + public const ORIENTATION_DOWN_NORTH = "down_north"; + public const ORIENTATION_DOWN_SOUTH = "down_south"; + public const ORIENTATION_DOWN_WEST = "down_west"; + public const ORIENTATION_EAST_UP = "east_up"; + public const ORIENTATION_NORTH_UP = "north_up"; + public const ORIENTATION_SOUTH_UP = "south_up"; + public const ORIENTATION_UP_EAST = "up_east"; + public const ORIENTATION_UP_NORTH = "up_north"; + public const ORIENTATION_UP_SOUTH = "up_south"; + public const ORIENTATION_UP_WEST = "up_west"; + public const ORIENTATION_WEST_UP = "west_up"; + public const PILLAR_AXIS_X = "x"; public const PILLAR_AXIS_Y = "y"; public const PILLAR_AXIS_Z = "z"; @@ -241,14 +254,6 @@ final class BlockStateStringValues{ public const STONE_SLAB_TYPE_4_SMOOTH_QUARTZ = "smooth_quartz"; public const STONE_SLAB_TYPE_4_STONE = "stone"; - public const STONE_TYPE_ANDESITE = "andesite"; - public const STONE_TYPE_ANDESITE_SMOOTH = "andesite_smooth"; - public const STONE_TYPE_DIORITE = "diorite"; - public const STONE_TYPE_DIORITE_SMOOTH = "diorite_smooth"; - public const STONE_TYPE_GRANITE = "granite"; - public const STONE_TYPE_GRANITE_SMOOTH = "granite_smooth"; - public const STONE_TYPE_STONE = "stone"; - public const STRUCTURE_BLOCK_TYPE_CORNER = "corner"; public const STRUCTURE_BLOCK_TYPE_DATA = "data"; public const STRUCTURE_BLOCK_TYPE_EXPORT = "export"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 0fa1060492..fdca40a3a9 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -37,6 +37,7 @@ final class BlockTypeNames{ public const ACACIA_FENCE_GATE = "minecraft:acacia_fence_gate"; public const ACACIA_HANGING_SIGN = "minecraft:acacia_hanging_sign"; public const ACACIA_LOG = "minecraft:acacia_log"; + public const ACACIA_PLANKS = "minecraft:acacia_planks"; public const ACACIA_PRESSURE_PLATE = "minecraft:acacia_pressure_plate"; public const ACACIA_STAIRS = "minecraft:acacia_stairs"; public const ACACIA_STANDING_SIGN = "minecraft:acacia_standing_sign"; @@ -48,6 +49,7 @@ final class BlockTypeNames{ public const AMETHYST_BLOCK = "minecraft:amethyst_block"; public const AMETHYST_CLUSTER = "minecraft:amethyst_cluster"; public const ANCIENT_DEBRIS = "minecraft:ancient_debris"; + public const ANDESITE = "minecraft:andesite"; public const ANDESITE_STAIRS = "minecraft:andesite_stairs"; public const ANVIL = "minecraft:anvil"; public const AZALEA = "minecraft:azalea"; @@ -90,6 +92,7 @@ final class BlockTypeNames{ public const BIRCH_FENCE_GATE = "minecraft:birch_fence_gate"; public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; public const BIRCH_LOG = "minecraft:birch_log"; + public const BIRCH_PLANKS = "minecraft:birch_planks"; public const BIRCH_PRESSURE_PLATE = "minecraft:birch_pressure_plate"; public const BIRCH_STAIRS = "minecraft:birch_stairs"; public const BIRCH_STANDING_SIGN = "minecraft:birch_standing_sign"; @@ -185,9 +188,12 @@ final class BlockTypeNames{ public const CHERRY_WOOD = "minecraft:cherry_wood"; public const CHEST = "minecraft:chest"; public const CHISELED_BOOKSHELF = "minecraft:chiseled_bookshelf"; + public const CHISELED_COPPER = "minecraft:chiseled_copper"; public const CHISELED_DEEPSLATE = "minecraft:chiseled_deepslate"; public const CHISELED_NETHER_BRICKS = "minecraft:chiseled_nether_bricks"; public const CHISELED_POLISHED_BLACKSTONE = "minecraft:chiseled_polished_blackstone"; + public const CHISELED_TUFF = "minecraft:chiseled_tuff"; + public const CHISELED_TUFF_BRICKS = "minecraft:chiseled_tuff_bricks"; public const CHORUS_FLOWER = "minecraft:chorus_flower"; public const CHORUS_PLANT = "minecraft:chorus_plant"; public const CLAY = "minecraft:clay"; @@ -208,7 +214,11 @@ final class BlockTypeNames{ public const COMPOSTER = "minecraft:composter"; public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; + public const COPPER_BULB = "minecraft:copper_bulb"; + public const COPPER_DOOR = "minecraft:copper_door"; + public const COPPER_GRATE = "minecraft:copper_grate"; public const COPPER_ORE = "minecraft:copper_ore"; + public const COPPER_TRAPDOOR = "minecraft:copper_trapdoor"; public const CORAL_BLOCK = "minecraft:coral_block"; public const CORAL_FAN = "minecraft:coral_fan"; public const CORAL_FAN_DEAD = "minecraft:coral_fan_dead"; @@ -219,6 +229,7 @@ final class BlockTypeNames{ public const CRACKED_DEEPSLATE_TILES = "minecraft:cracked_deepslate_tiles"; public const CRACKED_NETHER_BRICKS = "minecraft:cracked_nether_bricks"; public const CRACKED_POLISHED_BLACKSTONE_BRICKS = "minecraft:cracked_polished_blackstone_bricks"; + public const CRAFTER = "minecraft:crafter"; public const CRAFTING_TABLE = "minecraft:crafting_table"; public const CRIMSON_BUTTON = "minecraft:crimson_button"; public const CRIMSON_DOOR = "minecraft:crimson_door"; @@ -259,6 +270,7 @@ final class BlockTypeNames{ public const DARK_OAK_FENCE_GATE = "minecraft:dark_oak_fence_gate"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_LOG = "minecraft:dark_oak_log"; + public const DARK_OAK_PLANKS = "minecraft:dark_oak_planks"; public const DARK_OAK_PRESSURE_PLATE = "minecraft:dark_oak_pressure_plate"; public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; @@ -297,6 +309,7 @@ final class BlockTypeNames{ public const DETECTOR_RAIL = "minecraft:detector_rail"; public const DIAMOND_BLOCK = "minecraft:diamond_block"; public const DIAMOND_ORE = "minecraft:diamond_ore"; + public const DIORITE = "minecraft:diorite"; public const DIORITE_STAIRS = "minecraft:diorite_stairs"; public const DIRT = "minecraft:dirt"; public const DIRT_WITH_ROOTS = "minecraft:dirt_with_roots"; @@ -442,7 +455,12 @@ final class BlockTypeNames{ public const END_ROD = "minecraft:end_rod"; public const END_STONE = "minecraft:end_stone"; public const ENDER_CHEST = "minecraft:ender_chest"; + public const EXPOSED_CHISELED_COPPER = "minecraft:exposed_chiseled_copper"; public const EXPOSED_COPPER = "minecraft:exposed_copper"; + public const EXPOSED_COPPER_BULB = "minecraft:exposed_copper_bulb"; + public const EXPOSED_COPPER_DOOR = "minecraft:exposed_copper_door"; + public const EXPOSED_COPPER_GRATE = "minecraft:exposed_copper_grate"; + public const EXPOSED_COPPER_TRAPDOOR = "minecraft:exposed_copper_trapdoor"; public const EXPOSED_CUT_COPPER = "minecraft:exposed_cut_copper"; public const EXPOSED_CUT_COPPER_SLAB = "minecraft:exposed_cut_copper_slab"; public const EXPOSED_CUT_COPPER_STAIRS = "minecraft:exposed_cut_copper_stairs"; @@ -470,6 +488,7 @@ final class BlockTypeNames{ public const GOLD_BLOCK = "minecraft:gold_block"; public const GOLD_ORE = "minecraft:gold_ore"; public const GOLDEN_RAIL = "minecraft:golden_rail"; + public const GRANITE = "minecraft:granite"; public const GRANITE_STAIRS = "minecraft:granite_stairs"; public const GRASS = "minecraft:grass"; public const GRASS_PATH = "minecraft:grass_path"; @@ -527,6 +546,7 @@ final class BlockTypeNames{ public const JUNGLE_FENCE_GATE = "minecraft:jungle_fence_gate"; public const JUNGLE_HANGING_SIGN = "minecraft:jungle_hanging_sign"; public const JUNGLE_LOG = "minecraft:jungle_log"; + public const JUNGLE_PLANKS = "minecraft:jungle_planks"; public const JUNGLE_PRESSURE_PLATE = "minecraft:jungle_pressure_plate"; public const JUNGLE_STAIRS = "minecraft:jungle_stairs"; public const JUNGLE_STANDING_SIGN = "minecraft:jungle_standing_sign"; @@ -651,6 +671,7 @@ final class BlockTypeNames{ public const OAK_FENCE = "minecraft:oak_fence"; public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; public const OAK_LOG = "minecraft:oak_log"; + public const OAK_PLANKS = "minecraft:oak_planks"; public const OAK_STAIRS = "minecraft:oak_stairs"; public const OBSERVER = "minecraft:observer"; public const OBSIDIAN = "minecraft:obsidian"; @@ -666,7 +687,12 @@ final class BlockTypeNames{ public const ORANGE_STAINED_GLASS_PANE = "minecraft:orange_stained_glass_pane"; public const ORANGE_TERRACOTTA = "minecraft:orange_terracotta"; public const ORANGE_WOOL = "minecraft:orange_wool"; + public const OXIDIZED_CHISELED_COPPER = "minecraft:oxidized_chiseled_copper"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; + public const OXIDIZED_COPPER_BULB = "minecraft:oxidized_copper_bulb"; + public const OXIDIZED_COPPER_DOOR = "minecraft:oxidized_copper_door"; + public const OXIDIZED_COPPER_GRATE = "minecraft:oxidized_copper_grate"; + public const OXIDIZED_COPPER_TRAPDOOR = "minecraft:oxidized_copper_trapdoor"; public const OXIDIZED_CUT_COPPER = "minecraft:oxidized_cut_copper"; public const OXIDIZED_CUT_COPPER_SLAB = "minecraft:oxidized_cut_copper_slab"; public const OXIDIZED_CUT_COPPER_STAIRS = "minecraft:oxidized_cut_copper_stairs"; @@ -690,9 +716,9 @@ final class BlockTypeNames{ public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; public const PITCHER_CROP = "minecraft:pitcher_crop"; public const PITCHER_PLANT = "minecraft:pitcher_plant"; - public const PLANKS = "minecraft:planks"; public const PODZOL = "minecraft:podzol"; public const POINTED_DRIPSTONE = "minecraft:pointed_dripstone"; + public const POLISHED_ANDESITE = "minecraft:polished_andesite"; public const POLISHED_ANDESITE_STAIRS = "minecraft:polished_andesite_stairs"; public const POLISHED_BASALT = "minecraft:polished_basalt"; public const POLISHED_BLACKSTONE = "minecraft:polished_blackstone"; @@ -712,8 +738,15 @@ final class BlockTypeNames{ public const POLISHED_DEEPSLATE_SLAB = "minecraft:polished_deepslate_slab"; public const POLISHED_DEEPSLATE_STAIRS = "minecraft:polished_deepslate_stairs"; public const POLISHED_DEEPSLATE_WALL = "minecraft:polished_deepslate_wall"; + public const POLISHED_DIORITE = "minecraft:polished_diorite"; public const POLISHED_DIORITE_STAIRS = "minecraft:polished_diorite_stairs"; + public const POLISHED_GRANITE = "minecraft:polished_granite"; public const POLISHED_GRANITE_STAIRS = "minecraft:polished_granite_stairs"; + public const POLISHED_TUFF = "minecraft:polished_tuff"; + public const POLISHED_TUFF_DOUBLE_SLAB = "minecraft:polished_tuff_double_slab"; + public const POLISHED_TUFF_SLAB = "minecraft:polished_tuff_slab"; + public const POLISHED_TUFF_STAIRS = "minecraft:polished_tuff_stairs"; + public const POLISHED_TUFF_WALL = "minecraft:polished_tuff_wall"; public const PORTAL = "minecraft:portal"; public const POTATOES = "minecraft:potatoes"; public const POWDER_SNOW = "minecraft:powder_snow"; @@ -816,6 +849,7 @@ final class BlockTypeNames{ public const SPRUCE_FENCE_GATE = "minecraft:spruce_fence_gate"; public const SPRUCE_HANGING_SIGN = "minecraft:spruce_hanging_sign"; public const SPRUCE_LOG = "minecraft:spruce_log"; + public const SPRUCE_PLANKS = "minecraft:spruce_planks"; public const SPRUCE_PRESSURE_PLATE = "minecraft:spruce_pressure_plate"; public const SPRUCE_STAIRS = "minecraft:spruce_stairs"; public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; @@ -870,6 +904,15 @@ final class BlockTypeNames{ public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; public const TUBE_CORAL = "minecraft:tube_coral"; public const TUFF = "minecraft:tuff"; + public const TUFF_BRICK_DOUBLE_SLAB = "minecraft:tuff_brick_double_slab"; + public const TUFF_BRICK_SLAB = "minecraft:tuff_brick_slab"; + public const TUFF_BRICK_STAIRS = "minecraft:tuff_brick_stairs"; + public const TUFF_BRICK_WALL = "minecraft:tuff_brick_wall"; + public const TUFF_BRICKS = "minecraft:tuff_bricks"; + public const TUFF_DOUBLE_SLAB = "minecraft:tuff_double_slab"; + public const TUFF_SLAB = "minecraft:tuff_slab"; + public const TUFF_STAIRS = "minecraft:tuff_stairs"; + public const TUFF_WALL = "minecraft:tuff_wall"; public const TURTLE_EGG = "minecraft:turtle_egg"; public const TWISTING_VINES = "minecraft:twisting_vines"; public const UNDERWATER_TORCH = "minecraft:underwater_torch"; @@ -903,27 +946,52 @@ final class BlockTypeNames{ public const WARPED_WART_BLOCK = "minecraft:warped_wart_block"; public const WATER = "minecraft:water"; public const WATERLILY = "minecraft:waterlily"; + public const WAXED_CHISELED_COPPER = "minecraft:waxed_chiseled_copper"; public const WAXED_COPPER = "minecraft:waxed_copper"; + public const WAXED_COPPER_BULB = "minecraft:waxed_copper_bulb"; + public const WAXED_COPPER_DOOR = "minecraft:waxed_copper_door"; + public const WAXED_COPPER_GRATE = "minecraft:waxed_copper_grate"; + public const WAXED_COPPER_TRAPDOOR = "minecraft:waxed_copper_trapdoor"; public const WAXED_CUT_COPPER = "minecraft:waxed_cut_copper"; public const WAXED_CUT_COPPER_SLAB = "minecraft:waxed_cut_copper_slab"; public const WAXED_CUT_COPPER_STAIRS = "minecraft:waxed_cut_copper_stairs"; public const WAXED_DOUBLE_CUT_COPPER_SLAB = "minecraft:waxed_double_cut_copper_slab"; + public const WAXED_EXPOSED_CHISELED_COPPER = "minecraft:waxed_exposed_chiseled_copper"; public const WAXED_EXPOSED_COPPER = "minecraft:waxed_exposed_copper"; + public const WAXED_EXPOSED_COPPER_BULB = "minecraft:waxed_exposed_copper_bulb"; + public const WAXED_EXPOSED_COPPER_DOOR = "minecraft:waxed_exposed_copper_door"; + public const WAXED_EXPOSED_COPPER_GRATE = "minecraft:waxed_exposed_copper_grate"; + public const WAXED_EXPOSED_COPPER_TRAPDOOR = "minecraft:waxed_exposed_copper_trapdoor"; public const WAXED_EXPOSED_CUT_COPPER = "minecraft:waxed_exposed_cut_copper"; public const WAXED_EXPOSED_CUT_COPPER_SLAB = "minecraft:waxed_exposed_cut_copper_slab"; public const WAXED_EXPOSED_CUT_COPPER_STAIRS = "minecraft:waxed_exposed_cut_copper_stairs"; public const WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB = "minecraft:waxed_exposed_double_cut_copper_slab"; + public const WAXED_OXIDIZED_CHISELED_COPPER = "minecraft:waxed_oxidized_chiseled_copper"; public const WAXED_OXIDIZED_COPPER = "minecraft:waxed_oxidized_copper"; + public const WAXED_OXIDIZED_COPPER_BULB = "minecraft:waxed_oxidized_copper_bulb"; + public const WAXED_OXIDIZED_COPPER_DOOR = "minecraft:waxed_oxidized_copper_door"; + public const WAXED_OXIDIZED_COPPER_GRATE = "minecraft:waxed_oxidized_copper_grate"; + public const WAXED_OXIDIZED_COPPER_TRAPDOOR = "minecraft:waxed_oxidized_copper_trapdoor"; public const WAXED_OXIDIZED_CUT_COPPER = "minecraft:waxed_oxidized_cut_copper"; public const WAXED_OXIDIZED_CUT_COPPER_SLAB = "minecraft:waxed_oxidized_cut_copper_slab"; public const WAXED_OXIDIZED_CUT_COPPER_STAIRS = "minecraft:waxed_oxidized_cut_copper_stairs"; public const WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB = "minecraft:waxed_oxidized_double_cut_copper_slab"; + public const WAXED_WEATHERED_CHISELED_COPPER = "minecraft:waxed_weathered_chiseled_copper"; public const WAXED_WEATHERED_COPPER = "minecraft:waxed_weathered_copper"; + public const WAXED_WEATHERED_COPPER_BULB = "minecraft:waxed_weathered_copper_bulb"; + public const WAXED_WEATHERED_COPPER_DOOR = "minecraft:waxed_weathered_copper_door"; + public const WAXED_WEATHERED_COPPER_GRATE = "minecraft:waxed_weathered_copper_grate"; + public const WAXED_WEATHERED_COPPER_TRAPDOOR = "minecraft:waxed_weathered_copper_trapdoor"; public const WAXED_WEATHERED_CUT_COPPER = "minecraft:waxed_weathered_cut_copper"; public const WAXED_WEATHERED_CUT_COPPER_SLAB = "minecraft:waxed_weathered_cut_copper_slab"; public const WAXED_WEATHERED_CUT_COPPER_STAIRS = "minecraft:waxed_weathered_cut_copper_stairs"; public const WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB = "minecraft:waxed_weathered_double_cut_copper_slab"; + public const WEATHERED_CHISELED_COPPER = "minecraft:weathered_chiseled_copper"; public const WEATHERED_COPPER = "minecraft:weathered_copper"; + public const WEATHERED_COPPER_BULB = "minecraft:weathered_copper_bulb"; + public const WEATHERED_COPPER_DOOR = "minecraft:weathered_copper_door"; + public const WEATHERED_COPPER_GRATE = "minecraft:weathered_copper_grate"; + public const WEATHERED_COPPER_TRAPDOOR = "minecraft:weathered_copper_trapdoor"; public const WEATHERED_CUT_COPPER = "minecraft:weathered_cut_copper"; public const WEATHERED_CUT_COPPER_SLAB = "minecraft:weathered_cut_copper_slab"; public const WEATHERED_CUT_COPPER_STAIRS = "minecraft:weathered_cut_copper_stairs"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index c0b9a9fca0..f70162ac5d 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -521,7 +521,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); $this->mapLog(Blocks::ACACIA_LOG(), Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG); $this->mapSimple(Blocks::ACACIA_FENCE(), Ids::ACACIA_FENCE); - //wood, planks and slabs still use the old way of storing wood type + $this->mapSimple(Blocks::ACACIA_PLANKS(), Ids::ACACIA_PLANKS); + //wood and slabs still use the old way of storing wood type $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); @@ -532,8 +533,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->mapLog(Blocks::BIRCH_LOG(), Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG); $this->mapSimple(Blocks::BIRCH_FENCE(), Ids::BIRCH_FENCE); + $this->mapSimple(Blocks::BIRCH_PLANKS(), Ids::BIRCH_PLANKS); $this->mapStairs(Blocks::BIRCH_STAIRS(), Ids::BIRCH_STAIRS); - //wood, planks and slabs still use the old way of storing wood type + //wood and slabs still use the old way of storing wood type $this->map(Blocks::CHERRY_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CHERRY_BUTTON))); $this->map(Blocks::CHERRY_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CHERRY_DOOR))); @@ -582,8 +584,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); $this->mapLog(Blocks::DARK_OAK_LOG(), Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG); $this->mapSimple(Blocks::DARK_OAK_FENCE(), Ids::DARK_OAK_FENCE); + $this->mapSimple(Blocks::DARK_OAK_PLANKS(), Ids::DARK_OAK_PLANKS); $this->mapStairs(Blocks::DARK_OAK_STAIRS(), Ids::DARK_OAK_STAIRS); - //wood, planks and slabs still use the old way of storing wood type + //wood and slabs still use the old way of storing wood type $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); @@ -594,8 +597,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); $this->mapLog(Blocks::JUNGLE_LOG(), Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG); $this->mapSimple(Blocks::JUNGLE_FENCE(), Ids::JUNGLE_FENCE); + $this->mapSimple(Blocks::JUNGLE_PLANKS(), Ids::JUNGLE_PLANKS); $this->mapStairs(Blocks::JUNGLE_STAIRS(), Ids::JUNGLE_STAIRS); - //wood, planks and slabs still use the old way of storing wood type + //wood and slabs still use the old way of storing wood type $this->map(Blocks::MANGROVE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::MANGROVE_BUTTON))); $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); @@ -630,20 +634,22 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->mapLog(Blocks::OAK_LOG(), Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG); $this->mapSimple(Blocks::OAK_FENCE(), Ids::OAK_FENCE); + $this->mapSimple(Blocks::OAK_PLANKS(), Ids::OAK_PLANKS); $this->mapStairs(Blocks::OAK_STAIRS(), Ids::OAK_STAIRS); - //wood, planks and slabs still use the old way of storing wood type + //wood and slabs still use the old way of storing wood type - $this->mapSimple(Blocks::SPRUCE_FENCE(), Ids::SPRUCE_FENCE); - $this->mapLog(Blocks::SPRUCE_LOG(), Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG); $this->map(Blocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); $this->map(Blocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); $this->map(Blocks::SPRUCE_FENCE_GATE(), fn(FenceGate $block) => Helper::encodeFenceGate($block, new Writer(Ids::SPRUCE_FENCE_GATE))); $this->map(Blocks::SPRUCE_PRESSURE_PLATE(), fn(WoodenPressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::SPRUCE_PRESSURE_PLATE))); $this->map(Blocks::SPRUCE_SIGN(), fn(FloorSign $block) => Helper::encodeFloorSign($block, new Writer(Ids::SPRUCE_STANDING_SIGN))); - $this->mapStairs(Blocks::SPRUCE_STAIRS(), Ids::SPRUCE_STAIRS); $this->map(Blocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); $this->map(Blocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); - //wood, planks and slabs still use the old way of storing wood type + $this->mapLog(Blocks::SPRUCE_LOG(), Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG); + $this->mapSimple(Blocks::SPRUCE_FENCE(), Ids::SPRUCE_FENCE); + $this->mapSimple(Blocks::SPRUCE_PLANKS(), Ids::SPRUCE_PLANKS); + $this->mapStairs(Blocks::SPRUCE_STAIRS(), Ids::SPRUCE_STAIRS); + //wood and slabs still use the old way of storing wood type $this->map(Blocks::WARPED_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::WARPED_BUTTON))); $this->map(Blocks::WARPED_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::WARPED_DOOR))); @@ -661,18 +667,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ } private function registerLegacyWoodBlockSerializers() : void{ - foreach([ - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_PLANKS(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_PLANKS(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_PLANKS(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_PLANKS(), - StringValues::WOOD_TYPE_OAK => Blocks::OAK_PLANKS(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_PLANKS(), - ] as $woodType => $block){ - $this->map($block, fn() => Writer::create(Ids::PLANKS) - ->writeString(StateNames::WOOD_TYPE, $woodType)); - } - foreach([ StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_SLAB(), StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_SLAB(), @@ -716,6 +710,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); $this->mapSimple(Blocks::ANCIENT_DEBRIS(), Ids::ANCIENT_DEBRIS); + $this->mapSimple(Blocks::ANDESITE(), Ids::ANDESITE); $this->mapSimple(Blocks::BARRIER(), Ids::BARRIER); $this->mapSimple(Blocks::BEACON(), Ids::BEACON); $this->mapSimple(Blocks::BLACKSTONE(), Ids::BLACKSTONE); @@ -758,6 +753,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::DEEPSLATE_TILES(), Ids::DEEPSLATE_TILES); $this->mapSimple(Blocks::DIAMOND(), Ids::DIAMOND_BLOCK); $this->mapSimple(Blocks::DIAMOND_ORE(), Ids::DIAMOND_ORE); + $this->mapSimple(Blocks::DIORITE(), Ids::DIORITE); $this->mapSimple(Blocks::DRAGON_EGG(), Ids::DRAGON_EGG); $this->mapSimple(Blocks::DRIED_KELP(), Ids::DRIED_KELP_BLOCK); $this->mapSimple(Blocks::ELEMENT_ACTINIUM(), Ids::ELEMENT_89); @@ -892,6 +888,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::GLOWSTONE(), Ids::GLOWSTONE); $this->mapSimple(Blocks::GOLD(), Ids::GOLD_BLOCK); $this->mapSimple(Blocks::GOLD_ORE(), Ids::GOLD_ORE); + $this->mapSimple(Blocks::GRANITE(), Ids::GRANITE); $this->mapSimple(Blocks::GRASS(), Ids::GRASS); $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); @@ -933,9 +930,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::PACKED_ICE(), Ids::PACKED_ICE); $this->mapSimple(Blocks::PACKED_MUD(), Ids::PACKED_MUD); $this->mapSimple(Blocks::PODZOL(), Ids::PODZOL); + $this->mapSimple(Blocks::POLISHED_ANDESITE(), Ids::POLISHED_ANDESITE); $this->mapSimple(Blocks::POLISHED_BLACKSTONE(), Ids::POLISHED_BLACKSTONE); $this->mapSimple(Blocks::POLISHED_BLACKSTONE_BRICKS(), Ids::POLISHED_BLACKSTONE_BRICKS); $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); + $this->mapSimple(Blocks::POLISHED_DIORITE(), Ids::POLISHED_DIORITE); + $this->mapSimple(Blocks::POLISHED_GRANITE(), Ids::POLISHED_GRANITE); $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); @@ -957,6 +957,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); $this->mapSimple(Blocks::SPORE_BLOSSOM(), Ids::SPORE_BLOSSOM); + $this->mapSimple(Blocks::STONE(), Ids::STONE); $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TORCHFLOWER(), Ids::TORCHFLOWER); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); @@ -985,7 +986,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }) ->writeBlockFace($block->getFacing()) ); - $this->map(Blocks::ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE)); $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); @@ -1268,7 +1268,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE)); $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); @@ -1335,7 +1334,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeFacingFlags($block->getFaces()); }); $this->map(Blocks::GLOWING_ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::GLOW_FRAME)); - $this->map(Blocks::GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE)); $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); @@ -1473,7 +1471,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::GROWTH, $block->getAge() + 1 + PitcherCrop::MAX_AGE) ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); }); - $this->map(Blocks::POLISHED_ANDESITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_ANDESITE_SMOOTH)); $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); $this->map(Blocks::POLISHED_BASALT(), function(SimplePillar $block) : Writer{ @@ -1491,10 +1488,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::POLISHED_DEEPSLATE_SLAB(), Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_DEEPSLATE_STAIRS(), Ids::POLISHED_DEEPSLATE_STAIRS); $this->map(Blocks::POLISHED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_DEEPSLATE_WALL))); - $this->map(Blocks::POLISHED_DIORITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_DIORITE_SMOOTH)); $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); - $this->map(Blocks::POLISHED_GRANITE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_GRANITE_SMOOTH)); $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); $this->mapStairs(Blocks::POLISHED_GRANITE_STAIRS(), Ids::POLISHED_GRANITE_STAIRS); $this->map(Blocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); @@ -1630,7 +1625,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::HARD_STAINED_GLASS_PANE) ->writeColor($block->getColor()); }); - $this->map(Blocks::STONE(), fn() => Helper::encodeStone(StringValues::STONE_TYPE_STONE)); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 2822324e5c..2b7e89b57e 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -228,11 +228,6 @@ final class BlockStateSerializerHelper{ ->writeFacingWithoutUp($facing === Facing::UP ? Facing::DOWN : $facing); } - public static function encodeStone(string $type) : BlockStateWriter{ - return BlockStateWriter::create(Ids::STONE) - ->writeString(BlockStateNames::STONE_TYPE, $type); - } - public static function encodeStoneBricks(string $type) : BlockStateWriter{ return BlockStateWriter::create(Ids::STONEBRICK) ->writeString(BlockStateNames::STONE_BRICK_TYPE, $type); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 9af7a17b6e..18e9b3e322 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -427,6 +427,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); $this->mapLog(Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG, fn() => Blocks::ACACIA_LOG()); $this->mapSimple(Ids::ACACIA_FENCE, fn() => Blocks::ACACIA_FENCE()); + $this->mapSimple(Ids::ACACIA_PLANKS, fn() => Blocks::ACACIA_PLANKS()); $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -439,6 +440,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); $this->mapLog(Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG, fn() => Blocks::BIRCH_LOG()); $this->mapSimple(Ids::BIRCH_FENCE, fn() => Blocks::BIRCH_FENCE()); + $this->mapSimple(Ids::BIRCH_PLANKS, fn() => Blocks::BIRCH_PLANKS()); $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -483,6 +485,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); $this->mapLog(Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG, fn() => Blocks::DARK_OAK_LOG()); $this->mapSimple(Ids::DARK_OAK_FENCE, fn() => Blocks::DARK_OAK_FENCE()); + $this->mapSimple(Ids::DARK_OAK_PLANKS, fn() => Blocks::DARK_OAK_PLANKS()); $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -495,6 +498,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::JUNGLE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::JUNGLE_WALL_SIGN(), $in)); $this->mapLog(Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG, fn() => Blocks::JUNGLE_LOG()); $this->mapSimple(Ids::JUNGLE_FENCE, fn() => Blocks::JUNGLE_FENCE()); + $this->mapSimple(Ids::JUNGLE_PLANKS, fn() => Blocks::JUNGLE_PLANKS()); $this->mapStairs(Ids::JUNGLE_STAIRS, fn() => Blocks::JUNGLE_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -526,6 +530,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::OAK_WALL_SIGN(), $in)); $this->mapLog(Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG, fn() => Blocks::OAK_LOG()); $this->mapSimple(Ids::OAK_FENCE, fn() => Blocks::OAK_FENCE()); + $this->mapSimple(Ids::OAK_PLANKS, fn() => Blocks::OAK_PLANKS()); $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -538,6 +543,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::SPRUCE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::SPRUCE_WALL_SIGN(), $in)); $this->mapLog(Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG, fn() => Blocks::SPRUCE_LOG()); $this->mapSimple(Ids::SPRUCE_FENCE, fn() => Blocks::SPRUCE_FENCE()); + $this->mapSimple(Ids::SPRUCE_PLANKS, fn() => Blocks::SPRUCE_PLANKS()); $this->mapStairs(Ids::SPRUCE_STAIRS, fn() => Blocks::SPRUCE_STAIRS()); //wood, planks and slabs still use the old way of storing wood type @@ -557,18 +563,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } private function registerLegacyWoodBlockDeserializers() : void{ - - $this->map(Ids::PLANKS, function(Reader $in) : Block{ - return match($woodName = $in->readString(StateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_OAK => Blocks::OAK_PLANKS(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_PLANKS(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_PLANKS(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_PLANKS(), - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_PLANKS(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_PLANKS(), - default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodName), - }; - }); $this->mapSlab(Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)); $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ @@ -608,6 +602,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); $this->mapSimple(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS()); + $this->mapSimple(Ids::ANDESITE, fn() => Blocks::ANDESITE()); $this->mapSimple(Ids::BARRIER, fn() => Blocks::BARRIER()); $this->mapSimple(Ids::BEACON, fn() => Blocks::BEACON()); $this->mapSimple(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE()); @@ -648,6 +643,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES()); $this->mapSimple(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND()); $this->mapSimple(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE()); + $this->mapSimple(Ids::DIORITE, fn() => Blocks::DIORITE()); $this->mapSimple(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG()); $this->mapSimple(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP()); $this->mapSimple(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO()); @@ -782,6 +778,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE()); $this->mapSimple(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); $this->mapSimple(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); + $this->mapSimple(Ids::GRANITE, fn() => Blocks::GRANITE()); $this->mapSimple(Ids::GRASS, fn() => Blocks::GRASS()); $this->mapSimple(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); $this->mapSimple(Ids::GRAVEL, fn() => Blocks::GRAVEL()); @@ -820,9 +817,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE()); $this->mapSimple(Ids::PACKED_MUD, fn() => Blocks::PACKED_MUD()); $this->mapSimple(Ids::PODZOL, fn() => Blocks::PODZOL()); + $this->mapSimple(Ids::POLISHED_ANDESITE, fn() => Blocks::POLISHED_ANDESITE()); $this->mapSimple(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE()); $this->mapSimple(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS()); $this->mapSimple(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); + $this->mapSimple(Ids::POLISHED_DIORITE, fn() => Blocks::POLISHED_DIORITE()); + $this->mapSimple(Ids::POLISHED_GRANITE, fn() => Blocks::POLISHED_GRANITE()); $this->mapSimple(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); $this->mapSimple(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->mapSimple(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); @@ -844,6 +844,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); $this->mapSimple(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); + $this->mapSimple(Ids::STONE, fn() => Blocks::STONE()); $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->mapSimple(Ids::TORCHFLOWER, fn() => Blocks::TORCHFLOWER()); @@ -1528,18 +1529,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::BANNER() ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15)); }); - $this->map(Ids::STONE, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::STONE_TYPE)){ - StringValues::STONE_TYPE_ANDESITE => Blocks::ANDESITE(), - StringValues::STONE_TYPE_ANDESITE_SMOOTH => Blocks::POLISHED_ANDESITE(), - StringValues::STONE_TYPE_DIORITE => Blocks::DIORITE(), - StringValues::STONE_TYPE_DIORITE_SMOOTH => Blocks::POLISHED_DIORITE(), - StringValues::STONE_TYPE_GRANITE => Blocks::GRANITE(), - StringValues::STONE_TYPE_GRANITE_SMOOTH => Blocks::POLISHED_GRANITE(), - StringValues::STONE_TYPE_STONE => Blocks::STONE(), - default => throw $in->badValueException(StateNames::STONE_TYPE, $type), - }; - }); $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 85f01106a6..c1534a0f0e 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -134,6 +134,7 @@ final class ItemTypeNames{ public const COOKED_RABBIT = "minecraft:cooked_rabbit"; public const COOKED_SALMON = "minecraft:cooked_salmon"; public const COOKIE = "minecraft:cookie"; + public const COPPER_DOOR = "minecraft:copper_door"; public const COPPER_INGOT = "minecraft:copper_ingot"; public const CORAL = "minecraft:coral"; public const COW_SPAWN_EGG = "minecraft:cow_spawn_egg"; @@ -150,6 +151,7 @@ final class ItemTypeNames{ public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; + public const DEBUG_STICK = "minecraft:debug_stick"; public const DIAMOND = "minecraft:diamond"; public const DIAMOND_AXE = "minecraft:diamond_axe"; public const DIAMOND_BOOTS = "minecraft:diamond_boots"; @@ -186,6 +188,7 @@ final class ItemTypeNames{ public const EVOKER_SPAWN_EGG = "minecraft:evoker_spawn_egg"; public const EXPERIENCE_BOTTLE = "minecraft:experience_bottle"; public const EXPLORER_POTTERY_SHERD = "minecraft:explorer_pottery_sherd"; + public const EXPOSED_COPPER_DOOR = "minecraft:exposed_copper_door"; public const EYE_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:eye_armor_trim_smithing_template"; public const FEATHER = "minecraft:feather"; public const FENCE = "minecraft:fence"; @@ -347,6 +350,7 @@ final class ItemTypeNames{ public const OAK_SIGN = "minecraft:oak_sign"; public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg"; public const ORANGE_DYE = "minecraft:orange_dye"; + public const OXIDIZED_COPPER_DOOR = "minecraft:oxidized_copper_door"; public const PAINTING = "minecraft:painting"; public const PANDA_SPAWN_EGG = "minecraft:panda_spawn_egg"; public const PAPER = "minecraft:paper"; @@ -360,6 +364,7 @@ final class ItemTypeNames{ public const PILLAGER_SPAWN_EGG = "minecraft:pillager_spawn_egg"; public const PINK_DYE = "minecraft:pink_dye"; public const PITCHER_POD = "minecraft:pitcher_pod"; + public const PLANKS = "minecraft:planks"; public const PLENTY_POTTERY_SHERD = "minecraft:plenty_pottery_sherd"; public const POISONOUS_POTATO = "minecraft:poisonous_potato"; public const POLAR_BEAR_SPAWN_EGG = "minecraft:polar_bear_spawn_egg"; @@ -479,7 +484,12 @@ final class ItemTypeNames{ public const WARPED_HANGING_SIGN = "minecraft:warped_hanging_sign"; public const WARPED_SIGN = "minecraft:warped_sign"; public const WATER_BUCKET = "minecraft:water_bucket"; + public const WAXED_COPPER_DOOR = "minecraft:waxed_copper_door"; + public const WAXED_EXPOSED_COPPER_DOOR = "minecraft:waxed_exposed_copper_door"; + public const WAXED_OXIDIZED_COPPER_DOOR = "minecraft:waxed_oxidized_copper_door"; + public const WAXED_WEATHERED_COPPER_DOOR = "minecraft:waxed_weathered_copper_door"; public const WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:wayfinder_armor_trim_smithing_template"; + public const WEATHERED_COPPER_DOOR = "minecraft:weathered_copper_door"; public const WHEAT = "minecraft:wheat"; public const WHEAT_SEEDS = "minecraft:wheat_seeds"; public const WHITE_DYE = "minecraft:white_dye"; diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 32e788c6a3..8c3449d415 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -57,7 +57,6 @@ use pocketmine\network\mcpe\protocol\BossEventPacket; use pocketmine\network\mcpe\protocol\CommandBlockUpdatePacket; use pocketmine\network\mcpe\protocol\CommandRequestPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; -use pocketmine\network\mcpe\protocol\CraftingEventPacket; use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\InteractPacket; use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; @@ -731,10 +730,6 @@ class InGamePacketHandler extends PacketHandler{ return true; //this packet is useless } - public function handleCraftingEvent(CraftingEventPacket $packet) : bool{ - return true; //this is a broken useless packet, so we don't use it - } - public function handleBlockActorData(BlockActorDataPacket $packet) : bool{ $pos = new Vector3($packet->blockPosition->getX(), $packet->blockPosition->getY(), $packet->blockPosition->getZ()); if($pos->distanceSquared($this->player->getLocation()) > 10000){ From 2a136c78049784f73899b472c55075869f65250a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:37:27 +0000 Subject: [PATCH 1555/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 62 +++++++++++----------- tests/phpstan/configs/actual-problems.neon | 4 +- tests/phpstan/configs/phpstan-bugs.neon | 15 ------ 4 files changed, 34 insertions(+), 49 deletions(-) diff --git a/composer.json b/composer.json index 807ee01249..eae9eeeda7 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "webmozart/path-util": "~2.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39", + "phpstan/phpstan": "1.10.47", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 6905e35979..d54676f100 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7eb82ff7bbf49b2524db4136819bac35", + "content-hash": "1fa402ac97418450c70ea636909de222", "packages": [ { "name": "adhocore/json-comment", @@ -997,16 +997,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -1073,7 +1073,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -1085,7 +1085,7 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "symfony/filesystem", @@ -1738,16 +1738,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.39", + "version": "1.10.47", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", "shasum": "" }, "require": { @@ -1796,7 +1796,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T15:46:26+00:00" + "time": "2023-12-01T15:19:17+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -1852,21 +1852,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6" + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/7a50e9662ee9f3942e4aaaf3d603653f60282542", + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.10.34" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -1895,22 +1895,22 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.2" }, - "time": "2023-03-29T14:47:40+00:00" + "time": "2023-10-30T14:35:06+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.7", + "version": "10.1.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", "shasum": "" }, "require": { @@ -1967,7 +1967,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" }, "funding": [ { @@ -1975,7 +1975,7 @@ "type": "github" } ], - "time": "2023-10-04T15:34:17+00:00" + "time": "2023-11-23T12:23:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3238,16 +3238,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -3276,7 +3276,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -3284,7 +3284,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 6982302082..cfc735e2fd 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -32,7 +32,7 @@ parameters: - message: "#^Cannot access offset 'git' on mixed\\.$#" - count: 2 + count: 1 path: ../../../src/VersionInfo.php - @@ -857,7 +857,7 @@ parameters: - message: "#^Cannot access offset string on mixed\\.$#" - count: 3 + count: 2 path: ../../../src/utils/Config.php - diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 62f945fc77..ad818f4d6f 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -10,21 +10,6 @@ parameters: count: 1 path: ../../../src/entity/projectile/Projectile.php - - - message: "#^Match arm comparison between 1\\|2\\|3\\|4 and 0 is always false\\.$#" - count: 1 - path: ../../../src/network/mcpe/handler/InGamePacketHandler.php - - - - message: "#^Match arm comparison between 4 and 4 is always true\\.$#" - count: 1 - path: ../../../src/network/mcpe/handler/InGamePacketHandler.php - - - - message: "#^Match arm is unreachable because previous comparison is always true\\.$#" - count: 1 - path: ../../../src/network/mcpe/handler/InGamePacketHandler.php - - message: "#^Property pocketmine\\\\network\\\\mcpe\\\\raklib\\\\PthreadsChannelWriter\\:\\:\\$buffer is never read, only written\\.$#" count: 1 From 927f129c6e55d00df1cf035f6e07a588698ff007 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:41:19 +0000 Subject: [PATCH 1556/1858] Fixed borked world loading --- src/world/format/io/data/BedrockWorldData.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index d92576f21a..cb5468a525 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 622; + public const CURRENT_STORAGE_NETWORK_VERSION = 630; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 40, //patch - 1, //revision + 50, //patch + 3, //revision 0 //is beta ]; From ed3fe2b727798a100f796ad7d7833a6356ea2fa5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:47:44 +0000 Subject: [PATCH 1557/1858] Update dependencies for 1.20.50 --- composer.json | 8 +-- composer.lock | 54 +++++++++---------- .../mcpe/handler/InGamePacketHandler.php | 5 -- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/composer.json b/composer.json index eae9eeeda7..3840b3ed88 100644 --- a/composer.json +++ b/composer.json @@ -34,10 +34,10 @@ "adhocore/json-comment": "~1.2.0", "fgrosse/phpasn1": "~2.5.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.3.0+bedrock-1.20.40", - "pocketmine/bedrock-data": "~2.6.0+bedrock-1.20.40", - "pocketmine/bedrock-item-upgrade-schema": "~1.5.0+bedrock-1.20.30", - "pocketmine/bedrock-protocol": "~25.0.0+bedrock-1.20.40", + "pocketmine/bedrock-block-upgrade-schema": "~3.4.0+bedrock-1.20.50", + "pocketmine/bedrock-data": "~2.7.0+bedrock-1.20.50", + "pocketmine/bedrock-item-upgrade-schema": "~1.6.0+bedrock-1.20.50", + "pocketmine/bedrock-protocol": "~26.0.0+bedrock-1.20.50", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index d54676f100..9b33f4105f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1fa402ac97418450c70ea636909de222", + "content-hash": "063e95c52230fcdcc8f2a420167f50a5", "packages": [ { "name": "adhocore/json-comment", @@ -198,16 +198,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7" + "reference": "9872eb37f15080b19c2b7861085e549c48dda92d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ee46b9367af262bbddd9f122d4d5b5b495b892e7", - "reference": "ee46b9367af262bbddd9f122d4d5b5b495b892e7", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/9872eb37f15080b19c2b7861085e549c48dda92d", + "reference": "9872eb37f15080b19c2b7861085e549c48dda92d", "shasum": "" }, "type": "library", @@ -218,22 +218,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.3.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.4.0" }, - "time": "2023-10-16T16:11:02+00:00" + "time": "2023-11-08T15:22:06+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.6.0+bedrock-1.20.40", + "version": "2.7.0+bedrock-1.20.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6" + "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/37e780d28b470230bda3579b04cb50d406e3fbe6", - "reference": "37e780d28b470230bda3579b04cb50d406e3fbe6", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/36f975dfca7520b7d36b0b39429f274464c9bc13", + "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13", "shasum": "" }, "type": "library", @@ -244,22 +244,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.40" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.50" }, - "time": "2023-10-26T10:39:13+00:00" + "time": "2023-12-06T13:59:08+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93" + "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", - "reference": "3edc9ebbad9a4f2d9c8f53b3a5ba44d4a792ad93", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/d374e5fd8302977675dcd2a42733abd3ee476ca1", + "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1", "shasum": "" }, "type": "library", @@ -270,22 +270,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.5.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.6.0" }, - "time": "2023-09-01T19:58:57+00:00" + "time": "2023-11-08T18:12:14+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "25.0.0+bedrock-1.20.40", + "version": "26.0.0+bedrock-1.20.50", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8" + "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/69c36c96f6835e93fc278071aa2bb9829abe5cf8", - "reference": "69c36c96f6835e93fc278071aa2bb9829abe5cf8", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/f278a0b6d4fa1e2e0408a125f323a3118b1968df", + "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df", "shasum": "" }, "require": { @@ -299,10 +299,10 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.33", + "phpstan/phpstan": "1.10.39", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5 || ^10.0" }, "type": "library", "autoload": { @@ -317,9 +317,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/25.0.0+bedrock-1.20.40" + "source": "https://github.com/pmmp/BedrockProtocol/tree/26.0.0+bedrock-1.20.50" }, - "time": "2023-10-26T11:03:10+00:00" + "time": "2023-12-06T14:08:37+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 27b2f1de55..4597c2e1ce 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -59,7 +59,6 @@ use pocketmine\network\mcpe\protocol\BossEventPacket; use pocketmine\network\mcpe\protocol\CommandBlockUpdatePacket; use pocketmine\network\mcpe\protocol\CommandRequestPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; -use pocketmine\network\mcpe\protocol\CraftingEventPacket; use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\InteractPacket; use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; @@ -733,10 +732,6 @@ class InGamePacketHandler extends PacketHandler{ return true; //this packet is useless } - public function handleCraftingEvent(CraftingEventPacket $packet) : bool{ - return true; //this is a broken useless packet, so we don't use it - } - public function handleBlockActorData(BlockActorDataPacket $packet) : bool{ $pos = new Vector3($packet->blockPosition->getX(), $packet->blockPosition->getY(), $packet->blockPosition->getZ()); if($pos->distanceSquared($this->player->getLocation()) > 10000){ From 30433bba1068d25efd543edd2003bbcff526b88a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:52:59 +0000 Subject: [PATCH 1558/1858] Release 4.26.0 --- changelogs/4.26.md | 16 ++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changelogs/4.26.md diff --git a/changelogs/4.26.md b/changelogs/4.26.md new file mode 100644 index 0000000000..2244c6cae6 --- /dev/null +++ b/changelogs/4.26.md @@ -0,0 +1,16 @@ +# 4.26.0 +Released 6th December 2023. + +**For Minecraft: Bedrock Edition 1.20.50** + +This is a support release for Minecraft: Bedrock Edition 1.20.50. + +**Plugin compatibility:** Plugins for previous 4.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.50. +- Removed support for older versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a825efe60b..8ff68360c5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.25.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "4.26.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From ba89ae5bf20dcc4aa4d40698429535aad26cc79d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 14:53:00 +0000 Subject: [PATCH 1559/1858] 4.26.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8ff68360c5..b2edef9224 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.26.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.26.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 46307973e33e569e3730117a6a0a976c11438fe5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 15:02:57 +0000 Subject: [PATCH 1560/1858] Release 5.9.0 --- changelogs/5.9.md | 30 ++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.9.md diff --git a/changelogs/5.9.md b/changelogs/5.9.md new file mode 100644 index 0000000000..2467be638e --- /dev/null +++ b/changelogs/5.9.md @@ -0,0 +1,30 @@ +# 5.9.0 +Released 6th December 2023. + +**For Minecraft: Bedrock Edition 1.20.50** + +This is a support release for Minecraft: Bedrock Edition 1.20.50. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.50. +- Removed support for older versions. + +## Fixes +- Fixed `pitcher_plant` and `pitcher_pod` not being accepted by `StringToItemParser` (and therefore not being usable in commands). +- Rotation of items in item frames in worlds from newer versions of Bedrock is now correctly loaded. +- Fixed possible crash in block update sending if a chunk was unloaded during a previous chunk's block update syncing. +- Fixed `AsyncTask::fetchLocal()` throwing an exception if `null` was stored in the local storage. + +## Documentation +- `Server::prepareBatch()` is now correctly marked as `@internal`. +- Updated documentation for `Server::prepareBatch()` to accurately reflect its behaviour. +- Fixed incorrect path in doc comments of `EnumTrait` and `RegistryTrait`. + +## Internals +- Added PHP 8.3 to the test matrix. This has not been thoroughly tested yet, so it should only be used for testing purposes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index e0f4ca4f38..7df7aa06bf 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.8.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.9.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From b4838f5b4e99119062a57d94769440d457705b10 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Dec 2023 15:02:57 +0000 Subject: [PATCH 1561/1858] 5.9.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 7df7aa06bf..4459f95513 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.9.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.9.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From a750af72db402b1d3c75a8f56ebd50256b2682f6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Dec 2023 16:05:38 +0000 Subject: [PATCH 1562/1858] Updated build/php submodule to pmmp/PHP-Binaries@73e5950eb90033a8de589044b92aa5e95de9c494 --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 6dc09c57eb..73e5950eb9 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 6dc09c57eb2a044b3c71e65fa3760dfcaed7fa5e +Subproject commit 73e5950eb90033a8de589044b92aa5e95de9c494 From daeba95101e6278d1f2552397043d29d29d272f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Dec 2023 16:54:38 +0000 Subject: [PATCH 1563/1858] Release 5.10.0 --- changelogs/5.10.md | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.10.md diff --git a/changelogs/5.10.md b/changelogs/5.10.md new file mode 100644 index 0000000000..551bc40ede --- /dev/null +++ b/changelogs/5.10.md @@ -0,0 +1,46 @@ +# 5.10.0 +Released 14th December 2023. + +**For Minecraft: Bedrock Edition 1.20.50** + +This is a minor feature release, including new gameplay features and minor performance improvements. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- PHP 8.2 is now used by default. PHP 8.1 is still supported, but will be removed in a future 5.x release. +- Improved timings reports by removing `Breakdown` timings group. This group serves no purpose with tree timings and made for confusing reading. + +## Performance +- Improved performance of `Block::encodeFullState()` in most conditions. This in turn improves performance of `World::setBlock()` and `World::setBlockAt()`. +- Improved network compression performance by avoiding unnecessary object allocations. +- Timings now report time spent in individual `Snooze` handlers, making it easier to debug performance issues. + +## Gameplay +### Blocks +- Implemented crop growth speed modifiers. + - The following things now positively affect crop growth speed: + - Being planted on or being adjacent to farmland (hydrated farmland offers a larger benefit than dry farmland) + - Potential light level of at least 9 + - Being planted in rows with space between them (or a different type of crop) + - The following things now negatively affect crop growth speed: + - Improper arrangement (e.g. the same crop on all sides) + - Insufficient light level (below 9) + - Poorly arranged crops will grow slower in this version. Past versions behaved as if crops were always planted in ideal conditions. + - Crops planted in ideal conditions will grow at the same speed as before. + +### Items +- Added the following new items: + - All types of Smithing Template +- Pitcher Pod is now correctly registered. In previous versions, it was mapped to the Pitcher Crop block, causing incorrect name display in commands. + +## Internals +- Cleaned up various getter usages where direct property access is possible. +- Avoided unnecessary repeated getter calls in some loops. +- `NetworkSession` may now track `string` instead of `CompressBatchPromise` when a batch was synchronously compressed. This significantly reduces object allocations and improves performance. +- `NetworkSession` now sends less information to clients on login validation failure. This avoids leaking potentially sensitive error information to clients. + - Clients can correlate their disconnects with server-side logs using the `Error ID` shown on the disconnect screen. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4459f95513..405e285fbe 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.9.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.10.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 00a8ea267cd6b16e82e1c9fdbe97e50ddafbf964 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Dec 2023 16:54:42 +0000 Subject: [PATCH 1564/1858] 5.10.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 405e285fbe..6c7963405e 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.10.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.10.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 053abfbb6ff96b54e40f8038e0c1b5573cda8db1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:23:49 +0000 Subject: [PATCH 1565/1858] Bump actions/upload-artifact from 3 to 4 (#6199) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/draft-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 9ffae467da..62fa413328 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -77,7 +77,7 @@ jobs: > build_info.json - name: Upload release artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: release_artifacts path: | From a03013d582881feacc0fb42b3cbdf1368a27d4ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:49:32 +0000 Subject: [PATCH 1566/1858] Bump phpstan/phpstan from 1.10.47 to 1.10.50 (#6198) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.47 to 1.10.50. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.47...1.10.50) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 1a19711e90..689e5ccb33 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.3.0" }, "require-dev": { - "phpstan/phpstan": "1.10.47", + "phpstan/phpstan": "1.10.50", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index cc7af15d81..527ef0a88b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "828ee775e4e3548ef3fb0d9690ca2f44", + "content-hash": "4797ac9fe9d3626738a7d13ae485fa2a", "packages": [ { "name": "adhocore/json-comment", @@ -1378,16 +1378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.47", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -1436,7 +1436,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T15:19:17+00:00" + "time": "2023-12-13T10:59:42+00:00" }, { "name": "phpstan/phpstan-phpunit", From 944dd7d3e4cca0fe9ceb79548293c56c92ed8da1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Dec 2023 15:19:44 +0000 Subject: [PATCH 1567/1858] BaseBanner: remove unnecessary array_filter() usage --- src/block/BaseBanner.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index c2bbaf737a..6b9e493d19 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -34,7 +34,6 @@ use pocketmine\math\AxisAlignedBB; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use function array_filter; use function assert; use function count; @@ -89,11 +88,12 @@ abstract class BaseBanner extends Transparent{ * @return $this */ public function setPatterns(array $patterns) : self{ - $checked = array_filter($patterns, fn($v) => $v instanceof BannerPatternLayer); - if(count($checked) !== count($patterns)){ - throw new \TypeError("Deque must only contain " . BannerPatternLayer::class . " objects"); + foreach($patterns as $pattern){ + if(!$pattern instanceof BannerPatternLayer){ + throw new \TypeError("Array must only contain " . BannerPatternLayer::class . " objects"); + } } - $this->patterns = $checked; + $this->patterns = $patterns; return $this; } From d3d7f24015626442ccd73f92697ed9dd3999b565 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Dec 2023 15:32:54 +0000 Subject: [PATCH 1568/1858] Noise: make calls with many parameters less nauseating to read --- src/world/generator/noise/Noise.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/world/generator/noise/Noise.php b/src/world/generator/noise/Noise.php index af9cefe14e..54d3c2759f 100644 --- a/src/world/generator/noise/Noise.php +++ b/src/world/generator/noise/Noise.php @@ -217,7 +217,13 @@ abstract class Noise{ for($xx = 0; $xx < $xSize; ++$xx){ if($xx % $samplingRate !== 0){ $nx = (int) ($xx / $samplingRate) * $samplingRate; - $noiseArray[$xx] = self::linearLerp($xx, $nx, $nx + $samplingRate, $noiseArray[$nx], $noiseArray[$nx + $samplingRate]); + $noiseArray[$xx] = self::linearLerp( + x: $xx, + x1: $nx, + x2: $nx + $samplingRate, + q0: $noiseArray[$nx], + q1: $noiseArray[$nx + $samplingRate] + ); } } @@ -253,9 +259,16 @@ abstract class Noise{ $nx = (int) ($xx / $samplingRate) * $samplingRate; $nz = (int) ($zz / $samplingRate) * $samplingRate; $noiseArray[$xx][$zz] = Noise::bilinearLerp( - $xx, $zz, $noiseArray[$nx][$nz], $noiseArray[$nx][$nz + $samplingRate], - $noiseArray[$nx + $samplingRate][$nz], $noiseArray[$nx + $samplingRate][$nz + $samplingRate], - $nx, $nx + $samplingRate, $nz, $nz + $samplingRate + x: $xx, + y: $zz, + q00: $noiseArray[$nx][$nz], + q01: $noiseArray[$nx][$nz + $samplingRate], + q10: $noiseArray[$nx + $samplingRate][$nz], + q11: $noiseArray[$nx + $samplingRate][$nz + $samplingRate], + x1: $nx, + x2: $nx + $samplingRate, + y1: $nz, + y2: $nz + $samplingRate ); } } From e1f4fd3048c3504d5af957705084f124dedb2824 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Dec 2023 16:01:43 +0000 Subject: [PATCH 1569/1858] ProcessLoginTask: remove dead comments This is no longer an issue since b2df405cc0355dcffe202bc4040fae316940d427. --- src/network/mcpe/auth/ProcessLoginTask.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 607b75c89e..c396338da9 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -128,7 +128,6 @@ class ProcessLoginTask extends AsyncTask{ try{ [$headersArray, $claimsArray, ] = JwtUtils::parse($jwt); }catch(JwtException $e){ - //TODO: we shouldn't be showing internal information like this to the client throw new VerifyLoginException("Failed to parse JWT: " . $e->getMessage(), null, 0, $e); } @@ -141,13 +140,11 @@ class ProcessLoginTask extends AsyncTask{ /** @var JwtHeader $headers */ $headers = $mapper->map($headersArray, new JwtHeader()); }catch(\JsonMapper_Exception $e){ - //TODO: we shouldn't be showing internal information like this to the client throw new VerifyLoginException("Invalid JWT header: " . $e->getMessage(), null, 0, $e); } $headerDerKey = base64_decode($headers->x5u, true); if($headerDerKey === false){ - //TODO: we shouldn't be showing internal information like this to the client throw new VerifyLoginException("Invalid JWT public key: base64 decoding error decoding x5u"); } @@ -163,7 +160,6 @@ class ProcessLoginTask extends AsyncTask{ try{ $signingKeyOpenSSL = JwtUtils::parseDerPublicKey($headerDerKey); }catch(JwtException $e){ - //TODO: we shouldn't be showing this internal information to the client throw new VerifyLoginException("Invalid JWT public key: " . $e->getMessage(), null, 0, $e); } try{ From c8da9dea9545c917fcbf5fd1514e83186af3cc17 Mon Sep 17 00:00:00 2001 From: DiamondStrider1 <62265561+Swift-Strider@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:38:00 +0100 Subject: [PATCH 1570/1858] WorldManager: Remove unused if in unloadWorld() (#6203) --- src/world/WorldManager.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index bd968f9042..ff603a2dfc 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -129,10 +129,6 @@ class WorldManager{ } $ev = new WorldUnloadEvent($world); - if($world === $this->defaultWorld && !$forceUnload){ - $ev->cancel(); - } - $ev->call(); if(!$forceUnload && $ev->isCancelled()){ From 90af8cfd694ef1132dde6eede85e12f2be4a6218 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 14:29:02 +0000 Subject: [PATCH 1571/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 689e5ccb33..bcec3a72b8 100644 --- a/composer.json +++ b/composer.json @@ -49,7 +49,7 @@ "pocketmine/raklib-ipc": "^0.2.0", "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "~4.7.0", - "symfony/filesystem": "~6.3.0" + "symfony/filesystem": "~6.4.0" }, "require-dev": { "phpstan/phpstan": "1.10.50", diff --git a/composer.lock b/composer.lock index 527ef0a88b..f8e0b31af6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4797ac9fe9d3626738a7d13ae485fa2a", + "content-hash": "894648a63ed7cd84303937208d1684af", "packages": [ { "name": "adhocore/json-comment", @@ -922,16 +922,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.3.1", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { @@ -965,7 +965,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -981,7 +981,7 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:30:39+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1211,16 +1211,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -1261,9 +1261,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "phar-io/manifest", @@ -1541,16 +1541,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.9", + "version": "10.1.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", + "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", "shasum": "" }, "require": { @@ -1607,7 +1607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10" }, "funding": [ { @@ -1615,7 +1615,7 @@ "type": "github" } ], - "time": "2023-11-23T12:23:20+00:00" + "time": "2023-12-11T06:28:43+00:00" }, { "name": "phpunit/php-file-iterator", From 74cb0be868b5a56023bd6a17d91833a184df831e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 14:32:05 +0000 Subject: [PATCH 1572/1858] Noise: give PHPStan some help understanding SplFixedArray --- src/world/generator/noise/Noise.php | 2 ++ tests/phpstan/configs/actual-problems.neon | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/world/generator/noise/Noise.php b/src/world/generator/noise/Noise.php index 54d3c2759f..d91a58350a 100644 --- a/src/world/generator/noise/Noise.php +++ b/src/world/generator/noise/Noise.php @@ -208,6 +208,7 @@ abstract class Noise{ throw new \InvalidArgumentException("xSize % samplingRate must return 0"); } + /** @phpstan-var \SplFixedArray $noiseArray */ $noiseArray = new \SplFixedArray($xSize + 1); for($xx = 0; $xx <= $xSize; $xx += $samplingRate){ @@ -240,6 +241,7 @@ abstract class Noise{ assert($xSize % $samplingRate === 0, new \InvalidArgumentException("xSize % samplingRate must return 0")); assert($zSize % $samplingRate === 0, new \InvalidArgumentException("zSize % samplingRate must return 0")); + /** @phpstan-var \SplFixedArray<\SplFixedArray> $noiseArray */ $noiseArray = new \SplFixedArray($xSize + 1); for($xx = 0; $xx <= $xSize; $xx += $samplingRate){ diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 51454a7083..9fea3803d8 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -1070,6 +1070,21 @@ parameters: count: 1 path: ../../../src/world/generator/hell/Nether.php + - + message: "#^Offset int does not exist on SplFixedArray\\\\|null\\.$#" + count: 4 + path: ../../../src/world/generator/noise/Noise.php + + - + message: "#^Parameter \\$q0 of static method pocketmine\\\\world\\\\generator\\\\noise\\\\Noise\\:\\:linearLerp\\(\\) expects float, float\\|null given\\.$#" + count: 1 + path: ../../../src/world/generator/noise/Noise.php + + - + message: "#^Parameter \\$q1 of static method pocketmine\\\\world\\\\generator\\\\noise\\\\Noise\\:\\:linearLerp\\(\\) expects float, float\\|null given\\.$#" + count: 1 + path: ../../../src/world/generator/noise/Noise.php + - message: "#^Cannot call method getBiomeId\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" count: 1 From 58ce746ae10771279e553fdb2ac39202f850407d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 14:44:24 +0000 Subject: [PATCH 1573/1858] Remove dead PHPStan ignored error --- tests/phpstan/configs/phpstan-bugs.neon | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index b3bf3dadd8..af04866114 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -1,10 +1,5 @@ parameters: ignoreErrors: - - - message: "#^Instanceof between pocketmine\\\\block\\\\utils\\\\BannerPatternLayer and pocketmine\\\\block\\\\utils\\\\BannerPatternLayer will always evaluate to true\\.$#" - count: 1 - path: ../../../src/block/BaseBanner.php - - message: "#^Method pocketmine\\\\block\\\\CakeWithCandle\\:\\:onInteractCandle\\(\\) has parameter \\$returnedItems with no value type specified in iterable type array\\.$#" count: 1 From 8dc28b7ea8e7337783dd85c91f73662f9b6283ee Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 15:15:43 +0000 Subject: [PATCH 1574/1858] RuntimeDataDescriber: remove useless template parameter --- src/data/runtime/LegacyRuntimeEnumDescriberTrait.php | 5 ----- src/data/runtime/RuntimeDataDescriber.php | 4 ---- 2 files changed, 9 deletions(-) diff --git a/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php b/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php index dd35fabfbf..3c540f7fa7 100644 --- a/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php +++ b/src/data/runtime/LegacyRuntimeEnumDescriberTrait.php @@ -29,11 +29,6 @@ namespace pocketmine\data\runtime; * @deprecated */ trait LegacyRuntimeEnumDescriberTrait{ - - /** - * @phpstan-template T of \UnitEnum - * @phpstan-param T $case - */ abstract protected function enum(\UnitEnum &$case) : void; public function bellAttachmentType(\pocketmine\block\utils\BellAttachmentType &$value) : void{ diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 04217f5df5..6f1d35b983 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -89,10 +89,6 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function straightOnlyRailShape(int &$railShape) : void; - /** - * @phpstan-template T of \UnitEnum - * @phpstan-param T $case - */ public function enum(\UnitEnum &$case) : void; /** From 80125f9b193a453f6d13df1cca5a0e911f044123 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 15:20:28 +0000 Subject: [PATCH 1575/1858] Modernize single-use phpstan-template tags --- src/event/HandlerList.php | 3 +-- src/event/HandlerListManager.php | 6 ++---- src/timings/Timings.php | 6 ++---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 74eedf3a4a..2072cd5226 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -37,8 +37,7 @@ class HandlerList{ private array $affectedHandlerCaches = []; /** - * @phpstan-template TEvent of Event - * @phpstan-param class-string $class + * @phpstan-param class-string $class */ public function __construct( private string $class, diff --git a/src/event/HandlerListManager.php b/src/event/HandlerListManager.php index 047632f548..605a387478 100644 --- a/src/event/HandlerListManager.php +++ b/src/event/HandlerListManager.php @@ -86,8 +86,7 @@ class HandlerListManager{ * * Calling this method also lazily initializes the $classMap inheritance tree of handler lists. * - * @phpstan-template TEvent of Event - * @phpstan-param class-string $event + * @phpstan-param class-string $event * * @throws \ReflectionException * @throws \InvalidArgumentException @@ -113,8 +112,7 @@ class HandlerListManager{ } /** - * @phpstan-template TEvent of Event - * @phpstan-param class-string $event + * @phpstan-param class-string $event * * @return RegisteredListener[] */ diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 61a8bbc927..563af69bff 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -210,8 +210,7 @@ abstract class Timings{ } /** - * @phpstan-template T of object - * @phpstan-param class-string $class + * @phpstan-param class-string $class */ private static function shortenCoreClassName(string $class, string $prefix) : string{ if(str_starts_with($class, $prefix)){ @@ -302,8 +301,7 @@ abstract class Timings{ } /** - * @phpstan-template TEvent of Event - * @phpstan-param class-string $event + * @phpstan-param class-string $event */ public static function getEventHandlerTimings(string $event, string $handlerName, string $group) : TimingsHandler{ if(!isset(self::$eventHandlers[$event][$handlerName])){ From c51b1b28125a12f5c874ed9aeee4ac9f331cc43a Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:21:11 +0100 Subject: [PATCH 1576/1858] Create LightableTrait and remove repetitive code (#6111) --- src/block/Furnace.php | 16 ++--------- src/block/RedstoneOre.php | 20 ++----------- src/block/RedstoneTorch.php | 20 +++++-------- src/block/utils/CandleTrait.php | 15 +--------- src/block/utils/LightableTrait.php | 46 ++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 59 deletions(-) create mode 100644 src/block/utils/LightableTrait.php diff --git a/src/block/Furnace.php b/src/block/Furnace.php index fbff73c939..7a64e3cd3e 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; +use pocketmine\block\utils\LightableTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -34,11 +35,10 @@ use function mt_rand; class Furnace extends Opaque{ use FacesOppositePlacingPlayerTrait; + use LightableTrait; protected FurnaceType $furnaceType; - protected bool $lit = false; - public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo, FurnaceType $furnaceType){ $this->furnaceType = $furnaceType; parent::__construct($idInfo, $name, $typeInfo); @@ -57,18 +57,6 @@ class Furnace extends Opaque{ return $this->lit ? 13 : 0; } - public function isLit() : bool{ - return $this->lit; - } - - /** - * @return $this - */ - public function setLit(bool $lit = true) : self{ - $this->lit = $lit; - return $this; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $furnace = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 9e537bd279..10e701a6f4 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FortuneDropHelper; -use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\block\utils\LightableTrait; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; @@ -32,23 +32,7 @@ use pocketmine\player\Player; use function mt_rand; class RedstoneOre extends Opaque{ - protected bool $lit = false; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->bool($this->lit); - } - - public function isLit() : bool{ - return $this->lit; - } - - /** - * @return $this - */ - public function setLit(bool $lit = true) : self{ - $this->lit = $lit; - return $this; - } + use LightableTrait; public function getLightLevel() : int{ return $this->lit ? 9 : 0; diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index b30c011d4d..26c86038b9 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -23,28 +23,22 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\LightableTrait; use pocketmine\data\runtime\RuntimeDataDescriber; class RedstoneTorch extends Torch{ - protected bool $lit = true; + use LightableTrait; + + public function __construct(BlockIdentifier $idInfo, string $name, BlockTypeInfo $typeInfo){ + $this->lit = true; + parent::__construct($idInfo, $name, $typeInfo); + } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ parent::describeBlockOnlyState($w); $w->bool($this->lit); } - public function isLit() : bool{ - return $this->lit; - } - - /** - * @return $this - */ - public function setLit(bool $lit = true) : self{ - $this->lit = $lit; - return $this; - } - public function getLightLevel() : int{ return $this->lit ? 7 : 0; } diff --git a/src/block/utils/CandleTrait.php b/src/block/utils/CandleTrait.php index 58a7443a3c..c9da97ee0c 100644 --- a/src/block/utils/CandleTrait.php +++ b/src/block/utils/CandleTrait.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block\utils; use pocketmine\block\Block; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\projectile\Projectile; use pocketmine\item\Durable; use pocketmine\item\enchantment\VanillaEnchantments; @@ -38,24 +37,12 @@ use pocketmine\world\sound\FireExtinguishSound; use pocketmine\world\sound\FlintSteelSound; trait CandleTrait{ - private bool $lit = false; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->bool($this->lit); - } + use LightableTrait; public function getLightLevel() : int{ return $this->lit ? 3 : 0; } - public function isLit() : bool{ return $this->lit; } - - /** @return $this */ - public function setLit(bool $lit) : self{ - $this->lit = $lit; - return $this; - } - /** @see Block::onInteract() */ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($item->getTypeId() === ItemTypeIds::FIRE_CHARGE || $item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ diff --git a/src/block/utils/LightableTrait.php b/src/block/utils/LightableTrait.php new file mode 100644 index 0000000000..51ce54f42c --- /dev/null +++ b/src/block/utils/LightableTrait.php @@ -0,0 +1,46 @@ +bool($this->lit); + } + + public function isLit() : bool{ + return $this->lit; + } + + /** + * @return $this + */ + public function setLit(bool $lit = true) : self{ + $this->lit = $lit; + return $this; + } +} From 57f3a04bc50700c3e0727277b59ce436604e429a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 16:06:54 +0000 Subject: [PATCH 1577/1858] data: Use statically analyzable ways of ensuring all cases are registered PHPStan will verify that these matches cover all cases, which guarantees that all cases will be covered. In addition, if PHPStan is not used, the constructors will immediately bail out when they hit a case that isn't covered. The only downside is the extra indentation :( --- src/data/bedrock/BannerPatternTypeIdMap.php | 80 +++++++++-------- src/data/bedrock/DyeColorIdMap.php | 38 ++++---- src/data/bedrock/MedicineTypeIdMap.php | 12 ++- src/data/bedrock/MobHeadTypeIdMap.php | 18 ++-- src/data/bedrock/MushroomBlockTypeIdMap.php | 26 +++--- src/data/bedrock/NoteInstrumentIdMap.php | 36 ++++---- src/data/bedrock/PotionTypeIdMap.php | 90 ++++++++++--------- src/data/bedrock/SuspiciousStewTypeIdMap.php | 25 +++--- src/data/java/GameModeIdMap.php | 12 ++- .../data/bedrock/DyeColorIdMapTest.php | 38 -------- 10 files changed, 188 insertions(+), 187 deletions(-) delete mode 100644 tests/phpunit/data/bedrock/DyeColorIdMapTest.php diff --git a/src/data/bedrock/BannerPatternTypeIdMap.php b/src/data/bedrock/BannerPatternTypeIdMap.php index 064844e199..87f9b8f571 100644 --- a/src/data/bedrock/BannerPatternTypeIdMap.php +++ b/src/data/bedrock/BannerPatternTypeIdMap.php @@ -43,44 +43,48 @@ final class BannerPatternTypeIdMap{ private array $enumToId = []; public function __construct(){ - $this->register("bo", BannerPatternType::BORDER); - $this->register("bri", BannerPatternType::BRICKS); - $this->register("mc", BannerPatternType::CIRCLE); - $this->register("cre", BannerPatternType::CREEPER); - $this->register("cr", BannerPatternType::CROSS); - $this->register("cbo", BannerPatternType::CURLY_BORDER); - $this->register("lud", BannerPatternType::DIAGONAL_LEFT); - $this->register("rd", BannerPatternType::DIAGONAL_RIGHT); - $this->register("ld", BannerPatternType::DIAGONAL_UP_LEFT); - $this->register("rud", BannerPatternType::DIAGONAL_UP_RIGHT); - $this->register("flo", BannerPatternType::FLOWER); - $this->register("gra", BannerPatternType::GRADIENT); - $this->register("gru", BannerPatternType::GRADIENT_UP); - $this->register("hh", BannerPatternType::HALF_HORIZONTAL); - $this->register("hhb", BannerPatternType::HALF_HORIZONTAL_BOTTOM); - $this->register("vh", BannerPatternType::HALF_VERTICAL); - $this->register("vhr", BannerPatternType::HALF_VERTICAL_RIGHT); - $this->register("moj", BannerPatternType::MOJANG); - $this->register("mr", BannerPatternType::RHOMBUS); - $this->register("sku", BannerPatternType::SKULL); - $this->register("ss", BannerPatternType::SMALL_STRIPES); - $this->register("bl", BannerPatternType::SQUARE_BOTTOM_LEFT); - $this->register("br", BannerPatternType::SQUARE_BOTTOM_RIGHT); - $this->register("tl", BannerPatternType::SQUARE_TOP_LEFT); - $this->register("tr", BannerPatternType::SQUARE_TOP_RIGHT); - $this->register("sc", BannerPatternType::STRAIGHT_CROSS); - $this->register("bs", BannerPatternType::STRIPE_BOTTOM); - $this->register("cs", BannerPatternType::STRIPE_CENTER); - $this->register("dls", BannerPatternType::STRIPE_DOWNLEFT); - $this->register("drs", BannerPatternType::STRIPE_DOWNRIGHT); - $this->register("ls", BannerPatternType::STRIPE_LEFT); - $this->register("ms", BannerPatternType::STRIPE_MIDDLE); - $this->register("rs", BannerPatternType::STRIPE_RIGHT); - $this->register("ts", BannerPatternType::STRIPE_TOP); - $this->register("bt", BannerPatternType::TRIANGLE_BOTTOM); - $this->register("tt", BannerPatternType::TRIANGLE_TOP); - $this->register("bts", BannerPatternType::TRIANGLES_BOTTOM); - $this->register("tts", BannerPatternType::TRIANGLES_TOP); + foreach(BannerPatternType::cases() as $case){ + $this->register(match($case){ + BannerPatternType::BORDER => "bo", + BannerPatternType::BRICKS => "bri", + BannerPatternType::CIRCLE => "mc", + BannerPatternType::CREEPER => "cre", + BannerPatternType::CROSS => "cr", + BannerPatternType::CURLY_BORDER => "cbo", + BannerPatternType::DIAGONAL_LEFT => "lud", + BannerPatternType::DIAGONAL_RIGHT => "rd", + BannerPatternType::DIAGONAL_UP_LEFT => "ld", + BannerPatternType::DIAGONAL_UP_RIGHT => "rud", + BannerPatternType::FLOWER => "flo", + BannerPatternType::GRADIENT => "gra", + BannerPatternType::GRADIENT_UP => "gru", + BannerPatternType::HALF_HORIZONTAL => "hh", + BannerPatternType::HALF_HORIZONTAL_BOTTOM => "hhb", + BannerPatternType::HALF_VERTICAL => "vh", + BannerPatternType::HALF_VERTICAL_RIGHT => "vhr", + BannerPatternType::MOJANG => "moj", + BannerPatternType::RHOMBUS => "mr", + BannerPatternType::SKULL => "sku", + BannerPatternType::SMALL_STRIPES => "ss", + BannerPatternType::SQUARE_BOTTOM_LEFT => "bl", + BannerPatternType::SQUARE_BOTTOM_RIGHT => "br", + BannerPatternType::SQUARE_TOP_LEFT => "tl", + BannerPatternType::SQUARE_TOP_RIGHT => "tr", + BannerPatternType::STRAIGHT_CROSS => "sc", + BannerPatternType::STRIPE_BOTTOM => "bs", + BannerPatternType::STRIPE_CENTER => "cs", + BannerPatternType::STRIPE_DOWNLEFT => "dls", + BannerPatternType::STRIPE_DOWNRIGHT => "drs", + BannerPatternType::STRIPE_LEFT => "ls", + BannerPatternType::STRIPE_MIDDLE => "ms", + BannerPatternType::STRIPE_RIGHT => "rs", + BannerPatternType::STRIPE_TOP => "ts", + BannerPatternType::TRIANGLE_BOTTOM => "bt", + BannerPatternType::TRIANGLE_TOP => "tt", + BannerPatternType::TRIANGLES_BOTTOM => "bts", + BannerPatternType::TRIANGLES_TOP => "tts", + }, $case); + } } public function register(string $stringId, BannerPatternType $type) : void{ diff --git a/src/data/bedrock/DyeColorIdMap.php b/src/data/bedrock/DyeColorIdMap.php index a360e4f910..60c5097059 100644 --- a/src/data/bedrock/DyeColorIdMap.php +++ b/src/data/bedrock/DyeColorIdMap.php @@ -48,22 +48,28 @@ final class DyeColorIdMap{ private array $enumToItemId = []; private function __construct(){ - $this->register(0, ItemTypeNames::WHITE_DYE, DyeColor::WHITE); - $this->register(1, ItemTypeNames::ORANGE_DYE, DyeColor::ORANGE); - $this->register(2, ItemTypeNames::MAGENTA_DYE, DyeColor::MAGENTA); - $this->register(3, ItemTypeNames::LIGHT_BLUE_DYE, DyeColor::LIGHT_BLUE); - $this->register(4, ItemTypeNames::YELLOW_DYE, DyeColor::YELLOW); - $this->register(5, ItemTypeNames::LIME_DYE, DyeColor::LIME); - $this->register(6, ItemTypeNames::PINK_DYE, DyeColor::PINK); - $this->register(7, ItemTypeNames::GRAY_DYE, DyeColor::GRAY); - $this->register(8, ItemTypeNames::LIGHT_GRAY_DYE, DyeColor::LIGHT_GRAY); - $this->register(9, ItemTypeNames::CYAN_DYE, DyeColor::CYAN); - $this->register(10, ItemTypeNames::PURPLE_DYE, DyeColor::PURPLE); - $this->register(11, ItemTypeNames::BLUE_DYE, DyeColor::BLUE); - $this->register(12, ItemTypeNames::BROWN_DYE, DyeColor::BROWN); - $this->register(13, ItemTypeNames::GREEN_DYE, DyeColor::GREEN); - $this->register(14, ItemTypeNames::RED_DYE, DyeColor::RED); - $this->register(15, ItemTypeNames::BLACK_DYE, DyeColor::BLACK); + foreach(DyeColor::cases() as $case){ + [$colorId, $dyeItemId] = match($case){ + DyeColor::WHITE => [0, ItemTypeNames::WHITE_DYE], + DyeColor::ORANGE => [1, ItemTypeNames::ORANGE_DYE], + DyeColor::MAGENTA => [2, ItemTypeNames::MAGENTA_DYE], + DyeColor::LIGHT_BLUE => [3, ItemTypeNames::LIGHT_BLUE_DYE], + DyeColor::YELLOW => [4, ItemTypeNames::YELLOW_DYE], + DyeColor::LIME => [5, ItemTypeNames::LIME_DYE], + DyeColor::PINK => [6, ItemTypeNames::PINK_DYE], + DyeColor::GRAY => [7, ItemTypeNames::GRAY_DYE], + DyeColor::LIGHT_GRAY => [8, ItemTypeNames::LIGHT_GRAY_DYE], + DyeColor::CYAN => [9, ItemTypeNames::CYAN_DYE], + DyeColor::PURPLE => [10, ItemTypeNames::PURPLE_DYE], + DyeColor::BLUE => [11, ItemTypeNames::BLUE_DYE], + DyeColor::BROWN => [12, ItemTypeNames::BROWN_DYE], + DyeColor::GREEN => [13, ItemTypeNames::GREEN_DYE], + DyeColor::RED => [14, ItemTypeNames::RED_DYE], + DyeColor::BLACK => [15, ItemTypeNames::BLACK_DYE], + }; + + $this->register($colorId, $dyeItemId, $case); + } } private function register(int $id, string $itemId, DyeColor $color) : void{ diff --git a/src/data/bedrock/MedicineTypeIdMap.php b/src/data/bedrock/MedicineTypeIdMap.php index 00d1f27a86..90fd835509 100644 --- a/src/data/bedrock/MedicineTypeIdMap.php +++ b/src/data/bedrock/MedicineTypeIdMap.php @@ -32,9 +32,13 @@ final class MedicineTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(MedicineTypeIds::ANTIDOTE, MedicineType::ANTIDOTE); - $this->register(MedicineTypeIds::ELIXIR, MedicineType::ELIXIR); - $this->register(MedicineTypeIds::EYE_DROPS, MedicineType::EYE_DROPS); - $this->register(MedicineTypeIds::TONIC, MedicineType::TONIC); + foreach(MedicineType::cases() as $case){ + $this->register(match($case){ + MedicineType::ANTIDOTE => MedicineTypeIds::ANTIDOTE, + MedicineType::ELIXIR => MedicineTypeIds::ELIXIR, + MedicineType::EYE_DROPS => MedicineTypeIds::EYE_DROPS, + MedicineType::TONIC => MedicineTypeIds::TONIC, + }, $case); + } } } diff --git a/src/data/bedrock/MobHeadTypeIdMap.php b/src/data/bedrock/MobHeadTypeIdMap.php index ec678b1924..bf16e6eba0 100644 --- a/src/data/bedrock/MobHeadTypeIdMap.php +++ b/src/data/bedrock/MobHeadTypeIdMap.php @@ -32,12 +32,16 @@ final class MobHeadTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(0, MobHeadType::SKELETON); - $this->register(1, MobHeadType::WITHER_SKELETON); - $this->register(2, MobHeadType::ZOMBIE); - $this->register(3, MobHeadType::PLAYER); - $this->register(4, MobHeadType::CREEPER); - $this->register(5, MobHeadType::DRAGON); - $this->register(6, MobHeadType::PIGLIN); + foreach(MobHeadType::cases() as $case){ + $this->register(match($case){ + MobHeadType::SKELETON => 0, + MobHeadType::WITHER_SKELETON => 1, + MobHeadType::ZOMBIE => 2, + MobHeadType::PLAYER => 3, + MobHeadType::CREEPER => 4, + MobHeadType::DRAGON => 5, + MobHeadType::PIGLIN => 6, + }, $case); + } } } diff --git a/src/data/bedrock/MushroomBlockTypeIdMap.php b/src/data/bedrock/MushroomBlockTypeIdMap.php index 92edef4b23..a25336d897 100644 --- a/src/data/bedrock/MushroomBlockTypeIdMap.php +++ b/src/data/bedrock/MushroomBlockTypeIdMap.php @@ -33,16 +33,20 @@ final class MushroomBlockTypeIdMap{ use IntSaveIdMapTrait; public function __construct(){ - $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_PORES, MushroomBlockType::PORES); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER, MushroomBlockType::CAP_NORTHWEST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTH_SIDE, MushroomBlockType::CAP_NORTH); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHEAST_CORNER, MushroomBlockType::CAP_NORTHEAST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_WEST_SIDE, MushroomBlockType::CAP_WEST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_TOP_ONLY, MushroomBlockType::CAP_MIDDLE); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_EAST_SIDE, MushroomBlockType::CAP_EAST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHWEST_CORNER, MushroomBlockType::CAP_SOUTHWEST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTH_SIDE, MushroomBlockType::CAP_SOUTH); - $this->register(LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, MushroomBlockType::CAP_SOUTHEAST); - $this->register(LegacyMeta::MUSHROOM_BLOCK_ALL_CAP, MushroomBlockType::ALL_CAP); + foreach(MushroomBlockType::cases() as $case){ + $this->register(match($case){ + MushroomBlockType::PORES => LegacyMeta::MUSHROOM_BLOCK_ALL_PORES, + MushroomBlockType::CAP_NORTHWEST => LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER, + MushroomBlockType::CAP_NORTH => LegacyMeta::MUSHROOM_BLOCK_CAP_NORTH_SIDE, + MushroomBlockType::CAP_NORTHEAST => LegacyMeta::MUSHROOM_BLOCK_CAP_NORTHEAST_CORNER, + MushroomBlockType::CAP_WEST => LegacyMeta::MUSHROOM_BLOCK_CAP_WEST_SIDE, + MushroomBlockType::CAP_MIDDLE => LegacyMeta::MUSHROOM_BLOCK_CAP_TOP_ONLY, + MushroomBlockType::CAP_EAST => LegacyMeta::MUSHROOM_BLOCK_CAP_EAST_SIDE, + MushroomBlockType::CAP_SOUTHWEST => LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHWEST_CORNER, + MushroomBlockType::CAP_SOUTH => LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTH_SIDE, + MushroomBlockType::CAP_SOUTHEAST => LegacyMeta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, + MushroomBlockType::ALL_CAP => LegacyMeta::MUSHROOM_BLOCK_ALL_CAP, + }, $case); + } } } diff --git a/src/data/bedrock/NoteInstrumentIdMap.php b/src/data/bedrock/NoteInstrumentIdMap.php index e721b881d2..c847ecd98c 100644 --- a/src/data/bedrock/NoteInstrumentIdMap.php +++ b/src/data/bedrock/NoteInstrumentIdMap.php @@ -32,21 +32,25 @@ final class NoteInstrumentIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(0, NoteInstrument::PIANO); - $this->register(1, NoteInstrument::BASS_DRUM); - $this->register(2, NoteInstrument::SNARE); - $this->register(3, NoteInstrument::CLICKS_AND_STICKS); - $this->register(4, NoteInstrument::DOUBLE_BASS); - $this->register(5, NoteInstrument::BELL); - $this->register(6, NoteInstrument::FLUTE); - $this->register(7, NoteInstrument::CHIME); - $this->register(8, NoteInstrument::GUITAR); - $this->register(9, NoteInstrument::XYLOPHONE); - $this->register(10, NoteInstrument::IRON_XYLOPHONE); - $this->register(11, NoteInstrument::COW_BELL); - $this->register(12, NoteInstrument::DIDGERIDOO); - $this->register(13, NoteInstrument::BIT); - $this->register(14, NoteInstrument::BANJO); - $this->register(15, NoteInstrument::PLING); + foreach(NoteInstrument::cases() as $case){ + $this->register(match($case){ + NoteInstrument::PIANO => 0, + NoteInstrument::BASS_DRUM => 1, + NoteInstrument::SNARE => 2, + NoteInstrument::CLICKS_AND_STICKS => 3, + NoteInstrument::DOUBLE_BASS => 4, + NoteInstrument::BELL => 5, + NoteInstrument::FLUTE => 6, + NoteInstrument::CHIME => 7, + NoteInstrument::GUITAR => 8, + NoteInstrument::XYLOPHONE => 9, + NoteInstrument::IRON_XYLOPHONE => 10, + NoteInstrument::COW_BELL => 11, + NoteInstrument::DIDGERIDOO => 12, + NoteInstrument::BIT => 13, + NoteInstrument::BANJO => 14, + NoteInstrument::PLING => 15, + }, $case); + } } } diff --git a/src/data/bedrock/PotionTypeIdMap.php b/src/data/bedrock/PotionTypeIdMap.php index 3fef20f68c..4e7d8d4c79 100644 --- a/src/data/bedrock/PotionTypeIdMap.php +++ b/src/data/bedrock/PotionTypeIdMap.php @@ -32,48 +32,52 @@ final class PotionTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(PotionTypeIds::WATER, PotionType::WATER); - $this->register(PotionTypeIds::MUNDANE, PotionType::MUNDANE); - $this->register(PotionTypeIds::LONG_MUNDANE, PotionType::LONG_MUNDANE); - $this->register(PotionTypeIds::THICK, PotionType::THICK); - $this->register(PotionTypeIds::AWKWARD, PotionType::AWKWARD); - $this->register(PotionTypeIds::NIGHT_VISION, PotionType::NIGHT_VISION); - $this->register(PotionTypeIds::LONG_NIGHT_VISION, PotionType::LONG_NIGHT_VISION); - $this->register(PotionTypeIds::INVISIBILITY, PotionType::INVISIBILITY); - $this->register(PotionTypeIds::LONG_INVISIBILITY, PotionType::LONG_INVISIBILITY); - $this->register(PotionTypeIds::LEAPING, PotionType::LEAPING); - $this->register(PotionTypeIds::LONG_LEAPING, PotionType::LONG_LEAPING); - $this->register(PotionTypeIds::STRONG_LEAPING, PotionType::STRONG_LEAPING); - $this->register(PotionTypeIds::FIRE_RESISTANCE, PotionType::FIRE_RESISTANCE); - $this->register(PotionTypeIds::LONG_FIRE_RESISTANCE, PotionType::LONG_FIRE_RESISTANCE); - $this->register(PotionTypeIds::SWIFTNESS, PotionType::SWIFTNESS); - $this->register(PotionTypeIds::LONG_SWIFTNESS, PotionType::LONG_SWIFTNESS); - $this->register(PotionTypeIds::STRONG_SWIFTNESS, PotionType::STRONG_SWIFTNESS); - $this->register(PotionTypeIds::SLOWNESS, PotionType::SLOWNESS); - $this->register(PotionTypeIds::LONG_SLOWNESS, PotionType::LONG_SLOWNESS); - $this->register(PotionTypeIds::WATER_BREATHING, PotionType::WATER_BREATHING); - $this->register(PotionTypeIds::LONG_WATER_BREATHING, PotionType::LONG_WATER_BREATHING); - $this->register(PotionTypeIds::HEALING, PotionType::HEALING); - $this->register(PotionTypeIds::STRONG_HEALING, PotionType::STRONG_HEALING); - $this->register(PotionTypeIds::HARMING, PotionType::HARMING); - $this->register(PotionTypeIds::STRONG_HARMING, PotionType::STRONG_HARMING); - $this->register(PotionTypeIds::POISON, PotionType::POISON); - $this->register(PotionTypeIds::LONG_POISON, PotionType::LONG_POISON); - $this->register(PotionTypeIds::STRONG_POISON, PotionType::STRONG_POISON); - $this->register(PotionTypeIds::REGENERATION, PotionType::REGENERATION); - $this->register(PotionTypeIds::LONG_REGENERATION, PotionType::LONG_REGENERATION); - $this->register(PotionTypeIds::STRONG_REGENERATION, PotionType::STRONG_REGENERATION); - $this->register(PotionTypeIds::STRENGTH, PotionType::STRENGTH); - $this->register(PotionTypeIds::LONG_STRENGTH, PotionType::LONG_STRENGTH); - $this->register(PotionTypeIds::STRONG_STRENGTH, PotionType::STRONG_STRENGTH); - $this->register(PotionTypeIds::WEAKNESS, PotionType::WEAKNESS); - $this->register(PotionTypeIds::LONG_WEAKNESS, PotionType::LONG_WEAKNESS); - $this->register(PotionTypeIds::WITHER, PotionType::WITHER); - $this->register(PotionTypeIds::TURTLE_MASTER, PotionType::TURTLE_MASTER); - $this->register(PotionTypeIds::LONG_TURTLE_MASTER, PotionType::LONG_TURTLE_MASTER); - $this->register(PotionTypeIds::STRONG_TURTLE_MASTER, PotionType::STRONG_TURTLE_MASTER); - $this->register(PotionTypeIds::SLOW_FALLING, PotionType::SLOW_FALLING); - $this->register(PotionTypeIds::LONG_SLOW_FALLING, PotionType::LONG_SLOW_FALLING); - $this->register(PotionTypeIds::STRONG_SLOWNESS, PotionType::STRONG_SLOWNESS); + foreach(PotionType::cases() as $case){ + $this->register(match($case){ + PotionType::WATER => PotionTypeIds::WATER, + PotionType::MUNDANE => PotionTypeIds::MUNDANE, + PotionType::LONG_MUNDANE => PotionTypeIds::LONG_MUNDANE, + PotionType::THICK => PotionTypeIds::THICK, + PotionType::AWKWARD => PotionTypeIds::AWKWARD, + PotionType::NIGHT_VISION => PotionTypeIds::NIGHT_VISION, + PotionType::LONG_NIGHT_VISION => PotionTypeIds::LONG_NIGHT_VISION, + PotionType::INVISIBILITY => PotionTypeIds::INVISIBILITY, + PotionType::LONG_INVISIBILITY => PotionTypeIds::LONG_INVISIBILITY, + PotionType::LEAPING => PotionTypeIds::LEAPING, + PotionType::LONG_LEAPING => PotionTypeIds::LONG_LEAPING, + PotionType::STRONG_LEAPING => PotionTypeIds::STRONG_LEAPING, + PotionType::FIRE_RESISTANCE => PotionTypeIds::FIRE_RESISTANCE, + PotionType::LONG_FIRE_RESISTANCE => PotionTypeIds::LONG_FIRE_RESISTANCE, + PotionType::SWIFTNESS => PotionTypeIds::SWIFTNESS, + PotionType::LONG_SWIFTNESS => PotionTypeIds::LONG_SWIFTNESS, + PotionType::STRONG_SWIFTNESS => PotionTypeIds::STRONG_SWIFTNESS, + PotionType::SLOWNESS => PotionTypeIds::SLOWNESS, + PotionType::LONG_SLOWNESS => PotionTypeIds::LONG_SLOWNESS, + PotionType::WATER_BREATHING => PotionTypeIds::WATER_BREATHING, + PotionType::LONG_WATER_BREATHING => PotionTypeIds::LONG_WATER_BREATHING, + PotionType::HEALING => PotionTypeIds::HEALING, + PotionType::STRONG_HEALING => PotionTypeIds::STRONG_HEALING, + PotionType::HARMING => PotionTypeIds::HARMING, + PotionType::STRONG_HARMING => PotionTypeIds::STRONG_HARMING, + PotionType::POISON => PotionTypeIds::POISON, + PotionType::LONG_POISON => PotionTypeIds::LONG_POISON, + PotionType::STRONG_POISON => PotionTypeIds::STRONG_POISON, + PotionType::REGENERATION => PotionTypeIds::REGENERATION, + PotionType::LONG_REGENERATION => PotionTypeIds::LONG_REGENERATION, + PotionType::STRONG_REGENERATION => PotionTypeIds::STRONG_REGENERATION, + PotionType::STRENGTH => PotionTypeIds::STRENGTH, + PotionType::LONG_STRENGTH => PotionTypeIds::LONG_STRENGTH, + PotionType::STRONG_STRENGTH => PotionTypeIds::STRONG_STRENGTH, + PotionType::WEAKNESS => PotionTypeIds::WEAKNESS, + PotionType::LONG_WEAKNESS => PotionTypeIds::LONG_WEAKNESS, + PotionType::WITHER => PotionTypeIds::WITHER, + PotionType::TURTLE_MASTER => PotionTypeIds::TURTLE_MASTER, + PotionType::LONG_TURTLE_MASTER => PotionTypeIds::LONG_TURTLE_MASTER, + PotionType::STRONG_TURTLE_MASTER => PotionTypeIds::STRONG_TURTLE_MASTER, + PotionType::SLOW_FALLING => PotionTypeIds::SLOW_FALLING, + PotionType::LONG_SLOW_FALLING => PotionTypeIds::LONG_SLOW_FALLING, + PotionType::STRONG_SLOWNESS => PotionTypeIds::STRONG_SLOWNESS, + }, $case); + } } } diff --git a/src/data/bedrock/SuspiciousStewTypeIdMap.php b/src/data/bedrock/SuspiciousStewTypeIdMap.php index c4de4b742d..d6a31f0ea7 100644 --- a/src/data/bedrock/SuspiciousStewTypeIdMap.php +++ b/src/data/bedrock/SuspiciousStewTypeIdMap.php @@ -32,15 +32,20 @@ final class SuspiciousStewTypeIdMap{ use IntSaveIdMapTrait; private function __construct(){ - $this->register(SuspiciousStewTypeIds::POPPY, SuspiciousStewType::POPPY); - $this->register(SuspiciousStewTypeIds::CORNFLOWER, SuspiciousStewType::CORNFLOWER); - $this->register(SuspiciousStewTypeIds::TULIP, SuspiciousStewType::TULIP); - $this->register(SuspiciousStewTypeIds::AZURE_BLUET, SuspiciousStewType::AZURE_BLUET); - $this->register(SuspiciousStewTypeIds::LILY_OF_THE_VALLEY, SuspiciousStewType::LILY_OF_THE_VALLEY); - $this->register(SuspiciousStewTypeIds::DANDELION, SuspiciousStewType::DANDELION); - $this->register(SuspiciousStewTypeIds::BLUE_ORCHID, SuspiciousStewType::BLUE_ORCHID); - $this->register(SuspiciousStewTypeIds::ALLIUM, SuspiciousStewType::ALLIUM); - $this->register(SuspiciousStewTypeIds::OXEYE_DAISY, SuspiciousStewType::OXEYE_DAISY); - $this->register(SuspiciousStewTypeIds::WITHER_ROSE, SuspiciousStewType::WITHER_ROSE); + foreach(SuspiciousStewType::cases() as $case){ + $this->register(match($case){ + SuspiciousStewType::POPPY => SuspiciousStewTypeIds::POPPY, + SuspiciousStewType::CORNFLOWER => SuspiciousStewTypeIds::CORNFLOWER, + SuspiciousStewType::TULIP => SuspiciousStewTypeIds::TULIP, + SuspiciousStewType::AZURE_BLUET => SuspiciousStewTypeIds::AZURE_BLUET, + SuspiciousStewType::LILY_OF_THE_VALLEY => SuspiciousStewTypeIds::LILY_OF_THE_VALLEY, + SuspiciousStewType::DANDELION => SuspiciousStewTypeIds::DANDELION, + SuspiciousStewType::BLUE_ORCHID => SuspiciousStewTypeIds::BLUE_ORCHID, + SuspiciousStewType::ALLIUM => SuspiciousStewTypeIds::ALLIUM, + SuspiciousStewType::OXEYE_DAISY => SuspiciousStewTypeIds::OXEYE_DAISY, + SuspiciousStewType::WITHER_ROSE => SuspiciousStewTypeIds::WITHER_ROSE, + }, $case); + } + } } diff --git a/src/data/java/GameModeIdMap.php b/src/data/java/GameModeIdMap.php index 41258dd66e..9262723ed8 100644 --- a/src/data/java/GameModeIdMap.php +++ b/src/data/java/GameModeIdMap.php @@ -44,10 +44,14 @@ final class GameModeIdMap{ private array $enumToId = []; public function __construct(){ - $this->register(0, GameMode::SURVIVAL); - $this->register(1, GameMode::CREATIVE); - $this->register(2, GameMode::ADVENTURE); - $this->register(3, GameMode::SPECTATOR); + foreach(GameMode::cases() as $case){ + $this->register(match($case){ + GameMode::SURVIVAL => 0, + GameMode::CREATIVE => 1, + GameMode::ADVENTURE => 2, + GameMode::SPECTATOR => 3, + }, $case); + } } private function register(int $id, GameMode $type) : void{ diff --git a/tests/phpunit/data/bedrock/DyeColorIdMapTest.php b/tests/phpunit/data/bedrock/DyeColorIdMapTest.php deleted file mode 100644 index a3ca6db25c..0000000000 --- a/tests/phpunit/data/bedrock/DyeColorIdMapTest.php +++ /dev/null @@ -1,38 +0,0 @@ -toId($color); - $color2 = DyeColorIdMap::getInstance()->fromId($id); - self::assertTrue($color === $color2); - } - } -} From bf99917f2a6404ad5dff61874adbf283d9060936 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 17:01:20 +0000 Subject: [PATCH 1578/1858] ThreadSafeClassLoader: add native property types --- src/thread/ThreadSafeClassLoader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/thread/ThreadSafeClassLoader.php b/src/thread/ThreadSafeClassLoader.php index 95b983dc1b..fd9e6afed6 100644 --- a/src/thread/ThreadSafeClassLoader.php +++ b/src/thread/ThreadSafeClassLoader.php @@ -51,12 +51,12 @@ class ThreadSafeClassLoader extends ThreadSafe{ * @var ThreadSafeArray|string[] * @phpstan-var ThreadSafeArray */ - private $fallbackLookup; + private ThreadSafeArray $fallbackLookup; /** * @var ThreadSafeArray|string[][] * @phpstan-var ThreadSafeArray> */ - private $psr4Lookup; + private ThreadSafeArray $psr4Lookup; public function __construct(){ $this->fallbackLookup = new ThreadSafeArray(); From 7a55a6e6b6c10f5033491603443c16f434d0deed Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Dec 2023 17:22:11 +0000 Subject: [PATCH 1579/1858] ServerKiller: harden against spurious wakeups If awakened by spurious wakeup, the thread would immediately exit without doing anything, rendering it useless. Not sure how it took so long for this to be found... --- src/utils/ServerKiller.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/utils/ServerKiller.php b/src/utils/ServerKiller.php index 98129f48f0..514a265ba6 100644 --- a/src/utils/ServerKiller.php +++ b/src/utils/ServerKiller.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\utils; use pocketmine\thread\Thread; -use function time; +use function hrtime; +use function intdiv; class ServerKiller extends Thread{ private bool $stopped = false; @@ -34,13 +35,15 @@ class ServerKiller extends Thread{ ){} protected function onRun() : void{ - $start = time(); - $this->synchronized(function() : void{ - if(!$this->stopped){ - $this->wait($this->time * 1000000); + $start = hrtime(true); + $remaining = $this->time * 1_000_000; + $this->synchronized(function() use (&$remaining, $start) : void{ + while(!$this->stopped && $remaining > 0){ + $this->wait($remaining); + $remaining -= intdiv(hrtime(true) - $start, 1000); } }); - if(time() - $start >= $this->time){ + if($remaining <= 0){ echo "\nTook too long to stop, server was killed forcefully!\n"; @Process::kill(Process::pid()); } From c05116849ad47d08bd2d1708a3b8d9e05df27368 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Dec 2023 12:38:51 +0000 Subject: [PATCH 1580/1858] AsyncWorker: clean up nonsensical sleeper notifier handling code --- src/scheduler/AsyncTask.php | 6 +----- src/scheduler/AsyncWorker.php | 13 ++++++------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index b4c3ce20db..b0b64347ad 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -24,12 +24,10 @@ declare(strict_types=1); namespace pocketmine\scheduler; use pmmp\thread\Runnable; -use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafe; use pmmp\thread\ThreadSafeArray; use pocketmine\thread\NonThreadSafeValue; use function array_key_exists; -use function assert; use function igbinary_serialize; use function igbinary_unserialize; use function is_null; @@ -83,9 +81,7 @@ abstract class AsyncTask extends Runnable{ $this->onRun(); $this->finished = true; - $worker = NativeThread::getCurrentThread(); - assert($worker instanceof AsyncWorker); - $worker->getNotifier()->wakeupSleeper(); + AsyncWorker::getNotifier()->wakeupSleeper(); } /** diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 919e3eedcf..0f05dd8969 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -36,7 +36,7 @@ class AsyncWorker extends Worker{ /** @var mixed[] */ private static array $store = []; - private const TLS_KEY_NOTIFIER = self::class . "::notifier"; + private static ?SleeperNotifier $notifier = null; public function __construct( private ThreadSafeLogger $logger, @@ -45,12 +45,11 @@ class AsyncWorker extends Worker{ private SleeperHandlerEntry $sleeperEntry ){} - public function getNotifier() : SleeperNotifier{ - $notifier = $this->getFromThreadStore(self::TLS_KEY_NOTIFIER); - if(!$notifier instanceof SleeperNotifier){ - throw new AssumptionFailedError("SleeperNotifier not found in thread-local storage"); + public static function getNotifier() : SleeperNotifier{ + if(self::$notifier !== null){ + return self::$notifier; } - return $notifier; + throw new AssumptionFailedError("SleeperNotifier not found in thread-local storage"); } protected function onRun() : void{ @@ -66,7 +65,7 @@ class AsyncWorker extends Worker{ $this->logger->debug("No memory limit set"); } - $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); + self::$notifier = $this->sleeperEntry->createNotifier(); } public function getLogger() : ThreadSafeLogger{ From fd1bc1b8456907e8449087e5550ea08a1fd35e5c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Dec 2023 12:39:55 +0000 Subject: [PATCH 1581/1858] AsyncWorker: deprecate ThreadStore methods these are inconvenient and don't make any sense. It's far easier and more static-analysis-friendly to just use static properties. --- src/scheduler/AsyncWorker.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index 0f05dd8969..5fdfb1ebb7 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -83,6 +83,8 @@ class AsyncWorker extends Worker{ /** * Saves mixed data into the worker's thread-local object store. This can be used to store objects which you * want to use on this worker thread from multiple AsyncTasks. + * + * @deprecated Use static class properties instead. */ public function saveToThreadStore(string $identifier, mixed $value) : void{ if(NativeThread::getCurrentThread() !== $this){ @@ -98,6 +100,8 @@ class AsyncWorker extends Worker{ * account for the possibility that what you're trying to retrieve might not exist. * * Objects stored in this storage may ONLY be retrieved while the task is running. + * + * @deprecated Use static class properties instead. */ public function getFromThreadStore(string $identifier) : mixed{ if(NativeThread::getCurrentThread() !== $this){ @@ -108,6 +112,8 @@ class AsyncWorker extends Worker{ /** * Removes previously-stored mixed data from the worker's thread-local object store. + * + * @deprecated Use static class properties instead. */ public function removeFromThreadStore(string $identifier) : void{ if(NativeThread::getCurrentThread() !== $this){ From 03619ebca91387113e749555463c306b33754b0f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Dec 2023 12:44:03 +0000 Subject: [PATCH 1582/1858] Thread/Worker: Remove duplicated code Despite the comments, there doesn't seem to be an obvious reason for these to be copy-pasted. Perhaps there was some legacy reason for this with legacy pthreads. In fact, it looks likely that quit() will probably be able to be traitified too. --- src/thread/CommonThreadPartsTrait.php | 10 ++++++++++ src/thread/Thread.php | 10 ---------- src/thread/Worker.php | 11 ----------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index de2ecbde81..f01a979b09 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\thread; +use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\Server; @@ -96,6 +97,15 @@ trait CommonThreadPartsTrait{ public function getCrashInfo() : ?ThreadCrashInfo{ return $this->crashInfo; } + public function start(int $options = NativeThread::INHERIT_NONE) : bool{ + ThreadManager::getInstance()->add($this); + + if($this->getClassLoaders() === null){ + $this->setClassLoaders(); + } + return parent::start($options); + } + final public function run() : void{ error_reporting(-1); $this->registerClassLoaders(); diff --git a/src/thread/Thread.php b/src/thread/Thread.php index 706f964298..2f02040229 100644 --- a/src/thread/Thread.php +++ b/src/thread/Thread.php @@ -38,16 +38,6 @@ use pocketmine\scheduler\AsyncTask; abstract class Thread extends NativeThread{ use CommonThreadPartsTrait; - public function start(int $options = NativeThread::INHERIT_NONE) : bool{ - //this is intentionally not traitified - ThreadManager::getInstance()->add($this); - - if($this->getClassLoaders() === null){ - $this->setClassLoaders(); - } - return parent::start($options); - } - /** * Stops the thread using the best way possible. Try to stop it yourself before calling this. */ diff --git a/src/thread/Worker.php b/src/thread/Worker.php index 3bc5cda97a..7d9ca72c3b 100644 --- a/src/thread/Worker.php +++ b/src/thread/Worker.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\thread; -use pmmp\thread\Thread as NativeThread; use pmmp\thread\Worker as NativeWorker; use pocketmine\scheduler\AsyncTask; @@ -40,16 +39,6 @@ use pocketmine\scheduler\AsyncTask; abstract class Worker extends NativeWorker{ use CommonThreadPartsTrait; - public function start(int $options = NativeThread::INHERIT_NONE) : bool{ - //this is intentionally not traitified - ThreadManager::getInstance()->add($this); - - if($this->getClassLoaders() === null){ - $this->setClassLoaders(); - } - return parent::start($options); - } - /** * Stops the thread using the best way possible. Try to stop it yourself before calling this. */ From b69843a8bd2e72f16ee2f82a2842cfc1a0ca0b7a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Dec 2023 12:56:51 +0000 Subject: [PATCH 1583/1858] CommonThreadPartsTrait: add common implementation of quit() there's no need for the worker specialization here (isShutdown and shutdown are aliased to isJoined and join respectively), and the unstacking is not really desirable either as we previously learned with AsyncPool. --- src/thread/CommonThreadPartsTrait.php | 14 ++++++++++++++ src/thread/Thread.php | 14 -------------- src/thread/Worker.php | 17 ----------------- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index f01a979b09..9cd2b68f9a 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -120,6 +120,20 @@ trait CommonThreadPartsTrait{ $this->isKilled = true; } + /** + * Stops the thread using the best way possible. Try to stop it yourself before calling this. + */ + public function quit() : void{ + $this->isKilled = true; + + if(!$this->isJoined()){ + $this->notify(); + $this->join(); + } + + ThreadManager::getInstance()->remove($this); + } + /** * Called by set_exception_handler() when an uncaught exception is thrown. */ diff --git a/src/thread/Thread.php b/src/thread/Thread.php index 2f02040229..a6c36e14c7 100644 --- a/src/thread/Thread.php +++ b/src/thread/Thread.php @@ -37,18 +37,4 @@ use pocketmine\scheduler\AsyncTask; */ abstract class Thread extends NativeThread{ use CommonThreadPartsTrait; - - /** - * Stops the thread using the best way possible. Try to stop it yourself before calling this. - */ - public function quit() : void{ - $this->isKilled = true; - - if(!$this->isJoined()){ - $this->notify(); - $this->join(); - } - - ThreadManager::getInstance()->remove($this); - } } diff --git a/src/thread/Worker.php b/src/thread/Worker.php index 7d9ca72c3b..cc0b56046a 100644 --- a/src/thread/Worker.php +++ b/src/thread/Worker.php @@ -38,21 +38,4 @@ use pocketmine\scheduler\AsyncTask; */ abstract class Worker extends NativeWorker{ use CommonThreadPartsTrait; - - /** - * Stops the thread using the best way possible. Try to stop it yourself before calling this. - */ - public function quit() : void{ - $this->isKilled = true; - - if(!$this->isShutdown()){ - $this->synchronized(function() : void{ - while($this->unstack() !== null); - }); - $this->notify(); - $this->shutdown(); - } - - ThreadManager::getInstance()->remove($this); - } } From 1b0ef468f389832bf598b029548e199bd435776d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 21 Dec 2023 13:09:05 +0000 Subject: [PATCH 1584/1858] CommonThreadPartsTrait: remove outdated documentation This is now automatically called by the final run(), and the user now only needs to implement onRun(), so they have no business calling this function. --- src/thread/CommonThreadPartsTrait.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 9cd2b68f9a..9a14b23454 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -78,9 +78,7 @@ trait CommonThreadPartsTrait{ /** * Registers the class loaders for this thread. * - * WARNING: This method MUST be called from any descendent threads' run() method to make autoloading usable. - * If you do not do this, you will not be able to use new classes that were not loaded when the thread was started - * (unless you are using a custom autoloader). + * @internal */ public function registerClassLoaders() : void{ if($this->composerAutoloaderPath !== null){ From 5386e8607977583767a62d8f4eba2011f9a050ea Mon Sep 17 00:00:00 2001 From: GameParrot <85067619+GameParrot@users.noreply.github.com> Date: Wed, 3 Jan 2024 07:50:05 -0500 Subject: [PATCH 1585/1858] ProcessLoginTask: remove old root key (#6211) --- src/network/mcpe/auth/ProcessLoginTask.php | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index c396338da9..3bd8d62b86 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -39,16 +39,6 @@ use function time; class ProcessLoginTask extends AsyncTask{ private const TLS_KEY_ON_COMPLETION = "completion"; - /** - * Old Mojang root auth key. This was used since the introduction of Xbox Live authentication in 0.15.0. - * This key is expected to be replaced by the key below in the future, but this has not yet happened as of - * 2023-07-01. - * Ideally we would place a time expiry on this key, but since Mojang have not given a hard date for the key change, - * and one bad guess has already caused a major outage, we can't do this. - * TODO: This needs to be removed as soon as the new key is deployed by Mojang's authentication servers. - */ - public const MOJANG_OLD_ROOT_PUBLIC_KEY = "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V"; - /** * New Mojang root auth key. Mojang notified third-party developers of this change prior to the release of 1.20.0. * Expectations were that this would be used starting a "couple of weeks" after the release, but as of 2023-07-01, @@ -170,7 +160,7 @@ class ProcessLoginTask extends AsyncTask{ throw new VerifyLoginException($e->getMessage(), null, 0, $e); } - if($headers->x5u === self::MOJANG_ROOT_PUBLIC_KEY || $headers->x5u === self::MOJANG_OLD_ROOT_PUBLIC_KEY){ + if($headers->x5u === self::MOJANG_ROOT_PUBLIC_KEY){ $this->authenticated = true; //we're signed into xbox live } From 5718a1a20e03e375cc4798015db27ab5be1b84a5 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 8 Jan 2024 11:38:29 +0000 Subject: [PATCH 1586/1858] Reduce frequency of annoying Dependabot updates phpstan is releasing sometimes 4-5 times a week at this point, generating lots of noise. --- .github/dependabot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 518a26c705..8acff71d66 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,7 +3,7 @@ updates: - package-ecosystem: composer directory: "/" schedule: - interval: daily + interval: weekly time: "10:00" open-pull-requests-limit: 10 ignore: @@ -21,4 +21,4 @@ updates: - package-ecosystem: github-actions directory: "/" schedule: - interval: daily + interval: weekly From 19556634e34c1499e4dd89287dc852ccafbf4bd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 16:08:54 +0000 Subject: [PATCH 1587/1858] Bump build/php from `73e5950` to `6f619bf` (#6220) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `73e5950` to `6f619bf`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/73e5950eb90033a8de589044b92aa5e95de9c494...6f619bf7a0b00e72a7c90915eec6e5a28866aa55) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 73e5950eb9..6f619bf7a0 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 73e5950eb90033a8de589044b92aa5e95de9c494 +Subproject commit 6f619bf7a0b00e72a7c90915eec6e5a28866aa55 From f83280ece615aa9635b4513d6a20df4d4fdd87a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 16:11:18 +0000 Subject: [PATCH 1588/1858] Bump tests/plugins/DevTools from `411fd5b` to `c6dca35` (#6216) Bumps [tests/plugins/DevTools](https://github.com/pmmp/DevTools) from `411fd5b` to `c6dca35`. - [Release notes](https://github.com/pmmp/DevTools/releases) - [Commits](https://github.com/pmmp/DevTools/compare/411fd5bdc002edd82cf1ea658d170bb814d59483...c6dca357c7e8a37ce3479a1bedfe849451e072e3) --- updated-dependencies: - dependency-name: tests/plugins/DevTools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/plugins/DevTools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/DevTools b/tests/plugins/DevTools index 411fd5bdc0..c6dca357c7 160000 --- a/tests/plugins/DevTools +++ b/tests/plugins/DevTools @@ -1 +1 @@ -Subproject commit 411fd5bdc002edd82cf1ea658d170bb814d59483 +Subproject commit c6dca357c7e8a37ce3479a1bedfe849451e072e3 From 5b5c73f660eee54d72f73310c16b5dcdacbeff9c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 Jan 2024 16:12:03 +0000 Subject: [PATCH 1589/1858] Matrixify jobs that run on all PHP versions this allows us to specify PHP versions in just one place instead of 4, and also makes the display of jobs in the UI nicer. --- .github/workflows/main-php-matrix.yml | 165 ++++++++++++++++++++++++++ .github/workflows/main.yml | 157 +----------------------- 2 files changed, 171 insertions(+), 151 deletions(-) create mode 100644 .github/workflows/main-php-matrix.yml diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml new file mode 100644 index 0000000000..3bc0bdebf5 --- /dev/null +++ b/.github/workflows/main-php-matrix.yml @@ -0,0 +1,165 @@ +name: CI (all supported PHP versions) + +on: + workflow_call: + inputs: + php: + description: 'PHP version in X.Y format' + required: true + type: string + + #these are parameterized to ease updating + pm-version-major: + description: 'PocketMine-MP major version' + default: 5 + type: number + image: + description: 'Runner image to use' + default: 'ubuntu-20.04' + type: string + +jobs: + phpstan: + name: PHPStan analysis + runs-on: ${{ inputs.image }} + + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: pmmp/setup-php-action@2.0.0 + with: + php-version: ${{ inputs.php }} + install-path: "./bin" + pm-version-major: ${{ inputs.pm-version-major }} + + - name: Restore Composer package cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ inputs.php }}-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --prefer-dist --no-interaction + + - name: Run PHPStan + run: ./vendor/bin/phpstan analyze --no-progress --memory-limit=2G + + phpunit: + name: PHPUnit tests + runs-on: ${{ inputs.image }} + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: pmmp/setup-php-action@2.0.0 + with: + php-version: ${{ inputs.php }} + install-path: "./bin" + pm-version-major: ${{ inputs.pm-version-major }} + + - name: Restore Composer package cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ inputs.php }}-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --prefer-dist --no-interaction + + - name: Run PHPUnit tests + run: ./vendor/bin/phpunit --bootstrap vendor/autoload.php --fail-on-warning tests/phpunit + + integration: + name: Integration tests + runs-on: ${{ inputs.image }} + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Setup PHP + uses: pmmp/setup-php-action@2.0.0 + with: + php-version: ${{ inputs.php }} + install-path: "./bin" + pm-version-major: ${{ inputs.pm-version-major }} + + - name: Restore Composer package cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ inputs.php }}-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --no-dev --prefer-dist --no-interaction + + - name: Run integration tests + run: ./tests/travis.sh -t4 + + codegen: + name: Generated Code consistency checks + runs-on: ${{ inputs.image }} + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: pmmp/setup-php-action@2.0.0 + with: + php-version: ${{ inputs.php }} + install-path: "./bin" + pm-version-major: ${{ inputs.pm-version-major }} + + - name: Restore Composer package cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ inputs.php }}-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --no-dev --prefer-dist --no-interaction + + - name: Regenerate registry annotations + run: php build/generate-registry-annotations.php src + + - name: Regenerate KnownTranslation APIs + run: php build/generate-known-translation-apis.php + + - name: Regenerate BedrockData available files constants + run: php build/generate-bedrockdata-path-consts.php + + - name: Regenerate YmlServerProperties constants + run: php build/generate-pocketmine-yml-property-consts.php + + - name: Verify code is unchanged + run: | + git diff + git diff --quiet diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 32f8be80e5..bcb8036d9b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,162 +6,17 @@ on: workflow_dispatch: jobs: - phpstan: - name: PHPStan analysis - runs-on: ${{ matrix.image }} - + all-php-versions: + name: PHP ${{ matrix.php }} strategy: fail-fast: false matrix: - image: [ubuntu-20.04] php: ["8.1", "8.2", "8.3"] - steps: - - uses: actions/checkout@v4 - - - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 - with: - php-version: ${{ matrix.php }} - install-path: "./bin" - pm-version-major: "5" - - - name: Restore Composer package cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/composer/files - ~/.cache/composer/vcs - key: "composer-v2-cache-${{ matrix.php }}-${{ hashFiles('./composer.lock') }}" - restore-keys: | - composer-v2-cache- - - - name: Install Composer dependencies - run: composer install --prefer-dist --no-interaction - - - name: Run PHPStan - run: ./vendor/bin/phpstan analyze --no-progress --memory-limit=2G - - phpunit: - name: PHPUnit tests - runs-on: ${{ matrix.image }} - strategy: - fail-fast: false - matrix: - image: [ubuntu-20.04] - php: ["8.1", "8.2", "8.3"] - - steps: - - uses: actions/checkout@v4 - - - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 - with: - php-version: ${{ matrix.php }} - install-path: "./bin" - pm-version-major: "5" - - - name: Restore Composer package cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/composer/files - ~/.cache/composer/vcs - key: "composer-v2-cache-${{ matrix.php }}-${{ hashFiles('./composer.lock') }}" - restore-keys: | - composer-v2-cache- - - - name: Install Composer dependencies - run: composer install --prefer-dist --no-interaction - - - name: Run PHPUnit tests - run: ./vendor/bin/phpunit --bootstrap vendor/autoload.php --fail-on-warning tests/phpunit - - integration: - name: Integration tests - runs-on: ${{ matrix.image }} - strategy: - fail-fast: false - matrix: - image: [ubuntu-20.04] - php: ["8.1", "8.2", "8.3"] - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 - with: - php-version: ${{ matrix.php }} - install-path: "./bin" - pm-version-major: "5" - - - name: Restore Composer package cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/composer/files - ~/.cache/composer/vcs - key: "composer-v2-cache-${{ matrix.php }}-${{ hashFiles('./composer.lock') }}" - restore-keys: | - composer-v2-cache- - - - name: Install Composer dependencies - run: composer install --no-dev --prefer-dist --no-interaction - - - name: Run integration tests - run: ./tests/travis.sh -t4 - - codegen: - name: Generated Code consistency checks - runs-on: ${{ matrix.image }} - strategy: - fail-fast: false - matrix: - image: [ubuntu-20.04] - php: ["8.1", "8.2", "8.3"] - - steps: - - uses: actions/checkout@v4 - - - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 - with: - php-version: ${{ matrix.php }} - install-path: "./bin" - pm-version-major: "5" - - - name: Restore Composer package cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/composer/files - ~/.cache/composer/vcs - key: "composer-v2-cache-${{ matrix.php }}-${{ hashFiles('./composer.lock') }}" - restore-keys: | - composer-v2-cache- - - - name: Install Composer dependencies - run: composer install --no-dev --prefer-dist --no-interaction - - - name: Regenerate registry annotations - run: php build/generate-registry-annotations.php src - - - name: Regenerate KnownTranslation APIs - run: php build/generate-known-translation-apis.php - - - name: Regenerate BedrockData available files constants - run: php build/generate-bedrockdata-path-consts.php - - - name: Regenerate YmlServerProperties constants - run: php build/generate-pocketmine-yml-property-consts.php - - - name: Verify code is unchanged - run: | - git diff - git diff --quiet + uses: ./.github/workflows/main-php-matrix.yml + with: + php: ${{ matrix.php }} + secrets: inherit codestyle: name: Code Style checks From ee977c80015433d2f9b48ea9dbbef666f6456f0d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 Jan 2024 16:18:13 +0000 Subject: [PATCH 1590/1858] Updated composer dependencies --- composer.lock | 78 ++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/composer.lock b/composer.lock index f8e0b31af6..24d36cd5fe 100644 --- a/composer.lock +++ b/composer.lock @@ -1211,25 +1211,27 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -1237,7 +1239,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1261,9 +1263,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-01-07T17:17:35+00:00" }, { "name": "phar-io/manifest", @@ -1541,23 +1543,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.10", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -1607,7 +1609,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -1615,7 +1617,7 @@ "type": "github" } ], - "time": "2023-12-11T06:28:43+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2207,20 +2209,20 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -2229,7 +2231,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -2253,7 +2255,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -2261,20 +2263,20 @@ "type": "github" } ], - "time": "2023-09-28T11:50:59+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "5.0.3", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { @@ -2287,7 +2289,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -2320,7 +2322,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -2328,7 +2330,7 @@ "type": "github" } ], - "time": "2023-05-01T07:48:21+00:00" + "time": "2023-12-22T10:55:06+00:00" }, { "name": "sebastian/environment", @@ -2536,20 +2538,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -2582,7 +2584,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -2590,7 +2592,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", From 4db38ee45201ed9fb9bf0eb1ecb5007e64b40ca9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 Jan 2024 16:20:42 +0000 Subject: [PATCH 1591/1858] Updated PHPStan --- build/server-phar.php | 12 +++++++++++- composer.json | 2 +- composer.lock | 12 ++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/build/server-phar.php b/build/server-phar.php index 0665c89d5d..8b4d410ce1 100644 --- a/build/server-phar.php +++ b/build/server-phar.php @@ -32,6 +32,7 @@ use function getcwd; use function getopt; use function implode; use function ini_get; +use function is_string; use function microtime; use function preg_quote; use function realpath; @@ -147,8 +148,17 @@ function main() : void{ }else{ $build = 0; } + if(isset($opts["out"])){ + if(!is_string($opts["out"])){ + echo "--out cannot be specified multiple times" . PHP_EOL; + exit(1); + } + $pharPath = $opts["out"]; + }else{ + $pharPath = getcwd() . DIRECTORY_SEPARATOR . "PocketMine-MP.phar"; + } foreach(buildPhar( - $opts["out"] ?? getcwd() . DIRECTORY_SEPARATOR . "PocketMine-MP.phar", + $pharPath, dirname(__DIR__) . DIRECTORY_SEPARATOR, [ 'resources', diff --git a/composer.json b/composer.json index bcec3a72b8..953f06931e 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.50", + "phpstan/phpstan": "1.10.55", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 24d36cd5fe..0a2539521f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "894648a63ed7cd84303937208d1684af", + "content-hash": "d7a3fceea557add1b8cb461554db1ee7", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.50", + "version": "1.10.55", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" + "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", - "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", + "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2023-12-13T10:59:42+00:00" + "time": "2024-01-08T12:32:40+00:00" }, { "name": "phpstan/phpstan-phpunit", From db3bb55a2bf9daa658af6c119d2da9335d6a23bf Mon Sep 17 00:00:00 2001 From: Ayesh Karunaratne Date: Tue, 9 Jan 2024 12:28:20 +0000 Subject: [PATCH 1592/1858] Change `PHP_DEBUG` constant usage to `ZEND_DEBUG_BUILD` In PHP 8.4, the type of `PHP_DEBUG` changes from `int` to `bool`. See [PHP.Watch: PHP 8.4: `PHP_ZTS` and `PHP_DEBUG` constant value type changed from `int` to `bool`](https://php.watch/versions/8.4/PHP_ZTS-PHP_DEBUG-const-type-change). This changes the constants to `ZEND_DEBUG_BUILD`, which contains the same value but as a `bool` across all PHP versions. closes #6222 --- src/PocketMine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index 72d72506d3..1209b28f02 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -166,7 +166,7 @@ namespace pocketmine { * @return void */ function emit_performance_warnings(\Logger $logger){ - if(PHP_DEBUG !== 0){ + if(ZEND_DEBUG_BUILD){ $logger->warning("This PHP binary was compiled in debug mode. This has a major impact on performance."); } if(extension_loaded("xdebug") && (!function_exists('xdebug_info') || count(xdebug_info('mode')) !== 0)){ From 9b03b082ab4b2b18a194419fb49066198d24ad1b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Jan 2024 13:04:14 +0000 Subject: [PATCH 1593/1858] Added --version option --- src/BootstrapOptions.php | 2 ++ src/PocketMine.php | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/BootstrapOptions.php b/src/BootstrapOptions.php index 879c502a69..c34dda94b9 100644 --- a/src/BootstrapOptions.php +++ b/src/BootstrapOptions.php @@ -45,4 +45,6 @@ final class BootstrapOptions{ public const PLUGINS = "plugins"; /** Path to store and load server data */ public const DATA = "data"; + /** Shows basic server version information and exits */ + public const VERSION = "version"; } diff --git a/src/PocketMine.php b/src/PocketMine.php index 1209b28f02..d13cf33a1a 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -25,6 +25,7 @@ namespace pocketmine { use Composer\InstalledVersions; use pocketmine\errorhandler\ErrorToExceptionHandler; + use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\thread\ThreadManager; use pocketmine\thread\ThreadSafeClassLoader; use pocketmine\utils\Filesystem; @@ -40,14 +41,17 @@ namespace pocketmine { use function extension_loaded; use function function_exists; use function getcwd; + use function getopt; use function is_dir; use function mkdir; use function phpversion; use function preg_match; use function preg_quote; + use function printf; use function realpath; use function version_compare; use const DIRECTORY_SEPARATOR; + use const PHP_EOL; require_once __DIR__ . '/VersionInfo.php'; @@ -273,6 +277,11 @@ JIT_WARNING ErrorToExceptionHandler::set(); + if(count(getopt("", [BootstrapOptions::VERSION])) > 0){ + printf("%s %s (git hash %s) for Minecraft: Bedrock Edition %s\n", VersionInfo::NAME, VersionInfo::VERSION()->getFullVersion(true), VersionInfo::GIT_HASH(), ProtocolInfo::MINECRAFT_VERSION); + exit(0); + } + $cwd = Utils::assumeNotFalse(realpath(Utils::assumeNotFalse(getcwd()))); $dataPath = getopt_string(BootstrapOptions::DATA) ?? $cwd; $pluginPath = getopt_string(BootstrapOptions::PLUGINS) ?? $cwd . DIRECTORY_SEPARATOR . "plugins"; From 288bd4018baf6c92ce7e3f2264fb8d4e7f6e1bc5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Jan 2024 13:35:10 +0000 Subject: [PATCH 1594/1858] Block: deprecate isSolid() As discussed many years ago in #2551, no one actually knows what this property actually means. It definitely isn't the conventionally expected definition of 'solid' found in the real world, as signs are solid but flower pots are not. --- src/block/Block.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/block/Block.php b/src/block/Block.php index b2847bb358..d6158ea947 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -576,6 +576,15 @@ class Block{ return false; } + /** + * @deprecated TL;DR: Don't use this function. Its results are confusing and inconsistent. + * + * No one is sure what the meaning of this property actually is. It's borrowed from Minecraft Java Edition, and is + * used by various blocks for support checks. + * + * Things like signs and banners are considered "solid" despite having no collision box, and things like skulls and + * flower pots are considered non-solid despite obviously being "solid" in the conventional, real-world sense. + */ public function isSolid() : bool{ return true; } From a459e3c1a9c3f485c7073aa06a2c09b3ff884570 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Jan 2024 13:35:36 +0000 Subject: [PATCH 1595/1858] Block: improve some documentation --- src/block/Block.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index d6158ea947..dbc269c630 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -402,7 +402,7 @@ class Block{ } /** - * AKA: Block->isPlaceable + * Returns whether this block can be placed when obtained as an item. */ public function canBePlaced() : bool{ return true; @@ -572,6 +572,9 @@ class Block{ return $this->getLightFilter() > 0; } + /** + * Returns whether this block allows any light to pass through it. + */ public function isTransparent() : bool{ return false; } @@ -590,7 +593,7 @@ class Block{ } /** - * AKA: Block->isFlowable + * Returns whether this block can be destroyed by liquid flowing into its cell. */ public function canBeFlowedInto() : bool{ return false; From e77cd39316999a382a2b197152ef23f6bdde03b4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Jan 2024 15:55:41 +0000 Subject: [PATCH 1596/1858] ItemBlock: add a workaround for air items with a stack size bigger than 0 In the future we should look into making empty slots be represented by null or a different, special item type, instead of breaking the air block for this purpose. closes #6185 closes #6016 --- src/item/ItemBlock.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 11bcb58d37..015c784714 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\Block; +use pocketmine\block\BlockTypeIds; use pocketmine\data\runtime\RuntimeDataDescriber; /** @@ -58,4 +59,12 @@ final class ItemBlock extends Item{ public function getMaxStackSize() : int{ return $this->block->getMaxStackSize(); } + + public function isNull() : bool{ + //TODO: we really shouldn't need to treat air as a special case here + //this is needed because the "null" empty slot item is represented by an air block, but there's no real reason + //why air should be needed at all. A separate special item type (or actual null) should be used instead, but + //this would cause a lot of BC breaks, so we can't do it yet. + return parent::isNull() || $this->block->getTypeId() === BlockTypeIds::AIR; + } } From c7c20d4d7906674cee099c191165935075af4f8f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Jan 2024 16:43:11 +0000 Subject: [PATCH 1597/1858] tools/generate-block-palette-spec: fixed sorting --- tools/generate-block-palette-spec.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index 6217d54378..879ffd6b48 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -40,6 +40,7 @@ use function get_class; use function json_encode; use function ksort; use const JSON_PRETTY_PRINT; +use const SORT_NATURAL; use const SORT_STRING; use const STDERR; @@ -82,7 +83,7 @@ foreach($states as $state){ foreach(Utils::stringifyKeys($reportMap) as $blockName => $propertyList){ foreach(Utils::stringifyKeys($propertyList) as $propertyName => $propertyValues){ - ksort($reportMap[$blockName][$propertyName]); + ksort($propertyValues, SORT_NATURAL); $reportMap[$blockName][$propertyName] = array_values($propertyValues); } } From d97c8e2fd2b40cf778ae2f952e2520183fc4902f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 22 Jan 2024 18:48:32 +0000 Subject: [PATCH 1598/1858] tools/generate-item-upgrade-schema: filter old IDs that were already renamed by previous schemas this caused weird outputs if an item was renamed multiple times. --- tools/generate-item-upgrade-schema.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/generate-item-upgrade-schema.php b/tools/generate-item-upgrade-schema.php index c6096bafba..4eee925392 100644 --- a/tools/generate-item-upgrade-schema.php +++ b/tools/generate-item-upgrade-schema.php @@ -94,9 +94,14 @@ foreach($files as $file){ $newDiff = []; foreach($target["simple"] as $oldId => $newId){ - if(($merged["simple"][$oldId] ?? null) !== $newId){ - $newDiff["renamedIds"][$oldId] = $newId; + $previousNewId = $merged["simple"][$oldId] ?? null; + if( + $previousNewId === $newId || //if previous schemas already accounted for this + ($previousNewId !== null && isset($target["simple"][$previousNewId])) //or the item's ID has been changed for a second time + ){ + continue; } + $newDiff["renamedIds"][$oldId] = $newId; } if(isset($newDiff["renamedIds"])){ ksort($newDiff["renamedIds"], SORT_STRING); From 81d5b9ba0676ee520cb9a80a45965952055bc2dc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 22 Jan 2024 18:49:06 +0000 Subject: [PATCH 1599/1858] tools/generate-bedrock-data-from-packets: add more exception detail for unexpected block runtimeIDs --- tools/generate-bedrock-data-from-packets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 7316b3f867..77d2b9d93f 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -165,7 +165,7 @@ class ParserPacketHandler extends PacketHandler{ $data->block_states = self::blockStatePropertiesToString($blockState); } }elseif($itemStack->getBlockRuntimeId() !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ - throw new PacketHandlingException("Non-blockitems should have a zero block runtime ID"); + throw new PacketHandlingException("Non-blockitems should have a zero block runtime ID (" . $itemStack->getBlockRuntimeId() . " on " . $itemStringId . ")"); }elseif($meta !== 0){ $data->meta = $meta; } From e28d20a68ed7afaf662df35deac6de76a1f07a67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:29:34 +0000 Subject: [PATCH 1600/1858] Bump shivammathur/setup-php from 2.28.0 to 2.29.0 (#6228) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.28.0 to 2.29.0. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.28.0...2.29.0) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 6081b8fd8c..77a231f4de 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.28.0 + uses: shivammathur/setup-php@2.29.0 with: php-version: 8.2 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 62fa413328..bc72cfa201 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.28.0 + uses: shivammathur/setup-php@2.29.0 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bcb8036d9b..ecadf8af3c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.28.0 + uses: shivammathur/setup-php@2.29.0 with: php-version: 8.2 tools: php-cs-fixer:3.38 From 234199d241b99409b2726afe87f7605f626ba48d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:29:49 +0000 Subject: [PATCH 1601/1858] Bump actions/cache from 3 to 4 (#6229) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main-php-matrix.yml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 77a231f4de..f02f047123 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -18,7 +18,7 @@ jobs: php-version: 8.2 - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index bc72cfa201..77467fad21 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -25,7 +25,7 @@ jobs: php-version: ${{ matrix.php-version }} - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml index 3bc0bdebf5..110f8d0edd 100644 --- a/.github/workflows/main-php-matrix.yml +++ b/.github/workflows/main-php-matrix.yml @@ -37,7 +37,7 @@ jobs: pm-version-major: ${{ inputs.pm-version-major }} - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files @@ -69,7 +69,7 @@ jobs: pm-version-major: ${{ inputs.pm-version-major }} - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files @@ -103,7 +103,7 @@ jobs: pm-version-major: ${{ inputs.pm-version-major }} - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files @@ -135,7 +135,7 @@ jobs: pm-version-major: ${{ inputs.pm-version-major }} - name: Restore Composer package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/composer/files From 5709d727a2fb24125be6da80c1cf15a99c0f3a83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:30:19 +0000 Subject: [PATCH 1602/1858] Bump phpstan/phpstan from 1.10.55 to 1.10.57 (#6235) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.55 to 1.10.57. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.55...1.10.57) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 953f06931e..728478e485 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.55", + "phpstan/phpstan": "1.10.57", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 0a2539521f..a668d5aad5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d7a3fceea557add1b8cb461554db1ee7", + "content-hash": "fecd5b7c364cb3a0f3a832004f594101", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.55", + "version": "1.10.57", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949" + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", - "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-01-08T12:32:40+00:00" + "time": "2024-01-24T11:51:34+00:00" }, { "name": "phpstan/phpstan-phpunit", From f207d1bbf244636de69a05d468926e530f60bec1 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Mon, 5 Feb 2024 07:36:09 -0500 Subject: [PATCH 1603/1858] Make CocoaBlock Flowable (#6218) --- src/block/CocoaBlock.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 5cec4b933a..6d8ce1adc9 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\utils\AgeableTrait; use pocketmine\block\utils\BlockEventHelper; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\block\utils\SupportType; use pocketmine\block\utils\WoodType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; @@ -40,7 +39,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; use function mt_rand; -class CocoaBlock extends Transparent{ +class CocoaBlock extends Flowable{ use HorizontalFacingTrait; use AgeableTrait; @@ -65,10 +64,6 @@ class CocoaBlock extends Transparent{ ]; } - public function getSupportType(int $facing) : SupportType{ - return SupportType::NONE; - } - private function canAttachTo(Block $block) : bool{ return $block instanceof Wood && $block->getWoodType() === WoodType::JUNGLE; } From 6bb84bc46cbf8352824628c270b57bb037c591d2 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Tue, 6 Feb 2024 13:42:24 +0100 Subject: [PATCH 1604/1858] Add `Promise::all` (#6152) --- src/promise/Promise.php | 50 +++++++++++ tests/phpstan/configs/phpstan-bugs.neon | 15 ++++ tests/phpunit/promise/PromiseTest.php | 106 ++++++++++++++++++++++++ 3 files changed, 171 insertions(+) diff --git a/src/promise/Promise.php b/src/promise/Promise.php index bafec09797..0def7e6052 100644 --- a/src/promise/Promise.php +++ b/src/promise/Promise.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\promise; +use function count; use function spl_object_id; /** @@ -57,4 +58,53 @@ final class Promise{ //rejected or just hasn't been resolved yet return $this->shared->state === true; } + + /** + * Returns a promise that will resolve only once all the Promises in + * `$promises` have resolved. The resolution value of the returned promise + * will be an array containing the resolution values of each Promises in + * `$promises` indexed by the respective Promises' array keys. + * + * @param Promise[] $promises + * + * @phpstan-template TPromiseValue + * @phpstan-template TKey of array-key + * @phpstan-param non-empty-array> $promises + * + * @phpstan-return Promise> + */ + public static function all(array $promises) : Promise{ + if(count($promises) === 0){ + throw new \InvalidArgumentException("At least one promise must be provided"); + } + /** @phpstan-var PromiseResolver> $resolver */ + $resolver = new PromiseResolver(); + $values = []; + $toResolve = count($promises); + $continue = true; + + foreach($promises as $key => $promise){ + $promise->onCompletion( + function(mixed $value) use ($resolver, $key, $toResolve, &$values) : void{ + $values[$key] = $value; + + if(count($values) === $toResolve){ + $resolver->resolve($values); + } + }, + function() use ($resolver, &$continue) : void{ + if($continue){ + $continue = false; + $resolver->reject(); + } + } + ); + + if(!$continue){ + break; + } + } + + return $resolver->getPromise(); + } } diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index af04866114..de38903bd3 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -35,3 +35,18 @@ parameters: count: 1 path: ../../../src/world/generator/normal/Normal.php + - + message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertFalse\\(\\) with false will always evaluate to true\\.$#" + count: 1 + path: ../../phpunit/promise/PromiseTest.php + + - + message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with false and 'All promise should…' will always evaluate to false\\.$#" + count: 1 + path: ../../phpunit/promise/PromiseTest.php + + - + message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with false will always evaluate to false\\.$#" + count: 2 + path: ../../phpunit/promise/PromiseTest.php + diff --git a/tests/phpunit/promise/PromiseTest.php b/tests/phpunit/promise/PromiseTest.php index 7198f4f619..682ee00703 100644 --- a/tests/phpunit/promise/PromiseTest.php +++ b/tests/phpunit/promise/PromiseTest.php @@ -39,4 +39,110 @@ final class PromiseTest extends TestCase{ } ); } + + public function testAllPreResolved() : void{ + $resolver = new PromiseResolver(); + $resolver->resolve(1); + + $allPromise = Promise::all([$resolver->getPromise()]); + $done = false; + $allPromise->onCompletion( + function($value) use (&$done) : void{ + $done = true; + self::assertEquals([1], $value); + }, + function() use (&$done) : void{ + $done = true; + self::fail("Promise was rejected"); + } + ); + self::assertTrue($done); + } + + public function testAllPostResolved() : void{ + $resolver = new PromiseResolver(); + + $allPromise = Promise::all([$resolver->getPromise()]); + $done = false; + $allPromise->onCompletion( + function($value) use (&$done) : void{ + $done = true; + self::assertEquals([1], $value); + }, + function() use (&$done) : void{ + $done = true; + self::fail("Promise was rejected"); + } + ); + self::assertFalse($done); + $resolver->resolve(1); + self::assertTrue($done); + } + + public function testAllResolve() : void{ + $resolver1 = new PromiseResolver(); + $resolver2 = new PromiseResolver(); + + $allPromise = Promise::all([$resolver1->getPromise(), $resolver2->getPromise()]); + $done = false; + $allPromise->onCompletion( + function($value) use (&$done) : void{ + $done = true; + self::assertEquals([1, 2], $value); + }, + function() use (&$done) : void{ + $done = true; + self::fail("Promise was rejected"); + } + ); + self::assertFalse($done); + $resolver1->resolve(1); + self::assertFalse($done); + $resolver2->resolve(2); + self::assertTrue($done); + } + + public function testAllPartialReject() : void{ + $resolver1 = new PromiseResolver(); + $resolver2 = new PromiseResolver(); + + $allPromise = Promise::all([$resolver1->getPromise(), $resolver2->getPromise()]); + $done = false; + $allPromise->onCompletion( + function($value) use (&$done) : void{ + $done = true; + self::fail("Promise was unexpectedly resolved"); + }, + function() use (&$done) : void{ + $done = true; + } + ); + self::assertFalse($done); + $resolver2->reject(); + self::assertTrue($done, "All promise should be rejected immediately after the first constituent rejection"); + $resolver1->resolve(1); + } + + /** + * Promise::all() should return a rejected promise if any of the input promises were rejected at the call time + */ + public function testAllPartialPreReject() : void{ + $resolver1 = new PromiseResolver(); + $resolver2 = new PromiseResolver(); + $resolver2->reject(); + + $allPromise = Promise::all([$resolver1->getPromise(), $resolver2->getPromise()]); + $done = false; + $allPromise->onCompletion( + function($value) use (&$done) : void{ + $done = true; + self::fail("Promise was unexpectedly resolved"); + }, + function() use (&$done) : void{ + $done = true; + } + ); + self::assertTrue($done, "All promise should be rejected immediately after the first constituent rejection"); + $resolver1->resolve(1); + } } From 6492e7f4a2b95465a9ec7d54f111fd3170d9f609 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:33:44 +0000 Subject: [PATCH 1605/1858] 1.20.60 support --- composer.json | 8 +-- composer.lock | 50 +++++++++---------- src/Server.php | 31 ++++++++---- src/data/bedrock/block/BlockStateData.php | 2 +- src/data/bedrock/block/BlockStateNames.php | 2 +- .../bedrock/block/BlockStateStringValues.php | 17 ------- src/data/bedrock/block/BlockTypeNames.php | 35 ++++++++++++- .../convert/BlockObjectToStateSerializer.php | 46 ++++++++++++++--- .../block/convert/BlockStateReader.php | 25 ---------- .../BlockStateToObjectDeserializer.php | 50 ++++++++++++++++--- .../block/convert/BlockStateWriter.php | 24 --------- .../ItemSerializerDeserializerRegistrar.php | 2 +- src/data/bedrock/item/ItemTypeNames.php | 9 +++- src/network/mcpe/ChunkRequestTask.php | 21 ++++++-- src/network/mcpe/NetworkSession.php | 28 ++++++++--- src/network/mcpe/cache/ChunkCache.php | 2 + .../mcpe/compression/CompressBatchTask.php | 3 +- src/network/mcpe/compression/Compressor.php | 10 ++++ .../mcpe/compression/ZlibCompressor.php | 5 ++ .../handler/SessionStartPacketHandler.php | 3 +- .../mcpe/serializer/ChunkSerializer.php | 40 ++++++++++++--- src/world/format/io/data/BedrockWorldData.php | 6 +-- 22 files changed, 267 insertions(+), 152 deletions(-) diff --git a/composer.json b/composer.json index 728478e485..47e798b164 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.2.1000", - "pocketmine/bedrock-block-upgrade-schema": "~3.4.0+bedrock-1.20.50", - "pocketmine/bedrock-data": "~2.7.0+bedrock-1.20.50", - "pocketmine/bedrock-item-upgrade-schema": "~1.6.0+bedrock-1.20.50", - "pocketmine/bedrock-protocol": "~26.0.0+bedrock-1.20.50", + "pocketmine/bedrock-block-upgrade-schema": "~3.5.0+bedrock-1.20.60", + "pocketmine/bedrock-data": "~2.8.0+bedrock-1.20.60", + "pocketmine/bedrock-item-upgrade-schema": "~1.7.0+bedrock-1.20.60", + "pocketmine/bedrock-protocol": "~27.0.0+bedrock-1.20.60", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index a668d5aad5..47aeeaecab 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fecd5b7c364cb3a0f3a832004f594101", + "content-hash": "d923f5fd75f0d33eb5198268a74a58b4", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "9872eb37f15080b19c2b7861085e549c48dda92d" + "reference": "1ed4ba738333c4b4afe4fef8e9326a45c89f12e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/9872eb37f15080b19c2b7861085e549c48dda92d", - "reference": "9872eb37f15080b19c2b7861085e549c48dda92d", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/1ed4ba738333c4b4afe4fef8e9326a45c89f12e3", + "reference": "1ed4ba738333c4b4afe4fef8e9326a45c89f12e3", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.4.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.5.0" }, - "time": "2023-11-08T15:22:06+00:00" + "time": "2024-02-07T11:46:50+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.7.0+bedrock-1.20.50", + "version": "2.8.0+bedrock-1.20.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13" + "reference": "d8ea0355b7c835564af9fe6e273e650ac62c84a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/36f975dfca7520b7d36b0b39429f274464c9bc13", - "reference": "36f975dfca7520b7d36b0b39429f274464c9bc13", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d8ea0355b7c835564af9fe6e273e650ac62c84a2", + "reference": "d8ea0355b7c835564af9fe6e273e650ac62c84a2", "shasum": "" }, "type": "library", @@ -168,22 +168,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.50" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.60" }, - "time": "2023-12-06T13:59:08+00:00" + "time": "2024-02-07T11:23:46+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1" + "reference": "69772dd58e2b2c7b7513fa2bcdc46e782228641c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/d374e5fd8302977675dcd2a42733abd3ee476ca1", - "reference": "d374e5fd8302977675dcd2a42733abd3ee476ca1", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/69772dd58e2b2c7b7513fa2bcdc46e782228641c", + "reference": "69772dd58e2b2c7b7513fa2bcdc46e782228641c", "shasum": "" }, "type": "library", @@ -194,22 +194,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.6.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.7.0" }, - "time": "2023-11-08T18:12:14+00:00" + "time": "2024-02-07T11:58:05+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "26.0.0+bedrock-1.20.50", + "version": "27.0.1+bedrock-1.20.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df" + "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/f278a0b6d4fa1e2e0408a125f323a3118b1968df", - "reference": "f278a0b6d4fa1e2e0408a125f323a3118b1968df", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cebb55f6e904f722b14d420f6b2c84c7fa69f10", + "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10", "shasum": "" }, "require": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/26.0.0+bedrock-1.20.50" + "source": "https://github.com/pmmp/BedrockProtocol/tree/27.0.1+bedrock-1.20.60" }, - "time": "2023-12-06T14:08:37+00:00" + "time": "2024-02-07T11:53:50+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/Server.php b/src/Server.php index 48f641947d..3f12f7669a 100644 --- a/src/Server.php +++ b/src/Server.php @@ -60,6 +60,7 @@ use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; +use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; use pocketmine\network\mcpe\raklib\RakLibInterface; use pocketmine\network\mcpe\StandardEntityEventBroadcaster; use pocketmine\network\mcpe\StandardPacketBroadcaster; @@ -125,6 +126,7 @@ use Symfony\Component\Filesystem\Path; use function array_fill; use function array_sum; use function base64_encode; +use function chr; use function cli_set_process_title; use function copy; use function count; @@ -1373,19 +1375,26 @@ class Server{ try{ $timings->startTiming(); - if($sync === null){ - $threshold = $compressor->getCompressionThreshold(); - $sync = !$this->networkCompressionAsync || $threshold === null || strlen($buffer) < $threshold; + $threshold = $compressor->getCompressionThreshold(); + if($threshold === null || strlen($buffer) < $compressor->getCompressionThreshold()){ + $compressionType = CompressionAlgorithm::NONE; + $compressed = $buffer; + + }else{ + $sync ??= !$this->networkCompressionAsync; + + if(!$sync && strlen($buffer) >= $this->networkCompressionAsyncThreshold){ + $promise = new CompressBatchPromise(); + $task = new CompressBatchTask($buffer, $promise, $compressor); + $this->asyncPool->submitTask($task); + return $promise; + } + + $compressionType = $compressor->getNetworkId(); + $compressed = $compressor->compress($buffer); } - if(!$sync && strlen($buffer) >= $this->networkCompressionAsyncThreshold){ - $promise = new CompressBatchPromise(); - $task = new CompressBatchTask($buffer, $promise, $compressor); - $this->asyncPool->submitTask($task); - return $promise; - } - - return $compressor->compress($buffer); + return chr($compressionType) . $compressed; }finally{ $timings->stopTiming(); } diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 1417fa0144..b089eea5bd 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,7 +42,7 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (50 << 8) | //patch + (60 << 8) | //patch (1); //revision public const TAG_NAME = "name"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 9b28e936d8..75b45e88ec 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -56,7 +56,6 @@ final class BlockStateNames{ public const CHEMISTRY_TABLE_TYPE = "chemistry_table_type"; public const CHISEL_TYPE = "chisel_type"; public const CLUSTER_COUNT = "cluster_count"; - public const COLOR = "color"; public const COLOR_BIT = "color_bit"; public const COMPOSTER_FILL_LEVEL = "composter_fill_level"; public const CONDITIONAL_BIT = "conditional_bit"; @@ -145,6 +144,7 @@ final class BlockStateNames{ public const TALL_GRASS_TYPE = "tall_grass_type"; public const TOGGLE_BIT = "toggle_bit"; public const TORCH_FACING_DIRECTION = "torch_facing_direction"; + public const TRIAL_SPAWNER_STATE = "trial_spawner_state"; public const TRIGGERED_BIT = "triggered_bit"; public const TURTLE_EGG_COUNT = "turtle_egg_count"; public const TWISTING_VINES_AGE = "twisting_vines_age"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 4a05fa33e9..d9d8a748d0 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -62,23 +62,6 @@ final class BlockStateStringValues{ public const CHISEL_TYPE_LINES = "lines"; public const CHISEL_TYPE_SMOOTH = "smooth"; - public const COLOR_BLACK = "black"; - public const COLOR_BLUE = "blue"; - public const COLOR_BROWN = "brown"; - public const COLOR_CYAN = "cyan"; - public const COLOR_GRAY = "gray"; - public const COLOR_GREEN = "green"; - public const COLOR_LIGHT_BLUE = "light_blue"; - public const COLOR_LIME = "lime"; - public const COLOR_MAGENTA = "magenta"; - public const COLOR_ORANGE = "orange"; - public const COLOR_PINK = "pink"; - public const COLOR_PURPLE = "purple"; - public const COLOR_RED = "red"; - public const COLOR_SILVER = "silver"; - public const COLOR_WHITE = "white"; - public const COLOR_YELLOW = "yellow"; - public const CORAL_COLOR_BLUE = "blue"; public const CORAL_COLOR_PINK = "pink"; public const CORAL_COLOR_PURPLE = "purple"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index fdca40a3a9..1d8bfadfa4 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -517,10 +517,40 @@ final class BlockTypeNames{ public const GREEN_WOOL = "minecraft:green_wool"; public const GRINDSTONE = "minecraft:grindstone"; public const HANGING_ROOTS = "minecraft:hanging_roots"; + public const HARD_BLACK_STAINED_GLASS = "minecraft:hard_black_stained_glass"; + public const HARD_BLACK_STAINED_GLASS_PANE = "minecraft:hard_black_stained_glass_pane"; + public const HARD_BLUE_STAINED_GLASS = "minecraft:hard_blue_stained_glass"; + public const HARD_BLUE_STAINED_GLASS_PANE = "minecraft:hard_blue_stained_glass_pane"; + public const HARD_BROWN_STAINED_GLASS = "minecraft:hard_brown_stained_glass"; + public const HARD_BROWN_STAINED_GLASS_PANE = "minecraft:hard_brown_stained_glass_pane"; + public const HARD_CYAN_STAINED_GLASS = "minecraft:hard_cyan_stained_glass"; + public const HARD_CYAN_STAINED_GLASS_PANE = "minecraft:hard_cyan_stained_glass_pane"; public const HARD_GLASS = "minecraft:hard_glass"; public const HARD_GLASS_PANE = "minecraft:hard_glass_pane"; - public const HARD_STAINED_GLASS = "minecraft:hard_stained_glass"; - public const HARD_STAINED_GLASS_PANE = "minecraft:hard_stained_glass_pane"; + public const HARD_GRAY_STAINED_GLASS = "minecraft:hard_gray_stained_glass"; + public const HARD_GRAY_STAINED_GLASS_PANE = "minecraft:hard_gray_stained_glass_pane"; + public const HARD_GREEN_STAINED_GLASS = "minecraft:hard_green_stained_glass"; + public const HARD_GREEN_STAINED_GLASS_PANE = "minecraft:hard_green_stained_glass_pane"; + public const HARD_LIGHT_BLUE_STAINED_GLASS = "minecraft:hard_light_blue_stained_glass"; + public const HARD_LIGHT_BLUE_STAINED_GLASS_PANE = "minecraft:hard_light_blue_stained_glass_pane"; + public const HARD_LIGHT_GRAY_STAINED_GLASS = "minecraft:hard_light_gray_stained_glass"; + public const HARD_LIGHT_GRAY_STAINED_GLASS_PANE = "minecraft:hard_light_gray_stained_glass_pane"; + public const HARD_LIME_STAINED_GLASS = "minecraft:hard_lime_stained_glass"; + public const HARD_LIME_STAINED_GLASS_PANE = "minecraft:hard_lime_stained_glass_pane"; + public const HARD_MAGENTA_STAINED_GLASS = "minecraft:hard_magenta_stained_glass"; + public const HARD_MAGENTA_STAINED_GLASS_PANE = "minecraft:hard_magenta_stained_glass_pane"; + public const HARD_ORANGE_STAINED_GLASS = "minecraft:hard_orange_stained_glass"; + public const HARD_ORANGE_STAINED_GLASS_PANE = "minecraft:hard_orange_stained_glass_pane"; + public const HARD_PINK_STAINED_GLASS = "minecraft:hard_pink_stained_glass"; + public const HARD_PINK_STAINED_GLASS_PANE = "minecraft:hard_pink_stained_glass_pane"; + public const HARD_PURPLE_STAINED_GLASS = "minecraft:hard_purple_stained_glass"; + public const HARD_PURPLE_STAINED_GLASS_PANE = "minecraft:hard_purple_stained_glass_pane"; + public const HARD_RED_STAINED_GLASS = "minecraft:hard_red_stained_glass"; + public const HARD_RED_STAINED_GLASS_PANE = "minecraft:hard_red_stained_glass_pane"; + public const HARD_WHITE_STAINED_GLASS = "minecraft:hard_white_stained_glass"; + public const HARD_WHITE_STAINED_GLASS_PANE = "minecraft:hard_white_stained_glass_pane"; + public const HARD_YELLOW_STAINED_GLASS = "minecraft:hard_yellow_stained_glass"; + public const HARD_YELLOW_STAINED_GLASS_PANE = "minecraft:hard_yellow_stained_glass_pane"; public const HARDENED_CLAY = "minecraft:hardened_clay"; public const HAY_BLOCK = "minecraft:hay_block"; public const HEAVY_WEIGHTED_PRESSURE_PLATE = "minecraft:heavy_weighted_pressure_plate"; @@ -900,6 +930,7 @@ final class BlockTypeNames{ public const TORCHFLOWER_CROP = "minecraft:torchflower_crop"; public const TRAPDOOR = "minecraft:trapdoor"; public const TRAPPED_CHEST = "minecraft:trapped_chest"; + public const TRIAL_SPAWNER = "minecraft:trial_spawner"; public const TRIP_WIRE = "minecraft:trip_wire"; public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; public const TUBE_CORAL = "minecraft:tube_coral"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index f70162ac5d..b0b06ac908 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -315,6 +315,44 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ } public function registerFlatColorBlockSerializers() : void{ + $this->map(Blocks::STAINED_HARDENED_GLASS(), fn(StainedHardenedGlass $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS, + DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS, + DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS, + DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS, + DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS, + DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS, + DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS, + DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS, + DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS, + DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS, + DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS, + DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS, + DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS, + DyeColor::RED => Ids::HARD_RED_STAINED_GLASS, + DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS, + DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS, + })); + + $this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), fn(StainedHardenedGlassPane $block) => Writer::create(match($block->getColor()){ + DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS_PANE, + DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS_PANE, + DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS_PANE, + DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS_PANE, + DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS_PANE, + DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS_PANE, + DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE, + DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE, + DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS_PANE, + DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS_PANE, + DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS_PANE, + DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS_PANE, + DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS_PANE, + DyeColor::RED => Ids::HARD_RED_STAINED_GLASS_PANE, + DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS_PANE, + DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS_PANE, + })); + $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ return Writer::create(match($block->getColor()){ DyeColor::BLACK => Ids::BLACK_GLAZED_TERRACOTTA, @@ -1617,14 +1655,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); }); $this->map(Blocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); - $this->map(Blocks::STAINED_HARDENED_GLASS(), function(StainedHardenedGlass $block) : Writer{ - return Writer::create(Ids::HARD_STAINED_GLASS) - ->writeColor($block->getColor()); - }); - $this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), function(StainedHardenedGlassPane $block) : Writer{ - return Writer::create(Ids::HARD_STAINED_GLASS_PANE) - ->writeColor($block->getColor()); - }); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 6bb0c8bf81..ea44e90b4c 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\WallConnectionType; use pocketmine\data\bedrock\block\BlockLegacyMetadata; @@ -236,30 +235,6 @@ final class BlockStateReader{ }; } - /** @throws BlockStateDeserializeException */ - public function readColor() : DyeColor{ - // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow - return match($color = $this->readString(BlockStateNames::COLOR)){ - StringValues::COLOR_BLACK => DyeColor::BLACK, - StringValues::COLOR_BLUE => DyeColor::BLUE, - StringValues::COLOR_BROWN => DyeColor::BROWN, - StringValues::COLOR_CYAN => DyeColor::CYAN, - StringValues::COLOR_GRAY => DyeColor::GRAY, - StringValues::COLOR_GREEN => DyeColor::GREEN, - StringValues::COLOR_LIGHT_BLUE => DyeColor::LIGHT_BLUE, - StringValues::COLOR_LIME => DyeColor::LIME, - StringValues::COLOR_MAGENTA => DyeColor::MAGENTA, - StringValues::COLOR_ORANGE => DyeColor::ORANGE, - StringValues::COLOR_PINK => DyeColor::PINK, - StringValues::COLOR_PURPLE => DyeColor::PURPLE, - StringValues::COLOR_RED => DyeColor::RED, - StringValues::COLOR_SILVER => DyeColor::LIGHT_GRAY, - StringValues::COLOR_WHITE => DyeColor::WHITE, - StringValues::COLOR_YELLOW => DyeColor::YELLOW, - default => throw $this->badValueException(BlockStateNames::COLOR, $color), - }; - } - /** @throws BlockStateDeserializeException */ public function readCoralFacing() : int{ return $this->parseFacingValue($this->readInt(BlockStateNames::CORAL_DIRECTION), [ diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 18e9b3e322..2941263675 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -185,6 +185,48 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } private function registerFlatColorBlockDeserializers() : void{ + foreach([ + Ids::HARD_BLACK_STAINED_GLASS => DyeColor::BLACK, + Ids::HARD_BLUE_STAINED_GLASS => DyeColor::BLUE, + Ids::HARD_BROWN_STAINED_GLASS => DyeColor::BROWN, + Ids::HARD_CYAN_STAINED_GLASS => DyeColor::CYAN, + Ids::HARD_GRAY_STAINED_GLASS => DyeColor::GRAY, + Ids::HARD_GREEN_STAINED_GLASS => DyeColor::GREEN, + Ids::HARD_LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE, + Ids::HARD_LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY, + Ids::HARD_LIME_STAINED_GLASS => DyeColor::LIME, + Ids::HARD_MAGENTA_STAINED_GLASS => DyeColor::MAGENTA, + Ids::HARD_ORANGE_STAINED_GLASS => DyeColor::ORANGE, + Ids::HARD_PINK_STAINED_GLASS => DyeColor::PINK, + Ids::HARD_PURPLE_STAINED_GLASS => DyeColor::PURPLE, + Ids::HARD_RED_STAINED_GLASS => DyeColor::RED, + Ids::HARD_WHITE_STAINED_GLASS => DyeColor::WHITE, + Ids::HARD_YELLOW_STAINED_GLASS => DyeColor::YELLOW, + ] as $id => $color){ + $this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS()->setColor($color)); + } + + foreach([ + Ids::HARD_BLACK_STAINED_GLASS_PANE => DyeColor::BLACK, + Ids::HARD_BLUE_STAINED_GLASS_PANE => DyeColor::BLUE, + Ids::HARD_BROWN_STAINED_GLASS_PANE => DyeColor::BROWN, + Ids::HARD_CYAN_STAINED_GLASS_PANE => DyeColor::CYAN, + Ids::HARD_GRAY_STAINED_GLASS_PANE => DyeColor::GRAY, + Ids::HARD_GREEN_STAINED_GLASS_PANE => DyeColor::GREEN, + Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE, + Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY, + Ids::HARD_LIME_STAINED_GLASS_PANE => DyeColor::LIME, + Ids::HARD_MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA, + Ids::HARD_ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE, + Ids::HARD_PINK_STAINED_GLASS_PANE => DyeColor::PINK, + Ids::HARD_PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE, + Ids::HARD_RED_STAINED_GLASS_PANE => DyeColor::RED, + Ids::HARD_WHITE_STAINED_GLASS_PANE => DyeColor::WHITE, + Ids::HARD_YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW, + ] as $id => $color){ + $this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)); + } + foreach([ Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK, Ids::BLUE_GLAZED_TERRACOTTA => DyeColor::BLUE, @@ -1159,14 +1201,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); - $this->map(Ids::HARD_STAINED_GLASS, function(Reader $in) : Block{ - return Blocks::STAINED_HARDENED_GLASS() - ->setColor($in->readColor()); - }); - $this->map(Ids::HARD_STAINED_GLASS_PANE, function(Reader $in) : Block{ - return Blocks::STAINED_HARDENED_GLASS_PANE() - ->setColor($in->readColor()); - }); $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index f5f34fff65..69efa4d0fd 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; -use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\WallConnectionType; use pocketmine\block\utils\WoodType; @@ -193,29 +192,6 @@ final class BlockStateWriter{ }); } - /** @return $this */ - public function writeColor(DyeColor $color) : self{ - $this->writeString(BlockStateNames::COLOR, match($color){ - DyeColor::BLACK => StringValues::COLOR_BLACK, - DyeColor::BLUE => StringValues::COLOR_BLUE, - DyeColor::BROWN => StringValues::COLOR_BROWN, - DyeColor::CYAN => StringValues::COLOR_CYAN, - DyeColor::GRAY => StringValues::COLOR_GRAY, - DyeColor::GREEN => StringValues::COLOR_GREEN, - DyeColor::LIGHT_BLUE => StringValues::COLOR_LIGHT_BLUE, - DyeColor::LIGHT_GRAY => StringValues::COLOR_SILVER, - DyeColor::LIME => StringValues::COLOR_LIME, - DyeColor::MAGENTA => StringValues::COLOR_MAGENTA, - DyeColor::ORANGE => StringValues::COLOR_ORANGE, - DyeColor::PINK => StringValues::COLOR_PINK, - DyeColor::PURPLE => StringValues::COLOR_PURPLE, - DyeColor::RED => StringValues::COLOR_RED, - DyeColor::WHITE => StringValues::COLOR_WHITE, - DyeColor::YELLOW => StringValues::COLOR_YELLOW, - }); - return $this; - } - /** @return $this */ public function writeCoralFacing(int $value) : self{ $this->writeInt(BlockStateNames::CORAL_DIRECTION, match($value){ diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 0c6dadc462..bbc295b725 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -348,7 +348,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Items::RIB_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::ROTTEN_FLESH, Items::ROTTEN_FLESH()); $this->map1to1Item(Ids::SALMON, Items::RAW_SALMON()); - $this->map1to1Item(Ids::SCUTE, Items::SCUTE()); + $this->map1to1Item(Ids::TURTLE_SCUTE, Items::SCUTE()); $this->map1to1Item(Ids::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE()); $this->map1to1Item(Ids::SHEARS, Items::SHEARS()); diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index c1534a0f0e..3f01ff1a88 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -38,6 +38,8 @@ final class ItemTypeNames{ public const ANGLER_POTTERY_SHERD = "minecraft:angler_pottery_sherd"; public const APPLE = "minecraft:apple"; public const ARCHER_POTTERY_SHERD = "minecraft:archer_pottery_sherd"; + public const ARMADILLO_SCUTE = "minecraft:armadillo_scute"; + public const ARMADILLO_SPAWN_EGG = "minecraft:armadillo_spawn_egg"; public const ARMOR_STAND = "minecraft:armor_stand"; public const ARMS_UP_POTTERY_SHERD = "minecraft:arms_up_pottery_sherd"; public const ARROW = "minecraft:arrow"; @@ -79,6 +81,7 @@ final class ItemTypeNames{ public const BOW = "minecraft:bow"; public const BOWL = "minecraft:bowl"; public const BREAD = "minecraft:bread"; + public const BREEZE_SPAWN_EGG = "minecraft:breeze_spawn_egg"; public const BREWER_POTTERY_SHERD = "minecraft:brewer_pottery_sherd"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK = "minecraft:brick"; @@ -238,6 +241,8 @@ final class ItemTypeNames{ public const GREEN_DYE = "minecraft:green_dye"; public const GUARDIAN_SPAWN_EGG = "minecraft:guardian_spawn_egg"; public const GUNPOWDER = "minecraft:gunpowder"; + public const HARD_STAINED_GLASS = "minecraft:hard_stained_glass"; + public const HARD_STAINED_GLASS_PANE = "minecraft:hard_stained_glass_pane"; public const HEART_OF_THE_SEA = "minecraft:heart_of_the_sea"; public const HEART_POTTERY_SHERD = "minecraft:heart_pottery_sherd"; public const HEARTBREAK_POTTERY_SHERD = "minecraft:heartbreak_pottery_sherd"; @@ -404,7 +409,6 @@ final class ItemTypeNames{ public const SALMON = "minecraft:salmon"; public const SALMON_BUCKET = "minecraft:salmon_bucket"; public const SALMON_SPAWN_EGG = "minecraft:salmon_spawn_egg"; - public const SCUTE = "minecraft:scute"; public const SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:sentry_armor_trim_smithing_template"; public const SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:shaper_armor_trim_smithing_template"; public const SHEAF_POTTERY_SHERD = "minecraft:sheaf_pottery_sherd"; @@ -466,11 +470,13 @@ final class ItemTypeNames{ public const TORCHFLOWER_SEEDS = "minecraft:torchflower_seeds"; public const TOTEM_OF_UNDYING = "minecraft:totem_of_undying"; public const TRADER_LLAMA_SPAWN_EGG = "minecraft:trader_llama_spawn_egg"; + public const TRIAL_KEY = "minecraft:trial_key"; public const TRIDENT = "minecraft:trident"; public const TROPICAL_FISH = "minecraft:tropical_fish"; public const TROPICAL_FISH_BUCKET = "minecraft:tropical_fish_bucket"; public const TROPICAL_FISH_SPAWN_EGG = "minecraft:tropical_fish_spawn_egg"; public const TURTLE_HELMET = "minecraft:turtle_helmet"; + public const TURTLE_SCUTE = "minecraft:turtle_scute"; public const TURTLE_SPAWN_EGG = "minecraft:turtle_spawn_egg"; public const VEX_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:vex_armor_trim_smithing_template"; public const VEX_SPAWN_EGG = "minecraft:vex_spawn_egg"; @@ -497,6 +503,7 @@ final class ItemTypeNames{ public const WITCH_SPAWN_EGG = "minecraft:witch_spawn_egg"; public const WITHER_SKELETON_SPAWN_EGG = "minecraft:wither_skeleton_spawn_egg"; public const WITHER_SPAWN_EGG = "minecraft:wither_spawn_egg"; + public const WOLF_ARMOR = "minecraft:wolf_armor"; public const WOLF_SPAWN_EGG = "minecraft:wolf_spawn_egg"; public const WOODEN_AXE = "minecraft:wooden_axe"; public const WOODEN_DOOR = "minecraft:wooden_door"; diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 87a4553c3e..ac07d5321a 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -30,6 +30,7 @@ use pocketmine\network\mcpe\protocol\LevelChunkPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\ChunkPosition; +use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\network\mcpe\serializer\ChunkSerializer; use pocketmine\scheduler\AsyncTask; use pocketmine\thread\NonThreadSafeValue; @@ -43,16 +44,22 @@ class ChunkRequestTask extends AsyncTask{ protected string $chunk; protected int $chunkX; protected int $chunkZ; + /** @phpstan-var DimensionIds::* */ + private int $dimensionId; /** @phpstan-var NonThreadSafeValue */ protected NonThreadSafeValue $compressor; private string $tiles; - public function __construct(int $chunkX, int $chunkZ, Chunk $chunk, CompressBatchPromise $promise, Compressor $compressor){ + /** + * @phpstan-param DimensionIds::* $dimensionId + */ + public function __construct(int $chunkX, int $chunkZ, int $dimensionId, Chunk $chunk, CompressBatchPromise $promise, Compressor $compressor){ $this->compressor = new NonThreadSafeValue($compressor); $this->chunk = FastChunkSerializer::serializeTerrain($chunk); $this->chunkX = $chunkX; $this->chunkZ = $chunkZ; + $this->dimensionId = $dimensionId; $this->tiles = ChunkSerializer::serializeTiles($chunk); $this->storeLocal(self::TLS_KEY_PROMISE, $promise); @@ -60,14 +67,18 @@ class ChunkRequestTask extends AsyncTask{ public function onRun() : void{ $chunk = FastChunkSerializer::deserializeTerrain($this->chunk); - $subCount = ChunkSerializer::getSubChunkCount($chunk); + $dimensionId = $this->dimensionId; + + $subCount = ChunkSerializer::getSubChunkCount($chunk, $dimensionId); $converter = TypeConverter::getInstance(); $encoderContext = new PacketSerializerContext($converter->getItemTypeDictionary()); - $payload = ChunkSerializer::serializeFullChunk($chunk, $converter->getBlockTranslator(), $encoderContext, $this->tiles); + $payload = ChunkSerializer::serializeFullChunk($chunk, $dimensionId, $converter->getBlockTranslator(), $encoderContext, $this->tiles); $stream = new BinaryStream(); - PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload)]); - $this->setResult($this->compressor->deserialize()->compress($stream->getBuffer())); + PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $dimensionId, $subCount, false, null, $payload)]); + + $compressor = $this->compressor->deserialize(); + $this->setResult(chr($compressor->getNetworkId()) . $compressor->compress($stream->getBuffer())); } public function onCompletion() : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 1a4c85255e..8ac4db98fc 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -86,6 +86,7 @@ use pocketmine\network\mcpe\protocol\types\command\CommandEnum; use pocketmine\network\mcpe\protocol\types\command\CommandOverload; use pocketmine\network\mcpe\protocol\types\command\CommandParameter; use pocketmine\network\mcpe\protocol\types\command\CommandPermissions; +use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; @@ -119,6 +120,7 @@ use function implode; use function in_array; use function is_string; use function json_encode; +use function ord; use function random_bytes; use function str_split; use function strcasecmp; @@ -355,15 +357,27 @@ class NetworkSession{ } } + if(strlen($payload) < 1){ + throw new PacketHandlingException("No bytes in payload"); + } + if($this->enableCompression){ Timings::$playerNetworkReceiveDecompress->startTiming(); - try{ - $decompressed = $this->compressor->decompress($payload); - }catch(DecompressionException $e){ - $this->logger->debug("Failed to decompress packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); - }finally{ - Timings::$playerNetworkReceiveDecompress->stopTiming(); + $compressionType = ord($payload[0]); + $compressed = substr($payload, 1); + if($compressionType === CompressionAlgorithm::NONE){ + $decompressed = $compressed; + }elseif($compressionType === $this->compressor->getNetworkId()){ + try{ + $decompressed = $this->compressor->decompress($compressed); + }catch(DecompressionException $e){ + $this->logger->debug("Failed to decompress packet: " . base64_encode($compressed)); + throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); + }finally{ + Timings::$playerNetworkReceiveDecompress->stopTiming(); + } + }else{ + throw new PacketHandlingException("Packet compressed with unexpected compression type $compressionType"); } }else{ $decompressed = $payload; diff --git a/src/network/mcpe/cache/ChunkCache.php b/src/network/mcpe/cache/ChunkCache.php index 71010a041c..6d80200857 100644 --- a/src/network/mcpe/cache/ChunkCache.php +++ b/src/network/mcpe/cache/ChunkCache.php @@ -27,6 +27,7 @@ use pocketmine\math\Vector3; use pocketmine\network\mcpe\ChunkRequestTask; use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\Compressor; +use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\world\ChunkListener; use pocketmine\world\ChunkListenerNoOpTrait; use pocketmine\world\format\Chunk; @@ -116,6 +117,7 @@ class ChunkCache implements ChunkListener{ new ChunkRequestTask( $chunkX, $chunkZ, + DimensionIds::OVERWORLD, //TODO: not hardcode this $chunk, $this->caches[$chunkHash], $this->compressor diff --git a/src/network/mcpe/compression/CompressBatchTask.php b/src/network/mcpe/compression/CompressBatchTask.php index 96e9051b68..44ccef8b0e 100644 --- a/src/network/mcpe/compression/CompressBatchTask.php +++ b/src/network/mcpe/compression/CompressBatchTask.php @@ -43,7 +43,8 @@ class CompressBatchTask extends AsyncTask{ } public function onRun() : void{ - $this->setResult($this->compressor->deserialize()->compress($this->data)); + $compressor = $this->compressor->deserialize(); + $this->setResult(chr($compressor->getNetworkId()) . $compressor->compress($this->data)); } public function onCompletion() : void{ diff --git a/src/network/mcpe/compression/Compressor.php b/src/network/mcpe/compression/Compressor.php index a299f4eb08..fbb98e7890 100644 --- a/src/network/mcpe/compression/Compressor.php +++ b/src/network/mcpe/compression/Compressor.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\compression; +use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; + interface Compressor{ /** * @throws DecompressionException @@ -31,6 +33,14 @@ interface Compressor{ public function compress(string $payload) : string; + /** + * Returns the canonical ID of this compressor, used to tell the remote end how to decompress a packet compressed + * with this compressor. + * + * @return CompressionAlgorithm::* + */ + public function getNetworkId() : int; + /** * Returns the minimum size of packet batch that the compressor will attempt to compress. * diff --git a/src/network/mcpe/compression/ZlibCompressor.php b/src/network/mcpe/compression/ZlibCompressor.php index 066ba876a7..a6000e7813 100644 --- a/src/network/mcpe/compression/ZlibCompressor.php +++ b/src/network/mcpe/compression/ZlibCompressor.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\compression; +use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; use pocketmine\utils\SingletonTrait; use pocketmine\utils\Utils; use function function_exists; @@ -75,4 +76,8 @@ final class ZlibCompressor implements Compressor{ libdeflate_deflate_compress($payload, $level) : Utils::assumeNotFalse(zlib_encode($payload, ZLIB_ENCODING_RAW, $level), "ZLIB compression failed"); } + + public function getNetworkId() : int{ + return CompressionAlgorithm::ZLIB; + } } diff --git a/src/network/mcpe/handler/SessionStartPacketHandler.php b/src/network/mcpe/handler/SessionStartPacketHandler.php index dd7ae47a85..8163574dbd 100644 --- a/src/network/mcpe/handler/SessionStartPacketHandler.php +++ b/src/network/mcpe/handler/SessionStartPacketHandler.php @@ -27,7 +27,6 @@ use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\NetworkSettingsPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\RequestNetworkSettingsPacket; -use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; final class SessionStartPacketHandler extends PacketHandler{ @@ -50,7 +49,7 @@ final class SessionStartPacketHandler extends PacketHandler{ //TODO: we're filling in the defaults to get pre-1.19.30 behaviour back for now, but we should explore the new options in the future $this->session->sendDataPacket(NetworkSettingsPacket::create( NetworkSettingsPacket::COMPRESS_EVERYTHING, - CompressionAlgorithm::ZLIB, + $this->session->getCompressor()->getNetworkId(), false, 0, 0 diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index afda6b7bbc..bd2b0736c1 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -31,6 +31,7 @@ use pocketmine\network\mcpe\convert\BlockTranslator; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; +use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\utils\Binary; use pocketmine\utils\BinaryStream; use pocketmine\world\format\Chunk; @@ -43,12 +44,34 @@ final class ChunkSerializer{ //NOOP } + /** + * Returns the min/max subchunk index expected in the protocol. + * This has no relation to the world height supported by PM. + * + * @phpstan-param DimensionIds::* $dimensionId + * @return int[] + * @phpstan-return array{int, int} + */ + public static function getDimensionChunkBounds(int $dimensionId) : array{ + return match($dimensionId){ + DimensionIds::OVERWORLD => [-4, 19], + DimensionIds::NETHER => [0, 7], + DimensionIds::THE_END => [0, 15], + default => throw new \InvalidArgumentException("Unknown dimension ID $dimensionId"), + }; + } + /** * Returns the number of subchunks that will be sent from the given chunk. * Chunks are sent in a stack, so every chunk below the top non-empty one must be sent. + * + * @phpstan-param DimensionIds::* $dimensionId */ - public static function getSubChunkCount(Chunk $chunk) : int{ - for($y = Chunk::MAX_SUBCHUNK_INDEX, $count = count($chunk->getSubChunks()); $y >= Chunk::MIN_SUBCHUNK_INDEX; --$y, --$count){ + public static function getSubChunkCount(Chunk $chunk, int $dimensionId) : int{ + //if the protocol world bounds ever exceed the PM supported bounds again in the future, we might need to + //polyfill some stuff here + [$minSubChunkIndex, $maxSubChunkIndex] = self::getDimensionChunkBounds($dimensionId); + for($y = $maxSubChunkIndex, $count = count($chunk->getSubChunks()); $y >= $minSubChunkIndex; --$y, --$count){ if($chunk->getSubChunk($y)->isEmptyFast()){ continue; } @@ -58,18 +81,23 @@ final class ChunkSerializer{ return 0; } - public static function serializeFullChunk(Chunk $chunk, BlockTranslator $blockTranslator, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ + /** + * @phpstan-param DimensionIds::* $dimensionId + */ + public static function serializeFullChunk(Chunk $chunk, int $dimensionId, BlockTranslator $blockTranslator, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ $stream = PacketSerializer::encoder($encoderContext); - $subChunkCount = self::getSubChunkCount($chunk); + $subChunkCount = self::getSubChunkCount($chunk, $dimensionId); $writtenCount = 0; - for($y = Chunk::MIN_SUBCHUNK_INDEX; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ + + [$minSubChunkIndex, $maxSubChunkIndex] = self::getDimensionChunkBounds($dimensionId); + for($y = $minSubChunkIndex; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ self::serializeSubChunk($chunk->getSubChunk($y), $blockTranslator, $stream, false); } $biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance(); //all biomes must always be written :( - for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ + for($y = $minSubChunkIndex; $y <= $maxSubChunkIndex; ++$y){ self::serializeBiomePalette($chunk->getSubChunk($y)->getBiomeArray(), $biomeIdMap, $stream); } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index cb5468a525..bf86825477 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 630; + public const CURRENT_STORAGE_NETWORK_VERSION = 649; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 50, //patch - 3, //revision + 60, //patch + 4, //revision 0 //is beta ]; From 8c7a4d720a8ef23d5e3d570d75476454cf51304e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:46:11 +0000 Subject: [PATCH 1606/1858] Fixed inconsistent global namespace reference --- src/utils/MainLogger.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index 402a68edbb..ffd56b041a 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\utils; -use LogLevel; use pmmp\thread\Thread as NativeThread; use pocketmine\thread\log\AttachableThreadSafeLogger; use pocketmine\thread\log\ThreadSafeLoggerAttachment; @@ -132,28 +131,28 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ public function log($level, $message){ switch($level){ - case LogLevel::EMERGENCY: + case \LogLevel::EMERGENCY: $this->emergency($message); break; - case LogLevel::ALERT: + case \LogLevel::ALERT: $this->alert($message); break; - case LogLevel::CRITICAL: + case \LogLevel::CRITICAL: $this->critical($message); break; - case LogLevel::ERROR: + case \LogLevel::ERROR: $this->error($message); break; - case LogLevel::WARNING: + case \LogLevel::WARNING: $this->warning($message); break; - case LogLevel::NOTICE: + case \LogLevel::NOTICE: $this->notice($message); break; - case LogLevel::INFO: + case \LogLevel::INFO: $this->info($message); break; - case LogLevel::DEBUG: + case \LogLevel::DEBUG: $this->debug($message); break; } From f54ed8362dc93c015140a49dd0a54d14115df601 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:49:05 +0000 Subject: [PATCH 1607/1858] tools/convert-world: add a namespace not sure why this was left in the global namespace to its own devices --- tools/convert-world.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tools/convert-world.php b/tools/convert-world.php index 75483c6af3..d4d15ce57b 100644 --- a/tools/convert-world.php +++ b/tools/convert-world.php @@ -21,10 +21,29 @@ declare(strict_types=1); +namespace pocketmine\tools\convert_world; + use pocketmine\world\format\io\FormatConverter; use pocketmine\world\format\io\WorldProviderManager; use pocketmine\world\format\io\WorldProviderManagerEntry; use pocketmine\world\format\io\WritableWorldProviderManagerEntry; +use function array_filter; +use function array_key_exists; +use function array_keys; +use function array_map; +use function array_shift; +use function count; +use function dirname; +use function fwrite; +use function getopt; +use function implode; +use function is_dir; +use function is_string; +use function is_writable; +use function mkdir; +use function realpath; +use const PHP_EOL; +use const STDERR; require_once dirname(__DIR__) . '/vendor/autoload.php'; @@ -76,5 +95,5 @@ if(count($oldProviderClasses) > 1){ $oldProviderClass = array_shift($oldProviderClasses); $oldProvider = $oldProviderClass->fromPath($inputPath, new \PrefixedLogger(\GlobalLogger::get(), "Old World Provider")); -$converter = new FormatConverter($oldProvider, $writableFormats[$args["format"]], $backupPath, GlobalLogger::get()); +$converter = new FormatConverter($oldProvider, $writableFormats[$args["format"]], $backupPath, \GlobalLogger::get()); $converter->execute(); From fe06bfcda02702cf53411fdbe6f42dc6b4759095 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:50:37 +0000 Subject: [PATCH 1608/1858] Import alias cleanup courtesy of newest php-cs-fixer --- build/generate-build-info-json.php | 11 +- src/Server.php | 6 +- src/block/VanillaBlocks.php | 4 +- src/block/WoodLikeBlockIdHelper.php | 12 +- .../convert/BlockStateSerializerHelper.php | 104 +++++++++--------- .../block/regenerate_consistency_check.php | 4 +- 6 files changed, 72 insertions(+), 69 deletions(-) diff --git a/build/generate-build-info-json.php b/build/generate-build-info-json.php index b29d1c7285..a2e7489f3a 100644 --- a/build/generate-build-info-json.php +++ b/build/generate-build-info-json.php @@ -21,6 +21,9 @@ declare(strict_types=1); +use pocketmine\network\mcpe\protocol\ProtocolInfo; +use pocketmine\VersionInfo; + require dirname(__DIR__) . '/vendor/autoload.php'; if(count($argv) !== 7){ @@ -30,12 +33,12 @@ if(count($argv) !== 7){ echo json_encode([ "php_version" => sprintf("%d.%d", PHP_MAJOR_VERSION, PHP_MINOR_VERSION), //deprecated - "base_version" => \pocketmine\VersionInfo::BASE_VERSION, + "base_version" => VersionInfo::BASE_VERSION, "build" => (int) $argv[4], - "is_dev" => \pocketmine\VersionInfo::IS_DEVELOPMENT_BUILD, - "channel" => \pocketmine\VersionInfo::BUILD_CHANNEL, + "is_dev" => VersionInfo::IS_DEVELOPMENT_BUILD, + "channel" => VersionInfo::BUILD_CHANNEL, "git_commit" => $argv[1], - "mcpe_version" => \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK, + "mcpe_version" => ProtocolInfo::MINECRAFT_VERSION_NETWORK, "date" => time(), //TODO: maybe we should embed this in VersionInfo? "details_url" => "https://github.com/$argv[3]/releases/tag/$argv[2]", "download_url" => "https://github.com/$argv[3]/releases/download/$argv[2]/PocketMine-MP.phar", diff --git a/src/Server.php b/src/Server.php index 3f12f7669a..73bfdb85a2 100644 --- a/src/Server.php +++ b/src/Server.php @@ -739,7 +739,7 @@ class Server{ * @return string[][] */ public function getCommandAliases() : array{ - $section = $this->configGroup->getProperty(YmlServerProperties::ALIASES); + $section = $this->configGroup->getProperty(Yml::ALIASES); $result = []; if(is_array($section)){ foreach($section as $key => $value){ @@ -863,7 +863,7 @@ class Server{ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error1(VersionInfo::NAME))); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error2())); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error3())); - $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error4(YmlServerProperties::SETTINGS_ENABLE_DEV_BUILDS))); + $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error4(Yml::SETTINGS_ENABLE_DEV_BUILDS))); $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_devBuild_error5("https://github.com/pmmp/PocketMine-MP/releases"))); $this->forceShutdownExit(); @@ -1476,7 +1476,7 @@ class Server{ } if(isset($this->network)){ - $this->network->getSessionManager()->close($this->configGroup->getPropertyString(YmlServerProperties::SETTINGS_SHUTDOWN_MESSAGE, "Server closed")); + $this->network->getSessionManager()->close($this->configGroup->getPropertyString(Yml::SETTINGS_SHUTDOWN_MESSAGE, "Server closed")); } if(isset($this->worldManager)){ diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 67a77c183b..9c0e7d3b7c 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -788,7 +788,7 @@ final class VanillaBlocks{ } protected static function setup() : void{ - $railBreakInfo = new Info(new BlockBreakInfo(0.7)); + $railBreakInfo = new Info(new BreakInfo(0.7)); self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); self::register("air", new Air(new BID(Ids::AIR), "Air", new Info(BreakInfo::indestructible(-1.0)))); self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); @@ -1638,7 +1638,7 @@ final class VanillaBlocks{ self::register("cave_vines", new CaveVines(new BID(Ids::CAVE_VINES), "Cave Vines", new Info(BreakInfo::instant()))); - self::register("small_dripleaf", new SmallDripleaf(new BID(Ids::SMALL_DRIPLEAF), "Small Dripleaf", new Info(BreakInfo::instant(BlockToolType::SHEARS, toolHarvestLevel: 1)))); + self::register("small_dripleaf", new SmallDripleaf(new BID(Ids::SMALL_DRIPLEAF), "Small Dripleaf", new Info(BreakInfo::instant(ToolType::SHEARS, toolHarvestLevel: 1)))); self::register("big_dripleaf_head", new BigDripleafHead(new BID(Ids::BIG_DRIPLEAF_HEAD), "Big Dripleaf", new Info(BreakInfo::instant()))); self::register("big_dripleaf_stem", new BigDripleafStem(new BID(Ids::BIG_DRIPLEAF_STEM), "Big Dripleaf Stem", new Info(BreakInfo::instant()))); } diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php index 5f668608a8..88fdff3a6e 100644 --- a/src/block/WoodLikeBlockIdHelper.php +++ b/src/block/WoodLikeBlockIdHelper.php @@ -171,7 +171,7 @@ final class WoodLikeBlockIdHelper{ }; } - public static function getTrapdoorIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getTrapdoorIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_TRAPDOOR, WoodType::SPRUCE => Ids::SPRUCE_TRAPDOOR, @@ -186,7 +186,7 @@ final class WoodLikeBlockIdHelper{ }); } - public static function getButtonIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getButtonIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_BUTTON, WoodType::SPRUCE => Ids::SPRUCE_BUTTON, @@ -201,7 +201,7 @@ final class WoodLikeBlockIdHelper{ }); } - public static function getPressurePlateIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getPressurePlateIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_PRESSURE_PLATE, WoodType::SPRUCE => Ids::SPRUCE_PRESSURE_PLATE, @@ -216,7 +216,7 @@ final class WoodLikeBlockIdHelper{ }); } - public static function getDoorIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getDoorIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_DOOR, WoodType::SPRUCE => Ids::SPRUCE_DOOR, @@ -231,7 +231,7 @@ final class WoodLikeBlockIdHelper{ }); } - public static function getFenceGateIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getFenceGateIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_FENCE_GATE, WoodType::SPRUCE => Ids::SPRUCE_FENCE_GATE, @@ -246,7 +246,7 @@ final class WoodLikeBlockIdHelper{ }); } - public static function getStairsIdentifier(WoodType $treeType) : BlockIdentifier{ + public static function getStairsIdentifier(WoodType $treeType) : BID{ return new BID(match($treeType){ WoodType::OAK => Ids::OAK_STAIRS, WoodType::SPRUCE => Ids::SPRUCE_STAIRS, diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 2b7e89b57e..2b91234381 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -57,42 +57,42 @@ use pocketmine\math\Facing; final class BlockStateSerializerHelper{ - public static function encodeAllSidedLog(Wood $block) : BlockStateWriter{ - return BlockStateWriter::create(Ids::WOOD) + public static function encodeAllSidedLog(Wood $block) : Writer{ + return Writer::create(Ids::WOOD) ->writeBool(BlockStateNames::STRIPPED_BIT, $block->isStripped()) ->writePillarAxis($block->getAxis()) ->writeLegacyWoodType($block->getWoodType()); } - public static function encodeButton(Button $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeButton(Button $block, Writer $out) : Writer{ return $out ->writeFacingDirection($block->getFacing()) ->writeBool(BlockStateNames::BUTTON_PRESSED_BIT, $block->isPressed()); } - public static function encodeCandle(Candle $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeCandle(Candle $block, Writer $out) : Writer{ return $out ->writeBool(StateNames::LIT, $block->isLit()) ->writeInt(StateNames::CANDLES, $block->getCount() - 1); } - public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, Writer $out) : Writer{ return $out ->writeString(BlockStateNames::CHEMISTRY_TABLE_TYPE, $chemistryTableType) ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); } - public static function encodeCrops(Crops $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeCrops(Crops $block, Writer $out) : Writer{ return $out->writeInt(BlockStateNames::GROWTH, $block->getAge()); } - public static function encodeColoredTorch(Torch $block, bool $highBit, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeColoredTorch(Torch $block, bool $highBit, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::COLOR_BIT, $highBit) ->writeTorchFacing($block->getFacing()); } - public static function encodeCauldron(string $liquid, int $fillLevel) : BlockStateWriter{ + public static function encodeCauldron(string $liquid, int $fillLevel) : Writer{ return Writer::create(Ids::CAULDRON) ->writeString(BlockStateNames::CAULDRON_LIQUID, $liquid) ->writeInt(BlockStateNames::FILL_LEVEL, $fillLevel); @@ -107,7 +107,7 @@ final class BlockStateSerializerHelper{ }; } - public static function encodeDoor(Door $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeDoor(Door $block, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) ->writeLegacyHorizontalFacing(Facing::rotateY($block->getFacing(), true)) @@ -115,111 +115,111 @@ final class BlockStateSerializerHelper{ ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); } - public static function encodeDoublePlant(DoublePlant $block, string $doublePlantType, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeDoublePlant(DoublePlant $block, string $doublePlantType, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) ->writeString(BlockStateNames::DOUBLE_PLANT_TYPE, $doublePlantType); } - public static function encodeFenceGate(FenceGate $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeFenceGate(FenceGate $block, Writer $out) : Writer{ return $out ->writeLegacyHorizontalFacing($block->getFacing()) ->writeBool(BlockStateNames::IN_WALL_BIT, $block->isInWall()) ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); } - public static function encodeFloorSign(FloorSign $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeFloorSign(FloorSign $block, Writer $out) : Writer{ return $out ->writeInt(BlockStateNames::GROUND_SIGN_DIRECTION, $block->getRotation()); } - public static function encodeFurnace(Furnace $block, string $unlitId, string $litId) : BlockStateWriter{ - return BlockStateWriter::create($block->isLit() ? $litId : $unlitId) + public static function encodeFurnace(Furnace $block, string $unlitId, string $litId) : Writer{ + return Writer::create($block->isLit() ? $litId : $unlitId) ->writeCardinalHorizontalFacing($block->getFacing()); } - public static function encodeItemFrame(ItemFrame $block, string $id) : BlockStateWriter{ + public static function encodeItemFrame(ItemFrame $block, string $id) : Writer{ return Writer::create($id) ->writeBool(StateNames::ITEM_FRAME_MAP_BIT, $block->hasMap()) ->writeBool(StateNames::ITEM_FRAME_PHOTO_BIT, false) ->writeFacingDirection($block->getFacing()); } - public static function encodeLeaves(Leaves $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeLeaves(Leaves $block, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::PERSISTENT_BIT, $block->isNoDecay()) ->writeBool(BlockStateNames::UPDATE_BIT, $block->isCheckDecay()); } - public static function encodeLeaves1(Leaves $block, string $type) : BlockStateWriter{ - return self::encodeLeaves($block, BlockStateWriter::create(Ids::LEAVES) + public static function encodeLeaves1(Leaves $block, string $type) : Writer{ + return self::encodeLeaves($block, Writer::create(Ids::LEAVES) ->writeString(BlockStateNames::OLD_LEAF_TYPE, $type)); } - public static function encodeLeaves2(Leaves $block, string $type) : BlockStateWriter{ - return self::encodeLeaves($block, BlockStateWriter::create(Ids::LEAVES2) + public static function encodeLeaves2(Leaves $block, string $type) : Writer{ + return self::encodeLeaves($block, Writer::create(Ids::LEAVES2) ->writeString(BlockStateNames::NEW_LEAF_TYPE, $type)); } - public static function encodeLiquid(Liquid $block, string $stillId, string $flowingId) : BlockStateWriter{ - return BlockStateWriter::create($block->isStill() ? $stillId : $flowingId) + public static function encodeLiquid(Liquid $block, string $stillId, string $flowingId) : Writer{ + return Writer::create($block->isStill() ? $stillId : $flowingId) ->writeInt(BlockStateNames::LIQUID_DEPTH, $block->getDecay() | ($block->isFalling() ? 0x8 : 0)); } - public static function encodeLog(Wood $block, string $unstrippedId, string $strippedId) : BlockStateWriter{ + public static function encodeLog(Wood $block, string $unstrippedId, string $strippedId) : Writer{ $out = $block->isStripped() ? - BlockStateWriter::create($strippedId) : - BlockStateWriter::create($unstrippedId); + Writer::create($strippedId) : + Writer::create($unstrippedId); return $out ->writePillarAxis($block->getAxis()); } - public static function encodeMushroomBlock(RedMushroomBlock $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeMushroomBlock(RedMushroomBlock $block, Writer $out) : Writer{ return $out ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, MushroomBlockTypeIdMap::getInstance()->toId($block->getMushroomBlockType())); } - public static function encodeQuartz(string $type, int $axis) : BlockStateWriter{ - return BlockStateWriter::create(Ids::QUARTZ_BLOCK) + public static function encodeQuartz(string $type, int $axis) : Writer{ + return Writer::create(Ids::QUARTZ_BLOCK) ->writeString(BlockStateNames::CHISEL_TYPE, $type) ->writePillarAxis($axis); //this isn't needed for all types, but we have to write it anyway } - public static function encodeRedFlower(string $type) : BlockStateWriter{ - return BlockStateWriter::create(Ids::RED_FLOWER)->writeString(BlockStateNames::FLOWER_TYPE, $type); + public static function encodeRedFlower(string $type) : Writer{ + return Writer::create(Ids::RED_FLOWER)->writeString(BlockStateNames::FLOWER_TYPE, $type); } - public static function encodeSandstone(string $id, string $type) : BlockStateWriter{ - return BlockStateWriter::create($id)->writeString(BlockStateNames::SAND_STONE_TYPE, $type); + public static function encodeSandstone(string $id, string $type) : Writer{ + return Writer::create($id)->writeString(BlockStateNames::SAND_STONE_TYPE, $type); } - public static function encodeSapling(Sapling $block, string $type) : BlockStateWriter{ - return BlockStateWriter::create(Ids::SAPLING) + public static function encodeSapling(Sapling $block, string $type) : Writer{ + return Writer::create(Ids::SAPLING) ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) ->writeString(BlockStateNames::SAPLING_TYPE, $type); } - public static function encodeSimplePressurePlate(SimplePressurePlate $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeSimplePressurePlate(SimplePressurePlate $block, Writer $out) : Writer{ //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? //best to keep this separate from weighted plates anyway... return $out ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->isPressed() ? 15 : 0); } - public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : BlockStateWriter{ + public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : Writer{ $slabType = $block->getSlabType(); - return BlockStateWriter::create($slabType === SlabType::DOUBLE ? $doubleId : $singleId) + return Writer::create($slabType === SlabType::DOUBLE ? $doubleId : $singleId) //this is (intentionally) also written for double slabs (as zero) to maintain bug parity with MCPE ->writeSlabPosition($slabType === SlabType::DOUBLE ? SlabType::BOTTOM : $slabType); } - public static function encodeStairs(Stair $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeStairs(Stair $block, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::UPSIDE_DOWN_BIT, $block->isUpsideDown()) ->writeWeirdoHorizontalFacing($block->getFacing()); } - public static function encodeStem(Stem $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeStem(Stem $block, Writer $out) : Writer{ //In PM, we use Facing::UP to indicate that the stem is not attached to a pumpkin/melon, since this makes the //most intuitive sense (the stem is pointing at the sky). However, Bedrock uses the DOWN state for this, which //is absurd, and I refuse to make our API similarly absurd. @@ -228,40 +228,40 @@ final class BlockStateSerializerHelper{ ->writeFacingWithoutUp($facing === Facing::UP ? Facing::DOWN : $facing); } - public static function encodeStoneBricks(string $type) : BlockStateWriter{ - return BlockStateWriter::create(Ids::STONEBRICK) + public static function encodeStoneBricks(string $type) : Writer{ + return Writer::create(Ids::STONEBRICK) ->writeString(BlockStateNames::STONE_BRICK_TYPE, $type); } - private static function encodeStoneSlab(Slab $block, string $singleId, string $doubleId, string $typeKey, string $typeValue) : BlockStateWriter{ + private static function encodeStoneSlab(Slab $block, string $singleId, string $doubleId, string $typeKey, string $typeValue) : Writer{ return self::encodeSlab($block, $singleId, $doubleId) ->writeString($typeKey, $typeValue); } - public static function encodeStoneSlab1(Slab $block, string $typeValue) : BlockStateWriter{ + public static function encodeStoneSlab1(Slab $block, string $typeValue) : Writer{ return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB, Ids::DOUBLE_STONE_BLOCK_SLAB, BlockStateNames::STONE_SLAB_TYPE, $typeValue); } - public static function encodeStoneSlab2(Slab $block, string $typeValue) : BlockStateWriter{ + public static function encodeStoneSlab2(Slab $block, string $typeValue) : Writer{ return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, BlockStateNames::STONE_SLAB_TYPE_2, $typeValue); } - public static function encodeStoneSlab3(Slab $block, string $typeValue) : BlockStateWriter{ + public static function encodeStoneSlab3(Slab $block, string $typeValue) : Writer{ return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, BlockStateNames::STONE_SLAB_TYPE_3, $typeValue); } - public static function encodeStoneSlab4(Slab $block, string $typeValue) : BlockStateWriter{ + public static function encodeStoneSlab4(Slab $block, string $typeValue) : Writer{ return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, BlockStateNames::STONE_SLAB_TYPE_4, $typeValue); } - public static function encodeTrapdoor(Trapdoor $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeTrapdoor(Trapdoor $block, Writer $out) : Writer{ return $out ->write5MinusHorizontalFacing($block->getFacing()) ->writeBool(BlockStateNames::UPSIDE_DOWN_BIT, $block->isTop()) ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); } - public static function encodeWall(Wall $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeWall(Wall $block, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::WALL_POST_BIT, $block->isPost()) ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_EAST, $block->getConnection(Facing::EAST)) @@ -270,17 +270,17 @@ final class BlockStateSerializerHelper{ ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_WEST, $block->getConnection(Facing::WEST)); } - public static function encodeLegacyWall(Wall $block, string $type) : BlockStateWriter{ - return self::encodeWall($block, BlockStateWriter::create(Ids::COBBLESTONE_WALL)) + public static function encodeLegacyWall(Wall $block, string $type) : Writer{ + return self::encodeWall($block, Writer::create(Ids::COBBLESTONE_WALL)) ->writeString(BlockStateNames::WALL_BLOCK_TYPE, $type); } - public static function encodeWallSign(WallSign $block, BlockStateWriter $out) : BlockStateWriter{ + public static function encodeWallSign(WallSign $block, Writer $out) : Writer{ return $out ->writeHorizontalFacing($block->getFacing()); } - public static function encodeWoodenSlab(Slab $block, string $typeValue) : BlockStateWriter{ + public static function encodeWoodenSlab(Slab $block, string $typeValue) : Writer{ return self::encodeSlab($block, Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB) ->writeString(BlockStateNames::WOOD_TYPE, $typeValue); } diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index ac8a1ad9de..b4b3875c68 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -30,7 +30,7 @@ require dirname(__DIR__, 3) . '/vendor/autoload.php'; /* This script needs to be re-run after any intentional blockfactory change (adding or removing a block state). */ -$factory = new \pocketmine\block\RuntimeBlockStateRegistry(); +$factory = new RuntimeBlockStateRegistry(); $remaps = []; $new = []; foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $index => $block){ @@ -44,7 +44,7 @@ $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}"); + throw new AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } $old = []; /** From 826cbea0bcf8b065c76b4fee246d108b5616237c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:51:27 +0000 Subject: [PATCH 1609/1858] Use newer php-cs-fixer on Actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ecadf8af3c..ebe5d9cb57 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: uses: shivammathur/setup-php@2.29.0 with: php-version: 8.2 - tools: php-cs-fixer:3.38 + tools: php-cs-fixer:3.49 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 4fcb644c51528c70280aab95211ecd584ce36efe Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 12:51:39 +0000 Subject: [PATCH 1610/1858] Added missing imports --- src/network/mcpe/ChunkRequestTask.php | 1 + src/network/mcpe/compression/CompressBatchTask.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index ac07d5321a..05a4f20c10 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -37,6 +37,7 @@ use pocketmine\thread\NonThreadSafeValue; use pocketmine\utils\BinaryStream; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; +use function chr; class ChunkRequestTask extends AsyncTask{ private const TLS_KEY_PROMISE = "promise"; diff --git a/src/network/mcpe/compression/CompressBatchTask.php b/src/network/mcpe/compression/CompressBatchTask.php index 44ccef8b0e..a513cfa86c 100644 --- a/src/network/mcpe/compression/CompressBatchTask.php +++ b/src/network/mcpe/compression/CompressBatchTask.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\compression; use pocketmine\scheduler\AsyncTask; use pocketmine\thread\NonThreadSafeValue; +use function chr; class CompressBatchTask extends AsyncTask{ From ce8fecc6ecd62433d28090f4bae1b5cb3e6b9710 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 13:01:30 +0000 Subject: [PATCH 1611/1858] Release 5.11.0 --- changelogs/5.11.md | 26 ++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.11.md diff --git a/changelogs/5.11.md b/changelogs/5.11.md new file mode 100644 index 0000000000..9ec0a3a6cc --- /dev/null +++ b/changelogs/5.11.md @@ -0,0 +1,26 @@ +# 5.11.0 +Released 7th February 2024. + +**For Minecraft: Bedrock Edition 1.20.60** + +This is a support release for Minecraft: Bedrock Edition 1.20.60. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.60. +- Removed support for earlier versions. + +## Fixes +- Fixed `tools/generate-item-upgrade-schema.php` not correctly handling items whose IDs were changed multiple times. +- Fixed `ServerKiller` not working correctly in some cases (incorrectly handled wake-up conditions). +- `ItemBlock`s of `Air` blocks are now always considered as "null" items regardless of count, and don't occupy inventory slots. + +## Internals +- Restructured GitHub Actions CI workflows to make them easier to maintain (no need to update PHP versions in multiple places anymore). +- GitHub Actions CodeStyle workflow now uses php-cs-fixer 3.49.x. +- Dependabot updates are now processed weekly instead of daily. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 6c7963405e..b300ea5f16 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.10.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.11.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 169d3e0de8bb07f29057af0022b7d026da9830cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 13:01:30 +0000 Subject: [PATCH 1612/1858] 5.11.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b300ea5f16..c87bc899b8 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.11.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.11.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From eaab1a87847422c0fc83843de4db2bc6d2a773cb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Feb 2024 18:58:41 +0000 Subject: [PATCH 1613/1858] ChunkSerializer: fixed count calculation for non-overworld chunks plugins that implement dimensions can't change the number of subchunks used by Chunk, they can only choose to use a subset of them. --- src/network/mcpe/serializer/ChunkSerializer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index bd2b0736c1..e089daef56 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -71,7 +71,7 @@ final class ChunkSerializer{ //if the protocol world bounds ever exceed the PM supported bounds again in the future, we might need to //polyfill some stuff here [$minSubChunkIndex, $maxSubChunkIndex] = self::getDimensionChunkBounds($dimensionId); - for($y = $maxSubChunkIndex, $count = count($chunk->getSubChunks()); $y >= $minSubChunkIndex; --$y, --$count){ + for($y = $maxSubChunkIndex, $count = $maxSubChunkIndex - $minSubChunkIndex + 1; $y >= $minSubChunkIndex; --$y, --$count){ if($chunk->getSubChunk($y)->isEmptyFast()){ continue; } From be102dc95fdd3ea690b63f54dae469155f4605d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:51:31 +0000 Subject: [PATCH 1614/1858] Bump ncipollo/release-action from 1.13.0 to 1.14.0 (#6250) Bumps [ncipollo/release-action](https://github.com/ncipollo/release-action) from 1.13.0 to 1.14.0. - [Release notes](https://github.com/ncipollo/release-action/releases) - [Commits](https://github.com/ncipollo/release-action/compare/v1.13.0...v1.14.0) --- updated-dependencies: - dependency-name: ncipollo/release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/draft-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 77467fad21..9b780b4e3c 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -86,7 +86,7 @@ jobs: ${{ github.workspace }}/build_info.json - name: Create draft release - uses: ncipollo/release-action@v1.13.0 + uses: ncipollo/release-action@v1.14.0 with: artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json commit: ${{ github.sha }} From 53cbc44d707c7b23f57c9b03ac12150bb5a4b74a Mon Sep 17 00:00:00 2001 From: Dylan T Date: Thu, 15 Feb 2024 14:51:34 +0000 Subject: [PATCH 1615/1858] Update PULL_REQUEST_TEMPLATE.md [ci skip] --- .github/PULL_REQUEST_TEMPLATE.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a541dfecd..022518e813 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -34,7 +34,10 @@ Requires translations: ## Tests +I tested this PR by doing the following (tick all that apply): +- [ ] Writing PHPUnit tests (commit these in the `tests/phpunit` folder) +- [ ] Playtesting using a Minecraft client (provide screenshots or a video) +- [ ] Writing a test plugin (provide the code and sample output) +- [ ] Other (provide details) From db894e3a4a5bb9a80b3ac07ac91f58bdaf15176a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Le=C3=B3n?= <58715544+JavierLeon9966@users.noreply.github.com> Date: Fri, 16 Feb 2024 16:52:10 +0000 Subject: [PATCH 1616/1858] Fixed `Utils::cloneObjectArray()` template signature (#6255) --- src/utils/Utils.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/utils/Utils.php b/src/utils/Utils.php index f5ec5f8e4a..46d6732166 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -173,16 +173,17 @@ final class Utils{ } /** - * @phpstan-template T of object + * @phpstan-template TKey of array-key + * @phpstan-template TValue of object * * @param object[] $array - * @phpstan-param T[] $array + * @phpstan-param array $array * * @return object[] - * @phpstan-return T[] + * @phpstan-return array */ public static function cloneObjectArray(array $array) : array{ - /** @phpstan-var \Closure(T) : T $callback */ + /** @phpstan-var \Closure(TValue) : TValue $callback */ $callback = self::cloneCallback(); return array_map($callback, $array); } From 61d0181bfd7122d76109f8ff390675eaf35f3da3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Feb 2024 16:10:22 +0000 Subject: [PATCH 1617/1858] Added script to generate biome IDs this has been sitting in my local workspace for a very long time --- build/generate-biome-ids.php | 133 +++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 build/generate-biome-ids.php diff --git a/build/generate-biome-ids.php b/build/generate-biome-ids.php new file mode 100644 index 0000000000..f36591fe4d --- /dev/null +++ b/build/generate-biome-ids.php @@ -0,0 +1,133 @@ + $map + */ +function generate(array $map, string $outputFile) : void{ + $file = safe_fopen($outputFile, 'wb'); + fwrite($file, HEADER); + fwrite($file, <<<'CLASSHEADER' +namespace pocketmine\data\bedrock; + +final class BiomeIds{ + + private function __construct(){ + //NOOP + } + + +CLASSHEADER +); + $list = $map; + asort($list, SORT_NUMERIC); + $lastId = -1; + foreach(Utils::stringifyKeys($list) as $name => $id){ + if($name === ""){ + continue; + } + if($id !== $lastId + 1){ + fwrite($file, "\n"); + } + $lastId = $id; + fwrite($file, "\tpublic const " . make_const_name($name) . ' = ' . $id . ';' . "\n"); + } + fwrite($file, "}\n"); + fclose($file); +} + +$ids = json_decode(Filesystem::fileGetContents(BedrockDataFiles::BIOME_ID_MAP_JSON), true); +if(!is_array($ids)){ + throw new \RuntimeException("Invalid biome ID map, expected array for root JSON object"); +} +$cleanedIds = []; +foreach($ids as $name => $id){ + if(!is_string($name) || !is_int($id)){ + throw new \RuntimeException("Invalid biome ID map, expected string => int map"); + } + $cleanedIds[$name] = $id; +} +generate($cleanedIds, dirname(__DIR__) . '/src/data/bedrock/BiomeIds.php'); + +echo "Done. Don't forget to run CS fixup after generating code.\n"; From 2616d8c5adacff29de6a8db17c8e13a075ff5ea9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Feb 2024 16:10:46 +0000 Subject: [PATCH 1618/1858] New biome IDs, courtesy of build/generate-biome-ids --- src/data/bedrock/BiomeIds.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/data/bedrock/BiomeIds.php b/src/data/bedrock/BiomeIds.php index ac95552780..1169a51eae 100644 --- a/src/data/bedrock/BiomeIds.php +++ b/src/data/bedrock/BiomeIds.php @@ -111,4 +111,15 @@ final class BiomeIds{ public const CRIMSON_FOREST = 179; public const WARPED_FOREST = 180; public const BASALT_DELTAS = 181; + public const JAGGED_PEAKS = 182; + public const FROZEN_PEAKS = 183; + public const SNOWY_SLOPES = 184; + public const GROVE = 185; + public const MEADOW = 186; + public const LUSH_CAVES = 187; + public const DRIPSTONE_CAVES = 188; + public const STONY_PEAKS = 189; + public const DEEP_DARK = 190; + public const MANGROVE_SWAMP = 191; + public const CHERRY_GROVE = 192; } From 44ce9ca610f4bfcd815a50ba6f7ab30e31d099c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:16:16 +0000 Subject: [PATCH 1619/1858] Bump phpstan/phpstan from 1.10.57 to 1.10.58 (#6260) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.57 to 1.10.58. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.57...1.10.58) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 47e798b164..f99c44dc51 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.57", + "phpstan/phpstan": "1.10.58", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 47aeeaecab..876e52fb75 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d923f5fd75f0d33eb5198268a74a58b4", + "content-hash": "9e781d0fef7796616b0580e7b06cc6d1", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.57", + "version": "1.10.58", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" + "reference": "a23518379ec4defd9e47cbf81019526861623ec2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", + "reference": "a23518379ec4defd9e47cbf81019526861623ec2", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-01-24T11:51:34+00:00" + "time": "2024-02-12T20:02:57+00:00" }, { "name": "phpstan/phpstan-phpunit", From e06b042cd033c25798d25531fac5e66f71b9daf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:16:28 +0000 Subject: [PATCH 1620/1858] Bump pmmp/setup-php-action from 2.0.0 to 3.0.0 (#6259) Bumps [pmmp/setup-php-action](https://github.com/pmmp/setup-php-action) from 2.0.0 to 3.0.0. - [Release notes](https://github.com/pmmp/setup-php-action/releases) - [Commits](https://github.com/pmmp/setup-php-action/compare/2.0.0...3.0.0) --- updated-dependencies: - dependency-name: pmmp/setup-php-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/main-php-matrix.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml index 110f8d0edd..846459748f 100644 --- a/.github/workflows/main-php-matrix.yml +++ b/.github/workflows/main-php-matrix.yml @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 + uses: pmmp/setup-php-action@3.0.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -62,7 +62,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 + uses: pmmp/setup-php-action@3.0.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -96,7 +96,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 + uses: pmmp/setup-php-action@3.0.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -128,7 +128,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@2.0.0 + uses: pmmp/setup-php-action@3.0.0 with: php-version: ${{ inputs.php }} install-path: "./bin" From 4fab518384b1525f2f126643c57f1df6446557df Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Feb 2024 16:53:53 +0000 Subject: [PATCH 1621/1858] PluginManager: do not accept generator functions as event handlers closes #4912 I didn't merge the original PR because this needs to be checked for explicitly registered handlers as well as auto-detected ones from listeners. --- src/plugin/PluginManager.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 301c668547..198e4e893b 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -650,6 +650,11 @@ class PluginManager{ $handlerName = Utils::getNiceClosureName($handler); + $reflect = new \ReflectionFunction($handler); + if($reflect->isGenerator()){ + throw new PluginException("Generator function $handlerName cannot be used as an event handler"); + } + if(!$plugin->isEnabled()){ throw new PluginException("Plugin attempted to register event handler " . $handlerName . "() to event " . $event . " while not enabled"); } From 920341668f92a1043be2f74b44970542d59e12c4 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Mon, 19 Feb 2024 13:46:48 -0500 Subject: [PATCH 1622/1858] Implemented working Name tag (#5209) --- .../ItemSerializerDeserializerRegistrar.php | 1 + src/entity/Entity.php | 8 ++++ src/entity/Living.php | 4 ++ src/item/ItemTypeIds.php | 3 +- src/item/NameTag.php | 40 +++++++++++++++++++ src/item/StringToItemParser.php | 1 + src/item/VanillaItems.php | 2 + src/player/Player.php | 4 ++ 8 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/item/NameTag.php diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index bbc295b725..7a720559ea 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -305,6 +305,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::MUSIC_DISC_WAIT, Items::RECORD_WAIT()); $this->map1to1Item(Ids::MUSIC_DISC_WARD, Items::RECORD_WARD()); $this->map1to1Item(Ids::MUTTON, Items::RAW_MUTTON()); + $this->map1to1Item(Ids::NAME_TAG, Items::NAME_TAG()); $this->map1to1Item(Ids::NAUTILUS_SHELL, Items::NAUTILUS_SHELL()); $this->map1to1Item(Ids::NETHER_STAR, Items::NETHER_STAR()); $this->map1to1Item(Ids::NETHERBRICK, Items::NETHER_BRICK()); diff --git a/src/entity/Entity.php b/src/entity/Entity.php index d26a06d92b..5fc2168d51 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -252,6 +252,14 @@ abstract class Entity{ return $this->alwaysShowNameTag; } + /** + * Returns whether players can rename this entity using a name tag. + * Note that plugins can still name entities using setNameTag(). + */ + public function canBeRenamed() : bool{ + return false; + } + public function setNameTag(string $name) : void{ $this->nameTag = $name; $this->networkPropertiesDirty = true; diff --git a/src/entity/Living.php b/src/entity/Living.php index 4d5e10cb36..e7d669fda7 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -132,6 +132,10 @@ abstract class Living extends Entity{ abstract public function getName() : string; + public function canBeRenamed() : bool{ + return true; + } + protected function initEntity(CompoundTag $nbt) : void{ parent::initEntity($nbt); diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index bf688118bc..66eebed744 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -323,8 +323,9 @@ final class ItemTypeIds{ public const EYE_ARMOR_TRIM_SMITHING_TEMPLATE = 20284; public const SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE = 20285; public const PITCHER_POD = 20286; + public const NAME_TAG = 20287; - public const FIRST_UNUSED_ITEM_ID = 20287; + public const FIRST_UNUSED_ITEM_ID = 20288; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/NameTag.php b/src/item/NameTag.php new file mode 100644 index 0000000000..8c7113e1de --- /dev/null +++ b/src/item/NameTag.php @@ -0,0 +1,40 @@ +canBeRenamed() && $this->hasCustomName()){ + $entity->setNameTag($this->getCustomName()); + $this->pop(); + return true; + } + return false; + } +} diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index ca73dded81..91fd2ab4a4 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1384,6 +1384,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("mutton_raw", fn() => Items::RAW_MUTTON()); $result->register("muttoncooked", fn() => Items::COOKED_MUTTON()); $result->register("muttonraw", fn() => Items::RAW_MUTTON()); + $result->register("name_tag", fn() => Items::NAME_TAG()); $result->register("nautilus_shell", fn() => Items::NAUTILUS_SHELL()); $result->register("nether_brick", fn() => Items::NETHER_BRICK()); $result->register("nether_quartz", fn() => Items::NETHER_QUARTZ()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index f9aca9a767..bbd0dfc01b 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -219,6 +219,7 @@ use function strtolower; * @method static MilkBucket MILK_BUCKET() * @method static Minecart MINECART() * @method static MushroomStew MUSHROOM_STEW() + * @method static NameTag NAME_TAG() * @method static Item NAUTILUS_SHELL() * @method static Axe NETHERITE_AXE() * @method static Armor NETHERITE_BOOTS() @@ -490,6 +491,7 @@ final class VanillaItems{ self::register("milk_bucket", new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); self::register("minecart", new Minecart(new IID(Ids::MINECART), "Minecart")); self::register("mushroom_stew", new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); + self::register("name_tag", new NameTag(new IID(Ids::NAME_TAG), "Name Tag")); self::register("nautilus_shell", new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); diff --git a/src/player/Player.php b/src/player/Player.php index 92e15ddd38..7a717dacd9 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -630,6 +630,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->displayName = $ev->getNewName(); } + public function canBeRenamed() : bool{ + return false; + } + /** * Returns the player's locale, e.g. en_US. */ From 6872661fd03649cc7a8762c41c16e9ee5a4de1c9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 23 Feb 2024 14:10:02 +0000 Subject: [PATCH 1623/1858] Harden JsonMapper on login JSON handling --- composer.json | 2 +- composer.lock | 29 +++++++++---------- src/network/mcpe/auth/ProcessLoginTask.php | 2 ++ .../mcpe/handler/LoginPacketHandler.php | 2 ++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/composer.json b/composer.json index f99c44dc51..c3f94ad34a 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "ext-zlib": ">=1.2.11", "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", - "pocketmine/netresearch-jsonmapper": "~v4.2.1000", + "pocketmine/netresearch-jsonmapper": "~v4.4.999", "pocketmine/bedrock-block-upgrade-schema": "~3.5.0+bedrock-1.20.60", "pocketmine/bedrock-data": "~2.8.0+bedrock-1.20.60", "pocketmine/bedrock-item-upgrade-schema": "~1.7.0+bedrock-1.20.60", diff --git a/composer.lock b/composer.lock index 876e52fb75..9254bdff4a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9e781d0fef7796616b0580e7b06cc6d1", + "content-hash": "14848cb7b70d0fa63ed46b30128c2320", "packages": [ { "name": "adhocore/json-comment", @@ -200,21 +200,20 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "27.0.1+bedrock-1.20.60", + "version": "27.0.2+bedrock-1.20.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10" + "reference": "6905865133b69da8c95a13c563d349e1993c06b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cebb55f6e904f722b14d420f6b2c84c7fa69f10", - "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/6905865133b69da8c95a13c563d349e1993c06b8", + "reference": "6905865133b69da8c95a13c563d349e1993c06b8", "shasum": "" }, "require": { "ext-json": "*", - "netresearch/jsonmapper": "^4.0", "php": "^8.1", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", @@ -241,9 +240,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/27.0.1+bedrock-1.20.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/27.0.2+bedrock-1.20.60" }, - "time": "2024-02-07T11:53:50+00:00" + "time": "2024-02-23T13:43:39+00:00" }, { "name": "pocketmine/binaryutils", @@ -563,16 +562,16 @@ }, { "name": "pocketmine/netresearch-jsonmapper", - "version": "v4.2.1000", + "version": "v4.4.999", "source": { "type": "git", "url": "https://github.com/pmmp/netresearch-jsonmapper.git", - "reference": "078764e869e9b732f97206ec9363480a77c35532" + "reference": "9a6610033d56e358e86a3e4fd5f87063c7318833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/netresearch-jsonmapper/zipball/078764e869e9b732f97206ec9363480a77c35532", - "reference": "078764e869e9b732f97206ec9363480a77c35532", + "url": "https://api.github.com/repos/pmmp/netresearch-jsonmapper/zipball/9a6610033d56e358e86a3e4fd5f87063c7318833", + "reference": "9a6610033d56e358e86a3e4fd5f87063c7318833", "shasum": "" }, "require": { @@ -586,7 +585,7 @@ "netresearch/jsonmapper": "~4.2.0" }, "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", "squizlabs/php_codesniffer": "~3.5" }, "type": "library", @@ -611,9 +610,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/pmmp/netresearch-jsonmapper/tree/v4.2.1000" + "source": "https://github.com/pmmp/netresearch-jsonmapper/tree/v4.4.999" }, - "time": "2023-07-14T10:44:14+00:00" + "time": "2024-02-23T13:17:01+00:00" }, { "name": "pocketmine/raklib", diff --git a/src/network/mcpe/auth/ProcessLoginTask.php b/src/network/mcpe/auth/ProcessLoginTask.php index 607b75c89e..9078fca751 100644 --- a/src/network/mcpe/auth/ProcessLoginTask.php +++ b/src/network/mcpe/auth/ProcessLoginTask.php @@ -135,6 +135,7 @@ class ProcessLoginTask extends AsyncTask{ $mapper = new \JsonMapper(); $mapper->bExceptionOnMissingData = true; $mapper->bExceptionOnUndefinedProperty = true; + $mapper->bStrictObjectTypeChecking = true; $mapper->bEnforceMapType = false; try{ @@ -181,6 +182,7 @@ class ProcessLoginTask extends AsyncTask{ $mapper = new \JsonMapper(); $mapper->bExceptionOnUndefinedProperty = false; //we only care about the properties we're using in this case $mapper->bExceptionOnMissingData = true; + $mapper->bStrictObjectTypeChecking = true; $mapper->bEnforceMapType = false; $mapper->bRemoveUndefinedAttributes = true; try{ diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 26e2bf0283..2e3a515198 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -169,6 +169,7 @@ class LoginPacketHandler extends PacketHandler{ $mapper->bEnforceMapType = false; //TODO: we don't really need this as an array, but right now we don't have enough models $mapper->bExceptionOnMissingData = true; $mapper->bExceptionOnUndefinedProperty = true; + $mapper->bStrictObjectTypeChecking = true; try{ /** @var AuthenticationData $extraData */ $extraData = $mapper->map($claims["extraData"], new AuthenticationData()); @@ -197,6 +198,7 @@ class LoginPacketHandler extends PacketHandler{ $mapper->bEnforceMapType = false; //TODO: we don't really need this as an array, but right now we don't have enough models $mapper->bExceptionOnMissingData = true; $mapper->bExceptionOnUndefinedProperty = true; + $mapper->bStrictObjectTypeChecking = true; try{ $clientData = $mapper->map($clientDataClaims, new ClientData()); }catch(\JsonMapper_Exception $e){ From db665fefdbec044f155625f3fbc5c9d17c28e1bd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 23 Feb 2024 14:10:24 +0000 Subject: [PATCH 1624/1858] Harden JsonMapper defaults in general --- .../bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php | 3 +++ src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php | 3 +++ src/resourcepacks/ZippedResourcePack.php | 1 + src/updater/UpdateCheckTask.php | 1 + 4 files changed, 8 insertions(+) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 82e7771349..9c63d51f03 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -389,6 +389,9 @@ final class BlockStateUpgradeSchemaUtils{ } $jsonMapper = new \JsonMapper(); + $jsonMapper->bExceptionOnMissingData = true; + $jsonMapper->bExceptionOnUndefinedProperty = true; + $jsonMapper->bStrictObjectTypeChecking = true; try{ $model = $jsonMapper->map($json, new BlockStateUpgradeSchemaModel()); }catch(\JsonMapper_Exception $e){ diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php index ef1543a80a..0fa10803a1 100644 --- a/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgradeSchemaUtils.php @@ -88,6 +88,9 @@ final class ItemIdMetaUpgradeSchemaUtils{ } $jsonMapper = new \JsonMapper(); + $jsonMapper->bExceptionOnMissingData = true; + $jsonMapper->bExceptionOnUndefinedProperty = true; + $jsonMapper->bStrictObjectTypeChecking = true; try{ $model = $jsonMapper->map($json, new ItemIdMetaUpgradeSchemaModel()); }catch(\JsonMapper_Exception $e){ diff --git a/src/resourcepacks/ZippedResourcePack.php b/src/resourcepacks/ZippedResourcePack.php index 7ba5c467d5..da7db1db7a 100644 --- a/src/resourcepacks/ZippedResourcePack.php +++ b/src/resourcepacks/ZippedResourcePack.php @@ -108,6 +108,7 @@ class ZippedResourcePack implements ResourcePack{ $mapper = new \JsonMapper(); $mapper->bExceptionOnMissingData = true; + $mapper->bStrictObjectTypeChecking = true; try{ /** @var Manifest $manifest */ diff --git a/src/updater/UpdateCheckTask.php b/src/updater/UpdateCheckTask.php index ae56682f3e..af73f05af4 100644 --- a/src/updater/UpdateCheckTask.php +++ b/src/updater/UpdateCheckTask.php @@ -55,6 +55,7 @@ class UpdateCheckTask extends AsyncTask{ }else{ $mapper = new \JsonMapper(); $mapper->bExceptionOnMissingData = true; + $mapper->bStrictObjectTypeChecking = true; $mapper->bEnforceMapType = false; try{ /** @var UpdateInfo $responseObj */ From 7b89dda420ecd2f2f20fff087aa45474d5bb8a32 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 23 Feb 2024 14:19:01 +0000 Subject: [PATCH 1625/1858] Release 5.11.1 --- changelogs/5.11.md | 13 +++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/changelogs/5.11.md b/changelogs/5.11.md index 9ec0a3a6cc..96c05bf1b6 100644 --- a/changelogs/5.11.md +++ b/changelogs/5.11.md @@ -24,3 +24,16 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - Restructured GitHub Actions CI workflows to make them easier to maintain (no need to update PHP versions in multiple places anymore). - GitHub Actions CodeStyle workflow now uses php-cs-fixer 3.49.x. - Dependabot updates are now processed weekly instead of daily. + +# 5.11.1 +Released 23rd February 2024. + +## Fixes +- Fixed subchunk count calculation in `ChunkSerializer` for non-overworld dimension (useful for dimension plugins). +- Harden options used for processing JSON data, particularly on the network, to close security issues. + +## Documentation +- Fixed PHPStan signature for `Utils::cloneObjectArray()`. + +## Internals +- Updated GitHub Actions versions to get rid of deprecation warnings. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c87bc899b8..4072fb9591 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.11.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From b744e09352a714d89220719ab6948a010ac636fc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 23 Feb 2024 14:19:02 +0000 Subject: [PATCH 1626/1858] 5.11.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4072fb9591..52fecb633d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.11.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.11.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 561ffd3da38d4b5d342dbb9b26487092b013986f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 14:27:56 +0000 Subject: [PATCH 1627/1858] Bump pmmp/setup-php-action from 3.0.0 to 3.1.0 (#6267) Bumps [pmmp/setup-php-action](https://github.com/pmmp/setup-php-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/pmmp/setup-php-action/releases) - [Commits](https://github.com/pmmp/setup-php-action/compare/3.0.0...3.1.0) --- updated-dependencies: - dependency-name: pmmp/setup-php-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/main-php-matrix.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml index 846459748f..b81ac8b460 100644 --- a/.github/workflows/main-php-matrix.yml +++ b/.github/workflows/main-php-matrix.yml @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.0.0 + uses: pmmp/setup-php-action@3.1.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -62,7 +62,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.0.0 + uses: pmmp/setup-php-action@3.1.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -96,7 +96,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@3.0.0 + uses: pmmp/setup-php-action@3.1.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -128,7 +128,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.0.0 + uses: pmmp/setup-php-action@3.1.0 with: php-version: ${{ inputs.php }} install-path: "./bin" From 47f011966092f275cc1b11f8de635e89fd9651a7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Feb 2024 14:35:21 +0000 Subject: [PATCH 1628/1858] InGamePacketHandler: added an extra check --- src/network/mcpe/handler/InGamePacketHandler.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 8c3449d415..860f3c465f 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -869,8 +869,12 @@ class InGamePacketHandler extends PacketHandler{ } public function handleBookEdit(BookEditPacket $packet) : bool{ + $inventory = $this->player->getInventory(); + if(!$inventory->slotExists($packet->inventorySlot)){ + return false; + } //TODO: break this up into book API things - $oldBook = $this->player->getInventory()->getItem($packet->inventorySlot); + $oldBook = $inventory->getItem($packet->inventorySlot); if(!($oldBook instanceof WritableBook)){ return false; } From aee36564156b3dbb2791fb17ad1c01d16335b7b6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Feb 2024 14:45:47 +0000 Subject: [PATCH 1629/1858] Release 5.11.2 --- changelogs/5.11.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/5.11.md b/changelogs/5.11.md index 96c05bf1b6..e993dceec1 100644 --- a/changelogs/5.11.md +++ b/changelogs/5.11.md @@ -37,3 +37,9 @@ Released 23rd February 2024. ## Internals - Updated GitHub Actions versions to get rid of deprecation warnings. + +# 5.11.2 +Released 26th February 2024. + +## Fixes +- Added extra checks for `BookEditPacket` handling. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 52fecb633d..104d544569 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.11.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 34a5f91aa9506a8369879e29f472c68a91c5b9e1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Feb 2024 14:45:48 +0000 Subject: [PATCH 1630/1858] 5.11.3 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 104d544569..946e53a232 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.11.2"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.11.3"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From efd113bdc88a9b8382e6f1a47b70cb39493a0790 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 26 Feb 2024 17:09:09 +0000 Subject: [PATCH 1631/1858] Integrate pmmp/BedrockProtocol@65b3d0b341afc5c0aa952f1d71a4109d78bb0a59 --- composer.json | 2 +- composer.lock | 22 ++++++------ src/Server.php | 11 +++--- src/network/mcpe/ChunkRequestTask.php | 6 ++-- src/network/mcpe/NetworkSession.php | 8 ++--- .../mcpe/StandardPacketBroadcaster.php | 10 ++---- src/network/mcpe/convert/TypeConverter.php | 29 +++++++++++---- src/network/mcpe/raklib/RakLibInterface.php | 5 --- .../mcpe/serializer/ChunkSerializer.php | 5 ++- tools/generate-bedrock-data-from-packets.php | 35 ++++++++++--------- 10 files changed, 67 insertions(+), 66 deletions(-) diff --git a/composer.json b/composer.json index 47e798b164..01b4c75b17 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~3.5.0+bedrock-1.20.60", "pocketmine/bedrock-data": "~2.8.0+bedrock-1.20.60", "pocketmine/bedrock-item-upgrade-schema": "~1.7.0+bedrock-1.20.60", - "pocketmine/bedrock-protocol": "~27.0.0+bedrock-1.20.60", + "pocketmine/bedrock-protocol": "dev-master", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 47aeeaecab..eb6faf8b26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d923f5fd75f0d33eb5198268a74a58b4", + "content-hash": "1786511a89ee1a1e932ecc68834ec476", "packages": [ { "name": "adhocore/json-comment", @@ -200,21 +200,20 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "27.0.1+bedrock-1.20.60", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10" + "reference": "6e73f21cdc7433f0674dfcdf4817f478aa5528e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/0cebb55f6e904f722b14d420f6b2c84c7fa69f10", - "reference": "0cebb55f6e904f722b14d420f6b2c84c7fa69f10", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/6e73f21cdc7433f0674dfcdf4817f478aa5528e6", + "reference": "6e73f21cdc7433f0674dfcdf4817f478aa5528e6", "shasum": "" }, "require": { "ext-json": "*", - "netresearch/jsonmapper": "^4.0", "php": "^8.1", "pocketmine/binaryutils": "^0.2.0", "pocketmine/color": "^0.2.0 || ^0.3.0", @@ -223,11 +222,12 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.39", + "phpstan/phpstan": "1.10.59", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5 || ^10.0" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -241,9 +241,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/27.0.1+bedrock-1.20.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/master" }, - "time": "2024-02-07T11:53:50+00:00" + "time": "2024-02-26T16:18:34+00:00" }, { "name": "pocketmine/binaryutils", @@ -2931,7 +2931,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "pocketmine/bedrock-protocol": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/Server.php b/src/Server.php index 73bfdb85a2..ed7f52d63e 100644 --- a/src/Server.php +++ b/src/Server.php @@ -59,7 +59,6 @@ use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\ProtocolInfo; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm; use pocketmine\network\mcpe\raklib\RakLibInterface; use pocketmine\network\mcpe\StandardEntityEventBroadcaster; @@ -1187,12 +1186,11 @@ class Server{ bool $useQuery, PacketBroadcaster $packetBroadcaster, EntityEventBroadcaster $entityEventBroadcaster, - PacketSerializerContext $packetSerializerContext, TypeConverter $typeConverter ) : bool{ $prettyIp = $ipV6 ? "[$ip]" : $ip; try{ - $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter)); + $rakLibRegistered = $this->network->registerInterface(new RakLibInterface($this, $ip, $port, $ipV6, $packetBroadcaster, $entityEventBroadcaster, $typeConverter)); }catch(NetworkInterfaceStartException $e){ $this->logger->emergency($this->language->translate(KnownTranslationFactory::pocketmine_server_networkStartFailed( $ip, @@ -1219,15 +1217,14 @@ class Server{ $useQuery = $this->configGroup->getConfigBool(ServerProperties::ENABLE_QUERY, true); $typeConverter = TypeConverter::getInstance(); - $packetSerializerContext = new PacketSerializerContext($typeConverter->getItemTypeDictionary()); - $packetBroadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); + $packetBroadcaster = new StandardPacketBroadcaster($this); $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster, $typeConverter); if( - !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) || + !$this->startupPrepareConnectableNetworkInterfaces($this->getIp(), $this->getPort(), false, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $typeConverter) || ( $this->configGroup->getConfigBool(ServerProperties::ENABLE_IPV6, true) && - !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $packetSerializerContext, $typeConverter) + !$this->startupPrepareConnectableNetworkInterfaces($this->getIpV6(), $this->getPortV6(), true, $useQuery, $packetBroadcaster, $entityEventBroadcaster, $typeConverter) ) ){ return false; diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 05a4f20c10..13b5db5b79 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -28,7 +28,6 @@ use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelChunkPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\ChunkPosition; use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\network\mcpe\serializer\ChunkSerializer; @@ -72,11 +71,10 @@ class ChunkRequestTask extends AsyncTask{ $subCount = ChunkSerializer::getSubChunkCount($chunk, $dimensionId); $converter = TypeConverter::getInstance(); - $encoderContext = new PacketSerializerContext($converter->getItemTypeDictionary()); - $payload = ChunkSerializer::serializeFullChunk($chunk, $dimensionId, $converter->getBlockTranslator(), $encoderContext, $this->tiles); + $payload = ChunkSerializer::serializeFullChunk($chunk, $dimensionId, $converter->getBlockTranslator(), $this->tiles); $stream = new BinaryStream(); - PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $dimensionId, $subCount, false, null, $payload)]); + PacketBatch::encodePackets($stream, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $dimensionId, $subCount, false, null, $payload)]); $compressor = $this->compressor->deserialize(); $this->setResult(chr($compressor->getNetworkId()) . $compressor->compress($stream->getBuffer())); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 8ac4db98fc..63fab278eb 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -67,7 +67,6 @@ use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket; use pocketmine\network\mcpe\protocol\SetDifficultyPacket; @@ -180,7 +179,6 @@ class NetworkSession{ private Server $server, private NetworkSessionManager $manager, private PacketPool $packetPool, - private PacketSerializerContext $packetSerializerContext, private PacketSender $sender, private PacketBroadcaster $broadcaster, private EntityEventBroadcaster $entityEventBroadcaster, @@ -435,7 +433,7 @@ class NetworkSession{ $decodeTimings = Timings::getDecodeDataPacketTimings($packet); $decodeTimings->startTiming(); try{ - $stream = PacketSerializer::decoder($buffer, 0, $this->packetSerializerContext); + $stream = PacketSerializer::decoder($buffer, 0); try{ $packet->decode($stream); }catch(PacketDecodeException $e){ @@ -494,7 +492,7 @@ class NetworkSession{ } foreach($packets as $evPacket){ - $this->addToSendBuffer(self::encodePacketTimed(PacketSerializer::encoder($this->packetSerializerContext), $evPacket)); + $this->addToSendBuffer(self::encodePacketTimed(PacketSerializer::encoder(), $evPacket)); } if($immediate){ $this->flushSendBuffer(true); @@ -554,8 +552,6 @@ class NetworkSession{ } } - public function getPacketSerializerContext() : PacketSerializerContext{ return $this->packetSerializerContext; } - public function getBroadcaster() : PacketBroadcaster{ return $this->broadcaster; } public function getEntityEventBroadcaster() : EntityEventBroadcaster{ return $this->entityEventBroadcaster; } diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 1de6f80fe8..32afdeeb7c 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\BinaryStream; @@ -37,8 +36,7 @@ use function strlen; final class StandardPacketBroadcaster implements PacketBroadcaster{ public function __construct( - private Server $server, - private PacketSerializerContext $protocolContext + private Server $server ){} public function broadcastPackets(array $recipients, array $packets) : void{ @@ -58,10 +56,6 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ /** @var NetworkSession[][] $targetsByCompressor */ $targetsByCompressor = []; foreach($recipients as $recipient){ - if($recipient->getPacketSerializerContext() !== $this->protocolContext){ - throw new \InvalidArgumentException("Only recipients with the same protocol context as the broadcaster can be broadcast to by this broadcaster"); - } - //TODO: different compressors might be compatible, it might not be necessary to split them up by object $compressor = $recipient->getCompressor(); $compressors[spl_object_id($compressor)] = $compressor; @@ -72,7 +66,7 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $totalLength = 0; $packetBuffers = []; foreach($packets as $packet){ - $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder($this->protocolContext), $packet); + $buffer = NetworkSession::encodePacketTimed(PacketSerializer::encoder(), $packet); //varint length prefix + packet buffer $totalLength += (((int) log(strlen($buffer), 128)) + 1) + strlen($buffer); $packetBuffers[] = $buffer; diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 53ce6e98a8..0f9789de79 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -30,13 +30,17 @@ use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\TagWildcardRecipeIngredient; use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\item\BlockItemIdMap; +use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\network\mcpe\protocol\types\GameMode as ProtocolGameMode; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStackExtraData; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStackExtraDataShield; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient as ProtocolRecipeIngredient; use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; @@ -76,7 +80,7 @@ class TypeConverter{ ); $this->itemTypeDictionary = ItemTypeDictionaryFromDataHelper::loadFromString(Filesystem::fileGetContents(BedrockDataFiles::REQUIRED_ITEM_LIST_JSON)); - $this->shieldRuntimeId = $this->itemTypeDictionary->fromStringId("minecraft:shield"); + $this->shieldRuntimeId = $this->itemTypeDictionary->fromStringId(ItemTypeNames::SHIELD); $this->itemTranslator = new ItemTranslator( $this->itemTypeDictionary, @@ -217,26 +221,39 @@ class TypeConverter{ [$id, $meta, $blockRuntimeId] = $idMeta; } + $extraData = $id === $this->shieldRuntimeId ? + new ItemStackExtraDataShield($nbt, canPlaceOn: [], canDestroy: [], blockingTick: 0) : + new ItemStackExtraData($nbt, canPlaceOn: [], canDestroy: []); + $extraDataSerializer = PacketSerializer::encoder(); + $extraData->write($extraDataSerializer); + return new ItemStack( $id, $meta, $itemStack->getCount(), $blockRuntimeId ?? ItemTranslator::NO_BLOCK_RUNTIME_ID, - $nbt, - [], - [], - $id === $this->shieldRuntimeId ? 0 : null + $extraDataSerializer->getBuffer(), ); } /** + * WARNING: Avoid this in server-side code. If you need to compare ItemStacks provided by the client to the + * server, prefer encoding the server's itemstack and comparing the serialized ItemStack, instead of converting + * the client's ItemStack to a core Item. + * This method will fully decode the item's extra data, which can be very costly if the item has a lot of NBT data. + * * @throws TypeConversionException */ public function netItemStackToCore(ItemStack $itemStack) : Item{ if($itemStack->getId() === 0){ return VanillaItems::AIR(); } - $compound = $itemStack->getNbt(); + $extraDataDeserializer = PacketSerializer::decoder($itemStack->getRawExtraData(), 0); + $extraData = $itemStack->getId() === $this->shieldRuntimeId ? + ItemStackExtraDataShield::read($extraDataDeserializer) : + ItemStackExtraData::read($extraDataDeserializer); + + $compound = $extraData->getNbt(); $itemResult = $this->itemTranslator->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index 17aa87e839..b2325f5698 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -33,7 +33,6 @@ use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketBroadcaster; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\ProtocolInfo; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\Network; use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; @@ -84,7 +83,6 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ private PacketBroadcaster $packetBroadcaster; private EntityEventBroadcaster $entityEventBroadcaster; - private PacketSerializerContext $packetSerializerContext; private TypeConverter $typeConverter; public function __construct( @@ -94,12 +92,10 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ bool $ipV6, PacketBroadcaster $packetBroadcaster, EntityEventBroadcaster $entityEventBroadcaster, - PacketSerializerContext $packetSerializerContext, TypeConverter $typeConverter ){ $this->server = $server; $this->packetBroadcaster = $packetBroadcaster; - $this->packetSerializerContext = $packetSerializerContext; $this->entityEventBroadcaster = $entityEventBroadcaster; $this->typeConverter = $typeConverter; @@ -192,7 +188,6 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->server, $this->network->getSessionManager(), PacketPool::getInstance(), - $this->packetSerializerContext, new RakLibPacketSender($sessionId, $this), $this->packetBroadcaster, $this->entityEventBroadcaster, diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index e089daef56..9120f34a7e 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -30,7 +30,6 @@ use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\convert\BlockTranslator; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\DimensionIds; use pocketmine\utils\Binary; use pocketmine\utils\BinaryStream; @@ -84,8 +83,8 @@ final class ChunkSerializer{ /** * @phpstan-param DimensionIds::* $dimensionId */ - public static function serializeFullChunk(Chunk $chunk, int $dimensionId, BlockTranslator $blockTranslator, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ - $stream = PacketSerializer::encoder($encoderContext); + public static function serializeFullChunk(Chunk $chunk, int $dimensionId, BlockTranslator $blockTranslator, ?string $tiles = null) : string{ + $stream = PacketSerializer::encoder(); $subChunkCount = self::getSubChunkCount($chunk, $dimensionId); $writtenCount = 0; diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 77d2b9d93f..ca15bd8bec 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -34,6 +34,7 @@ use pocketmine\crafting\json\SmithingTransformRecipeData; use pocketmine\crafting\json\SmithingTrimRecipeData; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\item\BlockItemIdMap; +use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; @@ -50,12 +51,12 @@ use pocketmine\network\mcpe\protocol\CreativeContentPacket; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; -use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\StartGamePacket; use pocketmine\network\mcpe\protocol\types\CacheableNbt; use pocketmine\network\mcpe\protocol\types\inventory\CreativeContentEntry; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; -use pocketmine\network\mcpe\protocol\types\ItemTypeEntry; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStackExtraData; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStackExtraDataShield; use pocketmine\network\mcpe\protocol\types\recipe\ComplexAliasItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipe; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; @@ -170,16 +171,21 @@ class ParserPacketHandler extends PacketHandler{ $data->meta = $meta; } - $nbt = $itemStack->getNbt(); - if($nbt !== null && count($nbt) > 0){ - $data->nbt = base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($nbt))); - } + $rawExtraData = $itemStack->getRawExtraData(); + if($rawExtraData !== ""){ + $decoder = PacketSerializer::decoder($rawExtraData, 0); + $extraData = $itemStringId === ItemTypeNames::SHIELD ? ItemStackExtraDataShield::read($decoder) : ItemStackExtraData::read($decoder); + $nbt = $extraData->getNbt(); + if($nbt !== null && count($nbt) > 0){ + $data->nbt = base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($nbt))); + } - if(count($itemStack->getCanPlaceOn()) > 0){ - $data->can_place_on = $itemStack->getCanPlaceOn(); - } - if(count($itemStack->getCanDestroy()) > 0){ - $data->can_destroy = $itemStack->getCanDestroy(); + if(count($extraData->getCanPlaceOn()) > 0){ + $data->can_place_on = $extraData->getCanPlaceOn(); + } + if(count($extraData->getCanDestroy()) > 0){ + $data->can_destroy = $extraData->getCanDestroy(); + } } return $data; @@ -421,7 +427,7 @@ class ParserPacketHandler extends PacketHandler{ $recipes["potion_type"][] = new PotionTypeRecipeData( $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getInputItemId(), $recipe->getInputItemMeta()), 1)), $this->recipeIngredientToJson(new RecipeIngredient(new IntIdMetaItemDescriptor($recipe->getIngredientItemId(), $recipe->getIngredientItemMeta()), 1)), - $this->itemStackToJson(new ItemStack($recipe->getOutputItemId(), $recipe->getOutputItemMeta(), 1, 0, null, [], [], null)), + $this->itemStackToJson(new ItemStack($recipe->getOutputItemId(), $recipe->getOutputItemMeta(), 1, 0, "")), ); } @@ -571,10 +577,7 @@ function main(array $argv) : int{ fwrite(STDERR, "Unknown packet on line " . ($lineNum + 1) . ": " . $parts[1]); continue; } - $serializer = PacketSerializer::decoder($raw, 0, new PacketSerializerContext( - $handler->itemTypeDictionary ?? - new ItemTypeDictionary([new ItemTypeEntry("minecraft:shield", 0, false)])) - ); + $serializer = PacketSerializer::decoder($raw, 0); $pk->decode($serializer); $pk->handle($handler); From 687211835591a63ba1a282307463059778ee76ef Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Feb 2024 14:15:31 +0000 Subject: [PATCH 1632/1858] Update BedrockProtocol to release version --- composer.json | 2 +- composer.lock | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 01b4c75b17..6b7893bc73 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~3.5.0+bedrock-1.20.60", "pocketmine/bedrock-data": "~2.8.0+bedrock-1.20.60", "pocketmine/bedrock-item-upgrade-schema": "~1.7.0+bedrock-1.20.60", - "pocketmine/bedrock-protocol": "dev-master", + "pocketmine/bedrock-protocol": "~28.0.0+bedrock-1.20.60", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index eb6faf8b26..8f5af610ce 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1786511a89ee1a1e932ecc68834ec476", + "content-hash": "8b860493cc27ba81e717153651a786b6", "packages": [ { "name": "adhocore/json-comment", @@ -200,7 +200,7 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "dev-master", + "version": "28.0.0+bedrock-1.20.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", @@ -227,7 +227,6 @@ "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5 || ^10.0" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -241,7 +240,7 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/master" + "source": "https://github.com/pmmp/BedrockProtocol/tree/28.0.0+bedrock-1.20.60" }, "time": "2024-02-26T16:18:34+00:00" }, @@ -2931,9 +2930,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "pocketmine/bedrock-protocol": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From a0cca53f52c614fc39a1285eb39cd0ebb7c3862f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Feb 2024 16:07:43 +0000 Subject: [PATCH 1633/1858] Fixed mismatched predictions due to NBT key order differences this is a pain :( It appears the client always sorts the keys in alphabetical order due to use of std::map. However I'm not sure of the exact ordering behaviour, so it needs to be investigated. --- src/network/mcpe/InventoryManager.php | 37 ++++++++++++++++++- src/network/mcpe/convert/TypeConverter.php | 12 ++++-- .../mcpe/handler/InGamePacketHandler.php | 15 ++++++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 938b5c82c2..e2b71ab310 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -423,6 +423,41 @@ class InventoryManager{ } } + /** + * Compares itemstack extra data for equality. This is used to verify legacy InventoryTransaction slot predictions. + * + * TODO: It would be preferable if we didn't have to deserialize this, to improve performance and reduce attack + * surface. However, the raw data may not match due to differences in ordering. Investigate whether the + * client-provided NBT is consistently sorted. + */ + private function itemStackExtraDataEqual(ItemStack $left, ItemStack $right) : bool{ + if($left->getRawExtraData() === $right->getRawExtraData()){ + return true; + } + + $typeConverter = $this->session->getTypeConverter(); + $leftExtraData = $typeConverter->deserializeItemStackExtraData($left->getRawExtraData(), $left->getId()); + $rightExtraData = $typeConverter->deserializeItemStackExtraData($right->getRawExtraData(), $right->getId()); + + $leftNbt = $leftExtraData->getNbt(); + $rightNbt = $rightExtraData->getNbt(); + return + $leftExtraData->getCanPlaceOn() === $rightExtraData->getCanPlaceOn() && + $leftExtraData->getCanDestroy() === $rightExtraData->getCanDestroy() && ( + $leftNbt === $rightNbt || //this covers null === null and fast object identity + ($leftNbt !== null && $rightNbt !== null && $leftNbt->equals($rightNbt)) + ); + } + + private function itemStacksEqual(ItemStack $left, ItemStack $right) : bool{ + return + $left->getId() === $right->getId() && + $left->getMeta() === $right->getMeta() && + $left->getBlockRuntimeId() === $right->getBlockRuntimeId() && + $left->getCount() === $right->getCount() && + $this->itemStackExtraDataEqual($left, $right); + } + public function onSlotChange(Inventory $inventory, int $slot) : void{ $inventoryEntry = $this->inventories[spl_object_id($inventory)] ?? null; if($inventoryEntry === null){ @@ -432,7 +467,7 @@ class InventoryManager{ } $currentItem = $this->session->getTypeConverter()->coreItemStackToNet($inventory->getItem($slot)); $clientSideItem = $inventoryEntry->predictions[$slot] ?? null; - if($clientSideItem === null || !$clientSideItem->equals($currentItem)){ + if($clientSideItem === null || !$this->itemStacksEqual($currentItem, $clientSideItem)){ //no prediction or incorrect - do not associate this with the currently active itemstack request $this->trackItemStack($inventoryEntry, $slot, $currentItem, null); $inventoryEntry->pendingSyncs[$slot] = $currentItem; diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 0f9789de79..e886b2b8be 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -248,10 +248,7 @@ class TypeConverter{ if($itemStack->getId() === 0){ return VanillaItems::AIR(); } - $extraDataDeserializer = PacketSerializer::decoder($itemStack->getRawExtraData(), 0); - $extraData = $itemStack->getId() === $this->shieldRuntimeId ? - ItemStackExtraDataShield::read($extraDataDeserializer) : - ItemStackExtraData::read($extraDataDeserializer); + $extraData = $this->deserializeItemStackExtraData($itemStack->getRawExtraData(), $itemStack->getId()); $compound = $extraData->getNbt(); @@ -272,4 +269,11 @@ class TypeConverter{ return $itemResult; } + + public function deserializeItemStackExtraData(string $extraData, int $id) : ItemStackExtraData{ + $extraDataDeserializer = PacketSerializer::decoder($extraData, 0); + return $id === $this->shieldRuntimeId ? + ItemStackExtraDataShield::read($extraDataDeserializer) : + ItemStackExtraData::read($extraDataDeserializer); + } } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 8c3449d415..750502172a 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -444,9 +444,18 @@ class InGamePacketHandler extends PacketHandler{ return false; } $serverItemStack = $this->session->getTypeConverter()->coreItemStackToNet($sourceSlotItem); - //because the client doesn't tell us the expected itemstack ID, we have to deep-compare our known - //itemstack info with the one the client sent. This is costly, but we don't have any other option :( - if(!$serverItemStack->equals($clientItemStack)){ + //Sadly we don't have itemstack IDs here, so we have to compare the basic item properties to ensure that we're + //dropping the item the client expects (inventory might be out of sync with the client). + if( + $serverItemStack->getId() !== $clientItemStack->getId() || + $serverItemStack->getMeta() !== $clientItemStack->getMeta() || + $serverItemStack->getCount() !== $clientItemStack->getCount() || + $serverItemStack->getBlockRuntimeId() !== $clientItemStack->getBlockRuntimeId() + //Raw extraData may not match because of TAG_Compound key ordering differences, and decoding it to compare + //is costly. Assume that we're in sync if id+meta+count+runtimeId match. + //NB: Make sure $clientItemStack isn't used to create the dropped item, as that would allow the client + //to change the item NBT since we're not validating it. + ){ return false; } From a35c3406a8c602cb02c412173bd88534a1a418dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 28 Feb 2024 18:14:37 +0000 Subject: [PATCH 1634/1858] Release 5.12.0 --- changelogs/5.12.md | 54 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.12.md diff --git a/changelogs/5.12.md b/changelogs/5.12.md new file mode 100644 index 0000000000..f1857efa4e --- /dev/null +++ b/changelogs/5.12.md @@ -0,0 +1,54 @@ +# 5.12.0 +Released 28th February 2024 + +**For Minecraft: Bedrock Edition 1.20.60** + +This is a minor feature release, with a few new features and improvements. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added a `--version` command-line option to display the server version and exit. + +## Tools +- Added `tools/generate-biome-ids.php` to generate `pocketmine\data\bedrock\BiomeIds`. +- Fixed ordering of property values generated by `tools/generate-block-palette-spec.php`. + +## API +### `pocketmine\block` +- The following new classes have been added: + - `utils\LightableTrait` - used by blocks with `getLit()` and `setLit()` methods +- The following methods have been deprecated: + - `Block->isSolid()` - this method returns confusing results which don't match expectations and no one really knows what it actually means +- `CocoaBlock` now extends `Flowable` to match vanilla Minecraft behaviour. + +### `pocketmine\plugin` +- `PluginManager->registerEvent()` now throws an exception when given a generator function for the event handler. +- `PluginManager->registerEvents()` now throws an exception if any of the detected event handlers are generator functions. Use `@notHandler` to have the function ignored if intended. + +### `pocketmine\promise` +- The following methods have been added: + - `public static Promise::all(list $promises) : Promise` - returns a promise that is resolved once all given promises are resolved, or is rejected if any of the promises are rejected. + +### `pocketmine\scheduler` +- The following methods have been deprecated: + - `AsyncWorker->getFromThreadStore()` - use class static properties for thread-local storage + - `AsyncWorker->removeFromThreadStore()` + - `AsyncWorker->saveToThreadStore()` + +## Documentation +- Improved documentation of various methods in `Block`. + +## Gameplay +- The following new items have been added: + - Name Tag + +## Internals +- Removed specialization of shutdown logic for `Thread` vs `Worker` (no specialization is required). +- Authentication system no longer accepts logins signed with the old Mojang root public key. +- ID to enum mappings in `pocketmine\data` now use a new `match` convention to allow static analysis to ensure that all enum cases are handled. +- Updated version of `pocketmine/bedrock-protocol` allows avoiding decoding of some itemstack data from the client in most cases, improving performance. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 946e53a232..c54d241f22 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.11.3"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.12.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From b2c97cf2f1fe63f6e2c4ea283eb929956f0ef0cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 28 Feb 2024 18:14:41 +0000 Subject: [PATCH 1635/1858] 5.12.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c54d241f22..794ed17d71 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.12.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.12.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From bc2abf4b158889313d19a9795f115ce14ad4b946 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Mar 2024 14:41:53 +0000 Subject: [PATCH 1636/1858] First shot at packet ack receipt support this will be useful for preventing resource pack sending from overloading the network. it's not the best solution for that (since it means the RTT will limit the pack download speed), but it's easier than implementing congestion control and will work fine in most cases. --- src/network/mcpe/NetworkSession.php | 107 +++++++++++++++--- src/network/mcpe/PacketSender.php | 2 +- src/network/mcpe/raklib/RakLibInterface.php | 7 +- .../mcpe/raklib/RakLibPacketSender.php | 4 +- 4 files changed, 100 insertions(+), 20 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 63fab278eb..edb7f2549f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -100,6 +100,8 @@ use pocketmine\player\Player; use pocketmine\player\PlayerInfo; use pocketmine\player\UsedChunkStatus; use pocketmine\player\XboxLivePlayerInfo; +use pocketmine\promise\Promise; +use pocketmine\promise\PromiseResolver; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; @@ -158,15 +160,24 @@ class NetworkSession{ /** @var string[] */ private array $sendBuffer = []; - /** - * @var \SplQueue|CompressBatchPromise[]|string[] - * @phpstan-var \SplQueue + * @var PromiseResolver[] + * @phpstan-var list> */ + private array $sendBufferAckPromises = []; + + /** @phpstan-var \SplQueue>}> */ private \SplQueue $compressedQueue; private bool $forceAsyncCompression = true; private bool $enableCompression = false; //disabled until handshake completed + private int $nextAckReceiptId = 0; + /** + * @var PromiseResolver[][] + * @phpstan-var array>> + */ + private array $ackPromisesByReceiptId = []; + private ?InventoryManager $invManager = null; /** @@ -468,7 +479,23 @@ class NetworkSession{ } } - public function sendDataPacket(ClientboundPacket $packet, bool $immediate = false) : bool{ + public function handleAckReceipt(int $receiptId) : void{ + if(!$this->connected){ + return; + } + if(isset($this->ackPromisesByReceiptId[$receiptId])){ + $promises = $this->ackPromisesByReceiptId[$receiptId]; + unset($this->ackPromisesByReceiptId[$receiptId]); + foreach($promises as $promise){ + $promise->resolve(true); + } + } + } + + /** + * @phpstan-param PromiseResolver|null $ackReceiptResolver + */ + private function sendDataPacketInternal(ClientboundPacket $packet, bool $immediate, ?PromiseResolver $ackReceiptResolver) : bool{ if(!$this->connected){ return false; } @@ -491,6 +518,9 @@ class NetworkSession{ $packets = [$packet]; } + if($ackReceiptResolver !== null){ + $this->sendBufferAckPromises[] = $ackReceiptResolver; + } foreach($packets as $evPacket){ $this->addToSendBuffer(self::encodePacketTimed(PacketSerializer::encoder(), $evPacket)); } @@ -504,6 +534,23 @@ class NetworkSession{ } } + public function sendDataPacket(ClientboundPacket $packet, bool $immediate = false) : bool{ + return $this->sendDataPacketInternal($packet, $immediate, null); + } + + /** + * @phpstan-return Promise + */ + public function sendDataPacketWithReceipt(ClientboundPacket $packet, bool $immediate = false) : Promise{ + $resolver = new PromiseResolver(); + + if(!$this->sendDataPacketInternal($packet, $immediate, $resolver)){ + $resolver->reject(); + } + + return $resolver->getPromise(); + } + /** * @internal */ @@ -545,7 +592,9 @@ class NetworkSession{ $batch = $stream->getBuffer(); } $this->sendBuffer = []; - $this->queueCompressedNoBufferFlush($batch, $immediate); + $ackPromises = $this->sendBufferAckPromises; + $this->sendBufferAckPromises = []; + $this->queueCompressedNoBufferFlush($batch, $immediate, $ackPromises); }finally{ Timings::$playerNetworkSend->stopTiming(); } @@ -572,22 +621,27 @@ class NetworkSession{ } } - private function queueCompressedNoBufferFlush(CompressBatchPromise|string $batch, bool $immediate = false) : void{ + /** + * @param PromiseResolver[] $ackPromises + * + * @phpstan-param list> $ackPromises + */ + private function queueCompressedNoBufferFlush(CompressBatchPromise|string $batch, bool $immediate = false, array $ackPromises = []) : void{ Timings::$playerNetworkSend->startTiming(); try{ if(is_string($batch)){ if($immediate){ //Skips all queues - $this->sendEncoded($batch, true); + $this->sendEncoded($batch, true, $ackPromises); }else{ - $this->compressedQueue->enqueue($batch); + $this->compressedQueue->enqueue([$batch, $ackPromises]); $this->flushCompressedQueue(); } }elseif($immediate){ //Skips all queues - $this->sendEncoded($batch->getResult(), true); + $this->sendEncoded($batch->getResult(), true, $ackPromises); }else{ - $this->compressedQueue->enqueue($batch); + $this->compressedQueue->enqueue([$batch, $ackPromises]); $batch->onResolve(function() : void{ if($this->connected){ $this->flushCompressedQueue(); @@ -604,14 +658,14 @@ class NetworkSession{ try{ while(!$this->compressedQueue->isEmpty()){ /** @var CompressBatchPromise|string $current */ - $current = $this->compressedQueue->bottom(); + [$current, $ackPromises] = $this->compressedQueue->bottom(); if(is_string($current)){ $this->compressedQueue->dequeue(); - $this->sendEncoded($current); + $this->sendEncoded($current, false, $ackPromises); }elseif($current->hasResult()){ $this->compressedQueue->dequeue(); - $this->sendEncoded($current->getResult()); + $this->sendEncoded($current->getResult(), false, $ackPromises); }else{ //can't send any more queued until this one is ready @@ -623,13 +677,24 @@ class NetworkSession{ } } - private function sendEncoded(string $payload, bool $immediate = false) : void{ + /** + * @param PromiseResolver[] $ackPromises + * @phpstan-param list> $ackPromises + */ + private function sendEncoded(string $payload, bool $immediate, array $ackPromises) : void{ if($this->cipher !== null){ Timings::$playerNetworkSendEncrypt->startTiming(); $payload = $this->cipher->encrypt($payload); Timings::$playerNetworkSendEncrypt->stopTiming(); } - $this->sender->send($payload, $immediate); + + if(count($ackPromises) > 0){ + $ackReceiptId = $this->nextAckReceiptId++; + $this->ackPromisesByReceiptId[$ackReceiptId] = $ackPromises; + }else{ + $ackReceiptId = null; + } + $this->sender->send($payload, $immediate, $ackReceiptId); } /** @@ -642,6 +707,18 @@ class NetworkSession{ $this->disconnectGuard = false; $this->flushSendBuffer(true); $this->sender->close(""); + + foreach($this->ackPromisesByReceiptId as $resolvers){ + foreach($resolvers as $resolver){ + $resolver->reject(); + } + } + $this->ackPromisesByReceiptId = []; + foreach($this->sendBufferAckPromises as $resolver){ + $resolver->reject(); + } + $this->sendBufferAckPromises = []; + foreach($this->disposeHooks as $callback){ $callback(); } diff --git a/src/network/mcpe/PacketSender.php b/src/network/mcpe/PacketSender.php index 4842ea93e9..36e556fe4a 100644 --- a/src/network/mcpe/PacketSender.php +++ b/src/network/mcpe/PacketSender.php @@ -28,7 +28,7 @@ interface PacketSender{ /** * Pushes a packet into the channel to be processed. */ - public function send(string $payload, bool $immediate) : void; + public function send(string $payload, bool $immediate, ?int $receiptId) : void; /** * Closes the channel, terminating the connection. diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index b2325f5698..44328f8f3f 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -252,7 +252,9 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ } public function onPacketAck(int $sessionId, int $identifierACK) : void{ - + if(isset($this->sessions[$sessionId])){ + $this->sessions[$sessionId]->handleAckReceipt($identifierACK); + } } public function setName(string $name) : void{ @@ -289,12 +291,13 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ $this->network->getBandwidthTracker()->add($bytesSentDiff, $bytesReceivedDiff); } - public function putPacket(int $sessionId, string $payload, bool $immediate = true) : void{ + public function putPacket(int $sessionId, string $payload, bool $immediate = true, ?int $receiptId = null) : void{ if(isset($this->sessions[$sessionId])){ $pk = new EncapsulatedPacket(); $pk->buffer = self::MCPE_RAKNET_PACKET_ID . $payload; $pk->reliability = PacketReliability::RELIABLE_ORDERED; $pk->orderChannel = 0; + $pk->identifierACK = $receiptId; $this->interface->sendEncapsulated($sessionId, $pk, $immediate); } diff --git a/src/network/mcpe/raklib/RakLibPacketSender.php b/src/network/mcpe/raklib/RakLibPacketSender.php index d940c282b4..df8cf9a00e 100644 --- a/src/network/mcpe/raklib/RakLibPacketSender.php +++ b/src/network/mcpe/raklib/RakLibPacketSender.php @@ -33,9 +33,9 @@ class RakLibPacketSender implements PacketSender{ private RakLibInterface $handler ){} - public function send(string $payload, bool $immediate) : void{ + public function send(string $payload, bool $immediate, ?int $receiptId) : void{ if(!$this->closed){ - $this->handler->putPacket($this->sessionId, $payload, $immediate); + $this->handler->putPacket($this->sessionId, $payload, $immediate, $receiptId); } } From 90409b50d130fc24edc895a1a5ce6b868089d0a7 Mon Sep 17 00:00:00 2001 From: Jason Wynn Date: Fri, 1 Mar 2024 09:53:59 -0500 Subject: [PATCH 1637/1858] Allow offering different resource packs to different players (#6249) closes #6248 --- .../player/PlayerResourcePackOfferEvent.php | 106 ++++++++++++++++++ src/network/mcpe/NetworkSession.php | 15 ++- .../handler/ResourcePacksPacketHandler.php | 49 +++++--- tests/phpstan/configs/actual-problems.neon | 5 + 4 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 src/event/player/PlayerResourcePackOfferEvent.php diff --git a/src/event/player/PlayerResourcePackOfferEvent.php b/src/event/player/PlayerResourcePackOfferEvent.php new file mode 100644 index 0000000000..df00cf474e --- /dev/null +++ b/src/event/player/PlayerResourcePackOfferEvent.php @@ -0,0 +1,106 @@ + key, leave unset for any packs that are not encrypted + * + * @phpstan-param list $resourcePacks + * @phpstan-param array $encryptionKeys + */ + public function __construct( + private readonly PlayerInfo $playerInfo, + private array $resourcePacks, + private array $encryptionKeys, + private bool $mustAccept + ){} + + public function getPlayerInfo() : PlayerInfo{ + return $this->playerInfo; + } + + /** + * Adds a resource pack to the top of the stack. + * The resources in this pack will be applied over the top of any existing packs. + */ + public function addResourcePack(ResourcePack $entry, ?string $encryptionKey = null) : void{ + array_unshift($this->resourcePacks, $entry); + if($encryptionKey !== null){ + $this->encryptionKeys[$entry->getPackId()] = $encryptionKey; + } + } + + /** + * Sets the resource packs to offer. Packs are applied from the highest key to the lowest, with each pack + * overwriting any resources from the previous pack. This means that the pack at index 0 gets the final say on which + * resources are used. + * + * @param ResourcePack[] $resourcePacks + * @param string[] $encryptionKeys pack UUID => key, leave unset for any packs that are not encrypted + * + * @phpstan-param list $resourcePacks + * @phpstan-param array $encryptionKeys + */ + public function setResourcePacks(array $resourcePacks, array $encryptionKeys) : void{ + $this->resourcePacks = $resourcePacks; + $this->encryptionKeys = $encryptionKeys; + } + + /** + * @return ResourcePack[] + * @phpstan-return list + */ + public function getResourcePacks() : array{ + return $this->resourcePacks; + } + + /** + * @return string[] + * @phpstan-return array + */ + public function getEncryptionKeys() : array{ + return $this->encryptionKeys; + } + + public function setMustAccept(bool $mustAccept) : void{ + $this->mustAccept = $mustAccept; + } + + public function mustAccept() : bool{ + return $this->mustAccept; + } +} diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 63fab278eb..5a369ba33c 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\entity\effect\EffectInstance; use pocketmine\event\player\PlayerDuplicateLoginEvent; +use pocketmine\event\player\PlayerResourcePackOfferEvent; use pocketmine\event\server\DataPacketDecodeEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; @@ -844,7 +845,19 @@ class NetworkSession{ $this->sendDataPacket(PlayStatusPacket::create(PlayStatusPacket::LOGIN_SUCCESS)); $this->logger->debug("Initiating resource packs phase"); - $this->setHandler(new ResourcePacksPacketHandler($this, $this->server->getResourcePackManager(), function() : void{ + + $packManager = $this->server->getResourcePackManager(); + $resourcePacks = $packManager->getResourceStack(); + $keys = []; + foreach($resourcePacks as $resourcePack){ + $key = $packManager->getPackEncryptionKey($resourcePack->getPackId()); + if($key !== null){ + $keys[$resourcePack->getPackId()] = $key; + } + } + $event = new PlayerResourcePackOfferEvent($this->info, $resourcePacks, $keys, $packManager->resourcePacksRequired()); + $event->call(); + $this->setHandler(new ResourcePacksPacketHandler($this, $event->getResourcePacks(), $event->getEncryptionKeys(), $event->mustAccept(), function() : void{ $this->createPlayer(); })); } diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 3d413ee5a1..c5a4596139 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -37,12 +37,13 @@ use pocketmine\network\mcpe\protocol\types\resourcepacks\ResourcePackInfoEntry; use pocketmine\network\mcpe\protocol\types\resourcepacks\ResourcePackStackEntry; use pocketmine\network\mcpe\protocol\types\resourcepacks\ResourcePackType; use pocketmine\resourcepacks\ResourcePack; -use pocketmine\resourcepacks\ResourcePackManager; +use function array_keys; use function array_map; use function ceil; use function count; use function implode; use function strpos; +use function strtolower; use function substr; /** @@ -52,35 +53,55 @@ use function substr; class ResourcePacksPacketHandler extends PacketHandler{ private const PACK_CHUNK_SIZE = 128 * 1024; //128KB + /** + * @var ResourcePack[] + * @phpstan-var array + */ + private array $resourcePacksById = []; + /** @var bool[][] uuid => [chunk index => hasSent] */ private array $downloadedChunks = []; /** - * @phpstan-param \Closure() : void $completionCallback + * @param ResourcePack[] $resourcePackStack + * @param string[] $encryptionKeys pack UUID => key, leave unset for any packs that are not encrypted + * + * @phpstan-param list $resourcePackStack + * @phpstan-param array $encryptionKeys + * @phpstan-param \Closure() : void $completionCallback */ public function __construct( private NetworkSession $session, - private ResourcePackManager $resourcePackManager, + private array $resourcePackStack, + private array $encryptionKeys, + private bool $mustAccept, private \Closure $completionCallback - ){} + ){ + foreach($resourcePackStack as $pack){ + $this->resourcePacksById[$pack->getPackId()] = $pack; + } + } + + private function getPackById(string $id) : ?ResourcePack{ + return $this->resourcePacksById[strtolower($id)] ?? null; + } public function setUp() : void{ $resourcePackEntries = array_map(function(ResourcePack $pack) : ResourcePackInfoEntry{ //TODO: more stuff - $encryptionKey = $this->resourcePackManager->getPackEncryptionKey($pack->getPackId()); return new ResourcePackInfoEntry( $pack->getPackId(), $pack->getPackVersion(), $pack->getPackSize(), - $encryptionKey ?? "", + $this->encryptionKeys[$pack->getPackId()] ?? "", "", $pack->getPackId(), false ); - }, $this->resourcePackManager->getResourceStack()); - //TODO: support forcing server packs - $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false, [])); + }, $this->resourcePackStack); + // TODO: support forcing server packs + $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->mustAccept, false, false, [])); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); } @@ -104,11 +125,11 @@ class ResourcePacksPacketHandler extends PacketHandler{ if($splitPos !== false){ $uuid = substr($uuid, 0, $splitPos); } - $pack = $this->resourcePackManager->getPackById($uuid); + $pack = $this->getPackById($uuid); if(!($pack instanceof ResourcePack)){ //Client requested a resource pack but we don't have it available on the server - $this->disconnectWithError("Unknown pack $uuid requested, available packs: " . implode(", ", $this->resourcePackManager->getPackIdList())); + $this->disconnectWithError("Unknown pack $uuid requested, available packs: " . implode(", ", array_keys($this->resourcePacksById))); return false; } @@ -128,7 +149,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ case ResourcePackClientResponsePacket::STATUS_HAVE_ALL_PACKS: $stack = array_map(static function(ResourcePack $pack) : ResourcePackStackEntry{ return new ResourcePackStackEntry($pack->getPackId(), $pack->getPackVersion(), ""); //TODO: subpacks - }, $this->resourcePackManager->getResourceStack()); + }, $this->resourcePackStack); //we support chemistry blocks by default, the client should already have this installed $stack[] = new ResourcePackStackEntry("0fba4063-dba1-4281-9b89-ff9390653530", "1.0.0", ""); @@ -151,9 +172,9 @@ class ResourcePacksPacketHandler extends PacketHandler{ } public function handleResourcePackChunkRequest(ResourcePackChunkRequestPacket $packet) : bool{ - $pack = $this->resourcePackManager->getPackById($packet->packId); + $pack = $this->getPackById($packet->packId); if(!($pack instanceof ResourcePack)){ - $this->disconnectWithError("Invalid request for chunk $packet->chunkIndex of unknown pack $packet->packId, available packs: " . implode(", ", $this->resourcePackManager->getPackIdList())); + $this->disconnectWithError("Invalid request for chunk $packet->chunkIndex of unknown pack $packet->packId, available packs: " . implode(", ", array_keys($this->resourcePacksById))); return false; } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 9fea3803d8..cc647da805 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -650,6 +650,11 @@ parameters: count: 2 path: ../../../src/network/mcpe/NetworkSession.php + - + message: "#^Parameter \\#1 \\$playerInfo of class pocketmine\\\\event\\\\player\\\\PlayerResourcePackOfferEvent constructor expects pocketmine\\\\player\\\\PlayerInfo, pocketmine\\\\player\\\\PlayerInfo\\|null given\\.$#" + count: 1 + path: ../../../src/network/mcpe/NetworkSession.php + - message: "#^Parameter \\#1 \\$target of method pocketmine\\\\command\\\\Command\\:\\:testPermissionSilent\\(\\) expects pocketmine\\\\command\\\\CommandSender, pocketmine\\\\player\\\\Player\\|null given\\.$#" count: 1 From 4b5ac532769036bdf3d6b9b8599f44ba7b906985 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Mar 2024 17:01:32 +0000 Subject: [PATCH 1638/1858] Fixes --- composer.json | 4 ++-- composer.lock | 34 ++++++++++++++--------------- src/network/mcpe/NetworkSession.php | 24 ++++++++++---------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/composer.json b/composer.json index 4ba5545945..80ad483a36 100644 --- a/composer.json +++ b/composer.json @@ -45,8 +45,8 @@ "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", "pocketmine/nbt": "~1.0.0", - "pocketmine/raklib": "^0.15.0", - "pocketmine/raklib-ipc": "^0.2.0", + "pocketmine/raklib": "~1.0.0", + "pocketmine/raklib-ipc": "~1.0.0", "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "~4.7.0", "symfony/filesystem": "~6.4.0" diff --git a/composer.lock b/composer.lock index c06fd4c787..d654c06c04 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f43d60f8c44393f5c42b7ba27cd8ccc0", + "content-hash": "651b773ac69b4a68e59f32b7a72ab357", "packages": [ { "name": "adhocore/json-comment", @@ -616,28 +616,28 @@ }, { "name": "pocketmine/raklib", - "version": "0.15.1", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/RakLib.git", - "reference": "79b7b4d1d7516dc6e322514453645ad9452b20ca" + "reference": "fd74ba254d2cfaed1369ae5684cf85773edaaae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/79b7b4d1d7516dc6e322514453645ad9452b20ca", - "reference": "79b7b4d1d7516dc6e322514453645ad9452b20ca", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/fd74ba254d2cfaed1369ae5684cf85773edaaae9", + "reference": "fd74ba254d2cfaed1369ae5684cf85773edaaae9", "shasum": "" }, "require": { "ext-sockets": "*", - "php": "^8.0", + "php": "^8.1", "php-64bit": "*", "php-ipv6": "*", "pocketmine/binaryutils": "^0.2.0", "pocketmine/log": "^0.3.0 || ^0.4.0" }, "require-dev": { - "phpstan/phpstan": "1.9.17", + "phpstan/phpstan": "1.10.1", "phpstan/phpstan-strict-rules": "^1.0" }, "type": "library", @@ -653,32 +653,32 @@ "description": "A RakNet server implementation written in PHP", "support": { "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/0.15.1" + "source": "https://github.com/pmmp/RakLib/tree/1.0.0" }, - "time": "2023-03-07T15:10:34+00:00" + "time": "2024-03-01T15:38:54+00:00" }, { "name": "pocketmine/raklib-ipc", - "version": "0.2.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/pmmp/RakLibIpc.git", - "reference": "26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c" + "reference": "ce632ef2c6743e71eddb5dc329c49af6555f90bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLibIpc/zipball/26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c", - "reference": "26ed56fa9db06e4ca6e8920c0ede2e01e219bb9c", + "url": "https://api.github.com/repos/pmmp/RakLibIpc/zipball/ce632ef2c6743e71eddb5dc329c49af6555f90bc", + "reference": "ce632ef2c6743e71eddb5dc329c49af6555f90bc", "shasum": "" }, "require": { "php": "^8.0", "php-64bit": "*", "pocketmine/binaryutils": "^0.2.0", - "pocketmine/raklib": "^0.15.0" + "pocketmine/raklib": "^0.15.0 || ^1.0.0" }, "require-dev": { - "phpstan/phpstan": "1.9.17", + "phpstan/phpstan": "1.10.1", "phpstan/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -694,9 +694,9 @@ "description": "Channel-based protocols for inter-thread/inter-process communication with RakLib", "support": { "issues": "https://github.com/pmmp/RakLibIpc/issues", - "source": "https://github.com/pmmp/RakLibIpc/tree/0.2.0" + "source": "https://github.com/pmmp/RakLibIpc/tree/1.0.1" }, - "time": "2023-02-13T13:40:40+00:00" + "time": "2024-03-01T15:55:05+00:00" }, { "name": "pocketmine/snooze", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index edb7f2549f..fb369855da 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -708,17 +708,6 @@ class NetworkSession{ $this->flushSendBuffer(true); $this->sender->close(""); - foreach($this->ackPromisesByReceiptId as $resolvers){ - foreach($resolvers as $resolver){ - $resolver->reject(); - } - } - $this->ackPromisesByReceiptId = []; - foreach($this->sendBufferAckPromises as $resolver){ - $resolver->reject(); - } - $this->sendBufferAckPromises = []; - foreach($this->disposeHooks as $callback){ $callback(); } @@ -726,6 +715,19 @@ class NetworkSession{ $this->setHandler(null); $this->connected = false; + $ackPromisesByReceiptId = $this->ackPromisesByReceiptId; + $this->ackPromisesByReceiptId = []; + foreach($ackPromisesByReceiptId as $resolvers){ + foreach($resolvers as $resolver){ + $resolver->reject(); + } + } + $sendBufferAckPromises = $this->sendBufferAckPromises; + $this->sendBufferAckPromises = []; + foreach($sendBufferAckPromises as $resolver){ + $resolver->reject(); + } + $this->logger->info($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_network_session_close($reason))); } } From 4abc36275cebcf4a74e667080f94ee459905df30 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Mar 2024 17:02:44 +0000 Subject: [PATCH 1639/1858] Remove newline --- src/network/mcpe/NetworkSession.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index fb369855da..ae90f3e641 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -707,7 +707,6 @@ class NetworkSession{ $this->disconnectGuard = false; $this->flushSendBuffer(true); $this->sender->close(""); - foreach($this->disposeHooks as $callback){ $callback(); } From b9a1ef1357e6b784f5f2de15e5a0b7bc31e296a5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Mar 2024 17:07:19 +0000 Subject: [PATCH 1640/1858] Throttle resource pack sending using ack receipts this isn't the best solution, as it limits the download speed somewhat, but it's relatively simple and works quite well. closes #3127 --- .../handler/ResourcePacksPacketHandler.php | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 3d413ee5a1..b9089d1460 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -50,11 +50,22 @@ use function substr; * packs to the client. */ class ResourcePacksPacketHandler extends PacketHandler{ - private const PACK_CHUNK_SIZE = 128 * 1024; //128KB + private const PACK_CHUNK_SIZE = 256 * 1024; //256KB + + /** + * Larger values allow downloading more chunks at the same time, increasing download speed, but the client may choke + * and cause the download speed to drop (due to ACKs taking too long to arrive). + */ + private const MAX_CONCURRENT_CHUNK_REQUESTS = 1; /** @var bool[][] uuid => [chunk index => hasSent] */ private array $downloadedChunks = []; + /** @phpstan-var \SplQueue */ + private \SplQueue $requestQueue; + + private int $activeRequests = 0; + /** * @phpstan-param \Closure() : void $completionCallback */ @@ -62,7 +73,9 @@ class ResourcePacksPacketHandler extends PacketHandler{ private NetworkSession $session, private ResourcePackManager $resourcePackManager, private \Closure $completionCallback - ){} + ){ + $this->requestQueue = new \SplQueue(); + } public function setUp() : void{ $resourcePackEntries = array_map(function(ResourcePack $pack) : ResourcePackInfoEntry{ @@ -176,8 +189,38 @@ class ResourcePacksPacketHandler extends PacketHandler{ $this->downloadedChunks[$packId][$packet->chunkIndex] = true; } - $this->session->sendDataPacket(ResourcePackChunkDataPacket::create($packId, $packet->chunkIndex, $offset, $pack->getPackChunk($offset, self::PACK_CHUNK_SIZE))); + $this->requestQueue->enqueue([$pack, $packet->chunkIndex]); + $this->processChunkRequestQueue(); return true; } + + private function processChunkRequestQueue() : void{ + if($this->activeRequests >= self::MAX_CONCURRENT_CHUNK_REQUESTS || $this->requestQueue->isEmpty()){ + return; + } + /** + * @var ResourcePack $pack + * @var int $chunkIndex + */ + [$pack, $chunkIndex] = $this->requestQueue->dequeue(); + + $packId = $pack->getPackId(); + $offset = $chunkIndex * self::PACK_CHUNK_SIZE; + $chunkData = $pack->getPackChunk($offset, self::PACK_CHUNK_SIZE); + $this->activeRequests++; + $this->session + ->sendDataPacketWithReceipt(ResourcePackChunkDataPacket::create($packId, $chunkIndex, $offset, $chunkData)) + ->onCompletion( + function() use ($packId, $chunkIndex) : void{ + $this->activeRequests--; + $this->processChunkRequestQueue(); + }, + function() : void{ + //this may have been rejected because of a disconnection - this will do nothing in that case + $this->disconnectWithError("Plugin interrupted sending of resource packs"); + } + ); + $this->session->getLogger()->debug("Sent resource pack $packId chunk $chunkIndex"); + } } From 72f3c0b4b9a4c6b5d1bc79a3b31d0568ccc2baa9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Mar 2024 17:36:40 +0000 Subject: [PATCH 1641/1858] NetworkSession: fixed timings not being stopped when handling uncompressed packets --- src/network/mcpe/NetworkSession.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 63fab278eb..7aa804370e 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -360,12 +360,12 @@ class NetworkSession{ } if($this->enableCompression){ - Timings::$playerNetworkReceiveDecompress->startTiming(); $compressionType = ord($payload[0]); $compressed = substr($payload, 1); if($compressionType === CompressionAlgorithm::NONE){ $decompressed = $compressed; }elseif($compressionType === $this->compressor->getNetworkId()){ + Timings::$playerNetworkReceiveDecompress->startTiming(); try{ $decompressed = $this->compressor->decompress($compressed); }catch(DecompressionException $e){ From f13eaaab05b3ff289d3bfd1ce285102221cf63cc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Mar 2024 00:08:49 +0000 Subject: [PATCH 1642/1858] Update RakLib --- composer.json | 2 +- composer.lock | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 80ad483a36..ecd7cf026d 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", "pocketmine/nbt": "~1.0.0", - "pocketmine/raklib": "~1.0.0", + "pocketmine/raklib": "dev-client-reliable-buffer as 1.0.0", "pocketmine/raklib-ipc": "~1.0.0", "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "~4.7.0", diff --git a/composer.lock b/composer.lock index d654c06c04..ef1aabe653 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "651b773ac69b4a68e59f32b7a72ab357", + "content-hash": "665baa60fbb39de57c133c35b26eb7c3", "packages": [ { "name": "adhocore/json-comment", @@ -616,17 +616,11 @@ }, { "name": "pocketmine/raklib", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/pmmp/RakLib.git", - "reference": "fd74ba254d2cfaed1369ae5684cf85773edaaae9" - }, + "version": "dev-client-reliable-buffer", "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/fd74ba254d2cfaed1369ae5684cf85773edaaae9", - "reference": "fd74ba254d2cfaed1369ae5684cf85773edaaae9", - "shasum": "" + "type": "path", + "url": "../deps/RakLib", + "reference": "90d8ce314ac59244d738d20313cb3525ab5d63d8" }, "require": { "ext-sockets": "*", @@ -646,16 +640,13 @@ "raklib\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-3.0" ], "description": "A RakNet server implementation written in PHP", - "support": { - "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/1.0.0" - }, - "time": "2024-03-01T15:38:54+00:00" + "transport-options": { + "relative": true + } }, { "name": "pocketmine/raklib-ipc", @@ -2928,9 +2919,18 @@ "time": "2023-11-20T00:12:19+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "pocketmine/raklib", + "version": "dev-client-reliable-buffer", + "alias": "1.0.0", + "alias_normalized": "1.0.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "pocketmine/raklib": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 5ad63f27bbd2b2f2601033520f58fadd0bb5a868 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Mar 2024 01:02:57 +0000 Subject: [PATCH 1643/1858] Update RakLib (again) --- composer.lock | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index ef1aabe653..e12dc5439e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "665baa60fbb39de57c133c35b26eb7c3", + "content-hash": "4e1a278e68755522f194fba9b29cd3e2", "packages": [ { "name": "adhocore/json-comment", @@ -617,10 +617,16 @@ { "name": "pocketmine/raklib", "version": "dev-client-reliable-buffer", + "source": { + "type": "git", + "url": "https://github.com/pmmp/RakLib.git", + "reference": "b1a31e87f0aadeb5894939ded01f60f1259657c5" + }, "dist": { - "type": "path", - "url": "../deps/RakLib", - "reference": "90d8ce314ac59244d738d20313cb3525ab5d63d8" + "type": "zip", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/b1a31e87f0aadeb5894939ded01f60f1259657c5", + "reference": "b1a31e87f0aadeb5894939ded01f60f1259657c5", + "shasum": "" }, "require": { "ext-sockets": "*", @@ -640,13 +646,16 @@ "raklib\\": "src/" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-3.0" ], "description": "A RakNet server implementation written in PHP", - "transport-options": { - "relative": true - } + "support": { + "issues": "https://github.com/pmmp/RakLib/issues", + "source": "https://github.com/pmmp/RakLib/tree/client-reliable-buffer" + }, + "time": "2024-03-02T01:02:00+00:00" }, { "name": "pocketmine/raklib-ipc", From 2ca50ecd364297cf6ddae51e74aeb269d57f7ea1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:54:53 +0000 Subject: [PATCH 1644/1858] Bump shivammathur/setup-php from 2.29.0 to 2.30.0 (#6273) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.29.0 to 2.30.0. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.29.0...2.30.0) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index f02f047123..2fbfa11f2c 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.29.0 + uses: shivammathur/setup-php@2.30.0 with: php-version: 8.2 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 9b780b4e3c..4521988a92 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.29.0 + uses: shivammathur/setup-php@2.30.0 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ebe5d9cb57..3dbcd6ddd5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.29.0 + uses: shivammathur/setup-php@2.30.0 with: php-version: 8.2 tools: php-cs-fixer:3.49 From 781e3643dde7f7bc0313cdc1a276d208b2c0e89f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Mar 2024 14:25:47 +0000 Subject: [PATCH 1645/1858] Clean up --- composer.json | 2 +- composer.lock | 27 +++++++------------ .../handler/ResourcePacksPacketHandler.php | 3 +-- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/composer.json b/composer.json index ecd7cf026d..16811f7e11 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", "pocketmine/nbt": "~1.0.0", - "pocketmine/raklib": "dev-client-reliable-buffer as 1.0.0", + "pocketmine/raklib": "~1.1.0", "pocketmine/raklib-ipc": "~1.0.0", "pocketmine/snooze": "^0.5.0", "ramsey/uuid": "~4.7.0", diff --git a/composer.lock b/composer.lock index e12dc5439e..e76cfcd04d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4e1a278e68755522f194fba9b29cd3e2", + "content-hash": "22ebdaff13a226edba97ff5405eac16c", "packages": [ { "name": "adhocore/json-comment", @@ -616,16 +616,16 @@ }, { "name": "pocketmine/raklib", - "version": "dev-client-reliable-buffer", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/pmmp/RakLib.git", - "reference": "b1a31e87f0aadeb5894939ded01f60f1259657c5" + "reference": "be2783be516bf6e2872ff5c81fb9048596617b97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/RakLib/zipball/b1a31e87f0aadeb5894939ded01f60f1259657c5", - "reference": "b1a31e87f0aadeb5894939ded01f60f1259657c5", + "url": "https://api.github.com/repos/pmmp/RakLib/zipball/be2783be516bf6e2872ff5c81fb9048596617b97", + "reference": "be2783be516bf6e2872ff5c81fb9048596617b97", "shasum": "" }, "require": { @@ -653,9 +653,9 @@ "description": "A RakNet server implementation written in PHP", "support": { "issues": "https://github.com/pmmp/RakLib/issues", - "source": "https://github.com/pmmp/RakLib/tree/client-reliable-buffer" + "source": "https://github.com/pmmp/RakLib/tree/1.1.1" }, - "time": "2024-03-02T01:02:00+00:00" + "time": "2024-03-04T14:02:14+00:00" }, { "name": "pocketmine/raklib-ipc", @@ -2928,18 +2928,9 @@ "time": "2023-11-20T00:12:19+00:00" } ], - "aliases": [ - { - "package": "pocketmine/raklib", - "version": "dev-client-reliable-buffer", - "alias": "1.0.0", - "alias_normalized": "1.0.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "pocketmine/raklib": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index b9089d1460..14ab3280d5 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -212,7 +212,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ $this->session ->sendDataPacketWithReceipt(ResourcePackChunkDataPacket::create($packId, $chunkIndex, $offset, $chunkData)) ->onCompletion( - function() use ($packId, $chunkIndex) : void{ + function() : void{ $this->activeRequests--; $this->processChunkRequestQueue(); }, @@ -221,6 +221,5 @@ class ResourcePacksPacketHandler extends PacketHandler{ $this->disconnectWithError("Plugin interrupted sending of resource packs"); } ); - $this->session->getLogger()->debug("Sent resource pack $packId chunk $chunkIndex"); } } From 5cb69e00d0561e37c771dafbebfeab1714757c67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Mar 2024 14:36:40 +0000 Subject: [PATCH 1646/1858] NetworkSession: remove hardcoded limit this is already covered by the dynamic Game Packets rate limit, which is much more effective at dealing with this anyway. --- src/network/mcpe/NetworkSession.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7aa804370e..0b55ae1d80 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -383,12 +383,8 @@ class NetworkSession{ try{ $stream = new BinaryStream($decompressed); - $count = 0; foreach(PacketBatch::decodeRaw($stream) as $buffer){ $this->gamePacketLimiter->decrement(); - if(++$count > 100){ - throw new PacketHandlingException("Too many packets in batch"); - } $packet = $this->packetPool->getPacket($buffer); if($packet === null){ $this->logger->debug("Unknown packet: " . base64_encode($buffer)); From b0390a39fd1eb2d5b524f834fd0866057574d34f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Mar 2024 15:17:48 +0000 Subject: [PATCH 1647/1858] Update composer dependencies --- composer.json | 2 +- composer.lock | 202 +++++++++++++++++++++++++------------------------- 2 files changed, 103 insertions(+), 101 deletions(-) diff --git a/composer.json b/composer.json index 4ba5545945..7b61549d5a 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.58", + "phpstan/phpstan": "1.10.59", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index c06fd4c787..9641f81e7d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f43d60f8c44393f5c42b7ba27cd8ccc0", + "content-hash": "f9a2f433a86f9ea1351d6dc81b508160", "packages": [ { "name": "adhocore/json-comment", @@ -200,16 +200,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "28.0.0+bedrock-1.20.60", + "version": "28.0.1+bedrock-1.20.60", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "6e73f21cdc7433f0674dfcdf4817f478aa5528e6" + "reference": "fdb0d1ddee498f995fbd21b9077aac3d3518877e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/6e73f21cdc7433f0674dfcdf4817f478aa5528e6", - "reference": "6e73f21cdc7433f0674dfcdf4817f478aa5528e6", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/fdb0d1ddee498f995fbd21b9077aac3d3518877e", + "reference": "fdb0d1ddee498f995fbd21b9077aac3d3518877e", "shasum": "" }, "require": { @@ -240,22 +240,22 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/28.0.0+bedrock-1.20.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/28.0.1+bedrock-1.20.60" }, - "time": "2024-02-26T16:18:34+00:00" + "time": "2024-03-01T21:49:48+00:00" }, { "name": "pocketmine/binaryutils", - "version": "0.2.4", + "version": "0.2.6", "source": { "type": "git", "url": "https://github.com/pmmp/BinaryUtils.git", - "reference": "5ac7eea91afbad8dc498f5ce34ce6297d5e6ea9a" + "reference": "ccfc1899b859d45814ea3592e20ebec4cb731c84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/5ac7eea91afbad8dc498f5ce34ce6297d5e6ea9a", - "reference": "5ac7eea91afbad8dc498f5ce34ce6297d5e6ea9a", + "url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/ccfc1899b859d45814ea3592e20ebec4cb731c84", + "reference": "ccfc1899b859d45814ea3592e20ebec4cb731c84", "shasum": "" }, "require": { @@ -264,10 +264,10 @@ }, "require-dev": { "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "1.3.0", + "phpstan/phpstan": "~1.10.3", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1.0.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5 || ^10.0 || ^11.0" }, "type": "library", "autoload": { @@ -282,9 +282,9 @@ "description": "Classes and methods for conveniently handling binary data", "support": { "issues": "https://github.com/pmmp/BinaryUtils/issues", - "source": "https://github.com/pmmp/BinaryUtils/tree/0.2.4" + "source": "https://github.com/pmmp/BinaryUtils/tree/0.2.6" }, - "time": "2022-01-12T18:06:33+00:00" + "time": "2024-03-04T15:04:17+00:00" }, { "name": "pocketmine/callback-validator", @@ -921,16 +921,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", "shasum": "" }, "require": { @@ -964,7 +964,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" }, "funding": [ { @@ -980,20 +980,20 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:27:13+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -1007,9 +1007,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1046,7 +1043,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -1062,20 +1059,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -1089,9 +1086,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1129,7 +1123,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -1145,7 +1139,7 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" } ], "packages-dev": [ @@ -1210,16 +1204,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69", + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69", "shasum": "" }, "require": { @@ -1262,26 +1256,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1" }, - "time": "2024-01-07T17:17:35+00:00" + "time": "2024-02-21T19:24:10+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -1322,9 +1317,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -1379,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.10.59", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "e607609388d3a6d418a50a49f7940e8086798281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", + "reference": "e607609388d3a6d418a50a49f7940e8086798281", "shasum": "" }, "require": { @@ -1437,20 +1438,20 @@ "type": "tidelift" } ], - "time": "2024-02-12T20:02:57+00:00" + "time": "2024-02-20T13:59:13+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.15", + "version": "1.3.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a" + "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/70ecacc64fe8090d8d2a33db5a51fe8e88acd93a", - "reference": "70ecacc64fe8090d8d2a33db5a51fe8e88acd93a", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d5242a59d035e46774f2e634b374bc39ff62cb95", + "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95", "shasum": "" }, "require": { @@ -1487,9 +1488,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.15" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.16" }, - "time": "2023-10-09T18:58:39+00:00" + "time": "2024-02-23T09:51:20+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -1542,16 +1543,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", "shasum": "" }, "require": { @@ -1608,7 +1609,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" }, "funding": [ { @@ -1616,7 +1617,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-03-02T07:22:05+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1964,16 +1965,16 @@ }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -2008,7 +2009,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -2016,7 +2018,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -2266,16 +2268,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -2283,7 +2285,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -2321,7 +2323,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -2329,7 +2331,7 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", @@ -2397,16 +2399,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -2463,7 +2465,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -2471,20 +2473,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -2518,14 +2520,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -2533,7 +2535,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -2879,16 +2881,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -2917,7 +2919,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -2925,7 +2927,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], From ac8dbf864033504c59de3cddf6016710c06af7c1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Mar 2024 12:56:49 +0000 Subject: [PATCH 1648/1858] BlockStateUpgrader: extract state remap to its own function --- .../block/upgrade/BlockStateUpgrader.php | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 582039305c..f8574d6a26 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -69,44 +69,14 @@ final class BlockStateUpgrader{ //didn't always bump the blockstate version when changing it :( continue; } - $oldName = $blockStateData->getName(); - $oldState = $blockStateData->getStates(); - if(isset($schema->remappedStates[$oldName])){ - foreach($schema->remappedStates[$oldName] as $remap){ - if(count($remap->oldState) > count($oldState)){ - //match criteria has more requirements than we have state properties - continue; //try next state - } - foreach(Utils::stringifyKeys($remap->oldState) as $k => $v){ - if(!isset($oldState[$k]) || !$oldState[$k]->equals($v)){ - continue 2; //try next state - } - } - if(is_string($remap->newName)){ - $newName = $remap->newName; - }else{ - $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; - if($flattenedValue instanceof StringTag){ - $newName = sprintf("%s%s%s", $remap->newName->prefix, $flattenedValue->getValue(), $remap->newName->suffix); - unset($oldState[$remap->newName->flattenedProperty]); - }else{ - //flattened property is not a TAG_String, so this transformation is not applicable - continue; - } - } - - $newState = $remap->newState; - foreach($remap->copiedState as $stateName){ - if(isset($oldState[$stateName])){ - $newState[$stateName] = $oldState[$stateName]; - } - } - - $blockStateData = new BlockStateData($newName, $newState, $resultVersion); - continue 2; //try next schema - } + $newStateData = $this->applyStateRemapped($schema, $blockStateData); + if($newStateData !== null){ + $blockStateData = $newStateData; + continue; } + + $oldName = $blockStateData->getName(); $newName = $schema->renamedIds[$oldName] ?? null; $stateChanges = 0; @@ -131,6 +101,49 @@ final class BlockStateUpgrader{ return $blockStateData; } + private function applyStateRemapped(BlockStateUpgradeSchema $schema, BlockStateData $blockStateData) : ?BlockStateData{ + $oldName = $blockStateData->getName(); + $oldState = $blockStateData->getStates(); + + if(isset($schema->remappedStates[$oldName])){ + foreach($schema->remappedStates[$oldName] as $remap){ + if(count($remap->oldState) > count($oldState)){ + //match criteria has more requirements than we have state properties + continue; //try next state + } + foreach(Utils::stringifyKeys($remap->oldState) as $k => $v){ + if(!isset($oldState[$k]) || !$oldState[$k]->equals($v)){ + continue 2; //try next state + } + } + + if(is_string($remap->newName)){ + $newName = $remap->newName; + }else{ + $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; + if($flattenedValue instanceof StringTag){ + $newName = sprintf("%s%s%s", $remap->newName->prefix, $flattenedValue->getValue(), $remap->newName->suffix); + unset($oldState[$remap->newName->flattenedProperty]); + }else{ + //flattened property is not a TAG_String, so this transformation is not applicable + continue; + } + } + + $newState = $remap->newState; + foreach($remap->copiedState as $stateName){ + if(isset($oldState[$stateName])){ + $newState[$stateName] = $oldState[$stateName]; + } + } + + return new BlockStateData($newName, $newState, $schema->getVersionId()); + } + } + + return null; + } + /** * @param Tag[] $states * @phpstan-param array $states From 9d7aec589175cb59089539cd2384e0fda9eb483c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:30:03 +0000 Subject: [PATCH 1649/1858] Bump phpstan/phpstan from 1.10.59 to 1.10.60 (#6282) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.59 to 1.10.60. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.59...1.10.60) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 7b61549d5a..895fa7ecc7 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.59", + "phpstan/phpstan": "1.10.60", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 9641f81e7d..d4c63202e7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f9a2f433a86f9ea1351d6dc81b508160", + "content-hash": "a6b02985f32591475760c53e7104e2e4", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.59", + "version": "1.10.60", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e607609388d3a6d418a50a49f7940e8086798281" + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", - "reference": "e607609388d3a6d418a50a49f7940e8086798281", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:59:13+00:00" + "time": "2024-03-07T13:30:19+00:00" }, { "name": "phpstan/phpstan-phpunit", From cbffbd23f9db288c796b4878dcecbfbb5bdc88c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:30:29 +0000 Subject: [PATCH 1650/1858] Bump docker/build-push-action from 5.1.0 to 5.2.0 (#6281) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5.1.0...v5.2.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index a8ec707dad..ea8137f89e 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v5.1.0 + uses: docker/build-push-action@v5.2.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.1.0 + uses: docker/build-push-action@v5.2.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.1.0 + uses: docker/build-push-action@v5.2.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.1.0 + uses: docker/build-push-action@v5.2.0 with: push: true context: ./pocketmine-mp From 8ec304e66e489b1dd4d4c2f7b6493e70212a01e3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 12 Mar 2024 11:45:08 +0000 Subject: [PATCH 1651/1858] BlockStateUpgradeSchema: avoid unnecessary property access and calculation this was costing a surprisingly large 5-10% of the processing time for blockstate data. --- .../block/upgrade/BlockStateUpgradeSchema.php | 16 ++++++++++------ .../bedrock/block/upgrade/BlockStateUpgrader.php | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php index 36960383e2..6d280ecf75 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php @@ -64,20 +64,24 @@ final class BlockStateUpgradeSchema{ */ public array $remappedStates = []; + public readonly int $versionId; + public function __construct( - public int $maxVersionMajor, - public int $maxVersionMinor, - public int $maxVersionPatch, - public int $maxVersionRevision, + public readonly int $maxVersionMajor, + public readonly int $maxVersionMinor, + public readonly int $maxVersionPatch, + public readonly int $maxVersionRevision, private int $schemaId - ){} + ){ + $this->versionId = ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; + } /** * @deprecated This is defined by Mojang, and therefore cannot be relied on. Use getSchemaId() instead for * internal version management. */ public function getVersionId() : int{ - return ($this->maxVersionMajor << 24) | ($this->maxVersionMinor << 16) | ($this->maxVersionPatch << 8) | $this->maxVersionRevision; + return $this->versionId; } public function getSchemaId() : int{ return $this->schemaId; } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index f8574d6a26..e91a5cf60c 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -62,7 +62,7 @@ final class BlockStateUpgrader{ $version = $blockStateData->getVersion(); $highestVersion = $version; foreach($this->upgradeSchemas as $schema){ - $resultVersion = $schema->getVersionId(); + $resultVersion = $schema->versionId; $highestVersion = max($highestVersion, $resultVersion); if($version > $resultVersion){ //even if this is actually the same version, we have to apply it anyway because mojang are dumb and From a6202d0442029ffe628484cb9ac1135e400229d4 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 12 Mar 2024 11:48:48 +0000 Subject: [PATCH 1652/1858] BlockStateUpgrader: calculate output version ID in a less stupid way this improves the performance by a conservative 10%. --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index e91a5cf60c..501ca750ad 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -38,6 +38,8 @@ final class BlockStateUpgrader{ /** @var BlockStateUpgradeSchema[] */ private array $upgradeSchemas = []; + private int $outputVersion = 0; + /** * @param BlockStateUpgradeSchema[] $upgradeSchemas * @phpstan-param array $upgradeSchemas @@ -56,14 +58,14 @@ final class BlockStateUpgrader{ $this->upgradeSchemas[$schemaId] = $schema; ksort($this->upgradeSchemas, SORT_NUMERIC); + + $this->outputVersion = max($this->outputVersion, $schema->getVersionId()); } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ $version = $blockStateData->getVersion(); - $highestVersion = $version; foreach($this->upgradeSchemas as $schema){ $resultVersion = $schema->versionId; - $highestVersion = max($highestVersion, $resultVersion); if($version > $resultVersion){ //even if this is actually the same version, we have to apply it anyway because mojang are dumb and //didn't always bump the blockstate version when changing it :( @@ -93,10 +95,10 @@ final class BlockStateUpgrader{ } } - if($highestVersion > $version){ + if($this->outputVersion > $version){ //always update the version number of the blockstate, even if it didn't change - this is needed for //external tools - $blockStateData = new BlockStateData($blockStateData->getName(), $blockStateData->getStates(), $highestVersion); + $blockStateData = new BlockStateData($blockStateData->getName(), $blockStateData->getStates(), $this->outputVersion); } return $blockStateData; } From 264ce06cbf237620afedec0bf8b23bba801aa73c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 12 Mar 2024 16:51:12 +0000 Subject: [PATCH 1653/1858] Updated composer dependencies --- composer.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index d4c63202e7..190ac3e6be 100644 --- a/composer.lock +++ b/composer.lock @@ -1204,16 +1204,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.1", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69", - "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { @@ -1256,9 +1256,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2024-02-21T19:24:10+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "phar-io/manifest", @@ -1543,16 +1543,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.12", + "version": "10.1.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "shasum": "" }, "require": { @@ -1609,7 +1609,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" }, "funding": [ { @@ -1617,7 +1617,7 @@ "type": "github" } ], - "time": "2024-03-02T07:22:05+00:00" + "time": "2024-03-12T15:33:41+00:00" }, { "name": "phpunit/php-file-iterator", From 23f4632409847e040a70572852f540cda2f31304 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 13:48:56 +0000 Subject: [PATCH 1654/1858] Release 5.12.1 --- changelogs/5.12.md | 9 +++++++++ src/VersionInfo.php | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelogs/5.12.md b/changelogs/5.12.md index f1857efa4e..a23f83e56d 100644 --- a/changelogs/5.12.md +++ b/changelogs/5.12.md @@ -52,3 +52,12 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - Authentication system no longer accepts logins signed with the old Mojang root public key. - ID to enum mappings in `pocketmine\data` now use a new `match` convention to allow static analysis to ensure that all enum cases are handled. - Updated version of `pocketmine/bedrock-protocol` allows avoiding decoding of some itemstack data from the client in most cases, improving performance. + +# 5.12.1 +Released 13th March 2024. + +## Fixes +- Fixed `Player Network Receive - Decompression` timings not being stopped correctly when receiving an uncompressed packet. + +## Internals +- Removed hardcoded batch packet size limit. This was already covered by other limits anyway. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 794ed17d71..050ade5fa2 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.12.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From e105c9bd76b3986e8466c7ea07bf74396d060fab Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 13:48:59 +0000 Subject: [PATCH 1655/1858] 5.12.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 050ade5fa2..92057c0c2b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.12.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.12.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From ba48f258f37aee7b935d9ed9b63081ab13779a90 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 14:53:27 +0000 Subject: [PATCH 1656/1858] Support for 1.20.70 --- composer.json | 8 +-- composer.lock | 50 ++++++++--------- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 4 +- .../bedrock/block/BlockStateStringValues.php | 20 ++----- src/data/bedrock/block/BlockTypeNames.php | 38 +++++++++++-- .../convert/BlockObjectToStateSerializer.php | 56 +++++++------------ .../convert/BlockStateDeserializerHelper.php | 14 ----- .../convert/BlockStateSerializerHelper.php | 23 -------- .../BlockStateToObjectDeserializer.php | 56 +++++++------------ .../block/convert/BlockStateWriter.php | 14 ----- src/data/bedrock/item/ItemTypeNames.php | 6 ++ src/entity/Entity.php | 2 +- .../mcpe/StandardEntityEventBroadcaster.php | 5 +- .../mcpe/handler/InGamePacketHandler.php | 16 ------ .../handler/ResourcePacksPacketHandler.php | 10 +++- src/player/Player.php | 2 +- src/world/format/io/data/BedrockWorldData.php | 6 +- 18 files changed, 130 insertions(+), 204 deletions(-) diff --git a/composer.json b/composer.json index 895fa7ecc7..962777275e 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~3.5.0+bedrock-1.20.60", - "pocketmine/bedrock-data": "~2.8.0+bedrock-1.20.60", - "pocketmine/bedrock-item-upgrade-schema": "~1.7.0+bedrock-1.20.60", - "pocketmine/bedrock-protocol": "~28.0.0+bedrock-1.20.60", + "pocketmine/bedrock-block-upgrade-schema": "~3.6.0+bedrock-1.20.70", + "pocketmine/bedrock-data": "~2.9.0+bedrock-1.20.70", + "pocketmine/bedrock-item-upgrade-schema": "~1.8.0+bedrock-1.20.70", + "pocketmine/bedrock-protocol": "~29.0.0+bedrock-1.20.70", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 190ac3e6be..0b04e40df1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a6b02985f32591475760c53e7104e2e4", + "content-hash": "e861861cb1f632e1db21efc6875a0aba", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "1ed4ba738333c4b4afe4fef8e9326a45c89f12e3" + "reference": "1496e275db5148cb96bdaa998115e5e31a5c1e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/1ed4ba738333c4b4afe4fef8e9326a45c89f12e3", - "reference": "1ed4ba738333c4b4afe4fef8e9326a45c89f12e3", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/1496e275db5148cb96bdaa998115e5e31a5c1e4d", + "reference": "1496e275db5148cb96bdaa998115e5e31a5c1e4d", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.5.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.6.0" }, - "time": "2024-02-07T11:46:50+00:00" + "time": "2024-02-28T19:25:25+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.8.0+bedrock-1.20.60", + "version": "2.9.0+bedrock-1.20.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "d8ea0355b7c835564af9fe6e273e650ac62c84a2" + "reference": "10b6696b662fd80a282eff7dca6c99d321c5b9e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d8ea0355b7c835564af9fe6e273e650ac62c84a2", - "reference": "d8ea0355b7c835564af9fe6e273e650ac62c84a2", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/10b6696b662fd80a282eff7dca6c99d321c5b9e3", + "reference": "10b6696b662fd80a282eff7dca6c99d321c5b9e3", "shasum": "" }, "type": "library", @@ -168,22 +168,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.60" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.70" }, - "time": "2024-02-07T11:23:46+00:00" + "time": "2024-03-13T13:55:05+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "69772dd58e2b2c7b7513fa2bcdc46e782228641c" + "reference": "4c4dc3bbceb944c5de429b6e752ab7a15652078c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/69772dd58e2b2c7b7513fa2bcdc46e782228641c", - "reference": "69772dd58e2b2c7b7513fa2bcdc46e782228641c", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/4c4dc3bbceb944c5de429b6e752ab7a15652078c", + "reference": "4c4dc3bbceb944c5de429b6e752ab7a15652078c", "shasum": "" }, "type": "library", @@ -194,22 +194,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.7.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.8.0" }, - "time": "2024-02-07T11:58:05+00:00" + "time": "2024-02-28T19:25:53+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "28.0.1+bedrock-1.20.60", + "version": "29.0.0+bedrock-1.20.70", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "fdb0d1ddee498f995fbd21b9077aac3d3518877e" + "reference": "8d63f39bb2cded3d3e578fd3cf7bc769b9674857" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/fdb0d1ddee498f995fbd21b9077aac3d3518877e", - "reference": "fdb0d1ddee498f995fbd21b9077aac3d3518877e", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/8d63f39bb2cded3d3e578fd3cf7bc769b9674857", + "reference": "8d63f39bb2cded3d3e578fd3cf7bc769b9674857", "shasum": "" }, "require": { @@ -240,9 +240,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/28.0.1+bedrock-1.20.60" + "source": "https://github.com/pmmp/BedrockProtocol/tree/29.0.0+bedrock-1.20.70" }, - "time": "2024-03-01T21:49:48+00:00" + "time": "2024-03-13T14:35:54+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index b089eea5bd..ea8e9f5b8a 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (60 << 8) | //patch - (1); //revision + (70 << 8) | //patch + (4); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 75b45e88ec..72b237ddf9 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -105,9 +105,7 @@ final class BlockStateNames{ public const MOISTURIZED_AMOUNT = "moisturized_amount"; public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; - public const NEW_LEAF_TYPE = "new_leaf_type"; public const OCCUPIED_BIT = "occupied_bit"; - public const OLD_LEAF_TYPE = "old_leaf_type"; public const OPEN_BIT = "open_bit"; public const ORIENTATION = "orientation"; public const OUTPUT_LIT_BIT = "output_lit_bit"; @@ -151,6 +149,7 @@ final class BlockStateNames{ public const UPDATE_BIT = "update_bit"; public const UPPER_BLOCK_BIT = "upper_block_bit"; public const UPSIDE_DOWN_BIT = "upside_down_bit"; + public const VAULT_STATE = "vault_state"; public const VINE_DIRECTION_BITS = "vine_direction_bits"; public const WALL_BLOCK_TYPE = "wall_block_type"; public const WALL_CONNECTION_TYPE_EAST = "wall_connection_type_east"; @@ -160,5 +159,4 @@ final class BlockStateNames{ public const WALL_POST_BIT = "wall_post_bit"; public const WEEPING_VINES_AGE = "weeping_vines_age"; public const WEIRDO_DIRECTION = "weirdo_direction"; - public const WOOD_TYPE = "wood_type"; } diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index d9d8a748d0..202bfa34de 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -143,14 +143,6 @@ final class BlockStateStringValues{ public const MONSTER_EGG_STONE_TYPE_STONE = "stone"; public const MONSTER_EGG_STONE_TYPE_STONE_BRICK = "stone_brick"; - public const NEW_LEAF_TYPE_ACACIA = "acacia"; - public const NEW_LEAF_TYPE_DARK_OAK = "dark_oak"; - - public const OLD_LEAF_TYPE_BIRCH = "birch"; - public const OLD_LEAF_TYPE_JUNGLE = "jungle"; - public const OLD_LEAF_TYPE_OAK = "oak"; - public const OLD_LEAF_TYPE_SPRUCE = "spruce"; - public const ORIENTATION_DOWN_EAST = "down_east"; public const ORIENTATION_DOWN_NORTH = "down_north"; public const ORIENTATION_DOWN_SOUTH = "down_south"; @@ -264,6 +256,11 @@ final class BlockStateStringValues{ public const TURTLE_EGG_COUNT_THREE_EGG = "three_egg"; public const TURTLE_EGG_COUNT_TWO_EGG = "two_egg"; + public const VAULT_STATE_ACTIVE = "active"; + public const VAULT_STATE_EJECTING = "ejecting"; + public const VAULT_STATE_INACTIVE = "inactive"; + public const VAULT_STATE_UNLOCKING = "unlocking"; + public const WALL_BLOCK_TYPE_ANDESITE = "andesite"; public const WALL_BLOCK_TYPE_BRICK = "brick"; public const WALL_BLOCK_TYPE_COBBLESTONE = "cobblestone"; @@ -295,11 +292,4 @@ final class BlockStateStringValues{ public const WALL_CONNECTION_TYPE_WEST_SHORT = "short"; public const WALL_CONNECTION_TYPE_WEST_TALL = "tall"; - public const WOOD_TYPE_ACACIA = "acacia"; - public const WOOD_TYPE_BIRCH = "birch"; - public const WOOD_TYPE_DARK_OAK = "dark_oak"; - public const WOOD_TYPE_JUNGLE = "jungle"; - public const WOOD_TYPE_OAK = "oak"; - public const WOOD_TYPE_SPRUCE = "spruce"; - } diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 1d8bfadfa4..614394f04c 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -33,16 +33,20 @@ final class BlockTypeNames{ public const ACACIA_BUTTON = "minecraft:acacia_button"; public const ACACIA_DOOR = "minecraft:acacia_door"; + public const ACACIA_DOUBLE_SLAB = "minecraft:acacia_double_slab"; public const ACACIA_FENCE = "minecraft:acacia_fence"; public const ACACIA_FENCE_GATE = "minecraft:acacia_fence_gate"; public const ACACIA_HANGING_SIGN = "minecraft:acacia_hanging_sign"; + public const ACACIA_LEAVES = "minecraft:acacia_leaves"; public const ACACIA_LOG = "minecraft:acacia_log"; public const ACACIA_PLANKS = "minecraft:acacia_planks"; public const ACACIA_PRESSURE_PLATE = "minecraft:acacia_pressure_plate"; + public const ACACIA_SLAB = "minecraft:acacia_slab"; public const ACACIA_STAIRS = "minecraft:acacia_stairs"; public const ACACIA_STANDING_SIGN = "minecraft:acacia_standing_sign"; public const ACACIA_TRAPDOOR = "minecraft:acacia_trapdoor"; public const ACACIA_WALL_SIGN = "minecraft:acacia_wall_sign"; + public const ACACIA_WOOD = "minecraft:acacia_wood"; public const ACTIVATOR_RAIL = "minecraft:activator_rail"; public const AIR = "minecraft:air"; public const ALLOW = "minecraft:allow"; @@ -88,16 +92,20 @@ final class BlockTypeNames{ public const BIG_DRIPLEAF = "minecraft:big_dripleaf"; public const BIRCH_BUTTON = "minecraft:birch_button"; public const BIRCH_DOOR = "minecraft:birch_door"; + public const BIRCH_DOUBLE_SLAB = "minecraft:birch_double_slab"; public const BIRCH_FENCE = "minecraft:birch_fence"; public const BIRCH_FENCE_GATE = "minecraft:birch_fence_gate"; public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; + public const BIRCH_LEAVES = "minecraft:birch_leaves"; public const BIRCH_LOG = "minecraft:birch_log"; public const BIRCH_PLANKS = "minecraft:birch_planks"; public const BIRCH_PRESSURE_PLATE = "minecraft:birch_pressure_plate"; + public const BIRCH_SLAB = "minecraft:birch_slab"; public const BIRCH_STAIRS = "minecraft:birch_stairs"; public const BIRCH_STANDING_SIGN = "minecraft:birch_standing_sign"; public const BIRCH_TRAPDOOR = "minecraft:birch_trapdoor"; public const BIRCH_WALL_SIGN = "minecraft:birch_wall_sign"; + public const BIRCH_WOOD = "minecraft:birch_wood"; public const BLACK_CANDLE = "minecraft:black_candle"; public const BLACK_CANDLE_CAKE = "minecraft:black_candle_cake"; public const BLACK_CARPET = "minecraft:black_carpet"; @@ -266,14 +274,18 @@ final class BlockTypeNames{ public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; + public const DARK_OAK_DOUBLE_SLAB = "minecraft:dark_oak_double_slab"; public const DARK_OAK_FENCE = "minecraft:dark_oak_fence"; public const DARK_OAK_FENCE_GATE = "minecraft:dark_oak_fence_gate"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; + public const DARK_OAK_LEAVES = "minecraft:dark_oak_leaves"; public const DARK_OAK_LOG = "minecraft:dark_oak_log"; public const DARK_OAK_PLANKS = "minecraft:dark_oak_planks"; public const DARK_OAK_PRESSURE_PLATE = "minecraft:dark_oak_pressure_plate"; + public const DARK_OAK_SLAB = "minecraft:dark_oak_slab"; public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; + public const DARK_OAK_WOOD = "minecraft:dark_oak_wood"; public const DARK_PRISMARINE_STAIRS = "minecraft:dark_prismarine_stairs"; public const DARKOAK_STANDING_SIGN = "minecraft:darkoak_standing_sign"; public const DARKOAK_WALL_SIGN = "minecraft:darkoak_wall_sign"; @@ -320,7 +332,6 @@ final class BlockTypeNames{ public const DOUBLE_STONE_BLOCK_SLAB2 = "minecraft:double_stone_block_slab2"; public const DOUBLE_STONE_BLOCK_SLAB3 = "minecraft:double_stone_block_slab3"; public const DOUBLE_STONE_BLOCK_SLAB4 = "minecraft:double_stone_block_slab4"; - public const DOUBLE_WOODEN_SLAB = "minecraft:double_wooden_slab"; public const DRAGON_EGG = "minecraft:dragon_egg"; public const DRIED_KELP_BLOCK = "minecraft:dried_kelp_block"; public const DRIPSTONE_BLOCK = "minecraft:dripstone_block"; @@ -490,7 +501,7 @@ final class BlockTypeNames{ public const GOLDEN_RAIL = "minecraft:golden_rail"; public const GRANITE = "minecraft:granite"; public const GRANITE_STAIRS = "minecraft:granite_stairs"; - public const GRASS = "minecraft:grass"; + public const GRASS_BLOCK = "minecraft:grass_block"; public const GRASS_PATH = "minecraft:grass_path"; public const GRAVEL = "minecraft:gravel"; public const GRAY_CANDLE = "minecraft:gray_candle"; @@ -572,16 +583,20 @@ final class BlockTypeNames{ public const JUKEBOX = "minecraft:jukebox"; public const JUNGLE_BUTTON = "minecraft:jungle_button"; public const JUNGLE_DOOR = "minecraft:jungle_door"; + public const JUNGLE_DOUBLE_SLAB = "minecraft:jungle_double_slab"; public const JUNGLE_FENCE = "minecraft:jungle_fence"; public const JUNGLE_FENCE_GATE = "minecraft:jungle_fence_gate"; public const JUNGLE_HANGING_SIGN = "minecraft:jungle_hanging_sign"; + public const JUNGLE_LEAVES = "minecraft:jungle_leaves"; public const JUNGLE_LOG = "minecraft:jungle_log"; public const JUNGLE_PLANKS = "minecraft:jungle_planks"; public const JUNGLE_PRESSURE_PLATE = "minecraft:jungle_pressure_plate"; + public const JUNGLE_SLAB = "minecraft:jungle_slab"; public const JUNGLE_STAIRS = "minecraft:jungle_stairs"; public const JUNGLE_STANDING_SIGN = "minecraft:jungle_standing_sign"; public const JUNGLE_TRAPDOOR = "minecraft:jungle_trapdoor"; public const JUNGLE_WALL_SIGN = "minecraft:jungle_wall_sign"; + public const JUNGLE_WOOD = "minecraft:jungle_wood"; public const KELP = "minecraft:kelp"; public const LADDER = "minecraft:ladder"; public const LANTERN = "minecraft:lantern"; @@ -589,8 +604,6 @@ final class BlockTypeNames{ public const LAPIS_ORE = "minecraft:lapis_ore"; public const LARGE_AMETHYST_BUD = "minecraft:large_amethyst_bud"; public const LAVA = "minecraft:lava"; - public const LEAVES = "minecraft:leaves"; - public const LEAVES2 = "minecraft:leaves2"; public const LECTERN = "minecraft:lectern"; public const LEVER = "minecraft:lever"; public const LIGHT_BLOCK = "minecraft:light_block"; @@ -698,11 +711,15 @@ final class BlockTypeNames{ public const NETHERREACTOR = "minecraft:netherreactor"; public const NORMAL_STONE_STAIRS = "minecraft:normal_stone_stairs"; public const NOTEBLOCK = "minecraft:noteblock"; + public const OAK_DOUBLE_SLAB = "minecraft:oak_double_slab"; public const OAK_FENCE = "minecraft:oak_fence"; public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; + public const OAK_LEAVES = "minecraft:oak_leaves"; public const OAK_LOG = "minecraft:oak_log"; public const OAK_PLANKS = "minecraft:oak_planks"; + public const OAK_SLAB = "minecraft:oak_slab"; public const OAK_STAIRS = "minecraft:oak_stairs"; + public const OAK_WOOD = "minecraft:oak_wood"; public const OBSERVER = "minecraft:observer"; public const OBSIDIAN = "minecraft:obsidian"; public const OCHRE_FROGLIGHT = "minecraft:ochre_froglight"; @@ -875,16 +892,20 @@ final class BlockTypeNames{ public const SPORE_BLOSSOM = "minecraft:spore_blossom"; public const SPRUCE_BUTTON = "minecraft:spruce_button"; public const SPRUCE_DOOR = "minecraft:spruce_door"; + public const SPRUCE_DOUBLE_SLAB = "minecraft:spruce_double_slab"; public const SPRUCE_FENCE = "minecraft:spruce_fence"; public const SPRUCE_FENCE_GATE = "minecraft:spruce_fence_gate"; public const SPRUCE_HANGING_SIGN = "minecraft:spruce_hanging_sign"; + public const SPRUCE_LEAVES = "minecraft:spruce_leaves"; public const SPRUCE_LOG = "minecraft:spruce_log"; public const SPRUCE_PLANKS = "minecraft:spruce_planks"; public const SPRUCE_PRESSURE_PLATE = "minecraft:spruce_pressure_plate"; + public const SPRUCE_SLAB = "minecraft:spruce_slab"; public const SPRUCE_STAIRS = "minecraft:spruce_stairs"; public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; public const SPRUCE_TRAPDOOR = "minecraft:spruce_trapdoor"; public const SPRUCE_WALL_SIGN = "minecraft:spruce_wall_sign"; + public const SPRUCE_WOOD = "minecraft:spruce_wood"; public const STANDING_BANNER = "minecraft:standing_banner"; public const STANDING_SIGN = "minecraft:standing_sign"; public const STICKY_PISTON = "minecraft:sticky_piston"; @@ -902,18 +923,24 @@ final class BlockTypeNames{ public const STONECUTTER = "minecraft:stonecutter"; public const STONECUTTER_BLOCK = "minecraft:stonecutter_block"; public const STRIPPED_ACACIA_LOG = "minecraft:stripped_acacia_log"; + public const STRIPPED_ACACIA_WOOD = "minecraft:stripped_acacia_wood"; public const STRIPPED_BAMBOO_BLOCK = "minecraft:stripped_bamboo_block"; public const STRIPPED_BIRCH_LOG = "minecraft:stripped_birch_log"; + public const STRIPPED_BIRCH_WOOD = "minecraft:stripped_birch_wood"; public const STRIPPED_CHERRY_LOG = "minecraft:stripped_cherry_log"; public const STRIPPED_CHERRY_WOOD = "minecraft:stripped_cherry_wood"; public const STRIPPED_CRIMSON_HYPHAE = "minecraft:stripped_crimson_hyphae"; public const STRIPPED_CRIMSON_STEM = "minecraft:stripped_crimson_stem"; public const STRIPPED_DARK_OAK_LOG = "minecraft:stripped_dark_oak_log"; + public const STRIPPED_DARK_OAK_WOOD = "minecraft:stripped_dark_oak_wood"; public const STRIPPED_JUNGLE_LOG = "minecraft:stripped_jungle_log"; + public const STRIPPED_JUNGLE_WOOD = "minecraft:stripped_jungle_wood"; public const STRIPPED_MANGROVE_LOG = "minecraft:stripped_mangrove_log"; public const STRIPPED_MANGROVE_WOOD = "minecraft:stripped_mangrove_wood"; public const STRIPPED_OAK_LOG = "minecraft:stripped_oak_log"; + public const STRIPPED_OAK_WOOD = "minecraft:stripped_oak_wood"; public const STRIPPED_SPRUCE_LOG = "minecraft:stripped_spruce_log"; + public const STRIPPED_SPRUCE_WOOD = "minecraft:stripped_spruce_wood"; public const STRIPPED_WARPED_HYPHAE = "minecraft:stripped_warped_hyphae"; public const STRIPPED_WARPED_STEM = "minecraft:stripped_warped_stem"; public const STRUCTURE_BLOCK = "minecraft:structure_block"; @@ -952,6 +979,7 @@ final class BlockTypeNames{ public const UNLIT_REDSTONE_TORCH = "minecraft:unlit_redstone_torch"; public const UNPOWERED_COMPARATOR = "minecraft:unpowered_comparator"; public const UNPOWERED_REPEATER = "minecraft:unpowered_repeater"; + public const VAULT = "minecraft:vault"; public const VERDANT_FROGLIGHT = "minecraft:verdant_froglight"; public const VINE = "minecraft:vine"; public const WALL_BANNER = "minecraft:wall_banner"; @@ -1042,11 +1070,9 @@ final class BlockTypeNames{ public const WHITE_TERRACOTTA = "minecraft:white_terracotta"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; - public const WOOD = "minecraft:wood"; public const WOODEN_BUTTON = "minecraft:wooden_button"; public const WOODEN_DOOR = "minecraft:wooden_door"; public const WOODEN_PRESSURE_PLATE = "minecraft:wooden_pressure_plate"; - public const WOODEN_SLAB = "minecraft:wooden_slab"; public const YELLOW_CANDLE = "minecraft:yellow_candle"; public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; public const YELLOW_CARPET = "minecraft:yellow_carpet"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index b0b06ac908..453fd75fd4 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -203,7 +203,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->registerFlatCoralSerializers(); $this->registerCauldronSerializers(); $this->registerFlatWoodBlockSerializers(); - $this->registerLegacyWoodBlockSerializers(); $this->registerLeavesSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); @@ -558,9 +557,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::ACACIA_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::ACACIA_TRAPDOOR))); $this->map(Blocks::ACACIA_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::ACACIA_WALL_SIGN))); $this->mapLog(Blocks::ACACIA_LOG(), Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG); + $this->mapLog(Blocks::ACACIA_WOOD(), Ids::ACACIA_WOOD, Ids::STRIPPED_ACACIA_WOOD); $this->mapSimple(Blocks::ACACIA_FENCE(), Ids::ACACIA_FENCE); $this->mapSimple(Blocks::ACACIA_PLANKS(), Ids::ACACIA_PLANKS); - //wood and slabs still use the old way of storing wood type + $this->mapSlab(Blocks::ACACIA_SLAB(), Ids::ACACIA_SLAB, Ids::ACACIA_DOUBLE_SLAB); $this->map(Blocks::BIRCH_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::BIRCH_BUTTON))); $this->map(Blocks::BIRCH_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::BIRCH_DOOR))); @@ -570,10 +570,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::BIRCH_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::BIRCH_TRAPDOOR))); $this->map(Blocks::BIRCH_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::BIRCH_WALL_SIGN))); $this->mapLog(Blocks::BIRCH_LOG(), Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG); + $this->mapLog(Blocks::BIRCH_WOOD(), Ids::BIRCH_WOOD, Ids::STRIPPED_BIRCH_WOOD); $this->mapSimple(Blocks::BIRCH_FENCE(), Ids::BIRCH_FENCE); $this->mapSimple(Blocks::BIRCH_PLANKS(), Ids::BIRCH_PLANKS); + $this->mapSlab(Blocks::BIRCH_SLAB(), Ids::BIRCH_SLAB, Ids::BIRCH_DOUBLE_SLAB); $this->mapStairs(Blocks::BIRCH_STAIRS(), Ids::BIRCH_STAIRS); - //wood and slabs still use the old way of storing wood type $this->map(Blocks::CHERRY_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CHERRY_BUTTON))); $this->map(Blocks::CHERRY_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CHERRY_DOOR))); @@ -621,10 +622,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::DARK_OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::DARK_OAK_TRAPDOOR))); $this->map(Blocks::DARK_OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::DARKOAK_WALL_SIGN))); $this->mapLog(Blocks::DARK_OAK_LOG(), Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG); + $this->mapLog(Blocks::DARK_OAK_WOOD(), Ids::DARK_OAK_WOOD, Ids::STRIPPED_DARK_OAK_WOOD); $this->mapSimple(Blocks::DARK_OAK_FENCE(), Ids::DARK_OAK_FENCE); $this->mapSimple(Blocks::DARK_OAK_PLANKS(), Ids::DARK_OAK_PLANKS); + $this->mapSlab(Blocks::DARK_OAK_SLAB(), Ids::DARK_OAK_SLAB, Ids::DARK_OAK_DOUBLE_SLAB); $this->mapStairs(Blocks::DARK_OAK_STAIRS(), Ids::DARK_OAK_STAIRS); - //wood and slabs still use the old way of storing wood type $this->map(Blocks::JUNGLE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::JUNGLE_BUTTON))); $this->map(Blocks::JUNGLE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::JUNGLE_DOOR))); @@ -634,10 +636,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::JUNGLE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::JUNGLE_TRAPDOOR))); $this->map(Blocks::JUNGLE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::JUNGLE_WALL_SIGN))); $this->mapLog(Blocks::JUNGLE_LOG(), Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG); + $this->mapLog(Blocks::JUNGLE_WOOD(), Ids::JUNGLE_WOOD, Ids::STRIPPED_JUNGLE_WOOD); $this->mapSimple(Blocks::JUNGLE_FENCE(), Ids::JUNGLE_FENCE); $this->mapSimple(Blocks::JUNGLE_PLANKS(), Ids::JUNGLE_PLANKS); + $this->mapSlab(Blocks::JUNGLE_SLAB(), Ids::JUNGLE_SLAB, Ids::JUNGLE_DOUBLE_SLAB); $this->mapStairs(Blocks::JUNGLE_STAIRS(), Ids::JUNGLE_STAIRS); - //wood and slabs still use the old way of storing wood type $this->map(Blocks::MANGROVE_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::MANGROVE_BUTTON))); $this->map(Blocks::MANGROVE_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::MANGROVE_DOOR))); @@ -671,10 +674,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::OAK_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::TRAPDOOR))); $this->map(Blocks::OAK_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::WALL_SIGN))); $this->mapLog(Blocks::OAK_LOG(), Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG); + $this->mapLog(Blocks::OAK_WOOD(), Ids::OAK_WOOD, Ids::STRIPPED_OAK_WOOD); $this->mapSimple(Blocks::OAK_FENCE(), Ids::OAK_FENCE); $this->mapSimple(Blocks::OAK_PLANKS(), Ids::OAK_PLANKS); + $this->mapSlab(Blocks::OAK_SLAB(), Ids::OAK_SLAB, Ids::OAK_DOUBLE_SLAB); $this->mapStairs(Blocks::OAK_STAIRS(), Ids::OAK_STAIRS); - //wood and slabs still use the old way of storing wood type $this->map(Blocks::SPRUCE_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::SPRUCE_BUTTON))); $this->map(Blocks::SPRUCE_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::SPRUCE_DOOR))); @@ -684,8 +688,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SPRUCE_TRAPDOOR(), fn(WoodenTrapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::SPRUCE_TRAPDOOR))); $this->map(Blocks::SPRUCE_WALL_SIGN(), fn(WallSign $block) => Helper::encodeWallSign($block, new Writer(Ids::SPRUCE_WALL_SIGN))); $this->mapLog(Blocks::SPRUCE_LOG(), Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG); + $this->mapLog(Blocks::SPRUCE_WOOD(), Ids::SPRUCE_WOOD, Ids::STRIPPED_SPRUCE_WOOD); $this->mapSimple(Blocks::SPRUCE_FENCE(), Ids::SPRUCE_FENCE); $this->mapSimple(Blocks::SPRUCE_PLANKS(), Ids::SPRUCE_PLANKS); + $this->mapSlab(Blocks::SPRUCE_SLAB(), Ids::SPRUCE_SLAB, Ids::SPRUCE_DOUBLE_SLAB); $this->mapStairs(Blocks::SPRUCE_STAIRS(), Ids::SPRUCE_STAIRS); //wood and slabs still use the old way of storing wood type @@ -704,30 +710,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::WARPED_STAIRS(), Ids::WARPED_STAIRS); } - private function registerLegacyWoodBlockSerializers() : void{ - foreach([ - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_SLAB(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_SLAB(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_SLAB(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_SLAB(), - StringValues::WOOD_TYPE_OAK => Blocks::OAK_SLAB(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_SLAB(), - ] as $woodType => $block){ - $this->map($block, fn(Slab $block) => Helper::encodeWoodenSlab($block, $woodType)); - } - - foreach([ - Blocks::ACACIA_WOOD(), - Blocks::BIRCH_WOOD(), - Blocks::DARK_OAK_WOOD(), - Blocks::JUNGLE_WOOD(), - Blocks::OAK_WOOD(), - Blocks::SPRUCE_WOOD(), - ] as $block){ - $this->map($block, fn(Wood $block) => Helper::encodeAllSidedLog($block)); - } - } - private function registerLeavesSerializers() : void{ //flattened IDs $this->map(Blocks::AZALEA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::AZALEA_LEAVES))); @@ -736,12 +718,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MANGROVE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::MANGROVE_LEAVES))); //legacy mess - $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_ACACIA)); - $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_BIRCH)); - $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves2($block, StringValues::NEW_LEAF_TYPE_DARK_OAK)); - $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_JUNGLE)); - $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_OAK)); - $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves1($block, StringValues::OLD_LEAF_TYPE_SPRUCE)); + $this->map(Blocks::ACACIA_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::ACACIA_LEAVES))); + $this->map(Blocks::BIRCH_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::BIRCH_LEAVES))); + $this->map(Blocks::DARK_OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::DARK_OAK_LEAVES))); + $this->map(Blocks::JUNGLE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::JUNGLE_LEAVES))); + $this->map(Blocks::OAK_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::OAK_LEAVES))); + $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::SPRUCE_LEAVES))); } private function registerSimpleSerializers() : void{ @@ -927,7 +909,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::GOLD(), Ids::GOLD_BLOCK); $this->mapSimple(Blocks::GOLD_ORE(), Ids::GOLD_ORE); $this->mapSimple(Blocks::GRANITE(), Ids::GRANITE); - $this->mapSimple(Blocks::GRASS(), Ids::GRASS); + $this->mapSimple(Blocks::GRASS(), Ids::GRASS_BLOCK); $this->mapSimple(Blocks::GRASS_PATH(), Ids::GRASS_PATH); $this->mapSimple(Blocks::GRAVEL(), Ids::GRAVEL); $this->mapSimple(Blocks::HANGING_ROOTS(), Ids::HANGING_ROOTS); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index b929f68005..68bf14a7e3 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -362,18 +362,4 @@ final class BlockStateDeserializerHelper{ default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_4, $type), }; } - - /** @throws BlockStateDeserializeException */ - public static function mapWoodenSlabType(BlockStateReader $in) : Slab{ - // * wood_type (StringTag) = acacia, birch, dark_oak, jungle, oak, spruce - return match($type = $in->readString(BlockStateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => VanillaBlocks::ACACIA_SLAB(), - StringValues::WOOD_TYPE_BIRCH => VanillaBlocks::BIRCH_SLAB(), - StringValues::WOOD_TYPE_DARK_OAK => VanillaBlocks::DARK_OAK_SLAB(), - StringValues::WOOD_TYPE_JUNGLE => VanillaBlocks::JUNGLE_SLAB(), - StringValues::WOOD_TYPE_OAK => VanillaBlocks::OAK_SLAB(), - StringValues::WOOD_TYPE_SPRUCE => VanillaBlocks::SPRUCE_SLAB(), - default => throw $in->badValueException(BlockStateNames::WOOD_TYPE, $type), - }; - } } diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 2b91234381..68bb227cce 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -56,14 +56,6 @@ use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Facing; final class BlockStateSerializerHelper{ - - public static function encodeAllSidedLog(Wood $block) : Writer{ - return Writer::create(Ids::WOOD) - ->writeBool(BlockStateNames::STRIPPED_BIT, $block->isStripped()) - ->writePillarAxis($block->getAxis()) - ->writeLegacyWoodType($block->getWoodType()); - } - public static function encodeButton(Button $block, Writer $out) : Writer{ return $out ->writeFacingDirection($block->getFacing()) @@ -151,16 +143,6 @@ final class BlockStateSerializerHelper{ ->writeBool(BlockStateNames::UPDATE_BIT, $block->isCheckDecay()); } - public static function encodeLeaves1(Leaves $block, string $type) : Writer{ - return self::encodeLeaves($block, Writer::create(Ids::LEAVES) - ->writeString(BlockStateNames::OLD_LEAF_TYPE, $type)); - } - - public static function encodeLeaves2(Leaves $block, string $type) : Writer{ - return self::encodeLeaves($block, Writer::create(Ids::LEAVES2) - ->writeString(BlockStateNames::NEW_LEAF_TYPE, $type)); - } - public static function encodeLiquid(Liquid $block, string $stillId, string $flowingId) : Writer{ return Writer::create($block->isStill() ? $stillId : $flowingId) ->writeInt(BlockStateNames::LIQUID_DEPTH, $block->getDecay() | ($block->isFalling() ? 0x8 : 0)); @@ -279,9 +261,4 @@ final class BlockStateSerializerHelper{ return $out ->writeHorizontalFacing($block->getFacing()); } - - public static function encodeWoodenSlab(Slab $block, string $typeValue) : Writer{ - return self::encodeSlab($block, Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB) - ->writeString(BlockStateNames::WOOD_TYPE, $typeValue); - } } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 2941263675..b82eeb14c6 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -82,7 +82,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->registerFlatCoralDeserializers(); $this->registerCauldronDeserializers(); $this->registerFlatWoodBlockDeserializers(); - $this->registerLegacyWoodBlockDeserializers(); $this->registerLeavesDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); @@ -468,10 +467,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in)); $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in)); $this->mapLog(Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG, fn() => Blocks::ACACIA_LOG()); + $this->mapLog(Ids::ACACIA_WOOD, Ids::STRIPPED_ACACIA_WOOD, fn() => Blocks::ACACIA_WOOD()); $this->mapSimple(Ids::ACACIA_FENCE, fn() => Blocks::ACACIA_FENCE()); $this->mapSimple(Ids::ACACIA_PLANKS, fn() => Blocks::ACACIA_PLANKS()); + $this->mapSlab(Ids::ACACIA_SLAB, Ids::ACACIA_DOUBLE_SLAB, fn() => Blocks::ACACIA_SLAB()); $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::BIRCH_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::BIRCH_BUTTON(), $in)); $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in)); @@ -481,10 +481,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in)); $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in)); $this->mapLog(Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG, fn() => Blocks::BIRCH_LOG()); + $this->mapLog(Ids::BIRCH_WOOD, Ids::STRIPPED_BIRCH_WOOD, fn() => Blocks::BIRCH_WOOD()); $this->mapSimple(Ids::BIRCH_FENCE, fn() => Blocks::BIRCH_FENCE()); $this->mapSimple(Ids::BIRCH_PLANKS, fn() => Blocks::BIRCH_PLANKS()); + $this->mapSlab(Ids::BIRCH_SLAB, Ids::BIRCH_DOUBLE_SLAB, fn() => Blocks::BIRCH_SLAB()); $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::CHERRY_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CHERRY_BUTTON(), $in)); $this->map(Ids::CHERRY_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CHERRY_DOOR(), $in)); @@ -526,10 +527,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in)); $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in)); $this->mapLog(Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG, fn() => Blocks::DARK_OAK_LOG()); + $this->mapLog(Ids::DARK_OAK_WOOD, Ids::STRIPPED_DARK_OAK_WOOD, fn() => Blocks::DARK_OAK_WOOD()); $this->mapSimple(Ids::DARK_OAK_FENCE, fn() => Blocks::DARK_OAK_FENCE()); $this->mapSimple(Ids::DARK_OAK_PLANKS, fn() => Blocks::DARK_OAK_PLANKS()); + $this->mapSlab(Ids::DARK_OAK_SLAB, Ids::DARK_OAK_DOUBLE_SLAB, fn() => Blocks::DARK_OAK_SLAB()); $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::JUNGLE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::JUNGLE_BUTTON(), $in)); $this->map(Ids::JUNGLE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::JUNGLE_DOOR(), $in)); @@ -539,10 +541,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::JUNGLE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::JUNGLE_TRAPDOOR(), $in)); $this->map(Ids::JUNGLE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::JUNGLE_WALL_SIGN(), $in)); $this->mapLog(Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG, fn() => Blocks::JUNGLE_LOG()); + $this->mapLog(Ids::JUNGLE_WOOD, Ids::STRIPPED_JUNGLE_WOOD, fn() => Blocks::JUNGLE_WOOD()); $this->mapSimple(Ids::JUNGLE_FENCE, fn() => Blocks::JUNGLE_FENCE()); $this->mapSimple(Ids::JUNGLE_PLANKS, fn() => Blocks::JUNGLE_PLANKS()); + $this->mapSlab(Ids::JUNGLE_SLAB, Ids::JUNGLE_DOUBLE_SLAB, fn() => Blocks::JUNGLE_SLAB()); $this->mapStairs(Ids::JUNGLE_STAIRS, fn() => Blocks::JUNGLE_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::MANGROVE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::MANGROVE_BUTTON(), $in)); $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in)); @@ -571,10 +574,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::OAK_TRAPDOOR(), $in)); $this->map(Ids::WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::OAK_WALL_SIGN(), $in)); $this->mapLog(Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG, fn() => Blocks::OAK_LOG()); + $this->mapLog(Ids::OAK_WOOD, Ids::STRIPPED_OAK_WOOD, fn() => Blocks::OAK_WOOD()); $this->mapSimple(Ids::OAK_FENCE, fn() => Blocks::OAK_FENCE()); $this->mapSimple(Ids::OAK_PLANKS, fn() => Blocks::OAK_PLANKS()); + $this->mapSlab(Ids::OAK_SLAB, Ids::OAK_DOUBLE_SLAB, fn() => Blocks::OAK_SLAB()); $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::SPRUCE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::SPRUCE_BUTTON(), $in)); $this->map(Ids::SPRUCE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::SPRUCE_DOOR(), $in)); @@ -584,10 +588,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::SPRUCE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::SPRUCE_TRAPDOOR(), $in)); $this->map(Ids::SPRUCE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::SPRUCE_WALL_SIGN(), $in)); $this->mapLog(Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG, fn() => Blocks::SPRUCE_LOG()); + $this->mapLog(Ids::SPRUCE_WOOD, Ids::STRIPPED_SPRUCE_WOOD, fn() => Blocks::SPRUCE_WOOD()); $this->mapSimple(Ids::SPRUCE_FENCE, fn() => Blocks::SPRUCE_FENCE()); $this->mapSimple(Ids::SPRUCE_PLANKS, fn() => Blocks::SPRUCE_PLANKS()); + $this->mapSlab(Ids::SPRUCE_SLAB, Ids::SPRUCE_DOUBLE_SLAB, fn() => Blocks::SPRUCE_SLAB()); $this->mapStairs(Ids::SPRUCE_STAIRS, fn() => Blocks::SPRUCE_STAIRS()); - //wood, planks and slabs still use the old way of storing wood type $this->map(Ids::WARPED_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::WARPED_BUTTON(), $in)); $this->map(Ids::WARPED_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::WARPED_DOOR(), $in)); @@ -604,40 +609,17 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::WARPED_STAIRS, fn() => Blocks::WARPED_STAIRS()); } - private function registerLegacyWoodBlockDeserializers() : void{ - $this->mapSlab(Ids::WOODEN_SLAB, Ids::DOUBLE_WOODEN_SLAB, fn(Reader $in) => Helper::mapWoodenSlabType($in)); - - $this->map(Ids::WOOD, fn(Reader $in) : Block => Helper::decodeLog(match($woodType = $in->readString(StateNames::WOOD_TYPE)){ - StringValues::WOOD_TYPE_ACACIA => Blocks::ACACIA_WOOD(), - StringValues::WOOD_TYPE_BIRCH => Blocks::BIRCH_WOOD(), - StringValues::WOOD_TYPE_DARK_OAK => Blocks::DARK_OAK_WOOD(), - StringValues::WOOD_TYPE_JUNGLE => Blocks::JUNGLE_WOOD(), - StringValues::WOOD_TYPE_OAK => Blocks::OAK_WOOD(), - StringValues::WOOD_TYPE_SPRUCE => Blocks::SPRUCE_WOOD(), - default => throw $in->badValueException(StateNames::WOOD_TYPE, $woodType), - }, $in->readBool(StateNames::STRIPPED_BIT), $in)); - } - private function registerLeavesDeserializers() : void{ - //flattened IDs + $this->map(Ids::ACACIA_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::ACACIA_LEAVES(), $in)); $this->map(Ids::AZALEA_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::AZALEA_LEAVES(), $in)); $this->map(Ids::AZALEA_LEAVES_FLOWERED, fn(Reader $in) => Helper::decodeLeaves(Blocks::FLOWERING_AZALEA_LEAVES(), $in)); + $this->map(Ids::BIRCH_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::BIRCH_LEAVES(), $in)); $this->map(Ids::CHERRY_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::CHERRY_LEAVES(), $in)); + $this->map(Ids::DARK_OAK_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::DARK_OAK_LEAVES(), $in)); + $this->map(Ids::JUNGLE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::JUNGLE_LEAVES(), $in)); $this->map(Ids::MANGROVE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::MANGROVE_LEAVES(), $in)); - - //legacy mess - $this->map(Ids::LEAVES, fn(Reader $in) => Helper::decodeLeaves(match($type = $in->readString(StateNames::OLD_LEAF_TYPE)){ - StringValues::OLD_LEAF_TYPE_BIRCH => Blocks::BIRCH_LEAVES(), - StringValues::OLD_LEAF_TYPE_JUNGLE => Blocks::JUNGLE_LEAVES(), - StringValues::OLD_LEAF_TYPE_OAK => Blocks::OAK_LEAVES(), - StringValues::OLD_LEAF_TYPE_SPRUCE => Blocks::SPRUCE_LEAVES(), - default => throw $in->badValueException(StateNames::OLD_LEAF_TYPE, $type), - }, $in)); - $this->map(Ids::LEAVES2, fn(Reader $in) => Helper::decodeLeaves(match($type = $in->readString(StateNames::NEW_LEAF_TYPE)){ - StringValues::NEW_LEAF_TYPE_ACACIA => Blocks::ACACIA_LEAVES(), - StringValues::NEW_LEAF_TYPE_DARK_OAK => Blocks::DARK_OAK_LEAVES(), - default => throw $in->badValueException(StateNames::NEW_LEAF_TYPE, $type), - }, $in)); + $this->map(Ids::OAK_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::OAK_LEAVES(), $in)); + $this->map(Ids::SPRUCE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::SPRUCE_LEAVES(), $in)); } private function registerSimpleDeserializers() : void{ @@ -821,7 +803,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::GOLD_BLOCK, fn() => Blocks::GOLD()); $this->mapSimple(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE()); $this->mapSimple(Ids::GRANITE, fn() => Blocks::GRANITE()); - $this->mapSimple(Ids::GRASS, fn() => Blocks::GRASS()); + $this->mapSimple(Ids::GRASS_BLOCK, fn() => Blocks::GRASS()); $this->mapSimple(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH()); $this->mapSimple(Ids::GRAVEL, fn() => Blocks::GRAVEL()); $this->mapSimple(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS()); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 69efa4d0fd..03e9bcf0b7 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -257,20 +257,6 @@ final class BlockStateWriter{ return $this; } - /** @return $this */ - public function writeLegacyWoodType(WoodType $treeType) : self{ - $this->writeString(BlockStateNames::WOOD_TYPE, match($treeType){ - WoodType::OAK => StringValues::WOOD_TYPE_OAK, - WoodType::SPRUCE => StringValues::WOOD_TYPE_SPRUCE, - WoodType::BIRCH => StringValues::WOOD_TYPE_BIRCH, - WoodType::JUNGLE => StringValues::WOOD_TYPE_JUNGLE, - WoodType::ACACIA => StringValues::WOOD_TYPE_ACACIA, - WoodType::DARK_OAK => StringValues::WOOD_TYPE_DARK_OAK, - default => throw new BlockStateSerializeException("Invalid legacy wood type " . $treeType->name) - }); - return $this; - } - /** @return $this */ public function writeCoralType(CoralType $coralType) : self{ $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType){ diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 3f01ff1a88..0a205f3e9b 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -74,6 +74,7 @@ final class ItemTypeNames{ public const BLEACH = "minecraft:bleach"; public const BLUE_DYE = "minecraft:blue_dye"; public const BOAT = "minecraft:boat"; + public const BOGGED_SPAWN_EGG = "minecraft:bogged_spawn_egg"; public const BONE = "minecraft:bone"; public const BONE_MEAL = "minecraft:bone_meal"; public const BOOK = "minecraft:book"; @@ -286,6 +287,8 @@ final class ItemTypeNames{ public const LEATHER_HELMET = "minecraft:leather_helmet"; public const LEATHER_HORSE_ARMOR = "minecraft:leather_horse_armor"; public const LEATHER_LEGGINGS = "minecraft:leather_leggings"; + public const LEAVES = "minecraft:leaves"; + public const LEAVES2 = "minecraft:leaves2"; public const LIGHT_BLUE_DYE = "minecraft:light_blue_dye"; public const LIGHT_GRAY_DYE = "minecraft:light_gray_dye"; public const LIME_DYE = "minecraft:lime_dye"; @@ -500,16 +503,19 @@ final class ItemTypeNames{ public const WHEAT_SEEDS = "minecraft:wheat_seeds"; public const WHITE_DYE = "minecraft:white_dye"; public const WILD_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:wild_armor_trim_smithing_template"; + public const WIND_CHARGE = "minecraft:wind_charge"; public const WITCH_SPAWN_EGG = "minecraft:witch_spawn_egg"; public const WITHER_SKELETON_SPAWN_EGG = "minecraft:wither_skeleton_spawn_egg"; public const WITHER_SPAWN_EGG = "minecraft:wither_spawn_egg"; public const WOLF_ARMOR = "minecraft:wolf_armor"; public const WOLF_SPAWN_EGG = "minecraft:wolf_spawn_egg"; + public const WOOD = "minecraft:wood"; public const WOODEN_AXE = "minecraft:wooden_axe"; public const WOODEN_DOOR = "minecraft:wooden_door"; public const WOODEN_HOE = "minecraft:wooden_hoe"; public const WOODEN_PICKAXE = "minecraft:wooden_pickaxe"; public const WOODEN_SHOVEL = "minecraft:wooden_shovel"; + public const WOODEN_SLAB = "minecraft:wooden_slab"; public const WOODEN_SWORD = "minecraft:wooden_sword"; public const WOOL = "minecraft:wool"; public const WRITABLE_BOOK = "minecraft:writable_book"; diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 5fc2168d51..c55a8716ca 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -800,7 +800,7 @@ abstract class Entity{ } protected function broadcastMotion() : void{ - NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion())]); + NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion(), tick: 0)]); } public function getGravity() : float{ diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php index 1651d154e1..6b8a83fe1a 100644 --- a/src/network/mcpe/StandardEntityEventBroadcaster.php +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -87,12 +87,13 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ EffectIdMap::getInstance()->toId($effect->getType()), $effect->getAmplifier(), $effect->isVisible(), - $effect->getDuration() + $effect->getDuration(), + tick: 0 )); } public function onEntityEffectRemoved(array $recipients, Living $entity, EffectInstance $effect) : void{ - $this->sendDataPacket($recipients, MobEffectPacket::remove($entity->getId(), EffectIdMap::getInstance()->toId($effect->getType()))); + $this->sendDataPacket($recipients, MobEffectPacket::remove($entity->getId(), EffectIdMap::getInstance()->toId($effect->getType()), tick: 0)); } public function onEntityRemoved(array $recipients, Entity $entity) : void{ diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index e84609d119..c92db31331 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; use pocketmine\block\BaseSign; -use pocketmine\block\ItemFrame; use pocketmine\block\Lectern; use pocketmine\block\tile\Sign; use pocketmine\block\utils\SignText; @@ -60,7 +59,6 @@ use pocketmine\network\mcpe\protocol\ContainerClosePacket; use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\InteractPacket; use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; -use pocketmine\network\mcpe\protocol\ItemFrameDropItemPacket; use pocketmine\network\mcpe\protocol\ItemStackRequestPacket; use pocketmine\network\mcpe\protocol\ItemStackResponsePacket; use pocketmine\network\mcpe\protocol\LabTablePacket; @@ -808,15 +806,6 @@ class InGamePacketHandler extends PacketHandler{ return true; } - public function handleItemFrameDropItem(ItemFrameDropItemPacket $packet) : bool{ - $blockPosition = $packet->blockPosition; - $block = $this->player->getWorld()->getBlockAt($blockPosition->getX(), $blockPosition->getY(), $blockPosition->getZ()); - if($block instanceof ItemFrame && $block->getFramedItem() !== null){ - return $this->player->attackBlock(new Vector3($blockPosition->getX(), $blockPosition->getY(), $blockPosition->getZ()), $block->getFacing()); - } - return false; - } - public function handleBossEvent(BossEventPacket $packet) : bool{ return false; //TODO } @@ -998,11 +987,6 @@ class InGamePacketHandler extends PacketHandler{ } public function handleLecternUpdate(LecternUpdatePacket $packet) : bool{ - if($packet->dropBook){ - //Drop book is handled with an interact event on use item transaction - return true; - } - $pos = $packet->blockPosition; $chunkX = $pos->getX() >> Chunk::COORD_BIT_SIZE; $chunkZ = $pos->getZ() >> Chunk::COORD_BIT_SIZE; diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 3d413ee5a1..4528da6d55 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -80,7 +80,15 @@ class ResourcePacksPacketHandler extends PacketHandler{ ); }, $this->resourcePackManager->getResourceStack()); //TODO: support forcing server packs - $this->session->sendDataPacket(ResourcePacksInfoPacket::create($resourcePackEntries, [], $this->resourcePackManager->resourcePacksRequired(), false, false, [])); + $this->session->sendDataPacket(ResourcePacksInfoPacket::create( + resourcePackEntries: $resourcePackEntries, + behaviorPackEntries: [], + mustAccept: $this->resourcePackManager->resourcePacksRequired(), + hasAddons: false, + hasScripts: false, + forceServerPacks: false, + cdnUrls: [] + )); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); } diff --git a/src/player/Player.php b/src/player/Player.php index 7a717dacd9..0cefbe71f2 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1393,7 +1393,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function setMotion(Vector3 $motion) : bool{ if(parent::setMotion($motion)){ $this->broadcastMotion(); - $this->getNetworkSession()->sendDataPacket(SetActorMotionPacket::create($this->id, $motion)); + $this->getNetworkSession()->sendDataPacket(SetActorMotionPacket::create($this->id, $motion, tick: 0)); return true; } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index bf86825477..4b57dd2d8d 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 649; + public const CURRENT_STORAGE_NETWORK_VERSION = 662; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 60, //patch - 4, //revision + 71, //patch + 1, //revision 0 //is beta ]; From c11c0679e334a9b482ea2e3e842d4297a0c51751 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 14:55:54 +0000 Subject: [PATCH 1657/1858] Fix CS --- src/data/bedrock/block/convert/BlockStateWriter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 03e9bcf0b7..33e82a5c02 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -27,7 +27,6 @@ use pocketmine\block\utils\BellAttachmentType; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\WallConnectionType; -use pocketmine\block\utils\WoodType; use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateNames; From f193a990b0bae8892637cb7fb2bdf862c8a1a759 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 14:59:21 +0000 Subject: [PATCH 1658/1858] Release 5.13.0 --- changelogs/5.13.md | 16 ++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.13.md diff --git a/changelogs/5.13.md b/changelogs/5.13.md new file mode 100644 index 0000000000..1a38fce928 --- /dev/null +++ b/changelogs/5.13.md @@ -0,0 +1,16 @@ +# 5.13.0 +Released 13th March 2024. + +**For Minecraft: Bedrock Edition 1.20.70** + +This is a support release for Minecraft: Bedrock Edition 1.20.70. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.70. +- Removed support for earlier versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 92057c0c2b..09f4793af7 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.12.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.13.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 2d24fac067a5a577882f859571cb7bb463f48510 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 14:59:21 +0000 Subject: [PATCH 1659/1858] 5.13.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 09f4793af7..24428cc487 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.13.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.13.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 9f3533d870c8c70fc3600166c3d6f950961b0ad5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 16:42:23 +0000 Subject: [PATCH 1660/1858] Improved logging for block decode errors this is still noisy, but less so than before. this also adds logging to places where it was previously missing. --- src/world/format/io/BaseWorldProvider.php | 32 ++++++++++++------- src/world/format/io/leveldb/LevelDB.php | 19 ++++++++--- src/world/format/io/region/Anvil.php | 5 +-- .../io/region/LegacyAnvilChunkTrait.php | 7 ++-- src/world/format/io/region/McRegion.php | 9 ++++-- src/world/format/io/region/PMAnvil.php | 5 +-- .../format/io/region/RegionWorldProvider.php | 4 +-- 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index a4d8651a67..f863fdf747 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -31,7 +31,9 @@ use pocketmine\world\format\io\exception\CorruptedWorldException; use pocketmine\world\format\io\exception\UnsupportedWorldFormatException; use pocketmine\world\format\PalettedBlockArray; use pocketmine\world\WorldException; +use function count; use function file_exists; +use function implode; abstract class BaseWorldProvider implements WorldProvider{ protected WorldData $worldData; @@ -62,27 +64,35 @@ abstract class BaseWorldProvider implements WorldProvider{ */ abstract protected function loadLevelData() : WorldData; - private function translatePalette(PalettedBlockArray $blockArray) : PalettedBlockArray{ + private function translatePalette(PalettedBlockArray $blockArray, \Logger $logger) : PalettedBlockArray{ $palette = $blockArray->getPalette(); $newPalette = []; + $blockDecodeErrors = []; foreach($palette as $k => $legacyIdMeta){ //TODO: remember data for unknown states so we can implement them later + $id = $legacyIdMeta >> 4; + $meta = $legacyIdMeta & 0xf; try{ - $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); + $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($id, $meta); }catch(BlockStateDeserializeException $e){ + $blockDecodeErrors[] = "Palette offset $k / Failed to upgrade legacy ID/meta $id:$meta: " . $e->getMessage(); $newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData(); } try{ $newPalette[$k] = $this->blockStateDeserializer->deserialize($newStateData); - }catch(BlockStateDeserializeException){ - //TODO: this needs to be logged - //TODO: maybe we can remember unknown states for later saving instead of discarding them and destroying maps... + }catch(BlockStateDeserializeException $e){ + //this should never happen anyway - if the upgrader returned an invalid state, we have bigger problems + $blockDecodeErrors[] = "Palette offset $k / Failed to deserialize upgraded state $id:$meta: " . $e->getMessage(); $newPalette[$k] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } } + if(count($blockDecodeErrors) > 0){ + $logger->error("Errors decoding/upgrading blocks:\n - " . implode("\n - ", $blockDecodeErrors)); + } + //TODO: this is sub-optimal since it reallocates the offset table multiple times return PalettedBlockArray::fromData( $blockArray->getBitsPerBlock(), @@ -91,16 +101,16 @@ abstract class BaseWorldProvider implements WorldProvider{ ); } - protected function palettizeLegacySubChunkXZY(string $idArray, string $metaArray) : PalettedBlockArray{ - return $this->translatePalette(SubChunkConverter::convertSubChunkXZY($idArray, $metaArray)); + protected function palettizeLegacySubChunkXZY(string $idArray, string $metaArray, \Logger $logger) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkXZY($idArray, $metaArray), $logger); } - protected function palettizeLegacySubChunkYZX(string $idArray, string $metaArray) : PalettedBlockArray{ - return $this->translatePalette(SubChunkConverter::convertSubChunkYZX($idArray, $metaArray)); + protected function palettizeLegacySubChunkYZX(string $idArray, string $metaArray, \Logger $logger) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkYZX($idArray, $metaArray), $logger); } - protected function palettizeLegacySubChunkFromColumn(string $idArray, string $metaArray, int $yOffset) : PalettedBlockArray{ - return $this->translatePalette(SubChunkConverter::convertSubChunkFromLegacyColumn($idArray, $metaArray, $yOffset)); + protected function palettizeLegacySubChunkFromColumn(string $idArray, string $metaArray, int $yOffset, \Logger $logger) : PalettedBlockArray{ + return $this->translatePalette(SubChunkConverter::convertSubChunkFromLegacyColumn($idArray, $metaArray, $yOffset), $logger); } public function getPath() : string{ diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 3d4f577a1a..20b55922cd 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateDeserializeException; +use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\NbtDataException; @@ -58,6 +59,7 @@ use function count; use function defined; use function extension_loaded; use function file_exists; +use function implode; use function is_dir; use function mkdir; use function ord; @@ -184,6 +186,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $paletteSize = $stream->getLInt(); } + $blockDecodeErrors = []; + for($i = 0; $i < $paletteSize; ++$i){ try{ $offset = $stream->getOffset(); @@ -199,18 +203,25 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt); }catch(BlockStateDeserializeException $e){ //while not ideal, this is not a fatal error - $logger->error("Failed to upgrade blockstate: " . $e->getMessage() . " offset $i in palette, blockstate NBT: " . $blockStateNbt->toString()); + $blockDecodeErrors[] = "Palette offset $i / Upgrade error: " . $e->getMessage() . ", NBT: " . $blockStateNbt->toString(); $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); continue; } try{ $palette[] = $this->blockStateDeserializer->deserialize($blockStateData); + }catch(UnsupportedBlockStateException $e){ + $blockDecodeErrors[] = "Palette offset $i / " . $e->getMessage(); + $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); }catch(BlockStateDeserializeException $e){ - $logger->error("Failed to deserialize blockstate: " . $e->getMessage() . " offset $i in palette, blockstate NBT: " . $blockStateNbt->toString()); + $blockDecodeErrors[] = "Palette offset $i / Deserialize error: " . $e->getMessage() . ", NBT: " . $blockStateNbt->toString(); $palette[] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } } + if(count($blockDecodeErrors) > 0){ + $logger->error("Errors decoding blocks:\n - " . implode("\n - ", $blockDecodeErrors)); + } + //TODO: exceptions return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); } @@ -443,7 +454,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $subChunks = []; for($yy = 0; $yy < 8; ++$yy){ - $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy)]; + $storages = [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $yy, new \PrefixedLogger($logger, "Subchunk y=$yy"))]; if(isset($convertedLegacyExtraData[$yy])){ $storages[] = $convertedLegacyExtraData[$yy]; } @@ -482,7 +493,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } } - $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData)]; + $storages = [$this->palettizeLegacySubChunkXZY($blocks, $blockData, $logger)]; if($convertedLegacyExtraData !== null){ $storages[] = $convertedLegacyExtraData; } diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index abefc9f255..2c14b54e87 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -31,10 +31,11 @@ use pocketmine\world\format\SubChunk; class Anvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; - protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ + protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d, \Logger $logger) : SubChunk{ return new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkYZX( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), - self::readFixedSizeByteArray($subChunk, "Data", 2048) + self::readFixedSizeByteArray($subChunk, "Data", 2048), + $logger )], $biomes3d); //ignore legacy light information } diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index ba97d43b5e..6e2f4c8f8f 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -54,7 +54,7 @@ trait LegacyAnvilChunkTrait{ /** * @throws CorruptedChunkException */ - protected function deserializeChunk(string $data) : ?LoadedChunkData{ + protected function deserializeChunk(string $data, \Logger $logger) : ?LoadedChunkData{ $decompressed = @zlib_decode($data); if($decompressed === false){ throw new CorruptedChunkException("Failed to decompress chunk NBT"); @@ -90,7 +90,8 @@ trait LegacyAnvilChunkTrait{ $subChunksTag = $chunk->getListTag("Sections") ?? []; foreach($subChunksTag as $subChunk){ if($subChunk instanceof CompoundTag){ - $subChunks[$subChunk->getByte("Y")] = $this->deserializeSubChunk($subChunk, clone $biomes3d); + $y = $subChunk->getByte("Y"); + $subChunks[$y] = $this->deserializeSubChunk($subChunk, clone $biomes3d, new \PrefixedLogger($logger, "Subchunk y=$y")); } } for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ @@ -111,6 +112,6 @@ trait LegacyAnvilChunkTrait{ ); } - abstract protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk; + abstract protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d, \Logger $logger) : SubChunk; } diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 878c84df47..ad6a2d7f2d 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -46,7 +46,7 @@ class McRegion extends RegionWorldProvider{ /** * @throws CorruptedChunkException */ - protected function deserializeChunk(string $data) : ?LoadedChunkData{ + protected function deserializeChunk(string $data, \Logger $logger) : ?LoadedChunkData{ $decompressed = @zlib_decode($data); if($decompressed === false){ throw new CorruptedChunkException("Failed to decompress chunk NBT"); @@ -90,7 +90,12 @@ class McRegion extends RegionWorldProvider{ $fullData = self::readFixedSizeByteArray($chunk, "Data", 16384); for($y = 0; $y < 8; ++$y){ - $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)], clone $biomes3d); + $subChunks[$y] = new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkFromColumn( + $fullIds, + $fullData, + $y, + new \PrefixedLogger($logger, "Subchunk y=$y"), + )], clone $biomes3d); } for($y = Chunk::MIN_SUBCHUNK_INDEX; $y <= Chunk::MAX_SUBCHUNK_INDEX; ++$y){ if(!isset($subChunks[$y])){ diff --git a/src/world/format/io/region/PMAnvil.php b/src/world/format/io/region/PMAnvil.php index 41dc0fa80d..4fb4631242 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -35,10 +35,11 @@ use pocketmine\world\format\SubChunk; class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; - protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d) : SubChunk{ + protected function deserializeSubChunk(CompoundTag $subChunk, PalettedBlockArray $biomes3d, \Logger $logger) : SubChunk{ return new SubChunk(Block::EMPTY_STATE_ID, [$this->palettizeLegacySubChunkXZY( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), - self::readFixedSizeByteArray($subChunk, "Data", 2048) + self::readFixedSizeByteArray($subChunk, "Data", 2048), + $logger )], $biomes3d); } diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index a4a3055c63..1feca61be1 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -147,7 +147,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ /** * @throws CorruptedChunkException */ - abstract protected function deserializeChunk(string $data) : ?LoadedChunkData; + abstract protected function deserializeChunk(string $data, \Logger $logger) : ?LoadedChunkData; /** * @return CompoundTag[] @@ -200,7 +200,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ $chunkData = $this->loadRegion($regionX, $regionZ)->readChunk($chunkX & 0x1f, $chunkZ & 0x1f); if($chunkData !== null){ - return $this->deserializeChunk($chunkData); + return $this->deserializeChunk($chunkData, new \PrefixedLogger($this->logger, "Loading chunk x=$chunkX z=$chunkZ")); } return null; From 1de66cb0de7296686327921241117b05b33435f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 17:11:06 +0000 Subject: [PATCH 1661/1858] RegistryTrait: added fast path optimization this reduces VanillaBlocks access time from 360 ns to 230 ns on my machine - an improvement of about 35%. --- src/utils/RegistryTrait.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils/RegistryTrait.php b/src/utils/RegistryTrait.php index cf231bf21f..f1972b5187 100644 --- a/src/utils/RegistryTrait.php +++ b/src/utils/RegistryTrait.php @@ -114,6 +114,13 @@ trait RegistryTrait{ if(count($arguments) > 0){ throw new \ArgumentCountError("Expected exactly 0 arguments, " . count($arguments) . " passed"); } + + //fast path + if(self::$members !== null && isset(self::$members[$name])){ + return self::preprocessMember(self::$members[$name]); + } + + //fallback try{ return self::_registryFromString($name); }catch(\InvalidArgumentException $e){ From 7ff0ae19d65e3b3029246b51de0e361cee6a1a01 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 18:19:51 +0000 Subject: [PATCH 1662/1858] BlockStateUpgrader: a simple yet hard-to-explain optimization Prior to this commit, upgrade schemas would be applied to blockstates with the same version, as there wasn't any way to know if they should be applied or not given Mojang's tendency to forget to bump the version. However, it occurred to me that we only need to do this if there are multiple schemas present for the same version ID, which is rarely the case. This allows skipping costly logic for blockstates on the newest version (the common case), reducing the time taken to process the blockstate for upgrading by over 30%. Overall, this translates into less than 10% real performance improvement for chunk loading, but it's still a worthwhile improvement. --- .../block/upgrade/BlockStateUpgrader.php | 76 ++++++++++++------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 501ca750ad..f4a5b6e93e 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -35,7 +35,10 @@ use function sprintf; use const SORT_NUMERIC; final class BlockStateUpgrader{ - /** @var BlockStateUpgradeSchema[] */ + /** + * @var BlockStateUpgradeSchema[][] versionId => [schemaId => schema] + * @phpstan-var array> + */ private array $upgradeSchemas = []; private int $outputVersion = 0; @@ -52,46 +55,37 @@ final class BlockStateUpgrader{ public function addSchema(BlockStateUpgradeSchema $schema) : void{ $schemaId = $schema->getSchemaId(); - if(isset($this->upgradeSchemas[$schemaId])){ - throw new \InvalidArgumentException("Cannot add two schemas with the same schema ID"); + $versionId = $schema->getVersionId(); + if(isset($this->upgradeSchemas[$versionId][$schemaId])){ + throw new \InvalidArgumentException("Cannot add two schemas with the same schema ID and version ID"); } - $this->upgradeSchemas[$schemaId] = $schema; + + //schema ID tells us the order when multiple schemas use the same version ID + $this->upgradeSchemas[$versionId][$schemaId] = $schema; ksort($this->upgradeSchemas, SORT_NUMERIC); + ksort($this->upgradeSchemas[$versionId], SORT_NUMERIC); $this->outputVersion = max($this->outputVersion, $schema->getVersionId()); } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ $version = $blockStateData->getVersion(); - foreach($this->upgradeSchemas as $schema){ - $resultVersion = $schema->versionId; - if($version > $resultVersion){ - //even if this is actually the same version, we have to apply it anyway because mojang are dumb and - //didn't always bump the blockstate version when changing it :( + foreach($this->upgradeSchemas as $resultVersion => $schemaList){ + /* + * Sometimes Mojang made changes without bumping the version ID. + * A notable example is 0131_1.18.20.27_beta_to_1.18.30.json, which renamed a bunch of blockIDs. + * When this happens, all the schemas must be applied even if the version is the same, because the input + * version doesn't tell us which of the schemas have already been applied. + * If there's only one schema for a version (the norm), we can safely assume it's already been applied if + * the version is the same, and skip over it. + */ + if($version > $resultVersion || (count($schemaList) === 1 && $version === $resultVersion)){ continue; } - $newStateData = $this->applyStateRemapped($schema, $blockStateData); - if($newStateData !== null){ - $blockStateData = $newStateData; - continue; - } - - $oldName = $blockStateData->getName(); - $newName = $schema->renamedIds[$oldName] ?? null; - - $stateChanges = 0; - $states = $blockStateData->getStates(); - - $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyRenamedOrValueChanged($schema, $oldName, $states, $stateChanges); - $states = $this->applyPropertyValueChanged($schema, $oldName, $states, $stateChanges); - - if($newName !== null || $stateChanges > 0){ - $blockStateData = new BlockStateData($newName ?? $oldName, $states, $resultVersion); - //don't break out; we may need to further upgrade the state + foreach($schemaList as $schema){ + $blockStateData = $this->applySchema($schema, $blockStateData); } } @@ -103,6 +97,30 @@ final class BlockStateUpgrader{ return $blockStateData; } + private function applySchema(BlockStateUpgradeSchema $schema, BlockStateData $blockStateData) : BlockStateData{ + $newStateData = $this->applyStateRemapped($schema, $blockStateData); + if($newStateData !== null){ + return $newStateData; + } + + $oldName = $blockStateData->getName(); + $newName = $schema->renamedIds[$oldName] ?? null; + + $stateChanges = 0; + $states = $blockStateData->getStates(); + + $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyRenamedOrValueChanged($schema, $oldName, $states, $stateChanges); + $states = $this->applyPropertyValueChanged($schema, $oldName, $states, $stateChanges); + + if($newName !== null || $stateChanges > 0){ + return new BlockStateData($newName ?? $oldName, $states, $schema->getVersionId()); + } + + return $blockStateData; + } + private function applyStateRemapped(BlockStateUpgradeSchema $schema, BlockStateData $blockStateData) : ?BlockStateData{ $oldName = $blockStateData->getName(); $oldState = $blockStateData->getStates(); From 8d7f1a8557303296d4a5cdbfb710efafb61ae0a3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Mar 2024 18:35:07 +0000 Subject: [PATCH 1663/1858] BlockStateUpgraderTest: fixed tests for 7ff0ae19d65e3b3029246b51de0e361cee6a1a01 --- .../block/upgrade/BlockStateUpgraderTest.php | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php index efd22212fc..4d4d321ec0 100644 --- a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php @@ -47,11 +47,11 @@ class BlockStateUpgraderTest extends TestCase{ } private function getNewSchema() : BlockStateUpgradeSchema{ - return $this->getNewSchemaVersion(PHP_INT_MAX); + return $this->getNewSchemaVersion(PHP_INT_MAX, 0); } - private function getNewSchemaVersion(int $versionId) : BlockStateUpgradeSchema{ - $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff, 0); + private function getNewSchemaVersion(int $versionId, int $schemaId) : BlockStateUpgradeSchema{ + $schema = new BlockStateUpgradeSchema(($versionId >> 24) & 0xff, ($versionId >> 16) & 0xff, ($versionId >> 8) & 0xff, $versionId & 0xff, $schemaId); $this->upgrader->addSchema($schema); return $schema; } @@ -211,20 +211,23 @@ class BlockStateUpgraderTest extends TestCase{ } /** - * @phpstan-return \Generator + * @phpstan-return \Generator */ public static function upgraderVersionCompatibilityProvider() : \Generator{ - yield [0x1_00_00_00, 0x1_00_00_00, true]; //Same version: must be altered - this may be a backwards-compatible change that Mojang didn't bother to bump for - yield [0x1_00_01_00, 0x1_00_00_00, true]; //Schema newer than block: must be altered - yield [0x1_00_00_00, 0x1_00_01_00, false]; //Block newer than schema: block must NOT be altered + yield [0x1_00_00_00, 0x1_00_00_00, true, 2]; //Same version, multiple schemas targeting version - must be altered, we don't know which schemas are applicable + yield [0x1_00_00_00, 0x1_00_00_00, false, 1]; //Same version, one schema targeting version - do not change + yield [0x1_00_01_00, 0x1_00_00_00, true, 1]; //Schema newer than block: must be altered + yield [0x1_00_00_00, 0x1_00_01_00, false, 1]; //Block newer than schema: block must NOT be altered } /** * @dataProvider upgraderVersionCompatibilityProvider */ - public function testUpgraderVersionCompatibility(int $schemaVersion, int $stateVersion, bool $shouldChange) : void{ - $schema = $this->getNewSchemaVersion($schemaVersion); - $schema->renamedIds[self::TEST_BLOCK] = self::TEST_BLOCK_2; + public function testUpgraderVersionCompatibility(int $schemaVersion, int $stateVersion, bool $shouldChange, int $schemaCount) : void{ + for($i = 0; $i < $schemaCount; $i++){ + $schema = $this->getNewSchemaVersion($schemaVersion, $i); + $schema->renamedIds[self::TEST_BLOCK] = self::TEST_BLOCK_2; + } $getStateData = fn() => new BlockStateData( self::TEST_BLOCK, From 11ca208d934f54d7c403783888f052ccdbbf5d00 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Mar 2024 12:32:26 +0000 Subject: [PATCH 1664/1858] RakLib: Allow larger number of split packet parts some persona skins are insanely bloated and get split into hundreds of parts. it's quite annoying that we have to accommodate this, but we can't keep allowing players to experience login timeouts without an obvious indication what's wrong. --- src/network/mcpe/raklib/RakLibServer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index e2d6d9a669..5137b94ba2 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -96,7 +96,8 @@ class RakLibServer extends Thread{ new SimpleProtocolAcceptor($this->protocolVersion), new UserToRakLibThreadMessageReceiver(new PthreadsChannelReader($this->mainToThreadBuffer)), new RakLibToUserThreadMessageSender(new SnoozeAwarePthreadsChannelWriter($this->threadToMainBuffer, $this->sleeperEntry->createNotifier())), - new ExceptionTraceCleaner($this->mainPath) + new ExceptionTraceCleaner($this->mainPath), + recvMaxSplitParts: 512 ); $this->synchronized(function() : void{ $this->ready = true; From b77193b9876fe44bfde9eb6adc30fa48ae494a23 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Mar 2024 12:34:30 +0000 Subject: [PATCH 1665/1858] ZlibCompressor: Increase max decompression size to accommodate larger skins again, very annoying that we have to account for this (it makes it easier for attackers to waste CPU time and memory), but we don't really have much of a choice. --- src/network/mcpe/compression/ZlibCompressor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/compression/ZlibCompressor.php b/src/network/mcpe/compression/ZlibCompressor.php index a6000e7813..e908721c7a 100644 --- a/src/network/mcpe/compression/ZlibCompressor.php +++ b/src/network/mcpe/compression/ZlibCompressor.php @@ -38,7 +38,7 @@ final class ZlibCompressor implements Compressor{ public const DEFAULT_LEVEL = 7; public const DEFAULT_THRESHOLD = 256; - public const DEFAULT_MAX_DECOMPRESSION_SIZE = 2 * 1024 * 1024; + public const DEFAULT_MAX_DECOMPRESSION_SIZE = 8 * 1024 * 1024; /** * @see SingletonTrait::make() From e31fd122d9fb590bfee189cefb972fcf3f3a1a7b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Mar 2024 17:54:26 +0000 Subject: [PATCH 1666/1858] BlockStateReader: micro optimize unread properties check this has a pretty much insignificant performance impact, but reduces the cost of this check to basically 0. --- .../block/convert/BlockStateReader.php | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index ea44e90b4c..07effd4f99 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -38,20 +38,24 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; -use pocketmine\utils\Utils; +use function array_keys; +use function count; use function get_class; +use function implode; final class BlockStateReader{ /** - * @var true[] - * @phpstan-var array + * @var Tag[] + * @phpstan-var array */ - private array $usedStates = []; + private array $unusedStates; public function __construct( private BlockStateData $data - ){} + ){ + $this->unusedStates = $this->data->getStates(); + } public function missingOrWrongTypeException(string $name, ?Tag $tag) : BlockStateDeserializeException{ return new BlockStateDeserializeException("Property \"$name\" " . ($tag !== null ? "has unexpected type " . get_class($tag) : "is missing")); @@ -66,7 +70,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readBool(string $name) : bool{ - $this->usedStates[$name] = true; + unset($this->unusedStates[$name]); $tag = $this->data->getState($name); if($tag instanceof ByteTag){ switch($tag->getValue()){ @@ -80,7 +84,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readInt(string $name) : int{ - $this->usedStates[$name] = true; + unset($this->unusedStates[$name]); $tag = $this->data->getState($name); if($tag instanceof IntTag){ return $tag->getValue(); @@ -99,7 +103,7 @@ final class BlockStateReader{ /** @throws BlockStateDeserializeException */ public function readString(string $name) : string{ - $this->usedStates[$name] = true; + unset($this->unusedStates[$name]); //TODO: only allow a specific set of values (strings are primarily used for enums) $tag = $this->data->getState($name); if($tag instanceof StringTag){ @@ -346,7 +350,7 @@ final class BlockStateReader{ */ public function ignored(string $name) : void{ if($this->data->getState($name) !== null){ - $this->usedStates[$name] = true; + unset($this->unusedStates[$name]); }else{ throw $this->missingOrWrongTypeException($name, null); } @@ -363,10 +367,8 @@ final class BlockStateReader{ * @throws BlockStateDeserializeException */ public function checkUnreadProperties() : void{ - foreach(Utils::stringifyKeys($this->data->getStates()) as $name => $tag){ - if(!isset($this->usedStates[$name])){ - throw new BlockStateDeserializeException("Unread property \"$name\""); - } + if(count($this->unusedStates) > 0){ + throw new BlockStateDeserializeException("Unread properties: " . implode(", ", array_keys($this->unusedStates))); } } } From 7148c7a22234fad45d43132770d1fd8c8f495562 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Fri, 15 Mar 2024 16:44:37 +0000 Subject: [PATCH 1667/1858] Log rotate (#4032) `server.log` is not rotated by default and grows unmanageably large, to the point where it's so huge that it's not possible to read it with any standard text editor anymore. This PR implements automatic log rotation. - When the `server.log` reaches 32MB in size, it's moved to the `log_archive/` folder of the server's data folder. - The archive's file name will look something like this: `server.2024-03-15T15.26.24.0.log` - The file's name contains the date and time when the file was archived. This may be useful if you're trying to find logs from a particular time frame. This has several benefits: - Much more easily find logs from a particular time frame without scrolling through GBs of logs - Free up space without stopping the server - Archived log files in `log_archive/` can be safely deleted and/or modified while the server is running If you want to automatically compress or clean up the log files, I suggest an external cron job or disk watcher. Closes #4029. --- src/PocketMine.php | 3 +- src/utils/MainLogger.php | 4 +- src/utils/MainLoggerThread.php | 86 +++++++++++++++++++++-- tests/phpunit/scheduler/AsyncPoolTest.php | 2 +- 4 files changed, 84 insertions(+), 11 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index d13cf33a1a..d6e0ae5061 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -326,7 +326,8 @@ JIT_WARNING Terminal::init(); } - $logger = new MainLogger(Path::join($dataPath, "server.log"), Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get())); + $logger = new MainLogger(Path::join($dataPath, "server.log"), Path::join($dataPath, "log_archive"), Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get())); + \GlobalLogger::set($logger); emit_performance_warnings($logger); diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index ffd56b041a..20f9fb6e76 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -44,7 +44,7 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ /** * @throws \RuntimeException */ - public function __construct(string $logFile, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false){ + public function __construct(string $logFile, string $logArchiveDir, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false){ parent::__construct(); $this->logDebug = $logDebug; @@ -52,7 +52,7 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ $this->mainThreadName = $mainThreadName; $this->timezone = $timezone->getName(); - $this->logWriterThread = new MainLoggerThread($logFile); + $this->logWriterThread = new MainLoggerThread($logFile, $logArchiveDir); $this->logWriterThread->start(NativeThread::INHERIT_NONE); } diff --git a/src/utils/MainLoggerThread.php b/src/utils/MainLoggerThread.php index 548e23a4f1..e7acf97376 100644 --- a/src/utils/MainLoggerThread.php +++ b/src/utils/MainLoggerThread.php @@ -25,23 +25,42 @@ namespace pocketmine\utils; use pmmp\thread\Thread; use pmmp\thread\ThreadSafeArray; +use function clearstatcache; +use function date; use function fclose; +use function file_exists; use function fopen; +use function fstat; use function fwrite; +use function is_dir; +use function is_file; use function is_resource; +use function mkdir; +use function pathinfo; +use function rename; +use function strlen; use function touch; +use const PATHINFO_EXTENSION; +use const PATHINFO_FILENAME; final class MainLoggerThread extends Thread{ + /** @phpstan-var ThreadSafeArray */ private ThreadSafeArray $buffer; private bool $syncFlush = false; private bool $shutdown = false; public function __construct( - private string $logFile + private string $logFile, + private string $archiveDir, + private readonly int $maxFileSize = 32 * 1024 * 1024 //32 MB ){ $this->buffer = new ThreadSafeArray(); touch($this->logFile); + if(!@mkdir($this->archiveDir) && !is_dir($this->archiveDir)){ + throw new \RuntimeException("Unable to create archive directory: " . ( + is_file($this->archiveDir) ? "it already exists and is not a directory" : "permission denied")); + } } public function write(string $line) : void{ @@ -71,12 +90,64 @@ final class MainLoggerThread extends Thread{ $this->join(); } + /** @return resource */ + private function openLogFile(string $file, int &$size){ + $logResource = fopen($file, "ab"); + if(!is_resource($logResource)){ + throw new \RuntimeException("Couldn't open log file"); + } + $stat = fstat($logResource); + if($stat === false){ + throw new AssumptionFailedError("fstat() should not fail here"); + } + $size = $stat['size']; + return $logResource; + } + + /** + * @param resource $logResource + * @return resource + */ + private function archiveLogFile($logResource, int &$size){ + fclose($logResource); + + clearstatcache(); + + $i = 0; + $date = date("Y-m-d\TH.i.s"); + $baseName = pathinfo($this->logFile, PATHINFO_FILENAME); + $extension = pathinfo($this->logFile, PATHINFO_EXTENSION); + do{ + //this shouldn't be necessary, but in case the user messes with the system time for some reason ... + $fileName = "$baseName.$date.$i.$extension"; + $out = $this->archiveDir . "/" . $fileName; + $i++; + }while(file_exists($out)); + + //the user may have externally deleted the whole directory - make sure it exists before we do anything + @mkdir($this->archiveDir); + rename($this->logFile, $out); + + $logResource = $this->openLogFile($this->logFile, $size); + fwrite($logResource, "--- Starting new log file - old log file archived as $fileName ---\n"); + + return $logResource; + } + + private function logFileReadyToArchive(int $size) : bool{ + return $size >= $this->maxFileSize; + } + /** * @param resource $logResource */ - private function writeLogStream($logResource) : void{ + private function writeLogStream(&$logResource, int &$size) : void{ while(($chunk = $this->buffer->shift()) !== null){ fwrite($logResource, $chunk); + $size += strlen($chunk); + if($this->logFileReadyToArchive($size)){ + $logResource = $this->archiveLogFile($logResource, $size); + } } $this->synchronized(function() : void{ @@ -88,13 +159,14 @@ final class MainLoggerThread extends Thread{ } public function run() : void{ - $logResource = fopen($this->logFile, "ab"); - if(!is_resource($logResource)){ - throw new \RuntimeException("Couldn't open log file"); + $size = 0; + $logResource = $this->openLogFile($this->logFile, $size); + if($this->logFileReadyToArchive($size)){ + $logResource = $this->archiveLogFile($logResource, $size); } while(!$this->shutdown){ - $this->writeLogStream($logResource); + $this->writeLogStream($logResource, $size); $this->synchronized(function() : void{ if(!$this->shutdown && !$this->syncFlush){ $this->wait(); @@ -102,7 +174,7 @@ final class MainLoggerThread extends Thread{ }); } - $this->writeLogStream($logResource); + $this->writeLogStream($logResource, $size); fclose($logResource); } diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 54c8ccafda..51622dd227 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -45,7 +45,7 @@ class AsyncPoolTest extends TestCase{ public function setUp() : void{ @define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php'); - $this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"), false, "Main", new \DateTimeZone('UTC')); + $this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"), sys_get_temp_dir(), false, "Main", new \DateTimeZone('UTC')); $this->pool = new AsyncPool(2, 1024, new ThreadSafeClassLoader(), $this->mainLogger, new SleeperHandler()); } From f527a4c8fe3787c7e4b187f0ed6d174c6dd5e5a7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Mar 2024 17:53:50 +0000 Subject: [PATCH 1668/1858] Added --no-log-file command line option while this would be more user-friendly as a config option, configs are a pain because they aren't initialized until after the server log has already been set up. In any case, I foresee that people will likely want to bake this into Dockerfiles directly anyway. --- src/BootstrapOptions.php | 2 ++ src/PocketMine.php | 8 +++++-- src/utils/MainLogger.php | 28 ++++++++++++++--------- tests/phpunit/scheduler/AsyncPoolTest.php | 2 +- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/BootstrapOptions.php b/src/BootstrapOptions.php index c34dda94b9..6a14696252 100644 --- a/src/BootstrapOptions.php +++ b/src/BootstrapOptions.php @@ -47,4 +47,6 @@ final class BootstrapOptions{ public const DATA = "data"; /** Shows basic server version information and exits */ public const VERSION = "version"; + /** Disables writing logs to server.log */ + public const NO_LOG_FILE = "no-log-file"; } diff --git a/src/PocketMine.php b/src/PocketMine.php index d6e0ae5061..f0fba9dcbc 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -317,7 +317,7 @@ JIT_WARNING //Logger has a dependency on timezone Timezone::init(); - $opts = getopt("", [BootstrapOptions::NO_WIZARD, BootstrapOptions::ENABLE_ANSI, BootstrapOptions::DISABLE_ANSI]); + $opts = getopt("", [BootstrapOptions::NO_WIZARD, BootstrapOptions::ENABLE_ANSI, BootstrapOptions::DISABLE_ANSI, BootstrapOptions::NO_LOG_FILE]); if(isset($opts[BootstrapOptions::ENABLE_ANSI])){ Terminal::init(true); }elseif(isset($opts[BootstrapOptions::DISABLE_ANSI])){ @@ -325,8 +325,12 @@ JIT_WARNING }else{ Terminal::init(); } + $logFile = isset($opts[BootstrapOptions::NO_LOG_FILE]) ? null : Path::join($dataPath, "server.log"); - $logger = new MainLogger(Path::join($dataPath, "server.log"), Path::join($dataPath, "log_archive"), Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get())); + $logger = new MainLogger($logFile, Path::join($dataPath, "log_archive"), Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get())); + if($logFile === null){ + $logger->notice("Logging to file disabled. Ensure logs are collected by other means (e.g. Docker logs)."); + } \GlobalLogger::set($logger); diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index 20f9fb6e76..da2ba73da1 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -39,12 +39,12 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ private bool $useFormattingCodes = false; private string $mainThreadName; private string $timezone; - private MainLoggerThread $logWriterThread; + private ?MainLoggerThread $logWriterThread = null; /** * @throws \RuntimeException */ - public function __construct(string $logFile, string $logArchiveDir, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false){ + public function __construct(?string $logFile, string $logArchiveDir, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false){ parent::__construct(); $this->logDebug = $logDebug; @@ -52,8 +52,10 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ $this->mainThreadName = $mainThreadName; $this->timezone = $timezone->getName(); - $this->logWriterThread = new MainLoggerThread($logFile, $logArchiveDir); - $this->logWriterThread->start(NativeThread::INHERIT_NONE); + if($logFile !== null){ + $this->logWriterThread = new MainLoggerThread($logFile, $logArchiveDir); + $this->logWriterThread->start(NativeThread::INHERIT_NONE); + } } /** @@ -166,10 +168,12 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ } public function shutdownLogWriterThread() : void{ - if(NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ - $this->logWriterThread->shutdown(); - }else{ - throw new \LogicException("Only the creator thread can shutdown the logger thread"); + if($this->logWriterThread !== null){ + if(NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ + $this->logWriterThread->shutdown(); + }else{ + throw new \LogicException("Only the creator thread can shutdown the logger thread"); + } } } @@ -193,7 +197,9 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ $this->synchronized(function() use ($message, $level, $time) : void{ Terminal::writeLine($message); - $this->logWriterThread->write($time->format("Y-m-d") . " " . TextFormat::clean($message) . PHP_EOL); + if($this->logWriterThread !== null){ + $this->logWriterThread->write($time->format("Y-m-d") . " " . TextFormat::clean($message) . PHP_EOL); + } /** * @var ThreadSafeLoggerAttachment $attachment @@ -205,11 +211,11 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ } public function syncFlushBuffer() : void{ - $this->logWriterThread->syncFlushBuffer(); + $this->logWriterThread?->syncFlushBuffer(); } public function __destruct(){ - if(!$this->logWriterThread->isJoined() && NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ + if($this->logWriterThread !== null && !$this->logWriterThread->isJoined() && NativeThread::getCurrentThreadId() === $this->logWriterThread->getCreatorId()){ $this->shutdownLogWriterThread(); } } diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 51622dd227..294092eadc 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -45,7 +45,7 @@ class AsyncPoolTest extends TestCase{ public function setUp() : void{ @define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php'); - $this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"), sys_get_temp_dir(), false, "Main", new \DateTimeZone('UTC')); + $this->mainLogger = new MainLogger(null, sys_get_temp_dir(), false, "Main", new \DateTimeZone('UTC')); $this->pool = new AsyncPool(2, 1024, new ThreadSafeClassLoader(), $this->mainLogger, new SleeperHandler()); } From 981f49ff56e57610f35c146bf5c520cf2ae91049 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 15 Mar 2024 18:03:44 +0000 Subject: [PATCH 1669/1858] CS --- tests/phpunit/scheduler/AsyncPoolTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 294092eadc..d7bacd391a 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -33,7 +33,6 @@ use function define; use function dirname; use function microtime; use function sys_get_temp_dir; -use function tempnam; use function usleep; class AsyncPoolTest extends TestCase{ From 556b00d11f5c4a5cd16d955f9e57156e1fd6e42b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:06:50 +0000 Subject: [PATCH 1670/1858] Bump phpstan/phpstan from 1.10.60 to 1.10.62 (#6289) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.60 to 1.10.62. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.60...1.10.62) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 962777275e..e79ef4859e 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.60", + "phpstan/phpstan": "1.10.62", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 0b04e40df1..230c1d1863 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e861861cb1f632e1db21efc6875a0aba", + "content-hash": "549a32065a300a7dfe74df2407b81126", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.60", + "version": "1.10.62", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" + "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd5c8a1660ed3540b211407c77abf4af193a6af9", + "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-03-07T13:30:19+00:00" + "time": "2024-03-13T12:27:20+00:00" }, { "name": "phpstan/phpstan-phpunit", From 94e0bf954b1d6f258ea067e44a3fb6ae807062eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:08:13 +0000 Subject: [PATCH 1671/1858] Bump docker/build-push-action from 5.2.0 to 5.3.0 (#6288) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.2.0 to 5.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5.2.0...v5.3.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index ea8137f89e..6e035e735a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v5.2.0 + uses: docker/build-push-action@v5.3.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.2.0 + uses: docker/build-push-action@v5.3.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.2.0 + uses: docker/build-push-action@v5.3.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.2.0 + uses: docker/build-push-action@v5.3.0 with: push: true context: ./pocketmine-mp From 0e5395c59bdc0d130eafa6c9b385075214988e52 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 18 Mar 2024 16:48:17 +0000 Subject: [PATCH 1672/1858] PocketMine-MP.phar self-extraction to decompressed cache (#6217) Because ext-phar sucks, tmp gets spammed by cache files for every thread when loading files from the phar on the fly. Instead, we convert the `.phar` into a decompressed `.tar` in the tmp directory and require files from inside it. Surprisingly, this works because `ext-phar` supports `tar` and `zip` natively. No stream wrapper is required, as the `PocketMine.php` bootstrap loads files relative to its location, so the cache is automatically used for everything. To be honest I would rather get rid of phars entirely, but they are still the easiest way to have PhpStorm load PocketMine-MP API information for now, and the alternatives are more complicated and inconvenient. ### Caveats Everywhere that previously used `new Phar(Phar::running(false))` in the core code needs to be updated to use `PharData` for this to work correctly. Plugins don't need to do anything. ### Why not just use `Phar::decompressFiles()`? This requires setting `phar.readonly` to `0`, which is a security issue. Technically, we could have used a subprocess to do this, but it just didn't seem right. ### WTF? `phar://` can be used on `tar` files??? Yup. I was just as surprised to find out that `require` works in such contexts. ### Relevant issues - Closes #6214 ## Changes ### API changes None. ### Behavioural changes Server startup will be slightly slower, as the phar has to decompress and convert itself into a `.tar`. However, testing showed that this generally takes less than 200 ms, so it should be barely noticeable. ## Backwards compatibility No BC issues. ## Tests Locally tested and the CI will also verify --- build/server-phar-stub.php | 168 +++++++++++++++++++++++++++++++++++++ build/server-phar.php | 18 +--- src/VersionInfo.php | 6 +- 3 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 build/server-phar-stub.php diff --git a/build/server-phar-stub.php b/build/server-phar-stub.php new file mode 100644 index 0000000000..b4018e3a78 --- /dev/null +++ b/build/server-phar-stub.php @@ -0,0 +1,168 @@ +convertToData(\Phar::TAR, \Phar::NONE); + unset($phar); + \Phar::unlinkArchive($tmpPharPath); + + return $tmpName . ".tar"; +} + +/** + * Locks a phar tmp cache to prevent it from being deleted by other server instances. + * This code looks similar to Filesystem::createLockFile(), but we can't use that because it's inside the compressed + * phar. + */ +function lockPharCache(string $lockFilePath) : void{ + //this static variable will keep the file(s) locked until the process ends + static $lockFiles = []; + + $lockFile = fopen($lockFilePath, "wb"); + if($lockFile === false){ + throw new \RuntimeException("Failed to open temporary file"); + } + flock($lockFile, LOCK_EX); //this tells other server instances not to delete this cache file + fwrite($lockFile, (string) getmypid()); //maybe useful for debugging + fflush($lockFile); + $lockFiles[$lockFilePath] = $lockFile; +} + +/** + * Prepares a decompressed .tar of PocketMine-MP.phar in the system temp directory for loading code from. + * + * @return string path to the temporary decompressed phar (actually a .tar) + */ +function preparePharCache(string $tmpPath, string $pharPath) : string{ + clearstatcache(); + + $tmpName = tempnam($tmpPath, "PMMP"); + if($tmpName === false){ + throw new \RuntimeException("Failed to create temporary file"); + } + + lockPharCache($tmpName . ".lock"); + return convertPharToTar($tmpName, $pharPath); +} + +$tmpDir = preparePharCacheDirectory(); +cleanupPharCache($tmpDir); +echo "Preparing PocketMine-MP.phar decompressed cache...\n"; +$start = hrtime(true); +$cacheName = preparePharCache($tmpDir, __FILE__); +echo "Cache ready at $cacheName in " . number_format((hrtime(true) - $start) / 1e9, 2) . "s\n"; + +require 'phar://' . str_replace(DIRECTORY_SEPARATOR, '/', $cacheName) . '/src/PocketMine.php'; diff --git a/build/server-phar.php b/build/server-phar.php index 8b4d410ce1..f6bb29d514 100644 --- a/build/server-phar.php +++ b/build/server-phar.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\build\server_phar; +use pocketmine\utils\Filesystem; use pocketmine\utils\Git; +use Symfony\Component\Filesystem\Path; use function array_map; use function count; use function dirname; @@ -169,21 +171,7 @@ function main() : void{ 'git' => $gitHash, 'build' => $build ], - <<<'STUB' -getMetadata(); if(isset($meta["git"])){ $gitHash = $meta["git"]; @@ -82,7 +83,8 @@ final class VersionInfo{ if(self::$buildNumber === null){ self::$buildNumber = 0; if(\Phar::running(true) !== ""){ - $phar = new \Phar(\Phar::running(false)); + $pharPath = \Phar::running(false); + $phar = \Phar::isValidPharFilename($pharPath) ? new \Phar($pharPath) : new \PharData($pharPath); $meta = $phar->getMetadata(); if(is_array($meta) && isset($meta["build"]) && is_int($meta["build"])){ self::$buildNumber = $meta["build"]; From b680a1693c2a5e03937f1413e85281c49f722417 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:18:30 +0300 Subject: [PATCH 1673/1858] Added sound when picking sweet berries (#6287) --- src/block/SweetBerryBush.php | 2 ++ src/world/sound/SweetBerriesPickSound.php | 35 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/world/sound/SweetBerriesPickSound.php diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index a0a26ef6e3..eabdde118a 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -36,6 +36,7 @@ use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\world\sound\SweetBerriesPickSound; use function mt_rand; class SweetBerryBush extends Flowable{ @@ -81,6 +82,7 @@ class SweetBerryBush extends Flowable{ }elseif(($dropAmount = $this->getBerryDropAmount()) > 0){ $world->setBlock($this->position, $this->setAge(self::STAGE_BUSH_NO_BERRIES)); $world->dropItem($this->position, $this->asItem()->setCount($dropAmount)); + $world->addSound($this->position, new SweetBerriesPickSound()); } return true; diff --git a/src/world/sound/SweetBerriesPickSound.php b/src/world/sound/SweetBerriesPickSound.php new file mode 100644 index 0000000000..fb8f3c8cf9 --- /dev/null +++ b/src/world/sound/SweetBerriesPickSound.php @@ -0,0 +1,35 @@ + Date: Mon, 25 Mar 2024 13:52:21 +0300 Subject: [PATCH 1674/1858] Added new banner patterns (#6298) --- src/block/utils/BannerPatternType.php | 2 ++ src/data/bedrock/BannerPatternTypeIdMap.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/block/utils/BannerPatternType.php b/src/block/utils/BannerPatternType.php index 083fada1b3..cd63226a75 100644 --- a/src/block/utils/BannerPatternType.php +++ b/src/block/utils/BannerPatternType.php @@ -82,6 +82,7 @@ enum BannerPatternType{ case DIAGONAL_UP_LEFT; case DIAGONAL_UP_RIGHT; case FLOWER; + case GLOBE; case GRADIENT; case GRADIENT_UP; case HALF_HORIZONTAL; @@ -89,6 +90,7 @@ enum BannerPatternType{ case HALF_VERTICAL; case HALF_VERTICAL_RIGHT; case MOJANG; + case PIGLIN; case RHOMBUS; case SKULL; case SMALL_STRIPES; diff --git a/src/data/bedrock/BannerPatternTypeIdMap.php b/src/data/bedrock/BannerPatternTypeIdMap.php index 87f9b8f571..d1884350fa 100644 --- a/src/data/bedrock/BannerPatternTypeIdMap.php +++ b/src/data/bedrock/BannerPatternTypeIdMap.php @@ -56,6 +56,7 @@ final class BannerPatternTypeIdMap{ BannerPatternType::DIAGONAL_UP_LEFT => "ld", BannerPatternType::DIAGONAL_UP_RIGHT => "rud", BannerPatternType::FLOWER => "flo", + BannerPatternType::GLOBE => "glb", BannerPatternType::GRADIENT => "gra", BannerPatternType::GRADIENT_UP => "gru", BannerPatternType::HALF_HORIZONTAL => "hh", @@ -63,6 +64,7 @@ final class BannerPatternTypeIdMap{ BannerPatternType::HALF_VERTICAL => "vh", BannerPatternType::HALF_VERTICAL_RIGHT => "vhr", BannerPatternType::MOJANG => "moj", + BannerPatternType::PIGLIN => "pig", BannerPatternType::RHOMBUS => "mr", BannerPatternType::SKULL => "sku", BannerPatternType::SMALL_STRIPES => "ss", From 258431420233dc2c63c86bdf353e3b4520eba40c Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Mon, 25 Mar 2024 11:53:16 +0100 Subject: [PATCH 1675/1858] NetherRoots: fix placement on soul soil (#6299) --- src/block/NetherRoots.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/block/NetherRoots.php b/src/block/NetherRoots.php index 5c39b8bec3..0b08d1b180 100644 --- a/src/block/NetherRoots.php +++ b/src/block/NetherRoots.php @@ -34,6 +34,7 @@ final class NetherRoots extends Flowable{ $supportBlock = $block->getSide(Facing::DOWN); return $supportBlock->hasTypeTag(BlockTypeTags::DIRT) || - $supportBlock->hasTypeTag(BlockTypeTags::MUD); + $supportBlock->hasTypeTag(BlockTypeTags::MUD) || + $supportBlock->getTypeId() === BlockTypeIds::SOUL_SOIL; } } From 11f119551dec2771f0af8b9ae25e88a67d854b16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:55:22 +0000 Subject: [PATCH 1676/1858] Bump phpstan/phpstan from 1.10.62 to 1.10.65 (#6308) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.62 to 1.10.65. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.62...1.10.65) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index e79ef4859e..f2ce28e3d6 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.62", + "phpstan/phpstan": "1.10.65", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 230c1d1863..0bbdcdc279 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "549a32065a300a7dfe74df2407b81126", + "content-hash": "ef9f275c4be8bc09da410e668b2decbf", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.62", + "version": "1.10.65", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9" + "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd5c8a1660ed3540b211407c77abf4af193a6af9", - "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6", + "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-03-13T12:27:20+00:00" + "time": "2024-03-23T10:30:26+00:00" }, { "name": "phpstan/phpstan-phpunit", From f799cfaba6318dcf90fce3956bb4843d12581df2 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Mon, 25 Mar 2024 17:15:54 +0300 Subject: [PATCH 1677/1858] Implemented sound when equipping armor (#6303) --- src/entity/Living.php | 16 +++++++++ src/item/ArmorMaterial.php | 12 ++++++- src/item/VanillaArmorMaterials.php | 21 ++++++++---- src/world/sound/ArmorEquipChainSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipDiamondSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipGenericSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipGoldSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipIronSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipLeatherSound.php | 35 ++++++++++++++++++++ src/world/sound/ArmorEquipNetheriteSound.php | 35 ++++++++++++++++++++ 10 files changed, 286 insertions(+), 8 deletions(-) create mode 100644 src/world/sound/ArmorEquipChainSound.php create mode 100644 src/world/sound/ArmorEquipDiamondSound.php create mode 100644 src/world/sound/ArmorEquipGenericSound.php create mode 100644 src/world/sound/ArmorEquipGoldSound.php create mode 100644 src/world/sound/ArmorEquipIronSound.php create mode 100644 src/world/sound/ArmorEquipLeatherSound.php create mode 100644 src/world/sound/ArmorEquipNetheriteSound.php diff --git a/src/entity/Living.php b/src/entity/Living.php index e7d669fda7..9a95cae071 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -149,6 +149,22 @@ abstract class Living extends Entity{ $this->getViewers(), fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobArmorChange($recipients, $this) ))); + $playArmorSound = function(Item $newItem, Item $oldItem) : void{ + if(!$newItem->isNull() && $newItem instanceof Armor && !$newItem->equalsExact($oldItem)){ + $equipSound = $newItem->getMaterial()->getEquipSound(); + if($equipSound !== null){ + $this->broadcastSound($equipSound); + } + } + }; + $this->armorInventory->getListeners()->add(new CallbackInventoryListener( + fn(Inventory $inventory, int $slot, Item $oldItem) => $playArmorSound($inventory->getItem($slot), $oldItem), + function(Inventory $inventory, array $oldContents) use ($playArmorSound) : void{ + foreach($oldContents as $slot => $oldItem){ + $playArmorSound($inventory->getItem($slot), $oldItem); + } + } + )); $health = $this->getMaxHealth(); diff --git a/src/item/ArmorMaterial.php b/src/item/ArmorMaterial.php index c7915bacce..d0ea33feb4 100644 --- a/src/item/ArmorMaterial.php +++ b/src/item/ArmorMaterial.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\world\sound\Sound; + class ArmorMaterial{ public function __construct( - private readonly int $enchantability + private readonly int $enchantability, + private readonly ?Sound $equipSound = null ){ } @@ -39,4 +42,11 @@ class ArmorMaterial{ public function getEnchantability() : int{ return $this->enchantability; } + + /** + * Returns the sound that plays when equipping the armor + */ + public function getEquipSound() : ?Sound{ + return $this->equipSound; + } } diff --git a/src/item/VanillaArmorMaterials.php b/src/item/VanillaArmorMaterials.php index ab2909bce3..818273d208 100644 --- a/src/item/VanillaArmorMaterials.php +++ b/src/item/VanillaArmorMaterials.php @@ -24,6 +24,13 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\utils\RegistryTrait; +use pocketmine\world\sound\ArmorEquipChainSound; +use pocketmine\world\sound\ArmorEquipDiamondSound; +use pocketmine\world\sound\ArmorEquipGenericSound; +use pocketmine\world\sound\ArmorEquipGoldSound; +use pocketmine\world\sound\ArmorEquipIronSound; +use pocketmine\world\sound\ArmorEquipLeatherSound; +use pocketmine\world\sound\ArmorEquipNetheriteSound; /** * This doc-block is generated automatically, do not modify it manually. @@ -62,12 +69,12 @@ final class VanillaArmorMaterials{ } protected static function setup() : void{ - self::register("leather", new ArmorMaterial(15)); - self::register("chainmail", new ArmorMaterial(12)); - self::register("iron", new ArmorMaterial(9)); - self::register("turtle", new ArmorMaterial(9)); - self::register("gold", new ArmorMaterial(25)); - self::register("diamond", new ArmorMaterial(10)); - self::register("netherite", new ArmorMaterial(15)); + self::register("leather", new ArmorMaterial(15, new ArmorEquipLeatherSound())); + self::register("chainmail", new ArmorMaterial(12, new ArmorEquipChainSound())); + self::register("iron", new ArmorMaterial(9, new ArmorEquipIronSound())); + self::register("turtle", new ArmorMaterial(9, new ArmorEquipGenericSound())); + self::register("gold", new ArmorMaterial(25, new ArmorEquipGoldSound())); + self::register("diamond", new ArmorMaterial(10, new ArmorEquipDiamondSound())); + self::register("netherite", new ArmorMaterial(15, new ArmorEquipNetheriteSound())); } } diff --git a/src/world/sound/ArmorEquipChainSound.php b/src/world/sound/ArmorEquipChainSound.php new file mode 100644 index 0000000000..efcb4f982e --- /dev/null +++ b/src/world/sound/ArmorEquipChainSound.php @@ -0,0 +1,35 @@ + Date: Mon, 25 Mar 2024 14:58:21 +0000 Subject: [PATCH 1678/1858] workaround for callback-validator not understanding arrow functions --- src/entity/Living.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index 9a95cae071..a6902ae69e 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -158,7 +158,9 @@ abstract class Living extends Entity{ } }; $this->armorInventory->getListeners()->add(new CallbackInventoryListener( - fn(Inventory $inventory, int $slot, Item $oldItem) => $playArmorSound($inventory->getItem($slot), $oldItem), + function(Inventory $inventory, int $slot, Item $oldItem) : void{ + $playArmorSound($inventory->getItem($slot), $oldItem); + }, function(Inventory $inventory, array $oldContents) use ($playArmorSound) : void{ foreach($oldContents as $slot => $oldItem){ $playArmorSound($inventory->getItem($slot), $oldItem); From d5919dc094c60799be2747c9f4235dba26364b9b Mon Sep 17 00:00:00 2001 From: Dylan T Date: Mon, 25 Mar 2024 17:24:52 +0000 Subject: [PATCH 1679/1858] ... --- src/entity/Living.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index a6902ae69e..e695ba425f 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -158,7 +158,7 @@ abstract class Living extends Entity{ } }; $this->armorInventory->getListeners()->add(new CallbackInventoryListener( - function(Inventory $inventory, int $slot, Item $oldItem) : void{ + function(Inventory $inventory, int $slot, Item $oldItem) use ($playArmorSound) : void{ $playArmorSound($inventory->getItem($slot), $oldItem); }, function(Inventory $inventory, array $oldContents) use ($playArmorSound) : void{ From 0615afa7665e3b84904371b6beb4f4ab9afa021d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:12:31 +0100 Subject: [PATCH 1680/1858] Bump phpstan/phpstan from 1.10.65 to 1.10.66 (#6317) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.65 to 1.10.66. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.65...1.10.66) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index f2ce28e3d6..0e93062f65 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.65", + "phpstan/phpstan": "1.10.66", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 0bbdcdc279..8d1c9ec762 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ef9f275c4be8bc09da410e668b2decbf", + "content-hash": "f0a5391180046806c7263b50a8913ddd", "packages": [ { "name": "adhocore/json-comment", @@ -1380,16 +1380,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.65", + "version": "1.10.66", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6" + "reference": "94779c987e4ebd620025d9e5fdd23323903950bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6", - "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd", + "reference": "94779c987e4ebd620025d9e5fdd23323903950bd", "shasum": "" }, "require": { @@ -1438,7 +1438,7 @@ "type": "tidelift" } ], - "time": "2024-03-23T10:30:26+00:00" + "time": "2024-03-28T16:17:31+00:00" }, { "name": "phpstan/phpstan-phpunit", From de6a91dabc9c26b183f7e08b7a0d7fd36f621361 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 30 Mar 2024 13:56:05 +0000 Subject: [PATCH 1681/1858] Rework consistency check to tolerate dynamic type IDs we don't actually care about the specific values, only whether all the blocks and their states have been correctly registered. I'd prefer to track all of the state data permutations, but the APIs for that are private, so tracking the number of permutations will have to suffice (this should be good enough to detect bugs anyway, and also takes way less space). --- tests/phpunit/block/BlockTest.php | 96 ++- .../block_factory_consistency_check.json | 693 +++++++++++++++++- .../block/regenerate_consistency_check.php | 75 +- 3 files changed, 770 insertions(+), 94 deletions(-) diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index f876bf402d..6ade2bffe2 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -24,13 +24,16 @@ declare(strict_types=1); namespace pocketmine\block; use PHPUnit\Framework\TestCase; -use function asort; -use function file_get_contents; +use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; +use pocketmine\utils\Utils; +use function implode; use function is_array; +use function is_int; +use function is_string; use function json_decode; use function log; -use function print_r; -use const SORT_STRING; +use const JSON_THROW_ON_ERROR; class BlockTest extends TestCase{ @@ -91,34 +94,71 @@ 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, stateDataBits: int}"); + /** + * @return int[] + * @phpstan-return array + */ + public static function computeConsistencyCheckTable(RuntimeBlockStateRegistry $blockStateRegistry) : array{ + $newTable = []; + + $idNameLookup = []; + //if we ever split up block registration into multiple registries (e.g. separating chemistry blocks), + //we'll need to ensure those additional registries are also included here + foreach(Utils::stringifyKeys(VanillaBlocks::getAll()) as $name => $blockType){ + $id = $blockType->getTypeId(); + if(isset($idNameLookup[$id])){ + throw new AssumptionFailedError("TypeID $name collides with " . $idNameLookup[$id]); + } + $idNameLookup[$id] = $name; } - $knownStates = []; - /** - * @var string $name - * @var int[] $stateIds - */ - foreach($list["knownStates"] as $name => $stateIds){ - foreach($stateIds as $stateId){ - $knownStates[$stateId] = $name; + + foreach($blockStateRegistry->getAllKnownStates() as $index => $block){ + if($index !== $block->getStateId()){ + throw new AssumptionFailedError("State index should always match state ID"); + } + $idName = $idNameLookup[$block->getTypeId()]; + $newTable[$idName] = ($newTable[$idName] ?? 0) + 1; + } + + return $newTable; + } + + /** + * @phpstan-param array $actual + * + * @return string[] + */ + public static function computeConsistencyCheckDiff(string $expectedFile, array $actual) : array{ + $expected = json_decode(Filesystem::fileGetContents($expectedFile), true, 2, JSON_THROW_ON_ERROR); + if(!is_array($expected)){ + throw new AssumptionFailedError("Old table should be array"); + } + + $errors = []; + foreach($expected as $typeName => $numStates){ + if(!is_string($typeName) || !is_int($numStates)){ + throw new AssumptionFailedError("Old table should be array"); + } + if(!isset($actual[$typeName])){ + $errors[] = "Removed block type $typeName ($numStates permutations)"; + }elseif($actual[$typeName] !== $numStates){ + $errors[] = "Block type $typeName permutation count changed: $numStates -> " . $actual[$typeName]; + } + } + foreach(Utils::stringifyKeys($actual) as $typeName => $numStates){ + if(!isset($expected[$typeName])){ + $errors[] = "Added block type $typeName (" . $actual[$typeName] . " permutations)"; } } - $oldStateDataSize = $list["stateDataBits"]; - self::assertSame($oldStateDataSize, Block::INTERNAL_STATE_DATA_BITS, "Changed number of state data bits - consistency check probably need regenerating"); - $states = $this->blockFactory->getAllKnownStates(); - foreach($states as $stateId => $state){ - self::assertArrayHasKey($stateId, $knownStates, "New block state $stateId (" . 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 " . ($k >> Block::INTERNAL_STATE_DATA_BITS) . ":" . ($k & Block::INTERNAL_STATE_DATA_MASK) . " ($name)"); - self::assertSame($name, $states[$k]->getName()); - } + return $errors; + } + + public function testConsistency() : void{ + $newTable = self::computeConsistencyCheckTable($this->blockFactory); + $errors = self::computeConsistencyCheckDiff(__DIR__ . '/block_factory_consistency_check.json', $newTable); + + self::assertEmpty($errors, "Block factory consistency check failed:\n" . implode("\n", $errors)); } public function testEmptyStateId() : void{ diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 9e68daf0c4..27bf831841 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1,692 @@ -{"knownStates":{"???":[20992881],"Acacia Button":[20482064,20482065,20482068,20482069,20482070,20482071,20482072,20482073,20482076,20482077,20482078,20482079],"Acacia Door":[20484288,20484289,20484290,20484291,20484292,20484293,20484294,20484295,20484296,20484297,20484298,20484299,20484300,20484301,20484302,20484303,20484304,20484305,20484306,20484307,20484308,20484309,20484310,20484311,20484312,20484313,20484314,20484315,20484316,20484317,20484318,20484319],"Acacia Fence":[20487161],"Acacia Fence Gate":[20489840,20489841,20489842,20489843,20489844,20489845,20489846,20489847,20489848,20489849,20489850,20489851,20489852,20489853,20489854,20489855],"Acacia Leaves":[20490916,20490917,20490918,20490919],"Acacia Log":[20492840,20492841,20492842,20492843,20492846,20492847],"Acacia Planks":[20496170],"Acacia Pressure Plate":[20497912,20497913],"Acacia Sapling":[20499538,20499539],"Acacia Sign":[20502272,20502273,20502274,20502275,20502276,20502277,20502278,20502279,20502280,20502281,20502282,20502283,20502284,20502285,20502286,20502287],"Acacia Slab":[20502804,20502805,20502806],"Acacia Stairs":[20504680,20504681,20504682,20504683,20504684,20504685,20504686,20504687],"Acacia Trapdoor":[20508544,20508545,20508546,20508547,20508548,20508549,20508550,20508551,20508552,20508553,20508554,20508555,20508556,20508557,20508558,20508559],"Acacia Wall Sign":[20508856,20508857,20508858,20508859],"Acacia Wood":[20511120,20511121,20511122,20511123,20511124,20511125],"Actinium":[20754337],"Activator Rail":[20513778,20513779,20513780,20513781,20513782,20513783,20513786,20513787,20513788,20513789,20513790,20513791],"Air":[20481500],"All Sided Mushroom Stem":[20515945],"Allium":[20517436],"Aluminum":[20756409],"Americium":[20756900],"Amethyst":[21587565],"Amethyst Cluster":[21582624,21582625,21582626,21582627,21582628,21582629,21582630,21582631,21582632,21582633,21582634,21582635,21582636,21582637,21582638,21582639,21582640,21582641,21582642,21582643,21582644,21582645,21582646,21582647],"Ancient Debris":[21589690],"Andesite":[20520193],"Andesite Slab":[20521816,20521818,20521819],"Andesite Stairs":[20523416,20523417,20523418,20523419,20523420,20523421,20523422,20523423],"Andesite Wall":[20525824,20525825,20525826,20525827,20525828,20525829,20525830,20525831,20525832,20525833,20525834,20525835,20525836,20525837,20525838,20525839,20525846,20525888,20525889,20525890,20525891,20525892,20525893,20525894,20525895,20525896,20525897,20525898,20525899,20525900,20525901,20525902,20525903,20525904,20525905,20525906,20525907,20525908,20525909,20525910,20525911,20525912,20525913,20525914,20525915,20525916,20525917,20525918,20525919,20525920,20525921,20525922,20525923,20525924,20525925,20525926,20525927,20525928,20525929,20525930,20525931,20525932,20525933,20525934,20525935,20525936,20525937,20525938,20525939,20525940,20525941,20525942,20525943,20525944,20525945,20525946,20525947,20525948,20525949,20525950,20525951,20525952,20525953,20525954,20525955,20525956,20525957,20525958,20525959,20525960,20525961,20525962,20525963,20525964,20525965,20525966,20525967,20525974,20526016,20526017,20526018,20526019,20526020,20526021,20526022,20526023,20526024,20526025,20526026,20526027,20526028,20526029,20526030,20526031,20526032,20526033,20526034,20526035,20526036,20526037,20526038,20526039,20526040,20526041,20526042,20526043,20526044,20526045,20526046,20526047,20526048,20526049,20526050,20526051,20526052,20526053,20526054,20526055,20526056,20526057,20526058,20526059,20526060,20526061,20526062,20526063,20526064,20526065,20526066,20526067,20526068,20526069,20526070,20526071,20526072,20526073,20526074,20526075,20526076,20526077,20526078,20526079],"Antimony":[20760253],"Anvil":[20528176,20528177,20528179,20528180,20528181,20528183,20528184,20528185,20528187,20528188,20528189,20528191],"Argon":[20760826],"Arsenic":[20763178],"Astatine":[20766501],"Azalea Leaves":[21886340,21886341,21886342,21886343],"Azure Bluet":[20531031],"Bamboo":[20531777,20531778,20531779,20531781,20531782,20531783,20531785,20531786,20531787,20531789,20531790,20531791],"Bamboo Sapling":[20533516,20533517],"Banner":[20535808,20535809,20535810,20535811,20535812,20535813,20535814,20535815,20535816,20535817,20535818,20535819,20535820,20535821,20535822,20535823,20535824,20535825,20535826,20535827,20535828,20535829,20535830,20535831,20535832,20535833,20535834,20535835,20535836,20535837,20535838,20535839,20535840,20535841,20535842,20535843,20535844,20535845,20535846,20535847,20535848,20535849,20535850,20535851,20535852,20535853,20535854,20535855,20535856,20535857,20535858,20535859,20535860,20535861,20535862,20535863,20535864,20535865,20535866,20535867,20535868,20535869,20535870,20535871,20535872,20535873,20535874,20535875,20535876,20535877,20535878,20535879,20535880,20535881,20535882,20535883,20535884,20535885,20535886,20535887,20535888,20535889,20535890,20535891,20535892,20535893,20535894,20535895,20535896,20535897,20535898,20535899,20535900,20535901,20535902,20535903,20535904,20535905,20535906,20535907,20535908,20535909,20535910,20535911,20535912,20535913,20535914,20535915,20535916,20535917,20535918,20535919,20535920,20535921,20535922,20535923,20535924,20535925,20535926,20535927,20535928,20535929,20535930,20535931,20535932,20535933,20535934,20535935,20535936,20535937,20535938,20535939,20535940,20535941,20535942,20535943,20535944,20535945,20535946,20535947,20535948,20535949,20535950,20535951,20535952,20535953,20535954,20535955,20535956,20535957,20535958,20535959,20535960,20535961,20535962,20535963,20535964,20535965,20535966,20535967,20535968,20535969,20535970,20535971,20535972,20535973,20535974,20535975,20535976,20535977,20535978,20535979,20535980,20535981,20535982,20535983,20535984,20535985,20535986,20535987,20535988,20535989,20535990,20535991,20535992,20535993,20535994,20535995,20535996,20535997,20535998,20535999,20536000,20536001,20536002,20536003,20536004,20536005,20536006,20536007,20536008,20536009,20536010,20536011,20536012,20536013,20536014,20536015,20536016,20536017,20536018,20536019,20536020,20536021,20536022,20536023,20536024,20536025,20536026,20536027,20536028,20536029,20536030,20536031,20536032,20536033,20536034,20536035,20536036,20536037,20536038,20536039,20536040,20536041,20536042,20536043,20536044,20536045,20536046,20536047,20536048,20536049,20536050,20536051,20536052,20536053,20536054,20536055,20536056,20536057,20536058,20536059,20536060,20536061,20536062,20536063],"Barium":[20767788],"Barrel":[20538288,20538289,20538290,20538291,20538294,20538295,20538296,20538297,20538298,20538299,20538302,20538303],"Barrier":[20541302],"Basalt":[21591048,21591049,21591050],"Beacon":[20541801],"Bed Block":[20545280,20545281,20545282,20545283,20545284,20545285,20545286,20545287,20545288,20545289,20545290,20545291,20545292,20545293,20545294,20545295,20545296,20545297,20545298,20545299,20545300,20545301,20545302,20545303,20545304,20545305,20545306,20545307,20545308,20545309,20545310,20545311,20545312,20545313,20545314,20545315,20545316,20545317,20545318,20545319,20545320,20545321,20545322,20545323,20545324,20545325,20545326,20545327,20545328,20545329,20545330,20545331,20545332,20545333,20545334,20545335,20545336,20545337,20545338,20545339,20545340,20545341,20545342,20545343,20545344,20545345,20545346,20545347,20545348,20545349,20545350,20545351,20545352,20545353,20545354,20545355,20545356,20545357,20545358,20545359,20545360,20545361,20545362,20545363,20545364,20545365,20545366,20545367,20545368,20545369,20545370,20545371,20545372,20545373,20545374,20545375,20545376,20545377,20545378,20545379,20545380,20545381,20545382,20545383,20545384,20545385,20545386,20545387,20545388,20545389,20545390,20545391,20545392,20545393,20545394,20545395,20545396,20545397,20545398,20545399,20545400,20545401,20545402,20545403,20545404,20545405,20545406,20545407,20545408,20545409,20545410,20545411,20545412,20545413,20545414,20545415,20545416,20545417,20545418,20545419,20545420,20545421,20545422,20545423,20545424,20545425,20545426,20545427,20545428,20545429,20545430,20545431,20545432,20545433,20545434,20545435,20545436,20545437,20545438,20545439,20545440,20545441,20545442,20545443,20545444,20545445,20545446,20545447,20545448,20545449,20545450,20545451,20545452,20545453,20545454,20545455,20545456,20545457,20545458,20545459,20545460,20545461,20545462,20545463,20545464,20545465,20545466,20545467,20545468,20545469,20545470,20545471,20545472,20545473,20545474,20545475,20545476,20545477,20545478,20545479,20545480,20545481,20545482,20545483,20545484,20545485,20545486,20545487,20545488,20545489,20545490,20545491,20545492,20545493,20545494,20545495,20545496,20545497,20545498,20545499,20545500,20545501,20545502,20545503,20545504,20545505,20545506,20545507,20545508,20545509,20545510,20545511,20545512,20545513,20545514,20545515,20545516,20545517,20545518,20545519,20545520,20545521,20545522,20545523,20545524,20545525,20545526,20545527,20545528,20545529,20545530,20545531,20545532,20545533,20545534,20545535],"Bedrock":[20545540,20545541],"Beetroot Block":[20549328,20549329,20549330,20549331,20549332,20549333,20549334,20549335],"Bell":[20551488,20551489,20551490,20551491,20551492,20551493,20551494,20551495,20551496,20551497,20551498,20551499,20551500,20551501,20551502,20551503],"Berkelium":[20768774],"Beryllium":[20771395],"Big Dripleaf":[21929936,21929937,21929938,21929939,21929940,21929941,21929942,21929943,21929944,21929945,21929946,21929947,21929948,21929949,21929950,21929951],"Big Dripleaf Stem":[21931976,21931977,21931978,21931979],"Birch Button":[20552224,20552225,20552226,20552227,20552230,20552231,20552232,20552233,20552234,20552235,20552238,20552239],"Birch Door":[20554848,20554849,20554850,20554851,20554852,20554853,20554854,20554855,20554856,20554857,20554858,20554859,20554860,20554861,20554862,20554863,20554864,20554865,20554866,20554867,20554868,20554869,20554870,20554871,20554872,20554873,20554874,20554875,20554876,20554877,20554878,20554879],"Birch Fence":[20557622],"Birch Fence Gate":[20559792,20559793,20559794,20559795,20559796,20559797,20559798,20559799,20559800,20559801,20559802,20559803,20559804,20559805,20559806,20559807],"Birch Leaves":[20560344,20560345,20560346,20560347],"Birch Log":[20563648,20563649,20563652,20563653,20563654,20563655],"Birch Planks":[20564186],"Birch Pressure Plate":[20567746,20567747],"Birch Sapling":[20568972,20568973],"Birch Sign":[20571536,20571537,20571538,20571539,20571540,20571541,20571542,20571543,20571544,20571545,20571546,20571547,20571548,20571549,20571550,20571551],"Birch Slab":[20573196,20573197,20573198],"Birch Stairs":[20575080,20575081,20575082,20575083,20575084,20575085,20575086,20575087],"Birch Trapdoor":[20577008,20577009,20577010,20577011,20577012,20577013,20577014,20577015,20577016,20577017,20577018,20577019,20577020,20577021,20577022,20577023],"Birch Wall Sign":[20579020,20579021,20579022,20579023],"Birch Wood":[20580826,20580827,20580828,20580829,20580830,20580831],"Bismuth":[20773935],"Blackstone":[21596307],"Blackstone Slab":[21599012,21599014,21599015],"Blackstone Stairs":[21601800,21601801,21601802,21601803,21601804,21601805,21601806,21601807],"Blackstone Wall":[21604098,21604112,21604113,21604114,21604115,21604116,21604117,21604118,21604119,21604120,21604121,21604122,21604123,21604124,21604125,21604126,21604127,21604160,21604161,21604162,21604163,21604164,21604165,21604166,21604167,21604168,21604169,21604170,21604171,21604172,21604173,21604174,21604175,21604176,21604177,21604178,21604179,21604180,21604181,21604182,21604183,21604184,21604185,21604186,21604187,21604188,21604189,21604190,21604191,21604192,21604193,21604194,21604195,21604196,21604197,21604198,21604199,21604200,21604201,21604202,21604203,21604204,21604205,21604206,21604207,21604208,21604209,21604210,21604211,21604212,21604213,21604214,21604215,21604216,21604217,21604218,21604219,21604220,21604221,21604222,21604223,21604226,21604240,21604241,21604242,21604243,21604244,21604245,21604246,21604247,21604248,21604249,21604250,21604251,21604252,21604253,21604254,21604255,21604288,21604289,21604290,21604291,21604292,21604293,21604294,21604295,21604296,21604297,21604298,21604299,21604300,21604301,21604302,21604303,21604304,21604305,21604306,21604307,21604308,21604309,21604310,21604311,21604312,21604313,21604314,21604315,21604316,21604317,21604318,21604319,21604320,21604321,21604322,21604323,21604324,21604325,21604326,21604327,21604328,21604329,21604330,21604331,21604332,21604333,21604334,21604335,21604336,21604337,21604338,21604339,21604340,21604341,21604342,21604343,21604344,21604345,21604346,21604347,21604348,21604349,21604350,21604351],"Blast Furnace":[20585328,20585329,20585330,20585331,20585332,20585333,20585334,20585335],"Blue Ice":[20588595],"Blue Orchid":[20591829],"Blue Torch":[20593968,20593969,20593973,20593974,20593975],"Bohrium":[20775552],"Bone Block":[20596340,20596341,20596343],"Bookshelf":[20597864],"Boron":[20777985],"Brewing Stand":[20600176,20600177,20600178,20600179,20600180,20600181,20600182,20600183],"Brick Slab":[20601168,20601169,20601171],"Brick Stairs":[20604408,20604409,20604410,20604411,20604412,20604413,20604414,20604415],"Brick Wall":[20605952,20605953,20605954,20605955,20605956,20605957,20605958,20605959,20605960,20605961,20605962,20605963,20605964,20605965,20605966,20605967,20605968,20605969,20605970,20605971,20605972,20605973,20605974,20605975,20605976,20605977,20605978,20605979,20605980,20605981,20605982,20605983,20605984,20605985,20605986,20605987,20605988,20605989,20605990,20605991,20605992,20605993,20605994,20605995,20605996,20605997,20605998,20605999,20606000,20606001,20606002,20606003,20606004,20606005,20606006,20606007,20606008,20606009,20606010,20606011,20606012,20606013,20606014,20606015,20606053,20606064,20606065,20606066,20606067,20606068,20606069,20606070,20606071,20606072,20606073,20606074,20606075,20606076,20606077,20606078,20606079,20606080,20606081,20606082,20606083,20606084,20606085,20606086,20606087,20606088,20606089,20606090,20606091,20606092,20606093,20606094,20606095,20606096,20606097,20606098,20606099,20606100,20606101,20606102,20606103,20606104,20606105,20606106,20606107,20606108,20606109,20606110,20606111,20606112,20606113,20606114,20606115,20606116,20606117,20606118,20606119,20606120,20606121,20606122,20606123,20606124,20606125,20606126,20606127,20606128,20606129,20606130,20606131,20606132,20606133,20606134,20606135,20606136,20606137,20606138,20606139,20606140,20606141,20606142,20606143,20606181,20606192,20606193,20606194,20606195,20606196,20606197,20606198,20606199,20606200,20606201,20606202,20606203,20606204,20606205,20606206,20606207],"Bricks":[20608594],"Bromine":[20779949],"Brown Mushroom":[20613080],"Brown Mushroom Block":[20614032,20614033,20614034,20614035,20614036,20614037,20614038,20614039,20614044,20614045,20614047],"Budding Amethyst":[21577592],"Cactus":[20616384,20616385,20616386,20616387,20616388,20616389,20616390,20616391,20616392,20616393,20616394,20616395,20616396,20616397,20616398,20616399],"Cadmium":[20781893],"Cake":[20618584,20618585,20618586,20618587,20618588,20618589,20618590],"Cake With Candle":[21837222,21837223],"Cake With Dyed Candle":[21839232,21839233,21839234,21839235,21839236,21839237,21839238,21839239,21839240,21839241,21839242,21839243,21839244,21839245,21839246,21839247,21839248,21839249,21839250,21839251,21839252,21839253,21839254,21839255,21839256,21839257,21839258,21839259,21839260,21839261,21839262,21839263],"Calcite":[21638381],"Calcium":[20783925],"Californium":[20787131],"Candle":[21832176,21832177,21832178,21832179,21832180,21832181,21832182,21832183],"Carbon":[20789232],"Carpet":[20619280,20619281,20619282,20619283,20619284,20619285,20619286,20619287,20619288,20619289,20619290,20619291,20619292,20619293,20619294,20619295],"Carrot Block":[20622752,20622753,20622754,20622755,20622756,20622757,20622758,20622759],"Cartography Table":[21845741],"Carved Pumpkin":[20624628,20624629,20624630,20624631],"Cauldron":[21852969],"Cave Vines":[21892224,21892225,21892226,21892227,21892228,21892229,21892230,21892231,21892232,21892233,21892234,21892235,21892236,21892237,21892238,21892239,21892244,21892245,21892248,21892249,21892250,21892251,21892252,21892253,21892254,21892255,21892256,21892257,21892258,21892259,21892260,21892261,21892262,21892263,21892264,21892265,21892266,21892267,21892268,21892269,21892270,21892271,21892276,21892277,21892280,21892281,21892282,21892283,21892284,21892285,21892286,21892287,21892288,21892289,21892290,21892291,21892292,21892293,21892294,21892295,21892296,21892297,21892298,21892299,21892300,21892301,21892302,21892303,21892308,21892309,21892312,21892313,21892314,21892315,21892316,21892317,21892318,21892319,21892320,21892321,21892322,21892323,21892324,21892325,21892326,21892327,21892328,21892329,21892330,21892331,21892332,21892333,21892334,21892335,21892340,21892341,21892344,21892345,21892346,21892347,21892348,21892349,21892350,21892351],"Cerium":[20789431],"Cesium":[20791798],"Chain":[21878573,21878574,21878575],"Cherry Button":[21895570,21895571,21895572,21895573,21895574,21895575,21895578,21895579,21895580,21895581,21895582,21895583],"Cherry Door":[21898304,21898305,21898306,21898307,21898308,21898309,21898310,21898311,21898312,21898313,21898314,21898315,21898316,21898317,21898318,21898319,21898320,21898321,21898322,21898323,21898324,21898325,21898326,21898327,21898328,21898329,21898330,21898331,21898332,21898333,21898334,21898335],"Cherry Fence":[21900661],"Cherry Fence Gate":[21901904,21901905,21901906,21901907,21901908,21901909,21901910,21901911,21901912,21901913,21901914,21901915,21901916,21901917,21901918,21901919],"Cherry Leaves":[21904412,21904413,21904414,21904415],"Cherry Log":[21905784,21905785,21905786,21905787,21905790,21905791],"Cherry Planks":[21908756],"Cherry Pressure Plate":[21911536,21911537],"Cherry Sign":[21914944,21914945,21914946,21914947,21914948,21914949,21914950,21914951,21914952,21914953,21914954,21914955,21914956,21914957,21914958,21914959],"Cherry Slab":[21917632,21917633,21917635],"Cherry Stairs":[21918912,21918913,21918914,21918915,21918916,21918917,21918918,21918919],"Cherry Trapdoor":[21919968,21919969,21919970,21919971,21919972,21919973,21919974,21919975,21919976,21919977,21919978,21919979,21919980,21919981,21919982,21919983],"Cherry Wall Sign":[21923100,21923101,21923102,21923103],"Cherry Wood":[21924008,21924009,21924012,21924013,21924014,21924015],"Chest":[20628872,20628873,20628874,20628875],"Chiseled Bookshelf":[21938176,21938177,21938178,21938179,21938180,21938181,21938182,21938183,21938184,21938185,21938186,21938187,21938188,21938189,21938190,21938191,21938192,21938193,21938194,21938195,21938196,21938197,21938198,21938199,21938200,21938201,21938202,21938203,21938204,21938205,21938206,21938207,21938208,21938209,21938210,21938211,21938212,21938213,21938214,21938215,21938216,21938217,21938218,21938219,21938220,21938221,21938222,21938223,21938224,21938225,21938226,21938227,21938228,21938229,21938230,21938231,21938232,21938233,21938234,21938235,21938236,21938237,21938238,21938239,21938240,21938241,21938242,21938243,21938244,21938245,21938246,21938247,21938248,21938249,21938250,21938251,21938252,21938253,21938254,21938255,21938256,21938257,21938258,21938259,21938260,21938261,21938262,21938263,21938264,21938265,21938266,21938267,21938268,21938269,21938270,21938271,21938272,21938273,21938274,21938275,21938276,21938277,21938278,21938279,21938280,21938281,21938282,21938283,21938284,21938285,21938286,21938287,21938288,21938289,21938290,21938291,21938292,21938293,21938294,21938295,21938296,21938297,21938298,21938299,21938300,21938301,21938302,21938303,21938304,21938305,21938306,21938307,21938308,21938309,21938310,21938311,21938312,21938313,21938314,21938315,21938316,21938317,21938318,21938319,21938320,21938321,21938322,21938323,21938324,21938325,21938326,21938327,21938328,21938329,21938330,21938331,21938332,21938333,21938334,21938335,21938336,21938337,21938338,21938339,21938340,21938341,21938342,21938343,21938344,21938345,21938346,21938347,21938348,21938349,21938350,21938351,21938352,21938353,21938354,21938355,21938356,21938357,21938358,21938359,21938360,21938361,21938362,21938363,21938364,21938365,21938366,21938367,21938368,21938369,21938370,21938371,21938372,21938373,21938374,21938375,21938376,21938377,21938378,21938379,21938380,21938381,21938382,21938383,21938384,21938385,21938386,21938387,21938388,21938389,21938390,21938391,21938392,21938393,21938394,21938395,21938396,21938397,21938398,21938399,21938400,21938401,21938402,21938403,21938404,21938405,21938406,21938407,21938408,21938409,21938410,21938411,21938412,21938413,21938414,21938415,21938416,21938417,21938418,21938419,21938420,21938421,21938422,21938423,21938424,21938425,21938426,21938427,21938428,21938429,21938430,21938431],"Chiseled Deepslate":[21680290],"Chiseled Nether Bricks":[21682906],"Chiseled Polished Blackstone":[21618038],"Chiseled Quartz Block":[20630148,20630150,20630151],"Chiseled Red Sandstone":[20633244],"Chiseled Sandstone":[20635615],"Chiseled Stone Bricks":[20636034],"Chlorine":[20794258],"Chorus Flower":[21864360,21864361,21864364,21864365,21864366,21864367],"Chorus Plant":[21866123],"Chromium":[20797122],"Clay Block":[20639448],"Coal Block":[20641681],"Coal Ore":[20642280],"Cobalt":[20799311],"Cobbled Deepslate":[21662962],"Cobbled Deepslate Slab":[21665324,21665326,21665327],"Cobbled Deepslate Stairs":[21666232,21666233,21666234,21666235,21666236,21666237,21666238,21666239],"Cobbled Deepslate Wall":[21668389,21668400,21668401,21668402,21668403,21668404,21668405,21668406,21668407,21668408,21668409,21668410,21668411,21668412,21668413,21668414,21668415,21668416,21668417,21668418,21668419,21668420,21668421,21668422,21668423,21668424,21668425,21668426,21668427,21668428,21668429,21668430,21668431,21668432,21668433,21668434,21668435,21668436,21668437,21668438,21668439,21668440,21668441,21668442,21668443,21668444,21668445,21668446,21668447,21668448,21668449,21668450,21668451,21668452,21668453,21668454,21668455,21668456,21668457,21668458,21668459,21668460,21668461,21668462,21668463,21668464,21668465,21668466,21668467,21668468,21668469,21668470,21668471,21668472,21668473,21668474,21668475,21668476,21668477,21668478,21668479,21668517,21668528,21668529,21668530,21668531,21668532,21668533,21668534,21668535,21668536,21668537,21668538,21668539,21668540,21668541,21668542,21668543,21668544,21668545,21668546,21668547,21668548,21668549,21668550,21668551,21668552,21668553,21668554,21668555,21668556,21668557,21668558,21668559,21668560,21668561,21668562,21668563,21668564,21668565,21668566,21668567,21668568,21668569,21668570,21668571,21668572,21668573,21668574,21668575,21668576,21668577,21668578,21668579,21668580,21668581,21668582,21668583,21668584,21668585,21668586,21668587,21668588,21668589,21668590,21668591,21668592,21668593,21668594,21668595,21668596,21668597,21668598,21668599,21668600,21668601,21668602,21668603,21668604,21668605,21668606,21668607],"Cobblestone":[20645646],"Cobblestone Slab":[20647760,20647762,20647763],"Cobblestone Stairs":[20648720,20648721,20648722,20648723,20648724,20648725,20648726,20648727],"Cobblestone Wall":[20649984,20649985,20649986,20649987,20649988,20649989,20649990,20649991,20649992,20649993,20649994,20649995,20649996,20649997,20649998,20649999,20650000,20650001,20650002,20650003,20650004,20650005,20650006,20650007,20650008,20650009,20650010,20650011,20650012,20650013,20650014,20650015,20650016,20650017,20650018,20650019,20650020,20650021,20650022,20650023,20650024,20650025,20650026,20650027,20650028,20650029,20650030,20650031,20650032,20650033,20650034,20650035,20650036,20650037,20650038,20650039,20650040,20650041,20650042,20650043,20650044,20650045,20650046,20650047,20650080,20650081,20650082,20650083,20650084,20650085,20650086,20650087,20650088,20650089,20650090,20650091,20650092,20650093,20650094,20650095,20650099,20650112,20650113,20650114,20650115,20650116,20650117,20650118,20650119,20650120,20650121,20650122,20650123,20650124,20650125,20650126,20650127,20650128,20650129,20650130,20650131,20650132,20650133,20650134,20650135,20650136,20650137,20650138,20650139,20650140,20650141,20650142,20650143,20650144,20650145,20650146,20650147,20650148,20650149,20650150,20650151,20650152,20650153,20650154,20650155,20650156,20650157,20650158,20650159,20650160,20650161,20650162,20650163,20650164,20650165,20650166,20650167,20650168,20650169,20650170,20650171,20650172,20650173,20650174,20650175,20650208,20650209,20650210,20650211,20650212,20650213,20650214,20650215,20650216,20650217,20650218,20650219,20650220,20650221,20650222,20650223,20650227],"Cobweb":[20652464],"Cocoa Block":[20655024,20655025,20655026,20655027,20655028,20655029,20655030,20655031,20655032,20655033,20655034,20655035],"Compound Creator":[20656176,20656177,20656178,20656179],"Concrete":[20659968,20659969,20659970,20659971,20659972,20659973,20659974,20659975,20659976,20659977,20659978,20659979,20659980,20659981,20659982,20659983],"Concrete Powder":[20661296,20661297,20661298,20661299,20661300,20661301,20661302,20661303,20661304,20661305,20661306,20661307,20661308,20661309,20661310,20661311],"Copernicium":[20802812],"Copper":[20804760],"Copper Block":[21823528,21823529,21823530,21823531,21823532,21823533,21823534,21823535],"Copper Ore":[21798993],"Coral":[20663618,20663620,20663621,20663622,20663623,20663626,20663628,20663629,20663630,20663631],"Coral Block":[20664465,20664468,20664469,20664470,20664471,20664473,20664476,20664477,20664478,20664479],"Coral Fan":[20668131,20668132,20668133,20668134,20668135,20668139,20668140,20668141,20668142,20668143,20668147,20668148,20668149,20668150,20668151,20668155,20668156,20668157,20668158,20668159],"Cornflower":[20670352],"Cracked Deepslate Bricks":[21650157],"Cracked Deepslate Tiles":[21661164],"Cracked Nether Bricks":[21685186],"Cracked Polished Blackstone Bricks":[21628426],"Cracked Stone Bricks":[20670706],"Crafting Table":[20672716],"Crimson Button":[21737520,21737521,21737522,21737523,21737526,21737527,21737528,21737529,21737530,21737531,21737534,21737535],"Crimson Door":[21751360,21751361,21751362,21751363,21751364,21751365,21751366,21751367,21751368,21751369,21751370,21751371,21751372,21751373,21751374,21751375,21751376,21751377,21751378,21751379,21751380,21751381,21751382,21751383,21751384,21751385,21751386,21751387,21751388,21751389,21751390,21751391],"Crimson Fence":[21707929],"Crimson Fence Gate":[21757232,21757233,21757234,21757235,21757236,21757237,21757238,21757239,21757240,21757241,21757242,21757243,21757244,21757245,21757246,21757247],"Crimson Hyphae":[21726912,21726913,21726916,21726917,21726918,21726919],"Crimson Planks":[21701319],"Crimson Pressure Plate":[21745172,21745173],"Crimson Roots":[21934477],"Crimson Sign":[21769568,21769569,21769570,21769571,21769572,21769573,21769574,21769575,21769576,21769577,21769578,21769579,21769580,21769581,21769582,21769583],"Crimson Slab":[21714416,21714417,21714418],"Crimson Stairs":[21763896,21763897,21763898,21763899,21763900,21763901,21763902,21763903],"Crimson Stem":[21719642,21719643,21719644,21719645,21719646,21719647],"Crimson Trapdoor":[21733344,21733345,21733346,21733347,21733348,21733349,21733350,21733351,21733352,21733353,21733354,21733355,21733356,21733357,21733358,21733359],"Crimson Wall Sign":[21774384,21774385,21774386,21774387],"Crying Obsidian":[21818013],"Curium":[20805897],"Cut Copper Block":[21827208,21827209,21827210,21827211,21827212,21827213,21827214,21827215],"Cut Copper Slab Slab":[21827976,21827977,21827978,21827979,21827980,21827981,21827982,21827983,21827984,21827985,21827986,21827987,21827988,21827989,21827990,21827991,21827992,21827993,21827994,21827995,21827996,21827997,21827998,21827999],"Cut Copper Stairs":[21830080,21830081,21830082,21830083,21830084,21830085,21830086,21830087,21830088,21830089,21830090,21830091,21830092,21830093,21830094,21830095,21830096,21830097,21830098,21830099,21830100,21830101,21830102,21830103,21830104,21830105,21830106,21830107,21830108,21830109,21830110,21830111,21830112,21830113,21830114,21830115,21830116,21830117,21830118,21830119,21830120,21830121,21830122,21830123,21830124,21830125,21830126,21830127,21830128,21830129,21830130,21830131,21830132,21830133,21830134,21830135,21830136,21830137,21830138,21830139,21830140,21830141,21830142,21830143],"Cut Red Sandstone":[20674620],"Cut Red Sandstone Slab":[20676996,20676997,20676999],"Cut Sandstone":[20679139],"Cut Sandstone Slab":[20681972,20681973,20681974],"Dandelion":[20686168],"Dark Oak Button":[20688624,20688625,20688626,20688627,20688630,20688631,20688632,20688633,20688634,20688635,20688638,20688639],"Dark Oak Door":[20690144,20690145,20690146,20690147,20690148,20690149,20690150,20690151,20690152,20690153,20690154,20690155,20690156,20690157,20690158,20690159,20690160,20690161,20690162,20690163,20690164,20690165,20690166,20690167,20690168,20690169,20690170,20690171,20690172,20690173,20690174,20690175],"Dark Oak Fence":[20692929],"Dark Oak Fence Gate":[20694464,20694465,20694466,20694467,20694468,20694469,20694470,20694471,20694472,20694473,20694474,20694475,20694476,20694477,20694478,20694479],"Dark Oak Leaves":[20696240,20696241,20696242,20696243],"Dark Oak Log":[20698832,20698833,20698836,20698837,20698838,20698839],"Dark Oak Planks":[20699858],"Dark Oak Pressure Plate":[20701726,20701727],"Dark Oak Sapling":[20704518,20704519],"Dark Oak Sign":[20705760,20705761,20705762,20705763,20705764,20705765,20705766,20705767,20705768,20705769,20705770,20705771,20705772,20705773,20705774,20705775],"Dark Oak Slab":[20708816,20708817,20708818],"Dark Oak Stairs":[20711344,20711345,20711346,20711347,20711348,20711349,20711350,20711351],"Dark Oak Trapdoor":[20713024,20713025,20713026,20713027,20713028,20713029,20713030,20713031,20713032,20713033,20713034,20713035,20713036,20713037,20713038,20713039],"Dark Oak Wall Sign":[20715224,20715225,20715226,20715227],"Dark Oak Wood":[20716738,20716739,20716740,20716741,20716742,20716743],"Dark Prismarine":[20719220],"Dark Prismarine Slab":[20721200,20721202,20721203],"Dark Prismarine Stairs":[20722592,20722593,20722594,20722595,20722596,20722597,20722598,20722599],"Darmstadtium":[20809292],"Daylight Sensor":[20724416,20724417,20724418,20724419,20724420,20724421,20724422,20724423,20724424,20724425,20724426,20724427,20724428,20724429,20724430,20724431,20724432,20724433,20724434,20724435,20724436,20724437,20724438,20724439,20724440,20724441,20724442,20724443,20724444,20724445,20724446,20724447],"Dead Bush":[20727625],"Deepslate":[21640384,21640385,21640387],"Deepslate Brick Slab":[21644892,21644893,21644894],"Deepslate Brick Stairs":[21646904,21646905,21646906,21646907,21646908,21646909,21646910,21646911],"Deepslate Brick Wall":[21649152,21649153,21649154,21649155,21649156,21649157,21649158,21649159,21649160,21649161,21649162,21649163,21649164,21649165,21649166,21649167,21649168,21649169,21649170,21649171,21649172,21649173,21649174,21649175,21649176,21649177,21649178,21649179,21649180,21649181,21649182,21649183,21649184,21649185,21649186,21649187,21649188,21649189,21649190,21649191,21649192,21649193,21649194,21649195,21649196,21649197,21649198,21649199,21649200,21649201,21649202,21649203,21649204,21649205,21649206,21649207,21649208,21649209,21649210,21649211,21649212,21649213,21649214,21649215,21649217,21649232,21649233,21649234,21649235,21649236,21649237,21649238,21649239,21649240,21649241,21649242,21649243,21649244,21649245,21649246,21649247,21649280,21649281,21649282,21649283,21649284,21649285,21649286,21649287,21649288,21649289,21649290,21649291,21649292,21649293,21649294,21649295,21649296,21649297,21649298,21649299,21649300,21649301,21649302,21649303,21649304,21649305,21649306,21649307,21649308,21649309,21649310,21649311,21649312,21649313,21649314,21649315,21649316,21649317,21649318,21649319,21649320,21649321,21649322,21649323,21649324,21649325,21649326,21649327,21649328,21649329,21649330,21649331,21649332,21649333,21649334,21649335,21649336,21649337,21649338,21649339,21649340,21649341,21649342,21649343,21649345,21649360,21649361,21649362,21649363,21649364,21649365,21649366,21649367,21649368,21649369,21649370,21649371,21649372,21649373,21649374,21649375],"Deepslate Bricks":[21642473],"Deepslate Coal Ore":[21783821],"Deepslate Copper Ore":[21797493],"Deepslate Diamond Ore":[21785055],"Deepslate Emerald Ore":[21788073],"Deepslate Gold Ore":[21795656],"Deepslate Iron Ore":[21794765],"Deepslate Lapis Lazuli Ore":[21788910],"Deepslate Redstone Ore":[21791572,21791573],"Deepslate Tile Slab":[21655484,21655485,21655487],"Deepslate Tile Stairs":[21657328,21657329,21657330,21657331,21657332,21657333,21657334,21657335],"Deepslate Tile Wall":[21658912,21658913,21658914,21658915,21658916,21658917,21658918,21658919,21658920,21658921,21658922,21658923,21658924,21658925,21658926,21658927,21658930,21658944,21658945,21658946,21658947,21658948,21658949,21658950,21658951,21658952,21658953,21658954,21658955,21658956,21658957,21658958,21658959,21658960,21658961,21658962,21658963,21658964,21658965,21658966,21658967,21658968,21658969,21658970,21658971,21658972,21658973,21658974,21658975,21658976,21658977,21658978,21658979,21658980,21658981,21658982,21658983,21658984,21658985,21658986,21658987,21658988,21658989,21658990,21658991,21658992,21658993,21658994,21658995,21658996,21658997,21658998,21658999,21659000,21659001,21659002,21659003,21659004,21659005,21659006,21659007,21659040,21659041,21659042,21659043,21659044,21659045,21659046,21659047,21659048,21659049,21659050,21659051,21659052,21659053,21659054,21659055,21659058,21659072,21659073,21659074,21659075,21659076,21659077,21659078,21659079,21659080,21659081,21659082,21659083,21659084,21659085,21659086,21659087,21659088,21659089,21659090,21659091,21659092,21659093,21659094,21659095,21659096,21659097,21659098,21659099,21659100,21659101,21659102,21659103,21659104,21659105,21659106,21659107,21659108,21659109,21659110,21659111,21659112,21659113,21659114,21659115,21659116,21659117,21659118,21659119,21659120,21659121,21659122,21659123,21659124,21659125,21659126,21659127,21659128,21659129,21659130,21659131,21659132,21659133,21659134,21659135],"Deepslate Tiles":[21652461],"Detector Rail":[20728240,20728241,20728242,20728243,20728246,20728247,20728248,20728249,20728250,20728251,20728254,20728255],"Diamond Block":[20730418],"Diamond Ore":[20733642],"Diorite":[20734079],"Diorite Slab":[20737469,20737470,20737471],"Diorite Stairs":[20739504,20739505,20739506,20739507,20739508,20739509,20739510,20739511],"Diorite Wall":[20741920,20741921,20741922,20741923,20741924,20741925,20741926,20741927,20741928,20741929,20741930,20741931,20741932,20741933,20741934,20741935,20741937,20741952,20741953,20741954,20741955,20741956,20741957,20741958,20741959,20741960,20741961,20741962,20741963,20741964,20741965,20741966,20741967,20741968,20741969,20741970,20741971,20741972,20741973,20741974,20741975,20741976,20741977,20741978,20741979,20741980,20741981,20741982,20741983,20741984,20741985,20741986,20741987,20741988,20741989,20741990,20741991,20741992,20741993,20741994,20741995,20741996,20741997,20741998,20741999,20742000,20742001,20742002,20742003,20742004,20742005,20742006,20742007,20742008,20742009,20742010,20742011,20742012,20742013,20742014,20742015,20742048,20742049,20742050,20742051,20742052,20742053,20742054,20742055,20742056,20742057,20742058,20742059,20742060,20742061,20742062,20742063,20742065,20742080,20742081,20742082,20742083,20742084,20742085,20742086,20742087,20742088,20742089,20742090,20742091,20742092,20742093,20742094,20742095,20742096,20742097,20742098,20742099,20742100,20742101,20742102,20742103,20742104,20742105,20742106,20742107,20742108,20742109,20742110,20742111,20742112,20742113,20742114,20742115,20742116,20742117,20742118,20742119,20742120,20742121,20742122,20742123,20742124,20742125,20742126,20742127,20742128,20742129,20742130,20742131,20742132,20742133,20742134,20742135,20742136,20742137,20742138,20742139,20742140,20742141,20742142,20742143],"Dirt":[20742760,20742761,20742763],"Double Pitcher Crop":[21950064,21950065,21950066,21950067],"Double Tallgrass":[20744902,20744903],"Dragon Egg":[20747804],"Dried Kelp Block":[20749160],"Dubnium":[20811286],"Dyed Candle":[21834240,21834241,21834242,21834243,21834244,21834245,21834246,21834247,21834248,21834249,21834250,21834251,21834252,21834253,21834254,21834255,21834256,21834257,21834258,21834259,21834260,21834261,21834262,21834263,21834264,21834265,21834266,21834267,21834268,21834269,21834270,21834271,21834272,21834273,21834274,21834275,21834276,21834277,21834278,21834279,21834280,21834281,21834282,21834283,21834284,21834285,21834286,21834287,21834288,21834289,21834290,21834291,21834292,21834293,21834294,21834295,21834296,21834297,21834298,21834299,21834300,21834301,21834302,21834303,21834304,21834305,21834306,21834307,21834308,21834309,21834310,21834311,21834312,21834313,21834314,21834315,21834316,21834317,21834318,21834319,21834320,21834321,21834322,21834323,21834324,21834325,21834326,21834327,21834328,21834329,21834330,21834331,21834332,21834333,21834334,21834335,21834336,21834337,21834338,21834339,21834340,21834341,21834342,21834343,21834344,21834345,21834346,21834347,21834348,21834349,21834350,21834351,21834352,21834353,21834354,21834355,21834356,21834357,21834358,21834359,21834360,21834361,21834362,21834363,21834364,21834365,21834366,21834367],"Dyed Shulker Box":[20750816,20750817,20750818,20750819,20750820,20750821,20750822,20750823,20750824,20750825,20750826,20750827,20750828,20750829,20750830,20750831],"Dysprosium":[20812845],"Einsteinium":[20813977],"Element Constructor":[20799584,20799585,20799586,20799587],"Emerald Block":[20998956],"Emerald Ore":[21001840],"Enchanting Table":[21002728],"End Portal Frame":[21005904,21005905,21005906,21005907,21005908,21005909,21005910,21005911],"End Rod":[21006744,21006745,21006746,21006747,21006750,21006751],"End Stone":[21010195],"End Stone Brick Slab":[21011608,21011609,21011611],"End Stone Brick Stairs":[21014200,21014201,21014202,21014203,21014204,21014205,21014206,21014207],"End Stone Brick Wall":[21015589,21015600,21015601,21015602,21015603,21015604,21015605,21015606,21015607,21015608,21015609,21015610,21015611,21015612,21015613,21015614,21015615,21015616,21015617,21015618,21015619,21015620,21015621,21015622,21015623,21015624,21015625,21015626,21015627,21015628,21015629,21015630,21015631,21015632,21015633,21015634,21015635,21015636,21015637,21015638,21015639,21015640,21015641,21015642,21015643,21015644,21015645,21015646,21015647,21015648,21015649,21015650,21015651,21015652,21015653,21015654,21015655,21015656,21015657,21015658,21015659,21015660,21015661,21015662,21015663,21015664,21015665,21015666,21015667,21015668,21015669,21015670,21015671,21015672,21015673,21015674,21015675,21015676,21015677,21015678,21015679,21015717,21015728,21015729,21015730,21015731,21015732,21015733,21015734,21015735,21015736,21015737,21015738,21015739,21015740,21015741,21015742,21015743,21015744,21015745,21015746,21015747,21015748,21015749,21015750,21015751,21015752,21015753,21015754,21015755,21015756,21015757,21015758,21015759,21015760,21015761,21015762,21015763,21015764,21015765,21015766,21015767,21015768,21015769,21015770,21015771,21015772,21015773,21015774,21015775,21015776,21015777,21015778,21015779,21015780,21015781,21015782,21015783,21015784,21015785,21015786,21015787,21015788,21015789,21015790,21015791,21015792,21015793,21015794,21015795,21015796,21015797,21015798,21015799,21015800,21015801,21015802,21015803,21015804,21015805,21015806,21015807],"End Stone Bricks":[21017562],"Ender Chest":[21019660,21019661,21019662,21019663],"Erbium":[20817537],"Europium":[20819484],"Fake Wooden Slab":[21021009,21021010,21021011],"Farmland":[21022720,21022721,21022722,21022723,21022724,21022725,21022726,21022727,21022728,21022729,21022730,21022731,21022732,21022733,21022734,21022735,21022736,21022737,21022738,21022739,21022740,21022741,21022742,21022743,21022744,21022745,21022746,21022747,21022748,21022749,21022750,21022751,21022752,21022753,21022754,21022755,21022756,21022757,21022758,21022759,21022760,21022761,21022762,21022763,21022764,21022765,21022766,21022767,21022768,21022769,21022770,21022771,21022772,21022773,21022774,21022775,21022776,21022777,21022778,21022779,21022780,21022781,21022782,21022783,21022784,21022785,21022786,21022787,21022788,21022789,21022790,21022791,21022792,21022793,21022794,21022795,21022796,21022797,21022798,21022799,21022800,21022801,21022802,21022803,21022804,21022805,21022806,21022807,21022808,21022809,21022810,21022811,21022812,21022813,21022814,21022815,21022816,21022817,21022818,21022819,21022820,21022821,21022822,21022823,21022824,21022825,21022826,21022827,21022828,21022829,21022830,21022831,21022832,21022833,21022834,21022835,21022836,21022837,21022838,21022839,21022840,21022841,21022842,21022843,21022844,21022845,21022846,21022847,21022848,21022849,21022850,21022851,21022852,21022853,21022854,21022855,21022856,21022857,21022858,21022859,21022860,21022861,21022862,21022863,21022864,21022865,21022866,21022867,21022868,21022869,21022870,21022871,21022872,21022873,21022874,21022875,21022876,21022877,21022878,21022879,21022880,21022881,21022882,21022883,21022884,21022885,21022886,21022887,21022888,21022889,21022890,21022891,21022892,21022893,21022894,21022895,21022896,21022897,21022898,21022899,21022900,21022901,21022902,21022903,21022904,21022905,21022906,21022907,21022908,21022909,21022910,21022911,21022912,21022913,21022914,21022915,21022916,21022917,21022918,21022919,21022920,21022921,21022922,21022923,21022924,21022925,21022926,21022927,21022928,21022929,21022930,21022931,21022932,21022933,21022934,21022935,21022936,21022937,21022938,21022939,21022940,21022941,21022942,21022943,21022944,21022945,21022946,21022947,21022948,21022949,21022950,21022951,21022952,21022953,21022954,21022955,21022956,21022957,21022958,21022959,21022960,21022961,21022962,21022963,21022964,21022965,21022966,21022967,21022968,21022969,21022970,21022971,21022972,21022973,21022974,21022975,21022976,21022977,21022978,21022979,21022980,21022981,21022982,21022983,21022984,21022985,21022986,21022987,21022988,21022989,21022990,21022991,21022992,21022993,21022994,21022995,21022996,21022997,21022998,21022999,21023000,21023001,21023002,21023003,21023004,21023005,21023006,21023007,21023008,21023009,21023010,21023011,21023012,21023013,21023014,21023015,21023016,21023017,21023018,21023019,21023020,21023021,21023022,21023023,21023024,21023025,21023026,21023027,21023028,21023029,21023030,21023031,21023032,21023033,21023034,21023035,21023036,21023037,21023038,21023039,21023040,21023041,21023042,21023043,21023044,21023045,21023046,21023047,21023048,21023049,21023050,21023051,21023052,21023053,21023054,21023055,21023056,21023057,21023058,21023059,21023060,21023061,21023062,21023063,21023064,21023065,21023066,21023067,21023068,21023069,21023070,21023071,21023072,21023073,21023074,21023075,21023076,21023077,21023078,21023079,21023080,21023081,21023082,21023083,21023084,21023085,21023086,21023087,21023088,21023089,21023090,21023091,21023092,21023093,21023094,21023095,21023096,21023097,21023098,21023099,21023100,21023101,21023102,21023103,21023104,21023105,21023106,21023107,21023108,21023109,21023110,21023111,21023112,21023113,21023114,21023115,21023116,21023117,21023118,21023119,21023120,21023121,21023122,21023123,21023124,21023125,21023126,21023127,21023128,21023129,21023130,21023131,21023132,21023133,21023134,21023135,21023136,21023137,21023138,21023139,21023140,21023141,21023142,21023143,21023144,21023145,21023146,21023147,21023148,21023149,21023150,21023151,21023152,21023153,21023154,21023155,21023156,21023157,21023158,21023159,21023160,21023161,21023162,21023163,21023164,21023165,21023166,21023167,21023168,21023169,21023170,21023171,21023172,21023173,21023174,21023175,21023176,21023177,21023178,21023179,21023180,21023181,21023182,21023183,21023184,21023185,21023186,21023187,21023188,21023189,21023190,21023191,21023192,21023193,21023194,21023195,21023196,21023197,21023198,21023199,21023200,21023201,21023202,21023203,21023204,21023205,21023206,21023207,21023208,21023209,21023210,21023211,21023212,21023213,21023214,21023215,21023216,21023217,21023218,21023219,21023220,21023221,21023222,21023223,21023224,21023225,21023226,21023227,21023228,21023229,21023230,21023231,21023232,21023233,21023234,21023235,21023236,21023237,21023238,21023239,21023240,21023241,21023242,21023243,21023244,21023245,21023246,21023247,21023248,21023249,21023250,21023251,21023252,21023253,21023254,21023255,21023256,21023257,21023258,21023259,21023260,21023261,21023262,21023263,21023264,21023265,21023266,21023267,21023268,21023269,21023270,21023271,21023272,21023273,21023274,21023275,21023276,21023277,21023278,21023279,21023280,21023281,21023282,21023283,21023284,21023285,21023286,21023287,21023288,21023289,21023290,21023291,21023292,21023293,21023294,21023295,21023296,21023297,21023298,21023299,21023300,21023301,21023302,21023303,21023304,21023305,21023306,21023307,21023308,21023309,21023310,21023311,21023312,21023313,21023314,21023315,21023316,21023317,21023318,21023319,21023320,21023321,21023322,21023323,21023324,21023325,21023326,21023327,21023328,21023329,21023330,21023331,21023332,21023333,21023334,21023335,21023336,21023337,21023338,21023339,21023340,21023341,21023342,21023343,21023344,21023345,21023346,21023347,21023348,21023349,21023350,21023351,21023352,21023353,21023354,21023355,21023356,21023357,21023358,21023359,21023360,21023361,21023362,21023363,21023364,21023365,21023366,21023367,21023368,21023369,21023370,21023371,21023372,21023373,21023374,21023375,21023376,21023377,21023378,21023379,21023380,21023381,21023382,21023383,21023384,21023385,21023386,21023387,21023388,21023389,21023390,21023391,21023392,21023393,21023394,21023395,21023396,21023397,21023398,21023399,21023400,21023401,21023402,21023403,21023404,21023405,21023406,21023407,21023408,21023409,21023410,21023411,21023412,21023413,21023414,21023415,21023416,21023417,21023418,21023419,21023420,21023421,21023422,21023423,21023424,21023425,21023426,21023427,21023428,21023429,21023430,21023431,21023432,21023433,21023434,21023435,21023436,21023437,21023438,21023439,21023440,21023441,21023442,21023443,21023444,21023445,21023446,21023447,21023448,21023449,21023450,21023451,21023452,21023453,21023454,21023455,21023456,21023457,21023458,21023459,21023460,21023461,21023462,21023463,21023464,21023465,21023466,21023467,21023468,21023469,21023470,21023471,21023472,21023473,21023474,21023475,21023476,21023477,21023478,21023479,21023480,21023481,21023482,21023483,21023484,21023485,21023486,21023487,21023488,21023489,21023490,21023491,21023492,21023493,21023494,21023495,21023496,21023497,21023498,21023499,21023500,21023501,21023502,21023503,21023504,21023505,21023506,21023507,21023508,21023509,21023510,21023511,21023512,21023513,21023514,21023515,21023516,21023517,21023518,21023519,21023520,21023521,21023522,21023523,21023524,21023525,21023526,21023527,21023528,21023529,21023530,21023531,21023532,21023533,21023534,21023535,21023536,21023537,21023538,21023539,21023540,21023541,21023542,21023543,21023544,21023545,21023546,21023547,21023548,21023549,21023550,21023551,21023552,21023553,21023554,21023555,21023556,21023557,21023558,21023559,21023560,21023561,21023562,21023563,21023564,21023565,21023566,21023567,21023568,21023569,21023570,21023571,21023572,21023573,21023574,21023575,21023576,21023577,21023578,21023579,21023580,21023581,21023582,21023583,21023584,21023585,21023586,21023587,21023588,21023589,21023590,21023591,21023592,21023593,21023594,21023595,21023596,21023597,21023598,21023599,21023600,21023601,21023602,21023603,21023604,21023605,21023606,21023607,21023608,21023609,21023610,21023611,21023612,21023613,21023614,21023615,21023616,21023617,21023618,21023619,21023620,21023621,21023622,21023623,21023624,21023625,21023626,21023627,21023628,21023629,21023630,21023631,21023632,21023633,21023634,21023635,21023636,21023637,21023638,21023639,21023640,21023641,21023642,21023643,21023644,21023645,21023646,21023647,21023648,21023649,21023650,21023651,21023652,21023653,21023654,21023655,21023656,21023657,21023658,21023659,21023660,21023661,21023662,21023663,21023664,21023665,21023666,21023667,21023668,21023669,21023670,21023671,21023672,21023673,21023674,21023675,21023676,21023677,21023678,21023679,21023680,21023681,21023682,21023683,21023684,21023685,21023686,21023687,21023688,21023689,21023690,21023691,21023692,21023693,21023694,21023695,21023696,21023697,21023698,21023699,21023700,21023701,21023702,21023703,21023704,21023705,21023706,21023707,21023708,21023709,21023710,21023711,21023712,21023713,21023714,21023715,21023716,21023717,21023718,21023719,21023720,21023721,21023722,21023723,21023724,21023725,21023726,21023727,21023728,21023729,21023730,21023731,21023732,21023733,21023734,21023735,21023736,21023737,21023738,21023739,21023740,21023741,21023742,21023743,21024256,21024257,21024258,21024259,21024260,21024261,21024262,21024263,21024264,21024265,21024266,21024267,21024268,21024269,21024270,21024271,21024272,21024273,21024274,21024275,21024276,21024277,21024278,21024279,21024280,21024281,21024282,21024283,21024284,21024285,21024286,21024287,21024288,21024289,21024290,21024291,21024292,21024293,21024294,21024295,21024296,21024297,21024298,21024299,21024300,21024301,21024302,21024303,21024304,21024305,21024306,21024307,21024308,21024309,21024310,21024311,21024312,21024313,21024314,21024315,21024316,21024317,21024318,21024319,21024320,21024321,21024322,21024323,21024324,21024325,21024326,21024327,21024328,21024329,21024330,21024331,21024332,21024333,21024334,21024335,21024336,21024337,21024338,21024339,21024340,21024341,21024342,21024343,21024344,21024345,21024346,21024347,21024348,21024349,21024350,21024351,21024352,21024353,21024354,21024355,21024356,21024357,21024358,21024359,21024360,21024361,21024362,21024363,21024364,21024365,21024366,21024367,21024368,21024369,21024370,21024371,21024372,21024373,21024374,21024375,21024376,21024377,21024378,21024379,21024380,21024381,21024382,21024383,21024384,21024385,21024386,21024387,21024388,21024389,21024390,21024391,21024392,21024393,21024394,21024395,21024396,21024397,21024398,21024399,21024400,21024401,21024402,21024403,21024404,21024405,21024406,21024407,21024408,21024409,21024410,21024411,21024412,21024413,21024414,21024415,21024416,21024417,21024418,21024419,21024420,21024421,21024422,21024423,21024424,21024425,21024426,21024427,21024428,21024429,21024430,21024431,21024432,21024433,21024434,21024435,21024436,21024437,21024438,21024439,21024440,21024441,21024442,21024443,21024444,21024445,21024446,21024447,21024448,21024449,21024450,21024451,21024452,21024453,21024454,21024455,21024456,21024457,21024458,21024459,21024460,21024461,21024462,21024463,21024464,21024465,21024466,21024467,21024468,21024469,21024470,21024471,21024472,21024473,21024474,21024475,21024476,21024477,21024478,21024479,21024480,21024481,21024482,21024483,21024484,21024485,21024486,21024487,21024488,21024489,21024490,21024491,21024492,21024493,21024494,21024495,21024496,21024497,21024498,21024499,21024500,21024501,21024502,21024503,21024504,21024505,21024506,21024507,21024508,21024509,21024510,21024511,21024640,21024641,21024642,21024643,21024644,21024645,21024646,21024647,21024648,21024649,21024650,21024651,21024652,21024653,21024654,21024655,21024664,21024665,21024666,21024667,21024668,21024669,21024670,21024671],"Fermium":[20821256],"Fern":[21026077],"Fire Block":[21027184,21027185,21027186,21027187,21027188,21027189,21027190,21027191,21027192,21027193,21027194,21027195,21027196,21027197,21027198,21027199],"Flerovium":[20823370],"Fletching Table":[21030063],"Flower Pot":[21031217],"Flowering Azalea Leaves":[21888168,21888169,21888170,21888171],"Fluorine":[20824372],"Francium":[20827305],"Froglight":[21872001,21872002,21872003,21872005,21872006,21872007,21872009,21872010,21872011],"Frosted Ice":[21034052,21034053,21034054,21034055],"Furnace":[21036512,21036513,21036514,21036515,21036516,21036517,21036518,21036519],"Gadolinium":[20828273],"Gallium":[20832169],"Germanium":[20833509],"Gilded Blackstone":[21820646],"Glass":[21038329],"Glass Pane":[21040585],"Glazed Terracotta":[21585152,21585153,21585154,21585155,21585156,21585157,21585158,21585159,21585160,21585161,21585162,21585163,21585164,21585165,21585166,21585167,21585168,21585169,21585170,21585171,21585172,21585173,21585174,21585175,21585176,21585177,21585178,21585179,21585180,21585181,21585182,21585183,21585184,21585185,21585186,21585187,21585188,21585189,21585190,21585191,21585192,21585193,21585194,21585195,21585196,21585197,21585198,21585199,21585200,21585201,21585202,21585203,21585204,21585205,21585206,21585207,21585208,21585209,21585210,21585211,21585212,21585213,21585214,21585215],"Glow Item Frame":[21881552,21881553,21881556,21881557,21881558,21881559,21881560,21881561,21881564,21881565,21881566,21881567],"Glow Lichen":[21893760,21893761,21893762,21893763,21893764,21893765,21893766,21893767,21893768,21893769,21893770,21893771,21893772,21893773,21893774,21893775,21893776,21893777,21893778,21893779,21893780,21893781,21893782,21893783,21893784,21893785,21893786,21893787,21893788,21893789,21893790,21893791,21893792,21893793,21893794,21893795,21893796,21893797,21893798,21893799,21893800,21893801,21893802,21893803,21893804,21893805,21893806,21893807,21893808,21893809,21893810,21893811,21893812,21893813,21893814,21893815,21893816,21893817,21893818,21893819,21893820,21893821,21893822,21893823],"Glowing Obsidian":[21043028],"Glowstone":[21043624],"Gold":[20835704],"Gold Block":[21046696],"Gold Ore":[21049010],"Granite":[21049750],"Granite Slab":[21053256,21053257,21053258],"Granite Stairs":[21054536,21054537,21054538,21054539,21054540,21054541,21054542,21054543],"Granite Wall":[21055488,21055489,21055490,21055491,21055492,21055493,21055494,21055495,21055496,21055497,21055498,21055499,21055500,21055501,21055502,21055503,21055504,21055505,21055506,21055507,21055508,21055509,21055510,21055511,21055512,21055513,21055514,21055515,21055516,21055517,21055518,21055519,21055520,21055521,21055522,21055523,21055524,21055525,21055526,21055527,21055528,21055529,21055530,21055531,21055532,21055533,21055534,21055535,21055536,21055537,21055538,21055539,21055540,21055541,21055542,21055543,21055544,21055545,21055546,21055547,21055548,21055549,21055550,21055551,21055584,21055585,21055586,21055587,21055588,21055589,21055590,21055591,21055592,21055593,21055594,21055595,21055596,21055597,21055598,21055599,21055615,21055616,21055617,21055618,21055619,21055620,21055621,21055622,21055623,21055624,21055625,21055626,21055627,21055628,21055629,21055630,21055631,21055632,21055633,21055634,21055635,21055636,21055637,21055638,21055639,21055640,21055641,21055642,21055643,21055644,21055645,21055646,21055647,21055648,21055649,21055650,21055651,21055652,21055653,21055654,21055655,21055656,21055657,21055658,21055659,21055660,21055661,21055662,21055663,21055664,21055665,21055666,21055667,21055668,21055669,21055670,21055671,21055672,21055673,21055674,21055675,21055676,21055677,21055678,21055679,21055712,21055713,21055714,21055715,21055716,21055717,21055718,21055719,21055720,21055721,21055722,21055723,21055724,21055725,21055726,21055727,21055743],"Grass":[21058118],"Grass Path":[21061327],"Gravel":[21062456],"Green Torch":[21068985,21068986,21068987,21068988,21068989],"Hafnium":[20837560],"Hanging Roots":[21842426],"Hardened Clay":[21071190],"Hardened Glass":[21072075],"Hardened Glass Pane":[21075766],"Hassium":[20839994],"Hay Bale":[21077748,21077749,21077750],"Heat Block":[20625734],"Helium":[20840704],"Holmium":[20842739],"Honeycomb Block":[21782395],"Hopper":[21079520,21079521,21079525,21079526,21079527,21079528,21079529,21079533,21079534,21079535],"Hydrogen":[20844910],"Ice":[21080304],"Indium":[20848311],"Infested Chiseled Stone Brick":[21083943],"Infested Cobblestone":[21085393],"Infested Cracked Stone Brick":[21087627],"Infested Mossy Stone Brick":[21088835],"Infested Stone":[21091396],"Infested Stone Brick":[21092358],"Invisible Bedrock":[21100447],"Iodine":[20850310],"Iridium":[20851638],"Iron":[20854572],"Iron Bars":[21104146],"Iron Block":[21101750],"Iron Door":[21105792,21105793,21105794,21105795,21105796,21105797,21105798,21105799,21105800,21105801,21105802,21105803,21105804,21105805,21105806,21105807,21105808,21105809,21105810,21105811,21105812,21105813,21105814,21105815,21105816,21105817,21105818,21105819,21105820,21105821,21105822,21105823],"Iron Ore":[21107313],"Iron Trapdoor":[21109264,21109265,21109266,21109267,21109268,21109269,21109270,21109271,21109272,21109273,21109274,21109275,21109276,21109277,21109278,21109279],"Item Frame":[21111952,21111953,21111954,21111955,21111956,21111957,21111960,21111961,21111962,21111963,21111964,21111965],"Jack o'Lantern":[21179952,21179953,21179954,21179955],"Jukebox":[21113057],"Jungle Button":[21115488,21115489,21115490,21115491,21115492,21115493,21115496,21115497,21115498,21115499,21115500,21115501],"Jungle Door":[21117568,21117569,21117570,21117571,21117572,21117573,21117574,21117575,21117576,21117577,21117578,21117579,21117580,21117581,21117582,21117583,21117584,21117585,21117586,21117587,21117588,21117589,21117590,21117591,21117592,21117593,21117594,21117595,21117596,21117597,21117598,21117599],"Jungle Fence":[21119582],"Jungle Fence Gate":[21122144,21122145,21122146,21122147,21122148,21122149,21122150,21122151,21122152,21122153,21122154,21122155,21122156,21122157,21122158,21122159],"Jungle Leaves":[21124916,21124917,21124918,21124919],"Jungle Log":[21126656,21126657,21126658,21126659,21126662,21126663],"Jungle Planks":[21127877],"Jungle Pressure Plate":[21130628,21130629],"Jungle Sapling":[21132062,21132063],"Jungle Sign":[21134400,21134401,21134402,21134403,21134404,21134405,21134406,21134407,21134408,21134409,21134410,21134411,21134412,21134413,21134414,21134415],"Jungle Slab":[21135720,21135721,21135722],"Jungle Stairs":[21137656,21137657,21137658,21137659,21137660,21137661,21137662,21137663],"Jungle Trapdoor":[21139728,21139729,21139730,21139731,21139732,21139733,21139734,21139735,21139736,21139737,21139738,21139739,21139740,21139741,21139742,21139743],"Jungle Wall Sign":[21143348,21143349,21143350,21143351],"Jungle Wood":[21145480,21145481,21145484,21145485,21145486,21145487],"Krypton":[20856167],"Lab Table":[21146608,21146609,21146610,21146611],"Ladder":[21148984,21148985,21148986,21148987],"Lantern":[21149740,21149741],"Lanthanum":[20858521],"Lapis Lazuli Block":[21152040],"Lapis Lazuli Ore":[21154437],"Large Fern":[21156644,21156645],"Lava":[21159648,21159649,21159650,21159651,21159652,21159653,21159654,21159655,21159656,21159657,21159658,21159659,21159660,21159661,21159662,21159663,21159664,21159665,21159666,21159667,21159668,21159669,21159670,21159671,21159672,21159673,21159674,21159675,21159676,21159677,21159678,21159679],"Lava Cauldron":[21857912,21857913,21857914,21857915,21857916,21857917],"Lawrencium":[20860323],"Lead":[20861284],"Lectern":[21160360,21160361,21160362,21160363,21160364,21160365,21160366,21160367],"Legacy Stonecutter":[21162264],"Lever":[21165776,21165777,21165778,21165779,21165780,21165781,21165782,21165783,21165784,21165785,21165786,21165787,21165788,21165789,21165790,21165791],"Light Block":[21629408,21629409,21629410,21629411,21629412,21629413,21629414,21629415,21629416,21629417,21629418,21629419,21629420,21629421,21629422,21629423],"Lightning Rod":[21821570,21821571,21821572,21821573,21821574,21821575],"Lilac":[21171834,21171835],"Lily Pad":[21174431],"Lily of the Valley":[21173216],"Lithium":[20863911],"Livermorium":[20865878],"Loom":[21182044,21182045,21182046,21182047],"Lutetium":[20867537],"Magma Block":[21186488],"Magnesium":[20869155],"Manganese":[20872294],"Mangrove Button":[21735552,21735553,21735554,21735555,21735558,21735559,21735560,21735561,21735562,21735563,21735566,21735567],"Mangrove Door":[21749248,21749249,21749250,21749251,21749252,21749253,21749254,21749255,21749256,21749257,21749258,21749259,21749260,21749261,21749262,21749263,21749264,21749265,21749266,21749267,21749268,21749269,21749270,21749271,21749272,21749273,21749274,21749275,21749276,21749277,21749278,21749279],"Mangrove Fence":[21706659],"Mangrove Fence Gate":[21755424,21755425,21755426,21755427,21755428,21755429,21755430,21755431,21755432,21755433,21755434,21755435,21755436,21755437,21755438,21755439],"Mangrove Leaves":[21884612,21884613,21884614,21884615],"Mangrove Log":[21717272,21717273,21717274,21717275,21717278,21717279],"Mangrove Planks":[21700363],"Mangrove Pressure Plate":[21742138,21742139],"Mangrove Roots":[21868046],"Mangrove Sign":[21766688,21766689,21766690,21766691,21766692,21766693,21766694,21766695,21766696,21766697,21766698,21766699,21766700,21766701,21766702,21766703],"Mangrove Slab":[21711233,21711234,21711235],"Mangrove Stairs":[21760624,21760625,21760626,21760627,21760628,21760629,21760630,21760631],"Mangrove Trapdoor":[21729584,21729585,21729586,21729587,21729588,21729589,21729590,21729591,21729592,21729593,21729594,21729595,21729596,21729597,21729598,21729599],"Mangrove Wall Sign":[21774240,21774241,21774242,21774243],"Mangrove Wood":[21723914,21723915,21723916,21723917,21723918,21723919],"Material Reducer":[21187744,21187745,21187746,21187747],"Meitnerium":[20874589],"Melon Block":[21189795],"Melon Stem":[21190912,21190913,21190914,21190915,21190916,21190917,21190918,21190919,21190920,21190921,21190922,21190923,21190924,21190925,21190926,21190927,21190944,21190945,21190946,21190947,21190948,21190949,21190950,21190951,21190960,21190961,21190962,21190963,21190964,21190965,21190966,21190967,21190968,21190969,21190970,21190971,21190972,21190973,21190974,21190975],"Mendelevium":[20876625],"Mercury":[20877937],"Mob Head":[21193344,21193345,21193346,21193347,21193349,21193350,21193351,21193352,21193353,21193354,21193355,21193357,21193358,21193359,21193376,21193377,21193378,21193379,21193381,21193382,21193383,21193392,21193393,21193394,21193395,21193397,21193398,21193399,21193400,21193401,21193402,21193403,21193405,21193406,21193407],"Molybdenum":[20879537],"Monster Spawner":[21195322],"Moscovium":[20883402],"Mossy Cobblestone":[21197453],"Mossy Cobblestone Slab":[21200052,21200054,21200055],"Mossy Cobblestone Stairs":[21202568,21202569,21202570,21202571,21202572,21202573,21202574,21202575],"Mossy Cobblestone Wall":[21204224,21204225,21204226,21204227,21204228,21204229,21204230,21204231,21204232,21204233,21204234,21204235,21204236,21204237,21204238,21204239,21204240,21204241,21204242,21204243,21204244,21204245,21204246,21204247,21204248,21204249,21204250,21204251,21204252,21204253,21204254,21204255,21204256,21204257,21204258,21204259,21204260,21204261,21204262,21204263,21204264,21204265,21204266,21204267,21204268,21204269,21204270,21204271,21204272,21204273,21204274,21204275,21204276,21204277,21204278,21204279,21204280,21204281,21204282,21204283,21204284,21204285,21204286,21204287,21204288,21204289,21204290,21204291,21204292,21204293,21204294,21204295,21204296,21204297,21204298,21204299,21204300,21204301,21204302,21204303,21204306,21204352,21204353,21204354,21204355,21204356,21204357,21204358,21204359,21204360,21204361,21204362,21204363,21204364,21204365,21204366,21204367,21204368,21204369,21204370,21204371,21204372,21204373,21204374,21204375,21204376,21204377,21204378,21204379,21204380,21204381,21204382,21204383,21204384,21204385,21204386,21204387,21204388,21204389,21204390,21204391,21204392,21204393,21204394,21204395,21204396,21204397,21204398,21204399,21204400,21204401,21204402,21204403,21204404,21204405,21204406,21204407,21204408,21204409,21204410,21204411,21204412,21204413,21204414,21204415,21204416,21204417,21204418,21204419,21204420,21204421,21204422,21204423,21204424,21204425,21204426,21204427,21204428,21204429,21204430,21204431,21204434],"Mossy Stone Brick Slab":[21205992,21205993,21205995],"Mossy Stone Brick Stairs":[21207584,21207585,21207586,21207587,21207588,21207589,21207590,21207591],"Mossy Stone Brick Wall":[21210147,21210160,21210161,21210162,21210163,21210164,21210165,21210166,21210167,21210168,21210169,21210170,21210171,21210172,21210173,21210174,21210175,21210176,21210177,21210178,21210179,21210180,21210181,21210182,21210183,21210184,21210185,21210186,21210187,21210188,21210189,21210190,21210191,21210192,21210193,21210194,21210195,21210196,21210197,21210198,21210199,21210200,21210201,21210202,21210203,21210204,21210205,21210206,21210207,21210208,21210209,21210210,21210211,21210212,21210213,21210214,21210215,21210216,21210217,21210218,21210219,21210220,21210221,21210222,21210223,21210224,21210225,21210226,21210227,21210228,21210229,21210230,21210231,21210232,21210233,21210234,21210235,21210236,21210237,21210238,21210239,21210275,21210288,21210289,21210290,21210291,21210292,21210293,21210294,21210295,21210296,21210297,21210298,21210299,21210300,21210301,21210302,21210303,21210304,21210305,21210306,21210307,21210308,21210309,21210310,21210311,21210312,21210313,21210314,21210315,21210316,21210317,21210318,21210319,21210320,21210321,21210322,21210323,21210324,21210325,21210326,21210327,21210328,21210329,21210330,21210331,21210332,21210333,21210334,21210335,21210336,21210337,21210338,21210339,21210340,21210341,21210342,21210343,21210344,21210345,21210346,21210347,21210348,21210349,21210350,21210351,21210352,21210353,21210354,21210355,21210356,21210357,21210358,21210359,21210360,21210361,21210362,21210363,21210364,21210365,21210366,21210367],"Mossy Stone Bricks":[21212641],"Mud":[21804596],"Mud Brick Slab":[21807848,21807850,21807851],"Mud Brick Stairs":[21810184,21810185,21810186,21810187,21810188,21810189,21810190,21810191],"Mud Brick Wall":[21812238,21812240,21812241,21812242,21812243,21812244,21812245,21812246,21812247,21812248,21812249,21812250,21812251,21812252,21812253,21812254,21812255,21812288,21812289,21812290,21812291,21812292,21812293,21812294,21812295,21812296,21812297,21812298,21812299,21812300,21812301,21812302,21812303,21812304,21812305,21812306,21812307,21812308,21812309,21812310,21812311,21812312,21812313,21812314,21812315,21812316,21812317,21812318,21812319,21812320,21812321,21812322,21812323,21812324,21812325,21812326,21812327,21812328,21812329,21812330,21812331,21812332,21812333,21812334,21812335,21812336,21812337,21812338,21812339,21812340,21812341,21812342,21812343,21812344,21812345,21812346,21812347,21812348,21812349,21812350,21812351,21812366,21812368,21812369,21812370,21812371,21812372,21812373,21812374,21812375,21812376,21812377,21812378,21812379,21812380,21812381,21812382,21812383,21812416,21812417,21812418,21812419,21812420,21812421,21812422,21812423,21812424,21812425,21812426,21812427,21812428,21812429,21812430,21812431,21812432,21812433,21812434,21812435,21812436,21812437,21812438,21812439,21812440,21812441,21812442,21812443,21812444,21812445,21812446,21812447,21812448,21812449,21812450,21812451,21812452,21812453,21812454,21812455,21812456,21812457,21812458,21812459,21812460,21812461,21812462,21812463,21812464,21812465,21812466,21812467,21812468,21812469,21812470,21812471,21812472,21812473,21812474,21812475,21812476,21812477,21812478,21812479],"Mud Bricks":[21805580],"Muddy Mangrove Roots":[21870173,21870174,21870175],"Mushroom Stem":[21214847],"Mycelium":[21215507],"Neodymium":[20883794],"Neon":[20887178],"Neptunium":[20888366],"Nether Brick Fence":[21219143],"Nether Brick Slab":[21219584,21219585,21219587],"Nether Brick Stairs":[21222456,21222457,21222458,21222459,21222460,21222461,21222462,21222463],"Nether Brick Wall":[21223712,21223713,21223714,21223715,21223716,21223717,21223718,21223719,21223720,21223721,21223722,21223723,21223724,21223725,21223726,21223727,21223728,21223744,21223745,21223746,21223747,21223748,21223749,21223750,21223751,21223752,21223753,21223754,21223755,21223756,21223757,21223758,21223759,21223760,21223761,21223762,21223763,21223764,21223765,21223766,21223767,21223768,21223769,21223770,21223771,21223772,21223773,21223774,21223775,21223776,21223777,21223778,21223779,21223780,21223781,21223782,21223783,21223784,21223785,21223786,21223787,21223788,21223789,21223790,21223791,21223792,21223793,21223794,21223795,21223796,21223797,21223798,21223799,21223800,21223801,21223802,21223803,21223804,21223805,21223806,21223807,21223840,21223841,21223842,21223843,21223844,21223845,21223846,21223847,21223848,21223849,21223850,21223851,21223852,21223853,21223854,21223855,21223856,21223872,21223873,21223874,21223875,21223876,21223877,21223878,21223879,21223880,21223881,21223882,21223883,21223884,21223885,21223886,21223887,21223888,21223889,21223890,21223891,21223892,21223893,21223894,21223895,21223896,21223897,21223898,21223899,21223900,21223901,21223902,21223903,21223904,21223905,21223906,21223907,21223908,21223909,21223910,21223911,21223912,21223913,21223914,21223915,21223916,21223917,21223918,21223919,21223920,21223921,21223922,21223923,21223924,21223925,21223926,21223927,21223928,21223929,21223930,21223931,21223932,21223933,21223934,21223935],"Nether Bricks":[21225672],"Nether Gold Ore":[21801107],"Nether Portal":[21229304,21229305],"Nether Quartz Ore":[21230807],"Nether Reactor Core":[21233112],"Nether Wart":[21235588,21235589,21235590,21235591],"Nether Wart Block":[21237079],"Netherite Block":[21848862],"Netherrack":[21239734],"Nickel":[20891060],"Nihonium":[20892811],"Niobium":[20895630],"Nitrogen":[20897160],"Nobelium":[20898460],"Note Block":[21241302],"Oak Button":[21243152,21243153,21243156,21243157,21243158,21243159,21243160,21243161,21243164,21243165,21243166,21243167],"Oak Door":[21245696,21245697,21245698,21245699,21245700,21245701,21245702,21245703,21245704,21245705,21245706,21245707,21245708,21245709,21245710,21245711,21245712,21245713,21245714,21245715,21245716,21245717,21245718,21245719,21245720,21245721,21245722,21245723,21245724,21245725,21245726,21245727],"Oak Fence":[21247506],"Oak Fence Gate":[21248560,21248561,21248562,21248563,21248564,21248565,21248566,21248567,21248568,21248569,21248570,21248571,21248572,21248573,21248574,21248575],"Oak Leaves":[21250248,21250249,21250250,21250251],"Oak Log":[21253352,21253353,21253356,21253357,21253358,21253359],"Oak Planks":[21255504],"Oak Pressure Plate":[21257680,21257681],"Oak Sapling":[21258462,21258463],"Oak Sign":[21262208,21262209,21262210,21262211,21262212,21262213,21262214,21262215,21262216,21262217,21262218,21262219,21262220,21262221,21262222,21262223],"Oak Slab":[21264373,21264374,21264375],"Oak Stairs":[21264984,21264985,21264986,21264987,21264988,21264989,21264990,21264991],"Oak Trapdoor":[21267760,21267761,21267762,21267763,21267764,21267765,21267766,21267767,21267768,21267769,21267770,21267771,21267772,21267773,21267774,21267775],"Oak Wall Sign":[21270344,21270345,21270346,21270347],"Oak Wood":[21272410,21272411,21272412,21272413,21272414,21272415],"Obsidian":[21273247],"Oganesson":[20901372],"Orange Tulip":[21278363],"Osmium":[20902298],"Oxeye Daisy":[21280579],"Oxygen":[20904205],"Packed Ice":[21282488],"Packed Mud":[21814973],"Palladium":[20907027],"Peony":[21283348,21283349],"Phosphorus":[20908773],"Pink Petals":[21933456,21933457,21933458,21933459,21933460,21933461,21933462,21933463,21933464,21933465,21933466,21933467,21933468,21933469,21933470,21933471],"Pink Tulip":[21286997],"Pitcher Crop":[21947997,21947998,21947999],"Pitcher Plant":[21945642,21945643],"Platinum":[20911235],"Plutonium":[20912900],"Podzol":[21290197],"Polished Andesite":[21292531],"Polished Andesite Slab":[21294924,21294925,21294927],"Polished Andesite Stairs":[21295920,21295921,21295922,21295923,21295924,21295925,21295926,21295927],"Polished Basalt":[21592160,21592162,21592163],"Polished Blackstone":[21605632],"Polished Blackstone Brick Slab":[21622088,21622089,21622090],"Polished Blackstone Brick Stairs":[21622992,21622993,21622994,21622995,21622996,21622997,21622998,21622999],"Polished Blackstone Brick Wall":[21624832,21624833,21624834,21624835,21624836,21624837,21624838,21624839,21624840,21624841,21624842,21624843,21624844,21624845,21624846,21624847,21624848,21624849,21624850,21624851,21624852,21624853,21624854,21624855,21624856,21624857,21624858,21624859,21624860,21624861,21624862,21624863,21624864,21624865,21624866,21624867,21624868,21624869,21624870,21624871,21624872,21624873,21624874,21624875,21624876,21624877,21624878,21624879,21624880,21624881,21624882,21624883,21624884,21624885,21624886,21624887,21624888,21624889,21624890,21624891,21624892,21624893,21624894,21624895,21624896,21624912,21624913,21624914,21624915,21624916,21624917,21624918,21624919,21624920,21624921,21624922,21624923,21624924,21624925,21624926,21624927,21624960,21624961,21624962,21624963,21624964,21624965,21624966,21624967,21624968,21624969,21624970,21624971,21624972,21624973,21624974,21624975,21624976,21624977,21624978,21624979,21624980,21624981,21624982,21624983,21624984,21624985,21624986,21624987,21624988,21624989,21624990,21624991,21624992,21624993,21624994,21624995,21624996,21624997,21624998,21624999,21625000,21625001,21625002,21625003,21625004,21625005,21625006,21625007,21625008,21625009,21625010,21625011,21625012,21625013,21625014,21625015,21625016,21625017,21625018,21625019,21625020,21625021,21625022,21625023,21625024,21625040,21625041,21625042,21625043,21625044,21625045,21625046,21625047,21625048,21625049,21625050,21625051,21625052,21625053,21625054,21625055],"Polished Blackstone Bricks":[21619830],"Polished Blackstone Button":[21607152,21607153,21607154,21607155,21607156,21607157,21607160,21607161,21607162,21607163,21607164,21607165],"Polished Blackstone Pressure Plate":[21609892,21609893],"Polished Blackstone Slab":[21611892,21611893,21611894],"Polished Blackstone Stairs":[21614000,21614001,21614002,21614003,21614004,21614005,21614006,21614007],"Polished Blackstone Wall":[21614848,21614849,21614850,21614851,21614852,21614853,21614854,21614855,21614856,21614857,21614858,21614859,21614860,21614861,21614862,21614863,21614864,21614865,21614866,21614867,21614868,21614869,21614870,21614871,21614872,21614873,21614874,21614875,21614876,21614877,21614878,21614879,21614880,21614881,21614882,21614883,21614884,21614885,21614886,21614887,21614888,21614889,21614890,21614891,21614892,21614893,21614894,21614895,21614896,21614897,21614898,21614899,21614900,21614901,21614902,21614903,21614904,21614905,21614906,21614907,21614908,21614909,21614910,21614911,21614917,21614928,21614929,21614930,21614931,21614932,21614933,21614934,21614935,21614936,21614937,21614938,21614939,21614940,21614941,21614942,21614943,21614976,21614977,21614978,21614979,21614980,21614981,21614982,21614983,21614984,21614985,21614986,21614987,21614988,21614989,21614990,21614991,21614992,21614993,21614994,21614995,21614996,21614997,21614998,21614999,21615000,21615001,21615002,21615003,21615004,21615005,21615006,21615007,21615008,21615009,21615010,21615011,21615012,21615013,21615014,21615015,21615016,21615017,21615018,21615019,21615020,21615021,21615022,21615023,21615024,21615025,21615026,21615027,21615028,21615029,21615030,21615031,21615032,21615033,21615034,21615035,21615036,21615037,21615038,21615039,21615045,21615056,21615057,21615058,21615059,21615060,21615061,21615062,21615063,21615064,21615065,21615066,21615067,21615068,21615069,21615070,21615071],"Polished Deepslate":[21670363],"Polished Deepslate Slab":[21672268,21672270,21672271],"Polished Deepslate Stairs":[21674288,21674289,21674290,21674291,21674292,21674293,21674294,21674295],"Polished Deepslate Wall":[21676076,21676080,21676081,21676082,21676083,21676084,21676085,21676086,21676087,21676088,21676089,21676090,21676091,21676092,21676093,21676094,21676095,21676096,21676097,21676098,21676099,21676100,21676101,21676102,21676103,21676104,21676105,21676106,21676107,21676108,21676109,21676110,21676111,21676112,21676113,21676114,21676115,21676116,21676117,21676118,21676119,21676120,21676121,21676122,21676123,21676124,21676125,21676126,21676127,21676128,21676129,21676130,21676131,21676132,21676133,21676134,21676135,21676136,21676137,21676138,21676139,21676140,21676141,21676142,21676143,21676144,21676145,21676146,21676147,21676148,21676149,21676150,21676151,21676152,21676153,21676154,21676155,21676156,21676157,21676158,21676159,21676204,21676208,21676209,21676210,21676211,21676212,21676213,21676214,21676215,21676216,21676217,21676218,21676219,21676220,21676221,21676222,21676223,21676224,21676225,21676226,21676227,21676228,21676229,21676230,21676231,21676232,21676233,21676234,21676235,21676236,21676237,21676238,21676239,21676240,21676241,21676242,21676243,21676244,21676245,21676246,21676247,21676248,21676249,21676250,21676251,21676252,21676253,21676254,21676255,21676256,21676257,21676258,21676259,21676260,21676261,21676262,21676263,21676264,21676265,21676266,21676267,21676268,21676269,21676270,21676271,21676272,21676273,21676274,21676275,21676276,21676277,21676278,21676279,21676280,21676281,21676282,21676283,21676284,21676285,21676286,21676287],"Polished Diorite":[21298589],"Polished Diorite Slab":[21299568,21299570,21299571],"Polished Diorite Stairs":[21301328,21301329,21301330,21301331,21301332,21301333,21301334,21301335],"Polished Granite":[21304978],"Polished Granite Slab":[21307024,21307025,21307027],"Polished Granite Stairs":[21307536,21307537,21307538,21307539,21307540,21307541,21307542,21307543],"Polonium":[20915922],"Poppy":[21310628],"Potassium":[20916939],"Potato Block":[21312968,21312969,21312970,21312971,21312972,21312973,21312974,21312975],"Potion Cauldron":[21859216,21859217,21859218,21859219,21859220,21859221],"Powered Rail":[21313936,21313937,21313938,21313939,21313942,21313943,21313944,21313945,21313946,21313947,21313950,21313951],"Praseodymium":[20918290],"Prismarine":[21317514],"Prismarine Bricks":[21318880],"Prismarine Bricks Slab":[21319764,21319766,21319767],"Prismarine Bricks Stairs":[21322480,21322481,21322482,21322483,21322484,21322485,21322486,21322487],"Prismarine Slab":[21324568,21324569,21324571],"Prismarine Stairs":[21327832,21327833,21327834,21327835,21327836,21327837,21327838,21327839],"Prismarine Wall":[21327872,21327873,21327874,21327875,21327876,21327877,21327878,21327879,21327880,21327881,21327882,21327883,21327884,21327885,21327886,21327887,21327888,21327889,21327890,21327891,21327892,21327893,21327894,21327895,21327896,21327897,21327898,21327899,21327900,21327901,21327902,21327903,21327904,21327905,21327906,21327907,21327908,21327909,21327910,21327911,21327912,21327913,21327914,21327915,21327916,21327917,21327918,21327919,21327920,21327921,21327922,21327923,21327924,21327925,21327926,21327927,21327928,21327929,21327930,21327931,21327932,21327933,21327934,21327935,21327974,21327984,21327985,21327986,21327987,21327988,21327989,21327990,21327991,21327992,21327993,21327994,21327995,21327996,21327997,21327998,21327999,21328000,21328001,21328002,21328003,21328004,21328005,21328006,21328007,21328008,21328009,21328010,21328011,21328012,21328013,21328014,21328015,21328016,21328017,21328018,21328019,21328020,21328021,21328022,21328023,21328024,21328025,21328026,21328027,21328028,21328029,21328030,21328031,21328032,21328033,21328034,21328035,21328036,21328037,21328038,21328039,21328040,21328041,21328042,21328043,21328044,21328045,21328046,21328047,21328048,21328049,21328050,21328051,21328052,21328053,21328054,21328055,21328056,21328057,21328058,21328059,21328060,21328061,21328062,21328063,21328102,21328112,21328113,21328114,21328115,21328116,21328117,21328118,21328119,21328120,21328121,21328122,21328123,21328124,21328125,21328126,21328127],"Promethium":[20920321],"Protactinium":[20923161],"Pumpkin":[21331624],"Pumpkin Stem":[21333968,21333969,21333970,21333971,21333972,21333973,21333974,21333975,21333976,21333977,21333978,21333979,21333980,21333981,21333982,21333983,21333984,21333985,21333986,21333987,21333988,21333989,21333990,21333991,21333992,21333993,21333994,21333995,21333996,21333997,21333998,21333999,21334000,21334001,21334002,21334003,21334004,21334005,21334006,21334007],"Purple Torch":[21337610,21337611,21337612,21337613,21337614],"Purpur Block":[21338315],"Purpur Pillar":[21340545,21340546,21340547],"Purpur Slab":[21344168,21344169,21344170],"Purpur Stairs":[21344432,21344433,21344434,21344435,21344436,21344437,21344438,21344439],"Quartz Block":[21347391],"Quartz Bricks":[21678669],"Quartz Pillar":[21348820,21348821,21348823],"Quartz Slab":[21351776,21351777,21351779],"Quartz Stairs":[21352904,21352905,21352906,21352907,21352908,21352909,21352910,21352911],"Radium":[20925466],"Radon":[20927914],"Rail":[21356230,21356231,21356232,21356233,21356234,21356235,21356236,21356237,21356238,21356239],"Raw Copper Block":[21632127],"Raw Gold Block":[21634601],"Raw Iron Block":[21635367],"Red Mushroom":[21359866],"Red Mushroom Block":[21361105,21361106,21361107,21361112,21361113,21361114,21361115,21361116,21361117,21361118,21361119],"Red Nether Brick Slab":[21363940,21363942,21363943],"Red Nether Brick Stairs":[21365640,21365641,21365642,21365643,21365644,21365645,21365646,21365647],"Red Nether Brick Wall":[21367808,21367809,21367810,21367811,21367812,21367813,21367814,21367815,21367816,21367817,21367818,21367819,21367820,21367821,21367822,21367823,21367824,21367825,21367826,21367827,21367828,21367829,21367830,21367831,21367832,21367833,21367834,21367835,21367836,21367837,21367838,21367839,21367840,21367841,21367842,21367843,21367844,21367845,21367846,21367847,21367848,21367849,21367850,21367851,21367852,21367853,21367854,21367855,21367856,21367857,21367858,21367859,21367860,21367861,21367862,21367863,21367864,21367865,21367866,21367867,21367868,21367869,21367870,21367871,21367872,21367888,21367889,21367890,21367891,21367892,21367893,21367894,21367895,21367896,21367897,21367898,21367899,21367900,21367901,21367902,21367903,21367936,21367937,21367938,21367939,21367940,21367941,21367942,21367943,21367944,21367945,21367946,21367947,21367948,21367949,21367950,21367951,21367952,21367953,21367954,21367955,21367956,21367957,21367958,21367959,21367960,21367961,21367962,21367963,21367964,21367965,21367966,21367967,21367968,21367969,21367970,21367971,21367972,21367973,21367974,21367975,21367976,21367977,21367978,21367979,21367980,21367981,21367982,21367983,21367984,21367985,21367986,21367987,21367988,21367989,21367990,21367991,21367992,21367993,21367994,21367995,21367996,21367997,21367998,21367999,21368000,21368016,21368017,21368018,21368019,21368020,21368021,21368022,21368023,21368024,21368025,21368026,21368027,21368028,21368029,21368030,21368031],"Red Nether Bricks":[21368920],"Red Sand":[21371243],"Red Sandstone":[21373682],"Red Sandstone Slab":[21375308,21375309,21375310],"Red Sandstone Stairs":[21377256,21377257,21377258,21377259,21377260,21377261,21377262,21377263],"Red Sandstone Wall":[21380352,21380353,21380354,21380355,21380356,21380357,21380358,21380359,21380360,21380361,21380362,21380363,21380364,21380365,21380366,21380367,21380383,21380416,21380417,21380418,21380419,21380420,21380421,21380422,21380423,21380424,21380425,21380426,21380427,21380428,21380429,21380430,21380431,21380432,21380433,21380434,21380435,21380436,21380437,21380438,21380439,21380440,21380441,21380442,21380443,21380444,21380445,21380446,21380447,21380448,21380449,21380450,21380451,21380452,21380453,21380454,21380455,21380456,21380457,21380458,21380459,21380460,21380461,21380462,21380463,21380464,21380465,21380466,21380467,21380468,21380469,21380470,21380471,21380472,21380473,21380474,21380475,21380476,21380477,21380478,21380479,21380480,21380481,21380482,21380483,21380484,21380485,21380486,21380487,21380488,21380489,21380490,21380491,21380492,21380493,21380494,21380495,21380511,21380544,21380545,21380546,21380547,21380548,21380549,21380550,21380551,21380552,21380553,21380554,21380555,21380556,21380557,21380558,21380559,21380560,21380561,21380562,21380563,21380564,21380565,21380566,21380567,21380568,21380569,21380570,21380571,21380572,21380573,21380574,21380575,21380576,21380577,21380578,21380579,21380580,21380581,21380582,21380583,21380584,21380585,21380586,21380587,21380588,21380589,21380590,21380591,21380592,21380593,21380594,21380595,21380596,21380597,21380598,21380599,21380600,21380601,21380602,21380603,21380604,21380605,21380606,21380607],"Red Torch":[21381490,21381491,21381492,21381493,21381495],"Red Tulip":[21384139],"Redstone":[21397872,21397873,21397874,21397875,21397876,21397877,21397878,21397879,21397880,21397881,21397882,21397883,21397884,21397885,21397886,21397887],"Redstone Block":[21385654],"Redstone Comparator":[21388928,21388929,21388930,21388931,21388932,21388933,21388934,21388935,21388936,21388937,21388938,21388939,21388940,21388941,21388942,21388943],"Redstone Lamp":[21390644,21390645],"Redstone Ore":[21392016,21392017],"Redstone Repeater":[21394976,21394977,21394978,21394979,21394980,21394981,21394982,21394983,21394984,21394985,21394986,21394987,21394988,21394989,21394990,21394991,21394992,21394993,21394994,21394995,21394996,21394997,21394998,21394999,21395000,21395001,21395002,21395003,21395004,21395005,21395006,21395007],"Redstone Torch":[21396497,21396498,21396499,21396500,21396501,21396505,21396506,21396507,21396508,21396509],"Reinforced Deepslate":[21889612],"Rhenium":[20930190],"Rhodium":[20931608],"Roentgenium":[20934217],"Rose Bush":[21402408,21402409],"Rubidium":[20936670],"Ruthenium":[20937111],"Rutherfordium":[20939938],"Samarium":[20942830],"Sand":[21405599],"Sandstone":[21406854],"Sandstone Slab":[21408357,21408358,21408359],"Sandstone Stairs":[21410360,21410361,21410362,21410363,21410364,21410365,21410366,21410367],"Sandstone Wall":[21413632,21413633,21413634,21413635,21413636,21413637,21413638,21413639,21413640,21413641,21413642,21413643,21413644,21413645,21413646,21413647,21413648,21413649,21413650,21413651,21413652,21413653,21413654,21413655,21413656,21413657,21413658,21413659,21413660,21413661,21413662,21413663,21413664,21413665,21413666,21413667,21413668,21413669,21413670,21413671,21413672,21413673,21413674,21413675,21413676,21413677,21413678,21413679,21413680,21413681,21413682,21413683,21413684,21413685,21413686,21413687,21413688,21413689,21413690,21413691,21413692,21413693,21413694,21413695,21413696,21413697,21413698,21413699,21413700,21413701,21413702,21413703,21413704,21413705,21413706,21413707,21413708,21413709,21413710,21413711,21413719,21413760,21413761,21413762,21413763,21413764,21413765,21413766,21413767,21413768,21413769,21413770,21413771,21413772,21413773,21413774,21413775,21413776,21413777,21413778,21413779,21413780,21413781,21413782,21413783,21413784,21413785,21413786,21413787,21413788,21413789,21413790,21413791,21413792,21413793,21413794,21413795,21413796,21413797,21413798,21413799,21413800,21413801,21413802,21413803,21413804,21413805,21413806,21413807,21413808,21413809,21413810,21413811,21413812,21413813,21413814,21413815,21413816,21413817,21413818,21413819,21413820,21413821,21413822,21413823,21413824,21413825,21413826,21413827,21413828,21413829,21413830,21413831,21413832,21413833,21413834,21413835,21413836,21413837,21413838,21413839,21413847],"Scandium":[20944835],"Sculk":[21880279],"Sea Lantern":[21415151],"Sea Pickle":[21417344,21417345,21417346,21417347,21417348,21417349,21417350,21417351],"Seaborgium":[20946478],"Selenium":[20948963],"Shroomlight":[21696604],"Shulker Box":[21418259],"Silicon":[20949447],"Silver":[20952835],"Slime Block":[21421890],"Small Dripleaf":[21927576,21927577,21927578,21927579,21927580,21927581,21927582,21927583],"Smithing Table":[21847863],"Smoker":[21423456,21423457,21423458,21423459,21423460,21423461,21423462,21423463],"Smooth Basalt":[21595261],"Smooth Quartz Block":[21425097],"Smooth Quartz Slab":[21428056,21428057,21428058],"Smooth Quartz Stairs":[21429504,21429505,21429506,21429507,21429508,21429509,21429510,21429511],"Smooth Red Sandstone":[21431324],"Smooth Red Sandstone Slab":[21432877,21432878,21432879],"Smooth Red Sandstone Stairs":[21436184,21436185,21436186,21436187,21436188,21436189,21436190,21436191],"Smooth Sandstone":[21438242],"Smooth Sandstone Slab":[21439385,21439386,21439387],"Smooth Sandstone Stairs":[21440752,21440753,21440754,21440755,21440756,21440757,21440758,21440759],"Smooth Stone":[21444566],"Smooth Stone Slab":[21446216,21446217,21446219],"Snow Block":[21448652],"Snow Layer":[21449736,21449737,21449738,21449739,21449740,21449741,21449742,21449743],"Sodium":[20953522],"Soul Fire":[21696136],"Soul Lantern":[21692144,21692145],"Soul Sand":[21451142],"Soul Soil":[21693270],"Soul Torch":[21689448,21689449,21689452,21689454,21689455],"Sponge":[21454292,21454293],"Spore Blossom":[21852156],"Spruce Button":[21456688,21456689,21456690,21456691,21456692,21456693,21456696,21456697,21456698,21456699,21456700,21456701],"Spruce Door":[21458400,21458401,21458402,21458403,21458404,21458405,21458406,21458407,21458408,21458409,21458410,21458411,21458412,21458413,21458414,21458415,21458416,21458417,21458418,21458419,21458420,21458421,21458422,21458423,21458424,21458425,21458426,21458427,21458428,21458429,21458430,21458431],"Spruce Fence":[21459375],"Spruce Fence Gate":[21462512,21462513,21462514,21462515,21462516,21462517,21462518,21462519,21462520,21462521,21462522,21462523,21462524,21462525,21462526,21462527],"Spruce Leaves":[21463656,21463657,21463658,21463659],"Spruce Log":[21465720,21465721,21465724,21465725,21465726,21465727],"Spruce Planks":[21468562],"Spruce Pressure Plate":[21469450,21469451],"Spruce Sapling":[21472860,21472861],"Spruce Sign":[21473424,21473425,21473426,21473427,21473428,21473429,21473430,21473431,21473432,21473433,21473434,21473435,21473436,21473437,21473438,21473439],"Spruce Slab":[21475816,21475817,21475818],"Spruce Stairs":[21477456,21477457,21477458,21477459,21477460,21477461,21477462,21477463],"Spruce Trapdoor":[21481008,21481009,21481010,21481011,21481012,21481013,21481014,21481015,21481016,21481017,21481018,21481019,21481020,21481021,21481022,21481023],"Spruce Wall Sign":[21483504,21483505,21483506,21483507],"Spruce Wood":[21484912,21484913,21484914,21484915,21484918,21484919],"Stained Clay":[21486144,21486145,21486146,21486147,21486148,21486149,21486150,21486151,21486152,21486153,21486154,21486155,21486156,21486157,21486158,21486159],"Stained Glass":[21489584,21489585,21489586,21489587,21489588,21489589,21489590,21489591,21489592,21489593,21489594,21489595,21489596,21489597,21489598,21489599],"Stained Glass Pane":[21489792,21489793,21489794,21489795,21489796,21489797,21489798,21489799,21489800,21489801,21489802,21489803,21489804,21489805,21489806,21489807],"Stained Hardened Glass":[21491728,21491729,21491730,21491731,21491732,21491733,21491734,21491735,21491736,21491737,21491738,21491739,21491740,21491741,21491742,21491743],"Stained Hardened Glass Pane":[21495136,21495137,21495138,21495139,21495140,21495141,21495142,21495143,21495144,21495145,21495146,21495147,21495148,21495149,21495150,21495151],"Stone":[21496052],"Stone Brick Slab":[21498972,21498973,21498974],"Stone Brick Stairs":[21500248,21500249,21500250,21500251,21500252,21500253,21500254,21500255],"Stone Brick Wall":[21503744,21503745,21503746,21503747,21503748,21503749,21503750,21503751,21503752,21503753,21503754,21503755,21503756,21503757,21503758,21503759,21503773,21503808,21503809,21503810,21503811,21503812,21503813,21503814,21503815,21503816,21503817,21503818,21503819,21503820,21503821,21503822,21503823,21503824,21503825,21503826,21503827,21503828,21503829,21503830,21503831,21503832,21503833,21503834,21503835,21503836,21503837,21503838,21503839,21503840,21503841,21503842,21503843,21503844,21503845,21503846,21503847,21503848,21503849,21503850,21503851,21503852,21503853,21503854,21503855,21503856,21503857,21503858,21503859,21503860,21503861,21503862,21503863,21503864,21503865,21503866,21503867,21503868,21503869,21503870,21503871,21503872,21503873,21503874,21503875,21503876,21503877,21503878,21503879,21503880,21503881,21503882,21503883,21503884,21503885,21503886,21503887,21503901,21503936,21503937,21503938,21503939,21503940,21503941,21503942,21503943,21503944,21503945,21503946,21503947,21503948,21503949,21503950,21503951,21503952,21503953,21503954,21503955,21503956,21503957,21503958,21503959,21503960,21503961,21503962,21503963,21503964,21503965,21503966,21503967,21503968,21503969,21503970,21503971,21503972,21503973,21503974,21503975,21503976,21503977,21503978,21503979,21503980,21503981,21503982,21503983,21503984,21503985,21503986,21503987,21503988,21503989,21503990,21503991,21503992,21503993,21503994,21503995,21503996,21503997,21503998,21503999],"Stone Bricks":[21505414],"Stone Button":[21507712,21507713,21507714,21507715,21507718,21507719,21507720,21507721,21507722,21507723,21507726,21507727],"Stone Pressure Plate":[21508356,21508357],"Stone Slab":[21512017,21512018,21512019],"Stone Stairs":[21512192,21512193,21512194,21512195,21512196,21512197,21512198,21512199],"Stonecutter":[21514984,21514985,21514986,21514987],"Strontium":[20955164],"Sugarcane":[21542656,21542657,21542658,21542659,21542660,21542661,21542662,21542663,21542664,21542665,21542666,21542667,21542668,21542669,21542670,21542671],"Sulfur":[20958068],"Sunflower":[21544506,21544507],"Sweet Berry Bush":[21545764,21545765,21545766,21545767],"TNT":[21550004,21550005,21550006,21550007],"Tall Grass":[21547986],"Tantalum":[20959931],"Technetium":[20962279],"Tellurium":[20964192],"Tennessine":[20965501],"Terbium":[20968631],"Thallium":[20971328],"Thorium":[20973507],"Thulium":[20974346],"Tin":[20976139],"Tinted Glass":[21779734],"Titanium":[20978911],"Torch":[21551770,21551771,21551772,21551773,21551775],"Torchflower":[21940847],"Torchflower Crop":[21943796,21943797],"Trapped Chest":[21553240,21553241,21553242,21553243],"Tripwire":[21556976,21556977,21556978,21556979,21556980,21556981,21556982,21556983,21556984,21556985,21556986,21556987,21556988,21556989,21556990,21556991],"Tripwire Hook":[21559008,21559009,21559010,21559011,21559012,21559013,21559014,21559015,21559016,21559017,21559018,21559019,21559020,21559021,21559022,21559023],"Tuff":[21688162],"Tungsten":[20981723],"Twisting Vines":[21873664,21873665,21873666,21873667,21873668,21873669,21873670,21873671,21873672,21873673,21873674,21873675,21873676,21873677,21873678,21873679,21873680,21873681,21873688,21873689,21873690,21873691,21873692,21873693,21873694,21873695],"Underwater Torch":[21560248,21560249,21560252,21560254,21560255],"Uranium":[20982778],"Vanadium":[20984123],"Vines":[21562368,21562369,21562370,21562371,21562372,21562373,21562374,21562375,21562376,21562377,21562378,21562379,21562380,21562381,21562382,21562383],"Wall Banner":[21564672,21564673,21564674,21564675,21564676,21564677,21564678,21564679,21564680,21564681,21564682,21564683,21564684,21564685,21564686,21564687,21564688,21564689,21564690,21564691,21564692,21564693,21564694,21564695,21564696,21564697,21564698,21564699,21564700,21564701,21564702,21564703,21564704,21564705,21564706,21564707,21564708,21564709,21564710,21564711,21564712,21564713,21564714,21564715,21564716,21564717,21564718,21564719,21564720,21564721,21564722,21564723,21564724,21564725,21564726,21564727,21564728,21564729,21564730,21564731,21564732,21564733,21564734,21564735],"Wall Coral Fan":[21567296,21567300,21567301,21567302,21567303,21567304,21567308,21567309,21567310,21567311,21567312,21567316,21567317,21567318,21567319,21567320,21567324,21567325,21567326,21567327,21567328,21567332,21567333,21567334,21567335,21567336,21567340,21567341,21567342,21567343,21567344,21567348,21567349,21567350,21567351,21567352,21567356,21567357,21567358,21567359],"Warped Button":[21741552,21741553,21741556,21741557,21741558,21741559,21741560,21741561,21741564,21741565,21741566,21741567],"Warped Door":[21752672,21752673,21752674,21752675,21752676,21752677,21752678,21752679,21752680,21752681,21752682,21752683,21752684,21752685,21752686,21752687,21752688,21752689,21752690,21752691,21752692,21752693,21752694,21752695,21752696,21752697,21752698,21752699,21752700,21752701,21752702,21752703],"Warped Fence":[21709978],"Warped Fence Gate":[21759616,21759617,21759618,21759619,21759620,21759621,21759622,21759623,21759624,21759625,21759626,21759627,21759628,21759629,21759630,21759631],"Warped Hyphae":[21727976,21727977,21727980,21727981,21727982,21727983],"Warped Planks":[21703045],"Warped Pressure Plate":[21747528,21747529],"Warped Roots":[21938097],"Warped Sign":[21771312,21771313,21771314,21771315,21771316,21771317,21771318,21771319,21771320,21771321,21771322,21771323,21771324,21771325,21771326,21771327],"Warped Slab":[21715036,21715038,21715039],"Warped Stairs":[21765928,21765929,21765930,21765931,21765932,21765933,21765934,21765935],"Warped Stem":[21721496,21721497,21721500,21721501,21721502,21721503],"Warped Trapdoor":[21734544,21734545,21734546,21734547,21734548,21734549,21734550,21734551,21734552,21734553,21734554,21734555,21734556,21734557,21734558,21734559],"Warped Wall Sign":[21777200,21777201,21777202,21777203],"Warped Wart Block":[21815813],"Water":[21568608,21568609,21568610,21568611,21568612,21568613,21568614,21568615,21568616,21568617,21568618,21568619,21568620,21568621,21568622,21568623,21568624,21568625,21568626,21568627,21568628,21568629,21568630,21568631,21568632,21568633,21568634,21568635,21568636,21568637,21568638,21568639],"Water Cauldron":[21854480,21854481,21854482,21854483,21854486,21854487],"Weeping Vines":[21875072,21875073,21875074,21875075,21875076,21875077,21875078,21875079,21875080,21875081,21875082,21875083,21875084,21875085,21875086,21875087,21875088,21875089,21875090,21875091,21875092,21875093,21875094,21875095,21875102,21875103],"Weighted Pressure Plate Heavy":[21570544,21570545,21570546,21570547,21570548,21570549,21570550,21570551,21570552,21570553,21570554,21570555,21570556,21570557,21570558,21570559],"Weighted Pressure Plate Light":[21572160,21572161,21572162,21572163,21572164,21572165,21572166,21572167,21572168,21572169,21572170,21572171,21572172,21572173,21572174,21572175],"Wheat Block":[21575552,21575553,21575554,21575555,21575556,21575557,21575558,21575559],"White Tulip":[21578492],"Wither Rose":[21841807],"Wool":[21580784,21580785,21580786,21580787,21580788,21580789,21580790,21580791,21580792,21580793,21580794,21580795,21580796,21580797,21580798,21580799],"Xenon":[20987135],"Ytterbium":[20989425],"Yttrium":[20991002],"Zinc":[20995928],"Zirconium":[20996890],"ate!upd":[21097998],"reserved6":[21399796],"update!":[21096340]},"stateDataBits":11} \ No newline at end of file +{ + "ACACIA_BUTTON": 12, + "ACACIA_DOOR": 32, + "ACACIA_FENCE": 1, + "ACACIA_FENCE_GATE": 16, + "ACACIA_LEAVES": 4, + "ACACIA_LOG": 6, + "ACACIA_PLANKS": 1, + "ACACIA_PRESSURE_PLATE": 2, + "ACACIA_SAPLING": 2, + "ACACIA_SIGN": 16, + "ACACIA_SLAB": 3, + "ACACIA_STAIRS": 8, + "ACACIA_TRAPDOOR": 16, + "ACACIA_WALL_SIGN": 4, + "ACACIA_WOOD": 6, + "ACTIVATOR_RAIL": 12, + "AIR": 1, + "ALLIUM": 1, + "ALL_SIDED_MUSHROOM_STEM": 1, + "AMETHYST": 1, + "AMETHYST_CLUSTER": 24, + "ANCIENT_DEBRIS": 1, + "ANDESITE": 1, + "ANDESITE_SLAB": 3, + "ANDESITE_STAIRS": 8, + "ANDESITE_WALL": 162, + "ANVIL": 12, + "AZALEA_LEAVES": 4, + "AZURE_BLUET": 1, + "BAMBOO": 12, + "BAMBOO_SAPLING": 2, + "BANNER": 256, + "BARREL": 12, + "BARRIER": 1, + "BASALT": 3, + "BEACON": 1, + "BED": 256, + "BEDROCK": 2, + "BEETROOTS": 8, + "BELL": 16, + "BIG_DRIPLEAF_HEAD": 16, + "BIG_DRIPLEAF_STEM": 4, + "BIRCH_BUTTON": 12, + "BIRCH_DOOR": 32, + "BIRCH_FENCE": 1, + "BIRCH_FENCE_GATE": 16, + "BIRCH_LEAVES": 4, + "BIRCH_LOG": 6, + "BIRCH_PLANKS": 1, + "BIRCH_PRESSURE_PLATE": 2, + "BIRCH_SAPLING": 2, + "BIRCH_SIGN": 16, + "BIRCH_SLAB": 3, + "BIRCH_STAIRS": 8, + "BIRCH_TRAPDOOR": 16, + "BIRCH_WALL_SIGN": 4, + "BIRCH_WOOD": 6, + "BLACKSTONE": 1, + "BLACKSTONE_SLAB": 3, + "BLACKSTONE_STAIRS": 8, + "BLACKSTONE_WALL": 162, + "BLAST_FURNACE": 8, + "BLUE_ICE": 1, + "BLUE_ORCHID": 1, + "BLUE_TORCH": 5, + "BONE_BLOCK": 3, + "BOOKSHELF": 1, + "BREWING_STAND": 8, + "BRICKS": 1, + "BRICK_SLAB": 3, + "BRICK_STAIRS": 8, + "BRICK_WALL": 162, + "BROWN_MUSHROOM": 1, + "BROWN_MUSHROOM_BLOCK": 11, + "BUDDING_AMETHYST": 1, + "CACTUS": 16, + "CAKE": 7, + "CAKE_WITH_CANDLE": 2, + "CAKE_WITH_DYED_CANDLE": 32, + "CALCITE": 1, + "CANDLE": 8, + "CARPET": 16, + "CARROTS": 8, + "CARTOGRAPHY_TABLE": 1, + "CARVED_PUMPKIN": 4, + "CAULDRON": 1, + "CAVE_VINES": 104, + "CHAIN": 3, + "CHEMICAL_HEAT": 1, + "CHERRY_BUTTON": 12, + "CHERRY_DOOR": 32, + "CHERRY_FENCE": 1, + "CHERRY_FENCE_GATE": 16, + "CHERRY_LEAVES": 4, + "CHERRY_LOG": 6, + "CHERRY_PLANKS": 1, + "CHERRY_PRESSURE_PLATE": 2, + "CHERRY_SIGN": 16, + "CHERRY_SLAB": 3, + "CHERRY_STAIRS": 8, + "CHERRY_TRAPDOOR": 16, + "CHERRY_WALL_SIGN": 4, + "CHERRY_WOOD": 6, + "CHEST": 4, + "CHISELED_BOOKSHELF": 256, + "CHISELED_DEEPSLATE": 1, + "CHISELED_NETHER_BRICKS": 1, + "CHISELED_POLISHED_BLACKSTONE": 1, + "CHISELED_QUARTZ": 3, + "CHISELED_RED_SANDSTONE": 1, + "CHISELED_SANDSTONE": 1, + "CHISELED_STONE_BRICKS": 1, + "CHORUS_FLOWER": 6, + "CHORUS_PLANT": 1, + "CLAY": 1, + "COAL": 1, + "COAL_ORE": 1, + "COBBLED_DEEPSLATE": 1, + "COBBLED_DEEPSLATE_SLAB": 3, + "COBBLED_DEEPSLATE_STAIRS": 8, + "COBBLED_DEEPSLATE_WALL": 162, + "COBBLESTONE": 1, + "COBBLESTONE_SLAB": 3, + "COBBLESTONE_STAIRS": 8, + "COBBLESTONE_WALL": 162, + "COBWEB": 1, + "COCOA_POD": 12, + "COMPOUND_CREATOR": 4, + "CONCRETE": 16, + "CONCRETE_POWDER": 16, + "COPPER": 8, + "COPPER_ORE": 1, + "CORAL": 10, + "CORAL_BLOCK": 10, + "CORAL_FAN": 20, + "CORNFLOWER": 1, + "CRACKED_DEEPSLATE_BRICKS": 1, + "CRACKED_DEEPSLATE_TILES": 1, + "CRACKED_NETHER_BRICKS": 1, + "CRACKED_POLISHED_BLACKSTONE_BRICKS": 1, + "CRACKED_STONE_BRICKS": 1, + "CRAFTING_TABLE": 1, + "CRIMSON_BUTTON": 12, + "CRIMSON_DOOR": 32, + "CRIMSON_FENCE": 1, + "CRIMSON_FENCE_GATE": 16, + "CRIMSON_HYPHAE": 6, + "CRIMSON_PLANKS": 1, + "CRIMSON_PRESSURE_PLATE": 2, + "CRIMSON_ROOTS": 1, + "CRIMSON_SIGN": 16, + "CRIMSON_SLAB": 3, + "CRIMSON_STAIRS": 8, + "CRIMSON_STEM": 6, + "CRIMSON_TRAPDOOR": 16, + "CRIMSON_WALL_SIGN": 4, + "CRYING_OBSIDIAN": 1, + "CUT_COPPER": 8, + "CUT_COPPER_SLAB": 24, + "CUT_COPPER_STAIRS": 64, + "CUT_RED_SANDSTONE": 1, + "CUT_RED_SANDSTONE_SLAB": 3, + "CUT_SANDSTONE": 1, + "CUT_SANDSTONE_SLAB": 3, + "DANDELION": 1, + "DARK_OAK_BUTTON": 12, + "DARK_OAK_DOOR": 32, + "DARK_OAK_FENCE": 1, + "DARK_OAK_FENCE_GATE": 16, + "DARK_OAK_LEAVES": 4, + "DARK_OAK_LOG": 6, + "DARK_OAK_PLANKS": 1, + "DARK_OAK_PRESSURE_PLATE": 2, + "DARK_OAK_SAPLING": 2, + "DARK_OAK_SIGN": 16, + "DARK_OAK_SLAB": 3, + "DARK_OAK_STAIRS": 8, + "DARK_OAK_TRAPDOOR": 16, + "DARK_OAK_WALL_SIGN": 4, + "DARK_OAK_WOOD": 6, + "DARK_PRISMARINE": 1, + "DARK_PRISMARINE_SLAB": 3, + "DARK_PRISMARINE_STAIRS": 8, + "DAYLIGHT_SENSOR": 32, + "DEAD_BUSH": 1, + "DEEPSLATE": 3, + "DEEPSLATE_BRICKS": 1, + "DEEPSLATE_BRICK_SLAB": 3, + "DEEPSLATE_BRICK_STAIRS": 8, + "DEEPSLATE_BRICK_WALL": 162, + "DEEPSLATE_COAL_ORE": 1, + "DEEPSLATE_COPPER_ORE": 1, + "DEEPSLATE_DIAMOND_ORE": 1, + "DEEPSLATE_EMERALD_ORE": 1, + "DEEPSLATE_GOLD_ORE": 1, + "DEEPSLATE_IRON_ORE": 1, + "DEEPSLATE_LAPIS_LAZULI_ORE": 1, + "DEEPSLATE_REDSTONE_ORE": 2, + "DEEPSLATE_TILES": 1, + "DEEPSLATE_TILE_SLAB": 3, + "DEEPSLATE_TILE_STAIRS": 8, + "DEEPSLATE_TILE_WALL": 162, + "DETECTOR_RAIL": 12, + "DIAMOND": 1, + "DIAMOND_ORE": 1, + "DIORITE": 1, + "DIORITE_SLAB": 3, + "DIORITE_STAIRS": 8, + "DIORITE_WALL": 162, + "DIRT": 3, + "DOUBLE_PITCHER_CROP": 4, + "DOUBLE_TALLGRASS": 2, + "DRAGON_EGG": 1, + "DRIED_KELP": 1, + "DYED_CANDLE": 128, + "DYED_SHULKER_BOX": 16, + "ELEMENT_ACTINIUM": 1, + "ELEMENT_ALUMINUM": 1, + "ELEMENT_AMERICIUM": 1, + "ELEMENT_ANTIMONY": 1, + "ELEMENT_ARGON": 1, + "ELEMENT_ARSENIC": 1, + "ELEMENT_ASTATINE": 1, + "ELEMENT_BARIUM": 1, + "ELEMENT_BERKELIUM": 1, + "ELEMENT_BERYLLIUM": 1, + "ELEMENT_BISMUTH": 1, + "ELEMENT_BOHRIUM": 1, + "ELEMENT_BORON": 1, + "ELEMENT_BROMINE": 1, + "ELEMENT_CADMIUM": 1, + "ELEMENT_CALCIUM": 1, + "ELEMENT_CALIFORNIUM": 1, + "ELEMENT_CARBON": 1, + "ELEMENT_CERIUM": 1, + "ELEMENT_CESIUM": 1, + "ELEMENT_CHLORINE": 1, + "ELEMENT_CHROMIUM": 1, + "ELEMENT_COBALT": 1, + "ELEMENT_CONSTRUCTOR": 4, + "ELEMENT_COPERNICIUM": 1, + "ELEMENT_COPPER": 1, + "ELEMENT_CURIUM": 1, + "ELEMENT_DARMSTADTIUM": 1, + "ELEMENT_DUBNIUM": 1, + "ELEMENT_DYSPROSIUM": 1, + "ELEMENT_EINSTEINIUM": 1, + "ELEMENT_ERBIUM": 1, + "ELEMENT_EUROPIUM": 1, + "ELEMENT_FERMIUM": 1, + "ELEMENT_FLEROVIUM": 1, + "ELEMENT_FLUORINE": 1, + "ELEMENT_FRANCIUM": 1, + "ELEMENT_GADOLINIUM": 1, + "ELEMENT_GALLIUM": 1, + "ELEMENT_GERMANIUM": 1, + "ELEMENT_GOLD": 1, + "ELEMENT_HAFNIUM": 1, + "ELEMENT_HASSIUM": 1, + "ELEMENT_HELIUM": 1, + "ELEMENT_HOLMIUM": 1, + "ELEMENT_HYDROGEN": 1, + "ELEMENT_INDIUM": 1, + "ELEMENT_IODINE": 1, + "ELEMENT_IRIDIUM": 1, + "ELEMENT_IRON": 1, + "ELEMENT_KRYPTON": 1, + "ELEMENT_LANTHANUM": 1, + "ELEMENT_LAWRENCIUM": 1, + "ELEMENT_LEAD": 1, + "ELEMENT_LITHIUM": 1, + "ELEMENT_LIVERMORIUM": 1, + "ELEMENT_LUTETIUM": 1, + "ELEMENT_MAGNESIUM": 1, + "ELEMENT_MANGANESE": 1, + "ELEMENT_MEITNERIUM": 1, + "ELEMENT_MENDELEVIUM": 1, + "ELEMENT_MERCURY": 1, + "ELEMENT_MOLYBDENUM": 1, + "ELEMENT_MOSCOVIUM": 1, + "ELEMENT_NEODYMIUM": 1, + "ELEMENT_NEON": 1, + "ELEMENT_NEPTUNIUM": 1, + "ELEMENT_NICKEL": 1, + "ELEMENT_NIHONIUM": 1, + "ELEMENT_NIOBIUM": 1, + "ELEMENT_NITROGEN": 1, + "ELEMENT_NOBELIUM": 1, + "ELEMENT_OGANESSON": 1, + "ELEMENT_OSMIUM": 1, + "ELEMENT_OXYGEN": 1, + "ELEMENT_PALLADIUM": 1, + "ELEMENT_PHOSPHORUS": 1, + "ELEMENT_PLATINUM": 1, + "ELEMENT_PLUTONIUM": 1, + "ELEMENT_POLONIUM": 1, + "ELEMENT_POTASSIUM": 1, + "ELEMENT_PRASEODYMIUM": 1, + "ELEMENT_PROMETHIUM": 1, + "ELEMENT_PROTACTINIUM": 1, + "ELEMENT_RADIUM": 1, + "ELEMENT_RADON": 1, + "ELEMENT_RHENIUM": 1, + "ELEMENT_RHODIUM": 1, + "ELEMENT_ROENTGENIUM": 1, + "ELEMENT_RUBIDIUM": 1, + "ELEMENT_RUTHENIUM": 1, + "ELEMENT_RUTHERFORDIUM": 1, + "ELEMENT_SAMARIUM": 1, + "ELEMENT_SCANDIUM": 1, + "ELEMENT_SEABORGIUM": 1, + "ELEMENT_SELENIUM": 1, + "ELEMENT_SILICON": 1, + "ELEMENT_SILVER": 1, + "ELEMENT_SODIUM": 1, + "ELEMENT_STRONTIUM": 1, + "ELEMENT_SULFUR": 1, + "ELEMENT_TANTALUM": 1, + "ELEMENT_TECHNETIUM": 1, + "ELEMENT_TELLURIUM": 1, + "ELEMENT_TENNESSINE": 1, + "ELEMENT_TERBIUM": 1, + "ELEMENT_THALLIUM": 1, + "ELEMENT_THORIUM": 1, + "ELEMENT_THULIUM": 1, + "ELEMENT_TIN": 1, + "ELEMENT_TITANIUM": 1, + "ELEMENT_TUNGSTEN": 1, + "ELEMENT_URANIUM": 1, + "ELEMENT_VANADIUM": 1, + "ELEMENT_XENON": 1, + "ELEMENT_YTTERBIUM": 1, + "ELEMENT_YTTRIUM": 1, + "ELEMENT_ZERO": 1, + "ELEMENT_ZINC": 1, + "ELEMENT_ZIRCONIUM": 1, + "EMERALD": 1, + "EMERALD_ORE": 1, + "ENCHANTING_TABLE": 1, + "ENDER_CHEST": 4, + "END_PORTAL_FRAME": 8, + "END_ROD": 6, + "END_STONE": 1, + "END_STONE_BRICKS": 1, + "END_STONE_BRICK_SLAB": 3, + "END_STONE_BRICK_STAIRS": 8, + "END_STONE_BRICK_WALL": 162, + "FAKE_WOODEN_SLAB": 3, + "FARMLAND": 1304, + "FERN": 1, + "FIRE": 16, + "FLETCHING_TABLE": 1, + "FLOWERING_AZALEA_LEAVES": 4, + "FLOWER_POT": 1, + "FROGLIGHT": 9, + "FROSTED_ICE": 4, + "FURNACE": 8, + "GILDED_BLACKSTONE": 1, + "GLASS": 1, + "GLASS_PANE": 1, + "GLAZED_TERRACOTTA": 64, + "GLOWING_ITEM_FRAME": 12, + "GLOWING_OBSIDIAN": 1, + "GLOWSTONE": 1, + "GLOW_LICHEN": 64, + "GOLD": 1, + "GOLD_ORE": 1, + "GRANITE": 1, + "GRANITE_SLAB": 3, + "GRANITE_STAIRS": 8, + "GRANITE_WALL": 162, + "GRASS": 1, + "GRASS_PATH": 1, + "GRAVEL": 1, + "GREEN_TORCH": 5, + "HANGING_ROOTS": 1, + "HARDENED_CLAY": 1, + "HARDENED_GLASS": 1, + "HARDENED_GLASS_PANE": 1, + "HAY_BALE": 3, + "HONEYCOMB": 1, + "HOPPER": 10, + "ICE": 1, + "INFESTED_CHISELED_STONE_BRICK": 1, + "INFESTED_COBBLESTONE": 1, + "INFESTED_CRACKED_STONE_BRICK": 1, + "INFESTED_MOSSY_STONE_BRICK": 1, + "INFESTED_STONE": 1, + "INFESTED_STONE_BRICK": 1, + "INFO_UPDATE": 1, + "INFO_UPDATE2": 1, + "INVISIBLE_BEDROCK": 1, + "IRON": 1, + "IRON_BARS": 1, + "IRON_DOOR": 32, + "IRON_ORE": 1, + "IRON_TRAPDOOR": 16, + "ITEM_FRAME": 12, + "JUKEBOX": 1, + "JUNGLE_BUTTON": 12, + "JUNGLE_DOOR": 32, + "JUNGLE_FENCE": 1, + "JUNGLE_FENCE_GATE": 16, + "JUNGLE_LEAVES": 4, + "JUNGLE_LOG": 6, + "JUNGLE_PLANKS": 1, + "JUNGLE_PRESSURE_PLATE": 2, + "JUNGLE_SAPLING": 2, + "JUNGLE_SIGN": 16, + "JUNGLE_SLAB": 3, + "JUNGLE_STAIRS": 8, + "JUNGLE_TRAPDOOR": 16, + "JUNGLE_WALL_SIGN": 4, + "JUNGLE_WOOD": 6, + "LAB_TABLE": 4, + "LADDER": 4, + "LANTERN": 2, + "LAPIS_LAZULI": 1, + "LAPIS_LAZULI_ORE": 1, + "LARGE_FERN": 2, + "LAVA": 32, + "LAVA_CAULDRON": 6, + "LECTERN": 8, + "LEGACY_STONECUTTER": 1, + "LEVER": 16, + "LIGHT": 16, + "LIGHTNING_ROD": 6, + "LILAC": 2, + "LILY_OF_THE_VALLEY": 1, + "LILY_PAD": 1, + "LIT_PUMPKIN": 4, + "LOOM": 4, + "MAGMA": 1, + "MANGROVE_BUTTON": 12, + "MANGROVE_DOOR": 32, + "MANGROVE_FENCE": 1, + "MANGROVE_FENCE_GATE": 16, + "MANGROVE_LEAVES": 4, + "MANGROVE_LOG": 6, + "MANGROVE_PLANKS": 1, + "MANGROVE_PRESSURE_PLATE": 2, + "MANGROVE_ROOTS": 1, + "MANGROVE_SIGN": 16, + "MANGROVE_SLAB": 3, + "MANGROVE_STAIRS": 8, + "MANGROVE_TRAPDOOR": 16, + "MANGROVE_WALL_SIGN": 4, + "MANGROVE_WOOD": 6, + "MATERIAL_REDUCER": 4, + "MELON": 1, + "MELON_STEM": 40, + "MOB_HEAD": 35, + "MONSTER_SPAWNER": 1, + "MOSSY_COBBLESTONE": 1, + "MOSSY_COBBLESTONE_SLAB": 3, + "MOSSY_COBBLESTONE_STAIRS": 8, + "MOSSY_COBBLESTONE_WALL": 162, + "MOSSY_STONE_BRICKS": 1, + "MOSSY_STONE_BRICK_SLAB": 3, + "MOSSY_STONE_BRICK_STAIRS": 8, + "MOSSY_STONE_BRICK_WALL": 162, + "MUD": 1, + "MUDDY_MANGROVE_ROOTS": 3, + "MUD_BRICKS": 1, + "MUD_BRICK_SLAB": 3, + "MUD_BRICK_STAIRS": 8, + "MUD_BRICK_WALL": 162, + "MUSHROOM_STEM": 1, + "MYCELIUM": 1, + "NETHERITE": 1, + "NETHERRACK": 1, + "NETHER_BRICKS": 1, + "NETHER_BRICK_FENCE": 1, + "NETHER_BRICK_SLAB": 3, + "NETHER_BRICK_STAIRS": 8, + "NETHER_BRICK_WALL": 162, + "NETHER_GOLD_ORE": 1, + "NETHER_PORTAL": 2, + "NETHER_QUARTZ_ORE": 1, + "NETHER_REACTOR_CORE": 1, + "NETHER_WART": 4, + "NETHER_WART_BLOCK": 1, + "NOTE_BLOCK": 1, + "OAK_BUTTON": 12, + "OAK_DOOR": 32, + "OAK_FENCE": 1, + "OAK_FENCE_GATE": 16, + "OAK_LEAVES": 4, + "OAK_LOG": 6, + "OAK_PLANKS": 1, + "OAK_PRESSURE_PLATE": 2, + "OAK_SAPLING": 2, + "OAK_SIGN": 16, + "OAK_SLAB": 3, + "OAK_STAIRS": 8, + "OAK_TRAPDOOR": 16, + "OAK_WALL_SIGN": 4, + "OAK_WOOD": 6, + "OBSIDIAN": 1, + "ORANGE_TULIP": 1, + "OXEYE_DAISY": 1, + "PACKED_ICE": 1, + "PACKED_MUD": 1, + "PEONY": 2, + "PINK_PETALS": 16, + "PINK_TULIP": 1, + "PITCHER_CROP": 3, + "PITCHER_PLANT": 2, + "PODZOL": 1, + "POLISHED_ANDESITE": 1, + "POLISHED_ANDESITE_SLAB": 3, + "POLISHED_ANDESITE_STAIRS": 8, + "POLISHED_BASALT": 3, + "POLISHED_BLACKSTONE": 1, + "POLISHED_BLACKSTONE_BRICKS": 1, + "POLISHED_BLACKSTONE_BRICK_SLAB": 3, + "POLISHED_BLACKSTONE_BRICK_STAIRS": 8, + "POLISHED_BLACKSTONE_BRICK_WALL": 162, + "POLISHED_BLACKSTONE_BUTTON": 12, + "POLISHED_BLACKSTONE_PRESSURE_PLATE": 2, + "POLISHED_BLACKSTONE_SLAB": 3, + "POLISHED_BLACKSTONE_STAIRS": 8, + "POLISHED_BLACKSTONE_WALL": 162, + "POLISHED_DEEPSLATE": 1, + "POLISHED_DEEPSLATE_SLAB": 3, + "POLISHED_DEEPSLATE_STAIRS": 8, + "POLISHED_DEEPSLATE_WALL": 162, + "POLISHED_DIORITE": 1, + "POLISHED_DIORITE_SLAB": 3, + "POLISHED_DIORITE_STAIRS": 8, + "POLISHED_GRANITE": 1, + "POLISHED_GRANITE_SLAB": 3, + "POLISHED_GRANITE_STAIRS": 8, + "POPPY": 1, + "POTATOES": 8, + "POTION_CAULDRON": 6, + "POWERED_RAIL": 12, + "PRISMARINE": 1, + "PRISMARINE_BRICKS": 1, + "PRISMARINE_BRICKS_SLAB": 3, + "PRISMARINE_BRICKS_STAIRS": 8, + "PRISMARINE_SLAB": 3, + "PRISMARINE_STAIRS": 8, + "PRISMARINE_WALL": 162, + "PUMPKIN": 1, + "PUMPKIN_STEM": 40, + "PURPLE_TORCH": 5, + "PURPUR": 1, + "PURPUR_PILLAR": 3, + "PURPUR_SLAB": 3, + "PURPUR_STAIRS": 8, + "QUARTZ": 1, + "QUARTZ_BRICKS": 1, + "QUARTZ_PILLAR": 3, + "QUARTZ_SLAB": 3, + "QUARTZ_STAIRS": 8, + "RAIL": 10, + "RAW_COPPER": 1, + "RAW_GOLD": 1, + "RAW_IRON": 1, + "REDSTONE": 1, + "REDSTONE_COMPARATOR": 16, + "REDSTONE_LAMP": 2, + "REDSTONE_ORE": 2, + "REDSTONE_REPEATER": 32, + "REDSTONE_TORCH": 10, + "REDSTONE_WIRE": 16, + "RED_MUSHROOM": 1, + "RED_MUSHROOM_BLOCK": 11, + "RED_NETHER_BRICKS": 1, + "RED_NETHER_BRICK_SLAB": 3, + "RED_NETHER_BRICK_STAIRS": 8, + "RED_NETHER_BRICK_WALL": 162, + "RED_SAND": 1, + "RED_SANDSTONE": 1, + "RED_SANDSTONE_SLAB": 3, + "RED_SANDSTONE_STAIRS": 8, + "RED_SANDSTONE_WALL": 162, + "RED_TORCH": 5, + "RED_TULIP": 1, + "REINFORCED_DEEPSLATE": 1, + "RESERVED6": 1, + "ROSE_BUSH": 2, + "SAND": 1, + "SANDSTONE": 1, + "SANDSTONE_SLAB": 3, + "SANDSTONE_STAIRS": 8, + "SANDSTONE_WALL": 162, + "SCULK": 1, + "SEA_LANTERN": 1, + "SEA_PICKLE": 8, + "SHROOMLIGHT": 1, + "SHULKER_BOX": 1, + "SLIME": 1, + "SMALL_DRIPLEAF": 8, + "SMITHING_TABLE": 1, + "SMOKER": 8, + "SMOOTH_BASALT": 1, + "SMOOTH_QUARTZ": 1, + "SMOOTH_QUARTZ_SLAB": 3, + "SMOOTH_QUARTZ_STAIRS": 8, + "SMOOTH_RED_SANDSTONE": 1, + "SMOOTH_RED_SANDSTONE_SLAB": 3, + "SMOOTH_RED_SANDSTONE_STAIRS": 8, + "SMOOTH_SANDSTONE": 1, + "SMOOTH_SANDSTONE_SLAB": 3, + "SMOOTH_SANDSTONE_STAIRS": 8, + "SMOOTH_STONE": 1, + "SMOOTH_STONE_SLAB": 3, + "SNOW": 1, + "SNOW_LAYER": 8, + "SOUL_FIRE": 1, + "SOUL_LANTERN": 2, + "SOUL_SAND": 1, + "SOUL_SOIL": 1, + "SOUL_TORCH": 5, + "SPONGE": 2, + "SPORE_BLOSSOM": 1, + "SPRUCE_BUTTON": 12, + "SPRUCE_DOOR": 32, + "SPRUCE_FENCE": 1, + "SPRUCE_FENCE_GATE": 16, + "SPRUCE_LEAVES": 4, + "SPRUCE_LOG": 6, + "SPRUCE_PLANKS": 1, + "SPRUCE_PRESSURE_PLATE": 2, + "SPRUCE_SAPLING": 2, + "SPRUCE_SIGN": 16, + "SPRUCE_SLAB": 3, + "SPRUCE_STAIRS": 8, + "SPRUCE_TRAPDOOR": 16, + "SPRUCE_WALL_SIGN": 4, + "SPRUCE_WOOD": 6, + "STAINED_CLAY": 16, + "STAINED_GLASS": 16, + "STAINED_GLASS_PANE": 16, + "STAINED_HARDENED_GLASS": 16, + "STAINED_HARDENED_GLASS_PANE": 16, + "STONE": 1, + "STONECUTTER": 4, + "STONE_BRICKS": 1, + "STONE_BRICK_SLAB": 3, + "STONE_BRICK_STAIRS": 8, + "STONE_BRICK_WALL": 162, + "STONE_BUTTON": 12, + "STONE_PRESSURE_PLATE": 2, + "STONE_SLAB": 3, + "STONE_STAIRS": 8, + "SUGARCANE": 16, + "SUNFLOWER": 2, + "SWEET_BERRY_BUSH": 4, + "TALL_GRASS": 1, + "TINTED_GLASS": 1, + "TNT": 4, + "TORCH": 5, + "TORCHFLOWER": 1, + "TORCHFLOWER_CROP": 2, + "TRAPPED_CHEST": 4, + "TRIPWIRE": 16, + "TRIPWIRE_HOOK": 16, + "TUFF": 1, + "TWISTING_VINES": 26, + "UNDERWATER_TORCH": 5, + "VINES": 16, + "WALL_BANNER": 64, + "WALL_CORAL_FAN": 40, + "WARPED_BUTTON": 12, + "WARPED_DOOR": 32, + "WARPED_FENCE": 1, + "WARPED_FENCE_GATE": 16, + "WARPED_HYPHAE": 6, + "WARPED_PLANKS": 1, + "WARPED_PRESSURE_PLATE": 2, + "WARPED_ROOTS": 1, + "WARPED_SIGN": 16, + "WARPED_SLAB": 3, + "WARPED_STAIRS": 8, + "WARPED_STEM": 6, + "WARPED_TRAPDOOR": 16, + "WARPED_WALL_SIGN": 4, + "WARPED_WART_BLOCK": 1, + "WATER": 32, + "WATER_CAULDRON": 6, + "WEEPING_VINES": 26, + "WEIGHTED_PRESSURE_PLATE_HEAVY": 16, + "WEIGHTED_PRESSURE_PLATE_LIGHT": 16, + "WHEAT": 8, + "WHITE_TULIP": 1, + "WITHER_ROSE": 1, + "WOOL": 16 +} \ 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 b4b3875c68..e86f70d70e 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -21,86 +21,31 @@ declare(strict_types=1); -use pocketmine\block\Block; +use pocketmine\block\BlockTest; use pocketmine\block\RuntimeBlockStateRegistry; -use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\Utils; require dirname(__DIR__, 3) . '/vendor/autoload.php'; /* This script needs to be re-run after any intentional blockfactory change (adding or removing a block state). */ -$factory = new RuntimeBlockStateRegistry(); -$remaps = []; -$new = []; -foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $index => $block){ - if($index !== $block->getStateId()){ - throw new AssumptionFailedError("State index should always match state ID"); - } - $new[$index] = $block->getName(); -} +$newTable = BlockTest::computeConsistencyCheckTable(RuntimeBlockStateRegistry::getInstance()); $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 AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); - } - $old = []; - /** - * @var string $name - * @var int[] $stateIds - */ - foreach($oldTable["knownStates"] as $name => $stateIds){ - foreach($stateIds as $stateId){ - $old[$stateId] = $name; - } - } - $oldStateDataSize = $oldTable["stateDataBits"]; - $oldStateDataMask = ~(~0 << $oldStateDataSize); + $errors = BlockTest::computeConsistencyCheckDiff($oldTablePath, $newTable); - 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"; - } + if(count($errors) > 0){ + echo count($errors) . " changes detected:\n"; + foreach($errors as $error){ + echo $error . "\n"; } + }else{ + echo "No changes detected\n"; } }else{ echo "WARNING: Unable to calculate diff, no previous consistency check file found\n"; } -$newTable = []; -foreach($new as $stateId => $name){ - $newTable[$name][] = $stateId; -} ksort($newTable, SORT_STRING); -foreach(Utils::stringifyKeys($newTable) as $name => $stateIds){ - sort($stateIds, SORT_NUMERIC); - $newTable[$name] = $stateIds; -} -file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( - [ - "knownStates" => $newTable, - "stateDataBits" => Block::INTERNAL_STATE_DATA_BITS - ], - JSON_THROW_ON_ERROR -)); +file_put_contents($oldTablePath, json_encode($newTable, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT)); From 98380e46bf2f905f46d6c0f61ebc048793f98447 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 Apr 2024 19:22:40 +0100 Subject: [PATCH 1682/1858] Ignore non-fatal error types in crash handlers ErrorToExceptionHandler currently prevents these from appearing by turning them into exceptions, but this won't always be the case. For example, in the future we may not want to turn ALL types of E_* errors into exceptions (e.g. E_DEPRECATED). --- src/crash/CrashDump.php | 11 ++++++++++- src/thread/CommonThreadPartsTrait.php | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/crash/CrashDump.php b/src/crash/CrashDump.php index 1a558b499d..49a587c34c 100644 --- a/src/crash/CrashDump.php +++ b/src/crash/CrashDump.php @@ -63,6 +63,12 @@ use function strpos; use function substr; use function zend_version; use function zlib_encode; +use const E_COMPILE_ERROR; +use const E_CORE_ERROR; +use const E_ERROR; +use const E_PARSE; +use const E_RECOVERABLE_ERROR; +use const E_USER_ERROR; use const FILE_IGNORE_NEW_LINES; use const JSON_THROW_ON_ERROR; use const JSON_UNESCAPED_SLASHES; @@ -85,6 +91,9 @@ class CrashDump{ public const PLUGIN_INVOLVEMENT_DIRECT = "direct"; public const PLUGIN_INVOLVEMENT_INDIRECT = "indirect"; + public const FATAL_ERROR_MASK = + E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR; + private CrashDumpData $data; private string $encodedData; @@ -186,7 +195,7 @@ class CrashDump{ $error = $lastExceptionError; }else{ $error = error_get_last(); - if($error === null){ + if($error === null || ($error["type"] & self::FATAL_ERROR_MASK) === 0){ throw new \RuntimeException("Crash error information missing - did something use exit()?"); } $error["trace"] = Utils::printableTrace(Utils::currentTrace(3)); //Skipping CrashDump->baseCrash, CrashDump->construct, Server->crashDump diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index 9a14b23454..e1c9d7c6bb 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -25,6 +25,7 @@ namespace pocketmine\thread; use pmmp\thread\Thread as NativeThread; use pmmp\thread\ThreadSafeArray; +use pocketmine\crash\CrashDump; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\Server; use function error_get_last; @@ -150,7 +151,7 @@ trait CommonThreadPartsTrait{ $this->synchronized(function() : void{ if($this->isTerminated() && $this->crashInfo === null){ $last = error_get_last(); - if($last !== null){ + if($last !== null && ($last["type"] & CrashDump::FATAL_ERROR_MASK) !== 0){ //fatal error $crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); }else{ From 022362a01ad083123af788f56319c42eea806b2c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 Apr 2024 19:37:07 +0100 Subject: [PATCH 1683/1858] Update pocketmine/errorhandler to 0.7.0 --- composer.json | 2 +- composer.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 0046705265..1ef7d1aa2b 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", - "pocketmine/errorhandler": "^0.6.0", + "pocketmine/errorhandler": "^0.7.0", "pocketmine/locale-data": "~2.19.0", "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", diff --git a/composer.lock b/composer.lock index 694103b327..a3443229a1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0be8eb3203ddac7f56645de59b2a4de9", + "content-hash": "28633153e56932cbd9e1dbcd7f7e6756", "packages": [ { "name": "adhocore/json-comment", @@ -376,25 +376,25 @@ }, { "name": "pocketmine/errorhandler", - "version": "0.6.0", + "version": "0.7.0", "source": { "type": "git", "url": "https://github.com/pmmp/ErrorHandler.git", - "reference": "dae214a04348b911e8219ebf125ff1c5589cc878" + "reference": "cae94884368a74ece5294b9ff7fef18732dcd921" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/ErrorHandler/zipball/dae214a04348b911e8219ebf125ff1c5589cc878", - "reference": "dae214a04348b911e8219ebf125ff1c5589cc878", + "url": "https://api.github.com/repos/pmmp/ErrorHandler/zipball/cae94884368a74ece5294b9ff7fef18732dcd921", + "reference": "cae94884368a74ece5294b9ff7fef18732dcd921", "shasum": "" }, "require": { "php": "^8.0" }, "require-dev": { - "phpstan/phpstan": "0.12.99", - "phpstan/phpstan-strict-rules": "^0.12.2", - "phpunit/phpunit": "^9.5" + "phpstan/phpstan": "~1.10.3", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5 || ^10.0 || ^11.0" }, "type": "library", "autoload": { @@ -409,9 +409,9 @@ "description": "Utilities to handle nasty PHP E_* errors in a usable way", "support": { "issues": "https://github.com/pmmp/ErrorHandler/issues", - "source": "https://github.com/pmmp/ErrorHandler/tree/0.6.0" + "source": "https://github.com/pmmp/ErrorHandler/tree/0.7.0" }, - "time": "2022-01-08T21:05:46+00:00" + "time": "2024-04-02T18:29:54+00:00" }, { "name": "pocketmine/locale-data", From 11fbc8db6fe0dbf3cc0004954e7c1e988d83892f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 2 Apr 2024 19:40:44 +0100 Subject: [PATCH 1684/1858] Make use of pmmpthread 6.1.0 for Thread::getRunningCount() ThreadManager doesn't count these correctly anymore since pmmpthread since thread-safe statics aren't copied anymore. --- composer.json | 2 +- composer.lock | 4 ++-- src/utils/Process.php | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 1ef7d1aa2b..da6536ff64 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.7", + "ext-pmmpthread": "^6.1.0", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/composer.lock b/composer.lock index a3443229a1..5e44bd6863 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "28633153e56932cbd9e1dbcd7f7e6756", + "content-hash": "05f535c2b562b59c11b6ac535b5f1c99", "packages": [ { "name": "adhocore/json-comment", @@ -2953,7 +2953,7 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-phar": "*", - "ext-pmmpthread": "^6.0.7", + "ext-pmmpthread": "^6.1.0", "ext-reflection": "*", "ext-simplexml": "*", "ext-sockets": "*", diff --git a/src/utils/Process.php b/src/utils/Process.php index c57b96d4a0..2e9b46ace5 100644 --- a/src/utils/Process.php +++ b/src/utils/Process.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\utils; +use pocketmine\thread\Thread; use pocketmine\thread\ThreadManager; use function count; use function exec; @@ -122,7 +123,7 @@ final class Process{ //TODO: more OS - return count(ThreadManager::getInstance()->getAll()) + 2; //MainLogger + Main Thread + return Thread::getRunningCount() + 1; //pmmpthread doesn't count the main thread } /** From c4abac46062ead9514064ba10ef7f8e0cdf9251d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:03:46 +0100 Subject: [PATCH 1685/1858] Bump build/php from `6f619bf` to `f9601e5` (#6321) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `6f619bf` to `f9601e5`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/6f619bf7a0b00e72a7c90915eec6e5a28866aa55...f9601e5313db18a27fed74f734747156625b9081) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 6f619bf7a0..f9601e5313 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 6f619bf7a0b00e72a7c90915eec6e5a28866aa55 +Subproject commit f9601e5313db18a27fed74f734747156625b9081 From f013079ff66d3c8610d5ced0f5a5be34fbf56c63 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 Apr 2024 15:31:37 +0100 Subject: [PATCH 1686/1858] Fixed MainLogger BC break --- src/PocketMine.php | 2 +- src/utils/MainLogger.php | 2 +- src/utils/MainLoggerThread.php | 23 ++++++++++++----------- tests/phpunit/scheduler/AsyncPoolTest.php | 3 +-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index f0fba9dcbc..84054a2dee 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -327,7 +327,7 @@ JIT_WARNING } $logFile = isset($opts[BootstrapOptions::NO_LOG_FILE]) ? null : Path::join($dataPath, "server.log"); - $logger = new MainLogger($logFile, Path::join($dataPath, "log_archive"), Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get())); + $logger = new MainLogger($logFile, Terminal::hasFormattingCodes(), "Server", new \DateTimeZone(Timezone::get()), false, Path::join($dataPath, "log_archive")); if($logFile === null){ $logger->notice("Logging to file disabled. Ensure logs are collected by other means (e.g. Docker logs)."); } diff --git a/src/utils/MainLogger.php b/src/utils/MainLogger.php index da2ba73da1..2eaee78831 100644 --- a/src/utils/MainLogger.php +++ b/src/utils/MainLogger.php @@ -44,7 +44,7 @@ class MainLogger extends AttachableThreadSafeLogger implements \BufferedLogger{ /** * @throws \RuntimeException */ - public function __construct(?string $logFile, string $logArchiveDir, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false){ + public function __construct(?string $logFile, bool $useFormattingCodes, string $mainThreadName, \DateTimeZone $timezone, bool $logDebug = false, ?string $logArchiveDir = null){ parent::__construct(); $this->logDebug = $logDebug; diff --git a/src/utils/MainLoggerThread.php b/src/utils/MainLoggerThread.php index e7acf97376..990644f65c 100644 --- a/src/utils/MainLoggerThread.php +++ b/src/utils/MainLoggerThread.php @@ -52,12 +52,12 @@ final class MainLoggerThread extends Thread{ public function __construct( private string $logFile, - private string $archiveDir, + private ?string $archiveDir, private readonly int $maxFileSize = 32 * 1024 * 1024 //32 MB ){ $this->buffer = new ThreadSafeArray(); touch($this->logFile); - if(!@mkdir($this->archiveDir) && !is_dir($this->archiveDir)){ + if($this->archiveDir !== null && !@mkdir($this->archiveDir) && !is_dir($this->archiveDir)){ throw new \RuntimeException("Unable to create archive directory: " . ( is_file($this->archiveDir) ? "it already exists and is not a directory" : "permission denied")); } @@ -108,7 +108,7 @@ final class MainLoggerThread extends Thread{ * @param resource $logResource * @return resource */ - private function archiveLogFile($logResource, int &$size){ + private function archiveLogFile($logResource, int &$size, string $archiveDir){ fclose($logResource); clearstatcache(); @@ -125,7 +125,7 @@ final class MainLoggerThread extends Thread{ }while(file_exists($out)); //the user may have externally deleted the whole directory - make sure it exists before we do anything - @mkdir($this->archiveDir); + @mkdir($archiveDir); rename($this->logFile, $out); $logResource = $this->openLogFile($this->logFile, $size); @@ -141,12 +141,12 @@ final class MainLoggerThread extends Thread{ /** * @param resource $logResource */ - private function writeLogStream(&$logResource, int &$size) : void{ + private function writeLogStream(&$logResource, int &$size, ?string $archiveDir) : void{ while(($chunk = $this->buffer->shift()) !== null){ fwrite($logResource, $chunk); $size += strlen($chunk); - if($this->logFileReadyToArchive($size)){ - $logResource = $this->archiveLogFile($logResource, $size); + if($archiveDir !== null && $this->logFileReadyToArchive($size)){ + $logResource = $this->archiveLogFile($logResource, $size, $archiveDir); } } @@ -161,12 +161,13 @@ final class MainLoggerThread extends Thread{ public function run() : void{ $size = 0; $logResource = $this->openLogFile($this->logFile, $size); - if($this->logFileReadyToArchive($size)){ - $logResource = $this->archiveLogFile($logResource, $size); + $archiveDir = $this->archiveDir; + if($archiveDir !== null && $this->logFileReadyToArchive($size)){ + $logResource = $this->archiveLogFile($logResource, $size, $archiveDir); } while(!$this->shutdown){ - $this->writeLogStream($logResource, $size); + $this->writeLogStream($logResource, $size, $archiveDir); $this->synchronized(function() : void{ if(!$this->shutdown && !$this->syncFlush){ $this->wait(); @@ -174,7 +175,7 @@ final class MainLoggerThread extends Thread{ }); } - $this->writeLogStream($logResource, $size); + $this->writeLogStream($logResource, $size, $archiveDir); fclose($logResource); } diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index d7bacd391a..479cfee441 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -44,13 +44,12 @@ class AsyncPoolTest extends TestCase{ public function setUp() : void{ @define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php'); - $this->mainLogger = new MainLogger(null, sys_get_temp_dir(), false, "Main", new \DateTimeZone('UTC')); + $this->mainLogger = new MainLogger(null, false, "Main", new \DateTimeZone('UTC')); $this->pool = new AsyncPool(2, 1024, new ThreadSafeClassLoader(), $this->mainLogger, new SleeperHandler()); } public function tearDown() : void{ $this->pool->shutdown(); - $this->mainLogger->shutdownLogWriterThread(); } public function testTaskLeak() : void{ From cd6634d34b861adb7ffea781bdeb18068befe524 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:37:13 +0100 Subject: [PATCH 1687/1858] Bump shivammathur/setup-php from 2.30.0 to 2.30.2 (#6315) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.30.0 to 2.30.2. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.30.0...2.30.2) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 2fbfa11f2c..3f48248ec4 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.0 + uses: shivammathur/setup-php@2.30.2 with: php-version: 8.2 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 4521988a92..7f55ca028e 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.30.0 + uses: shivammathur/setup-php@2.30.2 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3dbcd6ddd5..fe097d2914 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.0 + uses: shivammathur/setup-php@2.30.2 with: php-version: 8.2 tools: php-cs-fixer:3.49 From e30e27dd57e30db0fd77a99b59c05f283207eedd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 Apr 2024 15:43:43 +0100 Subject: [PATCH 1688/1858] Fix CS --- src/utils/Process.php | 1 - tests/phpunit/scheduler/AsyncPoolTest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/utils/Process.php b/src/utils/Process.php index 2e9b46ace5..1370ab27c7 100644 --- a/src/utils/Process.php +++ b/src/utils/Process.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\utils; use pocketmine\thread\Thread; -use pocketmine\thread\ThreadManager; use function count; use function exec; use function fclose; diff --git a/tests/phpunit/scheduler/AsyncPoolTest.php b/tests/phpunit/scheduler/AsyncPoolTest.php index 479cfee441..53ec15c12b 100644 --- a/tests/phpunit/scheduler/AsyncPoolTest.php +++ b/tests/phpunit/scheduler/AsyncPoolTest.php @@ -32,7 +32,6 @@ use pocketmine\utils\MainLogger; use function define; use function dirname; use function microtime; -use function sys_get_temp_dir; use function usleep; class AsyncPoolTest extends TestCase{ From 16f29c775e3aec1edbbd8e72c773ba3a62a7e96e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 17:13:38 +0100 Subject: [PATCH 1689/1858] tools/generate-blockstate-upgrade-schema: added support for generating newFlattenedName with value transforms as seen in pmmp/BedrockBlockUpgradeSchema@ebd768e5b202cae59b0a7057982e3a2f40ba1954, this enables use of newFlattenedName in more places (by allowing the flattened values to be transformed before building the new ID), as well as reducing the number of remappedStates in general by compacting stuff which was partially transformed like color silver -> light_gray. --- .../BlockStateUpgradeSchemaFlattenedName.php | 17 ++- .../upgrade/BlockStateUpgradeSchemaUtils.php | 6 +- .../block/upgrade/BlockStateUpgrader.php | 3 +- ...ckStateUpgradeSchemaModelFlattenedName.php | 27 +++- tools/generate-blockstate-upgrade-schema.php | 132 ++++++++++++++---- 5 files changed, 149 insertions(+), 36 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php index d9cbc780e9..1c95dd9c7f 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php @@ -23,17 +23,28 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; +use function ksort; +use const SORT_STRING; + final class BlockStateUpgradeSchemaFlattenedName{ + /** + * @param string[] $flattenedValueRemaps + * @phpstan-param array $flattenedValueRemaps + */ public function __construct( public string $prefix, public string $flattenedProperty, - public string $suffix - ){} + public string $suffix, + public array $flattenedValueRemaps + ){ + ksort($this->flattenedValueRemaps, SORT_STRING); + } public function equals(self $that) : bool{ return $this->prefix === $that->prefix && $this->flattenedProperty === $that->flattenedProperty && - $this->suffix === $that->suffix; + $this->suffix === $that->suffix && + $this->flattenedValueRemaps === $that->flattenedValueRemaps; } } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 9c63d51f03..832631490a 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -166,7 +166,8 @@ final class BlockStateUpgradeSchemaUtils{ $remap->newName ?? new BlockStateUpgradeSchemaFlattenedName( $remap->newFlattenedName->prefix, $remap->newFlattenedName->flattenedProperty, - $remap->newFlattenedName->suffix + $remap->newFlattenedName->suffix, + $remap->newFlattenedName->flattenedValueRemaps ?? [], ), array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState ?? []), $remap->copiedState ?? [] @@ -301,7 +302,8 @@ final class BlockStateUpgradeSchemaUtils{ new BlockStateUpgradeSchemaModelFlattenedName( $remap->newName->prefix, $remap->newName->flattenedProperty, - $remap->newName->suffix + $remap->newName->suffix, + $remap->newName->flattenedValueRemaps ), array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), $remap->copiedState diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index f4a5b6e93e..4a305d8bc3 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -142,7 +142,8 @@ final class BlockStateUpgrader{ }else{ $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; if($flattenedValue instanceof StringTag){ - $newName = sprintf("%s%s%s", $remap->newName->prefix, $flattenedValue->getValue(), $remap->newName->suffix); + $embedValue = $remap->newName->flattenedValueRemaps[$flattenedValue->getValue()] ?? $flattenedValue->getValue(); + $newName = sprintf("%s%s%s", $remap->newName->prefix, $embedValue, $remap->newName->suffix); unset($oldState[$remap->newName->flattenedProperty]); }else{ //flattened property is not a TAG_String, so this transformation is not applicable diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php index 4508d9a3be..001192f478 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade\model; -final class BlockStateUpgradeSchemaModelFlattenedName{ +use function count; + +final class BlockStateUpgradeSchemaModelFlattenedName implements \JsonSerializable{ /** @required */ public string $prefix; @@ -31,10 +33,31 @@ final class BlockStateUpgradeSchemaModelFlattenedName{ public string $flattenedProperty; /** @required */ public string $suffix; + /** + * @var string[] + * @phpstan-var array + */ + public array $flattenedValueRemaps; - public function __construct(string $prefix, string $flattenedProperty, string $suffix){ + /** + * @param string[] $flattenedValueRemaps + * @phpstan-param array $flattenedValueRemaps + */ + public function __construct(string $prefix, string $flattenedProperty, string $suffix, array $flattenedValueRemaps){ $this->prefix = $prefix; $this->flattenedProperty = $flattenedProperty; $this->suffix = $suffix; + $this->flattenedValueRemaps = $flattenedValueRemaps; + } + + /** + * @return mixed[] + */ + public function jsonSerialize() : array{ + $result = (array) $this; + if(count($this->flattenedValueRemaps) === 0){ + unset($result["flattenedValueRemaps"]); + } + return $result; } } diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index dfb8f6066b..54984d4591 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -38,18 +38,23 @@ use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use function array_key_first; +use function array_key_last; use function array_keys; use function array_map; use function array_shift; use function array_values; use function count; use function dirname; -use function explode; use function file_put_contents; use function fwrite; use function implode; use function json_encode; use function ksort; +use function min; +use function sort; +use function strlen; +use function strrev; +use function substr; use function usort; use const JSON_PRETTY_PRINT; use const SORT_STRING; @@ -275,6 +280,77 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra return true; } +/** + * @param string[] $strings + */ +function findCommonPrefix(array $strings) : string{ + sort($strings, SORT_STRING); + + $first = $strings[array_key_first($strings)]; + $last = $strings[array_key_last($strings)]; + + $maxLength = min(strlen($first), strlen($last)); + for($i = 0; $i < $maxLength; ++$i){ + if($first[$i] !== $last[$i]){ + return substr($first, 0, $i); + } + } + + return substr($first, 0, $maxLength); +} + +/** + * @param string[] $strings + */ +function findCommonSuffix(array $strings) : string{ + $reversed = array_map(strrev(...), $strings); + + return strrev(findCommonPrefix($reversed)); +} + +/** + * @param string[][][] $candidateFlattenedValues + * @phpstan-param array>> $candidateFlattenedValues + * + * @return BlockStateUpgradeSchemaFlattenedName[][] + * @phpstan-return array> + */ +function buildFlattenPropertyRules(array $candidateFlattenedValues) : array{ + $flattenPropertyRules = []; + foreach(Utils::stringifyKeys($candidateFlattenedValues) as $propertyName => $filters){ + foreach(Utils::stringifyKeys($filters) as $filter => $valueToId){ + $ids = array_values($valueToId); + + //TODO: this is a bit too enthusiastic. For example, when flattening the old "stone", it will see that + //"granite", "andesite", "stone" etc all have "e" as a common suffix, which works, but looks a bit daft. + //This also causes more remaps to be generated than necessary, since some of the values are already + //contained in the new ID. + $idPrefix = findCommonPrefix($ids); + $idSuffix = findCommonSuffix($ids); + if(strlen($idSuffix) < 2){ + $idSuffix = ""; + } + + $valueMap = []; + foreach(Utils::stringifyKeys($valueToId) as $value => $newId){ + $newValue = substr($newId, strlen($idPrefix), $idSuffix !== "" ? -strlen($idSuffix) : null); + if($newValue !== $value){ + $valueMap[$value] = $newValue; + } + } + + $flattenPropertyRules[$propertyName][$filter] = new BlockStateUpgradeSchemaFlattenedName( + $idPrefix, + $propertyName, + $idSuffix, + $valueMap + ); + } + } + ksort($flattenPropertyRules, SORT_STRING); + return $flattenPropertyRules; +} + /** * Attempts to compress a list of remapped states by looking at which state properties were consistently unchanged. * This significantly reduces the output size during flattening when the flattened block has many permutations @@ -327,9 +403,9 @@ function processRemappedStates(array $upgradeTable) : array{ $unchangedStatesByNewName[$newName] = $unchangedStates; } - $flattenedProperties = []; $notFlattenedProperties = []; - $notFlattenedPropertyValues = []; + + $candidateFlattenedValues = []; foreach($upgradeTable as $pair){ foreach(Utils::stringifyKeys($pair->old->getStates()) as $propertyName => $propertyValue){ if(isset($notFlattenedProperties[$propertyName])){ @@ -344,37 +420,41 @@ function processRemappedStates(array $upgradeTable) : array{ $notFlattenedProperties[$propertyName] = true; continue; } - $parts = explode($rawValue, $pair->new->getName(), 2); - if(count($parts) !== 2){ - //the new name does not contain the property value, but it may still be able to be flattened in other cases - $notFlattenedPropertyValues[$propertyName][$rawValue] = $rawValue; - continue; - } - [$prefix, $suffix] = $parts; $filter = $pair->old->getStates(); foreach($unchangedStatesByNewName[$pair->new->getName()] as $unchangedPropertyName){ unset($filter[$unchangedPropertyName]); } unset($filter[$propertyName]); + $rawFilter = encodeOrderedProperties($filter); - $flattenRule = new BlockStateUpgradeSchemaFlattenedName( - prefix: $prefix, - flattenedProperty: $propertyName, - suffix: $suffix - ); - if(!isset($flattenedProperties[$propertyName][$rawFilter])){ - $flattenedProperties[$propertyName][$rawFilter] = $flattenRule; - }elseif(!$flattenRule->equals($flattenedProperties[$propertyName][$rawFilter])){ - $notFlattenedProperties[$propertyName] = true; + if(isset($candidateFlattenedValues[$propertyName][$rawFilter])){ + $valuesToIds = $candidateFlattenedValues[$propertyName][$rawFilter]; + $existingNewId = $valuesToIds[$rawValue] ?? null; + if($existingNewId !== null && $existingNewId !== $pair->new->getName()){ + //this old value is associated with multiple new IDs - bad candidate for flattening + $notFlattenedProperties[$propertyName] = true; + continue; + } + foreach(Utils::stringifyKeys($valuesToIds) as $otherRawValue => $otherNewId){ + if($otherRawValue === $rawValue){ + continue; + } + if($otherNewId === $pair->new->getName()){ + //this old value maps to the same new ID as another old value - bad candidate for flattening + $notFlattenedProperties[$propertyName] = true; + continue 2; + } + } } + $candidateFlattenedValues[$propertyName][$rawFilter][$rawValue] = $pair->new->getName(); } } foreach(Utils::stringifyKeys($notFlattenedProperties) as $propertyName => $_){ - unset($flattenedProperties[$propertyName]); + unset($candidateFlattenedValues[$propertyName]); } - ksort($flattenedProperties, SORT_STRING); + $flattenedProperties = buildFlattenPropertyRules($candidateFlattenedValues); $flattenProperty = array_key_first($flattenedProperties); $list = []; @@ -393,19 +473,15 @@ function processRemappedStates(array $upgradeTable) : array{ } ksort($cleanedOldState); ksort($cleanedNewState); - $flattened = false; if($flattenProperty !== null){ $flattenedValue = $cleanedOldState[$flattenProperty] ?? null; if(!$flattenedValue instanceof StringTag){ - throw new AssumptionFailedError("This should always be a TAG_String"); - } - if(!isset($notFlattenedPropertyValues[$flattenProperty][$flattenedValue->getValue()])){ - unset($cleanedOldState[$flattenProperty]); - $flattened = true; + throw new AssumptionFailedError("This should always be a TAG_String ($newName $flattenProperty)"); } + unset($cleanedOldState[$flattenProperty]); } $rawOldState = encodeOrderedProperties($cleanedOldState); - $newNameRule = $flattenProperty !== null && $flattened ? + $newNameRule = $flattenProperty !== null ? $flattenedProperties[$flattenProperty][$rawOldState] ?? throw new AssumptionFailedError("This should always be set") : $newName; From b9288c238b46b830976bd362c17f799af937fcdd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 17:29:16 +0100 Subject: [PATCH 1690/1858] Update BedrockBlockUpgradeSchema --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index da6536ff64..47648d5b93 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~3.6.0+bedrock-1.20.70", + "pocketmine/bedrock-block-upgrade-schema": "~4.0.0+bedrock-1.20.70", "pocketmine/bedrock-data": "~2.9.0+bedrock-1.20.70", "pocketmine/bedrock-item-upgrade-schema": "~1.8.0+bedrock-1.20.70", "pocketmine/bedrock-protocol": "~29.0.0+bedrock-1.20.70", diff --git a/composer.lock b/composer.lock index 5e44bd6863..fe11fbacf3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "05f535c2b562b59c11b6ac535b5f1c99", + "content-hash": "40f8971303dc2060ae4e28e6fc84bdfc", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "3.6.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "1496e275db5148cb96bdaa998115e5e31a5c1e4d" + "reference": "ebd768e5b202cae59b0a7057982e3a2f40ba1954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/1496e275db5148cb96bdaa998115e5e31a5c1e4d", - "reference": "1496e275db5148cb96bdaa998115e5e31a5c1e4d", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ebd768e5b202cae59b0a7057982e3a2f40ba1954", + "reference": "ebd768e5b202cae59b0a7057982e3a2f40ba1954", "shasum": "" }, "type": "library", @@ -142,9 +142,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/3.6.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.0.0" }, - "time": "2024-02-28T19:25:25+00:00" + "time": "2024-04-05T16:02:20+00:00" }, { "name": "pocketmine/bedrock-data", From 769a1490579cda768afb052efedf711bab666ec0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 18:16:19 +0100 Subject: [PATCH 1691/1858] Release 5.14.0 --- changelogs/5.14.md | 88 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +-- 2 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.14.md diff --git a/changelogs/5.14.md b/changelogs/5.14.md new file mode 100644 index 0000000000..632245aeec --- /dev/null +++ b/changelogs/5.14.md @@ -0,0 +1,88 @@ +# 5.14.0 +Released 5th April 2024. + +**For Minecraft: Bedrock Edition 1.20.70** + +This is a minor feature release, including performance improvements, minor gameplay features, new API features, and various internal improvements. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for a `--no-log-file` command-line option, which disables the creation of a `server.log` file. + - **Use this with caution.** If you don't have another mechanism for collecting logs (e.g. Docker), this may make debugging harder. +- Added support for automatic `server.log` rotation. When the `server.log` exceeds 32 MB, it will be renamed and moved to the `log_archive` folder in the server's data directory. + - Files in the `log_archive` folder can be safely modified or deleted without stopping the server. + - We suggest a cron job or similar to manage old log files (e.g. deleting or compressing them). +- Added a new cache mechanism for `PocketMine-MP.phar`. This has several advantages: + - Caches are now reused by all threads - this significantly reduces `/tmp` usage (previously every thread generated its own cache, wasting lots of space) + - Dead cache files are automatically cleaned up by new servers - this means that a server crash loop won't flood `/tmp` anymore +- `/status` now reports a more accurate number of threads on Windows. +- Large resource packs are now able to be properly downloaded from the server. +- Larger player skin sizes are now accepted by the server. +- Improved logging from world providers to reduce spam when chunks contain invalid data. +- Added more error logging for Anvil, PMAnvil and MCRegion worlds. +- PHP deprecation warnings no longer cause the server to crash. This should make it easier for server owners to update to newer PHP versions. + +## Performance +- Improved world loading performance. This was achieved through a combination of changes: + - Improvements to `BlockStateUpgrader` to avoid unnecessary work + - Improvements to `BlockStateUpgradeSchema` to clean up stupid code + - Improvements to `BlockStateReader` unused state handling + - Optimizations to `RegistryTrait` (see below) +- Improved performance of `RegistryTrait::__callStatic()` accessor by introducing a fast-path optimization. Ensure that you access registries with the correct function name case to benefit from this. + - This improves the performance of `VanillaBlocks::WHATEVER()`, `VanillaItems`, etc. + +## Tools +- `tools/generate-blockstate-upgrade-schema.php` now supports generating schemas using `flattenedValueRemaps` (described in [BlockStateUpgradeSchema](https://github.com/pmmp/BedrockBlockUpgradeSchema/releases/tag/4.0.0)). + +## Gameplay +- Added sounds for armour equipping and unequipping. +- Added sound for picking berries from a sweet berry bush. + +## API +### `pocketmine\block\utils` +- The following enum cases have been added: + - `BannerPatternType::GLOBE` + - `BannerPatternType::PIGLIN` + +### `pocketmine\event\player` +- The following classes have been added: + - `PlayerResourcePackOfferEvent` - called before the server tells a connecting client which resource packs are available to download - allows customizing the pack list and other options + +### `pocketmine\item` +- The following API methods have been added: + - `public ArmorMaterial->getEquipSound() : ?\pocketmine\world\Sound` - returns the sound to play when this armour is equipped or unequipped +- The following API methods have signature changes: + - `ArmorMaterial->__construct()` now accepts an optional `?Sound $equipSound` parameter + +### `pocketmine\utils` +- The following API methods have signature changes: + - `MainLogger->__construct()` now accepts `null` for the `$logFile` parameter - this disables the creation of a logger thread and log file + - `MainLogger->__construct()` now accepts an optional `?string $logArchiveDir` parameter. If set, this enables log archiving in the specified directory when the current log file exceeds 32 MB. + +## Dependencies +- Now uses [`pocketmine/bedrock-block-upgrade-schema` version 4.0.0](https://github.com/pmmp/BedrockBlockUpgradeSchema/releases/tag/4.0.0). +- Now uses [`pmmp/ext-pmmpthread` version 6.1.0](https://github.com/pmmp/ext-pmmpthread/releases/tag/6.1.0). +- Now uses [`pocketmine/errorhandler` version 0.7.0](https://github.com/pmmp/ErrorHandler/releases/tag/0.7.0). +- Now uses [`pocketmine/raklib` version 1.1.0](https://github.com/pmmp/RakLib/releases/tag/1.1.0). +- Now uses [`pocketmine/raklib-ipc` version 1.0.0](https://github.com/pmmp/RakLibIpc/releases/tag/1.0.0). + +## Internals +- (Re)Added support for RakLib packet ACK receipts. This was used to throttle resource pack sending and prevent network overloading. + - Added `NetworkSession->sendDataPacketWithReceipt()` to make use of this feature. + - `PacketSender` now requires an additional `?int $receiptId` parameter. +- `ResourcePackPacketHandler` now uses `sendDataPacketWithReceipt()` to send resource packs, and delays sending the next chunk until the current one is acknowledged. +- `ResourcePackPacketHandler` now accepts resource pack info directly in the constructor, instead of `ResourcePackManager`. This eases the implementation of `PlayerResourcePackOfferEvent`. +- Increased `ZlibCompressor::DEFAULT_MAX_DECOMPRESSION_SIZE` to 8 MB (previously 2 MB). While this weakens server security, it appears to be necessary to deal with extremely bloated Persona skins. +- Increased max split packet parts accepted by `RakLib` to 512 (previously 128). Again, this is necessary to deal with extremely bloated Persona skins. +- Added a new cache mechanism for `PocketMine-MP.phar`. + - `ext-phar`'s default mechanism is extremely wasteful (generating a separate cache file per thread), and doesn't clean up after itself. + - The new cache mechanism is shared between all threads, and automatically cleans up stale caches. + - The phar stub (`build/server-phar-stub.php`) now converts the phar contents into a `.tar`, and decompresses all the files into `$TMPDIR/PocketMine-MP-phar-cache./`. + - `phar://` URIs still work with this system, but `new Phar(__FILE__)` must be replaced by `new PharData(__FILE__)` within PocketMine-MP core code. + - Backtraces from a `phar`'d server will now point to a location in the extracted phar cache, rather than the phar itself. +- `block_factory_consistency_check` test (actually for `RuntimeBlockStateRegistry`) now stores less data, and is no longer affected by changes to internal state ID construction. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 420b12e580..0b9cc364d6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.13.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.14.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 1ad190024a611e7f0edc444f0cb973580d2b5444 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 18:16:22 +0100 Subject: [PATCH 1692/1858] 5.14.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0b9cc364d6..5a0d0f0b7d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.14.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.14.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 68f8fa8cafb9804477d72df6e3ffedd4c3e56ace Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 18:40:43 +0100 Subject: [PATCH 1693/1858] Update pmmpthread required version --- src/PocketMine.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index 84054a2dee..b2e1cd0469 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -124,8 +124,8 @@ namespace pocketmine { } if(($pmmpthread_version = phpversion("pmmpthread")) !== false){ - if(version_compare($pmmpthread_version, "6.0.7") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ - $messages[] = "pmmpthread ^6.0.7 is required, while you have $pmmpthread_version."; + if(version_compare($pmmpthread_version, "6.1.0") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ + $messages[] = "pmmpthread ^6.1.0 is required, while you have $pmmpthread_version."; } } From 3590d84d035621373d2340cab50eff66e7a508ab Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 18:41:27 +0100 Subject: [PATCH 1694/1858] Release 5.14.1 --- changelogs/5.14.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/5.14.md b/changelogs/5.14.md index 632245aeec..7b9b003f69 100644 --- a/changelogs/5.14.md +++ b/changelogs/5.14.md @@ -86,3 +86,9 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - `phar://` URIs still work with this system, but `new Phar(__FILE__)` must be replaced by `new PharData(__FILE__)` within PocketMine-MP core code. - Backtraces from a `phar`'d server will now point to a location in the extracted phar cache, rather than the phar itself. - `block_factory_consistency_check` test (actually for `RuntimeBlockStateRegistry`) now stores less data, and is no longer affected by changes to internal state ID construction. + +# 5.14.1 +Released 5th April 2024. + +## Fixes +- Fixed incorrect `pmmpthread` version check in server bootstrap. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5a0d0f0b7d..9f2b8e6797 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.14.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 55cf24aa02ae0f46cc5741ea0964cdeaaa318c15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 5 Apr 2024 18:41:27 +0100 Subject: [PATCH 1695/1858] 5.14.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9f2b8e6797..d1a67ffeaa 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.14.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.14.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 37322e0d508c48beabbb56b0c5289b86c7fed227 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 Apr 2024 14:05:24 +0100 Subject: [PATCH 1696/1858] Armor: only make sound when the item was equipped by player action this ensures the greatest amount of consistency with vanilla. in order to prevent the sounds being broadcasted on armor damage with the old method, we'd also have to sacrifice the sound when replacing one leather helmet with another, for example. this approach minimizes the gameplay impact at the possible expense of plugins. closes #6325 --- src/entity/Living.php | 18 ------------------ src/item/Armor.php | 4 ++++ 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index e695ba425f..e7d669fda7 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -149,24 +149,6 @@ abstract class Living extends Entity{ $this->getViewers(), fn(EntityEventBroadcaster $broadcaster, array $recipients) => $broadcaster->onMobArmorChange($recipients, $this) ))); - $playArmorSound = function(Item $newItem, Item $oldItem) : void{ - if(!$newItem->isNull() && $newItem instanceof Armor && !$newItem->equalsExact($oldItem)){ - $equipSound = $newItem->getMaterial()->getEquipSound(); - if($equipSound !== null){ - $this->broadcastSound($equipSound); - } - } - }; - $this->armorInventory->getListeners()->add(new CallbackInventoryListener( - function(Inventory $inventory, int $slot, Item $oldItem) use ($playArmorSound) : void{ - $playArmorSound($inventory->getItem($slot), $oldItem); - }, - function(Inventory $inventory, array $oldContents) use ($playArmorSound) : void{ - foreach($oldContents as $slot => $oldItem){ - $playArmorSound($inventory->getItem($slot), $oldItem); - } - } - )); $health = $this->getMaxHealth(); diff --git a/src/item/Armor.php b/src/item/Armor.php index e9667a8a89..417c57f75c 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -146,6 +146,10 @@ class Armor extends Durable{ $new = $thisCopy->pop(); $player->getArmorInventory()->setItem($this->getArmorSlot(), $new); $player->getInventory()->setItemInHand($existing); + $sound = $new->getMaterial()->getEquipSound(); + if($sound !== null){ + $player->broadcastSound($sound); + } if(!$thisCopy->isNull()){ //if the stack size was bigger than 1 (usually won't happen, but might be caused by plugins) $returnedItems[] = $thisCopy; From d3c9c137ad18963898f65c9d739337f4f60cd380 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:24:11 +0100 Subject: [PATCH 1697/1858] Bump symfony/filesystem from 6.4.3 to 6.4.6 (#6327) Bumps [symfony/filesystem](https://github.com/symfony/filesystem) from 6.4.3 to 6.4.6. - [Release notes](https://github.com/symfony/filesystem/releases) - [Changelog](https://github.com/symfony/filesystem/blob/7.0/CHANGELOG.md) - [Commits](https://github.com/symfony/filesystem/compare/v6.4.3...v6.4.6) --- updated-dependencies: - dependency-name: symfony/filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index fe11fbacf3..986a84c958 100644 --- a/composer.lock +++ b/composer.lock @@ -921,16 +921,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/9919b5509ada52cc7f66f9a35c86a4a29955c9d3", + "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3", "shasum": "" }, "require": { @@ -964,7 +964,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.6" }, "funding": [ { @@ -980,7 +980,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-03-21T19:36:20+00:00" }, { "name": "symfony/polyfill-ctype", From fa87602661f2b0c113d0d3fef69337a7fb2b087b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:24:48 +0100 Subject: [PATCH 1698/1858] Bump build/php from `f9601e5` to `084822a` (#6323) Bumps [build/php](https://github.com/pmmp/php-build-scripts) from `f9601e5` to `084822a`. - [Release notes](https://github.com/pmmp/php-build-scripts/releases) - [Commits](https://github.com/pmmp/php-build-scripts/compare/f9601e5313db18a27fed74f734747156625b9081...084822aa9e381ca05591e902a2613fe971dff3fd) --- updated-dependencies: - dependency-name: build/php dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index f9601e5313..084822aa9e 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit f9601e5313db18a27fed74f734747156625b9081 +Subproject commit 084822aa9e381ca05591e902a2613fe971dff3fd From 50e2c469a547a16a23b2dc691e70a51d34e29395 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:24:59 +0100 Subject: [PATCH 1699/1858] Bump phpstan/phpstan-strict-rules from 1.5.2 to 1.5.3 (#6326) Bumps [phpstan/phpstan-strict-rules](https://github.com/phpstan/phpstan-strict-rules) from 1.5.2 to 1.5.3. - [Release notes](https://github.com/phpstan/phpstan-strict-rules/releases) - [Commits](https://github.com/phpstan/phpstan-strict-rules/compare/1.5.2...1.5.3) --- updated-dependencies: - dependency-name: phpstan/phpstan-strict-rules dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 986a84c958..73ee195818 100644 --- a/composer.lock +++ b/composer.lock @@ -1494,21 +1494,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542" + "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/7a50e9662ee9f3942e4aaaf3d603653f60282542", - "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/568210bd301f94a0d4b1e5a0808c374c1b9cf11b", + "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.34" + "phpstan/phpstan": "^1.10.60" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -1537,9 +1537,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.2" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.3" }, - "time": "2023-10-30T14:35:06+00:00" + "time": "2024-04-06T07:43:25+00:00" }, { "name": "phpunit/php-code-coverage", From 6077748caa81fb3b60c84ba8cd201e991d7e24d3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 Apr 2024 11:31:41 +0100 Subject: [PATCH 1700/1858] Changes for 1.20.80 --- composer.json | 8 +-- composer.lock | 50 ++++++------- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 2 - .../bedrock/block/BlockStateStringValues.php | 19 ----- src/data/bedrock/block/BlockTypeNames.php | 32 +++++++-- .../convert/BlockObjectToStateSerializer.php | 71 +++++++++++-------- .../convert/BlockStateDeserializerHelper.php | 8 ++- .../convert/BlockStateSerializerHelper.php | 11 +-- .../BlockStateToObjectDeserializer.php | 70 +++++++++--------- src/data/bedrock/item/ItemTypeNames.php | 13 ++++ src/network/mcpe/cache/CraftingDataCache.php | 3 +- .../handler/ResourcePacksPacketHandler.php | 2 +- src/world/format/io/data/BedrockWorldData.php | 6 +- tools/generate-bedrock-data-from-packets.php | 8 ++- 15 files changed, 173 insertions(+), 134 deletions(-) diff --git a/composer.json b/composer.json index 47648d5b93..451b0c1e6a 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.0.0+bedrock-1.20.70", - "pocketmine/bedrock-data": "~2.9.0+bedrock-1.20.70", - "pocketmine/bedrock-item-upgrade-schema": "~1.8.0+bedrock-1.20.70", - "pocketmine/bedrock-protocol": "~29.0.0+bedrock-1.20.70", + "pocketmine/bedrock-block-upgrade-schema": "~4.1.0+bedrock-1.20.80", + "pocketmine/bedrock-data": "~2.10.0+bedrock-1.20.80", + "pocketmine/bedrock-item-upgrade-schema": "~1.9.0+bedrock-1.20.80", + "pocketmine/bedrock-protocol": "~30.0.0+bedrock-1.20.80", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 73ee195818..b27a8e840d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "40f8971303dc2060ae4e28e6fc84bdfc", + "content-hash": "7cddeede03046e04932d117c76898baf", "packages": [ { "name": "adhocore/json-comment", @@ -122,16 +122,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.0.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "ebd768e5b202cae59b0a7057982e3a2f40ba1954" + "reference": "d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/ebd768e5b202cae59b0a7057982e3a2f40ba1954", - "reference": "ebd768e5b202cae59b0a7057982e3a2f40ba1954", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb", + "reference": "d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb", "shasum": "" }, "type": "library", @@ -142,22 +142,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.0.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.1.0" }, - "time": "2024-04-05T16:02:20+00:00" + "time": "2024-04-05T17:28:14+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.9.0+bedrock-1.20.70", + "version": "2.10.0+bedrock-1.20.80", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "10b6696b662fd80a282eff7dca6c99d321c5b9e3" + "reference": "d7d709fec3848f56ca77f5ff0e5d4741b59f9d69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/10b6696b662fd80a282eff7dca6c99d321c5b9e3", - "reference": "10b6696b662fd80a282eff7dca6c99d321c5b9e3", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d7d709fec3848f56ca77f5ff0e5d4741b59f9d69", + "reference": "d7d709fec3848f56ca77f5ff0e5d4741b59f9d69", "shasum": "" }, "type": "library", @@ -168,22 +168,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.70" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.80" }, - "time": "2024-03-13T13:55:05+00:00" + "time": "2024-04-25T10:08:23+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.8.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "4c4dc3bbceb944c5de429b6e752ab7a15652078c" + "reference": "24a89457c17c271b5378b195931e720873865a79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/4c4dc3bbceb944c5de429b6e752ab7a15652078c", - "reference": "4c4dc3bbceb944c5de429b6e752ab7a15652078c", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/24a89457c17c271b5378b195931e720873865a79", + "reference": "24a89457c17c271b5378b195931e720873865a79", "shasum": "" }, "type": "library", @@ -194,22 +194,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.8.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.9.0" }, - "time": "2024-02-28T19:25:53+00:00" + "time": "2024-04-05T18:46:07+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "29.0.0+bedrock-1.20.70", + "version": "30.0.0+bedrock-1.20.80", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "8d63f39bb2cded3d3e578fd3cf7bc769b9674857" + "reference": "dc7606a9f778eeeeccfae393bd58e0b62ec6f85a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/8d63f39bb2cded3d3e578fd3cf7bc769b9674857", - "reference": "8d63f39bb2cded3d3e578fd3cf7bc769b9674857", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/dc7606a9f778eeeeccfae393bd58e0b62ec6f85a", + "reference": "dc7606a9f778eeeeccfae393bd58e0b62ec6f85a", "shasum": "" }, "require": { @@ -240,9 +240,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/29.0.0+bedrock-1.20.70" + "source": "https://github.com/pmmp/BedrockProtocol/tree/30.0.0+bedrock-1.20.80" }, - "time": "2024-03-13T14:35:54+00:00" + "time": "2024-04-05T17:53:35+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index ea8e9f5b8a..21f2bc53cd 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -42,8 +42,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (20 << 16) | //minor - (70 << 8) | //patch - (4); //revision + (80 << 8) | //patch + (3); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 72b237ddf9..b996acf04e 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -81,7 +81,6 @@ final class BlockStateNames{ public const EXTINGUISHED = "extinguished"; public const FACING_DIRECTION = "facing_direction"; public const FILL_LEVEL = "fill_level"; - public const FLOWER_TYPE = "flower_type"; public const GROUND_SIGN_DIRECTION = "ground_sign_direction"; public const GROWING_PLANT_AGE = "growing_plant_age"; public const GROWTH = "growth"; @@ -124,7 +123,6 @@ final class BlockStateNames{ public const ROTATION = "rotation"; public const SAND_STONE_TYPE = "sand_stone_type"; public const SAND_TYPE = "sand_type"; - public const SAPLING_TYPE = "sapling_type"; public const SCULK_SENSOR_PHASE = "sculk_sensor_phase"; public const SEA_GRASS_TYPE = "sea_grass_type"; public const SPONGE_TYPE = "sponge_type"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 202bfa34de..2b45c47387 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -93,18 +93,6 @@ final class BlockStateStringValues{ public const DRIPSTONE_THICKNESS_MIDDLE = "middle"; public const DRIPSTONE_THICKNESS_TIP = "tip"; - public const FLOWER_TYPE_ALLIUM = "allium"; - public const FLOWER_TYPE_CORNFLOWER = "cornflower"; - public const FLOWER_TYPE_HOUSTONIA = "houstonia"; - public const FLOWER_TYPE_LILY_OF_THE_VALLEY = "lily_of_the_valley"; - public const FLOWER_TYPE_ORCHID = "orchid"; - public const FLOWER_TYPE_OXEYE = "oxeye"; - public const FLOWER_TYPE_POPPY = "poppy"; - public const FLOWER_TYPE_TULIP_ORANGE = "tulip_orange"; - public const FLOWER_TYPE_TULIP_PINK = "tulip_pink"; - public const FLOWER_TYPE_TULIP_RED = "tulip_red"; - public const FLOWER_TYPE_TULIP_WHITE = "tulip_white"; - public const LEVER_DIRECTION_DOWN_EAST_WEST = "down_east_west"; public const LEVER_DIRECTION_DOWN_NORTH_SOUTH = "down_north_south"; public const LEVER_DIRECTION_EAST = "east"; @@ -176,13 +164,6 @@ final class BlockStateStringValues{ public const SAND_TYPE_NORMAL = "normal"; public const SAND_TYPE_RED = "red"; - public const SAPLING_TYPE_ACACIA = "acacia"; - public const SAPLING_TYPE_BIRCH = "birch"; - public const SAPLING_TYPE_DARK_OAK = "dark_oak"; - public const SAPLING_TYPE_JUNGLE = "jungle"; - public const SAPLING_TYPE_OAK = "oak"; - public const SAPLING_TYPE_SPRUCE = "spruce"; - public const SEA_GRASS_TYPE_DEFAULT = "default"; public const SEA_GRASS_TYPE_DOUBLE_BOT = "double_bot"; public const SEA_GRASS_TYPE_DOUBLE_TOP = "double_top"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 614394f04c..9dc0961d2d 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -41,6 +41,7 @@ final class BlockTypeNames{ public const ACACIA_LOG = "minecraft:acacia_log"; public const ACACIA_PLANKS = "minecraft:acacia_planks"; public const ACACIA_PRESSURE_PLATE = "minecraft:acacia_pressure_plate"; + public const ACACIA_SAPLING = "minecraft:acacia_sapling"; public const ACACIA_SLAB = "minecraft:acacia_slab"; public const ACACIA_STAIRS = "minecraft:acacia_stairs"; public const ACACIA_STANDING_SIGN = "minecraft:acacia_standing_sign"; @@ -49,6 +50,7 @@ final class BlockTypeNames{ public const ACACIA_WOOD = "minecraft:acacia_wood"; public const ACTIVATOR_RAIL = "minecraft:activator_rail"; public const AIR = "minecraft:air"; + public const ALLIUM = "minecraft:allium"; public const ALLOW = "minecraft:allow"; public const AMETHYST_BLOCK = "minecraft:amethyst_block"; public const AMETHYST_CLUSTER = "minecraft:amethyst_cluster"; @@ -59,6 +61,7 @@ final class BlockTypeNames{ public const AZALEA = "minecraft:azalea"; public const AZALEA_LEAVES = "minecraft:azalea_leaves"; public const AZALEA_LEAVES_FLOWERED = "minecraft:azalea_leaves_flowered"; + public const AZURE_BLUET = "minecraft:azure_bluet"; public const BAMBOO = "minecraft:bamboo"; public const BAMBOO_BLOCK = "minecraft:bamboo_block"; public const BAMBOO_BUTTON = "minecraft:bamboo_button"; @@ -100,6 +103,7 @@ final class BlockTypeNames{ public const BIRCH_LOG = "minecraft:birch_log"; public const BIRCH_PLANKS = "minecraft:birch_planks"; public const BIRCH_PRESSURE_PLATE = "minecraft:birch_pressure_plate"; + public const BIRCH_SAPLING = "minecraft:birch_sapling"; public const BIRCH_SLAB = "minecraft:birch_slab"; public const BIRCH_STAIRS = "minecraft:birch_stairs"; public const BIRCH_STANDING_SIGN = "minecraft:birch_standing_sign"; @@ -130,6 +134,7 @@ final class BlockTypeNames{ public const BLUE_CONCRETE_POWDER = "minecraft:blue_concrete_powder"; public const BLUE_GLAZED_TERRACOTTA = "minecraft:blue_glazed_terracotta"; public const BLUE_ICE = "minecraft:blue_ice"; + public const BLUE_ORCHID = "minecraft:blue_orchid"; public const BLUE_SHULKER_BOX = "minecraft:blue_shulker_box"; public const BLUE_STAINED_GLASS = "minecraft:blue_stained_glass"; public const BLUE_STAINED_GLASS_PANE = "minecraft:blue_stained_glass_pane"; @@ -139,6 +144,7 @@ final class BlockTypeNames{ public const BOOKSHELF = "minecraft:bookshelf"; public const BORDER_BLOCK = "minecraft:border_block"; public const BRAIN_CORAL = "minecraft:brain_coral"; + public const BRAIN_CORAL_FAN = "minecraft:brain_coral_fan"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK_BLOCK = "minecraft:brick_block"; public const BRICK_STAIRS = "minecraft:brick_stairs"; @@ -157,6 +163,7 @@ final class BlockTypeNames{ public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; public const BUBBLE_CORAL = "minecraft:bubble_coral"; + public const BUBBLE_CORAL_FAN = "minecraft:bubble_coral_fan"; public const BUDDING_AMETHYST = "minecraft:budding_amethyst"; public const CACTUS = "minecraft:cactus"; public const CAKE = "minecraft:cake"; @@ -228,11 +235,10 @@ final class BlockTypeNames{ public const COPPER_ORE = "minecraft:copper_ore"; public const COPPER_TRAPDOOR = "minecraft:copper_trapdoor"; public const CORAL_BLOCK = "minecraft:coral_block"; - public const CORAL_FAN = "minecraft:coral_fan"; - public const CORAL_FAN_DEAD = "minecraft:coral_fan_dead"; public const CORAL_FAN_HANG = "minecraft:coral_fan_hang"; public const CORAL_FAN_HANG2 = "minecraft:coral_fan_hang2"; public const CORAL_FAN_HANG3 = "minecraft:coral_fan_hang3"; + public const CORNFLOWER = "minecraft:cornflower"; public const CRACKED_DEEPSLATE_BRICKS = "minecraft:cracked_deepslate_bricks"; public const CRACKED_DEEPSLATE_TILES = "minecraft:cracked_deepslate_tiles"; public const CRACKED_NETHER_BRICKS = "minecraft:cracked_nether_bricks"; @@ -282,6 +288,7 @@ final class BlockTypeNames{ public const DARK_OAK_LOG = "minecraft:dark_oak_log"; public const DARK_OAK_PLANKS = "minecraft:dark_oak_planks"; public const DARK_OAK_PRESSURE_PLATE = "minecraft:dark_oak_pressure_plate"; + public const DARK_OAK_SAPLING = "minecraft:dark_oak_sapling"; public const DARK_OAK_SLAB = "minecraft:dark_oak_slab"; public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; @@ -292,10 +299,15 @@ final class BlockTypeNames{ public const DAYLIGHT_DETECTOR = "minecraft:daylight_detector"; public const DAYLIGHT_DETECTOR_INVERTED = "minecraft:daylight_detector_inverted"; public const DEAD_BRAIN_CORAL = "minecraft:dead_brain_coral"; + public const DEAD_BRAIN_CORAL_FAN = "minecraft:dead_brain_coral_fan"; public const DEAD_BUBBLE_CORAL = "minecraft:dead_bubble_coral"; + public const DEAD_BUBBLE_CORAL_FAN = "minecraft:dead_bubble_coral_fan"; public const DEAD_FIRE_CORAL = "minecraft:dead_fire_coral"; + public const DEAD_FIRE_CORAL_FAN = "minecraft:dead_fire_coral_fan"; public const DEAD_HORN_CORAL = "minecraft:dead_horn_coral"; + public const DEAD_HORN_CORAL_FAN = "minecraft:dead_horn_coral_fan"; public const DEAD_TUBE_CORAL = "minecraft:dead_tube_coral"; + public const DEAD_TUBE_CORAL_FAN = "minecraft:dead_tube_coral_fan"; public const DEADBUSH = "minecraft:deadbush"; public const DECORATED_POT = "minecraft:decorated_pot"; public const DEEPSLATE = "minecraft:deepslate"; @@ -480,6 +492,7 @@ final class BlockTypeNames{ public const FENCE_GATE = "minecraft:fence_gate"; public const FIRE = "minecraft:fire"; public const FIRE_CORAL = "minecraft:fire_coral"; + public const FIRE_CORAL_FAN = "minecraft:fire_coral_fan"; public const FLETCHING_TABLE = "minecraft:fletching_table"; public const FLOWER_POT = "minecraft:flower_pot"; public const FLOWERING_AZALEA = "minecraft:flowering_azalea"; @@ -564,11 +577,13 @@ final class BlockTypeNames{ public const HARD_YELLOW_STAINED_GLASS_PANE = "minecraft:hard_yellow_stained_glass_pane"; public const HARDENED_CLAY = "minecraft:hardened_clay"; public const HAY_BLOCK = "minecraft:hay_block"; + public const HEAVY_CORE = "minecraft:heavy_core"; public const HEAVY_WEIGHTED_PRESSURE_PLATE = "minecraft:heavy_weighted_pressure_plate"; public const HONEY_BLOCK = "minecraft:honey_block"; public const HONEYCOMB_BLOCK = "minecraft:honeycomb_block"; public const HOPPER = "minecraft:hopper"; public const HORN_CORAL = "minecraft:horn_coral"; + public const HORN_CORAL_FAN = "minecraft:horn_coral_fan"; public const ICE = "minecraft:ice"; public const INFESTED_DEEPSLATE = "minecraft:infested_deepslate"; public const INFO_UPDATE = "minecraft:info_update"; @@ -591,6 +606,7 @@ final class BlockTypeNames{ public const JUNGLE_LOG = "minecraft:jungle_log"; public const JUNGLE_PLANKS = "minecraft:jungle_planks"; public const JUNGLE_PRESSURE_PLATE = "minecraft:jungle_pressure_plate"; + public const JUNGLE_SAPLING = "minecraft:jungle_sapling"; public const JUNGLE_SLAB = "minecraft:jungle_slab"; public const JUNGLE_STAIRS = "minecraft:jungle_stairs"; public const JUNGLE_STANDING_SIGN = "minecraft:jungle_standing_sign"; @@ -630,6 +646,7 @@ final class BlockTypeNames{ public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; + public const LILY_OF_THE_VALLEY = "minecraft:lily_of_the_valley"; public const LIME_CANDLE = "minecraft:lime_candle"; public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; public const LIME_CARPET = "minecraft:lime_carpet"; @@ -717,6 +734,7 @@ final class BlockTypeNames{ public const OAK_LEAVES = "minecraft:oak_leaves"; public const OAK_LOG = "minecraft:oak_log"; public const OAK_PLANKS = "minecraft:oak_planks"; + public const OAK_SAPLING = "minecraft:oak_sapling"; public const OAK_SLAB = "minecraft:oak_slab"; public const OAK_STAIRS = "minecraft:oak_stairs"; public const OAK_WOOD = "minecraft:oak_wood"; @@ -733,7 +751,9 @@ final class BlockTypeNames{ public const ORANGE_STAINED_GLASS = "minecraft:orange_stained_glass"; public const ORANGE_STAINED_GLASS_PANE = "minecraft:orange_stained_glass_pane"; public const ORANGE_TERRACOTTA = "minecraft:orange_terracotta"; + public const ORANGE_TULIP = "minecraft:orange_tulip"; public const ORANGE_WOOL = "minecraft:orange_wool"; + public const OXEYE_DAISY = "minecraft:oxeye_daisy"; public const OXIDIZED_CHISELED_COPPER = "minecraft:oxidized_chiseled_copper"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; public const OXIDIZED_COPPER_BULB = "minecraft:oxidized_copper_bulb"; @@ -758,6 +778,7 @@ final class BlockTypeNames{ public const PINK_STAINED_GLASS = "minecraft:pink_stained_glass"; public const PINK_STAINED_GLASS_PANE = "minecraft:pink_stained_glass_pane"; public const PINK_TERRACOTTA = "minecraft:pink_terracotta"; + public const PINK_TULIP = "minecraft:pink_tulip"; public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; @@ -794,6 +815,7 @@ final class BlockTypeNames{ public const POLISHED_TUFF_SLAB = "minecraft:polished_tuff_slab"; public const POLISHED_TUFF_STAIRS = "minecraft:polished_tuff_stairs"; public const POLISHED_TUFF_WALL = "minecraft:polished_tuff_wall"; + public const POPPY = "minecraft:poppy"; public const PORTAL = "minecraft:portal"; public const POTATOES = "minecraft:potatoes"; public const POWDER_SNOW = "minecraft:powder_snow"; @@ -830,7 +852,6 @@ final class BlockTypeNames{ public const RED_CARPET = "minecraft:red_carpet"; public const RED_CONCRETE = "minecraft:red_concrete"; public const RED_CONCRETE_POWDER = "minecraft:red_concrete_powder"; - public const RED_FLOWER = "minecraft:red_flower"; public const RED_GLAZED_TERRACOTTA = "minecraft:red_glazed_terracotta"; public const RED_MUSHROOM = "minecraft:red_mushroom"; public const RED_MUSHROOM_BLOCK = "minecraft:red_mushroom_block"; @@ -842,6 +863,7 @@ final class BlockTypeNames{ public const RED_STAINED_GLASS = "minecraft:red_stained_glass"; public const RED_STAINED_GLASS_PANE = "minecraft:red_stained_glass_pane"; public const RED_TERRACOTTA = "minecraft:red_terracotta"; + public const RED_TULIP = "minecraft:red_tulip"; public const RED_WOOL = "minecraft:red_wool"; public const REDSTONE_BLOCK = "minecraft:redstone_block"; public const REDSTONE_LAMP = "minecraft:redstone_lamp"; @@ -856,7 +878,6 @@ final class BlockTypeNames{ public const SAND = "minecraft:sand"; public const SANDSTONE = "minecraft:sandstone"; public const SANDSTONE_STAIRS = "minecraft:sandstone_stairs"; - public const SAPLING = "minecraft:sapling"; public const SCAFFOLDING = "minecraft:scaffolding"; public const SCULK = "minecraft:sculk"; public const SCULK_CATALYST = "minecraft:sculk_catalyst"; @@ -900,6 +921,7 @@ final class BlockTypeNames{ public const SPRUCE_LOG = "minecraft:spruce_log"; public const SPRUCE_PLANKS = "minecraft:spruce_planks"; public const SPRUCE_PRESSURE_PLATE = "minecraft:spruce_pressure_plate"; + public const SPRUCE_SAPLING = "minecraft:spruce_sapling"; public const SPRUCE_SLAB = "minecraft:spruce_slab"; public const SPRUCE_STAIRS = "minecraft:spruce_stairs"; public const SPRUCE_STANDING_SIGN = "minecraft:spruce_standing_sign"; @@ -961,6 +983,7 @@ final class BlockTypeNames{ public const TRIP_WIRE = "minecraft:trip_wire"; public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; public const TUBE_CORAL = "minecraft:tube_coral"; + public const TUBE_CORAL_FAN = "minecraft:tube_coral_fan"; public const TUFF = "minecraft:tuff"; public const TUFF_BRICK_DOUBLE_SLAB = "minecraft:tuff_brick_double_slab"; public const TUFF_BRICK_SLAB = "minecraft:tuff_brick_slab"; @@ -1068,6 +1091,7 @@ final class BlockTypeNames{ public const WHITE_STAINED_GLASS = "minecraft:white_stained_glass"; public const WHITE_STAINED_GLASS_PANE = "minecraft:white_stained_glass_pane"; public const WHITE_TERRACOTTA = "minecraft:white_terracotta"; + public const WHITE_TULIP = "minecraft:white_tulip"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; public const WOODEN_BUTTON = "minecraft:wooden_button"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 453fd75fd4..e0c570ee4b 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -204,6 +204,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->registerCauldronSerializers(); $this->registerFlatWoodBlockSerializers(); $this->registerLeavesSerializers(); + $this->registerSaplingSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); } @@ -537,6 +538,20 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL, } )); + + $this->map(Blocks::CORAL_FAN(), fn(FloorCoralFan $block) => Writer::create( + match($block->getCoralType()){ + CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL_FAN : Ids::BRAIN_CORAL_FAN, + CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL_FAN : Ids::BUBBLE_CORAL_FAN, + CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL_FAN : Ids::FIRE_CORAL_FAN, + CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL_FAN : Ids::HORN_CORAL_FAN, + CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_FAN : Ids::TUBE_CORAL_FAN, + }) + ->writeInt(StateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ + Axis::X => 0, + Axis::Z => 1, + default => throw new BlockStateSerializeException("Invalid axis {$axis}"), + })); } private function registerCauldronSerializers() : void{ @@ -726,6 +741,19 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SPRUCE_LEAVES(), fn(Leaves $block) => Helper::encodeLeaves($block, new Writer(Ids::SPRUCE_LEAVES))); } + private function registerSaplingSerializers() : void{ + foreach([ + Ids::ACACIA_SAPLING => Blocks::ACACIA_SAPLING(), + Ids::BIRCH_SAPLING => Blocks::BIRCH_SAPLING(), + Ids::DARK_OAK_SAPLING => Blocks::DARK_OAK_SAPLING(), + Ids::JUNGLE_SAPLING => Blocks::JUNGLE_SAPLING(), + Ids::OAK_SAPLING => Blocks::OAK_SAPLING(), + Ids::SPRUCE_SAPLING => Blocks::SPRUCE_SAPLING(), + ] as $id => $block){ + $this->map($block, fn(Sapling $block) => Helper::encodeSapling($block, new Writer($id))); + } + } + private function registerSimpleSerializers() : void{ $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); @@ -984,16 +1012,26 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); $this->mapSimple(Blocks::WARPED_ROOTS(), Ids::WARPED_ROOTS); $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); + + $this->mapSimple(Blocks::ALLIUM(), Ids::ALLIUM); + $this->mapSimple(Blocks::CORNFLOWER(), Ids::CORNFLOWER); + $this->mapSimple(Blocks::AZURE_BLUET(), Ids::AZURE_BLUET); + $this->mapSimple(Blocks::LILY_OF_THE_VALLEY(), Ids::LILY_OF_THE_VALLEY); + $this->mapSimple(Blocks::BLUE_ORCHID(), Ids::BLUE_ORCHID); + $this->mapSimple(Blocks::OXEYE_DAISY(), Ids::OXEYE_DAISY); + $this->mapSimple(Blocks::POPPY(), Ids::POPPY); + $this->mapSimple(Blocks::ORANGE_TULIP(), Ids::ORANGE_TULIP); + $this->mapSimple(Blocks::PINK_TULIP(), Ids::PINK_TULIP); + $this->mapSimple(Blocks::RED_TULIP(), Ids::RED_TULIP); + $this->mapSimple(Blocks::WHITE_TULIP(), Ids::WHITE_TULIP); } private function registerSerializers() : void{ - $this->map(Blocks::ACACIA_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_ACACIA)); $this->map(Blocks::ACTIVATOR_RAIL(), function(ActivatorRail $block) : Writer{ return Writer::create(Ids::ACTIVATOR_RAIL) ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::ALLIUM(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ALLIUM)); $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); $this->map(Blocks::AMETHYST_CLUSTER(), fn(AmethystCluster $block) => Writer::create( @@ -1019,7 +1057,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), }); }); - $this->map(Blocks::AZURE_BLUET(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_HOUSTONIA)); $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ return Writer::create(Ids::BAMBOO) ->writeBool(StateNames::AGE_BIT, $block->isReady()) @@ -1033,10 +1070,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::BAMBOO_SAPLING(), function(BambooSapling $block) : Writer{ return Writer::create(Ids::BAMBOO_SAPLING) - ->writeBool(StateNames::AGE_BIT, $block->isReady()) - - //TODO: bug in MCPE - ->writeString(StateNames::SAPLING_TYPE, StringValues::SAPLING_TYPE_OAK); + ->writeBool(StateNames::AGE_BIT, $block->isReady()); }); $this->map(Blocks::BANNER(), function(FloorBanner $block) : Writer{ return Writer::create(Ids::STANDING_BANNER) @@ -1086,12 +1120,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::BIG_DRIPLEAF_TILT, StringValues::BIG_DRIPLEAF_TILT_NONE) ->writeBool(StateNames::BIG_DRIPLEAF_HEAD, false); }); - $this->map(Blocks::BIRCH_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_BIRCH)); $this->mapSlab(Blocks::BLACKSTONE_SLAB(), Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); $this->map(Blocks::BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::BLACKSTONE_WALL))); $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); - $this->map(Blocks::BLUE_ORCHID(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_ORCHID)); $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ return Writer::create(Ids::BONE_BLOCK) @@ -1248,22 +1280,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::DEAD_BIT, $block->isDead()) ->writeCoralType($block->getCoralType()); }); - $this->map(Blocks::CORAL_FAN(), function(FloorCoralFan $block) : Writer{ - return Writer::create($block->isDead() ? Ids::CORAL_FAN_DEAD : Ids::CORAL_FAN) - ->writeCoralType($block->getCoralType()) - ->writeInt(StateNames::CORAL_FAN_DIRECTION, match($axis = $block->getAxis()){ - Axis::X => 0, - Axis::Z => 1, - default => throw new BlockStateSerializeException("Invalid axis {$axis}"), - }); - }); - $this->map(Blocks::CORNFLOWER(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_CORNFLOWER)); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); - $this->map(Blocks::DARK_OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_DARK_OAK)); $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); @@ -1383,7 +1404,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::FRAME)); - $this->map(Blocks::JUNGLE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_JUNGLE)); $this->map(Blocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::LADDER(), function(Ladder $block) : Writer{ return Writer::create(Ids::LADDER) @@ -1423,7 +1443,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeFacingDirection($block->getFacing()); }); $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); - $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeCardinalHorizontalFacing($block->getFacing()); @@ -1467,16 +1486,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::NETHER_WART) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(Blocks::OAK_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_OAK)); - $this->map(Blocks::ORANGE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_ORANGE)); - $this->map(Blocks::OXEYE_DAISY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_OXEYE)); $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::PINK_PETALS(), function(PinkPetals $block) : Writer{ return Writer::create(Ids::PINK_PETALS) ->writeCardinalHorizontalFacing($block->getFacing()) ->writeInt(StateNames::GROWTH, $block->getCount() - 1); }); - $this->map(Blocks::PINK_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_PINK)); $this->map(Blocks::PITCHER_PLANT(), function(DoublePlant $block) : Writer{ return Writer::create(Ids::PITCHER_PLANT) ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); @@ -1512,7 +1527,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); $this->mapStairs(Blocks::POLISHED_GRANITE_STAIRS(), Ids::POLISHED_GRANITE_STAIRS); - $this->map(Blocks::POPPY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_POPPY)); $this->map(Blocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); $this->map(Blocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ return Writer::create(Ids::GOLDEN_RAIL) @@ -1586,7 +1600,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::RED_SANDSTONE_STAIRS(), Ids::RED_SANDSTONE_STAIRS); $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); - $this->map(Blocks::RED_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_RED)); $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); @@ -1636,7 +1649,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SPONGE) ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); }); - $this->map(Blocks::SPRUCE_SAPLING(), fn(Sapling $block) => Helper::encodeSapling($block, StringValues::SAPLING_TYPE_SPRUCE)); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); @@ -1729,6 +1741,5 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); $this->map(Blocks::WHEAT(), fn(Wheat $block) => Helper::encodeCrops($block, new Writer(Ids::WHEAT))); - $this->map(Blocks::WHITE_TULIP(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_TULIP_WHITE)); } } diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 68bf14a7e3..de0964a20c 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -41,6 +41,7 @@ use pocketmine\block\Liquid; use pocketmine\block\RedMushroomBlock; use pocketmine\block\RedstoneComparator; use pocketmine\block\RedstoneRepeater; +use pocketmine\block\Sapling; use pocketmine\block\SimplePressurePlate; use pocketmine\block\Slab; use pocketmine\block\Stair; @@ -149,7 +150,6 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeFloorCoralFan(FloorCoralFan $block, BlockStateReader $in) : FloorCoralFan{ return $block - ->setCoralType($in->readCoralType()) ->setAxis(match($in->readBoundedInt(BlockStateNames::CORAL_FAN_DIRECTION, 0, 1)){ 0 => Axis::X, 1 => Axis::Z, @@ -220,6 +220,12 @@ final class BlockStateDeserializerHelper{ ->setDelay($in->readBoundedInt(BlockStateNames::REPEATER_DELAY, 0, 3) + 1); } + /** @throws BlockStateDeserializeException */ + public static function decodeSapling(Sapling $block, BlockStateReader $in) : Sapling{ + return $block + ->setReady($in->readBool(BlockStateNames::AGE_BIT)); + } + /** @throws BlockStateDeserializeException */ public static function decodeSimplePressurePlate(SimplePressurePlate $block, BlockStateReader $in) : SimplePressurePlate{ //TODO: not sure what the deal is here ... seems like a mojang bug / artifact of bad implementation? diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 68bb227cce..a7d5ea774e 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -167,18 +167,13 @@ final class BlockStateSerializerHelper{ ->writePillarAxis($axis); //this isn't needed for all types, but we have to write it anyway } - public static function encodeRedFlower(string $type) : Writer{ - return Writer::create(Ids::RED_FLOWER)->writeString(BlockStateNames::FLOWER_TYPE, $type); - } - public static function encodeSandstone(string $id, string $type) : Writer{ return Writer::create($id)->writeString(BlockStateNames::SAND_STONE_TYPE, $type); } - public static function encodeSapling(Sapling $block, string $type) : Writer{ - return Writer::create(Ids::SAPLING) - ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()) - ->writeString(BlockStateNames::SAPLING_TYPE, $type); + public static function encodeSapling(Sapling $block, Writer $out) : Writer{ + return $out + ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()); } public static function encodeSimplePressurePlate(SimplePressurePlate $block, Writer $out) : Writer{ diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index b82eeb14c6..7220c0f8b9 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -83,6 +83,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->registerCauldronDeserializers(); $this->registerFlatWoodBlockDeserializers(); $this->registerLeavesDeserializers(); + $this->registerSaplingDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -438,6 +439,17 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ] as $id => $coralType){ $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(true)); } + + foreach([ + [CoralType::BRAIN, Ids::BRAIN_CORAL_FAN, Ids::DEAD_BRAIN_CORAL_FAN], + [CoralType::BUBBLE, Ids::BUBBLE_CORAL_FAN, Ids::DEAD_BUBBLE_CORAL_FAN], + [CoralType::FIRE, Ids::FIRE_CORAL_FAN, Ids::DEAD_FIRE_CORAL_FAN], + [CoralType::HORN, Ids::HORN_CORAL_FAN, Ids::DEAD_HORN_CORAL_FAN], + [CoralType::TUBE, Ids::TUBE_CORAL_FAN, Ids::DEAD_TUBE_CORAL_FAN], + ] as [$coralType, $aliveId, $deadId]){ + $this->map($aliveId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(false), $in)); + $this->map($deadId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(true), $in)); + } } private function registerCauldronDeserializers() : void{ @@ -622,6 +634,19 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::SPRUCE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::SPRUCE_LEAVES(), $in)); } + private function registerSaplingDeserializers() : void{ + foreach([ + Ids::ACACIA_SAPLING => fn() => Blocks::ACACIA_SAPLING(), + Ids::BIRCH_SAPLING => fn() => Blocks::BIRCH_SAPLING(), + Ids::DARK_OAK_SAPLING => fn() => Blocks::DARK_OAK_SAPLING(), + Ids::JUNGLE_SAPLING => fn() => Blocks::JUNGLE_SAPLING(), + Ids::OAK_SAPLING => fn() => Blocks::OAK_SAPLING(), + Ids::SPRUCE_SAPLING => fn() => Blocks::SPRUCE_SAPLING(), + ] as $id => $getBlock){ + $this->map($id, fn(Reader $in) => Helper::decodeSapling($getBlock(), $in)); + } + } + private function registerSimpleDeserializers() : void{ $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); @@ -880,6 +905,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB()); $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); $this->mapSimple(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); + + $this->mapSimple(Ids::ALLIUM, fn() => Blocks::ALLIUM()); + $this->mapSimple(Ids::CORNFLOWER, fn() => Blocks::CORNFLOWER()); + $this->mapSimple(Ids::AZURE_BLUET, fn() => Blocks::AZURE_BLUET()); + $this->mapSimple(Ids::LILY_OF_THE_VALLEY, fn() => Blocks::LILY_OF_THE_VALLEY()); + $this->mapSimple(Ids::BLUE_ORCHID, fn() => Blocks::BLUE_ORCHID()); + $this->mapSimple(Ids::OXEYE_DAISY, fn() => Blocks::OXEYE_DAISY()); + $this->mapSimple(Ids::POPPY, fn() => Blocks::POPPY()); + $this->mapSimple(Ids::ORANGE_TULIP, fn() => Blocks::ORANGE_TULIP()); + $this->mapSimple(Ids::PINK_TULIP, fn() => Blocks::PINK_TULIP()); + $this->mapSimple(Ids::RED_TULIP, fn() => Blocks::RED_TULIP()); + $this->mapSimple(Ids::WHITE_TULIP, fn() => Blocks::WHITE_TULIP()); } private function registerDeserializers() : void{ @@ -921,7 +958,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); }); $this->map(Ids::BAMBOO_SAPLING, function(Reader $in) : Block{ - $in->ignored(StateNames::SAPLING_TYPE); //bug in MCPE return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT)); }); $this->map(Ids::BARREL, function(Reader $in) : Block{ @@ -1078,10 +1114,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setCoralType($in->readCoralType()) ->setDead($in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::CORAL_FAN, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) - ->setDead(false)); - $this->map(Ids::CORAL_FAN_DEAD, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN(), $in) - ->setDead(true)); $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN : CoralType::TUBE)); $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) @@ -1413,22 +1445,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::RAIL() ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); }); - $this->map(Ids::RED_FLOWER, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::FLOWER_TYPE)){ - StringValues::FLOWER_TYPE_ALLIUM => Blocks::ALLIUM(), - StringValues::FLOWER_TYPE_CORNFLOWER => Blocks::CORNFLOWER(), - StringValues::FLOWER_TYPE_HOUSTONIA => Blocks::AZURE_BLUET(), //wtf ??? - StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY => Blocks::LILY_OF_THE_VALLEY(), - StringValues::FLOWER_TYPE_ORCHID => Blocks::BLUE_ORCHID(), - StringValues::FLOWER_TYPE_OXEYE => Blocks::OXEYE_DAISY(), - StringValues::FLOWER_TYPE_POPPY => Blocks::POPPY(), - StringValues::FLOWER_TYPE_TULIP_ORANGE => Blocks::ORANGE_TULIP(), - StringValues::FLOWER_TYPE_TULIP_PINK => Blocks::PINK_TULIP(), - StringValues::FLOWER_TYPE_TULIP_RED => Blocks::RED_TULIP(), - StringValues::FLOWER_TYPE_TULIP_WHITE => Blocks::WHITE_TULIP(), - default => throw $in->badValueException(StateNames::FLOWER_TYPE, $type), - }; - }); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ @@ -1479,18 +1495,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }; }); $this->mapStairs(Ids::SANDSTONE_STAIRS, fn() => Blocks::SANDSTONE_STAIRS()); - $this->map(Ids::SAPLING, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::SAPLING_TYPE)){ - StringValues::SAPLING_TYPE_ACACIA => Blocks::ACACIA_SAPLING(), - StringValues::SAPLING_TYPE_BIRCH => Blocks::BIRCH_SAPLING(), - StringValues::SAPLING_TYPE_DARK_OAK => Blocks::DARK_OAK_SAPLING(), - StringValues::SAPLING_TYPE_JUNGLE => Blocks::JUNGLE_SAPLING(), - StringValues::SAPLING_TYPE_OAK => Blocks::OAK_SAPLING(), - StringValues::SAPLING_TYPE_SPRUCE => Blocks::SPRUCE_SAPLING(), - default => throw $in->badValueException(StateNames::SAPLING_TYPE, $type), - }) - ->setReady($in->readBool(StateNames::AGE_BIT)); - }); $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ return Blocks::SEA_PICKLE() ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 0a205f3e9b..f9266425b3 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -75,6 +75,7 @@ final class ItemTypeNames{ public const BLUE_DYE = "minecraft:blue_dye"; public const BOAT = "minecraft:boat"; public const BOGGED_SPAWN_EGG = "minecraft:bogged_spawn_egg"; + public const BOLT_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:bolt_armor_trim_smithing_template"; public const BONE = "minecraft:bone"; public const BONE_MEAL = "minecraft:bone_meal"; public const BOOK = "minecraft:book"; @@ -82,6 +83,7 @@ final class ItemTypeNames{ public const BOW = "minecraft:bow"; public const BOWL = "minecraft:bowl"; public const BREAD = "minecraft:bread"; + public const BREEZE_ROD = "minecraft:breeze_rod"; public const BREEZE_SPAWN_EGG = "minecraft:breeze_spawn_egg"; public const BREWER_POTTERY_SHERD = "minecraft:brewer_pottery_sherd"; public const BREWING_STAND = "minecraft:brewing_stand"; @@ -141,6 +143,8 @@ final class ItemTypeNames{ public const COPPER_DOOR = "minecraft:copper_door"; public const COPPER_INGOT = "minecraft:copper_ingot"; public const CORAL = "minecraft:coral"; + public const CORAL_FAN = "minecraft:coral_fan"; + public const CORAL_FAN_DEAD = "minecraft:coral_fan_dead"; public const COW_SPAWN_EGG = "minecraft:cow_spawn_egg"; public const CREEPER_BANNER_PATTERN = "minecraft:creeper_banner_pattern"; public const CREEPER_SPAWN_EGG = "minecraft:creeper_spawn_egg"; @@ -205,6 +209,9 @@ final class ItemTypeNames{ public const FISHING_ROD = "minecraft:fishing_rod"; public const FLINT = "minecraft:flint"; public const FLINT_AND_STEEL = "minecraft:flint_and_steel"; + public const FLOW_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:flow_armor_trim_smithing_template"; + public const FLOW_BANNER_PATTERN = "minecraft:flow_banner_pattern"; + public const FLOW_POTTERY_SHERD = "minecraft:flow_pottery_sherd"; public const FLOWER_BANNER_PATTERN = "minecraft:flower_banner_pattern"; public const FLOWER_POT = "minecraft:flower_pot"; public const FOX_SPAWN_EGG = "minecraft:fox_spawn_egg"; @@ -242,6 +249,8 @@ final class ItemTypeNames{ public const GREEN_DYE = "minecraft:green_dye"; public const GUARDIAN_SPAWN_EGG = "minecraft:guardian_spawn_egg"; public const GUNPOWDER = "minecraft:gunpowder"; + public const GUSTER_BANNER_PATTERN = "minecraft:guster_banner_pattern"; + public const GUSTER_POTTERY_SHERD = "minecraft:guster_pottery_sherd"; public const HARD_STAINED_GLASS = "minecraft:hard_stained_glass"; public const HARD_STAINED_GLASS_PANE = "minecraft:hard_stained_glass_pane"; public const HEART_OF_THE_SEA = "minecraft:heart_of_the_sea"; @@ -297,6 +306,7 @@ final class ItemTypeNames{ public const LODESTONE_COMPASS = "minecraft:lodestone_compass"; public const LOG = "minecraft:log"; public const LOG2 = "minecraft:log2"; + public const MACE = "minecraft:mace"; public const MAGENTA_DYE = "minecraft:magenta_dye"; public const MAGMA_CREAM = "minecraft:magma_cream"; public const MAGMA_CUBE_SPAWN_EGG = "minecraft:magma_cube_spawn_egg"; @@ -404,6 +414,7 @@ final class ItemTypeNames{ public const RAW_IRON = "minecraft:raw_iron"; public const RECOVERY_COMPASS = "minecraft:recovery_compass"; public const RED_DYE = "minecraft:red_dye"; + public const RED_FLOWER = "minecraft:red_flower"; public const REDSTONE = "minecraft:redstone"; public const REPEATER = "minecraft:repeater"; public const RIB_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:rib_armor_trim_smithing_template"; @@ -412,6 +423,8 @@ final class ItemTypeNames{ public const SALMON = "minecraft:salmon"; public const SALMON_BUCKET = "minecraft:salmon_bucket"; public const SALMON_SPAWN_EGG = "minecraft:salmon_spawn_egg"; + public const SAPLING = "minecraft:sapling"; + public const SCRAPE_POTTERY_SHERD = "minecraft:scrape_pottery_sherd"; public const SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:sentry_armor_trim_smithing_template"; public const SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:shaper_armor_trim_smithing_template"; public const SHEAF_POTTERY_SHERD = "minecraft:sheaf_pottery_sherd"; diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 1aa64c5970..c4a5578633 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -113,7 +113,8 @@ final class CraftingDataCache{ $nullUUID, CraftingRecipeBlockName::CRAFTING_TABLE, 50, - $index + true, + $index, ); }else{ //TODO: probably special recipe types diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 69761c366f..b99775886c 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -177,7 +177,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ //we don't force here, because it doesn't have user-facing effects //but it does have an annoying side-effect when true: it makes //the client remove its own non-server-supplied resource packs. - $this->session->sendDataPacket(ResourcePackStackPacket::create($stack, [], false, ProtocolInfo::MINECRAFT_VERSION_NETWORK, new Experiments([], false))); + $this->session->sendDataPacket(ResourcePackStackPacket::create($stack, [], false, ProtocolInfo::MINECRAFT_VERSION_NETWORK, new Experiments([], false), false)); $this->session->getLogger()->debug("Applying resource pack stack"); break; case ResourcePackClientResponsePacket::STATUS_COMPLETED: diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 4b57dd2d8d..924021d7e2 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 662; + public const CURRENT_STORAGE_NETWORK_VERSION = 671; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 20, //minor - 71, //patch - 1, //revision + 80, //patch + 5, //revision 0 //is beta ]; diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index ca15bd8bec..795e7ad1fd 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -407,7 +407,13 @@ class ParserPacketHandler extends PacketHandler{ $mappedType = $typeMap[$entry->getTypeId()]; if($entry instanceof ShapedRecipe){ - $recipes[$mappedType][] = $this->shapedRecipeToJson($entry); + //all known recipes are currently symmetric and I don't feel like attaching a `symmetric` field to + //every shaped recipe for this - split it into a separate category instead + if(!$entry->isSymmetric()){ + $recipes[$mappedType . "_asymmetric"][] = $this->shapedRecipeToJson($entry); + }else{ + $recipes[$mappedType][] = $this->shapedRecipeToJson($entry); + } }elseif($entry instanceof ShapelessRecipe){ $recipes[$mappedType][] = $this->shapelessRecipeToJson($entry); }elseif($entry instanceof MultiRecipe){ From 10238d793428731653d29bb4c54fa96f3b822d1e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 Apr 2024 11:39:09 +0100 Subject: [PATCH 1701/1858] Removed beta change --- src/data/bedrock/item/ItemTypeNames.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index f9266425b3..cadbb7aa6b 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -159,7 +159,6 @@ final class ItemTypeNames{ public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; - public const DEBUG_STICK = "minecraft:debug_stick"; public const DIAMOND = "minecraft:diamond"; public const DIAMOND_AXE = "minecraft:diamond_axe"; public const DIAMOND_BOOTS = "minecraft:diamond_boots"; From 737f5066a01d3df331fc61ca03f51c716304a407 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 Apr 2024 11:48:22 +0100 Subject: [PATCH 1702/1858] Fully cover codegen in CI --- .github/workflows/main-php-matrix.yml | 13 ++----------- build/generate-block-serializer-consts.php | 19 +++++++++++++++++++ build/generate-item-type-names.php | 19 +++++++++++++++++++ composer.json | 11 +++++++---- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml index b81ac8b460..6d71a0e70c 100644 --- a/.github/workflows/main-php-matrix.yml +++ b/.github/workflows/main-php-matrix.yml @@ -147,17 +147,8 @@ jobs: - name: Install Composer dependencies run: composer install --no-dev --prefer-dist --no-interaction - - name: Regenerate registry annotations - run: php build/generate-registry-annotations.php src - - - name: Regenerate KnownTranslation APIs - run: php build/generate-known-translation-apis.php - - - name: Regenerate BedrockData available files constants - run: php build/generate-bedrockdata-path-consts.php - - - name: Regenerate YmlServerProperties constants - run: php build/generate-pocketmine-yml-property-consts.php + - name: Update generated code + run: composer update-codegen - name: Verify code is unchanged run: | diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 89cdcbe316..875729fcf4 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -102,6 +102,25 @@ function generateClassHeader(string $className) : string{ return <<
Date: Thu, 25 Apr 2024 11:52:30 +0100 Subject: [PATCH 1703/1858] Release 5.15.0 --- changelogs/5.15.md | 16 ++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.15.md diff --git a/changelogs/5.15.md b/changelogs/5.15.md new file mode 100644 index 0000000000..536411ec59 --- /dev/null +++ b/changelogs/5.15.md @@ -0,0 +1,16 @@ +# 5.15.0 +Released 25th April 2024. + +**For Minecraft: Bedrock Edition 1.20.80** + +This is a support release for Minecraft: Bedrock Edition 1.20.80. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.20.80. +- Removed support for earlier versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d1a67ffeaa..8f57621a93 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.14.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.15.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From be6754494fdbbb9dd57c058ba0e33a4a78c4581f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 25 Apr 2024 11:52:31 +0100 Subject: [PATCH 1704/1858] 5.15.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8f57621a93..a7d4111afd 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.15.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.15.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From d70a7d34a7f70b9d7325d168fa43ba30382ba640 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 Apr 2024 15:51:25 +0100 Subject: [PATCH 1705/1858] Living: don't knockback or do hurt FX when attacked during cooldown players were switching from a weaker tool to a stronger one to get double knockback in PvP. while it's intended that we don't cancel the second attack during hit cooldown if the damage is higher (the first damage is subtracted to prevent doubling up), we don't want them to get double knockback. this behaviour now matches vanilla to the best of my observations. Come at me PvP community... I know some people are going to hate this change --- src/entity/Living.php | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/entity/Living.php b/src/entity/Living.php index e7d669fda7..b0d14957cb 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -555,26 +555,33 @@ abstract class Living extends Entity{ return; } - $this->attackTime = $source->getAttackCooldown(); + if($this->attackTime <= 0){ + //this logic only applies if the entity was cold attacked - if($source instanceof EntityDamageByChildEntityEvent){ - $e = $source->getChild(); - if($e !== null){ - $motion = $e->getMotion(); - $this->knockBack($motion->x, $motion->z, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); + $this->attackTime = $source->getAttackCooldown(); + + if($source instanceof EntityDamageByChildEntityEvent){ + $e = $source->getChild(); + if($e !== null){ + $motion = $e->getMotion(); + $this->knockBack($motion->x, $motion->z, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); + } + }elseif($source instanceof EntityDamageByEntityEvent){ + $e = $source->getDamager(); + if($e !== null){ + $deltaX = $this->location->x - $e->location->x; + $deltaZ = $this->location->z - $e->location->z; + $this->knockBack($deltaX, $deltaZ, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); + } } - }elseif($source instanceof EntityDamageByEntityEvent){ - $e = $source->getDamager(); - if($e !== null){ - $deltaX = $this->location->x - $e->location->x; - $deltaZ = $this->location->z - $e->location->z; - $this->knockBack($deltaX, $deltaZ, $source->getKnockBack(), $source->getVerticalKnockBackLimit()); + + if($this->isAlive()){ + $this->doHitAnimation(); } } if($this->isAlive()){ $this->applyPostDamageEffects($source); - $this->doHitAnimation(); } } From ed158f8a1b0cfe334ac5f45febc0f633602014f2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 Apr 2024 16:36:14 +0100 Subject: [PATCH 1706/1858] Server: include uptime in crash restart throttle message this makes it clearer why the wait duration is chosen instead of it looking random. --- src/Server.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Server.php b/src/Server.php index ed7f52d63e..a34349bb5c 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1666,9 +1666,11 @@ class Server{ $this->isRunning = false; //Force minimum uptime to be >= 120 seconds, to reduce the impact of spammy crash loops - $spacing = ((int) $this->startTime) - time() + 120; + $uptime = time() - ((int) $this->startTime); + $minUptime = 120; + $spacing = $minUptime - $uptime; if($spacing > 0){ - echo "--- Waiting $spacing seconds to throttle automatic restart (you can kill the process safely now) ---" . PHP_EOL; + echo "--- Uptime {$uptime}s - waiting {$spacing}s to throttle automatic restart (you can kill the process safely now) ---" . PHP_EOL; sleep($spacing); } @Process::kill(Process::pid()); From d67f5a5c6f761a08c3a166af3bf33817c8ada701 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 15:41:28 +0100 Subject: [PATCH 1707/1858] Bump symfony/filesystem from 6.4.6 to 6.4.7 (#6342) Bumps [symfony/filesystem](https://github.com/symfony/filesystem) from 6.4.6 to 6.4.7. - [Release notes](https://github.com/symfony/filesystem/releases) - [Changelog](https://github.com/symfony/filesystem/blob/7.0/CHANGELOG.md) - [Commits](https://github.com/symfony/filesystem/compare/v6.4.6...v6.4.7) --- updated-dependencies: - dependency-name: symfony/filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 76 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index b27a8e840d..8327091394 100644 --- a/composer.lock +++ b/composer.lock @@ -921,22 +921,23 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3" + "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/9919b5509ada52cc7f66f9a35c86a4a29955c9d3", - "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/78dde75f8f6dbbca4ec436a4b0087f7af02076d4", + "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "symfony/polyfill-mbstring": "~1.8", + "symfony/process": "^5.4|^6.4" }, "type": "library", "autoload": { @@ -964,7 +965,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.6" + "source": "https://github.com/symfony/filesystem/tree/v6.4.7" }, "funding": [ { @@ -980,7 +981,7 @@ "type": "tidelift" } ], - "time": "2024-03-21T19:36:20+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1140,6 +1141,67 @@ } ], "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" } ], "packages-dev": [ From 27dc43f131bab3dd87d0d902d709f3343f1b97cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 15:41:40 +0100 Subject: [PATCH 1708/1858] Bump shivammathur/setup-php from 2.30.2 to 2.30.4 (#6339) Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.30.2 to 2.30.4. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.30.2...2.30.4) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index 3f48248ec4..ce8a16ebc9 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.2 + uses: shivammathur/setup-php@2.30.4 with: php-version: 8.2 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 7f55ca028e..e0eae836d3 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.30.2 + uses: shivammathur/setup-php@2.30.4 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fe097d2914..92bd7171b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.2 + uses: shivammathur/setup-php@2.30.4 with: php-version: 8.2 tools: php-cs-fixer:3.49 From ab3be50b49b97792505180057136c8bd3f10db0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 15:41:50 +0100 Subject: [PATCH 1709/1858] Bump phpstan/phpstan from 1.10.66 to 1.10.67 (#6337) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.66 to 1.10.67. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.66...1.10.67) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index c26285fc24..14be6f0d2e 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.66", + "phpstan/phpstan": "1.10.67", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 8327091394..62c62b29e0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7cddeede03046e04932d117c76898baf", + "content-hash": "99069514f4fb8ee6b03b0da07a77a486", "packages": [ { "name": "adhocore/json-comment", @@ -1442,16 +1442,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.66", + "version": "1.10.67", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "94779c987e4ebd620025d9e5fdd23323903950bd" + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd", - "reference": "94779c987e4ebd620025d9e5fdd23323903950bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", "shasum": "" }, "require": { @@ -1494,13 +1494,9 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-03-28T16:17:31+00:00" + "time": "2024-04-16T07:22:02+00:00" }, { "name": "phpstan/phpstan-phpunit", From 9b6a0c99450949c4350f5d3bf49396c19e6ce79c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 15:41:59 +0100 Subject: [PATCH 1710/1858] Bump phpstan/phpstan-strict-rules from 1.5.3 to 1.5.5 (#6335) Bumps [phpstan/phpstan-strict-rules](https://github.com/phpstan/phpstan-strict-rules) from 1.5.3 to 1.5.5. - [Release notes](https://github.com/phpstan/phpstan-strict-rules/releases) - [Commits](https://github.com/phpstan/phpstan-strict-rules/compare/1.5.3...1.5.5) --- updated-dependencies: - dependency-name: phpstan/phpstan-strict-rules dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 62c62b29e0..b4d012ce42 100644 --- a/composer.lock +++ b/composer.lock @@ -1552,16 +1552,16 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.3", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b" + "reference": "2e193a07651a6f4be3baa44ddb21d822681f5918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/568210bd301f94a0d4b1e5a0808c374c1b9cf11b", - "reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/2e193a07651a6f4be3baa44ddb21d822681f5918", + "reference": "2e193a07651a6f4be3baa44ddb21d822681f5918", "shasum": "" }, "require": { @@ -1595,9 +1595,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.3" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.5" }, - "time": "2024-04-06T07:43:25+00:00" + "time": "2024-04-19T15:12:26+00:00" }, { "name": "phpunit/php-code-coverage", From 371eccd0079a1916c3c0802390920cd878631553 Mon Sep 17 00:00:00 2001 From: Max <43801744+ItsMax123@users.noreply.github.com> Date: Tue, 7 May 2024 07:02:50 -0400 Subject: [PATCH 1711/1858] Make access modifier consistent with parent abstract class (#6341) --- src/item/VanillaItems.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index bbd0dfc01b..5115ee48a8 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -591,12 +591,12 @@ final class VanillaItems{ } }); self::register("squid_spawn_egg", new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ - public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ + protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); } }); self::register("villager_spawn_egg", new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ - public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ + protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); } }); From 1b082f99e944e35f37ff9fde214ecbdb9b7187e8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 May 2024 12:34:42 +0100 Subject: [PATCH 1712/1858] DefaultPermissions: fixed typo --- src/permission/DefaultPermissions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/permission/DefaultPermissions.php b/src/permission/DefaultPermissions.php index 4af3d1b099..c72765af6b 100644 --- a/src/permission/DefaultPermissions.php +++ b/src/permission/DefaultPermissions.php @@ -83,7 +83,7 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(Names::COMMAND_PLUGINS, l10n::pocketmine_permission_command_plugins()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_SAVE_DISABLE, l10n::pocketmine_permission_command_save_disable()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_SAVE_ENABLE, l10n::pocketmine_permission_command_save_enable()), [$operatorRoot]); - self::registerPermission(new Permission(Names::COMMAND_SAVE_PERFORM, l10n::pocketmine_permission_command_save_enable()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_SAVE_PERFORM, l10n::pocketmine_permission_command_save_perform()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_SAY, l10n::pocketmine_permission_command_say()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_SEED, l10n::pocketmine_permission_command_seed()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_SETWORLDSPAWN, l10n::pocketmine_permission_command_setworldspawn()), [$operatorRoot]); From 5ef247620a7c6301a849b54e5ef1009217729fc8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 May 2024 12:46:31 +0100 Subject: [PATCH 1713/1858] Attach permission doc to every release --- .github/workflows/draft-release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index e0eae836d3..d8a972585d 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -76,6 +76,9 @@ jobs: ${{ steps.php-binary-url.outputs.PHP_BINARY_URL }} \ > build_info.json + - name: Generate core permission doc for doc.pmmp.io + run: php tools/generate-permission-doc.php rst + - name: Upload release artifacts uses: actions/upload-artifact@v4 with: @@ -84,6 +87,7 @@ jobs: ${{ github.workspace }}/PocketMine-MP.phar ${{ github.workspace }}/start.* ${{ github.workspace }}/build_info.json + ${{ github.workspace }}/core-permissions.rst - name: Create draft release uses: ncipollo/release-action@v1.14.0 From f772bb738433b15d70cf5515314bab973a419991 Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Mon, 13 May 2024 10:34:18 +0200 Subject: [PATCH 1714/1858] WoodenStairs can be a fuel (#6345) --- src/block/WoodenStairs.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/WoodenStairs.php b/src/block/WoodenStairs.php index 30fa7e6026..0d9ba62ceb 100644 --- a/src/block/WoodenStairs.php +++ b/src/block/WoodenStairs.php @@ -28,6 +28,10 @@ use pocketmine\block\utils\WoodTypeTrait; class WoodenStairs extends Stair{ use WoodTypeTrait; + public function getFuelTime() : int{ + return $this->woodType->isFlammable() ? 300 : 0; + } + public function getFlameEncouragement() : int{ return 5; } From 373dd9938ca2f16f809a11684d9a185ee915a528 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 May 2024 11:36:56 +0100 Subject: [PATCH 1715/1858] Update composer dependencies --- composer.lock | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/composer.lock b/composer.lock index b4d012ce42..22fdd9305f 100644 --- a/composer.lock +++ b/composer.lock @@ -67,25 +67,25 @@ }, { "name": "brick/math", - "version": "0.11.0", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "5.0.0" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { @@ -105,12 +105,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.11.0" + "source": "https://github.com/brick/math/tree/0.12.1" }, "funding": [ { @@ -118,7 +123,7 @@ "type": "github" } ], - "time": "2023-01-15T23:15:59+00:00" + "time": "2023-11-29T23:19:16+00:00" }, { "name": "pocketmine/bedrock-block-upgrade-schema", @@ -829,20 +834,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -905,7 +910,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -917,7 +922,7 @@ "type": "tidelift" } ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "symfony/filesystem", From 554775841e1944eec3d3baa8808729522e74cbb7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 May 2024 11:48:23 +0100 Subject: [PATCH 1716/1858] Added script for linking local versions of Bedrock* deps for testing --- install-local-protocol.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 install-local-protocol.sh diff --git a/install-local-protocol.sh b/install-local-protocol.sh new file mode 100644 index 0000000000..0f25a03900 --- /dev/null +++ b/install-local-protocol.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +echo "--- Installing BedrockProtocol, BedrockData, BedrockBlockUpgradeSchema, BedrockItemUpgradeSchema dependencies from local repositories." +echo "--- This allows you to perform integration tests using PocketMine-MP, without immediately publishing new versions of these libraries." + +cp composer.json composer-local-protocol.json +cp composer.lock composer-local-protocol.lock + +export COMPOSER=composer-local-protocol.json +composer config repositories.bedrock-protocol path ../deps/BedrockProtocol +composer config repositories.bedrock-data path ../deps/BedrockData +composer config repositories.bedrock-block-upgrade-schema path ../deps/BedrockBlockUpgradeSchema +composer config repositories.bedrock-item-upgrade-schema path ../deps/BedrockItemUpgradeSchema + +composer require pocketmine/bedrock-protocol:*@dev pocketmine/bedrock-data:*@dev pocketmine/bedrock-block-upgrade-schema:*@dev pocketmine/bedrock-item-upgrade-schema:*@dev + +composer install + +echo "--- Local dependencies have been successfully installed." +echo "--- This script does not modify composer.json. To go back to the original dependency versions, simply run 'composer install'." + From fb9a74e8799c71ed8292cfa53abe7a4c9204629d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 13 May 2024 11:52:31 +0100 Subject: [PATCH 1717/1858] gitignore files generated by install-local-protocol.sh --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 13c3473764..6456250a6d 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,6 @@ Documentation/* # php-cs-fixer /.php_cs.cache /.php-cs-fixer.cache + +# install-local-protocol.sh +/composer-local-protocol.* From 4c418b43182c9c0120238d739fbade3b91060737 Mon Sep 17 00:00:00 2001 From: Vega Nicholas S <142091702+nicholass003@users.noreply.github.com> Date: Fri, 31 May 2024 22:54:50 +0700 Subject: [PATCH 1718/1858] Remove unnecessary return statement (#6350) --- .../bedrock/block/convert/BlockStateToObjectDeserializer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 7220c0f8b9..6b0c720f74 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -1437,7 +1437,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $in->ignored(StateNames::PILLAR_AXIS); return Blocks::SMOOTH_QUARTZ(); default: - return throw $in->badValueException(StateNames::CHISEL_TYPE, $type); + throw $in->badValueException(StateNames::CHISEL_TYPE, $type); } }); $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS()); From 08c6e63aac45a450fe3b437616ee8aa2500e04e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 17:01:51 +0100 Subject: [PATCH 1719/1858] Bump phpstan/phpstan from 1.10.67 to 1.11.2 (#6352) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.67 to 1.11.2. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.67...1.11.2) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 14be6f0d2e..74bf145857 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.10.67", + "phpstan/phpstan": "1.11.2", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" diff --git a/composer.lock b/composer.lock index 22fdd9305f..2e9138219a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "99069514f4fb8ee6b03b0da07a77a486", + "content-hash": "833c1bb38c1ceaf36938a4d9fd0b7978", "packages": [ { "name": "adhocore/json-comment", @@ -1447,16 +1447,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.67", + "version": "1.11.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d5d4294a70deb7547db655c47685d680e39cfec", + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec", "shasum": "" }, "require": { @@ -1501,7 +1501,7 @@ "type": "github" } ], - "time": "2024-04-16T07:22:02+00:00" + "time": "2024-05-24T13:23:04+00:00" }, { "name": "phpstan/phpstan-phpunit", From f121654452e21fb8ccba872ffbf805f607b5425d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2024 18:41:41 +0100 Subject: [PATCH 1720/1858] Assemble 1.21.0 --- composer.json | 8 +-- composer.lock | 52 +++++++-------- .../CraftingManagerFromDataHelper.php | 2 + src/crafting/json/ShapedRecipeData.php | 23 ++++++- src/crafting/json/ShapelessRecipeData.php | 23 ++++++- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 4 +- .../bedrock/block/BlockStateStringValues.php | 18 ------ src/data/bedrock/block/BlockTypeNames.php | 30 +++++++-- .../convert/BlockObjectToStateSerializer.php | 49 ++++++++------- .../convert/BlockStateDeserializerHelper.php | 19 ++++++ .../block/convert/BlockStateReader.php | 13 ---- .../convert/BlockStateSerializerHelper.php | 31 ++++++--- .../BlockStateToObjectDeserializer.php | 63 ++++++++++--------- .../block/convert/BlockStateWriter.php | 13 ---- src/data/bedrock/item/ItemTypeNames.php | 9 +++ src/network/mcpe/InventoryManager.php | 14 ++++- src/network/mcpe/cache/CraftingDataCache.php | 4 ++ src/world/format/io/data/BedrockWorldData.php | 8 +-- .../data/bedrock/block/BlockStateDataTest.php | 14 ++++- tools/generate-bedrock-data-from-packets.php | 10 ++- 21 files changed, 251 insertions(+), 160 deletions(-) diff --git a/composer.json b/composer.json index 74bf145857..f14070552d 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.1.0+bedrock-1.20.80", - "pocketmine/bedrock-data": "~2.10.0+bedrock-1.20.80", - "pocketmine/bedrock-item-upgrade-schema": "~1.9.0+bedrock-1.20.80", - "pocketmine/bedrock-protocol": "~30.0.0+bedrock-1.20.80", + "pocketmine/bedrock-block-upgrade-schema": "~4.2.0+bedrock-1.21.0", + "pocketmine/bedrock-data": "~2.11.0+bedrock-1.21.0", + "pocketmine/bedrock-item-upgrade-schema": "~1.10.0+bedrock-1.21.0", + "pocketmine/bedrock-protocol": "~31.0.0+bedrock-1.21.0", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 2e9138219a..b2f82093b9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "833c1bb38c1ceaf36938a4d9fd0b7978", + "content-hash": "941b6d463cb044438aa7908b76f7a6bb", "packages": [ { "name": "adhocore/json-comment", @@ -127,16 +127,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.1.0", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb" + "reference": "8a327197b3b462fa282f40f76b070ffe585a25d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb", - "reference": "d6b10cb0a5e69fb1dfe3b7f493bf4f519723a9cb", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/8a327197b3b462fa282f40f76b070ffe585a25d2", + "reference": "8a327197b3b462fa282f40f76b070ffe585a25d2", "shasum": "" }, "type": "library", @@ -147,22 +147,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.1.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.2.0" }, - "time": "2024-04-05T17:28:14+00:00" + "time": "2024-06-13T17:28:26+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.10.0+bedrock-1.20.80", + "version": "2.11.0+bedrock-1.21.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "d7d709fec3848f56ca77f5ff0e5d4741b59f9d69" + "reference": "cae40bde98081b388c4d3ab59d45b8d1cf5d8761" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d7d709fec3848f56ca77f5ff0e5d4741b59f9d69", - "reference": "d7d709fec3848f56ca77f5ff0e5d4741b59f9d69", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/cae40bde98081b388c4d3ab59d45b8d1cf5d8761", + "reference": "cae40bde98081b388c4d3ab59d45b8d1cf5d8761", "shasum": "" }, "type": "library", @@ -173,22 +173,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.20.80" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.0" }, - "time": "2024-04-25T10:08:23+00:00" + "time": "2024-06-13T17:17:55+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "24a89457c17c271b5378b195931e720873865a79" + "reference": "b4687afa19f91eacebd46c40d487f4cc515be504" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/24a89457c17c271b5378b195931e720873865a79", - "reference": "24a89457c17c271b5378b195931e720873865a79", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/b4687afa19f91eacebd46c40d487f4cc515be504", + "reference": "b4687afa19f91eacebd46c40d487f4cc515be504", "shasum": "" }, "type": "library", @@ -199,22 +199,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.9.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.10.0" }, - "time": "2024-04-05T18:46:07+00:00" + "time": "2024-05-15T15:15:55+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "30.0.0+bedrock-1.20.80", + "version": "31.0.0+bedrock-1.21.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "dc7606a9f778eeeeccfae393bd58e0b62ec6f85a" + "reference": "972373b6b8068963649f0a95163424eb5b645e29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/dc7606a9f778eeeeccfae393bd58e0b62ec6f85a", - "reference": "dc7606a9f778eeeeccfae393bd58e0b62ec6f85a", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/972373b6b8068963649f0a95163424eb5b645e29", + "reference": "972373b6b8068963649f0a95163424eb5b645e29", "shasum": "" }, "require": { @@ -227,7 +227,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.10.59", + "phpstan/phpstan": "1.11.2", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5 || ^10.0" @@ -245,9 +245,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/30.0.0+bedrock-1.20.80" + "source": "https://github.com/pmmp/BedrockProtocol/tree/31.0.0+bedrock-1.21.0" }, - "time": "2024-04-05T17:53:35+00:00" + "time": "2024-06-13T17:34:14+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 8315f2b3b3..6e5bbcd1fa 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -236,6 +236,7 @@ final class CraftingManagerFromDataHelper{ } $outputs[] = $output; } + //TODO: check unlocking requirements - our current system doesn't support this $result->registerShapelessRecipe(new ShapelessRecipe( $inputs, $outputs, @@ -262,6 +263,7 @@ final class CraftingManagerFromDataHelper{ } $outputs[] = $output; } + //TODO: check unlocking requirements - our current system doesn't support this $result->registerShapedRecipe(new ShapedRecipe( $recipe->shape, $inputs, diff --git a/src/crafting/json/ShapedRecipeData.php b/src/crafting/json/ShapedRecipeData.php index dd040f516e..965a437ea6 100644 --- a/src/crafting/json/ShapedRecipeData.php +++ b/src/crafting/json/ShapedRecipeData.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\crafting\json; -final class ShapedRecipeData{ +use function count; + +final class ShapedRecipeData implements \JsonSerializable{ /** * @required * @var string[] @@ -51,22 +53,39 @@ final class ShapedRecipeData{ /** @required */ public int $priority; + /** @var RecipeIngredientData[] */ + public array $unlockingIngredients = []; + /** * TODO: convert this to use promoted properties - avoiding them for now since it would break JsonMapper * * @param string[] $shape * @param RecipeIngredientData[] $input * @param ItemStackData[] $output + * @param RecipeIngredientData[] $unlockingIngredients * * @phpstan-param list $shape * @phpstan-param array $input * @phpstan-param list $output + * @phpstan-param list $unlockingIngredients */ - public function __construct(array $shape, array $input, array $output, string $block, int $priority){ + public function __construct(array $shape, array $input, array $output, string $block, int $priority, array $unlockingIngredients = []){ $this->block = $block; $this->priority = $priority; $this->shape = $shape; $this->input = $input; $this->output = $output; + $this->unlockingIngredients = $unlockingIngredients; + } + + /** + * @return mixed[] + */ + public function jsonSerialize() : array{ + $result = (array) $this; + if(count($this->unlockingIngredients) === 0){ + unset($result["unlockingIngredients"]); + } + return $result; } } diff --git a/src/crafting/json/ShapelessRecipeData.php b/src/crafting/json/ShapelessRecipeData.php index d59bafbbf3..23cfebde0b 100644 --- a/src/crafting/json/ShapelessRecipeData.php +++ b/src/crafting/json/ShapelessRecipeData.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\crafting\json; -final class ShapelessRecipeData{ +use function count; + +final class ShapelessRecipeData implements \JsonSerializable{ /** * @required @@ -45,17 +47,34 @@ final class ShapelessRecipeData{ /** @required */ public int $priority; + /** @var RecipeIngredientData[] */ + public array $unlockingIngredients = []; + /** * @param RecipeIngredientData[] $input * @param ItemStackData[] $output + * @param RecipeIngredientData[] $unlockingIngredients * * @phpstan-param list $input * @phpstan-param list $output + * @phpstan-param list $unlockingIngredients */ - public function __construct(array $input, array $output, string $block, int $priority){ + public function __construct(array $input, array $output, string $block, int $priority, array $unlockingIngredients = []){ $this->block = $block; $this->priority = $priority; $this->input = $input; $this->output = $output; + $this->unlockingIngredients = $unlockingIngredients; + } + + /** + * @return mixed[] + */ + public function jsonSerialize() : array{ + $result = (array) $this; + if(count($this->unlockingIngredients) === 0){ + unset($result["unlockingIngredients"]); + } + return $result; } } diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 21f2bc53cd..51899b72bf 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -41,8 +41,8 @@ final class BlockStateData{ */ public const CURRENT_VERSION = (1 << 24) | //major - (20 << 16) | //minor - (80 << 8) | //patch + (21 << 16) | //minor + (0 << 8) | //patch (3); //revision public const TAG_NAME = "name"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index b996acf04e..4564f696ea 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -59,7 +59,6 @@ final class BlockStateNames{ public const COLOR_BIT = "color_bit"; public const COMPOSTER_FILL_LEVEL = "composter_fill_level"; public const CONDITIONAL_BIT = "conditional_bit"; - public const CORAL_COLOR = "coral_color"; public const CORAL_DIRECTION = "coral_direction"; public const CORAL_FAN_DIRECTION = "coral_fan_direction"; public const CORAL_HANG_TYPE_BIT = "coral_hang_type_bit"; @@ -73,7 +72,6 @@ final class BlockStateNames{ public const DIRT_TYPE = "dirt_type"; public const DISARMED_BIT = "disarmed_bit"; public const DOOR_HINGE_BIT = "door_hinge_bit"; - public const DOUBLE_PLANT_TYPE = "double_plant_type"; public const DRAG_DOWN = "drag_down"; public const DRIPSTONE_THICKNESS = "dripstone_thickness"; public const END_PORTAL_EYE_BIT = "end_portal_eye_bit"; @@ -105,6 +103,7 @@ final class BlockStateNames{ public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; public const OCCUPIED_BIT = "occupied_bit"; + public const OMINOUS = "ominous"; public const OPEN_BIT = "open_bit"; public const ORIENTATION = "orientation"; public const OUTPUT_LIT_BIT = "output_lit_bit"; @@ -137,7 +136,6 @@ final class BlockStateNames{ public const STRUCTURE_BLOCK_TYPE = "structure_block_type"; public const STRUCTURE_VOID_TYPE = "structure_void_type"; public const SUSPENDED_BIT = "suspended_bit"; - public const TALL_GRASS_TYPE = "tall_grass_type"; public const TOGGLE_BIT = "toggle_bit"; public const TORCH_FACING_DIRECTION = "torch_facing_direction"; public const TRIAL_SPAWNER_STATE = "trial_spawner_state"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 2b45c47387..8538c3deb8 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -62,12 +62,6 @@ final class BlockStateStringValues{ public const CHISEL_TYPE_LINES = "lines"; public const CHISEL_TYPE_SMOOTH = "smooth"; - public const CORAL_COLOR_BLUE = "blue"; - public const CORAL_COLOR_PINK = "pink"; - public const CORAL_COLOR_PURPLE = "purple"; - public const CORAL_COLOR_RED = "red"; - public const CORAL_COLOR_YELLOW = "yellow"; - public const CRACKED_STATE_CRACKED = "cracked"; public const CRACKED_STATE_MAX_CRACKED = "max_cracked"; public const CRACKED_STATE_NO_CRACKS = "no_cracks"; @@ -80,13 +74,6 @@ final class BlockStateStringValues{ public const DIRT_TYPE_COARSE = "coarse"; public const DIRT_TYPE_NORMAL = "normal"; - public const DOUBLE_PLANT_TYPE_FERN = "fern"; - public const DOUBLE_PLANT_TYPE_GRASS = "grass"; - public const DOUBLE_PLANT_TYPE_PAEONIA = "paeonia"; - public const DOUBLE_PLANT_TYPE_ROSE = "rose"; - public const DOUBLE_PLANT_TYPE_SUNFLOWER = "sunflower"; - public const DOUBLE_PLANT_TYPE_SYRINGA = "syringa"; - public const DRIPSTONE_THICKNESS_BASE = "base"; public const DRIPSTONE_THICKNESS_FRUSTUM = "frustum"; public const DRIPSTONE_THICKNESS_MERGE = "merge"; @@ -220,11 +207,6 @@ final class BlockStateStringValues{ public const STRUCTURE_VOID_TYPE_AIR = "air"; public const STRUCTURE_VOID_TYPE_VOID = "void"; - public const TALL_GRASS_TYPE_DEFAULT = "default"; - public const TALL_GRASS_TYPE_FERN = "fern"; - public const TALL_GRASS_TYPE_SNOW = "snow"; - public const TALL_GRASS_TYPE_TALL = "tall"; - public const TORCH_FACING_DIRECTION_EAST = "east"; public const TORCH_FACING_DIRECTION_NORTH = "north"; public const TORCH_FACING_DIRECTION_SOUTH = "south"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 9dc0961d2d..25433e6ebc 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -144,9 +144,11 @@ final class BlockTypeNames{ public const BOOKSHELF = "minecraft:bookshelf"; public const BORDER_BLOCK = "minecraft:border_block"; public const BRAIN_CORAL = "minecraft:brain_coral"; + public const BRAIN_CORAL_BLOCK = "minecraft:brain_coral_block"; public const BRAIN_CORAL_FAN = "minecraft:brain_coral_fan"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK_BLOCK = "minecraft:brick_block"; + public const BRICK_SLAB = "minecraft:brick_slab"; public const BRICK_STAIRS = "minecraft:brick_stairs"; public const BROWN_CANDLE = "minecraft:brown_candle"; public const BROWN_CANDLE_CAKE = "minecraft:brown_candle_cake"; @@ -163,6 +165,7 @@ final class BlockTypeNames{ public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; public const BUBBLE_CORAL = "minecraft:bubble_coral"; + public const BUBBLE_CORAL_BLOCK = "minecraft:bubble_coral_block"; public const BUBBLE_CORAL_FAN = "minecraft:bubble_coral_fan"; public const BUDDING_AMETHYST = "minecraft:budding_amethyst"; public const CACTUS = "minecraft:cactus"; @@ -221,6 +224,7 @@ final class BlockTypeNames{ public const COBBLED_DEEPSLATE_STAIRS = "minecraft:cobbled_deepslate_stairs"; public const COBBLED_DEEPSLATE_WALL = "minecraft:cobbled_deepslate_wall"; public const COBBLESTONE = "minecraft:cobblestone"; + public const COBBLESTONE_SLAB = "minecraft:cobblestone_slab"; public const COBBLESTONE_WALL = "minecraft:cobblestone_wall"; public const COCOA = "minecraft:cocoa"; public const COLORED_TORCH_BP = "minecraft:colored_torch_bp"; @@ -234,7 +238,6 @@ final class BlockTypeNames{ public const COPPER_GRATE = "minecraft:copper_grate"; public const COPPER_ORE = "minecraft:copper_ore"; public const COPPER_TRAPDOOR = "minecraft:copper_trapdoor"; - public const CORAL_BLOCK = "minecraft:coral_block"; public const CORAL_FAN_HANG = "minecraft:coral_fan_hang"; public const CORAL_FAN_HANG2 = "minecraft:coral_fan_hang2"; public const CORAL_FAN_HANG3 = "minecraft:coral_fan_hang3"; @@ -299,14 +302,19 @@ final class BlockTypeNames{ public const DAYLIGHT_DETECTOR = "minecraft:daylight_detector"; public const DAYLIGHT_DETECTOR_INVERTED = "minecraft:daylight_detector_inverted"; public const DEAD_BRAIN_CORAL = "minecraft:dead_brain_coral"; + public const DEAD_BRAIN_CORAL_BLOCK = "minecraft:dead_brain_coral_block"; public const DEAD_BRAIN_CORAL_FAN = "minecraft:dead_brain_coral_fan"; public const DEAD_BUBBLE_CORAL = "minecraft:dead_bubble_coral"; + public const DEAD_BUBBLE_CORAL_BLOCK = "minecraft:dead_bubble_coral_block"; public const DEAD_BUBBLE_CORAL_FAN = "minecraft:dead_bubble_coral_fan"; public const DEAD_FIRE_CORAL = "minecraft:dead_fire_coral"; + public const DEAD_FIRE_CORAL_BLOCK = "minecraft:dead_fire_coral_block"; public const DEAD_FIRE_CORAL_FAN = "minecraft:dead_fire_coral_fan"; public const DEAD_HORN_CORAL = "minecraft:dead_horn_coral"; + public const DEAD_HORN_CORAL_BLOCK = "minecraft:dead_horn_coral_block"; public const DEAD_HORN_CORAL_FAN = "minecraft:dead_horn_coral_fan"; public const DEAD_TUBE_CORAL = "minecraft:dead_tube_coral"; + public const DEAD_TUBE_CORAL_BLOCK = "minecraft:dead_tube_coral_block"; public const DEAD_TUBE_CORAL_FAN = "minecraft:dead_tube_coral_fan"; public const DEADBUSH = "minecraft:deadbush"; public const DECORATED_POT = "minecraft:decorated_pot"; @@ -339,7 +347,6 @@ final class BlockTypeNames{ public const DIRT_WITH_ROOTS = "minecraft:dirt_with_roots"; public const DISPENSER = "minecraft:dispenser"; public const DOUBLE_CUT_COPPER_SLAB = "minecraft:double_cut_copper_slab"; - public const DOUBLE_PLANT = "minecraft:double_plant"; public const DOUBLE_STONE_BLOCK_SLAB = "minecraft:double_stone_block_slab"; public const DOUBLE_STONE_BLOCK_SLAB2 = "minecraft:double_stone_block_slab2"; public const DOUBLE_STONE_BLOCK_SLAB3 = "minecraft:double_stone_block_slab3"; @@ -490,8 +497,10 @@ final class BlockTypeNames{ public const EXPOSED_DOUBLE_CUT_COPPER_SLAB = "minecraft:exposed_double_cut_copper_slab"; public const FARMLAND = "minecraft:farmland"; public const FENCE_GATE = "minecraft:fence_gate"; + public const FERN = "minecraft:fern"; public const FIRE = "minecraft:fire"; public const FIRE_CORAL = "minecraft:fire_coral"; + public const FIRE_CORAL_BLOCK = "minecraft:fire_coral_block"; public const FIRE_CORAL_FAN = "minecraft:fire_coral_fan"; public const FLETCHING_TABLE = "minecraft:fletching_table"; public const FLOWER_POT = "minecraft:flower_pot"; @@ -583,6 +592,7 @@ final class BlockTypeNames{ public const HONEYCOMB_BLOCK = "minecraft:honeycomb_block"; public const HOPPER = "minecraft:hopper"; public const HORN_CORAL = "minecraft:horn_coral"; + public const HORN_CORAL_BLOCK = "minecraft:horn_coral_block"; public const HORN_CORAL_FAN = "minecraft:horn_coral_fan"; public const ICE = "minecraft:ice"; public const INFESTED_DEEPSLATE = "minecraft:infested_deepslate"; @@ -619,6 +629,7 @@ final class BlockTypeNames{ public const LAPIS_BLOCK = "minecraft:lapis_block"; public const LAPIS_ORE = "minecraft:lapis_ore"; public const LARGE_AMETHYST_BUD = "minecraft:large_amethyst_bud"; + public const LARGE_FERN = "minecraft:large_fern"; public const LAVA = "minecraft:lava"; public const LECTERN = "minecraft:lectern"; public const LEVER = "minecraft:lever"; @@ -646,6 +657,7 @@ final class BlockTypeNames{ public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; + public const LILAC = "minecraft:lilac"; public const LILY_OF_THE_VALLEY = "minecraft:lily_of_the_valley"; public const LIME_CANDLE = "minecraft:lime_candle"; public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; @@ -718,6 +730,7 @@ final class BlockTypeNames{ public const MYCELIUM = "minecraft:mycelium"; public const NETHER_BRICK = "minecraft:nether_brick"; public const NETHER_BRICK_FENCE = "minecraft:nether_brick_fence"; + public const NETHER_BRICK_SLAB = "minecraft:nether_brick_slab"; public const NETHER_BRICK_STAIRS = "minecraft:nether_brick_stairs"; public const NETHER_GOLD_ORE = "minecraft:nether_gold_ore"; public const NETHER_SPROUTS = "minecraft:nether_sprouts"; @@ -767,6 +780,8 @@ final class BlockTypeNames{ public const PACKED_ICE = "minecraft:packed_ice"; public const PACKED_MUD = "minecraft:packed_mud"; public const PEARLESCENT_FROGLIGHT = "minecraft:pearlescent_froglight"; + public const PEONY = "minecraft:peony"; + public const PETRIFIED_OAK_SLAB = "minecraft:petrified_oak_slab"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_CARPET = "minecraft:pink_carpet"; @@ -842,6 +857,7 @@ final class BlockTypeNames{ public const QUARTZ_BLOCK = "minecraft:quartz_block"; public const QUARTZ_BRICKS = "minecraft:quartz_bricks"; public const QUARTZ_ORE = "minecraft:quartz_ore"; + public const QUARTZ_SLAB = "minecraft:quartz_slab"; public const QUARTZ_STAIRS = "minecraft:quartz_stairs"; public const RAIL = "minecraft:rail"; public const RAW_COPPER_BLOCK = "minecraft:raw_copper_block"; @@ -875,8 +891,10 @@ final class BlockTypeNames{ public const REPEATING_COMMAND_BLOCK = "minecraft:repeating_command_block"; public const RESERVED6 = "minecraft:reserved6"; public const RESPAWN_ANCHOR = "minecraft:respawn_anchor"; + public const ROSE_BUSH = "minecraft:rose_bush"; public const SAND = "minecraft:sand"; public const SANDSTONE = "minecraft:sandstone"; + public const SANDSTONE_SLAB = "minecraft:sandstone_slab"; public const SANDSTONE_STAIRS = "minecraft:sandstone_stairs"; public const SCAFFOLDING = "minecraft:scaffolding"; public const SCULK = "minecraft:sculk"; @@ -887,6 +905,7 @@ final class BlockTypeNames{ public const SEA_LANTERN = "minecraft:sea_lantern"; public const SEA_PICKLE = "minecraft:sea_pickle"; public const SEAGRASS = "minecraft:seagrass"; + public const SHORT_GRASS = "minecraft:short_grass"; public const SHROOMLIGHT = "minecraft:shroomlight"; public const SILVER_GLAZED_TERRACOTTA = "minecraft:silver_glazed_terracotta"; public const SKULL = "minecraft:skull"; @@ -900,6 +919,7 @@ final class BlockTypeNames{ public const SMOOTH_RED_SANDSTONE_STAIRS = "minecraft:smooth_red_sandstone_stairs"; public const SMOOTH_SANDSTONE_STAIRS = "minecraft:smooth_sandstone_stairs"; public const SMOOTH_STONE = "minecraft:smooth_stone"; + public const SMOOTH_STONE_SLAB = "minecraft:smooth_stone_slab"; public const SNIFFER_EGG = "minecraft:sniffer_egg"; public const SNOW = "minecraft:snow"; public const SNOW_LAYER = "minecraft:snow_layer"; @@ -933,10 +953,10 @@ final class BlockTypeNames{ public const STICKY_PISTON = "minecraft:sticky_piston"; public const STICKY_PISTON_ARM_COLLISION = "minecraft:sticky_piston_arm_collision"; public const STONE = "minecraft:stone"; - public const STONE_BLOCK_SLAB = "minecraft:stone_block_slab"; public const STONE_BLOCK_SLAB2 = "minecraft:stone_block_slab2"; public const STONE_BLOCK_SLAB3 = "minecraft:stone_block_slab3"; public const STONE_BLOCK_SLAB4 = "minecraft:stone_block_slab4"; + public const STONE_BRICK_SLAB = "minecraft:stone_brick_slab"; public const STONE_BRICK_STAIRS = "minecraft:stone_brick_stairs"; public const STONE_BUTTON = "minecraft:stone_button"; public const STONE_PRESSURE_PLATE = "minecraft:stone_pressure_plate"; @@ -967,10 +987,11 @@ final class BlockTypeNames{ public const STRIPPED_WARPED_STEM = "minecraft:stripped_warped_stem"; public const STRUCTURE_BLOCK = "minecraft:structure_block"; public const STRUCTURE_VOID = "minecraft:structure_void"; + public const SUNFLOWER = "minecraft:sunflower"; public const SUSPICIOUS_GRAVEL = "minecraft:suspicious_gravel"; public const SUSPICIOUS_SAND = "minecraft:suspicious_sand"; public const SWEET_BERRY_BUSH = "minecraft:sweet_berry_bush"; - public const TALLGRASS = "minecraft:tallgrass"; + public const TALL_GRASS = "minecraft:tall_grass"; public const TARGET = "minecraft:target"; public const TINTED_GLASS = "minecraft:tinted_glass"; public const TNT = "minecraft:tnt"; @@ -983,6 +1004,7 @@ final class BlockTypeNames{ public const TRIP_WIRE = "minecraft:trip_wire"; public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; public const TUBE_CORAL = "minecraft:tube_coral"; + public const TUBE_CORAL_BLOCK = "minecraft:tube_coral_block"; public const TUBE_CORAL_FAN = "minecraft:tube_coral_fan"; public const TUFF = "minecraft:tuff"; public const TUFF_BRICK_DOUBLE_SLAB = "minecraft:tuff_brick_double_slab"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index e0c570ee4b..ab98e75f36 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -552,6 +552,16 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ Axis::Z => 1, default => throw new BlockStateSerializeException("Invalid axis {$axis}"), })); + + $this->map(Blocks::CORAL_BLOCK(), fn(CoralBlock $block) => Writer::create( + match($block->getCoralType()){ + CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL_BLOCK : Ids::BRAIN_CORAL_BLOCK, + CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL_BLOCK : Ids::BUBBLE_CORAL_BLOCK, + CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL_BLOCK : Ids::FIRE_CORAL_BLOCK, + CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL_BLOCK : Ids::HORN_CORAL_BLOCK, + CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_BLOCK : Ids::TUBE_CORAL_BLOCK, + } + )); } private function registerCauldronSerializers() : void{ @@ -928,6 +938,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::ENCHANTING_TABLE(), Ids::ENCHANTING_TABLE); $this->mapSimple(Blocks::END_STONE(), Ids::END_STONE); $this->mapSimple(Blocks::END_STONE_BRICKS(), Ids::END_BRICKS); + $this->mapSimple(Blocks::FERN(), Ids::FERN); $this->mapSimple(Blocks::FLETCHING_TABLE(), Ids::FLETCHING_TABLE); $this->mapSimple(Blocks::GILDED_BLACKSTONE(), Ids::GILDED_BLACKSTONE); $this->mapSimple(Blocks::GLASS(), Ids::GLASS); @@ -1006,6 +1017,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); $this->mapSimple(Blocks::SPORE_BLOSSOM(), Ids::SPORE_BLOSSOM); $this->mapSimple(Blocks::STONE(), Ids::STONE); + $this->mapSimple(Blocks::TALL_GRASS(), Ids::SHORT_GRASS); //no, this is not a typo - tall_grass is now the double block, just to be confusing :( $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TORCHFLOWER(), Ids::TORCHFLOWER); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); @@ -1136,7 +1148,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST)) ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST)); }); - $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_BRICK)); + $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::BRICK_SLAB, StringValues::STONE_SLAB_TYPE_BRICK)); $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); @@ -1192,7 +1204,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); - $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); + $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::COBBLESTONE_SLAB, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ @@ -1275,11 +1287,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ - return Writer::create(Ids::CORAL_BLOCK) - ->writeBool(StateNames::DEAD_BIT, $block->isDead()) - ->writeCoralType($block->getCoralType()); - }); $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); @@ -1324,7 +1331,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ //ROOTED was already checked above }); }); - $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_GRASS, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::TALL_GRASS))); $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) @@ -1342,13 +1349,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); - $this->map(Blocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_WOOD)); + $this->map(Blocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::PETRIFIED_OAK_SLAB, StringValues::STONE_SLAB_TYPE_WOOD)); $this->map(Blocks::FARMLAND(), function(Farmland $block) : Writer{ return Writer::create(Ids::FARMLAND) ->writeInt(StateNames::MOISTURIZED_AMOUNT, $block->getWetness()); }); - $this->map(Blocks::FERN(), fn() => Writer::create(Ids::TALLGRASS) - ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_FERN)); $this->map(Blocks::FIRE(), function(Fire $block) : Writer{ return Writer::create(Ids::FIRE) ->writeInt(StateNames::AGE, $block->getAge()); @@ -1413,7 +1418,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LANTERN) ->writeBool(StateNames::HANGING, $block->isHanging()); }); - $this->map(Blocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_FERN, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::LARGE_FERN(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::LARGE_FERN))); $this->map(Blocks::LAVA(), fn(Lava $block) => Helper::encodeLiquid($block, Ids::LAVA, Ids::FLOWING_LAVA)); $this->map(Blocks::LECTERN(), function(Lectern $block) : Writer{ return Writer::create(Ids::LECTERN) @@ -1442,7 +1447,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LIGHTNING_ROD) ->writeFacingDirection($block->getFacing()); }); - $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SYRINGA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::LILAC(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::LILAC))); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) ->writeCardinalHorizontalFacing($block->getFacing()); @@ -1471,7 +1476,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writePillarAxis($block->getAxis())); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); - $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); + $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::NETHER_BRICK_SLAB, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ @@ -1486,7 +1491,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::NETHER_WART) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_PAEONIA, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::PEONY(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::PEONY))); $this->map(Blocks::PINK_PETALS(), function(PinkPetals $block) : Writer{ return Writer::create(Ids::PINK_PETALS) ->writeCardinalHorizontalFacing($block->getFacing()) @@ -1562,7 +1567,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::PURPUR_STAIRS(), Ids::PURPUR_STAIRS); $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); - $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_QUARTZ)); + $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::QUARTZ_SLAB, StringValues::STONE_SLAB_TYPE_QUARTZ)); $this->mapStairs(Blocks::QUARTZ_STAIRS(), Ids::QUARTZ_STAIRS); $this->map(Blocks::RAIL(), function(Rail $block) : Writer{ return Writer::create(Ids::RAIL) @@ -1600,11 +1605,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::RED_SANDSTONE_STAIRS(), Ids::RED_SANDSTONE_STAIRS); $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); - $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_ROSE, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::ROSE_BUSH))); $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); $this->map(Blocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); - $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SANDSTONE)); + $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::SANDSTONE_SLAB, StringValues::STONE_SLAB_TYPE_SANDSTONE)); $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ @@ -1627,7 +1632,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); $this->mapStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), Ids::SMOOTH_SANDSTONE_STAIRS); - $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); + $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::SMOOTH_STONE_SLAB, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); $this->map(Blocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ return Writer::create(Ids::SNOW_LAYER) ->writeBool(StateNames::COVERED_BIT, false) @@ -1652,7 +1657,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); - $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); + $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::STONE_BRICK_SLAB, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); $this->mapStairs(Blocks::STONE_BRICK_STAIRS(), Ids::STONE_BRICK_STAIRS); $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); $this->map(Blocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); @@ -1663,13 +1668,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::REEDS) ->writeInt(StateNames::AGE, $block->getAge()); }); - $this->map(Blocks::SUNFLOWER(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER, Writer::create(Ids::DOUBLE_PLANT))); + $this->map(Blocks::SUNFLOWER(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::SUNFLOWER))); $this->map(Blocks::SWEET_BERRY_BUSH(), function(SweetBerryBush $block) : Writer{ return Writer::create(Ids::SWEET_BERRY_BUSH) ->writeInt(StateNames::GROWTH, $block->getAge()); }); - $this->map(Blocks::TALL_GRASS(), fn() => Writer::create(Ids::TALLGRASS) - ->writeString(StateNames::TALL_GRASS_TYPE, StringValues::TALL_GRASS_TYPE_TALL)); $this->map(Blocks::TNT(), function(TNT $block) : Writer{ return Writer::create(Ids::TNT) ->writeBool(StateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index de0964a20c..6dda9fb81a 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -32,6 +32,7 @@ use pocketmine\block\CopperStairs; use pocketmine\block\Crops; use pocketmine\block\DaylightSensor; use pocketmine\block\Door; +use pocketmine\block\DoublePlant; use pocketmine\block\FenceGate; use pocketmine\block\FloorCoralFan; use pocketmine\block\FloorSign; @@ -48,6 +49,7 @@ use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\utils\CopperOxidation; +use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; use pocketmine\block\WallCoralFan; @@ -139,6 +141,12 @@ final class BlockStateDeserializerHelper{ ->setOpen($in->readBool(BlockStateNames::OPEN_BIT)); } + /** @throws BlockStateDeserializeException */ + public static function decodeDoublePlant(DoublePlant $block, BlockStateReader $in) : DoublePlant{ + return $block + ->setTop($in->readBool(BlockStateNames::UPPER_BLOCK_BIT)); + } + /** @throws BlockStateDeserializeException */ public static function decodeFenceGate(FenceGate $block, BlockStateReader $in) : FenceGate{ return $block @@ -233,6 +241,17 @@ final class BlockStateDeserializerHelper{ return $block->setPressed($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15) !== 0); } + /** @throws BlockStateDeserializeException */ + public static function decodeSingleSlab(Slab $block, BlockStateReader $in) : Slab{ + return $block->setSlabType($in->readSlabPosition()); + } + + /** @throws BlockStateDeserializeException */ + public static function decodeDoubleSlab(Slab $block, BlockStateReader $in) : Slab{ + $in->ignored(StateNames::MC_VERTICAL_HALF); + return $block->setSlabType(SlabType::DOUBLE); + } + /** @throws BlockStateDeserializeException */ public static function decodeStairs(Stair $block, BlockStateReader $in) : Stair{ return $block diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 07effd4f99..e3a02885f0 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; -use pocketmine\block\utils\CoralType; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\WallConnectionType; use pocketmine\data\bedrock\block\BlockLegacyMetadata; @@ -309,18 +308,6 @@ final class BlockStateReader{ }; } - /** @throws BlockStateDeserializeException */ - public function readCoralType() : CoralType{ - return match($type = $this->readString(BlockStateNames::CORAL_COLOR)){ - StringValues::CORAL_COLOR_BLUE => CoralType::TUBE, - StringValues::CORAL_COLOR_PINK => CoralType::BRAIN, - StringValues::CORAL_COLOR_PURPLE => CoralType::BUBBLE, - StringValues::CORAL_COLOR_RED => CoralType::FIRE, - StringValues::CORAL_COLOR_YELLOW => CoralType::HORN, - default => throw $this->badValueException(BlockStateNames::CORAL_COLOR, $type), - }; - } - /** @throws BlockStateDeserializeException */ public function readBellAttachmentType() : BellAttachmentType{ return match($type = $this->readString(BlockStateNames::ATTACHMENT)){ diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index a7d5ea774e..a1f417d894 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -107,10 +107,9 @@ final class BlockStateSerializerHelper{ ->writeBool(BlockStateNames::OPEN_BIT, $block->isOpen()); } - public static function encodeDoublePlant(DoublePlant $block, string $doublePlantType, Writer $out) : Writer{ + public static function encodeDoublePlant(DoublePlant $block, Writer $out) : Writer{ return $out - ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()) - ->writeString(BlockStateNames::DOUBLE_PLANT_TYPE, $doublePlantType); + ->writeBool(BlockStateNames::UPPER_BLOCK_BIT, $block->isTop()); } public static function encodeFenceGate(FenceGate $block, Writer $out) : Writer{ @@ -183,11 +182,21 @@ final class BlockStateSerializerHelper{ ->writeInt(BlockStateNames::REDSTONE_SIGNAL, $block->isPressed() ? 15 : 0); } - public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : Writer{ - $slabType = $block->getSlabType(); - return Writer::create($slabType === SlabType::DOUBLE ? $doubleId : $singleId) + private static function encodeSingleSlab(Slab $block, string $id) : Writer{ + return Writer::create($id) + ->writeSlabPosition($block->getSlabType()); + } + + private static function encodeDoubleSlab(Slab $block, string $id) : Writer{ + return Writer::create($id) //this is (intentionally) also written for double slabs (as zero) to maintain bug parity with MCPE - ->writeSlabPosition($slabType === SlabType::DOUBLE ? SlabType::BOTTOM : $slabType); + ->writeSlabPosition(SlabType::BOTTOM); + } + + public static function encodeSlab(Slab $block, string $singleId, string $doubleId) : Writer{ + return $block->getSlabType() === SlabType::DOUBLE ? + self::encodeDoubleSlab($block, $doubleId) : + self::encodeSingleSlab($block, $singleId); } public static function encodeStairs(Stair $block, Writer $out) : Writer{ @@ -215,8 +224,12 @@ final class BlockStateSerializerHelper{ ->writeString($typeKey, $typeValue); } - public static function encodeStoneSlab1(Slab $block, string $typeValue) : Writer{ - return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB, Ids::DOUBLE_STONE_BLOCK_SLAB, BlockStateNames::STONE_SLAB_TYPE, $typeValue); + public static function encodeStoneSlab1(Slab $block, string $singleId, string $doubleTypeValue) : Writer{ + //1.21 made this a mess by flattening single slab IDs but not double ones + return $block->getSlabType() === SlabType::DOUBLE ? + self::encodeDoubleSlab($block, Ids::DOUBLE_STONE_BLOCK_SLAB) + ->writeString(BlockStateNames::STONE_SLAB_TYPE, $doubleTypeValue) : + self::encodeSingleSlab($block, $singleId); } public static function encodeStoneSlab2(Slab $block, string $typeValue) : Writer{ diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 6b0c720f74..4c9ec4b798 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -44,7 +44,6 @@ use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; -use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockLegacyMetadata; @@ -115,11 +114,8 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ * @phpstan-param \Closure(Reader) : Slab $getBlock */ public function mapSlab(string $singleId, string $doubleId, \Closure $getBlock) : void{ - $this->map($singleId, fn(Reader $in) : Slab => $getBlock($in)->setSlabType($in->readSlabPosition())); - $this->map($doubleId, function(Reader $in) use ($getBlock) : Slab{ - $in->ignored(StateNames::MC_VERTICAL_HALF); - return $getBlock($in)->setSlabType(SlabType::DOUBLE); - }); + $this->map($singleId, fn(Reader $in) => Helper::decodeSingleSlab($getBlock($in), $in)); + $this->map($doubleId, fn(Reader $in) => Helper::decodeDoubleSlab($getBlock($in), $in)); } /** @@ -450,6 +446,17 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map($aliveId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(false), $in)); $this->map($deadId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(true), $in)); } + + foreach([ + [CoralType::BRAIN, Ids::BRAIN_CORAL_BLOCK, Ids::DEAD_BRAIN_CORAL_BLOCK], + [CoralType::BUBBLE, Ids::BUBBLE_CORAL_BLOCK, Ids::DEAD_BUBBLE_CORAL_BLOCK], + [CoralType::FIRE, Ids::FIRE_CORAL_BLOCK, Ids::DEAD_FIRE_CORAL_BLOCK], + [CoralType::HORN, Ids::HORN_CORAL_BLOCK, Ids::DEAD_HORN_CORAL_BLOCK], + [CoralType::TUBE, Ids::TUBE_CORAL_BLOCK, Ids::DEAD_TUBE_CORAL_BLOCK], + ] as [$coralType, $aliveId, $deadId]){ + $this->map($aliveId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(false)); + $this->map($deadId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(true)); + } } private function registerCauldronDeserializers() : void{ @@ -819,6 +826,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE()); $this->mapSimple(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS()); $this->mapSimple(Ids::END_STONE, fn() => Blocks::END_STONE()); + $this->mapSimple(Ids::FERN, fn() => Blocks::FERN()); $this->mapSimple(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE()); $this->mapSimple(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE()); $this->mapSimple(Ids::GLASS, fn() => Blocks::GLASS()); @@ -884,6 +892,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6()); $this->mapSimple(Ids::SCULK, fn() => Blocks::SCULK()); $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); + $this->mapSimple(Ids::SHORT_GRASS, fn() => Blocks::TALL_GRASS()); //no, this is not a typo - tall_grass is now the double block, just to be confusing :( $this->mapSimple(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT()); $this->mapSimple(Ids::SLIME, fn() => Blocks::SLIME()); $this->mapSimple(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); @@ -1109,11 +1118,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); - $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ - return Blocks::CORAL_BLOCK() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(StateNames::DEAD_BIT)); - }); $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN : CoralType::TUBE)); $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) @@ -1154,17 +1158,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); }); $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); - $this->map(Ids::DOUBLE_PLANT, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::DOUBLE_PLANT_TYPE)){ - StringValues::DOUBLE_PLANT_TYPE_FERN => Blocks::LARGE_FERN(), - StringValues::DOUBLE_PLANT_TYPE_GRASS => Blocks::DOUBLE_TALLGRASS(), - StringValues::DOUBLE_PLANT_TYPE_PAEONIA => Blocks::PEONY(), - StringValues::DOUBLE_PLANT_TYPE_ROSE => Blocks::ROSE_BUSH(), - StringValues::DOUBLE_PLANT_TYPE_SUNFLOWER => Blocks::SUNFLOWER(), - StringValues::DOUBLE_PLANT_TYPE_SYRINGA => Blocks::LILAC(), - default => throw $in->badValueException(StateNames::DOUBLE_PLANT_TYPE, $type), - })->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); - }); + $this->map(Ids::LARGE_FERN, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LARGE_FERN(), $in)); + $this->map(Ids::TALL_GRASS, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::DOUBLE_TALLGRASS(), $in)); + $this->map(Ids::PEONY, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::PEONY(), $in)); + $this->map(Ids::ROSE_BUSH, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::ROSE_BUSH(), $in)); + $this->map(Ids::SUNFLOWER, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::SUNFLOWER(), $in)); + $this->map(Ids::LILAC, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LILAC(), $in)); $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() @@ -1552,7 +1551,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); - $this->mapSlab(Ids::STONE_BLOCK_SLAB, Ids::DOUBLE_STONE_BLOCK_SLAB, fn(Reader $in) => Helper::mapStoneSlab1Type($in)); + + //mess for partially flattened slabs - the single IDs were flattened but not the double ones + $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, fn(Reader $in) => Helper::decodeDoubleSlab(Helper::mapStoneSlab1Type($in), $in)); + $this->map(Ids::BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::BRICK_SLAB(), $in)); + $this->map(Ids::COBBLESTONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::COBBLESTONE_SLAB(), $in)); + $this->map(Ids::NETHER_BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::NETHER_BRICK_SLAB(), $in)); + $this->map(Ids::PETRIFIED_OAK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::FAKE_WOODEN_SLAB(), $in)); + $this->map(Ids::QUARTZ_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::QUARTZ_SLAB(), $in)); + $this->map(Ids::SANDSTONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::SANDSTONE_SLAB(), $in)); + $this->map(Ids::SMOOTH_STONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::SMOOTH_STONE_SLAB(), $in)); + $this->map(Ids::STONE_BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::STONE_BRICK_SLAB(), $in)); + $this->mapSlab(Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)); $this->mapSlab(Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)); $this->mapSlab(Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)); @@ -1577,13 +1587,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::SWEET_BERRY_BUSH() ->setAge(min($growth, SweetBerryBush::STAGE_MATURE)); }); - $this->map(Ids::TALLGRASS, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::TALL_GRASS_TYPE)){ - StringValues::TALL_GRASS_TYPE_DEFAULT, StringValues::TALL_GRASS_TYPE_SNOW, StringValues::TALL_GRASS_TYPE_TALL => Blocks::TALL_GRASS(), - StringValues::TALL_GRASS_TYPE_FERN => Blocks::FERN(), - default => throw $in->badValueException(StateNames::TALL_GRASS_TYPE, $type), - }; - }); $this->map(Ids::TNT, function(Reader $in) : Block{ return Blocks::TNT() ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index 33e82a5c02..63af92d100 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\utils\BellAttachmentType; -use pocketmine\block\utils\CoralType; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\WallConnectionType; use pocketmine\data\bedrock\block\BlockLegacyMetadata; @@ -256,18 +255,6 @@ final class BlockStateWriter{ return $this; } - /** @return $this */ - public function writeCoralType(CoralType $coralType) : self{ - $this->writeString(BlockStateNames::CORAL_COLOR, match($coralType){ - CoralType::TUBE => StringValues::CORAL_COLOR_BLUE, - CoralType::BRAIN => StringValues::CORAL_COLOR_PINK, - CoralType::BUBBLE => StringValues::CORAL_COLOR_PURPLE, - CoralType::FIRE => StringValues::CORAL_COLOR_RED, - CoralType::HORN => StringValues::CORAL_COLOR_YELLOW, - }); - return $this; - } - /** @return $this */ public function writeBellAttachmentType(BellAttachmentType $attachmentType) : self{ $this->writeString(BlockStateNames::ATTACHMENT, match($attachmentType){ diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index cadbb7aa6b..c2bc71caf1 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -143,6 +143,7 @@ final class ItemTypeNames{ public const COPPER_DOOR = "minecraft:copper_door"; public const COPPER_INGOT = "minecraft:copper_ingot"; public const CORAL = "minecraft:coral"; + public const CORAL_BLOCK = "minecraft:coral_block"; public const CORAL_FAN = "minecraft:coral_fan"; public const CORAL_FAN_DEAD = "minecraft:coral_fan_dead"; public const COW_SPAWN_EGG = "minecraft:cow_spawn_egg"; @@ -173,6 +174,7 @@ final class ItemTypeNames{ public const DISC_FRAGMENT_5 = "minecraft:disc_fragment_5"; public const DOLPHIN_SPAWN_EGG = "minecraft:dolphin_spawn_egg"; public const DONKEY_SPAWN_EGG = "minecraft:donkey_spawn_egg"; + public const DOUBLE_PLANT = "minecraft:double_plant"; public const DRAGON_BREATH = "minecraft:dragon_breath"; public const DRIED_KELP = "minecraft:dried_kelp"; public const DROWNED_SPAWN_EGG = "minecraft:drowned_spawn_egg"; @@ -331,11 +333,14 @@ final class ItemTypeNames{ public const MUSIC_DISC_BLOCKS = "minecraft:music_disc_blocks"; public const MUSIC_DISC_CAT = "minecraft:music_disc_cat"; public const MUSIC_DISC_CHIRP = "minecraft:music_disc_chirp"; + public const MUSIC_DISC_CREATOR = "minecraft:music_disc_creator"; + public const MUSIC_DISC_CREATOR_MUSIC_BOX = "minecraft:music_disc_creator_music_box"; public const MUSIC_DISC_FAR = "minecraft:music_disc_far"; public const MUSIC_DISC_MALL = "minecraft:music_disc_mall"; public const MUSIC_DISC_MELLOHI = "minecraft:music_disc_mellohi"; public const MUSIC_DISC_OTHERSIDE = "minecraft:music_disc_otherside"; public const MUSIC_DISC_PIGSTEP = "minecraft:music_disc_pigstep"; + public const MUSIC_DISC_PRECIPICE = "minecraft:music_disc_precipice"; public const MUSIC_DISC_RELIC = "minecraft:music_disc_relic"; public const MUSIC_DISC_STAL = "minecraft:music_disc_stal"; public const MUSIC_DISC_STRAD = "minecraft:music_disc_strad"; @@ -366,6 +371,8 @@ final class ItemTypeNames{ public const OAK_HANGING_SIGN = "minecraft:oak_hanging_sign"; public const OAK_SIGN = "minecraft:oak_sign"; public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg"; + public const OMINOUS_BOTTLE = "minecraft:ominous_bottle"; + public const OMINOUS_TRIAL_KEY = "minecraft:ominous_trial_key"; public const ORANGE_DYE = "minecraft:orange_dye"; public const OXIDIZED_COPPER_DOOR = "minecraft:oxidized_copper_door"; public const PAINTING = "minecraft:painting"; @@ -467,6 +474,7 @@ final class ItemTypeNames{ public const STAINED_HARDENED_CLAY = "minecraft:stained_hardened_clay"; public const STICK = "minecraft:stick"; public const STONE_AXE = "minecraft:stone_axe"; + public const STONE_BLOCK_SLAB = "minecraft:stone_block_slab"; public const STONE_HOE = "minecraft:stone_hoe"; public const STONE_PICKAXE = "minecraft:stone_pickaxe"; public const STONE_SHOVEL = "minecraft:stone_shovel"; @@ -480,6 +488,7 @@ final class ItemTypeNames{ public const SWEET_BERRIES = "minecraft:sweet_berries"; public const TADPOLE_BUCKET = "minecraft:tadpole_bucket"; public const TADPOLE_SPAWN_EGG = "minecraft:tadpole_spawn_egg"; + public const TALLGRASS = "minecraft:tallgrass"; public const TIDE_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:tide_armor_trim_smithing_template"; public const TNT_MINECART = "minecraft:tnt_minecart"; public const TORCHFLOWER_SEEDS = "minecraft:torchflower_seeds"; diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index e2b71ab310..8c0d5b6e61 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -96,6 +96,7 @@ class InventoryManager{ private array $complexSlotToInventoryMap = []; private int $lastInventoryNetworkId = ContainerIds::FIRST; + private int $currentWindowType = WindowTypes::CONTAINER; private int $clientSelectedHotbarSlot = -1; @@ -327,9 +328,15 @@ class InventoryManager{ foreach($this->containerOpenCallbacks as $callback){ $pks = $callback($windowId, $inventory); if($pks !== null){ + $windowType = null; foreach($pks as $pk){ + if($pk instanceof ContainerOpenPacket){ + //workaround useless bullshit in 1.21 - ContainerClose requires a type now for some reason + $windowType = $pk->windowType; + } $this->session->sendDataPacket($pk); } + $this->currentWindowType = $windowType ?? WindowTypes::CONTAINER; $this->syncContents($inventory); return; } @@ -378,10 +385,11 @@ class InventoryManager{ $this->openWindowDeferred(function() : void{ $windowId = $this->getNewWindowId(); $this->associateIdWithInventory($windowId, $this->player->getInventory()); + $this->currentWindowType = WindowTypes::INVENTORY; $this->session->sendDataPacket(ContainerOpenPacket::entityInv( $windowId, - WindowTypes::INVENTORY, + $this->currentWindowType, $this->player->getId() )); }); @@ -390,7 +398,7 @@ class InventoryManager{ public function onCurrentWindowRemove() : void{ if(isset($this->networkIdToInventoryMap[$this->lastInventoryNetworkId])){ $this->remove($this->lastInventoryNetworkId); - $this->session->sendDataPacket(ContainerClosePacket::create($this->lastInventoryNetworkId, true)); + $this->session->sendDataPacket(ContainerClosePacket::create($this->lastInventoryNetworkId, $this->currentWindowType, true)); if($this->pendingCloseWindowId !== null){ throw new AssumptionFailedError("We should not have opened a new window while a window was waiting to be closed"); } @@ -411,7 +419,7 @@ class InventoryManager{ //Always send this, even if no window matches. If we told the client to close a window, it will behave as if it //initiated the close and expect an ack. - $this->session->sendDataPacket(ContainerClosePacket::create($id, false)); + $this->session->sendDataPacket(ContainerClosePacket::create($id, $this->currentWindowType, false)); if($this->pendingCloseWindowId === $id){ $this->pendingCloseWindowId = null; diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index c4a5578633..29f37590e3 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -36,6 +36,7 @@ use pocketmine\network\mcpe\protocol\types\recipe\FurnaceRecipeBlockName; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\PotionContainerChangeRecipe as ProtocolPotionContainerChangeRecipe; use pocketmine\network\mcpe\protocol\types\recipe\PotionTypeRecipe as ProtocolPotionTypeRecipe; +use pocketmine\network\mcpe\protocol\types\recipe\RecipeUnlockingRequirement; use pocketmine\network\mcpe\protocol\types\recipe\ShapedRecipe as ProtocolShapedRecipe; use pocketmine\network\mcpe\protocol\types\recipe\ShapelessRecipe as ProtocolShapelessRecipe; use pocketmine\timings\Timings; @@ -79,6 +80,7 @@ final class CraftingDataCache{ $converter = TypeConverter::getInstance(); $recipesWithTypeIds = []; + $noUnlockingRequirement = new RecipeUnlockingRequirement(null); foreach($manager->getCraftingRecipeIndex() as $index => $recipe){ if($recipe instanceof ShapelessRecipe){ $typeTag = match($recipe->getType()){ @@ -95,6 +97,7 @@ final class CraftingDataCache{ $nullUUID, $typeTag, 50, + $noUnlockingRequirement, $index ); }elseif($recipe instanceof ShapedRecipe){ @@ -114,6 +117,7 @@ final class CraftingDataCache{ CraftingRecipeBlockName::CRAFTING_TABLE, 50, true, + $noUnlockingRequirement, $index, ); }else{ diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 924021d7e2..9dc89ad996 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 671; + public const CURRENT_STORAGE_NETWORK_VERSION = 685; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major - 20, //minor - 80, //patch - 5, //revision + 21, //minor + 0, //patch + 3, //revision 0 //is beta ]; diff --git a/tests/phpunit/data/bedrock/block/BlockStateDataTest.php b/tests/phpunit/data/bedrock/block/BlockStateDataTest.php index 836edfc38f..96202753bb 100644 --- a/tests/phpunit/data/bedrock/block/BlockStateDataTest.php +++ b/tests/phpunit/data/bedrock/block/BlockStateDataTest.php @@ -39,7 +39,19 @@ final class BlockStateDataTest extends TestCase{ ) as $schema){ $expected = BlockStateData::CURRENT_VERSION; $actual = $schema->getVersionId(); - self::assertLessThanOrEqual($expected, $actual, "Schema version $actual is newer than the current version $expected"); + self::assertLessThanOrEqual($expected, $actual, sprintf( + "Schema version %d (%d.%d.%d.%d) is newer than the current version %d (%d.%d.%d.%d)", + $actual, + ($actual >> 24) & 0xff, + ($actual >> 16) & 0xff, + ($actual >> 8) & 0xff, + $actual & 0xff, + $expected, + ($expected >> 24) & 0xff, + ($expected >> 16) & 0xff, + ($expected >> 8) & 0xff, + $expected & 0xff + )); } } } diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 795e7ad1fd..16c3062b84 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -195,7 +195,7 @@ class ParserPacketHandler extends PacketHandler{ * @return mixed[] */ private static function objectToOrderedArray(object $object) : array{ - $result = (array) $object; + $result = (array) ($object instanceof \JsonSerializable ? $object->jsonSerialize() : $object); ksort($result, SORT_STRING); foreach($result as $property => $value){ @@ -335,21 +335,25 @@ class ParserPacketHandler extends PacketHandler{ } } } + $unlockingIngredients = $entry->getUnlockingRequirement()->getUnlockingIngredients(); return new ShapedRecipeData( array_map(fn(array $array) => implode('', $array), $shape), $outputsByKey, array_map(fn(ItemStack $output) => $this->itemStackToJson($output), $entry->getOutput()), $entry->getBlockName(), - $entry->getPriority() + $entry->getPriority(), + $unlockingIngredients !== null ? array_map(fn(RecipeIngredient $input) => $this->recipeIngredientToJson($input), $unlockingIngredients) : [] ); } private function shapelessRecipeToJson(ShapelessRecipe $recipe) : ShapelessRecipeData{ + $unlockingIngredients = $recipe->getUnlockingRequirement()->getUnlockingIngredients(); return new ShapelessRecipeData( array_map(fn(RecipeIngredient $input) => $this->recipeIngredientToJson($input), $recipe->getInputs()), array_map(fn(ItemStack $output) => $this->itemStackToJson($output), $recipe->getOutputs()), $recipe->getBlockName(), - $recipe->getPriority() + $recipe->getPriority(), + $unlockingIngredients !== null ? array_map(fn(RecipeIngredient $input) => $this->recipeIngredientToJson($input), $unlockingIngredients) : [] ); } From 0ec8465fcfb795e2b17d0b79d9dbd5d7b2a7d36b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2024 18:43:10 +0100 Subject: [PATCH 1721/1858] shut! --- tests/phpunit/data/bedrock/block/BlockStateDataTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/phpunit/data/bedrock/block/BlockStateDataTest.php b/tests/phpunit/data/bedrock/block/BlockStateDataTest.php index 96202753bb..7add2eddae 100644 --- a/tests/phpunit/data/bedrock/block/BlockStateDataTest.php +++ b/tests/phpunit/data/bedrock/block/BlockStateDataTest.php @@ -27,6 +27,7 @@ use PHPUnit\Framework\TestCase; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use Symfony\Component\Filesystem\Path; +use function sprintf; use const PHP_INT_MAX; use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; From 22a1549998ef0e4668ed48838900ad84258fe04a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2024 18:55:18 +0100 Subject: [PATCH 1722/1858] Release 5.16.0 --- changelogs/5.16.md | 26 ++++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.16.md diff --git a/changelogs/5.16.md b/changelogs/5.16.md new file mode 100644 index 0000000000..8b4251d76d --- /dev/null +++ b/changelogs/5.16.md @@ -0,0 +1,26 @@ +# 5.16.0 +Released 13th June 2024. + +**For Minecraft: Bedrock Edition 1.21.0** + +This is a support release for Minecraft: Bedrock Edition 1.21.0. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.21.0. +- Removed support for earlier versions. +- Generated permission docs are now included with every release. +- Crash throttle message (which appears when the server crashed after being up for less than 120 seconds) now shows the server uptime as well as the wait time. This should make it clearer how the wait time is decided. + +## Tools +- Added `install-local-protocol.sh` script. This allows installing local copies of protocol dependencies without needing to create releases. Useful for integration testing when doing protocol updates. + +## Fixes +- Attacking an entity with a higher damage weapon while it's on attack cooldown from a lower damage weapon (switching) no longer causes additional knockback to the victim. +- Wooden stairs can now be used as fuel in furnaces. +- Fixed incorrect description of the permission `pocketmine.command.save.perform`. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a7d4111afd..c6f88d59b5 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.15.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.16.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 433bd6a8aa4ecad867cb27a751e9dec7b8bf9b80 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2024 18:55:21 +0100 Subject: [PATCH 1723/1858] 5.16.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index c6f88d59b5..9b935f8a09 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.16.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.16.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 585aee9386a787c95e73dd0a05ffca8329606b68 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2024 18:58:32 +0100 Subject: [PATCH 1724/1858] Fixed an oopsie from 5ef247620a7c6301a849b54e5ef1009217729fc8 I added it to the wrong set of artifacts :( --- .github/workflows/draft-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index d8a972585d..311e0c8279 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -92,7 +92,7 @@ jobs: - name: Create draft release uses: ncipollo/release-action@v1.14.0 with: - artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json + artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json,${{ github.workspace }}/core-permissions.rst commit: ${{ github.sha }} draft: true prerelease: ${{ steps.get-pm-version.outputs.PRERELEASE }} From b342c497d1f985079f6632930eefc0fd64362ac8 Mon Sep 17 00:00:00 2001 From: ipad54 Date: Sun, 23 Jun 2024 13:27:52 +0300 Subject: [PATCH 1725/1858] Added 1.21 banner patterns. --- src/block/utils/BannerPatternType.php | 2 ++ src/data/bedrock/BannerPatternTypeIdMap.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/block/utils/BannerPatternType.php b/src/block/utils/BannerPatternType.php index cd63226a75..9b19636033 100644 --- a/src/block/utils/BannerPatternType.php +++ b/src/block/utils/BannerPatternType.php @@ -81,10 +81,12 @@ enum BannerPatternType{ case DIAGONAL_RIGHT; case DIAGONAL_UP_LEFT; case DIAGONAL_UP_RIGHT; + case FLOW; case FLOWER; case GLOBE; case GRADIENT; case GRADIENT_UP; + case GUSTER; case HALF_HORIZONTAL; case HALF_HORIZONTAL_BOTTOM; case HALF_VERTICAL; diff --git a/src/data/bedrock/BannerPatternTypeIdMap.php b/src/data/bedrock/BannerPatternTypeIdMap.php index d1884350fa..7d4353d4f2 100644 --- a/src/data/bedrock/BannerPatternTypeIdMap.php +++ b/src/data/bedrock/BannerPatternTypeIdMap.php @@ -56,9 +56,11 @@ final class BannerPatternTypeIdMap{ BannerPatternType::DIAGONAL_UP_LEFT => "ld", BannerPatternType::DIAGONAL_UP_RIGHT => "rud", BannerPatternType::FLOWER => "flo", + BannerPatternType::FLOW => "flw", BannerPatternType::GLOBE => "glb", BannerPatternType::GRADIENT => "gra", BannerPatternType::GRADIENT_UP => "gru", + BannerPatternType::GUSTER => "gus", BannerPatternType::HALF_HORIZONTAL => "hh", BannerPatternType::HALF_HORIZONTAL_BOTTOM => "hhb", BannerPatternType::HALF_VERTICAL => "vh", From af4294295ba091204fa872b5f10a1d3f7220621d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:19:24 +0000 Subject: [PATCH 1726/1858] Bump symfony/filesystem from 6.4.7 to 6.4.9 Bumps [symfony/filesystem](https://github.com/symfony/filesystem) from 6.4.7 to 6.4.9. - [Release notes](https://github.com/symfony/filesystem/releases) - [Changelog](https://github.com/symfony/filesystem/blob/7.1/CHANGELOG.md) - [Commits](https://github.com/symfony/filesystem/compare/v6.4.7...v6.4.9) --- updated-dependencies: - dependency-name: symfony/filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- composer.lock | 103 +++++++++++--------------------------------------- 1 file changed, 22 insertions(+), 81 deletions(-) diff --git a/composer.lock b/composer.lock index b2f82093b9..9b9c517569 100644 --- a/composer.lock +++ b/composer.lock @@ -926,23 +926,25 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4" + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/78dde75f8f6dbbca4ec436a4b0087f7af02076d4", - "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/process": "^5.4|^6.4" + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -970,7 +972,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.7" + "source": "https://github.com/symfony/filesystem/tree/v6.4.9" }, "funding": [ { @@ -986,20 +988,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -1049,7 +1051,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -1065,20 +1067,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -1129,7 +1131,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -1145,68 +1147,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/process", - "version": "v6.4.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v6.4.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-19T12:30:46+00:00" } ], "packages-dev": [ From 25ea9b2218284daed3a786cb15e0c2e4291dced6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:53:54 +0000 Subject: [PATCH 1727/1858] Bump phpunit/phpunit from 10.3.5 to 10.5.24 Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 10.3.5 to 10.5.24. - [Release notes](https://github.com/sebastianbergmann/phpunit/releases) - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/10.5.24/ChangeLog-10.5.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/10.3.5...10.5.24) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- composer.lock | 43 ++++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/composer.json b/composer.json index f14070552d..dbc1b1354c 100644 --- a/composer.json +++ b/composer.json @@ -55,7 +55,7 @@ "phpstan/phpstan": "1.11.2", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", - "phpunit/phpunit": "~10.3.0 || ~10.2.0 || ~10.1.0" + "phpunit/phpunit": "^10.5.24" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 9b9c517569..ce8d52e266 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "941b6d463cb044438aa7908b76f7a6bb", + "content-hash": "6254ce9a454f8c9acd4936512c4d315a", "packages": [ { "name": "adhocore/json-comment", @@ -1153,16 +1153,16 @@ "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -1170,11 +1170,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -1200,7 +1201,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -1208,7 +1209,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", @@ -1547,16 +1548,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -1613,7 +1614,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -1621,7 +1622,7 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1868,16 +1869,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.5", + "version": "10.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" + "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f124e3e3e561006047b532fd0431bf5bb6b9015", + "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015", "shasum": "" }, "require": { @@ -1917,7 +1918,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -1949,7 +1950,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.24" }, "funding": [ { @@ -1965,7 +1966,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:42:37+00:00" + "time": "2024-06-20T13:09:54+00:00" }, { "name": "sebastian/cli-parser", From 20f5741ed751bbd49cf03236520e55b0a578c21a Mon Sep 17 00:00:00 2001 From: Hugo_ <55756021+Dhaiven@users.noreply.github.com> Date: Sat, 6 Jul 2024 00:41:22 +0200 Subject: [PATCH 1728/1858] Bowl: Add fuel return value (#6384) --- src/item/Bowl.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/item/Bowl.php b/src/item/Bowl.php index d83044307d..217346df54 100644 --- a/src/item/Bowl.php +++ b/src/item/Bowl.php @@ -25,5 +25,7 @@ namespace pocketmine\item; class Bowl extends Item{ - //TODO: check fuel + public function getFuelTime() : int{ + return 200; + } } From 2ffc38c835466ee9b202448b456fb99860aac9c3 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sun, 7 Jul 2024 23:01:34 +0300 Subject: [PATCH 1729/1858] Implement campfire & soul campfire (#4696) --- src/block/BlockTypeIds.php | 4 +- src/block/Campfire.php | 277 ++++++++++++++++++ src/block/SoulCampfire.php | 48 +++ src/block/VanillaBlocks.php | 8 + src/block/inventory/CampfireInventory.php | 40 +++ src/block/tile/Campfire.php | 143 +++++++++ src/block/tile/TileFactory.php | 2 +- .../CraftingManagerFromDataHelper.php | 3 +- src/crafting/FurnaceType.php | 6 + .../convert/BlockObjectToStateSerializer.php | 12 + .../BlockStateToObjectDeserializer.php | 10 + .../ItemSerializerDeserializerRegistrar.php | 2 + src/event/block/CampfireCookEvent.php | 63 ++++ src/item/StringToItemParser.php | 2 + src/network/mcpe/cache/CraftingDataCache.php | 2 + src/world/sound/CampfireSound.php | 35 +++ tests/phpstan/configs/actual-problems.neon | 5 + .../block_factory_consistency_check.json | 2 + 18 files changed, 661 insertions(+), 3 deletions(-) create mode 100644 src/block/Campfire.php create mode 100644 src/block/SoulCampfire.php create mode 100644 src/block/inventory/CampfireInventory.php create mode 100644 src/block/tile/Campfire.php create mode 100644 src/event/block/CampfireCookEvent.php create mode 100644 src/world/sound/CampfireSound.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index dec31eff11..59c3584890 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -745,8 +745,10 @@ final class BlockTypeIds{ public const PITCHER_PLANT = 10715; public const PITCHER_CROP = 10716; public const DOUBLE_PITCHER_CROP = 10717; + public const CAMPFIRE = 10718; + public const SOUL_CAMPFIRE = 10719; - public const FIRST_UNUSED_BLOCK_ID = 10718; + public const FIRST_UNUSED_BLOCK_ID = 10720; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/Campfire.php b/src/block/Campfire.php new file mode 100644 index 0000000000..ce759ee87f --- /dev/null +++ b/src/block/Campfire.php @@ -0,0 +1,277 @@ + ticks + * @phpstan-var array + */ + protected array $cookingTimes = []; + + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ + $this->encodeFacingState($w); + $this->encodeLitState($w); + } + + public function readStateFromWorld() : Block{ + parent::readStateFromWorld(); + $tile = $this->position->getWorld()->getTile($this->position); + if($tile instanceof TileCampfire){ + $this->inventory = $tile->getInventory(); + $this->cookingTimes = $tile->getCookingTimes(); + }else{ + $this->inventory = new CampfireInventory($this->position); + } + + return $this; + } + + public function writeStateToWorld() : void{ + parent::writeStateToWorld(); + $tile = $this->position->getWorld()->getTile($this->position); + if($tile instanceof TileCampfire){ + $tile->setCookingTimes($this->cookingTimes); + } + } + + public function hasEntityCollision() : bool{ + return true; + } + + public function getLightLevel() : int{ + return $this->lit ? 15 : 0; + } + + public function isAffectedBySilkTouch() : bool{ + return true; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [ + VanillaItems::CHARCOAL()->setCount(2) + ]; + } + + public function getSupportType(int $facing) : SupportType{ + return SupportType::NONE; + } + + protected function recalculateCollisionBoxes() : array{ + return [AxisAlignedBB::one()->trim(Facing::UP, 9 / 16)]; + } + + public function getInventory() : CampfireInventory{ + return $this->inventory; + } + + protected function getFurnaceType() : FurnaceType{ + return FurnaceType::CAMPFIRE; + } + + protected function getEntityCollisionDamage() : int{ + return 1; + } + + /** + * Sets the number of ticks during the item in the given slot has been cooked. + */ + public function setCookingTime(int $slot, int $time) : void{ + if($slot < 0 || $slot > 3){ + throw new \InvalidArgumentException("Slot must be in range 0-3"); + } + if($time < 0 || $time > $this->getFurnaceType()->getCookDurationTicks()){ + throw new \InvalidArgumentException("CookingTime must be in range 0-" . $this->getFurnaceType()->getCookDurationTicks()); + } + $this->cookingTimes[$slot] = $time; + } + + /** + * Returns the number of ticks during the item in the given slot has been cooked. + */ + public function getCookingTime(int $slot) : int{ + return $this->cookingTimes[$slot] ?? 0; + } + + public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ + if($this->getSide(Facing::DOWN) instanceof Campfire){ + return false; + } + if($player !== null){ + $this->facing = $player->getHorizontalFacing(); + } + $this->lit = true; + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if(!$this->lit){ + if($item->getTypeId() === ItemTypeIds::FIRE_CHARGE){ + $item->pop(); + $this->ignite(); + $this->position->getWorld()->addSound($this->position, new BlazeShootSound()); + return true; + }elseif($item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){ + if($item instanceof Durable){ + $item->applyDamage(1); + } + $this->ignite(); + return true; + } + }elseif($item instanceof Shovel){ + $item->applyDamage(1); + $this->extinguish(); + return true; + } + + if($this->position->getWorld()->getServer()->getCraftingManager()->getFurnaceRecipeManager($this->getFurnaceType())->match($item) !== null){ + $ingredient = clone $item; + $ingredient->setCount(1); + if(count($this->inventory->addItem($ingredient)) === 0){ + $item->pop(); + $this->position->getWorld()->addSound($this->position, new ItemFrameAddItemSound()); + return true; + } + } + return false; + } + + public function onNearbyBlockChange() : void{ + if($this->lit && $this->getSide(Facing::UP)->getTypeId() === BlockTypeIds::WATER){ + $this->extinguish(); + //TODO: Waterlogging + } + } + + public function onEntityInside(Entity $entity) : bool{ + if(!$this->lit){ + if($entity->isOnFire()){ + $this->ignite(); + return false; + } + }elseif($entity instanceof Living){ + $entity->attack(new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_FIRE, $this->getEntityCollisionDamage())); + } + return true; + } + + public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{ + if($this->lit && $projectile instanceof SplashPotion && $projectile->getPotionType() === PotionType::WATER){ + $this->extinguish(); + } + } + + public function onScheduledUpdate() : void{ + if($this->lit){ + $items = $this->inventory->getContents(); + $furnaceType = $this->getFurnaceType(); + $maxCookDuration = $furnaceType->getCookDurationTicks(); + foreach($items as $slot => $item){ + $this->setCookingTime($slot, min($maxCookDuration, $this->getCookingTime($slot) + self::UPDATE_INTERVAL_TICKS)); + if($this->getCookingTime($slot) >= $maxCookDuration){ + $result = + ($recipe = $this->position->getWorld()->getServer()->getCraftingManager()->getFurnaceRecipeManager($furnaceType)->match($item)) instanceof FurnaceRecipe ? + $recipe->getResult() : + VanillaItems::AIR(); + + $ev = new CampfireCookEvent($this, $slot, $item, $result); + $ev->call(); + + if ($ev->isCancelled()){ + continue; + } + + $this->inventory->setItem($slot, VanillaItems::AIR()); + $this->setCookingTime($slot, 0); + $this->position->getWorld()->dropItem($this->position->add(0.5, 1, 0.5), $ev->getResult()); + } + } + if(count($items) > 0){ + $this->position->getWorld()->setBlock($this->position, $this); + } + if(mt_rand(1, 6) === 1){ + $this->position->getWorld()->addSound($this->position, $furnaceType->getCookSound()); + } + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, self::UPDATE_INTERVAL_TICKS); + } + } + + private function extinguish() : void{ + $this->position->getWorld()->addSound($this->position, new FireExtinguishSound()); + $this->position->getWorld()->setBlock($this->position, $this->setLit(false)); + } + + private function ignite() : void{ + $this->position->getWorld()->addSound($this->position, new FlintSteelSound()); + $this->position->getWorld()->setBlock($this->position, $this->setLit(true)); + $this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, self::UPDATE_INTERVAL_TICKS); + } +} diff --git a/src/block/SoulCampfire.php b/src/block/SoulCampfire.php new file mode 100644 index 0000000000..a9c8fc918f --- /dev/null +++ b/src/block/SoulCampfire.php @@ -0,0 +1,48 @@ +lit ? 10 : 0; + } + + public function getDropsForCompatibleTool(Item $item) : array{ + return [ + VanillaBlocks::SOUL_SOIL()->asItem() + ]; + } + + protected function getEntityCollisionDamage() : int{ + return 2; + } + + protected function getFurnaceType() : FurnaceType{ + return FurnaceType::SOUL_CAMPFIRE; + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 9c0e7d3b7c..7733f43593 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -36,6 +36,7 @@ use pocketmine\block\tile\Bed as TileBed; use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\tile\BlastFurnace as TileBlastFurnace; use pocketmine\block\tile\BrewingStand as TileBrewingStand; +use pocketmine\block\tile\Campfire as TileCampfire; use pocketmine\block\tile\Cauldron as TileCauldron; use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\ChiseledBookshelf as TileChiseledBookshelf; @@ -154,6 +155,7 @@ use function strtolower; * @method static CakeWithCandle CAKE_WITH_CANDLE() * @method static CakeWithDyedCandle CAKE_WITH_DYED_CANDLE() * @method static Opaque CALCITE() + * @method static Campfire CAMPFIRE() * @method static Candle CANDLE() * @method static Carpet CARPET() * @method static Carrot CARROTS() @@ -685,6 +687,7 @@ use function strtolower; * @method static Slab SMOOTH_STONE_SLAB() * @method static Snow SNOW() * @method static SnowLayer SNOW_LAYER() + * @method static SoulCampfire SOUL_CAMPFIRE() * @method static SoulFire SOUL_FIRE() * @method static Lantern SOUL_LANTERN() * @method static SoulSand SOUL_SAND() @@ -826,6 +829,11 @@ final class VanillaBlocks{ self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new Info(new BreakInfo(0.4), [Tags::POTTABLE_PLANTS]))); self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new Info(new BreakInfo(0.5)))); + + $campfireBreakInfo = new Info(BreakInfo::axe(2.0)); + self::register("campfire", new Campfire(new BID(Ids::CAMPFIRE, TileCampfire::class), "Campfire", $campfireBreakInfo)); + self::register("soul_campfire", new SoulCampfire(new BID(Ids::SOUL_CAMPFIRE, TileCampfire::class), "Soul Campfire", $campfireBreakInfo)); + self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", new Info(BreakInfo::instant()))); $chestBreakInfo = new Info(BreakInfo::axe(2.5)); diff --git a/src/block/inventory/CampfireInventory.php b/src/block/inventory/CampfireInventory.php new file mode 100644 index 0000000000..ae762473e2 --- /dev/null +++ b/src/block/inventory/CampfireInventory.php @@ -0,0 +1,40 @@ +holder = $holder; + parent::__construct(4); + } + + public function getMaxStackSize() : int{ + return 1; + } +} diff --git a/src/block/tile/Campfire.php b/src/block/tile/Campfire.php new file mode 100644 index 0000000000..ad4a193d7b --- /dev/null +++ b/src/block/tile/Campfire.php @@ -0,0 +1,143 @@ + */ + private array $cookingTimes = []; + + public function __construct(World $world, Vector3 $pos){ + parent::__construct($world, $pos); + $this->inventory = new CampfireInventory($this->position); + $this->inventory->getListeners()->add(CallbackInventoryListener::onAnyChange( + static function(Inventory $unused) use ($world, $pos) : void{ + $block = $world->getBlock($pos); + if($block instanceof BlockCampfire){ + $world->setBlock($pos, $block); + } + }) + ); + } + + public function getInventory() : CampfireInventory{ + return $this->inventory; + } + + public function getRealInventory() : CampfireInventory{ + return $this->inventory; + } + + /** + * @return int[] + * @phpstan-return array + */ + public function getCookingTimes() : array{ + return $this->cookingTimes; + } + + /** + * @param int[] $cookingTimes + * @phpstan-param array $cookingTimes + */ + public function setCookingTimes(array $cookingTimes) : void{ + $this->cookingTimes = $cookingTimes; + } + + public function readSaveData(CompoundTag $nbt) : void{ + $items = []; + $listeners = $this->inventory->getListeners()->toArray(); + $this->inventory->getListeners()->remove(...$listeners); //prevent any events being fired by initialization + + foreach([ + [0, self::TAG_FIRST_INPUT_ITEM, self::TAG_FIRST_COOKING_TIME], + [1, self::TAG_SECOND_INPUT_ITEM, self::TAG_SECOND_COOKING_TIME], + [2, self::TAG_THIRD_INPUT_ITEM, self::TAG_THIRD_COOKING_TIME], + [3, self::TAG_FOURTH_INPUT_ITEM, self::TAG_FOURTH_COOKING_TIME], + ] as [$slot, $itemTag, $cookingTimeTag]){ + if(($tag = $nbt->getTag($itemTag)) instanceof CompoundTag){ + $items[$slot] = Item::nbtDeserialize($tag); + } + if(($tag = $nbt->getTag($cookingTimeTag)) instanceof IntTag){ + $this->cookingTimes[$slot] = $tag->getValue(); + } + } + $this->inventory->setContents($items); + $this->inventory->getListeners()->add(...$listeners); + } + + protected function writeSaveData(CompoundTag $nbt) : void{ + foreach([ + [0, self::TAG_FIRST_INPUT_ITEM, self::TAG_FIRST_COOKING_TIME], + [1, self::TAG_SECOND_INPUT_ITEM, self::TAG_SECOND_COOKING_TIME], + [2, self::TAG_THIRD_INPUT_ITEM, self::TAG_THIRD_COOKING_TIME], + [3, self::TAG_FOURTH_INPUT_ITEM, self::TAG_FOURTH_COOKING_TIME], + ] as [$slot, $itemTag, $cookingTimeTag]){ + $item = $this->inventory->getItem($slot); + if(!$item->isNull()){ + $nbt->setTag($itemTag, $item->nbtSerialize()); + if(isset($this->cookingTimes[$slot])){ + $nbt->setInt($cookingTimeTag, $this->cookingTimes[$slot]); + } + } + } + } + + protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ + foreach([ + 0 => self::TAG_FIRST_INPUT_ITEM, + 1 => self::TAG_SECOND_INPUT_ITEM, + 2 => self::TAG_THIRD_INPUT_ITEM, + 3 => self::TAG_FOURTH_INPUT_ITEM + ] as $slot => $tag){ + $item = $this->inventory->getItem($slot); + if(!$item->isNull()){ + $nbt->setTag($tag, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($item)); + } + } + } +} diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index 6e87b72acb..515dd8c63c 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -57,6 +57,7 @@ final class TileFactory{ $this->register(Bell::class, ["Bell", "minecraft:bell"]); $this->register(BlastFurnace::class, ["BlastFurnace", "minecraft:blast_furnace"]); $this->register(BrewingStand::class, ["BrewingStand", "minecraft:brewing_stand"]); + $this->register(Campfire::class, ["Campfire", "minecraft:campfire"]); $this->register(Cauldron::class, ["Cauldron", "minecraft:cauldron"]); $this->register(Chest::class, ["Chest", "minecraft:chest"]); $this->register(ChiseledBookshelf::class, ["ChiseledBookshelf", "minecraft:chiseled_bookshelf"]); @@ -79,7 +80,6 @@ final class TileFactory{ $this->register(MobHead::class, ["Skull", "minecraft:skull"]); $this->register(GlowingItemFrame::class, ["GlowItemFrame"]); - //TODO: Campfire //TODO: ChalkboardBlock //TODO: ChemistryTable //TODO: CommandBlock diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 6e5bbcd1fa..616c2a4bd3 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -275,7 +275,8 @@ final class CraftingManagerFromDataHelper{ "furnace" => FurnaceType::FURNACE, "blast_furnace" => FurnaceType::BLAST_FURNACE, "smoker" => FurnaceType::SMOKER, - //TODO: campfire + "campfire" => FurnaceType::CAMPFIRE, + "soul_campfire" => FurnaceType::SOUL_CAMPFIRE, default => null }; if($furnaceType === null){ diff --git a/src/crafting/FurnaceType.php b/src/crafting/FurnaceType.php index 0ce5b72cea..89834c8214 100644 --- a/src/crafting/FurnaceType.php +++ b/src/crafting/FurnaceType.php @@ -25,6 +25,7 @@ namespace pocketmine\crafting; use pocketmine\utils\LegacyEnumShimTrait; use pocketmine\world\sound\BlastFurnaceSound; +use pocketmine\world\sound\CampfireSound; use pocketmine\world\sound\FurnaceSound; use pocketmine\world\sound\SmokerSound; use pocketmine\world\sound\Sound; @@ -35,8 +36,10 @@ use function spl_object_id; * These are retained for backwards compatibility only. * * @method static FurnaceType BLAST_FURNACE() + * @method static FurnaceType CAMPFIRE() * @method static FurnaceType FURNACE() * @method static FurnaceType SMOKER() + * @method static FurnaceType SOUL_CAMPFIRE() * * @phpstan-type TMetadata array{0: int, 1: Sound} */ @@ -46,6 +49,8 @@ enum FurnaceType{ case FURNACE; case BLAST_FURNACE; case SMOKER; + case CAMPFIRE; + case SOUL_CAMPFIRE; /** * @phpstan-return TMetadata @@ -58,6 +63,7 @@ enum FurnaceType{ self::FURNACE => [200, new FurnaceSound()], self::BLAST_FURNACE => [100, new BlastFurnaceSound()], self::SMOKER => [100, new SmokerSound()], + self::CAMPFIRE, self::SOUL_CAMPFIRE => [600, new CampfireSound()] }; } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index ab98e75f36..a8ca150ba6 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -43,6 +43,7 @@ use pocketmine\block\Cactus; use pocketmine\block\Cake; use pocketmine\block\CakeWithCandle; use pocketmine\block\CakeWithDyedCandle; +use pocketmine\block\Campfire; use pocketmine\block\Candle; use pocketmine\block\Carpet; use pocketmine\block\Carrot; @@ -124,6 +125,7 @@ use pocketmine\block\SimplePressurePlate; use pocketmine\block\Slab; use pocketmine\block\SmallDripleaf; use pocketmine\block\SnowLayer; +use pocketmine\block\SoulCampfire; use pocketmine\block\Sponge; use pocketmine\block\StainedGlass; use pocketmine\block\StainedGlassPane; @@ -1160,6 +1162,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CAKE) ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); }); + $this->map(Blocks::CAMPFIRE(), function(Campfire $block) : Writer{ + return Writer::create(Ids::CAMPFIRE) + ->writeCardinalHorizontalFacing($block->getFacing()) + ->writeBool(StateNames::EXTINGUISHED, !$block->isLit()); + }); $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ return Writer::create(Ids::CARVED_PUMPKIN) @@ -1638,6 +1645,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::COVERED_BIT, false) ->writeInt(StateNames::HEIGHT, $block->getLayers() - 1); }); + $this->map(Blocks::SOUL_CAMPFIRE(), function(SoulCampfire $block) : Writer{ + return Writer::create(Ids::SOUL_CAMPFIRE) + ->writeCardinalHorizontalFacing($block->getFacing()) + ->writeBool(StateNames::EXTINGUISHED, !$block->isLit()); + }); $this->map(Blocks::SOUL_FIRE(), function() : Writer{ return Writer::create(Ids::SOUL_FIRE) ->writeInt(StateNames::AGE, 0); //useless for soul fire, we don't track it diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 4c9ec4b798..40478f197a 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -1039,6 +1039,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CAKE() ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); }); + $this->map(Ids::CAMPFIRE, function(Reader $in) : Block{ + return Blocks::CAMPFIRE() + ->setFacing($in->readCardinalHorizontalFacing()) + ->setLit(!$in->readBool(StateNames::EXTINGUISHED)); + }); $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ return Blocks::CARVED_PUMPKIN() @@ -1525,6 +1530,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $in->ignored(StateNames::COVERED_BIT); //seems to be useless return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); }); + $this->map(Ids::SOUL_CAMPFIRE, function(Reader $in) : Block{ + return Blocks::SOUL_CAMPFIRE() + ->setFacing($in->readCardinalHorizontalFacing()) + ->setLit(!$in->readBool(StateNames::EXTINGUISHED)); + }); $this->map(Ids::SOUL_FIRE, function(Reader $in) : Block{ $in->ignored(StateNames::AGE); //this is useless for soul fire, since it doesn't have the logic associated return Blocks::SOUL_FIRE(); diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 7a720559ea..de9b5ae5e6 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -133,6 +133,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::BIRCH_DOOR, Blocks::BIRCH_DOOR()); $this->map1to1Block(Ids::BREWING_STAND, Blocks::BREWING_STAND()); $this->map1to1Block(Ids::CAKE, Blocks::CAKE()); + $this->map1to1Block(Ids::CAMPFIRE, Blocks::CAMPFIRE()); $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON()); $this->map1to1Block(Ids::CHAIN, Blocks::CHAIN()); $this->map1to1Block(Ids::CHERRY_DOOR, Blocks::CHERRY_DOOR()); @@ -148,6 +149,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR()); $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART()); $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER()); + $this->map1to1Block(Ids::SOUL_CAMPFIRE, Blocks::SOUL_CAMPFIRE()); $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR()); $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE()); $this->map1to1Block(Ids::WARPED_DOOR, Blocks::WARPED_DOOR()); diff --git a/src/event/block/CampfireCookEvent.php b/src/event/block/CampfireCookEvent.php new file mode 100644 index 0000000000..3762f5848f --- /dev/null +++ b/src/event/block/CampfireCookEvent.php @@ -0,0 +1,63 @@ +input = clone $input; + } + + public function getCampfire() : Campfire{ + return $this->campfire; + } + + public function getSlot() : int{ + return $this->slot; + } + + public function getInput() : Item{ + return $this->input; + } + + public function getResult() : Item{ + return $this->result; + } + + public function setResult(Item $result) : void{ + $this->result = $result; + } +} diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 91fd2ab4a4..6a1c1d2e3f 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -205,6 +205,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("cake", fn() => Blocks::CAKE()); $result->registerBlock("cake_block", fn() => Blocks::CAKE()); $result->registerBlock("calcite", fn() => Blocks::CALCITE()); + $result->registerBlock("campfire", fn() => Blocks::CAMPFIRE()); $result->registerBlock("candle", fn() => Blocks::CANDLE()); $result->registerBlock("carpet", fn() => Blocks::CARPET()); $result->registerBlock("carrot_block", fn() => Blocks::CARROTS()); @@ -1003,6 +1004,7 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("snow", fn() => Blocks::SNOW()); $result->registerBlock("snow_block", fn() => Blocks::SNOW()); $result->registerBlock("snow_layer", fn() => Blocks::SNOW_LAYER()); + $result->registerBlock("soul_campfire", fn() => Blocks::SOUL_CAMPFIRE()); $result->registerBlock("soul_lantern", fn() => Blocks::SOUL_LANTERN()); $result->registerBlock("soul_sand", fn() => Blocks::SOUL_SAND()); $result->registerBlock("soul_soil", fn() => Blocks::SOUL_SOIL()); diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 29f37590e3..14523f74c7 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -130,6 +130,8 @@ final class CraftingDataCache{ FurnaceType::FURNACE => FurnaceRecipeBlockName::FURNACE, FurnaceType::BLAST_FURNACE => FurnaceRecipeBlockName::BLAST_FURNACE, FurnaceType::SMOKER => FurnaceRecipeBlockName::SMOKER, + FurnaceType::CAMPFIRE => FurnaceRecipeBlockName::CAMPFIRE, + FurnaceType::SOUL_CAMPFIRE => FurnaceRecipeBlockName::SOUL_CAMPFIRE }; foreach($manager->getFurnaceRecipeManager($furnaceType)->getAll() as $recipe){ $input = $converter->coreRecipeIngredientToNet($recipe->getInput())->getDescriptor(); diff --git a/src/world/sound/CampfireSound.php b/src/world/sound/CampfireSound.php new file mode 100644 index 0000000000..7e01342efe --- /dev/null +++ b/src/world/sound/CampfireSound.php @@ -0,0 +1,35 @@ + Date: Mon, 8 Jul 2024 03:20:45 +0700 Subject: [PATCH 1730/1858] Bells always drops themselves (#4802) --- src/block/Bell.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/block/Bell.php b/src/block/Bell.php index ec033cef87..53a6fc7fbb 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -150,6 +150,10 @@ final class Bell extends Transparent{ } } + public function getDropsForIncompatibleTool(Item $item) : array{ + return [$this->asItem()]; + } + private function isValidFaceToRing(int $faceHit) : bool{ return match($this->attachmentType){ BellAttachmentType::CEILING => true, From 5d60ba36b7ecd9fd1caf79b8cd94e55f72b8c0b0 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Tue, 9 Jul 2024 21:07:47 -0500 Subject: [PATCH 1731/1858] Support for 1.21.2 --- composer.json | 2 +- composer.lock | 14 +++++++------- src/network/mcpe/NetworkSession.php | 5 +++++ src/player/Player.php | 7 +++++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index dbc1b1354c..299f69f782 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~4.2.0+bedrock-1.21.0", "pocketmine/bedrock-data": "~2.11.0+bedrock-1.21.0", "pocketmine/bedrock-item-upgrade-schema": "~1.10.0+bedrock-1.21.0", - "pocketmine/bedrock-protocol": "~31.0.0+bedrock-1.21.0", + "pocketmine/bedrock-protocol": "~32.1.0+bedrock-1.21.2", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index ce8d52e266..0547560cca 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6254ce9a454f8c9acd4936512c4d315a", + "content-hash": "d459605b85f247204988a879982aab50", "packages": [ { "name": "adhocore/json-comment", @@ -205,16 +205,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "31.0.0+bedrock-1.21.0", + "version": "32.1.0+bedrock-1.21.2", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "972373b6b8068963649f0a95163424eb5b645e29" + "reference": "bb23db51365bdc91d3135c3885986a691ae1cb44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/972373b6b8068963649f0a95163424eb5b645e29", - "reference": "972373b6b8068963649f0a95163424eb5b645e29", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/bb23db51365bdc91d3135c3885986a691ae1cb44", + "reference": "bb23db51365bdc91d3135c3885986a691ae1cb44", "shasum": "" }, "require": { @@ -245,9 +245,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/31.0.0+bedrock-1.21.0" + "source": "https://github.com/pmmp/BedrockProtocol/tree/32.1.0+bedrock-1.21.2" }, - "time": "2024-06-13T17:34:14+00:00" + "time": "2024-07-10T01:38:43+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 04cc7b932f..218e102533 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -54,6 +54,7 @@ use pocketmine\network\mcpe\handler\SessionStartPacketHandler; use pocketmine\network\mcpe\handler\SpawnResponsePacketHandler; use pocketmine\network\mcpe\protocol\AvailableCommandsPacket; use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket; +use pocketmine\network\mcpe\protocol\ClientboundCloseFormPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\DisconnectPacket; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; @@ -1170,6 +1171,10 @@ class NetworkSession{ return $this->sendDataPacket(ModalFormRequestPacket::create($id, json_encode($form, JSON_THROW_ON_ERROR))); } + public function onCloseAllForms() : void{ + $this->sendDataPacket(ClientboundCloseFormPacket::create()); + } + /** * Instructs the networksession to start using the chunk at the given coordinates. This may occur asynchronously. * @param \Closure $onCompletion To be called when chunk sending has completed. diff --git a/src/player/Player.php b/src/player/Player.php index 0cefbe71f2..d442c6a3b2 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2151,6 +2151,13 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return true; } + /** + * Closes the current viewing form and forms in queue. + */ + public function closeAllForms() : void{ + $this->getNetworkSession()->onCloseAllForms(); + } + /** * Transfers a player to another server. * From 37bf4bc0b0c095758c8ee09e5681a369396da7ce Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Tue, 9 Jul 2024 21:15:18 -0500 Subject: [PATCH 1732/1858] Release 5.17.0 --- changelogs/5.17.md | 25 +++++++++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.17.md diff --git a/changelogs/5.17.md b/changelogs/5.17.md new file mode 100644 index 0000000000..1b40847100 --- /dev/null +++ b/changelogs/5.17.md @@ -0,0 +1,25 @@ +# 5.17.0 +Released 10th July 2024. + +**For Minecraft: Bedrock Edition 1.21.2** + +This is a support release for Minecraft: Bedrock Edition 1.21.2. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.21.2. +- Removed support for earlier versions. + +## API +### `pocketmine\player` +- The following methods have been added: + - `public function closeAllForms() : void` - closes the current viewing form and forms in queue. + +## Fixes +- Bowl can now be used as fuel. +- Bells always drops themselves even when using an incompatible tool. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 9b935f8a09..52a33e39f7 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.16.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.17.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 824e270041af8aaf6c2a767e9ee4a16f9ddaac87 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Tue, 9 Jul 2024 21:16:13 -0500 Subject: [PATCH 1733/1858] 5.17.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 52a33e39f7..bc4154e86b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.17.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.17.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From accaa0acce17f5601a8d3412efac97344f4d7171 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 10 Jul 2024 19:15:06 +0300 Subject: [PATCH 1734/1858] Implement ICopper interface for blocks with common properties (#6390) --- src/block/Copper.php | 3 +- src/block/CopperSlab.php | 3 +- src/block/CopperStairs.php | 3 +- src/block/utils/ICopper.php | 38 +++++++++++++++++++ .../convert/BlockStateDeserializerHelper.php | 12 +++--- 5 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 src/block/utils/ICopper.php diff --git a/src/block/Copper.php b/src/block/Copper.php index 1da253fa41..8e678bf426 100644 --- a/src/block/Copper.php +++ b/src/block/Copper.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\CopperTrait; +use pocketmine\block\utils\ICopper; -class Copper extends Opaque{ +class Copper extends Opaque implements ICopper{ use CopperTrait; } diff --git a/src/block/CopperSlab.php b/src/block/CopperSlab.php index 088ace11e1..4194cd8543 100644 --- a/src/block/CopperSlab.php +++ b/src/block/CopperSlab.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\CopperTrait; +use pocketmine\block\utils\ICopper; -class CopperSlab extends Slab{ +class CopperSlab extends Slab implements ICopper{ use CopperTrait; } diff --git a/src/block/CopperStairs.php b/src/block/CopperStairs.php index b16d49ec1e..dd8f44f7ac 100644 --- a/src/block/CopperStairs.php +++ b/src/block/CopperStairs.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\CopperTrait; +use pocketmine\block\utils\ICopper; -class CopperStairs extends Stair{ +class CopperStairs extends Stair implements ICopper{ use CopperTrait; } diff --git a/src/block/utils/ICopper.php b/src/block/utils/ICopper.php new file mode 100644 index 0000000000..a749efe639 --- /dev/null +++ b/src/block/utils/ICopper.php @@ -0,0 +1,38 @@ +setOxidation($oxidation); $block->setWaxed(false); return $block; } /** - * @phpstan-template TBlock of Copper|CopperSlab|CopperStairs + * @phpstan-template TBlock of ICopper * * @phpstan-param TBlock $block * @phpstan-return TBlock */ - public static function decodeWaxedCopper(Copper|CopperSlab|CopperStairs $block, CopperOxidation $oxidation) : Copper|CopperSlab|CopperStairs{ + public static function decodeWaxedCopper(ICopper $block, CopperOxidation $oxidation) : ICopper{ $block->setOxidation($oxidation); $block->setWaxed(true); return $block; From 85606925a1b9f747cc65357a1fc5e314503486d2 Mon Sep 17 00:00:00 2001 From: Dylan T <14214667+dktapps@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:26:51 +0100 Subject: [PATCH 1735/1858] BlockStateData: add a note about CURRENT_VERSION this is not the same as current game version, as the revision is determined by some Mojang internal factors. --- src/data/bedrock/block/BlockStateData.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 51899b72bf..2c67ded73d 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -38,6 +38,9 @@ use function implode; final class BlockStateData{ /** * Bedrock version of the most recent backwards-incompatible change to blockstates. + * + * This is *not* the same as current game version. It should match the numbers in the + * newest blockstate upgrade schema used in BedrockBlockUpgradeSchema. */ public const CURRENT_VERSION = (1 << 24) | //major From d6c48fd3a22b8dae0e2d2a5f1f920a40c2abd837 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Fri, 12 Jul 2024 07:24:43 -0500 Subject: [PATCH 1736/1858] Implement new 1.21 paintings (#6393) --- src/entity/object/PaintingMotive.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/entity/object/PaintingMotive.php b/src/entity/object/PaintingMotive.php index a456630fca..00114c508b 100644 --- a/src/entity/object/PaintingMotive.php +++ b/src/entity/object/PaintingMotive.php @@ -37,9 +37,11 @@ class PaintingMotive{ new PaintingMotive(1, 1, "Aztec2"), new PaintingMotive(1, 1, "Bomb"), new PaintingMotive(1, 1, "Kebab"), + new PaintingMotive(1, 1, "meditative"), new PaintingMotive(1, 1, "Plant"), new PaintingMotive(1, 1, "Wasteland"), new PaintingMotive(1, 2, "Graham"), + new PaintingMotive(1, 2, "prairie_ride"), new PaintingMotive(1, 2, "Wanderer"), new PaintingMotive(2, 1, "Courbet"), new PaintingMotive(2, 1, "Creebet"), @@ -47,8 +49,10 @@ class PaintingMotive{ new PaintingMotive(2, 1, "Sea"), new PaintingMotive(2, 1, "Sunset"), new PaintingMotive(2, 2, "Bust"), + new PaintingMotive(2, 2, "baroque"), new PaintingMotive(2, 2, "Earth"), new PaintingMotive(2, 2, "Fire"), + new PaintingMotive(2, 2, "humble"), new PaintingMotive(2, 2, "Match"), new PaintingMotive(2, 2, "SkullAndRoses"), new PaintingMotive(2, 2, "Stage"), @@ -56,12 +60,28 @@ class PaintingMotive{ new PaintingMotive(2, 2, "Water"), new PaintingMotive(2, 2, "Wind"), new PaintingMotive(2, 2, "Wither"), + new PaintingMotive(3, 3, "bouquet"), + new PaintingMotive(3, 3, "cavebird"), + new PaintingMotive(3, 3, "cotan"), + new PaintingMotive(3, 3, "endboss"), + new PaintingMotive(3, 3, "fern"), + new PaintingMotive(3, 3, "owlemons"), + new PaintingMotive(3, 3, "sunflowers"), + new PaintingMotive(3, 3, "tides"), + new PaintingMotive(3, 4, "backyard"), + new PaintingMotive(3, 4, "pond"), + new PaintingMotive(4, 2, "changing"), new PaintingMotive(4, 2, "Fighters"), + new PaintingMotive(4, 2, "finding"), + new PaintingMotive(4, 2, "lowmist"), + new PaintingMotive(4, 2, "passage"), new PaintingMotive(4, 3, "DonkeyKong"), new PaintingMotive(4, 3, "Skeleton"), new PaintingMotive(4, 4, "BurningSkull"), + new PaintingMotive(4, 4, "orb"), new PaintingMotive(4, 4, "Pigscene"), - new PaintingMotive(4, 4, "Pointer") + new PaintingMotive(4, 4, "Pointer"), + new PaintingMotive(4, 4, "unpacked") ] as $motive){ self::registerMotive($motive); } From 786d84a9e1af79e7b9114fe1d6725bb291408534 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:43:18 +0000 Subject: [PATCH 1737/1858] Bump shivammathur/setup-php from 2.30.4 to 2.31.1 Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.30.4 to 2.31.1. - [Release notes](https://github.com/shivammathur/setup-php/releases) - [Commits](https://github.com/shivammathur/setup-php/compare/2.30.4...2.31.1) --- updated-dependencies: - dependency-name: shivammathur/setup-php dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/discord-release-notify.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/main.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml index ce8a16ebc9..8d0add224e 100644 --- a/.github/workflows/discord-release-notify.yml +++ b/.github/workflows/discord-release-notify.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.4 + uses: shivammathur/setup-php@2.31.1 with: php-version: 8.2 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 311e0c8279..c47a4399b1 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -20,7 +20,7 @@ jobs: submodules: true - name: Setup PHP - uses: shivammathur/setup-php@2.30.4 + uses: shivammathur/setup-php@2.31.1 with: php-version: ${{ matrix.php-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 92bd7171b6..7c92c0b8b2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP and tools - uses: shivammathur/setup-php@2.30.4 + uses: shivammathur/setup-php@2.31.1 with: php-version: 8.2 tools: php-cs-fixer:3.49 From f750b01d8be7bc97e1c340b0450240c36520747e Mon Sep 17 00:00:00 2001 From: Dylan T <14214667+dktapps@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:10:14 +0100 Subject: [PATCH 1738/1858] dependabot: group patch updates into a single PR --- .github/dependabot.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8acff71d66..39d5c68b8d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,6 +12,19 @@ updates: update-types: - "version-update:semver-major" - "version-update:semver-minor" + groups: + production-patch-updates: + dependency-type: production + patterns: + - "*" + update-types: + - "patch" + development-patch-updates: + dependency-type: development + patterns: + - "*" + update-types: + - "patch" - package-ecosystem: gitsubmodule directory: "/" From 32be474840630667785b1a5823b41d40e783598a Mon Sep 17 00:00:00 2001 From: Dylan T <14214667+dktapps@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:12:47 +0100 Subject: [PATCH 1739/1858] dependabot: group PHPStan dependency updates always these typically need to be updated together anyway --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 39d5c68b8d..97607ab8fa 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -25,6 +25,9 @@ updates: - "*" update-types: - "patch" + phpstan: + patterns: + - "phpstan/*" - package-ecosystem: gitsubmodule directory: "/" From 1f510caf88271f25f6e944919cd3bd04c00ad96a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 13:16:44 +0000 Subject: [PATCH 1740/1858] Bump the phpstan group with 2 updates (#6401) --- composer.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/composer.lock b/composer.lock index 0547560cca..a68d345338 100644 --- a/composer.lock +++ b/composer.lock @@ -1447,21 +1447,21 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.16", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95" + "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d5242a59d035e46774f2e634b374bc39ff62cb95", - "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/f3ea021866f4263f07ca3636bf22c64be9610c11", + "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.11" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -1493,27 +1493,27 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.16" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.0" }, - "time": "2024-02-23T09:51:20+00:00" + "time": "2024-04-20T06:39:00+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.5", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "2e193a07651a6f4be3baa44ddb21d822681f5918" + "reference": "363f921dd8441777d4fc137deb99beb486c77df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/2e193a07651a6f4be3baa44ddb21d822681f5918", - "reference": "2e193a07651a6f4be3baa44ddb21d822681f5918", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/363f921dd8441777d4fc137deb99beb486c77df1", + "reference": "363f921dd8441777d4fc137deb99beb486c77df1", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.60" + "phpstan/phpstan": "^1.11" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -1542,9 +1542,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.5" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.0" }, - "time": "2024-04-19T15:12:26+00:00" + "time": "2024-04-20T06:37:51+00:00" }, { "name": "phpunit/php-code-coverage", From a96f1a5083ae6a281736194a3ba70f88ceaae94e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Jul 2024 18:17:41 +0000 Subject: [PATCH 1741/1858] Bump docker/build-push-action from 5.3.0 to 6.3.0 (#6387) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 6e035e735a..c6d6fb896a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v6.3.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v6.3.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v6.3.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v6.3.0 with: push: true context: ./pocketmine-mp From df4ada81e5d74a14046f27cf44a37dcee69d657e Mon Sep 17 00:00:00 2001 From: Aleksey <45711510+Gaprix@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:51:06 +0300 Subject: [PATCH 1742/1858] BedrockWorldData: Update version constants to 1.21.2 (#6399) Co-authored-by: Dylan T <14214667+dktapps@users.noreply.github.com> --- src/world/format/io/data/BedrockWorldData.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 9dc89ad996..7bcc44c0b7 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 685; + public const CURRENT_STORAGE_NETWORK_VERSION = 686; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 21, //minor - 0, //patch - 3, //revision + 2, //patch + 2, //revision 0 //is beta ]; From 787afb6b0007c919f22bd5b955973e3de13223a7 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Tue, 23 Jul 2024 11:34:46 -0500 Subject: [PATCH 1743/1858] Implement all new 1.21 tuff blocks (#6391) --- src/block/BlockTypeIds.php | 15 +++++++- src/block/VanillaBlocks.php | 36 ++++++++++++++++++- .../convert/BlockObjectToStateSerializer.php | 13 +++++++ .../BlockStateToObjectDeserializer.php | 13 +++++++ src/item/StringToItemParser.php | 13 +++++++ .../block_factory_consistency_check.json | 13 +++++++ 6 files changed, 101 insertions(+), 2 deletions(-) diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 59c3584890..29f4e650d4 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -747,8 +747,21 @@ final class BlockTypeIds{ public const DOUBLE_PITCHER_CROP = 10717; public const CAMPFIRE = 10718; public const SOUL_CAMPFIRE = 10719; + public const TUFF_SLAB = 10720; + public const TUFF_STAIRS = 10721; + public const TUFF_WALL = 10722; + public const CHISELED_TUFF = 10723; + public const TUFF_BRICKS = 10724; + public const TUFF_BRICK_SLAB = 10725; + public const TUFF_BRICK_STAIRS = 10726; + public const TUFF_BRICK_WALL = 10727; + public const CHISELED_TUFF_BRICKS = 10728; + public const POLISHED_TUFF = 10729; + public const POLISHED_TUFF_SLAB = 10730; + public const POLISHED_TUFF_STAIRS = 10731; + public const POLISHED_TUFF_WALL = 10732; - public const FIRST_UNUSED_BLOCK_ID = 10720; + public const FIRST_UNUSED_BLOCK_ID = 10733; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 7733f43593..13c7e869ac 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -188,6 +188,8 @@ use function strtolower; * @method static Opaque CHISELED_RED_SANDSTONE() * @method static Opaque CHISELED_SANDSTONE() * @method static Opaque CHISELED_STONE_BRICKS() + * @method static Opaque CHISELED_TUFF() + * @method static Opaque CHISELED_TUFF_BRICKS() * @method static ChorusFlower CHORUS_FLOWER() * @method static ChorusPlant CHORUS_PLANT() * @method static Clay CLAY() @@ -609,6 +611,10 @@ use function strtolower; * @method static Opaque POLISHED_GRANITE() * @method static Slab POLISHED_GRANITE_SLAB() * @method static Stair POLISHED_GRANITE_STAIRS() + * @method static Opaque POLISHED_TUFF() + * @method static Slab POLISHED_TUFF_SLAB() + * @method static Stair POLISHED_TUFF_STAIRS() + * @method static Wall POLISHED_TUFF_WALL() * @method static Flower POPPY() * @method static Potato POTATOES() * @method static PotionCauldron POTION_CAULDRON() @@ -738,6 +744,13 @@ use function strtolower; * @method static Tripwire TRIPWIRE() * @method static TripwireHook TRIPWIRE_HOOK() * @method static Opaque TUFF() + * @method static Opaque TUFF_BRICKS() + * @method static Slab TUFF_BRICK_SLAB() + * @method static Stair TUFF_BRICK_STAIRS() + * @method static Wall TUFF_BRICK_WALL() + * @method static Slab TUFF_SLAB() + * @method static Stair TUFF_STAIRS() + * @method static Wall TUFF_WALL() * @method static NetherVines TWISTING_VINES() * @method static UnderwaterTorch UNDERWATER_TORCH() * @method static Vine VINES() @@ -1269,6 +1282,7 @@ final class VanillaBlocks{ self::registerBlocksR17(); self::registerBlocksR18(); self::registerMudBlocks(); + self::registerTuffBlocks(); self::registerCraftingTables(); self::registerChorusBlocks(); @@ -1576,7 +1590,6 @@ final class VanillaBlocks{ self::register("amethyst_cluster", new AmethystCluster(new BID(Ids::AMETHYST_CLUSTER), "Amethyst Cluster", $amethystInfo)); self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD)))); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)))); self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON, 30.0)))); @@ -1667,6 +1680,27 @@ final class VanillaBlocks{ self::register("mud_brick_wall", new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); } + private static function registerTuffBlocks() : void{ + $tuffBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); + + self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", $tuffBreakInfo)); + self::register("tuff_slab", new Slab(new BID(Ids::TUFF_SLAB), "Tuff", $tuffBreakInfo)); + self::register("tuff_stairs", new Stair(new BID(Ids::TUFF_STAIRS), "Tuff Stairs", $tuffBreakInfo)); + self::register("tuff_wall", new Wall(new BID(Ids::TUFF_WALL), "Tuff Wall", $tuffBreakInfo)); + self::register("chiseled_tuff", new Opaque(new BID(Ids::CHISELED_TUFF), "Chiseled Tuff", $tuffBreakInfo)); + + self::register("tuff_bricks", new Opaque(new BID(Ids::TUFF_BRICKS), "Tuff Bricks", $tuffBreakInfo)); + self::register("tuff_brick_slab", new Slab(new BID(Ids::TUFF_BRICK_SLAB), "Tuff Brick", $tuffBreakInfo)); + self::register("tuff_brick_stairs", new Stair(new BID(Ids::TUFF_BRICK_STAIRS), "Tuff Brick Stairs", $tuffBreakInfo)); + self::register("tuff_brick_wall", new Wall(new BID(Ids::TUFF_BRICK_WALL), "Tuff Brick Wall", $tuffBreakInfo)); + self::register("chiseled_tuff_bricks", new Opaque(new BID(Ids::CHISELED_TUFF_BRICKS), "Chiseled Tuff Bricks", $tuffBreakInfo)); + + self::register("polished_tuff", new Opaque(new BID(Ids::POLISHED_TUFF), "Polished Tuff", $tuffBreakInfo)); + self::register("polished_tuff_slab", new Slab(new BID(Ids::POLISHED_TUFF_SLAB), "Polished Tuff", $tuffBreakInfo)); + self::register("polished_tuff_stairs", new Stair(new BID(Ids::POLISHED_TUFF_STAIRS), "Polished Tuff Stairs", $tuffBreakInfo)); + self::register("polished_tuff_wall", new Wall(new BID(Ids::POLISHED_TUFF_WALL), "Polished Tuff Wall", $tuffBreakInfo)); + } + private static function registerCauldronBlocks() : void{ $cauldronBreakInfo = new Info(BreakInfo::pickaxe(2, ToolTier::WOOD)); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index a8ca150ba6..1d271b7a50 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -785,6 +785,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CHISELED_DEEPSLATE(), Ids::CHISELED_DEEPSLATE); $this->mapSimple(Blocks::CHISELED_NETHER_BRICKS(), Ids::CHISELED_NETHER_BRICKS); $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); + $this->mapSimple(Blocks::CHISELED_TUFF(), Ids::CHISELED_TUFF); + $this->mapSimple(Blocks::CHISELED_TUFF_BRICKS(), Ids::CHISELED_TUFF_BRICKS); $this->mapSimple(Blocks::CHORUS_PLANT(), Ids::CHORUS_PLANT); $this->mapSimple(Blocks::CLAY(), Ids::CLAY); $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); @@ -997,6 +999,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); $this->mapSimple(Blocks::POLISHED_DIORITE(), Ids::POLISHED_DIORITE); $this->mapSimple(Blocks::POLISHED_GRANITE(), Ids::POLISHED_GRANITE); + $this->mapSimple(Blocks::POLISHED_TUFF(), Ids::POLISHED_TUFF); $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); @@ -1023,6 +1026,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TORCHFLOWER(), Ids::TORCHFLOWER); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); + $this->mapSimple(Blocks::TUFF_BRICKS(), Ids::TUFF_BRICKS); $this->mapSimple(Blocks::WARPED_WART_BLOCK(), Ids::WARPED_WART_BLOCK); $this->mapSimple(Blocks::WARPED_ROOTS(), Ids::WARPED_ROOTS); $this->mapSimple(Blocks::WITHER_ROSE(), Ids::WITHER_ROSE); @@ -1539,6 +1543,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); $this->mapStairs(Blocks::POLISHED_GRANITE_STAIRS(), Ids::POLISHED_GRANITE_STAIRS); + $this->mapSlab(Blocks::POLISHED_TUFF_SLAB(), Ids::POLISHED_TUFF_SLAB, Ids::POLISHED_TUFF_DOUBLE_SLAB); + $this->mapStairs(Blocks::POLISHED_TUFF_STAIRS(), Ids::POLISHED_TUFF_STAIRS); + $this->map(Blocks::POLISHED_TUFF_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_TUFF_WALL))); $this->map(Blocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); $this->map(Blocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ return Writer::create(Ids::GOLDEN_RAIL) @@ -1715,6 +1722,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::POWERED_BIT, $block->isPowered()) ->writeLegacyHorizontalFacing($block->getFacing()); }); + $this->mapSlab(Blocks::TUFF_BRICK_SLAB(), Ids::TUFF_BRICK_SLAB, Ids::TUFF_BRICK_DOUBLE_SLAB); + $this->mapStairs(Blocks::TUFF_BRICK_STAIRS(), Ids::TUFF_BRICK_STAIRS); + $this->map(Blocks::TUFF_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::TUFF_BRICK_WALL))); + $this->mapSlab(Blocks::TUFF_SLAB(), Ids::TUFF_SLAB, Ids::TUFF_DOUBLE_SLAB); + $this->mapStairs(Blocks::TUFF_STAIRS(), Ids::TUFF_STAIRS); + $this->map(Blocks::TUFF_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::TUFF_WALL))); $this->map(Blocks::TWISTING_VINES(), function(NetherVines $block) : Writer{ return Writer::create(Ids::TWISTING_VINES) ->writeInt(StateNames::TWISTING_VINES_AGE, $block->getAge()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 40478f197a..afe0fc2252 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -673,6 +673,8 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); $this->mapSimple(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); $this->mapSimple(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); + $this->mapSimple(Ids::CHISELED_TUFF, fn() => Blocks::CHISELED_TUFF()); + $this->mapSimple(Ids::CHISELED_TUFF_BRICKS, fn() => Blocks::CHISELED_TUFF_BRICKS()); $this->mapSimple(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT()); $this->mapSimple(Ids::CLAY, fn() => Blocks::CLAY()); $this->mapSimple(Ids::COAL_BLOCK, fn() => Blocks::COAL()); @@ -880,6 +882,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); $this->mapSimple(Ids::POLISHED_DIORITE, fn() => Blocks::POLISHED_DIORITE()); $this->mapSimple(Ids::POLISHED_GRANITE, fn() => Blocks::POLISHED_GRANITE()); + $this->mapSimple(Ids::POLISHED_TUFF, fn() => Blocks::POLISHED_TUFF()); $this->mapSimple(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); $this->mapSimple(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->mapSimple(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); @@ -907,6 +910,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->mapSimple(Ids::TORCHFLOWER, fn() => Blocks::TORCHFLOWER()); $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF()); + $this->mapSimple(Ids::TUFF_BRICKS, fn() => Blocks::TUFF_BRICKS()); $this->mapSimple(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX()); $this->mapSimple(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK()); $this->mapSimple(Ids::WARPED_ROOTS, fn() => Blocks::WARPED_ROOTS()); @@ -1385,6 +1389,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::POLISHED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_DEEPSLATE_WALL(), $in)); $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS()); $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS()); + $this->mapSlab(Ids::POLISHED_TUFF_SLAB, Ids::POLISHED_TUFF_DOUBLE_SLAB, fn() => Blocks::POLISHED_TUFF_SLAB()); + $this->mapStairs(Ids::POLISHED_TUFF_STAIRS, fn() => Blocks::POLISHED_TUFF_STAIRS()); + $this->map(Ids::POLISHED_TUFF_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_TUFF_WALL(), $in)); $this->map(Ids::PORTAL, function(Reader $in) : Block{ return Blocks::NETHER_PORTAL() ->setAxis(match($value = $in->readString(StateNames::PORTAL_AXIS)){ @@ -1628,6 +1635,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readLegacyHorizontalFacing()) ->setPowered($in->readBool(StateNames::POWERED_BIT)); }); + $this->mapSlab(Ids::TUFF_BRICK_SLAB, Ids::TUFF_BRICK_DOUBLE_SLAB, fn() => Blocks::TUFF_BRICK_SLAB()); + $this->mapStairs(Ids::TUFF_BRICK_STAIRS, fn() => Blocks::TUFF_BRICK_STAIRS()); + $this->map(Ids::TUFF_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::TUFF_BRICK_WALL(), $in)); + $this->mapSlab(Ids::TUFF_SLAB, Ids::TUFF_DOUBLE_SLAB, fn() => Blocks::TUFF_SLAB()); + $this->mapStairs(Ids::TUFF_STAIRS, fn() => Blocks::TUFF_STAIRS()); + $this->map(Ids::TUFF_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::TUFF_WALL(), $in)); $this->map(Ids::TWISTING_VINES, function(Reader $in) : Block{ return Blocks::TWISTING_VINES() ->setAge($in->readBoundedInt(StateNames::TWISTING_VINES_AGE, 0, 25)); diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 6a1c1d2e3f..9f5db6950c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -240,6 +240,8 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("chiseled_red_sandstone", fn() => Blocks::CHISELED_RED_SANDSTONE()); $result->registerBlock("chiseled_sandstone", fn() => Blocks::CHISELED_SANDSTONE()); $result->registerBlock("chiseled_stone_bricks", fn() => Blocks::CHISELED_STONE_BRICKS()); + $result->registerBlock("chiseled_tuff", fn() => Blocks::CHISELED_TUFF()); + $result->registerBlock("chiseled_tuff_bricks", fn() => Blocks::CHISELED_TUFF_BRICKS()); $result->registerBlock("chorus_flower", fn() => Blocks::CHORUS_FLOWER()); $result->registerBlock("chorus_plant", fn() => Blocks::CHORUS_PLANT()); $result->registerBlock("clay_block", fn() => Blocks::CLAY()); @@ -898,6 +900,10 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("polished_granite", fn() => Blocks::POLISHED_GRANITE()); $result->registerBlock("polished_granite_slab", fn() => Blocks::POLISHED_GRANITE_SLAB()); $result->registerBlock("polished_granite_stairs", fn() => Blocks::POLISHED_GRANITE_STAIRS()); + $result->registerBlock("polished_tuff", fn() => Blocks::POLISHED_TUFF()); + $result->registerBlock("polished_tuff_slab", fn() => Blocks::POLISHED_TUFF_SLAB()); + $result->registerBlock("polished_tuff_stairs", fn() => Blocks::POLISHED_TUFF_STAIRS()); + $result->registerBlock("polished_tuff_wall", fn() => Blocks::POLISHED_TUFF_WALL()); $result->registerBlock("poppy", fn() => Blocks::POPPY()); $result->registerBlock("portal", fn() => Blocks::NETHER_PORTAL()); $result->registerBlock("portal_block", fn() => Blocks::NETHER_PORTAL()); @@ -1098,6 +1104,13 @@ final class StringToItemParser extends StringToTParser{ $result->registerBlock("trunk", fn() => Blocks::OAK_PLANKS()); $result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false)); $result->registerBlock("tuff", fn() => Blocks::TUFF()); + $result->registerBlock("tuff_bricks", fn() => Blocks::TUFF_BRICKS()); + $result->registerBlock("tuff_brick_slab", fn() => Blocks::TUFF_BRICK_SLAB()); + $result->registerBlock("tuff_brick_stairs", fn() => Blocks::TUFF_BRICK_STAIRS()); + $result->registerBlock("tuff_brick_wall", fn() => Blocks::TUFF_BRICK_WALL()); + $result->registerBlock("tuff_slab", fn() => Blocks::TUFF_SLAB()); + $result->registerBlock("tuff_stairs", fn() => Blocks::TUFF_STAIRS()); + $result->registerBlock("tuff_wall", fn() => Blocks::TUFF_WALL()); $result->registerBlock("twisting_vines", fn() => Blocks::TWISTING_VINES()); $result->registerBlock("underwater_tnt", fn() => Blocks::TNT()->setWorksUnderwater(true)); $result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH()); diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index b40bfa9e3f..97c24b52ec 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -112,6 +112,8 @@ "CHISELED_RED_SANDSTONE": 1, "CHISELED_SANDSTONE": 1, "CHISELED_STONE_BRICKS": 1, + "CHISELED_TUFF": 1, + "CHISELED_TUFF_BRICKS": 1, "CHORUS_FLOWER": 6, "CHORUS_PLANT": 1, "CLAY": 1, @@ -533,6 +535,10 @@ "POLISHED_GRANITE": 1, "POLISHED_GRANITE_SLAB": 3, "POLISHED_GRANITE_STAIRS": 8, + "POLISHED_TUFF": 1, + "POLISHED_TUFF_SLAB": 3, + "POLISHED_TUFF_STAIRS": 8, + "POLISHED_TUFF_WALL": 162, "POPPY": 1, "POTATOES": 8, "POTION_CAULDRON": 6, @@ -662,6 +668,13 @@ "TRIPWIRE": 16, "TRIPWIRE_HOOK": 16, "TUFF": 1, + "TUFF_BRICKS": 1, + "TUFF_BRICK_SLAB": 3, + "TUFF_BRICK_STAIRS": 8, + "TUFF_BRICK_WALL": 162, + "TUFF_SLAB": 3, + "TUFF_STAIRS": 8, + "TUFF_WALL": 162, "TWISTING_VINES": 26, "UNDERWATER_TORCH": 5, "VINES": 16, From 237677c0286238a65c42082fbbf3148f4cb1e0bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 06:47:56 +0000 Subject: [PATCH 1744/1858] Bump phpstan/phpstan from 1.11.2 to 1.11.8 in the development-patch-updates group (#6410) --- composer.json | 2 +- composer.lock | 12 ++++++------ src/resourcepacks/ResourcePack.php | 2 ++ src/resourcepacks/ZippedResourcePack.php | 3 +++ .../format/io/region/RegionLocationTableEntry.php | 4 ++++ 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 299f69f782..d035ff9354 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.11.2", + "phpstan/phpstan": "1.11.8", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.5.24" diff --git a/composer.lock b/composer.lock index a68d345338..7cc34ff981 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d459605b85f247204988a879982aab50", + "content-hash": "3ee9506c0be6b8b202d790824344e79c", "packages": [ { "name": "adhocore/json-comment", @@ -1389,16 +1389,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.2", + "version": "1.11.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "0d5d4294a70deb7547db655c47685d680e39cfec" + "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d5d4294a70deb7547db655c47685d680e39cfec", - "reference": "0d5d4294a70deb7547db655c47685d680e39cfec", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec", + "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec", "shasum": "" }, "require": { @@ -1443,7 +1443,7 @@ "type": "github" } ], - "time": "2024-05-24T13:23:04+00:00" + "time": "2024-07-24T07:01:22+00:00" }, { "name": "phpstan/phpstan-phpunit", diff --git a/src/resourcepacks/ResourcePack.php b/src/resourcepacks/ResourcePack.php index 04feeeb3d7..cdab3447b8 100644 --- a/src/resourcepacks/ResourcePack.php +++ b/src/resourcepacks/ResourcePack.php @@ -60,6 +60,8 @@ interface ResourcePack{ * @param int $start Offset to start reading the chunk from * @param int $length Maximum length of data to return. * + * @phpstan-param positive-int $length + * * @return string byte-array * @throws \InvalidArgumentException if the chunk does not exist */ diff --git a/src/resourcepacks/ZippedResourcePack.php b/src/resourcepacks/ZippedResourcePack.php index da7db1db7a..c4daeedf7b 100644 --- a/src/resourcepacks/ZippedResourcePack.php +++ b/src/resourcepacks/ZippedResourcePack.php @@ -154,6 +154,9 @@ class ZippedResourcePack implements ResourcePack{ } public function getPackChunk(int $start, int $length) : string{ + if($length < 1){ + throw new \InvalidArgumentException("Pack length must be positive"); + } fseek($this->fileResource, $start); if(feof($this->fileResource)){ throw new \InvalidArgumentException("Requested a resource pack chunk with invalid start offset"); diff --git a/src/world/format/io/region/RegionLocationTableEntry.php b/src/world/format/io/region/RegionLocationTableEntry.php index abb92accf2..ad0b1ce487 100644 --- a/src/world/format/io/region/RegionLocationTableEntry.php +++ b/src/world/format/io/region/RegionLocationTableEntry.php @@ -27,6 +27,7 @@ use function range; class RegionLocationTableEntry{ private int $firstSector; + /** @phpstan-var positive-int */ private int $sectorCount; private int $timestamp; @@ -61,6 +62,9 @@ class RegionLocationTableEntry{ return range($this->getFirstSector(), $this->getLastSector()); } + /** + * @phpstan-return positive-int + */ public function getSectorCount() : int{ return $this->sectorCount; } From 54e7749c0bb02ce64a3dac75bed2f45f9a7086cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 06:52:28 +0000 Subject: [PATCH 1745/1858] Bump docker/build-push-action from 6.3.0 to 6.5.0 (#6409) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index c6d6fb896a..b3d6661e91 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.5.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.5.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.5.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.5.0 with: push: true context: ./pocketmine-mp From bdb5845cecc777ded4e37071a9ae976a8dcbe0d1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 5 Aug 2024 22:33:30 +0100 Subject: [PATCH 1746/1858] Allow name flattening rules where multiple old values map to the same new ID this allows more compaction in certain cases, such as tallgrass recently. instead of blacklisting any mapping which reuses the same flattened infix, we select the flatten property which produces the smallest number of distinct rules, which produces the most compact schema possible. this change also permits potentially flattening other types of properties such as for corals (live/dead and type), although only one may be selected at a time. --- tools/generate-blockstate-upgrade-schema.php | 30 +++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 54984d4591..299d97d05f 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -42,6 +42,7 @@ use function array_key_last; use function array_keys; use function array_map; use function array_shift; +use function array_unique; use function array_values; use function count; use function dirname; @@ -423,6 +424,10 @@ function processRemappedStates(array $upgradeTable) : array{ $filter = $pair->old->getStates(); foreach($unchangedStatesByNewName[$pair->new->getName()] as $unchangedPropertyName){ + if($unchangedPropertyName === $propertyName){ + $notFlattenedProperties[$propertyName] = true; + continue 2; + } unset($filter[$unchangedPropertyName]); } unset($filter[$propertyName]); @@ -436,26 +441,31 @@ function processRemappedStates(array $upgradeTable) : array{ $notFlattenedProperties[$propertyName] = true; continue; } - foreach(Utils::stringifyKeys($valuesToIds) as $otherRawValue => $otherNewId){ - if($otherRawValue === $rawValue){ - continue; - } - if($otherNewId === $pair->new->getName()){ - //this old value maps to the same new ID as another old value - bad candidate for flattening - $notFlattenedProperties[$propertyName] = true; - continue 2; - } - } } $candidateFlattenedValues[$propertyName][$rawFilter][$rawValue] = $pair->new->getName(); } } + foreach(Utils::stringifyKeys($candidateFlattenedValues) as $propertyName => $filters){ + foreach($filters as $valuesToIds){ + if(count(array_unique($valuesToIds)) === 1){ + //this property doesn't influence the new ID + $notFlattenedProperties[$propertyName] = true; + continue 2; + } + } + } foreach(Utils::stringifyKeys($notFlattenedProperties) as $propertyName => $_){ unset($candidateFlattenedValues[$propertyName]); } $flattenedProperties = buildFlattenPropertyRules($candidateFlattenedValues); $flattenProperty = array_key_first($flattenedProperties); + //Properties with fewer rules take up less space for the same result + foreach(Utils::stringifyKeys($flattenedProperties) as $propertyName => $rules){ + if(count($rules) < count($flattenedProperties[$flattenProperty])){ + $flattenProperty = $propertyName; + } + } $list = []; From be2437ac6e6cd851f0cd282f54983cb2e9fcba6f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 5 Aug 2024 22:38:02 +0100 Subject: [PATCH 1747/1858] Support for flattening TAG_Byte and TAG_Int properties this allows optimisation in upcoming versions. --- .../BlockStateUpgradeSchemaFlattenedName.php | 10 ++++- .../upgrade/BlockStateUpgradeSchemaUtils.php | 33 ++++++++++---- .../block/upgrade/BlockStateUpgrader.php | 23 +++++++--- ...ckStateUpgradeSchemaModelFlattenedName.php | 7 ++- tools/generate-blockstate-upgrade-schema.php | 45 ++++++++++++++++--- 5 files changed, 94 insertions(+), 24 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php index 1c95dd9c7f..e2f7f798d4 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; +use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; use function ksort; use const SORT_STRING; @@ -31,12 +34,14 @@ final class BlockStateUpgradeSchemaFlattenedName{ /** * @param string[] $flattenedValueRemaps * @phpstan-param array $flattenedValueRemaps + * @phpstan-param class-string|class-string|class-string|null $flattenedPropertyType */ public function __construct( public string $prefix, public string $flattenedProperty, public string $suffix, - public array $flattenedValueRemaps + public array $flattenedValueRemaps, + public ?string $flattenedPropertyType = null ){ ksort($this->flattenedValueRemaps, SORT_STRING); } @@ -45,6 +50,7 @@ final class BlockStateUpgradeSchemaFlattenedName{ return $this->prefix === $that->prefix && $this->flattenedProperty === $that->flattenedProperty && $this->suffix === $that->suffix && - $this->flattenedValueRemaps === $that->flattenedValueRemaps; + $this->flattenedValueRemaps === $that->flattenedValueRemaps && + $this->flattenedPropertyType === $that->flattenedPropertyType; } } diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index 832631490a..d66b7e68cc 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -157,18 +157,29 @@ final class BlockStateUpgradeSchemaUtils{ foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ foreach($remaps as $remap){ - if(isset($remap->newName) === isset($remap->newFlattenedName)){ + if(isset($remap->newName)){ + $remapName = $remap->newName; + }elseif(isset($remap->newFlattenedName)){ + $flattenRule = $remap->newFlattenedName; + $remapName = new BlockStateUpgradeSchemaFlattenedName( + $flattenRule->prefix, + $flattenRule->flattenedProperty, + $flattenRule->suffix, + $flattenRule->flattenedValueRemaps ?? [], + match($flattenRule->flattenedPropertyType){ + "string", null => StringTag::class, + "int" => IntTag::class, + "byte" => ByteTag::class, + default => throw new \UnexpectedValueException("Unexpected flattened property type $flattenRule->flattenedPropertyType, expected 'string', 'int' or 'byte'") + } + ); + }else{ throw new \UnexpectedValueException("Expected exactly one of 'newName' or 'newFlattenedName' properties to be set"); } $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaBlockRemap( array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState ?? []), - $remap->newName ?? new BlockStateUpgradeSchemaFlattenedName( - $remap->newFlattenedName->prefix, - $remap->newFlattenedName->flattenedProperty, - $remap->newFlattenedName->suffix, - $remap->newFlattenedName->flattenedValueRemaps ?? [], - ), + $remapName, array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState ?? []), $remap->copiedState ?? [] ); @@ -303,7 +314,13 @@ final class BlockStateUpgradeSchemaUtils{ $remap->newName->prefix, $remap->newName->flattenedProperty, $remap->newName->suffix, - $remap->newName->flattenedValueRemaps + $remap->newName->flattenedValueRemaps, + match($remap->newName->flattenedPropertyType){ + StringTag::class => null, //omit for TAG_String, as this is the common case + ByteTag::class => "byte", + IntTag::class => "int", + default => throw new \LogicException("Unexpected tag type " . $remap->newName->flattenedPropertyType . " in flattened property type") + } ), array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), $remap->copiedState diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index 4a305d8bc3..ddb1e13591 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -24,10 +24,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; use function count; +use function get_class; use function is_string; use function ksort; use function max; @@ -141,14 +145,21 @@ final class BlockStateUpgrader{ $newName = $remap->newName; }else{ $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; - if($flattenedValue instanceof StringTag){ - $embedValue = $remap->newName->flattenedValueRemaps[$flattenedValue->getValue()] ?? $flattenedValue->getValue(); - $newName = sprintf("%s%s%s", $remap->newName->prefix, $embedValue, $remap->newName->suffix); - unset($oldState[$remap->newName->flattenedProperty]); - }else{ - //flattened property is not a TAG_String, so this transformation is not applicable + $expectedType = $remap->newName->flattenedPropertyType; + if(!$flattenedValue instanceof $expectedType){ + //flattened property is not of the expected type, so this transformation is not applicable continue; } + $embedKey = match(get_class($flattenedValue)){ + StringTag::class => $flattenedValue->getValue(), + ByteTag::class => (string) $flattenedValue->getValue(), + IntTag::class => (string) $flattenedValue->getValue(), + //flattenedPropertyType is always one of these three types, but PHPStan doesn't know that + default => throw new AssumptionFailedError("flattenedPropertyType should be one of these three types, but have " . get_class($flattenedValue)), + }; + $embedValue = $remap->newName->flattenedValueRemaps[$embedKey] ?? $embedKey; + $newName = sprintf("%s%s%s", $remap->newName->prefix, $embedValue, $remap->newName->suffix); + unset($oldState[$remap->newName->flattenedProperty]); } $newState = $remap->newState; diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php index 001192f478..6d03bbc128 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php @@ -31,6 +31,7 @@ final class BlockStateUpgradeSchemaModelFlattenedName implements \JsonSerializab public string $prefix; /** @required */ public string $flattenedProperty; + public ?string $flattenedPropertyType = null; /** @required */ public string $suffix; /** @@ -43,11 +44,12 @@ final class BlockStateUpgradeSchemaModelFlattenedName implements \JsonSerializab * @param string[] $flattenedValueRemaps * @phpstan-param array $flattenedValueRemaps */ - public function __construct(string $prefix, string $flattenedProperty, string $suffix, array $flattenedValueRemaps){ + public function __construct(string $prefix, string $flattenedProperty, string $suffix, array $flattenedValueRemaps, ?string $flattenedPropertyType = null){ $this->prefix = $prefix; $this->flattenedProperty = $flattenedProperty; $this->suffix = $suffix; $this->flattenedValueRemaps = $flattenedValueRemaps; + $this->flattenedPropertyType = $flattenedPropertyType; } /** @@ -58,6 +60,9 @@ final class BlockStateUpgradeSchemaModelFlattenedName implements \JsonSerializab if(count($this->flattenedValueRemaps) === 0){ unset($result["flattenedValueRemaps"]); } + if($this->flattenedPropertyType === null){ + unset($result["flattenedPropertyType"]); + } return $result; } } diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 299d97d05f..d2d0a8c417 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -30,6 +30,8 @@ use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenedName; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\nbt\tag\ByteTag; +use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\nbt\TreeRoot; @@ -48,7 +50,10 @@ use function count; use function dirname; use function file_put_contents; use function fwrite; +use function get_class; +use function get_debug_type; use function implode; +use function is_numeric; use function json_encode; use function ksort; use function min; @@ -312,11 +317,13 @@ function findCommonSuffix(array $strings) : string{ /** * @param string[][][] $candidateFlattenedValues * @phpstan-param array>> $candidateFlattenedValues + * @param string[] $candidateFlattenPropertyTypes + * @phpstan-param array|class-string|class-string> $candidateFlattenPropertyTypes * * @return BlockStateUpgradeSchemaFlattenedName[][] * @phpstan-return array> */ -function buildFlattenPropertyRules(array $candidateFlattenedValues) : array{ +function buildFlattenPropertyRules(array $candidateFlattenedValues, array $candidateFlattenPropertyTypes) : array{ $flattenPropertyRules = []; foreach(Utils::stringifyKeys($candidateFlattenedValues) as $propertyName => $filters){ foreach(Utils::stringifyKeys($filters) as $filter => $valueToId){ @@ -340,11 +347,26 @@ function buildFlattenPropertyRules(array $candidateFlattenedValues) : array{ } } + $allNumeric = true; + if(count($valueMap) > 0){ + foreach(Utils::stringifyKeys($valueMap) as $value => $newValue){ + if(!is_numeric($value)){ + $allNumeric = false; + break; + } + } + if($allNumeric){ + //add a dummy key to force the JSON to be an object and not a list + $valueMap["dummy"] = "map_not_list"; + } + } + $flattenPropertyRules[$propertyName][$filter] = new BlockStateUpgradeSchemaFlattenedName( $idPrefix, $propertyName, $idSuffix, - $valueMap + $valueMap, + $candidateFlattenPropertyTypes[$propertyName], ); } } @@ -407,16 +429,25 @@ function processRemappedStates(array $upgradeTable) : array{ $notFlattenedProperties = []; $candidateFlattenedValues = []; + $candidateFlattenedPropertyTypes = []; foreach($upgradeTable as $pair){ foreach(Utils::stringifyKeys($pair->old->getStates()) as $propertyName => $propertyValue){ if(isset($notFlattenedProperties[$propertyName])){ continue; } - if(!$propertyValue instanceof StringTag){ + if(!$propertyValue instanceof StringTag && !$propertyValue instanceof IntTag && !$propertyValue instanceof ByteTag){ $notFlattenedProperties[$propertyName] = true; continue; } - $rawValue = $propertyValue->getValue(); + $previousType = $candidateFlattenedPropertyTypes[$propertyName] ?? null; + if($previousType !== null && $previousType !== get_class($propertyValue)){ + //mismatched types for the same property name - this has never happened so far, but it's not impossible + $notFlattenedProperties[$propertyName] = true; + continue; + } + $candidateFlattenedPropertyTypes[$propertyName] = get_class($propertyValue); + + $rawValue = (string) $propertyValue->getValue(); if($rawValue === ""){ $notFlattenedProperties[$propertyName] = true; continue; @@ -458,7 +489,7 @@ function processRemappedStates(array $upgradeTable) : array{ unset($candidateFlattenedValues[$propertyName]); } - $flattenedProperties = buildFlattenPropertyRules($candidateFlattenedValues); + $flattenedProperties = buildFlattenPropertyRules($candidateFlattenedValues, $candidateFlattenedPropertyTypes); $flattenProperty = array_key_first($flattenedProperties); //Properties with fewer rules take up less space for the same result foreach(Utils::stringifyKeys($flattenedProperties) as $propertyName => $rules){ @@ -485,8 +516,8 @@ function processRemappedStates(array $upgradeTable) : array{ ksort($cleanedNewState); if($flattenProperty !== null){ $flattenedValue = $cleanedOldState[$flattenProperty] ?? null; - if(!$flattenedValue instanceof StringTag){ - throw new AssumptionFailedError("This should always be a TAG_String ($newName $flattenProperty)"); + if(!$flattenedValue instanceof StringTag && !$flattenedValue instanceof IntTag && !$flattenedValue instanceof ByteTag){ + throw new AssumptionFailedError("Non-flattenable type of tag ($newName $flattenProperty) but have " . get_debug_type($flattenedValue)); } unset($cleanedOldState[$flattenProperty]); } From d0d7a995fb60a493462323208ff2b887003cef44 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 5 Aug 2024 22:38:32 +0100 Subject: [PATCH 1748/1858] Add a TODO in BlockStateUpgrader this issue can be worked around by adding a dummy schema, but it's a bit clunky. --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index ddb1e13591..b0612585c0 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -83,6 +83,8 @@ final class BlockStateUpgrader{ * version doesn't tell us which of the schemas have already been applied. * If there's only one schema for a version (the norm), we can safely assume it's already been applied if * the version is the same, and skip over it. + * TODO: this causes issues when testing isolated schemas since there will only be one schema for a version. + * The second check should be disabled for that case. */ if($version > $resultVersion || (count($schemaList) === 1 && $version === $resultVersion)){ continue; From 2aa64dc15ef7bf0b35fb233e8d5348c258d9034d Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Mon, 5 Aug 2024 17:13:23 -0500 Subject: [PATCH 1749/1858] Simplify phpstan-doc type hint for better readability --- .../block/upgrade/BlockStateUpgradeSchemaFlattenedName.php | 2 +- tools/generate-blockstate-upgrade-schema.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php index e2f7f798d4..8259f690d0 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php @@ -34,7 +34,7 @@ final class BlockStateUpgradeSchemaFlattenedName{ /** * @param string[] $flattenedValueRemaps * @phpstan-param array $flattenedValueRemaps - * @phpstan-param class-string|class-string|class-string|null $flattenedPropertyType + * @phpstan-param ?class-string $flattenedPropertyType */ public function __construct( public string $prefix, diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index d2d0a8c417..43bcc71f12 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -318,7 +318,7 @@ function findCommonSuffix(array $strings) : string{ * @param string[][][] $candidateFlattenedValues * @phpstan-param array>> $candidateFlattenedValues * @param string[] $candidateFlattenPropertyTypes - * @phpstan-param array|class-string|class-string> $candidateFlattenPropertyTypes + * @phpstan-param array> $candidateFlattenPropertyTypes * * @return BlockStateUpgradeSchemaFlattenedName[][] * @phpstan-return array> From c4a2b6494d9293e7473461464087a1f423ca055b Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:12:47 +0200 Subject: [PATCH 1750/1858] Implement Aqua Affinity enchantment (#6408) --- src/data/bedrock/EnchantmentIdMap.php | 1 + src/item/enchantment/AvailableEnchantmentRegistry.php | 1 + src/item/enchantment/StringToEnchantmentParser.php | 1 + src/item/enchantment/VanillaEnchantments.php | 10 ++++++++++ 4 files changed, 13 insertions(+) diff --git a/src/data/bedrock/EnchantmentIdMap.php b/src/data/bedrock/EnchantmentIdMap.php index ae2460cfeb..e3d652b19c 100644 --- a/src/data/bedrock/EnchantmentIdMap.php +++ b/src/data/bedrock/EnchantmentIdMap.php @@ -43,6 +43,7 @@ final class EnchantmentIdMap{ $this->register(EnchantmentIds::PROJECTILE_PROTECTION, VanillaEnchantments::PROJECTILE_PROTECTION()); $this->register(EnchantmentIds::THORNS, VanillaEnchantments::THORNS()); $this->register(EnchantmentIds::RESPIRATION, VanillaEnchantments::RESPIRATION()); + $this->register(EnchantmentIds::AQUA_AFFINITY, VanillaEnchantments::AQUA_AFFINITY()); $this->register(EnchantmentIds::SHARPNESS, VanillaEnchantments::SHARPNESS()); //TODO: smite, bane of arthropods (these don't make sense now because their applicable mobs don't exist yet) diff --git a/src/item/enchantment/AvailableEnchantmentRegistry.php b/src/item/enchantment/AvailableEnchantmentRegistry.php index 2c6f421ede..cae94c666f 100644 --- a/src/item/enchantment/AvailableEnchantmentRegistry.php +++ b/src/item/enchantment/AvailableEnchantmentRegistry.php @@ -56,6 +56,7 @@ final class AvailableEnchantmentRegistry{ $this->register(Enchantments::PROJECTILE_PROTECTION(), [Tags::ARMOR], []); $this->register(Enchantments::THORNS(), [Tags::CHESTPLATE], [Tags::HELMET, Tags::LEGGINGS, Tags::BOOTS]); $this->register(Enchantments::RESPIRATION(), [Tags::HELMET], []); + $this->register(Enchantments::AQUA_AFFINITY(), [Tags::HELMET], []); $this->register(Enchantments::SHARPNESS(), [Tags::SWORD, Tags::AXE], []); $this->register(Enchantments::KNOCKBACK(), [Tags::SWORD], []); $this->register(Enchantments::FIRE_ASPECT(), [Tags::SWORD], []); diff --git a/src/item/enchantment/StringToEnchantmentParser.php b/src/item/enchantment/StringToEnchantmentParser.php index cd57eb203a..47a750ff27 100644 --- a/src/item/enchantment/StringToEnchantmentParser.php +++ b/src/item/enchantment/StringToEnchantmentParser.php @@ -52,6 +52,7 @@ final class StringToEnchantmentParser extends StringToTParser{ $result->register("protection", fn() => VanillaEnchantments::PROTECTION()); $result->register("punch", fn() => VanillaEnchantments::PUNCH()); $result->register("respiration", fn() => VanillaEnchantments::RESPIRATION()); + $result->register("aqua_affinity", fn() => VanillaEnchantments::AQUA_AFFINITY()); $result->register("sharpness", fn() => VanillaEnchantments::SHARPNESS()); $result->register("silk_touch", fn() => VanillaEnchantments::SILK_TOUCH()); $result->register("swift_sneak", fn() => VanillaEnchantments::SWIFT_SNEAK()); diff --git a/src/item/enchantment/VanillaEnchantments.php b/src/item/enchantment/VanillaEnchantments.php index 779098c770..19ce397163 100644 --- a/src/item/enchantment/VanillaEnchantments.php +++ b/src/item/enchantment/VanillaEnchantments.php @@ -33,6 +33,7 @@ use pocketmine\utils\RegistryTrait; * @see build/generate-registry-annotations.php * @generate-registry-docblock * + * @method static Enchantment AQUA_AFFINITY() * @method static ProtectionEnchantment BLAST_PROTECTION() * @method static Enchantment EFFICIENCY() * @method static ProtectionEnchantment FEATHER_FALLING() @@ -144,6 +145,15 @@ final class VanillaEnchantments{ fn(int $level) : int => 10 * $level, 30 )); + self::register("AQUA_AFFINITY", new Enchantment( + KnownTranslationFactory::enchantment_waterWorker(), + Rarity::RARE, + 0, + 0, + 1, + null, + 40 + )); self::register("SHARPNESS", new SharpnessEnchantment( KnownTranslationFactory::enchantment_damage_all(), From 5a926a79cb97f284c64c754d3f60fba8348435b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:21:20 +0000 Subject: [PATCH 1751/1858] Bump phpstan/phpstan in the development-patch-updates group (#6412) --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index d035ff9354..28ef5e9c2e 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.11.8", + "phpstan/phpstan": "1.11.9", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.5.24" diff --git a/composer.lock b/composer.lock index 7cc34ff981..e3211e7c5b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3ee9506c0be6b8b202d790824344e79c", + "content-hash": "cddee8096f4b575629ff671000543d3f", "packages": [ { "name": "adhocore/json-comment", @@ -1389,16 +1389,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.8", + "version": "1.11.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec" + "reference": "e370bcddadaede0c1716338b262346f40d296f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec", - "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82", + "reference": "e370bcddadaede0c1716338b262346f40d296f82", "shasum": "" }, "require": { @@ -1443,7 +1443,7 @@ "type": "github" } ], - "time": "2024-07-24T07:01:22+00:00" + "time": "2024-08-01T16:25:18+00:00" }, { "name": "phpstan/phpstan-phpunit", From 26761c2b87608afb6b2bbdfa5daa96bda53adcb9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 9 Aug 2024 12:37:08 +0100 Subject: [PATCH 1752/1858] Blockstate schema tool now supports testing schemas as well as generating them this is useful when making changes to the generator, since regenerated schemas can now be tested for validity. This helps to find bugs in the generator. --- ...hp => blockstate-upgrade-schema-utils.php} | 70 +++++++++++++++---- 1 file changed, 55 insertions(+), 15 deletions(-) rename tools/{generate-blockstate-upgrade-schema.php => blockstate-upgrade-schema-utils.php} (90%) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/blockstate-upgrade-schema-utils.php similarity index 90% rename from tools/generate-blockstate-upgrade-schema.php rename to tools/blockstate-upgrade-schema-utils.php index 43bcc71f12..c8dafcb675 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -21,9 +21,10 @@ declare(strict_types=1); -namespace pocketmine\tools\generate_blockstate_upgrade_schema; +namespace pocketmine\tools\blockstate_upgrade_schema_utils; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenedName; @@ -607,32 +608,71 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad return $result; } +/** + * @param BlockStateMapping[][] $upgradeTable + * @phpstan-param array> $upgradeTable + */ +function testBlockStateUpgradeSchema(array $upgradeTable, BlockStateUpgradeSchema $schema) : bool{ + //TODO: HACK! + //the upgrader won't apply the schema if it's the same version and there's only one schema with a matching version + //ID (for performance reasons), which is a problem for testing isolated schemas + //add a dummy schema to bypass this optimization + $dummySchema = new BlockStateUpgradeSchema($schema->maxVersionMajor, $schema->maxVersionMinor, $schema->maxVersionPatch, $schema->maxVersionRevision, $schema->getSchemaId() + 1); + $upgrader = new BlockStateUpgrader([$schema, $dummySchema]); + + foreach($upgradeTable as $mappingsByOldName){ + foreach($mappingsByOldName as $mapping){ + $expectedNewState = $mapping->new; + + $actualNewState = $upgrader->upgrade($mapping->old); + + if(!$expectedNewState->equals($actualNewState)){ + \GlobalLogger::get()->error("Expected: " . $expectedNewState->toNbt()); + \GlobalLogger::get()->error("Actual: " . $actualNewState->toNbt()); + return false; + } + } + } + + return true; +} + /** * @param string[] $argv */ function main(array $argv) : int{ - if(count($argv) !== 3){ - fwrite(STDERR, "Required arguments: input file path, output file path\n"); + if(count($argv) !== 4 || ($argv[1] !== "generate" && $argv[1] !== "test")){ + fwrite(STDERR, "Required arguments: \n"); return 1; } - $input = $argv[1]; - $output = $argv[2]; + $mode = $argv[1]; + $upgradeTableFile = $argv[2]; + $schemaFile = $argv[3]; - $table = loadUpgradeTable($input, false); + $table = loadUpgradeTable($upgradeTableFile, false); ksort($table, SORT_STRING); - $diff = generateBlockStateUpgradeSchema($table); - if($diff->isEmpty()){ - \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); - return 0; + if($mode === "generate"){ + $diff = generateBlockStateUpgradeSchema($table); + if($diff->isEmpty()){ + \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); + return 0; + } + file_put_contents( + $schemaFile, + json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" + ); + \GlobalLogger::get()->info("Schema file $schemaFile generated successfully."); + }else{ + $schema = BlockStateUpgradeSchemaUtils::loadSchemaFromString(Filesystem::fileGetContents($schemaFile), 0); + if(!testBlockStateUpgradeSchema($table, $schema)){ + \GlobalLogger::get()->error("Schema $schemaFile does not produce the results predicted by $upgradeTableFile"); + return 1; + } + \GlobalLogger::get()->info("Schema $schemaFile is valid according to $upgradeTableFile"); } - file_put_contents( - $output, - json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" - ); - \GlobalLogger::get()->info("Schema file $output generated successfully."); return 0; } From 33dc995cc748cd6967c32a65844d88d28df45037 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 9 Aug 2024 13:12:46 +0100 Subject: [PATCH 1753/1858] blockstate-upgrade-schema-utils: added a command to update old schemas to a newer format this is useful when the generator was updated with new features & optimisations, to reduce the size and/or improve readability of existing schemas. --- tools/blockstate-upgrade-schema-utils.php | 137 ++++++++++++++++------ 1 file changed, 104 insertions(+), 33 deletions(-) diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index c8dafcb675..a9069d4294 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -36,6 +36,7 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\nbt\TreeRoot; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; @@ -90,18 +91,18 @@ function encodeProperty(Tag $tag) : string{ } /** + * @param TreeRoot[] $oldNewStateList + * @phpstan-param list $oldNewStateList + * * @return BlockStateMapping[][] * @phpstan-return array> */ -function loadUpgradeTable(string $file, bool $reverse) : array{ - $contents = Filesystem::fileGetContents($file); - $data = (new NetworkNbtSerializer())->readMultiple($contents); - +function buildUpgradeTableFromData(array $oldNewStateList, bool $reverse) : array{ $result = []; - for($i = 0; isset($data[$i]); $i += 2){ - $oldTag = $data[$i]->mustGetCompoundTag(); - $newTag = $data[$i + 1]->mustGetCompoundTag(); + for($i = 0; isset($oldNewStateList[$i]); $i += 2){ + $oldTag = $oldNewStateList[$i]->mustGetCompoundTag(); + $newTag = $oldNewStateList[$i + 1]->mustGetCompoundTag(); $old = BlockStateData::fromNbt($reverse ? $newTag : $oldTag); $new = BlockStateData::fromNbt($reverse ? $oldTag : $newTag); @@ -114,6 +115,17 @@ function loadUpgradeTable(string $file, bool $reverse) : array{ return $result; } +/** + * @return BlockStateMapping[][] + * @phpstan-return array> + */ +function loadUpgradeTableFromFile(string $file, bool $reverse) : array{ + $contents = Filesystem::fileGetContents($file); + $data = (new NetworkNbtSerializer())->readMultiple($contents); + + return buildUpgradeTableFromData($data, $reverse); +} + /** * @param BlockStateData[] $states * @phpstan-param array $states @@ -640,41 +652,100 @@ function testBlockStateUpgradeSchema(array $upgradeTable, BlockStateUpgradeSchem /** * @param string[] $argv */ -function main(array $argv) : int{ - if(count($argv) !== 4 || ($argv[1] !== "generate" && $argv[1] !== "test")){ - fwrite(STDERR, "Required arguments: \n"); - return 1; - } - - $mode = $argv[1]; +function cmdGenerate(array $argv) : int{ $upgradeTableFile = $argv[2]; $schemaFile = $argv[3]; - $table = loadUpgradeTable($upgradeTableFile, false); + $table = loadUpgradeTableFromFile($upgradeTableFile, false); ksort($table, SORT_STRING); - if($mode === "generate"){ - $diff = generateBlockStateUpgradeSchema($table); - if($diff->isEmpty()){ - \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); - return 0; - } - file_put_contents( - $schemaFile, - json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" - ); - \GlobalLogger::get()->info("Schema file $schemaFile generated successfully."); - }else{ - $schema = BlockStateUpgradeSchemaUtils::loadSchemaFromString(Filesystem::fileGetContents($schemaFile), 0); - if(!testBlockStateUpgradeSchema($table, $schema)){ - \GlobalLogger::get()->error("Schema $schemaFile does not produce the results predicted by $upgradeTableFile"); - return 1; - } - \GlobalLogger::get()->info("Schema $schemaFile is valid according to $upgradeTableFile"); + $diff = generateBlockStateUpgradeSchema($table); + if($diff->isEmpty()){ + \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); + return 0; } + file_put_contents( + $schemaFile, + json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" + ); + \GlobalLogger::get()->info("Schema file $schemaFile generated successfully."); + return 0; +} + +/** + * @param string[] $argv + */ +function cmdTest(array $argv) : int{ + $upgradeTableFile = $argv[2]; + $schemaFile = $argv[3]; + + $table = loadUpgradeTableFromFile($upgradeTableFile, false); + + ksort($table, SORT_STRING); + + $schema = BlockStateUpgradeSchemaUtils::loadSchemaFromString(Filesystem::fileGetContents($schemaFile), 0); + if(!testBlockStateUpgradeSchema($table, $schema)){ + \GlobalLogger::get()->error("Schema $schemaFile does not produce the results predicted by $upgradeTableFile"); + return 1; + } + \GlobalLogger::get()->info("Schema $schemaFile is valid according to $upgradeTableFile"); return 0; } +/** + * @param string[] $argv + */ +function cmdUpdate(array $argv) : int{ + [, , $oldSchemaFile, $oldPaletteFile, $newSchemaFile] = $argv; + + $palette = BlockStateDictionary::loadPaletteFromString(Filesystem::fileGetContents($oldPaletteFile)); + $schema = BlockStateUpgradeSchemaUtils::loadSchemaFromString(Filesystem::fileGetContents($oldSchemaFile), 0); + //TODO: HACK! + //the upgrader won't apply the schema if it's the same version and there's only one schema with a matching version + //ID (for performance reasons), which is a problem for testing isolated schemas + //add a dummy schema to bypass this optimization + $dummySchema = new BlockStateUpgradeSchema($schema->maxVersionMajor, $schema->maxVersionMinor, $schema->maxVersionPatch, $schema->maxVersionRevision, $schema->getSchemaId() + 1); + $upgrader = new BlockStateUpgrader([$schema, $dummySchema]); + + $tags = []; + foreach($palette as $stateData){ + $tags[] = new TreeRoot($stateData->toNbt()); + $tags[] = new TreeRoot($upgrader->upgrade($stateData)->toNbt()); + } + + $upgradeTable = buildUpgradeTableFromData($tags, false); + $newSchema = generateBlockStateUpgradeSchema($upgradeTable); + file_put_contents( + $newSchemaFile, + json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($newSchema), JSON_PRETTY_PRINT) . "\n" + ); + \GlobalLogger::get()->info("Schema file $newSchemaFile updated to new format (from $oldSchemaFile) successfully."); + return 0; +} + +/** + * @param string[] $argv + */ +function main(array $argv) : int{ + $options = [ + "generate" => [["palette upgrade table file", "schema output file"], cmdGenerate(...)], + "test" => [["palette upgrade table file", "schema output file"], cmdTest(...)], + "update" => [["schema input file", "old palette file", "updated schema output file"], cmdUpdate(...)] + ]; + + $selected = $argv[1] ?? null; + if($selected === null || !isset($options[$selected])){ + fwrite(STDERR, "Available commands:\n"); + foreach($options as $command => [$args, $callback]){ + fwrite(STDERR, " - $command " . implode(" ", array_map(fn(string $a) => "<$a>", $args)) . "\n"); + } + return 1; + } + + $callback = $options[$selected][1]; + return $callback($argv); +} + exit(main($argv)); From 25c66e4c8b397ea677f3ad9e48c13ad97e79ceb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 13:36:14 +0000 Subject: [PATCH 1754/1858] Bump phpstan/phpstan in the development-patch-updates group (#6420) --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 28ef5e9c2e..5c1282c45b 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.11.9", + "phpstan/phpstan": "1.11.10", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.5.24" diff --git a/composer.lock b/composer.lock index e3211e7c5b..128c28e676 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cddee8096f4b575629ff671000543d3f", + "content-hash": "38063b4fcc2e80a5bccb8d5cc8623cf8", "packages": [ { "name": "adhocore/json-comment", @@ -1389,16 +1389,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.9", + "version": "1.11.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e370bcddadaede0c1716338b262346f40d296f82" + "reference": "640410b32995914bde3eed26fa89552f9c2c082f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82", - "reference": "e370bcddadaede0c1716338b262346f40d296f82", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", + "reference": "640410b32995914bde3eed26fa89552f9c2c082f", "shasum": "" }, "require": { @@ -1443,7 +1443,7 @@ "type": "github" } ], - "time": "2024-08-01T16:25:18+00:00" + "time": "2024-08-08T09:02:50+00:00" }, { "name": "phpstan/phpstan-phpunit", From d077bda30ce21187e51cc2a41400b90e14a58039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:35:01 +0000 Subject: [PATCH 1755/1858] Bump docker/build-push-action from 6.5.0 to 6.6.1 (#6419) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b3d6661e91..4f045bdc9b 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.5.0 + uses: docker/build-push-action@v6.6.1 with: push: true context: ./pocketmine-mp From 13f5cc9f873a887d87dcfc0d894700f07752fbc8 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:11:22 +0300 Subject: [PATCH 1756/1858] ChiseledBookshelf: fixed function visibility (#6421) --- src/block/tile/ChiseledBookshelf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/tile/ChiseledBookshelf.php b/src/block/tile/ChiseledBookshelf.php index f9d61e7eb6..6455208fec 100644 --- a/src/block/tile/ChiseledBookshelf.php +++ b/src/block/tile/ChiseledBookshelf.php @@ -59,7 +59,7 @@ class ChiseledBookshelf extends Tile implements Container{ $this->loadItems($nbt); } - public function writeSaveData(CompoundTag $nbt) : void{ + protected function writeSaveData(CompoundTag $nbt) : void{ $this->saveItems($nbt); } From 585dc835e7c50f49e301d41d055821987fb62e5d Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:19:07 +0300 Subject: [PATCH 1757/1858] Fixed anvil placing rotation. (#6375) Co-authored-by: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> --- src/block/Anvil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 916c390ef6..4b4afef615 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -91,7 +91,7 @@ class Anvil extends Transparent implements Fallable{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($player !== null){ - $this->facing = Facing::rotateY($player->getHorizontalFacing(), true); + $this->facing = Facing::rotateY($player->getHorizontalFacing(), false); } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } From 929cd631355ecac724a1636ebf905309dd5cb1fd Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Tue, 13 Aug 2024 10:55:29 -0500 Subject: [PATCH 1758/1858] Release 5.17.1 --- changelogs/5.17.md | 13 +++++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/changelogs/5.17.md b/changelogs/5.17.md index 1b40847100..b26f38b8a0 100644 --- a/changelogs/5.17.md +++ b/changelogs/5.17.md @@ -23,3 +23,16 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Bowl can now be used as fuel. - Bells always drops themselves even when using an incompatible tool. + +# 5.17.1 +Released 13th August 2024. + +## Documentation +- Added a note about `BlockStateData::CURRENT_VERSION`. + +## Fixes +- Fixed anvil placement rotation to match vanilla. +- Fixed outdated `BedrockWorldData` version, this was preventing use newer worlds. + +## Internals +- Dependabot: PHPStan and patch updates are now grouped into a single PR. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index bc4154e86b..1d0a9a608a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.17.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From f5ab2979a070d0ad03faf2e431290b97b690a637 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Tue, 13 Aug 2024 10:56:03 -0500 Subject: [PATCH 1759/1858] 5.17.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 1d0a9a608a..5162560bfa 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.17.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.17.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8c3cf7a6874953a871452d239e0b204ae950fbec Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Wed, 14 Aug 2024 22:48:10 -0500 Subject: [PATCH 1760/1858] Use VISIBLE_MOB_EFFECTS actor metadata property to send effect bubbles (#6414) Close #6402 --- composer.json | 2 +- composer.lock | 12 ++++++------ src/entity/Living.php | 28 ++++++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 5c1282c45b..21e3619a5e 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "pocketmine/bedrock-block-upgrade-schema": "~4.2.0+bedrock-1.21.0", "pocketmine/bedrock-data": "~2.11.0+bedrock-1.21.0", "pocketmine/bedrock-item-upgrade-schema": "~1.10.0+bedrock-1.21.0", - "pocketmine/bedrock-protocol": "~32.1.0+bedrock-1.21.2", + "pocketmine/bedrock-protocol": "~32.2.0+bedrock-1.21.2", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 128c28e676..9d175040a5 100644 --- a/composer.lock +++ b/composer.lock @@ -205,16 +205,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "32.1.0+bedrock-1.21.2", + "version": "32.2.0+bedrock-1.21.2", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "bb23db51365bdc91d3135c3885986a691ae1cb44" + "reference": "229e5f3ae676a8601c576b7a57e56060b611d68d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/bb23db51365bdc91d3135c3885986a691ae1cb44", - "reference": "bb23db51365bdc91d3135c3885986a691ae1cb44", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/229e5f3ae676a8601c576b7a57e56060b611d68d", + "reference": "229e5f3ae676a8601c576b7a57e56060b611d68d", "shasum": "" }, "require": { @@ -245,9 +245,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/32.1.0+bedrock-1.21.2" + "source": "https://github.com/pmmp/BedrockProtocol/tree/32.2.0+bedrock-1.21.2" }, - "time": "2024-07-10T01:38:43+00:00" + "time": "2024-08-10T19:23:18+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/entity/Living.php b/src/entity/Living.php index b0d14957cb..81f46424f1 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -68,6 +68,7 @@ use function atan2; use function ceil; use function count; use function floor; +use function ksort; use function lcg_value; use function max; use function min; @@ -76,6 +77,7 @@ use function mt_rand; use function round; use function sqrt; use const M_PI; +use const SORT_NUMERIC; abstract class Living extends Entity{ protected const DEFAULT_BREATH_TICKS = 300; @@ -883,8 +885,30 @@ abstract class Living extends Entity{ protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); - $properties->setByte(EntityMetadataProperties::POTION_AMBIENT, $this->effectManager->hasOnlyAmbientEffects() ? 1 : 0); - $properties->setInt(EntityMetadataProperties::POTION_COLOR, Binary::signInt($this->effectManager->getBubbleColor()->toARGB())); + $visibleEffects = []; + foreach ($this->effectManager->all() as $effect) { + if (!$effect->isVisible() || !$effect->getType()->hasBubbles()) { + continue; + } + $visibleEffects[EffectIdMap::getInstance()->toId($effect->getType())] = $effect->isAmbient(); + } + + //TODO: HACK! the client may not be able to identify effects if they are not sorted. + ksort($visibleEffects, SORT_NUMERIC); + + $effectsData = 0; + $packedEffectsCount = 0; + foreach ($visibleEffects as $effectId => $isAmbient) { + $effectsData = ($effectsData << 7) | + (($effectId & 0x3f) << 1) | //Why not use 7 bits instead of only 6? mojang... + ($isAmbient ? 1 : 0); + + if (++$packedEffectsCount >= 8) { + break; + } + } + $properties->setLong(EntityMetadataProperties::VISIBLE_MOB_EFFECTS, $effectsData); + $properties->setShort(EntityMetadataProperties::AIR, $this->breathTicks); $properties->setShort(EntityMetadataProperties::MAX_AIR, $this->maxBreathTicks); From 0f365886e0b3d9a929f5433f62bbc9247b1dda64 Mon Sep 17 00:00:00 2001 From: Dries C Date: Fri, 16 Aug 2024 12:26:49 +0200 Subject: [PATCH 1761/1858] Assemble 1.21.20 (#6423) Co-authored-by: Dylan T. Co-authored-by: IvanCraft623 --- composer.json | 8 +- composer.lock | 46 ++-- src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 13 - .../bedrock/block/BlockStateStringValues.php | 66 ----- src/data/bedrock/block/BlockTypeNames.php | 117 +++++++-- .../convert/BlockObjectToStateSerializer.php | 204 +++++++-------- .../convert/BlockStateDeserializerHelper.php | 61 ----- .../convert/BlockStateSerializerHelper.php | 39 +-- .../BlockStateToObjectDeserializer.php | 232 +++++++++--------- src/data/bedrock/item/ItemTypeNames.php | 12 + src/network/mcpe/InventoryManager.php | 11 +- src/network/mcpe/NetworkSession.php | 2 +- .../mcpe/StandardEntityEventBroadcaster.php | 4 +- .../mcpe/handler/ItemStackRequestExecutor.php | 8 +- .../mcpe/handler/ItemStackResponseBuilder.php | 3 +- src/world/format/io/data/BedrockWorldData.php | 6 +- 17 files changed, 386 insertions(+), 450 deletions(-) diff --git a/composer.json b/composer.json index 21e3619a5e..5d1167b6d8 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.2.0+bedrock-1.21.0", - "pocketmine/bedrock-data": "~2.11.0+bedrock-1.21.0", - "pocketmine/bedrock-item-upgrade-schema": "~1.10.0+bedrock-1.21.0", - "pocketmine/bedrock-protocol": "~32.2.0+bedrock-1.21.2", + "pocketmine/bedrock-block-upgrade-schema": "~4.3.0+bedrock-1.21.20", + "pocketmine/bedrock-data": "~2.12.0+bedrock-1.21.20", + "pocketmine/bedrock-item-upgrade-schema": "~1.11.0+bedrock-1.21.20", + "pocketmine/bedrock-protocol": "~33.0.0+bedrock-1.21.20", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index 9d175040a5..5eb9a21585 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "38063b4fcc2e80a5bccb8d5cc8623cf8", + "content-hash": "fab1e131dfd049da39a87d4e562f1870", "packages": [ { "name": "adhocore/json-comment", @@ -127,16 +127,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "8a327197b3b462fa282f40f76b070ffe585a25d2" + "reference": "53d3a41c37ce90d58b33130cdadad08e442d7c47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/8a327197b3b462fa282f40f76b070ffe585a25d2", - "reference": "8a327197b3b462fa282f40f76b070ffe585a25d2", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/53d3a41c37ce90d58b33130cdadad08e442d7c47", + "reference": "53d3a41c37ce90d58b33130cdadad08e442d7c47", "shasum": "" }, "type": "library", @@ -147,22 +147,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.2.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.3.0" }, - "time": "2024-06-13T17:28:26+00:00" + "time": "2024-08-13T18:04:27+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.11.0+bedrock-1.21.0", + "version": "2.12.0+bedrock-1.21.20", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "cae40bde98081b388c4d3ab59d45b8d1cf5d8761" + "reference": "d4ee3d08964fa16fbbdd04af1fb52bbde540b665" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/cae40bde98081b388c4d3ab59d45b8d1cf5d8761", - "reference": "cae40bde98081b388c4d3ab59d45b8d1cf5d8761", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d4ee3d08964fa16fbbdd04af1fb52bbde540b665", + "reference": "d4ee3d08964fa16fbbdd04af1fb52bbde540b665", "shasum": "" }, "type": "library", @@ -173,22 +173,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.0" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.20" }, - "time": "2024-06-13T17:17:55+00:00" + "time": "2024-08-15T12:50:26+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.10.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "b4687afa19f91eacebd46c40d487f4cc515be504" + "reference": "35c18d093fc2b12da8737b2edb2c3ad6a14a53dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/b4687afa19f91eacebd46c40d487f4cc515be504", - "reference": "b4687afa19f91eacebd46c40d487f4cc515be504", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/35c18d093fc2b12da8737b2edb2c3ad6a14a53dd", + "reference": "35c18d093fc2b12da8737b2edb2c3ad6a14a53dd", "shasum": "" }, "type": "library", @@ -199,22 +199,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.10.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.11.0" }, - "time": "2024-05-15T15:15:55+00:00" + "time": "2024-08-13T18:06:25+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "32.2.0+bedrock-1.21.2", + "version": "33.0.0+bedrock-1.21.20", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "229e5f3ae676a8601c576b7a57e56060b611d68d" + "reference": "e2264137c5cd0522de2c6ee4921a3a803818ea32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/229e5f3ae676a8601c576b7a57e56060b611d68d", - "reference": "229e5f3ae676a8601c576b7a57e56060b611d68d", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e2264137c5cd0522de2c6ee4921a3a803818ea32", + "reference": "e2264137c5cd0522de2c6ee4921a3a803818ea32", "shasum": "" }, "require": { diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 2c67ded73d..1973b55af1 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -45,8 +45,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (21 << 16) | //minor - (0 << 8) | //patch - (3); //revision + (20 << 8) | //patch + (6); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index 4564f696ea..e9c33bee24 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -42,7 +42,6 @@ final class BlockStateNames{ public const BIG_DRIPLEAF_HEAD = "big_dripleaf_head"; public const BIG_DRIPLEAF_TILT = "big_dripleaf_tilt"; public const BITE_COUNTER = "bite_counter"; - public const BLOCK_LIGHT_LEVEL = "block_light_level"; public const BLOOM = "bloom"; public const BOOKS_STORED = "books_stored"; public const BREWING_STAND_SLOT_A_BIT = "brewing_stand_slot_a_bit"; @@ -61,15 +60,12 @@ final class BlockStateNames{ public const CONDITIONAL_BIT = "conditional_bit"; public const CORAL_DIRECTION = "coral_direction"; public const CORAL_FAN_DIRECTION = "coral_fan_direction"; - public const CORAL_HANG_TYPE_BIT = "coral_hang_type_bit"; public const COVERED_BIT = "covered_bit"; public const CRACKED_STATE = "cracked_state"; public const CRAFTING = "crafting"; - public const DAMAGE = "damage"; public const DEAD_BIT = "dead_bit"; public const DEPRECATED = "deprecated"; public const DIRECTION = "direction"; - public const DIRT_TYPE = "dirt_type"; public const DISARMED_BIT = "disarmed_bit"; public const DOOR_HINGE_BIT = "door_hinge_bit"; public const DRAG_DOWN = "drag_down"; @@ -100,7 +96,6 @@ final class BlockStateNames{ public const MC_FACING_DIRECTION = "minecraft:facing_direction"; public const MC_VERTICAL_HALF = "minecraft:vertical_half"; public const MOISTURIZED_AMOUNT = "moisturized_amount"; - public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; public const OCCUPIED_BIT = "occupied_bit"; public const OMINOUS = "ominous"; @@ -112,7 +107,6 @@ final class BlockStateNames{ public const PILLAR_AXIS = "pillar_axis"; public const PORTAL_AXIS = "portal_axis"; public const POWERED_BIT = "powered_bit"; - public const PRISMARINE_BLOCK_TYPE = "prismarine_block_type"; public const PROPAGULE_STAGE = "propagule_stage"; public const RAIL_DATA_BIT = "rail_data_bit"; public const RAIL_DIRECTION = "rail_direction"; @@ -120,18 +114,11 @@ final class BlockStateNames{ public const REPEATER_DELAY = "repeater_delay"; public const RESPAWN_ANCHOR_CHARGE = "respawn_anchor_charge"; public const ROTATION = "rotation"; - public const SAND_STONE_TYPE = "sand_stone_type"; - public const SAND_TYPE = "sand_type"; public const SCULK_SENSOR_PHASE = "sculk_sensor_phase"; public const SEA_GRASS_TYPE = "sea_grass_type"; public const SPONGE_TYPE = "sponge_type"; public const STABILITY = "stability"; public const STABILITY_CHECK = "stability_check"; - public const STONE_BRICK_TYPE = "stone_brick_type"; - public const STONE_SLAB_TYPE = "stone_slab_type"; - public const STONE_SLAB_TYPE_2 = "stone_slab_type_2"; - public const STONE_SLAB_TYPE_3 = "stone_slab_type_3"; - public const STONE_SLAB_TYPE_4 = "stone_slab_type_4"; public const STRIPPED_BIT = "stripped_bit"; public const STRUCTURE_BLOCK_TYPE = "structure_block_type"; public const STRUCTURE_VOID_TYPE = "structure_void_type"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 8538c3deb8..1794e240d1 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -66,14 +66,6 @@ final class BlockStateStringValues{ public const CRACKED_STATE_MAX_CRACKED = "max_cracked"; public const CRACKED_STATE_NO_CRACKS = "no_cracks"; - public const DAMAGE_BROKEN = "broken"; - public const DAMAGE_SLIGHTLY_DAMAGED = "slightly_damaged"; - public const DAMAGE_UNDAMAGED = "undamaged"; - public const DAMAGE_VERY_DAMAGED = "very_damaged"; - - public const DIRT_TYPE_COARSE = "coarse"; - public const DIRT_TYPE_NORMAL = "normal"; - public const DRIPSTONE_THICKNESS_BASE = "base"; public const DRIPSTONE_THICKNESS_FRUSTUM = "frustum"; public const DRIPSTONE_THICKNESS_MERGE = "merge"; @@ -111,13 +103,6 @@ final class BlockStateStringValues{ public const MC_VERTICAL_HALF_BOTTOM = "bottom"; public const MC_VERTICAL_HALF_TOP = "top"; - public const MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK = "chiseled_stone_brick"; - public const MONSTER_EGG_STONE_TYPE_COBBLESTONE = "cobblestone"; - public const MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK = "cracked_stone_brick"; - public const MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK = "mossy_stone_brick"; - public const MONSTER_EGG_STONE_TYPE_STONE = "stone"; - public const MONSTER_EGG_STONE_TYPE_STONE_BRICK = "stone_brick"; - public const ORIENTATION_DOWN_EAST = "down_east"; public const ORIENTATION_DOWN_NORTH = "down_north"; public const ORIENTATION_DOWN_SOUTH = "down_south"; @@ -139,18 +124,6 @@ final class BlockStateStringValues{ public const PORTAL_AXIS_X = "x"; public const PORTAL_AXIS_Z = "z"; - public const PRISMARINE_BLOCK_TYPE_BRICKS = "bricks"; - public const PRISMARINE_BLOCK_TYPE_DARK = "dark"; - public const PRISMARINE_BLOCK_TYPE_DEFAULT = "default"; - - public const SAND_STONE_TYPE_CUT = "cut"; - public const SAND_STONE_TYPE_DEFAULT = "default"; - public const SAND_STONE_TYPE_HEIROGLYPHS = "heiroglyphs"; - public const SAND_STONE_TYPE_SMOOTH = "smooth"; - - public const SAND_TYPE_NORMAL = "normal"; - public const SAND_TYPE_RED = "red"; - public const SEA_GRASS_TYPE_DEFAULT = "default"; public const SEA_GRASS_TYPE_DOUBLE_BOT = "double_bot"; public const SEA_GRASS_TYPE_DOUBLE_TOP = "double_top"; @@ -158,45 +131,6 @@ final class BlockStateStringValues{ public const SPONGE_TYPE_DRY = "dry"; public const SPONGE_TYPE_WET = "wet"; - public const STONE_BRICK_TYPE_CHISELED = "chiseled"; - public const STONE_BRICK_TYPE_CRACKED = "cracked"; - public const STONE_BRICK_TYPE_DEFAULT = "default"; - public const STONE_BRICK_TYPE_MOSSY = "mossy"; - public const STONE_BRICK_TYPE_SMOOTH = "smooth"; - - public const STONE_SLAB_TYPE_BRICK = "brick"; - public const STONE_SLAB_TYPE_COBBLESTONE = "cobblestone"; - public const STONE_SLAB_TYPE_NETHER_BRICK = "nether_brick"; - public const STONE_SLAB_TYPE_QUARTZ = "quartz"; - public const STONE_SLAB_TYPE_SANDSTONE = "sandstone"; - public const STONE_SLAB_TYPE_SMOOTH_STONE = "smooth_stone"; - public const STONE_SLAB_TYPE_STONE_BRICK = "stone_brick"; - public const STONE_SLAB_TYPE_WOOD = "wood"; - - public const STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE = "mossy_cobblestone"; - public const STONE_SLAB_TYPE_2_PRISMARINE_BRICK = "prismarine_brick"; - public const STONE_SLAB_TYPE_2_PRISMARINE_DARK = "prismarine_dark"; - public const STONE_SLAB_TYPE_2_PRISMARINE_ROUGH = "prismarine_rough"; - public const STONE_SLAB_TYPE_2_PURPUR = "purpur"; - public const STONE_SLAB_TYPE_2_RED_NETHER_BRICK = "red_nether_brick"; - public const STONE_SLAB_TYPE_2_RED_SANDSTONE = "red_sandstone"; - public const STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE = "smooth_sandstone"; - - public const STONE_SLAB_TYPE_3_ANDESITE = "andesite"; - public const STONE_SLAB_TYPE_3_DIORITE = "diorite"; - public const STONE_SLAB_TYPE_3_END_STONE_BRICK = "end_stone_brick"; - public const STONE_SLAB_TYPE_3_GRANITE = "granite"; - public const STONE_SLAB_TYPE_3_POLISHED_ANDESITE = "polished_andesite"; - public const STONE_SLAB_TYPE_3_POLISHED_DIORITE = "polished_diorite"; - public const STONE_SLAB_TYPE_3_POLISHED_GRANITE = "polished_granite"; - public const STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE = "smooth_red_sandstone"; - - public const STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE = "cut_red_sandstone"; - public const STONE_SLAB_TYPE_4_CUT_SANDSTONE = "cut_sandstone"; - public const STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK = "mossy_stone_brick"; - public const STONE_SLAB_TYPE_4_SMOOTH_QUARTZ = "smooth_quartz"; - public const STONE_SLAB_TYPE_4_STONE = "stone"; - public const STRUCTURE_BLOCK_TYPE_CORNER = "corner"; public const STRUCTURE_BLOCK_TYPE_DATA = "data"; public const STRUCTURE_BLOCK_TYPE_EXPORT = "export"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index 25433e6ebc..f74f858cef 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -56,6 +56,8 @@ final class BlockTypeNames{ public const AMETHYST_CLUSTER = "minecraft:amethyst_cluster"; public const ANCIENT_DEBRIS = "minecraft:ancient_debris"; public const ANDESITE = "minecraft:andesite"; + public const ANDESITE_DOUBLE_SLAB = "minecraft:andesite_double_slab"; + public const ANDESITE_SLAB = "minecraft:andesite_slab"; public const ANDESITE_STAIRS = "minecraft:andesite_stairs"; public const ANVIL = "minecraft:anvil"; public const AZALEA = "minecraft:azalea"; @@ -146,8 +148,10 @@ final class BlockTypeNames{ public const BRAIN_CORAL = "minecraft:brain_coral"; public const BRAIN_CORAL_BLOCK = "minecraft:brain_coral_block"; public const BRAIN_CORAL_FAN = "minecraft:brain_coral_fan"; + public const BRAIN_CORAL_WALL_FAN = "minecraft:brain_coral_wall_fan"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK_BLOCK = "minecraft:brick_block"; + public const BRICK_DOUBLE_SLAB = "minecraft:brick_double_slab"; public const BRICK_SLAB = "minecraft:brick_slab"; public const BRICK_STAIRS = "minecraft:brick_stairs"; public const BROWN_CANDLE = "minecraft:brown_candle"; @@ -167,6 +171,7 @@ final class BlockTypeNames{ public const BUBBLE_CORAL = "minecraft:bubble_coral"; public const BUBBLE_CORAL_BLOCK = "minecraft:bubble_coral_block"; public const BUBBLE_CORAL_FAN = "minecraft:bubble_coral_fan"; + public const BUBBLE_CORAL_WALL_FAN = "minecraft:bubble_coral_wall_fan"; public const BUDDING_AMETHYST = "minecraft:budding_amethyst"; public const CACTUS = "minecraft:cactus"; public const CAKE = "minecraft:cake"; @@ -205,11 +210,16 @@ final class BlockTypeNames{ public const CHERRY_WALL_SIGN = "minecraft:cherry_wall_sign"; public const CHERRY_WOOD = "minecraft:cherry_wood"; public const CHEST = "minecraft:chest"; + public const CHIPPED_ANVIL = "minecraft:chipped_anvil"; public const CHISELED_BOOKSHELF = "minecraft:chiseled_bookshelf"; public const CHISELED_COPPER = "minecraft:chiseled_copper"; public const CHISELED_DEEPSLATE = "minecraft:chiseled_deepslate"; public const CHISELED_NETHER_BRICKS = "minecraft:chiseled_nether_bricks"; public const CHISELED_POLISHED_BLACKSTONE = "minecraft:chiseled_polished_blackstone"; + public const CHISELED_QUARTZ_BLOCK = "minecraft:chiseled_quartz_block"; + public const CHISELED_RED_SANDSTONE = "minecraft:chiseled_red_sandstone"; + public const CHISELED_SANDSTONE = "minecraft:chiseled_sandstone"; + public const CHISELED_STONE_BRICKS = "minecraft:chiseled_stone_bricks"; public const CHISELED_TUFF = "minecraft:chiseled_tuff"; public const CHISELED_TUFF_BRICKS = "minecraft:chiseled_tuff_bricks"; public const CHORUS_FLOWER = "minecraft:chorus_flower"; @@ -218,12 +228,14 @@ final class BlockTypeNames{ public const CLIENT_REQUEST_PLACEHOLDER_BLOCK = "minecraft:client_request_placeholder_block"; public const COAL_BLOCK = "minecraft:coal_block"; public const COAL_ORE = "minecraft:coal_ore"; + public const COARSE_DIRT = "minecraft:coarse_dirt"; public const COBBLED_DEEPSLATE = "minecraft:cobbled_deepslate"; public const COBBLED_DEEPSLATE_DOUBLE_SLAB = "minecraft:cobbled_deepslate_double_slab"; public const COBBLED_DEEPSLATE_SLAB = "minecraft:cobbled_deepslate_slab"; public const COBBLED_DEEPSLATE_STAIRS = "minecraft:cobbled_deepslate_stairs"; public const COBBLED_DEEPSLATE_WALL = "minecraft:cobbled_deepslate_wall"; public const COBBLESTONE = "minecraft:cobblestone"; + public const COBBLESTONE_DOUBLE_SLAB = "minecraft:cobblestone_double_slab"; public const COBBLESTONE_SLAB = "minecraft:cobblestone_slab"; public const COBBLESTONE_WALL = "minecraft:cobblestone_wall"; public const COCOA = "minecraft:cocoa"; @@ -238,14 +250,12 @@ final class BlockTypeNames{ public const COPPER_GRATE = "minecraft:copper_grate"; public const COPPER_ORE = "minecraft:copper_ore"; public const COPPER_TRAPDOOR = "minecraft:copper_trapdoor"; - public const CORAL_FAN_HANG = "minecraft:coral_fan_hang"; - public const CORAL_FAN_HANG2 = "minecraft:coral_fan_hang2"; - public const CORAL_FAN_HANG3 = "minecraft:coral_fan_hang3"; public const CORNFLOWER = "minecraft:cornflower"; public const CRACKED_DEEPSLATE_BRICKS = "minecraft:cracked_deepslate_bricks"; public const CRACKED_DEEPSLATE_TILES = "minecraft:cracked_deepslate_tiles"; public const CRACKED_NETHER_BRICKS = "minecraft:cracked_nether_bricks"; public const CRACKED_POLISHED_BLACKSTONE_BRICKS = "minecraft:cracked_polished_blackstone_bricks"; + public const CRACKED_STONE_BRICKS = "minecraft:cracked_stone_bricks"; public const CRAFTER = "minecraft:crafter"; public const CRAFTING_TABLE = "minecraft:crafting_table"; public const CRIMSON_BUTTON = "minecraft:crimson_button"; @@ -270,6 +280,12 @@ final class BlockTypeNames{ public const CUT_COPPER = "minecraft:cut_copper"; public const CUT_COPPER_SLAB = "minecraft:cut_copper_slab"; public const CUT_COPPER_STAIRS = "minecraft:cut_copper_stairs"; + public const CUT_RED_SANDSTONE = "minecraft:cut_red_sandstone"; + public const CUT_RED_SANDSTONE_DOUBLE_SLAB = "minecraft:cut_red_sandstone_double_slab"; + public const CUT_RED_SANDSTONE_SLAB = "minecraft:cut_red_sandstone_slab"; + public const CUT_SANDSTONE = "minecraft:cut_sandstone"; + public const CUT_SANDSTONE_DOUBLE_SLAB = "minecraft:cut_sandstone_double_slab"; + public const CUT_SANDSTONE_SLAB = "minecraft:cut_sandstone_slab"; public const CYAN_CANDLE = "minecraft:cyan_candle"; public const CYAN_CANDLE_CAKE = "minecraft:cyan_candle_cake"; public const CYAN_CARPET = "minecraft:cyan_carpet"; @@ -281,6 +297,8 @@ final class BlockTypeNames{ public const CYAN_STAINED_GLASS_PANE = "minecraft:cyan_stained_glass_pane"; public const CYAN_TERRACOTTA = "minecraft:cyan_terracotta"; public const CYAN_WOOL = "minecraft:cyan_wool"; + public const DAMAGED_ANVIL = "minecraft:damaged_anvil"; + public const DANDELION = "minecraft:dandelion"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_DOUBLE_SLAB = "minecraft:dark_oak_double_slab"; @@ -296,6 +314,9 @@ final class BlockTypeNames{ public const DARK_OAK_STAIRS = "minecraft:dark_oak_stairs"; public const DARK_OAK_TRAPDOOR = "minecraft:dark_oak_trapdoor"; public const DARK_OAK_WOOD = "minecraft:dark_oak_wood"; + public const DARK_PRISMARINE = "minecraft:dark_prismarine"; + public const DARK_PRISMARINE_DOUBLE_SLAB = "minecraft:dark_prismarine_double_slab"; + public const DARK_PRISMARINE_SLAB = "minecraft:dark_prismarine_slab"; public const DARK_PRISMARINE_STAIRS = "minecraft:dark_prismarine_stairs"; public const DARKOAK_STANDING_SIGN = "minecraft:darkoak_standing_sign"; public const DARKOAK_WALL_SIGN = "minecraft:darkoak_wall_sign"; @@ -304,18 +325,23 @@ final class BlockTypeNames{ public const DEAD_BRAIN_CORAL = "minecraft:dead_brain_coral"; public const DEAD_BRAIN_CORAL_BLOCK = "minecraft:dead_brain_coral_block"; public const DEAD_BRAIN_CORAL_FAN = "minecraft:dead_brain_coral_fan"; + public const DEAD_BRAIN_CORAL_WALL_FAN = "minecraft:dead_brain_coral_wall_fan"; public const DEAD_BUBBLE_CORAL = "minecraft:dead_bubble_coral"; public const DEAD_BUBBLE_CORAL_BLOCK = "minecraft:dead_bubble_coral_block"; public const DEAD_BUBBLE_CORAL_FAN = "minecraft:dead_bubble_coral_fan"; + public const DEAD_BUBBLE_CORAL_WALL_FAN = "minecraft:dead_bubble_coral_wall_fan"; public const DEAD_FIRE_CORAL = "minecraft:dead_fire_coral"; public const DEAD_FIRE_CORAL_BLOCK = "minecraft:dead_fire_coral_block"; public const DEAD_FIRE_CORAL_FAN = "minecraft:dead_fire_coral_fan"; + public const DEAD_FIRE_CORAL_WALL_FAN = "minecraft:dead_fire_coral_wall_fan"; public const DEAD_HORN_CORAL = "minecraft:dead_horn_coral"; public const DEAD_HORN_CORAL_BLOCK = "minecraft:dead_horn_coral_block"; public const DEAD_HORN_CORAL_FAN = "minecraft:dead_horn_coral_fan"; + public const DEAD_HORN_CORAL_WALL_FAN = "minecraft:dead_horn_coral_wall_fan"; public const DEAD_TUBE_CORAL = "minecraft:dead_tube_coral"; public const DEAD_TUBE_CORAL_BLOCK = "minecraft:dead_tube_coral_block"; public const DEAD_TUBE_CORAL_FAN = "minecraft:dead_tube_coral_fan"; + public const DEAD_TUBE_CORAL_WALL_FAN = "minecraft:dead_tube_coral_wall_fan"; public const DEADBUSH = "minecraft:deadbush"; public const DECORATED_POT = "minecraft:decorated_pot"; public const DEEPSLATE = "minecraft:deepslate"; @@ -338,19 +364,18 @@ final class BlockTypeNames{ public const DEEPSLATE_TILE_WALL = "minecraft:deepslate_tile_wall"; public const DEEPSLATE_TILES = "minecraft:deepslate_tiles"; public const DENY = "minecraft:deny"; + public const DEPRECATED_ANVIL = "minecraft:deprecated_anvil"; public const DETECTOR_RAIL = "minecraft:detector_rail"; public const DIAMOND_BLOCK = "minecraft:diamond_block"; public const DIAMOND_ORE = "minecraft:diamond_ore"; public const DIORITE = "minecraft:diorite"; + public const DIORITE_DOUBLE_SLAB = "minecraft:diorite_double_slab"; + public const DIORITE_SLAB = "minecraft:diorite_slab"; public const DIORITE_STAIRS = "minecraft:diorite_stairs"; public const DIRT = "minecraft:dirt"; public const DIRT_WITH_ROOTS = "minecraft:dirt_with_roots"; public const DISPENSER = "minecraft:dispenser"; public const DOUBLE_CUT_COPPER_SLAB = "minecraft:double_cut_copper_slab"; - public const DOUBLE_STONE_BLOCK_SLAB = "minecraft:double_stone_block_slab"; - public const DOUBLE_STONE_BLOCK_SLAB2 = "minecraft:double_stone_block_slab2"; - public const DOUBLE_STONE_BLOCK_SLAB3 = "minecraft:double_stone_block_slab3"; - public const DOUBLE_STONE_BLOCK_SLAB4 = "minecraft:double_stone_block_slab4"; public const DRAGON_EGG = "minecraft:dragon_egg"; public const DRIED_KELP_BLOCK = "minecraft:dried_kelp_block"; public const DRIPSTONE_BLOCK = "minecraft:dripstone_block"; @@ -484,6 +509,8 @@ final class BlockTypeNames{ public const END_PORTAL_FRAME = "minecraft:end_portal_frame"; public const END_ROD = "minecraft:end_rod"; public const END_STONE = "minecraft:end_stone"; + public const END_STONE_BRICK_DOUBLE_SLAB = "minecraft:end_stone_brick_double_slab"; + public const END_STONE_BRICK_SLAB = "minecraft:end_stone_brick_slab"; public const ENDER_CHEST = "minecraft:ender_chest"; public const EXPOSED_CHISELED_COPPER = "minecraft:exposed_chiseled_copper"; public const EXPOSED_COPPER = "minecraft:exposed_copper"; @@ -502,6 +529,7 @@ final class BlockTypeNames{ public const FIRE_CORAL = "minecraft:fire_coral"; public const FIRE_CORAL_BLOCK = "minecraft:fire_coral_block"; public const FIRE_CORAL_FAN = "minecraft:fire_coral_fan"; + public const FIRE_CORAL_WALL_FAN = "minecraft:fire_coral_wall_fan"; public const FLETCHING_TABLE = "minecraft:fletching_table"; public const FLOWER_POT = "minecraft:flower_pot"; public const FLOWERING_AZALEA = "minecraft:flowering_azalea"; @@ -522,6 +550,8 @@ final class BlockTypeNames{ public const GOLD_ORE = "minecraft:gold_ore"; public const GOLDEN_RAIL = "minecraft:golden_rail"; public const GRANITE = "minecraft:granite"; + public const GRANITE_DOUBLE_SLAB = "minecraft:granite_double_slab"; + public const GRANITE_SLAB = "minecraft:granite_slab"; public const GRANITE_STAIRS = "minecraft:granite_stairs"; public const GRASS_BLOCK = "minecraft:grass_block"; public const GRASS_PATH = "minecraft:grass_path"; @@ -594,8 +624,15 @@ final class BlockTypeNames{ public const HORN_CORAL = "minecraft:horn_coral"; public const HORN_CORAL_BLOCK = "minecraft:horn_coral_block"; public const HORN_CORAL_FAN = "minecraft:horn_coral_fan"; + public const HORN_CORAL_WALL_FAN = "minecraft:horn_coral_wall_fan"; public const ICE = "minecraft:ice"; + public const INFESTED_CHISELED_STONE_BRICKS = "minecraft:infested_chiseled_stone_bricks"; + public const INFESTED_COBBLESTONE = "minecraft:infested_cobblestone"; + public const INFESTED_CRACKED_STONE_BRICKS = "minecraft:infested_cracked_stone_bricks"; public const INFESTED_DEEPSLATE = "minecraft:infested_deepslate"; + public const INFESTED_MOSSY_STONE_BRICKS = "minecraft:infested_mossy_stone_bricks"; + public const INFESTED_STONE = "minecraft:infested_stone"; + public const INFESTED_STONE_BRICKS = "minecraft:infested_stone_bricks"; public const INFO_UPDATE = "minecraft:info_update"; public const INFO_UPDATE2 = "minecraft:info_update2"; public const INVISIBLE_BEDROCK = "minecraft:invisible_bedrock"; @@ -633,7 +670,22 @@ final class BlockTypeNames{ public const LAVA = "minecraft:lava"; public const LECTERN = "minecraft:lectern"; public const LEVER = "minecraft:lever"; - public const LIGHT_BLOCK = "minecraft:light_block"; + public const LIGHT_BLOCK_0 = "minecraft:light_block_0"; + public const LIGHT_BLOCK_1 = "minecraft:light_block_1"; + public const LIGHT_BLOCK_10 = "minecraft:light_block_10"; + public const LIGHT_BLOCK_11 = "minecraft:light_block_11"; + public const LIGHT_BLOCK_12 = "minecraft:light_block_12"; + public const LIGHT_BLOCK_13 = "minecraft:light_block_13"; + public const LIGHT_BLOCK_14 = "minecraft:light_block_14"; + public const LIGHT_BLOCK_15 = "minecraft:light_block_15"; + public const LIGHT_BLOCK_2 = "minecraft:light_block_2"; + public const LIGHT_BLOCK_3 = "minecraft:light_block_3"; + public const LIGHT_BLOCK_4 = "minecraft:light_block_4"; + public const LIGHT_BLOCK_5 = "minecraft:light_block_5"; + public const LIGHT_BLOCK_6 = "minecraft:light_block_6"; + public const LIGHT_BLOCK_7 = "minecraft:light_block_7"; + public const LIGHT_BLOCK_8 = "minecraft:light_block_8"; + public const LIGHT_BLOCK_9 = "minecraft:light_block_9"; public const LIGHT_BLUE_CANDLE = "minecraft:light_blue_candle"; public const LIGHT_BLUE_CANDLE_CAKE = "minecraft:light_blue_candle_cake"; public const LIGHT_BLUE_CARPET = "minecraft:light_blue_carpet"; @@ -713,12 +765,16 @@ final class BlockTypeNames{ public const MELON_BLOCK = "minecraft:melon_block"; public const MELON_STEM = "minecraft:melon_stem"; public const MOB_SPAWNER = "minecraft:mob_spawner"; - public const MONSTER_EGG = "minecraft:monster_egg"; public const MOSS_BLOCK = "minecraft:moss_block"; public const MOSS_CARPET = "minecraft:moss_carpet"; public const MOSSY_COBBLESTONE = "minecraft:mossy_cobblestone"; + public const MOSSY_COBBLESTONE_DOUBLE_SLAB = "minecraft:mossy_cobblestone_double_slab"; + public const MOSSY_COBBLESTONE_SLAB = "minecraft:mossy_cobblestone_slab"; public const MOSSY_COBBLESTONE_STAIRS = "minecraft:mossy_cobblestone_stairs"; + public const MOSSY_STONE_BRICK_DOUBLE_SLAB = "minecraft:mossy_stone_brick_double_slab"; + public const MOSSY_STONE_BRICK_SLAB = "minecraft:mossy_stone_brick_slab"; public const MOSSY_STONE_BRICK_STAIRS = "minecraft:mossy_stone_brick_stairs"; + public const MOSSY_STONE_BRICKS = "minecraft:mossy_stone_bricks"; public const MOVING_BLOCK = "minecraft:moving_block"; public const MUD = "minecraft:mud"; public const MUD_BRICK_DOUBLE_SLAB = "minecraft:mud_brick_double_slab"; @@ -729,6 +785,7 @@ final class BlockTypeNames{ public const MUDDY_MANGROVE_ROOTS = "minecraft:muddy_mangrove_roots"; public const MYCELIUM = "minecraft:mycelium"; public const NETHER_BRICK = "minecraft:nether_brick"; + public const NETHER_BRICK_DOUBLE_SLAB = "minecraft:nether_brick_double_slab"; public const NETHER_BRICK_FENCE = "minecraft:nether_brick_fence"; public const NETHER_BRICK_SLAB = "minecraft:nether_brick_slab"; public const NETHER_BRICK_STAIRS = "minecraft:nether_brick_stairs"; @@ -739,6 +796,8 @@ final class BlockTypeNames{ public const NETHERITE_BLOCK = "minecraft:netherite_block"; public const NETHERRACK = "minecraft:netherrack"; public const NETHERREACTOR = "minecraft:netherreactor"; + public const NORMAL_STONE_DOUBLE_SLAB = "minecraft:normal_stone_double_slab"; + public const NORMAL_STONE_SLAB = "minecraft:normal_stone_slab"; public const NORMAL_STONE_STAIRS = "minecraft:normal_stone_stairs"; public const NOTEBLOCK = "minecraft:noteblock"; public const OAK_DOUBLE_SLAB = "minecraft:oak_double_slab"; @@ -781,6 +840,7 @@ final class BlockTypeNames{ public const PACKED_MUD = "minecraft:packed_mud"; public const PEARLESCENT_FROGLIGHT = "minecraft:pearlescent_froglight"; public const PEONY = "minecraft:peony"; + public const PETRIFIED_OAK_DOUBLE_SLAB = "minecraft:petrified_oak_double_slab"; public const PETRIFIED_OAK_SLAB = "minecraft:petrified_oak_slab"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; @@ -802,6 +862,8 @@ final class BlockTypeNames{ public const PODZOL = "minecraft:podzol"; public const POINTED_DRIPSTONE = "minecraft:pointed_dripstone"; public const POLISHED_ANDESITE = "minecraft:polished_andesite"; + public const POLISHED_ANDESITE_DOUBLE_SLAB = "minecraft:polished_andesite_double_slab"; + public const POLISHED_ANDESITE_SLAB = "minecraft:polished_andesite_slab"; public const POLISHED_ANDESITE_STAIRS = "minecraft:polished_andesite_stairs"; public const POLISHED_BASALT = "minecraft:polished_basalt"; public const POLISHED_BLACKSTONE = "minecraft:polished_blackstone"; @@ -822,8 +884,12 @@ final class BlockTypeNames{ public const POLISHED_DEEPSLATE_STAIRS = "minecraft:polished_deepslate_stairs"; public const POLISHED_DEEPSLATE_WALL = "minecraft:polished_deepslate_wall"; public const POLISHED_DIORITE = "minecraft:polished_diorite"; + public const POLISHED_DIORITE_DOUBLE_SLAB = "minecraft:polished_diorite_double_slab"; + public const POLISHED_DIORITE_SLAB = "minecraft:polished_diorite_slab"; public const POLISHED_DIORITE_STAIRS = "minecraft:polished_diorite_stairs"; public const POLISHED_GRANITE = "minecraft:polished_granite"; + public const POLISHED_GRANITE_DOUBLE_SLAB = "minecraft:polished_granite_double_slab"; + public const POLISHED_GRANITE_SLAB = "minecraft:polished_granite_slab"; public const POLISHED_GRANITE_STAIRS = "minecraft:polished_granite_stairs"; public const POLISHED_TUFF = "minecraft:polished_tuff"; public const POLISHED_TUFF_DOUBLE_SLAB = "minecraft:polished_tuff_double_slab"; @@ -837,7 +903,12 @@ final class BlockTypeNames{ public const POWERED_COMPARATOR = "minecraft:powered_comparator"; public const POWERED_REPEATER = "minecraft:powered_repeater"; public const PRISMARINE = "minecraft:prismarine"; + public const PRISMARINE_BRICK_DOUBLE_SLAB = "minecraft:prismarine_brick_double_slab"; + public const PRISMARINE_BRICK_SLAB = "minecraft:prismarine_brick_slab"; + public const PRISMARINE_BRICKS = "minecraft:prismarine_bricks"; public const PRISMARINE_BRICKS_STAIRS = "minecraft:prismarine_bricks_stairs"; + public const PRISMARINE_DOUBLE_SLAB = "minecraft:prismarine_double_slab"; + public const PRISMARINE_SLAB = "minecraft:prismarine_slab"; public const PRISMARINE_STAIRS = "minecraft:prismarine_stairs"; public const PUMPKIN = "minecraft:pumpkin"; public const PUMPKIN_STEM = "minecraft:pumpkin_stem"; @@ -853,10 +924,14 @@ final class BlockTypeNames{ public const PURPLE_TERRACOTTA = "minecraft:purple_terracotta"; public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; + public const PURPUR_DOUBLE_SLAB = "minecraft:purpur_double_slab"; + public const PURPUR_SLAB = "minecraft:purpur_slab"; public const PURPUR_STAIRS = "minecraft:purpur_stairs"; public const QUARTZ_BLOCK = "minecraft:quartz_block"; public const QUARTZ_BRICKS = "minecraft:quartz_bricks"; + public const QUARTZ_DOUBLE_SLAB = "minecraft:quartz_double_slab"; public const QUARTZ_ORE = "minecraft:quartz_ore"; + public const QUARTZ_PILLAR = "minecraft:quartz_pillar"; public const QUARTZ_SLAB = "minecraft:quartz_slab"; public const QUARTZ_STAIRS = "minecraft:quartz_stairs"; public const RAIL = "minecraft:rail"; @@ -872,8 +947,13 @@ final class BlockTypeNames{ public const RED_MUSHROOM = "minecraft:red_mushroom"; public const RED_MUSHROOM_BLOCK = "minecraft:red_mushroom_block"; public const RED_NETHER_BRICK = "minecraft:red_nether_brick"; + public const RED_NETHER_BRICK_DOUBLE_SLAB = "minecraft:red_nether_brick_double_slab"; + public const RED_NETHER_BRICK_SLAB = "minecraft:red_nether_brick_slab"; public const RED_NETHER_BRICK_STAIRS = "minecraft:red_nether_brick_stairs"; + public const RED_SAND = "minecraft:red_sand"; public const RED_SANDSTONE = "minecraft:red_sandstone"; + public const RED_SANDSTONE_DOUBLE_SLAB = "minecraft:red_sandstone_double_slab"; + public const RED_SANDSTONE_SLAB = "minecraft:red_sandstone_slab"; public const RED_SANDSTONE_STAIRS = "minecraft:red_sandstone_stairs"; public const RED_SHULKER_BOX = "minecraft:red_shulker_box"; public const RED_STAINED_GLASS = "minecraft:red_stained_glass"; @@ -894,6 +974,7 @@ final class BlockTypeNames{ public const ROSE_BUSH = "minecraft:rose_bush"; public const SAND = "minecraft:sand"; public const SANDSTONE = "minecraft:sandstone"; + public const SANDSTONE_DOUBLE_SLAB = "minecraft:sandstone_double_slab"; public const SANDSTONE_SLAB = "minecraft:sandstone_slab"; public const SANDSTONE_STAIRS = "minecraft:sandstone_stairs"; public const SCAFFOLDING = "minecraft:scaffolding"; @@ -915,10 +996,20 @@ final class BlockTypeNames{ public const SMITHING_TABLE = "minecraft:smithing_table"; public const SMOKER = "minecraft:smoker"; public const SMOOTH_BASALT = "minecraft:smooth_basalt"; + public const SMOOTH_QUARTZ = "minecraft:smooth_quartz"; + public const SMOOTH_QUARTZ_DOUBLE_SLAB = "minecraft:smooth_quartz_double_slab"; + public const SMOOTH_QUARTZ_SLAB = "minecraft:smooth_quartz_slab"; public const SMOOTH_QUARTZ_STAIRS = "minecraft:smooth_quartz_stairs"; + public const SMOOTH_RED_SANDSTONE = "minecraft:smooth_red_sandstone"; + public const SMOOTH_RED_SANDSTONE_DOUBLE_SLAB = "minecraft:smooth_red_sandstone_double_slab"; + public const SMOOTH_RED_SANDSTONE_SLAB = "minecraft:smooth_red_sandstone_slab"; public const SMOOTH_RED_SANDSTONE_STAIRS = "minecraft:smooth_red_sandstone_stairs"; + public const SMOOTH_SANDSTONE = "minecraft:smooth_sandstone"; + public const SMOOTH_SANDSTONE_DOUBLE_SLAB = "minecraft:smooth_sandstone_double_slab"; + public const SMOOTH_SANDSTONE_SLAB = "minecraft:smooth_sandstone_slab"; public const SMOOTH_SANDSTONE_STAIRS = "minecraft:smooth_sandstone_stairs"; public const SMOOTH_STONE = "minecraft:smooth_stone"; + public const SMOOTH_STONE_DOUBLE_SLAB = "minecraft:smooth_stone_double_slab"; public const SMOOTH_STONE_SLAB = "minecraft:smooth_stone_slab"; public const SNIFFER_EGG = "minecraft:sniffer_egg"; public const SNOW = "minecraft:snow"; @@ -953,15 +1044,13 @@ final class BlockTypeNames{ public const STICKY_PISTON = "minecraft:sticky_piston"; public const STICKY_PISTON_ARM_COLLISION = "minecraft:sticky_piston_arm_collision"; public const STONE = "minecraft:stone"; - public const STONE_BLOCK_SLAB2 = "minecraft:stone_block_slab2"; - public const STONE_BLOCK_SLAB3 = "minecraft:stone_block_slab3"; - public const STONE_BLOCK_SLAB4 = "minecraft:stone_block_slab4"; + public const STONE_BRICK_DOUBLE_SLAB = "minecraft:stone_brick_double_slab"; public const STONE_BRICK_SLAB = "minecraft:stone_brick_slab"; public const STONE_BRICK_STAIRS = "minecraft:stone_brick_stairs"; + public const STONE_BRICKS = "minecraft:stone_bricks"; public const STONE_BUTTON = "minecraft:stone_button"; public const STONE_PRESSURE_PLATE = "minecraft:stone_pressure_plate"; public const STONE_STAIRS = "minecraft:stone_stairs"; - public const STONEBRICK = "minecraft:stonebrick"; public const STONECUTTER = "minecraft:stonecutter"; public const STONECUTTER_BLOCK = "minecraft:stonecutter_block"; public const STRIPPED_ACACIA_LOG = "minecraft:stripped_acacia_log"; @@ -1006,6 +1095,7 @@ final class BlockTypeNames{ public const TUBE_CORAL = "minecraft:tube_coral"; public const TUBE_CORAL_BLOCK = "minecraft:tube_coral_block"; public const TUBE_CORAL_FAN = "minecraft:tube_coral_fan"; + public const TUBE_CORAL_WALL_FAN = "minecraft:tube_coral_wall_fan"; public const TUFF = "minecraft:tuff"; public const TUFF_BRICK_DOUBLE_SLAB = "minecraft:tuff_brick_double_slab"; public const TUFF_BRICK_SLAB = "minecraft:tuff_brick_slab"; @@ -1124,7 +1214,6 @@ final class BlockTypeNames{ public const YELLOW_CARPET = "minecraft:yellow_carpet"; public const YELLOW_CONCRETE = "minecraft:yellow_concrete"; public const YELLOW_CONCRETE_POWDER = "minecraft:yellow_concrete_powder"; - public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; public const YELLOW_SHULKER_BOX = "minecraft:yellow_shulker_box"; public const YELLOW_STAINED_GLASS = "minecraft:yellow_stained_glass"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index ab98e75f36..df16957298 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -562,6 +562,17 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_BLOCK : Ids::TUBE_CORAL_BLOCK, } )); + + $this->map(Blocks::WALL_CORAL_FAN(), fn(WallCoralFan $block) => Writer::create( + match($block->getCoralType()){ + CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_WALL_FAN : Ids::TUBE_CORAL_WALL_FAN, + CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL_WALL_FAN : Ids::BRAIN_CORAL_WALL_FAN, + CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL_WALL_FAN : Ids::BUBBLE_CORAL_WALL_FAN, + CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL_WALL_FAN : Ids::FIRE_CORAL_WALL_FAN, + CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL_WALL_FAN : Ids::HORN_CORAL_WALL_FAN, + }) + ->writeCoralFacing($block->getFacing()) + ); } private function registerCauldronSerializers() : void{ @@ -783,6 +794,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CHISELED_DEEPSLATE(), Ids::CHISELED_DEEPSLATE); $this->mapSimple(Blocks::CHISELED_NETHER_BRICKS(), Ids::CHISELED_NETHER_BRICKS); $this->mapSimple(Blocks::CHISELED_POLISHED_BLACKSTONE(), Ids::CHISELED_POLISHED_BLACKSTONE); + $this->mapSimple(Blocks::CHISELED_RED_SANDSTONE(), Ids::CHISELED_RED_SANDSTONE); + $this->mapSimple(Blocks::CHISELED_SANDSTONE(), Ids::CHISELED_SANDSTONE); + $this->mapSimple(Blocks::CHISELED_STONE_BRICKS(), Ids::CHISELED_STONE_BRICKS); $this->mapSimple(Blocks::CHORUS_PLANT(), Ids::CHORUS_PLANT); $this->mapSimple(Blocks::CLAY(), Ids::CLAY); $this->mapSimple(Blocks::COAL(), Ids::COAL_BLOCK); @@ -795,10 +809,14 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CRACKED_DEEPSLATE_TILES(), Ids::CRACKED_DEEPSLATE_TILES); $this->mapSimple(Blocks::CRACKED_NETHER_BRICKS(), Ids::CRACKED_NETHER_BRICKS); $this->mapSimple(Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS(), Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS); + $this->mapSimple(Blocks::CRACKED_STONE_BRICKS(), Ids::CRACKED_STONE_BRICKS); $this->mapSimple(Blocks::CRAFTING_TABLE(), Ids::CRAFTING_TABLE); $this->mapSimple(Blocks::CRIMSON_ROOTS(), Ids::CRIMSON_ROOTS); $this->mapSimple(Blocks::CRYING_OBSIDIAN(), Ids::CRYING_OBSIDIAN); - $this->mapSimple(Blocks::DANDELION(), Ids::YELLOW_FLOWER); + $this->mapSimple(Blocks::DANDELION(), Ids::DANDELION); + $this->mapSimple(Blocks::CUT_RED_SANDSTONE(), Ids::CUT_RED_SANDSTONE); + $this->mapSimple(Blocks::CUT_SANDSTONE(), Ids::CUT_SANDSTONE); + $this->mapSimple(Blocks::DARK_PRISMARINE(), Ids::DARK_PRISMARINE); $this->mapSimple(Blocks::DEAD_BUSH(), Ids::DEADBUSH); $this->mapSimple(Blocks::DEEPSLATE_BRICKS(), Ids::DEEPSLATE_BRICKS); $this->mapSimple(Blocks::DEEPSLATE_COAL_ORE(), Ids::DEEPSLATE_COAL_ORE); @@ -957,6 +975,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::HARDENED_GLASS_PANE(), Ids::HARD_GLASS_PANE); $this->mapSimple(Blocks::HONEYCOMB(), Ids::HONEYCOMB_BLOCK); $this->mapSimple(Blocks::ICE(), Ids::ICE); + $this->mapSimple(Blocks::INFESTED_CHISELED_STONE_BRICK(), Ids::INFESTED_CHISELED_STONE_BRICKS); + $this->mapSimple(Blocks::INFESTED_COBBLESTONE(), Ids::INFESTED_COBBLESTONE); + $this->mapSimple(Blocks::INFESTED_CRACKED_STONE_BRICK(), Ids::INFESTED_CRACKED_STONE_BRICKS); + $this->mapSimple(Blocks::INFESTED_MOSSY_STONE_BRICK(), Ids::INFESTED_MOSSY_STONE_BRICKS); + $this->mapSimple(Blocks::INFESTED_STONE(), Ids::INFESTED_STONE); + $this->mapSimple(Blocks::INFESTED_STONE_BRICK(), Ids::INFESTED_STONE_BRICKS); $this->mapSimple(Blocks::INFO_UPDATE(), Ids::INFO_UPDATE); $this->mapSimple(Blocks::INFO_UPDATE2(), Ids::INFO_UPDATE2); $this->mapSimple(Blocks::INVISIBLE_BEDROCK(), Ids::INVISIBLE_BEDROCK); @@ -973,6 +997,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::MELON(), Ids::MELON_BLOCK); $this->mapSimple(Blocks::MONSTER_SPAWNER(), Ids::MOB_SPAWNER); $this->mapSimple(Blocks::MOSSY_COBBLESTONE(), Ids::MOSSY_COBBLESTONE); + $this->mapSimple(Blocks::MOSSY_STONE_BRICKS(), Ids::MOSSY_STONE_BRICKS); $this->mapSimple(Blocks::MUD(), Ids::MUD); $this->mapSimple(Blocks::MUD_BRICKS(), Ids::MUD_BRICKS); $this->mapSimple(Blocks::MYCELIUM(), Ids::MYCELIUM); @@ -995,6 +1020,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::POLISHED_DEEPSLATE(), Ids::POLISHED_DEEPSLATE); $this->mapSimple(Blocks::POLISHED_DIORITE(), Ids::POLISHED_DIORITE); $this->mapSimple(Blocks::POLISHED_GRANITE(), Ids::POLISHED_GRANITE); + $this->mapSimple(Blocks::PRISMARINE(), Ids::PRISMARINE); + $this->mapSimple(Blocks::PRISMARINE_BRICKS(), Ids::PRISMARINE_BRICKS); $this->mapSimple(Blocks::QUARTZ_BRICKS(), Ids::QUARTZ_BRICKS); $this->mapSimple(Blocks::RAW_COPPER(), Ids::RAW_COPPER_BLOCK); $this->mapSimple(Blocks::RAW_GOLD(), Ids::RAW_GOLD_BLOCK); @@ -1002,8 +1029,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::REDSTONE(), Ids::REDSTONE_BLOCK); $this->mapSimple(Blocks::RED_MUSHROOM(), Ids::RED_MUSHROOM); $this->mapSimple(Blocks::RED_NETHER_BRICKS(), Ids::RED_NETHER_BRICK); + $this->mapSimple(Blocks::RED_SAND(), Ids::RED_SAND); + $this->mapSimple(Blocks::RED_SANDSTONE(), Ids::RED_SANDSTONE); $this->mapSimple(Blocks::REINFORCED_DEEPSLATE(), Ids::REINFORCED_DEEPSLATE); $this->mapSimple(Blocks::RESERVED6(), Ids::RESERVED6); + $this->mapSimple(Blocks::SAND(), Ids::SAND); + $this->mapSimple(Blocks::SANDSTONE(), Ids::SANDSTONE); $this->mapSimple(Blocks::SCULK(), Ids::SCULK); $this->mapSimple(Blocks::SEA_LANTERN(), Ids::SEA_LANTERN); $this->mapSimple(Blocks::SHROOMLIGHT(), Ids::SHROOMLIGHT); @@ -1011,13 +1042,16 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::SLIME(), Ids::SLIME); $this->mapSimple(Blocks::SMITHING_TABLE(), Ids::SMITHING_TABLE); $this->mapSimple(Blocks::SMOOTH_BASALT(), Ids::SMOOTH_BASALT); + $this->mapSimple(Blocks::SMOOTH_RED_SANDSTONE(), Ids::SMOOTH_RED_SANDSTONE); + $this->mapSimple(Blocks::SMOOTH_SANDSTONE(), Ids::SMOOTH_SANDSTONE); $this->mapSimple(Blocks::SMOOTH_STONE(), Ids::SMOOTH_STONE); $this->mapSimple(Blocks::SNOW(), Ids::SNOW); $this->mapSimple(Blocks::SOUL_SAND(), Ids::SOUL_SAND); $this->mapSimple(Blocks::SOUL_SOIL(), Ids::SOUL_SOIL); $this->mapSimple(Blocks::SPORE_BLOSSOM(), Ids::SPORE_BLOSSOM); $this->mapSimple(Blocks::STONE(), Ids::STONE); - $this->mapSimple(Blocks::TALL_GRASS(), Ids::SHORT_GRASS); //no, this is not a typo - tall_grass is now the double block, just to be confusing :( + $this->mapSimple(Blocks::STONE_BRICKS(), Ids::STONE_BRICKS); + $this->mapSimple(Blocks::TALL_GRASS(), Ids::SHORT_GRASS); //no, this is not a typo - tall_grass is now the double block, just to be confusing :( $this->mapSimple(Blocks::TINTED_GLASS(), Ids::TINTED_GLASS); $this->mapSimple(Blocks::TORCHFLOWER(), Ids::TORCHFLOWER); $this->mapSimple(Blocks::TUFF(), Ids::TUFF); @@ -1056,19 +1090,18 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }) ->writeBlockFace($block->getFacing()) ); - $this->map(Blocks::ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_ANDESITE)); + $this->mapSlab(Blocks::ANDESITE_SLAB(), Ids::ANDESITE_SLAB, Ids::ANDESITE_DOUBLE_SLAB); $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); - $this->map(Blocks::ANVIL(), function(Anvil $block) : Writer{ - return Writer::create(Ids::ANVIL) - ->writeCardinalHorizontalFacing($block->getFacing()) - ->writeString(StateNames::DAMAGE, match($damage = $block->getDamage()){ - 0 => StringValues::DAMAGE_UNDAMAGED, - 1 => StringValues::DAMAGE_SLIGHTLY_DAMAGED, - 2 => StringValues::DAMAGE_VERY_DAMAGED, - default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), - }); - }); + $this->map(Blocks::ANVIL(), fn(Anvil $block) : Writer => Writer::create( + match($damage = $block->getDamage()){ + 0 => Ids::ANVIL, + 1 => Ids::CHIPPED_ANVIL, + 2 => Ids::DAMAGED_ANVIL, + default => throw new BlockStateSerializeException("Invalid Anvil damage {$damage}"), + }) + ->writeCardinalHorizontalFacing($block->getFacing()) + ); $this->map(Blocks::BAMBOO(), function(Bamboo $block) : Writer{ return Writer::create(Ids::BAMBOO) ->writeBool(StateNames::AGE_BIT, $block->isReady()) @@ -1148,7 +1181,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::BREWING_STAND_SLOT_B_BIT, $block->hasSlot(BrewingStandSlot::SOUTHWEST)) ->writeBool(StateNames::BREWING_STAND_SLOT_C_BIT, $block->hasSlot(BrewingStandSlot::NORTHWEST)); }); - $this->map(Blocks::BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::BRICK_SLAB, StringValues::STONE_SLAB_TYPE_BRICK)); + $this->mapSlab(Blocks::BRICK_SLAB(), Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); @@ -1193,10 +1226,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing($block->getFacing()) ->writeInt(StateNames::BOOKS_STORED, $flags); }); - $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_CHISELED, $block->getAxis())); - $this->map(Blocks::CHISELED_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(Blocks::CHISELED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_HEIROGLYPHS)); - $this->map(Blocks::CHISELED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CHISELED)); + $this->map(Blocks::CHISELED_QUARTZ(), fn(SimplePillar $block) => Helper::encodeQuartz($block->getAxis(), Writer::create(Ids::CHISELED_QUARTZ_BLOCK))); $this->map(Blocks::CHORUS_FLOWER(), function(ChorusFlower $block) : Writer{ return Writer::create(Ids::CHORUS_FLOWER) ->writeInt(StateNames::AGE, $block->getAge()); @@ -1204,7 +1234,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::COBBLED_DEEPSLATE_SLAB(), Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::COBBLED_DEEPSLATE_STAIRS(), Ids::COBBLED_DEEPSLATE_STAIRS); $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); - $this->map(Blocks::COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::COBBLESTONE_SLAB, StringValues::STONE_SLAB_TYPE_COBBLESTONE)); + $this->mapSlab(Blocks::COBBLESTONE_SLAB(), Ids::COBBLESTONE_SLAB, Ids::COBBLESTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ @@ -1287,14 +1317,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); - $this->map(Blocks::CRACKED_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_CRACKED)); - $this->map(Blocks::CUT_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(Blocks::CUT_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE)); - $this->map(Blocks::CUT_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_CUT)); - $this->map(Blocks::CUT_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE)); - $this->map(Blocks::DARK_PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DARK)); - $this->map(Blocks::DARK_PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK)); + $this->mapSlab(Blocks::CUT_RED_SANDSTONE_SLAB(), Ids::CUT_RED_SANDSTONE_SLAB, Ids::CUT_RED_SANDSTONE_DOUBLE_SLAB); + $this->mapSlab(Blocks::CUT_SANDSTONE_SLAB(), Ids::CUT_SANDSTONE_SLAB, Ids::CUT_SANDSTONE_DOUBLE_SLAB); + $this->mapSlab(Blocks::DARK_PRISMARINE_SLAB(), Ids::DARK_PRISMARINE_SLAB, Ids::DARK_PRISMARINE_DOUBLE_SLAB); $this->mapStairs(Blocks::DARK_PRISMARINE_STAIRS(), Ids::DARK_PRISMARINE_STAIRS); $this->map(Blocks::DAYLIGHT_SENSOR(), function(DaylightSensor $block) : Writer{ return Writer::create($block->isInverted() ? Ids::DAYLIGHT_DETECTOR_INVERTED : Ids::DAYLIGHT_DETECTOR) @@ -1316,20 +1341,15 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::RAIL_DATA_BIT, $block->isActivated()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_DIORITE)); + $this->mapSlab(Blocks::DIORITE_SLAB(), Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB); $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ - $dirtType = $block->getDirtType(); - if($dirtType === DirtType::ROOTED){ - return new Writer(Ids::DIRT_WITH_ROOTS); - } - return Writer::create(Ids::DIRT) - ->writeString(StateNames::DIRT_TYPE, match($dirtType){ - DirtType::COARSE => StringValues::DIRT_TYPE_COARSE, - DirtType::NORMAL => StringValues::DIRT_TYPE_NORMAL, - //ROOTED was already checked above - }); + return Writer::create(match($block->getDirtType()){ + DirtType::NORMAL => Ids::DIRT, + DirtType::COARSE => Ids::COARSE_DIRT, + DirtType::ROOTED => Ids::DIRT_WITH_ROOTS, + }); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::TALL_GRASS))); $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); @@ -1346,10 +1366,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::END_ROD) ->writeEndRodFacingDirection($block->getFacing()); }); - $this->map(Blocks::END_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK)); + $this->mapSlab(Blocks::END_STONE_BRICK_SLAB(), Ids::END_STONE_BRICK_SLAB, Ids::END_STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); - $this->map(Blocks::FAKE_WOODEN_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::PETRIFIED_OAK_SLAB, StringValues::STONE_SLAB_TYPE_WOOD)); + $this->mapSlab(Blocks::FAKE_WOODEN_SLAB(), Ids::PETRIFIED_OAK_SLAB, Ids::PETRIFIED_OAK_DOUBLE_SLAB); $this->map(Blocks::FARMLAND(), function(Farmland $block) : Writer{ return Writer::create(Ids::FARMLAND) ->writeInt(StateNames::MOISTURIZED_AMOUNT, $block->getWetness()); @@ -1380,7 +1400,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeFacingFlags($block->getFaces()); }); $this->map(Blocks::GLOWING_ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::GLOW_FRAME)); - $this->map(Blocks::GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_GRANITE)); + $this->mapSlab(Blocks::GRANITE_SLAB(), Ids::GRANITE_SLAB, Ids::GRANITE_DOUBLE_SLAB); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); @@ -1394,18 +1414,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::TOGGLE_BIT, $block->isPowered()) ->writeFacingWithoutUp($block->getFacing()); }); - $this->map(Blocks::INFESTED_CHISELED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK)); - $this->map(Blocks::INFESTED_COBBLESTONE(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE)); - $this->map(Blocks::INFESTED_CRACKED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK)); - $this->map(Blocks::INFESTED_MOSSY_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK)); - $this->map(Blocks::INFESTED_STONE(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE)); - $this->map(Blocks::INFESTED_STONE_BRICK(), fn() => Writer::create(Ids::MONSTER_EGG) - ->writeString(StateNames::MONSTER_EGG_STONE_TYPE, StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK)); $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::FRAME)); @@ -1440,8 +1448,25 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); }); $this->map(Blocks::LIGHT(), function(Light $block) : Writer{ - return Writer::create(Ids::LIGHT_BLOCK) - ->writeInt(StateNames::BLOCK_LIGHT_LEVEL, $block->getLightLevel()); + return Writer::create(match($block->getLightLevel()){ + 0 => Ids::LIGHT_BLOCK_0, + 1 => Ids::LIGHT_BLOCK_1, + 2 => Ids::LIGHT_BLOCK_2, + 3 => Ids::LIGHT_BLOCK_3, + 4 => Ids::LIGHT_BLOCK_4, + 5 => Ids::LIGHT_BLOCK_5, + 6 => Ids::LIGHT_BLOCK_6, + 7 => Ids::LIGHT_BLOCK_7, + 8 => Ids::LIGHT_BLOCK_8, + 9 => Ids::LIGHT_BLOCK_9, + 10 => Ids::LIGHT_BLOCK_10, + 11 => Ids::LIGHT_BLOCK_11, + 12 => Ids::LIGHT_BLOCK_12, + 13 => Ids::LIGHT_BLOCK_13, + 14 => Ids::LIGHT_BLOCK_14, + 15 => Ids::LIGHT_BLOCK_15, + default => throw new BlockStateSerializeException("Invalid light level " . $block->getLightLevel()), + }); }); $this->map(Blocks::LIGHTNING_ROD(), function(LightningRod $block) : Writer{ return Writer::create(Ids::LIGHTNING_ROD) @@ -1462,11 +1487,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SKULL) ->writeFacingWithoutDown($block->getFacing()); }); - $this->map(Blocks::MOSSY_COBBLESTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE)); + $this->mapSlab(Blocks::MOSSY_COBBLESTONE_SLAB(), Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); - $this->map(Blocks::MOSSY_STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_MOSSY)); - $this->map(Blocks::MOSSY_STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK)); + $this->mapSlab(Blocks::MOSSY_STONE_BRICK_SLAB(), Ids::MOSSY_STONE_BRICK_SLAB, Ids::MOSSY_STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), Ids::MOSSY_STONE_BRICK_STAIRS); $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); $this->mapSlab(Blocks::MUD_BRICK_SLAB(), Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB); @@ -1476,7 +1500,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writePillarAxis($block->getAxis())); $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); - $this->map(Blocks::NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::NETHER_BRICK_SLAB, StringValues::STONE_SLAB_TYPE_NETHER_BRICK)); + $this->mapSlab(Blocks::NETHER_BRICK_SLAB(), Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ @@ -1511,7 +1535,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::GROWTH, $block->getAge() + 1 + PitcherCrop::MAX_AGE) ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); }); - $this->map(Blocks::POLISHED_ANDESITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE)); + $this->mapSlab(Blocks::POLISHED_ANDESITE_SLAB(), Ids::POLISHED_ANDESITE_SLAB, Ids::POLISHED_ANDESITE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_ANDESITE_STAIRS(), Ids::POLISHED_ANDESITE_STAIRS); $this->map(Blocks::POLISHED_BASALT(), function(SimplePillar $block) : Writer{ return Writer::create(Ids::POLISHED_BASALT) @@ -1528,9 +1552,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSlab(Blocks::POLISHED_DEEPSLATE_SLAB(), Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_DEEPSLATE_STAIRS(), Ids::POLISHED_DEEPSLATE_STAIRS); $this->map(Blocks::POLISHED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::POLISHED_DEEPSLATE_WALL))); - $this->map(Blocks::POLISHED_DIORITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE)); + $this->mapSlab(Blocks::POLISHED_DIORITE_SLAB(), Ids::POLISHED_DIORITE_SLAB, Ids::POLISHED_DIORITE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_DIORITE_STAIRS(), Ids::POLISHED_DIORITE_STAIRS); - $this->map(Blocks::POLISHED_GRANITE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE)); + $this->mapSlab(Blocks::POLISHED_GRANITE_SLAB(), Ids::POLISHED_GRANITE_SLAB, Ids::POLISHED_GRANITE_DOUBLE_SLAB); $this->mapStairs(Blocks::POLISHED_GRANITE_STAIRS(), Ids::POLISHED_GRANITE_STAIRS); $this->map(Blocks::POTATOES(), fn(Potato $block) => Helper::encodeCrops($block, new Writer(Ids::POTATOES))); $this->map(Blocks::POWERED_RAIL(), function(PoweredRail $block) : Writer{ @@ -1538,13 +1562,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::PRISMARINE(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT)); - $this->map(Blocks::PRISMARINE_BRICKS(), fn() => Writer::create(Ids::PRISMARINE) - ->writeString(StateNames::PRISMARINE_BLOCK_TYPE, StringValues::PRISMARINE_BLOCK_TYPE_BRICKS)); - $this->map(Blocks::PRISMARINE_BRICKS_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK)); + $this->mapSlab(Blocks::PRISMARINE_BRICKS_SLAB(), Ids::PRISMARINE_BRICK_SLAB, Ids::PRISMARINE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), Ids::PRISMARINE_BRICKS_STAIRS); - $this->map(Blocks::PRISMARINE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH)); + $this->mapSlab(Blocks::PRISMARINE_SLAB(), Ids::PRISMARINE_SLAB, Ids::PRISMARINE_DOUBLE_SLAB); $this->mapStairs(Blocks::PRISMARINE_STAIRS(), Ids::PRISMARINE_STAIRS); $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); $this->map(Blocks::PUMPKIN(), function() : Writer{ @@ -1563,11 +1583,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeString(StateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_LINES) ->writePillarAxis($block->getAxis()); }); - $this->map(Blocks::PURPUR_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_PURPUR)); + $this->mapSlab(Blocks::PURPUR_SLAB(), Ids::PURPUR_SLAB, Ids::PURPUR_DOUBLE_SLAB); $this->mapStairs(Blocks::PURPUR_STAIRS(), Ids::PURPUR_STAIRS); - $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_DEFAULT, Axis::Y)); - $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz(StringValues::CHISEL_TYPE_LINES, $block->getAxis())); - $this->map(Blocks::QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::QUARTZ_SLAB, StringValues::STONE_SLAB_TYPE_QUARTZ)); + $this->map(Blocks::QUARTZ(), fn() => Helper::encodeQuartz(Axis::Y, Writer::create(Ids::QUARTZ_BLOCK))); + $this->map(Blocks::QUARTZ_PILLAR(), fn(SimplePillar $block) => Helper::encodeQuartz($block->getAxis(), Writer::create(Ids::QUARTZ_PILLAR))); + $this->mapSlab(Blocks::QUARTZ_SLAB(), Ids::QUARTZ_SLAB, Ids::QUARTZ_DOUBLE_SLAB); $this->mapStairs(Blocks::QUARTZ_STAIRS(), Ids::QUARTZ_STAIRS); $this->map(Blocks::RAIL(), function(Rail $block) : Writer{ return Writer::create(Ids::RAIL) @@ -1595,21 +1615,15 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::REDSTONE_SIGNAL, $block->getOutputSignalStrength()); }); $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); - $this->map(Blocks::RED_NETHER_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK)); + $this->mapSlab(Blocks::RED_NETHER_BRICK_SLAB(), Ids::RED_NETHER_BRICK_SLAB, Ids::RED_NETHER_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::RED_NETHER_BRICK_STAIRS(), Ids::RED_NETHER_BRICK_STAIRS); $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); - $this->map(Blocks::RED_SAND(), fn() => Writer::create(Ids::SAND) - ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_RED)); - $this->map(Blocks::RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); - $this->map(Blocks::RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE)); + $this->mapSlab(Blocks::RED_SANDSTONE_SLAB(), Ids::RED_SANDSTONE_SLAB, Ids::RED_SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::RED_SANDSTONE_STAIRS(), Ids::RED_SANDSTONE_STAIRS); $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::ROSE_BUSH))); - $this->map(Blocks::SAND(), fn() => Writer::create(Ids::SAND) - ->writeString(StateNames::SAND_TYPE, StringValues::SAND_TYPE_NORMAL)); - $this->map(Blocks::SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_DEFAULT)); - $this->map(Blocks::SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::SANDSTONE_SLAB, StringValues::STONE_SLAB_TYPE_SANDSTONE)); + $this->mapSlab(Blocks::SANDSTONE_SLAB(), Ids::SANDSTONE_SLAB, Ids::SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ @@ -1623,16 +1637,14 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::UPPER_BLOCK_BIT, $block->isTop()); }); $this->map(Blocks::SMOKER(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::SMOKER, Ids::LIT_SMOKER)); - $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(StringValues::CHISEL_TYPE_SMOOTH, Axis::Y)); - $this->map(Blocks::SMOOTH_QUARTZ_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ)); + $this->map(Blocks::SMOOTH_QUARTZ(), fn() => Helper::encodeQuartz(Axis::Y, Writer::create(Ids::SMOOTH_QUARTZ))); + $this->mapSlab(Blocks::SMOOTH_QUARTZ_SLAB(), Ids::SMOOTH_QUARTZ_SLAB, Ids::SMOOTH_QUARTZ_DOUBLE_SLAB); $this->mapStairs(Blocks::SMOOTH_QUARTZ_STAIRS(), Ids::SMOOTH_QUARTZ_STAIRS); - $this->map(Blocks::SMOOTH_RED_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::RED_SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); - $this->map(Blocks::SMOOTH_RED_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab3($block, StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE)); + $this->mapSlab(Blocks::SMOOTH_RED_SANDSTONE_SLAB(), Ids::SMOOTH_RED_SANDSTONE_SLAB, Ids::SMOOTH_RED_SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::SMOOTH_RED_SANDSTONE_STAIRS(), Ids::SMOOTH_RED_SANDSTONE_STAIRS); - $this->map(Blocks::SMOOTH_SANDSTONE(), fn() => Helper::encodeSandstone(Ids::SANDSTONE, StringValues::SAND_STONE_TYPE_SMOOTH)); - $this->map(Blocks::SMOOTH_SANDSTONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab2($block, StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE)); + $this->mapSlab(Blocks::SMOOTH_SANDSTONE_SLAB(), Ids::SMOOTH_SANDSTONE_SLAB, Ids::SMOOTH_SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::SMOOTH_SANDSTONE_STAIRS(), Ids::SMOOTH_SANDSTONE_STAIRS); - $this->map(Blocks::SMOOTH_STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::SMOOTH_STONE_SLAB, StringValues::STONE_SLAB_TYPE_SMOOTH_STONE)); + $this->mapSlab(Blocks::SMOOTH_STONE_SLAB(), Ids::SMOOTH_STONE_SLAB, Ids::SMOOTH_STONE_DOUBLE_SLAB); $this->map(Blocks::SNOW_LAYER(), function(SnowLayer $block) : Writer{ return Writer::create(Ids::SNOW_LAYER) ->writeBool(StateNames::COVERED_BIT, false) @@ -1656,13 +1668,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); - $this->map(Blocks::STONE_BRICKS(), fn() => Helper::encodeStoneBricks(StringValues::STONE_BRICK_TYPE_DEFAULT)); - $this->map(Blocks::STONE_BRICK_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab1($block, Ids::STONE_BRICK_SLAB, StringValues::STONE_SLAB_TYPE_STONE_BRICK)); + $this->mapSlab(Blocks::STONE_BRICK_SLAB(), Ids::STONE_BRICK_SLAB, Ids::STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::STONE_BRICK_STAIRS(), Ids::STONE_BRICK_STAIRS); $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); $this->map(Blocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); $this->map(Blocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); - $this->map(Blocks::STONE_SLAB(), fn(Slab $block) => Helper::encodeStoneSlab4($block, StringValues::STONE_SLAB_TYPE_4_STONE)); + $this->mapSlab(Blocks::STONE_SLAB(), Ids::NORMAL_STONE_SLAB, Ids::NORMAL_STONE_DOUBLE_SLAB); $this->mapStairs(Blocks::STONE_STAIRS(), Ids::NORMAL_STONE_STAIRS); $this->map(Blocks::SUGARCANE(), function(Sugarcane $block) : Writer{ return Writer::create(Ids::REEDS) @@ -1719,17 +1730,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::WALL_BANNER) ->writeHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::WALL_CORAL_FAN(), function(WallCoralFan $block) : Writer{ - $coralType = $block->getCoralType(); - return Writer::create(match($coralType){ - CoralType::TUBE, CoralType::BRAIN => Ids::CORAL_FAN_HANG, - CoralType::BUBBLE, CoralType::FIRE => Ids::CORAL_FAN_HANG2, - CoralType::HORN => Ids::CORAL_FAN_HANG3, - }) - ->writeBool(StateNames::CORAL_HANG_TYPE_BIT, $coralType === CoralType::BRAIN || $coralType === CoralType::FIRE) - ->writeBool(StateNames::DEAD_BIT, $block->isDead()) - ->writeCoralFacing($block->getFacing()); - }); $this->map(Blocks::WATER(), fn(Water $block) => Helper::encodeLiquid($block, Ids::WATER, Ids::FLOWING_WATER)); $this->map(Blocks::WEEPING_VINES(), function(NetherVines $block) : Writer{ return Writer::create(Ids::WEEPING_VINES) diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 6dda9fb81a..0c8df24f2c 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -326,65 +326,4 @@ final class BlockStateDeserializerHelper{ default => throw $in->badValueException(BlockStateNames::WALL_BLOCK_TYPE, $type), }, $in); } - - /** @throws BlockStateDeserializeException */ - public static function mapStoneSlab1Type(BlockStateReader $in) : Slab{ - //* stone_slab_type (StringTag) = brick, cobblestone, nether_brick, quartz, sandstone, smooth_stone, stone_brick, wood - return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE)){ - StringValues::STONE_SLAB_TYPE_BRICK => VanillaBlocks::BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_QUARTZ => VanillaBlocks::QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_SMOOTH_STONE => VanillaBlocks::SMOOTH_STONE_SLAB(), - StringValues::STONE_SLAB_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_WOOD => VanillaBlocks::FAKE_WOODEN_SLAB(), - default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - public static function mapStoneSlab2Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_2 (StringTag) = mossy_cobblestone, prismarine_brick, prismarine_dark, prismarine_rough, purpur, red_nether_brick, red_sandstone, smooth_sandstone - return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_2)){ - StringValues::STONE_SLAB_TYPE_2_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_BRICK => VanillaBlocks::PRISMARINE_BRICKS_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_DARK => VanillaBlocks::DARK_PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PRISMARINE_ROUGH => VanillaBlocks::PRISMARINE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_PURPUR => VanillaBlocks::PURPUR_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_2_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_2_SMOOTH_SANDSTONE => VanillaBlocks::SMOOTH_SANDSTONE_SLAB(), - default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_2, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - public static function mapStoneSlab3Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_3 (StringTag) = andesite, diorite, end_stone_brick, granite, polished_andesite, polished_diorite, polished_granite, smooth_red_sandstone - return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_3)){ - StringValues::STONE_SLAB_TYPE_3_ANDESITE => VanillaBlocks::ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_DIORITE => VanillaBlocks::DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_END_STONE_BRICK => VanillaBlocks::END_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_3_GRANITE => VanillaBlocks::GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_ANDESITE => VanillaBlocks::POLISHED_ANDESITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_DIORITE => VanillaBlocks::POLISHED_DIORITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_POLISHED_GRANITE => VanillaBlocks::POLISHED_GRANITE_SLAB(), - StringValues::STONE_SLAB_TYPE_3_SMOOTH_RED_SANDSTONE => VanillaBlocks::SMOOTH_RED_SANDSTONE_SLAB(), - default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_3, $type), - }; - } - - /** @throws BlockStateDeserializeException */ - public static function mapStoneSlab4Type(BlockStateReader $in) : Slab{ - // * stone_slab_type_4 (StringTag) = cut_red_sandstone, cut_sandstone, mossy_stone_brick, smooth_quartz, stone - return match($type = $in->readString(BlockStateNames::STONE_SLAB_TYPE_4)){ - StringValues::STONE_SLAB_TYPE_4_CUT_RED_SANDSTONE => VanillaBlocks::CUT_RED_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_CUT_SANDSTONE => VanillaBlocks::CUT_SANDSTONE_SLAB(), - StringValues::STONE_SLAB_TYPE_4_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_SLAB(), - StringValues::STONE_SLAB_TYPE_4_SMOOTH_QUARTZ => VanillaBlocks::SMOOTH_QUARTZ_SLAB(), - StringValues::STONE_SLAB_TYPE_4_STONE => VanillaBlocks::STONE_SLAB(), - default => throw $in->badValueException(BlockStateNames::STONE_SLAB_TYPE_4, $type), - }; - } } diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index a1f417d894..9dfb17ca0c 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -160,16 +160,11 @@ final class BlockStateSerializerHelper{ ->writeInt(BlockStateNames::HUGE_MUSHROOM_BITS, MushroomBlockTypeIdMap::getInstance()->toId($block->getMushroomBlockType())); } - public static function encodeQuartz(string $type, int $axis) : Writer{ - return Writer::create(Ids::QUARTZ_BLOCK) - ->writeString(BlockStateNames::CHISEL_TYPE, $type) + public static function encodeQuartz(int $axis, Writer $out) : Writer{ + return $out ->writePillarAxis($axis); //this isn't needed for all types, but we have to write it anyway } - public static function encodeSandstone(string $id, string $type) : Writer{ - return Writer::create($id)->writeString(BlockStateNames::SAND_STONE_TYPE, $type); - } - public static function encodeSapling(Sapling $block, Writer $out) : Writer{ return $out ->writeBool(BlockStateNames::AGE_BIT, $block->isReady()); @@ -214,36 +209,6 @@ final class BlockStateSerializerHelper{ ->writeFacingWithoutUp($facing === Facing::UP ? Facing::DOWN : $facing); } - public static function encodeStoneBricks(string $type) : Writer{ - return Writer::create(Ids::STONEBRICK) - ->writeString(BlockStateNames::STONE_BRICK_TYPE, $type); - } - - private static function encodeStoneSlab(Slab $block, string $singleId, string $doubleId, string $typeKey, string $typeValue) : Writer{ - return self::encodeSlab($block, $singleId, $doubleId) - ->writeString($typeKey, $typeValue); - } - - public static function encodeStoneSlab1(Slab $block, string $singleId, string $doubleTypeValue) : Writer{ - //1.21 made this a mess by flattening single slab IDs but not double ones - return $block->getSlabType() === SlabType::DOUBLE ? - self::encodeDoubleSlab($block, Ids::DOUBLE_STONE_BLOCK_SLAB) - ->writeString(BlockStateNames::STONE_SLAB_TYPE, $doubleTypeValue) : - self::encodeSingleSlab($block, $singleId); - } - - public static function encodeStoneSlab2(Slab $block, string $typeValue) : Writer{ - return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, BlockStateNames::STONE_SLAB_TYPE_2, $typeValue); - } - - public static function encodeStoneSlab3(Slab $block, string $typeValue) : Writer{ - return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, BlockStateNames::STONE_SLAB_TYPE_3, $typeValue); - } - - public static function encodeStoneSlab4(Slab $block, string $typeValue) : Writer{ - return self::encodeStoneSlab($block, Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, BlockStateNames::STONE_SLAB_TYPE_4, $typeValue); - } - public static function encodeTrapdoor(Trapdoor $block, Writer $out) : Writer{ return $out ->write5MinusHorizontalFacing($block->getFacing()) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 4c9ec4b798..b85951d318 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -24,12 +24,13 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\convert; use pocketmine\block\AmethystCluster; +use pocketmine\block\Anvil; use pocketmine\block\Bamboo; use pocketmine\block\Block; use pocketmine\block\CaveVines; use pocketmine\block\ChorusFlower; use pocketmine\block\DoublePitcherCrop; -use pocketmine\block\Light; +use pocketmine\block\Opaque; use pocketmine\block\PinkPetals; use pocketmine\block\PitcherCrop; use pocketmine\block\Slab; @@ -83,6 +84,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->registerFlatWoodBlockDeserializers(); $this->registerLeavesDeserializers(); $this->registerSaplingDeserializers(); + $this->registerLightDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -457,6 +459,17 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map($aliveId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(false)); $this->map($deadId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(true)); } + + foreach([ + [CoralType::BRAIN, Ids::BRAIN_CORAL_WALL_FAN, Ids::DEAD_BRAIN_CORAL_WALL_FAN], + [CoralType::BUBBLE, Ids::BUBBLE_CORAL_WALL_FAN, Ids::DEAD_BUBBLE_CORAL_WALL_FAN], + [CoralType::FIRE, Ids::FIRE_CORAL_WALL_FAN, Ids::DEAD_FIRE_CORAL_WALL_FAN], + [CoralType::HORN, Ids::HORN_CORAL_WALL_FAN, Ids::DEAD_HORN_CORAL_WALL_FAN], + [CoralType::TUBE, Ids::TUBE_CORAL_WALL_FAN, Ids::DEAD_TUBE_CORAL_WALL_FAN], + ] as [$coralType, $aliveId, $deadId]){ + $this->map($aliveId, fn(Reader $in) => Blocks::WALL_CORAL_FAN()->setFacing($in->readCoralFacing())->setCoralType($coralType)->setDead(false)); + $this->map($deadId, fn(Reader $in) => Blocks::WALL_CORAL_FAN()->setFacing($in->readCoralFacing())->setCoralType($coralType)->setDead(true)); + } } private function registerCauldronDeserializers() : void{ @@ -654,6 +667,29 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } } + private function registerLightDeserializers() : void{ + foreach([ + Ids::LIGHT_BLOCK_0 => 0, + Ids::LIGHT_BLOCK_1 => 1, + Ids::LIGHT_BLOCK_2 => 2, + Ids::LIGHT_BLOCK_3 => 3, + Ids::LIGHT_BLOCK_4 => 4, + Ids::LIGHT_BLOCK_5 => 5, + Ids::LIGHT_BLOCK_6 => 6, + Ids::LIGHT_BLOCK_7 => 7, + Ids::LIGHT_BLOCK_8 => 8, + Ids::LIGHT_BLOCK_9 => 9, + Ids::LIGHT_BLOCK_10 => 10, + Ids::LIGHT_BLOCK_11 => 11, + Ids::LIGHT_BLOCK_12 => 12, + Ids::LIGHT_BLOCK_13 => 13, + Ids::LIGHT_BLOCK_14 => 14, + Ids::LIGHT_BLOCK_15 => 15, + ] as $id => $level){ + $this->mapSimple($id, fn() => Blocks::LIGHT()->setLightLevel($level)); + } + } + private function registerSimpleDeserializers() : void{ $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); @@ -673,6 +709,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE()); $this->mapSimple(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS()); $this->mapSimple(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE()); + $this->mapSimple(Ids::CHISELED_RED_SANDSTONE, fn() => Blocks::CHISELED_RED_SANDSTONE()); + $this->mapSimple(Ids::CHISELED_SANDSTONE, fn() => Blocks::CHISELED_SANDSTONE()); + $this->mapSimple(Ids::CHISELED_STONE_BRICKS, fn() => Blocks::CHISELED_STONE_BRICKS()); $this->mapSimple(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT()); $this->mapSimple(Ids::CLAY, fn() => Blocks::CLAY()); $this->mapSimple(Ids::COAL_BLOCK, fn() => Blocks::COAL()); @@ -684,9 +723,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES()); $this->mapSimple(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS()); $this->mapSimple(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS()); + $this->mapSimple(Ids::CRACKED_STONE_BRICKS, fn() => Blocks::CRACKED_STONE_BRICKS()); $this->mapSimple(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE()); $this->mapSimple(Ids::CRIMSON_ROOTS, fn() => Blocks::CRIMSON_ROOTS()); $this->mapSimple(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN()); + $this->mapSimple(Ids::CUT_RED_SANDSTONE, fn() => Blocks::CUT_RED_SANDSTONE()); + $this->mapSimple(Ids::CUT_SANDSTONE, fn() => Blocks::CUT_SANDSTONE()); + $this->mapSimple(Ids::DARK_PRISMARINE, fn() => Blocks::DARK_PRISMARINE()); $this->mapSimple(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH()); $this->mapSimple(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS()); $this->mapSimple(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE()); @@ -845,6 +888,12 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY()); $this->mapSimple(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB()); $this->mapSimple(Ids::ICE, fn() => Blocks::ICE()); + $this->mapSimple(Ids::INFESTED_CHISELED_STONE_BRICKS, fn() => Blocks::INFESTED_CHISELED_STONE_BRICK()); + $this->mapSimple(Ids::INFESTED_COBBLESTONE, fn() => Blocks::INFESTED_COBBLESTONE()); + $this->mapSimple(Ids::INFESTED_CRACKED_STONE_BRICKS, fn() => Blocks::INFESTED_CRACKED_STONE_BRICK()); + $this->mapSimple(Ids::INFESTED_MOSSY_STONE_BRICKS, fn() => Blocks::INFESTED_MOSSY_STONE_BRICK()); + $this->mapSimple(Ids::INFESTED_STONE, fn() => Blocks::INFESTED_STONE()); + $this->mapSimple(Ids::INFESTED_STONE_BRICKS, fn() => Blocks::INFESTED_STONE_BRICK()); $this->mapSimple(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE()); $this->mapSimple(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2()); $this->mapSimple(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK()); @@ -859,6 +908,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::MELON_BLOCK, fn() => Blocks::MELON()); $this->mapSimple(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER()); $this->mapSimple(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE()); + $this->mapSimple(Ids::MOSSY_STONE_BRICKS, fn() => Blocks::MOSSY_STONE_BRICKS()); $this->mapSimple(Ids::MUD, fn() => Blocks::MUD()); $this->mapSimple(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS()); $this->mapSimple(Ids::MYCELIUM, fn() => Blocks::MYCELIUM()); @@ -880,6 +930,8 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE()); $this->mapSimple(Ids::POLISHED_DIORITE, fn() => Blocks::POLISHED_DIORITE()); $this->mapSimple(Ids::POLISHED_GRANITE, fn() => Blocks::POLISHED_GRANITE()); + $this->mapSimple(Ids::PRISMARINE, fn() => Blocks::PRISMARINE()); + $this->mapSimple(Ids::PRISMARINE_BRICKS, fn() => Blocks::PRISMARINE_BRICKS()); $this->mapSimple(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS()); $this->mapSimple(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE()); $this->mapSimple(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER()); @@ -887,9 +939,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON()); $this->mapSimple(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM()); $this->mapSimple(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS()); + $this->mapSimple(Ids::RED_SAND, fn() => Blocks::RED_SAND()); + $this->mapSimple(Ids::RED_SANDSTONE, fn() => Blocks::RED_SANDSTONE()); $this->mapSimple(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE()); $this->mapSimple(Ids::REINFORCED_DEEPSLATE, fn() => Blocks::REINFORCED_DEEPSLATE()); $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6()); + $this->mapSimple(Ids::SAND, fn() => Blocks::SAND()); + $this->mapSimple(Ids::SANDSTONE, fn() => Blocks::SANDSTONE()); $this->mapSimple(Ids::SCULK, fn() => Blocks::SCULK()); $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN()); $this->mapSimple(Ids::SHORT_GRASS, fn() => Blocks::TALL_GRASS()); //no, this is not a typo - tall_grass is now the double block, just to be confusing :( @@ -897,6 +953,8 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::SLIME, fn() => Blocks::SLIME()); $this->mapSimple(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE()); $this->mapSimple(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT()); + $this->mapSimple(Ids::SMOOTH_RED_SANDSTONE, fn() => Blocks::SMOOTH_RED_SANDSTONE()); + $this->mapSimple(Ids::SMOOTH_SANDSTONE, fn() => Blocks::SMOOTH_SANDSTONE()); $this->mapSimple(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE()); $this->mapSimple(Ids::SNOW, fn() => Blocks::SNOW()); $this->mapSimple(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); @@ -904,6 +962,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); $this->mapSimple(Ids::STONE, fn() => Blocks::STONE()); $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); + $this->mapSimple(Ids::STONE_BRICKS, fn() => Blocks::STONE_BRICKS()); $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS()); $this->mapSimple(Ids::TORCHFLOWER, fn() => Blocks::TORCHFLOWER()); $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF()); @@ -913,7 +972,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB()); $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); - $this->mapSimple(Ids::YELLOW_FLOWER, fn() => Blocks::DANDELION()); + $this->mapSimple(Ids::DANDELION, fn() => Blocks::DANDELION()); $this->mapSimple(Ids::ALLIUM, fn() => Blocks::ALLIUM()); $this->mapSimple(Ids::CORNFLOWER, fn() => Blocks::CORNFLOWER()); @@ -939,16 +998,21 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setStage(AmethystCluster::STAGE_CLUSTER) ->setFacing($in->readBlockFace()); }); + $this->mapSlab(Ids::ANDESITE_SLAB, Ids::ANDESITE_DOUBLE_SLAB, fn() => Blocks::ANDESITE_SLAB()); $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); $this->map(Ids::ANVIL, function(Reader $in) : Block{ return Blocks::ANVIL() - ->setDamage(match($value = $in->readString(StateNames::DAMAGE)){ - StringValues::DAMAGE_UNDAMAGED => 0, - StringValues::DAMAGE_SLIGHTLY_DAMAGED => 1, - StringValues::DAMAGE_VERY_DAMAGED => 2, - StringValues::DAMAGE_BROKEN => 0, - default => throw $in->badValueException(StateNames::DAMAGE, $value), - }) + ->setDamage(Anvil::UNDAMAGED) + ->setFacing($in->readCardinalHorizontalFacing()); + }); + $this->map(Ids::CHIPPED_ANVIL, function(Reader $in) : Block{ + return Blocks::ANVIL() + ->setDamage(Anvil::SLIGHTLY_DAMAGED) + ->setFacing($in->readCardinalHorizontalFacing()); + }); + $this->map(Ids::DAMAGED_ANVIL, function(Reader $in) : Block{ + return Blocks::ANVIL() + ->setDamage(Anvil::VERY_DAMAGED) ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::BAMBOO, function(Reader $in) : Block{ @@ -1029,6 +1093,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setSlot(BrewingStandSlot::SOUTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT)) ->setSlot(BrewingStandSlot::NORTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT)); }); + $this->mapSlab(Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB, fn() => Blocks::BRICK_SLAB()); $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); $this->map(Ids::CACTUS, function(Reader $in) : Block{ @@ -1078,6 +1143,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return $block; }); + $this->map(Ids::CHISELED_QUARTZ_BLOCK, function(Reader $in) : Block{ + return Blocks::CHISELED_QUARTZ() + ->setAxis($in->readPillarAxis()); + }); $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), @@ -1095,9 +1164,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CHORUS_FLOWER() ->setAge($in->readBoundedInt(StateNames::AGE, ChorusFlower::MIN_AGE, ChorusFlower::MAX_AGE)); }); + $this->map(Ids::COARSE_DIRT, fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE)); $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB()); $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); + $this->mapSlab(Ids::COBBLESTONE_SLAB, Ids::COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::COBBLESTONE_SLAB()); $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); $this->map(Ids::COCOA, function(Reader $in) : Block{ return Blocks::COCOA_POD() @@ -1118,15 +1189,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); - $this->map(Ids::CORAL_FAN_HANG, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::BRAIN : CoralType::TUBE)); - $this->map(Ids::CORAL_FAN_HANG2, fn(Reader $in) => Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType($in->readBool(StateNames::CORAL_HANG_TYPE_BIT) ? CoralType::FIRE : CoralType::BUBBLE)); - $this->map(Ids::CORAL_FAN_HANG3, function(Reader $in) : Block{ - $in->ignored(StateNames::CORAL_HANG_TYPE_BIT); //the game always writes this, even though it's not used - return Helper::decodeWallCoralFan(Blocks::WALL_CORAL_FAN(), $in) - ->setCoralType(CoralType::HORN); - }); + $this->mapSlab(Ids::CUT_RED_SANDSTONE_SLAB, Ids::CUT_RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::CUT_RED_SANDSTONE_SLAB()); + $this->mapSlab(Ids::CUT_SANDSTONE_SLAB, Ids::CUT_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::CUT_SANDSTONE_SLAB()); + $this->mapSlab(Ids::DARK_PRISMARINE_SLAB, Ids::DARK_PRISMARINE_DOUBLE_SLAB, fn() => Blocks::DARK_PRISMARINE_SLAB()); $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS()); $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in) ->setInverted(false)); @@ -1148,15 +1213,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT)) ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); + $this->mapSlab(Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB, fn() => Blocks::DIORITE_SLAB()); $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); - $this->map(Ids::DIRT, function(Reader $in) : Block{ - return Blocks::DIRT() - ->setDirtType(match($value = $in->readString(StateNames::DIRT_TYPE)){ - StringValues::DIRT_TYPE_NORMAL => DirtType::NORMAL, - StringValues::DIRT_TYPE_COARSE => DirtType::COARSE, - default => throw $in->badValueException(StateNames::DIRT_TYPE, $value), - }); - }); + $this->map(Ids::DIRT, fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL)); $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); $this->map(Ids::LARGE_FERN, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LARGE_FERN(), $in)); $this->map(Ids::TALL_GRASS, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::DOUBLE_TALLGRASS(), $in)); @@ -1174,6 +1233,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::END_ROD() ->setFacing($in->readEndRodFacingDirection()); }); + $this->mapSlab(Ids::END_STONE_BRICK_SLAB, Ids::END_STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::END_STONE_BRICK_SLAB()); $this->map(Ids::ENDER_CHEST, function(Reader $in) : Block{ return Blocks::ENDER_CHEST() ->setFacing($in->readCardinalHorizontalFacing()); @@ -1213,6 +1273,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT)) ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5)); }); + $this->mapSlab(Ids::GRANITE_SLAB, Ids::GRANITE_DOUBLE_SLAB, fn() => Blocks::GRANITE_SLAB()); $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); @@ -1260,10 +1321,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value), }); }); - $this->map(Ids::LIGHT_BLOCK, function(Reader $in) : Block{ - return Blocks::LIGHT() - ->setLightLevel($in->readBoundedInt(StateNames::BLOCK_LIGHT_LEVEL, Light::MIN_LIGHT_LEVEL, Light::MAX_LIGHT_LEVEL)); - }); $this->map(Ids::LIGHTNING_ROD, function(Reader $in) : Block{ return Blocks::LIGHTNING_ROD() ->setFacing($in->readFacingDirection()); @@ -1307,18 +1364,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readBlockFace()); }); $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); - $this->map(Ids::MONSTER_EGG, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::MONSTER_EGG_STONE_TYPE)){ - StringValues::MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK => Blocks::INFESTED_CHISELED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_COBBLESTONE => Blocks::INFESTED_COBBLESTONE(), - StringValues::MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK => Blocks::INFESTED_CRACKED_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_MOSSY_STONE_BRICK => Blocks::INFESTED_MOSSY_STONE_BRICK(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE => Blocks::INFESTED_STONE(), - StringValues::MONSTER_EGG_STONE_TYPE_STONE_BRICK => Blocks::INFESTED_STONE_BRICK(), - default => throw $in->badValueException(StateNames::MONSTER_EGG_STONE_TYPE, $type), - }; - }); + $this->mapSlab(Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::MOSSY_COBBLESTONE_SLAB()); $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS()); + $this->mapSlab(Ids::MOSSY_STONE_BRICK_SLAB, Ids::MOSSY_STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::MOSSY_STONE_BRICK_SLAB()); $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); $this->mapSlab(Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB, fn() => Blocks::MUD_BRICK_SLAB()); $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS()); @@ -1327,11 +1375,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::MUDDY_MANGROVE_ROOTS() ->setAxis($in->readPillarAxis()); }); + $this->mapSlab(Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::NETHER_BRICK_SLAB()); $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ return Blocks::NETHER_WART() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); }); + $this->mapSlab(Ids::NORMAL_STONE_SLAB, Ids::NORMAL_STONE_DOUBLE_SLAB, fn() => Blocks::STONE_SLAB()); $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE)->setAxis($in->readPillarAxis())); $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED)); @@ -1339,6 +1389,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED)); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED)); $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT)->setAxis($in->readPillarAxis())); + $this->mapSlab(Ids::PETRIFIED_OAK_SLAB, Ids::PETRIFIED_OAK_DOUBLE_SLAB, fn() => Blocks::FAKE_WOODEN_SLAB()); $this->map(Ids::PINK_PETALS, function(Reader $in) : Block{ //Pink petals only uses 0-3, but GROWTH state can go up to 7 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7); @@ -1362,6 +1413,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::PITCHER_PLANT() ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); + $this->mapSlab(Ids::POLISHED_ANDESITE_SLAB, Ids::POLISHED_ANDESITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_ANDESITE_SLAB()); $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS()); $this->map(Ids::POLISHED_BASALT, function(Reader $in) : Block{ return Blocks::POLISHED_BASALT() @@ -1378,7 +1430,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSlab(Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DEEPSLATE_SLAB()); $this->mapStairs(Ids::POLISHED_DEEPSLATE_STAIRS, fn() => Blocks::POLISHED_DEEPSLATE_STAIRS()); $this->map(Ids::POLISHED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_DEEPSLATE_WALL(), $in)); + $this->mapSlab(Ids::POLISHED_DIORITE_SLAB, Ids::POLISHED_DIORITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DIORITE_SLAB()); $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS()); + $this->mapSlab(Ids::POLISHED_GRANITE_SLAB, Ids::POLISHED_GRANITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_GRANITE_SLAB()); $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS()); $this->map(Ids::PORTAL, function(Reader $in) : Block{ return Blocks::NETHER_PORTAL() @@ -1393,15 +1447,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::POWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in)); $this->map(Ids::POWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in) ->setPowered(true)); - $this->map(Ids::PRISMARINE, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::PRISMARINE_BLOCK_TYPE)){ - StringValues::PRISMARINE_BLOCK_TYPE_BRICKS => Blocks::PRISMARINE_BRICKS(), - StringValues::PRISMARINE_BLOCK_TYPE_DARK => Blocks::DARK_PRISMARINE(), - StringValues::PRISMARINE_BLOCK_TYPE_DEFAULT => Blocks::PRISMARINE(), - default => throw $in->badValueException(StateNames::PRISMARINE_BLOCK_TYPE, $type), - }; - }); + $this->mapSlab(Ids::PRISMARINE_BRICK_SLAB, Ids::PRISMARINE_BRICK_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_BRICKS_SLAB()); $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS()); + $this->mapSlab(Ids::PRISMARINE_SLAB, Ids::PRISMARINE_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_SLAB()); $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS()); $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ $in->ignored(StateNames::MC_CARDINAL_DIRECTION); //obsolete @@ -1422,39 +1470,26 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }; } }); + $this->mapSlab(Ids::PURPUR_SLAB, Ids::PURPUR_DOUBLE_SLAB, fn() => Blocks::PURPUR_SLAB()); $this->mapStairs(Ids::PURPUR_STAIRS, fn() => Blocks::PURPUR_STAIRS()); - $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Block{ - switch($type = $in->readString(StateNames::CHISEL_TYPE)){ - case StringValues::CHISEL_TYPE_CHISELED: - return Blocks::CHISELED_QUARTZ()->setAxis($in->readPillarAxis()); - case StringValues::CHISEL_TYPE_DEFAULT: - $in->ignored(StateNames::PILLAR_AXIS); - return Blocks::QUARTZ(); - case StringValues::CHISEL_TYPE_LINES: - return Blocks::QUARTZ_PILLAR()->setAxis($in->readPillarAxis()); - case StringValues::CHISEL_TYPE_SMOOTH: - $in->ignored(StateNames::PILLAR_AXIS); - return Blocks::SMOOTH_QUARTZ(); - default: - throw $in->badValueException(StateNames::CHISEL_TYPE, $type); - } + $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Opaque{ + $in->ignored(StateNames::PILLAR_AXIS); + return Blocks::QUARTZ(); }); + $this->map(Ids::QUARTZ_PILLAR, function(Reader $in) : Block{ + return Blocks::QUARTZ_PILLAR() + ->setAxis($in->readPillarAxis()); + }); + $this->mapSlab(Ids::QUARTZ_SLAB, Ids::QUARTZ_DOUBLE_SLAB, fn() => Blocks::QUARTZ_SLAB()); $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS()); $this->map(Ids::RAIL, function(Reader $in) : Block{ return Blocks::RAIL() ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9)); }); $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); + $this->mapSlab(Ids::RED_NETHER_BRICK_SLAB, Ids::RED_NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::RED_NETHER_BRICK_SLAB()); $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); - $this->map(Ids::RED_SANDSTONE, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => Blocks::CUT_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => Blocks::RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => Blocks::CHISELED_RED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => Blocks::SMOOTH_RED_SANDSTONE(), - default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), - }; - }); + $this->mapSlab(Ids::RED_SANDSTONE_SLAB, Ids::RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::RED_SANDSTONE_SLAB()); $this->mapStairs(Ids::RED_SANDSTONE_STAIRS, fn() => Blocks::RED_SANDSTONE_STAIRS()); $this->map(Ids::REDSTONE_LAMP, function() : Block{ return Blocks::REDSTONE_LAMP() @@ -1477,22 +1512,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::SUGARCANE() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15)); }); - $this->map(Ids::SAND, function(Reader $in) : Block{ - return match($value = $in->readString(StateNames::SAND_TYPE)){ - StringValues::SAND_TYPE_NORMAL => Blocks::SAND(), - StringValues::SAND_TYPE_RED => Blocks::RED_SAND(), - default => throw $in->badValueException(StateNames::SAND_TYPE, $value), - }; - }); - $this->map(Ids::SANDSTONE, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::SAND_STONE_TYPE)){ - StringValues::SAND_STONE_TYPE_CUT => Blocks::CUT_SANDSTONE(), - StringValues::SAND_STONE_TYPE_DEFAULT => Blocks::SANDSTONE(), - StringValues::SAND_STONE_TYPE_HEIROGLYPHS => Blocks::CHISELED_SANDSTONE(), - StringValues::SAND_STONE_TYPE_SMOOTH => Blocks::SMOOTH_SANDSTONE(), - default => throw $in->badValueException(StateNames::SAND_STONE_TYPE, $type), - }; - }); + $this->mapSlab(Ids::SANDSTONE_SLAB, Ids::SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SANDSTONE_SLAB()); $this->mapStairs(Ids::SANDSTONE_STAIRS, fn() => Blocks::SANDSTONE_STAIRS()); $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ return Blocks::SEA_PICKLE() @@ -1518,9 +1538,17 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readCardinalHorizontalFacing()) ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT)); }); + $this->map(Ids::SMOOTH_QUARTZ, function(Reader $in) : Block{ + $in->ignored(StateNames::PILLAR_AXIS); + return Blocks::SMOOTH_QUARTZ(); + }); + $this->mapSlab(Ids::SMOOTH_QUARTZ_SLAB, Ids::SMOOTH_QUARTZ_DOUBLE_SLAB, fn() => Blocks::SMOOTH_QUARTZ_SLAB()); $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS()); + $this->mapSlab(Ids::SMOOTH_RED_SANDSTONE_SLAB, Ids::SMOOTH_RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_RED_SANDSTONE_SLAB()); $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS()); + $this->mapSlab(Ids::SMOOTH_SANDSTONE_SLAB, Ids::SMOOTH_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_SANDSTONE_SLAB()); $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS()); + $this->mapSlab(Ids::SMOOTH_STONE_SLAB, Ids::SMOOTH_STONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_STONE_SLAB()); $this->map(Ids::SNOW_LAYER, function(Reader $in) : Block{ $in->ignored(StateNames::COVERED_BIT); //seems to be useless return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1); @@ -1548,35 +1576,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::BANNER() ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15)); }); + $this->mapSlab(Ids::STONE_BRICK_SLAB, Ids::STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::STONE_BRICK_SLAB()); $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); - - //mess for partially flattened slabs - the single IDs were flattened but not the double ones - $this->map(Ids::DOUBLE_STONE_BLOCK_SLAB, fn(Reader $in) => Helper::decodeDoubleSlab(Helper::mapStoneSlab1Type($in), $in)); - $this->map(Ids::BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::BRICK_SLAB(), $in)); - $this->map(Ids::COBBLESTONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::COBBLESTONE_SLAB(), $in)); - $this->map(Ids::NETHER_BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::NETHER_BRICK_SLAB(), $in)); - $this->map(Ids::PETRIFIED_OAK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::FAKE_WOODEN_SLAB(), $in)); - $this->map(Ids::QUARTZ_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::QUARTZ_SLAB(), $in)); - $this->map(Ids::SANDSTONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::SANDSTONE_SLAB(), $in)); - $this->map(Ids::SMOOTH_STONE_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::SMOOTH_STONE_SLAB(), $in)); - $this->map(Ids::STONE_BRICK_SLAB, fn(Reader $in) => Helper::decodeSingleSlab(Blocks::STONE_BRICK_SLAB(), $in)); - - $this->mapSlab(Ids::STONE_BLOCK_SLAB2, Ids::DOUBLE_STONE_BLOCK_SLAB2, fn(Reader $in) => Helper::mapStoneSlab2Type($in)); - $this->mapSlab(Ids::STONE_BLOCK_SLAB3, Ids::DOUBLE_STONE_BLOCK_SLAB3, fn(Reader $in) => Helper::mapStoneSlab3Type($in)); - $this->mapSlab(Ids::STONE_BLOCK_SLAB4, Ids::DOUBLE_STONE_BLOCK_SLAB4, fn(Reader $in) => Helper::mapStoneSlab4Type($in)); $this->mapStairs(Ids::STONE_STAIRS, fn() => Blocks::COBBLESTONE_STAIRS()); - $this->map(Ids::STONEBRICK, function(Reader $in) : Block{ - return match($type = $in->readString(StateNames::STONE_BRICK_TYPE)){ - StringValues::STONE_BRICK_TYPE_SMOOTH, //TODO: bug in vanilla - StringValues::STONE_BRICK_TYPE_DEFAULT => Blocks::STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CHISELED => Blocks::CHISELED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_CRACKED => Blocks::CRACKED_STONE_BRICKS(), - StringValues::STONE_BRICK_TYPE_MOSSY => Blocks::MOSSY_STONE_BRICKS(), - default => throw $in->badValueException(StateNames::STONE_BRICK_TYPE, $type), - }; - }); $this->map(Ids::STONECUTTER_BLOCK, function(Reader $in) : Block{ return Blocks::STONECUTTER() ->setFacing($in->readCardinalHorizontalFacing()); diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index c2bc71caf1..db6594c43d 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -91,6 +91,7 @@ final class ItemTypeNames{ public const BROWN_DYE = "minecraft:brown_dye"; public const BRUSH = "minecraft:brush"; public const BUCKET = "minecraft:bucket"; + public const BUNDLE = "minecraft:bundle"; public const BURN_POTTERY_SHERD = "minecraft:burn_pottery_sherd"; public const CAKE = "minecraft:cake"; public const CAMEL_SPAWN_EGG = "minecraft:camel_spawn_egg"; @@ -160,6 +161,7 @@ final class ItemTypeNames{ public const DARK_OAK_DOOR = "minecraft:dark_oak_door"; public const DARK_OAK_HANGING_SIGN = "minecraft:dark_oak_hanging_sign"; public const DARK_OAK_SIGN = "minecraft:dark_oak_sign"; + public const DEBUG_STICK = "minecraft:debug_stick"; public const DIAMOND = "minecraft:diamond"; public const DIAMOND_AXE = "minecraft:diamond_axe"; public const DIAMOND_BOOTS = "minecraft:diamond_boots"; @@ -175,6 +177,10 @@ final class ItemTypeNames{ public const DOLPHIN_SPAWN_EGG = "minecraft:dolphin_spawn_egg"; public const DONKEY_SPAWN_EGG = "minecraft:donkey_spawn_egg"; public const DOUBLE_PLANT = "minecraft:double_plant"; + public const DOUBLE_STONE_BLOCK_SLAB = "minecraft:double_stone_block_slab"; + public const DOUBLE_STONE_BLOCK_SLAB2 = "minecraft:double_stone_block_slab2"; + public const DOUBLE_STONE_BLOCK_SLAB3 = "minecraft:double_stone_block_slab3"; + public const DOUBLE_STONE_BLOCK_SLAB4 = "minecraft:double_stone_block_slab4"; public const DRAGON_BREATH = "minecraft:dragon_breath"; public const DRIED_KELP = "minecraft:dried_kelp"; public const DROWNED_SPAWN_EGG = "minecraft:drowned_spawn_egg"; @@ -299,6 +305,7 @@ final class ItemTypeNames{ public const LEATHER_LEGGINGS = "minecraft:leather_leggings"; public const LEAVES = "minecraft:leaves"; public const LEAVES2 = "minecraft:leaves2"; + public const LIGHT_BLOCK = "minecraft:light_block"; public const LIGHT_BLUE_DYE = "minecraft:light_blue_dye"; public const LIGHT_GRAY_DYE = "minecraft:light_gray_dye"; public const LIME_DYE = "minecraft:lime_dye"; @@ -323,6 +330,7 @@ final class ItemTypeNames{ public const MINECART = "minecraft:minecart"; public const MINER_POTTERY_SHERD = "minecraft:miner_pottery_sherd"; public const MOJANG_BANNER_PATTERN = "minecraft:mojang_banner_pattern"; + public const MONSTER_EGG = "minecraft:monster_egg"; public const MOOSHROOM_SPAWN_EGG = "minecraft:mooshroom_spawn_egg"; public const MOURNER_POTTERY_SHERD = "minecraft:mourner_pottery_sherd"; public const MULE_SPAWN_EGG = "minecraft:mule_spawn_egg"; @@ -475,10 +483,14 @@ final class ItemTypeNames{ public const STICK = "minecraft:stick"; public const STONE_AXE = "minecraft:stone_axe"; public const STONE_BLOCK_SLAB = "minecraft:stone_block_slab"; + public const STONE_BLOCK_SLAB2 = "minecraft:stone_block_slab2"; + public const STONE_BLOCK_SLAB3 = "minecraft:stone_block_slab3"; + public const STONE_BLOCK_SLAB4 = "minecraft:stone_block_slab4"; public const STONE_HOE = "minecraft:stone_hoe"; public const STONE_PICKAXE = "minecraft:stone_pickaxe"; public const STONE_SHOVEL = "minecraft:stone_shovel"; public const STONE_SWORD = "minecraft:stone_sword"; + public const STONEBRICK = "minecraft:stonebrick"; public const STRAY_SPAWN_EGG = "minecraft:stray_spawn_egg"; public const STRIDER_SPAWN_EGG = "minecraft:strider_spawn_egg"; public const STRING = "minecraft:string"; diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 8c0d5b6e61..16898283a9 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -500,14 +500,16 @@ class InventoryManager{ $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $netSlot, - new ItemStackWrapper(0, ItemStack::null()) + new ItemStackWrapper(0, ItemStack::null()), + 0 )); } //now send the real contents $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $netSlot, - $itemStackWrapper + $itemStackWrapper, + 0 )); } @@ -525,10 +527,11 @@ class InventoryManager{ */ $this->session->sendDataPacket(InventoryContentPacket::create( $windowId, - array_fill_keys(array_keys($itemStackWrappers), new ItemStackWrapper(0, ItemStack::null())) + array_fill_keys(array_keys($itemStackWrappers), new ItemStackWrapper(0, ItemStack::null())), + 0 )); //now send the real contents - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers)); + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers, 0)); } public function syncSlot(Inventory $inventory, int $slot, ItemStack $itemStack) : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 218e102533..33a9303a30 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -743,7 +743,7 @@ class NetworkSession{ }else{ $translated = $message; } - $this->sendDataPacket(DisconnectPacket::create(0, $translated)); + $this->sendDataPacket(DisconnectPacket::create(0, $translated, "")); } /** diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php index 6b8a83fe1a..e2a707a3db 100644 --- a/src/network/mcpe/StandardEntityEventBroadcaster.php +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -41,6 +41,7 @@ use pocketmine\network\mcpe\protocol\TakeItemActorPacket; use pocketmine\network\mcpe\protocol\types\entity\Attribute as NetworkAttribute; use pocketmine\network\mcpe\protocol\types\entity\PropertySyncData; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; +use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use function array_map; @@ -131,7 +132,8 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getHelmet())), ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getChestplate())), ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getLeggings())), - ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getBoots())) + ItemStackWrapper::legacy($converter->coreItemStackToNet($inv->getBoots())), + new ItemStackWrapper(0, ItemStack::null()) )); } diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index a36ae9f405..a1d5e48124 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -112,10 +112,10 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ protected function getBuilderInventoryAndSlot(ItemStackRequestSlotInfo $info) : array{ - [$windowId, $slotId] = ItemStackContainerIdTranslator::translate($info->getContainerId(), $this->inventoryManager->getCurrentWindowId(), $info->getSlotId()); + [$windowId, $slotId] = ItemStackContainerIdTranslator::translate($info->getContainerName()->getContainerId(), $this->inventoryManager->getCurrentWindowId(), $info->getSlotId()); $windowAndSlot = $this->inventoryManager->locateWindowAndSlot($windowId, $slotId); if($windowAndSlot === null){ - throw new ItemStackRequestProcessException("No open inventory matches container UI ID: " . $info->getContainerId() . ", slot ID: " . $info->getSlotId()); + throw new ItemStackRequestProcessException("No open inventory matches container UI ID: " . $info->getContainerName()->getContainerId() . ", slot ID: " . $info->getSlotId()); } [$inventory, $slot] = $windowAndSlot; if(!$inventory->slotExists($slot)){ @@ -142,7 +142,7 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ protected function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{ - if($slotInfo->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $slotInfo->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ + if($slotInfo->getContainerName()->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $slotInfo->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){ //special case for the "created item" output slot //TODO: do we need to send a response for this slot info? return $this->takeCreatedItem($count); @@ -391,7 +391,7 @@ class ItemStackRequestExecutor{ public function buildItemStackResponse() : ItemStackResponse{ $builder = new ItemStackResponseBuilder($this->request->getRequestId(), $this->inventoryManager); foreach($this->requestSlotInfos as $requestInfo){ - $builder->addSlot($requestInfo->getContainerId(), $requestInfo->getSlotId()); + $builder->addSlot($requestInfo->getContainerName()->getContainerId(), $requestInfo->getSlotId()); } return $builder->build(); diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index 09af69f2a3..a947eae726 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -27,6 +27,7 @@ use pocketmine\inventory\Inventory; use pocketmine\item\Durable; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\protocol\types\inventory\ContainerUIIds; +use pocketmine\network\mcpe\protocol\types\inventory\FullContainerName; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponse; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseContainerInfo; use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResponseSlotInfo; @@ -99,7 +100,7 @@ final class ItemStackResponseBuilder{ $responseContainerInfos = []; foreach($responseInfosByContainer as $containerInterfaceId => $responseInfos){ - $responseContainerInfos[] = new ItemStackResponseContainerInfo($containerInterfaceId, $responseInfos); + $responseContainerInfos[] = new ItemStackResponseContainerInfo(new FullContainerName($containerInterfaceId, 0), $responseInfos); } return new ItemStackResponse(ItemStackResponse::RESULT_OK, $this->requestId, $responseContainerInfos); diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 7bcc44c0b7..709dadf974 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 686; + public const CURRENT_STORAGE_NETWORK_VERSION = 712; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 21, //minor - 2, //patch - 2, //revision + 20, //patch + 0, //revision 0 //is beta ]; From 9176b2494a4a84729f9cc4dd1f75dd3ec2c8618d Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Fri, 16 Aug 2024 07:54:59 -0500 Subject: [PATCH 1762/1858] Release 5.18.0 --- changelogs/5.18.md | 19 +++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.18.md diff --git a/changelogs/5.18.md b/changelogs/5.18.md new file mode 100644 index 0000000000..4b7911efef --- /dev/null +++ b/changelogs/5.18.md @@ -0,0 +1,19 @@ +# 5.18.0 +Released 16th August 2024. + +**For Minecraft: Bedrock Edition 1.21.20** + +This is a support release for Minecraft: Bedrock Edition 1.21.20. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.21.20. +- Removed support for earlier versions. + +## Fixes +- Use `VISIBLE_MOB_EFFECTS` actor metadata property to send effect bubbles, this fixes effect bubbles not showing diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5162560bfa..de21db3807 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.17.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.18.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From e3baf3cddb74d5930331d5e8f993ff2076151e12 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Fri, 16 Aug 2024 07:56:01 -0500 Subject: [PATCH 1763/1858] 5.18.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index de21db3807..b292b4c458 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.18.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.18.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From a7638cf914f6f0e982a9dd26d03072c9ba00ae8a Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Mon, 19 Aug 2024 19:02:17 +0100 Subject: [PATCH 1764/1858] Give an approving review to team member PRs automatically Branch protection rules currently require 2 approving reviews to merge a PR. What we really want is for 2 team members to be aware of every change. If a team member makes a PR, only one other approval should be needed. Since GitHub doesn't currently allow us to set different review thresholds for different users/teams, sending an automatic approval via GitHub Actions is the next best thing. This should reduce friction of team development work. --- .github/workflows/team-pr-auto-approve.yml | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/team-pr-auto-approve.yml diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml new file mode 100644 index 0000000000..a582be3280 --- /dev/null +++ b/.github/workflows/team-pr-auto-approve.yml @@ -0,0 +1,42 @@ +#Due to GitHub awkwardness, it's not easy to reduce the review requirement for collaborators. +#Our policy is that 2 collaborators should be aware of every change. +#For outside PRs, this means 2 collaborator reviews. +#For PRs made by collaborators, this means 1 reviewer + the author. +#We trust that collaborators don't need as much oversight. +name: Auto approve collaborator PRs + +on: + pull_request_target: + types: + - opened + - synchronize + - reopened + - ready_for_review + +permissions: + pull-requests: write + +jobs: + approve: + name: Auto approve + runs-on: ubuntu-latest + + steps: + - name: Check if PR author has write access + id: check-permission + uses: actions-cool/check-user-permission@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + require: write + username: ${{ github.event.pull_request.user.login }} + #technically this would be fine for dependabot but generally bots don't count as team members + check-bot: true + + #TODO: Some way to avoid unnecessary repeated reviews would be nice here + + - name: Approve PR if authorized + if: steps.check-permission.outputs.require-result == 'true' && steps.check-permission.outputs.check-result == 'false' + uses: juliangruber/approve-pull-request-action@v2 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + number: ${{ github.event.pull_request.number }} From e6f9cdd990465d9269d61e51571d6cc965eabb57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:12:06 +0000 Subject: [PATCH 1765/1858] Bump docker/build-push-action from 6.6.1 to 6.7.0 (#6432) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 4f045bdc9b..437ed963f8 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.6.1 + uses: docker/build-push-action@v6.7.0 with: push: true context: ./pocketmine-mp From bdbcfd10cccf30c9885fd2dbe417331cc0959966 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Mon, 19 Aug 2024 23:52:51 +0200 Subject: [PATCH 1766/1858] Add ShellCheck (#6407) Co-authored-by: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> --- .github/workflows/main.yml | 12 ++++++++++++ start.sh | 2 +- tests/travis.sh | 7 +++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7c92c0b8b2..b5a9740b5c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -37,3 +37,15 @@ jobs: - name: Run PHP-CS-Fixer run: php-cs-fixer fix --dry-run --diff --ansi + + shellcheck: + name: ShellCheck + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v4 + + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@2.0.0 diff --git a/start.sh b/start.sh index 0121f3887b..4d47871143 100755 --- a/start.sh +++ b/start.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash DIR="$(cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd)" -cd "$DIR" +cd "$DIR" || { echo "Couldn't change directory to $DIR"; exit 1; } while getopts "p:f:l" OPTION 2> /dev/null; do case ${OPTION} in diff --git a/tests/travis.sh b/tests/travis.sh index 094f659053..a4674fb6f2 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -7,6 +7,9 @@ while getopts "t:" OPTION 2> /dev/null; do t) PM_WORKERS="$OPTARG" ;; + \?) + break + ;; esac done @@ -19,7 +22,7 @@ rm PocketMine-MP.phar 2> /dev/null mkdir "$DATA_DIR" mkdir "$PLUGINS_DIR" -cd tests/plugins/DevTools +cd tests/plugins/DevTools || { echo "Couldn't change directory to $DIR"; exit 1; } php -dphar.readonly=0 ./src/ConsoleScript.php --make ./ --relative ./ --out "$PLUGINS_DIR/DevTools.phar" cd ../../.. composer make-server @@ -45,7 +48,7 @@ if [ "$result" != "" ]; then echo "$result" echo Some tests did not complete successfully, changing build status to failed exit 1 -elif [ $(grep -c "ERROR\|CRITICAL\|EMERGENCY" "$DATA_DIR/server.log") -ne 0 ]; then +elif [ "$(grep -c "ERROR\|CRITICAL\|EMERGENCY" "$DATA_DIR/server.log")" -ne 0 ]; then echo Server log contains error messages, changing build status to failed exit 1 else From ede363eb0fd98b51b5da307c79339e7de68e62d8 Mon Sep 17 00:00:00 2001 From: Dries C Date: Thu, 22 Aug 2024 22:53:21 +0200 Subject: [PATCH 1767/1858] Fix shift crafting (#6433) This field was added to the action in 1.21.20. Previously, the client would behave as if clicking the crafting result slot many times. Now it behaves more like recipe book shift-clicking. --- src/network/mcpe/handler/ItemStackRequestExecutor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index a1d5e48124..54a1925901 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -343,7 +343,7 @@ class ItemStackRequestExecutor{ $this->setNextCreatedItem($window->getOutput($optionId)); } }else{ - $this->beginCrafting($action->getRecipeId(), 1); + $this->beginCrafting($action->getRecipeId(), $action->getRepetitions()); } }elseif($action instanceof CraftRecipeAutoStackRequestAction){ $this->beginCrafting($action->getRecipeId(), $action->getRepetitions()); From 281afb683813f2cdf037be6e7943551c8d0fe05c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:05:11 +0000 Subject: [PATCH 1768/1858] Bump phpstan/phpstan in the development-patch-updates group (#6435) --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 5d1167b6d8..41eaccc75d 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "symfony/filesystem": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "1.11.10", + "phpstan/phpstan": "1.11.11", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^10.5.24" diff --git a/composer.lock b/composer.lock index 5eb9a21585..c19c5b8ad1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fab1e131dfd049da39a87d4e562f1870", + "content-hash": "85c407770e0f2a1bda7c8e23faf2026e", "packages": [ { "name": "adhocore/json-comment", @@ -1389,16 +1389,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.10", + "version": "1.11.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f" + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/707c2aed5d8d0075666e673a5e71440c1d01a5a3", + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3", "shasum": "" }, "require": { @@ -1443,7 +1443,7 @@ "type": "github" } ], - "time": "2024-08-08T09:02:50+00:00" + "time": "2024-08-19T14:37:29+00:00" }, { "name": "phpstan/phpstan-phpunit", From 9381fc4172e5dce4cada1cb356050c8a2ab57b94 Mon Sep 17 00:00:00 2001 From: "Vega Nicholas S." <142091702+nicholass003@users.noreply.github.com> Date: Sun, 1 Sep 2024 11:33:11 +0700 Subject: [PATCH 1769/1858] Blue Ice: No longer emits light & it's now dropped when mined with a tool with silk touch enchantment (#6438) --- src/block/BlueIce.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/block/BlueIce.php b/src/block/BlueIce.php index f7e9a04046..11e3498dd1 100644 --- a/src/block/BlueIce.php +++ b/src/block/BlueIce.php @@ -27,10 +27,6 @@ use pocketmine\item\Item; class BlueIce extends Opaque{ - public function getLightLevel() : int{ - return 1; - } - public function getFrictionFactor() : float{ return 0.99; } @@ -38,4 +34,8 @@ class BlueIce extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return []; } + + public function isAffectedBySilkTouch() : bool{ + return true; + } } From e9b597af6c06ed07a7dc844f38bd32ae9ecf2b6f Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Mon, 2 Sep 2024 11:24:42 -0500 Subject: [PATCH 1770/1858] Release 5.18.1 --- changelogs/5.18.md | 11 +++++++++++ src/VersionInfo.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/changelogs/5.18.md b/changelogs/5.18.md index 4b7911efef..fdf222d39a 100644 --- a/changelogs/5.18.md +++ b/changelogs/5.18.md @@ -17,3 +17,14 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Use `VISIBLE_MOB_EFFECTS` actor metadata property to send effect bubbles, this fixes effect bubbles not showing + +# 5.18.1 +Released 2nd September 2024. + +## Fixes +- Fixed shift-crafting. +- Blue Ice block no longer emits light & it's now dropped when mined with a tool with silk touch enchantment. + +## Internals +- Pull Requests from team members now get an approval automatically. This means that if a team member makes a PR, only one other approval should be needed. +- Added [ShellCheck](https://github.com/koalaman/shellcheck) to the CI tests. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b292b4c458..0e3c30655d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.18.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 2a7b183ab826f6e75859636cb0b5d0c798196953 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Mon, 2 Sep 2024 11:25:50 -0500 Subject: [PATCH 1771/1858] 5.18.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0e3c30655d..571dd96389 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.18.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.18.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8cb2e577a1aca3f99d6504e48f34cbe75249c2ae Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 3 Sep 2024 02:02:06 +0300 Subject: [PATCH 1772/1858] Implement missing last interacted slot property in chiseled bookshelf (#6440) --- src/block/ChiseledBookshelf.php | 40 ++++++++++++++++++++++++++++ src/block/tile/ChiseledBookshelf.php | 22 +++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/block/ChiseledBookshelf.php b/src/block/ChiseledBookshelf.php index 89340a8f39..73c4861bf3 100644 --- a/src/block/ChiseledBookshelf.php +++ b/src/block/ChiseledBookshelf.php @@ -48,11 +48,32 @@ class ChiseledBookshelf extends Opaque{ */ private array $slots = []; + private ?ChiseledBookshelfSlot $lastInteractedSlot = null; + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->horizontalFacing($this->facing); $w->enumSet($this->slots, ChiseledBookshelfSlot::cases()); } + public function readStateFromWorld() : Block{ + $tile = $this->position->getWorld()->getTile($this->position); + if($tile instanceof TileChiseledBookshelf){ + $this->lastInteractedSlot = $tile->getLastInteractedSlot(); + }else{ + $this->lastInteractedSlot = null; + } + return $this; + } + + public function writeStateToWorld() : void{ + parent::writeStateToWorld(); + + $tile = $this->position->getWorld()->getTile($this->position); + if($tile instanceof TileChiseledBookshelf){ + $tile->setLastInteractedSlot($this->lastInteractedSlot); + } + } + /** * Returns whether the given slot is displayed as occupied. * This doesn't guarantee that there is or isn't a book in the bookshelf's inventory. @@ -92,6 +113,23 @@ class ChiseledBookshelf extends Opaque{ return $this->slots; } + /** + * Returns the last slot interacted by a player or null if no slot has been interacted with yet. + */ + public function getLastInteractedSlot() : ?ChiseledBookshelfSlot{ + return $this->lastInteractedSlot; + } + + /** + * Sets the last slot interacted by a player. + * + * @return $this + */ + public function setLastInteractedSlot(?ChiseledBookshelfSlot $lastInteractedSlot) : self{ + $this->lastInteractedSlot = $lastInteractedSlot; + return $this; + } + public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($face !== $this->facing){ return false; @@ -112,10 +150,12 @@ class ChiseledBookshelf extends Opaque{ $returnedItems[] = $inventory->getItem($slot->value); $inventory->clear($slot->value); $this->setSlot($slot, false); + $this->lastInteractedSlot = $slot; }elseif($item instanceof WritableBookBase || $item instanceof Book || $item instanceof EnchantedBook){ //TODO: type tags like blocks would be better for this $inventory->setItem($slot->value, $item->pop()); $this->setSlot($slot, true); + $this->lastInteractedSlot = $slot; }else{ return true; } diff --git a/src/block/tile/ChiseledBookshelf.php b/src/block/tile/ChiseledBookshelf.php index 6455208fec..06175e27f4 100644 --- a/src/block/tile/ChiseledBookshelf.php +++ b/src/block/tile/ChiseledBookshelf.php @@ -40,8 +40,12 @@ use function count; class ChiseledBookshelf extends Tile implements Container{ use ContainerTrait; + private const TAG_LAST_INTERACTED_SLOT = "LastInteractedSlot"; //TAG_Int + private SimpleInventory $inventory; + private ?ChiseledBookshelfSlot $lastInteractedSlot = null; + public function __construct(World $world, Vector3 $pos){ parent::__construct($world, $pos); $this->inventory = new SimpleInventory(count(ChiseledBookshelfSlot::cases())); @@ -55,12 +59,30 @@ class ChiseledBookshelf extends Tile implements Container{ return $this->inventory; } + public function getLastInteractedSlot() : ?ChiseledBookshelfSlot{ + return $this->lastInteractedSlot; + } + + public function setLastInteractedSlot(?ChiseledBookshelfSlot $lastInteractedSlot) : void{ + $this->lastInteractedSlot = $lastInteractedSlot; + } + public function readSaveData(CompoundTag $nbt) : void{ $this->loadItems($nbt); + + $lastInteractedSlot = $nbt->getInt(self::TAG_LAST_INTERACTED_SLOT, 0); + if($lastInteractedSlot !== 0){ + $this->lastInteractedSlot = ChiseledBookshelfSlot::tryFrom($lastInteractedSlot - 1); + } } protected function writeSaveData(CompoundTag $nbt) : void{ $this->saveItems($nbt); + + $nbt->setInt(self::TAG_LAST_INTERACTED_SLOT, $this->lastInteractedSlot !== null ? + $this->lastInteractedSlot->value + 1 : + 0 + ); } protected function loadItems(CompoundTag $tag) : void{ From 72d941fc1bbbbf9999eb89c8104ad709dc464b17 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Tue, 3 Sep 2024 11:33:05 +0100 Subject: [PATCH 1773/1858] Update 5.18.md --- changelogs/5.18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/5.18.md b/changelogs/5.18.md index fdf222d39a..35aa237afe 100644 --- a/changelogs/5.18.md +++ b/changelogs/5.18.md @@ -19,7 +19,7 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if - Use `VISIBLE_MOB_EFFECTS` actor metadata property to send effect bubbles, this fixes effect bubbles not showing # 5.18.1 -Released 2nd September 2024. +Released 3rd September 2024. ## Fixes - Fixed shift-crafting. From f6e2a1ecce9a78ab1cb59d3a73472da657f3bea6 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Mon, 9 Sep 2024 09:48:38 +0200 Subject: [PATCH 1774/1858] Validate transaction slots (#6304) --- src/inventory/ArmorInventory.php | 23 ++++++++++ src/inventory/BaseInventory.php | 11 ++++- src/inventory/SlotValidatedInventory.php | 46 +++++++++++++++++++ .../transaction/action/SlotChangeAction.php | 9 ++++ .../validator/CallbackSlotValidator.php | 44 ++++++++++++++++++ .../action/validator/SlotValidator.php | 38 +++++++++++++++ 6 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 src/inventory/SlotValidatedInventory.php create mode 100644 src/inventory/transaction/action/validator/CallbackSlotValidator.php create mode 100644 src/inventory/transaction/action/validator/SlotValidator.php diff --git a/src/inventory/ArmorInventory.php b/src/inventory/ArmorInventory.php index dcb3c04cb2..0b3ae5b7bc 100644 --- a/src/inventory/ArmorInventory.php +++ b/src/inventory/ArmorInventory.php @@ -23,8 +23,13 @@ declare(strict_types=1); namespace pocketmine\inventory; +use pocketmine\block\BlockTypeIds; use pocketmine\entity\Living; +use pocketmine\inventory\transaction\action\validator\CallbackSlotValidator; +use pocketmine\inventory\transaction\TransactionValidationException; +use pocketmine\item\Armor; use pocketmine\item\Item; +use pocketmine\item\ItemBlock; class ArmorInventory extends SimpleInventory{ public const SLOT_HEAD = 0; @@ -36,6 +41,8 @@ class ArmorInventory extends SimpleInventory{ protected Living $holder ){ parent::__construct(4); + + $this->validators->add(new CallbackSlotValidator($this->validate(...))); } public function getHolder() : Living{ @@ -73,4 +80,20 @@ class ArmorInventory extends SimpleInventory{ public function setBoots(Item $boots) : void{ $this->setItem(self::SLOT_FEET, $boots); } + + private function validate(Inventory $inventory, Item $item, int $slot) : ?TransactionValidationException{ + if($item instanceof Armor){ + if($item->getArmorSlot() !== $slot){ + return new TransactionValidationException("Armor item is in wrong slot"); + } + }else{ + if(!($slot === ArmorInventory::SLOT_HEAD && $item instanceof ItemBlock && ( + $item->getBlock()->getTypeId() === BlockTypeIds::CARVED_PUMPKIN || + $item->getBlock()->getTypeId() === BlockTypeIds::MOB_HEAD + ))){ + return new TransactionValidationException("Item is not accepted in an armor slot"); + } + } + return null; + } } diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 254e44b1ea..522c827a4b 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -36,8 +36,10 @@ use function spl_object_id; /** * This class provides everything needed to implement an inventory, minus the underlying storage system. + * + * @phpstan-import-type SlotValidators from SlotValidatedInventory */ -abstract class BaseInventory implements Inventory{ +abstract class BaseInventory implements Inventory, SlotValidatedInventory{ protected int $maxStackSize = Inventory::MAX_STACK; /** @var Player[] */ protected array $viewers = []; @@ -46,9 +48,12 @@ abstract class BaseInventory implements Inventory{ * @phpstan-var ObjectSet */ protected ObjectSet $listeners; + /** @phpstan-var SlotValidators */ + protected ObjectSet $validators; public function __construct(){ $this->listeners = new ObjectSet(); + $this->validators = new ObjectSet(); } public function getMaxStackSize() : int{ @@ -398,4 +403,8 @@ abstract class BaseInventory implements Inventory{ public function getListeners() : ObjectSet{ return $this->listeners; } + + public function getSlotValidators() : ObjectSet{ + return $this->validators; + } } diff --git a/src/inventory/SlotValidatedInventory.php b/src/inventory/SlotValidatedInventory.php new file mode 100644 index 0000000000..f30ebf8a01 --- /dev/null +++ b/src/inventory/SlotValidatedInventory.php @@ -0,0 +1,46 @@ + + */ +interface SlotValidatedInventory{ + /** + * Returns a set of validators that will be used to determine whether an item can be placed in a particular slot. + * All validators need to return null for the transaction to be allowed. + * If one of the validators returns an exception, the transaction will be cancelled. + * + * There is no guarantee that the validators will be called in any particular order. + * + * @phpstan-return SlotValidators + */ + public function getSlotValidators() : ObjectSet; +} diff --git a/src/inventory/transaction/action/SlotChangeAction.php b/src/inventory/transaction/action/SlotChangeAction.php index 453f0c4d22..68c3dba1b3 100644 --- a/src/inventory/transaction/action/SlotChangeAction.php +++ b/src/inventory/transaction/action/SlotChangeAction.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\inventory\transaction\action; use pocketmine\inventory\Inventory; +use pocketmine\inventory\SlotValidatedInventory; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionValidationException; use pocketmine\item\Item; @@ -74,6 +75,14 @@ class SlotChangeAction extends InventoryAction{ if($this->targetItem->getCount() > $this->inventory->getMaxStackSize()){ throw new TransactionValidationException("Target item exceeds inventory max stack size"); } + if($this->inventory instanceof SlotValidatedInventory && !$this->targetItem->isNull()){ + foreach($this->inventory->getSlotValidators() as $validator){ + $ret = $validator->validate($this->inventory, $this->targetItem, $this->inventorySlot); + if($ret !== null){ + throw new TransactionValidationException("Target item is not accepted by the inventory at slot #" . $this->inventorySlot . ": " . $ret->getMessage(), 0, $ret); + } + } + } } /** diff --git a/src/inventory/transaction/action/validator/CallbackSlotValidator.php b/src/inventory/transaction/action/validator/CallbackSlotValidator.php new file mode 100644 index 0000000000..1670dc6232 --- /dev/null +++ b/src/inventory/transaction/action/validator/CallbackSlotValidator.php @@ -0,0 +1,44 @@ +validate)($inventory, $item, $slot); + } +} diff --git a/src/inventory/transaction/action/validator/SlotValidator.php b/src/inventory/transaction/action/validator/SlotValidator.php new file mode 100644 index 0000000000..1b78c91f7f --- /dev/null +++ b/src/inventory/transaction/action/validator/SlotValidator.php @@ -0,0 +1,38 @@ + Date: Sat, 21 Sep 2024 01:47:25 +0200 Subject: [PATCH 1775/1858] Assemble 1.21.30 (#6453) --- composer.json | 8 +- composer.lock | 52 ++++++------ src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 7 -- .../bedrock/block/BlockStateStringValues.php | 31 ------- src/data/bedrock/block/BlockTypeNames.php | 29 ++++++- .../convert/BlockObjectToStateSerializer.php | 66 +++++++-------- .../convert/BlockStateDeserializerHelper.php | 30 ------- .../convert/BlockStateSerializerHelper.php | 11 +-- .../BlockStateToObjectDeserializer.php | 81 ++++++++++--------- src/data/bedrock/item/ItemTypeNames.php | 3 + src/network/mcpe/InventoryManager.php | 14 ++-- src/network/mcpe/NetworkSession.php | 2 +- .../mcpe/StandardEntityEventBroadcaster.php | 13 ++- .../mcpe/handler/ItemStackResponseBuilder.php | 2 +- .../handler/ResourcePacksPacketHandler.php | 2 - src/world/format/io/data/BedrockWorldData.php | 6 +- 17 files changed, 156 insertions(+), 205 deletions(-) diff --git a/composer.json b/composer.json index 41eaccc75d..0b9e8ec6ba 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.3.0+bedrock-1.21.20", - "pocketmine/bedrock-data": "~2.12.0+bedrock-1.21.20", - "pocketmine/bedrock-item-upgrade-schema": "~1.11.0+bedrock-1.21.20", - "pocketmine/bedrock-protocol": "~33.0.0+bedrock-1.21.20", + "pocketmine/bedrock-block-upgrade-schema": "~4.4.0+bedrock-1.21.30", + "pocketmine/bedrock-data": "~2.13.0+bedrock-1.21.30", + "pocketmine/bedrock-item-upgrade-schema": "~1.12.0+bedrock-1.21.30", + "pocketmine/bedrock-protocol": "~34.0.0+bedrock-1.21.30", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index c19c5b8ad1..d023c74ace 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "85c407770e0f2a1bda7c8e23faf2026e", + "content-hash": "e16d3ebe48e32bbf96348981249c0ac1", "packages": [ { "name": "adhocore/json-comment", @@ -127,16 +127,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.3.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "53d3a41c37ce90d58b33130cdadad08e442d7c47" + "reference": "89e5f6e19c29e0d0d24835639f72a5ef157c2761" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/53d3a41c37ce90d58b33130cdadad08e442d7c47", - "reference": "53d3a41c37ce90d58b33130cdadad08e442d7c47", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/89e5f6e19c29e0d0d24835639f72a5ef157c2761", + "reference": "89e5f6e19c29e0d0d24835639f72a5ef157c2761", "shasum": "" }, "type": "library", @@ -147,22 +147,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.3.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.4.0" }, - "time": "2024-08-13T18:04:27+00:00" + "time": "2024-09-17T16:06:36+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.12.0+bedrock-1.21.20", + "version": "2.13.0+bedrock-1.21.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "d4ee3d08964fa16fbbdd04af1fb52bbde540b665" + "reference": "23d9356b866654cbd2a62b31373118bedb4a2562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/d4ee3d08964fa16fbbdd04af1fb52bbde540b665", - "reference": "d4ee3d08964fa16fbbdd04af1fb52bbde540b665", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/23d9356b866654cbd2a62b31373118bedb4a2562", + "reference": "23d9356b866654cbd2a62b31373118bedb4a2562", "shasum": "" }, "type": "library", @@ -173,22 +173,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.20" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.30" }, - "time": "2024-08-15T12:50:26+00:00" + "time": "2024-09-17T16:03:14+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.11.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "35c18d093fc2b12da8737b2edb2c3ad6a14a53dd" + "reference": "85a0014c7dfd4a25c22a9efb0b447afb7dc6c409" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/35c18d093fc2b12da8737b2edb2c3ad6a14a53dd", - "reference": "35c18d093fc2b12da8737b2edb2c3ad6a14a53dd", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/85a0014c7dfd4a25c22a9efb0b447afb7dc6c409", + "reference": "85a0014c7dfd4a25c22a9efb0b447afb7dc6c409", "shasum": "" }, "type": "library", @@ -199,22 +199,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.11.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.12.0" }, - "time": "2024-08-13T18:06:25+00:00" + "time": "2024-09-11T19:48:31+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "33.0.0+bedrock-1.21.20", + "version": "34.0.0+bedrock-1.21.30", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "e2264137c5cd0522de2c6ee4921a3a803818ea32" + "reference": "440c8078c66cc2a8f2abf58468df7df7246ee33b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/e2264137c5cd0522de2c6ee4921a3a803818ea32", - "reference": "e2264137c5cd0522de2c6ee4921a3a803818ea32", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/440c8078c66cc2a8f2abf58468df7df7246ee33b", + "reference": "440c8078c66cc2a8f2abf58468df7df7246ee33b", "shasum": "" }, "require": { @@ -227,7 +227,7 @@ "ramsey/uuid": "^4.1" }, "require-dev": { - "phpstan/phpstan": "1.11.2", + "phpstan/phpstan": "1.11.9", "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.0.0", "phpunit/phpunit": "^9.5 || ^10.0" @@ -245,9 +245,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/32.2.0+bedrock-1.21.2" + "source": "https://github.com/pmmp/BedrockProtocol/tree/34.0.0+bedrock-1.21.30" }, - "time": "2024-08-10T19:23:18+00:00" + "time": "2024-09-18T20:58:42+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index 1973b55af1..f405e4cf6d 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -45,8 +45,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (21 << 16) | //minor - (20 << 8) | //patch - (6); //revision + (30 << 8) | //patch + (7); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index e9c33bee24..c54822671f 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -34,7 +34,6 @@ final class BlockStateNames{ public const ACTIVE = "active"; public const AGE = "age"; public const AGE_BIT = "age_bit"; - public const ALLOW_UNDERWATER_BIT = "allow_underwater_bit"; public const ATTACHED_BIT = "attached_bit"; public const ATTACHMENT = "attachment"; public const BAMBOO_LEAF_SIZE = "bamboo_leaf_size"; @@ -52,10 +51,7 @@ final class BlockStateNames{ public const CAN_SUMMON = "can_summon"; public const CANDLES = "candles"; public const CAULDRON_LIQUID = "cauldron_liquid"; - public const CHEMISTRY_TABLE_TYPE = "chemistry_table_type"; - public const CHISEL_TYPE = "chisel_type"; public const CLUSTER_COUNT = "cluster_count"; - public const COLOR_BIT = "color_bit"; public const COMPOSTER_FILL_LEVEL = "composter_fill_level"; public const CONDITIONAL_BIT = "conditional_bit"; public const CORAL_DIRECTION = "coral_direction"; @@ -116,12 +112,10 @@ final class BlockStateNames{ public const ROTATION = "rotation"; public const SCULK_SENSOR_PHASE = "sculk_sensor_phase"; public const SEA_GRASS_TYPE = "sea_grass_type"; - public const SPONGE_TYPE = "sponge_type"; public const STABILITY = "stability"; public const STABILITY_CHECK = "stability_check"; public const STRIPPED_BIT = "stripped_bit"; public const STRUCTURE_BLOCK_TYPE = "structure_block_type"; - public const STRUCTURE_VOID_TYPE = "structure_void_type"; public const SUSPENDED_BIT = "suspended_bit"; public const TOGGLE_BIT = "toggle_bit"; public const TORCH_FACING_DIRECTION = "torch_facing_direction"; @@ -134,7 +128,6 @@ final class BlockStateNames{ public const UPSIDE_DOWN_BIT = "upside_down_bit"; public const VAULT_STATE = "vault_state"; public const VINE_DIRECTION_BITS = "vine_direction_bits"; - public const WALL_BLOCK_TYPE = "wall_block_type"; public const WALL_CONNECTION_TYPE_EAST = "wall_connection_type_east"; public const WALL_CONNECTION_TYPE_NORTH = "wall_connection_type_north"; public const WALL_CONNECTION_TYPE_SOUTH = "wall_connection_type_south"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index 1794e240d1..9dfdcfb634 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -52,16 +52,6 @@ final class BlockStateStringValues{ public const CAULDRON_LIQUID_POWDER_SNOW = "powder_snow"; public const CAULDRON_LIQUID_WATER = "water"; - public const CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR = "compound_creator"; - public const CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR = "element_constructor"; - public const CHEMISTRY_TABLE_TYPE_LAB_TABLE = "lab_table"; - public const CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER = "material_reducer"; - - public const CHISEL_TYPE_CHISELED = "chiseled"; - public const CHISEL_TYPE_DEFAULT = "default"; - public const CHISEL_TYPE_LINES = "lines"; - public const CHISEL_TYPE_SMOOTH = "smooth"; - public const CRACKED_STATE_CRACKED = "cracked"; public const CRACKED_STATE_MAX_CRACKED = "max_cracked"; public const CRACKED_STATE_NO_CRACKS = "no_cracks"; @@ -128,9 +118,6 @@ final class BlockStateStringValues{ public const SEA_GRASS_TYPE_DOUBLE_BOT = "double_bot"; public const SEA_GRASS_TYPE_DOUBLE_TOP = "double_top"; - public const SPONGE_TYPE_DRY = "dry"; - public const SPONGE_TYPE_WET = "wet"; - public const STRUCTURE_BLOCK_TYPE_CORNER = "corner"; public const STRUCTURE_BLOCK_TYPE_DATA = "data"; public const STRUCTURE_BLOCK_TYPE_EXPORT = "export"; @@ -138,9 +125,6 @@ final class BlockStateStringValues{ public const STRUCTURE_BLOCK_TYPE_LOAD = "load"; public const STRUCTURE_BLOCK_TYPE_SAVE = "save"; - public const STRUCTURE_VOID_TYPE_AIR = "air"; - public const STRUCTURE_VOID_TYPE_VOID = "void"; - public const TORCH_FACING_DIRECTION_EAST = "east"; public const TORCH_FACING_DIRECTION_NORTH = "north"; public const TORCH_FACING_DIRECTION_SOUTH = "south"; @@ -158,21 +142,6 @@ final class BlockStateStringValues{ public const VAULT_STATE_INACTIVE = "inactive"; public const VAULT_STATE_UNLOCKING = "unlocking"; - public const WALL_BLOCK_TYPE_ANDESITE = "andesite"; - public const WALL_BLOCK_TYPE_BRICK = "brick"; - public const WALL_BLOCK_TYPE_COBBLESTONE = "cobblestone"; - public const WALL_BLOCK_TYPE_DIORITE = "diorite"; - public const WALL_BLOCK_TYPE_END_BRICK = "end_brick"; - public const WALL_BLOCK_TYPE_GRANITE = "granite"; - public const WALL_BLOCK_TYPE_MOSSY_COBBLESTONE = "mossy_cobblestone"; - public const WALL_BLOCK_TYPE_MOSSY_STONE_BRICK = "mossy_stone_brick"; - public const WALL_BLOCK_TYPE_NETHER_BRICK = "nether_brick"; - public const WALL_BLOCK_TYPE_PRISMARINE = "prismarine"; - public const WALL_BLOCK_TYPE_RED_NETHER_BRICK = "red_nether_brick"; - public const WALL_BLOCK_TYPE_RED_SANDSTONE = "red_sandstone"; - public const WALL_BLOCK_TYPE_SANDSTONE = "sandstone"; - public const WALL_BLOCK_TYPE_STONE_BRICK = "stone_brick"; - public const WALL_CONNECTION_TYPE_EAST_NONE = "none"; public const WALL_CONNECTION_TYPE_EAST_SHORT = "short"; public const WALL_CONNECTION_TYPE_EAST_TALL = "tall"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index f74f858cef..ec55657151 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -59,6 +59,7 @@ final class BlockTypeNames{ public const ANDESITE_DOUBLE_SLAB = "minecraft:andesite_double_slab"; public const ANDESITE_SLAB = "minecraft:andesite_slab"; public const ANDESITE_STAIRS = "minecraft:andesite_stairs"; + public const ANDESITE_WALL = "minecraft:andesite_wall"; public const ANVIL = "minecraft:anvil"; public const AZALEA = "minecraft:azalea"; public const AZALEA_LEAVES = "minecraft:azalea_leaves"; @@ -154,6 +155,7 @@ final class BlockTypeNames{ public const BRICK_DOUBLE_SLAB = "minecraft:brick_double_slab"; public const BRICK_SLAB = "minecraft:brick_slab"; public const BRICK_STAIRS = "minecraft:brick_stairs"; + public const BRICK_WALL = "minecraft:brick_wall"; public const BROWN_CANDLE = "minecraft:brown_candle"; public const BROWN_CANDLE_CAKE = "minecraft:brown_candle_cake"; public const BROWN_CARPET = "minecraft:brown_carpet"; @@ -191,7 +193,6 @@ final class BlockTypeNames{ public const CHAIN = "minecraft:chain"; public const CHAIN_COMMAND_BLOCK = "minecraft:chain_command_block"; public const CHEMICAL_HEAT = "minecraft:chemical_heat"; - public const CHEMISTRY_TABLE = "minecraft:chemistry_table"; public const CHERRY_BUTTON = "minecraft:cherry_button"; public const CHERRY_DOOR = "minecraft:cherry_door"; public const CHERRY_DOUBLE_SLAB = "minecraft:cherry_double_slab"; @@ -239,10 +240,13 @@ final class BlockTypeNames{ public const COBBLESTONE_SLAB = "minecraft:cobblestone_slab"; public const COBBLESTONE_WALL = "minecraft:cobblestone_wall"; public const COCOA = "minecraft:cocoa"; - public const COLORED_TORCH_BP = "minecraft:colored_torch_bp"; - public const COLORED_TORCH_RG = "minecraft:colored_torch_rg"; + public const COLORED_TORCH_BLUE = "minecraft:colored_torch_blue"; + public const COLORED_TORCH_GREEN = "minecraft:colored_torch_green"; + public const COLORED_TORCH_PURPLE = "minecraft:colored_torch_purple"; + public const COLORED_TORCH_RED = "minecraft:colored_torch_red"; public const COMMAND_BLOCK = "minecraft:command_block"; public const COMPOSTER = "minecraft:composter"; + public const COMPOUND_CREATOR = "minecraft:compound_creator"; public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; public const COPPER_BULB = "minecraft:copper_bulb"; @@ -365,6 +369,8 @@ final class BlockTypeNames{ public const DEEPSLATE_TILES = "minecraft:deepslate_tiles"; public const DENY = "minecraft:deny"; public const DEPRECATED_ANVIL = "minecraft:deprecated_anvil"; + public const DEPRECATED_PURPUR_BLOCK_1 = "minecraft:deprecated_purpur_block_1"; + public const DEPRECATED_PURPUR_BLOCK_2 = "minecraft:deprecated_purpur_block_2"; public const DETECTOR_RAIL = "minecraft:detector_rail"; public const DIAMOND_BLOCK = "minecraft:diamond_block"; public const DIAMOND_ORE = "minecraft:diamond_ore"; @@ -372,6 +378,7 @@ final class BlockTypeNames{ public const DIORITE_DOUBLE_SLAB = "minecraft:diorite_double_slab"; public const DIORITE_SLAB = "minecraft:diorite_slab"; public const DIORITE_STAIRS = "minecraft:diorite_stairs"; + public const DIORITE_WALL = "minecraft:diorite_wall"; public const DIRT = "minecraft:dirt"; public const DIRT_WITH_ROOTS = "minecraft:dirt_with_roots"; public const DISPENSER = "minecraft:dispenser"; @@ -499,6 +506,7 @@ final class BlockTypeNames{ public const ELEMENT_97 = "minecraft:element_97"; public const ELEMENT_98 = "minecraft:element_98"; public const ELEMENT_99 = "minecraft:element_99"; + public const ELEMENT_CONSTRUCTOR = "minecraft:element_constructor"; public const EMERALD_BLOCK = "minecraft:emerald_block"; public const EMERALD_ORE = "minecraft:emerald_ore"; public const ENCHANTING_TABLE = "minecraft:enchanting_table"; @@ -511,6 +519,7 @@ final class BlockTypeNames{ public const END_STONE = "minecraft:end_stone"; public const END_STONE_BRICK_DOUBLE_SLAB = "minecraft:end_stone_brick_double_slab"; public const END_STONE_BRICK_SLAB = "minecraft:end_stone_brick_slab"; + public const END_STONE_BRICK_WALL = "minecraft:end_stone_brick_wall"; public const ENDER_CHEST = "minecraft:ender_chest"; public const EXPOSED_CHISELED_COPPER = "minecraft:exposed_chiseled_copper"; public const EXPOSED_COPPER = "minecraft:exposed_copper"; @@ -553,6 +562,7 @@ final class BlockTypeNames{ public const GRANITE_DOUBLE_SLAB = "minecraft:granite_double_slab"; public const GRANITE_SLAB = "minecraft:granite_slab"; public const GRANITE_STAIRS = "minecraft:granite_stairs"; + public const GRANITE_WALL = "minecraft:granite_wall"; public const GRASS_BLOCK = "minecraft:grass_block"; public const GRASS_PATH = "minecraft:grass_path"; public const GRAVEL = "minecraft:gravel"; @@ -661,6 +671,7 @@ final class BlockTypeNames{ public const JUNGLE_WALL_SIGN = "minecraft:jungle_wall_sign"; public const JUNGLE_WOOD = "minecraft:jungle_wood"; public const KELP = "minecraft:kelp"; + public const LAB_TABLE = "minecraft:lab_table"; public const LADDER = "minecraft:ladder"; public const LANTERN = "minecraft:lantern"; public const LAPIS_BLOCK = "minecraft:lapis_block"; @@ -761,6 +772,7 @@ final class BlockTypeNames{ public const MANGROVE_TRAPDOOR = "minecraft:mangrove_trapdoor"; public const MANGROVE_WALL_SIGN = "minecraft:mangrove_wall_sign"; public const MANGROVE_WOOD = "minecraft:mangrove_wood"; + public const MATERIAL_REDUCER = "minecraft:material_reducer"; public const MEDIUM_AMETHYST_BUD = "minecraft:medium_amethyst_bud"; public const MELON_BLOCK = "minecraft:melon_block"; public const MELON_STEM = "minecraft:melon_stem"; @@ -771,9 +783,11 @@ final class BlockTypeNames{ public const MOSSY_COBBLESTONE_DOUBLE_SLAB = "minecraft:mossy_cobblestone_double_slab"; public const MOSSY_COBBLESTONE_SLAB = "minecraft:mossy_cobblestone_slab"; public const MOSSY_COBBLESTONE_STAIRS = "minecraft:mossy_cobblestone_stairs"; + public const MOSSY_COBBLESTONE_WALL = "minecraft:mossy_cobblestone_wall"; public const MOSSY_STONE_BRICK_DOUBLE_SLAB = "minecraft:mossy_stone_brick_double_slab"; public const MOSSY_STONE_BRICK_SLAB = "minecraft:mossy_stone_brick_slab"; public const MOSSY_STONE_BRICK_STAIRS = "minecraft:mossy_stone_brick_stairs"; + public const MOSSY_STONE_BRICK_WALL = "minecraft:mossy_stone_brick_wall"; public const MOSSY_STONE_BRICKS = "minecraft:mossy_stone_bricks"; public const MOVING_BLOCK = "minecraft:moving_block"; public const MUD = "minecraft:mud"; @@ -789,6 +803,7 @@ final class BlockTypeNames{ public const NETHER_BRICK_FENCE = "minecraft:nether_brick_fence"; public const NETHER_BRICK_SLAB = "minecraft:nether_brick_slab"; public const NETHER_BRICK_STAIRS = "minecraft:nether_brick_stairs"; + public const NETHER_BRICK_WALL = "minecraft:nether_brick_wall"; public const NETHER_GOLD_ORE = "minecraft:nether_gold_ore"; public const NETHER_SPROUTS = "minecraft:nether_sprouts"; public const NETHER_WART = "minecraft:nether_wart"; @@ -910,6 +925,7 @@ final class BlockTypeNames{ public const PRISMARINE_DOUBLE_SLAB = "minecraft:prismarine_double_slab"; public const PRISMARINE_SLAB = "minecraft:prismarine_slab"; public const PRISMARINE_STAIRS = "minecraft:prismarine_stairs"; + public const PRISMARINE_WALL = "minecraft:prismarine_wall"; public const PUMPKIN = "minecraft:pumpkin"; public const PUMPKIN_STEM = "minecraft:pumpkin_stem"; public const PURPLE_CANDLE = "minecraft:purple_candle"; @@ -925,6 +941,7 @@ final class BlockTypeNames{ public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; public const PURPUR_DOUBLE_SLAB = "minecraft:purpur_double_slab"; + public const PURPUR_PILLAR = "minecraft:purpur_pillar"; public const PURPUR_SLAB = "minecraft:purpur_slab"; public const PURPUR_STAIRS = "minecraft:purpur_stairs"; public const QUARTZ_BLOCK = "minecraft:quartz_block"; @@ -950,11 +967,13 @@ final class BlockTypeNames{ public const RED_NETHER_BRICK_DOUBLE_SLAB = "minecraft:red_nether_brick_double_slab"; public const RED_NETHER_BRICK_SLAB = "minecraft:red_nether_brick_slab"; public const RED_NETHER_BRICK_STAIRS = "minecraft:red_nether_brick_stairs"; + public const RED_NETHER_BRICK_WALL = "minecraft:red_nether_brick_wall"; public const RED_SAND = "minecraft:red_sand"; public const RED_SANDSTONE = "minecraft:red_sandstone"; public const RED_SANDSTONE_DOUBLE_SLAB = "minecraft:red_sandstone_double_slab"; public const RED_SANDSTONE_SLAB = "minecraft:red_sandstone_slab"; public const RED_SANDSTONE_STAIRS = "minecraft:red_sandstone_stairs"; + public const RED_SANDSTONE_WALL = "minecraft:red_sandstone_wall"; public const RED_SHULKER_BOX = "minecraft:red_shulker_box"; public const RED_STAINED_GLASS = "minecraft:red_stained_glass"; public const RED_STAINED_GLASS_PANE = "minecraft:red_stained_glass_pane"; @@ -977,6 +996,7 @@ final class BlockTypeNames{ public const SANDSTONE_DOUBLE_SLAB = "minecraft:sandstone_double_slab"; public const SANDSTONE_SLAB = "minecraft:sandstone_slab"; public const SANDSTONE_STAIRS = "minecraft:sandstone_stairs"; + public const SANDSTONE_WALL = "minecraft:sandstone_wall"; public const SCAFFOLDING = "minecraft:scaffolding"; public const SCULK = "minecraft:sculk"; public const SCULK_CATALYST = "minecraft:sculk_catalyst"; @@ -1047,6 +1067,7 @@ final class BlockTypeNames{ public const STONE_BRICK_DOUBLE_SLAB = "minecraft:stone_brick_double_slab"; public const STONE_BRICK_SLAB = "minecraft:stone_brick_slab"; public const STONE_BRICK_STAIRS = "minecraft:stone_brick_stairs"; + public const STONE_BRICK_WALL = "minecraft:stone_brick_wall"; public const STONE_BRICKS = "minecraft:stone_bricks"; public const STONE_BUTTON = "minecraft:stone_button"; public const STONE_PRESSURE_PLATE = "minecraft:stone_pressure_plate"; @@ -1108,6 +1129,7 @@ final class BlockTypeNames{ public const TUFF_WALL = "minecraft:tuff_wall"; public const TURTLE_EGG = "minecraft:turtle_egg"; public const TWISTING_VINES = "minecraft:twisting_vines"; + public const UNDERWATER_TNT = "minecraft:underwater_tnt"; public const UNDERWATER_TORCH = "minecraft:underwater_torch"; public const UNDYED_SHULKER_BOX = "minecraft:undyed_shulker_box"; public const UNKNOWN = "minecraft:unknown"; @@ -1192,6 +1214,7 @@ final class BlockTypeNames{ public const WEATHERED_DOUBLE_CUT_COPPER_SLAB = "minecraft:weathered_double_cut_copper_slab"; public const WEB = "minecraft:web"; public const WEEPING_VINES = "minecraft:weeping_vines"; + public const WET_SPONGE = "minecraft:wet_sponge"; public const WHEAT = "minecraft:wheat"; public const WHITE_CANDLE = "minecraft:white_candle"; public const WHITE_CANDLE_CAKE = "minecraft:white_candle_cake"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index df16957298..af65477297 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -1092,7 +1092,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ); $this->mapSlab(Blocks::ANDESITE_SLAB(), Ids::ANDESITE_SLAB, Ids::ANDESITE_DOUBLE_SLAB); $this->map(Blocks::ANDESITE_STAIRS(), fn(Stair $block) => Helper::encodeStairs($block, new Writer(Ids::ANDESITE_STAIRS))); - $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_ANDESITE)); + $this->map(Blocks::ANDESITE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::ANDESITE_WALL))); $this->map(Blocks::ANVIL(), fn(Anvil $block) : Writer => Writer::create( match($damage = $block->getDamage()){ 0 => Ids::ANVIL, @@ -1169,7 +1169,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::BLACKSTONE_STAIRS(), Ids::BLACKSTONE_STAIRS); $this->map(Blocks::BLACKSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::BLACKSTONE_WALL))); $this->map(Blocks::BLAST_FURNACE(), fn(Furnace $block) => Helper::encodeFurnace($block, Ids::BLAST_FURNACE, Ids::LIT_BLAST_FURNACE)); - $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_BP))); + $this->map(Blocks::BLUE_TORCH(), fn(Torch $block) => Helper::encodeTorch($block, Writer::create(Ids::COLORED_TORCH_BLUE))); $this->map(Blocks::BONE_BLOCK(), function(BoneBlock $block) : Writer{ return Writer::create(Ids::BONE_BLOCK) ->writeInt(StateNames::DEPRECATED, 0) @@ -1183,7 +1183,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->mapSlab(Blocks::BRICK_SLAB(), Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::BRICK_STAIRS(), Ids::BRICK_STAIRS); - $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_BRICK)); + $this->map(Blocks::BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::BRICK_WALL))); $this->map(Blocks::BROWN_MUSHROOM_BLOCK(), fn(BrownMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::BROWN_MUSHROOM_BLOCK))); $this->map(Blocks::CACTUS(), function(Cactus $block) : Writer{ return Writer::create(Ids::CACTUS) @@ -1236,7 +1236,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::COBBLED_DEEPSLATE_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::COBBLED_DEEPSLATE_WALL))); $this->mapSlab(Blocks::COBBLESTONE_SLAB(), Ids::COBBLESTONE_SLAB, Ids::COBBLESTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::COBBLESTONE_STAIRS(), Ids::STONE_STAIRS); - $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_COBBLESTONE)); + $this->map(Blocks::COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::COBBLESTONE_WALL))); $this->map(Blocks::COPPER(), function(Copper $block) : Writer{ $oxidation = $block->getOxidation(); return new Writer($block->isWaxed() ? @@ -1316,7 +1316,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::AGE, $block->getAge()) ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); }); - $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::COMPOUND_CREATOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::COMPOUND_CREATOR))); $this->mapSlab(Blocks::CUT_RED_SANDSTONE_SLAB(), Ids::CUT_RED_SANDSTONE_SLAB, Ids::CUT_RED_SANDSTONE_DOUBLE_SLAB); $this->mapSlab(Blocks::CUT_SANDSTONE_SLAB(), Ids::CUT_SANDSTONE_SLAB, Ids::CUT_SANDSTONE_DOUBLE_SLAB); $this->mapSlab(Blocks::DARK_PRISMARINE_SLAB(), Ids::DARK_PRISMARINE_SLAB, Ids::DARK_PRISMARINE_DOUBLE_SLAB); @@ -1343,7 +1343,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->mapSlab(Blocks::DIORITE_SLAB(), Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB); $this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS); - $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_DIORITE)); + $this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::DIORITE_WALL))); $this->map(Blocks::DIRT(), function(Dirt $block) : Writer{ return Writer::create(match($block->getDirtType()){ DirtType::NORMAL => Ids::DIRT, @@ -1352,7 +1352,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); }); $this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::TALL_GRASS))); - $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::ELEMENT_CONSTRUCTOR))); $this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{ return Writer::create(Ids::ENDER_CHEST) ->writeCardinalHorizontalFacing($block->getFacing()); @@ -1368,7 +1368,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->mapSlab(Blocks::END_STONE_BRICK_SLAB(), Ids::END_STONE_BRICK_SLAB, Ids::END_STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::END_STONE_BRICK_STAIRS(), Ids::END_BRICK_STAIRS); - $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_END_BRICK)); + $this->map(Blocks::END_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::END_STONE_BRICK_WALL))); $this->mapSlab(Blocks::FAKE_WOODEN_SLAB(), Ids::PETRIFIED_OAK_SLAB, Ids::PETRIFIED_OAK_DOUBLE_SLAB); $this->map(Blocks::FARMLAND(), function(Farmland $block) : Writer{ return Writer::create(Ids::FARMLAND) @@ -1402,8 +1402,8 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::GLOWING_ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::GLOW_FRAME)); $this->mapSlab(Blocks::GRANITE_SLAB(), Ids::GRANITE_SLAB, Ids::GRANITE_DOUBLE_SLAB); $this->mapStairs(Blocks::GRANITE_STAIRS(), Ids::GRANITE_STAIRS); - $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_GRANITE)); - $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(Blocks::GRANITE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::GRANITE_WALL))); + $this->map(Blocks::GREEN_TORCH(), fn(Torch $block) => Helper::encodeTorch($block, Writer::create(Ids::COLORED_TORCH_GREEN))); $this->map(Blocks::HAY_BALE(), function(HayBale $block) : Writer{ return Writer::create(Ids::HAY_BLOCK) ->writeInt(StateNames::DEPRECATED, 0) @@ -1417,7 +1417,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::IRON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::IRON_DOOR))); $this->map(Blocks::IRON_TRAPDOOR(), fn(Trapdoor $block) => Helper::encodeTrapdoor($block, new Writer(Ids::IRON_TRAPDOOR))); $this->map(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => Helper::encodeItemFrame($block, Ids::FRAME)); - $this->map(Blocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::LAB_TABLE(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::LAB_TABLE))); $this->map(Blocks::LADDER(), function(Ladder $block) : Writer{ return Writer::create(Ids::LADDER) ->writeHorizontalFacing($block->getFacing()); @@ -1481,7 +1481,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::LOOM) ->writeLegacyHorizontalFacing($block->getFacing()); }); - $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER, new Writer(Ids::CHEMISTRY_TABLE))); + $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::MATERIAL_REDUCER))); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); $this->map(Blocks::MOB_HEAD(), function(MobHead $block) : Writer{ return Writer::create(Ids::SKULL) @@ -1489,10 +1489,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->mapSlab(Blocks::MOSSY_COBBLESTONE_SLAB(), Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); - $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE)); + $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::MOSSY_COBBLESTONE_WALL))); $this->mapSlab(Blocks::MOSSY_STONE_BRICK_SLAB(), Ids::MOSSY_STONE_BRICK_SLAB, Ids::MOSSY_STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::MOSSY_STONE_BRICK_STAIRS(), Ids::MOSSY_STONE_BRICK_STAIRS); - $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK)); + $this->map(Blocks::MOSSY_STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::MOSSY_STONE_BRICK_WALL))); $this->mapSlab(Blocks::MUD_BRICK_SLAB(), Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::MUD_BRICK_STAIRS(), Ids::MUD_BRICK_STAIRS); $this->map(Blocks::MUD_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::MUD_BRICK_WALL))); @@ -1502,7 +1502,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); $this->mapSlab(Blocks::NETHER_BRICK_SLAB(), Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); - $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_NETHER_BRICK)); + $this->map(Blocks::NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::NETHER_BRICK_WALL))); $this->map(Blocks::NETHER_PORTAL(), function(NetherPortal $block) : Writer{ return Writer::create(Ids::PORTAL) ->writeString(StateNames::PORTAL_AXIS, match($block->getAxis()){ @@ -1566,21 +1566,16 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapStairs(Blocks::PRISMARINE_BRICKS_STAIRS(), Ids::PRISMARINE_BRICKS_STAIRS); $this->mapSlab(Blocks::PRISMARINE_SLAB(), Ids::PRISMARINE_SLAB, Ids::PRISMARINE_DOUBLE_SLAB); $this->mapStairs(Blocks::PRISMARINE_STAIRS(), Ids::PRISMARINE_STAIRS); - $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); + $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::PRISMARINE_WALL))); $this->map(Blocks::PUMPKIN(), function() : Writer{ return Writer::create(Ids::PUMPKIN) ->writeCardinalHorizontalFacing(Facing::SOUTH); //no longer used }); $this->map(Blocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); - $this->map(Blocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); - $this->map(Blocks::PURPUR(), function() : Writer{ - return Writer::create(Ids::PURPUR_BLOCK) - ->writeString(StateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_DEFAULT) - ->writePillarAxis(Axis::Y); //useless, but MCPE wants it - }); + $this->map(Blocks::PURPUR(), fn() => Writer::create(Ids::PURPUR_BLOCK)->writePillarAxis(Axis::Y)); + $this->map(Blocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeTorch($block, Writer::create(Ids::COLORED_TORCH_PURPLE))); $this->map(Blocks::PURPUR_PILLAR(), function(SimplePillar $block) : Writer{ - return Writer::create(Ids::PURPUR_BLOCK) - ->writeString(StateNames::CHISEL_TYPE, StringValues::CHISEL_TYPE_LINES) + return Writer::create(Ids::PURPUR_PILLAR) ->writePillarAxis($block->getAxis()); }); $this->mapSlab(Blocks::PURPUR_SLAB(), Ids::PURPUR_SLAB, Ids::PURPUR_DOUBLE_SLAB); @@ -1617,15 +1612,15 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::RED_MUSHROOM_BLOCK(), fn(RedMushroomBlock $block) => Helper::encodeMushroomBlock($block, new Writer(Ids::RED_MUSHROOM_BLOCK))); $this->mapSlab(Blocks::RED_NETHER_BRICK_SLAB(), Ids::RED_NETHER_BRICK_SLAB, Ids::RED_NETHER_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::RED_NETHER_BRICK_STAIRS(), Ids::RED_NETHER_BRICK_STAIRS); - $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK)); + $this->map(Blocks::RED_NETHER_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::RED_NETHER_BRICK_WALL))); $this->mapSlab(Blocks::RED_SANDSTONE_SLAB(), Ids::RED_SANDSTONE_SLAB, Ids::RED_SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::RED_SANDSTONE_STAIRS(), Ids::RED_SANDSTONE_STAIRS); - $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE)); - $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, false, Writer::create(Ids::COLORED_TORCH_RG))); + $this->map(Blocks::RED_SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::RED_SANDSTONE_WALL))); + $this->map(Blocks::RED_TORCH(), fn(Torch $block) => Helper::encodeTorch($block, Writer::create(Ids::COLORED_TORCH_RED))); $this->map(Blocks::ROSE_BUSH(), fn(DoublePlant $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::ROSE_BUSH))); $this->mapSlab(Blocks::SANDSTONE_SLAB(), Ids::SANDSTONE_SLAB, Ids::SANDSTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::SANDSTONE_STAIRS(), Ids::SANDSTONE_STAIRS); - $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_SANDSTONE)); + $this->map(Blocks::SANDSTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::SANDSTONE_WALL))); $this->map(Blocks::SEA_PICKLE(), function(SeaPickle $block) : Writer{ return Writer::create(Ids::SEA_PICKLE) ->writeBool(StateNames::DEAD_BIT, !$block->isUnderwater()) @@ -1662,15 +1657,12 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SOUL_TORCH) ->writeTorchFacing($block->getFacing()); }); - $this->map(Blocks::SPONGE(), function(Sponge $block) : Writer{ - return Writer::create(Ids::SPONGE) - ->writeString(StateNames::SPONGE_TYPE, $block->isWet() ? StringValues::SPONGE_TYPE_WET : StringValues::SPONGE_TYPE_DRY); - }); + $this->map(Blocks::SPONGE(), fn(Sponge $block) => Writer::create($block->isWet() ? Ids::WET_SPONGE : Ids::SPONGE)); $this->map(Blocks::STONECUTTER(), fn(Stonecutter $block) => Writer::create(Ids::STONECUTTER_BLOCK) ->writeCardinalHorizontalFacing($block->getFacing())); $this->mapSlab(Blocks::STONE_BRICK_SLAB(), Ids::STONE_BRICK_SLAB, Ids::STONE_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::STONE_BRICK_STAIRS(), Ids::STONE_BRICK_STAIRS); - $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_STONE_BRICK)); + $this->map(Blocks::STONE_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::STONE_BRICK_WALL))); $this->map(Blocks::STONE_BUTTON(), fn(StoneButton $block) => Helper::encodeButton($block, new Writer(Ids::STONE_BUTTON))); $this->map(Blocks::STONE_PRESSURE_PLATE(), fn(StonePressurePlate $block) => Helper::encodeSimplePressurePlate($block, new Writer(Ids::STONE_PRESSURE_PLATE))); $this->mapSlab(Blocks::STONE_SLAB(), Ids::NORMAL_STONE_SLAB, Ids::NORMAL_STONE_DOUBLE_SLAB); @@ -1684,11 +1676,9 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::SWEET_BERRY_BUSH) ->writeInt(StateNames::GROWTH, $block->getAge()); }); - $this->map(Blocks::TNT(), function(TNT $block) : Writer{ - return Writer::create(Ids::TNT) - ->writeBool(StateNames::ALLOW_UNDERWATER_BIT, $block->worksUnderwater()) - ->writeBool(StateNames::EXPLODE_BIT, $block->isUnstable()); - }); + $this->map(Blocks::TNT(), fn(TNT $block) => Writer::create($block->worksUnderwater() ? Ids::UNDERWATER_TNT : Ids::TNT) + ->writeBool(StateNames::EXPLODE_BIT, $block->isUnstable()) + ); $this->map(Blocks::TORCH(), function(Torch $block) : Writer{ return Writer::create(Ids::TORCH) ->writeTorchFacing($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 0c8df24f2c..47c0fd4afa 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -52,7 +52,6 @@ use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; -use pocketmine\block\WallCoralFan; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; use pocketmine\block\Wood; @@ -60,7 +59,6 @@ use pocketmine\data\bedrock\block\BlockLegacyMetadata; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateNames; use pocketmine\data\bedrock\block\BlockStateNames as StateNames; -use pocketmine\data\bedrock\block\BlockStateStringValues as StringValues; use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -288,13 +286,6 @@ final class BlockStateDeserializerHelper{ return $block; } - /** @throws BlockStateDeserializeException */ - public static function decodeWallCoralFan(WallCoralFan $block, BlockStateReader $in) : WallCoralFan{ - return $block - ->setDead($in->readBool(BlockStateNames::DEAD_BIT)) - ->setFacing($in->readCoralFacing()); - } - /** @throws BlockStateDeserializeException */ public static function decodeWallSign(WallSign $block, BlockStateReader $in) : WallSign{ return $block @@ -305,25 +296,4 @@ final class BlockStateDeserializerHelper{ return $block ->setOutputSignalStrength($in->readBoundedInt(BlockStateNames::REDSTONE_SIGNAL, 0, 15)); } - - /** @throws BlockStateDeserializeException */ - public static function mapLegacyWallType(BlockStateReader $in) : Wall{ - return self::decodeWall(match($type = $in->readString(BlockStateNames::WALL_BLOCK_TYPE)){ - StringValues::WALL_BLOCK_TYPE_ANDESITE => VanillaBlocks::ANDESITE_WALL(), - StringValues::WALL_BLOCK_TYPE_BRICK => VanillaBlocks::BRICK_WALL(), - StringValues::WALL_BLOCK_TYPE_COBBLESTONE => VanillaBlocks::COBBLESTONE_WALL(), - StringValues::WALL_BLOCK_TYPE_DIORITE => VanillaBlocks::DIORITE_WALL(), - StringValues::WALL_BLOCK_TYPE_END_BRICK => VanillaBlocks::END_STONE_BRICK_WALL(), - StringValues::WALL_BLOCK_TYPE_GRANITE => VanillaBlocks::GRANITE_WALL(), - StringValues::WALL_BLOCK_TYPE_MOSSY_COBBLESTONE => VanillaBlocks::MOSSY_COBBLESTONE_WALL(), - StringValues::WALL_BLOCK_TYPE_MOSSY_STONE_BRICK => VanillaBlocks::MOSSY_STONE_BRICK_WALL(), - StringValues::WALL_BLOCK_TYPE_NETHER_BRICK => VanillaBlocks::NETHER_BRICK_WALL(), - StringValues::WALL_BLOCK_TYPE_PRISMARINE => VanillaBlocks::PRISMARINE_WALL(), - StringValues::WALL_BLOCK_TYPE_RED_NETHER_BRICK => VanillaBlocks::RED_NETHER_BRICK_WALL(), - StringValues::WALL_BLOCK_TYPE_RED_SANDSTONE => VanillaBlocks::RED_SANDSTONE_WALL(), - StringValues::WALL_BLOCK_TYPE_SANDSTONE => VanillaBlocks::SANDSTONE_WALL(), - StringValues::WALL_BLOCK_TYPE_STONE_BRICK => VanillaBlocks::STONE_BRICK_WALL(), - default => throw $in->badValueException(BlockStateNames::WALL_BLOCK_TYPE, $type), - }, $in); - } } diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 9dfb17ca0c..3e22157461 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -68,9 +68,8 @@ final class BlockStateSerializerHelper{ ->writeInt(StateNames::CANDLES, $block->getCount() - 1); } - public static function encodeChemistryTable(ChemistryTable $block, string $chemistryTableType, Writer $out) : Writer{ + public static function encodeChemistryTable(ChemistryTable $block, Writer $out) : Writer{ return $out - ->writeString(BlockStateNames::CHEMISTRY_TABLE_TYPE, $chemistryTableType) ->writeLegacyHorizontalFacing(Facing::opposite($block->getFacing())); } @@ -78,9 +77,8 @@ final class BlockStateSerializerHelper{ return $out->writeInt(BlockStateNames::GROWTH, $block->getAge()); } - public static function encodeColoredTorch(Torch $block, bool $highBit, Writer $out) : Writer{ + public static function encodeTorch(Torch $block, Writer $out) : Writer{ return $out - ->writeBool(BlockStateNames::COLOR_BIT, $highBit) ->writeTorchFacing($block->getFacing()); } @@ -225,11 +223,6 @@ final class BlockStateSerializerHelper{ ->writeWallConnectionType(BlockStateNames::WALL_CONNECTION_TYPE_WEST, $block->getConnection(Facing::WEST)); } - public static function encodeLegacyWall(Wall $block, string $type) : Writer{ - return self::encodeWall($block, Writer::create(Ids::COBBLESTONE_WALL)) - ->writeString(BlockStateNames::WALL_BLOCK_TYPE, $type); - } - public static function encodeWallSign(WallSign $block, Writer $out) : Writer{ return $out ->writeHorizontalFacing($block->getFacing()); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index b85951d318..eb0cb8d506 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -960,6 +960,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND()); $this->mapSimple(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL()); $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM()); + $this->mapSimple(Ids::SPONGE, fn() => Blocks::SPONGE()); $this->mapSimple(Ids::STONE, fn() => Blocks::STONE()); $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER()); $this->mapSimple(Ids::STONE_BRICKS, fn() => Blocks::STONE_BRICKS()); @@ -971,6 +972,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::WARPED_ROOTS, fn() => Blocks::WARPED_ROOTS()); $this->mapSimple(Ids::WATERLILY, fn() => Blocks::LILY_PAD()); $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB()); + $this->mapSimple(Ids::WET_SPONGE, fn() => Blocks::SPONGE()->setWet(true)); $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE()); $this->mapSimple(Ids::DANDELION, fn() => Blocks::DANDELION()); @@ -1000,6 +1002,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::ANDESITE_SLAB, Ids::ANDESITE_DOUBLE_SLAB, fn() => Blocks::ANDESITE_SLAB()); $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS()); + $this->map(Ids::ANDESITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::ANDESITE_WALL(), $in)); $this->map(Ids::ANVIL, function(Reader $in) : Block{ return Blocks::ANVIL() ->setDamage(Anvil::UNDAMAGED) @@ -1095,6 +1098,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB, fn() => Blocks::BRICK_SLAB()); $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); + $this->map(Ids::BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BRICK_WALL(), $in)); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); $this->map(Ids::CACTUS, function(Reader $in) : Block{ return Blocks::CACTUS() @@ -1147,15 +1151,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CHISELED_QUARTZ() ->setAxis($in->readPillarAxis()); }); - $this->map(Ids::CHEMISTRY_TABLE, function(Reader $in) : Block{ - return (match($type = $in->readString(StateNames::CHEMISTRY_TABLE_TYPE)){ - StringValues::CHEMISTRY_TABLE_TYPE_COMPOUND_CREATOR => Blocks::COMPOUND_CREATOR(), - StringValues::CHEMISTRY_TABLE_TYPE_ELEMENT_CONSTRUCTOR => Blocks::ELEMENT_CONSTRUCTOR(), - StringValues::CHEMISTRY_TABLE_TYPE_LAB_TABLE => Blocks::LAB_TABLE(), - StringValues::CHEMISTRY_TABLE_TYPE_MATERIAL_REDUCER => Blocks::MATERIAL_REDUCER(), - default => throw $in->badValueException(StateNames::CHEMISTRY_TABLE_TYPE, $type), - })->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); - }); $this->map(Ids::CHEST, function(Reader $in) : Block{ return Blocks::CHEST() ->setFacing($in->readCardinalHorizontalFacing()); @@ -1169,22 +1164,19 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS()); $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in)); $this->mapSlab(Ids::COBBLESTONE_SLAB, Ids::COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::COBBLESTONE_SLAB()); - $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::mapLegacyWallType($in)); + $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLESTONE_WALL(), $in)); $this->map(Ids::COCOA, function(Reader $in) : Block{ return Blocks::COCOA_POD() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 2)) ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())); }); - $this->map(Ids::COLORED_TORCH_BP, function(Reader $in) : Block{ - return $in->readBool(StateNames::COLOR_BIT) ? - Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()) : - Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing()); - }); - $this->map(Ids::COLORED_TORCH_RG, function(Reader $in) : Block{ - return $in->readBool(StateNames::COLOR_BIT) ? - Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()) : - Blocks::RED_TORCH()->setFacing($in->readTorchFacing()); - }); + $this->map(Ids::COLORED_TORCH_BLUE, fn(Reader $in) => Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing())); + $this->map(Ids::COLORED_TORCH_GREEN, fn(Reader $in) => Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing())); + $this->map(Ids::COLORED_TORCH_PURPLE, fn(Reader $in) => Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing())); + $this->map(Ids::COLORED_TORCH_RED, fn(Reader $in) => Blocks::RED_TORCH()->setFacing($in->readTorchFacing())); + $this->map(Ids::COMPOUND_CREATOR, fn(Reader $in) => Blocks::COMPOUND_CREATOR() + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())) + ); $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE)); $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); @@ -1215,6 +1207,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB, fn() => Blocks::DIORITE_SLAB()); $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS()); + $this->map(Ids::DIORITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DIORITE_WALL(), $in)); $this->map(Ids::DIRT, fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL)); $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED)); $this->map(Ids::LARGE_FERN, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LARGE_FERN(), $in)); @@ -1223,7 +1216,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::ROSE_BUSH, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::ROSE_BUSH(), $in)); $this->map(Ids::SUNFLOWER, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::SUNFLOWER(), $in)); $this->map(Ids::LILAC, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LILAC(), $in)); + $this->map(Ids::ELEMENT_CONSTRUCTOR, fn(Reader $in) => Blocks::ELEMENT_CONSTRUCTOR() + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())) + ); $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS()); + $this->map(Ids::END_STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::END_STONE_BRICK_WALL(), $in)); $this->map(Ids::END_PORTAL_FRAME, function(Reader $in) : Block{ return Blocks::END_PORTAL_FRAME() ->setEye($in->readBool(StateNames::END_PORTAL_EYE_BIT)) @@ -1275,6 +1272,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::GRANITE_SLAB, Ids::GRANITE_DOUBLE_SLAB, fn() => Blocks::GRANITE_SLAB()); $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS()); + $this->map(Ids::GRANITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::GRANITE_WALL(), $in)); $this->map(Ids::HAY_BLOCK, function(Reader $in) : Block{ $in->ignored(StateNames::DEPRECATED); return Blocks::HAY_BALE()->setAxis($in->readPillarAxis()); @@ -1287,6 +1285,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::IRON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::IRON_DOOR(), $in)); $this->map(Ids::IRON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::IRON_TRAPDOOR(), $in)); + $this->map(Ids::LAB_TABLE, fn(Reader $in) => Blocks::LAB_TABLE() + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())) + ); $this->map(Ids::LADDER, function(Reader $in) : Block{ return Blocks::LADDER() ->setFacing($in->readHorizontalFacing()); @@ -1358,6 +1359,9 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::LOOM() ->setFacing($in->readLegacyHorizontalFacing()); }); + $this->map(Ids::MATERIAL_REDUCER, fn(Reader $in) => Blocks::MATERIAL_REDUCER() + ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())) + ); $this->map(Ids::MEDIUM_AMETHYST_BUD, function(Reader $in) : Block{ return Blocks::AMETHYST_CLUSTER() ->setStage(AmethystCluster::STAGE_MEDIUM_BUD) @@ -1366,8 +1370,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in)); $this->mapSlab(Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::MOSSY_COBBLESTONE_SLAB()); $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS()); + $this->map(Ids::MOSSY_COBBLESTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MOSSY_COBBLESTONE_WALL(), $in)); $this->mapSlab(Ids::MOSSY_STONE_BRICK_SLAB, Ids::MOSSY_STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::MOSSY_STONE_BRICK_SLAB()); $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS()); + $this->map(Ids::MOSSY_STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MOSSY_STONE_BRICK_WALL(), $in)); $this->mapSlab(Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB, fn() => Blocks::MUD_BRICK_SLAB()); $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS()); $this->map(Ids::MUD_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MUD_BRICK_WALL(), $in)); @@ -1377,6 +1383,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::NETHER_BRICK_SLAB()); $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS()); + $this->map(Ids::NETHER_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::NETHER_BRICK_WALL(), $in)); $this->map(Ids::NETHER_WART, function(Reader $in) : Block{ return Blocks::NETHER_WART() ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3)); @@ -1449,6 +1456,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setPowered(true)); $this->mapSlab(Ids::PRISMARINE_BRICK_SLAB, Ids::PRISMARINE_BRICK_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_BRICKS_SLAB()); $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS()); + $this->map(Ids::PRISMARINE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::PRISMARINE_WALL(), $in)); $this->mapSlab(Ids::PRISMARINE_SLAB, Ids::PRISMARINE_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_SLAB()); $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS()); $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ @@ -1457,19 +1465,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); $this->map(Ids::PURPUR_BLOCK, function(Reader $in) : Block{ - $type = $in->readString(StateNames::CHISEL_TYPE); - if($type === StringValues::CHISEL_TYPE_LINES){ - return Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()); - }else{ - $in->ignored(StateNames::PILLAR_AXIS); //axis only applies to pillars - return match($type){ - StringValues::CHISEL_TYPE_CHISELED, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_SMOOTH, //TODO: bug in MCPE - StringValues::CHISEL_TYPE_DEFAULT => Blocks::PURPUR(), - default => throw $in->badValueException(StateNames::CHISEL_TYPE, $type), - }; - } + $in->ignored(StateNames::PILLAR_AXIS); //??? + return Blocks::PURPUR(); }); + $this->map(Ids::PURPUR_PILLAR, fn(Reader $in) => Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis())); $this->mapSlab(Ids::PURPUR_SLAB, Ids::PURPUR_DOUBLE_SLAB, fn() => Blocks::PURPUR_SLAB()); $this->mapStairs(Ids::PURPUR_STAIRS, fn() => Blocks::PURPUR_STAIRS()); $this->map(Ids::QUARTZ_BLOCK, function(Reader $in) : Opaque{ @@ -1489,8 +1488,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in)); $this->mapSlab(Ids::RED_NETHER_BRICK_SLAB, Ids::RED_NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::RED_NETHER_BRICK_SLAB()); $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS()); + $this->map(Ids::RED_NETHER_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::RED_NETHER_BRICK_WALL(), $in)); $this->mapSlab(Ids::RED_SANDSTONE_SLAB, Ids::RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::RED_SANDSTONE_SLAB()); $this->mapStairs(Ids::RED_SANDSTONE_STAIRS, fn() => Blocks::RED_SANDSTONE_STAIRS()); + $this->map(Ids::RED_SANDSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::RED_SANDSTONE_WALL(), $in)); $this->map(Ids::REDSTONE_LAMP, function() : Block{ return Blocks::REDSTONE_LAMP() ->setPowered(false); @@ -1514,6 +1515,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->mapSlab(Ids::SANDSTONE_SLAB, Ids::SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SANDSTONE_SLAB()); $this->mapStairs(Ids::SANDSTONE_STAIRS, fn() => Blocks::SANDSTONE_STAIRS()); + $this->map(Ids::SANDSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::SANDSTONE_WALL(), $in)); $this->map(Ids::SEA_PICKLE, function(Reader $in) : Block{ return Blocks::SEA_PICKLE() ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) @@ -1565,19 +1567,13 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::SOUL_TORCH() ->setFacing($in->readTorchFacing()); }); - $this->map(Ids::SPONGE, function(Reader $in) : Block{ - return Blocks::SPONGE()->setWet(match($type = $in->readString(StateNames::SPONGE_TYPE)){ - StringValues::SPONGE_TYPE_DRY => false, - StringValues::SPONGE_TYPE_WET => true, - default => throw $in->badValueException(StateNames::SPONGE_TYPE, $type), - }); - }); $this->map(Ids::STANDING_BANNER, function(Reader $in) : Block{ return Blocks::BANNER() ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15)); }); $this->mapSlab(Ids::STONE_BRICK_SLAB, Ids::STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::STONE_BRICK_SLAB()); $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS()); + $this->map(Ids::STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::STONE_BRICK_WALL(), $in)); $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in)); $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in)); $this->mapStairs(Ids::STONE_STAIRS, fn() => Blocks::COBBLESTONE_STAIRS()); @@ -1594,7 +1590,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::TNT, function(Reader $in) : Block{ return Blocks::TNT() ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) - ->setWorksUnderwater($in->readBool(StateNames::ALLOW_UNDERWATER_BIT)); + ->setWorksUnderwater(false); }); $this->map(Ids::TORCH, function(Reader $in) : Block{ return Blocks::TORCH() @@ -1626,6 +1622,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::TWISTING_VINES() ->setAge($in->readBoundedInt(StateNames::TWISTING_VINES_AGE, 0, 25)); }); + $this->map(Ids::UNDERWATER_TNT, function(Reader $in) : Block{ + return Blocks::TNT() + ->setUnstable($in->readBool(StateNames::EXPLODE_BIT)) + ->setWorksUnderwater(true); + }); $this->map(Ids::UNDERWATER_TORCH, function(Reader $in) : Block{ return Blocks::UNDERWATER_TORCH() ->setFacing($in->readTorchFacing()); diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index db6594c43d..06ae28cec0 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -109,6 +109,7 @@ final class ItemTypeNames{ public const CHAINMAIL_HELMET = "minecraft:chainmail_helmet"; public const CHAINMAIL_LEGGINGS = "minecraft:chainmail_leggings"; public const CHARCOAL = "minecraft:charcoal"; + public const CHEMISTRY_TABLE = "minecraft:chemistry_table"; public const CHERRY_BOAT = "minecraft:cherry_boat"; public const CHERRY_CHEST_BOAT = "minecraft:cherry_chest_boat"; public const CHERRY_DOOR = "minecraft:cherry_door"; @@ -127,6 +128,8 @@ final class ItemTypeNames{ public const COD = "minecraft:cod"; public const COD_BUCKET = "minecraft:cod_bucket"; public const COD_SPAWN_EGG = "minecraft:cod_spawn_egg"; + public const COLORED_TORCH_BP = "minecraft:colored_torch_bp"; + public const COLORED_TORCH_RG = "minecraft:colored_torch_rg"; public const COMMAND_BLOCK_MINECART = "minecraft:command_block_minecart"; public const COMPARATOR = "minecraft:comparator"; public const COMPASS = "minecraft:compass"; diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 16898283a9..99af737072 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -54,6 +54,7 @@ use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\Enchant; use pocketmine\network\mcpe\protocol\types\EnchantOption as ProtocolEnchantOption; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; +use pocketmine\network\mcpe\protocol\types\inventory\FullContainerName; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction; @@ -500,16 +501,18 @@ class InventoryManager{ $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $netSlot, - new ItemStackWrapper(0, ItemStack::null()), - 0 + new FullContainerName($this->lastInventoryNetworkId), + 0, + new ItemStackWrapper(0, ItemStack::null()) )); } //now send the real contents $this->session->sendDataPacket(InventorySlotPacket::create( $windowId, $netSlot, - $itemStackWrapper, - 0 + new FullContainerName($this->lastInventoryNetworkId), + 0, + $itemStackWrapper )); } @@ -528,10 +531,11 @@ class InventoryManager{ $this->session->sendDataPacket(InventoryContentPacket::create( $windowId, array_fill_keys(array_keys($itemStackWrappers), new ItemStackWrapper(0, ItemStack::null())), + new FullContainerName($this->lastInventoryNetworkId), 0 )); //now send the real contents - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers, 0)); + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers, new FullContainerName($this->lastInventoryNetworkId), 0)); } public function syncSlot(Inventory $inventory, int $slot, ItemStack $itemStack) : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 33a9303a30..2dce5bbb8b 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -787,7 +787,7 @@ class NetworkSession{ public function transfer(string $ip, int $port, Translatable|string|null $reason = null) : void{ $reason ??= KnownTranslationFactory::pocketmine_disconnect_transfer(); $this->tryDisconnect(function() use ($ip, $port, $reason) : void{ - $this->sendDataPacket(TransferPacket::create($ip, $port), true); + $this->sendDataPacket(TransferPacket::create($ip, $port, false), true); if($this->player !== null){ $this->player->onPostDisconnect($reason, null); } diff --git a/src/network/mcpe/StandardEntityEventBroadcaster.php b/src/network/mcpe/StandardEntityEventBroadcaster.php index e2a707a3db..3e2df39948 100644 --- a/src/network/mcpe/StandardEntityEventBroadcaster.php +++ b/src/network/mcpe/StandardEntityEventBroadcaster.php @@ -38,8 +38,8 @@ use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\RemoveActorPacket; use pocketmine\network\mcpe\protocol\SetActorDataPacket; use pocketmine\network\mcpe\protocol\TakeItemActorPacket; -use pocketmine\network\mcpe\protocol\types\entity\Attribute as NetworkAttribute; use pocketmine\network\mcpe\protocol\types\entity\PropertySyncData; +use pocketmine\network\mcpe\protocol\types\entity\UpdateAttribute; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper; @@ -67,7 +67,7 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ if(count($attributes) > 0){ $this->sendDataPacket($recipients, UpdateAttributesPacket::create( $entity->getId(), - array_map(fn(Attribute $attr) => new NetworkAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getDefaultValue(), []), $attributes), + array_map(fn(Attribute $attr) => new UpdateAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getDefaultValue(), []), $attributes), 0 )); } @@ -142,6 +142,13 @@ final class StandardEntityEventBroadcaster implements EntityEventBroadcaster{ } public function onEmote(array $recipients, Human $from, string $emoteId) : void{ - $this->sendDataPacket($recipients, EmotePacket::create($from->getId(), $emoteId, "", "", EmotePacket::FLAG_SERVER | EmotePacket::FLAG_MUTE_ANNOUNCEMENT)); + $this->sendDataPacket($recipients, EmotePacket::create( + $from->getId(), + $emoteId, + 0, //seems to be irrelevant for the client, we cannot risk rebroadcasting random values received + "", + "", + EmotePacket::FLAG_SERVER | EmotePacket::FLAG_MUTE_ANNOUNCEMENT + )); } } diff --git a/src/network/mcpe/handler/ItemStackResponseBuilder.php b/src/network/mcpe/handler/ItemStackResponseBuilder.php index a947eae726..1369e3ba72 100644 --- a/src/network/mcpe/handler/ItemStackResponseBuilder.php +++ b/src/network/mcpe/handler/ItemStackResponseBuilder.php @@ -100,7 +100,7 @@ final class ItemStackResponseBuilder{ $responseContainerInfos = []; foreach($responseInfosByContainer as $containerInterfaceId => $responseInfos){ - $responseContainerInfos[] = new ItemStackResponseContainerInfo(new FullContainerName($containerInterfaceId, 0), $responseInfos); + $responseContainerInfos[] = new ItemStackResponseContainerInfo(new FullContainerName($containerInterfaceId), $responseInfos); } return new ItemStackResponse(ItemStackResponse::RESULT_OK, $this->requestId, $responseContainerInfos); diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index b99775886c..5f7fb0e4b9 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -115,11 +115,9 @@ class ResourcePacksPacketHandler extends PacketHandler{ //TODO: support forcing server packs $this->session->sendDataPacket(ResourcePacksInfoPacket::create( resourcePackEntries: $resourcePackEntries, - behaviorPackEntries: [], mustAccept: $this->mustAccept, hasAddons: false, hasScripts: false, - forceServerPacks: false, cdnUrls: [] )); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 709dadf974..1612e7d846 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 712; + public const CURRENT_STORAGE_NETWORK_VERSION = 729; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 21, //minor - 20, //patch - 0, //revision + 30, //patch + 3, //revision 0 //is beta ]; From 49c2f13cf01c045eaba55553f1907cd30ba4e550 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Fri, 20 Sep 2024 18:59:45 -0500 Subject: [PATCH 1776/1858] Release 5.19.0 --- changelogs/5.19.md | 16 ++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.19.md diff --git a/changelogs/5.19.md b/changelogs/5.19.md new file mode 100644 index 0000000000..57d322bf79 --- /dev/null +++ b/changelogs/5.19.md @@ -0,0 +1,16 @@ +# 5.19.0 +Released 21tst September 2024. + +**For Minecraft: Bedrock Edition 1.21.30** + +This is a support release for Minecraft: Bedrock Edition 1.21.30. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.21.30. +- Removed support for earlier versions. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 571dd96389..d482046dac 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.18.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.19.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From a5babb2c9f897be1d3d60fe36ad79b5c001b6734 Mon Sep 17 00:00:00 2001 From: IvanCraft623 Date: Fri, 20 Sep 2024 19:00:23 -0500 Subject: [PATCH 1777/1858] 5.19.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index d482046dac..b2d2fe4abe 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.19.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.19.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 4e6b34f57377e7e92892ed88d5ed3744642fcb1f Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:25:10 -0500 Subject: [PATCH 1778/1858] Implement new 1.21 copper blocks (#6366) Added the following new blocks: - All types of Copper Bulb - All types of Copper Door - All types of Copper Trapdoor - All types of Chiseled Copper - All types of Copper Grate --- src/block/BlockTypeIds.php | 7 +- src/block/CopperBulb.php | 69 +++++++++++++ src/block/CopperDoor.php | 53 ++++++++++ src/block/CopperGrate.php | 33 +++++++ src/block/CopperTrapdoor.php | 44 +++++++++ src/block/VanillaBlocks.php | 12 +++ .../convert/BlockObjectToStateSerializer.php | 99 +++++++++++++++++++ .../BlockStateToObjectDeserializer.php | 72 ++++++++++++++ .../ItemSerializerDeserializerRegistrar.php | 28 ++++++ src/item/StringToItemParser.php | 5 + tests/phpstan/configs/phpstan-bugs.neon | 10 ++ .../block_factory_consistency_check.json | 5 + 12 files changed, 436 insertions(+), 1 deletion(-) create mode 100644 src/block/CopperBulb.php create mode 100644 src/block/CopperDoor.php create mode 100644 src/block/CopperGrate.php create mode 100644 src/block/CopperTrapdoor.php diff --git a/src/block/BlockTypeIds.php b/src/block/BlockTypeIds.php index 29f4e650d4..3914a4b74a 100644 --- a/src/block/BlockTypeIds.php +++ b/src/block/BlockTypeIds.php @@ -760,8 +760,13 @@ final class BlockTypeIds{ public const POLISHED_TUFF_SLAB = 10730; public const POLISHED_TUFF_STAIRS = 10731; public const POLISHED_TUFF_WALL = 10732; + public const COPPER_BULB = 10733; + public const COPPER_DOOR = 10734; + public const COPPER_TRAPDOOR = 10735; + public const CHISELED_COPPER = 10736; + public const COPPER_GRATE = 10737; - public const FIRST_UNUSED_BLOCK_ID = 10733; + public const FIRST_UNUSED_BLOCK_ID = 10738; private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID; diff --git a/src/block/CopperBulb.php b/src/block/CopperBulb.php new file mode 100644 index 0000000000..223c63527f --- /dev/null +++ b/src/block/CopperBulb.php @@ -0,0 +1,69 @@ +encodeLitState($w); + $w->bool($this->powered); + } + + /** @return $this */ + public function togglePowered(bool $powered) : self{ + if($powered === $this->powered){ + return $this; + } + if ($powered) { + $this->setLit(!$this->lit); + } + $this->setPowered($powered); + return $this; + } + + public function getLightLevel() : int{ + if ($this->lit) { + return match($this->oxidation){ + CopperOxidation::NONE => 15, + CopperOxidation::EXPOSED => 12, + CopperOxidation::WEATHERED => 8, + CopperOxidation::OXIDIZED => 4, + }; + } + + return 0; + } +} diff --git a/src/block/CopperDoor.php b/src/block/CopperDoor.php new file mode 100644 index 0000000000..d53be2323c --- /dev/null +++ b/src/block/CopperDoor.php @@ -0,0 +1,53 @@ +isSneaking() && $this->onInteractCopper($item, $face, $clickVector, $player, $returnedItems)) { + //copy copper properties to other half + $other = $this->getSide($this->top ? Facing::DOWN : Facing::UP); + $world = $this->position->getWorld(); + if ($other instanceof CopperDoor) { + $other->setOxidation($this->oxidation); + $other->setWaxed($this->waxed); + $world->setBlock($other->position, $other); + } + return true; + } + + return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); + } +} diff --git a/src/block/CopperGrate.php b/src/block/CopperGrate.php new file mode 100644 index 0000000000..fb59d846e8 --- /dev/null +++ b/src/block/CopperGrate.php @@ -0,0 +1,33 @@ +isSneaking() && $this->onInteractCopper($item, $face, $clickVector, $player, $returnedItems)) { + return true; + } + + return parent::onInteract($item, $face, $clickVector, $player, $returnedItems); + } +} diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 13c7e869ac..60540dfb83 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -181,6 +181,7 @@ use function strtolower; * @method static Wood CHERRY_WOOD() * @method static Chest CHEST() * @method static ChiseledBookshelf CHISELED_BOOKSHELF() + * @method static Copper CHISELED_COPPER() * @method static Opaque CHISELED_DEEPSLATE() * @method static Opaque CHISELED_NETHER_BRICKS() * @method static Opaque CHISELED_POLISHED_BLACKSTONE() @@ -209,7 +210,11 @@ use function strtolower; * @method static Concrete CONCRETE() * @method static ConcretePowder CONCRETE_POWDER() * @method static Copper COPPER() + * @method static CopperBulb COPPER_BULB() + * @method static CopperDoor COPPER_DOOR() + * @method static CopperGrate COPPER_GRATE() * @method static CopperOre COPPER_ORE() + * @method static CopperTrapdoor COPPER_TRAPDOOR() * @method static Coral CORAL() * @method static CoralBlock CORAL_BLOCK() * @method static FloorCoralFan CORAL_FAN() @@ -1642,9 +1647,16 @@ final class VanillaBlocks{ self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); + self::register("chiseled_copper", new Copper(new BID(Ids::CHISELED_COPPER), "Chiseled Copper", $copperBreakInfo)); + self::register("copper_grate", new CopperGrate(new BID(Ids::COPPER_GRATE), "Copper Grate", $copperBreakInfo)); self::register("cut_copper", new Copper(new BID(Ids::CUT_COPPER), "Cut Copper Block", $copperBreakInfo)); self::register("cut_copper_slab", new CopperSlab(new BID(Ids::CUT_COPPER_SLAB), "Cut Copper Slab", $copperBreakInfo)); self::register("cut_copper_stairs", new CopperStairs(new BID(Ids::CUT_COPPER_STAIRS), "Cut Copper Stairs", $copperBreakInfo)); + self::register("copper_bulb", new CopperBulb(new BID(Ids::COPPER_BULB), "Copper Bulb", $copperBreakInfo)); + + $copperDoorBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE, 30.0)); + self::register("copper_door", new CopperDoor(new BID(Ids::COPPER_DOOR), "Copper Door", $copperDoorBreakInfo)); + self::register("copper_trapdoor", new CopperTrapdoor(new BID(Ids::COPPER_TRAPDOOR), "Copper Trapdoor", $copperDoorBreakInfo)); $candleBreakInfo = new Info(new BreakInfo(0.1)); self::register("candle", new Candle(new BID(Ids::CANDLE), "Candle", $candleBreakInfo)); diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 0768d21c37..f85e845516 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -58,8 +58,12 @@ use pocketmine\block\CocoaBlock; use pocketmine\block\Concrete; use pocketmine\block\ConcretePowder; use pocketmine\block\Copper; +use pocketmine\block\CopperBulb; +use pocketmine\block\CopperDoor; +use pocketmine\block\CopperGrate; use pocketmine\block\CopperSlab; use pocketmine\block\CopperStairs; +use pocketmine\block\CopperTrapdoor; use pocketmine\block\Coral; use pocketmine\block\CoralBlock; use pocketmine\block\DaylightSensor; @@ -1255,6 +1259,40 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER) ); }); + $this->map(Blocks::CHISELED_COPPER(), function(Copper $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, + Ids::WAXED_CHISELED_COPPER, + Ids::WAXED_EXPOSED_CHISELED_COPPER, + Ids::WAXED_WEATHERED_CHISELED_COPPER, + Ids::WAXED_OXIDIZED_CHISELED_COPPER + ) : + Helper::selectCopperId($oxidation, + Ids::CHISELED_COPPER, + Ids::EXPOSED_CHISELED_COPPER, + Ids::WEATHERED_CHISELED_COPPER, + Ids::OXIDIZED_CHISELED_COPPER + ) + ); + }); + $this->map(Blocks::COPPER_GRATE(), function(CopperGrate $block) : Writer{ + $oxidation = $block->getOxidation(); + return new Writer($block->isWaxed() ? + Helper::selectCopperId($oxidation, + Ids::WAXED_COPPER_GRATE, + Ids::WAXED_EXPOSED_COPPER_GRATE, + Ids::WAXED_WEATHERED_COPPER_GRATE, + Ids::WAXED_OXIDIZED_COPPER_GRATE + ) : + Helper::selectCopperId($oxidation, + Ids::COPPER_GRATE, + Ids::EXPOSED_COPPER_GRATE, + Ids::WEATHERED_COPPER_GRATE, + Ids::OXIDIZED_COPPER_GRATE + ) + ); + }); $this->map(Blocks::CUT_COPPER(), function(Copper $block) : Writer{ $oxidation = $block->getOxidation(); return new Writer($block->isWaxed() ? @@ -1322,6 +1360,67 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ) ); }); + $this->map(Blocks::COPPER_BULB(), function(CopperBulb $block) : Writer{ + $oxidation = $block->getOxidation(); + return Writer::create($block->isWaxed() ? + Helper::selectCopperId($oxidation, + Ids::WAXED_COPPER_BULB, + Ids::WAXED_EXPOSED_COPPER_BULB, + Ids::WAXED_WEATHERED_COPPER_BULB, + Ids::WAXED_OXIDIZED_COPPER_BULB) : + Helper::selectCopperId($oxidation, + Ids::COPPER_BULB, + Ids::EXPOSED_COPPER_BULB, + Ids::WEATHERED_COPPER_BULB, + Ids::OXIDIZED_COPPER_BULB + )) + ->writeBool(StateNames::LIT, $block->isLit()) + ->writeBool(StateNames::POWERED_BIT, $block->isPowered()); + }); + $this->map(Blocks::COPPER_DOOR(), function(CopperDoor $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeDoor( + $block, + new Writer($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_COPPER_DOOR, + Ids::WAXED_EXPOSED_COPPER_DOOR, + Ids::WAXED_WEATHERED_COPPER_DOOR, + Ids::WAXED_OXIDIZED_COPPER_DOOR + ) : + Helper::selectCopperId( + $oxidation, + Ids::COPPER_DOOR, + Ids::EXPOSED_COPPER_DOOR, + Ids::WEATHERED_COPPER_DOOR, + Ids::OXIDIZED_COPPER_DOOR + ) + ) + ); + }); + $this->map(Blocks::COPPER_TRAPDOOR(), function(CopperTrapdoor $block) : Writer{ + $oxidation = $block->getOxidation(); + return Helper::encodeTrapdoor( + $block, + new Writer($block->isWaxed() ? + Helper::selectCopperId( + $oxidation, + Ids::WAXED_COPPER_TRAPDOOR, + Ids::WAXED_EXPOSED_COPPER_TRAPDOOR, + Ids::WAXED_WEATHERED_COPPER_TRAPDOOR, + Ids::WAXED_OXIDIZED_COPPER_TRAPDOOR + ) : + Helper::selectCopperId( + $oxidation, + Ids::COPPER_TRAPDOOR, + Ids::EXPOSED_COPPER_TRAPDOOR, + Ids::WEATHERED_COPPER_TRAPDOOR, + Ids::OXIDIZED_COPPER_TRAPDOOR + ) + ) + ); + }); $this->map(Blocks::COCOA_POD(), function(CocoaBlock $block) : Writer{ return Writer::create(Ids::COCOA) ->writeInt(StateNames::AGE, $block->getAge()) diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 49365799cc..19b5372a04 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -1156,6 +1156,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return $block; }); + $this->map(Ids::CHISELED_COPPER, fn() => Helper::decodeCopper(Blocks::CHISELED_COPPER(), CopperOxidation::NONE)); $this->map(Ids::CHISELED_QUARTZ_BLOCK, function(Reader $in) : Block{ return Blocks::CHISELED_QUARTZ() ->setAxis($in->readPillarAxis()); @@ -1187,6 +1188,14 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing())) ); $this->map(Ids::COPPER_BLOCK, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::NONE)); + $this->map(Ids::COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeCopper(Blocks::COPPER_BULB(), CopperOxidation::NONE) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeCopper(Blocks::COPPER_DOOR(), CopperOxidation::NONE), $in)); + $this->map(Ids::COPPER_GRATE, fn() => Helper::decodeCopper(Blocks::COPPER_GRATE(), CopperOxidation::NONE)); + $this->map(Ids::COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::NONE), $in)); $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); @@ -1245,9 +1254,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::EXPOSED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::EXPOSED_CHISELED_COPPER, fn() => Helper::decodeCopper(Blocks::CHISELED_COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::EXPOSED_COPPER_GRATE, fn() => Helper::decodeCopper(Blocks::COPPER_GRATE(), CopperOxidation::EXPOSED)); $this->map(Ids::EXPOSED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED)); $this->mapSlab(Ids::EXPOSED_CUT_COPPER_SLAB, Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED)); $this->mapStairs(Ids::EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED)); + $this->map(Ids::EXPOSED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeCopper(Blocks::COPPER_BULB(), CopperOxidation::EXPOSED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::EXPOSED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeCopper(Blocks::COPPER_DOOR(), CopperOxidation::EXPOSED), $in)); + $this->map(Ids::EXPOSED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::EXPOSED), $in)); $this->map(Ids::FARMLAND, function(Reader $in) : Block{ return Blocks::FARMLAND() ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7)); @@ -1401,9 +1419,18 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS()); $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE)->setAxis($in->readPillarAxis())); $this->map(Ids::OXIDIZED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::OXIDIZED_CHISELED_COPPER, fn() => Helper::decodeCopper(Blocks::CHISELED_COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::OXIDIZED_COPPER_GRATE, fn() => Helper::decodeCopper(Blocks::COPPER_GRATE(), CopperOxidation::OXIDIZED)); $this->map(Ids::OXIDIZED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED)); $this->mapSlab(Ids::OXIDIZED_CUT_COPPER_SLAB, Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED)); $this->mapStairs(Ids::OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED)); + $this->map(Ids::OXIDIZED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeCopper(Blocks::COPPER_BULB(), CopperOxidation::OXIDIZED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::OXIDIZED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeCopper(Blocks::COPPER_DOOR(), CopperOxidation::OXIDIZED), $in)); + $this->map(Ids::OXIDIZED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::OXIDIZED), $in)); $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT)->setAxis($in->readPillarAxis())); $this->mapSlab(Ids::PETRIFIED_OAK_SLAB, Ids::PETRIFIED_OAK_DOUBLE_SLAB, fn() => Blocks::FAKE_WOODEN_SLAB()); $this->map(Ids::PINK_PETALS, function(Reader $in) : Block{ @@ -1677,25 +1704,70 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in)); $this->map(Ids::WAXED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::NONE)); + $this->map(Ids::WAXED_CHISELED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CHISELED_COPPER(), CopperOxidation::NONE)); + $this->map(Ids::WAXED_COPPER_GRATE, fn() => Helper::decodeWaxedCopper(Blocks::COPPER_GRATE(), CopperOxidation::NONE)); $this->map(Ids::WAXED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE)); $this->mapSlab(Ids::WAXED_CUT_COPPER_SLAB, Ids::WAXED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE)); $this->mapStairs(Ids::WAXED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE)); + $this->map(Ids::WAXED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeWaxedCopper(Blocks::COPPER_BULB(), CopperOxidation::NONE) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::WAXED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeWaxedCopper(Blocks::COPPER_DOOR(), CopperOxidation::NONE), $in)); + $this->map(Ids::WAXED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeWaxedCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::NONE), $in)); $this->map(Ids::WAXED_EXPOSED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::WAXED_EXPOSED_CHISELED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CHISELED_COPPER(), CopperOxidation::EXPOSED)); + $this->map(Ids::WAXED_EXPOSED_COPPER_GRATE, fn() => Helper::decodeWaxedCopper(Blocks::COPPER_GRATE(), CopperOxidation::EXPOSED)); $this->map(Ids::WAXED_EXPOSED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::EXPOSED)); $this->mapSlab(Ids::WAXED_EXPOSED_CUT_COPPER_SLAB, Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::EXPOSED)); $this->mapStairs(Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::EXPOSED)); + $this->map(Ids::WAXED_EXPOSED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeWaxedCopper(Blocks::COPPER_BULB(), CopperOxidation::EXPOSED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::WAXED_EXPOSED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeWaxedCopper(Blocks::COPPER_DOOR(), CopperOxidation::EXPOSED), $in)); + $this->map(Ids::WAXED_EXPOSED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeWaxedCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::EXPOSED), $in)); $this->map(Ids::WAXED_OXIDIZED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::WAXED_OXIDIZED_CHISELED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CHISELED_COPPER(), CopperOxidation::OXIDIZED)); + $this->map(Ids::WAXED_OXIDIZED_COPPER_GRATE, fn() => Helper::decodeWaxedCopper(Blocks::COPPER_GRATE(), CopperOxidation::OXIDIZED)); $this->map(Ids::WAXED_OXIDIZED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::OXIDIZED)); $this->mapSlab(Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB, Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::OXIDIZED)); $this->mapStairs(Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::OXIDIZED)); + $this->map(Ids::WAXED_OXIDIZED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeWaxedCopper(Blocks::COPPER_BULB(), CopperOxidation::OXIDIZED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::WAXED_OXIDIZED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeWaxedCopper(Blocks::COPPER_DOOR(), CopperOxidation::OXIDIZED), $in)); + $this->map(Ids::WAXED_OXIDIZED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeWaxedCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::OXIDIZED), $in)); $this->map(Ids::WAXED_WEATHERED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WAXED_WEATHERED_CHISELED_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CHISELED_COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WAXED_WEATHERED_COPPER_GRATE, fn() => Helper::decodeWaxedCopper(Blocks::COPPER_GRATE(), CopperOxidation::WEATHERED)); $this->map(Ids::WAXED_WEATHERED_CUT_COPPER, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED)); $this->mapSlab(Ids::WAXED_WEATHERED_CUT_COPPER_SLAB, Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED)); $this->mapStairs(Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeWaxedCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED)); + $this->map(Ids::WAXED_WEATHERED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeWaxedCopper(Blocks::COPPER_BULB(), CopperOxidation::WEATHERED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::WAXED_WEATHERED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeWaxedCopper(Blocks::COPPER_DOOR(), CopperOxidation::WEATHERED), $in)); + $this->map(Ids::WAXED_WEATHERED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeWaxedCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::WEATHERED), $in)); $this->map(Ids::WEATHERED_COPPER, fn() => Helper::decodeCopper(Blocks::COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WEATHERED_CHISELED_COPPER, fn() => Helper::decodeCopper(Blocks::CHISELED_COPPER(), CopperOxidation::WEATHERED)); + $this->map(Ids::WEATHERED_COPPER_GRATE, fn() => Helper::decodeCopper(Blocks::COPPER_GRATE(), CopperOxidation::WEATHERED)); $this->map(Ids::WEATHERED_CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::WEATHERED)); $this->mapSlab(Ids::WEATHERED_CUT_COPPER_SLAB, Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::WEATHERED)); $this->mapStairs(Ids::WEATHERED_CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::WEATHERED)); + $this->map(Ids::WEATHERED_COPPER_BULB, function(Reader $in) : Block{ + return Helper::decodeCopper(Blocks::COPPER_BULB(), CopperOxidation::WEATHERED) + ->setLit($in->readBool(StateNames::LIT)) + ->setPowered($in->readBool(StateNames::POWERED_BIT)); + }); + $this->map(Ids::WEATHERED_COPPER_DOOR, fn(Reader $in) => Helper::decodeDoor(Helper::decodeCopper(Blocks::COPPER_DOOR(), CopperOxidation::WEATHERED), $in)); + $this->map(Ids::WEATHERED_COPPER_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Helper::decodeCopper(Blocks::COPPER_TRAPDOOR(), CopperOxidation::WEATHERED), $in)); $this->map(Ids::WEEPING_VINES, function(Reader $in) : Block{ return Blocks::WEEPING_VINES() ->setAge($in->readBoundedInt(StateNames::WEEPING_VINES_AGE, 0, 25)); diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index de9b5ae5e6..d06b416269 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -25,7 +25,9 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Bed; use pocketmine\block\Block; +use pocketmine\block\CopperDoor; use pocketmine\block\MobHead; +use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\CompoundTypeIds; @@ -56,6 +58,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->register1to1BlockWithMetaMappings(); $this->register1to1ItemWithMetaMappings(); $this->register1ToNItemMappings(); + $this->registerMiscBlockMappings(); $this->registerMiscItemMappings(); } @@ -538,4 +541,29 @@ final class ItemSerializerDeserializerRegistrar{ } $this->serializer?->map(Items::DYE(), fn(Dye $item) => new Data(DyeColorIdMap::getInstance()->toItemId($item->getColor()))); } + + /** + * Registers serializers and deserializers for PocketMine-MP blockitems that don't fit any other pattern. + * Ideally we want to get rid of this completely, if possible. + * + * Most of these are single PocketMine-MP blocks which map to multiple IDs depending on their properties, which is + * complex to implement in a generic way. + */ + private function registerMiscBlockMappings() : void{ + $copperDoorStateIdMap = []; + foreach ([ + [Ids::COPPER_DOOR, CopperOxidation::NONE, false], + [Ids::EXPOSED_COPPER_DOOR, CopperOxidation::EXPOSED, false], + [Ids::WEATHERED_COPPER_DOOR, CopperOxidation::WEATHERED, false], + [Ids::OXIDIZED_COPPER_DOOR, CopperOxidation::OXIDIZED, false], + [Ids::WAXED_COPPER_DOOR, CopperOxidation::NONE, true], + [Ids::WAXED_EXPOSED_COPPER_DOOR, CopperOxidation::EXPOSED, true], + [Ids::WAXED_WEATHERED_COPPER_DOOR, CopperOxidation::WEATHERED, true], + [Ids::WAXED_OXIDIZED_COPPER_DOOR, CopperOxidation::OXIDIZED, true] + ] as [$id, $oxidation, $waxed]) { + $copperDoorStateIdMap[$oxidation->value][$waxed ? 1 : 0] = $id; + $this->deserializer?->mapBlock($id, fn() => Blocks::COPPER_DOOR()->setOxidation($oxidation)->setWaxed($waxed)); + } + $this->serializer?->mapBlock(Blocks::COPPER_DOOR(), fn(CopperDoor $block) => new Data($copperDoorStateIdMap[$block->getOxidation()->value][$block->isWaxed() ? 1 : 0])); + } } diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 9f5db6950c..ee0f1f5c52 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -98,9 +98,14 @@ final class StringToItemParser extends StringToTParser{ foreach(["" => false, "waxed_" => true] as $waxedPrefix => $waxed){ $register = fn(string $name, \Closure $callback) => $result->registerBlock($waxedPrefix . $oxPrefix . $name, $callback); $register("copper_block", fn() => Blocks::COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $register("chiseled_copper", fn() => Blocks::CHISELED_COPPER()->setOxidation($oxidation)->setWaxed($waxed)); + $register("copper_grate", fn() => Blocks::COPPER_GRATE()->setOxidation($oxidation)->setWaxed($waxed)); $register("cut_copper_block", fn() => Blocks::CUT_COPPER()->setOxidation($oxidation)->setWaxed($waxed)); $register("cut_copper_stairs", fn() => Blocks::CUT_COPPER_STAIRS()->setOxidation($oxidation)->setWaxed($waxed)); $register("cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed)); + $register("copper_bulb", fn() => Blocks::COPPER_BULB()->setOxidation($oxidation)->setWaxed($waxed)); + $register("copper_door", fn() => Blocks::COPPER_DOOR()->setOxidation($oxidation)->setWaxed($waxed)); + $register("copper_trapdoor", fn() => Blocks::COPPER_TRAPDOOR()->setOxidation($oxidation)->setWaxed($waxed)); } } diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index de38903bd3..0ead377ba0 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -10,6 +10,16 @@ parameters: count: 1 path: ../../../src/block/DoubleTallGrass.php + - + message: "#^Method pocketmine\\\\block\\\\CopperDoor\\:\\:onInteractCopper\\(\\) has parameter \\$returnedItems with no value type specified in iterable type array\\.$#" + count: 1 + path: ../../../src/block/utils/CopperTrait.php + + - + message: "#^Method pocketmine\\\\block\\\\CopperTrapdoor\\:\\:onInteractCopper\\(\\) has parameter \\$returnedItems with no value type specified in iterable type array\\.$#" + count: 1 + path: ../../../src/block/utils/CopperTrait.php + - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index 97c24b52ec..79804d8cbd 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -105,6 +105,7 @@ "CHERRY_WOOD": 6, "CHEST": 4, "CHISELED_BOOKSHELF": 256, + "CHISELED_COPPER": 8, "CHISELED_DEEPSLATE": 1, "CHISELED_NETHER_BRICKS": 1, "CHISELED_POLISHED_BLACKSTONE": 1, @@ -133,7 +134,11 @@ "CONCRETE": 16, "CONCRETE_POWDER": 16, "COPPER": 8, + "COPPER_BULB": 32, + "COPPER_DOOR": 256, + "COPPER_GRATE": 8, "COPPER_ORE": 1, + "COPPER_TRAPDOOR": 128, "CORAL": 10, "CORAL_BLOCK": 10, "CORAL_FAN": 20, From f6e6f15c639bc09e8384416f1111eb12eff2f0b1 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 25 Sep 2024 21:28:17 +0300 Subject: [PATCH 1779/1858] Implemented a proper way to handle items cooldown (#6405) --- src/item/ChorusFruit.php | 4 +++ src/item/EnderPearl.php | 4 +++ src/item/Item.php | 14 +++++++++ src/item/ItemCooldownTags.php | 45 +++++++++++++++++++++++++++++ src/network/mcpe/NetworkSession.php | 10 +++++++ src/player/Player.php | 13 ++++++--- 6 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 src/item/ItemCooldownTags.php diff --git a/src/item/ChorusFruit.php b/src/item/ChorusFruit.php index c12724d7ca..e10c519576 100644 --- a/src/item/ChorusFruit.php +++ b/src/item/ChorusFruit.php @@ -88,4 +88,8 @@ class ChorusFruit extends Food{ public function getCooldownTicks() : int{ return 20; } + + public function getCooldownTag() : ?string{ + return ItemCooldownTags::CHORUS_FRUIT; + } } diff --git a/src/item/EnderPearl.php b/src/item/EnderPearl.php index 76bcb358ea..7109d3ae06 100644 --- a/src/item/EnderPearl.php +++ b/src/item/EnderPearl.php @@ -45,4 +45,8 @@ class EnderPearl extends ProjectileItem{ public function getCooldownTicks() : int{ return 20; } + + public function getCooldownTag() : ?string{ + return ItemCooldownTags::ENDER_PEARL; + } } diff --git a/src/item/Item.php b/src/item/Item.php index 1a74345b55..205f15e130 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -654,6 +654,20 @@ class Item implements \JsonSerializable{ return 0; } + /** + * Returns a tag that identifies a group of items that should have cooldown at the same time + * regardless of their state or type. + * When cooldown starts, any other items with the same cooldown tag can't be used until the cooldown expires. + * Such behaviour can be seen in goat horns and shields. + * + * If tag is null, item state id will be used to store cooldown. + * + * @see ItemCooldownTags + */ + public function getCooldownTag() : ?string{ + return null; + } + /** * Compares an Item to this Item and check if they match. * diff --git a/src/item/ItemCooldownTags.php b/src/item/ItemCooldownTags.php new file mode 100644 index 0000000000..f0ef6d1699 --- /dev/null +++ b/src/item/ItemCooldownTags.php @@ -0,0 +1,45 @@ +sendDataPacket(OpenSignPacket::create(BlockPosition::fromVector3($signPosition), $frontSide)); } + public function onItemCooldownChanged(Item $item, int $ticks) : void{ + $this->sendDataPacket(PlayerStartItemCooldownPacket::create( + GlobalItemDataHandlers::getSerializer()->serializeType($item)->getName(), + $ticks + )); + } + public function tick() : void{ if(!$this->isConnected()){ $this->dispose(); diff --git a/src/player/Player.php b/src/player/Player.php index d442c6a3b2..8ae206e1a4 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -283,7 +283,11 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ protected string $locale = "en_US"; protected int $startAction = -1; - /** @var int[] ID => ticks map */ + + /** + * @phpstan-var array + * @var int[] stateId|cooldownTag => ticks map + */ protected array $usedItemsCooldown = []; private int $lastEmoteTick = 0; @@ -697,7 +701,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function getItemCooldownExpiry(Item $item) : int{ $this->checkItemCooldowns(); - return $this->usedItemsCooldown[$item->getStateId()] ?? 0; + return $this->usedItemsCooldown[$item->getCooldownTag() ?? $item->getStateId()] ?? 0; } /** @@ -705,7 +709,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasItemCooldown(Item $item) : bool{ $this->checkItemCooldowns(); - return isset($this->usedItemsCooldown[$item->getStateId()]); + return isset($this->usedItemsCooldown[$item->getCooldownTag() ?? $item->getStateId()]); } /** @@ -714,7 +718,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function resetItemCooldown(Item $item, ?int $ticks = null) : void{ $ticks = $ticks ?? $item->getCooldownTicks(); if($ticks > 0){ - $this->usedItemsCooldown[$item->getStateId()] = $this->server->getTick() + $ticks; + $this->usedItemsCooldown[$item->getCooldownTag() ?? $item->getStateId()] = $this->server->getTick() + $ticks; + $this->getNetworkSession()->onItemCooldownChanged($item, $ticks); } } From 5cc1068cd43264d3363295eb8d6901e02f467897 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 21:29:22 +0000 Subject: [PATCH 1780/1858] Bump docker/build-push-action from 6.7.0 to 6.8.0 (#6462) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 437ed963f8..7f5eae32a5 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v6.7.0 + uses: docker/build-push-action@v6.8.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.7.0 + uses: docker/build-push-action@v6.8.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.7.0 + uses: docker/build-push-action@v6.8.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.7.0 + uses: docker/build-push-action@v6.8.0 with: push: true context: ./pocketmine-mp From c8f567b0937c406097b9cc26fc26b5cd4c7ea21d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 17 Oct 2024 20:24:57 +0100 Subject: [PATCH 1781/1858] Fix missing arg count check --- tools/blockstate-upgrade-schema-utils.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index a9069d4294..cd782b9c44 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -745,6 +745,10 @@ function main(array $argv) : int{ } $callback = $options[$selected][1]; + if(count($argv) !== count($options[$selected][0]) + 2){ + fwrite(STDERR, "Usage: {$argv[0]} $selected " . implode(" ", array_map(fn(string $a) => "<$a>", $options[$selected][0])) . "\n"); + return 1; + } return $callback($argv); } From 59d14de1d83d9babd30a9c45965feae90374d6ba Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 17 Oct 2024 20:51:17 +0100 Subject: [PATCH 1782/1858] generate-blockstate-upgrade-schema: fallback to exact state match when encountering ambiguous filters this popped up due to new changes in 1.20.40. Really we need to improve the way the filters are calculated, but this workaround solves the issue for now. --- tools/generate-blockstate-upgrade-schema.php | 27 ++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 54984d4591..e5eab822f1 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -496,8 +496,31 @@ function processRemappedStates(array $upgradeTable) : array{ if($existing === null || $existing->equals($remap)){ $list[$rawOldState] = $remap; }else{ - //match criteria is borked - throw new AssumptionFailedError("Match criteria resulted in two ambiguous remaps"); + //TODO: ambiguous filter - this is a bug in the unchanged states calculation + //this is a real pain to fix, so workaround this for now + //this arose in 1.20.40 with brown_mushroom_block when variants 10 and 15 were remapped to mushroom_stem + //while also keeping the huge_mushroom_bits property with the same value + //this causes huge_mushroom_bits to be considered an "unchanged" state, which is *technically* correct, but + //means it can't be deleted from the filter + + //move stuff from newState to copiedState where possible, even if we can't delete it from the filter + $cleanedNewState2 = $newState; + $copiedState = []; + foreach(Utils::stringifyKeys($cleanedNewState2) as $newPropertyName => $newPropertyValue){ + if(isset($oldState[$newPropertyName]) && $oldState[$newPropertyName]->equals($newPropertyValue)){ + $copiedState[] = $newPropertyName; + unset($cleanedNewState2[$newPropertyName]); + } + } + + $list[encodeOrderedProperties($oldState)] = new BlockStateUpgradeSchemaBlockRemap( + $oldState, + $newName, + $cleanedNewState2, + $copiedState + ); + \GlobalLogger::get()->warning("Couldn't calculate an unambiguous partial remappedStates filter for some states of \"" . $pair->old->getName() . "\" - falling back to exact match"); + \GlobalLogger::get()->warning("The schema should still work, but may be larger than desired"); } } From f1b1a7022d7dc67d012d8891bc4c23c2652c825e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 17 Oct 2024 20:55:12 +0100 Subject: [PATCH 1783/1858] and a sanity check just in case --- tools/generate-blockstate-upgrade-schema.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index e5eab822f1..741098f7aa 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -513,7 +513,11 @@ function processRemappedStates(array $upgradeTable) : array{ } } - $list[encodeOrderedProperties($oldState)] = new BlockStateUpgradeSchemaBlockRemap( + $fallbackRawFilter = encodeOrderedProperties($oldState); + if(isset($list[$fallbackRawFilter])){ + throw new AssumptionFailedError("Exact match filter collision for \"" . $pair->old->getName() . "\" - this should never happen"); + } + $list[$fallbackRawFilter] = new BlockStateUpgradeSchemaBlockRemap( $oldState, $newName, $cleanedNewState2, From 7e343617b9641875c1c6cea58957d94034d0cdde Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:34:42 +0300 Subject: [PATCH 1784/1858] Rename ICopper to CopperMaterial (#6470) --- src/block/Copper.php | 4 ++-- src/block/CopperBulb.php | 4 ++-- src/block/CopperDoor.php | 4 ++-- src/block/CopperGrate.php | 4 ++-- src/block/CopperSlab.php | 4 ++-- src/block/CopperStairs.php | 4 ++-- src/block/CopperTrapdoor.php | 4 ++-- src/block/utils/{ICopper.php => CopperMaterial.php} | 6 +++--- .../block/convert/BlockStateDeserializerHelper.php | 10 +++++----- 9 files changed, 22 insertions(+), 22 deletions(-) rename src/block/utils/{ICopper.php => CopperMaterial.php} (85%) diff --git a/src/block/Copper.php b/src/block/Copper.php index 8e678bf426..d285e6ec0a 100644 --- a/src/block/Copper.php +++ b/src/block/Copper.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; -class Copper extends Opaque implements ICopper{ +class Copper extends Opaque implements CopperMaterial{ use CopperTrait; } diff --git a/src/block/CopperBulb.php b/src/block/CopperBulb.php index 223c63527f..97fc209fee 100644 --- a/src/block/CopperBulb.php +++ b/src/block/CopperBulb.php @@ -23,14 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; use pocketmine\block\utils\LightableTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\data\runtime\RuntimeDataDescriber; -class CopperBulb extends Opaque implements ICopper{ +class CopperBulb extends Opaque implements CopperMaterial{ use CopperTrait; use PoweredByRedstoneTrait; use LightableTrait{ diff --git a/src/block/CopperDoor.php b/src/block/CopperDoor.php index d53be2323c..82a611206c 100644 --- a/src/block/CopperDoor.php +++ b/src/block/CopperDoor.php @@ -23,14 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -class CopperDoor extends Door implements ICopper{ +class CopperDoor extends Door implements CopperMaterial{ use CopperTrait{ onInteract as onInteractCopper; } diff --git a/src/block/CopperGrate.php b/src/block/CopperGrate.php index fb59d846e8..d646d13334 100644 --- a/src/block/CopperGrate.php +++ b/src/block/CopperGrate.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; -class CopperGrate extends Transparent implements ICopper{ +class CopperGrate extends Transparent implements CopperMaterial{ use CopperTrait; //TODO: waterlogging! diff --git a/src/block/CopperSlab.php b/src/block/CopperSlab.php index 4194cd8543..cc1838e293 100644 --- a/src/block/CopperSlab.php +++ b/src/block/CopperSlab.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; -class CopperSlab extends Slab implements ICopper{ +class CopperSlab extends Slab implements CopperMaterial{ use CopperTrait; } diff --git a/src/block/CopperStairs.php b/src/block/CopperStairs.php index dd8f44f7ac..ecb2243195 100644 --- a/src/block/CopperStairs.php +++ b/src/block/CopperStairs.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; -class CopperStairs extends Stair implements ICopper{ +class CopperStairs extends Stair implements CopperMaterial{ use CopperTrait; } diff --git a/src/block/CopperTrapdoor.php b/src/block/CopperTrapdoor.php index ab743af44b..e7d56fa0c4 100644 --- a/src/block/CopperTrapdoor.php +++ b/src/block/CopperTrapdoor.php @@ -23,13 +23,13 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperTrait; -use pocketmine\block\utils\ICopper; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; -class CopperTrapdoor extends Trapdoor implements ICopper{ +class CopperTrapdoor extends Trapdoor implements CopperMaterial{ use CopperTrait{ onInteract as onInteractCopper; } diff --git a/src/block/utils/ICopper.php b/src/block/utils/CopperMaterial.php similarity index 85% rename from src/block/utils/ICopper.php rename to src/block/utils/CopperMaterial.php index a749efe639..6df22620b7 100644 --- a/src/block/utils/ICopper.php +++ b/src/block/utils/CopperMaterial.php @@ -26,13 +26,13 @@ namespace pocketmine\block\utils; /** * Represents copper blocks that have oxidized and waxed variations. */ -interface ICopper{ +interface CopperMaterial{ public function getOxidation() : CopperOxidation; - public function setOxidation(CopperOxidation $oxidation) : ICopper; + public function setOxidation(CopperOxidation $oxidation) : CopperMaterial; public function isWaxed() : bool; - public function setWaxed(bool $waxed) : ICopper; + public function setWaxed(bool $waxed) : CopperMaterial; } diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index c0807c8a6b..e183589c9d 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -45,8 +45,8 @@ use pocketmine\block\Slab; use pocketmine\block\Stair; use pocketmine\block\Stem; use pocketmine\block\Trapdoor; +use pocketmine\block\utils\CopperMaterial; use pocketmine\block\utils\CopperOxidation; -use pocketmine\block\utils\ICopper; use pocketmine\block\utils\SlabType; use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; @@ -98,24 +98,24 @@ final class BlockStateDeserializerHelper{ } /** - * @phpstan-template TBlock of ICopper + * @phpstan-template TBlock of CopperMaterial * * @phpstan-param TBlock $block * @phpstan-return TBlock */ - public static function decodeCopper(ICopper $block, CopperOxidation $oxidation) : ICopper{ + public static function decodeCopper(CopperMaterial $block, CopperOxidation $oxidation) : CopperMaterial{ $block->setOxidation($oxidation); $block->setWaxed(false); return $block; } /** - * @phpstan-template TBlock of ICopper + * @phpstan-template TBlock of CopperMaterial * * @phpstan-param TBlock $block * @phpstan-return TBlock */ - public static function decodeWaxedCopper(ICopper $block, CopperOxidation $oxidation) : ICopper{ + public static function decodeWaxedCopper(CopperMaterial $block, CopperOxidation $oxidation) : CopperMaterial{ $block->setOxidation($oxidation); $block->setWaxed(true); return $block; From 7f9e79c83e1130f3cf74c33917a33ff6fd7a074b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Oct 2024 13:30:24 +0100 Subject: [PATCH 1785/1858] Automatically test new schemas to ensure they produce the results predicted by the input file --- tools/blockstate-upgrade-schema-utils.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index a779ab9c3d..c8dfb0ab26 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -692,6 +692,13 @@ function cmdGenerate(array $argv) : int{ \GlobalLogger::get()->warning("All states appear to be the same! No schema generated."); return 0; } + + if(!testBlockStateUpgradeSchema($table, $diff)){ + \GlobalLogger::get()->error("Generated schema does not produce the results expected by $upgradeTableFile"); + \GlobalLogger::get()->error("This is probably a bug in the schema generation code. Please report this to the developers."); + return 1; + } + file_put_contents( $schemaFile, json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($diff), JSON_PRETTY_PRINT) . "\n" @@ -744,6 +751,13 @@ function cmdUpdate(array $argv) : int{ $upgradeTable = buildUpgradeTableFromData($tags, false); $newSchema = generateBlockStateUpgradeSchema($upgradeTable); + + if(!testBlockStateUpgradeSchema($upgradeTable, $newSchema)){ + \GlobalLogger::get()->error("Updated schema does not produce the expected results!"); + \GlobalLogger::get()->error("This is probably a bug in the schema generation code. Please report this to the developers."); + return 1; + } + file_put_contents( $newSchemaFile, json_encode(BlockStateUpgradeSchemaUtils::toJsonModel($newSchema), JSON_PRETTY_PRINT) . "\n" From acbfb0a3e9a8e2d4be25836d7cd359461c7e4b73 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Oct 2024 13:30:55 +0100 Subject: [PATCH 1786/1858] Support for updating a batch of schemas using BlockPaletteArchive --- tools/blockstate-upgrade-schema-utils.php | 50 ++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index c8dfb0ab26..b73954affc 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -41,6 +41,7 @@ use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; +use Symfony\Component\Filesystem\Path; use function array_key_first; use function array_key_last; use function array_keys; @@ -50,15 +51,19 @@ use function array_unique; use function array_values; use function count; use function dirname; +use function file_exists; use function file_put_contents; use function fwrite; use function get_class; use function get_debug_type; use function implode; +use function is_dir; use function is_numeric; use function json_encode; use function ksort; use function min; +use function preg_match; +use function scandir; use function sort; use function strlen; use function strrev; @@ -766,6 +771,48 @@ function cmdUpdate(array $argv) : int{ return 0; } +/** + * @param string[] $argv + */ +function cmdUpdateAll(array $argv) : int{ + $oldPaletteFilenames = [ + '1.9.0' => '1.09.0', + '1.19.50' => '1.19.50.23_beta', + '1.19.60' => '1.19.60.26_beta', + '1.19.70' => '1.19.70.26_beta', + '1.19.80' => '1.19.80.24_beta', + ]; + $schemaDir = $argv[2]; + $paletteArchiveDir = $argv[3]; + + $schemaFileNames = scandir($schemaDir); + if($schemaFileNames === false){ + \GlobalLogger::get()->error("Failed to read schema directory $schemaDir"); + return 1; + } + foreach($schemaFileNames as $file){ + $schemaFile = Path::join($schemaDir, $file); + if(!file_exists($schemaFile) || is_dir($schemaFile)){ + continue; + } + + if(preg_match('/^\d{4}_(.+?)_to_(.+?).json/', $file, $matches) !== 1){ + continue; + } + $oldPaletteFile = Path::join($paletteArchiveDir, ($oldPaletteFilenames[$matches[1]] ?? $matches[1]) . '.nbt'); + + //a bit clunky but it avoids having to make yet another function + //TODO: perhaps in the future we should write the result to a tmpfile until all schemas are updated, + //and then copy the results into place at the end + if(cmdUpdate([$argv[0], "update", $schemaFile, $oldPaletteFile, $schemaFile]) !== 0){ + return 1; + } + } + + \GlobalLogger::get()->info("All schemas updated successfully."); + return 0; +} + /** * @param string[] $argv */ @@ -773,7 +820,8 @@ function main(array $argv) : int{ $options = [ "generate" => [["palette upgrade table file", "schema output file"], cmdGenerate(...)], "test" => [["palette upgrade table file", "schema output file"], cmdTest(...)], - "update" => [["schema input file", "old palette file", "updated schema output file"], cmdUpdate(...)] + "update" => [["schema input file", "old palette file", "updated schema output file"], cmdUpdate(...)], + "update-all" => [["schema folder", "path to BlockPaletteArchive"], cmdUpdateAll(...)] ]; $selected = $argv[1] ?? null; From 22718c4971460fae5b4d98fabff199da77c6acf0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Oct 2024 16:12:28 +0100 Subject: [PATCH 1787/1858] Add support for specialized flattenedProperties in schema format --- .../block/upgrade/BlockStateUpgradeSchema.php | 8 + .../BlockStateUpgradeSchemaBlockRemap.php | 6 +- ...=> BlockStateUpgradeSchemaFlattenInfo.php} | 2 +- .../upgrade/BlockStateUpgradeSchemaUtils.php | 71 +++++--- .../block/upgrade/BlockStateUpgrader.php | 62 +++++-- .../model/BlockStateUpgradeSchemaModel.php | 6 + ...BlockStateUpgradeSchemaModelBlockRemap.php | 6 +- ...ockStateUpgradeSchemaModelFlattenInfo.php} | 2 +- .../block/upgrade/BlockStateUpgraderTest.php | 19 ++ tools/blockstate-upgrade-schema-utils.php | 170 +++++++++++++----- 10 files changed, 251 insertions(+), 101 deletions(-) rename src/data/bedrock/block/upgrade/{BlockStateUpgradeSchemaFlattenedName.php => BlockStateUpgradeSchemaFlattenInfo.php} (97%) rename src/data/bedrock/block/upgrade/model/{BlockStateUpgradeSchemaModelFlattenedName.php => BlockStateUpgradeSchemaModelFlattenInfo.php} (95%) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php index 6d280ecf75..f8894cfd27 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchema.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenInfo as FlattenInfo; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap as ValueRemap; use pocketmine\nbt\tag\Tag; use function count; @@ -58,6 +59,12 @@ final class BlockStateUpgradeSchema{ */ public array $remappedPropertyValues = []; + /** + * @var FlattenInfo[] + * @phpstan-var array + */ + public array $flattenedProperties = []; + /** * @var BlockStateUpgradeSchemaBlockRemap[][] * @phpstan-var array> @@ -93,6 +100,7 @@ final class BlockStateUpgradeSchema{ $this->removedProperties, $this->renamedProperties, $this->remappedPropertyValues, + $this->flattenedProperties, $this->remappedStates, ] as $list){ if(count($list) !== 0){ diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php index 611ad04e25..676afbaf4e 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaBlockRemap.php @@ -40,7 +40,7 @@ final class BlockStateUpgradeSchemaBlockRemap{ */ public function __construct( public array $oldState, - public string|BlockStateUpgradeSchemaFlattenedName $newName, + public string|BlockStateUpgradeSchemaFlattenInfo $newName, public array $newState, public array $copiedState ){} @@ -48,8 +48,8 @@ final class BlockStateUpgradeSchemaBlockRemap{ public function equals(self $that) : bool{ $sameName = $this->newName === $that->newName || ( - $this->newName instanceof BlockStateUpgradeSchemaFlattenedName && - $that->newName instanceof BlockStateUpgradeSchemaFlattenedName && + $this->newName instanceof BlockStateUpgradeSchemaFlattenInfo && + $that->newName instanceof BlockStateUpgradeSchemaFlattenInfo && $this->newName->equals($that->newName) ); if(!$sameName){ diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenInfo.php similarity index 97% rename from src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php rename to src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenInfo.php index 8259f690d0..4a14a1291f 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenedName.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaFlattenInfo.php @@ -29,7 +29,7 @@ use pocketmine\nbt\tag\StringTag; use function ksort; use const SORT_STRING; -final class BlockStateUpgradeSchemaFlattenedName{ +final class BlockStateUpgradeSchemaFlattenInfo{ /** * @param string[] $flattenedValueRemaps diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index d66b7e68cc..08eba89785 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModel; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; -use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelFlattenedName; +use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelFlattenInfo; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelTag; use pocketmine\data\bedrock\block\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; use pocketmine\nbt\tag\ByteTag; @@ -155,24 +155,17 @@ final class BlockStateUpgradeSchemaUtils{ } } + foreach(Utils::stringifyKeys($model->flattenedProperties ?? []) as $blockName => $flattenRule){ + $result->flattenedProperties[$blockName] = self::jsonModelToFlattenRule($flattenRule); + } + foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ foreach($remaps as $remap){ if(isset($remap->newName)){ $remapName = $remap->newName; }elseif(isset($remap->newFlattenedName)){ $flattenRule = $remap->newFlattenedName; - $remapName = new BlockStateUpgradeSchemaFlattenedName( - $flattenRule->prefix, - $flattenRule->flattenedProperty, - $flattenRule->suffix, - $flattenRule->flattenedValueRemaps ?? [], - match($flattenRule->flattenedPropertyType){ - "string", null => StringTag::class, - "int" => IntTag::class, - "byte" => ByteTag::class, - default => throw new \UnexpectedValueException("Unexpected flattened property type $flattenRule->flattenedPropertyType, expected 'string', 'int' or 'byte'") - } - ); + $remapName = self::jsonModelToFlattenRule($flattenRule); }else{ throw new \UnexpectedValueException("Expected exactly one of 'newName' or 'newFlattenedName' properties to be set"); } @@ -265,6 +258,36 @@ final class BlockStateUpgradeSchemaUtils{ $model->remappedPropertyValues = $modelDedupMapping; } + private static function flattenRuleToJsonModel(BlockStateUpgradeSchemaFlattenInfo $flattenRule) : BlockStateUpgradeSchemaModelFlattenInfo{ + return new BlockStateUpgradeSchemaModelFlattenInfo( + $flattenRule->prefix, + $flattenRule->flattenedProperty, + $flattenRule->suffix, + $flattenRule->flattenedValueRemaps, + match($flattenRule->flattenedPropertyType){ + StringTag::class => null, //omit for TAG_String, as this is the common case + ByteTag::class => "byte", + IntTag::class => "int", + default => throw new \LogicException("Unexpected tag type " . $flattenRule->flattenedPropertyType . " in flattened property type") + } + ); + } + + private static function jsonModelToFlattenRule(BlockStateUpgradeSchemaModelFlattenInfo $flattenRule) : BlockStateUpgradeSchemaFlattenInfo{ + return new BlockStateUpgradeSchemaFlattenInfo( + $flattenRule->prefix, + $flattenRule->flattenedProperty, + $flattenRule->suffix, + $flattenRule->flattenedValueRemaps ?? [], + match ($flattenRule->flattenedPropertyType) { + "string", null => StringTag::class, + "int" => IntTag::class, + "byte" => ByteTag::class, + default => throw new \UnexpectedValueException("Unexpected flattened property type $flattenRule->flattenedPropertyType, expected 'string', 'int' or 'byte'") + } + ); + } + public static function toJsonModel(BlockStateUpgradeSchema $schema) : BlockStateUpgradeSchemaModel{ $result = new BlockStateUpgradeSchemaModel(); $result->maxVersionMajor = $schema->maxVersionMajor; @@ -303,25 +326,19 @@ final class BlockStateUpgradeSchemaUtils{ self::buildRemappedValuesIndex($schema, $result); + foreach(Utils::stringifyKeys($schema->flattenedProperties) as $blockName => $flattenRule){ + $result->flattenedProperties[$blockName] = self::flattenRuleToJsonModel($flattenRule); + } + if(isset($result->flattenedProperties)){ + ksort($result->flattenedProperties); + } + foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ $keyedRemaps = []; foreach($remaps as $remap){ $modelRemap = new BlockStateUpgradeSchemaModelBlockRemap( array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), - is_string($remap->newName) ? - $remap->newName : - new BlockStateUpgradeSchemaModelFlattenedName( - $remap->newName->prefix, - $remap->newName->flattenedProperty, - $remap->newName->suffix, - $remap->newName->flattenedValueRemaps, - match($remap->newName->flattenedPropertyType){ - StringTag::class => null, //omit for TAG_String, as this is the common case - ByteTag::class => "byte", - IntTag::class => "int", - default => throw new \LogicException("Unexpected tag type " . $remap->newName->flattenedPropertyType . " in flattened property type") - } - ), + is_string($remap->newName) ? $remap->newName : self::flattenRuleToJsonModel($remap->newName), array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), $remap->copiedState ); diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index b0612585c0..e95f3c80f6 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -110,10 +110,21 @@ final class BlockStateUpgrader{ } $oldName = $blockStateData->getName(); - $newName = $schema->renamedIds[$oldName] ?? null; + $states = $blockStateData->getStates(); + + if(isset($schema->renamedIds[$oldName]) && isset($schema->flattenedProperties[$oldName])){ + //TODO: this probably ought to be validated when the schema is constructed + throw new AssumptionFailedError("Both renamedIds and flattenedProperties are set for the same block ID \"$oldName\" - don't know what to do"); + } + if(isset($schema->renamedIds[$oldName])){ + $newName = $schema->renamedIds[$oldName] ?? null; + }elseif(isset($schema->flattenedProperties[$oldName])){ + [$newName, $states] = $this->applyPropertyFlattened($schema->flattenedProperties[$oldName], $oldName, $states); + }else{ + $newName = null; + } $stateChanges = 0; - $states = $blockStateData->getStates(); $states = $this->applyPropertyAdded($schema, $oldName, $states, $stateChanges); $states = $this->applyPropertyRemoved($schema, $oldName, $states, $stateChanges); @@ -146,22 +157,9 @@ final class BlockStateUpgrader{ if(is_string($remap->newName)){ $newName = $remap->newName; }else{ - $flattenedValue = $oldState[$remap->newName->flattenedProperty] ?? null; - $expectedType = $remap->newName->flattenedPropertyType; - if(!$flattenedValue instanceof $expectedType){ - //flattened property is not of the expected type, so this transformation is not applicable - continue; - } - $embedKey = match(get_class($flattenedValue)){ - StringTag::class => $flattenedValue->getValue(), - ByteTag::class => (string) $flattenedValue->getValue(), - IntTag::class => (string) $flattenedValue->getValue(), - //flattenedPropertyType is always one of these three types, but PHPStan doesn't know that - default => throw new AssumptionFailedError("flattenedPropertyType should be one of these three types, but have " . get_class($flattenedValue)), - }; - $embedValue = $remap->newName->flattenedValueRemaps[$embedKey] ?? $embedKey; - $newName = sprintf("%s%s%s", $remap->newName->prefix, $embedValue, $remap->newName->suffix); - unset($oldState[$remap->newName->flattenedProperty]); + //yes, overwriting $oldState here is intentional, although we probably don't actually need it anyway + //it shouldn't make any difference unless the flattened property appears in copiedState for some reason + [$newName, $oldState] = $this->applyPropertyFlattened($remap->newName, $oldName, $oldState); } $newState = $remap->newState; @@ -279,4 +277,32 @@ final class BlockStateUpgrader{ return $states; } + + /** + * @param Tag[] $states + * @phpstan-param array $states + * + * @return (string|Tag[])[] + * @phpstan-return array{0: string, 1: array} + */ + private function applyPropertyFlattened(BlockStateUpgradeSchemaFlattenInfo $flattenInfo, string $oldName, array $states) : array{ + $flattenedValue = $states[$flattenInfo->flattenedProperty] ?? null; + $expectedType = $flattenInfo->flattenedPropertyType; + if(!$flattenedValue instanceof $expectedType){ + //flattened property is not of the expected type, so this transformation is not applicable + return [$oldName, $states]; + } + $embedKey = match(get_class($flattenedValue)){ + StringTag::class => $flattenedValue->getValue(), + ByteTag::class => (string) $flattenedValue->getValue(), + IntTag::class => (string) $flattenedValue->getValue(), + //flattenedPropertyType is always one of these three types, but PHPStan doesn't know that + default => throw new AssumptionFailedError("flattenedPropertyType should be one of these three types, but have " . get_class($flattenedValue)), + }; + $embedValue = $flattenInfo->flattenedValueRemaps[$embedKey] ?? $embedKey; + $newName = sprintf("%s%s%s", $flattenInfo->prefix, $embedValue, $flattenInfo->suffix); + unset($states[$flattenInfo->flattenedProperty]); + + return [$newName, $states]; + } } diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php index 1a4a14c87c..7d91438e4f 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -75,6 +75,12 @@ final class BlockStateUpgradeSchemaModel implements \JsonSerializable{ */ public array $remappedPropertyValuesIndex; + /** + * @var BlockStateUpgradeSchemaModelFlattenInfo[] + * @phpstan-var array + */ + public array $flattenedProperties; + /** * @var BlockStateUpgradeSchemaModelBlockRemap[][] * @phpstan-var array> diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php index 0f518479e5..6accf1f021 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelBlockRemap.php @@ -43,7 +43,7 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ * Either this or newName must be present * Due to technical limitations of jsonmapper, we can't use a union type here */ - public BlockStateUpgradeSchemaModelFlattenedName $newFlattenedName; + public BlockStateUpgradeSchemaModelFlattenInfo $newFlattenedName; /** * @var BlockStateUpgradeSchemaModelTag[]|null @@ -67,9 +67,9 @@ final class BlockStateUpgradeSchemaModelBlockRemap{ * @phpstan-param array $newState * @phpstan-param list $copiedState */ - public function __construct(array $oldState, string|BlockStateUpgradeSchemaModelFlattenedName $newNameRule, array $newState, array $copiedState){ + public function __construct(array $oldState, string|BlockStateUpgradeSchemaModelFlattenInfo $newNameRule, array $newState, array $copiedState){ $this->oldState = count($oldState) === 0 ? null : $oldState; - if($newNameRule instanceof BlockStateUpgradeSchemaModelFlattenedName){ + if($newNameRule instanceof BlockStateUpgradeSchemaModelFlattenInfo){ $this->newFlattenedName = $newNameRule; }else{ $this->newName = $newNameRule; diff --git a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenInfo.php similarity index 95% rename from src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php rename to src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenInfo.php index 6d03bbc128..6da590287b 100644 --- a/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenedName.php +++ b/src/data/bedrock/block/upgrade/model/BlockStateUpgradeSchemaModelFlattenInfo.php @@ -25,7 +25,7 @@ namespace pocketmine\data\bedrock\block\upgrade\model; use function count; -final class BlockStateUpgradeSchemaModelFlattenedName implements \JsonSerializable{ +final class BlockStateUpgradeSchemaModelFlattenInfo implements \JsonSerializable{ /** @required */ public string $prefix; diff --git a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php index 4d4d321ec0..91afd8ed92 100644 --- a/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php +++ b/tests/phpunit/data/bedrock/block/upgrade/BlockStateUpgraderTest.php @@ -24,8 +24,10 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use PHPUnit\Framework\TestCase; +use pocketmine\block\Block; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\nbt\tag\IntTag; +use pocketmine\nbt\tag\StringTag; use const PHP_INT_MAX; class BlockStateUpgraderTest extends TestCase{ @@ -210,6 +212,23 @@ class BlockStateUpgraderTest extends TestCase{ self::assertSame($upgradedStateData->getState(self::TEST_PROPERTY_2)?->getValue(), $valueAfter); } + public function testFlattenProperty() : void{ + $schema = $this->getNewSchema(); + $schema->flattenedProperties[self::TEST_BLOCK] = new BlockStateUpgradeSchemaFlattenInfo( + "minecraft:", + "test", + "_suffix", + [], + StringTag::class + ); + + $stateData = new BlockStateData(self::TEST_BLOCK, ["test" => new StringTag("value1")], 0); + $upgradedStateData = $this->upgrade($stateData, fn() => $stateData); + + self::assertSame("minecraft:value1_suffix", $upgradedStateData->getName()); + self::assertEmpty($upgradedStateData->getStates()); + } + /** * @phpstan-return \Generator */ diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index b73954affc..e1a5e7c3be 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -27,7 +27,7 @@ use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgrader; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchema; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaBlockRemap; -use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenedName; +use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaFlattenInfo; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaUtils; use pocketmine\data\bedrock\block\upgrade\BlockStateUpgradeSchemaValueRemap; use pocketmine\nbt\LittleEndianNbtSerializer; @@ -183,6 +183,11 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra $removedProperties = []; $renamedProperties = []; + $uniqueNewIds = []; + foreach($upgradeTable as $pair){ + $uniqueNewIds[$pair->new->getName()] = $pair->new->getName(); + } + foreach(Utils::stringifyKeys($newProperties) as $newPropertyName => $newPropertyValues){ if(count($newPropertyValues) === 1){ $newPropertyValue = $newPropertyValues[array_key_first($newPropertyValues)]; @@ -278,6 +283,61 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra } } + if(count($uniqueNewIds) > 1){ + //detect possible flattening + $flattenedProperty = null; + $flattenedPropertyType = null; + $flattenedPropertyMap = []; + foreach($removedProperties as $removedProperty){ + $valueMap = []; + foreach($upgradeTable as $pair){ + $oldValue = $pair->old->getState($removedProperty); + if($oldValue === null){ + throw new AssumptionFailedError("We already checked that all states had consistent old properties"); + } + //TODO: lots of similar logic to the remappedStates builder below + if(!$oldValue instanceof ByteTag && !$oldValue instanceof IntTag && !$oldValue instanceof StringTag){ + //unknown property type - bad candidate for flattening + continue 2; + } + if($flattenedPropertyType === null){ + $flattenedPropertyType = get_class($oldValue); + }elseif(!$oldValue instanceof $flattenedPropertyType){ + //property type mismatch - bad candidate for flattening + continue 2; + } + + $rawValue = (string) $oldValue->getValue(); + $existingNewId = $valueMap[$rawValue] ?? null; + if($existingNewId !== null && $existingNewId !== $pair->new->getName()){ + //this property value is associated with multiple new IDs - bad candidate for flattening + continue 2; + } + $valueMap[$rawValue] = $pair->new->getName(); + } + + if($flattenedProperty !== null){ + //found multiple candidates for flattening - fallback to remappedStates + return false; + } + //we found a suitable candidate + $flattenedProperty = $removedProperty; + $flattenedPropertyMap = $valueMap; + break; + } + + if($flattenedProperty === null){ + //can't figure out how the new IDs are related to the old states - fallback to remappedStates + return false; + } + if($flattenedPropertyType === null){ + throw new AssumptionFailedError("This should never happen at this point"); + } + + $result->flattenedProperties[$oldName] = buildFlattenPropertyRule($flattenedPropertyMap, $flattenedProperty, $flattenedPropertyType); + unset($removedProperties[$flattenedProperty]); + } + //finally, write the results to the schema if(count($remappedPropertyValues) !== 0){ @@ -332,60 +392,69 @@ function findCommonSuffix(array $strings) : string{ return strrev(findCommonPrefix($reversed)); } +/** + * @param string[] $valueToId + * @phpstan-param array $valueToId + * @phpstan-param class-string $propertyType + */ +function buildFlattenPropertyRule(array $valueToId, string $propertyName, string $propertyType) : BlockStateUpgradeSchemaFlattenInfo{ + $ids = array_values($valueToId); + + //TODO: this is a bit too enthusiastic. For example, when flattening the old "stone", it will see that + //"granite", "andesite", "stone" etc all have "e" as a common suffix, which works, but looks a bit daft. + //This also causes more remaps to be generated than necessary, since some of the values are already + //contained in the new ID. + $idPrefix = findCommonPrefix($ids); + $idSuffix = findCommonSuffix($ids); + if(strlen($idSuffix) < 2){ + $idSuffix = ""; + } + + $valueMap = []; + foreach(Utils::stringifyKeys($valueToId) as $value => $newId){ + $newValue = substr($newId, strlen($idPrefix), $idSuffix !== "" ? -strlen($idSuffix) : null); + if($newValue !== $value){ + $valueMap[$value] = $newValue; + } + } + + $allNumeric = true; + if(count($valueMap) > 0){ + foreach(Utils::stringifyKeys($valueMap) as $value => $newValue){ + if(!is_numeric($value)){ + $allNumeric = false; + break; + } + } + if($allNumeric){ + //add a dummy key to force the JSON to be an object and not a list + $valueMap["dummy"] = "map_not_list"; + } + } + + return new BlockStateUpgradeSchemaFlattenInfo( + $idPrefix, + $propertyName, + $idSuffix, + $valueMap, + $propertyType, + ); +} + /** * @param string[][][] $candidateFlattenedValues * @phpstan-param array>> $candidateFlattenedValues * @param string[] $candidateFlattenPropertyTypes * @phpstan-param array> $candidateFlattenPropertyTypes * - * @return BlockStateUpgradeSchemaFlattenedName[][] - * @phpstan-return array> + * @return BlockStateUpgradeSchemaFlattenInfo[][] + * @phpstan-return array> */ function buildFlattenPropertyRules(array $candidateFlattenedValues, array $candidateFlattenPropertyTypes) : array{ $flattenPropertyRules = []; foreach(Utils::stringifyKeys($candidateFlattenedValues) as $propertyName => $filters){ foreach(Utils::stringifyKeys($filters) as $filter => $valueToId){ - $ids = array_values($valueToId); - - //TODO: this is a bit too enthusiastic. For example, when flattening the old "stone", it will see that - //"granite", "andesite", "stone" etc all have "e" as a common suffix, which works, but looks a bit daft. - //This also causes more remaps to be generated than necessary, since some of the values are already - //contained in the new ID. - $idPrefix = findCommonPrefix($ids); - $idSuffix = findCommonSuffix($ids); - if(strlen($idSuffix) < 2){ - $idSuffix = ""; - } - - $valueMap = []; - foreach(Utils::stringifyKeys($valueToId) as $value => $newId){ - $newValue = substr($newId, strlen($idPrefix), $idSuffix !== "" ? -strlen($idSuffix) : null); - if($newValue !== $value){ - $valueMap[$value] = $newValue; - } - } - - $allNumeric = true; - if(count($valueMap) > 0){ - foreach(Utils::stringifyKeys($valueMap) as $value => $newValue){ - if(!is_numeric($value)){ - $allNumeric = false; - break; - } - } - if($allNumeric){ - //add a dummy key to force the JSON to be an object and not a list - $valueMap["dummy"] = "map_not_list"; - } - } - - $flattenPropertyRules[$propertyName][$filter] = new BlockStateUpgradeSchemaFlattenedName( - $idPrefix, - $propertyName, - $idSuffix, - $valueMap, - $candidateFlattenPropertyTypes[$propertyName], - ); + $flattenPropertyRules[$propertyName][$filter] = buildFlattenPropertyRule($valueToId, $propertyName, $candidateFlattenPropertyTypes[$propertyName]); } } ksort($flattenPropertyRules, SORT_STRING); @@ -642,10 +711,15 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad throw new \RuntimeException("States with the same ID should be fully consistent"); } }else{ - //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap - //even if some of the states stay under the same ID, the compression techniques used by this function - //implicitly rely on knowing the full set of old states and their new transformations - $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); + //try processing this as a regular state group first + //if a property was flattened into the ID, the remaining states will normally be consistent + //if not we fall back to remap states and state filters + if(!processStateGroup($oldName, $blockStateMappings, $result)){ + //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap + //even if some of the states stay under the same ID, the compression techniques used by this function + //implicitly rely on knowing the full set of old states and their new transformations + $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); + } } } From d01203d7c4d48be9c7a92dbfa385ac8844ea1841 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 24 Oct 2024 18:50:28 +0100 Subject: [PATCH 1788/1858] Reduce code duplication --- tools/blockstate-upgrade-schema-utils.php | 81 +++++++++++------------ 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/tools/blockstate-upgrade-schema-utils.php b/tools/blockstate-upgrade-schema-utils.php index e1a5e7c3be..b7a9a4169d 100644 --- a/tools/blockstate-upgrade-schema-utils.php +++ b/tools/blockstate-upgrade-schema-utils.php @@ -295,25 +295,9 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra if($oldValue === null){ throw new AssumptionFailedError("We already checked that all states had consistent old properties"); } - //TODO: lots of similar logic to the remappedStates builder below - if(!$oldValue instanceof ByteTag && !$oldValue instanceof IntTag && !$oldValue instanceof StringTag){ - //unknown property type - bad candidate for flattening + if(!checkFlattenPropertySuitability($oldValue, $flattenedPropertyType, $pair->new->getName(), $valueMap)){ continue 2; } - if($flattenedPropertyType === null){ - $flattenedPropertyType = get_class($oldValue); - }elseif(!$oldValue instanceof $flattenedPropertyType){ - //property type mismatch - bad candidate for flattening - continue 2; - } - - $rawValue = (string) $oldValue->getValue(); - $existingNewId = $valueMap[$rawValue] ?? null; - if($existingNewId !== null && $existingNewId !== $pair->new->getName()){ - //this property value is associated with multiple new IDs - bad candidate for flattening - continue 2; - } - $valueMap[$rawValue] = $pair->new->getName(); } if($flattenedProperty !== null){ @@ -392,6 +376,37 @@ function findCommonSuffix(array $strings) : string{ return strrev(findCommonPrefix($reversed)); } +/** + * @param string[] $valueToIdMap + * @phpstan-param ?class-string $expectedType + * @phpstan-param-out class-string $expectedType + * @phpstan-param array $valueToIdMap + * @phpstan-param-out array $valueToIdMap + */ +function checkFlattenPropertySuitability(Tag $oldValue, ?string &$expectedType, string $actualNewId, array &$valueToIdMap) : bool{ + //TODO: lots of similar logic to the remappedStates builder below + if(!$oldValue instanceof ByteTag && !$oldValue instanceof IntTag && !$oldValue instanceof StringTag){ + //unknown property type - bad candidate for flattening + return false; + } + if($expectedType === null){ + $expectedType = get_class($oldValue); + }elseif(!$oldValue instanceof $expectedType){ + //property type mismatch - bad candidate for flattening + return false; + } + + $rawValue = (string) $oldValue->getValue(); + $existingNewId = $valueToIdMap[$rawValue] ?? null; + if($existingNewId !== null && $existingNewId !== $actualNewId){ + //this property value is associated with multiple new IDs - bad candidate for flattening + return false; + } + $valueToIdMap[$rawValue] = $actualNewId; + + return true; +} + /** * @param string[] $valueToId * @phpstan-param array $valueToId @@ -522,23 +537,6 @@ function processRemappedStates(array $upgradeTable) : array{ if(isset($notFlattenedProperties[$propertyName])){ continue; } - if(!$propertyValue instanceof StringTag && !$propertyValue instanceof IntTag && !$propertyValue instanceof ByteTag){ - $notFlattenedProperties[$propertyName] = true; - continue; - } - $previousType = $candidateFlattenedPropertyTypes[$propertyName] ?? null; - if($previousType !== null && $previousType !== get_class($propertyValue)){ - //mismatched types for the same property name - this has never happened so far, but it's not impossible - $notFlattenedProperties[$propertyName] = true; - continue; - } - $candidateFlattenedPropertyTypes[$propertyName] = get_class($propertyValue); - - $rawValue = (string) $propertyValue->getValue(); - if($rawValue === ""){ - $notFlattenedProperties[$propertyName] = true; - continue; - } $filter = $pair->old->getStates(); foreach($unchangedStatesByNewName[$pair->new->getName()] as $unchangedPropertyName){ @@ -551,16 +549,13 @@ function processRemappedStates(array $upgradeTable) : array{ unset($filter[$propertyName]); $rawFilter = encodeOrderedProperties($filter); - if(isset($candidateFlattenedValues[$propertyName][$rawFilter])){ - $valuesToIds = $candidateFlattenedValues[$propertyName][$rawFilter]; - $existingNewId = $valuesToIds[$rawValue] ?? null; - if($existingNewId !== null && $existingNewId !== $pair->new->getName()){ - //this old value is associated with multiple new IDs - bad candidate for flattening - $notFlattenedProperties[$propertyName] = true; - continue; - } + $candidateFlattenedValues[$propertyName][$rawFilter] ??= []; + $expectedType = $candidateFlattenedPropertyTypes[$propertyName] ?? null; + if(!checkFlattenPropertySuitability($propertyValue, $expectedType, $pair->new->getName(), $candidateFlattenedValues[$propertyName][$rawFilter])){ + $notFlattenedProperties[$propertyName] = true; + continue; } - $candidateFlattenedValues[$propertyName][$rawFilter][$rawValue] = $pair->new->getName(); + $candidateFlattenedPropertyTypes[$propertyName] = $expectedType; } } foreach(Utils::stringifyKeys($candidateFlattenedValues) as $propertyName => $filters){ From 4814db4fe7e5ed9cecf9889d3841788174fd0fd3 Mon Sep 17 00:00:00 2001 From: Dries C Date: Fri, 25 Oct 2024 15:21:51 +0200 Subject: [PATCH 1789/1858] Assemble 1.21.40 (#6471) --- composer.json | 8 +-- composer.lock | 50 +++++++++---------- src/data/bedrock/BedrockDataFiles.php | 1 + src/data/bedrock/block/BlockStateData.php | 4 +- src/data/bedrock/block/BlockStateNames.php | 1 - src/data/bedrock/block/BlockTypeNames.php | 9 +++- .../convert/BlockObjectToStateSerializer.php | 46 +++++++---------- .../convert/BlockStateDeserializerHelper.php | 5 +- .../BlockStateToObjectDeserializer.php | 35 ++++++++----- .../ItemSerializerDeserializerRegistrar.php | 10 ---- src/data/bedrock/item/ItemTypeNames.php | 16 ++++++ src/network/mcpe/InventoryManager.php | 8 +-- .../mcpe/handler/PreSpawnPacketHandler.php | 4 +- .../handler/ResourcePacksPacketHandler.php | 3 +- tools/generate-bedrock-data-from-packets.php | 2 +- 15 files changed, 107 insertions(+), 95 deletions(-) diff --git a/composer.json b/composer.json index 0b9e8ec6ba..9ecbad32fb 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.4.0+bedrock-1.21.30", - "pocketmine/bedrock-data": "~2.13.0+bedrock-1.21.30", - "pocketmine/bedrock-item-upgrade-schema": "~1.12.0+bedrock-1.21.30", - "pocketmine/bedrock-protocol": "~34.0.0+bedrock-1.21.30", + "pocketmine/bedrock-block-upgrade-schema": "~4.5.0+bedrock-1.21.40", + "pocketmine/bedrock-data": "~2.14.0+bedrock-1.21.40", + "pocketmine/bedrock-item-upgrade-schema": "~1.13.0+bedrock-1.21.40", + "pocketmine/bedrock-protocol": "~35.0.0+bedrock-1.21.40", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", diff --git a/composer.lock b/composer.lock index d023c74ace..d4cb38ddcd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e16d3ebe48e32bbf96348981249c0ac1", + "content-hash": "5c5882370131d2ae3a043819c05e6f9c", "packages": [ { "name": "adhocore/json-comment", @@ -127,16 +127,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.4.0", + "version": "4.5.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "89e5f6e19c29e0d0d24835639f72a5ef157c2761" + "reference": "7943b894e050d68dd21b5c7fa609827a4e2e30f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/89e5f6e19c29e0d0d24835639f72a5ef157c2761", - "reference": "89e5f6e19c29e0d0d24835639f72a5ef157c2761", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/7943b894e050d68dd21b5c7fa609827a4e2e30f1", + "reference": "7943b894e050d68dd21b5c7fa609827a4e2e30f1", "shasum": "" }, "type": "library", @@ -147,22 +147,22 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.4.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.5.0" }, - "time": "2024-09-17T16:06:36+00:00" + "time": "2024-10-23T16:15:24+00:00" }, { "name": "pocketmine/bedrock-data", - "version": "2.13.0+bedrock-1.21.30", + "version": "2.14.0+bedrock-1.21.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "23d9356b866654cbd2a62b31373118bedb4a2562" + "reference": "606d32ae426164b0615898b95d10e23293bed6ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/23d9356b866654cbd2a62b31373118bedb4a2562", - "reference": "23d9356b866654cbd2a62b31373118bedb4a2562", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/606d32ae426164b0615898b95d10e23293bed6ac", + "reference": "606d32ae426164b0615898b95d10e23293bed6ac", "shasum": "" }, "type": "library", @@ -173,22 +173,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.30" + "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.40" }, - "time": "2024-09-17T16:03:14+00:00" + "time": "2024-10-23T19:19:16+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.12.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "85a0014c7dfd4a25c22a9efb0b447afb7dc6c409" + "reference": "1dee9bbd0aaa65ed108b377b402746defe10b3b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/85a0014c7dfd4a25c22a9efb0b447afb7dc6c409", - "reference": "85a0014c7dfd4a25c22a9efb0b447afb7dc6c409", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/1dee9bbd0aaa65ed108b377b402746defe10b3b0", + "reference": "1dee9bbd0aaa65ed108b377b402746defe10b3b0", "shasum": "" }, "type": "library", @@ -199,22 +199,22 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.12.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.13.0" }, - "time": "2024-09-11T19:48:31+00:00" + "time": "2024-10-23T18:38:43+00:00" }, { "name": "pocketmine/bedrock-protocol", - "version": "34.0.0+bedrock-1.21.30", + "version": "35.0.0+bedrock-1.21.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "440c8078c66cc2a8f2abf58468df7df7246ee33b" + "reference": "6aa7cbeb4a7ec6fa58f9024aeaddad7c5c65a459" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/440c8078c66cc2a8f2abf58468df7df7246ee33b", - "reference": "440c8078c66cc2a8f2abf58468df7df7246ee33b", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/6aa7cbeb4a7ec6fa58f9024aeaddad7c5c65a459", + "reference": "6aa7cbeb4a7ec6fa58f9024aeaddad7c5c65a459", "shasum": "" }, "require": { @@ -245,9 +245,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/34.0.0+bedrock-1.21.30" + "source": "https://github.com/pmmp/BedrockProtocol/tree/35.0.0+bedrock-1.21.40" }, - "time": "2024-09-18T20:58:42+00:00" + "time": "2024-10-24T15:45:43+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/data/bedrock/BedrockDataFiles.php b/src/data/bedrock/BedrockDataFiles.php index 2c9350ca3b..5c476ca1c6 100644 --- a/src/data/bedrock/BedrockDataFiles.php +++ b/src/data/bedrock/BedrockDataFiles.php @@ -35,6 +35,7 @@ final class BedrockDataFiles{ public const BIOME_DEFINITIONS_FULL_NBT = BEDROCK_DATA_PATH . '/biome_definitions_full.nbt'; public const BIOME_ID_MAP_JSON = BEDROCK_DATA_PATH . '/biome_id_map.json'; public const BLOCK_ID_TO_ITEM_ID_MAP_JSON = BEDROCK_DATA_PATH . '/block_id_to_item_id_map.json'; + public const BLOCK_PROPERTIES_TABLE_JSON = BEDROCK_DATA_PATH . '/block_properties_table.json'; public const BLOCK_STATE_META_MAP_JSON = BEDROCK_DATA_PATH . '/block_state_meta_map.json'; public const CANONICAL_BLOCK_STATES_NBT = BEDROCK_DATA_PATH . '/canonical_block_states.nbt'; public const COMMAND_ARG_TYPES_JSON = BEDROCK_DATA_PATH . '/command_arg_types.json'; diff --git a/src/data/bedrock/block/BlockStateData.php b/src/data/bedrock/block/BlockStateData.php index f405e4cf6d..6624c4ae06 100644 --- a/src/data/bedrock/block/BlockStateData.php +++ b/src/data/bedrock/block/BlockStateData.php @@ -45,8 +45,8 @@ final class BlockStateData{ public const CURRENT_VERSION = (1 << 24) | //major (21 << 16) | //minor - (30 << 8) | //patch - (7); //revision + (40 << 8) | //patch + (1); //revision public const TAG_NAME = "name"; public const TAG_STATES = "states"; diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index c54822671f..0f4b874261 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -114,7 +114,6 @@ final class BlockStateNames{ public const SEA_GRASS_TYPE = "sea_grass_type"; public const STABILITY = "stability"; public const STABILITY_CHECK = "stability_check"; - public const STRIPPED_BIT = "stripped_bit"; public const STRUCTURE_BLOCK_TYPE = "structure_block_type"; public const SUSPENDED_BIT = "suspended_bit"; public const TOGGLE_BIT = "toggle_bit"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index ec55657151..029a5f6aad 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -262,6 +262,7 @@ final class BlockTypeNames{ public const CRACKED_STONE_BRICKS = "minecraft:cracked_stone_bricks"; public const CRAFTER = "minecraft:crafter"; public const CRAFTING_TABLE = "minecraft:crafting_table"; + public const CREEPER_HEAD = "minecraft:creeper_head"; public const CRIMSON_BUTTON = "minecraft:crimson_button"; public const CRIMSON_DOOR = "minecraft:crimson_door"; public const CRIMSON_DOUBLE_SLAB = "minecraft:crimson_double_slab"; @@ -384,6 +385,7 @@ final class BlockTypeNames{ public const DISPENSER = "minecraft:dispenser"; public const DOUBLE_CUT_COPPER_SLAB = "minecraft:double_cut_copper_slab"; public const DRAGON_EGG = "minecraft:dragon_egg"; + public const DRAGON_HEAD = "minecraft:dragon_head"; public const DRIED_KELP_BLOCK = "minecraft:dried_kelp_block"; public const DRIPSTONE_BLOCK = "minecraft:dripstone_block"; public const DROPPER = "minecraft:dropper"; @@ -797,6 +799,7 @@ final class BlockTypeNames{ public const MUD_BRICK_WALL = "minecraft:mud_brick_wall"; public const MUD_BRICKS = "minecraft:mud_bricks"; public const MUDDY_MANGROVE_ROOTS = "minecraft:muddy_mangrove_roots"; + public const MUSHROOM_STEM = "minecraft:mushroom_stem"; public const MYCELIUM = "minecraft:mycelium"; public const NETHER_BRICK = "minecraft:nether_brick"; public const NETHER_BRICK_DOUBLE_SLAB = "minecraft:nether_brick_double_slab"; @@ -857,6 +860,7 @@ final class BlockTypeNames{ public const PEONY = "minecraft:peony"; public const PETRIFIED_OAK_DOUBLE_SLAB = "minecraft:petrified_oak_double_slab"; public const PETRIFIED_OAK_SLAB = "minecraft:petrified_oak_slab"; + public const PIGLIN_HEAD = "minecraft:piglin_head"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; public const PINK_CARPET = "minecraft:pink_carpet"; @@ -874,6 +878,7 @@ final class BlockTypeNames{ public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; public const PITCHER_CROP = "minecraft:pitcher_crop"; public const PITCHER_PLANT = "minecraft:pitcher_plant"; + public const PLAYER_HEAD = "minecraft:player_head"; public const PODZOL = "minecraft:podzol"; public const POINTED_DRIPSTONE = "minecraft:pointed_dripstone"; public const POLISHED_ANDESITE = "minecraft:polished_andesite"; @@ -1009,7 +1014,7 @@ final class BlockTypeNames{ public const SHORT_GRASS = "minecraft:short_grass"; public const SHROOMLIGHT = "minecraft:shroomlight"; public const SILVER_GLAZED_TERRACOTTA = "minecraft:silver_glazed_terracotta"; - public const SKULL = "minecraft:skull"; + public const SKELETON_SKULL = "minecraft:skeleton_skull"; public const SLIME = "minecraft:slime"; public const SMALL_AMETHYST_BUD = "minecraft:small_amethyst_bud"; public const SMALL_DRIPLEAF_BLOCK = "minecraft:small_dripleaf_block"; @@ -1229,6 +1234,7 @@ final class BlockTypeNames{ public const WHITE_TULIP = "minecraft:white_tulip"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; + public const WITHER_SKELETON_SKULL = "minecraft:wither_skeleton_skull"; public const WOODEN_BUTTON = "minecraft:wooden_button"; public const WOODEN_DOOR = "minecraft:wooden_door"; public const WOODEN_PRESSURE_PLATE = "minecraft:wooden_pressure_plate"; @@ -1243,4 +1249,5 @@ final class BlockTypeNames{ public const YELLOW_STAINED_GLASS_PANE = "minecraft:yellow_stained_glass_pane"; public const YELLOW_TERRACOTTA = "minecraft:yellow_terracotta"; public const YELLOW_WOOL = "minecraft:yellow_wool"; + public const ZOMBIE_HEAD = "minecraft:zombie_head"; } diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index af65477297..a7fee6efba 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -151,6 +151,7 @@ use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; +use pocketmine\block\utils\MobHeadType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Vine; use pocketmine\block\Wall; @@ -205,6 +206,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->registerFlatWoodBlockSerializers(); $this->registerLeavesSerializers(); $this->registerSaplingSerializers(); + $this->registerMobHeadSerializers(); $this->registerSimpleSerializers(); $this->registerSerializers(); } @@ -624,17 +626,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::CHERRY_PLANKS(), Ids::CHERRY_PLANKS); $this->mapSlab(Blocks::CHERRY_SLAB(), Ids::CHERRY_SLAB, Ids::CHERRY_DOUBLE_SLAB); $this->mapStairs(Blocks::CHERRY_STAIRS(), Ids::CHERRY_STAIRS); - $this->map(Blocks::CHERRY_WOOD(), function(Wood $block) : Writer{ - //we can't use the standard method for this because cherry_wood has a useless property attached to it - if(!$block->isStripped()){ - return Writer::create(Ids::CHERRY_WOOD) - ->writePillarAxis($block->getAxis()) - ->writeBool(StateNames::STRIPPED_BIT, false); //this is useless, but it has to be written - }else{ - return Writer::create(Ids::STRIPPED_CHERRY_WOOD) - ->writePillarAxis($block->getAxis()); - } - }); + $this->mapLog(Blocks::CHERRY_WOOD(), Ids::CHERRY_WOOD, Ids::STRIPPED_CHERRY_WOOD); $this->map(Blocks::CRIMSON_BUTTON(), fn(Button $block) => Helper::encodeButton($block, new Writer(Ids::CRIMSON_BUTTON))); $this->map(Blocks::CRIMSON_DOOR(), fn(Door $block) => Helper::encodeDoor($block, new Writer(Ids::CRIMSON_DOOR))); @@ -690,17 +682,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->mapSimple(Blocks::MANGROVE_PLANKS(), Ids::MANGROVE_PLANKS); $this->mapSlab(Blocks::MANGROVE_SLAB(), Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB); $this->mapStairs(Blocks::MANGROVE_STAIRS(), Ids::MANGROVE_STAIRS); - $this->map(Blocks::MANGROVE_WOOD(), function(Wood $block) : Writer{ - //we can't use the standard method for this because mangrove_wood has a useless property attached to it - if(!$block->isStripped()){ - return Writer::create(Ids::MANGROVE_WOOD) - ->writePillarAxis($block->getAxis()) - ->writeBool(StateNames::STRIPPED_BIT, false); //this is useless, but it has to be written - }else{ - return Writer::create(Ids::STRIPPED_MANGROVE_WOOD) - ->writePillarAxis($block->getAxis()); - } - }); + $this->mapLog(Blocks::MANGROVE_WOOD(), Ids::MANGROVE_WOOD, Ids::STRIPPED_MANGROVE_WOOD); $this->map(Blocks::OAK_BUTTON(), fn(WoodenButton $block) => Helper::encodeButton($block, new Writer(Ids::WOODEN_BUTTON))); $this->map(Blocks::OAK_DOOR(), fn(WoodenDoor $block) => Helper::encodeDoor($block, new Writer(Ids::WOODEN_DOOR))); @@ -775,6 +757,18 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ } } + private function registerMobHeadSerializers() : void{ + $this->map(Blocks::MOB_HEAD(), fn(MobHead $block) => Writer::create(match ($block->getMobHeadType()){ + MobHeadType::CREEPER => Ids::CREEPER_HEAD, + MobHeadType::DRAGON => Ids::DRAGON_HEAD, + MobHeadType::PIGLIN => Ids::PIGLIN_HEAD, + MobHeadType::PLAYER => Ids::PLAYER_HEAD, + MobHeadType::SKELETON => Ids::SKELETON_SKULL, + MobHeadType::WITHER_SKELETON => Ids::WITHER_SKELETON_SKULL, + MobHeadType::ZOMBIE => Ids::ZOMBIE_HEAD, + })->writeFacingWithoutDown($block->getFacing())); + } + private function registerSimpleSerializers() : void{ $this->mapSimple(Blocks::AIR(), Ids::AIR); $this->mapSimple(Blocks::AMETHYST(), Ids::AMETHYST_BLOCK); @@ -1078,7 +1072,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ ->writeBool(StateNames::RAIL_DATA_BIT, $block->isPowered()) ->writeInt(StateNames::RAIL_DIRECTION, $block->getShape()); }); - $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + $this->map(Blocks::ALL_SIDED_MUSHROOM_STEM(), fn() => Writer::create(Ids::MUSHROOM_STEM) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM)); $this->map(Blocks::AMETHYST_CLUSTER(), fn(AmethystCluster $block) => Writer::create( match($stage = $block->getStage()){ @@ -1483,10 +1477,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ }); $this->map(Blocks::MATERIAL_REDUCER(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::MATERIAL_REDUCER))); $this->map(Blocks::MELON_STEM(), fn(MelonStem $block) => Helper::encodeStem($block, new Writer(Ids::MELON_STEM))); - $this->map(Blocks::MOB_HEAD(), function(MobHead $block) : Writer{ - return Writer::create(Ids::SKULL) - ->writeFacingWithoutDown($block->getFacing()); - }); $this->mapSlab(Blocks::MOSSY_COBBLESTONE_SLAB(), Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB); $this->mapStairs(Blocks::MOSSY_COBBLESTONE_STAIRS(), Ids::MOSSY_COBBLESTONE_STAIRS); $this->map(Blocks::MOSSY_COBBLESTONE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::MOSSY_COBBLESTONE_WALL))); @@ -1498,7 +1488,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::MUD_BRICK_WALL(), fn(Wall $block) => Helper::encodeWall($block, new Writer(Ids::MUD_BRICK_WALL))); $this->map(Blocks::MUDDY_MANGROVE_ROOTS(), fn(SimplePillar $block) => Writer::create(Ids::MUDDY_MANGROVE_ROOTS) ->writePillarAxis($block->getAxis())); - $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::BROWN_MUSHROOM_BLOCK) + $this->map(Blocks::MUSHROOM_STEM(), fn() => Writer::create(Ids::MUSHROOM_STEM) ->writeInt(StateNames::HUGE_MUSHROOM_BITS, BlockLegacyMetadata::MUSHROOM_BLOCK_STEM)); $this->mapSlab(Blocks::NETHER_BRICK_SLAB(), Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB); $this->mapStairs(Blocks::NETHER_BRICK_STAIRS(), Ids::NETHER_BRICK_STAIRS); diff --git a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php index 47c0fd4afa..c51cda7688 100644 --- a/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateDeserializerHelper.php @@ -50,7 +50,6 @@ use pocketmine\block\Stem; use pocketmine\block\Trapdoor; use pocketmine\block\utils\CopperOxidation; use pocketmine\block\utils\SlabType; -use pocketmine\block\VanillaBlocks; use pocketmine\block\Wall; use pocketmine\block\WallSign; use pocketmine\block\WeightedPressurePlate; @@ -210,8 +209,8 @@ final class BlockStateDeserializerHelper{ /** @throws BlockStateDeserializeException */ public static function decodeMushroomBlock(RedMushroomBlock $block, BlockStateReader $in) : Block{ switch($type = $in->readBoundedInt(BlockStateNames::HUGE_MUSHROOM_BITS, 0, 15)){ - case BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM: return VanillaBlocks::ALL_SIDED_MUSHROOM_STEM(); - case BlockLegacyMetadata::MUSHROOM_BLOCK_STEM: return VanillaBlocks::MUSHROOM_STEM(); + case BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM: + case BlockLegacyMetadata::MUSHROOM_BLOCK_STEM: throw new BlockStateDeserializeException("This state does not exist"); default: //invalid types get left as default $type = MushroomBlockTypeIdMap::getInstance()->fromId($type); diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index eb0cb8d506..405f6e53e0 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -45,6 +45,7 @@ use pocketmine\block\utils\DripleafState; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\FroglightType; use pocketmine\block\utils\LeverFacing; +use pocketmine\block\utils\MobHeadType; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\block\Wood; use pocketmine\data\bedrock\block\BlockLegacyMetadata; @@ -85,6 +86,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->registerLeavesDeserializers(); $this->registerSaplingDeserializers(); $this->registerLightDeserializers(); + $this->registerMobHeadDeserializers(); $this->registerSimpleDeserializers(); $this->registerDeserializers(); } @@ -531,10 +533,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::CHERRY_PLANKS, fn() => Blocks::CHERRY_PLANKS()); $this->mapSlab(Ids::CHERRY_SLAB, Ids::CHERRY_DOUBLE_SLAB, fn() => Blocks::CHERRY_SLAB()); $this->mapStairs(Ids::CHERRY_STAIRS, fn() => Blocks::CHERRY_STAIRS()); - $this->map(Ids::CHERRY_WOOD, function(Reader $in){ - $in->ignored(StateNames::STRIPPED_BIT); //this is also ignored by vanilla - return Helper::decodeLog(Blocks::CHERRY_WOOD(), false, $in); - }); + $this->map(Ids::CHERRY_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::CHERRY_WOOD(), false, $in)); $this->map(Ids::STRIPPED_CHERRY_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::CHERRY_WOOD(), true, $in)); $this->map(Ids::CRIMSON_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CRIMSON_BUTTON(), $in)); @@ -591,10 +590,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSimple(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS()); $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB()); $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS()); - $this->map(Ids::MANGROVE_WOOD, function(Reader $in){ - $in->ignored(StateNames::STRIPPED_BIT); //this is also ignored by vanilla - return Helper::decodeLog(Blocks::MANGROVE_WOOD(), false, $in); - }); + $this->map(Ids::MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(), false, $in)); $this->map(Ids::STRIPPED_MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(), true, $in)); //oak - due to age, many of these don't specify "oak", making for confusing reading @@ -690,6 +686,20 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ } } + private function registerMobHeadDeserializers() : void{ + foreach([ + Ids::CREEPER_HEAD => MobHeadType::CREEPER, + Ids::DRAGON_HEAD => MobHeadType::DRAGON, + Ids::PIGLIN_HEAD => MobHeadType::PIGLIN, + Ids::PLAYER_HEAD => MobHeadType::PLAYER, + Ids::SKELETON_SKULL => MobHeadType::SKELETON, + Ids::WITHER_SKELETON_SKULL => MobHeadType::WITHER_SKELETON, + Ids::ZOMBIE_HEAD => MobHeadType::ZOMBIE + ] as $id => $mobHeadType){ + $this->map($id, fn(Reader $in) => Blocks::MOB_HEAD()->setMobHeadType($mobHeadType)->setFacing($in->readFacingWithoutDown())); + } + } + private function registerSimpleDeserializers() : void{ $this->mapSimple(Ids::AIR, fn() => Blocks::AIR()); $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST()); @@ -1099,6 +1109,11 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapSlab(Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB, fn() => Blocks::BRICK_SLAB()); $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS()); $this->map(Ids::BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BRICK_WALL(), $in)); + $this->map(Ids::MUSHROOM_STEM, fn(Reader $in) => match($in->readBoundedInt(StateNames::HUGE_MUSHROOM_BITS, 0, 15)){ + BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM => Blocks::ALL_SIDED_MUSHROOM_STEM(), + BlockLegacyMetadata::MUSHROOM_BLOCK_STEM => Blocks::MUSHROOM_STEM(), + default => throw new BlockStateDeserializeException("This state does not exist"), + }); $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in)); $this->map(Ids::CACTUS, function(Reader $in) : Block{ return Blocks::CACTUS() @@ -1521,10 +1536,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1) ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT)); }); - $this->map(Ids::SKULL, function(Reader $in) : Block{ - return Blocks::MOB_HEAD() - ->setFacing($in->readFacingWithoutDown()); - }); $this->map(Ids::SMOKER, function(Reader $in) : Block{ return Blocks::SMOKER() ->setFacing($in->readCardinalHorizontalFacing()) diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 7a720559ea..0af17bc733 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -25,7 +25,6 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Bed; use pocketmine\block\Block; -use pocketmine\block\MobHead; use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\CompoundTypeIds; @@ -33,7 +32,6 @@ use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; use pocketmine\data\bedrock\MedicineTypeIdMap; -use pocketmine\data\bedrock\MobHeadTypeIdMap; use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; use pocketmine\item\Banner; @@ -464,14 +462,6 @@ final class ItemSerializerDeserializerRegistrar{ }, fn(Bed $block) => DyeColorIdMap::getInstance()->toId($block->getColor()) ); - $this->map1to1BlockWithMeta( - Ids::SKULL, - Blocks::MOB_HEAD(), - function(MobHead $block, int $meta) : void{ - $block->setMobHeadType(MobHeadTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown mob head type ID $meta")); - }, - fn(MobHead $block) => MobHeadTypeIdMap::getInstance()->toId($block->getMobHeadType()) - ); } /** diff --git a/src/data/bedrock/item/ItemTypeNames.php b/src/data/bedrock/item/ItemTypeNames.php index 06ae28cec0..03b32d4826 100644 --- a/src/data/bedrock/item/ItemTypeNames.php +++ b/src/data/bedrock/item/ItemTypeNames.php @@ -66,12 +66,14 @@ final class ItemTypeNames{ public const BIRCH_DOOR = "minecraft:birch_door"; public const BIRCH_HANGING_SIGN = "minecraft:birch_hanging_sign"; public const BIRCH_SIGN = "minecraft:birch_sign"; + public const BLACK_BUNDLE = "minecraft:black_bundle"; public const BLACK_DYE = "minecraft:black_dye"; public const BLADE_POTTERY_SHERD = "minecraft:blade_pottery_sherd"; public const BLAZE_POWDER = "minecraft:blaze_powder"; public const BLAZE_ROD = "minecraft:blaze_rod"; public const BLAZE_SPAWN_EGG = "minecraft:blaze_spawn_egg"; public const BLEACH = "minecraft:bleach"; + public const BLUE_BUNDLE = "minecraft:blue_bundle"; public const BLUE_DYE = "minecraft:blue_dye"; public const BOAT = "minecraft:boat"; public const BOGGED_SPAWN_EGG = "minecraft:bogged_spawn_egg"; @@ -88,6 +90,7 @@ final class ItemTypeNames{ public const BREWER_POTTERY_SHERD = "minecraft:brewer_pottery_sherd"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK = "minecraft:brick"; + public const BROWN_BUNDLE = "minecraft:brown_bundle"; public const BROWN_DYE = "minecraft:brown_dye"; public const BRUSH = "minecraft:brush"; public const BUCKET = "minecraft:bucket"; @@ -157,6 +160,7 @@ final class ItemTypeNames{ public const CRIMSON_HANGING_SIGN = "minecraft:crimson_hanging_sign"; public const CRIMSON_SIGN = "minecraft:crimson_sign"; public const CROSSBOW = "minecraft:crossbow"; + public const CYAN_BUNDLE = "minecraft:cyan_bundle"; public const CYAN_DYE = "minecraft:cyan_dye"; public const DANGER_POTTERY_SHERD = "minecraft:danger_pottery_sherd"; public const DARK_OAK_BOAT = "minecraft:dark_oak_boat"; @@ -255,7 +259,9 @@ final class ItemTypeNames{ public const GOLDEN_PICKAXE = "minecraft:golden_pickaxe"; public const GOLDEN_SHOVEL = "minecraft:golden_shovel"; public const GOLDEN_SWORD = "minecraft:golden_sword"; + public const GRAY_BUNDLE = "minecraft:gray_bundle"; public const GRAY_DYE = "minecraft:gray_dye"; + public const GREEN_BUNDLE = "minecraft:green_bundle"; public const GREEN_DYE = "minecraft:green_dye"; public const GUARDIAN_SPAWN_EGG = "minecraft:guardian_spawn_egg"; public const GUNPOWDER = "minecraft:gunpowder"; @@ -309,8 +315,11 @@ final class ItemTypeNames{ public const LEAVES = "minecraft:leaves"; public const LEAVES2 = "minecraft:leaves2"; public const LIGHT_BLOCK = "minecraft:light_block"; + public const LIGHT_BLUE_BUNDLE = "minecraft:light_blue_bundle"; public const LIGHT_BLUE_DYE = "minecraft:light_blue_dye"; + public const LIGHT_GRAY_BUNDLE = "minecraft:light_gray_bundle"; public const LIGHT_GRAY_DYE = "minecraft:light_gray_dye"; + public const LIME_BUNDLE = "minecraft:lime_bundle"; public const LIME_DYE = "minecraft:lime_dye"; public const LINGERING_POTION = "minecraft:lingering_potion"; public const LLAMA_SPAWN_EGG = "minecraft:llama_spawn_egg"; @@ -318,6 +327,7 @@ final class ItemTypeNames{ public const LOG = "minecraft:log"; public const LOG2 = "minecraft:log2"; public const MACE = "minecraft:mace"; + public const MAGENTA_BUNDLE = "minecraft:magenta_bundle"; public const MAGENTA_DYE = "minecraft:magenta_dye"; public const MAGMA_CREAM = "minecraft:magma_cream"; public const MAGMA_CUBE_SPAWN_EGG = "minecraft:magma_cube_spawn_egg"; @@ -384,6 +394,7 @@ final class ItemTypeNames{ public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg"; public const OMINOUS_BOTTLE = "minecraft:ominous_bottle"; public const OMINOUS_TRIAL_KEY = "minecraft:ominous_trial_key"; + public const ORANGE_BUNDLE = "minecraft:orange_bundle"; public const ORANGE_DYE = "minecraft:orange_dye"; public const OXIDIZED_COPPER_DOOR = "minecraft:oxidized_copper_door"; public const PAINTING = "minecraft:painting"; @@ -397,6 +408,7 @@ final class ItemTypeNames{ public const PIGLIN_BRUTE_SPAWN_EGG = "minecraft:piglin_brute_spawn_egg"; public const PIGLIN_SPAWN_EGG = "minecraft:piglin_spawn_egg"; public const PILLAGER_SPAWN_EGG = "minecraft:pillager_spawn_egg"; + public const PINK_BUNDLE = "minecraft:pink_bundle"; public const PINK_DYE = "minecraft:pink_dye"; public const PITCHER_POD = "minecraft:pitcher_pod"; public const PLANKS = "minecraft:planks"; @@ -416,6 +428,7 @@ final class ItemTypeNames{ public const PUFFERFISH_SPAWN_EGG = "minecraft:pufferfish_spawn_egg"; public const PUMPKIN_PIE = "minecraft:pumpkin_pie"; public const PUMPKIN_SEEDS = "minecraft:pumpkin_seeds"; + public const PURPLE_BUNDLE = "minecraft:purple_bundle"; public const PURPLE_DYE = "minecraft:purple_dye"; public const QUARTZ = "minecraft:quartz"; public const RABBIT = "minecraft:rabbit"; @@ -430,6 +443,7 @@ final class ItemTypeNames{ public const RAW_GOLD = "minecraft:raw_gold"; public const RAW_IRON = "minecraft:raw_iron"; public const RECOVERY_COMPASS = "minecraft:recovery_compass"; + public const RED_BUNDLE = "minecraft:red_bundle"; public const RED_DYE = "minecraft:red_dye"; public const RED_FLOWER = "minecraft:red_flower"; public const REDSTONE = "minecraft:redstone"; @@ -537,6 +551,7 @@ final class ItemTypeNames{ public const WEATHERED_COPPER_DOOR = "minecraft:weathered_copper_door"; public const WHEAT = "minecraft:wheat"; public const WHEAT_SEEDS = "minecraft:wheat_seeds"; + public const WHITE_BUNDLE = "minecraft:white_bundle"; public const WHITE_DYE = "minecraft:white_dye"; public const WILD_ARMOR_TRIM_SMITHING_TEMPLATE = "minecraft:wild_armor_trim_smithing_template"; public const WIND_CHARGE = "minecraft:wind_charge"; @@ -556,6 +571,7 @@ final class ItemTypeNames{ public const WOOL = "minecraft:wool"; public const WRITABLE_BOOK = "minecraft:writable_book"; public const WRITTEN_BOOK = "minecraft:written_book"; + public const YELLOW_BUNDLE = "minecraft:yellow_bundle"; public const YELLOW_DYE = "minecraft:yellow_dye"; public const ZOGLIN_SPAWN_EGG = "minecraft:zoglin_spawn_egg"; public const ZOMBIE_HORSE_SPAWN_EGG = "minecraft:zombie_horse_spawn_egg"; diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 99af737072..c0969b61b2 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -502,7 +502,7 @@ class InventoryManager{ $windowId, $netSlot, new FullContainerName($this->lastInventoryNetworkId), - 0, + new ItemStackWrapper(0, ItemStack::null()), new ItemStackWrapper(0, ItemStack::null()) )); } @@ -511,7 +511,7 @@ class InventoryManager{ $windowId, $netSlot, new FullContainerName($this->lastInventoryNetworkId), - 0, + new ItemStackWrapper(0, ItemStack::null()), $itemStackWrapper )); } @@ -532,10 +532,10 @@ class InventoryManager{ $windowId, array_fill_keys(array_keys($itemStackWrappers), new ItemStackWrapper(0, ItemStack::null())), new FullContainerName($this->lastInventoryNetworkId), - 0 + new ItemStackWrapper(0, ItemStack::null()) )); //now send the real contents - $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers, new FullContainerName($this->lastInventoryNetworkId), 0)); + $this->session->sendDataPacket(InventoryContentPacket::create($windowId, $itemStackWrappers, new FullContainerName($this->lastInventoryNetworkId), new ItemStackWrapper(0, ItemStack::null()))); } public function syncSlot(Inventory $inventory, int $slot, ItemStack $itemStack) : void{ diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index f80bacfc18..b80874938c 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -39,7 +39,7 @@ use pocketmine\network\mcpe\protocol\types\Experiments; use pocketmine\network\mcpe\protocol\types\LevelSettings; use pocketmine\network\mcpe\protocol\types\NetworkPermissions; use pocketmine\network\mcpe\protocol\types\PlayerMovementSettings; -use pocketmine\network\mcpe\protocol\types\PlayerMovementType; +use pocketmine\network\mcpe\protocol\types\ServerAuthMovementMode; use pocketmine\network\mcpe\protocol\types\SpawnSettings; use pocketmine\player\Player; use pocketmine\Server; @@ -98,7 +98,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $this->server->getMotd(), "", false, - new PlayerMovementSettings(PlayerMovementType::SERVER_AUTHORITATIVE_V1, 0, false), + new PlayerMovementSettings(ServerAuthMovementMode::SERVER_AUTHORITATIVE_V2, 0, false), 0, 0, "", diff --git a/src/network/mcpe/handler/ResourcePacksPacketHandler.php b/src/network/mcpe/handler/ResourcePacksPacketHandler.php index 5f7fb0e4b9..5e26713946 100644 --- a/src/network/mcpe/handler/ResourcePacksPacketHandler.php +++ b/src/network/mcpe/handler/ResourcePacksPacketHandler.php @@ -117,8 +117,7 @@ class ResourcePacksPacketHandler extends PacketHandler{ resourcePackEntries: $resourcePackEntries, mustAccept: $this->mustAccept, hasAddons: false, - hasScripts: false, - cdnUrls: [] + hasScripts: false )); $this->session->getLogger()->debug("Waiting for client to accept resource packs"); } diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 16c3062b84..0cb5ac3667 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -399,7 +399,7 @@ class ParserPacketHandler extends PacketHandler{ CraftingDataPacket::ENTRY_FURNACE => "smelting", CraftingDataPacket::ENTRY_FURNACE_DATA => "smelting", CraftingDataPacket::ENTRY_MULTI => "special_hardcoded", - CraftingDataPacket::ENTRY_SHULKER_BOX => "shapeless_shulker_box", + CraftingDataPacket::ENTRY_USER_DATA_SHAPELESS => "shapeless_shulker_box", CraftingDataPacket::ENTRY_SHAPELESS_CHEMISTRY => "shapeless_chemistry", CraftingDataPacket::ENTRY_SHAPED_CHEMISTRY => "shaped_chemistry", CraftingDataPacket::ENTRY_SMITHING_TRANSFORM => "smithing", From d372af351afd945ff44e3597db32ce81b2310259 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 26 Oct 2024 15:40:22 +0100 Subject: [PATCH 1790/1858] Fix changelog typo --- changelogs/5.19.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/5.19.md b/changelogs/5.19.md index 57d322bf79..6768c38e5d 100644 --- a/changelogs/5.19.md +++ b/changelogs/5.19.md @@ -1,5 +1,5 @@ # 5.19.0 -Released 21tst September 2024. +Released 21st September 2024. **For Minecraft: Bedrock Edition 1.21.30** From 414e8acf8c6d451e2614201a5dabc0b2f2887486 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 26 Oct 2024 15:42:43 +0100 Subject: [PATCH 1791/1858] Release 5.20.0 --- changelogs/5.20.md | 19 +++++++++++++++++++ src/VersionInfo.php | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.20.md diff --git a/changelogs/5.20.md b/changelogs/5.20.md new file mode 100644 index 0000000000..8d7e971d93 --- /dev/null +++ b/changelogs/5.20.md @@ -0,0 +1,19 @@ +# 5.20.0 +Released 26th October 2024. + +**For Minecraft: Bedrock Edition 1.21.40** + +This is a support release for Minecraft: Bedrock Edition 1.21.40. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## General +- Added support for Minecraft: Bedrock Edition 1.21.40. +- Removed support for earlier versions. + +## Fixes +- Fixed a bug in `tools/generate-blockstate-upgrade-schema.php` that caused it to fail on 1.21.40 with the new mushroom block changes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b2d2fe4abe..b61df1001a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.19.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.20.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From e7d8d99ca6086111a607cc79a8e8e64e6532df24 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 26 Oct 2024 15:42:43 +0100 Subject: [PATCH 1792/1858] 5.20.1 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index b61df1001a..11c5b1c88d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.20.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.20.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 8ef5e737de5689ba83a9bf66b6efa147171452ce Mon Sep 17 00:00:00 2001 From: Dries C Date: Sun, 27 Oct 2024 02:29:34 +0200 Subject: [PATCH 1793/1858] Temporary resolve loading old skulls from storage (#6476) --- .../bedrock/item/upgrade/ItemDataUpgrader.php | 15 +++++++++++++++ src/world/format/io/GlobalItemDataHandlers.php | 6 +++++- src/world/format/io/data/BedrockWorldData.php | 6 +++--- src/world/format/io/leveldb/ChunkVersion.php | 1 + src/world/format/io/leveldb/LevelDB.php | 4 +++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index d7d097de82..7b34ffcb6e 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock\item\upgrade; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\item\SavedItemData; use pocketmine\data\bedrock\item\SavedItemStackData; use pocketmine\data\SavedDataLoadingException; @@ -35,6 +36,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\StringTag; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\Binary; use function assert; @@ -46,6 +48,8 @@ final class ItemDataUpgrader{ private LegacyItemIdToStringIdMap $legacyIntToStringIdMap, private R12ItemIdToBlockIdMap $r12ItemIdToBlockIdMap, private BlockDataUpgrader $blockDataUpgrader, + private BlockItemIdMap $blockItemIdMap, + private BlockStateDictionary $blockStateDictionary ){} /** @@ -148,6 +152,17 @@ final class ItemDataUpgrader{ [$newNameId, $newMeta] = $this->idMetaUpgrader->upgrade($rawNameId, $meta); + //TODO: Dirty hack to load old skulls from disk: Put this into item upgrade schema's before Mojang makes something with a non 0 default state + if($blockStateData === null && ($blockId = $this->blockItemIdMap->lookupBlockId($newNameId)) !== null){ + $networkRuntimeId = $this->blockStateDictionary->lookupStateIdFromIdMeta($blockId, 0); + + if($networkRuntimeId === null){ + throw new SavedDataLoadingException("Failed to find blockstate for blockitem $newNameId"); + } + + $blockStateData = $this->blockStateDictionary->generateDataFromStateId($networkRuntimeId); + } + //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? //TODO: read version from VersionInfo::TAG_WORLD_DATA_VERSION - we may need it to fix up old items diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index ea5568c7cb..f622584784 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io; +use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; @@ -30,6 +31,7 @@ use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgrader; use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgradeSchemaUtils; use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\bedrock\item\upgrade\R12ItemIdToBlockIdMap; +use pocketmine\network\mcpe\convert\TypeConverter; use Symfony\Component\Filesystem\Path; use const PHP_INT_MAX; use const pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH; @@ -54,7 +56,9 @@ final class GlobalItemDataHandlers{ new ItemIdMetaUpgrader(ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), PHP_INT_MAX)), LegacyItemIdToStringIdMap::getInstance(), R12ItemIdToBlockIdMap::getInstance(), - GlobalBlockStateHandlers::getUpgrader() + GlobalBlockStateHandlers::getUpgrader(), + BlockItemIdMap::getInstance(), + TypeConverter::getInstance()->getBlockTranslator()->getBlockStateDictionary() ); } } diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index 1612e7d846..b2e079124a 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -51,12 +51,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 729; + public const CURRENT_STORAGE_NETWORK_VERSION = 748; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major 21, //minor - 30, //patch - 3, //revision + 40, //patch + 1, //revision 0 //is beta ]; diff --git a/src/world/format/io/leveldb/ChunkVersion.php b/src/world/format/io/leveldb/ChunkVersion.php index e399570de9..a69e4ff459 100644 --- a/src/world/format/io/leveldb/ChunkVersion.php +++ b/src/world/format/io/leveldb/ChunkVersion.php @@ -71,4 +71,5 @@ final class ChunkVersion{ public const v1_18_0_24_unused = 38; public const v1_18_0_25_beta = 39; public const v1_18_30 = 40; + public const v1_21_40 = 41; } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 20b55922cd..dda489d317 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -78,7 +78,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ protected const ENTRY_FLAT_WORLD_LAYERS = "game_flatworldlayers"; - protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_18_30; + protected const CURRENT_LEVEL_CHUNK_VERSION = ChunkVersion::v1_21_40; protected const CURRENT_LEVEL_SUBCHUNK_VERSION = SubChunkVersion::PALETTED_MULTI; private const CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET = 4; @@ -654,6 +654,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; switch($chunkVersion){ + case ChunkVersion::v1_21_40: + //TODO: BiomeStates became shorts instead of bytes case ChunkVersion::v1_18_30: case ChunkVersion::v1_18_0_25_beta: case ChunkVersion::v1_18_0_24_unused: From 0065fe649fa0d1e90d618a650e5b27cb1e89bca6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 31 Oct 2024 13:52:15 +0000 Subject: [PATCH 1794/1858] New release workflow triggered by the merge of a PR changing IS_DEVELOPMENT_BUILD to false This is more streamlined than the previous approach, and works better for a world where 1 person isn't doing all the work. Now, the flow is simpler: - Do changes (e.g. protocol update), changelog & set IS_DEVELOPMENT_BUILD to false all in a single PR, which can be squash-merged if desired - Once the PR is merged, a draft release will be prepared - RestrictedActions will automatically set IS_DEVELOPMENT_BUILD back to true and bump the version - Tag will be created when the release is published Previously, multiple PRs might be needed, and the PR containing the release changelog couldn't be squash-merged. Manual intervention was also required to create a tag and prepare a release. This PR also includes new CI checks to check for basic errors like forgotten changelog files to ensure changelog links work correctly. Note: Only PRs from PMMP Team members with **write** access to the repository can trigger release generation. Random people cannot trigger release generation by sending PRs. --- .github/workflows/draft-release-from-pr.yml | 65 +++++++++++ .github/workflows/draft-release-from-tag.yml | 13 +++ .github/workflows/draft-release-pr-check.yml | 111 +++++++++++++++++++ .github/workflows/draft-release.yml | 31 ++++-- build/dump-version-info.php | 86 ++++++++++++++ build/make-release.php | 38 ++++--- phpstan.neon.dist | 1 + 7 files changed, 321 insertions(+), 24 deletions(-) create mode 100644 .github/workflows/draft-release-from-pr.yml create mode 100644 .github/workflows/draft-release-from-tag.yml create mode 100644 .github/workflows/draft-release-pr-check.yml create mode 100644 build/dump-version-info.php diff --git a/.github/workflows/draft-release-from-pr.yml b/.github/workflows/draft-release-from-pr.yml new file mode 100644 index 0000000000..3936a26499 --- /dev/null +++ b/.github/workflows/draft-release-from-pr.yml @@ -0,0 +1,65 @@ +name: Draft release from PR + +on: + #presume that pull_request_target is safe at this point, since the PR was approved and merged + #we need write access to prepare the release & create comments + pull_request_target: + types: + - closed + branches: + - stable + - minor-next + - major-next + - "legacy/*" + paths: + - "src/VersionInfo.php" + +jobs: + check: + name: Check release + uses: ./.github/workflows/draft-release-pr-check.yml + + draft: + name: Create GitHub draft release + needs: [check] + if: needs.check.outputs.valid == 'true' + + uses: ./.github/workflows/draft-release.yml + + post-draft-url-comment: + name: Post draft release URL as comment + needs: [draft] + + runs-on: ubuntu-20.04 + + steps: + - name: Post draft release URL on PR + uses: thollander/actions-comment-pull-request@v2 + with: + message: "[Draft release ${{ needs.draft.outputs.version }}](${{ needs.draft.outputs.draft-url }}) has been created for commit ${{ github.sha }}. Please review and publish it." + + trigger-post-release-workflow: + name: Trigger post-release RestrictedActions workflow + # Not sure if needs is actually needed here + needs: [check] + if: needs.check.outputs.valid == 'true' + + runs-on: ubuntu-20.04 + + steps: + - name: Generate access token + id: generate-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.RESTRICTED_ACTIONS_DISPATCH_ID }} + private-key: ${{ secrets.RESTRICTED_ACTIONS_DISPATCH_KEY }} + owner: ${{ github.repository_owner }} + repositories: RestrictedActions + + - name: Dispatch post-release restricted action + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ steps.generate-token.outputs.token }} + repository: ${{ github.repository_owner }}/RestrictedActions + event-type: pocketmine_mp_post_release + client-payload: '{"branch": "${{ github.ref }}"}' diff --git a/.github/workflows/draft-release-from-tag.yml b/.github/workflows/draft-release-from-tag.yml new file mode 100644 index 0000000000..f7a5df5444 --- /dev/null +++ b/.github/workflows/draft-release-from-tag.yml @@ -0,0 +1,13 @@ +#Allows creating a release by pushing a tag +#This might be useful for retroactive releases +name: Draft release from git tag + +on: + push: + tags: "*" + +jobs: + draft: + name: Create GitHub draft release + if: "startsWith(github.event.head_commit.message, 'Release ')" + uses: ./.github/workflows/draft-release.yml diff --git a/.github/workflows/draft-release-pr-check.yml b/.github/workflows/draft-release-pr-check.yml new file mode 100644 index 0000000000..4c8d0f6854 --- /dev/null +++ b/.github/workflows/draft-release-pr-check.yml @@ -0,0 +1,111 @@ +name: Release PR checks + +on: + #do checks on every PR update + pull_request: + branches: + - stable + - minor-next + - major-next + - "legacy/*" + paths: + - "src/VersionInfo.php" + + #allow this workflow to be invoked on PR merge, prior to creating the release + workflow_call: + outputs: + valid: + description: Whether this commit is valid for release + value: ${{ jobs.check-intent.outputs.valid && jobs.check-validity.result == 'success' }} + +permissions: + contents: read #for user access check + +jobs: + check-intent: + name: Check release trigger + runs-on: ubuntu-20.04 + + outputs: + valid: ${{ steps.validate.outputs.DEV_BUILD == 'false' }} + + steps: + - uses: actions/checkout@v4 + + - name: Check IS_DEVELOPMENT_BUILD flag + id: validate + run: | + echo DEV_BUILD=$(sed -n "s/^\s*public const IS_DEVELOPMENT_BUILD = \(true\|false\);$/\1/p" src/VersionInfo.php) >> $GITHUB_OUTPUT + + check-validity: + name: Validate release info + needs: [check-intent] + #don't do these checks if this isn't a release - we don't want to generate unnecessary failed statuses + if: needs.check-intent.outputs.valid == 'true' + + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@2.31.1 + with: + php-version: 8.2 + + - name: Restore Composer package cache + uses: actions/cache@v4 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --no-dev --prefer-dist --no-interaction --ignore-platform-reqs + + - name: Check author permissions + id: check-permission + uses: actions-cool/check-user-permission@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + require: write + username: ${{ github.event.pull_request.user.login }} + #technically this would be fine for dependabot but generally bots don't count as team members + check-bot: true + + - name: Abort if user permissions are insufficient + #user doesn't have permission or is a bot + if: steps.check-permission.outputs.require-result != 'true' || steps.check-permission.outputs.check-result != 'false' + run: | + echo "::error::This user is not authorized to trigger releases" + exit 1 + + - name: Check changelog file is present + id: file-presence + run: | + CHANGELOG_FILE="changelogs/$(php build/dump-version-info.php changelog_file_name)" + if [ ! -f "${{ github.workspace }}/$CHANGELOG_FILE" ]; then + echo "::error::$CHANGELOG_FILE does not exist" + exit 1 + fi + echo FILE="$CHANGELOG_FILE" >> $GITHUB_OUTPUT + + - name: Check header is present in changelog file + run: | + FILE="${{ steps.file-presence.outputs.FILE }}" + VERSION="$(php build/dump-version-info.php base_version)" + if ! grep -Fqx "# $VERSION" "${{ github.workspace }}/$FILE"; then + echo "::error::Header for $VERSION not found in $FILE" + exit 1 + fi + + - name: Check version is valid for the selected channel + run: | + CHANNEL="$(php build/dump-version-info.php channel)" + if [ "$(php build/dump-version-info.php suffix_valid)" != "true" ]; then + echo "::error::Version $(php build/dump-version-info.php base_version) is not allowed on the $CHANNEL channel" + exit 1 + fi diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index c47a4399b1..0a07a738bb 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -1,19 +1,29 @@ name: Draft release on: - push: - tags: "*" + workflow_call: + outputs: + draft-url: + description: 'The URL of the draft release' + value: ${{ jobs.draft.outputs.draft-url }} + version: + description: 'PocketMine-MP version' + value: ${{ jobs.draft.outputs.version }} jobs: draft: name: Create GitHub draft release - if: "startsWith(github.event.head_commit.message, 'Release ')" + runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: php-version: [8.2] + outputs: + draft-url: ${{ steps.create-draft.outputs.html_url }} + version: ${{ steps.get-pm-version.outputs.PM_VERSION }} + steps: - uses: actions/checkout@v4 with: @@ -53,12 +63,11 @@ jobs: - name: Get PocketMine-MP release version id: get-pm-version run: | - echo PM_VERSION=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BASE_VERSION;') >> $GITHUB_OUTPUT - echo MCPE_VERSION=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK;') >> $GITHUB_OUTPUT - echo PM_VERSION_SHORT=$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\VersionInfo::BASE_VERSION); array_pop($v); echo implode(".", $v);') >> $GITHUB_OUTPUT - echo PM_VERSION_MD=$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\VersionInfo::BASE_VERSION);') >> $GITHUB_OUTPUT - echo CHANGELOG_SUFFIX=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "" : "-" . \pocketmine\VersionInfo::BUILD_CHANNEL;') >> $GITHUB_OUTPUT - echo PRERELEASE=$(php -r 'require "vendor/autoload.php"; echo \pocketmine\VersionInfo::BUILD_CHANNEL === "stable" ? "false" : "true";') >> $GITHUB_OUTPUT + echo PM_VERSION=$(php build/dump-version-info.php base_version) >> $GITHUB_OUTPUT + echo MCPE_VERSION=$(php build/dump-version-info.php mcpe_version) >> $GITHUB_OUTPUT + echo CHANGELOG_FILE_NAME=$(php build/dump-version-info.php changelog_file_name) >> $GITHUB_OUTPUT + echo CHANGELOG_MD_HEADER=$(php build/dump-version-info.php changelog_md_header) >> $GITHUB_OUTPUT + echo PRERELEASE=$(php build/dump-version-info.php prerelease) >> $GITHUB_OUTPUT - name: Generate PHP binary download URL id: php-binary-url @@ -91,6 +100,7 @@ jobs: - name: Create draft release uses: ncipollo/release-action@v1.14.0 + id: create-draft with: artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json,${{ github.workspace }}/core-permissions.rst commit: ${{ github.sha }} @@ -99,9 +109,10 @@ jobs: name: PocketMine-MP ${{ steps.get-pm-version.outputs.PM_VERSION }} tag: ${{ steps.get-pm-version.outputs.PM_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} + skipIfReleaseExists: true #for release PRs, tags will be created on release publish and trigger the tag release workflow - don't create a second draft body: | **For Minecraft: Bedrock Edition ${{ steps.get-pm-version.outputs.MCPE_VERSION }}** - Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}${{ steps.get-pm-version.outputs.CHANGELOG_SUFFIX }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. + Please see the [changelogs](${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.get-pm-version.outputs.PM_VERSION }}/changelogs/${{ steps.get-pm-version.outputs.CHANGELOG_FILE_NAME }}#${{ steps.get-pm-version.outputs.CHANGELOG_MD_HEADER }}) for details. :information_source: Download the recommended PHP binary [here](${{ steps.php-binary-url.outputs.PHP_BINARY_URL }}). diff --git a/build/dump-version-info.php b/build/dump-version-info.php new file mode 100644 index 0000000000..8898d7cabf --- /dev/null +++ b/build/dump-version-info.php @@ -0,0 +1,86 @@ + $options + */ +$options = [ + "base_version" => VersionInfo::BASE_VERSION, + "mcpe_version" => ProtocolInfo::MINECRAFT_VERSION_NETWORK, + "is_dev" => VersionInfo::IS_DEVELOPMENT_BUILD, + "changelog_file_name" => function() : string{ + $version = VersionInfo::VERSION(); + $result = $version->getMajor() . "." . $version->getMinor(); + $suffix = $version->getSuffix(); + if($suffix !== ""){ + if(preg_match('/^([A-Za-z]+)(\d+)$/', $suffix, $matches) !== 1){ + fwrite(STDERR, "error: invalid current version suffix \"$suffix\"; aborting" . PHP_EOL); + exit(1); + } + $baseSuffix = $matches[1]; + $result .= "-" . strtolower($baseSuffix); + } + return $result . ".md"; + }, + "changelog_md_header" => fn() : string => str_replace(".", "", VersionInfo::BASE_VERSION), + "prerelease" => fn() : bool => VersionInfo::VERSION()->getSuffix() !== "", + "channel" => VersionInfo::BUILD_CHANNEL, + "suffix_valid" => function() : bool{ + //TODO: maybe this should be put into its own script? + $suffix = VersionInfo::VERSION()->getSuffix(); + if(VersionInfo::BUILD_CHANNEL === "stable"){ + //stable builds may not have suffixes + return $suffix === ""; + } + if(VersionInfo::BUILD_CHANNEL === "alpha" || VersionInfo::BUILD_CHANNEL === "beta"){ + $upperChannel = strtoupper(VersionInfo::BUILD_CHANNEL); + $upperSuffix = strtoupper($suffix); + return str_starts_with($upperSuffix, $upperChannel) && is_numeric(substr($upperSuffix, strlen($upperChannel))); + } + return true; + } +]; +if(count($argv) !== 2 || !isset($options[$argv[1]])){ + fwrite(STDERR, "Please provide an option (one of: " . implode(", ", array_keys($options)) . PHP_EOL); + exit(1); +} + +$result = $options[$argv[1]]; +if($result instanceof Closure){ + $result = $result(); +} +if(is_bool($result)){ + echo $result ? "true" : "false"; +}else{ + echo $result; +} diff --git a/build/make-release.php b/build/make-release.php index 7a570eb357..741f9d787a 100644 --- a/build/make-release.php +++ b/build/make-release.php @@ -86,7 +86,8 @@ function systemWrapper(string $command, string $errorMessage) : void{ function main() : void{ $filteredOpts = []; - foreach(Utils::stringifyKeys(getopt("", ["current:", "next:", "channel:", "help"])) as $optName => $optValue){ + $postCommitOnly = false; + foreach(Utils::stringifyKeys(getopt("", ["current:", "next:", "channel:", "help", "post"])) as $optName => $optValue){ if($optName === "help"){ fwrite(STDOUT, "Options:\n"); @@ -96,6 +97,10 @@ function main() : void{ } exit(0); } + if($optName === "post"){ + $postCommitOnly = true; + continue; + } if(!is_string($optValue)){ fwrite(STDERR, "--$optName expects exactly 1 value\n"); exit(1); @@ -141,20 +146,25 @@ function main() : void{ $channel ??= "stable"; } - echo "About to tag version $currentVer. Next version will be $nextVer.\n"; - echo "$currentVer will be published on release channel \"$channel\".\n"; - echo "please add appropriate notes to the changelog and press enter..."; - fgets(STDIN); - systemWrapper('git add "' . dirname(__DIR__) . '/changelogs"', "failed to stage changelog changes"); - system('git diff --cached --quiet "' . dirname(__DIR__) . '/changelogs"', $result); - if($result === 0){ - echo "error: no changelog changes detected; aborting\n"; - exit(1); - } $versionInfoPath = dirname(__DIR__) . '/src/VersionInfo.php'; - replaceVersion($versionInfoPath, $currentVer->getBaseVersion(), false, $channel); - systemWrapper('git commit -m "Release ' . $currentVer->getBaseVersion() . '" --include "' . $versionInfoPath . '"', "failed to create release commit"); - systemWrapper('git tag ' . $currentVer->getBaseVersion(), "failed to create release tag"); + + if($postCommitOnly){ + echo "Skipping release commit & tag. Bumping to next version $nextVer directly.\n"; + }else{ + echo "About to tag version $currentVer. Next version will be $nextVer.\n"; + echo "$currentVer will be published on release channel \"$channel\".\n"; + echo "please add appropriate notes to the changelog and press enter..."; + fgets(STDIN); + systemWrapper('git add "' . dirname(__DIR__) . '/changelogs"', "failed to stage changelog changes"); + system('git diff --cached --quiet "' . dirname(__DIR__) . '/changelogs"', $result); + if($result === 0){ + echo "error: no changelog changes detected; aborting\n"; + exit(1); + } + replaceVersion($versionInfoPath, $currentVer->getBaseVersion(), false, $channel); + systemWrapper('git commit -m "Release ' . $currentVer->getBaseVersion() . '" --include "' . $versionInfoPath . '"', "failed to create release commit"); + systemWrapper('git tag ' . $currentVer->getBaseVersion(), "failed to create release tag"); + } replaceVersion($versionInfoPath, $nextVer->getBaseVersion(), true, $channel); systemWrapper('git add "' . $versionInfoPath . '"', "failed to stage changes for post-release commit"); diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 2fde67d6ca..b96e4348dd 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -40,6 +40,7 @@ parameters: - build/php dynamicConstantNames: - pocketmine\VersionInfo::IS_DEVELOPMENT_BUILD + - pocketmine\VersionInfo::BUILD_CHANNEL - pocketmine\DEBUG - pocketmine\IS_DEVELOPMENT_BUILD stubFiles: From 94dff744941d1b9770bd96ccdcf890298f1fd1a4 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Thu, 31 Oct 2024 14:35:42 +0000 Subject: [PATCH 1795/1858] Prepare 5.20.1 release (#6479) --- changelogs/5.20.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/5.20.md b/changelogs/5.20.md index 8d7e971d93..b0da701d67 100644 --- a/changelogs/5.20.md +++ b/changelogs/5.20.md @@ -17,3 +17,9 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Fixes - Fixed a bug in `tools/generate-blockstate-upgrade-schema.php` that caused it to fail on 1.21.40 with the new mushroom block changes. + +# 5.20.1 +Released 31st October 2024. + +## Fixes +- Workaround old mob heads in world saves not being upgraded correctly and causing crashes. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 11c5b1c88d..20d0154c70 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.20.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 0376e37966c2bddc8466f9b64aad7776656d0eaa Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 31 Oct 2024 14:38:30 +0000 Subject: [PATCH 1796/1858] 5.20.2 is next Commit created by: https://github.com/pmmp/RestrictedActions/actions/runs/11614028030 --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 20d0154c70..5de1f5a059 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.20.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.20.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From c0b74b03419038f34bb25fa0c5dc05440bf86c5b Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sun, 3 Nov 2024 14:05:46 +0000 Subject: [PATCH 1797/1858] Update BlockStateUpgrader.php --- src/data/bedrock/block/upgrade/BlockStateUpgrader.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php index e95f3c80f6..2dce762b8d 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgrader.php @@ -157,9 +157,8 @@ final class BlockStateUpgrader{ if(is_string($remap->newName)){ $newName = $remap->newName; }else{ - //yes, overwriting $oldState here is intentional, although we probably don't actually need it anyway - //it shouldn't make any difference unless the flattened property appears in copiedState for some reason - [$newName, $oldState] = $this->applyPropertyFlattened($remap->newName, $oldName, $oldState); + //discard flatten modifications to state - the remap newState and copiedState will take care of it + [$newName, ] = $this->applyPropertyFlattened($remap->newName, $oldName, $oldState); } $newState = $remap->newState; From c63d0ef1b6187ab7bbffb70625d509620c1e3ae7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Nov 2024 14:39:41 +0000 Subject: [PATCH 1798/1858] Fix dodgy ignored PHPStan error --- src/network/mcpe/InventoryManager.php | 1 + tests/phpstan/configs/actual-problems.neon | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index c0969b61b2..e4c303121f 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -364,6 +364,7 @@ class InventoryManager{ FurnaceType::FURNACE => WindowTypes::FURNACE, FurnaceType::BLAST_FURNACE => WindowTypes::BLAST_FURNACE, FurnaceType::SMOKER => WindowTypes::SMOKER, + FurnaceType::CAMPFIRE, FurnaceType::SOUL_CAMPFIRE => throw new \LogicException("Campfire inventory cannot be displayed to a player") }, $inv instanceof EnchantInventory => WindowTypes::ENCHANTMENT, $inv instanceof BrewingStandInventory => WindowTypes::BREWING_STAND, diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 2d0e6d398d..cc647da805 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -580,11 +580,6 @@ parameters: count: 1 path: ../../../src/network/mcpe/ChunkRequestTask.php - - - message: "#^Match expression does not handle remaining values\\: pocketmine\\\\crafting\\\\FurnaceType\\:\\:CAMPFIRE\\|pocketmine\\\\crafting\\\\FurnaceType\\:\\:SOUL_CAMPFIRE$#" - count: 1 - path: ../../../src/network/mcpe/InventoryManager.php - - message: "#^Cannot call method doFirstSpawn\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" count: 1 From 72fc1386319f481328d4c9b4f7efe899767ecf81 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Nov 2024 14:43:15 +0000 Subject: [PATCH 1799/1858] Regenerate PHPStan baselines --- tests/phpstan/configs/actual-problems.neon | 25 ---------------------- tests/phpstan/configs/phpstan-bugs.neon | 14 ++++++------ 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index cc647da805..e778cf0047 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -785,11 +785,6 @@ parameters: count: 1 path: ../../../src/resourcepacks/ZippedResourcePack.php - - - message: "#^Parameter \\#2 \\$length of function fread expects int\\<0, max\\>, int given\\.$#" - count: 1 - path: ../../../src/resourcepacks/ZippedResourcePack.php - - message: "#^Property pocketmine\\\\resourcepacks\\\\ZippedResourcePack\\:\\:\\$fileResource \\(resource\\) does not accept resource\\|false\\.$#" count: 1 @@ -1035,11 +1030,6 @@ parameters: count: 1 path: ../../../src/world/format/io/region/RegionLoader.php - - - message: "#^Parameter \\#2 \\$length of function fread expects int\\<0, max\\>, int given\\.$#" - count: 1 - path: ../../../src/world/format/io/region/RegionLoader.php - - message: "#^Parameter \\#2 \\$size of function ftruncate expects int\\<0, max\\>, int given\\.$#" count: 1 @@ -1190,18 +1180,3 @@ parameters: count: 1 path: ../../../src/world/light/SkyLightUpdate.php - - - message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" - count: 1 - path: ../../phpunit/block/BlockTest.php - - - - message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" - count: 1 - path: ../../phpunit/block/regenerate_consistency_check.php - - - - message: "#^Parameter \\#1 \\$logFile of class pocketmine\\\\utils\\\\MainLogger constructor expects string, string\\|false given\\.$#" - count: 1 - path: ../../phpunit/scheduler/AsyncPoolTest.php - diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 0ead377ba0..0fc3defda7 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -5,20 +5,20 @@ parameters: count: 1 path: ../../../src/block/CakeWithCandle.php - - - message: "#^Method pocketmine\\\\block\\\\DoubleTallGrass\\:\\:traitGetDropsForIncompatibleTool\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: ../../../src/block/DoubleTallGrass.php - - message: "#^Method pocketmine\\\\block\\\\CopperDoor\\:\\:onInteractCopper\\(\\) has parameter \\$returnedItems with no value type specified in iterable type array\\.$#" count: 1 - path: ../../../src/block/utils/CopperTrait.php + path: ../../../src/block/CopperDoor.php - message: "#^Method pocketmine\\\\block\\\\CopperTrapdoor\\:\\:onInteractCopper\\(\\) has parameter \\$returnedItems with no value type specified in iterable type array\\.$#" count: 1 - path: ../../../src/block/utils/CopperTrait.php + path: ../../../src/block/CopperTrapdoor.php + + - + message: "#^Method pocketmine\\\\block\\\\DoubleTallGrass\\:\\:traitGetDropsForIncompatibleTool\\(\\) return type has no value type specified in iterable type array\\.$#" + count: 1 + path: ../../../src/block/DoubleTallGrass.php - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" From 84464cde4f6f3506e0b55e136d83592de2ce1fa0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Nov 2024 14:44:50 +0000 Subject: [PATCH 1800/1858] Update BedrockBlockUpgradeSchema --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 9ecbad32fb..ed5bb582f3 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "composer-runtime-api": "^2.0", "adhocore/json-comment": "~1.2.0", "pocketmine/netresearch-jsonmapper": "~v4.4.999", - "pocketmine/bedrock-block-upgrade-schema": "~4.5.0+bedrock-1.21.40", + "pocketmine/bedrock-block-upgrade-schema": "~5.0.0+bedrock-1.21.40", "pocketmine/bedrock-data": "~2.14.0+bedrock-1.21.40", "pocketmine/bedrock-item-upgrade-schema": "~1.13.0+bedrock-1.21.40", "pocketmine/bedrock-protocol": "~35.0.0+bedrock-1.21.40", diff --git a/composer.lock b/composer.lock index d4cb38ddcd..b2f3e7858e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5c5882370131d2ae3a043819c05e6f9c", + "content-hash": "b2fbf6e7a9d650341dc71fa4dd124681", "packages": [ { "name": "adhocore/json-comment", @@ -127,16 +127,16 @@ }, { "name": "pocketmine/bedrock-block-upgrade-schema", - "version": "4.5.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "7943b894e050d68dd21b5c7fa609827a4e2e30f1" + "reference": "20dd5c11e9915bacea4fe2cf649e1d23697a6e52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/7943b894e050d68dd21b5c7fa609827a4e2e30f1", - "reference": "7943b894e050d68dd21b5c7fa609827a4e2e30f1", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/20dd5c11e9915bacea4fe2cf649e1d23697a6e52", + "reference": "20dd5c11e9915bacea4fe2cf649e1d23697a6e52", "shasum": "" }, "type": "library", @@ -147,9 +147,9 @@ "description": "Schemas describing how to upgrade saved block data in older Minecraft: Bedrock Edition world saves", "support": { "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/4.5.0" + "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/5.0.0" }, - "time": "2024-10-23T16:15:24+00:00" + "time": "2024-11-03T14:13:50+00:00" }, { "name": "pocketmine/bedrock-data", From 96b12bddc1149d9a8610c6bffc555609790b70e8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 3 Nov 2024 15:24:43 +0000 Subject: [PATCH 1801/1858] Prepare 5.21.0 release --- changelogs/5.21.md | 103 ++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 4 +- 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 changelogs/5.21.md diff --git a/changelogs/5.21.md b/changelogs/5.21.md new file mode 100644 index 0000000000..b8131a3c8b --- /dev/null +++ b/changelogs/5.21.md @@ -0,0 +1,103 @@ +# 5.21.0 +Released 3rd November 2024. + +This is a minor feature release, including gameplay features and minor internals improvements. + +**Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. +Do not update plugin minimum API versions unless you need new features added in this release. + +**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** +Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. + +## Gameplay +- Added the following new blocks: + - Campfire + - Chiseled Copper + - Chiseled Tuff + - Chiseled Tuff Bricks + - Copper Bulb + - Copper Door + - Copper Grate + - Copper Trapdoor + - Polished Tuff, Slabs, Stairs and Walls + - Soul Campfire + - Tuff Bricks, Slabs, Stairs and Walls + - Tuff Slab, Stairs and Walls +- Added the following new types of painting: + - backyard + - baroque + - bouquet + - cavebird + - changing + - cotan + - endboss + - fern + - finding + - humble + - lowmist + - meditative + - orb + - owlemons + - passage + - pond + - prairie_ride + - sunflowers + - tides + - unpacked +- Armor slots are now properly restricted (on the server side) to only contain the appropriate type of armor or headwear. +- Implemented Aqua Affinity enchantment. Since the server doesn't currently enforce any movement restrictions in water, this enchantment works based on client-side behaviour only. + +## API +### `pocketmine\block` +- The following new API methods have been added: + - `public ChiseledBookshelf->getLastInteractedSlot() : ?ChiseledBookshelfSlot` + - `public ChiseledBookshelf->setLastInteractedSlot(?ChiseledBookshelfSlot $lastInteractedSlot) : $this` +- The following new classes have been added: + - `utils\CopperMaterial` - interface implemented by all copper-like blocks with oxidation and waxed properties + - `CopperBulb` + - `CopperDoor` + - `CopperGrate` + - `CopperTrapdoor` + - `SoulCampfire` + - `Campfire` +- The following enums have new cases: + - `utils\BannerPatternType` has new cases `FLOW` and `GUSTER` + +### `pocketmine\crafting` +- The following enums have new cases: + - `FurnaceType` has new cases `CAMPFIRE` and `SOUL_CAMPFIRE` + +### `pocketmine\event` +- The following new classes have been added: + - `block\CampfireCookEvent` - called when a campfire finishes cooking an item + +### `pocketmine\inventory` +- Added support for slot validators, which permit restricting the types of items a player can put into an inventory slot. + - The following new classes have been added: + - `transaction\action\SlotValidator` - interface + - `transaction\action\CallbackSlotValidator` - class allowing a closure to be used for slot content validation + - `SlotValidatedInventory` - implemented by inventories which support the use of slot validators + +### `pocketmine\item` +- The following new API methods have been added: + - `public Item->getCooldownTag() : ?string` - returns the cooldown group this item belongs to, used for ensuring that, for example, different types of goat horns all respect a general horn cooldown +- The following new classes have been added: + - `ItemCooldownTags` - list of cooldown group tags used by PocketMine-MP + +### `pocketmine\world\sound` +- The following new classes have been added + - `CampfireSound` - sound made by campfires while lit + +## Tools +- `tools/blockstate-upgrade-schema-utils.php` (formerly `generate-blockstate-upgrade-schema.php`) has several improvements: + - Support for generating `flattenedProperties` rules as per [BedrockBlockUpgradeSchema 5.0.0](https://github.com/pmmp/BedrockBlockUpgradeSchema/releases/tag/5.0.0) + - Improved criteria for flattened property selection to minimize the amount of rules required + - Several subcommands are now available: + - `generate` - generates a schema from provided data + - `update` - regenerates an existing schema in a newer format + - `update-all` - regenerates a folder of existing schemas in a newer format (useful for updating `BedrockBlockUpgradeSchema` en masse) + - `test` - verifies that a schema produces the results expected by provided data + +## Internals +- Fixed incorrect visibility of `createEntity` in spawn eggs. +- Added support for newer `BedrockBlockUpgradeSchema` in `BlockStateUpgrader`. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 5de1f5a059..4dc9ea7f9d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.20.2"; - public const IS_DEVELOPMENT_BUILD = true; + public const BASE_VERSION = "5.21.0"; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From e598364f0695495cbe71ddf0b62f134b51091c6e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 3 Nov 2024 15:30:16 +0000 Subject: [PATCH 1802/1858] 5.21.1 is next Commit created by: https://github.com/pmmp/RestrictedActions/actions/runs/11652565588 --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4dc9ea7f9d..8fe6d32dd4 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.21.0"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.21.1"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 2173aab967fde0e2680ab77bcd1be1e0c3a32e85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:05:38 +0000 Subject: [PATCH 1803/1858] Bump thollander/actions-comment-pull-request from 2 to 3 (#6482) --- .github/workflows/draft-release-from-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/draft-release-from-pr.yml b/.github/workflows/draft-release-from-pr.yml index 3936a26499..8a347853bb 100644 --- a/.github/workflows/draft-release-from-pr.yml +++ b/.github/workflows/draft-release-from-pr.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Post draft release URL on PR - uses: thollander/actions-comment-pull-request@v2 + uses: thollander/actions-comment-pull-request@v3 with: message: "[Draft release ${{ needs.draft.outputs.version }}](${{ needs.draft.outputs.draft-url }}) has been created for commit ${{ github.sha }}. Please review and publish it." From b3b8aaddffe3b3a1eee8dcc62dd08fcd10581916 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:29:01 +0000 Subject: [PATCH 1804/1858] Bump docker/build-push-action from 6.8.0 to 6.9.0 (#6465) --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7f5eae32a5..4325c63f28 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -53,7 +53,7 @@ jobs: run: echo NAME=$(echo "${GITHUB_REPOSITORY,,}") >> $GITHUB_OUTPUT - name: Build image for tag - uses: docker/build-push-action@v6.8.0 + uses: docker/build-push-action@v6.9.0 with: push: true context: ./pocketmine-mp @@ -66,7 +66,7 @@ jobs: - name: Build image for major tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.8.0 + uses: docker/build-push-action@v6.9.0 with: push: true context: ./pocketmine-mp @@ -79,7 +79,7 @@ jobs: - name: Build image for minor tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.8.0 + uses: docker/build-push-action@v6.9.0 with: push: true context: ./pocketmine-mp @@ -92,7 +92,7 @@ jobs: - name: Build image for latest tag if: steps.channel.outputs.CHANNEL == 'stable' - uses: docker/build-push-action@v6.8.0 + uses: docker/build-push-action@v6.9.0 with: push: true context: ./pocketmine-mp From 8c04d47b1b2fb9775601af919d3263eb8690458f Mon Sep 17 00:00:00 2001 From: Muqsit Date: Sun, 10 Nov 2024 03:18:30 +0800 Subject: [PATCH 1805/1858] Make weakness effect only applicable for melee damage (#6489) --- src/event/entity/EntityDamageByEntityEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/entity/EntityDamageByEntityEvent.php b/src/event/entity/EntityDamageByEntityEvent.php index 5ef6c4b8e9..052be9a159 100644 --- a/src/event/entity/EntityDamageByEntityEvent.php +++ b/src/event/entity/EntityDamageByEntityEvent.php @@ -57,7 +57,7 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{ $this->setModifier($this->getBaseDamage() * 0.3 * $strength->getEffectLevel(), self::MODIFIER_STRENGTH); } - if(($weakness = $effects->get(VanillaEffects::WEAKNESS())) !== null){ + if(($weakness = $effects->get(VanillaEffects::WEAKNESS())) !== null && $this->getCause() === EntityDamageEvent::CAUSE_ENTITY_ATTACK){ $this->setModifier(-($this->getBaseDamage() * 0.2 * $weakness->getEffectLevel()), self::MODIFIER_WEAKNESS); } } From 231eec911f762beb9c17ab18e44842eb9580f3cd Mon Sep 17 00:00:00 2001 From: WavyCraftNetwork <42108413+WavyCraftNetwork@users.noreply.github.com> Date: Sat, 9 Nov 2024 11:43:30 -0800 Subject: [PATCH 1806/1858] Enchanted Golden Apple: Regeneration 5 => 2 matching Java (#6445) --- src/item/GoldenAppleEnchanted.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item/GoldenAppleEnchanted.php b/src/item/GoldenAppleEnchanted.php index 5b68f5f21c..28e43a7a47 100644 --- a/src/item/GoldenAppleEnchanted.php +++ b/src/item/GoldenAppleEnchanted.php @@ -30,7 +30,7 @@ class GoldenAppleEnchanted extends GoldenApple{ public function getAdditionalEffects() : array{ return [ - new EffectInstance(VanillaEffects::REGENERATION(), 600, 4), + new EffectInstance(VanillaEffects::REGENERATION(), 600, 1), new EffectInstance(VanillaEffects::ABSORPTION(), 2400, 3), new EffectInstance(VanillaEffects::RESISTANCE(), 6000), new EffectInstance(VanillaEffects::FIRE_RESISTANCE(), 6000) From 05a9e9c76ebe64251245f77eb53bc90e409651b6 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:07:18 +0300 Subject: [PATCH 1807/1858] Implemented sound when drinking a potion (#6444) --- src/item/Potion.php | 3 ++- src/world/sound/BottleEmptySound.php | 35 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/world/sound/BottleEmptySound.php diff --git a/src/item/Potion.php b/src/item/Potion.php index 41b0f634a8..192a257841 100644 --- a/src/item/Potion.php +++ b/src/item/Potion.php @@ -26,6 +26,7 @@ namespace pocketmine\item; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\Living; use pocketmine\player\Player; +use pocketmine\world\sound\BottleEmptySound; class Potion extends Item implements ConsumableItem{ @@ -50,7 +51,7 @@ class Potion extends Item implements ConsumableItem{ } public function onConsume(Living $consumer) : void{ - + $consumer->broadcastSound(new BottleEmptySound()); } public function getAdditionalEffects() : array{ diff --git a/src/world/sound/BottleEmptySound.php b/src/world/sound/BottleEmptySound.php new file mode 100644 index 0000000000..bb2a0be2ad --- /dev/null +++ b/src/world/sound/BottleEmptySound.php @@ -0,0 +1,35 @@ + Date: Sun, 10 Nov 2024 22:15:30 +0300 Subject: [PATCH 1808/1858] Fixed server crash when applying item cooldown (#6491) This commit fixes server crash when applying a cooldown to any item which count is equals to 1. closes #6490 closes #6488 --- src/player/Player.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 8ae206e1a4..192e26a5f9 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1625,7 +1625,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return false; } - $this->resetItemCooldown($item); + $this->resetItemCooldown($oldItem); $this->returnItemsFromAction($oldItem, $item, $returnedItems); $this->setUsingItem($item instanceof Releasable && $item->canStartUsingItem($this)); @@ -1654,7 +1654,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } $this->setUsingItem(false); - $this->resetItemCooldown($slot); + $this->resetItemCooldown($oldItem); $slot->pop(); $this->returnItemsFromAction($oldItem, $slot, [$slot->getResidue()]); @@ -1682,7 +1682,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $returnedItems = []; $result = $item->onReleaseUsing($this, $returnedItems); if($result === ItemUseResult::SUCCESS){ - $this->resetItemCooldown($item); + $this->resetItemCooldown($oldItem); $this->returnItemsFromAction($oldItem, $item, $returnedItems); return true; } From d2c3b8dacb2a7d8712cf7539ab265439be056c0b Mon Sep 17 00:00:00 2001 From: kostamax27 Date: Mon, 11 Nov 2024 16:10:19 +0100 Subject: [PATCH 1809/1858] Fix GC cycle count increases on player disconnect (#6487) --- src/inventory/ArmorInventory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inventory/ArmorInventory.php b/src/inventory/ArmorInventory.php index 0b3ae5b7bc..8591cc65bf 100644 --- a/src/inventory/ArmorInventory.php +++ b/src/inventory/ArmorInventory.php @@ -42,7 +42,7 @@ class ArmorInventory extends SimpleInventory{ ){ parent::__construct(4); - $this->validators->add(new CallbackSlotValidator($this->validate(...))); + $this->validators->add(new CallbackSlotValidator(self::validate(...))); } public function getHolder() : Living{ @@ -81,7 +81,7 @@ class ArmorInventory extends SimpleInventory{ $this->setItem(self::SLOT_FEET, $boots); } - private function validate(Inventory $inventory, Item $item, int $slot) : ?TransactionValidationException{ + private static function validate(Inventory $inventory, Item $item, int $slot) : ?TransactionValidationException{ if($item instanceof Armor){ if($item->getArmorSlot() !== $slot){ return new TransactionValidationException("Armor item is in wrong slot"); From 4a702b97fd282731622f40692921e6f5763a9571 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Tue, 12 Nov 2024 14:48:01 +0300 Subject: [PATCH 1810/1858] Prepare 5.21.1 release (#6493) --- changelogs/5.21.md | 9 +++++++++ src/VersionInfo.php | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelogs/5.21.md b/changelogs/5.21.md index b8131a3c8b..9b3c2f89ad 100644 --- a/changelogs/5.21.md +++ b/changelogs/5.21.md @@ -101,3 +101,12 @@ Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if ## Internals - Fixed incorrect visibility of `createEntity` in spawn eggs. - Added support for newer `BedrockBlockUpgradeSchema` in `BlockStateUpgrader`. + +# 5.21.1 +Released 12th November 2024. + +## Fixes +- Fixed server crash when applying a cooldown to an item with 1 count. +- Fixed garbage collector cycle count increase on player disconnect. +- Fixed weakness effect being applied to all attack types, causing damage splash potions to become weaker. +- Fixed Enchanted Golden Apple regeneration effect amplifier to match vanilla. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 8fe6d32dd4..4691fb213c 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "5.21.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; /** From 07d5046b83921e413ff32dbd5960759a3b8168c7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 12 Nov 2024 11:48:59 +0000 Subject: [PATCH 1811/1858] 5.21.2 is next Commit created by: https://github.com/pmmp/RestrictedActions/actions/runs/11796630402 --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4691fb213c..bc1b24c62d 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "5.21.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "5.21.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; /** From 053a71c59d07f375890a3869f935ffc24534d2c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 14:28:32 +0000 Subject: [PATCH 1812/1858] Bump build/php from `084822a` to `a51259d` (#6495) --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index 084822aa9e..a51259d7a6 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit 084822aa9e381ca05591e902a2613fe971dff3fd +Subproject commit a51259d7a6ea649d64f409fc0276baa59cf4f19a From 1f86949836766470f01d2e049483e51bcfef4515 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Tue, 12 Nov 2024 14:37:02 +0000 Subject: [PATCH 1813/1858] Create CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..e41741f364 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @pmmp/server-developers From 054538e6b72b2a14c6de4c4cb290e4c9c4375871 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Tue, 12 Nov 2024 17:54:31 +0000 Subject: [PATCH 1814/1858] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 35 ++++++++++++-------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 022518e813..c27ea7a471 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,43 +1,34 @@ -## Introduction + -### Relevant issues - +### Related issues & PRs ## Changes ### API changes + ### Behavioural changes + ## Backwards compatibility + ## Follow-up + + +## In-Game Testing - -## Tests - -I tested this PR by doing the following (tick all that apply): -- [ ] Writing PHPUnit tests (commit these in the `tests/phpunit` folder) -- [ ] Playtesting using a Minecraft client (provide screenshots or a video) -- [ ] Writing a test plugin (provide the code and sample output) -- [ ] Other (provide details) From fe70150db2f1944e748ba7c90911c886e865cfdb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 12 Nov 2024 21:47:52 +0000 Subject: [PATCH 1815/1858] Update composer dependencies --- composer.lock | 186 +++++++++++++++++++++++++------------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/composer.lock b/composer.lock index b2f3e7858e..eb1061ff50 100644 --- a/composer.lock +++ b/composer.lock @@ -153,16 +153,16 @@ }, { "name": "pocketmine/bedrock-data", - "version": "2.14.0+bedrock-1.21.40", + "version": "2.14.1+bedrock-1.21.40", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockData.git", - "reference": "606d32ae426164b0615898b95d10e23293bed6ac" + "reference": "4a41864ed09613ecec6791e2ae076a8ec7089cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/606d32ae426164b0615898b95d10e23293bed6ac", - "reference": "606d32ae426164b0615898b95d10e23293bed6ac", + "url": "https://api.github.com/repos/pmmp/BedrockData/zipball/4a41864ed09613ecec6791e2ae076a8ec7089cc4", + "reference": "4a41864ed09613ecec6791e2ae076a8ec7089cc4", "shasum": "" }, "type": "library", @@ -173,22 +173,22 @@ "description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/BedrockData/issues", - "source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.21.40" + "source": "https://github.com/pmmp/BedrockData/tree/2.14.1+bedrock-1.21.40" }, - "time": "2024-10-23T19:19:16+00:00" + "time": "2024-11-12T21:36:20+00:00" }, { "name": "pocketmine/bedrock-item-upgrade-schema", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockItemUpgradeSchema.git", - "reference": "1dee9bbd0aaa65ed108b377b402746defe10b3b0" + "reference": "1cf81305f2ffcf7dde9577c4f16a55c765192b03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/1dee9bbd0aaa65ed108b377b402746defe10b3b0", - "reference": "1dee9bbd0aaa65ed108b377b402746defe10b3b0", + "url": "https://api.github.com/repos/pmmp/BedrockItemUpgradeSchema/zipball/1cf81305f2ffcf7dde9577c4f16a55c765192b03", + "reference": "1cf81305f2ffcf7dde9577c4f16a55c765192b03", "shasum": "" }, "type": "library", @@ -199,9 +199,9 @@ "description": "JSON schemas for upgrading items found in older Minecraft: Bedrock world saves", "support": { "issues": "https://github.com/pmmp/BedrockItemUpgradeSchema/issues", - "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.13.0" + "source": "https://github.com/pmmp/BedrockItemUpgradeSchema/tree/1.13.1" }, - "time": "2024-10-23T18:38:43+00:00" + "time": "2024-11-12T21:33:17+00:00" }, { "name": "pocketmine/bedrock-protocol", @@ -926,16 +926,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { @@ -972,7 +972,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" }, "funding": [ { @@ -988,24 +988,24 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -1051,7 +1051,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -1067,24 +1067,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -1131,7 +1131,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -1147,22 +1147,22 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" } ], "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -1201,7 +1201,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -1209,20 +1209,20 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -1233,7 +1233,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -1265,9 +1265,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "phar-io/manifest", @@ -1548,32 +1548,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -1585,7 +1585,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -1614,7 +1614,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -1622,7 +1622,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1869,16 +1869,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.24", + "version": "10.5.38", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015" + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f124e3e3e561006047b532fd0431bf5bb6b9015", - "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132", + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132", "shasum": "" }, "require": { @@ -1888,26 +1888,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.3", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -1950,7 +1950,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.24" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38" }, "funding": [ { @@ -1966,7 +1966,7 @@ "type": "tidelift" } ], - "time": "2024-06-20T13:09:54+00:00" + "time": "2024-10-28T13:06:21+00:00" }, { "name": "sebastian/cli-parser", @@ -2138,16 +2138,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "shasum": "" }, "require": { @@ -2158,7 +2158,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -2203,7 +2203,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" }, "funding": [ { @@ -2211,7 +2211,7 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-10-18T14:56:07+00:00" }, { "name": "sebastian/complexity", From f3cc4a28e1c74627f56fef20efa67bc17fdd321f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 12 Nov 2024 22:12:54 +0000 Subject: [PATCH 1816/1858] Easy wins for PHPStan 2.0 support --- phpstan.neon.dist | 2 -- src/block/Block.php | 2 ++ src/data/runtime/RuntimeDataDescriber.php | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index b96e4348dd..6e85786525 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -48,8 +48,6 @@ parameters: - tests/phpstan/stubs/leveldb.stub - tests/phpstan/stubs/pmmpthread.stub reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings - staticReflectionClassNamePatterns: - - "#^COM$#" typeAliases: #variadics don't work for this - mixed probably shouldn't work either, but for now it does #what we actually need is something that accepts an infinite number of parameters, but in the absence of that, diff --git a/src/block/Block.php b/src/block/Block.php index dbc269c630..89fe392658 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -362,6 +362,8 @@ class Block{ * * A replacement block may be returned. This is useful if the block type changed due to reading of world data (e.g. * data from a block entity). + * + * @phpstan-impure */ public function readStateFromWorld() : Block{ return $this; diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 6f1d35b983..7866dabdc6 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -89,6 +89,11 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ public function straightOnlyRailShape(int &$railShape) : void; + /** + * @phpstan-template T of \UnitEnum + * @phpstan-param T &$case + * @phpstan-param-out T &$case + */ public function enum(\UnitEnum &$case) : void; /** From 09bf203267aca9b83a09640e17bfac0fc7b58ff8 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Tue, 12 Nov 2024 22:57:14 +0000 Subject: [PATCH 1817/1858] Update RuntimeDataDescriber.php --- src/data/runtime/RuntimeDataDescriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 7866dabdc6..6eb552a7b6 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -92,7 +92,7 @@ interface RuntimeDataDescriber extends RuntimeEnumDescriber{ /** * @phpstan-template T of \UnitEnum * @phpstan-param T &$case - * @phpstan-param-out T &$case + * @phpstan-param-out T $case */ public function enum(\UnitEnum &$case) : void; From fbeb01767075a6e8022822bf8791d82096bf7067 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 13 Nov 2024 14:55:14 +0000 Subject: [PATCH 1818/1858] Promise: allow zero promises not supporting this has caused problems every time this function has been used in reality so far (#6092 and #6333). --- src/promise/Promise.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/promise/Promise.php b/src/promise/Promise.php index 0def7e6052..27a5e50aab 100644 --- a/src/promise/Promise.php +++ b/src/promise/Promise.php @@ -69,16 +69,17 @@ final class Promise{ * * @phpstan-template TPromiseValue * @phpstan-template TKey of array-key - * @phpstan-param non-empty-array> $promises + * @phpstan-param array> $promises * * @phpstan-return Promise> */ public static function all(array $promises) : Promise{ - if(count($promises) === 0){ - throw new \InvalidArgumentException("At least one promise must be provided"); - } /** @phpstan-var PromiseResolver> $resolver */ $resolver = new PromiseResolver(); + if(count($promises) === 0){ + $resolver->resolve([]); + return $resolver->getPromise(); + } $values = []; $toResolve = count($promises); $continue = true; From 9b58d355162bc01c9c7b81e4e6bb65b2d64eb415 Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Thu, 14 Nov 2024 08:57:07 -0500 Subject: [PATCH 1819/1858] Implement Goat horns (#5232) Co-authored-by: ipad54 <63200545+ipad54@users.noreply.github.com> Co-authored-by: Dylan T. --- src/data/bedrock/GoatHornTypeIdMap.php | 48 +++++++++++++ src/data/bedrock/GoatHornTypeIds.php | 35 +++++++++ .../ItemSerializerDeserializerRegistrar.php | 10 +++ src/item/GoatHorn.php | 71 +++++++++++++++++++ src/item/GoatHornType.php | 36 ++++++++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 8 +++ src/item/VanillaItems.php | 2 + src/world/sound/GoatHornSound.php | 46 ++++++++++++ 9 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 src/data/bedrock/GoatHornTypeIdMap.php create mode 100644 src/data/bedrock/GoatHornTypeIds.php create mode 100644 src/item/GoatHorn.php create mode 100644 src/item/GoatHornType.php create mode 100644 src/world/sound/GoatHornSound.php diff --git a/src/data/bedrock/GoatHornTypeIdMap.php b/src/data/bedrock/GoatHornTypeIdMap.php new file mode 100644 index 0000000000..0510a09cee --- /dev/null +++ b/src/data/bedrock/GoatHornTypeIdMap.php @@ -0,0 +1,48 @@ + */ + use IntSaveIdMapTrait; + + private function __construct(){ + foreach(GoatHornType::cases() as $case){ + $this->register(match($case){ + GoatHornType::PONDER => GoatHornTypeIds::PONDER, + GoatHornType::SING => GoatHornTypeIds::SING, + GoatHornType::SEEK => GoatHornTypeIds::SEEK, + GoatHornType::FEEL => GoatHornTypeIds::FEEL, + GoatHornType::ADMIRE => GoatHornTypeIds::ADMIRE, + GoatHornType::CALL => GoatHornTypeIds::CALL, + GoatHornType::YEARN => GoatHornTypeIds::YEARN, + GoatHornType::DREAM => GoatHornTypeIds::DREAM + }, $case); + } + } +} diff --git a/src/data/bedrock/GoatHornTypeIds.php b/src/data/bedrock/GoatHornTypeIds.php new file mode 100644 index 0000000000..048d246fe0 --- /dev/null +++ b/src/data/bedrock/GoatHornTypeIds.php @@ -0,0 +1,35 @@ + DyeColorIdMap::getInstance()->toInvertedId($item->getColor()) ); + $this->map1to1ItemWithMeta( + Ids::GOAT_HORN, + Items::GOAT_HORN(), + function(GoatHorn $item, int $meta) : void{ + $item->setHornType(GoatHornTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown goat horn type ID $meta")); + }, + fn(GoatHorn $item) => GoatHornTypeIdMap::getInstance()->toId($item->getHornType()) + ); $this->map1to1ItemWithMeta( Ids::MEDICINE, Items::MEDICINE(), diff --git a/src/item/GoatHorn.php b/src/item/GoatHorn.php new file mode 100644 index 0000000000..088701e398 --- /dev/null +++ b/src/item/GoatHorn.php @@ -0,0 +1,71 @@ +enum($this->goatHornType); + } + + public function getHornType() : GoatHornType{ return $this->goatHornType; } + + /** + * @return $this + */ + public function setHornType(GoatHornType $type) : self{ + $this->goatHornType = $type; + return $this; + } + + public function getMaxStackSize() : int{ + return 1; + } + + public function getCooldownTicks() : int{ + return 140; + } + + public function getCooldownTag() : ?string{ + return ItemCooldownTags::GOAT_HORN; + } + + public function canStartUsingItem(Player $player) : bool{ + return true; + } + + public function onClickAir(Player $player, Vector3 $directionVector, array &$returnedItems) : ItemUseResult{ + $position = $player->getPosition(); + $position->getWorld()->addSound($position, new GoatHornSound($this->goatHornType)); + + return ItemUseResult::SUCCESS; + } +} diff --git a/src/item/GoatHornType.php b/src/item/GoatHornType.php new file mode 100644 index 0000000000..6c0c3b2f7f --- /dev/null +++ b/src/item/GoatHornType.php @@ -0,0 +1,36 @@ +register($prefix("dye"), fn() => Items::DYE()->setColor($color)); } + + foreach(GoatHornType::cases() as $goatHornType){ + $prefix = fn(string $name) => strtolower($goatHornType->name) . "_" . $name; + + $result->register($prefix("goat_horn"), fn() => Items::GOAT_HORN()->setHornType($goatHornType)); + } + foreach(SuspiciousStewType::cases() as $suspiciousStewType){ $prefix = fn(string $name) => strtolower($suspiciousStewType->name) . "_" . $name; @@ -1341,6 +1348,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("glow_berries", fn() => Items::GLOW_BERRIES()); $result->register("glow_ink_sac", fn() => Items::GLOW_INK_SAC()); $result->register("glowstone_dust", fn() => Items::GLOWSTONE_DUST()); + $result->register("goat_horn", fn() => Items::GOAT_HORN()); $result->register("gold_axe", fn() => Items::GOLDEN_AXE()); $result->register("gold_boots", fn() => Items::GOLDEN_BOOTS()); $result->register("gold_chestplate", fn() => Items::GOLDEN_CHESTPLATE()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 5115ee48a8..c5ab594479 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -171,6 +171,7 @@ use function strtolower; * @method static Item GLOWSTONE_DUST() * @method static GlowBerries GLOW_BERRIES() * @method static Item GLOW_INK_SAC() + * @method static GoatHorn GOAT_HORN() * @method static GoldenApple GOLDEN_APPLE() * @method static Axe GOLDEN_AXE() * @method static Armor GOLDEN_BOOTS() @@ -468,6 +469,7 @@ final class VanillaItems{ self::register("glow_berries", new GlowBerries(new IID(Ids::GLOW_BERRIES), "Glow Berries")); self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); self::register("glowstone_dust", new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); + self::register("goat_horn", new GoatHorn(new IID(Ids::GOAT_HORN), "Goat Horn")); self::register("gold_ingot", new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); self::register("gold_nugget", new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); self::register("golden_apple", new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); diff --git a/src/world/sound/GoatHornSound.php b/src/world/sound/GoatHornSound.php new file mode 100644 index 0000000000..3987db3dae --- /dev/null +++ b/src/world/sound/GoatHornSound.php @@ -0,0 +1,46 @@ +goatHornType){ + GoatHornType::PONDER => LevelSoundEvent::HORN_CALL0, + GoatHornType::SING => LevelSoundEvent::HORN_CALL1, + GoatHornType::SEEK => LevelSoundEvent::HORN_CALL2, + GoatHornType::FEEL => LevelSoundEvent::HORN_CALL3, + GoatHornType::ADMIRE => LevelSoundEvent::HORN_CALL4, + GoatHornType::CALL => LevelSoundEvent::HORN_CALL5, + GoatHornType::YEARN => LevelSoundEvent::HORN_CALL6, + GoatHornType::DREAM => LevelSoundEvent::HORN_CALL7 + }, $pos, false)]; + } +} From 33a7b463293af01a0234f20064b42f99ea09df51 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Thu, 14 Nov 2024 17:32:22 +0000 Subject: [PATCH 1820/1858] Use reflection to locate BlockTypeIds and ItemTypeIds for VanillaBlocks/VanillaItems (#6498) Use reflection to locate BlockTypeIds and ItemTypeIds for VanillaBlocks/VanillaItems Since BlockTypeIds and ItemTypeIds are derived from VanillaBlocks and VanillaItems respectively anyway (they only exist to allow identifying blocks/items without having to create instances of them), this hack is probably OK, and reduces the chances of mistakes. Previously it was explored to have these IDs generated by auto-incrementing in VanillaBlocks/Items and have the constants generated that way, but this proved to be too problematic because of unstable diffs no matter how we chose to sort the elements. See #6313 for previous research on the subject. This is obviously not a desirable hack to keep long-term. In the future it will probably make sense to redesign VanillaBlocks like so: enum VanillaBlocks { ... } VanillaBlocks::STONE (the type ID) VanillaBlocks::STONE->new() (to create a block) However, more research is needed on this, as I'd prefer not to make block creation any more verbose. --- src/block/VanillaBlocks.php | 1215 +++++++++++----------- src/block/WoodLikeBlockIdHelper.php | 263 ----- src/item/VanillaItems.php | 596 +++++------ tests/phpstan/configs/phpstan-bugs.neon | 50 + tests/phpunit/block/BlockTypeIdsTest.php | 1 + tests/phpunit/item/ItemTypeIdsTest.php | 1 + 6 files changed, 983 insertions(+), 1143 deletions(-) delete mode 100644 src/block/WoodLikeBlockIdHelper.php diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index 60540dfb83..54cf90a0c3 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -26,7 +26,6 @@ namespace pocketmine\block; use pocketmine\block\BlockBreakInfo as BreakInfo; use pocketmine\block\BlockIdentifier as BID; use pocketmine\block\BlockToolType as ToolType; -use pocketmine\block\BlockTypeIds as Ids; use pocketmine\block\BlockTypeInfo as Info; use pocketmine\block\BlockTypeTags as Tags; use pocketmine\block\tile\Banner as TileBanner; @@ -56,6 +55,7 @@ use pocketmine\block\tile\NormalFurnace as TileNormalFurnace; use pocketmine\block\tile\Note as TileNote; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\tile\Smoker as TileSmoker; +use pocketmine\block\tile\Tile; use pocketmine\block\utils\AmethystTrait; use pocketmine\block\utils\LeavesType; use pocketmine\block\utils\SaplingType; @@ -64,9 +64,12 @@ use pocketmine\crafting\FurnaceType; use pocketmine\item\enchantment\ItemEnchantmentTags as EnchantmentTags; use pocketmine\item\Item; use pocketmine\item\ToolTier; +use pocketmine\item\VanillaItems; use pocketmine\math\Facing; use pocketmine\utils\CloningRegistryTrait; +use function is_int; use function mb_strtolower; +use function mb_strtoupper; use function strtolower; /** @@ -793,8 +796,28 @@ final class VanillaBlocks{ //NOOP } - protected static function register(string $name, Block $block) : void{ + /** + * @phpstan-template TBlock of Block + * @phpstan-param \Closure(BID) : TBlock $createBlock + * @phpstan-param class-string $tileClass + * @phpstan-return TBlock + */ + protected static function register(string $name, \Closure $createBlock, ?string $tileClass = null) : Block{ + //this sketchy hack allows us to avoid manually writing the constants inline + //since type IDs are generated from this class anyway, I'm OK with this hack + //nonetheless, we should try to get rid of it in a future major version (e.g by using string type IDs) + $reflect = new \ReflectionClass(BlockTypeIds::class); + $typeId = $reflect->getConstant(mb_strtoupper($name)); + if(!is_int($typeId)){ + //this allows registering new stuff without adding new type ID constants + //this reduces the number of mandatory steps to test new features in local development + \GlobalLogger::get()->error(self::class . ": No constant type ID found for $name, generating a new one"); + $typeId = BlockTypeIds::newId(); + } + $block = $createBlock(new BID($typeId, $tileClass)); self::_registryRegister($name, $block); + + return $block; } /** @@ -809,11 +832,12 @@ final class VanillaBlocks{ } protected static function setup() : void{ + self::register("air", fn(BID $id) => new Air($id, "Air", new Info(BreakInfo::indestructible(-1.0)))); + $railBreakInfo = new Info(new BreakInfo(0.7)); - self::register("activator_rail", new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL), "Activator Rail", $railBreakInfo)); - self::register("air", new Air(new BID(Ids::AIR), "Air", new Info(BreakInfo::indestructible(-1.0)))); - self::register("anvil", new Anvil(new BID(Ids::ANVIL), "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); - self::register("bamboo", new Bamboo(new BID(Ids::BAMBOO), "Bamboo", new Info(new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ + self::register("activator_rail", fn(BID $id) => new ActivatorRail($id, "Activator Rail", $railBreakInfo)); + self::register("anvil", fn(BID $id) => new Anvil($id, "Anvil", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); + self::register("bamboo", fn(BID $id) => new Bamboo($id, "Bamboo", new Info(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; @@ -821,242 +845,242 @@ final class VanillaBlocks{ return parent::getBreakTime($item); } }, [Tags::POTTABLE_PLANTS]))); - self::register("bamboo_sapling", new BambooSapling(new BID(Ids::BAMBOO_SAPLING), "Bamboo Sapling", new Info(BreakInfo::instant()))); + self::register("bamboo_sapling", fn(BID $id) => new BambooSapling($id, "Bamboo Sapling", new Info(BreakInfo::instant()))); $bannerBreakInfo = new Info(BreakInfo::axe(1.0)); - self::register("banner", new FloorBanner(new BID(Ids::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); - self::register("wall_banner", new WallBanner(new BID(Ids::WALL_BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - self::register("barrel", new Barrel(new BID(Ids::BARREL, TileBarrel::class), "Barrel", new Info(BreakInfo::axe(2.5)))); - self::register("barrier", new Transparent(new BID(Ids::BARRIER), "Barrier", new Info(BreakInfo::indestructible()))); - self::register("beacon", new Beacon(new BID(Ids::BEACON, TileBeacon::class), "Beacon", new Info(new BreakInfo(3.0)))); - self::register("bed", new Bed(new BID(Ids::BED, TileBed::class), "Bed Block", new Info(new BreakInfo(0.2)))); - self::register("bedrock", new Bedrock(new BID(Ids::BEDROCK), "Bedrock", new Info(BreakInfo::indestructible()))); + self::register("banner", fn(BID $id) => new FloorBanner($id, "Banner", $bannerBreakInfo), TileBanner::class); + self::register("wall_banner", fn(BID $id) => new WallBanner($id, "Wall Banner", $bannerBreakInfo), TileBanner::class); + self::register("barrel", fn(BID $id) => new Barrel($id, "Barrel", new Info(BreakInfo::axe(2.5))), TileBarrel::class); + self::register("barrier", fn(BID $id) => new Transparent($id, "Barrier", new Info(BreakInfo::indestructible()))); + self::register("beacon", fn(BID $id) => new Beacon($id, "Beacon", new Info(new BreakInfo(3.0))), TileBeacon::class); + self::register("bed", fn(BID $id) => new Bed($id, "Bed Block", new Info(new BreakInfo(0.2))), TileBed::class); + self::register("bedrock", fn(BID $id) => new Bedrock($id, "Bedrock", new Info(BreakInfo::indestructible()))); - self::register("beetroots", new Beetroot(new BID(Ids::BEETROOTS), "Beetroot Block", new Info(BreakInfo::instant()))); - self::register("bell", new Bell(new BID(Ids::BELL, TileBell::class), "Bell", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); - self::register("blue_ice", new BlueIce(new BID(Ids::BLUE_ICE), "Blue Ice", new Info(BreakInfo::pickaxe(2.8)))); - self::register("bone_block", new BoneBlock(new BID(Ids::BONE_BLOCK), "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD)))); - self::register("bookshelf", new Bookshelf(new BID(Ids::BOOKSHELF), "Bookshelf", new Info(BreakInfo::axe(1.5)))); - self::register("chiseled_bookshelf", new ChiseledBookshelf(new BID(Ids::CHISELED_BOOKSHELF, TileChiseledBookshelf::class), "Chiseled Bookshelf", new Info(BreakInfo::axe(1.5)))); - self::register("brewing_stand", new BrewingStand(new BID(Ids::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); + self::register("beetroots", fn(BID $id) => new Beetroot($id, "Beetroot Block", new Info(BreakInfo::instant()))); + self::register("bell", fn(BID $id) => new Bell($id, "Bell", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD))), TileBell::class); + self::register("blue_ice", fn(BID $id) => new BlueIce($id, "Blue Ice", new Info(BreakInfo::pickaxe(2.8)))); + self::register("bone_block", fn(BID $id) => new BoneBlock($id, "Bone Block", new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD)))); + self::register("bookshelf", fn(BID $id) => new Bookshelf($id, "Bookshelf", new Info(BreakInfo::axe(1.5)))); + self::register("chiseled_bookshelf", fn(BID $id) => new ChiseledBookshelf($id, "Chiseled Bookshelf", new Info(BreakInfo::axe(1.5))), TileChiseledBookshelf::class); + self::register("brewing_stand", fn(BID $id) => new BrewingStand($id, "Brewing Stand", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD))), TileBrewingStand::class); $bricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("brick_stairs", new Stair(new BID(Ids::BRICK_STAIRS), "Brick Stairs", $bricksBreakInfo)); - self::register("bricks", new Opaque(new BID(Ids::BRICKS), "Bricks", $bricksBreakInfo)); + self::register("brick_stairs", fn(BID $id) => new Stair($id, "Brick Stairs", $bricksBreakInfo)); + self::register("bricks", fn(BID $id) => new Opaque($id, "Bricks", $bricksBreakInfo)); - self::register("brown_mushroom", new BrownMushroom(new BID(Ids::BROWN_MUSHROOM), "Brown Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); - self::register("cactus", new Cactus(new BID(Ids::CACTUS), "Cactus", new Info(new BreakInfo(0.4), [Tags::POTTABLE_PLANTS]))); - self::register("cake", new Cake(new BID(Ids::CAKE), "Cake", new Info(new BreakInfo(0.5)))); + self::register("brown_mushroom", fn(BID $id) => new BrownMushroom($id, "Brown Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); + self::register("cactus", fn(BID $id) => new Cactus($id, "Cactus", new Info(new BreakInfo(0.4), [Tags::POTTABLE_PLANTS]))); + self::register("cake", fn(BID $id) => new Cake($id, "Cake", new Info(new BreakInfo(0.5)))); $campfireBreakInfo = new Info(BreakInfo::axe(2.0)); - self::register("campfire", new Campfire(new BID(Ids::CAMPFIRE, TileCampfire::class), "Campfire", $campfireBreakInfo)); - self::register("soul_campfire", new SoulCampfire(new BID(Ids::SOUL_CAMPFIRE, TileCampfire::class), "Soul Campfire", $campfireBreakInfo)); + self::register("campfire", fn(BID $id) => new Campfire($id, "Campfire", $campfireBreakInfo), TileCampfire::class); + self::register("soul_campfire", fn(BID $id) => new SoulCampfire($id, "Soul Campfire", $campfireBreakInfo), TileCampfire::class); - self::register("carrots", new Carrot(new BID(Ids::CARROTS), "Carrot Block", new Info(BreakInfo::instant()))); + self::register("carrots", fn(BID $id) => new Carrot($id, "Carrot Block", new Info(BreakInfo::instant()))); $chestBreakInfo = new Info(BreakInfo::axe(2.5)); - self::register("chest", new Chest(new BID(Ids::CHEST, TileChest::class), "Chest", $chestBreakInfo)); - self::register("clay", new Clay(new BID(Ids::CLAY), "Clay Block", new Info(BreakInfo::shovel(0.6)))); - self::register("coal", new Coal(new BID(Ids::COAL), "Coal Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); + self::register("chest", fn(BID $id) => new Chest($id, "Chest", $chestBreakInfo), TileChest::class); + self::register("clay", fn(BID $id) => new Clay($id, "Clay Block", new Info(BreakInfo::shovel(0.6)))); + self::register("coal", fn(BID $id) => new Coal($id, "Coal Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); $cobblestoneBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("cobblestone", $cobblestone = new Opaque(new BID(Ids::COBBLESTONE), "Cobblestone", $cobblestoneBreakInfo)); - self::register("mossy_cobblestone", new Opaque(new BID(Ids::MOSSY_COBBLESTONE), "Mossy Cobblestone", $cobblestoneBreakInfo)); - self::register("cobblestone_stairs", new Stair(new BID(Ids::COBBLESTONE_STAIRS), "Cobblestone Stairs", $cobblestoneBreakInfo)); - self::register("mossy_cobblestone_stairs", new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); + $cobblestone = self::register("cobblestone", fn(BID $id) => new Opaque($id, "Cobblestone", $cobblestoneBreakInfo)); + self::register("mossy_cobblestone", fn(BID $id) => new Opaque($id, "Mossy Cobblestone", $cobblestoneBreakInfo)); + self::register("cobblestone_stairs", fn(BID $id) => new Stair($id, "Cobblestone Stairs", $cobblestoneBreakInfo)); + self::register("mossy_cobblestone_stairs", fn(BID $id) => new Stair($id, "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - self::register("cobweb", new Cobweb(new BID(Ids::COBWEB), "Cobweb", new Info(new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1)))); - self::register("cocoa_pod", new CocoaBlock(new BID(Ids::COCOA_POD), "Cocoa Block", new Info(BreakInfo::axe(0.2, null, 15.0)))); - self::register("coral_block", new CoralBlock(new BID(Ids::CORAL_BLOCK), "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD)))); - self::register("daylight_sensor", new DaylightSensor(new BID(Ids::DAYLIGHT_SENSOR, TileDaylightSensor::class), "Daylight Sensor", new Info(BreakInfo::axe(0.2)))); - self::register("dead_bush", new DeadBush(new BID(Ids::DEAD_BUSH), "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); - self::register("detector_rail", new DetectorRail(new BID(Ids::DETECTOR_RAIL), "Detector Rail", $railBreakInfo)); + self::register("cobweb", fn(BID $id) => new Cobweb($id, "Cobweb", new Info(new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1)))); + self::register("cocoa_pod", fn(BID $id) => new CocoaBlock($id, "Cocoa Block", new Info(BreakInfo::axe(0.2, null, 15.0)))); + self::register("coral_block", fn(BID $id) => new CoralBlock($id, "Coral Block", new Info(BreakInfo::pickaxe(7.0, ToolTier::WOOD)))); + self::register("daylight_sensor", fn(BID $id) => new DaylightSensor($id, "Daylight Sensor", new Info(BreakInfo::axe(0.2))), TileDaylightSensor::class); + self::register("dead_bush", fn(BID $id) => new DeadBush($id, "Dead Bush", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); + self::register("detector_rail", fn(BID $id) => new DetectorRail($id, "Detector Rail", $railBreakInfo)); - self::register("diamond", new Opaque(new BID(Ids::DIAMOND), "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); - self::register("dirt", new Dirt(new BID(Ids::DIRT), "Dirt", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); - self::register("sunflower", new DoublePlant(new BID(Ids::SUNFLOWER), "Sunflower", new Info(BreakInfo::instant()))); - self::register("lilac", new DoublePlant(new BID(Ids::LILAC), "Lilac", new Info(BreakInfo::instant()))); - self::register("rose_bush", new DoublePlant(new BID(Ids::ROSE_BUSH), "Rose Bush", new Info(BreakInfo::instant()))); - self::register("peony", new DoublePlant(new BID(Ids::PEONY), "Peony", new Info(BreakInfo::instant()))); - self::register("pink_petals", new PinkPetals(new BID(Ids::PINK_PETALS), "Pink Petals", new Info(BreakInfo::instant()))); - self::register("double_tallgrass", new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS), "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("large_fern", new DoubleTallGrass(new BID(Ids::LARGE_FERN), "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("pitcher_plant", new DoublePlant(new BID(Ids::PITCHER_PLANT), "Pitcher Plant", new Info(BreakInfo::instant()))); - self::register("pitcher_crop", new PitcherCrop(new BID(Ids::PITCHER_CROP), "Pitcher Crop", new Info(BreakInfo::instant()))); - self::register("double_pitcher_crop", new DoublePitcherCrop(new BID(Ids::DOUBLE_PITCHER_CROP), "Double Pitcher Crop", new Info(BreakInfo::instant()))); - self::register("dragon_egg", new DragonEgg(new BID(Ids::DRAGON_EGG), "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); - self::register("dried_kelp", new DriedKelp(new BID(Ids::DRIED_KELP), "Dried Kelp Block", new Info(new BreakInfo(0.5, ToolType::NONE, 0, 12.5)))); - self::register("emerald", new Opaque(new BID(Ids::EMERALD), "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); - self::register("enchanting_table", new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, TileEnchantingTable::class), "Enchanting Table", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0)))); - self::register("end_portal_frame", new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME), "End Portal Frame", new Info(BreakInfo::indestructible()))); - self::register("end_rod", new EndRod(new BID(Ids::END_ROD), "End Rod", new Info(BreakInfo::instant()))); - self::register("end_stone", new Opaque(new BID(Ids::END_STONE), "End Stone", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 45.0)))); + self::register("diamond", fn(BID $id) => new Opaque($id, "Diamond Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); + self::register("dirt", fn(BID $id) => new Dirt($id, "Dirt", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); + self::register("sunflower", fn(BID $id) => new DoublePlant($id, "Sunflower", new Info(BreakInfo::instant()))); + self::register("lilac", fn(BID $id) => new DoublePlant($id, "Lilac", new Info(BreakInfo::instant()))); + self::register("rose_bush", fn(BID $id) => new DoublePlant($id, "Rose Bush", new Info(BreakInfo::instant()))); + self::register("peony", fn(BID $id) => new DoublePlant($id, "Peony", new Info(BreakInfo::instant()))); + self::register("pink_petals", fn(BID $id) => new PinkPetals($id, "Pink Petals", new Info(BreakInfo::instant()))); + self::register("double_tallgrass", fn(BID $id) => new DoubleTallGrass($id, "Double Tallgrass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("large_fern", fn(BID $id) => new DoubleTallGrass($id, "Large Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("pitcher_plant", fn(BID $id) => new DoublePlant($id, "Pitcher Plant", new Info(BreakInfo::instant()))); + self::register("pitcher_crop", fn(BID $id) => new PitcherCrop($id, "Pitcher Crop", new Info(BreakInfo::instant()))); + self::register("double_pitcher_crop", fn(BID $id) => new DoublePitcherCrop($id, "Double Pitcher Crop", new Info(BreakInfo::instant()))); + self::register("dragon_egg", fn(BID $id) => new DragonEgg($id, "Dragon Egg", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); + self::register("dried_kelp", fn(BID $id) => new DriedKelp($id, "Dried Kelp Block", new Info(new BreakInfo(0.5, ToolType::NONE, 0, 12.5)))); + self::register("emerald", fn(BID $id) => new Opaque($id, "Emerald Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::IRON, 30.0)))); + self::register("enchanting_table", fn(BID $id) => new EnchantingTable($id, "Enchanting Table", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 6000.0))), TileEnchantingTable::class); + self::register("end_portal_frame", fn(BID $id) => new EndPortalFrame($id, "End Portal Frame", new Info(BreakInfo::indestructible()))); + self::register("end_rod", fn(BID $id) => new EndRod($id, "End Rod", new Info(BreakInfo::instant()))); + self::register("end_stone", fn(BID $id) => new Opaque($id, "End Stone", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 45.0)))); $endBrickBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD, 4.0)); - self::register("end_stone_bricks", new Opaque(new BID(Ids::END_STONE_BRICKS), "End Stone Bricks", $endBrickBreakInfo)); - self::register("end_stone_brick_stairs", new Stair(new BID(Ids::END_STONE_BRICK_STAIRS), "End Stone Brick Stairs", $endBrickBreakInfo)); + self::register("end_stone_bricks", fn(BID $id) => new Opaque($id, "End Stone Bricks", $endBrickBreakInfo)); + self::register("end_stone_brick_stairs", fn(BID $id) => new Stair($id, "End Stone Brick Stairs", $endBrickBreakInfo)); - self::register("ender_chest", new EnderChest(new BID(Ids::ENDER_CHEST, TileEnderChest::class), "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD, 3000.0)))); - self::register("farmland", new Farmland(new BID(Ids::FARMLAND), "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); - self::register("fire", new Fire(new BID(Ids::FIRE), "Fire Block", new Info(BreakInfo::instant(), [Tags::FIRE]))); + self::register("ender_chest", fn(BID $id) => new EnderChest($id, "Ender Chest", new Info(BreakInfo::pickaxe(22.5, ToolTier::WOOD, 3000.0))), TileEnderChest::class); + self::register("farmland", fn(BID $id) => new Farmland($id, "Farmland", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); + self::register("fire", fn(BID $id) => new Fire($id, "Fire Block", new Info(BreakInfo::instant(), [Tags::FIRE]))); $flowerTypeInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); - self::register("dandelion", new Flower(new BID(Ids::DANDELION), "Dandelion", $flowerTypeInfo)); - self::register("poppy", new Flower(new BID(Ids::POPPY), "Poppy", $flowerTypeInfo)); - self::register("allium", new Flower(new BID(Ids::ALLIUM), "Allium", $flowerTypeInfo)); - self::register("azure_bluet", new Flower(new BID(Ids::AZURE_BLUET), "Azure Bluet", $flowerTypeInfo)); - self::register("blue_orchid", new Flower(new BID(Ids::BLUE_ORCHID), "Blue Orchid", $flowerTypeInfo)); - self::register("cornflower", new Flower(new BID(Ids::CORNFLOWER), "Cornflower", $flowerTypeInfo)); - self::register("lily_of_the_valley", new Flower(new BID(Ids::LILY_OF_THE_VALLEY), "Lily of the Valley", $flowerTypeInfo)); - self::register("orange_tulip", new Flower(new BID(Ids::ORANGE_TULIP), "Orange Tulip", $flowerTypeInfo)); - self::register("oxeye_daisy", new Flower(new BID(Ids::OXEYE_DAISY), "Oxeye Daisy", $flowerTypeInfo)); - self::register("pink_tulip", new Flower(new BID(Ids::PINK_TULIP), "Pink Tulip", $flowerTypeInfo)); - self::register("red_tulip", new Flower(new BID(Ids::RED_TULIP), "Red Tulip", $flowerTypeInfo)); - self::register("white_tulip", new Flower(new BID(Ids::WHITE_TULIP), "White Tulip", $flowerTypeInfo)); - self::register("torchflower", new Flower(new BID(Ids::TORCHFLOWER), "Torchflower", $flowerTypeInfo)); - self::register("torchflower_crop", new TorchflowerCrop(new BID(Ids::TORCHFLOWER_CROP), "Torchflower Crop", new Info(BreakInfo::instant()))); - self::register("flower_pot", new FlowerPot(new BID(Ids::FLOWER_POT, TileFlowerPot::class), "Flower Pot", new Info(BreakInfo::instant()))); - self::register("frosted_ice", new FrostedIce(new BID(Ids::FROSTED_ICE), "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); - self::register("furnace", new Furnace(new BID(Ids::FURNACE, TileNormalFurnace::class), "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::FURNACE)); - self::register("blast_furnace", new Furnace(new BID(Ids::BLAST_FURNACE, TileBlastFurnace::class), "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::BLAST_FURNACE)); - self::register("smoker", new Furnace(new BID(Ids::SMOKER, TileSmoker::class), "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::SMOKER)); + self::register("dandelion", fn(BID $id) => new Flower($id, "Dandelion", $flowerTypeInfo)); + self::register("poppy", fn(BID $id) => new Flower($id, "Poppy", $flowerTypeInfo)); + self::register("allium", fn(BID $id) => new Flower($id, "Allium", $flowerTypeInfo)); + self::register("azure_bluet", fn(BID $id) => new Flower($id, "Azure Bluet", $flowerTypeInfo)); + self::register("blue_orchid", fn(BID $id) => new Flower($id, "Blue Orchid", $flowerTypeInfo)); + self::register("cornflower", fn(BID $id) => new Flower($id, "Cornflower", $flowerTypeInfo)); + self::register("lily_of_the_valley", fn(BID $id) => new Flower($id, "Lily of the Valley", $flowerTypeInfo)); + self::register("orange_tulip", fn(BID $id) => new Flower($id, "Orange Tulip", $flowerTypeInfo)); + self::register("oxeye_daisy", fn(BID $id) => new Flower($id, "Oxeye Daisy", $flowerTypeInfo)); + self::register("pink_tulip", fn(BID $id) => new Flower($id, "Pink Tulip", $flowerTypeInfo)); + self::register("red_tulip", fn(BID $id) => new Flower($id, "Red Tulip", $flowerTypeInfo)); + self::register("white_tulip", fn(BID $id) => new Flower($id, "White Tulip", $flowerTypeInfo)); + self::register("torchflower", fn(BID $id) => new Flower($id, "Torchflower", $flowerTypeInfo)); + self::register("torchflower_crop", fn(BID $id) => new TorchflowerCrop($id, "Torchflower Crop", new Info(BreakInfo::instant()))); + self::register("flower_pot", fn(BID $id) => new FlowerPot($id, "Flower Pot", new Info(BreakInfo::instant())), TileFlowerPot::class); + self::register("frosted_ice", fn(BID $id) => new FrostedIce($id, "Frosted Ice", new Info(BreakInfo::pickaxe(2.5)))); + self::register("furnace", fn(BID $id) => new Furnace($id, "Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::FURNACE), TileNormalFurnace::class); + self::register("blast_furnace", fn(BID $id) => new Furnace($id, "Blast Furnace", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::BLAST_FURNACE), TileBlastFurnace::class); + self::register("smoker", fn(BID $id) => new Furnace($id, "Smoker", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)), FurnaceType::SMOKER), TileSmoker::class); $glassBreakInfo = new Info(new BreakInfo(0.3)); - self::register("glass", new Glass(new BID(Ids::GLASS), "Glass", $glassBreakInfo)); - self::register("glass_pane", new GlassPane(new BID(Ids::GLASS_PANE), "Glass Pane", $glassBreakInfo)); - self::register("glowing_obsidian", new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN), "Glowing Obsidian", new Info(BreakInfo::pickaxe(10.0, ToolTier::DIAMOND, 50.0)))); - self::register("glowstone", new Glowstone(new BID(Ids::GLOWSTONE), "Glowstone", new Info(BreakInfo::pickaxe(0.3)))); - self::register("glow_lichen", new GlowLichen(new BID(Ids::GLOW_LICHEN), "Glow Lichen", new Info(BreakInfo::axe(0.2, null, 0.2)))); - self::register("gold", new Opaque(new BID(Ids::GOLD), "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON, 30.0)))); + self::register("glass", fn(BID $id) => new Glass($id, "Glass", $glassBreakInfo)); + self::register("glass_pane", fn(BID $id) => new GlassPane($id, "Glass Pane", $glassBreakInfo)); + self::register("glowing_obsidian", fn(BID $id) => new GlowingObsidian($id, "Glowing Obsidian", new Info(BreakInfo::pickaxe(10.0, ToolTier::DIAMOND, 50.0)))); + self::register("glowstone", fn(BID $id) => new Glowstone($id, "Glowstone", new Info(BreakInfo::pickaxe(0.3)))); + self::register("glow_lichen", fn(BID $id) => new GlowLichen($id, "Glow Lichen", new Info(BreakInfo::axe(0.2, null, 0.2)))); + self::register("gold", fn(BID $id) => new Opaque($id, "Gold Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::IRON, 30.0)))); $grassBreakInfo = BreakInfo::shovel(0.6); - self::register("grass", new Grass(new BID(Ids::GRASS), "Grass", new Info($grassBreakInfo, [Tags::DIRT]))); - self::register("grass_path", new GrassPath(new BID(Ids::GRASS_PATH), "Grass Path", new Info($grassBreakInfo))); - self::register("gravel", new Gravel(new BID(Ids::GRAVEL), "Gravel", new Info(BreakInfo::shovel(0.6)))); + self::register("grass", fn(BID $id) => new Grass($id, "Grass", new Info($grassBreakInfo, [Tags::DIRT]))); + self::register("grass_path", fn(BID $id) => new GrassPath($id, "Grass Path", new Info($grassBreakInfo))); + self::register("gravel", fn(BID $id) => new Gravel($id, "Gravel", new Info(BreakInfo::shovel(0.6)))); $hardenedClayBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD, 21.0)); - self::register("hardened_clay", new HardenedClay(new BID(Ids::HARDENED_CLAY), "Hardened Clay", $hardenedClayBreakInfo)); + self::register("hardened_clay", fn(BID $id) => new HardenedClay($id, "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new Info(new BreakInfo(10.0)); - self::register("hardened_glass", new HardenedGlass(new BID(Ids::HARDENED_GLASS), "Hardened Glass", $hardenedGlassBreakInfo)); - self::register("hardened_glass_pane", new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - self::register("hay_bale", new HayBale(new BID(Ids::HAY_BALE), "Hay Bale", new Info(new BreakInfo(0.5)))); - self::register("hopper", new Hopper(new BID(Ids::HOPPER, TileHopper::class), "Hopper", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 15.0)))); - self::register("ice", new Ice(new BID(Ids::ICE), "Ice", new Info(BreakInfo::pickaxe(0.5)))); + self::register("hardened_glass", fn(BID $id) => new HardenedGlass($id, "Hardened Glass", $hardenedGlassBreakInfo)); + self::register("hardened_glass_pane", fn(BID $id) => new HardenedGlassPane($id, "Hardened Glass Pane", $hardenedGlassBreakInfo)); + self::register("hay_bale", fn(BID $id) => new HayBale($id, "Hay Bale", new Info(new BreakInfo(0.5)))); + self::register("hopper", fn(BID $id) => new Hopper($id, "Hopper", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD, 15.0))), TileHopper::class); + self::register("ice", fn(BID $id) => new Ice($id, "Ice", new Info(BreakInfo::pickaxe(0.5)))); $updateBlockBreakInfo = new Info(new BreakInfo(1.0)); - self::register("info_update", new Opaque(new BID(Ids::INFO_UPDATE), "update!", $updateBlockBreakInfo)); - self::register("info_update2", new Opaque(new BID(Ids::INFO_UPDATE2), "ate!upd", $updateBlockBreakInfo)); - self::register("invisible_bedrock", new Transparent(new BID(Ids::INVISIBLE_BEDROCK), "Invisible Bedrock", new Info(BreakInfo::indestructible()))); + self::register("info_update", fn(BID $id) => new Opaque($id, "update!", $updateBlockBreakInfo)); + self::register("info_update2", fn(BID $id) => new Opaque($id, "ate!upd", $updateBlockBreakInfo)); + self::register("invisible_bedrock", fn(BID $id) => new Transparent($id, "Invisible Bedrock", new Info(BreakInfo::indestructible()))); $ironBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::STONE, 30.0)); - self::register("iron", new Opaque(new BID(Ids::IRON), "Iron Block", $ironBreakInfo)); - self::register("iron_bars", new Thin(new BID(Ids::IRON_BARS), "Iron Bars", $ironBreakInfo)); + self::register("iron", fn(BID $id) => new Opaque($id, "Iron Block", $ironBreakInfo)); + self::register("iron_bars", fn(BID $id) => new Thin($id, "Iron Bars", $ironBreakInfo)); $ironDoorBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 25.0)); - self::register("iron_door", new Door(new BID(Ids::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); - self::register("iron_trapdoor", new Trapdoor(new BID(Ids::IRON_TRAPDOOR), "Iron Trapdoor", $ironDoorBreakInfo)); + self::register("iron_door", fn(BID $id) => new Door($id, "Iron Door", $ironDoorBreakInfo)); + self::register("iron_trapdoor", fn(BID $id) => new Trapdoor($id, "Iron Trapdoor", $ironDoorBreakInfo)); $itemFrameInfo = new Info(new BreakInfo(0.25)); - self::register("item_frame", new ItemFrame(new BID(Ids::ITEM_FRAME, TileItemFrame::class), "Item Frame", $itemFrameInfo)); - self::register("glowing_item_frame", new ItemFrame(new BID(Ids::GLOWING_ITEM_FRAME, TileGlowingItemFrame::class), "Glow Item Frame", $itemFrameInfo)); + self::register("item_frame", fn(BID $id) => new ItemFrame($id, "Item Frame", $itemFrameInfo), TileItemFrame::class); + self::register("glowing_item_frame", fn(BID $id) => new ItemFrame($id, "Glow Item Frame", $itemFrameInfo), TileGlowingItemFrame::class); - self::register("jukebox", new Jukebox(new BID(Ids::JUKEBOX, TileJukebox::class), "Jukebox", new Info(BreakInfo::axe(0.8)))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not - self::register("ladder", new Ladder(new BID(Ids::LADDER), "Ladder", new Info(BreakInfo::axe(0.4)))); + self::register("jukebox", fn(BID $id) => new Jukebox($id, "Jukebox", new Info(BreakInfo::axe(0.8))), TileJukebox::class); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not + self::register("ladder", fn(BID $id) => new Ladder($id, "Ladder", new Info(BreakInfo::axe(0.4)))); $lanternBreakInfo = new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)); - self::register("lantern", new Lantern(new BID(Ids::LANTERN), "Lantern", $lanternBreakInfo, 15)); - self::register("soul_lantern", new Lantern(new BID(Ids::SOUL_LANTERN), "Soul Lantern", $lanternBreakInfo, 10)); + self::register("lantern", fn(BID $id) => new Lantern($id, "Lantern", $lanternBreakInfo, 15)); + self::register("soul_lantern", fn(BID $id) => new Lantern($id, "Soul Lantern", $lanternBreakInfo, 10)); - self::register("lapis_lazuli", new Opaque(new BID(Ids::LAPIS_LAZULI), "Lapis Lazuli Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE)))); - self::register("lava", new Lava(new BID(Ids::LAVA), "Lava", new Info(BreakInfo::indestructible(500.0)))); - self::register("lectern", new Lectern(new BID(Ids::LECTERN, TileLectern::class), "Lectern", new Info(BreakInfo::axe(2.0)))); - self::register("lever", new Lever(new BID(Ids::LEVER), "Lever", new Info(new BreakInfo(0.5)))); - self::register("magma", new Magma(new BID(Ids::MAGMA), "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); - self::register("melon", new Melon(new BID(Ids::MELON), "Melon Block", new Info(BreakInfo::axe(1.0)))); - self::register("melon_stem", new MelonStem(new BID(Ids::MELON_STEM), "Melon Stem", new Info(BreakInfo::instant()))); - self::register("monster_spawner", new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, TileMonsterSpawner::class), "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); - self::register("mycelium", new Mycelium(new BID(Ids::MYCELIUM), "Mycelium", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); + self::register("lapis_lazuli", fn(BID $id) => new Opaque($id, "Lapis Lazuli Block", new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE)))); + self::register("lava", fn(BID $id) => new Lava($id, "Lava", new Info(BreakInfo::indestructible(500.0)))); + self::register("lectern", fn(BID $id) => new Lectern($id, "Lectern", new Info(BreakInfo::axe(2.0))), TileLectern::class); + self::register("lever", fn(BID $id) => new Lever($id, "Lever", new Info(new BreakInfo(0.5)))); + self::register("magma", fn(BID $id) => new Magma($id, "Magma Block", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); + self::register("melon", fn(BID $id) => new Melon($id, "Melon Block", new Info(BreakInfo::axe(1.0)))); + self::register("melon_stem", fn(BID $id) => new MelonStem($id, "Melon Stem", new Info(BreakInfo::instant()))); + self::register("monster_spawner", fn(BID $id) => new MonsterSpawner($id, "Monster Spawner", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD))), TileMonsterSpawner::class); + self::register("mycelium", fn(BID $id) => new Mycelium($id, "Mycelium", new Info(BreakInfo::shovel(0.6), [Tags::DIRT]))); $netherBrickBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("nether_bricks", new Opaque(new BID(Ids::NETHER_BRICKS), "Nether Bricks", $netherBrickBreakInfo)); - self::register("red_nether_bricks", new Opaque(new BID(Ids::RED_NETHER_BRICKS), "Red Nether Bricks", $netherBrickBreakInfo)); - self::register("nether_brick_fence", new Fence(new BID(Ids::NETHER_BRICK_FENCE), "Nether Brick Fence", $netherBrickBreakInfo)); - self::register("nether_brick_stairs", new Stair(new BID(Ids::NETHER_BRICK_STAIRS), "Nether Brick Stairs", $netherBrickBreakInfo)); - self::register("red_nether_brick_stairs", new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS), "Red Nether Brick Stairs", $netherBrickBreakInfo)); - self::register("chiseled_nether_bricks", new Opaque(new BID(Ids::CHISELED_NETHER_BRICKS), "Chiseled Nether Bricks", $netherBrickBreakInfo)); - self::register("cracked_nether_bricks", new Opaque(new BID(Ids::CRACKED_NETHER_BRICKS), "Cracked Nether Bricks", $netherBrickBreakInfo)); + self::register("nether_bricks", fn(BID $id) => new Opaque($id, "Nether Bricks", $netherBrickBreakInfo)); + self::register("red_nether_bricks", fn(BID $id) => new Opaque($id, "Red Nether Bricks", $netherBrickBreakInfo)); + self::register("nether_brick_fence", fn(BID $id) => new Fence($id, "Nether Brick Fence", $netherBrickBreakInfo)); + self::register("nether_brick_stairs", fn(BID $id) => new Stair($id, "Nether Brick Stairs", $netherBrickBreakInfo)); + self::register("red_nether_brick_stairs", fn(BID $id) => new Stair($id, "Red Nether Brick Stairs", $netherBrickBreakInfo)); + self::register("chiseled_nether_bricks", fn(BID $id) => new Opaque($id, "Chiseled Nether Bricks", $netherBrickBreakInfo)); + self::register("cracked_nether_bricks", fn(BID $id) => new Opaque($id, "Cracked Nether Bricks", $netherBrickBreakInfo)); - self::register("nether_portal", new NetherPortal(new BID(Ids::NETHER_PORTAL), "Nether Portal", new Info(BreakInfo::indestructible(0.0)))); - self::register("nether_reactor_core", new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE), "Nether Reactor Core", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); - self::register("nether_wart_block", new Opaque(new BID(Ids::NETHER_WART_BLOCK), "Nether Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); - self::register("nether_wart", new NetherWartPlant(new BID(Ids::NETHER_WART), "Nether Wart", new Info(BreakInfo::instant()))); - self::register("netherrack", new Netherrack(new BID(Ids::NETHERRACK), "Netherrack", new Info(BreakInfo::pickaxe(0.4, ToolTier::WOOD)))); - self::register("note_block", new Note(new BID(Ids::NOTE_BLOCK, TileNote::class), "Note Block", new Info(BreakInfo::axe(0.8)))); - self::register("obsidian", new Opaque(new BID(Ids::OBSIDIAN), "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND, 6000.0)))); - self::register("packed_ice", new PackedIce(new BID(Ids::PACKED_ICE), "Packed Ice", new Info(BreakInfo::pickaxe(0.5)))); - self::register("podzol", new Podzol(new BID(Ids::PODZOL), "Podzol", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); - self::register("potatoes", new Potato(new BID(Ids::POTATOES), "Potato Block", new Info(BreakInfo::instant()))); - self::register("powered_rail", new PoweredRail(new BID(Ids::POWERED_RAIL), "Powered Rail", $railBreakInfo)); + self::register("nether_portal", fn(BID $id) => new NetherPortal($id, "Nether Portal", new Info(BreakInfo::indestructible(0.0)))); + self::register("nether_reactor_core", fn(BID $id) => new NetherReactor($id, "Nether Reactor Core", new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)))); + self::register("nether_wart_block", fn(BID $id) => new Opaque($id, "Nether Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); + self::register("nether_wart", fn(BID $id) => new NetherWartPlant($id, "Nether Wart", new Info(BreakInfo::instant()))); + self::register("netherrack", fn(BID $id) => new Netherrack($id, "Netherrack", new Info(BreakInfo::pickaxe(0.4, ToolTier::WOOD)))); + self::register("note_block", fn(BID $id) => new Note($id, "Note Block", new Info(BreakInfo::axe(0.8))), TileNote::class); + self::register("obsidian", fn(BID $id) => new Opaque($id, "Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in PC */, ToolTier::DIAMOND, 6000.0)))); + self::register("packed_ice", fn(BID $id) => new PackedIce($id, "Packed Ice", new Info(BreakInfo::pickaxe(0.5)))); + self::register("podzol", fn(BID $id) => new Podzol($id, "Podzol", new Info(BreakInfo::shovel(0.5), [Tags::DIRT]))); + self::register("potatoes", fn(BID $id) => new Potato($id, "Potato Block", new Info(BreakInfo::instant()))); + self::register("powered_rail", fn(BID $id) => new PoweredRail($id, "Powered Rail", $railBreakInfo)); $prismarineBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); - self::register("prismarine", new Opaque(new BID(Ids::PRISMARINE), "Prismarine", $prismarineBreakInfo)); - self::register("dark_prismarine", new Opaque(new BID(Ids::DARK_PRISMARINE), "Dark Prismarine", $prismarineBreakInfo)); - self::register("prismarine_bricks", new Opaque(new BID(Ids::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); - self::register("prismarine_bricks_stairs", new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS), "Prismarine Bricks Stairs", $prismarineBreakInfo)); - self::register("dark_prismarine_stairs", new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS), "Dark Prismarine Stairs", $prismarineBreakInfo)); - self::register("prismarine_stairs", new Stair(new BID(Ids::PRISMARINE_STAIRS), "Prismarine Stairs", $prismarineBreakInfo)); + self::register("prismarine", fn(BID $id) => new Opaque($id, "Prismarine", $prismarineBreakInfo)); + self::register("dark_prismarine", fn(BID $id) => new Opaque($id, "Dark Prismarine", $prismarineBreakInfo)); + self::register("prismarine_bricks", fn(BID $id) => new Opaque($id, "Prismarine Bricks", $prismarineBreakInfo)); + self::register("prismarine_bricks_stairs", fn(BID $id) => new Stair($id, "Prismarine Bricks Stairs", $prismarineBreakInfo)); + self::register("dark_prismarine_stairs", fn(BID $id) => new Stair($id, "Dark Prismarine Stairs", $prismarineBreakInfo)); + self::register("prismarine_stairs", fn(BID $id) => new Stair($id, "Prismarine Stairs", $prismarineBreakInfo)); $pumpkinBreakInfo = new Info(BreakInfo::axe(1.0)); - self::register("pumpkin", new Pumpkin(new BID(Ids::PUMPKIN), "Pumpkin", $pumpkinBreakInfo)); - self::register("carved_pumpkin", new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN), "Carved Pumpkin", new Info(BreakInfo::axe(1.0), enchantmentTags: [EnchantmentTags::MASK]))); - self::register("lit_pumpkin", new LitPumpkin(new BID(Ids::LIT_PUMPKIN), "Jack o'Lantern", $pumpkinBreakInfo)); + self::register("pumpkin", fn(BID $id) => new Pumpkin($id, "Pumpkin", $pumpkinBreakInfo)); + self::register("carved_pumpkin", fn(BID $id) => new CarvedPumpkin($id, "Carved Pumpkin", new Info(BreakInfo::axe(1.0), enchantmentTags: [EnchantmentTags::MASK]))); + self::register("lit_pumpkin", fn(BID $id) => new LitPumpkin($id, "Jack o'Lantern", $pumpkinBreakInfo)); - self::register("pumpkin_stem", new PumpkinStem(new BID(Ids::PUMPKIN_STEM), "Pumpkin Stem", new Info(BreakInfo::instant()))); + self::register("pumpkin_stem", fn(BID $id) => new PumpkinStem($id, "Pumpkin Stem", new Info(BreakInfo::instant()))); $purpurBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); - self::register("purpur", new Opaque(new BID(Ids::PURPUR), "Purpur Block", $purpurBreakInfo)); - self::register("purpur_pillar", new SimplePillar(new BID(Ids::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); - self::register("purpur_stairs", new Stair(new BID(Ids::PURPUR_STAIRS), "Purpur Stairs", $purpurBreakInfo)); + self::register("purpur", fn(BID $id) => new Opaque($id, "Purpur Block", $purpurBreakInfo)); + self::register("purpur_pillar", fn(BID $id) => new SimplePillar($id, "Purpur Pillar", $purpurBreakInfo)); + self::register("purpur_stairs", fn(BID $id) => new Stair($id, "Purpur Stairs", $purpurBreakInfo)); $quartzBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD)); - self::register("quartz", new Opaque(new BID(Ids::QUARTZ), "Quartz Block", $quartzBreakInfo)); - self::register("chiseled_quartz", new SimplePillar(new BID(Ids::CHISELED_QUARTZ), "Chiseled Quartz Block", $quartzBreakInfo)); - self::register("quartz_pillar", new SimplePillar(new BID(Ids::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); - self::register("smooth_quartz", new Opaque(new BID(Ids::SMOOTH_QUARTZ), "Smooth Quartz Block", $quartzBreakInfo)); - self::register("quartz_bricks", new Opaque(new BID(Ids::QUARTZ_BRICKS), "Quartz Bricks", $quartzBreakInfo)); + self::register("quartz", fn(BID $id) => new Opaque($id, "Quartz Block", $quartzBreakInfo)); + self::register("chiseled_quartz", fn(BID $id) => new SimplePillar($id, "Chiseled Quartz Block", $quartzBreakInfo)); + self::register("quartz_pillar", fn(BID $id) => new SimplePillar($id, "Quartz Pillar", $quartzBreakInfo)); + self::register("smooth_quartz", fn(BID $id) => new Opaque($id, "Smooth Quartz Block", $quartzBreakInfo)); + self::register("quartz_bricks", fn(BID $id) => new Opaque($id, "Quartz Bricks", $quartzBreakInfo)); - self::register("quartz_stairs", new Stair(new BID(Ids::QUARTZ_STAIRS), "Quartz Stairs", $quartzBreakInfo)); - self::register("smooth_quartz_stairs", new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS), "Smooth Quartz Stairs", $quartzBreakInfo)); + self::register("quartz_stairs", fn(BID $id) => new Stair($id, "Quartz Stairs", $quartzBreakInfo)); + self::register("smooth_quartz_stairs", fn(BID $id) => new Stair($id, "Smooth Quartz Stairs", $quartzBreakInfo)); - self::register("rail", new Rail(new BID(Ids::RAIL), "Rail", $railBreakInfo)); - self::register("red_mushroom", new RedMushroom(new BID(Ids::RED_MUSHROOM), "Red Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); - self::register("redstone", new Redstone(new BID(Ids::REDSTONE), "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); - self::register("redstone_comparator", new RedstoneComparator(new BID(Ids::REDSTONE_COMPARATOR, TileComparator::class), "Redstone Comparator", new Info(BreakInfo::instant()))); - self::register("redstone_lamp", new RedstoneLamp(new BID(Ids::REDSTONE_LAMP), "Redstone Lamp", new Info(new BreakInfo(0.3)))); - self::register("redstone_repeater", new RedstoneRepeater(new BID(Ids::REDSTONE_REPEATER), "Redstone Repeater", new Info(BreakInfo::instant()))); - self::register("redstone_torch", new RedstoneTorch(new BID(Ids::REDSTONE_TORCH), "Redstone Torch", new Info(BreakInfo::instant()))); - self::register("redstone_wire", new RedstoneWire(new BID(Ids::REDSTONE_WIRE), "Redstone", new Info(BreakInfo::instant()))); - self::register("reserved6", new Reserved6(new BID(Ids::RESERVED6), "reserved6", new Info(BreakInfo::instant()))); + self::register("rail", fn(BID $id) => new Rail($id, "Rail", $railBreakInfo)); + self::register("red_mushroom", fn(BID $id) => new RedMushroom($id, "Red Mushroom", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); + self::register("redstone", fn(BID $id) => new Redstone($id, "Redstone Block", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD, 30.0)))); + self::register("redstone_comparator", fn(BID $id) => new RedstoneComparator($id, "Redstone Comparator", new Info(BreakInfo::instant())), TileComparator::class); + self::register("redstone_lamp", fn(BID $id) => new RedstoneLamp($id, "Redstone Lamp", new Info(new BreakInfo(0.3)))); + self::register("redstone_repeater", fn(BID $id) => new RedstoneRepeater($id, "Redstone Repeater", new Info(BreakInfo::instant()))); + self::register("redstone_torch", fn(BID $id) => new RedstoneTorch($id, "Redstone Torch", new Info(BreakInfo::instant()))); + self::register("redstone_wire", fn(BID $id) => new RedstoneWire($id, "Redstone", new Info(BreakInfo::instant()))); + self::register("reserved6", fn(BID $id) => new Reserved6($id, "reserved6", new Info(BreakInfo::instant()))); $sandTypeInfo = new Info(BreakInfo::shovel(0.5), [Tags::SAND]); - self::register("sand", new Sand(new BID(Ids::SAND), "Sand", $sandTypeInfo)); - self::register("red_sand", new Sand(new BID(Ids::RED_SAND), "Red Sand", $sandTypeInfo)); + self::register("sand", fn(BID $id) => new Sand($id, "Sand", $sandTypeInfo)); + self::register("red_sand", fn(BID $id) => new Sand($id, "Red Sand", $sandTypeInfo)); - self::register("sea_lantern", new SeaLantern(new BID(Ids::SEA_LANTERN), "Sea Lantern", new Info(new BreakInfo(0.3)))); - self::register("sea_pickle", new SeaPickle(new BID(Ids::SEA_PICKLE), "Sea Pickle", new Info(BreakInfo::instant()))); - self::register("mob_head", new MobHead(new BID(Ids::MOB_HEAD, TileMobHead::class), "Mob Head", new Info(new BreakInfo(1.0), enchantmentTags: [EnchantmentTags::MASK]))); - self::register("slime", new Slime(new BID(Ids::SLIME), "Slime Block", new Info(BreakInfo::instant()))); - self::register("snow", new Snow(new BID(Ids::SNOW), "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD)))); - self::register("snow_layer", new SnowLayer(new BID(Ids::SNOW_LAYER), "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD)))); - self::register("soul_sand", new SoulSand(new BID(Ids::SOUL_SAND), "Soul Sand", new Info(BreakInfo::shovel(0.5)))); - self::register("sponge", new Sponge(new BID(Ids::SPONGE), "Sponge", new Info(new BreakInfo(0.6, ToolType::HOE)))); + self::register("sea_lantern", fn(BID $id) => new SeaLantern($id, "Sea Lantern", new Info(new BreakInfo(0.3)))); + self::register("sea_pickle", fn(BID $id) => new SeaPickle($id, "Sea Pickle", new Info(BreakInfo::instant()))); + self::register("mob_head", fn(BID $id) => new MobHead($id, "Mob Head", new Info(new BreakInfo(1.0), enchantmentTags: [EnchantmentTags::MASK])), TileMobHead::class); + self::register("slime", fn(BID $id) => new Slime($id, "Slime Block", new Info(BreakInfo::instant()))); + self::register("snow", fn(BID $id) => new Snow($id, "Snow Block", new Info(BreakInfo::shovel(0.2, ToolTier::WOOD)))); + self::register("snow_layer", fn(BID $id) => new SnowLayer($id, "Snow Layer", new Info(BreakInfo::shovel(0.1, ToolTier::WOOD)))); + self::register("soul_sand", fn(BID $id) => new SoulSand($id, "Soul Sand", new Info(BreakInfo::shovel(0.5)))); + self::register("sponge", fn(BID $id) => new Sponge($id, "Sponge", new Info(new BreakInfo(0.6, ToolType::HOE)))); $shulkerBoxBreakInfo = new Info(BreakInfo::pickaxe(2)); - self::register("shulker_box", new ShulkerBox(new BID(Ids::SHULKER_BOX, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + self::register("shulker_box", fn(BID $id) => new ShulkerBox($id, "Shulker Box", $shulkerBoxBreakInfo), TileShulkerBox::class); $stoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); - self::register( + $stone = self::register( "stone", - $stone = new class(new BID(Ids::STONE), "Stone", $stoneBreakInfo) extends Opaque{ + fn(BID $id) => new class($id, "Stone", $stoneBreakInfo) extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLESTONE()->asItem()]; } @@ -1066,110 +1090,110 @@ final class VanillaBlocks{ } } ); - self::register("andesite", new Opaque(new BID(Ids::ANDESITE), "Andesite", $stoneBreakInfo)); - self::register("diorite", new Opaque(new BID(Ids::DIORITE), "Diorite", $stoneBreakInfo)); - self::register("granite", new Opaque(new BID(Ids::GRANITE), "Granite", $stoneBreakInfo)); - self::register("polished_andesite", new Opaque(new BID(Ids::POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); - self::register("polished_diorite", new Opaque(new BID(Ids::POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); - self::register("polished_granite", new Opaque(new BID(Ids::POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); + self::register("andesite", fn(BID $id) => new Opaque($id, "Andesite", $stoneBreakInfo)); + self::register("diorite", fn(BID $id) => new Opaque($id, "Diorite", $stoneBreakInfo)); + self::register("granite", fn(BID $id) => new Opaque($id, "Granite", $stoneBreakInfo)); + self::register("polished_andesite", fn(BID $id) => new Opaque($id, "Polished Andesite", $stoneBreakInfo)); + self::register("polished_diorite", fn(BID $id) => new Opaque($id, "Polished Diorite", $stoneBreakInfo)); + self::register("polished_granite", fn(BID $id) => new Opaque($id, "Polished Granite", $stoneBreakInfo)); - self::register("stone_bricks", $stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS), "Stone Bricks", $stoneBreakInfo)); - self::register("mossy_stone_bricks", $mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS), "Mossy Stone Bricks", $stoneBreakInfo)); - self::register("cracked_stone_bricks", $crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS), "Cracked Stone Bricks", $stoneBreakInfo)); - self::register("chiseled_stone_bricks", $chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS), "Chiseled Stone Bricks", $stoneBreakInfo)); + $stoneBrick = self::register("stone_bricks", fn(BID $id) => new Opaque($id, "Stone Bricks", $stoneBreakInfo)); + $mossyStoneBrick = self::register("mossy_stone_bricks", fn(BID $id) => new Opaque($id, "Mossy Stone Bricks", $stoneBreakInfo)); + $crackedStoneBrick = self::register("cracked_stone_bricks", fn(BID $id) => new Opaque($id, "Cracked Stone Bricks", $stoneBreakInfo)); + $chiseledStoneBrick = self::register("chiseled_stone_bricks", fn(BID $id) => new Opaque($id, "Chiseled Stone Bricks", $stoneBreakInfo)); $infestedStoneBreakInfo = new Info(BreakInfo::pickaxe(0.75)); - self::register("infested_stone", new InfestedStone(new BID(Ids::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); - self::register("infested_stone_brick", new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); - self::register("infested_cobblestone", new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); - self::register("infested_mossy_stone_brick", new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); - self::register("infested_cracked_stone_brick", new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); - self::register("infested_chiseled_stone_brick", new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); + self::register("infested_stone", fn(BID $id) => new InfestedStone($id, "Infested Stone", $infestedStoneBreakInfo, $stone)); + self::register("infested_stone_brick", fn(BID $id) => new InfestedStone($id, "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); + self::register("infested_cobblestone", fn(BID $id) => new InfestedStone($id, "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); + self::register("infested_mossy_stone_brick", fn(BID $id) => new InfestedStone($id, "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); + self::register("infested_cracked_stone_brick", fn(BID $id) => new InfestedStone($id, "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); + self::register("infested_chiseled_stone_brick", fn(BID $id) => new InfestedStone($id, "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); - self::register("stone_stairs", new Stair(new BID(Ids::STONE_STAIRS), "Stone Stairs", $stoneBreakInfo)); - self::register("smooth_stone", new Opaque(new BID(Ids::SMOOTH_STONE), "Smooth Stone", $stoneBreakInfo)); - self::register("andesite_stairs", new Stair(new BID(Ids::ANDESITE_STAIRS), "Andesite Stairs", $stoneBreakInfo)); - self::register("diorite_stairs", new Stair(new BID(Ids::DIORITE_STAIRS), "Diorite Stairs", $stoneBreakInfo)); - self::register("granite_stairs", new Stair(new BID(Ids::GRANITE_STAIRS), "Granite Stairs", $stoneBreakInfo)); - self::register("polished_andesite_stairs", new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS), "Polished Andesite Stairs", $stoneBreakInfo)); - self::register("polished_diorite_stairs", new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS), "Polished Diorite Stairs", $stoneBreakInfo)); - self::register("polished_granite_stairs", new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS), "Polished Granite Stairs", $stoneBreakInfo)); - self::register("stone_brick_stairs", new Stair(new BID(Ids::STONE_BRICK_STAIRS), "Stone Brick Stairs", $stoneBreakInfo)); - self::register("mossy_stone_brick_stairs", new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - self::register("stone_button", new StoneButton(new BID(Ids::STONE_BUTTON), "Stone Button", new Info(BreakInfo::pickaxe(0.5)))); - self::register("stonecutter", new Stonecutter(new BID(Ids::STONECUTTER), "Stonecutter", new Info(BreakInfo::pickaxe(3.5)))); - self::register("stone_pressure_plate", new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE), "Stone Pressure Plate", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); + self::register("stone_stairs", fn(BID $id) => new Stair($id, "Stone Stairs", $stoneBreakInfo)); + self::register("smooth_stone", fn(BID $id) => new Opaque($id, "Smooth Stone", $stoneBreakInfo)); + self::register("andesite_stairs", fn(BID $id) => new Stair($id, "Andesite Stairs", $stoneBreakInfo)); + self::register("diorite_stairs", fn(BID $id) => new Stair($id, "Diorite Stairs", $stoneBreakInfo)); + self::register("granite_stairs", fn(BID $id) => new Stair($id, "Granite Stairs", $stoneBreakInfo)); + self::register("polished_andesite_stairs", fn(BID $id) => new Stair($id, "Polished Andesite Stairs", $stoneBreakInfo)); + self::register("polished_diorite_stairs", fn(BID $id) => new Stair($id, "Polished Diorite Stairs", $stoneBreakInfo)); + self::register("polished_granite_stairs", fn(BID $id) => new Stair($id, "Polished Granite Stairs", $stoneBreakInfo)); + self::register("stone_brick_stairs", fn(BID $id) => new Stair($id, "Stone Brick Stairs", $stoneBreakInfo)); + self::register("mossy_stone_brick_stairs", fn(BID $id) => new Stair($id, "Mossy Stone Brick Stairs", $stoneBreakInfo)); + self::register("stone_button", fn(BID $id) => new StoneButton($id, "Stone Button", new Info(BreakInfo::pickaxe(0.5)))); + self::register("stonecutter", fn(BID $id) => new Stonecutter($id, "Stonecutter", new Info(BreakInfo::pickaxe(3.5)))); + self::register("stone_pressure_plate", fn(BID $id) => new StonePressurePlate($id, "Stone Pressure Plate", new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)))); //TODO: in the future this won't be the same for all the types $stoneSlabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("brick_slab", new Slab(new BID(Ids::BRICK_SLAB), "Brick", $stoneSlabBreakInfo)); - self::register("cobblestone_slab", new Slab(new BID(Ids::COBBLESTONE_SLAB), "Cobblestone", $stoneSlabBreakInfo)); - self::register("fake_wooden_slab", new Slab(new BID(Ids::FAKE_WOODEN_SLAB), "Fake Wooden", $stoneSlabBreakInfo)); - self::register("nether_brick_slab", new Slab(new BID(Ids::NETHER_BRICK_SLAB), "Nether Brick", $stoneSlabBreakInfo)); - self::register("quartz_slab", new Slab(new BID(Ids::QUARTZ_SLAB), "Quartz", $stoneSlabBreakInfo)); - self::register("sandstone_slab", new Slab(new BID(Ids::SANDSTONE_SLAB), "Sandstone", $stoneSlabBreakInfo)); - self::register("smooth_stone_slab", new Slab(new BID(Ids::SMOOTH_STONE_SLAB), "Smooth Stone", $stoneSlabBreakInfo)); - self::register("stone_brick_slab", new Slab(new BID(Ids::STONE_BRICK_SLAB), "Stone Brick", $stoneSlabBreakInfo)); - self::register("dark_prismarine_slab", new Slab(new BID(Ids::DARK_PRISMARINE_SLAB), "Dark Prismarine", $stoneSlabBreakInfo)); - self::register("mossy_cobblestone_slab", new Slab(new BID(Ids::MOSSY_COBBLESTONE_SLAB), "Mossy Cobblestone", $stoneSlabBreakInfo)); - self::register("prismarine_slab", new Slab(new BID(Ids::PRISMARINE_SLAB), "Prismarine", $stoneSlabBreakInfo)); - self::register("prismarine_bricks_slab", new Slab(new BID(Ids::PRISMARINE_BRICKS_SLAB), "Prismarine Bricks", $stoneSlabBreakInfo)); - self::register("purpur_slab", new Slab(new BID(Ids::PURPUR_SLAB), "Purpur", $stoneSlabBreakInfo)); - self::register("red_nether_brick_slab", new Slab(new BID(Ids::RED_NETHER_BRICK_SLAB), "Red Nether Brick", $stoneSlabBreakInfo)); - self::register("red_sandstone_slab", new Slab(new BID(Ids::RED_SANDSTONE_SLAB), "Red Sandstone", $stoneSlabBreakInfo)); - self::register("smooth_sandstone_slab", new Slab(new BID(Ids::SMOOTH_SANDSTONE_SLAB), "Smooth Sandstone", $stoneSlabBreakInfo)); - self::register("andesite_slab", new Slab(new BID(Ids::ANDESITE_SLAB), "Andesite", $stoneSlabBreakInfo)); - self::register("diorite_slab", new Slab(new BID(Ids::DIORITE_SLAB), "Diorite", $stoneSlabBreakInfo)); - self::register("end_stone_brick_slab", new Slab(new BID(Ids::END_STONE_BRICK_SLAB), "End Stone Brick", $stoneSlabBreakInfo)); - self::register("granite_slab", new Slab(new BID(Ids::GRANITE_SLAB), "Granite", $stoneSlabBreakInfo)); - self::register("polished_andesite_slab", new Slab(new BID(Ids::POLISHED_ANDESITE_SLAB), "Polished Andesite", $stoneSlabBreakInfo)); - self::register("polished_diorite_slab", new Slab(new BID(Ids::POLISHED_DIORITE_SLAB), "Polished Diorite", $stoneSlabBreakInfo)); - self::register("polished_granite_slab", new Slab(new BID(Ids::POLISHED_GRANITE_SLAB), "Polished Granite", $stoneSlabBreakInfo)); - self::register("smooth_red_sandstone_slab", new Slab(new BID(Ids::SMOOTH_RED_SANDSTONE_SLAB), "Smooth Red Sandstone", $stoneSlabBreakInfo)); - self::register("cut_red_sandstone_slab", new Slab(new BID(Ids::CUT_RED_SANDSTONE_SLAB), "Cut Red Sandstone", $stoneSlabBreakInfo)); - self::register("cut_sandstone_slab", new Slab(new BID(Ids::CUT_SANDSTONE_SLAB), "Cut Sandstone", $stoneSlabBreakInfo)); - self::register("mossy_stone_brick_slab", new Slab(new BID(Ids::MOSSY_STONE_BRICK_SLAB), "Mossy Stone Brick", $stoneSlabBreakInfo)); - self::register("smooth_quartz_slab", new Slab(new BID(Ids::SMOOTH_QUARTZ_SLAB), "Smooth Quartz", $stoneSlabBreakInfo)); - self::register("stone_slab", new Slab(new BID(Ids::STONE_SLAB), "Stone", $stoneSlabBreakInfo)); + self::register("brick_slab", fn(BID $id) => new Slab($id, "Brick", $stoneSlabBreakInfo)); + self::register("cobblestone_slab", fn(BID $id) => new Slab($id, "Cobblestone", $stoneSlabBreakInfo)); + self::register("fake_wooden_slab", fn(BID $id) => new Slab($id, "Fake Wooden", $stoneSlabBreakInfo)); + self::register("nether_brick_slab", fn(BID $id) => new Slab($id, "Nether Brick", $stoneSlabBreakInfo)); + self::register("quartz_slab", fn(BID $id) => new Slab($id, "Quartz", $stoneSlabBreakInfo)); + self::register("sandstone_slab", fn(BID $id) => new Slab($id, "Sandstone", $stoneSlabBreakInfo)); + self::register("smooth_stone_slab", fn(BID $id) => new Slab($id, "Smooth Stone", $stoneSlabBreakInfo)); + self::register("stone_brick_slab", fn(BID $id) => new Slab($id, "Stone Brick", $stoneSlabBreakInfo)); + self::register("dark_prismarine_slab", fn(BID $id) => new Slab($id, "Dark Prismarine", $stoneSlabBreakInfo)); + self::register("mossy_cobblestone_slab", fn(BID $id) => new Slab($id, "Mossy Cobblestone", $stoneSlabBreakInfo)); + self::register("prismarine_slab", fn(BID $id) => new Slab($id, "Prismarine", $stoneSlabBreakInfo)); + self::register("prismarine_bricks_slab", fn(BID $id) => new Slab($id, "Prismarine Bricks", $stoneSlabBreakInfo)); + self::register("purpur_slab", fn(BID $id) => new Slab($id, "Purpur", $stoneSlabBreakInfo)); + self::register("red_nether_brick_slab", fn(BID $id) => new Slab($id, "Red Nether Brick", $stoneSlabBreakInfo)); + self::register("red_sandstone_slab", fn(BID $id) => new Slab($id, "Red Sandstone", $stoneSlabBreakInfo)); + self::register("smooth_sandstone_slab", fn(BID $id) => new Slab($id, "Smooth Sandstone", $stoneSlabBreakInfo)); + self::register("andesite_slab", fn(BID $id) => new Slab($id, "Andesite", $stoneSlabBreakInfo)); + self::register("diorite_slab", fn(BID $id) => new Slab($id, "Diorite", $stoneSlabBreakInfo)); + self::register("end_stone_brick_slab", fn(BID $id) => new Slab($id, "End Stone Brick", $stoneSlabBreakInfo)); + self::register("granite_slab", fn(BID $id) => new Slab($id, "Granite", $stoneSlabBreakInfo)); + self::register("polished_andesite_slab", fn(BID $id) => new Slab($id, "Polished Andesite", $stoneSlabBreakInfo)); + self::register("polished_diorite_slab", fn(BID $id) => new Slab($id, "Polished Diorite", $stoneSlabBreakInfo)); + self::register("polished_granite_slab", fn(BID $id) => new Slab($id, "Polished Granite", $stoneSlabBreakInfo)); + self::register("smooth_red_sandstone_slab", fn(BID $id) => new Slab($id, "Smooth Red Sandstone", $stoneSlabBreakInfo)); + self::register("cut_red_sandstone_slab", fn(BID $id) => new Slab($id, "Cut Red Sandstone", $stoneSlabBreakInfo)); + self::register("cut_sandstone_slab", fn(BID $id) => new Slab($id, "Cut Sandstone", $stoneSlabBreakInfo)); + self::register("mossy_stone_brick_slab", fn(BID $id) => new Slab($id, "Mossy Stone Brick", $stoneSlabBreakInfo)); + self::register("smooth_quartz_slab", fn(BID $id) => new Slab($id, "Smooth Quartz", $stoneSlabBreakInfo)); + self::register("stone_slab", fn(BID $id) => new Slab($id, "Stone", $stoneSlabBreakInfo)); - self::register("legacy_stonecutter", new Opaque(new BID(Ids::LEGACY_STONECUTTER), "Legacy Stonecutter", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)))); - self::register("sugarcane", new Sugarcane(new BID(Ids::SUGARCANE), "Sugarcane", new Info(BreakInfo::instant()))); - self::register("sweet_berry_bush", new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH), "Sweet Berry Bush", new Info(BreakInfo::instant()))); - self::register("tnt", new TNT(new BID(Ids::TNT), "TNT", new Info(BreakInfo::instant()))); - self::register("fern", new TallGrass(new BID(Ids::FERN), "Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); - self::register("tall_grass", new TallGrass(new BID(Ids::TALL_GRASS), "Tall Grass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("legacy_stonecutter", fn(BID $id) => new Opaque($id, "Legacy Stonecutter", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD)))); + self::register("sugarcane", fn(BID $id) => new Sugarcane($id, "Sugarcane", new Info(BreakInfo::instant()))); + self::register("sweet_berry_bush", fn(BID $id) => new SweetBerryBush($id, "Sweet Berry Bush", new Info(BreakInfo::instant()))); + self::register("tnt", fn(BID $id) => new TNT($id, "TNT", new Info(BreakInfo::instant()))); + self::register("fern", fn(BID $id) => new TallGrass($id, "Fern", new Info(BreakInfo::instant(ToolType::SHEARS, 1), [Tags::POTTABLE_PLANTS]))); + self::register("tall_grass", fn(BID $id) => new TallGrass($id, "Tall Grass", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("blue_torch", new Torch(new BID(Ids::BLUE_TORCH), "Blue Torch", new Info(BreakInfo::instant()))); - self::register("purple_torch", new Torch(new BID(Ids::PURPLE_TORCH), "Purple Torch", new Info(BreakInfo::instant()))); - self::register("red_torch", new Torch(new BID(Ids::RED_TORCH), "Red Torch", new Info(BreakInfo::instant()))); - self::register("green_torch", new Torch(new BID(Ids::GREEN_TORCH), "Green Torch", new Info(BreakInfo::instant()))); - self::register("torch", new Torch(new BID(Ids::TORCH), "Torch", new Info(BreakInfo::instant()))); + self::register("blue_torch", fn(BID $id) => new Torch($id, "Blue Torch", new Info(BreakInfo::instant()))); + self::register("purple_torch", fn(BID $id) => new Torch($id, "Purple Torch", new Info(BreakInfo::instant()))); + self::register("red_torch", fn(BID $id) => new Torch($id, "Red Torch", new Info(BreakInfo::instant()))); + self::register("green_torch", fn(BID $id) => new Torch($id, "Green Torch", new Info(BreakInfo::instant()))); + self::register("torch", fn(BID $id) => new Torch($id, "Torch", new Info(BreakInfo::instant()))); - self::register("trapped_chest", new TrappedChest(new BID(Ids::TRAPPED_CHEST, TileChest::class), "Trapped Chest", $chestBreakInfo)); - self::register("tripwire", new Tripwire(new BID(Ids::TRIPWIRE), "Tripwire", new Info(BreakInfo::instant()))); - self::register("tripwire_hook", new TripwireHook(new BID(Ids::TRIPWIRE_HOOK), "Tripwire Hook", new Info(BreakInfo::instant()))); - self::register("underwater_torch", new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH), "Underwater Torch", new Info(BreakInfo::instant()))); - self::register("vines", new Vine(new BID(Ids::VINES), "Vines", new Info(BreakInfo::axe(0.2)))); - self::register("water", new Water(new BID(Ids::WATER), "Water", new Info(BreakInfo::indestructible(500.0)))); - self::register("lily_pad", new WaterLily(new BID(Ids::LILY_PAD), "Lily Pad", new Info(BreakInfo::instant()))); + self::register("trapped_chest", fn(BID $id) => new TrappedChest($id, "Trapped Chest", $chestBreakInfo), TileChest::class); + self::register("tripwire", fn(BID $id) => new Tripwire($id, "Tripwire", new Info(BreakInfo::instant()))); + self::register("tripwire_hook", fn(BID $id) => new TripwireHook($id, "Tripwire Hook", new Info(BreakInfo::instant()))); + self::register("underwater_torch", fn(BID $id) => new UnderwaterTorch($id, "Underwater Torch", new Info(BreakInfo::instant()))); + self::register("vines", fn(BID $id) => new Vine($id, "Vines", new Info(BreakInfo::axe(0.2)))); + self::register("water", fn(BID $id) => new Water($id, "Water", new Info(BreakInfo::indestructible(500.0)))); + self::register("lily_pad", fn(BID $id) => new WaterLily($id, "Lily Pad", new Info(BreakInfo::instant()))); $weightedPressurePlateBreakInfo = new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)); - self::register("weighted_pressure_plate_heavy", new WeightedPressurePlateHeavy( - new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY), + self::register("weighted_pressure_plate_heavy", fn(BID $id) => new WeightedPressurePlateHeavy( + $id, "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo, deactivationDelayTicks: 10, signalStrengthFactor: 0.1 )); - self::register("weighted_pressure_plate_light", new WeightedPressurePlateLight( - new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT), + self::register("weighted_pressure_plate_light", fn(BID $id) => new WeightedPressurePlateLight( + $id, "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo, deactivationDelayTicks: 10, signalStrengthFactor: 1.0 )); - self::register("wheat", new Wheat(new BID(Ids::WHEAT), "Wheat Block", new Info(BreakInfo::instant()))); + self::register("wheat", fn(BID $id) => new Wheat($id, "Wheat Block", new Info(BreakInfo::instant()))); $leavesBreakInfo = new Info(new class(0.2, ToolType::HOE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ @@ -1183,39 +1207,39 @@ final class VanillaBlocks{ foreach(SaplingType::cases() as $saplingType){ $name = $saplingType->getDisplayName(); - self::register(strtolower($saplingType->name) . "_sapling", new Sapling(WoodLikeBlockIdHelper::getSaplingIdentifier($saplingType), $name . " Sapling", $saplingTypeInfo, $saplingType)); + self::register(strtolower($saplingType->name) . "_sapling", fn(BID $id) => new Sapling($id, $name . " Sapling", $saplingTypeInfo, $saplingType)); } foreach(LeavesType::cases() as $leavesType){ $name = $leavesType->getDisplayName(); - self::register(strtolower($leavesType->name) . "_leaves", new Leaves(WoodLikeBlockIdHelper::getLeavesIdentifier($leavesType), $name . " Leaves", $leavesBreakInfo, $leavesType)); + self::register(strtolower($leavesType->name) . "_leaves", fn(BID $id) => new Leaves($id, $name . " Leaves", $leavesBreakInfo, $leavesType)); } $sandstoneBreakInfo = new Info(BreakInfo::pickaxe(0.8, ToolTier::WOOD)); - self::register("red_sandstone_stairs", new Stair(new BID(Ids::RED_SANDSTONE_STAIRS), "Red Sandstone Stairs", $sandstoneBreakInfo)); - self::register("smooth_red_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); - self::register("red_sandstone", new Opaque(new BID(Ids::RED_SANDSTONE), "Red Sandstone", $sandstoneBreakInfo)); - self::register("chiseled_red_sandstone", new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE), "Chiseled Red Sandstone", $sandstoneBreakInfo)); - self::register("cut_red_sandstone", new Opaque(new BID(Ids::CUT_RED_SANDSTONE), "Cut Red Sandstone", $sandstoneBreakInfo)); - self::register("smooth_red_sandstone", new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE), "Smooth Red Sandstone", $sandstoneBreakInfo)); + self::register("red_sandstone_stairs", fn(BID $id) => new Stair($id, "Red Sandstone Stairs", $sandstoneBreakInfo)); + self::register("smooth_red_sandstone_stairs", fn(BID $id) => new Stair($id, "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); + self::register("red_sandstone", fn(BID $id) => new Opaque($id, "Red Sandstone", $sandstoneBreakInfo)); + self::register("chiseled_red_sandstone", fn(BID $id) => new Opaque($id, "Chiseled Red Sandstone", $sandstoneBreakInfo)); + self::register("cut_red_sandstone", fn(BID $id) => new Opaque($id, "Cut Red Sandstone", $sandstoneBreakInfo)); + self::register("smooth_red_sandstone", fn(BID $id) => new Opaque($id, "Smooth Red Sandstone", $sandstoneBreakInfo)); - self::register("sandstone_stairs", new Stair(new BID(Ids::SANDSTONE_STAIRS), "Sandstone Stairs", $sandstoneBreakInfo)); - self::register("smooth_sandstone_stairs", new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); - self::register("sandstone", new Opaque(new BID(Ids::SANDSTONE), "Sandstone", $sandstoneBreakInfo)); - self::register("chiseled_sandstone", new Opaque(new BID(Ids::CHISELED_SANDSTONE), "Chiseled Sandstone", $sandstoneBreakInfo)); - self::register("cut_sandstone", new Opaque(new BID(Ids::CUT_SANDSTONE), "Cut Sandstone", $sandstoneBreakInfo)); - self::register("smooth_sandstone", new Opaque(new BID(Ids::SMOOTH_SANDSTONE), "Smooth Sandstone", $sandstoneBreakInfo)); + self::register("sandstone_stairs", fn(BID $id) => new Stair($id, "Sandstone Stairs", $sandstoneBreakInfo)); + self::register("smooth_sandstone_stairs", fn(BID $id) => new Stair($id, "Smooth Sandstone Stairs", $sandstoneBreakInfo)); + self::register("sandstone", fn(BID $id) => new Opaque($id, "Sandstone", $sandstoneBreakInfo)); + self::register("chiseled_sandstone", fn(BID $id) => new Opaque($id, "Chiseled Sandstone", $sandstoneBreakInfo)); + self::register("cut_sandstone", fn(BID $id) => new Opaque($id, "Cut Sandstone", $sandstoneBreakInfo)); + self::register("smooth_sandstone", fn(BID $id) => new Opaque($id, "Smooth Sandstone", $sandstoneBreakInfo)); - self::register("glazed_terracotta", new GlazedTerracotta(new BID(Ids::GLAZED_TERRACOTTA), "Glazed Terracotta", new Info(BreakInfo::pickaxe(1.4, ToolTier::WOOD)))); - self::register("dyed_shulker_box", new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); - self::register("stained_glass", new StainedGlass(new BID(Ids::STAINED_GLASS), "Stained Glass", $glassBreakInfo)); - self::register("stained_glass_pane", new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE), "Stained Glass Pane", $glassBreakInfo)); - self::register("stained_clay", new StainedHardenedClay(new BID(Ids::STAINED_CLAY), "Stained Clay", $hardenedClayBreakInfo)); - self::register("stained_hardened_glass", new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS), "Stained Hardened Glass", $hardenedGlassBreakInfo)); - self::register("stained_hardened_glass_pane", new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - self::register("carpet", new Carpet(new BID(Ids::CARPET), "Carpet", new Info(new BreakInfo(0.1)))); - self::register("concrete", new Concrete(new BID(Ids::CONCRETE), "Concrete", new Info(BreakInfo::pickaxe(1.8, ToolTier::WOOD)))); - self::register("concrete_powder", new ConcretePowder(new BID(Ids::CONCRETE_POWDER), "Concrete Powder", new Info(BreakInfo::shovel(0.5)))); - self::register("wool", new Wool(new BID(Ids::WOOL), "Wool", new Info(new class(0.8, ToolType::SHEARS) extends BreakInfo{ + self::register("glazed_terracotta", fn(BID $id) => new GlazedTerracotta($id, "Glazed Terracotta", new Info(BreakInfo::pickaxe(1.4, ToolTier::WOOD)))); + self::register("dyed_shulker_box", fn(BID $id) => new DyedShulkerBox($id, "Dyed Shulker Box", $shulkerBoxBreakInfo), TileShulkerBox::class); + self::register("stained_glass", fn(BID $id) => new StainedGlass($id, "Stained Glass", $glassBreakInfo)); + self::register("stained_glass_pane", fn(BID $id) => new StainedGlassPane($id, "Stained Glass Pane", $glassBreakInfo)); + self::register("stained_clay", fn(BID $id) => new StainedHardenedClay($id, "Stained Clay", $hardenedClayBreakInfo)); + self::register("stained_hardened_glass", fn(BID $id) => new StainedHardenedGlass($id, "Stained Hardened Glass", $hardenedGlassBreakInfo)); + self::register("stained_hardened_glass_pane", fn(BID $id) => new StainedHardenedGlassPane($id, "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); + self::register("carpet", fn(BID $id) => new Carpet($id, "Carpet", new Info(new BreakInfo(0.1)))); + self::register("concrete", fn(BID $id) => new Concrete($id, "Concrete", new Info(BreakInfo::pickaxe(1.8, ToolTier::WOOD)))); + self::register("concrete_powder", fn(BID $id) => new ConcretePowder($id, "Concrete Powder", new Info(BreakInfo::shovel(0.5)))); + self::register("wool", fn(BID $id) => new Wool($id, "Wool", new Info(new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); if($item->getBlockToolType() === ToolType::SHEARS){ @@ -1228,54 +1252,54 @@ final class VanillaBlocks{ //TODO: in the future these won't all have the same hardness; they only do now because of the old metadata crap $wallBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("cobblestone_wall", new Wall(new BID(Ids::COBBLESTONE_WALL), "Cobblestone Wall", $wallBreakInfo)); - self::register("andesite_wall", new Wall(new BID(Ids::ANDESITE_WALL), "Andesite Wall", $wallBreakInfo)); - self::register("brick_wall", new Wall(new BID(Ids::BRICK_WALL), "Brick Wall", $wallBreakInfo)); - self::register("diorite_wall", new Wall(new BID(Ids::DIORITE_WALL), "Diorite Wall", $wallBreakInfo)); - self::register("end_stone_brick_wall", new Wall(new BID(Ids::END_STONE_BRICK_WALL), "End Stone Brick Wall", $wallBreakInfo)); - self::register("granite_wall", new Wall(new BID(Ids::GRANITE_WALL), "Granite Wall", $wallBreakInfo)); - self::register("mossy_stone_brick_wall", new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL), "Mossy Stone Brick Wall", $wallBreakInfo)); - self::register("mossy_cobblestone_wall", new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL), "Mossy Cobblestone Wall", $wallBreakInfo)); - self::register("nether_brick_wall", new Wall(new BID(Ids::NETHER_BRICK_WALL), "Nether Brick Wall", $wallBreakInfo)); - self::register("prismarine_wall", new Wall(new BID(Ids::PRISMARINE_WALL), "Prismarine Wall", $wallBreakInfo)); - self::register("red_nether_brick_wall", new Wall(new BID(Ids::RED_NETHER_BRICK_WALL), "Red Nether Brick Wall", $wallBreakInfo)); - self::register("red_sandstone_wall", new Wall(new BID(Ids::RED_SANDSTONE_WALL), "Red Sandstone Wall", $wallBreakInfo)); - self::register("sandstone_wall", new Wall(new BID(Ids::SANDSTONE_WALL), "Sandstone Wall", $wallBreakInfo)); - self::register("stone_brick_wall", new Wall(new BID(Ids::STONE_BRICK_WALL), "Stone Brick Wall", $wallBreakInfo)); + self::register("cobblestone_wall", fn(BID $id) => new Wall($id, "Cobblestone Wall", $wallBreakInfo)); + self::register("andesite_wall", fn(BID $id) => new Wall($id, "Andesite Wall", $wallBreakInfo)); + self::register("brick_wall", fn(BID $id) => new Wall($id, "Brick Wall", $wallBreakInfo)); + self::register("diorite_wall", fn(BID $id) => new Wall($id, "Diorite Wall", $wallBreakInfo)); + self::register("end_stone_brick_wall", fn(BID $id) => new Wall($id, "End Stone Brick Wall", $wallBreakInfo)); + self::register("granite_wall", fn(BID $id) => new Wall($id, "Granite Wall", $wallBreakInfo)); + self::register("mossy_stone_brick_wall", fn(BID $id) => new Wall($id, "Mossy Stone Brick Wall", $wallBreakInfo)); + self::register("mossy_cobblestone_wall", fn(BID $id) => new Wall($id, "Mossy Cobblestone Wall", $wallBreakInfo)); + self::register("nether_brick_wall", fn(BID $id) => new Wall($id, "Nether Brick Wall", $wallBreakInfo)); + self::register("prismarine_wall", fn(BID $id) => new Wall($id, "Prismarine Wall", $wallBreakInfo)); + self::register("red_nether_brick_wall", fn(BID $id) => new Wall($id, "Red Nether Brick Wall", $wallBreakInfo)); + self::register("red_sandstone_wall", fn(BID $id) => new Wall($id, "Red Sandstone Wall", $wallBreakInfo)); + self::register("sandstone_wall", fn(BID $id) => new Wall($id, "Sandstone Wall", $wallBreakInfo)); + self::register("stone_brick_wall", fn(BID $id) => new Wall($id, "Stone Brick Wall", $wallBreakInfo)); self::registerElements(); $chemistryTableBreakInfo = new Info(BreakInfo::pickaxe(2.5, ToolTier::WOOD)); - self::register("compound_creator", new ChemistryTable(new BID(Ids::COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); - self::register("element_constructor", new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); - self::register("lab_table", new ChemistryTable(new BID(Ids::LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); - self::register("material_reducer", new ChemistryTable(new BID(Ids::MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); + self::register("compound_creator", fn(BID $id) => new ChemistryTable($id, "Compound Creator", $chemistryTableBreakInfo)); + self::register("element_constructor", fn(BID $id) => new ChemistryTable($id, "Element Constructor", $chemistryTableBreakInfo)); + self::register("lab_table", fn(BID $id) => new ChemistryTable($id, "Lab Table", $chemistryTableBreakInfo)); + self::register("material_reducer", fn(BID $id) => new ChemistryTable($id, "Material Reducer", $chemistryTableBreakInfo)); - self::register("chemical_heat", new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT), "Heat Block", $chemistryTableBreakInfo)); + self::register("chemical_heat", fn(BID $id) => new ChemicalHeat($id, "Heat Block", $chemistryTableBreakInfo)); self::registerMushroomBlocks(); - self::register("coral", new Coral( - new BID(Ids::CORAL), + self::register("coral", fn(BID $id) => new Coral( + $id, "Coral", new Info(BreakInfo::instant()), )); - self::register("coral_fan", new FloorCoralFan( - new BID(Ids::CORAL_FAN), + self::register("coral_fan", fn(BID $id) => new FloorCoralFan( + $id, "Coral Fan", new Info(BreakInfo::instant()), )); - self::register("wall_coral_fan", new WallCoralFan( - new BID(Ids::WALL_CORAL_FAN), + self::register("wall_coral_fan", fn(BID $id) => new WallCoralFan( + $id, "Wall Coral Fan", new Info(BreakInfo::instant()), )); - self::register("mangrove_roots", new MangroveRoots(new BID(Ids::MANGROVE_ROOTS), "Mangrove Roots", new Info(BreakInfo::axe(0.7)))); - self::register("muddy_mangrove_roots", new SimplePillar(new BID(Ids::MUDDY_MANGROVE_ROOTS), "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); - self::register("froglight", new Froglight(new BID(Ids::FROGLIGHT), "Froglight", new Info(new BreakInfo(0.3)))); - self::register("sculk", new Sculk(new BID(Ids::SCULK), "Sculk", new Info(new BreakInfo(0.6, ToolType::HOE)))); - self::register("reinforced_deepslate", new class(new BID(Ids::REINFORCED_DEEPSLATE), "Reinforced Deepslate", new Info(new BreakInfo(55.0, ToolType::NONE, 0, 3600.0))) extends Opaque{ + self::register("mangrove_roots", fn(BID $id) => new MangroveRoots($id, "Mangrove Roots", new Info(BreakInfo::axe(0.7)))); + self::register("muddy_mangrove_roots", fn(BID $id) => new SimplePillar($id, "Muddy Mangrove Roots", new Info(BreakInfo::shovel(0.7), [Tags::MUD]))); + self::register("froglight", fn(BID $id) => new Froglight($id, "Froglight", new Info(new BreakInfo(0.3)))); + self::register("sculk", fn(BID $id) => new Sculk($id, "Sculk", new Info(new BreakInfo(0.6, ToolType::HOE)))); + self::register("reinforced_deepslate", fn(BID $id) => new class($id, "Reinforced Deepslate", new Info(new BreakInfo(55.0, ToolType::NONE, 0, 3600.0))) extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return []; } @@ -1308,300 +1332,311 @@ final class VanillaBlocks{ $name = $woodType->getDisplayName(); $idName = fn(string $suffix) => strtolower($woodType->name) . "_" . $suffix; - self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getLogIdentifier($woodType), $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); - self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), new Wood(WoodLikeBlockIdHelper::getAllSidedLogIdentifier($woodType), $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); + self::register($idName(mb_strtolower($woodType->getStandardLogSuffix() ?? "log", 'US-ASCII')), fn(BID $id) => new Wood($id, $name . " " . ($woodType->getStandardLogSuffix() ?? "Log"), $logBreakInfo, $woodType)); + self::register($idName(mb_strtolower($woodType->getAllSidedLogSuffix() ?? "wood", 'US-ASCII')), fn(BID $id) => new Wood($id, $name . " " . ($woodType->getAllSidedLogSuffix() ?? "Wood"), $logBreakInfo, $woodType)); - self::register($idName("planks"), new Planks(WoodLikeBlockIdHelper::getPlanksIdentifier($woodType), $name . " Planks", $planksBreakInfo, $woodType)); - self::register($idName("fence"), new WoodenFence(WoodLikeBlockIdHelper::getFenceIdentifier($woodType), $name . " Fence", $planksBreakInfo, $woodType)); - self::register($idName("slab"), new WoodenSlab(WoodLikeBlockIdHelper::getSlabIdentifier($woodType), $name, $planksBreakInfo, $woodType)); + self::register($idName("planks"), fn(BID $id) => new Planks($id, $name . " Planks", $planksBreakInfo, $woodType)); + self::register($idName("fence"), fn(BID $id) => new WoodenFence($id, $name . " Fence", $planksBreakInfo, $woodType)); + self::register($idName("slab"), fn(BID $id) => new WoodenSlab($id, $name, $planksBreakInfo, $woodType)); - self::register($idName("fence_gate"), new FenceGate(WoodLikeBlockIdHelper::getFenceGateIdentifier($woodType), $name . " Fence Gate", $planksBreakInfo, $woodType)); - self::register($idName("stairs"), new WoodenStairs(WoodLikeBlockIdHelper::getStairsIdentifier($woodType), $name . " Stairs", $planksBreakInfo, $woodType)); - self::register($idName("door"), new WoodenDoor(WoodLikeBlockIdHelper::getDoorIdentifier($woodType), $name . " Door", $woodenDoorBreakInfo, $woodType)); + self::register($idName("fence_gate"), fn(BID $id) => new FenceGate($id, $name . " Fence Gate", $planksBreakInfo, $woodType)); + self::register($idName("stairs"), fn(BID $id) => new WoodenStairs($id, $name . " Stairs", $planksBreakInfo, $woodType)); + self::register($idName("door"), fn(BID $id) => new WoodenDoor($id, $name . " Door", $woodenDoorBreakInfo, $woodType)); - self::register($idName("button"), new WoodenButton(WoodLikeBlockIdHelper::getButtonIdentifier($woodType), $name . " Button", $woodenButtonBreakInfo, $woodType)); - self::register($idName("pressure_plate"), new WoodenPressurePlate(WoodLikeBlockIdHelper::getPressurePlateIdentifier($woodType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType, 20)); - self::register($idName("trapdoor"), new WoodenTrapdoor(WoodLikeBlockIdHelper::getTrapdoorIdentifier($woodType), $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); + self::register($idName("button"), fn(BID $id) => new WoodenButton($id, $name . " Button", $woodenButtonBreakInfo, $woodType)); + self::register($idName("pressure_plate"), fn(BID $id) => new WoodenPressurePlate($id, $name . " Pressure Plate", $woodenPressurePlateBreakInfo, $woodType, 20)); + self::register($idName("trapdoor"), fn(BID $id) => new WoodenTrapdoor($id, $name . " Trapdoor", $woodenDoorBreakInfo, $woodType)); - [$floorSignId, $wallSignId, $signAsItem] = WoodLikeBlockIdHelper::getSignInfo($woodType); - self::register($idName("sign"), new FloorSign($floorSignId, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); - self::register($idName("wall_sign"), new WallSign($wallSignId, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); + $signAsItem = match($woodType){ + WoodType::OAK => VanillaItems::OAK_SIGN(...), + WoodType::SPRUCE => VanillaItems::SPRUCE_SIGN(...), + WoodType::BIRCH => VanillaItems::BIRCH_SIGN(...), + WoodType::JUNGLE => VanillaItems::JUNGLE_SIGN(...), + WoodType::ACACIA => VanillaItems::ACACIA_SIGN(...), + WoodType::DARK_OAK => VanillaItems::DARK_OAK_SIGN(...), + WoodType::MANGROVE => VanillaItems::MANGROVE_SIGN(...), + WoodType::CRIMSON => VanillaItems::CRIMSON_SIGN(...), + WoodType::WARPED => VanillaItems::WARPED_SIGN(...), + WoodType::CHERRY => VanillaItems::CHERRY_SIGN(...), + }; + self::register($idName("sign"), fn(BID $id) => new FloorSign($id, $name . " Sign", $signBreakInfo, $woodType, $signAsItem)); + self::register($idName("wall_sign"), fn(BID $id) => new WallSign($id, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem)); } } private static function registerMushroomBlocks() : void{ $mushroomBlockBreakInfo = new Info(BreakInfo::axe(0.2)); - self::register("brown_mushroom_block", new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK), "Brown Mushroom Block", $mushroomBlockBreakInfo)); - self::register("red_mushroom_block", new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK), "Red Mushroom Block", $mushroomBlockBreakInfo)); + self::register("brown_mushroom_block", fn(BID $id) => new BrownMushroomBlock($id, "Brown Mushroom Block", $mushroomBlockBreakInfo)); + self::register("red_mushroom_block", fn(BID $id) => new RedMushroomBlock($id, "Red Mushroom Block", $mushroomBlockBreakInfo)); //finally, the stems - self::register("mushroom_stem", new MushroomStem(new BID(Ids::MUSHROOM_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); - self::register("all_sided_mushroom_stem", new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); + self::register("mushroom_stem", fn(BID $id) => new MushroomStem($id, "Mushroom Stem", $mushroomBlockBreakInfo)); + self::register("all_sided_mushroom_stem", fn(BID $id) => new MushroomStem($id, "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); } private static function registerElements() : void{ $instaBreak = new Info(BreakInfo::instant()); - self::register("element_zero", new Opaque(new BID(Ids::ELEMENT_ZERO), "???", $instaBreak)); + self::register("element_zero", fn(BID $id) => new Opaque($id, "???", $instaBreak)); - $register = fn(string $name, int $id, string $displayName, string $symbol, int $atomicWeight, int $group) => - self::register("element_$name", new Element(new BID($id), $displayName, $instaBreak, $symbol, $atomicWeight, $group)); + $register = fn(string $name, string $displayName, string $symbol, int $atomicWeight, int $group) => + self::register("element_$name", fn(BID $id) => new Element($id, $displayName, $instaBreak, $symbol, $atomicWeight, $group)); - $register("hydrogen", Ids::ELEMENT_HYDROGEN, "Hydrogen", "h", 1, 5); - $register("helium", Ids::ELEMENT_HELIUM, "Helium", "he", 2, 7); - $register("lithium", Ids::ELEMENT_LITHIUM, "Lithium", "li", 3, 0); - $register("beryllium", Ids::ELEMENT_BERYLLIUM, "Beryllium", "be", 4, 1); - $register("boron", Ids::ELEMENT_BORON, "Boron", "b", 5, 4); - $register("carbon", Ids::ELEMENT_CARBON, "Carbon", "c", 6, 5); - $register("nitrogen", Ids::ELEMENT_NITROGEN, "Nitrogen", "n", 7, 5); - $register("oxygen", Ids::ELEMENT_OXYGEN, "Oxygen", "o", 8, 5); - $register("fluorine", Ids::ELEMENT_FLUORINE, "Fluorine", "f", 9, 6); - $register("neon", Ids::ELEMENT_NEON, "Neon", "ne", 10, 7); - $register("sodium", Ids::ELEMENT_SODIUM, "Sodium", "na", 11, 0); - $register("magnesium", Ids::ELEMENT_MAGNESIUM, "Magnesium", "mg", 12, 1); - $register("aluminum", Ids::ELEMENT_ALUMINUM, "Aluminum", "al", 13, 3); - $register("silicon", Ids::ELEMENT_SILICON, "Silicon", "si", 14, 4); - $register("phosphorus", Ids::ELEMENT_PHOSPHORUS, "Phosphorus", "p", 15, 5); - $register("sulfur", Ids::ELEMENT_SULFUR, "Sulfur", "s", 16, 5); - $register("chlorine", Ids::ELEMENT_CHLORINE, "Chlorine", "cl", 17, 6); - $register("argon", Ids::ELEMENT_ARGON, "Argon", "ar", 18, 7); - $register("potassium", Ids::ELEMENT_POTASSIUM, "Potassium", "k", 19, 0); - $register("calcium", Ids::ELEMENT_CALCIUM, "Calcium", "ca", 20, 1); - $register("scandium", Ids::ELEMENT_SCANDIUM, "Scandium", "sc", 21, 2); - $register("titanium", Ids::ELEMENT_TITANIUM, "Titanium", "ti", 22, 2); - $register("vanadium", Ids::ELEMENT_VANADIUM, "Vanadium", "v", 23, 2); - $register("chromium", Ids::ELEMENT_CHROMIUM, "Chromium", "cr", 24, 2); - $register("manganese", Ids::ELEMENT_MANGANESE, "Manganese", "mn", 25, 2); - $register("iron", Ids::ELEMENT_IRON, "Iron", "fe", 26, 2); - $register("cobalt", Ids::ELEMENT_COBALT, "Cobalt", "co", 27, 2); - $register("nickel", Ids::ELEMENT_NICKEL, "Nickel", "ni", 28, 2); - $register("copper", Ids::ELEMENT_COPPER, "Copper", "cu", 29, 2); - $register("zinc", Ids::ELEMENT_ZINC, "Zinc", "zn", 30, 2); - $register("gallium", Ids::ELEMENT_GALLIUM, "Gallium", "ga", 31, 3); - $register("germanium", Ids::ELEMENT_GERMANIUM, "Germanium", "ge", 32, 4); - $register("arsenic", Ids::ELEMENT_ARSENIC, "Arsenic", "as", 33, 4); - $register("selenium", Ids::ELEMENT_SELENIUM, "Selenium", "se", 34, 5); - $register("bromine", Ids::ELEMENT_BROMINE, "Bromine", "br", 35, 6); - $register("krypton", Ids::ELEMENT_KRYPTON, "Krypton", "kr", 36, 7); - $register("rubidium", Ids::ELEMENT_RUBIDIUM, "Rubidium", "rb", 37, 0); - $register("strontium", Ids::ELEMENT_STRONTIUM, "Strontium", "sr", 38, 1); - $register("yttrium", Ids::ELEMENT_YTTRIUM, "Yttrium", "y", 39, 2); - $register("zirconium", Ids::ELEMENT_ZIRCONIUM, "Zirconium", "zr", 40, 2); - $register("niobium", Ids::ELEMENT_NIOBIUM, "Niobium", "nb", 41, 2); - $register("molybdenum", Ids::ELEMENT_MOLYBDENUM, "Molybdenum", "mo", 42, 2); - $register("technetium", Ids::ELEMENT_TECHNETIUM, "Technetium", "tc", 43, 2); - $register("ruthenium", Ids::ELEMENT_RUTHENIUM, "Ruthenium", "ru", 44, 2); - $register("rhodium", Ids::ELEMENT_RHODIUM, "Rhodium", "rh", 45, 2); - $register("palladium", Ids::ELEMENT_PALLADIUM, "Palladium", "pd", 46, 2); - $register("silver", Ids::ELEMENT_SILVER, "Silver", "ag", 47, 2); - $register("cadmium", Ids::ELEMENT_CADMIUM, "Cadmium", "cd", 48, 2); - $register("indium", Ids::ELEMENT_INDIUM, "Indium", "in", 49, 3); - $register("tin", Ids::ELEMENT_TIN, "Tin", "sn", 50, 3); - $register("antimony", Ids::ELEMENT_ANTIMONY, "Antimony", "sb", 51, 4); - $register("tellurium", Ids::ELEMENT_TELLURIUM, "Tellurium", "te", 52, 4); - $register("iodine", Ids::ELEMENT_IODINE, "Iodine", "i", 53, 6); - $register("xenon", Ids::ELEMENT_XENON, "Xenon", "xe", 54, 7); - $register("cesium", Ids::ELEMENT_CESIUM, "Cesium", "cs", 55, 0); - $register("barium", Ids::ELEMENT_BARIUM, "Barium", "ba", 56, 1); - $register("lanthanum", Ids::ELEMENT_LANTHANUM, "Lanthanum", "la", 57, 8); - $register("cerium", Ids::ELEMENT_CERIUM, "Cerium", "ce", 58, 8); - $register("praseodymium", Ids::ELEMENT_PRASEODYMIUM, "Praseodymium", "pr", 59, 8); - $register("neodymium", Ids::ELEMENT_NEODYMIUM, "Neodymium", "nd", 60, 8); - $register("promethium", Ids::ELEMENT_PROMETHIUM, "Promethium", "pm", 61, 8); - $register("samarium", Ids::ELEMENT_SAMARIUM, "Samarium", "sm", 62, 8); - $register("europium", Ids::ELEMENT_EUROPIUM, "Europium", "eu", 63, 8); - $register("gadolinium", Ids::ELEMENT_GADOLINIUM, "Gadolinium", "gd", 64, 8); - $register("terbium", Ids::ELEMENT_TERBIUM, "Terbium", "tb", 65, 8); - $register("dysprosium", Ids::ELEMENT_DYSPROSIUM, "Dysprosium", "dy", 66, 8); - $register("holmium", Ids::ELEMENT_HOLMIUM, "Holmium", "ho", 67, 8); - $register("erbium", Ids::ELEMENT_ERBIUM, "Erbium", "er", 68, 8); - $register("thulium", Ids::ELEMENT_THULIUM, "Thulium", "tm", 69, 8); - $register("ytterbium", Ids::ELEMENT_YTTERBIUM, "Ytterbium", "yb", 70, 8); - $register("lutetium", Ids::ELEMENT_LUTETIUM, "Lutetium", "lu", 71, 8); - $register("hafnium", Ids::ELEMENT_HAFNIUM, "Hafnium", "hf", 72, 2); - $register("tantalum", Ids::ELEMENT_TANTALUM, "Tantalum", "ta", 73, 2); - $register("tungsten", Ids::ELEMENT_TUNGSTEN, "Tungsten", "w", 74, 2); - $register("rhenium", Ids::ELEMENT_RHENIUM, "Rhenium", "re", 75, 2); - $register("osmium", Ids::ELEMENT_OSMIUM, "Osmium", "os", 76, 2); - $register("iridium", Ids::ELEMENT_IRIDIUM, "Iridium", "ir", 77, 2); - $register("platinum", Ids::ELEMENT_PLATINUM, "Platinum", "pt", 78, 2); - $register("gold", Ids::ELEMENT_GOLD, "Gold", "au", 79, 2); - $register("mercury", Ids::ELEMENT_MERCURY, "Mercury", "hg", 80, 2); - $register("thallium", Ids::ELEMENT_THALLIUM, "Thallium", "tl", 81, 3); - $register("lead", Ids::ELEMENT_LEAD, "Lead", "pb", 82, 3); - $register("bismuth", Ids::ELEMENT_BISMUTH, "Bismuth", "bi", 83, 3); - $register("polonium", Ids::ELEMENT_POLONIUM, "Polonium", "po", 84, 4); - $register("astatine", Ids::ELEMENT_ASTATINE, "Astatine", "at", 85, 6); - $register("radon", Ids::ELEMENT_RADON, "Radon", "rn", 86, 7); - $register("francium", Ids::ELEMENT_FRANCIUM, "Francium", "fr", 87, 0); - $register("radium", Ids::ELEMENT_RADIUM, "Radium", "ra", 88, 1); - $register("actinium", Ids::ELEMENT_ACTINIUM, "Actinium", "ac", 89, 9); - $register("thorium", Ids::ELEMENT_THORIUM, "Thorium", "th", 90, 9); - $register("protactinium", Ids::ELEMENT_PROTACTINIUM, "Protactinium", "pa", 91, 9); - $register("uranium", Ids::ELEMENT_URANIUM, "Uranium", "u", 92, 9); - $register("neptunium", Ids::ELEMENT_NEPTUNIUM, "Neptunium", "np", 93, 9); - $register("plutonium", Ids::ELEMENT_PLUTONIUM, "Plutonium", "pu", 94, 9); - $register("americium", Ids::ELEMENT_AMERICIUM, "Americium", "am", 95, 9); - $register("curium", Ids::ELEMENT_CURIUM, "Curium", "cm", 96, 9); - $register("berkelium", Ids::ELEMENT_BERKELIUM, "Berkelium", "bk", 97, 9); - $register("californium", Ids::ELEMENT_CALIFORNIUM, "Californium", "cf", 98, 9); - $register("einsteinium", Ids::ELEMENT_EINSTEINIUM, "Einsteinium", "es", 99, 9); - $register("fermium", Ids::ELEMENT_FERMIUM, "Fermium", "fm", 100, 9); - $register("mendelevium", Ids::ELEMENT_MENDELEVIUM, "Mendelevium", "md", 101, 9); - $register("nobelium", Ids::ELEMENT_NOBELIUM, "Nobelium", "no", 102, 9); - $register("lawrencium", Ids::ELEMENT_LAWRENCIUM, "Lawrencium", "lr", 103, 9); - $register("rutherfordium", Ids::ELEMENT_RUTHERFORDIUM, "Rutherfordium", "rf", 104, 2); - $register("dubnium", Ids::ELEMENT_DUBNIUM, "Dubnium", "db", 105, 2); - $register("seaborgium", Ids::ELEMENT_SEABORGIUM, "Seaborgium", "sg", 106, 2); - $register("bohrium", Ids::ELEMENT_BOHRIUM, "Bohrium", "bh", 107, 2); - $register("hassium", Ids::ELEMENT_HASSIUM, "Hassium", "hs", 108, 2); - $register("meitnerium", Ids::ELEMENT_MEITNERIUM, "Meitnerium", "mt", 109, 2); - $register("darmstadtium", Ids::ELEMENT_DARMSTADTIUM, "Darmstadtium", "ds", 110, 2); - $register("roentgenium", Ids::ELEMENT_ROENTGENIUM, "Roentgenium", "rg", 111, 2); - $register("copernicium", Ids::ELEMENT_COPERNICIUM, "Copernicium", "cn", 112, 2); - $register("nihonium", Ids::ELEMENT_NIHONIUM, "Nihonium", "nh", 113, 3); - $register("flerovium", Ids::ELEMENT_FLEROVIUM, "Flerovium", "fl", 114, 3); - $register("moscovium", Ids::ELEMENT_MOSCOVIUM, "Moscovium", "mc", 115, 3); - $register("livermorium", Ids::ELEMENT_LIVERMORIUM, "Livermorium", "lv", 116, 3); - $register("tennessine", Ids::ELEMENT_TENNESSINE, "Tennessine", "ts", 117, 6); - $register("oganesson", Ids::ELEMENT_OGANESSON, "Oganesson", "og", 118, 7); + $register("hydrogen", "Hydrogen", "h", 1, 5); + $register("helium", "Helium", "he", 2, 7); + $register("lithium", "Lithium", "li", 3, 0); + $register("beryllium", "Beryllium", "be", 4, 1); + $register("boron", "Boron", "b", 5, 4); + $register("carbon", "Carbon", "c", 6, 5); + $register("nitrogen", "Nitrogen", "n", 7, 5); + $register("oxygen", "Oxygen", "o", 8, 5); + $register("fluorine", "Fluorine", "f", 9, 6); + $register("neon", "Neon", "ne", 10, 7); + $register("sodium", "Sodium", "na", 11, 0); + $register("magnesium", "Magnesium", "mg", 12, 1); + $register("aluminum", "Aluminum", "al", 13, 3); + $register("silicon", "Silicon", "si", 14, 4); + $register("phosphorus", "Phosphorus", "p", 15, 5); + $register("sulfur", "Sulfur", "s", 16, 5); + $register("chlorine", "Chlorine", "cl", 17, 6); + $register("argon", "Argon", "ar", 18, 7); + $register("potassium", "Potassium", "k", 19, 0); + $register("calcium", "Calcium", "ca", 20, 1); + $register("scandium", "Scandium", "sc", 21, 2); + $register("titanium", "Titanium", "ti", 22, 2); + $register("vanadium", "Vanadium", "v", 23, 2); + $register("chromium", "Chromium", "cr", 24, 2); + $register("manganese", "Manganese", "mn", 25, 2); + $register("iron", "Iron", "fe", 26, 2); + $register("cobalt", "Cobalt", "co", 27, 2); + $register("nickel", "Nickel", "ni", 28, 2); + $register("copper", "Copper", "cu", 29, 2); + $register("zinc", "Zinc", "zn", 30, 2); + $register("gallium", "Gallium", "ga", 31, 3); + $register("germanium", "Germanium", "ge", 32, 4); + $register("arsenic", "Arsenic", "as", 33, 4); + $register("selenium", "Selenium", "se", 34, 5); + $register("bromine", "Bromine", "br", 35, 6); + $register("krypton", "Krypton", "kr", 36, 7); + $register("rubidium", "Rubidium", "rb", 37, 0); + $register("strontium", "Strontium", "sr", 38, 1); + $register("yttrium", "Yttrium", "y", 39, 2); + $register("zirconium", "Zirconium", "zr", 40, 2); + $register("niobium", "Niobium", "nb", 41, 2); + $register("molybdenum", "Molybdenum", "mo", 42, 2); + $register("technetium", "Technetium", "tc", 43, 2); + $register("ruthenium", "Ruthenium", "ru", 44, 2); + $register("rhodium", "Rhodium", "rh", 45, 2); + $register("palladium", "Palladium", "pd", 46, 2); + $register("silver", "Silver", "ag", 47, 2); + $register("cadmium", "Cadmium", "cd", 48, 2); + $register("indium", "Indium", "in", 49, 3); + $register("tin", "Tin", "sn", 50, 3); + $register("antimony", "Antimony", "sb", 51, 4); + $register("tellurium", "Tellurium", "te", 52, 4); + $register("iodine", "Iodine", "i", 53, 6); + $register("xenon", "Xenon", "xe", 54, 7); + $register("cesium", "Cesium", "cs", 55, 0); + $register("barium", "Barium", "ba", 56, 1); + $register("lanthanum", "Lanthanum", "la", 57, 8); + $register("cerium", "Cerium", "ce", 58, 8); + $register("praseodymium", "Praseodymium", "pr", 59, 8); + $register("neodymium", "Neodymium", "nd", 60, 8); + $register("promethium", "Promethium", "pm", 61, 8); + $register("samarium", "Samarium", "sm", 62, 8); + $register("europium", "Europium", "eu", 63, 8); + $register("gadolinium", "Gadolinium", "gd", 64, 8); + $register("terbium", "Terbium", "tb", 65, 8); + $register("dysprosium", "Dysprosium", "dy", 66, 8); + $register("holmium", "Holmium", "ho", 67, 8); + $register("erbium", "Erbium", "er", 68, 8); + $register("thulium", "Thulium", "tm", 69, 8); + $register("ytterbium", "Ytterbium", "yb", 70, 8); + $register("lutetium", "Lutetium", "lu", 71, 8); + $register("hafnium", "Hafnium", "hf", 72, 2); + $register("tantalum", "Tantalum", "ta", 73, 2); + $register("tungsten", "Tungsten", "w", 74, 2); + $register("rhenium", "Rhenium", "re", 75, 2); + $register("osmium", "Osmium", "os", 76, 2); + $register("iridium", "Iridium", "ir", 77, 2); + $register("platinum", "Platinum", "pt", 78, 2); + $register("gold", "Gold", "au", 79, 2); + $register("mercury", "Mercury", "hg", 80, 2); + $register("thallium", "Thallium", "tl", 81, 3); + $register("lead", "Lead", "pb", 82, 3); + $register("bismuth", "Bismuth", "bi", 83, 3); + $register("polonium", "Polonium", "po", 84, 4); + $register("astatine", "Astatine", "at", 85, 6); + $register("radon", "Radon", "rn", 86, 7); + $register("francium", "Francium", "fr", 87, 0); + $register("radium", "Radium", "ra", 88, 1); + $register("actinium", "Actinium", "ac", 89, 9); + $register("thorium", "Thorium", "th", 90, 9); + $register("protactinium", "Protactinium", "pa", 91, 9); + $register("uranium", "Uranium", "u", 92, 9); + $register("neptunium", "Neptunium", "np", 93, 9); + $register("plutonium", "Plutonium", "pu", 94, 9); + $register("americium", "Americium", "am", 95, 9); + $register("curium", "Curium", "cm", 96, 9); + $register("berkelium", "Berkelium", "bk", 97, 9); + $register("californium", "Californium", "cf", 98, 9); + $register("einsteinium", "Einsteinium", "es", 99, 9); + $register("fermium", "Fermium", "fm", 100, 9); + $register("mendelevium", "Mendelevium", "md", 101, 9); + $register("nobelium", "Nobelium", "no", 102, 9); + $register("lawrencium", "Lawrencium", "lr", 103, 9); + $register("rutherfordium", "Rutherfordium", "rf", 104, 2); + $register("dubnium", "Dubnium", "db", 105, 2); + $register("seaborgium", "Seaborgium", "sg", 106, 2); + $register("bohrium", "Bohrium", "bh", 107, 2); + $register("hassium", "Hassium", "hs", 108, 2); + $register("meitnerium", "Meitnerium", "mt", 109, 2); + $register("darmstadtium", "Darmstadtium", "ds", 110, 2); + $register("roentgenium", "Roentgenium", "rg", 111, 2); + $register("copernicium", "Copernicium", "cn", 112, 2); + $register("nihonium", "Nihonium", "nh", 113, 3); + $register("flerovium", "Flerovium", "fl", 114, 3); + $register("moscovium", "Moscovium", "mc", 115, 3); + $register("livermorium", "Livermorium", "lv", 116, 3); + $register("tennessine", "Tennessine", "ts", 117, 6); + $register("oganesson", "Oganesson", "og", 118, 7); } private static function registerOres() : void{ $stoneOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(3.0, $toolTier)); - self::register("coal_ore", new CoalOre(new BID(Ids::COAL_ORE), "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD))); - self::register("copper_ore", new CopperOre(new BID(Ids::COPPER_ORE), "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE))); - self::register("diamond_ore", new DiamondOre(new BID(Ids::DIAMOND_ORE), "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON))); - self::register("emerald_ore", new EmeraldOre(new BID(Ids::EMERALD_ORE), "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON))); - self::register("gold_ore", new GoldOre(new BID(Ids::GOLD_ORE), "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON))); - self::register("iron_ore", new IronOre(new BID(Ids::IRON_ORE), "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE))); - self::register("lapis_lazuli_ore", new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE), "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE))); - self::register("redstone_ore", new RedstoneOre(new BID(Ids::REDSTONE_ORE), "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("coal_ore", fn(BID $id) => new CoalOre($id, "Coal Ore", $stoneOreBreakInfo(ToolTier::WOOD))); + self::register("copper_ore", fn(BID $id) => new CopperOre($id, "Copper Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("diamond_ore", fn(BID $id) => new DiamondOre($id, "Diamond Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("emerald_ore", fn(BID $id) => new EmeraldOre($id, "Emerald Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("gold_ore", fn(BID $id) => new GoldOre($id, "Gold Ore", $stoneOreBreakInfo(ToolTier::IRON))); + self::register("iron_ore", fn(BID $id) => new IronOre($id, "Iron Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("lapis_lazuli_ore", fn(BID $id) => new LapisOre($id, "Lapis Lazuli Ore", $stoneOreBreakInfo(ToolTier::STONE))); + self::register("redstone_ore", fn(BID $id) => new RedstoneOre($id, "Redstone Ore", $stoneOreBreakInfo(ToolTier::IRON))); $deepslateOreBreakInfo = fn(ToolTier $toolTier) => new Info(BreakInfo::pickaxe(4.5, $toolTier)); - self::register("deepslate_coal_ore", new CoalOre(new BID(Ids::DEEPSLATE_COAL_ORE), "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD))); - self::register("deepslate_copper_ore", new CopperOre(new BID(Ids::DEEPSLATE_COPPER_ORE), "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE))); - self::register("deepslate_diamond_ore", new DiamondOre(new BID(Ids::DEEPSLATE_DIAMOND_ORE), "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON))); - self::register("deepslate_emerald_ore", new EmeraldOre(new BID(Ids::DEEPSLATE_EMERALD_ORE), "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON))); - self::register("deepslate_gold_ore", new GoldOre(new BID(Ids::DEEPSLATE_GOLD_ORE), "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON))); - self::register("deepslate_iron_ore", new IronOre(new BID(Ids::DEEPSLATE_IRON_ORE), "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE))); - self::register("deepslate_lapis_lazuli_ore", new LapisOre(new BID(Ids::DEEPSLATE_LAPIS_LAZULI_ORE), "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE))); - self::register("deepslate_redstone_ore", new RedstoneOre(new BID(Ids::DEEPSLATE_REDSTONE_ORE), "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_coal_ore", fn(BID $id) => new CoalOre($id, "Deepslate Coal Ore", $deepslateOreBreakInfo(ToolTier::WOOD))); + self::register("deepslate_copper_ore", fn(BID $id) => new CopperOre($id, "Deepslate Copper Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_diamond_ore", fn(BID $id) => new DiamondOre($id, "Deepslate Diamond Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_emerald_ore", fn(BID $id) => new EmeraldOre($id, "Deepslate Emerald Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_gold_ore", fn(BID $id) => new GoldOre($id, "Deepslate Gold Ore", $deepslateOreBreakInfo(ToolTier::IRON))); + self::register("deepslate_iron_ore", fn(BID $id) => new IronOre($id, "Deepslate Iron Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_lapis_lazuli_ore", fn(BID $id) => new LapisOre($id, "Deepslate Lapis Lazuli Ore", $deepslateOreBreakInfo(ToolTier::STONE))); + self::register("deepslate_redstone_ore", fn(BID $id) => new RedstoneOre($id, "Deepslate Redstone Ore", $deepslateOreBreakInfo(ToolTier::IRON))); $netherrackOreBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::WOOD)); - self::register("nether_quartz_ore", new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE), "Nether Quartz Ore", $netherrackOreBreakInfo)); - self::register("nether_gold_ore", new NetherGoldOre(new BID(Ids::NETHER_GOLD_ORE), "Nether Gold Ore", $netherrackOreBreakInfo)); + self::register("nether_quartz_ore", fn(BID $id) => new NetherQuartzOre($id, "Nether Quartz Ore", $netherrackOreBreakInfo)); + self::register("nether_gold_ore", fn(BID $id) => new NetherGoldOre($id, "Nether Gold Ore", $netherrackOreBreakInfo)); } private static function registerCraftingTables() : void{ //TODO: this is the same for all wooden crafting blocks $craftingBlockBreakInfo = new Info(BreakInfo::axe(2.5)); - self::register("cartography_table", new CartographyTable(new BID(Ids::CARTOGRAPHY_TABLE), "Cartography Table", $craftingBlockBreakInfo)); - self::register("crafting_table", new CraftingTable(new BID(Ids::CRAFTING_TABLE), "Crafting Table", $craftingBlockBreakInfo)); - self::register("fletching_table", new FletchingTable(new BID(Ids::FLETCHING_TABLE), "Fletching Table", $craftingBlockBreakInfo)); - self::register("loom", new Loom(new BID(Ids::LOOM), "Loom", $craftingBlockBreakInfo)); - self::register("smithing_table", new SmithingTable(new BID(Ids::SMITHING_TABLE), "Smithing Table", $craftingBlockBreakInfo)); + self::register("cartography_table", fn(BID $id) => new CartographyTable($id, "Cartography Table", $craftingBlockBreakInfo)); + self::register("crafting_table", fn(BID $id) => new CraftingTable($id, "Crafting Table", $craftingBlockBreakInfo)); + self::register("fletching_table", fn(BID $id) => new FletchingTable($id, "Fletching Table", $craftingBlockBreakInfo)); + self::register("loom", fn(BID $id) => new Loom($id, "Loom", $craftingBlockBreakInfo)); + self::register("smithing_table", fn(BID $id) => new SmithingTable($id, "Smithing Table", $craftingBlockBreakInfo)); } private static function registerChorusBlocks() : void{ $chorusBlockBreakInfo = new Info(BreakInfo::axe(0.4)); - self::register("chorus_plant", new ChorusPlant(new BID(Ids::CHORUS_PLANT), "Chorus Plant", $chorusBlockBreakInfo)); - self::register("chorus_flower", new ChorusFlower(new BID(Ids::CHORUS_FLOWER), "Chorus Flower", $chorusBlockBreakInfo)); + self::register("chorus_plant", fn(BID $id) => new ChorusPlant($id, "Chorus Plant", $chorusBlockBreakInfo)); + self::register("chorus_flower", fn(BID $id) => new ChorusFlower($id, "Chorus Flower", $chorusBlockBreakInfo)); } private static function registerBlocksR13() : void{ - self::register("light", new Light(new BID(Ids::LIGHT), "Light Block", new Info(BreakInfo::indestructible()))); - self::register("wither_rose", new WitherRose(new BID(Ids::WITHER_ROSE), "Wither Rose", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); + self::register("light", fn(BID $id) => new Light($id, "Light Block", new Info(BreakInfo::indestructible()))); + self::register("wither_rose", fn(BID $id) => new WitherRose($id, "Wither Rose", new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]))); } private static function registerBlocksR14() : void{ - self::register("honeycomb", new Opaque(new BID(Ids::HONEYCOMB), "Honeycomb Block", new Info(new BreakInfo(0.6)))); + self::register("honeycomb", fn(BID $id) => new Opaque($id, "Honeycomb Block", new Info(new BreakInfo(0.6)))); } private static function registerBlocksR16() : void{ //for some reason, slabs have weird hardness like the legacy ones $slabBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("ancient_debris", new class(new BID(Ids::ANCIENT_DEBRIS), "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND, 3600.0))) extends Opaque{ + self::register("ancient_debris", fn(BID $id) => new class($id, "Ancient Debris", new Info(BreakInfo::pickaxe(30, ToolTier::DIAMOND, 3600.0))) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); $netheriteBreakInfo = new Info(BreakInfo::pickaxe(50, ToolTier::DIAMOND, 3600.0)); - self::register("netherite", new class(new BID(Ids::NETHERITE), "Netherite Block", $netheriteBreakInfo) extends Opaque{ + self::register("netherite", fn(BID $id) => new class($id, "Netherite Block", $netheriteBreakInfo) extends Opaque{ public function isFireProofAsItem() : bool{ return true; } }); $basaltBreakInfo = new Info(BreakInfo::pickaxe(1.25, ToolTier::WOOD, 21.0)); - self::register("basalt", new SimplePillar(new BID(Ids::BASALT), "Basalt", $basaltBreakInfo)); - self::register("polished_basalt", new SimplePillar(new BID(Ids::POLISHED_BASALT), "Polished Basalt", $basaltBreakInfo)); - self::register("smooth_basalt", new Opaque(new BID(Ids::SMOOTH_BASALT), "Smooth Basalt", $basaltBreakInfo)); + self::register("basalt", fn(BID $id) => new SimplePillar($id, "Basalt", $basaltBreakInfo)); + self::register("polished_basalt", fn(BID $id) => new SimplePillar($id, "Polished Basalt", $basaltBreakInfo)); + self::register("smooth_basalt", fn(BID $id) => new Opaque($id, "Smooth Basalt", $basaltBreakInfo)); $blackstoneBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); - self::register("blackstone", new Opaque(new BID(Ids::BLACKSTONE), "Blackstone", $blackstoneBreakInfo)); - self::register("blackstone_slab", new Slab(new BID(Ids::BLACKSTONE_SLAB), "Blackstone", $slabBreakInfo)); - self::register("blackstone_stairs", new Stair(new BID(Ids::BLACKSTONE_STAIRS), "Blackstone Stairs", $blackstoneBreakInfo)); - self::register("blackstone_wall", new Wall(new BID(Ids::BLACKSTONE_WALL), "Blackstone Wall", $blackstoneBreakInfo)); + self::register("blackstone", fn(BID $id) => new Opaque($id, "Blackstone", $blackstoneBreakInfo)); + self::register("blackstone_slab", fn(BID $id) => new Slab($id, "Blackstone", $slabBreakInfo)); + self::register("blackstone_stairs", fn(BID $id) => new Stair($id, "Blackstone Stairs", $blackstoneBreakInfo)); + self::register("blackstone_wall", fn(BID $id) => new Wall($id, "Blackstone Wall", $blackstoneBreakInfo)); - self::register("gilded_blackstone", new GildedBlackstone(new BID(Ids::GILDED_BLACKSTONE), "Gilded Blackstone", $blackstoneBreakInfo)); + self::register("gilded_blackstone", fn(BID $id) => new GildedBlackstone($id, "Gilded Blackstone", $blackstoneBreakInfo)); //TODO: polished blackstone ought to have 2.0 hardness (as per java) but it's 1.5 in Bedrock (probably parity bug) $prefix = fn(string $thing) => "Polished Blackstone" . ($thing !== "" ? " $thing" : ""); - self::register("polished_blackstone", new Opaque(new BID(Ids::POLISHED_BLACKSTONE), $prefix(""), $blackstoneBreakInfo)); - self::register("polished_blackstone_button", new StoneButton(new BID(Ids::POLISHED_BLACKSTONE_BUTTON), $prefix("Button"), new Info(BreakInfo::pickaxe(0.5)))); - self::register("polished_blackstone_pressure_plate", new StonePressurePlate(new BID(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE), $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)), 20)); - self::register("polished_blackstone_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_SLAB), $prefix(""), $slabBreakInfo)); - self::register("polished_blackstone_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); - self::register("polished_blackstone_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_WALL), $prefix("Wall"), $blackstoneBreakInfo)); - self::register("chiseled_polished_blackstone", new Opaque(new BID(Ids::CHISELED_POLISHED_BLACKSTONE), "Chiseled Polished Blackstone", $blackstoneBreakInfo)); + self::register("polished_blackstone", fn(BID $id) => new Opaque($id, $prefix(""), $blackstoneBreakInfo)); + self::register("polished_blackstone_button", fn(BID $id) => new StoneButton($id, $prefix("Button"), new Info(BreakInfo::pickaxe(0.5)))); + self::register("polished_blackstone_pressure_plate", fn(BID $id) => new StonePressurePlate($id, $prefix("Pressure Plate"), new Info(BreakInfo::pickaxe(0.5, ToolTier::WOOD)), 20)); + self::register("polished_blackstone_slab", fn(BID $id) => new Slab($id, $prefix(""), $slabBreakInfo)); + self::register("polished_blackstone_stairs", fn(BID $id) => new Stair($id, $prefix("Stairs"), $blackstoneBreakInfo)); + self::register("polished_blackstone_wall", fn(BID $id) => new Wall($id, $prefix("Wall"), $blackstoneBreakInfo)); + self::register("chiseled_polished_blackstone", fn(BID $id) => new Opaque($id, "Chiseled Polished Blackstone", $blackstoneBreakInfo)); $prefix = fn(string $thing) => "Polished Blackstone Brick" . ($thing !== "" ? " $thing" : ""); - self::register("polished_blackstone_bricks", new Opaque(new BID(Ids::POLISHED_BLACKSTONE_BRICKS), "Polished Blackstone Bricks", $blackstoneBreakInfo)); - self::register("polished_blackstone_brick_slab", new Slab(new BID(Ids::POLISHED_BLACKSTONE_BRICK_SLAB), "Polished Blackstone Brick", $slabBreakInfo)); - self::register("polished_blackstone_brick_stairs", new Stair(new BID(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS), $prefix("Stairs"), $blackstoneBreakInfo)); - self::register("polished_blackstone_brick_wall", new Wall(new BID(Ids::POLISHED_BLACKSTONE_BRICK_WALL), $prefix("Wall"), $blackstoneBreakInfo)); - self::register("cracked_polished_blackstone_bricks", new Opaque(new BID(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS), "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); + self::register("polished_blackstone_bricks", fn(BID $id) => new Opaque($id, "Polished Blackstone Bricks", $blackstoneBreakInfo)); + self::register("polished_blackstone_brick_slab", fn(BID $id) => new Slab($id, "Polished Blackstone Brick", $slabBreakInfo)); + self::register("polished_blackstone_brick_stairs", fn(BID $id) => new Stair($id, $prefix("Stairs"), $blackstoneBreakInfo)); + self::register("polished_blackstone_brick_wall", fn(BID $id) => new Wall($id, $prefix("Wall"), $blackstoneBreakInfo)); + self::register("cracked_polished_blackstone_bricks", fn(BID $id) => new Opaque($id, "Cracked Polished Blackstone Bricks", $blackstoneBreakInfo)); - self::register("soul_torch", new Torch(new BID(Ids::SOUL_TORCH), "Soul Torch", new Info(BreakInfo::instant()))); - self::register("soul_fire", new SoulFire(new BID(Ids::SOUL_FIRE), "Soul Fire", new Info(BreakInfo::instant(), [Tags::FIRE]))); + self::register("soul_torch", fn(BID $id) => new Torch($id, "Soul Torch", new Info(BreakInfo::instant()))); + self::register("soul_fire", fn(BID $id) => new SoulFire($id, "Soul Fire", new Info(BreakInfo::instant(), [Tags::FIRE]))); //TODO: soul soul ought to have 0.5 hardness (as per java) but it's 1.0 in Bedrock (probably parity bug) - self::register("soul_soil", new Opaque(new BID(Ids::SOUL_SOIL), "Soul Soil", new Info(BreakInfo::shovel(1.0)))); + self::register("soul_soil", fn(BID $id) => new Opaque($id, "Soul Soil", new Info(BreakInfo::shovel(1.0)))); - self::register("shroomlight", new class(new BID(Ids::SHROOMLIGHT), "Shroomlight", new Info(new BreakInfo(1.0, ToolType::HOE))) extends Opaque{ + self::register("shroomlight", fn(BID $id) => new class($id, "Shroomlight", new Info(new BreakInfo(1.0, ToolType::HOE))) extends Opaque{ public function getLightLevel() : int{ return 15; } }); - self::register("warped_wart_block", new Opaque(new BID(Ids::WARPED_WART_BLOCK), "Warped Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); - self::register("crying_obsidian", new class(new BID(Ids::CRYING_OBSIDIAN), "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND, 6000.0))) extends Opaque{ + self::register("warped_wart_block", fn(BID $id) => new Opaque($id, "Warped Wart Block", new Info(new BreakInfo(1.0, ToolType::HOE)))); + self::register("crying_obsidian", fn(BID $id) => new class($id, "Crying Obsidian", new Info(BreakInfo::pickaxe(35.0 /* 50 in Java */, ToolTier::DIAMOND, 6000.0))) extends Opaque{ public function getLightLevel() : int{ return 10;} }); - self::register("twisting_vines", new NetherVines(new BID(Ids::TWISTING_VINES), "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); - self::register("weeping_vines", new NetherVines(new BID(Ids::WEEPING_VINES), "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); + self::register("twisting_vines", fn(BID $id) => new NetherVines($id, "Twisting Vines", new Info(BreakInfo::instant()), Facing::UP)); + self::register("weeping_vines", fn(BID $id) => new NetherVines($id, "Weeping Vines", new Info(BreakInfo::instant()), Facing::DOWN)); $netherRootsInfo = new Info(BreakInfo::instant(), [Tags::POTTABLE_PLANTS]); - self::register("crimson_roots", new NetherRoots(new BID(Ids::CRIMSON_ROOTS), "Crimson Roots", $netherRootsInfo)); - self::register("warped_roots", new NetherRoots(new BID(Ids::WARPED_ROOTS), "Warped Roots", $netherRootsInfo)); + self::register("crimson_roots", fn(BID $id) => new NetherRoots($id, "Crimson Roots", $netherRootsInfo)); + self::register("warped_roots", fn(BID $id) => new NetherRoots($id, "Warped Roots", $netherRootsInfo)); - self::register("chain", new Chain(new BID(Ids::CHAIN), "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); + self::register("chain", fn(BID $id) => new Chain($id, "Chain", new Info(BreakInfo::pickaxe(5.0, ToolTier::WOOD)))); } private static function registerBlocksR17() : void{ //in java this can be acquired using any tool - seems to be a parity issue in bedrock $amethystInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD)); - self::register("amethyst", new class(new BID(Ids::AMETHYST), "Amethyst", $amethystInfo) extends Opaque{ + self::register("amethyst", fn(BID $id) => new class($id, "Amethyst", $amethystInfo) extends Opaque{ use AmethystTrait; }); - self::register("budding_amethyst", new BuddingAmethyst(new BID(Ids::BUDDING_AMETHYST), "Budding Amethyst", $amethystInfo)); - self::register("amethyst_cluster", new AmethystCluster(new BID(Ids::AMETHYST_CLUSTER), "Amethyst Cluster", $amethystInfo)); + self::register("budding_amethyst", fn(BID $id) => new BuddingAmethyst($id, "Budding Amethyst", $amethystInfo)); + self::register("amethyst_cluster", fn(BID $id) => new AmethystCluster($id, "Amethyst Cluster", $amethystInfo)); - self::register("calcite", new Opaque(new BID(Ids::CALCITE), "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD)))); + self::register("calcite", fn(BID $id) => new Opaque($id, "Calcite", new Info(BreakInfo::pickaxe(0.75, ToolTier::WOOD)))); - self::register("raw_copper", new Opaque(new BID(Ids::RAW_COPPER), "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); - self::register("raw_gold", new Opaque(new BID(Ids::RAW_GOLD), "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON, 30.0)))); - self::register("raw_iron", new Opaque(new BID(Ids::RAW_IRON), "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); + self::register("raw_copper", fn(BID $id) => new Opaque($id, "Raw Copper Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); + self::register("raw_gold", fn(BID $id) => new Opaque($id, "Raw Gold Block", new Info(BreakInfo::pickaxe(5, ToolTier::IRON, 30.0)))); + self::register("raw_iron", fn(BID $id) => new Opaque($id, "Raw Iron Block", new Info(BreakInfo::pickaxe(5, ToolTier::STONE, 30.0)))); $deepslateBreakInfo = new Info(BreakInfo::pickaxe(3, ToolTier::WOOD, 18.0)); - self::register("deepslate", new class(new BID(Ids::DEEPSLATE), "Deepslate", $deepslateBreakInfo) extends SimplePillar{ + self::register("deepslate", fn(BID $id) => new class($id, "Deepslate", $deepslateBreakInfo) extends SimplePillar{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLED_DEEPSLATE()->asItem()]; } @@ -1612,113 +1647,113 @@ final class VanillaBlocks{ }); //TODO: parity issue here - in Java this has a hardness of 3.0, but in bedrock it's 3.5 - self::register("chiseled_deepslate", new Opaque(new BID(Ids::CHISELED_DEEPSLATE), "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)))); + self::register("chiseled_deepslate", fn(BID $id) => new Opaque($id, "Chiseled Deepslate", new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)))); $deepslateBrickBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); - self::register("deepslate_bricks", new Opaque(new BID(Ids::DEEPSLATE_BRICKS), "Deepslate Bricks", $deepslateBrickBreakInfo)); - self::register("deepslate_brick_slab", new Slab(new BID(Ids::DEEPSLATE_BRICK_SLAB), "Deepslate Brick", $deepslateBrickBreakInfo)); - self::register("deepslate_brick_stairs", new Stair(new BID(Ids::DEEPSLATE_BRICK_STAIRS), "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); - self::register("deepslate_brick_wall", new Wall(new BID(Ids::DEEPSLATE_BRICK_WALL), "Deepslate Brick Wall", $deepslateBrickBreakInfo)); - self::register("cracked_deepslate_bricks", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_BRICKS), "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); + self::register("deepslate_bricks", fn(BID $id) => new Opaque($id, "Deepslate Bricks", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_slab", fn(BID $id) => new Slab($id, "Deepslate Brick", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_stairs", fn(BID $id) => new Stair($id, "Deepslate Brick Stairs", $deepslateBrickBreakInfo)); + self::register("deepslate_brick_wall", fn(BID $id) => new Wall($id, "Deepslate Brick Wall", $deepslateBrickBreakInfo)); + self::register("cracked_deepslate_bricks", fn(BID $id) => new Opaque($id, "Cracked Deepslate Bricks", $deepslateBrickBreakInfo)); $deepslateTilesBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); - self::register("deepslate_tiles", new Opaque(new BID(Ids::DEEPSLATE_TILES), "Deepslate Tiles", $deepslateTilesBreakInfo)); - self::register("deepslate_tile_slab", new Slab(new BID(Ids::DEEPSLATE_TILE_SLAB), "Deepslate Tile", $deepslateTilesBreakInfo)); - self::register("deepslate_tile_stairs", new Stair(new BID(Ids::DEEPSLATE_TILE_STAIRS), "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); - self::register("deepslate_tile_wall", new Wall(new BID(Ids::DEEPSLATE_TILE_WALL), "Deepslate Tile Wall", $deepslateTilesBreakInfo)); - self::register("cracked_deepslate_tiles", new Opaque(new BID(Ids::CRACKED_DEEPSLATE_TILES), "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); + self::register("deepslate_tiles", fn(BID $id) => new Opaque($id, "Deepslate Tiles", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_slab", fn(BID $id) => new Slab($id, "Deepslate Tile", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_stairs", fn(BID $id) => new Stair($id, "Deepslate Tile Stairs", $deepslateTilesBreakInfo)); + self::register("deepslate_tile_wall", fn(BID $id) => new Wall($id, "Deepslate Tile Wall", $deepslateTilesBreakInfo)); + self::register("cracked_deepslate_tiles", fn(BID $id) => new Opaque($id, "Cracked Deepslate Tiles", $deepslateTilesBreakInfo)); $cobbledDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); - self::register("cobbled_deepslate", new Opaque(new BID(Ids::COBBLED_DEEPSLATE), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); - self::register("cobbled_deepslate_slab", new Slab(new BID(Ids::COBBLED_DEEPSLATE_SLAB), "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); - self::register("cobbled_deepslate_stairs", new Stair(new BID(Ids::COBBLED_DEEPSLATE_STAIRS), "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); - self::register("cobbled_deepslate_wall", new Wall(new BID(Ids::COBBLED_DEEPSLATE_WALL), "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate", fn(BID $id) => new Opaque($id, "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_slab", fn(BID $id) => new Slab($id, "Cobbled Deepslate", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_stairs", fn(BID $id) => new Stair($id, "Cobbled Deepslate Stairs", $cobbledDeepslateBreakInfo)); + self::register("cobbled_deepslate_wall", fn(BID $id) => new Wall($id, "Cobbled Deepslate Wall", $cobbledDeepslateBreakInfo)); $polishedDeepslateBreakInfo = new Info(BreakInfo::pickaxe(3.5, ToolTier::WOOD, 18.0)); - self::register("polished_deepslate", new Opaque(new BID(Ids::POLISHED_DEEPSLATE), "Polished Deepslate", $polishedDeepslateBreakInfo)); - self::register("polished_deepslate_slab", new Slab(new BID(Ids::POLISHED_DEEPSLATE_SLAB), "Polished Deepslate", $polishedDeepslateBreakInfo)); - self::register("polished_deepslate_stairs", new Stair(new BID(Ids::POLISHED_DEEPSLATE_STAIRS), "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); - self::register("polished_deepslate_wall", new Wall(new BID(Ids::POLISHED_DEEPSLATE_WALL), "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate", fn(BID $id) => new Opaque($id, "Polished Deepslate", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_slab", fn(BID $id) => new Slab($id, "Polished Deepslate", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_stairs", fn(BID $id) => new Stair($id, "Polished Deepslate Stairs", $polishedDeepslateBreakInfo)); + self::register("polished_deepslate_wall", fn(BID $id) => new Wall($id, "Polished Deepslate Wall", $polishedDeepslateBreakInfo)); - self::register("tinted_glass", new TintedGlass(new BID(Ids::TINTED_GLASS), "Tinted Glass", new Info(new BreakInfo(0.3)))); + self::register("tinted_glass", fn(BID $id) => new TintedGlass($id, "Tinted Glass", new Info(new BreakInfo(0.3)))); //blast resistance should be 30 if we were matched with java :( $copperBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE, 18.0)); - self::register("lightning_rod", new LightningRod(new BID(Ids::LIGHTNING_ROD), "Lightning Rod", $copperBreakInfo)); + self::register("lightning_rod", fn(BID $id) => new LightningRod($id, "Lightning Rod", $copperBreakInfo)); - self::register("copper", new Copper(new BID(Ids::COPPER), "Copper Block", $copperBreakInfo)); - self::register("chiseled_copper", new Copper(new BID(Ids::CHISELED_COPPER), "Chiseled Copper", $copperBreakInfo)); - self::register("copper_grate", new CopperGrate(new BID(Ids::COPPER_GRATE), "Copper Grate", $copperBreakInfo)); - self::register("cut_copper", new Copper(new BID(Ids::CUT_COPPER), "Cut Copper Block", $copperBreakInfo)); - self::register("cut_copper_slab", new CopperSlab(new BID(Ids::CUT_COPPER_SLAB), "Cut Copper Slab", $copperBreakInfo)); - self::register("cut_copper_stairs", new CopperStairs(new BID(Ids::CUT_COPPER_STAIRS), "Cut Copper Stairs", $copperBreakInfo)); - self::register("copper_bulb", new CopperBulb(new BID(Ids::COPPER_BULB), "Copper Bulb", $copperBreakInfo)); + self::register("copper", fn(BID $id) => new Copper($id, "Copper Block", $copperBreakInfo)); + self::register("chiseled_copper", fn(BID $id) => new Copper($id, "Chiseled Copper", $copperBreakInfo)); + self::register("copper_grate", fn(BID $id) => new CopperGrate($id, "Copper Grate", $copperBreakInfo)); + self::register("cut_copper", fn(BID $id) => new Copper($id, "Cut Copper Block", $copperBreakInfo)); + self::register("cut_copper_slab", fn(BID $id) => new CopperSlab($id, "Cut Copper Slab", $copperBreakInfo)); + self::register("cut_copper_stairs", fn(BID $id) => new CopperStairs($id, "Cut Copper Stairs", $copperBreakInfo)); + self::register("copper_bulb", fn(BID $id) => new CopperBulb($id, "Copper Bulb", $copperBreakInfo)); $copperDoorBreakInfo = new Info(BreakInfo::pickaxe(3.0, ToolTier::STONE, 30.0)); - self::register("copper_door", new CopperDoor(new BID(Ids::COPPER_DOOR), "Copper Door", $copperDoorBreakInfo)); - self::register("copper_trapdoor", new CopperTrapdoor(new BID(Ids::COPPER_TRAPDOOR), "Copper Trapdoor", $copperDoorBreakInfo)); + self::register("copper_door", fn(BID $id) => new CopperDoor($id, "Copper Door", $copperDoorBreakInfo)); + self::register("copper_trapdoor", fn(BID $id) => new CopperTrapdoor($id, "Copper Trapdoor", $copperDoorBreakInfo)); $candleBreakInfo = new Info(new BreakInfo(0.1)); - self::register("candle", new Candle(new BID(Ids::CANDLE), "Candle", $candleBreakInfo)); - self::register("dyed_candle", new DyedCandle(new BID(Ids::DYED_CANDLE), "Dyed Candle", $candleBreakInfo)); + self::register("candle", fn(BID $id) => new Candle($id, "Candle", $candleBreakInfo)); + self::register("dyed_candle", fn(BID $id) => new DyedCandle($id, "Dyed Candle", $candleBreakInfo)); //TODO: duplicated break info :( $cakeBreakInfo = new Info(new BreakInfo(0.5)); - self::register("cake_with_candle", new CakeWithCandle(new BID(Ids::CAKE_WITH_CANDLE), "Cake With Candle", $cakeBreakInfo)); - self::register("cake_with_dyed_candle", new CakeWithDyedCandle(new BID(Ids::CAKE_WITH_DYED_CANDLE), "Cake With Dyed Candle", $cakeBreakInfo)); + self::register("cake_with_candle", fn(BID $id) => new CakeWithCandle($id, "Cake With Candle", $cakeBreakInfo)); + self::register("cake_with_dyed_candle", fn(BID $id) => new CakeWithDyedCandle($id, "Cake With Dyed Candle", $cakeBreakInfo)); - self::register("hanging_roots", new HangingRoots(new BID(Ids::HANGING_ROOTS), "Hanging Roots", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); + self::register("hanging_roots", fn(BID $id) => new HangingRoots($id, "Hanging Roots", new Info(BreakInfo::instant(ToolType::SHEARS, 1)))); - self::register("cave_vines", new CaveVines(new BID(Ids::CAVE_VINES), "Cave Vines", new Info(BreakInfo::instant()))); + self::register("cave_vines", fn(BID $id) => new CaveVines($id, "Cave Vines", new Info(BreakInfo::instant()))); - self::register("small_dripleaf", new SmallDripleaf(new BID(Ids::SMALL_DRIPLEAF), "Small Dripleaf", new Info(BreakInfo::instant(ToolType::SHEARS, toolHarvestLevel: 1)))); - self::register("big_dripleaf_head", new BigDripleafHead(new BID(Ids::BIG_DRIPLEAF_HEAD), "Big Dripleaf", new Info(BreakInfo::instant()))); - self::register("big_dripleaf_stem", new BigDripleafStem(new BID(Ids::BIG_DRIPLEAF_STEM), "Big Dripleaf Stem", new Info(BreakInfo::instant()))); + self::register("small_dripleaf", fn(BID $id) => new SmallDripleaf($id, "Small Dripleaf", new Info(BreakInfo::instant(ToolType::SHEARS, toolHarvestLevel: 1)))); + self::register("big_dripleaf_head", fn(BID $id) => new BigDripleafHead($id, "Big Dripleaf", new Info(BreakInfo::instant()))); + self::register("big_dripleaf_stem", fn(BID $id) => new BigDripleafStem($id, "Big Dripleaf Stem", new Info(BreakInfo::instant()))); } private static function registerBlocksR18() : void{ - self::register("spore_blossom", new SporeBlossom(new BID(Ids::SPORE_BLOSSOM), "Spore Blossom", new Info(BreakInfo::instant()))); + self::register("spore_blossom", fn(BID $id) => new SporeBlossom($id, "Spore Blossom", new Info(BreakInfo::instant()))); } private static function registerMudBlocks() : void{ - self::register("mud", new Opaque(new BID(Ids::MUD), "Mud", new Info(BreakInfo::shovel(0.5), [Tags::MUD]))); - self::register("packed_mud", new Opaque(new BID(Ids::PACKED_MUD), "Packed Mud", new Info(BreakInfo::pickaxe(1.0, null, 15.0)))); + self::register("mud", fn(BID $id) => new Opaque($id, "Mud", new Info(BreakInfo::shovel(0.5), [Tags::MUD]))); + self::register("packed_mud", fn(BID $id) => new Opaque($id, "Packed Mud", new Info(BreakInfo::pickaxe(1.0, null, 15.0)))); $mudBricksBreakInfo = new Info(BreakInfo::pickaxe(2.0, ToolTier::WOOD, 30.0)); - self::register("mud_bricks", new Opaque(new BID(Ids::MUD_BRICKS), "Mud Bricks", $mudBricksBreakInfo)); - self::register("mud_brick_slab", new Slab(new BID(Ids::MUD_BRICK_SLAB), "Mud Brick", $mudBricksBreakInfo)); - self::register("mud_brick_stairs", new Stair(new BID(Ids::MUD_BRICK_STAIRS), "Mud Brick Stairs", $mudBricksBreakInfo)); - self::register("mud_brick_wall", new Wall(new BID(Ids::MUD_BRICK_WALL), "Mud Brick Wall", $mudBricksBreakInfo)); + self::register("mud_bricks", fn(BID $id) => new Opaque($id, "Mud Bricks", $mudBricksBreakInfo)); + self::register("mud_brick_slab", fn(BID $id) => new Slab($id, "Mud Brick", $mudBricksBreakInfo)); + self::register("mud_brick_stairs", fn(BID $id) => new Stair($id, "Mud Brick Stairs", $mudBricksBreakInfo)); + self::register("mud_brick_wall", fn(BID $id) => new Wall($id, "Mud Brick Wall", $mudBricksBreakInfo)); } private static function registerTuffBlocks() : void{ $tuffBreakInfo = new Info(BreakInfo::pickaxe(1.5, ToolTier::WOOD, 30.0)); - self::register("tuff", new Opaque(new BID(Ids::TUFF), "Tuff", $tuffBreakInfo)); - self::register("tuff_slab", new Slab(new BID(Ids::TUFF_SLAB), "Tuff", $tuffBreakInfo)); - self::register("tuff_stairs", new Stair(new BID(Ids::TUFF_STAIRS), "Tuff Stairs", $tuffBreakInfo)); - self::register("tuff_wall", new Wall(new BID(Ids::TUFF_WALL), "Tuff Wall", $tuffBreakInfo)); - self::register("chiseled_tuff", new Opaque(new BID(Ids::CHISELED_TUFF), "Chiseled Tuff", $tuffBreakInfo)); + self::register("tuff", fn(BID $id) => new Opaque($id, "Tuff", $tuffBreakInfo)); + self::register("tuff_slab", fn(BID $id) => new Slab($id, "Tuff", $tuffBreakInfo)); + self::register("tuff_stairs", fn(BID $id) => new Stair($id, "Tuff Stairs", $tuffBreakInfo)); + self::register("tuff_wall", fn(BID $id) => new Wall($id, "Tuff Wall", $tuffBreakInfo)); + self::register("chiseled_tuff", fn(BID $id) => new Opaque($id, "Chiseled Tuff", $tuffBreakInfo)); - self::register("tuff_bricks", new Opaque(new BID(Ids::TUFF_BRICKS), "Tuff Bricks", $tuffBreakInfo)); - self::register("tuff_brick_slab", new Slab(new BID(Ids::TUFF_BRICK_SLAB), "Tuff Brick", $tuffBreakInfo)); - self::register("tuff_brick_stairs", new Stair(new BID(Ids::TUFF_BRICK_STAIRS), "Tuff Brick Stairs", $tuffBreakInfo)); - self::register("tuff_brick_wall", new Wall(new BID(Ids::TUFF_BRICK_WALL), "Tuff Brick Wall", $tuffBreakInfo)); - self::register("chiseled_tuff_bricks", new Opaque(new BID(Ids::CHISELED_TUFF_BRICKS), "Chiseled Tuff Bricks", $tuffBreakInfo)); + self::register("tuff_bricks", fn(BID $id) => new Opaque($id, "Tuff Bricks", $tuffBreakInfo)); + self::register("tuff_brick_slab", fn(BID $id) => new Slab($id, "Tuff Brick", $tuffBreakInfo)); + self::register("tuff_brick_stairs", fn(BID $id) => new Stair($id, "Tuff Brick Stairs", $tuffBreakInfo)); + self::register("tuff_brick_wall", fn(BID $id) => new Wall($id, "Tuff Brick Wall", $tuffBreakInfo)); + self::register("chiseled_tuff_bricks", fn(BID $id) => new Opaque($id, "Chiseled Tuff Bricks", $tuffBreakInfo)); - self::register("polished_tuff", new Opaque(new BID(Ids::POLISHED_TUFF), "Polished Tuff", $tuffBreakInfo)); - self::register("polished_tuff_slab", new Slab(new BID(Ids::POLISHED_TUFF_SLAB), "Polished Tuff", $tuffBreakInfo)); - self::register("polished_tuff_stairs", new Stair(new BID(Ids::POLISHED_TUFF_STAIRS), "Polished Tuff Stairs", $tuffBreakInfo)); - self::register("polished_tuff_wall", new Wall(new BID(Ids::POLISHED_TUFF_WALL), "Polished Tuff Wall", $tuffBreakInfo)); + self::register("polished_tuff", fn(BID $id) => new Opaque($id, "Polished Tuff", $tuffBreakInfo)); + self::register("polished_tuff_slab", fn(BID $id) => new Slab($id, "Polished Tuff", $tuffBreakInfo)); + self::register("polished_tuff_stairs", fn(BID $id) => new Stair($id, "Polished Tuff Stairs", $tuffBreakInfo)); + self::register("polished_tuff_wall", fn(BID $id) => new Wall($id, "Polished Tuff Wall", $tuffBreakInfo)); } private static function registerCauldronBlocks() : void{ $cauldronBreakInfo = new Info(BreakInfo::pickaxe(2, ToolTier::WOOD)); - self::register("cauldron", new Cauldron(new BID(Ids::CAULDRON, TileCauldron::class), "Cauldron", $cauldronBreakInfo)); - self::register("water_cauldron", new WaterCauldron(new BID(Ids::WATER_CAULDRON, TileCauldron::class), "Water Cauldron", $cauldronBreakInfo)); - self::register("lava_cauldron", new LavaCauldron(new BID(Ids::LAVA_CAULDRON, TileCauldron::class), "Lava Cauldron", $cauldronBreakInfo)); - self::register("potion_cauldron", new PotionCauldron(new BID(Ids::POTION_CAULDRON, TileCauldron::class), "Potion Cauldron", $cauldronBreakInfo)); + self::register("cauldron", fn(BID $id) => new Cauldron($id, "Cauldron", $cauldronBreakInfo), TileCauldron::class); + self::register("water_cauldron", fn(BID $id) => new WaterCauldron($id, "Water Cauldron", $cauldronBreakInfo), TileCauldron::class); + self::register("lava_cauldron", fn(BID $id) => new LavaCauldron($id, "Lava Cauldron", $cauldronBreakInfo), TileCauldron::class); + self::register("potion_cauldron", fn(BID $id) => new PotionCauldron($id, "Potion Cauldron", $cauldronBreakInfo), TileCauldron::class); } } diff --git a/src/block/WoodLikeBlockIdHelper.php b/src/block/WoodLikeBlockIdHelper.php deleted file mode 100644 index 88fdff3a6e..0000000000 --- a/src/block/WoodLikeBlockIdHelper.php +++ /dev/null @@ -1,263 +0,0 @@ - Ids::OAK_PLANKS, - WoodType::SPRUCE => Ids::SPRUCE_PLANKS, - WoodType::BIRCH => Ids::BIRCH_PLANKS, - WoodType::JUNGLE => Ids::JUNGLE_PLANKS, - WoodType::ACACIA => Ids::ACACIA_PLANKS, - WoodType::DARK_OAK => Ids::DARK_OAK_PLANKS, - WoodType::MANGROVE => Ids::MANGROVE_PLANKS, - WoodType::CRIMSON => Ids::CRIMSON_PLANKS, - WoodType::WARPED => Ids::WARPED_PLANKS, - WoodType::CHERRY => Ids::CHERRY_PLANKS, - }); - } - - public static function getFenceIdentifier(WoodType $type) : BID{ - return new BID(match($type){ - WoodType::OAK => Ids::OAK_FENCE, - WoodType::SPRUCE => Ids::SPRUCE_FENCE, - WoodType::BIRCH => Ids::BIRCH_FENCE, - WoodType::JUNGLE => Ids::JUNGLE_FENCE, - WoodType::ACACIA => Ids::ACACIA_FENCE, - WoodType::DARK_OAK => Ids::DARK_OAK_FENCE, - WoodType::MANGROVE => Ids::MANGROVE_FENCE, - WoodType::CRIMSON => Ids::CRIMSON_FENCE, - WoodType::WARPED => Ids::WARPED_FENCE, - WoodType::CHERRY => Ids::CHERRY_FENCE, - }); - } - - public static function getSlabIdentifier(WoodType $type) : BID{ - return new BID(match($type){ - WoodType::OAK => Ids::OAK_SLAB, - WoodType::SPRUCE => Ids::SPRUCE_SLAB, - WoodType::BIRCH => Ids::BIRCH_SLAB, - WoodType::JUNGLE => Ids::JUNGLE_SLAB, - WoodType::ACACIA => Ids::ACACIA_SLAB, - WoodType::DARK_OAK => Ids::DARK_OAK_SLAB, - WoodType::MANGROVE => Ids::MANGROVE_SLAB, - WoodType::CRIMSON => Ids::CRIMSON_SLAB, - WoodType::WARPED => Ids::WARPED_SLAB, - WoodType::CHERRY => Ids::CHERRY_SLAB, - }); - } - - public static function getLogIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_LOG, - WoodType::SPRUCE => Ids::SPRUCE_LOG, - WoodType::BIRCH => Ids::BIRCH_LOG, - WoodType::JUNGLE => Ids::JUNGLE_LOG, - WoodType::ACACIA => Ids::ACACIA_LOG, - WoodType::DARK_OAK => Ids::DARK_OAK_LOG, - WoodType::MANGROVE => Ids::MANGROVE_LOG, - WoodType::CRIMSON => Ids::CRIMSON_STEM, - WoodType::WARPED => Ids::WARPED_STEM, - WoodType::CHERRY => Ids::CHERRY_LOG, - }); - } - - public static function getAllSidedLogIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_WOOD, - WoodType::SPRUCE => Ids::SPRUCE_WOOD, - WoodType::BIRCH => Ids::BIRCH_WOOD, - WoodType::JUNGLE => Ids::JUNGLE_WOOD, - WoodType::ACACIA => Ids::ACACIA_WOOD, - WoodType::DARK_OAK => Ids::DARK_OAK_WOOD, - WoodType::MANGROVE => Ids::MANGROVE_WOOD, - WoodType::CRIMSON => Ids::CRIMSON_HYPHAE, - WoodType::WARPED => Ids::WARPED_HYPHAE, - WoodType::CHERRY => Ids::CHERRY_WOOD, - }); - } - - public static function getLeavesIdentifier(LeavesType $leavesType) : BID{ - return new BID(match($leavesType){ - LeavesType::OAK => Ids::OAK_LEAVES, - LeavesType::SPRUCE => Ids::SPRUCE_LEAVES, - LeavesType::BIRCH => Ids::BIRCH_LEAVES, - LeavesType::JUNGLE => Ids::JUNGLE_LEAVES, - LeavesType::ACACIA => Ids::ACACIA_LEAVES, - LeavesType::DARK_OAK => Ids::DARK_OAK_LEAVES, - LeavesType::MANGROVE => Ids::MANGROVE_LEAVES, - LeavesType::AZALEA => Ids::AZALEA_LEAVES, - LeavesType::FLOWERING_AZALEA => Ids::FLOWERING_AZALEA_LEAVES, - LeavesType::CHERRY => Ids::CHERRY_LEAVES, - }); - } - - public static function getSaplingIdentifier(SaplingType $treeType) : BID{ - return new BID(match($treeType){ - SaplingType::OAK => Ids::OAK_SAPLING, - SaplingType::SPRUCE => Ids::SPRUCE_SAPLING, - SaplingType::BIRCH => Ids::BIRCH_SAPLING, - SaplingType::JUNGLE => Ids::JUNGLE_SAPLING, - SaplingType::ACACIA => Ids::ACACIA_SAPLING, - SaplingType::DARK_OAK => Ids::DARK_OAK_SAPLING, - }); - } - - /** - * @return BID[]|\Closure[] - * @phpstan-return array{BID, BID, \Closure() : \pocketmine\item\Item} - */ - public static function getSignInfo(WoodType $treeType) : array{ - $make = fn(int $floorId, int $wallId, \Closure $getItem) => [ - new BID($floorId, TileSign::class), - new BID($wallId, TileSign::class), - $getItem - ]; - return match($treeType){ - WoodType::OAK => $make(Ids::OAK_SIGN, Ids::OAK_WALL_SIGN, fn() => VanillaItems::OAK_SIGN()), - WoodType::SPRUCE => $make(Ids::SPRUCE_SIGN, Ids::SPRUCE_WALL_SIGN, fn() => VanillaItems::SPRUCE_SIGN()), - WoodType::BIRCH => $make(Ids::BIRCH_SIGN, Ids::BIRCH_WALL_SIGN, fn() => VanillaItems::BIRCH_SIGN()), - WoodType::JUNGLE => $make(Ids::JUNGLE_SIGN, Ids::JUNGLE_WALL_SIGN, fn() => VanillaItems::JUNGLE_SIGN()), - WoodType::ACACIA => $make(Ids::ACACIA_SIGN, Ids::ACACIA_WALL_SIGN, fn() => VanillaItems::ACACIA_SIGN()), - WoodType::DARK_OAK => $make(Ids::DARK_OAK_SIGN, Ids::DARK_OAK_WALL_SIGN, fn() => VanillaItems::DARK_OAK_SIGN()), - WoodType::MANGROVE => $make(Ids::MANGROVE_SIGN, Ids::MANGROVE_WALL_SIGN, fn() => VanillaItems::MANGROVE_SIGN()), - WoodType::CRIMSON => $make(Ids::CRIMSON_SIGN, Ids::CRIMSON_WALL_SIGN, fn() => VanillaItems::CRIMSON_SIGN()), - WoodType::WARPED => $make(Ids::WARPED_SIGN, Ids::WARPED_WALL_SIGN, fn() => VanillaItems::WARPED_SIGN()), - WoodType::CHERRY => $make(Ids::CHERRY_SIGN, Ids::CHERRY_WALL_SIGN, fn() => VanillaItems::CHERRY_SIGN()), - }; - } - - public static function getTrapdoorIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_TRAPDOOR, - WoodType::SPRUCE => Ids::SPRUCE_TRAPDOOR, - WoodType::BIRCH => Ids::BIRCH_TRAPDOOR, - WoodType::JUNGLE => Ids::JUNGLE_TRAPDOOR, - WoodType::ACACIA => Ids::ACACIA_TRAPDOOR, - WoodType::DARK_OAK => Ids::DARK_OAK_TRAPDOOR, - WoodType::MANGROVE => Ids::MANGROVE_TRAPDOOR, - WoodType::CRIMSON => Ids::CRIMSON_TRAPDOOR, - WoodType::WARPED => Ids::WARPED_TRAPDOOR, - WoodType::CHERRY => Ids::CHERRY_TRAPDOOR, - }); - } - - public static function getButtonIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_BUTTON, - WoodType::SPRUCE => Ids::SPRUCE_BUTTON, - WoodType::BIRCH => Ids::BIRCH_BUTTON, - WoodType::JUNGLE => Ids::JUNGLE_BUTTON, - WoodType::ACACIA => Ids::ACACIA_BUTTON, - WoodType::DARK_OAK => Ids::DARK_OAK_BUTTON, - WoodType::MANGROVE => Ids::MANGROVE_BUTTON, - WoodType::CRIMSON => Ids::CRIMSON_BUTTON, - WoodType::WARPED => Ids::WARPED_BUTTON, - WoodType::CHERRY => Ids::CHERRY_BUTTON, - }); - } - - public static function getPressurePlateIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_PRESSURE_PLATE, - WoodType::SPRUCE => Ids::SPRUCE_PRESSURE_PLATE, - WoodType::BIRCH => Ids::BIRCH_PRESSURE_PLATE, - WoodType::JUNGLE => Ids::JUNGLE_PRESSURE_PLATE, - WoodType::ACACIA => Ids::ACACIA_PRESSURE_PLATE, - WoodType::DARK_OAK => Ids::DARK_OAK_PRESSURE_PLATE, - WoodType::MANGROVE => Ids::MANGROVE_PRESSURE_PLATE, - WoodType::CRIMSON => Ids::CRIMSON_PRESSURE_PLATE, - WoodType::WARPED => Ids::WARPED_PRESSURE_PLATE, - WoodType::CHERRY => Ids::CHERRY_PRESSURE_PLATE, - }); - } - - public static function getDoorIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_DOOR, - WoodType::SPRUCE => Ids::SPRUCE_DOOR, - WoodType::BIRCH => Ids::BIRCH_DOOR, - WoodType::JUNGLE => Ids::JUNGLE_DOOR, - WoodType::ACACIA => Ids::ACACIA_DOOR, - WoodType::DARK_OAK => Ids::DARK_OAK_DOOR, - WoodType::MANGROVE => Ids::MANGROVE_DOOR, - WoodType::CRIMSON => Ids::CRIMSON_DOOR, - WoodType::WARPED => Ids::WARPED_DOOR, - WoodType::CHERRY => Ids::CHERRY_DOOR, - }); - } - - public static function getFenceGateIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_FENCE_GATE, - WoodType::SPRUCE => Ids::SPRUCE_FENCE_GATE, - WoodType::BIRCH => Ids::BIRCH_FENCE_GATE, - WoodType::JUNGLE => Ids::JUNGLE_FENCE_GATE, - WoodType::ACACIA => Ids::ACACIA_FENCE_GATE, - WoodType::DARK_OAK => Ids::DARK_OAK_FENCE_GATE, - WoodType::MANGROVE => Ids::MANGROVE_FENCE_GATE, - WoodType::CRIMSON => Ids::CRIMSON_FENCE_GATE, - WoodType::WARPED => Ids::WARPED_FENCE_GATE, - WoodType::CHERRY => Ids::CHERRY_FENCE_GATE, - }); - } - - public static function getStairsIdentifier(WoodType $treeType) : BID{ - return new BID(match($treeType){ - WoodType::OAK => Ids::OAK_STAIRS, - WoodType::SPRUCE => Ids::SPRUCE_STAIRS, - WoodType::BIRCH => Ids::BIRCH_STAIRS, - WoodType::JUNGLE => Ids::JUNGLE_STAIRS, - WoodType::ACACIA => Ids::ACACIA_STAIRS, - WoodType::DARK_OAK => Ids::DARK_OAK_STAIRS, - WoodType::MANGROVE => Ids::MANGROVE_STAIRS, - WoodType::CRIMSON => Ids::CRIMSON_STAIRS, - WoodType::WARPED => Ids::WARPED_STAIRS, - WoodType::CHERRY => Ids::CHERRY_STAIRS, - }); - } -} diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index c5ab594479..a3366b85e6 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -33,11 +33,12 @@ use pocketmine\entity\Zombie; use pocketmine\inventory\ArmorInventory; use pocketmine\item\enchantment\ItemEnchantmentTags as EnchantmentTags; use pocketmine\item\ItemIdentifier as IID; -use pocketmine\item\ItemTypeIds as Ids; use pocketmine\item\VanillaArmorMaterials as ArmorMaterials; use pocketmine\math\Vector3; use pocketmine\utils\CloningRegistryTrait; use pocketmine\world\World; +use function is_int; +use function mb_strtoupper; use function strtolower; /** @@ -340,8 +341,29 @@ final class VanillaItems{ //NOOP } - protected static function register(string $name, Item $item) : void{ + /** + * @phpstan-template TItem of Item + * @phpstan-param \Closure(IID) : TItem $createItem + * @phpstan-return TItem + */ + protected static function register(string $name, \Closure $createItem) : Item{ + //this sketchy hack allows us to avoid manually writing the constants inline + //since type IDs are generated from this class anyway, I'm OK with this hack + //nonetheless, we should try to get rid of it in a future major version (e.g by using string type IDs) + $reflect = new \ReflectionClass(ItemTypeIds::class); + $typeId = $reflect->getConstant(mb_strtoupper($name)); + if(!is_int($typeId)){ + //this allows registering new stuff without adding new type ID constants + //this reduces the number of mandatory steps to test new features in local development + \GlobalLogger::get()->error(self::class . ": No constant type ID found for $name, generating a new one"); + $typeId = ItemTypeIds::newId(); + } + + $item = $createItem(new IID($typeId)); + self::_registryRegister($name, $item); + + return $item; } /** @@ -361,243 +383,237 @@ final class VanillaItems{ self::registerTierToolItems(); self::registerSmithingTemplates(); - self::register("air", Blocks::AIR()->asItem()->setCount(0)); + //this doesn't use the regular register() because it doesn't have an item typeID + //in the future we'll probably want to dissociate this from the air block and make a proper null item + self::_registryRegister("air", Blocks::AIR()->asItem()->setCount(0)); - self::register("acacia_sign", new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - self::register("amethyst_shard", new Item(new IID(Ids::AMETHYST_SHARD), "Amethyst Shard")); - self::register("apple", new Apple(new IID(Ids::APPLE), "Apple")); - self::register("arrow", new Arrow(new IID(Ids::ARROW), "Arrow")); - self::register("baked_potato", new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); - self::register("bamboo", new Bamboo(new IID(Ids::BAMBOO), "Bamboo")); - self::register("banner", new Banner(new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER())); - self::register("beetroot", new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); - self::register("beetroot_seeds", new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); - self::register("beetroot_soup", new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); - self::register("birch_sign", new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - self::register("blaze_powder", new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); - self::register("blaze_rod", new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); - self::register("bleach", new Item(new IID(Ids::BLEACH), "Bleach")); - self::register("bone", new Item(new IID(Ids::BONE), "Bone")); - self::register("bone_meal", new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); - self::register("book", new Book(new IID(Ids::BOOK), "Book", [EnchantmentTags::ALL])); - self::register("bow", new Bow(new IID(Ids::BOW), "Bow", [EnchantmentTags::BOW])); - self::register("bowl", new Bowl(new IID(Ids::BOWL), "Bowl")); - self::register("bread", new Bread(new IID(Ids::BREAD), "Bread")); - self::register("brick", new Item(new IID(Ids::BRICK), "Brick")); - self::register("bucket", new Bucket(new IID(Ids::BUCKET), "Bucket")); - self::register("carrot", new Carrot(new IID(Ids::CARROT), "Carrot")); - self::register("charcoal", new Coal(new IID(Ids::CHARCOAL), "Charcoal")); - self::register("cherry_sign", new ItemBlockWallOrFloor(new IID(Ids::CHERRY_SIGN), Blocks::CHERRY_SIGN(), Blocks::CHERRY_WALL_SIGN())); - self::register("chemical_aluminium_oxide", new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); - self::register("chemical_ammonia", new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); - self::register("chemical_barium_sulphate", new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); - self::register("chemical_benzene", new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); - self::register("chemical_boron_trioxide", new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); - self::register("chemical_calcium_bromide", new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); - self::register("chemical_calcium_chloride", new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); - self::register("chemical_cerium_chloride", new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); - self::register("chemical_charcoal", new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); - self::register("chemical_crude_oil", new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); - self::register("chemical_glue", new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); - self::register("chemical_hydrogen_peroxide", new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - self::register("chemical_hypochlorite", new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); - self::register("chemical_ink", new Item(new IID(Ids::CHEMICAL_INK), "Ink")); - self::register("chemical_iron_sulphide", new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); - self::register("chemical_latex", new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); - self::register("chemical_lithium_hydride", new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); - self::register("chemical_luminol", new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); - self::register("chemical_magnesium_nitrate", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); - self::register("chemical_magnesium_oxide", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); - self::register("chemical_magnesium_salts", new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); - self::register("chemical_mercuric_chloride", new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); - self::register("chemical_polyethylene", new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); - self::register("chemical_potassium_chloride", new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); - self::register("chemical_potassium_iodide", new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); - self::register("chemical_rubbish", new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); - self::register("chemical_salt", new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); - self::register("chemical_soap", new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); - self::register("chemical_sodium_acetate", new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); - self::register("chemical_sodium_fluoride", new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); - self::register("chemical_sodium_hydride", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); - self::register("chemical_sodium_hydroxide", new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); - self::register("chemical_sodium_hypochlorite", new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); - self::register("chemical_sodium_oxide", new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); - self::register("chemical_sugar", new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); - self::register("chemical_sulphate", new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); - self::register("chemical_tungsten_chloride", new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - self::register("chemical_water", new Item(new IID(Ids::CHEMICAL_WATER), "Water")); - self::register("chorus_fruit", new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); - self::register("clay", new Item(new IID(Ids::CLAY), "Clay")); - self::register("clock", new Clock(new IID(Ids::CLOCK), "Clock")); - self::register("clownfish", new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); - self::register("coal", new Coal(new IID(Ids::COAL), "Coal")); - self::register("cocoa_beans", new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); - self::register("compass", new Compass(new IID(Ids::COMPASS), "Compass", [EnchantmentTags::COMPASS])); - self::register("cooked_chicken", new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); - self::register("cooked_fish", new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); - self::register("cooked_mutton", new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); - self::register("cooked_porkchop", new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP), "Cooked Porkchop")); - self::register("cooked_rabbit", new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); - self::register("cooked_salmon", new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); - self::register("cookie", new Cookie(new IID(Ids::COOKIE), "Cookie")); - self::register("copper_ingot", new Item(new IID(Ids::COPPER_INGOT), "Copper Ingot")); - self::register("coral_fan", new CoralFan(new IID(Ids::CORAL_FAN))); - self::register("crimson_sign", new ItemBlockWallOrFloor(new IID(Ids::CRIMSON_SIGN), Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); - self::register("dark_oak_sign", new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - self::register("diamond", new Item(new IID(Ids::DIAMOND), "Diamond")); - self::register("disc_fragment_5", new Item(new IID(Ids::DISC_FRAGMENT_5), "Disc Fragment (5)")); - self::register("dragon_breath", new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); - self::register("dried_kelp", new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); + self::register("acacia_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + self::register("amethyst_shard", fn(IID $id) => new Item($id, "Amethyst Shard")); + self::register("apple", fn(IID $id) => new Apple($id, "Apple")); + self::register("arrow", fn(IID $id) => new Arrow($id, "Arrow")); + self::register("baked_potato", fn(IID $id) => new BakedPotato($id, "Baked Potato")); + self::register("bamboo", fn(IID $id) => new Bamboo($id, "Bamboo")); + self::register("banner", fn(IID $id) => new Banner($id, Blocks::BANNER(), Blocks::WALL_BANNER())); + self::register("beetroot", fn(IID $id) => new Beetroot($id, "Beetroot")); + self::register("beetroot_seeds", fn(IID $id) => new BeetrootSeeds($id, "Beetroot Seeds")); + self::register("beetroot_soup", fn(IID $id) => new BeetrootSoup($id, "Beetroot Soup")); + self::register("birch_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + self::register("blaze_powder", fn(IID $id) => new Item($id, "Blaze Powder")); + self::register("blaze_rod", fn(IID $id) => new BlazeRod($id, "Blaze Rod")); + self::register("bleach", fn(IID $id) => new Item($id, "Bleach")); + self::register("bone", fn(IID $id) => new Item($id, "Bone")); + self::register("bone_meal", fn(IID $id) => new Fertilizer($id, "Bone Meal")); + self::register("book", fn(IID $id) => new Book($id, "Book", [EnchantmentTags::ALL])); + self::register("bow", fn(IID $id) => new Bow($id, "Bow", [EnchantmentTags::BOW])); + self::register("bowl", fn(IID $id) => new Bowl($id, "Bowl")); + self::register("bread", fn(IID $id) => new Bread($id, "Bread")); + self::register("brick", fn(IID $id) => new Item($id, "Brick")); + self::register("bucket", fn(IID $id) => new Bucket($id, "Bucket")); + self::register("carrot", fn(IID $id) => new Carrot($id, "Carrot")); + self::register("charcoal", fn(IID $id) => new Coal($id, "Charcoal")); + self::register("cherry_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::CHERRY_SIGN(), Blocks::CHERRY_WALL_SIGN())); + self::register("chemical_aluminium_oxide", fn(IID $id) => new Item($id, "Aluminium Oxide")); + self::register("chemical_ammonia", fn(IID $id) => new Item($id, "Ammonia")); + self::register("chemical_barium_sulphate", fn(IID $id) => new Item($id, "Barium Sulphate")); + self::register("chemical_benzene", fn(IID $id) => new Item($id, "Benzene")); + self::register("chemical_boron_trioxide", fn(IID $id) => new Item($id, "Boron Trioxide")); + self::register("chemical_calcium_bromide", fn(IID $id) => new Item($id, "Calcium Bromide")); + self::register("chemical_calcium_chloride", fn(IID $id) => new Item($id, "Calcium Chloride")); + self::register("chemical_cerium_chloride", fn(IID $id) => new Item($id, "Cerium Chloride")); + self::register("chemical_charcoal", fn(IID $id) => new Item($id, "Charcoal")); + self::register("chemical_crude_oil", fn(IID $id) => new Item($id, "Crude Oil")); + self::register("chemical_glue", fn(IID $id) => new Item($id, "Glue")); + self::register("chemical_hydrogen_peroxide", fn(IID $id) => new Item($id, "Hydrogen Peroxide")); + self::register("chemical_hypochlorite", fn(IID $id) => new Item($id, "Hypochlorite")); + self::register("chemical_ink", fn(IID $id) => new Item($id, "Ink")); + self::register("chemical_iron_sulphide", fn(IID $id) => new Item($id, "Iron Sulphide")); + self::register("chemical_latex", fn(IID $id) => new Item($id, "Latex")); + self::register("chemical_lithium_hydride", fn(IID $id) => new Item($id, "Lithium Hydride")); + self::register("chemical_luminol", fn(IID $id) => new Item($id, "Luminol")); + self::register("chemical_magnesium_nitrate", fn(IID $id) => new Item($id, "Magnesium Nitrate")); + self::register("chemical_magnesium_oxide", fn(IID $id) => new Item($id, "Magnesium Oxide")); + self::register("chemical_magnesium_salts", fn(IID $id) => new Item($id, "Magnesium Salts")); + self::register("chemical_mercuric_chloride", fn(IID $id) => new Item($id, "Mercuric Chloride")); + self::register("chemical_polyethylene", fn(IID $id) => new Item($id, "Polyethylene")); + self::register("chemical_potassium_chloride", fn(IID $id) => new Item($id, "Potassium Chloride")); + self::register("chemical_potassium_iodide", fn(IID $id) => new Item($id, "Potassium Iodide")); + self::register("chemical_rubbish", fn(IID $id) => new Item($id, "Rubbish")); + self::register("chemical_salt", fn(IID $id) => new Item($id, "Salt")); + self::register("chemical_soap", fn(IID $id) => new Item($id, "Soap")); + self::register("chemical_sodium_acetate", fn(IID $id) => new Item($id, "Sodium Acetate")); + self::register("chemical_sodium_fluoride", fn(IID $id) => new Item($id, "Sodium Fluoride")); + self::register("chemical_sodium_hydride", fn(IID $id) => new Item($id, "Sodium Hydride")); + self::register("chemical_sodium_hydroxide", fn(IID $id) => new Item($id, "Sodium Hydroxide")); + self::register("chemical_sodium_hypochlorite", fn(IID $id) => new Item($id, "Sodium Hypochlorite")); + self::register("chemical_sodium_oxide", fn(IID $id) => new Item($id, "Sodium Oxide")); + self::register("chemical_sugar", fn(IID $id) => new Item($id, "Sugar")); + self::register("chemical_sulphate", fn(IID $id) => new Item($id, "Sulphate")); + self::register("chemical_tungsten_chloride", fn(IID $id) => new Item($id, "Tungsten Chloride")); + self::register("chemical_water", fn(IID $id) => new Item($id, "Water")); + self::register("chorus_fruit", fn(IID $id) => new ChorusFruit($id, "Chorus Fruit")); + self::register("clay", fn(IID $id) => new Item($id, "Clay")); + self::register("clock", fn(IID $id) => new Clock($id, "Clock")); + self::register("clownfish", fn(IID $id) => new Clownfish($id, "Clownfish")); + self::register("coal", fn(IID $id) => new Coal($id, "Coal")); + self::register("cocoa_beans", fn(IID $id) => new CocoaBeans($id, "Cocoa Beans")); + self::register("compass", fn(IID $id) => new Compass($id, "Compass", [EnchantmentTags::COMPASS])); + self::register("cooked_chicken", fn(IID $id) => new CookedChicken($id, "Cooked Chicken")); + self::register("cooked_fish", fn(IID $id) => new CookedFish($id, "Cooked Fish")); + self::register("cooked_mutton", fn(IID $id) => new CookedMutton($id, "Cooked Mutton")); + self::register("cooked_porkchop", fn(IID $id) => new CookedPorkchop($id, "Cooked Porkchop")); + self::register("cooked_rabbit", fn(IID $id) => new CookedRabbit($id, "Cooked Rabbit")); + self::register("cooked_salmon", fn(IID $id) => new CookedSalmon($id, "Cooked Salmon")); + self::register("cookie", fn(IID $id) => new Cookie($id, "Cookie")); + self::register("copper_ingot", fn(IID $id) => new Item($id, "Copper Ingot")); + self::register("coral_fan", fn(IID $id) => new CoralFan($id)); + self::register("crimson_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN())); + self::register("dark_oak_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + self::register("diamond", fn(IID $id) => new Item($id, "Diamond")); + self::register("disc_fragment_5", fn(IID $id) => new Item($id, "Disc Fragment (5)")); + self::register("dragon_breath", fn(IID $id) => new Item($id, "Dragon's Breath")); + self::register("dried_kelp", fn(IID $id) => new DriedKelp($id, "Dried Kelp")); //TODO: add interface to dye-colour objects - self::register("dye", new Dye(new IID(Ids::DYE), "Dye")); - self::register("echo_shard", new Item(new IID(Ids::ECHO_SHARD), "Echo Shard")); - self::register("egg", new Egg(new IID(Ids::EGG), "Egg")); - self::register("emerald", new Item(new IID(Ids::EMERALD), "Emerald")); - self::register("enchanted_book", new EnchantedBook(new IID(Ids::ENCHANTED_BOOK), "Enchanted Book", [EnchantmentTags::ALL])); - self::register("enchanted_golden_apple", new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); - self::register("ender_pearl", new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); - self::register("experience_bottle", new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); - self::register("feather", new Item(new IID(Ids::FEATHER), "Feather")); - self::register("fermented_spider_eye", new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); - self::register("fire_charge", new FireCharge(new IID(Ids::FIRE_CHARGE), "Fire Charge")); - self::register("fishing_rod", new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod", [EnchantmentTags::FISHING_ROD])); - self::register("flint", new Item(new IID(Ids::FLINT), "Flint")); - self::register("flint_and_steel", new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel", [EnchantmentTags::FLINT_AND_STEEL])); - self::register("ghast_tear", new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); - self::register("glass_bottle", new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); - self::register("glistering_melon", new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); - self::register("glow_berries", new GlowBerries(new IID(Ids::GLOW_BERRIES), "Glow Berries")); - self::register("glow_ink_sac", new Item(new IID(Ids::GLOW_INK_SAC), "Glow Ink Sac")); - self::register("glowstone_dust", new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); - self::register("goat_horn", new GoatHorn(new IID(Ids::GOAT_HORN), "Goat Horn")); - self::register("gold_ingot", new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); - self::register("gold_nugget", new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); - self::register("golden_apple", new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); - self::register("golden_carrot", new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); - self::register("gunpowder", new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); - self::register("heart_of_the_sea", new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); - self::register("honey_bottle", new HoneyBottle(new IID(Ids::HONEY_BOTTLE), "Honey Bottle")); - self::register("honeycomb", new Item(new IID(Ids::HONEYCOMB), "Honeycomb")); - self::register("ink_sac", new Item(new IID(Ids::INK_SAC), "Ink Sac")); - self::register("iron_ingot", new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); - self::register("iron_nugget", new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); - self::register("jungle_sign", new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - self::register("lapis_lazuli", new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); - self::register("lava_bucket", new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); - self::register("leather", new Item(new IID(Ids::LEATHER), "Leather")); - self::register("magma_cream", new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); - self::register("mangrove_sign", new ItemBlockWallOrFloor(new IID(Ids::MANGROVE_SIGN), Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); - self::register("medicine", new Medicine(new IID(Ids::MEDICINE), "Medicine")); - self::register("melon", new Melon(new IID(Ids::MELON), "Melon")); - self::register("melon_seeds", new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); - self::register("milk_bucket", new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); - self::register("minecart", new Minecart(new IID(Ids::MINECART), "Minecart")); - self::register("mushroom_stew", new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); - self::register("name_tag", new NameTag(new IID(Ids::NAME_TAG), "Name Tag")); - self::register("nautilus_shell", new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); - self::register("nether_brick", new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); - self::register("nether_quartz", new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); - self::register("nether_star", new Item(new IID(Ids::NETHER_STAR), "Nether Star")); - self::register("netherite_ingot", new class(new IID(Ids::NETHERITE_INGOT), "Netherite Ingot") extends Item{ + self::register("dye", fn(IID $id) => new Dye($id, "Dye")); + self::register("echo_shard", fn(IID $id) => new Item($id, "Echo Shard")); + self::register("egg", fn(IID $id) => new Egg($id, "Egg")); + self::register("emerald", fn(IID $id) => new Item($id, "Emerald")); + self::register("enchanted_book", fn(IID $id) => new EnchantedBook($id, "Enchanted Book", [EnchantmentTags::ALL])); + self::register("enchanted_golden_apple", fn(IID $id) => new GoldenAppleEnchanted($id, "Enchanted Golden Apple")); + self::register("ender_pearl", fn(IID $id) => new EnderPearl($id, "Ender Pearl")); + self::register("experience_bottle", fn(IID $id) => new ExperienceBottle($id, "Bottle o' Enchanting")); + self::register("feather", fn(IID $id) => new Item($id, "Feather")); + self::register("fermented_spider_eye", fn(IID $id) => new Item($id, "Fermented Spider Eye")); + self::register("fire_charge", fn(IID $id) => new FireCharge($id, "Fire Charge")); + self::register("fishing_rod", fn(IID $id) => new FishingRod($id, "Fishing Rod", [EnchantmentTags::FISHING_ROD])); + self::register("flint", fn(IID $id) => new Item($id, "Flint")); + self::register("flint_and_steel", fn(IID $id) => new FlintSteel($id, "Flint and Steel", [EnchantmentTags::FLINT_AND_STEEL])); + self::register("ghast_tear", fn(IID $id) => new Item($id, "Ghast Tear")); + self::register("glass_bottle", fn(IID $id) => new GlassBottle($id, "Glass Bottle")); + self::register("glistering_melon", fn(IID $id) => new Item($id, "Glistering Melon")); + self::register("glow_berries", fn(IID $id) => new GlowBerries($id, "Glow Berries")); + self::register("glow_ink_sac", fn(IID $id) => new Item($id, "Glow Ink Sac")); + self::register("glowstone_dust", fn(IID $id) => new Item($id, "Glowstone Dust")); + self::register("goat_horn", fn(IID $id) => new GoatHorn($id, "Goat Horn")); + self::register("gold_ingot", fn(IID $id) => new Item($id, "Gold Ingot")); + self::register("gold_nugget", fn(IID $id) => new Item($id, "Gold Nugget")); + self::register("golden_apple", fn(IID $id) => new GoldenApple($id, "Golden Apple")); + self::register("golden_carrot", fn(IID $id) => new GoldenCarrot($id, "Golden Carrot")); + self::register("gunpowder", fn(IID $id) => new Item($id, "Gunpowder")); + self::register("heart_of_the_sea", fn(IID $id) => new Item($id, "Heart of the Sea")); + self::register("honey_bottle", fn(IID $id) => new HoneyBottle($id, "Honey Bottle")); + self::register("honeycomb", fn(IID $id) => new Item($id, "Honeycomb")); + self::register("ink_sac", fn(IID $id) => new Item($id, "Ink Sac")); + self::register("iron_ingot", fn(IID $id) => new Item($id, "Iron Ingot")); + self::register("iron_nugget", fn(IID $id) => new Item($id, "Iron Nugget")); + self::register("jungle_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + self::register("lapis_lazuli", fn(IID $id) => new Item($id, "Lapis Lazuli")); + self::register("lava_bucket", fn(IID $id) => new LiquidBucket($id, "Lava Bucket", Blocks::LAVA())); + self::register("leather", fn(IID $id) => new Item($id, "Leather")); + self::register("magma_cream", fn(IID $id) => new Item($id, "Magma Cream")); + self::register("mangrove_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN())); + self::register("medicine", fn(IID $id) => new Medicine($id, "Medicine")); + self::register("melon", fn(IID $id) => new Melon($id, "Melon")); + self::register("melon_seeds", fn(IID $id) => new MelonSeeds($id, "Melon Seeds")); + self::register("milk_bucket", fn(IID $id) => new MilkBucket($id, "Milk Bucket")); + self::register("minecart", fn(IID $id) => new Minecart($id, "Minecart")); + self::register("mushroom_stew", fn(IID $id) => new MushroomStew($id, "Mushroom Stew")); + self::register("name_tag", fn(IID $id) => new NameTag($id, "Name Tag")); + self::register("nautilus_shell", fn(IID $id) => new Item($id, "Nautilus Shell")); + self::register("nether_brick", fn(IID $id) => new Item($id, "Nether Brick")); + self::register("nether_quartz", fn(IID $id) => new Item($id, "Nether Quartz")); + self::register("nether_star", fn(IID $id) => new Item($id, "Nether Star")); + self::register("netherite_ingot", fn(IID $id) => new class($id, "Netherite Ingot") extends Item{ public function isFireProof() : bool{ return true; } }); - self::register("netherite_scrap", new class(new IID(Ids::NETHERITE_SCRAP), "Netherite Scrap") extends Item{ + self::register("netherite_scrap", fn(IID $id) => new class($id, "Netherite Scrap") extends Item{ public function isFireProof() : bool{ return true; } }); - self::register("oak_sign", new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - self::register("painting", new PaintingItem(new IID(Ids::PAINTING), "Painting")); - self::register("paper", new Item(new IID(Ids::PAPER), "Paper")); - self::register("phantom_membrane", new Item(new IID(Ids::PHANTOM_MEMBRANE), "Phantom Membrane")); - self::register("pitcher_pod", new PitcherPod(new IID(Ids::PITCHER_POD), "Pitcher Pod")); - self::register("poisonous_potato", new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); - self::register("popped_chorus_fruit", new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); - self::register("potato", new Potato(new IID(Ids::POTATO), "Potato")); - self::register("potion", new Potion(new IID(Ids::POTION), "Potion")); - self::register("prismarine_crystals", new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); - self::register("prismarine_shard", new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); - self::register("pufferfish", new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); - self::register("pumpkin_pie", new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); - self::register("pumpkin_seeds", new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); - self::register("rabbit_foot", new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); - self::register("rabbit_hide", new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); - self::register("rabbit_stew", new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); - self::register("raw_beef", new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); - self::register("raw_chicken", new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); - self::register("raw_copper", new Item(new IID(Ids::RAW_COPPER), "Raw Copper")); - self::register("raw_fish", new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); - self::register("raw_gold", new Item(new IID(Ids::RAW_GOLD), "Raw Gold")); - self::register("raw_iron", new Item(new IID(Ids::RAW_IRON), "Raw Iron")); - self::register("raw_mutton", new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); - self::register("raw_porkchop", new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); - self::register("raw_rabbit", new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); - self::register("raw_salmon", new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); - self::register("record_11", new Record(new IID(Ids::RECORD_11), RecordType::DISK_11, "Record 11")); - self::register("record_13", new Record(new IID(Ids::RECORD_13), RecordType::DISK_13, "Record 13")); - self::register("record_5", new Record(new IID(Ids::RECORD_5), RecordType::DISK_5, "Record 5")); - self::register("record_blocks", new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS, "Record Blocks")); - self::register("record_cat", new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT, "Record Cat")); - self::register("record_chirp", new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP, "Record Chirp")); - self::register("record_far", new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR, "Record Far")); - self::register("record_mall", new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL, "Record Mall")); - self::register("record_mellohi", new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI, "Record Mellohi")); - self::register("record_otherside", new Record(new IID(Ids::RECORD_OTHERSIDE), RecordType::DISK_OTHERSIDE, "Record Otherside")); - self::register("record_pigstep", new Record(new IID(Ids::RECORD_PIGSTEP), RecordType::DISK_PIGSTEP, "Record Pigstep")); - self::register("record_stal", new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL, "Record Stal")); - self::register("record_strad", new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD, "Record Strad")); - self::register("record_wait", new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT, "Record Wait")); - self::register("record_ward", new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD, "Record Ward")); - self::register("redstone_dust", new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); - self::register("rotten_flesh", new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); - self::register("scute", new Item(new IID(Ids::SCUTE), "Scute")); - self::register("shears", new Shears(new IID(Ids::SHEARS), "Shears", [EnchantmentTags::SHEARS])); - self::register("shulker_shell", new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); - self::register("slimeball", new Item(new IID(Ids::SLIMEBALL), "Slimeball")); - self::register("snowball", new Snowball(new IID(Ids::SNOWBALL), "Snowball")); - self::register("spider_eye", new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); - self::register("splash_potion", new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); - self::register("spruce_sign", new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - self::register("spyglass", new Spyglass(new IID(Ids::SPYGLASS), "Spyglass")); - self::register("steak", new Steak(new IID(Ids::STEAK), "Steak")); - self::register("stick", new Stick(new IID(Ids::STICK), "Stick")); - self::register("string", new StringItem(new IID(Ids::STRING), "String")); - self::register("sugar", new Item(new IID(Ids::SUGAR), "Sugar")); - self::register("suspicious_stew", new SuspiciousStew(new IID(Ids::SUSPICIOUS_STEW), "Suspicious Stew")); - self::register("sweet_berries", new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); - self::register("torchflower_seeds", new TorchflowerSeeds(new IID(Ids::TORCHFLOWER_SEEDS), "Torchflower Seeds")); - self::register("totem", new Totem(new IID(Ids::TOTEM), "Totem of Undying")); - self::register("warped_sign", new ItemBlockWallOrFloor(new IID(Ids::WARPED_SIGN), Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); - self::register("water_bucket", new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); - self::register("wheat", new Item(new IID(Ids::WHEAT), "Wheat")); - self::register("wheat_seeds", new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); - self::register("writable_book", new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); - self::register("written_book", new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); + self::register("oak_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); + self::register("painting", fn(IID $id) => new PaintingItem($id, "Painting")); + self::register("paper", fn(IID $id) => new Item($id, "Paper")); + self::register("phantom_membrane", fn(IID $id) => new Item($id, "Phantom Membrane")); + self::register("pitcher_pod", fn(IID $id) => new PitcherPod($id, "Pitcher Pod")); + self::register("poisonous_potato", fn(IID $id) => new PoisonousPotato($id, "Poisonous Potato")); + self::register("popped_chorus_fruit", fn(IID $id) => new Item($id, "Popped Chorus Fruit")); + self::register("potato", fn(IID $id) => new Potato($id, "Potato")); + self::register("potion", fn(IID $id) => new Potion($id, "Potion")); + self::register("prismarine_crystals", fn(IID $id) => new Item($id, "Prismarine Crystals")); + self::register("prismarine_shard", fn(IID $id) => new Item($id, "Prismarine Shard")); + self::register("pufferfish", fn(IID $id) => new Pufferfish($id, "Pufferfish")); + self::register("pumpkin_pie", fn(IID $id) => new PumpkinPie($id, "Pumpkin Pie")); + self::register("pumpkin_seeds", fn(IID $id) => new PumpkinSeeds($id, "Pumpkin Seeds")); + self::register("rabbit_foot", fn(IID $id) => new Item($id, "Rabbit's Foot")); + self::register("rabbit_hide", fn(IID $id) => new Item($id, "Rabbit Hide")); + self::register("rabbit_stew", fn(IID $id) => new RabbitStew($id, "Rabbit Stew")); + self::register("raw_beef", fn(IID $id) => new RawBeef($id, "Raw Beef")); + self::register("raw_chicken", fn(IID $id) => new RawChicken($id, "Raw Chicken")); + self::register("raw_copper", fn(IID $id) => new Item($id, "Raw Copper")); + self::register("raw_fish", fn(IID $id) => new RawFish($id, "Raw Fish")); + self::register("raw_gold", fn(IID $id) => new Item($id, "Raw Gold")); + self::register("raw_iron", fn(IID $id) => new Item($id, "Raw Iron")); + self::register("raw_mutton", fn(IID $id) => new RawMutton($id, "Raw Mutton")); + self::register("raw_porkchop", fn(IID $id) => new RawPorkchop($id, "Raw Porkchop")); + self::register("raw_rabbit", fn(IID $id) => new RawRabbit($id, "Raw Rabbit")); + self::register("raw_salmon", fn(IID $id) => new RawSalmon($id, "Raw Salmon")); + self::register("record_11", fn(IID $id) => new Record($id, RecordType::DISK_11, "Record 11")); + self::register("record_13", fn(IID $id) => new Record($id, RecordType::DISK_13, "Record 13")); + self::register("record_5", fn(IID $id) => new Record($id, RecordType::DISK_5, "Record 5")); + self::register("record_blocks", fn(IID $id) => new Record($id, RecordType::DISK_BLOCKS, "Record Blocks")); + self::register("record_cat", fn(IID $id) => new Record($id, RecordType::DISK_CAT, "Record Cat")); + self::register("record_chirp", fn(IID $id) => new Record($id, RecordType::DISK_CHIRP, "Record Chirp")); + self::register("record_far", fn(IID $id) => new Record($id, RecordType::DISK_FAR, "Record Far")); + self::register("record_mall", fn(IID $id) => new Record($id, RecordType::DISK_MALL, "Record Mall")); + self::register("record_mellohi", fn(IID $id) => new Record($id, RecordType::DISK_MELLOHI, "Record Mellohi")); + self::register("record_otherside", fn(IID $id) => new Record($id, RecordType::DISK_OTHERSIDE, "Record Otherside")); + self::register("record_pigstep", fn(IID $id) => new Record($id, RecordType::DISK_PIGSTEP, "Record Pigstep")); + self::register("record_stal", fn(IID $id) => new Record($id, RecordType::DISK_STAL, "Record Stal")); + self::register("record_strad", fn(IID $id) => new Record($id, RecordType::DISK_STRAD, "Record Strad")); + self::register("record_wait", fn(IID $id) => new Record($id, RecordType::DISK_WAIT, "Record Wait")); + self::register("record_ward", fn(IID $id) => new Record($id, RecordType::DISK_WARD, "Record Ward")); + self::register("redstone_dust", fn(IID $id) => new Redstone($id, "Redstone")); + self::register("rotten_flesh", fn(IID $id) => new RottenFlesh($id, "Rotten Flesh")); + self::register("scute", fn(IID $id) => new Item($id, "Scute")); + self::register("shears", fn(IID $id) => new Shears($id, "Shears", [EnchantmentTags::SHEARS])); + self::register("shulker_shell", fn(IID $id) => new Item($id, "Shulker Shell")); + self::register("slimeball", fn(IID $id) => new Item($id, "Slimeball")); + self::register("snowball", fn(IID $id) => new Snowball($id, "Snowball")); + self::register("spider_eye", fn(IID $id) => new SpiderEye($id, "Spider Eye")); + self::register("splash_potion", fn(IID $id) => new SplashPotion($id, "Splash Potion")); + self::register("spruce_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); + self::register("spyglass", fn(IID $id) => new Spyglass($id, "Spyglass")); + self::register("steak", fn(IID $id) => new Steak($id, "Steak")); + self::register("stick", fn(IID $id) => new Stick($id, "Stick")); + self::register("string", fn(IID $id) => new StringItem($id, "String")); + self::register("sugar", fn(IID $id) => new Item($id, "Sugar")); + self::register("suspicious_stew", fn(IID $id) => new SuspiciousStew($id, "Suspicious Stew")); + self::register("sweet_berries", fn(IID $id) => new SweetBerries($id, "Sweet Berries")); + self::register("torchflower_seeds", fn(IID $id) => new TorchflowerSeeds($id, "Torchflower Seeds")); + self::register("totem", fn(IID $id) => new Totem($id, "Totem of Undying")); + self::register("warped_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN())); + self::register("water_bucket", fn(IID $id) => new LiquidBucket($id, "Water Bucket", Blocks::WATER())); + self::register("wheat", fn(IID $id) => new Item($id, "Wheat")); + self::register("wheat_seeds", fn(IID $id) => new WheatSeeds($id, "Wheat Seeds")); + self::register("writable_book", fn(IID $id) => new WritableBook($id, "Book & Quill")); + self::register("written_book", fn(IID $id) => new WrittenBook($id, "Written Book")); foreach(BoatType::cases() as $type){ //boat type is static, because different types of wood may have different properties - self::register(strtolower($type->name) . "_boat", new Boat(new IID(match($type){ - BoatType::OAK => Ids::OAK_BOAT, - BoatType::SPRUCE => Ids::SPRUCE_BOAT, - BoatType::BIRCH => Ids::BIRCH_BOAT, - BoatType::JUNGLE => Ids::JUNGLE_BOAT, - BoatType::ACACIA => Ids::ACACIA_BOAT, - BoatType::DARK_OAK => Ids::DARK_OAK_BOAT, - BoatType::MANGROVE => Ids::MANGROVE_BOAT, - }), $type->getDisplayName() . " Boat", $type)); + self::register(strtolower($type->name) . "_boat", fn(IID $id) => new Boat($id, $type->getDisplayName() . " Boat", $type)); } } private static function registerSpawnEggs() : void{ - self::register("zombie_spawn_egg", new class(new IID(Ids::ZOMBIE_SPAWN_EGG), "Zombie Spawn Egg") extends SpawnEgg{ + self::register("zombie_spawn_egg", fn(IID $id) => new class($id, "Zombie Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - self::register("squid_spawn_egg", new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ + self::register("squid_spawn_egg", fn(IID $id) => new class($id, "Squid Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - self::register("villager_spawn_egg", new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ + self::register("villager_spawn_egg", fn(IID $id) => new class($id, "Villager Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); } @@ -605,87 +621,87 @@ final class VanillaItems{ } private static function registerTierToolItems() : void{ - self::register("diamond_axe", new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND, [EnchantmentTags::AXE])); - self::register("golden_axe", new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD, [EnchantmentTags::AXE])); - self::register("iron_axe", new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON, [EnchantmentTags::AXE])); - self::register("netherite_axe", new Axe(new IID(Ids::NETHERITE_AXE), "Netherite Axe", ToolTier::NETHERITE, [EnchantmentTags::AXE])); - self::register("stone_axe", new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE, [EnchantmentTags::AXE])); - self::register("wooden_axe", new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD, [EnchantmentTags::AXE])); - self::register("diamond_hoe", new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND, [EnchantmentTags::HOE])); - self::register("golden_hoe", new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD, [EnchantmentTags::HOE])); - self::register("iron_hoe", new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON, [EnchantmentTags::HOE])); - self::register("netherite_hoe", new Hoe(new IID(Ids::NETHERITE_HOE), "Netherite Hoe", ToolTier::NETHERITE, [EnchantmentTags::HOE])); - self::register("stone_hoe", new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE, [EnchantmentTags::HOE])); - self::register("wooden_hoe", new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD, [EnchantmentTags::HOE])); - self::register("diamond_pickaxe", new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND, [EnchantmentTags::PICKAXE])); - self::register("golden_pickaxe", new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD, [EnchantmentTags::PICKAXE])); - self::register("iron_pickaxe", new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON, [EnchantmentTags::PICKAXE])); - self::register("netherite_pickaxe", new Pickaxe(new IID(Ids::NETHERITE_PICKAXE), "Netherite Pickaxe", ToolTier::NETHERITE, [EnchantmentTags::PICKAXE])); - self::register("stone_pickaxe", new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE, [EnchantmentTags::PICKAXE])); - self::register("wooden_pickaxe", new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD, [EnchantmentTags::PICKAXE])); - self::register("diamond_shovel", new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND, [EnchantmentTags::SHOVEL])); - self::register("golden_shovel", new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD, [EnchantmentTags::SHOVEL])); - self::register("iron_shovel", new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON, [EnchantmentTags::SHOVEL])); - self::register("netherite_shovel", new Shovel(new IID(Ids::NETHERITE_SHOVEL), "Netherite Shovel", ToolTier::NETHERITE, [EnchantmentTags::SHOVEL])); - self::register("stone_shovel", new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE, [EnchantmentTags::SHOVEL])); - self::register("wooden_shovel", new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD, [EnchantmentTags::SHOVEL])); - self::register("diamond_sword", new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND, [EnchantmentTags::SWORD])); - self::register("golden_sword", new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD, [EnchantmentTags::SWORD])); - self::register("iron_sword", new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON, [EnchantmentTags::SWORD])); - self::register("netherite_sword", new Sword(new IID(Ids::NETHERITE_SWORD), "Netherite Sword", ToolTier::NETHERITE, [EnchantmentTags::SWORD])); - self::register("stone_sword", new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE, [EnchantmentTags::SWORD])); - self::register("wooden_sword", new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD, [EnchantmentTags::SWORD])); + self::register("diamond_axe", fn(IID $id) => new Axe($id, "Diamond Axe", ToolTier::DIAMOND, [EnchantmentTags::AXE])); + self::register("golden_axe", fn(IID $id) => new Axe($id, "Golden Axe", ToolTier::GOLD, [EnchantmentTags::AXE])); + self::register("iron_axe", fn(IID $id) => new Axe($id, "Iron Axe", ToolTier::IRON, [EnchantmentTags::AXE])); + self::register("netherite_axe", fn(IID $id) => new Axe($id, "Netherite Axe", ToolTier::NETHERITE, [EnchantmentTags::AXE])); + self::register("stone_axe", fn(IID $id) => new Axe($id, "Stone Axe", ToolTier::STONE, [EnchantmentTags::AXE])); + self::register("wooden_axe", fn(IID $id) => new Axe($id, "Wooden Axe", ToolTier::WOOD, [EnchantmentTags::AXE])); + self::register("diamond_hoe", fn(IID $id) => new Hoe($id, "Diamond Hoe", ToolTier::DIAMOND, [EnchantmentTags::HOE])); + self::register("golden_hoe", fn(IID $id) => new Hoe($id, "Golden Hoe", ToolTier::GOLD, [EnchantmentTags::HOE])); + self::register("iron_hoe", fn(IID $id) => new Hoe($id, "Iron Hoe", ToolTier::IRON, [EnchantmentTags::HOE])); + self::register("netherite_hoe", fn(IID $id) => new Hoe($id, "Netherite Hoe", ToolTier::NETHERITE, [EnchantmentTags::HOE])); + self::register("stone_hoe", fn(IID $id) => new Hoe($id, "Stone Hoe", ToolTier::STONE, [EnchantmentTags::HOE])); + self::register("wooden_hoe", fn(IID $id) => new Hoe($id, "Wooden Hoe", ToolTier::WOOD, [EnchantmentTags::HOE])); + self::register("diamond_pickaxe", fn(IID $id) => new Pickaxe($id, "Diamond Pickaxe", ToolTier::DIAMOND, [EnchantmentTags::PICKAXE])); + self::register("golden_pickaxe", fn(IID $id) => new Pickaxe($id, "Golden Pickaxe", ToolTier::GOLD, [EnchantmentTags::PICKAXE])); + self::register("iron_pickaxe", fn(IID $id) => new Pickaxe($id, "Iron Pickaxe", ToolTier::IRON, [EnchantmentTags::PICKAXE])); + self::register("netherite_pickaxe", fn(IID $id) => new Pickaxe($id, "Netherite Pickaxe", ToolTier::NETHERITE, [EnchantmentTags::PICKAXE])); + self::register("stone_pickaxe", fn(IID $id) => new Pickaxe($id, "Stone Pickaxe", ToolTier::STONE, [EnchantmentTags::PICKAXE])); + self::register("wooden_pickaxe", fn(IID $id) => new Pickaxe($id, "Wooden Pickaxe", ToolTier::WOOD, [EnchantmentTags::PICKAXE])); + self::register("diamond_shovel", fn(IID $id) => new Shovel($id, "Diamond Shovel", ToolTier::DIAMOND, [EnchantmentTags::SHOVEL])); + self::register("golden_shovel", fn(IID $id) => new Shovel($id, "Golden Shovel", ToolTier::GOLD, [EnchantmentTags::SHOVEL])); + self::register("iron_shovel", fn(IID $id) => new Shovel($id, "Iron Shovel", ToolTier::IRON, [EnchantmentTags::SHOVEL])); + self::register("netherite_shovel", fn(IID $id) => new Shovel($id, "Netherite Shovel", ToolTier::NETHERITE, [EnchantmentTags::SHOVEL])); + self::register("stone_shovel", fn(IID $id) => new Shovel($id, "Stone Shovel", ToolTier::STONE, [EnchantmentTags::SHOVEL])); + self::register("wooden_shovel", fn(IID $id) => new Shovel($id, "Wooden Shovel", ToolTier::WOOD, [EnchantmentTags::SHOVEL])); + self::register("diamond_sword", fn(IID $id) => new Sword($id, "Diamond Sword", ToolTier::DIAMOND, [EnchantmentTags::SWORD])); + self::register("golden_sword", fn(IID $id) => new Sword($id, "Golden Sword", ToolTier::GOLD, [EnchantmentTags::SWORD])); + self::register("iron_sword", fn(IID $id) => new Sword($id, "Iron Sword", ToolTier::IRON, [EnchantmentTags::SWORD])); + self::register("netherite_sword", fn(IID $id) => new Sword($id, "Netherite Sword", ToolTier::NETHERITE, [EnchantmentTags::SWORD])); + self::register("stone_sword", fn(IID $id) => new Sword($id, "Stone Sword", ToolTier::STONE, [EnchantmentTags::SWORD])); + self::register("wooden_sword", fn(IID $id) => new Sword($id, "Wooden Sword", ToolTier::WOOD, [EnchantmentTags::SWORD])); } private static function registerArmorItems() : void{ - self::register("chainmail_boots", new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::BOOTS])); - self::register("diamond_boots", new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::BOOTS])); - self::register("golden_boots", new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET, material: ArmorMaterials::GOLD()), [EnchantmentTags::BOOTS])); - self::register("iron_boots", new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::IRON()), [EnchantmentTags::BOOTS])); - self::register("leather_boots", new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET, material: ArmorMaterials::LEATHER()), [EnchantmentTags::BOOTS])); - self::register("netherite_boots", new Armor(new IID(Ids::NETHERITE_BOOTS), "Netherite Boots", new ArmorTypeInfo(3, 482, ArmorInventory::SLOT_FEET, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::BOOTS])); + self::register("chainmail_boots", fn(IID $id) => new Armor($id, "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::BOOTS])); + self::register("diamond_boots", fn(IID $id) => new Armor($id, "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::BOOTS])); + self::register("golden_boots", fn(IID $id) => new Armor($id, "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET, material: ArmorMaterials::GOLD()), [EnchantmentTags::BOOTS])); + self::register("iron_boots", fn(IID $id) => new Armor($id, "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET, material: ArmorMaterials::IRON()), [EnchantmentTags::BOOTS])); + self::register("leather_boots", fn(IID $id) => new Armor($id, "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET, material: ArmorMaterials::LEATHER()), [EnchantmentTags::BOOTS])); + self::register("netherite_boots", fn(IID $id) => new Armor($id, "Netherite Boots", new ArmorTypeInfo(3, 482, ArmorInventory::SLOT_FEET, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::BOOTS])); - self::register("chainmail_chestplate", new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::CHESTPLATE])); - self::register("diamond_chestplate", new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::CHESTPLATE])); - self::register("golden_chestplate", new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::GOLD()), [EnchantmentTags::CHESTPLATE])); - self::register("iron_chestplate", new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::IRON()), [EnchantmentTags::CHESTPLATE])); - self::register("leather_tunic", new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::LEATHER()), [EnchantmentTags::CHESTPLATE])); - self::register("netherite_chestplate", new Armor(new IID(Ids::NETHERITE_CHESTPLATE), "Netherite Chestplate", new ArmorTypeInfo(8, 593, ArmorInventory::SLOT_CHEST, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::CHESTPLATE])); + self::register("chainmail_chestplate", fn(IID $id) => new Armor($id, "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::CHESTPLATE])); + self::register("diamond_chestplate", fn(IID $id) => new Armor($id, "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::CHESTPLATE])); + self::register("golden_chestplate", fn(IID $id) => new Armor($id, "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::GOLD()), [EnchantmentTags::CHESTPLATE])); + self::register("iron_chestplate", fn(IID $id) => new Armor($id, "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::IRON()), [EnchantmentTags::CHESTPLATE])); + self::register("leather_tunic", fn(IID $id) => new Armor($id, "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST, material: ArmorMaterials::LEATHER()), [EnchantmentTags::CHESTPLATE])); + self::register("netherite_chestplate", fn(IID $id) => new Armor($id, "Netherite Chestplate", new ArmorTypeInfo(8, 593, ArmorInventory::SLOT_CHEST, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::CHESTPLATE])); - self::register("chainmail_helmet", new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::HELMET])); - self::register("diamond_helmet", new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::HELMET])); - self::register("golden_helmet", new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::GOLD()), [EnchantmentTags::HELMET])); - self::register("iron_helmet", new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::IRON()), [EnchantmentTags::HELMET])); - self::register("leather_cap", new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::LEATHER()), [EnchantmentTags::HELMET])); - self::register("netherite_helmet", new Armor(new IID(Ids::NETHERITE_HELMET), "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::HELMET])); - self::register("turtle_helmet", new TurtleHelmet(new IID(Ids::TURTLE_HELMET), "Turtle Shell", new ArmorTypeInfo(2, 276, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::TURTLE()), [EnchantmentTags::HELMET])); + self::register("chainmail_helmet", fn(IID $id) => new Armor($id, "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::HELMET])); + self::register("diamond_helmet", fn(IID $id) => new Armor($id, "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::HELMET])); + self::register("golden_helmet", fn(IID $id) => new Armor($id, "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::GOLD()), [EnchantmentTags::HELMET])); + self::register("iron_helmet", fn(IID $id) => new Armor($id, "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::IRON()), [EnchantmentTags::HELMET])); + self::register("leather_cap", fn(IID $id) => new Armor($id, "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::LEATHER()), [EnchantmentTags::HELMET])); + self::register("netherite_helmet", fn(IID $id) => new Armor($id, "Netherite Helmet", new ArmorTypeInfo(3, 408, ArmorInventory::SLOT_HEAD, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::HELMET])); + self::register("turtle_helmet", fn(IID $id) => new TurtleHelmet($id, "Turtle Shell", new ArmorTypeInfo(2, 276, ArmorInventory::SLOT_HEAD, material: ArmorMaterials::TURTLE()), [EnchantmentTags::HELMET])); - self::register("chainmail_leggings", new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::LEGGINGS])); - self::register("diamond_leggings", new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::LEGGINGS])); - self::register("golden_leggings", new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::GOLD()), [EnchantmentTags::LEGGINGS])); - self::register("iron_leggings", new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::IRON()), [EnchantmentTags::LEGGINGS])); - self::register("leather_pants", new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::LEATHER()), [EnchantmentTags::LEGGINGS])); - self::register("netherite_leggings", new Armor(new IID(Ids::NETHERITE_LEGGINGS), "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::LEGGINGS])); + self::register("chainmail_leggings", fn(IID $id) => new Armor($id, "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::CHAINMAIL()), [EnchantmentTags::LEGGINGS])); + self::register("diamond_leggings", fn(IID $id) => new Armor($id, "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS, 2, material: ArmorMaterials::DIAMOND()), [EnchantmentTags::LEGGINGS])); + self::register("golden_leggings", fn(IID $id) => new Armor($id, "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::GOLD()), [EnchantmentTags::LEGGINGS])); + self::register("iron_leggings", fn(IID $id) => new Armor($id, "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::IRON()), [EnchantmentTags::LEGGINGS])); + self::register("leather_pants", fn(IID $id) => new Armor($id, "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS, material: ArmorMaterials::LEATHER()), [EnchantmentTags::LEGGINGS])); + self::register("netherite_leggings", fn(IID $id) => new Armor($id, "Netherite Leggings", new ArmorTypeInfo(6, 556, ArmorInventory::SLOT_LEGS, 3, true, material: ArmorMaterials::NETHERITE()), [EnchantmentTags::LEGGINGS])); } private static function registerSmithingTemplates() : void{ - self::register("netherite_upgrade_smithing_template", new Item(new IID(Ids::NETHERITE_UPGRADE_SMITHING_TEMPLATE), "Netherite Upgrade Smithing Template")); - self::register("coast_armor_trim_smithing_template", new Item(new IID(Ids::COAST_ARMOR_TRIM_SMITHING_TEMPLATE), "Coast Armor Trim Smithing Template")); - self::register("dune_armor_trim_smithing_template", new Item(new IID(Ids::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE), "Dune Armor Trim Smithing Template")); - self::register("eye_armor_trim_smithing_template", new Item(new IID(Ids::EYE_ARMOR_TRIM_SMITHING_TEMPLATE), "Eye Armor Trim Smithing Template")); - self::register("host_armor_trim_smithing_template", new Item(new IID(Ids::HOST_ARMOR_TRIM_SMITHING_TEMPLATE), "Host Armor Trim Smithing Template")); - self::register("raiser_armor_trim_smithing_template", new Item(new IID(Ids::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE), "Raiser Armor Trim Smithing Template")); - self::register("rib_armor_trim_smithing_template", new Item(new IID(Ids::RIB_ARMOR_TRIM_SMITHING_TEMPLATE), "Rib Armor Trim Smithing Template")); - self::register("sentry_armor_trim_smithing_template", new Item(new IID(Ids::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE), "Sentry Armor Trim Smithing Template")); - self::register("shaper_armor_trim_smithing_template", new Item(new IID(Ids::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE), "Shaper Armor Trim Smithing Template")); - self::register("silence_armor_trim_smithing_template", new Item(new IID(Ids::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE), "Silence Armor Trim Smithing Template")); - self::register("snout_armor_trim_smithing_template", new Item(new IID(Ids::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE), "Snout Armor Trim Smithing Template")); - self::register("spire_armor_trim_smithing_template", new Item(new IID(Ids::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE), "Spire Armor Trim Smithing Template")); - self::register("tide_armor_trim_smithing_template", new Item(new IID(Ids::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE), "Tide Armor Trim Smithing Template")); - self::register("vex_armor_trim_smithing_template", new Item(new IID(Ids::VEX_ARMOR_TRIM_SMITHING_TEMPLATE), "Vex Armor Trim Smithing Template")); - self::register("ward_armor_trim_smithing_template", new Item(new IID(Ids::WARD_ARMOR_TRIM_SMITHING_TEMPLATE), "Ward Armor Trim Smithing Template")); - self::register("wayfinder_armor_trim_smithing_template", new Item(new IID(Ids::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE), "Wayfinder Armor Trim Smithing Template")); - self::register("wild_armor_trim_smithing_template", new Item(new IID(Ids::WILD_ARMOR_TRIM_SMITHING_TEMPLATE), "Wild Armor Trim Smithing Template")); + self::register("netherite_upgrade_smithing_template", fn(IID $id) => new Item($id, "Netherite Upgrade Smithing Template")); + self::register("coast_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Coast Armor Trim Smithing Template")); + self::register("dune_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Dune Armor Trim Smithing Template")); + self::register("eye_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Eye Armor Trim Smithing Template")); + self::register("host_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Host Armor Trim Smithing Template")); + self::register("raiser_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Raiser Armor Trim Smithing Template")); + self::register("rib_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Rib Armor Trim Smithing Template")); + self::register("sentry_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Sentry Armor Trim Smithing Template")); + self::register("shaper_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Shaper Armor Trim Smithing Template")); + self::register("silence_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Silence Armor Trim Smithing Template")); + self::register("snout_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Snout Armor Trim Smithing Template")); + self::register("spire_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Spire Armor Trim Smithing Template")); + self::register("tide_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Tide Armor Trim Smithing Template")); + self::register("vex_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Vex Armor Trim Smithing Template")); + self::register("ward_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Ward Armor Trim Smithing Template")); + self::register("wayfinder_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Wayfinder Armor Trim Smithing Template")); + self::register("wild_armor_trim_smithing_template", fn(IID $id) => new Item($id, "Wild Armor Trim Smithing Template")); } } diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 0fc3defda7..e9de04a39a 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -20,6 +20,56 @@ parameters: count: 1 path: ../../../src/block/DoubleTallGrass.php + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:ACACIA_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:BIRCH_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:CHERRY_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:CRIMSON_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:DARK_OAK_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:JUNGLE_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:MANGROVE_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:OAK_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:SPRUCE_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + + - + message: "#^Creating callable from a non\\-native static method pocketmine\\\\item\\\\VanillaItems\\:\\:WARPED_SIGN\\(\\)\\.$#" + count: 1 + path: ../../../src/block/VanillaBlocks.php + - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 diff --git a/tests/phpunit/block/BlockTypeIdsTest.php b/tests/phpunit/block/BlockTypeIdsTest.php index 32c8d49029..ce21a89ab6 100644 --- a/tests/phpunit/block/BlockTypeIdsTest.php +++ b/tests/phpunit/block/BlockTypeIdsTest.php @@ -51,6 +51,7 @@ class BlockTypeIdsTest extends TestCase{ foreach(Utils::stringifyKeys(VanillaBlocks::getAll()) as $name => $block){ $expected = $block->getTypeId(); $actual = $reflect->getConstant($name); + self::assertNotFalse($actual, "VanillaBlocks::$name() does not have a BlockTypeIds constant"); self::assertSame($expected, $actual, "VanillaBlocks::$name() does not match BlockTypeIds::$name"); } } diff --git a/tests/phpunit/item/ItemTypeIdsTest.php b/tests/phpunit/item/ItemTypeIdsTest.php index 7ac8485fcc..7336780b33 100644 --- a/tests/phpunit/item/ItemTypeIdsTest.php +++ b/tests/phpunit/item/ItemTypeIdsTest.php @@ -54,6 +54,7 @@ class ItemTypeIdsTest extends TestCase{ } $expected = $item->getTypeId(); $actual = $reflect->getConstant($name); + self::assertNotFalse($actual, "VanillaItems::$name() does not have an ItemTypeIds constant"); self::assertSame($expected, $actual, "VanillaItems::$name() type ID does not match ItemTypeIds::$name"); } } From 2d9cee3d6232b12991a1ec1f9bf1cf8e8f7e72b3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 14 Nov 2024 23:14:23 +0000 Subject: [PATCH 1821/1858] Update Language dependency --- composer.json | 2 +- composer.lock | 14 +++---- src/lang/KnownTranslationFactory.php | 63 ++++++++++++++++++++++++++++ src/lang/KnownTranslationKeys.php | 13 ++++++ 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index ed5bb582f3..9747cb5678 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,7 @@ "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.7.0", - "pocketmine/locale-data": "~2.19.0", + "pocketmine/locale-data": "~2.21.0", "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", "pocketmine/nbt": "~1.0.0", diff --git a/composer.lock b/composer.lock index eb1061ff50..c1a0b0073a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b2fbf6e7a9d650341dc71fa4dd124681", + "content-hash": "476374fb3d22e26a97c1dea8c6736faf", "packages": [ { "name": "adhocore/json-comment", @@ -420,16 +420,16 @@ }, { "name": "pocketmine/locale-data", - "version": "2.19.6", + "version": "2.21.1", "source": { "type": "git", "url": "https://github.com/pmmp/Language.git", - "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e" + "reference": "fdba0f764d6281f64e5968dca94fdab96bf4e167" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/93e473e20e7f4515ecf45c5ef0f9155b9247a86e", - "reference": "93e473e20e7f4515ecf45c5ef0f9155b9247a86e", + "url": "https://api.github.com/repos/pmmp/Language/zipball/fdba0f764d6281f64e5968dca94fdab96bf4e167", + "reference": "fdba0f764d6281f64e5968dca94fdab96bf4e167", "shasum": "" }, "type": "library", @@ -437,9 +437,9 @@ "description": "Language resources used by PocketMine-MP", "support": { "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.19.6" + "source": "https://github.com/pmmp/Language/tree/2.21.1" }, - "time": "2023-08-08T16:53:23+00:00" + "time": "2024-11-14T23:11:22+00:00" }, { "name": "pocketmine/log", diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index ea8c2952e5..8153a80d6d 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -603,6 +603,31 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::COMMANDS_WHITELIST_USAGE, []); } + public static function commands_xp_failure_widthdrawXp() : Translatable{ + return new Translatable(KnownTranslationKeys::COMMANDS_XP_FAILURE_WIDTHDRAWXP, []); + } + + public static function commands_xp_success(Translatable|string $param0, Translatable|string $param1) : Translatable{ + return new Translatable(KnownTranslationKeys::COMMANDS_XP_SUCCESS, [ + 0 => $param0, + 1 => $param1, + ]); + } + + public static function commands_xp_success_levels(Translatable|string $param0, Translatable|string $param1) : Translatable{ + return new Translatable(KnownTranslationKeys::COMMANDS_XP_SUCCESS_LEVELS, [ + 0 => $param0, + 1 => $param1, + ]); + } + + public static function commands_xp_success_negative_levels(Translatable|string $param0, Translatable|string $param1) : Translatable{ + return new Translatable(KnownTranslationKeys::COMMANDS_XP_SUCCESS_NEGATIVE_LEVELS, [ + 0 => $param0, + 1 => $param1, + ]); + } + public static function death_attack_anvil(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::DEATH_ATTACK_ANVIL, [ 0 => $param0, @@ -667,6 +692,12 @@ final class KnownTranslationFactory{ ]); } + public static function death_attack_flyIntoWall(Translatable|string $param0) : Translatable{ + return new Translatable(KnownTranslationKeys::DEATH_ATTACK_FLYINTOWALL, [ + 0 => $param0, + ]); + } + public static function death_attack_generic(Translatable|string $param0) : Translatable{ return new Translatable(KnownTranslationKeys::DEATH_ATTACK_GENERIC, [ 0 => $param0, @@ -1025,6 +1056,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::ITEM_RECORD_CHIRP_DESC, []); } + public static function item_record_creator_desc() : Translatable{ + return new Translatable(KnownTranslationKeys::ITEM_RECORD_CREATOR_DESC, []); + } + + public static function item_record_creator_music_box_desc() : Translatable{ + return new Translatable(KnownTranslationKeys::ITEM_RECORD_CREATOR_MUSIC_BOX_DESC, []); + } + public static function item_record_far_desc() : Translatable{ return new Translatable(KnownTranslationKeys::ITEM_RECORD_FAR_DESC, []); } @@ -1045,6 +1084,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::ITEM_RECORD_PIGSTEP_DESC, []); } + public static function item_record_precipice_desc() : Translatable{ + return new Translatable(KnownTranslationKeys::ITEM_RECORD_PRECIPICE_DESC, []); + } + + public static function item_record_relic_desc() : Translatable{ + return new Translatable(KnownTranslationKeys::ITEM_RECORD_RELIC_DESC, []); + } + public static function item_record_stal_desc() : Translatable{ return new Translatable(KnownTranslationKeys::ITEM_RECORD_STAL_DESC, []); } @@ -1536,6 +1583,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_WHITELIST_DESCRIPTION, []); } + public static function pocketmine_command_xp_description() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_XP_DESCRIPTION, []); + } + + public static function pocketmine_command_xp_usage() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_XP_USAGE, []); + } + public static function pocketmine_crash_archive(Translatable|string $param0, Translatable|string $param1) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_CRASH_ARCHIVE, [ 0 => $param0, @@ -2056,6 +2111,14 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE, []); } + public static function pocketmine_permission_command_xp_other() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_XP_OTHER, []); + } + + public static function pocketmine_permission_command_xp_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_XP_SELF, []); + } + public static function pocketmine_permission_group_console() : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_CONSOLE, []); } diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index c834527306..4805d0c568 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -137,6 +137,10 @@ final class KnownTranslationKeys{ public const COMMANDS_WHITELIST_REMOVE_SUCCESS = "commands.whitelist.remove.success"; public const COMMANDS_WHITELIST_REMOVE_USAGE = "commands.whitelist.remove.usage"; public const COMMANDS_WHITELIST_USAGE = "commands.whitelist.usage"; + public const COMMANDS_XP_FAILURE_WIDTHDRAWXP = "commands.xp.failure.widthdrawXp"; + public const COMMANDS_XP_SUCCESS = "commands.xp.success"; + public const COMMANDS_XP_SUCCESS_LEVELS = "commands.xp.success.levels"; + public const COMMANDS_XP_SUCCESS_NEGATIVE_LEVELS = "commands.xp.success.negative.levels"; public const DEATH_ATTACK_ANVIL = "death.attack.anvil"; public const DEATH_ATTACK_ARROW = "death.attack.arrow"; public const DEATH_ATTACK_ARROW_ITEM = "death.attack.arrow.item"; @@ -147,6 +151,7 @@ final class KnownTranslationKeys{ public const DEATH_ATTACK_FALL = "death.attack.fall"; public const DEATH_ATTACK_FALLINGBLOCK = "death.attack.fallingBlock"; public const DEATH_ATTACK_FIREWORKS = "death.attack.fireworks"; + public const DEATH_ATTACK_FLYINTOWALL = "death.attack.flyIntoWall"; public const DEATH_ATTACK_GENERIC = "death.attack.generic"; public const DEATH_ATTACK_INFIRE = "death.attack.inFire"; public const DEATH_ATTACK_INWALL = "death.attack.inWall"; @@ -227,11 +232,15 @@ final class KnownTranslationKeys{ public const ITEM_RECORD_BLOCKS_DESC = "item.record_blocks.desc"; public const ITEM_RECORD_CAT_DESC = "item.record_cat.desc"; public const ITEM_RECORD_CHIRP_DESC = "item.record_chirp.desc"; + public const ITEM_RECORD_CREATOR_DESC = "item.record_creator.desc"; + public const ITEM_RECORD_CREATOR_MUSIC_BOX_DESC = "item.record_creator_music_box.desc"; public const ITEM_RECORD_FAR_DESC = "item.record_far.desc"; public const ITEM_RECORD_MALL_DESC = "item.record_mall.desc"; public const ITEM_RECORD_MELLOHI_DESC = "item.record_mellohi.desc"; public const ITEM_RECORD_OTHERSIDE_DESC = "item.record_otherside.desc"; public const ITEM_RECORD_PIGSTEP_DESC = "item.record_pigstep.desc"; + public const ITEM_RECORD_PRECIPICE_DESC = "item.record_precipice.desc"; + public const ITEM_RECORD_RELIC_DESC = "item.record_relic.desc"; public const ITEM_RECORD_STAL_DESC = "item.record_stal.desc"; public const ITEM_RECORD_STRAD_DESC = "item.record_strad.desc"; public const ITEM_RECORD_WAIT_DESC = "item.record_wait.desc"; @@ -336,6 +345,8 @@ final class KnownTranslationKeys{ public const POCKETMINE_COMMAND_VERSION_SERVERSOFTWAREVERSION = "pocketmine.command.version.serverSoftwareVersion"; public const POCKETMINE_COMMAND_VERSION_USAGE = "pocketmine.command.version.usage"; public const POCKETMINE_COMMAND_WHITELIST_DESCRIPTION = "pocketmine.command.whitelist.description"; + public const POCKETMINE_COMMAND_XP_DESCRIPTION = "pocketmine.command.xp.description"; + public const POCKETMINE_COMMAND_XP_USAGE = "pocketmine.command.xp.usage"; public const POCKETMINE_CRASH_ARCHIVE = "pocketmine.crash.archive"; public const POCKETMINE_CRASH_CREATE = "pocketmine.crash.create"; public const POCKETMINE_CRASH_ERROR = "pocketmine.crash.error"; @@ -449,6 +460,8 @@ final class KnownTranslationKeys{ public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_LIST = "pocketmine.permission.command.whitelist.list"; public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_RELOAD = "pocketmine.permission.command.whitelist.reload"; public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE = "pocketmine.permission.command.whitelist.remove"; + public const POCKETMINE_PERMISSION_COMMAND_XP_OTHER = "pocketmine.permission.command.xp.other"; + public const POCKETMINE_PERMISSION_COMMAND_XP_SELF = "pocketmine.permission.command.xp.self"; public const POCKETMINE_PERMISSION_GROUP_CONSOLE = "pocketmine.permission.group.console"; public const POCKETMINE_PERMISSION_GROUP_OPERATOR = "pocketmine.permission.group.operator"; public const POCKETMINE_PERMISSION_GROUP_USER = "pocketmine.permission.group.user"; From b5469dede222e33cbfa3371eace28d0f9058f7b8 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Fri, 15 Nov 2024 03:10:43 +0300 Subject: [PATCH 1822/1858] Flowable blocks now can't be placed inside liquid (#5392) --- src/block/Flowable.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/block/Flowable.php b/src/block/Flowable.php index 795fe27561..0328bcd745 100644 --- a/src/block/Flowable.php +++ b/src/block/Flowable.php @@ -25,6 +25,7 @@ namespace pocketmine\block; use pocketmine\block\utils\SupportType; use pocketmine\math\AxisAlignedBB; +use pocketmine\math\Vector3; /** * "Flowable" blocks are destroyed if water flows into the same space as the block. These blocks usually don't have any @@ -40,6 +41,11 @@ abstract class Flowable extends Transparent{ return false; } + public function canBePlacedAt(Block $blockReplace, Vector3 $clickVector, int $face, bool $isClickedBlock) : bool{ + return (!$this->canBeFlowedInto() || !$blockReplace instanceof Liquid) && + parent::canBePlacedAt($blockReplace, $clickVector, $face, $isClickedBlock); + } + /** * @return AxisAlignedBB[] */ From 0b0c425805a493478388222e6d961084cc593803 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:47:26 +0300 Subject: [PATCH 1823/1858] Extract glow lichen multi face logic into traits (#6396) This will be useful for future block additions --- src/block/GlowLichen.php | 95 ++--------------------- src/block/utils/MultiAnyFacingTrait.php | 72 ++++++++++++++++++ src/block/utils/MultiAnySupportTrait.php | 96 ++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 88 deletions(-) create mode 100644 src/block/utils/MultiAnyFacingTrait.php create mode 100644 src/block/utils/MultiAnySupportTrait.php diff --git a/src/block/GlowLichen.php b/src/block/GlowLichen.php index de66ccad76..d30e253958 100644 --- a/src/block/GlowLichen.php +++ b/src/block/GlowLichen.php @@ -24,60 +24,20 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockEventHelper; +use pocketmine\block\utils\MultiAnySupportTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Fertilizer; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\world\BlockTransaction; use pocketmine\world\World; -use function array_key_first; use function count; use function shuffle; class GlowLichen extends Transparent{ - - /** @var int[] */ - protected array $faces = []; - - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->facingFlags($this->faces); - } - - /** @return int[] */ - public function getFaces() : array{ return $this->faces; } - - public function hasFace(int $face) : bool{ - return isset($this->faces[$face]); - } - - /** - * @param int[] $faces - * @return $this - */ - public function setFaces(array $faces) : self{ - $uniqueFaces = []; - foreach($faces as $face){ - Facing::validate($face); - $uniqueFaces[$face] = $face; - } - $this->faces = $uniqueFaces; - return $this; - } - - /** @return $this */ - public function setFace(int $face, bool $value) : self{ - Facing::validate($face); - if($value){ - $this->faces[$face] = $face; - }else{ - unset($this->faces[$face]); - } - return $this; - } + use MultiAnySupportTrait; public function getLightLevel() : int{ return 7; @@ -102,39 +62,11 @@ class GlowLichen extends Transparent{ return true; } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ - $this->faces = $blockReplace instanceof GlowLichen ? $blockReplace->faces : []; - $availableFaces = $this->getAvailableFaces(); - - if(count($availableFaces) === 0){ - return false; - } - - $opposite = Facing::opposite($face); - $placedFace = isset($availableFaces[$opposite]) ? $opposite : array_key_first($availableFaces); - $this->faces[$placedFace] = $placedFace; - - return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); - } - - public function onNearbyBlockChange() : void{ - $changed = false; - - foreach($this->faces as $face){ - if($this->getAdjacentSupportType($face) !== SupportType::FULL){ - unset($this->faces[$face]); - $changed = true; - } - } - - if($changed){ - $world = $this->position->getWorld(); - if(count($this->faces) === 0){ - $world->useBreakOn($this->position); - }else{ - $world->setBlock($this->position, $this); - } - } + /** + * @return int[] + */ + protected function getInitialPlaceFaces(Block $blockReplace) : array{ + return $blockReplace instanceof GlowLichen ? $blockReplace->faces : []; } private function getSpreadBlock(Block $replace, int $spreadFace) : ?Block{ @@ -261,17 +193,4 @@ class GlowLichen extends Transparent{ public function getFlammability() : int{ return 100; } - - /** - * @return array $faces - */ - private function getAvailableFaces() : array{ - $faces = []; - foreach(Facing::ALL as $face){ - if(!$this->hasFace($face) && $this->getAdjacentSupportType($face) === SupportType::FULL){ - $faces[$face] = $face; - } - } - return $faces; - } } diff --git a/src/block/utils/MultiAnyFacingTrait.php b/src/block/utils/MultiAnyFacingTrait.php new file mode 100644 index 0000000000..66f26d9800 --- /dev/null +++ b/src/block/utils/MultiAnyFacingTrait.php @@ -0,0 +1,72 @@ +facingFlags($this->faces); + } + + /** @return int[] */ + public function getFaces() : array{ return $this->faces; } + + public function hasFace(int $face) : bool{ + return isset($this->faces[$face]); + } + + /** + * @param int[] $faces + * @return $this + */ + public function setFaces(array $faces) : self{ + $uniqueFaces = []; + foreach($faces as $face){ + Facing::validate($face); + $uniqueFaces[$face] = $face; + } + $this->faces = $uniqueFaces; + return $this; + } + + /** @return $this */ + public function setFace(int $face, bool $value) : self{ + Facing::validate($face); + if($value){ + $this->faces[$face] = $face; + }else{ + unset($this->faces[$face]); + } + return $this; + } +} diff --git a/src/block/utils/MultiAnySupportTrait.php b/src/block/utils/MultiAnySupportTrait.php new file mode 100644 index 0000000000..ae1da7befe --- /dev/null +++ b/src/block/utils/MultiAnySupportTrait.php @@ -0,0 +1,96 @@ +faces = $this->getInitialPlaceFaces($blockReplace); + $availableFaces = $this->getAvailableFaces(); + + if(count($availableFaces) === 0){ + return false; + } + + $opposite = Facing::opposite($face); + $placedFace = isset($availableFaces[$opposite]) ? $opposite : array_key_first($availableFaces); + $this->faces[$placedFace] = $placedFace; + + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); + } + + public function onNearbyBlockChange() : void{ + $changed = false; + + foreach($this->faces as $face){ + if($this->getAdjacentSupportType($face) !== SupportType::FULL){ + unset($this->faces[$face]); + $changed = true; + } + } + + if($changed){ + $world = $this->position->getWorld(); + if(count($this->faces) === 0){ + $world->useBreakOn($this->position); + }else{ + $world->setBlock($this->position, $this); + } + } + } + + /** + * @return array $faces + */ + private function getAvailableFaces() : array{ + $faces = []; + foreach(Facing::ALL as $face){ + if(!$this->hasFace($face) && $this->getAdjacentSupportType($face) === SupportType::FULL){ + $faces[$face] = $face; + } + } + return $faces; + } +} From a75d4687ce7e75e9cbf432c1762b5c7d82b66ac4 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Fri, 15 Nov 2024 19:09:55 +0300 Subject: [PATCH 1824/1858] Implemented vanilla /xp command (#6429) --- src/command/SimpleCommandMap.php | 4 +- src/command/defaults/XpCommand.php | 89 +++++++++++++++++++++++ src/permission/DefaultPermissionNames.php | 2 + src/permission/DefaultPermissions.php | 2 + 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/command/defaults/XpCommand.php diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 1268e715b7..a6a7e303bb 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -64,6 +64,7 @@ use pocketmine\command\defaults\TransferServerCommand; use pocketmine\command\defaults\VanillaCommand; use pocketmine\command\defaults\VersionCommand; use pocketmine\command\defaults\WhitelistCommand; +use pocketmine\command\defaults\XpCommand; use pocketmine\command\utils\CommandStringHelper; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; @@ -128,7 +129,8 @@ class SimpleCommandMap implements CommandMap{ new TitleCommand(), new TransferServerCommand(), new VersionCommand(), - new WhitelistCommand() + new WhitelistCommand(), + new XpCommand(), ]); } diff --git a/src/command/defaults/XpCommand.php b/src/command/defaults/XpCommand.php new file mode 100644 index 0000000000..cb03523657 --- /dev/null +++ b/src/command/defaults/XpCommand.php @@ -0,0 +1,89 @@ +setPermissions([ + DefaultPermissionNames::COMMAND_XP_SELF, + DefaultPermissionNames::COMMAND_XP_OTHER + ]); + } + + public function execute(CommandSender $sender, string $commandLabel, array $args){ + if(count($args) < 1){ + throw new InvalidCommandSyntaxException(); + } + + $player = $this->fetchPermittedPlayerTarget($sender, $args[1] ?? null, DefaultPermissionNames::COMMAND_XP_SELF, DefaultPermissionNames::COMMAND_XP_OTHER); + if($player === null){ + return true; + } + + $xpManager = $player->getXpManager(); + if(str_ends_with($args[0], "L")){ + $xpLevelAttr = $player->getAttributeMap()->get(Attribute::EXPERIENCE_LEVEL) ?? throw new AssumptionFailedError(); + $maxXpLevel = (int) $xpLevelAttr->getMaxValue(); + $currentXpLevel = $xpManager->getXpLevel(); + $xpLevels = $this->getInteger($sender, substr($args[0], 0, -1), -$currentXpLevel, $maxXpLevel - $currentXpLevel); + if($xpLevels >= 0){ + $xpManager->addXpLevels($xpLevels, false); + $sender->sendMessage(KnownTranslationFactory::commands_xp_success_levels((string) $xpLevels, $player->getName())); + }else{ + $xpLevels = abs($xpLevels); + $xpManager->subtractXpLevels($xpLevels); + $sender->sendMessage(KnownTranslationFactory::commands_xp_success_negative_levels((string) $xpLevels, $player->getName())); + } + }else{ + $xp = $this->getInteger($sender, $args[0], max: Limits::INT32_MAX); + if($xp < 0){ + $sender->sendMessage(KnownTranslationFactory::commands_xp_failure_widthdrawXp()->prefix(TextFormat::RED)); + }else{ + $xpManager->addXp($xp, false); + $sender->sendMessage(KnownTranslationFactory::commands_xp_success((string) $xp, $player->getName())); + } + } + + return true; + } +} diff --git a/src/permission/DefaultPermissionNames.php b/src/permission/DefaultPermissionNames.php index fab532e286..a916e813c0 100644 --- a/src/permission/DefaultPermissionNames.php +++ b/src/permission/DefaultPermissionNames.php @@ -84,6 +84,8 @@ final class DefaultPermissionNames{ public const COMMAND_WHITELIST_LIST = "pocketmine.command.whitelist.list"; public const COMMAND_WHITELIST_RELOAD = "pocketmine.command.whitelist.reload"; public const COMMAND_WHITELIST_REMOVE = "pocketmine.command.whitelist.remove"; + public const COMMAND_XP_OTHER = "pocketmine.command.xp.other"; + public const COMMAND_XP_SELF = "pocketmine.command.xp.self"; public const GROUP_CONSOLE = "pocketmine.group.console"; public const GROUP_OPERATOR = "pocketmine.group.operator"; public const GROUP_USER = "pocketmine.group.user"; diff --git a/src/permission/DefaultPermissions.php b/src/permission/DefaultPermissions.php index c72765af6b..1030e9ff8c 100644 --- a/src/permission/DefaultPermissions.php +++ b/src/permission/DefaultPermissions.php @@ -112,5 +112,7 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(Names::COMMAND_WHITELIST_LIST, l10n::pocketmine_permission_command_whitelist_list()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_WHITELIST_RELOAD, l10n::pocketmine_permission_command_whitelist_reload()), [$operatorRoot]); self::registerPermission(new Permission(Names::COMMAND_WHITELIST_REMOVE, l10n::pocketmine_permission_command_whitelist_remove()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_XP_OTHER, l10n::pocketmine_permission_command_xp_other()), [$operatorRoot]); + self::registerPermission(new Permission(Names::COMMAND_XP_SELF, l10n::pocketmine_permission_command_xp_self()), [$operatorRoot]); } } From 8474eaf5f105ed93bae462cdcb370768098ee4bf Mon Sep 17 00:00:00 2001 From: bonbionseker <167460154+bonbionseker@users.noreply.github.com> Date: Fri, 15 Nov 2024 19:27:27 +0300 Subject: [PATCH 1825/1858] Adjust Sugar Cane to break when there is no water (#6486) --- src/block/Sugarcane.php | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 97b4aee9c1..2da2dc9b97 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -36,7 +36,9 @@ use pocketmine\world\Position; class Sugarcane extends Flowable{ use AgeableTrait; - use StaticSupportTrait; + use StaticSupportTrait { + onNearbyBlockChange as onSupportBlockChange; + } public const MAX_AGE = 15; @@ -97,7 +99,13 @@ class Sugarcane extends Flowable{ } public function onRandomTick() : void{ - if(!$this->getSide(Facing::DOWN)->hasSameTypeId($this)){ + $down = $this->getSide(Facing::DOWN); + if(!$down->hasSameTypeId($this)){ + if(!$this->hasNearbyWater($down)){ + $this->position->getWorld()->useBreakOn($this->position, createParticles: true); + return; + } + if($this->age === self::MAX_AGE){ $this->grow($this->position); }else{ @@ -123,4 +131,23 @@ class Sugarcane extends Flowable{ return false; } + + private function hasNearbyWater(Block $down) : bool{ + foreach($down->getHorizontalSides() as $sideBlock){ + $blockId = $sideBlock->getTypeId(); + if($blockId === BlockTypeIds::WATER || $blockId === BlockTypeIds::FROSTED_ICE){ + return true; + } + } + return false; + } + + public function onNearbyBlockChange() : void{ + $down = $this->getSide(Facing::DOWN); + if(!$down->hasSameTypeId($this) && !$this->hasNearbyWater($down)){ + $this->position->getWorld()->useBreakOn($this->position, createParticles: true); + }else{ + $this->onSupportBlockChange(); + } + } } From 8a693f2a4c4b2fcd29788584cbe5b6af9a9470fd Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Fri, 15 Nov 2024 20:08:54 +0000 Subject: [PATCH 1826/1858] team-pr-auto-approve: Use RestrictedActions auto approver --- .github/workflows/team-pr-auto-approve.yml | 31 +++++++++------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml index a582be3280..ad28123836 100644 --- a/.github/workflows/team-pr-auto-approve.yml +++ b/.github/workflows/team-pr-auto-approve.yml @@ -13,30 +13,25 @@ on: - reopened - ready_for_review -permissions: - pull-requests: write - jobs: approve: name: Auto approve runs-on: ubuntu-latest steps: - - name: Check if PR author has write access - id: check-permission - uses: actions-cool/check-user-permission@v2 + - name: Generate access token + id: generate-token + uses: actions/create-github-app-token@v1 with: - token: ${{ secrets.GITHUB_TOKEN }} - require: write - username: ${{ github.event.pull_request.user.login }} - #technically this would be fine for dependabot but generally bots don't count as team members - check-bot: true + app-id: ${{ vars.RESTRICTED_ACTIONS_DISPATCH_ID }} + private-key: ${{ secrets.RESTRICTED_ACTIONS_DISPATCH_KEY }} + owner: ${{ github.repository_owner }} + repositories: RestrictedActions - #TODO: Some way to avoid unnecessary repeated reviews would be nice here - - - name: Approve PR if authorized - if: steps.check-permission.outputs.require-result == 'true' && steps.check-permission.outputs.check-result == 'false' - uses: juliangruber/approve-pull-request-action@v2 + - name: Dispatch restricted action + uses: peter-evans/repository-dispatch@v3 with: - github-token: ${{ secrets.GITHUB_TOKEN }} - number: ${{ github.event.pull_request.number }} + token: ${{ steps.generate-token.outputs.token }} + repository: ${{ github.repository_owner }}/RestrictedActions + event-type: auto_approve_collaborator_pr + client-payload: '{"repo": "${{ github.repository }}", "pull_request_id": "${{ github.event.pull_request.number }}" }' From 4331f69b9c6a3366b3a8b7335bfea8139c0d88ef Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Fri, 15 Nov 2024 20:44:51 +0000 Subject: [PATCH 1827/1858] Update team-pr-auto-approve.yml --- .github/workflows/team-pr-auto-approve.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml index ad28123836..8f40b16e3e 100644 --- a/.github/workflows/team-pr-auto-approve.yml +++ b/.github/workflows/team-pr-auto-approve.yml @@ -14,8 +14,8 @@ on: - ready_for_review jobs: - approve: - name: Auto approve + dispatch: + name: Request approval runs-on: ubuntu-latest steps: From 4b630cb72615e6a4f02cbaca7778fd0877abcba9 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Fri, 15 Nov 2024 21:14:21 +0000 Subject: [PATCH 1828/1858] start.sh: print warnings on unusual exit codes from the server process (#6497) --- start.sh | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/start.sh b/start.sh index 4d47871143..8f458b4e6d 100755 --- a/start.sh +++ b/start.sh @@ -44,6 +44,27 @@ fi LOOPS=0 +handle_exit_code() { + local exitcode=$1 + if [ "$exitcode" -eq 134 ] || [ "$exitcode" -eq 139 ]; then #SIGABRT/SIGSEGV + echo "" + echo "ERROR: The server process was killed due to a critical error (code $exitcode) which could indicate a problem with PHP." + echo "Updating your PHP binary is recommended." + echo "If this keeps happening, please open a bug report." + echo "" + elif [ "$exitcode" -eq 143 ]; then #SIGKILL, maybe user intervention + echo "" + echo "WARNING: Server was forcibly killed!" + echo "If you didn't kill the server manually, this probably means the server used too much memory and was killed by the system's OOM Killer." + echo "Please ensure your system has enough available RAM." + echo "" + elif [ "$exitcode" -ne 0 ] && [ "$exitcode" -ne 137 ]; then #normal exit / SIGTERM + echo "" + echo "WARNING: Server did not shut down correctly! (code $exitcode)" + echo "" + fi +} + set +e if [ "$DO_LOOP" == "yes" ]; then @@ -52,11 +73,15 @@ if [ "$DO_LOOP" == "yes" ]; then echo "Restarted $LOOPS times" fi "$PHP_BINARY" "$POCKETMINE_FILE" "$@" + handle_exit_code $? echo "To escape the loop, press CTRL+C now. Otherwise, wait 5 seconds for the server to restart." echo "" sleep 5 ((LOOPS++)) done else - exec "$PHP_BINARY" "$POCKETMINE_FILE" "$@" + "$PHP_BINARY" "$POCKETMINE_FILE" "$@" + exitcode=$? + handle_exit_code $exitcode + exit $exitcode fi From ff695a5f97182226d9c7d28ac317128672fc9fce Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Fri, 15 Nov 2024 21:19:54 +0000 Subject: [PATCH 1829/1858] PlayerInteractEvent: added APIs to independently control reaction of item and block (#4683) This allows, for example, banning the usage of spawn eggs, without preventing opening of doors, without the need for item ID whitelists. It also allows customizing the behaviour of item and block interactions when sneaking - it's now possible to force spawn eggs to work when sneaking, or force containers to open. Finally, this also allows preventing any interaction at all without preventing block placement (by setting both to false). Since cancelling the event will typically prevent placement too (which might not be desired). Side note: Blocks are now always synced when right-clicking on a block. This differs from the previous behaviour, where the blocks were only synced when the action "failed". However, since this change introduces a situation where the action may succeed but have different results than the client expects, it's best to just always sync blocks in this situation. Fixes #3267 --- src/event/player/PlayerInteractEvent.php | 27 +++++++++++++++++++ .../mcpe/handler/InGamePacketHandler.php | 19 +++++++------ src/world/World.php | 14 +++++++--- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/event/player/PlayerInteractEvent.php b/src/event/player/PlayerInteractEvent.php index 6119d5e99c..46daf70813 100644 --- a/src/event/player/PlayerInteractEvent.php +++ b/src/event/player/PlayerInteractEvent.php @@ -42,6 +42,9 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{ protected Vector3 $touchVector; + protected bool $useItem = true; + protected bool $useBlock = true; + public function __construct( Player $player, protected Item $item, @@ -73,4 +76,28 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{ public function getFace() : int{ return $this->blockFace; } + + /** + * Returns whether the item may react to the interaction. If disabled, items such as spawn eggs will not activate. + * This does NOT prevent blocks from being placed - it makes the item behave as if the player is sneaking. + */ + public function useItem() : bool{ return $this->useItem; } + + /** + * Sets whether the used item may react to the interaction. If false, items such as spawn eggs will not activate. + * This does NOT prevent blocks from being placed - it makes the item behave as if the player is sneaking. + */ + public function setUseItem(bool $useItem) : void{ $this->useItem = $useItem; } + + /** + * Returns whether the block may react to the interaction. If false, doors, fence gates and trapdoors will not + * respond, containers will not open, etc. + */ + public function useBlock() : bool{ return $this->useBlock; } + + /** + * Sets whether the block may react to the interaction. If false, doors, fence gates and trapdoors will not + * respond, containers will not open, etc. + */ + public function setUseBlock(bool $useBlock) : void{ $this->useBlock = $useBlock; } } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index c92db31331..9e0039db4e 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -493,15 +493,18 @@ class InGamePacketHandler extends PacketHandler{ $blockPos = $data->getBlockPosition(); $vBlockPos = new Vector3($blockPos->getX(), $blockPos->getY(), $blockPos->getZ()); - if(!$this->player->interactBlock($vBlockPos, $data->getFace(), $clickPos)){ - $this->onFailedBlockAction($vBlockPos, $data->getFace()); - } + $this->player->interactBlock($vBlockPos, $data->getFace(), $clickPos); + //always sync this in case plugins caused a different result than the client expected + //we *could* try to enhance detection of plugin-altered behaviour, but this would require propagating + //more information up the stack. For now I think this is good enough. + //if only the client would tell us what blocks it thinks changed... + $this->syncBlocksNearby($vBlockPos, $data->getFace()); return true; case UseItemTransactionData::ACTION_BREAK_BLOCK: $blockPos = $data->getBlockPosition(); $vBlockPos = new Vector3($blockPos->getX(), $blockPos->getY(), $blockPos->getZ()); if(!$this->player->breakBlock($vBlockPos)){ - $this->onFailedBlockAction($vBlockPos, null); + $this->syncBlocksNearby($vBlockPos, null); } return true; case UseItemTransactionData::ACTION_CLICK_AIR: @@ -529,9 +532,9 @@ class InGamePacketHandler extends PacketHandler{ } /** - * Internal function used to execute rollbacks when an action fails on a block. + * Syncs blocks nearby to ensure that the client and server agree on the world's blocks after a block interaction. */ - private function onFailedBlockAction(Vector3 $blockPos, ?int $face) : void{ + private function syncBlocksNearby(Vector3 $blockPos, ?int $face) : void{ if($blockPos->distanceSquared($this->player->getLocation()) < 10000){ $blocks = $blockPos->sidesArray(); if($face !== null){ @@ -682,7 +685,7 @@ class InGamePacketHandler extends PacketHandler{ case PlayerAction::START_BREAK: self::validateFacing($face); if(!$this->player->attackBlock($pos, $face)){ - $this->onFailedBlockAction($pos, $face); + $this->syncBlocksNearby($pos, $face); } break; @@ -998,7 +1001,7 @@ class InGamePacketHandler extends PacketHandler{ $lectern = $world->getBlockAt($pos->getX(), $pos->getY(), $pos->getZ()); if($lectern instanceof Lectern && $this->player->canInteract($lectern->getPosition(), 15)){ if(!$lectern->onPageTurn($packet->page)){ - $this->onFailedBlockAction($lectern->getPosition(), null); + $this->syncBlocksNearby($lectern->getPosition(), null); } return true; } diff --git a/src/world/World.php b/src/world/World.php index fbfa05b71d..7024101914 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2173,19 +2173,25 @@ class World implements ChunkManager{ if($player !== null){ $ev = new PlayerInteractEvent($player, $item, $blockClicked, $clickVector, $face, PlayerInteractEvent::RIGHT_CLICK_BLOCK); + if($player->isSneaking()){ + $ev->setUseItem(false); + $ev->setUseBlock($item->isNull()); //opening doors is still possible when sneaking if using an empty hand + } if($player->isSpectator()){ $ev->cancel(); //set it to cancelled so plugins can bypass this } $ev->call(); if(!$ev->isCancelled()){ - if((!$player->isSneaking() || $item->isNull()) && $blockClicked->onInteract($item, $face, $clickVector, $player, $returnedItems)){ + if($ev->useBlock() && $blockClicked->onInteract($item, $face, $clickVector, $player, $returnedItems)){ return true; } - $result = $item->onInteractBlock($player, $blockReplace, $blockClicked, $face, $clickVector, $returnedItems); - if($result !== ItemUseResult::NONE){ - return $result === ItemUseResult::SUCCESS; + if($ev->useItem()){ + $result = $item->onInteractBlock($player, $blockReplace, $blockClicked, $face, $clickVector, $returnedItems); + if($result !== ItemUseResult::NONE){ + return $result === ItemUseResult::SUCCESS; + } } }else{ return false; From d3add78d3e5d949a26af5c63eb3e0e8f8c0f2ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Le=C3=B3n?= <58715544+JavierLeon9966@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:27:10 -0300 Subject: [PATCH 1830/1858] Add support for basic entity picking via middle-click (#5397) Support for more advanced stuff like NBT copying wasn't added in this PR, as the NBT used by PM is currently an inconsistent mess and doesn't play nice with vanilla. In the interests of avoiding this mess propagating, it's been left for another time. Adds PlayerEntityPickEvent a la PlayerBlockPickEvent and Entity->getPickedItem(). --- src/entity/Entity.php | 8 +++ src/entity/Squid.php | 5 ++ src/entity/Villager.php | 6 ++ src/entity/Zombie.php | 5 ++ src/entity/object/FallingBlock.php | 5 ++ src/entity/object/Painting.php | 5 ++ src/entity/object/PrimedTNT.php | 6 ++ src/event/player/PlayerEntityPickEvent.php | 53 +++++++++++++++ .../mcpe/handler/InGamePacketHandler.php | 2 +- src/player/Player.php | 66 ++++++++++++++----- 10 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 src/event/player/PlayerEntityPickEvent.php diff --git a/src/entity/Entity.php b/src/entity/Entity.php index c55a8716ca..68f5cbdd3f 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -35,6 +35,7 @@ use pocketmine\event\entity\EntityMotionEvent; use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\entity\EntitySpawnEvent; use pocketmine\event\entity\EntityTeleportEvent; +use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector2; @@ -1560,6 +1561,13 @@ abstract class Entity{ $this->hasSpawned = []; } + /** + * Returns the item that players will equip when middle-clicking on this entity. + */ + public function getPickedItem() : ?Item{ + return null; + } + /** * Flags the entity to be removed from the world on the next tick. */ diff --git a/src/entity/Squid.php b/src/entity/Squid.php index 75c50061b9..a0f3fef48b 100644 --- a/src/entity/Squid.php +++ b/src/entity/Squid.php @@ -26,6 +26,7 @@ namespace pocketmine\entity; use pocketmine\entity\animation\SquidInkCloudAnimation; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; @@ -124,4 +125,8 @@ class Squid extends WaterAnimal{ VanillaItems::INK_SAC()->setCount(mt_rand(1, 3)) ]; } + + public function getPickedItem() : ?Item{ + return VanillaItems::SQUID_SPAWN_EGG(); + } } diff --git a/src/entity/Villager.php b/src/entity/Villager.php index 376401a5df..fee65b0143 100644 --- a/src/entity/Villager.php +++ b/src/entity/Villager.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\entity; +use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; @@ -87,6 +89,10 @@ class Villager extends Living implements Ageable{ return $this->baby; } + public function getPickedItem() : ?Item{ + return VanillaItems::VILLAGER_SPAWN_EGG(); + } + protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); $properties->setGenericFlag(EntityMetadataFlags::BABY, $this->baby); diff --git a/src/entity/Zombie.php b/src/entity/Zombie.php index 18fc2207e7..159a2dd258 100644 --- a/src/entity/Zombie.php +++ b/src/entity/Zombie.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\entity; +use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use function mt_rand; @@ -65,4 +66,8 @@ class Zombie extends Living{ //TODO: check for equipment and whether it's a baby return 5; } + + public function getPickedItem() : ?Item{ + return VanillaItems::ZOMBIE_SPAWN_EGG(); + } } diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 9d8af89347..66d4049f88 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -35,6 +35,7 @@ use pocketmine\entity\Location; use pocketmine\event\entity\EntityBlockChangeEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; @@ -194,6 +195,10 @@ class FallingBlock extends Entity{ return $nbt; } + public function getPickedItem() : ?Item{ + return $this->block->asItem(); + } + protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); diff --git a/src/entity/object/Painting.php b/src/entity/object/Painting.php index f6449883c7..641d040510 100644 --- a/src/entity/object/Painting.php +++ b/src/entity/object/Painting.php @@ -28,6 +28,7 @@ use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Location; use pocketmine\event\entity\EntityDamageByEntityEvent; +use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -165,6 +166,10 @@ class Painting extends Entity{ )); } + public function getPickedItem() : ?Item{ + return VanillaItems::PAINTING(); + } + /** * Returns the painting motive (which image is displayed on the painting) */ diff --git a/src/entity/object/PrimedTNT.php b/src/entity/object/PrimedTNT.php index ec621adfb8..af3c979228 100644 --- a/src/entity/object/PrimedTNT.php +++ b/src/entity/object/PrimedTNT.php @@ -23,11 +23,13 @@ declare(strict_types=1); namespace pocketmine\entity\object; +use pocketmine\block\VanillaBlocks; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Explosive; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityPreExplodeEvent; +use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; @@ -127,6 +129,10 @@ class PrimedTNT extends Entity implements Explosive{ } } + public function getPickedItem() : ?Item{ + return VanillaBlocks::TNT()->setWorksUnderwater($this->worksUnderwater)->asItem(); + } + protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); diff --git a/src/event/player/PlayerEntityPickEvent.php b/src/event/player/PlayerEntityPickEvent.php new file mode 100644 index 0000000000..3c742d6c48 --- /dev/null +++ b/src/event/player/PlayerEntityPickEvent.php @@ -0,0 +1,53 @@ +player = $player; + } + + public function getEntity() : Entity{ + return $this->entityClicked; + } + + public function getResultItem() : Item{ + return $this->resultItem; + } +} diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 9e0039db4e..e74eb87c61 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -671,7 +671,7 @@ class InGamePacketHandler extends PacketHandler{ } public function handleActorPickRequest(ActorPickRequestPacket $packet) : bool{ - return false; //TODO + return $this->player->pickEntity($packet->actorUniqueId); } public function handlePlayerAction(PlayerActionPacket $packet) : bool{ diff --git a/src/player/Player.php b/src/player/Player.php index 192e26a5f9..999c07a935 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -57,6 +57,7 @@ use pocketmine\event\player\PlayerDisplayNameChangeEvent; use pocketmine\event\player\PlayerDropItemEvent; use pocketmine\event\player\PlayerEmoteEvent; use pocketmine\event\player\PlayerEntityInteractEvent; +use pocketmine\event\player\PlayerEntityPickEvent; use pocketmine\event\player\PlayerExhaustEvent; use pocketmine\event\player\PlayerGameModeChangeEvent; use pocketmine\event\player\PlayerInteractEvent; @@ -1709,29 +1710,58 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $ev->call(); if(!$ev->isCancelled()){ - if($existingSlot !== -1){ - if($existingSlot < $this->inventory->getHotbarSize()){ - $this->inventory->setHeldItemIndex($existingSlot); - }else{ - $this->inventory->swap($this->inventory->getHeldItemIndex(), $existingSlot); - } - }else{ - $firstEmpty = $this->inventory->firstEmpty(); - if($firstEmpty === -1){ //full inventory - $this->inventory->setItemInHand($item); - }elseif($firstEmpty < $this->inventory->getHotbarSize()){ - $this->inventory->setItem($firstEmpty, $item); - $this->inventory->setHeldItemIndex($firstEmpty); - }else{ - $this->inventory->swap($this->inventory->getHeldItemIndex(), $firstEmpty); - $this->inventory->setItemInHand($item); - } - } + $this->equipOrAddPickedItem($existingSlot, $item); } return true; } + public function pickEntity(int $entityId) : bool{ + $entity = $this->getWorld()->getEntity($entityId); + if($entity === null){ + return true; + } + + $item = $entity->getPickedItem(); + if($item === null){ + return true; + } + + $ev = new PlayerEntityPickEvent($this, $entity, $item); + $existingSlot = $this->inventory->first($item); + if($existingSlot === -1 && ($this->hasFiniteResources() || $this->isSpectator())){ + $ev->cancel(); + } + $ev->call(); + + if(!$ev->isCancelled()){ + $this->equipOrAddPickedItem($existingSlot, $item); + } + + return true; + } + + private function equipOrAddPickedItem(int $existingSlot, Item $item) : void{ + if($existingSlot !== -1){ + if($existingSlot < $this->inventory->getHotbarSize()){ + $this->inventory->setHeldItemIndex($existingSlot); + }else{ + $this->inventory->swap($this->inventory->getHeldItemIndex(), $existingSlot); + } + }else{ + $firstEmpty = $this->inventory->firstEmpty(); + if($firstEmpty === -1){ //full inventory + $this->inventory->setItemInHand($item); + }elseif($firstEmpty < $this->inventory->getHotbarSize()){ + $this->inventory->setItem($firstEmpty, $item); + $this->inventory->setHeldItemIndex($firstEmpty); + }else{ + $this->inventory->swap($this->inventory->getHeldItemIndex(), $firstEmpty); + $this->inventory->setItemInHand($item); + } + } + } + /** * Performs a left-click (attack) action on the block. * From 48a908ee8caf3d41df694def05912dc5867504d9 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sat, 16 Nov 2024 01:36:51 +0000 Subject: [PATCH 1831/1858] maybe making this specific to gameplay wasn't a good idea --- .github/PULL_REQUEST_TEMPLATE.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c27ea7a471..82fd81a1de 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,11 +24,9 @@ -## In-Game Testing +## Tests From e77f2c5198ebe58b06f3f857674b0c8588c7f250 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:57:57 +0300 Subject: [PATCH 1832/1858] Implemented End Crystal (#4715) Co-authored-by: Dylan T. --- .../ItemSerializerDeserializerRegistrar.php | 1 + src/entity/EntityFactory.php | 5 + src/entity/object/EndCrystal.php | 140 ++++++++++++++++++ src/entity/projectile/Projectile.php | 3 +- src/item/EndCrystal.php | 59 ++++++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 1 + src/item/VanillaItems.php | 2 + 8 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 src/entity/object/EndCrystal.php create mode 100644 src/item/EndCrystal.php diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 661a4ed7d2..7803cea5c7 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -232,6 +232,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::EMERALD, Items::EMERALD()); $this->map1to1Item(Ids::ENCHANTED_BOOK, Items::ENCHANTED_BOOK()); $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE()); + $this->map1to1Item(Ids::END_CRYSTAL, Items::END_CRYSTAL()); $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL()); $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE()); $this->map1to1Item(Ids::EYE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE()); diff --git a/src/entity/EntityFactory.php b/src/entity/EntityFactory.php index d8d189cffc..3d53233ab7 100644 --- a/src/entity/EntityFactory.php +++ b/src/entity/EntityFactory.php @@ -32,6 +32,7 @@ use pocketmine\data\bedrock\PotionTypeIdMap; use pocketmine\data\bedrock\PotionTypeIds; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\EntityDataHelper as Helper; +use pocketmine\entity\object\EndCrystal; use pocketmine\entity\object\ExperienceOrb; use pocketmine\entity\object\FallingBlock; use pocketmine\entity\object\ItemEntity; @@ -92,6 +93,10 @@ final class EntityFactory{ return new Egg(Helper::parseLocation($nbt, $world), null, $nbt); }, ['Egg', 'minecraft:egg']); + $this->register(EndCrystal::class, function(World $world, CompoundTag $nbt) : EndCrystal{ + return new EndCrystal(Helper::parseLocation($nbt, $world), $nbt); + }, ['EnderCrystal', 'minecraft:ender_crystal']); + $this->register(EnderPearl::class, function(World $world, CompoundTag $nbt) : EnderPearl{ return new EnderPearl(Helper::parseLocation($nbt, $world), null, $nbt); }, ['ThrownEnderpearl', 'minecraft:ender_pearl']); diff --git a/src/entity/object/EndCrystal.php b/src/entity/object/EndCrystal.php new file mode 100644 index 0000000000..2c4a4f7e5c --- /dev/null +++ b/src/entity/object/EndCrystal.php @@ -0,0 +1,140 @@ +showBase; + } + + public function setShowBase(bool $showBase) : void{ + $this->showBase = $showBase; + $this->networkPropertiesDirty = true; + } + + public function getBeamTarget() : ?Vector3{ + return $this->beamTarget; + } + + public function setBeamTarget(?Vector3 $beamTarget) : void{ + $this->beamTarget = $beamTarget; + $this->networkPropertiesDirty = true; + } + + public function attack(EntityDamageEvent $source) : void{ + parent::attack($source); + if( + $source->getCause() !== EntityDamageEvent::CAUSE_VOID && + !$this->isFlaggedForDespawn() && + !$source->isCancelled() + ){ + $this->flagForDespawn(); + $this->explode(); + } + } + + protected function initEntity(CompoundTag $nbt) : void{ + parent::initEntity($nbt); + + $this->setMaxHealth(1); + $this->setHealth(1); + + $this->setShowBase($nbt->getByte(self::TAG_SHOWBASE, 0) === 1); + + if( + ($beamXTag = $nbt->getTag(self::TAG_BLOCKTARGET_X)) instanceof IntTag && + ($beamYTag = $nbt->getTag(self::TAG_BLOCKTARGET_Y)) instanceof IntTag && + ($beamZTag = $nbt->getTag(self::TAG_BLOCKTARGET_Z)) instanceof IntTag + ){ + $this->setBeamTarget(new Vector3($beamXTag->getValue(), $beamYTag->getValue(), $beamZTag->getValue())); + } + } + + public function saveNBT() : CompoundTag{ + $nbt = parent::saveNBT(); + + $nbt->setByte(self::TAG_SHOWBASE, $this->showBase ? 1 : 0); + if($this->beamTarget !== null){ + $nbt->setInt(self::TAG_BLOCKTARGET_X, $this->beamTarget->getFloorX()); + $nbt->setInt(self::TAG_BLOCKTARGET_Y, $this->beamTarget->getFloorY()); + $nbt->setInt(self::TAG_BLOCKTARGET_Z, $this->beamTarget->getFloorZ()); + } + return $nbt; + } + + public function explode() : void{ + $ev = new EntityPreExplodeEvent($this, 6); + $ev->call(); + if(!$ev->isCancelled()){ + $explosion = new Explosion($this->getPosition(), $ev->getRadius(), $this); + if($ev->isBlockBreaking()){ + $explosion->explodeA(); + } + $explosion->explodeB(); + } + } + + protected function syncNetworkData(EntityMetadataCollection $properties) : void{ + parent::syncNetworkData($properties); + + $properties->setGenericFlag(EntityMetadataFlags::SHOWBASE, $this->showBase); + $properties->setBlockPos(EntityMetadataProperties::BLOCK_TARGET, BlockPosition::fromVector3($this->beamTarget ?? Vector3::zero())); + } +} diff --git a/src/entity/projectile/Projectile.php b/src/entity/projectile/Projectile.php index 55950b6a6d..0abc274b5d 100644 --- a/src/entity/projectile/Projectile.php +++ b/src/entity/projectile/Projectile.php @@ -28,6 +28,7 @@ use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\entity\Location; +use pocketmine\entity\object\EndCrystal; use pocketmine\event\entity\EntityCombustByEntityEvent; use pocketmine\event\entity\EntityDamageByChildEntityEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; @@ -96,7 +97,7 @@ abstract class Projectile extends Entity{ } public function canCollideWith(Entity $entity) : bool{ - return $entity instanceof Living && !$this->onGround; + return ($entity instanceof Living || $entity instanceof EndCrystal) && !$this->onGround; } public function canBeCollidedWith() : bool{ diff --git a/src/item/EndCrystal.php b/src/item/EndCrystal.php new file mode 100644 index 0000000000..320d657e6d --- /dev/null +++ b/src/item/EndCrystal.php @@ -0,0 +1,59 @@ +getTypeId() === BlockTypeIds::OBSIDIAN || $blockClicked->getTypeId() === BlockTypeIds::BEDROCK){ + $pos = $blockClicked->getPosition(); + $world = $pos->getWorld(); + $bb = AxisAlignedBB::one() + ->offset($pos->getX(), $pos->getY(), $pos->getZ()) + ->extend(Facing::UP, 1); + if( + count($world->getNearbyEntities($bb)) === 0 && + $blockClicked->getSide(Facing::UP)->getTypeId() === BlockTypeIds::AIR && + $blockClicked->getSide(Facing::UP, 2)->getTypeId() === BlockTypeIds::AIR + ){ + $crystal = new EntityEndCrystal(Location::fromObject($pos->add(0.5, 1, 0.5), $world)); + $crystal->spawnToAll(); + + $this->pop(); + return ItemUseResult::SUCCESS; + } + } + return ItemUseResult::NONE; + } +} diff --git a/src/item/ItemTypeIds.php b/src/item/ItemTypeIds.php index 60bae0dd3c..96ba2a867f 100644 --- a/src/item/ItemTypeIds.php +++ b/src/item/ItemTypeIds.php @@ -325,8 +325,9 @@ final class ItemTypeIds{ public const PITCHER_POD = 20286; public const NAME_TAG = 20287; public const GOAT_HORN = 20288; + public const END_CRYSTAL = 20289; - public const FIRST_UNUSED_ITEM_ID = 20289; + public const FIRST_UNUSED_ITEM_ID = 20290; private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID; diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index e03db28bcc..4dae231aca 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -1330,6 +1330,7 @@ final class StringToItemParser extends StringToTParser{ $result->register("enchanted_book", fn() => Items::ENCHANTED_BOOK()); $result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE()); $result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE()); + $result->register("end_crystal", fn() => Items::END_CRYSTAL()); $result->register("ender_pearl", fn() => Items::ENDER_PEARL()); $result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE()); $result->register("eye_armor_trim_smithing_template", fn() => Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index a3366b85e6..5899b63576 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -158,6 +158,7 @@ use function strtolower; * @method static EnchantedBook ENCHANTED_BOOK() * @method static GoldenAppleEnchanted ENCHANTED_GOLDEN_APPLE() * @method static EnderPearl ENDER_PEARL() + * @method static EndCrystal END_CRYSTAL() * @method static ExperienceBottle EXPERIENCE_BOTTLE() * @method static Item EYE_ARMOR_TRIM_SMITHING_TEMPLATE() * @method static Item FEATHER() @@ -479,6 +480,7 @@ final class VanillaItems{ self::register("emerald", fn(IID $id) => new Item($id, "Emerald")); self::register("enchanted_book", fn(IID $id) => new EnchantedBook($id, "Enchanted Book", [EnchantmentTags::ALL])); self::register("enchanted_golden_apple", fn(IID $id) => new GoldenAppleEnchanted($id, "Enchanted Golden Apple")); + self::register("end_crystal", fn(IID $id) => new EndCrystal($id, "End Crystal")); self::register("ender_pearl", fn(IID $id) => new EnderPearl($id, "Ender Pearl")); self::register("experience_bottle", fn(IID $id) => new ExperienceBottle($id, "Bottle o' Enchanting")); self::register("feather", fn(IID $id) => new Item($id, "Feather")); From 1555fa17e719f01c67ddf2fa75a4a795e49fa695 Mon Sep 17 00:00:00 2001 From: ipad54 <63200545+ipad54@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:06:03 +0300 Subject: [PATCH 1833/1858] Added ability to pick end crystal item (#6509) --- src/entity/object/EndCrystal.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/entity/object/EndCrystal.php b/src/entity/object/EndCrystal.php index 2c4a4f7e5c..afaeb67693 100644 --- a/src/entity/object/EndCrystal.php +++ b/src/entity/object/EndCrystal.php @@ -28,6 +28,8 @@ use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Explosive; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityPreExplodeEvent; +use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; @@ -60,6 +62,10 @@ class EndCrystal extends Entity implements Explosive{ return true; } + public function getPickedItem() : ?Item{ + return VanillaItems::END_CRYSTAL(); + } + public function showBase() : bool{ return $this->showBase; } From b2aa6396c3cc2cafdd815eacc360e1ad89599899 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sat, 16 Nov 2024 23:15:07 +0000 Subject: [PATCH 1834/1858] auto-approve: don't request approvals for draft PRs --- .github/workflows/team-pr-auto-approve.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml index 8f40b16e3e..405aafd8b8 100644 --- a/.github/workflows/team-pr-auto-approve.yml +++ b/.github/workflows/team-pr-auto-approve.yml @@ -17,6 +17,7 @@ jobs: dispatch: name: Request approval runs-on: ubuntu-latest + if: '! github.event.pull_request.draft' steps: - name: Generate access token From faf1e26bacbd993c7715a2ac11efd6b393e70d19 Mon Sep 17 00:00:00 2001 From: Akmal Fairuz <35138228+AkmalFairuz@users.noreply.github.com> Date: Tue, 19 Nov 2024 06:54:22 +0700 Subject: [PATCH 1835/1858] Fix: implicitly nullable parameter declarations deprecated (#6522) --- src/world/World.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/World.php b/src/world/World.php index fbfa05b71d..187f7ab8b8 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2037,7 +2037,7 @@ class World implements ChunkManager{ * @param Item[] &$returnedItems Items to be added to the target's inventory (or dropped, if the inventory is full) * @phpstan-param-out Item $item */ - public function useBreakOn(Vector3 $vector, Item &$item = null, ?Player $player = null, bool $createParticles = false, array &$returnedItems = []) : bool{ + public function useBreakOn(Vector3 $vector, ?Item &$item = null, ?Player $player = null, bool $createParticles = false, array &$returnedItems = []) : bool{ $vector = $vector->floor(); $chunkX = $vector->getFloorX() >> Chunk::COORD_BIT_SIZE; From e710b3750f5ca8547198ecb3ebfc9169ee6b5688 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 19 Nov 2024 18:05:21 +0100 Subject: [PATCH 1836/1858] Adjust pretty name of closures on PHP 8.4 (#6351) related to https://github.com/php/php-src/pull/13550 see analog symfony change: https://github.com/symfony/symfony/pull/54614 --- src/utils/Utils.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 46d6732166..ef3f2d2499 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -80,7 +80,7 @@ use function preg_match_all; use function preg_replace; use function shell_exec; use function spl_object_id; -use function str_ends_with; +use function str_contains; use function str_pad; use function str_split; use function str_starts_with; @@ -121,7 +121,7 @@ final class Utils{ */ public static function getNiceClosureName(\Closure $closure) : string{ $func = new \ReflectionFunction($closure); - if(!str_ends_with($func->getName(), '{closure}')){ + if(!str_contains($func->getName(), '{closure')){ //closure wraps a named function, can be done with reflection or fromCallable() //isClosure() is useless here because it just tells us if $func is reflecting a Closure object From bf7a53b00ff4a7f0ac47a405ec32b40afac37de8 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Tue, 19 Nov 2024 17:47:46 +0000 Subject: [PATCH 1837/1858] Update api-change-request.md [ci skip] --- .github/ISSUE_TEMPLATE/api-change-request.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/api-change-request.md b/.github/ISSUE_TEMPLATE/api-change-request.md index 615ab12ef3..e3d24ea0ff 100644 --- a/.github/ISSUE_TEMPLATE/api-change-request.md +++ b/.github/ISSUE_TEMPLATE/api-change-request.md @@ -7,13 +7,13 @@ assignees: '' --- - -## Description + +## Problem description - -## Justification + +## Proposed solution -## Alternative methods +## Alternative solutions that don't require API changes From 9195c8867046de1a4a64f027b56be63826289abc Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Wed, 20 Nov 2024 14:56:52 +0000 Subject: [PATCH 1838/1858] ConsoleReader: Use proc_open()'s socket support to send commands back to the main server process (#5273) Support for this was introduced in PHP 8.0, though not mentioned in any changelog: php/php-src#5777 This simplifies the subprocess handling considerably. However, there is a potential for problems if PHP generates any E_* errors, since these get written to STDOUT as well. To avoid error messages being treated as a command, a hash is attached to each IPC message, seeded with an incrementing counter. This prevents error messages causing command replays or unintended commands. Unfortunately, PHP doesn't support binding pipes other than stdin/stdout/stderr on Windows for the child process, so we have to use stdout for this. In the future, if it becomes possible, a dedicated pipe for the purpose should be introduced. We'd need something like php://fd/ to work on Windows. --- src/console/ConsoleReaderChildProcess.php | 30 +++--- .../ConsoleReaderChildProcessDaemon.php | 54 ++++++----- .../ConsoleReaderChildProcessUtils.php | 71 ++++++++++++++ .../ConsoleReaderChildProcessUtilsTest.php | 92 +++++++++++++++++++ 4 files changed, 209 insertions(+), 38 deletions(-) create mode 100644 src/console/ConsoleReaderChildProcessUtils.php create mode 100644 tests/phpunit/console/ConsoleReaderChildProcessUtilsTest.php diff --git a/src/console/ConsoleReaderChildProcess.php b/src/console/ConsoleReaderChildProcess.php index 0d5a30fdcc..c0c4f0048f 100644 --- a/src/console/ConsoleReaderChildProcess.php +++ b/src/console/ConsoleReaderChildProcess.php @@ -29,23 +29,21 @@ use pocketmine\utils\Process; use function cli_set_process_title; use function count; use function dirname; -use function feof; use function fwrite; -use function stream_socket_client; +use function is_numeric; +use const PHP_EOL; +use const STDOUT; + +if(count($argv) !== 2 || !is_numeric($argv[1])){ + echo "Usage: " . $argv[0] . " " . PHP_EOL; + exit(1); +} + +$commandTokenSeed = (int) $argv[1]; require dirname(__DIR__, 2) . '/vendor/autoload.php'; -if(count($argv) !== 2){ - die("Please provide a server to connect to"); -} - @cli_set_process_title('PocketMine-MP Console Reader'); -$errCode = null; -$errMessage = null; -$socket = stream_socket_client($argv[1], $errCode, $errMessage, 15.0); -if($socket === false){ - throw new \RuntimeException("Failed to connect to server process ($errCode): $errMessage"); -} /** @phpstan-var ThreadSafeArray $channel */ $channel = new ThreadSafeArray(); @@ -75,15 +73,15 @@ $thread = new class($channel) extends NativeThread{ }; $thread->start(NativeThread::INHERIT_NONE); -while(!feof($socket)){ +while(true){ $line = $channel->synchronized(function() use ($channel) : ?string{ if(count($channel) === 0){ $channel->wait(1_000_000); } - $line = $channel->shift(); - return $line; + return $channel->shift(); }); - if(@fwrite($socket, ($line ?? "") . "\n") === false){ + $message = $line !== null ? ConsoleReaderChildProcessUtils::createMessage($line, $commandTokenSeed) : ""; + if(@fwrite(STDOUT, $message . "\n") === false){ //Always send even if there's no line, to check if the parent is alive //If the parent process was terminated forcibly, it won't close the connection properly, so feof() will return //false even though the connection is actually broken. However, fwrite() will fail. diff --git a/src/console/ConsoleReaderChildProcessDaemon.php b/src/console/ConsoleReaderChildProcessDaemon.php index 138559f06e..f7300b7a52 100644 --- a/src/console/ConsoleReaderChildProcessDaemon.php +++ b/src/console/ConsoleReaderChildProcessDaemon.php @@ -29,19 +29,16 @@ use Symfony\Component\Filesystem\Path; use function base64_encode; use function fgets; use function fopen; +use function mt_rand; use function preg_replace; use function proc_close; use function proc_open; use function proc_terminate; +use function rtrim; use function sprintf; use function stream_select; -use function stream_socket_accept; -use function stream_socket_get_name; -use function stream_socket_server; -use function stream_socket_shutdown; use function trim; use const PHP_BINARY; -use const STREAM_SHUT_RDWR; /** * This pile of shit exists because PHP on Windows is broken, and can't handle stream_select() on stdin or pipes @@ -58,44 +55,44 @@ use const STREAM_SHUT_RDWR; * communication. */ final class ConsoleReaderChildProcessDaemon{ + public const TOKEN_DELIMITER = ":"; + public const TOKEN_HASH_ALGO = "xxh3"; + private \PrefixedLogger $logger; /** @var resource */ private $subprocess; /** @var resource */ private $socket; + private int $commandTokenSeed; public function __construct( \Logger $logger ){ $this->logger = new \PrefixedLogger($logger, "Console Reader Daemon"); + $this->commandTokenSeed = mt_rand(); $this->prepareSubprocess(); } private function prepareSubprocess() : void{ - $server = stream_socket_server("tcp://127.0.0.1:0"); - if($server === false){ - throw new \RuntimeException("Failed to open console reader socket server"); - } - $address = Utils::assumeNotFalse(stream_socket_get_name($server, false), "stream_socket_get_name() shouldn't return false here"); - //Windows sucks, and likes to corrupt UTF-8 file paths when they travel to the subprocess, so we base64 encode //the path to avoid the problem. This is an abysmally shitty hack, but here we are :( $sub = Utils::assumeNotFalse(proc_open( - [PHP_BINARY, '-dopcache.enable_cli=0', '-r', sprintf('require base64_decode("%s", true);', base64_encode(Path::join(__DIR__, 'ConsoleReaderChildProcess.php'))), $address], [ + PHP_BINARY, + '-dopcache.enable_cli=0', + '-r', + sprintf('require base64_decode("%s", true);', base64_encode(Path::join(__DIR__, 'ConsoleReaderChildProcess.php'))), + (string) $this->commandTokenSeed + ], + [ + 1 => ['socket'], 2 => fopen("php://stderr", "w"), ], $pipes ), "Something has gone horribly wrong"); - $client = stream_socket_accept($server, 15); - if($client === false){ - throw new AssumptionFailedError("stream_socket_accept() returned false"); - } - stream_socket_shutdown($server, STREAM_SHUT_RDWR); - $this->subprocess = $sub; - $this->socket = $client; + $this->socket = $pipes[1]; } private function shutdownSubprocess() : void{ @@ -104,7 +101,6 @@ final class ConsoleReaderChildProcessDaemon{ //the first place). proc_terminate($this->subprocess); proc_close($this->subprocess); - stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR); } public function readLine() : ?string{ @@ -112,13 +108,27 @@ final class ConsoleReaderChildProcessDaemon{ $w = null; $e = null; if(stream_select($r, $w, $e, 0, 0) === 1){ - $command = fgets($this->socket); - if($command === false){ + $line = fgets($this->socket); + if($line === false){ $this->logger->debug("Lost connection to subprocess, restarting (maybe the child process was killed from outside?)"); $this->shutdownSubprocess(); $this->prepareSubprocess(); return null; } + $line = rtrim($line, "\n"); + + if($line === ""){ + //keepalive + return null; + } + + $command = ConsoleReaderChildProcessUtils::parseMessage($line, $this->commandTokenSeed); + if($command === null){ + //this is not a command - it may be some kind of error output from the subprocess + //write it directly to the console + $this->logger->warning("Unexpected output from child process: $line"); + return null; + } $command = preg_replace("#\\x1b\\x5b([^\\x1b]*\\x7e|[\\x40-\\x50])#", "", trim($command)) ?? throw new AssumptionFailedError("This regex is assumed to be valid"); $command = preg_replace('/[[:cntrl:]]/', '', $command) ?? throw new AssumptionFailedError("This regex is assumed to be valid"); diff --git a/src/console/ConsoleReaderChildProcessUtils.php b/src/console/ConsoleReaderChildProcessUtils.php new file mode 100644 index 0000000000..661e9b0f7b --- /dev/null +++ b/src/console/ConsoleReaderChildProcessUtils.php @@ -0,0 +1,71 @@ + $counter]); + $counter++; + return $line . self::TOKEN_DELIMITER . $token; + } + + /** + * Extracts a command from an IPC message from the console reader subprocess. + * Returns the user's input command, or null if this isn't a user input. + */ + public static function parseMessage(string $message, int &$counter) : ?string{ + $delimiterPos = strrpos($message, self::TOKEN_DELIMITER); + if($delimiterPos !== false){ + $left = substr($message, 0, $delimiterPos); + $right = substr($message, $delimiterPos + strlen(self::TOKEN_DELIMITER)); + $expectedToken = hash(self::TOKEN_HASH_ALGO, $left, options: ['seed' => $counter]); + + if($expectedToken === $right){ + $counter++; + return $left; + } + } + + return null; + } +} diff --git a/tests/phpunit/console/ConsoleReaderChildProcessUtilsTest.php b/tests/phpunit/console/ConsoleReaderChildProcessUtilsTest.php new file mode 100644 index 0000000000..31ae2e27a4 --- /dev/null +++ b/tests/phpunit/console/ConsoleReaderChildProcessUtilsTest.php @@ -0,0 +1,92 @@ + + */ + public static function commandStringProvider() : \Generator{ + yield ["stop"]; + yield ["pocketmine:status"]; + yield [str_repeat("s", 1000)]; + yield ["time set day"]; + yield ["give \"Steve\" golden_apple"]; + } + + /** + * @dataProvider commandStringProvider + */ + public function testCreateParseSymmetry(string $input) : void{ + $counterCreate = $counterParse = mt_rand(); + $message = ConsoleReaderChildProcessUtils::createMessage($input, $counterCreate); + $parsedInput = ConsoleReaderChildProcessUtils::parseMessage($message, $counterParse); + + self::assertSame($input, $parsedInput); + } + + public function testCreateMessage() : void{ + $counter = 0; + + ConsoleReaderChildProcessUtils::createMessage("", $counter); + self::assertSame(1, $counter, "createMessage should always bump the counter"); + } + + /** + * @phpstan-return \Generator + */ + public static function parseMessageProvider() : \Generator{ + $counter = 0; + yield [ConsoleReaderChildProcessUtils::createMessage("", $counter), true]; + + yield ["", false]; //keepalive message, doesn't bump counter + + $counter = 1; + yield [ConsoleReaderChildProcessUtils::createMessage("", $counter), false]; //mismatched counter + + $counter = 0; + yield ["a" . ConsoleReaderChildProcessUtils::TOKEN_DELIMITER . "b", false]; //message with delimiter but not a valid IPC message + } + + /** + * @dataProvider parseMessageProvider + */ + public static function testParseMessage(string $message, bool $valid) : void{ + $counter = $oldCounter = 0; + + $input = ConsoleReaderChildProcessUtils::parseMessage($message, $counter); + if(!$valid){ + self::assertNull($input, "Result should be null on invalid message"); + self::assertSame($oldCounter, $counter, "Counter shouldn't be bumped on invalid message"); + }else{ + self::assertNotNull($input, "This was a valid message, expected a result"); + self::assertSame($oldCounter + 1, $counter, "Counter should be bumped on valid message parse"); + } + } +} From 49bdaee930f552b387c39992217519eff381447d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Nov 2024 15:38:44 +0000 Subject: [PATCH 1839/1858] Move event handler inheritance test to PHPUnit using mock objects this is dodgy and we shouldn't rely on it long term. relates to #6524 --- tests/phpunit/event/EventTest.php | 65 ++++++++++++++ .../event/TestChildEvent.php} | 4 +- .../event/TestGrandchildEvent.php} | 4 +- .../event/TestParentEvent.php} | 4 +- .../src/EventHandlerInheritanceTest.php | 88 ------------------- tests/plugins/TesterPlugin/src/Main.php | 2 +- 6 files changed, 72 insertions(+), 95 deletions(-) create mode 100644 tests/phpunit/event/EventTest.php rename tests/{plugins/TesterPlugin/src/event/GrandchildEvent.php => phpunit/event/TestChildEvent.php} (90%) rename tests/{plugins/TesterPlugin/src/event/ParentEvent.php => phpunit/event/TestGrandchildEvent.php} (89%) rename tests/{plugins/TesterPlugin/src/event/ChildEvent.php => phpunit/event/TestParentEvent.php} (91%) delete mode 100644 tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php diff --git a/tests/phpunit/event/EventTest.php b/tests/phpunit/event/EventTest.php new file mode 100644 index 0000000000..259daaf5d2 --- /dev/null +++ b/tests/phpunit/event/EventTest.php @@ -0,0 +1,65 @@ +createMock(Server::class); + $mockPlugin = self::createStub(Plugin::class); + $mockPlugin->method('isEnabled')->willReturn(true); + + $pluginManager = new PluginManager($mockServer, null); + + $expectedOrder = [ + TestGrandchildEvent::class, + TestChildEvent::class, + TestParentEvent::class + ]; + $actualOrder = []; + + foreach($expectedOrder as $class){ + $pluginManager->registerEvent( + $class, + function(TestParentEvent $event) use (&$actualOrder, $class) : void{ + $actualOrder[] = $class; + }, + EventPriority::NORMAL, + $mockPlugin + ); + } + + $event = new TestGrandchildEvent(); + $event->call(); + + self::assertSame($expectedOrder, $actualOrder, "Expected event handlers to be called from most specific to least specific"); + } +} diff --git a/tests/plugins/TesterPlugin/src/event/GrandchildEvent.php b/tests/phpunit/event/TestChildEvent.php similarity index 90% rename from tests/plugins/TesterPlugin/src/event/GrandchildEvent.php rename to tests/phpunit/event/TestChildEvent.php index 40c37c5679..2b79f882fc 100644 --- a/tests/plugins/TesterPlugin/src/event/GrandchildEvent.php +++ b/tests/phpunit/event/TestChildEvent.php @@ -21,8 +21,8 @@ declare(strict_types=1); -namespace pmmp\TesterPlugin\event; +namespace pocketmine\event; -class GrandchildEvent extends ChildEvent{ +class TestChildEvent extends TestParentEvent{ } diff --git a/tests/plugins/TesterPlugin/src/event/ParentEvent.php b/tests/phpunit/event/TestGrandchildEvent.php similarity index 89% rename from tests/plugins/TesterPlugin/src/event/ParentEvent.php rename to tests/phpunit/event/TestGrandchildEvent.php index 68f7df6300..7685f3b0b5 100644 --- a/tests/plugins/TesterPlugin/src/event/ParentEvent.php +++ b/tests/phpunit/event/TestGrandchildEvent.php @@ -21,8 +21,8 @@ declare(strict_types=1); -namespace pmmp\TesterPlugin\event; +namespace pocketmine\event; -class ParentEvent extends \pocketmine\event\Event{ +class TestGrandchildEvent extends TestChildEvent{ } diff --git a/tests/plugins/TesterPlugin/src/event/ChildEvent.php b/tests/phpunit/event/TestParentEvent.php similarity index 91% rename from tests/plugins/TesterPlugin/src/event/ChildEvent.php rename to tests/phpunit/event/TestParentEvent.php index b71d2627fc..c770f6372e 100644 --- a/tests/plugins/TesterPlugin/src/event/ChildEvent.php +++ b/tests/phpunit/event/TestParentEvent.php @@ -21,8 +21,8 @@ declare(strict_types=1); -namespace pmmp\TesterPlugin\event; +namespace pocketmine\event; -class ChildEvent extends ParentEvent{ +class TestParentEvent extends Event{ } diff --git a/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php b/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php deleted file mode 100644 index efe20f8d8f..0000000000 --- a/tests/plugins/TesterPlugin/src/EventHandlerInheritanceTest.php +++ /dev/null @@ -1,88 +0,0 @@ -getPlugin(); - $plugin->getServer()->getPluginManager()->registerEvent( - ParentEvent::class, - function(ParentEvent $event) : void{ - $this->callOrder[] = ParentEvent::class; - }, - EventPriority::NORMAL, - $plugin - ); - $plugin->getServer()->getPluginManager()->registerEvent( - ChildEvent::class, - function(ChildEvent $event) : void{ - $this->callOrder[] = ChildEvent::class; - }, - EventPriority::NORMAL, - $plugin - ); - $plugin->getServer()->getPluginManager()->registerEvent( - GrandchildEvent::class, - function(GrandchildEvent $event) : void{ - $this->callOrder[] = GrandchildEvent::class; - }, - EventPriority::NORMAL, - $plugin - ); - - $event = new GrandchildEvent(); - $event->call(); - - if($this->callOrder === self::EXPECTED_ORDER){ - $this->setResult(Test::RESULT_OK); - }else{ - $plugin->getLogger()->error("Expected order: " . implode(", ", self::EXPECTED_ORDER) . ", got: " . implode(", ", $this->callOrder)); - $this->setResult(Test::RESULT_FAILED); - } - } -} diff --git a/tests/plugins/TesterPlugin/src/Main.php b/tests/plugins/TesterPlugin/src/Main.php index 26d3441f4a..08b59dbacb 100644 --- a/tests/plugins/TesterPlugin/src/Main.php +++ b/tests/plugins/TesterPlugin/src/Main.php @@ -57,7 +57,7 @@ class Main extends PluginBase implements Listener{ }), 10); $this->waitingTests = [ - new EventHandlerInheritanceTest($this), + //Add test objects here ]; } From 844ba0ff9fa69785ba8a583dd1cc7af5100f9871 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Nov 2024 15:40:34 +0000 Subject: [PATCH 1840/1858] Move event test fixtures to a subdirectory --- tests/phpunit/event/EventTest.php | 3 +++ tests/phpunit/event/HandlerListManagerTest.php | 6 ++++++ .../event/{ => fixtures}/TestAbstractAllowHandleEvent.php | 4 +++- tests/phpunit/event/{ => fixtures}/TestAbstractEvent.php | 4 +++- tests/phpunit/event/{ => fixtures}/TestChildEvent.php | 2 +- tests/phpunit/event/{ => fixtures}/TestConcreteEvent.php | 4 +++- .../{ => fixtures}/TestConcreteExtendsAbstractEvent.php | 2 +- .../{ => fixtures}/TestConcreteExtendsAllowHandleEvent.php | 2 +- .../{ => fixtures}/TestConcreteExtendsConcreteEvent.php | 2 +- tests/phpunit/event/{ => fixtures}/TestGrandchildEvent.php | 2 +- tests/phpunit/event/{ => fixtures}/TestParentEvent.php | 4 +++- 11 files changed, 26 insertions(+), 9 deletions(-) rename tests/phpunit/event/{ => fixtures}/TestAbstractAllowHandleEvent.php (92%) rename tests/phpunit/event/{ => fixtures}/TestAbstractEvent.php (92%) rename tests/phpunit/event/{ => fixtures}/TestChildEvent.php (95%) rename tests/phpunit/event/{ => fixtures}/TestConcreteEvent.php (92%) rename tests/phpunit/event/{ => fixtures}/TestConcreteExtendsAbstractEvent.php (95%) rename tests/phpunit/event/{ => fixtures}/TestConcreteExtendsAllowHandleEvent.php (95%) rename tests/phpunit/event/{ => fixtures}/TestConcreteExtendsConcreteEvent.php (95%) rename tests/phpunit/event/{ => fixtures}/TestGrandchildEvent.php (95%) rename tests/phpunit/event/{ => fixtures}/TestParentEvent.php (92%) diff --git a/tests/phpunit/event/EventTest.php b/tests/phpunit/event/EventTest.php index 259daaf5d2..5d5ace54d4 100644 --- a/tests/phpunit/event/EventTest.php +++ b/tests/phpunit/event/EventTest.php @@ -24,6 +24,9 @@ declare(strict_types=1); namespace pocketmine\event; use PHPUnit\Framework\TestCase; +use pocketmine\event\fixtures\TestChildEvent; +use pocketmine\event\fixtures\TestGrandchildEvent; +use pocketmine\event\fixtures\TestParentEvent; use pocketmine\plugin\Plugin; use pocketmine\plugin\PluginManager; use pocketmine\Server; diff --git a/tests/phpunit/event/HandlerListManagerTest.php b/tests/phpunit/event/HandlerListManagerTest.php index edff36639d..c61043dab8 100644 --- a/tests/phpunit/event/HandlerListManagerTest.php +++ b/tests/phpunit/event/HandlerListManagerTest.php @@ -24,6 +24,12 @@ declare(strict_types=1); namespace pocketmine\event; use PHPUnit\Framework\TestCase; +use pocketmine\event\fixtures\TestAbstractAllowHandleEvent; +use pocketmine\event\fixtures\TestAbstractEvent; +use pocketmine\event\fixtures\TestConcreteEvent; +use pocketmine\event\fixtures\TestConcreteExtendsAbstractEvent; +use pocketmine\event\fixtures\TestConcreteExtendsAllowHandleEvent; +use pocketmine\event\fixtures\TestConcreteExtendsConcreteEvent; class HandlerListManagerTest extends TestCase{ diff --git a/tests/phpunit/event/TestAbstractAllowHandleEvent.php b/tests/phpunit/event/fixtures/TestAbstractAllowHandleEvent.php similarity index 92% rename from tests/phpunit/event/TestAbstractAllowHandleEvent.php rename to tests/phpunit/event/fixtures/TestAbstractAllowHandleEvent.php index 1bac06bbb0..3831698098 100644 --- a/tests/phpunit/event/TestAbstractAllowHandleEvent.php +++ b/tests/phpunit/event/fixtures/TestAbstractAllowHandleEvent.php @@ -21,7 +21,9 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; + +use pocketmine\event\Event; /** * @allowHandle diff --git a/tests/phpunit/event/TestAbstractEvent.php b/tests/phpunit/event/fixtures/TestAbstractEvent.php similarity index 92% rename from tests/phpunit/event/TestAbstractEvent.php rename to tests/phpunit/event/fixtures/TestAbstractEvent.php index 92a95363e3..b48d8f5269 100644 --- a/tests/phpunit/event/TestAbstractEvent.php +++ b/tests/phpunit/event/fixtures/TestAbstractEvent.php @@ -21,7 +21,9 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; + +use pocketmine\event\Event; abstract class TestAbstractEvent extends Event{ diff --git a/tests/phpunit/event/TestChildEvent.php b/tests/phpunit/event/fixtures/TestChildEvent.php similarity index 95% rename from tests/phpunit/event/TestChildEvent.php rename to tests/phpunit/event/fixtures/TestChildEvent.php index 2b79f882fc..569a2c069a 100644 --- a/tests/phpunit/event/TestChildEvent.php +++ b/tests/phpunit/event/fixtures/TestChildEvent.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; class TestChildEvent extends TestParentEvent{ diff --git a/tests/phpunit/event/TestConcreteEvent.php b/tests/phpunit/event/fixtures/TestConcreteEvent.php similarity index 92% rename from tests/phpunit/event/TestConcreteEvent.php rename to tests/phpunit/event/fixtures/TestConcreteEvent.php index 8b159df91a..cf744eb2ce 100644 --- a/tests/phpunit/event/TestConcreteEvent.php +++ b/tests/phpunit/event/fixtures/TestConcreteEvent.php @@ -21,7 +21,9 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; + +use pocketmine\event\Event; class TestConcreteEvent extends Event{ diff --git a/tests/phpunit/event/TestConcreteExtendsAbstractEvent.php b/tests/phpunit/event/fixtures/TestConcreteExtendsAbstractEvent.php similarity index 95% rename from tests/phpunit/event/TestConcreteExtendsAbstractEvent.php rename to tests/phpunit/event/fixtures/TestConcreteExtendsAbstractEvent.php index 3f0fa572fe..54ec3dbb12 100644 --- a/tests/phpunit/event/TestConcreteExtendsAbstractEvent.php +++ b/tests/phpunit/event/fixtures/TestConcreteExtendsAbstractEvent.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; class TestConcreteExtendsAbstractEvent extends TestAbstractEvent{ diff --git a/tests/phpunit/event/TestConcreteExtendsAllowHandleEvent.php b/tests/phpunit/event/fixtures/TestConcreteExtendsAllowHandleEvent.php similarity index 95% rename from tests/phpunit/event/TestConcreteExtendsAllowHandleEvent.php rename to tests/phpunit/event/fixtures/TestConcreteExtendsAllowHandleEvent.php index e414651211..362ce693b5 100644 --- a/tests/phpunit/event/TestConcreteExtendsAllowHandleEvent.php +++ b/tests/phpunit/event/fixtures/TestConcreteExtendsAllowHandleEvent.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; class TestConcreteExtendsAllowHandleEvent extends TestAbstractAllowHandleEvent{ diff --git a/tests/phpunit/event/TestConcreteExtendsConcreteEvent.php b/tests/phpunit/event/fixtures/TestConcreteExtendsConcreteEvent.php similarity index 95% rename from tests/phpunit/event/TestConcreteExtendsConcreteEvent.php rename to tests/phpunit/event/fixtures/TestConcreteExtendsConcreteEvent.php index cc95589351..3fd3a6cf0e 100644 --- a/tests/phpunit/event/TestConcreteExtendsConcreteEvent.php +++ b/tests/phpunit/event/fixtures/TestConcreteExtendsConcreteEvent.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; class TestConcreteExtendsConcreteEvent extends TestConcreteEvent{ diff --git a/tests/phpunit/event/TestGrandchildEvent.php b/tests/phpunit/event/fixtures/TestGrandchildEvent.php similarity index 95% rename from tests/phpunit/event/TestGrandchildEvent.php rename to tests/phpunit/event/fixtures/TestGrandchildEvent.php index 7685f3b0b5..bfe50f9f3d 100644 --- a/tests/phpunit/event/TestGrandchildEvent.php +++ b/tests/phpunit/event/fixtures/TestGrandchildEvent.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; class TestGrandchildEvent extends TestChildEvent{ diff --git a/tests/phpunit/event/TestParentEvent.php b/tests/phpunit/event/fixtures/TestParentEvent.php similarity index 92% rename from tests/phpunit/event/TestParentEvent.php rename to tests/phpunit/event/fixtures/TestParentEvent.php index c770f6372e..c204422722 100644 --- a/tests/phpunit/event/TestParentEvent.php +++ b/tests/phpunit/event/fixtures/TestParentEvent.php @@ -21,7 +21,9 @@ declare(strict_types=1); -namespace pocketmine\event; +namespace pocketmine\event\fixtures; + +use pocketmine\event\Event; class TestParentEvent extends Event{ From 1e3a858de6758c37e8a25c83258f439c348edde8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 20 Nov 2024 16:42:50 +0000 Subject: [PATCH 1841/1858] Add setUp and tearDown for event unit tests --- tests/phpunit/event/EventTest.php | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tests/phpunit/event/EventTest.php b/tests/phpunit/event/EventTest.php index 5d5ace54d4..7410cc3bb0 100644 --- a/tests/phpunit/event/EventTest.php +++ b/tests/phpunit/event/EventTest.php @@ -33,15 +33,26 @@ use pocketmine\Server; final class EventTest extends TestCase{ - public function testHandlerInheritance() : void{ + private Plugin $mockPlugin; + private PluginManager $pluginManager; + + protected function setUp() : void{ + HandlerListManager::global()->unregisterAll(); + //TODO: this is a really bad hack and could break any time if PluginManager decides to access its Server field //we really need to make it possible to register events without a Plugin or Server context $mockServer = $this->createMock(Server::class); - $mockPlugin = self::createStub(Plugin::class); - $mockPlugin->method('isEnabled')->willReturn(true); + $this->mockPlugin = self::createStub(Plugin::class); + $this->mockPlugin->method('isEnabled')->willReturn(true); - $pluginManager = new PluginManager($mockServer, null); + $this->pluginManager = new PluginManager($mockServer, null); + } + public static function tearDownAfterClass() : void{ + HandlerListManager::global()->unregisterAll(); + } + + public function testHandlerInheritance() : void{ $expectedOrder = [ TestGrandchildEvent::class, TestChildEvent::class, @@ -50,13 +61,13 @@ final class EventTest extends TestCase{ $actualOrder = []; foreach($expectedOrder as $class){ - $pluginManager->registerEvent( + $this->pluginManager->registerEvent( $class, function(TestParentEvent $event) use (&$actualOrder, $class) : void{ $actualOrder[] = $class; }, EventPriority::NORMAL, - $mockPlugin + $this->mockPlugin ); } From 7c2ed7d8845e7d2ce0dd62c77cdac5dd53306b19 Mon Sep 17 00:00:00 2001 From: GameParrot <85067619+GameParrot@users.noreply.github.com> Date: Wed, 20 Nov 2024 21:22:10 -0500 Subject: [PATCH 1842/1858] Fix insta break check (#6528) --- src/player/Player.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/player/Player.php b/src/player/Player.php index 192e26a5f9..d203fe6a94 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1764,7 +1764,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return true; } - if(!$this->isCreative() && !$block->getBreakInfo()->breaksInstantly()){ + if(!$this->isCreative() && !$target->getBreakInfo()->breaksInstantly()){ $this->blockBreakHandler = new SurvivalBlockBreakHandler($this, $pos, $target, $face, 16); } From 0070426e97fa1a188e47f552e996cfb3fecc17b7 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sat, 23 Nov 2024 19:07:24 +0000 Subject: [PATCH 1843/1858] auto-approve: only re-review if previous review was dismissed this avoids unnecessary spam when someone clicks "Update branch" on the PR. --- .github/workflows/team-pr-auto-approve.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml index 405aafd8b8..f145812138 100644 --- a/.github/workflows/team-pr-auto-approve.yml +++ b/.github/workflows/team-pr-auto-approve.yml @@ -9,9 +9,10 @@ on: pull_request_target: types: - opened - - synchronize - reopened - ready_for_review + pull_request_review: + types: dismissed jobs: dispatch: @@ -35,4 +36,4 @@ jobs: token: ${{ steps.generate-token.outputs.token }} repository: ${{ github.repository_owner }}/RestrictedActions event-type: auto_approve_collaborator_pr - client-payload: '{"repo": "${{ github.repository }}", "pull_request_id": "${{ github.event.pull_request.number }}" }' + client-payload: '{"repo": "${{ github.repository }}", "pull_request_id": "${{ github.event.pull_request.number }}", "reviewer_id": "${{ github.event.review.user.id || 0 }}" }' From 5b72f202bfb1d6351d60b8e611245896cb3dff25 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sat, 23 Nov 2024 20:13:46 +0000 Subject: [PATCH 1844/1858] actions: automatically remove waiting label from PRs on synchronize there are probably other conditions where we'd want to remove this, but this will do for now. --- .github/workflows/pr-remove-waiting-label.yml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/pr-remove-waiting-label.yml diff --git a/.github/workflows/pr-remove-waiting-label.yml b/.github/workflows/pr-remove-waiting-label.yml new file mode 100644 index 0000000000..0e411fe1ae --- /dev/null +++ b/.github/workflows/pr-remove-waiting-label.yml @@ -0,0 +1,24 @@ +name: Remove waiting label from PRs + +on: + pull_request_target: + types: synchronize + +jobs: + delabel: + name: Remove label + runs-on: ubuntu-latest + + steps: + - name: Remove label + uses: actions/github-script@v7 + with: + github-token: ${{ github.token }} + script: | + const [owner, repo] = context.payload.repository.full_name.split('/'); + await github.rest.issues.removeLabel({ + owner: owner, + repo: repo, + issue_number: context.payload.number, + name: "Status: Waiting on Author", + }); From 7460e12b6affaf097a63edf35a77bb0cbee7799f Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Sat, 23 Nov 2024 21:48:30 +0000 Subject: [PATCH 1845/1858] pr-remove-waiting-label: suppress failure on 404 errors this usually means the label wasn't on the PR in the first place --- .github/workflows/pr-remove-waiting-label.yml | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pr-remove-waiting-label.yml b/.github/workflows/pr-remove-waiting-label.yml index 0e411fe1ae..eb46043bdd 100644 --- a/.github/workflows/pr-remove-waiting-label.yml +++ b/.github/workflows/pr-remove-waiting-label.yml @@ -16,9 +16,18 @@ jobs: github-token: ${{ github.token }} script: | const [owner, repo] = context.payload.repository.full_name.split('/'); - await github.rest.issues.removeLabel({ - owner: owner, - repo: repo, - issue_number: context.payload.number, - name: "Status: Waiting on Author", - }); + try { + await github.rest.issues.removeLabel({ + owner: owner, + repo: repo, + issue_number: context.payload.number, + name: "Status: Waiting on Author", + }); + } catch (error) { + if (error.status === 404) { + //probably label wasn't set on the issue + console.log('Failed to remove label (probably label isn\'t on the PR): ' + error.message); + } else { + throw error; + } + } From 8338ebaffdc1cb1ed14960ec27df16e14acab709 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Sun, 24 Nov 2024 15:14:34 +0100 Subject: [PATCH 1846/1858] Add generic types for TaskHandler (#6030) --- src/scheduler/Task.php | 7 ++++ src/scheduler/TaskHandler.php | 9 +++++ src/scheduler/TaskScheduler.php | 44 ++++++++++++++++++++-- src/timings/Timings.php | 5 +++ tests/phpstan/configs/actual-problems.neon | 2 +- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/scheduler/Task.php b/src/scheduler/Task.php index bde405a637..db42b477ad 100644 --- a/src/scheduler/Task.php +++ b/src/scheduler/Task.php @@ -26,8 +26,12 @@ namespace pocketmine\scheduler; use pocketmine\utils\Utils; abstract class Task{ + /** @phpstan-var TaskHandler|null */ private ?TaskHandler $taskHandler = null; + /** + * @phpstan-return TaskHandler|null + */ final public function getHandler() : ?TaskHandler{ return $this->taskHandler; } @@ -36,6 +40,9 @@ abstract class Task{ return Utils::getNiceClassName($this); } + /** + * @phpstan-param TaskHandler|null $taskHandler + */ final public function setHandler(?TaskHandler $taskHandler) : void{ if($this->taskHandler === null || $taskHandler === null){ $this->taskHandler = $taskHandler; diff --git a/src/scheduler/TaskHandler.php b/src/scheduler/TaskHandler.php index b90c992d92..985344b649 100644 --- a/src/scheduler/TaskHandler.php +++ b/src/scheduler/TaskHandler.php @@ -26,6 +26,9 @@ namespace pocketmine\scheduler; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; +/** + * @template TTask of Task + */ class TaskHandler{ protected int $nextRun; @@ -36,6 +39,9 @@ class TaskHandler{ private string $taskName; private string $ownerName; + /** + * @phpstan-param TTask $task + */ public function __construct( protected Task $task, protected int $delay = -1, @@ -66,6 +72,9 @@ class TaskHandler{ $this->nextRun = $ticks; } + /** + * @phpstan-return TTask + */ public function getTask() : Task{ return $this->task; } diff --git a/src/scheduler/TaskScheduler.php b/src/scheduler/TaskScheduler.php index f2b7c48467..3e2b089c6c 100644 --- a/src/scheduler/TaskScheduler.php +++ b/src/scheduler/TaskScheduler.php @@ -33,12 +33,12 @@ use pocketmine\utils\ReversePriorityQueue; class TaskScheduler{ private bool $enabled = true; - /** @phpstan-var ReversePriorityQueue */ + /** @phpstan-var ReversePriorityQueue> */ protected ReversePriorityQueue $queue; /** * @var ObjectSet|TaskHandler[] - * @phpstan-var ObjectSet + * @phpstan-var ObjectSet> */ protected ObjectSet $tasks; @@ -51,18 +51,42 @@ class TaskScheduler{ $this->tasks = new ObjectSet(); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TTask $task + * + * @phpstan-return TaskHandler + */ public function scheduleTask(Task $task) : TaskHandler{ return $this->addTask($task, -1, -1); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TTask $task + * + * @phpstan-return TaskHandler + */ public function scheduleDelayedTask(Task $task, int $delay) : TaskHandler{ return $this->addTask($task, $delay, -1); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TTask $task + * + * @phpstan-return TaskHandler + */ public function scheduleRepeatingTask(Task $task, int $period) : TaskHandler{ return $this->addTask($task, -1, $period); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TTask $task + * + * @phpstan-return TaskHandler + */ public function scheduleDelayedRepeatingTask(Task $task, int $delay, int $period) : TaskHandler{ return $this->addTask($task, $delay, $period); } @@ -77,10 +101,19 @@ class TaskScheduler{ } } + /** + * @phpstan-param TaskHandler $task + */ public function isQueued(TaskHandler $task) : bool{ return $this->tasks->contains($task); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TTask $task + * + * @phpstan-return TaskHandler + */ private function addTask(Task $task, int $delay, int $period) : TaskHandler{ if(!$this->enabled){ throw new \LogicException("Tried to schedule task to disabled scheduler"); @@ -99,6 +132,11 @@ class TaskScheduler{ return $this->handle(new TaskHandler($task, $delay, $period, $this->owner)); } + /** + * @phpstan-template TTask of Task + * @phpstan-param TaskHandler $handler + * @phpstan-return TaskHandler + */ private function handle(TaskHandler $handler) : TaskHandler{ if($handler->isDelayed()){ $nextRun = $this->currentTick + $handler->getDelay(); @@ -128,7 +166,7 @@ class TaskScheduler{ } $this->currentTick = $currentTick; while($this->isReady($this->currentTick)){ - /** @var TaskHandler $task */ + /** @phpstan-var TaskHandler $task */ $task = $this->queue->extract(); if($task->isCancelled()){ $this->tasks->remove($task); diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 563af69bff..77f8efee64 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -30,6 +30,7 @@ use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\player\Player; use pocketmine\scheduler\AsyncTask; +use pocketmine\scheduler\Task; use pocketmine\scheduler\TaskHandler; use function get_class; use function str_starts_with; @@ -192,6 +193,10 @@ abstract class Timings{ } + /** + * @template TTask of Task + * @phpstan-param TaskHandler $task + */ public static function getScheduledTaskTimings(TaskHandler $task, int $period) : TimingsHandler{ self::init(); $name = "Task: " . $task->getTaskName(); diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index e778cf0047..f37d238784 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -801,7 +801,7 @@ parameters: path: ../../../src/scheduler/BulkCurlTask.php - - message: "#^Cannot call method getNextRun\\(\\) on array\\\\|int\\|pocketmine\\\\scheduler\\\\TaskHandler\\.$#" + message: "#^Cannot call method getNextRun\\(\\) on array\\\\>\\|int\\|pocketmine\\\\scheduler\\\\TaskHandler\\\\.$#" count: 1 path: ../../../src/scheduler/TaskScheduler.php From a5f607138c491ef55431f5d20baf31d03be59769 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:01:26 +0100 Subject: [PATCH 1847/1858] Implement Ice Bomb (#5452) Co-authored-by: Dylan K. Taylor --- .../ItemSerializerDeserializerRegistrar.php | 1 + src/entity/EntityFactory.php | 5 ++ src/entity/projectile/IceBomb.php | 86 +++++++++++++++++++ src/item/IceBomb.php | 48 +++++++++++ src/item/ItemTypeIds.php | 3 +- src/item/StringToItemParser.php | 1 + src/item/VanillaItems.php | 2 + src/world/sound/IceBombHitSound.php | 34 ++++++++ 8 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 src/entity/projectile/IceBomb.php create mode 100644 src/item/IceBomb.php create mode 100644 src/world/sound/IceBombHitSound.php diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php index 7803cea5c7..8240bf0634 100644 --- a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -266,6 +266,7 @@ final class ItemSerializerDeserializerRegistrar{ $this->map1to1Item(Ids::HONEY_BOTTLE, Items::HONEY_BOTTLE()); $this->map1to1Item(Ids::HONEYCOMB, Items::HONEYCOMB()); $this->map1to1Item(Ids::HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE()); + $this->map1to1Item(Ids::ICE_BOMB, Items::ICE_BOMB()); $this->map1to1Item(Ids::INK_SAC, Items::INK_SAC()); $this->map1to1Item(Ids::IRON_AXE, Items::IRON_AXE()); $this->map1to1Item(Ids::IRON_BOOTS, Items::IRON_BOOTS()); diff --git a/src/entity/EntityFactory.php b/src/entity/EntityFactory.php index 3d53233ab7..03d9c03e6b 100644 --- a/src/entity/EntityFactory.php +++ b/src/entity/EntityFactory.php @@ -43,6 +43,7 @@ use pocketmine\entity\projectile\Arrow; use pocketmine\entity\projectile\Egg; use pocketmine\entity\projectile\EnderPearl; use pocketmine\entity\projectile\ExperienceBottle; +use pocketmine\entity\projectile\IceBomb; use pocketmine\entity\projectile\Snowball; use pocketmine\entity\projectile\SplashPotion; use pocketmine\item\Item; @@ -120,6 +121,10 @@ final class EntityFactory{ return new FallingBlock(Helper::parseLocation($nbt, $world), FallingBlock::parseBlockNBT(RuntimeBlockStateRegistry::getInstance(), $nbt), $nbt); }, ['FallingSand', 'minecraft:falling_block']); + $this->register(IceBomb::class, function(World $world, CompoundTag $nbt) : IceBomb{ + return new IceBomb(Helper::parseLocation($nbt, $world), null, $nbt); + }, ['minecraft:ice_bomb']); + $this->register(ItemEntity::class, function(World $world, CompoundTag $nbt) : ItemEntity{ $itemTag = $nbt->getCompoundTag(ItemEntity::TAG_ITEM); if($itemTag === null){ diff --git a/src/entity/projectile/IceBomb.php b/src/entity/projectile/IceBomb.php new file mode 100644 index 0000000000..69a5d46a2c --- /dev/null +++ b/src/entity/projectile/IceBomb.php @@ -0,0 +1,86 @@ +getTypeId() === BlockTypeIds::WATER){ + $pos = $block->getPosition(); + + return AxisAlignedBB::one()->offset($pos->x, $pos->y, $pos->z)->calculateIntercept($start, $end); + } + + return parent::calculateInterceptWithBlock($block, $start, $end); + } + + protected function onHit(ProjectileHitEvent $event) : void{ + $world = $this->getWorld(); + $pos = $this->location; + + $world->addSound($pos, new IceBombHitSound()); + $itemBreakParticle = new ItemBreakParticle(VanillaItems::ICE_BOMB()); + for($i = 0; $i < 6; ++$i){ + $world->addParticle($pos, $itemBreakParticle); + } + } + + protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ + parent::onHitBlock($blockHit, $hitResult); + + $pos = $blockHit->getPosition(); + $world = $pos->getWorld(); + $posX = $pos->getFloorX(); + $posY = $pos->getFloorY(); + $posZ = $pos->getFloorZ(); + + $ice = VanillaBlocks::ICE(); + for($x = $posX - 1; $x <= $posX + 1; $x++){ + for($y = $posY - 1; $y <= $posY + 1; $y++){ + for($z = $posZ - 1; $z <= $posZ + 1; $z++){ + if($world->getBlockAt($x, $y, $z)->getTypeId() === BlockTypeIds::WATER){ + $world->setBlockAt($x, $y, $z, $ice); + } + } + } + } + } +} diff --git a/src/item/IceBomb.php b/src/item/IceBomb.php new file mode 100644 index 0000000000..fbc9f24a2f --- /dev/null +++ b/src/item/IceBomb.php @@ -0,0 +1,48 @@ +register("honey_bottle", fn() => Items::HONEY_BOTTLE()); $result->register("host_armor_trim_smithing_template", fn() => Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE()); $result->register("honeycomb", fn() => Items::HONEYCOMB()); + $result->register("ice_bomb", fn() => Items::ICE_BOMB()); $result->register("ink_sac", fn() => Items::INK_SAC()); $result->register("iron_axe", fn() => Items::IRON_AXE()); $result->register("iron_boots", fn() => Items::IRON_BOOTS()); diff --git a/src/item/VanillaItems.php b/src/item/VanillaItems.php index 5899b63576..dcf59daf6b 100644 --- a/src/item/VanillaItems.php +++ b/src/item/VanillaItems.php @@ -192,6 +192,7 @@ use function strtolower; * @method static Item HONEYCOMB() * @method static HoneyBottle HONEY_BOTTLE() * @method static Item HOST_ARMOR_TRIM_SMITHING_TEMPLATE() + * @method static IceBomb ICE_BOMB() * @method static Item INK_SAC() * @method static Axe IRON_AXE() * @method static Armor IRON_BOOTS() @@ -504,6 +505,7 @@ final class VanillaItems{ self::register("heart_of_the_sea", fn(IID $id) => new Item($id, "Heart of the Sea")); self::register("honey_bottle", fn(IID $id) => new HoneyBottle($id, "Honey Bottle")); self::register("honeycomb", fn(IID $id) => new Item($id, "Honeycomb")); + self::register("ice_bomb", fn(IID $id) => new IceBomb($id, "Ice Bomb")); self::register("ink_sac", fn(IID $id) => new Item($id, "Ink Sac")); self::register("iron_ingot", fn(IID $id) => new Item($id, "Iron Ingot")); self::register("iron_nugget", fn(IID $id) => new Item($id, "Iron Nugget")); diff --git a/src/world/sound/IceBombHitSound.php b/src/world/sound/IceBombHitSound.php new file mode 100644 index 0000000000..7dcdeebf67 --- /dev/null +++ b/src/world/sound/IceBombHitSound.php @@ -0,0 +1,34 @@ + Date: Sun, 24 Nov 2024 23:49:21 +0000 Subject: [PATCH 1848/1858] Candle: fix extinguish logic closes #5983 --- src/block/CakeWithCandle.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/block/CakeWithCandle.php b/src/block/CakeWithCandle.php index 4479faee10..380d080c5d 100644 --- a/src/block/CakeWithCandle.php +++ b/src/block/CakeWithCandle.php @@ -52,6 +52,9 @@ class CakeWithCandle extends BaseCake{ } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ + if($this->lit && $face !== Facing::UP){ + return true; + } if($this->onInteractCandle($item, $face, $clickVector, $player, $returnedItems)){ return true; } From aef4fa71747b1773541bc7a294c98b8a40565127 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Nov 2024 23:50:30 +0000 Subject: [PATCH 1849/1858] Remove unused variable --- src/network/mcpe/InventoryManager.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index e4c303121f..70c427aa17 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -592,7 +592,6 @@ class InventoryManager{ $info = $this->trackItemStack($entry, $slot, $itemStack, null); $contents[] = new ItemStackWrapper($info->getStackId(), $itemStack); } - $clearSlotWrapper = new ItemStackWrapper(0, ItemStack::null()); if($entry->complexSlotMap !== null){ foreach($contents as $slotId => $info){ $packetSlot = $entry->complexSlotMap->mapCoreToNet($slotId) ?? null; From 5325ecee373bbba5fb9e4a42ffbe38adb8655e6c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 25 Nov 2024 14:30:58 +0000 Subject: [PATCH 1850/1858] Deal with a whole lot of PHPStan suppressed key casting errors closes #6534 --- build/generate-biome-ids.php | 2 +- ...enerate-pocketmine-yml-property-consts.php | 2 +- build/generate-registry-annotations.php | 4 ++- src/MemoryManager.php | 10 +++---- src/Server.php | 13 +++++++-- src/block/RuntimeBlockStateRegistry.php | 1 + src/block/inventory/EnchantInventory.php | 5 +++- src/block/utils/SignText.php | 7 ++++- src/command/Command.php | 13 +++++++-- src/command/SimpleCommandMap.php | 11 ++++++-- src/crafting/CraftingManager.php | 6 ++-- .../CraftingManagerFromDataHelper.php | 2 +- src/crafting/CraftingRecipe.php | 2 ++ src/crafting/ShapedRecipe.php | 28 ++++++++++++++----- src/crafting/ShapelessRecipe.php | 17 +++++++---- src/crash/CrashDumpData.php | 10 +++++-- src/data/bedrock/ItemTagToIdMap.php | 2 +- src/data/bedrock/LegacyToStringIdMap.php | 3 +- .../item/upgrade/R12ItemIdToBlockIdMap.php | 2 +- src/entity/Entity.php | 5 +++- src/event/HandlerList.php | 5 +++- src/inventory/BaseInventory.php | 7 +++-- src/inventory/CreativeInventory.php | 6 +++- .../transaction/CraftingTransaction.php | 19 +++++++++++-- .../transaction/InventoryTransaction.php | 23 +++++++++------ src/item/ItemEnchantmentHandlingTrait.php | 6 +++- src/item/LegacyStringToItemParser.php | 3 +- src/lang/Language.php | 4 +-- src/lang/Translatable.php | 4 ++- src/network/NetworkSessionManager.php | 10 +++++-- src/network/mcpe/InventoryManager.php | 1 + src/network/mcpe/NetworkSession.php | 2 +- .../mcpe/StandardPacketBroadcaster.php | 1 - src/network/mcpe/cache/ChunkCache.php | 5 +++- .../convert/BlockStateDictionaryEntry.php | 5 +++- .../ItemTypeDictionaryFromDataHelper.php | 3 +- .../mcpe/handler/InGamePacketHandler.php | 2 +- .../mcpe/handler/ItemStackRequestExecutor.php | 3 +- .../mcpe/handler/LoginPacketHandler.php | 2 +- src/permission/BanList.php | 8 ++++-- src/permission/PermissionAttachment.php | 10 +++++-- src/permission/PermissionManager.php | 13 +++++++-- src/plugin/ApiVersion.php | 4 +-- src/plugin/PluginDescription.php | 5 ++-- src/plugin/PluginGraylist.php | 3 +- src/plugin/PluginManager.php | 13 +++++++-- src/promise/Promise.php | 3 +- src/resourcepacks/ResourcePackManager.php | 3 +- src/utils/Utils.php | 15 +++++++++- src/world/BlockTransaction.php | 5 +++- src/world/WorldManager.php | 6 +++- src/world/format/SubChunk.php | 10 ++++--- src/world/format/io/BaseWorldProvider.php | 2 ++ src/world/format/io/ChunkData.php | 15 ++++++++-- .../format/io/region/RegionGarbageMap.php | 10 +++---- src/world/format/io/region/RegionLoader.php | 8 ++++-- .../format/io/region/RegionWorldProvider.php | 5 +++- src/world/generator/PopulationTask.php | 6 ++-- tests/phpstan/configs/phpstan-bugs.neon | 5 ++++ .../rules/UnsafeForeachArrayOfStringRule.php | 26 ++++++++++++++--- tests/phpunit/block/BlockTest.php | 2 +- tests/phpunit/item/ItemTest.php | 1 - .../utils/CloningRegistryTraitTest.php | 2 +- tests/phpunit/utils/TestCloningRegistry.php | 6 +++- tools/compact-regions.php | 6 ++-- tools/generate-bedrock-data-from-packets.php | 14 +++++----- 66 files changed, 338 insertions(+), 124 deletions(-) diff --git a/build/generate-biome-ids.php b/build/generate-biome-ids.php index f36591fe4d..56f871f431 100644 --- a/build/generate-biome-ids.php +++ b/build/generate-biome-ids.php @@ -122,7 +122,7 @@ if(!is_array($ids)){ throw new \RuntimeException("Invalid biome ID map, expected array for root JSON object"); } $cleanedIds = []; -foreach($ids as $name => $id){ +foreach(Utils::promoteKeys($ids) as $name => $id){ if(!is_string($name) || !is_int($id)){ throw new \RuntimeException("Invalid biome ID map, expected string => int map"); } diff --git a/build/generate-pocketmine-yml-property-consts.php b/build/generate-pocketmine-yml-property-consts.php index dcc574f8ab..f90f3fc667 100644 --- a/build/generate-pocketmine-yml-property-consts.php +++ b/build/generate-pocketmine-yml-property-consts.php @@ -42,7 +42,7 @@ $constants = []; * @phpstan-param-out array $constants */ function collectProperties(string $prefix, array $properties, array &$constants) : void{ - foreach($properties as $propertyName => $property){ + foreach(Utils::promoteKeys($properties) as $propertyName => $property){ $fullPropertyName = ($prefix !== "" ? $prefix . "." : "") . $propertyName; $constName = str_replace([".", "-"], "_", strtoupper($fullPropertyName)); diff --git a/build/generate-registry-annotations.php b/build/generate-registry-annotations.php index bcdaee4eba..35d0893954 100644 --- a/build/generate-registry-annotations.php +++ b/build/generate-registry-annotations.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\build\update_registry_annotations; +use pocketmine\utils\Utils; use function basename; use function class_exists; use function count; @@ -48,6 +49,7 @@ if(count($argv) !== 2){ /** * @param object[] $members + * @phpstan-param array $members */ function generateMethodAnnotations(string $namespaceName, array $members) : string{ $selfName = basename(__FILE__); @@ -60,7 +62,7 @@ function generateMethodAnnotations(string $namespaceName, array $members) : stri static $lineTmpl = " * @method static %2\$s %s()"; $memberLines = []; - foreach($members as $name => $member){ + foreach(Utils::stringifyKeys($members) as $name => $member){ $reflect = new \ReflectionClass($member); while($reflect !== false && $reflect->isAnonymous()){ $reflect = $reflect->getParentClass(); diff --git a/src/MemoryManager.php b/src/MemoryManager.php index 96e3bf49cd..4308167d37 100644 --- a/src/MemoryManager.php +++ b/src/MemoryManager.php @@ -332,7 +332,7 @@ class MemoryManager{ continue; } $methodStatics = []; - foreach($method->getStaticVariables() as $name => $variable){ + foreach(Utils::promoteKeys($method->getStaticVariables()) as $name => $variable){ $methodStatics[$name] = self::continueDump($variable, $objects, $refCounts, 0, $maxNesting, $maxStringSize); } if(count($methodStatics) > 0){ @@ -360,7 +360,7 @@ class MemoryManager{ '_SESSION' => true ]; - foreach($GLOBALS as $varName => $value){ + foreach(Utils::promoteKeys($GLOBALS) as $varName => $value){ if(isset($ignoredGlobals[$varName])){ continue; } @@ -376,7 +376,7 @@ class MemoryManager{ $reflect = new \ReflectionFunction($function); $vars = []; - foreach($reflect->getStaticVariables() as $varName => $variable){ + foreach(Utils::promoteKeys($reflect->getStaticVariables()) as $varName => $variable){ $vars[$varName] = self::continueDump($variable, $objects, $refCounts, 0, $maxNesting, $maxStringSize); } if(count($vars) > 0){ @@ -416,7 +416,7 @@ class MemoryManager{ $info["this"] = self::continueDump($closureThis, $objects, $refCounts, 0, $maxNesting, $maxStringSize); } - foreach($reflect->getStaticVariables() as $name => $variable){ + foreach(Utils::promoteKeys($reflect->getStaticVariables()) as $name => $variable){ $info["referencedVars"][$name] = self::continueDump($variable, $objects, $refCounts, 0, $maxNesting, $maxStringSize); } }else{ @@ -499,7 +499,7 @@ class MemoryManager{ } $data = []; $numeric = 0; - foreach($from as $key => $value){ + foreach(Utils::promoteKeys($from) as $key => $value){ $data[$numeric] = [ "k" => self::continueDump($key, $objects, $refCounts, $recursion + 1, $maxNesting, $maxStringSize), "v" => self::continueDump($value, $objects, $refCounts, $recursion + 1, $maxNesting, $maxStringSize), diff --git a/src/Server.php b/src/Server.php index a34349bb5c..074088068b 100644 --- a/src/Server.php +++ b/src/Server.php @@ -736,12 +736,15 @@ class Server{ /** * @return string[][] + * @phpstan-return array> */ public function getCommandAliases() : array{ $section = $this->configGroup->getProperty(Yml::ALIASES); $result = []; if(is_array($section)){ - foreach($section as $key => $value){ + foreach(Utils::promoteKeys($section) as $key => $value){ + //TODO: more validation needed here + //key might not be a string, value might not be list $commands = []; if(is_array($value)){ $commands = $value; @@ -749,7 +752,7 @@ class Server{ $commands[] = (string) $value; } - $result[$key] = $commands; + $result[(string) $key] = $commands; } } @@ -1094,7 +1097,11 @@ class Server{ $anyWorldFailedToLoad = false; - foreach((array) $this->configGroup->getProperty(Yml::WORLDS, []) as $name => $options){ + foreach(Utils::promoteKeys((array) $this->configGroup->getProperty(Yml::WORLDS, [])) as $name => $options){ + if(!is_string($name)){ + //TODO: this probably should be an error + continue; + } if($options === null){ $options = []; }elseif(!is_array($options)){ diff --git a/src/block/RuntimeBlockStateRegistry.php b/src/block/RuntimeBlockStateRegistry.php index 78be658bc1..a8ece7722c 100644 --- a/src/block/RuntimeBlockStateRegistry.php +++ b/src/block/RuntimeBlockStateRegistry.php @@ -132,6 +132,7 @@ class RuntimeBlockStateRegistry{ /** * @return Block[] + * @phpstan-return array */ public function getAllKnownStates() : array{ return $this->fullList; diff --git a/src/block/inventory/EnchantInventory.php b/src/block/inventory/EnchantInventory.php index b726dbedf3..6dffbad32b 100644 --- a/src/block/inventory/EnchantInventory.php +++ b/src/block/inventory/EnchantInventory.php @@ -39,7 +39,10 @@ class EnchantInventory extends SimpleInventory implements BlockInventory, Tempor public const SLOT_INPUT = 0; public const SLOT_LAPIS = 1; - /** @var EnchantingOption[] $options */ + /** + * @var EnchantingOption[] $options + * @phpstan-var list + */ private array $options = []; public function __construct(Position $holder){ diff --git a/src/block/utils/SignText.php b/src/block/utils/SignText.php index 51285d2679..a7e8759b8d 100644 --- a/src/block/utils/SignText.php +++ b/src/block/utils/SignText.php @@ -36,13 +36,17 @@ use function str_contains; class SignText{ public const LINE_COUNT = 4; - /** @var string[] */ + /** + * @var string[] + * @phpstan-var array{0: string, 1: string, 2: string, 3: string} + */ private array $lines; private Color $baseColor; private bool $glowing; /** * @param string[]|null $lines index-sensitive; keys 0-3 will be used, regardless of array order + * @phpstan-param array{0?: string, 1?: string, 2?: string, 3?: string}|null $lines * * @throws \InvalidArgumentException if the array size is greater than 4 * @throws \InvalidArgumentException if invalid keys (out of bounds or string) are found in the array @@ -82,6 +86,7 @@ class SignText{ * Returns an array of lines currently on the sign. * * @return string[] + * @phpstan-return array{0: string, 1: string, 2: string, 3: string} */ public function getLines() : array{ return $this->lines; diff --git a/src/command/Command.php b/src/command/Command.php index 02bae60d9e..4c2c6815b2 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -44,10 +44,16 @@ abstract class Command{ private string $nextLabel; private string $label; - /** @var string[] */ + /** + * @var string[] + * @phpstan-var list + */ private array $aliases = []; - /** @var string[] */ + /** + * @var string[] + * @phpstan-var list + */ private array $activeAliases = []; private ?CommandMap $commandMap = null; @@ -62,6 +68,7 @@ abstract class Command{ /** * @param string[] $aliases + * @phpstan-param list $aliases */ public function __construct(string $name, Translatable|string $description = "", Translatable|string|null $usageMessage = null, array $aliases = []){ $this->name = $name; @@ -182,6 +189,7 @@ abstract class Command{ /** * @return string[] + * @phpstan-return list */ public function getAliases() : array{ return $this->activeAliases; @@ -201,6 +209,7 @@ abstract class Command{ /** * @param string[] $aliases + * @phpstan-param list $aliases */ public function setAliases(array $aliases) : void{ $this->aliases = $aliases; diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 1268e715b7..06367994a0 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -70,6 +70,7 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\TextFormat; +use pocketmine\utils\Utils; use function array_shift; use function count; use function implode; @@ -80,7 +81,10 @@ use function trim; class SimpleCommandMap implements CommandMap{ - /** @var Command[] */ + /** + * @var Command[] + * @phpstan-var array + */ protected array $knownCommands = []; public function __construct(private Server $server){ @@ -169,7 +173,7 @@ class SimpleCommandMap implements CommandMap{ } public function unregister(Command $command) : bool{ - foreach($this->knownCommands as $lbl => $cmd){ + foreach(Utils::promoteKeys($this->knownCommands) as $lbl => $cmd){ if($cmd === $command){ unset($this->knownCommands[$lbl]); } @@ -237,6 +241,7 @@ class SimpleCommandMap implements CommandMap{ /** * @return Command[] + * @phpstan-return array */ public function getCommands() : array{ return $this->knownCommands; @@ -245,7 +250,7 @@ class SimpleCommandMap implements CommandMap{ public function registerServerAliases() : void{ $values = $this->server->getCommandAliases(); - foreach($values as $alias => $commandStrings){ + foreach(Utils::stringifyKeys($values) as $alias => $commandStrings){ if(str_contains($alias, ":")){ $this->server->getLogger()->warning($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_command_alias_illegal($alias))); continue; diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index c7c0b10c64..ff2be69268 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -110,14 +110,15 @@ class CraftingManager{ /** * @param Item[] $items + * @phpstan-param list $items * * @return Item[] + * @phpstan-return list */ private static function pack(array $items) : array{ - /** @var Item[] $result */ $result = []; - foreach($items as $i => $item){ + foreach($items as $item){ foreach($result as $otherItem){ if($item->canStackWith($otherItem)){ $otherItem->setCount($otherItem->getCount() + $item->getCount()); @@ -134,6 +135,7 @@ class CraftingManager{ /** * @param Item[] $outputs + * @phpstan-param list $outputs */ private static function hashOutputs(array $outputs) : string{ $outputs = self::pack($outputs); diff --git a/src/crafting/CraftingManagerFromDataHelper.php b/src/crafting/CraftingManagerFromDataHelper.php index 616c2a4bd3..3df6bfb62a 100644 --- a/src/crafting/CraftingManagerFromDataHelper.php +++ b/src/crafting/CraftingManagerFromDataHelper.php @@ -193,7 +193,7 @@ final class CraftingManagerFromDataHelper{ */ private static function loadJsonObjectListIntoModel(\JsonMapper $mapper, string $modelClass, array $data) : array{ $result = []; - foreach($data as $i => $item){ + foreach(Utils::promoteKeys($data) as $i => $item){ if(!is_object($item)){ throw new SavedDataLoadingException("Invalid entry at index $i: expected object, got " . get_debug_type($item)); } diff --git a/src/crafting/CraftingRecipe.php b/src/crafting/CraftingRecipe.php index 02e6fce040..d7342aae31 100644 --- a/src/crafting/CraftingRecipe.php +++ b/src/crafting/CraftingRecipe.php @@ -30,6 +30,7 @@ interface CraftingRecipe{ * Returns a list of items needed to craft this recipe. This MUST NOT include Air items or items with a zero count. * * @return RecipeIngredient[] + * @phpstan-return list */ public function getIngredientList() : array; @@ -37,6 +38,7 @@ interface CraftingRecipe{ * Returns a list of results this recipe will produce when the inputs in the given crafting grid are consumed. * * @return Item[] + * @phpstan-return list */ public function getResultsFor(CraftingGrid $grid) : array; diff --git a/src/crafting/ShapedRecipe.php b/src/crafting/ShapedRecipe.php index f13ba3ae74..4c40eb0f50 100644 --- a/src/crafting/ShapedRecipe.php +++ b/src/crafting/ShapedRecipe.php @@ -32,11 +32,20 @@ use function str_contains; use function strlen; class ShapedRecipe implements CraftingRecipe{ - /** @var string[] */ + /** + * @var string[] + * @phpstan-var list + */ private array $shape = []; - /** @var RecipeIngredient[] char => RecipeIngredient map */ + /** + * @var RecipeIngredient[] char => RecipeIngredient map + * @phpstan-var array + */ private array $ingredientList = []; - /** @var Item[] */ + /** + * @var Item[] + * @phpstan-var list + */ private array $results = []; private int $height; @@ -56,6 +65,10 @@ class ShapedRecipe implements CraftingRecipe{ * @param Item[] $results List of items that this recipe produces when crafted. * * Note: Recipes **do not** need to be square. Do NOT add padding for empty rows/columns. + * + * @phpstan-param list $shape + * @phpstan-param array $ingredients + * @phpstan-param list $results */ public function __construct(array $shape, array $ingredients, array $results){ $this->height = count($shape); @@ -84,7 +97,7 @@ class ShapedRecipe implements CraftingRecipe{ $this->shape = $shape; - foreach($ingredients as $char => $i){ + foreach(Utils::stringifyKeys($ingredients) as $char => $i){ if(!str_contains(implode($this->shape), $char)){ throw new \InvalidArgumentException("Symbol '$char' does not appear in the recipe shape"); } @@ -105,6 +118,7 @@ class ShapedRecipe implements CraftingRecipe{ /** * @return Item[] + * @phpstan-return list */ public function getResults() : array{ return Utils::cloneObjectArray($this->results); @@ -112,6 +126,7 @@ class ShapedRecipe implements CraftingRecipe{ /** * @return Item[] + * @phpstan-return list */ public function getResultsFor(CraftingGrid $grid) : array{ return $this->getResults(); @@ -119,6 +134,7 @@ class ShapedRecipe implements CraftingRecipe{ /** * @return (RecipeIngredient|null)[][] + * @phpstan-return list> */ public function getIngredientMap() : array{ $ingredients = []; @@ -132,9 +148,6 @@ class ShapedRecipe implements CraftingRecipe{ return $ingredients; } - /** - * @return RecipeIngredient[] - */ public function getIngredientList() : array{ $ingredients = []; @@ -157,6 +170,7 @@ class ShapedRecipe implements CraftingRecipe{ /** * Returns an array of strings containing characters representing the recipe's shape. * @return string[] + * @phpstan-return list */ public function getShape() : array{ return $this->shape; diff --git a/src/crafting/ShapelessRecipe.php b/src/crafting/ShapelessRecipe.php index a9e1f023c5..7a4a22fda7 100644 --- a/src/crafting/ShapelessRecipe.php +++ b/src/crafting/ShapelessRecipe.php @@ -28,15 +28,24 @@ use pocketmine\utils\Utils; use function count; class ShapelessRecipe implements CraftingRecipe{ - /** @var RecipeIngredient[] */ + /** + * @var RecipeIngredient[] + * @phpstan-var list + */ private array $ingredients = []; - /** @var Item[] */ + /** + * @var Item[] + * @phpstan-var list + */ private array $results; private ShapelessRecipeType $type; /** * @param RecipeIngredient[] $ingredients No more than 9 total. This applies to sum of item stack counts, not count of array. * @param Item[] $results List of result items created by this recipe. + * + * @phpstan-param list $ingredients + * @phpstan-param list $results */ public function __construct(array $ingredients, array $results, ShapelessRecipeType $type){ $this->type = $type; @@ -50,6 +59,7 @@ class ShapelessRecipe implements CraftingRecipe{ /** * @return Item[] + * @phpstan-return list */ public function getResults() : array{ return Utils::cloneObjectArray($this->results); @@ -63,9 +73,6 @@ class ShapelessRecipe implements CraftingRecipe{ return $this->type; } - /** - * @return RecipeIngredient[] - */ public function getIngredientList() : array{ return $this->ingredients; } diff --git a/src/crash/CrashDumpData.php b/src/crash/CrashDumpData.php index b71e6f405b..f8a20abd5b 100644 --- a/src/crash/CrashDumpData.php +++ b/src/crash/CrashDumpData.php @@ -43,7 +43,10 @@ final class CrashDumpData implements \JsonSerializable{ public string $plugin = ""; - /** @var string[] */ + /** + * @var string[] + * @phpstan-var array + */ public array $code = []; /** @var string[] */ @@ -55,7 +58,10 @@ final class CrashDumpData implements \JsonSerializable{ */ public array $plugins = []; - /** @var string[] */ + /** + * @var string[] + * @phpstan-var list + */ public array $parameters = []; public string $serverDotProperties = ""; diff --git a/src/data/bedrock/ItemTagToIdMap.php b/src/data/bedrock/ItemTagToIdMap.php index 84f2ff451f..af9cb3ce55 100644 --- a/src/data/bedrock/ItemTagToIdMap.php +++ b/src/data/bedrock/ItemTagToIdMap.php @@ -48,7 +48,7 @@ final class ItemTagToIdMap{ throw new AssumptionFailedError("Invalid item tag map, expected array"); } $cleanMap = []; - foreach($map as $tagName => $ids){ + foreach(Utils::promoteKeys($map) as $tagName => $ids){ if(!is_string($tagName)){ throw new AssumptionFailedError("Invalid item tag name $tagName, expected string as key"); } diff --git a/src/data/bedrock/LegacyToStringIdMap.php b/src/data/bedrock/LegacyToStringIdMap.php index 2b5375db23..1a92f2b6b8 100644 --- a/src/data/bedrock/LegacyToStringIdMap.php +++ b/src/data/bedrock/LegacyToStringIdMap.php @@ -25,6 +25,7 @@ namespace pocketmine\data\bedrock; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; +use pocketmine\utils\Utils; use function is_array; use function is_int; use function is_string; @@ -43,7 +44,7 @@ abstract class LegacyToStringIdMap{ if(!is_array($stringToLegacyId)){ throw new AssumptionFailedError("Invalid format of ID map"); } - foreach($stringToLegacyId as $stringId => $legacyId){ + foreach(Utils::promoteKeys($stringToLegacyId) as $stringId => $legacyId){ if(!is_string($stringId) || !is_int($legacyId)){ throw new AssumptionFailedError("ID map should have string keys and int values"); } diff --git a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php index 2aac8de64e..19cfe6c78d 100644 --- a/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php +++ b/src/data/bedrock/item/upgrade/R12ItemIdToBlockIdMap.php @@ -56,7 +56,7 @@ final class R12ItemIdToBlockIdMap{ } $builtMap = []; - foreach($map as $itemId => $blockId){ + foreach(Utils::promoteKeys($map) as $itemId => $blockId){ if(!is_string($itemId)){ throw new AssumptionFailedError("Invalid blockitem ID mapping table, expected string as key"); } diff --git a/src/entity/Entity.php b/src/entity/Entity.php index c55a8716ca..3d791ebca6 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -102,7 +102,10 @@ abstract class Entity{ return self::$entityCount++; } - /** @var Player[] */ + /** + * @var Player[] + * @phpstan-var array + */ protected array $hasSpawned = []; protected int $id; diff --git a/src/event/HandlerList.php b/src/event/HandlerList.php index 2072cd5226..e7d229a3ff 100644 --- a/src/event/HandlerList.php +++ b/src/event/HandlerList.php @@ -30,7 +30,10 @@ use function spl_object_id; use const SORT_NUMERIC; class HandlerList{ - /** @var RegisteredListener[][] */ + /** + * @var RegisteredListener[][] + * @phpstan-var array> + */ private array $handlerSlots = []; /** @var RegisteredListenerCache[] */ diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 522c827a4b..0d5d1ffe60 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -41,7 +41,10 @@ use function spl_object_id; */ abstract class BaseInventory implements Inventory, SlotValidatedInventory{ protected int $maxStackSize = Inventory::MAX_STACK; - /** @var Player[] */ + /** + * @var Player[] + * @phpstan-var array + */ protected array $viewers = []; /** * @var InventoryListener[]|ObjectSet @@ -286,8 +289,6 @@ abstract class BaseInventory implements Inventory, SlotValidatedInventory{ } public function removeItem(Item ...$slots) : array{ - /** @var Item[] $searchItems */ - /** @var Item[] $slots */ $searchItems = []; foreach($slots as $slot){ if(!$slot->isNull()){ diff --git a/src/inventory/CreativeInventory.php b/src/inventory/CreativeInventory.php index 7502a6785f..57e5cbb4e6 100644 --- a/src/inventory/CreativeInventory.php +++ b/src/inventory/CreativeInventory.php @@ -36,7 +36,10 @@ final class CreativeInventory{ use SingletonTrait; use DestructorCallbackTrait; - /** @var Item[] */ + /** + * @var Item[] + * @phpstan-var array + */ private array $creative = []; /** @phpstan-var ObjectSet<\Closure() : void> */ @@ -69,6 +72,7 @@ final class CreativeInventory{ /** * @return Item[] + * @phpstan-return array */ public function getAll() : array{ return Utils::cloneObjectArray($this->creative); diff --git a/src/inventory/transaction/CraftingTransaction.php b/src/inventory/transaction/CraftingTransaction.php index 2ae231b6e8..9e3c505520 100644 --- a/src/inventory/transaction/CraftingTransaction.php +++ b/src/inventory/transaction/CraftingTransaction.php @@ -57,9 +57,15 @@ class CraftingTransaction extends InventoryTransaction{ protected ?CraftingRecipe $recipe = null; protected ?int $repetitions = null; - /** @var Item[] */ + /** + * @var Item[] + * @phpstan-var list + */ protected array $inputs = []; - /** @var Item[] */ + /** + * @var Item[] + * @phpstan-var list + */ protected array $outputs = []; private CraftingManager $craftingManager; @@ -74,6 +80,9 @@ class CraftingTransaction extends InventoryTransaction{ /** * @param Item[] $providedItems * @return Item[] + * + * @phpstan-param list $providedItems + * @phpstan-return list */ private static function packItems(array $providedItems) : array{ $packedProvidedItems = []; @@ -94,6 +103,9 @@ class CraftingTransaction extends InventoryTransaction{ /** * @param Item[] $providedItems * @param RecipeIngredient[] $recipeIngredients + * + * @phpstan-param list $providedItems + * @phpstan-param list $recipeIngredients */ public static function matchIngredients(array $providedItems, array $recipeIngredients, int $expectedIterations) : void{ if(count($recipeIngredients) === 0){ @@ -172,6 +184,9 @@ class CraftingTransaction extends InventoryTransaction{ * @param Item[] $txItems * @param Item[] $recipeItems * + * @phpstan-param list $txItems + * @phpstan-param list $recipeItems + * * @throws TransactionValidationException */ protected function matchOutputs(array $txItems, array $recipeItems) : int{ diff --git a/src/inventory/transaction/InventoryTransaction.php b/src/inventory/transaction/InventoryTransaction.php index 2ca00f910c..b3465a8dfb 100644 --- a/src/inventory/transaction/InventoryTransaction.php +++ b/src/inventory/transaction/InventoryTransaction.php @@ -29,6 +29,7 @@ use pocketmine\inventory\transaction\action\InventoryAction; use pocketmine\inventory\transaction\action\SlotChangeAction; use pocketmine\item\Item; use pocketmine\player\Player; +use pocketmine\utils\Utils; use function array_keys; use function array_values; use function assert; @@ -57,10 +58,16 @@ use function spl_object_id; class InventoryTransaction{ protected bool $hasExecuted = false; - /** @var Inventory[] */ + /** + * @var Inventory[] + * @phpstan-var array + */ protected array $inventories = []; - /** @var InventoryAction[] */ + /** + * @var InventoryAction[] + * @phpstan-var array + */ protected array $actions = []; /** @@ -81,6 +88,7 @@ class InventoryTransaction{ /** * @return Inventory[] + * @phpstan-return array */ public function getInventories() : array{ return $this->inventories; @@ -93,6 +101,7 @@ class InventoryTransaction{ * significance and should not be relied on. * * @return InventoryAction[] + * @phpstan-return array */ public function getActions() : array{ return $this->actions; @@ -133,8 +142,8 @@ class InventoryTransaction{ /** * @param Item[] $needItems * @param Item[] $haveItems - * @phpstan-param-out Item[] $needItems - * @phpstan-param-out Item[] $haveItems + * @phpstan-param-out list $needItems + * @phpstan-param-out list $haveItems * * @throws TransactionValidationException */ @@ -188,11 +197,8 @@ class InventoryTransaction{ * wrong order), so this method also tries to chain them into order. */ protected function squashDuplicateSlotChanges() : void{ - /** @var SlotChangeAction[][] $slotChanges */ $slotChanges = []; - /** @var Inventory[] $inventories */ $inventories = []; - /** @var int[] $slots */ $slots = []; foreach($this->actions as $key => $action){ @@ -203,7 +209,7 @@ class InventoryTransaction{ } } - foreach($slotChanges as $hash => $list){ + foreach(Utils::stringifyKeys($slotChanges) as $hash => $list){ if(count($list) === 1){ //No need to compact slot changes if there is only one on this slot continue; } @@ -233,6 +239,7 @@ class InventoryTransaction{ /** * @param SlotChangeAction[] $possibleActions + * @phpstan-param list $possibleActions */ protected function findResultItem(Item $needOrigin, array $possibleActions) : ?Item{ assert(count($possibleActions) > 0); diff --git a/src/item/ItemEnchantmentHandlingTrait.php b/src/item/ItemEnchantmentHandlingTrait.php index d8302e7b36..10da7dd760 100644 --- a/src/item/ItemEnchantmentHandlingTrait.php +++ b/src/item/ItemEnchantmentHandlingTrait.php @@ -33,7 +33,10 @@ use function spl_object_id; * The primary purpose of this trait is providing scope isolation for the methods it contains. */ trait ItemEnchantmentHandlingTrait{ - /** @var EnchantmentInstance[] */ + /** + * @var EnchantmentInstance[] + * @phpstan-var array + */ protected array $enchantments = []; public function hasEnchantments() : bool{ @@ -79,6 +82,7 @@ trait ItemEnchantmentHandlingTrait{ /** * @return EnchantmentInstance[] + * @phpstan-return array */ public function getEnchantments() : array{ return $this->enchantments; diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index a52b6c716e..6969190d5f 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -29,6 +29,7 @@ use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; +use pocketmine\utils\Utils; use pocketmine\world\format\io\GlobalItemDataHandlers; use Symfony\Component\Filesystem\Path; use function explode; @@ -67,7 +68,7 @@ final class LegacyStringToItemParser{ $mappings = json_decode($mappingsRaw, true); if(!is_array($mappings)) throw new AssumptionFailedError("Invalid mappings format, expected array"); - foreach($mappings as $name => $id){ + foreach(Utils::promoteKeys($mappings) as $name => $id){ if(!is_string($id)) throw new AssumptionFailedError("Invalid mappings format, expected string values"); $result->addMapping((string) $name, $id); } diff --git a/src/lang/Language.php b/src/lang/Language.php index a871c820ae..29f28917d8 100644 --- a/src/lang/Language.php +++ b/src/lang/Language.php @@ -147,7 +147,7 @@ class Language{ $baseText = $this->parseTranslation($str, $onlyPrefix); } - foreach($params as $i => $p){ + foreach(Utils::promoteKeys($params) as $i => $p){ $replacement = $p instanceof Translatable ? $this->translate($p) : (string) $p; $baseText = str_replace("{%$i}", $replacement, $baseText); } @@ -161,7 +161,7 @@ class Language{ $baseText = $this->parseTranslation($c->getText()); } - foreach($c->getParameters() as $i => $p){ + foreach(Utils::promoteKeys($c->getParameters()) as $i => $p){ $replacement = $p instanceof Translatable ? $this->translate($p) : $p; $baseText = str_replace("{%$i}", $replacement, $baseText); } diff --git a/src/lang/Translatable.php b/src/lang/Translatable.php index 827a11657b..8dee8f4773 100644 --- a/src/lang/Translatable.php +++ b/src/lang/Translatable.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\lang; +use pocketmine\utils\Utils; + final class Translatable{ /** @var string[]|Translatable[] $params */ protected array $params = []; @@ -34,7 +36,7 @@ final class Translatable{ protected string $text, array $params = [] ){ - foreach($params as $k => $param){ + foreach(Utils::promoteKeys($params) as $k => $param){ if(!($param instanceof Translatable)){ $this->params[$k] = (string) $param; }else{ diff --git a/src/network/NetworkSessionManager.php b/src/network/NetworkSessionManager.php index d8ff7fe038..aecbc646d9 100644 --- a/src/network/NetworkSessionManager.php +++ b/src/network/NetworkSessionManager.php @@ -30,10 +30,16 @@ use function spl_object_id; class NetworkSessionManager{ - /** @var NetworkSession[] */ + /** + * @var NetworkSession[] + * @phpstan-var array + */ private array $sessions = []; - /** @var NetworkSession[] */ + /** + * @var NetworkSession[] + * @phpstan-var array + */ private array $pendingLoginSessions = []; /** diff --git a/src/network/mcpe/InventoryManager.php b/src/network/mcpe/InventoryManager.php index 70c427aa17..7df8c734be 100644 --- a/src/network/mcpe/InventoryManager.php +++ b/src/network/mcpe/InventoryManager.php @@ -695,6 +695,7 @@ class InventoryManager{ /** * @param EnchantingOption[] $options + * @phpstan-param list $options */ public function syncEnchantingTableOptions(array $options) : void{ $protocolOptions = []; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 0eee71e0ee..78b11e27ed 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -1092,7 +1092,7 @@ class NetworkSession{ public function syncAvailableCommands() : void{ $commandData = []; - foreach($this->server->getCommandMap()->getCommands() as $name => $command){ + foreach($this->server->getCommandMap()->getCommands() as $command){ if(isset($commandData[$command->getLabel()]) || $command->getLabel() === "help" || !$command->testPermissionSilent($this->player)){ continue; } diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 32afdeeb7c..7a91b397be 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -53,7 +53,6 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $compressors = []; - /** @var NetworkSession[][] $targetsByCompressor */ $targetsByCompressor = []; foreach($recipients as $recipient){ //TODO: different compressors might be compatible, it might not be necessary to split them up by object diff --git a/src/network/mcpe/cache/ChunkCache.php b/src/network/mcpe/cache/ChunkCache.php index 6d80200857..12e7697762 100644 --- a/src/network/mcpe/cache/ChunkCache.php +++ b/src/network/mcpe/cache/ChunkCache.php @@ -78,7 +78,10 @@ class ChunkCache implements ChunkListener{ } } - /** @var CompressBatchPromise[] */ + /** + * @var CompressBatchPromise[] + * @phpstan-var array + */ private array $caches = []; private int $hits = 0; diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 8c6244da58..28cc3960dc 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -28,6 +28,7 @@ use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\Tag; use pocketmine\nbt\TreeRoot; +use pocketmine\utils\Utils; use function count; use function ksort; use const SORT_STRING; @@ -43,6 +44,7 @@ final class BlockStateDictionaryEntry{ /** * @param Tag[] $stateProperties + * @phpstan-param array $stateProperties */ public function __construct( private string $stateName, @@ -79,6 +81,7 @@ final class BlockStateDictionaryEntry{ /** * @param Tag[] $properties + * @phpstan-param array $properties */ public static function encodeStateProperties(array $properties) : string{ if(count($properties) === 0){ @@ -87,7 +90,7 @@ final class BlockStateDictionaryEntry{ //TODO: make a more efficient encoding - NBT will do for now, but it's not very compact ksort($properties, SORT_STRING); $tag = new CompoundTag(); - foreach($properties as $k => $v){ + foreach(Utils::stringifyKeys($properties) as $k => $v){ $tag->setTag($k, $v); } return (new LittleEndianNbtSerializer())->write(new TreeRoot($tag)); diff --git a/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php b/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php index 5d06758ef5..d962063d35 100644 --- a/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php +++ b/src/network/mcpe/convert/ItemTypeDictionaryFromDataHelper.php @@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe\convert; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\network\mcpe\protocol\types\ItemTypeEntry; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Utils; use function is_array; use function is_bool; use function is_int; @@ -41,7 +42,7 @@ final class ItemTypeDictionaryFromDataHelper{ } $params = []; - foreach($table as $name => $entry){ + foreach(Utils::promoteKeys($table) as $name => $entry){ if(!is_array($entry) || !is_string($name) || !isset($entry["component_based"], $entry["runtime_id"]) || !is_bool($entry["component_based"]) || !is_int($entry["runtime_id"])){ throw new AssumptionFailedError("Invalid item list format"); } diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index c92db31331..cc1f3eab40 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -251,7 +251,7 @@ class InGamePacketHandler extends PacketHandler{ if(count($blockActions) > 100){ throw new PacketHandlingException("Too many block actions in PlayerAuthInputPacket"); } - foreach($blockActions as $k => $blockAction){ + foreach(Utils::promoteKeys($blockActions) as $k => $blockAction){ $actionHandled = false; if($blockAction instanceof PlayerBlockActionStopBreak){ $actionHandled = $this->handlePlayerActionFromData($blockAction->getActionType(), new BlockPosition(0, 0, 0), Facing::DOWN); diff --git a/src/network/mcpe/handler/ItemStackRequestExecutor.php b/src/network/mcpe/handler/ItemStackRequestExecutor.php index 54a1925901..6db8f1e12b 100644 --- a/src/network/mcpe/handler/ItemStackRequestExecutor.php +++ b/src/network/mcpe/handler/ItemStackRequestExecutor.php @@ -54,6 +54,7 @@ use pocketmine\network\mcpe\protocol\types\inventory\stackresponse\ItemStackResp use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset; use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Utils; use function array_key_first; use function count; use function spl_object_id; @@ -370,7 +371,7 @@ class ItemStackRequestExecutor{ * @throws ItemStackRequestProcessException */ public function generateInventoryTransaction() : InventoryTransaction{ - foreach($this->request->getActions() as $k => $action){ + foreach(Utils::promoteKeys($this->request->getActions()) as $k => $action){ try{ $this->processItemStackRequestAction($action); }catch(ItemStackRequestProcessException $e){ diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 2e3a515198..c15753dad3 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -150,7 +150,7 @@ class LoginPacketHandler extends PacketHandler{ protected function fetchAuthData(JwtChain $chain) : AuthenticationData{ /** @var AuthenticationData|null $extraData */ $extraData = null; - foreach($chain->chain as $k => $jwt){ + foreach($chain->chain as $jwt){ //validate every chain element try{ [, $claims, ] = JwtUtils::parse($jwt); diff --git a/src/permission/BanList.php b/src/permission/BanList.php index b09cd98c90..36826ed66f 100644 --- a/src/permission/BanList.php +++ b/src/permission/BanList.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\permission; +use pocketmine\utils\Utils; use function fclose; use function fgets; use function fopen; @@ -32,7 +33,10 @@ use function strtolower; use function trim; class BanList{ - /** @var BanEntry[] */ + /** + * @var BanEntry[] + * @phpstan-var array + */ private array $list = []; private bool $enabled = true; @@ -101,7 +105,7 @@ class BanList{ } public function removeExpired() : void{ - foreach($this->list as $name => $entry){ + foreach(Utils::promoteKeys($this->list) as $name => $entry){ if($entry->hasExpired()){ unset($this->list[$name]); } diff --git a/src/permission/PermissionAttachment.php b/src/permission/PermissionAttachment.php index b01fba3070..79c66ba8a1 100644 --- a/src/permission/PermissionAttachment.php +++ b/src/permission/PermissionAttachment.php @@ -25,10 +25,14 @@ namespace pocketmine\permission; use pocketmine\plugin\Plugin; use pocketmine\plugin\PluginException; +use pocketmine\utils\Utils; use function spl_object_id; class PermissionAttachment{ - /** @var bool[] */ + /** + * @var bool[] + * @phpstan-var array + */ private array $permissions = []; /** @@ -60,6 +64,7 @@ class PermissionAttachment{ /** * @return bool[] + * @phpstan-return array */ public function getPermissions() : array{ return $this->permissions; @@ -78,9 +83,10 @@ class PermissionAttachment{ /** * @param bool[] $permissions + * @phpstan-param array $permissions */ public function setPermissions(array $permissions) : void{ - foreach($permissions as $key => $value){ + foreach(Utils::stringifyKeys($permissions) as $key => $value){ $this->permissions[$key] = $value; } $this->recalculatePermissibles(); diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index 1291ba86bf..f2b02e8e5e 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\permission; +use pocketmine\utils\Utils; use function count; use function spl_object_id; @@ -37,9 +38,15 @@ class PermissionManager{ return self::$instance; } - /** @var Permission[] */ + /** + * @var Permission[] + * @phpstan-var array + */ protected array $permissions = []; - /** @var PermissibleInternal[][] */ + /** + * @var PermissibleInternal[][] + * @phpstan-var array> + */ protected array $permSubs = []; public function getPermission(string $name) : ?Permission{ @@ -82,7 +89,7 @@ class PermissionManager{ } public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ - foreach($this->permSubs as $permission => $subs){ + foreach(Utils::promoteKeys($this->permSubs) as $permission => $subs){ if(count($subs) === 1 && isset($subs[spl_object_id($permissible)])){ unset($this->permSubs[$permission]); }else{ diff --git a/src/plugin/ApiVersion.php b/src/plugin/ApiVersion.php index bcf7e59a04..d95b66576c 100644 --- a/src/plugin/ApiVersion.php +++ b/src/plugin/ApiVersion.php @@ -70,7 +70,6 @@ final class ApiVersion{ * @return string[] */ public static function checkAmbiguousVersions(array $versions) : array{ - /** @var VersionString[][] $indexedVersions */ $indexedVersions = []; foreach($versions as $str){ @@ -85,9 +84,8 @@ final class ApiVersion{ } } - /** @var VersionString[] $result */ $result = []; - foreach($indexedVersions as $major => $list){ + foreach($indexedVersions as $list){ if(count($list) > 1){ array_push($result, ...$list); } diff --git a/src/plugin/PluginDescription.php b/src/plugin/PluginDescription.php index 72f0add7fd..35ae2ba329 100644 --- a/src/plugin/PluginDescription.php +++ b/src/plugin/PluginDescription.php @@ -26,6 +26,7 @@ namespace pocketmine\plugin; use pocketmine\permission\Permission; use pocketmine\permission\PermissionParser; use pocketmine\permission\PermissionParserException; +use pocketmine\utils\Utils; use function array_map; use function array_values; use function get_debug_type; @@ -151,7 +152,7 @@ class PluginDescription{ $this->compatibleOperatingSystems = array_map("\strval", (array) ($plugin[self::KEY_OS] ?? [])); if(isset($plugin[self::KEY_COMMANDS]) && is_array($plugin[self::KEY_COMMANDS])){ - foreach($plugin[self::KEY_COMMANDS] as $commandName => $commandData){ + foreach(Utils::promoteKeys($plugin[self::KEY_COMMANDS]) as $commandName => $commandData){ if(!is_string($commandName)){ throw new PluginDescriptionParseException("Invalid Plugin commands, key must be the name of the command"); } @@ -177,7 +178,7 @@ class PluginDescription{ if(isset($plugin[self::KEY_EXTENSIONS])){ $extensions = (array) $plugin[self::KEY_EXTENSIONS]; $isLinear = $extensions === array_values($extensions); - foreach($extensions as $k => $v){ + foreach(Utils::promoteKeys($extensions) as $k => $v){ if($isLinear){ $k = $v; $v = "*"; diff --git a/src/plugin/PluginGraylist.php b/src/plugin/PluginGraylist.php index 84aa3f7924..ff9d718322 100644 --- a/src/plugin/PluginGraylist.php +++ b/src/plugin/PluginGraylist.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\plugin; +use pocketmine\utils\Utils; use function array_flip; use function is_array; use function is_float; @@ -77,7 +78,7 @@ class PluginGraylist{ if(!is_array($array["plugins"])){ throw new \InvalidArgumentException("\"plugins\" must be an array"); } - foreach($array["plugins"] as $k => $v){ + foreach(Utils::promoteKeys($array["plugins"]) as $k => $v){ if(!is_string($v) && !is_int($v) && !is_float($v)){ throw new \InvalidArgumentException("\"plugins\" contains invalid element at position $k"); } diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 198e4e893b..f84698aa08 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -69,10 +69,16 @@ use function strtolower; * Manages all the plugins */ class PluginManager{ - /** @var Plugin[] */ + /** + * @var Plugin[] + * @phpstan-var array + */ protected array $plugins = []; - /** @var Plugin[] */ + /** + * @var Plugin[] + * @phpstan-var array + */ protected array $enabledPlugins = []; /** @var array> */ @@ -114,6 +120,7 @@ class PluginManager{ /** * @return Plugin[] + * @phpstan-return array */ public function getPlugins() : array{ return $this->plugins; @@ -526,7 +533,7 @@ class PluginManager{ } public function tickSchedulers(int $currentTick) : void{ - foreach($this->enabledPlugins as $pluginName => $p){ + foreach(Utils::promoteKeys($this->enabledPlugins) as $pluginName => $p){ if(isset($this->enabledPlugins[$pluginName])){ //the plugin may have been disabled as a result of updating other plugins' schedulers, and therefore //removed from enabledPlugins; however, foreach will still see it due to copy-on-write diff --git a/src/promise/Promise.php b/src/promise/Promise.php index 0def7e6052..cd8fcc4f1c 100644 --- a/src/promise/Promise.php +++ b/src/promise/Promise.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\promise; +use pocketmine\utils\Utils; use function count; use function spl_object_id; @@ -83,7 +84,7 @@ final class Promise{ $toResolve = count($promises); $continue = true; - foreach($promises as $key => $promise){ + foreach(Utils::promoteKeys($promises) as $key => $promise){ $promise->onCompletion( function(mixed $value) use ($resolver, $key, $toResolve, &$values) : void{ $values[$key] = $value; diff --git a/src/resourcepacks/ResourcePackManager.php b/src/resourcepacks/ResourcePackManager.php index 2df6750def..baf16ca207 100644 --- a/src/resourcepacks/ResourcePackManager.php +++ b/src/resourcepacks/ResourcePackManager.php @@ -25,6 +25,7 @@ namespace pocketmine\resourcepacks; use pocketmine\utils\Config; use pocketmine\utils\Filesystem; +use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; use function array_keys; use function copy; @@ -87,7 +88,7 @@ class ResourcePackManager{ throw new \InvalidArgumentException("\"resource_stack\" key should contain a list of pack names"); } - foreach($resourceStack as $pos => $pack){ + foreach(Utils::promoteKeys($resourceStack) as $pos => $pack){ if(!is_string($pack) && !is_int($pack) && !is_float($pack)){ $logger->critical("Found invalid entry in resource pack list at offset $pos of type " . gettype($pack)); continue; diff --git a/src/utils/Utils.php b/src/utils/Utils.php index ef3f2d2499..551e6ae44f 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -445,6 +445,7 @@ final class Utils{ * @phpstan-param list> $trace * * @return string[] + * @phpstan-return list */ public static function printableTrace(array $trace, int $maxStringLength = 80) : array{ $messages = []; @@ -456,7 +457,7 @@ final class Utils{ }else{ $args = $trace[$i]["params"]; } - /** @var mixed[] $args */ + /** @phpstan-var array $args */ $paramsList = []; $offset = 0; @@ -608,6 +609,18 @@ final class Utils{ } } + /** + * Gets rid of PHPStan BenevolentUnionType on array keys, so that wrong type errors get reported properly + * Use this if you don't care what the key type is and just want proper PHPStan error reporting + * + * @phpstan-template TValueType + * @phpstan-param array $array + * @phpstan-return array + */ + public static function promoteKeys(array $array) : array{ + return $array; + } + public static function checkUTF8(string $string) : void{ if(!mb_check_encoding($string, 'UTF-8')){ throw new \InvalidArgumentException("Text must be valid UTF-8"); diff --git a/src/world/BlockTransaction.php b/src/world/BlockTransaction.php index 5f7e9f9faa..46cbc7903f 100644 --- a/src/world/BlockTransaction.php +++ b/src/world/BlockTransaction.php @@ -28,7 +28,10 @@ use pocketmine\math\Vector3; use pocketmine\utils\Utils; class BlockTransaction{ - /** @var Block[][][] */ + /** + * @var Block[][][] + * @phpstan-var array>> + */ private array $blocks = []; /** diff --git a/src/world/WorldManager.php b/src/world/WorldManager.php index ff603a2dfc..7ff4ed6e02 100644 --- a/src/world/WorldManager.php +++ b/src/world/WorldManager.php @@ -56,7 +56,10 @@ use function trim; class WorldManager{ public const TICKS_PER_AUTOSAVE = 300 * Server::TARGET_TICKS_PER_SECOND; - /** @var World[] */ + /** + * @var World[] + * @phpstan-var array + */ private array $worlds = []; private ?World $defaultWorld = null; @@ -76,6 +79,7 @@ class WorldManager{ /** * @return World[] + * @phpstan-return array */ public function getWorlds() : array{ return $this->worlds; diff --git a/src/world/format/SubChunk.php b/src/world/format/SubChunk.php index 3f7e943e31..d8546e7e92 100644 --- a/src/world/format/SubChunk.php +++ b/src/world/format/SubChunk.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\world\format; use function array_map; -use function array_values; use function count; class SubChunk{ @@ -36,6 +35,7 @@ class SubChunk{ * SubChunk constructor. * * @param PalettedBlockArray[] $blockLayers + * @phpstan-param list $blockLayers */ public function __construct( private int $emptyBlockId, @@ -85,6 +85,7 @@ class SubChunk{ /** * @return PalettedBlockArray[] + * @phpstan-return list */ public function getBlockLayers() : array{ return $this->blockLayers; @@ -129,17 +130,18 @@ class SubChunk{ } public function collectGarbage() : void{ - foreach($this->blockLayers as $k => $layer){ + $cleanedLayers = []; + foreach($this->blockLayers as $layer){ $layer->collectGarbage(); foreach($layer->getPalette() as $p){ if($p !== $this->emptyBlockId){ + $cleanedLayers[] = $layer; continue 2; } } - unset($this->blockLayers[$k]); } - $this->blockLayers = array_values($this->blockLayers); + $this->blockLayers = $cleanedLayers; $this->biomes->collectGarbage(); if($this->skyLight !== null && $this->skyLight->isUniform(0)){ diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index f863fdf747..79f6875a4b 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -65,6 +65,8 @@ abstract class BaseWorldProvider implements WorldProvider{ abstract protected function loadLevelData() : WorldData; private function translatePalette(PalettedBlockArray $blockArray, \Logger $logger) : PalettedBlockArray{ + //TODO: missing type info in stubs + /** @phpstan-var list $palette */ $palette = $blockArray->getPalette(); $newPalette = []; diff --git a/src/world/format/io/ChunkData.php b/src/world/format/io/ChunkData.php index 458e001962..235ac07bfc 100644 --- a/src/world/format/io/ChunkData.php +++ b/src/world/format/io/ChunkData.php @@ -32,6 +32,10 @@ final class ChunkData{ * @param SubChunk[] $subChunks * @param CompoundTag[] $entityNBT * @param CompoundTag[] $tileNBT + * + * @phpstan-param array $subChunks + * @phpstan-param list $entityNBT + * @phpstan-param list $tileNBT */ public function __construct( private array $subChunks, @@ -42,14 +46,21 @@ final class ChunkData{ /** * @return SubChunk[] + * @phpstan-return array */ public function getSubChunks() : array{ return $this->subChunks; } public function isPopulated() : bool{ return $this->populated; } - /** @return CompoundTag[] */ + /** + * @return CompoundTag[] + * @phpstan-return list + */ public function getEntityNBT() : array{ return $this->entityNBT; } - /** @return CompoundTag[] */ + /** + * @return CompoundTag[] + * @phpstan-return list + */ public function getTileNBT() : array{ return $this->tileNBT; } } diff --git a/src/world/format/io/region/RegionGarbageMap.php b/src/world/format/io/region/RegionGarbageMap.php index d1e9504524..9e4e232ee0 100644 --- a/src/world/format/io/region/RegionGarbageMap.php +++ b/src/world/format/io/region/RegionGarbageMap.php @@ -31,7 +31,10 @@ use const SORT_NUMERIC; final class RegionGarbageMap{ - /** @var RegionLocationTableEntry[] */ + /** + * @var RegionLocationTableEntry[] + * @phpstan-var array + */ private array $entries = []; private bool $clean = false; @@ -48,7 +51,6 @@ final class RegionGarbageMap{ * @param RegionLocationTableEntry[]|null[] $locationTable */ public static function buildFromLocationTable(array $locationTable) : self{ - /** @var RegionLocationTableEntry[] $usedMap */ $usedMap = []; foreach($locationTable as $entry){ if($entry === null){ @@ -62,12 +64,10 @@ final class RegionGarbageMap{ ksort($usedMap, SORT_NUMERIC); - /** @var RegionLocationTableEntry[] $garbageMap */ $garbageMap = []; - /** @var RegionLocationTableEntry|null $prevEntry */ $prevEntry = null; - foreach($usedMap as $firstSector => $entry){ + foreach($usedMap as $entry){ $prevEndPlusOne = ($prevEntry !== null ? $prevEntry->getLastSector() + 1 : RegionLoader::FIRST_SECTOR); $currentStart = $entry->getFirstSector(); if($prevEndPlusOne < $currentStart){ diff --git a/src/world/format/io/region/RegionLoader.php b/src/world/format/io/region/RegionLoader.php index f040b8a472..b65f5346cc 100644 --- a/src/world/format/io/region/RegionLoader.php +++ b/src/world/format/io/region/RegionLoader.php @@ -67,7 +67,10 @@ class RegionLoader{ /** @var resource */ protected $filePointer; protected int $nextSector = self::FIRST_SECTOR; - /** @var RegionLocationTableEntry[]|null[] */ + /** + * @var RegionLocationTableEntry[]|null[] + * @phpstan-var list + */ protected array $locationTable = []; protected RegionGarbageMap $garbageTable; public int $lastUsed; @@ -327,7 +330,6 @@ class RegionLoader{ * @throws CorruptedRegionException */ private function checkLocationTableValidity() : void{ - /** @var int[] $usedOffsets */ $usedOffsets = []; $fileSize = filesize($this->filePath); @@ -355,7 +357,7 @@ class RegionLoader{ } ksort($usedOffsets, SORT_NUMERIC); $prevLocationIndex = null; - foreach($usedOffsets as $startOffset => $locationTableIndex){ + foreach($usedOffsets as $locationTableIndex){ if($this->locationTable[$locationTableIndex] === null){ continue; } diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index 1feca61be1..75fcfd0832 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -72,7 +72,10 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ return false; } - /** @var RegionLoader[] */ + /** + * @var RegionLoader[] + * @phpstan-var array + */ protected array $regions = []; protected function loadLevelData() : WorldData{ diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index 8479a79fa7..bad1343240 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -76,7 +76,10 @@ class PopulationTask extends AsyncTask{ $chunk = $this->chunk !== null ? FastChunkSerializer::deserializeTerrain($this->chunk) : null; - /** @var string[] $serialChunks */ + /** + * @var string[] $serialChunks + * @phpstan-var array $serialChunks + */ $serialChunks = igbinary_unserialize($this->adjacentChunks); $chunks = array_map( function(?string $serialized) : ?Chunk{ @@ -92,7 +95,6 @@ class PopulationTask extends AsyncTask{ self::setOrGenerateChunk($manager, $generator, $this->chunkX, $this->chunkZ, $chunk); - /** @var Chunk[] $resultChunks */ $resultChunks = []; //this is just to keep phpstan's type inference happy foreach($chunks as $relativeChunkHash => $c){ World::getXZ($relativeChunkHash, $relativeX, $relativeZ); diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 0fc3defda7..02c94d2d68 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -60,3 +60,8 @@ parameters: count: 2 path: ../../phpunit/promise/PromiseTest.php + - + message: "#^Strict comparison using \\=\\=\\= between 0 and 0 will always evaluate to true\\.$#" + count: 1 + path: ../rules/UnsafeForeachArrayOfStringRule.php + diff --git a/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php b/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php index e42d329275..745cf2109d 100644 --- a/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php +++ b/tests/phpstan/rules/UnsafeForeachArrayOfStringRule.php @@ -28,6 +28,7 @@ use PhpParser\Node\Stmt\Foreach_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; +use PHPStan\Type\BenevolentUnionType; use PHPStan\Type\ClassStringType; use PHPStan\Type\IntegerType; use PHPStan\Type\StringType; @@ -62,8 +63,17 @@ final class UnsafeForeachArrayOfStringRule implements Rule{ $hasCastableKeyTypes = false; $expectsIntKeyTypes = false; - TypeTraverser::map($iterableType->getIterableKeyType(), function(Type $type, callable $traverse) use (&$hasCastableKeyTypes, &$expectsIntKeyTypes) : Type{ - if($type instanceof IntegerType){ + $implicitType = false; + $benevolentUnionDepth = 0; + TypeTraverser::map($iterableType->getIterableKeyType(), function(Type $type, callable $traverse) use (&$hasCastableKeyTypes, &$expectsIntKeyTypes, &$benevolentUnionDepth, &$implicitType) : Type{ + if($type instanceof BenevolentUnionType){ + $implicitType = true; + $benevolentUnionDepth++; + $result = $traverse($type); + $benevolentUnionDepth--; + return $result; + } + if($type instanceof IntegerType && $benevolentUnionDepth === 0){ $expectsIntKeyTypes = true; return $type; } @@ -78,12 +88,20 @@ final class UnsafeForeachArrayOfStringRule implements Rule{ return $type; }); if($hasCastableKeyTypes && !$expectsIntKeyTypes){ - $func = Utils::stringifyKeys(...); + $tip = $implicitType ? + sprintf( + "Declare a key type using @phpstan-var or @phpstan-param, or use %s() to promote the key type to get proper error reporting", + Utils::getNiceClosureName(Utils::promoteKeys(...)) + ) : + sprintf( + "Use %s() to get a \Generator that will force the keys to string", + Utils::getNiceClosureName(Utils::stringifyKeys(...)), + ); return [ RuleErrorBuilder::message(sprintf( "Unsafe foreach on array with key type %s (they might be casted to int).", $iterableType->getIterableKeyType()->describe(VerbosityLevel::value()) - ))->tip(sprintf("Use %s() for a safe Generator-based iterator.", Utils::getNiceClosureName($func)))->build() + ))->tip($tip)->build() ]; } return []; diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 6ade2bffe2..841917787a 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -135,7 +135,7 @@ class BlockTest extends TestCase{ } $errors = []; - foreach($expected as $typeName => $numStates){ + foreach(Utils::promoteKeys($expected) as $typeName => $numStates){ if(!is_string($typeName) || !is_int($numStates)){ throw new AssumptionFailedError("Old table should be array"); } diff --git a/tests/phpunit/item/ItemTest.php b/tests/phpunit/item/ItemTest.php index 05cb48b30f..36ca5c5ffc 100644 --- a/tests/phpunit/item/ItemTest.php +++ b/tests/phpunit/item/ItemTest.php @@ -89,7 +89,6 @@ class ItemTest extends TestCase{ } public function testGetEnchantments() : void{ - /** @var EnchantmentInstance[] $enchantments */ $enchantments = [ new EnchantmentInstance(VanillaEnchantments::EFFICIENCY(), 5), new EnchantmentInstance(VanillaEnchantments::SHARPNESS(), 1) diff --git a/tests/phpunit/utils/CloningRegistryTraitTest.php b/tests/phpunit/utils/CloningRegistryTraitTest.php index 7f8298ff98..e3b53ecb56 100644 --- a/tests/phpunit/utils/CloningRegistryTraitTest.php +++ b/tests/phpunit/utils/CloningRegistryTraitTest.php @@ -47,7 +47,7 @@ final class CloningRegistryTraitTest extends TestCase{ public function testGetAllClone() : void{ $list1 = TestCloningRegistry::getAll(); $list2 = TestCloningRegistry::getAll(); - foreach($list1 as $k => $member){ + foreach(Utils::promoteKeys($list1) as $k => $member){ self::assertNotSame($member, $list2[$k], "VanillaBlocks ought to clone its members"); } } diff --git a/tests/phpunit/utils/TestCloningRegistry.php b/tests/phpunit/utils/TestCloningRegistry.php index ade94d461a..d65b8abaac 100644 --- a/tests/phpunit/utils/TestCloningRegistry.php +++ b/tests/phpunit/utils/TestCloningRegistry.php @@ -37,9 +37,13 @@ final class TestCloningRegistry{ /** * @return \stdClass[] + * @phpstan-return array */ public static function getAll() : array{ - /** @var \stdClass[] $result */ + /** + * @var \stdClass[] $result + * @phpstan-var array $result + */ $result = self::_registryGetAll(); return $result; } diff --git a/tools/compact-regions.php b/tools/compact-regions.php index 6959c82fe2..04ac3f0c94 100644 --- a/tools/compact-regions.php +++ b/tools/compact-regions.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\tools\compact_regions; +use pocketmine\utils\Utils; use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\region\CorruptedRegionException; use pocketmine\world\format\io\region\RegionLoader; @@ -59,6 +60,7 @@ const SUPPORTED_EXTENSIONS = [ /** * @param int[] $files * @phpstan-param array $files + * @phpstan-param-out array $files */ function find_regions_recursive(string $dir, array &$files) : void{ $dirFiles = scandir($dir, SCANDIR_SORT_NONE); @@ -112,7 +114,7 @@ function main(array $argv) : int{ $corruptedFiles = []; $doneCount = 0; $totalCount = count($files); - foreach($files as $file => $size){ + foreach(Utils::stringifyKeys($files) as $file => $size){ try{ $oldRegion = RegionLoader::loadExisting($file); }catch(CorruptedRegionException $e){ @@ -162,7 +164,7 @@ function main(array $argv) : int{ clearstatcache(); $newSize = 0; - foreach($files as $file => $oldSize){ + foreach(Utils::stringifyKeys($files) as $file => $oldSize){ $newSize += file_exists($file) ? filesize($file) : 0; } $diff = $currentSize - $newSize; diff --git a/tools/generate-bedrock-data-from-packets.php b/tools/generate-bedrock-data-from-packets.php index 0cb5ac3667..2c20e6099d 100644 --- a/tools/generate-bedrock-data-from-packets.php +++ b/tools/generate-bedrock-data-from-packets.php @@ -198,12 +198,12 @@ class ParserPacketHandler extends PacketHandler{ $result = (array) ($object instanceof \JsonSerializable ? $object->jsonSerialize() : $object); ksort($result, SORT_STRING); - foreach($result as $property => $value){ + foreach(Utils::promoteKeys($result) as $property => $value){ if(is_object($value)){ $result[$property] = self::objectToOrderedArray($value); }elseif(is_array($value)){ $array = []; - foreach($value as $k => $v){ + foreach(Utils::promoteKeys($value) as $k => $v){ if(is_object($v)){ $array[$k] = self::objectToOrderedArray($v); }else{ @@ -224,7 +224,7 @@ class ParserPacketHandler extends PacketHandler{ } if(is_array($object)){ $result = []; - foreach($object as $k => $v){ + foreach(Utils::promoteKeys($object) as $k => $v){ $result[$k] = self::sort($v); } return $result; @@ -247,7 +247,7 @@ class ParserPacketHandler extends PacketHandler{ ksort($table, SORT_STRING); file_put_contents($this->bedrockDataPath . '/required_item_list.json', json_encode($table, JSON_PRETTY_PRINT) . "\n"); - foreach($packet->levelSettings->experiments->getExperiments() as $name => $experiment){ + foreach(Utils::promoteKeys($packet->levelSettings->experiments->getExperiments()) as $name => $experiment){ echo "Experiment \"$name\" is " . ($experiment ? "" : "not ") . "active\n"; } return true; @@ -317,8 +317,8 @@ class ParserPacketHandler extends PacketHandler{ $char = ord("A"); $outputsByKey = []; - foreach($entry->getInput() as $x => $row){ - foreach($row as $y => $ingredient){ + foreach(Utils::promoteKeys($entry->getInput()) as $x => $row){ + foreach(Utils::promoteKeys($row) as $y => $ingredient){ if($ingredient->getDescriptor() === null){ $shape[$x][$y] = " "; }else{ @@ -337,7 +337,7 @@ class ParserPacketHandler extends PacketHandler{ } $unlockingIngredients = $entry->getUnlockingRequirement()->getUnlockingIngredients(); return new ShapedRecipeData( - array_map(fn(array $array) => implode('', $array), $shape), + array_map(fn(array $array) => implode('', array_values($array)), array_values($shape)), $outputsByKey, array_map(fn(ItemStack $output) => $this->itemStackToJson($output), $entry->getOutput()), $entry->getBlockName(), From a9787f0d993ab2f9e6bac29649f732fe933099ce Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 25 Nov 2024 14:32:17 +0000 Subject: [PATCH 1851/1858] Fix PHPStan error --- src/utils/Utils.php | 2 +- tests/phpstan/configs/actual-problems.neon | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 551e6ae44f..38f523ad4d 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -403,7 +403,7 @@ final class Utils{ } /** - * @param mixed[] $trace + * @param mixed[][] $trace * @return string[] */ public static function printableExceptionInfo(\Throwable $e, $trace = null) : array{ diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index e778cf0047..54028f0dd1 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -840,11 +840,6 @@ parameters: count: 1 path: ../../../src/utils/Utils.php - - - message: "#^Parameter \\#1 \\$trace of static method pocketmine\\\\utils\\\\Utils\\:\\:printableTrace\\(\\) expects array\\\\>, array given\\.$#" - count: 1 - path: ../../../src/utils/Utils.php - - message: "#^Parameter \\#2 \\$file of class pocketmine\\\\thread\\\\ThreadCrashInfoFrame constructor expects string\\|null, mixed given\\.$#" count: 1 From 8cdc7d7ee16482d630e49af2765dc958062b8693 Mon Sep 17 00:00:00 2001 From: "Dylan T." Date: Mon, 25 Nov 2024 20:43:59 +0000 Subject: [PATCH 1852/1858] auto-approve: drop pull_request_review trigger this doesn't work for PRs from forks, since fork PRs don't have access to repo secrets. we'll need some more advanced mechanism to avoid redundant reviews, but that's a job for another time. --- .github/workflows/team-pr-auto-approve.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/team-pr-auto-approve.yml b/.github/workflows/team-pr-auto-approve.yml index f145812138..0c2fdd81c0 100644 --- a/.github/workflows/team-pr-auto-approve.yml +++ b/.github/workflows/team-pr-auto-approve.yml @@ -11,8 +11,7 @@ on: - opened - reopened - ready_for_review - pull_request_review: - types: dismissed + - synchronize jobs: dispatch: @@ -36,4 +35,4 @@ jobs: token: ${{ steps.generate-token.outputs.token }} repository: ${{ github.repository_owner }}/RestrictedActions event-type: auto_approve_collaborator_pr - client-payload: '{"repo": "${{ github.repository }}", "pull_request_id": "${{ github.event.pull_request.number }}", "reviewer_id": "${{ github.event.review.user.id || 0 }}" }' + client-payload: '{"repo": "${{ github.repository }}", "pull_request_id": "${{ github.event.pull_request.number }}", "reviewer_id": "0" }' From 52fe2cb97fa0cee5e4d72fa8e4fd298b4697385f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 25 Nov 2024 21:29:26 +0000 Subject: [PATCH 1853/1858] PermissionManager: deprecate permission subscription system this is no longer used by the core, and as far as I can tell no plugin uses it either. it was used in the past for chat broadcast channels, but not anymore. --- src/permission/PermissionManager.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index f2b02e8e5e..c9e37f5e94 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\permission; +use pocketmine\Server; use pocketmine\utils\Utils; use function count; use function spl_object_id; @@ -71,6 +72,10 @@ class PermissionManager{ } } + /** + * @deprecated Superseded by server chat broadcast channels + * @see Server::subscribeToBroadcastChannel() + */ public function subscribeToPermission(string $permission, PermissibleInternal $permissible) : void{ if(!isset($this->permSubs[$permission])){ $this->permSubs[$permission] = []; @@ -78,6 +83,10 @@ class PermissionManager{ $this->permSubs[$permission][spl_object_id($permissible)] = $permissible; } + /** + * @deprecated Superseded by server chat broadcast channels + * @see Server::unsubscribeFromBroadcastChannel() + */ public function unsubscribeFromPermission(string $permission, PermissibleInternal $permissible) : void{ if(isset($this->permSubs[$permission][spl_object_id($permissible)])){ if(count($this->permSubs[$permission]) === 1){ @@ -88,6 +97,10 @@ class PermissionManager{ } } + /** + * @deprecated Superseded by server chat broadcast channels + * @see Server::unsubscribeFromAllBroadcastChannels() + */ public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ foreach(Utils::promoteKeys($this->permSubs) as $permission => $subs){ if(count($subs) === 1 && isset($subs[spl_object_id($permissible)])){ @@ -99,6 +112,8 @@ class PermissionManager{ } /** + * @deprecated Superseded by server chat broadcast channels + * @see Server::getBroadcastChannelSubscribers() * @return PermissibleInternal[] */ public function getPermissionSubscriptions(string $permission) : array{ From 905a10e980cb6552bab0bad59cc593852409033d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 25 Nov 2024 21:39:35 +0000 Subject: [PATCH 1854/1858] Deprecate InventoryAction->onAddToTransaction() this never made any sense --- src/inventory/transaction/InventoryTransaction.php | 13 +++---------- .../transaction/action/InventoryAction.php | 1 + .../transaction/action/SlotChangeAction.php | 8 -------- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/inventory/transaction/InventoryTransaction.php b/src/inventory/transaction/InventoryTransaction.php index b3465a8dfb..47290e4015 100644 --- a/src/inventory/transaction/InventoryTransaction.php +++ b/src/inventory/transaction/InventoryTransaction.php @@ -111,6 +111,9 @@ class InventoryTransaction{ if(!isset($this->actions[$hash = spl_object_id($action)])){ $this->actions[$hash] = $action; $action->onAddToTransaction($this); + if($action instanceof SlotChangeAction && !isset($this->inventories[$inventoryId = spl_object_id($action->getInventory())])){ + $this->inventories[$inventoryId] = $action->getInventory(); + } }else{ throw new \InvalidArgumentException("Tried to add the same action to a transaction twice"); } @@ -129,16 +132,6 @@ class InventoryTransaction{ $this->actions = $actions; } - /** - * @internal This method should not be used by plugins, it's used to add tracked inventories for InventoryActions - * involving inventories. - */ - public function addInventory(Inventory $inventory) : void{ - if(!isset($this->inventories[$hash = spl_object_id($inventory)])){ - $this->inventories[$hash] = $inventory; - } - } - /** * @param Item[] $needItems * @param Item[] $haveItems diff --git a/src/inventory/transaction/action/InventoryAction.php b/src/inventory/transaction/action/InventoryAction.php index fff3d22b80..2f0db083c9 100644 --- a/src/inventory/transaction/action/InventoryAction.php +++ b/src/inventory/transaction/action/InventoryAction.php @@ -60,6 +60,7 @@ abstract class InventoryAction{ /** * Called when the action is added to the specified InventoryTransaction. + * @deprecated */ public function onAddToTransaction(InventoryTransaction $transaction) : void{ diff --git a/src/inventory/transaction/action/SlotChangeAction.php b/src/inventory/transaction/action/SlotChangeAction.php index 68c3dba1b3..3c9b8e5cf7 100644 --- a/src/inventory/transaction/action/SlotChangeAction.php +++ b/src/inventory/transaction/action/SlotChangeAction.php @@ -25,7 +25,6 @@ namespace pocketmine\inventory\transaction\action; use pocketmine\inventory\Inventory; use pocketmine\inventory\SlotValidatedInventory; -use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionValidationException; use pocketmine\item\Item; use pocketmine\player\Player; @@ -85,13 +84,6 @@ class SlotChangeAction extends InventoryAction{ } } - /** - * Adds this action's target inventory to the transaction's inventory list. - */ - public function onAddToTransaction(InventoryTransaction $transaction) : void{ - $transaction->addInventory($this->inventory); - } - /** * Sets the item into the target inventory. */ From 269effcecf2398046c22b399773f63c1d4fca1fe Mon Sep 17 00:00:00 2001 From: Akmal Fairuz <35138228+AkmalFairuz@users.noreply.github.com> Date: Tue, 26 Nov 2024 18:33:29 +0700 Subject: [PATCH 1855/1858] Introduce Utils::getRandomFloat() (#6532) Drop-in replacement for lcg_value() for PHP 8.4 --- src/block/Anvil.php | 4 ++-- src/block/Farmland.php | 4 ++-- src/block/ItemFrame.php | 6 +++--- src/block/Liquid.php | 4 ++-- src/entity/Entity.php | 3 +-- src/entity/Living.php | 6 +++--- src/item/Armor.php | 4 ++-- src/item/Durable.php | 4 ++-- src/item/RottenFlesh.php | 4 ++-- src/item/SpawnEgg.php | 4 ++-- src/utils/Utils.php | 10 ++++++++++ src/world/World.php | 10 +++++----- 12 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 4b4afef615..0a1a470700 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -35,10 +35,10 @@ use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\utils\Utils; use pocketmine\world\BlockTransaction; use pocketmine\world\sound\AnvilFallSound; use pocketmine\world\sound\Sound; -use function lcg_value; use function round; class Anvil extends Transparent implements Fallable{ @@ -97,7 +97,7 @@ class Anvil extends Transparent implements Fallable{ } public function onHitGround(FallingBlock $blockEntity) : bool{ - if(lcg_value() < 0.05 + (round($blockEntity->getFallDistance()) - 1) * 0.05){ + if(Utils::getRandomFloat() < 0.05 + (round($blockEntity->getFallDistance()) - 1) * 0.05){ if($this->damage !== self::VERY_DAMAGED){ $this->damage = $this->damage + 1; }else{ diff --git a/src/block/Farmland.php b/src/block/Farmland.php index a17a220f0b..b7a2500a8b 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -31,8 +31,8 @@ use pocketmine\event\entity\EntityTrampleFarmlandEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; +use pocketmine\utils\Utils; use function intdiv; -use function lcg_value; class Farmland extends Transparent{ public const MAX_WETNESS = 7; @@ -148,7 +148,7 @@ class Farmland extends Transparent{ } public function onEntityLand(Entity $entity) : ?float{ - if($entity instanceof Living && lcg_value() < $entity->getFallDistance() - 0.5){ + if($entity instanceof Living && Utils::getRandomFloat() < $entity->getFallDistance() - 0.5){ $ev = new EntityTrampleFarmlandEvent($entity, $this); $ev->call(); if(!$ev->isCancelled()){ diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index b5b6093c49..c03806a3b5 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -31,13 +31,13 @@ use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\utils\Utils; use pocketmine\world\BlockTransaction; use pocketmine\world\sound\ItemFrameAddItemSound; use pocketmine\world\sound\ItemFrameRemoveItemSound; use pocketmine\world\sound\ItemFrameRotateItemSound; use function is_infinite; use function is_nan; -use function lcg_value; class ItemFrame extends Flowable{ use AnyFacingTrait; @@ -154,7 +154,7 @@ class ItemFrame extends Flowable{ return false; } $world = $this->position->getWorld(); - if(lcg_value() <= $this->itemDropChance){ + if(Utils::getRandomFloat() <= $this->itemDropChance){ $world->dropItem($this->position->add(0.5, 0.5, 0.5), clone $this->framedItem); $world->addSound($this->position, new ItemFrameRemoveItemSound()); } @@ -185,7 +185,7 @@ class ItemFrame extends Flowable{ public function getDropsForCompatibleTool(Item $item) : array{ $drops = parent::getDropsForCompatibleTool($item); - if($this->framedItem !== null && lcg_value() <= $this->itemDropChance){ + if($this->framedItem !== null && Utils::getRandomFloat() <= $this->itemDropChance){ $drops[] = clone $this->framedItem; } diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 6404cf9081..a37019d650 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -33,9 +33,9 @@ use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; +use pocketmine\utils\Utils; use pocketmine\world\sound\FizzSound; use pocketmine\world\sound\Sound; -use function lcg_value; abstract class Liquid extends Transparent{ public const MAX_DECAY = 7; @@ -368,7 +368,7 @@ abstract class Liquid extends Transparent{ protected function liquidCollide(Block $cause, Block $result) : bool{ if(BlockEventHelper::form($this, $result, $cause)){ - $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new FizzSound(2.6 + (lcg_value() - lcg_value()) * 0.8)); + $this->position->getWorld()->addSound($this->position->add(0.5, 0.5, 0.5), new FizzSound(2.6 + (Utils::getRandomFloat() - Utils::getRandomFloat()) * 0.8)); } return true; } diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 0b690b0d97..9bd0de9eac 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -75,7 +75,6 @@ use function deg2rad; use function floor; use function fmod; use function get_class; -use function lcg_value; use function sin; use function spl_object_id; use const M_PI_2; @@ -910,7 +909,7 @@ abstract class Entity{ return false; } - $force = lcg_value() * 0.2 + 0.1; + $force = Utils::getRandomFloat() * 0.2 + 0.1; $this->motion = match($direction){ Facing::WEST => $this->motion->withComponents(-$force, null, null), diff --git a/src/entity/Living.php b/src/entity/Living.php index 81f46424f1..1f27a5cacf 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -58,6 +58,7 @@ use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; use pocketmine\player\Player; use pocketmine\timings\Timings; use pocketmine\utils\Binary; +use pocketmine\utils\Utils; use pocketmine\world\sound\BurpSound; use pocketmine\world\sound\EntityLandSound; use pocketmine\world\sound\EntityLongFallSound; @@ -69,7 +70,6 @@ use function ceil; use function count; use function floor; use function ksort; -use function lcg_value; use function max; use function min; use function mt_getrandmax; @@ -490,7 +490,7 @@ abstract class Living extends Entity{ $helmet = $this->armorInventory->getHelmet(); if($helmet instanceof Armor){ $finalDamage = $source->getFinalDamage(); - $this->damageItem($helmet, (int) round($finalDamage * 4 + lcg_value() * $finalDamage * 2)); + $this->damageItem($helmet, (int) round($finalDamage * 4 + Utils::getRandomFloat() * $finalDamage * 2)); $this->armorInventory->setHelmet($helmet); } } @@ -697,7 +697,7 @@ abstract class Living extends Entity{ $this->setBreathing(false); if(($respirationLevel = $this->armorInventory->getHelmet()->getEnchantmentLevel(VanillaEnchantments::RESPIRATION())) <= 0 || - lcg_value() <= (1 / ($respirationLevel + 1)) + Utils::getRandomFloat() <= (1 / ($respirationLevel + 1)) ){ $ticks -= $tickDiff; if($ticks <= -20){ diff --git a/src/item/Armor.php b/src/item/Armor.php index 417c57f75c..63a8003adc 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -33,7 +33,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\player\Player; use pocketmine\utils\Binary; -use function lcg_value; +use pocketmine\utils\Utils; use function mt_rand; class Armor extends Durable{ @@ -129,7 +129,7 @@ class Armor extends Durable{ $chance = 1 / ($unbreakingLevel + 1); for($i = 0; $i < $amount; ++$i){ - if(mt_rand(1, 100) > 60 && lcg_value() > $chance){ //unbreaking only applies to armor 40% of the time at best + if(mt_rand(1, 100) > 60 && Utils::getRandomFloat() > $chance){ //unbreaking only applies to armor 40% of the time at best $negated++; } } diff --git a/src/item/Durable.php b/src/item/Durable.php index f110f6ea51..069a01202e 100644 --- a/src/item/Durable.php +++ b/src/item/Durable.php @@ -25,7 +25,7 @@ namespace pocketmine\item; use pocketmine\item\enchantment\VanillaEnchantments; use pocketmine\nbt\tag\CompoundTag; -use function lcg_value; +use pocketmine\utils\Utils; use function min; abstract class Durable extends Item{ @@ -87,7 +87,7 @@ abstract class Durable extends Item{ $chance = 1 / ($unbreakingLevel + 1); for($i = 0; $i < $amount; ++$i){ - if(lcg_value() > $chance){ + if(Utils::getRandomFloat() > $chance){ $negated++; } } diff --git a/src/item/RottenFlesh.php b/src/item/RottenFlesh.php index 4cecc67fcd..2ea3ee9559 100644 --- a/src/item/RottenFlesh.php +++ b/src/item/RottenFlesh.php @@ -25,7 +25,7 @@ namespace pocketmine\item; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\effect\VanillaEffects; -use function lcg_value; +use pocketmine\utils\Utils; class RottenFlesh extends Food{ @@ -38,7 +38,7 @@ class RottenFlesh extends Food{ } public function getAdditionalEffects() : array{ - if(lcg_value() <= 0.8){ + if(Utils::getRandomFloat() <= 0.8){ return [ new EffectInstance(VanillaEffects::HUNGER(), 600) ]; diff --git a/src/item/SpawnEgg.php b/src/item/SpawnEgg.php index 51dcceebd2..ab4f0e1498 100644 --- a/src/item/SpawnEgg.php +++ b/src/item/SpawnEgg.php @@ -27,15 +27,15 @@ use pocketmine\block\Block; use pocketmine\entity\Entity; use pocketmine\math\Vector3; use pocketmine\player\Player; +use pocketmine\utils\Utils; use pocketmine\world\World; -use function lcg_value; abstract class SpawnEgg extends Item{ abstract protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity; public function onInteractBlock(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, array &$returnedItems) : ItemUseResult{ - $entity = $this->createEntity($player->getWorld(), $blockReplace->getPosition()->add(0.5, 0, 0.5), lcg_value() * 360, 0); + $entity = $this->createEntity($player->getWorld(), $blockReplace->getPosition()->add(0.5, 0, 0.5), Utils::getRandomFloat() * 360, 0); if($this->hasCustomName()){ $entity->setNameTag($this->getCustomName()); diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 38f523ad4d..c8be174d6a 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -67,6 +67,8 @@ use function is_nan; use function is_object; use function is_string; use function mb_check_encoding; +use function mt_getrandmax; +use function mt_rand; use function ob_end_clean; use function ob_get_contents; use function ob_start; @@ -688,4 +690,12 @@ final class Utils{ //jit not available return null; } + + /** + * Returns a random float between 0.0 and 1.0 + * Drop-in replacement for lcg_value() + */ + public static function getRandomFloat() : float{ + return mt_rand() / mt_getrandmax(); + } } diff --git a/src/world/World.php b/src/world/World.php index a8e624dd5c..ff65377c09 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -83,6 +83,7 @@ use pocketmine\ServerConfigGroup; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Limits; use pocketmine\utils\ReversePriorityQueue; +use pocketmine\utils\Utils; use pocketmine\world\biome\Biome; use pocketmine\world\biome\BiomeRegistry; use pocketmine\world\format\Chunk; @@ -120,7 +121,6 @@ use function get_class; use function gettype; use function is_a; use function is_object; -use function lcg_value; use function max; use function microtime; use function min; @@ -1998,10 +1998,10 @@ class World implements ChunkManager{ return null; } - $itemEntity = new ItemEntity(Location::fromObject($source, $this, lcg_value() * 360, 0), $item); + $itemEntity = new ItemEntity(Location::fromObject($source, $this, Utils::getRandomFloat() * 360, 0), $item); $itemEntity->setPickupDelay($delay); - $itemEntity->setMotion($motion ?? new Vector3(lcg_value() * 0.2 - 0.1, 0.2, lcg_value() * 0.2 - 0.1)); + $itemEntity->setMotion($motion ?? new Vector3(Utils::getRandomFloat() * 0.2 - 0.1, 0.2, Utils::getRandomFloat() * 0.2 - 0.1)); $itemEntity->spawnToAll(); return $itemEntity; @@ -2018,9 +2018,9 @@ class World implements ChunkManager{ $orbs = []; foreach(ExperienceOrb::splitIntoOrbSizes($amount) as $split){ - $orb = new ExperienceOrb(Location::fromObject($pos, $this, lcg_value() * 360, 0), $split); + $orb = new ExperienceOrb(Location::fromObject($pos, $this, Utils::getRandomFloat() * 360, 0), $split); - $orb->setMotion(new Vector3((lcg_value() * 0.2 - 0.1) * 2, lcg_value() * 0.4, (lcg_value() * 0.2 - 0.1) * 2)); + $orb->setMotion(new Vector3((Utils::getRandomFloat() * 0.2 - 0.1) * 2, Utils::getRandomFloat() * 0.4, (Utils::getRandomFloat() * 0.2 - 0.1) * 2)); $orb->spawnToAll(); $orbs[] = $orb; From daacc8eddb6555e7a9015ebabda6a1fe75a92b82 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Nov 2024 17:54:59 +0000 Subject: [PATCH 1856/1858] Updated setup-php-action to 3.2.0 --- .github/workflows/main-php-matrix.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main-php-matrix.yml b/.github/workflows/main-php-matrix.yml index 6d71a0e70c..e26f7c3187 100644 --- a/.github/workflows/main-php-matrix.yml +++ b/.github/workflows/main-php-matrix.yml @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.1.0 + uses: pmmp/setup-php-action@3.2.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -62,7 +62,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.1.0 + uses: pmmp/setup-php-action@3.2.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -96,7 +96,7 @@ jobs: submodules: true - name: Setup PHP - uses: pmmp/setup-php-action@3.1.0 + uses: pmmp/setup-php-action@3.2.0 with: php-version: ${{ inputs.php }} install-path: "./bin" @@ -128,7 +128,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup PHP - uses: pmmp/setup-php-action@3.1.0 + uses: pmmp/setup-php-action@3.2.0 with: php-version: ${{ inputs.php }} install-path: "./bin" From 0543bf301ee783536ba1015183fd69ba258177dd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 27 Nov 2024 19:19:51 +0000 Subject: [PATCH 1857/1858] draft-release: updated php_download_url --- .github/workflows/draft-release.yml | 3 ++- build/dump-version-info.php | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 0a07a738bb..cd1841e4f1 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -64,6 +64,7 @@ jobs: id: get-pm-version run: | echo PM_VERSION=$(php build/dump-version-info.php base_version) >> $GITHUB_OUTPUT + echo PM_MAJOR=$(php build/dump-version-info.php major_version) >> $GITHUB_OUTPUT echo MCPE_VERSION=$(php build/dump-version-info.php mcpe_version) >> $GITHUB_OUTPUT echo CHANGELOG_FILE_NAME=$(php build/dump-version-info.php changelog_file_name) >> $GITHUB_OUTPUT echo CHANGELOG_MD_HEADER=$(php build/dump-version-info.php changelog_md_header) >> $GITHUB_OUTPUT @@ -72,7 +73,7 @@ jobs: - name: Generate PHP binary download URL id: php-binary-url run: | - echo PHP_BINARY_URL="${{ github.server_url }}/${{ github.repository_owner }}/PHP-Binaries/releases/tag/php-${{ matrix.php-version }}-latest" >> $GITHUB_OUTPUT + echo PHP_BINARY_URL="${{ github.server_url }}/${{ github.repository_owner }}/PHP-Binaries/releases/tag/pm${{ steps.get-pm-version.outputs.PM_MAJOR }}-php-${{ matrix.php-version }}-latest" >> $GITHUB_OUTPUT - name: Generate build info run: | diff --git a/build/dump-version-info.php b/build/dump-version-info.php index 8898d7cabf..166264d980 100644 --- a/build/dump-version-info.php +++ b/build/dump-version-info.php @@ -36,6 +36,7 @@ require dirname(__DIR__) . '/vendor/autoload.php'; */ $options = [ "base_version" => VersionInfo::BASE_VERSION, + "major_version" => fn() => explode(".", VersionInfo::BASE_VERSION)[0], "mcpe_version" => ProtocolInfo::MINECRAFT_VERSION_NETWORK, "is_dev" => VersionInfo::IS_DEVELOPMENT_BUILD, "changelog_file_name" => function() : string{ From d666f17ec63bb0db4c7e19cea29c2be67026e3c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:46:30 +0000 Subject: [PATCH 1858/1858] Bump build/php from `a51259d` to `8a396c6` (#6540) --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index a51259d7a6..8a396c63fc 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit a51259d7a6ea649d64f409fc0276baa59cf4f19a +Subproject commit 8a396c63fc5e79ea2849bfca100ea21a49ba2933